ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDU5NzE4Li4wMDAwMDAwCi0tLSBhL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgbGlic3NoICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIGFjc3MuYyBhdXRoZmQuYyBhdXRoZmlsZS5jIGJ1ZmF1eC5jIGJ1ZmJuLmMgYnVmZmVyLmMgXAotICAgIGNhbm9ob3N0LmMgY2hhbm5lbHMuYyBjaXBoZXIuYyBjaXBoZXItYWNzcy5jIGNpcGhlci1hZXMuYyBcCi0gICAgY2lwaGVyLWJmMS5jIGNpcGhlci1jdHIuYyBjaXBoZXItM2RlczEuYyBjbGVhbnVwLmMgXAotICAgIGNvbXBhdC5jIGNvbXByZXNzLmMgY3JjMzIuYyBkZWF0dGFjay5jIGZhdGFsLmMgaG9zdGZpbGUuYyBcCi0gICAgbG9nLmMgbWF0Y2guYyBtZC1zaGEyNTYuYyBtb2R1bGkuYyBuY2hhbi5jIHBhY2tldC5jIFwKLSAgICByZWFkcGFzcy5jIHJzYS5jIHR0eW1vZGVzLmMgeG1hbGxvYy5jIGFkZHJtYXRjaC5jIFwKLSAgICBhdG9taWNpby5jIGtleS5jIGRpc3BhdGNoLmMga2V4LmMgbWFjLmMgdWlkc3dhcC5jIHV1ZW5jb2RlLmMgbWlzYy5jIFwKLSAgICBtb25pdG9yX2ZkcGFzcy5jIHJpam5kYWVsLmMgc3NoLWRzcy5jIHNzaC1lY2RzYS5jIHNzaC1yc2EuYyBkaC5jIFwKLSAgICBrZXhkaC5jIGtleGdleC5jIGtleGRoYy5jIGtleGdleGMuYyBidWZlYy5jIGtleGVjZGguYyBrZXhlY2RoYy5jIFwKLSAgICBtc2cuYyBwcm9ncmVzc21ldGVyLmMgZG5zLmMgZW50cm9weS5jIGdzcy1nZW5yLmMgdW1hYy5jIGpwYWtlLmMgXAotICAgIHNjaG5vcnIuYyBzc2gtcGtjczExLmMgcm9hbWluZ19kdW1teS5jIFwKLSAgICBvcGVuYnNkLWNvbXBhdC9zdHJ0b251bS5jIG9wZW5ic2QtY29tcGF0L2JzZC1taXNjLmMgXAotICAgIG9wZW5ic2QtY29tcGF0L3RpbWluZ3NhZmVfYmNtcC5jIG9wZW5ic2QtY29tcGF0L2JzZC1nZXRwZWVyZWlkLmMgXAotICAgIG9wZW5ic2QtY29tcGF0L3JlYWRwYXNzcGhyYXNlLmMgb3BlbmJzZC1jb21wYXQvdmlzLmMgXAotICAgIG9wZW5ic2QtY29tcGF0L3BvcnQtdHVuLmMgb3BlbmJzZC1jb21wYXQvc2V0cHJvY3RpdGxlLmMgXAotICAgIG9wZW5ic2QtY29tcGF0L2JzZC1jbG9zZWZyb20uYyAgb3BlbmJzZC1jb21wYXQvZ2V0b3B0LmMgXAotICAgIG9wZW5ic2QtY29tcGF0L3JyZXN2cG9ydC5jIG9wZW5ic2QtY29tcGF0L2JpbmRyZXN2cG9ydC5jIFwKLSAgICBvcGVuYnNkLWNvbXBhdC9ic2Qtc3RhdHZmcy5jIG9wZW5ic2QtY29tcGF0L3htbWFwLmMgXAotICAgIG9wZW5ic2QtY29tcGF0L3BvcnQtbGludXguYyBvcGVuYnNkLWNvbXBhdC9zdHJtb2RlLmMgXAotICAgIG9wZW5ic2QtY29tcGF0L2JzZC1vcGVucHR5LmMgXAotICAgIG9wZW5ic2QtY29tcGF0L2ZtdF9zY2FsZWQuYyBcCi0gICAgb3BlbmJzZC1jb21wYXQvcHdjYWNoZS5jIG9wZW5ic2QtY29tcGF0L2dsb2IuYyBcCi0gICAgb3BlbmJzZC1jb21wYXQvYnNkLWFyYzRyYW5kb20uYyBcCi0KLSMgICAgb3BlbmJzZC1jb21wYXQvZ2V0cnJzZXRieW5hbWUuYwotIyAgICBvcGVuYnNkLWNvbXBhdC94Y3J5cHQuYyAKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUgZXh0ZXJuYWwvemxpYgotUFJJVkFURV9DX0lOQ0xVREVTIDo9IGV4dGVybmFsL29wZW5zc2wvb3BlbmJzZC1jb21wYXQKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJzc2wgbGliY3J5cHRvIGxpYmRsIGxpYnoKLQotTE9DQUxfTU9EVUxFIDo9IGxpYnNzaAotCi1MT0NBTF9DRkxBR1MrPS1PMwotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgc3NoICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgc3NoLmMgcmVhZGNvbmYuYyBjbGllbnRsb29wLmMgc3NodHR5LmMgXAotICAgIHNzaGNvbm5lY3QuYyBzc2hjb25uZWN0MS5jIHNzaGNvbm5lY3QyLmMgbXV4LmMgXAotICAgIHJvYW1pbmdfY29tbW9uLmMgcm9hbWluZ19jbGllbnQuYwotCi1MT0NBTF9NT0RVTEUgOj0gc3NoCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCi1QUklWQVRFX0NfSU5DTFVERVMgOj0gZXh0ZXJuYWwvb3BlbnNzbC9vcGVuYnNkLWNvbXBhdAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnNzaCBsaWJzc2wgbGliY3J5cHRvIGxpYmRsIGxpYnoKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgc2Z0cCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIHNmdHAuYyBzZnRwLWNsaWVudC5jIHNmdHAtY29tbW9uLmMgc2Z0cC1nbG9iLmMgcHJvZ3Jlc3NtZXRlci5jCi0KLUxPQ0FMX01PRFVMRSA6PSBzZnRwCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCi1QUklWQVRFX0NfSU5DTFVERVMgOj0gZXh0ZXJuYWwvb3BlbnNzbC9vcGVuYnNkLWNvbXBhdAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnNzaCBsaWJzc2wgbGliY3J5cHRvIGxpYmRsIGxpYnoKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgc2NwICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgc2NwLmMgcHJvZ3Jlc3NtZXRlci5jIGJ1ZmF1eC5jCi0KLUxPQ0FMX01PRFVMRSA6PSBzY3AKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKLVBSSVZBVEVfQ19JTkNMVURFUyA6PSBleHRlcm5hbC9vcGVuc3NsL29wZW5ic2QtY29tcGF0Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlic3NoIGxpYnNzbCBsaWJjcnlwdG8gbGliZGwgbGliegotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBzc2hkICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgc3NoZC5jIGF1dGgtcmhvc3RzLmMgYXV0aC1yc2EuYyBhdXRoLXJoLXJzYS5jIFwKLQlhdWRpdC5jIGF1ZGl0LWJzbS5jIGF1ZGl0LWxpbnV4LmMgcGxhdGZvcm0uYyBcCi0Jc3NocHR5LmMgc3NobG9naW4uYyBzZXJ2Y29uZi5jIHNlcnZlcmxvb3AuYyBcCi0JYXV0aC5jIGF1dGgxLmMgYXV0aDIuYyBhdXRoLW9wdGlvbnMuYyBzZXNzaW9uLmMgXAotCWF1dGgtY2hhbGwuYyBhdXRoMi1jaGFsbC5jIGdyb3VwYWNjZXNzLmMgXAotCWF1dGgtc2tleS5jIGF1dGgtYnNkYXV0aC5jIGF1dGgyLWhvc3RiYXNlZC5jIGF1dGgyLWtiZGludC5jIFwKLQlhdXRoMi1ub25lLmMgYXV0aDItcGFzc3dkLmMgYXV0aDItcHVia2V5LmMgYXV0aDItanBha2UuYyBcCi0JbW9uaXRvcl9tbS5jIG1vbml0b3IuYyBtb25pdG9yX3dyYXAuYyBrZXhkaHMuYyBrZXhnZXhzLmMga2V4ZWNkaHMuYyBcCi0JYXV0aC1rcmI1LmMgXAotCWF1dGgyLWdzcy5jIGdzcy1zZXJ2LmMgZ3NzLXNlcnYta3JiNS5jIFwKLQlsb2dpbnJlYy5jIGF1dGgtcGFtLmMgYXV0aC1zaGFkb3cuYyBhdXRoLXNpYS5jIG1kNWNyeXB0LmMgXAotCXNmdHAtc2VydmVyLmMgc2Z0cC1jb21tb24uYyBcCi0Jcm9hbWluZ19jb21tb24uYyByb2FtaW5nX3NlcnYuYyBcCi0Jc2FuZGJveC1udWxsLmMgc2FuZGJveC1ybGltaXQuYyBzYW5kYm94LXN5c3RyYWNlLmMgc2FuZGJveC1kYXJ3aW4ubwotCi0jIGF1dGgtcGFzc3dkLmMKLQotTE9DQUxfTU9EVUxFIDo9IHNzaGQKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUgZXh0ZXJuYWwvemxpYgotUFJJVkFURV9DX0lOQ0xVREVTIDo9IGV4dGVybmFsL29wZW5zc2wvb3BlbmJzZC1jb21wYXQKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJzc2ggbGlic3NsIGxpYmNyeXB0byBsaWJkbCBsaWJ6IGxpYmN1dGlscwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBzc2gta2V5Z2VuICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgc3NoLWtleWdlbi5jCi0KLUxPQ0FMX01PRFVMRSA6PSBzc2gta2V5Z2VuCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCi1QUklWQVRFX0NfSU5DTFVERVMgOj0gZXh0ZXJuYWwvb3BlbnNzbC9vcGVuYnNkLWNvbXBhdAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnNzaCBsaWJzc2wgbGliY3J5cHRvIGxpYmRsIGxpYnoKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgc3NoZF9jb25maWcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1MT0NBTF9NT0RVTEUgOj0gc3NoZF9jb25maWcKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL3NzaAotTE9DQUxfU1JDX0ZJTEVTIDo9IHNzaGRfY29uZmlnLmFuZHJvaWQKLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBzdGFydC1zc2ggIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1MT0NBTF9NT0RVTEUgOj0gc3RhcnQtc3NoCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVhFQ1VUQUJMRVMKLUxPQ0FMX1NSQ19GSUxFUyA6PSBzdGFydC1zc2gKLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWYxMDVhLi4wMDAwMDAwCi0tLSBhL0NSRURJVFMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+IC0gQ3JlYXRvciBvZiBTU0gKLQotQWFyb24gQ2FtcGJlbGwsIEJvYiBCZWNrLCBNYXJrdXMgRnJpZWRsLCBOaWVscyBQcm92b3MsCi1UaGVvIGRlIFJhYWR0LCBhbmQgRHVnIFNvbmcgLSBDcmVhdG9ycyBvZiBPcGVuU1NICi0KLUFoc2FuIFJhc2hpZCA8YXJtc0BzY28uY29tPiAtIFVuaXhXYXJlIGxvbmcgcGFzc3dvcmRzCi1BbGFpbiBTdC1EZW5pcyA8QWxhaW4uU3QtRGVuaXNAZWMuZ2MuY2E+IC0gSXJpeCBmaXgKLUFsZXhhbmRyZSBPbGl2YSA8b2xpdmFAbHNkLmljLnVuaWNhbXAuYnI+IC0gQUlYIGZpeGVzCi1BbmRyZSBMdWNhcyA8YW5kcmVAYWUtMzUuY29tPiAtIG5ldyBsb2dpbiBjb2RlLCBtYW55IGZpeGVzCi1BbmRyZWFzIFN0ZWlubWV0eiA8YXN0QGRvbWR2LmRlPiAtIFNoYWRvdyBwYXNzd29yZCBleHBpcnkgc3VwcG9ydAotQW5kcmV3IE1jR2lsbCA8YW5kcmV3bUBkYXRyaXguY28uemE+IC0gU0NPIGZpeGVzCi1BbmRyZXcgTW9yZ2FuIDxtb3JnYW5AdHJhbnNtZXRhLmNvbT4gLSBQQU0gYnVnZml4ZXMKLUFuZHJldyBTdHJpYmJsZWhpbGwgPGEuZC5zdHJpYmJsZWhpbGxAZHVyaGFtLmFjLnVrPiAtIEJ1Z2ZpeGVzCi1BbmR5IFNsb2FuZSA8YW5keUBndWlsZHNvZnR3YXJlLmNvbT4gLSBidWdmaXhlcwotQXJhbiBDb3ggPGFjb3hAY3YudGVsZWdyb3VwLmNvbT4gLSBTQ08gYnVnZml4ZXMKLUFya2FkaXVzeiBNaXNraWV3aWN6IDxtaXNpZWtAcGxkLm9yZy5wbD4gLSBJUHY2IGNvbXBhdCBmaXhlcwotQmVuIExpbmRzdHJvbSA8bW91cmluZ0BldmlsYWRtaW4ub3JnPiAtIE5lWFQgc3VwcG9ydAotQmVuIFRheWxvciA8YmVudEBjbGFyay5uZXQ+IC0gU29sYXJpcyBkZWJ1Z2dpbmcgYW5kIGZpeGVzCi1CcmF0aXNsYXYgSUxJQ0ggPGJpbGljQHplcHRlci5ydT4gLSBDb25maWd1cmUgZml4Ci1DaGFybGVzIExldmVydCA8Y2hhcmxlc0Bjb21tLnBvbHltdGwuY2E+IC0gU3VuT1MgNCAmIGJ1ZyBmaXhlcwotQ2hpcCBTYWx6ZW5iZXJnIDxjaGlwQHZhbGludXguY29tPiAtIEFzc29ydGVkIHBhdGNoZXMKLUNocmlzIEFkYW1zIDxjbWFkYW1zQGhpd2FheS5uZXQ+IC0gT1NGIFNJQSBzdXBwb3J0Ci1DaHJpcyBTYWlhIDxjc2FpYUB3dG93ZXIuY29tPiAtIFN1U0UgcGFja2FnaW5nCi1DaHJpcywgdGhlIFlvdW5nIE9uZSA8Y2t5QHBvYm94LmNvbT4gLSBQYXNzd29yZCBhdXRoIGZpeGVzCi1DaHJpc3RvcyBab3VsYXMgPGNocmlzdG9zQHpvdWxhcy5jb20+IC0gQXV0b2NvbmYgZml4ZXMKLUNodW4tQ2h1bmcgQ2hlbiA8Y2pqQHUud2FzaGluZ3Rvbi5lZHU+IC0gUlBNIGZpeGVzCi1Db3Jpbm5hIFZpbnNjaGVuIDx2aW5zY2hlbkByZWRoYXQuY29tPiAtIEN5Z3dpbiBzdXBwb3J0Ci1DaGFkIE15bmhpZXIgPG15bmhpZXJAaW50ZXJzdGVsLm5ldD4gLSBTb2xhcmlzIFByb2Nlc3MgQ29udHJhY3Qgc3VwcG9ydAotRGFuIEJyb3NlbWVyIDxvZGluQGxpbnV4ZnJlYWsuY29tPiAtIEF1dG9jb25mIHN1cHBvcnQsIGJ1aWxkIGZpeGVzCi1EYXJyZW4gSGFsbCA8ZGhhbGxAdmlyYWdlLm9yZz4gLSBBSVggcGF0Y2hlcwotRGFycmVuIFR1Y2tlciA8ZHR1Y2tlckB6aXAuY29tLmF1PiAtIEFJWCBCRkYgcGFja2FnZSBzY3JpcHRzCi1EYXZpZCBBZ3JheiA8ZGFncmF6QGphaG9vcGEuY29tPiAtIEJ1aWxkIGZpeGVzCi1EYXZpZCBEZWwgUGllcm8gPERhdmlkLkRlbFBpZXJvQHFlZC5xbGQuZ292LmF1PiAtIGJ1ZyBmaXhlcwotRGF2aWQgSGVzcHJpY2ggPGRhcmtncnVlQGd1ZS10ZWNoLm9yZz4gLSBDb25maWd1cmUgZml4ZXMKLURhdmlkIFJhbmtpbiA8ZHJhbmtpbkBib2hlbWlhbnMubGV4aW5ndG9uLmt5LnVzPiAtIGxpYndyYXAsIEFJWCwgTmV0QlNEIGZpeGVzCi1EYWctRXJsaW5nIFNt+HJncmF2IDxkZXMgYXQgZnJlZWJzZC5vcmc+IC0gQ2hhbGxlbmdlLVJlc3BvbnNlIFBBTSBjb2RlLgotRGhpcmFqIEd1bGF0aSA8ZGd1bGF0aUBzY28uY29tPiAtIFVuaXhXYXJlIGxvbmcgcGFzc3dvcmRzCi1FZCBFZGVuIDxlZGUzNzBAc3RsLnJ1cmFsLnVzZGEuZ292PiAtIGNvbmZpZ3VyZSBmaXhlcwotR2FycmljayBKYW1lcyA8Z2Fycmlja0BqYW1lcy5uZXQ+IC0gY29uZmlndXJlIGZpeGVzCi1HYXJ5IEUuIE1pbGxlciA8Z2VtQHJlbGxpbS5jb20+IC0gU0NPIHN1cHBvcnQKLUdlZCBMb2RkZXIgPGxvZGRlckB5YWNjLmNvbS5hdT4gLSBIUFVYIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMKLUdlcnQgRG9lcmluZyA8Z2RAaGlsYjEubWVkYXQuZGU+IC0gYnVnIGFuZCBwb3J0YWJpbGl0eSBmaXhlcwotSEFSVVlBTUEgU2VpZ28gPGhhcnV5YW1hQHVuaXh1c2VyLm9yZz4gLSBUcmFuc2xhdGlvbnMgJiBkb2MgZml4ZXMKLUhpZGVha2kgWU9TSElGVUpJIDx5b3NoZnVqaUBlY2VpLnRvaG9rdS5hYy5qcD4gLSBJUHY2IGFuZCBidWcgZml4ZXMKLUhpcm9zaGkgVGFrZWthd2EgPHRha2VrYXdhQHNyMy50LnUtdG9reW8uYWMuanA+IC0gQ29uZmlndXJlIGZpeGVzCi1Ib2xnZXIgVHJhcHAgPEhvbGdlci5UcmFwcEBJbmZvcm1hdGlrLlRVLUNoZW1uaXR6LkRFPiAtIEtSQjQvQUZTIGNvbmZpZyBwYXRjaAotSVdBTVVSTyBNb3Rvbm9yaSA8aXdhQG1tcC5mdWppdHN1LmNvLmpwPiAtIGJ1Z2ZpeGVzCi1KYW5pIEhha2FsYSA8amFoYWthbGFAY2Muanl1LmZpPiAtIFBhdGNoZXMKLUphcm5vIEh1dXNrb25lbiA8amh1dXNrb25AaHl0dGkudWt1LmZpPiAtIEJ1Z2ZpeGVzCi1KaW0gS25vYmxlIDxqbWtub2JsZUBwb2JveC5jb20+IC0gTWFueSBwYXRjaGVzCi1Kb25jaGVuIChlbWFpbCB1bmtub3duKSAtIHRoZSBvcmlnaW5hbCBhdXRob3Igb2YgUEFNIHN1cHBvcnQgb2YgU1NICi1KdWVyZ2VuIEtlaWwgPGprQHRvb2xzLmRlPiAtIHNjcCBidWdmaXhpbmcKLUtBTUFIQVJBIEp1bnpvIDxrYW1haGFyYUBjYy5rc2hvc2VuLmFjLmpwPiAtIENvbmZpZ3VyZSBmaXhlcwotS2VlcyBDb29rIDxjb29rQGNwb2ludC5uZXQ+IC0gc2NwIGZpeGVzCi1LZW5qaSBNaXlha2UgPGtlbmppQG1peWFrZS5vcmc+IC0gQ29uZmlndXJlIGZpeGVzCi1LZXZpbiBDYXdsZmllbGQgPGNhd2xmaWVsQHVzLmlibS5jb20+IC0gQUlYIGZpeGVzLgotS2V2aW4gTydDb25ub3IgPGtldmluX29jb25ub3JAc3RhbmRhcmRhbmRwb29ycy5jb20+IC0gUlNBbGVzcyBvcGVyYXRpb24KLUtldmluIFN0ZXZlcyA8c3RldmVza0Bwb2JveC5jb20+IC0gSFAgc3VwcG9ydCwgYnVnZml4ZXMsIGltcHJvdmVtZW50cwotS2l5b2thenUgU1VUTyA8c3V0b0Brcy1hbmQta3MubmUuanA+IC0gQnVnZml4ZXMKLUxhcnJ5IEpvbmVzIDxsYXJyeS5qb25lc0BzZHJjLmNvbT4gLSBCdWdmaXhlcwotTHV0eiBKYWVuaWNrZSA8THV0ei5KYWVuaWNrZUBhZXQuVFUtQ290dGJ1cy5ERT4gLSBCdWdmaXhlcwotTWFyYyBHLiBGb3VybmllciA8bWFyYy5mb3VybmllckBhY2FkaWF1LmNhPiAtIFNvbGFyaXMgcGF0Y2hlcwotTWFyayBELiBCYXVzaGtlIDxtZGJAanVuaXBlci5uZXQ+IC0gYnVnIGZpeGVzCi1NYXJ0aW4gSm9oYW5zc29uIDxmYXRib2JAYWNjLnVtdS5zZT4gLSBMaW51eCBmaXhlcwotTWFyayBELiBSb3RoIDxyb3RoK29wZW5zc2hAZmVlcC5uZXQ+IC0gRmVhdHVyZXMsIGJ1ZyBmaXhlcwotTWFyayBNaWxsZXIgPG1hcmttQHN3b29uLm5ldD4gLSBCdWdmaXhlcwotTWF0dCBSaWNoYXJkcyA8djJtYXR0QGJ0di5pYm0uY29tPiAtIEFJWCBwYXRjaGVzCi1NaWNoYWVsIFN0ZWZmZW5zIDxtaWNoYWVsX3N0ZWZmZW5zIGF0IGhwLmNvbT4gLSBIUC1VWCBmaXhlcwotTWljaGFlbCBTdG9uZSA8bXN0b25lQGNzLmxveW9sYS5lZHU+IC0gSXJpeCBlbmhhbmNlbWVudHMKLU5ha2FqaSBIaXJveXVraSA8bmFrYWppQHR1dHJwLnR1dC5hYy5qcD4gLSBTb255IE5ld3MtT1MgcGF0Y2gKLU5hbGluIERhaHlhYmhhaSA8bmFsaW4uZGFoeWFiaGFpQHBvYm94LmNvbT4gLSBQQU0gZW52aXJvbm1lbnQgcGF0Y2gKLU5hdGUgSXRraW4gPG5pdGtpbkBldXJvcGEuY29tPiAtIFN1bk9TIDQuMS54IGZpeGVzCi1OaWVscyBLcmlzdGlhbiBCZWNoIEplbnNlbiA8bmtiakBpbWFnZS5kaz4gLSBBc3NvcnRlZCBwYXRjaGVzCi1QYXZlbCBLYW5rb3Zza3kgPHBlYWtAYXJnby50cm9qYS5tZmYuY3VuaS5jej4gLSBTZWN1cml0eSBmaXhlcwotUGF2ZWwgVHJvbGxlciA8cGF0cm9sQG9tbmkuc2ludXMuY3o+IC0gQnVnZml4ZXMKLVBla2thIFNhdm9sYSA8cGVra2FzQG5ldGNvcmUuZmk+IC0gQnVnZml4ZXMKLVBldGVyIEtvY2tzIDxwZXRlci5rb2Nrc0BiYXlnYXRlLmNvbT4gLSBNYWtlZmlsZSBmaXhlcwotUGV0ZXIgU3R1Z2UgPHN0dWdlQGNkeS5vcmc+IC0gbWRvYzJtYW4uYXdrIHNjcmlwdAotUGhpbCBIYW5kcyA8cGhpbEBoYW5kcy5jb20+IC0gRGViaWFuIHNjcmlwdHMsIGFzc29ydGVkIHBhdGNoZXMKLVBoaWwgS2FybiA8a2FybkBrYTlxLmFtcHIub3JnPiAtIEF1dG9jb25mIGZpeGVzCi1QaGlsaXBwZSBXSUxMRU0gPFBoaWxpcHBlLldJTExFTUB1cnNzYWYuZnI+IC0gQnVnZml4ZXMKLVBoaWxsIENhbXAgPFAuUy5TLkNhbXBAdWtjLmFjLnVrPiAtIGxvZ2luIGNvZGUgZml4Ci1SaXAgTG9vbWlzIDxsb29taXNnQGNpc3Quc2FpYy5jb20+IC0gU29sYXJpcyBwYWNrYWdlIHN1cHBvcnQsIGZpeGVzCi1Sb2JlcnQgRGFobGVtIDxSb2JlcnQuRGFobGVtIGF0IHNpZW1lbnMuY29tPiAtIFJlbGlhbnQgVW5peCBmaXhlcwotUm91bWVuIFBldHJvdiA8b3BlbnNzaEByb3VtZW5wZXRyb3YuaW5mbz4gLSBDb21waWxlICYgY29uZmlndXJlIGZpeGVzCi1TQUtBSSBLaXlvdGFrYSA8a3Nha2FpQGtzby5uZXR3ay5udHQtYXQuY28uanA+IC0gTXVsdGlwbGUgYnVnZml4ZXMKLVNpbW9uIFdpbGtpbnNvbiA8c3h3QGRjcy5lZC5hYy51az4gLSBQQU0gZml4ZXMsIENvbXBhdCB3aXRoIE1JVCBLcmJWCi1Tb2xhciBEZXNpZ25lciA8c29sYXJAb3BlbndhbGwuY29tPiAtIG1hbnkgcGF0Y2hlcyBhbmQgdGVjaG5pY2FsIGFzc2lzdGFuY2UKLVN2YW50ZSBTaWduZWxsIDxzdmFudGUuc2lnbmVsbEB0ZWxpYS5jb20+IC0gQnVnZml4ZXMKLVRob21hcyBOZXVtYW5uIDx0b21Ac21hcnQucnVoci5kZT4gLSBTaGFkb3cgcGFzc3dvcmRzCi1UaW0gUmljZSA8dGltQG11bHRpdGFsZW50cy5uZXQ+IC0gUG9ydGFiaWxpdHkgJiBTQ08gZml4ZXMKLVRvYmlhcyBPZXRpa2VyIDxvZXRpa2VyQGVlLmV0aHouY2g+IC0gQnVnZml4ZXMKLVRvbSBCZXJ0ZWxzb24ncyA8dGJlcnRAYWJhYy5jb20+IC0gQUlYIGF1dGggZml4ZXMKLVRvci1Ba2UgRnJhbnNzb24gPHRvcmFrZUBob3RtYWlsLmNvbT4gLSBBSVggc3VwcG9ydAotVHVkb3IgQm9zbWFuIDx0dWRvcmJAam0ubnU+IC0gTUQ1IHBhc3N3b3JkIHN1cHBvcnQKLVVkbyBTY2h3ZWlnZXJ0IDx1c3RAY2VydC5zaWVtZW5zLmRlPiAtIFJlbGlhbnRVTklYIHN1cHBvcnQKLVdlbmR5IFBhbG0gPHdlbmR5cCBhdCBjcmF5LmNvbT4gLSBDcmF5IHN1cHBvcnQuCi1aYWNrIFdlaW5iZXJnIDx6YWNrQHdvbGVyeS5jdW1iLm9yZz4gLSBHTk9NRSBhc2twYXNzIGVuaGFuY2VtZW50Ci0KLUFwb2xvZ2llcyB0byBhbnlvbmUgSSBoYXZlIG1pc3NlZC4KLQotRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgotCi0kSWQ6IENSRURJVFMsdiAxLjgxIDIwMDYvMDgvMzAgMTc6MjQ6NDEgZGptIEV4cCAkCi0KZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2NDYwZC4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIzICswLDAgQEAKLTIwMTEwOTA2Ci0gLSAoZGptKSBbUkVBRE1FIHZlcnNpb24uaF0gQ29ycmVjdCB2ZXJzaW9uCi0gLSAoZGptKSBbY29udHJpYi9yZWRoYXQvb3BlbnNzaC5zcGVjXSBDb3JyZWN0IHJlc3RvcmNvbiA9PiByZXN0b3JlY29uCi0gLSAoZGptKSBSZXNwaW4gT3BlblNTSC01LjlwMSByZWxlYXNlCi0KLTIwMTEwOTA1Ci0gLSAoZGptKSBbUkVBRE1FIGNvbnRyaWIvY2FsZGVyYS9vcGVuc3NoLnNwZWMgY29udHJpYi9yZWRoYXQvb3BlbnNzaC5zcGVjXQotICAgW2NvbnRyaWIvc3VzZS9vcGVuc3NoLnNwZWNdIFVwZGF0ZSB2ZXJzaW9uIG51bWJlcnMuCi0KLTIwMTEwOTA0Ci0gLSAoZGptKSBbcmVncmVzcy9jb25uZWN0LXByaXZzZXAuc2ggcmVncmVzcy90ZXN0LWV4ZWMuc2hdIGRlbW90ZSBmYXRhbAotICAgcmVncmVzcyBlcnJvcnMgZm9yIHRoZSBzYW5kYm94IHRvIHdhcm5pbmdzLiBvayB0aW0gZHR1Y2tlcgotIC0gKGR0dWNrZXIpIFtzc2gta2V5Z2VuLmMgc3NoLXBrY3MxMS5jXSBCdWcgIzE5Mjk6IGFkZCBudWxsIGltcGxlbWVudGF0aW9ucwotICAgb2ZzaC1wa2NzMTEuY3BrY3NfaW5pdCBhbmQgcGtjc190ZXJtaW5hdGUgZm9yIGJ1aWxkaW5nIHdpdGhvdXQgZGxvcGVuCi0gICBzdXBwb3J0LgotCi0yMDExMDgyOQotIC0gKGRqbSkgW29wZW5ic2QtY29tcGF0L3BvcnQtbGludXguY10gU3VwcHJlc3MgbG9nZ2luZyB3aGVuIGF0dGVtcHRpbmcKLSAgIHRvIHN3aXRjaCBTRUxpbnV4IGNvbnRleHQgYXdheSBmcm9tIHVuY29uZmluZWRfdCwgYmFzZWQgb24gcGF0Y2ggZnJvbQotICAgSmFuIENoYWRpbWE7IGJ6IzE5MTkgb2sgZHR1Y2tlckAKLQotMjAxMTA4MjcKLSAtIChkdHVja2VyKSBbYXV0aC1za2V5LmNdIEFkZCBsb2cuaCB0byBmaXggYnVpbGQgLS13aXRoLXNrZXkuCi0KLTIwMTEwODE4Ci0gLSAodGltKSBbY29uZmlndXJlLmFjXSBUeXBvIGluIGVycm9yIG1lc3NhZ2Ugc3BvdHRlZCBieSBBbmR5IFRzb3VsYWR6ZQotCi0yMDExMDgxNwotIC0gKHRpbSkgW21hYy5jIG15cHJvcG9zYWwuaF0gV3JhcCBTSEEyNTYgYW5kIFNIQTUxMiBpbiBpZmRlZnMgZm9yCi0gICBPcGVuU1NMIDAuOS43LiBvayBkam0KLSAtIChkam0pIFsgb3BlbmJzZC1jb21wYXQvYnNkLWN5Z3dpbl91dGlsLmMgb3BlbmJzZC1jb21wYXQvYnNkLWN5Z3dpbl91dGlsLmhdCi0gICBiaW5hcnlfcGlwZSBpcyBubyBsb25nZXIgcmVxdWlyZWQgb24gQ3lnd2luOyBwYXRjaCBmcm9tIENvcmlubmEgVmluc2NoZW4KLSAtIChkam0pIFtjb25maWd1cmUuYWNdIGVycm9yIG91dCBpZiB0aGUgaG9zdCBsYWNrcyB0aGUgbmVjZXNzYXJ5IGJpdHMgZm9yCi0gICBhbiBleHBsaWNpdGx5IHJlcXVlc3RlZCBzYW5kYm94IHR5cGUKLSAtIChkam0pIFtjb250cmliL3NzaC1jb3B5LWlkXSBNaXNzaW5nIGJhY2tsc2xhc2g7IHNwb3R0ZWQgYnkKLSAgIGJpc3NvbiBBVCBhcmNobGludXgub3JnCi0gLSAoZGptKSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGR0dWNrZXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMDMgMDU6MzU6MTAKLSAgICAgW3JlZ3Jlc3MvY2ZnbWF0Y2guc2hdCi0gICAgIHVzZSBPQkogdG8gZmluZCB0ZXN0IGNvbmZpZ3MsIHBhdGNoIGZyb20gVGltIFJpY2UKLSAgIC0gbWFya3VzQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA2LzMwIDIyOjQ0OjQzCi0gICAgIFtyZWdyZXNzL2Nvbm5lY3QtcHJpdnNlcC5zaF0KLSAgICAgdGVzdCB3aXRoIHNhbmRib3ggZW5hYmxlZDsgb2sgZGptQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDgvMDIgMDE6MjM6NDEKLSAgICAgW3JlZ3Jlc3MvY2lwaGVyLXNwZWVkLnNoIHJlZ3Jlc3MvdHJ5LWNpcGhlcnMuc2hdCi0gICAgIGFkZCBTSEEyNTYvU0hBNTEyIGJhc2VkIEhNQUMgbW9kZXMKLSAtIChkam0pIFtyZWdyZXNzL2NpcGhlci1zcGVlZC5zaCByZWdyZXNzL3RyeS1jaXBoZXJzLnNoXSBkaXNhYmxlIEhNQUMtU0hBMgotICAgTUFDIHRlc3RzIGZvciBwbGF0Zm9ybXMgdGhhdCBoYWNrIEVWUF9TSEEyIHN1cHBvcnQKLQotMjAxMTA4MTIKLSAtIChkdHVja2VyKSBbb3BlbmJzZC1jb21wYXQvcG9ydC1saW51eC5jXSBCdWcgMTkyNDogSW1wcm92ZSBzZWxpbnV4IGNvbnRleHQKLSAgIGNoYW5nZSBlcnJvciBieSByZXBvcnRpbmcgb2xkIGFuZCBuZXcgY29udGV4dCBuYW1lcyAgUGF0Y2ggZnJvbQotICAgamNoYWRpbWEgYXQgcmVkaGF0LgotIC0gKGRqbSkgW2NvbnRyaWIvcmVkaGF0L29wZW5zc2guc3BlYyBjb250cmliL3JlZGhhdC9zc2hkLmluaXRdCi0gICBbY29udHJpYi9zdXNlL29wZW5zc2guc3BlYyBjb250cmliL3N1c2UvcmMuc3NoZF0gVXBkYXRlZCBSSEVMIGFuZCBTTEVTCi0gICBpbml0IHNjcmlwcyBmcm9tIGltb3JnYW4gQVQgbmFzLm5hc2EuZ292OyBieiMxOTIwCi0gLSAoZGptKSBbY29udHJpYi9zc2gtY29weS1pZF0gRml4IGZhaWx1cmUgZm9yIGNhc2VzIHdoZXJlIHRoZSBwYXRoIHRvIHRoZQotICAgaWRlbnRpZnkgZmlsZSBjb250YWluZWQgd2hpdGVzcGFjZS4gYnojMTgyOCBwYXRjaCBmcm9tIGd3ZW5hZWwubGFtYnJvdWluCi0gICBBVCBnbWFpbC5jb207IG9rIGR0dWNrZXJACi0KLTIwMTEwODA3Ci0gLSAoZHR1Y2tlcikgT3BlbkJTRCBDVlMgU3luYwotICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMDgvMDYvMjYgMDY6NTk6MzkKLSAgICAgW21vZHVsaS41XQotICAgICB0d2VhayBwcmV2aW91czsKLSAgIC0gc29icmFkb0BjdnMub3BlbmJzZC5vcmcgMjAwOS8xMC8yOCAwODo1Njo1NAotICAgICBbbW9kdWxpLjVdCi0gICAgICJEaWZmaWUtSGVsbG1hbiIgaXMgdGhlIHVzdWFsIHNwZWxsaW5nIGZvciB0aGUgY3J5cHRvZ3JhcGhpYyBwcm90b2NvbAotICAgICBmaXJzdCBwdWJsaXNoZWQgYnkgV2hpdGZpZWxkIERpZmZpZSBhbmQgTWFydGluIEhlbGxtYW4gaW4gMTk3Ni4KLSAgICAgb2sgam1jQAotICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTAvMTQgMjA6NDE6MjgKLSAgICAgW21vZHVsaS41XQotICAgICBwcm9iYWJhbGlzdGljIC0+IHByb2JhYmlsaXN0aWM7IGZyb20gbmFkZHkKLSAgIC0gZHR1Y2tlckBjdnMub3BlbmJzZC5vcmcgMjAxMS8wOC8wNyAxMjo1NTozMAotICAgICBbc2Z0cC4xXQotICAgICB0eXBvLCBmaXggZnJvbSBMYXVyZW50IEdhdXRyb3QKLQotMjAxMTA4MDUKLSAtIE9wZW5CU0QgQ1ZTIFN5bmMKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA2LzIzIDIzOjM1OjQyCi0gICAgIFttb25pdG9yLmNdCi0gICAgIGlnbm9yZSBFSU5UUiBlcnJvcnMgZnJvbSBwb2xsKCkKLSAgIC0gdGVkdUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNy8wNiAxODowOToyMQotICAgICBbYXV0aGZkLmNdCi0gICAgIGJ6ZXJvIHRoZSBhZ2VudCBhZGRyZXNzLiAgdGhlIGtlcm5lbCB3YXMgZm9yIGEgd2hpbGUgdmVyeSBjcmFua3kgYWJvdXQKLSAgICAgdGhlc2UgdGhpbmdzLiAgZXZuZSB0aG91Z2ggdGhhdCdzIGZpeGVkLCBhbHdheXMgZ29vZCB0byBpbml0aWFsaXplCi0gICAgIG1lbW9yeS4gIG9rIGRlcmFhZHQgZGptCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNy8yOSAxNDo0Mjo0NQotICAgICBbc2FuZGJveC1zeXN0cmFjZS5jXQotICAgICBmYWlsIG9wZW4oMikgd2l0aCBFUEVSTSByYXRoZXIgdGhhbiBTSUdLSUxMaW5nIHRoZSB3aG9sZSBwcm9jZXNzLiBsaWJjCi0gICAgIHdpbGwgY2FsbCBvcGVuKCkgdG8gZG8gc3RyZXJyb3IoKSB3aGVuIE5MUyBpcyBlbmFibGVkOwotICAgICBmZWVkYmFjayBhbmQgb2sgbWFya3VzQAotICAgLSBtYXJrdXNAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDgvMDEgMTk6MTg6MTUKLSAgICAgW2dzcy1zZXJ2LmNdCi0gICAgIHByZXZlbnQgcG9zdC1hdXRoIHJlc291cmNlIGV4aGF1c3Rpb24gKGludCBvdmVyZmxvdyBsZWFkaW5nIHRvIDRHQiBtYWxsb2MpOwotICAgICByZXBvcnQgQWRhbSBaYWJyb2NrOyBvayBkam1ALCBkZXJhYWR0QAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDgvMDIgMDE6MjI6MTEKLSAgICAgW21hYy5jIG15cHJvcG9zYWwuaCBzc2guMSBzc2hfY29uZmlnLjUgc3NoZC44IHNzaGRfY29uZmlnLjVdCi0gICAgIEFkZCBuZXcgU0hBMjU2IGFuZCBTSEE1MTIgYmFzZWQgSE1BQyBtb2RlcyBmcm9tCi0gICAgIGh0dHA6Ly93d3cuaWV0Zi5vcmcvaWQvZHJhZnQtZGJpZGVyLXNoYTItbWFjLWZvci1zc2gtMDIudHh0Ci0gICAgIFBhdGNoIGZyb20gbWRiIEFUIGp1bmlwZXIubmV0OyBmZWVkYmFjayBhbmQgb2sgbWFya3VzQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDgvMDIgMjM6MTM6MDEKLSAgICAgW3ZlcnNpb24uaF0KLSAgICAgY3Jhbmsgbm93LCByZWxlYXNlIGxhdGVyCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wOC8wMiAyMzoxNTowMwotICAgICBbc3NoLmNdCi0gICAgIHR5cG8gaW4gY29tbWVudAotCi0yMDExMDYyNAotIC0gKGRqbSkgW2NvbmZpZ3VyZS5hYyBNYWtlZmlsZS5pbiBzYW5kYm94LWRhcndpbi5jXSBBZGQgYSBzYW5kYm94IGZvcgotICAgRGFyd2luL09TIFggdXNpbmcgc2FuZGJveF9pbml0KCkgKyBzZXRybGltaXQoKTsgZmVlZGJhY2sgYW5kIHRlc3RpbmcKLSAgIG1hcmt1c0AKLQotMjAxMTA2MjMKLSAtIE9wZW5CU0QgQ1ZTIFN5bmMKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA2LzIyIDIxOjQ3OjI4Ci0gICAgIFtzZXJ2Y29uZi5jXQotICAgICByZXVzZSB0aGUgbXVsdGlzdGF0ZSBvcHRpb24gYXJyYXlzIHRvIHByZXR0eS1wcmludCBvcHRpb25zIGZvciAic3NoZCAtVCIKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA2LzIyIDIxOjU3OjAxCi0gICAgIFtzZXJ2Y29uZi5jIHNlcnZjb25mLmggc3NoZC5jIHNzaGRfY29uZmlnLjVdCi0gICAgIFtjb25maWd1cmUuYWMgTWFrZWZpbGUuaW5dCi0gICAgIGludHJvZHVjZSBzYW5kYm94aW5nIG9mIHRoZSBwcmUtYXV0aCBwcml2c2VwIGNoaWxkIHVzaW5nIHN5c3RyYWNlKDQpLgotICAgICAKLSAgICAgVGhpcyBpbnRyb2R1Y2VzIGEgbmV3ICJVc2VQcml2aWxlZ2VTZXBhcmF0aW9uPXNhbmRib3giIG9wdGlvbiBmb3IKLSAgICAgc3NoZF9jb25maWcgdGhhdCBhcHBsaWVzIG1hbmRhdG9yeSByZXN0cmljdGlvbnMgb24gdGhlIHN5c2NhbGxzIHRoZQotICAgICBwcml2c2VwIGNoaWxkIGNhbiBwZXJmb3JtLiBUaGlzIHByZXZlbnRzIGEgY29tcHJvbWlzZWQgcHJpdnNlcCBjaGlsZAotICAgICBmcm9tIGJlaW5nIHVzZWQgdG8gYXR0YWNrIG90aGVyIGhvc3RzIChieSBvcGVuaW5nIHNvY2tldHMgYW5kIHByb3h5aW5nKQotICAgICBvciBwcm9iaW5nIGxvY2FsIGtlcm5lbCBhdHRhY2sgc3VyZmFjZS4KLSAgICAgCi0gICAgIFRoZSBzYW5kYm94IGlzIGltcGxlbWVudGVkIHVzaW5nIHN5c3RyYWNlKDQpIGluIHVuc3VwZXJ2aXNlZCAiZmFzdC1wYXRoIgotICAgICBtb2RlLCB3aGVyZSBhIGxpc3Qgb2YgcGVybWl0dGVkIHN5c2NhbGxzIGlzIHN1cHBsaWVkLiBBbnkgc3lzY2FsbCBub3QKLSAgICAgb24gdGhlIGxpc3QgcmVzdWx0cyBpbiBTSUdLSUxMIGJlaW5nIHNlbnQgdG8gdGhlIHByaXZzZXAgY2hpbGQuIE5vdGUKLSAgICAgdGhhdCB0aGlzIHJlcXVpcmVzIGEga2VybmVsIHdpdGggdGhlIG5ldyBTWVNUUl9QT0xJQ1lfS0lMTCBvcHRpb24uCi0gICAgIAotICAgICBVc2VQcml2aWxlZ2VTZXBhcmF0aW9uPXNhbmRib3ggd2lsbCBiZWNvbWUgdGhlIGRlZmF1bHQgaW4gdGhlIGZ1dHVyZQotICAgICBzbyBwbGVhc2Ugc3RhcnQgdGVzdGluZyBpdCBub3cuCi0gICAgIAotICAgICBmZWVkYmFjayBkdHVja2VyQDsgb2sgbWFya3VzQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMjIgMjI6MDg6NDIKLSAgICAgW2NoYW5uZWxzLmMgY2hhbm5lbHMuaCBjbGllbnRsb29wLmMgY2xpZW50bG9vcC5oIG11eC5jIHNzaC5jXQotICAgICBob29rIHVwIGEgY2hhbm5lbCBjb25maXJtIGNhbGxiYWNrIHRvIHdhcm4gdGhlIHVzZXIgdGhlbiByZXF1ZXN0ZWQgWDExCi0gICAgIGZvcndhcmRpbmcgd2FzIHJlZnVzZWQgYnkgdGhlIHNlcnZlcjsgb2sgbWFya3VzQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMjMgMDk6MzQ6MTMKLSAgICAgW3NzaGQuYyBzc2gtc2FuZGJveC5oIHNhbmRib3guaCBzYW5kYm94LXJsaW1pdC5jIHNhbmRib3gtc3lzdHJhY2UuY10KLSAgICAgW3NhbmRib3gtbnVsbC5jXQotICAgICByZW5hbWUgc2FuZGJveC5oID0+IHNzaC1zYW5kYm94LmggdG8gbWFrZSB0aGluZ3MgZWFzaWVyIGZvciBwb3J0YWJsZQotIC0gKGRqbSkgW3NhbmRib3gtbnVsbC5jXSBEdW1teSBzYW5kYm94IGZvciBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0Ci0gICBzZXRybGltaXQoMikKLQotMjAxMTA2MjAKLSAtIE9wZW5CU0QgQ1ZTIFN5bmMKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA2LzA0IDAwOjEwOjI2Ci0gICAgIFtzc2hfY29uZmlnLjVdCi0gICAgIGV4cGxhaW4gSWRlbnRpZnlGaWxlJ3Mgc2VtYW50aWNzIGEgbGl0dGxlIGJldHRlciwgcHJvbXB0ZWQgYnkgYnojMTg5OAotICAgICBvayBkdHVja2VyIGptYwotICAgLSBtYXJrdXNAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMTQgMjI6NDk6MTgKLSAgICAgW2F1dGhmaWxlLmNdCi0gICAgIG1ha2Ugc3VyZSBrZXlfcGFyc2VfcHVibGljL3ByaXZhdGVfcnNhMSgpIG5vIGxvbmdlciBjb25zdW1lcyBpdHMgaW5wdXQKLSAgICAgYnVmZmVyLiAgZml4ZXMgc3NoLWFkZCBmb3IgcGFzc3BocmFzZS1wcm90ZWN0ZWQgc3NoMS1rZXlzOwotICAgICBub3RlZCBieSBuYWRkeUA7IG9rIGRqbUAKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA2LzE3IDIxOjQ0OjMxCi0gICAgIFtsb2cuYyBsb2cuaCBtb25pdG9yLmMgbW9uaXRvci5oIG1vbml0b3Jfd3JhcC5jIG1vbml0b3Jfd3JhcC5oIHNzaGQuY10KLSAgICAgbWFrZSB0aGUgcHJlLWF1dGggcHJpdnNlcCBzbGF2ZSBsb2cgdmlhIGEgc29ja2V0cGFpciBzaGFyZWQgd2l0aCB0aGUKLSAgICAgbW9uaXRvciByYXRoZXIgdGhhbiAvdmFyL2VtcHR5L2Rldi9sb2c7IG9rIGR0dWNrZXJAIGRlcmFhZHRAIG1hcmt1c0AKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA2LzE3IDIxOjQ2OjE2Ci0gICAgIFtzZnRwLXNlcnZlci5jXQotICAgICB0aGUgcHJvdG9jb2wgdmVyc2lvbiBzaG91bGQgYmUgdW5zaWduZWQ7IGJ6IzE5MTMgcmVwb3J0ZWQgYnkgbWIgQVQKLSAgICAgc21hcnRmdHAuY29tCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNi8xNyAyMTo0NzozNQotICAgICBbc2VydmNvbmYuY10KLSAgICAgZmFjdG9yIG91dCBtdWx0aS1jaG9pY2Ugb3B0aW9uIHBhcnNpbmcgaW50byBhIHBhcnNlX211bHRpc3RhdGUgbGFiZWwKLSAgICAgYW5kIHNvbWUgc3VwcG9ydCBzdHJ1Y3R1cmVzOyBvayBkdHVja2VyQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMTcgMjE6NTc6MjUKLSAgICAgW2NsaWVudGxvb3AuY10KLSAgICAgc2V0cHJvY3RpdGxlIGZvciBhIG11eCBtYXN0ZXIgdGhhdCBoYXMgYmVlbiBncmFjZWZ1bGx5IHN0b3BwZWQ7Ci0gICAgIGJ6IzE5MTEgZnJvbSBCZXJ0Lldlc2FyZyBBVCBnb29nbGVtYWlsLmNvbQotCi0yMDExMDYwMwotIC0gKGR0dWNrZXIpIFtSRUFETUUgdmVyc2lvbi5oIGNvbnRyaWIvY2FsZGVyYS9vcGVuc3NoLnNwZWMKLSAgIGNvbnRyaWIvcmVkaGF0L29wZW5zc2guc3BlYyBjb250cmliL3N1c2Uvb3BlbnNzaC5zcGVjXSBQdWxsIHRoZSB2ZXJzaW9uCi0gICBidW1wcyBmcm9tIHRoZSA1LjhwMiBicmFuY2ggaW50byBIRUFELiAgb2sgZGptLgotIC0gKHRpbSkgW2NvbmZpZ3VyZS5hYyBkZWZpbmVzLmhdIFJ1biB0ZXN0IHByb2dyYW0gdG8gZGV0ZWN0IHN5c3RlbSBtYWlsCi0gICBkaXJlY3RvcnkuIEFkZCAtLXdpdGgtbWFpbGRpciBvcHRpb24gdG8gb3ZlcnJpZGUuIEZpeGVkIE9wZW5TZXJ2ZXIgNgotICAgZ2V0dGluZyBpdCB3cm9uZy4gRml4ZWQgbWFueSBzeXN0ZW1zIGhhdmluZyBNQUlMPS92YXIvbWFpbC8vdXNlcm5hbWUKLSAgIG9rIGR0dWNrZXIKLSAtIChkdHVja2VyKSBbbW9uaXRvci5jXSBSZW1vdmUgdGhlICFIQVZFX1NPQ0tFVFBBSVIgY2FzZS4gIFdlIHVzZSBzb2NrZXRwYWlyCi0gICB1bmNvbmRpdGlvbmFsbHkgaW4gb3RoZXIgcGxhY2VzIGFuZCB0aGUgc3VydmV5IGRhdGEgd2UgaGF2ZSBkb2VzIG5vdCBzaG93Ci0gICBhbnkgc3lzdGVtcyB0aGF0IHVzZSBpdC4gICJudWtlIGl0IiBkam1ACi0gLSAoZGptKSBbY29uZmlndXJlLmFjXSBlbmFibGUgc2V0cHJvY3RpdGxlIGVtdWxhdGlvbiBmb3IgT1MgWAotIC0gKGRqbSkgT3BlbkJTRCBDVlMgU3luYwotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDYvMDMgMDA6NTQ6MzgKLSAgICAgW3NzaC5jXQotICAgICBieiMxODgzIC0gc2V0cHJvY3RpdGxlKCkgdG8gaWRlbnRpZnkgbXV4IG1hc3RlcjsgcGF0Y2ggZnJvbSBCZXJ0Lldlc2FyZwotICAgICBBVCBnb29nbGVtYWlsLmNvbTsgb2sgZHR1Y2tlckAKLSAgICAgTkIuIGluY2x1ZGVzIGFkZGl0aW9uYWwgcG9ydGFiaWxpdHkgY29kZSB0byBlbmFibGUgc2V0cHJvY3RpdGxlIGVtdWxhdGlvbgotICAgICBvbiBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LgotICAgLSBkdHVja2VyQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA2LzAzIDAxOjM3OjQwCi0gICAgIFtzc2gtYWdlbnQuY10KLSAgICAgQ2hlY2sgY3VycmVudCBwYXJlbnQgcHJvY2VzcyBJRCBhZ2FpbnN0IHNhdmVkIG9uZSB0byBkZXRlcm1pbmUgaWYgdGhlIHBhcmVudAotICAgICBoYXMgZXhpdGVkLCByYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIHNlbmQgYSB6ZXJvIHNpZ25hbCwgc2luY2UgdGhlIGxhdHRlcgotICAgICB3b24ndCB3b3JrIGlmIHRoZSBwYXJlbnQgaGFzIGNoYW5nZWQgcHJpdnMuICBieiMxOTA1LCBwYXRjaCBmcm9tIERhbmllbCBLYWhuCi0gICAgIEdpbGxtb3IsIG9rIGRqbUAKLSAgICAtIGR0dWNrZXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMzEgMDI6MDE6NTgKLSAgICAgW3JlZ3Jlc3MvZHluYW1pYy1mb3J3YXJkLnNoXQotICAgICBiYWNrIG91dCByZXZzIDEuNiBhbmQgMS41IHNpbmNlIGl0J3Mgbm90IHJlbGlhYmxlCi0gICAtIGR0dWNrZXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMzEgMDI6MDM6MzQKLSAgICAgW3JlZ3Jlc3MvZHluYW1pYy1mb3J3YXJkLnNoXQotICAgICB3b3JrIGFyb3VuZCBzdGFydHVwIGFuZCB0ZWFyZG93biByYWNlczsgY2F1Z2h0IGJ5IGRlcmFhZHQKLSAgIC0gZHR1Y2tlckBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNi8wMyAwMDoyOTo1MgotICAgICBbcmVncmVzcy9keW5hbWljLWZvcndhcmQuc2hdCi0gICAgIFJldHJ5IGVzdGFibGlzaGluZyB0aGUgcG9ydCBmb3J3YXJkaW5nIGFmdGVyIGEgc21hbGwgZGVsYXksIHNob3VsZCBtYWtlCi0gICAgIHRoZSB0ZXN0cyBsZXNzIGZsYWt5IHdoZW4gdGhlIHByZXZpb3VzIHRlc3QgaXMgc2xvdyB0byBzaHV0IGRvd24gYW5kIGZyZWUKLSAgICAgdXAgdGhlIHBvcnQuCi0gLSAodGltKSBbcmVncmVzcy9jZmdtYXRjaC5zaF0gQnVpbGQvdGVzdCBvdXQgb2YgdHJlZSBmaXguCi0KLTIwMTEwNTI5Ci0gLSAoZGptKSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8yMyAwMzozMDowNwotICAgICBbYXV0aC1yc2EuYyBhdXRoLmMgYXV0aC5oIGF1dGgyLXB1YmtleS5jIG1vbml0b3IuYyBtb25pdG9yX3dyYXAuY10KLSAgICAgW3BhdGhuYW1lcy5oIHNlcnZjb25mLmMgc2VydmNvbmYuaCBzc2hkLjggc3NoZF9jb25maWcgc3NoZF9jb25maWcuNV0KLSAgICAgYWxsb3cgQXV0aG9yaXplZEtleXNGaWxlIHRvIHNwZWNpZnkgbXVsdGlwbGUgZmlsZXMsIHNlcGFyYXRlZCBieSBzcGFjZXMuCi0gICAgIEJyaW5nIGJhY2sgYXV0aG9yaXplZF9rZXlzMiBhcyBhIGRlZmF1bHQgc2VhcmNoIHBhdGggKHRvIGF2b2lkIGJyZWFraW5nCi0gICAgIGV4aXN0aW5nIHVzZXJzIG9mIHRoaXMgZmlsZSksIGJ1dCBvdmVycmlkZSB0aGlzIGluIHNzaGRfY29uZmlnIHNvIGl0IHdpbGwKLSAgICAgYmUgbm8gbG9uZ2VyIHVzZWQgb24gZnJlc2ggaW5zdGFsbHMuIE1heWJlIGluIDIwMTUgd2UgY2FuIHJlbW92ZSBpdAotICAgICBlbnRpZXJseSA6KQotICAgICAKLSAgICAgZmVlZGJhY2sgYW5kIG9rIG1hcmt1c0AgZHR1Y2tlckAKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzIzIDAzOjMzOjM4Ci0gICAgIFthdXRoLmNdCi0gICAgIG1ha2Ugc2VjdXJlX2ZpbGVuYW1lKCkgc3BhbSBkZWJ1ZyBsb2dzIGxlc3MKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzIzIDAzOjUyOjU1Ci0gICAgIFtzc2hjb25uZWN0LmNdCi0gICAgIHJlbW92ZSBleHRyYSBuZXdsaW5lCi0gICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8yMyAwNzoxMDoyMQotICAgICBbc3NoZC44IHNzaGRfY29uZmlnLjVdCi0gICAgIHR3ZWFrIHByZXZpb3VzOyBvayBkam0KLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzIzIDA3OjI0OjU3Ci0gICAgIFthdXRoZmlsZS5jXQotICAgICByZWFkIGluIGtleSBjb21tZW50cyBmb3Igdi4yIGtleXMgKHRob3VnaCBub3RlIHRoYXQgdGhlc2UgYXJlIG5vdAotICAgICBwYXNzZWQgb3ZlciB0aGUgYWdlbnQgcHJvdG9jb2wpOyBieiM0MzksIGJhc2VkIG9uIHBhdGNoIGZyb20gYmluZGVyCi0gICAgIEFUIGFyYWdvLmRlOyBvayBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8yNCAwNzoxNTo0NwotICAgICBbcmVhZGNvbmYuYyByZWFkY29uZi5oIHNzaC5jIHNzaF9jb25maWcuNSBzc2hjb25uZWN0LmMgc3NoY29ubmVjdDIuY10KLSAgICAgUmVtb3ZlIHVuZG9jdW1lbnRlZCBsZWdhY3kgb3B0aW9ucyBVc2VyS25vd25Ib3N0c0ZpbGUyIGFuZAotICAgICBHbG9iYWxLbm93bkhvc3RzRmlsZTIgYnkgbWFraW5nIFVzZXJLbm93bkhvc3RzRmlsZS9HbG9iYWxLbm93bkhvc3RzRmlsZQotICAgICBhY2NlcHQgbXVsdGlwbGUgcGF0aHMgcGVyIGxpbmUgYW5kIG1ha2luZyB0aGVpciBkZWZhdWx0cyBpbmNsdWRlCi0gICAgIGtub3duX2hvc3RzMjsgb2sgbWFya3VzCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8yMyAwMzozMTozMQotICAgICBbcmVncmVzcy9jZmdtYXRjaC5zaF0KLSAgICAgaW5jbHVkZSB0ZXN0aW5nIG9mIG11bHRpcGxlL292ZXJyaWRkZW4gQXV0aG9yaXplZEtleXNGaWxlcwotICAgICByZWZhY3RvciB0byBzaW1wbHkgZGFlbW9uIHN0YXJ0L3N0b3AgYW5kIGdldCByaWQgb2YgcmFjeSBjb25zdHJ1Y3RzCi0KLTIwMTEwNTIwCi0gLSAoZGptKSBbc2Vzc2lvbi5jXSBjYWxsIHNldGV4ZWNjb24oKSBiZWZvcmUgZXhlY3V0aW5nIHBhc3N3ZCBmb3IgcHcKLSAgIGNoYW5nZXM7IGJ6IzE4OTEgcmVwb3J0ZWQgYnkgamNoYWRpbWEgQVQgcmVkaGF0LmNvbTsgb2sgZHR1Y2tlckAKLSAtIChkam0pIFthY2xvY2FsLm00IGNvbmZpZ3VyZS5hY10gc2luY2UgZ2NjLTQueCBpZ25vcmVzIGFsbCAtV25vLW9wdGlvbnMKLSAgIG9wdGlvbnMsIHdlIHNob3VsZCBjb3JyZXNwb25kaW5nIC1XLW9wdGlvbiB3aGVuIHRyeWluZyB0byBkZXRlcm1pbmUKLSAgIHdoZXRoZXIgaXQgaXMgYWNjZXB0ZWQuICBBbHNvIGluY2x1ZGVzIGEgd2FybmluZyBmaXggb24gdGhlIHByb2dyYW0KLSAgIGZyYWdtZW50IHVzZXMgKGJhZCBtYWluKCkgcmV0dXJuIHR5cGUpLgotICAgYnojMTkwMCBhbmQgYnojMTkwMSByZXBvcnRlZCBieSBnLmVzcCBBVCBmcmVlLmZyOyBvayBkdHVja2VyQAotIC0gKGRqbSkgW3NlcnZjb25mLmNdIHJlbW92ZSBsZWZ0b3ZlciBkcm9wcGluZ3Mgb2YgQXV0aG9yaXplZEtleXNGaWxlMgotIC0gT3BlbkJTRCBDVlMgU3luYwotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMTUgMDg6MDk6MDEKLSAgICAgW2F1dGhmZC5jIG1vbml0b3IuYyBzZXJ2ZXJsb29wLmNdCi0gICAgIHVzZSBGRF9DTE9FWEVDIGNvbnNpc3RlbnRseTsgcGF0Y2ggZnJvbSB6aW9uIEFUIHg5Ni5vcmcKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzE3IDA3OjEzOjMxCi0gICAgIFtrZXkuY10KLSAgICAgZmF0YWwoKSBpZiBhc2tlZCB0byBnZW5lcmF0ZSBhIGxlZ2FjeSBFQ0RTQSBjZXJ0ICh0aGVzZSBkb24ndCBleGlzdCkKLSAgICAgYW5kIGZpeCB0aGUgcmVncmVzcyB0ZXN0IHRoYXQgd2FzIHRyeWluZyB0byBnZW5lcmF0ZSB0aGVtIDopCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8yMCAwMDo1NTowMgotICAgICBbc2VydmNvbmYuY10KLSAgICAgdGhlIG9wdGlvbnMgVHJ1c3RlZFVzZXJDQUtleXMsIFJldm9rZWRLZXlzRmlsZSwgQXV0aG9yaXplZEtleXNGaWxlCi0gICAgIGFuZCBBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGUgd2VyZSBub3QgYmVpbmcgY29ycmVjdGx5IGFwcGxpZWQgaW4KLSAgICAgTWF0Y2ggYmxvY2tzLCBkZXNwaXRlIGJlaW5nIG92ZXJyaWRhYmxlIHRoZXJlOyBvayBkdHVja2VyQAotICAgLSBkdHVja2VyQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzIwIDAyOjAwOjE5Ci0gICAgIFtzZXJ2Y29uZi5jXQotICAgICBBZGQgY29tbWVudCBkb2N1bWVudGluZyB3aGF0IHNob3VsZCBiZSBhZnRlciB0aGUgcHJlYXV0aCBjaGVjay4gIG9rIGRqbQotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMjAgMDM6MjU6NDUKLSAgICAgW21vbml0b3IuYyBtb25pdG9yX3dyYXAuYyBzZXJ2Y29uZi5jIHNlcnZjb25mLmhdCi0gICAgIHVzZSBhIG1hY3JvIHRvIGRlZmluZSB3aGljaCBzdHJpbmcgb3B0aW9ucyB0byBjb3B5IGJldHdlZW4gY29uZmlncwotICAgICBmb3IgTWF0Y2guIFRoaXMgYXZvaWRzIHByb2JsZW1zIGNhdXNlZCBieSBmb3JnZXR0aW5nIHRvIGtlZXAgdGhyZWUKLSAgICAgY29kZSBsb2NhdGlvbnMgaW4gcGVyZmVjdCBzeW5jIGFuZCBvcmRlcmluZwotICAgICAKLSAgICAgInRoaXMgaXMgYXQgb25jZSBiZWF1dGlmdWwgYW5kIGhvcnJpYmxlIiArIG9rIGR0dWNrZXJACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8xNyAwNzoxMzozMQotICAgICBbcmVncmVzcy9jZXJ0LXVzZXJrZXkuc2hdCi0gICAgIGZhdGFsKCkgaWYgYXNrZWQgdG8gZ2VuZXJhdGUgYSBsZWdhY3kgRUNEU0EgY2VydCAodGhlc2UgZG9uJ3QgZXhpc3QpCi0gICAgIGFuZCBmaXggdGhlIHJlZ3Jlc3MgdGVzdCB0aGF0IHdhcyB0cnlpbmcgdG8gZ2VuZXJhdGUgdGhlbSA6KQotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMjAgMDI6NDM6MzYKLSAgICAgW2NlcnQtaG9zdGtleS5zaF0KLSAgICAgYW5vdGhlciBhdHRlbXB0IHRvIGdlbmVyYXRlIGEgdjAwIEVDRFNBIGtleSB0aGF0IGJyb2tlIHRoZSB0ZXN0Ci0gICAgIElEIHN5bmMgb25seSAtIHBvcnRhYmxlIGFscmVhZHkgaGFkIHRoaXMgc29tZWhvdwotICAgLSBkdHVja2VyQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzIwIDA1OjE5OjUwCi0gICAgIFtkeW5hbWljLWZvcndhcmQuc2hdCi0gICAgIFByZXZlbnQgcmFjZXMgaW4gZHluYW1pYyBmb3J3YXJkaW5nIHRlc3Q7IG9rIGRqbQotICAgLSBkdHVja2VyQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzIwIDA2OjMyOjMwCi0gICAgIFtkeW5hbWljLWZvcndhcmQuc2hdCi0gICAgIGZpeCBkdW1iIGVycm9yIGluIGR5bmFtaWMtZm9yd2FyZCB0ZXN0Ci0KLTIwMTEwNTE1Ci0gLSAoZGptKSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8wNSAwNToxMjowOAotICAgICBbbXV4LmNdCi0gICAgIGdyYWNlZnVsbHkgZmFsbCBiYWNrIHdoZW4gQ29udHJvbFBhdGggaXMgdG9vIGxhcmdlIGZvciBhCi0gICAgIHNvY2thZGRyX3VuLiBvayBtYXJrdXNAIGFzIHBhcnQgb2YgYSBsYXJnZXIgZGlmZgotICAgLSBkdHVja2VyQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzA2IDAxOjAzOjM1Ci0gICAgIFtzc2hkX2NvbmZpZ10KLSAgICAgY2xhcmlmeSBsYW5ndWFnZSBhYm91dCBvdmVycmlkaW5nIGRlZmF1bHRzLiAgYnojMTg5MiwgZnJvbSBQZXRyIENlcm55Ci0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8wNiAwMTowOTo1MwotICAgICBbc2Z0cC4xXQotICAgICBtZW50aW9uIHRoYXQgSVB2NiBhZGRyZXNzZXMgbXVzdCBiZSBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHM7Ci0gICAgIGJ6IzE4NDUKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzA2IDAyOjA1OjQxCi0gICAgIFtzc2hjb25uZWN0Mi5jXQotICAgICBmaXggbWVtb3J5IGxlYWs7IGJ6IzE4NDkgb2sgZHR1Y2tlckAKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzA2IDIxOjE0OjA1Ci0gICAgIFtwYWNrZXQuYyBwYWNrZXQuaF0KLSAgICAgc2V0IHRyYWZmaWMgY2xhc3MgZm9yIElQdjYgdHJhZmZpYyBhcyB3ZSBkbyBmb3IgSVB2NCBUT1M7Ci0gICAgIHBhdGNoIGZyb20gbGlvbmVsIEFUIG1hbWFuZS5sdSB2aWEgQ29saW4gV2F0c29uIGluIGJ6IzE4NTU7Ci0gICAgIG9rIG1hcmt1c0AKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzA2IDIxOjE4OjAyCi0gICAgIFtzc2guYyBzc2hfY29uZmlnLjVdCi0gICAgIGFkZCBhICVMIGV4cGFuc2lvbiAoc2hvcnQtZm9ybSBvZiB0aGUgbG9jYWwgaG9zdCBuYW1lKSBmb3IgQ29udHJvbFBhdGg7Ci0gICAgIHN5bmMgc29tZSBtb3JlIGV4cGFuc2lvbnMgd2l0aCBMb2NhbENvbW1hbmQ7IG9rIG1hcmt1c0AKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzA2IDIxOjMxOjM4Ci0gICAgIFtyZWFkY29uZi5jIHNzaF9jb25maWcuNV0KLSAgICAgc3VwcG9ydCBuZWdhdGVkIEhvc3QgbWF0Y2hpbmcsIGUuZy4KLSAgICAgCi0gICAgIEhvc3QgKi5leGFtcGxlLm9yZyAhYy5leGFtcGxlLm9yZwotICAgICAgICBVc2VyIG1la21pdGFzZGlnb2F0Ci0gICAgIAotICAgICBXaWxsIG1hdGNoICJhLmV4YW1wbGUub3JnIiwgImIuZXhhbXBsZS5vcmciLCBidXQgbm90ICJjLmV4YW1wbGUub3JnIgotICAgICBvayBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8wNiAyMTozNDozMgotICAgICBbY2xpZW50bG9vcC5jIG11eC5jIHJlYWRjb25mLmMgcmVhZGNvbmYuaCBzc2guYyBzc2hfY29uZmlnLjVdCi0gICAgIEFkZCBhIFJlcXVlc3RUVFkgc3NoX2NvbmZpZyBvcHRpb24gdG8gYWxsb3cgY29uZmlndXJhdGlvbi1iYXNlZAotICAgICBjb250cm9sIG92ZXIgdHR5IGFsbG9jYXRpb24gKGxpa2UgLXQvLVQpOyBvayBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8wNiAyMTozODo1OAotICAgICBbc3NoLmNdCi0gICAgIGZpeCBkcm9wcGluZyBmcm9tIHByZXZpb3VzIGRpZmYKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzA2IDIyOjIwOjEwCi0gICAgIFtQUk9UT0NPTC5tdXhdCi0gICAgIGZpeCBudW1iZXJpbmc7IGZyb20gYmVydC53ZXNhcmcgQVQgZ29vZ2xlbWFpbC5jb20KLSAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzA3IDIzOjE5OjM5Ci0gICAgIFtzc2hfY29uZmlnLjVdCi0gICAgIC0gdHdlYWsgcHJldmlvdXMKLSAgICAgLSBjb21lIGNvbnNpc3RlbmN5IGZpeGVzCi0gICAgIG9rIGRqbQotICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMDcgMjM6MjA6MjUKLSAgICAgW3NzaC4xXQotICAgICArLkl0IFJlcXVlc3RUVFkKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzA4IDEyOjUyOjAxCi0gICAgIFtQUk9UT0NPTC5tdXggY2xpZW50bG9vcC5jIGNsaWVudGxvb3AuaCBtdXguY10KLSAgICAgaW1wcm92ZSBvdXIgYmVoYXZpb3VyIHdoZW4gVFRZIGFsbG9jYXRpb24gZmFpbHM6IGlmIHdlIGFyZSBpbgotICAgICBSZXF1ZXN0VFRZPWF1dG8gbW9kZSAodGhlIGRlZmF1bHQpLCB0aGVuIGRvIG5vdCB0cmVhdCBhdCBUVFkKLSAgICAgYWxsb2NhdGlvbiBlcnJvciBhcyBmYXRhbCBidXQgcmF0aGVyIGp1c3QgcmVzdG9yZSB0aGUgbG9jYWwgVFRZCi0gICAgIHRvIGNvb2tlZCBtb2RlIGFuZCBjb250aW51ZS4gVGhpcyBpcyBtb3JlIGdyYWNlZnVsIG9uIGRldmljZXMgdGhhdAotICAgICBuZXZlciBhbGxvY2F0ZSBUVFlzLgotICAgICAKLSAgICAgSWYgUmVxdWVzdFRUWSBpcyBzZXQgdG8gInllcyIgb3IgImZvcmNlIiwgdGhlbiBmYWlsdXJlIHRvIGFsbG9jYXRlCi0gICAgIGEgVFRZIGlzIGZhdGFsLgotICAgICAKLSAgICAgb2sgbWFya3VzQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDUvMTAgMDU6NDY6NDYKLSAgICAgW2F1dGhmaWxlLmNdCi0gICAgIGRlc3BhbSBkZWJ1ZygpIGxvZ3MgYnkgZGV0ZWN0aW5nIHRoYXQgd2UgYXJlIHRyeWluZyB0byBsb2FkIGEgcHJpdmF0ZSBrZXkKLSAgICAgaW4ga2V5X3RyeV9sb2FkX3B1YmxpYygpIGFuZCByZXR1cm5pbmcgZWFybHk7IG9rIG1hcmt1c0AKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzA1LzExIDA0OjQ3OjA2Ci0gICAgIFthdXRoLmMgYXV0aC5oIGF1dGgyLXB1YmtleS5jIHBhdGhuYW1lcy5oIHNlcnZjb25mLmMgc2VydmNvbmYuaF0KLSAgICAgcmVtb3ZlIHN1cHBvcnQgZm9yIGF1dGhvcml6ZWRfa2V5czI7IGl0IGlzIGEgcmVsaWMgZnJvbSB0aGUgZWFybHkgZGF5cwotICAgICBvZiBwcm90b2NvbCB2LjIgc3VwcG9ydCBhbmQgaGFzIGJlZW4gdW5kb2N1bWVudGVkIGZvciBtYW55IHllYXJzOwotICAgICBvayBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8xMyAwMDowNTozNgotICAgICBbYXV0aGZpbGUuY10KLSAgICAgd2FybiBvbiB1bmV4cGVjdGVkIGtleSB0eXBlIGluIGtleV9wYXJzZV9wcml2YXRlX3R5cGUoKQotIC0gKGRqbSkgW3BhY2tldC5jXSB1bmJyZWFrIHBvcnRhYmlsaXR5ICNlbmRpZgotCi0yMDExMDUxMAotIC0gKGR0dWNrZXIpIFtvcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC57YyxofV0gQnVnICMxODgyOiBmaXgKLSAgIC0td2l0aC1zc2wtZW5naW5lIHdoaWNoIHdhcyBicm9rZW4gd2l0aCB0aGUgY2hhbmdlIGZyb20gZGVwcmVjYXRlZAotICAgU1NMZWF5X2FkZF9hbGxfYWxnb3JpdGhtcygpLiAgb2sgZGptCi0KLTIwMTEwNTA2Ci0gLSAoZHR1Y2tlcikgW29wZW5ic2QtY29tcGF0L3JlZ3Jlc3MvY2xvc2Vmcm9tdGVzdC5jXSBCdWcgIzE4NzU6IGFkZCBwcm90b3R5cGUKLSAgIGZvciBjbG9zZWZyb20oKSBpbiB0ZXN0IGNvZGUuICBSZXBvcnQgZnJvbSBEYW4gV2FsbGlzIHZpYSBHZW50b28uCi0KLTIwMTEwNTA1Ci0gLSAoZGptKSBbZGVmaW5lcy5oXSBNb3ZlIHVwIGluY2x1ZGUgb2YgbmV0aW5ldC9pcC5oIGZvciBJUFRPUwotICAgZGVmaW5pdGlvbnMuIEZyb20gZGVzIEFUIGRlcy5ubwotIC0gKGRqbSkgW01ha2VmaWxlLmluIFdBUk5JTkcuUk5HIGFjbG9jYWwubTQgYnVpbGRwa2cuc2guaW4gY29uZmlndXJlLmFjXQotICAgW2VudHJvcHkuYyBzc2gtYWRkLmMgc3NoLWFnZW50LmMgc3NoLWtleWdlbi5jIHNzaC1rZXlzY2FuLmNdCi0gICBbc3NoLWtleXNpZ24uYyBzc2gtcGtjczExLWhlbHBlci5jIHNzaC1yYW5kLWhlbHBlci44IHNzaC1yYW5kLWhlbHBlci5jXQotICAgW3NzaC5jIHNzaF9wcm5nX2NtZHMuaW4gc3NoZC5jIGNvbnRyaWIvYWl4L2J1aWxkYmZmLnNoXQotICAgW3JlZ3Jlc3MvUkVBRE1FLnJlZ3Jlc3NdIFJlbW92ZSBzc2gtcmFuZC1oZWxwZXIgYW5kIGFsbCBpdHMKLSAgIHRlbnRhY2xlcy4gUFJOR2Qgc2VlZGluZyBoYXMgYmVlbiByb2xsZWQgaW50byBlbnRyb3B5LmMgZGlyZWN0bHkuCi0gICBUaGFua3MgdG8gdGltQCBmb3IgdGVzdGluZyBvbiBhZmZlY3RlZCBwbGF0Zm9ybXMuCi0gLSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wMy8xMCAwMjo1Mjo1NwotICAgICBbYXV0aDItZ3NzLmMgYXV0aDIuYyBhdXRoLmhdCi0gICAgIGFsbG93IEdTU0FQSSBhdXRoZW50aWNhdGlvbiB0byBkZXRlY3Qgd2hlbiBhIHNlcnZlci1zaWRlIGZhaWx1cmUgY2F1c2VzCi0gICAgIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgYW5kIGRvbid0IGNvdW50IHN1Y2ggZmFpbHVyZXMgYWdhaW5zdCBNYXhBdXRoVHJpZXM7Ci0gICAgIGJ6IzEyNDQgZnJvbSBzaW1vbiBBVCBzeHcub3JnLnVrOyBvayBtYXJrdXNAIGJlZm9yZSBsb2NrCi0gICAtIG9rYW5AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDMvMTUgMTA6MzY6MDIKLSAgICAgW3NzaC1rZXlzY2FuLmNdCi0gICAgIHVzZSB0aW1lcmNsZWFyIG1hY3JvCi0gICAgIG9rIGRqbUAKLSAgIC0gc3RldmVza0BjdnMub3BlbmJzZC5vcmcgMjAxMS8wMy8yMyAxNToxNjoyMgotICAgICBbc3NoLWtleWdlbi4xIHNzaC1rZXlnZW4uY10KLSAgICAgQWRkIC1BIG9wdGlvbi4gIEZvciBlYWNoIG9mIHRoZSBrZXkgdHlwZXMgKHJzYTEsIHJzYSwgZHNhIGFuZCBlY2RzYSkKLSAgICAgZm9yIHdoaWNoIGhvc3Qga2V5cyBkbyBub3QgZXhpc3QsIGdlbmVyYXRlIHRoZSBob3N0IGtleXMgd2l0aCB0aGUKLSAgICAgZGVmYXVsdCBrZXkgZmlsZSBwYXRoLCBhbiBlbXB0eSBwYXNzcGhyYXNlLCBkZWZhdWx0IGJpdHMgZm9yIHRoZSBrZXkKLSAgICAgdHlwZSwgYW5kIGRlZmF1bHQgY29tbWVudC4gIFRoaXMgd2lsbCBiZSB1c2VkIGJ5IC9ldGMvcmMgdG8gZ2VuZXJhdGUKLSAgICAgbmV3IGhvc3Qga2V5cy4gIElkZWEgZnJvbSBkZXJhYWR0LgotICAgICBvayBkZXJhYWR0Ci0gICAtIHN0ZXZlc2tAY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDMvMjMgMTY6MjQ6NTYKLSAgICAgW3NzaC1rZXlnZW4uMV0KLSAgICAgLXEgbm90IHVzZWQgaW4gL2V0Yy9yYyBub3cgc28gcmVtb3ZlIHN0YXRlbWVudC4KLSAgIC0gc3RldmVza0BjdnMub3BlbmJzZC5vcmcgMjAxMS8wMy8yMyAxNjo1MDowNAotICAgICBbc3NoLWtleWdlbi5jXQotICAgICByZW1vdmUgLWQsIGRvY3VtZW50YXRpb24gcmVtb3ZlZCA+MTAgeWVhcnMgYWdvOyBvayBtYXJrdXMKLSAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAzLzI0IDE1OjI5OjMwCi0gICAgIFtzc2gta2V5Z2VuLjFdCi0gICAgIHphcCB0cmFpbGluZyB3aGl0ZXNwYWNlOwotICAgLSBzdGV2ZXNrQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAzLzI0IDIyOjE0OjU0Ci0gICAgIFtzc2gta2V5Z2VuLmNdCi0gICAgIHVzZSBzdHJjYXNlY21wKCkgZm9yICJjbGVhciIgY2VydCBwZXJtaXNzaW9uIG9wdGlvbiBhbHNvOyBvayBkam0KLSAgIC0gc3RldmVza0BjdnMub3BlbmJzZC5vcmcgMjAxMS8wMy8yOSAxODo1NDoxNwotICAgICBbbWlzYy5jIG1pc2MuaCBzZXJ2Y29uZi5jXQotICAgICBwcmludCBpcHFvcyBmcmllbmRseSBzdHJpbmcgZm9yIHNzaGQgLVQ7IG9rIG1hcmt1cwotICAgICAjIHNzaGQgLVRmIHNzaGRfY29uZmlnfGdyZXAgaXBxb3MKLSAgICAgaXBxb3MgbG93ZGVsYXkgdGhyb3VnaHB1dAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDQvMTIgMDQ6MjM6NTAKLSAgICAgW3NzaC1rZXlnZW4uY10KLSAgICAgZml4IC1Xc2hhZG93Ci0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNC8xMiAwNTozMjo0OQotICAgICBbc3NoZC5jXQotICAgICBleGl0IHdpdGggMCBzdGF0dXMgb24gU0lHVEVSTTsgYnojMTg3OQotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDQvMTMgMDQ6MDI6NDgKLSAgICAgW3NzaC1rZXlnZW4uMV0KLSAgICAgaW1wcm92ZSB3b3JkaW5nOyBieiMxODYxCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNC8xMyAwNDowOTozNwotICAgICBbc3NoLWtleWdlbi4xXQotICAgICBtZW50aW9uIHZhbGlkIC1iIHNpemVzIGZvciBFQ0RTQSBrZXlzOyBieiMxODYyCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNC8xNyAyMjo0Mjo0MgotICAgICBbUFJPVE9DT0wubXV4IGNsaWVudGxvb3AuYyBjbGllbnRsb29wLmggbXV4LmMgc3NoLjEgc3NoLmNdCi0gICAgIGFsbG93IGdyYWNlZnVsIHNodXRkb3duIG9mIG11bHRpcGxleGluZzogcmVxdWVzdCB0aGF0IGEgbXV4IHNlcnZlcgotICAgICByZW1vdmVzIGl0cyBsaXN0ZW5lciBzb2NrZXQgYW5kIHJlZnVzZSBmdXR1cmUgbXVsdGlwbGV4aW5nIHJlcXVlc3RzOwotICAgICBvayBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNC8xOCAwMDo0NjowNQotICAgICBbc3NoLWtleWdlbi5jXQotICAgICBjZXJ0aWZpY2F0ZSBvcHRpb25zIGFyZSBzdXBwb3NlZCB0byBiZSBwYWNrZWQgaW4gbGV4aWNhbCBvcmRlciBvZgotICAgICBvcHRpb24gbmFtZSAodGhvdWdoIHdlIGRvbid0IGFjdHVhbGx5IGVuZm9yY2UgdGhpcyBhdCBwcmVzZW50KS4KLSAgICAgTW92ZSBvbmUgdXAgdGhhdCB3YXMgb3V0IG9mIHNlcXVlbmNlCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wNS8wNCAyMToxNToyOQotICAgICBbYXV0aGZpbGUuYyBhdXRoZmlsZS5oIHNzaC1hZGQuY10KLSAgICAgYWxsb3cgInNzaC1hZGQgLSA8IGtleSI7IGZlZWRiYWNrIGFuZCBvayBtYXJrdXNACi0gLSAodGltKSBbY29uZmlndXJlLmFjXSBBZGQgQUNfTEFOR19TT1VSQ0UgdG8gT1BFTlNTSF9DSEVDS19DRkxBR19DT01QSUxFCi0gICBzbyBhdXRvcmVjb25mIDIuNjggaXMgaGFwcHkuCi0gLSAodGltKSBbZGVmaW5lcy5oXSBEZWFsIHdpdGggcGxhdGZvcm1zIHRoYXQgZG8gbm90IGhhdmUgU19JRlNPQ0sgb2sgZGptQAotCi0yMDExMDIyMQotIC0gKGR0dWNrZXIpIFtjb250cmliL2N5Z3dpbi9zc2gtaG9zdC1jb25maWddIEZyb20gQ29yaW5uYTogcmV2YW1wIG9mIHRoZQotICAgQ3lnd2luLXNwZWNpZmljIHNlcnZpY2UgaW5zdGFsbGVyIHNjcmlwdCBzc2gtaG9zdC1jb25maWcuICBUaGUgYWN0dWFsCi0gICBmdW5jdGlvbmFsaXR5IGlzIHRoZSBzYW1lLCB0aGUgcmV2aXNpdGVkIHZlcnNpb24gaXMganVzdCBtb3JlCi0gICBleGFjdCB3aGVuIGl0IGNvbWVzIHRvIGNoZWNrIGZvciBwcm9ibGVtcyB3aGljaCBkaXNhbGxvdyB0byBydW4KLSAgIGNlcnRhaW4gYXNwZWN0cyBvZiB0aGUgc2NyaXB0LiAgU28sIHBhcnQgb2YgdGhpcyBzY3JpcHQgYW5kIHRoZSBhbHNvCi0gICByZWFycmFuZ2VkIHNlcnZpY2UgaGVscGVyIHNjcmlwdCBsaWJyYXJ5ICJjc2loIiBpcyB0byBjaGVjayBpZiBhbGwKLSAgIHRoZSB0b29scyByZXF1aXJlZCB0byBydW4gdGhlIHNjcmlwdCBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0uCi0gICBUaGUgbmV3IHNjcmlwdCBhbHNvIGlzIG1vcmUgdGhvcm91Z2ggdG8gaW5mb3JtIHRoZSB1c2VyIHdoeSB0aGUKLSAgIHNjcmlwdCBmYWlsZWQuICBQYXRjaCBmcm9tIHZpbnNjaGVuIGF0IHJlZGhhdCBjb20uCi0KLTIwMTEwMjE4Ci0gLSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wMi8xNiAwMDozMToxNAotICAgICBbc3NoLWtleXNpZ24uY10KLSAgICAgbWFrZSBob3N0YmFzZWQgYXV0aCB3aXRoIEVDRFNBIGtleXMgd29yayBjb3JyZWN0bHkuIEJhc2VkIG9uIHBhdGNoCi0gICAgIGJ5IGhhcnZleS5lbmVtYW4gQVQgb3JhY2xlLmNvbSBpbiBieiMxODU4OyBvayBtYXJrdXNAIChwcmUtbG9jaykKLQotMjAxMTAyMDYKLSAtIChkdHVja2VyKSBbb3BlbmJzZC1jb21wYXQvcG9ydC1saW51eC5jXSBCdWcgIzE4NTE6IGZpeCBzeW50YXggZXJyb3IgaW4KLSAgIHNlbGludXggY29kZS4gIFBhdGNoIGZyb20gTGVvbmFyZG8gQ2hpcXVpdHRvIAotIC0gKGR0dWNrZXIpIFtjb250cmliL2N5Z3dpbi9zc2gte2hvc3QsdXNlcn0tY29uZmlnXSAgQWRkIEVDRFNBIGtleQotICAgZ2VuZXJhdGlvbiBhbmQgc2ltcGxpZnkuICBQYXRjaCBmcm9tIENvcmlubmEgVmluc2NoZW4uCi0KLTIwMTEwMjA0Ci0gLSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wMS8zMSAyMTo0MjoxNQotICAgICBbUFJPVE9DT0wubXV4XQotICAgICBjdXQnbidwYXN0bzsgZnJvbSBiZXJ0Lndlc2FyZyBBVCBnb29nbGVtYWlsLmNvbQotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDIvMDQgMDA6NDQ6MjEKLSAgICAgW2tleS5jXQotICAgICBmaXggdW5pbml0aWFsaXNlZCBub25jZSB2YXJpYWJsZTsgcmVwb3J0ZWQgYnkgTWF0ZXVzeiBLb2NpZWxza2kKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAyLzA0IDAwOjQ0OjQzCi0gICAgIFt2ZXJzaW9uLmhdCi0gICAgIG9wZW5zc2gtNS44Ci0gLSAoZGptKSBbUkVBRE1FIGNvbnRyaWIvY2FsZGVyYS9vcGVuc3NoLnNwZWMgY29udHJpYi9yZWRoYXQvb3BlbnNzaC5zcGVjXQotICAgW2NvbnRyaWIvc3VzZS9vcGVuc3NoLnNwZWNdIHVwZGF0ZSB2ZXJzaW9ucyBpbiBkb2NzIGFuZCBzcGVjIGZpbGVzLgotIC0gUmVsZWFzZSBPcGVuU1NIIDUuOHAxCi0KLTIwMTEwMTI4Ci0gLSAoZGptKSBbb3BlbmJzZC1jb21wYXQvcG9ydC1saW51eC5jXSBDaGVjayB3aGV0aGVyIFNFTGludXggaXMgZW5hYmxlZAotICAgYmVmb3JlIGF0dGVtcHRpbmcgc2V0ZnNjcmVhdGVjb24oKS4gQ2hlY2sgd2hldGhlciBtYXRjaHBhdGhjb24oKQotICAgc3VjY2VlZGVkIGJlZm9yZSB1c2luZyBpdHMgcmVzdWx0LiBQYXRjaCBmcm9tIGNqd2F0c29uIEFUIGRlYmlhbi5vcmc7Ci0gICBieiMxODUxCi0KLTIwMTEwMTI3Ci0gLSAodGltKSBbY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWJdIFN5bmMgd2l0aCB1cHN0cmVhbS4KLSAtICh0aW0pIFtjb25maWd1cmUuYWNdIENvbnNpc3RlbnQgTTQgcXVvdGluZyB0aHJvdWdob3V0LCB1cGRhdGVkIG9ic29sZXRlCi0gICBBQ19UUllfQ09NUElMRSB3aXRoIEFDX0NPTVBJTEVfSUZFTFNFLCB1cGRhdGVkIG9ic29sZXRlIEFDX1RSWV9MSU5LIHdpdGgKLSAgIEFDX0xJTktfSUZFTFNFLCB1cGRhdGVkIG9ic29sZXRlIEFDX1RSWV9SVU4gd2l0aCBBQ19SVU5fSUZFTFNFLCBtaXNjIHdoaXRlCi0gICBzcGFjZSBjaGFuZ2VzIGZvciBjb25zaXN0ZW5jeS9yZWFkYWJpbGl0eS4gTWFrZXMgYXV0b2NvbmYgMi42OCBoYXBweS4KLSAgICJOaWNlIHdvcmsiIGRqbQotCi0yMDExMDEyNQotIC0gKGRqbSkgW2NvbmZpZ3VyZS5hYyBNYWtlZmlsZS5pbiBzc2guYyBvcGVuYnNkLWNvbXBhdC9wb3J0LWxpbnV4LmMKLSAgIG9wZW5ic2QtY29tcGF0L3BvcnQtbGludXguaF0gTW92ZSBTRUxpbnV4LXNwZWNpZmljIGNvZGUgZnJvbSBzc2guYyB0bwotICAgcG9ydC1saW51eC5jIHRvIGF2b2lkIGNvbXBpbGF0aW9uIGVycm9ycy4gQWRkIC1sc2VsaW51eCB0byBzc2ggd2hlbgotICAgYnVpbGRpbmcgd2l0aCBTRUxpbnV4IHN1cHBvcnQgdG8gYXZvaWQgbGlua2luZyBmYWlsdXJlOyByZXBvcnQgZnJvbQotICAgYW1rIEFUIHNwYW1mZW5jZS5uZXQ7IG9rIGR0dWNrZXIKLQotMjAxMTAxMjIKLSAtIChkdHVja2VyKSBbY29uZmlndXJlLmFjIG9wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LntjLGh9XSBBZGQKLSAgIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSBmb3IgdGhlIGJlbmVmaXQgb2Ygb3BlbnNzbCB2ZXJzaW9ucyB0aGF0IGRvbid0Ci0gICBoYXZlIGl0IChhdCBsZWFzdCBvcGVuc3NsLWVuZ2luZS0wLjkuNmIpLiAgRm91bmQgYW5kIHRlc3RlZCBieSBLZXZpbiBCcm90dCwKLSAgIG9rIGRqbUAuCi0gLSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wMS8yMiAwOToxODo1MwotICAgICBbdmVyc2lvbi5oXQotICAgICBjcmFuayB0byBPcGVuU1NILTUuNwotIC0gKGRqbSkgW1JFQURNRSBjb250cmliL2NhbGRlcmEvb3BlbnNzaC5zcGVjIGNvbnRyaWIvcmVkaGF0L29wZW5zc2guc3BlY10KLSAgIFtjb250cmliL3N1c2Uvb3BlbnNzaC5zcGVjXSB1cGRhdGUgdmVyc2lvbnMgaW4gZG9jcyBhbmQgc3BlYyBmaWxlcy4KLSAtIChkam0pIFJlbGVhc2UgNS43cDEKLQotMjAxMTAxMTkKLSAtICh0aW0pIFtjb250cmliL2NhbGRlcmEvb3BlbnNzaC5zcGVjXSBVc2UgQ0ZMQUdTIGZyb20gTWFrZWZpbGUgaW5zdGVhZAotICAgb2YgUlBNIHNvIGJ1aWxkIGNvbXBsZXRlcy4gU2lnbmF0dXJlcyB3ZXJlIGNoYW5nZWQgdG8gLmFzYyBzaW5jZSA0LjFwMS4KLSAtIChkam0pIFtjb25maWd1cmUuYWNdIERpc2FibGUgRUNDIG9uIE9wZW5TU0wgPDAuOS44Zy4gUmVsZWFzZXMgcHJpb3IgdG8KLSAgIDAuOS44IGxhY2tlZCBpdCwgYW5kIDAuOS44YSB0aHJvdWdoIDAuOS44ZCBoYXZlIHByb3ZlbiBidWdneSBpbiBwcmUtCi0gICByZWxlYXNlIHRlc3RpbmcgKHJhbmRvbSBjcmFzaGVzIGFuZCBmYWlsdXJlIHRvIGxvYWQgRUNDIGtleXMpLgotICAgb2sgZHR1Y2tlckAKLQotMjAxMTAxMTcKLSAtIChkam0pIFtyZWdyZXNzL01ha2VmaWxlXSB1c2UgJFRFU1RfU1NIX0tFWUdFTiBpbnN0ZWFkIG9mIHRoZSBvbmUgaW4KLSAgICRQQVRILCBmaXggY2xlYW51cCBvZiBkcm9wcGluZ3M7IHJlcG9ydGVkIGJ5IG9wZW5zc2ggQVQKLSAgIHJvdW1lbnBldHJvdi5pbmZvOyBvayBkdHVja2VyQAotIC0gKGRqbSkgW3JlZ3Jlc3MvYWdlbnQtcHRyYWNlLnNoXSBGaXggZmFsc2UgZmFpbHVyZSBvbiBPUyBYIGJ5IGFkZGluZwotICAgaXRzIHVuaXF1ZSBzbm93Zmxha2Ugb2YgYSBnZGIgZXJyb3IgdG8gdGhlIG9uZXMgd2UgbG9vayBmb3IuCi0gLSAoZGptKSBbcmVncmVzcy9hZ2VudC1nZXRwZWVyZWlkLnNoXSBsZWF2ZSBzdGRvdXQgYXR0YWNoZWQgd2hlbiBydW5uaW5nCi0gICBzc2gtYWRkIHRvIGF2b2lkICRTVURPIGZhaWx1cmVzIG9uIExpbnV4Ci0gLSAoZHR1Y2tlcikgW29wZW5ic2QtY29tcGF0L3BvcnQtbGludXguY10gQnVnICMxODM4OiBBZGQgc3VwcG9ydCBmb3IgdGhlIG5ldwotICAgTGludXggT09NLWtpbGxlciBtYWdpYyB2YWx1ZXMgdGhhdCBjaGFuZ2VkIGluIDIuNi4zNiBrZXJuZWxzLCB3aXRoIGZhbGxiYWNrCi0gICB0byB0aGUgb2xkIHZhbHVlcy4gIEZlZWRiYWNrIGZyb20gdmFwaWVyIGF0IGdlbnRvbyBvcmcgYW5kIGRqbSwgb2sgZGptLgotIC0gKGRqbSkgW2NvbmZpZ3VyZS5hYyByZWdyZXNzL2FnZW50LWdldHBlZXJlaWQuc2ggcmVncmVzcy9tdWx0aXBsZXguc2hdCi0gICBbcmVncmVzcy9zZnRwLWdsb2Iuc2ggcmVncmVzcy90ZXN0LWV4ZWMuc2hdIFJld29yayBob3cgZmVhdHVyZSB0ZXN0cyBhcmUKLSAgIGRpc2FibGVkIG9uIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZW07IGFkZCBhICJjb25maWdfZGVmaW5lZCgpIgotICAgc2hlbGwgZnVuY3Rpb24gdGhhdCBncmVwcyBmb3IgZGVmaW5lcyBpbiBjb25maWcuaCBhbmQgdXNlIHRoZW0gdG8gZGVjaWRlCi0gICBvbiBmZWF0dXJlIHRlc3RzLgotICAgQ29udmVydCBhIGNvdXBsZSBvZiBleGlzdGluZyBncmVwJ3Mgb3ZlciBjb25maWcuaCB0byB1c2UgdGhlIG5ldyBmdW5jdGlvbgotICAgQWRkIGEgZGVmaW5lICJGSUxFU1lTVEVNX05PX0JBQ0tTTEFTSCIgZm9yIGZpbGVzeXN0ZW0gdGhhdCBjYW4ndCByZXByZXNlbnQKLSAgIGJhY2tzbGFzaCBjaGFyYWN0ZXJzIGluIGZpbGVuYW1lcywgZW5hYmxlIGl0IGZvciBDeWd3aW4gYW5kIHVzZSBpdCB0byB0dXJuCi0gICBvZiB0ZXN0cyBmb3IgcXVvdGVzIGJhY2tzbGFzaGVzIGluIHNmdHAtZ2xvYi5zaC4KLSAgIGJhc2VkIG9uIGRpc2N1c3Npb24gd2l0aCB2aW5zY2hlbiBBVCByZWRoYXQuY29tIGFuZCBkdHVja2VyQDsgb2sgZHR1Y2tlckAKLSAtICh0aW0pIFtyZWdyZXNzL2FnZW50LWdldHBlZXJlaWQuc2hdIHNoZWxsIHBvcnRhYmlsaXR5IGZpeC4KLSAtIChkdHVja2VyKSBbb3BlbmJzZC1jb21wYXQvcG9ydC1saW51eC5jXSBGaXggbWlub3IgYnVnIGNhdWdodCBieSAtV2Vycm9yIG9uCi0gICB0aGUgdGluZGVyYm94LgotIC0gKGR0dWNrZXIpIFtMSUNFTkNFIE1ha2VmaWxlLmluIGF1ZGl0LWJzbS5jIGF1ZGl0LWxpbnV4LmMgYXVkaXQuYyBhdWRpdC5oCi0gICBjb25maWd1cmUuYWMgZGVmaW5lcy5oIGxvZ2lucmVjLmNdICBCdWcgIzE0MDI6IGFkZCBsaW51eCBhdWRpdCBzdWJzeXN0ZW0KLSAgIHN1cHBvcnQsIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBUb21hcyBNcmF6IGFuZCBqY2hhZGltYSBhdCByZWRoYXQuCi0KLTIwMTEwMTE2Ci0gLSAoZHR1Y2tlcikgW01ha2VmaWxlLmluIGNvbmZpZ3VyZS5hYyByZWdyZXNzL2tleHR5cGUuc2hdIFNraXAgc2hhMjU2LWJhc2VkCi0gICBvbiBjb25maWd1cmF0aW9ucyB0aGF0IGRvbid0IGhhdmUgaXQuCi0gLSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wMS8xNiAxMTo1MDowNQotICAgICBbY2xpZW50bG9vcC5jXQotICAgICBVc2UgYXRvbWljaW8gd2hlbiBmbHVzaGluZyBwcm90b2NvbCAxIHN0ZHtvdXQsZXJyfSBidWZmZXJzIGF0Ci0gICAgIHNlc3Npb24gY2xvc2UuIFRoaXMgd2FzIGEgbGF0ZW50IGJ1ZyBleHBvc2VkIGJ5IHNldHRpbmcgYSBTSUdDSExECi0gICAgIGhhbmRsZXIgYW5kIHNwb3R0ZWQgYnkga2V2aW4uYnJvdHQgQVQgZ21haWwuY29tOyBvayBkdHVja2VyQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDEvMTYgMTE6NTA6MzYKLSAgICAgW3NzaGNvbm5lY3QuY10KLSAgICAgcmVzZXQgdGhlIFNJR1BJUEUgaGFuZGxlciB3aGVuIGZvcmtpbmcgdG8gZXhlY3V0ZSBjaGlsZCBwcm9jZXNzZXM7Ci0gICAgIG9rIGR0dWNrZXJACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wMS8xNiAxMjowNTo1OQotICAgICBbY2xpZW50bG9vcC5jXQotICAgICBhIGNvdXBsZSBtb3JlIHR3ZWFrcyB0byB0aGUgcG9zdC1jbG9zZSBwcm90b2NvbCAxIHN0ZGVyci9zdGRvdXQgZmx1c2g6Ci0gICAgIG5vdyB0aGF0IHdlIHVzZSBhdG9taWNpbygpLCBjb252ZXJ0IHRoZW0gZnJvbSB3aGlsZSBsb29wcyB0byBpZiBzdGF0ZW1lbnRzCi0gICAgIGFkZCB0ZXN0IGFuZCBjYXN0IHRvIGNvbXBpbGUgY2xlYW5seSB3aXRoIC1Xc2lnbmVkCi0KLTIwMTEwMTE0Ci0gLSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wMS8xMyAyMTo1NDo1MwotICAgICBbbXV4LmNdCi0gICAgIGNvcnJlY3QgZXJyb3IgbWVzc2FnZXM7IHBhdGNoIGZyb20gYmVydC53ZXNhcmcgQVQgZ29vZ2xlbWFpbC5jb20KLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAxLzEzIDIxOjU1OjI1Ci0gICAgIFtQUk9UT0NPTC5tdXhdCi0gICAgIGNvcnJlY3QgcHJvdG9jb2wgbmFtZXMgYW5kIGFkZCBhIGNvdXBsZSBvZiBtaXNzaW5nIHByb3RvY29sIG51bWJlcgotICAgICBkZWZpbmVzOyBwYXRjaCBmcm9tIGJlcnQud2VzYXJnIEFUIGdvb2dsZW1haWwuY29tCi0gLSAoZGptKSBbTWFrZWZpbGUuaW5dIFVzZSBzaGVsbCB0ZXN0IHRvIGRpc2FibGUgZWNkc2Ega2V5IGdlbmVyYXRpbmcgaW4KLSAgIGhvc3Qta2V5LWZvcmNlIHRhcmdldCByYXRoZXIgdGhhbiBhIHN1YnN0aXR1dGlvbiB0aGF0IGlzIHJlcGxhY2VkIHdpdGggYQotICAgY29tbWVudCBzbyB0aGF0IHRoZSBNYWtlZmlsZS5pbiBpcyBzdGlsbCBhIHN5bnRhY3RpY2FsbHkgdmFsaWQgTWFrZWZpbGUKLSAgICh1c2VmdWwgdG8gcnVuIHRoZSBkaXN0cHJlcCB0YXJnZXQpCi0gLSAodGltKSBbcmVncmVzcy9jZXJ0LWhvc3RrZXkuc2hdIFR5cG8uIE1pc3NpbmcgJCBvbiB2YXJpYWJsZSBuYW1lLgotIC0gKHRpbSkgW3JlZ3Jlc3MvY2VydC1ob3N0a2V5LnNoXSBBZGQgbWlzc2luZyBURVNUX1NTSF9FQ0MgZ3VhcmQgYXJvdW5kIHNvbWUKLSAgIGVjZHNhIGJpdHMuCi0KLTIwMTEwMTEzCi0gLSAoZGptKSBbbWlzYy5jXSBpbmNsdWRlIHRpbWUuaCBmb3IgbmFub3NsZWVwKCkgcHJvdG90eXBlCi0gLSAodGltKSBbTWFrZWZpbGUuaW5dIHRlc3QgdGhlIEVDQyBiaXRzIGlmIHdlIGhhdmUgdGhlIGNhcGFiaWxpdHkuIG9rIGRqbQotIC0gKHRpbSkgW01ha2VmaWxlLmluIGNvbmZpZ3VyZS5hYyBvcGVuc3NoZC5pbml0LmluXSBBZGQgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZwotICAgZWNkc2Ega2V5cy4gb2sgZGptLgotIC0gKGRqbSkgW2VudHJvcHkuY10gY2FzdCBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIHRvIHVfbG9uZyB0byBhdm9pZAotICAgZ2NjIHdhcm5pbmcgb24gcGxhdGZvcm1zIHdoZXJlIGl0IGRlZmF1bHRzIHRvIGludAotIC0gKGRqbSkgW3JlZ3Jlc3MvTWFrZWZpbGVdIGFkZCBhIGZldyBtb3JlIGdlbmVyYXRlZCBmaWxlcyB0byB0aGUgY2xlYW4KLSAgIHRhcmdldAotIC0gKGRqbSkgW215cHJvcG9zYWwuaF0gRml4IHJldmVyc2VkIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgdGVzdCBhbmQgYmFkCi0gICAjZGVmaW5lIHRoYXQgd2FzIGNhdXNpbmcgZGlmZmllLWhlbGxtYW4tZ3JvdXAtZXhjaGFuZ2Utc2hhMjU2IHRvIGJlCi0gICBpbmNvcnJlY3RseSBkaXNhYmxlZAotIC0gKGRqbSkgW3JlZ3Jlc3Mva2V4dHlwZS5zaF0gVGVzdGluZyBkaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGEyNTYKLSAgIHNob3VsZCBub3QgZGVwZW5kIG9uIEVDQyBzdXBwb3J0Ci0KLTIwMTEwMTEyCi0gLSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIG5pY21AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTAvMDggMjE6NDg6NDIKLSAgICAgW29wZW5ic2QtY29tcGF0L2dsb2IuY10KLSAgICAgRXh0ZW5kIEdMT0JfTElNSVQgdG8gY292ZXIgcmVhZGRpciBhbmQgc3RhdCBhbmQgYnVtcCB0aGUgbWFsbG9jIGxpbWl0Ci0gICAgIGZyb20gQVJHX01BWCB0byA2NEsuCi0gICAgIEZpeGVzIGdsb2ItdXNpbmcgcHJvZ3JhbXMgKG5vdGFibHkgZnRwKSBhYmxlIHRvIGJlIHRyaWdnZXJlZCB0byBoaXQKLSAgICAgcmVzb3VyY2UgbGltaXRzLgotICAgICBJZGVhIGZyb20gYSBzaW1pbGFyIE5ldEJTRCBjaGFuZ2UsIG9yaWdpbmFsIHByb2JsZW0gcmVwb3J0ZWQgYnkgamFzcGVyQC4KLSAgICAgb2sgbWlsbGVydCB0ZWR1IGphc3BlcgotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDEvMTIgMDE6NTM6MTQKLSAgICAgYXZvaWQgc29tZSBpbnRlZ2VyIG92ZXJmbG93cyBtb3N0bHkgd2l0aCBHTE9CX0FQUEVORCBhbmQgR0xPQl9ET09GRlMKLSAgICAgYW5kIHNhbml0eSBjaGVjayBhcmd1bWVudHMgKHRoZXNlIHdpbGwgYmUgdW5uZWNlc3Nhcnkgd2hlbiB3ZSBzd2l0Y2gKLSAgICAgc3RydWN0IGdsb2IgbWVtYmVycyBmcm9tIGJlaW5nIHR5cGUgaW50byB0byBzaXplX3QgaW4gdGhlIGZ1dHVyZSk7Ci0gICAgICJsb29rcyBvayIgdGVkdUAgZmVlZGJhY2sgZ3VlbnRoZXJACi0gLSAoZGptKSBbY29uZmlndXJlLmFjXSBUdXJuIG9uIC1Xbm8tdW51c2VkLXJlc3VsdCBmb3IgZ2NjID49IDQuNCB0byBhdm9pZAotICAgc2lsbHkgd2FybmluZ3Mgb24gd3JpdGUoKSBjYWxscyB3ZSBkb24ndCBjYXJlIHN1Y2NlZWQgb3Igbm90LgotIC0gKGRqbSkgW2NvbmZpZ3VyZS5hY10gRml4IGJyb2tlbiB0ZXN0IGZvciBnY2MgPj0gNC40IHdpdGggcGVyLWNvbXBpbGVyCi0gICBmbGFnIHRlc3RzIHRoYXQgZG9uJ3QgZGVwZW5kIG9uIGdjYyB2ZXJzaW9uIGF0IGFsbDsgc3VnZ2VzdGVkIGJ5IGFuZAotICAgb2sgZHR1Y2tlckAKLQotMjAxMTAxMTEKLSAtICh0aW0pIFtyZWdyZXNzL2hvc3QtZXhwYW5kLnNoXSBGaXggZm9yIGJ1aWxkaW5nIG91dHNpZGUgb2YgcmVhZCBvbmx5Ci0gICBzb3VyY2UgdHJlZS4KLSAtIChkam0pIFtwbGF0Zm9ybS5jXSBTb21lIG1pc3NpbmcgaW5jbHVkZXMgdGhhdCBzaG93IHVwIHVuZGVyIC1XZXJyb3IKLSAtIE9wZW5CU0QgQ1ZTIFN5bmMKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAxLzA4IDEwOjUxOjUxCi0gICAgIFtjbGllbnRsb29wLmNdCi0gICAgIHVzZSBob3N0IGFuZCBub3Qgb3B0aW9ucy5ob3N0bmFtZSwgYXMgdGhlIGxhdHRlciBtYXkgaGF2ZSB1bmVzY2FwZWQKLSAgICAgc3Vic3RpdHV0aW9uIGNoYXJhY3RlcnMKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAxLzExIDA2OjA2OjA5Ci0gICAgIFtzc2hsb2dpbi5jXQotICAgICBmZCBsZWFrIG9uIGVycm9yIHBhdGhzOyBmcm9tIHppbm92aWtACi0gICAgIE5CLiBJZCBzeW5jIG9ubHk7IHdlIHVzZSBsb2dpbnJlYy5jIHRoYXQgd2FzIGFsc28gYXVkaXRlZCBhbmQgZml4ZWQKLSAgICAgcmVjZW50bHkKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAxLzExIDA2OjEzOjEwCi0gICAgIFtjbGllbnRsb29wLmMgc3NoLWtleWdlbi5jIHNzaGQuY10KLSAgICAgc29tZSB1bnNpZ25lZCBsb25nIGxvbmcgY2FzdHMgdGhhdCBtYWtlIHRoaW5ncyBhIGJpdCBlYXNpZXIgZm9yCi0gICAgIHBvcnRhYmxlIHdpdGhvdXQgcmVzb3J0aW5nIHRvIGRyb3BwaW5nIFBSSXU2NCBmb3JtYXRzIGV2ZXJ5d2hlcmUKLQotMjAxMTAxMDkKLSAtIChkam0pIFtNYWtlZmlsZS5pbl0gbGlzdCBzc2hfaG9zdF9lY2RzYSBrZXkgaW4gUEFUSFNVQlM7IHNwb3R0ZWQgYnkKLSAgIG9wZW5zc2ggQVQgcm91bWVucGV0cm92LmluZm8KLQotMjAxMTAxMDgKLSAtIChkam0pIFtyZWdyZXNzL2tleXR5cGUuc2hdIHMvZWNobyAtbi9lY2hvbi8gdG8gcmVwYWlyIGZhaWxpbmcgcmVncmVzcwotICAgdGVzdCBvbiBPU1ggYW5kIG90aGVycy4gUmVwb3J0ZWQgYnkgaW1vcmdhbiBBVCBuYXMubmFzYS5nb3YKLQotMjAxMTAxMDcKLSAtIChkam0pIFtyZWdyZXNzL2NlcnQtaG9zdGtleS5zaCByZWdyZXNzL2NlcnQtdXNlcmtleS5zaF0gZml4IHNoZWxsIHRlc3QKLSAgIGZvciBuby1FQ0MgY2FzZS4gUGF0Y2ggZnJvbSBjcmlzdGlhbi5pb25lc2N1LWlkYm9ocm4gQVQgYXhpcy5jb20KLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAxLzA2IDIyOjIzOjUzCi0gICAgIFtzc2guY10KLSAgICAgdW5icmVhayAlbiBleHBhbnNpb24gaW4gTG9jYWxDb21tYW5kOyBwYXRjaCBmcm9tIGJlcnQud2VzYXJnIEFUCi0gICAgIGdvb2dsZW1haWwuY29tOyBvayBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMS8wMS8wNiAyMjoyMzowMgotICAgICBbY2xpZW50bG9vcC5jXQotICAgICB3aGVuIGV4aXRpbmcgZHVlIHRvIFNlcnZlckFsaXZlVGltZW91dCwgbWVudGlvbiB0aGUgaG9zdG5hbWUgdGhhdCBjYXVzZWQKLSAgICAgaXQgKHVzZWZ1bCB3aXRoIGJhY2tncm91bmRlZCBjb250cm9sbWFzdGVyKQotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDEvMDYgMjI6NDY6MjEKLSAgICAgW3JlZ3Jlc3MvTWFrZWZpbGUgcmVncmVzcy9ob3N0LWV4cGFuZC5zaF0KLSAgICAgcmVncmVzcyB0ZXN0IGZvciBMb2NhbENvbW1hbmQgJW4gZXhwYW5zaW9uIGZyb20gYmVydC53ZXNhcmcgQVQKLSAgICAgZ29vZ2xlbWFpbC5jb207IG9rIG1hcmt1c0AKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDExLzAxLzA2IDIzOjAxOjM1Ci0gICAgIFtzc2hjb25uZWN0LmNdCi0gICAgIHJlc2V0IFNJR0NITEQgaGFuZGxlciB0byBTSUdfREZMIHdoZW4gZXhlY3VyaW5nIExvY2FsQ29tbWFuZDsKLSAgICAgb2sgbWFya3VzQAotCi0yMDExMDEwNgotIC0gKGRqbSkgT3BlbkJTRCBDVlMgU3luYwotICAgLSBtYXJrdXNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTIvMDggMjI6NDY6MDMKLSAgICAgW3NjcC4xIHNjcC5jXQotICAgICBhZGQgYSBuZXcgLTMgb3B0aW9uIHRvIHNjcDogQ29waWVzIGJldHdlZW4gdHdvIHJlbW90ZSBob3N0cyBhcmUKLSAgICAgdHJhbnNmZXJyZWQgdGhyb3VnaCB0aGUgbG9jYWwgaG9zdC4gIFdpdGhvdXQgdGhpcyBvcHRpb24gdGhlIGRhdGEKLSAgICAgaXMgY29waWVkIGRpcmVjdGx5IGJldHdlZW4gdGhlIHR3byByZW1vdGUgaG9zdHMuIG9rIGRqbUAgKGJ1Z3ppbGxhICMxODM3KQotICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTIvMDkgMTQ6MTM6MzMKLSAgICAgW3NjcC4xIHNjcC5jXQotICAgICBzY3AuMTogZ3JhbW1lciBmaXgKLSAgICAgc2NwLmM6IGFkZCAtMyB0byB1c2FnZSgpCi0gICAtIG1hcmt1c0BjdnMub3BlbmJzZC5vcmcgMjAxMC8xMi8xNCAxMTo1OTowNgotICAgICBbc3NoY29ubmVjdC5jXQotICAgICBkb24ndCBtZW50aW9uIGtleSB0eXBlIGluIGtleS1jaGFuZ2VkLXdhcm5pbmcsIHNpbmNlIHdlIGFsc28gcHJpbnQKLSAgICAgdGhpcyB3YXJuaW5nIGlmIGEgbmV3IGtleSB0eXBlIGFwcGVhcnMuIG9rIGRqbUAKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzEyLzE1IDAwOjQ5OjI3Ci0gICAgIFtyZWFkcGFzcy5jXQotICAgICBmaXggQ29udHJvbE1hc3Rlcj1hc2sgcmVncmVzc2lvbgotICAgICByZXNldCBTSUdDSExEIGhhbmRsZXIgYmVmb3JlIGZvcmsgKGFuZCByZXN0b3JlIGl0IGFmdGVyKSBzbyB3ZSBkb24ndCBtaXNzCi0gICAgIHRoZSB0aGUgYXNrcGFzcyBjaGlsZCdzIGV4aXQgc3RhdHVzLiBDb3JyZWN0IHRlc3QgZm9yIGV4aXQgc3RhdHVzL3NpZ25hbCB0bwotICAgICBhY2NvdW50IGZvciB3YWl0cGlkKCkgZmFpbHVyZTsgd2l0aCBjbGF1ZGlvQCBvayBjbGF1ZGlvQCBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMi8yNCAyMTo0MTo0OAotICAgICBbYXV0aC1vcHRpb25zLmNdCi0gICAgIGRvbid0IHNlbmQgdGhlIGFjdHVhbCBmb3JjZWQgY29tbWFuZCBpbiBhIGRlYnVnIG1lc3NhZ2U7IG9rIG1hcmt1cyBkZXJhYWR0Ci0gICAtIG90dG9AY3ZzLm9wZW5ic2Qub3JnIDIwMTEvMDEvMDQgMjA6NDQ6MTMKLSAgICAgW3NzaC1rZXlzY2FuLmNdCi0gICAgIGhhbmRsZSBlY2RzYS1zaGEyIHdpdGggdmFyaW91cyBrZXkgbGVuZ3RoczsgaGludCBhbmQgb2sgZGptQAotCi0yMDExMDEwNAotIC0gKGRqbSkgW2NvbmZpZ3VyZS5hYyBNYWtlZmlsZS5pbl0gVXNlIG1hbmRvYyBhcyBwcmVmZXJyZWQgbWFucGFnZQotICAgZm9ybWF0dGVyIGlmIGl0IGlzIHByZXNlbnQsIGZvbGxvd2VkIGJ5IG5yb2ZmIGFuZCBncm9mZiByZXNwZWN0aXZlbHkuCi0gICBGaXhlcyBkaXN0cHJlcCB0YXJnZXQgb24gT3BlbkJTRCAod2hpY2ggaGFzIGJ1bXBlZCBncm9mZi9ucm9mZiB0byBwb3J0cwotICAgaW4gZmF2b3VyIG9mIG1hbmRvYykuIGZlZWRiYWNrIGFuZCBvayB0aW0KLQotMjAxMTAxMDMKLSAtIChkam0pIFtNYWtlZmlsZS5pbl0gcmV2ZXJ0IGxvY2FsIGhhY2sgSSBkaWRuJ3QgaW50ZW5kIHRvIGNvbW1pdAotCi0yMDExMDEwMgotIC0gKGRqbSkgW2xvZ2lucmVjLmNdIEZpeCBzb21lIGZkIGxlYWtzIG9uIGVycm9yIHBhdGhzLiBvayBkdHVja2VyCi0gLSAoZGptKSBbY29uZmlndXJlLmFjXSBDaGVjayB3aGV0aGVyIGxpYmRlcyBpcyBuZWVkZWQgd2hlbiBidWlsZGluZwotICAgd2l0aCBIZWltZGFsIGtyYjUgc3VwcG9ydC4gT24gT3BlbkJTRCB0aGlzIGxpYnJhcnkgbm8gbG9uZ2VyIGV4aXN0cywKLSAgIHNvIGxpbmtpbmcgaXQgdW5jb25kaXRpb25hbGx5IGNhdXNlcyBhIGJ1aWxkIGZhaWx1cmU7IG9rIGR0dWNrZXIKLQotMjAxMDEyMjYKLSAtIChkdHVja2VyKSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMi8wOCAwNDowMjo0NwotICAgICBbc3NoX2NvbmZpZy41IHNzaGRfY29uZmlnLjVdCi0gICAgIGV4cGxhaW4gdGhhdCBJUFFvUyBhcmd1bWVudHMgYXJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlOyBpaXJjIHJlcXVlc3RlZAotICAgICBieSBqbWNAIGEgd2hpbGUgYmFjawotCi0yMDEwMTIwNQotIC0gKGR0dWNrZXIpIG9wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmNdIHJlbW92ZSBzbGVlcCBsZWZ0b3ZlciBmcm9tCi0gICBkZWJ1Z2dpbmcuICBTcG90dGVkIGJ5IGRqbS4KLSAtIChkdHVja2VyKSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMi8wMyAyMzo0OToyNgotICAgICBbc2Nobm9yci5jXQotICAgICBjaGVjayB0aGF0IGdeeF5xID09PSAxIG1vZCBwOyByZWNvbW1lbmRlZCBieSBKUEFLRSBhdXRob3IgRmVuZyBIYW8KLSAgICAgKHRoaXMgY29kZSBpcyBzdGlsbCBkaXNhYmxlZCwgYnV0IGFwcHJlbnRseSBwZW9wbGUgYXJlIHRyZWF0aW5nIGl0IGFzCi0gICAgIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uKQotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTIvMDMgMjM6NTU6MjcKLSAgICAgW2F1dGgtcnNhLmNdCi0gICAgIG1vdmUgY2hlY2sgZm9yIHJldm9rZWQga2V5cyB0byBydW4gZWFybGllciAoaW4gYXV0aF9yc2Ffa2V5X2FsbG93ZWQpCi0gICAgIGJ6IzE4Mjk7IHBhdGNoIGZyb20gbGR2IEFUIGFsdGxpbnV4Lm9yZzsgb2sgbWFya3VzQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTIvMDQgMDA6MTg6MDEKLSAgICAgW3NmdHAtc2VydmVyLmMgc2Z0cC4xIHNmdHAtY2xpZW50Lmggc2Z0cC5jIFBST1RPQ09MIHNmdHAtY2xpZW50LmNdCi0gICAgIGFkZCBhIHByb3RvY29sIGV4dGVuc2lvbiB0byBzdXBwb3J0IGEgaGFyZCBsaW5rIG9wZXJhdGlvbi4gSXQgaXMKLSAgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlICJsbiIgY29tbWFuZCBpbiB0aGUgY2xpZW50LiBUaGUgb2xkICJsbiIKLSAgICAgYmVoYXZpb3VyIG9mIGNyZWF0aW5nIGEgc3ltbGluayBpcyBhdmFpbGFibGUgdXNpbmcgaXRzICItcyIgb3B0aW9uCi0gICAgIG9yIHRocm91Z2ggdGhlIHByZWV4aXN0aW5nICJzeW1saW5rIiBjb21tYW5kOyBiYXNlZCBvbiBhIHBhdGNoIGZyb20KLSAgICAgbWlrbG9zIEFUIHN6ZXJlZGkuaHUgaW4gYnojMTU1NTsgb2sgbWFya3VzQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTIvMDQgMTM6MzE6MzcKLSAgICAgW2hvc3RmaWxlLmNdCi0gICAgIGZpeCBmZCBsZWFrOyBzcG90dGVkIGFuZCBvayBkdHVja2VyCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMi8wNCAwMDoyMToxOQotICAgICBbcmVncmVzcy9zZnRwLWNtZHMuc2hdCi0gICAgIGFkanVzdCBmb3IgaGFyZC1saW5rIHN1cHBvcnQKLSAtIChkdHVja2VyKSBbcmVncmVzcy9NYWtlZmlsZV0gSWQgc3luYy4KLQotMjAxMDEyMDQKLSAtIChkam0pIFtvcGVuYnNkLWNvbXBhdC9iaW5kcmVzdnBvcnQuY10gVXNlIGFyYzRyYW5kb21fdW5pZm9ybShyYW5nZSkKLSAgIGluc3RlYWQgb2YgKGFyYzRyYW5kb20oKSAlIHJhbmdlKQotIC0gKGR0dWNrZXIpIFtjb25maWd1cmUuYWMgbW9kdWxpLmMgb3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQue2MsaH1dICBBZGQKLSAgIHNoaW1zIGZvciB0aGUgbmV3LCBub24tZGVwcmVjYXRlZCBPcGVuU1NMIGtleSBnZW5lcmF0aW9uIGZ1bmN0aW9ucyBmb3IKLSAgIHBsYXRmb3JtcyB0aGF0IGRvbid0IGhhdmUgdGhlIG5ldyBpbnRlcmZhY2VzLgotCi0yMDEwMTIwMQotIC0gT3BlbkJTRCBDVlMgU3luYwotICAgLSBkZXJhYWR0QGN2cy5vcGVuYnNkLm9yZyAyMDEwLzExLzIwIDA1OjEyOjM4Ci0gICAgIFthdXRoMi1wdWJrZXkuY10KLSAgICAgY2xlYW4gdXAgY2FzZXMgb2YgOzsKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzExLzIxIDAxOjAxOjEzCi0gICAgIFtjbGllbnRsb29wLmMgbWlzYy5jIG1pc2MuaCBzc2gtYWdlbnQuMSBzc2gtYWdlbnQuY10KLSAgICAgaG9ub3VyICRUTVBESVIgZm9yIGNsaWVudCB4YXV0aCBhbmQgc3NoLWFnZW50IHRlbXBvcmFyeSBkaXJlY3RvcmllczsKLSAgICAgZmVlZGJhY2sgYW5kIG9rIG1hcmt1c0AKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzExLzIxIDEwOjU3OjA3Ci0gICAgIFthdXRoZmlsZS5jXQotICAgICBSZWZhY3RvciBpbnRlcm5hbHMgb2YgcHJpdmF0ZSBrZXkgbG9hZGluZyBhbmQgc2F2aW5nIHRvIHdvcmsgb24gbWVtb3J5Ci0gICAgIGJ1ZmZlcnMgcmF0aGVyIHRoYW4gZGlyZWN0bHkgb24gZmlsZXMuIFRoaXMgd2lsbCBtYWtlIGEgZmV3IHRoaW5ncwotICAgICBlYXNpZXIgdG8gZG8gaW4gdGhlIGZ1dHVyZTsgb2sgbWFya3VzQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTEvMjMgMDI6MzU6NTAKLSAgICAgW2F1dGguY10KLSAgICAgdXNlIHN0cmljdF9tb2RlcyBhbHJlYWR5IHBhc3NlZCBhcyBmdW5jdGlvbiBhcmd1bWVudCBvdmVyIHJlZmVyZW5jaW5nCi0gICAgIGdsb2JhbCBvcHRpb25zLnN0cmljdF9tb2RlcwotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTEvMjMgMjM6NTc6MjQKLSAgICAgW2NsaWVudGxvb3AuY10KLSAgICAgYXZvaWQgTlVMTCBkZXJlZiBvbiByZWNlaXZpbmcgYSBjaGFubmVsIHJlcXVlc3Qgb24gYW4gdW5rbm93biBvciBpbnZhbGlkCi0gICAgIGNoYW5uZWw7IHJlcG9ydCBieiMxODQyIGZyb20gamNoYWRpbWEgQVQgcmVkaGF0LmNvbTsgb2sgZHR1Y2tlckAKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzExLzI0IDAxOjI0OjE0Ci0gICAgIFtjaGFubmVscy5jXQotICAgICByZW1vdmUgYSBkZWJ1ZygpIHRoYXQgcG9sbHV0ZXMgc3RkZXJyIG9uIGNsaWVudCBjb25uZWN0aW5nIHRvIGEgc2VydmVyCi0gICAgIGluIGRlYnVnIG1vZGUgKGNoYW5uZWxfY2xvc2VfZmRzIGlzIGNhbGxlZCB0cmFuc2l0aXZlbHkgZnJvbSB0aGUgc2Vzc2lvbgotICAgICBjb2RlIHBvc3QtZm9yayk7IGJ6IzE3MTksIG9rIGR0dWNrZXIKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzExLzI1IDA0OjEwOjA5Ci0gICAgIFtzZXNzaW9uLmNdCi0gICAgIHJlcGxhY2UgY2xvc2UoKSBsb29wIGZvciBmZHMgMy0+NjQgd2l0aCBjbG9zZWZyb20oKTsKLSAgICAgb2sgbWFya3VzIGRlcmFhZHQgZHR1Y2tlcgotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTEvMjYgMDU6NTI6NDkKLSAgICAgW3NjcC5jXQotICAgICBQYXNzIHRocm91Z2ggc3NoIGNvbW1hbmQtbGluZSBmbGFncyBhbmQgb3B0aW9ucyB3aGVuIGRvaW5nIHJlbW90ZS1yZW1vdGUKLSAgICAgdHJhbnNmZXJzLCBlLmcuIHRvIGVuYWJsZSBhZ2VudCBmb3J3YXJkaW5nIHdoaWNoIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwKLSAgICAgaW4gdGhpcyBjYXNlOyBieiMxODM3IG9rIGR0dWNrZXJACi0gICAtIG1hcmt1c0BjdnMub3BlbmJzZC5vcmcgMjAxMC8xMS8yOSAxODo1NzowNAotICAgICBbYXV0aGZpbGUuY10KLSAgICAgY29ycmVjdGx5IGxvYWQgY29tbWVudCBmb3IgZW5jcnlwdGVkIHJzYTEga2V5czsKLSAgICAgcmVwb3J0L2ZpeCBKb2FjaGltIFNjaGlwcGVyOyBvayBkam1ACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMS8yOSAyMzo0NTo1MQotICAgICBbYXV0aC5jIGhvc3RmaWxlLmMgaG9zdGZpbGUuaCBzc2guYyBzc2hfY29uZmlnLjUgc3NoY29ubmVjdC5jXQotICAgICBbc3NoY29ubmVjdC5oIHNzaGNvbm5lY3QyLmNdCi0gICAgIGF1dG9tYXRpY2FsbHkgb3JkZXIgdGhlIGhvc3RrZXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50IGJhc2VkIG9uCi0gICAgIHdoaWNoIGhvc3RrZXlzIGFyZSBhbHJlYWR5IHJlY29yZGVkIGluIGtub3duX2hvc3RzLiBUaGlzIGF2b2lkcwotICAgICBob3N0a2V5IHdhcm5pbmdzIHdoZW4gY29ubmVjdGluZyB0byBzZXJ2ZXJzIHdpdGggbmV3IEVDRFNBIGtleXMKLSAgICAgdGhhdCBhcmUgcHJlZmVycmVkIGJ5IGRlZmF1bHQ7IHdpdGggbWFya3VzQAotCi0yMDEwMTEyNAotIC0gKGR0dWNrZXIpIFtwbGF0Zm9ybS5jIHNlc3Npb24uY10gTW92ZSB0aGUgZ2V0bHVpZCBjYWxsIG91dCBvZiBzZXNzaW9uLmMgYW5kCi0gICBpbnRvIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb2RlICBPbmx5IGFmZmVjdHMgU0NPLCB0ZXN0ZWQgYnkgYW5kIG9rIHRpbUAuCi0gLSAoZGptKSBbbG9naW5yZWMuY10gUmVsYXggcGVybWlzc2lvbiByZXF1aXJlbWVudCBvbiBidG1wIGxvZ3MgdG8gYWxsb3cKLSAgIGdyb3VwIHJlYWQvd3JpdGUuIG9rIGR0dWNrZXJACi0gLSAoZHR1Y2tlcikgW3BhY2tldC5jXSBSZW1vdmUgcmVkdW5kYW50IGxvY2FsIGRlY2xhcmF0aW9uIG9mICJpbnQgdG9zIi4KLSAtIChkam0pIFtkZWZpbmVzLmhdIEFkZCBJUCBEU0NQIGRlZmluZXMKLQotMjAxMDExMjIKLSAtIChkdHVja2VyKSBCdWcgIzE4NDA6IGZpeCB3YXJuaW5nIHdoZW4gY29uZmlndXJpbmcgLS13aXRoLXNzbC1lbmdpbmUsIHBhdGNoCi0gICBmcm9tIHZhcGllciBhdCBnZW50b28gb3JnLgotCi0yMDEwMTEyMAotIC0gT3BlbkJTRCBDVlMgU3luYwotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTEvMDUgMDI6NDY6NDcKLSAgICAgW3BhY2tldC5jXQotICAgICB3aGl0ZXNwYWNlIEtORgotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTEvMTAgMDE6MzM6MDcKLSAgICAgW2tleGRoYy5jIGtleGRocy5jIGtleGdleGMuYyBrZXhnZXhzLmMga2V5LmMgbW9kdWxpLmNdCi0gICAgIHVzZSBvbmx5IGxpYmNyeXB0byBBUElzIHRoYXQgYXJlIHJldGFpbmVkIHdpdGggT1BFTlNTTF9OT19ERVBSRUNBVEVELgotICAgICB0aGVzZSBoYXZlIGJlZW4gYXJvdW5kIGZvciB5ZWFycyBieSB0aGlzIHRpbWUuIG9rIG1hcmt1cwotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTEvMTMgMjM6Mjc6NTEKLSAgICAgW2NsaWVudGxvb3AuYyBtaXNjLmMgbWlzYy5oIHBhY2tldC5jIHBhY2tldC5oIHJlYWRjb25mLmMgcmVhZGNvbmYuaF0KLSAgICAgW3NlcnZjb25mLmMgc2VydmNvbmYuaCBzZXNzaW9uLmMgc3NoLmMgc3NoX2NvbmZpZy41IHNzaGRfY29uZmlnLjVdCi0gICAgIGFsbG93IHNzaCBhbmQgc3NoZCB0byBzZXQgYXJiaXRyYXJ5IFRPUy9EU0NQL1FvUyB2YWx1ZXMgaW5zdGVhZCBvZgotICAgICBoYXJkY29kaW5nIGxvd2RlbGF5L3Rocm91Z2hwdXQuCi0gICAgIAotICAgICBieiMxNzMzIHBhdGNoIGZyb20gcGhpbGlwcCBBVCByZWRmaXNoLXNvbHV0aW9ucy5jb207IG9rIG1hcmt1c0AgZGVyYWFkdEAKLSAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzExLzE1IDA3OjQwOjE0Ci0gICAgIFtzc2hfY29uZmlnLjVdCi0gICAgIGxpYmFyeSAtPiBsaWJyYXJ5OwotICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTEvMTggMTU6MDE6MDAKLSAgICAgW3NjcC4xIHNmdHAuMSBzc2guMSBzc2hkX2NvbmZpZy41XQotICAgICBhZGQgSVBRb1MgdG8gdGhlIHZhcmlvdXMgLW8gbGlzdHMsIGFuZCB6YXAgc29tZSB0cmFpbGluZyB3aGl0ZXNwYWNlOwotCi0yMDEwMTExMQotIC0gKGRqbSkgW3NlcnZjb25mLmMgc3NoLWFkZC5jIHNzaC1rZXlnZW4uY10gZG9uJ3QgbG9vayBmb3IgRUNEU0Ega2V5cyBvbgotICAgcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBFQ0MuIEZpeGVzIHNvbWUgc3B1cmlvdXMgd2FybmluZ3MgcmVwb3J0ZWQKLSAgIGJ5IHRpbUAKLQotMjAxMDExMDkKLSAtICh0aW0pIFtyZWdyZXNzL2tleHR5cGUuc2hdIE5vdCBhbGwgcGxhdGZvcm1zIGhhdmUgdGltZSBpbiAvdXNyL2Jpbi4KLSAgIEZlZWRiYWNrIGZyb20gZHR1Y2tlckAKLSAtICh0aW0pIFtjb25maWd1cmUuYWMgb3BlbmJzZC1jb21wYXQvYnNkLW1pc2MuaCBvcGVuYnNkLWNvbXBhdC9ic2QtbWlzYy5jXSBBZGQKLSAgIHN1cHBvcnQgZm9yIHBsYXRmb3JtcyBtaXNzaW5nIGlzYmxhbmsoKS4gb2sgZGptQAotCi0yMDEwMTEwOAotIC0gKHRpbSkgW3JlZ3Jlc3MvTWFrZWZpbGVdIEZpeGVzIHRvIGFsbG93IGJ1aWxkaW5nL3Rlc3Rpbmcgb3V0c2lkZSBzb3VyY2UKLSAgIHRyZWUuCi0gLSAodGltKSBbcmVncmVzcy9rZXh0eXBlLnNoXSBTaGVsbCBwb3J0YWJpbGl0eSBmaXguCi0KLTIwMTAxMTA3Ci0gLSAoZHR1Y2tlcikgW3BsYXRmb3JtLmNdIGluY2x1ZGVzLmggaW5zdGVhZCBvZiBkZWZpbmVzLmggc28gdGhhdCB3ZSBnZXQKLSAgIHRoZSBjb3JyZWN0IHR5cGVkZWZzLgotCi0yMDEwMTEwNQotIC0gKGRqbSkgW2xvZ2lucmVjLmMgbG9naW5yZWMuaF0gVXNlIGNvcnJlY3QgdWlkX3QvcGlkX3QgdHlwZXMgaW5zdGVhZCBvZgotICAgaW50LiBTaG91bGQgZml4IGJ6IzE4MTcgY2xlYW5seTsgb2sgZHR1Y2tlckAKLSAtIE9wZW5CU0QgQ1ZTIFN5bmMKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzIyIDEyOjI2OjA1Ci0gICAgIFtyZWdyZXNzL01ha2VmaWxlIHJlZ3Jlc3Mva2V4dHlwZS5zaF0KLSAgICAgcmVncmVzcyB0ZXN0IGZvciBlYWNoIG9mIHRoZSBrZXkgZXhjaGFuZ2UgYWxnb3JpdGhtcyB0aGF0IHdlIHN1cHBvcnQKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzEwLzI4IDExOjIyOjA5Ci0gICAgIFthdXRoZmlsZS5jIGtleS5jIGtleS5oIHNzaC1rZXlnZW4uY10KLSAgICAgZml4IGEgcG9zc2libGUgTlVMTCBkZXJlZiBvbiBsb2FkaW5nIGEgY29ycnVwdCBFQ0RIIGtleQotICAgICAKLSAgICAgc3RvcmUgRUNESCBncm91cCBpbmZvcm1hdGlvbiBpbiBwcml2YXRlIGtleXMgZmlsZXMgYXMgIm5hbWVkIGdyb3VwcyIKLSAgICAgcmF0aGVyIHRoYW4gYXMgYSBzZXQgb2YgZXhwbGljaXQgZ3JvdXAgcGFyYW1ldGVycyAoYnkgc2V0dGluZwotICAgICB0aGUgT1BFTlNTTF9FQ19OQU1FRF9DVVJWRSBmbGFnKS4gVGhpcyBtYWtlcyBmb3Igc2hvcnRlciBrZXkgZmlsZXMgYW5kCi0gICAgIHJldHJpZXZlcyB0aGUgZ3JvdXAncyBPcGVuU1NMIE5JRCB0aGF0IHdlIG5lZWQgZm9yIHZhcmlvdXMgdGhpbmdzLgotICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTAvMjggMTg6MzM6MjgKLSAgICAgW3NjcC4xIHNzaC1hZGQuMSBzc2gta2V5Z2VuLjEgc3NoLjEgc3NoX2NvbmZpZy41IHNzaGQuOCBzc2hkX2NvbmZpZy41XQotICAgICBrbm9jayBvdXQgc29tZSAiLSotIG5yb2ZmIC0qLSIgbGluZXM7Ci0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMS8wNCAwMjo0NTozNAotICAgICBbc2Z0cC1zZXJ2ZXIuY10KLSAgICAgdW1hc2sgc2hvdWxkIGJlIHBhcnNlZCBhcyBvY3RhbC4gcmVwb3J0ZWQgYnkgY2FuZGxhbmQgQVQgeG1pc3Npb24uY29tOwotICAgICBvayBtYXJrdXNACi0gLSAoZHR1Y2tlcikgW2NvbmZpZ3VyZS5hYyBwbGF0Zm9ybS57YyxofSBzZXNzaW9uLmMKLSAgIG9wZW5ic2QtY29tcGF0L3BvcnQtc29sYXJpcy57YyxofV0gQnVnICMxODI0OiBBZGQgU29sYXJpcyBQcm9qZWN0IHN1cHBvcnQuCi0gICBQYXRjaCBmcm9tIGNvcnkuZXJpY2tzb24gYXQgY3N1IG1uc2N1IGVkdSB3aXRoIGEgYml0IG9mIHJld29yayBmcm9tIG1lLgotICAgb2sgZGptQAotIC0gKGR0dWNrZXIpIFtwbGF0Zm9ybS5jIHBsYXRmb3JtLmggc2Vzc2lvbi5jXSBBZGQgYSBwbGF0Zm9ybSBob29rIHRvIHJ1bgotICAgYWZ0ZXIgdGhlIHVzZXIncyBncm91cHMgYXJlIGVzdGFibGlzaGVkIGFuZCBtb3ZlIHRoZSBzZWxpbnV4IGNhbGxzIGludG8gaXQuCi0gLSAoZHR1Y2tlcikgW3BsYXRmb3JtLmMgc2Vzc2lvbi5jXSBNb3ZlIHRoZSBBSVggc2V0cGNyZWQrY2hyb290IGhhY2sgaW50bwotICAgcGxhdGZvcm0uYwotIC0gKGR0dWNrZXIpIFtwbGF0Zm9ybS5jIHNlc3Npb24uY10gTW92ZSB0aGUgQlNESSBzZXRwZ3JwIGludG8gcGxhdGZvcm0uYy4KLSAtIChkdHVja2VyKSBbcGxhdGZvcm0uY10gT25seSBjYWxsIHNldHBncnAgb24gQlNESSBpZiBydW5uaW5nIGFzIHJvb3QgdG8KLSAgIHJldGFpbiBwcmV2aW91cyBiZWhhdmlvci4KLSAtIChkdHVja2VyKSBbcGxhdGZvcm0uYyBzZXNzaW9uLmNdIE1vdmUgdGhlIFBBTSBjcmVkZW50aWFsIGVzdGFibGlzaG1lbnQgZm9yCi0gICB0aGUgTE9HSU5fQ0FQIGNhc2UgaW50byBwbGF0Zm9ybS5jLgotIC0gKGR0dWNrZXIpIHBsYXRmb3JtLmMgc2Vzc2lvbi5jXSBNb3ZlIHRoZSBVU0VfTElCSUFGIGZyYWdtZW50IGludG8KLSAgIHBsYXRmb3JtLmMKLSAtIChkdHVja2VyKSBbcGxhdGZvcm0uYyBzZXNzaW9uLmNdIE1vdmUgYWl4X3VzcmluZm8gZnJhbWVudCBpbnRvIHBsYXRmb3JtLmMuCi0gLSAoZHR1Y2tlcikgW3BsYXRmb3JtLmMgc2Vzc2lvbi5jXSBNb3ZlIGlyaXggc2V0dXNlcmNvbnRleHQgZnJhZ21lbnQgaW50bwotICAgcGxhdGZvcm0uYy4KLSAtIChkdHVja2VyKSBbcGxhdGZvcm0uYyBzZXNzaW9uLmNdIE1vdmUgUEFNIGNyZWRlbnRpYWwgZXN0YWJsaXNobWVudCBmb3IgdGhlCi0gICBub24tTE9HSU5fQ0FQIGNhc2UgaW50byBwbGF0Zm9ybS5jLgotIC0gKGR0dWNrZXIpIFtwbGF0Zm9ybS5jIHBsYXRmb3JtLmggc2Vzc2lvbi5jXSBNb3ZlIHRoZSBDeWd3aW4gc3BlY2lhbC1jYXNlCi0gICBjaGVjayBpbnRvIHBsYXRmb3JtLmMKLSAtIChkdHVja2VyKSBbcmVncmVzcy9rZXl0eXBlLnNoXSBJbXBvcnQgbmV3IHRlc3QuCi0gLSAoZHR1Y2tlcikgW01ha2VmaWxlIGNvbmZpZ3VyZS5hYyByZWdyZXNzL01ha2VmaWxlIHJlZ3Jlc3Mva2V5dHlwZS5zaF0KLSAgIEltcG9ydCByZWNlbnQgY2hhbmdlcyB0byByZWdyZXNzL01ha2VmaWxlLCBwYXNzIGEgZmxhZyB0byBlbmFibGUgRUNDIHRlc3RzCi0gICBmcm9tIGNvbmZpZ3VyZSB0aHJvdWdoIHRvIHJlZ3Jlc3MvTWFrZWZpbGUgYW5kIHVzZSBpdCBpbiB0aGUgdGVzdHMuCi0gLSAoZHR1Y2tlcikgW3JlZ3Jlc3Mva2V4dHlwZS5zaF0gQWRkIG1pc3NpbmcgInRlc3QiLgotIC0gKGR0dWNrZXIpIFtyZWdyZXNzL2tleHR5cGUuc2hdIE1ha2Ugc2hhMjU2IHRlc3QgZGVwZW5kIG9uIEVDQy4gIFRoaXMgaXMgbm90Ci0gICBzdHJpY3RseSBjb3JyZWN0IHNpbmNlIHdoaWxlIEVDQyByZXF1aXJlcyBzaGEyNTYgdGhlIHJldmVyc2UgaXMgbm90IHRydWUKLSAgIGhvd2V2ZXIgaXQgZG9lcyBwcmV2ZW50IHNwdXJpb3VzIHRlc3QgZmFpbHVyZXMuCi0gLSAoZHR1Y2tlcikgW3BsYXRmb3JtLmNdIE5lZWQgc2VydmNvbmYuaCBhbmQgZXh0ZXJuIG9wdGlvbnMuCi0KLTIwMTAxMDI1Ci0gLSAodGltKSBbb3BlbmJzZC1jb21wYXQvZ2xvYi5oXSBSZW1vdmUgc3lzL2NkZWZzLmggaW5jbHVkZSB0aGF0IGNhbWUgd2l0aAotICAgMS4xMiB0byB1bmJyZWFrIFNvbGFyaXMgYnVpbGQuCi0gICBvayBkam1ACi0gLSAoZHR1Y2tlcikgW2RlZmluZXMuaF0gVXNlIFNJWkVfVF9NQVggZm9yIFNJWkVfTUFYIGZvciBwbGF0Zm9ybXMgdGhhdCBoYXZlIGEKLSAgIG5hdGl2ZSBvbmUuCi0KLTIwMTAxMDI0Ci0gLSAoZHR1Y2tlcikgW2luY2x1ZGVzLmhdIEFkZCBtaXNzaW5nIGlmZGVmIEdMT0JfSEFTX0dMX1NUQVRWIHRvIGZpeCBidWlsZC4KLSAtIChkdHVja2VyKSBbcmVncmVzcy9jZXJ0LWhvc3RrZXkuc2hdIERpc2FibGUgRUNDLWJhc2VkIHRlc3RzIG9uIHBsYXRmb3JtcwotICAgd2hpY2ggZG9uJ3QgaGF2ZSBFQ0Mgc3VwcG9ydCBpbiBsaWJjcnlwdG8uCi0gLSAoZHR1Y2tlcikgW3JlZ3Jlc3MvY2VydC11c2Vya2V5LnNoXSBEaXNhYmxlIEVDQy1iYXNlZCB0ZXN0cyBvbiBwbGF0Zm9ybXMKLSAgIHdoaWNoIGRvbid0IGhhdmUgRUNDIHN1cHBvcnQgaW4gbGliY3J5cHRvLgotIC0gKGR0dWNrZXIpIFtkZWZpbmVzLmhdIEFkZCBTSVpFX01BWCBmb3IgdGhlIGJlbmVmaXQgb2YgcGxhdGZvcm1zIHRoYXQgZG9uJ3QKLSAgIGhhdmUgaXQuCi0gLSAoZHR1Y2tlcikgT3BlbkJTRCBDVlMgU3luYwotICAgLSBzdGhlbkBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMC8yMyAyMjowNjoxMgotICAgICBbc2Z0cC5jXQotICAgICBlc2NhcGUgJ1snIGluIGZpbGVuYW1lIHRhYi1jb21wbGV0aW9uOyBmaXggYSB0eXBlIHdoaWxlIHRoZXJlLgotICAgICBvayBkam1ACi0KLTIwMTAxMDIxCi0gLSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGR0dWNrZXJAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTAvMTIgMDI6MjI6MjQKLSAgICAgW211eC5jXQotICAgICBUeXBvIGluIGNvbmZpcm1hdGlvbiBtZXNzYWdlLiAgYnojMTgyNywgcGF0Y2ggZnJvbSBpbW9yZ2FuIGF0Ci0gICAgIG5hcyBuYXNhIGdvdgotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDgvMzEgMTI6MjQ6MDkKLSAgICAgW3JlZ3Jlc3MvY2VydC1ob3N0a2V5LnNoIHJlZ3Jlc3MvY2VydC11c2Vya2V5LnNoXQotICAgICB0ZXN0cyBmb3IgRUNEU0EgY2VydGlmaWNhdGVzCi0KLTIwMTAxMDExCi0gLSAoZGptKSBbY2Fub2hvc3QuY10gWmVybyBhNCBpbnN0ZWFkIG9mIGFkZHIgdG8gYmV0dGVyIG1hdGNoIHR5cGUuCi0gICBieiMxODI1LCByZXBvcnRlZCBieSBmb28gQVQgbWFpbGluYXRvci5jb20KLSAtIChkam0pIFtzc2hjb25uZWN0LmNdIE5lZWQgc2lnbmFsLmggZm9yIHByb3RvdHlwZSBmb3Iga2lsbCgyKQotCi0yMDEwMTAxMQotIC0gKGRqbSkgW2NvbmZpZ3VyZS5hY10gVXNlID0gaW5zdGVhZCBvZiA9PSBpbiBzaGVsbCB0ZXN0cy4gUGF0Y2ggZnJvbQotICAgZHIgQVQgdmFzY28uY29tCi0KLTIwMTAxMDA3Ci0gLSAoZGptKSBbc3NoLWFnZW50LmNdIEZpeCB0eXBlIGZvciBjdXJ2ZSBuYW1lLgotIC0gKGRqbSkgT3BlbkJTRCBDVlMgU3luYwotICAgLSBtYXR0aGV3QGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzI0IDEzOjMzOjAwCi0gICAgIFttaXNjLmMgbWlzYy5oIGNvbmZpZ3VyZS5hYyBvcGVuYnNkLWNvbXBhdC9vcGVuYnNkLWNvbXBhdC5oXQotICAgICBbb3BlbmJzZC1jb21wYXQvdGltaW5nc2FmZV9iY21wLmNdCi0gICAgIEFkZCB0aW1pbmdzYWZlX2JjbXAoMykgdG8gbGliYywgbWVudGlvbiB0aGF0IGl0J3MgYWxyZWFkeSBpbiB0aGUKLSAgICAga2VybmVsIGluIGtlcm4oOSksIGFuZCByZW1vdmUgaXQgZnJvbSBPcGVuU1NILgotICAgICBvayBkZXJhYWR0QCwgZGptQAotICAgICBOQi4gcmUtYWRkZWQgdW5kZXIgb3BlbmJzZC1jb21wYXQvIGZvciBwb3J0YWJsZSBPcGVuU1NICi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8yNSAwOTozMDoxNgotICAgICBbc2Z0cC5jIGNvbmZpZ3VyZS5hYyBvcGVuYnNkLWNvbXBhdC9nbG9iLmMgb3BlbmJzZC1jb21wYXQvZ2xvYi5oXQotICAgICBtYWtlIHVzZSBvZiBuZXcgZ2xvYigzKSBHTE9CX0tFRVBTVEFUIGV4dGVuc2lvbiB0byBzYXZlIGV4dHJhIHNlcnZlcgotICAgICByb3VudHJpcHMgdG8gZmV0Y2ggcGVyLWZpbGUgc3RhdCgyKSBpbmZvcm1hdGlvbi4KLSAgICAgTkIuIHVwZGF0ZSBvcGVuYnNkLWNvbXBhdC8gZ2xvYigzKSBpbXBsZW1lbnRhdGlvbiBmcm9tIE9wZW5CU0QgbGliYyB0bwotICAgICBtYXRjaC4KLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzI2IDIyOjI2OjMzCi0gICAgIFtzZnRwLmNdCi0gICAgIHdoZW4gcGVyZm9ybWluZyBhbiAibHMiIGluIGNvbHVtbmF0ZWQgKHNob3J0KSBtb2RlLCBvbmx5IGNhbGwKLSAgICAgaW9jdGwoVElPQ0dXSU5TWikgb25jZSB0byBnZXQgdGhlIHdpbmRvdyB3aWR0aCBpbnN0ZWFkIG9mIHBlci0KLSAgICAgZmlsZW5hbWUKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzMwIDExOjA0OjUxCi0gICAgIFtzZXJ2Y29uZi5jXQotICAgICBwcmV2ZW50IGZyZWUoKSBvZiBzdHJpbmcgaW4gLnJvZGF0YSB3aGVuIG92ZXJyaWRpbmcgQXV0aG9yaXplZEtleXMgaW4KLSAgICAgYSBNYXRjaCBibG9jazsgcGF0Y2ggZnJvbSByZWluIEFUIGJhc2VmYXJtLm5vCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMC8wMSAyMzowNTozMgotICAgICBbY2lwaGVyLTNkZXMxLmMgY2lwaGVyLWJmMS5jIGNpcGhlci1jdHIuYyBvcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC5oXQotICAgICBhZGFwdCB0byBBUEkgY2hhbmdlcyBpbiBvcGVuc3NsLTEuMC4wYQotICAgICBOQi4gY29udGFpbnMgY29tcGF0IGNvZGUgdG8gc2VsZWN0IGNvcnJlY3QgQVBJIGZvciBvbGRlciBPcGVuU1NMCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8xMC8wNSAwNToxMzoxOAotICAgICBbc2Z0cC5jIHNzaGNvbm5lY3QuY10KLSAgICAgdXNlIGRlZmF1bHQgc2hlbGwgL2Jpbi9zaCBpZiAkU0hFTEwgaXMgIiI7IG9rIG1hcmt1c0AKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzEwLzA2IDA2OjM5OjI4Ci0gICAgIFtjbGllbnRsb29wLmMgc3NoLmMgc3NoY29ubmVjdC5jIHNzaGNvbm5lY3QuaF0KLSAgICAga2lsbCBwcm94eSBjb21tYW5kIG9uIGZhdGFsKCkgKHdlIGFscmVhZHkga2lsbCBpdCBvbiBjbGVhbiBleGl0KTsKLSAgICAgb2sgbWFya3VzQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMTAvMDYgMjE6MTA6MjEKLSAgICAgW3NzaGNvbm5lY3QuY10KLSAgICAgc3dhcHBlZCBhcmdzIHRvIGtpbGwoMikKLSAtIChkam0pIFtvcGVuYnNkLWNvbXBhdC9nbG9iLmNdIHJlc3RvcmUgQVJHX01BWCBjb21wYXQgY29kZS4KLSAtIChkam0pIFtjaXBoZXItYWNzcy5jXSBBZGQgbWlzc2luZyBoZWFkZXIuCi0gLSAoZGptKSBbb3BlbmJzZC1jb21wYXQvTWFrZWZpbGUuaW5dIEFjdHVhbGx5IGxpbmsgdGltaW5nc2FmZV9iY21wCi0KLTIwMTAwOTI0Ci0gLSAoZGptKSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIG5hZGR5QGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzEwIDE1OjE5OjI5Ci0gICAgIFtzc2gta2V5Z2VuLjFdCi0gICAgICogbWVudGlvbiBFQ0RTQSBpbiBtb3JlIHBsYWNlcwotICAgICAqIGxlc3MgcmVwZXRpdGlvbiBpbiBGSUxFUyBzZWN0aW9uCi0gICAgICogU1NIdjEga2V5cyBhcmUgc3RpbGwgZW5jcnlwdGVkIHdpdGggM0RFUwotICAgICBoZWxwIGFuZCBvayBqbWNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8xMSAyMTo0NDoyMAotICAgICBbc3NoLjFdCi0gICAgIG1lbnRpb24gUkZDIDU2NTYgZm9yIEVDQyBzdHVmZgotICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMTkgMjE6MzA6MDUKLSAgICAgW3NmdHAuMV0KLSAgICAgbW9yZSB3YWNreSBtYWNybyBmaXhpbmc7Ci0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8yMCAwNDo0MTo0NwotICAgICBbc3NoLmNdCi0gICAgIGluc3RhbGwgYSBTSUdDSExEIGhhbmRsZXIgdG8gcmVhcCBleHBpcmllZCBjaGlsZCBwcm9jZXNzOyBvayBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8yMCAwNDo1MDo1MwotICAgICBbanBha2UuYyBzY2hub3JyLmNdCi0gICAgIGNoZWNrIHRoYXQgcmVjZWl2ZWQgdmFsdWVzIGFyZSBzbWFsbGVyIHRoYW4gdGhlIGdyb3VwIHNpemUgaW4gdGhlCi0gICAgIGRpc2FibGVkIGFuZCB1bmZpbmlzaGVkIEotUEFLRSBjb2RlLgotICAgICBhdm9pZHMgY2F0YXN0cm9waGljIHNlY3VyaXR5IGZhaWx1cmUgZm91bmQgYnkgU2ViYXN0aWVuIE1hcnRpbmkKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzIwIDA0OjU0OjA3Ci0gICAgIFtqcGFrZS5jXQotICAgICBtaXNzaW5nICNpbmNsdWRlCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8yMCAwNzoxOToyNwotICAgICBbbXV4LmNdCi0gICAgICJhdG9taWNhbGx5IiBjcmVhdGUgdGhlIGxpc3RlbmluZyBtdXggc29ja2V0IGJ5IGJpbmRpbmcgaXQgb24gYSB0ZW1vcmFyeQotICAgICBuYW1lIGFuZCB0aGVuIGxpbmtpbmcgaXQgaW50byBwb3NpdGlvbiBhZnRlciBsaXN0ZW4oKSBoYXMgc3VjY2VlZGVkLgotICAgICB0aGlzIGFsbG93cyB0aGUgbXV4IGNsaWVudHMgdG8gZGV0ZXJtaW5lIHRoYXQgdGhlIHNlcnZlciBzb2NrZXQgaXMKLSAgICAgZWl0aGVyIHJlYWR5IG9yIHN0YWxlIHdpdGhvdXQgcmFjZXMuIHN0YWxlIHNlcnZlciBzb2NrZXRzIGFyZSBub3cKLSAgICAgYXV0b21hdGljYWxseSByZW1vdmVkCi0gICAgIG9rIGRlcmFhZHQKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzIyIDA1OjAxOjMwCi0gICAgIFtrZXguYyBrZXguaCBrZXhlY2RoLmMga2V4ZWNkaGMuYyBrZXhlY2Rocy5jIHJlYWRjb25mLmMgcmVhZGNvbmYuaF0KLSAgICAgW3NlcnZjb25mLmMgc2VydmNvbmYuaCBzc2hfY29uZmlnLjUgc3NoY29ubmVjdDIuYyBzc2hkLmMgc3NoZF9jb25maWcuNV0KLSAgICAgYWRkIGEgS2V4QWxnb3JpdGhtcyBrbm9iIHRvIHRoZSBjbGllbnQgYW5kIHNlcnZlciBjb25maWd1cmF0aW9uIHRvIGFsbG93Ci0gICAgIHNlbGVjdGlvbiBvZiB3aGljaCBrZXkgZXhjaGFuZ2UgbWV0aG9kcyBhcmUgdXNlZCBieSBzc2goMSkgYW5kIHNzaGQoOCkKLSAgICAgYW5kIHRoZWlyIG9yZGVyIG9mIHByZWZlcmVuY2UuCi0gICAgIG9rIG1hcmt1c0AKLSAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzIyIDA4OjMwOjA4Ci0gICAgIFtzc2guMSBzc2hfY29uZmlnLjVdCi0gICAgIHNzaC4xOiBhZGQga2V4YWxnb3JpdGhtcyB0byB0aGUgLW8gbGlzdAotICAgICBzc2hfY29uZmlnLjU6IGZvcm1hdCB0aGUga2V4YWxnb3JpdGhtcyBpbiBhIG1vcmUgY29uc2lzdGVudAotICAgICAocHJldHRpZXIhKSB3YXkKLSAgICAgb2sgZGptCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8yMiAyMjo1ODo1MQotICAgICBbYXRvbWljaW8uYyBhdG9taWNpby5oIG1pc2MuYyBtaXNjLmggc2NwLmMgc2Z0cC1jbGllbnQuY10KLSAgICAgW3NmdHAtY2xpZW50Lmggc2Z0cC4xIHNmdHAuY10KLSAgICAgYWRkIGFuIG9wdGlvbiBwZXItcmVhZC93cml0ZSBjYWxsYmFjayB0byBhdG9taWNpbwotCi0gICAgIGZhY3RvciBvdXQgYmFuZHdpZHRoIGxpbWl0aW5nIGNvZGUgZnJvbSBzY3AoMSkgaW50byBhIGdlbmVyaWMgYmFuZHdpZHRoCi0gICAgIGxpbWl0ZXIgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdXNpbmcgdGhlIGF0b21pY2lvIGNhbGxiYWNrIG1lY2hhbmlzbQotCi0gICAgIGFkZCBhIGJhbmR3aWR0aCBsaW1pdCBvcHRpb24gdG8gc2Z0cCgxKSB1c2luZyB0aGUgYWJvdmUKLSAgICAgInZlcnkgbmljZSIgbWFya3VzQAotICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMjMgMTM6MzQ6NDMKLSAgICAgW3NmdHAuY10KLSAgICAgYWRkIFstbCBsaW1pdF0gdG8gdXNhZ2UoKTsKLSAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzIzIDEzOjM2OjQ2Ci0gICAgIFtzY3AuMSBzZnRwLjFdCi0gICAgIGFkZCBLZXhBbGdvcml0aG1zIHRvIHRoZSAtbyBsaXN0OwotCi0yMDEwMDkxMAotIC0gKGR0dWNrZXIpIFtvcGVuYnNkLWNvbXBhdC9wb3J0LWxpbnV4LmNdIENoZWNrIGlzX3NlbGludXhfZW5hYmxlZCBmb3IgZXhhY3QKLSAgIHJldHVybiBjb2RlIHNpbmNlIGl0IGNhbiBhcHBhcmVudGx5IHJldHVybiAtMSB1bmRlciBzb21lIGNvbmRpdGlvbnMuICBGcm9tCi0gICBvcGVuc3NoIGJ1Z3Mgd2VyYml0dGV3YXMgZGUsIG9rIGRqbUAKLSAtIE9wZW5CU0QgQ1ZTIFN5bmMKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA4LzMxIDEyOjMzOjM4Ci0gICAgIFtzc2gtYWRkLmMgc3NoLWFnZW50LmMgc3NoLWtleWdlbi5jIHNzaC1rZXlzaWduLmMgc3NoLmMgc3NoZC5jXQotICAgICByZWludHJvZHVjZSBjb21taXQgZnJvbSB0ZWR1QCwgd2hpY2ggSSBwdWxsZWQgb3V0IGZvciByZWxlYXNlCi0gICAgIGVuZ2luZWVyaW5nOgotICAgICAgIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB3ZSBoYXZlIGEKLSAgICAgICBtYW4gcGFnZSBmb3IsIHNvIHVzZSB0aGF0LiAgb2sgZGptCi0gICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wOC8zMSAxNzo0MDo1NAotICAgICBbc3NoLWFnZW50LjFdCi0gICAgIGZpeCBzb21lIG1hY3JvIGFidXNlOwotICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDgvMzEgMjE6MTQ6NTgKLSAgICAgW3NzaC4xXQotICAgICBzbWFsbCB0ZXh0IHR3ZWFrIHRvIGFjY29tbW9kYXRlIHByZXZpb3VzOwotICAgLSBuYWRkeUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8wMSAxNToyMTozNQotICAgICBbc2VydmNvbmYuY10KLSAgICAgcGljayB1cCBFQ0RTQSBob3N0IGtleSBieSBkZWZhdWx0OyBvayBkam1ACi0gICAtIG1hcmt1c0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8wMiAxNjowNzoyNQotICAgICBbc3NoLWtleWdlbi5jXQotICAgICBwZXJtaXQgLWIgMjU2LCAzODQgb3IgNTIxIGFzIGtleSBzaXplIGZvciBFQ0RTQTsgb2sgZGptQAotICAgLSBtYXJrdXNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMDIgMTY6MDg6MzkKLSAgICAgW3NzaC5jXQotICAgICB1bmJyZWFrIENvbnRyb2xQZXJzaXN0PXllcyBmb3IgQ29udHJvbE1hc3Rlcj15ZXM7IG9rIGRqbUAKLSAgIC0gbmFkZHlAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMDIgMTc6MjE6NTAKLSAgICAgW3NzaC1rZXlnZW4uY10KLSAgICAgU3dpdGNoIEVDRFNBIGRlZmF1bHQga2V5IHNpemUgdG8gMjU2IGJpdHMsIHdoaWNoIGFjY29yZGluZyB0byBSRkM1NjU2Ci0gICAgIHNob3VsZCBzdGlsbCBiZSBiZXR0ZXIgdGhhbiBvdXIgY3VycmVudCBSU0EtMjA0OCBkZWZhdWx0LgotICAgICBvayBkam1ALCBtYXJrdXNACi0gICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8wMyAxMTowOToyOQotICAgICBbc2NwLjFdCi0gICAgIGFkZCBhbiBFWElUIFNUQVRVUyBzZWN0aW9uIGZvciAvdXNyL2JpbjsKLSAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzA0IDA5OjM4OjM0Ci0gICAgIFtzc2gtYWRkLjEgc3NoLjFdCi0gICAgIHR3byBtb3JlIEVYSVQgU1RBVFVTIHNlY3Rpb25zOwotICAgLSBuYWRkeUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8wNiAxNzoxMDoxOQotICAgICBbc3NoZF9jb25maWddCi0gICAgIGFkZCBzc2hfaG9zdF9lY2RzYV9rZXkgdG8gL2V0YzsgZnJvbSBNYXR0aWV1IEJhcHRpc3RlCi0gICAgIDxtYXR0aWV1LmJAZ21haWwuY29tPgotICAgICBvayBkZXJhYWR0QAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDkvMDggMDM6NTQ6MzYKLSAgICAgW2F1dGhmaWxlLmNdCi0gICAgIHR5cG8KLSAgIC0gZGVyYWFkdEBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOS8wOCAwNDoxMzozMQotICAgICBbY29tcHJlc3MuY10KLSAgICAgd29yayBhcm91bmQgbmFtZS1zcGFjZSBjb2xsaXNpb25zIHNvbWUgYnVnZ3kgY29tcGlsZXJzIChsb29raW5nIGF0IHlvdQotICAgICBnY2MsIGF0IGxlYXN0IGluIGVhcmxpZXIgdmVyc2lvbnMsIGJ1dCB0aGlzIGRvZXMgbm90IGZvcmdpdmUgeW91ciBjdXJyZW50Ci0gICAgIHRyYW5zZ3Jlc3Npb25zKSBzZWVuIGJldHdlZW4gemxpYiBhbmQgb3BlbnNzbAotICAgICBvayBkam0KLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA5LzA5IDEwOjQ1OjQ1Ci0gICAgIFtrZXguYyBrZXguaCBrZXhlY2RoLmMga2V5LmMga2V5LmggbW9uaXRvci5jIHNzaC1lY2RzYS5jXQotICAgICBFQ0RIL0VDRFNBIGNvbXBsaWFuY2UgZml4OiB0aGVzZSBtZXRob2RzIHZhcnkgdGhlIGhhc2ggZnVuY3Rpb24gdGhleSB1c2UKLSAgICAgKFNIQTI1Ni8zODQvNTEyKSBkZXBlbmRpbmcgb24gdGhlIGxlbmd0aCBvZiB0aGUgY3VydmUgaW4gdXNlLiBUaGUgcHJldmlvdXMKLSAgICAgY29kZSBpbmNvcnJlY3RseSB1c2VkIFNIQTI1NiBpbiBhbGwgY2FzZXMuCi0gICAgIAotICAgICBUaGlzIGZpeCB3aWxsIGNhdXNlIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgd2hlbiB1c2luZyAzODQgb3IgNTIxLWJpdCBjdXJ2ZQotICAgICBrZXlzIGlmIG9uZSBwZWVyIGhhc24ndCBiZWVuIHVwZ3JhZGVkIGFuZCB0aGUgb3RoZXIgaGFzLiAoMjU2LWJpdCBjdXJ2ZQotICAgICBrZXlzIHdvcmsgb2spLiBJbiBwYXJ0aWN1bGFyIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IEhvc3RrZXlBbGdvcml0aG1zCi0gICAgIHdoZW4gY29ubmVjdGluZyB0byBhIHNlcnZlciB0aGF0IGhhcyBub3QgYmVlbiB1cGdyYWRlZCBmcm9tIGFuIHVwZ3JhZGVkCi0gICAgIGNsaWVudC4KLSAgICAgCi0gICAgIG9rIG5hZGR5QAotIC0gKGRqbSkgW2F1dGhmZC5jIGF1dGhmaWxlLmMgYnVmZWMuYyBidWZmZXIuaCBjb25maWd1cmUuYWMga2V4Lmgga2V4ZWNkaC5jXQotICAgW2tleGVjZGhjLmMga2V4ZWNkaHMuYyBrZXkuYyBrZXkuaCBteXByb3Bvc2FsLmggcGFja2V0LmMgcmVhZGNvbmYuY10KLSAgIFtzc2gtYWdlbnQuYyBzc2gtZWNkc2EuYyBzc2gta2V5Z2VuLmMgc3NoLmNdIERpc2FibGUgRUNESCBhbmQgRUNEU0Egb24KLSAgIHBsYXRmb3JtcyB0aGF0IGRvbid0IGhhdmUgdGhlIHJlcXVpc2l0ZSBPcGVuU1NMIHN1cHBvcnQuIG9rIGR0dWNrZXJACi0gLSAoZHR1Y2tlcikgW2tleC5oIGtleS5jIHBhY2tldC5oIHNzaC1hZ2VudC5jIHNzaC5jXSBBIGZldyBtb3JlIEVDQyBpZmRlZnMKLSAgIGZvciBtaXNzaW5nIGhlYWRlcnMgYW5kIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0yMDEwMDgzMQotIC0gT3BlbkJTRCBDVlMgU3luYwotICAgLSBqbWNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDgvMDggMTk6MzY6MzAKLSAgICAgW3NzaC1rZXlzaWduLjggc3NoLjEgc3NoZC44XQotICAgICB1c2UgdGhlIHNhbWUgdGVtcGxhdGUgZm9yIGFsbCBGSUxFUyBzZWN0aW9uczsgaS5lLiAtY29tcGFjdC8uUHAgd2hlcmUgd2UKLSAgICAgaGF2ZSBtdWx0aXBsZSBpdGVtcywgYW5kIC5QYSBmb3IgcGF0aCBuYW1lczsKLSAgIC0gdGVkdUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOC8xMiAyMzozNDozOQotICAgICBbc3NoLWFkZC5jIHNzaC1hZ2VudC5jIHNzaC1rZXlnZW4uYyBzc2gta2V5c2lnbi5jIHNzaC5jIHNzaGQuY10KLSAgICAgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMgaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHdlIGhhdmUgYSBtYW4gcGFnZQotICAgICBmb3IsIHNvIHVzZSB0aGF0LiAgb2sgZGptCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOC8xNiAwNDowNjowNgotICAgICBbc3NoLWFkZC5jIHNzaC1hZ2VudC5jIHNzaC1rZXlnZW4uYyBzc2gta2V5c2lnbi5jIHNzaC5jIHNzaGQuY10KLSAgICAgYmFja291dCBwcmV2aW91cyB0ZW1wb3JhcmlseTsgZGlzY3Vzc2VkIHdpdGggZGVyYWFkdEAKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA4LzMxIDA5OjU4OjM3Ci0gICAgIFthdXRoLW9wdGlvbnMuYyBhdXRoMS5jIGF1dGgyLmMgYnVmYXV4LmMgYnVmZmVyLmgga2V4LmMga2V5LmMgcGFja2V0LmNdCi0gICAgIFtwYWNrZXQuaCBzc2gtZHNzLmMgc3NoLXJzYS5jXQotICAgICBBZGQgYnVmZmVyX2dldF9jc3RyaW5nKCkgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIHRoYXQgdmVyaWZ5IHRoYXQgdGhlCi0gICAgIHN0cmluZyBleHRyYWN0ZWQgZnJvbSB0aGUgYnVmZmVyIGNvbnRhaW5zIG5vIGVtYmVkZGVkIFwwIGNoYXJhY3RlcnMqCi0gICAgIFRoaXMgcHJldmVudHMgcmFuZG9tIChwb3NzaWJseSBtYWxpY2lvdXMpIGNyYXAgZnJvbSBiZWluZyBhcHBlbmRlZCB0bwotICAgICBzdHJpbmdzIHdoZXJlIGl0IHdvdWxkIG5vdCBiZSBub3RpY2VkIGlmIHRoZSBzdHJpbmcgaXMgdXNlZCB3aXRoCi0gICAgIGEgc3RyaW5nKDMpIGZ1bmN0aW9uLgotICAgICAKLSAgICAgVXNlIHRoZSBuZXcgQVBJIGluIGEgZmV3IHNlbnNpdGl2ZSBwbGFjZXMuCi0gICAgIAotICAgICAqIGFjdHVhbGx5LCB3ZSBhbGxvdyBhIHNpbmdsZSBvbmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGZvciBub3cgYmVjYXVzZQotICAgICB3ZSBkb24ndCBrbm93IGhvdyBtYW55IGRlcGxveWVkIGltcGxlbWVudGF0aW9ucyBnZXQgdGhpcyB3cm9uZywgYnV0IGRvbid0Ci0gICAgIGNvdW50IG9uIHRoaXMgdG8gcmVtYWluIGluZGVmaW5pdGVseS4KLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA4LzMxIDExOjU0OjQ1Ci0gICAgIFtQUk9UT0NPTCBQUk9UT0NPTC5hZ2VudCBQUk9UT0NPTC5jZXJ0a2V5cyBhdXRoMi1qcGFrZS5jIGF1dGhmZC5jXQotICAgICBbYXV0aGZpbGUuYyBidWZmZXIuaCBkbnMuYyBrZXguYyBrZXguaCBrZXkuYyBrZXkuaCBtb25pdG9yLmNdCi0gICAgIFttb25pdG9yX3dyYXAuYyBteXByb3Bvc2FsLmggcGFja2V0LmMgcGFja2V0LmggcGF0aG5hbWVzLmggcmVhZGNvbmYuY10KLSAgICAgW3NzaC1hZGQuMSBzc2gtYWRkLmMgc3NoLWFnZW50LjEgc3NoLWFnZW50LmMgc3NoLWtleWdlbi4xIHNzaC1rZXlnZW4uY10KLSAgICAgW3NzaC1rZXlzY2FuLjEgc3NoLWtleXNjYW4uYyBzc2gta2V5c2lnbi44IHNzaC4xIHNzaC5jIHNzaDIuaF0KLSAgICAgW3NzaF9jb25maWcuNSBzc2hjb25uZWN0LmMgc3NoY29ubmVjdDIuYyBzc2hkLjggc3NoZC5jIHNzaGRfY29uZmlnLjVdCi0gICAgIFt1dWVuY29kZS5jIHV1ZW5jb2RlLmggYnVmZWMuYyBrZXhlY2RoLmMga2V4ZWNkaGMuYyBrZXhlY2Rocy5jIHNzaC1lY2RzYS5jXQotICAgICBJbXBsZW1lbnQgRWxsaXB0aWMgQ3VydmUgQ3J5cHRvZ3JhcGh5IG1vZGVzIGZvciBrZXkgZXhjaGFuZ2UgKEVDREgpIGFuZAotICAgICBob3N0L3VzZXIga2V5cyAoRUNEU0EpIGFzIHNwZWNpZmllZCBieSBSRkM1NjU2LiBFQ0RIIGFuZCBFQ0RTQSBvZmZlcgotICAgICBiZXR0ZXIgcGVyZm9ybWFuY2UgdGhhbiBwbGFpbiBESCBhbmQgRFNBIGF0IHRoZSBzYW1lIGVxdWl2YWxlbnQgc3ltbWV0cmljCi0gICAgIGtleSBsZW5ndGgsIGFzIHdlbGwgYXMgbXVjaCBzaG9ydGVyIGtleXMuCi0gICAgIAotICAgICBPbmx5IHRoZSBtYW5kYXRvcnkgc2VjdGlvbnMgb2YgUkZDNTY1NiBhcmUgaW1wbGVtZW50ZWQsIHNwZWNpZmljYWxseSB0aGUKLSAgICAgdGhyZWUgUkVRVUlSRUQgY3VydmVzIG5pc3RwMjU2LCBuaXN0cDM4NCBhbmQgbmlzdHA1MjEgYW5kIG9ubHkgRUNESCBhbmQKLSAgICAgRUNEU0EuIFBvaW50IGNvbXByZXNzaW9uIChvcHRpb25hbCBpbiBSRkM1NjU2IGlzIE5PVCBpbXBsZW1lbnRlZCkuCi0gICAgIAotICAgICBDZXJ0aWZpY2F0ZSBob3N0IGFuZCB1c2VyIGtleXMgdXNpbmcgdGhlIG5ldyBFQ0RTQSBrZXkgdHlwZXMgYXJlIHN1cHBvcnRlZC4KLSAgICAgCi0gICAgIE5vdGUgdGhhdCB0aGlzIGNvZGUgaGFzIG5vdCBiZWVuIHRlc3RlZCBmb3IgaW50ZXJvcGVyYWJpbGl0eSBhbmQgbWF5IGJlCi0gICAgIHN1YmplY3QgdG8gY2hhbmdlLgotICAgICAKLSAgICAgZmVlZGJhY2sgYW5kIG9rIG1hcmt1c0AKLSAtIChkam0pIFtNYWtlZmlsZS5pbl0gQWRkIG5ldyBFQ0MgZmlsZXMKLSAtIChkam0pIFtidWZlYy5jIGtleGVjZGguYyBrZXhlY2RoYy5jIGtleGVjZGhzLmMgc3NoLWVjZHNhLmNdIGluY2x1ZGUKLSAgIGluY2x1ZGVzLmgKLQotMjAxMDA4MjcKLSAtIChkdHVja2VyKSBbY29udHJpYi9yZWRoYXQvc3NoZC5pbml0XSBCdWcgIzE4MTA6IGluaXRsb2cgaXMgZGVwcmVjYXRlZCwKLSAgIHJlbW92ZS4gIFBhdGNoIGZyb20gbWFydHluYXMgYXQgdmVuY2sgdXMgCi0KLTIwMTAwODIzCi0gLSAoZGptKSBSZWxlYXNlIE9wZW5TU0gtNS42cDEKLQotMjAxMDA4MTYKLSAtIChkdHVja2VyKSBbY29uZmlndXJlLmFjIG9wZW5ic2QtY29tcGF0L01ha2VmaWxlLmluCi0gICBvcGVuYnNkLWNvbXBhdC9vcGVuYnNkLWNvbXBhdC5oIG9wZW5ic2QtY29tcGF0L3N0cnB0aW1lLmNdIEFkZCBzdHJwdGltZSB0bwotICAgdGhlIGNvbXBhdCBsaWJyYXJ5IHdoaWNoIGhlbHBzIG9uIHBsYXRmb3JtcyBsaWtlIG9sZCBJUklYLiAgQmFzZWQgb24gd29yawotICAgYnkgZGptLCB0ZXN0ZWQgYnkgVG9tIENocmlzdGVuc2VuLgotIC0gT3BlbkJTRCBDVlMgU3luYwotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDgvMTIgMjE6NDk6NDQKLSAgICAgW3NzaC5jXQotICAgICBjbG9zZSBhbnkgZXh0cmEgZmlsZSBkZXNjcmlwdG9ycyBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgYXQgc3RhcnQgYW5kCi0gICAgIHJlb3BlbiBzdGRpbi9zdGRvdXQgdG8gL2Rldi9udWxsIHdoZW4gZm9ya2luZyBmb3IgQ29udHJvbFBlcnNpc3QuCi0gICAgIAotICAgICBwcmV2ZW50cyB0b29scyB0aGF0IGZvcmsgYW5kIHJ1biBhIGNhcHRpdmUgc3NoIGZvciBjb21tdW5pY2F0aW9uIGZyb20KLSAgICAgZmFpbGluZyB0byBleGl0IHdoZW4gdGhlIHNzaCBjb21wbGV0ZXMgd2hpbGUgdGhleSB3YWl0IGZvciB0aGVzZSBmZHMgdG8KLSAgICAgY2xvc2UuIFRoZSBpbmhlcml0ZWQgZmRzIG1heSBwZXJzaXN0IGFyYml0cmFyaWx5IGxvbmcgaWYgYSBiYWNrZ3JvdW5kCi0gICAgIG11eCBtYXN0ZXIgaGFzIGJlZW4gc3RhcnRlZCBieSBDb250cm9sUGVyc2lzdC4gY3ZzIGFuZCBzY3Agd2VyZSBlZmZlY3RlZAotICAgICBieSB0aGlzLgotICAgICAKLSAgICAgInBsZWFzZSBjb21taXQiIG1hcmt1c0AKLSAtIChkam0pIFtyZWdyZXNzL1JFQURNRS5yZWdyZXNzXSB0eXBvCi0KLTIwMTAwODEyCi0gLSAodGltKSBbcmVncmVzcy9sb2dpbi10aW1lb3V0LnNoIHJlZ3Jlc3MvcmVjb25maWd1cmUuc2ggcmVncmVzcy9yZWV4ZWMuc2gKLSAgIHJlZ3Jlc3MvdGVzdC1leGVjLnNoXSBVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMgd2hlbiB0ZXN0aW5nIHdpdGggc3VkbwotICAgdGVzdHMgd291bGQgZmFpbCBiZWNhdXNlIHRoZSBwaWRmaWxlIGNvdWxkIG5vdCBiZSByZWFkIGJ5IGEgcmVndWxhciB1c2VyLgotICAgImNhdDogY2Fubm90IG9wZW4gLi4uLi4vcmVncmVzcy9waWRmaWxlOiBQZXJtaXNzaW9uIGRlbmllZCAoZXJyb3IgMTMpIgotICAgTWFrZSBzdXJlIGNhdCBpcyBydW4gYnkgJFNVRE8uICBubyBvYmplY3Rpb24gZnJvbSBtZS4gZGptQAotIC0gKHRpbSkgW2F1dGguY10gYWRkIGNhc3QgdG8gcXVpZXQgY29tcGlsZXIuIENoYW5nZSBvbmx5IGFmZmVjdHMgU1ZSNSBzeXN0ZW1zLgotCi0yMDEwMDgwOQotIC0gKGRqbSkgYnojMTU2MTogZG9uJ3QgYm90aGVyIHNldHRpbmcgSUZGX1VQIG9uIHR1big0KSBkZXZpY2UgaWYgaXQgaXMKLSAgIGFscmVhZHkgc2V0LiBNYWtlcyBGcmVlQlNEIHVzZXIgb3BlbmFibGUgdHVubmVscyB1c2VmdWw7IHBhdGNoIGZyb20KLSAgIHJpY2hhcmQuYnVyYWtvd3NraStvc3NoIEFUIG1yYnVyYWsubmV0LCBvayBkdHVja2VyQAotIC0gKGR0dWNrZXIpIGJ1ZyAjMTUzMDogc3RyaXAgdHJhaWxpbmcgIjoiIGZyb20gaG9zdG5hbWUgaW4gc3NoLWNvcHktaWQuCi0gICBiYXNlZCBpbiBwYXJ0IG9uIGEgcGF0Y2ggZnJvbSBDb2xpbiBXYXRzb24sIG9rIGRqbUAKLQotMjAxMDA4MDkKLSAtIE9wZW5CU0QgQ1ZTIFN5bmMKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA4LzA4IDE2OjI2OjQyCi0gICAgIFt2ZXJzaW9uLmhdCi0gICAgIGNyYW5rIHRvIDUuNgotIC0gKGRqbSkgW1JFQURNRSBjb250cmliL2NhbGRlcmEvb3BlbnNzaC5zcGVjIGNvbnRyaWIvcmVkaGF0L29wZW5zc2guc3BlY10KLSAgIFtjb250cmliL3N1c2Uvb3BlbnNzaC5zcGVjXSBDcmFuayB2ZXJzaW9uIG51bWJlcnMKLQotMjAxMDA4MDUKLSAtIE9wZW5CU0QgQ1ZTIFN5bmMKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA4LzA0IDA1OjM3OjAxCi0gICAgIFtzc2guMSBzc2hfY29uZmlnLjUgc3NoZC44XQotICAgICBSZW1vdmUgbWVudGlvbnMgb2Ygd2VpcmQgImFkZHIvcG9ydCIgYWx0ZXJuYXRlIGFkZHJlc3MgZm9ybWF0IGZvciBJUHY2Ci0gICAgIGFkZHJlc3NlcyBjb21iaW5hdGlvbnMuIEl0IGhhc24ndCB3b3JrZWQgZm9yIGFnZXMgYW5kIHdlIGhhdmUgc3VwcG9ydGVkCi0gICAgIHRoZSBtb3JlIGNvbW1lbiAiW2FkZHJdOnBvcnQiIGZvcm1hdCBmb3IgYSBsb25nIHRpbWUuIG9rIGptY0AgbWFya3VzQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDgvMDQgMDU6NDA6MzkKLSAgICAgW1BST1RPQ09MLmNlcnRrZXlzIHNzaC1rZXlnZW4uY10KLSAgICAgdGlnaHRlbiB0aGUgcnVsZXMgZm9yIGNlcnRpZmljYXRlIGVuY29kaW5nIGJ5IHJlcXVpcmluZyB0aGF0IG9wdGlvbnMKLSAgICAgYXBwZWFyIGluIGxleGljYWwgb3JkZXIgYW5kIG1ha2Ugb3VyIHNzaC1rZXlnZW4gY29tcGx5LiBvayBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOC8wNCAwNTo0Mjo0NwotICAgICBbYXV0aC5jIGF1dGgyLWhvc3RiYXNlZC5jIGF1dGhmaWxlLmMgYXV0aGZpbGUuaCBzc2gta2V5c2lnbi44XQotICAgICBbc3NoLWtleXNpZ24uYyBzc2guY10KLSAgICAgZW5hYmxlIGNlcnRpZmljYXRlcyBmb3IgaG9zdGJhc2VkIGF1dGhlbnRpY2F0aW9uLCBmcm9tIElhaW4gTW9yZ2FuOwotICAgICAibG9va3Mgb2siIG1hcmt1c0AKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA4LzA0IDA1OjQ5OjIyCi0gICAgIFthdXRoZmlsZS5jXQotICAgICBjb21taXRlZCB0aGUgd3JvbmcgdmVyc2lvbiBvZiB0aGUgaG9zdGJhc2VkIGNlcnRpZmljYXRlIGRpZmY7IHRoaXMKLSAgICAgdmVyc2lvbiByZXBsYWNlcyBzb21lIHN0cmxje3B5LGF0fSB2ZXJib3NpdHkgd2l0aCB4YXNwcmludGYoKSBhdAotICAgICB0aGUgcmVxdWVzdCBvZiBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wOC8wNCAwNjowNzoxMQotICAgICBbc3NoLWtleWdlbi4xIHNzaC1rZXlnZW4uY10KLSAgICAgU3VwcG9ydCBDQSBrZXlzIGluIFBLQ1MjMTEgdG9rZW5zOyBmZWVkYmFjayBhbmQgb2sgbWFya3VzQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDgvMDQgMDY6MDg6NDAKLSAgICAgW3NzaC1rZXlzaWduLmNdCi0gICAgIGNsZWFuIGZvciAtV3VuaW5pdGlhbGl6ZWQgKElkIHN5bmMgb25seTsgcG9ydGFibGUgaGFkIHRoaXMgY2hhbmdlKQotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDgvMDUgMTM6MDg6NDIKLSAgICAgW2NoYW5uZWxzLmNdCi0gICAgIEZpeCBhIHRyaW8gb2YgYnVncyBpbiB0aGUgbG9jYWwvcmVtb3RlIHdpbmRvdyBjYWxjdWxhdGlvbiBmb3IgZGF0YWdyYW0KLSAgICAgZGF0YSBjaGFubmVscyAoaS5lLiBUdW5uZWxGb3J3YXJkKToKLSAgICAgCi0gICAgIENhbGN1bGF0ZSBsb2NhbF9jb25zdW1lZCBjb3JyZWN0bHkgaW4gY2hhbm5lbF9oYW5kbGVfd2ZkKCkgYnkgbWVhc3VyaW5nCi0gICAgIHRoZSBkZWx0YSB0byBidWZmZXJfbGVuKGMtPm91dHB1dCkgZnJvbSB3aGVuIHdlIHN0YXJ0IHRvIHdoZW4gd2UgZmluaXNoLgotICAgICBUaGUgcHJveGltYWwgcHJvYmxlbSBoZXJlIGlzIHRoYXQgdGhlIG91dHB1dF9maWx0ZXIgd2UgdXNlIGluIHBvcnRhYmxlCi0gICAgIG1vZGlmaWVkIHRoZSBsZW5ndGggb2YgdGhlIGRlcXVldWVkIGRhdGFncmFtICh0byBmdXR6IHdpdGggdGhlIGhlYWRlcnMKLSAgICAgZm9yICFPcGVuQlNEKS4KLSAgICAgCi0gICAgIEluIGNoYW5uZWxfb3V0cHV0X3BvbGwoKSwgZG9uJ3QgZW5xdWV1ZSBkYXRhZ3JhbXMgdGhhdCB3b24ndCBmaXQgaW4gdGhlCi0gICAgIHBlZXIncyBhZHZlcnRpc2VkIHBhY2tldCBzaXplIChoaWdobHkgdW5saWtlbHkgdG8gZXZlciBvY2N1cikgb3Igd2hpY2gKLSAgICAgd29uJ3QgZml0IGluIHRoZSBwZWVyJ3MgcmVtYWluaW5nIHdpbmRvdyAobW9yZSBsaWtlbHkpLgotICAgICAKLSAgICAgSW4gY2hhbm5lbF9pbnB1dF9kYXRhKCksIGFjY291bnQgZm9yIHRoZSA0LWJ5dGUgc3RyaW5nIGhlYWRlciBpbgotICAgICBkYXRhZ3JhbSBwYWNrZXRzIHRoYXQgd2UgYWNjZXB0IGZyb20gdGhlIHBlZXIgYW5kIGVucXVldWUgaW4gYy0+b3V0cHV0LgotICAgICAKLSAgICAgcmVwb3J0LCBhbmFseXNpcyBhbmQgdGVzdGluZyAyLzMgY2FzZXMgZnJvbSB3aWVyYm93cyBBVCB1cy5pYm0uY29tOwotICAgICAibG9va3MgZ29vZCIgbWFya3VzQAotCi0yMDEwMDgwMwotIC0gKGR0dWNrZXIpIFttb25pdG9yLmNdIEJ1ZyAjMTc5NTogSW5pdGlhbGl6ZSB0aGUgdmFsdWVzIHRvIGJlIHJldHVybmVkIGZyb20KLSAgIFBBTSB0byBzYW5lIHZhbHVlcyBpbiBjYXNlIHRoZSBQQU0gbWV0aG9kIGRvZXNuJ3Qgd3JpdGUgdG8gdGhlbS4gIFNwb3R0ZWQgYnkKLSAgIEJpdG1hbiBaaG91LCBvayBkam1ALgotIC0gT3BlbkJTRCBDVlMgU3luYwotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDcvMTYgMDQ6NDU6MzAKLSAgICAgW3NzaC1rZXlnZW4uY10KLSAgICAgYXZvaWQgYm9ndXMgY29tcGlsZXIgd2FybmluZwotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDcvMTYgMTQ6MDc6MzUKLSAgICAgW3NzaC1yc2EuY10KLSAgICAgbW9yZSB0aW1pbmcgcGFyYW5vaWEgLSBjb21wYXJlIGFsbCBwYXJ0cyBvZiB0aGUgZXhwZWN0ZWQgZGVjcnlwdGVkCi0gICAgIGRhdGEgYmVmb3JlIHJldHVybmluZy4gQUZBSUsgbm90IGV4cGxvaXRhYmxlIGluIHRoZSBTU0ggcHJvdG9jb2wuCi0gICAgICJncm9vdnkiIGRlcmFhZHRACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNy8xOSAwMzoxNjozMwotICAgICBbc2Z0cC1jbGllbnQuY10KLSAgICAgYnojMTc5NzogZml4IHN3YXBwZWQgYXJncyBpbiB1cGxvYWRfZGlyX2ludGVybmFsKCksIGJyZWFraW5nIHJlY3Vyc2l2ZQotICAgICB1cGxvYWQgZGVwdGggY2hlY2tzIGFuZCBjYXVzaW5nIHZlcmJvc2UgcHJpbnRpbmcgb2YgdHJhbnNmZXJzIHRvIGFsd2F5cwotICAgICBiZSB0dXJuZWQgb247IHBhdGNoIGZyb20gaW1vcmdhbiBBVCBuYXMubmFzYS5nb3YKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA3LzE5IDA5OjE1OjEyCi0gICAgIFtjbGllbnRsb29wLmMgcmVhZGNvbmYuYyByZWFkY29uZi5oIHNzaC5jIHNzaF9jb25maWcuNV0KLSAgICAgYWRkIGEgIkNvbnRyb2xQZXJzaXN0IiBvcHRpb24gdGhhdCBhdXRvbWF0aWNhbGx5IHN0YXJ0cyBhIGJhY2tncm91bmQKLSAgICAgc3NoKDEpIG11bHRpcGxleCBtYXN0ZXIgd2hlbiBjb25uZWN0aW5nLiBUaGlzIGNvbm5lY3Rpb24gY2FuIHN0YXkgYWxpdmUKLSAgICAgaW5kZWZpbml0ZWx5LCBvciBjYW4gYmUgc2V0IHRvIGF1dG9tYXRpY2FsbHkgY2xvc2UgYWZ0ZXIgYSB1c2VyLXNwZWNpZmllZAotICAgICBkdXJhdGlvbiBvZiBpbmFjdGl2aXR5LiBieiMxMzMwIC0gcGF0Y2ggYnkgZHdtdzIgQVQgaW5mcmFkZWFkLm9yZywgYnV0Ci0gICAgIGZ1cnRoZXIgaGFja2VkIG9uIGJ5IHdtZXJ0ZW5zIEFUIGNpc2NvLmNvbSwgYXBiIEFUIGNlcXVydXguY29tLAotICAgICBtYXJ0aW4tbWluZHJvdC1idWd6aWxsYSBBVCBlYXJ0aC5saSBhbmQgbXlzZWxmOyAibG9va3Mgb2siIG1hcmt1c0AKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA3LzIxIDAyOjEwOjU4Ci0gICAgIFttaXNjLmNdCi0gICAgIHN5bmMgdGltaW5nc2FmZV9iY21wKCkgd2l0aCB0aGUgb25lIGRlbXBza3lAIGNvbW1pdHRlZCB0byBzeXMvbGliL2xpYmtlcm4KLSAgIC0gZHR1Y2tlckBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNy8yMyAwODo0OToyNQotICAgICBbc3NoLjFdCi0gICAgIENpcGhlcnMgaXMgZG9jdW1lbnRlZCBpbiBzc2hfY29uZmlnKDUpIHRoZXNlIGRheXMKLQotMjAxMDA4MTkKLSAtIChkdHVja2VyKSBbY29udHJpYi9zc2gtY29weS11ZC4xXSBCdWcgIzE3ODY6IHVwZGF0ZSBzc2gtY29weS1pZC4xIHdpdGggbW9yZQotICAgZGV0YWlscyBhYm91dCBpdHMgYmVoYXZpb3VyIFdSVCBleGlzdGluZyBkaXJlY3Rvcmllcy4gIFBhdGNoIGZyb20KLSAgIGFzZ3V0aHJpZSBhdCBnbWFpbCBjb20sIG9rIGRqbS4KLQotMjAxMDA3MTYKLSAtIChkam0pIE9wZW5CU0QgQ1ZTIFN5bmMKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA3LzAyIDA0OjMyOjQ0Ci0gICAgIFttaXNjLmNdCi0gICAgIHVuYnJlYWsgc3RyZGVsaW0oKSBza2lwcGluZyBwYXN0IHF1b3RlZCBzdHJpbmdzLCBlLmcuCi0gICAgIEFsbG93VXNlcnMgImJsYWggYmxhaCIgYmxhaAotICAgICB3YXMgYnJva2VuOyByZXBvcnQgYW5kIGZpeCBpbiBieiMxNzU3IGZyb20gYml0bWFuLnpob3UgQVQgY2VudHJpZnkuY29tCi0gICAgIG9rIGR0dWNrZXI7Ci0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNy8xMiAyMjozODo1MgotICAgICBbc3NoLmNdCi0gICAgIE1ha2UgRXhpdE9uRm9yd2FyZEZhaWx1cmUgd29yayB3aXRoIGZvcmstYWZ0ZXItYXV0aGVudGljYXRpb24gKCJzc2ggLWYiKQotICAgICBmb3IgcHJvdG9jb2wgMi4gb2sgbWFya3VzQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDcvMTIgMjI6NDE6MTMKLSAgICAgW3NzaC5jIHNzaF9jb25maWcuNV0KLSAgICAgZXhwYW5kICVoIHRvIHRoZSBob3N0bmFtZSBpbiBzc2hfY29uZmlnIEhvc3RuYW1lIG9wdGlvbnMuIFdoaWxlIHRoaXMKLSAgICAgc291bmRzIHVzZWxlc3MsIGl0IGlzIGFjdHVhbGx5IGhhbmR5IGZvciB3b3JraW5nIHdpdGggdW5xdWFsaWZpZWQKLSAgICAgaG9zdG5hbWVzOgotICAgICAKLSAgICAgSG9zdCAqLioKLSAgICAgICAgSG9zdG5hbWUgJWgKLSAgICAgSG9zdCAqCi0gICAgICAgIEhvc3RuYW1lICVoLmV4YW1wbGUub3JnCi0gICAgIAotICAgICAiSSBsaWtlIGl0IiBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNy8xMyAxMTo1MjowNgotICAgICBbYXV0aC1yc2EuYyBjaGFubmVscy5jIGpwYWtlLmMga2V5LmMgbWlzYy5jIG1pc2MuaCBtb25pdG9yLmNdCi0gICAgIFtwYWNrZXQuYyBzc2gtcnNhLmNdCi0gICAgIGltcGxlbWVudCBhIHRpbWluZ19zYWZlX2NtcCgpIGZ1bmN0aW9uIHRvIGNvbXBhcmUgbWVtb3J5IHdpdGhvdXQgbGVha2luZwotICAgICB0aW1pbmcgaW5mb3JtYXRpb24gYnkgc2hvcnQtY2lyY3VpdGluZyBsaWtlIG1lbWNtcCgpIGFuZCB1c2UgaXQgZm9yCi0gICAgIHNvbWUgb2YgdGhlIG1vcmUgc2Vuc2l0aXZlIGNvbXBhcmlzb25zICh0aG91Z2ggbm90aGluZyBoaWdoLXZhbHVlIHdhcwotICAgICByZWFkaWx5IGF0dGFja2FibGUgYW55d2F5KTsgImxvb2tzIG9rIiBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNy8xMyAyMzoxMzoxNgotICAgICBbYXV0aC1yc2EuYyBjaGFubmVscy5jIGpwYWtlLmMga2V5LmMgbWlzYy5jIG1pc2MuaCBtb25pdG9yLmMgcGFja2V0LmNdCi0gICAgIFtzc2gtcnNhLmNdCi0gICAgIHMvdGltaW5nX3NhZmVfY21wL3RpbWluZ3NhZmVfYmNtcC9nCi0gICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wNy8xNCAxNzowNjo1OAotICAgICBbc3NoLjFdCi0gICAgIGZpbmFsbHkgc3NoIHN5bm9wc2lzIGxvb2tzIG5pY2UgYWdhaW4hIHRoaXMgY29tbWl0IGp1c3QgcmVtb3ZlcyBhIHRvbiBvZgotICAgICBoYWNrcyB3ZSBoYWQgaW4gcGxhY2UgdG8gbWFrZSBpdCB3b3JrIHdpdGggb2xkIGdyb2ZmOwotICAgLSBzY2h3YXJ6ZUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNy8xNSAyMToyMDozOAotICAgICBbc3NoLWtleWdlbi4xXQotICAgICByZXBhaXIgaW5jb3JyZWN0IGJsb2NrIG5lc3RpbmcsIHdoaWNoIHNjcmV3ZWQgdXAgaW5kZW50YXRpb247Ci0gICAgIHByb2JsZW0gcmVwb3J0ZWQgYW5kIGZpeCBPSyBieSBqbWNACi0KLTIwMTAwNzE0Ci0gLSAodGltKSBbY29udHJpYi9yZWRoYXQvb3BlbnNzaC5zcGVjXSBCdWcgMTc5NjogVGVzdCBmb3Igc2tpcF94MTFfYXNrcGFzcwotICAgKGxpbmUgNzcpIHNob3VsZCBoYXZlIGJlZW4gZm9yIG5vX3gxMV9hc2twYXNzLiAKLQotMjAxMDA3MDIKLSAtIChkam0pIE9wZW5CU0QgQ1ZTIFN5bmMKLSAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzI2IDAwOjU3OjA3Ci0gICAgIFtzc2hfY29uZmlnLjVdCi0gICAgIHR3ZWFrIHByZXZpb3VzOwotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMjYgMjM6MDQ6MDQKLSAgICAgW3NzaC5jXQotICAgICBvb3BzLCBmb3Jnb3QgdG8gI2luY2x1ZGUgPGNhbm9ob3N0Lmg+OyBzcG90dGVkIGFuZCBwYXRjaCBmcm9tIGNobEAKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzI5IDIzOjE1OjMwCi0gICAgIFtzc2gta2V5Z2VuLjEgc3NoLWtleWdlbi5jXQotICAgICBhbGxvdyBpbXBvcnQgKC1pKSBhbmQgZXhwb3J0ICgtZSkgb2YgUEVNIGFuZCBQS0NTIzggZW5jb2RlZCBrZXlzOwotICAgICBieiMxNzQ5OyBvayBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNi8yOSAyMzoxNjo0NgotICAgICBbYXV0aDItcHVia2V5LmMgc3NoZF9jb25maWcuNV0KLSAgICAgYWxsb3cga2V5IG9wdGlvbnMgKGNvbW1hbmQ9Ii4uLiIgYW5kIGZyaWVuZHMpIGluIEF1dGhvcml6ZWRQcmluY2lwYWxzOwotICAgICBvayBtYXJrdXNACi0gICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wNi8zMCAwNzoyNDoyNQotICAgICBbc3NoLWtleWdlbi4xXQotICAgICB0d2VhayBwcmV2aW91czsKLSAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzMwIDA3OjI2OjAzCi0gICAgIFtzc2gta2V5Z2VuLmNdCi0gICAgIHNvcnQgdXNhZ2UoKTsKLSAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzMwIDA3OjI4OjM0Ci0gICAgIFtzc2hkX2NvbmZpZy41XQotICAgICB0d2VhayBwcmV2aW91czsKLSAgIC0gbWlsbGVydEBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNy8wMSAxMzowNjo1OQotICAgICBbc2NwLmNdCi0gICAgIEZpeCBhIGxvbmdzdGFuZGluZyBwcm9ibGVtIHdoZXJlIGlmIHlvdSBzdXNwZW5kIHNjcCBhdCB0aGUKLSAgICAgcGFzc3dvcmQvcGFzc3BocmFzZSBwcm9tcHQgdGhlIHRlcm1pbmFsIG1vZGUgaXMgbm90IHJlc3RvcmVkLgotICAgICBPSyBkam1ACi0gICAtIHBoZXNzbGVyQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzI3IDE5OjE5OjU2Ci0gICAgIFtyZWdyZXNzL01ha2VmaWxlXQotICAgICBmaXggaG93IHdlIHJ1biB0aGUgdGVzdHMgc28gd2UgY2FuIHN1Y2Nlc3NmdWxseSB1c2UgU1VETz0nc3VkbyAtRScKLSAgICAgaW4gb3VyIGVudgotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMjkgMjM6NTk6NTQKLSAgICAgW2NlcnQtdXNlcmtleS5zaF0KLSAgICAgcmVncmVzcyB0ZXN0cyBmb3Iga2V5IG9wdGlvbnMgaW4gQXV0aG9yaXplZFByaW5jaXBhbHMKLQotMjAxMDA2MjcKLSAtICh0aW0pIFtvcGVuYnNkLWNvbXBhdC9wb3J0LXV3LmNdIFJlb3JkZXIgaW5jbHVkZXMuIGF1dGgtb3B0aW9ucy5oIG5vdyBuZWVkcwotICAga2V5LmguCi0KLTIwMTAwNjI2Ci0gLSAoZGptKSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNS8yMSAwNTowMDozNgotICAgICBbbWlzYy5jXQotICAgICBjb2xvbigpIHJldHVybnMgY2hhciosIHNvIHMvcmV0dXJuICgwKS9yZXR1cm4gTlVMTC8KLSAgIC0gbWFya3VzQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzA4IDIxOjMyOjE5Ci0gICAgIFtzc2gtcGtjczExLmNdCi0gICAgIGNoZWNrIGxlbmd0aCBvZiB2YWx1ZSByZXR1cm5lZCAgQ19HZXRBdHRyaWJ1dFZhbHVlIGZvciAhPSAwCi0gICAgIGZyb20gbWRydGJ1Z3ppbGxhQGNvZGVmaXZlLmNvLnVrOyBidWd6aWxsYSAjMTc3Mzsgb2sgZHR1Y2tlckAKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzE3IDA3OjA3OjMwCi0gICAgIFttdXguY10KLSAgICAgQ29ycmVjdCBzaXppbmcgb2Ygb2JqZWN0IHRvIGJlIGFsbG9jYXRlZCBieSBjYWxsb2MoKSwgcmVwbGFjaW5nCi0gICAgIHNpemVvZihzdGF0ZSkgd2l0aCBzaXplb2YoKnN0YXRlKS4gVGhpcyB3b3JrZWQgYnkgYWNjaWRlbnQgc2luY2UKLSAgICAgdGhlIHN0cnVjdCBjb250YWluZWQgYSBzaW5nbGUgaW50IGF0IHByZXNlbnQsIGJ1dCBjb3VsZCBoYXZlIGJyb2tlbgotICAgICBpbiB0aGUgZnV0dXJlLiBwYXRjaCBmcm9tIGh5YyBBVCBzeW1hcy5jb20KLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzE4IDAwOjU4OjM5Ci0gICAgIFtzZnRwLmNdCi0gICAgIHVuYnJlYWsgbHMgaW4gd29ya2luZyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW5zIGdsb2JiaW5nIGNoYXJhY3RlcnMgaW4KLSAgICAgdGhlaXIgcGF0aG5hbWVzLiBieiMxNjU1IHJlcG9ydGVkIGJ5IHZnaWZmaW4gQVQgYXBwbGUuY29tCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNi8xOCAwMzoxNjowMwotICAgICBbc2Vzc2lvbi5jXQotICAgICBNaXNzaW5nIGNoZWNrIGZvciBjaHJvb3RfZGlyZWN0b3IgPT0gIm5vbmUiICh3ZSBhbHJlYWR5IGNoZWNrZWQgYWdhaW5zdAotICAgICBOVUxMKTsgYnojMTU2NCBmcm9tIEphbi5QZWNoYW5lYyBBVCBTdW4uQ09NCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNi8xOCAwNDo0MzowOAotICAgICBbc2Z0cC1jbGllbnQuY10KLSAgICAgZml4IG1lbW9yeSBsZWFrIGluIGRvX3JlYWxwYXRoKCkgZXJyb3IgcGF0aDsgYnojMTc3MSwgcGF0Y2ggZnJvbQotICAgICBhbmlja2EgQVQgc3VzZS5jegotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMjIgMDQ6MjI6NTkKLSAgICAgW3NlcnZjb25mLmMgc3NoZF9jb25maWcuNV0KLSAgICAgZXhwb3NlIHNvbWUgbW9yZSBzc2hkX2NvbmZpZyBvcHRpb25zIGluc2lkZSBNYXRjaCBibG9ja3M6Ci0gICAgICAgQXV0aG9yaXplZEtleXNGaWxlIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZQotICAgICAgIEhvc3RiYXNlZFVzZXNOYW1lRnJvbVBhY2tldE9ubHkgUGVybWl0VHVubmVsCi0gICAgIGJ6IzE3NjQ7IGZlZWRiYWNrIGZyb20gaW1vcmdhbiBBVCBuYXMubmFzYS5nb3Y7IG9rIGR0dWNrZXJACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNi8yMiAwNDozMjowNgotICAgICBbc3NoLWtleWdlbi5jXQotICAgICBzdGFuZGFyZGlzZSBlcnJvciBtZXNzYWdlcyB3aGVuIGF0dGVtcHRpbmcgdG8gb3BlbiBwcml2YXRlIGtleQotICAgICBmaWxlcyB0byBpbmNsdWRlICJwcm9nbmFtZTogZmlsZW5hbWU6IGVycm9yIHJlYXNvbiIKLSAgICAgYnojMTc4Mzsgb2sgZHR1Y2tlckAKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzIyIDA0OjQ5OjQ3Ci0gICAgIFthdXRoLmNdCi0gICAgIHF1ZXVlIGF1dGggZGVidWcgbWVzc2FnZXMgZm9yIGJhZCBvd25lcnNoaXAgb3IgcGVybWlzc2lvbnMgb24gdGhlIHVzZXIncwotICAgICBrZXlmaWxlcy4gVGhlc2UgbWVzc2FnZXMgd2lsbCBiZSBzZW50IGFmdGVyIHRoZSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkKLSAgICAgYXV0aGVudGljYXRlZCAod2hlcmUgb3VyIGNsaWVudCB3aWxsIGRpc3BsYXkgdGhlbSB3aXRoIExvZ0xldmVsPWRlYnVnKS4KLSAgICAgYnojMTU1NDsgb2sgZHR1Y2tlckAKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzIyIDA0OjU0OjMwCi0gICAgIFtzc2gta2V5c2Nhbi5jXQotICAgICByZXBsYWNlIHZlcmJvc2UgYW5kIG92ZXJmbG93LXByb25lIExpbmVidWYgY29kZSB3aXRoIHJlYWRfa2V5ZmlsZV9saW5lKCkKLSAgICAgYmFzZWQgb24gcGF0Y2ggZnJvbSBqb2FjaGltIEFUIGpvYWNoaW1zY2hpcHBlci5ubDsgYnojMTU2NTsgb2sgZHR1Y2tlckAKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzIyIDA0OjU5OjEyCi0gICAgIFtzZXNzaW9uLmNdCi0gICAgIGluY2x1ZGUgdGhlIHVzZXIgbmFtZSBvbiAic3Vic3lzdGVtIHJlcXVlc3QgZm9yIC4uLiIgbG9nIG1lc3NhZ2VzOwotICAgICBieiMxNTcxOyBvayBkdHVja2VyQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMjMgMDI6NTk6MDIKLSAgICAgW3NzaC1rZXlnZW4uY10KLSAgICAgZml4IHByaW50aW5nIG9mIGV4dGVuc2lvbnMgaW4gdjAxIGNlcnRpZmljYXRlcyB0aGF0IEkgYnJva2UgaW4gcjEuMTkwCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNi8yNSAwNzoxNDo0NgotICAgICBbY2hhbm5lbHMuYyBtdXguYyByZWFkY29uZi5jIHJlYWRjb25mLmggc3NoLmhdCi0gICAgIGJ6IzEzMjc6IHJlbW92ZSBoYXJkY29kZWQgbGltaXQgb2YgMTAwIHBlcm1pdG9wZW4gY2xhdXNlcyBhbmQgcG9ydAotICAgICBmb3J3YXJkcyBwZXIgZGlyZWN0aW9uOyBvayBtYXJrdXNAIHN0ZXZlc2tACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNi8yNSAwNzoyMDowNAotICAgICBbY2hhbm5lbHMuYyBzZXNzaW9uLmNdCi0gICAgIGJ6IzE3NTA6IGZpeCByZXF1aXJlbWVudCBmb3IgL2Rldi9udWxsIGluc2lkZSBDaHJvb3REaXJlY3RvcnkgZm9yCi0gICAgIGludGVybmFsLXNmdHAgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgaW4gcjEuMjUzIGJ5IHJlbW92aW5nIHRoZSBjb2RlCi0gICAgIHRoYXQgb3BlbnMgYW5kIGR1cCAvZGV2L251bGwgdG8gc3RkZXJyIGFuZCBtb2RpZnlpbmcgdGhlIGNoYW5uZWxzIGNvZGUKLSAgICAgdG8gcmVhZCBzdGRlcnIgYnV0IGRpc2NhcmQgaXQgaW5zdGVhZDsgb2sgbWFya3VzQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDYvMjUgMDg6NDY6MTcKLSAgICAgW2F1dGgxLmMgYXV0aDItbm9uZS5jXQotICAgICBza2lwIHRoZSBpbml0aWFsIGNoZWNrIGZvciBhY2Nlc3Mgd2l0aCBhbiBlbXB0eSBwYXNzd29yZCB3aGVuCi0gICAgIFBlcm1pdEVtcHR5UGFzc3dvcmRzPW5vOyBieiMxNjM4OyBvayBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNi8yNSAyMzoxMDozMAotICAgICBbc3NoLmNdCi0gICAgIGxvZyB0aGUgaG9zdG5hbWUgYW5kIGFkZHJlc3MgdGhhdCB3ZSBjb25uZWN0ZWQgdG8gYXQgTG9nTGV2ZWw9dmVyYm9zZQotICAgICBhZnRlciBhdXRoZW50aWNhdGlvbiBpcyBzdWNjZXNzZnVsIHRvIG1pdGlnYXRlICJwaGlzaGluZyIgYXR0YWNrcyBieQotICAgICBzZXJ2ZXJzIHdpdGggdHJ1c3RlZCBrZXlzIHRoYXQgYWNjZXB0IGF1dGhlbnRpY2F0aW9uIHNpbGVudGx5IGFuZAotICAgICBhdXRvbWF0aWNhbGx5IGJlZm9yZSBwcmVzZW50aW5nIGZha2UgcGFzc3dvcmQvcGFzc3BocmFzZSBwcm9tcHRzOwotICAgICAibmljZSEiIG1hcmt1c0AKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA2LzI1IDIzOjEwOjMwCi0gICAgIFtzc2guY10KLSAgICAgbG9nIHRoZSBob3N0bmFtZSBhbmQgYWRkcmVzcyB0aGF0IHdlIGNvbm5lY3RlZCB0byBhdCBMb2dMZXZlbD12ZXJib3NlCi0gICAgIGFmdGVyIGF1dGhlbnRpY2F0aW9uIGlzIHN1Y2Nlc3NmdWwgdG8gbWl0aWdhdGUgInBoaXNoaW5nIiBhdHRhY2tzIGJ5Ci0gICAgIHNlcnZlcnMgd2l0aCB0cnVzdGVkIGtleXMgdGhhdCBhY2NlcHQgYXV0aGVudGljYXRpb24gc2lsZW50bHkgYW5kCi0gICAgIGF1dG9tYXRpY2FsbHkgYmVmb3JlIHByZXNlbnRpbmcgZmFrZSBwYXNzd29yZC9wYXNzcGhyYXNlIHByb21wdHM7Ci0gICAgICJuaWNlISIgbWFya3VzQAotCi0yMDEwMDYyMgotIC0gKGRqbSkgW2xvZ2lucmVjLmNdIGNyYW5rIExJTkZPX05BTUVTSVpFICh1c2VybmFtZSBsZW5ndGgpIHRvIDUxMgotICAgYnojMTU3OTsgb2sgZHR1Y2tlcgotCi0yMDEwMDYxOAotIC0gKGRqbSkgW2NvbnRyaWIvc3NoLWNvcHktaWRdIFVwZGF0ZSBrZXkgZmlsZSBleHBsaWNpdGx5IHVuZGVyIH4KLSAgIHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoYXQgJENXRCA9PSAkSE9NRS4gYnojMTUwMCwgcGF0Y2ggZnJvbQotICAgdGltb3RoeSBBVCBnZWx0ZXIuY29tCi0KLTIwMTAwNjE3Ci0gLSAodGltKSBbY29udHJpYi9jeWd3aW4vUkVBRE1FXSBSZW1vdmUgYSByZWZlcmVuY2UgdG8gdGhlIG9ic29sZXRlCi0gICBtaW5pcmVzLWRldmVsIHBhY2thZ2UsIGFuZCB0byBhZGQgdGhlIHJlZmVyZW5jZSB0byB0aGUgbGliZWRpdC1kZXZlbAotICAgcGFja2FnZSBzaW5jZSBDWWd3aW4gbm93IHByb3ZpZGVzIGxpYmVkaXQuIFBhdGNoIGZyb20gQ29yaW5uYSBWaW5zY2hlbi4KLQotMjAxMDA1MjEKLSAtIChkam0pIE9wZW5CU0QgQ1ZTIFN5bmMKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA1LzA3IDExOjMxOjI2Ci0gICAgIFtyZWdyZXNzL01ha2VmaWxlIHJlZ3Jlc3MvY2VydC11c2Vya2V5LnNoXQotICAgICByZWdyZXNzIHRlc3RzIGZvciBBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGUgYW5kICJwcmluY2lwYWxzPSIga2V5IG9wdGlvbi4KLSAgICAgZmVlZGJhY2sgYW5kIG9rIG1hcmt1c0AKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA1LzExIDAyOjU4OjA0Ci0gICAgIFthdXRoLXJzYS5jXQotICAgICBkb24ndCBhY2NlcHQgY2VydGlmaWNhdGVzIG1hcmtlZCBhcyAiY2VydC1hdXRob3JpdHkiIGhlcmU7IG9rIG1hcmt1c0AKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA1LzE0IDAwOjQ3OjIyCi0gICAgIFtzc2gtYWRkLmNdCi0gICAgIGNoZWNrIHRoYXQgdGhlIGNlcnRpZmljYXRlIG1hdGNoZXMgdGhlIGNvcnJlc3BvbmRpbmcgcHJpdmF0ZSBrZXkgYmVmb3JlCi0gICAgIGdyYWZ0aW5nIGl0IG9uCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNS8xNCAyMzoyOToyMwotICAgICBbY2hhbm5lbHMuYyBjaGFubmVscy5oIG11eC5jIHNzaC5jXQotICAgICBQYXVzZSB0aGUgbXV4IGNoYW5uZWwgd2hpbGUgd2FpdGluZyBmb3IgcmVwbHkgZnJvbSBheW5jaCBjYWxsYmFja3MuCi0gICAgIFByZXZlbnRzIG1pc29yZGVyaW5nIG9mIHJlcGxpZXMgaWYgbmV3IHJlcXVlc3RzIGFycml2ZSB3aGlsZSB3YWl0aW5nLgotICAgICAKLSAgICAgRXh0ZW5kIGNoYW5uZWwgb3BlbiBjb25maXJtIGNhbGxiYWNrIHRvIGFsbG93IHNpZ25hbGxpbmcgZmFpbHVyZQotICAgICBjb25kaXRpb25zIGFzIHdlbGwgYXMgc3VjY2Vzcy4gVXNlIHRoaXMgdG8gMSkgZml4IGEgbWVtb3J5IGxlYWssIDIpCi0gICAgIHN0YXJ0IHVzaW5nIHRoZSBhYm92ZSBwYXVzZSBtZWNoYW5pc20gYW5kIDMpIGRlbGF5IHNlbmRpbmcgYSBzdWNjZXNzLwotICAgICBmYWlsdXJlIG1lc3NhZ2Ugb24gbXV4IHNsYXZlIHNlc3Npb24gb3BlbiB1bnRpbCB3ZSByZWNlaXZlIGEgcmVwbHkgZnJvbQotICAgICB0aGUgc2VydmVyLgotICAgICAKLSAgICAgbW90aXZhdGVkIGJ5IGFuZCB3aXRoIGZlZWRiYWNrIGZyb20gbWFya3VzQAotICAgLSBtYXJrdXNAY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDUvMTYgMTI6NTU6NTEKLSAgICAgW1BST1RPQ09MLm11eCBjbGllbnRsb29wLmggbXV4LmMgcmVhZGNvbmYuYyByZWFkY29uZi5oIHNzaC4xIHNzaC5jXQotICAgICBtdXggc3VwcG9ydCBmb3IgcmVtb3RlIGZvcndhcmRpbmcgd2l0aCBkeW5hbWljIHBvcnQgYWxsb2NhdGlvbiwKLSAgICAgdXNlIHdpdGgKLSAgICAgICAgTFBPUlQ9YHNzaCAtUyBtdXhzb2NrZXQgLVIwOmxvY2FsaG9zdDoyNSAtTyBmb3J3YXJkIHNvbWVob3N0YAotICAgICBmZWVkYmFjayBhbmQgb2sgZGptQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDUvMjAgMTE6MjU6MjYKLSAgICAgW2F1dGgyLXB1YmtleS5jXQotICAgICBmaXggbG9nc3BhbSB3aGVuIGtleSBvcHRpb25zIChmcm9tPSIuLi4iIGVzcGVjaWFsbHkpIGRlbnkgbm9uLW1hdGNoaW5nCi0gICAgIGtleXM7IHJlcG9ydGVkIGJ5IGhlbm5pbmdAIGFsc28gYnojMTc2NTsgb2sgbWFya3VzQCBkdHVja2VyQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDUvMjAgMjM6NDY6MDIKLSAgICAgW1BST1RPQ09MLmNlcnRrZXlzIGF1dGgtb3B0aW9ucy5jIHNzaC1rZXlnZW4uY10KLSAgICAgTW92ZSB0aGUgcGVybWl0LSogb3B0aW9ucyB0byB0aGUgbm9uLWNyaXRpY2FsICJleHRlbnNpb25zIiBmaWVsZCBmb3IgdjAxCi0gICAgIGNlcnRpZmljYXRlcy4gVGhlIGxvZ2ljIGlzIHRoYXQgaWYgYW5vdGhlciBpbXBsZW1lbnRhdGlvbiBmYWlscyB0bwotICAgICBpbXBsZW1lbnQgdGhlbSB0aGVuIHRoZSBjb25uZWN0aW9uIGp1c3QgbG9zZXMgZmVhdHVyZXMgcmF0aGVyIHRoYW4gZmFpbHMKLSAgICAgb3V0cmlnaHQuCi0gICAgIAotICAgICBvayBtYXJrdXNACi0KLTIwMTAwNTExCi0gLSAoZHR1Y2tlcikgW01ha2VmaWxlLmluXSBCdWcgIzE3NzA6IExpbmsgbGlib3BlbmJzZC1jb21wYXQgdHdpY2UgdG8gc29sdmUKLSAgIGNpcmN1bGFyIGRlcGVuZGVuY3kgcHJvYmxlbSBvbiBvbGQgb3Igb2RkIHBsYXRmb3Jtcy4gIEZyb20gVG9tIExhbmUsIG9rCi0gICBkam1ALgotIC0gKGRqbSkgW29wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmhdIEZpeCBidWlsZCBicmVha2FnZSBvbiBvbGRlcgotICAgbGliY3J5cHRvIGJ5IGRlZmluaW5nIE9QRU5TU0xfW0RSXVNBX01BWF9NT0RVTFVTX0JJVFMgaWYgdGhleSBhcmVuJ3QKLSAgIGFscmVhZHkuIG9rIGR0dWNrZXJACi0KLTIwMTAwNTEwCi0gLSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8yMyAwMTo0Nzo0MQotICAgICBbc3NoLWtleWdlbi5jXQotICAgICBieiMxNzQwOiBkaXNwbGF5IGEgbW9yZSBoZWxwZnVsIGVycm9yIG1lc3NhZ2Ugd2hlbiAkSE9NRSBpcwotICAgICBpbmFjY2Vzc2libGUgd2hpbGUgdHJ5aW5nIHRvIGNyZWF0ZSAuc3NoIGRpcmVjdG9yeS4gQmFzZWQgb24gcGF0Y2gKLSAgICAgZnJvbSBqY2hhZGltYSBBVCByZWRoYXQuY29tOyBvayBkdHVja2VyQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDQvMjMgMjI6Mjc6MzgKLSAgICAgW211eC5jXQotICAgICBzZXQgImRldGFjaF9jbG9zZSIgZmxhZyB3aGVuIHJlZ2lzdGVyaW5nIGNoYW5uZWwgY2xlYW51cCBjYWxsYmFja3MuCi0gICAgIFRoaXMgY2F1c2VzIHRoZSBjaGFubmVsIHRvIGNsb3NlIG5vcm1hbGx5IHdoZW4gaXRzIGZkcyBjbG9zZSBhbmQKLSAgICAgaGFuZ3Mgd2hlbiB0ZXJtaW5hdGluZyBhIG11eCBzbGF2ZSB1c2luZyB+LiBieiMxNzU4OyBvayBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8yMyAyMjo0MjowNQotICAgICBbc2Vzc2lvbi5jXQotICAgICBzZXQgc3RkZXJyIHRvIC9kZXYvbnVsbCBmb3Igc3Vic3lzdGVtcyByYXRoZXIgdGhhbiBqdXN0IGNsb3NpbmcgaXQuCi0gICAgIGF2b2lkcyBoYW5ncyBpZiBhIHN1YnN5c3RlbSBvciBzaGVsbCBpbml0aWFsaXNhdGlvbiB3cml0ZXMgdG8gc3RkZXJyLgotICAgICBieiMxNzUwOyBvayBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8yMyAyMjo0ODozMQotICAgICBbc3NoLWtleWdlbi5jXQotICAgICByZWZ1c2UgdG8gZ2VuZXJhdGUga2V5cyBsb25nZXIgdGhhbiBPUEVOU1NMX1tSRF1TQV9NQVhfTU9EVUxVU19CSVRTLAotICAgICBzaW5jZSB3ZSB3b3VsZCByZWZ1c2UgdG8gdXNlIHRoZW0gYW55d2F5LiBieiMxNTE2OyBvayBkdHVja2VyQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDQvMjYgMjI6Mjg6MjQKLSAgICAgW3NzaGNvbm5lY3QyLmNdCi0gICAgIGJ6IzE1MDI6IGF1dGhjdHh0LnN1Y2Nlc3MgaXMgZGVjbGFyZWQgYXMgYW4gaW50LCBidXQgcGFzc2VkIGJ5Ci0gICAgIHJlZmVyZW5jZSB0byBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgc2lnX2F0b21pY190Ki4gQ29udmVydCBpdCB0bwotICAgICB0aGUgbGF0dGVyOyBvayBtYXJrdXNAIGR0dWNrZXJACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNS8wMSAwMjo1MDo1MAotICAgICBbUFJPVE9DT0wuY2VydGtleXNdCi0gICAgIHR5cG87IGptZWx0emVyQAotICAgLSBkdHVja2VyQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA1LzA1IDA0OjIyOjA5Ci0gICAgIFtzZnRwLmNdCi0gICAgIHJlc3RvcmUgbXB1dCBhbmQgbWdldCB3aGljaCBnb3QgbG9zdCBpbiB0aGUgdGFiLWNvbXBsZXRpb24gY2hhbmdlcy4KLSAgICAgZm91bmQgYnkgS2VubmV0aCBXaGl0YWtlciwgb2sgZGptQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDUvMDcgMTE6MzA6MzAKLSAgICAgW2F1dGgtb3B0aW9ucy5jIGF1dGgtb3B0aW9ucy5oIGF1dGguYyBhdXRoLmggYXV0aDItcHVia2V5LmNdCi0gICAgIFtrZXkuYyBzZXJ2Y29uZi5jIHNlcnZjb25mLmggc3NoZC44IHNzaGRfY29uZmlnLjVdCi0gICAgIGFkZCBzb21lIG9wdGlvbmFsIGluZGlyZWN0aW9uIHRvIG1hdGNoaW5nIG9mIHByaW5jaXBhbCBuYW1lcyBsaXN0ZWQKLSAgICAgaW4gY2VydGlmaWNhdGVzLiBDdXJyZW50bHksIGEgY2VydGlmaWNhdGUgbXVzdCBpbmNsdWRlIHRoZSBhIHVzZXIncyBuYW1lCi0gICAgIHRvIGJlIGFjY2VwdGVkIGZvciBhdXRoZW50aWNhdGlvbi4gVGhpcyBjaGFuZ2UgYWRkcyB0aGUgYWJpbGl0eSB0bwotICAgICBzcGVjaWZ5IGEgbGlzdCBvZiBjZXJ0aWZpY2F0ZSBwcmluY2lwYWwgbmFtZXMgdGhhdCBhcmUgYWNjZXB0YWJsZS4KLSAgICAgCi0gICAgIFdoZW4gYXV0aGVudGljYXRpbmcgdXNpbmcgYSBDQSB0cnVzdGVkIHRocm91Z2ggfi8uc3NoL2F1dGhvcml6ZWRfa2V5cywKLSAgICAgdGhpcyBhZGRzIGEgbmV3IHByaW5jaXBhbHM9Im5hbWUxWyxuYW1lMiwuLi5dIiBrZXkgb3B0aW9uLgotICAgICAKLSAgICAgRm9yIENBcyBsaXN0ZWQgdGhyb3VnaCBzc2hkX2NvbmZpZydzIFRydXN0ZWRDQUtleXMgb3B0aW9uLCBhIG5ldyBjb25maWcKLSAgICAgb3B0aW9uICJBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGUiIHNwZWNpZmllcyBhIHBlci11c2VyIGZpbGUgY29udGFpbmluZwotICAgICB0aGUgbGlzdCBvZiBhY2NlcHRhYmxlIG5hbWVzLgotICAgICAKLSAgICAgSWYgZWl0aGVyIG9wdGlvbiBpcyBhYnNlbnQsIHRoZSBjdXJyZW50IGJlaGF2aW91ciBvZiByZXF1aXJpbmcgdGhlCi0gICAgIHVzZXJuYW1lIHRvIGFwcGVhciBpbiBwcmluY2lwYWxzIGNvbnRpbnVlcyB0byBhcHBseS4KLSAgICAgCi0gICAgIFRoZXNlIG9wdGlvbnMgYXJlIHVzZWZ1bCBmb3Igcm9sZSBhY2NvdW50cywgZGlzam9pbnQgYWNjb3VudCBuYW1lc3BhY2VzCi0gICAgIGFuZCAidXNlckByZWFsbSItc3R5bGUgbmFtaW5nIHBvbGljaWVzIGluIGNlcnRpZmljYXRlcy4KLSAgICAgCi0gICAgIGZlZWRiYWNrIGFuZCBvayBtYXJrdXNACi0gICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wNS8wNyAxMjo0OToxNwotICAgICBbc3NoZF9jb25maWcuNV0KLSAgICAgdHdlYWsgcHJldmlvdXM7Ci0KLTIwMTAwNDIzCi0gLSAoZHR1Y2tlcikgW2NvbmZpZ3VyZS5hY10gQnVnICMxNzU2OiBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhIGxpYjY0IGRpcgotICAgaW4gdGhlIG9wZW5zc2wgaW5zdGFsbCBkaXJlY3RvcnkgKHNvbWUgbmV3ZXIgb3BlbnNzbCB2ZXJzaW9ucyBkbyB0aGlzIG9uIGF0Ci0gICBsZWFzdCBzb21lIGFtZDY0IHBsYXRmb3JtcykuCi0KLTIwMTAwNDE4Ci0gLSBPcGVuQlNEIENWUyBTeW5jCi0gICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8xNiAwNjo0NTowMQotICAgICBbc3NoX2NvbmZpZy41XQotICAgICB0d2VhayBwcmV2aW91czsgb2sgZGptCi0gICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8xNiAwNjo0NzowNAotICAgICBbc3NoLWtleWdlbi4xIHNzaC1rZXlnZW4uY10KLSAgICAgdHdlYWsgcHJldmlvdXM7IG9rIGRqbQotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDQvMTYgMjE6MTQ6MjcKLSAgICAgW3NzaGNvbm5lY3QuY10KLSAgICAgb29wcywgJXIgPT4gcmVtb3RlIHVzZXJuYW1lLCBub3QgJXUKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA0LzE2IDAxOjU4OjQ1Ci0gICAgIFtyZWdyZXNzL2NlcnQtaG9zdGtleS5zaCByZWdyZXNzL2NlcnQtdXNlcmtleS5zaF0KLSAgICAgcmVncmVzc2lvbiB0ZXN0cyBmb3IgdjAxIGNlcnRpZmljYXRlIGZvcm1hdAotICAgICBpbmNsdWRlcyBpbnRlcm9wIHRlc3RzIGZvciB2MDAgY2VydHMKLSAtIChkdHVja2VyKSBbY29udHJpYi9haXgvYnVpbGRiZmYuc2hdIEZpeCBjcmVhdGlvbiBvZiBzc2hfcHJuZ19jbWRzLmRlZmF1bHQKLSAgIGZpbGUuCi0KLTIwMTAwNDE2Ci0gLSAoZGptKSBSZWxlYXNlIG9wZW5zc2gtNS41cDEKLSAtIE9wZW5CU0QgQ1ZTIFN5bmMKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzAzLzI2IDAzOjEzOjE3Ci0gICAgIFtidWZhdXguY10KLSAgICAgYWxsb3cgYnVmZmVyX2dldF9pbnRfcmV0L2J1ZmZlcl9nZXRfaW50NjRfcmV0IHRvIHRha2UgYSBOVUxMIHBvaW50ZXIKLSAgICAgYXJndW1lbnQgdG8gYWxsb3cgc2tpcHBpbmcgcGFzdCB2YWx1ZXMgaW4gYSBidWZmZXIKLSAgIC0gam1jQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzAzLzI2IDA2OjU0OjM2Ci0gICAgIFtzc2guMV0KLSAgICAgdHdlYWsgcHJldmlvdXM7Ci0gICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wMy8yNyAxNDoyNjo1NQotICAgICBbc3NoX2NvbmZpZy41XQotICAgICB0d2VhayBwcmV2aW91czsgb2sgZHR1Y2tlcgotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDQvMTAgMDA6MDA6MTYKLSAgICAgW3NzaC5jXQotICAgICBieiMxNzQ2IC0gc3VwcHJlc3Mgc3B1cmlvdXMgdHR5IHdhcm5pbmcgd2hlbiB1c2luZyAtTyBhbmQgc3RkaW4KLSAgICAgaXMgbm90IGEgdHR5OyBvayBkdHVja2VyQCBtYXJrdXNACi0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8xMCAwMDowNDozMAotICAgICBbc3NoY29ubmVjdC5jXQotICAgICBmaXggdGVybWlub2xvZ3k6IHdlIGRpZG4ndCBmaW5kIGEgY2VydGlmaWNhdGUgaW4ga25vd25faG9zdHMsIHdlIGZvdW5kCi0gICAgIGEgQ0Ega2V5Ci0gICAtIGRqbUBjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8xMCAwMjowODo0NAotICAgICBbY2xpZW50bG9vcC5jXQotICAgICBieiMxNjk4OiBraWxsIGNoYW5uZWwgd2hlbiBwdHkgYWxsb2NhdGlvbiByZXF1ZXN0cyBmYWlsLiBGaXhlZAotICAgICBzdHVjayBjbGllbnQgaWYgdGhlIHNlcnZlciByZWZ1c2VzIHB0eSBhbGxvY2F0aW9uLgotICAgICBvayBkdHVja2VyQCAidGhpbmsgc28iIG1hcmt1c0AKLSAgIC0gZGptQGN2cy5vcGVuYnNkLm9yZyAyMDEwLzA0LzEwIDAyOjEwOjU2Ci0gICAgIFtzc2hjb25uZWN0Mi5jXQotICAgICBzaG93IHRoZSBrZXkgdHlwZSB0aGF0IHdlIGFyZSBvZmZlcmluZyBpbiBkZWJ1ZygpLCBoZWxwcyBkaXN0aW5ndWlzaAotICAgICBiZXR3ZWVuIGNlcnRzIGFuZCBwbGFpbiBrZXlzIGFzIHRoZSBwYXRoIHRvIHRoZSBwcml2YXRlIGtleSBpcyB1c3VhbGx5Ci0gICAgIHRoZSBzYW1lLgotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDQvMTAgMDU6NDg6MTYKLSAgICAgW211eC5jXQotICAgICBmaXggTlVMTCBkZXJlZmVyZW5jZTsgZnJvbSBtYXR0aGV3LmhhdWIgQVQgYWx1bW5pLmFkZWxhaWRlLmVkdS5hdQotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDQvMTQgMjI6Mjc6NDIKLSAgICAgW3NzaF9jb25maWcuNSBzc2hjb25uZWN0LmNdCi0gICAgIGV4cGFuZCAlciA9PiByZW1vdGUgdXNlcm5hbWUgaW4gc3NoX2NvbmZpZzpQcm94eUNvbW1hbmQ7Ci0gICAgIG9rIGRlcmFhZHQgbWFya3VzCi0gICAtIG1hcmt1c0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wNC8xNSAyMDozMjo1NQotICAgICBbc3NoLXBrY3MxMS5jXQotICAgICByZXRyeSBsb29rdXAgZm9yIHByaXZhdGUga2V5IGlmIHRoZXJlJ3Mgbm8gbWF0Y2hpbmcga2V5IHdpdGggQ0tBX1NJR04KLSAgICAgYXR0cmlidXRlIGVuYWJsZWQ7IHRoaXMgZml4ZXMgZml4ZXMgTXVzY2xlQ2FyZCBzdXBwb3J0IChidWd6aWxsYSAjMTczNikKLSAgICAgb2sgZGptQAotICAgLSBkam1AY3ZzLm9wZW5ic2Qub3JnIDIwMTAvMDQvMTYgMDE6NDc6MjYKLSAgICAgW1BST1RPQ09MLmNlcnRrZXlzIGF1dGgtb3B0aW9ucy5jIGF1dGgtb3B0aW9ucy5oIGF1dGgtcnNhLmNdCi0gICAgIFthdXRoMi1wdWJrZXkuYyBhdXRoZmQuYyBrZXkuYyBrZXkuaCBteXByb3Bvc2FsLmggc3NoLWFkZC5jXQotICAgICBbc3NoLWFnZW50LmMgc3NoLWRzcy5jIHNzaC1rZXlnZW4uMSBzc2gta2V5Z2VuLmMgc3NoLXJzYS5jXQotICAgICBbc3NoY29ubmVjdC5jIHNzaGNvbm5lY3QyLmMgc3NoZC5jXQotICAgICByZXZpc2VkIGNlcnRpZmljYXRlIGZvcm1hdCBzc2gte2Rzcyxyc2F9LWNlcnQtdjAxQG9wZW5zc2guY29tIHdpdGggdGhlCi0gICAgIGZvbGxvd2luZyBjaGFuZ2VzOgotICAgICAKLSAgICAgbW92ZSB0aGUgbm9uY2UgZmllbGQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2VydGlmaWNhdGUgd2hlcmUgaXQgY2FuCi0gICAgIGJldHRlciBwcm90ZWN0IGFnYWluc3QgY2hvc2VuLXByZWZpeCBhdHRhY2tzIG9uIHRoZSBzaWduYXR1cmUgaGFzaAotICAgICAKLSAgICAgUmVuYW1lICJjb25zdHJhaW50cyIgZmllbGQgdG8gImNyaXRpY2FsIG9wdGlvbnMiCi0gICAgIAotICAgICBBZGQgYSBuZXcgbm9uLWNyaXRpY2FsICJleHRlbnNpb25zIiBmaWVsZAotICAgICAKLSAgICAgQWRkIGEgc2VyaWFsIG51bWJlcgotICAgICAKLSAgICAgVGhlIG9sZGVyIGZvcm1hdCBpcyBzdGlsbCBzdXBwb3J0IGZvciBhdXRoZW50aWNhdGlvbiBhbmQgY2VydCBnZW5lcmF0aW9uCi0gICAgICh1c2UgInNzaC1rZXlnZW4gLXQgdjAwIC1zIGNhX2tleSAuLi4iIHRvIGdlbmVyYXRlIGEgdjAwIGNlcnRpZmljYXRlKQotICAgICAKLSAgICAgb2sgbWFya3VzQApkaWZmIC0tZ2l0IGEvSU5TVEFMTCBiL0lOU1RBTEwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMzFkZWEuLjAwMDAwMDAKLS0tIGEvSU5TVEFMTAorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0xLiBQcmVyZXF1aXNpdGVzCi0tLS0tLS0tLS0tLS0tLS0tCi0KLVlvdSB3aWxsIG5lZWQgd29ya2luZyBpbnN0YWxsYXRpb25zIG9mIFpsaWIgYW5kIE9wZW5TU0wuCi0KLVpsaWIgMS4xLjQgb3IgMS4yLjEuMiBvciBncmVhdGVyIChlYWxpZXIgMS4yLnggdmVyc2lvbnMgaGF2ZSBwcm9ibGVtcyk6Ci1odHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvCi0KLU9wZW5TU0wgMC45LjYgb3IgZ3JlYXRlcjoKLWh0dHA6Ly93d3cub3BlbnNzbC5vcmcvCi0KLShPcGVuU1NMIDAuOS41YSBpcyBwYXJ0aWFsbHkgc3VwcG9ydGVkLCBidXQgc29tZSBjaXBoZXJzIChTU0ggcHJvdG9jb2wgMQotQmxvd2Zpc2gpIGRvIG5vdCB3b3JrIGNvcnJlY3RseS4pCi0KLVRoZSByZW1haW5pbmcgaXRlbXMgYXJlIG9wdGlvbmFsLgotCi1OQi4gSWYgeW91IG9wZXJhdGluZyBzeXN0ZW0gc3VwcG9ydHMgL2Rldi9yYW5kb20sIHlvdSBzaG91bGQgY29uZmlndXJlCi1PcGVuU1NMIHRvIHVzZSBpdC4gT3BlblNTSCByZWxpZXMgb24gT3BlblNTTCdzIGRpcmVjdCBzdXBwb3J0IG9mCi0vZGV2L3JhbmRvbSwgb3IgZmFpbGluZyB0aGF0LCBlaXRoZXIgcHJuZ2Qgb3IgZWdkCi0KLVBSTkdEOgotCi1JZiB5b3VyIHN5c3RlbSBsYWNrcyBrZXJuZWwtYmFzZWQgcmFuZG9tIGNvbGxlY3Rpb24sIHRoZSB1c2Ugb2YgTHV0egotSmFlbmlja2UncyBQUk5HZCBpcyByZWNvbW1lbmRlZC4KLQotaHR0cDovL3BybmdkLnNvdXJjZWZvcmdlLm5ldC8KLQotRUdEOgotCi1UaGUgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uIChFR0QpIGlzIHN1cHBvcnRlZCBpZiB5b3UgaGF2ZSBhIHN5c3RlbSB3aGljaAotbGFja3MgL2Rldi9yYW5kb20gYW5kIGRvbid0IHdhbnQgdG8gdXNlIE9wZW5TU0gncyBpbnRlcm5hbCBlbnRyb3B5IGNvbGxlY3Rpb24uCi0KLWh0dHA6Ly93d3cubG90aGFyLmNvbS90ZWNoL2NyeXB0by8KLQotUEFNOgotCi1PcGVuU1NIIGNhbiB1dGlsaXNlIFBsdWdnYWJsZSBBdXRoZW50aWNhdGlvbiBNb2R1bGVzIChQQU0pIGlmIHlvdXIKLXN5c3RlbSBzdXBwb3J0cyBpdC4gUEFNIGlzIHN0YW5kYXJkIG1vc3QgTGludXggZGlzdHJpYnV0aW9ucywgU29sYXJpcywKLUhQLVVYIDExLCBBSVggPj0gNS4yLCBGcmVlQlNEIGFuZCBOZXRCU0QuCi0KLUluZm9ybWF0aW9uIGFib3V0IHRoZSB2YXJpb3VzIFBBTSBpbXBsZW1lbnRhdGlvbnMgYXJlIGF2YWlsYWJsZToKLQotU29sYXJpcyBQQU06CWh0dHA6Ly93d3cuc3VuLmNvbS9zb2Z0d2FyZS9zb2xhcmlzL3BhbS8KLUxpbnV4IFBBTToJaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC9saWJzL3BhbS8KLU9wZW5QQU06CWh0dHA6Ly93d3cub3BlbnBhbS5vcmcvCi0KLUlmIHlvdSB3aXNoIHRvIGJ1aWxkIHRoZSBHTk9NRSBwYXNzcGhyYXNlIHJlcXVlc3RlciwgeW91IHdpbGwgbmVlZCB0aGUgR05PTUUKLWxpYnJhcmllcyBhbmQgaGVhZGVycy4KLQotR05PTUU6Ci1odHRwOi8vd3d3Lmdub21lLm9yZy8KLQotQWx0ZXJuYXRpdmVseSwgSmltIEtub2JsZSA8am1rbm9ibGVAcG9ib3guY29tPiBoYXMgd3JpdHRlbiBhbiBleGNlbGxlbnQgWDExCi1wYXNzcGhyYXNlIHJlcXVlc3Rlci4gVGhpcyBpcyBtYWludGFpbmVkIHNlcGFyYXRlbHkgYXQ6Ci0KLWh0dHA6Ly93d3cuam1rbm9ibGUubmV0L3NvZnR3YXJlL3gxMS1zc2gtYXNrcGFzcy8KLQotVENQIFdyYXBwZXJzOgotCi1JZiB5b3Ugd2lzaCB0byB1c2UgdGhlIFRDUCB3cmFwcGVycyBmdW5jdGlvbmFsaXR5IHlvdSB3aWxsIG5lZWQgYXQgbGVhc3QKLXRjcGQuaCBhbmQgbGlid3JhcC5hLCBlaXRoZXIgaW4gdGhlIHN0YW5kYXJkIGluY2x1ZGUgYW5kIGxpYnJhcnkgcGF0aHMsCi1vciBpbiB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieSAtLXdpdGgtdGNwLXdyYXBwZXJzLiAgVmVyc2lvbiA3LjYgaXMKLWtub3duIHRvIHdvcmsuCi0KLWh0dHA6Ly9mdHAucG9yY3VwaW5lLm9yZy9wdWIvc2VjdXJpdHkvaW5kZXguaHRtbAotCi1TL0tleSBMaWJyYXJpZXM6Ci0KLUlmIHlvdSB3aXNoIHRvIHVzZSAtLXdpdGgtc2tleSB0aGVuIHlvdSB3aWxsIG5lZWQgdGhlIGxpYnJhcnkgYmVsb3cKLWluc3RhbGxlZC4gIE5vIG90aGVyIFMvS2V5IGxpYnJhcnkgaXMgY3VycmVudGx5IGtub3duIHRvIGJlIHN1cHBvcnRlZC4KLQotaHR0cDovL3d3dy5zcGFyYy5zcGIuc3Uvc29sYXJpcy9za2V5LwotCi1MaWJFZGl0OgotCi1zZnRwIHN1cHBvcnRzIGNvbW1hbmQtbGluZSBlZGl0aW5nIHZpYSBOZXRCU0QncyBsaWJlZGl0LiAgSWYgeW91ciBwbGF0Zm9ybQotaGFzIGl0IGF2YWlsYWJsZSBuYXRpdmVseSB5b3UgY2FuIHVzZSB0aGF0LCBhbHRlcm5hdGl2ZWx5IHlvdSBtaWdodCB0cnkKLXRoZXNlIG11bHRpLXBsYXRmb3JtIHBvcnRzOgotCi1odHRwOi8vd3d3LnRocnlzb2VlLmRrL2VkaXRsaW5lLwotaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJlZGl0LwotCi1BdXRvY29uZjoKLQotSWYgeW91IG1vZGlmeSBjb25maWd1cmUuYWMgb3IgY29uZmlndXJlIGRvZXNuJ3QgZXhpc3QgKGVnIGlmIHlvdSBjaGVja2VkCi10aGUgY29kZSBvdXQgb2YgQ1ZTIHlvdXJzZWxmKSB0aGVuIHlvdSB3aWxsIG5lZWQgYXV0b2NvbmYtMi42MSB0byByZWJ1aWxkCi10aGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZXMgYnkgcnVubmluZyAiYXV0b3JlY29uZiIuICBFYXJsaWVyCi12ZXJzaW9ucyBtYXkgYWxzbyB3b3JrIGJ1dCB0aGlzIGlzIG5vdCBndWFyYW50ZWVkLgotCi1odHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYvCi0KLUJhc2ljIFNlY3VyaXR5IE1vZHVsZSAoQlNNKToKLQotTmF0aXZlIEJTTSBzdXBwb3J0IGlzIGtub3cgdG8gZXhpc3QgaW4gU29sYXJpcyBmcm9tIGF0IGxlYXN0IDIuNS4xLAotRnJlZUJTRCA2LjEgYW5kIE9TIFguICBBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHVzZSB0aGUgT3BlbkJTTQotaW1wbGVtZW50YXRpb24gKGh0dHA6Ly93d3cub3BlbmJzbS5vcmcpLgotCi0KLTIuIEJ1aWxkaW5nIC8gSW5zdGFsbGF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UbyBpbnN0YWxsIE9wZW5TU0ggd2l0aCBkZWZhdWx0IG9wdGlvbnM6Ci0KLS4vY29uZmlndXJlCi1tYWtlCi1tYWtlIGluc3RhbGwKLQotVGhpcyB3aWxsIGluc3RhbGwgdGhlIE9wZW5TU0ggYmluYXJpZXMgaW4gL3Vzci9sb2NhbC9iaW4sIGNvbmZpZ3VyYXRpb24gZmlsZXMKLWluIC91c3IvbG9jYWwvZXRjLCB0aGUgc2VydmVyIGluIC91c3IvbG9jYWwvc2JpbiwgZXRjLiBUbyBzcGVjaWZ5IGEgZGlmZmVyZW50Ci1pbnN0YWxsYXRpb24gcHJlZml4LCB1c2UgdGhlIC0tcHJlZml4IG9wdGlvbiB0byBjb25maWd1cmU6Ci0KLS4vY29uZmlndXJlIC0tcHJlZml4PS9vcHQKLW1ha2UKLW1ha2UgaW5zdGFsbAotCi1XaWxsIGluc3RhbGwgT3BlblNTSCBpbiAvb3B0L3tiaW4sZXRjLGxpYixzYmlufS4gWW91IGNhbiBhbHNvIG92ZXJyaWRlCi1zcGVjaWZpYyBwYXRocywgZm9yIGV4YW1wbGU6Ci0KLS4vY29uZmlndXJlIC0tcHJlZml4PS9vcHQgLS1zeXNjb25mZGlyPS9ldGMvc3NoCi1tYWtlCi1tYWtlIGluc3RhbGwKLQotVGhpcyB3aWxsIGluc3RhbGwgdGhlIGJpbmFyaWVzIGluIC9vcHQve2JpbixsaWIsc2Jpbn0sIGJ1dCB3aWxsIHBsYWNlIHRoZQotY29uZmlndXJhdGlvbiBmaWxlcyBpbiAvZXRjL3NzaC4KLQotSWYgeW91IGFyZSB1c2luZyBQcml2aWxlZ2UgU2VwYXJhdGlvbiAod2hpY2ggaXMgZW5hYmxlZCBieSBkZWZhdWx0KQotdGhlbiB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gY3JlYXRlIHRoZSB1c2VyLCBncm91cCBhbmQgZGlyZWN0b3J5IHVzZWQgYnkKLXNzaGQgZm9yIHByaXZpbGVnZSBzZXBhcmF0aW9uLiAgU2VlIFJFQURNRS5wcml2c2VwIGZvciBkZXRhaWxzLgotCi1JZiB5b3UgYXJlIHVzaW5nIFBBTSwgeW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IGluc3RhbGwgYSBQQU0gY29udHJvbAotZmlsZSBhcyAiL2V0Yy9wYW0uZC9zc2hkIiAob3Igd2hlcmV2ZXIgeW91ciBzeXN0ZW0gcHJlZmVycyB0byBrZWVwCi10aGVtKS4gIE5vdGUgdGhhdCB0aGUgc2VydmljZSBuYW1lIHVzZWQgdG8gc3RhcnQgUEFNIGlzIF9fcHJvZ25hbWUsCi13aGljaCBpcyB0aGUgYmFzZW5hbWUgb2YgdGhlIHBhdGggb2YgeW91ciBzc2hkIChlLmcuLCB0aGUgc2VydmljZSBuYW1lCi1mb3IgL3Vzci9zYmluL29zc2hkIHdpbGwgYmUgb3NzaGQpLiAgSWYgeW91IGhhdmUgcmVuYW1lZCB5b3VyIHNzaGQKLWV4ZWN1dGFibGUsIHlvdXIgUEFNIGNvbmZpZ3VyYXRpb24gbWF5IG5lZWQgdG8gYmUgbW9kaWZpZWQuCi0KLUEgZ2VuZXJpYyBQQU0gY29uZmlndXJhdGlvbiBpcyBpbmNsdWRlZCBhcyAiY29udHJpYi9zc2hkLnBhbS5nZW5lcmljIiwKLXlvdSBtYXkgbmVlZCB0byBlZGl0IGl0IGJlZm9yZSB1c2luZyBpdCBvbiB5b3VyIHN5c3RlbS4gSWYgeW91IGFyZQotdXNpbmcgYSByZWNlbnQgdmVyc2lvbiBvZiBSZWQgSGF0IExpbnV4LCB0aGUgY29uZmlnIGZpbGUgaW4KLWNvbnRyaWIvcmVkaGF0L3NzaGQucGFtIHNob3VsZCBiZSBtb3JlIHVzZWZ1bC4gIEZhaWx1cmUgdG8gaW5zdGFsbCBhCi12YWxpZCBQQU0gZmlsZSBtYXkgcmVzdWx0IGluIGFuIGluYWJpbGl0eSB0byB1c2UgcGFzc3dvcmQKLWF1dGhlbnRpY2F0aW9uLiAgT24gSFAtVVggMTEgYW5kIFNvbGFyaXMsIHRoZSBzdGFuZGFyZCAvZXRjL3BhbS5jb25mCi1jb25maWd1cmF0aW9uIHdpbGwgd29yayB3aXRoIHNzaGQgKHNzaGQgd2lsbCBtYXRjaCB0aGUgb3RoZXIgc2VydmljZQotbmFtZSkuCi0KLVRoZXJlIGFyZSBhIGZldyBvdGhlciBvcHRpb25zIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0OgotCi0tLXdpdGgtYXVkaXQ9W21vZHVsZV0gZW5hYmxlIGFkZGl0aW9uYWwgYXVkaXRpbmcgdmlhIHRoZSBzcGVjaWZpZWQgbW9kdWxlLgotQ3VycmVudGx5LCBkcml2ZXJzIGZvciAiZGVidWciIChhZGRpdGlvbmFsIGluZm8gdmlhIHN5c2xvZykgYW5kICJic20iCi0oU3VuJ3MgQmFzaWMgU2VjdXJpdHkgTW9kdWxlKSBhcmUgc3VwcG9ydGVkLgotCi0tLXdpdGgtcGFtIGVuYWJsZXMgUEFNIHN1cHBvcnQuIElmIFBBTSBzdXBwb3J0IGlzIGNvbXBpbGVkIGluLCBpdCBtdXN0Ci1hbHNvIGJlIGVuYWJsZWQgaW4gc3NoZF9jb25maWcgKHJlZmVyIHRvIHRoZSBVc2VQQU0gZGlyZWN0aXZlKS4KLQotLS13aXRoLXBybmdkLXNvY2tldD0vc29tZS9maWxlIGFsbG93cyB5b3UgdG8gZW5hYmxlIEVHRCBvciBQUk5HRAotc3VwcG9ydCBhbmQgdG8gc3BlY2lmeSBhIFBSTkdkIHNvY2tldC4gVXNlIHRoaXMgaWYgeW91ciBVbml4IGxhY2tzCi0vZGV2L3JhbmRvbSBhbmQgeW91IGRvbid0IHdhbnQgdG8gdXNlIE9wZW5TU0gncyBidWlsdGluIGVudHJvcHkKLWNvbGxlY3Rpb24gc3VwcG9ydC4KLQotLS13aXRoLXBybmdkLXBvcnQ9cG9ydG51bSBhbGxvd3MgeW91IHRvIGVuYWJsZSBFR0Qgb3IgUFJOR0Qgc3VwcG9ydAotYW5kIHRvIHNwZWNpZnkgYSBFR0QgbG9jYWxob3N0IFRDUCBwb3J0LiBVc2UgdGhpcyBpZiB5b3VyIFVuaXggbGFja3MKLS9kZXYvcmFuZG9tIGFuZCB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgT3BlblNTSCdzIGJ1aWx0aW4gZW50cm9weQotY29sbGVjdGlvbiBzdXBwb3J0LgotCi0tLXdpdGgtbGFzdGxvZz1GSUxFIHdpbGwgc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3Rsb2cgZmlsZS4KLS4vY29uZmlndXJlIHNlYXJjaGVzIGEgZmV3IGxvY2F0aW9ucyBmb3IgbGFzdGxvZywgYnV0IG1heSBub3QgZmluZAotaXQgaWYgbGFzdGxvZyBpcyBpbnN0YWxsZWQgaW4gYSBkaWZmZXJlbnQgcGxhY2UuCi0KLS0td2l0aG91dC1sYXN0bG9nIHdpbGwgZGlzYWJsZSBsYXN0bG9nIHN1cHBvcnQgZW50aXJlbHkuCi0KLS0td2l0aC1vc2ZzaWEsIC0td2l0aG91dC1vc2ZzaWEgd2lsbCBlbmFibGUgb3IgZGlzYWJsZSBPU0YxJ3MgU2VjdXJpdHkKLUludGVncmF0aW9uIEFyY2hpdGVjdHVyZS4gIFRoZSBkZWZhdWx0IGZvciBPU0YxIG1hY2hpbmVzIGlzIGVuYWJsZS4KLQotLS13aXRoLXNrZXk9UEFUSCB3aWxsIGVuYWJsZSBTL0tleSBvbmUgdGltZSBwYXNzd29yZCBzdXBwb3J0LiBZb3Ugd2lsbAotbmVlZCB0aGUgUy9LZXkgbGlicmFyaWVzIGFuZCBoZWFkZXIgZmlsZXMgaW5zdGFsbGVkIGZvciB0aGlzIHRvIHdvcmsuCi0KLS0td2l0aC10Y3Atd3JhcHBlcnMgd2lsbCBlbmFibGUgVENQIFdyYXBwZXJzICgvZXRjL2hvc3RzLmFsbG93fGRlbnkpCi1zdXBwb3J0LgotCi0tLXdpdGgtbWQ1LXBhc3N3b3JkcyB3aWxsIGVuYWJsZSB0aGUgdXNlIG9mIE1ENSBwYXNzd29yZHMuIEVuYWJsZSB0aGlzCi1pZiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gdXNlcyBNRDUgcGFzc3dvcmRzIGFuZCB0aGUgc3lzdGVtIGNyeXB0KCkgZG9lcwotbm90IHN1cHBvcnQgdGhlbSBkaXJlY3RseSAoc2VlIHRoZSBjcnlwdCgzLzNjKSBtYW4gcGFnZSkuIElmIGVuYWJsZWQsIHRoZQotcmVzdWx0aW5nIGJpbmFyeSB3aWxsIHN1cHBvcnQgYm90aCBNRDUgYW5kIHRyYWRpdGlvbmFsIGNyeXB0IHBhc3N3b3Jkcy4KLQotLS13aXRoLXV0bXB4IGVuYWJsZXMgdXRtcHggc3VwcG9ydC4gdXRtcHggc3VwcG9ydCBpcyBhdXRvbWF0aWMgZm9yCi1zb21lIHBsYXRmb3Jtcy4KLQotLS13aXRob3V0LXNoYWRvdyBkaXNhYmxlcyBzaGFkb3cgcGFzc3dvcmQgc3VwcG9ydC4KLQotLS13aXRoLWlwYWRkci1kaXNwbGF5IGZvcmNlcyB0aGUgdXNlIG9mIGEgbnVtZXJpYyBJUCBhZGRyZXNzIGluIHRoZQotJERJU1BMQVkgZW52aXJvbm1lbnQgdmFyaWFibGUuIFNvbWUgYnJva2VuIHN5c3RlbXMgbmVlZCB0aGlzLgotCi0tLXdpdGgtZGVmYXVsdC1wYXRoPVBBVEggYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEgZGVmYXVsdCAkUEFUSCBmb3Igc2Vzc2lvbnMKLXN0YXJ0ZWQgYnkgc3NoZC4gVGhpcyByZXBsYWNlcyB0aGUgc3RhbmRhcmQgcGF0aCBlbnRpcmVseS4KLQotLS13aXRoLXBpZC1kaXI9UEFUSCBzcGVjaWZpZXMgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgc3NoZC5waWQgZmlsZSBpcwotY3JlYXRlZC4KLQotLS13aXRoLXhhdXRoPVBBVEggc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgeGF1dGggYmluYXJ5Ci0KLS0td2l0aC1zc2wtZGlyPURJUiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgd2hlcmUgeW91ciBPcGVuU1NMIGxpYnJhcmllcwotYXJlIGluc3RhbGxlZC4KLQotLS13aXRoLXNzbC1lbmdpbmUgZW5hYmxlcyBPcGVuU1NMJ3MgKGhhcmR3YXJlKSBFTkdJTkUgc3VwcG9ydAotCi0tLXdpdGgtNGluNiBDaGVjayBmb3IgSVB2NCBpbiBJUHY2IG1hcHBlZCBhZGRyZXNzZXMgYW5kIGNvbnZlcnQgdGhlbSB0bwotcmVhbCAoQUZfSU5FVCkgSVB2NCBhZGRyZXNzZXMuIFdvcmtzIGFyb3VuZCBzb21lIHF1aXJrcyBvbiBMaW51eC4KLQotSWYgeW91IG5lZWQgdG8gcGFzcyBzcGVjaWFsIG9wdGlvbnMgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciwgeW91Ci1jYW4gc3BlY2lmeSB0aGVzZSBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVmb3JlIHJ1bm5pbmcgLi9jb25maWd1cmUuCi1Gb3IgZXhhbXBsZToKLQotQ0ZMQUdTPSItTyAtbTQ4NiIgTERGTEFHUz0iLXMiIExJQlM9Ii1scnViYmlzaCIgTEQ9Ii91c3IvZm9vL2xkIiAuL2NvbmZpZ3VyZQotCi0zLiBDb25maWd1cmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIGluc3RhbGxlZCBieSBpbiAke3ByZWZpeH0vZXRjIG9yCi13aGF0ZXZlciB5b3Ugc3BlY2lmaWVkIGFzIHlvdXIgLS1zeXNjb25mZGlyICgvdXNyL2xvY2FsL2V0YyBieSBkZWZhdWx0KS4KLQotVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgaW5zdGFudGx5IHVzYWJsZSwgdGhvdWdoIHlvdSBzaG91bGQKLXJldmlldyBpdCB0byBlbnN1cmUgdGhhdCBpdCBtYXRjaGVzIHlvdXIgc2VjdXJpdHkgcmVxdWlyZW1lbnRzLgotCi1UbyBnZW5lcmF0ZSBhIGhvc3Qga2V5LCBydW4gIm1ha2UgaG9zdC1rZXkiLiBBbHRlcm5hdGVseSB5b3UgY2FuIGRvIHNvCi1tYW51YWxseSB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgotCi0gICAgc3NoLWtleWdlbiAtdCByc2ExIC1mIC9ldGMvc3NoL3NzaF9ob3N0X2tleSAtTiAiIgotICAgIHNzaC1rZXlnZW4gLXQgcnNhIC1mIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkgLU4gIiIKLSAgICBzc2gta2V5Z2VuIC10IGRzYSAtZiAvZXRjL3NzaC9zc2hfaG9zdF9kc2Ffa2V5IC1OICIiCi0KLVJlcGxhY2luZyAvZXRjL3NzaCB3aXRoIHRoZSBjb3JyZWN0IHBhdGggdG8gdGhlIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5LgotKCR7cHJlZml4fS9ldGMgb3Igd2hhdGV2ZXIgeW91IHNwZWNpZmllZCB3aXRoIC0tc3lzY29uZmRpciBkdXJpbmcKLWNvbmZpZ3VyYXRpb24pCi0KLUlmIHlvdSBoYXZlIGNvbmZpZ3VyZWQgT3BlblNTSCB3aXRoIEVHRCBzdXBwb3J0LCBlbnN1cmUgdGhhdCBFR0QgaXMKLXJ1bm5pbmcgYW5kIGhhcyBjb2xsZWN0ZWQgc29tZSBFbnRyb3B5LgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmF0aW9uLCBwbGVhc2UgcmVmZXIgdG8gdGhlIG1hbnVhbCBwYWdlcwotZm9yIHNzaGQsIHNzaCBhbmQgc3NoLWFnZW50LgotCi00LiAoT3B0aW9uYWwpIFNlbmQgc3VydmV5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSQgbWFrZSBzdXJ2ZXkKLVtjaGVjayB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgInN1cnZleSIgdG8gZW5zdXJlIHRoZXJlJ3Mgbm8gaW5mb3JtYXRpb24KLXRoYXQgeW91IGNvbnNpZGVyIHNlbnNpdGl2ZV0KLSQgbWFrZSBzZW5kLXN1cnZleQotCi1UaGlzIHdpbGwgc2VuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQKLWhvc3QgdG8gYSBzdXJ2ZXkgYWRkcmVzcy4gIFRoaXMgd2lsbCBoZWxwIGRldGVybWluZSB3aGljaCBjb25maWd1cmF0aW9ucwotYXJlIGFjdHVhbGx5IGluIHVzZSwgYW5kIHdoYXQgdmFsaWQgY29tYmluYXRpb25zIG9mIGNvbmZpZ3VyZSBvcHRpb25zCi1leGlzdC4gIFRoZSByYXcgZGF0YSBpcyBhdmFpbGFibGUgb25seSB0byB0aGUgT3BlblNTSCBkZXZlbG9wZXJzLCBob3dldmVyCi1zdW1tYXJ5IGRhdGEgbWF5IGJlIHB1Ymxpc2hlZC4KLQotNS4gUHJvYmxlbXM/Ci0tLS0tLS0tLS0tLS0KLQotSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgY29tcGlsaW5nLCBpbnN0YWxsaW5nIG9yIHJ1bm5pbmcgT3BlblNTSC4KLVBsZWFzZSByZWZlciB0byB0aGUgInJlcG9ydGluZyBidWdzIiBzZWN0aW9uIG9mIHRoZSB3ZWJwYWdlIGF0Ci1odHRwOi8vd3d3Lm9wZW5zc2guY29tLwotCi0KLSRJZDogSU5TVEFMTCx2IDEuODYgMjAxMS8wNS8wNSAwMzo0ODozNyBkam0gRXhwICQKZGlmZiAtLWdpdCBhL0xJQ0VOQ0UgYi9MSUNFTkNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBkNmZkLi4wMDAwMDAwCi0tLSBhL0xJQ0VOQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIE9wZW5TU0ggc29mdHdhcmUuCi0KLVRoZSBsaWNlbmNlcyB3aGljaCBjb21wb25lbnRzIG9mIHRoaXMgc29mdHdhcmUgZmFsbCB1bmRlciBhcmUgYXMKLWZvbGxvd3MuICBGaXJzdCwgd2Ugd2lsbCBzdW1tYXJpemUgYW5kIHNheSB0aGF0IGFsbCBjb21wb25lbnRzCi1hcmUgdW5kZXIgYSBCU0QgbGljZW5jZSwgb3IgYSBsaWNlbmNlIG1vcmUgZnJlZSB0aGFuIHRoYXQuCi0KLU9wZW5TU0ggY29udGFpbnMgbm8gR1BMIGNvZGUuCi0KLTEpCi0gICAgICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICAgICAqCi0gICAgICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICAgICAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gICAgICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICAgICAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAgICAgKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0KLSAgICBbVGF0dSBjb250aW51ZXNdCi0gICAgICogIEhvd2V2ZXIsIEkgYW0gbm90IGltcGx5aW5nIHRvIGdpdmUgYW55IGxpY2Vuc2VzIHRvIGFueSBwYXRlbnRzIG9yCi0gICAgICogY29weXJpZ2h0cyBoZWxkIGJ5IHRoaXJkIHBhcnRpZXMsIGFuZCB0aGUgc29mdHdhcmUgaW5jbHVkZXMgcGFydHMgdGhhdAotICAgICAqIGFyZSBub3QgdW5kZXIgbXkgZGlyZWN0IGNvbnRyb2wuICBBcyBmYXIgYXMgSSBrbm93LCBhbGwgaW5jbHVkZWQKLSAgICAgKiBzb3VyY2UgY29kZSBpcyB1c2VkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgcmVsZXZhbnQgbGljZW5zZSBhZ3JlZW1lbnRzCi0gICAgICogYW5kIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UgKHRoZSBHTlUgbGljZW5zZSBiZWluZyB0aGUgbW9zdAotICAgICAqIHJlc3RyaWN0aXZlKTsgc2VlIGJlbG93IGZvciBkZXRhaWxzLgotCi0gICAgW0hvd2V2ZXIsIG5vbmUgb2YgdGhhdCB0ZXJtIGlzIHJlbGV2YW50IGF0IHRoaXMgcG9pbnQgaW4gdGltZS4gIEFsbCBvZgotICAgIHRoZXNlIHJlc3RyaWN0aXZlbHkgbGljZW5jZWQgc29mdHdhcmUgY29tcG9uZW50cyB3aGljaCBoZSB0YWxrcyBhYm91dAotICAgIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gT3BlblNTSCwgaS5lLiwKLQotICAgICAtIFJTQSBpcyBubyBsb25nZXIgaW5jbHVkZWQsIGZvdW5kIGluIHRoZSBPcGVuU1NMIGxpYnJhcnkKLSAgICAgLSBJREVBIGlzIG5vIGxvbmdlciBpbmNsdWRlZCwgaXRzIHVzZSBpcyBkZXByZWNhdGVkCi0gICAgIC0gREVTIGlzIG5vdyBleHRlcm5hbCwgaW4gdGhlIE9wZW5TU0wgbGlicmFyeQotICAgICAtIEdNUCBpcyBubyBsb25nZXIgdXNlZCwgYW5kIGluc3RlYWQgd2UgY2FsbCBCTiBjb2RlIGZyb20gT3BlblNTTAotICAgICAtIFpsaWIgaXMgbm93IGV4dGVybmFsLCBpbiBhIGxpYnJhcnkKLSAgICAgLSBUaGUgbWFrZS1zc2gta25vd24taG9zdHMgc2NyaXB0IGlzIG5vIGxvbmdlciBpbmNsdWRlZAotICAgICAtIFRTUyBoYXMgYmVlbiByZW1vdmVkCi0gICAgIC0gTUQ1IGlzIG5vdyBleHRlcm5hbCwgaW4gdGhlIE9wZW5TU0wgbGlicmFyeQotICAgICAtIFJDNCBzdXBwb3J0IGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggQVJDNCBzdXBwb3J0IGZyb20gT3BlblNTTAotICAgICAtIEJsb3dmaXNoIGlzIG5vdyBleHRlcm5hbCwgaW4gdGhlIE9wZW5TU0wgbGlicmFyeQotCi0gICAgW1RoZSBsaWNlbmNlIGNvbnRpbnVlc10KLQotICAgIE5vdGUgdGhhdCBhbnkgaW5mb3JtYXRpb24gYW5kIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtcyB1c2VkIGluIHRoaXMKLSAgICBzb2Z0d2FyZSBhcmUgcHVibGljbHkgYXZhaWxhYmxlIG9uIHRoZSBJbnRlcm5ldCBhbmQgYXQgYW55IG1ham9yCi0gICAgYm9va3N0b3JlLCBzY2llbnRpZmljIGxpYnJhcnksIGFuZCBwYXRlbnQgb2ZmaWNlIHdvcmxkd2lkZS4gIE1vcmUKLSAgICBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgZS5nLiBhdCAiaHR0cDovL3d3dy5jcy5odXQuZmkvY3J5cHRvIi4KLQotICAgIFRoZSBsZWdhbCBzdGF0dXMgb2YgdGhpcyBwcm9ncmFtIGlzIHNvbWUgY29tYmluYXRpb24gb2YgYWxsIHRoZXNlCi0gICAgcGVybWlzc2lvbnMgYW5kIHJlc3RyaWN0aW9ucy4gIFVzZSBvbmx5IGF0IHlvdXIgb3duIHJlc3BvbnNpYmlsaXR5LgotICAgIFlvdSB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBhbnkgbGVnYWwgY29uc2VxdWVuY2VzIHlvdXJzZWxmOyBJIGFtIG5vdAotICAgIG1ha2luZyBhbnkgY2xhaW1zIHdoZXRoZXIgcG9zc2Vzc2luZyBvciB1c2luZyB0aGlzIGlzIGxlZ2FsIG9yIG5vdCBpbgotICAgIHlvdXIgY291bnRyeSwgYW5kIEkgYW0gbm90IHRha2luZyBhbnkgcmVzcG9uc2liaWxpdHkgb24geW91ciBiZWhhbGYuCi0KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgICBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotICAgIEZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotICAgIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLSAgICBQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotICAgIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotICAgIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLSAgICBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLSAgICBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAgIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotICAgIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLSAgICBSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotICAgIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotICAgIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLSAgICBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLSAgICBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotICAgIFBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotMikKLSAgICBUaGUgMzItYml0IENSQyBjb21wZW5zYXRpb24gYXR0YWNrIGRldGVjdG9yIGluIGRlYXR0YWNrLmMgd2FzCi0gICAgY29udHJpYnV0ZWQgYnkgQ09SRSBTREkgUy5BLiB1bmRlciBhIEJTRC1zdHlsZSBsaWNlbnNlLgotCi0gICAgICogQ3J5cHRvZ3JhcGhpYyBhdHRhY2sgZGV0ZWN0b3IgZm9yIHNzaCAtIHNvdXJjZSBjb2RlCi0gICAgICoKLSAgICAgKiBDb3B5cmlnaHQgKGMpIDE5OTggQ09SRSBTREkgUy5BLiwgQnVlbm9zIEFpcmVzLCBBcmdlbnRpbmEuCi0gICAgICoKLSAgICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5Ci0gICAgICogZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdAotICAgICAqIHRoaXMgY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZC4KLSAgICAgKgotICAgICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gICAgICogV0FSUkFOVElFUyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQ09SRSBTREkgUy5BLiBCRQotICAgICAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSBPUgotICAgICAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBSRVNVTFRJTkcgRlJPTSBUSEUgVVNFIE9SIE1JU1VTRSBPRiBUSElTCi0gICAgICogU09GVFdBUkUuCi0gICAgICoKLSAgICAgKiBBcmllbCBGdXRvcmFuc2t5IDxmdXRvQGNvcmUtc2RpLmNvbT4KLSAgICAgKiA8aHR0cDovL3d3dy5jb3JlLXNkaS5jb20+Ci0KLTMpCi0gICAgc3NoLWtleXNjYW4gd2FzIGNvbnRyaWJ1dGVkIGJ5IERhdmlkIE1hemllcmVzIHVuZGVyIGEgQlNELXN0eWxlCi0gICAgbGljZW5zZS4KLQotICAgICAqIENvcHlyaWdodCAxOTk1LCAxOTk2IGJ5IERhdmlkIE1hemllcmVzIDxkbUBsY3MubWl0LmVkdT4uCi0gICAgICoKLSAgICAgKiBNb2RpZmljYXRpb24gYW5kIHJlZGlzdHJpYnV0aW9uIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGlzCi0gICAgICogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgZHVlIGNyZWRpdCBpcyBnaXZlbiB0byB0aGUgYXV0aG9yIGFuZCB0aGUKLSAgICAgKiBPcGVuQlNEIHByb2plY3QgYnkgbGVhdmluZyB0aGlzIGNvcHlyaWdodCBub3RpY2UgaW50YWN0LgotCi00KQotICAgIFRoZSBSaWpuZGFlbCBpbXBsZW1lbnRhdGlvbiBieSBWaW5jZW50IFJpam1lbiwgQW50b29uIEJvc3NlbGFlcnMKLSAgICBhbmQgUGF1bG8gQmFycmV0byBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiBhbmQgZGlzdHJpYnV0ZWQKLSAgICB3aXRoIHRoZSBmb2xsb3dpbmcgbGljZW5zZToKLQotICAgICAqIEB2ZXJzaW9uIDMuMCAoRGVjZW1iZXIgMjAwMCkKLSAgICAgKgotICAgICAqIE9wdGltaXNlZCBBTlNJIEMgY29kZSBmb3IgdGhlIFJpam5kYWVsIGNpcGhlciAobm93IEFFUykKLSAgICAgKgotICAgICAqIEBhdXRob3IgVmluY2VudCBSaWptZW4gPHZpbmNlbnQucmlqbWVuQGVzYXQua3VsZXV2ZW4uYWMuYmU+Ci0gICAgICogQGF1dGhvciBBbnRvb24gQm9zc2VsYWVycyA8YW50b29uLmJvc3NlbGFlcnNAZXNhdC5rdWxldXZlbi5hYy5iZT4KLSAgICAgKiBAYXV0aG9yIFBhdWxvIEJhcnJldG8gPHBhdWxvLmJhcnJldG9AdGVycmEuY29tLmJyPgotICAgICAqCi0gICAgICogVGhpcyBjb2RlIGlzIGhlcmVieSBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4uCi0gICAgICoKLSAgICAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1JTICcnQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MKLSAgICAgKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICAgICAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICAgICAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09OVFJJQlVUT1JTIEJFCi0gICAgICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICAgICAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gICAgICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gICAgICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gICAgICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAgICAgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAotICAgICAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLTUpCi0gICAgT25lIGNvbXBvbmVudCBvZiB0aGUgc3NoIHNvdXJjZSBjb2RlIGlzIHVuZGVyIGEgMy1jbGF1c2UgQlNEIGxpY2Vuc2UsCi0gICAgaGVsZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBzaW5jZSB3ZSBwdWxsZWQgdGhlc2UgcGFydHMgZnJvbQotICAgIG9yaWdpbmFsIEJlcmtlbGV5IGNvZGUuCi0KLSAgICAgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTAsIDE5OTIsIDE5OTMsIDE5OTUKLSAgICAgKiAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAqCi0gICAgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gICAgICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gICAgICogYXJlIG1ldDoKLSAgICAgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gICAgICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gICAgICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gICAgICoKLSAgICAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICAgICAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICAgICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gICAgICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gICAgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAgICAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICAgICAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICAgICAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gICAgICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICAgICAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAgICAgKiBTVUNIIERBTUFHRS4KLQotNikKLSAgICBSZW1haW5pbmcgY29tcG9uZW50cyBvZiB0aGUgc29mdHdhcmUgYXJlIHByb3ZpZGVkIHVuZGVyIGEgc3RhbmRhcmQKLSAgICAyLXRlcm0gQlNEIGxpY2VuY2Ugd2l0aCB0aGUgZm9sbG93aW5nIG5hbWVzIGFzIGNvcHlyaWdodCBob2xkZXJzOgotCi0JTWFya3VzIEZyaWVkbAotCVRoZW8gZGUgUmFhZHQKLQlOaWVscyBQcm92b3MKLQlEdWcgU29uZwotCUFhcm9uIENhbXBiZWxsCi0JRGFtaWVuIE1pbGxlcgotCUtldmluIFN0ZXZlcwotCURhbmllbCBLb3VyaWwKLQlXZXNsZXkgR3JpZmZpbgotCVBlciBBbGxhbnNzb24KLQlOaWxzIE5vcmRtYW4KLQlTaW1vbiBXaWxraW5zb24KLQotICAgIFBvcnRhYmxlIE9wZW5TU0ggYWRkaXRpb25hbGx5IGluY2x1ZGVzIGNvZGUgZnJvbSB0aGUgZm9sbG93aW5nIGNvcHlyaWdodAotICAgIGhvbGRlcnMsIGFsc28gdW5kZXIgdGhlIDItdGVybSBCU0QgbGljZW5zZToKLQotCUJlbiBMaW5kc3Ryb20KLQlUaW0gUmljZQotCUFuZHJlIEx1Y2FzCi0JQ2hyaXMgQWRhbXMKLQlDb3Jpbm5hIFZpbnNjaGVuCi0JQ3JheSBJbmMuCi0JRGVuaXMgUGFya2VyCi0JR2VydCBEb2VyaW5nCi0JSmFrb2IgU2NobHl0ZXIKLQlKYXNvbiBEb3ducwotCUp1aGEgWXJq9mzkCi0JTWljaGFlbCBTdG9uZQotCU5ldHdvcmtzIEFzc29jaWF0ZXMgVGVjaG5vbG9neSwgSW5jLgotCVNvbGFyIERlc2lnbmVyCi0JVG9kZCBDLiBNaWxsZXIKLQlXYXluZSBTY2hyb2VkZXIKLQlXaWxsaWFtIEpvbmVzCi0JRGFycmVuIFR1Y2tlcgotCVN1biBNaWNyb3N5c3RlbXMKLQlUaGUgU0NPIEdyb3VwCi0JRGFuaWVsIFdhbHNoCi0JUmVkIEhhdCwgSW5jCi0KLSAgICAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAgICAgKiBhcmUgbWV0OgotICAgICAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgICoKLSAgICAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICAgICAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAgICAgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICAgICAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAgICAgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAgICAgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gICAgICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gICAgICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICAgICAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICAgICAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLTgpIFBvcnRhYmxlIE9wZW5TU0ggY29udGFpbnMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGxpY2Vuc2VzOgotCi0gICAgYSkgbWQ1Y3J5cHQuYywgbWQ1Y3J5cHQuaAotCi0JICogIlRIRSBCRUVSLVdBUkUgTElDRU5TRSIgKFJldmlzaW9uIDQyKToKLQkgKiA8cGhrQGxvZ2luLmRrbmV0LmRrPiB3cm90ZSB0aGlzIGZpbGUuICBBcyBsb25nIGFzIHlvdSByZXRhaW4gdGhpcwotCSAqIG5vdGljZSB5b3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBzdHVmZi4gSWYgd2UgbWVldAotCSAqIHNvbWUgZGF5LCBhbmQgeW91IHRoaW5rIHRoaXMgc3R1ZmYgaXMgd29ydGggaXQsIHlvdSBjYW4gYnV5IG1lIGEKLQkgKiBiZWVyIGluIHJldHVybi4gICBQb3VsLUhlbm5pbmcgS2FtcAotCi0gICAgYikgc25wcmludGYgcmVwbGFjZW1lbnQKLQotCSogQ29weXJpZ2h0IFBhdHJpY2sgUG93ZWxsIDE5OTUKLQkqIFRoaXMgY29kZSBpcyBiYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgUGF0cmljayBQb3dlbGwKLQkqIChwYXBvd2VsbEBhc3RhcnQuY29tKSBJdCBtYXkgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2UgYXMgbG9uZyBhcyB0aGlzCi0JKiBub3RpY2UgcmVtYWlucyBpbnRhY3Qgb24gYWxsIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLQotICAgIGMpIENvbXBhdGliaWxpdHkgY29kZSAob3BlbmJzZC1jb21wYXQpCi0KLSAgICAgICBBcGFydCBmcm9tIHRoZSBwcmV2aW91c2x5IG1lbnRpb25lZCBsaWNlbnNlcywgdmFyaW91cyBwaWVjZXMgb2YgY29kZQotICAgICAgIGluIHRoZSBvcGVuYnNkLWNvbXBhdC8gc3ViZGlyZWN0b3J5IGFyZSBsaWNlbnNlZCBhcyBmb2xsb3dzOgotCi0gICAgICAgU29tZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIGEgMy10ZXJtIEJTRCBsaWNlbnNlLCB0byB0aGUgZm9sbG93aW5nCi0gICAgICAgY29weXJpZ2h0IGhvbGRlcnM6Ci0KLQlUb2RkIEMuIE1pbGxlcgotCVRoZW8gZGUgUmFhZHQKLQlEYW1pZW4gTWlsbGVyCi0JRXJpYyBQLiBBbGxtYW4KLQlUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0JQ29uc3RhbnRpbiBTLiBTdmludHNvZmYKLQotCSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0JKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLQkqIGFyZSBtZXQ6Ci0JKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotCSogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCSogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLQkqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLQkqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0JKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotCSogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0JKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQkqCi0JKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotCSogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0JKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotCSogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0JKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotCSogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLQkqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotCSogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLQkqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLQkqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLQkqIFNVQ0ggREFNQUdFLgotCi0gICAgICAgU29tZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIGFuIElTQy1zdHlsZSBsaWNlbnNlLCB0byB0aGUgZm9sbG93aW5nCi0gICAgICAgY29weXJpZ2h0IGhvbGRlcnM6Ci0KLQlJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVtLgotCVRvZGQgQy4gTWlsbGVyCi0JUmV5ayBGbG9ldGVyCi0JQ2hhZCBNeW5oaWVyCi0KLQkqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotCSogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotCSogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLQkqCi0JKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVE9ERCBDLiBNSUxMRVIgRElTQ0xBSU1TIEFMTAotCSogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTCi0JKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRPREQgQy4gTUlMTEVSIEJFIExJQUJMRQotCSogRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLQkqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLQkqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLQkqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLSAgICAgICBTb21lIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgYSBNSVQtc3R5bGUgbGljZW5zZSB0byB0aGUgZm9sbG93aW5nCi0gICAgICAgY29weXJpZ2h0IGhvbGRlcnM6Ci0KLQlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotCSogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKLQkqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCi0JKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgotCSogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKLQkqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCi0JKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgotCSogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKLQkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0JKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgotCSogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKLQkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0JKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgotCSogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKLQkqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCi0JKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgotCSogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKLQkqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCi0JKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotCSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLQkqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCi0JKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgotCSogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKLQkqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0tLS0tLS0KLSRPcGVuQlNEOiBMSUNFTkNFLHYgMS4xOSAyMDA0LzA4LzMwIDA5OjE4OjA4IG1hcmt1cyBFeHAgJApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlM2FhNi4uMDAwMDAwMAotLS0gYS9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDQ0MiArMCwwIEBACi0jICRJZDogTWFrZWZpbGUuaW4sdiAxLjMyNSAyMDExLzA4LzA1IDIwOjE1OjE4IGRqbSBFeHAgJAotCi0jIHVuY29tbWVudCBpZiB5b3UgcnVuIGEgbm9uIGJvdXJuZSBjb21wYXRhYmxlIHNoZWxsLiBJZS4gY3NoCi0jU0hFTEwgPSBAU0hACi0KLUFVVE9SRUNPTkY9YXV0b3JlY29uZgotCi1wcmVmaXg9QHByZWZpeEAKLWV4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKLWJpbmRpcj1AYmluZGlyQAotc2JpbmRpcj1Ac2JpbmRpckAKLWxpYmV4ZWNkaXI9QGxpYmV4ZWNkaXJACi1kYXRhZGlyPUBkYXRhZGlyQAotZGF0YXJvb3RkaXI9QGRhdGFyb290ZGlyQAotbWFuZGlyPUBtYW5kaXJACi1tYW5zdWJkaXI9QG1hbnN1YmRpckAKLXN5c2NvbmZkaXI9QHN5c2NvbmZkaXJACi1waWRkaXI9QHBpZGRpckAKLXNyY2Rpcj1Ac3JjZGlyQAotdG9wX3NyY2Rpcj1AdG9wX3NyY2RpckAKLQotREVTVERJUj0KLVZQQVRIPUBzcmNkaXJACi1TU0hfUFJPR1JBTT1AYmluZGlyQC9zc2gKLUFTS1BBU1NfUFJPR1JBTT0kKGxpYmV4ZWNkaXIpL3NzaC1hc2twYXNzCi1TRlRQX1NFUlZFUj0kKGxpYmV4ZWNkaXIpL3NmdHAtc2VydmVyCi1TU0hfS0VZU0lHTj0kKGxpYmV4ZWNkaXIpL3NzaC1rZXlzaWduCi1TU0hfUEtDUzExX0hFTFBFUj0kKGxpYmV4ZWNkaXIpL3NzaC1wa2NzMTEtaGVscGVyCi1QUklWU0VQX1BBVEg9QFBSSVZTRVBfUEFUSEAKLVNTSF9QUklWU0VQX1VTRVI9QFNTSF9QUklWU0VQX1VTRVJACi1TVFJJUF9PUFQ9QFNUUklQX09QVEAKLQotUEFUSFM9IC1EU1NIRElSPVwiJChzeXNjb25mZGlyKVwiIFwKLQktRF9QQVRIX1NTSF9QUk9HUkFNPVwiJChTU0hfUFJPR1JBTSlcIiBcCi0JLURfUEFUSF9TU0hfQVNLUEFTU19ERUZBVUxUPVwiJChBU0tQQVNTX1BST0dSQU0pXCIgXAotCS1EX1BBVEhfU0ZUUF9TRVJWRVI9XCIkKFNGVFBfU0VSVkVSKVwiIFwKLQktRF9QQVRIX1NTSF9LRVlfU0lHTj1cIiQoU1NIX0tFWVNJR04pXCIgXAotCS1EX1BBVEhfU1NIX1BLQ1MxMV9IRUxQRVI9XCIkKFNTSF9QS0NTMTFfSEVMUEVSKVwiIFwKLQktRF9QQVRIX1NTSF9QSURESVI9XCIkKHBpZGRpcilcIiBcCi0JLURfUEFUSF9QUklWU0VQX0NIUk9PVF9ESVI9XCIkKFBSSVZTRVBfUEFUSClcIiBcCi0KLUNDPUBDQ0AKLUxEPUBMREAKLUNGTEFHUz1AQ0ZMQUdTQAotQ1BQRkxBR1M9LUkuIC1JJChzcmNkaXIpIEBDUFBGTEFHU0AgJChQQVRIUykgQERFRlNACi1MSUJTPUBMSUJTQAotU1NITElCUz1AU1NITElCU0AKLVNTSERMSUJTPUBTU0hETElCU0AKLUxJQkVESVQ9QExJQkVESVRACi1BUj1AQVJACi1BV0s9QEFXS0AKLVJBTkxJQj1AUkFOTElCQAotSU5TVEFMTD1ASU5TVEFMTEAKLVBFUkw9QFBFUkxACi1TRUQ9QFNFREAKLUVOVD1ARU5UQAotWEFVVEhfUEFUSD1AWEFVVEhfUEFUSEAKLUxERkxBR1M9LUwuIC1Mb3BlbmJzZC1jb21wYXQvIEBMREZMQUdTQAotRVhFRVhUPUBFWEVFWFRACi1NQU5GTVQ9QE1BTkZNVEAKLQotVEFSR0VUUz1zc2gkKEVYRUVYVCkgc3NoZCQoRVhFRVhUKSBzc2gtYWRkJChFWEVFWFQpIHNzaC1rZXlnZW4kKEVYRUVYVCkgc3NoLWtleXNjYW4ke0VYRUVYVH0gc3NoLWtleXNpZ24ke0VYRUVYVH0gc3NoLXBrY3MxMS1oZWxwZXIkKEVYRUVYVCkgc3NoLWFnZW50JChFWEVFWFQpIHNjcCQoRVhFRVhUKSBzZnRwLXNlcnZlciQoRVhFRVhUKSBzZnRwJChFWEVFWFQpCi0KLUxJQlNTSF9PQkpTPWFjc3MubyBhdXRoZmQubyBhdXRoZmlsZS5vIGJ1ZmF1eC5vIGJ1ZmJuLm8gYnVmZmVyLm8gXAotCWNhbm9ob3N0Lm8gY2hhbm5lbHMubyBjaXBoZXIubyBjaXBoZXItYWNzcy5vIGNpcGhlci1hZXMubyBcCi0JY2lwaGVyLWJmMS5vIGNpcGhlci1jdHIubyBjaXBoZXItM2RlczEubyBjbGVhbnVwLm8gXAotCWNvbXBhdC5vIGNvbXByZXNzLm8gY3JjMzIubyBkZWF0dGFjay5vIGZhdGFsLm8gaG9zdGZpbGUubyBcCi0JbG9nLm8gbWF0Y2gubyBtZC1zaGEyNTYubyBtb2R1bGkubyBuY2hhbi5vIHBhY2tldC5vIFwKLQlyZWFkcGFzcy5vIHJzYS5vIHR0eW1vZGVzLm8geG1hbGxvYy5vIGFkZHJtYXRjaC5vIFwKLQlhdG9taWNpby5vIGtleS5vIGRpc3BhdGNoLm8ga2V4Lm8gbWFjLm8gdWlkc3dhcC5vIHV1ZW5jb2RlLm8gbWlzYy5vIFwKLQltb25pdG9yX2ZkcGFzcy5vIHJpam5kYWVsLm8gc3NoLWRzcy5vIHNzaC1lY2RzYS5vIHNzaC1yc2EubyBkaC5vIFwKLQlrZXhkaC5vIGtleGdleC5vIGtleGRoYy5vIGtleGdleGMubyBidWZlYy5vIGtleGVjZGgubyBrZXhlY2RoYy5vIFwKLQltc2cubyBwcm9ncmVzc21ldGVyLm8gZG5zLm8gZW50cm9weS5vIGdzcy1nZW5yLm8gdW1hYy5vIGpwYWtlLm8gXAotCXNjaG5vcnIubyBzc2gtcGtjczExLm8KLQotU1NIT0JKUz0gc3NoLm8gcmVhZGNvbmYubyBjbGllbnRsb29wLm8gc3NodHR5Lm8gXAotCXNzaGNvbm5lY3QubyBzc2hjb25uZWN0MS5vIHNzaGNvbm5lY3QyLm8gbXV4Lm8gXAotCXJvYW1pbmdfY29tbW9uLm8gcm9hbWluZ19jbGllbnQubwotCi1TU0hET0JKUz1zc2hkLm8gYXV0aC1yaG9zdHMubyBhdXRoLXBhc3N3ZC5vIGF1dGgtcnNhLm8gYXV0aC1yaC1yc2EubyBcCi0JYXVkaXQubyBhdWRpdC1ic20ubyBhdWRpdC1saW51eC5vIHBsYXRmb3JtLm8gXAotCXNzaHB0eS5vIHNzaGxvZ2luLm8gc2VydmNvbmYubyBzZXJ2ZXJsb29wLm8gXAotCWF1dGgubyBhdXRoMS5vIGF1dGgyLm8gYXV0aC1vcHRpb25zLm8gc2Vzc2lvbi5vIFwKLQlhdXRoLWNoYWxsLm8gYXV0aDItY2hhbGwubyBncm91cGFjY2Vzcy5vIFwKLQlhdXRoLXNrZXkubyBhdXRoLWJzZGF1dGgubyBhdXRoMi1ob3N0YmFzZWQubyBhdXRoMi1rYmRpbnQubyBcCi0JYXV0aDItbm9uZS5vIGF1dGgyLXBhc3N3ZC5vIGF1dGgyLXB1YmtleS5vIGF1dGgyLWpwYWtlLm8gXAotCW1vbml0b3JfbW0ubyBtb25pdG9yLm8gbW9uaXRvcl93cmFwLm8ga2V4ZGhzLm8ga2V4Z2V4cy5vIGtleGVjZGhzLm8gXAotCWF1dGgta3JiNS5vIFwKLQlhdXRoMi1nc3MubyBnc3Mtc2Vydi5vIGdzcy1zZXJ2LWtyYjUubyBcCi0JbG9naW5yZWMubyBhdXRoLXBhbS5vIGF1dGgtc2hhZG93Lm8gYXV0aC1zaWEubyBtZDVjcnlwdC5vIFwKLQlzZnRwLXNlcnZlci5vIHNmdHAtY29tbW9uLm8gXAotCXJvYW1pbmdfY29tbW9uLm8gcm9hbWluZ19zZXJ2Lm8gXAotCXNhbmRib3gtbnVsbC5vIHNhbmRib3gtcmxpbWl0Lm8gc2FuZGJveC1zeXN0cmFjZS5vIHNhbmRib3gtZGFyd2luLm8KLQotTUFOUEFHRVMJPSBtb2R1bGkuNS5vdXQgc2NwLjEub3V0IHNzaC1hZGQuMS5vdXQgc3NoLWFnZW50LjEub3V0IHNzaC1rZXlnZW4uMS5vdXQgc3NoLWtleXNjYW4uMS5vdXQgc3NoLjEub3V0IHNzaGQuOC5vdXQgc2Z0cC1zZXJ2ZXIuOC5vdXQgc2Z0cC4xLm91dCBzc2gta2V5c2lnbi44Lm91dCBzc2gtcGtjczExLWhlbHBlci44Lm91dCBzc2hkX2NvbmZpZy41Lm91dCBzc2hfY29uZmlnLjUub3V0Ci1NQU5QQUdFU19JTgk9IG1vZHVsaS41IHNjcC4xIHNzaC1hZGQuMSBzc2gtYWdlbnQuMSBzc2gta2V5Z2VuLjEgc3NoLWtleXNjYW4uMSBzc2guMSBzc2hkLjggc2Z0cC1zZXJ2ZXIuOCBzZnRwLjEgc3NoLWtleXNpZ24uOCBzc2gtcGtjczExLWhlbHBlci44IHNzaGRfY29uZmlnLjUgc3NoX2NvbmZpZy41Ci1NQU5UWVBFCQk9IEBNQU5UWVBFQAotCi1DT05GSUdGSUxFUz1zc2hkX2NvbmZpZy5vdXQgc3NoX2NvbmZpZy5vdXQgbW9kdWxpLm91dAotQ09ORklHRklMRVNfSU49c3NoZF9jb25maWcgc3NoX2NvbmZpZyBtb2R1bGkKLQotUEFUSFNVQlMJPSBcCi0JLWUgJ3N8L2V0Yy9zc2gvc3NoX2NvbmZpZ3wkKHN5c2NvbmZkaXIpL3NzaF9jb25maWd8ZycgXAotCS1lICdzfC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0c3wkKHN5c2NvbmZkaXIpL3NzaF9rbm93bl9ob3N0c3xnJyBcCi0JLWUgJ3N8L2V0Yy9zc2gvc3NoZF9jb25maWd8JChzeXNjb25mZGlyKS9zc2hkX2NvbmZpZ3xnJyBcCi0JLWUgJ3N8L3Vzci9saWJleGVjfCQobGliZXhlY2Rpcil8ZycgXAotCS1lICdzfC9ldGMvc2hvc3RzLmVxdWl2fCQoc3lzY29uZmRpcikvc2hvc3RzLmVxdWl2fGcnIFwKLQktZSAnc3wvZXRjL3NzaC9zc2hfaG9zdF9rZXl8JChzeXNjb25mZGlyKS9zc2hfaG9zdF9rZXl8ZycgXAotCS1lICdzfC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleXwkKHN5c2NvbmZkaXIpL3NzaF9ob3N0X2VjZHNhX2tleXxnJyBcCi0JLWUgJ3N8L2V0Yy9zc2gvc3NoX2hvc3RfZHNhX2tleXwkKHN5c2NvbmZkaXIpL3NzaF9ob3N0X2RzYV9rZXl8ZycgXAotCS1lICdzfC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXl8JChzeXNjb25mZGlyKS9zc2hfaG9zdF9yc2Ffa2V5fGcnIFwKLQktZSAnc3wvdmFyL3J1bi9zc2hkLnBpZHwkKHBpZGRpcikvc3NoZC5waWR8ZycgXAotCS1lICdzfC9ldGMvbW9kdWxpfCQoc3lzY29uZmRpcikvbW9kdWxpfGcnIFwKLQktZSAnc3wvZXRjL3NzaC9tb2R1bGl8JChzeXNjb25mZGlyKS9tb2R1bGl8ZycgXAotCS1lICdzfC9ldGMvc3NoL3NzaHJjfCQoc3lzY29uZmRpcikvc3NocmN8ZycgXAotCS1lICdzfC91c3IvWDExUjYvYmluL3hhdXRofCQoWEFVVEhfUEFUSCl8ZycgXAotCS1lICdzfC92YXIvZW1wdHl8JChQUklWU0VQX1BBVEgpfGcnIFwKLQktZSAnc3wvdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbnxAdXNlcl9wYXRoQHxnJwotCi1GSVhQQVRIU0NNRAk9ICQoU0VEKSAkKFBBVEhTVUJTKQotCi1hbGw6ICQoQ09ORklHRklMRVMpICQoTUFOUEFHRVMpICQoVEFSR0VUUykKLQotJChMSUJTU0hfT0JKUyk6IE1ha2VmaWxlLmluIGNvbmZpZy5oCi0kKFNTSE9CSlMpOiBNYWtlZmlsZS5pbiBjb25maWcuaAotJChTU0hET0JKUyk6IE1ha2VmaWxlLmluIGNvbmZpZy5oCi0KLS5jLm86Ci0JJChDQykgJChDRkxBR1MpICQoQ1BQRkxBR1MpIC1jICQ8Ci0KLUxJQkNPTVBBVD1vcGVuYnNkLWNvbXBhdC9saWJvcGVuYnNkLWNvbXBhdC5hCi0kKExJQkNPTVBBVCk6IGFsd2F5cwotCShjZCBvcGVuYnNkLWNvbXBhdCAmJiAkKE1BS0UpKQotYWx3YXlzOgotCi1saWJzc2guYTogJChMSUJTU0hfT0JKUykKLQkkKEFSKSBydiAkQCAkKExJQlNTSF9PQkpTKQotCSQoUkFOTElCKSAkQAotCi1zc2gkKEVYRUVYVCk6ICQoTElCQ09NUEFUKSBsaWJzc2guYSAkKFNTSE9CSlMpCi0JJChMRCkgLW8gJEAgJChTU0hPQkpTKSAkKExERkxBR1MpIC1sc3NoIC1sb3BlbmJzZC1jb21wYXQgJChTU0hMSUJTKSAkKExJQlMpCi0KLXNzaGQkKEVYRUVYVCk6IGxpYnNzaC5hCSQoTElCQ09NUEFUKSAkKFNTSERPQkpTKQotCSQoTEQpIC1vICRAICQoU1NIRE9CSlMpICQoTERGTEFHUykgLWxzc2ggLWxvcGVuYnNkLWNvbXBhdCAkKFNTSERMSUJTKSAkKExJQlMpCi0KLXNjcCQoRVhFRVhUKTogJChMSUJDT01QQVQpIGxpYnNzaC5hIHNjcC5vIHByb2dyZXNzbWV0ZXIubwotCSQoTEQpIC1vICRAIHNjcC5vIHByb2dyZXNzbWV0ZXIubyBidWZhdXgubyAkKExERkxBR1MpIC1sc3NoIC1sb3BlbmJzZC1jb21wYXQgJChMSUJTKQotCi1zc2gtYWRkJChFWEVFWFQpOiAkKExJQkNPTVBBVCkgbGlic3NoLmEgc3NoLWFkZC5vCi0JJChMRCkgLW8gJEAgc3NoLWFkZC5vICQoTERGTEFHUykgLWxzc2ggLWxvcGVuYnNkLWNvbXBhdCAkKExJQlMpCi0KLXNzaC1hZ2VudCQoRVhFRVhUKTogJChMSUJDT01QQVQpIGxpYnNzaC5hIHNzaC1hZ2VudC5vIHNzaC1wa2NzMTEtY2xpZW50Lm8KLQkkKExEKSAtbyAkQCBzc2gtYWdlbnQubyBzc2gtcGtjczExLWNsaWVudC5vICQoTERGTEFHUykgLWxzc2ggLWxvcGVuYnNkLWNvbXBhdCAkKExJQlMpCi0KLXNzaC1rZXlnZW4kKEVYRUVYVCk6ICQoTElCQ09NUEFUKSBsaWJzc2guYSBzc2gta2V5Z2VuLm8KLQkkKExEKSAtbyAkQCBzc2gta2V5Z2VuLm8gJChMREZMQUdTKSAtbHNzaCAtbG9wZW5ic2QtY29tcGF0ICQoTElCUykKLQotc3NoLWtleXNpZ24kKEVYRUVYVCk6ICQoTElCQ09NUEFUKSBsaWJzc2guYSBzc2gta2V5c2lnbi5vIHJvYW1pbmdfZHVtbXkubyByZWFkY29uZi5vCi0JJChMRCkgLW8gJEAgc3NoLWtleXNpZ24ubyByZWFkY29uZi5vIHJvYW1pbmdfZHVtbXkubyAkKExERkxBR1MpIC1sc3NoIC1sb3BlbmJzZC1jb21wYXQgJChMSUJTKQotCi1zc2gtcGtjczExLWhlbHBlciQoRVhFRVhUKTogJChMSUJDT01QQVQpIGxpYnNzaC5hIHNzaC1wa2NzMTEtaGVscGVyLm8gc3NoLXBrY3MxMS5vCi0JJChMRCkgLW8gJEAgc3NoLXBrY3MxMS1oZWxwZXIubyBzc2gtcGtjczExLm8gJChMREZMQUdTKSAtbHNzaCAtbG9wZW5ic2QtY29tcGF0IC1sc3NoIC1sb3BlbmJzZC1jb21wYXQgJChMSUJTKQotCi1zc2gta2V5c2NhbiQoRVhFRVhUKTogJChMSUJDT01QQVQpIGxpYnNzaC5hIHNzaC1rZXlzY2FuLm8gcm9hbWluZ19kdW1teS5vCi0JJChMRCkgLW8gJEAgc3NoLWtleXNjYW4ubyByb2FtaW5nX2R1bW15Lm8gJChMREZMQUdTKSAtbHNzaCAtbG9wZW5ic2QtY29tcGF0IC1sc3NoICQoTElCUykKLQotc2Z0cC1zZXJ2ZXIkKEVYRUVYVCk6ICQoTElCQ09NUEFUKSBsaWJzc2guYSBzZnRwLm8gc2Z0cC1jb21tb24ubyBzZnRwLXNlcnZlci5vIHNmdHAtc2VydmVyLW1haW4ubwotCSQoTEQpIC1vICRAIHNmdHAtc2VydmVyLm8gc2Z0cC1jb21tb24ubyBzZnRwLXNlcnZlci1tYWluLm8gJChMREZMQUdTKSAtbHNzaCAtbG9wZW5ic2QtY29tcGF0ICQoTElCUykKLQotc2Z0cCQoRVhFRVhUKTogJChMSUJDT01QQVQpIGxpYnNzaC5hIHNmdHAubyBzZnRwLWNsaWVudC5vIHNmdHAtY29tbW9uLm8gc2Z0cC1nbG9iLm8gcHJvZ3Jlc3NtZXRlci5vCi0JJChMRCkgLW8gJEAgcHJvZ3Jlc3NtZXRlci5vIHNmdHAubyBzZnRwLWNsaWVudC5vIHNmdHAtY29tbW9uLm8gc2Z0cC1nbG9iLm8gJChMREZMQUdTKSAtbHNzaCAtbG9wZW5ic2QtY29tcGF0ICQoTElCUykgJChMSUJFRElUKQotCi0jIHRlc3QgZHJpdmVyIGZvciB0aGUgbG9naW5yZWMgY29kZSAtIG5vdCBidWlsdCBieSBkZWZhdWx0Ci1sb2dpbnRlc3Q6IGxvZ2ludGVzdC5vICQoTElCQ09NUEFUKSBsaWJzc2guYSBsb2dpbnJlYy5vCi0JJChMRCkgLW8gJEAgbG9naW50ZXN0Lm8gJChMREZMQUdTKSBsb2dpbnJlYy5vIC1sb3BlbmJzZC1jb21wYXQgLWxzc2ggJChMSUJTKQotCi0kKE1BTlBBR0VTKTogJChNQU5QQUdFU19JTikKLQlpZiB0ZXN0ICIkKE1BTlRZUEUpIiA9ICJjYXQiOyB0aGVuIFwKLQkJbWFucGFnZT0kKHNyY2RpcikvYGVjaG8gJEAgfCBzZWQgJ3MvXC5bMS05XVwub3V0JCQvXC4wLydgOyBcCi0JZWxzZSBcCi0JCW1hbnBhZ2U9JChzcmNkaXIpL2BlY2hvICRAIHwgc2VkICdzL1wub3V0JCQvLydgOyBcCi0JZmk7IFwKLQlpZiB0ZXN0ICIkKE1BTlRZUEUpIiA9ICJtYW4iOyB0aGVuIFwKLQkJJChGSVhQQVRIU0NNRCkgJCR7bWFucGFnZX0gfCAkKEFXSykgLWYgJChzcmNkaXIpL21kb2MybWFuLmF3ayA+ICRAOyBcCi0JZWxzZSBcCi0JCSQoRklYUEFUSFNDTUQpICQke21hbnBhZ2V9ID4gJEA7IFwKLQlmaQotCi0kKENPTkZJR0ZJTEVTKTogJChDT05GSUdGSUxFU19JTikKLQljb25mZmlsZT1gZWNobyAkQCB8IHNlZCAncy8ub3V0JCQvLydgOyBcCi0JJChGSVhQQVRIU0NNRCkgJChzcmNkaXIpLyQke2NvbmZmaWxlfSA+ICRACi0KLSMgZmFrZSBydWxlIHRvIHN0b3AgbWFrZSB0cnlpbmcgdG8gY29tcGlsZSBtb2R1bGkubyBpbnRvIGEgYmluYXJ5ICJtb2R1bGkubyIKLW1vZHVsaToKLQllY2hvCi0KLWNsZWFuOglyZWdyZXNzY2xlYW4KLQlybSAtZiAqLm8gKi5hICQoVEFSR0VUUykgbG9naW50ZXN0IGNvbmZpZy5jYWNoZSBjb25maWcubG9nCi0Jcm0gLWYgKi5vdXQgY29yZSBzdXJ2ZXkKLQkoY2Qgb3BlbmJzZC1jb21wYXQgJiYgJChNQUtFKSBjbGVhbikKLQotZGlzdGNsZWFuOglyZWdyZXNzY2xlYW4KLQlybSAtZiAqLm8gKi5hICQoVEFSR0VUUykgbG9naW50ZXN0IGNvbmZpZy5jYWNoZSBjb25maWcubG9nCi0Jcm0gLWYgKi5vdXQgY29yZSBvcGVuc3NoZC5pbml0IG9wZW5zc2gueG1sCi0Jcm0gLWYgTWFrZWZpbGUgYnVpbGRwa2cuc2ggY29uZmlnLmggY29uZmlnLnN0YXR1cwotCXJtIC1mIHN1cnZleS5zaCBvcGVuYnNkLWNvbXBhdC9yZWdyZXNzL01ha2VmaWxlICp+IAotCXJtIC1yZiBhdXRvbTR0ZS5jYWNoZQotCShjZCBvcGVuYnNkLWNvbXBhdCAmJiAkKE1BS0UpIGRpc3RjbGVhbikKLQlpZiB0ZXN0IC1kIHBrZyA7IHRoZW4gXAotCQlybSAtZnIgcGtnIDsgXAotCWZpCi0KLXZlcnljbGVhbjogZGlzdGNsZWFuCi0Jcm0gLWYgY29uZmlndXJlIGNvbmZpZy5oLmluICouMAotCi1jbGVhbmRpcjogdmVyeWNsZWFuCi0KLW1ycHJvcGVyOiB2ZXJ5Y2xlYW4KLQotcmVhbGNsZWFuOiB2ZXJ5Y2xlYW4KLQotY2F0bWFuLWRvOgotCUBmb3IgZiBpbiAkKE1BTlBBR0VTX0lOKSA7IGRvIFwKLQkJYmFzZT1gZWNobyAkJGYgfCBzZWQgJ3MvXC4uKiQkLy8nYCA7IFwKLQkJZWNobyAiJCRmIC0+ICQkYmFzZS4wIiA7IFwKLQkJJChNQU5GTVQpICQkZiB8IGNhdCAtdiB8IHNlZCAtZSAncy8uXF5ILy9nJyBcCi0JCQk+JCRiYXNlLjAgOyBcCi0JZG9uZQotCi1kaXN0cHJlcDogY2F0bWFuLWRvCi0JJChBVVRPUkVDT05GKQotCS1ybSAtcmYgYXV0b200dGUuY2FjaGUKLQotaW5zdGFsbDogJChDT05GSUdGSUxFUykgJChNQU5QQUdFUykgJChUQVJHRVRTKSBpbnN0YWxsLWZpbGVzIGluc3RhbGwtc3lzY29uZiBob3N0LWtleSBjaGVjay1jb25maWcKLWluc3RhbGwtbm9rZXlzOiAkKENPTkZJR0ZJTEVTKSAkKE1BTlBBR0VTKSAkKFRBUkdFVFMpIGluc3RhbGwtZmlsZXMgaW5zdGFsbC1zeXNjb25mCi1pbnN0YWxsLW5vc3lzY29uZjogJChDT05GSUdGSUxFUykgJChNQU5QQUdFUykgJChUQVJHRVRTKSBpbnN0YWxsLWZpbGVzCi0KLWNoZWNrLWNvbmZpZzoKLQktJChERVNURElSKSQoc2JpbmRpcikvc3NoZCAtdCAtZiAkKERFU1RESVIpJChzeXNjb25mZGlyKS9zc2hkX2NvbmZpZwotCi1pbnN0YWxsLWZpbGVzOgotCSQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKGJpbmRpcikKLQkkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKERFU1RESVIpJChzYmluZGlyKQotCSQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKG1hbmRpcikKLQkkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTEKLQkkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTUKLQkkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTgKLQkkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKERFU1RESVIpJChsaWJleGVjZGlyKQotCSh1bWFzayAwMjIgOyAkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKERFU1RESVIpJChQUklWU0VQX1BBVEgpKQotCSQoSU5TVEFMTCkgLW0gMDc1NSAkKFNUUklQX09QVCkgc3NoJChFWEVFWFQpICQoREVTVERJUikkKGJpbmRpcikvc3NoJChFWEVFWFQpCi0JJChJTlNUQUxMKSAtbSAwNzU1ICQoU1RSSVBfT1BUKSBzY3AkKEVYRUVYVCkgJChERVNURElSKSQoYmluZGlyKS9zY3AkKEVYRUVYVCkKLQkkKElOU1RBTEwpIC1tIDA3NTUgJChTVFJJUF9PUFQpIHNzaC1hZGQkKEVYRUVYVCkgJChERVNURElSKSQoYmluZGlyKS9zc2gtYWRkJChFWEVFWFQpCi0JJChJTlNUQUxMKSAtbSAwNzU1ICQoU1RSSVBfT1BUKSBzc2gtYWdlbnQkKEVYRUVYVCkgJChERVNURElSKSQoYmluZGlyKS9zc2gtYWdlbnQkKEVYRUVYVCkKLQkkKElOU1RBTEwpIC1tIDA3NTUgJChTVFJJUF9PUFQpIHNzaC1rZXlnZW4kKEVYRUVYVCkgJChERVNURElSKSQoYmluZGlyKS9zc2gta2V5Z2VuJChFWEVFWFQpCi0JJChJTlNUQUxMKSAtbSAwNzU1ICQoU1RSSVBfT1BUKSBzc2gta2V5c2NhbiQoRVhFRVhUKSAkKERFU1RESVIpJChiaW5kaXIpL3NzaC1rZXlzY2FuJChFWEVFWFQpCi0JJChJTlNUQUxMKSAtbSAwNzU1ICQoU1RSSVBfT1BUKSBzc2hkJChFWEVFWFQpICQoREVTVERJUikkKHNiaW5kaXIpL3NzaGQkKEVYRUVYVCkKLQkkKElOU1RBTEwpIC1tIDQ3MTEgJChTVFJJUF9PUFQpIHNzaC1rZXlzaWduJChFWEVFWFQpICQoREVTVERJUikkKFNTSF9LRVlTSUdOKSQoRVhFRVhUKQotCSQoSU5TVEFMTCkgLW0gMDc1NSAkKFNUUklQX09QVCkgc3NoLXBrY3MxMS1oZWxwZXIkKEVYRUVYVCkgJChERVNURElSKSQoU1NIX1BLQ1MxMV9IRUxQRVIpJChFWEVFWFQpCi0JJChJTlNUQUxMKSAtbSAwNzU1ICQoU1RSSVBfT1BUKSBzZnRwJChFWEVFWFQpICQoREVTVERJUikkKGJpbmRpcikvc2Z0cCQoRVhFRVhUKQotCSQoSU5TVEFMTCkgLW0gMDc1NSAkKFNUUklQX09QVCkgc2Z0cC1zZXJ2ZXIkKEVYRUVYVCkgJChERVNURElSKSQoU0ZUUF9TRVJWRVIpJChFWEVFWFQpCi0JJChJTlNUQUxMKSAtbSA2NDQgc3NoLjEub3V0ICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMS9zc2guMQotCSQoSU5TVEFMTCkgLW0gNjQ0IHNjcC4xLm91dCAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTEvc2NwLjEKLQkkKElOU1RBTEwpIC1tIDY0NCBzc2gtYWRkLjEub3V0ICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMS9zc2gtYWRkLjEKLQkkKElOU1RBTEwpIC1tIDY0NCBzc2gtYWdlbnQuMS5vdXQgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcikxL3NzaC1hZ2VudC4xCi0JJChJTlNUQUxMKSAtbSA2NDQgc3NoLWtleWdlbi4xLm91dCAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTEvc3NoLWtleWdlbi4xCi0JJChJTlNUQUxMKSAtbSA2NDQgc3NoLWtleXNjYW4uMS5vdXQgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcikxL3NzaC1rZXlzY2FuLjEKLQkkKElOU1RBTEwpIC1tIDY0NCBtb2R1bGkuNS5vdXQgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcik1L21vZHVsaS41Ci0JJChJTlNUQUxMKSAtbSA2NDQgc3NoZF9jb25maWcuNS5vdXQgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcik1L3NzaGRfY29uZmlnLjUKLQkkKElOU1RBTEwpIC1tIDY0NCBzc2hfY29uZmlnLjUub3V0ICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpNS9zc2hfY29uZmlnLjUKLQkkKElOU1RBTEwpIC1tIDY0NCBzc2hkLjgub3V0ICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpOC9zc2hkLjgKLQkkKElOU1RBTEwpIC1tIDY0NCBzZnRwLjEub3V0ICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMS9zZnRwLjEKLQkkKElOU1RBTEwpIC1tIDY0NCBzZnRwLXNlcnZlci44Lm91dCAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTgvc2Z0cC1zZXJ2ZXIuOAotCSQoSU5TVEFMTCkgLW0gNjQ0IHNzaC1rZXlzaWduLjgub3V0ICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpOC9zc2gta2V5c2lnbi44Ci0JJChJTlNUQUxMKSAtbSA2NDQgc3NoLXBrY3MxMS1oZWxwZXIuOC5vdXQgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcik4L3NzaC1wa2NzMTEtaGVscGVyLjgKLQktcm0gLWYgJChERVNURElSKSQoYmluZGlyKS9zbG9naW4KLQlsbiAtcyAuL3NzaCQoRVhFRVhUKSAkKERFU1RESVIpJChiaW5kaXIpL3Nsb2dpbgotCS1ybSAtZiAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTEvc2xvZ2luLjEKLQlsbiAtcyAuL3NzaC4xICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMS9zbG9naW4uMQotCi1pbnN0YWxsLXN5c2NvbmY6Ci0JaWYgWyAhIC1kICQoREVTVERJUikkKHN5c2NvbmZkaXIpIF07IHRoZW4gXAotCQkkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKERFU1RESVIpJChzeXNjb25mZGlyKTsgXAotCWZpCi0JQGlmIFsgISAtZiAkKERFU1RESVIpJChzeXNjb25mZGlyKS9zc2hfY29uZmlnIF07IHRoZW4gXAotCQkkKElOU1RBTEwpIC1tIDY0NCBzc2hfY29uZmlnLm91dCAkKERFU1RESVIpJChzeXNjb25mZGlyKS9zc2hfY29uZmlnOyBcCi0JZWxzZSBcCi0JCWVjaG8gIiQoREVTVERJUikkKHN5c2NvbmZkaXIpL3NzaF9jb25maWcgYWxyZWFkeSBleGlzdHMsIGluc3RhbGwgd2lsbCBub3Qgb3ZlcndyaXRlIjsgXAotCWZpCi0JQGlmIFsgISAtZiAkKERFU1RESVIpJChzeXNjb25mZGlyKS9zc2hkX2NvbmZpZyBdOyB0aGVuIFwKLQkJJChJTlNUQUxMKSAtbSA2NDQgc3NoZF9jb25maWcub3V0ICQoREVTVERJUikkKHN5c2NvbmZkaXIpL3NzaGRfY29uZmlnOyBcCi0JZWxzZSBcCi0JCWVjaG8gIiQoREVTVERJUikkKHN5c2NvbmZkaXIpL3NzaGRfY29uZmlnIGFscmVhZHkgZXhpc3RzLCBpbnN0YWxsIHdpbGwgbm90IG92ZXJ3cml0ZSI7IFwKLQlmaQotCUBpZiBbICEgLWYgJChERVNURElSKSQoc3lzY29uZmRpcikvbW9kdWxpIF07IHRoZW4gXAotCQlpZiBbIC1mICQoREVTVERJUikkKHN5c2NvbmZkaXIpL3ByaW1lcyBdOyB0aGVuIFwKLQkJCWVjaG8gIm1vdmluZyAkKERFU1RESVIpJChzeXNjb25mZGlyKS9wcmltZXMgdG8gJChERVNURElSKSQoc3lzY29uZmRpcikvbW9kdWxpIjsgXAotCQkJbXYgIiQoREVTVERJUikkKHN5c2NvbmZkaXIpL3ByaW1lcyIgIiQoREVTVERJUikkKHN5c2NvbmZkaXIpL21vZHVsaSI7IFwKLQkJZWxzZSBcCi0JCQkkKElOU1RBTEwpIC1tIDY0NCBtb2R1bGkub3V0ICQoREVTVERJUikkKHN5c2NvbmZkaXIpL21vZHVsaTsgXAotCQlmaSA7IFwKLQllbHNlIFwKLQkJZWNobyAiJChERVNURElSKSQoc3lzY29uZmRpcikvbW9kdWxpIGFscmVhZHkgZXhpc3RzLCBpbnN0YWxsIHdpbGwgbm90IG92ZXJ3cml0ZSI7IFwKLQlmaQotCi1ob3N0LWtleTogc3NoLWtleWdlbiQoRVhFRVhUKQotCUBpZiBbIC16ICIkKERFU1RESVIpIiBdIDsgdGhlbiBcCi0JCWlmIFsgLWYgIiQoc3lzY29uZmRpcikvc3NoX2hvc3Rfa2V5IiBdIDsgdGhlbiBcCi0JCQllY2hvICIkKHN5c2NvbmZkaXIpL3NzaF9ob3N0X2tleSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcuIiA7IFwKLQkJZWxzZSBcCi0JCQkuL3NzaC1rZXlnZW4gLXQgcnNhMSAtZiAkKHN5c2NvbmZkaXIpL3NzaF9ob3N0X2tleSAtTiAiIiA7IFwKLQkJZmkgOyBcCi0JCWlmIFsgLWYgJChzeXNjb25mZGlyKS9zc2hfaG9zdF9kc2Ffa2V5IF0gOyB0aGVuIFwKLQkJCWVjaG8gIiQoc3lzY29uZmRpcikvc3NoX2hvc3RfZHNhX2tleSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcuIiA7IFwKLQkJZWxzZSBcCi0JCQkuL3NzaC1rZXlnZW4gLXQgZHNhIC1mICQoc3lzY29uZmRpcikvc3NoX2hvc3RfZHNhX2tleSAtTiAiIiA7IFwKLQkJZmkgOyBcCi0JCWlmIFsgLWYgJChzeXNjb25mZGlyKS9zc2hfaG9zdF9yc2Ffa2V5IF0gOyB0aGVuIFwKLQkJCWVjaG8gIiQoc3lzY29uZmRpcikvc3NoX2hvc3RfcnNhX2tleSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcuIiA7IFwKLQkJZWxzZSBcCi0JCQkuL3NzaC1rZXlnZW4gLXQgcnNhIC1mICQoc3lzY29uZmRpcikvc3NoX2hvc3RfcnNhX2tleSAtTiAiIiA7IFwKLQkJZmkgOyBcCi0JCWlmIFsgLXogIkBDT01NRU5UX09VVF9FQ0NAIiBdIDsgdGhlbiBcCi0JCSAgICBpZiBbIC1mICQoc3lzY29uZmRpcikvc3NoX2hvc3RfZWNkc2Ffa2V5IF0gOyB0aGVuIFwKLQkJCWVjaG8gIiQoc3lzY29uZmRpcikvc3NoX2hvc3RfZWNkc2Ffa2V5IGFscmVhZHkgZXhpc3RzLCBza2lwcGluZy4iIDsgXAotCQkgICAgZWxzZSBcCi0JCQkuL3NzaC1rZXlnZW4gLXQgZWNkc2EgLWYgJChzeXNjb25mZGlyKS9zc2hfaG9zdF9lY2RzYV9rZXkgLU4gIiIgOyBcCi0JCSAgICBmaSA7IFwKLQkJZmkgOyBcCi0JZmkgOwotCi1ob3N0LWtleS1mb3JjZTogc3NoLWtleWdlbiQoRVhFRVhUKQotCS4vc3NoLWtleWdlbiAtdCByc2ExIC1mICQoREVTVERJUikkKHN5c2NvbmZkaXIpL3NzaF9ob3N0X2tleSAtTiAiIgotCS4vc3NoLWtleWdlbiAtdCBkc2EgLWYgJChERVNURElSKSQoc3lzY29uZmRpcikvc3NoX2hvc3RfZHNhX2tleSAtTiAiIgotCS4vc3NoLWtleWdlbiAtdCByc2EgLWYgJChERVNURElSKSQoc3lzY29uZmRpcikvc3NoX2hvc3RfcnNhX2tleSAtTiAiIgotCXRlc3QgLXogIkBDT01NRU5UX09VVF9FQ0NAIiAmJiAuL3NzaC1rZXlnZW4gLXQgZWNkc2EgLWYgJChERVNURElSKSQoc3lzY29uZmRpcikvc3NoX2hvc3RfZWNkc2Ffa2V5IC1OICIiCi0KLXVuaW5zdGFsbGFsbDoJdW5pbnN0YWxsCi0JLXJtIC1mICQoREVTVERJUikkKHN5c2NvbmZkaXIpL3NzaF9jb25maWcKLQktcm0gLWYgJChERVNURElSKSQoc3lzY29uZmRpcikvc3NoZF9jb25maWcKLQktcm1kaXIgJChERVNURElSKSQoc3lzY29uZmRpcikKLQktcm1kaXIgJChERVNURElSKSQoYmluZGlyKQotCS1ybWRpciAkKERFU1RESVIpJChzYmluZGlyKQotCS1ybWRpciAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTEKLQktcm1kaXIgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcik4Ci0JLXJtZGlyICQoREVTVERJUikkKG1hbmRpcikKLQktcm1kaXIgJChERVNURElSKSQobGliZXhlY2RpcikKLQotdW5pbnN0YWxsOgotCS1ybSAtZiAkKERFU1RESVIpJChiaW5kaXIpL3Nsb2dpbgotCS1ybSAtZiAkKERFU1RESVIpJChiaW5kaXIpL3NzaCQoRVhFRVhUKQotCS1ybSAtZiAkKERFU1RESVIpJChiaW5kaXIpL3NjcCQoRVhFRVhUKQotCS1ybSAtZiAkKERFU1RESVIpJChiaW5kaXIpL3NzaC1hZGQkKEVYRUVYVCkKLQktcm0gLWYgJChERVNURElSKSQoYmluZGlyKS9zc2gtYWdlbnQkKEVYRUVYVCkKLQktcm0gLWYgJChERVNURElSKSQoYmluZGlyKS9zc2gta2V5Z2VuJChFWEVFWFQpCi0JLXJtIC1mICQoREVTVERJUikkKGJpbmRpcikvc3NoLWtleXNjYW4kKEVYRUVYVCkKLQktcm0gLWYgJChERVNURElSKSQoYmluZGlyKS9zZnRwJChFWEVFWFQpCi0JLXJtIC1mICQoREVTVERJUikkKHNiaW5kaXIpL3NzaGQkKEVYRUVYVCkKLQktcm0gLXIgJChERVNURElSKSQoU0ZUUF9TRVJWRVIpJChFWEVFWFQpCi0JLXJtIC1mICQoREVTVERJUikkKFNTSF9LRVlTSUdOKSQoRVhFRVhUKQotCS1ybSAtZiAkKERFU1RESVIpJChTU0hfUEtDUzExX0hFTFBFUikkKEVYRUVYVCkKLQktcm0gLWYgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcikxL3NzaC4xCi0JLXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMS9zY3AuMQotCS1ybSAtZiAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTEvc3NoLWFkZC4xCi0JLXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMS9zc2gtYWdlbnQuMQotCS1ybSAtZiAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTEvc3NoLWtleWdlbi4xCi0JLXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvJChtYW5zdWJkaXIpMS9zZnRwLjEKLQktcm0gLWYgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcikxL3NzaC1rZXlzY2FuLjEKLQktcm0gLWYgJChERVNURElSKSQobWFuZGlyKS8kKG1hbnN1YmRpcik4L3NzaGQuOAotCS1ybSAtZiAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTgvc2Z0cC1zZXJ2ZXIuOAotCS1ybSAtZiAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTgvc3NoLWtleXNpZ24uOAotCS1ybSAtZiAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTgvc3NoLXBrY3MxMS1oZWxwZXIuOAotCS1ybSAtZiAkKERFU1RESVIpJChtYW5kaXIpLyQobWFuc3ViZGlyKTEvc2xvZ2luLjEKLQotdGVzdHMgaW50ZXJvcC10ZXN0czoJJChUQVJHRVRTKQotCUJVSUxERElSPWBwd2RgOyBcCi0JWyAtZCBgcHdkYC9yZWdyZXNzIF0gIHx8ICBta2RpciAtcCBgcHdkYC9yZWdyZXNzOyBcCi0JWyAtZiBgcHdkYC9yZWdyZXNzL01ha2VmaWxlIF0gIHx8IFwKLQkgICAgbG4gLXMgYGNkICQoc3JjZGlyKSAmJiBwd2RgL3JlZ3Jlc3MvTWFrZWZpbGUgYHB3ZGAvcmVncmVzcy9NYWtlZmlsZSA7IFwKLQlURVNUX1NIRUxMPSJAVEVTVF9TSEVMTEAiOyBcCi0JVEVTVF9TU0hfU1NIPSIkJHtCVUlMRERJUn0vc3NoIjsgXAotCVRFU1RfU1NIX1NTSEQ9IiQke0JVSUxERElSfS9zc2hkIjsgXAotCVRFU1RfU1NIX1NTSEFHRU5UPSIkJHtCVUlMRERJUn0vc3NoLWFnZW50IjsgXAotCVRFU1RfU1NIX1NTSEFERD0iJCR7QlVJTERESVJ9L3NzaC1hZGQiOyBcCi0JVEVTVF9TU0hfU1NIS0VZR0VOPSIkJHtCVUlMRERJUn0vc3NoLWtleWdlbiI7IFwKLQlURVNUX1NTSF9TU0hQS0NTMTFIRUxQRVI9IiQke0JVSUxERElSfS9zc2gtcGtjczExLWhlbHBlciI7IFwKLQlURVNUX1NTSF9TU0hLRVlTQ0FOPSIkJHtCVUlMRERJUn0vc3NoLWtleXNjYW4iOyBcCi0JVEVTVF9TU0hfU0ZUUD0iJCR7QlVJTERESVJ9L3NmdHAiOyBcCi0JVEVTVF9TU0hfU0ZUUFNFUlZFUj0iJCR7QlVJTERESVJ9L3NmdHAtc2VydmVyIjsgXAotCVRFU1RfU1NIX1BMSU5LPSJwbGluayI7IFwKLQlURVNUX1NTSF9QVVRUWUdFTj0icHV0dHlnZW4iOyBcCi0JVEVTVF9TU0hfQ09OQ0g9ImNvbmNoIjsgXAotCVRFU1RfU1NIX0lQVjY9IkBURVNUX1NTSF9JUFY2QCIgOyBcCi0JVEVTVF9TU0hfRUNDPSJAVEVTVF9TU0hfRUNDQCIgOyBcCi0JVEVTVF9TU0hfU0hBMjU2PSJAVEVTVF9TU0hfU0hBMjU2QCIgOyBcCi0JY2QgJChzcmNkaXIpL3JlZ3Jlc3MgfHwgZXhpdCAkJD87IFwKLQkkKE1BS0UpIFwKLQkJLk9CSkRJUj0iJCR7QlVJTERESVJ9L3JlZ3Jlc3MiIFwKLQkJLkNVUkRJUj0iYHB3ZGAiIFwKLQkJQlVJTERESVI9IiQke0JVSUxERElSfSIgXAotCQlPQko9IiQke0JVSUxERElSfS9yZWdyZXNzLyIgXAotCQlQQVRIPSIkJHtCVUlMRERJUn06JCR7UEFUSH0iIFwKLQkJVEVTVF9TSEVMTD0iJCR7VEVTVF9TSEVMTH0iIFwKLQkJVEVTVF9TU0hfU1NIPSIkJHtURVNUX1NTSF9TU0h9IiBcCi0JCVRFU1RfU1NIX1NTSEQ9IiQke1RFU1RfU1NIX1NTSER9IiBcCi0JCVRFU1RfU1NIX1NTSEFHRU5UPSIkJHtURVNUX1NTSF9TU0hBR0VOVH0iIFwKLQkJVEVTVF9TU0hfU1NIQUREPSIkJHtURVNUX1NTSF9TU0hBRER9IiBcCi0JCVRFU1RfU1NIX1NTSEtFWUdFTj0iJCR7VEVTVF9TU0hfU1NIS0VZR0VOfSIgXAotCQlURVNUX1NTSF9TU0hQS0NTMTFIRUxQRVI9IiQke1RFU1RfU1NIX1NTSFBLQ1MxMUhFTFBFUn0iIFwKLQkJVEVTVF9TU0hfU1NIS0VZU0NBTj0iJCR7VEVTVF9TU0hfU1NIS0VZU0NBTn0iIFwKLQkJVEVTVF9TU0hfU0ZUUD0iJCR7VEVTVF9TU0hfU0ZUUH0iIFwKLQkJVEVTVF9TU0hfU0ZUUFNFUlZFUj0iJCR7VEVTVF9TU0hfU0ZUUFNFUlZFUn0iIFwKLQkJVEVTVF9TU0hfUExJTks9IiQke1RFU1RfU1NIX1BMSU5LfSIgXAotCQlURVNUX1NTSF9QVVRUWUdFTj0iJCR7VEVTVF9TU0hfUFVUVFlHRU59IiBcCi0JCVRFU1RfU1NIX0NPTkNIPSIkJHtURVNUX1NTSF9DT05DSH0iIFwKLQkJVEVTVF9TU0hfSVBWNj0iJCR7VEVTVF9TU0hfSVBWNn0iIFwKLQkJVEVTVF9TU0hfRUNDPSIkJHtURVNUX1NTSF9FQ0N9IiBcCi0JCVRFU1RfU1NIX1NIQTI1Nj0iJCR7VEVTVF9TU0hfU0hBMjU2fSIgXAotCQlFWEVFWFQ9IiQoRVhFRVhUKSIgXAotCQkkQCAmJiBlY2hvIGFsbCB0ZXN0cyBwYXNzZWQKLQotY29tcGF0LXRlc3RzOiAkKExJQkNPTVBBVCkKLQkoY2Qgb3BlbmJzZC1jb21wYXQvcmVncmVzcyAmJiAkKE1BS0UpKQotCi1yZWdyZXNzY2xlYW46Ci0JaWYgWyAtZiByZWdyZXNzL01ha2VmaWxlIF0gJiYgWyAtciByZWdyZXNzL01ha2VmaWxlIF07IHRoZW4gXAotCQkoY2QgcmVncmVzcyAmJiAkKE1BS0UpIGNsZWFuKSBcCi0JZmkKLQotc3VydmV5OiBzdXJ2ZXkuc2ggc3NoCi0JQCQoU0hFTEwpIC4vc3VydmV5LnNoID4gc3VydmV5Ci0JQGVjaG8gJ1RoZSBzdXJ2ZXkgcmVzdWx0cyBoYXZlIGJlZW4gcGxhY2VkIGluIHRoZSBmaWxlICJzdXJ2ZXkiIGluIHRoZScKLQlAZWNobyAnY3VycmVudCBkaXJlY3RvcnkuICBQbGVhc2UgcmV2aWV3IHRoZSBmaWxlIHRoZW4gc2VuZCB3aXRoJwotCUBlY2hvICcibWFrZSBzZW5kLXN1cnZleSIuJwotCi1zZW5kLXN1cnZleToJc3VydmV5Ci0JbWFpbCBwb3J0YWJsZS1zdXJ2ZXlAbWluZHJvdC5vcmcgPHN1cnZleQotCi1wYWNrYWdlOiAkKENPTkZJR0ZJTEVTKSAkKE1BTlBBR0VTKSAkKFRBUkdFVFMpCi0JaWYgWyAiQE1BS0VfUEFDS0FHRV9TVVBQT1JURURAIiA9IHllcyBdOyB0aGVuIFwKLQkJc2ggYnVpbGRwa2cuc2g7IFwKLQlmaQotCmRpZmYgLS1naXQgYS9PVkVSVklFVyBiL09WRVJWSUVXCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTFjYzBiLi4wMDAwMDAwCi0tLSBhL09WRVJWSUVXCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLVtOb3RlOiBUaGlzIGZpbGUgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgZm9yIE9wZW5TU0ggdmVyc2lvbnMgYWZ0ZXIKLU9wZW5TU0gtMS4yIGFuZCBzaG91bGQgYmUgY29uc2lkZXJlZCBPQlNPTEVURS4gIEl0IGhhcyBiZWVuIGxlZnQgaW4KLXRoZSBkaXN0cmlidXRpb24gYmVjYXVzZSBzb21lIG9mIGl0cyBpbmZvcm1hdGlvbiBtYXkgc3RpbGwgYmUgdXNlZnVsCi10byBkZXZlbG9wZXJzLl0KLQotVGhpcyBkb2N1bWVudCBpcyBpbnRlbmRlZCBmb3IgdGhvc2Ugd2hvIHdpc2ggdG8gcmVhZCB0aGUgc3NoIHNvdXJjZQotY29kZS4gIFRoaXMgdHJpZXMgdG8gZ2l2ZSBhbiBvdmVydmlldyBvZiB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlLgotCi1Db3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci1VcGRhdGVkIDE3IE5vdiAxOTk1LgotVXBkYXRlZCAxOSBPY3QgMTk5OSBmb3IgT3BlblNTSC0xLjIKLVVwZGF0ZWQgMjAgTWF5IDIwMDEgbm90ZSBvYnNvbGV0ZSBmb3IgPiBPcGVuU1NILTEuMgotCi1UaGUgc29mdHdhcmUgY29uc2lzdHMgb2Ygc3NoIChjbGllbnQpLCBzc2hkIChzZXJ2ZXIpLCBzY3AsIHNkaXN0LCBhbmQKLXRoZSBhdXhpbGlhcnkgcHJvZ3JhbXMgc3NoLWtleWdlbiwgc3NoLWFnZW50LCBzc2gtYWRkLCBhbmQKLW1ha2Utc3NoLWtub3duLWhvc3RzLiAgVGhlIG1haW4gcHJvZ3JhbSBmb3IgZWFjaCBvZiB0aGVzZSBpcyBpbiBhIC5jCi1maWxlIHdpdGggdGhlIHNhbWUgbmFtZS4KLQotVGhlcmUgYXJlIHNvbWUgc3Vic3lzdGVtcy9hYnN0cmFjdGlvbnMgdGhhdCBhcmUgdXNlZCBieSBhIG51bWJlciBvZgotdGhlc2UgcHJvZ3JhbXMuCi0KLSAgQnVmZmVyIG1hbmlwdWxhdGlvbiByb3V0aW5lcwotCi0gICAgLSBUaGVzZSBwcm92aWRlIGFuIGFyYml0cmFyeSBzaXplIGJ1ZmZlciwgd2hlcmUgZGF0YSBjYW4gYmUgYXBwZW5kZWQuCi0gICAgICBEYXRhIGNhbiBiZSBjb25zdW1lZCBmcm9tIGVpdGhlciBlbmQuICBUaGUgY29kZSBpcyB1c2VkIGhlYXZpbHkKLSAgICAgIHRocm91Z2hvdXQgc3NoLiAgVGhlIGJhc2ljIGJ1ZmZlciBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIGFyZSBpbgotICAgICAgYnVmZmVyLmMgKGhlYWRlciBidWZmZXIuaCksIGFuZCBhZGRpdGlvbmFsIGNvZGUgdG8gbWFuaXB1bGF0ZSBzcGVjaWZpYwotICAgICAgZGF0YSB0eXBlcyBpcyBpbiBidWZhdXguYy4KLQotICBDb21wcmVzc2lvbiBMaWJyYXJ5Ci0KLSAgICAtIFNzaCB1c2VzIHRoZSBHTlUgR1pJUCBjb21wcmVzc2lvbiBsaWJyYXJ5IChaTElCKS4KLQotICBFbmNyeXB0aW9uL0RlY3J5cHRpb24KLQotICAgIC0gU3NoIGNvbnRhaW5zIHNldmVyYWwgZW5jcnlwdGlvbiBhbGdvcml0aG1zLiAgVGhlc2UgYXJlIGFsbAotICAgICAgYWNjZXNzZWQgdGhyb3VnaCB0aGUgY2lwaGVyLmggaW50ZXJmYWNlLiAgVGhlIGludGVyZmFjZSBjb2RlIGlzCi0gICAgICBpbiBjaXBoZXIuYywgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbnMgYXJlIGluIGxpYmMuCi0KLSAgTXVsdGlwbGUgUHJlY2lzaW9uIEludGVnZXIgTGlicmFyeQotCi0gICAgLSBVc2VzIHRoZSBTU0xlYXkgQklHTlVNIHN1YmxpYnJhcnkuCi0KLSAgUmFuZG9tIE51bWJlcnMKLQotICAgIC0gVXNlcyBhcmM0cmFuZG9tKCkgYW5kIHN1Y2guCi0KLSAgUlNBIGtleSBnZW5lcmF0aW9uLCBlbmNyeXB0aW9uLCBkZWNyeXB0aW9uCi0KLSAgICAtIFNzaCB1c2VzIHRoZSBSU0Egcm91dGluZXMgaW4gbGlic3NsLgotCi0gIFJTQSBrZXkgZmlsZXMKLQotICAgIC0gUlNBIGtleXMgYXJlIHN0b3JlZCBpbiBmaWxlcyB3aXRoIGEgc3BlY2lhbCBmb3JtYXQuICBUaGUgY29kZSB0bwotICAgICAgcmVhZC93cml0ZSB0aGVzZSBmaWxlcyBpcyBpbiBhdXRoZmlsZS5jLiAgVGhlIGZpbGVzIGFyZSBub3JtYWxseQotICAgICAgZW5jcnlwdGVkIHdpdGggYSBwYXNzcGhyYXNlLiAgVGhlIGZ1bmN0aW9ucyB0byByZWFkIHBhc3NwaHJhc2VzCi0gICAgICBhcmUgaW4gcmVhZHBhc3MuYyAodGhlIHNhbWUgY29kZSBpcyB1c2VkIHRvIHJlYWQgcGFzc3dvcmRzKS4KLQotICBCaW5hcnkgcGFja2V0IHByb3RvY29sCi0KLSAgICAtIFRoZSBzc2ggYmluYXJ5IHBhY2tldCBwcm90b2NvbCBpcyBpbXBsZW1lbnRlZCBpbiBwYWNrZXQuYy4gIFRoZQotICAgICAgY29kZSBpbiBwYWNrZXQuYyBkb2VzIG5vdCBjb25jZXJuIGl0c2VsZiB3aXRoIHBhY2tldCB0eXBlcyBvciB0aGVpcgotICAgICAgZXhlY3V0aW9uOyBpdCBjb250YWlucyBjb2RlIHRvIGJ1aWxkIHBhY2tldHMsIHRvIHJlY2VpdmUgdGhlbSBhbmQKLSAgICAgIGV4dHJhY3QgZGF0YSBmcm9tIHRoZW0sIGFuZCB0aGUgY29kZSB0byBjb21wcmVzcyBhbmQvb3IgZW5jcnlwdAotICAgICAgcGFja2V0cy4gIENSQyBjb2RlIGNvbWVzIGZyb20gY3JjMzIuYy4KLQotICAgIC0gVGhlIGNvZGUgaW4gcGFja2V0LmMgY2FsbHMgdGhlIGJ1ZmZlciBtYW5pcHVsYXRpb24gcm91dGluZXMKLSAgICAgIChidWZmZXIuYywgYnVmYXV4LmMpLCBjb21wcmVzc2lvbiByb3V0aW5lcyAoY29tcHJlc3MuYywgemxpYiksCi0gICAgICBhbmQgdGhlIGVuY3J5cHRpb24gcm91dGluZXMuCi0KLSAgWDExLCBUQ1AvSVAsIGFuZCBBZ2VudCBmb3J3YXJkaW5nCi0KLSAgICAtIENvZGUgZm9yIHZhcmlvdXMgdHlwZXMgb2YgY2hhbm5lbCBmb3J3YXJkaW5nIGlzIGluIGNoYW5uZWxzLmMuCi0gICAgICBUaGUgZmlsZSBkZWZpbmVzIGEgZ2VuZXJpYyBmcmFtZXdvcmsgZm9yIGFyYml0cmFyeSBjb21tdW5pY2F0aW9uCi0gICAgICBjaGFubmVscyBpbnNpZGUgdGhlIHNlY3VyZSBjaGFubmVsLCBhbmQgdXNlcyB0aGlzIGZyYW1ld29yayB0bwotICAgICAgaW1wbGVtZW50IFgxMSBmb3J3YXJkaW5nLCBUQ1AvSVAgZm9yd2FyZGluZywgYW5kIGF1dGhlbnRpY2F0aW9uCi0gICAgICBhZ2VudCBmb3J3YXJkaW5nLgotICAgICAgVGhlIG5ldywgUHJvdG9jb2wgMS41LCBjaGFubmVsIGNsb3NlIGltcGxlbWVudGF0aW9uIGlzIGluIG5jaGFuLmMKLQotICBBdXRoZW50aWNhdGlvbiBhZ2VudAotCi0gICAgLSBDb2RlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50IGlzIGluIGF1dGhmZC5jLgotCi0gIEF1dGhlbnRpY2F0aW9uIG1ldGhvZHMKLQotICAgIC0gQ29kZSBmb3IgdmFyaW91cyBhdXRoZW50aWNhdGlvbiBtZXRob2RzIHJlc2lkZXMgaW4gYXV0aC0qLmMKLSAgICAgIChhdXRoLXBhc3N3ZC5jLCBhdXRoLXJoLXJzYS5jLCBhdXRoLXJob3N0cy5jLCBhdXRoLXJzYS5jKS4gIFRoaXMKLSAgICAgIGNvZGUgaXMgbGlua2VkIGludG8gdGhlIHNlcnZlci4gIFRoZSByb3V0aW5lcyBhbHNvIG1hbmlwdWxhdGUKLSAgICAgIGtub3duIGhvc3RzIGZpbGVzIHVzaW5nIGNvZGUgaW4gaG9zdGZpbGUuYy4gIENvZGUgaW4gY2Fub2hvc3QuYwotICAgICAgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgY2Fub25pY2FsIGhvc3QgbmFtZSBvZiB0aGUgcmVtb3RlIGhvc3QuCi0gICAgICBDb2RlIGluIG1hdGNoLmMgaXMgdXNlZCB0byBtYXRjaCBob3N0IG5hbWVzLgotCi0gICAgLSBJbiB0aGUgY2xpZW50IGVuZCwgYXV0aGVudGljYXRpb24gY29kZSBpcyBpbiBzc2hjb25uZWN0LmMuICBJdAotICAgICAgcmVhZHMgUGFzc3dvcmRzL3Bhc3NwaHJhc2VzIHVzaW5nIGNvZGUgaW4gcmVhZHBhc3MuYy4gIEl0IHJlYWRzCi0gICAgICBSU0Ega2V5IGZpbGVzIHdpdGggYXV0aGZpbGUuYy4gIEl0IGNvbW11bmljYXRlcyB0aGUKLSAgICAgIGF1dGhlbnRpY2F0aW9uIGFnZW50IHVzaW5nIGF1dGhmZC5jLgotCi0gIFRoZSBzc2ggY2xpZW50Ci0KLSAgICAtIFRoZSBjbGllbnQgbWFpbiBwcm9ncmFtIGlzIGluIHNzaC5jLiAgSXQgZmlyc3QgcGFyc2VzIGFyZ3VtZW50cwotICAgICAgYW5kIHJlYWRzIGNvbmZpZ3VyYXRpb24gKHJlYWRjb25mLmMpLCB0aGVuIGNhbGxzIHNzaF9jb25uZWN0IChpbgotICAgICAgc3NoY29ubmVjdC5jKSB0byBvcGVuIGEgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIChwb3NzaWJseSB2aWEgYQotICAgICAgcHJveHkpLCBhbmQgcGVyZm9ybXMgYXV0aGVudGljYXRpb24gKHNzaF9sb2dpbiBpbiBzc2hjb25uZWN0LmMpLgotICAgICAgSXQgdGhlbiBtYWtlcyBhbnkgcHR5LCBmb3J3YXJkaW5nLCBldGMuIHJlcXVlc3RzLiAgSXQgbWF5IGNhbGwKLSAgICAgIGNvZGUgaW4gdHR5bW9kZXMuYyB0byBlbmNvZGUgY3VycmVudCB0dHkgbW9kZXMuICBGaW5hbGx5IGl0Ci0gICAgICBjYWxscyBjbGllbnRfbG9vcCBpbiBjbGllbnRsb29wLmMuICBUaGlzIGRvZXMgdGhlIHJlYWwgd29yayBmb3IKLSAgICAgIHRoZSBzZXNzaW9uLgotCi0gICAgLSBUaGUgY2xpZW50IGlzIHN1aWQgcm9vdC4gIEl0IHRyaWVzIHRvIHRlbXBvcmFyaWx5IGdpdmUgdXAgdGhpcwotICAgICAgcmlnaHRzIHdoaWxlIHJlYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YS4gIFRoZSByb290Ci0gICAgICBwcml2aWxlZ2VzIGFyZSBvbmx5IHVzZWQgdG8gbWFrZSB0aGUgY29ubmVjdGlvbiAoZnJvbSBhCi0gICAgICBwcml2aWxlZ2VkIHNvY2tldCkuICBBbnkgZXh0cmEgcHJpdmlsZWdlcyBhcmUgZHJvcHBlZCBiZWZvcmUKLSAgICAgIGNhbGxpbmcgc3NoX2xvZ2luLgotCi0gIFBzZXVkby10dHkgbWFuaXB1bGF0aW9uIGFuZCB0dHkgbW9kZXMKLQotICAgIC0gQ29kZSB0byBhbGxvY2F0ZSBhbmQgdXNlIGEgcHNldWRvIHR0eSBpcyBpbiBwdHkuYy4gIENvZGUgdG8KLSAgICAgIGVuY29kZSBhbmQgc2V0IHRlcm1pbmFsIG1vZGVzIGlzIGluIHR0eW1vZGVzLmMuCi0KLSAgTG9nZ2luZyBpbiAodXBkYXRpbmcgdXRtcCwgbGFzdGxvZywgZXRjLikKLQotICAgIC0gVGhlIGNvZGUgdG8gZG8gdGhpbmdzIHRoYXQgYXJlIGRvbmUgd2hlbiBhIHVzZXIgbG9ncyBpbiBhcmUgaW4KLSAgICAgIGxvZ2luLmMuICBUaGlzIGluY2x1ZGVzIHRoaW5ncyBzdWNoIGFzIHVwZGF0aW5nIHRoZSB1dG1wLCB3dG1wLAotICAgICAgYW5kIGxhc3Rsb2cgZmlsZXMuICBTb21lIG9mIHRoZSBjb2RlIGlzIGluIHNzaGQuYy4KLQotICBXcml0aW5nIHRvIHRoZSBzeXN0ZW0gbG9nIGFuZCB0ZXJtaW5hbAotCi0gICAgLSBUaGUgcHJvZ3JhbXMgdXNlIHRoZSBmdW5jdGlvbnMgZmF0YWwoKSwgbG9nKCksIGRlYnVnKCksIGVycm9yKCkKLSAgICAgIGluIG1hbnkgcGxhY2VzIHRvIHdyaXRlIG1lc3NhZ2VzIHRvIHN5c3RlbSBsb2cgb3IgdXNlcidzCi0gICAgICB0ZXJtaW5hbC4gIFRoZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGxvZ3MgdG8gc3lzdGVtIGxvZyBpcyBpbgotICAgICAgbG9nLXNlcnZlci5jOyBpdCBpcyB1c2VkIGluIHRoZSBzZXJ2ZXIgcHJvZ3JhbS4gIFRoZSBvdGhlcgotICAgICAgcHJvZ3JhbXMgdXNlIGFuIGltcGxlbWVudGF0aW9uIHRoYXQgc2VuZHMgb3V0cHV0IHRvIHN0ZGVycjsgaXQKLSAgICAgIGlzIGluIGxvZy1jbGllbnQuYy4gIFRoZSBkZWZpbml0aW9ucyBhcmUgaW4gc3NoLmguCi0KLSAgVGhlIHNzaGQgc2VydmVyIChkYWVtb24pCi0KLSAgICAtIFRoZSBzc2hkIGRhZW1vbiBzdGFydHMgYnkgcHJvY2Vzc2luZyBhcmd1bWVudHMgYW5kIHJlYWRpbmcgdGhlCi0gICAgICBjb25maWd1cmF0aW9uIGZpbGUgKHNlcnZjb25mLmMpLiAgSXQgdGhlbiByZWFkcyB0aGUgaG9zdCBrZXksCi0gICAgICBzdGFydHMgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucywgYW5kIGdlbmVyYXRlcyB0aGUgc2VydmVyIGtleS4KLSAgICAgIFRoZSBzZXJ2ZXIga2V5IHdpbGwgYmUgcmVnZW5lcmF0ZWQgZXZlcnkgaG91ciBieSBhbiBhbGFybS4KLQotICAgIC0gV2hlbiB0aGUgc2VydmVyIHJlY2VpdmVzIGEgY29ubmVjdGlvbiwgaXQgZm9ya3MsIGRpc2FibGVzIHRoZQotICAgICAgcmVnZW5lcmF0aW9uIGFsYXJtLCBhbmQgc3RhcnRzIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgY2xpZW50LgotICAgICAgVGhleSBmaXJzdCBwZXJmb3JtIGlkZW50aWZpY2F0aW9uIHN0cmluZyBleGNoYW5nZSwgdGhlbgotICAgICAgbmVnb3RpYXRlIGVuY3J5cHRpb24sIHRoZW4gcGVyZm9ybSBhdXRoZW50aWNhdGlvbiwgcHJlcGFyYXRvcnkKLSAgICAgIG9wZXJhdGlvbnMsIGFuZCBmaW5hbGx5IHRoZSBzZXJ2ZXIgZW50ZXJzIHRoZSBub3JtYWwgc2Vzc2lvbgotICAgICAgbW9kZSBieSBjYWxsaW5nIHNlcnZlcl9sb29wIGluIHNlcnZlcmxvb3AuYy4gIFRoaXMgZG9lcyB0aGUgcmVhbAotICAgICAgd29yaywgY2FsbGluZyBmdW5jdGlvbnMgaW4gb3RoZXIgbW9kdWxlcy4KLQotICAgIC0gVGhlIGNvZGUgZm9yIHRoZSBzZXJ2ZXIgaXMgaW4gc3NoZC5jLiAgSXQgY29udGFpbnMgYSBsb3Qgb2YKLSAgICAgIHN0dWZmLCBpbmNsdWRpbmc6Ci0JLSBzZXJ2ZXIgbWFpbiBwcm9ncmFtCi0JLSB3YWl0aW5nIGZvciBjb25uZWN0aW9ucwotCS0gcHJvY2Vzc2luZyBuZXcgY29ubmVjdGlvbgotCS0gYXV0aGVudGljYXRpb24KLQktIHByZXBhcmF0b3J5IG9wZXJhdGlvbnMKLQktIGJ1aWxkaW5nIHVwIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgZm9yIHRoZSB1c2VyIHByb2dyYW0KLQktIHN0YXJ0aW5nIHRoZSB1c2VyIHByb2dyYW0uCi0KLSAgQXV4aWxpYXJ5IGZpbGVzCi0KLSAgICAtIFRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24gdGhhdCBjb250YWluCi0gICAgICB2YXJpb3VzIGF1eGlsaWFyeSByb3V0aW5lczoKLQlzc2guaAkgICAgIHRoZSBtYWluIGhlYWRlciBmaWxlIGZvciBzc2ggKHZhcmlvdXMgZGVmaW5pdGlvbnMpCi0JdWlkc3dhcC5jICAgIHVpZC1zd2FwcGluZwotCXhtYWxsb2MuYyAgICAic2FmZSIgbWFsbG9jIHJvdXRpbmVzCi0KLSRPcGVuQlNEOiBPVkVSVklFVyx2IDEuMTEgMjAwNi8wOC8wMyAwMzozNDo0MSBkZXJhYWR0IEV4cCAkCmRpZmYgLS1naXQgYS9QUk9UT0NPTCBiL1BST1RPQ09MCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjgxOTYwLi4wMDAwMDAwCi0tLSBhL1BST1RPQ09MCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLVRoaXMgZG9jdW1lbnRzIE9wZW5TU0gncyBkZXZpYXRpb25zIGFuZCBleHRlbnNpb25zIHRvIHRoZSBwdWJsaXNoZWQgU1NICi1wcm90b2NvbC4KLQotTm90ZSB0aGF0IE9wZW5TU0gncyBzZnRwIGFuZCBzZnRwLXNlcnZlciBpbXBsZW1lbnQgcmV2aXNpb24gMyBvZiB0aGUgU1NICi1maWxleGZlciBwcm90b2NvbCBkZXNjcmliZWQgaW46Ci0KLWh0dHA6Ly93d3cub3BlbnNzaC5jb20vdHh0L2RyYWZ0LWlldGYtc2Vjc2gtZmlsZXhmZXItMDIudHh0Ci0KLU5ld2VyIHZlcnNpb25zIG9mIHRoZSBkcmFmdCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQsIHRob3VnaCBzb21lIGZlYXR1cmVzCi1hcmUgaW5kaXZpZHVhbGx5IGltcGxlbWVudGVkIGFzIGV4dGVuc2lvbnMgZGVzY3JpYmVkIGJlbG93LgotCi1UaGUgcHJvdG9jb2wgdXNlZCBieSBPcGVuU1NIJ3Mgc3NoLWFnZW50IGlzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZQotUFJPVE9DT0wuYWdlbnQKLQotMS4gVHJhbnNwb3J0IHByb3RvY29sIGNoYW5nZXMKLQotMS4xLiB0cmFuc3BvcnQ6IFByb3RvY29sIDIgTUFDIGFsZ29yaXRobSAidW1hYy02NEBvcGVuc3NoLmNvbSIKLQotVGhpcyBpcyBhIG5ldyB0cmFuc3BvcnQtbGF5ZXIgTUFDIG1ldGhvZCB1c2luZyB0aGUgVU1BQyBhbGdvcml0aG0KLShyZmM0NDE4KS4gVGhpcyBtZXRob2QgaXMgaWRlbnRpY2FsIHRvIHRoZSAidW1hYy02NCIgbWV0aG9kIGRvY3VtZW50ZWQKLWluOgotCi1odHRwOi8vd3d3Lm9wZW5zc2guY29tL3R4dC9kcmFmdC1taWxsZXItc2Vjc2gtdW1hYy0wMS50eHQKLQotMS4yLiB0cmFuc3BvcnQ6IFByb3RvY29sIDIgY29tcHJlc3Npb24gYWxnb3JpdGhtICJ6bGliQG9wZW5zc2guY29tIgotCi1UaGlzIHRyYW5zcG9ydC1sYXllciBjb21wcmVzc2lvbiBtZXRob2QgdXNlcyB0aGUgemxpYiBjb21wcmVzc2lvbgotYWxnb3JpdGhtIChpZGVudGljYWwgdG8gdGhlICJ6bGliIiBtZXRob2QgaW4gcmZjNDI1MyksIGJ1dCBkZWxheXMgdGhlCi1zdGFydCBvZiBjb21wcmVzc2lvbiB1bnRpbCBhZnRlciBhdXRoZW50aWNhdGlvbiBoYXMgY29tcGxldGVkLiBUaGlzCi1hdm9pZHMgZXhwb3NpbmcgY29tcHJlc3Npb24gY29kZSB0byBhdHRhY2tzIGZyb20gdW5hdXRoZW50aWNhdGVkIHVzZXJzLgotCi1UaGUgbWV0aG9kIGlzIGRvY3VtZW50ZWQgaW46Ci0KLWh0dHA6Ly93d3cub3BlbnNzaC5jb20vdHh0L2RyYWZ0LW1pbGxlci1zZWNzaC1jb21wcmVzc2lvbi1kZWxheWVkLTAwLnR4dAotCi0xLjMuIHRyYW5zcG9ydDogTmV3IHB1YmxpYyBrZXkgYWxnb3JpdGhtcyAic3NoLXJzYS1jZXJ0LXYwMEBvcGVuc3NoLmNvbSIsCi0gICAgICJzc2gtZHNhLWNlcnQtdjAwQG9wZW5zc2guY29tIiwKLSAgICAgImVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20iLAotICAgICAiZWNkc2Etc2hhMi1uaXN0cDM4NC1jZXJ0LXYwMUBvcGVuc3NoLmNvbSIgYW5kCi0gICAgICJlY2RzYS1zaGEyLW5pc3RwNTIxLWNlcnQtdjAxQG9wZW5zc2guY29tIgotCi1PcGVuU1NIIGludHJvZHVjZXMgbmV3IHB1YmxpYyBrZXkgYWxnb3JpdGhtcyB0byBzdXBwb3J0IGNlcnRpZmljYXRlCi1hdXRoZW50aWNhdGlvbiBmb3IgdXNlcnMgYW5kIGhvc3RrZXlzLiBUaGVzZSBtZXRob2RzIGFyZSBkb2N1bWVudGVkIGluCi10aGUgZmlsZSBQUk9UT0NPTC5jZXJ0a2V5cwotCi0xLjQuIHRyYW5zcG9ydDogRWxsaXB0aWMgQ3VydmUgY3J5cHRvZ3JhcGh5Ci0KLU9wZW5TU0ggc3VwcG9ydHMgRUNDIGtleSBleGNoYW5nZSBhbmQgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiBhcwotc3BlY2lmaWVkIGluIFJGQzU2NTYuIE9ubHkgdGhlIGVjZHNhLXNoYTItbmlzdHAyNTYsIGVjZHNhLXNoYTItbmlzdHAzODQKLWFuZCBlY2RzYS1zaGEyLW5pc3RwNTIxIGN1cnZlcyBvdmVyIEdGKHApIGFyZSBzdXBwb3J0ZWQuIEVsbGlwdGljCi1jdXJ2ZSBwb2ludHMgZW5jb2RlZCB1c2luZyBwb2ludCBjb21wcmVzc2lvbiBhcmUgTk9UIGFjY2VwdGVkIG9yCi1nZW5lcmF0ZWQuCi0KLTIuIENvbm5lY3Rpb24gcHJvdG9jb2wgY2hhbmdlcwotCi0yLjEuIGNvbm5lY3Rpb246IENoYW5uZWwgd3JpdGUgY2xvc2UgZXh0ZW5zaW9uICJlb3dAb3BlbnNzaC5jb20iCi0KLVRoZSBTU0ggY29ubmVjdGlvbiBwcm90b2NvbCAocmZjNDI1NCkgcHJvdmlkZXMgdGhlIFNTSF9NU0dfQ0hBTk5FTF9FT0YKLW1lc3NhZ2UgdG8gYWxsb3cgYW4gZW5kcG9pbnQgdG8gc2lnbmFsIGl0cyBwZWVyIHRoYXQgaXQgd2lsbCBzZW5kIG5vCi1tb3JlIGRhdGEgb3ZlciBhIGNoYW5uZWwuIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzIG5vIHN5bW1ldHJpYyB3YXkgZm9yCi1hbiBlbmRwb2ludCB0byByZXF1ZXN0IHRoYXQgaXRzIHBlZXIgc2hvdWxkIGNlYXNlIHNlbmRpbmcgZGF0YSB0byBpdAotd2hpbGUgc3RpbGwga2VlcGluZyB0aGUgY2hhbm5lbCBvcGVuIGZvciB0aGUgZW5kcG9pbnQgdG8gc2VuZCBkYXRhIHRvCi10aGUgcGVlci4KLQotVGhpcyBpcyBkZXNpcmFibGUsIHNpbmNlIGl0IHNhdmVzIHRoZSB0cmFuc21pc3Npb24gb2YgZGF0YSB0aGF0IHdvdWxkCi1vdGhlcndpc2UgbmVlZCB0byBiZSBkaXNjYXJkZWQgYW5kIGl0IGFsbG93cyBhbiBlbmRwb2ludCB0byBzaWduYWwgbG9jYWwKLXByb2Nlc3NlcyBvZiB0aGUgY29uZGl0aW9uLCBlLmcuIGJ5IGNsb3NpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZQotZGVzY3JpcHRvci4KLQotT3BlblNTSCBpbXBsZW1lbnRzIGEgY2hhbm5lbCBleHRlbnNpb24gbWVzc2FnZSB0byBwZXJmb3JtIHRoaXMKLXNpZ25hbGxpbmc6ICJlb3dAb3BlbnNzaC5jb20iIChFbmQgT2YgV3JpdGUpLiBUaGlzIG1lc3NhZ2UgaXMgc2VudCBieQotYW4gZW5kcG9pbnQgd2hlbiB0aGUgbG9jYWwgb3V0cHV0IG9mIGEgc2Vzc2lvbiBjaGFubmVsIGlzIGNsb3NlZCBvcgotZXhwZXJpZW5jZXMgYSB3cml0ZSBlcnJvci4gVGhlIG1lc3NhZ2UgaXMgZm9ybWF0dGVkIGFzIGZvbGxvd3M6Ci0KLQlieXRlCQlTU0hfTVNHX0NIQU5ORUxfUkVRVUVTVAotCXVpbnQzMgkJcmVjaXBpZW50IGNoYW5uZWwKLQlzdHJpbmcJCSJlb3dAb3BlbnNzaC5jb20iCi0JYm9vbGVhbgkJRkFMU0UKLQotT24gcmVjZWl2aW5nIHRoaXMgbWVzc2FnZSwgdGhlIHBlZXIgU0hPVUxEIGNlYXNlIHNlbmRpbmcgZGF0YSBvZgotdGhlIGNoYW5uZWwgYW5kIE1BWSBzaWduYWwgdGhlIHByb2Nlc3MgZnJvbSB3aGljaCB0aGUgY2hhbm5lbCBkYXRhCi1vcmlnaW5hdGVzIChlLmcuIGJ5IGNsb3NpbmcgaXRzIHJlYWQgZmlsZSBkZXNjcmlwdG9yKS4KLQotQXMgd2l0aCB0aGUgc3ltbWV0cmljIFNTSF9NU0dfQ0hBTk5FTF9FT0YgbWVzc2FnZSwgdGhlIGNoYW5uZWwgZG9lcwotcmVtYWluIG9wZW4gYWZ0ZXIgYSAiZW93QG9wZW5zc2guY29tIiBoYXMgYmVlbiBzZW50IGFuZCBtb3JlIGRhdGEgbWF5Ci1zdGlsbCBiZSBzZW50IGluIHRoZSBvdGhlciBkaXJlY3Rpb24uIFRoaXMgbWVzc2FnZSBkb2VzIG5vdCBjb25zdW1lCi13aW5kb3cgc3BhY2UgYW5kIG1heSBiZSBzZW50IGV2ZW4gaWYgbm8gd2luZG93IHNwYWNlIGlzIGF2YWlsYWJsZS4KLQotTkIuIGR1ZSB0byBjZXJ0YWluIGJyb2tlbiBTU0ggaW1wbGVtZW50YXRpb25zIGFib3J0aW5nIHVwb24gcmVjZWlwdAotb2YgdGhpcyBtZXNzYWdlIChpbiBjb250cmF2ZW50aW9uIG9mIFJGQzQyNTQgc2VjdGlvbiA1LjQpLCB0aGlzCi1tZXNzYWdlIGlzIG9ubHkgc2VudCB0byBPcGVuU1NIIHBlZXJzIChpZGVudGlmaWVkIGJ5IGJhbm5lcikuCi1PdGhlciBTU0ggaW1wbGVtZW50YXRpb25zIG1heSBiZSB3aGl0ZWxpc3RlZCB0byByZWNlaXZlIHRoaXMgbWVzc2FnZQotdXBvbiByZXF1ZXN0LgotCi0yLjIuIGNvbm5lY3Rpb246IGRpc2FsbG93IGFkZGl0aW9uYWwgc2Vzc2lvbnMgZXh0ZW5zaW9uCi0gICAgICJuby1tb3JlLXNlc3Npb25zQG9wZW5zc2guY29tIgotCi1Nb3N0IFNTSCBjb25uZWN0aW9ucyB3aWxsIG9ubHkgZXZlciByZXF1ZXN0IGEgc2luZ2xlIHNlc3Npb24sIGJ1dCBhCi1hdHRhY2tlciBtYXkgYWJ1c2UgYSBydW5uaW5nIHNzaCBjbGllbnQgdG8gc3VycmVwdGl0aW91c2x5IG9wZW4KLWFkZGl0aW9uYWwgc2Vzc2lvbnMgdW5kZXIgdGhlaXIgY29udHJvbC4gT3BlblNTSCBwcm92aWRlcyBhIGdsb2JhbAotcmVxdWVzdCAibm8tbW9yZS1zZXNzaW9uc0BvcGVuc3NoLmNvbSIgdG8gbWl0aWdhdGUgdGhpcyBhdHRhY2suCi0KLVdoZW4gYW4gT3BlblNTSCBjbGllbnQgZXhwZWN0cyB0aGF0IGl0IHdpbGwgbmV2ZXIgb3BlbiBhbm90aGVyIHNlc3Npb24KLShpLmUuIGl0IGhhcyBiZWVuIHN0YXJ0ZWQgd2l0aCBjb25uZWN0aW9uIG11bHRpcGxleGluZyBkaXNhYmxlZCksIGl0Ci13aWxsIHNlbmQgdGhlIGZvbGxvd2luZyBnbG9iYWwgcmVxdWVzdDoKLQotCWJ5dGUJCVNTSF9NU0dfR0xPQkFMX1JFUVVFU1QKLQlzdHJpbmcJCSJuby1tb3JlLXNlc3Npb25zQG9wZW5zc2guY29tIgotCWNoYXIJCXdhbnQtcmVwbHkKLQotT24gcmVjZWlwdCBvZiBzdWNoIGEgbWVzc2FnZSwgYW4gT3BlblNTSCBzZXJ2ZXIgd2lsbCByZWZ1c2UgdG8gb3BlbgotZnV0dXJlIGNoYW5uZWxzIG9mIHR5cGUgInNlc3Npb24iIGFuZCBpbnN0ZWFkIGltbWVkaWF0ZWx5IGFib3J0IHRoZQotY29ubmVjdGlvbi4KLQotTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgZ2VuZXJhbCBkZWZlbmNlIGFnYWluc3QgY29tcHJvbWlzZWQgY2xpZW50cwotKHRoYXQgaXMgaW1wb3NzaWJsZSksIGJ1dCBpdCB0aHdhcnRzIGEgc2ltcGxlIGF0dGFjay4KLQotTkIuIGR1ZSB0byBjZXJ0YWluIGJyb2tlbiBTU0ggaW1wbGVtZW50YXRpb25zIGFib3J0aW5nIHVwb24gcmVjZWlwdAotb2YgdGhpcyBtZXNzYWdlLCB0aGUgbm8tbW9yZS1zZXNzaW9ucyByZXF1ZXN0IGlzIG9ubHkgc2VudCB0byBPcGVuU1NICi1zZXJ2ZXJzIChpZGVudGlmaWVkIGJ5IGJhbm5lcikuIE90aGVyIFNTSCBpbXBsZW1lbnRhdGlvbnMgbWF5IGJlCi13aGl0ZWxpc3RlZCB0byByZWNlaXZlIHRoaXMgbWVzc2FnZSB1cG9uIHJlcXVlc3QuCi0KLTIuMy4gY29ubmVjdGlvbjogVHVubmVsIGZvcndhcmQgZXh0ZW5zaW9uICJ0dW5Ab3BlbnNzaC5jb20iCi0KLU9wZW5TU0ggc3VwcG9ydHMgbGF5ZXIgMiBhbmQgbGF5ZXIgMyB0dW5uZWxsaW5nIHZpYSB0aGUgInR1bkBvcGVuc3NoLmNvbSIKLWNoYW5uZWwgdHlwZS4gVGhpcyBjaGFubmVsIHR5cGUgc3VwcG9ydHMgZm9yd2FyZGluZyBvZiBuZXR3b3JrIHBhY2tldHMKLXdpdGggZGF0YWdyYW0gYm91bmRhcmllcyBpbnRhY3QgYmV0d2VlbiBlbmRwb2ludHMgZXF1aXBwZWQgd2l0aCAKLWludGVyZmFjZXMgbGlrZSB0aGUgQlNEIHR1big0KSBkZXZpY2UuIFR1bm5lbCBmb3J3YXJkaW5nIGNoYW5uZWxzIGFyZQotcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQgd2l0aCB0aGUgZm9sbG93aW5nIHBhY2tldDoKLQotCWJ5dGUJCVNTSF9NU0dfQ0hBTk5FTF9PUEVOCi0Jc3RyaW5nCQkidHVuQG9wZW5zc2guY29tIgotCXVpbnQzMgkJc2VuZGVyIGNoYW5uZWwKLQl1aW50MzIJCWluaXRpYWwgd2luZG93IHNpemUKLQl1aW50MzIJCW1heGltdW0gcGFja2V0IHNpemUKLQl1aW50MzIJCXR1bm5lbCBtb2RlCi0JdWludDMyCQlyZW1vdGUgdW5pdCBudW1iZXIKLQotVGhlICJ0dW5uZWwgbW9kZSIgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB0dW5uZWwgc2hvdWxkIGZvcndhcmQKLWxheWVyIDIgZnJhbWVzIG9yIGxheWVyIDMgcGFja2V0cy4gSXQgbWF5IHRha2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotCi0JU1NIX1RVTk1PREVfUE9JTlRPUE9JTlQgIDEJCS8qIGxheWVyIDMgcGFja2V0cyAqLwotCVNTSF9UVU5NT0RFX0VUSEVSTkVUICAgICAyCQkvKiBsYXllciAyIGZyYW1lcyAqLwotCi1UaGUgInR1bm5lbCB1bml0IG51bWJlciIgc3BlY2lmaWVzIHRoZSByZW1vdGUgaW50ZXJmYWNlIG51bWJlciwgb3IgbWF5Ci1iZSAweDdmZmZmZmZmIHRvIGFsbG93IHRoZSBzZXJ2ZXIgdG8gYXV0b21hdGljYWxseSBjaG9zZSBhbiBpbnRlcmZhY2UuIEEKLXNlcnZlciB0aGF0IGlzIG5vdCB3aWxsaW5nIHRvIG9wZW4gYSBjbGllbnQtc3BlY2lmaWVkIHVuaXQgc2hvdWxkIHJlZnVzZQotdGhlIHJlcXVlc3Qgd2l0aCBhIFNTSF9NU0dfQ0hBTk5FTF9PUEVOX0ZBSUxVUkUgZXJyb3IuIE9uIHN1Y2Nlc3NmdWwKLW9wZW4sIHRoZSBzZXJ2ZXIgc2hvdWxkIHJlcGx5IHdpdGggU1NIX01TR19DSEFOTkVMX09QRU5fU1VDQ0VTUy4KLQotT25jZSBlc3RhYmxpc2hlZCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgbWF5IGV4Y2hhbmdlIHBhY2tldCBvciBmcmFtZXMKLW92ZXIgdGhlIHR1bm5lbCBjaGFubmVsIGJ5IGVuY2Fwc3VsYXRpbmcgdGhlbSBpbiBTU0ggcHJvdG9jb2wgc3RyaW5ncwotYW5kIHNlbmRpbmcgdGhlbSBhcyBjaGFubmVsIGRhdGEuIFRoaXMgZW5zdXJlcyB0aGF0IHBhY2tldCBib3VuZGFyaWVzCi1hcmUga2VwdCBpbnRhY3QuIFNwZWNpZmljYWxseSwgcGFja2V0cyBhcmUgdHJhbnNtaXR0ZWQgdXNpbmcgbm9ybWFsCi1TU0hfTVNHX0NIQU5ORUxfREFUQSBwYWNrZXRzOgotCi0JYnl0ZQkJU1NIX01TR19DSEFOTkVMX0RBVEEKLQl1aW50MzIJCXJlY2lwaWVudCBjaGFubmVsCi0Jc3RyaW5nCQlkYXRhCi0KLVRoZSBjb250ZW50cyBvZiB0aGUgImRhdGEiIGZpZWxkIGZvciBsYXllciAzIHBhY2tldHMgaXM6Ci0KLQl1aW50MzIJCQlwYWNrZXQgbGVuZ3RoCi0JdWludDMyCQkJYWRkcmVzcyBmYW1pbHkKLQlieXRlW3BhY2tldCBsZW5ndGggLSA0XQlwYWNrZXQgZGF0YQotCi1UaGUgImFkZHJlc3MgZmFtaWx5IiBmaWVsZCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIHBhY2tldCBpbiB0aGUgbWVzc2FnZS4KLUl0IG1heSBiZSBvbmUgb2Y6Ci0KLQlTU0hfVFVOX0FGX0lORVQJCTIJCS8qIElQdjQgKi8KLQlTU0hfVFVOX0FGX0lORVQ2CTI0CQkvKiBJUHY2ICovCi0KLVRoZSAicGFja2V0IGRhdGEiIGZpZWxkIGNvbnNpc3RzIG9mIHRoZSBJUHY0L0lQdjYgZGF0YWdyYW0gaXRzZWxmCi13aXRob3V0IGFueSBsaW5rIGxheWVyIGhlYWRlci4KLQotVGhlIGNvbnRlbnRzIG9mIHRoZSAiZGF0YSIgZmllbGQgZm9yIGxheWVyIDIgcGFja2V0cyBpczoKLQotCXVpbnQzMgkJCXBhY2tldCBsZW5ndGgKLQlieXRlW3BhY2tldCBsZW5ndGhdCWZyYW1lCi0KLVRoZSAiZnJhbWUiIGZpZWxkIGNvbnRhaW5zIGFuIElFRUUgODAyLjMgRXRoZXJuZXQgZnJhbWUsIGluY2x1ZGluZwotaGVhZGVyLgotCi0zLiBTRlRQIHByb3RvY29sIGNoYW5nZXMKLQotMy4xLiBzZnRwOiBSZXZlcnNhbCBvZiBhcmd1bWVudHMgdG8gU1NIX0ZYUF9TWU1MSU5LCi0KLVdoZW4gT3BlblNTSCdzIHNmdHAtc2VydmVyIHdhcyBpbXBsZW1lbnRlZCwgdGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudHMKLXRvIHRoZSBTU0hfRlhQX1NZTUxJTksgbWV0aG9kIHdhcyBpbmFkdmVydGVudGx5IHJldmVyc2VkLiBVbmZvcnR1bmF0ZWx5LAotdGhlIHJldmVyc2FsIHdhcyBub3Qgbm90aWNlZCB1bnRpbCB0aGUgc2VydmVyIHdhcyB3aWRlbHkgZGVwbG95ZWQuIFNpbmNlCi1maXhpbmcgdGhpcyB0byBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb24gd291bGQgY2F1c2UgaW5jb21wYXRpYmlsaXR5LCB0aGUKLWN1cnJlbnQgb3JkZXIgd2FzIHJldGFpbmVkLiBGb3IgY29ycmVjdCBvcGVyYXRpb24sIGNsaWVudHMgc2hvdWxkIHNlbmQKLVNTSF9GWFBfU1lNTElOSyBhcyBmb2xsb3dzOgotCi0JdWludDMyCQlpZAotCXN0cmluZwkJdGFyZ2V0cGF0aAotCXN0cmluZwkJbGlua3BhdGgKLQotMy4yLiBzZnRwOiBTZXJ2ZXIgZXh0ZW5zaW9uIGFubm91bmNlbWVudCBpbiBTU0hfRlhQX1ZFUlNJT04KLQotT3BlblNTSCdzIHNmdHAtc2VydmVyIGxpc3RzIHRoZSBleHRlbnNpb25zIGl0IHN1cHBvcnRzIHVzaW5nIHRoZQotc3RhbmRhcmQgZXh0ZW5zaW9uIGFubm91bmNlbWVudCBtZWNoYW5pc20gaW4gdGhlIFNTSF9GWFBfVkVSU0lPTiBzZXJ2ZXIKLWhlbGxvIHBhY2tldDoKLQotCXVpbnQzMgkJMwkJLyogcHJvdG9jb2wgdmVyc2lvbiAqLwotCXN0cmluZwkJZXh0MS1uYW1lCi0Jc3RyaW5nCQlleHQxLXZlcnNpb24KLQlzdHJpbmcJCWV4dDItbmFtZQotCXN0cmluZwkJZXh0Mi12ZXJzaW9uCi0JLi4uCi0Jc3RyaW5nCQlleHROLW5hbWUKLQlzdHJpbmcJCWV4dE4tdmVyc2lvbgotCi1FYWNoIGV4dGVuc2lvbiByZXBvcnRzIGl0cyBpbnRlZ2VyIHZlcnNpb24gbnVtYmVyIGFzIGFuIEFTQ0lJIGVuY29kZWQKLXN0cmluZywgZS5nLiAiMSIuIFRoZSB2ZXJzaW9uIHdpbGwgYmUgaW5jcmVtZW50ZWQgaWYgdGhlIGV4dGVuc2lvbiBpcwotZXZlciBjaGFuZ2VkIGluIGFuIGluY29tcGF0aWJsZSB3YXkuIFRoZSBzZXJ2ZXIgTUFZIGFkdmVydGlzZSB0aGUgc2FtZQotZXh0ZW5zaW9uIHdpdGggbXVsdGlwbGUgdmVyc2lvbnMgKHRob3VnaCB0aGlzIGlzIHVubGlrZWx5KS4gQ2xpZW50cyBNVVNUCi1jaGVjayB0aGUgdmVyc2lvbiBudW1iZXIgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIHRoZSBleHRlbnNpb24uCi0KLTMuMy4gc2Z0cDogRXh0ZW5zaW9uIHJlcXVlc3QgInBvc2l4LXJlbmFtZUBvcGVuc3NoLmNvbSIKLQotVGhpcyBvcGVyYXRpb24gcHJvdmlkZXMgYSByZW5hbWUgb3BlcmF0aW9uIHdpdGggUE9TSVggc2VtYW50aWNzLCB3aGljaAotYXJlIGRpZmZlcmVudCB0byB0aG9zZSBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQgU1NIX0ZYUF9SRU5BTUUgaW4KLWRyYWZ0LWlldGYtc2Vjc2gtZmlsZXhmZXItMDIudHh0LiBUaGlzIHJlcXVlc3QgaXMgaW1wbGVtZW50ZWQgYXMgYQotU1NIX0ZYUF9FWFRFTkRFRCByZXF1ZXN0IHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQ6Ci0KLQl1aW50MzIJCWlkCi0Jc3RyaW5nCQkicG9zaXgtcmVuYW1lQG9wZW5zc2guY29tIgotCXN0cmluZwkJb2xkcGF0aAotCXN0cmluZwkJbmV3cGF0aAotCi1PbiByZWNlaXZpbmcgdGhpcyByZXF1ZXN0IHRoZSBzZXJ2ZXIgd2lsbCBwZXJmb3JtIHRoZSBQT1NJWCBvcGVyYXRpb24KLXJlbmFtZShvbGRwYXRoLCBuZXdwYXRoKSBhbmQgd2lsbCByZXNwb25kIHdpdGggYSBTU0hfRlhQX1NUQVRVUyBtZXNzYWdlLgotVGhpcyBleHRlbnNpb24gaXMgYWR2ZXJ0aXNlZCBpbiB0aGUgU1NIX0ZYUF9WRVJTSU9OIGhlbGxvIHdpdGggdmVyc2lvbgotIjEiLgotCi0zLjQuIHNmdHA6IEV4dGVuc2lvbiByZXF1ZXN0cyAic3RhdHZmc0BvcGVuc3NoLmNvbSIgYW5kCi0gICAgICAgICAiZnN0YXR2ZnNAb3BlbnNzaC5jb20iCi0KLVRoZXNlIHJlcXVlc3RzIGNvcnJlc3BvbmQgdG8gdGhlIHN0YXR2ZnMgYW5kIGZzdGF0dmZzIFBPU0lYIHN5c3RlbQotaW50ZXJmYWNlcy4gVGhlICJzdGF0dmZzQG9wZW5zc2guY29tIiByZXF1ZXN0IG9wZXJhdGVzIG9uIGFuIGV4cGxpY2l0Ci1wYXRobmFtZSwgYW5kIGlzIGZvcm1hdHRlZCBhcyBmb2xsb3dzOgotCi0JdWludDMyCQlpZAotCXN0cmluZwkJInN0YXR2ZnNAb3BlbnNzaC5jb20iCi0Jc3RyaW5nCQlwYXRoCi0KLVRoZSAiZnN0YXR2ZnNAb3BlbnNzaC5jb20iIG9wZXJhdGVzIG9uIGFuIG9wZW4gZmlsZSBoYW5kbGU6Ci0KLQl1aW50MzIJCWlkCi0Jc3RyaW5nCQkiZnN0YXR2ZnNAb3BlbnNzaC5jb20iCi0Jc3RyaW5nCQloYW5kbGUKLQotVGhlc2UgcmVxdWVzdHMgcmV0dXJuIGEgU1NIX0ZYUF9TVEFUVVMgcmVwbHkgb24gZmFpbHVyZS4gT24gc3VjY2VzcyB0aGV5Ci1yZXR1cm4gdGhlIGZvbGxvd2luZyBTU0hfRlhQX0VYVEVOREVEX1JFUExZIHJlcGx5OgotCi0JdWludDMyCQlpZAotCXVpbnQ2NAkJZl9ic2l6ZQkJLyogZmlsZSBzeXN0ZW0gYmxvY2sgc2l6ZSAqLwotCXVpbnQ2NAkJZl9mcnNpemUJLyogZnVuZGFtZW50YWwgZnMgYmxvY2sgc2l6ZSAqLwotCXVpbnQ2NAkJZl9ibG9ja3MJLyogbnVtYmVyIG9mIGJsb2NrcyAodW5pdCBmX2Zyc2l6ZSkgKi8KLQl1aW50NjQJCWZfYmZyZWUJCS8qIGZyZWUgYmxvY2tzIGluIGZpbGUgc3lzdGVtICovCi0JdWludDY0CQlmX2JhdmFpbAkvKiBmcmVlIGJsb2NrcyBmb3Igbm9uLXJvb3QgKi8KLQl1aW50NjQJCWZfZmlsZXMJCS8qIHRvdGFsIGZpbGUgaW5vZGVzICovCi0JdWludDY0CQlmX2ZmcmVlCQkvKiBmcmVlIGZpbGUgaW5vZGVzICovCi0JdWludDY0CQlmX2ZhdmFpbAkvKiBmcmVlIGZpbGUgaW5vZGVzIGZvciB0byBub24tcm9vdCAqLwotCXVpbnQ2NAkJZl9mc2lkCQkvKiBmaWxlIHN5c3RlbSBpZCAqLwotCXVpbnQ2NAkJZl9mbGFnCQkvKiBiaXQgbWFzayBvZiBmX2ZsYWcgdmFsdWVzICovCi0JdWludDY0CQlmX25hbWVtYXgJLyogbWF4aW11bSBmaWxlbmFtZSBsZW5ndGggKi8KLQotVGhlIHZhbHVlcyBvZiB0aGUgZl9mbGFnIGJpdG1hc2sgYXJlIGFzIGZvbGxvd3M6Ci0KLQkjZGVmaW5lIFNTSF9GWEVfU1RBVFZGU19TVF9SRE9OTFkJMHgxCS8qIHJlYWQtb25seSAqLwotCSNkZWZpbmUgU1NIX0ZYRV9TVEFUVkZTX1NUX05PU1VJRAkweDIJLyogbm8gc2V0dWlkICovCi0KLUJvdGggdGhlICJzdGF0dmZzQG9wZW5zc2guY29tIiBhbmQgImZzdGF0dmZzQG9wZW5zc2guY29tIiBleHRlbnNpb25zIGFyZQotYWR2ZXJ0aXNlZCBpbiB0aGUgU1NIX0ZYUF9WRVJTSU9OIGhlbGxvIHdpdGggdmVyc2lvbiAiMiIuCi0KLTEwLiBzZnRwOiBFeHRlbnNpb24gcmVxdWVzdCAiaGFyZGxpbmtAb3BlbnNzaC5jb20iCi0KLVRoaXMgcmVxdWVzdCBpcyBmb3IgY3JlYXRpbmcgYSBoYXJkIGxpbmsgdG8gYSByZWd1bGFyIGZpbGUuIFRoaXMKLXJlcXVlc3QgaXMgaW1wbGVtZW50ZWQgYXMgYSBTU0hfRlhQX0VYVEVOREVEIHJlcXVlc3Qgd2l0aCB0aGUKLWZvbGxvd2luZyBmb3JtYXQ6Ci0KLQl1aW50MzIJCWlkCi0Jc3RyaW5nCQkiaGFyZGxpbmtAb3BlbnNzaC5jb20iCi0Jc3RyaW5nCQlvbGRwYXRoCi0Jc3RyaW5nCQluZXdwYXRoCi0KLU9uIHJlY2VpdmluZyB0aGlzIHJlcXVlc3QgdGhlIHNlcnZlciB3aWxsIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgotbGluayhvbGRwYXRoLCBuZXdwYXRoKSBhbmQgd2lsbCByZXNwb25kIHdpdGggYSBTU0hfRlhQX1NUQVRVUyBtZXNzYWdlLgotVGhpcyBleHRlbnNpb24gaXMgYWR2ZXJ0aXNlZCBpbiB0aGUgU1NIX0ZYUF9WRVJTSU9OIGhlbGxvIHdpdGggdmVyc2lvbgotIjEiLgotCi0kT3BlbkJTRDogUFJPVE9DT0wsdiAxLjE3IDIwMTAvMTIvMDQgMDA6MTg6MDEgZGptIEV4cCAkCmRpZmYgLS1naXQgYS9QUk9UT0NPTC5hZ2VudCBiL1BST1RPQ09MLmFnZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTk0ZDAzLi4wMDAwMDAwCi0tLSBhL1BST1RPQ09MLmFnZW50CisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLVRoaXMgZGVzY3JpYmVzIHRoZSBwcm90b2NvbCB1c2VkIGJ5IE9wZW5TU0gncyBzc2gtYWdlbnQuCi0KLU9wZW5TU0gncyBhZ2VudCBzdXBwb3J0cyBtYW5hZ2luZyBrZXlzIGZvciB0aGUgc3RhbmRhcmQgU1NIIHByb3RvY29sCi0yIGFzIHdlbGwgYXMgdGhlIGxlZ2FjeSBTU0ggcHJvdG9jb2wgMS4gU3VwcG9ydCBmb3IgdGhlc2Uga2V5IHR5cGVzCi1pcyBhbG1vc3QgY29tcGxldGVseSBkaXNqb2ludCAtIGluIGFsbCBidXQgYSBmZXcgY2FzZXMsIG9wZXJhdGlvbnMgb24KLXByb3RvY29sIDIga2V5cyBjYW5ub3Qgc2VlIG9yIGFmZmVjdCBwcm90b2NvbCAxIGtleXMgYW5kIHZpY2UtdmVyc2EuCi0KLVByb3RvY29sIDEgYW5kIHByb3RvY29sIDIga2V5cyBhcmUgc2VwYXJhdGVkIGJlY2F1c2Ugb2YgdGhlIGRpZmZlcmluZwotY3J5cHRvZ3JhcGhpYyB1c2FnZTogcHJvdG9jb2wgMSBwcml2YXRlIFJTQSBrZXlzIGFyZSB1c2VkIHRvIGRlY3J5cHQKLWNoYWxsZW5nZXMgdGhhdCB3ZXJlIGVuY3J5cHRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHB1YmxpYyBrZXksCi13aGVyZWFzIHByb3RvY29sIDIgUlNBIHByaXZhdGUga2V5cyBhcmUgdXNlZCB0byBzaWduIGNoYWxsZW5nZXMgd2l0aAotYSBwcml2YXRlIGtleSBmb3IgdmVyaWZpY2F0aW9uIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleS4gSXQKLWlzIGNvbnNpZGVyZWQgdW5zb3VuZCBwcmFjdGljZSB0byB1c2UgdGhlIHNhbWUga2V5IGZvciBzaWduaW5nIGFuZAotZW5jcnlwdGlvbi4KLQotV2l0aCBhIGNvdXBsZSBvZiBleGNlcHRpb25zLCB0aGUgcHJvdG9jb2wgbWVzc2FnZSBuYW1lcyB1c2VkIGluIHRoaXMKLWRvY3VtZW50IGluZGljYXRlIHdoaWNoIHR5cGUgb2Yga2V5IHRoZSBtZXNzYWdlIHJlbGF0ZXMgdG8uIFNTSF8qCi1tZXNzYWdlcyByZWZlciB0byBwcm90b2NvbCAxIGtleXMgb25seS4gU1NIMl8qIG1lc3NhZ2VzIHJlZmVyIHRvCi1wcm90b2NvbCAyIGtleXMuIEZ1cnRoZXJtb3JlLCB0aGUgbmFtZXMgYWxzbyBpbmRpY2F0ZSB3aGV0aGVyIHRoZQotbWVzc2FnZSBpcyBhIHJlcXVlc3QgdG8gdGhlIGFnZW50ICgqX0FHRU5UQ18qKSBvciBhIHJlcGx5IGZyb20gdGhlCi1hZ2VudCAoKl9BR0VOVF8qKS4gU2VjdGlvbiAzIGJlbG93IGNvbnRhaW5zIHRoZSBtYXBwaW5nIG9mIHRoZQotcHJvdG9jb2wgbWVzc2FnZSBuYW1lcyB0byB0aGVpciBpbnRlZ2VyIHZhbHVlcy4KLQotMS4gRGF0YSB0eXBlcwotCi1CZWNhdXNlIG9mIHN1cHBvcnQgZm9yIGxlZ2FjeSBTU0ggcHJvdG9jb2wgMSBrZXlzLCBPcGVuU1NIJ3MgYWdlbnQKLXByb3RvY29sIG1ha2VzIHVzZSBvZiBzb21lIGRhdGEgdHlwZXMgbm90IGRlZmluZWQgaW4gUkZDIDQyNTEuCi0KLTEuMSB1aW50MTYKLQotVGhlICJ1aW50MTYiIGRhdGEgdHlwZSBpcyBhIHNpbXBsZSBNU0ItZmlyc3QgMTYgYml0IHVuc2lnbmVkIGludGVnZXIKLWVuY29kZWQgaW4gdHdvIGJ5dGVzLgotCi0xLjIgbXBpbnQxCi0KLVRoZSAibXBpbnQxIiB0eXBlIHJlcHJlc2VudHMgYW4gYXJiaXRyYXJ5IHByZWNpc2lvbiBpbnRlZ2VyIChiaWdudW0pLgotSXRzIGZvcm1hdCBpcyBhcyBmb2xsb3dzOgotCi0JdWludDE2CQkJYml0cwotCWJ5dGVbKGJpdHMgKyA3KSAvIDhdCWJpZ251bQotCi0iYmlnbnVtIiBjb250YWlucyBhbiB1bnNpZ25lZCBhcmJpdHJhcnkgcHJlY2lzaW9uIGludGVnZXIgZW5jb2RlZCBhcwotZWlnaHQgYml0cyBwZXIgYnl0ZSBpbiBiaWctZW5kaWFuIChNU0IgZmlyc3QpIGZvcm1hdC4KLQotTm90ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAibXBpbnQxIiBlbmNvZGluZyBhbmQgdGhlICJtcGludCIKLWVuY29kaW5nIGRlZmluZWQgaW4gUkZDIDQyNTEuIEFsc28gbm90ZSB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIGVuY29kZWQKLWludGVnZXIgaXMgc3BlY2lmaWVkIGluIGJpdHMsIG5vdCBieXRlcyBhbmQgdGhhdCB0aGUgYnl0ZSBsZW5ndGggb2YKLXRoZSBpbnRlZ2VyIG11c3QgYmUgY2FsY3VsYXRlZCBieSByb3VuZGluZyB1cCB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gdGhlCi1uZWFyZXN0IGVpZ2h0LgotCi0yLiBQcm90b2NvbCBNZXNzYWdlcwotCi1BbGwgcHJvdG9jb2wgbWVzc2FnZXMgYXJlIHByZWZpeGVkIHdpdGggdGhlaXIgbGVuZ3RoIGluIGJ5dGVzLCBlbmNvZGVkCi1hcyBhIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ2VyLiBTcGVjaWZpY2FsbHk6Ci0KLQl1aW50MzIJCQltZXNzYWdlX2xlbmd0aAotCWJ5dGVbbWVzc2FnZV9sZW5ndGhdCW1lc3NhZ2UKLQotVGhlIGZvbGxvd2luZyBtZXNzYWdlIGRlc2NyaXB0aW9ucyByZWZlciBvbmx5IHRvIHRoZSBjb250ZW50IHRoZQotIm1lc3NhZ2UiIGZpZWxkLgotCi0yLjEgR2VuZXJpYyBzZXJ2ZXIgcmVzcG9uc2VzCi0KLVRoZSBmb2xsb3dpbmcgZ2VuZXJpYyBtZXNzYWdlcyBtYXkgYmUgc2VudCBieSB0aGUgc2VydmVyIGluIHJlc3BvbnNlIHRvCi1yZXF1ZXN0cyBmcm9tIHRoZSBjbGllbnQuIE9uIHN1Y2Nlc3MgdGhlIGFnZW50IG1heSByZXBseSBlaXRoZXIgd2l0aDoKLQotCWJ5dGUJCQlTU0hfQUdFTlRfU1VDQ0VTUwotCi1vciBhIHJlcXVlc3Qtc3BlY2lmaWMgc3VjY2VzcyBtZXNzYWdlLgotCi1PbiBmYWlsdXJlLCB0aGUgYWdlbnQgbWF5IHJlcGx5IHdpdGg6Ci0KLQlieXRlCQkJU1NIX0FHRU5UX0ZBSUxVUkUKLQotU1NIX0FHRU5UX0ZBSUxVUkUgbWVzc2FnZXMgYXJlIGFsc28gc2VudCBpbiByZXBseSB0byB1bmtub3duIHJlcXVlc3QKLXR5cGVzLgotCi0yLjIgQWRkaW5nIGtleXMgdG8gdGhlIGFnZW50Ci0KLUtleXMgYXJlIGFkZGVkIHRvIHRoZSBhZ2VudCB1c2luZyB0aGUgU1NIX0FHRU5UQ19BRERfUlNBX0lERU5USVRZIGFuZAotU1NIMl9BR0VOVENfQUREX0lERU5USVRZIHJlcXVlc3RzIGZvciBwcm90b2NvbCAxIGFuZCBwcm90b2NvbCAyIGtleXMKLXJlc3BlY3RpdmVseS4KLQotVHdvIHZhcmlhbnRzIG9mIHRoZXNlIHJlcXVlc3RzIGFyZSBTU0hfQUdFTlRDX0FERF9SU0FfSURfQ09OU1RSQUlORUQKLWFuZCBTU0gyX0FHRU5UQ19BRERfSURfQ09OU1RSQUlORUQgLSB0aGVzZSBhZGQga2V5cyB3aXRoIG9wdGlvbmFsCi0iY29uc3RyYWludHMiIG9uIHRoZWlyIHVzYWdlLgotCi1PcGVuU1NIIG1heSBiZSBidWlsdCB3aXRoIHN1cHBvcnQgZm9yIGtleXMgaG9zdGVkIG9uIGEgc21hcnRjYXJkCi1vciBvdGhlciBoYXJkd2FyZSBzZWN1cml0eSBtb2R1bGUuIFRoZXNlIGtleXMgbWF5IGJlIGFkZGVkCi10byB0aGUgYWdlbnQgdXNpbmcgdGhlIFNTSF9BR0VOVENfQUREX1NNQVJUQ0FSRF9LRVkgYW5kCi1TU0hfQUdFTlRDX0FERF9TTUFSVENBUkRfS0VZX0NPTlNUUkFJTkVEIHJlcXVlc3RzLgotCi0yLjIuMSBLZXkgY29uc3RyYWludHMKLQotVGhlIE9wZW5TU0ggYWdlbnQgc3VwcG9ydHMgc29tZSBiYXNpYyBvcHRpb25hbCBjb25zdHJhaW50cyBvbiBrZXkgdXNhZ2UuCi1BdCBwcmVzZW50IHRoZXJlIGFyZSB0d28gY29uc3RyYWludHMgZGVmaW5lZC4KLQotVGhlIGZpcnN0IGNvbnN0cmFpbnQgbGltaXRzIHRoZSB2YWxpZGl0eSBkdXJhdGlvbiBvZiBhIGtleS4gSXQgaXMKLWVuY29kZWQgYXM6Ci0KLQlieXRlCQkJU1NIX0FHRU5UX0NPTlNUUkFJTl9MSUZFVElNRQotCXVpbnQzMgkJCXNlY29uZHMKLQotV2hlcmUgInNlY29uZHMiIGNvbnRhaW5zIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IHRoZSBrZXkgc2hhbGwgcmVtYWluCi12YWxpZCBtZWFzdXJlZCBmcm9tIHRoZSBtb21lbnQgdGhhdCB0aGUgYWdlbnQgcmVjZWl2ZXMgaXQuIEFmdGVyIHRoZQotdmFsaWRpdHkgcGVyaW9kIGhhcyBleHBpcmVkLCBPcGVuU1NIJ3MgYWdlbnQgd2lsbCBlcmFzZSB0aGVzZSBrZXlzIGZyb20KLW1lbW9yeS4KLQotVGhlIHNlY29uZCBjb25zdHJhaW50IHJlcXVpcmVzIHRoZSBhZ2VudCB0byBzZWVrIGV4cGxpY2l0IHVzZXIKLWNvbmZpcm1hdGlvbiBiZWZvcmUgcGVyZm9ybWluZyBwcml2YXRlIGtleSBvcGVyYXRpb25zIHdpdGggdGhlIGxvYWRlZAota2V5LiBUaGlzIGNvbnN0cmFpbnQgaXMgZW5jb2RlZCBhczoKLQotCWJ5dGUJCQlTU0hfQUdFTlRfQ09OU1RSQUlOX0NPTkZJUk0KLQotWmVybyBvciBtb3JlIGNvbnN0cmFpbnRzIG1heSBiZSBzcGVjaWZpZWQgd2hlbiBhZGRpbmcgYSBrZXkgd2l0aCBvbmUKLW9mIHRoZSAqX0NPTlNUUkFJTkVEIHJlcXVlc3RzLiBNdWx0aXBsZSBjb25zdHJhaW50cyBhcmUgYXBwZW5kZWQKLWNvbnNlY3V0aXZlbHkgdG8gdGhlIGVuZCBvZiB0aGUgcmVxdWVzdDoKLQotCWJ5dGUJCQljb25zdHJhaW50MV90eXBlCi0JLi4uLgkJCWNvbnN0cmFpbnQxX2RhdGEKLQlieXRlCQkJY29uc3RyYWludDJfdHlwZQotCS4uLi4JCQljb25zdHJhaW50Ml9kYXRhCi0JLi4uLgotCWJ5dGUJCQljb25zdHJhaW50Tl90eXBlCi0JLi4uLgkJCWNvbnN0cmFpbnROX2RhdGEKLQotU3VjaCBhIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSBjb25zdHJhaW50cyB3aWxsIGJlIHJlZmVycmVkIHRvIGJlbG93Ci1hcyAiY29uc3RyYWludFtdIi4gQWdlbnRzIG1heSBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBhcmUgY29uc3RyYWludHMKLWJ5IGNoZWNraW5nIHdoZXRoZXIgYWRkaXRpb25hbCBkYXRhIGV4aXN0cyBpbiB0aGUgImFkZCBrZXkiIHJlcXVlc3QKLWFmdGVyIHRoZSBrZXkgZGF0YSBpdHNlbGYuIE9wZW5TU0ggd2lsbCByZWZ1c2UgdG8gYWRkIGEga2V5IGlmIGl0Ci1jb250YWlucyB1bmtub3duIGNvbnN0cmFpbnRzLgotCi0yLjIuMiBBZGQgcHJvdG9jb2wgMSBrZXkKLQotQSBjbGllbnQgbWF5IGFkZCBhIHByb3RvY29sIDEga2V5IHRvIGFuIGFnZW50IHdpdGggdGhlIGZvbGxvd2luZwotcmVxdWVzdDoKLQotCWJ5dGUJCQlTU0hfQUdFTlRDX0FERF9SU0FfSURFTlRJVFkgb3IKLQkJCQlTU0hfQUdFTlRDX0FERF9SU0FfSURfQ09OU1RSQUlORUQKLQl1aW50MzIJCQlpZ25vcmVkCi0JbXBpbnQxCQkJcnNhX24KLQltcGludDEJCQlyc2FfZQotCW1waW50MQkJCXJzYV9kCi0JbXBpbnQxCQkJcnNhX2lxbXAKLQltcGludDEJCQlyc2FfcQotCW1waW50MQkJCXJzYV9wCi0Jc3RyaW5nCQkJa2V5X2NvbW1lbnQKLQljb25zdHJhaW50W10JCWtleV9jb25zdHJhaW50cwotCi1Ob3RlIHRoYXQgdGhlcmUgaXMgc29tZSByZWR1bmRhbmN5IGluIHRoZSBrZXkgcGFyYW1ldGVyczsgYSBrZXkgY291bGQgYmUKLWZ1bGx5IHNwZWNpZmllZCB1c2luZyBqdXN0IHJzYV9xLCByc2FfcCBhbmQgcnNhX2UgYXQgdGhlIGNvc3Qgb2YgZXh0cmEKLWNvbXB1dGF0aW9uLgotCi0ia2V5X2NvbnN0cmFpbnRzIiBtYXkgb25seSBiZSBwcmVzZW50IGlmIHRoZSByZXF1ZXN0IHR5cGUgaXMKLVNTSF9BR0VOVENfQUREX1JTQV9JREVOVElUWS4KLQotVGhlIGFnZW50IHdpbGwgcmVwbHkgd2l0aCBhIFNTSF9BR0VOVF9TVUNDRVNTIGlmIHRoZSBrZXkgaGFzIGJlZW4KLXN1Y2Nlc3NmdWxseSBhZGRlZCBvciBhIFNTSF9BR0VOVF9GQUlMVVJFIGlmIGFuIGVycm9yIG9jY3VycmVkLgotCi0yLjIuMyBBZGQgcHJvdG9jb2wgMiBrZXkKLQotVGhlIE9wZW5TU0ggYWdlbnQgc3VwcG9ydHMgRFNBLCBFQ0RTQSBhbmQgUlNBIGtleXMgZm9yIHByb3RvY29sIDIuIERTQQota2V5cyBtYXkgYmUgYWRkZWQgdXNpbmcgdGhlIGZvbGxvd2luZyByZXF1ZXN0Ci0KLQlieXRlCQkJU1NIMl9BR0VOVENfQUREX0lERU5USVRZIG9yCi0JCQkJU1NIMl9BR0VOVENfQUREX0lEX0NPTlNUUkFJTkVECi0Jc3RyaW5nCQkJInNzaC1kc3MiCi0JbXBpbnQJCQlkc2FfcAotCW1waW50CQkJZHNhX3EKLQltcGludAkJCWRzYV9nCi0JbXBpbnQJCQlkc2FfcHVibGljX2tleQotCW1waW50CQkJZHNhX3ByaXZhdGVfa2V5Ci0Jc3RyaW5nCQkJa2V5X2NvbW1lbnQKLQljb25zdHJhaW50W10JCWtleV9jb25zdHJhaW50cwotCi1EU0EgY2VydGlmaWNhdGVzIG1heSBiZSBhZGRlZCB3aXRoOgotCWJ5dGUJCQlTU0gyX0FHRU5UQ19BRERfSURFTlRJVFkgb3IKLQkJCQlTU0gyX0FHRU5UQ19BRERfSURfQ09OU1RSQUlORUQKLQlzdHJpbmcJCQkic3NoLWRzcy1jZXJ0LXYwMEBvcGVuc3NoLmNvbSIKLQlzdHJpbmcJCQljZXJ0aWZpY2F0ZQotCW1waW50CQkJZHNhX3ByaXZhdGVfa2V5Ci0Jc3RyaW5nCQkJa2V5X2NvbW1lbnQKLQljb25zdHJhaW50W10JCWtleV9jb25zdHJhaW50cwotCi1FQ0RTQSBrZXlzIG1heSBiZSBhZGRlZCB1c2luZyB0aGUgZm9sbG93aW5nIHJlcXVlc3QKLQotCWJ5dGUJCQlTU0gyX0FHRU5UQ19BRERfSURFTlRJVFkgb3IKLQkJCQlTU0gyX0FHRU5UQ19BRERfSURfQ09OU1RSQUlORUQKLQlzdHJpbmcJCQkiZWNkc2Etc2hhMi1uaXN0cDI1NiIgfAotCQkJCSJlY2RzYS1zaGEyLW5pc3RwMzg0IiB8Ci0JCQkJImVjZHNhLXNoYTItbmlzdHA1MjEiCi0Jc3RyaW5nCQkJZWNkc2FfY3VydmVfbmFtZQotCXN0cmluZwkJCWVjZHNhX3B1YmxpY19rZXkKLQltcGludAkJCWVjZHNhX3ByaXZhdGUKLQlzdHJpbmcJCQlrZXlfY29tbWVudAotCWNvbnN0cmFpbnRbXQkJa2V5X2NvbnN0cmFpbnRzCi0KLUVDRFNBIGNlcnRpZmljYXRlcyBtYXkgYmUgYWRkZWQgd2l0aDoKLQlieXRlCQkJU1NIMl9BR0VOVENfQUREX0lERU5USVRZIG9yCi0JCQkJU1NIMl9BR0VOVENfQUREX0lEX0NPTlNUUkFJTkVECi0Jc3RyaW5nCQkJImVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20iIHwKLQkJCQkiZWNkc2Etc2hhMi1uaXN0cDM4NC1jZXJ0LXYwMUBvcGVuc3NoLmNvbSIgfAotCQkJCSJlY2RzYS1zaGEyLW5pc3RwNTIxLWNlcnQtdjAxQG9wZW5zc2guY29tIgotCXN0cmluZwkJCWNlcnRpZmljYXRlCi0JbXBpbnQJCQllY2RzYV9wcml2YXRlX2tleQotCXN0cmluZwkJCWtleV9jb21tZW50Ci0JY29uc3RyYWludFtdCQlrZXlfY29uc3RyYWludHMKLQotUlNBIGtleXMgbWF5IGJlIGFkZGVkIHdpdGggdGhpcyByZXF1ZXN0OgotCi0JYnl0ZQkJCVNTSDJfQUdFTlRDX0FERF9JREVOVElUWSBvcgotCQkJCVNTSDJfQUdFTlRDX0FERF9JRF9DT05TVFJBSU5FRAotCXN0cmluZwkJCSJzc2gtcnNhIgotCW1waW50CQkJcnNhX24KLQltcGludAkJCXJzYV9lCi0JbXBpbnQJCQlyc2FfZAotCW1waW50CQkJcnNhX2lxbXAKLQltcGludAkJCXJzYV9wCi0JbXBpbnQJCQlyc2FfcQotCXN0cmluZwkJCWtleV9jb21tZW50Ci0JY29uc3RyYWludFtdCQlrZXlfY29uc3RyYWludHMKLQotUlNBIGNlcnRpZmljYXRlcyBtYXkgYmUgYWRkZWQgd2l0aCB0aGlzIHJlcXVlc3Q6Ci0KLQlieXRlCQkJU1NIMl9BR0VOVENfQUREX0lERU5USVRZIG9yCi0JCQkJU1NIMl9BR0VOVENfQUREX0lEX0NPTlNUUkFJTkVECi0Jc3RyaW5nCQkJInNzaC1yc2EtY2VydC12MDBAb3BlbnNzaC5jb20iCi0Jc3RyaW5nCQkJY2VydGlmaWNhdGUKLQltcGludAkJCXJzYV9kCi0JbXBpbnQJCQlyc2FfaXFtcAotCW1waW50CQkJcnNhX3AKLQltcGludAkJCXJzYV9xCi0Jc3RyaW5nCQkJa2V5X2NvbW1lbnQKLQljb25zdHJhaW50W10JCWtleV9jb25zdHJhaW50cwotCi1Ob3RlIHRoYXQgdGhlICdyc2FfcCcgYW5kICdyc2FfcScgcGFyYW1ldGVycyBhcmUgc2VudCBpbiB0aGUgcmV2ZXJzZQotb3JkZXIgdG8gdGhlIHByb3RvY29sIDEgYWRkIGtleXMgbWVzc2FnZS4gQXMgd2l0aCB0aGUgY29ycmVzcG9uZGluZwotcHJvdG9jb2wgMSAiYWRkIGtleSIgcmVxdWVzdCwgdGhlIHByaXZhdGUga2V5IGlzIG92ZXJzcGVjaWZpZWQgdG8gYXZvaWQKLXJlZHVuZGFudCBwcm9jZXNzaW5nLgotCi1Gb3IgRFNBLCBFQ0RTQSBhbmQgUlNBIGtleSBhZGQgcmVxdWVzdHMsICJrZXlfY29uc3RyYWludHMiIG1heSBvbmx5IGJlCi1wcmVzZW50IGlmIHRoZSByZXF1ZXN0IHR5cGUgaXMgU1NIMl9BR0VOVENfQUREX0lEX0NPTlNUUkFJTkVELgotCi1UaGUgYWdlbnQgd2lsbCByZXBseSB3aXRoIGEgU1NIX0FHRU5UX1NVQ0NFU1MgaWYgdGhlIGtleSBoYXMgYmVlbgotc3VjY2Vzc2Z1bGx5IGFkZGVkIG9yIGEgU1NIX0FHRU5UX0ZBSUxVUkUgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0KLTIuMi40IExvYWRpbmcga2V5cyBmcm9tIGEgc21hcnRjYXJkCi0KLVRoZSBPcGVuU1NIIGFnZW50IG1heSBoYXZlIG9wdGlvbmFsIHNtYXJ0Y2FyZCBzdXBwb3J0IGJ1aWx0IGluIHRvIGl0LiBJZgotc28sIGl0IHN1cHBvcnRzIGFuIG9wZXJhdGlvbiB0byBsb2FkIGtleXMgZnJvbSBhIHNtYXJ0Y2FyZC4gVGVjaG5pY2FsbHksCi1vbmx5IHRoZSBwdWJsaWMgY29tcG9uZW50cyBvZiB0aGUga2V5cyBhcmUgbG9hZGVkIGludG8gdGhlIGFnZW50IHNvCi10aGlzIG9wZXJhdGlvbiByZWFsbHkgYXJyYW5nZXMgZm9yIGZ1dHVyZSBwcml2YXRlIGtleSBvcGVyYXRpb25zIHRvIGJlCi1kZWxlZ2F0ZWQgdG8gdGhlIHNtYXJ0Y2FyZC4KLQotCWJ5dGUJCQlTU0hfQUdFTlRDX0FERF9TTUFSVENBUkRfS0VZIG9yCi0JCQkJU1NIX0FHRU5UQ19BRERfU01BUlRDQVJEX0tFWV9DT05TVFJBSU5FRAotCXN0cmluZwkJCXJlYWRlcl9pZAotCXN0cmluZwkJCXBpbgotCWNvbnN0cmFpbnRbXQkJa2V5X2NvbnN0cmFpbnRzCi0KLSJyZWFkZXJfaWQiIGlzIGFuIGlkZW50aWZpZXIgdG8gYSBzbWFydGNhcmQgcmVhZGVyIGFuZCAicGluIgotaXMgYSBQSU4gb3IgcGFzc3BocmFzZSB1c2VkIHRvIHVubG9jayB0aGUgcHJpdmF0ZSBrZXkocykgb24gdGhlCi1kZXZpY2UuICJrZXlfY29uc3RyYWludHMiIG1heSBvbmx5IGJlIHByZXNlbnQgaWYgdGhlIHJlcXVlc3QgdHlwZSBpcwotU1NIX0FHRU5UQ19BRERfU01BUlRDQVJEX0tFWV9DT05TVFJBSU5FRC4KLQotVGhpcyBvcGVyYXRpb24gbWF5IGxvYWQgYWxsIFNTSCBrZXlzIHRoYXQgYXJlIHVubG9ja2VkIHVzaW5nIHRoZQotInBpbiIgb24gdGhlIHNwZWNpZmllZCByZWFkZXIuIFRoZSB0eXBlIG9mIGtleSBsb2FkZWQgKHByb3RvY29sIDEKLW9yIHByb3RvY29sIDIpIHdpbGwgYmUgc3BlY2lmaWVkIGJ5IHRoZSBzbWFydGNhcmQgaXRzZWxmLCBpdCBpcyBub3QKLWNsaWVudC1zcGVjaWZpZWQuCi0KLVRoZSBhZ2VudCB3aWxsIHJlcGx5IHdpdGggYSBTU0hfQUdFTlRfU1VDQ0VTUyBpZiBvbmUgb3IgbW9yZSBrZXlzIGhhdmUKLWJlZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZCBvciBhIFNTSF9BR0VOVF9GQUlMVVJFIGlmIGFuIGVycm9yIG9jY3VycmVkLgotVGhlIGFnZW50IHdpbGwgYWxzbyByZXR1cm4gU1NIX0FHRU5UX0ZBSUxVUkUgaWYgaXQgZG9lcyBub3Qgc3VwcG9ydAotc21hcnRjYXJkcy4KLQotMi4zIFJlbW92aW5nIG11bHRpcGxlIGtleXMKLQotQSBjbGllbnQgbWF5IHJlcXVlc3QgdGhhdCBhbiBhZ2VudCBkZWxldGUgYWxsIHByb3RvY29sIDEga2V5cyB1c2luZyB0aGUKLWZvbGxvd2luZyByZXF1ZXN0OgotCi0JYnl0ZQkJCVNTSF9BR0VOVENfUkVNT1ZFX0FMTF9SU0FfSURFTlRJVElFUwotCi1UaGlzIG1lc3NhZ2UgcmVxdWVzdHMgdGhlIGRlbGV0aW9uIG9mIGFsbCBwcm90b2NvbCAyIGtleXM6Ci0KLQlieXRlCQkJU1NIMl9BR0VOVENfUkVNT1ZFX0FMTF9JREVOVElUSUVTCi0KLU9uIHN1Y2Nlc3MsIHRoZSBhZ2VudCB3aWxsIGRlbGV0ZSBhbGwga2V5cyBvZiB0aGUgcmVxdWVzdGVkIHR5cGUgYW5kCi1yZXBseSB3aXRoIGEgU1NIX0FHRU5UX1NVQ0NFU1MgbWVzc2FnZS4gSWYgYW4gZXJyb3Igb2NjdXJyZWQsIHRoZSBhZ2VudAotd2lsbCByZXBseSB3aXRoIFNTSF9BR0VOVF9GQUlMVVJFLgotCi1Ob3RlIHRoYXQsIHRvIGRlbGV0ZSBhbGwga2V5cyAoYm90aCBwcm90b2NvbCAxIGFuZCAyKSwgYSBjbGllbnQKLW11c3Qgc2VuZCBib3RoIGEgU1NIX0FHRU5UQ19SRU1PVkVfQUxMX1JTQV9JREVOVElUSUVTIGFuZCBhCi1TU0gyX0FHRU5UQ19SRU1PVkVfQUxMX0lERU5USVRJRVMgcmVxdWVzdC4KLQotMi40IFJlbW92aW5nIHNwZWNpZmljIGtleXMKLQotMi40LjEgUmVtb3ZpbmcgYSBwcm90b2NvbCAxIGtleQotCi1SZW1vdmFsIG9mIGEgcHJvdG9jb2wgMSBrZXkgbWF5IGJlIHJlcXVlc3RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKLQotCWJ5dGUgCQkJU1NIX0FHRU5UQ19SRU1PVkVfUlNBX0lERU5USVRZCi0JdWludDMyCQkJa2V5X2JpdHMKLQltcGludDEJCQlyc2FfZQotCW1waW50MQkJCXJzYV9uCi0KLU5vdGUgdGhhdCBrZXlfYml0cyBpcyBzdHJpY3RseSByZWR1bmRhbnQsIGFzIGl0IG1heSBiZSBpbmZlcnJlZCBieSB0aGUKLWxlbmd0aCBvZiByc2Ffbi4KLQotVGhlIGFnZW50IHdpbGwgZGVsZXRlIGFueSBwcml2YXRlIGtleSBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHB1YmxpYyBrZXkKLWFuZCByZXR1cm4gU1NIX0FHRU5UX1NVQ0NFU1MuIElmIG5vIHN1Y2gga2V5IHdhcyBmb3VuZCwgdGhlIGFnZW50IHdpbGwKLXJldHVybiBTU0hfQUdFTlRfRkFJTFVSRS4KLQotMi40LjIgUmVtb3ZpbmcgYSBwcm90b2NvbCAyIGtleQotCi1Qcm90b2NvbCAyIGtleXMgbWF5IGJlIHJlbW92ZWQgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVlc3Q6Ci0KLQlieXRlCQkJU1NIMl9BR0VOVENfUkVNT1ZFX0lERU5USVRZCi0Jc3RyaW5nCQkJa2V5X2Jsb2IKLQotV2hlcmUgImtleV9ibG9iIiBpcyBlbmNvZGVkIGFzIHBlciBSRkMgNDI1MyBzZWN0aW9uIDYuNiAiUHVibGljIEtleQotQWxnb3JpdGhtcyIgZm9yIGFueSBvZiB0aGUgc3VwcG9ydGVkIHByb3RvY29sIDIga2V5IHR5cGVzLgotCi1UaGUgYWdlbnQgd2lsbCBkZWxldGUgYW55IHByaXZhdGUga2V5IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgcHVibGljIGtleQotYW5kIHJldHVybiBTU0hfQUdFTlRfU1VDQ0VTUy4gSWYgbm8gc3VjaCBrZXkgd2FzIGZvdW5kLCB0aGUgYWdlbnQgd2lsbAotcmV0dXJuIFNTSF9BR0VOVF9GQUlMVVJFLgotCi0yLjQuMyBSZW1vdmluZyBrZXlzIGxvYWRlZCBmcm9tIGEgc21hcnRjYXJkCi0KLUEgY2xpZW50IG1heSByZXF1ZXN0IHRoYXQgYSBzZXJ2ZXIgcmVtb3ZlIG9uZSBvciBtb3JlIHNtYXJ0Y2FyZC1ob3N0ZWQKLWtleXMgdXNpbmcgdGhpcyBtZXNzYWdlOgotCi0JYnl0ZQkJCVNTSF9BR0VOVENfUkVNT1ZFX1NNQVJUQ0FSRF9LRVkKLQlzdHJpbmcJCQlyZWFkZXJfaWQKLQlzdHJpbmcJCQlwaW4KLQotInJlYWRlcl9pZCIgdGhlIGFuIGlkZW50aWZpZXIgdG8gYSBzbWFydGNhcmQgcmVhZGVyIGFuZCAicGluIiBpcyBhIFBJTgotb3IgcGFzc3BocmFzZSB1c2VkIHRvIHVubG9jayB0aGUgcHJpdmF0ZSBrZXkocykgb24gdGhlIGRldmljZS4KLQotV2hlbiB0aGlzIG1lc3NhZ2UgaXMgcmVjZWl2ZWQsIGFuZCBpZiB0aGUgYWdlbnQgc3VwcG9ydHMKLXNtYXJ0Y2FyZC1ob3N0ZWQga2V5cywgaXQgd2lsbCBkZWxldGUgYWxsIGtleXMgdGhhdCBhcmUgaG9zdGVkIG9uIHRoZQotc3BlY2lmaWVkIHNtYXJ0Y2FyZCB0aGF0IG1heSBiZSBhY2Nlc3NlZCB3aXRoIHRoZSBnaXZlbiAicGluIi4KLQotVGhlIGFnZW50IHdpbGwgcmVwbHkgd2l0aCBhIFNTSF9BR0VOVF9TVUNDRVNTIGlmIG9uZSBvciBtb3JlIGtleXMgaGF2ZQotYmVlbiBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBvciBhIFNTSF9BR0VOVF9GQUlMVVJFIGlmIGFuIGVycm9yIG9jY3VycmVkLgotVGhlIGFnZW50IHdpbGwgYWxzbyByZXR1cm4gU1NIX0FHRU5UX0ZBSUxVUkUgaWYgaXQgZG9lcyBub3Qgc3VwcG9ydAotc21hcnRjYXJkcy4KLQotMi41IFJlcXVlc3RpbmcgYSBsaXN0IG9mIGtub3duIGtleXMKLQotQW4gYWdlbnQgbWF5IGJlIHJlcXVlc3RlZCB0byBsaXN0IHdoaWNoIGtleXMgaXQgaG9sZHMuIERpZmZlcmVudAotcmVxdWVzdHMgZXhpc3QgZm9yIHByb3RvY29sIDEgYW5kIHByb3RvY29sIDIga2V5cy4KLQotMi41LjEgUmVxdWVzdGluZyBhIGxpc3Qgb2YgcHJvdG9jb2wgMSBrZXlzCi0KLVRvIHJlcXVlc3QgYSBsaXN0IG9mIHByb3RvY29sIDEga2V5cyB0aGF0IGFyZSBoZWxkIGluIHRoZSBhZ2VudCwgYQotY2xpZW50IG1heSBzZW5kIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKLQotCWJ5dGUJCQlTU0hfQUdFTlRDX1JFUVVFU1RfUlNBX0lERU5USVRJRVMKLQotVGhlIGFnZW50IHdpbGwgcmVwbHkgd2l0aCB0aGUgZm9sbG93aW5nIG1lc3NhZ2U6Ci0KLQlieXRlCQkJU1NIX0FHRU5UX1JTQV9JREVOVElUSUVTX0FOU1dFUgotCXVpbnQzMgkJCW51bV9rZXlzCi0KLUZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBjb25zZWN1dGl2ZSBrZXlzLCBlbmNvZGVkIGFzOgotCi0JdWludDMyCQkJYml0cwotCW1waW50MQkJCXJzYV9lCi0JbXBpbnQxCQkJcnNhX24KLQlzdHJpbmcJCQlrZXlfY29tbWVudAotCi0yLjUuMiBSZXF1ZXN0aW5nIGEgbGlzdCBvZiBwcm90b2NvbCAyIGtleXMKLQotQSBjbGllbnQgbWF5IHNlbmQgdGhlIGZvbGxvd2luZyBtZXNzYWdlIHRvIHJlcXVlc3QgYSBsaXN0IG9mCi1wcm90b2NvbCAyIGtleXMgdGhhdCBhcmUgc3RvcmVkIGluIHRoZSBhZ2VudDoKLQotCWJ5dGUJCQlTU0gyX0FHRU5UQ19SRVFVRVNUX0lERU5USVRJRVMKLQotVGhlIGFnZW50IHdpbGwgcmVwbHkgd2l0aCB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgaGVhZGVyOgotCi0JYnl0ZQkJCVNTSDJfQUdFTlRfSURFTlRJVElFU19BTlNXRVIKLQl1aW50MzIJCQludW1fa2V5cwotCi1Gb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgY29uc2VjdXRpdmUga2V5cywgZW5jb2RlZCBhczoKLQotCXN0cmluZwkJCWtleV9ibG9iCi0Jc3RyaW5nCQkJa2V5X2NvbW1lbnQKLQotV2hlcmUgImtleV9ibG9iIiBpcyBlbmNvZGVkIGFzIHBlciBSRkMgNDI1MyBzZWN0aW9uIDYuNiAiUHVibGljIEtleQotQWxnb3JpdGhtcyIgZm9yIGFueSBvZiB0aGUgc3VwcG9ydGVkIHByb3RvY29sIDIga2V5IHR5cGVzLgotCi0yLjYgUHJpdmF0ZSBrZXkgb3BlcmF0aW9ucwotCi1UaGUgcHVycG9zZSBvZiB0aGUgYWdlbnQgaXMgdG8gcGVyZm9ybSBwcml2YXRlIGtleSBvcGVyYXRpb25zLCBzdWNoIGFzCi1zaWduaW5nIGFuZCBlbmNyeXB0aW9uIHdpdGhvdXQgcmVxdWlyaW5nIGEgcGFzc3BocmFzZSB0byB1bmxvY2sgdGhlCi1rZXkgYW5kIHdpdGhvdXQgYWxsb3dpbmcgdGhlIHByaXZhdGUga2V5IGl0c2VsZiB0byBiZSBleHBvc2VkLiBUaGVyZQotYXJlIHNlcGFyYXRlIHJlcXVlc3RzIGZvciB0aGUgcHJvdG9jb2wgMSBhbmQgcHJvdG9jb2wgMiBwcml2YXRlIGtleQotb3BlcmF0aW9ucy4KLQotMi42LjEgUHJvdG9jb2wgMSBwcml2YXRlIGtleSBjaGFsbGVuZ2UKLQotVGhlIHByaXZhdGUga2V5IG9wZXJhdGlvbiB1c2VkIGluIHZlcnNpb24gMSBvZiB0aGUgU1NIIHByb3RvY29sIGlzCi1kZWNyeXB0aW5nIGEgY2hhbGxlbmdlIHRoYXQgaGFzIGJlZW4gZW5jcnlwdGVkIHdpdGggYSBwdWJsaWMga2V5LgotSXQgbWF5IGJlIHJlcXVlc3RlZCB1c2luZyB0aGlzIG1lc3NhZ2U6Ci0KLQlieXRlCQkJU1NIX0FHRU5UQ19SU0FfQ0hBTExFTkdFCi0JdWludDMyCQkJaWdub3JlZAotCW1waW50MQkJCXJzYV9lCi0JbXBpbnQxCQkJcnNhX24KLQltcGludDEJCQllbmNyeXB0ZWRfY2hhbGxlbmdlCi0JYnl0ZVsxNl0JCXNlc3Npb25faWQKLQl1aW50MzIJCQlyZXNwb25zZV90eXBlIC8qIG11c3QgYmUgMSAqLwotCi0icnNhX2UiIGFuZCAicnNhX24iIGFyZSB1c2VkIHRvIGlkZW50aWZ5IHdoaWNoIHByaXZhdGUga2V5IHRvIHVzZS4KLSJlbmNyeXB0ZWRfY2hhbGxlbmdlIiBpcyBhIGNoYWxsZW5nZSBibG9iIHRoYXQgaGFzIChwcmVzdW1hYmx5KQotYmVlbiBlbmNyeXB0ZWQgd2l0aCB0aGUgcHVibGljIGtleSBhbmQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgCi0xIDw9IGVuY3J5cHRlZF9jaGFsbGVuZ2UgPCAyXjI1Ni4gInNlc3Npb25faWQiIGlzIHRoZSBTU0ggcHJvdG9jb2wgMQotc2Vzc2lvbiBJRCAoY29tcHV0ZWQgZnJvbSB0aGUgc2VydmVyIGhvc3Qga2V5LCB0aGUgc2VydmVyIHNlbWktZXBoZW1lcmFsCi1rZXkgYW5kIHRoZSBzZXNzaW9uIGNvb2tpZSkuCi0KLSJpZ25vcmVkIiBhbmQgInJlc3BvbnNlX3R5cGUiIGV4aXN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5Ci1pbXBsZW1lbnRhdGlvbnMuICJyZXNwb25zZV90eXBlIiBtdXN0IGJlIGVxdWFsIHRvIDE7IG90aGVyIHJlc3BvbnNlCi10eXBlcyBhcmUgbm90IHN1cHBvcnRlZC4KLQotT24gcmVjZWl2aW5nIHRoaXMgcmVxdWVzdCwgdGhlIHNlcnZlciBkZWNyeXB0cyB0aGUgImVuY3J5cHRlZF9jaGFsbGVuZ2UiCi11c2luZyB0aGUgcHJpdmF0ZSBrZXkgbWF0Y2hpbmcgdGhlIHN1cHBsaWVkIChyc2FfZSwgcnNhX24pIHZhbHVlcy4gRm9yCi10aGUgcmVzcG9uc2UgZGVyaXZhdGlvbiwgdGhlIGRlY3J5cHRlZCBjaGFsbGVuZ2UgaXMgcmVwcmVzZW50ZWQgYXMgYW4KLXVuc2lnbmVkLCBiaWctZW5kaWFuIGludGVnZXIgZW5jb2RlZCBpbiBhIDMyIGJ5dGUgYnVmZmVyIChpLmUuIHZhbHVlcwotc21hbGxlciB0aGFuIDJeMjQ4IHdpbGwgaGF2ZSBsZWFkaW5nIDAgYnl0ZXMpLgotCi1UaGUgcmVzcG9uc2UgdmFsdWUgaXMgdGhlbiBjYWxjdWxhdGVkIGFzOgotCi0JcmVzcG9uc2UgPSBNRDUoZGVjcnlwdGVkX2NoYWxsZW5nZSB8fCBzZXNzaW9uX2lkKQotCi1hbmQgcmV0dXJuZWQgaW4gdGhlIGZvbGxvd2luZyBtZXNzYWdlCi0KLQlieXRlCQkJU1NIX0FHRU5UX1JTQV9SRVNQT05TRQotCWJ5dGVbMTZdCQlyZXNwb25zZQotCi1JZiB0aGUgYWdlbnQgY2Fubm90IGZpbmQgdGhlIGtleSBzcGVjaWZpZWQgYnkgdGhlIHN1cHBsaWVkIChyc2FfZSwKLXJzYV9uKSB0aGVuIGl0IHdpbGwgcmV0dXJuIFNTSF9BR0VOVF9GQUlMVVJFLgotCi0yLjYuMiBQcm90b2NvbCAyIHByaXZhdGUga2V5IHNpZ25hdHVyZSByZXF1ZXN0Ci0KLUEgY2xpZW50IG1heSB1c2UgdGhlIGZvbGxvd2luZyBtZXNzYWdlIHRvIHJlcXVlc3Qgc2lnbmluZyBvZiBkYXRhIHVzaW5nCi1hIHByb3RvY29sIDIga2V5OgotCi0JYnl0ZQkJCVNTSDJfQUdFTlRDX1NJR05fUkVRVUVTVAotCXN0cmluZwkJCWtleV9ibG9iCi0Jc3RyaW5nCQkJZGF0YQotCXVpbnQzMgkJCWZsYWdzCi0KLVdoZXJlICJrZXlfYmxvYiIgaXMgZW5jb2RlZCBhcyBwZXIgUkZDIDQyNTMgc2VjdGlvbiA2LjYgIlB1YmxpYyBLZXkKLUFsZ29yaXRobXMiIGZvciBhbnkgb2YgdGhlIHN1cHBvcnRlZCBwcm90b2NvbCAyIGtleSB0eXBlcy4gImZsYWdzIiBpcwotYSBiaXQtbWFzaywgYnV0IGF0IHByZXNlbnQgb25seSBvbmUgcG9zc2libGUgdmFsdWUgaXMgZGVmaW5lZCAoc2VlIGJlbG93Ci1mb3IgaXRzIG1lYW5pbmcpOgotCi0JU1NIX0FHRU5UX09MRF9TSUdOQVRVUkUJCTEKLQotVXBvbiByZWNlaXZpbmcgdGhpcyByZXF1ZXN0LCB0aGUgYWdlbnQgd2lsbCBsb29rIHVwIHRoZSBwcml2YXRlIGtleSB0aGF0Ci1jb3JyZXNwb25kcyB0byB0aGUgcHVibGljIGtleSBjb250YWluZWQgaW4ga2V5X2Jsb2IuIEl0IHdpbGwgdXNlIHRoaXMKLXByaXZhdGUga2V5IHRvIHNpZ24gdGhlICJkYXRhIiBhbmQgcHJvZHVjZSBhIHNpZ25hdHVyZSBibG9iIHVzaW5nIHRoZQota2V5IHR5cGUtc3BlY2lmaWMgbWV0aG9kIGRlc2NyaWJlZCBpbiBSRkMgNDI1MyBzZWN0aW9uIDYuNiAiUHVibGljIEtleQotQWxnb3JpdGhtcyIuCi0KLUFuIGV4Y2VwdGlvbiB0byB0aGlzIGlzIGZvciAic3NoLWRzcyIga2V5cyB3aGVyZSB0aGUgImZsYWdzIiB3b3JkCi1jb250YWlucyB0aGUgdmFsdWUgU1NIX0FHRU5UX09MRF9TSUdOQVRVUkUuIEluIHRoaXMgY2FzZSwgYSBsZWdhY3kKLXNpZ25hdHVyZSBlbmNvZGluZyBpcyB1c2VkIGluIGxpZXUgb2YgdGhlIHN0YW5kYXJkIG9uZS4gSW4gdGhpcyBjYXNlLAotdGhlIERTQSBzaWduYXR1cmUgYmxvYiBpcyBlbmNvZGVkIGFzOgotCi0JYnl0ZVs0MF0JCXNpZ25hdHVyZQotCi1UaGUgc2lnbmF0dXJlIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIG1lc3NhZ2U6Ci0KLQlieXRlCQkJU1NIMl9BR0VOVF9TSUdOX1JFU1BPTlNFCi0Jc3RyaW5nCQkJc2lnbmF0dXJlX2Jsb2IKLQotSWYgdGhlIGFnZW50IGNhbm5vdCBmaW5kIHRoZSBrZXkgc3BlY2lmaWVkIGJ5IHRoZSBzdXBwbGllZCBrZXlfYmxvYiB0aGVuCi1pdCB3aWxsIHJldHVybiBTU0hfQUdFTlRfRkFJTFVSRS4KLQotMi43IExvY2tpbmcgb3IgdW5sb2NraW5nIGFuIGFnZW50Ci0KLVRoZSBhZ2VudCBzdXBwb3J0cyB0ZW1wb3JhcnkgbG9ja2luZyB3aXRoIGEgcGFzc3BocmFzZSB0byBzdXNwZW5kCi1wcm9jZXNzaW5nIG9mIHNlbnNpdGl2ZSBvcGVyYXRpb25zIHVudGlsIGl0IGhhcyBiZWVuIHVubG9ja2VkIHdpdGggdGhlCi1zYW1lIHBhc3NwaHJhc2UuIFRvIGxvY2sgYW4gYWdlbnQsIGEgY2xpZW50IHNlbmQgdGhlIGZvbGxvd2luZyByZXF1ZXN0OgotCi0JYnl0ZQkJCVNTSF9BR0VOVENfTE9DSwotCXN0cmluZwkJCXBhc3NwaHJhc2UKLQotVXBvbiByZWNlaXB0IG9mIHRoaXMgbWVzc2FnZSBhbmQgaWYgdGhlIGFnZW50IGlzIG5vdCBhbHJlYWR5IGxvY2tlZCwKLWl0IHdpbGwgc3VzcGVuZCBwcm9jZXNzaW5nIHJlcXVlc3RzIGFuZCByZXR1cm4gYSBTU0hfQUdFTlRfU1VDQ0VTUwotcmVwbHkuIElmIHRoZSBhZ2VudCBpcyBhbHJlYWR5IGxvY2tlZCwgaXQgd2lsbCByZXR1cm4gU1NIX0FHRU5UX0ZBSUxVUkUuCi0KLVdoaWxlIGxvY2tlZCwgdGhlIGFnZW50IHdpbGwgcmVmdXNlIGFsbCByZXF1ZXN0cyBleGNlcHQKLVNTSF9BR0VOVENfVU5MT0NLLCBTU0hfQUdFTlRDX1JFUVVFU1RfUlNBX0lERU5USVRJRVMgYW5kCi1TU0gyX0FHRU5UQ19SRVFVRVNUX0lERU5USVRJRVMuIFRoZSAicmVxdWVzdCBpZGVudGl0aWVzIiByZXF1ZXN0cyBhcmUKLXRyZWF0ZWQgc3BlY2lhbGx5IGJ5IGEgbG9ja2VkIGFnZW50OiBpdCB3aWxsIGFsd2F5cyByZXR1cm4gYW4gZW1wdHkgbGlzdAotb2Yga2V5cy4KLQotVG8gdW5sb2NrIGFuIGFnZW50LCBhIGNsaWVudCBtYXkgcmVxdWVzdDoKLQotCWJ5dGUJCQlTU0hfQUdFTlRDX1VOTE9DSwotCXN0cmluZwkJCXBhc3NwaHJhc2UKLQotSWYgdGhlIHBhc3NwaHJhc2UgbWF0Y2hlcyBhbmQgdGhlIGFnZW50IGlzIGxvY2tlZCwgdGhlbiBpdCB3aWxsIHJlc3VtZQotcHJvY2Vzc2luZyBhbGwgcmVxdWVzdHMgYW5kIHJldHVybiBTU0hfQUdFTlRfU1VDQ0VTUy4gSWYgdGhlIGFnZW50Ci1pcyBub3QgbG9ja2VkIG9yIHRoZSBwYXNzcGhyYXNlIGRvZXMgbm90IG1hdGNoIHRoZW4gaXQgd2lsbCByZXR1cm4KLVNTSF9BR0VOVF9GQUlMVVJFLgotCi1Mb2NraW5nIGFuZCB1bmxvY2tpbmcgYWZmZWN0cyBib3RoIHByb3RvY29sIDEgYW5kIHByb3RvY29sIDIga2V5cy4KLQotMy4gUHJvdG9jb2wgbWVzc2FnZSBudW1iZXJzCi0KLTMuMSBSZXF1ZXN0cyBmcm9tIGNsaWVudCB0byBhZ2VudCBmb3IgcHJvdG9jb2wgMSBrZXkgb3BlcmF0aW9ucwotCi0JU1NIX0FHRU5UQ19SRVFVRVNUX1JTQV9JREVOVElUSUVTCQkxCi0JU1NIX0FHRU5UQ19SU0FfQ0hBTExFTkdFCQkJMwotCVNTSF9BR0VOVENfQUREX1JTQV9JREVOVElUWQkJCTcKLQlTU0hfQUdFTlRDX1JFTU9WRV9SU0FfSURFTlRJVFkJCQk4Ci0JU1NIX0FHRU5UQ19SRU1PVkVfQUxMX1JTQV9JREVOVElUSUVTCQk5Ci0JU1NIX0FHRU5UQ19BRERfUlNBX0lEX0NPTlNUUkFJTkVECQkyNAotCi0zLjIgUmVxdWVzdHMgZnJvbSBjbGllbnQgdG8gYWdlbnQgZm9yIHByb3RvY29sIDIga2V5IG9wZXJhdGlvbnMKLQotCVNTSDJfQUdFTlRDX1JFUVVFU1RfSURFTlRJVElFUwkJCTExCi0JU1NIMl9BR0VOVENfU0lHTl9SRVFVRVNUCQkJMTMKLQlTU0gyX0FHRU5UQ19BRERfSURFTlRJVFkJCQkxNwotCVNTSDJfQUdFTlRDX1JFTU9WRV9JREVOVElUWQkJCTE4Ci0JU1NIMl9BR0VOVENfUkVNT1ZFX0FMTF9JREVOVElUSUVTCQkxOQotCVNTSDJfQUdFTlRDX0FERF9JRF9DT05TVFJBSU5FRAkJCTI1Ci0KLTMuMyBLZXktdHlwZSBpbmRlcGVuZGVudCByZXF1ZXN0cyBmcm9tIGNsaWVudCB0byBhZ2VudAotCi0JU1NIX0FHRU5UQ19BRERfU01BUlRDQVJEX0tFWQkJCTIwCi0JU1NIX0FHRU5UQ19SRU1PVkVfU01BUlRDQVJEX0tFWQkJCTIxCi0JU1NIX0FHRU5UQ19MT0NLCQkJCQkyMgotCVNTSF9BR0VOVENfVU5MT0NLCQkJCTIzCi0JU1NIX0FHRU5UQ19BRERfU01BUlRDQVJEX0tFWV9DT05TVFJBSU5FRAkyNgotCi0zLjQgR2VuZXJpYyByZXBsaWVzIGZyb20gYWdlbnQgdG8gY2xpZW50Ci0KLQlTU0hfQUdFTlRfRkFJTFVSRQkJCQk1Ci0JU1NIX0FHRU5UX1NVQ0NFU1MJCQkJNgotCi0zLjUgUmVwbGllcyBmcm9tIGFnZW50IHRvIGNsaWVudCBmb3IgcHJvdG9jb2wgMSBrZXkgb3BlcmF0aW9ucwotCi0JU1NIX0FHRU5UX1JTQV9JREVOVElUSUVTX0FOU1dFUgkJCTIKLQlTU0hfQUdFTlRfUlNBX1JFU1BPTlNFCQkJCTQKLQotMy42IFJlcGxpZXMgZnJvbSBhZ2VudCB0byBjbGllbnQgZm9yIHByb3RvY29sIDIga2V5IG9wZXJhdGlvbnMKLQotCVNTSDJfQUdFTlRfSURFTlRJVElFU19BTlNXRVIJCQkxMgotCVNTSDJfQUdFTlRfU0lHTl9SRVNQT05TRQkJCTE0Ci0KLTMuNyBLZXkgY29uc3RyYWludCBpZGVudGlmaWVycwotCi0JU1NIX0FHRU5UX0NPTlNUUkFJTl9MSUZFVElNRQkJCTEKLQlTU0hfQUdFTlRfQ09OU1RSQUlOX0NPTkZJUk0JCQkyCi0KLSRPcGVuQlNEOiBQUk9UT0NPTC5hZ2VudCx2IDEuNiAyMDEwLzA4LzMxIDExOjU0OjQ1IGRqbSBFeHAgJApkaWZmIC0tZ2l0IGEvUFJPVE9DT0wuY2VydGtleXMgYi9QUk9UT0NPTC5jZXJ0a2V5cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5NzY0OS4uMDAwMDAwMAotLS0gYS9QUk9UT0NPTC5jZXJ0a2V5cworKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBhIHNpbXBsZSBwdWJsaWMta2V5IGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uCi1zeXN0ZW0gZm9yIHVzZSBieSBTU0guCi0KLUJhY2tncm91bmQKLS0tLS0tLS0tLS0KLQotVGhlIFNTSCBwcm90b2NvbCBjdXJyZW50bHkgc3VwcG9ydHMgYSBzaW1wbGUgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbgotbWVjaGFuaXNtLiBVbmxpa2Ugb3RoZXIgcHVibGljIGtleSBpbXBsZW1lbnRhdGlvbnMsIFNTSCBlc2NoZXdzIHRoZSB1c2UKLW9mIFguNTA5IGNlcnRpZmljYXRlcyBhbmQgdXNlcyByYXcga2V5cy4gVGhpcyBhcHByb2FjaCBoYXMgc29tZSBiZW5lZml0cwotcmVsYXRpbmcgdG8gc2ltcGxpY2l0eSBvZiBjb25maWd1cmF0aW9uIGFuZCBtaW5pbWlzYXRpb24gb2YgYXR0YWNrCi1zdXJmYWNlLCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgaW1wb3J0YW50IHVzZS1jYXNlcyBvZiBjZW50cmFsbHkKLW1hbmFnZWQsIHBhc3N3b3JkbGVzcyBhdXRoZW50aWNhdGlvbiBhbmQgY2VudHJhbGx5IGNlcnRpZmllZCBob3N0IGtleXMuCi0KLVRoZXNlIHByb3RvY29sIGV4dGVuc2lvbnMgYnVpbGQgb24gdGhlIHNpbXBsZSBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uCi1zeXN0ZW0gYWxyZWFkeSBpbiBTU0ggdG8gYWxsb3cgY2VydGlmaWNhdGUtYmFzZWQgYXV0aGVudGljYXRpb24uIFRoZQotY2VydGlmaWNhdGVzIHVzZWQgYXJlIG5vdCB0cmFkaXRpb25hbCBYLjUwOSBjZXJ0aWZpY2F0ZXMsIHdpdGggbnVtZXJvdXMKLW9wdGlvbnMgYW5kIGNvbXBsZXggZW5jb2RpbmcgcnVsZXMsIGJ1dCBzb21ldGhpbmcgcmF0aGVyIG1vcmUgbWluaW1hbDogYQota2V5LCBzb21lIGlkZW50aXR5IGluZm9ybWF0aW9uIGFuZCB1c2FnZSBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHNpZ25lZAotd2l0aCBzb21lIG90aGVyIHRydXN0ZWQga2V5LgotCi1BIHNzaGQgc2VydmVyIG1heSBiZSBjb25maWd1cmVkIHRvIGFsbG93IGF1dGhlbnRpY2F0aW9uIHZpYSBjZXJ0aWZpZWQKLWtleXMsIGJ5IGV4dGVuZGluZyB0aGUgZXhpc3Rpbmcgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cyBtZWNoYW5pc20gdG8KLWFsbG93IHNwZWNpZmljYXRpb24gb2YgY2VydGlmaWNhdGlvbiBhdXRob3JpdHkga2V5cyBpbiBhZGRpdGlvbiB0bwotcmF3IHVzZXIga2V5cy4gVGhlIHNzaCBjbGllbnQgd2lsbCBzdXBwb3J0IGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gb2YKLWFjY2VwdGFuY2Ugb2YgY2VydGlmaWVkIGhvc3Qga2V5cywgYnkgYWRkaW5nIGEgc2ltaWxhciBhYmlsaXR5IHRvCi1zcGVjaWZ5IENBIGtleXMgaW4gfi8uc3NoL2tub3duX2hvc3RzLgotCi1DZXJ0aWZpZWQga2V5cyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgbmV3IGtleSB0eXBlczoKLQotICAgIHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20KLSAgICBzc2gtZHNzLWNlcnQtdjAxQG9wZW5zc2guY29tCi0gICAgZWNkc2Etc2hhMi1uaXN0cDI1Ni1jZXJ0LXYwMUBvcGVuc3NoLmNvbQotICAgIGVjZHNhLXNoYTItbmlzdHAzODQtY2VydC12MDFAb3BlbnNzaC5jb20KLSAgICBlY2RzYS1zaGEyLW5pc3RwNTIxLWNlcnQtdjAxQG9wZW5zc2guY29tCi0KLVRoZXNlIGluY2x1ZGUgY2VydGlmaWNhdGlvbiBpbmZvcm1hdGlvbiBhbG9uZyB3aXRoIHRoZSBwdWJsaWMga2V5Ci10aGF0IGlzIHVzZWQgdG8gc2lnbiBjaGFsbGVuZ2VzLiBzc2gta2V5Z2VuIHBlcmZvcm1zIHRoZSBDQSBzaWduaW5nCi1vcGVyYXRpb24uCi0KLVByb3RvY29sIGV4dGVuc2lvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIFNTSCB3aXJlIHByb3RvY29sIGluY2x1ZGVzIHNldmVyYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zLgotVGhlc2UgbW9kaWZpY2F0aW9ucyBzaGFsbCB0YWtlIGFkdmFudGFnZSBvZiBuYW1lc3BhY2VkIHB1YmxpYyBrZXkKLWFsZ29yaXRobSBuYW1lcyB0byBhZGQgc3VwcG9ydCBmb3IgY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24gd2l0aG91dAotYnJlYWtpbmcgdGhlIHByb3RvY29sIC0gaW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlCi1leHRlbnNpb25zIHdpbGwgc2ltcGx5IGlnbm9yZSB0aGVtLgotCi1BdXRoZW50aWNhdGlvbiB1c2luZyB0aGUgbmV3IGtleSBmb3JtYXRzIGRlc2NyaWJlZCBiZWxvdyBwcm9jZWVkcwotdXNpbmcgdGhlIGV4aXN0aW5nIFNTSCAicHVibGlja2V5IiBhdXRoZW50aWNhdGlvbiBtZXRob2QgZGVzY3JpYmVkCi1pbiBSRkM0MjUyIHNlY3Rpb24gNy4KLQotTmV3IHB1YmxpYyBrZXkgZm9ybWF0cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgY2VydGlmaWNhdGUga2V5IHR5cGVzIHRha2UgYSBzaW1pbGFyIGhpZ2gtbGV2ZWwgZm9ybWF0IChub3RlOiBkYXRhCi10eXBlcyBhbmQgZW5jb2RpbmcgYXJlIGFzIHBlciBSRkM0MjUxIHNlY3Rpb24gNSkuIFRoZSBzZXJpYWxpc2VkIHdpcmUKLWVuY29kaW5nIG9mIHRoZXNlIGNlcnRpZmljYXRlcyBpcyBhbHNvIHVzZWQgZm9yIHN0b3JpbmcgdGhlbSBvbiBkaXNrLgotCi0jZGVmaW5lIFNTSF9DRVJUX1RZUEVfVVNFUiAgICAxCi0jZGVmaW5lIFNTSF9DRVJUX1RZUEVfSE9TVCAgICAyCi0KLVJTQSBjZXJ0aWZpY2F0ZQotCi0gICAgc3RyaW5nICAgICJzc2gtcnNhLWNlcnQtdjAxQG9wZW5zc2guY29tIgotICAgIHN0cmluZyAgICBub25jZQotICAgIG1waW50ICAgICBlCi0gICAgbXBpbnQgICAgIG4KLSAgICB1aW50NjQgICAgc2VyaWFsCi0gICAgdWludDMyICAgIHR5cGUKLSAgICBzdHJpbmcgICAga2V5IGlkCi0gICAgc3RyaW5nICAgIHZhbGlkIHByaW5jaXBhbHMKLSAgICB1aW50NjQgICAgdmFsaWQgYWZ0ZXIKLSAgICB1aW50NjQgICAgdmFsaWQgYmVmb3JlCi0gICAgc3RyaW5nICAgIGNyaXRpY2FsIG9wdGlvbnMKLSAgICBzdHJpbmcgICAgZXh0ZW5zaW9ucwotICAgIHN0cmluZyAgICByZXNlcnZlZAotICAgIHN0cmluZyAgICBzaWduYXR1cmUga2V5Ci0gICAgc3RyaW5nICAgIHNpZ25hdHVyZQotCi1EU0EgY2VydGlmaWNhdGUKLQotICAgIHN0cmluZyAgICAic3NoLWRzcy1jZXJ0LXYwMUBvcGVuc3NoLmNvbSIKLSAgICBzdHJpbmcgICAgbm9uY2UKLSAgICBtcGludCAgICAgcAotICAgIG1waW50ICAgICBxCi0gICAgbXBpbnQgICAgIGcKLSAgICBtcGludCAgICAgeQotICAgIHVpbnQ2NCAgICBzZXJpYWwKLSAgICB1aW50MzIgICAgdHlwZQotICAgIHN0cmluZyAgICBrZXkgaWQKLSAgICBzdHJpbmcgICAgdmFsaWQgcHJpbmNpcGFscwotICAgIHVpbnQ2NCAgICB2YWxpZCBhZnRlcgotICAgIHVpbnQ2NCAgICB2YWxpZCBiZWZvcmUKLSAgICBzdHJpbmcgICAgY3JpdGljYWwgb3B0aW9ucwotICAgIHN0cmluZyAgICBleHRlbnNpb25zCi0gICAgc3RyaW5nICAgIHJlc2VydmVkCi0gICAgc3RyaW5nICAgIHNpZ25hdHVyZSBrZXkKLSAgICBzdHJpbmcgICAgc2lnbmF0dXJlCi0KLUVDRFNBIGNlcnRpZmljYXRlCi0KLSAgICBzdHJpbmcgICAgImVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20iIHwKLSAgICAgICAgICAgICAgImVjZHNhLXNoYTItbmlzdHAzODRAb3BlbnNzaC5jb20iIHwKLSAgICAgICAgICAgICAgImVjZHNhLXNoYTItbmlzdHA1MjFAb3BlbnNzaC5jb20iCi0gICAgc3RyaW5nICAgIG5vbmNlCi0gICAgc3RyaW5nICAgIGN1cnZlCi0gICAgc3RyaW5nICAgIHB1YmxpY19rZXkKLSAgICB1aW50NjQgICAgc2VyaWFsCi0gICAgdWludDMyICAgIHR5cGUKLSAgICBzdHJpbmcgICAga2V5IGlkCi0gICAgc3RyaW5nICAgIHZhbGlkIHByaW5jaXBhbHMKLSAgICB1aW50NjQgICAgdmFsaWQgYWZ0ZXIKLSAgICB1aW50NjQgICAgdmFsaWQgYmVmb3JlCi0gICAgc3RyaW5nICAgIGNyaXRpY2FsIG9wdGlvbnMKLSAgICBzdHJpbmcgICAgZXh0ZW5zaW9ucwotICAgIHN0cmluZyAgICByZXNlcnZlZAotICAgIHN0cmluZyAgICBzaWduYXR1cmUga2V5Ci0gICAgc3RyaW5nICAgIHNpZ25hdHVyZQotCi1UaGUgbm9uY2UgZmllbGQgaXMgYSBDQS1wcm92aWRlZCByYW5kb20gYml0c3RyaW5nIG9mIGFyYml0cmFyeSBsZW5ndGgKLShidXQgdHlwaWNhbGx5IDE2IG9yIDMyIGJ5dGVzKSBpbmNsdWRlZCB0byBtYWtlIGF0dGFja3MgdGhhdCBkZXBlbmQgb24KLWluZHVjaW5nIGNvbGxpc2lvbnMgaW4gdGhlIHNpZ25hdHVyZSBoYXNoIGluZmVhc2libGUuCi0KLWUgYW5kIG4gYXJlIHRoZSBSU0EgZXhwb25lbnQgYW5kIHB1YmxpYyBtb2R1bHVzIHJlc3BlY3RpdmVseS4KLQotcCwgcSwgZywgeSBhcmUgdGhlIERTQSBwYXJhbWV0ZXJzIGFzIGRlc2NyaWJlZCBpbiBGSVBTLTE4Ni0yLgotCi1jdXJ2ZSBhbmQgcHVibGljIGtleSBhcmUgcmVzcGVjdGl2ZWx5IHRoZSBFQ0RTQSAiW2lkZW50aWZpZXJdIiBhbmQgIlEiCi1kZWZpbmVkIGluIHNlY3Rpb24gMy4xIG9mIFJGQzU2NTYuCi0KLXNlcmlhbCBpcyBhbiBvcHRpb25hbCBjZXJ0aWZpY2F0ZSBzZXJpYWwgbnVtYmVyIHNldCBieSB0aGUgQ0EgdG8KLXByb3ZpZGUgYW4gYWJicmV2aWF0ZWQgd2F5IHRvIHJlZmVyIHRvIGNlcnRpZmljYXRlcyBmcm9tIHRoYXQgQ0EuCi1JZiBhIENBIGRvZXMgbm90IHdpc2ggdG8gbnVtYmVyIGl0cyBjZXJ0aWZpY2F0ZXMgaXQgbXVzdCBzZXQgdGhpcwotZmllbGQgdG8gemVyby4KLQotdHlwZSBzcGVjaWZpZXMgd2hldGhlciB0aGlzIGNlcnRpZmljYXRlIGlzIGZvciBpZGVudGlmaWNhdGlvbiBvZiBhIHVzZXIKLW9yIGEgaG9zdCB1c2luZyBhIFNTSF9DRVJUX1RZUEVfLi4uIHZhbHVlLgotCi1rZXkgaWQgaXMgYSBmcmVlLWZvcm0gdGV4dCBmaWVsZCB0aGF0IGlzIGZpbGxlZCBpbiBieSB0aGUgQ0EgYXQgdGhlIHRpbWUKLW9mIHNpZ25pbmc7IHRoZSBpbnRlbnRpb24gaXMgdGhhdCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWVsZCBhcmUgdXNlZCB0bwotaWRlbnRpZnkgdGhlIGlkZW50aXR5IHByaW5jaXBhbCBpbiBsb2cgbWVzc2FnZXMuCi0KLSJ2YWxpZCBwcmluY2lwYWxzIiBpcyBhIHN0cmluZyBjb250YWluaW5nIHplcm8gb3IgbW9yZSBwcmluY2lwYWxzIGFzCi1zdHJpbmdzIHBhY2tlZCBpbnNpZGUgaXQuIFRoZXNlIHByaW5jaXBhbHMgbGlzdCB0aGUgbmFtZXMgZm9yIHdoaWNoIHRoaXMKLWNlcnRpZmljYXRlIGlzIHZhbGlkOyBob3N0bmFtZXMgZm9yIFNTSF9DRVJUX1RZUEVfSE9TVCBjZXJ0aWZpY2F0ZXMgYW5kCi11c2VybmFtZXMgZm9yIFNTSF9DRVJUX1RZUEVfVVNFUiBjZXJ0aWZpY2F0ZXMuIEFzIGEgc3BlY2lhbCBjYXNlLCBhCi16ZXJvLWxlbmd0aCAidmFsaWQgcHJpbmNpcGFscyIgZmllbGQgbWVhbnMgdGhlIGNlcnRpZmljYXRlIGlzIHZhbGlkIGZvcgotYW55IHByaW5jaXBhbCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuIFhYWCBETlMgd2lsZGNhcmRzPwotCi0idmFsaWQgYWZ0ZXIiIGFuZCAidmFsaWQgYmVmb3JlIiBzcGVjaWZ5IGEgdmFsaWRpdHkgcGVyaW9kIGZvciB0aGUKLWNlcnRpZmljYXRlLiBFYWNoIHJlcHJlc2VudHMgYSB0aW1lIGluIHNlY29uZHMgc2luY2UgMTk3MC0wMS0wMQotMDA6MDA6MDAuIEEgY2VydGlmaWNhdGUgaXMgY29uc2lkZXJlZCB2YWxpZCBpZjoKLQotICAgIHZhbGlkIGFmdGVyIDw9IGN1cnJlbnQgdGltZSA8IHZhbGlkIGJlZm9yZQotCi1jcml0aWNpYWwgb3B0aW9ucyBpcyBhIHNldCBvZiB6ZXJvIG9yIG1vcmUga2V5IG9wdGlvbnMgZW5jb2RlZCBhcwotYmVsb3cuIEFsbCBzdWNoIG9wdGlvbnMgYXJlICJjcml0aWNhbCIgaW4gdGhlIHNlbnNlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24KLW11c3QgcmVmdXNlIHRvIGF1dGhvcmlzZSBhIGtleSB0aGF0IGhhcyBhbiB1bnJlY29nbmlzZWQgb3B0aW9uLgotCi1leHRlbnNpb25zIGlzIGEgc2V0IG9mIHplcm8gb3IgbW9yZSBvcHRpb25hbCBleHRlbnNpb25zLiBUaGVzZSBleHRlbnNpb25zCi1hcmUgbm90IGNyaXRpY2FsLCBhbmQgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBlbmNvdW50ZXJzIG9uZSB0aGF0IGl0IGRvZXMKLW5vdCByZWNvZ25pc2UgbWF5IHNhZmVseSBpZ25vcmUgaXQuCi0KLVRoZSByZXNlcnZlZCBmaWVsZCBpcyBjdXJyZW50bHkgdW51c2VkIGFuZCBpcyBpZ25vcmVkIGluIHRoaXMgdmVyc2lvbiBvZgotdGhlIHByb3RvY29sLgotCi1zaWduYXR1cmUga2V5IGNvbnRhaW5zIHRoZSBDQSBrZXkgdXNlZCB0byBzaWduIHRoZSBjZXJ0aWZpY2F0ZS4KLVRoZSB2YWxpZCBrZXkgdHlwZXMgZm9yIENBIGtleXMgYXJlIHNzaC1yc2EsIHNzaC1kc3MgYW5kIHRoZSBFQ0RTQSB0eXBlcwotZWNkc2Etc2hhMi1uaXN0cDI1NiwgZWNkc2Etc2hhMi1uaXN0cDM4NCwgZWNkc2Etc2hhMi1uaXN0cDUyMS4gIkNoYWluZWQiCi1jZXJ0aWZpY2F0ZXMsIHdoZXJlIHRoZSBzaWduYXR1cmUga2V5IHR5cGUgaXMgYSBjZXJ0aWZpY2F0ZSB0eXBlIGl0c2VsZgotYXJlIE5PVCBzdXBwb3J0ZWQuIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBSU0EgY2VydGlmaWNhdGUga2V5IHRvCi1iZSBzaWduZWQgYnkgYSBEU1Mgb3IgRUNEU0EgQ0Ega2V5IGFuZCB2aWNlLXZlcnNhLgotCi1zaWduYXR1cmUgaXMgY29tcHV0ZWQgb3ZlciBhbGwgcHJlY2VkaW5nIGZpZWxkcyBmcm9tIHRoZSBpbml0aWFsIHN0cmluZwotdXAgdG8sIGFuZCBpbmNsdWRpbmcgdGhlIHNpZ25hdHVyZSBrZXkuIFNpZ25hdHVyZXMgYXJlIGNvbXB1dGVkIGFuZAotZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGRlZmluZWQgZm9yIHRoZSBDQSdzIHB1YmxpYyBrZXkgYWxnb3JpdGhtCi0oUkZDNDI1MyBzZWN0aW9uIDYuNiBmb3Igc3NoLXJzYSBhbmQgc3NoLWRzcywgUkZDNTY1NiBmb3IgdGhlIEVDRFNBCi10eXBlcykuCi0KLUNyaXRpY2FsIG9wdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGNyaXRpY2FsIG9wdGlvbnMgc2VjdGlvbiBvZiB0aGUgY2VydGlmaWNhdGUgc3BlY2lmaWVzIHplcm8gb3IgbW9yZQotb3B0aW9ucyBvbiB0aGUgY2VydGlmaWNhdGVzIHZhbGlkaXR5LiBUaGUgZm9ybWF0IG9mIHRoaXMgZmllbGQKLWlzIGEgc2VxdWVuY2Ugb2YgemVybyBvciBtb3JlIHR1cGxlczoKLQotICAgIHN0cmluZyAgICAgICBuYW1lCi0gICAgc3RyaW5nICAgICAgIGRhdGEKLQotT3B0aW9ucyBtdXN0IGJlIGxleGljYWxseSBvcmRlcmVkIGJ5ICJuYW1lIiBpZiB0aGV5IGFwcGVhciBpbiB0aGUKLXNlcXVlbmNlLgotCi1UaGUgbmFtZSBmaWVsZCBpZGVudGlmaWVzIHRoZSBvcHRpb24gYW5kIHRoZSBkYXRhIGZpZWxkIGVuY29kZXMKLW9wdGlvbi1zcGVjaWZpYyBpbmZvcm1hdGlvbiAoc2VlIGJlbG93KS4gQWxsIG9wdGlvbnMgYXJlCi0iY3JpdGljYWwiLCBpZiBhbiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZWNvZ25pc2UgYSBvcHRpb24KLXRoZW4gdGhlIHZhbGlkYXRpbmcgcGFydHkgc2hvdWxkIHJlZnVzZSB0byBhY2NlcHQgdGhlIGNlcnRpZmljYXRlLgotCi1UaGUgc3VwcG9ydGVkIG9wdGlvbnMgYW5kIHRoZSBjb250ZW50cyBhbmQgc3RydWN0dXJlIG9mIHRoZWlyCi1kYXRhIGZpZWxkcyBhcmU6Ci0KLU5hbWUgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAgICAgICAgRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1mb3JjZS1jb21tYW5kICAgICAgICAgICBzdHJpbmcgICAgICAgIFNwZWNpZmllcyBhIGNvbW1hbmQgdGhhdCBpcyBleGVjdXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwbGFjaW5nIGFueSB0aGUgdXNlciBzcGVjaWZpZWQgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaCBjb21tYW5kLWxpbmUpIHdoZW5ldmVyIHRoaXMga2V5IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgotCi1zb3VyY2UtYWRkcmVzcyAgICAgICAgICBzdHJpbmcgICAgICAgIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHNvdXJjZSBhZGRyZXNzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB3aGljaCB0aGlzIGNlcnRpZmljYXRlIGlzIGFjY2VwdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhdXRoZW50aWNhdGlvbi4gQWRkcmVzc2VzIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgaW4gQ0lEUiBmb3JtYXQgKG5uLm5uLm5uLm5uL25uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGhoaGg6OmhoaGgvbm4pLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIG9wdGlvbiBpcyBub3QgcHJlc2VudCB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlcyBtYXkgYmUgcHJlc2VudGVkIGZyb20gYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBhZGRyZXNzLgotCi1FeHRlbnNpb25zCi0tLS0tLS0tLS0tCi0KLVRoZSBleHRlbnNpb25zIHNlY3Rpb24gb2YgdGhlIGNlcnRpZmljYXRlIHNwZWNpZmllcyB6ZXJvIG9yIG1vcmUKLW5vbi1jcml0aWNhbCBjZXJ0aWZpY2F0ZSBleHRlbnNpb25zLiBUaGUgZW5jb2RpbmcgYW5kIG9yZGVyaW5nIG9mCi1leHRlbnNpb25zIGluIHRoaXMgZmllbGQgaXMgaWRlbnRpY2FsIHRvIHRoYXQgb2YgdGhlIGNyaXRpY2FsIG9wdGlvbnMuCi1JZiBhbiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZWNvZ25pc2UgYW4gZXh0ZW5zaW9uLCB0aGVuIGl0IHNob3VsZAotaWdub3JlIGl0LgotCi1UaGUgc3VwcG9ydGVkIGV4dGVuc2lvbnMgYW5kIHRoZSBjb250ZW50cyBhbmQgc3RydWN0dXJlIG9mIHRoZWlyIGRhdGEKLWZpZWxkcyBhcmU6Ci0KLU5hbWUgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAgICAgICAgRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wZXJtaXQtWDExLWZvcndhcmRpbmcgICBlbXB0eSAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGF0IFgxMSBmb3J3YXJkaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBwZXJtaXR0ZWQuIFgxMSBmb3J3YXJkaW5nIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmVmdXNlZCBpZiB0aGlzIG9wdGlvbiBpcyBhYnNlbnQuCi0KLXBlcm1pdC1hZ2VudC1mb3J3YXJkaW5nIGVtcHR5ICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoYXQgYWdlbnQgZm9yd2FyZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgYWxsb3dlZC4gQWdlbnQgZm9yd2FyZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IG5vdCBiZSBwZXJtaXR0ZWQgdW5sZXNzIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGlzIHByZXNlbnQuCi0KLXBlcm1pdC1wb3J0LWZvcndhcmRpbmcgIGVtcHR5ICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoYXQgcG9ydC1mb3J3YXJkaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBhbGxvd2VkLiBJZiB0aGlzIG9wdGlvbiBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgcHJlc2VudCB0aGVuIG5vIHBvcnQgZm9yd2FyZGluZyB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFsbG93ZWQuCi0KLXBlcm1pdC1wdHkgICAgICAgICAgICAgIGVtcHR5ICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoYXQgUFRZIGFsbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHBlcm1pdHRlZC4gSW4gdGhlIGFic2VuY2Ugb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBvcHRpb24gUFRZIGFsbG9jYXRpb24gd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZC4KLQotcGVybWl0LXVzZXItcmMgICAgICAgICAgZW1wdHkgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhhdCBleGVjdXRpb24gb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfi8uc3NoL3JjIHNob3VsZCBiZSBwZXJtaXR0ZWQuIEV4ZWN1dGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGlzIHNjcmlwdCB3aWxsIG5vdCBiZSBwZXJtaXR0ZWQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBvcHRpb24gaXMgbm90IHByZXNlbnQuCi0KLSRPcGVuQlNEOiBQUk9UT0NPTC5jZXJ0a2V5cyx2IDEuOCAyMDEwLzA4LzMxIDExOjU0OjQ1IGRqbSBFeHAgJApkaWZmIC0tZ2l0IGEvUFJPVE9DT0wubXV4IGIvUFJPVE9DT0wubXV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWQyNTY2Li4wMDAwMDAwCi0tLSBhL1BST1RPQ09MLm11eAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgbXVsdGlwbGV4aW5nIHByb3RvY29sIHVzZWQgYnkgc3NoKDEpJ3MKLUNvbnRyb2xNYXN0ZXIgY29ubmVjdGlvbi1zaGFyaW5nLgotCi1Nb3N0IG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudCB0byB0aGUgc2VydmVyIGNvbnRhaW4gYSAicmVxdWVzdCBpZCIgZmllbGQuCi1UaGlzIGZpZWxkIGlzIHJldHVybmVkIGluIHJlcGxpZXMgYXMgImNsaWVudCByZXF1ZXN0IGlkIiB0byBmYWNpbGl0YXRlCi1tYXRjaGluZyBvZiByZXNwb25zZXMgdG8gcmVxdWVzdHMuCi0KLTEuIENvbm5lY3Rpb24gc2V0dXAKLQotV2hlbiBhIG11bHRpcGxleGluZyBjb25uZWN0aW9uIGlzIG1hZGUgdG8gYSBzc2goMSkgb3BlcmF0aW5nIGFzIGEKLUNvbnRyb2xNYXN0ZXIgZnJvbSBhIHNzaCgxKSBpbiBtdWx0aXBsZXggc2xhdmUgbW9kZSwgdGhlIGZpcnN0Ci1hY3Rpb24gb2YgZWFjaCBpcyB0byBleGNoYW5nZSBoZWxsbyBtZXNzYWdlczoKLQotCXVpbnQzMglNVVhfTVNHX0hFTExPCi0JdWludDMyICBwcm90b2NvbCB2ZXJzaW9uCi0Jc3RyaW5nICBleHRlbnNpb24gbmFtZSBbb3B0aW9uYWxdCi0Jc3RyaW5nICBleHRlbnNpb24gdmFsdWUgW29wdGlvbmFsXQotCS4uLgotCi1UaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBtdXggcHJvdG9jb2wgaXMgNC4gQSBzbGF2ZSBzaG91bGQgcmVmdXNlCi10byBjb25uZWN0IHRvIGEgbWFzdGVyIHRoYXQgc3BlYWtzIGFuIHVuc3VwcG9ydGVkIHByb3RvY29sIHZlcnNpb24uCi1Gb2xsb3dpbmcgdGhlIHZlcnNpb24gaWRlbnRpZmllciBhcmUgemVybyBvciBtb3JlIGV4dGVuc2lvbnMKLXJlcHJlc2VudGVkIGFzIGEgbmFtZS92YWx1ZSBwYWlyLiBObyBleHRlbnNpb25zIGFyZSBjdXJyZW50bHkKLWRlZmluZWQuCi0KLTIuIE9wZW5pbmcgc2Vzc2lvbnMKLQotVG8gb3BlbiBhIG5ldyBtdWx0aXBsZXhlZCBzZXNzaW9uLCBhIGNsaWVudCBtYXkgc2VuZCB0aGUgZm9sbG93aW5nCi1yZXF1ZXN0OgotCi0JdWludDMyCU1VWF9DX05FV19TRVNTSU9OCi0JdWludDMyICByZXF1ZXN0IGlkCi0Jc3RyaW5nCXJlc2VydmVkCi0JYm9vbAl3YW50IHR0eSBmbGFnCi0JYm9vbAl3YW50IFgxMSBmb3J3YXJkaW5nIGZsYWcKLQlib29sCXdhbnQgYWdlbnQgZmxhZwotCWJvb2wJc3Vic3lzdGVtIGZsYWcKLQl1aW50MzIJZXNjYXBlIGNoYXIKLQlzdHJpbmcJdGVybWluYWwgdHlwZQotCXN0cmluZwljb21tYW5kCi0Jc3RyaW5nCWVudmlyb25tZW50IHN0cmluZyAwIFtvcHRpb25hbF0KLQkuLi4KLQotVG8gZGlzYWJsZSB0aGUgdXNlIG9mIGFuIGVzY2FwZSBjaGFyYWN0ZXIsICJlc2NhcGUgY2hhciIgbWF5IGJlIHNldAotdG8gMHhmZmZmZmZmZi4gInRlcm1pbmFsIHR5cGUiIGlzIGdlbmVyYWxseSBzZXQgdG8gdGhlIHZhbHVlIG9mCi0kVEVSTS4gemVybyBvciBtb3JlIGVudmlyb25tZW50IHN0cmluZ3MgbWF5IGZvbGxvdyB0aGUgY29tbWFuZC4KLQotVGhlIGNsaWVudCB0aGVuIHNlbmRzIGl0cyBzdGFuZGFyZCBpbnB1dCwgb3V0cHV0IGFuZCBlcnJvciBmaWxlCi1kZXNjcmlwdG9ycyAoaW4gdGhhdCBvcmRlcikgdXNpbmcgVW5peCBkb21haW4gc29ja2V0IGNvbnRyb2wgbWVzc2FnZXMuCi0KLVRoZSBjb250ZW50cyBvZiAicmVzZXJ2ZWQiIGFyZSBjdXJyZW50bHkgaWdub3JlZC4KLQotSWYgc3VjY2Vzc2Z1bCwgdGhlIHNlcnZlciB3aWxsIHJlcGx5IHdpdGggTVVYX1NfU0VTU0lPTl9PUEVORUQKLQotCXVpbnQzMglNVVhfU19TRVNTSU9OX09QRU5FRAotCXVpbnQzMgljbGllbnQgcmVxdWVzdCBpZAotCXVpbnQzMglzZXNzaW9uIGlkCi0KLU90aGVyd2lzZSBpdCB3aWxsIHJlcGx5IHdpdGggYW4gZXJyb3I6IE1VWF9TX1BFUk1JU1NJT05fREVOSUVEIG9yCi1NVVhfU19GQUlMVVJFLgotCi1PbmNlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBmZHMsIGl0IHdpbGwgcmVzcG9uZCB3aXRoIE1VWF9TX09LCi1pbmRpY2F0aW5nIHRoYXQgdGhlIHNlc3Npb24gaXMgdXAuIFRoZSBjbGllbnQgbm93IHdhaXRzIGZvciB0aGUKLXNlc3Npb24gdG8gZW5kLiBXaGVuIGl0IGRvZXMsIHRoZSBzZXJ2ZXIgd2lsbCBzZW5kIGFuIGV4aXQgc3RhdHVzCi1tZXNzYWdlOgotCi0JdWludDMyCU1VWF9TX0VYSVRfTUVTU0FHRQotCXVpbnQzMglzZXNzaW9uIGlkCi0JdWludDMyCWV4aXQgdmFsdWUKLQotVGhlIGNsaWVudCBzaG91bGQgZXhpdCB3aXRoIHRoaXMgdmFsdWUgdG8gbWltaWMgdGhlIGJlaGF2aW91ciBvZiBhCi1ub24tbXVsdGlwbGV4ZWQgc3NoKDEpIGNvbm5lY3Rpb24uIFR3byBhZGRpdGlvbmFsIGNhc2VzIHRoYXQgdGhlCi1jbGllbnQgbXVzdCBjb3BlIHdpdGggYXJlIGl0IHJlY2VpdmluZyBhIHNpZ25hbCBpdHNlbGYgYW5kIHRoZQotc2VydmVyIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCBzZW5kaW5nIGFuIGV4aXQgbWVzc2FnZS4KLQotQSBtYXN0ZXIgbWF5IGFsc28gc2VuZCBhIE1VWF9TX1RUWV9BTExPQ19GQUlMIGJlZm9yZSBNVVhfU19FWElUX01FU1NBR0UKLWlmIHJlbW90ZSBUVFkgYWxsb2NhdGlvbiB3YXMgdW5zdWNjZXNzZnVsLiBUaGUgY2xpZW50IG1heSB1c2UgdGhpcyB0bwotcmV0dXJuIGl0cyBsb2NhbCB0dHkgdG8gImNvb2tlZCIgbW9kZS4KLQotCXVpbnQzMglNVVhfU19UVFlfQUxMT0NfRkFJTAotCXVpbnQzMglzZXNzaW9uIGlkCi0KLTMuIEhlYWx0aCBjaGVja3MKLQotVGhlIGNsaWVudCBtYXkgcmVxdWVzdCBhIGhlYWx0aCBjaGVjay9QSUQgcmVwb3J0IGZyb20gYSBzZXJ2ZXI6Ci0KLQl1aW50MzIJTVVYX0NfQUxJVkVfQ0hFQ0sKLQl1aW50MzIJcmVxdWVzdCBpZAotCi1UaGUgc2VydmVyIHJlcGxpZXMgd2l0aDoKLQotCXVpbnQzMglNVVhfU19BTElWRQotCXVpbnQzMgljbGllbnQgcmVxdWVzdCBpZAotCXVpbnQzMglzZXJ2ZXIgcGlkCi0KLTQuIFJlbW90ZWx5IHRlcm1pbmF0aW5nIGEgbWFzdGVyCi0KLUEgY2xpZW50IG1heSByZXF1ZXN0IHRoYXQgYSBtYXN0ZXIgdGVybWluYXRlIGltbWVkaWF0ZWx5OgotCi0JdWludDMyCU1VWF9DX1RFUk1JTkFURQotCXVpbnQzMglyZXF1ZXN0IGlkCi0KLVRoZSBzZXJ2ZXIgd2lsbCByZXBseSB3aXRoIG9uZSBvZiBNVVhfU19PSyBvciBNVVhfU19QRVJNSVNTSU9OX0RFTklFRC4KLQotNS4gUmVxdWVzdGluZyBlc3RhYmxpc2htZW50IG9mIHBvcnQgZm9yd2FyZHMKLQotQSBjbGllbnQgbWF5IHJlcXVlc3QgdGhlIG1hc3RlciB0byBlc3RhYmxpc2ggYSBwb3J0IGZvcndhcmQ6Ci0KLQl1aW50MzIJTVVYX0NfT1BFTl9GV0QKLQl1aW50MzIJcmVxdWVzdCBpZAotCXVpbnQzMglmb3J3YXJkaW5nIHR5cGUKLQlzdHJpbmcJbGlzdGVuIGhvc3QKLQlzdHJpbmcJbGlzdGVuIHBvcnQKLQlzdHJpbmcJY29ubmVjdCBob3N0Ci0Jc3RyaW5nCWNvbm5lY3QgcG9ydAotCi1mb3J3YXJkaW5nIHR5cGUgbWF5IGJlIE1VWF9GV0RfTE9DQUwsIE1VWF9GV0RfUkVNT1RFLCBNVVhfRldEX0RZTkFNSUMuCi0KLUEgc2VydmVyIG1heSByZXBseSB3aXRoIGEgTVVYX1NfT0ssIGEgTVVYX1NfUkVNT1RFX1BPUlQsIGEKLU1VWF9TX1BFUk1JU1NJT05fREVOSUVEIG9yIGEgTVVYX1NfRkFJTFVSRS4KLQotRm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBsaXN0ZW4gcG9ydCB0aGUgc2VydmVyIHJlcGxpZXMgd2l0aAotCi0JdWludDMyCU1VWF9TX1JFTU9URV9QT1JUCi0JdWludDMyCWNsaWVudCByZXF1ZXN0IGlkCi0JdWludDMyCWFsbG9jYXRlZCByZW1vdGUgbGlzdGVuIHBvcnQKLQotNi4gUmVxdWVzdGluZyBjbG9zdXJlIG9mIHBvcnQgZm9yd2FyZHMKLQotTm90ZTogY3VycmVudGx5IHVuaW1wbGVtZW50ZWQgKHNlcnZlciB3aWxsIGFsd2F5cyByZXBseSB3aXRoIE1VWF9TX0ZBSUxVUkUpLgotCi1BIGNsaWVudCBtYXkgcmVxdWVzdCB0aGUgbWFzdGVyIHRvIGNsb3NlIGEgcG9ydCBmb3J3YXJkOgotCi0JdWludDMyCU1VWF9DX0NMT1NFX0ZXRAotCXVpbnQzMglyZXF1ZXN0IGlkCi0Jc3RyaW5nCWxpc3RlbiBob3N0Ci0Jc3RyaW5nCWxpc3RlbiBwb3J0Ci0Jc3RyaW5nCWNvbm5lY3QgaG9zdAotCXN0cmluZwljb25uZWN0IHBvcnQKLQotQSBzZXJ2ZXIgbWF5IHJlcGx5IHdpdGggYSBNVVhfU19PSywgYSBNVVhfU19QRVJNSVNTSU9OX0RFTklFRCBvciBhCi1NVVhfU19GQUlMVVJFLgotCi03LiBSZXF1ZXN0aW5nIHN0ZGlvIGZvcndhcmRpbmcKLQotQSBjbGllbnQgbWF5IHJlcXVlc3QgdGhlIG1hc3RlciB0byBlc3RhYmxpc2ggYSBzdGRpbyBmb3J3YXJkaW5nOgotCi0JdWludDMyCU1VWF9DX05FV19TVERJT19GV0QKLQl1aW50MzIJcmVxdWVzdCBpZAotCXN0cmluZwlyZXNlcnZlZAotCXN0cmluZwljb25uZWN0IGhvc3QKLQlzdHJpbmcJY29ubmVjdCBwb3J0Ci0KLVRoZSBjbGllbnQgdGhlbiBzZW5kcyBpdHMgc3RhbmRhcmQgaW5wdXQgYW5kIG91dHB1dCBmaWxlIGRlc2NyaXB0b3JzCi0oaW4gdGhhdCBvcmRlcikgdXNpbmcgVW5peCBkb21haW4gc29ja2V0IGNvbnRyb2wgbWVzc2FnZXMuCi0KLVRoZSBjb250ZW50cyBvZiAicmVzZXJ2ZWQiIGFyZSBjdXJyZW50bHkgaWdub3JlZC4KLQotQSBzZXJ2ZXIgbWF5IHJlcGx5IHdpdGggYSBNVVhfU19TRVNTSU9OX09QRU5FRCwgYSBNVVhfU19QRVJNSVNTSU9OX0RFTklFRAotb3IgYSBNVVhfU19GQUlMVVJFLgotCi04LiBSZXF1ZXN0aW5nIHNodXRkb3duIG9mIG11eCBsaXN0ZW5lcgotCi1BIGNsaWVudCBtYXkgcmVxdWVzdCB0aGUgbWFzdGVyIHRvIHN0b3AgYWNjZXB0aW5nIG5ldyBtdWx0aXBsZXhpbmcgcmVxdWVzdHMKLWFuZCByZW1vdmUgaXRzIGxpc3RlbmVyIHNvY2tldC4KLQotCXVpbnQzMglNVVhfQ19TVE9QX0xJU1RFTklORwotCXVpbnQzMglyZXF1ZXN0IGlkCi0KLUEgc2VydmVyIG1heSByZXBseSB3aXRoIGEgTVVYX1NfT0ssIGEgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQgb3IgYQotTVVYX1NfRkFJTFVSRS4KLQotOS4gU3RhdHVzIG1lc3NhZ2VzCi0KLVRoZSBNVVhfU19PSyBtZXNzYWdlIGlzIGVtcHR5OgotCi0JdWludDMyCU1VWF9TX09LCi0JdWludDMyCWNsaWVudCByZXF1ZXN0IGlkCi0KLVRoZSBNVVhfU19QRVJNSVNTSU9OX0RFTklFRCBhbmQgTVVYX1NfRkFJTFVSRSBpbmNsdWRlIGEgcmVhc29uOgotCi0JdWludDMyCU1VWF9TX1BFUk1JU1NJT05fREVOSUVECi0JdWludDMyCWNsaWVudCByZXF1ZXN0IGlkCi0Jc3RyaW5nCXJlYXNvbgotCi0JdWludDMyCU1VWF9TX0ZBSUxVUkUKLQl1aW50MzIJY2xpZW50IHJlcXVlc3QgaWQKLQlzdHJpbmcJcmVhc29uCi0KLTEwLiBQcm90b2NvbCBudW1iZXJzCi0KLSNkZWZpbmUgTVVYX01TR19IRUxMTwkJMHgwMDAwMDAwMQotI2RlZmluZSBNVVhfQ19ORVdfU0VTU0lPTgkweDEwMDAwMDAyCi0jZGVmaW5lIE1VWF9DX0FMSVZFX0NIRUNLCTB4MTAwMDAwMDQKLSNkZWZpbmUgTVVYX0NfVEVSTUlOQVRFCQkweDEwMDAwMDA1Ci0jZGVmaW5lIE1VWF9DX09QRU5fRldECQkweDEwMDAwMDA2Ci0jZGVmaW5lIE1VWF9DX0NMT1NFX0ZXRAkJMHgxMDAwMDAwNwotI2RlZmluZSBNVVhfQ19ORVdfU1RESU9fRldECTB4MTAwMDAwMDgKLSNkZWZpbmUgTVVYX0NfU1RPUF9MSVNURU5JTkcJMHgxMDAwMDAwOQotI2RlZmluZSBNVVhfU19PSwkJMHg4MDAwMDAwMQotI2RlZmluZSBNVVhfU19QRVJNSVNTSU9OX0RFTklFRAkweDgwMDAwMDAyCi0jZGVmaW5lIE1VWF9TX0ZBSUxVUkUJCTB4ODAwMDAwMDMKLSNkZWZpbmUgTVVYX1NfRVhJVF9NRVNTQUdFCTB4ODAwMDAwMDQKLSNkZWZpbmUgTVVYX1NfQUxJVkUJCTB4ODAwMDAwMDUKLSNkZWZpbmUgTVVYX1NfU0VTU0lPTl9PUEVORUQJMHg4MDAwMDAwNgotI2RlZmluZSBNVVhfU19SRU1PVEVfUE9SVAkweDgwMDAwMDA3Ci0jZGVmaW5lIE1VWF9TX1RUWV9BTExPQ19GQUlMCTB4ODAwMDAwMDgKLQotI2RlZmluZSBNVVhfRldEX0xPQ0FMCTEKLSNkZWZpbmUgTVVYX0ZXRF9SRU1PVEUJMgotI2RlZmluZSBNVVhfRldEX0RZTkFNSUMJMwotCi1YWFggVE9ETwotWFhYIGV4dGVuZGVkIHN0YXR1cyAoZS5nLiByZXBvcnQgb3BlbiBjaGFubmVscyAvIGZvcndhcmRzKQotWFhYIGxvY2sgKG1heWJlKQotWFhYIHdhdGNoIGluL291dCB0cmFmZmljIChwcmUvcG9zdCBjcnlwdG8pCi1YWFggaW5qZWN0IHBhY2tldCAod2hhdCBhYm91dCByZXBsaWVzKQotWFhYIHNlcnZlci0+Y2xpZW50IGVycm9yL3dhcm5pbmcgbm90aWZpY2F0aW9ucwotWFhYIHNlbmQgc2lnbmFscyB2aWEgbXV4Ci0KLSRPcGVuQlNEOiBQUk9UT0NPTC5tdXgsdiAxLjcgMjAxMS8wNS8wOCAxMjo1MjowMSBkam0gRXhwICQKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2NjU0Yi4uMDAwMDAwMAotLS0gYS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi1TZWUgaHR0cDovL3d3dy5vcGVuc3NoLmNvbS90eHQvcmVsZWFzZS01LjkgZm9yIHRoZSByZWxlYXNlIG5vdGVzLgotCi0tIEEgSmFwYW5lc2UgdHJhbnNsYXRpb24gb2YgdGhpcyBkb2N1bWVudCBhbmQgb2YgdGhlIE9wZW5TU0ggRkFRIGlzCi0tIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnVuaXh1c2VyLm9yZy9+aGFydXlhbWEvc2VjdXJpdHkvb3BlbnNzaC9pbmRleC5odG1sCi0tIFRoYW5rcyB0byBIQVJVWUFNQSBTZWlnbyA8aGFydXlhbWFAdW5peHVzZXIub3JnPgotCi1UaGlzIGlzIHRoZSBwb3J0IG9mIE9wZW5CU0QncyBleGNlbGxlbnQgT3BlblNTSFswXSB0byBMaW51eCBhbmQgb3RoZXIKLVVuaWNlcy4KLQotT3BlblNTSCBpcyBiYXNlZCBvbiB0aGUgbGFzdCBmcmVlIHZlcnNpb24gb2YgVGF0dSBZbG9uZW4ncyBzYW1wbGUKLWltcGxlbWVudGF0aW9uIHdpdGggYWxsIHBhdGVudC1lbmN1bWJlcmVkIGFsZ29yaXRobXMgcmVtb3ZlZCAodG8KLWV4dGVybmFsIGxpYnJhcmllcyksIGFsbCBrbm93biBzZWN1cml0eSBidWdzIGZpeGVkLCBuZXcgZmVhdHVyZXMKLXJlaW50cm9kdWNlZCBhbmQgbWFueSBvdGhlciBjbGVhbi11cHMuICBPcGVuU1NIIGhhcyBiZWVuIGNyZWF0ZWQgYnkKLUFhcm9uIENhbXBiZWxsLCBCb2IgQmVjaywgTWFya3VzIEZyaWVkbCwgTmllbHMgUHJvdm9zLCBUaGVvIGRlIFJhYWR0LAotYW5kIER1ZyBTb25nLiBJdCBoYXMgYSBob21lcGFnZSBhdCBodHRwOi8vd3d3Lm9wZW5zc2guY29tLwotCi1UaGlzIHBvcnQgY29uc2lzdHMgb2YgdGhlIHJlLWludHJvZHVjdGlvbiBvZiBhdXRvY29uZiBzdXBwb3J0LCBQQU0KLXN1cHBvcnQsIEVHRFsxXS9QUk5HRFsyXSBzdXBwb3J0IGFuZCByZXBsYWNlbWVudHMgZm9yIE9wZW5CU0QgbGlicmFyeQotZnVuY3Rpb25zIHRoYXQgYXJlIChyZWdyZXR0YWJseSkgYWJzZW50IGZyb20gb3RoZXIgdW5pY2VzLiBUaGlzIHBvcnQKLWhhcyBiZWVuIGJlc3QgdGVzdGVkIG9uIEFJWCwgQ3lnd2luLCBIUC1VWCwgTGludXgsIE1hY09TL1gsCi1OZXRCU0QsIE9wZW5CU0QsIE9wZW5TZXJ2ZXIsIFNvbGFyaXMsIFVuaWNvcywgYW5kIFVuaXhXYXJlLgotCi1UaGlzIHZlcnNpb24gYWN0aXZlbHkgdHJhY2tzIGNoYW5nZXMgaW4gdGhlIE9wZW5CU0QgQ1ZTIHJlcG9zaXRvcnkuCi0KLVRoZSBQQU0gc3VwcG9ydCBpcyBub3cgbW9yZSBmdW5jdGlvbmFsIHRoYW4gdGhlIHBvcHVsYXIgcGFja2FnZXMgb2YKLWNvbW1lcmNpYWwgc3NoLTEuMi54LiBJdCBjaGVja3MgImFjY291bnQiIGFuZCAic2Vzc2lvbiIgbW9kdWxlcyBmb3IKLWFsbCBsb2dpbnMsIG5vdCBqdXN0IHdoZW4gdXNpbmcgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uCi0KLU9wZW5TU0ggZGVwZW5kcyBvbiBabGliWzNdLCBPcGVuU1NMWzRdIGFuZCBvcHRpb25hbGx5IFBBTVs1XS4KLQotVGhlcmUgaXMgbm93IHNldmVyYWwgbWFpbGluZyBsaXN0cyBmb3IgdGhpcyBwb3J0IG9mIE9wZW5TU0guIFBsZWFzZQotcmVmZXIgdG8gaHR0cDovL3d3dy5vcGVuc3NoLmNvbS9saXN0Lmh0bWwgZm9yIGRldGFpbHMgb24gaG93IHRvIGpvaW4uCi0KLVBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBwYXRjaGVzIHRvIHRoZSBtYWlsaW5nIGxpc3QKLW9wZW5zc2gtdW5peC1kZXZAbWluZHJvdC5vcmcuIFRoZSBsaXN0IGlzIG9wZW4gdG8gcG9zdGluZyBieQotdW5zdWJzY3JpYmVkIHVzZXJzLkNvZGUgY29udHJpYnV0aW9uIGFyZSB3ZWxjb21lZCwgYnV0IHBsZWFzZSBmb2xsb3cgdGhlIAotT3BlbkJTRCBzdHlsZSBndWlkZWxpbmVzWzZdLgotCi1QbGVhc2UgcmVmZXIgdG8gdGhlIElOU1RBTEwgZG9jdW1lbnQgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBpbnN0YWxsCi1PcGVuU1NIIG9uIHlvdXIgc3lzdGVtLiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGlzCi1wb3J0IG9mIE9wZW5TU0ggYW5kIEYtU2VjdXJlIFNTSCAxLngsIHBsZWFzZSByZWZlciB0byB0aGUgT3BlblNTSCBGQVFbN10KLWZvciBkZXRhaWxzIGFuZCBnZW5lcmFsIHRpcHMuCi0KLURhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4KLQotTWlzY2VsbGFuaWEgLQotCi1UaGlzIHZlcnNpb24gb2YgT3BlblNTSCBpcyBiYXNlZCB1cG9uIGNvZGUgcmV0cmlldmVkIGZyb20gdGhlIE9wZW5CU0QKLUNWUyByZXBvc2l0b3J5IHdoaWNoIGluIHR1cm4gd2FzIGJhc2VkIG9uIHRoZSBsYXN0IGZyZWUgc2FtcGxlCi1pbXBsZW1lbnRhdGlvbiByZWxlYXNlZCBieSBUYXR1IFlsb25lbi4KLQotUmVmZXJlbmNlcyAtCi0KLVswXSBodHRwOi8vd3d3Lm9wZW5zc2guY29tL2ZhcS5odG1sCi1bMV0gaHR0cDovL3d3dy5sb3RoYXIuY29tL3RlY2gvY3J5cHRvLwotWzJdIGh0dHA6Ly93d3cuYWV0LnR1LWNvdHRidXMuZGUvcGVyc29uZW4vamFlbmlja2UvcG9zdGZpeF90bHMvcHJuZ2QuaHRtbAotWzNdIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi8KLVs0XSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnLwotWzVdIGh0dHA6Ly93d3cub3BlbnBhbS5vcmcKLSAgICBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L2xpYnMvcGFtLyAKLSAgICAoUEFNIGFsc28gaXMgc3RhbmRhcmQgb24gU29sYXJpcyBhbmQgSFAtVVggMTEpCi1bNl0gaHR0cDovL3d3dy5vcGVuYnNkLm9yZy9jZ2ktYmluL21hbi5jZ2k/cXVlcnk9c3R5bGUmc2VrdGlvbj05Ci1bN10gaHR0cDovL3d3dy5vcGVuc3NoLmNvbS9mYXEuaHRtbAotCi0kSWQ6IFJFQURNRSx2IDEuNzcuMi4yIDIwMTEvMDkvMDYgMjM6MTE6MjAgZGptIEV4cCAkCmRpZmYgLS1naXQgYS9SRUFETUUuZG5zIGIvUkVBRE1FLmRucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4NzkxOC4uMDAwMDAwMAotLS0gYS9SRUFETUUuZG5zCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotSG93IHRvIHZlcmlmeSBob3N0IGtleXMgdXNpbmcgT3BlblNTSCBhbmQgRE5TCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotT3BlblNTSCBjb250YWlucyBzdXBwb3J0IGZvciB2ZXJpZnlpbmcgaG9zdCBrZXlzIHVzaW5nIEROUyBhcyBkZXNjcmliZWQgaW4KLWRyYWZ0LWlldGYtc2Vjc2gtZG5zLTA1LnR4dC4gVGhlIGRvY3VtZW50IGNvbnRhaW5zIHZlcnkgYnJpZWYgaW5zdHJ1Y3Rpb25zCi1vbiBob3cgdG8gdXNlIHRoaXMgZmVhdHVyZS4gQ29uZmlndXJpbmcgRE5TIGlzIG91dCBvZiB0aGUgc2NvcGUgb2YgdGhpcwotZG9jdW1lbnQuCi0KLQotKDEpIFNlcnZlcjogR2VuZXJhdGUgYW5kIHB1Ymxpc2ggdGhlIEROUyBSUgotCi1UbyBjcmVhdGUgYSBETlMgcmVzb3VyY2UgcmVjb3JkIChSUikgY29udGFpbmluZyBhIGZpbmdlcnByaW50IG9mIHRoZQotcHVibGljIGhvc3Qga2V5LCB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kOgotCi0Jc3NoLWtleWdlbiAtciBob3N0bmFtZSAtZiBrZXlmaWxlIC1nCi0KLXdoZXJlICJob3N0bmFtZSIgaXMgeW91ciBmdWxseSBxdWFsaWZpZWQgaG9zdG5hbWUgYW5kICJrZXlmaWxlIiBpcyB0aGUKLWZpbGUgY29udGFpbmluZyB0aGUgcHVibGljIGhvc3Qga2V5IGZpbGUuIElmIHlvdSBoYXZlIG11bHRpcGxlIGtleXMsCi15b3Ugc2hvdWxkIGdlbmVyYXRlIG9uZSBSUiBmb3IgZWFjaCBrZXkuCi0KLUluIHRoZSBleGFtcGxlIGFib3ZlLCBzc2gta2V5Z2VuIHdpbGwgcHJpbnQgdGhlIGZpbmdlcnByaW50IGluIGEKLWdlbmVyaWMgRE5TIFJSIGZvcm1hdCBwYXJzYWJsZSBieSBtb3N0IG1vZGVybiBuYW1lIHNlcnZlcgotaW1wbGVtZW50YXRpb25zLiBJZiB5b3VyIG5hbWVzZXJ2ZXIgaGFzIHN1cHBvcnQgZm9yIHRoZSBTU0hGUCBSUgoteW91IGNhbiBvbWl0IHRoZSAtZyBmbGFnIGFuZCBzc2gta2V5Z2VuIHdpbGwgcHJpbnQgYSBzdGFuZGFyZCBTU0hGUCBSUi4KLQotVG8gcHVibGlzaCB0aGUgZmluZ2VycHJpbnQgdXNpbmcgdGhlIEROUyB5b3UgbXVzdCBhZGQgdGhlIGdlbmVyYXRlZCBSUgotdG8geW91ciBETlMgem9uZSBmaWxlIGFuZCBzaWduIHlvdXIgem9uZS4KLQotCi0oMikgQ2xpZW50OiBFbmFibGUgc3NoIHRvIHZlcmlmeSBob3N0IGtleXMgdXNpbmcgRE5TCi0KLVRvIGVuYWJsZSB0aGUgc3NoIGNsaWVudCB0byB2ZXJpZnkgaG9zdCBrZXlzIHVzaW5nIEROUywgeW91IGhhdmUgdG8KLWFkZCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0aGUgc3NoIGNvbmZpZ3VyYXRpb24gZmlsZQotKCRIT01FLy5zc2gvY29uZmlnIG9yIC9ldGMvc3NoL3NzaF9jb25maWcpOgotCi0gICAgVmVyaWZ5SG9zdEtleUROUyB5ZXMKLQotVXBvbiBjb25uZWN0aW9uIHRoZSBjbGllbnQgd2lsbCB0cnkgdG8gbG9vayB1cCB0aGUgZmluZ2VycHJpbnQgUlIKLXVzaW5nIEROUy4gSWYgdGhlIGZpbmdlcnByaW50IHJlY2VpdmVkIGZyb20gdGhlIEROUyBzZXJ2ZXIgbWF0Y2hlcwotdGhlIHJlbW90ZSBob3N0IGtleSwgdGhlIHVzZXIgd2lsbCBiZSBub3RpZmllZC4KLQotCi0JSmFrb2IgU2NobHl0ZXIKLQlXZXNsZXkgR3JpZmZpbgotCi0KLSRPcGVuQlNEOiBSRUFETUUuZG5zLHYgMS4yIDIwMDMvMTAvMTQgMTk6NDM6MjMgamFrb2IgRXhwICQKZGlmZiAtLWdpdCBhL1JFQURNRS5wbGF0Zm9ybSBiL1JFQURNRS5wbGF0Zm9ybQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5ODIzMi4uMDAwMDAwMAotLS0gYS9SRUFETUUucGxhdGZvcm0KKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi1UaGlzIGZpbGUgY29udGFpbnMgbm90ZXMgYWJvdXQgT3BlblNTSCBvbiBzcGVjaWZpYyBwbGF0Zm9ybXMuCi0KLUFJWAotLS0tCi1BcyBvZiBPcGVuU1NIIDMuOHAxLCBzc2hkIHdpbGwgbm93IGhvbm91ciBhbiBhY2NvdW50cyBwYXNzd29yZCBleHBpcnkKLXNldHRpbmdzLCB3aGVyZSBwcmV2aW91c2x5IGl0IGRpZCBub3QuICBCZWNhdXNlIG9mIHRoaXMsIGl0J3MgcG9zc2libGUgZm9yCi1zaXRlcyB0aGF0IGhhdmUgdXNlZCBPcGVuU1NIJ3Mgc3NoZCBleGNsdXNpdmVseSB0byBoYXZlIGFjY291bnRzIHdoaWNoCi1oYXZlIHBhc3N3b3JkcyBleHBpcmVkIGxvbmdlciB0aGFuIHRoZSBpbmFjdGl2ZSB0aW1lIChpZSB0aGUgIldlZWtzIGJldHdlZW4KLXBhc3N3b3JkIEVYUElSQVRJT04gYW5kIExPQ0tPVVQiIHNldHRpbmcgaW4gU01JVCBvciB0aGUgbWF4ZXhwaXJlZAotY2h1c2VyIGF0dHJpYnV0ZSkuCi0KLUFjY291bnRzIGluIHRoaXMgc3RhdGUgbXVzdCBoYXZlIHRoZWlyIHBhc3N3b3JkcyByZXNldCBtYW51YWxseSBieSB0aGUKLWFkbWluaXN0cmF0b3IuICBBcyBhIHByZWNhdXRpb24sIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGFkbWluaXN0cmF0aXZlCi1wYXNzd29yZHMgYmUgcmVzZXQgYmVmb3JlIHVwZ3JhZGluZyBmcm9tIE9wZW5TU0ggPDMuOC4KLQotQXMgb2YgT3BlblNTSCA0LjAsIGNvbmZpZ3VyZSB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IGlmIHlvdXIgdmVyc2lvbgotYW5kIG1haW50ZW5hbmNlIGxldmVsIG9mIEFJWCBoYXMgYSB3b3JraW5nIGdldGFkZHJpbmZvLCBhbmQgd2lsbCB1c2UgaXQKLWlmIGZvdW5kLiAgVGhpcyB3aWxsIGVuYWJsZSBJUHY2IHN1cHBvcnQuICBJZiBmb3Igc29tZSByZWFzb24gY29uZmlndXJlCi1nZXRzIGl0IHdyb25nLCBvciBpZiB5b3Ugd2FudCB0byBidWlsZCBiaW5hcmllcyB0byB3b3JrIG9uIGVhcmxpZXIgTUxzCi10aGFuIHRoZSBidWlsZCBob3N0IHRoZW4geW91IGNhbiBhZGQgIi1EQlJPS0VOX0dFVEFERFJJTkZPIiB0byBDRkxBR1MKLXRvIGZvcmNlIHRoZSBwcmV2aW91cyBJUHY0LW9ubHkgYmVoYXZpb3VyLgotCi1JUHY2IGtub3duIHRvIHdvcms6IDUuMU1MNyA1LjJNTDIgNS4yTUw1Ci1JUHY2IGtub3duIGJyb2tlbjogNC4zLjNNTDExIDUuMU1MNAotCi1JZiB5b3Ugd2lzaCB0byB1c2UgZHluYW1pYyBsaWJyYXJpZXMgdGhhdCBhcmVuJ3QgaW4gdGhlIG5vcm1hbCBzeXN0ZW0KLWxvY2F0aW9ucyAoZWcgSUJNJ3MgT3BlblNTTCBhbmQgemxpYiBwYWNrYWdlcykgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvCi1kZWZpbmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGJsaWJwYXRoIGJlZm9yZSBydW5uaW5nIGNvbmZpZ3VyZSwgZWcKLQotYmxpYnBhdGg9L2xpYjovdXNyL2xpYjovb3B0L2ZyZWV3YXJlL2xpYiAuL2NvbmZpZ3VyZSBcCi0gIC0td2l0aC1zc2wtZGlyPS9vcHQvZnJlZXdhcmUgLS13aXRoLXpsaWI9L29wdC9mcmVld2FyZQotCi1JZiBzc2hkIGlzIGJ1aWx0IHdpdGggdGhlIFdJVEhfQUlYQVVUSEVOVElDQVRFIG9wdGlvbiAod2hpY2ggaXMgZW5hYmxlZAotYnkgZGVmYXVsdCkgdGhlbiBzc2hkIGNoZWNrcyB0aGF0IHVzZXJzIGFyZSBwZXJtaXR0ZWQgdmlhIHRoZQotbG9naW5yZXN0cmljdGlvbnMoKSBmdW5jdGlvbiwgaW4gcGFydGljdWxhciB0aGF0IHRoZSB1c2VyIGhhcyB0aGUKLSJybG9naW4iIGF0dHJpYnV0ZSBzZXQuICBUaGlzIGNoZWNrIGlzIG5vdCBkb25lIGZvciB0aGUgcm9vdCBhY2NvdW50LAotaW5zdGVhZCB0aGUgUGVybWl0Um9vdExvZ2luIHNldHRpbmcgaW4gc3NoZF9jb25maWcgaXMgdXNlZC4KLQotCi1DeWd3aW4KLS0tLS0tLQotVG8gYnVpbGQgb24gQ3lnd2luLCBPcGVuU1NIIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcGFja2FnZXM6Ci1nY2MsIGdjYy1taW5ndy1jb3JlLCBtaW5ndy1ydW50aW1lLCBiaW51dGlscywgbWFrZSwgb3BlbnNzbCwKLW9wZW5zc2wtZGV2ZWwsIHpsaWIsIG1pbnJlcywgbWluaXJlcy1kZXZlbC4KLQotCi1EYXJ3aW4gYW5kIE1hY09TIFgKLS0tLS0tLS0tLS0tLS0tLS0tLQotRGFyd2luIGRvZXMgbm90IHByb3ZpZGUgYSB0dW4oNCkgZHJpdmVyIHJlcXVpcmVkIGZvciBPcGVuU1NILWJhc2VkCi12aXJ0dWFsIHByaXZhdGUgbmV0d29ya3MuIFRoZSBCU0QgbWFucGFnZSBzdGlsbCBleGlzdHMsIGJ1dCB0aGUgZHJpdmVyCi1oYXMgYmVlbiByZW1vdmVkIGluIHJlY2VudCByZWxlYXNlcyBvZiBEYXJ3aW4gYW5kIE1hY09TIFguCi0KLU5ldmVydGhlbGVzcywgdHVubmVsIHN1cHBvcnQgaXMga25vd24gdG8gd29yayB3aXRoIERhcndpbiA4IGFuZAotTWFjT1MgWCAxMC40IGluIFBvaW50LXRvLVBvaW50IChMYXllciAzKSBhbmQgRXRoZXJuZXQgKExheWVyIDIpIG1vZGUKLXVzaW5nIGEgdGhpcmQgcGFydHkgZHJpdmVyLiBNb3JlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBhdDoKLQlodHRwOi8vd3d3LXVzZXIucmhyay51bmkta2wuZGUvfm5pc3NsZXIvdHVudGFwLwotCi0KLUxpbnV4Ci0tLS0tLQotCi1Tb21lIExpbnV4IGRpc3RyaWJ1dGlvbnMgKGluY2x1ZGluZyBSZWQgSGF0L0ZlZG9yYS9DZW50T1MpIGluY2x1ZGUKLWhlYWRlcnMgYW5kIGxpYnJhcnkgbGlua3MgaW4gdGhlIC1kZXZlbCBSUE1zIHJhdGhlciB0aGFuIHRoZSBtYWluCi1iaW5hcnkgUlBNcy4gSWYgeW91IGdldCBhbiBlcnJvciBhYm91dCBoZWFkZXJzLCBvciBjb21wbGFpbmluZyBhYm91dCBhCi1taXNzaW5nIHByZXJlcXVpc2l0ZSB0aGVuIHlvdSBtYXkgbmVlZCB0byBpbnN0YWxsIHRoZSBlcXVpdmFsZW50Ci1kZXZlbG9wbWVudCBwYWNrYWdlcy4gIE9uIFJlZGhhdCBiYXNlZCBkaXN0cm9zIHRoZXNlIG1heSBiZSBvcGVuc3NsLWRldmVsLAotemxpYi1kZXZlbCBhbmQgcGFtLWRldmVsLCBvbiBEZWJpYW4gYmFzZWQgZGlzdHJvcyB0aGVzZSBtYXkgYmUKLWxpYnNzbC1kZXYsIGxpYnotZGV2IGFuZCBsaWJwYW0tZGV2LgotCi0KLVNvbGFyaXMKLS0tLS0tLS0KLUlmIHlvdSBlbmFibGUgQlNNIGF1ZGl0aW5nIG9uIFNvbGFyaXMsIHlvdSBuZWVkIHRvIHVwZGF0ZSBhdWRpdF9ldmVudCg0KQotZm9yIHByYXVkaXQoMW0pIHRvIGdpdmUgc2Vuc2libGUgb3V0cHV0LiAgVGhlIGZvbGxvd2luZyBsaW5lIG5lZWRzIHRvIGJlCi1hZGRlZCB0byAvZXRjL3NlY3VyaXR5L2F1ZGl0X2V2ZW50OgotCi0JMzI4MDA6QVVFX29wZW5zc2g6T3BlblNTSCBsb2dpbjpsbwotCi1UaGUgQlNNIGF1ZGl0IGV2ZW50IHJhbmdlIGF2YWlsYWJsZSBmb3IgdGhpcmQgcGFydHkgVENCIGFwcGxpY2F0aW9ucyBpcwotMzI3NjggLSA2NTUzNS4gIEV2ZW50IG51bWJlciAzMjgwMCBoYXMgYmVlbiBjaG9vc2VuIGZvciBBVUVfb3BlbnNzaC4KLVRoZXJlIGlzIG5vIG9mZmljaWFsIHJlZ2lzdHJ5IG9mIDNyZCBwYXJ0eSBldmVudCBudW1iZXJzLCBzbyBpZiB0aGlzCi1udW1iZXIgaXMgYWxyZWFkeSBpbiB1c2Ugb24geW91ciBzeXN0ZW0sIHlvdSBtYXkgY2hhbmdlIGl0IGF0IGJ1aWxkIHRpbWUKLWJ5IGNvbmZpZ3VyZSdpbmcgLS13aXRoLWNmbGFncz0tREFVRV9vcGVuc3NoPTMyODAxIHRoZW4gcmVidWlsZGluZy4KLQotCi1QbGF0Zm9ybXMgdXNpbmcgUEFNCi0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BcyBvZiBPcGVuU1NIIDQuM3AxLCBzc2hkIHdpbGwgbm8gbG9uZ2VyIGNoZWNrIC9ldGMvbm9sb2dpbiBpdHNlbGYgd2hlbgotUEFNIGlzIGVuYWJsZWQuICBUbyBtYWludGFpbiBleGlzdGluZyBiZWhhdmlvdXIsIHBhbV9ub2xvZ2luIHNob3VsZCBiZQotYWRkZWQgdG8gc3NoZCdzIHNlc3Npb24gc3RhY2sgd2hpY2ggd2lsbCBwcmV2ZW50IHVzZXJzIGZyb20gc3RhcnRpbmcgc2hlbGwKLXNlc3Npb25zLiAgQWx0ZXJuYXRpdmVseSwgcGFtX25vbG9naW4gY2FuIGJlIGFkZGVkIHRvIGVpdGhlciB0aGUgYXV0aCBvcgotYWNjb3VudCBzdGFja3Mgd2hpY2ggd2lsbCBwcmV2ZW50IGF1dGhlbnRpY2F0aW9uIGVudGlyZWx5LCBidXQgd2lsbCBzdGlsbAotcmV0dXJuIHRoZSBvdXRwdXQgZnJvbSBwYW1fbm9sb2dpbiB0byB0aGUgY2xpZW50LgotCi0KLSRJZDogUkVBRE1FLnBsYXRmb3JtLHYgMS4xMCAyMDA5LzA4LzI4IDIzOjE0OjQ4IGR0dWNrZXIgRXhwICQKZGlmZiAtLWdpdCBhL1JFQURNRS5wcml2c2VwIGIvUkVBRE1FLnByaXZzZXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NjVlNzIuLjAwMDAwMDAKLS0tIGEvUkVBRE1FLnByaXZzZXAKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1Qcml2aWxlZ2Ugc2VwYXJhdGlvbiwgb3IgcHJpdnNlcCwgaXMgbWV0aG9kIGluIE9wZW5TU0ggYnkgd2hpY2gKLW9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIHJvb3QgcHJpdmlsZWdlIGFyZSBwZXJmb3JtZWQgYnkgYSBzZXBhcmF0ZQotcHJpdmlsZWdlZCBtb25pdG9yIHByb2Nlc3MuICBJdHMgcHVycG9zZSBpcyB0byBwcmV2ZW50IHByaXZpbGVnZQotZXNjYWxhdGlvbiBieSBjb250YWluaW5nIGNvcnJ1cHRpb24gdG8gYW4gdW5wcml2aWxlZ2VkIHByb2Nlc3MuCi1Nb3JlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBhdDoKLQlodHRwOi8vd3d3LmNpdGkudW1pY2guZWR1L3UvcHJvdm9zL3NzaC9wcml2c2VwLmh0bWwKLQotUHJpdmlsZWdlIHNlcGFyYXRpb24gaXMgbm93IGVuYWJsZWQgYnkgZGVmYXVsdDsgc2VlIHRoZQotVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiBvcHRpb24gaW4gc3NoZF9jb25maWcoNSkuCi0KLU9uIHN5c3RlbXMgd2hpY2ggbGFjayBtbWFwIG9yIGFub255bW91cyAoTUFQX0FOT04pIG1lbW9yeSBtYXBwaW5nLAotY29tcHJlc3Npb24gbXVzdCBiZSBkaXNhYmxlZCBpbiBvcmRlciBmb3IgcHJpdmlsZWdlIHNlcGFyYXRpb24gdG8KLWZ1bmN0aW9uLgotCi1XaGVuIHByaXZzZXAgaXMgZW5hYmxlZCwgZHVyaW5nIHRoZSBwcmUtYXV0aGVudGljYXRpb24gcGhhc2Ugc3NoZCB3aWxsCi1jaHJvb3QoMikgdG8gIi92YXIvZW1wdHkiIGFuZCBjaGFuZ2UgaXRzIHByaXZpbGVnZXMgdG8gdGhlICJzc2hkIiB1c2VyCi1hbmQgaXRzIHByaW1hcnkgZ3JvdXAuICBzc2hkIGlzIGEgcHNldWRvLWFjY291bnQgdGhhdCBzaG91bGQgbm90IGJlCi11c2VkIGJ5IG90aGVyIGRhZW1vbnMsIGFuZCBtdXN0IGJlIGxvY2tlZCBhbmQgc2hvdWxkIGNvbnRhaW4gYQotIm5vbG9naW4iIG9yIGludmFsaWQgc2hlbGwuCi0KLVlvdSBzaG91bGQgZG8gc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyB0byBwcmVwYXJlIHRoZSBwcml2c2VwCi1wcmVhdXRoIGVudmlyb25tZW50OgotCi0JIyBta2RpciAvdmFyL2VtcHR5Ci0JIyBjaG93biByb290OnN5cyAvdmFyL2VtcHR5Ci0JIyBjaG1vZCA3NTUgL3Zhci9lbXB0eQotCSMgZ3JvdXBhZGQgc3NoZAotCSMgdXNlcmFkZCAtZyBzc2hkIC1jICdzc2hkIHByaXZzZXAnIC1kIC92YXIvZW1wdHkgLXMgL2Jpbi9mYWxzZSBzc2hkCi0KLS92YXIvZW1wdHkgc2hvdWxkIG5vdCBjb250YWluIGFueSBmaWxlcy4KLQotY29uZmlndXJlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBjaGFuZ2UgdGhlIGRlZmF1bHQKLXByaXZzZXAgdXNlciBhbmQgY2hyb290IGRpcmVjdG9yeToKLQotICAtLXdpdGgtcHJpdnNlcC1wYXRoPXh4eCBQYXRoIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbiBjaHJvb3QKLSAgLS13aXRoLXByaXZzZXAtdXNlcj11c2VyIFNwZWNpZnkgbm9uLXByaXZpbGVnZWQgdXNlciBmb3IgcHJpdmlsZWdlIHNlcGFyYXRpb24KLQotUHJpdnNlcCByZXF1aXJlcyBvcGVyYXRpbmcgc3lzdGVtIHN1cHBvcnQgZm9yIGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLgotQ29tcHJlc3Npb24gd2lsbCBiZSBkaXNhYmxlZCBvbiBzeXN0ZW1zIHdpdGhvdXQgYSB3b3JraW5nIG1tYXAgTUFQX0FOT04uCi0KLVBBTS1lbmFibGVkIE9wZW5TU0ggaXMga25vd24gdG8gZnVuY3Rpb24gd2l0aCBwcml2c2VwIG9uIEFJWCwgRnJlZUJTRCwgCi1IUC1VWCAoaW5jbHVkaW5nIFRydXN0ZWQgTW9kZSksIExpbnV4LCBOZXRCU0QgYW5kIFNvbGFyaXMuCi0KLU9uIEN5Z3dpbiwgVHJ1NjQgVW5peCwgT3BlblNlcnZlciwgYW5kIFVuaWNvcyBvbmx5IHRoZSBwcmUtYXV0aGVudGljYXRpb24KLXBhcnQgb2YgcHJpdnNlcCBpcyBzdXBwb3J0ZWQuICBQb3N0LWF1dGhlbnRpY2F0aW9uIHByaXZzZXAgaXMgZGlzYWJsZWQKLWF1dG9tYXRpY2FsbHkgKHNvIHlvdSB3b24ndCBzZWUgdGhlIGFkZGl0aW9uYWwgcHJvY2VzcyBtZW50aW9uZWQgYmVsb3cpLgotCi1Ob3RlIHRoYXQgZm9yIGEgbm9ybWFsIGludGVyYWN0aXZlIGxvZ2luIHdpdGggYSBzaGVsbCwgZW5hYmxpbmcgcHJpdnNlcAotd2lsbCByZXF1aXJlIDEgYWRkaXRpb25hbCBwcm9jZXNzIHBlciBsb2dpbiBzZXNzaW9uLgotCi1HaXZlbiB0aGUgZm9sbG93aW5nIHByb2Nlc3MgbGlzdGluZyAoZnJvbSBIUC1VWCk6Ci0KLSAgICAgVUlEICAgUElEICBQUElEICBDICAgIFNUSU1FIFRUWSAgICAgICBUSU1FIENPTU1BTkQKLSAgICByb290ICAxMDA1ICAgICAxICAwIDEwOjQ1OjE3ID8gICAgICAgICAwOjA4IC9vcHQvb3BlbnNzaC9zYmluL3NzaGQgLXUwCi0gICAgcm9vdCAgNjkxNyAgMTAwNSAgMCAxNToxOToxNiA/ICAgICAgICAgMDowMCBzc2hkOiBzdGV2ZXNrIFtwcml2XQotIHN0ZXZlc2sgIDY5MTkgIDY5MTcgIDAgMTU6MTk6MTcgPyAgICAgICAgIDA6MDMgc3NoZDogc3RldmVza0AyCi0gc3RldmVzayAgNjkyMSAgNjkxOSAgMCAxNToxOToxNyBwdHMvMiAgICAgMDowMCAtYmFzaAotCi1wcm9jZXNzIDEwMDUgaXMgdGhlIHNzaGQgcHJvY2VzcyBsaXN0ZW5pbmcgZm9yIG5ldyBjb25uZWN0aW9ucy4KLXByb2Nlc3MgNjkxNyBpcyB0aGUgcHJpdmlsZWdlZCBtb25pdG9yIHByb2Nlc3MsIDY5MTkgaXMgdGhlIHVzZXIgb3duZWQKLXNzaGQgcHJvY2VzcyBhbmQgNjkyMSBpcyB0aGUgc2hlbGwgcHJvY2Vzcy4KLQotJElkOiBSRUFETUUucHJpdnNlcCx2IDEuMTYgMjAwNS8wNi8wNCAyMzoyMTo0MSBkam0gRXhwICQKZGlmZiAtLWdpdCBhL1JFQURNRS50dW4gYi9SRUFETUUudHVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTFjYjA3Li4wMDAwMDAwCi0tLSBhL1JFQURNRS50dW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotSG93IHRvIHVzZSBPcGVuU1NILWJhc2VkIHZpcnR1YWwgcHJpdmF0ZSBuZXR3b3JrcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1PcGVuU1NIIGNvbnRhaW5zIHN1cHBvcnQgZm9yIFZQTiB0dW5uZWxpbmcgdXNpbmcgdGhlIHR1big0KSBuZXR3b3JrCi10dW5uZWwgcHNldWRvLWRldmljZSB3aGljaCBpcyBhdmFpbGFibGUgb24gbW9zdCBwbGF0Zm9ybXMsIGVpdGhlciBmb3IKLWxheWVyIDIgb3IgMyB0cmFmZmljLgotCi1UaGUgZm9sbG93aW5nIGJyaWVmIGluc3RydWN0aW9ucyBvbiBob3cgdG8gdXNlIHRoaXMgZmVhdHVyZSB1c2UKLWEgbmV0d29yayBjb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIHRoZSBPcGVuQlNEIG9wZXJhdGluZyBzeXN0ZW0uCi0KLSgxKSBTZXJ2ZXI6IEVuYWJsZSBzdXBwb3J0IGZvciBTU0ggdHVubmVsaW5nCi0KLVRvIGVuYWJsZSB0aGUgc3NoIHNlcnZlciB0byBhY2NlcHQgdHVubmVsIHJlcXVlc3RzIGZyb20gdGhlIGNsaWVudCwgeW91Ci1oYXZlIHRvIGFkZCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0aGUgc3NoIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUKLSgvZXRjL3NzaC9zc2hkX2NvbmZpZyk6Ci0KLQlQZXJtaXRUdW5uZWwgeWVzCi0KLVJlc3RhcnQgdGhlIHNlcnZlciBvciBzZW5kIHRoZSBoYW5ndXAgc2lnbmFsIChTSUdIVVApIHRvIGxldCB0aGUgc2VydmVyCi1yZXJlYWQgaXQncyBjb25maWd1cmF0aW9uLgotCi0oMikgU2VydmVyOiBSZXN0cmljdCBjbGllbnQgYWNjZXNzIGFuZCBhc3NpZ24gdGhlIHR1bm5lbAotCi1UaGUgT3BlblNTSCBzZXJ2ZXIgc2ltcGx5IHVzZXMgdGhlIGZpbGUgL3Jvb3QvLnNzaC9hdXRob3JpemVkX2tleXMgdG8KLXJlc3RyaWN0IHRoZSBjbGllbnQgdG8gY29ubmVjdCB0byBhIHNwZWNpZmllZCB0dW5uZWwgYW5kIHRvCi1hdXRvbWF0aWNhbGx5IHN0YXJ0IHRoZSByZWxhdGVkIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGNvbW1hbmQuIFRoZXNlCi1zZXR0aW5ncyBhcmUgb3B0aW9uYWwgYnV0IHJlY29tbWVuZGVkOgotCi0JdHVubmVsPSIxIixjb21tYW5kPSJzaCAvZXRjL25ldHN0YXJ0IHR1bjEiIHNzaC1yc2EgLi4uIHJleWtAb3BlbmJzZC5vcmcKLQotKDMpIENsaWVudDogQ29uZmlndXJlIHRoZSBsb2NhbCBuZXR3b3JrIHR1bm5lbCBpbnRlcmZhY2UKLQotVXNlIHRoZSBob3N0bmFtZS5pZig1KSBpbnRlcmZhY2Utc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlIHRvIHNldCB1cAotdGhlIG5ldHdvcmsgdHVubmVsIGNvbmZpZ3VyYXRpb24gd2l0aCBPcGVuQlNELiBGb3IgZXhhbXBsZSwgdXNlIHRoZQotZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gaW4gL2V0Yy9ob3N0bmFtZS50dW4wIHRvIHNldCB1cCB0aGUgbGF5ZXIgMwotdHVubmVsIG9uIHRoZSBjbGllbnQ6Ci0KLQlpbmV0IDE5Mi4xNjguNS4xIDI1NS4yNTUuMjU1LjI1MiAxOTIuMTY4LjUuMgotCi1PcGVuQlNEIGFsc28gc3VwcG9ydHMgbGF5ZXIgMiB0dW5uZWxpbmcgb3ZlciB0aGUgdHVuIGRldmljZSBieSBhZGRpbmcKLXRoZSBsaW5rMCBmbGFnOgotCi0JaW5ldCAxOTIuMTY4LjEuNzggMjU1LjI1NS4yNTUuMCAxOTIuMTY4LjEuMjU1IGxpbmswCi0KLUxheWVyIDIgdHVubmVscyBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGFuIEV0aGVybmV0IGJyaWRnZSg0KQotaW50ZXJmYWNlLCBsaWtlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBmb3IgL2V0Yy9icmlkZ2VuYW1lLmJyaWRnZTA6Ci0KLQlhZGQgdHVuMAotCWFkZCBzaXMwCi0JdXAKLQotKDQpIENsaWVudDogQ29uZmlndXJlIHRoZSBPcGVuU1NIIGNsaWVudAotCi1UbyBlc3RhYmxpc2ggdHVubmVsIGZvcndhcmRpbmcgZm9yIGNvbm5lY3Rpb25zIHRvIGEgc3BlY2lmaWVkCi1yZW1vdGUgaG9zdCBieSBkZWZhdWx0LCB1c2UgdGhlIGZvbGxvd2luZyBzc2ggY2xpZW50IGNvbmZpZ3VyYXRpb24gZm9yCi10aGUgcHJpdmlsZWdlZCB1c2VyIChpbiAvcm9vdC8uc3NoL2NvbmZpZyk6Ci0KLQlIb3N0IHNzaGdhdGV3YXkKLQkJVHVubmVsIHllcwotCQlUdW5uZWxEZXZpY2UgMDphbnkKLQkJUGVybWl0TG9jYWxDb21tYW5kIHllcwotCSAgICAgICAgTG9jYWxDb21tYW5kIHNoIC9ldGMvbmV0c3RhcnQgdHVuMAotCi1BIG1vcmUgY29tcGxpY2F0ZWQgY29uZmlndXJhdGlvbiBpcyBwb3NzaWJsZSB0byBlc3RhYmxpc2ggYSB0dW5uZWwgdG8KLWEgcmVtb3RlIGhvc3Qgd2hpY2ggaXMgbm90IGRpcmVjdGx5IGFjY2Vzc2libGUgYnkgdGhlIGNsaWVudC4KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZXNjcmliZXMgYSBjbGllbnQgY29uZmlndXJhdGlvbiB0byBjb25uZWN0IHRvCi10aGUgcmVtb3RlIGhvc3Qgb3ZlciB0d28gc3NoIGhvcHMgaW4gYmV0d2Vlbi4gSXQgdXNlcyB0aGUgT3BlblNTSAotUHJveHlDb21tYW5kIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIG5jKDEpIHByb2dyYW0gdG8gZm9yd2FyZCB0aGUgZmluYWwKLXNzaCB0dW5uZWwgZGVzdGluYXRpb24gb3ZlciBtdWx0aXBsZSBzc2ggc2Vzc2lvbnMuCi0KLQlIb3N0IGFjY2Vzcy5zb21ld2hlcmUubmV0Ci0JICAgICAgICBVc2VyIHB1ZmZ5Ci0JSG9zdCBkbXpndwotCSAgICAgICAgVXNlciBwdWZmeQotCSAgICAgICAgUHJveHlDb21tYW5kIHNzaCBhY2Nlc3Muc29tZXdoZXJlLm5ldCBuYyBkbXpndyAyMgotCUhvc3Qgc3NoZ2F0ZXdheQotCSAgICAgICAgVHVubmVsIEV0aGVybmV0Ci0JICAgICAgICBUdW5uZWxEZXZpY2UgMDphbnkKLQkgICAgICAgIFBlcm1pdExvY2FsQ29tbWFuZCB5ZXMKLQkgICAgICAgIExvY2FsQ29tbWFuZCBzaCAvZXRjL25ldHN0YXJ0IHR1bjAKLQkgICAgICAgIFByb3h5Q29tbWFuZCBzc2ggZG16Z3cgbmMgc3NoZ2F0ZXdheSAyMgotCi1UaGUgZm9sbG93aW5nIG5ldHdvcmsgcGxhbiBpbGx1c3RyYXRlcyB0aGUgcHJldmlvdXMgY29uZmlndXJhdGlvbiBpbgotY29tYmluYXRpb24gd2l0aCBsYXllciAyIHR1bm5lbGluZyBhbmQgRXRoZXJuZXQgYnJpZGdpbmcuCi0KLSstLS0tLS0tLSsgICAgICAgKCAgICAgICAgICApICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IENsaWVudCB8LS0tLS0tKCAgSW50ZXJuZXQgICktLS0tLXwgYWNjZXNzLnNvbWV3aGVyZS5uZXQgfAotKy0tLS0tLS0tKyAgICAgICAoICAgICAgICAgICkgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICA6IDE5Mi4xNjguMS43OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgIDouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgICAgICAgICstLS0tLS0tKwotICAgICBGb3J3YXJkZWQgc3NoIGNvbm5lY3Rpb24gICAgOiAgICAgICAgIHwgZG16Z3cgfAotICAgICBMYXllciAyIHR1bm5lbCAgICAgICAgICAgICAgOiAgICAgICAgICstLS0tLS0tKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICArLS0tLS0tLS0tLS0tKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOi4uLi4uLnwgc3NoZ2F0ZXdheSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKy0tLS0tLS0tLS0tLSsKLS0tLSByZWFsIGNvbm5lY3Rpb24gICAgICAgICAgICAgICAgIEJyaWRnZSAtPiAgfCAgICAgICAgICArLS0tLS0tLS0tLSsKLS4uLiAidmlydHVhbCBjb25uZWN0aW9uIiAgICAgICAgICAgICAgICAgICAgIFsgWCBdLS0tLS0tLS18IHNvbWVob3N0IHwKLVtYXSBzd2l0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLSsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIuMTY4LjEuMjUKLQotKDUpIENsaWVudDogQ29ubmVjdCB0byB0aGUgc2VydmVyIGFuZCBlc3RhYmxpc2ggdGhlIHR1bm5lbAotCi1GaW5hbGx5IGNvbm5lY3QgdG8gdGhlIE9wZW5TU0ggc2VydmVyIHRvIGVzdGFibGlzaCB0aGUgdHVubmVsIGJ5IHVzaW5nCi10aGUgZm9sbG93aW5nIGNvbW1hbmQ6Ci0KLQlzc2ggc3NoZ2F0ZXdheQotCi1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHRlbGwgdGhlIGNsaWVudCB0byBmb3JrIGludG8gdGhlIGJhY2tncm91bmQgYWZ0ZXIKLXRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZDoKLQotCXNzaCAtZiBzc2hnYXRld2F5IHRydWUKLQotV2l0aG91dCB0aGUgc3NoIGNvbmZpZ3VyYXRpb24gZG9uZSBpbiBzdGVwICg0KSwgaXQgaXMgYWxzbyBwb3NzaWJsZQotdG8gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lczoKLQotCXNzaCAtZncgMDoxIHNzaGdhdGV3YXkgdHJ1ZQotCWlmY29uZmlnIHR1bjAgMTkyLjE2OC41LjEgMTkyLjE2OC41LjIgbmV0bWFzayAyNTUuMjU1LjI1NS4yNTIKLQotVXNpbmcgT3BlblNTSCB0dW5uZWwgZm9yd2FyZGluZyBpcyBhIHNpbXBsZSB3YXkgdG8gZXN0YWJsaXNoIHNlY3VyZQotYW5kIGFkIGhvYyB2aXJ0dWFsIHByaXZhdGUgbmV0d29ya3MuIFBvc3NpYmxlIGZpZWxkcyBvZiBhcHBsaWNhdGlvbgotY291bGQgYmUgd2lyZWxlc3MgbmV0d29ya3Mgb3IgYWRtaW5pc3RyYXRpdmUgVlBOIHR1bm5lbHMuCi0KLU5ldmVydGhlbGVzcywgc3NoIHR1bm5lbGluZyByZXF1aXJlcyBzb21lIHBhY2tldCBoZWFkZXIgb3ZlcmhlYWQgYW5kCi1ydW5zIG9uIHRvcCBvZiBUQ1AuIEl0IGlzIHN0aWxsIHN1Z2dlc3RlZCB0byB1c2UgdGhlIElQIFNlY3VyaXR5Ci1Qcm90b2NvbCAoSVBTZWMpIGZvciByb2J1c3QgYW5kIHBlcm1hbmVudCBWUE4gY29ubmVjdGlvbnMgYW5kIHRvCi1pbnRlcmNvbm5lY3QgY29ycG9yYXRlIG5ldHdvcmtzLgotCi0JUmV5ayBGbG9ldGVyCi0KLSRPcGVuQlNEOiBSRUFETUUudHVuLHYgMS40IDIwMDYvMDMvMjggMDA6MTI6MzEgZGVyYWFkdCBFeHAgJApkaWZmIC0tZ2l0IGEvVE9ETyBiL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWFhNGIuLjAwMDAwMDAKLS0tIGEvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLURvY3VtZW50YXRpb246Ci0KLS0gVXBkYXRlIHRoZSBkb2NzCi0gIC0gVXBkYXRlIFJFQURNRQotICAtIFVwZGF0ZSBJTlNUQUxMCi0gIC0gTWVyZ2UgSU5TVEFMTCAmIFJFQURNRS5wcml2c2VwCi0KLS0gSW5zdGFsbCBGQVE/Ci0KLS0gR2VuZXJhbCBGQVEgb24gUy9LZXksIFRJUywgUlNBLCBSU0EyLCBEU0EsIGV0YyBhbmQgc3VnZ2VzdGlvbnMgb24gd2hlbiBpdAotICB3b3VsZCBiZSBiZXN0IHRvIHVzZSB0aGVtLgotCi0tIENyZWF0ZSBhIERvY3VtZW50YXRpb24vIGRpcmVjdG9yeT8KLQotUHJvZ3JhbW1pbmc6Ci0KLS0gR3JlcCBmb3IgJ1hYWCcgY29tbWVudHMgYW5kIGZpeAotCi0tIExpbmsgb3JkZXIgaXMgaW5jb3JyZWN0IGZvciBzb21lIHN5c3RlbXMgdXNpbmcgS2VyYmVyb3MgNCBhbmQgQUZTLiBSZXN1bHQKLSAgaXMgbXVsdGlwbGUgaW5jbHVzaW9uIG9mIERFUyBzeW1ib2xzLiBIb2xnZXIgVHJhcHAKLSAgPGhvbGdlci50cmFwcEBocnoudHUtY2hlbW5pdHouZGU+IHJlcG9ydHMgdGhhdCBjaGFuZ2luZyB0aGUgY29uZmlndXJlCi0gIGdlbmVyYXRlZCBsaW5rIG9yZGVyIGZyb206Ci0JLWxyZXNvbHYgLWxrcmIgLWx6IC1sbnNsICAtbHV0aWwgLWxrYWZzIC1sa3JiIC1sZGVzIC1sY3J5cHRvCi0gIHRvOgotCS1scmVzb2x2IC1sa3JiIC1seiAtbG5zbCAgLWx1dGlsIC1sY3J5cHRvIC1sa2FmcyAtbGtyYiAtbGRlcwotICBmaXhpbmcgdGhlIHByb2JsZW0uCi0KLS0gV3JpdGUgYSB0ZXN0IHByb2dyYW0gdGhhdCBjYWxscyBzdGF0KCkgdG8gc2VhcmNoIGZvciBFR0QvUFJOR2Qgc29ja2V0Ci0gIHJhdGhlciB0aGFuIHVzZSB0aGUgKG5vbi1wb3J0YWJsZSkgInRlc3QgLVMiLgotCi0tIE1vcmUgcGxhdGZvcm1zIGZvciBmb3Igc2V0cHJvY3RpdGxlKCkgZW11bGF0aW9uICh0ZXN0aW5nIG5lZWRlZCkKLQotLSBJbXByb3ZlIFBBTSBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uCi0gLSBJbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCi0gLSBVc2UgZGlmZmVyZW50IFBBTSBzZXJ2aWNlIG5hbWUgZm9yIGtiZGludCB2cyByZWd1bGFyIGF1dGggKHN1Z2dlc3QgZnJvbQotICAgU29sYXIgRGVzaWduZXIpCi0gLSBBYmlsaXR5IHRvIHNlbGVjdCB3aGljaCBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9ucyBtYXkgYmUgdXNlZAotICAgYW5kIG9yZGVyIHRvIHRyeSB0aGVtIGluIGUuZy4gIkNoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gc2tleSwgcGFtIgotCi0tIENvbXBsZXRlIFRydTY0IFNJQSBzdXBwb3J0Ci0gLSBJdCBsb29rcyBsaWtlIHdlIGNvdWxkIG1lcmdlIGl0IGludG8gdGhlIHBhc3N3b3JkIGF1dGggY29kZSB0byBjdXQgZG93bgotICAgb24gZGlmZiBzaXplLiBNYXliZSBQQU0gcGFzc3dvcmQgYXV0aCB0b28/Ci0KLS0gRmluaXNoIGludGVncmF0aW5nIGtlcm5lbC1sZXZlbCBhdWRpdGluZyBjb2RlIGZvciBJUklYIGFuZCBTT0xBUklTCi0gIChHaWxiZXJ0LnIubG9vbWlzQHNhaWMuY29tKQotCi0tIDY0LWJpdCBidWlsZHMgb24gSFAtVVggMTEuWCAoc3RldmVza0Bwb2JveC5jb20pOgotICAtIHV0bXAvd3RtcCBnZXQgY29ycnVwdGVkIChzb21ldGhpbmcgaW4gbG9naW5yZWM/KQotICAtIGNhbid0IGJ1aWxkIHdpdGggUEFNIChubyA2NC1iaXQgbGlicGFtIHlldCkKLQotQ2xlYW4gdXAgY29uZmlndXJlL21ha2VmaWxlczoKLS0gQ2xlYW4gdXAgY29uZmlndXJlLmFjIC0gVGhlcmUgYXJlIGEgZmV3IGRvdWJsZSAjZGVmaW5lZCB2YXJpYWJsZXMKLSAgbGVmdCB0byBkby4gIEhBVkVfTE9HSU4gaXMgb25lIG9mIHRoZW0uICBDb25zaWRlciBOT1QgbG9va2luZyBmb3IKLSAgaW5mb3JtYXRpb24gaW4gd3RtcHggb3IgdXRtcHggb3IgYW55IG9mIHRoYXQgc3R1ZmYgaWYgaXQncyBub3QgZGV0ZWN0ZWQKLSAgZnJvbSB0aGUgc3RhcnQKLQotLSBSZXBsYWNlIHRoZSB3aG9sZSB1X2ludFhYX3QgZXZpbG5lc3MgaW4gYWNjb25maWcuaCB3aXRoIHNvbWV0aGluZyBiZXR0ZXI/Pz8KLSAtIERvIGl0IGluIGNvbmZpZ3VyZS5hYwotCi0tIENvbnNpZGVyIHNwbGl0dGluZyB0aGUgdV9pbnRYWF90IHRlc3QgZm9yIHN5cy9iaXR5cGUuaCAgaW50byBzZXBlcmF0ZSB0ZXN0Ci0gIHRvIGFsbG93IHBlb3BsZSB0byAocmlnaHQvd3JvbmdmdWxseSkgbGluayBhZ2FpbnN0IEJpbmQgZGlyZWN0bHkuCi0KLS0gQ29uc2lkZXIgc3BsaXR0aW5nIGNvbmZpZ3VyZS5hYyBpbnRvIHNlcGVyYXRlIGZpbGVzIHdoaWNoIGRvIGxvZ2ljYWxseQotICBzaW1pbGFyIHRlc3RzLiBFLmcgbW92ZSBhbGwgdGhlIHR5cGUgZGV0ZWN0aW9uIHN0dWZmIGludG8gb25lIGZpbGUsCi0gIGVudHJvcHkgcmVsYXRlZCBzdHVmZiBpbnRvIGFub3RoZXIuCi0KLVBhY2thZ2luZzoKLS0gSFAtVVg6IFByb3ZpZGUgREVQT1QgcGFja2FnZSBzY3JpcHRzLgotICAoZ2lsYmVydC5yLmxvb21pc0BzYWljLmNvbSkKLQotUHJpdlNlcCBJc3N1ZXM6Ci0tIG1tYXAoKSBpc3N1ZXMuCi0gICsgL2Rldi96ZXJvIHNvbHV0aW9uIChTb2xhcmlzKQotICArIE5vL2Jyb2tlbiBNQVBfQU5PTiAoSXJpeCkKLSAgKyBicm9rZW4gL2Rldi96ZXJvIHBhcnNlIChMaW51eCkKLS0gUEFNCi0gICsgU2VlIGFib3ZlIFBBTSBub3RlcwotLSBBSVgKLSAgKyB1c3JpbmZvKCkgZG9lcyBub3Qgc2V0IFRUWSwgYnV0IG9ubHkgcmVxdWlyZWQgZm9yIGxlZ2FjeSBzeXN0ZW1zLiAgV29ya3MKLSAgICB3aXRoIFByaXZTZXAuCi0tIE9TRgotICArIFNJQSBpcyBicm9rZW4KLS0gQ3lnd2luCi0gICsgUHJpdnNlcCBmb3IgUHJlLWF1dGggb25seSAobm8gZmQgcGFzc2luZykKLQotJElkOiBUT0RPLHYgMS41OCAyMDA0LzEyLzA2IDExOjQwOjExIGR0dWNrZXIgRXhwICQKZGlmZiAtLWdpdCBhL2FjbG9jYWwubTQgYi9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmRlYTVlLi4wMDAwMDAwCi0tLSBhL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi1kbmwgJElkOiBhY2xvY2FsLm00LHYgMS44IDIwMTEvMDUvMjAgMDE6NDU6MjUgZGptIEV4cCAkCi1kbmwKLWRubCBPcGVuU1NILXNwZWNpZmljIGF1dG9jb25mIG1hY3JvcwotZG5sCi0KLWRubCBPU1NIX0NIRUNLX0NGTEFHX0NPTVBJTEUoY2hlY2tfZmxhZ1ssIGRlZmluZV9mbGFnXSkKLWRubCBDaGVjayB0aGF0ICRDQyBhY2NlcHRzIGEgZmxhZyAnY2hlY2tfZmxhZycuIElmIGl0IGlzIHN1cHBvcnRlZCBhcHBlbmQKLWRubCAnZGVmaW5lX2ZsYWcnIHRvICRDRkxBR1MuIElmICdkZWZpbmVfZmxhZycgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBhcHBlbmQKLWRubCAnY2hlY2tfZmxhZycuCi1BQ19ERUZVTihbT1NTSF9DSEVDS19DRkxBR19DT01QSUxFXSwgW3sKLQlBQ19NU0dfQ0hFQ0tJTkcoW2lmICRDQyBzdXBwb3J0cyAkMV0pCi0Jc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgotCUNGTEFHUz0iJENGTEFHUyAkMSIKLQlfZGVmaW5lX2ZsYWc9IiQyIgotCXRlc3QgIngkX2RlZmluZV9mbGFnIiA9ICJ4IiAmJiBfZGVmaW5lX2ZsYWc9IiQxIgotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbW2ludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH1dXSldLAotCQlbIEFDX01TR19SRVNVTFQoW3llc10pCi0JCSAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTICRfZGVmaW5lX2ZsYWciXSwKLQkJWyBBQ19NU0dfUkVTVUxUKFtub10pCi0JCSAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIiBdCi0JKQotfV0pCi0KLQotZG5sIE9TU0hfQ0hFQ0tfSEVBREVSX0ZPUl9GSUVMRChmaWVsZCwgaGVhZGVyLCBzeW1ib2wpCi1kbmwgRG9lcyBBQ19FR1JFUF9IRUFERVIgb24gJ2hlYWRlcicgZm9yIHRoZSBzdHJpbmcgJ2ZpZWxkJwotZG5sIElmIGZvdW5kLCBzZXQgJ3N5bWJvbCcgdG8gYmUgZGVmaW5lZC4gQ2FjaGUgdGhlIHJlc3VsdC4KLWRubCBUT0RPOiBUaGlzIGlzIG5vdCBmb29scHJvb2YsIGJldHRlciB0byBjb21waWxlIGFuZCByZWFkIGZyb20gdGhlcmUKLUFDX0RFRlVOKE9TU0hfQ0hFQ0tfSEVBREVSX0ZPUl9GSUVMRCwgWwotIyBsb29rIGZvciBmaWVsZCAnJDEnIGluIGhlYWRlciAnJDInCi0JZG5sIFRoaXMgc3RyaXBzIGNoYXJhY3RlcnMgaWxsZWdhbCB0byBtNCBmcm9tIHRoZSBoZWFkZXIgZmlsZW5hbWUKLQlvc3NoX3NhZmU9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLQlkbmwKLQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18iJDEKLQlBQ19NU0dfQ0hFQ0tJTkcoZm9yICQxIGZpZWxkIGluICQyKQotCUFDX0NBQ0hFX1ZBTCgkb3NzaF92YXJuYW1lLCBbCi0JCUFDX0VHUkVQX0hFQURFUigkMSwgJDIsIFsgZG5sCi0JCQlldmFsICIkb3NzaF92YXJuYW1lPXllcyIgZG5sCi0JCV0sIFsgZG5sCi0JCQlldmFsICIkb3NzaF92YXJuYW1lPW5vIiBkbmwKLQkJXSkgZG5sCi0JXSkKLQlvc3NoX3Jlc3VsdD1gZXZhbCAnZWNobyAkJyIkb3NzaF92YXJuYW1lImAKLQlpZiB0ZXN0IC1uICJgZWNobyAkb3NzaF92YXJuYW1lYCI7IHRoZW4KLQkJQUNfTVNHX1JFU1VMVCgkb3NzaF9yZXN1bHQpCi0JCWlmIHRlc3QgIngkb3NzaF9yZXN1bHQiID0gInh5ZXMiOyB0aGVuCi0JCQlBQ19ERUZJTkUoJDMsIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgJDEgaW4gJDJdKQotCQlmaQotCWVsc2UKLQkJQUNfTVNHX1JFU1VMVChubykKLQlmaQotXSkKLQotZG5sIENoZWNrIGZvciBzb2NrbGVuX3Q6IGhpc3RvcmljYWxseSBvbiBCU0QgaXQgaXMgYW4gaW50LCBhbmQgaW4KLWRubCBQT1NJWCAxZyBpdCBpcyBhIHR5cGUgb2YgaXRzIG93biwgYnV0IHNvbWUgcGxhdGZvcm1zIHVzZSBkaWZmZXJlbnQKLWRubCB0eXBlcyBmb3IgdGhlIGFyZ3VtZW50IHRvIGdldHNvY2tvcHQsIGdldHBlZXJuYW1lLCBldGMuICBTbyB3ZQotZG5sIGhhdmUgdG8gdGVzdCB0byBmaW5kIHNvbWV0aGluZyB0aGF0IHdpbGwgd29yay4KLUFDX0RFRlVOKFtUWVBFX1NPQ0tMRU5fVF0sCi1bCi0gICBBQ19DSEVDS19UWVBFKFtzb2NrbGVuX3RdLCAsWwotICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igc29ja2xlbl90IGVxdWl2YWxlbnRdKQotICAgICAgQUNfQ0FDSEVfVkFMKFtjdXJsX2N2X3NvY2tsZW5fdF9lcXVpdl0sCi0gICAgICBbCi0JICMgU3lzdGVtcyBoYXZlIGVpdGhlciAic3RydWN0IHNvY2thZGRyICoiIG9yCi0JICMgInZvaWQgKiIgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBnZXRwZWVybmFtZQotCSBjdXJsX2N2X3NvY2tsZW5fdF9lcXVpdj0KLQkgZm9yIGFyZzIgaW4gInN0cnVjdCBzb2NrYWRkciIgdm9pZDsgZG8KLQkgICAgZm9yIHQgaW4gaW50IHNpemVfdCB1bnNpZ25lZCBsb25nICJ1bnNpZ25lZCBsb25nIjsgZG8KLQkgICAgICAgQUNfVFJZX0NPTVBJTEUoWwotCQkgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkJICAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0JCSAgaW50IGdldHBlZXJuYW1lIChpbnQsICRhcmcyICosICR0ICopOwotCSAgICAgICBdLFsKLQkJICAkdCBsZW47Ci0JCSAgZ2V0cGVlcm5hbWUoMCwwLCZsZW4pOwotCSAgICAgICBdLFsKLQkJICBjdXJsX2N2X3NvY2tsZW5fdF9lcXVpdj0iJHQiCi0JCSAgYnJlYWsKLQkgICAgICAgXSkKLQkgICAgZG9uZQotCSBkb25lCi0KLQkgaWYgdGVzdCAieCRjdXJsX2N2X3NvY2tsZW5fdF9lcXVpdiIgPSB4OyB0aGVuCi0JICAgIEFDX01TR19FUlJPUihbQ2Fubm90IGZpbmQgYSB0eXBlIHRvIHVzZSBpbiBwbGFjZSBvZiBzb2NrbGVuX3RdKQotCSBmaQotICAgICAgXSkKLSAgICAgIEFDX01TR19SRVNVTFQoJGN1cmxfY3Zfc29ja2xlbl90X2VxdWl2KQotICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKHNvY2tsZW5fdCwgJGN1cmxfY3Zfc29ja2xlbl90X2VxdWl2LAotCQkJW3R5cGUgdG8gdXNlIGluIHBsYWNlIG9mIHNvY2tsZW5fdCBpZiBub3QgZGVmaW5lZF0pXSwKLSAgICAgIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPl0pCi1dKQotCmRpZmYgLS1naXQgYS9hY3NzLmMgYi9hY3NzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTJjMDEuLjAwMDAwMDAKLS0tIGEvYWNzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qCSRJZDogYWNzcy5jLHYgMS40IDIwMDYvMDcvMjQgMDQ6NTE6MDEgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBPcGVuQlNEIHByb2plY3QKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLQotI2lmICFkZWZpbmVkKEVWUF9DVFJMX1NFVF9BQ1NTX01PREUpICYmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDYwMDBMKQotCi0jaW5jbHVkZSAiYWNzcy5oIgotCi0vKiBkZWNyeXB0aW9uIHNib3ggKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNib3hkZWNbXSA9IHsKLQkweDMzLCAweDczLCAweDNiLCAweDI2LCAweDYzLCAweDIzLCAweDZiLCAweDc2LAotCTB4M2UsIDB4N2UsIDB4MzYsIDB4MmIsIDB4NmUsIDB4MmUsIDB4NjYsIDB4N2IsCi0JMHhkMywgMHg5MywgMHhkYiwgMHgwNiwgMHg0MywgMHgwMywgMHg0YiwgMHg5NiwKLQkweGRlLCAweDllLCAweGQ2LCAweDBiLCAweDRlLCAweDBlLCAweDQ2LCAweDliLAotCTB4NTcsIDB4MTcsIDB4NWYsIDB4ODIsIDB4YzcsIDB4ODcsIDB4Y2YsIDB4MTIsCi0JMHg1YSwgMHgxYSwgMHg1MiwgMHg4ZiwgMHhjYSwgMHg4YSwgMHhjMiwgMHgxZiwKLQkweGQ5LCAweDk5LCAweGQxLCAweDAwLCAweDQ5LCAweDA5LCAweDQxLCAweDkwLAotCTB4ZDgsIDB4OTgsIDB4ZDAsIDB4MDEsIDB4NDgsIDB4MDgsIDB4NDAsIDB4OTEsCi0JMHgzZCwgMHg3ZCwgMHgzNSwgMHgyNCwgMHg2ZCwgMHgyZCwgMHg2NSwgMHg3NCwKLQkweDNjLCAweDdjLCAweDM0LCAweDI1LCAweDZjLCAweDJjLCAweDY0LCAweDc1LAotCTB4ZGQsIDB4OWQsIDB4ZDUsIDB4MDQsIDB4NGQsIDB4MGQsIDB4NDUsIDB4OTQsCi0JMHhkYywgMHg5YywgMHhkNCwgMHgwNSwgMHg0YywgMHgwYywgMHg0NCwgMHg5NSwKLQkweDU5LCAweDE5LCAweDUxLCAweDgwLCAweGM5LCAweDg5LCAweGMxLCAweDEwLAotCTB4NTgsIDB4MTgsIDB4NTAsIDB4ODEsIDB4YzgsIDB4ODgsIDB4YzAsIDB4MTEsCi0JMHhkNywgMHg5NywgMHhkZiwgMHgwMiwgMHg0NywgMHgwNywgMHg0ZiwgMHg5MiwKLQkweGRhLCAweDlhLCAweGQyLCAweDBmLCAweDRhLCAweDBhLCAweDQyLCAweDlmLAotCTB4NTMsIDB4MTMsIDB4NWIsIDB4ODYsIDB4YzMsIDB4ODMsIDB4Y2IsIDB4MTYsCi0JMHg1ZSwgMHgxZSwgMHg1NiwgMHg4YiwgMHhjZSwgMHg4ZSwgMHhjNiwgMHgxYiwKLQkweGIzLCAweGYzLCAweGJiLCAweGE2LCAweGUzLCAweGEzLCAweGViLCAweGY2LAotCTB4YmUsIDB4ZmUsIDB4YjYsIDB4YWIsIDB4ZWUsIDB4YWUsIDB4ZTYsIDB4ZmIsCi0JMHgzNywgMHg3NywgMHgzZiwgMHgyMiwgMHg2NywgMHgyNywgMHg2ZiwgMHg3MiwKLQkweDNhLCAweDdhLCAweDMyLCAweDJmLCAweDZhLCAweDJhLCAweDYyLCAweDdmLAotCTB4YjksIDB4ZjksIDB4YjEsIDB4YTAsIDB4ZTksIDB4YTksIDB4ZTEsIDB4ZjAsCi0JMHhiOCwgMHhmOCwgMHhiMCwgMHhhMSwgMHhlOCwgMHhhOCwgMHhlMCwgMHhmMSwKLQkweDVkLCAweDFkLCAweDU1LCAweDg0LCAweGNkLCAweDhkLCAweGM1LCAweDE0LAotCTB4NWMsIDB4MWMsIDB4NTQsIDB4ODUsIDB4Y2MsIDB4OGMsIDB4YzQsIDB4MTUsCi0JMHhiZCwgMHhmZCwgMHhiNSwgMHhhNCwgMHhlZCwgMHhhZCwgMHhlNSwgMHhmNCwKLQkweGJjLCAweGZjLCAweGI0LCAweGE1LCAweGVjLCAweGFjLCAweGU0LCAweGY1LAotCTB4MzksIDB4NzksIDB4MzEsIDB4MjAsIDB4NjksIDB4MjksIDB4NjEsIDB4NzAsCi0JMHgzOCwgMHg3OCwgMHgzMCwgMHgyMSwgMHg2OCwgMHgyOCwgMHg2MCwgMHg3MSwKLQkweGI3LCAweGY3LCAweGJmLCAweGEyLCAweGU3LCAweGE3LCAweGVmLCAweGYyLAotCTB4YmEsIDB4ZmEsIDB4YjIsIDB4YWYsIDB4ZWEsIDB4YWEsIDB4ZTIsIDB4ZmYKLX07Ci0KLS8qIGVuY3J5cHRpb24gc2JveCAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgc2JveGVuY1tdID0gewotCTB4MzMsIDB4M2IsIDB4NzMsIDB4MTUsIDB4NTMsIDB4NWIsIDB4MTMsIDB4NzUsCi0JMHgzZCwgMHgzNSwgMHg3ZCwgMHgxYiwgMHg1ZCwgMHg1NSwgMHgxZCwgMHg3YiwKLQkweDY3LCAweDZmLCAweDI3LCAweDgxLCAweGM3LCAweGNmLCAweDg3LCAweDIxLAotCTB4NjksIDB4NjEsIDB4MjksIDB4OGYsIDB4YzksIDB4YzEsIDB4ODksIDB4MmYsCi0JMHhlMywgMHhlYiwgMHhhMywgMHgwNSwgMHg0MywgMHg0YiwgMHgwMywgMHhhNSwKLQkweGVkLCAweGU1LCAweGFkLCAweDBiLCAweDRkLCAweDQ1LCAweDBkLCAweGFiLAotCTB4ZWEsIDB4ZTIsIDB4YWEsIDB4MDAsIDB4NGEsIDB4NDIsIDB4MGEsIDB4YTAsCi0JMHhlOCwgMHhlMCwgMHhhOCwgMHgwMiwgMHg0OCwgMHg0MCwgMHgwOCwgMHhhMiwKLQkweDNlLCAweDM2LCAweDdlLCAweDE0LCAweDVlLCAweDU2LCAweDFlLCAweDc0LAotCTB4M2MsIDB4MzQsIDB4N2MsIDB4MTYsIDB4NWMsIDB4NTQsIDB4MWMsIDB4NzYsCi0JMHg2YSwgMHg2MiwgMHgyYSwgMHg4MCwgMHhjYSwgMHhjMiwgMHg4YSwgMHgyMCwKLQkweDY4LCAweDYwLCAweDI4LCAweDgyLCAweGM4LCAweGMwLCAweDg4LCAweDIyLAotCTB4ZWUsIDB4ZTYsIDB4YWUsIDB4MDQsIDB4NGUsIDB4NDYsIDB4MGUsIDB4YTQsCi0JMHhlYywgMHhlNCwgMHhhYywgMHgwNiwgMHg0YywgMHg0NCwgMHgwYywgMHhhNiwKLQkweGU3LCAweGVmLCAweGE3LCAweDAxLCAweDQ3LCAweDRmLCAweDA3LCAweGExLAotCTB4ZTksIDB4ZTEsIDB4YTksIDB4MGYsIDB4NDksIDB4NDEsIDB4MDksIDB4YWYsCi0JMHg2MywgMHg2YiwgMHgyMywgMHg4NSwgMHhjMywgMHhjYiwgMHg4MywgMHgyNSwKLQkweDZkLCAweDY1LCAweDJkLCAweDhiLCAweGNkLCAweGM1LCAweDhkLCAweDJiLAotCTB4MzcsIDB4M2YsIDB4NzcsIDB4MTEsIDB4NTcsIDB4NWYsIDB4MTcsIDB4NzEsCi0JMHgzOSwgMHgzMSwgMHg3OSwgMHgxZiwgMHg1OSwgMHg1MSwgMHgxOSwgMHg3ZiwKLQkweGIzLCAweGJiLCAweGYzLCAweDk1LCAweGQzLCAweGRiLCAweDkzLCAweGY1LAotCTB4YmQsIDB4YjUsIDB4ZmQsIDB4OWIsIDB4ZGQsIDB4ZDUsIDB4OWQsIDB4ZmIsCi0JMHhiYSwgMHhiMiwgMHhmYSwgMHg5MCwgMHhkYSwgMHhkMiwgMHg5YSwgMHhmMCwKLQkweGI4LCAweGIwLCAweGY4LCAweDkyLCAweGQ4LCAweGQwLCAweDk4LCAweGYyLAotCTB4NmUsIDB4NjYsIDB4MmUsIDB4ODQsIDB4Y2UsIDB4YzYsIDB4OGUsIDB4MjQsCi0JMHg2YywgMHg2NCwgMHgyYywgMHg4NiwgMHhjYywgMHhjNCwgMHg4YywgMHgyNiwKLQkweDNhLCAweDMyLCAweDdhLCAweDEwLCAweDVhLCAweDUyLCAweDFhLCAweDcwLAotCTB4MzgsIDB4MzAsIDB4NzgsIDB4MTIsIDB4NTgsIDB4NTAsIDB4MTgsIDB4NzIsCi0JMHhiZSwgMHhiNiwgMHhmZSwgMHg5NCwgMHhkZSwgMHhkNiwgMHg5ZSwgMHhmNCwKLQkweGJjLCAweGI0LCAweGZjLCAweDk2LCAweGRjLCAweGQ0LCAweDljLCAweGY2LAotCTB4YjcsIDB4YmYsIDB4ZjcsIDB4OTEsIDB4ZDcsIDB4ZGYsIDB4OTcsIDB4ZjEsCi0JMHhiOSwgMHhiMSwgMHhmOSwgMHg5ZiwgMHhkOSwgMHhkMSwgMHg5OSwgMHhmZgotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgcmV2ZXJzZVtdID0gewotCTB4MDAsIDB4ODAsIDB4NDAsIDB4YzAsIDB4MjAsIDB4YTAsIDB4NjAsIDB4ZTAsCi0JMHgxMCwgMHg5MCwgMHg1MCwgMHhkMCwgMHgzMCwgMHhiMCwgMHg3MCwgMHhmMCwKLQkweDA4LCAweDg4LCAweDQ4LCAweGM4LCAweDI4LCAweGE4LCAweDY4LCAweGU4LAotCTB4MTgsIDB4OTgsIDB4NTgsIDB4ZDgsIDB4MzgsIDB4YjgsIDB4NzgsIDB4ZjgsCi0JMHgwNCwgMHg4NCwgMHg0NCwgMHhjNCwgMHgyNCwgMHhhNCwgMHg2NCwgMHhlNCwKLQkweDE0LCAweDk0LCAweDU0LCAweGQ0LCAweDM0LCAweGI0LCAweDc0LCAweGY0LAotCTB4MGMsIDB4OGMsIDB4NGMsIDB4Y2MsIDB4MmMsIDB4YWMsIDB4NmMsIDB4ZWMsCi0JMHgxYywgMHg5YywgMHg1YywgMHhkYywgMHgzYywgMHhiYywgMHg3YywgMHhmYywKLQkweDAyLCAweDgyLCAweDQyLCAweGMyLCAweDIyLCAweGEyLCAweDYyLCAweGUyLAotCTB4MTIsIDB4OTIsIDB4NTIsIDB4ZDIsIDB4MzIsIDB4YjIsIDB4NzIsIDB4ZjIsCi0JMHgwYSwgMHg4YSwgMHg0YSwgMHhjYSwgMHgyYSwgMHhhYSwgMHg2YSwgMHhlYSwKLQkweDFhLCAweDlhLCAweDVhLCAweGRhLCAweDNhLCAweGJhLCAweDdhLCAweGZhLAotCTB4MDYsIDB4ODYsIDB4NDYsIDB4YzYsIDB4MjYsIDB4YTYsIDB4NjYsIDB4ZTYsCi0JMHgxNiwgMHg5NiwgMHg1NiwgMHhkNiwgMHgzNiwgMHhiNiwgMHg3NiwgMHhmNiwKLQkweDBlLCAweDhlLCAweDRlLCAweGNlLCAweDJlLCAweGFlLCAweDZlLCAweGVlLAotCTB4MWUsIDB4OWUsIDB4NWUsIDB4ZGUsIDB4M2UsIDB4YmUsIDB4N2UsIDB4ZmUsCi0JMHgwMSwgMHg4MSwgMHg0MSwgMHhjMSwgMHgyMSwgMHhhMSwgMHg2MSwgMHhlMSwKLQkweDExLCAweDkxLCAweDUxLCAweGQxLCAweDMxLCAweGIxLCAweDcxLCAweGYxLAotCTB4MDksIDB4ODksIDB4NDksIDB4YzksIDB4MjksIDB4YTksIDB4NjksIDB4ZTksCi0JMHgxOSwgMHg5OSwgMHg1OSwgMHhkOSwgMHgzOSwgMHhiOSwgMHg3OSwgMHhmOSwKLQkweDA1LCAweDg1LCAweDQ1LCAweGM1LCAweDI1LCAweGE1LCAweDY1LCAweGU1LAotCTB4MTUsIDB4OTUsIDB4NTUsIDB4ZDUsIDB4MzUsIDB4YjUsIDB4NzUsIDB4ZjUsCi0JMHgwZCwgMHg4ZCwgMHg0ZCwgMHhjZCwgMHgyZCwgMHhhZCwgMHg2ZCwgMHhlZCwKLQkweDFkLCAweDlkLCAweDVkLCAweGRkLCAweDNkLCAweGJkLCAweDdkLCAweGZkLAotCTB4MDMsIDB4ODMsIDB4NDMsIDB4YzMsIDB4MjMsIDB4YTMsIDB4NjMsIDB4ZTMsCi0JMHgxMywgMHg5MywgMHg1MywgMHhkMywgMHgzMywgMHhiMywgMHg3MywgMHhmMywKLQkweDBiLCAweDhiLCAweDRiLCAweGNiLCAweDJiLCAweGFiLCAweDZiLCAweGViLAotCTB4MWIsIDB4OWIsIDB4NWIsIDB4ZGIsIDB4M2IsIDB4YmIsIDB4N2IsIDB4ZmIsCi0JMHgwNywgMHg4NywgMHg0NywgMHhjNywgMHgyNywgMHhhNywgMHg2NywgMHhlNywKLQkweDE3LCAweDk3LCAweDU3LCAweGQ3LCAweDM3LCAweGI3LCAweDc3LCAweGY3LAotCTB4MGYsIDB4OGYsIDB4NGYsIDB4Y2YsIDB4MmYsIDB4YWYsIDB4NmYsIDB4ZWYsCi0JMHgxZiwgMHg5ZiwgMHg1ZiwgMHhkZiwgMHgzZiwgMHhiZiwgMHg3ZiwgMHhmZgotfTsKLQotLyoKLSAqIFR3byBsaW5lYXIgZmVlZGJhY2sgc2hpZnQgcmVnaXN0ZXJzIGFyZSB1c2VkOgotICoKLSAqIGxmc3IxNzogIHBvbHlub21pYWwgb2YgZGVncmVlIDE3LCBwcmltaXRpdmUgbW9kdWxvIDIgKGxpc3RlZCBpbiBTY2huZWllcikKLSAqICAgICAgICAgIHheMTUgKyB4ICsgMQotICogbGZzcjI1OiAgcG9seW5vbWlhbCBvZiBkZWdyZWUgMjUsIG5vdCBrbm93IGlmIHByaW1pdGl2ZSBtb2R1bG8gMgotICogICAgICAgICAgeF4xMyArIHheNSArIHheNCArIHheMSArIDEKLSAqCi0gKiBPdXRwdXQgYml0cyBhcmUgZGlzY2FyZGVkLCBpbnN0ZWFkIHRoZSBmZWVkYmFjayBiaXRzIGFyZSBhZGRlZCB0byBwcm9kdWNlCi0gKiB0aGUgY2lwaGVyIHN0cmVhbS4gIERlcGVuZGluZyBvbiB0aGUgbW9kZSwgZmVlZGJhY2sgYnl0ZXMgbWF5IGJlIGludmVydGVkCi0gKiBiaXQtd2lzZSBiZWZvcmUgYWRkaXRpb24uCi0gKgotICogVGhlIGxmc3JzIGFyZSBzZWVkZWQgd2l0aCBieXRlcyBmcm9tIHRoZSByYXcga2V5OgotICoKLSAqIGxmc3IxNzogIGJ5dGUgMFswOjddIGF0IGJpdCA5Ci0gKiAgICAgICAgICBieXRlIDFbMDo3XSBhdCBiaXQgMAotICoKLSAqIGxmc3IyNTogIGJ5dGUgMlswOjRdIGF0IGJpdCAxNgotICogICAgICAgICAgYnl0ZSAyWzU6N10gYXQgYml0IDIyCi0gKiAgICAgICAgICBieXRlIDNbMDo3XSBhdCBiaXQgOAotICogICAgICAgICAgYnl0ZSA0WzA6N10gYXQgYml0IDAKLSAqCi0gKiBUbyBwcmV2ZW50IDAgY3ljbGVzLCAxJ3MgYXJlIGluamVjdCBhdCBiaXQgOCBpbiBsZnJzMTcgYW5kIGJpdCAyMSBpbgotICogbGZzcjI1LgotICoKLSAqLwotCi1pbnQKLWFjc3MoQUNTU19LRVkgKmtleSwgdW5zaWduZWQgbG9uZyBsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLAotICAgIHVuc2lnbmVkIGNoYXIgKm91dCkKLXsKLQl1bnNpZ25lZCBsb25nIGk7Ci0JdW5zaWduZWQgbG9uZyBsZnNyMTd0bXAsIGxmc3IyNXRtcCwgbGZzcnN1bXRtcDsKLQotCWxmc3JzdW10bXAgPSBsZnNyMTd0bXAgPSBsZnNyMjV0bXAgPSAwOwotCi0JLyoga2V5c3RyZWFtIGlzIHN1bSBvZiBsZnNycyAqLwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlsZnNyMTd0bXAgPSBrZXktPmxmc3IxNyBeIChrZXktPmxmc3IxNyA+PiAxNCk7Ci0JCWtleS0+bGZzcjE3ID0gKGtleS0+bGZzcjE3ID4+IDgpCi0JCQleIChsZnNyMTd0bXAgPDwgOSkKLQkJCV4gKGxmc3IxN3RtcCA8PCAxMikKLQkJCV4gKGxmc3IxN3RtcCA8PCAxNSk7Ci0JCWtleS0+bGZzcjE3ICY9IDB4MWZmZmY7CS8qIDE3IGJpdCBMRlNSICovCi0KLQkJbGZzcjI1dG1wID0ga2V5LT5sZnNyMjUKLQkJCV4gKGtleS0+bGZzcjI1ID4+IDMpCi0JCQleIChrZXktPmxmc3IyNSA+PiA0KQotCQkJXiAoa2V5LT5sZnNyMjUgPj4gMTIpOwotCQlrZXktPmxmc3IyNSA9IChrZXktPmxmc3IyNSA+PiA4KSBeIChsZnNyMjV0bXAgPDwgMTcpOwotCQlrZXktPmxmc3IyNSAmPSAweDFmZmZmZmY7CS8qIDI1IGJpdCBMRlNSICovCi0KLQkJbGZzcnN1bXRtcCA9IGtleS0+bGZzcnN1bTsKLQotCQkvKiBhZGRpdGlvbiAqLwotCQlzd2l0Y2ggKGtleS0+bW9kZSkgewotCQljYXNlIEFDU1NfQVVUSEVOVElDQVRFOgotCQljYXNlIEFDU1NfREFUQToKLQkJCWtleS0+bGZzcnN1bSA9IDB4ZmYgJiB+KGtleS0+bGZzcjE3ID4+IDkpOwotCQkJa2V5LT5sZnNyc3VtICs9IGtleS0+bGZzcjI1ID4+IDE3OwotCQkJYnJlYWs7Ci0JCWNhc2UgQUNTU19TRVNTSU9OS0VZOgotCQkJa2V5LT5sZnNyc3VtID0ga2V5LT5sZnNyMTcgPj4gOTsKLQkJCWtleS0+bGZzcnN1bSArPSBrZXktPmxmc3IyNSA+PiAxNzsKLQkJCWJyZWFrOwotCQljYXNlIEFDU1NfVElUTEVLRVk6Ci0JCQlrZXktPmxmc3JzdW0gPSBrZXktPmxmc3IxNyA+PiA5OwotCQkJa2V5LT5sZnNyc3VtICs9IDB4ZmYgJiB+KGtleS0+bGZzcjI1ID4+IDE3KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJa2V5LT5sZnNyc3VtICs9IChsZnNyc3VtdG1wID4+IDgpOwotCi0JCWlmIChrZXktPmVuY3J5cHQpIHsKLQkJCW91dFtpXSA9IHNib3hlbmNbKGluW2ldIF4ga2V5LT5sZnNyc3VtKSAmIDB4ZmZdOwotCQl9IGVsc2UgewotCQkJb3V0W2ldID0gKHNib3hkZWNbaW5baV1dIF4ga2V5LT5sZnNyc3VtKSAmIDB4ZmY7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWFjc3Nfc2VlZChBQ1NTX0tFWSAqa2V5KQotewotCWludCBpOwotCi0JLyogaWYgYXZhaWxhYmxlLCBtYW5nbGUgd2l0aCBzdWJrZXkgKi8KLQlpZiAoa2V5LT5zdWJrZXlfYXZpbGFibGUpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFDU1NfS0VZU0laRTsgaSsrKQotCQkJa2V5LT5zZWVkW2ldID0gcmV2ZXJzZVtrZXktPmRhdGFbaV0gXiBrZXktPnN1YmtleVtpXV07Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IEFDU1NfS0VZU0laRTsgaSsrKQotCQkJa2V5LT5zZWVkW2ldID0gcmV2ZXJzZVtrZXktPmRhdGFbaV1dOwotCX0KLQotCS8qIHNlZWQgbGZzcnMgKi8KLQlrZXktPmxmc3IxNyA9IGtleS0+c2VlZFsxXQotCQl8IChrZXktPnNlZWRbMF0gPDwgOSkKLQkJfCAoMSA8PCA4KTsJLyogaW5qZWN0IDEgYXQgYml0IDkgKi8KLQlrZXktPmxmc3IyNSA9IGtleS0+c2VlZFs0XQotCQl8IChrZXktPnNlZWRbM10gPDwgOCkKLQkJfCAoKGtleS0+c2VlZFsyXSAmIDB4MWYpIDw8IDE2KQotCQl8ICgoa2V5LT5zZWVkWzJdICYgMHhlMCkgPDwgMTcpCi0JCQl8ICgxIDw8IDIxKTsJLyogaW5qZWN0IDEgYXQgYml0IDIyICovCi0KLQlrZXktPmxmc3JzdW0gPSAwOwotfQotCi12b2lkCi1hY3NzX3NldGtleShBQ1NTX0tFWSAqa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgZW5jLCBpbnQgbW9kZSkKLXsKLQltZW1jcHkoa2V5LT5kYXRhLCBkYXRhLCBzaXplb2Yoa2V5LT5kYXRhKSk7Ci0JbWVtc2V0KGtleS0+c3Via2V5LCAwLCBzaXplb2Yoa2V5LT5zdWJrZXkpKTsKLQotCWlmIChlbmMgIT0gLTEpCi0JCWtleS0+ZW5jcnlwdCA9IGVuYzsKLQlrZXktPm1vZGUgPSBtb2RlOwotCWtleS0+c3Via2V5X2F2aWxhYmxlID0gMDsKLQotCWFjc3Nfc2VlZChrZXkpOwotfQotCi12b2lkCi1hY3NzX3NldHN1YmtleShBQ1NTX0tFWSAqa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzdWJrZXkpCi17Ci0JbWVtY3B5KGtleS0+c3Via2V5LCBzdWJrZXksIHNpemVvZihrZXktPnN1YmtleSkpOwotCWtleS0+c3Via2V5X2F2aWxhYmxlID0gMTsKLQlhY3NzX3NlZWQoa2V5KTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYWNzcy5oIGIvYWNzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWI0ODk1Li4wMDAwMDAwCi0tLSBhL2Fjc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCSRJZDogYWNzcy5oLHYgMS4yIDIwMDQvMDIvMDYgMDQ6MjI6NDMgZHR1Y2tlciBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgT3BlbkJTRCBwcm9qZWN0Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQUNTU19IXwotI2RlZmluZSBfQUNTU19IXwotCi0vKiA0MGJpdCBrZXkgKi8KLSNkZWZpbmUgQUNTU19LRVlTSVpFCQk1Ci0KLS8qIG1vZGVzIG9mIGFjc3MgKi8KLSNkZWZpbmUgQUNTU19BVVRIRU5USUNBVEUJMAotI2RlZmluZSBBQ1NTX1NFU1NJT05LRVkJCTEKLSNkZWZpbmUgQUNTU19USVRMRUtFWQkJMgotI2RlZmluZSBBQ1NTX0RBVEEJCTMKLQotdHlwZWRlZiBzdHJ1Y3QgYWNzc19rZXlfc3QgewotCXVuc2lnbmVkIGludAlsZnNyMTc7CQkvKiBjdXJyZW50IHN0YXRlIG9mIGxmc3JzICovCi0JdW5zaWduZWQgaW50CWxmc3IyNTsKLQl1bnNpZ25lZCBpbnQJbGZzcnN1bTsKLQl1bnNpZ25lZCBjaGFyCXNlZWRbQUNTU19LRVlTSVpFXTsKLQl1bnNpZ25lZCBjaGFyCWRhdGFbQUNTU19LRVlTSVpFXTsKLQl1bnNpZ25lZCBjaGFyCXN1YmtleVtBQ1NTX0tFWVNJWkVdOwotCWludAkJZW5jcnlwdDsJLyogWFhYIG1ha2UgdGhlc2UgYml0IGZsYWdzPyAqLwotCWludAkJbW9kZTsKLQlpbnQJCXNlZWRlZDsKLQlpbnQJCXN1YmtleV9hdmlsYWJsZTsKLX0gQUNTU19LRVk7Ci0KLXZvaWQgYWNzc19zZXRrZXkoQUNTU19LRVkgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQsIGludCk7Ci12b2lkIGFjc3Nfc2V0c3Via2V5KEFDU1NfS0VZICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKik7Ci1pbnQgYWNzcyhBQ1NTX0tFWSAqLCB1bnNpZ25lZCBsb25nLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKik7Ci0KLSNlbmRpZiAvKiBpZm5kZWYgX0FDU1NfSF8gKi8KZGlmZiAtLWdpdCBhL2FkZHJtYXRjaC5jIGIvYWRkcm1hdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNjc3M2MuLjAwMDAwMDAKLS0tIGEvYWRkcm1hdGNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDAgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IGFkZHJtYXRjaC5jLHYgMS41IDIwMTAvMDIvMjYgMjA6Mjk6NTQgZGptIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotCi0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAibWF0Y2guaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0KLXN0cnVjdCB4YWRkciB7Ci0Jc2FfZmFtaWx5X3QJYWY7Ci0JdW5pb24gewotCQlzdHJ1Y3QgaW5fYWRkcgkJdjQ7Ci0JCXN0cnVjdCBpbjZfYWRkcgkJdjY7Ci0JCXVfaW50OF90CQlhZGRyOFsxNl07Ci0JCXVfaW50MzJfdAkJYWRkcjMyWzRdOwotCX0geGE7CQkgICAgLyogMTI4LWJpdCBhZGRyZXNzICovCi0JdV9pbnQzMl90CXNjb3BlX2lkOwkvKiBpZmFjZSBzY29wZSBpZCBmb3IgdjYgKi8KLSNkZWZpbmUgdjQJeGEudjQKLSNkZWZpbmUgdjYJeGEudjYKLSNkZWZpbmUgYWRkcjgJeGEuYWRkcjgKLSNkZWZpbmUgYWRkcjMyCXhhLmFkZHIzMgotfTsKLQotc3RhdGljIGludAotYWRkcl91bmljYXN0X21hc2tsZW4oaW50IGFmKQotewotCXN3aXRjaCAoYWYpIHsKLQljYXNlIEFGX0lORVQ6Ci0JCXJldHVybiAzMjsKLQljYXNlIEFGX0lORVQ2OgotCQlyZXR1cm4gMTI4OwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1tYXNrbGVuX3ZhbGlkKGludCBhZiwgdV9pbnQgbWFza2xlbikKLXsKLQlzd2l0Y2ggKGFmKSB7Ci0JY2FzZSBBRl9JTkVUOgotCQlyZXR1cm4gbWFza2xlbiA8PSAzMiA/IDAgOiAtMTsKLQljYXNlIEFGX0lORVQ2OgotCQlyZXR1cm4gbWFza2xlbiA8PSAxMjggPyAwIDogLTE7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KLX0KLQotLyoKLSAqIENvbnZlcnQgc3RydWN0IHNvY2thZGRyIHRvIHN0cnVjdCB4YWRkcgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbnQKLWFkZHJfc2FfdG9feGFkZHIoc3RydWN0IHNvY2thZGRyICpzYSwgc29ja2xlbl90IHNsZW4sIHN0cnVjdCB4YWRkciAqeGEpCi17Ci0Jc3RydWN0IHNvY2thZGRyX2luICppbjQgPSAoc3RydWN0IHNvY2thZGRyX2luICopc2E7Ci0Jc3RydWN0IHNvY2thZGRyX2luNiAqaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYTsKLQotCW1lbXNldCh4YSwgJ1wwJywgc2l6ZW9mKCp4YSkpOwotCi0Jc3dpdGNoIChzYS0+c2FfZmFtaWx5KSB7Ci0JY2FzZSBBRl9JTkVUOgotCQlpZiAoc2xlbiA8IHNpemVvZigqaW40KSkKLQkJCXJldHVybiAtMTsKLQkJeGEtPmFmID0gQUZfSU5FVDsKLQkJbWVtY3B5KCZ4YS0+djQsICZpbjQtPnNpbl9hZGRyLCBzaXplb2YoeGEtPnY0KSk7Ci0JCWJyZWFrOwotCWNhc2UgQUZfSU5FVDY6Ci0JCWlmIChzbGVuIDwgc2l6ZW9mKCppbjYpKQotCQkJcmV0dXJuIC0xOwotCQl4YS0+YWYgPSBBRl9JTkVUNjsKLQkJbWVtY3B5KCZ4YS0+djYsICZpbjYtPnNpbjZfYWRkciwgc2l6ZW9mKHhhLT52NikpOwotI2lmZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX0lONl9TSU42X1NDT1BFX0lECi0JCXhhLT5zY29wZV9pZCA9IGluNi0+c2luNl9zY29wZV9pZDsKLSNlbmRpZgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDYWxjdWxhdGUgYSBuZXRtYXNrIG9mIGxlbmd0aCAnbCcgZm9yIGFkZHJlc3MgZmFtaWx5ICdhZicgYW5kCi0gKiBzdG9yZSBpdCBpbiAnbicuCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludAotYWRkcl9uZXRtYXNrKGludCBhZiwgdV9pbnQgbCwgc3RydWN0IHhhZGRyICpuKQotewotCWludCBpOwotCi0JaWYgKG1hc2tsZW5fdmFsaWQoYWYsIGwpICE9IDAgfHwgbiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQltZW1zZXQobiwgJ1wwJywgc2l6ZW9mKCpuKSk7Ci0Jc3dpdGNoIChhZikgewotCWNhc2UgQUZfSU5FVDoKLQkJbi0+YWYgPSBBRl9JTkVUOwotCQlpZiAobCA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JCW4tPnY0LnNfYWRkciA9IGh0b25sKCgweGZmZmZmZmZmIDw8ICgzMiAtIGwpKSAmIDB4ZmZmZmZmZmYpOwotCQlyZXR1cm4gMDsKLQljYXNlIEFGX0lORVQ2OgotCQluLT5hZiA9IEFGX0lORVQ2OwotCQlmb3IgKGkgPSAwOyBpIDwgNCAmJiBsID49IDMyOyBpKyssIGwgLT0gMzIpCi0JCQluLT5hZGRyMzJbaV0gPSAweGZmZmZmZmZmVTsKLQkJaWYgKGkgPCA0ICYmIGwgIT0gMCkKLQkJCW4tPmFkZHIzMltpXSA9IGh0b25sKCgweGZmZmZmZmZmIDw8ICgzMiAtIGwpKSAmCi0JCQkgICAgMHhmZmZmZmZmZik7Ci0JCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLS8qCi0gKiBQZXJmb3JtIGxvZ2ljYWwgQU5EIG9mIGFkZHJlc3NlcyAnYScgYW5kICdiJywgc3RvcmluZyByZXN1bHQgaW4gJ2RzdCcuCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludAotYWRkcl9hbmQoc3RydWN0IHhhZGRyICpkc3QsIGNvbnN0IHN0cnVjdCB4YWRkciAqYSwgY29uc3Qgc3RydWN0IHhhZGRyICpiKQotewotCWludCBpOwotCi0JaWYgKGRzdCA9PSBOVUxMIHx8IGEgPT0gTlVMTCB8fCBiID09IE5VTEwgfHwgYS0+YWYgIT0gYi0+YWYpCi0JCXJldHVybiAtMTsKLQotCW1lbWNweShkc3QsIGEsIHNpemVvZigqZHN0KSk7Ci0Jc3dpdGNoIChhLT5hZikgewotCWNhc2UgQUZfSU5FVDoKLQkJZHN0LT52NC5zX2FkZHIgJj0gYi0+djQuc19hZGRyOwotCQlyZXR1cm4gMDsKLQljYXNlIEFGX0lORVQ2OgotCQlkc3QtPnNjb3BlX2lkID0gYS0+c2NvcGVfaWQ7Ci0JCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCQlkc3QtPmFkZHIzMltpXSAmPSBiLT5hZGRyMzJbaV07Ci0JCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLS8qCi0gKiBDb21wYXJlIGFkZHJlc3NlcyAnYScgYW5kICdiJwotICogUmV0dXJuIDAgaWYgYWRkcmVzc2VzIGFyZSBpZGVudGljYWwsIC0xIGlmIChhIDwgYikgb3IgMSBpZiAoYSA+IGIpCi0gKi8KLXN0YXRpYyBpbnQKLWFkZHJfY21wKGNvbnN0IHN0cnVjdCB4YWRkciAqYSwgY29uc3Qgc3RydWN0IHhhZGRyICpiKQotewotCWludCBpOwotCi0JaWYgKGEtPmFmICE9IGItPmFmKQotCQlyZXR1cm4gYS0+YWYgPT0gQUZfSU5FVDYgPyAxIDogLTE7Ci0KLQlzd2l0Y2ggKGEtPmFmKSB7Ci0JY2FzZSBBRl9JTkVUOgotCQlpZiAoYS0+djQuc19hZGRyID09IGItPnY0LnNfYWRkcikKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gbnRvaGwoYS0+djQuc19hZGRyKSA+IG50b2hsKGItPnY0LnNfYWRkcikgPyAxIDogLTE7Ci0JY2FzZSBBRl9JTkVUNjoKLQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCQlpZiAoYS0+YWRkcjhbaV0gLSBiLT5hZGRyOFtpXSAhPSAwKQotCQkJCXJldHVybiBhLT5hZGRyOFtpXSA+IGItPmFkZHI4W2ldID8gMSA6IC0xOwotCQlpZiAoYS0+c2NvcGVfaWQgPT0gYi0+c2NvcGVfaWQpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGEtPnNjb3BlX2lkID4gYi0+c2NvcGVfaWQgPyAxIDogLTE7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KLX0KLQotLyoKLSAqIFBhcnNlIHN0cmluZyBhZGRyZXNzICdwJyBpbnRvICduJwotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbnQKLWFkZHJfcHRvbihjb25zdCBjaGFyICpwLCBzdHJ1Y3QgeGFkZHIgKm4pCi17Ci0Jc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWk7Ci0KLQltZW1zZXQoJmhpbnRzLCAnXDAnLCBzaXplb2YoaGludHMpKTsKLQloaW50cy5haV9mbGFncyA9IEFJX05VTUVSSUNIT1NUOwotCi0JaWYgKHAgPT0gTlVMTCB8fCBnZXRhZGRyaW5mbyhwLCBOVUxMLCAmaGludHMsICZhaSkgIT0gMCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKGFpID09IE5VTEwgfHwgYWktPmFpX2FkZHIgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKG4gIT0gTlVMTCAmJgotCSAgICBhZGRyX3NhX3RvX3hhZGRyKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwgbikgPT0gLTEpIHsKLQkJZnJlZWFkZHJpbmZvKGFpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWZyZWVhZGRyaW5mbyhhaSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQZXJmb3JtIGJpdHdpc2UgbmVnYXRpb24gb2YgYWRkcmVzcwotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbnQKLWFkZHJfaW52ZXJ0KHN0cnVjdCB4YWRkciAqbikKLXsKLQlpbnQgaTsKLQotCWlmIChuID09IE5VTEwpCi0JCXJldHVybiAoLTEpOwotCi0Jc3dpdGNoIChuLT5hZikgewotCWNhc2UgQUZfSU5FVDoKLQkJbi0+djQuc19hZGRyID0gfm4tPnY0LnNfYWRkcjsKLQkJcmV0dXJuICgwKTsKLQljYXNlIEFGX0lORVQ2OgotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQkJbi0+YWRkcjMyW2ldID0gfm4tPmFkZHIzMltpXTsKLQkJcmV0dXJuICgwKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gKC0xKTsKLQl9Ci19Ci0KLS8qCi0gKiBDYWxjdWxhdGUgYSBuZXRtYXNrIG9mIGxlbmd0aCAnbCcgZm9yIGFkZHJlc3MgZmFtaWx5ICdhZicgYW5kCi0gKiBzdG9yZSBpdCBpbiAnbicuCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludAotYWRkcl9ob3N0bWFzayhpbnQgYWYsIHVfaW50IGwsIHN0cnVjdCB4YWRkciAqbikKLXsKLQlpZiAoYWRkcl9uZXRtYXNrKGFmLCBsLCBuKSA9PSAtMSB8fCBhZGRyX2ludmVydChuKSA9PSAtMSkKLQkJcmV0dXJuICgtMSk7Ci0JcmV0dXJuICgwKTsKLX0KLQotLyoKLSAqIFRlc3Qgd2hldGhlciBhZGRyZXNzICdhJyBpcyBhbGwgemVyb3MgKGkuZS4gMC4wLjAuMCBvciA6OikKLSAqIFJldHVybnMgMCBvbiBpZiBhZGRyZXNzIGlzIGFsbC16ZXJvcywgLTEgaWYgbm90IGFsbCB6ZXJvcyBvciBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW50Ci1hZGRyX2lzX2FsbDBzKGNvbnN0IHN0cnVjdCB4YWRkciAqYSkKLXsKLQlpbnQgaTsKLQotCXN3aXRjaCAoYS0+YWYpIHsKLQljYXNlIEFGX0lORVQ6Ci0JCXJldHVybiAoYS0+djQuc19hZGRyID09IDAgPyAwIDogLTEpOwotCWNhc2UgQUZfSU5FVDY6OwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQkJaWYgKGEtPmFkZHIzMltpXSAhPSAwKQotCQkJCXJldHVybiAoLTEpOwotCQlyZXR1cm4gKDApOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAoLTEpOwotCX0KLX0KLQotLyoKLSAqIFRlc3Qgd2hldGhlciBob3N0IHBvcnRpb24gb2YgYWRkcmVzcyAnYScsIGFzIGRldGVybWluZWQgYnkgJ21hc2tsZW4nCi0gKiBpcyBhbGwgemVyb3MuCi0gKiBSZXR1cm5zIDAgb24gaWYgaG9zdCBwb3J0aW9uIG9mIGFkZHJlc3MgaXMgYWxsLXplcm9zLAotICogLTEgaWYgbm90IGFsbCB6ZXJvcyBvciBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW50Ci1hZGRyX2hvc3RfaXNfYWxsMHMoY29uc3Qgc3RydWN0IHhhZGRyICphLCB1X2ludCBtYXNrbGVuKQotewotCXN0cnVjdCB4YWRkciB0bXBfYWRkciwgdG1wX21hc2ssIHRtcF9yZXN1bHQ7Ci0KLQltZW1jcHkoJnRtcF9hZGRyLCBhLCBzaXplb2YodG1wX2FkZHIpKTsKLQlpZiAoYWRkcl9ob3N0bWFzayhhLT5hZiwgbWFza2xlbiwgJnRtcF9tYXNrKSA9PSAtMSkKLQkJcmV0dXJuICgtMSk7Ci0JaWYgKGFkZHJfYW5kKCZ0bXBfcmVzdWx0LCAmdG1wX2FkZHIsICZ0bXBfbWFzaykgPT0gLTEpCi0JCXJldHVybiAoLTEpOwotCXJldHVybiAoYWRkcl9pc19hbGwwcygmdG1wX3Jlc3VsdCkpOwotfQotCi0vKgotICogUGFyc2UgYSBDSURSIGFkZHJlc3MgKHgueC54LngveSBvciB4eHh4Onl5eXk6Oi96KS4KLSAqIFJldHVybiAtMSBvbiBwYXJzZSBlcnJvciwgLTIgb24gaW5jb25zaXN0ZW5jeSBvciAwIG9uIHN1Y2Nlc3MuCi0gKi8KLXN0YXRpYyBpbnQKLWFkZHJfcHRvbl9jaWRyKGNvbnN0IGNoYXIgKnAsIHN0cnVjdCB4YWRkciAqbiwgdV9pbnQgKmwpCi17Ci0Jc3RydWN0IHhhZGRyIHRtcDsKLQlsb25nIHVuc2lnbmVkIGludCBtYXNrbGVuID0gOTk5OwotCWNoYXIgYWRkcmJ1Zls2NF0sICptcCwgKmNwOwotCi0JLyogRG9uJ3QgbW9kaWZ5IGFyZ3VtZW50ICovCi0JaWYgKHAgPT0gTlVMTCB8fCBzdHJsY3B5KGFkZHJidWYsIHAsIHNpemVvZihhZGRyYnVmKSkgPiBzaXplb2YoYWRkcmJ1ZikpCi0JCXJldHVybiAtMTsKLQotCWlmICgobXAgPSBzdHJjaHIoYWRkcmJ1ZiwgJy8nKSkgIT0gTlVMTCkgewotCQkqbXAgPSAnXDAnOwotCQltcCsrOwotCQltYXNrbGVuID0gc3RydG91bChtcCwgJmNwLCAxMCk7Ci0JCWlmICgqbXAgPT0gJ1wwJyB8fCAqY3AgIT0gJ1wwJyB8fCBtYXNrbGVuID4gMTI4KQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChhZGRyX3B0b24oYWRkcmJ1ZiwgJnRtcCkgPT0gLTEpCi0JCXJldHVybiAtMTsKLQotCWlmIChtcCA9PSBOVUxMKQotCQltYXNrbGVuID0gYWRkcl91bmljYXN0X21hc2tsZW4odG1wLmFmKTsKLQlpZiAobWFza2xlbl92YWxpZCh0bXAuYWYsIG1hc2tsZW4pID09IC0xKQotCQlyZXR1cm4gLTI7Ci0JaWYgKGFkZHJfaG9zdF9pc19hbGwwcygmdG1wLCBtYXNrbGVuKSAhPSAwKQotCQlyZXR1cm4gLTI7Ci0KLQlpZiAobiAhPSBOVUxMKQotCQltZW1jcHkobiwgJnRtcCwgc2l6ZW9mKCpuKSk7Ci0JaWYgKGwgIT0gTlVMTCkKLQkJKmwgPSBtYXNrbGVuOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWFkZHJfbmV0bWF0Y2goY29uc3Qgc3RydWN0IHhhZGRyICpob3N0LCBjb25zdCBzdHJ1Y3QgeGFkZHIgKm5ldCwgdV9pbnQgbWFza2xlbikKLXsKLQlzdHJ1Y3QgeGFkZHIgdG1wX21hc2ssIHRtcF9yZXN1bHQ7Ci0KLQlpZiAoaG9zdC0+YWYgIT0gbmV0LT5hZikKLQkJcmV0dXJuIC0xOwotCi0JaWYgKGFkZHJfbmV0bWFzayhob3N0LT5hZiwgbWFza2xlbiwgJnRtcF9tYXNrKSA9PSAtMSkKLQkJcmV0dXJuIC0xOwotCWlmIChhZGRyX2FuZCgmdG1wX3Jlc3VsdCwgaG9zdCwgJnRtcF9tYXNrKSA9PSAtMSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiBhZGRyX2NtcCgmdG1wX3Jlc3VsdCwgbmV0KTsKLX0KLQotLyoKLSAqIE1hdGNoICJhZGRyIiBhZ2FpbnN0IGxpc3QgcGF0dGVybiBsaXN0ICJfbGlzdCIsIHdoaWNoIG1heSBjb250YWluIGEKLSAqIG1peCBvZiBDSURSIGFkZHJlc3NlcyBhbmQgb2xkLXNjaG9vbCB3aWxkY2FyZHMuCi0gKgotICogSWYgYWRkciBpcyBOVUxMLCB0aGVuIG5vIG1hdGNoaW5nIGlzIHBlcmZvcm1lZCwgYnV0IF9saXN0IGlzIHBhcnNlZAotICogYW5kIGNoZWNrZWQgZm9yIHdlbGwtZm9ybWVkbmVzcy4KLSAqCi0gKiBSZXR1cm5zIDEgb24gbWF0Y2ggZm91bmQgKG5ldmVyIHJldHVybmVkIHdoZW4gYWRkciA9PSBOVUxMKS4KLSAqIFJldHVybnMgMCBvbiBpZiBubyBtYXRjaCBmb3VuZCwgb3Igbm8gZXJyb3JzIGZvdW5kIHdoZW4gYWRkciA9PSBOVUxMLgotICogUmV0dXJucyAtMSBvbiBuZWdhdGVkIG1hdGNoIGZvdW5kIChuZXZlciByZXR1cm5lZCB3aGVuIGFkZHIgPT0gTlVMTCkuCi0gKiBSZXR1cm5zIC0yIG9uIGludmFsaWQgbGlzdCBlbnRyeS4KLSAqLwotaW50Ci1hZGRyX21hdGNoX2xpc3QoY29uc3QgY2hhciAqYWRkciwgY29uc3QgY2hhciAqX2xpc3QpCi17Ci0JY2hhciAqbGlzdCwgKmNwLCAqbzsKLQlzdHJ1Y3QgeGFkZHIgdHJ5X2FkZHIsIG1hdGNoX2FkZHI7Ci0JdV9pbnQgbWFza2xlbiwgbmVnOwotCWludCByZXQgPSAwLCByOwotCi0JaWYgKGFkZHIgIT0gTlVMTCAmJiBhZGRyX3B0b24oYWRkciwgJnRyeV9hZGRyKSAhPSAwKSB7Ci0JCWRlYnVnMigiJXM6IGNvdWxkbid0IHBhcnNlIGFkZHJlc3MgJS4xMDBzIiwgX19mdW5jX18sIGFkZHIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKChvID0gbGlzdCA9IHN0cmR1cChfbGlzdCkpID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQl3aGlsZSAoKGNwID0gc3Ryc2VwKCZsaXN0LCAiLCIpKSAhPSBOVUxMKSB7Ci0JCW5lZyA9ICpjcCA9PSAnISc7Ci0JCWlmIChuZWcpCi0JCQljcCsrOwotCQlpZiAoKmNwID09ICdcMCcpIHsKLQkJCXJldCA9IC0yOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogUHJlZmVyIENJRFIgYWRkcmVzcyBtYXRjaGluZyAqLwotCQlyID0gYWRkcl9wdG9uX2NpZHIoY3AsICZtYXRjaF9hZGRyLCAmbWFza2xlbik7Ci0JCWlmIChyID09IC0yKSB7Ci0JCQllcnJvcigiSW5jb25zaXN0ZW50IG1hc2sgbGVuZ3RoIGZvciAiCi0JCQkgICAgIm5ldHdvcmsgXCIlLjEwMHNcIiIsIGNwKTsKLQkJCXJldCA9IC0yOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAociA9PSAwKSB7Ci0JCQlpZiAoYWRkciAhPSBOVUxMICYmIGFkZHJfbmV0bWF0Y2goJnRyeV9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hdGNoX2FkZHIsIG1hc2tsZW4pID09IDApIHsKLSBmb3VuZGl0OgotCQkJCWlmIChuZWcpIHsKLQkJCQkJcmV0ID0gLTE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZXQgPSAxOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBJZiBDSURSIHBhcnNlIGZhaWxlZCwgdHJ5IHdpbGRjYXJkIHN0cmluZyBtYXRjaCAqLwotCQkJaWYgKGFkZHIgIT0gTlVMTCAmJiBtYXRjaF9wYXR0ZXJuKGFkZHIsIGNwKSA9PSAxKQotCQkJCWdvdG8gZm91bmRpdDsKLQkJfQotCX0KLQl4ZnJlZShvKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBNYXRjaCAiYWRkciIgYWdhaW5zdCBsaXN0IENJRFIgbGlzdCAiX2xpc3QiLiBMZXhpY2FsIHdpbGRjYXJkcyBhbmQKLSAqIG5lZ2F0aW9uIGFyZSBub3Qgc3VwcG9ydGVkLiBJZiAiYWRkciIgPT0gTlVMTCwgd2lsbCB2ZXJpZnkgc3RydWN0dXJlCi0gKiBvZiAiX2xpc3QiLgotICoKLSAqIFJldHVybnMgMSBvbiBtYXRjaCBmb3VuZCAobmV2ZXIgcmV0dXJuZWQgd2hlbiBhZGRyID09IE5VTEwpLgotICogUmV0dXJucyAwIG9uIGlmIG5vIG1hdGNoIGZvdW5kLCBvciBubyBlcnJvcnMgZm91bmQgd2hlbiBhZGRyID09IE5VTEwuCi0gKiBSZXR1cm5zIC0xIG9uIGVycm9yCi0gKi8KLWludAotYWRkcl9tYXRjaF9jaWRyX2xpc3QoY29uc3QgY2hhciAqYWRkciwgY29uc3QgY2hhciAqX2xpc3QpCi17Ci0JY2hhciAqbGlzdCwgKmNwLCAqbzsKLQlzdHJ1Y3QgeGFkZHIgdHJ5X2FkZHIsIG1hdGNoX2FkZHI7Ci0JdV9pbnQgbWFza2xlbjsKLQlpbnQgcmV0ID0gMCwgcjsKLQotCWlmIChhZGRyICE9IE5VTEwgJiYgYWRkcl9wdG9uKGFkZHIsICZ0cnlfYWRkcikgIT0gMCkgewotCQlkZWJ1ZzIoIiVzOiBjb3VsZG4ndCBwYXJzZSBhZGRyZXNzICUuMTAwcyIsIF9fZnVuY19fLCBhZGRyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICgobyA9IGxpc3QgPSBzdHJkdXAoX2xpc3QpKSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0Jd2hpbGUgKChjcCA9IHN0cnNlcCgmbGlzdCwgIiwiKSkgIT0gTlVMTCkgewotCQlpZiAoKmNwID09ICdcMCcpIHsKLQkJCWVycm9yKCIlczogZW1wdHkgZW50cnkgaW4gbGlzdCBcIiUuMTAwc1wiIiwKLQkJCSAgICBfX2Z1bmNfXywgbyk7Ci0JCQlyZXQgPSAtMTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyoKLQkJICogTkIuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHByZS1hdXRoIHdpdGggdW50cnVzdGVkIGRhdGEsCi0JCSAqIHNvIGJlIGV4dHJhIHBhcmFub2lkIGFib3V0IGp1bmsgcmVhY2hpbmcgZ2V0YWRkcmlubyAodmlhCi0JCSAqIGFkZHJfcHRvbl9jaWRyKS4KLQkJICovCi0KLQkJLyogU3RvcCBqdW5rIGZyb20gcmVhY2hpbmcgZ2V0YWRkcmluZm8uICszIGlzIGZvciBtYXNrbGVuICovCi0JCWlmIChzdHJsZW4oY3ApID4gSU5FVDZfQUREUlNUUkxFTiArIDMpIHsKLQkJCWVycm9yKCIlczogbGlzdCBlbnRyeSBcIiUuMTAwc1wiIHRvbyBsb25nIiwKLQkJCSAgICBfX2Z1bmNfXywgY3ApOwotCQkJcmV0ID0gLTE7Ci0JCQlicmVhazsKLQkJfQotI2RlZmluZSBWQUxJRF9DSURSX0NIQVJTICIwMTIzNDU2Nzg5YWJjZGVmQUJDREVGLjovIgotCQlpZiAoc3Ryc3BuKGNwLCBWQUxJRF9DSURSX0NIQVJTKSAhPSBzdHJsZW4oY3ApKSB7Ci0JCQllcnJvcigiJXM6IGxpc3QgZW50cnkgXCIlLjEwMHNcIiBjb250YWlucyBpbnZhbGlkICIKLQkJCSAgICAiY2hhcmFjdGVycyIsIF9fZnVuY19fLCBjcCk7Ci0JCQlyZXQgPSAtMTsKLQkJfQotCi0JCS8qIFByZWZlciBDSURSIGFkZHJlc3MgbWF0Y2hpbmcgKi8KLQkJciA9IGFkZHJfcHRvbl9jaWRyKGNwLCAmbWF0Y2hfYWRkciwgJm1hc2tsZW4pOwotCQlpZiAociA9PSAtMSkgewotCQkJZXJyb3IoIkludmFsaWQgbmV0d29yayBlbnRyeSBcIiUuMTAwc1wiIiwgY3ApOwotCQkJcmV0ID0gLTE7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChyID09IC0yKSB7Ci0JCQllcnJvcigiSW5jb25zaXN0ZW50IG1hc2sgbGVuZ3RoIGZvciAiCi0JCQkgICAgIm5ldHdvcmsgXCIlLjEwMHNcIiIsIGNwKTsKLQkJCXJldCA9IC0xOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAociA9PSAwICYmIGFkZHIgIT0gTlVMTCkgewotCQkJaWYgKGFkZHJfbmV0bWF0Y2goJnRyeV9hZGRyLCAmbWF0Y2hfYWRkciwKLQkJCSAgICBtYXNrbGVuKSA9PSAwKQotCQkJCXJldCA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCX0KLQl4ZnJlZShvKTsKLQotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9hdG9taWNpby5jIGIvYXRvbWljaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAxYjNjMy4uMDAwMDAwMAotLS0gYS9hdG9taWNpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qICRPcGVuQlNEOiBhdG9taWNpby5jLHYgMS4yNiAyMDEwLzA5LzIyIDIyOjU4OjUxIGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBEYW1pZW4gTWlsbGVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDA1IEFuaWwgTWFkaGF2YXBlZGR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAxOTk1LDE5OTkgVGhlbyBkZSBSYWFkdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZkZWYgSEFWRV9QT0xMX0gKLSNpbmNsdWRlIDxwb2xsLmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX1NZU19QT0xMX0gKLSMgIGluY2x1ZGUgPHN5cy9wb2xsLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImF0b21pY2lvLmgiCi0KLS8qCi0gKiBlbnN1cmUgYWxsIG9mIGRhdGEgb24gc29ja2V0IGNvbWVzIHRocm91Z2guIGY9PXJlYWQgfHwgZj09dndyaXRlCi0gKi8KLXNpemVfdAotYXRvbWljaW82KHNzaXplX3QgKCpmKSAoaW50LCB2b2lkICosIHNpemVfdCksIGludCBmZCwgdm9pZCAqX3MsIHNpemVfdCBuLAotICAgIGludCAoKmNiKSh2b2lkICosIHNpemVfdCksIHZvaWQgKmNiX2FyZykKLXsKLQljaGFyICpzID0gX3M7Ci0Jc2l6ZV90IHBvcyA9IDA7Ci0Jc3NpemVfdCByZXM7Ci0Jc3RydWN0IHBvbGxmZCBwZmQ7Ci0KLQlwZmQuZmQgPSBmZDsKLQlwZmQuZXZlbnRzID0gZiA9PSByZWFkID8gUE9MTElOIDogUE9MTE9VVDsKLQl3aGlsZSAobiA+IHBvcykgewotCQlyZXMgPSAoZikgKGZkLCBzICsgcG9zLCBuIC0gcG9zKTsKLQkJc3dpdGNoIChyZXMpIHsKLQkJY2FzZSAtMToKLQkJCWlmIChlcnJubyA9PSBFSU5UUikKLQkJCQljb250aW51ZTsKLQkJCWlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spIHsKLQkJCQkodm9pZClwb2xsKCZwZmQsIDEsIC0xKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQljYXNlIDA6Ci0JCQllcnJubyA9IEVQSVBFOwotCQkJcmV0dXJuIHBvczsKLQkJZGVmYXVsdDoKLQkJCXBvcyArPSAoc2l6ZV90KXJlczsKLQkJCWlmIChjYiAhPSBOVUxMICYmIGNiKGNiX2FyZywgKHNpemVfdClyZXMpID09IC0xKSB7Ci0JCQkJZXJybm8gPSBFSU5UUjsKLQkJCQlyZXR1cm4gcG9zOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBwb3M7Ci19Ci0KLXNpemVfdAotYXRvbWljaW8oc3NpemVfdCAoKmYpIChpbnQsIHZvaWQgKiwgc2l6ZV90KSwgaW50IGZkLCB2b2lkICpfcywgc2l6ZV90IG4pCi17Ci0JcmV0dXJuIGF0b21pY2lvNihmLCBmZCwgX3MsIG4sIE5VTEwsIE5VTEwpOwotfQotCi0vKgotICogZW5zdXJlIGFsbCBvZiBkYXRhIG9uIHNvY2tldCBjb21lcyB0aHJvdWdoLiBmPT1yZWFkdiB8fCBmPT13cml0ZXYKLSAqLwotc2l6ZV90Ci1hdG9taWNpb3Y2KHNzaXplX3QgKCpmKSAoaW50LCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgaW50KSwgaW50IGZkLAotICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqX2lvdiwgaW50IGlvdmNudCwKLSAgICBpbnQgKCpjYikodm9pZCAqLCBzaXplX3QpLCB2b2lkICpjYl9hcmcpCi17Ci0Jc2l6ZV90IHBvcyA9IDAsIHJlbTsKLQlzc2l6ZV90IHJlczsKLQlzdHJ1Y3QgaW92ZWMgaW92X2FycmF5W0lPVl9NQVhdLCAqaW92ID0gaW92X2FycmF5OwotCXN0cnVjdCBwb2xsZmQgcGZkOwotCi0JaWYgKGlvdmNudCA+IElPVl9NQVgpIHsKLQkJZXJybm8gPSBFSU5WQUw7Ci0JCXJldHVybiAwOwotCX0KLQkvKiBNYWtlIGEgY29weSBvZiB0aGUgaW92IGFycmF5IGJlY2F1c2Ugd2UgbWF5IG1vZGlmeSBpdCBiZWxvdyAqLwotCW1lbWNweShpb3YsIF9pb3YsIGlvdmNudCAqIHNpemVvZigqX2lvdikpOwotCi0jaWZuZGVmIEJST0tFTl9SRUFEVl9DT01QQVJJU09OCi0JcGZkLmZkID0gZmQ7Ci0JcGZkLmV2ZW50cyA9IGYgPT0gcmVhZHYgPyBQT0xMSU4gOiBQT0xMT1VUOwotI2VuZGlmCi0JZm9yICg7IGlvdmNudCA+IDAgJiYgaW92WzBdLmlvdl9sZW4gPiAwOykgewotCQlyZXMgPSAoZikgKGZkLCBpb3YsIGlvdmNudCk7Ci0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgLTE6Ci0JCQlpZiAoZXJybm8gPT0gRUlOVFIpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSB7Ci0jaWZuZGVmIEJST0tFTl9SRUFEVl9DT01QQVJJU09OCi0JCQkJKHZvaWQpcG9sbCgmcGZkLCAxLCAtMSk7Ci0jZW5kaWYKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQljYXNlIDA6Ci0JCQllcnJubyA9IEVQSVBFOwotCQkJcmV0dXJuIHBvczsKLQkJZGVmYXVsdDoKLQkJCXJlbSA9IChzaXplX3QpcmVzOwotCQkJcG9zICs9IHJlbTsKLQkJCS8qIHNraXAgY29tcGxldGVkIGlvdiBlbnRyaWVzICovCi0JCQl3aGlsZSAoaW92Y250ID4gMCAmJiByZW0gPj0gaW92WzBdLmlvdl9sZW4pIHsKLQkJCQlyZW0gLT0gaW92WzBdLmlvdl9sZW47Ci0JCQkJaW92Kys7Ci0JCQkJaW92Y250LS07Ci0JCQl9Ci0JCQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uLi4gKi8KLQkJCWlmIChyZW0gPiAwICYmIChpb3ZjbnQgPD0gMCB8fCByZW0gPiBpb3ZbMF0uaW92X2xlbikpIHsKLQkJCQllcnJubyA9IEVGQVVMVDsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmIChpb3ZjbnQgPT0gMCkKLQkJCQlicmVhazsKLQkJCS8qIHVwZGF0ZSBwb2ludGVyIGluIHBhcnRpYWxseSBjb21wbGV0ZSBpb3YgKi8KLQkJCWlvdlswXS5pb3ZfYmFzZSA9ICgoY2hhciAqKWlvdlswXS5pb3ZfYmFzZSkgKyByZW07Ci0JCQlpb3ZbMF0uaW92X2xlbiAtPSByZW07Ci0JCX0KLQkJaWYgKGNiICE9IE5VTEwgJiYgY2IoY2JfYXJnLCAoc2l6ZV90KXJlcykgPT0gLTEpIHsKLQkJCWVycm5vID0gRUlOVFI7Ci0JCQlyZXR1cm4gcG9zOwotCQl9Ci0JfQotCXJldHVybiBwb3M7Ci19Ci0KLXNpemVfdAotYXRvbWljaW92KHNzaXplX3QgKCpmKSAoaW50LCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgaW50KSwgaW50IGZkLAotICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqX2lvdiwgaW50IGlvdmNudCkKLXsKLQlyZXR1cm4gYXRvbWljaW92NihmLCBmZCwgX2lvdiwgaW92Y250LCBOVUxMLCBOVUxMKTsKLX0KZGlmZiAtLWdpdCBhL2F0b21pY2lvLmggYi9hdG9taWNpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDcyOGFjLi4wMDAwMDAwCi0tLSBhL2F0b21pY2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiAkT3BlbkJTRDogYXRvbWljaW8uaCx2IDEuMTEgMjAxMC8wOS8yMiAyMjo1ODo1MSBkam0gRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMTk5NSwxOTk5IFRoZW8gZGUgUmFhZHQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfQVRPTUlDSU9fSAotI2RlZmluZSBfQVRPTUlDSU9fSAotCi0vKgotICogRW5zdXJlIGFsbCBvZiBkYXRhIG9uIHNvY2tldCBjb21lcyB0aHJvdWdoLiBmPT1yZWFkIHx8IGY9PXZ3cml0ZQotICovCi1zaXplX3QKLWF0b21pY2lvNihzc2l6ZV90ICgqZikgKGludCwgdm9pZCAqLCBzaXplX3QpLCBpbnQgZmQsIHZvaWQgKl9zLCBzaXplX3QgbiwKLSAgICBpbnQgKCpjYikodm9pZCAqLCBzaXplX3QpLCB2b2lkICopOwotc2l6ZV90CWF0b21pY2lvKHNzaXplX3QgKCopKGludCwgdm9pZCAqLCBzaXplX3QpLCBpbnQsIHZvaWQgKiwgc2l6ZV90KTsKLQotI2RlZmluZSB2d3JpdGUgKHNzaXplX3QgKCopKGludCwgdm9pZCAqLCBzaXplX3QpKXdyaXRlCi0KLS8qCi0gKiBlbnN1cmUgYWxsIG9mIGRhdGEgb24gc29ja2V0IGNvbWVzIHRocm91Z2guIGY9PXJlYWR2IHx8IGY9PXdyaXRldgotICovCi1zaXplX3QKLWF0b21pY2lvdjYoc3NpemVfdCAoKmYpIChpbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCBpbnQpLCBpbnQgZmQsCi0gICAgY29uc3Qgc3RydWN0IGlvdmVjICpfaW92LCBpbnQgaW92Y250LCBpbnQgKCpjYikodm9pZCAqLCBzaXplX3QpLCB2b2lkICopOwotc2l6ZV90CWF0b21pY2lvdihzc2l6ZV90ICgqKShpbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCBpbnQpLAotICAgIGludCwgY29uc3Qgc3RydWN0IGlvdmVjICosIGludCk7Ci0KLSNlbmRpZiAvKiBfQVRPTUlDSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXVkaXQtYnNtLmMgYi9hdWRpdC1ic20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5NmQ0Zi4uMDAwMDAwMAotLS0gYS9hdWRpdC1ic20uYworKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKiAkSWQ6IGF1ZGl0LWJzbS5jLHYgMS43IDIwMTEvMDEvMTcgMTA6MTU6MjkgZHR1Y2tlciBFeHAgJCAqLwotCi0vKgotICogVE9ETwotICoKLSAqIC0gZGVhbCB3aXRoIG92ZXJsYXAgYmV0d2VlbiB0aGlzIGFuZCBzeXNfYXV0aF9hbGxvd2VkX3VzZXIKLSAqICAgc3lzX2F1dGhfcmVjb3JkX2xvZ2luIGFuZCByZWNvcmRfZmFpbGVkX2xvZ2luLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMTk4OC0yMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLS8qICNwcmFnbWEgaWRlbnQJIkAoIylic21hdWRpdC5jCTEuMQkwMS8wOS8xNyBTTUkiICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2lmIGRlZmluZWQoVVNFX0JTTV9BVURJVCkKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAic3NoLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJhdXRoLmgiCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotCi0jaWZuZGVmIEFVRV9vcGVuc3NoCi0jIGRlZmluZSBBVUVfb3BlbnNzaCAgICAgMzI4MDAKLSNlbmRpZgotI2luY2x1ZGUgPGJzbS9hdWRpdC5oPgotI2luY2x1ZGUgPGJzbS9saWJic20uaD4KLSNpbmNsdWRlIDxic20vYXVkaXRfdWV2ZW50cy5oPgotI2luY2x1ZGUgPGJzbS9hdWRpdF9yZWNvcmQuaD4KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLQotI2lmIGRlZmluZWQoSEFWRV9HRVRBVURJVF9BRERSKQotI2RlZmluZQlBdWRpdEluZm9TdHJ1Y3QJCWF1ZGl0aW5mb19hZGRyCi0jZGVmaW5lIEF1ZGl0SW5mb1Rlcm1JRAkJYXVfdGlkX2FkZHJfdAotI2RlZmluZSBTZXRBdWRpdEZ1bmMoYSxiKQlzZXRhdWRpdF9hZGRyKChhKSwoYikpCi0jZGVmaW5lIFNldEF1ZGl0RnVuY1RleHQJInNldGF1ZGl0X2FkZHIiCi0jZGVmaW5lIEFVVG9TdWJqZWN0RnVuYwkJYXVfdG9fc3ViamVjdF9leAotI2RlZmluZSBBVVRvUmV0dXJuRnVuYyhhLGIpCWF1X3RvX3JldHVybjMyKChhKSwgKGludDMyX3QpKGIpKQotI2Vsc2UKLSNkZWZpbmUJQXVkaXRJbmZvU3RydWN0CQlhdWRpdGluZm8KLSNkZWZpbmUgQXVkaXRJbmZvVGVybUlECQlhdV90aWRfdAotI2RlZmluZSBTZXRBdWRpdEZ1bmMoYSxiKQlzZXRhdWRpdChhKQotI2RlZmluZSBTZXRBdWRpdEZ1bmNUZXh0CSJzZXRhdWRpdCIKLSNkZWZpbmUgQVVUb1N1YmplY3RGdW5jCQlhdV90b19zdWJqZWN0Ci0jZGVmaW5lIEFVVG9SZXR1cm5GdW5jKGEsYikJYXVfdG9fcmV0dXJuKChhKSwgKHVfaW50KShiKSkKLSNlbmRpZgotCi0jaWZuZGVmIGNhbm5vdF9hdWRpdAotZXh0ZXJuIGludAljYW5ub3RfYXVkaXQoaW50KTsKLSNlbmRpZgotZXh0ZXJuIHZvaWQJYXVnX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZAlhdWdfc2F2ZV9hdWlkKGF1X2lkX3QpOwotZXh0ZXJuIHZvaWQJYXVnX3NhdmVfdWlkKHVpZF90KTsKLWV4dGVybiB2b2lkCWF1Z19zYXZlX2V1aWQodWlkX3QpOwotZXh0ZXJuIHZvaWQJYXVnX3NhdmVfZ2lkKGdpZF90KTsKLWV4dGVybiB2b2lkCWF1Z19zYXZlX2VnaWQoZ2lkX3QpOwotZXh0ZXJuIHZvaWQJYXVnX3NhdmVfcGlkKHBpZF90KTsKLWV4dGVybiB2b2lkCWF1Z19zYXZlX2FzaWQoYXVfYXNpZF90KTsKLWV4dGVybiB2b2lkCWF1Z19zYXZlX3RpZChkZXZfdCwgdW5zaWduZWQgaW50KTsKLWV4dGVybiB2b2lkCWF1Z19zYXZlX3RpZF9leChkZXZfdCwgdV9pbnQzMl90ICosIHVfaW50MzJfdCk7Ci1leHRlcm4gaW50CWF1Z19zYXZlX21lKHZvaWQpOwotZXh0ZXJuIGludAlhdWdfc2F2ZV9uYW1hc2sodm9pZCk7Ci1leHRlcm4gdm9pZAlhdWdfc2F2ZV9ldmVudChhdV9ldmVudF90KTsKLWV4dGVybiB2b2lkCWF1Z19zYXZlX3NvcmYoaW50KTsKLWV4dGVybiB2b2lkCWF1Z19zYXZlX3RleHQoY2hhciAqKTsKLWV4dGVybiB2b2lkCWF1Z19zYXZlX3RleHQxKGNoYXIgKik7Ci1leHRlcm4gdm9pZAlhdWdfc2F2ZV90ZXh0MihjaGFyICopOwotZXh0ZXJuIHZvaWQJYXVnX3NhdmVfbmEoaW50KTsKLWV4dGVybiB2b2lkCWF1Z19zYXZlX3VzZXIoY2hhciAqKTsKLWV4dGVybiB2b2lkCWF1Z19zYXZlX3BhdGgoY2hhciAqKTsKLWV4dGVybiBpbnQJYXVnX3NhdmVfcG9saWN5KHZvaWQpOwotZXh0ZXJuIHZvaWQJYXVnX3NhdmVfYWZ1bmMoaW50ICgqKShpbnQpKTsKLWV4dGVybiBpbnQJYXVnX2F1ZGl0KHZvaWQpOwotZXh0ZXJuIGludAlhdWdfbmFfc2VsZWN0ZWQodm9pZCk7Ci1leHRlcm4gaW50CWF1Z19zZWxlY3RlZCh2b2lkKTsKLWV4dGVybiBpbnQJYXVnX2RhZW1vbl9zZXNzaW9uKHZvaWQpOwotCi0jaWZuZGVmIEhBVkVfR0VUVEVYVAotIyBkZWZpbmUgZ2V0dGV4dChhKQkoYSkKLSNlbmRpZgotCi1leHRlcm4gQXV0aGN0eHQgKnRoZV9hdXRoY3R4dDsKLXN0YXRpYyBBdWRpdEluZm9UZXJtSUQgc3NoX2JzbV90aWQ7Ci0KLS8qIEJlbG93IGlzIHRoZSBsb3ctbGV2ZWwgQlNNIGludGVyZmFjZSBjb2RlICovCi0KLS8qCi0gKiBhdWdfZ2V0X21hY2hpbmUgaXMgb25seSByZXF1aXJlZCBvbiBJUHY2IGNhcGFibGUgbWFjaGluZXMsIHdlIHVzZSBhCi0gKiBkaWZmZXJlbnQgbWVjaGFuaXNtIGluIGF1ZGl0X2Nvbm5lY3Rpb25fZnJvbSgpIGZvciBJUHY0LW9ubHkgbWFjaGluZXMuCi0gKiBnZXRhdWRpdF9hZGRyKCkgaXMgb25seSBwcmVzZW50IG9uIElQdjYgY2FwYWJsZSBtYWNoaW5lcy4KLSAqLwotI2lmIGRlZmluZWQoSEFWRV9BVUdfR0VUX01BQ0hJTkUpIHx8ICFkZWZpbmVkKEhBVkVfR0VUQVVESVRfQUREUikKLWV4dGVybiBpbnQgCWF1Z19nZXRfbWFjaGluZShjaGFyICosIHVfaW50MzJfdCAqLCB1X2ludDMyX3QgKik7Ci0jZWxzZQotc3RhdGljIGludAotYXVnX2dldF9tYWNoaW5lKGNoYXIgKmhvc3QsIHVfaW50MzJfdCAqYWRkciwgdV9pbnQzMl90ICp0eXBlKQotewotCXN0cnVjdCBhZGRyaW5mbyAqYWk7IAotCXN0cnVjdCBzb2NrYWRkcl9pbiAqaW40OwotCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmluNjsKLQlpbnQgcmV0ID0gMCwgcjsKLQotCWlmICgociA9IGdldGFkZHJpbmZvKGhvc3QsIE5VTEwsIE5VTEwsICZhaSkpICE9IDApIHsKLQkJZXJyb3IoIkJTTSBhdWRpdDogZ2V0YWRkcmluZm8gZmFpbGVkIGZvciAlLjEwMHM6ICUuMTAwcyIsIGhvc3QsCi0JCSAgICByID09IEVBSV9TWVNURU0gPyBzdHJlcnJvcihlcnJubykgOiBnYWlfc3RyZXJyb3IocikpOwotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXN3aXRjaCAoYWktPmFpX2ZhbWlseSkgewotCWNhc2UgQUZfSU5FVDoKLQkJaW40ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFpLT5haV9hZGRyOwotCQkqdHlwZSA9IEFVX0lQdjQ7Ci0JCW1lbWNweShhZGRyLCAmaW40LT5zaW5fYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0JCWJyZWFrOwotI2lmZGVmIEFVX0lQdjYKLQljYXNlIEFGX0lORVQ2OiAKLQkJaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhaS0+YWlfYWRkcjsKLQkJKnR5cGUgPSBBVV9JUHY2OwotCQltZW1jcHkoYWRkciwgJmluNi0+c2luNl9hZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7Ci0JCWJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkJZXJyb3IoIkJTTSBhdWRpdDogdW5rbm93biBhZGRyZXNzIGZhbWlseSBmb3IgJS4xMDBzOiAlZCIsCi0JCSAgICBob3N0LCBhaS0+YWlfZmFtaWx5KTsKLQkJcmV0ID0gLTE7Ci0JfQotCWZyZWVhZGRyaW5mbyhhaSk7Ci0JcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi0vKgotICogQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBldmVudCBpcyBzZWxlY3RlZCAoZW5hYmxlZCkgZm9yIGF1ZGl0aW5nLgotICogUmV0dXJucyAxIGlmIHRoZSBldmVudCBpcyBzZWxlY3RlZCwgMCBpZiBub3QgYW5kIC0xIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbnQKLXNlbGVjdGVkKGNoYXIgKnVzZXJuYW1lLCB1aWRfdCB1aWQsIGF1X2V2ZW50X3QgZXZlbnQsIGludCBzZikKLXsKLQlpbnQgcmMsIHNvcmY7Ci0JY2hhciBuYWZsYWdzWzUxMl07Ci0Jc3RydWN0IGF1X21hc2sgbWFzazsKLQotCW1hc2suYW1fc3VjY2VzcyA9IG1hc2suYW1fZmFpbHVyZSA9IDA7Ci0JaWYgKHVpZCA8IDApIHsKLQkJLyogZ2V0IGZsYWdzIGZvciBub24tYXR0cmlidXRhYmxlICh0byBhIHJlYWwgdXNlcikgZXZlbnRzICovCi0JCXJjID0gZ2V0YWNuYShuYWZsYWdzLCBzaXplb2YobmFmbGFncykpOwotCQlpZiAocmMgPT0gMCkKLQkJCSh2b2lkKSBnZXRhdWRpdGZsYWdzYmluKG5hZmxhZ3MsICZtYXNrKTsKLQl9IGVsc2UKLQkJcmMgPSBhdV91c2VyX21hc2sodXNlcm5hbWUsICZtYXNrKTsKLQotCXNvcmYgPSAoc2YgPT0gMCkgPyBBVV9QUlNfU1VDQ0VTUyA6IEFVX1BSU19GQUlMVVJFOwotCXJldHVybihhdV9wcmVzZWxlY3QoZXZlbnQsICZtYXNrLCBzb3JmLCBBVV9QUlNfUkVSRUFEKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ic21fYXVkaXRfcmVjb3JkKGludCB0eXAsIGNoYXIgKnN0cmluZywgYXVfZXZlbnRfdCBldmVudF9ubykKLXsKLQlpbnQJCWFkLCByYywgc2VsOwotCXVpZF90CQl1aWQgPSAtMTsKLQlnaWRfdAkJZ2lkID0gLTE7Ci0JcGlkX3QJCXBpZCA9IGdldHBpZCgpOwotCUF1ZGl0SW5mb1Rlcm1JRAl0aWQgPSBzc2hfYnNtX3RpZDsKLQotCWlmICh0aGVfYXV0aGN0eHQgIT0gTlVMTCAmJiB0aGVfYXV0aGN0eHQtPnZhbGlkKSB7Ci0JCXVpZCA9IHRoZV9hdXRoY3R4dC0+cHctPnB3X3VpZDsKLQkJZ2lkID0gdGhlX2F1dGhjdHh0LT5wdy0+cHdfZ2lkOwotCX0KLQotCXJjID0gKHR5cCA9PSAwKSA/IDAgOiAtMTsKLQlzZWwgPSBzZWxlY3RlZCh0aGVfYXV0aGN0eHQtPnVzZXIsIHVpZCwgZXZlbnRfbm8sIHJjKTsKLQlkZWJ1ZzMoIkJTTSBhdWRpdDogdHlwICVkIHJjICVkIFwiJXNcIiIsIHR5cCwgcmMsIHN0cmluZyk7Ci0JaWYgKCFzZWwpCi0JCXJldHVybjsJLyogYXVkaXQgZXZlbnQgZG9lcyBub3QgbWF0Y2ggbWFzaywgZG8gbm90IHdyaXRlICovCi0KLQlkZWJ1ZzMoIkJTTSBhdWRpdDogd3JpdGluZyBhdWRpdCBuZXcgcmVjb3JkIik7Ci0JYWQgPSBhdV9vcGVuKCk7Ci0KLQkodm9pZCkgYXVfd3JpdGUoYWQsIEFVVG9TdWJqZWN0RnVuYyh1aWQsIHVpZCwgZ2lkLCB1aWQsIGdpZCwKLQkgICAgcGlkLCBwaWQsICZ0aWQpKTsKLQkodm9pZCkgYXVfd3JpdGUoYWQsIGF1X3RvX3RleHQoc3RyaW5nKSk7Ci0JKHZvaWQpIGF1X3dyaXRlKGFkLCBBVVRvUmV0dXJuRnVuYyh0eXAsIHJjKSk7Ci0KLQlyYyA9IGF1X2Nsb3NlKGFkLCBBVV9UT19XUklURSwgZXZlbnRfbm8pOwotCWlmIChyYyA8IDApCi0JCWVycm9yKCJCU00gYXVkaXQ6ICVzIGZhaWxlZCB0byB3cml0ZSBcIiVzXCIgcmVjb3JkOiAlcyIsCi0JCSAgICBfX2Z1bmNfXywgc3RyaW5nLCBzdHJlcnJvcihlcnJubykpOwotfQotCi1zdGF0aWMgdm9pZAotYnNtX2F1ZGl0X3Nlc3Npb25fc2V0dXAodm9pZCkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IEF1ZGl0SW5mb1N0cnVjdCBpbmZvOwotCWF1X21hc2tfdCBtYXNrOwotCi0JaWYgKHRoZV9hdXRoY3R4dCA9PSBOVUxMKSB7Ci0JCWVycm9yKCJCU00gYXVkaXQ6IHNlc3Npb24gc2V0dXAgaW50ZXJuYWwgZXJyb3IgKE5VTEwgY3R4dCkiKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh0aGVfYXV0aGN0eHQtPnZhbGlkKQotCQlpbmZvLmFpX2F1aWQgPSB0aGVfYXV0aGN0eHQtPnB3LT5wd191aWQ7Ci0JZWxzZQotCQlpbmZvLmFpX2F1aWQgPSAtMTsKLQlpbmZvLmFpX2FzaWQgPSBnZXRwaWQoKTsKLQltYXNrLmFtX3N1Y2Nlc3MgPSAwOwotCW1hc2suYW1fZmFpbHVyZSA9IDA7Ci0KLQkodm9pZCkgYXVfdXNlcl9tYXNrKHRoZV9hdXRoY3R4dC0+dXNlciwgJm1hc2spOwotCi0JaW5mby5haV9tYXNrLmFtX3N1Y2Nlc3MgID0gbWFzay5hbV9zdWNjZXNzOwotCWluZm8uYWlfbWFzay5hbV9mYWlsdXJlICA9IG1hc2suYW1fZmFpbHVyZTsKLQotCWluZm8uYWlfdGVybWlkID0gc3NoX2JzbV90aWQ7Ci0KLQlyYyA9IFNldEF1ZGl0RnVuYygmaW5mbywgc2l6ZW9mKGluZm8pKTsKLQlpZiAocmMgPCAwKQotCQllcnJvcigiQlNNIGF1ZGl0OiAlczogJXMgZmFpbGVkOiAlcyIsIF9fZnVuY19fLAotCQkgICAgU2V0QXVkaXRGdW5jVGV4dCwgc3RyZXJyb3IoZXJybm8pKTsKLX0KLQotc3RhdGljIHZvaWQKLWJzbV9hdWRpdF9iYWRfbG9naW4oY29uc3QgY2hhciAqd2hhdCkKLXsKLQljaGFyIHRleHRidWZbQlNNX1RFWFRCVUZTWl07Ci0KLQlpZiAodGhlX2F1dGhjdHh0LT52YWxpZCkgewotCQkodm9pZCkgc25wcmludGYodGV4dGJ1Ziwgc2l6ZW9mICh0ZXh0YnVmKSwKLQkJCWdldHRleHQoImludmFsaWQgJXMgZm9yIHVzZXIgJXMiKSwKLQkJCSAgICB3aGF0LCB0aGVfYXV0aGN0eHQtPnVzZXIpOwotCQlic21fYXVkaXRfcmVjb3JkKDQsIHRleHRidWYsIEFVRV9vcGVuc3NoKTsKLQl9IGVsc2UgewotCQkodm9pZCkgc25wcmludGYodGV4dGJ1Ziwgc2l6ZW9mICh0ZXh0YnVmKSwKLQkJCWdldHRleHQoImludmFsaWQgdXNlciBuYW1lIFwiJXNcIiIpLAotCQkJICAgIHRoZV9hdXRoY3R4dC0+dXNlcik7Ci0JCWJzbV9hdWRpdF9yZWNvcmQoMywgdGV4dGJ1ZiwgQVVFX29wZW5zc2gpOwotCX0KLX0KLQotLyogQmVsb3cgaXMgdGhlIHNzaGQgYXVkaXQgQVBJIGNvZGUgKi8KLQotdm9pZAotYXVkaXRfY29ubmVjdGlvbl9mcm9tKGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KQotewotCUF1ZGl0SW5mb1Rlcm1JRCAqdGlkID0gJnNzaF9ic21fdGlkOwotCWNoYXIgYnVmWzEwMjRdOwotCi0JaWYgKGNhbm5vdF9hdWRpdCgwKSkKLQkJcmV0dXJuOwotCWRlYnVnMygiQlNNIGF1ZGl0OiBjb25uZWN0aW9uIGZyb20gJS4xMDBzIHBvcnQgJWQiLCBob3N0LCBwb3J0KTsKLQotCS8qIHBvcHVsYXRlIG91ciB0ZXJtaW5hbCBpZCBzdHJ1Y3R1cmUgKi8KLSNpZiBkZWZpbmVkKEhBVkVfR0VUQVVESVRfQUREUikKLQl0aWQtPmF0X3BvcnQgPSAoZGV2X3QpcG9ydDsKLQlhdWdfZ2V0X21hY2hpbmUoKGNoYXIgKilob3N0LCAmKHRpZC0+YXRfYWRkclswXSksICYodGlkLT5hdF90eXBlKSk7Ci0Jc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUwOHggJTA4eCAlMDh4ICUwOHgiLCB0aWQtPmF0X2FkZHJbMF0sCi0JICAgIHRpZC0+YXRfYWRkclsxXSwgdGlkLT5hdF9hZGRyWzJdLCB0aWQtPmF0X2FkZHJbM10pOwotCWRlYnVnMygiQlNNIGF1ZGl0OiBpcHR5cGUgJWQgbWFjaGluZSBJRCAlcyIsIChpbnQpdGlkLT5hdF90eXBlLCBidWYpOwotI2Vsc2UKLQkvKiB0aGlzIGlzIHVzZWQgb24gSVB2NC1vbmx5IG1hY2hpbmVzICovCi0JdGlkLT5wb3J0ID0gKGRldl90KXBvcnQ7Ci0JdGlkLT5tYWNoaW5lID0gaW5ldF9hZGRyKGhvc3QpOwotCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlMDh4IiwgdGlkLT5tYWNoaW5lKTsKLQlkZWJ1ZzMoIkJTTSBhdWRpdDogbWFjaGluZSBJRCAlcyIsIGJ1Zik7Ci0jZW5kaWYKLX0KLQotdm9pZAotYXVkaXRfcnVuX2NvbW1hbmQoY29uc3QgY2hhciAqY29tbWFuZCkKLXsKLQkvKiBub3QgaW1wbGVtZW50ZWQgKi8KLX0KLQotdm9pZAotYXVkaXRfc2Vzc2lvbl9vcGVuKHN0cnVjdCBsb2dpbmluZm8gKmxpKQotewotCS8qIG5vdCBpbXBsZW1lbnRlZCAqLwotfQotCi12b2lkCi1hdWRpdF9zZXNzaW9uX2Nsb3NlKHN0cnVjdCBsb2dpbmluZm8gKmxpKQotewotCS8qIG5vdCBpbXBsZW1lbnRlZCAqLwotfQotCi12b2lkCi1hdWRpdF9ldmVudChzc2hfYXVkaXRfZXZlbnRfdCBldmVudCkKLXsKLQljaGFyICAgIHRleHRidWZbQlNNX1RFWFRCVUZTWl07Ci0Jc3RhdGljIGludCBsb2dnZWRfaW4gPSAwOwotCWNvbnN0IGNoYXIgKnVzZXIgPSB0aGVfYXV0aGN0eHQgPyB0aGVfYXV0aGN0eHQtPnVzZXIgOiAiKHVua25vd24gdXNlcikiOwotCi0JaWYgKGNhbm5vdF9hdWRpdCgwKSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoKGV2ZW50KSB7Ci0JY2FzZSBTU0hfQVVUSF9TVUNDRVNTOgotCQlsb2dnZWRfaW4gPSAxOwotCQlic21fYXVkaXRfc2Vzc2lvbl9zZXR1cCgpOwotCQlzbnByaW50Zih0ZXh0YnVmLCBzaXplb2YodGV4dGJ1ZiksCi0JCSAgICBnZXR0ZXh0KCJzdWNjZXNzZnVsIGxvZ2luICVzIiksIHVzZXIpOwotCQlic21fYXVkaXRfcmVjb3JkKDAsIHRleHRidWYsIEFVRV9vcGVuc3NoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNTSF9DT05ORUNUSU9OX0NMT1NFOgotCQkvKgotCQkgKiBXZSBjYW4gYWxzbyBnZXQgYSBjbG9zZSBldmVudCBpZiB0aGUgdXNlciBhdHRlbXB0ZWQgYXV0aAotCQkgKiBidXQgbmV2ZXIgc3VjY2VlZGVkLgotCQkgKi8KLQkJaWYgKGxvZ2dlZF9pbikgewotCQkJc25wcmludGYodGV4dGJ1Ziwgc2l6ZW9mKHRleHRidWYpLAotCQkJICAgIGdldHRleHQoInNzaGQgbG9nb3V0ICVzIiksIHRoZV9hdXRoY3R4dC0+dXNlcik7Ci0JCQlic21fYXVkaXRfcmVjb3JkKDAsIHRleHRidWYsIEFVRV9sb2dvdXQpOwotCQl9IGVsc2UgewotCQkJZGVidWcoIiVzOiBjb25uZWN0aW9uIGNsb3NlZCB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIiwKLQkJCSAgICBfX2Z1bmNfXyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNTSF9OT0xPR0lOOgotCQlic21fYXVkaXRfcmVjb3JkKDEsCi0JCSAgICBnZXR0ZXh0KCJsb2dpbnMgZGlzYWJsZWQgYnkgL2V0Yy9ub2xvZ2luIiksIEFVRV9vcGVuc3NoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNTSF9MT0dJTl9FWENFRURfTUFYVFJJRVM6Ci0JCXNucHJpbnRmKHRleHRidWYsIHNpemVvZih0ZXh0YnVmKSwKLQkJICAgIGdldHRleHQoInRvbyBtYW55IHRyaWVzIGZvciB1c2VyICVzIiksIHRoZV9hdXRoY3R4dC0+dXNlcik7Ci0JCWJzbV9hdWRpdF9yZWNvcmQoMSwgdGV4dGJ1ZiwgQVVFX29wZW5zc2gpOwotCQlicmVhazsKLQotCWNhc2UgU1NIX0xPR0lOX1JPT1RfREVOSUVEOgotCQlic21fYXVkaXRfcmVjb3JkKDIsIGdldHRleHQoIm5vdF9jb25zb2xlIiksIEFVRV9vcGVuc3NoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNTSF9BVVRIX0ZBSUxfUEFTU1dEOgotCQlic21fYXVkaXRfYmFkX2xvZ2luKCJwYXNzd29yZCIpOwotCQlicmVhazsKLQotCWNhc2UgU1NIX0FVVEhfRkFJTF9LQkRJTlQ6Ci0JCWJzbV9hdWRpdF9iYWRfbG9naW4oImludGVyYWN0aXZlIHBhc3N3b3JkIGVudHJ5Iik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZGVidWcoIiVzOiB1bmhhbmRsZWQgZXZlbnQgJWQiLCBfX2Z1bmNfXywgZXZlbnQpOwotCX0KLX0KLSNlbmRpZiAvKiBCU00gKi8KZGlmZiAtLWdpdCBhL2F1ZGl0LWxpbnV4LmMgYi9hdWRpdC1saW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2VlMmY0Li4wMDAwMDAwCi0tLSBhL2F1ZGl0LWxpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyogJElkOiBhdWRpdC1saW51eC5jLHYgMS4xIDIwMTEvMDEvMTcgMTA6MTU6MzAgZHR1Y2tlciBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqIFJlZCBIYXQgYXV0aG9yOiBKYW4gRi4gQ2hhZGltYSA8amNoYWRpbWFAcmVkaGF0LmNvbT4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLSNpZiBkZWZpbmVkKFVTRV9MSU5VWF9BVURJVCkKLSNpbmNsdWRlIDxsaWJhdWRpdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAiYXVkaXQuaCIKLSNpbmNsdWRlICJjYW5vaG9zdC5oIgotCi1jb25zdCBjaGFyKiBhdWRpdF91c2VybmFtZSh2b2lkKTsKLQotaW50Ci1saW51eF9hdWRpdF9yZWNvcmRfZXZlbnQoaW50IHVpZCwgY29uc3QgY2hhciAqdXNlcm5hbWUsCi0gICAgY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKmlwLCBjb25zdCBjaGFyICp0dHluLCBpbnQgc3VjY2VzcykKLXsKLQlpbnQgYXVkaXRfZmQsIHJjLCBzYXZlZF9lcnJubzsKLQotCWF1ZGl0X2ZkID0gYXVkaXRfb3BlbigpOwotCWlmIChhdWRpdF9mZCA8IDApIHsKLQkJaWYgKGVycm5vID09IEVJTlZBTCB8fCBlcnJubyA9PSBFUFJPVE9OT1NVUFBPUlQgfHwKLQkJICAgIGVycm5vID09IEVBRk5PU1VQUE9SVCkKLQkJCXJldHVybiAxOyAvKiBObyBhdWRpdCBzdXBwb3J0IGluIGtlcm5lbCAqLwotCQllbHNlCi0JCQlyZXR1cm4gMDsgLyogTXVzdCBwcmV2ZW50IGxvZ2luICovCi0JfQotCXJjID0gYXVkaXRfbG9nX2FjY3RfbWVzc2FnZShhdWRpdF9mZCwgQVVESVRfVVNFUl9MT0dJTiwKLQkgICAgTlVMTCwgImxvZ2luIiwgdXNlcm5hbWUgPyB1c2VybmFtZSA6ICIodW5rbm93bikiLAotCSAgICB1c2VybmFtZSA9PSBOVUxMID8gdWlkIDogLTEsIGhvc3RuYW1lLCBpcCwgdHR5biwgc3VjY2Vzcyk7Ci0Jc2F2ZWRfZXJybm8gPSBlcnJubzsKLQljbG9zZShhdWRpdF9mZCk7Ci0JLyoKLQkgKiBEbyBub3QgcmVwb3J0IGVycm9yIGlmIHRoZSBlcnJvciBpcyBFUEVSTSBhbmQgc3NoZCBpcyBydW4gYXMgbm9uCi0JICogcm9vdCB1c2VyLgotCSAqLwotCWlmICgocmMgPT0gLUVQRVJNKSAmJiAoZ2V0ZXVpZCgpICE9IDApKQotCQlyYyA9IDA7Ci0JZXJybm8gPSBzYXZlZF9lcnJubzsKLQlyZXR1cm4gKHJjID49IDApOwotfQotCi0vKiBCZWxvdyBpcyB0aGUgc3NoZCBhdWRpdCBBUEkgY29kZSAqLwotCi12b2lkCi1hdWRpdF9jb25uZWN0aW9uX2Zyb20oY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpCi17Ci19Ci0JLyogbm90IGltcGxlbWVudGVkICovCi0KLXZvaWQKLWF1ZGl0X3J1bl9jb21tYW5kKGNvbnN0IGNoYXIgKmNvbW1hbmQpCi17Ci0JLyogbm90IGltcGxlbWVudGVkICovCi19Ci0KLXZvaWQKLWF1ZGl0X3Nlc3Npb25fb3BlbihzdHJ1Y3QgbG9naW5pbmZvICpsaSkKLXsKLQlpZiAobGludXhfYXVkaXRfcmVjb3JkX2V2ZW50KGxpLT51aWQsIE5VTEwsIGxpLT5ob3N0bmFtZSwKLQkgICAgTlVMTCwgbGktPmxpbmUsIDEpID09IDApCi0JCWZhdGFsKCJsaW51eF9hdWRpdF93cml0ZV9lbnRyeSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLX0KLQotdm9pZAotYXVkaXRfc2Vzc2lvbl9jbG9zZShzdHJ1Y3QgbG9naW5pbmZvICpsaSkKLXsKLQkvKiBub3QgaW1wbGVtZW50ZWQgKi8KLX0KLQotdm9pZAotYXVkaXRfZXZlbnQoc3NoX2F1ZGl0X2V2ZW50X3QgZXZlbnQpCi17Ci0Jc3dpdGNoKGV2ZW50KSB7Ci0JY2FzZSBTU0hfQVVUSF9TVUNDRVNTOgotCWNhc2UgU1NIX0NPTk5FQ1RJT05fQ0xPU0U6Ci0JY2FzZSBTU0hfTk9MT0dJTjoKLQljYXNlIFNTSF9MT0dJTl9FWENFRURfTUFYVFJJRVM6Ci0JY2FzZSBTU0hfTE9HSU5fUk9PVF9ERU5JRUQ6Ci0JCWJyZWFrOwotCi0JY2FzZSBTU0hfQVVUSF9GQUlMX05PTkU6Ci0JY2FzZSBTU0hfQVVUSF9GQUlMX1BBU1NXRDoKLQljYXNlIFNTSF9BVVRIX0ZBSUxfS0JESU5UOgotCWNhc2UgU1NIX0FVVEhfRkFJTF9QVUJLRVk6Ci0JY2FzZSBTU0hfQVVUSF9GQUlMX0hPU1RCQVNFRDoKLQljYXNlIFNTSF9BVVRIX0ZBSUxfR1NTQVBJOgotCWNhc2UgU1NIX0lOVkFMSURfVVNFUjoKLQkJbGludXhfYXVkaXRfcmVjb3JkX2V2ZW50KC0xLCBhdWRpdF91c2VybmFtZSgpLCBOVUxMLAotCQkJZ2V0X3JlbW90ZV9pcGFkZHIoKSwgInNzaGQiLCAwKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlkZWJ1ZygiJXM6IHVuaGFuZGxlZCBldmVudCAlZCIsIF9fZnVuY19fLCBldmVudCk7Ci0JfQotfQotCi0jZW5kaWYgLyogVVNFX0xJTlVYX0FVRElUICovCmRpZmYgLS1naXQgYS9hdWRpdC5jIGIvYXVkaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkNTdmYS4uMDAwMDAwMAotLS0gYS9hdWRpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qICRJZDogYXVkaXQuYyx2IDEuNiAyMDExLzAxLzE3IDEwOjE1OjMwIGR0dWNrZXIgRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBEYXJyZW4gVHVja2VyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKLQotI2luY2x1ZGUgImF1ZGl0LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJhdXRoLmgiCi0KLS8qCi0gKiBDYXJlIG11c3QgYmUgdGFrZW4gd2hlbiB1c2luZyB0aGlzIHNpbmNlIGl0IFdJTEwgTk9UIGJlIGluaXRpYWxpemVkIHdoZW4KLSAqIGF1ZGl0X2Nvbm5lY3Rpb25fZnJvbSgpIGlzIGNhbGxlZCBhbmQgTUFZIE5PVCBiZSBpbml0aWFsaXplZCB3aGVuCi0gKiBhdWRpdF9ldmVudChDT05ORUNUSU9OX0FCQU5ET04pIGlzIGNhbGxlZC4gIFRlc3QgZm9yIE5VTEwgYmVmb3JlIHVzaW5nLgotICovCi1leHRlcm4gQXV0aGN0eHQgKnRoZV9hdXRoY3R4dDsKLQotLyogTWF5YmUgYWRkIHRoZSBhdWRpdCBjbGFzcyB0byBzdHJ1Y3QgQXV0aG1ldGhvZD8gKi8KLXNzaF9hdWRpdF9ldmVudF90Ci1hdWRpdF9jbGFzc2lmeV9hdXRoKGNvbnN0IGNoYXIgKm1ldGhvZCkKLXsKLQlpZiAoc3RyY21wKG1ldGhvZCwgIm5vbmUiKSA9PSAwKQotCQlyZXR1cm4gU1NIX0FVVEhfRkFJTF9OT05FOwotCWVsc2UgaWYgKHN0cmNtcChtZXRob2QsICJwYXNzd29yZCIpID09IDApCi0JCXJldHVybiBTU0hfQVVUSF9GQUlMX1BBU1NXRDsKLQllbHNlIGlmIChzdHJjbXAobWV0aG9kLCAicHVibGlja2V5IikgPT0gMCB8fAotCSAgICBzdHJjbXAobWV0aG9kLCAicnNhIikgPT0gMCkKLQkJcmV0dXJuIFNTSF9BVVRIX0ZBSUxfUFVCS0VZOwotCWVsc2UgaWYgKHN0cm5jbXAobWV0aG9kLCAia2V5Ym9hcmQtaW50ZXJhY3RpdmUiLCAyMCkgPT0gMCB8fAotCSAgICBzdHJjbXAobWV0aG9kLCAiY2hhbGxlbmdlLXJlc3BvbnNlIikgPT0gMCkKLQkJcmV0dXJuIFNTSF9BVVRIX0ZBSUxfS0JESU5UOwotCWVsc2UgaWYgKHN0cmNtcChtZXRob2QsICJob3N0YmFzZWQiKSA9PSAwIHx8Ci0JICAgIHN0cmNtcChtZXRob2QsICJyaG9zdHMtcnNhIikgPT0gMCkKLQkJcmV0dXJuIFNTSF9BVVRIX0ZBSUxfSE9TVEJBU0VEOwotCWVsc2UgaWYgKHN0cmNtcChtZXRob2QsICJnc3NhcGktd2l0aC1taWMiKSA9PSAwKQotCQlyZXR1cm4gU1NIX0FVVEhfRkFJTF9HU1NBUEk7Ci0JZWxzZQotCQlyZXR1cm4gU1NIX0FVRElUX1VOS05PV047Ci19Ci0KLS8qIGhlbHBlciB0byByZXR1cm4gc3VwcGxpZWQgdXNlcm5hbWUgKi8KLWNvbnN0IGNoYXIgKgotYXVkaXRfdXNlcm5hbWUodm9pZCkKLXsKLQlzdGF0aWMgY29uc3QgY2hhciB1bmtub3dudXNlcltdID0gIih1bmtub3duIHVzZXIpIjsKLQlzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkdXNlcltdID0gIihpbnZhbGlkIHVzZXIpIjsKLQotCWlmICh0aGVfYXV0aGN0eHQgPT0gTlVMTCB8fCB0aGVfYXV0aGN0eHQtPnVzZXIgPT0gTlVMTCkKLQkJcmV0dXJuICh1bmtub3dudXNlcik7Ci0JaWYgKCF0aGVfYXV0aGN0eHQtPnZhbGlkKQotCQlyZXR1cm4gKGludmFsaWR1c2VyKTsKLQlyZXR1cm4gKHRoZV9hdXRoY3R4dC0+dXNlcik7Ci19Ci0KLWNvbnN0IGNoYXIgKgotYXVkaXRfZXZlbnRfbG9va3VwKHNzaF9hdWRpdF9ldmVudF90IGV2KQotewotCWludCBpOwotCXN0YXRpYyBzdHJ1Y3QgZXZlbnRfbG9va3VwX3N0cnVjdCB7Ci0JCXNzaF9hdWRpdF9ldmVudF90IGV2ZW50OwotCQljb25zdCBjaGFyICpuYW1lOwotCX0gZXZlbnRfbG9va3VwW10gPSB7Ci0JCXtTU0hfTE9HSU5fRVhDRUVEX01BWFRSSUVTLAkiTE9HSU5fRVhDRUVEX01BWFRSSUVTIn0sCi0JCXtTU0hfTE9HSU5fUk9PVF9ERU5JRUQsCQkiTE9HSU5fUk9PVF9ERU5JRUQifSwKLQkJe1NTSF9BVVRIX1NVQ0NFU1MsCQkiQVVUSF9TVUNDRVNTIn0sCi0JCXtTU0hfQVVUSF9GQUlMX05PTkUsCQkiQVVUSF9GQUlMX05PTkUifSwKLQkJe1NTSF9BVVRIX0ZBSUxfUEFTU1dELAkJIkFVVEhfRkFJTF9QQVNTV0QifSwKLQkJe1NTSF9BVVRIX0ZBSUxfS0JESU5ULAkJIkFVVEhfRkFJTF9LQkRJTlQifSwKLQkJe1NTSF9BVVRIX0ZBSUxfUFVCS0VZLAkJIkFVVEhfRkFJTF9QVUJLRVkifSwKLQkJe1NTSF9BVVRIX0ZBSUxfSE9TVEJBU0VELAkiQVVUSF9GQUlMX0hPU1RCQVNFRCJ9LAotCQl7U1NIX0FVVEhfRkFJTF9HU1NBUEksCQkiQVVUSF9GQUlMX0dTU0FQSSJ9LAotCQl7U1NIX0lOVkFMSURfVVNFUiwJCSJJTlZBTElEX1VTRVIifSwKLQkJe1NTSF9OT0xPR0lOLAkJCSJOT0xPR0lOIn0sCi0JCXtTU0hfQ09OTkVDVElPTl9DTE9TRSwJCSJDT05ORUNUSU9OX0NMT1NFIn0sCi0JCXtTU0hfQ09OTkVDVElPTl9BQkFORE9OLAkiQ09OTkVDVElPTl9BQkFORE9OIn0sCi0JCXtTU0hfQVVESVRfVU5LTk9XTiwJCSJBVURJVF9VTktOT1dOIn0KLQl9OwotCi0JZm9yIChpID0gMDsgZXZlbnRfbG9va3VwW2ldLmV2ZW50ICE9IFNTSF9BVURJVF9VTktOT1dOOyBpKyspCi0JCWlmIChldmVudF9sb29rdXBbaV0uZXZlbnQgPT0gZXYpCi0JCQlicmVhazsKLQlyZXR1cm4oZXZlbnRfbG9va3VwW2ldLm5hbWUpOwotfQotCi0jIGlmbmRlZiBDVVNUT01fU1NIX0FVRElUX0VWRU5UUwotLyoKLSAqIE51bGwgaW1wbGVtZW50YXRpb25zIG9mIGF1ZGl0IGZ1bmN0aW9ucy4KLSAqIFRoZXNlIGdldCB1c2VkIGlmIFNTSF9BVURJVF9FVkVOVFMgaXMgZGVmaW5lZCBidXQgbm8gYXVkaXQgbW9kdWxlIGlzIGVuYWJsZWQuCi0gKi8KLQotLyoKLSAqIENhbGxlZCBhZnRlciBhIGNvbm5lY3Rpb24gaGFzIGJlZW4gYWNjZXB0ZWQgYnV0IGJlZm9yZSBhbnkgYXV0aGVudGljYXRpb24KLSAqIGhhcyBiZWVuIGF0dGVtcHRlZC4KLSAqLwotdm9pZAotYXVkaXRfY29ubmVjdGlvbl9mcm9tKGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KQotewotCWRlYnVnKCJhdWRpdCBjb25uZWN0aW9uIGZyb20gJXMgcG9ydCAlZCBldWlkICVkIiwgaG9zdCwgcG9ydCwKLQkgICAgKGludClnZXRldWlkKCkpOwotfQotCi0vKgotICogQ2FsbGVkIHdoZW4gdmFyaW91cyBldmVudHMgb2NjdXIgKHNlZSBhdWRpdC5oIGZvciBhIGxpc3Qgb2YgcG9zc2libGUKLSAqIGV2ZW50cyBhbmQgd2hhdCB0aGV5IG1lYW4pLgotICovCi12b2lkCi1hdWRpdF9ldmVudChzc2hfYXVkaXRfZXZlbnRfdCBldmVudCkKLXsKLQlkZWJ1ZygiYXVkaXQgZXZlbnQgZXVpZCAlZCB1c2VyICVzIGV2ZW50ICVkICglcykiLCBnZXRldWlkKCksCi0JICAgIGF1ZGl0X3VzZXJuYW1lKCksIGV2ZW50LCBhdWRpdF9ldmVudF9sb29rdXAoZXZlbnQpKTsKLX0KLQotLyoKLSAqIENhbGxlZCB3aGVuIGEgdXNlciBzZXNzaW9uIGlzIHN0YXJ0ZWQuICBBcmd1bWVudCBpcyB0aGUgdHR5IGFsbG9jYXRlZCB0bwotICogdGhlIHNlc3Npb24sIG9yIE5VTEwgaWYgbm8gdHR5IHdhcyBhbGxvY2F0ZWQuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpZiBtdWx0aXBsZSBzZXNzaW9ucyBhcmUgdXNlZAotICogd2l0aGluIGEgc2luZ2xlIGNvbm5lY3Rpb24uCi0gKi8KLXZvaWQKLWF1ZGl0X3Nlc3Npb25fb3BlbihzdHJ1Y3QgbG9naW5pbmZvICpsaSkKLXsKLQljb25zdCBjaGFyICp0ID0gbGktPmxpbmUgPyBsaS0+bGluZSA6ICIobm8gdHR5KSI7Ci0KLQlkZWJ1ZygiYXVkaXQgc2Vzc2lvbiBvcGVuIGV1aWQgJWQgdXNlciAlcyB0dHkgbmFtZSAlcyIsIGdldGV1aWQoKSwKLQkgICAgYXVkaXRfdXNlcm5hbWUoKSwgdCk7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgd2hlbiBhIHVzZXIgc2Vzc2lvbiBpcyBjbG9zZWQuICBBcmd1bWVudCBpcyB0aGUgdHR5IGFsbG9jYXRlZCB0bwotICogdGhlIHNlc3Npb24sIG9yIE5VTEwgaWYgbm8gdHR5IHdhcyBhbGxvY2F0ZWQuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpZiBtdWx0aXBsZSBzZXNzaW9ucyBhcmUgdXNlZAotICogd2l0aGluIGEgc2luZ2xlIGNvbm5lY3Rpb24uCi0gKi8KLXZvaWQKLWF1ZGl0X3Nlc3Npb25fY2xvc2Uoc3RydWN0IGxvZ2luaW5mbyAqbGkpCi17Ci0JY29uc3QgY2hhciAqdCA9IGxpLT5saW5lID8gbGktPmxpbmUgOiAiKG5vIHR0eSkiOwotCi0JZGVidWcoImF1ZGl0IHNlc3Npb24gY2xvc2UgZXVpZCAlZCB1c2VyICVzIHR0eSBuYW1lICVzIiwgZ2V0ZXVpZCgpLAotCSAgICBhdWRpdF91c2VybmFtZSgpLCB0KTsKLX0KLQotLyoKLSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHVzZXIgcnVucyBhIG5vbi1pbnRlcmFjdGl2ZSBjb21tYW5kLiAgTm90ZSB0aGF0Ci0gKiBpdCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uIHNpbmNlIFNTSDIgYWxsb3dzCi0gKiBtdWx0aXBsZSBzZXNzaW9ucyB3aXRoaW4gYSBzaW5nbGUgY29ubmVjdGlvbi4KLSAqLwotdm9pZAotYXVkaXRfcnVuX2NvbW1hbmQoY29uc3QgY2hhciAqY29tbWFuZCkKLXsKLQlkZWJ1ZygiYXVkaXQgcnVuIGNvbW1hbmQgZXVpZCAlZCB1c2VyICVzIGNvbW1hbmQgJyUuMjAwcyciLCBnZXRldWlkKCksCi0JICAgIGF1ZGl0X3VzZXJuYW1lKCksIGNvbW1hbmQpOwotfQotIyBlbmRpZiAgLyogIWRlZmluZWQgQ1VTVE9NX1NTSF9BVURJVF9FVkVOVFMgKi8KLSNlbmRpZiAvKiBTU0hfQVVESVRfRVZFTlRTICovCmRpZmYgLS1naXQgYS9hdWRpdC5oIGIvYXVkaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlZGU1Yi4uMDAwMDAwMAotLS0gYS9hdWRpdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogJElkOiBhdWRpdC5oLHYgMS40IDIwMTEvMDEvMTcgMTA6MTU6MzAgZHR1Y2tlciBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IERhcnJlbiBUdWNrZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9TU0hfQVVESVRfSAotIyBkZWZpbmUgX1NTSF9BVURJVF9ICi0KLSNpbmNsdWRlICJsb2dpbnJlYy5oIgotCi1lbnVtIHNzaF9hdWRpdF9ldmVudF90eXBlIHsKLQlTU0hfTE9HSU5fRVhDRUVEX01BWFRSSUVTLAotCVNTSF9MT0dJTl9ST09UX0RFTklFRCwKLQlTU0hfQVVUSF9TVUNDRVNTLAotCVNTSF9BVVRIX0ZBSUxfTk9ORSwKLQlTU0hfQVVUSF9GQUlMX1BBU1NXRCwKLQlTU0hfQVVUSF9GQUlMX0tCRElOVCwJLyoga2V5Ym9hcmQtaW50ZXJhY3RpdmUgb3IgY2hhbGxlbmdlLXJlc3BvbnNlICovCi0JU1NIX0FVVEhfRkFJTF9QVUJLRVksCS8qIHNzaDIgcHVia2V5IG9yIHNzaDEgcnNhICovCi0JU1NIX0FVVEhfRkFJTF9IT1NUQkFTRUQsCS8qIHNzaDIgaG9zdGJhc2VkIG9yIHNzaDEgcmhvc3RzcnNhICovCi0JU1NIX0FVVEhfRkFJTF9HU1NBUEksCi0JU1NIX0lOVkFMSURfVVNFUiwKLQlTU0hfTk9MT0dJTiwJCS8qIGRlbmllZCBieSAvZXRjL25vbG9naW4sIG5vdCBpbXBsZW1lbnRlZCAqLwotCVNTSF9DT05ORUNUSU9OX0NMT1NFLAkvKiBjbG9zZWQgYWZ0ZXIgYXR0ZW1wdGluZyBhdXRoIG9yIHNlc3Npb24gKi8KLQlTU0hfQ09OTkVDVElPTl9BQkFORE9OLAkvKiBjbG9zZWQgd2l0aG91dCBjb21wbGV0aW5nIGF1dGggKi8KLQlTU0hfQVVESVRfVU5LTk9XTgotfTsKLXR5cGVkZWYgZW51bSBzc2hfYXVkaXRfZXZlbnRfdHlwZSBzc2hfYXVkaXRfZXZlbnRfdDsKLQotdm9pZAlhdWRpdF9jb25uZWN0aW9uX2Zyb20oY29uc3QgY2hhciAqLCBpbnQpOwotdm9pZAlhdWRpdF9ldmVudChzc2hfYXVkaXRfZXZlbnRfdCk7Ci12b2lkCWF1ZGl0X3Nlc3Npb25fb3BlbihzdHJ1Y3QgbG9naW5pbmZvICopOwotdm9pZAlhdWRpdF9zZXNzaW9uX2Nsb3NlKHN0cnVjdCBsb2dpbmluZm8gKik7Ci12b2lkCWF1ZGl0X3J1bl9jb21tYW5kKGNvbnN0IGNoYXIgKik7Ci1zc2hfYXVkaXRfZXZlbnRfdCBhdWRpdF9jbGFzc2lmeV9hdXRoKGNvbnN0IGNoYXIgKik7Ci0KLSNlbmRpZiAvKiBfU1NIX0FVRElUX0ggKi8KZGlmZiAtLWdpdCBhL2F1dGgtYnNkYXV0aC5jIGIvYXV0aC1ic2RhdXRoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMzI2MmIuLjAwMDAwMDAKLS0tIGEvYXV0aC1ic2RhdXRoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyogJE9wZW5CU0Q6IGF1dGgtYnNkYXV0aC5jLHYgMS4xMSAyMDA3LzA5LzIxIDA4OjE1OjI5IGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaWZkZWYgQlNEX0FVVEgKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJhdXRoLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaWZkZWYgR1NTQVBJCi0jaW5jbHVkZSAic3NoLWdzcy5oIgotI2VuZGlmCi0jaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCi0KLXN0YXRpYyB2b2lkICoKLWJzZGF1dGhfaW5pdF9jdHgoQXV0aGN0eHQgKmF1dGhjdHh0KQotewotCXJldHVybiBhdXRoY3R4dDsKLX0KLQotaW50Ci1ic2RhdXRoX3F1ZXJ5KHZvaWQgKmN0eCwgY2hhciAqKm5hbWUsIGNoYXIgKippbmZvdHh0LAotICAgdV9pbnQgKm51bXByb21wdHMsIGNoYXIgKioqcHJvbXB0cywgdV9pbnQgKiplY2hvX29uKQotewotCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eDsKLQljaGFyICpjaGFsbGVuZ2UgPSBOVUxMOwotCi0JaWYgKGF1dGhjdHh0LT5hcyAhPSBOVUxMKSB7Ci0JCWRlYnVnMigiYnNkYXV0aF9xdWVyeTogdHJ5IHJldXNlIHNlc3Npb24iKTsKLQkJY2hhbGxlbmdlID0gYXV0aF9nZXRpdGVtKGF1dGhjdHh0LT5hcywgQVVUSFZfQ0hBTExFTkdFKTsKLQkJaWYgKGNoYWxsZW5nZSA9PSBOVUxMKSB7Ci0JCQlhdXRoX2Nsb3NlKGF1dGhjdHh0LT5hcyk7Ci0JCQlhdXRoY3R4dC0+YXMgPSBOVUxMOwotCQl9Ci0JfQotCi0JaWYgKGNoYWxsZW5nZSA9PSBOVUxMKSB7Ci0JCWRlYnVnMigiYnNkYXV0aF9xdWVyeTogbmV3IGJzZCBhdXRoIHNlc3Npb24iKTsKLQkJZGVidWczKCJic2RhdXRoX3F1ZXJ5OiBzdHlsZSAlcyIsCi0JCSAgICBhdXRoY3R4dC0+c3R5bGUgPyBhdXRoY3R4dC0+c3R5bGUgOiAiPGRlZmF1bHQ+Iik7Ci0JCWF1dGhjdHh0LT5hcyA9IGF1dGhfdXNlcmNoYWxsZW5nZShhdXRoY3R4dC0+dXNlciwKLQkJICAgIGF1dGhjdHh0LT5zdHlsZSwgImF1dGgtc3NoIiwgJmNoYWxsZW5nZSk7Ci0JCWlmIChhdXRoY3R4dC0+YXMgPT0gTlVMTCkKLQkJCWNoYWxsZW5nZSA9IE5VTEw7Ci0JCWRlYnVnMigiYnNkYXV0aF9xdWVyeTogPCVzPiIsIGNoYWxsZW5nZSA/IGNoYWxsZW5nZSA6ICJlbXB0eSIpOwotCX0KLQotCWlmIChjaGFsbGVuZ2UgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JKm5hbWUgPSB4c3RyZHVwKCIiKTsKLQkqaW5mb3R4dCA9IHhzdHJkdXAoIiIpOwotCSpudW1wcm9tcHRzID0gMTsKLQkqcHJvbXB0cyA9IHhjYWxsb2MoKm51bXByb21wdHMsIHNpemVvZihjaGFyICopKTsKLQkqZWNob19vbiA9IHhjYWxsb2MoKm51bXByb21wdHMsIHNpemVvZih1X2ludCkpOwotCSgqcHJvbXB0cylbMF0gPSB4c3RyZHVwKGNoYWxsZW5nZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1ic2RhdXRoX3Jlc3BvbmQodm9pZCAqY3R4LCB1X2ludCBudW1yZXNwb25zZXMsIGNoYXIgKipyZXNwb25zZXMpCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4OwotCWludCBhdXRob2s7Ci0KLQlpZiAoIWF1dGhjdHh0LT52YWxpZCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKGF1dGhjdHh0LT5hcyA9PSAwKQotCQllcnJvcigiYnNkYXV0aF9yZXNwb25kOiBubyBic2QgYXV0aCBzZXNzaW9uIik7Ci0KLQlpZiAobnVtcmVzcG9uc2VzICE9IDEpCi0JCXJldHVybiAtMTsKLQotCWF1dGhvayA9IGF1dGhfdXNlcnJlc3BvbnNlKGF1dGhjdHh0LT5hcywgcmVzcG9uc2VzWzBdLCAwKTsKLQlhdXRoY3R4dC0+YXMgPSBOVUxMOwotCWRlYnVnMygiYnNkYXV0aF9yZXNwb25kOiA8JXM+ID0gPCVkPiIsIHJlc3BvbnNlc1swXSwgYXV0aG9rKTsKLQotCXJldHVybiAoYXV0aG9rID09IDApID8gLTEgOiAwOwotfQotCi1zdGF0aWMgdm9pZAotYnNkYXV0aF9mcmVlX2N0eCh2b2lkICpjdHgpCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4OwotCi0JaWYgKGF1dGhjdHh0ICYmIGF1dGhjdHh0LT5hcykgewotCQlhdXRoX2Nsb3NlKGF1dGhjdHh0LT5hcyk7Ci0JCWF1dGhjdHh0LT5hcyA9IE5VTEw7Ci0JfQotfQotCi1LYmRpbnREZXZpY2UgYnNkYXV0aF9kZXZpY2UgPSB7Ci0JImJzZGF1dGgiLAotCWJzZGF1dGhfaW5pdF9jdHgsCi0JYnNkYXV0aF9xdWVyeSwKLQlic2RhdXRoX3Jlc3BvbmQsCi0JYnNkYXV0aF9mcmVlX2N0eAotfTsKLQotS2JkaW50RGV2aWNlIG1tX2JzZGF1dGhfZGV2aWNlID0gewotCSJic2RhdXRoIiwKLQlic2RhdXRoX2luaXRfY3R4LAotCW1tX2JzZGF1dGhfcXVlcnksCi0JbW1fYnNkYXV0aF9yZXNwb25kLAotCWJzZGF1dGhfZnJlZV9jdHgKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2F1dGgtY2hhbGwuYyBiL2F1dGgtY2hhbGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE5YjFlYS4uMDAwMDAwMAotLS0gYS9hdXRoLWNoYWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGF1dGgtY2hhbGwuYyx2IDEuMTIgMjAwNi8wOC8wMyAwMzozNDo0MSBkZXJhYWR0IEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJhdXRoLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAic2VydmNvbmYuaCIKLQotLyogbGltaXRlZCBwcm90b2NvbCB2MSBpbnRlcmZhY2UgdG8ga2JkLWludGVyYWN0aXZlIGF1dGhlbnRpY2F0aW9uICovCi0KLWV4dGVybiBLYmRpbnREZXZpY2UgKmRldmljZXNbXTsKLXN0YXRpYyBLYmRpbnREZXZpY2UgKmRldmljZTsKLWV4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7Ci0KLWNoYXIgKgotZ2V0X2NoYWxsZW5nZShBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0JY2hhciAqY2hhbGxlbmdlLCAqbmFtZSwgKmluZm8sICoqcHJvbXB0czsKLQl1X2ludCBpLCBudW1wcm9tcHRzOwotCXVfaW50ICplY2hvX29uOwotCi0jaWZkZWYgVVNFX1BBTQotCWlmICghb3B0aW9ucy51c2VfcGFtKQotCQlyZW1vdmVfa2JkaW50X2RldmljZSgicGFtIik7Ci0jZW5kaWYKLQotCWRldmljZSA9IGRldmljZXNbMF07IC8qIHdlIGFsd2F5cyB1c2UgdGhlIDFzdCBkZXZpY2UgZm9yIHByb3RvY29sIDEgKi8KLQlpZiAoZGV2aWNlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXV0aGN0eHQtPmtiZGludGN0eHQgPSBkZXZpY2UtPmluaXRfY3R4KGF1dGhjdHh0KSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGRldmljZS0+cXVlcnkoYXV0aGN0eHQtPmtiZGludGN0eHQsICZuYW1lLCAmaW5mbywKLQkgICAgJm51bXByb21wdHMsICZwcm9tcHRzLCAmZWNob19vbikpIHsKLQkJZGV2aWNlLT5mcmVlX2N0eChhdXRoY3R4dC0+a2JkaW50Y3R4dCk7Ci0JCWF1dGhjdHh0LT5rYmRpbnRjdHh0ID0gTlVMTDsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChudW1wcm9tcHRzIDwgMSkKLQkJZmF0YWwoImdldF9jaGFsbGVuZ2U6IG51bXByb21wdHMgPCAxIik7Ci0JY2hhbGxlbmdlID0geHN0cmR1cChwcm9tcHRzWzBdKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtcHJvbXB0czsgaSsrKQotCQl4ZnJlZShwcm9tcHRzW2ldKTsKLQl4ZnJlZShwcm9tcHRzKTsKLQl4ZnJlZShuYW1lKTsKLQl4ZnJlZShlY2hvX29uKTsKLQl4ZnJlZShpbmZvKTsKLQotCXJldHVybiAoY2hhbGxlbmdlKTsKLX0KLWludAotdmVyaWZ5X3Jlc3BvbnNlKEF1dGhjdHh0ICphdXRoY3R4dCwgY29uc3QgY2hhciAqcmVzcG9uc2UpCi17Ci0JY2hhciAqcmVzcFsxXSwgKm5hbWUsICppbmZvLCAqKnByb21wdHM7Ci0JdV9pbnQgaSwgbnVtcHJvbXB0cywgKmVjaG9fb247Ci0JaW50IGF1dGhlbnRpY2F0ZWQgPSAwOwotCi0JaWYgKGRldmljZSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlpZiAoYXV0aGN0eHQtPmtiZGludGN0eHQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmVzcFswXSA9IChjaGFyICopcmVzcG9uc2U7Ci0Jc3dpdGNoIChkZXZpY2UtPnJlc3BvbmQoYXV0aGN0eHQtPmtiZGludGN0eHQsIDEsIHJlc3ApKSB7Ci0JY2FzZSAwOiAvKiBTdWNjZXNzICovCi0JCWF1dGhlbnRpY2F0ZWQgPSAxOwotCQlicmVhazsKLQljYXNlIDE6IC8qIFBvc3Rwb25lZCAtIHJldHJ5IHdpdGggZW1wdHkgcXVlcnkgZm9yIFBBTSAqLwotCQlpZiAoKGRldmljZS0+cXVlcnkoYXV0aGN0eHQtPmtiZGludGN0eHQsICZuYW1lLCAmaW5mbywKLQkJICAgICZudW1wcm9tcHRzLCAmcHJvbXB0cywgJmVjaG9fb24pKSAhPSAwKQotCQkJYnJlYWs7Ci0JCWlmIChudW1wcm9tcHRzID09IDAgJiYKLQkJICAgIGRldmljZS0+cmVzcG9uZChhdXRoY3R4dC0+a2JkaW50Y3R4dCwgMCwgcmVzcCkgPT0gMCkKLQkJCWF1dGhlbnRpY2F0ZWQgPSAxOwotCi0JCWZvciAoaSA9IDA7IGkgPCBudW1wcm9tcHRzOyBpKyspCi0JCQl4ZnJlZShwcm9tcHRzW2ldKTsKLQkJeGZyZWUocHJvbXB0cyk7Ci0JCXhmcmVlKG5hbWUpOwotCQl4ZnJlZShlY2hvX29uKTsKLQkJeGZyZWUoaW5mbyk7Ci0JCWJyZWFrOwotCX0KLQlkZXZpY2UtPmZyZWVfY3R4KGF1dGhjdHh0LT5rYmRpbnRjdHh0KTsKLQlhdXRoY3R4dC0+a2JkaW50Y3R4dCA9IE5VTEw7Ci0JcmV0dXJuIGF1dGhlbnRpY2F0ZWQ7Ci19Ci12b2lkCi1hYmFuZG9uX2NoYWxsZW5nZV9yZXNwb25zZShBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0JaWYgKGF1dGhjdHh0LT5rYmRpbnRjdHh0ICE9IE5VTEwpIHsKLQkJZGV2aWNlLT5mcmVlX2N0eChhdXRoY3R4dC0+a2JkaW50Y3R4dCk7Ci0JCWF1dGhjdHh0LT5rYmRpbnRjdHh0ID0gTlVMTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9hdXRoLWtyYjUuYyBiL2F1dGgta3JiNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDE5ZmUyLi4wMDAwMDAwCi0tLSBhL2F1dGgta3JiNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qICRPcGVuQlNEOiBhdXRoLWtyYjUuYyx2IDEuMTkgMjAwNi8wOC8wMyAwMzozNDo0MSBkZXJhYWR0IEV4cCAkICovCi0vKgotICogICAgS2VyYmVyb3MgdjUgYXV0aGVudGljYXRpb24gYW5kIHRpY2tldC1wYXNzaW5nIHJvdXRpbmVzLgotICoKLSAqICRGcmVlQlNEOiBzcmMvY3J5cHRvL29wZW5zc2gvYXV0aC1rcmI1LmMsdiAxLjYgMjAwMS8wMi8xMyAxNjo1ODowNCBhc3NhciBFeHAgJAotICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAyIERhbmllbCBLb3VyaWwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgInNzaDEuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJzZXJ2Y29uZi5oIgotI2luY2x1ZGUgInVpZHN3YXAuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotI2luY2x1ZGUgImF1dGguaCIKLQotI2lmZGVmIEtSQjUKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGtyYjUuaD4KLQotZXh0ZXJuIFNlcnZlck9wdGlvbnMJIG9wdGlvbnM7Ci0KLXN0YXRpYyBpbnQKLWtyYjVfaW5pdCh2b2lkICpjb250ZXh0KQotewotCUF1dGhjdHh0ICphdXRoY3R4dCA9IChBdXRoY3R4dCAqKWNvbnRleHQ7Ci0Ja3JiNV9lcnJvcl9jb2RlIHByb2JsZW07Ci0KLQlpZiAoYXV0aGN0eHQtPmtyYjVfY3R4ID09IE5VTEwpIHsKLQkJcHJvYmxlbSA9IGtyYjVfaW5pdF9jb250ZXh0KCZhdXRoY3R4dC0+a3JiNV9jdHgpOwotCQlpZiAocHJvYmxlbSkKLQkJCXJldHVybiAocHJvYmxlbSk7Ci0JfQotCXJldHVybiAoMCk7Ci19Ci0KLWludAotYXV0aF9rcmI1X3Bhc3N3b3JkKEF1dGhjdHh0ICphdXRoY3R4dCwgY29uc3QgY2hhciAqcGFzc3dvcmQpCi17Ci0jaWZuZGVmIEhFSU1EQUwKLQlrcmI1X2NyZWRzIGNyZWRzOwotCWtyYjVfcHJpbmNpcGFsIHNlcnZlcjsKLSNlbmRpZgotCWtyYjVfZXJyb3JfY29kZSBwcm9ibGVtOwotCWtyYjVfY2NhY2hlIGNjYWNoZSA9IE5VTEw7Ci0JaW50IGxlbjsKLQljaGFyICpjbGllbnQsICpwbGF0Zm9ybV9jbGllbnQ7Ci0KLQkvKiBnZXQgcGxhdGZvcm0tc3BlY2lmaWMga2VyYmVyb3MgY2xpZW50IHByaW5jaXBhbCBuYW1lIChpZiBpdCBleGlzdHMpICovCi0JcGxhdGZvcm1fY2xpZW50ID0gcGxhdGZvcm1fa3JiNV9nZXRfcHJpbmNpcGFsX25hbWUoYXV0aGN0eHQtPnB3LT5wd19uYW1lKTsKLQljbGllbnQgPSBwbGF0Zm9ybV9jbGllbnQgPyBwbGF0Zm9ybV9jbGllbnQgOiBhdXRoY3R4dC0+cHctPnB3X25hbWU7Ci0KLQl0ZW1wb3JhcmlseV91c2VfdWlkKGF1dGhjdHh0LT5wdyk7Ci0KLQlwcm9ibGVtID0ga3JiNV9pbml0KGF1dGhjdHh0KTsKLQlpZiAocHJvYmxlbSkKLQkJZ290byBvdXQ7Ci0KLQlwcm9ibGVtID0ga3JiNV9wYXJzZV9uYW1lKGF1dGhjdHh0LT5rcmI1X2N0eCwgY2xpZW50LAotCQkgICAgJmF1dGhjdHh0LT5rcmI1X3VzZXIpOwotCWlmIChwcm9ibGVtKQotCQlnb3RvIG91dDsKLQotI2lmZGVmIEhFSU1EQUwKLQlwcm9ibGVtID0ga3JiNV9jY19nZW5fbmV3KGF1dGhjdHh0LT5rcmI1X2N0eCwgJmtyYjVfbWNjX29wcywgJmNjYWNoZSk7Ci0JaWYgKHByb2JsZW0pCi0JCWdvdG8gb3V0OwotCi0JcHJvYmxlbSA9IGtyYjVfY2NfaW5pdGlhbGl6ZShhdXRoY3R4dC0+a3JiNV9jdHgsIGNjYWNoZSwKLQkJYXV0aGN0eHQtPmtyYjVfdXNlcik7Ci0JaWYgKHByb2JsZW0pCi0JCWdvdG8gb3V0OwotCi0JcmVzdG9yZV91aWQoKTsKLQotCXByb2JsZW0gPSBrcmI1X3ZlcmlmeV91c2VyKGF1dGhjdHh0LT5rcmI1X2N0eCwgYXV0aGN0eHQtPmtyYjVfdXNlciwKLQkgICAgY2NhY2hlLCBwYXNzd29yZCwgMSwgTlVMTCk7Ci0KLQl0ZW1wb3JhcmlseV91c2VfdWlkKGF1dGhjdHh0LT5wdyk7Ci0KLQlpZiAocHJvYmxlbSkKLQkJZ290byBvdXQ7Ci0KLQlwcm9ibGVtID0ga3JiNV9jY19nZW5fbmV3KGF1dGhjdHh0LT5rcmI1X2N0eCwgJmtyYjVfZmNjX29wcywKLQkgICAgJmF1dGhjdHh0LT5rcmI1X2Z3ZF9jY2FjaGUpOwotCWlmIChwcm9ibGVtKQotCQlnb3RvIG91dDsKLQotCXByb2JsZW0gPSBrcmI1X2NjX2NvcHlfY2FjaGUoYXV0aGN0eHQtPmtyYjVfY3R4LCBjY2FjaGUsCi0JICAgIGF1dGhjdHh0LT5rcmI1X2Z3ZF9jY2FjaGUpOwotCWtyYjVfY2NfZGVzdHJveShhdXRoY3R4dC0+a3JiNV9jdHgsIGNjYWNoZSk7Ci0JY2NhY2hlID0gTlVMTDsKLQlpZiAocHJvYmxlbSkKLQkJZ290byBvdXQ7Ci0KLSNlbHNlCi0JcHJvYmxlbSA9IGtyYjVfZ2V0X2luaXRfY3JlZHNfcGFzc3dvcmQoYXV0aGN0eHQtPmtyYjVfY3R4LCAmY3JlZHMsCi0JICAgIGF1dGhjdHh0LT5rcmI1X3VzZXIsIChjaGFyICopcGFzc3dvcmQsIE5VTEwsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOwotCWlmIChwcm9ibGVtKQotCQlnb3RvIG91dDsKLQotCXByb2JsZW0gPSBrcmI1X3NuYW1lX3RvX3ByaW5jaXBhbChhdXRoY3R4dC0+a3JiNV9jdHgsIE5VTEwsIE5VTEwsCi0JICAgIEtSQjVfTlRfU1JWX0hTVCwgJnNlcnZlcik7Ci0JaWYgKHByb2JsZW0pCi0JCWdvdG8gb3V0OwotCi0JcmVzdG9yZV91aWQoKTsKLQlwcm9ibGVtID0ga3JiNV92ZXJpZnlfaW5pdF9jcmVkcyhhdXRoY3R4dC0+a3JiNV9jdHgsICZjcmVkcywgc2VydmVyLAotCSAgICBOVUxMLCBOVUxMLCBOVUxMKTsKLQlrcmI1X2ZyZWVfcHJpbmNpcGFsKGF1dGhjdHh0LT5rcmI1X2N0eCwgc2VydmVyKTsKLQl0ZW1wb3JhcmlseV91c2VfdWlkKGF1dGhjdHh0LT5wdyk7Ci0JaWYgKHByb2JsZW0pCi0JCWdvdG8gb3V0OwotCi0JaWYgKCFrcmI1X2t1c2Vyb2soYXV0aGN0eHQtPmtyYjVfY3R4LCBhdXRoY3R4dC0+a3JiNV91c2VyLCBjbGllbnQpKSB7Ci0JCXByb2JsZW0gPSAtMTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcHJvYmxlbSA9IHNzaF9rcmI1X2NjX2dlbihhdXRoY3R4dC0+a3JiNV9jdHgsICZhdXRoY3R4dC0+a3JiNV9md2RfY2NhY2hlKTsKLQlpZiAocHJvYmxlbSkKLQkJZ290byBvdXQ7Ci0KLQlwcm9ibGVtID0ga3JiNV9jY19pbml0aWFsaXplKGF1dGhjdHh0LT5rcmI1X2N0eCwgYXV0aGN0eHQtPmtyYjVfZndkX2NjYWNoZSwKLQkJCQkgICAgIGF1dGhjdHh0LT5rcmI1X3VzZXIpOwotCWlmIChwcm9ibGVtKQotCQlnb3RvIG91dDsKLQotCXByb2JsZW09IGtyYjVfY2Nfc3RvcmVfY3JlZChhdXRoY3R4dC0+a3JiNV9jdHgsIGF1dGhjdHh0LT5rcmI1X2Z3ZF9jY2FjaGUsCi0JCQkJICZjcmVkcyk7Ci0JaWYgKHByb2JsZW0pCi0JCWdvdG8gb3V0OwotI2VuZGlmCi0KLQlhdXRoY3R4dC0+a3JiNV90aWNrZXRfZmlsZSA9IChjaGFyICopa3JiNV9jY19nZXRfbmFtZShhdXRoY3R4dC0+a3JiNV9jdHgsIGF1dGhjdHh0LT5rcmI1X2Z3ZF9jY2FjaGUpOwotCi0JbGVuID0gc3RybGVuKGF1dGhjdHh0LT5rcmI1X3RpY2tldF9maWxlKSArIDY7Ci0JYXV0aGN0eHQtPmtyYjVfY2NuYW1lID0geG1hbGxvYyhsZW4pOwotCXNucHJpbnRmKGF1dGhjdHh0LT5rcmI1X2NjbmFtZSwgbGVuLCAiRklMRTolcyIsCi0JICAgIGF1dGhjdHh0LT5rcmI1X3RpY2tldF9maWxlKTsKLQotI2lmZGVmIFVTRV9QQU0KLQlpZiAob3B0aW9ucy51c2VfcGFtKQotCQlkb19wYW1fcHV0ZW52KCJLUkI1Q0NOQU1FIiwgYXV0aGN0eHQtPmtyYjVfY2NuYW1lKTsKLSNlbmRpZgotCi0gb3V0OgotCXJlc3RvcmVfdWlkKCk7Ci0JCi0JaWYgKHBsYXRmb3JtX2NsaWVudCAhPSBOVUxMKQotCQl4ZnJlZShwbGF0Zm9ybV9jbGllbnQpOwotCi0JaWYgKHByb2JsZW0pIHsKLQkJaWYgKGNjYWNoZSkKLQkJCWtyYjVfY2NfZGVzdHJveShhdXRoY3R4dC0+a3JiNV9jdHgsIGNjYWNoZSk7Ci0KLQkJaWYgKGF1dGhjdHh0LT5rcmI1X2N0eCAhPSBOVUxMICYmIHByb2JsZW0hPS0xKQotCQkJZGVidWcoIktlcmJlcm9zIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGZhaWxlZDogJXMiLAotCQkJICAgIGtyYjVfZ2V0X2Vycl90ZXh0KGF1dGhjdHh0LT5rcmI1X2N0eCwgcHJvYmxlbSkpOwotCQllbHNlCi0JCQlkZWJ1ZygiS2VyYmVyb3MgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gZmFpbGVkOiAlZCIsCi0JCQkgICAgcHJvYmxlbSk7Ci0KLQkJa3JiNV9jbGVhbnVwX3Byb2MoYXV0aGN0eHQpOwotCi0JCWlmIChvcHRpb25zLmtlcmJlcm9zX29yX2xvY2FsX3Bhc3N3ZCkKLQkJCXJldHVybiAoLTEpOwotCQllbHNlCi0JCQlyZXR1cm4gKDApOwotCX0KLQlyZXR1cm4gKGF1dGhjdHh0LT52YWxpZCA/IDEgOiAwKTsKLX0KLQotdm9pZAota3JiNV9jbGVhbnVwX3Byb2MoQXV0aGN0eHQgKmF1dGhjdHh0KQotewotCWRlYnVnKCJrcmI1X2NsZWFudXBfcHJvYyBjYWxsZWQiKTsKLQlpZiAoYXV0aGN0eHQtPmtyYjVfZndkX2NjYWNoZSkgewotCQlrcmI1X2NjX2Rlc3Ryb3koYXV0aGN0eHQtPmtyYjVfY3R4LCBhdXRoY3R4dC0+a3JiNV9md2RfY2NhY2hlKTsKLQkJYXV0aGN0eHQtPmtyYjVfZndkX2NjYWNoZSA9IE5VTEw7Ci0JfQotCWlmIChhdXRoY3R4dC0+a3JiNV91c2VyKSB7Ci0JCWtyYjVfZnJlZV9wcmluY2lwYWwoYXV0aGN0eHQtPmtyYjVfY3R4LCBhdXRoY3R4dC0+a3JiNV91c2VyKTsKLQkJYXV0aGN0eHQtPmtyYjVfdXNlciA9IE5VTEw7Ci0JfQotCWlmIChhdXRoY3R4dC0+a3JiNV9jdHgpIHsKLQkJa3JiNV9mcmVlX2NvbnRleHQoYXV0aGN0eHQtPmtyYjVfY3R4KTsKLQkJYXV0aGN0eHQtPmtyYjVfY3R4ID0gTlVMTDsKLQl9Ci19Ci0KLSNpZm5kZWYgSEVJTURBTAota3JiNV9lcnJvcl9jb2RlCi1zc2hfa3JiNV9jY19nZW4oa3JiNV9jb250ZXh0IGN0eCwga3JiNV9jY2FjaGUgKmNjYWNoZSkgewotCWludCB0bXBmZCwgcmV0OwotCWNoYXIgY2NuYW1lWzQwXTsKLQltb2RlX3Qgb2xkX3VtYXNrOwotCi0JcmV0ID0gc25wcmludGYoY2NuYW1lLCBzaXplb2YoY2NuYW1lKSwKLQkgICAgIkZJTEU6L3RtcC9rcmI1Y2NfJWRfWFhYWFhYWFhYWCIsIGdldGV1aWQoKSk7Ci0JaWYgKHJldCA8IDAgfHwgKHNpemVfdClyZXQgPj0gc2l6ZW9mKGNjbmFtZSkpCi0JCXJldHVybiBFTk9NRU07Ci0KLQlvbGRfdW1hc2sgPSB1bWFzaygwMTc3KTsKLQl0bXBmZCA9IG1rc3RlbXAoY2NuYW1lICsgc3RybGVuKCJGSUxFOiIpKTsKLQl1bWFzayhvbGRfdW1hc2spOwotCWlmICh0bXBmZCA9PSAtMSkgewotCQlsb2dpdCgibWtzdGVtcCgpOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gZXJybm87Ci0JfQotCi0JaWYgKGZjaG1vZCh0bXBmZCxTX0lSVVNSIHwgU19JV1VTUikgPT0gLTEpIHsKLQkJbG9naXQoImZjaG1vZCgpOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQljbG9zZSh0bXBmZCk7Ci0JCXJldHVybiBlcnJubzsKLQl9Ci0JY2xvc2UodG1wZmQpOwotCi0JcmV0dXJuIChrcmI1X2NjX3Jlc29sdmUoY3R4LCBjY25hbWUsIGNjYWNoZSkpOwotfQotI2VuZGlmIC8qICFIRUlNREFMICovCi0jZW5kaWYgLyogS1JCNSAqLwpkaWZmIC0tZ2l0IGEvYXV0aC1vcHRpb25zLmMgYi9hdXRoLW9wdGlvbnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlNDVjZi4uMDAwMDAwMAotLS0gYS9hdXRoLW9wdGlvbnMuYworKysgL2Rldi9udWxsCkBAIC0xLDY0OSArMCwwIEBACi0vKiAkT3BlbkJTRDogYXV0aC1vcHRpb25zLmMsdiAxLjU0IDIwMTAvMTIvMjQgMjE6NDE6NDggZGptIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgiCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgIm1hdGNoLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAiY2Fub2hvc3QuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJjaGFubmVscy5oIgotI2luY2x1ZGUgInNlcnZjb25mLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImF1dGgtb3B0aW9ucy5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2lmZGVmIEdTU0FQSQotI2luY2x1ZGUgInNzaC1nc3MuaCIKLSNlbmRpZgotI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgotCi0vKiBGbGFncyBzZXQgYXV0aG9yaXplZF9rZXlzIGZsYWdzICovCi1pbnQgbm9fcG9ydF9mb3J3YXJkaW5nX2ZsYWcgPSAwOwotaW50IG5vX2FnZW50X2ZvcndhcmRpbmdfZmxhZyA9IDA7Ci1pbnQgbm9feDExX2ZvcndhcmRpbmdfZmxhZyA9IDA7Ci1pbnQgbm9fcHR5X2ZsYWcgPSAwOwotaW50IG5vX3VzZXJfcmMgPSAwOwotaW50IGtleV9pc19jZXJ0X2F1dGhvcml0eSA9IDA7Ci0KLS8qICJjb21tYW5kPSIgb3B0aW9uLiAqLwotY2hhciAqZm9yY2VkX2NvbW1hbmQgPSBOVUxMOwotCi0vKiAiZW52aXJvbm1lbnQ9IiBvcHRpb25zLiAqLwotc3RydWN0IGVudnN0cmluZyAqY3VzdG9tX2Vudmlyb25tZW50ID0gTlVMTDsKLQotLyogInR1bm5lbD0iIG9wdGlvbi4gKi8KLWludCBmb3JjZWRfdHVuX2RldmljZSA9IC0xOwotCi0vKiAicHJpbmNpcGFscz0iIG9wdGlvbi4gKi8KLWNoYXIgKmF1dGhvcml6ZWRfcHJpbmNpcGFscyA9IE5VTEw7Ci0KLWV4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7Ci0KLXZvaWQKLWF1dGhfY2xlYXJfb3B0aW9ucyh2b2lkKQotewotCW5vX2FnZW50X2ZvcndhcmRpbmdfZmxhZyA9IDA7Ci0Jbm9fcG9ydF9mb3J3YXJkaW5nX2ZsYWcgPSAwOwotCW5vX3B0eV9mbGFnID0gMDsKLQlub194MTFfZm9yd2FyZGluZ19mbGFnID0gMDsKLQlub191c2VyX3JjID0gMDsKLQlrZXlfaXNfY2VydF9hdXRob3JpdHkgPSAwOwotCXdoaWxlIChjdXN0b21fZW52aXJvbm1lbnQpIHsKLQkJc3RydWN0IGVudnN0cmluZyAqY2UgPSBjdXN0b21fZW52aXJvbm1lbnQ7Ci0JCWN1c3RvbV9lbnZpcm9ubWVudCA9IGNlLT5uZXh0OwotCQl4ZnJlZShjZS0+cyk7Ci0JCXhmcmVlKGNlKTsKLQl9Ci0JaWYgKGZvcmNlZF9jb21tYW5kKSB7Ci0JCXhmcmVlKGZvcmNlZF9jb21tYW5kKTsKLQkJZm9yY2VkX2NvbW1hbmQgPSBOVUxMOwotCX0KLQlpZiAoYXV0aG9yaXplZF9wcmluY2lwYWxzKSB7Ci0JCXhmcmVlKGF1dGhvcml6ZWRfcHJpbmNpcGFscyk7Ci0JCWF1dGhvcml6ZWRfcHJpbmNpcGFscyA9IE5VTEw7Ci0JfQotCWZvcmNlZF90dW5fZGV2aWNlID0gLTE7Ci0JY2hhbm5lbF9jbGVhcl9wZXJtaXR0ZWRfb3BlbnMoKTsKLX0KLQotLyoKLSAqIHJldHVybiAxIGlmIGFjY2VzcyBpcyBncmFudGVkLCAwIGlmIG5vdC4KLSAqIHNpZGUgZWZmZWN0OiBzZXRzIGtleSBvcHRpb24gZmxhZ3MKLSAqLwotaW50Ci1hdXRoX3BhcnNlX29wdGlvbnMoc3RydWN0IHBhc3N3ZCAqcHcsIGNoYXIgKm9wdHMsIGNoYXIgKmZpbGUsIHVfbG9uZyBsaW5lbnVtKQotewotCWNvbnN0IGNoYXIgKmNwOwotCWludCBpOwotCi0JLyogcmVzZXQgb3B0aW9ucyAqLwotCWF1dGhfY2xlYXJfb3B0aW9ucygpOwotCi0JaWYgKCFvcHRzKQotCQlyZXR1cm4gMTsKLQotCXdoaWxlICgqb3B0cyAmJiAqb3B0cyAhPSAnICcgJiYgKm9wdHMgIT0gJ1x0JykgewotCQljcCA9ICJjZXJ0LWF1dGhvcml0eSI7Ci0JCWlmIChzdHJuY2FzZWNtcChvcHRzLCBjcCwgc3RybGVuKGNwKSkgPT0gMCkgewotCQkJa2V5X2lzX2NlcnRfYXV0aG9yaXR5ID0gMTsKLQkJCW9wdHMgKz0gc3RybGVuKGNwKTsKLQkJCWdvdG8gbmV4dF9vcHRpb247Ci0JCX0KLQkJY3AgPSAibm8tcG9ydC1mb3J3YXJkaW5nIjsKLQkJaWYgKHN0cm5jYXNlY21wKG9wdHMsIGNwLCBzdHJsZW4oY3ApKSA9PSAwKSB7Ci0JCQlhdXRoX2RlYnVnX2FkZCgiUG9ydCBmb3J3YXJkaW5nIGRpc2FibGVkLiIpOwotCQkJbm9fcG9ydF9mb3J3YXJkaW5nX2ZsYWcgPSAxOwotCQkJb3B0cyArPSBzdHJsZW4oY3ApOwotCQkJZ290byBuZXh0X29wdGlvbjsKLQkJfQotCQljcCA9ICJuby1hZ2VudC1mb3J3YXJkaW5nIjsKLQkJaWYgKHN0cm5jYXNlY21wKG9wdHMsIGNwLCBzdHJsZW4oY3ApKSA9PSAwKSB7Ci0JCQlhdXRoX2RlYnVnX2FkZCgiQWdlbnQgZm9yd2FyZGluZyBkaXNhYmxlZC4iKTsKLQkJCW5vX2FnZW50X2ZvcndhcmRpbmdfZmxhZyA9IDE7Ci0JCQlvcHRzICs9IHN0cmxlbihjcCk7Ci0JCQlnb3RvIG5leHRfb3B0aW9uOwotCQl9Ci0JCWNwID0gIm5vLVgxMS1mb3J3YXJkaW5nIjsKLQkJaWYgKHN0cm5jYXNlY21wKG9wdHMsIGNwLCBzdHJsZW4oY3ApKSA9PSAwKSB7Ci0JCQlhdXRoX2RlYnVnX2FkZCgiWDExIGZvcndhcmRpbmcgZGlzYWJsZWQuIik7Ci0JCQlub194MTFfZm9yd2FyZGluZ19mbGFnID0gMTsKLQkJCW9wdHMgKz0gc3RybGVuKGNwKTsKLQkJCWdvdG8gbmV4dF9vcHRpb247Ci0JCX0KLQkJY3AgPSAibm8tcHR5IjsKLQkJaWYgKHN0cm5jYXNlY21wKG9wdHMsIGNwLCBzdHJsZW4oY3ApKSA9PSAwKSB7Ci0JCQlhdXRoX2RlYnVnX2FkZCgiUHR5IGFsbG9jYXRpb24gZGlzYWJsZWQuIik7Ci0JCQlub19wdHlfZmxhZyA9IDE7Ci0JCQlvcHRzICs9IHN0cmxlbihjcCk7Ci0JCQlnb3RvIG5leHRfb3B0aW9uOwotCQl9Ci0JCWNwID0gIm5vLXVzZXItcmMiOwotCQlpZiAoc3RybmNhc2VjbXAob3B0cywgY3AsIHN0cmxlbihjcCkpID09IDApIHsKLQkJCWF1dGhfZGVidWdfYWRkKCJVc2VyIHJjIGZpbGUgZXhlY3V0aW9uIGRpc2FibGVkLiIpOwotCQkJbm9fdXNlcl9yYyA9IDE7Ci0JCQlvcHRzICs9IHN0cmxlbihjcCk7Ci0JCQlnb3RvIG5leHRfb3B0aW9uOwotCQl9Ci0JCWNwID0gImNvbW1hbmQ9XCIiOwotCQlpZiAoc3RybmNhc2VjbXAob3B0cywgY3AsIHN0cmxlbihjcCkpID09IDApIHsKLQkJCW9wdHMgKz0gc3RybGVuKGNwKTsKLQkJCWlmIChmb3JjZWRfY29tbWFuZCAhPSBOVUxMKQotCQkJCXhmcmVlKGZvcmNlZF9jb21tYW5kKTsKLQkJCWZvcmNlZF9jb21tYW5kID0geG1hbGxvYyhzdHJsZW4ob3B0cykgKyAxKTsKLQkJCWkgPSAwOwotCQkJd2hpbGUgKCpvcHRzKSB7Ci0JCQkJaWYgKCpvcHRzID09ICciJykKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKCpvcHRzID09ICdcXCcgJiYgb3B0c1sxXSA9PSAnIicpIHsKLQkJCQkJb3B0cyArPSAyOwotCQkJCQlmb3JjZWRfY29tbWFuZFtpKytdID0gJyInOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZm9yY2VkX2NvbW1hbmRbaSsrXSA9ICpvcHRzKys7Ci0JCQl9Ci0JCQlpZiAoISpvcHRzKSB7Ci0JCQkJZGVidWcoIiUuMTAwcywgbGluZSAlbHU6IG1pc3NpbmcgZW5kIHF1b3RlIiwKLQkJCQkgICAgZmlsZSwgbGluZW51bSk7Ci0JCQkJYXV0aF9kZWJ1Z19hZGQoIiUuMTAwcywgbGluZSAlbHU6IG1pc3NpbmcgZW5kIHF1b3RlIiwKLQkJCQkgICAgZmlsZSwgbGluZW51bSk7Ci0JCQkJeGZyZWUoZm9yY2VkX2NvbW1hbmQpOwotCQkJCWZvcmNlZF9jb21tYW5kID0gTlVMTDsKLQkJCQlnb3RvIGJhZF9vcHRpb247Ci0JCQl9Ci0JCQlmb3JjZWRfY29tbWFuZFtpXSA9ICdcMCc7Ci0JCQlhdXRoX2RlYnVnX2FkZCgiRm9yY2VkIGNvbW1hbmQuIik7Ci0JCQlvcHRzKys7Ci0JCQlnb3RvIG5leHRfb3B0aW9uOwotCQl9Ci0JCWNwID0gInByaW5jaXBhbHM9XCIiOwotCQlpZiAoc3RybmNhc2VjbXAob3B0cywgY3AsIHN0cmxlbihjcCkpID09IDApIHsKLQkJCW9wdHMgKz0gc3RybGVuKGNwKTsKLQkJCWlmIChhdXRob3JpemVkX3ByaW5jaXBhbHMgIT0gTlVMTCkKLQkJCQl4ZnJlZShhdXRob3JpemVkX3ByaW5jaXBhbHMpOwotCQkJYXV0aG9yaXplZF9wcmluY2lwYWxzID0geG1hbGxvYyhzdHJsZW4ob3B0cykgKyAxKTsKLQkJCWkgPSAwOwotCQkJd2hpbGUgKCpvcHRzKSB7Ci0JCQkJaWYgKCpvcHRzID09ICciJykKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKCpvcHRzID09ICdcXCcgJiYgb3B0c1sxXSA9PSAnIicpIHsKLQkJCQkJb3B0cyArPSAyOwotCQkJCQlhdXRob3JpemVkX3ByaW5jaXBhbHNbaSsrXSA9ICciJzsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWF1dGhvcml6ZWRfcHJpbmNpcGFsc1tpKytdID0gKm9wdHMrKzsKLQkJCX0KLQkJCWlmICghKm9wdHMpIHsKLQkJCQlkZWJ1ZygiJS4xMDBzLCBsaW5lICVsdTogbWlzc2luZyBlbmQgcXVvdGUiLAotCQkJCSAgICBmaWxlLCBsaW5lbnVtKTsKLQkJCQlhdXRoX2RlYnVnX2FkZCgiJS4xMDBzLCBsaW5lICVsdTogbWlzc2luZyBlbmQgcXVvdGUiLAotCQkJCSAgICBmaWxlLCBsaW5lbnVtKTsKLQkJCQl4ZnJlZShhdXRob3JpemVkX3ByaW5jaXBhbHMpOwotCQkJCWF1dGhvcml6ZWRfcHJpbmNpcGFscyA9IE5VTEw7Ci0JCQkJZ290byBiYWRfb3B0aW9uOwotCQkJfQotCQkJYXV0aG9yaXplZF9wcmluY2lwYWxzW2ldID0gJ1wwJzsKLQkJCWF1dGhfZGVidWdfYWRkKCJwcmluY2lwYWxzOiAlLjkwMHMiLAotCQkJICAgIGF1dGhvcml6ZWRfcHJpbmNpcGFscyk7Ci0JCQlvcHRzKys7Ci0JCQlnb3RvIG5leHRfb3B0aW9uOwotCQl9Ci0JCWNwID0gImVudmlyb25tZW50PVwiIjsKLQkJaWYgKG9wdGlvbnMucGVybWl0X3VzZXJfZW52ICYmCi0JCSAgICBzdHJuY2FzZWNtcChvcHRzLCBjcCwgc3RybGVuKGNwKSkgPT0gMCkgewotCQkJY2hhciAqczsKLQkJCXN0cnVjdCBlbnZzdHJpbmcgKm5ld19lbnZzdHJpbmc7Ci0KLQkJCW9wdHMgKz0gc3RybGVuKGNwKTsKLQkJCXMgPSB4bWFsbG9jKHN0cmxlbihvcHRzKSArIDEpOwotCQkJaSA9IDA7Ci0JCQl3aGlsZSAoKm9wdHMpIHsKLQkJCQlpZiAoKm9wdHMgPT0gJyInKQotCQkJCQlicmVhazsKLQkJCQlpZiAoKm9wdHMgPT0gJ1xcJyAmJiBvcHRzWzFdID09ICciJykgewotCQkJCQlvcHRzICs9IDI7Ci0JCQkJCXNbaSsrXSA9ICciJzsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXNbaSsrXSA9ICpvcHRzKys7Ci0JCQl9Ci0JCQlpZiAoISpvcHRzKSB7Ci0JCQkJZGVidWcoIiUuMTAwcywgbGluZSAlbHU6IG1pc3NpbmcgZW5kIHF1b3RlIiwKLQkJCQkgICAgZmlsZSwgbGluZW51bSk7Ci0JCQkJYXV0aF9kZWJ1Z19hZGQoIiUuMTAwcywgbGluZSAlbHU6IG1pc3NpbmcgZW5kIHF1b3RlIiwKLQkJCQkgICAgZmlsZSwgbGluZW51bSk7Ci0JCQkJeGZyZWUocyk7Ci0JCQkJZ290byBiYWRfb3B0aW9uOwotCQkJfQotCQkJc1tpXSA9ICdcMCc7Ci0JCQlhdXRoX2RlYnVnX2FkZCgiQWRkaW5nIHRvIGVudmlyb25tZW50OiAlLjkwMHMiLCBzKTsKLQkJCWRlYnVnKCJBZGRpbmcgdG8gZW52aXJvbm1lbnQ6ICUuOTAwcyIsIHMpOwotCQkJb3B0cysrOwotCQkJbmV3X2VudnN0cmluZyA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbnZzdHJpbmcpKTsKLQkJCW5ld19lbnZzdHJpbmctPnMgPSBzOwotCQkJbmV3X2VudnN0cmluZy0+bmV4dCA9IGN1c3RvbV9lbnZpcm9ubWVudDsKLQkJCWN1c3RvbV9lbnZpcm9ubWVudCA9IG5ld19lbnZzdHJpbmc7Ci0JCQlnb3RvIG5leHRfb3B0aW9uOwotCQl9Ci0JCWNwID0gImZyb209XCIiOwotCQlpZiAoc3RybmNhc2VjbXAob3B0cywgY3AsIHN0cmxlbihjcCkpID09IDApIHsKLQkJCWNvbnN0IGNoYXIgKnJlbW90ZV9pcCA9IGdldF9yZW1vdGVfaXBhZGRyKCk7Ci0JCQljb25zdCBjaGFyICpyZW1vdGVfaG9zdCA9IGdldF9jYW5vbmljYWxfaG9zdG5hbWUoCi0JCQkgICAgb3B0aW9ucy51c2VfZG5zKTsKLQkJCWNoYXIgKnBhdHRlcm5zID0geG1hbGxvYyhzdHJsZW4ob3B0cykgKyAxKTsKLQotCQkJb3B0cyArPSBzdHJsZW4oY3ApOwotCQkJaSA9IDA7Ci0JCQl3aGlsZSAoKm9wdHMpIHsKLQkJCQlpZiAoKm9wdHMgPT0gJyInKQotCQkJCQlicmVhazsKLQkJCQlpZiAoKm9wdHMgPT0gJ1xcJyAmJiBvcHRzWzFdID09ICciJykgewotCQkJCQlvcHRzICs9IDI7Ci0JCQkJCXBhdHRlcm5zW2krK10gPSAnIic7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlwYXR0ZXJuc1tpKytdID0gKm9wdHMrKzsKLQkJCX0KLQkJCWlmICghKm9wdHMpIHsKLQkJCQlkZWJ1ZygiJS4xMDBzLCBsaW5lICVsdTogbWlzc2luZyBlbmQgcXVvdGUiLAotCQkJCSAgICBmaWxlLCBsaW5lbnVtKTsKLQkJCQlhdXRoX2RlYnVnX2FkZCgiJS4xMDBzLCBsaW5lICVsdTogbWlzc2luZyBlbmQgcXVvdGUiLAotCQkJCSAgICBmaWxlLCBsaW5lbnVtKTsKLQkJCQl4ZnJlZShwYXR0ZXJucyk7Ci0JCQkJZ290byBiYWRfb3B0aW9uOwotCQkJfQotCQkJcGF0dGVybnNbaV0gPSAnXDAnOwotCQkJb3B0cysrOwotCQkJc3dpdGNoIChtYXRjaF9ob3N0X2FuZF9pcChyZW1vdGVfaG9zdCwgcmVtb3RlX2lwLAotCQkJICAgIHBhdHRlcm5zKSkgewotCQkJY2FzZSAxOgotCQkJCXhmcmVlKHBhdHRlcm5zKTsKLQkJCQkvKiBIb3N0IG5hbWUgbWF0Y2hlcy4gKi8KLQkJCQlnb3RvIG5leHRfb3B0aW9uOwotCQkJY2FzZSAtMToKLQkJCQlkZWJ1ZygiJS4xMDBzLCBsaW5lICVsdTogaW52YWxpZCBjcml0ZXJpYSIsCi0JCQkJICAgIGZpbGUsIGxpbmVudW0pOwotCQkJCWF1dGhfZGVidWdfYWRkKCIlLjEwMHMsIGxpbmUgJWx1OiAiCi0JCQkJICAgICJpbnZhbGlkIGNyaXRlcmlhIiwgZmlsZSwgbGluZW51bSk7Ci0JCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJCWNhc2UgMDoKLQkJCQl4ZnJlZShwYXR0ZXJucyk7Ci0JCQkJbG9naXQoIkF1dGhlbnRpY2F0aW9uIHRyaWVkIGZvciAlLjEwMHMgd2l0aCAiCi0JCQkJICAgICJjb3JyZWN0IGtleSBidXQgbm90IGZyb20gYSBwZXJtaXR0ZWQgIgotCQkJCSAgICAiaG9zdCAoaG9zdD0lLjIwMHMsIGlwPSUuMjAwcykuIiwKLQkJCQkgICAgcHctPnB3X25hbWUsIHJlbW90ZV9ob3N0LCByZW1vdGVfaXApOwotCQkJCWF1dGhfZGVidWdfYWRkKCJZb3VyIGhvc3QgJyUuMjAwcycgaXMgbm90ICIKLQkJCQkgICAgInBlcm1pdHRlZCB0byB1c2UgdGhpcyBrZXkgZm9yIGxvZ2luLiIsCi0JCQkJICAgIHJlbW90ZV9ob3N0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIGRlbnkgYWNjZXNzICovCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljcCA9ICJwZXJtaXRvcGVuPVwiIjsKLQkJaWYgKHN0cm5jYXNlY21wKG9wdHMsIGNwLCBzdHJsZW4oY3ApKSA9PSAwKSB7Ci0JCQljaGFyICpob3N0LCAqcDsKLQkJCWludCBwb3J0OwotCQkJY2hhciAqcGF0dGVybnMgPSB4bWFsbG9jKHN0cmxlbihvcHRzKSArIDEpOwotCi0JCQlvcHRzICs9IHN0cmxlbihjcCk7Ci0JCQlpID0gMDsKLQkJCXdoaWxlICgqb3B0cykgewotCQkJCWlmICgqb3B0cyA9PSAnIicpCi0JCQkJCWJyZWFrOwotCQkJCWlmICgqb3B0cyA9PSAnXFwnICYmIG9wdHNbMV0gPT0gJyInKSB7Ci0JCQkJCW9wdHMgKz0gMjsKLQkJCQkJcGF0dGVybnNbaSsrXSA9ICciJzsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXBhdHRlcm5zW2krK10gPSAqb3B0cysrOwotCQkJfQotCQkJaWYgKCEqb3B0cykgewotCQkJCWRlYnVnKCIlLjEwMHMsIGxpbmUgJWx1OiBtaXNzaW5nIGVuZCBxdW90ZSIsCi0JCQkJICAgIGZpbGUsIGxpbmVudW0pOwotCQkJCWF1dGhfZGVidWdfYWRkKCIlLjEwMHMsIGxpbmUgJWx1OiBtaXNzaW5nICIKLQkJCQkgICAgImVuZCBxdW90ZSIsIGZpbGUsIGxpbmVudW0pOwotCQkJCXhmcmVlKHBhdHRlcm5zKTsKLQkJCQlnb3RvIGJhZF9vcHRpb247Ci0JCQl9Ci0JCQlwYXR0ZXJuc1tpXSA9ICdcMCc7Ci0JCQlvcHRzKys7Ci0JCQlwID0gcGF0dGVybnM7Ci0JCQlob3N0ID0gaHBkZWxpbSgmcCk7Ci0JCQlpZiAoaG9zdCA9PSBOVUxMIHx8IHN0cmxlbihob3N0KSA+PSBOSV9NQVhIT1NUKSB7Ci0JCQkJZGVidWcoIiUuMTAwcywgbGluZSAlbHU6IEJhZCBwZXJtaXRvcGVuICIKLQkJCQkgICAgInNwZWNpZmljYXRpb24gPCUuMTAwcz4iLCBmaWxlLCBsaW5lbnVtLAotCQkJCSAgICBwYXR0ZXJucyk7Ci0JCQkJYXV0aF9kZWJ1Z19hZGQoIiUuMTAwcywgbGluZSAlbHU6ICIKLQkJCQkgICAgIkJhZCBwZXJtaXRvcGVuIHNwZWNpZmljYXRpb24iLCBmaWxlLAotCQkJCSAgICBsaW5lbnVtKTsKLQkJCQl4ZnJlZShwYXR0ZXJucyk7Ci0JCQkJZ290byBiYWRfb3B0aW9uOwotCQkJfQotCQkJaG9zdCA9IGNsZWFuaG9zdG5hbWUoaG9zdCk7Ci0JCQlpZiAocCA9PSBOVUxMIHx8IChwb3J0ID0gYTJwb3J0KHApKSA8PSAwKSB7Ci0JCQkJZGVidWcoIiUuMTAwcywgbGluZSAlbHU6IEJhZCBwZXJtaXRvcGVuIHBvcnQgIgotCQkJCSAgICAiPCUuMTAwcz4iLCBmaWxlLCBsaW5lbnVtLCBwID8gcCA6ICIiKTsKLQkJCQlhdXRoX2RlYnVnX2FkZCgiJS4xMDBzLCBsaW5lICVsdTogIgotCQkJCSAgICAiQmFkIHBlcm1pdG9wZW4gcG9ydCIsIGZpbGUsIGxpbmVudW0pOwotCQkJCXhmcmVlKHBhdHRlcm5zKTsKLQkJCQlnb3RvIGJhZF9vcHRpb247Ci0JCQl9Ci0JCQlpZiAob3B0aW9ucy5hbGxvd190Y3BfZm9yd2FyZGluZykKLQkJCQljaGFubmVsX2FkZF9wZXJtaXR0ZWRfb3BlbnMoaG9zdCwgcG9ydCk7Ci0JCQl4ZnJlZShwYXR0ZXJucyk7Ci0JCQlnb3RvIG5leHRfb3B0aW9uOwotCQl9Ci0JCWNwID0gInR1bm5lbD1cIiI7Ci0JCWlmIChzdHJuY2FzZWNtcChvcHRzLCBjcCwgc3RybGVuKGNwKSkgPT0gMCkgewotCQkJY2hhciAqdHVuID0gTlVMTDsKLQkJCW9wdHMgKz0gc3RybGVuKGNwKTsKLQkJCXR1biA9IHhtYWxsb2Moc3RybGVuKG9wdHMpICsgMSk7Ci0JCQlpID0gMDsKLQkJCXdoaWxlICgqb3B0cykgewotCQkJCWlmICgqb3B0cyA9PSAnIicpCi0JCQkJCWJyZWFrOwotCQkJCXR1bltpKytdID0gKm9wdHMrKzsKLQkJCX0KLQkJCWlmICghKm9wdHMpIHsKLQkJCQlkZWJ1ZygiJS4xMDBzLCBsaW5lICVsdTogbWlzc2luZyBlbmQgcXVvdGUiLAotCQkJCSAgICBmaWxlLCBsaW5lbnVtKTsKLQkJCQlhdXRoX2RlYnVnX2FkZCgiJS4xMDBzLCBsaW5lICVsdTogbWlzc2luZyBlbmQgcXVvdGUiLAotCQkJCSAgICBmaWxlLCBsaW5lbnVtKTsKLQkJCQl4ZnJlZSh0dW4pOwotCQkJCWZvcmNlZF90dW5fZGV2aWNlID0gLTE7Ci0JCQkJZ290byBiYWRfb3B0aW9uOwotCQkJfQotCQkJdHVuW2ldID0gJ1wwJzsKLQkJCWZvcmNlZF90dW5fZGV2aWNlID0gYTJ0dW4odHVuLCBOVUxMKTsKLQkJCXhmcmVlKHR1bik7Ci0JCQlpZiAoZm9yY2VkX3R1bl9kZXZpY2UgPT0gU1NIX1RVTklEX0VSUikgewotCQkJCWRlYnVnKCIlLjEwMHMsIGxpbmUgJWx1OiBpbnZhbGlkIHR1biBkZXZpY2UiLAotCQkJCSAgICBmaWxlLCBsaW5lbnVtKTsKLQkJCQlhdXRoX2RlYnVnX2FkZCgiJS4xMDBzLCBsaW5lICVsdTogaW52YWxpZCB0dW4gZGV2aWNlIiwKLQkJCQkgICAgZmlsZSwgbGluZW51bSk7Ci0JCQkJZm9yY2VkX3R1bl9kZXZpY2UgPSAtMTsKLQkJCQlnb3RvIGJhZF9vcHRpb247Ci0JCQl9Ci0JCQlhdXRoX2RlYnVnX2FkZCgiRm9yY2VkIHR1biBkZXZpY2U6ICVkIiwgZm9yY2VkX3R1bl9kZXZpY2UpOwotCQkJb3B0cysrOwotCQkJZ290byBuZXh0X29wdGlvbjsKLQkJfQotbmV4dF9vcHRpb246Ci0JCS8qCi0JCSAqIFNraXAgdGhlIGNvbW1hLCBhbmQgbW92ZSB0byB0aGUgbmV4dCBvcHRpb24KLQkJICogKG9yIGJyZWFrIG91dCBpZiB0aGVyZSBhcmUgbm8gbW9yZSkuCi0JCSAqLwotCQlpZiAoISpvcHRzKQotCQkJZmF0YWwoIkJ1Z3MgaW4gYXV0aC1vcHRpb25zLmMgb3B0aW9uIHByb2Nlc3NpbmcuIik7Ci0JCWlmICgqb3B0cyA9PSAnICcgfHwgKm9wdHMgPT0gJ1x0JykKLQkJCWJyZWFrOwkJLyogRW5kIG9mIG9wdGlvbnMuICovCi0JCWlmICgqb3B0cyAhPSAnLCcpCi0JCQlnb3RvIGJhZF9vcHRpb247Ci0JCW9wdHMrKzsKLQkJLyogUHJvY2VzcyB0aGUgbmV4dCBvcHRpb24uICovCi0JfQotCi0JLyogZ3JhbnQgYWNjZXNzICovCi0JcmV0dXJuIDE7Ci0KLWJhZF9vcHRpb246Ci0JbG9naXQoIkJhZCBvcHRpb25zIGluICUuMTAwcyBmaWxlLCBsaW5lICVsdTogJS41MHMiLAotCSAgICBmaWxlLCBsaW5lbnVtLCBvcHRzKTsKLQlhdXRoX2RlYnVnX2FkZCgiQmFkIG9wdGlvbnMgaW4gJS4xMDBzIGZpbGUsIGxpbmUgJWx1OiAlLjUwcyIsCi0JICAgIGZpbGUsIGxpbmVudW0sIG9wdHMpOwotCi0JLyogZGVueSBhY2Nlc3MgKi8KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBPUFRJT05TX0NSSVRJQ0FMCTEKLSNkZWZpbmUgT1BUSU9OU19FWFRFTlNJT05TCTIKLXN0YXRpYyBpbnQKLXBhcnNlX29wdGlvbl9saXN0KHVfY2hhciAqb3B0YmxvYiwgc2l6ZV90IG9wdGJsb2JfbGVuLCBzdHJ1Y3QgcGFzc3dkICpwdywKLSAgICB1X2ludCB3aGljaCwgaW50IGNyaXQsCi0gICAgaW50ICpjZXJ0X25vX3BvcnRfZm9yd2FyZGluZ19mbGFnLAotICAgIGludCAqY2VydF9ub19hZ2VudF9mb3J3YXJkaW5nX2ZsYWcsCi0gICAgaW50ICpjZXJ0X25vX3gxMV9mb3J3YXJkaW5nX2ZsYWcsCi0gICAgaW50ICpjZXJ0X25vX3B0eV9mbGFnLAotICAgIGludCAqY2VydF9ub191c2VyX3JjLAotICAgIGNoYXIgKipjZXJ0X2ZvcmNlZF9jb21tYW5kLAotICAgIGludCAqY2VydF9zb3VyY2VfYWRkcmVzc19kb25lKQotewotCWNoYXIgKmNvbW1hbmQsICphbGxvd2VkOwotCWNvbnN0IGNoYXIgKnJlbW90ZV9pcDsKLQl1X2NoYXIgKm5hbWUgPSBOVUxMLCAqZGF0YV9ibG9iID0gTlVMTDsKLQl1X2ludCBubGVuLCBkbGVuLCBjbGVuOwotCUJ1ZmZlciBjLCBkYXRhOwotCWludCByZXQgPSAtMSwgZm91bmQ7Ci0KLQlidWZmZXJfaW5pdCgmZGF0YSk7Ci0KLQkvKiBNYWtlIGNvcHkgdG8gYXZvaWQgYWx0ZXJpbmcgb3JpZ2luYWwgKi8KLQlidWZmZXJfaW5pdCgmYyk7Ci0JYnVmZmVyX2FwcGVuZCgmYywgb3B0YmxvYiwgb3B0YmxvYl9sZW4pOwotCi0Jd2hpbGUgKGJ1ZmZlcl9sZW4oJmMpID4gMCkgewotCQlpZiAoKG5hbWUgPSBidWZmZXJfZ2V0X2NzdHJpbmdfcmV0KCZjLCAmbmxlbikpID09IE5VTEwgfHwKLQkJICAgIChkYXRhX2Jsb2IgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQoJmMsICZkbGVuKSkgPT0gTlVMTCkgewotCQkJZXJyb3IoIkNlcnRpZmljYXRlIG9wdGlvbnMgY29ycnVwdCIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJYnVmZmVyX2FwcGVuZCgmZGF0YSwgZGF0YV9ibG9iLCBkbGVuKTsKLQkJZGVidWczKCJmb3VuZCBjZXJ0aWZpY2F0ZSBvcHRpb24gXCIlLjEwMHNcIiBsZW4gJXUiLAotCQkgICAgbmFtZSwgZGxlbik7Ci0JCWlmIChzdHJsZW4obmFtZSkgIT0gbmxlbikgewotCQkJZXJyb3IoIkNlcnRpZmljYXRlIGNvbnN0cmFpbnQgbmFtZSBjb250YWlucyBcXDAiKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWZvdW5kID0gMDsKLQkJaWYgKCh3aGljaCAmIE9QVElPTlNfRVhURU5TSU9OUykgIT0gMCkgewotCQkJaWYgKHN0cmNtcChuYW1lLCAicGVybWl0LVgxMS1mb3J3YXJkaW5nIikgPT0gMCkgewotCQkJCSpjZXJ0X25vX3gxMV9mb3J3YXJkaW5nX2ZsYWcgPSAwOwotCQkJCWZvdW5kID0gMTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsCi0JCQkgICAgInBlcm1pdC1hZ2VudC1mb3J3YXJkaW5nIikgPT0gMCkgewotCQkJCSpjZXJ0X25vX2FnZW50X2ZvcndhcmRpbmdfZmxhZyA9IDA7Ci0JCQkJZm91bmQgPSAxOwotCQkJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwKLQkJCSAgICAicGVybWl0LXBvcnQtZm9yd2FyZGluZyIpID09IDApIHsKLQkJCQkqY2VydF9ub19wb3J0X2ZvcndhcmRpbmdfZmxhZyA9IDA7Ci0JCQkJZm91bmQgPSAxOwotCQkJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInBlcm1pdC1wdHkiKSA9PSAwKSB7Ci0JCQkJKmNlcnRfbm9fcHR5X2ZsYWcgPSAwOwotCQkJCWZvdW5kID0gMTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJwZXJtaXQtdXNlci1yYyIpID09IDApIHsKLQkJCQkqY2VydF9ub191c2VyX3JjID0gMDsKLQkJCQlmb3VuZCA9IDE7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFmb3VuZCAmJiAod2hpY2ggJiBPUFRJT05TX0NSSVRJQ0FMKSAhPSAwKSB7Ci0JCQlpZiAoc3RyY21wKG5hbWUsICJmb3JjZS1jb21tYW5kIikgPT0gMCkgewotCQkJCWlmICgoY29tbWFuZCA9IGJ1ZmZlcl9nZXRfY3N0cmluZ19yZXQoJmRhdGEsCi0JCQkJICAgICZjbGVuKSkgPT0gTlVMTCkgewotCQkJCQllcnJvcigiQ2VydGlmaWNhdGUgY29uc3RyYWludCBcIiVzXCIgIgotCQkJCQkgICAgImNvcnJ1cHQiLCBuYW1lKTsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJCWlmIChzdHJsZW4oY29tbWFuZCkgIT0gY2xlbikgewotCQkJCQllcnJvcigiZm9yY2UtY29tbWFuZCBjb25zdHJhaW50ICIKLQkJCQkJICAgICJjb250YWlucyBcXDAiKTsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJCWlmICgqY2VydF9mb3JjZWRfY29tbWFuZCAhPSBOVUxMKSB7Ci0JCQkJCWVycm9yKCJDZXJ0aWZpY2F0ZSBoYXMgbXVsdGlwbGUgIgotCQkJCQkgICAgImZvcmNlLWNvbW1hbmQgb3B0aW9ucyIpOwotCQkJCQl4ZnJlZShjb21tYW5kKTsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJCSpjZXJ0X2ZvcmNlZF9jb21tYW5kID0gY29tbWFuZDsKLQkJCQlmb3VuZCA9IDE7Ci0JCQl9Ci0JCQlpZiAoc3RyY21wKG5hbWUsICJzb3VyY2UtYWRkcmVzcyIpID09IDApIHsKLQkJCQlpZiAoKGFsbG93ZWQgPSBidWZmZXJfZ2V0X2NzdHJpbmdfcmV0KCZkYXRhLAotCQkJCSAgICAmY2xlbikpID09IE5VTEwpIHsKLQkJCQkJZXJyb3IoIkNlcnRpZmljYXRlIGNvbnN0cmFpbnQgIgotCQkJCQkgICAgIlwiJXNcIiBjb3JydXB0IiwgbmFtZSk7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCQlpZiAoc3RybGVuKGFsbG93ZWQpICE9IGNsZW4pIHsKLQkJCQkJZXJyb3IoInNvdXJjZS1hZGRyZXNzIGNvbnN0cmFpbnQgIgotCQkJCQkgICAgImNvbnRhaW5zIFxcMCIpOwotCQkJCQlnb3RvIG91dDsKLQkJCQl9Ci0JCQkJaWYgKCgqY2VydF9zb3VyY2VfYWRkcmVzc19kb25lKSsrKSB7Ci0JCQkJCWVycm9yKCJDZXJ0aWZpY2F0ZSBoYXMgbXVsdGlwbGUgIgotCQkJCQkgICAgInNvdXJjZS1hZGRyZXNzIG9wdGlvbnMiKTsKLQkJCQkJeGZyZWUoYWxsb3dlZCk7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCQlyZW1vdGVfaXAgPSBnZXRfcmVtb3RlX2lwYWRkcigpOwotCQkJCXN3aXRjaCAoYWRkcl9tYXRjaF9jaWRyX2xpc3QocmVtb3RlX2lwLAotCQkJCSAgICBhbGxvd2VkKSkgewotCQkJCWNhc2UgMToKLQkJCQkJLyogYWNjZXB0ZWQgKi8KLQkJCQkJeGZyZWUoYWxsb3dlZCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMDoKLQkJCQkJLyogbm8gbWF0Y2ggKi8KLQkJCQkJbG9naXQoIkF1dGhlbnRpY2F0aW9uIHRyaWVkIGZvciAlLjEwMHMgIgotCQkJCQkgICAgIndpdGggdmFsaWQgY2VydGlmaWNhdGUgYnV0IG5vdCAiCi0JCQkJCSAgICAiZnJvbSBhIHBlcm1pdHRlZCBob3N0ICIKLQkJCQkJICAgICIoaXA9JS4yMDBzKS4iLCBwdy0+cHdfbmFtZSwKLQkJCQkJICAgIHJlbW90ZV9pcCk7Ci0JCQkJCWF1dGhfZGVidWdfYWRkKCJZb3VyIGFkZHJlc3MgJyUuMjAwcycgIgotCQkJCQkgICAgImlzIG5vdCBwZXJtaXR0ZWQgdG8gdXNlIHRoaXMgIgotCQkJCQkgICAgImNlcnRpZmljYXRlIGZvciBsb2dpbi4iLAotCQkJCQkgICAgcmVtb3RlX2lwKTsKLQkJCQkJeGZyZWUoYWxsb3dlZCk7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCWNhc2UgLTE6Ci0JCQkJCWVycm9yKCJDZXJ0aWZpY2F0ZSBzb3VyY2UtYWRkcmVzcyAiCi0JCQkJCSAgICAiY29udGVudHMgaW52YWxpZCIpOwotCQkJCQl4ZnJlZShhbGxvd2VkKTsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJCWZvdW5kID0gMTsKLQkJCX0KLQkJfQotCi0JCWlmICghZm91bmQpIHsKLQkJCWlmIChjcml0KSB7Ci0JCQkJZXJyb3IoIkNlcnRpZmljYXRlIGNyaXRpY2FsIG9wdGlvbiBcIiVzXCIgIgotCQkJCSAgICAiaXMgbm90IHN1cHBvcnRlZCIsIG5hbWUpOwotCQkJCWdvdG8gb3V0OwotCQkJfSBlbHNlIHsKLQkJCQlsb2dpdCgiQ2VydGlmaWNhdGUgZXh0ZW5zaW9uIFwiJXNcIiAiCi0JCQkJICAgICJpcyBub3Qgc3VwcG9ydGVkIiwgbmFtZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoYnVmZmVyX2xlbigmZGF0YSkgIT0gMCkgewotCQkJZXJyb3IoIkNlcnRpZmljYXRlIG9wdGlvbiBcIiVzXCIgY29ycnVwdCAiCi0JCQkgICAgIihleHRyYSBkYXRhKSIsIG5hbWUpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJYnVmZmVyX2NsZWFyKCZkYXRhKTsKLQkJeGZyZWUobmFtZSk7Ci0JCXhmcmVlKGRhdGFfYmxvYik7Ci0JCW5hbWUgPSBkYXRhX2Jsb2IgPSBOVUxMOwotCX0KLQkvKiBzdWNjZXNzZnVsbHkgcGFyc2VkIGFsbCBvcHRpb25zICovCi0JcmV0ID0gMDsKLQotIG91dDoKLQlpZiAocmV0ICE9IDAgJiYKLQkgICAgY2VydF9mb3JjZWRfY29tbWFuZCAhPSBOVUxMICYmCi0JICAgICpjZXJ0X2ZvcmNlZF9jb21tYW5kICE9IE5VTEwpIHsKLQkJeGZyZWUoKmNlcnRfZm9yY2VkX2NvbW1hbmQpOwotCQkqY2VydF9mb3JjZWRfY29tbWFuZCA9IE5VTEw7Ci0JfQotCWlmIChuYW1lICE9IE5VTEwpCi0JCXhmcmVlKG5hbWUpOwotCWlmIChkYXRhX2Jsb2IgIT0gTlVMTCkKLQkJeGZyZWUoZGF0YV9ibG9iKTsKLQlidWZmZXJfZnJlZSgmZGF0YSk7Ci0JYnVmZmVyX2ZyZWUoJmMpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBTZXQgb3B0aW9ucyBmcm9tIGNyaXRpY2FsIGNlcnRpZmljYXRlIG9wdGlvbnMuIFRoZXNlIHN1cGVyc2VkZSB1c2VyIGtleQotICogb3B0aW9ucyBzbyB0aGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGF1dGhfcGFyc2Vfb3B0aW9ucygpLgotICovCi1pbnQKLWF1dGhfY2VydF9vcHRpb25zKEtleSAqaywgc3RydWN0IHBhc3N3ZCAqcHcpCi17Ci0JaW50IGNlcnRfbm9fcG9ydF9mb3J3YXJkaW5nX2ZsYWcgPSAxOwotCWludCBjZXJ0X25vX2FnZW50X2ZvcndhcmRpbmdfZmxhZyA9IDE7Ci0JaW50IGNlcnRfbm9feDExX2ZvcndhcmRpbmdfZmxhZyA9IDE7Ci0JaW50IGNlcnRfbm9fcHR5X2ZsYWcgPSAxOwotCWludCBjZXJ0X25vX3VzZXJfcmMgPSAxOwotCWNoYXIgKmNlcnRfZm9yY2VkX2NvbW1hbmQgPSBOVUxMOwotCWludCBjZXJ0X3NvdXJjZV9hZGRyZXNzX2RvbmUgPSAwOwotCi0JaWYgKGtleV9jZXJ0X2lzX2xlZ2FjeShrKSkgewotCQkvKiBBbGwgb3B0aW9ucyBhcmUgaW4gdGhlIG9uZSBmaWVsZCBmb3IgdjAwIGNlcnRzICovCi0JCWlmIChwYXJzZV9vcHRpb25fbGlzdChidWZmZXJfcHRyKCZrLT5jZXJ0LT5jcml0aWNhbCksCi0JCSAgICBidWZmZXJfbGVuKCZrLT5jZXJ0LT5jcml0aWNhbCksIHB3LAotCQkgICAgT1BUSU9OU19DUklUSUNBTHxPUFRJT05TX0VYVEVOU0lPTlMsIDEsCi0JCSAgICAmY2VydF9ub19wb3J0X2ZvcndhcmRpbmdfZmxhZywKLQkJICAgICZjZXJ0X25vX2FnZW50X2ZvcndhcmRpbmdfZmxhZywKLQkJICAgICZjZXJ0X25vX3gxMV9mb3J3YXJkaW5nX2ZsYWcsCi0JCSAgICAmY2VydF9ub19wdHlfZmxhZywKLQkJICAgICZjZXJ0X25vX3VzZXJfcmMsCi0JCSAgICAmY2VydF9mb3JjZWRfY29tbWFuZCwKLQkJICAgICZjZXJ0X3NvdXJjZV9hZGRyZXNzX2RvbmUpID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0gZWxzZSB7Ci0JCS8qIFNlcGFyYXRlIG9wdGlvbnMgYW5kIGV4dGVuc2lvbnMgZm9yIHYwMSBjZXJ0cyAqLwotCQlpZiAocGFyc2Vfb3B0aW9uX2xpc3QoYnVmZmVyX3B0cigmay0+Y2VydC0+Y3JpdGljYWwpLAotCQkgICAgYnVmZmVyX2xlbigmay0+Y2VydC0+Y3JpdGljYWwpLCBwdywKLQkJICAgIE9QVElPTlNfQ1JJVElDQUwsIDEsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCSAgICAmY2VydF9mb3JjZWRfY29tbWFuZCwKLQkJICAgICZjZXJ0X3NvdXJjZV9hZGRyZXNzX2RvbmUpID09IC0xKQotCQkJcmV0dXJuIC0xOwotCQlpZiAocGFyc2Vfb3B0aW9uX2xpc3QoYnVmZmVyX3B0cigmay0+Y2VydC0+ZXh0ZW5zaW9ucyksCi0JCSAgICBidWZmZXJfbGVuKCZrLT5jZXJ0LT5leHRlbnNpb25zKSwgcHcsCi0JCSAgICBPUFRJT05TX0VYVEVOU0lPTlMsIDEsCi0JCSAgICAmY2VydF9ub19wb3J0X2ZvcndhcmRpbmdfZmxhZywKLQkJICAgICZjZXJ0X25vX2FnZW50X2ZvcndhcmRpbmdfZmxhZywKLQkJICAgICZjZXJ0X25vX3gxMV9mb3J3YXJkaW5nX2ZsYWcsCi0JCSAgICAmY2VydF9ub19wdHlfZmxhZywKLQkJICAgICZjZXJ0X25vX3VzZXJfcmMsCi0JCSAgICBOVUxMLCBOVUxMKSA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlub19wb3J0X2ZvcndhcmRpbmdfZmxhZyB8PSBjZXJ0X25vX3BvcnRfZm9yd2FyZGluZ19mbGFnOwotCW5vX2FnZW50X2ZvcndhcmRpbmdfZmxhZyB8PSBjZXJ0X25vX2FnZW50X2ZvcndhcmRpbmdfZmxhZzsKLQlub194MTFfZm9yd2FyZGluZ19mbGFnIHw9IGNlcnRfbm9feDExX2ZvcndhcmRpbmdfZmxhZzsKLQlub19wdHlfZmxhZyB8PSBjZXJ0X25vX3B0eV9mbGFnOwotCW5vX3VzZXJfcmMgfD0gY2VydF9ub191c2VyX3JjOwotCS8qIENBLXNwZWNpZmllZCBmb3JjZWQgY29tbWFuZCBzdXBlcnNlZGVzIGtleSBvcHRpb24gKi8KLQlpZiAoY2VydF9mb3JjZWRfY29tbWFuZCAhPSBOVUxMKSB7Ci0JCWlmIChmb3JjZWRfY29tbWFuZCAhPSBOVUxMKQotCQkJeGZyZWUoZm9yY2VkX2NvbW1hbmQpOwotCQlmb3JjZWRfY29tbWFuZCA9IGNlcnRfZm9yY2VkX2NvbW1hbmQ7Ci0JfQotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9hdXRoLW9wdGlvbnMuaCBiL2F1dGgtb3B0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDU1Yzk0Li4wMDAwMDAwCi0tLSBhL2F1dGgtb3B0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGF1dGgtb3B0aW9ucy5oLHYgMS4yMCAyMDEwLzA1LzA3IDExOjMwOjI5IGRqbSBFeHAgJCAqLwotCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLQotI2lmbmRlZiBBVVRIX09QVElPTlNfSAotI2RlZmluZSBBVVRIX09QVElPTlNfSAotCi0vKiBMaW5rZWQgbGlzdCBvZiBjdXN0b20gZW52aXJvbm1lbnQgc3RyaW5ncyAqLwotc3RydWN0IGVudnN0cmluZyB7Ci0Jc3RydWN0IGVudnN0cmluZyAqbmV4dDsKLQljaGFyICAgKnM7Ci19OwotCi0vKiBGbGFncyB0aGF0IG1heSBiZSBzZXQgaW4gYXV0aG9yaXplZF9rZXlzIG9wdGlvbnMuICovCi1leHRlcm4gaW50IG5vX3BvcnRfZm9yd2FyZGluZ19mbGFnOwotZXh0ZXJuIGludCBub19hZ2VudF9mb3J3YXJkaW5nX2ZsYWc7Ci1leHRlcm4gaW50IG5vX3gxMV9mb3J3YXJkaW5nX2ZsYWc7Ci1leHRlcm4gaW50IG5vX3B0eV9mbGFnOwotZXh0ZXJuIGludCBub191c2VyX3JjOwotZXh0ZXJuIGNoYXIgKmZvcmNlZF9jb21tYW5kOwotZXh0ZXJuIHN0cnVjdCBlbnZzdHJpbmcgKmN1c3RvbV9lbnZpcm9ubWVudDsKLWV4dGVybiBpbnQgZm9yY2VkX3R1bl9kZXZpY2U7Ci1leHRlcm4gaW50IGtleV9pc19jZXJ0X2F1dGhvcml0eTsKLWV4dGVybiBjaGFyICphdXRob3JpemVkX3ByaW5jaXBhbHM7Ci0KLWludAlhdXRoX3BhcnNlX29wdGlvbnMoc3RydWN0IHBhc3N3ZCAqLCBjaGFyICosIGNoYXIgKiwgdV9sb25nKTsKLXZvaWQJYXV0aF9jbGVhcl9vcHRpb25zKHZvaWQpOwotaW50CWF1dGhfY2VydF9vcHRpb25zKEtleSAqLCBzdHJ1Y3QgcGFzc3dkICopOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2F1dGgtcGFtLmMgYi9hdXRoLXBhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzUwMDZlLi4wMDAwMDAwCi0tLSBhL2F1dGgtcGFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIxICswLDAgQEAKLS8qLQotICogQ29weXJpZ2h0IChjKSAyMDAyIE5ldHdvcmtzIEFzc29jaWF0ZXMgVGVjaG5vbG9neSwgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQgZm9yIHRoZSBGcmVlQlNEIFByb2plY3QgYnkgVGhpbmtTZWMgQVMgYW5kCi0gKiBOQUkgTGFicywgdGhlIFNlY3VyaXR5IFJlc2VhcmNoIERpdmlzaW9uIG9mIE5ldHdvcmsgQXNzb2NpYXRlcywgSW5jLgotICogdW5kZXIgREFSUEEvU1BBV0FSIGNvbnRyYWN0IE42NjAwMS0wMS1DLTgwMzUgKCJDQk9TUyIpLCBhcyBwYXJ0IG9mIHRoZQotICogREFSUEEgQ0hBVFMgcmVzZWFyY2ggcHJvZ3JhbS4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywyMDA0IERhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4KLSAqIENvcHlyaWdodCAoYykgMjAwMywyMDA0IERhcnJlbiBUdWNrZXIgPGR0dWNrZXJAemlwLmNvbS5hdT4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0vKiBCYXNlZCBvbiAkRnJlZUJTRDogc3JjL2NyeXB0by9vcGVuc3NoL2F1dGgyLXBhbS1mcmVlYnNkLmMsdiAxLjExIDIwMDMvMDMvMzEgMTM6NDg6MTggZGVzIEV4cCAkICovCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpZmRlZiBVU0VfUEFNCi0jaWYgZGVmaW5lZChIQVZFX1NFQ1VSSVRZX1BBTV9BUFBMX0gpCi0jaW5jbHVkZSA8c2VjdXJpdHkvcGFtX2FwcGwuaD4KLSNlbGlmIGRlZmluZWQgKEhBVkVfUEFNX1BBTV9BUFBMX0gpCi0jaW5jbHVkZSA8cGFtL3BhbV9hcHBsLmg+Ci0jZW5kaWYKLQotLyogT3Blbkdyb3VwIFJGQzg2LjAgYW5kIFhTU08gc3BlY2lmeSBubyAiY29uc3QiIG9uIGFyZ3VtZW50cyAqLwotI2lmZGVmIFBBTV9TVU5fQ09ERUJBU0UKLSMgZGVmaW5lIHNzaHBhbV9jb25zdAkJLyogU29sYXJpcywgSFAtVVgsIEFJWCAqLwotI2Vsc2UKLSMgZGVmaW5lIHNzaHBhbV9jb25zdAljb25zdAkvKiBMaW51eFBBTSwgT3BlblBBTSAqLwotI2VuZGlmCi0KLS8qIEFtYmlndWl0eSBpbiBzcGVjOiBpcyBpdCBhbiBhcnJheSBvZiBwb2ludGVycyBvciBhIHBvaW50ZXIgdG8gYW4gYXJyYXk/ICovCi0jaWZkZWYgUEFNX1NVTl9DT0RFQkFTRQotIyBkZWZpbmUgUEFNX01TR19NRU1CRVIobXNnLCBuLCBtZW1iZXIpICgoKihtc2cpKVsobildLm1lbWJlcikKLSNlbHNlCi0jIGRlZmluZSBQQU1fTVNHX01FTUJFUihtc2csIG4sIG1lbWJlcikgKChtc2cpWyhuKV0tPm1lbWJlcikKLSNlbmRpZgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgImF1dGgtcGFtLmgiCi0jaW5jbHVkZSAiY2Fub2hvc3QuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJtc2cuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAic2VydmNvbmYuaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0jaW5jbHVkZSAiYXV0aC1vcHRpb25zLmgiCi0jaWZkZWYgR1NTQVBJCi0jaW5jbHVkZSAic3NoLWdzcy5oIgotI2VuZGlmCi0jaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCi0KLWV4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7Ci1leHRlcm4gQnVmZmVyIGxvZ2lubXNnOwotZXh0ZXJuIGludCBjb21wYXQyMDsKLWV4dGVybiB1X2ludCB1dG1wX2xlbjsKLQotLyogc28gd2UgZG9uJ3Qgc2lsZW50bHkgY2hhbmdlIGJlaGF2aW91ciAqLwotI2lmZGVmIFVTRV9QT1NJWF9USFJFQURTCi0jIGVycm9yICJVU0VfUE9TSVhfVEhSRUFEUyByZXBsYWNlZCBieSBVTlNVUFBPUlRFRF9QT1NJWF9USFJFQURTX0hBQ0siCi0jZW5kaWYKLQotLyoKLSAqIEZvcm1lcmx5IGtub3duIGFzIFVTRV9QT1NJWF9USFJFQURTLCB1c2luZyB0aGlzIGlzIGNvbXBsZXRlbHkgdW5zdXBwb3J0ZWQKLSAqIGFuZCBnZW5lcmFsbHkgYSBiYWQgaWRlYS4gIFVzZSBhdCBvd24gcmlzayBhbmQgZG8gbm90IGV4cGVjdCBzdXBwb3J0IGlmCi0gKiB0aGlzIGJyZWFrcy4KLSAqLwotI2lmZGVmIFVOU1VQUE9SVEVEX1BPU0lYX1RIUkVBRFNfSEFDSwotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLS8qCi0gKiBBdm9pZCBuYW1lc3BhY2UgY2xhc2ggd2hlbiAqbm90KiB1c2luZyBwdGhyZWFkcyBmb3Igc3lzdGVtcyAqd2l0aCoKLSAqIHB0aHJlYWRzLCB3aGljaCB1bmNvbmRpdGlvbmFsbHkgZGVmaW5lIHB0aHJlYWRfdCB2aWEgc3lzL3R5cGVzLmgKLSAqIChlLmcuIExpbnV4KQotICovCi10eXBlZGVmIHB0aHJlYWRfdCBzcF9wdGhyZWFkX3Q7Ci0jZWxzZQotdHlwZWRlZiBwaWRfdCBzcF9wdGhyZWFkX3Q7Ci0jZW5kaWYKLQotc3RydWN0IHBhbV9jdHh0IHsKLQlzcF9wdGhyZWFkX3QJIHBhbV90aHJlYWQ7Ci0JaW50CQkgcGFtX3Bzb2NrOwotCWludAkJIHBhbV9jc29jazsKLQlpbnQJCSBwYW1fZG9uZTsKLX07Ci0KLXN0YXRpYyB2b2lkIHNzaHBhbV9mcmVlX2N0eCh2b2lkICopOwotc3RhdGljIHN0cnVjdCBwYW1fY3R4dCAqY2xlYW51cF9jdHh0OwotCi0jaWZuZGVmIFVOU1VQUE9SVEVEX1BPU0lYX1RIUkVBRFNfSEFDSwotLyoKLSAqIFNpbXVsYXRlIHRocmVhZHMgd2l0aCBwcm9jZXNzZXMuCi0gKi8KLQotc3RhdGljIGludCBzc2hwYW1fdGhyZWFkX3N0YXR1cyA9IC0xOwotc3RhdGljIG15c2lnX3Qgc3NocGFtX29sZHNpZzsKLQotc3RhdGljIHZvaWQKLXNzaHBhbV9zaWdjaGxkX2hhbmRsZXIoaW50IHNpZykKLXsKLQlzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7Ci0JaWYgKGNsZWFudXBfY3R4dCA9PSBOVUxMKQotCQlyZXR1cm47CS8qIGhhbmRsZXIgY2FsbGVkIGFmdGVyIFBBTSBjbGVhbnVwLCBzaG91bGRuJ3QgaGFwcGVuICovCi0JaWYgKHdhaXRwaWQoY2xlYW51cF9jdHh0LT5wYW1fdGhyZWFkLCAmc3NocGFtX3RocmVhZF9zdGF0dXMsIFdOT0hBTkcpCi0JICAgIDw9IDApIHsKLQkJLyogUEFNIHRocmVhZCBoYXMgbm90IGV4aXR0ZWQsIHByaXZzZXAgc2xhdmUgbXVzdCBoYXZlICovCi0JCWtpbGwoY2xlYW51cF9jdHh0LT5wYW1fdGhyZWFkLCBTSUdURVJNKTsKLQkJaWYgKHdhaXRwaWQoY2xlYW51cF9jdHh0LT5wYW1fdGhyZWFkLCAmc3NocGFtX3RocmVhZF9zdGF0dXMsIDApCi0JCSAgICA8PSAwKQotCQkJcmV0dXJuOyAvKiBjb3VsZCBub3Qgd2FpdCAqLwotCX0KLQlpZiAoV0lGU0lHTkFMRUQoc3NocGFtX3RocmVhZF9zdGF0dXMpICYmCi0JICAgIFdURVJNU0lHKHNzaHBhbV90aHJlYWRfc3RhdHVzKSA9PSBTSUdURVJNKQotCQlyZXR1cm47CS8qIHRlcm1pbmF0ZWQgYnkgcHRocmVhZF9jYW5jZWwgKi8KLQlpZiAoIVdJRkVYSVRFRChzc2hwYW1fdGhyZWFkX3N0YXR1cykpCi0JCXNpZ2RpZSgiUEFNOiBhdXRoZW50aWNhdGlvbiB0aHJlYWQgZXhpdGVkIHVuZXhwZWN0ZWRseSIpOwotCWlmIChXRVhJVFNUQVRVUyhzc2hwYW1fdGhyZWFkX3N0YXR1cykgIT0gMCkKLQkJc2lnZGllKCJQQU06IGF1dGhlbnRpY2F0aW9uIHRocmVhZCBleGl0ZWQgdW5jbGVhbmx5Iik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotcHRocmVhZF9leGl0KHZvaWQgKnZhbHVlKQotewotCV9leGl0KDApOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGludAotcHRocmVhZF9jcmVhdGUoc3BfcHRocmVhZF90ICp0aHJlYWQsIGNvbnN0IHZvaWQgKmF0dHIsCi0gICAgdm9pZCAqKCp0aHJlYWRfc3RhcnQpKHZvaWQgKiksIHZvaWQgKmFyZykKLXsKLQlwaWRfdCBwaWQ7Ci0Jc3RydWN0IHBhbV9jdHh0ICpjdHggPSBhcmc7Ci0KLQlzc2hwYW1fdGhyZWFkX3N0YXR1cyA9IC0xOwotCXN3aXRjaCAoKHBpZCA9IGZvcmsoKSkpIHsKLQljYXNlIC0xOgotCQllcnJvcigiZm9yaygpOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoLTEpOwotCWNhc2UgMDoKLQkJY2xvc2UoY3R4LT5wYW1fcHNvY2spOwotCQljdHgtPnBhbV9wc29jayA9IC0xOwotCQl0aHJlYWRfc3RhcnQoYXJnKTsKLQkJX2V4aXQoMSk7Ci0JZGVmYXVsdDoKLQkJKnRocmVhZCA9IHBpZDsKLQkJY2xvc2UoY3R4LT5wYW1fY3NvY2spOwotCQljdHgtPnBhbV9jc29jayA9IC0xOwotCQlzc2hwYW1fb2xkc2lnID0gc2lnbmFsKFNJR0NITEQsIHNzaHBhbV9zaWdjaGxkX2hhbmRsZXIpOwotCQlyZXR1cm4gKDApOwotCX0KLX0KLQotc3RhdGljIGludAotcHRocmVhZF9jYW5jZWwoc3BfcHRocmVhZF90IHRocmVhZCkKLXsKLQlzaWduYWwoU0lHQ0hMRCwgc3NocGFtX29sZHNpZyk7Ci0JcmV0dXJuIChraWxsKHRocmVhZCwgU0lHVEVSTSkpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGludAotcHRocmVhZF9qb2luKHNwX3B0aHJlYWRfdCB0aHJlYWQsIHZvaWQgKip2YWx1ZSkKLXsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKHNzaHBhbV90aHJlYWRfc3RhdHVzICE9IC0xKQotCQlyZXR1cm4gKHNzaHBhbV90aHJlYWRfc3RhdHVzKTsKLQlzaWduYWwoU0lHQ0hMRCwgc3NocGFtX29sZHNpZyk7Ci0Jd2FpdHBpZCh0aHJlYWQsICZzdGF0dXMsIDApOwotCXJldHVybiAoc3RhdHVzKTsKLX0KLSNlbmRpZgotCi0KLXN0YXRpYyBwYW1faGFuZGxlX3QgKnNzaHBhbV9oYW5kbGUgPSBOVUxMOwotc3RhdGljIGludCBzc2hwYW1fZXJyID0gMDsKLXN0YXRpYyBpbnQgc3NocGFtX2F1dGhlbnRpY2F0ZWQgPSAwOwotc3RhdGljIGludCBzc2hwYW1fc2Vzc2lvbl9vcGVuID0gMDsKLXN0YXRpYyBpbnQgc3NocGFtX2NyZWRfZXN0YWJsaXNoZWQgPSAwOwotc3RhdGljIGludCBzc2hwYW1fYWNjb3VudF9zdGF0dXMgPSAtMTsKLXN0YXRpYyBjaGFyICoqc3NocGFtX2VudiA9IE5VTEw7Ci1zdGF0aWMgQXV0aGN0eHQgKnNzaHBhbV9hdXRoY3R4dCA9IE5VTEw7Ci1zdGF0aWMgY29uc3QgY2hhciAqc3NocGFtX3Bhc3N3b3JkID0gTlVMTDsKLXN0YXRpYyBjaGFyIGJhZHB3W10gPSAiXGJcblxyXDE3N0lOQ09SUkVDVCI7Ci0KLS8qIFNvbWUgUEFNIGltcGxlbWVudGF0aW9ucyBkb24ndCBpbXBsZW1lbnQgdGhpcyAqLwotI2lmbmRlZiBIQVZFX1BBTV9HRVRFTlZMSVNUCi1zdGF0aWMgY2hhciAqKgotcGFtX2dldGVudmxpc3QocGFtX2hhbmRsZV90ICpwYW1oKQotewotCS8qCi0JICogWFhYIC0gSWYgbmVjZXNzYXJ5LCB3ZSBjYW4gc3RpbGwgc3VwcG9ydCBlbnZyaW9ubWVudCBwYXNzaW5nCi0JICogZm9yIHBsYXRmb3JtcyB3aXRob3V0IHBhbV9nZXRlbnZsaXN0IGJ5IHNlYXJjaGluZyBmb3Iga25vd24KLQkgKiBlbnYgdmFycyAoZS5nLiBLUkI1Q0NOQU1FKSBmcm9tIHRoZSBQQU0gZW52aXJvbm1lbnQuCi0JICovCi0JIHJldHVybiBOVUxMOwotfQotI2VuZGlmCi0KLS8qCi0gKiBTb21lIHBsYXRmb3Jtcywgbm90YWJseSBTb2xhcmlzLCBkbyBub3QgZW5mb3JjZSBwYXNzd29yZCBjb21wbGV4aXR5Ci0gKiBydWxlcyBkdXJpbmcgcGFtX2NoYXV0aHRvaygpIGlmIHRoZSByZWFsIHVpZCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzCi0gKiBpcyAwLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0J3MgYmVpbmcgY2FsbGVkIGJ5ICJwYXNzd2QiIHJ1biBieSByb290LgotICogVGhpcyB3cmFwcyBwYW1fY2hhdXRodG9rIGFuZCBzZXRzL3Jlc3RvcmUgdGhlIHJlYWwgdWlkIHNvIFBBTSB3aWxsIGRvCi0gKiB0aGUgcmlnaHQgdGhpbmcuCi0gKi8KLSNpZmRlZiBTU0hQQU1fQ0hBVVRIVE9LX05FRURTX1JVSUQKLXN0YXRpYyBpbnQKLXNzaHBhbV9jaGF1dGh0b2tfcnVpZChwYW1faGFuZGxlX3QgKnBhbWgsIGludCBmbGFncykKLXsKLQlpbnQgcmVzdWx0OwotCi0JaWYgKHNzaHBhbV9hdXRoY3R4dCA9PSBOVUxMKQotCQlmYXRhbCgiUEFNOiBzc2hwYW1fYXV0aGN0eHQgbm90IGluaXRpYWxpemVkIik7Ci0JaWYgKHNldHJldWlkKHNzaHBhbV9hdXRoY3R4dC0+cHctPnB3X3VpZCwgLTEpID09IC0xKQotCQlmYXRhbCgiJXM6IHNldHJldWlkIGZhaWxlZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQlyZXN1bHQgPSBwYW1fY2hhdXRodG9rKHBhbWgsIGZsYWdzKTsKLQlpZiAoc2V0cmV1aWQoMCwgLTEpID09IC0xKQotCQlmYXRhbCgiJXM6IHNldHJldWlkIGZhaWxlZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotIyBkZWZpbmUgcGFtX2NoYXV0aHRvayhhLGIpCShzc2hwYW1fY2hhdXRodG9rX3J1aWQoKGEpLCAoYikpKQotI2VuZGlmCi0KLXZvaWQKLXNzaHBhbV9wYXNzd29yZF9jaGFuZ2VfcmVxdWlyZWQoaW50IHJlcWQpCi17Ci0JZGVidWczKCIlcyAlZCIsIF9fZnVuY19fLCByZXFkKTsKLQlpZiAoc3NocGFtX2F1dGhjdHh0ID09IE5VTEwpCi0JCWZhdGFsKCIlczogUEFNIGF1dGhjdHh0IG5vdCBpbml0aWFsaXplZCIsIF9fZnVuY19fKTsKLQlzc2hwYW1fYXV0aGN0eHQtPmZvcmNlX3B3Y2hhbmdlID0gcmVxZDsKLQlpZiAocmVxZCkgewotCQlub19wb3J0X2ZvcndhcmRpbmdfZmxhZyB8PSAyOwotCQlub19hZ2VudF9mb3J3YXJkaW5nX2ZsYWcgfD0gMjsKLQkJbm9feDExX2ZvcndhcmRpbmdfZmxhZyB8PSAyOwotCX0gZWxzZSB7Ci0JCW5vX3BvcnRfZm9yd2FyZGluZ19mbGFnICY9IH4yOwotCQlub19hZ2VudF9mb3J3YXJkaW5nX2ZsYWcgJj0gfjI7Ci0JCW5vX3gxMV9mb3J3YXJkaW5nX2ZsYWcgJj0gfjI7Ci0JfQotfQotCi0vKiBJbXBvcnQgcmVndWxhciBhbmQgUEFNIGVudmlyb25tZW50IGZyb20gc3VicHJvY2VzcyAqLwotc3RhdGljIHZvaWQKLWltcG9ydF9lbnZpcm9ubWVudHMoQnVmZmVyICpiKQotewotCWNoYXIgKmVudjsKLQl1X2ludCBpLCBudW1fZW52OwotCWludCBlcnI7Ci0KLQlkZWJ1ZzMoIlBBTTogJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLSNpZm5kZWYgVU5TVVBQT1JURURfUE9TSVhfVEhSRUFEU19IQUNLCi0JLyogSW1wb3J0IHZhcmlhYmxlcyBzZXQgYnkgZG9fcGFtX2FjY291bnQgKi8KLQlzc2hwYW1fYWNjb3VudF9zdGF0dXMgPSBidWZmZXJfZ2V0X2ludChiKTsKLQlzc2hwYW1fcGFzc3dvcmRfY2hhbmdlX3JlcXVpcmVkKGJ1ZmZlcl9nZXRfaW50KGIpKTsKLQotCS8qIEltcG9ydCBlbnZpcm9ubWVudCBmcm9tIHN1YnByb2Nlc3MgKi8KLQludW1fZW52ID0gYnVmZmVyX2dldF9pbnQoYik7Ci0JaWYgKG51bV9lbnYgPiAxMDI0KQotCQlmYXRhbCgiJXM6IHJlY2VpdmVkICV1IGVudmlyb25tZW50IHZhcmlhYmxlcywgZXhwZWN0ZWQgPD0gMTAyNCIsCi0JCSAgICBfX2Z1bmNfXywgbnVtX2Vudik7Ci0Jc3NocGFtX2VudiA9IHhjYWxsb2MobnVtX2VudiArIDEsIHNpemVvZigqc3NocGFtX2VudikpOwotCWRlYnVnMygiUEFNOiBudW0gZW52IHN0cmluZ3MgJWQiLCBudW1fZW52KTsKLQlmb3IoaSA9IDA7IGkgPCBudW1fZW52OyBpKyspCi0JCXNzaHBhbV9lbnZbaV0gPSBidWZmZXJfZ2V0X3N0cmluZyhiLCBOVUxMKTsKLQotCXNzaHBhbV9lbnZbbnVtX2Vudl0gPSBOVUxMOwotCi0JLyogSW1wb3J0IFBBTSBlbnZpcm9ubWVudCBmcm9tIHN1YnByb2Nlc3MgKi8KLQludW1fZW52ID0gYnVmZmVyX2dldF9pbnQoYik7Ci0JZGVidWcoIlBBTTogbnVtIFBBTSBlbnYgc3RyaW5ncyAlZCIsIG51bV9lbnYpOwotCWZvcihpID0gMDsgaSA8IG51bV9lbnY7IGkrKykgewotCQllbnYgPSBidWZmZXJfZ2V0X3N0cmluZyhiLCBOVUxMKTsKLQotI2lmZGVmIEhBVkVfUEFNX1BVVEVOVgotCQkvKiBFcnJvcnMgYXJlIG5vdCBmYXRhbCBoZXJlICovCi0JCWlmICgoZXJyID0gcGFtX3B1dGVudihzc2hwYW1faGFuZGxlLCBlbnYpKSAhPSBQQU1fU1VDQ0VTUykgewotCQkJZXJyb3IoIlBBTTogcGFtX3B1dGVudjogJXMiLAotCQkJICAgIHBhbV9zdHJlcnJvcihzc2hwYW1faGFuZGxlLCBzc2hwYW1fZXJyKSk7Ci0JCX0KLSNlbmRpZgotCX0KLSNlbmRpZgotfQotCi0vKgotICogQ29udmVyc2F0aW9uIGZ1bmN0aW9uIGZvciBhdXRoZW50aWNhdGlvbiB0aHJlYWQuCi0gKi8KLXN0YXRpYyBpbnQKLXNzaHBhbV90aHJlYWRfY29udihpbnQgbiwgc3NocGFtX2NvbnN0IHN0cnVjdCBwYW1fbWVzc2FnZSAqKm1zZywKLSAgICBzdHJ1Y3QgcGFtX3Jlc3BvbnNlICoqcmVzcCwgdm9pZCAqZGF0YSkKLXsKLQlCdWZmZXIgYnVmZmVyOwotCXN0cnVjdCBwYW1fY3R4dCAqY3R4dDsKLQlzdHJ1Y3QgcGFtX3Jlc3BvbnNlICpyZXBseTsKLQlpbnQgaTsKLQotCWRlYnVnMygiUEFNOiAlcyBlbnRlcmluZywgJWQgbWVzc2FnZXMiLCBfX2Z1bmNfXywgbik7Ci0JKnJlc3AgPSBOVUxMOwotCi0JaWYgKGRhdGEgPT0gTlVMTCkgewotCQllcnJvcigiUEFNOiBjb252ZXJzYXRpb24gZnVuY3Rpb24gcGFzc2VkIGEgbnVsbCBjb250ZXh0Iik7Ci0JCXJldHVybiAoUEFNX0NPTlZfRVJSKTsKLQl9Ci0JY3R4dCA9IGRhdGE7Ci0JaWYgKG4gPD0gMCB8fCBuID4gUEFNX01BWF9OVU1fTVNHKQotCQlyZXR1cm4gKFBBTV9DT05WX0VSUik7Ci0KLQlpZiAoKHJlcGx5ID0gY2FsbG9jKG4sIHNpemVvZigqcmVwbHkpKSkgPT0gTlVMTCkKLQkJcmV0dXJuIChQQU1fQ09OVl9FUlIpOwotCi0JYnVmZmVyX2luaXQoJmJ1ZmZlcik7Ci0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlzd2l0Y2ggKFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnX3N0eWxlKSkgewotCQljYXNlIFBBTV9QUk9NUFRfRUNIT19PRkY6Ci0JCQlidWZmZXJfcHV0X2NzdHJpbmcoJmJ1ZmZlciwKLQkJCSAgICBQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZykpOwotCQkJaWYgKHNzaF9tc2dfc2VuZChjdHh0LT5wYW1fY3NvY2ssCi0JCQkgICAgUEFNX01TR19NRU1CRVIobXNnLCBpLCBtc2dfc3R5bGUpLCAmYnVmZmVyKSA9PSAtMSkKLQkJCQlnb3RvIGZhaWw7Ci0JCQlpZiAoc3NoX21zZ19yZWN2KGN0eHQtPnBhbV9jc29jaywgJmJ1ZmZlcikgPT0gLTEpCi0JCQkJZ290byBmYWlsOwotCQkJaWYgKGJ1ZmZlcl9nZXRfY2hhcigmYnVmZmVyKSAhPSBQQU1fQVVUSFRPSykKLQkJCQlnb3RvIGZhaWw7Ci0JCQlyZXBseVtpXS5yZXNwID0gYnVmZmVyX2dldF9zdHJpbmcoJmJ1ZmZlciwgTlVMTCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQQU1fUFJPTVBUX0VDSE9fT046Ci0JCQlidWZmZXJfcHV0X2NzdHJpbmcoJmJ1ZmZlciwKLQkJCSAgICBQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZykpOwotCQkJaWYgKHNzaF9tc2dfc2VuZChjdHh0LT5wYW1fY3NvY2ssCi0JCQkgICAgUEFNX01TR19NRU1CRVIobXNnLCBpLCBtc2dfc3R5bGUpLCAmYnVmZmVyKSA9PSAtMSkKLQkJCQlnb3RvIGZhaWw7Ci0JCQlpZiAoc3NoX21zZ19yZWN2KGN0eHQtPnBhbV9jc29jaywgJmJ1ZmZlcikgPT0gLTEpCi0JCQkJZ290byBmYWlsOwotCQkJaWYgKGJ1ZmZlcl9nZXRfY2hhcigmYnVmZmVyKSAhPSBQQU1fQVVUSFRPSykKLQkJCQlnb3RvIGZhaWw7Ci0JCQlyZXBseVtpXS5yZXNwID0gYnVmZmVyX2dldF9zdHJpbmcoJmJ1ZmZlciwgTlVMTCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQQU1fRVJST1JfTVNHOgotCQkJYnVmZmVyX3B1dF9jc3RyaW5nKCZidWZmZXIsCi0JCQkgICAgUEFNX01TR19NRU1CRVIobXNnLCBpLCBtc2cpKTsKLQkJCWlmIChzc2hfbXNnX3NlbmQoY3R4dC0+cGFtX2Nzb2NrLAotCQkJICAgIFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnX3N0eWxlKSwgJmJ1ZmZlcikgPT0gLTEpCi0JCQkJZ290byBmYWlsOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEFNX1RFWFRfSU5GTzoKLQkJCWJ1ZmZlcl9wdXRfY3N0cmluZygmYnVmZmVyLAotCQkJICAgIFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnKSk7Ci0JCQlpZiAoc3NoX21zZ19zZW5kKGN0eHQtPnBhbV9jc29jaywKLQkJCSAgICBQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZ19zdHlsZSksICZidWZmZXIpID09IC0xKQotCQkJCWdvdG8gZmFpbDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZ290byBmYWlsOwotCQl9Ci0JCWJ1ZmZlcl9jbGVhcigmYnVmZmVyKTsKLQl9Ci0JYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7Ci0JKnJlc3AgPSByZXBseTsKLQlyZXR1cm4gKFBBTV9TVUNDRVNTKTsKLQotIGZhaWw6Ci0JZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWlmIChyZXBseVtpXS5yZXNwICE9IE5VTEwpCi0JCQl4ZnJlZShyZXBseVtpXS5yZXNwKTsKLQl9Ci0JeGZyZWUocmVwbHkpOwotCWJ1ZmZlcl9mcmVlKCZidWZmZXIpOwotCXJldHVybiAoUEFNX0NPTlZfRVJSKTsKLX0KLQotLyoKLSAqIEF1dGhlbnRpY2F0aW9uIHRocmVhZC4KLSAqLwotc3RhdGljIHZvaWQgKgotc3NocGFtX3RocmVhZCh2b2lkICpjdHh0cCkKLXsKLQlzdHJ1Y3QgcGFtX2N0eHQgKmN0eHQgPSBjdHh0cDsKLQlCdWZmZXIgYnVmZmVyOwotCXN0cnVjdCBwYW1fY29udiBzc2hwYW1fY29udjsKLQlpbnQgZmxhZ3MgPSAob3B0aW9ucy5wZXJtaXRfZW1wdHlfcGFzc3dkID09IDAgPwotCSAgICBQQU1fRElTQUxMT1dfTlVMTF9BVVRIVE9LIDogMCk7Ci0jaWZuZGVmIFVOU1VQUE9SVEVEX1BPU0lYX1RIUkVBRFNfSEFDSwotCWV4dGVybiBjaGFyICoqZW52aXJvbjsKLQljaGFyICoqZW52X2Zyb21fcGFtOwotCXVfaW50IGk7Ci0JY29uc3QgY2hhciAqcGFtX3VzZXI7Ci0JY29uc3QgY2hhciAqKnB0cl9wYW1fdXNlciA9ICZwYW1fdXNlcjsKLQljaGFyICp0eiA9IGdldGVudigiVFoiKTsKLQotCXBhbV9nZXRfaXRlbShzc2hwYW1faGFuZGxlLCBQQU1fVVNFUiwKLQkgICAgKHNzaHBhbV9jb25zdCB2b2lkICoqKXB0cl9wYW1fdXNlcik7Ci0KLQllbnZpcm9uWzBdID0gTlVMTDsKLQlpZiAodHogIT0gTlVMTCkKLQkJaWYgKHNldGVudigiVFoiLCB0eiwgMSkgPT0gLTEpCi0JCQllcnJvcigiUEFNOiBjb3VsZCBub3Qgc2V0IFRaIGVudmlyb25tZW50OiAlcyIsCi0JCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQotCWlmIChzc2hwYW1fYXV0aGN0eHQgIT0gTlVMTCkgewotCQlzZXRwcm9jdGl0bGUoIiVzIFtwYW1dIiwKLQkJICAgIHNzaHBhbV9hdXRoY3R4dC0+dmFsaWQgPyBwYW1fdXNlciA6ICJ1bmtub3duIik7Ci0JfQotI2VuZGlmCi0KLQlzc2hwYW1fY29udi5jb252ID0gc3NocGFtX3RocmVhZF9jb252OwotCXNzaHBhbV9jb252LmFwcGRhdGFfcHRyID0gY3R4dDsKLQotCWlmIChzc2hwYW1fYXV0aGN0eHQgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBQQU0gYXV0aGN0eHQgbm90IGluaXRpYWxpemVkIiwgX19mdW5jX18pOwotCi0JYnVmZmVyX2luaXQoJmJ1ZmZlcik7Ci0Jc3NocGFtX2VyciA9IHBhbV9zZXRfaXRlbShzc2hwYW1faGFuZGxlLCBQQU1fQ09OViwKLQkgICAgKGNvbnN0IHZvaWQgKikmc3NocGFtX2NvbnYpOwotCWlmIChzc2hwYW1fZXJyICE9IFBBTV9TVUNDRVNTKQotCQlnb3RvIGF1dGhfZmFpbDsKLQlzc2hwYW1fZXJyID0gcGFtX2F1dGhlbnRpY2F0ZShzc2hwYW1faGFuZGxlLCBmbGFncyk7Ci0JaWYgKHNzaHBhbV9lcnIgIT0gUEFNX1NVQ0NFU1MpCi0JCWdvdG8gYXV0aF9mYWlsOwotCi0JaWYgKGNvbXBhdDIwKSB7Ci0JCWlmICghZG9fcGFtX2FjY291bnQoKSkgewotCQkJc3NocGFtX2VyciA9IFBBTV9BQ0NUX0VYUElSRUQ7Ci0JCQlnb3RvIGF1dGhfZmFpbDsKLQkJfQotCQlpZiAoc3NocGFtX2F1dGhjdHh0LT5mb3JjZV9wd2NoYW5nZSkgewotCQkJc3NocGFtX2VyciA9IHBhbV9jaGF1dGh0b2soc3NocGFtX2hhbmRsZSwKLQkJCSAgICBQQU1fQ0hBTkdFX0VYUElSRURfQVVUSFRPSyk7Ci0JCQlpZiAoc3NocGFtX2VyciAhPSBQQU1fU1VDQ0VTUykKLQkJCQlnb3RvIGF1dGhfZmFpbDsKLQkJCXNzaHBhbV9wYXNzd29yZF9jaGFuZ2VfcmVxdWlyZWQoMCk7Ci0JCX0KLQl9Ci0KLQlidWZmZXJfcHV0X2NzdHJpbmcoJmJ1ZmZlciwgIk9LIik7Ci0KLSNpZm5kZWYgVU5TVVBQT1JURURfUE9TSVhfVEhSRUFEU19IQUNLCi0JLyogRXhwb3J0IHZhcmlhYmxlcyBzZXQgYnkgZG9fcGFtX2FjY291bnQgKi8KLQlidWZmZXJfcHV0X2ludCgmYnVmZmVyLCBzc2hwYW1fYWNjb3VudF9zdGF0dXMpOwotCWJ1ZmZlcl9wdXRfaW50KCZidWZmZXIsIHNzaHBhbV9hdXRoY3R4dC0+Zm9yY2VfcHdjaGFuZ2UpOwotCi0JLyogRXhwb3J0IGFueSBlbnZpcm9ubWVudCBzdHJpbmdzIHNldCBpbiBjaGlsZCAqLwotCWZvcihpID0gMDsgZW52aXJvbltpXSAhPSBOVUxMOyBpKyspCi0JCTsgLyogQ291bnQgKi8KLQlidWZmZXJfcHV0X2ludCgmYnVmZmVyLCBpKTsKLQlmb3IoaSA9IDA7IGVudmlyb25baV0gIT0gTlVMTDsgaSsrKQotCQlidWZmZXJfcHV0X2NzdHJpbmcoJmJ1ZmZlciwgZW52aXJvbltpXSk7Ci0KLQkvKiBFeHBvcnQgYW55IGVudmlyb25tZW50IHN0cmluZ3Mgc2V0IGJ5IFBBTSBpbiBjaGlsZCAqLwotCWVudl9mcm9tX3BhbSA9IHBhbV9nZXRlbnZsaXN0KHNzaHBhbV9oYW5kbGUpOwotCWZvcihpID0gMDsgZW52X2Zyb21fcGFtICE9IE5VTEwgJiYgZW52X2Zyb21fcGFtW2ldICE9IE5VTEw7IGkrKykKLQkJOyAvKiBDb3VudCAqLwotCWJ1ZmZlcl9wdXRfaW50KCZidWZmZXIsIGkpOwotCWZvcihpID0gMDsgZW52X2Zyb21fcGFtICE9IE5VTEwgJiYgZW52X2Zyb21fcGFtW2ldICE9IE5VTEw7IGkrKykKLQkJYnVmZmVyX3B1dF9jc3RyaW5nKCZidWZmZXIsIGVudl9mcm9tX3BhbVtpXSk7Ci0jZW5kaWYgLyogVU5TVVBQT1JURURfUE9TSVhfVEhSRUFEU19IQUNLICovCi0KLQkvKiBYWFggLSBjYW4ndCBkbyBtdWNoIGFib3V0IGFuIGVycm9yIGhlcmUgKi8KLQlzc2hfbXNnX3NlbmQoY3R4dC0+cGFtX2Nzb2NrLCBzc2hwYW1fZXJyLCAmYnVmZmVyKTsKLQlidWZmZXJfZnJlZSgmYnVmZmVyKTsKLQlwdGhyZWFkX2V4aXQoTlVMTCk7Ci0KLSBhdXRoX2ZhaWw6Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZidWZmZXIsCi0JICAgIHBhbV9zdHJlcnJvcihzc2hwYW1faGFuZGxlLCBzc2hwYW1fZXJyKSk7Ci0JLyogWFhYIC0gY2FuJ3QgZG8gbXVjaCBhYm91dCBhbiBlcnJvciBoZXJlICovCi0JaWYgKHNzaHBhbV9lcnIgPT0gUEFNX0FDQ1RfRVhQSVJFRCkKLQkJc3NoX21zZ19zZW5kKGN0eHQtPnBhbV9jc29jaywgUEFNX0FDQ1RfRVhQSVJFRCwgJmJ1ZmZlcik7Ci0JZWxzZQotCQlzc2hfbXNnX3NlbmQoY3R4dC0+cGFtX2Nzb2NrLCBQQU1fQVVUSF9FUlIsICZidWZmZXIpOwotCWJ1ZmZlcl9mcmVlKCZidWZmZXIpOwotCXB0aHJlYWRfZXhpdChOVUxMKTsKLQotCXJldHVybiAoTlVMTCk7IC8qIEF2b2lkIHdhcm5pbmcgZm9yIG5vbi1wdGhyZWFkIGNhc2UgKi8KLX0KLQotdm9pZAotc3NocGFtX3RocmVhZF9jbGVhbnVwKHZvaWQpCi17Ci0Jc3RydWN0IHBhbV9jdHh0ICpjdHh0ID0gY2xlYW51cF9jdHh0OwotCi0JZGVidWczKCJQQU06ICVzIGVudGVyaW5nIiwgX19mdW5jX18pOwotCWlmIChjdHh0ICE9IE5VTEwgJiYgY3R4dC0+cGFtX3RocmVhZCAhPSAwKSB7Ci0JCXB0aHJlYWRfY2FuY2VsKGN0eHQtPnBhbV90aHJlYWQpOwotCQlwdGhyZWFkX2pvaW4oY3R4dC0+cGFtX3RocmVhZCwgTlVMTCk7Ci0JCWNsb3NlKGN0eHQtPnBhbV9wc29jayk7Ci0JCWNsb3NlKGN0eHQtPnBhbV9jc29jayk7Ci0JCW1lbXNldChjdHh0LCAwLCBzaXplb2YoKmN0eHQpKTsKLQkJY2xlYW51cF9jdHh0ID0gTlVMTDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLXNzaHBhbV9udWxsX2NvbnYoaW50IG4sIHNzaHBhbV9jb25zdCBzdHJ1Y3QgcGFtX21lc3NhZ2UgKiptc2csCi0gICAgc3RydWN0IHBhbV9yZXNwb25zZSAqKnJlc3AsIHZvaWQgKmRhdGEpCi17Ci0JZGVidWczKCJQQU06ICVzIGVudGVyaW5nLCAlZCBtZXNzYWdlcyIsIF9fZnVuY19fLCBuKTsKLQlyZXR1cm4gKFBBTV9DT05WX0VSUik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFtX2NvbnYgbnVsbF9jb252ID0geyBzc2hwYW1fbnVsbF9jb252LCBOVUxMIH07Ci0KLXN0YXRpYyBpbnQKLXNzaHBhbV9zdG9yZV9jb252KGludCBuLCBzc2hwYW1fY29uc3Qgc3RydWN0IHBhbV9tZXNzYWdlICoqbXNnLAotICAgIHN0cnVjdCBwYW1fcmVzcG9uc2UgKipyZXNwLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBwYW1fcmVzcG9uc2UgKnJlcGx5OwotCWludCBpOwotCXNpemVfdCBsZW47Ci0KLQlkZWJ1ZzMoIlBBTTogJXMgY2FsbGVkIHdpdGggJWQgbWVzc2FnZXMiLCBfX2Z1bmNfXywgbik7Ci0JKnJlc3AgPSBOVUxMOwotCi0JaWYgKG4gPD0gMCB8fCBuID4gUEFNX01BWF9OVU1fTVNHKQotCQlyZXR1cm4gKFBBTV9DT05WX0VSUik7Ci0KLQlpZiAoKHJlcGx5ID0gY2FsbG9jKG4sIHNpemVvZigqcmVwbHkpKSkgPT0gTlVMTCkKLQkJcmV0dXJuIChQQU1fQ09OVl9FUlIpOwotCi0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlzd2l0Y2ggKFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnX3N0eWxlKSkgewotCQljYXNlIFBBTV9FUlJPUl9NU0c6Ci0JCWNhc2UgUEFNX1RFWFRfSU5GTzoKLQkJCWxlbiA9IHN0cmxlbihQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZykpOwotCQkJYnVmZmVyX2FwcGVuZCgmbG9naW5tc2csIFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnKSwgbGVuKTsKLQkJCWJ1ZmZlcl9hcHBlbmQoJmxvZ2lubXNnLCAiXG4iLCAxICk7Ci0JCQlyZXBseVtpXS5yZXNwX3JldGNvZGUgPSBQQU1fU1VDQ0VTUzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCSpyZXNwID0gcmVwbHk7Ci0JcmV0dXJuIChQQU1fU1VDQ0VTUyk7Ci0KLSBmYWlsOgotCWZvcihpID0gMDsgaSA8IG47IGkrKykgewotCQlpZiAocmVwbHlbaV0ucmVzcCAhPSBOVUxMKQotCQkJeGZyZWUocmVwbHlbaV0ucmVzcCk7Ci0JfQotCXhmcmVlKHJlcGx5KTsKLQlyZXR1cm4gKFBBTV9DT05WX0VSUik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFtX2NvbnYgc3RvcmVfY29udiA9IHsgc3NocGFtX3N0b3JlX2NvbnYsIE5VTEwgfTsKLQotdm9pZAotc3NocGFtX2NsZWFudXAodm9pZCkKLXsKLQlpZiAoc3NocGFtX2hhbmRsZSA9PSBOVUxMIHx8ICh1c2VfcHJpdnNlcCAmJiAhbW1faXNfbW9uaXRvcigpKSkKLQkJcmV0dXJuOwotCWRlYnVnKCJQQU06IGNsZWFudXAiKTsKLQlwYW1fc2V0X2l0ZW0oc3NocGFtX2hhbmRsZSwgUEFNX0NPTlYsIChjb25zdCB2b2lkICopJm51bGxfY29udik7Ci0JaWYgKHNzaHBhbV9zZXNzaW9uX29wZW4pIHsKLQkJZGVidWcoIlBBTTogY2xvc2luZyBzZXNzaW9uIik7Ci0JCXBhbV9jbG9zZV9zZXNzaW9uKHNzaHBhbV9oYW5kbGUsIFBBTV9TSUxFTlQpOwotCQlzc2hwYW1fc2Vzc2lvbl9vcGVuID0gMDsKLQl9Ci0JaWYgKHNzaHBhbV9jcmVkX2VzdGFibGlzaGVkKSB7Ci0JCWRlYnVnKCJQQU06IGRlbGV0aW5nIGNyZWRlbnRpYWxzIik7Ci0JCXBhbV9zZXRjcmVkKHNzaHBhbV9oYW5kbGUsIFBBTV9ERUxFVEVfQ1JFRCk7Ci0JCXNzaHBhbV9jcmVkX2VzdGFibGlzaGVkID0gMDsKLQl9Ci0Jc3NocGFtX2F1dGhlbnRpY2F0ZWQgPSAwOwotCXBhbV9lbmQoc3NocGFtX2hhbmRsZSwgc3NocGFtX2Vycik7Ci0Jc3NocGFtX2hhbmRsZSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQKLXNzaHBhbV9pbml0KEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlleHRlcm4gY2hhciAqX19wcm9nbmFtZTsKLQljb25zdCBjaGFyICpwYW1fcmhvc3QsICpwYW1fdXNlciwgKnVzZXIgPSBhdXRoY3R4dC0+dXNlcjsKLQljb25zdCBjaGFyICoqcHRyX3BhbV91c2VyID0gJnBhbV91c2VyOwotCi0JaWYgKHNzaHBhbV9oYW5kbGUgIT0gTlVMTCkgewotCQkvKiBXZSBhbHJlYWR5IGhhdmUgYSBQQU0gY29udGV4dDsgY2hlY2sgaWYgdGhlIHVzZXIgbWF0Y2hlcyAqLwotCQlzc2hwYW1fZXJyID0gcGFtX2dldF9pdGVtKHNzaHBhbV9oYW5kbGUsCi0JCSAgICBQQU1fVVNFUiwgKHNzaHBhbV9jb25zdCB2b2lkICoqKXB0cl9wYW1fdXNlcik7Ci0JCWlmIChzc2hwYW1fZXJyID09IFBBTV9TVUNDRVNTICYmIHN0cmNtcCh1c2VyLCBwYW1fdXNlcikgPT0gMCkKLQkJCXJldHVybiAoMCk7Ci0JCXBhbV9lbmQoc3NocGFtX2hhbmRsZSwgc3NocGFtX2Vycik7Ci0JCXNzaHBhbV9oYW5kbGUgPSBOVUxMOwotCX0KLQlkZWJ1ZygiUEFNOiBpbml0aWFsaXppbmcgZm9yIFwiJXNcIiIsIHVzZXIpOwotCXNzaHBhbV9lcnIgPQotCSAgICBwYW1fc3RhcnQoU1NIRF9QQU1fU0VSVklDRSwgdXNlciwgJnN0b3JlX2NvbnYsICZzc2hwYW1faGFuZGxlKTsKLQlzc2hwYW1fYXV0aGN0eHQgPSBhdXRoY3R4dDsKLQotCWlmIChzc2hwYW1fZXJyICE9IFBBTV9TVUNDRVNTKSB7Ci0JCXBhbV9lbmQoc3NocGFtX2hhbmRsZSwgc3NocGFtX2Vycik7Ci0JCXNzaHBhbV9oYW5kbGUgPSBOVUxMOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JcGFtX3Job3N0ID0gZ2V0X3JlbW90ZV9uYW1lX29yX2lwKHV0bXBfbGVuLCBvcHRpb25zLnVzZV9kbnMpOwotCWRlYnVnKCJQQU06IHNldHRpbmcgUEFNX1JIT1NUIHRvIFwiJXNcIiIsIHBhbV9yaG9zdCk7Ci0Jc3NocGFtX2VyciA9IHBhbV9zZXRfaXRlbShzc2hwYW1faGFuZGxlLCBQQU1fUkhPU1QsIHBhbV9yaG9zdCk7Ci0JaWYgKHNzaHBhbV9lcnIgIT0gUEFNX1NVQ0NFU1MpIHsKLQkJcGFtX2VuZChzc2hwYW1faGFuZGxlLCBzc2hwYW1fZXJyKTsKLQkJc3NocGFtX2hhbmRsZSA9IE5VTEw7Ci0JCXJldHVybiAoLTEpOwotCX0KLSNpZmRlZiBQQU1fVFRZX0tMVURHRQotCS8qCi0JICogU29tZSBzaWxseSBQQU0gbW9kdWxlcyAoZS5nLiBwYW1fdGltZSkgcmVxdWlyZSBhIFRUWSB0byBvcGVyYXRlLgotCSAqIHNzaGQgZG9lc24ndCBzZXQgdGhlIHR0eSB1bnRpbCB0b28gbGF0ZSBpbiB0aGUgYXV0aCBwcm9jZXNzIGFuZAotCSAqIG1heSBub3QgZXZlbiBzZXQgb25lIChmb3IgdHR5LWxlc3MgY29ubmVjdGlvbnMpCi0JICovCi0JZGVidWcoIlBBTTogc2V0dGluZyBQQU1fVFRZIHRvIFwic3NoXCIiKTsKLQlzc2hwYW1fZXJyID0gcGFtX3NldF9pdGVtKHNzaHBhbV9oYW5kbGUsIFBBTV9UVFksICJzc2giKTsKLQlpZiAoc3NocGFtX2VyciAhPSBQQU1fU1VDQ0VTUykgewotCQlwYW1fZW5kKHNzaHBhbV9oYW5kbGUsIHNzaHBhbV9lcnIpOwotCQlzc2hwYW1faGFuZGxlID0gTlVMTDsKLQkJcmV0dXJuICgtMSk7Ci0JfQotI2VuZGlmCi0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQgKgotc3NocGFtX2luaXRfY3R4KEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlzdHJ1Y3QgcGFtX2N0eHQgKmN0eHQ7Ci0JaW50IHNvY2tzWzJdOwotCi0JZGVidWczKCJQQU06ICVzIGVudGVyaW5nIiwgX19mdW5jX18pOwotCS8qCi0JICogUmVmdXNlIHRvIHN0YXJ0IGlmIHdlIGRvbid0IGhhdmUgUEFNIGVuYWJsZWQgb3IgZG9fcGFtX2FjY291bnQKLQkgKiBoYXMgcHJldmlvdXNseSBmYWlsZWQuCi0JICovCi0JaWYgKCFvcHRpb25zLnVzZV9wYW0gfHwgc3NocGFtX2FjY291bnRfc3RhdHVzID09IDApCi0JCXJldHVybiBOVUxMOwotCi0JLyogSW5pdGlhbGl6ZSBQQU0gKi8KLQlpZiAoc3NocGFtX2luaXQoYXV0aGN0eHQpID09IC0xKSB7Ci0JCWVycm9yKCJQQU06IGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCWN0eHQgPSB4Y2FsbG9jKDEsIHNpemVvZiAqY3R4dCk7Ci0KLQkvKiBTdGFydCB0aGUgYXV0aGVudGljYXRpb24gdGhyZWFkICovCi0JaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIFBGX1VOU1BFQywgc29ja3MpID09IC0xKSB7Ci0JCWVycm9yKCJQQU06IGZhaWxlZCBjcmVhdGUgc29ja2V0czogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQl4ZnJlZShjdHh0KTsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JY3R4dC0+cGFtX3Bzb2NrID0gc29ja3NbMF07Ci0JY3R4dC0+cGFtX2Nzb2NrID0gc29ja3NbMV07Ci0JaWYgKHB0aHJlYWRfY3JlYXRlKCZjdHh0LT5wYW1fdGhyZWFkLCBOVUxMLCBzc2hwYW1fdGhyZWFkLCBjdHh0KSA9PSAtMSkgewotCQllcnJvcigiUEFNOiBmYWlsZWQgdG8gc3RhcnQgYXV0aGVudGljYXRpb24gdGhyZWFkOiAlcyIsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCQljbG9zZShzb2Nrc1swXSk7Ci0JCWNsb3NlKHNvY2tzWzFdKTsKLQkJeGZyZWUoY3R4dCk7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCWNsZWFudXBfY3R4dCA9IGN0eHQ7Ci0JcmV0dXJuIChjdHh0KTsKLX0KLQotc3RhdGljIGludAotc3NocGFtX3F1ZXJ5KHZvaWQgKmN0eCwgY2hhciAqKm5hbWUsIGNoYXIgKippbmZvLAotICAgIHVfaW50ICpudW0sIGNoYXIgKioqcHJvbXB0cywgdV9pbnQgKiplY2hvX29uKQotewotCUJ1ZmZlciBidWZmZXI7Ci0Jc3RydWN0IHBhbV9jdHh0ICpjdHh0ID0gY3R4OwotCXNpemVfdCBwbGVuOwotCXVfY2hhciB0eXBlOwotCWNoYXIgKm1zZzsKLQlzaXplX3QgbGVuLCBtbGVuOwotCi0JZGVidWczKCJQQU06ICVzIGVudGVyaW5nIiwgX19mdW5jX18pOwotCWJ1ZmZlcl9pbml0KCZidWZmZXIpOwotCSpuYW1lID0geHN0cmR1cCgiIik7Ci0JKmluZm8gPSB4c3RyZHVwKCIiKTsKLQkqcHJvbXB0cyA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIgKikpOwotCSoqcHJvbXB0cyA9IE5VTEw7Ci0JcGxlbiA9IDA7Ci0JKmVjaG9fb24gPSB4bWFsbG9jKHNpemVvZih1X2ludCkpOwotCXdoaWxlIChzc2hfbXNnX3JlY3YoY3R4dC0+cGFtX3Bzb2NrLCAmYnVmZmVyKSA9PSAwKSB7Ci0JCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJmJ1ZmZlcik7Ci0JCW1zZyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZidWZmZXIsIE5VTEwpOwotCQltbGVuID0gc3RybGVuKG1zZyk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIFBBTV9QUk9NUFRfRUNIT19PTjoKLQkJY2FzZSBQQU1fUFJPTVBUX0VDSE9fT0ZGOgotCQkJKm51bSA9IDE7Ci0JCQlsZW4gPSBwbGVuICsgbWxlbiArIDE7Ci0JCQkqKnByb21wdHMgPSB4cmVhbGxvYygqKnByb21wdHMsIDEsIGxlbik7Ci0JCQlzdHJsY3B5KCoqcHJvbXB0cyArIHBsZW4sIG1zZywgbGVuIC0gcGxlbik7Ci0JCQlwbGVuICs9IG1sZW47Ci0JCQkqKmVjaG9fb24gPSAodHlwZSA9PSBQQU1fUFJPTVBUX0VDSE9fT04pOwotCQkJeGZyZWUobXNnKTsKLQkJCXJldHVybiAoMCk7Ci0JCWNhc2UgUEFNX0VSUk9SX01TRzoKLQkJY2FzZSBQQU1fVEVYVF9JTkZPOgotCQkJLyogYWNjdW11bGF0ZSBtZXNzYWdlcyAqLwotCQkJbGVuID0gcGxlbiArIG1sZW4gKyAyOwotCQkJKipwcm9tcHRzID0geHJlYWxsb2MoKipwcm9tcHRzLCAxLCBsZW4pOwotCQkJc3RybGNweSgqKnByb21wdHMgKyBwbGVuLCBtc2csIGxlbiAtIHBsZW4pOwotCQkJcGxlbiArPSBtbGVuOwotCQkJc3RybGNhdCgqKnByb21wdHMgKyBwbGVuLCAiXG4iLCBsZW4gLSBwbGVuKTsKLQkJCXBsZW4rKzsKLQkJCXhmcmVlKG1zZyk7Ci0JCQlicmVhazsKLQkJY2FzZSBQQU1fQUNDVF9FWFBJUkVEOgotCQkJc3NocGFtX2FjY291bnRfc3RhdHVzID0gMDsKLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWNhc2UgUEFNX0FVVEhfRVJSOgotCQkJZGVidWczKCJQQU06ICVzIiwgcGFtX3N0cmVycm9yKHNzaHBhbV9oYW5kbGUsIHR5cGUpKTsKLQkJCWlmICgqKnByb21wdHMgIT0gTlVMTCAmJiBzdHJsZW4oKipwcm9tcHRzKSAhPSAwKSB7Ci0JCQkJKmluZm8gPSAqKnByb21wdHM7Ci0JCQkJKipwcm9tcHRzID0gTlVMTDsKLQkJCQkqbnVtID0gMDsKLQkJCQkqKmVjaG9fb24gPSAwOwotCQkJCWN0eHQtPnBhbV9kb25lID0gLTE7Ci0JCQkJeGZyZWUobXNnKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWNhc2UgUEFNX1NVQ0NFU1M6Ci0JCQlpZiAoKipwcm9tcHRzICE9IE5VTEwpIHsKLQkJCQkvKiBkcmFpbiBhbnkgYWNjdW11bGF0ZWQgbWVzc2FnZXMgKi8KLQkJCQlkZWJ1ZygiUEFNOiAlcyIsICoqcHJvbXB0cyk7Ci0JCQkJYnVmZmVyX2FwcGVuZCgmbG9naW5tc2csICoqcHJvbXB0cywKLQkJCQkgICAgc3RybGVuKCoqcHJvbXB0cykpOwotCQkJCXhmcmVlKCoqcHJvbXB0cyk7Ci0JCQkJKipwcm9tcHRzID0gTlVMTDsKLQkJCX0KLQkJCWlmICh0eXBlID09IFBBTV9TVUNDRVNTKSB7Ci0JCQkJaWYgKCFzc2hwYW1fYXV0aGN0eHQtPnZhbGlkIHx8Ci0JCQkJICAgIChzc2hwYW1fYXV0aGN0eHQtPnB3LT5wd191aWQgPT0gMCAmJgotCQkJCSAgICBvcHRpb25zLnBlcm1pdF9yb290X2xvZ2luICE9IFBFUk1JVF9ZRVMpKQotCQkJCQlmYXRhbCgiSW50ZXJuYWwgZXJyb3I6IFBBTSBhdXRoICIKLQkJCQkJICAgICJzdWNjZWVkZWQgd2hlbiBpdCBzaG91bGQgaGF2ZSAiCi0JCQkJCSAgICAiZmFpbGVkIik7Ci0JCQkJaW1wb3J0X2Vudmlyb25tZW50cygmYnVmZmVyKTsKLQkJCQkqbnVtID0gMDsKLQkJCQkqKmVjaG9fb24gPSAwOwotCQkJCWN0eHQtPnBhbV9kb25lID0gMTsKLQkJCQl4ZnJlZShtc2cpOwotCQkJCXJldHVybiAoMCk7Ci0JCQl9Ci0JCQllcnJvcigiUEFNOiAlcyBmb3IgJXMlLjEwMHMgZnJvbSAlLjEwMHMiLCBtc2csCi0JCQkgICAgc3NocGFtX2F1dGhjdHh0LT52YWxpZCA/ICIiIDogImlsbGVnYWwgdXNlciAiLAotCQkJICAgIHNzaHBhbV9hdXRoY3R4dC0+dXNlciwKLQkJCSAgICBnZXRfcmVtb3RlX25hbWVfb3JfaXAodXRtcF9sZW4sIG9wdGlvbnMudXNlX2RucykpOwotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJZGVmYXVsdDoKLQkJCSpudW0gPSAwOwotCQkJKiplY2hvX29uID0gMDsKLQkJCXhmcmVlKG1zZyk7Ci0JCQljdHh0LT5wYW1fZG9uZSA9IC0xOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQl9Ci0JcmV0dXJuICgtMSk7Ci19Ci0KLS8qIFhYWCAtIHNlZSBhbHNvIGNvbW1lbnQgaW4gYXV0aC1jaGFsbC5jOnZlcmlmeV9yZXNwb25zZSAqLwotc3RhdGljIGludAotc3NocGFtX3Jlc3BvbmQodm9pZCAqY3R4LCB1X2ludCBudW0sIGNoYXIgKipyZXNwKQotewotCUJ1ZmZlciBidWZmZXI7Ci0Jc3RydWN0IHBhbV9jdHh0ICpjdHh0ID0gY3R4OwotCi0JZGVidWcyKCJQQU06ICVzIGVudGVyaW5nLCAldSByZXNwb25zZXMiLCBfX2Z1bmNfXywgbnVtKTsKLQlzd2l0Y2ggKGN0eHQtPnBhbV9kb25lKSB7Ci0JY2FzZSAxOgotCQlzc2hwYW1fYXV0aGVudGljYXRlZCA9IDE7Ci0JCXJldHVybiAoMCk7Ci0JY2FzZSAwOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JaWYgKG51bSAhPSAxKSB7Ci0JCWVycm9yKCJQQU06IGV4cGVjdGVkIG9uZSByZXNwb25zZSwgZ290ICV1IiwgbnVtKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWJ1ZmZlcl9pbml0KCZidWZmZXIpOwotCWlmIChzc2hwYW1fYXV0aGN0eHQtPnZhbGlkICYmCi0JICAgIChzc2hwYW1fYXV0aGN0eHQtPnB3LT5wd191aWQgIT0gMCB8fAotCSAgICBvcHRpb25zLnBlcm1pdF9yb290X2xvZ2luID09IFBFUk1JVF9ZRVMpKQotCQlidWZmZXJfcHV0X2NzdHJpbmcoJmJ1ZmZlciwgKnJlc3ApOwotCWVsc2UKLQkJYnVmZmVyX3B1dF9jc3RyaW5nKCZidWZmZXIsIGJhZHB3KTsKLQlpZiAoc3NoX21zZ19zZW5kKGN0eHQtPnBhbV9wc29jaywgUEFNX0FVVEhUT0ssICZidWZmZXIpID09IC0xKSB7Ci0JCWJ1ZmZlcl9mcmVlKCZidWZmZXIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7Ci0JcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLXNzaHBhbV9mcmVlX2N0eCh2b2lkICpjdHh0cCkKLXsKLQlzdHJ1Y3QgcGFtX2N0eHQgKmN0eHQgPSBjdHh0cDsKLQotCWRlYnVnMygiUEFNOiAlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQlzc2hwYW1fdGhyZWFkX2NsZWFudXAoKTsKLQl4ZnJlZShjdHh0KTsKLQkvKgotCSAqIFdlIGRvbid0IGNhbGwgc3NocGFtX2NsZWFudXAoKSBoZXJlIGJlY2F1c2Ugd2UgbWF5IG5lZWQgdGhlIFBBTQotCSAqIGhhbmRsZSBhdCBhIGxhdGVyIHN0YWdlLCBlLmcuIHdoZW4gc2V0dGluZyB1cCBhIHNlc3Npb24uICBJdCdzCi0JICogc3RpbGwgb24gdGhlIGNsZWFudXAgbGlzdCwgc28gcGFtX2VuZCgpICp3aWxsKiBiZSBjYWxsZWQgYmVmb3JlCi0JICogdGhlIHNlcnZlciBwcm9jZXNzIHRlcm1pbmF0ZXMuCi0JICovCi19Ci0KLUtiZGludERldmljZSBzc2hwYW1fZGV2aWNlID0gewotCSJwYW0iLAotCXNzaHBhbV9pbml0X2N0eCwKLQlzc2hwYW1fcXVlcnksCi0Jc3NocGFtX3Jlc3BvbmQsCi0Jc3NocGFtX2ZyZWVfY3R4Ci19OwotCi1LYmRpbnREZXZpY2UgbW1fc3NocGFtX2RldmljZSA9IHsKLQkicGFtIiwKLQltbV9zc2hwYW1faW5pdF9jdHgsCi0JbW1fc3NocGFtX3F1ZXJ5LAotCW1tX3NzaHBhbV9yZXNwb25kLAotCW1tX3NzaHBhbV9mcmVlX2N0eAotfTsKLQotLyoKLSAqIFRoaXMgcmVwbGFjZXMgYXV0aC1wYW0uYwotICovCi12b2lkCi1zdGFydF9wYW0oQXV0aGN0eHQgKmF1dGhjdHh0KQotewotCWlmICghb3B0aW9ucy51c2VfcGFtKQotCQlmYXRhbCgiUEFNOiBpbml0aWFsaXNhdGlvbiByZXF1ZXN0ZWQgd2hlbiBVc2VQQU09bm8iKTsKLQotCWlmIChzc2hwYW1faW5pdChhdXRoY3R4dCkgPT0gLTEpCi0JCWZhdGFsKCJQQU06IGluaXRpYWxpc2F0aW9uIGZhaWxlZCIpOwotfQotCi12b2lkCi1maW5pc2hfcGFtKHZvaWQpCi17Ci0Jc3NocGFtX2NsZWFudXAoKTsKLX0KLQotdV9pbnQKLWRvX3BhbV9hY2NvdW50KHZvaWQpCi17Ci0JZGVidWcoIiVzOiBjYWxsZWQiLCBfX2Z1bmNfXyk7Ci0JaWYgKHNzaHBhbV9hY2NvdW50X3N0YXR1cyAhPSAtMSkKLQkJcmV0dXJuIChzc2hwYW1fYWNjb3VudF9zdGF0dXMpOwotCi0Jc3NocGFtX2VyciA9IHBhbV9hY2N0X21nbXQoc3NocGFtX2hhbmRsZSwgMCk7Ci0JZGVidWczKCJQQU06ICVzIHBhbV9hY2N0X21nbXQgPSAlZCAoJXMpIiwgX19mdW5jX18sIHNzaHBhbV9lcnIsCi0JICAgIHBhbV9zdHJlcnJvcihzc2hwYW1faGFuZGxlLCBzc2hwYW1fZXJyKSk7Ci0KLQlpZiAoc3NocGFtX2VyciAhPSBQQU1fU1VDQ0VTUyAmJiBzc2hwYW1fZXJyICE9IFBBTV9ORVdfQVVUSFRPS19SRVFEKSB7Ci0JCXNzaHBhbV9hY2NvdW50X3N0YXR1cyA9IDA7Ci0JCXJldHVybiAoc3NocGFtX2FjY291bnRfc3RhdHVzKTsKLQl9Ci0KLQlpZiAoc3NocGFtX2VyciA9PSBQQU1fTkVXX0FVVEhUT0tfUkVRRCkKLQkJc3NocGFtX3Bhc3N3b3JkX2NoYW5nZV9yZXF1aXJlZCgxKTsKLQotCXNzaHBhbV9hY2NvdW50X3N0YXR1cyA9IDE7Ci0JcmV0dXJuIChzc2hwYW1fYWNjb3VudF9zdGF0dXMpOwotfQotCi12b2lkCi1kb19wYW1fc2V0X3R0eShjb25zdCBjaGFyICp0dHkpCi17Ci0JaWYgKHR0eSAhPSBOVUxMKSB7Ci0JCWRlYnVnKCJQQU06IHNldHRpbmcgUEFNX1RUWSB0byBcIiVzXCIiLCB0dHkpOwotCQlzc2hwYW1fZXJyID0gcGFtX3NldF9pdGVtKHNzaHBhbV9oYW5kbGUsIFBBTV9UVFksIHR0eSk7Ci0JCWlmIChzc2hwYW1fZXJyICE9IFBBTV9TVUNDRVNTKQotCQkJZmF0YWwoIlBBTTogZmFpbGVkIHRvIHNldCBQQU1fVFRZOiAlcyIsCi0JCQkgICAgcGFtX3N0cmVycm9yKHNzaHBhbV9oYW5kbGUsIHNzaHBhbV9lcnIpKTsKLQl9Ci19Ci0KLXZvaWQKLWRvX3BhbV9zZXRjcmVkKGludCBpbml0KQotewotCXNzaHBhbV9lcnIgPSBwYW1fc2V0X2l0ZW0oc3NocGFtX2hhbmRsZSwgUEFNX0NPTlYsCi0JICAgIChjb25zdCB2b2lkICopJnN0b3JlX2NvbnYpOwotCWlmIChzc2hwYW1fZXJyICE9IFBBTV9TVUNDRVNTKQotCQlmYXRhbCgiUEFNOiBmYWlsZWQgdG8gc2V0IFBBTV9DT05WOiAlcyIsCi0JCSAgICBwYW1fc3RyZXJyb3Ioc3NocGFtX2hhbmRsZSwgc3NocGFtX2VycikpOwotCWlmIChpbml0KSB7Ci0JCWRlYnVnKCJQQU06IGVzdGFibGlzaGluZyBjcmVkZW50aWFscyIpOwotCQlzc2hwYW1fZXJyID0gcGFtX3NldGNyZWQoc3NocGFtX2hhbmRsZSwgUEFNX0VTVEFCTElTSF9DUkVEKTsKLQl9IGVsc2UgewotCQlkZWJ1ZygiUEFNOiByZWluaXRpYWxpemluZyBjcmVkZW50aWFscyIpOwotCQlzc2hwYW1fZXJyID0gcGFtX3NldGNyZWQoc3NocGFtX2hhbmRsZSwgUEFNX1JFSU5JVElBTElaRV9DUkVEKTsKLQl9Ci0JaWYgKHNzaHBhbV9lcnIgPT0gUEFNX1NVQ0NFU1MpIHsKLQkJc3NocGFtX2NyZWRfZXN0YWJsaXNoZWQgPSAxOwotCQlyZXR1cm47Ci0JfQotCWlmIChzc2hwYW1fYXV0aGVudGljYXRlZCkKLQkJZmF0YWwoIlBBTTogcGFtX3NldGNyZWQoKTogJXMiLAotCQkgICAgcGFtX3N0cmVycm9yKHNzaHBhbV9oYW5kbGUsIHNzaHBhbV9lcnIpKTsKLQllbHNlCi0JCWRlYnVnKCJQQU06IHBhbV9zZXRjcmVkKCk6ICVzIiwKLQkJICAgIHBhbV9zdHJlcnJvcihzc2hwYW1faGFuZGxlLCBzc2hwYW1fZXJyKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNzaHBhbV90dHlfY29udihpbnQgbiwgc3NocGFtX2NvbnN0IHN0cnVjdCBwYW1fbWVzc2FnZSAqKm1zZywKLSAgICBzdHJ1Y3QgcGFtX3Jlc3BvbnNlICoqcmVzcCwgdm9pZCAqZGF0YSkKLXsKLQljaGFyIGlucHV0W1BBTV9NQVhfTVNHX1NJWkVdOwotCXN0cnVjdCBwYW1fcmVzcG9uc2UgKnJlcGx5OwotCWludCBpOwotCi0JZGVidWczKCJQQU06ICVzIGNhbGxlZCB3aXRoICVkIG1lc3NhZ2VzIiwgX19mdW5jX18sIG4pOwotCi0JKnJlc3AgPSBOVUxMOwotCi0JaWYgKG4gPD0gMCB8fCBuID4gUEFNX01BWF9OVU1fTVNHIHx8ICFpc2F0dHkoU1RESU5fRklMRU5PKSkKLQkJcmV0dXJuIChQQU1fQ09OVl9FUlIpOwotCi0JaWYgKChyZXBseSA9IGNhbGxvYyhuLCBzaXplb2YoKnJlcGx5KSkpID09IE5VTEwpCi0JCXJldHVybiAoUEFNX0NPTlZfRVJSKTsKLQotCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJc3dpdGNoIChQQU1fTVNHX01FTUJFUihtc2csIGksIG1zZ19zdHlsZSkpIHsKLQkJY2FzZSBQQU1fUFJPTVBUX0VDSE9fT0ZGOgotCQkJcmVwbHlbaV0ucmVzcCA9Ci0JCQkgICAgcmVhZF9wYXNzcGhyYXNlKFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnKSwKLQkJCSAgICBSUF9BTExPV19TVERJTik7Ci0JCQlyZXBseVtpXS5yZXNwX3JldGNvZGUgPSBQQU1fU1VDQ0VTUzsKLQkJCWJyZWFrOwotCQljYXNlIFBBTV9QUk9NUFRfRUNIT19PTjoKLQkJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnKSk7Ci0JCQlpZiAoZmdldHMoaW5wdXQsIHNpemVvZiBpbnB1dCwgc3RkaW4pID09IE5VTEwpCi0JCQkJaW5wdXRbMF0gPSAnXDAnOwotCQkJaWYgKChyZXBseVtpXS5yZXNwID0gc3RyZHVwKGlucHV0KSkgPT0gTlVMTCkKLQkJCQlnb3RvIGZhaWw7Ci0JCQlyZXBseVtpXS5yZXNwX3JldGNvZGUgPSBQQU1fU1VDQ0VTUzsKLQkJCWJyZWFrOwotCQljYXNlIFBBTV9FUlJPUl9NU0c6Ci0JCWNhc2UgUEFNX1RFWFRfSU5GTzoKLQkJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnKSk7Ci0JCQlyZXBseVtpXS5yZXNwX3JldGNvZGUgPSBQQU1fU1VDQ0VTUzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCSpyZXNwID0gcmVwbHk7Ci0JcmV0dXJuIChQQU1fU1VDQ0VTUyk7Ci0KLSBmYWlsOgotCWZvcihpID0gMDsgaSA8IG47IGkrKykgewotCQlpZiAocmVwbHlbaV0ucmVzcCAhPSBOVUxMKQotCQkJeGZyZWUocmVwbHlbaV0ucmVzcCk7Ci0JfQotCXhmcmVlKHJlcGx5KTsKLQlyZXR1cm4gKFBBTV9DT05WX0VSUik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFtX2NvbnYgdHR5X2NvbnYgPSB7IHNzaHBhbV90dHlfY29udiwgTlVMTCB9OwotCi0vKgotICogWFhYIHRoaXMgc2hvdWxkIGJlIGRvbmUgaW4gdGhlIGF1dGhlbnRpY2F0aW9uIHBoYXNlLCBidXQgc3NoMSBkb2Vzbid0Ci0gKiBzdXBwb3J0IHRoYXQKLSAqLwotdm9pZAotZG9fcGFtX2NoYXV0aHRvayh2b2lkKQotewotCWlmICh1c2VfcHJpdnNlcCkKLQkJZmF0YWwoIlBhc3N3b3JkIGV4cGlyZWQgKHVuYWJsZSB0byBjaGFuZ2Ugd2l0aCBwcml2c2VwKSIpOwotCXNzaHBhbV9lcnIgPSBwYW1fc2V0X2l0ZW0oc3NocGFtX2hhbmRsZSwgUEFNX0NPTlYsCi0JICAgIChjb25zdCB2b2lkICopJnR0eV9jb252KTsKLQlpZiAoc3NocGFtX2VyciAhPSBQQU1fU1VDQ0VTUykKLQkJZmF0YWwoIlBBTTogZmFpbGVkIHRvIHNldCBQQU1fQ09OVjogJXMiLAotCQkgICAgcGFtX3N0cmVycm9yKHNzaHBhbV9oYW5kbGUsIHNzaHBhbV9lcnIpKTsKLQlkZWJ1ZygiUEFNOiBjaGFuZ2luZyBwYXNzd29yZCIpOwotCXNzaHBhbV9lcnIgPSBwYW1fY2hhdXRodG9rKHNzaHBhbV9oYW5kbGUsIFBBTV9DSEFOR0VfRVhQSVJFRF9BVVRIVE9LKTsKLQlpZiAoc3NocGFtX2VyciAhPSBQQU1fU1VDQ0VTUykKLQkJZmF0YWwoIlBBTTogcGFtX2NoYXV0aHRvaygpOiAlcyIsCi0JCSAgICBwYW1fc3RyZXJyb3Ioc3NocGFtX2hhbmRsZSwgc3NocGFtX2VycikpOwotfQotCi12b2lkCi1kb19wYW1fc2Vzc2lvbih2b2lkKQotewotCWRlYnVnMygiUEFNOiBvcGVuaW5nIHNlc3Npb24iKTsKLQlzc2hwYW1fZXJyID0gcGFtX3NldF9pdGVtKHNzaHBhbV9oYW5kbGUsIFBBTV9DT05WLAotCSAgICAoY29uc3Qgdm9pZCAqKSZzdG9yZV9jb252KTsKLQlpZiAoc3NocGFtX2VyciAhPSBQQU1fU1VDQ0VTUykKLQkJZmF0YWwoIlBBTTogZmFpbGVkIHRvIHNldCBQQU1fQ09OVjogJXMiLAotCQkgICAgcGFtX3N0cmVycm9yKHNzaHBhbV9oYW5kbGUsIHNzaHBhbV9lcnIpKTsKLQlzc2hwYW1fZXJyID0gcGFtX29wZW5fc2Vzc2lvbihzc2hwYW1faGFuZGxlLCAwKTsKLQlpZiAoc3NocGFtX2VyciA9PSBQQU1fU1VDQ0VTUykKLQkJc3NocGFtX3Nlc3Npb25fb3BlbiA9IDE7Ci0JZWxzZSB7Ci0JCXNzaHBhbV9zZXNzaW9uX29wZW4gPSAwOwotCQlkaXNhYmxlX2ZvcndhcmRpbmcoKTsKLQkJZXJyb3IoIlBBTTogcGFtX29wZW5fc2Vzc2lvbigpOiAlcyIsCi0JCSAgICBwYW1fc3RyZXJyb3Ioc3NocGFtX2hhbmRsZSwgc3NocGFtX2VycikpOwotCX0KLQotfQotCi1pbnQKLWlzX3BhbV9zZXNzaW9uX29wZW4odm9pZCkKLXsKLQlyZXR1cm4gc3NocGFtX3Nlc3Npb25fb3BlbjsKLX0KLQotLyoKLSAqIFNldCBhIFBBTSBlbnZpcm9ubWVudCBzdHJpbmcuIFdlIG5lZWQgdG8gZG8gdGhpcyBzbyB0aGF0IHRoZSBzZXNzaW9uCi0gKiBtb2R1bGVzIGNhbiBoYW5kbGUgdGhpbmdzIGxpa2UgS2VyYmVyb3MvR1NJIGNyZWRlbnRpYWxzIHRoYXQgYXBwZWFyCi0gKiBkdXJpbmcgdGhlIHNzaCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLgotICovCi1pbnQKLWRvX3BhbV9wdXRlbnYoY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpCi17Ci0JaW50IHJldCA9IDE7Ci0jaWZkZWYgSEFWRV9QQU1fUFVURU5WCi0JY2hhciAqY29tcG91bmQ7Ci0Jc2l6ZV90IGxlbjsKLQotCWxlbiA9IHN0cmxlbihuYW1lKSArIHN0cmxlbih2YWx1ZSkgKyAyOwotCWNvbXBvdW5kID0geG1hbGxvYyhsZW4pOwotCi0Jc25wcmludGYoY29tcG91bmQsIGxlbiwgIiVzPSVzIiwgbmFtZSwgdmFsdWUpOwotCXJldCA9IHBhbV9wdXRlbnYoc3NocGFtX2hhbmRsZSwgY29tcG91bmQpOwotCXhmcmVlKGNvbXBvdW5kKTsKLSNlbmRpZgotCi0JcmV0dXJuIChyZXQpOwotfQotCi1jaGFyICoqCi1mZXRjaF9wYW1fY2hpbGRfZW52aXJvbm1lbnQodm9pZCkKLXsKLQlyZXR1cm4gc3NocGFtX2VudjsKLX0KLQotY2hhciAqKgotZmV0Y2hfcGFtX2Vudmlyb25tZW50KHZvaWQpCi17Ci0JcmV0dXJuIChwYW1fZ2V0ZW52bGlzdChzc2hwYW1faGFuZGxlKSk7Ci19Ci0KLXZvaWQKLWZyZWVfcGFtX2Vudmlyb25tZW50KGNoYXIgKiplbnYpCi17Ci0JY2hhciAqKmVudnA7Ci0KLQlpZiAoZW52ID09IE5VTEwpCi0JCXJldHVybjsKLQotCWZvciAoZW52cCA9IGVudjsgKmVudnA7IGVudnArKykKLQkJeGZyZWUoKmVudnApOwotCXhmcmVlKGVudik7Ci19Ci0KLS8qCi0gKiAiQmxpbmQiIGNvbnZlcnNhdGlvbiBmdW5jdGlvbiBmb3IgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uICBBc3N1bWVzIHRoYXQKLSAqIGVjaG8tb2ZmIHByb21wdHMgYXJlIGZvciB0aGUgcGFzc3dvcmQgYW5kIHN0b3JlcyBtZXNzYWdlcyBmb3IgbGF0ZXIKLSAqIGRpc3BsYXkuCi0gKi8KLXN0YXRpYyBpbnQKLXNzaHBhbV9wYXNzd2RfY29udihpbnQgbiwgc3NocGFtX2NvbnN0IHN0cnVjdCBwYW1fbWVzc2FnZSAqKm1zZywKLSAgICBzdHJ1Y3QgcGFtX3Jlc3BvbnNlICoqcmVzcCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgcGFtX3Jlc3BvbnNlICpyZXBseTsKLQlpbnQgaTsKLQlzaXplX3QgbGVuOwotCi0JZGVidWczKCJQQU06ICVzIGNhbGxlZCB3aXRoICVkIG1lc3NhZ2VzIiwgX19mdW5jX18sIG4pOwotCi0JKnJlc3AgPSBOVUxMOwotCi0JaWYgKG4gPD0gMCB8fCBuID4gUEFNX01BWF9OVU1fTVNHKQotCQlyZXR1cm4gKFBBTV9DT05WX0VSUik7Ci0KLQlpZiAoKHJlcGx5ID0gY2FsbG9jKG4sIHNpemVvZigqcmVwbHkpKSkgPT0gTlVMTCkKLQkJcmV0dXJuIChQQU1fQ09OVl9FUlIpOwotCi0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlzd2l0Y2ggKFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnX3N0eWxlKSkgewotCQljYXNlIFBBTV9QUk9NUFRfRUNIT19PRkY6Ci0JCQlpZiAoc3NocGFtX3Bhc3N3b3JkID09IE5VTEwpCi0JCQkJZ290byBmYWlsOwotCQkJaWYgKChyZXBseVtpXS5yZXNwID0gc3RyZHVwKHNzaHBhbV9wYXNzd29yZCkpID09IE5VTEwpCi0JCQkJZ290byBmYWlsOwotCQkJcmVwbHlbaV0ucmVzcF9yZXRjb2RlID0gUEFNX1NVQ0NFU1M7Ci0JCQlicmVhazsKLQkJY2FzZSBQQU1fRVJST1JfTVNHOgotCQljYXNlIFBBTV9URVhUX0lORk86Ci0JCQlsZW4gPSBzdHJsZW4oUEFNX01TR19NRU1CRVIobXNnLCBpLCBtc2cpKTsKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJYnVmZmVyX2FwcGVuZCgmbG9naW5tc2csCi0JCQkJICAgIFBBTV9NU0dfTUVNQkVSKG1zZywgaSwgbXNnKSwgbGVuKTsKLQkJCQlidWZmZXJfYXBwZW5kKCZsb2dpbm1zZywgIlxuIiwgMSk7Ci0JCQl9Ci0JCQlpZiAoKHJlcGx5W2ldLnJlc3AgPSBzdHJkdXAoIiIpKSA9PSBOVUxMKQotCQkJCWdvdG8gZmFpbDsKLQkJCXJlcGx5W2ldLnJlc3BfcmV0Y29kZSA9IFBBTV9TVUNDRVNTOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQl9Ci0JKnJlc3AgPSByZXBseTsKLQlyZXR1cm4gKFBBTV9TVUNDRVNTKTsKLQotIGZhaWw6Ci0JZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWlmIChyZXBseVtpXS5yZXNwICE9IE5VTEwpCi0JCQl4ZnJlZShyZXBseVtpXS5yZXNwKTsKLQl9Ci0JeGZyZWUocmVwbHkpOwotCXJldHVybiAoUEFNX0NPTlZfRVJSKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwYW1fY29udiBwYXNzd2RfY29udiA9IHsgc3NocGFtX3Bhc3N3ZF9jb252LCBOVUxMIH07Ci0KLS8qCi0gKiBBdHRlbXB0IHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIHZpYSBQQU0KLSAqLwotaW50Ci1zc2hwYW1fYXV0aF9wYXNzd2QoQXV0aGN0eHQgKmF1dGhjdHh0LCBjb25zdCBjaGFyICpwYXNzd29yZCkKLXsKLQlpbnQgZmxhZ3MgPSAob3B0aW9ucy5wZXJtaXRfZW1wdHlfcGFzc3dkID09IDAgPwotCSAgICBQQU1fRElTQUxMT1dfTlVMTF9BVVRIVE9LIDogMCk7Ci0KLQlpZiAoIW9wdGlvbnMudXNlX3BhbSB8fCBzc2hwYW1faGFuZGxlID09IE5VTEwpCi0JCWZhdGFsKCJQQU06ICVzIGNhbGxlZCB3aGVuIFBBTSBkaXNhYmxlZCBvciBmYWlsZWQgdG8gIgotCQkgICAgImluaXRpYWxpc2UuIiwgX19mdW5jX18pOwotCi0Jc3NocGFtX3Bhc3N3b3JkID0gcGFzc3dvcmQ7Ci0Jc3NocGFtX2F1dGhjdHh0ID0gYXV0aGN0eHQ7Ci0KLQkvKgotCSAqIElmIHRoZSB1c2VyIGxvZ2dpbmcgaW4gaXMgaW52YWxpZCwgb3IgaXMgcm9vdCBidXQgaXMgbm90IHBlcm1pdHRlZAotCSAqIGJ5IFBlcm1pdFJvb3RMb2dpbiwgdXNlIGFuIGludmFsaWQgcGFzc3dvcmQgdG8gcHJldmVudCBsZWFraW5nCi0JICogaW5mb3JtYXRpb24gdmlhIHRpbWluZyAoZWcgaWYgdGhlIFBBTSBjb25maWcgaGFzIGEgZGVsYXkgb24gZmFpbCkuCi0JICovCi0JaWYgKCFhdXRoY3R4dC0+dmFsaWQgfHwgKGF1dGhjdHh0LT5wdy0+cHdfdWlkID09IDAgJiYKLQkgICAgb3B0aW9ucy5wZXJtaXRfcm9vdF9sb2dpbiAhPSBQRVJNSVRfWUVTKSkKLQkJc3NocGFtX3Bhc3N3b3JkID0gYmFkcHc7Ci0KLQlzc2hwYW1fZXJyID0gcGFtX3NldF9pdGVtKHNzaHBhbV9oYW5kbGUsIFBBTV9DT05WLAotCSAgICAoY29uc3Qgdm9pZCAqKSZwYXNzd2RfY29udik7Ci0JaWYgKHNzaHBhbV9lcnIgIT0gUEFNX1NVQ0NFU1MpCi0JCWZhdGFsKCJQQU06ICVzOiBmYWlsZWQgdG8gc2V0IFBBTV9DT05WOiAlcyIsIF9fZnVuY19fLAotCQkgICAgcGFtX3N0cmVycm9yKHNzaHBhbV9oYW5kbGUsIHNzaHBhbV9lcnIpKTsKLQotCXNzaHBhbV9lcnIgPSBwYW1fYXV0aGVudGljYXRlKHNzaHBhbV9oYW5kbGUsIGZsYWdzKTsKLQlzc2hwYW1fcGFzc3dvcmQgPSBOVUxMOwotCWlmIChzc2hwYW1fZXJyID09IFBBTV9TVUNDRVNTICYmIGF1dGhjdHh0LT52YWxpZCkgewotCQlkZWJ1ZygiUEFNOiBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBhY2NlcHRlZCBmb3IgJS4xMDBzIiwKLQkJICAgIGF1dGhjdHh0LT51c2VyKTsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIHsKLQkJZGVidWcoIlBBTTogcGFzc3dvcmQgYXV0aGVudGljYXRpb24gZmFpbGVkIGZvciAlLjEwMHM6ICVzIiwKLQkJICAgIGF1dGhjdHh0LT52YWxpZCA/IGF1dGhjdHh0LT51c2VyIDogImFuIGlsbGVnYWwgdXNlciIsCi0JCSAgICBwYW1fc3RyZXJyb3Ioc3NocGFtX2hhbmRsZSwgc3NocGFtX2VycikpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0jZW5kaWYgLyogVVNFX1BBTSAqLwpkaWZmIC0tZ2l0IGEvYXV0aC1wYW0uaCBiL2F1dGgtcGFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYTJiNTIuLjAwMDAwMDAKLS0tIGEvYXV0aC1wYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qICRJZDogYXV0aC1wYW0uaCx2IDEuMjcgMjAwNC8wOS8xMSAxMjoxNzoyNiBkdHVja2VyIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2lmZGVmIFVTRV9QQU0KLQotI2lmICFkZWZpbmVkKFNTSERfUEFNX1NFUlZJQ0UpCi0jIGRlZmluZSBTU0hEX1BBTV9TRVJWSUNFCQlfX3Byb2duYW1lCi0jZW5kaWYKLQotdm9pZCBzdGFydF9wYW0oQXV0aGN0eHQgKik7Ci12b2lkIGZpbmlzaF9wYW0odm9pZCk7Ci11X2ludCBkb19wYW1fYWNjb3VudCh2b2lkKTsKLXZvaWQgZG9fcGFtX3Nlc3Npb24odm9pZCk7Ci12b2lkIGRvX3BhbV9zZXRfdHR5KGNvbnN0IGNoYXIgKik7Ci12b2lkIGRvX3BhbV9zZXRjcmVkKGludCApOwotdm9pZCBkb19wYW1fY2hhdXRodG9rKHZvaWQpOwotaW50IGRvX3BhbV9wdXRlbnYoY2hhciAqLCBjaGFyICopOwotY2hhciAqKiBmZXRjaF9wYW1fZW52aXJvbm1lbnQodm9pZCk7Ci1jaGFyICoqIGZldGNoX3BhbV9jaGlsZF9lbnZpcm9ubWVudCh2b2lkKTsKLXZvaWQgZnJlZV9wYW1fZW52aXJvbm1lbnQoY2hhciAqKik7Ci12b2lkIHNzaHBhbV90aHJlYWRfY2xlYW51cCh2b2lkKTsKLXZvaWQgc3NocGFtX2NsZWFudXAodm9pZCk7Ci1pbnQgc3NocGFtX2F1dGhfcGFzc3dkKEF1dGhjdHh0ICosIGNvbnN0IGNoYXIgKik7Ci1pbnQgaXNfcGFtX3Nlc3Npb25fb3Blbih2b2lkKTsKLQotI2VuZGlmIC8qIFVTRV9QQU0gKi8KZGlmZiAtLWdpdCBhL2F1dGgtcGFzc3dkLmMgYi9hdXRoLXBhc3N3ZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWM2Y2UwLi4wMDAwMDAwCi0tLSBhL2F1dGgtcGFzc3dkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGF1dGgtcGFzc3dkLmMsdiAxLjQzIDIwMDcvMDkvMjEgMDg6MTU6MjkgZGptIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogUGFzc3dvcmQgYXV0aGVudGljYXRpb24uICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGZ1bmN0aW9ucyB0byBjaGVjayB3aGV0aGVyCi0gKiB0aGUgcGFzc3dvcmQgaXMgdmFsaWQgZm9yIHRoZSB1c2VyLgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IER1ZyBTb25nLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJzZXJ2Y29uZi5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgImF1dGgtb3B0aW9ucy5oIgotCi1leHRlcm4gQnVmZmVyIGxvZ2lubXNnOwotZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKLQotI2lmZGVmIEhBVkVfTE9HSU5fQ0FQCi1leHRlcm4gbG9naW5fY2FwX3QgKmxjOwotI2VuZGlmCi0KLQotI2RlZmluZSBEQVkJCSgyNEwgKiA2MCAqIDYwKSAvKiAxIGRheSBpbiBzZWNvbmRzICovCi0jZGVmaW5lIFRXT19XRUVLUwkoMkwgKiA3ICogREFZKQkvKiAyIHdlZWtzIGluIHNlY29uZHMgKi8KLQotdm9pZAotZGlzYWJsZV9mb3J3YXJkaW5nKHZvaWQpCi17Ci0Jbm9fcG9ydF9mb3J3YXJkaW5nX2ZsYWcgPSAxOwotCW5vX2FnZW50X2ZvcndhcmRpbmdfZmxhZyA9IDE7Ci0Jbm9feDExX2ZvcndhcmRpbmdfZmxhZyA9IDE7Ci19Ci0KLS8qCi0gKiBUcmllcyB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIgdXNpbmcgcGFzc3dvcmQuICBSZXR1cm5zIHRydWUgaWYKLSAqIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzLgotICovCi1pbnQKLWF1dGhfcGFzc3dvcmQoQXV0aGN0eHQgKmF1dGhjdHh0LCBjb25zdCBjaGFyICpwYXNzd29yZCkKLXsKLQlzdHJ1Y3QgcGFzc3dkICogcHcgPSBhdXRoY3R4dC0+cHc7Ci0JaW50IHJlc3VsdCwgb2sgPSBhdXRoY3R4dC0+dmFsaWQ7Ci0jaWYgZGVmaW5lZChVU0VfU0hBRE9XKSAmJiBkZWZpbmVkKEhBU19TSEFET1dfRVhQSVJFKQotCXN0YXRpYyBpbnQgZXhwaXJlX2NoZWNrZWQgPSAwOwotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9DWUdXSU4KLQlpZiAocHctPnB3X3VpZCA9PSAwICYmIG9wdGlvbnMucGVybWl0X3Jvb3RfbG9naW4gIT0gUEVSTUlUX1lFUykKLQkJb2sgPSAwOwotI2VuZGlmCi0JaWYgKCpwYXNzd29yZCA9PSAnXDAnICYmIG9wdGlvbnMucGVybWl0X2VtcHR5X3Bhc3N3ZCA9PSAwKQotCQlyZXR1cm4gMDsKLQotI2lmZGVmIEtSQjUKLQlpZiAob3B0aW9ucy5rZXJiZXJvc19hdXRoZW50aWNhdGlvbiA9PSAxKSB7Ci0JCWludCByZXQgPSBhdXRoX2tyYjVfcGFzc3dvcmQoYXV0aGN0eHQsIHBhc3N3b3JkKTsKLQkJaWYgKHJldCA9PSAxIHx8IHJldCA9PSAwKQotCQkJcmV0dXJuIHJldCAmJiBvazsKLQkJLyogRmFsbCBiYWNrIHRvIG9yZGluYXJ5IHBhc3N3ZCBhdXRoZW50aWNhdGlvbi4gKi8KLQl9Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0NZR1dJTgotCXsKLQkJSEFORExFIGhUb2tlbiA9IGN5Z3dpbl9sb2dvbl91c2VyKHB3LCBwYXNzd29yZCk7Ci0KLQkJaWYgKGhUb2tlbiA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLQkJCXJldHVybiAwOwotCQljeWd3aW5fc2V0X2ltcGVyc29uYXRpb25fdG9rZW4oaFRva2VuKTsKLQkJcmV0dXJuIG9rOwotCX0KLSNlbmRpZgotI2lmZGVmIFVTRV9QQU0KLQlpZiAob3B0aW9ucy51c2VfcGFtKQotCQlyZXR1cm4gKHNzaHBhbV9hdXRoX3Bhc3N3ZChhdXRoY3R4dCwgcGFzc3dvcmQpICYmIG9rKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoVVNFX1NIQURPVykgJiYgZGVmaW5lZChIQVNfU0hBRE9XX0VYUElSRSkKLQlpZiAoIWV4cGlyZV9jaGVja2VkKSB7Ci0JCWV4cGlyZV9jaGVja2VkID0gMTsKLQkJaWYgKGF1dGhfc2hhZG93X3B3ZXhwaXJlZChhdXRoY3R4dCkpCi0JCQlhdXRoY3R4dC0+Zm9yY2VfcHdjaGFuZ2UgPSAxOwotCX0KLSNlbmRpZgotCXJlc3VsdCA9IHN5c19hdXRoX3Bhc3N3ZChhdXRoY3R4dCwgcGFzc3dvcmQpOwotCWlmIChhdXRoY3R4dC0+Zm9yY2VfcHdjaGFuZ2UpCi0JCWRpc2FibGVfZm9yd2FyZGluZygpOwotCXJldHVybiAocmVzdWx0ICYmIG9rKTsKLX0KLQotI2lmZGVmIEJTRF9BVVRICi1zdGF0aWMgdm9pZAotd2Fybl9leHBpcnkoQXV0aGN0eHQgKmF1dGhjdHh0LCBhdXRoX3Nlc3Npb25fdCAqYXMpCi17Ci0JY2hhciBidWZbMjU2XTsKLQlxdWFkX3QgcHd0aW1lbGVmdCwgYWN0aW1lbGVmdCwgZGF5c2xlZnQsIHB3d2FybnRpbWUsIGFjd2FybnRpbWU7Ci0KLQlwd3dhcm50aW1lID0gYWN3YXJudGltZSA9IFRXT19XRUVLUzsKLQotCXB3dGltZWxlZnQgPSBhdXRoX2NoZWNrX2NoYW5nZShhcyk7Ci0JYWN0aW1lbGVmdCA9IGF1dGhfY2hlY2tfZXhwaXJlKGFzKTsKLSNpZmRlZiBIQVZFX0xPR0lOX0NBUAotCWlmIChhdXRoY3R4dC0+dmFsaWQpIHsKLQkJcHd3YXJudGltZSA9IGxvZ2luX2dldGNhcHRpbWUobGMsICJwYXNzd29yZC13YXJuIiwgVFdPX1dFRUtTLAotCQkgICAgVFdPX1dFRUtTKTsKLQkJYWN3YXJudGltZSA9IGxvZ2luX2dldGNhcHRpbWUobGMsICJleHBpcmUtd2FybiIsIFRXT19XRUVLUywKLQkJICAgIFRXT19XRUVLUyk7Ci0JfQotI2VuZGlmCi0JaWYgKHB3dGltZWxlZnQgIT0gMCAmJiBwd3RpbWVsZWZ0IDwgcHd3YXJudGltZSkgewotCQlkYXlzbGVmdCA9IHB3dGltZWxlZnQgLyBEQVkgKyAxOwotCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkgICAgIllvdXIgcGFzc3dvcmQgd2lsbCBleHBpcmUgaW4gJWxsZCBkYXklcy5cbiIsCi0JCSAgICBkYXlzbGVmdCwgZGF5c2xlZnQgPT0gMSA/ICIiIDogInMiKTsKLQkJYnVmZmVyX2FwcGVuZCgmbG9naW5tc2csIGJ1Ziwgc3RybGVuKGJ1ZikpOwotCX0KLQlpZiAoYWN0aW1lbGVmdCAhPSAwICYmIGFjdGltZWxlZnQgPCBhY3dhcm50aW1lKSB7Ci0JCWRheXNsZWZ0ID0gYWN0aW1lbGVmdCAvIERBWSArIDE7Ci0JCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSAgICAiWW91ciBhY2NvdW50IHdpbGwgZXhwaXJlIGluICVsbGQgZGF5JXMuXG4iLAotCQkgICAgZGF5c2xlZnQsIGRheXNsZWZ0ID09IDEgPyAiIiA6ICJzIik7Ci0JCWJ1ZmZlcl9hcHBlbmQoJmxvZ2lubXNnLCBidWYsIHN0cmxlbihidWYpKTsKLQl9Ci19Ci0KLWludAotc3lzX2F1dGhfcGFzc3dkKEF1dGhjdHh0ICphdXRoY3R4dCwgY29uc3QgY2hhciAqcGFzc3dvcmQpCi17Ci0Jc3RydWN0IHBhc3N3ZCAqcHcgPSBhdXRoY3R4dC0+cHc7Ci0JYXV0aF9zZXNzaW9uX3QgKmFzOwotCXN0YXRpYyBpbnQgZXhwaXJlX2NoZWNrZWQgPSAwOwotCi0JYXMgPSBhdXRoX3VzZXJjaGVjayhwdy0+cHdfbmFtZSwgYXV0aGN0eHQtPnN0eWxlLCAiYXV0aC1zc2giLAotCSAgICAoY2hhciAqKXBhc3N3b3JkKTsKLQlpZiAoYXMgPT0gTlVMTCkKLQkJcmV0dXJuICgwKTsKLQlpZiAoYXV0aF9nZXRzdGF0ZShhcykgJiBBVVRIX1BXRVhQSVJFRCkgewotCQlhdXRoX2Nsb3NlKGFzKTsKLQkJZGlzYWJsZV9mb3J3YXJkaW5nKCk7Ci0JCWF1dGhjdHh0LT5mb3JjZV9wd2NoYW5nZSA9IDE7Ci0JCXJldHVybiAoMSk7Ci0JfSBlbHNlIHsKLQkJaWYgKCFleHBpcmVfY2hlY2tlZCkgewotCQkJZXhwaXJlX2NoZWNrZWQgPSAxOwotCQkJd2Fybl9leHBpcnkoYXV0aGN0eHQsIGFzKTsKLQkJfQotCQlyZXR1cm4gKGF1dGhfY2xvc2UoYXMpKTsKLQl9Ci19Ci0jZWxpZiAhZGVmaW5lZChDVVNUT01fU1lTX0FVVEhfUEFTU1dEKQotaW50Ci1zeXNfYXV0aF9wYXNzd2QoQXV0aGN0eHQgKmF1dGhjdHh0LCBjb25zdCBjaGFyICpwYXNzd29yZCkKLXsKLQlzdHJ1Y3QgcGFzc3dkICpwdyA9IGF1dGhjdHh0LT5wdzsKLQljaGFyICplbmNyeXB0ZWRfcGFzc3dvcmQ7Ci0KLQkvKiBKdXN0IHVzZSB0aGUgc3VwcGxpZWQgZmFrZSBwYXNzd29yZCBpZiBhdXRoY3R4dCBpcyBpbnZhbGlkICovCi0JY2hhciAqcHdfcGFzc3dvcmQgPSBhdXRoY3R4dC0+dmFsaWQgPyBzaGFkb3dfcHcocHcpIDogcHctPnB3X3Bhc3N3ZDsKLQotCS8qIENoZWNrIGZvciB1c2VycyB3aXRoIG5vIHBhc3N3b3JkLiAqLwotCWlmIChzdHJjbXAocHdfcGFzc3dvcmQsICIiKSA9PSAwICYmIHN0cmNtcChwYXNzd29yZCwgIiIpID09IDApCi0JCXJldHVybiAoMSk7Ci0KLQkvKiBFbmNyeXB0IHRoZSBjYW5kaWRhdGUgcGFzc3dvcmQgdXNpbmcgdGhlIHByb3BlciBzYWx0LiAqLwotCWVuY3J5cHRlZF9wYXNzd29yZCA9IHhjcnlwdChwYXNzd29yZCwKLQkgICAgKHB3X3Bhc3N3b3JkWzBdICYmIHB3X3Bhc3N3b3JkWzFdKSA/IHB3X3Bhc3N3b3JkIDogInh4Iik7Ci0KLQkvKgotCSAqIEF1dGhlbnRpY2F0aW9uIGlzIGFjY2VwdGVkIGlmIHRoZSBlbmNyeXB0ZWQgcGFzc3dvcmRzCi0JICogYXJlIGlkZW50aWNhbC4KLQkgKi8KLQlyZXR1cm4gKHN0cmNtcChlbmNyeXB0ZWRfcGFzc3dvcmQsIHB3X3Bhc3N3b3JkKSA9PSAwKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXV0aC1yaC1yc2EuYyBiL2F1dGgtcmgtcnNhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMWEwZjQuLjAwMDAwMDAKLS0tIGEvYXV0aC1yaC1yc2EuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKiAkT3BlbkJTRDogYXV0aC1yaC1yc2EuYyx2IDEuNDMgMjAxMC8wMy8wNCAxMDozNjowMyBkam0gRXhwICQgKi8KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiBSaG9zdHMgb3IgL2V0Yy9ob3N0cy5lcXVpdiBhdXRoZW50aWNhdGlvbiBjb21iaW5lZCB3aXRoIFJTQSBob3N0Ci0gKiBhdXRoZW50aWNhdGlvbi4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgInBhY2tldC5oIgotI2luY2x1ZGUgInVpZHN3YXAuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJzZXJ2Y29uZi5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAicGF0aG5hbWVzLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgImNhbm9ob3N0LmgiCi0jaWZkZWYgR1NTQVBJCi0jaW5jbHVkZSAic3NoLWdzcy5oIgotI2VuZGlmCi0jaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCi0KLS8qIGltcG9ydCAqLwotZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKLQotaW50Ci1hdXRoX3Job3N0c19yc2Ffa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqcHcsIGNoYXIgKmN1c2VyLCBjaGFyICpjaG9zdCwKLSAgICBLZXkgKmNsaWVudF9ob3N0X2tleSkKLXsKLQlIb3N0U3RhdHVzIGhvc3Rfc3RhdHVzOwotCi0JaWYgKGF1dGhfa2V5X2lzX3Jldm9rZWQoY2xpZW50X2hvc3Rfa2V5KSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBDaGVjayBpZiB3ZSB3b3VsZCBhY2NlcHQgaXQgdXNpbmcgcmhvc3RzIGF1dGhlbnRpY2F0aW9uLiAqLwotCWlmICghYXV0aF9yaG9zdHMocHcsIGN1c2VyKSkKLQkJcmV0dXJuIDA7Ci0KLQlob3N0X3N0YXR1cyA9IGNoZWNrX2tleV9pbl9ob3N0ZmlsZXMocHcsIGNsaWVudF9ob3N0X2tleSwKLQkgICAgY2hvc3QsIF9QQVRIX1NTSF9TWVNURU1fSE9TVEZJTEUsCi0JICAgIG9wdGlvbnMuaWdub3JlX3VzZXJfa25vd25faG9zdHMgPyBOVUxMIDogX1BBVEhfU1NIX1VTRVJfSE9TVEZJTEUpOwotCi0JcmV0dXJuIChob3N0X3N0YXR1cyA9PSBIT1NUX09LKTsKLX0KLQotLyoKLSAqIFRyaWVzIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciB1c2luZyB0aGUgLnJob3N0cyBmaWxlIGFuZCB0aGUgaG9zdCB1c2luZwotICogaXRzIGhvc3Qga2V5LiAgUmV0dXJucyB0cnVlIGlmIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzLgotICovCi1pbnQKLWF1dGhfcmhvc3RzX3JzYShBdXRoY3R4dCAqYXV0aGN0eHQsIGNoYXIgKmN1c2VyLCBLZXkgKmNsaWVudF9ob3N0X2tleSkKLXsKLQljaGFyICpjaG9zdDsKLQlzdHJ1Y3QgcGFzc3dkICpwdyA9IGF1dGhjdHh0LT5wdzsKLQotCWRlYnVnKCJUcnlpbmcgcmhvc3RzIHdpdGggUlNBIGhvc3QgYXV0aGVudGljYXRpb24gZm9yIGNsaWVudCB1c2VyICUuMTAwcyIsCi0JICAgIGN1c2VyKTsKLQotCWlmICghYXV0aGN0eHQtPnZhbGlkIHx8IGNsaWVudF9ob3N0X2tleSA9PSBOVUxMIHx8Ci0JICAgIGNsaWVudF9ob3N0X2tleS0+cnNhID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JY2hvc3QgPSAoY2hhciAqKWdldF9jYW5vbmljYWxfaG9zdG5hbWUob3B0aW9ucy51c2VfZG5zKTsKLQlkZWJ1ZygiUmhvc3RzIFJTQSBhdXRoZW50aWNhdGlvbjogY2Fub25pY2FsIGhvc3QgJS45MDBzIiwgY2hvc3QpOwotCi0JaWYgKCFQUklWU0VQKGF1dGhfcmhvc3RzX3JzYV9rZXlfYWxsb3dlZChwdywgY3VzZXIsIGNob3N0LCBjbGllbnRfaG9zdF9rZXkpKSkgewotCQlkZWJ1ZygiUmhvc3RzIHdpdGggUlNBIGhvc3QgYXV0aGVudGljYXRpb24gZGVuaWVkOiB1bmtub3duIG9yIGludmFsaWQgaG9zdCBrZXkiKTsKLQkJcGFja2V0X3NlbmRfZGVidWcoIllvdXIgaG9zdCBrZXkgY2Fubm90IGJlIHZlcmlmaWVkOiB1bmtub3duIG9yIGludmFsaWQgaG9zdCBrZXkuIik7Ci0JCXJldHVybiAwOwotCX0KLQkvKiBBIG1hdGNoaW5nIGhvc3Qga2V5IHdhcyBmb3VuZCBhbmQgaXMga25vd24uICovCi0KLQkvKiBQZXJmb3JtIHRoZSBjaGFsbGVuZ2UtcmVzcG9uc2UgZGlhbG9nIHdpdGggdGhlIGNsaWVudCBmb3IgdGhlIGhvc3Qga2V5LiAqLwotCWlmICghYXV0aF9yc2FfY2hhbGxlbmdlX2RpYWxvZyhjbGllbnRfaG9zdF9rZXkpKSB7Ci0JCWxvZ2l0KCJDbGllbnQgb24gJS44MDBzIGZhaWxlZCB0byByZXNwb25kIGNvcnJlY3RseSB0byBob3N0IGF1dGhlbnRpY2F0aW9uLiIsCi0JCSAgICBjaG9zdCk7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIFdlIGhhdmUgYXV0aGVudGljYXRlZCB0aGUgdXNlciB1c2luZyAucmhvc3RzIG9yIC9ldGMvaG9zdHMuZXF1aXYsCi0JICogYW5kIHRoZSBob3N0IHVzaW5nIFJTQS4gV2UgYWNjZXB0IHRoZSBhdXRoZW50aWNhdGlvbi4KLQkgKi8KLQotCXZlcmJvc2UoIlJob3N0cyB3aXRoIFJTQSBob3N0IGF1dGhlbnRpY2F0aW9uIGFjY2VwdGVkIGZvciAlLjEwMHMsICUuMTAwcyBvbiAlLjcwMHMuIiwKLQkgICAgcHctPnB3X25hbWUsIGN1c2VyLCBjaG9zdCk7Ci0JcGFja2V0X3NlbmRfZGVidWcoIlJob3N0cyB3aXRoIFJTQSBob3N0IGF1dGhlbnRpY2F0aW9uIGFjY2VwdGVkLiIpOwotCXJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvYXV0aC1yaG9zdHMuYyBiL2F1dGgtcmhvc3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWU3ZjAuLjAwMDAwMDAKLS0tIGEvYXV0aC1yaG9zdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKiAkT3BlbkJTRDogYXV0aC1yaG9zdHMuYyx2IDEuNDQgMjAxMC8wMy8wNyAxMTo1NzoxMyBkdHVja2VyIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogUmhvc3RzIGF1dGhlbnRpY2F0aW9uLiAgVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgdG8gY2hlY2sgd2hldGhlciB0byBhZG1pdAotICogdGhlIGxvZ2luIGJhc2VkIG9uIHJob3N0cyBhdXRoZW50aWNhdGlvbi4gIFRoaXMgZmlsZSBhbHNvIHByb2Nlc3NlcwotICogL2V0Yy9ob3N0cy5lcXVpdi4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmZGVmIEhBVkVfTkVUR1JPVVBfSAotIyBpbmNsdWRlIDxuZXRncm91cC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAidWlkc3dhcC5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgInNlcnZjb25mLmgiCi0jaW5jbHVkZSAiY2Fub2hvc3QuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotI2luY2x1ZGUgImF1dGguaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLS8qIGltcG9ydCAqLwotZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKLWV4dGVybiBpbnQgdXNlX3ByaXZzZXA7Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbiByaG9zdHMtc3R5bGUgZmlsZSAoLnJob3N0cywgLnNob3N0cywgb3IKLSAqIC9ldGMvaG9zdHMuZXF1aXYpLiAgVGhpcyByZXR1cm5zIHRydWUgaWYgYXV0aGVudGljYXRpb24gY2FuIGJlIGdyYW50ZWQKLSAqIGJhc2VkIG9uIHRoZSBmaWxlLCBhbmQgcmV0dXJucyB6ZXJvIG90aGVyd2lzZS4KLSAqLwotCi1zdGF0aWMgaW50Ci1jaGVja19yaG9zdHNfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqaG9zdG5hbWUsCi0JCSAgY29uc3QgY2hhciAqaXBhZGRyLCBjb25zdCBjaGFyICpjbGllbnRfdXNlciwKLQkJICBjb25zdCBjaGFyICpzZXJ2ZXJfdXNlcikKLXsKLQlGSUxFICpmOwotCWNoYXIgYnVmWzEwMjRdOwkvKiBNdXN0IG5vdCBiZSBsYXJnZXIgdGhhbiBob3N0LCB1c2VyLCBkdW1teSBiZWxvdy4gKi8KLQlpbnQgZmQ7Ci0Jc3RydWN0IHN0YXQgc3Q7Ci0KLQkvKiBPcGVuIHRoZSAucmhvc3RzIGZpbGUsIGRlbnkgaWYgdW5yZWFkYWJsZSAqLwotCWlmICgoZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWXxPX05PTkJMT0NLKSkgPT0gLTEpCi0JCXJldHVybiAwOwotCWlmIChmc3RhdChmZCwgJnN0KSA9PSAtMSkgewotCQljbG9zZShmZCk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIVNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKLQkJbG9naXQoIlVzZXIgJXMgaG9zdHMgZmlsZSAlcyBpcyBub3QgYSByZWd1bGFyIGZpbGUiLAotCQkgICAgc2VydmVyX3VzZXIsIGZpbGVuYW1lKTsKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JdW5zZXRfbm9uYmxvY2soZmQpOwotCWlmICgoZiA9IGZkb3BlbihmZCwgInIiKSkgPT0gTlVMTCkgewotCQljbG9zZShmZCk7Ci0JCXJldHVybiAwOwotCX0KLQl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpIHsKLQkJLyogQWxsIHRocmVlIG11c3QgYmUgYXQgbGVhc3QgYXMgYmlnIGFzIGJ1ZiB0byBhdm9pZCBvdmVyZmxvd3MuICovCi0JCWNoYXIgaG9zdGJ1ZlsxMDI0XSwgdXNlcmJ1ZlsxMDI0XSwgZHVtbXlbMTAyNF0sICpob3N0LCAqdXNlciwgKmNwOwotCQlpbnQgbmVnYXRlZDsKLQotCQlmb3IgKGNwID0gYnVmOyAqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnOyBjcCsrKQotCQkJOwotCQlpZiAoKmNwID09ICcjJyB8fCAqY3AgPT0gJ1xuJyB8fCAhKmNwKQotCQkJY29udGludWU7Ci0KLQkJLyoKLQkJICogTk9fUExVUyBpcyBzdXBwb3J0ZWQgYXQgbGVhc3Qgb24gT1NGLzEuICBXZSBza2lwIGl0ICh3ZQotCQkgKiBkb24ndCBldmVyIHN1cHBvcnQgdGhlIHBsdXMgc3ludGF4KS4KLQkJICovCi0JCWlmIChzdHJuY21wKGNwLCAiTk9fUExVUyIsIDcpID09IDApCi0JCQljb250aW51ZTsKLQotCQkvKgotCQkgKiBUaGlzIHNob3VsZCBiZSBzYWZlIGJlY2F1c2UgZWFjaCBidWZmZXIgaXMgYXMgYmlnIGFzIHRoZQotCQkgKiB3aG9sZSBzdHJpbmcsIGFuZCB0aHVzIGNhbm5vdCBiZSBvdmVyd3JpdHRlbi4KLQkJICovCi0JCXN3aXRjaCAoc3NjYW5mKGJ1ZiwgIiUxMDIzcyAlMTAyM3MgJTEwMjNzIiwgaG9zdGJ1ZiwgdXNlcmJ1ZiwKLQkJICAgIGR1bW15KSkgewotCQljYXNlIDA6Ci0JCQlhdXRoX2RlYnVnX2FkZCgiRm91bmQgZW1wdHkgbGluZSBpbiAlLjEwMHMuIiwgZmlsZW5hbWUpOwotCQkJY29udGludWU7Ci0JCWNhc2UgMToKLQkJCS8qIEhvc3QgbmFtZSBvbmx5LiAqLwotCQkJc3RybGNweSh1c2VyYnVmLCBzZXJ2ZXJfdXNlciwgc2l6ZW9mKHVzZXJidWYpKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQkvKiBHb3QgYm90aCBob3N0IGFuZCB1c2VyIG5hbWUuICovCi0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJYXV0aF9kZWJ1Z19hZGQoIkZvdW5kIGdhcmJhZ2UgaW4gJS4xMDBzLiIsIGZpbGVuYW1lKTsKLQkJCWNvbnRpbnVlOwotCQlkZWZhdWx0OgotCQkJLyogV2VpcmQuLi4gKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaG9zdCA9IGhvc3RidWY7Ci0JCXVzZXIgPSB1c2VyYnVmOwotCQluZWdhdGVkID0gMDsKLQotCQkvKiBQcm9jZXNzIG5lZ2F0ZWQgaG9zdCBuYW1lcywgb3IgcG9zaXRpdmUgbmV0Z3JvdXBzLiAqLwotCQlpZiAoaG9zdFswXSA9PSAnLScpIHsKLQkJCW5lZ2F0ZWQgPSAxOwotCQkJaG9zdCsrOwotCQl9IGVsc2UgaWYgKGhvc3RbMF0gPT0gJysnKQotCQkJaG9zdCsrOwotCi0JCWlmICh1c2VyWzBdID09ICctJykgewotCQkJbmVnYXRlZCA9IDE7Ci0JCQl1c2VyKys7Ci0JCX0gZWxzZSBpZiAodXNlclswXSA9PSAnKycpCi0JCQl1c2VyKys7Ci0KLQkJLyogQ2hlY2sgZm9yIGVtcHR5IGhvc3QvdXNlciBuYW1lcyAocGFydGljdWxhcmx5ICcrJykuICovCi0JCWlmICghaG9zdFswXSB8fCAhdXNlclswXSkgewotCQkJLyogV2UgY29tZSBoZXJlIGlmIGVpdGhlciB3YXMgJysnIG9yICctJy4gKi8KLQkJCWF1dGhfZGVidWdfYWRkKCJJZ25vcmluZyB3aWxkIGhvc3QvdXNlciBuYW1lcyBpbiAlLjEwMHMuIiwKLQkJCSAgICBmaWxlbmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQkvKiBWZXJpZnkgdGhhdCBob3N0IG5hbWUgbWF0Y2hlcy4gKi8KLQkJaWYgKGhvc3RbMF0gPT0gJ0AnKSB7Ci0JCQlpZiAoIWlubmV0Z3IoaG9zdCArIDEsIGhvc3RuYW1lLCBOVUxMLCBOVUxMKSAmJgotCQkJICAgICFpbm5ldGdyKGhvc3QgKyAxLCBpcGFkZHIsIE5VTEwsIE5VTEwpKQotCQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKHN0cmNhc2VjbXAoaG9zdCwgaG9zdG5hbWUpICYmIHN0cmNtcChob3N0LCBpcGFkZHIpICE9IDApCi0JCQljb250aW51ZTsJLyogRGlmZmVyZW50IGhvc3RuYW1lLiAqLwotCi0JCS8qIFZlcmlmeSB0aGF0IHVzZXIgbmFtZSBtYXRjaGVzLiAqLwotCQlpZiAodXNlclswXSA9PSAnQCcpIHsKLQkJCWlmICghaW5uZXRncih1c2VyICsgMSwgTlVMTCwgY2xpZW50X3VzZXIsIE5VTEwpKQotCQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKHN0cmNtcCh1c2VyLCBjbGllbnRfdXNlcikgIT0gMCkKLQkJCWNvbnRpbnVlOwkvKiBEaWZmZXJlbnQgdXNlcm5hbWUuICovCi0KLQkJLyogRm91bmQgdGhlIHVzZXIgYW5kIGhvc3QuICovCi0JCWZjbG9zZShmKTsKLQotCQkvKiBJZiB0aGUgZW50cnkgd2FzIG5lZ2F0ZWQsIGRlbnkgYWNjZXNzLiAqLwotCQlpZiAobmVnYXRlZCkgewotCQkJYXV0aF9kZWJ1Z19hZGQoIk1hdGNoZWQgbmVnYXRpdmUgZW50cnkgaW4gJS4xMDBzLiIsCi0JCQkgICAgZmlsZW5hbWUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJLyogQWNjZXB0IGF1dGhlbnRpY2F0aW9uLiAqLwotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiBBdXRoZW50aWNhdGlvbiB1c2luZyB0aGlzIGZpbGUgZGVuaWVkLiAqLwotCWZjbG9zZShmKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRyaWVzIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciB1c2luZyB0aGUgLnNob3N0cyBvciAucmhvc3RzIGZpbGUuIFJldHVybnMKLSAqIHRydWUgaWYgYXV0aGVudGljYXRpb24gc3VjY2VlZHMuICBJZiBpZ25vcmVfcmhvc3RzIGlzIHRydWUsIG9ubHkKLSAqIC9ldGMvaG9zdHMuZXF1aXYgd2lsbCBiZSBjb25zaWRlcmVkICgucmhvc3RzIGFuZCAuc2hvc3RzIGFyZSBpZ25vcmVkKS4KLSAqLwotCi1pbnQKLWF1dGhfcmhvc3RzKHN0cnVjdCBwYXNzd2QgKnB3LCBjb25zdCBjaGFyICpjbGllbnRfdXNlcikKLXsKLQljb25zdCBjaGFyICpob3N0bmFtZSwgKmlwYWRkcjsKLQotCWhvc3RuYW1lID0gZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZShvcHRpb25zLnVzZV9kbnMpOwotCWlwYWRkciA9IGdldF9yZW1vdGVfaXBhZGRyKCk7Ci0JcmV0dXJuIGF1dGhfcmhvc3RzMihwdywgY2xpZW50X3VzZXIsIGhvc3RuYW1lLCBpcGFkZHIpOwotfQotCi1zdGF0aWMgaW50Ci1hdXRoX3Job3N0czJfcmF3KHN0cnVjdCBwYXNzd2QgKnB3LCBjb25zdCBjaGFyICpjbGllbnRfdXNlciwgY29uc3QgY2hhciAqaG9zdG5hbWUsCi0gICAgY29uc3QgY2hhciAqaXBhZGRyKQotewotCWNoYXIgYnVmWzEwMjRdOwotCXN0cnVjdCBzdGF0IHN0OwotCXN0YXRpYyBjb25zdCBjaGFyICpyaG9zdHNfZmlsZXNbXSA9IHsiLnNob3N0cyIsICIucmhvc3RzIiwgTlVMTH07Ci0JdV9pbnQgcmhvc3RzX2ZpbGVfaW5kZXg7Ci0KLQlkZWJ1ZzIoImF1dGhfcmhvc3RzMjogY2xpZW50dXNlciAlcyBob3N0bmFtZSAlcyBpcGFkZHIgJXMiLAotCSAgICBjbGllbnRfdXNlciwgaG9zdG5hbWUsIGlwYWRkcik7Ci0KLQkvKiBTd2l0Y2ggdG8gdGhlIHVzZXIncyB1aWQuICovCi0JdGVtcG9yYXJpbHlfdXNlX3VpZChwdyk7Ci0JLyoKLQkgKiBRdWljayBjaGVjazogaWYgdGhlIHVzZXIgaGFzIG5vIC5zaG9zdHMgb3IgLnJob3N0cyBmaWxlcywgcmV0dXJuCi0JICogZmFpbHVyZSBpbW1lZGlhdGVseSB3aXRob3V0IGRvaW5nIGNvc3RseSBsb29rdXBzIGZyb20gbmFtZQotCSAqIHNlcnZlcnMuCi0JICovCi0JZm9yIChyaG9zdHNfZmlsZV9pbmRleCA9IDA7IHJob3N0c19maWxlc1tyaG9zdHNfZmlsZV9pbmRleF07Ci0JICAgIHJob3N0c19maWxlX2luZGV4KyspIHsKLQkJLyogQ2hlY2sgdXNlcnMgLnJob3N0cyBvciAuc2hvc3RzLiAqLwotCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICIlLjUwMHMvJS4xMDBzIiwKLQkJCSBwdy0+cHdfZGlyLCByaG9zdHNfZmlsZXNbcmhvc3RzX2ZpbGVfaW5kZXhdKTsKLQkJaWYgKHN0YXQoYnVmLCAmc3QpID49IDApCi0JCQlicmVhazsKLQl9Ci0JLyogU3dpdGNoIGJhY2sgdG8gcHJpdmlsZWdlZCB1aWQuICovCi0JcmVzdG9yZV91aWQoKTsKLQotCS8qIERlbnkgaWYgVGhlIHVzZXIgaGFzIG5vIC5zaG9zdHMgb3IgLnJob3N0cyBmaWxlIGFuZCB0aGVyZSBhcmUgbm8gc3lzdGVtLXdpZGUgZmlsZXMuICovCi0JaWYgKCFyaG9zdHNfZmlsZXNbcmhvc3RzX2ZpbGVfaW5kZXhdICYmCi0JICAgIHN0YXQoX1BBVEhfUkhPU1RTX0VRVUlWLCAmc3QpIDwgMCAmJgotCSAgICBzdGF0KF9QQVRIX1NTSF9IT1NUU19FUVVJViwgJnN0KSA8IDApCi0JCXJldHVybiAwOwotCi0JLyogSWYgbm90IGxvZ2dpbmcgaW4gYXMgc3VwZXJ1c2VyLCB0cnkgL2V0Yy9ob3N0cy5lcXVpdiBhbmQgc2hvc3RzLmVxdWl2LiAqLwotCWlmIChwdy0+cHdfdWlkICE9IDApIHsKLQkJaWYgKGNoZWNrX3Job3N0c19maWxlKF9QQVRIX1JIT1NUU19FUVVJViwgaG9zdG5hbWUsIGlwYWRkciwKLQkJICAgIGNsaWVudF91c2VyLCBwdy0+cHdfbmFtZSkpIHsKLQkJCWF1dGhfZGVidWdfYWRkKCJBY2NlcHRlZCBmb3IgJS4xMDBzIFslLjEwMHNdIGJ5IC9ldGMvaG9zdHMuZXF1aXYuIiwKLQkJCSAgICBob3N0bmFtZSwgaXBhZGRyKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCWlmIChjaGVja19yaG9zdHNfZmlsZShfUEFUSF9TU0hfSE9TVFNfRVFVSVYsIGhvc3RuYW1lLCBpcGFkZHIsCi0JCSAgICBjbGllbnRfdXNlciwgcHctPnB3X25hbWUpKSB7Ci0JCQlhdXRoX2RlYnVnX2FkZCgiQWNjZXB0ZWQgZm9yICUuMTAwcyBbJS4xMDBzXSBieSAlLjEwMHMuIiwKLQkJCSAgICBob3N0bmFtZSwgaXBhZGRyLCBfUEFUSF9TU0hfSE9TVFNfRVFVSVYpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBDaGVjayB0aGF0IHRoZSBob21lIGRpcmVjdG9yeSBpcyBvd25lZCBieSByb290IG9yIHRoZSB1c2VyLCBhbmQgaXMKLQkgKiBub3QgZ3JvdXAgb3Igd29ybGQgd3JpdGFibGUuCi0JICovCi0JaWYgKHN0YXQocHctPnB3X2RpciwgJnN0KSA8IDApIHsKLQkJbG9naXQoIlJob3N0cyBhdXRoZW50aWNhdGlvbiByZWZ1c2VkIGZvciAlLjEwMHM6ICIKLQkJICAgICJubyBob21lIGRpcmVjdG9yeSAlLjIwMHMiLCBwdy0+cHdfbmFtZSwgcHctPnB3X2Rpcik7Ci0JCWF1dGhfZGVidWdfYWRkKCJSaG9zdHMgYXV0aGVudGljYXRpb24gcmVmdXNlZCBmb3IgJS4xMDBzOiAiCi0JCSAgICAibm8gaG9tZSBkaXJlY3RvcnkgJS4yMDBzIiwgcHctPnB3X25hbWUsIHB3LT5wd19kaXIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKG9wdGlvbnMuc3RyaWN0X21vZGVzICYmCi0JICAgICgoc3Quc3RfdWlkICE9IDAgJiYgc3Quc3RfdWlkICE9IHB3LT5wd191aWQpIHx8Ci0JICAgIChzdC5zdF9tb2RlICYgMDIyKSAhPSAwKSkgewotCQlsb2dpdCgiUmhvc3RzIGF1dGhlbnRpY2F0aW9uIHJlZnVzZWQgZm9yICUuMTAwczogIgotCQkgICAgImJhZCBvd25lcnNoaXAgb3IgbW9kZXMgZm9yIGhvbWUgZGlyZWN0b3J5LiIsIHB3LT5wd19uYW1lKTsKLQkJYXV0aF9kZWJ1Z19hZGQoIlJob3N0cyBhdXRoZW50aWNhdGlvbiByZWZ1c2VkIGZvciAlLjEwMHM6ICIKLQkJICAgICJiYWQgb3duZXJzaGlwIG9yIG1vZGVzIGZvciBob21lIGRpcmVjdG9yeS4iLCBwdy0+cHdfbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQkvKiBUZW1wb3JhcmlseSB1c2UgdGhlIHVzZXIncyB1aWQuICovCi0JdGVtcG9yYXJpbHlfdXNlX3VpZChwdyk7Ci0KLQkvKiBDaGVjayBhbGwgLnJob3N0cyBmaWxlcyAoY3VycmVudGx5IC5zaG9zdHMgYW5kIC5yaG9zdHMpLiAqLwotCWZvciAocmhvc3RzX2ZpbGVfaW5kZXggPSAwOyByaG9zdHNfZmlsZXNbcmhvc3RzX2ZpbGVfaW5kZXhdOwotCSAgICByaG9zdHNfZmlsZV9pbmRleCsrKSB7Ci0JCS8qIENoZWNrIHVzZXJzIC5yaG9zdHMgb3IgLnNob3N0cy4gKi8KLQkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJS41MDBzLyUuMTAwcyIsCi0JCQkgcHctPnB3X2Rpciwgcmhvc3RzX2ZpbGVzW3Job3N0c19maWxlX2luZGV4XSk7Ci0JCWlmIChzdGF0KGJ1ZiwgJnN0KSA8IDApCi0JCQljb250aW51ZTsKLQotCQkvKgotCQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlsZSBpcyBlaXRoZXIgb3duZWQgYnkgdGhlIHVzZXIgb3IgYnkKLQkJICogcm9vdCwgYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3Qgd3JpdGFibGUgYnkgYW55b25lIGJ1dCB0aGUKLQkJICogb3duZXIuICBUaGlzIGlzIHRvIGhlbHAgYXZvaWQgbm92aWNlcyBhY2NpZGVudGFsbHkKLQkJICogYWxsb3dpbmcgYWNjZXNzIHRvIHRoZWlyIGFjY291bnQgYnkgYW55b25lLgotCQkgKi8KLQkJaWYgKG9wdGlvbnMuc3RyaWN0X21vZGVzICYmCi0JCSAgICAoKHN0LnN0X3VpZCAhPSAwICYmIHN0LnN0X3VpZCAhPSBwdy0+cHdfdWlkKSB8fAotCQkgICAgKHN0LnN0X21vZGUgJiAwMjIpICE9IDApKSB7Ci0JCQlsb2dpdCgiUmhvc3RzIGF1dGhlbnRpY2F0aW9uIHJlZnVzZWQgZm9yICUuMTAwczogYmFkIG1vZGVzIGZvciAlLjIwMHMiLAotCQkJICAgIHB3LT5wd19uYW1lLCBidWYpOwotCQkJYXV0aF9kZWJ1Z19hZGQoIkJhZCBmaWxlIG1vZGVzIGZvciAlLjIwMHMiLCBidWYpOwotCQkJY29udGludWU7Ci0JCX0KLQkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgdG8gaWdub3JlIC5yaG9zdHMgYW5kIC5zaG9zdHMgZmlsZXMuICovCi0JCWlmIChvcHRpb25zLmlnbm9yZV9yaG9zdHMpIHsKLQkJCWF1dGhfZGVidWdfYWRkKCJTZXJ2ZXIgaGFzIGJlZW4gY29uZmlndXJlZCB0byBpZ25vcmUgJS4xMDBzLiIsCi0JCQkgICAgcmhvc3RzX2ZpbGVzW3Job3N0c19maWxlX2luZGV4XSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQkvKiBDaGVjayBpZiBhdXRoZW50aWNhdGlvbiBpcyBwZXJtaXR0ZWQgYnkgdGhlIGZpbGUuICovCi0JCWlmIChjaGVja19yaG9zdHNfZmlsZShidWYsIGhvc3RuYW1lLCBpcGFkZHIsIGNsaWVudF91c2VyLCBwdy0+cHdfbmFtZSkpIHsKLQkJCWF1dGhfZGVidWdfYWRkKCJBY2NlcHRlZCBieSAlLjEwMHMuIiwKLQkJCSAgICByaG9zdHNfZmlsZXNbcmhvc3RzX2ZpbGVfaW5kZXhdKTsKLQkJCS8qIFJlc3RvcmUgdGhlIHByaXZpbGVnZWQgdWlkLiAqLwotCQkJcmVzdG9yZV91aWQoKTsKLQkJCWF1dGhfZGVidWdfYWRkKCJBY2NlcHRlZCBob3N0ICVzIGlwICVzIGNsaWVudF91c2VyICVzIHNlcnZlcl91c2VyICVzIiwKLQkJCQlob3N0bmFtZSwgaXBhZGRyLCBjbGllbnRfdXNlciwgcHctPnB3X25hbWUpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0KLQkvKiBSZXN0b3JlIHRoZSBwcml2aWxlZ2VkIHVpZC4gKi8KLQlyZXN0b3JlX3VpZCgpOwotCXJldHVybiAwOwotfQotCi1pbnQKLWF1dGhfcmhvc3RzMihzdHJ1Y3QgcGFzc3dkICpwdywgY29uc3QgY2hhciAqY2xpZW50X3VzZXIsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAotICAgIGNvbnN0IGNoYXIgKmlwYWRkcikKLXsKLSAgICAgICByZXR1cm4gYXV0aF9yaG9zdHMyX3JhdyhwdywgY2xpZW50X3VzZXIsIGhvc3RuYW1lLCBpcGFkZHIpOwotfQpkaWZmIC0tZ2l0IGEvYXV0aC1yc2EuYyBiL2F1dGgtcnNhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYjQ2Y2QuLjAwMDAwMDAKLS0tIGEvYXV0aC1yc2EuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKiAkT3BlbkJTRDogYXV0aC1yc2EuYyx2IDEuODAgMjAxMS8wNS8yMyAwMzozMDowNyBkam0gRXhwICQgKi8KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiBSU0EtYmFzZWQgYXV0aGVudGljYXRpb24uICBUaGlzIGNvZGUgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGFkbWl0IGEgbG9naW4KLSAqIGJhc2VkIG9uIFJTQSBhdXRoZW50aWNhdGlvbi4gIFRoaXMgZmlsZSBhbHNvIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBjaGVjawotICogdmFsaWRpdHkgb2YgdGhlIGhvc3Qga2V5LgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgotCi0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJyc2EuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJzc2gxLmgiCi0jaW5jbHVkZSAidWlkc3dhcC5oIgotI2luY2x1ZGUgIm1hdGNoLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAicGF0aG5hbWVzLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAic2VydmNvbmYuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJhdXRoLW9wdGlvbnMuaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotI2luY2x1ZGUgImF1dGguaCIKLSNpZmRlZiBHU1NBUEkKLSNpbmNsdWRlICJzc2gtZ3NzLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJtb25pdG9yX3dyYXAuaCIKLSNpbmNsdWRlICJzc2guaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLS8qIGltcG9ydCAqLwotZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKLQotLyoKLSAqIFNlc3Npb24gaWRlbnRpZmllciB0aGF0IGlzIHVzZWQgdG8gYmluZCBrZXkgZXhjaGFuZ2UgYW5kIGF1dGhlbnRpY2F0aW9uCi0gKiByZXNwb25zZXMgdG8gYSBwYXJ0aWN1bGFyIHNlc3Npb24uCi0gKi8KLWV4dGVybiB1X2NoYXIgc2Vzc2lvbl9pZFsxNl07Ci0KLS8qCi0gKiBUaGUgLnNzaC9hdXRob3JpemVkX2tleXMgZmlsZSBjb250YWlucyBwdWJsaWMga2V5cywgb25lIHBlciBsaW5lLCBpbiB0aGUKLSAqIGZvbGxvd2luZyBmb3JtYXQ6Ci0gKiAgIG9wdGlvbnMgYml0cyBlIG4gY29tbWVudAotICogd2hlcmUgYml0cywgZSBhbmQgbiBhcmUgZGVjaW1hbCBudW1iZXJzLAotICogYW5kIGNvbW1lbnQgaXMgYW55IHN0cmluZyBvZiBjaGFyYWN0ZXJzIHVwIHRvIG5ld2xpbmUuICBUaGUgbWF4aW11bQotICogbGVuZ3RoIG9mIGEgbGluZSBpcyBTU0hfTUFYX1BVQktFWV9CWVRFUyBjaGFyYWN0ZXJzLiAgU2VlIHNzaGQoOCkgZm9yIGEKLSAqIGRlc2NyaXB0aW9uIG9mIHRoZSBvcHRpb25zLgotICovCi0KLUJJR05VTSAqCi1hdXRoX3JzYV9nZW5lcmF0ZV9jaGFsbGVuZ2UoS2V5ICprZXkpCi17Ci0JQklHTlVNICpjaGFsbGVuZ2U7Ci0JQk5fQ1RYICpjdHg7Ci0KLQlpZiAoKGNoYWxsZW5nZSA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiYXV0aF9yc2FfZ2VuZXJhdGVfY2hhbGxlbmdlOiBCTl9uZXcoKSBmYWlsZWQiKTsKLQkvKiBHZW5lcmF0ZSBhIHJhbmRvbSBjaGFsbGVuZ2UuICovCi0JaWYgKEJOX3JhbmQoY2hhbGxlbmdlLCAyNTYsIDAsIDApID09IDApCi0JCWZhdGFsKCJhdXRoX3JzYV9nZW5lcmF0ZV9jaGFsbGVuZ2U6IEJOX3JhbmQgZmFpbGVkIik7Ci0JaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJhdXRoX3JzYV9nZW5lcmF0ZV9jaGFsbGVuZ2U6IEJOX0NUWF9uZXcgZmFpbGVkIik7Ci0JaWYgKEJOX21vZChjaGFsbGVuZ2UsIGNoYWxsZW5nZSwga2V5LT5yc2EtPm4sIGN0eCkgPT0gMCkKLQkJZmF0YWwoImF1dGhfcnNhX2dlbmVyYXRlX2NoYWxsZW5nZTogQk5fbW9kIGZhaWxlZCIpOwotCUJOX0NUWF9mcmVlKGN0eCk7Ci0KLQlyZXR1cm4gY2hhbGxlbmdlOwotfQotCi1pbnQKLWF1dGhfcnNhX3ZlcmlmeV9yZXNwb25zZShLZXkgKmtleSwgQklHTlVNICpjaGFsbGVuZ2UsIHVfY2hhciByZXNwb25zZVsxNl0pCi17Ci0JdV9jaGFyIGJ1ZlszMl0sIG1kYnVmWzE2XTsKLQlNRDVfQ1RYIG1kOwotCWludCBsZW47Ci0KLQkvKiBkb24ndCBhbGxvdyBzaG9ydCBrZXlzICovCi0JaWYgKEJOX251bV9iaXRzKGtleS0+cnNhLT5uKSA8IFNTSF9SU0FfTUlOSU1VTV9NT0RVTFVTX1NJWkUpIHsKLQkJZXJyb3IoImF1dGhfcnNhX3ZlcmlmeV9yZXNwb25zZTogUlNBIG1vZHVsdXMgdG9vIHNtYWxsOiAlZCA8IG1pbmltdW0gJWQgYml0cyIsCi0JCSAgICBCTl9udW1fYml0cyhrZXktPnJzYS0+biksIFNTSF9SU0FfTUlOSU1VTV9NT0RVTFVTX1NJWkUpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCS8qIFRoZSByZXNwb25zZSBpcyBNRDUgb2YgZGVjcnlwdGVkIGNoYWxsZW5nZSBwbHVzIHNlc3Npb24gaWQuICovCi0JbGVuID0gQk5fbnVtX2J5dGVzKGNoYWxsZW5nZSk7Ci0JaWYgKGxlbiA8PSAwIHx8IGxlbiA+IDMyKQotCQlmYXRhbCgiYXV0aF9yc2FfdmVyaWZ5X3Jlc3BvbnNlOiBiYWQgY2hhbGxlbmdlIGxlbmd0aCAlZCIsIGxlbik7Ci0JbWVtc2V0KGJ1ZiwgMCwgMzIpOwotCUJOX2JuMmJpbihjaGFsbGVuZ2UsIGJ1ZiArIDMyIC0gbGVuKTsKLQlNRDVfSW5pdCgmbWQpOwotCU1ENV9VcGRhdGUoJm1kLCBidWYsIDMyKTsKLQlNRDVfVXBkYXRlKCZtZCwgc2Vzc2lvbl9pZCwgMTYpOwotCU1ENV9GaW5hbChtZGJ1ZiwgJm1kKTsKLQotCS8qIFZlcmlmeSB0aGF0IHRoZSByZXNwb25zZSBpcyB0aGUgb3JpZ2luYWwgY2hhbGxlbmdlLiAqLwotCWlmICh0aW1pbmdzYWZlX2JjbXAocmVzcG9uc2UsIG1kYnVmLCAxNikgIT0gMCkgewotCQkvKiBXcm9uZyBhbnN3ZXIuICovCi0JCXJldHVybiAoMCk7Ci0JfQotCS8qIENvcnJlY3QgYW5zd2VyLiAqLwotCXJldHVybiAoMSk7Ci19Ci0KLS8qCi0gKiBQZXJmb3JtcyB0aGUgUlNBIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZS1yZXNwb25zZSBkaWFsb2cgd2l0aCB0aGUgY2xpZW50LAotICogYW5kIHJldHVybnMgdHJ1ZSAobm9uLXplcm8pIGlmIHRoZSBjbGllbnQgZ2F2ZSB0aGUgY29ycmVjdCBhbnN3ZXIgdG8KLSAqIG91ciBjaGFsbGVuZ2U7IHJldHVybnMgemVybyBpZiB0aGUgY2xpZW50IGdpdmVzIGEgd3JvbmcgYW5zd2VyLgotICovCi0KLWludAotYXV0aF9yc2FfY2hhbGxlbmdlX2RpYWxvZyhLZXkgKmtleSkKLXsKLQlCSUdOVU0gKmNoYWxsZW5nZSwgKmVuY3J5cHRlZF9jaGFsbGVuZ2U7Ci0JdV9jaGFyIHJlc3BvbnNlWzE2XTsKLQlpbnQgaSwgc3VjY2VzczsKLQotCWlmICgoZW5jcnlwdGVkX2NoYWxsZW5nZSA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiYXV0aF9yc2FfY2hhbGxlbmdlX2RpYWxvZzogQk5fbmV3KCkgZmFpbGVkIik7Ci0KLQljaGFsbGVuZ2UgPSBQUklWU0VQKGF1dGhfcnNhX2dlbmVyYXRlX2NoYWxsZW5nZShrZXkpKTsKLQotCS8qIEVuY3J5cHQgdGhlIGNoYWxsZW5nZSB3aXRoIHRoZSBwdWJsaWMga2V5LiAqLwotCXJzYV9wdWJsaWNfZW5jcnlwdChlbmNyeXB0ZWRfY2hhbGxlbmdlLCBjaGFsbGVuZ2UsIGtleS0+cnNhKTsKLQotCS8qIFNlbmQgdGhlIGVuY3J5cHRlZCBjaGFsbGVuZ2UgdG8gdGhlIGNsaWVudC4gKi8KLQlwYWNrZXRfc3RhcnQoU1NIX1NNU0dfQVVUSF9SU0FfQ0hBTExFTkdFKTsKLQlwYWNrZXRfcHV0X2JpZ251bShlbmNyeXB0ZWRfY2hhbGxlbmdlKTsKLQlwYWNrZXRfc2VuZCgpOwotCUJOX2NsZWFyX2ZyZWUoZW5jcnlwdGVkX2NoYWxsZW5nZSk7Ci0JcGFja2V0X3dyaXRlX3dhaXQoKTsKLQotCS8qIFdhaXQgZm9yIGEgcmVzcG9uc2UuICovCi0JcGFja2V0X3JlYWRfZXhwZWN0KFNTSF9DTVNHX0FVVEhfUlNBX1JFU1BPTlNFKTsKLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJcmVzcG9uc2VbaV0gPSAodV9jaGFyKXBhY2tldF9nZXRfY2hhcigpOwotCXBhY2tldF9jaGVja19lb20oKTsKLQotCXN1Y2Nlc3MgPSBQUklWU0VQKGF1dGhfcnNhX3ZlcmlmeV9yZXNwb25zZShrZXksIGNoYWxsZW5nZSwgcmVzcG9uc2UpKTsKLQlCTl9jbGVhcl9mcmVlKGNoYWxsZW5nZSk7Ci0JcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotc3RhdGljIGludAotcnNhX2tleV9hbGxvd2VkX2luX2ZpbGUoc3RydWN0IHBhc3N3ZCAqcHcsIGNoYXIgKmZpbGUsCi0gICAgY29uc3QgQklHTlVNICpjbGllbnRfbiwgS2V5ICoqcmtleSkKLXsKLQljaGFyIGxpbmVbU1NIX01BWF9QVUJLRVlfQllURVNdOwotCWludCBhbGxvd2VkID0gMDsKLQl1X2ludCBiaXRzOwotCUZJTEUgKmY7Ci0JdV9sb25nIGxpbmVudW0gPSAwOwotCUtleSAqa2V5OwotCi0JZGVidWcoInRyeWluZyBwdWJsaWMgUlNBIGtleSBmaWxlICVzIiwgZmlsZSk7Ci0JaWYgKChmID0gYXV0aF9vcGVua2V5ZmlsZShmaWxlLCBwdywgb3B0aW9ucy5zdHJpY3RfbW9kZXMpKSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogR28gdGhvdWdoIHRoZSBhY2NlcHRlZCBrZXlzLCBsb29raW5nIGZvciB0aGUgY3VycmVudCBrZXkuICBJZgotCSAqIGZvdW5kLCBwZXJmb3JtIGEgY2hhbGxlbmdlLXJlc3BvbnNlIGRpYWxvZyB0byB2ZXJpZnkgdGhhdCB0aGUKLQkgKiB1c2VyIHJlYWxseSBoYXMgdGhlIGNvcnJlc3BvbmRpbmcgcHJpdmF0ZSBrZXkuCi0JICovCi0Ja2V5ID0ga2V5X25ldyhLRVlfUlNBMSk7Ci0Jd2hpbGUgKHJlYWRfa2V5ZmlsZV9saW5lKGYsIGZpbGUsIGxpbmUsIHNpemVvZihsaW5lKSwgJmxpbmVudW0pICE9IC0xKSB7Ci0JCWNoYXIgKmNwOwotCQljaGFyICprZXlfb3B0aW9uczsKLQkJaW50IGtleWJpdHM7Ci0KLQkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UsIGVtcHR5IGFuZCBjb21tZW50IGxpbmVzLiAqLwotCQlmb3IgKGNwID0gbGluZTsgKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JzsgY3ArKykKLQkJCTsKLQkJaWYgKCEqY3AgfHwgKmNwID09ICdcbicgfHwgKmNwID09ICcjJykKLQkJCWNvbnRpbnVlOwotCi0JCS8qCi0JCSAqIENoZWNrIGlmIHRoZXJlIGFyZSBvcHRpb25zIGZvciB0aGlzIGtleSwgYW5kIGlmIHNvLAotCQkgKiBzYXZlIHRoZWlyIHN0YXJ0aW5nIGFkZHJlc3MgYW5kIHNraXAgdGhlIG9wdGlvbiBwYXJ0Ci0JCSAqIGZvciBub3cuICBJZiB0aGVyZSBhcmUgbm8gb3B0aW9ucywgc2V0IHRoZSBzdGFydGluZwotCQkgKiBhZGRyZXNzIHRvIE5VTEwuCi0JCSAqLwotCQlpZiAoKmNwIDwgJzAnIHx8ICpjcCA+ICc5JykgewotCQkJaW50IHF1b3RlZCA9IDA7Ci0JCQlrZXlfb3B0aW9ucyA9IGNwOwotCQkJZm9yICg7ICpjcCAmJiAocXVvdGVkIHx8ICgqY3AgIT0gJyAnICYmICpjcCAhPSAnXHQnKSk7IGNwKyspIHsKLQkJCQlpZiAoKmNwID09ICdcXCcgJiYgY3BbMV0gPT0gJyInKQotCQkJCQljcCsrOwkvKiBTa2lwIGJvdGggKi8KLQkJCQllbHNlIGlmICgqY3AgPT0gJyInKQotCQkJCQlxdW90ZWQgPSAhcXVvdGVkOwotCQkJfQotCQl9IGVsc2UKLQkJCWtleV9vcHRpb25zID0gTlVMTDsKLQotCQkvKiBQYXJzZSB0aGUga2V5IGZyb20gdGhlIGxpbmUuICovCi0JCWlmIChob3N0ZmlsZV9yZWFkX2tleSgmY3AsICZiaXRzLCBrZXkpID09IDApIHsKLQkJCWRlYnVnKCIlLjEwMHMsIGxpbmUgJWx1OiBub24gc3NoMSBrZXkgc3ludGF4IiwKLQkJCSAgICBmaWxlLCBsaW5lbnVtKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIGNwIG5vdyBwb2ludHMgdG8gdGhlIGNvbW1lbnQgcGFydC4gKi8KLQotCQkvKgotCQkgKiBDaGVjayBpZiB0aGUgd2UgaGF2ZSBmb3VuZCB0aGUgZGVzaXJlZCBrZXkgKGlkZW50aWZpZWQKLQkJICogYnkgaXRzIG1vZHVsdXMpLgotCQkgKi8KLQkJaWYgKEJOX2NtcChrZXktPnJzYS0+biwgY2xpZW50X24pICE9IDApCi0JCQljb250aW51ZTsKLQotCQkvKiBjaGVjayB0aGUgcmVhbCBiaXRzICAqLwotCQlrZXliaXRzID0gQk5fbnVtX2JpdHMoa2V5LT5yc2EtPm4pOwotCQlpZiAoa2V5Yml0cyA8IDAgfHwgYml0cyAhPSAodV9pbnQpa2V5Yml0cykKLQkJCWxvZ2l0KCJXYXJuaW5nOiAlcywgbGluZSAlbHU6IGtleXNpemUgbWlzbWF0Y2g6ICIKLQkJCSAgICAiYWN0dWFsICVkIHZzLiBhbm5vdW5jZWQgJWQuIiwKLQkJCSAgICBmaWxlLCBsaW5lbnVtLCBCTl9udW1fYml0cyhrZXktPnJzYS0+biksIGJpdHMpOwotCi0JCS8qIE5ldmVyIGFjY2VwdCBhIHJldm9rZWQga2V5ICovCi0JCWlmIChhdXRoX2tleV9pc19yZXZva2VkKGtleSkpCi0JCQlicmVhazsKLQotCQkvKiBXZSBoYXZlIGZvdW5kIHRoZSBkZXNpcmVkIGtleS4gKi8KLQkJLyoKLQkJICogSWYgb3VyIG9wdGlvbnMgZG8gbm90IGFsbG93IHRoaXMga2V5IHRvIGJlIHVzZWQsCi0JCSAqIGRvIG5vdCBzZW5kIGNoYWxsZW5nZS4KLQkJICovCi0JCWlmICghYXV0aF9wYXJzZV9vcHRpb25zKHB3LCBrZXlfb3B0aW9ucywgZmlsZSwgbGluZW51bSkpCi0JCQljb250aW51ZTsKLQkJaWYgKGtleV9pc19jZXJ0X2F1dGhvcml0eSkKLQkJCWNvbnRpbnVlOwotCQkvKiBicmVhayBvdXQsIHRoaXMga2V5IGlzIGFsbG93ZWQgKi8KLQkJYWxsb3dlZCA9IDE7Ci0JCWJyZWFrOwotCX0KLQotCS8qIENsb3NlIHRoZSBmaWxlLiAqLwotCWZjbG9zZShmKTsKLQotCS8qIHJldHVybiBrZXkgaWYgYWxsb3dlZCAqLwotCWlmIChhbGxvd2VkICYmIHJrZXkgIT0gTlVMTCkKLQkJKnJrZXkgPSBrZXk7Ci0JZWxzZQotCQlrZXlfZnJlZShrZXkpOwotCi0JcmV0dXJuIGFsbG93ZWQ7Ci19Ci0KLS8qCi0gKiBjaGVjayBpZiB0aGVyZSdzIHVzZXIga2V5IG1hdGNoaW5nIGNsaWVudF9uLAotICogcmV0dXJuIGtleSBpZiBsb2dpbiBpcyBhbGxvd2VkLCBOVUxMIG90aGVyd2lzZQotICovCi0KLWludAotYXV0aF9yc2Ffa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqcHcsIEJJR05VTSAqY2xpZW50X24sIEtleSAqKnJrZXkpCi17Ci0JY2hhciAqZmlsZTsKLQl1X2ludCBpLCBhbGxvd2VkID0gMDsKLQotCXRlbXBvcmFyaWx5X3VzZV91aWQocHcpOwotCi0JZm9yIChpID0gMDsgIWFsbG93ZWQgJiYgaSA8IG9wdGlvbnMubnVtX2F1dGhrZXlzX2ZpbGVzOyBpKyspIHsKLQkJZmlsZSA9IGV4cGFuZF9hdXRob3JpemVkX2tleXMoCi0JCSAgICBvcHRpb25zLmF1dGhvcml6ZWRfa2V5c19maWxlc1tpXSwgcHcpOwotCQlhbGxvd2VkID0gcnNhX2tleV9hbGxvd2VkX2luX2ZpbGUocHcsIGZpbGUsIGNsaWVudF9uLCBya2V5KTsKLQkJeGZyZWUoZmlsZSk7Ci0JfQotCi0JcmVzdG9yZV91aWQoKTsKLQotCXJldHVybiBhbGxvd2VkOwotfQotCi0vKgotICogUGVyZm9ybXMgdGhlIFJTQSBhdXRoZW50aWNhdGlvbiBkaWFsb2cgd2l0aCB0aGUgY2xpZW50LiAgVGhpcyByZXR1cm5zCi0gKiAwIGlmIHRoZSBjbGllbnQgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQsIGFuZCAxIGlmIGF1dGhlbnRpY2F0aW9uIHdhcwotICogc3VjY2Vzc2Z1bC4gIFRoaXMgbWF5IGV4aXQgaWYgdGhlcmUgaXMgYSBzZXJpb3VzIHByb3RvY29sIHZpb2xhdGlvbi4KLSAqLwotaW50Ci1hdXRoX3JzYShBdXRoY3R4dCAqYXV0aGN0eHQsIEJJR05VTSAqY2xpZW50X24pCi17Ci0JS2V5ICprZXk7Ci0JY2hhciAqZnA7Ci0Jc3RydWN0IHBhc3N3ZCAqcHcgPSBhdXRoY3R4dC0+cHc7Ci0KLQkvKiBubyB1c2VyIGdpdmVuICovCi0JaWYgKCFhdXRoY3R4dC0+dmFsaWQpCi0JCXJldHVybiAwOwotCi0JaWYgKCFQUklWU0VQKGF1dGhfcnNhX2tleV9hbGxvd2VkKHB3LCBjbGllbnRfbiwgJmtleSkpKSB7Ci0JCWF1dGhfY2xlYXJfb3B0aW9ucygpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCS8qIFBlcmZvcm0gdGhlIGNoYWxsZW5nZS1yZXNwb25zZSBkaWFsb2cgZm9yIHRoaXMga2V5LiAqLwotCWlmICghYXV0aF9yc2FfY2hhbGxlbmdlX2RpYWxvZyhrZXkpKSB7Ci0JCS8qIFdyb25nIHJlc3BvbnNlLiAqLwotCQl2ZXJib3NlKCJXcm9uZyByZXNwb25zZSB0byBSU0EgYXV0aGVudGljYXRpb24gY2hhbGxlbmdlLiIpOwotCQlwYWNrZXRfc2VuZF9kZWJ1ZygiV3JvbmcgcmVzcG9uc2UgdG8gUlNBIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZS4iKTsKLQkJLyoKLQkJICogQnJlYWsgb3V0IG9mIHRoZSBsb29wLiBPdGhlcndpc2Ugd2UgbWlnaHQgc2VuZAotCQkgKiBhbm90aGVyIGNoYWxsZW5nZSBhbmQgYnJlYWsgdGhlIHByb3RvY29sLgotCQkgKi8KLQkJa2V5X2ZyZWUoa2V5KTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JLyoKLQkgKiBDb3JyZWN0IHJlc3BvbnNlLiAgVGhlIGNsaWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKLQkgKiBhdXRoZW50aWNhdGVkLiBOb3RlIHRoYXQgd2UgaGF2ZSBub3QgeWV0IHByb2Nlc3NlZCB0aGUKLQkgKiBvcHRpb25zOyB0aGlzIHdpbGwgYmUgcmVzZXQgaWYgdGhlIG9wdGlvbnMgY2F1c2UgdGhlCi0JICogYXV0aGVudGljYXRpb24gdG8gYmUgcmVqZWN0ZWQuCi0JICovCi0JZnAgPSBrZXlfZmluZ2VycHJpbnQoa2V5LCBTU0hfRlBfTUQ1LCBTU0hfRlBfSEVYKTsKLQl2ZXJib3NlKCJGb3VuZCBtYXRjaGluZyAlcyBrZXk6ICVzIiwKLQkgICAga2V5X3R5cGUoa2V5KSwgZnApOwotCXhmcmVlKGZwKTsKLQlrZXlfZnJlZShrZXkpOwotCi0JcGFja2V0X3NlbmRfZGVidWcoIlJTQSBhdXRoZW50aWNhdGlvbiBhY2NlcHRlZC4iKTsKLQlyZXR1cm4gKDEpOwotfQpkaWZmIC0tZ2l0IGEvYXV0aC1zaGFkb3cuYyBiL2F1dGgtc2hhZG93LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTA5MTYuLjAwMDAwMDAKLS0tIGEvYXV0aC1zaGFkb3cuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA0IERhcnJlbiBUdWNrZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmIGRlZmluZWQoVVNFX1NIQURPVykgJiYgZGVmaW5lZChIQVNfU0hBRE9XX0VYUElSRSkKLSNpbmNsdWRlIDxzaGFkb3cuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotI2luY2x1ZGUgImF1dGguaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJsb2cuaCIKLQotI2lmZGVmIERBWQotIyB1bmRlZiBEQVkKLSNlbmRpZgotI2RlZmluZSBEQVkJKDI0TCAqIDYwICogNjApIC8qIDEgZGF5IGluIHNlY29uZHMgKi8KLQotZXh0ZXJuIEJ1ZmZlciBsb2dpbm1zZzsKLQotLyoKLSAqIEZvciB0aGUgYWNjb3VudCBhbmQgcGFzc3dvcmQgZXhwaXJhdGlvbiBmdW5jdGlvbnMsIHdlIGFzc3VtZSB0aGUgZXhwaXJ5Ci0gKiBvY2N1cnMgdGhlIGRheSBhZnRlciB0aGUgZGF5IHNwZWNpZmllZC4KLSAqLwotCi0vKgotICogQ2hlY2sgaWYgc3BlY2lmaWVkIGFjY291bnQgaXMgZXhwaXJlZC4gIFJldHVybnMgMSBpZiBhY2NvdW50IGlzIGV4cGlyZWQsCi0gKiAwIG90aGVyd2lzZS4KLSAqLwotaW50Ci1hdXRoX3NoYWRvd19hY2N0ZXhwaXJlZChzdHJ1Y3Qgc3B3ZCAqc3B3KQotewotCXRpbWVfdCB0b2RheTsKLQlpbnQgZGF5c2xlZnQ7Ci0JY2hhciBidWZbMjU2XTsKLQotCXRvZGF5ID0gdGltZShOVUxMKSAvIERBWTsKLQlkYXlzbGVmdCA9IHNwdy0+c3BfZXhwaXJlIC0gdG9kYXk7Ci0JZGVidWczKCIlczogdG9kYXkgJWQgc3BfZXhwaXJlICVkIGRheXMgbGVmdCAlZCIsIF9fZnVuY19fLCAoaW50KXRvZGF5LAotCSAgICAoaW50KXNwdy0+c3BfZXhwaXJlLCBkYXlzbGVmdCk7Ci0KLQlpZiAoc3B3LT5zcF9leHBpcmUgPT0gLTEpIHsKLQkJZGVidWczKCJhY2NvdW50IGV4cGlyYXRpb24gZGlzYWJsZWQiKTsKLQl9IGVsc2UgaWYgKGRheXNsZWZ0IDwgMCkgewotCQlsb2dpdCgiQWNjb3VudCAlLjEwMHMgaGFzIGV4cGlyZWQiLCBzcHctPnNwX25hbXApOwotCQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKGRheXNsZWZ0IDw9IHNwdy0+c3Bfd2FybikgewotCQlkZWJ1ZzMoImFjY291bnQgd2lsbCBleHBpcmUgaW4gJWQgZGF5cyIsIGRheXNsZWZ0KTsKLQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJICAgICJZb3VyIGFjY291bnQgd2lsbCBleHBpcmUgaW4gJWQgZGF5JXMuXG4iLCBkYXlzbGVmdCwKLQkJICAgIGRheXNsZWZ0ID09IDEgPyAiIiA6ICJzIik7Ci0JCWJ1ZmZlcl9hcHBlbmQoJmxvZ2lubXNnLCBidWYsIHN0cmxlbihidWYpKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIENoZWNrcyBwYXNzd29yZCBleHBpcnkgZm9yIHBsYXRmb3JtcyB0aGF0IHVzZSBzaGFkb3cgcGFzc3dkIGZpbGVzLgotICogUmV0dXJuczogMSA9IHBhc3N3b3JkIGV4cGlyZWQsIDAgPSBwYXNzd29yZCBub3QgZXhwaXJlZAotICovCi1pbnQKLWF1dGhfc2hhZG93X3B3ZXhwaXJlZChBdXRoY3R4dCAqY3R4dCkKLXsKLQlzdHJ1Y3Qgc3B3ZCAqc3B3ID0gTlVMTDsKLQljb25zdCBjaGFyICp1c2VyID0gY3R4dC0+cHctPnB3X25hbWU7Ci0JY2hhciBidWZbMjU2XTsKLQl0aW1lX3QgdG9kYXk7Ci0JaW50IGRheXNsZWZ0LCBkaXNhYmxlZCA9IDA7Ci0KLQlpZiAoKHNwdyA9IGdldHNwbmFtKChjaGFyICopdXNlcikpID09IE5VTEwpIHsKLQkJZXJyb3IoIkNvdWxkIG5vdCBnZXQgc2hhZG93IGluZm9ybWF0aW9uIGZvciAlLjEwMHMiLCB1c2VyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JdG9kYXkgPSB0aW1lKE5VTEwpIC8gREFZOwotCWRlYnVnMygiJXM6IHRvZGF5ICVkIHNwX2xzdGNoZyAlZCBzcF9tYXggJWQiLCBfX2Z1bmNfXywgKGludCl0b2RheSwKLQkgICAgKGludClzcHctPnNwX2xzdGNoZywgKGludClzcHctPnNwX21heCk7Ci0KLSNpZiBkZWZpbmVkKF9faHB1eCkgJiYgIWRlZmluZWQoSEFWRV9TRUNVUkVXQVJFKQotCWlmIChpc2NvbXNlYygpKSB7Ci0JCXN0cnVjdCBwcl9wYXNzd2QgKnByOwotCi0JCXByID0gZ2V0cHJwd25hbSgoY2hhciAqKXVzZXIpOwotCi0JCS8qIFRlc3QgZm9yIFRydXN0ZWQgTW9kZSBleHBpcnkgZGlzYWJsZWQgKi8KLQkJaWYgKHByICE9IE5VTEwgJiYgcHItPnVmbGQuZmRfbWluID09IDAgJiYKLQkJICAgIHByLT51ZmxkLmZkX2xpZmV0aW1lID09IDAgJiYgcHItPnVmbGQuZmRfZXhwaXJlID09IDAgJiYKLQkJICAgIHByLT51ZmxkLmZkX3B3X2V4cGlyZV93YXJuaW5nID09IDAgJiYKLQkJICAgIHByLT51ZmxkLmZkX3NjaGFuZ2UgIT0gMCkKLQkJCWRpc2FibGVkID0gMTsKLQl9Ci0jZW5kaWYKLQotCS8qIFRPRE86IGNoZWNrIHNwX2luYWN0ICovCi0JZGF5c2xlZnQgPSBzcHctPnNwX2xzdGNoZyArIHNwdy0+c3BfbWF4IC0gdG9kYXk7Ci0JaWYgKGRpc2FibGVkKSB7Ci0JCWRlYnVnMygicGFzc3dvcmQgZXhwaXJhdGlvbiBkaXNhYmxlZCIpOwotCX0gZWxzZSBpZiAoc3B3LT5zcF9sc3RjaGcgPT0gMCkgewotCQlsb2dpdCgiVXNlciAlLjEwMHMgcGFzc3dvcmQgaGFzIGV4cGlyZWQgKHJvb3QgZm9yY2VkKSIsIHVzZXIpOwotCQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKHNwdy0+c3BfbWF4ID09IC0xKSB7Ci0JCWRlYnVnMygicGFzc3dvcmQgZXhwaXJhdGlvbiBkaXNhYmxlZCIpOwotCX0gZWxzZSBpZiAoZGF5c2xlZnQgPCAwKSB7Ci0JCWxvZ2l0KCJVc2VyICUuMTAwcyBwYXNzd29yZCBoYXMgZXhwaXJlZCAocGFzc3dvcmQgYWdlZCkiLCB1c2VyKTsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIGlmIChkYXlzbGVmdCA8PSBzcHctPnNwX3dhcm4pIHsKLQkJZGVidWczKCJwYXNzd29yZCB3aWxsIGV4cGlyZSBpbiAlZCBkYXlzIiwgZGF5c2xlZnQpOwotCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkgICAgIllvdXIgcGFzc3dvcmQgd2lsbCBleHBpcmUgaW4gJWQgZGF5JXMuXG4iLCBkYXlzbGVmdCwKLQkJICAgIGRheXNsZWZ0ID09IDEgPyAiIiA6ICJzIik7Ci0JCWJ1ZmZlcl9hcHBlbmQoJmxvZ2lubXNnLCBidWYsIHN0cmxlbihidWYpKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgkvKiBVU0VfU0hBRE9XICYmIEhBU19TSEFET1dfRVhQSVJFICovCmRpZmYgLS1naXQgYS9hdXRoLXNpYS5jIGIvYXV0aC1zaWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllMWMyNS4uMDAwMDAwMAotLS0gYS9hdXRoLXNpYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgQ2hyaXMgQWRhbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmZGVmIEhBVkVfT1NGX1NJQQotI2luY2x1ZGUgPHNpYS5oPgotI2luY2x1ZGUgPHNpYWQuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgImF1dGgtc2lhLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAic2VydmNvbmYuaCIKLSNpbmNsdWRlICJjYW5vaG9zdC5oIgotI2luY2x1ZGUgInVpZHN3YXAuaCIKLQotZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKLWV4dGVybiBpbnQgc2F2ZWRfYXJnYzsKLWV4dGVybiBjaGFyICoqc2F2ZWRfYXJndjsKLQotaW50Ci1zeXNfYXV0aF9wYXNzd2QoQXV0aGN0eHQgKmF1dGhjdHh0LCBjb25zdCBjaGFyICpwYXNzKQotewotCWludCByZXQ7Ci0JU0lBRU5USVRZICplbnQgPSBOVUxMOwotCWNvbnN0IGNoYXIgKmhvc3Q7Ci0KLQlob3N0ID0gZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZShvcHRpb25zLnVzZV9kbnMpOwotCi0JaWYgKCFhdXRoY3R4dC0+dXNlciB8fCBwYXNzID09IE5VTEwgfHwgcGFzc1swXSA9PSAnXDAnKQotCQlyZXR1cm4gKDApOwotCi0JaWYgKHNpYV9zZXNfaW5pdCgmZW50LCBzYXZlZF9hcmdjLCBzYXZlZF9hcmd2LCBob3N0LCBhdXRoY3R4dC0+dXNlciwKLQkgICAgTlVMTCwgMCwgTlVMTCkgIT0gU0lBU1VDQ0VTUykKLQkJcmV0dXJuICgwKTsKLQotCWlmICgocmV0ID0gc2lhX3Nlc19hdXRoZW50KE5VTEwsIHBhc3MsIGVudCkpICE9IFNJQVNVQ0NFU1MpIHsKLQkJZXJyb3IoIkNvdWxkbid0IGF1dGhlbnRpY2F0ZSAlcyBmcm9tICVzIiwKLQkJICAgIGF1dGhjdHh0LT51c2VyLCBob3N0KTsKLQkJaWYgKHJldCAmIFNJQVNUT1ApCi0JCQlzaWFfc2VzX3JlbGVhc2UoJmVudCk7Ci0KLQkJcmV0dXJuICgwKTsKLQl9Ci0KLQlzaWFfc2VzX3JlbGVhc2UoJmVudCk7Ci0KLQlyZXR1cm4gKDEpOwotfQotCi12b2lkCi1zZXNzaW9uX3NldHVwX3NpYShzdHJ1Y3QgcGFzc3dkICpwdywgY2hhciAqdHR5KQotewotCVNJQUVOVElUWSAqZW50ID0gTlVMTDsKLQljb25zdCBjaGFyICpob3N0OwotCi0JaG9zdCA9IGdldF9jYW5vbmljYWxfaG9zdG5hbWUob3B0aW9ucy51c2VfZG5zKTsKLQotCWlmIChzaWFfc2VzX2luaXQoJmVudCwgc2F2ZWRfYXJnYywgc2F2ZWRfYXJndiwgaG9zdCwgcHctPnB3X25hbWUsCi0JICAgIHR0eSwgMCwgTlVMTCkgIT0gU0lBU1VDQ0VTUykKLQkJZmF0YWwoInNpYV9zZXNfaW5pdCBmYWlsZWQiKTsKLQotCWlmIChzaWFfbWFrZV9lbnRpdHlfcHdkKHB3LCBlbnQpICE9IFNJQVNVQ0NFU1MpIHsKLQkJc2lhX3Nlc19yZWxlYXNlKCZlbnQpOwotCQlmYXRhbCgic2lhX21ha2VfZW50aXR5X3B3ZCBmYWlsZWQiKTsKLQl9Ci0KLQllbnQtPmF1dGh0eXBlID0gU0lBX0FfTk9ORTsKLQlpZiAoc2lhX3Nlc19lc3RhYihzaWFfY29sbGVjdF90cm0sIGVudCkgIT0gU0lBU1VDQ0VTUykKLQkJZmF0YWwoIkNvdWxkbid0IGVzdGFibGlzaCBzZXNzaW9uIGZvciAlcyBmcm9tICVzIiwKLQkJICAgIHB3LT5wd19uYW1lLCBob3N0KTsKLQotCWlmIChzaWFfc2VzX2xhdW5jaChzaWFfY29sbGVjdF90cm0sIGVudCkgIT0gU0lBU1VDQ0VTUykKLQkJZmF0YWwoIkNvdWxkbid0IGxhdW5jaCBzZXNzaW9uIGZvciAlcyBmcm9tICVzIiwKLQkJICAgIHB3LT5wd19uYW1lLCBob3N0KTsKLQotCXNpYV9zZXNfcmVsZWFzZSgmZW50KTsKLQotCXNldHVpZCgwKTsKLQlwZXJtYW5lbnRseV9zZXRfdWlkKHB3KTsKLX0KLQotI2VuZGlmIC8qIEhBVkVfT1NGX1NJQSAqLwpkaWZmIC0tZ2l0IGEvYXV0aC1zaWEuaCBiL2F1dGgtc2lhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Y2JiOTMuLjAwMDAwMDAKLS0tIGEvYXV0aC1zaWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgQ2hyaXMgQWRhbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmZGVmIEhBVkVfT1NGX1NJQQotCi12b2lkCXNlc3Npb25fc2V0dXBfc2lhKHN0cnVjdCBwYXNzd2QgKiwgY2hhciAqKTsKLQotI2VuZGlmIC8qIEhBVkVfT1NGX1NJQSAqLwpkaWZmIC0tZ2l0IGEvYXV0aC1za2V5LmMgYi9hdXRoLXNrZXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUzNmVjOC4uMDAwMDAwMAotLS0gYS9hdXRoLXNrZXkuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKiAkT3BlbkJTRDogYXV0aC1za2V5LmMsdiAxLjI3IDIwMDcvMDEvMjEgMDE6NDE6NTQgc3RldmVzayBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpZmRlZiBTS0VZCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxza2V5Lmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJhdXRoLmgiCi0jaW5jbHVkZSAic3NoLWdzcy5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgotCi1zdGF0aWMgdm9pZCAqCi1za2V5X2luaXRfY3R4KEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlyZXR1cm4gYXV0aGN0eHQ7Ci19Ci0KLWludAotc2tleV9xdWVyeSh2b2lkICpjdHgsIGNoYXIgKipuYW1lLCBjaGFyICoqaW5mb3R4dCwKLSAgICB1X2ludCogbnVtcHJvbXB0cywgY2hhciAqKipwcm9tcHRzLCB1X2ludCAqKmVjaG9fb24pCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4OwotCWNoYXIgY2hhbGxlbmdlWzEwMjRdOwotCXN0cnVjdCBza2V5IHNrZXk7Ci0KLQlpZiAoX2NvbXBhdF9za2V5Y2hhbGxlbmdlKCZza2V5LCBhdXRoY3R4dC0+dXNlciwgY2hhbGxlbmdlLAotCSAgICBzaXplb2YoY2hhbGxlbmdlKSkgPT0gLTEpCi0JCXJldHVybiAtMTsKLQotCSpuYW1lID0geHN0cmR1cCgiIik7Ci0JKmluZm90eHQgPSB4c3RyZHVwKCIiKTsKLQkqbnVtcHJvbXB0cyA9IDE7Ci0JKnByb21wdHMgPSB4Y2FsbG9jKCpudW1wcm9tcHRzLCBzaXplb2YoY2hhciAqKSk7Ci0JKmVjaG9fb24gPSB4Y2FsbG9jKCpudW1wcm9tcHRzLCBzaXplb2YodV9pbnQpKTsKLQotCXhhc3ByaW50ZigqcHJvbXB0cywgIiVzJXMiLCBjaGFsbGVuZ2UsIFNLRVlfUFJPTVBUKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLXNrZXlfcmVzcG9uZCh2b2lkICpjdHgsIHVfaW50IG51bXJlc3BvbnNlcywgY2hhciAqKnJlc3BvbnNlcykKLXsKLQlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHg7Ci0KLQlpZiAoYXV0aGN0eHQtPnZhbGlkICYmCi0JICAgIG51bXJlc3BvbnNlcyA9PSAxICYmCi0JICAgIHNrZXlfaGFza2V5KGF1dGhjdHh0LT5wdy0+cHdfbmFtZSkgPT0gMCAmJgotCSAgICBza2V5X3Bhc3NjaGVjayhhdXRoY3R4dC0+cHctPnB3X25hbWUsIHJlc3BvbnNlc1swXSkgIT0gLTEpCi0JICAgIHJldHVybiAwOwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQKLXNrZXlfZnJlZV9jdHgodm9pZCAqY3R4KQotewotCS8qIHdlIGRvbid0IGhhdmUgYSBzcGVjaWFsIGNvbnRleHQgKi8KLX0KLQotS2JkaW50RGV2aWNlIHNrZXlfZGV2aWNlID0gewotCSJza2V5IiwKLQlza2V5X2luaXRfY3R4LAotCXNrZXlfcXVlcnksCi0Jc2tleV9yZXNwb25kLAotCXNrZXlfZnJlZV9jdHgKLX07Ci0KLUtiZGludERldmljZSBtbV9za2V5X2RldmljZSA9IHsKLQkic2tleSIsCi0Jc2tleV9pbml0X2N0eCwKLQltbV9za2V5X3F1ZXJ5LAotCW1tX3NrZXlfcmVzcG9uZCwKLQlza2V5X2ZyZWVfY3R4Ci19OwotI2VuZGlmIC8qIFNLRVkgKi8KZGlmZiAtLWdpdCBhL2F1dGguYyBiL2F1dGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1YjMwNi4uMDAwMDAwMAotLS0gYS9hdXRoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MDUgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGF1dGguYyx2IDEuOTQgMjAxMS8wNS8yMyAwMzozMzozOCBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZmRlZiBIQVZFX1BBVEhTX0gKLSMgaW5jbHVkZSA8cGF0aHMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHB3ZC5oPgotI2lmZGVmIEhBVkVfTE9HSU5fSAotI2luY2x1ZGUgPGxvZ2luLmg+Ci0jZW5kaWYKLSNpZmRlZiBVU0VfU0hBRE9XCi0jaW5jbHVkZSA8c2hhZG93Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0xJQkdFTl9ICi0jaW5jbHVkZSA8bGliZ2VuLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgIm1hdGNoLmgiCi0jaW5jbHVkZSAiZ3JvdXBhY2Nlc3MuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJzZXJ2Y29uZi5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgImF1dGgtb3B0aW9ucy5oIgotI2luY2x1ZGUgImNhbm9ob3N0LmgiCi0jaW5jbHVkZSAidWlkc3dhcC5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJsb2dpbnJlYy5oIgotI2lmZGVmIEdTU0FQSQotI2luY2x1ZGUgInNzaC1nc3MuaCIKLSNlbmRpZgotI2luY2x1ZGUgImF1dGhmaWxlLmgiCi0jaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCi0KLS8qIGltcG9ydCAqLwotZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKLWV4dGVybiBpbnQgdXNlX3ByaXZzZXA7Ci1leHRlcm4gQnVmZmVyIGxvZ2lubXNnOwotZXh0ZXJuIHN0cnVjdCBwYXNzd2QgKnByaXZzZXBfcHc7Ci0KLS8qIERlYnVnZ2luZyBtZXNzYWdlcyAqLwotQnVmZmVyIGF1dGhfZGVidWc7Ci1pbnQgYXV0aF9kZWJ1Z19pbml0OwotCi0vKgotICogQ2hlY2sgaWYgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBsb2cgaW4gdmlhIHNzaC4gSWYgdXNlciBpcyBsaXN0ZWQKLSAqIGluIERlbnlVc2VycyBvciBvbmUgb2YgdXNlcidzIGdyb3VwcyBpcyBsaXN0ZWQgaW4gRGVueUdyb3VwcywgZmFsc2UKLSAqIHdpbGwgYmUgcmV0dXJuZWQuIElmIEFsbG93VXNlcnMgaXNuJ3QgZW1wdHkgYW5kIHVzZXIgaXNuJ3QgbGlzdGVkCi0gKiB0aGVyZSwgb3IgaWYgQWxsb3dHcm91cHMgaXNuJ3QgZW1wdHkgYW5kIG9uZSBvZiB1c2VyJ3MgZ3JvdXBzIGlzbid0Ci0gKiBsaXN0ZWQgdGhlcmUsIGZhbHNlIHdpbGwgYmUgcmV0dXJuZWQuCi0gKiBJZiB0aGUgdXNlcidzIHNoZWxsIGlzIG5vdCBleGVjdXRhYmxlLCBmYWxzZSB3aWxsIGJlIHJldHVybmVkLgotICogT3RoZXJ3aXNlIHRydWUgaXMgcmV0dXJuZWQuCi0gKi8KLWludAotYWxsb3dlZF91c2VyKHN0cnVjdCBwYXNzd2QgKiBwdykKLXsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQljb25zdCBjaGFyICpob3N0bmFtZSA9IE5VTEwsICppcGFkZHIgPSBOVUxMLCAqcGFzc3dkID0gTlVMTDsKLQl1X2ludCBpOwotI2lmZGVmIFVTRV9TSEFET1cKLQlzdHJ1Y3Qgc3B3ZCAqc3B3ID0gTlVMTDsKLSNlbmRpZgotCi0JLyogU2hvdWxkbid0IGJlIGNhbGxlZCBpZiBwdyBpcyBOVUxMLCBidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeS4uLiAqLwotCWlmICghcHcgfHwgIXB3LT5wd19uYW1lKQotCQlyZXR1cm4gMDsKLQotI2lmZGVmIFVTRV9TSEFET1cKLQlpZiAoIW9wdGlvbnMudXNlX3BhbSkKLQkJc3B3ID0gZ2V0c3BuYW0ocHctPnB3X25hbWUpOwotI2lmZGVmIEhBU19TSEFET1dfRVhQSVJFCi0JaWYgKCFvcHRpb25zLnVzZV9wYW0gJiYgc3B3ICE9IE5VTEwgJiYgYXV0aF9zaGFkb3dfYWNjdGV4cGlyZWQoc3B3KSkKLQkJcmV0dXJuIDA7Ci0jZW5kaWYgLyogSEFTX1NIQURPV19FWFBJUkUgKi8KLSNlbmRpZiAvKiBVU0VfU0hBRE9XICovCi0KLQkvKiBncmFiIHBhc3N3ZCBmaWVsZCBmb3IgbG9ja2VkIGFjY291bnQgY2hlY2sgKi8KLQlwYXNzd2QgPSBwdy0+cHdfcGFzc3dkOwotI2lmZGVmIFVTRV9TSEFET1cKLQlpZiAoc3B3ICE9IE5VTEwpCi0jaWZkZWYgVVNFX0xJQklBRgotCQlwYXNzd2QgPSBnZXRfaWFmX3Bhc3N3b3JkKHB3KTsKLSNlbHNlCi0JCXBhc3N3ZCA9IHNwdy0+c3BfcHdkcDsKLSNlbmRpZiAvKiBVU0VfTElCSUFGICovCi0jZW5kaWYKLQotCS8qIGNoZWNrIGZvciBsb2NrZWQgYWNjb3VudCAqLwotCWlmICghb3B0aW9ucy51c2VfcGFtICYmIHBhc3N3ZCAmJiAqcGFzc3dkKSB7Ci0JCWludCBsb2NrZWQgPSAwOwotCi0jaWZkZWYgTE9DS0VEX1BBU1NXRF9TVFJJTkcKLQkJaWYgKHN0cmNtcChwYXNzd2QsIExPQ0tFRF9QQVNTV0RfU1RSSU5HKSA9PSAwKQotCQkJIGxvY2tlZCA9IDE7Ci0jZW5kaWYKLSNpZmRlZiBMT0NLRURfUEFTU1dEX1BSRUZJWAotCQlpZiAoc3RybmNtcChwYXNzd2QsIExPQ0tFRF9QQVNTV0RfUFJFRklYLAotCQkgICAgc3RybGVuKExPQ0tFRF9QQVNTV0RfUFJFRklYKSkgPT0gMCkKLQkJCSBsb2NrZWQgPSAxOwotI2VuZGlmCi0jaWZkZWYgTE9DS0VEX1BBU1NXRF9TVUJTVFIKLQkJaWYgKHN0cnN0cihwYXNzd2QsIExPQ0tFRF9QQVNTV0RfU1VCU1RSKSkKLQkJCWxvY2tlZCA9IDE7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfTElCSUFGCi0JCWZyZWUoKHZvaWQgKikgcGFzc3dkKTsKLSNlbmRpZiAvKiBVU0VfTElCSUFGICovCi0JCWlmIChsb2NrZWQpIHsKLQkJCWxvZ2l0KCJVc2VyICUuMTAwcyBub3QgYWxsb3dlZCBiZWNhdXNlIGFjY291bnQgaXMgbG9ja2VkIiwKLQkJCSAgICBwdy0+cHdfbmFtZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCS8qCi0JICogRGVueSBpZiBzaGVsbCBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgZXhlY3V0YWJsZSB1bmxlc3Mgd2UKLQkgKiBhcmUgY2hyb290aW5nLgotCSAqLwotCWlmIChvcHRpb25zLmNocm9vdF9kaXJlY3RvcnkgPT0gTlVMTCB8fAotCSAgICBzdHJjYXNlY21wKG9wdGlvbnMuY2hyb290X2RpcmVjdG9yeSwgIm5vbmUiKSA9PSAwKSB7Ci0JCWNoYXIgKnNoZWxsID0geHN0cmR1cCgocHctPnB3X3NoZWxsWzBdID09ICdcMCcpID8KLQkJICAgIF9QQVRIX0JTSEVMTCA6IHB3LT5wd19zaGVsbCk7IC8qIGVtcHR5ID0gL2Jpbi9zaCAqLwotCi0JCWlmIChzdGF0KHNoZWxsLCAmc3QpICE9IDApIHsKLQkJCWxvZ2l0KCJVc2VyICUuMTAwcyBub3QgYWxsb3dlZCBiZWNhdXNlIHNoZWxsICUuMTAwcyAiCi0JCQkgICAgImRvZXMgbm90IGV4aXN0IiwgcHctPnB3X25hbWUsIHNoZWxsKTsKLQkJCXhmcmVlKHNoZWxsKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmIChTX0lTUkVHKHN0LnN0X21vZGUpID09IDAgfHwKLQkJICAgIChzdC5zdF9tb2RlICYgKFNfSVhPVEh8U19JWFVTUnxTX0lYR1JQKSkgPT0gMCkgewotCQkJbG9naXQoIlVzZXIgJS4xMDBzIG5vdCBhbGxvd2VkIGJlY2F1c2Ugc2hlbGwgJS4xMDBzICIKLQkJCSAgICAiaXMgbm90IGV4ZWN1dGFibGUiLCBwdy0+cHdfbmFtZSwgc2hlbGwpOwotCQkJeGZyZWUoc2hlbGwpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJeGZyZWUoc2hlbGwpOwotCX0KLQotCWlmIChvcHRpb25zLm51bV9kZW55X3VzZXJzID4gMCB8fCBvcHRpb25zLm51bV9hbGxvd191c2VycyA+IDAgfHwKLQkgICAgb3B0aW9ucy5udW1fZGVueV9ncm91cHMgPiAwIHx8IG9wdGlvbnMubnVtX2FsbG93X2dyb3VwcyA+IDApIHsKLQkJaG9zdG5hbWUgPSBnZXRfY2Fub25pY2FsX2hvc3RuYW1lKG9wdGlvbnMudXNlX2Rucyk7Ci0JCWlwYWRkciA9IGdldF9yZW1vdGVfaXBhZGRyKCk7Ci0JfQotCi0JLyogUmV0dXJuIGZhbHNlIGlmIHVzZXIgaXMgbGlzdGVkIGluIERlbnlVc2VycyAqLwotCWlmIChvcHRpb25zLm51bV9kZW55X3VzZXJzID4gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1fZGVueV91c2VyczsgaSsrKQotCQkJaWYgKG1hdGNoX3VzZXIocHctPnB3X25hbWUsIGhvc3RuYW1lLCBpcGFkZHIsCi0JCQkgICAgb3B0aW9ucy5kZW55X3VzZXJzW2ldKSkgewotCQkJCWxvZ2l0KCJVc2VyICUuMTAwcyBmcm9tICUuMTAwcyBub3QgYWxsb3dlZCAiCi0JCQkJICAgICJiZWNhdXNlIGxpc3RlZCBpbiBEZW55VXNlcnMiLAotCQkJCSAgICBwdy0+cHdfbmFtZSwgaG9zdG5hbWUpOwotCQkJCXJldHVybiAwOwotCQkJfQotCX0KLQkvKiBSZXR1cm4gZmFsc2UgaWYgQWxsb3dVc2VycyBpc24ndCBlbXB0eSBhbmQgdXNlciBpc24ndCBsaXN0ZWQgdGhlcmUgKi8KLQlpZiAob3B0aW9ucy5udW1fYWxsb3dfdXNlcnMgPiAwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9hbGxvd191c2VyczsgaSsrKQotCQkJaWYgKG1hdGNoX3VzZXIocHctPnB3X25hbWUsIGhvc3RuYW1lLCBpcGFkZHIsCi0JCQkgICAgb3B0aW9ucy5hbGxvd191c2Vyc1tpXSkpCi0JCQkJYnJlYWs7Ci0JCS8qIGkgPCBvcHRpb25zLm51bV9hbGxvd191c2VycyBpZmYgd2UgYnJlYWsgZm9yIGxvb3AgKi8KLQkJaWYgKGkgPj0gb3B0aW9ucy5udW1fYWxsb3dfdXNlcnMpIHsKLQkJCWxvZ2l0KCJVc2VyICUuMTAwcyBmcm9tICUuMTAwcyBub3QgYWxsb3dlZCBiZWNhdXNlICIKLQkJCSAgICAibm90IGxpc3RlZCBpbiBBbGxvd1VzZXJzIiwgcHctPnB3X25hbWUsIGhvc3RuYW1lKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCWlmIChvcHRpb25zLm51bV9kZW55X2dyb3VwcyA+IDAgfHwgb3B0aW9ucy5udW1fYWxsb3dfZ3JvdXBzID4gMCkgewotCQkvKiBHZXQgdGhlIHVzZXIncyBncm91cCBhY2Nlc3MgbGlzdCAocHJpbWFyeSBhbmQgc3VwcGxlbWVudGFyeSkgKi8KLQkJaWYgKGdhX2luaXQocHctPnB3X25hbWUsIHB3LT5wd19naWQpID09IDApIHsKLQkJCWxvZ2l0KCJVc2VyICUuMTAwcyBmcm9tICUuMTAwcyBub3QgYWxsb3dlZCBiZWNhdXNlICIKLQkJCSAgICAibm90IGluIGFueSBncm91cCIsIHB3LT5wd19uYW1lLCBob3N0bmFtZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qIFJldHVybiBmYWxzZSBpZiBvbmUgb2YgdXNlcidzIGdyb3VwcyBpcyBsaXN0ZWQgaW4gRGVueUdyb3VwcyAqLwotCQlpZiAob3B0aW9ucy5udW1fZGVueV9ncm91cHMgPiAwKQotCQkJaWYgKGdhX21hdGNoKG9wdGlvbnMuZGVueV9ncm91cHMsCi0JCQkgICAgb3B0aW9ucy5udW1fZGVueV9ncm91cHMpKSB7Ci0JCQkJZ2FfZnJlZSgpOwotCQkJCWxvZ2l0KCJVc2VyICUuMTAwcyBmcm9tICUuMTAwcyBub3QgYWxsb3dlZCAiCi0JCQkJICAgICJiZWNhdXNlIGEgZ3JvdXAgaXMgbGlzdGVkIGluIERlbnlHcm91cHMiLAotCQkJCSAgICBwdy0+cHdfbmFtZSwgaG9zdG5hbWUpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkvKgotCQkgKiBSZXR1cm4gZmFsc2UgaWYgQWxsb3dHcm91cHMgaXNuJ3QgZW1wdHkgYW5kIG9uZSBvZiB1c2VyJ3MgZ3JvdXBzCi0JCSAqIGlzbid0IGxpc3RlZCB0aGVyZQotCQkgKi8KLQkJaWYgKG9wdGlvbnMubnVtX2FsbG93X2dyb3VwcyA+IDApCi0JCQlpZiAoIWdhX21hdGNoKG9wdGlvbnMuYWxsb3dfZ3JvdXBzLAotCQkJICAgIG9wdGlvbnMubnVtX2FsbG93X2dyb3VwcykpIHsKLQkJCQlnYV9mcmVlKCk7Ci0JCQkJbG9naXQoIlVzZXIgJS4xMDBzIGZyb20gJS4xMDBzIG5vdCBhbGxvd2VkICIKLQkJCQkgICAgImJlY2F1c2Ugbm9uZSBvZiB1c2VyJ3MgZ3JvdXBzIGFyZSBsaXN0ZWQgIgotCQkJCSAgICAiaW4gQWxsb3dHcm91cHMiLCBwdy0+cHdfbmFtZSwgaG9zdG5hbWUpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQlnYV9mcmVlKCk7Ci0JfQotCi0jaWZkZWYgQ1VTVE9NX1NZU19BVVRIX0FMTE9XRURfVVNFUgotCWlmICghc3lzX2F1dGhfYWxsb3dlZF91c2VyKHB3LCAmbG9naW5tc2cpKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCi0JLyogV2UgZm91bmQgbm8gcmVhc29uIG5vdCB0byBsZXQgdGhpcyB1c2VyIHRyeSB0byBsb2cgb24uLi4gKi8KLQlyZXR1cm4gMTsKLX0KLQotdm9pZAotYXV0aF9sb2coQXV0aGN0eHQgKmF1dGhjdHh0LCBpbnQgYXV0aGVudGljYXRlZCwgY2hhciAqbWV0aG9kLCBjaGFyICppbmZvKQotewotCXZvaWQgKCphdXRobG9nKSAoY29uc3QgY2hhciAqZm10LC4uLikgPSB2ZXJib3NlOwotCWNoYXIgKmF1dGhtc2c7Ci0KLQlpZiAodXNlX3ByaXZzZXAgJiYgIW1tX2lzX21vbml0b3IoKSAmJiAhYXV0aGN0eHQtPnBvc3Rwb25lZCkKLQkJcmV0dXJuOwotCi0JLyogUmFpc2UgbG9nZ2luZyBsZXZlbCAqLwotCWlmIChhdXRoZW50aWNhdGVkID09IDEgfHwKLQkgICAgIWF1dGhjdHh0LT52YWxpZCB8fAotCSAgICBhdXRoY3R4dC0+ZmFpbHVyZXMgPj0gb3B0aW9ucy5tYXhfYXV0aHRyaWVzIC8gMiB8fAotCSAgICBzdHJjbXAobWV0aG9kLCAicGFzc3dvcmQiKSA9PSAwKQotCQlhdXRobG9nID0gbG9naXQ7Ci0KLQlpZiAoYXV0aGN0eHQtPnBvc3Rwb25lZCkKLQkJYXV0aG1zZyA9ICJQb3N0cG9uZWQiOwotCWVsc2UKLQkJYXV0aG1zZyA9IGF1dGhlbnRpY2F0ZWQgPyAiQWNjZXB0ZWQiIDogIkZhaWxlZCI7Ci0KLQlhdXRobG9nKCIlcyAlcyBmb3IgJXMlLjEwMHMgZnJvbSAlLjIwMHMgcG9ydCAlZCVzIiwKLQkgICAgYXV0aG1zZywKLQkgICAgbWV0aG9kLAotCSAgICBhdXRoY3R4dC0+dmFsaWQgPyAiIiA6ICJpbnZhbGlkIHVzZXIgIiwKLQkgICAgYXV0aGN0eHQtPnVzZXIsCi0JICAgIGdldF9yZW1vdGVfaXBhZGRyKCksCi0JICAgIGdldF9yZW1vdGVfcG9ydCgpLAotCSAgICBpbmZvKTsKLQotI2lmZGVmIENVU1RPTV9GQUlMRURfTE9HSU4KLQlpZiAoYXV0aGVudGljYXRlZCA9PSAwICYmICFhdXRoY3R4dC0+cG9zdHBvbmVkICYmCi0JICAgIChzdHJjbXAobWV0aG9kLCAicGFzc3dvcmQiKSA9PSAwIHx8Ci0JICAgIHN0cm5jbXAobWV0aG9kLCAia2V5Ym9hcmQtaW50ZXJhY3RpdmUiLCAyMCkgPT0gMCB8fAotCSAgICBzdHJjbXAobWV0aG9kLCAiY2hhbGxlbmdlLXJlc3BvbnNlIikgPT0gMCkpCi0JCXJlY29yZF9mYWlsZWRfbG9naW4oYXV0aGN0eHQtPnVzZXIsCi0JCSAgICBnZXRfY2Fub25pY2FsX2hvc3RuYW1lKG9wdGlvbnMudXNlX2RucyksICJzc2giKTsKLSMgaWZkZWYgV0lUSF9BSVhBVVRIRU5USUNBVEUKLQlpZiAoYXV0aGVudGljYXRlZCkKLQkJc3lzX2F1dGhfcmVjb3JkX2xvZ2luKGF1dGhjdHh0LT51c2VyLAotCQkgICAgZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZShvcHRpb25zLnVzZV9kbnMpLCAic3NoIiwgJmxvZ2lubXNnKTsKLSMgZW5kaWYKLSNlbmRpZgotI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKLQlpZiAoYXV0aGVudGljYXRlZCA9PSAwICYmICFhdXRoY3R4dC0+cG9zdHBvbmVkKQotCQlhdWRpdF9ldmVudChhdWRpdF9jbGFzc2lmeV9hdXRoKG1ldGhvZCkpOwotI2VuZGlmCi19Ci0KLS8qCi0gKiBDaGVjayB3aGV0aGVyIHJvb3QgbG9naW5zIGFyZSBkaXNhbGxvd2VkLgotICovCi1pbnQKLWF1dGhfcm9vdF9hbGxvd2VkKGNoYXIgKm1ldGhvZCkKLXsKLQlzd2l0Y2ggKG9wdGlvbnMucGVybWl0X3Jvb3RfbG9naW4pIHsKLQljYXNlIFBFUk1JVF9ZRVM6Ci0JCXJldHVybiAxOwotCWNhc2UgUEVSTUlUX05PX1BBU1NXRDoKLQkJaWYgKHN0cmNtcChtZXRob2QsICJwYXNzd29yZCIpICE9IDApCi0JCQlyZXR1cm4gMTsKLQkJYnJlYWs7Ci0JY2FzZSBQRVJNSVRfRk9SQ0VEX09OTFk6Ci0JCWlmIChmb3JjZWRfY29tbWFuZCkgewotCQkJbG9naXQoIlJvb3QgbG9naW4gYWNjZXB0ZWQgZm9yIGZvcmNlZCBjb21tYW5kLiIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWxvZ2l0KCJST09UIExPR0lOIFJFRlVTRUQgRlJPTSAlLjIwMHMiLCBnZXRfcmVtb3RlX2lwYWRkcigpKTsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogR2l2ZW4gYSB0ZW1wbGF0ZSBhbmQgYSBwYXNzd2Qgc3RydWN0dXJlLCBidWlsZCBhIGZpbGVuYW1lCi0gKiBieSBzdWJzdGl0dXRpbmcgJSB0b2tlbmlzZWQgb3B0aW9ucy4gQ3VycmVudGx5LCAlJSBiZWNvbWVzICclJywKLSAqICVoIGJlY29tZXMgdGhlIGhvbWUgZGlyZWN0b3J5IGFuZCAldSB0aGUgdXNlcm5hbWUuCi0gKgotICogVGhpcyByZXR1cm5zIGEgYnVmZmVyIGFsbG9jYXRlZCBieSB4bWFsbG9jLgotICovCi1jaGFyICoKLWV4cGFuZF9hdXRob3JpemVkX2tleXMoY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBwYXNzd2QgKnB3KQotewotCWNoYXIgKmZpbGUsIHJldFtNQVhQQVRITEVOXTsKLQlpbnQgaTsKLQotCWZpbGUgPSBwZXJjZW50X2V4cGFuZChmaWxlbmFtZSwgImgiLCBwdy0+cHdfZGlyLAotCSAgICAidSIsIHB3LT5wd19uYW1lLCAoY2hhciAqKU5VTEwpOwotCi0JLyoKLQkgKiBFbnN1cmUgdGhhdCBmaWxlbmFtZSBzdGFydHMgYW5jaG9yZWQuIElmIG5vdCwgYmUgYmFja3dhcmQKLQkgKiBjb21wYXRpYmxlIGFuZCBwcmVwZW5kIHRoZSAnJWgvJwotCSAqLwotCWlmICgqZmlsZSA9PSAnLycpCi0JCXJldHVybiAoZmlsZSk7Ci0KLQlpID0gc25wcmludGYocmV0LCBzaXplb2YocmV0KSwgIiVzLyVzIiwgcHctPnB3X2RpciwgZmlsZSk7Ci0JaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzaXplb2YocmV0KSkKLQkJZmF0YWwoImV4cGFuZF9hdXRob3JpemVkX2tleXM6IHBhdGggdG9vIGxvbmciKTsKLQl4ZnJlZShmaWxlKTsKLQlyZXR1cm4gKHhzdHJkdXAocmV0KSk7Ci19Ci0KLWNoYXIgKgotYXV0aG9yaXplZF9wcmluY2lwYWxzX2ZpbGUoc3RydWN0IHBhc3N3ZCAqcHcpCi17Ci0JaWYgKG9wdGlvbnMuYXV0aG9yaXplZF9wcmluY2lwYWxzX2ZpbGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGV4cGFuZF9hdXRob3JpemVkX2tleXMob3B0aW9ucy5hdXRob3JpemVkX3ByaW5jaXBhbHNfZmlsZSwgcHcpOwotfQotCi0vKiByZXR1cm4gb2sgaWYga2V5IGV4aXN0cyBpbiBzeXNmaWxlIG9yIHVzZXJmaWxlICovCi1Ib3N0U3RhdHVzCi1jaGVja19rZXlfaW5faG9zdGZpbGVzKHN0cnVjdCBwYXNzd2QgKnB3LCBLZXkgKmtleSwgY29uc3QgY2hhciAqaG9zdCwKLSAgICBjb25zdCBjaGFyICpzeXNmaWxlLCBjb25zdCBjaGFyICp1c2VyZmlsZSkKLXsKLQljaGFyICp1c2VyX2hvc3RmaWxlOwotCXN0cnVjdCBzdGF0IHN0OwotCUhvc3RTdGF0dXMgaG9zdF9zdGF0dXM7Ci0Jc3RydWN0IGhvc3RrZXlzICpob3N0a2V5czsKLQljb25zdCBzdHJ1Y3QgaG9zdGtleV9lbnRyeSAqZm91bmQ7Ci0KLQlob3N0a2V5cyA9IGluaXRfaG9zdGtleXMoKTsKLQlsb2FkX2hvc3RrZXlzKGhvc3RrZXlzLCBob3N0LCBzeXNmaWxlKTsKLQlpZiAodXNlcmZpbGUgIT0gTlVMTCkgewotCQl1c2VyX2hvc3RmaWxlID0gdGlsZGVfZXhwYW5kX2ZpbGVuYW1lKHVzZXJmaWxlLCBwdy0+cHdfdWlkKTsKLQkJaWYgKG9wdGlvbnMuc3RyaWN0X21vZGVzICYmCi0JCSAgICAoc3RhdCh1c2VyX2hvc3RmaWxlLCAmc3QpID09IDApICYmCi0JCSAgICAoKHN0LnN0X3VpZCAhPSAwICYmIHN0LnN0X3VpZCAhPSBwdy0+cHdfdWlkKSB8fAotCQkgICAgKHN0LnN0X21vZGUgJiAwMjIpICE9IDApKSB7Ci0JCQlsb2dpdCgiQXV0aGVudGljYXRpb24gcmVmdXNlZCBmb3IgJS4xMDBzOiAiCi0JCQkgICAgImJhZCBvd25lciBvciBtb2RlcyBmb3IgJS4yMDBzIiwKLQkJCSAgICBwdy0+cHdfbmFtZSwgdXNlcl9ob3N0ZmlsZSk7Ci0JCQlhdXRoX2RlYnVnX2FkZCgiSWdub3JlZCAlLjIwMHM6IGJhZCBvd25lcnNoaXAgb3IgbW9kZXMiLAotCQkJICAgIHVzZXJfaG9zdGZpbGUpOwotCQl9IGVsc2UgewotCQkJdGVtcG9yYXJpbHlfdXNlX3VpZChwdyk7Ci0JCQlsb2FkX2hvc3RrZXlzKGhvc3RrZXlzLCBob3N0LCB1c2VyX2hvc3RmaWxlKTsKLQkJCXJlc3RvcmVfdWlkKCk7Ci0JCX0KLQkJeGZyZWUodXNlcl9ob3N0ZmlsZSk7Ci0JfQotCWhvc3Rfc3RhdHVzID0gY2hlY2tfa2V5X2luX2hvc3RrZXlzKGhvc3RrZXlzLCBrZXksICZmb3VuZCk7Ci0JaWYgKGhvc3Rfc3RhdHVzID09IEhPU1RfUkVWT0tFRCkKLQkJZXJyb3IoIldBUk5JTkc6IHJldm9rZWQga2V5IGZvciAlcyBhdHRlbXB0ZWQgYXV0aGVudGljYXRpb24iLAotCQkgICAgZm91bmQtPmhvc3QpOwotCWVsc2UgaWYgKGhvc3Rfc3RhdHVzID09IEhPU1RfT0spCi0JCWRlYnVnKCIlczoga2V5IGZvciAlcyBmb3VuZCBhdCAlczolbGQiLCBfX2Z1bmNfXywKLQkJICAgIGZvdW5kLT5ob3N0LCBmb3VuZC0+ZmlsZSwgZm91bmQtPmxpbmUpOwotCWVsc2UKLQkJZGVidWcoIiVzOiBrZXkgZm9yIGhvc3QgJXMgbm90IGZvdW5kIiwgX19mdW5jX18sIGhvc3QpOwotCi0JZnJlZV9ob3N0a2V5cyhob3N0a2V5cyk7Ci0KLQlyZXR1cm4gaG9zdF9zdGF0dXM7Ci19Ci0KLQotLyoKLSAqIENoZWNrIGEgZ2l2ZW4gZmlsZSBmb3Igc2VjdXJpdHkuIFRoaXMgaXMgZGVmaW5lZCBhcyBhbGwgY29tcG9uZW50cwotICogb2YgdGhlIHBhdGggdG8gdGhlIGZpbGUgbXVzdCBiZSBvd25lZCBieSBlaXRoZXIgdGhlIG93bmVyIG9mCi0gKiBvZiB0aGUgZmlsZSBvciByb290IGFuZCBubyBkaXJlY3RvcmllcyBtdXN0IGJlIGdyb3VwIG9yIHdvcmxkIHdyaXRhYmxlLgotICoKLSAqIFhYWCBTaG91bGQgYW55IHNwZWNpZmljIGNoZWNrIGJlIGRvbmUgZm9yIHN5bSBsaW5rcyA/Ci0gKgotICogVGFrZXMgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IsIHRoZSBmaWxlIG5hbWUsIGEgdWlkIGFuZCBhbmQKLSAqIGVycm9yIGJ1ZmZlciBwbHVzIG1heCBzaXplIGFzIGFyZ3VtZW50cy4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgLTEgb24gZmFpbHVyZQotICovCi1zdGF0aWMgaW50Ci1zZWN1cmVfZmlsZW5hbWUoRklMRSAqZiwgY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IHBhc3N3ZCAqcHcsCi0gICAgY2hhciAqZXJyLCBzaXplX3QgZXJybGVuKQotewotCXVpZF90IHVpZCA9IHB3LT5wd191aWQ7Ci0JY2hhciBidWZbTUFYUEFUSExFTl0sIGhvbWVkaXJbTUFYUEFUSExFTl07Ci0JY2hhciAqY3A7Ci0JaW50IGNvbXBhcmVob21lID0gMDsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQotCWlmIChyZWFscGF0aChmaWxlLCBidWYpID09IE5VTEwpIHsKLQkJc25wcmludGYoZXJyLCBlcnJsZW4sICJyZWFscGF0aCAlcyBmYWlsZWQ6ICVzIiwgZmlsZSwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHJlYWxwYXRoKHB3LT5wd19kaXIsIGhvbWVkaXIpICE9IE5VTEwpCi0JCWNvbXBhcmVob21lID0gMTsKLQotCS8qIGNoZWNrIHRoZSBvcGVuIGZpbGUgdG8gYXZvaWQgcmFjZXMgKi8KLQlpZiAoZnN0YXQoZmlsZW5vKGYpLCAmc3QpIDwgMCB8fAotCSAgICAoc3Quc3RfdWlkICE9IDAgJiYgc3Quc3RfdWlkICE9IHVpZCkgfHwKLQkgICAgKHN0LnN0X21vZGUgJiAwMjIpICE9IDApIHsKLSNpZmRlZiBBTkRST0lECi0JCS8qIG5lZWRlZCB0byBhbGxvdyByb290IGxvZ2luIG9uIGFuZHJvaWQgKi8KLQkJaWYgKGdldHVpZCgpICE9IDApCi0jZW5kaWYKLQkgICAgewotCQkJc25wcmludGYoZXJyLCBlcnJsZW4sICJiYWQgb3duZXJzaGlwIG9yIG1vZGVzIGZvciBmaWxlICVzIiwKLQkJCQlidWYpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JLyogZm9yIGVhY2ggY29tcG9uZW50IG9mIHRoZSBjYW5vbmljYWwgcGF0aCwgd2Fsa2luZyB1cHdhcmRzICovCi0JZm9yICg7OykgewotCQlpZiAoKGNwID0gZGlybmFtZShidWYpKSA9PSBOVUxMKSB7Ci0JCQlzbnByaW50ZihlcnIsIGVycmxlbiwgImRpcm5hbWUoKSBmYWlsZWQiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlzdHJsY3B5KGJ1ZiwgY3AsIHNpemVvZihidWYpKTsKLQotI2lmbmRlZiBBTkRST0lECi0JICAgIC8qIC9kYXRhIGlzIG93bmVkIGJ5IHN5c3RlbSB1c2VyLCB3aGljaCBjYXVzZXMgdGhpcyBjaGVjayB0byBmYWlsICovCi0JCWlmIChzdGF0KGJ1ZiwgJnN0KSA8IDAgfHwKLQkJICAgIChzdC5zdF91aWQgIT0gMCAmJiBzdC5zdF91aWQgIT0gdWlkKSB8fAotCQkgICAgKHN0LnN0X21vZGUgJiAwMjIpICE9IDApIHsKLQkJCXNucHJpbnRmKGVyciwgZXJybGVuLAotCQkJICAgICJiYWQgb3duZXJzaGlwIG9yIG1vZGVzIGZvciBkaXJlY3RvcnkgJXMiLCBidWYpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0jZW5kaWYKLQkJLyogSWYgYXJlIHBhc3QgdGhlIGhvbWVkaXIgdGhlbiB3ZSBjYW4gc3RvcCAqLwotCQlpZiAoY29tcGFyZWhvbWUgJiYgc3RyY21wKGhvbWVkaXIsIGJ1ZikgPT0gMCkKLQkJCWJyZWFrOwotCi0JCS8qCi0JCSAqIGRpcm5hbWUgc2hvdWxkIGFsd2F5cyBjb21wbGV0ZSB3aXRoIGEgIi8iIHBhdGgsCi0JCSAqIGJ1dCB3ZSBjYW4gYmUgcGFyYW5vaWQgYW5kIGNoZWNrIGZvciAiLiIgdG9vCi0JCSAqLwotCQlpZiAoKHN0cmNtcCgiLyIsIGJ1ZikgPT0gMCkgfHwgKHN0cmNtcCgiLiIsIGJ1ZikgPT0gMCkpCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBGSUxFICoKLWF1dGhfb3BlbmZpbGUoY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IHBhc3N3ZCAqcHcsIGludCBzdHJpY3RfbW9kZXMsCi0gICAgaW50IGxvZ19taXNzaW5nLCBjaGFyICpmaWxlX3R5cGUpCi17Ci0JY2hhciBsaW5lWzEwMjRdOwotCXN0cnVjdCBzdGF0IHN0OwotCWludCBmZDsKLQlGSUxFICpmOwotCi0JaWYgKChmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFl8T19OT05CTE9DSykpID09IC0xKSB7Ci0JCWlmIChsb2dfbWlzc2luZyB8fCBlcnJubyAhPSBFTk9FTlQpCi0JCQlkZWJ1ZygiQ291bGQgbm90IG9wZW4gJXMgJyVzJzogJXMiLCBmaWxlX3R5cGUsIGZpbGUsCi0JCQkgICBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAoZnN0YXQoZmQsICZzdCkgPCAwKSB7Ci0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghU19JU1JFRyhzdC5zdF9tb2RlKSkgewotCQlsb2dpdCgiVXNlciAlcyAlcyAlcyBpcyBub3QgYSByZWd1bGFyIGZpbGUiLAotCQkgICAgcHctPnB3X25hbWUsIGZpbGVfdHlwZSwgZmlsZSk7Ci0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXVuc2V0X25vbmJsb2NrKGZkKTsKLQlpZiAoKGYgPSBmZG9wZW4oZmQsICJyIikpID09IE5VTEwpIHsKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHN0cmljdF9tb2RlcyAmJgotCSAgICBzZWN1cmVfZmlsZW5hbWUoZiwgZmlsZSwgcHcsIGxpbmUsIHNpemVvZihsaW5lKSkgIT0gMCkgewotCQlmY2xvc2UoZik7Ci0JCWxvZ2l0KCJBdXRoZW50aWNhdGlvbiByZWZ1c2VkOiAlcyIsIGxpbmUpOwotCQlhdXRoX2RlYnVnX2FkZCgiSWdub3JlZCAlczogJXMiLCBmaWxlX3R5cGUsIGxpbmUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gZjsKLX0KLQotCi1GSUxFICoKLWF1dGhfb3BlbmtleWZpbGUoY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IHBhc3N3ZCAqcHcsIGludCBzdHJpY3RfbW9kZXMpCi17Ci0JcmV0dXJuIGF1dGhfb3BlbmZpbGUoZmlsZSwgcHcsIHN0cmljdF9tb2RlcywgMSwgImF1dGhvcml6ZWQga2V5cyIpOwotfQotCi1GSUxFICoKLWF1dGhfb3BlbnByaW5jaXBhbHMoY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IHBhc3N3ZCAqcHcsIGludCBzdHJpY3RfbW9kZXMpCi17Ci0JcmV0dXJuIGF1dGhfb3BlbmZpbGUoZmlsZSwgcHcsIHN0cmljdF9tb2RlcywgMCwKLQkgICAgImF1dGhvcml6ZWQgcHJpbmNpcGFscyIpOwotfQotCi1zdHJ1Y3QgcGFzc3dkICoKLWdldHB3bmFtYWxsb3coY29uc3QgY2hhciAqdXNlcikKLXsKLSNpZmRlZiBIQVZFX0xPR0lOX0NBUAotCWV4dGVybiBsb2dpbl9jYXBfdCAqbGM7Ci0jaWZkZWYgQlNEX0FVVEgKLQlhdXRoX3Nlc3Npb25fdCAqYXM7Ci0jZW5kaWYKLSNlbmRpZgotCXN0cnVjdCBwYXNzd2QgKnB3OwotCi0JcGFyc2Vfc2VydmVyX21hdGNoX2NvbmZpZygmb3B0aW9ucywgdXNlciwKLQkgICAgZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZShvcHRpb25zLnVzZV9kbnMpLCBnZXRfcmVtb3RlX2lwYWRkcigpKTsKLQotI2lmIGRlZmluZWQoX0FJWCkgJiYgZGVmaW5lZChIQVZFX1NFVEFVVEhEQikKLQlhaXhfc2V0YXV0aGRiKHVzZXIpOwotI2VuZGlmCi0KLQlwdyA9IGdldHB3bmFtKHVzZXIpOwotCi0jaWYgZGVmaW5lZChfQUlYKSAmJiBkZWZpbmVkKEhBVkVfU0VUQVVUSERCKQotCWFpeF9yZXN0b3JlYXV0aGRiKCk7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0NZR1dJTgotCS8qCi0JICogV2luZG93cyB1c2VybmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuICBUbyBhdm9pZCBsYXRlciBwcm9ibGVtcwotCSAqIHdoZW4gdHJ5aW5nIHRvIG1hdGNoIHRoZSB1c2VybmFtZSwgdGhlIHVzZXIgaXMgb25seSBhbGxvd2VkIHRvCi0JICogbG9naW4gaWYgdGhlIHVzZXJuYW1lIGlzIGdpdmVuIGluIHRoZSBzYW1lIGNhc2UgYXMgc3RvcmVkIGluIHRoZQotCSAqIHVzZXIgZGF0YWJhc2UuCi0JICovCi0JaWYgKHB3ICE9IE5VTEwgJiYgc3RyY21wKHVzZXIsIHB3LT5wd19uYW1lKSAhPSAwKSB7Ci0JCWxvZ2l0KCJMb2dpbiBuYW1lICUuMTAwcyBkb2VzIG5vdCBtYXRjaCBzdG9yZWQgdXNlcm5hbWUgJS4xMDBzIiwKLQkJICAgIHVzZXIsIHB3LT5wd19uYW1lKTsKLQkJcHcgPSBOVUxMOwotCX0KLSNlbmRpZgotCWlmIChwdyA9PSBOVUxMKSB7Ci0JCWxvZ2l0KCJJbnZhbGlkIHVzZXIgJS4xMDBzIGZyb20gJS4xMDBzIiwKLQkJICAgIHVzZXIsIGdldF9yZW1vdGVfaXBhZGRyKCkpOwotI2lmZGVmIENVU1RPTV9GQUlMRURfTE9HSU4KLQkJcmVjb3JkX2ZhaWxlZF9sb2dpbih1c2VyLAotCQkgICAgZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZShvcHRpb25zLnVzZV9kbnMpLCAic3NoIik7Ci0jZW5kaWYKLSNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCi0JCWF1ZGl0X2V2ZW50KFNTSF9JTlZBTElEX1VTRVIpOwotI2VuZGlmIC8qIFNTSF9BVURJVF9FVkVOVFMgKi8KLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JaWYgKCFhbGxvd2VkX3VzZXIocHcpKQotCQlyZXR1cm4gKE5VTEwpOwotI2lmZGVmIEhBVkVfTE9HSU5fQ0FQCi0JaWYgKChsYyA9IGxvZ2luX2dldGNsYXNzKHB3LT5wd19jbGFzcykpID09IE5VTEwpIHsKLQkJZGVidWcoInVuYWJsZSB0byBnZXQgbG9naW4gY2xhc3M6ICVzIiwgdXNlcik7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotI2lmZGVmIEJTRF9BVVRICi0JaWYgKChhcyA9IGF1dGhfb3BlbigpKSA9PSBOVUxMIHx8IGF1dGhfc2V0cHdkKGFzLCBwdykgIT0gMCB8fAotCSAgICBhdXRoX2FwcHJvdmFsKGFzLCBsYywgcHctPnB3X25hbWUsICJzc2giKSA8PSAwKSB7Ci0JCWRlYnVnKCJBcHByb3ZhbCBmYWlsdXJlIGZvciAlcyIsIHVzZXIpOwotCQlwdyA9IE5VTEw7Ci0JfQotCWlmIChhcyAhPSBOVUxMKQotCQlhdXRoX2Nsb3NlKGFzKTsKLSNlbmRpZgotI2VuZGlmCi0JaWYgKHB3ICE9IE5VTEwpCi0JCXJldHVybiAocHdjb3B5KHB3KSk7Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotLyogUmV0dXJucyAxIGlmIGtleSBpcyByZXZva2VkIGJ5IHJldm9rZWRfa2V5c19maWxlLCAwIG90aGVyd2lzZSAqLwotaW50Ci1hdXRoX2tleV9pc19yZXZva2VkKEtleSAqa2V5KQotewotCWNoYXIgKmtleV9mcDsKLQotCWlmIChvcHRpb25zLnJldm9rZWRfa2V5c19maWxlID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0Jc3dpdGNoIChrZXlfaW5fZmlsZShrZXksIG9wdGlvbnMucmV2b2tlZF9rZXlzX2ZpbGUsIDApKSB7Ci0JY2FzZSAwOgotCQkvKiBrZXkgbm90IHJldm9rZWQgKi8KLQkJcmV0dXJuIDA7Ci0JY2FzZSAtMToKLQkJLyogRXJyb3Igb3BlbmluZyByZXZva2VkX2tleXNfZmlsZTogcmVmdXNlIGFsbCBrZXlzICovCi0JCWVycm9yKCJSZXZva2VkIGtleXMgZmlsZSBpcyB1bnJlYWRhYmxlOiByZWZ1c2luZyBwdWJsaWMga2V5ICIKLQkJICAgICJhdXRoZW50aWNhdGlvbiIpOwotCQlyZXR1cm4gMTsKLQljYXNlIDE6Ci0JCS8qIEtleSByZXZva2VkICovCi0JCWtleV9mcCA9IGtleV9maW5nZXJwcmludChrZXksIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOwotCQllcnJvcigiV0FSTklORzogYXV0aGVudGljYXRpb24gYXR0ZW1wdCB3aXRoIGEgcmV2b2tlZCAiCi0JCSAgICAiJXMga2V5ICVzICIsIGtleV90eXBlKGtleSksIGtleV9mcCk7Ci0JCXhmcmVlKGtleV9mcCk7Ci0JCXJldHVybiAxOwotCX0KLQlmYXRhbCgia2V5X2luX2ZpbGUgcmV0dXJuZWQganVuayIpOwotfQotCi12b2lkCi1hdXRoX2RlYnVnX2FkZChjb25zdCBjaGFyICpmbXQsLi4uKQotewotCWNoYXIgYnVmWzEwMjRdOwotCXZhX2xpc3QgYXJnczsKLQotCWlmICghYXV0aF9kZWJ1Z19pbml0KQotCQlyZXR1cm47Ci0KLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJmF1dGhfZGVidWcsIGJ1Zik7Ci19Ci0KLXZvaWQKLWF1dGhfZGVidWdfc2VuZCh2b2lkKQotewotCWNoYXIgKm1zZzsKLQotCWlmICghYXV0aF9kZWJ1Z19pbml0KQotCQlyZXR1cm47Ci0Jd2hpbGUgKGJ1ZmZlcl9sZW4oJmF1dGhfZGVidWcpKSB7Ci0JCW1zZyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZhdXRoX2RlYnVnLCBOVUxMKTsKLQkJcGFja2V0X3NlbmRfZGVidWcoIiVzIiwgbXNnKTsKLQkJeGZyZWUobXNnKTsKLQl9Ci19Ci0KLXZvaWQKLWF1dGhfZGVidWdfcmVzZXQodm9pZCkKLXsKLQlpZiAoYXV0aF9kZWJ1Z19pbml0KQotCQlidWZmZXJfY2xlYXIoJmF1dGhfZGVidWcpOwotCWVsc2UgewotCQlidWZmZXJfaW5pdCgmYXV0aF9kZWJ1Zyk7Ci0JCWF1dGhfZGVidWdfaW5pdCA9IDE7Ci0JfQotfQotCi1zdHJ1Y3QgcGFzc3dkICoKLWZha2Vwdyh2b2lkKQotewotCXN0YXRpYyBzdHJ1Y3QgcGFzc3dkIGZha2U7Ci0KLQltZW1zZXQoJmZha2UsIDAsIHNpemVvZihmYWtlKSk7Ci0JZmFrZS5wd19uYW1lID0gIk5PVVNFUiI7Ci0JZmFrZS5wd19wYXNzd2QgPQotCSAgICAiJDJhJDA2JHIzLmp1VWFIWkRsSWJRYU8yZFM5RnVZeEwxVzlNODFSMVRjOTJQb1NObXp2cEVxTGtMR3JLIjsKLSNpZmRlZiBIQVZFX1BXX0dFQ09TX0lOX1BBU1NXRAotCWZha2UucHdfZ2Vjb3MgPSAiTk9VU0VSIjsKLSNlbmRpZgotCWZha2UucHdfdWlkID0gcHJpdnNlcF9wdyA9PSBOVUxMID8gKHVpZF90KS0xIDogcHJpdnNlcF9wdy0+cHdfdWlkOwotCWZha2UucHdfZ2lkID0gcHJpdnNlcF9wdyA9PSBOVUxMID8gKGdpZF90KS0xIDogcHJpdnNlcF9wdy0+cHdfZ2lkOwotI2lmZGVmIEhBVkVfUFdfQ0xBU1NfSU5fUEFTU1dECi0JZmFrZS5wd19jbGFzcyA9ICIiOwotI2VuZGlmCi0JZmFrZS5wd19kaXIgPSAiL25vbmV4aXN0IjsKLQlmYWtlLnB3X3NoZWxsID0gIi9ub25leGlzdCI7Ci0KLQlyZXR1cm4gKCZmYWtlKTsKLX0KZGlmZiAtLWdpdCBhL2F1dGguaCBiL2F1dGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3ODZjNC4uMDAwMDAwMAotLS0gYS9hdXRoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGF1dGguaCx2IDEuNjkgMjAxMS8wNS8yMyAwMzozMDowNyBkam0gRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgQVVUSF9ICi0jZGVmaW5lIEFVVEhfSAotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgotCi0jaWZkZWYgSEFWRV9MT0dJTl9DQVAKLSNpbmNsdWRlIDxsb2dpbl9jYXAuaD4KLSNlbmRpZgotI2lmZGVmIEJTRF9BVVRICi0jaW5jbHVkZSA8YnNkX2F1dGguaD4KLSNlbmRpZgotI2lmZGVmIEtSQjUKLSNpbmNsdWRlIDxrcmI1Lmg+Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgQXV0aGN0eHQgQXV0aGN0eHQ7Ci10eXBlZGVmIHN0cnVjdCBBdXRobWV0aG9kIEF1dGhtZXRob2Q7Ci10eXBlZGVmIHN0cnVjdCBLYmRpbnREZXZpY2UgS2JkaW50RGV2aWNlOwotCi1zdHJ1Y3QgQXV0aGN0eHQgewotCXNpZ19hdG9taWNfdAkgc3VjY2VzczsKLQlpbnQJCSBhdXRoZW50aWNhdGVkOwkvKiBhdXRoZW50aWNhdGVkIGFuZCBhbGFybXMgY2FuY2VsbGVkICovCi0JaW50CQkgcG9zdHBvbmVkOwkvKiBhdXRoZW50aWNhdGlvbiBuZWVkcyBhbm90aGVyIHN0ZXAgKi8KLQlpbnQJCSB2YWxpZDsJCS8qIHVzZXIgZXhpc3RzIGFuZCBpcyBhbGxvd2VkIHRvIGxvZ2luICovCi0JaW50CQkgYXR0ZW1wdDsKLQlpbnQJCSBmYWlsdXJlczsKLQlpbnQJCSBzZXJ2ZXJfY2F1c2VkX2ZhaWx1cmU7IAotCWludAkJIGZvcmNlX3B3Y2hhbmdlOwotCWNoYXIJCSp1c2VyOwkJLyogdXNlcm5hbWUgc2VudCBieSB0aGUgY2xpZW50ICovCi0JY2hhcgkJKnNlcnZpY2U7Ci0Jc3RydWN0IHBhc3N3ZAkqcHc7CQkvKiBzZXQgaWYgJ3ZhbGlkJyAqLwotCWNoYXIJCSpzdHlsZTsKLQl2b2lkCQkqa2JkaW50Y3R4dDsKLQl2b2lkCQkqanBha2VfY3R4OwotI2lmZGVmIEJTRF9BVVRICi0JYXV0aF9zZXNzaW9uX3QJKmFzOwotI2VuZGlmCi0jaWZkZWYgS1JCNQotCWtyYjVfY29udGV4dAkga3JiNV9jdHg7Ci0Ja3JiNV9jY2FjaGUJIGtyYjVfZndkX2NjYWNoZTsKLQlrcmI1X3ByaW5jaXBhbAkga3JiNV91c2VyOwotCWNoYXIJCSprcmI1X3RpY2tldF9maWxlOwotCWNoYXIJCSprcmI1X2NjbmFtZTsKLSNlbmRpZgotCUJ1ZmZlcgkJKmxvZ2lubXNnOwotCXZvaWQJCSptZXRob2RkYXRhOwotfTsKLS8qCi0gKiBFdmVyeSBhdXRoZW50aWNhdGlvbiBtZXRob2QgaGFzIHRvIGhhbmRsZSBhdXRoZW50aWNhdGlvbiByZXF1ZXN0cyBmb3IKLSAqIG5vbi1leGlzdGluZyB1c2Vycywgb3IgZm9yIHVzZXJzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIHRvIGxvZ2luLiBJbiB0aGlzCi0gKiBjYXNlICd2YWxpZCcgaXMgc2V0IHRvIDAsIGJ1dCAndXNlcicgcG9pbnRzIHRvIHRoZSB1c2VybmFtZSByZXF1ZXN0ZWQgYnkKLSAqIHRoZSBjbGllbnQuCi0gKi8KLQotc3RydWN0IEF1dGhtZXRob2QgewotCWNoYXIJKm5hbWU7Ci0JaW50CSgqdXNlcmF1dGgpKEF1dGhjdHh0ICphdXRoY3R4dCk7Ci0JaW50CSplbmFibGVkOwotfTsKLQotLyoKLSAqIEtleWJvYXJkIGludGVyYWN0aXZlIGRldmljZToKLSAqIGluaXRfY3R4CXJldHVybnM6IG5vbiBOVUxMIHVwb24gc3VjY2VzcwotICogcXVlcnkJcmV0dXJuczogMCAtIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsdXJlCi0gKiByZXNwb25kCXJldHVybnM6IDAgLSBzdWNjZXNzLCAxIC0gbmVlZCBmdXJ0aGVyIGludGVyYWN0aW9uLAotICoJCW90aGVyd2lzZSAtIGZhaWx1cmUKLSAqLwotc3RydWN0IEtiZGludERldmljZQotewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0Jdm9pZCoJKCppbml0X2N0eCkoQXV0aGN0eHQqKTsKLQlpbnQJKCpxdWVyeSkodm9pZCAqY3R4LCBjaGFyICoqbmFtZSwgY2hhciAqKmluZm90eHQsCi0JCSAgICB1X2ludCAqbnVtcHJvbXB0cywgY2hhciAqKipwcm9tcHRzLCB1X2ludCAqKmVjaG9fb24pOwotCWludAkoKnJlc3BvbmQpKHZvaWQgKmN0eCwgdV9pbnQgbnVtcmVzcCwgY2hhciAqKnJlc3BvbnNlcyk7Ci0Jdm9pZAkoKmZyZWVfY3R4KSh2b2lkICpjdHgpOwotfTsKLQotaW50ICAgICAgYXV0aF9yaG9zdHMoc3RydWN0IHBhc3N3ZCAqLCBjb25zdCBjaGFyICopOwotaW50Ci1hdXRoX3Job3N0czIoc3RydWN0IHBhc3N3ZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLQotaW50CSBhdXRoX3Job3N0c19yc2EoQXV0aGN0eHQgKiwgY2hhciAqLCBLZXkgKik7Ci1pbnQgICAgICBhdXRoX3Bhc3N3b3JkKEF1dGhjdHh0ICosIGNvbnN0IGNoYXIgKik7Ci1pbnQgICAgICBhdXRoX3JzYShBdXRoY3R4dCAqLCBCSUdOVU0gKik7Ci1pbnQgICAgICBhdXRoX3JzYV9jaGFsbGVuZ2VfZGlhbG9nKEtleSAqKTsKLUJJR05VTQkqYXV0aF9yc2FfZ2VuZXJhdGVfY2hhbGxlbmdlKEtleSAqKTsKLWludAkgYXV0aF9yc2FfdmVyaWZ5X3Jlc3BvbnNlKEtleSAqLCBCSUdOVU0gKiwgdV9jaGFyW10pOwotaW50CSBhdXRoX3JzYV9rZXlfYWxsb3dlZChzdHJ1Y3QgcGFzc3dkICosIEJJR05VTSAqLCBLZXkgKiopOwotCi1pbnQJIGF1dGhfcmhvc3RzX3JzYV9rZXlfYWxsb3dlZChzdHJ1Y3QgcGFzc3dkICosIGNoYXIgKiwgY2hhciAqLCBLZXkgKik7Ci1pbnQJIGhvc3RiYXNlZF9rZXlfYWxsb3dlZChzdHJ1Y3QgcGFzc3dkICosIGNvbnN0IGNoYXIgKiwgY2hhciAqLCBLZXkgKik7Ci1pbnQJIHVzZXJfa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqLCBLZXkgKik7Ci0KLSNpZmRlZiBLUkI1Ci1pbnQJYXV0aF9rcmI1KEF1dGhjdHh0ICphdXRoY3R4dCwga3JiNV9kYXRhICphdXRoLCBjaGFyICoqY2xpZW50LCBrcmI1X2RhdGEgKik7Ci1pbnQJYXV0aF9rcmI1X3RndChBdXRoY3R4dCAqYXV0aGN0eHQsIGtyYjVfZGF0YSAqdGd0KTsKLWludAlhdXRoX2tyYjVfcGFzc3dvcmQoQXV0aGN0eHQgKmF1dGhjdHh0LCBjb25zdCBjaGFyICpwYXNzd29yZCk7Ci12b2lkCWtyYjVfY2xlYW51cF9wcm9jKEF1dGhjdHh0ICphdXRoY3R4dCk7Ci0jZW5kaWYgLyogS1JCNSAqLwotCi0jaWYgZGVmaW5lZChVU0VfU0hBRE9XKSAmJiBkZWZpbmVkKEhBU19TSEFET1dfRVhQSVJFKQotI2luY2x1ZGUgPHNoYWRvdy5oPgotaW50IGF1dGhfc2hhZG93X2FjY3RleHBpcmVkKHN0cnVjdCBzcHdkICopOwotaW50IGF1dGhfc2hhZG93X3B3ZXhwaXJlZChBdXRoY3R4dCAqKTsKLSNlbmRpZgotCi0jaW5jbHVkZSAiYXV0aC1wYW0uaCIKLSNpbmNsdWRlICJhdWRpdC5oIgotdm9pZCByZW1vdmVfa2JkaW50X2RldmljZShjb25zdCBjaGFyICopOwotCi12b2lkIGRpc2FibGVfZm9yd2FyZGluZyh2b2lkKTsKLQotdm9pZAlkb19hdXRoZW50aWNhdGlvbihBdXRoY3R4dCAqKTsKLXZvaWQJZG9fYXV0aGVudGljYXRpb24yKEF1dGhjdHh0ICopOwotCi12b2lkCWF1dGhfbG9nKEF1dGhjdHh0ICosIGludCwgY2hhciAqLCBjaGFyICopOwotdm9pZAl1c2VyYXV0aF9maW5pc2goQXV0aGN0eHQgKiwgaW50LCBjaGFyICopOwotdm9pZAl1c2VyYXV0aF9zZW5kX2Jhbm5lcihjb25zdCBjaGFyICopOwotaW50CWF1dGhfcm9vdF9hbGxvd2VkKGNoYXIgKik7Ci0KLWNoYXIJKmF1dGgyX3JlYWRfYmFubmVyKHZvaWQpOwotCi12b2lkCXByaXZzZXBfY2hhbGxlbmdlX2VuYWJsZSh2b2lkKTsKLQotaW50CWF1dGgyX2NoYWxsZW5nZShBdXRoY3R4dCAqLCBjaGFyICopOwotdm9pZAlhdXRoMl9jaGFsbGVuZ2Vfc3RvcChBdXRoY3R4dCAqKTsKLWludAlic2RhdXRoX3F1ZXJ5KHZvaWQgKiwgY2hhciAqKiwgY2hhciAqKiwgdV9pbnQgKiwgY2hhciAqKiosIHVfaW50ICoqKTsKLWludAlic2RhdXRoX3Jlc3BvbmQodm9pZCAqLCB1X2ludCwgY2hhciAqKik7Ci1pbnQJc2tleV9xdWVyeSh2b2lkICosIGNoYXIgKiosIGNoYXIgKiosIHVfaW50ICosIGNoYXIgKioqLCB1X2ludCAqKik7Ci1pbnQJc2tleV9yZXNwb25kKHZvaWQgKiwgdV9pbnQsIGNoYXIgKiopOwotCi12b2lkCWF1dGgyX2pwYWtlX2dldF9wd2RhdGEoQXV0aGN0eHQgKiwgQklHTlVNICoqLCBjaGFyICoqLCBjaGFyICoqKTsKLXZvaWQJYXV0aDJfanBha2Vfc3RvcChBdXRoY3R4dCAqKTsKLQotaW50CWFsbG93ZWRfdXNlcihzdHJ1Y3QgcGFzc3dkICopOwotc3RydWN0IHBhc3N3ZCAqIGdldHB3bmFtYWxsb3coY29uc3QgY2hhciAqdXNlcik7Ci0KLWNoYXIJKmdldF9jaGFsbGVuZ2UoQXV0aGN0eHQgKik7Ci1pbnQJdmVyaWZ5X3Jlc3BvbnNlKEF1dGhjdHh0ICosIGNvbnN0IGNoYXIgKik7Ci12b2lkCWFiYW5kb25fY2hhbGxlbmdlX3Jlc3BvbnNlKEF1dGhjdHh0ICopOwotCi1jaGFyCSpleHBhbmRfYXV0aG9yaXplZF9rZXlzKGNvbnN0IGNoYXIgKiwgc3RydWN0IHBhc3N3ZCAqcHcpOwotY2hhcgkqYXV0aG9yaXplZF9wcmluY2lwYWxzX2ZpbGUoc3RydWN0IHBhc3N3ZCAqKTsKLQotRklMRQkqYXV0aF9vcGVua2V5ZmlsZShjb25zdCBjaGFyICosIHN0cnVjdCBwYXNzd2QgKiwgaW50KTsKLUZJTEUJKmF1dGhfb3BlbnByaW5jaXBhbHMoY29uc3QgY2hhciAqLCBzdHJ1Y3QgcGFzc3dkICosIGludCk7Ci1pbnQJIGF1dGhfa2V5X2lzX3Jldm9rZWQoS2V5ICopOwotCi1Ib3N0U3RhdHVzCi1jaGVja19rZXlfaW5faG9zdGZpbGVzKHN0cnVjdCBwYXNzd2QgKiwgS2V5ICosIGNvbnN0IGNoYXIgKiwKLSAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci0KLS8qIGhvc3RrZXkgaGFuZGxpbmcgKi8KLUtleQkqZ2V0X2hvc3RrZXlfYnlfaW5kZXgoaW50KTsKLUtleQkqZ2V0X2hvc3RrZXlfcHVibGljX2J5X3R5cGUoaW50KTsKLUtleQkqZ2V0X2hvc3RrZXlfcHJpdmF0ZV9ieV90eXBlKGludCk7Ci1pbnQJIGdldF9ob3N0a2V5X2luZGV4KEtleSAqKTsKLWludAkgc3NoMV9zZXNzaW9uX2tleShCSUdOVU0gKik7Ci0KLS8qIGRlYnVnIG1lc3NhZ2VzIGR1cmluZyBhdXRoZW50aWNhdGlvbiAqLwotdm9pZAkgYXV0aF9kZWJ1Z19hZGQoY29uc3QgY2hhciAqZm10LC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKLXZvaWQJIGF1dGhfZGVidWdfc2VuZCh2b2lkKTsKLXZvaWQJIGF1dGhfZGVidWdfcmVzZXQodm9pZCk7Ci0KLXN0cnVjdCBwYXNzd2QgKmZha2Vwdyh2b2lkKTsKLQotaW50CSBzeXNfYXV0aF9wYXNzd2QoQXV0aGN0eHQgKiwgY29uc3QgY2hhciAqKTsKLQotI2RlZmluZSBBVVRIX0ZBSUxfTVNHICJUb28gbWFueSBhdXRoZW50aWNhdGlvbiBmYWlsdXJlcyBmb3IgJS4xMDBzIgotCi0jZGVmaW5lIFNLRVlfUFJPTVBUICJcblMvS2V5IFBhc3N3b3JkOiAiCi0KLSNpZiBkZWZpbmVkKEtSQjUpICYmICFkZWZpbmVkKEhFSU1EQUwpCi0jaW5jbHVkZSA8a3JiNS5oPgota3JiNV9lcnJvcl9jb2RlIHNzaF9rcmI1X2NjX2dlbihrcmI1X2NvbnRleHQsIGtyYjVfY2NhY2hlICopOwotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2F1dGgxLmMgYi9hdXRoMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGY5ZDhiLi4wMDAwMDAwCi0tLSBhL2F1dGgxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGF1dGgxLmMsdiAxLjc1IDIwMTAvMDgvMzEgMDk6NTg6MzcgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLQotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJyc2EuaCIKLSNpbmNsdWRlICJzc2gxLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAic2VydmNvbmYuaCIKLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotI2luY2x1ZGUgImF1dGguaCIKLSNpbmNsdWRlICJjaGFubmVscy5oIgotI2luY2x1ZGUgInNlc3Npb24uaCIKLSNpbmNsdWRlICJ1aWRzd2FwLmgiCi0jaWZkZWYgR1NTQVBJCi0jaW5jbHVkZSAic3NoLWdzcy5oIgotI2VuZGlmCi0jaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0KLS8qIGltcG9ydCAqLwotZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKLWV4dGVybiBCdWZmZXIgbG9naW5tc2c7Ci0KLXN0YXRpYyBpbnQgYXV0aDFfcHJvY2Vzc19wYXNzd29yZChBdXRoY3R4dCAqLCBjaGFyICosIHNpemVfdCk7Ci1zdGF0aWMgaW50IGF1dGgxX3Byb2Nlc3NfcnNhKEF1dGhjdHh0ICosIGNoYXIgKiwgc2l6ZV90KTsKLXN0YXRpYyBpbnQgYXV0aDFfcHJvY2Vzc19yaG9zdHNfcnNhKEF1dGhjdHh0ICosIGNoYXIgKiwgc2l6ZV90KTsKLXN0YXRpYyBpbnQgYXV0aDFfcHJvY2Vzc190aXNfY2hhbGxlbmdlKEF1dGhjdHh0ICosIGNoYXIgKiwgc2l6ZV90KTsKLXN0YXRpYyBpbnQgYXV0aDFfcHJvY2Vzc190aXNfcmVzcG9uc2UoQXV0aGN0eHQgKiwgY2hhciAqLCBzaXplX3QpOwotCi1zdGF0aWMgY2hhciAqY2xpZW50X3VzZXIgPSBOVUxMOyAgICAvKiBVc2VkIHRvIGZpbGwgaW4gcmVtb3RlIHVzZXIgZm9yIFBBTSAqLwotCi1zdHJ1Y3QgQXV0aE1ldGhvZDEgewotCWludCB0eXBlOwotCWNoYXIgKm5hbWU7Ci0JaW50ICplbmFibGVkOwotCWludCAoKm1ldGhvZCkoQXV0aGN0eHQgKiwgY2hhciAqLCBzaXplX3QpOwotfTsKLQotY29uc3Qgc3RydWN0IEF1dGhNZXRob2QxIGF1dGgxX21ldGhvZHNbXSA9IHsKLQl7Ci0JCVNTSF9DTVNHX0FVVEhfUEFTU1dPUkQsICJwYXNzd29yZCIsCi0JCSZvcHRpb25zLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uLCBhdXRoMV9wcm9jZXNzX3Bhc3N3b3JkCi0JfSwKLQl7Ci0JCVNTSF9DTVNHX0FVVEhfUlNBLCAicnNhIiwKLQkJJm9wdGlvbnMucnNhX2F1dGhlbnRpY2F0aW9uLCBhdXRoMV9wcm9jZXNzX3JzYQotCX0sCi0JewotCQlTU0hfQ01TR19BVVRIX1JIT1NUU19SU0EsICJyaG9zdHMtcnNhIiwKLQkJJm9wdGlvbnMucmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbiwgYXV0aDFfcHJvY2Vzc19yaG9zdHNfcnNhCi0JfSwKLQl7Ci0JCVNTSF9DTVNHX0FVVEhfVElTLCAiY2hhbGxlbmdlLXJlc3BvbnNlIiwKLQkJJm9wdGlvbnMuY2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uLAotCQlhdXRoMV9wcm9jZXNzX3Rpc19jaGFsbGVuZ2UKLQl9LAotCXsKLQkJU1NIX0NNU0dfQVVUSF9USVNfUkVTUE9OU0UsICJjaGFsbGVuZ2UtcmVzcG9uc2UiLAotCQkmb3B0aW9ucy5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24sCi0JCWF1dGgxX3Byb2Nlc3NfdGlzX3Jlc3BvbnNlCi0JfSwKLQl7IC0xLCBOVUxMLCBOVUxMLCBOVUxMfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBBdXRoTWV0aG9kMQotKmxvb2t1cF9hdXRobWV0aG9kMShpbnQgdHlwZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGF1dGgxX21ldGhvZHNbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JCWlmIChhdXRoMV9tZXRob2RzW2ldLnR5cGUgPT0gdHlwZSkKLQkJCXJldHVybiAoJihhdXRoMV9tZXRob2RzW2ldKSk7Ci0KLQlyZXR1cm4gKE5VTEwpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfYXV0aG5hbWUoaW50IHR5cGUpCi17Ci0JY29uc3Qgc3RydWN0IEF1dGhNZXRob2QxICphOwotCXN0YXRpYyBjaGFyIGJ1Zls2NF07Ci0KLQlpZiAoKGEgPSBsb29rdXBfYXV0aG1ldGhvZDEodHlwZSkpICE9IE5VTEwpCi0JCXJldHVybiAoYS0+bmFtZSk7Ci0Jc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImJhZC1hdXRoLW1zZy0lZCIsIHR5cGUpOwotCXJldHVybiAoYnVmKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaW50Ci1hdXRoMV9wcm9jZXNzX3Bhc3N3b3JkKEF1dGhjdHh0ICphdXRoY3R4dCwgY2hhciAqaW5mbywgc2l6ZV90IGluZm9sZW4pCi17Ci0JaW50IGF1dGhlbnRpY2F0ZWQgPSAwOwotCWNoYXIgKnBhc3N3b3JkOwotCXVfaW50IGRsZW47Ci0KLQkvKgotCSAqIFJlYWQgdXNlciBwYXNzd29yZC4gIEl0IGlzIGluIHBsYWluIHRleHQsIGJ1dCB3YXMKLQkgKiB0cmFuc21pdHRlZCBvdmVyIHRoZSBlbmNyeXB0ZWQgY2hhbm5lbCBzbyBpdCBpcwotCSAqIG5vdCB2aXNpYmxlIHRvIGFuIG91dHNpZGUgb2JzZXJ2ZXIuCi0JICovCi0JcGFzc3dvcmQgPSBwYWNrZXRfZ2V0X3N0cmluZygmZGxlbik7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JLyogVHJ5IGF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIHBhc3N3b3JkLiAqLwotI2lmbmRlZiBBTkRST0lECi0JYXV0aGVudGljYXRlZCA9IFBSSVZTRVAoYXV0aF9wYXNzd29yZChhdXRoY3R4dCwgcGFzc3dvcmQpKTsKLQotI2Vsc2UKLQkvKiBubyBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBpbiBhbmRyb2lkICovCi0JYXV0aGVudGljYXRlZCA9IDA7Ci0jZW5kaWYKLQotCW1lbXNldChwYXNzd29yZCwgMCwgZGxlbik7Ci0JeGZyZWUocGFzc3dvcmQpOwotCi0JcmV0dXJuIChhdXRoZW50aWNhdGVkKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaW50Ci1hdXRoMV9wcm9jZXNzX3JzYShBdXRoY3R4dCAqYXV0aGN0eHQsIGNoYXIgKmluZm8sIHNpemVfdCBpbmZvbGVuKQotewotCWludCBhdXRoZW50aWNhdGVkID0gMDsKLQlCSUdOVU0gKm47Ci0KLQkvKiBSU0EgYXV0aGVudGljYXRpb24gcmVxdWVzdGVkLiAqLwotCWlmICgobiA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiZG9fYXV0aGxvb3A6IEJOX25ldyBmYWlsZWQiKTsKLQlwYWNrZXRfZ2V0X2JpZ251bShuKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0JYXV0aGVudGljYXRlZCA9IGF1dGhfcnNhKGF1dGhjdHh0LCBuKTsKLQlCTl9jbGVhcl9mcmVlKG4pOwotCi0JcmV0dXJuIChhdXRoZW50aWNhdGVkKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaW50Ci1hdXRoMV9wcm9jZXNzX3Job3N0c19yc2EoQXV0aGN0eHQgKmF1dGhjdHh0LCBjaGFyICppbmZvLCBzaXplX3QgaW5mb2xlbikKLXsKLQlpbnQga2V5Yml0cywgYXV0aGVudGljYXRlZCA9IDA7Ci0JdV9pbnQgYml0czsKLQlLZXkgKmNsaWVudF9ob3N0X2tleTsKLQl1X2ludCB1bGVuOwotCi0JLyoKLQkgKiBHZXQgY2xpZW50IHVzZXIgbmFtZS4gIE5vdGUgdGhhdCB3ZSBqdXN0IGhhdmUgdG8KLQkgKiB0cnVzdCB0aGUgY2xpZW50OyByb290IG9uIHRoZSBjbGllbnQgbWFjaGluZSBjYW4KLQkgKiBjbGFpbSB0byBiZSBhbnkgdXNlci4KLQkgKi8KLQljbGllbnRfdXNlciA9IHBhY2tldF9nZXRfY3N0cmluZygmdWxlbik7Ci0KLQkvKiBHZXQgdGhlIGNsaWVudCBob3N0IGtleS4gKi8KLQljbGllbnRfaG9zdF9rZXkgPSBrZXlfbmV3KEtFWV9SU0ExKTsKLQliaXRzID0gcGFja2V0X2dldF9pbnQoKTsKLQlwYWNrZXRfZ2V0X2JpZ251bShjbGllbnRfaG9zdF9rZXktPnJzYS0+ZSk7Ci0JcGFja2V0X2dldF9iaWdudW0oY2xpZW50X2hvc3Rfa2V5LT5yc2EtPm4pOwotCi0Ja2V5Yml0cyA9IEJOX251bV9iaXRzKGNsaWVudF9ob3N0X2tleS0+cnNhLT5uKTsKLQlpZiAoa2V5Yml0cyA8IDAgfHwgYml0cyAhPSAodV9pbnQpa2V5Yml0cykgewotCQl2ZXJib3NlKCJXYXJuaW5nOiBrZXlzaXplIG1pc21hdGNoIGZvciBjbGllbnRfaG9zdF9rZXk6ICIKLQkJICAgICJhY3R1YWwgJWQsIGFubm91bmNlZCAlZCIsCi0JCSAgICBCTl9udW1fYml0cyhjbGllbnRfaG9zdF9rZXktPnJzYS0+biksIGJpdHMpOwotCX0KLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlhdXRoZW50aWNhdGVkID0gYXV0aF9yaG9zdHNfcnNhKGF1dGhjdHh0LCBjbGllbnRfdXNlciwKLQkgICAgY2xpZW50X2hvc3Rfa2V5KTsKLQlrZXlfZnJlZShjbGllbnRfaG9zdF9rZXkpOwotCi0Jc25wcmludGYoaW5mbywgaW5mb2xlbiwgIiBydXNlciAlLjEwMHMiLCBjbGllbnRfdXNlcik7Ci0KLQlyZXR1cm4gKGF1dGhlbnRpY2F0ZWQpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWF1dGgxX3Byb2Nlc3NfdGlzX2NoYWxsZW5nZShBdXRoY3R4dCAqYXV0aGN0eHQsIGNoYXIgKmluZm8sIHNpemVfdCBpbmZvbGVuKQotewotCWNoYXIgKmNoYWxsZW5nZTsKLQotCWlmICgoY2hhbGxlbmdlID0gZ2V0X2NoYWxsZW5nZShhdXRoY3R4dCkpID09IE5VTEwpCi0JCXJldHVybiAoMCk7Ci0KLQlkZWJ1Zygic2VuZGluZyBjaGFsbGVuZ2UgJyVzJyIsIGNoYWxsZW5nZSk7Ci0JcGFja2V0X3N0YXJ0KFNTSF9TTVNHX0FVVEhfVElTX0NIQUxMRU5HRSk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKGNoYWxsZW5nZSk7Ci0JeGZyZWUoY2hhbGxlbmdlKTsKLQlwYWNrZXRfc2VuZCgpOwotCXBhY2tldF93cml0ZV93YWl0KCk7Ci0KLQlyZXR1cm4gKC0xKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaW50Ci1hdXRoMV9wcm9jZXNzX3Rpc19yZXNwb25zZShBdXRoY3R4dCAqYXV0aGN0eHQsIGNoYXIgKmluZm8sIHNpemVfdCBpbmZvbGVuKQotewotCWludCBhdXRoZW50aWNhdGVkID0gMDsKLQljaGFyICpyZXNwb25zZTsKLQl1X2ludCBkbGVuOwotCi0JcmVzcG9uc2UgPSBwYWNrZXRfZ2V0X3N0cmluZygmZGxlbik7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCWF1dGhlbnRpY2F0ZWQgPSB2ZXJpZnlfcmVzcG9uc2UoYXV0aGN0eHQsIHJlc3BvbnNlKTsKLQltZW1zZXQocmVzcG9uc2UsICdyJywgZGxlbik7Ci0JeGZyZWUocmVzcG9uc2UpOwotCi0JcmV0dXJuIChhdXRoZW50aWNhdGVkKTsKLX0KLQotLyoKLSAqIHJlYWQgcGFja2V0cywgdHJ5IHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciBhbmQKLSAqIHJldHVybiBvbmx5IGlmIGF1dGhlbnRpY2F0aW9uIGlzIHN1Y2Nlc3NmdWwKLSAqLwotc3RhdGljIHZvaWQKLWRvX2F1dGhsb29wKEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlpbnQgYXV0aGVudGljYXRlZCA9IDA7Ci0JY2hhciBpbmZvWzEwMjRdOwotCWludCBwcmV2ID0gMCwgdHlwZSA9IDA7Ci0JY29uc3Qgc3RydWN0IEF1dGhNZXRob2QxICptZXRoOwotCi0JZGVidWcoIkF0dGVtcHRpbmcgYXV0aGVudGljYXRpb24gZm9yICVzJS4xMDBzLiIsCi0JICAgIGF1dGhjdHh0LT52YWxpZCA/ICIiIDogImludmFsaWQgdXNlciAiLCBhdXRoY3R4dC0+dXNlcik7Ci0KLQkvKiBubyBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBpbiBhbmRyb2lkICovCi0jaWZuZGVmIEFORFJPSUQKLQkvKiBJZiB0aGUgdXNlciBoYXMgbm8gcGFzc3dvcmQsIGFjY2VwdCBhdXRoZW50aWNhdGlvbiBpbW1lZGlhdGVseS4gKi8KLQlpZiAob3B0aW9ucy5wZXJtaXRfZW1wdHlfcGFzc3dkICYmIG9wdGlvbnMucGFzc3dvcmRfYXV0aGVudGljYXRpb24gJiYKLSNpZmRlZiBLUkI1Ci0JICAgICghb3B0aW9ucy5rZXJiZXJvc19hdXRoZW50aWNhdGlvbiB8fCBvcHRpb25zLmtlcmJlcm9zX29yX2xvY2FsX3Bhc3N3ZCkgJiYKLSNlbmRpZgotCSAgICBQUklWU0VQKGF1dGhfcGFzc3dvcmQoYXV0aGN0eHQsICIiKSkpIAotI2VuZGlmCi0JICAgIHsKLSNpZmRlZiBVU0VfUEFNCi0JCWlmIChvcHRpb25zLnVzZV9wYW0gJiYgKFBSSVZTRVAoZG9fcGFtX2FjY291bnQoKSkpKQotI2VuZGlmCi0JCXsKLQkJCWF1dGhfbG9nKGF1dGhjdHh0LCAxLCAid2l0aG91dCBhdXRoZW50aWNhdGlvbiIsICIiKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qIEluZGljYXRlIHRoYXQgYXV0aGVudGljYXRpb24gaXMgbmVlZGVkLiAqLwotCXBhY2tldF9zdGFydChTU0hfU01TR19GQUlMVVJFKTsKLQlwYWNrZXRfc2VuZCgpOwotCXBhY2tldF93cml0ZV93YWl0KCk7Ci0KLQlmb3IgKDs7KSB7Ci0JCS8qIGRlZmF1bHQgdG8gZmFpbCAqLwotCQlhdXRoZW50aWNhdGVkID0gMDsKLQotCQlpbmZvWzBdID0gJ1wwJzsKLQotCQkvKiBHZXQgYSBwYWNrZXQgZnJvbSB0aGUgY2xpZW50LiAqLwotCQlwcmV2ID0gdHlwZTsKLQkJdHlwZSA9IHBhY2tldF9yZWFkKCk7Ci0KLQkJLyoKLQkJICogSWYgd2Ugc3RhcnRlZCBjaGFsbGVuZ2UtcmVzcG9uc2UgYXV0aGVudGljYXRpb24gYnV0IHRoZQotCQkgKiBuZXh0IHBhY2tldCBpcyBub3QgYSByZXNwb25zZSB0byBvdXIgY2hhbGxlbmdlLCByZWxlYXNlCi0JCSAqIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IGdldF9jaGFsbGVuZ2UoKSAod2hpY2ggd291bGQKLQkJICogbm9ybWFsbHkgaGF2ZSBiZWVuIHJlbGVhc2VkIGJ5IHZlcmlmeV9yZXNwb25zZSgpIGhhZCB3ZQotCQkgKiByZWNlaXZlZCBzdWNoIGEgcmVzcG9uc2UpCi0JCSAqLwotCQlpZiAocHJldiA9PSBTU0hfQ01TR19BVVRIX1RJUyAmJgotCQkgICAgdHlwZSAhPSBTU0hfQ01TR19BVVRIX1RJU19SRVNQT05TRSkKLQkJCWFiYW5kb25fY2hhbGxlbmdlX3Jlc3BvbnNlKGF1dGhjdHh0KTsKLQotCQlpZiAoYXV0aGN0eHQtPmZhaWx1cmVzID49IG9wdGlvbnMubWF4X2F1dGh0cmllcykKLQkJCWdvdG8gc2tpcDsKLQkJaWYgKChtZXRoID0gbG9va3VwX2F1dGhtZXRob2QxKHR5cGUpKSA9PSBOVUxMKSB7Ci0JCQlsb2dpdCgiVW5rbm93biBtZXNzYWdlIGR1cmluZyBhdXRoZW50aWNhdGlvbjogIgotCQkJICAgICJ0eXBlICVkIiwgdHlwZSk7Ci0JCQlnb3RvIHNraXA7Ci0JCX0KLQotCQlpZiAoISoobWV0aC0+ZW5hYmxlZCkpIHsKLQkJCXZlcmJvc2UoIiVzIGF1dGhlbnRpY2F0aW9uIGRpc2FibGVkLiIsIG1ldGgtPm5hbWUpOwotCQkJZ290byBza2lwOwotCQl9Ci0KLQkJYXV0aGVudGljYXRlZCA9IG1ldGgtPm1ldGhvZChhdXRoY3R4dCwgaW5mbywgc2l6ZW9mKGluZm8pKTsKLQkJaWYgKGF1dGhlbnRpY2F0ZWQgPT0gLTEpCi0JCQljb250aW51ZTsgLyogInBvc3Rwb25lZCIgKi8KLQotI2lmZGVmIEJTRF9BVVRICi0JCWlmIChhdXRoY3R4dC0+YXMpIHsKLQkJCWF1dGhfY2xvc2UoYXV0aGN0eHQtPmFzKTsKLQkJCWF1dGhjdHh0LT5hcyA9IE5VTEw7Ci0JCX0KLSNlbmRpZgotCQlpZiAoIWF1dGhjdHh0LT52YWxpZCAmJiBhdXRoZW50aWNhdGVkKQotCQkJZmF0YWwoIklOVEVSTkFMIEVSUk9SOiBhdXRoZW50aWNhdGVkIGludmFsaWQgdXNlciAlcyIsCi0JCQkgICAgYXV0aGN0eHQtPnVzZXIpOwotCi0jaWZkZWYgX1VOSUNPUwotCQlpZiAoYXV0aGVudGljYXRlZCAmJiBjcmF5X2FjY2Vzc19kZW5pZWQoYXV0aGN0eHQtPnVzZXIpKSB7Ci0JCQlhdXRoZW50aWNhdGVkID0gMDsKLQkJCWZhdGFsKCJBY2Nlc3MgZGVuaWVkIGZvciB1c2VyICVzLiIsYXV0aGN0eHQtPnVzZXIpOwotCQl9Ci0jZW5kaWYgLyogX1VOSUNPUyAqLwotCi0jaWZuZGVmIEhBVkVfQ1lHV0lOCi0JCS8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHJvb3QgKi8KLQkJaWYgKGF1dGhlbnRpY2F0ZWQgJiYgYXV0aGN0eHQtPnB3LT5wd191aWQgPT0gMCAmJgotCQkgICAgIWF1dGhfcm9vdF9hbGxvd2VkKG1ldGgtPm5hbWUpKSB7Ci0gCQkJYXV0aGVudGljYXRlZCA9IDA7Ci0jIGlmZGVmIFNTSF9BVURJVF9FVkVOVFMKLQkJCVBSSVZTRVAoYXVkaXRfZXZlbnQoU1NIX0xPR0lOX1JPT1RfREVOSUVEKSk7Ci0jIGVuZGlmCi0JCX0KLSNlbmRpZgotCi0jaWZkZWYgVVNFX1BBTQotCQlpZiAob3B0aW9ucy51c2VfcGFtICYmIGF1dGhlbnRpY2F0ZWQgJiYKLQkJICAgICFQUklWU0VQKGRvX3BhbV9hY2NvdW50KCkpKSB7Ci0JCQljaGFyICptc2c7Ci0JCQlzaXplX3QgbGVuOwotCi0JCQllcnJvcigiQWNjZXNzIGRlbmllZCBmb3IgdXNlciAlcyBieSBQQU0gYWNjb3VudCAiCi0JCQkgICAgImNvbmZpZ3VyYXRpb24iLCBhdXRoY3R4dC0+dXNlcik7Ci0JCQlsZW4gPSBidWZmZXJfbGVuKCZsb2dpbm1zZyk7Ci0JCQlidWZmZXJfYXBwZW5kKCZsb2dpbm1zZywgIlwwIiwgMSk7Ci0JCQltc2cgPSBidWZmZXJfcHRyKCZsb2dpbm1zZyk7Ci0JCQkvKiBzdHJpcCB0cmFpbGluZyBuZXdsaW5lcyAqLwotCQkJaWYgKGxlbiA+IDApCi0JCQkJd2hpbGUgKGxlbiA+IDAgJiYgbXNnWy0tbGVuXSA9PSAnXG4nKQotCQkJCQltc2dbbGVuXSA9ICdcMCc7Ci0JCQllbHNlCi0JCQkJbXNnID0gIkFjY2VzcyBkZW5pZWQuIjsKLQkJCXBhY2tldF9kaXNjb25uZWN0KCIlcyIsIG1zZyk7Ci0JCX0KLSNlbmRpZgotCi0gc2tpcDoKLQkJLyogTG9nIGJlZm9yZSBzZW5kaW5nIHRoZSByZXBseSAqLwotCQlhdXRoX2xvZyhhdXRoY3R4dCwgYXV0aGVudGljYXRlZCwgZ2V0X2F1dGhuYW1lKHR5cGUpLCBpbmZvKTsKLQotCQlpZiAoY2xpZW50X3VzZXIgIT0gTlVMTCkgewotCQkJeGZyZWUoY2xpZW50X3VzZXIpOwotCQkJY2xpZW50X3VzZXIgPSBOVUxMOwotCQl9Ci0KLQkJaWYgKGF1dGhlbnRpY2F0ZWQpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCsrYXV0aGN0eHQtPmZhaWx1cmVzID49IG9wdGlvbnMubWF4X2F1dGh0cmllcykgewotI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKLQkJCVBSSVZTRVAoYXVkaXRfZXZlbnQoU1NIX0xPR0lOX0VYQ0VFRF9NQVhUUklFUykpOwotI2VuZGlmCi0JCQlwYWNrZXRfZGlzY29ubmVjdChBVVRIX0ZBSUxfTVNHLCBhdXRoY3R4dC0+dXNlcik7Ci0JCX0KLQotCQlwYWNrZXRfc3RhcnQoU1NIX1NNU0dfRkFJTFVSRSk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JCXBhY2tldF93cml0ZV93YWl0KCk7Ci0JfQotfQotCi0vKgotICogUGVyZm9ybXMgYXV0aGVudGljYXRpb24gb2YgYW4gaW5jb21pbmcgY29ubmVjdGlvbi4gIFNlc3Npb24ga2V5IGhhcyBhbHJlYWR5Ci0gKiBiZWVuIGV4Y2hhbmdlZCBhbmQgZW5jcnlwdGlvbiBpcyBlbmFibGVkLgotICovCi12b2lkCi1kb19hdXRoZW50aWNhdGlvbihBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0JdV9pbnQgdWxlbjsKLQljaGFyICp1c2VyLCAqc3R5bGUgPSBOVUxMOwotCi0JLyogR2V0IHRoZSBuYW1lIG9mIHRoZSB1c2VyIHRoYXQgd2Ugd2lzaCB0byBsb2cgaW4gYXMuICovCi0JcGFja2V0X3JlYWRfZXhwZWN0KFNTSF9DTVNHX1VTRVIpOwotCi0JLyogR2V0IHRoZSB1c2VyIG5hbWUuICovCi0JdXNlciA9IHBhY2tldF9nZXRfY3N0cmluZygmdWxlbik7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JaWYgKChzdHlsZSA9IHN0cmNocih1c2VyLCAnOicpKSAhPSBOVUxMKQotCQkqc3R5bGUrKyA9ICdcMCc7Ci0KLQlhdXRoY3R4dC0+dXNlciA9IHVzZXI7Ci0JYXV0aGN0eHQtPnN0eWxlID0gc3R5bGU7Ci0KLQkvKiBWZXJpZnkgdGhhdCB0aGUgdXNlciBpcyBhIHZhbGlkIHVzZXIuICovCi0JaWYgKChhdXRoY3R4dC0+cHcgPSBQUklWU0VQKGdldHB3bmFtYWxsb3codXNlcikpKSAhPSBOVUxMKQotCQlhdXRoY3R4dC0+dmFsaWQgPSAxOwotCWVsc2UgewotCQlkZWJ1ZygiZG9fYXV0aGVudGljYXRpb246IGludmFsaWQgdXNlciAlcyIsIHVzZXIpOwotCQlhdXRoY3R4dC0+cHcgPSBmYWtlcHcoKTsKLQl9Ci0KLQlzZXRwcm9jdGl0bGUoIiVzJXMiLCBhdXRoY3R4dC0+dmFsaWQgPyB1c2VyIDogInVua25vd24iLAotCSAgICB1c2VfcHJpdnNlcCA/ICIgW25ldF0iIDogIiIpOwotCi0jaWZkZWYgVVNFX1BBTQotCWlmIChvcHRpb25zLnVzZV9wYW0pCi0JCVBSSVZTRVAoc3RhcnRfcGFtKGF1dGhjdHh0KSk7Ci0jZW5kaWYKLQotCS8qCi0JICogSWYgd2UgYXJlIG5vdCBydW5uaW5nIGFzIHJvb3QsIHRoZSB1c2VyIG11c3QgaGF2ZSB0aGUgc2FtZSB1aWQgYXMKLQkgKiB0aGUgc2VydmVyLgotCSAqLwotI2lmbmRlZiBIQVZFX0NZR1dJTgotCWlmICghdXNlX3ByaXZzZXAgJiYgZ2V0dWlkKCkgIT0gMCAmJiBhdXRoY3R4dC0+cHcgJiYKLQkgICAgYXV0aGN0eHQtPnB3LT5wd191aWQgIT0gZ2V0dWlkKCkpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJDYW5ub3QgY2hhbmdlIHVzZXIgd2hlbiBzZXJ2ZXIgbm90IHJ1bm5pbmcgYXMgcm9vdC4iKTsKLSNlbmRpZgotCi0JLyoKLQkgKiBMb29wIHVudGlsIHRoZSB1c2VyIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgb3IgdGhlIGNvbm5lY3Rpb24gaXMKLQkgKiBjbG9zZWQsIGRvX2F1dGhsb29wKCkgcmV0dXJucyBvbmx5IGlmIGF1dGhlbnRpY2F0aW9uIGlzIHN1Y2Nlc3NmdWwKLQkgKi8KLQlkb19hdXRobG9vcChhdXRoY3R4dCk7Ci0KLQkvKiBUaGUgdXNlciBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIGFuZCBhY2NlcHRlZC4gKi8KLQlwYWNrZXRfc3RhcnQoU1NIX1NNU0dfU1VDQ0VTUyk7Ci0JcGFja2V0X3NlbmQoKTsKLQlwYWNrZXRfd3JpdGVfd2FpdCgpOwotfQpkaWZmIC0tZ2l0IGEvYXV0aDItY2hhbGwuYyBiL2F1dGgyLWNoYWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZGJmZmUuLjAwMDAwMDAKLS0tIGEvYXV0aDItY2hhbGwuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKiAkT3BlbkJTRDogYXV0aDItY2hhbGwuYyx2IDEuMzQgMjAwOC8xMi8wOSAwNDozMjoyMiBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgUGVyIEFsbGFuc3Nvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInNzaDIuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotI2luY2x1ZGUgImF1dGguaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJkaXNwYXRjaC5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgInNlcnZjb25mLmgiCi0KLS8qIGltcG9ydCAqLwotZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKLQotc3RhdGljIGludCBhdXRoMl9jaGFsbGVuZ2Vfc3RhcnQoQXV0aGN0eHQgKik7Ci1zdGF0aWMgaW50IHNlbmRfdXNlcmF1dGhfaW5mb19yZXF1ZXN0KEF1dGhjdHh0ICopOwotc3RhdGljIHZvaWQgaW5wdXRfdXNlcmF1dGhfaW5mb19yZXNwb25zZShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKLQotI2lmZGVmIEJTRF9BVVRICi1leHRlcm4gS2JkaW50RGV2aWNlIGJzZGF1dGhfZGV2aWNlOwotI2Vsc2UKLSNpZmRlZiBVU0VfUEFNCi1leHRlcm4gS2JkaW50RGV2aWNlIHNzaHBhbV9kZXZpY2U7Ci0jZW5kaWYKLSNpZmRlZiBTS0VZCi1leHRlcm4gS2JkaW50RGV2aWNlIHNrZXlfZGV2aWNlOwotI2VuZGlmCi0jZW5kaWYKLQotS2JkaW50RGV2aWNlICpkZXZpY2VzW10gPSB7Ci0jaWZkZWYgQlNEX0FVVEgKLQkmYnNkYXV0aF9kZXZpY2UsCi0jZWxzZQotI2lmZGVmIFVTRV9QQU0KLQkmc3NocGFtX2RldmljZSwKLSNlbmRpZgotI2lmZGVmIFNLRVkKLQkmc2tleV9kZXZpY2UsCi0jZW5kaWYKLSNlbmRpZgotCU5VTEwKLX07Ci0KLXR5cGVkZWYgc3RydWN0IEtiZGludEF1dGhjdHh0IEtiZGludEF1dGhjdHh0Owotc3RydWN0IEtiZGludEF1dGhjdHh0Ci17Ci0JY2hhciAqZGV2aWNlczsKLQl2b2lkICpjdHh0OwotCUtiZGludERldmljZSAqZGV2aWNlOwotCXVfaW50IG5yZXE7Ci19OwotCi0jaWZkZWYgVVNFX1BBTQotdm9pZAotcmVtb3ZlX2tiZGludF9kZXZpY2UoY29uc3QgY2hhciAqZGV2bmFtZSkKLXsKLQlpbnQgaSwgajsKLQotCWZvciAoaSA9IDA7IGRldmljZXNbaV0gIT0gTlVMTDsgaSsrKQotCQlpZiAoc3RyY21wKGRldmljZXNbaV0tPm5hbWUsIGRldm5hbWUpID09IDApIHsKLQkJCWZvciAoaiA9IGk7IGRldmljZXNbal0gIT0gTlVMTDsgaisrKQotCQkJCWRldmljZXNbal0gPSBkZXZpY2VzW2orMV07Ci0JCQlpLS07Ci0JCX0KLX0KLSNlbmRpZgotCi1zdGF0aWMgS2JkaW50QXV0aGN0eHQgKgota2JkaW50X2FsbG9jKGNvbnN0IGNoYXIgKmRldnMpCi17Ci0JS2JkaW50QXV0aGN0eHQgKmtiZGludGN0eHQ7Ci0JQnVmZmVyIGI7Ci0JaW50IGk7Ci0KLSNpZmRlZiBVU0VfUEFNCi0JaWYgKCFvcHRpb25zLnVzZV9wYW0pCi0JCXJlbW92ZV9rYmRpbnRfZGV2aWNlKCJwYW0iKTsKLSNlbmRpZgotCi0Ja2JkaW50Y3R4dCA9IHhtYWxsb2Moc2l6ZW9mKEtiZGludEF1dGhjdHh0KSk7Ci0JaWYgKHN0cmNtcChkZXZzLCAiIikgPT0gMCkgewotCQlidWZmZXJfaW5pdCgmYik7Ci0JCWZvciAoaSA9IDA7IGRldmljZXNbaV07IGkrKykgewotCQkJaWYgKGJ1ZmZlcl9sZW4oJmIpID4gMCkKLQkJCQlidWZmZXJfYXBwZW5kKCZiLCAiLCIsIDEpOwotCQkJYnVmZmVyX2FwcGVuZCgmYiwgZGV2aWNlc1tpXS0+bmFtZSwKLQkJCSAgICBzdHJsZW4oZGV2aWNlc1tpXS0+bmFtZSkpOwotCQl9Ci0JCWJ1ZmZlcl9hcHBlbmQoJmIsICJcMCIsIDEpOwotCQlrYmRpbnRjdHh0LT5kZXZpY2VzID0geHN0cmR1cChidWZmZXJfcHRyKCZiKSk7Ci0JCWJ1ZmZlcl9mcmVlKCZiKTsKLQl9IGVsc2UgewotCQlrYmRpbnRjdHh0LT5kZXZpY2VzID0geHN0cmR1cChkZXZzKTsKLQl9Ci0JZGVidWcoImtiZGludF9hbGxvYzogZGV2aWNlcyAnJXMnIiwga2JkaW50Y3R4dC0+ZGV2aWNlcyk7Ci0Ja2JkaW50Y3R4dC0+Y3R4dCA9IE5VTEw7Ci0Ja2JkaW50Y3R4dC0+ZGV2aWNlID0gTlVMTDsKLQlrYmRpbnRjdHh0LT5ucmVxID0gMDsKLQotCXJldHVybiBrYmRpbnRjdHh0OwotfQotc3RhdGljIHZvaWQKLWtiZGludF9yZXNldF9kZXZpY2UoS2JkaW50QXV0aGN0eHQgKmtiZGludGN0eHQpCi17Ci0JaWYgKGtiZGludGN0eHQtPmN0eHQpIHsKLQkJa2JkaW50Y3R4dC0+ZGV2aWNlLT5mcmVlX2N0eChrYmRpbnRjdHh0LT5jdHh0KTsKLQkJa2JkaW50Y3R4dC0+Y3R4dCA9IE5VTEw7Ci0JfQotCWtiZGludGN0eHQtPmRldmljZSA9IE5VTEw7Ci19Ci1zdGF0aWMgdm9pZAota2JkaW50X2ZyZWUoS2JkaW50QXV0aGN0eHQgKmtiZGludGN0eHQpCi17Ci0JaWYgKGtiZGludGN0eHQtPmRldmljZSkKLQkJa2JkaW50X3Jlc2V0X2RldmljZShrYmRpbnRjdHh0KTsKLQlpZiAoa2JkaW50Y3R4dC0+ZGV2aWNlcykgewotCQl4ZnJlZShrYmRpbnRjdHh0LT5kZXZpY2VzKTsKLQkJa2JkaW50Y3R4dC0+ZGV2aWNlcyA9IE5VTEw7Ci0JfQotCXhmcmVlKGtiZGludGN0eHQpOwotfQotLyogZ2V0IG5leHQgZGV2aWNlICovCi1zdGF0aWMgaW50Ci1rYmRpbnRfbmV4dF9kZXZpY2UoS2JkaW50QXV0aGN0eHQgKmtiZGludGN0eHQpCi17Ci0Jc2l6ZV90IGxlbjsKLQljaGFyICp0OwotCWludCBpOwotCi0JaWYgKGtiZGludGN0eHQtPmRldmljZSkKLQkJa2JkaW50X3Jlc2V0X2RldmljZShrYmRpbnRjdHh0KTsKLQlkbyB7Ci0JCWxlbiA9IGtiZGludGN0eHQtPmRldmljZXMgPwotCQkgICAgc3RyY3NwbihrYmRpbnRjdHh0LT5kZXZpY2VzLCAiLCIpIDogMDsKLQotCQlpZiAobGVuID09IDApCi0JCQlicmVhazsKLQkJZm9yIChpID0gMDsgZGV2aWNlc1tpXTsgaSsrKQotCQkJaWYgKHN0cm5jbXAoa2JkaW50Y3R4dC0+ZGV2aWNlcywgZGV2aWNlc1tpXS0+bmFtZSwgbGVuKSA9PSAwKQotCQkJCWtiZGludGN0eHQtPmRldmljZSA9IGRldmljZXNbaV07Ci0JCXQgPSBrYmRpbnRjdHh0LT5kZXZpY2VzOwotCQlrYmRpbnRjdHh0LT5kZXZpY2VzID0gdFtsZW5dID8geHN0cmR1cCh0K2xlbisxKSA6IE5VTEw7Ci0JCXhmcmVlKHQpOwotCQlkZWJ1ZzIoImtiZGludF9uZXh0X2RldmljZTogZGV2aWNlcyAlcyIsIGtiZGludGN0eHQtPmRldmljZXMgPwotCQkgICAga2JkaW50Y3R4dC0+ZGV2aWNlcyA6ICI8ZW1wdHk+Iik7Ci0JfSB3aGlsZSAoa2JkaW50Y3R4dC0+ZGV2aWNlcyAmJiAha2JkaW50Y3R4dC0+ZGV2aWNlKTsKLQotCXJldHVybiBrYmRpbnRjdHh0LT5kZXZpY2UgPyAxIDogMDsKLX0KLQotLyoKLSAqIHRyeSBjaGFsbGVuZ2UtcmVzcG9uc2UsIHNldCBhdXRoY3R4dC0+cG9zdHBvbmVkIGlmIHdlIGhhdmUgdG8KLSAqIHdhaXQgZm9yIHRoZSByZXNwb25zZS4KLSAqLwotaW50Ci1hdXRoMl9jaGFsbGVuZ2UoQXV0aGN0eHQgKmF1dGhjdHh0LCBjaGFyICpkZXZzKQotewotCWRlYnVnKCJhdXRoMl9jaGFsbGVuZ2U6IHVzZXI9JXMgZGV2cz0lcyIsCi0JICAgIGF1dGhjdHh0LT51c2VyID8gYXV0aGN0eHQtPnVzZXIgOiAiPG5vdXNlcj4iLAotCSAgICBkZXZzID8gZGV2cyA6ICI8bm8gZGV2cz4iKTsKLQotCWlmIChhdXRoY3R4dC0+dXNlciA9PSBOVUxMIHx8ICFkZXZzKQotCQlyZXR1cm4gMDsKLQlpZiAoYXV0aGN0eHQtPmtiZGludGN0eHQgPT0gTlVMTCkKLQkJYXV0aGN0eHQtPmtiZGludGN0eHQgPSBrYmRpbnRfYWxsb2MoZGV2cyk7Ci0JcmV0dXJuIGF1dGgyX2NoYWxsZW5nZV9zdGFydChhdXRoY3R4dCk7Ci19Ci0KLS8qIHVucmVnaXN0ZXIga2JkLWludCBjYWxsYmFja3MgYW5kIGNvbnRleHQgKi8KLXZvaWQKLWF1dGgyX2NoYWxsZW5nZV9zdG9wKEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQkvKiB1bnJlZ2lzdGVyIGNhbGxiYWNrICovCi0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0lORk9fUkVTUE9OU0UsIE5VTEwpOwotCWlmIChhdXRoY3R4dC0+a2JkaW50Y3R4dCAhPSBOVUxMKSB7Ci0JCWtiZGludF9mcmVlKGF1dGhjdHh0LT5rYmRpbnRjdHh0KTsKLQkJYXV0aGN0eHQtPmtiZGludGN0eHQgPSBOVUxMOwotCX0KLX0KLQotLyogc2lkZSBlZmZlY3Q6IHNldHMgYXV0aGN0eHQtPnBvc3Rwb25lZCBpZiBhIHJlcGx5IHdhcyBzZW50Ki8KLXN0YXRpYyBpbnQKLWF1dGgyX2NoYWxsZW5nZV9zdGFydChBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0JS2JkaW50QXV0aGN0eHQgKmtiZGludGN0eHQgPSBhdXRoY3R4dC0+a2JkaW50Y3R4dDsKLQotCWRlYnVnMigiYXV0aDJfY2hhbGxlbmdlX3N0YXJ0OiBkZXZpY2VzICVzIiwKLQkgICAga2JkaW50Y3R4dC0+ZGV2aWNlcyA/ICBrYmRpbnRjdHh0LT5kZXZpY2VzIDogIjxlbXB0eT4iKTsKLQotCWlmIChrYmRpbnRfbmV4dF9kZXZpY2Uoa2JkaW50Y3R4dCkgPT0gMCkgewotCQlhdXRoMl9jaGFsbGVuZ2Vfc3RvcChhdXRoY3R4dCk7Ci0JCXJldHVybiAwOwotCX0KLQlkZWJ1ZygiYXV0aDJfY2hhbGxlbmdlX3N0YXJ0OiB0cnlpbmcgYXV0aGVudGljYXRpb24gbWV0aG9kICclcyciLAotCSAgICBrYmRpbnRjdHh0LT5kZXZpY2UtPm5hbWUpOwotCi0JaWYgKChrYmRpbnRjdHh0LT5jdHh0ID0ga2JkaW50Y3R4dC0+ZGV2aWNlLT5pbml0X2N0eChhdXRoY3R4dCkpID09IE5VTEwpIHsKLQkJYXV0aDJfY2hhbGxlbmdlX3N0b3AoYXV0aGN0eHQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHNlbmRfdXNlcmF1dGhfaW5mb19yZXF1ZXN0KGF1dGhjdHh0KSA9PSAwKSB7Ci0JCWF1dGgyX2NoYWxsZW5nZV9zdG9wKGF1dGhjdHh0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9JTkZPX1JFU1BPTlNFLAotCSAgICAmaW5wdXRfdXNlcmF1dGhfaW5mb19yZXNwb25zZSk7Ci0KLQlhdXRoY3R4dC0+cG9zdHBvbmVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc2VuZF91c2VyYXV0aF9pbmZvX3JlcXVlc3QoQXV0aGN0eHQgKmF1dGhjdHh0KQotewotCUtiZGludEF1dGhjdHh0ICprYmRpbnRjdHh0OwotCWNoYXIgKm5hbWUsICppbnN0ciwgKipwcm9tcHRzOwotCXVfaW50IGksICplY2hvX29uOwotCi0Ja2JkaW50Y3R4dCA9IGF1dGhjdHh0LT5rYmRpbnRjdHh0OwotCWlmIChrYmRpbnRjdHh0LT5kZXZpY2UtPnF1ZXJ5KGtiZGludGN0eHQtPmN0eHQsCi0JICAgICZuYW1lLCAmaW5zdHIsICZrYmRpbnRjdHh0LT5ucmVxLCAmcHJvbXB0cywgJmVjaG9fb24pKQotCQlyZXR1cm4gMDsKLQotCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9JTkZPX1JFUVVFU1QpOwotCXBhY2tldF9wdXRfY3N0cmluZyhuYW1lKTsKLQlwYWNrZXRfcHV0X2NzdHJpbmcoaW5zdHIpOwotCXBhY2tldF9wdXRfY3N0cmluZygiIik7CQkvKiBsYW5ndWFnZSBub3QgdXNlZCAqLwotCXBhY2tldF9wdXRfaW50KGtiZGludGN0eHQtPm5yZXEpOwotCWZvciAoaSA9IDA7IGkgPCBrYmRpbnRjdHh0LT5ucmVxOyBpKyspIHsKLQkJcGFja2V0X3B1dF9jc3RyaW5nKHByb21wdHNbaV0pOwotCQlwYWNrZXRfcHV0X2NoYXIoZWNob19vbltpXSk7Ci0JfQotCXBhY2tldF9zZW5kKCk7Ci0JcGFja2V0X3dyaXRlX3dhaXQoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBrYmRpbnRjdHh0LT5ucmVxOyBpKyspCi0JCXhmcmVlKHByb21wdHNbaV0pOwotCXhmcmVlKHByb21wdHMpOwotCXhmcmVlKGVjaG9fb24pOwotCXhmcmVlKG5hbWUpOwotCXhmcmVlKGluc3RyKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLWlucHV0X3VzZXJhdXRoX2luZm9fcmVzcG9uc2UoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKLQlLYmRpbnRBdXRoY3R4dCAqa2JkaW50Y3R4dDsKLQlpbnQgYXV0aGVudGljYXRlZCA9IDAsIHJlczsKLQl1X2ludCBpLCBucmVzcDsKLQljaGFyICoqcmVzcG9uc2UgPSBOVUxMLCAqbWV0aG9kOwotCi0JaWYgKGF1dGhjdHh0ID09IE5VTEwpCi0JCWZhdGFsKCJpbnB1dF91c2VyYXV0aF9pbmZvX3Jlc3BvbnNlOiBubyBhdXRoY3R4dCIpOwotCWtiZGludGN0eHQgPSBhdXRoY3R4dC0+a2JkaW50Y3R4dDsKLQlpZiAoa2JkaW50Y3R4dCA9PSBOVUxMIHx8IGtiZGludGN0eHQtPmN0eHQgPT0gTlVMTCkKLQkJZmF0YWwoImlucHV0X3VzZXJhdXRoX2luZm9fcmVzcG9uc2U6IG5vIGtiZGludGN0eHQiKTsKLQlpZiAoa2JkaW50Y3R4dC0+ZGV2aWNlID09IE5VTEwpCi0JCWZhdGFsKCJpbnB1dF91c2VyYXV0aF9pbmZvX3Jlc3BvbnNlOiBubyBkZXZpY2UiKTsKLQotCWF1dGhjdHh0LT5wb3N0cG9uZWQgPSAwOwkvKiByZXNldCAqLwotCW5yZXNwID0gcGFja2V0X2dldF9pbnQoKTsKLQlpZiAobnJlc3AgIT0ga2JkaW50Y3R4dC0+bnJlcSkKLQkJZmF0YWwoImlucHV0X3VzZXJhdXRoX2luZm9fcmVzcG9uc2U6IHdyb25nIG51bWJlciBvZiByZXBsaWVzIik7Ci0JaWYgKG5yZXNwID4gMTAwKQotCQlmYXRhbCgiaW5wdXRfdXNlcmF1dGhfaW5mb19yZXNwb25zZTogdG9vIG1hbnkgcmVwbGllcyIpOwotCWlmIChucmVzcCA+IDApIHsKLQkJcmVzcG9uc2UgPSB4Y2FsbG9jKG5yZXNwLCBzaXplb2YoY2hhciAqKSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBucmVzcDsgaSsrKQotCQkJcmVzcG9uc2VbaV0gPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQl9Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JcmVzID0ga2JkaW50Y3R4dC0+ZGV2aWNlLT5yZXNwb25kKGtiZGludGN0eHQtPmN0eHQsIG5yZXNwLCByZXNwb25zZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJlc3A7IGkrKykgewotCQltZW1zZXQocmVzcG9uc2VbaV0sICdyJywgc3RybGVuKHJlc3BvbnNlW2ldKSk7Ci0JCXhmcmVlKHJlc3BvbnNlW2ldKTsKLQl9Ci0JaWYgKHJlc3BvbnNlKQotCQl4ZnJlZShyZXNwb25zZSk7Ci0KLQlzd2l0Y2ggKHJlcykgewotCWNhc2UgMDoKLQkJLyogU3VjY2VzcyEgKi8KLQkJYXV0aGVudGljYXRlZCA9IGF1dGhjdHh0LT52YWxpZCA/IDEgOiAwOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCS8qIEF1dGhlbnRpY2F0aW9uIG5lZWRzIGZ1cnRoZXIgaW50ZXJhY3Rpb24gKi8KLQkJaWYgKHNlbmRfdXNlcmF1dGhfaW5mb19yZXF1ZXN0KGF1dGhjdHh0KSA9PSAxKQotCQkJYXV0aGN0eHQtPnBvc3Rwb25lZCA9IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIEZhaWx1cmUhICovCi0JCWJyZWFrOwotCX0KLQotCXhhc3ByaW50ZigmbWV0aG9kLCAia2V5Ym9hcmQtaW50ZXJhY3RpdmUvJXMiLCBrYmRpbnRjdHh0LT5kZXZpY2UtPm5hbWUpOwotCi0JaWYgKCFhdXRoY3R4dC0+cG9zdHBvbmVkKSB7Ci0JCWlmIChhdXRoZW50aWNhdGVkKSB7Ci0JCQlhdXRoMl9jaGFsbGVuZ2Vfc3RvcChhdXRoY3R4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBzdGFydCBuZXh0IGRldmljZSAqLwotCQkJLyogbWF5IHNldCBhdXRoY3R4dC0+cG9zdHBvbmVkICovCi0JCQlhdXRoMl9jaGFsbGVuZ2Vfc3RhcnQoYXV0aGN0eHQpOwotCQl9Ci0JfQotCXVzZXJhdXRoX2ZpbmlzaChhdXRoY3R4dCwgYXV0aGVudGljYXRlZCwgbWV0aG9kKTsKLQl4ZnJlZShtZXRob2QpOwotfQotCi12b2lkCi1wcml2c2VwX2NoYWxsZW5nZV9lbmFibGUodm9pZCkKLXsKLSNpZiBkZWZpbmVkKEJTRF9BVVRIKSB8fCBkZWZpbmVkKFVTRV9QQU0pIHx8IGRlZmluZWQoU0tFWSkKLQlpbnQgbiA9IDA7Ci0jZW5kaWYKLSNpZmRlZiBCU0RfQVVUSAotCWV4dGVybiBLYmRpbnREZXZpY2UgbW1fYnNkYXV0aF9kZXZpY2U7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfUEFNCi0JZXh0ZXJuIEtiZGludERldmljZSBtbV9zc2hwYW1fZGV2aWNlOwotI2VuZGlmCi0jaWZkZWYgU0tFWQotCWV4dGVybiBLYmRpbnREZXZpY2UgbW1fc2tleV9kZXZpY2U7Ci0jZW5kaWYKLQotI2lmZGVmIEJTRF9BVVRICi0JZGV2aWNlc1tuKytdID0gJm1tX2JzZGF1dGhfZGV2aWNlOwotI2Vsc2UKLSNpZmRlZiBVU0VfUEFNCi0JZGV2aWNlc1tuKytdID0gJm1tX3NzaHBhbV9kZXZpY2U7Ci0jZW5kaWYKLSNpZmRlZiBTS0VZCi0JZGV2aWNlc1tuKytdID0gJm1tX3NrZXlfZGV2aWNlOwotI2VuZGlmCi0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2F1dGgyLWdzcy5jIGIvYXV0aDItZ3NzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTliMjEuLjAwMDAwMDAKLS0tIGEvYXV0aDItZ3NzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGF1dGgyLWdzcy5jLHYgMS4xNyAyMDExLzAzLzEwIDAyOjUyOjU3IGRqbSBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgU2ltb24gV2lsa2luc29uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpZmRlZiBHU1NBUEkKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJhdXRoLmgiCi0jaW5jbHVkZSAic3NoMi5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImRpc3BhdGNoLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAic2VydmNvbmYuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJzc2gtZ3NzLmgiCi0jaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCi0KLWV4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7Ci0KLXN0YXRpYyB2b2lkIGlucHV0X2dzc2FwaV90b2tlbihpbnQgdHlwZSwgdV9pbnQzMl90IHBsZW4sIHZvaWQgKmN0eHQpOwotc3RhdGljIHZvaWQgaW5wdXRfZ3NzYXBpX21pYyhpbnQgdHlwZSwgdV9pbnQzMl90IHBsZW4sIHZvaWQgKmN0eHQpOwotc3RhdGljIHZvaWQgaW5wdXRfZ3NzYXBpX2V4Y2hhbmdlX2NvbXBsZXRlKGludCB0eXBlLCB1X2ludDMyX3QgcGxlbiwgdm9pZCAqY3R4dCk7Ci1zdGF0aWMgdm9pZCBpbnB1dF9nc3NhcGlfZXJydG9rKGludCwgdV9pbnQzMl90LCB2b2lkICopOwotCi0vKgotICogV2Ugb25seSBzdXBwb3J0IHRob3NlIG1lY2hhbmlzbXMgdGhhdCB3ZSBrbm93IGFib3V0IChpZSBvbmVzIHRoYXQgd2Uga25vdwotICogaG93IHRvIGNoZWNrIGxvY2FsIHVzZXIga3VzZXJvayBhbmQgdGhlIGxpa2UpCi0gKi8KLXN0YXRpYyBpbnQKLXVzZXJhdXRoX2dzc2FwaShBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0JZ3NzX09JRF9kZXNjIGdvaWQgPSB7MCwgTlVMTH07Ci0JR3NzY3R4dCAqY3R4dCA9IE5VTEw7Ci0JaW50IG1lY2hzOwotCWdzc19PSURfc2V0IHN1cHBvcnRlZDsKLQlpbnQgcHJlc2VudDsKLQlPTV91aW50MzIgbXM7Ci0JdV9pbnQgbGVuOwotCXVfY2hhciAqZG9pZCA9IE5VTEw7Ci0KLQlpZiAoIWF1dGhjdHh0LT52YWxpZCB8fCBhdXRoY3R4dC0+dXNlciA9PSBOVUxMKQotCQlyZXR1cm4gKDApOwotCi0JbWVjaHMgPSBwYWNrZXRfZ2V0X2ludCgpOwotCWlmIChtZWNocyA9PSAwKSB7Ci0JCWRlYnVnKCJNZWNoYW5pc20gbmVnb3RpYXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCXNzaF9nc3NhcGlfc3VwcG9ydGVkX29pZHMoJnN1cHBvcnRlZCk7Ci0JZG8gewotCQltZWNocy0tOwotCi0JCWlmIChkb2lkKQotCQkJeGZyZWUoZG9pZCk7Ci0KLQkJcHJlc2VudCA9IDA7Ci0JCWRvaWQgPSBwYWNrZXRfZ2V0X3N0cmluZygmbGVuKTsKLQotCQlpZiAobGVuID4gMiAmJiBkb2lkWzBdID09IFNTSF9HU1NfT0lEVFlQRSAmJgotCQkgICAgZG9pZFsxXSA9PSBsZW4gLSAyKSB7Ci0JCQlnb2lkLmVsZW1lbnRzID0gZG9pZCArIDI7Ci0JCQlnb2lkLmxlbmd0aCAgID0gbGVuIC0gMjsKLQkJCWdzc190ZXN0X29pZF9zZXRfbWVtYmVyKCZtcywgJmdvaWQsIHN1cHBvcnRlZCwKLQkJCSAgICAmcHJlc2VudCk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2dpdCgiQmFkbHkgZm9ybWVkIE9JRCByZWNlaXZlZCIpOwotCQl9Ci0JfSB3aGlsZSAobWVjaHMgPiAwICYmICFwcmVzZW50KTsKLQotCWdzc19yZWxlYXNlX29pZF9zZXQoJm1zLCAmc3VwcG9ydGVkKTsKLQotCWlmICghcHJlc2VudCkgewotCQl4ZnJlZShkb2lkKTsKLQkJYXV0aGN0eHQtPnNlcnZlcl9jYXVzZWRfZmFpbHVyZSA9IDE7Ci0JCXJldHVybiAoMCk7Ci0JfQotCi0JaWYgKEdTU19FUlJPUihQUklWU0VQKHNzaF9nc3NhcGlfc2VydmVyX2N0eCgmY3R4dCwgJmdvaWQpKSkpIHsKLQkJaWYgKGN0eHQgIT0gTlVMTCkKLQkJCXNzaF9nc3NhcGlfZGVsZXRlX2N0eCgmY3R4dCk7Ci0JCXhmcmVlKGRvaWQpOwotCQlhdXRoY3R4dC0+c2VydmVyX2NhdXNlZF9mYWlsdXJlID0gMTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0KLQlhdXRoY3R4dC0+bWV0aG9kZGF0YSA9ICh2b2lkICopY3R4dDsKLQotCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfUkVTUE9OU0UpOwotCi0JLyogUmV0dXJuIHRoZSBPSUQgdGhhdCB3ZSByZWNlaXZlZCAqLwotCXBhY2tldF9wdXRfc3RyaW5nKGRvaWQsIGxlbik7Ci0KLQlwYWNrZXRfc2VuZCgpOwotCXhmcmVlKGRvaWQpOwotCi0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9UT0tFTiwgJmlucHV0X2dzc2FwaV90b2tlbik7Ci0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9FUlJUT0ssICZpbnB1dF9nc3NhcGlfZXJydG9rKTsKLQlhdXRoY3R4dC0+cG9zdHBvbmVkID0gMTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnB1dF9nc3NhcGlfdG9rZW4oaW50IHR5cGUsIHVfaW50MzJfdCBwbGVuLCB2b2lkICpjdHh0KQotewotCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7Ci0JR3NzY3R4dCAqZ3NzY3R4dDsKLQlnc3NfYnVmZmVyX2Rlc2Mgc2VuZF90b2sgPSBHU1NfQ19FTVBUWV9CVUZGRVI7Ci0JZ3NzX2J1ZmZlcl9kZXNjIHJlY3ZfdG9rOwotCU9NX3VpbnQzMiBtYWpfc3RhdHVzLCBtaW5fc3RhdHVzLCBmbGFnczsKLQl1X2ludCBsZW47Ci0KLQlpZiAoYXV0aGN0eHQgPT0gTlVMTCB8fCAoYXV0aGN0eHQtPm1ldGhvZGRhdGEgPT0gTlVMTCAmJiAhdXNlX3ByaXZzZXApKQotCQlmYXRhbCgiTm8gYXV0aGVudGljYXRpb24gb3IgR1NTQVBJIGNvbnRleHQiKTsKLQotCWdzc2N0eHQgPSBhdXRoY3R4dC0+bWV0aG9kZGF0YTsKLQlyZWN2X3Rvay52YWx1ZSA9IHBhY2tldF9nZXRfc3RyaW5nKCZsZW4pOwotCXJlY3ZfdG9rLmxlbmd0aCA9IGxlbjsgLyogdV9pbnQgdnMuIHNpemVfdCAqLwotCi0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JbWFqX3N0YXR1cyA9IFBSSVZTRVAoc3NoX2dzc2FwaV9hY2NlcHRfY3R4KGdzc2N0eHQsICZyZWN2X3RvaywKLQkgICAgJnNlbmRfdG9rLCAmZmxhZ3MpKTsKLQotCXhmcmVlKHJlY3ZfdG9rLnZhbHVlKTsKLQotCWlmIChHU1NfRVJST1IobWFqX3N0YXR1cykpIHsKLQkJaWYgKHNlbmRfdG9rLmxlbmd0aCAhPSAwKSB7Ci0JCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX0VSUlRPSyk7Ci0JCQlwYWNrZXRfcHV0X3N0cmluZyhzZW5kX3Rvay52YWx1ZSwgc2VuZF90b2subGVuZ3RoKTsKLQkJCXBhY2tldF9zZW5kKCk7Ci0JCX0KLQkJYXV0aGN0eHQtPnBvc3Rwb25lZCA9IDA7Ci0JCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfVE9LRU4sIE5VTEwpOwotCQl1c2VyYXV0aF9maW5pc2goYXV0aGN0eHQsIDAsICJnc3NhcGktd2l0aC1taWMiKTsKLQl9IGVsc2UgewotCQlpZiAoc2VuZF90b2subGVuZ3RoICE9IDApIHsKLQkJCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfVE9LRU4pOwotCQkJcGFja2V0X3B1dF9zdHJpbmcoc2VuZF90b2sudmFsdWUsIHNlbmRfdG9rLmxlbmd0aCk7Ci0JCQlwYWNrZXRfc2VuZCgpOwotCQl9Ci0JCWlmIChtYWpfc3RhdHVzID09IEdTU19TX0NPTVBMRVRFKSB7Ci0JCQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX1RPS0VOLCBOVUxMKTsKLQkJCWlmIChmbGFncyAmIEdTU19DX0lOVEVHX0ZMQUcpCi0JCQkJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9NSUMsCi0JCQkJICAgICZpbnB1dF9nc3NhcGlfbWljKTsKLQkJCWVsc2UKLQkJCQlkaXNwYXRjaF9zZXQoCi0JCQkJICAgIFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9FWENIQU5HRV9DT01QTEVURSwKLQkJCQkgICAgJmlucHV0X2dzc2FwaV9leGNoYW5nZV9jb21wbGV0ZSk7Ci0JCX0KLQl9Ci0KLQlnc3NfcmVsZWFzZV9idWZmZXIoJm1pbl9zdGF0dXMsICZzZW5kX3Rvayk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnB1dF9nc3NhcGlfZXJydG9rKGludCB0eXBlLCB1X2ludDMyX3QgcGxlbiwgdm9pZCAqY3R4dCkKLXsKLQlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OwotCUdzc2N0eHQgKmdzc2N0eHQ7Ci0JZ3NzX2J1ZmZlcl9kZXNjIHNlbmRfdG9rID0gR1NTX0NfRU1QVFlfQlVGRkVSOwotCWdzc19idWZmZXJfZGVzYyByZWN2X3RvazsKLQlPTV91aW50MzIgbWFqX3N0YXR1czsKLQl1X2ludCBsZW47Ci0KLQlpZiAoYXV0aGN0eHQgPT0gTlVMTCB8fCAoYXV0aGN0eHQtPm1ldGhvZGRhdGEgPT0gTlVMTCAmJiAhdXNlX3ByaXZzZXApKQotCQlmYXRhbCgiTm8gYXV0aGVudGljYXRpb24gb3IgR1NTQVBJIGNvbnRleHQiKTsKLQotCWdzc2N0eHQgPSBhdXRoY3R4dC0+bWV0aG9kZGF0YTsKLQlyZWN2X3Rvay52YWx1ZSA9IHBhY2tldF9nZXRfc3RyaW5nKCZsZW4pOwotCXJlY3ZfdG9rLmxlbmd0aCA9IGxlbjsKLQotCXBhY2tldF9jaGVja19lb20oKTsKLQotCS8qIFB1c2ggdGhlIGVycm9yIHRva2VuIGludG8gR1NTQVBJIHRvIHNlZSB3aGF0IGl0IHNheXMgKi8KLQltYWpfc3RhdHVzID0gUFJJVlNFUChzc2hfZ3NzYXBpX2FjY2VwdF9jdHgoZ3NzY3R4dCwgJnJlY3ZfdG9rLAotCSAgICAmc2VuZF90b2ssIE5VTEwpKTsKLQotCXhmcmVlKHJlY3ZfdG9rLnZhbHVlKTsKLQotCS8qIFdlIGNhbid0IHJldHVybiBhbnl0aGluZyB0byB0aGUgY2xpZW50LCBldmVuIGlmIHdlIHdhbnRlZCB0byAqLwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfVE9LRU4sIE5VTEwpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfRVJSVE9LLCBOVUxMKTsKLQotCS8qIFRoZSBjbGllbnQgd2lsbCBoYXZlIGFscmVhZHkgbW92ZWQgb24gdG8gdGhlIG5leHQgYXV0aCAqLwotCi0JZ3NzX3JlbGVhc2VfYnVmZmVyKCZtYWpfc3RhdHVzLCAmc2VuZF90b2spOwotfQotCi0vKgotICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IHRoaW5rcyB3ZSd2ZSBjb21wbGV0ZWQgYXV0aGVudGljYXRpb24uCi0gKiBJdCBzaG91bGQgb25seSBiZSBlbmFibGVkIGluIHRoZSBkaXNwYXRjaCBoYW5kbGVyIGJ5IHRoZSBmdW5jdGlvbiBhYm92ZSwKLSAqIHdoaWNoIG9ubHkgZW5hYmxlcyBpdCBvbmNlIHRoZSBHU1NBUEkgZXhjaGFuZ2UgaXMgY29tcGxldGUuCi0gKi8KLQotc3RhdGljIHZvaWQKLWlucHV0X2dzc2FwaV9leGNoYW5nZV9jb21wbGV0ZShpbnQgdHlwZSwgdV9pbnQzMl90IHBsZW4sIHZvaWQgKmN0eHQpCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKLQlHc3NjdHh0ICpnc3NjdHh0OwotCWludCBhdXRoZW50aWNhdGVkOwotCi0JaWYgKGF1dGhjdHh0ID09IE5VTEwgfHwgKGF1dGhjdHh0LT5tZXRob2RkYXRhID09IE5VTEwgJiYgIXVzZV9wcml2c2VwKSkKLQkJZmF0YWwoIk5vIGF1dGhlbnRpY2F0aW9uIG9yIEdTU0FQSSBjb250ZXh0Iik7Ci0KLQlnc3NjdHh0ID0gYXV0aGN0eHQtPm1ldGhvZGRhdGE7Ci0KLQkvKgotCSAqIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIHN0YXR1cywgYmVjYXVzZSB3ZSdyZSBvbmx5IGVuYWJsZWQgaW4KLQkgKiB0aGUgZGlzcGF0Y2hlciBvbmNlIHRoZSBleGNoYW5nZSBpcyBjb21wbGV0ZQotCSAqLwotCi0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JYXV0aGVudGljYXRlZCA9IFBSSVZTRVAoc3NoX2dzc2FwaV91c2Vyb2soYXV0aGN0eHQtPnVzZXIpKTsKLQotCWF1dGhjdHh0LT5wb3N0cG9uZWQgPSAwOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfVE9LRU4sIE5VTEwpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfRVJSVE9LLCBOVUxMKTsKLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX01JQywgTlVMTCk7Ci0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9FWENIQU5HRV9DT01QTEVURSwgTlVMTCk7Ci0JdXNlcmF1dGhfZmluaXNoKGF1dGhjdHh0LCBhdXRoZW50aWNhdGVkLCAiZ3NzYXBpLXdpdGgtbWljIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnB1dF9nc3NhcGlfbWljKGludCB0eXBlLCB1X2ludDMyX3QgcGxlbiwgdm9pZCAqY3R4dCkKLXsKLQlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OwotCUdzc2N0eHQgKmdzc2N0eHQ7Ci0JaW50IGF1dGhlbnRpY2F0ZWQgPSAwOwotCUJ1ZmZlciBiOwotCWdzc19idWZmZXJfZGVzYyBtaWMsIGdzc2J1ZjsKLQl1X2ludCBsZW47Ci0KLQlpZiAoYXV0aGN0eHQgPT0gTlVMTCB8fCAoYXV0aGN0eHQtPm1ldGhvZGRhdGEgPT0gTlVMTCAmJiAhdXNlX3ByaXZzZXApKQotCQlmYXRhbCgiTm8gYXV0aGVudGljYXRpb24gb3IgR1NTQVBJIGNvbnRleHQiKTsKLQotCWdzc2N0eHQgPSBhdXRoY3R4dC0+bWV0aG9kZGF0YTsKLQotCW1pYy52YWx1ZSA9IHBhY2tldF9nZXRfc3RyaW5nKCZsZW4pOwotCW1pYy5sZW5ndGggPSBsZW47Ci0KLQlzc2hfZ3NzYXBpX2J1aWxkbWljKCZiLCBhdXRoY3R4dC0+dXNlciwgYXV0aGN0eHQtPnNlcnZpY2UsCi0JICAgICJnc3NhcGktd2l0aC1taWMiKTsKLQotCWdzc2J1Zi52YWx1ZSA9IGJ1ZmZlcl9wdHIoJmIpOwotCWdzc2J1Zi5sZW5ndGggPSBidWZmZXJfbGVuKCZiKTsKLQotCWlmICghR1NTX0VSUk9SKFBSSVZTRVAoc3NoX2dzc2FwaV9jaGVja21pYyhnc3NjdHh0LCAmZ3NzYnVmLCAmbWljKSkpKQotCQlhdXRoZW50aWNhdGVkID0gUFJJVlNFUChzc2hfZ3NzYXBpX3VzZXJvayhhdXRoY3R4dC0+dXNlcikpOwotCWVsc2UKLQkJbG9naXQoIkdTU0FQSSBNSUMgY2hlY2sgZmFpbGVkIik7Ci0KLQlidWZmZXJfZnJlZSgmYik7Ci0JeGZyZWUobWljLnZhbHVlKTsKLQotCWF1dGhjdHh0LT5wb3N0cG9uZWQgPSAwOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfVE9LRU4sIE5VTEwpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfRVJSVE9LLCBOVUxMKTsKLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX01JQywgTlVMTCk7Ci0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9FWENIQU5HRV9DT01QTEVURSwgTlVMTCk7Ci0JdXNlcmF1dGhfZmluaXNoKGF1dGhjdHh0LCBhdXRoZW50aWNhdGVkLCAiZ3NzYXBpLXdpdGgtbWljIik7Ci19Ci0KLUF1dGhtZXRob2QgbWV0aG9kX2dzc2FwaSA9IHsKLQkiZ3NzYXBpLXdpdGgtbWljIiwKLQl1c2VyYXV0aF9nc3NhcGksCi0JJm9wdGlvbnMuZ3NzX2F1dGhlbnRpY2F0aW9uCi19OwotCi0jZW5kaWYgLyogR1NTQVBJICovCmRpZmYgLS1naXQgYS9hdXRoMi1ob3N0YmFzZWQuYyBiL2F1dGgyLWhvc3RiYXNlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGY0NDJmLi4wMDAwMDAwCi0tLSBhL2F1dGgyLWhvc3RiYXNlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qICRPcGVuQlNEOiBhdXRoMi1ob3N0YmFzZWQuYyx2IDEuMTQgMjAxMC8wOC8wNCAwNTo0Mjo0NyBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAic2VydmNvbmYuaCIKLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotI2luY2x1ZGUgImF1dGguaCIKLSNpbmNsdWRlICJjYW5vaG9zdC5oIgotI2lmZGVmIEdTU0FQSQotI2luY2x1ZGUgInNzaC1nc3MuaCIKLSNlbmRpZgotI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotCi0vKiBpbXBvcnQgKi8KLWV4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7Ci1leHRlcm4gdV9jaGFyICpzZXNzaW9uX2lkMjsKLWV4dGVybiB1X2ludCBzZXNzaW9uX2lkMl9sZW47Ci0KLXN0YXRpYyBpbnQKLXVzZXJhdXRoX2hvc3RiYXNlZChBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0JQnVmZmVyIGI7Ci0JS2V5ICprZXkgPSBOVUxMOwotCWNoYXIgKnBrYWxnLCAqY3VzZXIsICpjaG9zdCwgKnNlcnZpY2U7Ci0JdV9jaGFyICpwa2Jsb2IsICpzaWc7Ci0JdV9pbnQgYWxlbiwgYmxlbiwgc2xlbjsKLQlpbnQgcGt0eXBlOwotCWludCBhdXRoZW50aWNhdGVkID0gMDsKLQotCWlmICghYXV0aGN0eHQtPnZhbGlkKSB7Ci0JCWRlYnVnMigidXNlcmF1dGhfaG9zdGJhc2VkOiBkaXNhYmxlZCBiZWNhdXNlIG9mIGludmFsaWQgdXNlciIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcGthbGcgPSBwYWNrZXRfZ2V0X3N0cmluZygmYWxlbik7Ci0JcGtibG9iID0gcGFja2V0X2dldF9zdHJpbmcoJmJsZW4pOwotCWNob3N0ID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JY3VzZXIgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQlzaWcgPSBwYWNrZXRfZ2V0X3N0cmluZygmc2xlbik7Ci0KLQlkZWJ1ZygidXNlcmF1dGhfaG9zdGJhc2VkOiBjdXNlciAlcyBjaG9zdCAlcyBwa2FsZyAlcyBzbGVuICVkIiwKLQkgICAgY3VzZXIsIGNob3N0LCBwa2FsZywgc2xlbik7Ci0jaWZkZWYgREVCVUdfUEsKLQlkZWJ1Zygic2lnbmF0dXJlOiIpOwotCWJ1ZmZlcl9pbml0KCZiKTsKLQlidWZmZXJfYXBwZW5kKCZiLCBzaWcsIHNsZW4pOwotCWJ1ZmZlcl9kdW1wKCZiKTsKLQlidWZmZXJfZnJlZSgmYik7Ci0jZW5kaWYKLQlwa3R5cGUgPSBrZXlfdHlwZV9mcm9tX25hbWUocGthbGcpOwotCWlmIChwa3R5cGUgPT0gS0VZX1VOU1BFQykgewotCQkvKiB0aGlzIGlzIHBlcmZlY3RseSBsZWdhbCAqLwotCQlsb2dpdCgidXNlcmF1dGhfaG9zdGJhc2VkOiB1bnN1cHBvcnRlZCAiCi0JCSAgICAicHVibGljIGtleSBhbGdvcml0aG06ICVzIiwgcGthbGcpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWtleSA9IGtleV9mcm9tX2Jsb2IocGtibG9iLCBibGVuKTsKLQlpZiAoa2V5ID09IE5VTEwpIHsKLQkJZXJyb3IoInVzZXJhdXRoX2hvc3RiYXNlZDogY2Fubm90IGRlY29kZSBrZXk6ICVzIiwgcGthbGcpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChrZXktPnR5cGUgIT0gcGt0eXBlKSB7Ci0JCWVycm9yKCJ1c2VyYXV0aF9ob3N0YmFzZWQ6IHR5cGUgbWlzbWF0Y2ggZm9yIGRlY29kZWQga2V5ICIKLQkJICAgICIocmVjZWl2ZWQgJWQsIGV4cGVjdGVkICVkKSIsIGtleS0+dHlwZSwgcGt0eXBlKTsKLQkJZ290byBkb25lOwotCX0KLQlzZXJ2aWNlID0gZGF0YWZlbGxvd3MgJiBTU0hfQlVHX0hCU0VSVklDRSA/ICJzc2gtdXNlcmF1dGgiIDoKLQkgICAgYXV0aGN0eHQtPnNlcnZpY2U7Ci0JYnVmZmVyX2luaXQoJmIpOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBzZXNzaW9uX2lkMiwgc2Vzc2lvbl9pZDJfbGVuKTsKLQkvKiByZWNvbnN0cnVjdCBwYWNrZXQgKi8KLQlidWZmZXJfcHV0X2NoYXIoJmIsIFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgYXV0aGN0eHQtPnVzZXIpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgc2VydmljZSk7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCAiaG9zdGJhc2VkIik7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJmIsIHBrYWxnLCBhbGVuKTsKLQlidWZmZXJfcHV0X3N0cmluZygmYiwgcGtibG9iLCBibGVuKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGNob3N0KTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGN1c2VyKTsKLSNpZmRlZiBERUJVR19QSwotCWJ1ZmZlcl9kdW1wKCZiKTsKLSNlbmRpZgotCS8qIHRlc3QgZm9yIGFsbG93ZWQga2V5IGFuZCBjb3JyZWN0IHNpZ25hdHVyZSAqLwotCWF1dGhlbnRpY2F0ZWQgPSAwOwotCWlmIChQUklWU0VQKGhvc3RiYXNlZF9rZXlfYWxsb3dlZChhdXRoY3R4dC0+cHcsIGN1c2VyLCBjaG9zdCwga2V5KSkgJiYKLQkgICAgUFJJVlNFUChrZXlfdmVyaWZ5KGtleSwgc2lnLCBzbGVuLCBidWZmZXJfcHRyKCZiKSwKLQkJCWJ1ZmZlcl9sZW4oJmIpKSkgPT0gMSkKLQkJYXV0aGVudGljYXRlZCA9IDE7Ci0KLQlidWZmZXJfZnJlZSgmYik7Ci1kb25lOgotCWRlYnVnMigidXNlcmF1dGhfaG9zdGJhc2VkOiBhdXRoZW50aWNhdGVkICVkIiwgYXV0aGVudGljYXRlZCk7Ci0JaWYgKGtleSAhPSBOVUxMKQotCQlrZXlfZnJlZShrZXkpOwotCXhmcmVlKHBrYWxnKTsKLQl4ZnJlZShwa2Jsb2IpOwotCXhmcmVlKGN1c2VyKTsKLQl4ZnJlZShjaG9zdCk7Ci0JeGZyZWUoc2lnKTsKLQlyZXR1cm4gYXV0aGVudGljYXRlZDsKLX0KLQotLyogcmV0dXJuIDEgaWYgZ2l2ZW4gaG9zdGtleSBpcyBhbGxvd2VkICovCi1pbnQKLWhvc3RiYXNlZF9rZXlfYWxsb3dlZChzdHJ1Y3QgcGFzc3dkICpwdywgY29uc3QgY2hhciAqY3VzZXIsIGNoYXIgKmNob3N0LAotICAgIEtleSAqa2V5KQotewotCWNvbnN0IGNoYXIgKnJlc29sdmVkbmFtZSwgKmlwYWRkciwgKmxvb2t1cCwgKnJlYXNvbjsKLQlIb3N0U3RhdHVzIGhvc3Rfc3RhdHVzOwotCWludCBsZW47Ci0JY2hhciAqZnA7Ci0KLQlpZiAoYXV0aF9rZXlfaXNfcmV2b2tlZChrZXkpKQotCQlyZXR1cm4gMDsKLQotCXJlc29sdmVkbmFtZSA9IGdldF9jYW5vbmljYWxfaG9zdG5hbWUob3B0aW9ucy51c2VfZG5zKTsKLQlpcGFkZHIgPSBnZXRfcmVtb3RlX2lwYWRkcigpOwotCi0JZGVidWcyKCJ1c2VyYXV0aF9ob3N0YmFzZWQ6IGNob3N0ICVzIHJlc29sdmVkbmFtZSAlcyBpcGFkZHIgJXMiLAotCSAgICBjaG9zdCwgcmVzb2x2ZWRuYW1lLCBpcGFkZHIpOwotCi0JaWYgKCgobGVuID0gc3RybGVuKGNob3N0KSkgPiAwKSAmJiBjaG9zdFtsZW4gLSAxXSA9PSAnLicpIHsKLQkJZGVidWcyKCJzdHJpcHBpbmcgdHJhaWxpbmcgZG90IGZyb20gY2hvc3QgJXMiLCBjaG9zdCk7Ci0JCWNob3N0W2xlbiAtIDFdID0gJ1wwJzsKLQl9Ci0KLQlpZiAob3B0aW9ucy5ob3N0YmFzZWRfdXNlc19uYW1lX2Zyb21fcGFja2V0X29ubHkpIHsKLQkJaWYgKGF1dGhfcmhvc3RzMihwdywgY3VzZXIsIGNob3N0LCBjaG9zdCkgPT0gMCkKLQkJCXJldHVybiAwOwotCQlsb29rdXAgPSBjaG9zdDsKLQl9IGVsc2UgewotCQlpZiAoc3RyY2FzZWNtcChyZXNvbHZlZG5hbWUsIGNob3N0KSAhPSAwKQotCQkJbG9naXQoInVzZXJhdXRoX2hvc3RiYXNlZCBtaXNtYXRjaDogIgotCQkJICAgICJjbGllbnQgc2VuZHMgJXMsIGJ1dCB3ZSByZXNvbHZlICVzIHRvICVzIiwKLQkJCSAgICBjaG9zdCwgaXBhZGRyLCByZXNvbHZlZG5hbWUpOwotCQlpZiAoYXV0aF9yaG9zdHMyKHB3LCBjdXNlciwgcmVzb2x2ZWRuYW1lLCBpcGFkZHIpID09IDApCi0JCQlyZXR1cm4gMDsKLQkJbG9va3VwID0gcmVzb2x2ZWRuYW1lOwotCX0KLQlkZWJ1ZzIoInVzZXJhdXRoX2hvc3RiYXNlZDogYWNjZXNzIGFsbG93ZWQgYnkgYXV0aF9yaG9zdHMyIik7Ci0KLQlpZiAoa2V5X2lzX2NlcnQoa2V5KSAmJiAKLQkgICAga2V5X2NlcnRfY2hlY2tfYXV0aG9yaXR5KGtleSwgMSwgMCwgbG9va3VwLCAmcmVhc29uKSkgewotCQllcnJvcigiJXMiLCByZWFzb24pOwotCQlhdXRoX2RlYnVnX2FkZCgiJXMiLCByZWFzb24pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlob3N0X3N0YXR1cyA9IGNoZWNrX2tleV9pbl9ob3N0ZmlsZXMocHcsIGtleSwgbG9va3VwLAotCSAgICBfUEFUSF9TU0hfU1lTVEVNX0hPU1RGSUxFLAotCSAgICBvcHRpb25zLmlnbm9yZV91c2VyX2tub3duX2hvc3RzID8gTlVMTCA6IF9QQVRIX1NTSF9VU0VSX0hPU1RGSUxFKTsKLQotCS8qIGJhY2t3YXJkIGNvbXBhdCBpZiBubyBrZXkgaGFzIGJlZW4gZm91bmQuICovCi0JaWYgKGhvc3Rfc3RhdHVzID09IEhPU1RfTkVXKSB7Ci0JCWhvc3Rfc3RhdHVzID0gY2hlY2tfa2V5X2luX2hvc3RmaWxlcyhwdywga2V5LCBsb29rdXAsCi0JCSAgICBfUEFUSF9TU0hfU1lTVEVNX0hPU1RGSUxFMiwKLQkJICAgIG9wdGlvbnMuaWdub3JlX3VzZXJfa25vd25faG9zdHMgPyBOVUxMIDoKLQkJICAgIF9QQVRIX1NTSF9VU0VSX0hPU1RGSUxFMik7Ci0JfQotCi0JaWYgKGhvc3Rfc3RhdHVzID09IEhPU1RfT0spIHsKLQkJaWYgKGtleV9pc19jZXJ0KGtleSkpIHsKLQkJCWZwID0ga2V5X2ZpbmdlcnByaW50KGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleSwKLQkJCSAgICBTU0hfRlBfTUQ1LCBTU0hfRlBfSEVYKTsKLQkJCXZlcmJvc2UoIkFjY2VwdGVkIGNlcnRpZmljYXRlIElEIFwiJXNcIiBzaWduZWQgYnkgIgotCQkJICAgICIlcyBDQSAlcyBmcm9tICVzQCVzIiwga2V5LT5jZXJ0LT5rZXlfaWQsCi0JCQkgICAga2V5X3R5cGUoa2V5LT5jZXJ0LT5zaWduYXR1cmVfa2V5KSwgZnAsCi0JCQkgICAgY3VzZXIsIGxvb2t1cCk7Ci0JCX0gZWxzZSB7Ci0JCQlmcCA9IGtleV9maW5nZXJwcmludChrZXksIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOwotCQkJdmVyYm9zZSgiQWNjZXB0ZWQgJXMgcHVibGljIGtleSAlcyBmcm9tICVzQCVzIiwKLQkJCSAgICBrZXlfdHlwZShrZXkpLCBmcCwgY3VzZXIsIGxvb2t1cCk7Ci0JCX0KLQkJeGZyZWUoZnApOwotCX0KLQotCXJldHVybiAoaG9zdF9zdGF0dXMgPT0gSE9TVF9PSyk7Ci19Ci0KLUF1dGhtZXRob2QgbWV0aG9kX2hvc3RiYXNlZCA9IHsKLQkiaG9zdGJhc2VkIiwKLQl1c2VyYXV0aF9ob3N0YmFzZWQsCi0JJm9wdGlvbnMuaG9zdGJhc2VkX2F1dGhlbnRpY2F0aW9uCi19OwpkaWZmIC0tZ2l0IGEvYXV0aDItanBha2UuYyBiL2F1dGgyLWpwYWtlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NjBlODIuLjAwMDAwMDAKLS0tIGEvYXV0aDItanBha2UuYworKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vKiAkT3BlbkJTRDogYXV0aDItanBha2UuYyx2IDEuNCAyMDEwLzA4LzMxIDExOjU0OjQ1IGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0vKgotICogU2VydmVyIHNpZGUgb2YgemVyby1rbm93bGVkZ2UgcGFzc3dvcmQgYXV0aCB1c2luZyBKLVBBS0UgcHJvdG9jb2wKLSAqIGFzIGRlc2NyaWJlZCBpbjoKLSAqCi0gKiBGLiBIYW8sIFAuIFJ5YW4sICJQYXNzd29yZCBBdXRoZW50aWNhdGVkIEtleSBFeGNoYW5nZSBieSBKdWdnbGluZyIsCi0gKiAxNnRoIFdvcmtzaG9wIG9uIFNlY3VyaXR5IFByb3RvY29scywgQ2FtYnJpZGdlLCBBcHJpbCAyMDA4Ci0gKgotICogaHR0cDovL2dyb3VwZXIuaWVlZS5vcmcvZ3JvdXBzLzEzNjMvUmVzZWFyY2gvY29udHJpYnV0aW9ucy9oYW8tcnlhbi0yMDA4LnBkZgotICovCi0KLSNpZmRlZiBKUEFLRQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGxvZ2luX2NhcC5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAic3NoMi5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgInBhY2tldC5oIgotI2luY2x1ZGUgImRpc3BhdGNoLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAic2VydmNvbmYuaCIKLSNpbmNsdWRlICJhdXRoLW9wdGlvbnMuaCIKLSNpbmNsdWRlICJjYW5vaG9zdC5oIgotI2lmZGVmIEdTU0FQSQotI2luY2x1ZGUgInNzaC1nc3MuaCIKLSNlbmRpZgotI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgotCi0jaW5jbHVkZSAic2Nobm9yci5oIgotI2luY2x1ZGUgImpwYWtlLmgiCi0KLS8qCi0gKiBYWFggb3B0aW9ucy0+cGVybWl0X2VtcHR5X3Bhc3N3ZCAoYXQgdGhlIG1vbWVudCwgdGhleSB3aWxsIGJlIHJlZnVzZWQKLSAqIGFueXdheSBiZWNhdXNlIHRoZXkgd2lsbCBtaXNtYXRjaCBvbiBmYWtlIHNhbHQuCi0gKi8KLQotLyogRGlzcGF0Y2ggaGFuZGxlcnMgKi8KLXN0YXRpYyB2b2lkIGlucHV0X3VzZXJhdXRoX2pwYWtlX2NsaWVudF9zdGVwMShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKLXN0YXRpYyB2b2lkIGlucHV0X3VzZXJhdXRoX2pwYWtlX2NsaWVudF9zdGVwMihpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKLXN0YXRpYyB2b2lkIGlucHV0X3VzZXJhdXRoX2pwYWtlX2NsaWVudF9jb25maXJtKGludCwgdV9pbnQzMl90LCB2b2lkICopOwotCi1zdGF0aWMgaW50IGF1dGgyX2pwYWtlX3N0YXJ0KEF1dGhjdHh0ICopOwotCi0vKiBpbXBvcnQgKi8KLWV4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7Ci1leHRlcm4gdV9jaGFyICpzZXNzaW9uX2lkMjsKLWV4dGVybiB1X2ludCBzZXNzaW9uX2lkMl9sZW47Ci0KLS8qCi0gKiBBdHRlbXB0IEotUEFLRSBhdXRoZW50aWNhdGlvbi4KLSAqLwotc3RhdGljIGludAotdXNlcmF1dGhfanBha2UoQXV0aGN0eHQgKmF1dGhjdHh0KQotewotCWludCBhdXRoZW50aWNhdGVkID0gMDsKLQotCXBhY2tldF9jaGVja19lb20oKTsKLQotCWRlYnVnKCJqcGFrZS0wMUBvcGVuc3NoLmNvbSByZXF1ZXN0ZWQiKTsKLQotCWlmIChhdXRoY3R4dC0+dXNlciAhPSBOVUxMKSB7Ci0JCWlmIChhdXRoY3R4dC0+anBha2VfY3R4ID09IE5VTEwpCi0JCQlhdXRoY3R4dC0+anBha2VfY3R4ID0ganBha2VfbmV3KCk7Ci0JCWlmIChvcHRpb25zLnplcm9fa25vd2xlZGdlX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uKQotCQkJYXV0aGVudGljYXRlZCA9IGF1dGgyX2pwYWtlX3N0YXJ0KGF1dGhjdHh0KTsKLQl9Ci0KLQlyZXR1cm4gYXV0aGVudGljYXRlZDsKLX0KLQotQXV0aG1ldGhvZCBtZXRob2RfanBha2UgPSB7Ci0JImpwYWtlLTAxQG9wZW5zc2guY29tIiwKLQl1c2VyYXV0aF9qcGFrZSwKLQkmb3B0aW9ucy56ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbgotfTsKLQotLyogQ2xlYXIgY29udGV4dCBhbmQgY2FsbGJhY2tzICovCi12b2lkCi1hdXRoMl9qcGFrZV9zdG9wKEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQkvKiB1bnJlZ2lzdGVyIGNhbGxiYWNrcyAqLwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfU1RFUDEsIE5VTEwpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfU1RFUDIsIE5VTEwpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfQ09ORklSTSwgTlVMTCk7Ci0JaWYgKGF1dGhjdHh0LT5qcGFrZV9jdHggIT0gTlVMTCkgewotCQlqcGFrZV9mcmVlKGF1dGhjdHh0LT5qcGFrZV9jdHgpOwotCQlhdXRoY3R4dC0+anBha2VfY3R4ID0gTlVMTDsKLQl9Ci19Ci0KLS8qIFJldHVybnMgMSBpZiAnYycgaXMgYSB2YWxpZCBjcnlwdCgzKSBzYWx0IGNoYXJhY3RlciwgMCBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbnQKLXZhbGlkX2NyeXB0X3NhbHQoaW50IGMpCi17Ci0JaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQotCQlyZXR1cm4gMTsKLQlpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCi0JCXJldHVybiAxOwotCWlmIChjID49ICcuJyAmJiBjIDw9ICc5JykKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBEZXJpdmUgZmFrZSBzYWx0IGFzIEgodXNlcm5hbWUgfHwgZmlyc3RfcHJpdmF0ZV9ob3N0X2tleSkKLSAqIFRoaXMgcHJvdmlkZXMgcmVsYXRpdmVseSBzdGFibGUgZmFrZSBzYWx0cyBmb3Igbm9uLWV4aXN0ZW50Ci0gKiB1c2VycyBhbmQgYXZvaWRzIHRoZSBqcGFrZSBtZXRob2QgYmVjb21pbmcgYW4gYWNjb3VudCB2YWxpZGl0eQotICogb3JhY2xlLgotICovCi1zdGF0aWMgdm9pZAotZGVyaXZlX3Jhd3NhbHQoY29uc3QgY2hhciAqdXNlcm5hbWUsIHVfY2hhciAqcmF3c2FsdCwgdV9pbnQgbGVuKQotewotCXVfY2hhciAqZGlnZXN0OwotCXVfaW50IGRpZ2VzdF9sZW47Ci0JQnVmZmVyIGI7Ci0JS2V5ICprOwotCi0JYnVmZmVyX2luaXQoJmIpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgdXNlcm5hbWUpOwotCWlmICgoayA9IGdldF9ob3N0a2V5X2J5X2luZGV4KDApKSA9PSBOVUxMIHx8Ci0JICAgIChrLT5mbGFncyAmIEtFWV9GTEFHX0VYVCkpCi0JCWZhdGFsKCIlczogbm8gaG9zdGtleXMiLCBfX2Z1bmNfXyk7Ci0Jc3dpdGNoIChrLT50eXBlKSB7Ci0JY2FzZSBLRVlfUlNBMToKLQljYXNlIEtFWV9SU0E6Ci0JCWlmIChrLT5yc2EtPnAgPT0gTlVMTCB8fCBrLT5yc2EtPnEgPT0gTlVMTCkKLQkJCWZhdGFsKCIlczogUlNBIGtleSBtaXNzaW5nIHAgYW5kL29yIHEiLCBfX2Z1bmNfXyk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgay0+cnNhLT5wKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBrLT5yc2EtPnEpOwotCQlicmVhazsKLQljYXNlIEtFWV9EU0E6Ci0JCWlmIChrLT5kc2EtPnByaXZfa2V5ID09IE5VTEwpCi0JCQlmYXRhbCgiJXM6IERTQSBrZXkgbWlzc2luZyBwcml2X2tleSIsIF9fZnVuY19fKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBrLT5kc2EtPnByaXZfa2V5KTsKLQkJYnJlYWs7Ci0JY2FzZSBLRVlfRUNEU0E6Ci0JCWlmIChFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShrLT5lY2RzYSkgPT0gTlVMTCkKLQkJCWZhdGFsKCIlczogRUNEU0Ega2V5IG1pc3NpbmcgcHJpdl9rZXkiLCBfX2Z1bmNfXyk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkoay0+ZWNkc2EpKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmF0YWwoIiVzOiB1bmtub3duIGtleSB0eXBlICVkIiwgX19mdW5jX18sIGstPnR5cGUpOwotCX0KLQlpZiAoaGFzaF9idWZmZXIoYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpLCBFVlBfc2hhMjU2KCksCi0JICAgICZkaWdlc3QsICZkaWdlc3RfbGVuKSAhPSAwKQotCQlmYXRhbCgiJXM6IGhhc2hfYnVmZmVyIiwgX19mdW5jX18pOwotCWJ1ZmZlcl9mcmVlKCZiKTsKLQlpZiAobGVuID4gZGlnZXN0X2xlbikKLQkJZmF0YWwoIiVzOiBub3QgZW5vdWdoIGJ5dGVzIGZvciByYXdzYWx0ICh3YW50ICV1IGhhdmUgJXUpIiwKLQkJICAgIF9fZnVuY19fLCBsZW4sIGRpZ2VzdF9sZW4pOwotCW1lbWNweShyYXdzYWx0LCBkaWdlc3QsIGxlbik7Ci0JYnplcm8oZGlnZXN0LCBkaWdlc3RfbGVuKTsKLQl4ZnJlZShkaWdlc3QpOwotfQotCi0vKiBBU0NJSSBhbiBpbnRlZ2VyIFswLCA2NCkgZm9yIGluY2x1c2lvbiBpbiBhIHBhc3N3b3JkL3NhbHQgKi8KLXN0YXRpYyBjaGFyCi1wd19lbmNvZGU2NCh1X2ludCBpNjQpCi17Ci0JY29uc3QgdV9jaGFyIGU2NFtdID0KLQkgICAgIi4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOwotCXJldHVybiBlNjRbaTY0ICUgNjRdOwotfQotCi0vKiBHZW5lcmF0ZSBBU0NJSSBzYWx0IGJ5dGVzIGZvciB1c2VyICovCi1zdGF0aWMgY2hhciAqCi1tYWtlc2FsdCh1X2ludCB3YW50LCBjb25zdCBjaGFyICp1c2VyKQotewotCXVfY2hhciByYXdzYWx0WzMyXTsKLQlzdGF0aWMgY2hhciByZXRbMzNdOwotCXVfaW50IGk7Ci0KLQlpZiAod2FudCA+IHNpemVvZihyZXQpIC0gMSkKLQkJZmF0YWwoIiVzOiB3YW50ICV1IiwgX19mdW5jX18sIHdhbnQpOwotCi0JZGVyaXZlX3Jhd3NhbHQodXNlciwgcmF3c2FsdCwgc2l6ZW9mKHJhd3NhbHQpKTsKLQliemVybyhyZXQsIHNpemVvZihyZXQpKTsKLQlmb3IgKGkgPSAwOyBpIDwgd2FudDsgaSsrKQotCQlyZXRbaV0gPSBwd19lbmNvZGU2NChyYXdzYWx0W2ldKTsKLQliemVybyhyYXdzYWx0LCBzaXplb2YocmF3c2FsdCkpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIFNlbGVjdCB0aGUgc3lzdGVtJ3MgZGVmYXVsdCBwYXNzd29yZCBoYXNoaW5nIHNjaGVtZSBhbmQgZ2VuZXJhdGUKLSAqIGEgc3RhYmxlIGZha2Ugc2FsdCB1bmRlciBpdCBmb3IgdXNlIGJ5IGEgbm9uLWV4aXN0ZW50IGFjY291bnQuCi0gKiBQcmV2ZW50cyBqcGFrZSBtZXRob2QgYmVpbmcgdXNlZCB0byBpbmZlciB0aGUgdmFsaWRpdHkgb2YgYWNjb3VudHMuCi0gKi8KLXN0YXRpYyB2b2lkCi1mYWtlX3NhbHRfYW5kX3NjaGVtZShBdXRoY3R4dCAqYXV0aGN0eHQsIGNoYXIgKipzYWx0LCBjaGFyICoqc2NoZW1lKQotewotCWNoYXIgKnJvdW5kc19zLCAqc3R5bGU7Ci0JbG9uZyBsb25nIHJvdW5kczsKLQlsb2dpbl9jYXBfdCAqbGM7Ci0KLQotCWlmICgobGMgPSBsb2dpbl9nZXRjbGFzcyhhdXRoY3R4dC0+cHctPnB3X2NsYXNzKSkgPT0gTlVMTCAmJgotCSAgICAobGMgPSBsb2dpbl9nZXRjbGFzcyhOVUxMKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBsb2dpbl9nZXRjbGFzcyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0Jc3R5bGUgPSBsb2dpbl9nZXRjYXBzdHIobGMsICJsb2NhbGNpcGhlciIsIE5VTEwsIE5VTEwpOwotCWlmIChzdHlsZSA9PSBOVUxMKQotCQlzdHlsZSA9IHhzdHJkdXAoImJsb3dmaXNoLDYiKTsKLQlsb2dpbl9jbG9zZShsYyk7Ci0JCi0JaWYgKChyb3VuZHNfcyA9IHN0cmNocihzdHlsZSwgJywnKSkgIT0gTlVMTCkKLQkJKnJvdW5kc19zKysgPSAnXDAnOwotCXJvdW5kcyA9IHN0cnRvbnVtKHJvdW5kc19zLCAxLCAxPDwzMSwgTlVMTCk7Ci0JCi0JaWYgKHN0cmNtcChzdHlsZSwgIm1kNSIpID09IDApIHsKLQkJeGFzcHJpbnRmKHNhbHQsICIkMSQlcyQiLCBtYWtlc2FsdCg4LCBhdXRoY3R4dC0+dXNlcikpOwotCQkqc2NoZW1lID0geHN0cmR1cCgibWQ1Iik7Ci0JfSBlbHNlIGlmIChzdHJjbXAoc3R5bGUsICJvbGQiKSA9PSAwKSB7Ci0JCSpzYWx0ID0geHN0cmR1cChtYWtlc2FsdCgyLCBhdXRoY3R4dC0+dXNlcikpOwotCQkqc2NoZW1lID0geHN0cmR1cCgiY3J5cHQiKTsKLQl9IGVsc2UgaWYgKHN0cmNtcChzdHlsZSwgIm5ld3NhbHQiKSA9PSAwKSB7Ci0JCXJvdW5kcyA9IE1BWChyb3VuZHMsIDcyNTApOwotCQlyb3VuZHMgPSBNSU4ocm91bmRzLCAoMTw8MjQpIC0gMSk7Ci0JCXhhc3ByaW50ZihzYWx0LCAiXyVjJWMlYyVjJXMiLAotCQkgICAgcHdfZW5jb2RlNjQocm91bmRzKSwgcHdfZW5jb2RlNjQocm91bmRzID4+IDYpLAotCQkgICAgcHdfZW5jb2RlNjQocm91bmRzID4+IDEyKSwgcHdfZW5jb2RlNjQocm91bmRzID4+IDE4KSwKLQkJICAgIG1ha2VzYWx0KDQsIGF1dGhjdHh0LT51c2VyKSk7Ci0JCSpzY2hlbWUgPSB4c3RyZHVwKCJjcnlwdC1leHRlbmRlZCIpOwotCX0gZWxzZSB7Ci0JCS8qIERlZmF1bHQgdG8gYmxvd2Zpc2ggKi8KLQkJcm91bmRzID0gTUFYKHJvdW5kcywgMyk7Ci0JCXJvdW5kcyA9IE1JTihyb3VuZHMsIDMxKTsKLQkJeGFzcHJpbnRmKHNhbHQsICIkMmEkJTAybGxkJCVzIiwgcm91bmRzLAotCQkgICAgbWFrZXNhbHQoMjIsIGF1dGhjdHh0LT51c2VyKSk7Ci0JCSpzY2hlbWUgPSB4c3RyZHVwKCJiY3J5cHQiKTsKLQl9Ci0JeGZyZWUoc3R5bGUpOwotCWRlYnVnMygiJXM6IGZha2UgJXMgc2FsdCBmb3IgdXNlciAlczogJXMiLAotCSAgICBfX2Z1bmNfXywgKnNjaGVtZSwgYXV0aGN0eHQtPnVzZXIsICpzYWx0KTsKLX0KLQotLyoKLSAqIEZldGNoIHBhc3N3b3JkIGhhc2hpbmcgc2NoZW1lLCBwYXNzd29yZCBzYWx0IGFuZCBkZXJpdmUgc2hhcmVkIHNlY3JldAotICogZm9yIHVzZXIuIElmIHVzZXIgZG9lcyBub3QgZXhpc3QsIGEgZmFrZSBidXQgc3RhYmxlIGFuZCB1c2VyLXVuaXF1ZQotICogc2FsdCB3aWxsIGJlIHJldHVybmVkLgotICovCi12b2lkCi1hdXRoMl9qcGFrZV9nZXRfcHdkYXRhKEF1dGhjdHh0ICphdXRoY3R4dCwgQklHTlVNICoqcywKLSAgICBjaGFyICoqaGFzaF9zY2hlbWUsIGNoYXIgKipzYWx0KQotewotCWNoYXIgKmNwOwotCXVfY2hhciAqc2VjcmV0OwotCXVfaW50IHNlY3JldF9sZW4sIHNhbHRfbGVuOwotCi0jaWZkZWYgSlBBS0VfREVCVUcKLQlkZWJ1ZzMoIiVzOiB2YWxpZCAlZCBwdyAlLjVzLi4uIiwgX19mdW5jX18sCi0JICAgIGF1dGhjdHh0LT52YWxpZCwgYXV0aGN0eHQtPnB3LT5wd19wYXNzd2QpOwotI2VuZGlmCi0KLQkqc2FsdCA9IE5VTEw7Ci0JKmhhc2hfc2NoZW1lID0gTlVMTDsKLQlpZiAoYXV0aGN0eHQtPnZhbGlkKSB7Ci0JCWlmIChzdHJuY21wKGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkLCAiJDIkIiwgMykgPT0gMCAmJgotCQkgICAgc3RybGVuKGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkKSA+IDI4KSB7Ci0JCQkvKgotCQkJICogb2xkLXZhcmlhbnQgYmNyeXB0OgotCQkJICogICAgICIkMiQiLCAyIGRpZ2l0IHJvdW5kcywgIiQiLCAyMiBieXRlcyBzYWx0Ci0JCQkgKi8KLQkJCXNhbHRfbGVuID0gMyArIDIgKyAxICsgMjIgKyAxOwotCQkJKnNhbHQgPSB4bWFsbG9jKHNhbHRfbGVuKTsKLQkJCXN0cmxjcHkoKnNhbHQsIGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkLCBzYWx0X2xlbik7Ci0JCQkqaGFzaF9zY2hlbWUgPSB4c3RyZHVwKCJiY3J5cHQiKTsKLQkJfSBlbHNlIGlmIChzdHJuY21wKGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkLCAiJDJhJCIsIDQpID09IDAgJiYKLQkJICAgIHN0cmxlbihhdXRoY3R4dC0+cHctPnB3X3Bhc3N3ZCkgPiAyOSkgewotCQkJLyoKLQkJCSAqIGN1cnJlbnQtdmFyaWFudCBiY3J5cHQ6Ci0JCQkgKiAgICAgIiQyYSQiLCAyIGRpZ2l0IHJvdW5kcywgIiQiLCAyMiBieXRlcyBzYWx0Ci0JCQkgKi8KLQkJCXNhbHRfbGVuID0gNCArIDIgKyAxICsgMjIgKyAxOwotCQkJKnNhbHQgPSB4bWFsbG9jKHNhbHRfbGVuKTsKLQkJCXN0cmxjcHkoKnNhbHQsIGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkLCBzYWx0X2xlbik7Ci0JCQkqaGFzaF9zY2hlbWUgPSB4c3RyZHVwKCJiY3J5cHQiKTsKLQkJfSBlbHNlIGlmIChzdHJuY21wKGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkLCAiJDEkIiwgMykgPT0gMCAmJgotCQkgICAgc3RybGVuKGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkKSA+IDUpIHsKLQkJCS8qCi0JCQkgKiBtZDVjcnlwdDoKLQkJCSAqICAgICAiJDEkIiwgc2FsdCB1bnRpbCAiJCIKLQkJCSAqLwotCQkJY3AgPSBzdHJjaHIoYXV0aGN0eHQtPnB3LT5wd19wYXNzd2QgKyAzLCAnJCcpOwotCQkJaWYgKGNwICE9IE5VTEwpIHsKLQkJCQlzYWx0X2xlbiA9IChjcCAtIGF1dGhjdHh0LT5wdy0+cHdfcGFzc3dkKSArIDE7Ci0JCQkJKnNhbHQgPSB4bWFsbG9jKHNhbHRfbGVuKTsKLQkJCQlzdHJsY3B5KCpzYWx0LCBhdXRoY3R4dC0+cHctPnB3X3Bhc3N3ZCwKLQkJCQkgICAgc2FsdF9sZW4pOwotCQkJCSpoYXNoX3NjaGVtZSA9IHhzdHJkdXAoIm1kNWNyeXB0Iik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3RybmNtcChhdXRoY3R4dC0+cHctPnB3X3Bhc3N3ZCwgIl8iLCAxKSA9PSAwICYmCi0JCSAgICBzdHJsZW4oYXV0aGN0eHQtPnB3LT5wd19wYXNzd2QpID4gOSkgewotCQkJLyoKLQkJCSAqIEJTREkgZXh0ZW5kZWQgY3J5cHQ6Ci0JCQkgKiAgICAgIl8iLCA0IGRpZ2l0cyBjb3VudCwgNCBjaGFycyBzYWx0Ci0JCQkgKi8KLQkJCXNhbHRfbGVuID0gMSArIDQgKyA0ICsgMTsKLQkJCSpzYWx0ID0geG1hbGxvYyhzYWx0X2xlbik7Ci0JCQlzdHJsY3B5KCpzYWx0LCBhdXRoY3R4dC0+cHctPnB3X3Bhc3N3ZCwgc2FsdF9sZW4pOwotCQkJKmhhc2hfc2NoZW1lID0geHN0cmR1cCgiY3J5cHQtZXh0ZW5kZWQiKTsKLQkJfSBlbHNlIGlmIChzdHJsZW4oYXV0aGN0eHQtPnB3LT5wd19wYXNzd2QpID09IDEzICAmJgotCQkgICAgdmFsaWRfY3J5cHRfc2FsdChhdXRoY3R4dC0+cHctPnB3X3Bhc3N3ZFswXSkgJiYKLQkJICAgIHZhbGlkX2NyeXB0X3NhbHQoYXV0aGN0eHQtPnB3LT5wd19wYXNzd2RbMV0pKSB7Ci0JCQkvKgotCQkJICogdHJhZGl0aW9uYWwgY3J5cHQ6Ci0JCQkgKiAgICAgMiBjaGFycyBzYWx0Ci0JCQkgKi8KLQkJCXNhbHRfbGVuID0gMiArIDE7Ci0JCQkqc2FsdCA9IHhtYWxsb2Moc2FsdF9sZW4pOwotCQkJc3RybGNweSgqc2FsdCwgYXV0aGN0eHQtPnB3LT5wd19wYXNzd2QsIHNhbHRfbGVuKTsKLQkJCSpoYXNoX3NjaGVtZSA9IHhzdHJkdXAoImNyeXB0Iik7Ci0JCX0KLQkJaWYgKCpzYWx0ID09IE5VTEwpIHsKLQkJCWRlYnVnKCIlczogdW5yZWNvZ25pc2VkIGNyeXB0IHNjaGVtZSBmb3IgdXNlciAlcyIsCi0JCQkgICAgX19mdW5jX18sIGF1dGhjdHh0LT5wdy0+cHdfbmFtZSk7Ci0JCX0KLQl9Ci0JaWYgKCpzYWx0ID09IE5VTEwpCi0JCWZha2Vfc2FsdF9hbmRfc2NoZW1lKGF1dGhjdHh0LCBzYWx0LCBoYXNoX3NjaGVtZSk7Ci0KLQlpZiAoaGFzaF9idWZmZXIoYXV0aGN0eHQtPnB3LT5wd19wYXNzd2QsCi0JICAgIHN0cmxlbihhdXRoY3R4dC0+cHctPnB3X3Bhc3N3ZCksIEVWUF9zaGEyNTYoKSwKLQkgICAgJnNlY3JldCwgJnNlY3JldF9sZW4pICE9IDApCi0JCWZhdGFsKCIlczogaGFzaF9idWZmZXIiLCBfX2Z1bmNfXyk7Ci0JaWYgKCgqcyA9IEJOX2JpbjJibihzZWNyZXQsIHNlY3JldF9sZW4sIE5VTEwpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEJOX2JpbjJibiAoc2VjcmV0KSIsIF9fZnVuY19fKTsKLSNpZmRlZiBKUEFLRV9ERUJVRwotCWRlYnVnMygiJXM6IHNhbHQgPSAlcyAobGVuICV1KSIsIF9fZnVuY19fLAotCSAgICAqc2FsdCwgKHVfaW50KXN0cmxlbigqc2FsdCkpOwotCWRlYnVnMygiJXM6IHNjaGVtZSA9ICVzIiwgX19mdW5jX18sICpoYXNoX3NjaGVtZSk7Ci0JSlBBS0VfREVCVUdfQk4oKCpzLCAiJXM6IHMgPSAiLCBfX2Z1bmNfXykpOwotI2VuZGlmCi0JYnplcm8oc2VjcmV0LCBzZWNyZXRfbGVuKTsKLQl4ZnJlZShzZWNyZXQpOwotfQotCi0vKgotICogQmVnaW4gYXV0aGVudGljYXRpb24gYXR0ZW1wdC4KLSAqIE5vdGUsIHNldHMgYXV0aGN0eHQtPnBvc3Rwb25lZCB3aGlsZSBpbiBzdWJwcm90b2NvbAotICovCi1zdGF0aWMgaW50Ci1hdXRoMl9qcGFrZV9zdGFydChBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0Jc3RydWN0IGpwYWtlX2N0eCAqcGN0eCA9IGF1dGhjdHh0LT5qcGFrZV9jdHg7Ci0JdV9jaGFyICp4M19wcm9vZiwgKng0X3Byb29mOwotCXVfaW50IHgzX3Byb29mX2xlbiwgeDRfcHJvb2ZfbGVuOwotCWNoYXIgKnNhbHQsICpoYXNoX3NjaGVtZTsKLQotCWRlYnVnKCIlczogc3RhcnQiLCBfX2Z1bmNfXyk7Ci0KLQlQUklWU0VQKGpwYWtlX3N0ZXAxKHBjdHgtPmdycCwKLQkgICAgJnBjdHgtPnNlcnZlcl9pZCwgJnBjdHgtPnNlcnZlcl9pZF9sZW4sCi0JICAgICZwY3R4LT54MywgJnBjdHgtPng0LCAmcGN0eC0+Z194MywgJnBjdHgtPmdfeDQsCi0JICAgICZ4M19wcm9vZiwgJngzX3Byb29mX2xlbiwKLQkgICAgJng0X3Byb29mLCAmeDRfcHJvb2ZfbGVuKSk7Ci0KLQlQUklWU0VQKGF1dGgyX2pwYWtlX2dldF9wd2RhdGEoYXV0aGN0eHQsICZwY3R4LT5zLAotCSAgICAmaGFzaF9zY2hlbWUsICZzYWx0KSk7Ci0KLQlpZiAoIXVzZV9wcml2c2VwKQotCQlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJzdGVwIDEgc2VuZGluZyBpbiAlcyIsIF9fZnVuY19fKSk7Ci0KLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfU0VSVkVSX1NURVAxKTsKLQlwYWNrZXRfcHV0X2NzdHJpbmcoaGFzaF9zY2hlbWUpOwotCXBhY2tldF9wdXRfY3N0cmluZyhzYWx0KTsKLQlwYWNrZXRfcHV0X3N0cmluZyhwY3R4LT5zZXJ2ZXJfaWQsIHBjdHgtPnNlcnZlcl9pZF9sZW4pOwotCXBhY2tldF9wdXRfYmlnbnVtMihwY3R4LT5nX3gzKTsKLQlwYWNrZXRfcHV0X2JpZ251bTIocGN0eC0+Z194NCk7Ci0JcGFja2V0X3B1dF9zdHJpbmcoeDNfcHJvb2YsIHgzX3Byb29mX2xlbik7Ci0JcGFja2V0X3B1dF9zdHJpbmcoeDRfcHJvb2YsIHg0X3Byb29mX2xlbik7Ci0JcGFja2V0X3NlbmQoKTsKLQlwYWNrZXRfd3JpdGVfd2FpdCgpOwotCi0JYnplcm8oaGFzaF9zY2hlbWUsIHN0cmxlbihoYXNoX3NjaGVtZSkpOwotCWJ6ZXJvKHNhbHQsIHN0cmxlbihzYWx0KSk7Ci0JeGZyZWUoaGFzaF9zY2hlbWUpOwotCXhmcmVlKHNhbHQpOwotCWJ6ZXJvKHgzX3Byb29mLCB4M19wcm9vZl9sZW4pOwotCWJ6ZXJvKHg0X3Byb29mLCB4NF9wcm9vZl9sZW4pOwotCXhmcmVlKHgzX3Byb29mKTsKLQl4ZnJlZSh4NF9wcm9vZik7Ci0KLQkvKiBFeHBlY3Qgc3RlcCAxIHBhY2tldCBmcm9tIHBlZXIgKi8KLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfQ0xJRU5UX1NURVAxLAotCSAgICBpbnB1dF91c2VyYXV0aF9qcGFrZV9jbGllbnRfc3RlcDEpOwotCi0JYXV0aGN0eHQtPnBvc3Rwb25lZCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotaW5wdXRfdXNlcmF1dGhfanBha2VfY2xpZW50X3N0ZXAxKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQotewotCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7Ci0Jc3RydWN0IGpwYWtlX2N0eCAqcGN0eCA9IGF1dGhjdHh0LT5qcGFrZV9jdHg7Ci0JdV9jaGFyICp4MV9wcm9vZiwgKngyX3Byb29mLCAqeDRfc19wcm9vZjsKLQl1X2ludCB4MV9wcm9vZl9sZW4sIHgyX3Byb29mX2xlbiwgeDRfc19wcm9vZl9sZW47Ci0KLQkvKiBEaXNhYmxlIHRoaXMgbWVzc2FnZSAqLwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfU1RFUDEsIE5VTEwpOwotCi0JLyogRmV0Y2ggc3RlcCAxIHZhbHVlcyAqLwotCWlmICgocGN0eC0+Z194MSA9IEJOX25ldygpKSA9PSBOVUxMIHx8Ci0JICAgIChwY3R4LT5nX3gyID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fbmV3IiwgX19mdW5jX18pOwotCXBjdHgtPmNsaWVudF9pZCA9IHBhY2tldF9nZXRfc3RyaW5nKCZwY3R4LT5jbGllbnRfaWRfbGVuKTsKLQlwYWNrZXRfZ2V0X2JpZ251bTIocGN0eC0+Z194MSk7Ci0JcGFja2V0X2dldF9iaWdudW0yKHBjdHgtPmdfeDIpOwotCXgxX3Byb29mID0gcGFja2V0X2dldF9zdHJpbmcoJngxX3Byb29mX2xlbik7Ci0JeDJfcHJvb2YgPSBwYWNrZXRfZ2V0X3N0cmluZygmeDJfcHJvb2ZfbGVuKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlpZiAoIXVzZV9wcml2c2VwKQotCQlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJzdGVwIDEgcmVjZWl2ZWQgaW4gJXMiLCBfX2Z1bmNfXykpOwotCi0JUFJJVlNFUChqcGFrZV9zdGVwMihwY3R4LT5ncnAsIHBjdHgtPnMsIHBjdHgtPmdfeDMsCi0JICAgIHBjdHgtPmdfeDEsIHBjdHgtPmdfeDIsIHBjdHgtPng0LAotCSAgICBwY3R4LT5jbGllbnRfaWQsIHBjdHgtPmNsaWVudF9pZF9sZW4sCi0JICAgIHBjdHgtPnNlcnZlcl9pZCwgcGN0eC0+c2VydmVyX2lkX2xlbiwKLQkgICAgeDFfcHJvb2YsIHgxX3Byb29mX2xlbiwKLQkgICAgeDJfcHJvb2YsIHgyX3Byb29mX2xlbiwKLQkgICAgJnBjdHgtPmIsCi0JICAgICZ4NF9zX3Byb29mLCAmeDRfc19wcm9vZl9sZW4pKTsKLQotCWJ6ZXJvKHgxX3Byb29mLCB4MV9wcm9vZl9sZW4pOwotCWJ6ZXJvKHgyX3Byb29mLCB4Ml9wcm9vZl9sZW4pOwotCXhmcmVlKHgxX3Byb29mKTsKLQl4ZnJlZSh4Ml9wcm9vZik7Ci0KLQlpZiAoIXVzZV9wcml2c2VwKQotCQlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJzdGVwIDIgc2VuZGluZyBpbiAlcyIsIF9fZnVuY19fKSk7Ci0KLQkvKiBTZW5kIHZhbHVlcyBmb3Igc3RlcCAyICovCi0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX1NFUlZFUl9TVEVQMik7Ci0JcGFja2V0X3B1dF9iaWdudW0yKHBjdHgtPmIpOwotCXBhY2tldF9wdXRfc3RyaW5nKHg0X3NfcHJvb2YsIHg0X3NfcHJvb2ZfbGVuKTsKLQlwYWNrZXRfc2VuZCgpOwotCXBhY2tldF93cml0ZV93YWl0KCk7Ci0KLQliemVybyh4NF9zX3Byb29mLCB4NF9zX3Byb29mX2xlbik7Ci0JeGZyZWUoeDRfc19wcm9vZik7Ci0KLQkvKiBFeHBlY3Qgc3RlcCAyIHBhY2tldCBmcm9tIHBlZXIgKi8KLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfQ0xJRU5UX1NURVAyLAotCSAgICBpbnB1dF91c2VyYXV0aF9qcGFrZV9jbGllbnRfc3RlcDIpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLWlucHV0X3VzZXJhdXRoX2pwYWtlX2NsaWVudF9zdGVwMihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OwotCXN0cnVjdCBqcGFrZV9jdHggKnBjdHggPSBhdXRoY3R4dC0+anBha2VfY3R4OwotCXVfY2hhciAqeDJfc19wcm9vZjsKLQl1X2ludCB4Ml9zX3Byb29mX2xlbjsKLQotCS8qIERpc2FibGUgdGhpcyBtZXNzYWdlICovCi0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX0NMSUVOVF9TVEVQMiwgTlVMTCk7Ci0KLQlpZiAoKHBjdHgtPmEgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7Ci0KLQkvKiBGZXRjaCBzdGVwIDIgdmFsdWVzICovCi0JcGFja2V0X2dldF9iaWdudW0yKHBjdHgtPmEpOwotCXgyX3NfcHJvb2YgPSBwYWNrZXRfZ2V0X3N0cmluZygmeDJfc19wcm9vZl9sZW4pOwotCXBhY2tldF9jaGVja19lb20oKTsKLQotCWlmICghdXNlX3ByaXZzZXApCi0JCUpQQUtFX0RFQlVHX0NUWCgocGN0eCwgInN0ZXAgMiByZWNlaXZlZCBpbiAlcyIsIF9fZnVuY19fKSk7Ci0KLQkvKiBEZXJpdmUgc2hhcmVkIGtleSBhbmQgY2FsY3VsYXRlIGNvbmZpcm1hdGlvbiBoYXNoICovCi0JUFJJVlNFUChqcGFrZV9rZXlfY29uZmlybShwY3R4LT5ncnAsIHBjdHgtPnMsIHBjdHgtPmEsCi0JICAgIHBjdHgtPng0LCBwY3R4LT5nX3gzLCBwY3R4LT5nX3g0LCBwY3R4LT5nX3gxLCBwY3R4LT5nX3gyLAotCSAgICBwY3R4LT5zZXJ2ZXJfaWQsIHBjdHgtPnNlcnZlcl9pZF9sZW4sCi0JICAgIHBjdHgtPmNsaWVudF9pZCwgcGN0eC0+Y2xpZW50X2lkX2xlbiwKLQkgICAgc2Vzc2lvbl9pZDIsIHNlc3Npb25faWQyX2xlbiwKLQkgICAgeDJfc19wcm9vZiwgeDJfc19wcm9vZl9sZW4sCi0JICAgICZwY3R4LT5rLAotCSAgICAmcGN0eC0+aF9rX3NpZF9zZXNzaWQsICZwY3R4LT5oX2tfc2lkX3Nlc3NpZF9sZW4pKTsKLQotCWJ6ZXJvKHgyX3NfcHJvb2YsIHgyX3NfcHJvb2ZfbGVuKTsKLQl4ZnJlZSh4Ml9zX3Byb29mKTsKLQotCWlmICghdXNlX3ByaXZzZXApCi0JCUpQQUtFX0RFQlVHX0NUWCgocGN0eCwgImNvbmZpcm0gc2VuZGluZyBpbiAlcyIsIF9fZnVuY19fKSk7Ci0KLQkvKiBTZW5kIGtleSBjb25maXJtYXRpb24gcHJvb2YgKi8KLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfU0VSVkVSX0NPTkZJUk0pOwotCXBhY2tldF9wdXRfc3RyaW5nKHBjdHgtPmhfa19zaWRfc2Vzc2lkLCBwY3R4LT5oX2tfc2lkX3Nlc3NpZF9sZW4pOwotCXBhY2tldF9zZW5kKCk7Ci0JcGFja2V0X3dyaXRlX3dhaXQoKTsKLQotCS8qIEV4cGVjdCBjb25maXJtYXRpb24gZnJvbSBwZWVyICovCi0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX0NMSUVOVF9DT05GSVJNLAotCSAgICBpbnB1dF91c2VyYXV0aF9qcGFrZV9jbGllbnRfY29uZmlybSk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotaW5wdXRfdXNlcmF1dGhfanBha2VfY2xpZW50X2NvbmZpcm0oaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKLQlzdHJ1Y3QganBha2VfY3R4ICpwY3R4ID0gYXV0aGN0eHQtPmpwYWtlX2N0eDsKLQlpbnQgYXV0aGVudGljYXRlZCA9IDA7Ci0KLQkvKiBEaXNhYmxlIHRoaXMgbWVzc2FnZSAqLwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfQ09ORklSTSwgTlVMTCk7Ci0KLQlwY3R4LT5oX2tfY2lkX3Nlc3NpZCA9IHBhY2tldF9nZXRfc3RyaW5nKCZwY3R4LT5oX2tfY2lkX3Nlc3NpZF9sZW4pOwotCXBhY2tldF9jaGVja19lb20oKTsKLQotCWlmICghdXNlX3ByaXZzZXApCi0JCUpQQUtFX0RFQlVHX0NUWCgocGN0eCwgImNvbmZpcm0gcmVjZWl2ZWQgaW4gJXMiLCBfX2Z1bmNfXykpOwotCi0JLyogVmVyaWZ5IGV4cGVjdGVkIGNvbmZpcm1hdGlvbiBoYXNoICovCi0JaWYgKFBSSVZTRVAoanBha2VfY2hlY2tfY29uZmlybShwY3R4LT5rLAotCSAgICBwY3R4LT5jbGllbnRfaWQsIHBjdHgtPmNsaWVudF9pZF9sZW4sCi0JICAgIHNlc3Npb25faWQyLCBzZXNzaW9uX2lkMl9sZW4sCi0JICAgIHBjdHgtPmhfa19jaWRfc2Vzc2lkLCBwY3R4LT5oX2tfY2lkX3Nlc3NpZF9sZW4pKSA9PSAxKQotCQlhdXRoZW50aWNhdGVkID0gYXV0aGN0eHQtPnZhbGlkID8gMSA6IDA7Ci0JZWxzZQotCQlkZWJ1ZygiJXM6IGNvbmZpcm1hdGlvbiBtaXNtYXRjaCIsIF9fZnVuY19fKTsKLQkJCi0JLyogZG9uZSAqLwotCWF1dGhjdHh0LT5wb3N0cG9uZWQgPSAwOwotCWpwYWtlX2ZyZWUoYXV0aGN0eHQtPmpwYWtlX2N0eCk7Ci0JYXV0aGN0eHQtPmpwYWtlX2N0eCA9IE5VTEw7Ci0JdXNlcmF1dGhfZmluaXNoKGF1dGhjdHh0LCBhdXRoZW50aWNhdGVkLCBtZXRob2RfanBha2UubmFtZSk7Ci19Ci0KLSNlbmRpZiAvKiBKUEFLRSAqLwotCmRpZmYgLS1naXQgYS9hdXRoMi1rYmRpbnQuYyBiL2F1dGgyLWtiZGludC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWU2N2RhLi4wMDAwMDAwCi0tLSBhL2F1dGgyLWtiZGludC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogJE9wZW5CU0Q6IGF1dGgyLWtiZGludC5jLHYgMS41IDIwMDYvMDgvMDMgMDM6MzQ6NDEgZGVyYWFkdCBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInBhY2tldC5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgInNlcnZjb25mLmgiCi0KLS8qIGltcG9ydCAqLwotZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKLQotc3RhdGljIGludAotdXNlcmF1dGhfa2JkaW50KEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlpbnQgYXV0aGVudGljYXRlZCA9IDA7Ci0JY2hhciAqbGFuZywgKmRldnM7Ci0KLQlsYW5nID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JZGV2cyA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOwotCXBhY2tldF9jaGVja19lb20oKTsKLQotCWRlYnVnKCJrZXlib2FyZC1pbnRlcmFjdGl2ZSBkZXZzICVzIiwgZGV2cyk7Ci0KLQlpZiAob3B0aW9ucy5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24pCi0JCWF1dGhlbnRpY2F0ZWQgPSBhdXRoMl9jaGFsbGVuZ2UoYXV0aGN0eHQsIGRldnMpOwotCi0JeGZyZWUoZGV2cyk7Ci0JeGZyZWUobGFuZyk7Ci0JcmV0dXJuIGF1dGhlbnRpY2F0ZWQ7Ci19Ci0KLUF1dGhtZXRob2QgbWV0aG9kX2tiZGludCA9IHsKLQkia2V5Ym9hcmQtaW50ZXJhY3RpdmUiLAotCXVzZXJhdXRoX2tiZGludCwKLQkmb3B0aW9ucy5rYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb24KLX07CmRpZmYgLS1naXQgYS9hdXRoMi1ub25lLmMgYi9hdXRoMi1ub25lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYWU5NDUuLjAwMDAwMDAKLS0tIGEvYXV0aDItbm9uZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGF1dGgyLW5vbmUuYyx2IDEuMTYgMjAxMC8wNi8yNSAwODo0NjoxNyBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdWlvLmg+Ci0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAiYXRvbWljaW8uaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJhdXRoLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAic2VydmNvbmYuaCIKLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0jaWZkZWYgR1NTQVBJCi0jaW5jbHVkZSAic3NoLWdzcy5oIgotI2VuZGlmCi0jaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCi0KLS8qIGltcG9ydCAqLwotZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKLQotLyogIm5vbmUiIGlzIGFsbG93ZWQgb25seSBvbmUgdGltZSAqLwotc3RhdGljIGludCBub25lX2VuYWJsZWQgPSAxOwotCi1zdGF0aWMgaW50Ci11c2VyYXV0aF9ub25lKEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlub25lX2VuYWJsZWQgPSAwOwotCXBhY2tldF9jaGVja19lb20oKTsKLSNpZm5kZWYgQU5EUk9JRAotCS8qIG5vIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGluIGFuZHJvaWQgKi8KLQlpZiAob3B0aW9ucy5wZXJtaXRfZW1wdHlfcGFzc3dkICYmIG9wdGlvbnMucGFzc3dvcmRfYXV0aGVudGljYXRpb24pCi0JCXJldHVybiAoUFJJVlNFUChhdXRoX3Bhc3N3b3JkKGF1dGhjdHh0LCAiIikpKTsKLSNlbmRpZgotCXJldHVybiAoMCk7Ci19Ci0KLUF1dGhtZXRob2QgbWV0aG9kX25vbmUgPSB7Ci0JIm5vbmUiLAotCXVzZXJhdXRoX25vbmUsCi0JJm5vbmVfZW5hYmxlZAotfTsKZGlmZiAtLWdpdCBhL2F1dGgyLXBhc3N3ZC5jIGIvYXV0aDItcGFzc3dkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZDM4MTYuLjAwMDAwMDAKLS0tIGEvYXV0aDItcGFzc3dkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKiAkT3BlbkJTRDogYXV0aDItcGFzc3dkLmMsdiAxLjkgMjAwNi8wOC8wMyAwMzozNDo0MSBkZXJhYWR0IEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJhdXRoLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaWZkZWYgR1NTQVBJCi0jaW5jbHVkZSAic3NoLWdzcy5oIgotI2VuZGlmCi0jaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCi0jaW5jbHVkZSAic2VydmNvbmYuaCIKLQotLyogaW1wb3J0ICovCi1leHRlcm4gU2VydmVyT3B0aW9ucyBvcHRpb25zOwotCi1zdGF0aWMgaW50Ci11c2VyYXV0aF9wYXNzd2QoQXV0aGN0eHQgKmF1dGhjdHh0KQotewotCWNoYXIgKnBhc3N3b3JkLCAqbmV3cGFzczsKLQlpbnQgYXV0aGVudGljYXRlZCA9IDA7Ci0JaW50IGNoYW5nZTsKLQl1X2ludCBsZW4sIG5ld2xlbjsKLQotCWNoYW5nZSA9IHBhY2tldF9nZXRfY2hhcigpOwotCXBhc3N3b3JkID0gcGFja2V0X2dldF9zdHJpbmcoJmxlbik7Ci0JaWYgKGNoYW5nZSkgewotCQkvKiBkaXNjYXJkIG5ldyBwYXNzd29yZCBmcm9tIHBhY2tldCAqLwotCQluZXdwYXNzID0gcGFja2V0X2dldF9zdHJpbmcoJm5ld2xlbik7Ci0JCW1lbXNldChuZXdwYXNzLCAwLCBuZXdsZW4pOwotCQl4ZnJlZShuZXdwYXNzKTsKLQl9Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JaWYgKGNoYW5nZSkKLQkJbG9naXQoInBhc3N3b3JkIGNoYW5nZSBub3Qgc3VwcG9ydGVkIik7Ci0jaWZuZGVmIEFORFJPSUQKLQkvKiBubyBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBpbiBhbmRyb2lkICovCi0JZWxzZSBpZiAoUFJJVlNFUChhdXRoX3Bhc3N3b3JkKGF1dGhjdHh0LCBwYXNzd29yZCkpID09IDEpCi0JCWF1dGhlbnRpY2F0ZWQgPSAxOwotI2VuZGlmCi0JbWVtc2V0KHBhc3N3b3JkLCAwLCBsZW4pOwotCXhmcmVlKHBhc3N3b3JkKTsKLQlyZXR1cm4gYXV0aGVudGljYXRlZDsKLX0KLQotQXV0aG1ldGhvZCBtZXRob2RfcGFzc3dkID0gewotCSJwYXNzd29yZCIsCi0JdXNlcmF1dGhfcGFzc3dkLAotCSZvcHRpb25zLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uCi19OwpkaWZmIC0tZ2l0IGEvYXV0aDItcHVia2V5LmMgYi9hdXRoMi1wdWJrZXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3ODg3ZS4uMDAwMDAwMAotLS0gYS9hdXRoMi1wdWJrZXkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi0vKiAkT3BlbkJTRDogYXV0aDItcHVia2V5LmMsdiAxLjI5IDIwMTEvMDUvMjMgMDM6MzA6MDcgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgInNzaDIuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJzZXJ2Y29uZi5oIgotI2luY2x1ZGUgImNvbXBhdC5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotI2luY2x1ZGUgInVpZHN3YXAuaCIKLSNpbmNsdWRlICJhdXRoLW9wdGlvbnMuaCIKLSNpbmNsdWRlICJjYW5vaG9zdC5oIgotI2lmZGVmIEdTU0FQSQotI2luY2x1ZGUgInNzaC1nc3MuaCIKLSNlbmRpZgotI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJhdXRoZmlsZS5oIgotI2luY2x1ZGUgIm1hdGNoLmgiCi0KLS8qIGltcG9ydCAqLwotZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKLWV4dGVybiB1X2NoYXIgKnNlc3Npb25faWQyOwotZXh0ZXJuIHVfaW50IHNlc3Npb25faWQyX2xlbjsKLQotc3RhdGljIGludAotdXNlcmF1dGhfcHVia2V5KEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlCdWZmZXIgYjsKLQlLZXkgKmtleSA9IE5VTEw7Ci0JY2hhciAqcGthbGc7Ci0JdV9jaGFyICpwa2Jsb2IsICpzaWc7Ci0JdV9pbnQgYWxlbiwgYmxlbiwgc2xlbjsKLQlpbnQgaGF2ZV9zaWcsIHBrdHlwZTsKLQlpbnQgYXV0aGVudGljYXRlZCA9IDA7Ci0KLQlpZiAoIWF1dGhjdHh0LT52YWxpZCkgewotCQlkZWJ1ZzIoInVzZXJhdXRoX3B1YmtleTogZGlzYWJsZWQgYmVjYXVzZSBvZiBpbnZhbGlkIHVzZXIiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWhhdmVfc2lnID0gcGFja2V0X2dldF9jaGFyKCk7Ci0JaWYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19QS0FVVEgpIHsKLQkJZGVidWcyKCJ1c2VyYXV0aF9wdWJrZXk6IFNTSF9CVUdfUEtBVVRIIik7Ci0JCS8qIG5vIGV4cGxpY2l0IHBrYWxnIGdpdmVuICovCi0JCXBrYmxvYiA9IHBhY2tldF9nZXRfc3RyaW5nKCZibGVuKTsKLQkJYnVmZmVyX2luaXQoJmIpOwotCQlidWZmZXJfYXBwZW5kKCZiLCBwa2Jsb2IsIGJsZW4pOwotCQkvKiBzbyB3ZSBoYXZlIHRvIGV4dHJhY3QgdGhlIHBrYWxnIGZyb20gdGhlIHBrYmxvYiAqLwotCQlwa2FsZyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCAmYWxlbik7Ci0JCWJ1ZmZlcl9mcmVlKCZiKTsKLQl9IGVsc2UgewotCQlwa2FsZyA9IHBhY2tldF9nZXRfc3RyaW5nKCZhbGVuKTsKLQkJcGtibG9iID0gcGFja2V0X2dldF9zdHJpbmcoJmJsZW4pOwotCX0KLQlwa3R5cGUgPSBrZXlfdHlwZV9mcm9tX25hbWUocGthbGcpOwotCWlmIChwa3R5cGUgPT0gS0VZX1VOU1BFQykgewotCQkvKiB0aGlzIGlzIHBlcmZlY3RseSBsZWdhbCAqLwotCQlsb2dpdCgidXNlcmF1dGhfcHVia2V5OiB1bnN1cHBvcnRlZCBwdWJsaWMga2V5IGFsZ29yaXRobTogJXMiLAotCQkgICAgcGthbGcpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWtleSA9IGtleV9mcm9tX2Jsb2IocGtibG9iLCBibGVuKTsKLQlpZiAoa2V5ID09IE5VTEwpIHsKLQkJZXJyb3IoInVzZXJhdXRoX3B1YmtleTogY2Fubm90IGRlY29kZSBrZXk6ICVzIiwgcGthbGcpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChrZXktPnR5cGUgIT0gcGt0eXBlKSB7Ci0JCWVycm9yKCJ1c2VyYXV0aF9wdWJrZXk6IHR5cGUgbWlzbWF0Y2ggZm9yIGRlY29kZWQga2V5ICIKLQkJICAgICIocmVjZWl2ZWQgJWQsIGV4cGVjdGVkICVkKSIsIGtleS0+dHlwZSwgcGt0eXBlKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoaGF2ZV9zaWcpIHsKLQkJc2lnID0gcGFja2V0X2dldF9zdHJpbmcoJnNsZW4pOwotCQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0JCWJ1ZmZlcl9pbml0KCZiKTsKLQkJaWYgKGRhdGFmZWxsb3dzICYgU1NIX09MRF9TRVNTSU9OSUQpIHsKLQkJCWJ1ZmZlcl9hcHBlbmQoJmIsIHNlc3Npb25faWQyLCBzZXNzaW9uX2lkMl9sZW4pOwotCQl9IGVsc2UgewotCQkJYnVmZmVyX3B1dF9zdHJpbmcoJmIsIHNlc3Npb25faWQyLCBzZXNzaW9uX2lkMl9sZW4pOwotCQl9Ci0JCS8qIHJlY29uc3RydWN0IHBhY2tldCAqLwotCQlidWZmZXJfcHV0X2NoYXIoJmIsIFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpOwotCQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGF1dGhjdHh0LT51c2VyKTsKLQkJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLAotCQkgICAgZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1BLU0VSVklDRSA/Ci0JCSAgICAic3NoLXVzZXJhdXRoIiA6Ci0JCSAgICBhdXRoY3R4dC0+c2VydmljZSk7Ci0JCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfUEtBVVRIKSB7Ci0JCQlidWZmZXJfcHV0X2NoYXIoJmIsIGhhdmVfc2lnKTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgInB1YmxpY2tleSIpOwotCQkJYnVmZmVyX3B1dF9jaGFyKCZiLCBoYXZlX3NpZyk7Ci0JCQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIHBrYWxnKTsKLQkJfQotCQlidWZmZXJfcHV0X3N0cmluZygmYiwgcGtibG9iLCBibGVuKTsKLSNpZmRlZiBERUJVR19QSwotCQlidWZmZXJfZHVtcCgmYik7Ci0jZW5kaWYKLQkJLyogdGVzdCBmb3IgY29ycmVjdCBzaWduYXR1cmUgKi8KLQkJYXV0aGVudGljYXRlZCA9IDA7Ci0JCWlmIChQUklWU0VQKHVzZXJfa2V5X2FsbG93ZWQoYXV0aGN0eHQtPnB3LCBrZXkpKSAmJgotCQkgICAgUFJJVlNFUChrZXlfdmVyaWZ5KGtleSwgc2lnLCBzbGVuLCBidWZmZXJfcHRyKCZiKSwKLQkJICAgIGJ1ZmZlcl9sZW4oJmIpKSkgPT0gMSkKLQkJCWF1dGhlbnRpY2F0ZWQgPSAxOwotCQlidWZmZXJfZnJlZSgmYik7Ci0JCXhmcmVlKHNpZyk7Ci0JfSBlbHNlIHsKLQkJZGVidWcoInRlc3Qgd2hldGhlciBwa2FsZy9wa2Jsb2IgYXJlIGFjY2VwdGFibGUiKTsKLQkJcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JCS8qIFhYWCBmYWtlIHJlcGx5IGFuZCBhbHdheXMgc2VuZCBQS19PSyA/ICovCi0JCS8qCi0JCSAqIFhYWCB0aGlzIGFsbG93cyB0ZXN0aW5nIHdoZXRoZXIgYSB1c2VyIGlzIGFsbG93ZWQKLQkJICogdG8gbG9naW46IGlmIHlvdSBoYXBwZW4gdG8gaGF2ZSBhIHZhbGlkIHB1YmtleSB0aGlzCi0JCSAqIG1lc3NhZ2UgaXMgc2VudC4gdGhlIG1lc3NhZ2UgaXMgTkVWRVIgc2VudCBhdCBhbGwKLQkJICogaWYgYSB1c2VyIGlzIG5vdCBhbGxvd2VkIHRvIGxvZ2luLiBpcyB0aGlzIGFuCi0JCSAqIGlzc3VlPyAtbWFya3VzCi0JCSAqLwotCQlpZiAoUFJJVlNFUCh1c2VyX2tleV9hbGxvd2VkKGF1dGhjdHh0LT5wdywga2V5KSkpIHsKLQkJCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9QS19PSyk7Ci0JCQlwYWNrZXRfcHV0X3N0cmluZyhwa2FsZywgYWxlbik7Ci0JCQlwYWNrZXRfcHV0X3N0cmluZyhwa2Jsb2IsIGJsZW4pOwotCQkJcGFja2V0X3NlbmQoKTsKLQkJCXBhY2tldF93cml0ZV93YWl0KCk7Ci0JCQlhdXRoY3R4dC0+cG9zdHBvbmVkID0gMTsKLQkJfQotCX0KLQlpZiAoYXV0aGVudGljYXRlZCAhPSAxKQotCQlhdXRoX2NsZWFyX29wdGlvbnMoKTsKLWRvbmU6Ci0JZGVidWcyKCJ1c2VyYXV0aF9wdWJrZXk6IGF1dGhlbnRpY2F0ZWQgJWQgcGthbGcgJXMiLCBhdXRoZW50aWNhdGVkLCBwa2FsZyk7Ci0JaWYgKGtleSAhPSBOVUxMKQotCQlrZXlfZnJlZShrZXkpOwotCXhmcmVlKHBrYWxnKTsKLQl4ZnJlZShwa2Jsb2IpOwotCXJldHVybiBhdXRoZW50aWNhdGVkOwotfQotCi1zdGF0aWMgaW50Ci1tYXRjaF9wcmluY2lwYWxzX29wdGlvbihjb25zdCBjaGFyICpwcmluY2lwYWxfbGlzdCwgc3RydWN0IEtleUNlcnQgKmNlcnQpCi17Ci0JY2hhciAqcmVzdWx0OwotCXVfaW50IGk7Ci0KLQkvKiBYWFggcGVyY2VudF9leHBhbmQoKSBzZXF1ZW5jZXMgZm9yIGF1dGhvcml6ZWRfcHJpbmNpcGFscz8gKi8KLQotCWZvciAoaSA9IDA7IGkgPCBjZXJ0LT5ucHJpbmNpcGFsczsgaSsrKSB7Ci0JCWlmICgocmVzdWx0ID0gbWF0Y2hfbGlzdChjZXJ0LT5wcmluY2lwYWxzW2ldLAotCQkgICAgcHJpbmNpcGFsX2xpc3QsIE5VTEwpKSAhPSBOVUxMKSB7Ci0JCQlkZWJ1ZzMoIm1hdGNoZWQgcHJpbmNpcGFsIGZyb20ga2V5IG9wdGlvbnMgXCIlLjEwMHNcIiIsCi0JCQkgICAgcmVzdWx0KTsKLQkJCXhmcmVlKHJlc3VsdCk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbWF0Y2hfcHJpbmNpcGFsc19maWxlKGNoYXIgKmZpbGUsIHN0cnVjdCBwYXNzd2QgKnB3LCBzdHJ1Y3QgS2V5Q2VydCAqY2VydCkKLXsKLQlGSUxFICpmOwotCWNoYXIgbGluZVtTU0hfTUFYX1BVQktFWV9CWVRFU10sICpjcCwgKmVwLCAqbGluZV9vcHRzOwotCXVfbG9uZyBsaW5lbnVtID0gMDsKLQl1X2ludCBpOwotCi0JdGVtcG9yYXJpbHlfdXNlX3VpZChwdyk7Ci0JZGVidWcoInRyeWluZyBhdXRob3JpemVkIHByaW5jaXBhbHMgZmlsZSAlcyIsIGZpbGUpOwotCWlmICgoZiA9IGF1dGhfb3BlbnByaW5jaXBhbHMoZmlsZSwgcHcsIG9wdGlvbnMuc3RyaWN0X21vZGVzKSkgPT0gTlVMTCkgewotCQlyZXN0b3JlX3VpZCgpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jd2hpbGUgKHJlYWRfa2V5ZmlsZV9saW5lKGYsIGZpbGUsIGxpbmUsIHNpemVvZihsaW5lKSwgJmxpbmVudW0pICE9IC0xKSB7Ci0JCS8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLwotCQlmb3IgKGNwID0gbGluZTsgKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JzsgY3ArKykKLQkJCTsKLQkJLyogU2tpcCBibGFuayBhbmQgY29tbWVudCBsaW5lcy4gKi8KLQkJaWYgKChlcCA9IHN0cmNocihjcCwgJyMnKSkgIT0gTlVMTCkKLQkJCSplcCA9ICdcMCc7Ci0JCWlmICghKmNwIHx8ICpjcCA9PSAnXG4nKQotCQkJY29udGludWU7Ci0JCS8qIFRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi8KLQkJZXAgPSBjcCArIHN0cmxlbihjcCkgLSAxOwotCQl3aGlsZSAoZXAgPiBjcCAmJiAoKmVwID09ICdcbicgfHwgKmVwID09ICcgJyB8fCAqZXAgPT0gJ1x0JykpCi0JCQkqZXAtLSA9ICdcMCc7Ci0JCS8qCi0JCSAqIElmIHRoZSBsaW5lIGhhcyBpbnRlcm5hbCB3aGl0ZXNwYWNlIHRoZW4gYXNzdW1lIGl0IGhhcwotCQkgKiBrZXkgb3B0aW9ucy4KLQkJICovCi0JCWxpbmVfb3B0cyA9IE5VTEw7Ci0JCWlmICgoZXAgPSBzdHJyY2hyKGNwLCAnICcpKSAhPSBOVUxMIHx8Ci0JCSAgICAoZXAgPSBzdHJyY2hyKGNwLCAnXHQnKSkgIT0gTlVMTCkgewotCQkJZm9yICg7ICplcCA9PSAnICcgfHwgKmVwID09ICdcdCc7IGVwKyspCi0JCQkJOwotCQkJbGluZV9vcHRzID0gY3A7Ci0JCQljcCA9IGVwOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBjZXJ0LT5ucHJpbmNpcGFsczsgaSsrKSB7Ci0JCQlpZiAoc3RyY21wKGNwLCBjZXJ0LT5wcmluY2lwYWxzW2ldKSA9PSAwKSB7Ci0JCQkJZGVidWczKCJtYXRjaGVkIHByaW5jaXBhbCBmcm9tIGZpbGUgXCIlLjEwMHNcIiIsCi0JCQkgICAgCSAgICBjZXJ0LT5wcmluY2lwYWxzW2ldKTsKLQkJCQlpZiAoYXV0aF9wYXJzZV9vcHRpb25zKHB3LCBsaW5lX29wdHMsCi0JCQkJICAgIGZpbGUsIGxpbmVudW0pICE9IDEpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWZjbG9zZShmKTsKLQkJCQlyZXN0b3JlX3VpZCgpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCWZjbG9zZShmKTsKLQlyZXN0b3JlX3VpZCgpOwotCXJldHVybiAwOwotfQkKLQotLyogcmV0dXJuIDEgaWYgdXNlciBhbGxvd3MgZ2l2ZW4ga2V5ICovCi1zdGF0aWMgaW50Ci11c2VyX2tleV9hbGxvd2VkMihzdHJ1Y3QgcGFzc3dkICpwdywgS2V5ICprZXksIGNoYXIgKmZpbGUpCi17Ci0JY2hhciBsaW5lW1NTSF9NQVhfUFVCS0VZX0JZVEVTXTsKLQljb25zdCBjaGFyICpyZWFzb247Ci0JaW50IGZvdW5kX2tleSA9IDA7Ci0JRklMRSAqZjsKLQl1X2xvbmcgbGluZW51bSA9IDA7Ci0JS2V5ICpmb3VuZDsKLQljaGFyICpmcDsKLQotCS8qIFRlbXBvcmFyaWx5IHVzZSB0aGUgdXNlcidzIHVpZC4gKi8KLQl0ZW1wb3JhcmlseV91c2VfdWlkKHB3KTsKLQotCWRlYnVnKCJ0cnlpbmcgcHVibGljIGtleSBmaWxlICVzIiwgZmlsZSk7Ci0JZiA9IGF1dGhfb3BlbmtleWZpbGUoZmlsZSwgcHcsIG9wdGlvbnMuc3RyaWN0X21vZGVzKTsKLQotCWlmICghZikgewotCQlyZXN0b3JlX3VpZCgpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmb3VuZF9rZXkgPSAwOwotCWZvdW5kID0ga2V5X25ldyhrZXlfaXNfY2VydChrZXkpID8gS0VZX1VOU1BFQyA6IGtleS0+dHlwZSk7Ci0KLQl3aGlsZSAocmVhZF9rZXlmaWxlX2xpbmUoZiwgZmlsZSwgbGluZSwgc2l6ZW9mKGxpbmUpLCAmbGluZW51bSkgIT0gLTEpIHsKLQkJY2hhciAqY3AsICprZXlfb3B0aW9ucyA9IE5VTEw7Ci0KLQkJYXV0aF9jbGVhcl9vcHRpb25zKCk7Ci0KLQkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UsIGVtcHR5IGFuZCBjb21tZW50IGxpbmVzLiAqLwotCQlmb3IgKGNwID0gbGluZTsgKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JzsgY3ArKykKLQkJCTsKLQkJaWYgKCEqY3AgfHwgKmNwID09ICdcbicgfHwgKmNwID09ICcjJykKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChrZXlfcmVhZChmb3VuZCwgJmNwKSAhPSAxKSB7Ci0JCQkvKiBubyBrZXk/ICBjaGVjayBpZiB0aGVyZSBhcmUgb3B0aW9ucyBmb3IgdGhpcyBrZXkgKi8KLQkJCWludCBxdW90ZWQgPSAwOwotCQkJZGVidWcyKCJ1c2VyX2tleV9hbGxvd2VkOiBjaGVjayBvcHRpb25zOiAnJXMnIiwgY3ApOwotCQkJa2V5X29wdGlvbnMgPSBjcDsKLQkJCWZvciAoOyAqY3AgJiYgKHF1b3RlZCB8fCAoKmNwICE9ICcgJyAmJiAqY3AgIT0gJ1x0JykpOyBjcCsrKSB7Ci0JCQkJaWYgKCpjcCA9PSAnXFwnICYmIGNwWzFdID09ICciJykKLQkJCQkJY3ArKzsJLyogU2tpcCBib3RoICovCi0JCQkJZWxzZSBpZiAoKmNwID09ICciJykKLQkJCQkJcXVvdGVkID0gIXF1b3RlZDsKLQkJCX0KLQkJCS8qIFNraXAgcmVtYWluaW5nIHdoaXRlc3BhY2UuICovCi0JCQlmb3IgKDsgKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JzsgY3ArKykKLQkJCQk7Ci0JCQlpZiAoa2V5X3JlYWQoZm91bmQsICZjcCkgIT0gMSkgewotCQkJCWRlYnVnMigidXNlcl9rZXlfYWxsb3dlZDogYWR2YW5jZTogJyVzJyIsIGNwKTsKLQkJCQkvKiBzdGlsbCBubyBrZXk/ICBhZHZhbmNlIHRvIG5leHQgbGluZSovCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGtleV9pc19jZXJ0KGtleSkpIHsKLQkJCWlmICgha2V5X2VxdWFsKGZvdW5kLCBrZXktPmNlcnQtPnNpZ25hdHVyZV9rZXkpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGF1dGhfcGFyc2Vfb3B0aW9ucyhwdywga2V5X29wdGlvbnMsIGZpbGUsCi0JCQkgICAgbGluZW51bSkgIT0gMSkKLQkJCQljb250aW51ZTsKLQkJCWlmICgha2V5X2lzX2NlcnRfYXV0aG9yaXR5KQotCQkJCWNvbnRpbnVlOwotCQkJZnAgPSBrZXlfZmluZ2VycHJpbnQoZm91bmQsIFNTSF9GUF9NRDUsCi0JCQkgICAgU1NIX0ZQX0hFWCk7Ci0JCQlkZWJ1ZygibWF0Y2hpbmcgQ0EgZm91bmQ6IGZpbGUgJXMsIGxpbmUgJWx1LCAlcyAlcyIsCi0JCQkgICAgZmlsZSwgbGluZW51bSwga2V5X3R5cGUoZm91bmQpLCBmcCk7Ci0JCQkvKgotCQkJICogSWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhIGxpc3Qgb2YgcHJpbmNpcGFscyBhcwotCQkJICogYSBrZXkgb3B0aW9uLCB0aGVuIHByZWZlciB0aGF0IGxpc3QgdG8gbWF0Y2hpbmcKLQkJCSAqIHRoZWlyIHVzZXJuYW1lIGluIHRoZSBjZXJ0aWZpY2F0ZSBwcmluY2lwYWxzIGxpc3QuCi0JCQkgKi8KLQkJCWlmIChhdXRob3JpemVkX3ByaW5jaXBhbHMgIT0gTlVMTCAmJgotCQkJICAgICFtYXRjaF9wcmluY2lwYWxzX29wdGlvbihhdXRob3JpemVkX3ByaW5jaXBhbHMsCi0JCQkgICAga2V5LT5jZXJ0KSkgewotCQkJCXJlYXNvbiA9ICJDZXJ0aWZpY2F0ZSBkb2VzIG5vdCBjb250YWluIGFuICIKLQkJCQkgICAgImF1dGhvcml6ZWQgcHJpbmNpcGFsIjsKLSBmYWlsX3JlYXNvbjoKLQkJCQl4ZnJlZShmcCk7Ci0JCQkJZXJyb3IoIiVzIiwgcmVhc29uKTsKLQkJCQlhdXRoX2RlYnVnX2FkZCgiJXMiLCByZWFzb24pOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGtleV9jZXJ0X2NoZWNrX2F1dGhvcml0eShrZXksIDAsIDAsCi0JCQkgICAgYXV0aG9yaXplZF9wcmluY2lwYWxzID09IE5VTEwgPyBwdy0+cHdfbmFtZSA6IE5VTEwsCi0JCQkgICAgJnJlYXNvbikgIT0gMCkKLQkJCQlnb3RvIGZhaWxfcmVhc29uOwotCQkJaWYgKGF1dGhfY2VydF9vcHRpb25zKGtleSwgcHcpICE9IDApIHsKLQkJCQl4ZnJlZShmcCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQl2ZXJib3NlKCJBY2NlcHRlZCBjZXJ0aWZpY2F0ZSBJRCBcIiVzXCIgIgotCQkJICAgICJzaWduZWQgYnkgJXMgQ0EgJXMgdmlhICVzIiwga2V5LT5jZXJ0LT5rZXlfaWQsCi0JCQkgICAga2V5X3R5cGUoZm91bmQpLCBmcCwgZmlsZSk7Ci0JCQl4ZnJlZShmcCk7Ci0JCQlmb3VuZF9rZXkgPSAxOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoa2V5X2VxdWFsKGZvdW5kLCBrZXkpKSB7Ci0JCQlpZiAoYXV0aF9wYXJzZV9vcHRpb25zKHB3LCBrZXlfb3B0aW9ucywgZmlsZSwKLQkJCSAgICBsaW5lbnVtKSAhPSAxKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGtleV9pc19jZXJ0X2F1dGhvcml0eSkKLQkJCQljb250aW51ZTsKLQkJCWZvdW5kX2tleSA9IDE7Ci0JCQlkZWJ1ZygibWF0Y2hpbmcga2V5IGZvdW5kOiBmaWxlICVzLCBsaW5lICVsdSIsCi0JCQkgICAgZmlsZSwgbGluZW51bSk7Ci0JCQlmcCA9IGtleV9maW5nZXJwcmludChmb3VuZCwgU1NIX0ZQX01ENSwgU1NIX0ZQX0hFWCk7Ci0JCQl2ZXJib3NlKCJGb3VuZCBtYXRjaGluZyAlcyBrZXk6ICVzIiwKLQkJCSAgICBrZXlfdHlwZShmb3VuZCksIGZwKTsKLQkJCXhmcmVlKGZwKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJlc3RvcmVfdWlkKCk7Ci0JZmNsb3NlKGYpOwotCWtleV9mcmVlKGZvdW5kKTsKLQlpZiAoIWZvdW5kX2tleSkKLQkJZGVidWcyKCJrZXkgbm90IGZvdW5kIik7Ci0JcmV0dXJuIGZvdW5kX2tleTsKLX0KLQotLyogQXV0aGVudGljYXRlIGEgY2VydGlmaWNhdGUga2V5IGFnYWluc3QgVHJ1c3RlZFVzZXJDQUtleXMgKi8KLXN0YXRpYyBpbnQKLXVzZXJfY2VydF90cnVzdGVkX2NhKHN0cnVjdCBwYXNzd2QgKnB3LCBLZXkgKmtleSkKLXsKLQljaGFyICpjYV9mcCwgKnByaW5jaXBhbHNfZmlsZSA9IE5VTEw7Ci0JY29uc3QgY2hhciAqcmVhc29uOwotCWludCByZXQgPSAwOwotCi0JaWYgKCFrZXlfaXNfY2VydChrZXkpIHx8IG9wdGlvbnMudHJ1c3RlZF91c2VyX2NhX2tleXMgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQljYV9mcCA9IGtleV9maW5nZXJwcmludChrZXktPmNlcnQtPnNpZ25hdHVyZV9rZXksCi0JICAgIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOwotCi0JaWYgKGtleV9pbl9maWxlKGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleSwKLQkgICAgb3B0aW9ucy50cnVzdGVkX3VzZXJfY2Ffa2V5cywgMSkgIT0gMSkgewotCQlkZWJ1ZzIoIiVzOiBDQSAlcyAlcyBpcyBub3QgbGlzdGVkIGluICVzIiwgX19mdW5jX18sCi0JCSAgICBrZXlfdHlwZShrZXktPmNlcnQtPnNpZ25hdHVyZV9rZXkpLCBjYV9mcCwKLQkJICAgIG9wdGlvbnMudHJ1c3RlZF91c2VyX2NhX2tleXMpOwotCQlnb3RvIG91dDsKLQl9Ci0JLyoKLQkgKiBJZiBBdXRob3JpemVkUHJpbmNpcGFscyBpcyBpbiB1c2UsIHRoZW4gY29tcGFyZSB0aGUgY2VydGlmaWNhdGUKLQkgKiBwcmluY2lwYWxzIGFnYWluc3QgdGhlIG5hbWVzIGluIHRoYXQgZmlsZSByYXRoZXIgdGhhbiBtYXRjaGluZwotCSAqIGFnYWluc3QgdGhlIHVzZXJuYW1lLgotCSAqLwotCWlmICgocHJpbmNpcGFsc19maWxlID0gYXV0aG9yaXplZF9wcmluY2lwYWxzX2ZpbGUocHcpKSAhPSBOVUxMKSB7Ci0JCWlmICghbWF0Y2hfcHJpbmNpcGFsc19maWxlKHByaW5jaXBhbHNfZmlsZSwgcHcsIGtleS0+Y2VydCkpIHsKLQkJCXJlYXNvbiA9ICJDZXJ0aWZpY2F0ZSBkb2VzIG5vdCBjb250YWluIGFuICIKLQkJCSAgICAiYXV0aG9yaXplZCBwcmluY2lwYWwiOwotIGZhaWxfcmVhc29uOgotCQkJZXJyb3IoIiVzIiwgcmVhc29uKTsKLQkJCWF1dGhfZGVidWdfYWRkKCIlcyIsIHJlYXNvbik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQlpZiAoa2V5X2NlcnRfY2hlY2tfYXV0aG9yaXR5KGtleSwgMCwgMSwKLQkgICAgcHJpbmNpcGFsc19maWxlID09IE5VTEwgPyBwdy0+cHdfbmFtZSA6IE5VTEwsICZyZWFzb24pICE9IDApCi0JCWdvdG8gZmFpbF9yZWFzb247Ci0JaWYgKGF1dGhfY2VydF9vcHRpb25zKGtleSwgcHcpICE9IDApCi0JCWdvdG8gb3V0OwotCi0JdmVyYm9zZSgiQWNjZXB0ZWQgY2VydGlmaWNhdGUgSUQgXCIlc1wiIHNpZ25lZCBieSAlcyBDQSAlcyB2aWEgJXMiLAotCSAgICBrZXktPmNlcnQtPmtleV9pZCwga2V5X3R5cGUoa2V5LT5jZXJ0LT5zaWduYXR1cmVfa2V5KSwgY2FfZnAsCi0JICAgIG9wdGlvbnMudHJ1c3RlZF91c2VyX2NhX2tleXMpOwotCXJldCA9IDE7Ci0KLSBvdXQ6Ci0JaWYgKHByaW5jaXBhbHNfZmlsZSAhPSBOVUxMKQotCQl4ZnJlZShwcmluY2lwYWxzX2ZpbGUpOwotCWlmIChjYV9mcCAhPSBOVUxMKQotCQl4ZnJlZShjYV9mcCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogY2hlY2sgd2hldGhlciBnaXZlbiBrZXkgaXMgaW4gLnNzaC9hdXRob3JpemVkX2tleXMqICovCi1pbnQKLXVzZXJfa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqcHcsIEtleSAqa2V5KQotewotCXVfaW50IHN1Y2Nlc3MsIGk7Ci0JY2hhciAqZmlsZTsKLQotCWlmIChhdXRoX2tleV9pc19yZXZva2VkKGtleSkpCi0JCXJldHVybiAwOwotCWlmIChrZXlfaXNfY2VydChrZXkpICYmIGF1dGhfa2V5X2lzX3Jldm9rZWQoa2V5LT5jZXJ0LT5zaWduYXR1cmVfa2V5KSkKLQkJcmV0dXJuIDA7Ci0KLQlzdWNjZXNzID0gdXNlcl9jZXJ0X3RydXN0ZWRfY2EocHcsIGtleSk7Ci0JaWYgKHN1Y2Nlc3MpCi0JCXJldHVybiBzdWNjZXNzOwotCi0JZm9yIChpID0gMDsgIXN1Y2Nlc3MgJiYgaSA8IG9wdGlvbnMubnVtX2F1dGhrZXlzX2ZpbGVzOyBpKyspIHsKLQkJZmlsZSA9IGV4cGFuZF9hdXRob3JpemVkX2tleXMoCi0JCSAgICBvcHRpb25zLmF1dGhvcml6ZWRfa2V5c19maWxlc1tpXSwgcHcpOwotCQlzdWNjZXNzID0gdXNlcl9rZXlfYWxsb3dlZDIocHcsIGtleSwgZmlsZSk7Ci0JCXhmcmVlKGZpbGUpOwotCX0KLQotCXJldHVybiBzdWNjZXNzOwotfQotCi1BdXRobWV0aG9kIG1ldGhvZF9wdWJrZXkgPSB7Ci0JInB1YmxpY2tleSIsCi0JdXNlcmF1dGhfcHVia2V5LAotCSZvcHRpb25zLnB1YmtleV9hdXRoZW50aWNhdGlvbgotfTsKZGlmZiAtLWdpdCBhL2F1dGgyLmMgYi9hdXRoMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZjOTVmLi4wMDAwMDAwCi0tLSBhL2F1dGgyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGF1dGgyLmMsdiAxLjEyMyAyMDExLzAzLzEwIDAyOjUyOjU3IGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJhdG9taWNpby5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAic2VydmNvbmYuaCIKLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotI2luY2x1ZGUgImF1dGguaCIKLSNpbmNsdWRlICJkaXNwYXRjaC5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotCi0jaWZkZWYgR1NTQVBJCi0jaW5jbHVkZSAic3NoLWdzcy5oIgotI2VuZGlmCi0jaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCi0KLS8qIGltcG9ydCAqLwotZXh0ZXJuIFNlcnZlck9wdGlvbnMgb3B0aW9uczsKLWV4dGVybiB1X2NoYXIgKnNlc3Npb25faWQyOwotZXh0ZXJuIHVfaW50IHNlc3Npb25faWQyX2xlbjsKLWV4dGVybiBCdWZmZXIgbG9naW5tc2c7Ci0KLS8qIG1ldGhvZHMgKi8KLQotZXh0ZXJuIEF1dGhtZXRob2QgbWV0aG9kX25vbmU7Ci1leHRlcm4gQXV0aG1ldGhvZCBtZXRob2RfcHVia2V5OwotZXh0ZXJuIEF1dGhtZXRob2QgbWV0aG9kX3Bhc3N3ZDsKLWV4dGVybiBBdXRobWV0aG9kIG1ldGhvZF9rYmRpbnQ7Ci1leHRlcm4gQXV0aG1ldGhvZCBtZXRob2RfaG9zdGJhc2VkOwotI2lmZGVmIEdTU0FQSQotZXh0ZXJuIEF1dGhtZXRob2QgbWV0aG9kX2dzc2FwaTsKLSNlbmRpZgotI2lmZGVmIEpQQUtFCi1leHRlcm4gQXV0aG1ldGhvZCBtZXRob2RfanBha2U7Ci0jZW5kaWYKLQotQXV0aG1ldGhvZCAqYXV0aG1ldGhvZHNbXSA9IHsKLQkmbWV0aG9kX25vbmUsCi0JJm1ldGhvZF9wdWJrZXksCi0jaWZkZWYgR1NTQVBJCi0JJm1ldGhvZF9nc3NhcGksCi0jZW5kaWYKLSNpZmRlZiBKUEFLRQotCSZtZXRob2RfanBha2UsCi0jZW5kaWYKLQkmbWV0aG9kX3Bhc3N3ZCwKLQkmbWV0aG9kX2tiZGludCwKLQkmbWV0aG9kX2hvc3RiYXNlZCwKLQlOVUxMCi19OwotCi0vKiBwcm90b2NvbCAqLwotCi1zdGF0aWMgdm9pZCBpbnB1dF9zZXJ2aWNlX3JlcXVlc3QoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Ci1zdGF0aWMgdm9pZCBpbnB1dF91c2VyYXV0aF9yZXF1ZXN0KGludCwgdV9pbnQzMl90LCB2b2lkICopOwotCi0vKiBoZWxwZXIgKi8KLXN0YXRpYyBBdXRobWV0aG9kICphdXRobWV0aG9kX2xvb2t1cChjb25zdCBjaGFyICopOwotc3RhdGljIGNoYXIgKmF1dGhtZXRob2RzX2dldCh2b2lkKTsKLQotY2hhciAqCi1hdXRoMl9yZWFkX2Jhbm5lcih2b2lkKQotewotCXN0cnVjdCBzdGF0IHN0OwotCWNoYXIgKmJhbm5lciA9IE5VTEw7Ci0Jc2l6ZV90IGxlbiwgbjsKLQlpbnQgZmQ7Ci0KLQlpZiAoKGZkID0gb3BlbihvcHRpb25zLmJhbm5lciwgT19SRE9OTFkpKSA9PSAtMSkKLQkJcmV0dXJuIChOVUxMKTsKLQlpZiAoZnN0YXQoZmQsICZzdCkgPT0gLTEpIHsKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQlpZiAoc3Quc3Rfc2l6ZSA+IDEqMTAyNCoxMDI0KSB7Ci0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0KLQlsZW4gPSAoc2l6ZV90KXN0LnN0X3NpemU7CQkvKiB0cnVuY2F0ZSAqLwotCWJhbm5lciA9IHhtYWxsb2MobGVuICsgMSk7Ci0JbiA9IGF0b21pY2lvKHJlYWQsIGZkLCBiYW5uZXIsIGxlbik7Ci0JY2xvc2UoZmQpOwotCi0JaWYgKG4gIT0gbGVuKSB7Ci0JCXhmcmVlKGJhbm5lcik7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCWJhbm5lcltuXSA9ICdcMCc7Ci0KLQlyZXR1cm4gKGJhbm5lcik7Ci19Ci0KLXZvaWQKLXVzZXJhdXRoX3NlbmRfYmFubmVyKGNvbnN0IGNoYXIgKm1zZykKLXsKLQlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX0JBTk5FUikKLQkJcmV0dXJuOwotCi0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX0JBTk5FUik7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKG1zZyk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKCIiKTsJCS8qIGxhbmd1YWdlLCB1bnVzZWQgKi8KLQlwYWNrZXRfc2VuZCgpOwotCWRlYnVnKCIlczogc2VudCIsIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIHZvaWQKLXVzZXJhdXRoX2Jhbm5lcih2b2lkKQotewotCWNoYXIgKmJhbm5lciA9IE5VTEw7Ci0KLQlpZiAob3B0aW9ucy5iYW5uZXIgPT0gTlVMTCB8fAotCSAgICBzdHJjYXNlY21wKG9wdGlvbnMuYmFubmVyLCAibm9uZSIpID09IDAgfHwKLQkgICAgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19CQU5ORVIpICE9IDApCi0JCXJldHVybjsKLQotCWlmICgoYmFubmVyID0gUFJJVlNFUChhdXRoMl9yZWFkX2Jhbm5lcigpKSkgPT0gTlVMTCkKLQkJZ290byBkb25lOwotCXVzZXJhdXRoX3NlbmRfYmFubmVyKGJhbm5lcik7Ci0KLWRvbmU6Ci0JaWYgKGJhbm5lcikKLQkJeGZyZWUoYmFubmVyKTsKLX0KLQotLyoKLSAqIGxvb3AgdW50aWwgYXV0aGN0eHQtPnN1Y2Nlc3MgPT0gVFJVRQotICovCi12b2lkCi1kb19hdXRoZW50aWNhdGlvbjIoQXV0aGN0eHQgKmF1dGhjdHh0KQotewotCWRpc3BhdGNoX2luaXQoJmRpc3BhdGNoX3Byb3RvY29sX2Vycm9yKTsKLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfU0VSVklDRV9SRVFVRVNULCAmaW5wdXRfc2VydmljZV9yZXF1ZXN0KTsKLQlkaXNwYXRjaF9ydW4oRElTUEFUQ0hfQkxPQ0ssICZhdXRoY3R4dC0+c3VjY2VzcywgYXV0aGN0eHQpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1pbnB1dF9zZXJ2aWNlX3JlcXVlc3QoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKLQl1X2ludCBsZW47Ci0JaW50IGFjY2VwdGl0ID0gMDsKLQljaGFyICpzZXJ2aWNlID0gcGFja2V0X2dldF9jc3RyaW5nKCZsZW4pOwotCXBhY2tldF9jaGVja19lb20oKTsKLQotCWlmIChhdXRoY3R4dCA9PSBOVUxMKQotCQlmYXRhbCgiaW5wdXRfc2VydmljZV9yZXF1ZXN0OiBubyBhdXRoY3R4dCIpOwotCi0JaWYgKHN0cmNtcChzZXJ2aWNlLCAic3NoLXVzZXJhdXRoIikgPT0gMCkgewotCQlpZiAoIWF1dGhjdHh0LT5zdWNjZXNzKSB7Ci0JCQlhY2NlcHRpdCA9IDE7Ci0JCQkvKiBub3cgd2UgY2FuIGhhbmRsZSB1c2VyLWF1dGggcmVxdWVzdHMgKi8KLQkJCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNULCAmaW5wdXRfdXNlcmF1dGhfcmVxdWVzdCk7Ci0JCX0KLQl9Ci0JLyogWFhYIGFsbCBvdGhlciBzZXJ2aWNlIHJlcXVlc3RzIGFyZSBkZW5pZWQgKi8KLQotCWlmIChhY2NlcHRpdCkgewotCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfU0VSVklDRV9BQ0NFUFQpOwotCQlwYWNrZXRfcHV0X2NzdHJpbmcoc2VydmljZSk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JCXBhY2tldF93cml0ZV93YWl0KCk7Ci0JfSBlbHNlIHsKLQkJZGVidWcoImJhZCBzZXJ2aWNlIHJlcXVlc3QgJXMiLCBzZXJ2aWNlKTsKLQkJcGFja2V0X2Rpc2Nvbm5lY3QoImJhZCBzZXJ2aWNlIHJlcXVlc3QgJXMiLCBzZXJ2aWNlKTsKLQl9Ci0JeGZyZWUoc2VydmljZSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWlucHV0X3VzZXJhdXRoX3JlcXVlc3QoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKLQlBdXRobWV0aG9kICptID0gTlVMTDsKLQljaGFyICp1c2VyLCAqc2VydmljZSwgKm1ldGhvZCwgKnN0eWxlID0gTlVMTDsKLQlpbnQgYXV0aGVudGljYXRlZCA9IDA7Ci0KLQlpZiAoYXV0aGN0eHQgPT0gTlVMTCkKLQkJZmF0YWwoImlucHV0X3VzZXJhdXRoX3JlcXVlc3Q6IG5vIGF1dGhjdHh0Iik7Ci0KLQl1c2VyID0gcGFja2V0X2dldF9jc3RyaW5nKE5VTEwpOwotCXNlcnZpY2UgPSBwYWNrZXRfZ2V0X2NzdHJpbmcoTlVMTCk7Ci0JbWV0aG9kID0gcGFja2V0X2dldF9jc3RyaW5nKE5VTEwpOwotCWRlYnVnKCJ1c2VyYXV0aC1yZXF1ZXN0IGZvciB1c2VyICVzIHNlcnZpY2UgJXMgbWV0aG9kICVzIiwgdXNlciwgc2VydmljZSwgbWV0aG9kKTsKLQlkZWJ1ZygiYXR0ZW1wdCAlZCBmYWlsdXJlcyAlZCIsIGF1dGhjdHh0LT5hdHRlbXB0LCBhdXRoY3R4dC0+ZmFpbHVyZXMpOwotCi0JaWYgKChzdHlsZSA9IHN0cmNocih1c2VyLCAnOicpKSAhPSBOVUxMKQotCQkqc3R5bGUrKyA9IDA7Ci0KLQlpZiAoYXV0aGN0eHQtPmF0dGVtcHQrKyA9PSAwKSB7Ci0JCS8qIHNldHVwIGF1dGggY29udGV4dCAqLwotCQlhdXRoY3R4dC0+cHcgPSBQUklWU0VQKGdldHB3bmFtYWxsb3codXNlcikpOwotCQlhdXRoY3R4dC0+dXNlciA9IHhzdHJkdXAodXNlcik7Ci0JCWlmIChhdXRoY3R4dC0+cHcgJiYgc3RyY21wKHNlcnZpY2UsICJzc2gtY29ubmVjdGlvbiIpPT0wKSB7Ci0JCQlhdXRoY3R4dC0+dmFsaWQgPSAxOwotCQkJZGVidWcyKCJpbnB1dF91c2VyYXV0aF9yZXF1ZXN0OiBzZXR0aW5nIHVwIGF1dGhjdHh0IGZvciAlcyIsIHVzZXIpOwotCQl9IGVsc2UgewotCQkJbG9naXQoImlucHV0X3VzZXJhdXRoX3JlcXVlc3Q6IGludmFsaWQgdXNlciAlcyIsIHVzZXIpOwotCQkJYXV0aGN0eHQtPnB3ID0gZmFrZXB3KCk7Ci0jaWZkZWYgU1NIX0FVRElUX0VWRU5UUwotCQkJUFJJVlNFUChhdWRpdF9ldmVudChTU0hfSU5WQUxJRF9VU0VSKSk7Ci0jZW5kaWYKLQkJfQotI2lmZGVmIFVTRV9QQU0KLQkJaWYgKG9wdGlvbnMudXNlX3BhbSkKLQkJCVBSSVZTRVAoc3RhcnRfcGFtKGF1dGhjdHh0KSk7Ci0jZW5kaWYKLQkJc2V0cHJvY3RpdGxlKCIlcyVzIiwgYXV0aGN0eHQtPnZhbGlkID8gdXNlciA6ICJ1bmtub3duIiwKLQkJICAgIHVzZV9wcml2c2VwID8gIiBbbmV0XSIgOiAiIik7Ci0JCWF1dGhjdHh0LT5zZXJ2aWNlID0geHN0cmR1cChzZXJ2aWNlKTsKLQkJYXV0aGN0eHQtPnN0eWxlID0gc3R5bGUgPyB4c3RyZHVwKHN0eWxlKSA6IE5VTEw7Ci0JCWlmICh1c2VfcHJpdnNlcCkKLQkJCW1tX2luZm9ybV9hdXRoc2VydihzZXJ2aWNlLCBzdHlsZSk7Ci0JCXVzZXJhdXRoX2Jhbm5lcigpOwotCX0gZWxzZSBpZiAoc3RyY21wKHVzZXIsIGF1dGhjdHh0LT51c2VyKSAhPSAwIHx8Ci0JICAgIHN0cmNtcChzZXJ2aWNlLCBhdXRoY3R4dC0+c2VydmljZSkgIT0gMCkgewotCQlwYWNrZXRfZGlzY29ubmVjdCgiQ2hhbmdlIG9mIHVzZXJuYW1lIG9yIHNlcnZpY2Ugbm90IGFsbG93ZWQ6ICIKLQkJICAgICIoJXMsJXMpIC0+ICglcywlcykiLAotCQkgICAgYXV0aGN0eHQtPnVzZXIsIGF1dGhjdHh0LT5zZXJ2aWNlLCB1c2VyLCBzZXJ2aWNlKTsKLQl9Ci0JLyogcmVzZXQgc3RhdGUgKi8KLQlhdXRoMl9jaGFsbGVuZ2Vfc3RvcChhdXRoY3R4dCk7Ci0jaWZkZWYgSlBBS0UKLQlhdXRoMl9qcGFrZV9zdG9wKGF1dGhjdHh0KTsKLSNlbmRpZgotCi0jaWZkZWYgR1NTQVBJCi0JLyogWFhYIG1vdmUgdG8gYXV0aDJfZ3NzYXBpX3N0b3AoKSAqLwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfVE9LRU4sIE5VTEwpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfRVhDSEFOR0VfQ09NUExFVEUsIE5VTEwpOwotI2VuZGlmCi0KLQlhdXRoY3R4dC0+cG9zdHBvbmVkID0gMDsKLQlhdXRoY3R4dC0+c2VydmVyX2NhdXNlZF9mYWlsdXJlID0gMDsKLQotCS8qIHRyeSB0byBhdXRoZW50aWNhdGUgdXNlciAqLwotCW0gPSBhdXRobWV0aG9kX2xvb2t1cChtZXRob2QpOwotCWlmIChtICE9IE5VTEwgJiYgYXV0aGN0eHQtPmZhaWx1cmVzIDwgb3B0aW9ucy5tYXhfYXV0aHRyaWVzKSB7Ci0JCWRlYnVnMigiaW5wdXRfdXNlcmF1dGhfcmVxdWVzdDogdHJ5IG1ldGhvZCAlcyIsIG1ldGhvZCk7Ci0JCWF1dGhlbnRpY2F0ZWQgPQltLT51c2VyYXV0aChhdXRoY3R4dCk7Ci0JfQotCXVzZXJhdXRoX2ZpbmlzaChhdXRoY3R4dCwgYXV0aGVudGljYXRlZCwgbWV0aG9kKTsKLQotCXhmcmVlKHNlcnZpY2UpOwotCXhmcmVlKHVzZXIpOwotCXhmcmVlKG1ldGhvZCk7Ci19Ci0KLXZvaWQKLXVzZXJhdXRoX2ZpbmlzaChBdXRoY3R4dCAqYXV0aGN0eHQsIGludCBhdXRoZW50aWNhdGVkLCBjaGFyICptZXRob2QpCi17Ci0JY2hhciAqbWV0aG9kczsKLQotCWlmICghYXV0aGN0eHQtPnZhbGlkICYmIGF1dGhlbnRpY2F0ZWQpCi0JCWZhdGFsKCJJTlRFUk5BTCBFUlJPUjogYXV0aGVudGljYXRlZCBpbnZhbGlkIHVzZXIgJXMiLAotCQkgICAgYXV0aGN0eHQtPnVzZXIpOwotCi0JLyogU3BlY2lhbCBoYW5kbGluZyBmb3Igcm9vdCAqLwotCWlmIChhdXRoZW50aWNhdGVkICYmIGF1dGhjdHh0LT5wdy0+cHdfdWlkID09IDAgJiYKLQkgICAgIWF1dGhfcm9vdF9hbGxvd2VkKG1ldGhvZCkpIHsKLQkJYXV0aGVudGljYXRlZCA9IDA7Ci0jaWZkZWYgU1NIX0FVRElUX0VWRU5UUwotCQlQUklWU0VQKGF1ZGl0X2V2ZW50KFNTSF9MT0dJTl9ST09UX0RFTklFRCkpOwotI2VuZGlmCi0JfQotCi0jaWZkZWYgVVNFX1BBTQotCWlmIChvcHRpb25zLnVzZV9wYW0gJiYgYXV0aGVudGljYXRlZCkgewotCQlpZiAoIVBSSVZTRVAoZG9fcGFtX2FjY291bnQoKSkpIHsKLQkJCS8qIGlmIFBBTSByZXR1cm5lZCBhIG1lc3NhZ2UsIHNlbmQgaXQgdG8gdGhlIHVzZXIgKi8KLQkJCWlmIChidWZmZXJfbGVuKCZsb2dpbm1zZykgPiAwKSB7Ci0JCQkJYnVmZmVyX2FwcGVuZCgmbG9naW5tc2csICJcMCIsIDEpOwotCQkJCXVzZXJhdXRoX3NlbmRfYmFubmVyKGJ1ZmZlcl9wdHIoJmxvZ2lubXNnKSk7Ci0JCQkJcGFja2V0X3dyaXRlX3dhaXQoKTsKLQkJCX0KLQkJCWZhdGFsKCJBY2Nlc3MgZGVuaWVkIGZvciB1c2VyICVzIGJ5IFBBTSBhY2NvdW50ICIKLQkJCSAgICAiY29uZmlndXJhdGlvbiIsIGF1dGhjdHh0LT51c2VyKTsKLQkJfQotCX0KLSNlbmRpZgotCi0jaWZkZWYgX1VOSUNPUwotCWlmIChhdXRoZW50aWNhdGVkICYmIGNyYXlfYWNjZXNzX2RlbmllZChhdXRoY3R4dC0+dXNlcikpIHsKLQkJYXV0aGVudGljYXRlZCA9IDA7Ci0JCWZhdGFsKCJBY2Nlc3MgZGVuaWVkIGZvciB1c2VyICVzLiIsYXV0aGN0eHQtPnVzZXIpOwotCX0KLSNlbmRpZiAvKiBfVU5JQ09TICovCi0KLQkvKiBMb2cgYmVmb3JlIHNlbmRpbmcgdGhlIHJlcGx5ICovCi0JYXV0aF9sb2coYXV0aGN0eHQsIGF1dGhlbnRpY2F0ZWQsIG1ldGhvZCwgIiBzc2gyIik7Ci0KLQlpZiAoYXV0aGN0eHQtPnBvc3Rwb25lZCkKLQkJcmV0dXJuOwotCi0JLyogWFhYIHRvZG86IGNoZWNrIGlmIG11bHRpcGxlIGF1dGggbWV0aG9kcyBhcmUgbmVlZGVkICovCi0JaWYgKGF1dGhlbnRpY2F0ZWQgPT0gMSkgewotCQkvKiB0dXJuIG9mZiB1c2VyYXV0aCAqLwotCQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfUkVRVUVTVCwgJmRpc3BhdGNoX3Byb3RvY29sX2lnbm9yZSk7Ci0JCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9TVUNDRVNTKTsKLQkJcGFja2V0X3NlbmQoKTsKLQkJcGFja2V0X3dyaXRlX3dhaXQoKTsKLQkJLyogbm93IHdlIGNhbiBicmVhayBvdXQgKi8KLQkJYXV0aGN0eHQtPnN1Y2Nlc3MgPSAxOwotCX0gZWxzZSB7Ci0KLQkJLyogQWxsb3cgaW5pdGlhbCB0cnkgb2YgIm5vbmUiIGF1dGggd2l0aG91dCBmYWlsdXJlIHBlbmFsdHkgKi8KLQkJaWYgKCFhdXRoY3R4dC0+c2VydmVyX2NhdXNlZF9mYWlsdXJlICYmCi0JCSAgICAoYXV0aGN0eHQtPmF0dGVtcHQgPiAxIHx8IHN0cmNtcChtZXRob2QsICJub25lIikgIT0gMCkpCi0JCQlhdXRoY3R4dC0+ZmFpbHVyZXMrKzsKLQkJaWYgKGF1dGhjdHh0LT5mYWlsdXJlcyA+PSBvcHRpb25zLm1heF9hdXRodHJpZXMpIHsKLSNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCi0JCQlQUklWU0VQKGF1ZGl0X2V2ZW50KFNTSF9MT0dJTl9FWENFRURfTUFYVFJJRVMpKTsKLSNlbmRpZgotCQkJcGFja2V0X2Rpc2Nvbm5lY3QoQVVUSF9GQUlMX01TRywgYXV0aGN0eHQtPnVzZXIpOwotCQl9Ci0JCW1ldGhvZHMgPSBhdXRobWV0aG9kc19nZXQoKTsKLQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX0ZBSUxVUkUpOwotCQlwYWNrZXRfcHV0X2NzdHJpbmcobWV0aG9kcyk7Ci0JCXBhY2tldF9wdXRfY2hhcigwKTsJLyogWFhYIHBhcnRpYWwgc3VjY2VzcywgdW51c2VkICovCi0JCXBhY2tldF9zZW5kKCk7Ci0JCXBhY2tldF93cml0ZV93YWl0KCk7Ci0JCXhmcmVlKG1ldGhvZHMpOwotCX0KLX0KLQotc3RhdGljIGNoYXIgKgotYXV0aG1ldGhvZHNfZ2V0KHZvaWQpCi17Ci0JQnVmZmVyIGI7Ci0JY2hhciAqbGlzdDsKLQlpbnQgaTsKLQotCWJ1ZmZlcl9pbml0KCZiKTsKLQlmb3IgKGkgPSAwOyBhdXRobWV0aG9kc1tpXSAhPSBOVUxMOyBpKyspIHsKLQkJaWYgKHN0cmNtcChhdXRobWV0aG9kc1tpXS0+bmFtZSwgIm5vbmUiKSA9PSAwKQotCQkJY29udGludWU7Ci0JCWlmIChhdXRobWV0aG9kc1tpXS0+ZW5hYmxlZCAhPSBOVUxMICYmCi0JCSAgICAqKGF1dGhtZXRob2RzW2ldLT5lbmFibGVkKSAhPSAwKSB7Ci0JCQlpZiAoYnVmZmVyX2xlbigmYikgPiAwKQotCQkJCWJ1ZmZlcl9hcHBlbmQoJmIsICIsIiwgMSk7Ci0JCQlidWZmZXJfYXBwZW5kKCZiLCBhdXRobWV0aG9kc1tpXS0+bmFtZSwKLQkJCSAgICBzdHJsZW4oYXV0aG1ldGhvZHNbaV0tPm5hbWUpKTsKLQkJfQotCX0KLQlidWZmZXJfYXBwZW5kKCZiLCAiXDAiLCAxKTsKLQlsaXN0ID0geHN0cmR1cChidWZmZXJfcHRyKCZiKSk7Ci0JYnVmZmVyX2ZyZWUoJmIpOwotCXJldHVybiBsaXN0OwotfQotCi1zdGF0aWMgQXV0aG1ldGhvZCAqCi1hdXRobWV0aG9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQotewotCWludCBpOwotCi0JaWYgKG5hbWUgIT0gTlVMTCkKLQkJZm9yIChpID0gMDsgYXV0aG1ldGhvZHNbaV0gIT0gTlVMTDsgaSsrKQotCQkJaWYgKGF1dGhtZXRob2RzW2ldLT5lbmFibGVkICE9IE5VTEwgJiYKLQkJCSAgICAqKGF1dGhtZXRob2RzW2ldLT5lbmFibGVkKSAhPSAwICYmCi0JCQkgICAgc3RyY21wKG5hbWUsIGF1dGhtZXRob2RzW2ldLT5uYW1lKSA9PSAwKQotCQkJCXJldHVybiBhdXRobWV0aG9kc1tpXTsKLQlkZWJ1ZzIoIlVucmVjb2duaXplZCBhdXRoZW50aWNhdGlvbiBtZXRob2QgbmFtZTogJXMiLAotCSAgICBuYW1lID8gbmFtZSA6ICJOVUxMIik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KZGlmZiAtLWdpdCBhL2F1dGhmZC5jIGIvYXV0aGZkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzdlODMuLjAwMDAwMDAKLS0tIGEvYXV0aGZkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MDggKzAsMCBAQAotLyogJE9wZW5CU0Q6IGF1dGhmZC5jLHYgMS44NiAyMDExLzA3LzA2IDE4OjA5OjIxIHRlZHUgRXhwICQgKi8KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiBGdW5jdGlvbnMgZm9yIGNvbm5lY3RpbmcgdGhlIGxvY2FsIGF1dGhlbnRpY2F0aW9uIGFnZW50LgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKgotICogU1NIMiBpbXBsZW1lbnRhdGlvbiwKLSAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdW4uaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgInJzYS5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImF1dGhmZC5oIgotI2luY2x1ZGUgImNpcGhlci5oIgotI2luY2x1ZGUgImtleC5oIgotI2luY2x1ZGUgImNvbXBhdC5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImF0b21pY2lvLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotCi1zdGF0aWMgaW50IGFnZW50X3ByZXNlbnQgPSAwOwotCi0vKiBoZWxwZXIgKi8KLWludAlkZWNvZGVfcmVwbHkoaW50IHR5cGUpOwotCi0vKiBtYWNybyB0byBjaGVjayBmb3IgImFnZW50IGZhaWx1cmUiIG1lc3NhZ2UgKi8KLSNkZWZpbmUgYWdlbnRfZmFpbGVkKHgpIFwKLSAgICAoKHggPT0gU1NIX0FHRU5UX0ZBSUxVUkUpIHx8ICh4ID09IFNTSF9DT01fQUdFTlQyX0ZBSUxVUkUpIHx8IFwKLSAgICAoeCA9PSBTU0gyX0FHRU5UX0ZBSUxVUkUpKQotCi1pbnQKLXNzaF9hZ2VudF9wcmVzZW50KHZvaWQpCi17Ci0JaW50IGF1dGhmZDsKLQotCWlmIChhZ2VudF9wcmVzZW50KQotCQlyZXR1cm4gMTsKLQlpZiAoKGF1dGhmZCA9IHNzaF9nZXRfYXV0aGVudGljYXRpb25fc29ja2V0KCkpID09IC0xKQotCQlyZXR1cm4gMDsKLQllbHNlIHsKLQkJc3NoX2Nsb3NlX2F1dGhlbnRpY2F0aW9uX3NvY2tldChhdXRoZmQpOwotCQlyZXR1cm4gMTsKLQl9Ci19Ci0KLS8qIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgYXV0aGVudGljYXRpb24gZmQsIG9yIC0xIGlmIHRoZXJlIGlzIG5vbmUuICovCi0KLWludAotc3NoX2dldF9hdXRoZW50aWNhdGlvbl9zb2NrZXQodm9pZCkKLXsKLQljb25zdCBjaGFyICphdXRoc29ja2V0OwotCWludCBzb2NrOwotCXN0cnVjdCBzb2NrYWRkcl91biBzdW5hZGRyOwotCi0JYXV0aHNvY2tldCA9IGdldGVudihTU0hfQVVUSFNPQ0tFVF9FTlZfTkFNRSk7Ci0JaWYgKCFhdXRoc29ja2V0KQotCQlyZXR1cm4gLTE7Ci0KLQliemVybygmc3VuYWRkciwgc2l6ZW9mKHN1bmFkZHIpKTsKLQlzdW5hZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOwotCXN0cmxjcHkoc3VuYWRkci5zdW5fcGF0aCwgYXV0aHNvY2tldCwgc2l6ZW9mKHN1bmFkZHIuc3VuX3BhdGgpKTsKLQotCXNvY2sgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApOwotCWlmIChzb2NrIDwgMCkKLQkJcmV0dXJuIC0xOwotCi0JLyogY2xvc2Ugb24gZXhlYyAqLwotCWlmIChmY250bChzb2NrLCBGX1NFVEZELCBGRF9DTE9FWEVDKSA9PSAtMSkgewotCQljbG9zZShzb2NrKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoY29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnN1bmFkZHIsIHNpemVvZiBzdW5hZGRyKSA8IDApIHsKLQkJY2xvc2Uoc29jayk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JYWdlbnRfcHJlc2VudCA9IDE7Ci0JcmV0dXJuIHNvY2s7Ci19Ci0KLXN0YXRpYyBpbnQKLXNzaF9yZXF1ZXN0X3JlcGx5KEF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqYXV0aCwgQnVmZmVyICpyZXF1ZXN0LCBCdWZmZXIgKnJlcGx5KQotewotCXVfaW50IGwsIGxlbjsKLQljaGFyIGJ1ZlsxMDI0XTsKLQotCS8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlLCBhbmQgZm9ybWF0IGl0IGluIHRoZSBidWZmZXIuICovCi0JbGVuID0gYnVmZmVyX2xlbihyZXF1ZXN0KTsKLQlwdXRfdTMyKGJ1ZiwgbGVuKTsKLQotCS8qIFNlbmQgdGhlIGxlbmd0aCBhbmQgdGhlbiB0aGUgcGFja2V0IHRvIHRoZSBhZ2VudC4gKi8KLQlpZiAoYXRvbWljaW8odndyaXRlLCBhdXRoLT5mZCwgYnVmLCA0KSAhPSA0IHx8Ci0JICAgIGF0b21pY2lvKHZ3cml0ZSwgYXV0aC0+ZmQsIGJ1ZmZlcl9wdHIocmVxdWVzdCksCi0JICAgIGJ1ZmZlcl9sZW4ocmVxdWVzdCkpICE9IGJ1ZmZlcl9sZW4ocmVxdWVzdCkpIHsKLQkJZXJyb3IoIkVycm9yIHdyaXRpbmcgdG8gYXV0aGVudGljYXRpb24gc29ja2V0LiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoKLQkgKiBXYWl0IGZvciByZXNwb25zZSBmcm9tIHRoZSBhZ2VudC4gIEZpcnN0IHJlYWQgdGhlIGxlbmd0aCBvZiB0aGUKLQkgKiByZXNwb25zZSBwYWNrZXQuCi0JICovCi0JaWYgKGF0b21pY2lvKHJlYWQsIGF1dGgtPmZkLCBidWYsIDQpICE9IDQpIHsKLQkgICAgZXJyb3IoIkVycm9yIHJlYWRpbmcgcmVzcG9uc2UgbGVuZ3RoIGZyb20gYXV0aGVudGljYXRpb24gc29ja2V0LiIpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0KLQkvKiBFeHRyYWN0IHRoZSBsZW5ndGgsIGFuZCBjaGVjayBpdCBmb3Igc2FuaXR5LiAqLwotCWxlbiA9IGdldF91MzIoYnVmKTsKLQlpZiAobGVuID4gMjU2ICogMTAyNCkKLQkJZmF0YWwoIkF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIHRvbyBsb25nOiAldSIsIGxlbik7Ci0KLQkvKiBSZWFkIHRoZSByZXN0IG9mIHRoZSByZXNwb25zZSBpbiB0byB0aGUgYnVmZmVyLiAqLwotCWJ1ZmZlcl9jbGVhcihyZXBseSk7Ci0Jd2hpbGUgKGxlbiA+IDApIHsKLQkJbCA9IGxlbjsKLQkJaWYgKGwgPiBzaXplb2YoYnVmKSkKLQkJCWwgPSBzaXplb2YoYnVmKTsKLQkJaWYgKGF0b21pY2lvKHJlYWQsIGF1dGgtPmZkLCBidWYsIGwpICE9IGwpIHsKLQkJCWVycm9yKCJFcnJvciByZWFkaW5nIHJlc3BvbnNlIGZyb20gYXV0aGVudGljYXRpb24gc29ja2V0LiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnVmZmVyX2FwcGVuZChyZXBseSwgYnVmLCBsKTsKLQkJbGVuIC09IGw7Ci0JfQotCXJldHVybiAxOwotfQotCi0vKgotICogQ2xvc2VzIHRoZSBhZ2VudCBzb2NrZXQgaWYgaXQgc2hvdWxkIGJlIGNsb3NlZCAoZGVwZW5kcyBvbiBob3cgaXQgd2FzCi0gKiBvYnRhaW5lZCkuICBUaGUgYXJndW1lbnQgbXVzdCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkKLSAqIHNzaF9nZXRfYXV0aGVudGljYXRpb25fc29ja2V0KCkuCi0gKi8KLQotdm9pZAotc3NoX2Nsb3NlX2F1dGhlbnRpY2F0aW9uX3NvY2tldChpbnQgc29jaykKLXsKLQlpZiAoZ2V0ZW52KFNTSF9BVVRIU09DS0VUX0VOVl9OQU1FKSkKLQkJY2xvc2Uoc29jayk7Ci19Ci0KLS8qCi0gKiBPcGVucyBhbmQgY29ubmVjdHMgYSBwcml2YXRlIHNvY2tldCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQotICogYXV0aGVudGljYXRpb24gYWdlbnQuICBSZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3IgKHdoaWNoIG11c3QgYmUKLSAqIHNodXQgZG93biBhbmQgY2xvc2VkIGJ5IHRoZSBjYWxsZXIgd2hlbiBubyBsb25nZXIgbmVlZGVkKS4KLSAqIFJldHVybnMgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZCBhbmQgdGhlIGNvbm5lY3Rpb24gY291bGQgbm90IGJlCi0gKiBvcGVuZWQuCi0gKi8KLQotQXV0aGVudGljYXRpb25Db25uZWN0aW9uICoKLXNzaF9nZXRfYXV0aGVudGljYXRpb25fY29ubmVjdGlvbih2b2lkKQotewotCUF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqYXV0aDsKLQlpbnQgc29jazsKLQotCXNvY2sgPSBzc2hfZ2V0X2F1dGhlbnRpY2F0aW9uX3NvY2tldCgpOwotCi0JLyoKLQkgKiBGYWlsIGlmIHdlIGNvdWxkbid0IG9idGFpbiBhIGNvbm5lY3Rpb24uICBUaGlzIGhhcHBlbnMgaWYgd2UKLQkgKiBleGl0ZWQgZHVlIHRvIGEgdGltZW91dC4KLQkgKi8KLQlpZiAoc29jayA8IDApCi0JCXJldHVybiBOVUxMOwotCi0JYXV0aCA9IHhtYWxsb2Moc2l6ZW9mKCphdXRoKSk7Ci0JYXV0aC0+ZmQgPSBzb2NrOwotCWJ1ZmZlcl9pbml0KCZhdXRoLT5pZGVudGl0aWVzKTsKLQlhdXRoLT5ob3dtYW55ID0gMDsKLQotCXJldHVybiBhdXRoOwotfQotCi0vKgotICogQ2xvc2VzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudCBhbmQgZnJlZXMgYW55IGFzc29jaWF0ZWQKLSAqIG1lbW9yeS4KLSAqLwotCi12b2lkCi1zc2hfY2xvc2VfYXV0aGVudGljYXRpb25fY29ubmVjdGlvbihBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmF1dGgpCi17Ci0JYnVmZmVyX2ZyZWUoJmF1dGgtPmlkZW50aXRpZXMpOwotCWNsb3NlKGF1dGgtPmZkKTsKLQl4ZnJlZShhdXRoKTsKLX0KLQotLyogTG9jay91bmxvY2sgYWdlbnQgKi8KLWludAotc3NoX2xvY2tfYWdlbnQoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphdXRoLCBpbnQgbG9jaywgY29uc3QgY2hhciAqcGFzc3dvcmQpCi17Ci0JaW50IHR5cGU7Ci0JQnVmZmVyIG1zZzsKLQotCWJ1ZmZlcl9pbml0KCZtc2cpOwotCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBsb2NrID8gU1NIX0FHRU5UQ19MT0NLIDogU1NIX0FHRU5UQ19VTkxPQ0spOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBwYXNzd29yZCk7Ci0KLQlpZiAoc3NoX3JlcXVlc3RfcmVwbHkoYXV0aCwgJm1zZywgJm1zZykgPT0gMCkgewotCQlidWZmZXJfZnJlZSgmbXNnKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJm1zZyk7Ci0JYnVmZmVyX2ZyZWUoJm1zZyk7Ci0JcmV0dXJuIGRlY29kZV9yZXBseSh0eXBlKTsKLX0KLQotLyoKLSAqIFJldHVybnMgdGhlIGZpcnN0IGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IGhlbGQgYnkgdGhlIGFnZW50LgotICovCi0KLWludAotc3NoX2dldF9udW1faWRlbnRpdGllcyhBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmF1dGgsIGludCB2ZXJzaW9uKQotewotCWludCB0eXBlLCBjb2RlMSA9IDAsIGNvZGUyID0gMDsKLQlCdWZmZXIgcmVxdWVzdDsKLQotCXN3aXRjaCAodmVyc2lvbikgewotCWNhc2UgMToKLQkJY29kZTEgPSBTU0hfQUdFTlRDX1JFUVVFU1RfUlNBX0lERU5USVRJRVM7Ci0JCWNvZGUyID0gU1NIX0FHRU5UX1JTQV9JREVOVElUSUVTX0FOU1dFUjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQljb2RlMSA9IFNTSDJfQUdFTlRDX1JFUVVFU1RfSURFTlRJVElFUzsKLQkJY29kZTIgPSBTU0gyX0FHRU5UX0lERU5USVRJRVNfQU5TV0VSOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBhZ2VudCByZXF1ZXN0aW5nIGZvciBhIGxpc3Qgb2YgdGhlCi0JICogaWRlbnRpdGllcyBpdCBjYW4gcmVwcmVzZW50LgotCSAqLwotCWJ1ZmZlcl9pbml0KCZyZXF1ZXN0KTsKLQlidWZmZXJfcHV0X2NoYXIoJnJlcXVlc3QsIGNvZGUxKTsKLQotCWJ1ZmZlcl9jbGVhcigmYXV0aC0+aWRlbnRpdGllcyk7Ci0JaWYgKHNzaF9yZXF1ZXN0X3JlcGx5KGF1dGgsICZyZXF1ZXN0LCAmYXV0aC0+aWRlbnRpdGllcykgPT0gMCkgewotCQlidWZmZXJfZnJlZSgmcmVxdWVzdCk7Ci0JCXJldHVybiAwOwotCX0KLQlidWZmZXJfZnJlZSgmcmVxdWVzdCk7Ci0KLQkvKiBHZXQgbWVzc2FnZSB0eXBlLCBhbmQgdmVyaWZ5IHRoYXQgd2UgZ290IGEgcHJvcGVyIGFuc3dlci4gKi8KLQl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZhdXRoLT5pZGVudGl0aWVzKTsKLQlpZiAoYWdlbnRfZmFpbGVkKHR5cGUpKSB7Ci0JCXJldHVybiAwOwotCX0gZWxzZSBpZiAodHlwZSAhPSBjb2RlMikgewotCQlmYXRhbCgiQmFkIGF1dGhlbnRpY2F0aW9uIHJlcGx5IG1lc3NhZ2UgdHlwZTogJWQiLCB0eXBlKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSByZXNwb25zZSBhbmQgY2hlY2sgaXQgZm9yIHNhbml0eS4gKi8KLQlhdXRoLT5ob3dtYW55ID0gYnVmZmVyX2dldF9pbnQoJmF1dGgtPmlkZW50aXRpZXMpOwotCWlmICgodV9pbnQpYXV0aC0+aG93bWFueSA+IDEwMjQpCi0JCWZhdGFsKCJUb28gbWFueSBpZGVudGl0aWVzIGluIGF1dGhlbnRpY2F0aW9uIHJlcGx5OiAlZCIsCi0JCSAgICBhdXRoLT5ob3dtYW55KTsKLQotCXJldHVybiBhdXRoLT5ob3dtYW55OwotfQotCi1LZXkgKgotc3NoX2dldF9maXJzdF9pZGVudGl0eShBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmF1dGgsIGNoYXIgKipjb21tZW50LCBpbnQgdmVyc2lvbikKLXsKLQkvKiBnZXQgbnVtYmVyIG9mIGlkZW50aXRpZXMgYW5kIHJldHVybiB0aGUgZmlyc3QgZW50cnkgKGlmIGFueSkuICovCi0JaWYgKHNzaF9nZXRfbnVtX2lkZW50aXRpZXMoYXV0aCwgdmVyc2lvbikgPiAwKQotCQlyZXR1cm4gc3NoX2dldF9uZXh0X2lkZW50aXR5KGF1dGgsIGNvbW1lbnQsIHZlcnNpb24pOwotCXJldHVybiBOVUxMOwotfQotCi1LZXkgKgotc3NoX2dldF9uZXh0X2lkZW50aXR5KEF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqYXV0aCwgY2hhciAqKmNvbW1lbnQsIGludCB2ZXJzaW9uKQotewotCWludCBrZXliaXRzOwotCXVfaW50IGJpdHM7Ci0JdV9jaGFyICpibG9iOwotCXVfaW50IGJsZW47Ci0JS2V5ICprZXkgPSBOVUxMOwotCi0JLyogUmV0dXJuIGZhaWx1cmUgaWYgbm8gbW9yZSBlbnRyaWVzLiAqLwotCWlmIChhdXRoLT5ob3dtYW55IDw9IDApCi0JCXJldHVybiBOVUxMOwotCi0JLyoKLQkgKiBHZXQgdGhlIG5leHQgZW50cnkgZnJvbSB0aGUgcGFja2V0LiAgVGhlc2Ugd2lsbCBhYm9ydCB3aXRoIGEgZmF0YWwKLQkgKiBlcnJvciBpZiB0aGUgcGFja2V0IGlzIHRvbyBzaG9ydCBvciBjb250YWlucyBjb3JydXB0IGRhdGEuCi0JICovCi0Jc3dpdGNoICh2ZXJzaW9uKSB7Ci0JY2FzZSAxOgotCQlrZXkgPSBrZXlfbmV3KEtFWV9SU0ExKTsKLQkJYml0cyA9IGJ1ZmZlcl9nZXRfaW50KCZhdXRoLT5pZGVudGl0aWVzKTsKLQkJYnVmZmVyX2dldF9iaWdudW0oJmF1dGgtPmlkZW50aXRpZXMsIGtleS0+cnNhLT5lKTsKLQkJYnVmZmVyX2dldF9iaWdudW0oJmF1dGgtPmlkZW50aXRpZXMsIGtleS0+cnNhLT5uKTsKLQkJKmNvbW1lbnQgPSBidWZmZXJfZ2V0X3N0cmluZygmYXV0aC0+aWRlbnRpdGllcywgTlVMTCk7Ci0JCWtleWJpdHMgPSBCTl9udW1fYml0cyhrZXktPnJzYS0+bik7Ci0JCWlmIChrZXliaXRzIDwgMCB8fCBiaXRzICE9ICh1X2ludClrZXliaXRzKQotCQkJbG9naXQoIldhcm5pbmc6IGlkZW50aXR5IGtleXNpemUgbWlzbWF0Y2g6IGFjdHVhbCAlZCwgYW5ub3VuY2VkICV1IiwKLQkJCSAgICBCTl9udW1fYml0cyhrZXktPnJzYS0+biksIGJpdHMpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWJsb2IgPSBidWZmZXJfZ2V0X3N0cmluZygmYXV0aC0+aWRlbnRpdGllcywgJmJsZW4pOwotCQkqY29tbWVudCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZhdXRoLT5pZGVudGl0aWVzLCBOVUxMKTsKLQkJa2V5ID0ga2V5X2Zyb21fYmxvYihibG9iLCBibGVuKTsKLQkJeGZyZWUoYmxvYik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBEZWNyZW1lbnQgdGhlIG51bWJlciBvZiByZW1haW5pbmcgZW50cmllcy4gKi8KLQlhdXRoLT5ob3dtYW55LS07Ci0JcmV0dXJuIGtleTsKLX0KLQotLyoKLSAqIEdlbmVyYXRlcyBhIHJhbmRvbSBjaGFsbGVuZ2UsIHNlbmRzIGl0IHRvIHRoZSBhZ2VudCwgYW5kIHdhaXRzIGZvcgotICogcmVzcG9uc2UgZnJvbSB0aGUgYWdlbnQuICBSZXR1cm5zIHRydWUgKG5vbi16ZXJvKSBpZiB0aGUgYWdlbnQgZ2F2ZSB0aGUKLSAqIGNvcnJlY3QgYW5zd2VyLCB6ZXJvIG90aGVyd2lzZS4gIFJlc3BvbnNlIHR5cGUgc2VsZWN0cyB0aGUgc3R5bGUgb2YKLSAqIHJlc3BvbnNlIGRlc2lyZWQsIHdpdGggMCBjb3JyZXNwb25kaW5nIHRvIHByb3RvY29sIHZlcnNpb24gMS4wIChubyBsb25nZXIKLSAqIHN1cHBvcnRlZCkgYW5kIDEgY29ycmVzcG9uZGluZyB0byBwcm90b2NvbCB2ZXJzaW9uIDEuMS4KLSAqLwotCi1pbnQKLXNzaF9kZWNyeXB0X2NoYWxsZW5nZShBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmF1dGgsCi0gICAgS2V5KiBrZXksIEJJR05VTSAqY2hhbGxlbmdlLAotICAgIHVfY2hhciBzZXNzaW9uX2lkWzE2XSwKLSAgICB1X2ludCByZXNwb25zZV90eXBlLAotICAgIHVfY2hhciByZXNwb25zZVsxNl0pCi17Ci0JQnVmZmVyIGJ1ZmZlcjsKLQlpbnQgc3VjY2VzcyA9IDA7Ci0JaW50IGk7Ci0JaW50IHR5cGU7Ci0KLQlpZiAoa2V5LT50eXBlICE9IEtFWV9SU0ExKQotCQlyZXR1cm4gMDsKLQlpZiAocmVzcG9uc2VfdHlwZSA9PSAwKSB7Ci0JCWxvZ2l0KCJDb21wYXRpYmlsaXR5IHdpdGggc3NoIHByb3RvY29sIHZlcnNpb24gMS4wIG5vIGxvbmdlciBzdXBwb3J0ZWQuIik7Ci0JCXJldHVybiAwOwotCX0KLQlidWZmZXJfaW5pdCgmYnVmZmVyKTsKLQlidWZmZXJfcHV0X2NoYXIoJmJ1ZmZlciwgU1NIX0FHRU5UQ19SU0FfQ0hBTExFTkdFKTsKLQlidWZmZXJfcHV0X2ludCgmYnVmZmVyLCBCTl9udW1fYml0cyhrZXktPnJzYS0+bikpOwotCWJ1ZmZlcl9wdXRfYmlnbnVtKCZidWZmZXIsIGtleS0+cnNhLT5lKTsKLQlidWZmZXJfcHV0X2JpZ251bSgmYnVmZmVyLCBrZXktPnJzYS0+bik7Ci0JYnVmZmVyX3B1dF9iaWdudW0oJmJ1ZmZlciwgY2hhbGxlbmdlKTsKLQlidWZmZXJfYXBwZW5kKCZidWZmZXIsIHNlc3Npb25faWQsIDE2KTsKLQlidWZmZXJfcHV0X2ludCgmYnVmZmVyLCByZXNwb25zZV90eXBlKTsKLQotCWlmIChzc2hfcmVxdWVzdF9yZXBseShhdXRoLCAmYnVmZmVyLCAmYnVmZmVyKSA9PSAwKSB7Ci0JCWJ1ZmZlcl9mcmVlKCZidWZmZXIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmYnVmZmVyKTsKLQotCWlmIChhZ2VudF9mYWlsZWQodHlwZSkpIHsKLQkJbG9naXQoIkFnZW50IGFkbWl0dGVkIGZhaWx1cmUgdG8gYXV0aGVudGljYXRlIHVzaW5nIHRoZSBrZXkuIik7Ci0JfSBlbHNlIGlmICh0eXBlICE9IFNTSF9BR0VOVF9SU0FfUkVTUE9OU0UpIHsKLQkJZmF0YWwoIkJhZCBhdXRoZW50aWNhdGlvbiByZXNwb25zZTogJWQiLCB0eXBlKTsKLQl9IGVsc2UgewotCQlzdWNjZXNzID0gMTsKLQkJLyoKLQkJICogR2V0IHRoZSByZXNwb25zZSBmcm9tIHRoZSBwYWNrZXQuICBUaGlzIHdpbGwgYWJvcnQgd2l0aCBhCi0JCSAqIGZhdGFsIGVycm9yIGlmIHRoZSBwYWNrZXQgaXMgY29ycnVwdC4KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQkJcmVzcG9uc2VbaV0gPSAodV9jaGFyKWJ1ZmZlcl9nZXRfY2hhcigmYnVmZmVyKTsKLQl9Ci0JYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7Ci0JcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLS8qIGFzayBhZ2VudCB0byBzaWduIGRhdGEsIHJldHVybnMgLTEgb24gZXJyb3IsIDAgb24gc3VjY2VzcyAqLwotaW50Ci1zc2hfYWdlbnRfc2lnbihBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmF1dGgsCi0gICAgS2V5ICprZXksCi0gICAgdV9jaGFyICoqc2lncCwgdV9pbnQgKmxlbnAsCi0gICAgdV9jaGFyICpkYXRhLCB1X2ludCBkYXRhbGVuKQotewotCWV4dGVybiBpbnQgZGF0YWZlbGxvd3M7Ci0JQnVmZmVyIG1zZzsKLQl1X2NoYXIgKmJsb2I7Ci0JdV9pbnQgYmxlbjsKLQlpbnQgdHlwZSwgZmxhZ3MgPSAwOwotCWludCByZXQgPSAtMTsKLQotCWlmIChrZXlfdG9fYmxvYihrZXksICZibG9iLCAmYmxlbikgPT0gMCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19TSUdCTE9CKQotCQlmbGFncyA9IFNTSF9BR0VOVF9PTERfU0lHTkFUVVJFOwotCi0JYnVmZmVyX2luaXQoJm1zZyk7Ci0JYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfQUdFTlRDX1NJR05fUkVRVUVTVCk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgYmxvYiwgYmxlbik7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgZGF0YSwgZGF0YWxlbik7Ci0JYnVmZmVyX3B1dF9pbnQoJm1zZywgZmxhZ3MpOwotCXhmcmVlKGJsb2IpOwotCi0JaWYgKHNzaF9yZXF1ZXN0X3JlcGx5KGF1dGgsICZtc2csICZtc2cpID09IDApIHsKLQkJYnVmZmVyX2ZyZWUoJm1zZyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbXNnKTsKLQlpZiAoYWdlbnRfZmFpbGVkKHR5cGUpKSB7Ci0JCWxvZ2l0KCJBZ2VudCBhZG1pdHRlZCBmYWlsdXJlIHRvIHNpZ24gdXNpbmcgdGhlIGtleS4iKTsKLQl9IGVsc2UgaWYgKHR5cGUgIT0gU1NIMl9BR0VOVF9TSUdOX1JFU1BPTlNFKSB7Ci0JCWZhdGFsKCJCYWQgYXV0aGVudGljYXRpb24gcmVzcG9uc2U6ICVkIiwgdHlwZSk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gMDsKLQkJKnNpZ3AgPSBidWZmZXJfZ2V0X3N0cmluZygmbXNnLCBsZW5wKTsKLQl9Ci0JYnVmZmVyX2ZyZWUoJm1zZyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogRW5jb2RlIGtleSBmb3IgYSBtZXNzYWdlIHRvIHRoZSBhZ2VudC4gKi8KLQotc3RhdGljIHZvaWQKLXNzaF9lbmNvZGVfaWRlbnRpdHlfcnNhMShCdWZmZXIgKmIsIFJTQSAqa2V5LCBjb25zdCBjaGFyICpjb21tZW50KQotewotCWJ1ZmZlcl9wdXRfaW50KGIsIEJOX251bV9iaXRzKGtleS0+bikpOwotCWJ1ZmZlcl9wdXRfYmlnbnVtKGIsIGtleS0+bik7Ci0JYnVmZmVyX3B1dF9iaWdudW0oYiwga2V5LT5lKTsKLQlidWZmZXJfcHV0X2JpZ251bShiLCBrZXktPmQpOwotCS8qIFRvIGtlZXAgd2l0aGluIHRoZSBwcm90b2NvbDogcCA8IHEgZm9yIHNzaC4gaW4gU1NMIHAgPiBxICovCi0JYnVmZmVyX3B1dF9iaWdudW0oYiwga2V5LT5pcW1wKTsJLyogc3NoIGtleS0+dSAqLwotCWJ1ZmZlcl9wdXRfYmlnbnVtKGIsIGtleS0+cSk7CS8qIHNzaCBrZXktPnAsIFNTTCBrZXktPnEgKi8KLQlidWZmZXJfcHV0X2JpZ251bShiLCBrZXktPnApOwkvKiBzc2gga2V5LT5xLCBTU0wga2V5LT5wICovCi0JYnVmZmVyX3B1dF9jc3RyaW5nKGIsIGNvbW1lbnQpOwotfQotCi1zdGF0aWMgdm9pZAotc3NoX2VuY29kZV9pZGVudGl0eV9zc2gyKEJ1ZmZlciAqYiwgS2V5ICprZXksIGNvbnN0IGNoYXIgKmNvbW1lbnQpCi17Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKGIsIGtleV9zc2hfbmFtZShrZXkpKTsKLQlzd2l0Y2ggKGtleS0+dHlwZSkgewotCWNhc2UgS0VZX1JTQToKLQkJYnVmZmVyX3B1dF9iaWdudW0yKGIsIGtleS0+cnNhLT5uKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKGIsIGtleS0+cnNhLT5lKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKGIsIGtleS0+cnNhLT5kKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKGIsIGtleS0+cnNhLT5pcW1wKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKGIsIGtleS0+cnNhLT5wKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKGIsIGtleS0+cnNhLT5xKTsKLQkJYnJlYWs7Ci0JY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX1JTQV9DRVJUOgotCQlpZiAoa2V5LT5jZXJ0ID09IE5VTEwgfHwgYnVmZmVyX2xlbigma2V5LT5jZXJ0LT5jZXJ0YmxvYikgPT0gMCkKLQkJCWZhdGFsKCIlczogbm8gY2VydC9jZXJ0YmxvYiIsIF9fZnVuY19fKTsKLQkJYnVmZmVyX3B1dF9zdHJpbmcoYiwgYnVmZmVyX3B0cigma2V5LT5jZXJ0LT5jZXJ0YmxvYiksCi0JCSAgICBidWZmZXJfbGVuKCZrZXktPmNlcnQtPmNlcnRibG9iKSk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPnJzYS0+ZCk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPnJzYS0+aXFtcCk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPnJzYS0+cCk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBrZXktPnJzYS0+cSk7Ci0JCWJyZWFrOwotCWNhc2UgS0VZX0RTQToKLQkJYnVmZmVyX3B1dF9iaWdudW0yKGIsIGtleS0+ZHNhLT5wKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKGIsIGtleS0+ZHNhLT5xKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKGIsIGtleS0+ZHNhLT5nKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKGIsIGtleS0+ZHNhLT5wdWJfa2V5KTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKGIsIGtleS0+ZHNhLT5wcml2X2tleSk7Ci0JCWJyZWFrOwotCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9EU0FfQ0VSVDoKLQkJaWYgKGtleS0+Y2VydCA9PSBOVUxMIHx8IGJ1ZmZlcl9sZW4oJmtleS0+Y2VydC0+Y2VydGJsb2IpID09IDApCi0JCQlmYXRhbCgiJXM6IG5vIGNlcnQvY2VydGJsb2IiLCBfX2Z1bmNfXyk7Ci0JCWJ1ZmZlcl9wdXRfc3RyaW5nKGIsIGJ1ZmZlcl9wdHIoJmtleS0+Y2VydC0+Y2VydGJsb2IpLAotCQkgICAgYnVmZmVyX2xlbigma2V5LT5jZXJ0LT5jZXJ0YmxvYikpOwotCQlidWZmZXJfcHV0X2JpZ251bTIoYiwga2V5LT5kc2EtPnByaXZfa2V5KTsKLQkJYnJlYWs7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JY2FzZSBLRVlfRUNEU0E6Ci0JCWJ1ZmZlcl9wdXRfY3N0cmluZyhiLCBrZXlfY3VydmVfbmlkX3RvX25hbWUoa2V5LT5lY2RzYV9uaWQpKTsKLQkJYnVmZmVyX3B1dF9lY3BvaW50KGIsIEVDX0tFWV9nZXQwX2dyb3VwKGtleS0+ZWNkc2EpLAotCQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShrZXktPmVjZHNhKSk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtMihiLCBFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShrZXktPmVjZHNhKSk7Ci0JCWJyZWFrOwotCWNhc2UgS0VZX0VDRFNBX0NFUlQ6Ci0JCWlmIChrZXktPmNlcnQgPT0gTlVMTCB8fCBidWZmZXJfbGVuKCZrZXktPmNlcnQtPmNlcnRibG9iKSA9PSAwKQotCQkJZmF0YWwoIiVzOiBubyBjZXJ0L2NlcnRibG9iIiwgX19mdW5jX18pOwotCQlidWZmZXJfcHV0X3N0cmluZyhiLCBidWZmZXJfcHRyKCZrZXktPmNlcnQtPmNlcnRibG9iKSwKLQkJICAgIGJ1ZmZlcl9sZW4oJmtleS0+Y2VydC0+Y2VydGJsb2IpKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKGIsIEVDX0tFWV9nZXQwX3ByaXZhdGVfa2V5KGtleS0+ZWNkc2EpKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQl9Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKGIsIGNvbW1lbnQpOwotfQotCi0vKgotICogQWRkcyBhbiBpZGVudGl0eSB0byB0aGUgYXV0aGVudGljYXRpb24gc2VydmVyLiAgVGhpcyBjYWxsIGlzIG5vdCBtZWFudCB0bwotICogYmUgdXNlZCBieSBub3JtYWwgYXBwbGljYXRpb25zLgotICovCi0KLWludAotc3NoX2FkZF9pZGVudGl0eV9jb25zdHJhaW5lZChBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmF1dGgsIEtleSAqa2V5LAotICAgIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHVfaW50IGxpZmUsIHVfaW50IGNvbmZpcm0pCi17Ci0JQnVmZmVyIG1zZzsKLQlpbnQgdHlwZSwgY29uc3RyYWluZWQgPSAobGlmZSB8fCBjb25maXJtKTsKLQotCWJ1ZmZlcl9pbml0KCZtc2cpOwotCi0Jc3dpdGNoIChrZXktPnR5cGUpIHsKLQljYXNlIEtFWV9SU0ExOgotCQl0eXBlID0gY29uc3RyYWluZWQgPwotCQkgICAgU1NIX0FHRU5UQ19BRERfUlNBX0lEX0NPTlNUUkFJTkVEIDoKLQkJICAgIFNTSF9BR0VOVENfQUREX1JTQV9JREVOVElUWTsKLQkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIHR5cGUpOwotCQlzc2hfZW5jb2RlX2lkZW50aXR5X3JzYTEoJm1zZywga2V5LT5yc2EsIGNvbW1lbnQpOwotCQlicmVhazsKLQljYXNlIEtFWV9SU0E6Ci0JY2FzZSBLRVlfUlNBX0NFUlQ6Ci0JY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX0RTQToKLQljYXNlIEtFWV9EU0FfQ0VSVDoKLQljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6Ci0JY2FzZSBLRVlfRUNEU0E6Ci0JY2FzZSBLRVlfRUNEU0FfQ0VSVDoKLQkJdHlwZSA9IGNvbnN0cmFpbmVkID8KLQkJICAgIFNTSDJfQUdFTlRDX0FERF9JRF9DT05TVFJBSU5FRCA6Ci0JCSAgICBTU0gyX0FHRU5UQ19BRERfSURFTlRJVFk7Ci0JCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCB0eXBlKTsKLQkJc3NoX2VuY29kZV9pZGVudGl0eV9zc2gyKCZtc2csIGtleSwgY29tbWVudCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGNvbnN0cmFpbmVkKSB7Ci0JCWlmIChsaWZlICE9IDApIHsKLQkJCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0hfQUdFTlRfQ09OU1RSQUlOX0xJRkVUSU1FKTsKLQkJCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGxpZmUpOwotCQl9Ci0JCWlmIChjb25maXJtICE9IDApCi0JCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIX0FHRU5UX0NPTlNUUkFJTl9DT05GSVJNKTsKLQl9Ci0JaWYgKHNzaF9yZXF1ZXN0X3JlcGx5KGF1dGgsICZtc2csICZtc2cpID09IDApIHsKLQkJYnVmZmVyX2ZyZWUoJm1zZyk7Ci0JCXJldHVybiAwOwotCX0KLQl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZtc2cpOwotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCXJldHVybiBkZWNvZGVfcmVwbHkodHlwZSk7Ci19Ci0KLS8qCi0gKiBSZW1vdmVzIGFuIGlkZW50aXR5IGZyb20gdGhlIGF1dGhlbnRpY2F0aW9uIHNlcnZlci4gIFRoaXMgY2FsbCBpcyBub3QKLSAqIG1lYW50IHRvIGJlIHVzZWQgYnkgbm9ybWFsIGFwcGxpY2F0aW9ucy4KLSAqLwotCi1pbnQKLXNzaF9yZW1vdmVfaWRlbnRpdHkoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphdXRoLCBLZXkgKmtleSkKLXsKLQlCdWZmZXIgbXNnOwotCWludCB0eXBlOwotCXVfY2hhciAqYmxvYjsKLQl1X2ludCBibGVuOwotCi0JYnVmZmVyX2luaXQoJm1zZyk7Ci0KLQlpZiAoa2V5LT50eXBlID09IEtFWV9SU0ExKSB7Ci0JCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0hfQUdFTlRDX1JFTU9WRV9SU0FfSURFTlRJVFkpOwotCQlidWZmZXJfcHV0X2ludCgmbXNnLCBCTl9udW1fYml0cyhrZXktPnJzYS0+bikpOwotCQlidWZmZXJfcHV0X2JpZ251bSgmbXNnLCBrZXktPnJzYS0+ZSk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtKCZtc2csIGtleS0+cnNhLT5uKTsKLQl9IGVsc2UgaWYgKGtleV90eXBlX3BsYWluKGtleS0+dHlwZSkgPT0gS0VZX0RTQSB8fAotCSAgICBrZXlfdHlwZV9wbGFpbihrZXktPnR5cGUpID09IEtFWV9SU0EgfHwKLQkgICAga2V5X3R5cGVfcGxhaW4oa2V5LT50eXBlKSA9PSBLRVlfRUNEU0EpIHsKLQkJa2V5X3RvX2Jsb2Ioa2V5LCAmYmxvYiwgJmJsZW4pOwotCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9BR0VOVENfUkVNT1ZFX0lERU5USVRZKTsKLQkJYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgYmxvYiwgYmxlbik7Ci0JCXhmcmVlKGJsb2IpOwotCX0gZWxzZSB7Ci0JCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHNzaF9yZXF1ZXN0X3JlcGx5KGF1dGgsICZtc2csICZtc2cpID09IDApIHsKLQkJYnVmZmVyX2ZyZWUoJm1zZyk7Ci0JCXJldHVybiAwOwotCX0KLQl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZtc2cpOwotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCXJldHVybiBkZWNvZGVfcmVwbHkodHlwZSk7Ci19Ci0KLWludAotc3NoX3VwZGF0ZV9jYXJkKEF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqYXV0aCwgaW50IGFkZCwKLSAgICBjb25zdCBjaGFyICpyZWFkZXJfaWQsIGNvbnN0IGNoYXIgKnBpbiwgdV9pbnQgbGlmZSwgdV9pbnQgY29uZmlybSkKLXsKLQlCdWZmZXIgbXNnOwotCWludCB0eXBlLCBjb25zdHJhaW5lZCA9IChsaWZlIHx8IGNvbmZpcm0pOwotCi0JaWYgKGFkZCkgewotCQl0eXBlID0gY29uc3RyYWluZWQgPwotCQkgICAgU1NIX0FHRU5UQ19BRERfU01BUlRDQVJEX0tFWV9DT05TVFJBSU5FRCA6Ci0JCSAgICBTU0hfQUdFTlRDX0FERF9TTUFSVENBUkRfS0VZOwotCX0gZWxzZQotCQl0eXBlID0gU1NIX0FHRU5UQ19SRU1PVkVfU01BUlRDQVJEX0tFWTsKLQotCWJ1ZmZlcl9pbml0KCZtc2cpOwotCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCB0eXBlKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgcmVhZGVyX2lkKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgcGluKTsKLQotCWlmIChjb25zdHJhaW5lZCkgewotCQlpZiAobGlmZSAhPSAwKSB7Ci0JCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIX0FHRU5UX0NPTlNUUkFJTl9MSUZFVElNRSk7Ci0JCQlidWZmZXJfcHV0X2ludCgmbXNnLCBsaWZlKTsKLQkJfQotCQlpZiAoY29uZmlybSAhPSAwKQotCQkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSF9BR0VOVF9DT05TVFJBSU5fQ09ORklSTSk7Ci0JfQotCi0JaWYgKHNzaF9yZXF1ZXN0X3JlcGx5KGF1dGgsICZtc2csICZtc2cpID09IDApIHsKLQkJYnVmZmVyX2ZyZWUoJm1zZyk7Ci0JCXJldHVybiAwOwotCX0KLQl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZtc2cpOwotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCXJldHVybiBkZWNvZGVfcmVwbHkodHlwZSk7Ci19Ci0KLS8qCi0gKiBSZW1vdmVzIGFsbCBpZGVudGl0aWVzIGZyb20gdGhlIGFnZW50LiAgVGhpcyBjYWxsIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkCi0gKiBieSBub3JtYWwgYXBwbGljYXRpb25zLgotICovCi0KLWludAotc3NoX3JlbW92ZV9hbGxfaWRlbnRpdGllcyhBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmF1dGgsIGludCB2ZXJzaW9uKQotewotCUJ1ZmZlciBtc2c7Ci0JaW50IHR5cGU7Ci0JaW50IGNvZGUgPSAodmVyc2lvbj09MSkgPwotCQlTU0hfQUdFTlRDX1JFTU9WRV9BTExfUlNBX0lERU5USVRJRVMgOgotCQlTU0gyX0FHRU5UQ19SRU1PVkVfQUxMX0lERU5USVRJRVM7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQlidWZmZXJfcHV0X2NoYXIoJm1zZywgY29kZSk7Ci0KLQlpZiAoc3NoX3JlcXVlc3RfcmVwbHkoYXV0aCwgJm1zZywgJm1zZykgPT0gMCkgewotCQlidWZmZXJfZnJlZSgmbXNnKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJm1zZyk7Ci0JYnVmZmVyX2ZyZWUoJm1zZyk7Ci0JcmV0dXJuIGRlY29kZV9yZXBseSh0eXBlKTsKLX0KLQotaW50Ci1kZWNvZGVfcmVwbHkoaW50IHR5cGUpCi17Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBTU0hfQUdFTlRfRkFJTFVSRToKLQljYXNlIFNTSF9DT01fQUdFTlQyX0ZBSUxVUkU6Ci0JY2FzZSBTU0gyX0FHRU5UX0ZBSUxVUkU6Ci0JCWxvZ2l0KCJTU0hfQUdFTlRfRkFJTFVSRSIpOwotCQlyZXR1cm4gMDsKLQljYXNlIFNTSF9BR0VOVF9TVUNDRVNTOgotCQlyZXR1cm4gMTsKLQlkZWZhdWx0OgotCQlmYXRhbCgiQmFkIHJlc3BvbnNlIGZyb20gYXV0aGVudGljYXRpb24gYWdlbnQ6ICVkIiwgdHlwZSk7Ci0JfQotCS8qIE5PVFJFQUNIRUQgKi8KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2F1dGhmZC5oIGIvYXV0aGZkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ODJhMjcuLjAwMDAwMDAKLS0tIGEvYXV0aGZkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKiAkT3BlbkJTRDogYXV0aGZkLmgsdiAxLjM3IDIwMDkvMDgvMjcgMTc6NDQ6NTIgZGptIEV4cCAkICovCi0KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiBGdW5jdGlvbnMgdG8gaW50ZXJmYWNlIHdpdGggdGhlIFNTSF9BVVRIRU5USUNBVElPTl9GRCBzb2NrZXQuCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotCi0jaWZuZGVmIEFVVEhGRF9ICi0jZGVmaW5lIEFVVEhGRF9ICi0KLS8qIE1lc3NhZ2VzIGZvciB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQgY29ubmVjdGlvbi4gKi8KLSNkZWZpbmUgU1NIX0FHRU5UQ19SRVFVRVNUX1JTQV9JREVOVElUSUVTCTEKLSNkZWZpbmUgU1NIX0FHRU5UX1JTQV9JREVOVElUSUVTX0FOU1dFUgkJMgotI2RlZmluZSBTU0hfQUdFTlRDX1JTQV9DSEFMTEVOR0UJCTMKLSNkZWZpbmUgU1NIX0FHRU5UX1JTQV9SRVNQT05TRQkJCTQKLSNkZWZpbmUgU1NIX0FHRU5UX0ZBSUxVUkUJCQk1Ci0jZGVmaW5lIFNTSF9BR0VOVF9TVUNDRVNTCQkJNgotI2RlZmluZSBTU0hfQUdFTlRDX0FERF9SU0FfSURFTlRJVFkJCTcKLSNkZWZpbmUgU1NIX0FHRU5UQ19SRU1PVkVfUlNBX0lERU5USVRZCQk4Ci0jZGVmaW5lIFNTSF9BR0VOVENfUkVNT1ZFX0FMTF9SU0FfSURFTlRJVElFUwk5Ci0KLS8qIHByaXZhdGUgT3BlblNTSCBleHRlbnNpb25zIGZvciBTU0gyICovCi0jZGVmaW5lIFNTSDJfQUdFTlRDX1JFUVVFU1RfSURFTlRJVElFUwkJMTEKLSNkZWZpbmUgU1NIMl9BR0VOVF9JREVOVElUSUVTX0FOU1dFUgkJMTIKLSNkZWZpbmUgU1NIMl9BR0VOVENfU0lHTl9SRVFVRVNUCQkxMwotI2RlZmluZSBTU0gyX0FHRU5UX1NJR05fUkVTUE9OU0UJCTE0Ci0jZGVmaW5lIFNTSDJfQUdFTlRDX0FERF9JREVOVElUWQkJMTcKLSNkZWZpbmUgU1NIMl9BR0VOVENfUkVNT1ZFX0lERU5USVRZCQkxOAotI2RlZmluZSBTU0gyX0FHRU5UQ19SRU1PVkVfQUxMX0lERU5USVRJRVMJMTkKLQotLyogc21hcnRjYXJkICovCi0jZGVmaW5lIFNTSF9BR0VOVENfQUREX1NNQVJUQ0FSRF9LRVkJCTIwCi0jZGVmaW5lIFNTSF9BR0VOVENfUkVNT1ZFX1NNQVJUQ0FSRF9LRVkJCTIxCi0KLS8qIGxvY2svdW5sb2NrIHRoZSBhZ2VudCAqLwotI2RlZmluZSBTU0hfQUdFTlRDX0xPQ0sJCQkJMjIKLSNkZWZpbmUgU1NIX0FHRU5UQ19VTkxPQ0sJCQkyMwotCi0vKiBhZGQga2V5IHdpdGggY29uc3RyYWludHMgKi8KLSNkZWZpbmUgU1NIX0FHRU5UQ19BRERfUlNBX0lEX0NPTlNUUkFJTkVECTI0Ci0jZGVmaW5lIFNTSDJfQUdFTlRDX0FERF9JRF9DT05TVFJBSU5FRAkJMjUKLSNkZWZpbmUgU1NIX0FHRU5UQ19BRERfU01BUlRDQVJEX0tFWV9DT05TVFJBSU5FRCAyNgotCi0jZGVmaW5lCVNTSF9BR0VOVF9DT05TVFJBSU5fTElGRVRJTUUJCTEKLSNkZWZpbmUJU1NIX0FHRU5UX0NPTlNUUkFJTl9DT05GSVJNCQkyCi0KLS8qIGV4dGVuZGVkIGZhaWx1cmUgbWVzc2FnZXMgKi8KLSNkZWZpbmUgU1NIMl9BR0VOVF9GQUlMVVJFCQkJMzAKLQotLyogYWRkaXRpb25hbCBlcnJvciBjb2RlIGZvciBzc2guY29tJ3Mgc3NoLWFnZW50MiAqLwotI2RlZmluZSBTU0hfQ09NX0FHRU5UMl9GQUlMVVJFCQkJMTAyCi0KLSNkZWZpbmUJU1NIX0FHRU5UX09MRF9TSUdOQVRVUkUJCQkweDAxCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQJZmQ7Ci0JQnVmZmVyCWlkZW50aXRpZXM7Ci0JaW50CWhvd21hbnk7Ci19CUF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbjsKLQotaW50CXNzaF9hZ2VudF9wcmVzZW50KHZvaWQpOwotaW50CXNzaF9nZXRfYXV0aGVudGljYXRpb25fc29ja2V0KHZvaWQpOwotdm9pZAlzc2hfY2xvc2VfYXV0aGVudGljYXRpb25fc29ja2V0KGludCk7Ci0KLUF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqc3NoX2dldF9hdXRoZW50aWNhdGlvbl9jb25uZWN0aW9uKHZvaWQpOwotdm9pZAlzc2hfY2xvc2VfYXV0aGVudGljYXRpb25fY29ubmVjdGlvbihBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKik7Ci1pbnQJIHNzaF9nZXRfbnVtX2lkZW50aXRpZXMoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICosIGludCk7Ci1LZXkJKnNzaF9nZXRfZmlyc3RfaWRlbnRpdHkoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICosIGNoYXIgKiosIGludCk7Ci1LZXkJKnNzaF9nZXRfbmV4dF9pZGVudGl0eShBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKiwgY2hhciAqKiwgaW50KTsKLWludAkgc3NoX2FkZF9pZGVudGl0eV9jb25zdHJhaW5lZChBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKiwgS2V5ICosCi0gICAgY29uc3QgY2hhciAqLCB1X2ludCwgdV9pbnQpOwotaW50CSBzc2hfcmVtb3ZlX2lkZW50aXR5KEF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqLCBLZXkgKik7Ci1pbnQJIHNzaF9yZW1vdmVfYWxsX2lkZW50aXRpZXMoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICosIGludCk7Ci1pbnQJIHNzaF9sb2NrX2FnZW50KEF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqLCBpbnQsIGNvbnN0IGNoYXIgKik7Ci1pbnQJIHNzaF91cGRhdGVfY2FyZChBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKiwgaW50LCBjb25zdCBjaGFyICosCi0gICAgY29uc3QgY2hhciAqLCB1X2ludCwgdV9pbnQpOwotCi1pbnQKLXNzaF9kZWNyeXB0X2NoYWxsZW5nZShBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKiwgS2V5ICosIEJJR05VTSAqLCB1X2NoYXJbMTZdLAotICAgIHVfaW50LCB1X2NoYXJbMTZdKTsKLQotaW50Ci1zc2hfYWdlbnRfc2lnbihBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKiwgS2V5ICosIHVfY2hhciAqKiwgdV9pbnQgKiwgdV9jaGFyICosCi0gICAgdV9pbnQpOwotCi0jZW5kaWYJCQkJLyogQVVUSEZEX0ggKi8KZGlmZiAtLWdpdCBhL2F1dGhmaWxlLmMgYi9hdXRoZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDdlNTNjLi4wMDAwMDAwCi0tLSBhL2F1dGhmaWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NDYgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGF1dGhmaWxlLmMsdiAxLjkyIDIwMTEvMDYvMTQgMjI6NDk6MTggbWFya3VzIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBpZGVudGl0eSBmaWxlcywgYW5kCi0gKiBmb3IgcmVhZGluZyB0aGUgcGFzc3BocmFzZSBmcm9tIHRoZSB1c2VyLgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgotCi0vKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIG9yIGJyb2tlbiBPcGVuU1NMIHZlcnNpb25zICovCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImNpcGhlci5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImF1dGhmaWxlLmgiCi0jaW5jbHVkZSAicnNhLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImF0b21pY2lvLmgiCi0KLSNkZWZpbmUgTUFYX0tFWV9GSUxFX1NJWkUJKDEwMjQgKiAxMDI0KQotCi0vKiBWZXJzaW9uIGlkZW50aWZpY2F0aW9uIHN0cmluZyBmb3IgU1NIIHYxIGlkZW50aXR5IGZpbGVzLiAqLwotc3RhdGljIGNvbnN0IGNoYXIgYXV0aGZpbGVfaWRfc3RyaW5nW10gPQotICAgICJTU0ggUFJJVkFURSBLRVkgRklMRSBGT1JNQVQgMS4xXG4iOwotCi0vKgotICogU2VyaWFsaXNlcyB0aGUgYXV0aGVudGljYXRpb24gKHByaXZhdGUpIGtleSB0byBhIGJsb2IsIGVuY3J5cHRpbmcgaXQgd2l0aAotICogcGFzc3BocmFzZS4gIFRoZSBpZGVudGlmaWNhdGlvbiBvZiB0aGUgYmxvYiAobG93ZXN0IDY0IGJpdHMgb2Ygbikgd2lsbAotICogcHJlY2VkZSB0aGUga2V5IHRvIHByb3ZpZGUgaWRlbnRpZmljYXRpb24gb2YgdGhlIGtleSB3aXRob3V0IG5lZWRpbmcgYQotICogcGFzc3BocmFzZS4KLSAqLwotc3RhdGljIGludAota2V5X3ByaXZhdGVfcnNhMV90b19ibG9iKEtleSAqa2V5LCBCdWZmZXIgKmJsb2IsIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsCi0gICAgY29uc3QgY2hhciAqY29tbWVudCkKLXsKLQlCdWZmZXIgYnVmZmVyLCBlbmNyeXB0ZWQ7Ci0JdV9jaGFyIGJ1ZlsxMDBdLCAqY3A7Ci0JaW50IGksIGNpcGhlcl9udW07Ci0JQ2lwaGVyQ29udGV4dCBjaXBoZXJjb250ZXh0OwotCUNpcGhlciAqY2lwaGVyOwotCXVfaW50MzJfdCBybmQ7Ci0KLQkvKgotCSAqIElmIHRoZSBwYXNzcGhyYXNlIGlzIGVtcHR5LCB1c2UgU1NIX0NJUEhFUl9OT05FIHRvIGVhc2UgY29udmVydGluZwotCSAqIHRvIGFub3RoZXIgY2lwaGVyOyBvdGhlcndpc2UgdXNlIFNTSF9BVVRIRklMRV9DSVBIRVIuCi0JICovCi0JY2lwaGVyX251bSA9IChzdHJjbXAocGFzc3BocmFzZSwgIiIpID09IDApID8KLQkgICAgU1NIX0NJUEhFUl9OT05FIDogU1NIX0FVVEhGSUxFX0NJUEhFUjsKLQlpZiAoKGNpcGhlciA9IGNpcGhlcl9ieV9udW1iZXIoY2lwaGVyX251bSkpID09IE5VTEwpCi0JCWZhdGFsKCJzYXZlX3ByaXZhdGVfa2V5X3JzYTogYmFkIGNpcGhlciIpOwotCi0JLyogVGhpcyBidWZmZXIgaXMgdXNlZCB0byBidWlsdCB0aGUgc2VjcmV0IHBhcnQgb2YgdGhlIHByaXZhdGUga2V5LiAqLwotCWJ1ZmZlcl9pbml0KCZidWZmZXIpOwotCi0JLyogUHV0IGNoZWNrYnl0ZXMgZm9yIGNoZWNraW5nIHBhc3NwaHJhc2UgdmFsaWRpdHkuICovCi0Jcm5kID0gYXJjNHJhbmRvbSgpOwotCWJ1ZlswXSA9IHJuZCAmIDB4ZmY7Ci0JYnVmWzFdID0gKHJuZCA+PiA4KSAmIDB4ZmY7Ci0JYnVmWzJdID0gYnVmWzBdOwotCWJ1ZlszXSA9IGJ1ZlsxXTsKLQlidWZmZXJfYXBwZW5kKCZidWZmZXIsIGJ1ZiwgNCk7Ci0KLQkvKgotCSAqIFN0b3JlIHRoZSBwcml2YXRlIGtleSAobiBhbmQgZSB3aWxsIG5vdCBiZSBzdG9yZWQgYmVjYXVzZSB0aGV5Ci0JICogd2lsbCBiZSBzdG9yZWQgaW4gcGxhaW4gdGV4dCwgYW5kIHN0b3JpbmcgdGhlbSBhbHNvIGluIGVuY3J5cHRlZAotCSAqIGZvcm1hdCB3b3VsZCBqdXN0IGdpdmUga25vd24gcGxhaW50ZXh0KS4KLQkgKi8KLQlidWZmZXJfcHV0X2JpZ251bSgmYnVmZmVyLCBrZXktPnJzYS0+ZCk7Ci0JYnVmZmVyX3B1dF9iaWdudW0oJmJ1ZmZlciwga2V5LT5yc2EtPmlxbXApOwotCWJ1ZmZlcl9wdXRfYmlnbnVtKCZidWZmZXIsIGtleS0+cnNhLT5xKTsJLyogcmV2ZXJzZSBmcm9tIFNTTCBwICovCi0JYnVmZmVyX3B1dF9iaWdudW0oJmJ1ZmZlciwga2V5LT5yc2EtPnApOwkvKiByZXZlcnNlIGZyb20gU1NMIHEgKi8KLQotCS8qIFBhZCB0aGUgcGFydCB0byBiZSBlbmNyeXB0ZWQgdW50aWwgaXRzIHNpemUgaXMgYSBtdWx0aXBsZSBvZiA4LiAqLwotCXdoaWxlIChidWZmZXJfbGVuKCZidWZmZXIpICUgOCAhPSAwKQotCQlidWZmZXJfcHV0X2NoYXIoJmJ1ZmZlciwgMCk7Ci0KLQkvKiBUaGlzIGJ1ZmZlciB3aWxsIGJlIHVzZWQgdG8gY29udGFpbiB0aGUgZGF0YSBpbiB0aGUgZmlsZS4gKi8KLQlidWZmZXJfaW5pdCgmZW5jcnlwdGVkKTsKLQotCS8qIEZpcnN0IHN0b3JlIGtleWZpbGUgaWQgc3RyaW5nLiAqLwotCWZvciAoaSA9IDA7IGF1dGhmaWxlX2lkX3N0cmluZ1tpXTsgaSsrKQotCQlidWZmZXJfcHV0X2NoYXIoJmVuY3J5cHRlZCwgYXV0aGZpbGVfaWRfc3RyaW5nW2ldKTsKLQlidWZmZXJfcHV0X2NoYXIoJmVuY3J5cHRlZCwgMCk7Ci0KLQkvKiBTdG9yZSBjaXBoZXIgdHlwZS4gKi8KLQlidWZmZXJfcHV0X2NoYXIoJmVuY3J5cHRlZCwgY2lwaGVyX251bSk7Ci0JYnVmZmVyX3B1dF9pbnQoJmVuY3J5cHRlZCwgMCk7CS8qIEZvciBmdXR1cmUgZXh0ZW5zaW9uICovCi0KLQkvKiBTdG9yZSBwdWJsaWMga2V5LiAgVGhpcyB3aWxsIGJlIGluIHBsYWluIHRleHQuICovCi0JYnVmZmVyX3B1dF9pbnQoJmVuY3J5cHRlZCwgQk5fbnVtX2JpdHMoa2V5LT5yc2EtPm4pKTsKLQlidWZmZXJfcHV0X2JpZ251bSgmZW5jcnlwdGVkLCBrZXktPnJzYS0+bik7Ci0JYnVmZmVyX3B1dF9iaWdudW0oJmVuY3J5cHRlZCwga2V5LT5yc2EtPmUpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmZW5jcnlwdGVkLCBjb21tZW50KTsKLQotCS8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBrZXkgaW4gdGhlIGJ1ZmZlci4gKi8KLQljcCA9IGJ1ZmZlcl9hcHBlbmRfc3BhY2UoJmVuY3J5cHRlZCwgYnVmZmVyX2xlbigmYnVmZmVyKSk7Ci0KLQljaXBoZXJfc2V0X2tleV9zdHJpbmcoJmNpcGhlcmNvbnRleHQsIGNpcGhlciwgcGFzc3BocmFzZSwKLQkgICAgQ0lQSEVSX0VOQ1JZUFQpOwotCWNpcGhlcl9jcnlwdCgmY2lwaGVyY29udGV4dCwgY3AsCi0JICAgIGJ1ZmZlcl9wdHIoJmJ1ZmZlciksIGJ1ZmZlcl9sZW4oJmJ1ZmZlcikpOwotCWNpcGhlcl9jbGVhbnVwKCZjaXBoZXJjb250ZXh0KTsKLQltZW1zZXQoJmNpcGhlcmNvbnRleHQsIDAsIHNpemVvZihjaXBoZXJjb250ZXh0KSk7Ci0KLQkvKiBEZXN0cm95IHRlbXBvcmFyeSBkYXRhLiAqLwotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZmZXJfZnJlZSgmYnVmZmVyKTsKLQotCWJ1ZmZlcl9hcHBlbmQoYmxvYiwgYnVmZmVyX3B0cigmZW5jcnlwdGVkKSwgYnVmZmVyX2xlbigmZW5jcnlwdGVkKSk7Ci0JYnVmZmVyX2ZyZWUoJmVuY3J5cHRlZCk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyogY29udmVydCBTU0ggdjIga2V5IGluIE9wZW5TU0wgUEVNIGZvcm1hdCAqLwotc3RhdGljIGludAota2V5X3ByaXZhdGVfcGVtX3RvX2Jsb2IoS2V5ICprZXksIEJ1ZmZlciAqYmxvYiwgY29uc3QgY2hhciAqX3Bhc3NwaHJhc2UsCi0gICAgY29uc3QgY2hhciAqY29tbWVudCkKLXsKLQlpbnQgc3VjY2VzcyA9IDA7Ci0JaW50IGJsZW4sIGxlbiA9IHN0cmxlbihfcGFzc3BocmFzZSk7Ci0JdV9jaGFyICpwYXNzcGhyYXNlID0gKGxlbiA+IDApID8gKHVfY2hhciAqKV9wYXNzcGhyYXNlIDogTlVMTDsKLSNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MDA5MDcwMDBMKQotCWNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciA9IChsZW4gPiAwKSA/IEVWUF9kZXNfZWRlM19jYmMoKSA6IE5VTEw7Ci0jZWxzZQotCWNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciA9IChsZW4gPiAwKSA/IEVWUF9hZXNfMTI4X2NiYygpIDogTlVMTDsKLSNlbmRpZgotCWNvbnN0IHVfY2hhciAqYnB0cjsKLQlCSU8gKmJpbzsKLQotCWlmIChsZW4gPiAwICYmIGxlbiA8PSA0KSB7Ci0JCWVycm9yKCJwYXNzcGhyYXNlIHRvbyBzaG9ydDogaGF2ZSAlZCBieXRlcywgbmVlZCA+IDQiLCBsZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKChiaW8gPSBCSU9fbmV3KEJJT19zX21lbSgpKSkgPT0gTlVMTCkgewotCQllcnJvcigiJXM6IEJJT19uZXcgZmFpbGVkIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc3dpdGNoIChrZXktPnR5cGUpIHsKLQljYXNlIEtFWV9EU0E6Ci0JCXN1Y2Nlc3MgPSBQRU1fd3JpdGVfYmlvX0RTQVByaXZhdGVLZXkoYmlvLCBrZXktPmRzYSwKLQkJICAgIGNpcGhlciwgcGFzc3BocmFzZSwgbGVuLCBOVUxMLCBOVUxMKTsKLQkJYnJlYWs7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JY2FzZSBLRVlfRUNEU0E6Ci0JCXN1Y2Nlc3MgPSBQRU1fd3JpdGVfYmlvX0VDUHJpdmF0ZUtleShiaW8sIGtleS0+ZWNkc2EsCi0JCSAgICBjaXBoZXIsIHBhc3NwaHJhc2UsIGxlbiwgTlVMTCwgTlVMTCk7Ci0JCWJyZWFrOwotI2VuZGlmCi0JY2FzZSBLRVlfUlNBOgotCQlzdWNjZXNzID0gUEVNX3dyaXRlX2Jpb19SU0FQcml2YXRlS2V5KGJpbywga2V5LT5yc2EsCi0JCSAgICBjaXBoZXIsIHBhc3NwaHJhc2UsIGxlbiwgTlVMTCwgTlVMTCk7Ci0JCWJyZWFrOwotCX0KLQlpZiAoc3VjY2VzcykgewotCQlpZiAoKGJsZW4gPSBCSU9fZ2V0X21lbV9kYXRhKGJpbywgJmJwdHIpKSA8PSAwKQotCQkJc3VjY2VzcyA9IDA7Ci0JCWVsc2UKLQkJCWJ1ZmZlcl9hcHBlbmQoYmxvYiwgYnB0ciwgYmxlbik7Ci0JfQotCUJJT19mcmVlKGJpbyk7Ci0JcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLS8qIFNhdmUgYSBrZXkgYmxvYiB0byBhIGZpbGUgKi8KLXN0YXRpYyBpbnQKLWtleV9zYXZlX3ByaXZhdGVfYmxvYihCdWZmZXIgKmtleWJ1ZiwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0JaW50IGZkOwotCi0JaWYgKChmZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2MDApKSA8IDApIHsKLQkJZXJyb3IoIm9wZW4gJXMgZmFpbGVkOiAlcy4iLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChhdG9taWNpbyh2d3JpdGUsIGZkLCBidWZmZXJfcHRyKGtleWJ1ZiksCi0JICAgIGJ1ZmZlcl9sZW4oa2V5YnVmKSkgIT0gYnVmZmVyX2xlbihrZXlidWYpKSB7Ci0JCWVycm9yKCJ3cml0ZSB0byBrZXkgZmlsZSAlcyBmYWlsZWQ6ICVzIiwgZmlsZW5hbWUsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCQljbG9zZShmZCk7Ci0JCXVubGluayhmaWxlbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQljbG9zZShmZCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIFNlcmlhbGlzZSAia2V5IiB0byBidWZmZXIgImJsb2IiICovCi1zdGF0aWMgaW50Ci1rZXlfcHJpdmF0ZV90b19ibG9iKEtleSAqa2V5LCBCdWZmZXIgKmJsb2IsIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsCi0gICAgY29uc3QgY2hhciAqY29tbWVudCkKLXsKLQlzd2l0Y2ggKGtleS0+dHlwZSkgewotCWNhc2UgS0VZX1JTQTE6Ci0JCXJldHVybiBrZXlfcHJpdmF0ZV9yc2ExX3RvX2Jsb2Ioa2V5LCBibG9iLCBwYXNzcGhyYXNlLCBjb21tZW50KTsKLQljYXNlIEtFWV9EU0E6Ci0JY2FzZSBLRVlfRUNEU0E6Ci0JY2FzZSBLRVlfUlNBOgotCQlyZXR1cm4ga2V5X3ByaXZhdGVfcGVtX3RvX2Jsb2Ioa2V5LCBibG9iLCBwYXNzcGhyYXNlLCBjb21tZW50KTsKLQlkZWZhdWx0OgotCQllcnJvcigiJXM6IGNhbm5vdCBzYXZlIGtleSB0eXBlICVkIiwgX19mdW5jX18sIGtleS0+dHlwZSk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotaW50Ci1rZXlfc2F2ZV9wcml2YXRlKEtleSAqa2V5LCBjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcGFzc3BocmFzZSwKLSAgICBjb25zdCBjaGFyICpjb21tZW50KQotewotCUJ1ZmZlciBrZXlibG9iOwotCWludCBzdWNjZXNzID0gMDsKLQotCWJ1ZmZlcl9pbml0KCZrZXlibG9iKTsKLQlpZiAoIWtleV9wcml2YXRlX3RvX2Jsb2Ioa2V5LCAma2V5YmxvYiwgcGFzc3BocmFzZSwgY29tbWVudCkpCi0JCWdvdG8gb3V0OwotCWlmICgha2V5X3NhdmVfcHJpdmF0ZV9ibG9iKCZrZXlibG9iLCBmaWxlbmFtZSkpCi0JCWdvdG8gb3V0OwotCXN1Y2Nlc3MgPSAxOwotIG91dDoKLQlidWZmZXJfZnJlZSgma2V5YmxvYik7Ci0JcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLS8qCi0gKiBQYXJzZSB0aGUgcHVibGljLCB1bmVuY3J5cHRlZCBwb3J0aW9uIG9mIGEgUlNBMSBrZXkuCi0gKi8KLXN0YXRpYyBLZXkgKgota2V5X3BhcnNlX3B1YmxpY19yc2ExKEJ1ZmZlciAqYmxvYiwgY2hhciAqKmNvbW1lbnRwKQotewotCUtleSAqcHViOwotCUJ1ZmZlciBjb3B5OwotCi0JLyogQ2hlY2sgdGhhdCBpdCBpcyBhdCBsZWFzdCBiaWcgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIElEIHN0cmluZy4gKi8KLQlpZiAoYnVmZmVyX2xlbihibG9iKSA8IHNpemVvZihhdXRoZmlsZV9pZF9zdHJpbmcpKSB7Ci0JCWRlYnVnMygiVHJ1bmNhdGVkIFJTQTEgaWRlbnRpZmllciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSBpdCBiZWdpbnMgd2l0aCB0aGUgaWQgc3RyaW5nLiAgQ29uc3VtZSB0aGUgaWQgc3RyaW5nCi0JICogZnJvbSB0aGUgYnVmZmVyLgotCSAqLwotCWlmIChtZW1jbXAoYnVmZmVyX3B0cihibG9iKSwgYXV0aGZpbGVfaWRfc3RyaW5nLAotCSAgICBzaXplb2YoYXV0aGZpbGVfaWRfc3RyaW5nKSkgIT0gMCkgewotCQlkZWJ1ZzMoIkluY29ycmVjdCBSU0ExIGlkZW50aWZpZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJ1ZmZlcl9pbml0KCZjb3B5KTsKLQlidWZmZXJfYXBwZW5kKCZjb3B5LCBidWZmZXJfcHRyKGJsb2IpLCBidWZmZXJfbGVuKGJsb2IpKTsKLQlidWZmZXJfY29uc3VtZSgmY29weSwgc2l6ZW9mKGF1dGhmaWxlX2lkX3N0cmluZykpOwotCi0JLyogU2tpcCBjaXBoZXIgdHlwZSBhbmQgcmVzZXJ2ZWQgZGF0YS4gKi8KLQkodm9pZCkgYnVmZmVyX2dldF9jaGFyKCZjb3B5KTsJCS8qIGNpcGhlciB0eXBlICovCi0JKHZvaWQpIGJ1ZmZlcl9nZXRfaW50KCZjb3B5KTsJCS8qIHJlc2VydmVkICovCi0KLQkvKiBSZWFkIHRoZSBwdWJsaWMga2V5IGZyb20gdGhlIGJ1ZmZlci4gKi8KLQkodm9pZCkgYnVmZmVyX2dldF9pbnQoJmNvcHkpOwotCXB1YiA9IGtleV9uZXcoS0VZX1JTQTEpOwotCWJ1ZmZlcl9nZXRfYmlnbnVtKCZjb3B5LCBwdWItPnJzYS0+bik7Ci0JYnVmZmVyX2dldF9iaWdudW0oJmNvcHksIHB1Yi0+cnNhLT5lKTsKLQlpZiAoY29tbWVudHApCi0JCSpjb21tZW50cCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZjb3B5LCBOVUxMKTsKLQkvKiBUaGUgZW5jcnlwdGVkIHByaXZhdGUgcGFydCBpcyBub3QgcGFyc2VkIGJ5IHRoaXMgZnVuY3Rpb24uICovCi0JYnVmZmVyX2ZyZWUoJmNvcHkpOwotCi0JcmV0dXJuIHB1YjsKLX0KLQotLyogTG9hZCBhIGtleSBmcm9tIGEgZmQgaW50byBhIGJ1ZmZlciAqLwotaW50Ci1rZXlfbG9hZF9maWxlKGludCBmZCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIEJ1ZmZlciAqYmxvYikKLXsKLQl1X2NoYXIgYnVmWzEwMjRdOwotCXNpemVfdCBsZW47Ci0Jc3RydWN0IHN0YXQgc3Q7Ci0KLQlpZiAoZnN0YXQoZmQsICZzdCkgPCAwKSB7Ci0JCWVycm9yKCIlczogZnN0YXQgb2Yga2V5IGZpbGUgJS4yMDBzJXNmYWlsZWQ6ICUuMTAwcyIsIF9fZnVuY19fLAotCQkgICAgZmlsZW5hbWUgPT0gTlVMTCA/ICIiIDogZmlsZW5hbWUsCi0JCSAgICBmaWxlbmFtZSA9PSBOVUxMID8gIiIgOiAiICIsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKChzdC5zdF9tb2RlICYgKFNfSUZTT0NLfFNfSUZDSFJ8U19JRklGTykpID09IDAgJiYKLQkgICAgc3Quc3Rfc2l6ZSA+IE1BWF9LRVlfRklMRV9TSVpFKSB7Ci0gdG9vYmlnOgotCQllcnJvcigiJXM6IGtleSBmaWxlICUuMjAwcyVzdG9vIGxhcmdlIiwgX19mdW5jX18sCi0JCSAgICBmaWxlbmFtZSA9PSBOVUxMID8gIiIgOiBmaWxlbmFtZSwKLQkJICAgIGZpbGVuYW1lID09IE5VTEwgPyAiIiA6ICIgIik7Ci0JCXJldHVybiAwOwotCX0KLQlidWZmZXJfaW5pdChibG9iKTsKLQlmb3IgKDs7KSB7Ci0JCWlmICgobGVuID0gYXRvbWljaW8ocmVhZCwgZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA9PSAwKSB7Ci0JCQlpZiAoZXJybm8gPT0gRVBJUEUpCi0JCQkJYnJlYWs7Ci0JCQlkZWJ1ZygiJXM6IHJlYWQgZnJvbSBrZXkgZmlsZSAlLjIwMHMlc2ZhaWxlZDogJS4xMDBzIiwKLQkJCSAgICBfX2Z1bmNfXywgZmlsZW5hbWUgPT0gTlVMTCA/ICIiIDogZmlsZW5hbWUsCi0JCQkgICAgZmlsZW5hbWUgPT0gTlVMTCA/ICIiIDogIiAiLCBzdHJlcnJvcihlcnJubykpOwotCQkJYnVmZmVyX2NsZWFyKGJsb2IpOwotCQkJYnplcm8oYnVmLCBzaXplb2YoYnVmKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlidWZmZXJfYXBwZW5kKGJsb2IsIGJ1ZiwgbGVuKTsKLQkJaWYgKGJ1ZmZlcl9sZW4oYmxvYikgPiBNQVhfS0VZX0ZJTEVfU0laRSkgewotCQkJYnVmZmVyX2NsZWFyKGJsb2IpOwotCQkJYnplcm8oYnVmLCBzaXplb2YoYnVmKSk7Ci0JCQlnb3RvIHRvb2JpZzsKLQkJfQotCX0KLQliemVybyhidWYsIHNpemVvZihidWYpKTsKLQlpZiAoKHN0LnN0X21vZGUgJiAoU19JRlNPQ0t8U19JRkNIUnxTX0lGSUZPKSkgPT0gMCAmJgotCSAgICBzdC5zdF9zaXplICE9IGJ1ZmZlcl9sZW4oYmxvYikpIHsKLQkJZGVidWcoIiVzOiBrZXkgZmlsZSAlLjIwMHMlc2NoYW5nZWQgc2l6ZSB3aGlsZSByZWFkaW5nIiwKLQkJICAgIF9fZnVuY19fLCBmaWxlbmFtZSA9PSBOVUxMID8gIiIgOiBmaWxlbmFtZSwKLQkJICAgIGZpbGVuYW1lID09IE5VTEwgPyAiIiA6ICIgIik7Ci0JCWJ1ZmZlcl9jbGVhcihibG9iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBMb2FkcyB0aGUgcHVibGljIHBhcnQgb2YgdGhlIHNzaCB2MSBrZXkgZmlsZS4gIFJldHVybnMgTlVMTCBpZiBhbiBlcnJvciB3YXMKLSAqIGVuY291bnRlcmVkICh0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgcmVhZGFibGUpLCBhbmQgdGhlIGtleQotICogb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgS2V5ICoKLWtleV9sb2FkX3B1YmxpY19yc2ExKGludCBmZCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKipjb21tZW50cCkKLXsKLQlCdWZmZXIgYnVmZmVyOwotCUtleSAqcHViOwotCi0JYnVmZmVyX2luaXQoJmJ1ZmZlcik7Ci0JaWYgKCFrZXlfbG9hZF9maWxlKGZkLCBmaWxlbmFtZSwgJmJ1ZmZlcikpIHsKLQkJYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXB1YiA9IGtleV9wYXJzZV9wdWJsaWNfcnNhMSgmYnVmZmVyLCBjb21tZW50cCk7Ci0JaWYgKHB1YiA9PSBOVUxMKQotCQlkZWJ1ZzMoIkNvdWxkIG5vdCBsb2FkIFwiJXNcIiBhcyBhIFJTQTEgcHVibGljIGtleSIsIGZpbGVuYW1lKTsKLQlidWZmZXJfZnJlZSgmYnVmZmVyKTsKLQlyZXR1cm4gcHViOwotfQotCi0vKiBsb2FkIHB1YmxpYyBrZXkgZnJvbSBwcml2YXRlLWtleSBmaWxlLCB3b3JrcyBvbmx5IGZvciBTU0ggdjEgKi8KLUtleSAqCi1rZXlfbG9hZF9wdWJsaWNfdHlwZShpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKipjb21tZW50cCkKLXsKLQlLZXkgKnB1YjsKLQlpbnQgZmQ7Ci0KLQlpZiAodHlwZSA9PSBLRVlfUlNBMSkgewotCQlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKLQkJaWYgKGZkIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlwdWIgPSBrZXlfbG9hZF9wdWJsaWNfcnNhMShmZCwgZmlsZW5hbWUsIGNvbW1lbnRwKTsKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gcHViOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIEtleSAqCi1rZXlfcGFyc2VfcHJpdmF0ZV9yc2ExKEJ1ZmZlciAqYmxvYiwgY29uc3QgY2hhciAqcGFzc3BocmFzZSwgY2hhciAqKmNvbW1lbnRwKQotewotCWludCBjaGVjazEsIGNoZWNrMiwgY2lwaGVyX3R5cGU7Ci0JQnVmZmVyIGRlY3J5cHRlZDsKLQl1X2NoYXIgKmNwOwotCUNpcGhlckNvbnRleHQgY2lwaGVyY29udGV4dDsKLQlDaXBoZXIgKmNpcGhlcjsKLQlLZXkgKnBydiA9IE5VTEw7Ci0JQnVmZmVyIGNvcHk7Ci0KLQkvKiBDaGVjayB0aGF0IGl0IGlzIGF0IGxlYXN0IGJpZyBlbm91Z2ggdG8gY29udGFpbiB0aGUgSUQgc3RyaW5nLiAqLwotCWlmIChidWZmZXJfbGVuKGJsb2IpIDwgc2l6ZW9mKGF1dGhmaWxlX2lkX3N0cmluZykpIHsKLQkJZGVidWczKCJUcnVuY2F0ZWQgUlNBMSBpZGVudGlmaWVyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qCi0JICogTWFrZSBzdXJlIGl0IGJlZ2lucyB3aXRoIHRoZSBpZCBzdHJpbmcuICBDb25zdW1lIHRoZSBpZCBzdHJpbmcKLQkgKiBmcm9tIHRoZSBidWZmZXIuCi0JICovCi0JaWYgKG1lbWNtcChidWZmZXJfcHRyKGJsb2IpLCBhdXRoZmlsZV9pZF9zdHJpbmcsCi0JICAgIHNpemVvZihhdXRoZmlsZV9pZF9zdHJpbmcpKSAhPSAwKSB7Ci0JCWRlYnVnMygiSW5jb3JyZWN0IFJTQTEgaWRlbnRpZmllciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYnVmZmVyX2luaXQoJmNvcHkpOwotCWJ1ZmZlcl9hcHBlbmQoJmNvcHksIGJ1ZmZlcl9wdHIoYmxvYiksIGJ1ZmZlcl9sZW4oYmxvYikpOwotCWJ1ZmZlcl9jb25zdW1lKCZjb3B5LCBzaXplb2YoYXV0aGZpbGVfaWRfc3RyaW5nKSk7Ci0KLQkvKiBSZWFkIGNpcGhlciB0eXBlLiAqLwotCWNpcGhlcl90eXBlID0gYnVmZmVyX2dldF9jaGFyKCZjb3B5KTsKLQkodm9pZCkgYnVmZmVyX2dldF9pbnQoJmNvcHkpOwkvKiBSZXNlcnZlZCBkYXRhLiAqLwotCi0JLyogUmVhZCB0aGUgcHVibGljIGtleSBmcm9tIHRoZSBidWZmZXIuICovCi0JKHZvaWQpIGJ1ZmZlcl9nZXRfaW50KCZjb3B5KTsKLQlwcnYgPSBrZXlfbmV3X3ByaXZhdGUoS0VZX1JTQTEpOwotCi0JYnVmZmVyX2dldF9iaWdudW0oJmNvcHksIHBydi0+cnNhLT5uKTsKLQlidWZmZXJfZ2V0X2JpZ251bSgmY29weSwgcHJ2LT5yc2EtPmUpOwotCWlmIChjb21tZW50cCkKLQkJKmNvbW1lbnRwID0gYnVmZmVyX2dldF9zdHJpbmcoJmNvcHksIE5VTEwpOwotCWVsc2UKLQkJKHZvaWQpYnVmZmVyX2dldF9zdHJpbmdfcHRyKCZjb3B5LCBOVUxMKTsKLQotCS8qIENoZWNrIHRoYXQgaXQgaXMgYSBzdXBwb3J0ZWQgY2lwaGVyLiAqLwotCWNpcGhlciA9IGNpcGhlcl9ieV9udW1iZXIoY2lwaGVyX3R5cGUpOwotCWlmIChjaXBoZXIgPT0gTlVMTCkgewotCQlkZWJ1ZygiVW5zdXBwb3J0ZWQgUlNBMSBjaXBoZXIgJWQiLCBjaXBoZXJfdHlwZSk7Ci0JCWJ1ZmZlcl9mcmVlKCZjb3B5KTsKLQkJZ290byBmYWlsOwotCX0KLQkvKiBJbml0aWFsaXplIHNwYWNlIGZvciBkZWNyeXB0ZWQgZGF0YS4gKi8KLQlidWZmZXJfaW5pdCgmZGVjcnlwdGVkKTsKLQljcCA9IGJ1ZmZlcl9hcHBlbmRfc3BhY2UoJmRlY3J5cHRlZCwgYnVmZmVyX2xlbigmY29weSkpOwotCi0JLyogUmVzdCBvZiB0aGUgYnVmZmVyIGlzIGVuY3J5cHRlZC4gIERlY3J5cHQgaXQgdXNpbmcgdGhlIHBhc3NwaHJhc2UuICovCi0JY2lwaGVyX3NldF9rZXlfc3RyaW5nKCZjaXBoZXJjb250ZXh0LCBjaXBoZXIsIHBhc3NwaHJhc2UsCi0JICAgIENJUEhFUl9ERUNSWVBUKTsKLQljaXBoZXJfY3J5cHQoJmNpcGhlcmNvbnRleHQsIGNwLAotCSAgICBidWZmZXJfcHRyKCZjb3B5KSwgYnVmZmVyX2xlbigmY29weSkpOwotCWNpcGhlcl9jbGVhbnVwKCZjaXBoZXJjb250ZXh0KTsKLQltZW1zZXQoJmNpcGhlcmNvbnRleHQsIDAsIHNpemVvZihjaXBoZXJjb250ZXh0KSk7Ci0JYnVmZmVyX2ZyZWUoJmNvcHkpOwotCi0JY2hlY2sxID0gYnVmZmVyX2dldF9jaGFyKCZkZWNyeXB0ZWQpOwotCWNoZWNrMiA9IGJ1ZmZlcl9nZXRfY2hhcigmZGVjcnlwdGVkKTsKLQlpZiAoY2hlY2sxICE9IGJ1ZmZlcl9nZXRfY2hhcigmZGVjcnlwdGVkKSB8fAotCSAgICBjaGVjazIgIT0gYnVmZmVyX2dldF9jaGFyKCZkZWNyeXB0ZWQpKSB7Ci0JCWlmIChzdHJjbXAocGFzc3BocmFzZSwgIiIpICE9IDApCi0JCQlkZWJ1ZygiQmFkIHBhc3NwaHJhc2Ugc3VwcGxpZWQgZm9yIFJTQTEga2V5Iik7Ci0JCS8qIEJhZCBwYXNzcGhyYXNlLiAqLwotCQlidWZmZXJfZnJlZSgmZGVjcnlwdGVkKTsKLQkJZ290byBmYWlsOwotCX0KLQkvKiBSZWFkIHRoZSByZXN0IG9mIHRoZSBwcml2YXRlIGtleS4gKi8KLQlidWZmZXJfZ2V0X2JpZ251bSgmZGVjcnlwdGVkLCBwcnYtPnJzYS0+ZCk7Ci0JYnVmZmVyX2dldF9iaWdudW0oJmRlY3J5cHRlZCwgcHJ2LT5yc2EtPmlxbXApOwkJLyogdSAqLwotCS8qIGluIFNTTCBhbmQgU1NIIHYxIHAgYW5kIHEgYXJlIGV4Y2hhbmdlZCAqLwotCWJ1ZmZlcl9nZXRfYmlnbnVtKCZkZWNyeXB0ZWQsIHBydi0+cnNhLT5xKTsJCS8qIHAgKi8KLQlidWZmZXJfZ2V0X2JpZ251bSgmZGVjcnlwdGVkLCBwcnYtPnJzYS0+cCk7CQkvKiBxICovCi0KLQkvKiBjYWxjdWxhdGUgcC0xIGFuZCBxLTEgKi8KLQlyc2FfZ2VuZXJhdGVfYWRkaXRpb25hbF9wYXJhbWV0ZXJzKHBydi0+cnNhKTsKLQotCWJ1ZmZlcl9mcmVlKCZkZWNyeXB0ZWQpOwotCi0JLyogZW5hYmxlIGJsaW5kaW5nICovCi0JaWYgKFJTQV9ibGluZGluZ19vbihwcnYtPnJzYSwgTlVMTCkgIT0gMSkgewotCQllcnJvcigiJXM6IFJTQV9ibGluZGluZ19vbiBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmV0dXJuIHBydjsKLQotZmFpbDoKLQlpZiAoY29tbWVudHApCi0JCXhmcmVlKCpjb21tZW50cCk7Ci0Ja2V5X2ZyZWUocHJ2KTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIEtleSAqCi1rZXlfcGFyc2VfcHJpdmF0ZV9wZW0oQnVmZmVyICpibG9iLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqcGFzc3BocmFzZSwKLSAgICBjaGFyICoqY29tbWVudHApCi17Ci0JRVZQX1BLRVkgKnBrID0gTlVMTDsKLQlLZXkgKnBydiA9IE5VTEw7Ci0JY2hhciAqbmFtZSA9ICI8bm8ga2V5PiI7Ci0JQklPICpiaW87Ci0KLQlpZiAoKGJpbyA9IEJJT19uZXdfbWVtX2J1ZihidWZmZXJfcHRyKGJsb2IpLAotCSAgICBidWZmZXJfbGVuKGJsb2IpKSkgPT0gTlVMTCkgewotCQllcnJvcigiJXM6IEJJT19uZXdfbWVtX2J1ZiBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlwayA9IFBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5KGJpbywgTlVMTCwgTlVMTCwgKGNoYXIgKilwYXNzcGhyYXNlKTsKLQlCSU9fZnJlZShiaW8pOwotCWlmIChwayA9PSBOVUxMKSB7Ci0JCWRlYnVnKCIlczogUEVNX3JlYWRfUHJpdmF0ZUtleSBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCSh2b2lkKUVSUl9nZXRfZXJyb3IoKTsKLQl9IGVsc2UgaWYgKHBrLT50eXBlID09IEVWUF9QS0VZX1JTQSAmJgotCSAgICAodHlwZSA9PSBLRVlfVU5TUEVDfHx0eXBlPT1LRVlfUlNBKSkgewotCQlwcnYgPSBrZXlfbmV3KEtFWV9VTlNQRUMpOwotCQlwcnYtPnJzYSA9IEVWUF9QS0VZX2dldDFfUlNBKHBrKTsKLQkJcHJ2LT50eXBlID0gS0VZX1JTQTsKLQkJbmFtZSA9ICJyc2Egdy9vIGNvbW1lbnQiOwotI2lmZGVmIERFQlVHX1BLCi0JCVJTQV9wcmludF9mcChzdGRlcnIsIHBydi0+cnNhLCA4KTsKLSNlbmRpZgotCQlpZiAoUlNBX2JsaW5kaW5nX29uKHBydi0+cnNhLCBOVUxMKSAhPSAxKSB7Ci0JCQllcnJvcigiJXM6IFJTQV9ibGluZGluZ19vbiBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCQlrZXlfZnJlZShwcnYpOwotCQkJcHJ2ID0gTlVMTDsKLQkJfQotCX0gZWxzZSBpZiAocGstPnR5cGUgPT0gRVZQX1BLRVlfRFNBICYmCi0JICAgICh0eXBlID09IEtFWV9VTlNQRUN8fHR5cGU9PUtFWV9EU0EpKSB7Ci0JCXBydiA9IGtleV9uZXcoS0VZX1VOU1BFQyk7Ci0JCXBydi0+ZHNhID0gRVZQX1BLRVlfZ2V0MV9EU0EocGspOwotCQlwcnYtPnR5cGUgPSBLRVlfRFNBOwotCQluYW1lID0gImRzYSB3L28gY29tbWVudCI7Ci0jaWZkZWYgREVCVUdfUEsKLQkJRFNBX3ByaW50X2ZwKHN0ZGVyciwgcHJ2LT5kc2EsIDgpOwotI2VuZGlmCi0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JfSBlbHNlIGlmIChway0+dHlwZSA9PSBFVlBfUEtFWV9FQyAmJgotCSAgICAodHlwZSA9PSBLRVlfVU5TUEVDfHx0eXBlPT1LRVlfRUNEU0EpKSB7Ci0JCXBydiA9IGtleV9uZXcoS0VZX1VOU1BFQyk7Ci0JCXBydi0+ZWNkc2EgPSBFVlBfUEtFWV9nZXQxX0VDX0tFWShwayk7Ci0JCXBydi0+dHlwZSA9IEtFWV9FQ0RTQTsKLQkJaWYgKChwcnYtPmVjZHNhX25pZCA9IGtleV9lY2RzYV9rZXlfdG9fbmlkKHBydi0+ZWNkc2EpKSA9PSAtMSB8fAotCQkgICAga2V5X2N1cnZlX25pZF90b19uYW1lKHBydi0+ZWNkc2FfbmlkKSA9PSBOVUxMIHx8Ci0JCSAgICBrZXlfZWNfdmFsaWRhdGVfcHVibGljKEVDX0tFWV9nZXQwX2dyb3VwKHBydi0+ZWNkc2EpLAotCQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShwcnYtPmVjZHNhKSkgIT0gMCB8fAotCQkgICAga2V5X2VjX3ZhbGlkYXRlX3ByaXZhdGUocHJ2LT5lY2RzYSkgIT0gMCkgewotCQkJZXJyb3IoIiVzOiBiYWQgRUNEU0Ega2V5IiwgX19mdW5jX18pOwotCQkJa2V5X2ZyZWUocHJ2KTsKLQkJCXBydiA9IE5VTEw7Ci0JCX0KLQkJbmFtZSA9ICJlY2RzYSB3L28gY29tbWVudCI7Ci0jaWZkZWYgREVCVUdfUEsKLQkJaWYgKHBydiAhPSBOVUxMICYmIHBydi0+ZWNkc2EgIT0gTlVMTCkKLQkJCWtleV9kdW1wX2VjX2tleShwcnYtPmVjZHNhKTsKLSNlbmRpZgotI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLwotCX0gZWxzZSB7Ci0JCWVycm9yKCIlczogUEVNX3JlYWRfUHJpdmF0ZUtleTogbWlzbWF0Y2ggb3IgIgotCQkgICAgInVua25vd24gRVZQX1BLRVkgc2F2ZV90eXBlICVkIiwgX19mdW5jX18sIHBrLT5zYXZlX3R5cGUpOwotCX0KLQlpZiAocGsgIT0gTlVMTCkKLQkJRVZQX1BLRVlfZnJlZShwayk7Ci0JaWYgKHBydiAhPSBOVUxMICYmIGNvbW1lbnRwKQotCQkqY29tbWVudHAgPSB4c3RyZHVwKG5hbWUpOwotCWRlYnVnKCJyZWFkIFBFTSBwcml2YXRlIGtleSBkb25lOiB0eXBlICVzIiwKLQkgICAgcHJ2ID8ga2V5X3R5cGUocHJ2KSA6ICI8dW5rbm93bj4iKTsKLQlyZXR1cm4gcHJ2OwotfQotCi1LZXkgKgota2V5X2xvYWRfcHJpdmF0ZV9wZW0oaW50IGZkLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqcGFzc3BocmFzZSwKLSAgICBjaGFyICoqY29tbWVudHApCi17Ci0JQnVmZmVyIGJ1ZmZlcjsKLQlLZXkgKnBydjsKLQotCWJ1ZmZlcl9pbml0KCZidWZmZXIpOwotCWlmICgha2V5X2xvYWRfZmlsZShmZCwgTlVMTCwgJmJ1ZmZlcikpIHsKLQkJYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlwcnYgPSBrZXlfcGFyc2VfcHJpdmF0ZV9wZW0oJmJ1ZmZlciwgdHlwZSwgcGFzc3BocmFzZSwgY29tbWVudHApOwotCWJ1ZmZlcl9mcmVlKCZidWZmZXIpOwotCXJldHVybiBwcnY7Ci19Ci0KLWludAota2V5X3Blcm1fb2soaW50IGZkLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQotCWlmIChmc3RhdChmZCwgJnN0KSA8IDApCi0JCXJldHVybiAwOwotCS8qCi0JICogaWYgYSBrZXkgb3duZWQgYnkgdGhlIHVzZXIgaXMgYWNjZXNzZWQsIHRoZW4gd2UgY2hlY2sgdGhlCi0JICogcGVybWlzc2lvbnMgb2YgdGhlIGZpbGUuIGlmIHRoZSBrZXkgb3duZWQgYnkgYSBkaWZmZXJlbnQgdXNlciwKLQkgKiB0aGVuIHdlIGRvbid0IGNhcmUuCi0JICovCi0jaWZkZWYgSEFWRV9DWUdXSU4KLQlpZiAoY2hlY2tfbnRzZWMoZmlsZW5hbWUpKQotI2VuZGlmCi0JaWYgKChzdC5zdF91aWQgPT0gZ2V0dWlkKCkpICYmIChzdC5zdF9tb2RlICYgMDc3KSAhPSAwKSB7Ci0JCWVycm9yKCJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCIpOwotCQllcnJvcigiQCAgICAgICAgIFdBUk5JTkc6IFVOUFJPVEVDVEVEIFBSSVZBVEUgS0VZIEZJTEUhICAgICAgICAgIEAiKTsKLQkJZXJyb3IoIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIik7Ci0JCWVycm9yKCJQZXJtaXNzaW9ucyAwJTMuM28gZm9yICclcycgYXJlIHRvbyBvcGVuLiIsCi0JCSAgICAodV9pbnQpc3Quc3RfbW9kZSAmIDA3NzcsIGZpbGVuYW1lKTsKLQkJZXJyb3IoIkl0IGlzIHJlcXVpcmVkIHRoYXQgeW91ciBwcml2YXRlIGtleSBmaWxlcyBhcmUgTk9UIGFjY2Vzc2libGUgYnkgb3RoZXJzLiIpOwotCQllcnJvcigiVGhpcyBwcml2YXRlIGtleSB3aWxsIGJlIGlnbm9yZWQuIik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIEtleSAqCi1rZXlfcGFyc2VfcHJpdmF0ZV90eXBlKEJ1ZmZlciAqYmxvYiwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsCi0gICAgY2hhciAqKmNvbW1lbnRwKQotewotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgS0VZX1JTQTE6Ci0JCXJldHVybiBrZXlfcGFyc2VfcHJpdmF0ZV9yc2ExKGJsb2IsIHBhc3NwaHJhc2UsIGNvbW1lbnRwKTsKLQljYXNlIEtFWV9EU0E6Ci0JY2FzZSBLRVlfRUNEU0E6Ci0JY2FzZSBLRVlfUlNBOgotCWNhc2UgS0VZX1VOU1BFQzoKLQkJcmV0dXJuIGtleV9wYXJzZV9wcml2YXRlX3BlbShibG9iLCB0eXBlLCBwYXNzcGhyYXNlLCBjb21tZW50cCk7Ci0JZGVmYXVsdDoKLQkJZXJyb3IoIiVzOiBjYW5ub3QgcGFyc2Uga2V5IHR5cGUgJWQiLCBfX2Z1bmNfXywgdHlwZSk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotS2V5ICoKLWtleV9sb2FkX3ByaXZhdGVfdHlwZShpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsCi0gICAgY2hhciAqKmNvbW1lbnRwLCBpbnQgKnBlcm1fb2spCi17Ci0JaW50IGZkOwotCUtleSAqcmV0OwotCUJ1ZmZlciBidWZmZXI7Ci0KLQlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKLQlpZiAoZmQgPCAwKSB7Ci0JCWRlYnVnKCJjb3VsZCBub3Qgb3BlbiBrZXkgZmlsZSAnJXMnOiAlcyIsIGZpbGVuYW1lLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJaWYgKHBlcm1fb2sgIT0gTlVMTCkKLQkJCSpwZXJtX29rID0gMDsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICgha2V5X3Blcm1fb2soZmQsIGZpbGVuYW1lKSkgewotCQlpZiAocGVybV9vayAhPSBOVUxMKQotCQkJKnBlcm1fb2sgPSAwOwotCQllcnJvcigiYmFkIHBlcm1pc3Npb25zOiBpZ25vcmUga2V5OiAlcyIsIGZpbGVuYW1lKTsKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHBlcm1fb2sgIT0gTlVMTCkKLQkJKnBlcm1fb2sgPSAxOwotCi0JYnVmZmVyX2luaXQoJmJ1ZmZlcik7Ci0JaWYgKCFrZXlfbG9hZF9maWxlKGZkLCBmaWxlbmFtZSwgJmJ1ZmZlcikpIHsKLQkJYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7Ci0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNsb3NlKGZkKTsKLQlyZXQgPSBrZXlfcGFyc2VfcHJpdmF0ZV90eXBlKCZidWZmZXIsIHR5cGUsIHBhc3NwaHJhc2UsIGNvbW1lbnRwKTsKLQlidWZmZXJfZnJlZSgmYnVmZmVyKTsKLQlyZXR1cm4gcmV0OwotfQotCi1LZXkgKgota2V5X3BhcnNlX3ByaXZhdGUoQnVmZmVyICpidWZmZXIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsIGNoYXIgKipjb21tZW50cCkKLXsKLQlLZXkgKnB1YiwgKnBydjsKLQotCS8qIGl0J3MgYSBTU0ggdjEga2V5IGlmIHRoZSBwdWJsaWMga2V5IHBhcnQgaXMgcmVhZGFibGUgKi8KLQlwdWIgPSBrZXlfcGFyc2VfcHVibGljX3JzYTEoYnVmZmVyLCBjb21tZW50cCk7Ci0JaWYgKHB1YiA9PSBOVUxMKSB7Ci0JCXBydiA9IGtleV9wYXJzZV9wcml2YXRlX3R5cGUoYnVmZmVyLCBLRVlfVU5TUEVDLAotCQkgICAgcGFzc3BocmFzZSwgTlVMTCk7Ci0JCS8qIHVzZSB0aGUgZmlsZW5hbWUgYXMgYSBjb21tZW50IGZvciBQRU0gKi8KLQkJaWYgKGNvbW1lbnRwICYmIHBydikKLQkJCSpjb21tZW50cCA9IHhzdHJkdXAoZmlsZW5hbWUpOwotCX0gZWxzZSB7Ci0JCWtleV9mcmVlKHB1Yik7Ci0JCS8qIGtleV9wYXJzZV9wdWJsaWNfcnNhMSgpIGhhcyBhbHJlYWR5IGxvYWRlZCB0aGUgY29tbWVudCAqLwotCQlwcnYgPSBrZXlfcGFyc2VfcHJpdmF0ZV90eXBlKGJ1ZmZlciwgS0VZX1JTQTEsIHBhc3NwaHJhc2UsCi0JCSAgICBOVUxMKTsKLQl9Ci0JcmV0dXJuIHBydjsKLX0KLQotS2V5ICoKLWtleV9sb2FkX3ByaXZhdGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsCi0gICAgY2hhciAqKmNvbW1lbnRwKQotewotCUtleSAqcHJ2OwotCUJ1ZmZlciBidWZmZXI7Ci0JaW50IGZkOwotCi0JZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7Ci0JaWYgKGZkIDwgMCkgewotCQlkZWJ1ZygiY291bGQgbm90IG9wZW4ga2V5IGZpbGUgJyVzJzogJXMiLCBmaWxlbmFtZSwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIWtleV9wZXJtX29rKGZkLCBmaWxlbmFtZSkpIHsKLQkJZXJyb3IoImJhZCBwZXJtaXNzaW9uczogaWdub3JlIGtleTogJXMiLCBmaWxlbmFtZSk7Ci0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JYnVmZmVyX2luaXQoJmJ1ZmZlcik7Ci0JaWYgKCFrZXlfbG9hZF9maWxlKGZkLCBmaWxlbmFtZSwgJmJ1ZmZlcikpIHsKLQkJYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7Ci0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNsb3NlKGZkKTsKLQotCXBydiA9IGtleV9wYXJzZV9wcml2YXRlKCZidWZmZXIsIGZpbGVuYW1lLCBwYXNzcGhyYXNlLCBjb21tZW50cCk7Ci0JYnVmZmVyX2ZyZWUoJmJ1ZmZlcik7Ci0JcmV0dXJuIHBydjsKLX0KLQotc3RhdGljIGludAota2V5X3RyeV9sb2FkX3B1YmxpYyhLZXkgKmssIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICoqY29tbWVudHApCi17Ci0JRklMRSAqZjsKLQljaGFyIGxpbmVbU1NIX01BWF9QVUJLRVlfQllURVNdOwotCWNoYXIgKmNwOwotCXVfbG9uZyBsaW5lbnVtID0gMDsKLQotCWYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLQlpZiAoZiAhPSBOVUxMKSB7Ci0JCXdoaWxlIChyZWFkX2tleWZpbGVfbGluZShmLCBmaWxlbmFtZSwgbGluZSwgc2l6ZW9mKGxpbmUpLAotCQkJICAgICZsaW5lbnVtKSAhPSAtMSkgewotCQkJY3AgPSBsaW5lOwotCQkJc3dpdGNoICgqY3ApIHsKLQkJCWNhc2UgJyMnOgotCQkJY2FzZSAnXG4nOgotCQkJY2FzZSAnXDAnOgotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLyogQWJvcnQgbG9hZGluZyBpZiB0aGlzIGxvb2tzIGxpa2UgYSBwcml2YXRlIGtleSAqLwotCQkJaWYgKHN0cm5jbXAoY3AsICItLS0tLUJFR0lOIiwgMTApID09IDApCi0JCQkJYnJlYWs7Ci0JCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KLQkJCWZvciAoOyAqY3AgJiYgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpOyBjcCsrKQotCQkJCTsKLQkJCWlmICgqY3ApIHsKLQkJCQlpZiAoa2V5X3JlYWQoaywgJmNwKSA9PSAxKSB7Ci0JCQkJCWNwW3N0cmNzcG4oY3AsICJcclxuIildID0gJ1wwJzsKLQkJCQkJaWYgKGNvbW1lbnRwKSB7Ci0JCQkJCQkqY29tbWVudHAgPSB4c3RyZHVwKCpjcCA/Ci0JCQkJCQkgICAgY3AgOiBmaWxlbmFtZSk7Ci0JCQkJCX0KLQkJCQkJZmNsb3NlKGYpOwotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmNsb3NlKGYpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogbG9hZCBwdWJsaWMga2V5IGZyb20gc3NoIHYxIHByaXZhdGUgb3IgYW55IHB1YmtleSBmaWxlICovCi1LZXkgKgota2V5X2xvYWRfcHVibGljKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICoqY29tbWVudHApCi17Ci0JS2V5ICpwdWI7Ci0JY2hhciBmaWxlW01BWFBBVEhMRU5dOwotCi0JLyogdHJ5IHJzYTEgcHJpdmF0ZSBrZXkgKi8KLQlwdWIgPSBrZXlfbG9hZF9wdWJsaWNfdHlwZShLRVlfUlNBMSwgZmlsZW5hbWUsIGNvbW1lbnRwKTsKLQlpZiAocHViICE9IE5VTEwpCi0JCXJldHVybiBwdWI7Ci0KLQkvKiB0cnkgcnNhMSBwdWJsaWMga2V5ICovCi0JcHViID0ga2V5X25ldyhLRVlfUlNBMSk7Ci0JaWYgKGtleV90cnlfbG9hZF9wdWJsaWMocHViLCBmaWxlbmFtZSwgY29tbWVudHApID09IDEpCi0JCXJldHVybiBwdWI7Ci0Ja2V5X2ZyZWUocHViKTsKLQotCS8qIHRyeSBzc2gyIHB1YmxpYyBrZXkgKi8KLQlwdWIgPSBrZXlfbmV3KEtFWV9VTlNQRUMpOwotCWlmIChrZXlfdHJ5X2xvYWRfcHVibGljKHB1YiwgZmlsZW5hbWUsIGNvbW1lbnRwKSA9PSAxKQotCQlyZXR1cm4gcHViOwotCWlmICgoc3RybGNweShmaWxlLCBmaWxlbmFtZSwgc2l6ZW9mIGZpbGUpIDwgc2l6ZW9mKGZpbGUpKSAmJgotCSAgICAoc3RybGNhdChmaWxlLCAiLnB1YiIsIHNpemVvZiBmaWxlKSA8IHNpemVvZihmaWxlKSkgJiYKLQkgICAgKGtleV90cnlfbG9hZF9wdWJsaWMocHViLCBmaWxlLCBjb21tZW50cCkgPT0gMSkpCi0JCXJldHVybiBwdWI7Ci0Ja2V5X2ZyZWUocHViKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogTG9hZCB0aGUgY2VydGlmaWNhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZCBwcml2YXRlIGtleSAqLwotS2V5ICoKLWtleV9sb2FkX2NlcnQoY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0JS2V5ICpwdWI7Ci0JY2hhciAqZmlsZTsKLQotCXB1YiA9IGtleV9uZXcoS0VZX1VOU1BFQyk7Ci0JeGFzcHJpbnRmKCZmaWxlLCAiJXMtY2VydC5wdWIiLCBmaWxlbmFtZSk7Ci0JaWYgKGtleV90cnlfbG9hZF9wdWJsaWMocHViLCBmaWxlLCBOVUxMKSA9PSAxKSB7Ci0JCXhmcmVlKGZpbGUpOwotCQlyZXR1cm4gcHViOwotCX0KLQl4ZnJlZShmaWxlKTsKLQlrZXlfZnJlZShwdWIpOwotCXJldHVybiBOVUxMOwotfQotCi0vKiBMb2FkIHByaXZhdGUga2V5IGFuZCBjZXJ0aWZpY2F0ZSAqLwotS2V5ICoKLWtleV9sb2FkX3ByaXZhdGVfY2VydChpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsCi0gICAgaW50ICpwZXJtX29rKQotewotCUtleSAqa2V5LCAqcHViOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBLRVlfUlNBOgotCWNhc2UgS0VZX0RTQToKLQljYXNlIEtFWV9FQ0RTQToKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyb3IoIiVzOiB1bnN1cHBvcnRlZCBrZXkgdHlwZSIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKChrZXkgPSBrZXlfbG9hZF9wcml2YXRlX3R5cGUodHlwZSwgZmlsZW5hbWUsIAotCSAgICBwYXNzcGhyYXNlLCBOVUxMLCBwZXJtX29rKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoKHB1YiA9IGtleV9sb2FkX2NlcnQoZmlsZW5hbWUpKSA9PSBOVUxMKSB7Ci0JCWtleV9mcmVlKGtleSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qIE1ha2Ugc3VyZSB0aGUgcHJpdmF0ZSBrZXkgbWF0Y2hlcyB0aGUgY2VydGlmaWNhdGUgKi8KLQlpZiAoa2V5X2VxdWFsX3B1YmxpYyhrZXksIHB1YikgPT0gMCkgewotCQllcnJvcigiJXM6IGNlcnRpZmljYXRlIGRvZXMgbm90IG1hdGNoIHByaXZhdGUga2V5ICVzIiwKLQkJICAgIF9fZnVuY19fLCBmaWxlbmFtZSk7Ci0JfSBlbHNlIGlmIChrZXlfdG9fY2VydGlmaWVkKGtleSwga2V5X2NlcnRfaXNfbGVnYWN5KHB1YikpICE9IDApIHsKLQkJZXJyb3IoIiVzOiBrZXlfdG9fY2VydGlmaWVkIGZhaWxlZCIsIF9fZnVuY19fKTsKLQl9IGVsc2UgewotCQlrZXlfY2VydF9jb3B5KHB1Yiwga2V5KTsKLQkJa2V5X2ZyZWUocHViKTsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQlrZXlfZnJlZShrZXkpOwotCWtleV9mcmVlKHB1Yik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIDEgaWYgdGhlIHNwZWNpZmllZCAia2V5IiBpcyBsaXN0ZWQgaW4gdGhlIGZpbGUgImZpbGVuYW1lIiwKLSAqIDAgaWYgdGhlIGtleSBpcyBub3QgbGlzdGVkIG9yIC0xIG9uIGVycm9yLgotICogSWYgc3RyaWN0X3R5cGUgaXMgc2V0IHRoZW4gdGhlIGtleSB0eXBlIG11c3QgbWF0Y2ggZXhhY3RseSwKLSAqIG90aGVyd2lzZSBhIGNvbXBhcmlzb24gdGhhdCBpZ25vcmVzIGNlcnRmaWNpYXRlIGRhdGEgaXMgcGVyZm9ybWVkLgotICovCi1pbnQKLWtleV9pbl9maWxlKEtleSAqa2V5LCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0cmljdF90eXBlKQotewotCUZJTEUgKmY7Ci0JY2hhciBsaW5lW1NTSF9NQVhfUFVCS0VZX0JZVEVTXTsKLQljaGFyICpjcDsKLQl1X2xvbmcgbGluZW51bSA9IDA7Ci0JaW50IHJldCA9IDA7Ci0JS2V5ICpwdWI7Ci0JaW50ICgqa2V5X2NvbXBhcmUpKGNvbnN0IEtleSAqLCBjb25zdCBLZXkgKikgPSBzdHJpY3RfdHlwZSA/Ci0JICAgIGtleV9lcXVhbCA6IGtleV9lcXVhbF9wdWJsaWM7Ci0KLQlpZiAoKGYgPSBmb3BlbihmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgewotCQlpZiAoZXJybm8gPT0gRU5PRU5UKSB7Ci0JCQlkZWJ1ZygiJXM6IGtleWZpbGUgXCIlc1wiIG1pc3NpbmciLCBfX2Z1bmNfXywgZmlsZW5hbWUpOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSB7Ci0JCQllcnJvcigiJXM6IGNvdWxkIG5vdCBvcGVuIGtleWZpbGUgXCIlc1wiOiAlcyIsIF9fZnVuY19fLAotCQkJICAgIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0Jd2hpbGUgKHJlYWRfa2V5ZmlsZV9saW5lKGYsIGZpbGVuYW1lLCBsaW5lLCBzaXplb2YobGluZSksCi0JCSAgICAmbGluZW51bSkgIT0gLTEpIHsKLQkJY3AgPSBsaW5lOwotCi0JCS8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLwotCQlmb3IgKDsgKmNwICYmICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKTsgY3ArKykKLQkJCTsKLQotCQkvKiBTa2lwIGNvbW1lbnRzIGFuZCBlbXB0eSBsaW5lcyAqLwotCQlzd2l0Y2ggKCpjcCkgewotCQljYXNlICcjJzoKLQkJY2FzZSAnXG4nOgotCQljYXNlICdcMCc6Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXB1YiA9IGtleV9uZXcoS0VZX1VOU1BFQyk7Ci0JCWlmIChrZXlfcmVhZChwdWIsICZjcCkgIT0gMSkgewotCQkJa2V5X2ZyZWUocHViKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChrZXlfY29tcGFyZShrZXksIHB1YikpIHsKLQkJCXJldCA9IDE7Ci0JCQlrZXlfZnJlZShwdWIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJa2V5X2ZyZWUocHViKTsKLQl9Ci0JZmNsb3NlKGYpOwotCXJldHVybiByZXQ7Ci19Ci0KZGlmZiAtLWdpdCBhL2F1dGhmaWxlLmggYi9hdXRoZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODM0OWJlLi4wMDAwMDAwCi0tLSBhL2F1dGhmaWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiAkT3BlbkJTRDogYXV0aGZpbGUuaCx2IDEuMTYgMjAxMS8wNS8wNCAyMToxNToyOSBkam0gRXhwICQgKi8KLQotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpZm5kZWYgQVVUSEZJTEVfSAotI2RlZmluZSBBVVRIRklMRV9ICi0KLWludAkga2V5X3NhdmVfcHJpdmF0ZShLZXkgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci1pbnQJIGtleV9sb2FkX2ZpbGUoaW50LCBjb25zdCBjaGFyICosIEJ1ZmZlciAqKTsKLUtleQkqa2V5X2xvYWRfY2VydChjb25zdCBjaGFyICopOwotS2V5CSprZXlfbG9hZF9wdWJsaWMoY29uc3QgY2hhciAqLCBjaGFyICoqKTsKLUtleQkqa2V5X2xvYWRfcHVibGljX3R5cGUoaW50LCBjb25zdCBjaGFyICosIGNoYXIgKiopOwotS2V5CSprZXlfcGFyc2VfcHJpdmF0ZShCdWZmZXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIgKiopOwotS2V5CSprZXlfbG9hZF9wcml2YXRlKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjaGFyICoqKTsKLUtleQkqa2V5X2xvYWRfcHJpdmF0ZV9jZXJ0KGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCAqKTsKLUtleQkqa2V5X2xvYWRfcHJpdmF0ZV90eXBlKGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIgKiosIGludCAqKTsKLUtleQkqa2V5X2xvYWRfcHJpdmF0ZV9wZW0oaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgY2hhciAqKik7Ci1pbnQJIGtleV9wZXJtX29rKGludCwgY29uc3QgY2hhciAqKTsKLWludAkga2V5X2luX2ZpbGUoS2V5ICosIGNvbnN0IGNoYXIgKiwgaW50KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9idWZhdXguYyBiL2J1ZmF1eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDIwOGNhLi4wMDAwMDAwCi0tLSBhL2J1ZmF1eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qICRPcGVuQlNEOiBidWZhdXguYyx2IDEuNTAgMjAxMC8wOC8zMSAwOTo1ODozNyBkam0gRXhwICQgKi8KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiBBdXhpbGlhcnkgZnVuY3Rpb25zIGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIHZhcmlvdXMgZGF0YSB0eXBlcyB0by9mcm9tCi0gKiBCdWZmZXJzLgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKgotICoKLSAqIFNTSDIgcGFja2V0IGZvcm1hdCBhZGRlZCBieSBNYXJrdXMgRnJpZWRsCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLS8qCi0gKiBSZXR1cm5zIGludGVnZXJzIGZyb20gdGhlIGJ1ZmZlciAobXNiIGZpcnN0KS4KLSAqLwotCi1pbnQKLWJ1ZmZlcl9nZXRfc2hvcnRfcmV0KHVfc2hvcnQgKnJldCwgQnVmZmVyICpidWZmZXIpCi17Ci0JdV9jaGFyIGJ1ZlsyXTsKLQotCWlmIChidWZmZXJfZ2V0X3JldChidWZmZXIsIChjaGFyICopIGJ1ZiwgMikgPT0gLTEpCi0JCXJldHVybiAoLTEpOwotCSpyZXQgPSBnZXRfdTE2KGJ1Zik7Ci0JcmV0dXJuICgwKTsKLX0KLQotdV9zaG9ydAotYnVmZmVyX2dldF9zaG9ydChCdWZmZXIgKmJ1ZmZlcikKLXsKLQl1X3Nob3J0IHJldDsKLQotCWlmIChidWZmZXJfZ2V0X3Nob3J0X3JldCgmcmV0LCBidWZmZXIpID09IC0xKQotCQlmYXRhbCgiYnVmZmVyX2dldF9zaG9ydDogYnVmZmVyIGVycm9yIik7Ci0KLQlyZXR1cm4gKHJldCk7Ci19Ci0KLWludAotYnVmZmVyX2dldF9pbnRfcmV0KHVfaW50ICpyZXQsIEJ1ZmZlciAqYnVmZmVyKQotewotCXVfY2hhciBidWZbNF07Ci0KLQlpZiAoYnVmZmVyX2dldF9yZXQoYnVmZmVyLCAoY2hhciAqKSBidWYsIDQpID09IC0xKQotCQlyZXR1cm4gKC0xKTsKLQlpZiAocmV0ICE9IE5VTEwpCi0JCSpyZXQgPSBnZXRfdTMyKGJ1Zik7Ci0JcmV0dXJuICgwKTsKLX0KLQotdV9pbnQKLWJ1ZmZlcl9nZXRfaW50KEJ1ZmZlciAqYnVmZmVyKQotewotCXVfaW50IHJldDsKLQotCWlmIChidWZmZXJfZ2V0X2ludF9yZXQoJnJldCwgYnVmZmVyKSA9PSAtMSkKLQkJZmF0YWwoImJ1ZmZlcl9nZXRfaW50OiBidWZmZXIgZXJyb3IiKTsKLQotCXJldHVybiAocmV0KTsKLX0KLQotaW50Ci1idWZmZXJfZ2V0X2ludDY0X3JldCh1X2ludDY0X3QgKnJldCwgQnVmZmVyICpidWZmZXIpCi17Ci0JdV9jaGFyIGJ1Zls4XTsKLQotCWlmIChidWZmZXJfZ2V0X3JldChidWZmZXIsIChjaGFyICopIGJ1ZiwgOCkgPT0gLTEpCi0JCXJldHVybiAoLTEpOwotCWlmIChyZXQgIT0gTlVMTCkKLQkJKnJldCA9IGdldF91NjQoYnVmKTsKLQlyZXR1cm4gKDApOwotfQotCi11X2ludDY0X3QKLWJ1ZmZlcl9nZXRfaW50NjQoQnVmZmVyICpidWZmZXIpCi17Ci0JdV9pbnQ2NF90IHJldDsKLQotCWlmIChidWZmZXJfZ2V0X2ludDY0X3JldCgmcmV0LCBidWZmZXIpID09IC0xKQotCQlmYXRhbCgiYnVmZmVyX2dldF9pbnQ6IGJ1ZmZlciBlcnJvciIpOwotCi0JcmV0dXJuIChyZXQpOwotfQotCi0vKgotICogU3RvcmVzIGludGVnZXJzIGluIHRoZSBidWZmZXIsIG1zYiBmaXJzdC4KLSAqLwotdm9pZAotYnVmZmVyX3B1dF9zaG9ydChCdWZmZXIgKmJ1ZmZlciwgdV9zaG9ydCB2YWx1ZSkKLXsKLQljaGFyIGJ1ZlsyXTsKLQotCXB1dF91MTYoYnVmLCB2YWx1ZSk7Ci0JYnVmZmVyX2FwcGVuZChidWZmZXIsIGJ1ZiwgMik7Ci19Ci0KLXZvaWQKLWJ1ZmZlcl9wdXRfaW50KEJ1ZmZlciAqYnVmZmVyLCB1X2ludCB2YWx1ZSkKLXsKLQljaGFyIGJ1Zls0XTsKLQotCXB1dF91MzIoYnVmLCB2YWx1ZSk7Ci0JYnVmZmVyX2FwcGVuZChidWZmZXIsIGJ1ZiwgNCk7Ci19Ci0KLXZvaWQKLWJ1ZmZlcl9wdXRfaW50NjQoQnVmZmVyICpidWZmZXIsIHVfaW50NjRfdCB2YWx1ZSkKLXsKLQljaGFyIGJ1Zls4XTsKLQotCXB1dF91NjQoYnVmLCB2YWx1ZSk7Ci0JYnVmZmVyX2FwcGVuZChidWZmZXIsIGJ1ZiwgOCk7Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIGFuIGFyYml0cmFyeSBiaW5hcnkgc3RyaW5nIGZyb20gdGhlIGJ1ZmZlci4gIFRoZSBzdHJpbmcgY2Fubm90Ci0gKiBiZSBsb25nZXIgdGhhbiAyNTZrLiAgVGhlIHJldHVybmVkIHZhbHVlIHBvaW50cyB0byBtZW1vcnkgYWxsb2NhdGVkCi0gKiB3aXRoIHhtYWxsb2M7IGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiB0byBmcmVlCi0gKiB0aGUgZGF0YS4gIElmIGxlbmd0aF9wdHIgaXMgbm9uLU5VTEwsIHRoZSBsZW5ndGggb2YgdGhlIHJldHVybmVkIGRhdGEKLSAqIHdpbGwgYmUgc3RvcmVkIHRoZXJlLiAgQSBudWxsIGNoYXJhY3RlciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQKLSAqIHRvIHRoZSByZXR1cm5lZCBzdHJpbmcsIGFuZCBpcyBub3QgY291bnRlZCBpbiBsZW5ndGguCi0gKi8KLXZvaWQgKgotYnVmZmVyX2dldF9zdHJpbmdfcmV0KEJ1ZmZlciAqYnVmZmVyLCB1X2ludCAqbGVuZ3RoX3B0cikKLXsKLQl1X2NoYXIgKnZhbHVlOwotCXVfaW50IGxlbjsKLQotCS8qIEdldCB0aGUgbGVuZ3RoLiAqLwotCWlmIChidWZmZXJfZ2V0X2ludF9yZXQoJmxlbiwgYnVmZmVyKSAhPSAwKSB7Ci0JCWVycm9yKCJidWZmZXJfZ2V0X3N0cmluZ19yZXQ6IGNhbm5vdCBleHRyYWN0IGxlbmd0aCIpOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQlpZiAobGVuID4gMjU2ICogMTAyNCkgewotCQllcnJvcigiYnVmZmVyX2dldF9zdHJpbmdfcmV0OiBiYWQgc3RyaW5nIGxlbmd0aCAldSIsIGxlbik7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCS8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgc3RyaW5nLiAgQWRkIG9uZSBieXRlIGZvciBhIG51bGwgY2hhcmFjdGVyLiAqLwotCXZhbHVlID0geG1hbGxvYyhsZW4gKyAxKTsKLQkvKiBHZXQgdGhlIHN0cmluZy4gKi8KLQlpZiAoYnVmZmVyX2dldF9yZXQoYnVmZmVyLCB2YWx1ZSwgbGVuKSA9PSAtMSkgewotCQllcnJvcigiYnVmZmVyX2dldF9zdHJpbmdfcmV0OiBidWZmZXJfZ2V0IGZhaWxlZCIpOwotCQl4ZnJlZSh2YWx1ZSk7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCS8qIEFwcGVuZCBhIG51bGwgY2hhcmFjdGVyIHRvIG1ha2UgcHJvY2Vzc2luZyBlYXNpZXIuICovCi0JdmFsdWVbbGVuXSA9ICdcMCc7Ci0JLyogT3B0aW9uYWxseSByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLiAqLwotCWlmIChsZW5ndGhfcHRyKQotCQkqbGVuZ3RoX3B0ciA9IGxlbjsKLQlyZXR1cm4gKHZhbHVlKTsKLX0KLQotdm9pZCAqCi1idWZmZXJfZ2V0X3N0cmluZyhCdWZmZXIgKmJ1ZmZlciwgdV9pbnQgKmxlbmd0aF9wdHIpCi17Ci0Jdm9pZCAqcmV0OwotCi0JaWYgKChyZXQgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQoYnVmZmVyLCBsZW5ndGhfcHRyKSkgPT0gTlVMTCkKLQkJZmF0YWwoImJ1ZmZlcl9nZXRfc3RyaW5nOiBidWZmZXIgZXJyb3IiKTsKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLWNoYXIgKgotYnVmZmVyX2dldF9jc3RyaW5nX3JldChCdWZmZXIgKmJ1ZmZlciwgdV9pbnQgKmxlbmd0aF9wdHIpCi17Ci0JdV9pbnQgbGVuZ3RoOwotCWNoYXIgKmNwLCAqcmV0ID0gYnVmZmVyX2dldF9zdHJpbmdfcmV0KGJ1ZmZlciwgJmxlbmd0aCk7Ci0KLQlpZiAocmV0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICgoY3AgPSBtZW1jaHIocmV0LCAnXDAnLCBsZW5ndGgpKSAhPSBOVUxMKSB7Ci0JCS8qIFhYWCBhbGxvdyBcMCBhdCBlbmQtb2Ytc3RyaW5nIGZvciBhIHdoaWxlLCByZW1vdmUgbGF0ZXIgKi8KLQkJaWYgKGNwID09IHJldCArIGxlbmd0aCAtIDEpCi0JCQllcnJvcigiYnVmZmVyX2dldF9jc3RyaW5nX3JldDogc3RyaW5nIGNvbnRhaW5zIFxcMCIpOwotCQllbHNlIHsKLQkJCWJ6ZXJvKHJldCwgbGVuZ3RoKTsKLQkJCXhmcmVlKHJldCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlpZiAobGVuZ3RoX3B0ciAhPSBOVUxMKQotCQkqbGVuZ3RoX3B0ciA9IGxlbmd0aDsKLQlyZXR1cm4gcmV0OwotfQotCi1jaGFyICoKLWJ1ZmZlcl9nZXRfY3N0cmluZyhCdWZmZXIgKmJ1ZmZlciwgdV9pbnQgKmxlbmd0aF9wdHIpCi17Ci0JY2hhciAqcmV0OwotCi0JaWYgKChyZXQgPSBidWZmZXJfZ2V0X2NzdHJpbmdfcmV0KGJ1ZmZlciwgbGVuZ3RoX3B0cikpID09IE5VTEwpCi0JCWZhdGFsKCJidWZmZXJfZ2V0X2NzdHJpbmc6IGJ1ZmZlciBlcnJvciIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgKgotYnVmZmVyX2dldF9zdHJpbmdfcHRyX3JldChCdWZmZXIgKmJ1ZmZlciwgdV9pbnQgKmxlbmd0aF9wdHIpCi17Ci0Jdm9pZCAqcHRyOwotCXVfaW50IGxlbjsKLQotCWlmIChidWZmZXJfZ2V0X2ludF9yZXQoJmxlbiwgYnVmZmVyKSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobGVuID4gMjU2ICogMTAyNCkgewotCQllcnJvcigiYnVmZmVyX2dldF9zdHJpbmdfcHRyOiBiYWQgc3RyaW5nIGxlbmd0aCAldSIsIGxlbik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlwdHIgPSBidWZmZXJfcHRyKGJ1ZmZlcik7Ci0JYnVmZmVyX2NvbnN1bWUoYnVmZmVyLCBsZW4pOwotCWlmIChsZW5ndGhfcHRyKQotCQkqbGVuZ3RoX3B0ciA9IGxlbjsKLQlyZXR1cm4gKHB0cik7Ci19Ci0KLXZvaWQgKgotYnVmZmVyX2dldF9zdHJpbmdfcHRyKEJ1ZmZlciAqYnVmZmVyLCB1X2ludCAqbGVuZ3RoX3B0cikKLXsKLQl2b2lkICpyZXQ7Ci0KLQlpZiAoKHJldCA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3B0cl9yZXQoYnVmZmVyLCBsZW5ndGhfcHRyKSkgPT0gTlVMTCkKLQkJZmF0YWwoImJ1ZmZlcl9nZXRfc3RyaW5nX3B0cjogYnVmZmVyIGVycm9yIik7Ci0JcmV0dXJuIChyZXQpOwotfQotCi0vKgotICogU3RvcmVzIGFuZCBhcmJpdHJhcnkgYmluYXJ5IHN0cmluZyBpbiB0aGUgYnVmZmVyLgotICovCi12b2lkCi1idWZmZXJfcHV0X3N0cmluZyhCdWZmZXIgKmJ1ZmZlciwgY29uc3Qgdm9pZCAqYnVmLCB1X2ludCBsZW4pCi17Ci0JYnVmZmVyX3B1dF9pbnQoYnVmZmVyLCBsZW4pOwotCWJ1ZmZlcl9hcHBlbmQoYnVmZmVyLCBidWYsIGxlbik7Ci19Ci12b2lkCi1idWZmZXJfcHV0X2NzdHJpbmcoQnVmZmVyICpidWZmZXIsIGNvbnN0IGNoYXIgKnMpCi17Ci0JaWYgKHMgPT0gTlVMTCkKLQkJZmF0YWwoImJ1ZmZlcl9wdXRfY3N0cmluZzogcyA9PSBOVUxMIik7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoYnVmZmVyLCBzLCBzdHJsZW4ocykpOwotfQotCi0vKgotICogUmV0dXJucyBhIGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXIgKDAgLSAyNTUpLgotICovCi1pbnQKLWJ1ZmZlcl9nZXRfY2hhcl9yZXQoY2hhciAqcmV0LCBCdWZmZXIgKmJ1ZmZlcikKLXsKLQlpZiAoYnVmZmVyX2dldF9yZXQoYnVmZmVyLCByZXQsIDEpID09IC0xKSB7Ci0JCWVycm9yKCJidWZmZXJfZ2V0X2NoYXJfcmV0OiBidWZmZXJfZ2V0X3JldCBmYWlsZWQiKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCXJldHVybiAoMCk7Ci19Ci0KLWludAotYnVmZmVyX2dldF9jaGFyKEJ1ZmZlciAqYnVmZmVyKQotewotCWNoYXIgY2g7Ci0KLQlpZiAoYnVmZmVyX2dldF9jaGFyX3JldCgmY2gsIGJ1ZmZlcikgPT0gLTEpCi0JCWZhdGFsKCJidWZmZXJfZ2V0X2NoYXI6IGJ1ZmZlciBlcnJvciIpOwotCXJldHVybiAodV9jaGFyKSBjaDsKLX0KLQotLyoKLSAqIFN0b3JlcyBhIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLgotICovCi12b2lkCi1idWZmZXJfcHV0X2NoYXIoQnVmZmVyICpidWZmZXIsIGludCB2YWx1ZSkKLXsKLQljaGFyIGNoID0gdmFsdWU7Ci0KLQlidWZmZXJfYXBwZW5kKGJ1ZmZlciwgJmNoLCAxKTsKLX0KZGlmZiAtLWdpdCBhL2J1ZmJuLmMgYi9idWZibi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTFjZDA5Li4wMDAwMDAwCi0tLSBhL2J1ZmJuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGJ1ZmJuLmMsdiAxLjYgMjAwNy8wNi8wMiAwOTowNDo1OCBkam0gRXhwICQqLwotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIEF1eGlsaWFyeSBmdW5jdGlvbnMgZm9yIHN0b3JpbmcgYW5kIHJldHJpZXZpbmcgdmFyaW91cyBkYXRhIHR5cGVzIHRvL2Zyb20KLSAqIEJ1ZmZlcnMuCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqCi0gKgotICogU1NIMiBwYWNrZXQgZm9ybWF0IGFkZGVkIGJ5IE1hcmt1cyBGcmllZGwKLSAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLQotLyoKLSAqIFN0b3JlcyBhbiBCSUdOVU0gaW4gdGhlIGJ1ZmZlciB3aXRoIGEgMi1ieXRlIG1zYiBmaXJzdCBiaXQgY291bnQsIGZvbGxvd2VkCi0gKiBieSAoYml0cys3KS84IGJ5dGVzIG9mIGJpbmFyeSBkYXRhLCBtc2IgZmlyc3QuCi0gKi8KLWludAotYnVmZmVyX3B1dF9iaWdudW1fcmV0KEJ1ZmZlciAqYnVmZmVyLCBjb25zdCBCSUdOVU0gKnZhbHVlKQotewotCWludCBiaXRzID0gQk5fbnVtX2JpdHModmFsdWUpOwotCWludCBiaW5fc2l6ZSA9IChiaXRzICsgNykgLyA4OwotCXVfY2hhciAqYnVmID0geG1hbGxvYyhiaW5fc2l6ZSk7Ci0JaW50IG9pOwotCWNoYXIgbXNnWzJdOwotCi0JLyogR2V0IHRoZSB2YWx1ZSBvZiBpbiBiaW5hcnkgKi8KLQlvaSA9IEJOX2JuMmJpbih2YWx1ZSwgYnVmKTsKLQlpZiAob2kgIT0gYmluX3NpemUpIHsKLQkJZXJyb3IoImJ1ZmZlcl9wdXRfYmlnbnVtX3JldDogQk5fYm4yYmluKCkgZmFpbGVkOiBvaSAlZCAhPSBiaW5fc2l6ZSAlZCIsCi0JCSAgICBvaSwgYmluX3NpemUpOwotCQl4ZnJlZShidWYpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQkvKiBTdG9yZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGJ1ZmZlciBpbiB0d28gYnl0ZXMsIG1zYiBmaXJzdC4gKi8KLQlwdXRfdTE2KG1zZywgYml0cyk7Ci0JYnVmZmVyX2FwcGVuZChidWZmZXIsIG1zZywgMik7Ci0JLyogU3RvcmUgdGhlIGJpbmFyeSBkYXRhLiAqLwotCWJ1ZmZlcl9hcHBlbmQoYnVmZmVyLCBidWYsIG9pKTsKLQotCW1lbXNldChidWYsIDAsIGJpbl9zaXplKTsKLQl4ZnJlZShidWYpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotdm9pZAotYnVmZmVyX3B1dF9iaWdudW0oQnVmZmVyICpidWZmZXIsIGNvbnN0IEJJR05VTSAqdmFsdWUpCi17Ci0JaWYgKGJ1ZmZlcl9wdXRfYmlnbnVtX3JldChidWZmZXIsIHZhbHVlKSA9PSAtMSkKLQkJZmF0YWwoImJ1ZmZlcl9wdXRfYmlnbnVtOiBidWZmZXIgZXJyb3IiKTsKLX0KLQotLyoKLSAqIFJldHJpZXZlcyBhIEJJR05VTSBmcm9tIHRoZSBidWZmZXIuCi0gKi8KLWludAotYnVmZmVyX2dldF9iaWdudW1fcmV0KEJ1ZmZlciAqYnVmZmVyLCBCSUdOVU0gKnZhbHVlKQotewotCXVfaW50IGJpdHMsIGJ5dGVzOwotCXVfY2hhciBidWZbMl0sICpiaW47Ci0KLQkvKiBHZXQgdGhlIG51bWJlciBvZiBiaXRzLiAqLwotCWlmIChidWZmZXJfZ2V0X3JldChidWZmZXIsIChjaGFyICopIGJ1ZiwgMikgPT0gLTEpIHsKLQkJZXJyb3IoImJ1ZmZlcl9nZXRfYmlnbnVtX3JldDogaW52YWxpZCBsZW5ndGgiKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWJpdHMgPSBnZXRfdTE2KGJ1Zik7Ci0JLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJpbmFyeSBieXRlcyB0aGF0IGZvbGxvdy4gKi8KLQlieXRlcyA9IChiaXRzICsgNykgLyA4OwotCWlmIChieXRlcyA+IDggKiAxMDI0KSB7Ci0JCWVycm9yKCJidWZmZXJfZ2V0X2JpZ251bV9yZXQ6IGNhbm5vdCBoYW5kbGUgQk4gb2Ygc2l6ZSAlZCIsIGJ5dGVzKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWlmIChidWZmZXJfbGVuKGJ1ZmZlcikgPCBieXRlcykgewotCQllcnJvcigiYnVmZmVyX2dldF9iaWdudW1fcmV0OiBpbnB1dCBidWZmZXIgdG9vIHNtYWxsIik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQliaW4gPSBidWZmZXJfcHRyKGJ1ZmZlcik7Ci0JaWYgKEJOX2JpbjJibihiaW4sIGJ5dGVzLCB2YWx1ZSkgPT0gTlVMTCkgewotCQllcnJvcigiYnVmZmVyX2dldF9iaWdudW1fcmV0OiBCTl9iaW4yYm4gZmFpbGVkIik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlpZiAoYnVmZmVyX2NvbnN1bWVfcmV0KGJ1ZmZlciwgYnl0ZXMpID09IC0xKSB7Ci0JCWVycm9yKCJidWZmZXJfZ2V0X2JpZ251bV9yZXQ6IGJ1ZmZlcl9jb25zdW1lIGZhaWxlZCIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotdm9pZAotYnVmZmVyX2dldF9iaWdudW0oQnVmZmVyICpidWZmZXIsIEJJR05VTSAqdmFsdWUpCi17Ci0JaWYgKGJ1ZmZlcl9nZXRfYmlnbnVtX3JldChidWZmZXIsIHZhbHVlKSA9PSAtMSkKLQkJZmF0YWwoImJ1ZmZlcl9nZXRfYmlnbnVtOiBidWZmZXIgZXJyb3IiKTsKLX0KLQotLyoKLSAqIFN0b3JlcyBhIEJJR05VTSBpbiB0aGUgYnVmZmVyIGluIFNTSDIgZm9ybWF0LgotICovCi1pbnQKLWJ1ZmZlcl9wdXRfYmlnbnVtMl9yZXQoQnVmZmVyICpidWZmZXIsIGNvbnN0IEJJR05VTSAqdmFsdWUpCi17Ci0JdV9pbnQgYnl0ZXM7Ci0JdV9jaGFyICpidWY7Ci0JaW50IG9pOwotCXVfaW50IGhhc25vaGlnaCA9IDA7Ci0KLQlpZiAoQk5faXNfemVybyh2YWx1ZSkpIHsKLQkJYnVmZmVyX3B1dF9pbnQoYnVmZmVyLCAwKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICh2YWx1ZS0+bmVnKSB7Ci0JCWVycm9yKCJidWZmZXJfcHV0X2JpZ251bTJfcmV0OiBuZWdhdGl2ZSBudW1iZXJzIG5vdCBzdXBwb3J0ZWQiKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWJ5dGVzID0gQk5fbnVtX2J5dGVzKHZhbHVlKSArIDE7IC8qIGV4dHJhIHBhZGRpbmcgYnl0ZSAqLwotCWlmIChieXRlcyA8IDIpIHsKLQkJZXJyb3IoImJ1ZmZlcl9wdXRfYmlnbnVtMl9yZXQ6IEJOIHRvbyBzbWFsbCIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JYnVmID0geG1hbGxvYyhieXRlcyk7Ci0JYnVmWzBdID0gMHgwMDsKLQkvKiBHZXQgdGhlIHZhbHVlIG9mIGluIGJpbmFyeSAqLwotCW9pID0gQk5fYm4yYmluKHZhbHVlLCBidWYrMSk7Ci0JaWYgKG9pIDwgMCB8fCAodV9pbnQpb2kgIT0gYnl0ZXMgLSAxKSB7Ci0JCWVycm9yKCJidWZmZXJfcHV0X2JpZ251bTJfcmV0OiBCTl9ibjJiaW4oKSBmYWlsZWQ6ICIKLQkJICAgICJvaSAlZCAhPSBiaW5fc2l6ZSAlZCIsIG9pLCBieXRlcyk7Ci0JCXhmcmVlKGJ1Zik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQloYXNub2hpZ2ggPSAoYnVmWzFdICYgMHg4MCkgPyAwIDogMTsKLQlidWZmZXJfcHV0X3N0cmluZyhidWZmZXIsIGJ1ZitoYXNub2hpZ2gsIGJ5dGVzLWhhc25vaGlnaCk7Ci0JbWVtc2V0KGJ1ZiwgMCwgYnl0ZXMpOwotCXhmcmVlKGJ1Zik7Ci0JcmV0dXJuICgwKTsKLX0KLQotdm9pZAotYnVmZmVyX3B1dF9iaWdudW0yKEJ1ZmZlciAqYnVmZmVyLCBjb25zdCBCSUdOVU0gKnZhbHVlKQotewotCWlmIChidWZmZXJfcHV0X2JpZ251bTJfcmV0KGJ1ZmZlciwgdmFsdWUpID09IC0xKQotCQlmYXRhbCgiYnVmZmVyX3B1dF9iaWdudW0yOiBidWZmZXIgZXJyb3IiKTsKLX0KLQotaW50Ci1idWZmZXJfZ2V0X2JpZ251bTJfcmV0KEJ1ZmZlciAqYnVmZmVyLCBCSUdOVU0gKnZhbHVlKQotewotCXVfaW50IGxlbjsKLQl1X2NoYXIgKmJpbjsKLQotCWlmICgoYmluID0gYnVmZmVyX2dldF9zdHJpbmdfcmV0KGJ1ZmZlciwgJmxlbikpID09IE5VTEwpIHsKLQkJZXJyb3IoImJ1ZmZlcl9nZXRfYmlnbnVtMl9yZXQ6IGludmFsaWQgYmlnbnVtIik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCWlmIChsZW4gPiAwICYmIChiaW5bMF0gJiAweDgwKSkgewotCQllcnJvcigiYnVmZmVyX2dldF9iaWdudW0yX3JldDogbmVnYXRpdmUgbnVtYmVycyBub3Qgc3VwcG9ydGVkIik7Ci0JCXhmcmVlKGJpbik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlpZiAobGVuID4gOCAqIDEwMjQpIHsKLQkJZXJyb3IoImJ1ZmZlcl9nZXRfYmlnbnVtMl9yZXQ6IGNhbm5vdCBoYW5kbGUgQk4gb2Ygc2l6ZSAlZCIsCi0JCSAgICBsZW4pOwotCQl4ZnJlZShiaW4pOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JaWYgKEJOX2JpbjJibihiaW4sIGxlbiwgdmFsdWUpID09IE5VTEwpIHsKLQkJZXJyb3IoImJ1ZmZlcl9nZXRfYmlnbnVtMl9yZXQ6IEJOX2JpbjJibiBmYWlsZWQiKTsKLQkJeGZyZWUoYmluKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCXhmcmVlKGJpbik7Ci0JcmV0dXJuICgwKTsKLX0KLQotdm9pZAotYnVmZmVyX2dldF9iaWdudW0yKEJ1ZmZlciAqYnVmZmVyLCBCSUdOVU0gKnZhbHVlKQotewotCWlmIChidWZmZXJfZ2V0X2JpZ251bTJfcmV0KGJ1ZmZlciwgdmFsdWUpID09IC0xKQotCQlmYXRhbCgiYnVmZmVyX2dldF9iaWdudW0yOiBidWZmZXIgZXJyb3IiKTsKLX0KZGlmZiAtLWdpdCBhL2J1ZmVjLmMgYi9idWZlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGNiNDk0Li4wMDAwMDAwCi0tLSBhL2J1ZmVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGJ1ZmVjLmMsdiAxLjEgMjAxMC8wOC8zMSAxMTo1NDo0NSBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLS8qCi0gKiBNYXhpbXVtIHN1cHBvcnRlZCBFQyBHRnAgZmllbGQgbGVuZ3RoIGlzIDUyOCBiaXRzLiBTRUMxIHVuY29tcHJlc3NlZAotICogZW5jb2RpbmcgcmVwcmVzZW50cyB0aGlzIGFzIHR3byBiaXRzdHJpbmcgcG9pbnRzIHRoYXQgc2hvdWxkIGVhY2gKLSAqIGJlIG5vIGxvbmdlciB0aGFuIHRoZSBmaWVsZCBsZW5ndGgsIFNFQzEgc3BlY2lmaWVzIGEgMSBieXRlCi0gKiBwb2ludCB0eXBlIGhlYWRlci4KLSAqIEJlaW5nIHBhcmFub2lkIGhlcmUgbWF5IGluc3VsYXRlIHVzIHRvIHBhcnNpbmcgcHJvYmxlbXMgaW4KLSAqIEVDX1BPSU5UX29jdDJwb2ludC4KLSAqLwotI2RlZmluZSBCVUZGRVJfTUFYX0VDUE9JTlRfTEVOICgoNTI4KjIgLyA4KSArIDEpCi0KLS8qCi0gKiBBcHBlbmQgYW4gRUNfUE9JTlQgdG8gdGhlIGJ1ZmZlciBhcyBhIHN0cmluZyBjb250YWluaW5nIGEgU0VDMSBlbmNvZGVkCi0gKiB1bmNvbXByZXNzZWQgcG9pbnQuIEZvcnR1bmF0ZWx5IE9wZW5TU0wgaGFuZGxlcyB0aGUgZ29yeSBkZXRhaWxzIGZvciB1cy4KLSAqLwotaW50Ci1idWZmZXJfcHV0X2VjcG9pbnRfcmV0KEJ1ZmZlciAqYnVmZmVyLCBjb25zdCBFQ19HUk9VUCAqY3VydmUsCi0gICAgY29uc3QgRUNfUE9JTlQgKnBvaW50KQotewotCXVfY2hhciAqYnVmID0gTlVMTDsKLQlzaXplX3QgbGVuOwotCUJOX0NUWCAqYm5jdHg7Ci0JaW50IHJldCA9IC0xOwotCi0JLyogRGV0ZXJtaW5lIGxlbmd0aCAqLwotCWlmICgoYm5jdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fQ1RYX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JbGVuID0gRUNfUE9JTlRfcG9pbnQyb2N0KGN1cnZlLCBwb2ludCwgUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQsCi0JICAgIE5VTEwsIDAsIGJuY3R4KTsKLQlpZiAobGVuID4gQlVGRkVSX01BWF9FQ1BPSU5UX0xFTikgewotCQllcnJvcigiJXM6IGdpYW50IEVDIHBvaW50OiBsZW4gPSAlbHUgKG1heCAldSkiLAotCQkgICAgX19mdW5jX18sICh1X2xvbmcpbGVuLCBCVUZGRVJfTUFYX0VDUE9JTlRfTEVOKTsKLQkJZ290byBvdXQ7Ci0JfQotCS8qIENvbnZlcnQgKi8KLQlidWYgPSB4bWFsbG9jKGxlbik7Ci0JaWYgKEVDX1BPSU5UX3BvaW50Mm9jdChjdXJ2ZSwgcG9pbnQsIFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VELAotCSAgICBidWYsIGxlbiwgYm5jdHgpICE9IGxlbikgewotCQllcnJvcigiJXM6IEVDX1BPSU5UX3BvaW50Mm9jdCBsZW5ndGggbWlzbWF0Y2giLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQkvKiBBcHBlbmQgKi8KLQlidWZmZXJfcHV0X3N0cmluZyhidWZmZXIsIGJ1ZiwgbGVuKTsKLQlyZXQgPSAwOwotIG91dDoKLQlpZiAoYnVmICE9IE5VTEwpIHsKLQkJYnplcm8oYnVmLCBsZW4pOwotCQl4ZnJlZShidWYpOwotCX0KLQlCTl9DVFhfZnJlZShibmN0eCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZAotYnVmZmVyX3B1dF9lY3BvaW50KEJ1ZmZlciAqYnVmZmVyLCBjb25zdCBFQ19HUk9VUCAqY3VydmUsCi0gICAgY29uc3QgRUNfUE9JTlQgKnBvaW50KQotewotCWlmIChidWZmZXJfcHV0X2VjcG9pbnRfcmV0KGJ1ZmZlciwgY3VydmUsIHBvaW50KSA9PSAtMSkKLQkJZmF0YWwoIiVzOiBidWZmZXIgZXJyb3IiLCBfX2Z1bmNfXyk7Ci19Ci0KLWludAotYnVmZmVyX2dldF9lY3BvaW50X3JldChCdWZmZXIgKmJ1ZmZlciwgY29uc3QgRUNfR1JPVVAgKmN1cnZlLAotICAgIEVDX1BPSU5UICpwb2ludCkKLXsKLQl1X2NoYXIgKmJ1ZjsKLQl1X2ludCBsZW47Ci0JQk5fQ1RYICpibmN0eDsKLQlpbnQgcmV0ID0gLTE7Ci0KLQlpZiAoKGJ1ZiA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChidWZmZXIsICZsZW4pKSA9PSBOVUxMKSB7Ci0JCWVycm9yKCIlczogaW52YWxpZCBwb2ludCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKGJuY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEJOX0NUWF9uZXcgZmFpbGVkIiwgX19mdW5jX18pOwotCWlmIChsZW4gPiBCVUZGRVJfTUFYX0VDUE9JTlRfTEVOKSB7Ci0JCWVycm9yKCIlczogRUNfUE9JTlQgdG9vIGxvbmc6ICV1ID4gbWF4ICV1IiwgX19mdW5jX18sCi0JCSAgICBsZW4sIEJVRkZFUl9NQVhfRUNQT0lOVF9MRU4pOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKGxlbiA9PSAwKSB7Ci0JCWVycm9yKCIlczogRUNfUE9JTlQgYnVmZmVyIGlzIGVtcHR5IiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKGJ1ZlswXSAhPSBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCkgewotCQllcnJvcigiJXM6IEVDX1BPSU5UIGlzIGluIGFuIGluY29ycmVjdCBmb3JtOiAiCi0JCSAgICAiMHglMDJ4ICh3YW50IDB4JTAyeCkiLCBfX2Z1bmNfXywgYnVmWzBdLAotCQkgICAgUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQpOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKEVDX1BPSU5UX29jdDJwb2ludChjdXJ2ZSwgcG9pbnQsIGJ1ZiwgbGVuLCBibmN0eCkgIT0gMSkgewotCQllcnJvcigiYnVmZmVyX2dldF9iaWdudW0yX3JldDogQk5fYmluMmJuIGZhaWxlZCIpOwotCQlnb3RvIG91dDsKLQl9Ci0JLyogRUNfUE9JTlRfb2N0MnBvaW50IHZlcmlmaWVzIHRoYXQgdGhlIHBvaW50IGlzIG9uIHRoZSBjdXJ2ZSBmb3IgdXMgKi8KLQlyZXQgPSAwOwotIG91dDoKLQlCTl9DVFhfZnJlZShibmN0eCk7Ci0JYnplcm8oYnVmLCBsZW4pOwotCXhmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZAotYnVmZmVyX2dldF9lY3BvaW50KEJ1ZmZlciAqYnVmZmVyLCBjb25zdCBFQ19HUk9VUCAqY3VydmUsCi0gICAgRUNfUE9JTlQgKnBvaW50KQotewotCWlmIChidWZmZXJfZ2V0X2VjcG9pbnRfcmV0KGJ1ZmZlciwgY3VydmUsIHBvaW50KSA9PSAtMSkKLQkJZmF0YWwoIiVzOiBidWZmZXIgZXJyb3IiLCBfX2Z1bmNfXyk7Ci19Ci0KLSNlbmRpZiAvKiBPUEVOU1NMX0hBU19FQ0MgKi8KZGlmZiAtLWdpdCBhL2J1ZmZlci5jIGIvYnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOTcwMDMuLjAwMDAwMDAKLS0tIGEvYnVmZmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGJ1ZmZlci5jLHYgMS4zMiAyMDEwLzAyLzA5IDAzOjU2OjI4IGRqbSBFeHAgJCAqLwotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIEZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIGZpZm8gYnVmZmVycyAodGhhdCBjYW4gZ3JvdyBpZiBuZWVkZWQpLgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0KLSNkZWZpbmUJQlVGRkVSX01BWF9DSFVOSwkweDEwMDAwMAotI2RlZmluZQlCVUZGRVJfTUFYX0xFTgkJMHhhMDAwMDAKLSNkZWZpbmUJQlVGRkVSX0FMTE9DU1oJCTB4MDA4MDAwCi0KLS8qIEluaXRpYWxpemVzIHRoZSBidWZmZXIgc3RydWN0dXJlLiAqLwotCi12b2lkCi1idWZmZXJfaW5pdChCdWZmZXIgKmJ1ZmZlcikKLXsKLQljb25zdCB1X2ludCBsZW4gPSA0MDk2OwotCi0JYnVmZmVyLT5hbGxvYyA9IDA7Ci0JYnVmZmVyLT5idWYgPSB4bWFsbG9jKGxlbik7Ci0JYnVmZmVyLT5hbGxvYyA9IGxlbjsKLQlidWZmZXItPm9mZnNldCA9IDA7Ci0JYnVmZmVyLT5lbmQgPSAwOwotfQotCi0vKiBGcmVlcyBhbnkgbWVtb3J5IHVzZWQgZm9yIHRoZSBidWZmZXIuICovCi0KLXZvaWQKLWJ1ZmZlcl9mcmVlKEJ1ZmZlciAqYnVmZmVyKQotewotCWlmIChidWZmZXItPmFsbG9jID4gMCkgewotCQltZW1zZXQoYnVmZmVyLT5idWYsIDAsIGJ1ZmZlci0+YWxsb2MpOwotCQlidWZmZXItPmFsbG9jID0gMDsKLQkJeGZyZWUoYnVmZmVyLT5idWYpOwotCX0KLX0KLQotLyoKLSAqIENsZWFycyBhbnkgZGF0YSBmcm9tIHRoZSBidWZmZXIsIG1ha2luZyBpdCBlbXB0eS4gIFRoaXMgZG9lcyBub3QgYWN0dWFsbHkKLSAqIHplcm8gdGhlIG1lbW9yeS4KLSAqLwotCi12b2lkCi1idWZmZXJfY2xlYXIoQnVmZmVyICpidWZmZXIpCi17Ci0JYnVmZmVyLT5vZmZzZXQgPSAwOwotCWJ1ZmZlci0+ZW5kID0gMDsKLX0KLQotLyogQXBwZW5kcyBkYXRhIHRvIHRoZSBidWZmZXIsIGV4cGFuZGluZyBpdCBpZiBuZWNlc3NhcnkuICovCi0KLXZvaWQKLWJ1ZmZlcl9hcHBlbmQoQnVmZmVyICpidWZmZXIsIGNvbnN0IHZvaWQgKmRhdGEsIHVfaW50IGxlbikKLXsKLQl2b2lkICpwOwotCXAgPSBidWZmZXJfYXBwZW5kX3NwYWNlKGJ1ZmZlciwgbGVuKTsKLQltZW1jcHkocCwgZGF0YSwgbGVuKTsKLX0KLQotc3RhdGljIGludAotYnVmZmVyX2NvbXBhY3QoQnVmZmVyICpidWZmZXIpCi17Ci0JLyoKLQkgKiBJZiB0aGUgYnVmZmVyIGlzIHF1aXRlIGVtcHR5LCBidXQgYWxsIGRhdGEgaXMgYXQgdGhlIGVuZCwgbW92ZSB0aGUKLQkgKiBkYXRhIHRvIHRoZSBiZWdpbm5pbmcuCi0JICovCi0JaWYgKGJ1ZmZlci0+b2Zmc2V0ID4gTUlOKGJ1ZmZlci0+YWxsb2MsIEJVRkZFUl9NQVhfQ0hVTkspKSB7Ci0JCW1lbW1vdmUoYnVmZmVyLT5idWYsIGJ1ZmZlci0+YnVmICsgYnVmZmVyLT5vZmZzZXQsCi0JCQlidWZmZXItPmVuZCAtIGJ1ZmZlci0+b2Zmc2V0KTsKLQkJYnVmZmVyLT5lbmQgLT0gYnVmZmVyLT5vZmZzZXQ7Ci0JCWJ1ZmZlci0+b2Zmc2V0ID0gMDsKLQkJcmV0dXJuICgxKTsKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotLyoKLSAqIEFwcGVuZHMgc3BhY2UgdG8gdGhlIGJ1ZmZlciwgZXhwYW5kaW5nIHRoZSBidWZmZXIgaWYgbmVjZXNzYXJ5LiBUaGlzIGRvZXMKLSAqIG5vdCBhY3R1YWxseSBjb3B5IHRoZSBkYXRhIGludG8gdGhlIGJ1ZmZlciwgYnV0IGluc3RlYWQgcmV0dXJucyBhIHBvaW50ZXIKLSAqIHRvIHRoZSBhbGxvY2F0ZWQgcmVnaW9uLgotICovCi0KLXZvaWQgKgotYnVmZmVyX2FwcGVuZF9zcGFjZShCdWZmZXIgKmJ1ZmZlciwgdV9pbnQgbGVuKQotewotCXVfaW50IG5ld2xlbjsKLQl2b2lkICpwOwotCi0JaWYgKGxlbiA+IEJVRkZFUl9NQVhfQ0hVTkspCi0JCWZhdGFsKCJidWZmZXJfYXBwZW5kX3NwYWNlOiBsZW4gJXUgbm90IHN1cHBvcnRlZCIsIGxlbik7Ci0KLQkvKiBJZiB0aGUgYnVmZmVyIGlzIGVtcHR5LCBzdGFydCB1c2luZyBpdCBmcm9tIHRoZSBiZWdpbm5pbmcuICovCi0JaWYgKGJ1ZmZlci0+b2Zmc2V0ID09IGJ1ZmZlci0+ZW5kKSB7Ci0JCWJ1ZmZlci0+b2Zmc2V0ID0gMDsKLQkJYnVmZmVyLT5lbmQgPSAwOwotCX0KLXJlc3RhcnQ6Ci0JLyogSWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIGFsbCBkYXRhLCBzdG9yZSBpdCBub3cuICovCi0JaWYgKGJ1ZmZlci0+ZW5kICsgbGVuIDwgYnVmZmVyLT5hbGxvYykgewotCQlwID0gYnVmZmVyLT5idWYgKyBidWZmZXItPmVuZDsKLQkJYnVmZmVyLT5lbmQgKz0gbGVuOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQkvKiBDb21wYWN0IGRhdGEgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KLQlpZiAoYnVmZmVyX2NvbXBhY3QoYnVmZmVyKSkKLQkJZ290byByZXN0YXJ0OwotCi0JLyogSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0cnkuICovCi0JbmV3bGVuID0gcm91bmR1cChidWZmZXItPmFsbG9jICsgbGVuLCBCVUZGRVJfQUxMT0NTWik7Ci0JaWYgKG5ld2xlbiA+IEJVRkZFUl9NQVhfTEVOKQotCQlmYXRhbCgiYnVmZmVyX2FwcGVuZF9zcGFjZTogYWxsb2MgJXUgbm90IHN1cHBvcnRlZCIsCi0JCSAgICBuZXdsZW4pOwotCWJ1ZmZlci0+YnVmID0geHJlYWxsb2MoYnVmZmVyLT5idWYsIDEsIG5ld2xlbik7Ci0JYnVmZmVyLT5hbGxvYyA9IG5ld2xlbjsKLQlnb3RvIHJlc3RhcnQ7Ci0JLyogTk9UUkVBQ0hFRCAqLwotfQotCi0vKgotICogQ2hlY2sgd2hldGhlciBhbiBhbGxvY2F0aW9uIG9mICdsZW4nIHdpbGwgZml0IGluIHRoZSBidWZmZXIKLSAqIFRoaXMgbXVzdCBmb2xsb3cgdGhlIHNhbWUgbWF0aCBhcyBidWZmZXJfYXBwZW5kX3NwYWNlCi0gKi8KLWludAotYnVmZmVyX2NoZWNrX2FsbG9jKEJ1ZmZlciAqYnVmZmVyLCB1X2ludCBsZW4pCi17Ci0JaWYgKGJ1ZmZlci0+b2Zmc2V0ID09IGJ1ZmZlci0+ZW5kKSB7Ci0JCWJ1ZmZlci0+b2Zmc2V0ID0gMDsKLQkJYnVmZmVyLT5lbmQgPSAwOwotCX0KLSByZXN0YXJ0OgotCWlmIChidWZmZXItPmVuZCArIGxlbiA8IGJ1ZmZlci0+YWxsb2MpCi0JCXJldHVybiAoMSk7Ci0JaWYgKGJ1ZmZlcl9jb21wYWN0KGJ1ZmZlcikpCi0JCWdvdG8gcmVzdGFydDsKLQlpZiAocm91bmR1cChidWZmZXItPmFsbG9jICsgbGVuLCBCVUZGRVJfQUxMT0NTWikgPD0gQlVGRkVSX01BWF9MRU4pCi0JCXJldHVybiAoMSk7Ci0JcmV0dXJuICgwKTsKLX0KLQotLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlci4gKi8KLQotdV9pbnQKLWJ1ZmZlcl9sZW4oY29uc3QgQnVmZmVyICpidWZmZXIpCi17Ci0JcmV0dXJuIGJ1ZmZlci0+ZW5kIC0gYnVmZmVyLT5vZmZzZXQ7Ci19Ci0KLS8qIEdldHMgZGF0YSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gKi8KLQotaW50Ci1idWZmZXJfZ2V0X3JldChCdWZmZXIgKmJ1ZmZlciwgdm9pZCAqYnVmLCB1X2ludCBsZW4pCi17Ci0JaWYgKGxlbiA+IGJ1ZmZlci0+ZW5kIC0gYnVmZmVyLT5vZmZzZXQpIHsKLQkJZXJyb3IoImJ1ZmZlcl9nZXRfcmV0OiB0cnlpbmcgdG8gZ2V0IG1vcmUgYnl0ZXMgJWQgdGhhbiBpbiBidWZmZXIgJWQiLAotCQkgICAgbGVuLCBidWZmZXItPmVuZCAtIGJ1ZmZlci0+b2Zmc2V0KTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCW1lbWNweShidWYsIGJ1ZmZlci0+YnVmICsgYnVmZmVyLT5vZmZzZXQsIGxlbik7Ci0JYnVmZmVyLT5vZmZzZXQgKz0gbGVuOwotCXJldHVybiAoMCk7Ci19Ci0KLXZvaWQKLWJ1ZmZlcl9nZXQoQnVmZmVyICpidWZmZXIsIHZvaWQgKmJ1ZiwgdV9pbnQgbGVuKQotewotCWlmIChidWZmZXJfZ2V0X3JldChidWZmZXIsIGJ1ZiwgbGVuKSA9PSAtMSkKLQkJZmF0YWwoImJ1ZmZlcl9nZXQ6IGJ1ZmZlciBlcnJvciIpOwotfQotCi0vKiBDb25zdW1lcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiAqLwotCi1pbnQKLWJ1ZmZlcl9jb25zdW1lX3JldChCdWZmZXIgKmJ1ZmZlciwgdV9pbnQgYnl0ZXMpCi17Ci0JaWYgKGJ5dGVzID4gYnVmZmVyLT5lbmQgLSBidWZmZXItPm9mZnNldCkgewotCQllcnJvcigiYnVmZmVyX2NvbnN1bWVfcmV0OiB0cnlpbmcgdG8gZ2V0IG1vcmUgYnl0ZXMgdGhhbiBpbiBidWZmZXIiKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWJ1ZmZlci0+b2Zmc2V0ICs9IGJ5dGVzOwotCXJldHVybiAoMCk7Ci19Ci0KLXZvaWQKLWJ1ZmZlcl9jb25zdW1lKEJ1ZmZlciAqYnVmZmVyLCB1X2ludCBieXRlcykKLXsKLQlpZiAoYnVmZmVyX2NvbnN1bWVfcmV0KGJ1ZmZlciwgYnl0ZXMpID09IC0xKQotCQlmYXRhbCgiYnVmZmVyX2NvbnN1bWU6IGJ1ZmZlciBlcnJvciIpOwotfQotCi0vKiBDb25zdW1lcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLwotCi1pbnQKLWJ1ZmZlcl9jb25zdW1lX2VuZF9yZXQoQnVmZmVyICpidWZmZXIsIHVfaW50IGJ5dGVzKQotewotCWlmIChieXRlcyA+IGJ1ZmZlci0+ZW5kIC0gYnVmZmVyLT5vZmZzZXQpCi0JCXJldHVybiAoLTEpOwotCWJ1ZmZlci0+ZW5kIC09IGJ5dGVzOwotCXJldHVybiAoMCk7Ci19Ci0KLXZvaWQKLWJ1ZmZlcl9jb25zdW1lX2VuZChCdWZmZXIgKmJ1ZmZlciwgdV9pbnQgYnl0ZXMpCi17Ci0JaWYgKGJ1ZmZlcl9jb25zdW1lX2VuZF9yZXQoYnVmZmVyLCBieXRlcykgPT0gLTEpCi0JCWZhdGFsKCJidWZmZXJfY29uc3VtZV9lbmQ6IHRyeWluZyB0byBnZXQgbW9yZSBieXRlcyB0aGFuIGluIGJ1ZmZlciIpOwotfQotCi0vKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgdXNlZCBieXRlIGluIHRoZSBidWZmZXIuICovCi0KLXZvaWQgKgotYnVmZmVyX3B0cihjb25zdCBCdWZmZXIgKmJ1ZmZlcikKLXsKLQlyZXR1cm4gYnVmZmVyLT5idWYgKyBidWZmZXItPm9mZnNldDsKLX0KLQotLyogRHVtcHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgdG8gc3RkZXJyLiAqLwotCi12b2lkCi1idWZmZXJfZHVtcChjb25zdCBCdWZmZXIgKmJ1ZmZlcikKLXsKLQl1X2ludCBpOwotCXVfY2hhciAqdWNwID0gYnVmZmVyLT5idWY7Ci0KLQlmb3IgKGkgPSBidWZmZXItPm9mZnNldDsgaSA8IGJ1ZmZlci0+ZW5kOyBpKyspIHsKLQkJZnByaW50ZihzdGRlcnIsICIlMDJ4IiwgdWNwW2ldKTsKLQkJaWYgKChpLWJ1ZmZlci0+b2Zmc2V0KSUxNj09MTUpCi0JCQlmcHJpbnRmKHN0ZGVyciwgIlxyXG4iKTsKLQkJZWxzZSBpZiAoKGktYnVmZmVyLT5vZmZzZXQpJTI9PTEpCi0JCQlmcHJpbnRmKHN0ZGVyciwgIiAiKTsKLQl9Ci0JZnByaW50ZihzdGRlcnIsICJcclxuIik7Ci19CmRpZmYgLS1naXQgYS9idWZmZXIuaCBiL2J1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmE5ZGQxLi4wMDAwMDAwCi0tLSBhL2J1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyogJE9wZW5CU0Q6IGJ1ZmZlci5oLHYgMS4yMSAyMDEwLzA4LzMxIDExOjU0OjQ1IGRqbSBFeHAgJCAqLwotCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogQ29kZSBmb3IgbWFuaXB1bGF0aW5nIEZJRk8gYnVmZmVycy4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpZm5kZWYgQlVGRkVSX0gKLSNkZWZpbmUgQlVGRkVSX0gKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVfY2hhcgkqYnVmOwkJLyogQnVmZmVyIGZvciBkYXRhLiAqLwotCXVfaW50CSBhbGxvYzsJCS8qIE51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgZm9yIGRhdGEuICovCi0JdV9pbnQJIG9mZnNldDsJLyogT2Zmc2V0IG9mIGZpcnN0IGJ5dGUgY29udGFpbmluZyBkYXRhLiAqLwotCXVfaW50CSBlbmQ7CQkvKiBPZmZzZXQgb2YgbGFzdCBieXRlIGNvbnRhaW5pbmcgZGF0YS4gKi8KLX0gICAgICAgQnVmZmVyOwotCi12b2lkCSBidWZmZXJfaW5pdChCdWZmZXIgKik7Ci12b2lkCSBidWZmZXJfY2xlYXIoQnVmZmVyICopOwotdm9pZAkgYnVmZmVyX2ZyZWUoQnVmZmVyICopOwotCi11X2ludAkgYnVmZmVyX2xlbihjb25zdCBCdWZmZXIgKik7Ci12b2lkCSpidWZmZXJfcHRyKGNvbnN0IEJ1ZmZlciAqKTsKLQotdm9pZAkgYnVmZmVyX2FwcGVuZChCdWZmZXIgKiwgY29uc3Qgdm9pZCAqLCB1X2ludCk7Ci12b2lkCSpidWZmZXJfYXBwZW5kX3NwYWNlKEJ1ZmZlciAqLCB1X2ludCk7Ci0KLWludAkgYnVmZmVyX2NoZWNrX2FsbG9jKEJ1ZmZlciAqLCB1X2ludCk7Ci0KLXZvaWQJIGJ1ZmZlcl9nZXQoQnVmZmVyICosIHZvaWQgKiwgdV9pbnQpOwotCi12b2lkCSBidWZmZXJfY29uc3VtZShCdWZmZXIgKiwgdV9pbnQpOwotdm9pZAkgYnVmZmVyX2NvbnN1bWVfZW5kKEJ1ZmZlciAqLCB1X2ludCk7Ci0KLXZvaWQgICAgIGJ1ZmZlcl9kdW1wKGNvbnN0IEJ1ZmZlciAqKTsKLQotaW50CSBidWZmZXJfZ2V0X3JldChCdWZmZXIgKiwgdm9pZCAqLCB1X2ludCk7Ci1pbnQJIGJ1ZmZlcl9jb25zdW1lX3JldChCdWZmZXIgKiwgdV9pbnQpOwotaW50CSBidWZmZXJfY29uc3VtZV9lbmRfcmV0KEJ1ZmZlciAqLCB1X2ludCk7Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+Ci0KLXZvaWQgICAgYnVmZmVyX3B1dF9iaWdudW0oQnVmZmVyICosIGNvbnN0IEJJR05VTSAqKTsKLXZvaWQgICAgYnVmZmVyX3B1dF9iaWdudW0yKEJ1ZmZlciAqLCBjb25zdCBCSUdOVU0gKik7Ci12b2lkCWJ1ZmZlcl9nZXRfYmlnbnVtKEJ1ZmZlciAqLCBCSUdOVU0gKik7Ci12b2lkCWJ1ZmZlcl9nZXRfYmlnbnVtMihCdWZmZXIgKiwgQklHTlVNICopOwotCi11X3Nob3J0CWJ1ZmZlcl9nZXRfc2hvcnQoQnVmZmVyICopOwotdm9pZAlidWZmZXJfcHV0X3Nob3J0KEJ1ZmZlciAqLCB1X3Nob3J0KTsKLQotdV9pbnQJYnVmZmVyX2dldF9pbnQoQnVmZmVyICopOwotdm9pZCAgICBidWZmZXJfcHV0X2ludChCdWZmZXIgKiwgdV9pbnQpOwotCi11X2ludDY0X3QgYnVmZmVyX2dldF9pbnQ2NChCdWZmZXIgKik7Ci12b2lkCWJ1ZmZlcl9wdXRfaW50NjQoQnVmZmVyICosIHVfaW50NjRfdCk7Ci0KLWludCAgICAgYnVmZmVyX2dldF9jaGFyKEJ1ZmZlciAqKTsKLXZvaWQgICAgYnVmZmVyX3B1dF9jaGFyKEJ1ZmZlciAqLCBpbnQpOwotCi12b2lkICAgKmJ1ZmZlcl9nZXRfc3RyaW5nKEJ1ZmZlciAqLCB1X2ludCAqKTsKLXZvaWQgICAqYnVmZmVyX2dldF9zdHJpbmdfcHRyKEJ1ZmZlciAqLCB1X2ludCAqKTsKLXZvaWQgICAgYnVmZmVyX3B1dF9zdHJpbmcoQnVmZmVyICosIGNvbnN0IHZvaWQgKiwgdV9pbnQpOwotY2hhciAgICpidWZmZXJfZ2V0X2NzdHJpbmcoQnVmZmVyICosIHVfaW50ICopOwotdm9pZAlidWZmZXJfcHV0X2NzdHJpbmcoQnVmZmVyICosIGNvbnN0IGNoYXIgKik7Ci0KLSNkZWZpbmUgYnVmZmVyX3NraXBfc3RyaW5nKGIpIFwKLSAgICBkbyB7IHVfaW50IGwgPSBidWZmZXJfZ2V0X2ludChiKTsgYnVmZmVyX2NvbnN1bWUoYiwgbCk7IH0gd2hpbGUgKDApCi0KLWludAlidWZmZXJfcHV0X2JpZ251bV9yZXQoQnVmZmVyICosIGNvbnN0IEJJR05VTSAqKTsKLWludAlidWZmZXJfZ2V0X2JpZ251bV9yZXQoQnVmZmVyICosIEJJR05VTSAqKTsKLWludAlidWZmZXJfcHV0X2JpZ251bTJfcmV0KEJ1ZmZlciAqLCBjb25zdCBCSUdOVU0gKik7Ci1pbnQJYnVmZmVyX2dldF9iaWdudW0yX3JldChCdWZmZXIgKiwgQklHTlVNICopOwotaW50CWJ1ZmZlcl9nZXRfc2hvcnRfcmV0KHVfc2hvcnQgKiwgQnVmZmVyICopOwotaW50CWJ1ZmZlcl9nZXRfaW50X3JldCh1X2ludCAqLCBCdWZmZXIgKik7Ci1pbnQJYnVmZmVyX2dldF9pbnQ2NF9yZXQodV9pbnQ2NF90ICosIEJ1ZmZlciAqKTsKLXZvaWQJKmJ1ZmZlcl9nZXRfc3RyaW5nX3JldChCdWZmZXIgKiwgdV9pbnQgKik7Ci1jaGFyCSpidWZmZXJfZ2V0X2NzdHJpbmdfcmV0KEJ1ZmZlciAqLCB1X2ludCAqKTsKLXZvaWQJKmJ1ZmZlcl9nZXRfc3RyaW5nX3B0cl9yZXQoQnVmZmVyICosIHVfaW50ICopOwotaW50CWJ1ZmZlcl9nZXRfY2hhcl9yZXQoY2hhciAqLCBCdWZmZXIgKik7Ci0KLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLSNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+Ci0KLWludAlidWZmZXJfcHV0X2VjcG9pbnRfcmV0KEJ1ZmZlciAqLCBjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqKTsKLXZvaWQJYnVmZmVyX3B1dF9lY3BvaW50KEJ1ZmZlciAqLCBjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqKTsKLWludAlidWZmZXJfZ2V0X2VjcG9pbnRfcmV0KEJ1ZmZlciAqLCBjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqKTsKLXZvaWQJYnVmZmVyX2dldF9lY3BvaW50KEJ1ZmZlciAqLCBjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqKTsKLSNlbmRpZgotCi0jZW5kaWYJCQkJLyogQlVGRkVSX0ggKi8KZGlmZiAtLWdpdCBhL2J1aWxkcGtnLnNoLmluIGIvYnVpbGRwa2cuc2guaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZTlkNDIuLjAwMDAwMDAKLS0tIGEvYnVpbGRwa2cuc2guaW4KKysrIC9kZXYvbnVsbApAQCAtMSw2NzcgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIEZha2UgUm9vdCBTb2xhcmlzL1NWUjQvU1ZSNSBCdWlsZCBTeXN0ZW0gLSBQcm90b3R5cGUKLSMKLSMgVGhlIGZvbGxvd2luZyBjb2RlIGhhcyBiZWVuIHByb3ZpZGUgdW5kZXIgUHVibGljIERvbWFpbiBMaWNlbnNlLiAgSSByZWFsbHkKLSMgZG9uJ3QgY2FyZSB3aGF0IHlvdSB1c2UgaXQgZm9yLiAgSnVzdCBhcyBsb25nIGFzIHlvdSBkb24ndCBjb21wbGFpbiB0byBtZQotIyBub3IgbXkgZW1wbG95ZXIgaWYgeW91IGJyZWFrIGl0LiAtIEJlbiBMaW5kc3Ryb20gKG1vdXJpbmdAZXZpbGFkbWluLm9yZykKLSMKLXVtYXNrIDAyMgotIwotIyBPcHRpb25zIGZvciBidWlsZGluZyB0aGUgcGFja2FnZQotIyBZb3UgY2FuIGNyZWF0ZSBhIG9wZW5zc2gtY29uZmlnLmxvY2FsIHdpdGggeW91ciBjdXN0b21pemVkIG9wdGlvbnMKLSMKLVJFTU9WRV9GQUtFX1JPT1RfV0hFTl9ET05FPXllcwotIwotIyB1bmNvbW1lbnRpbmcgVEVTVF9ESVIgYW5kIHVzaW5nCi0jIGNvbmZpZ3VyZSAtLXByZWZpeD0vdmFyL3RtcCAtLXdpdGgtcHJpdnNlcC1wYXRoPS92YXIvdG1wL2VtcHR5Ci0jIGFuZAotIyBQS0dOQU1FPXRPcGVuU1NIIHNob3VsZCBhbGxvdyB0ZXN0aW5nIGEgcGFja2FnZSB3aXRob3V0IGludGVyZmVyaW5nCi0jIHdpdGggYSByZWFsIE9wZW5TU0ggcGFja2FnZSBvbiBhIHN5c3RlbS4gVGhpcyBpcyBub3QgbmVlZGVkIG9uIHN5c3RlbXMKLSMgdGhhdCBzdXBwb3J0IHRoZSAtUiBvcHRpb24gdG8gcGtnYWRkLgotI1RFU1RfRElSPS92YXIvdG1wCSMgbGVhdmUgY29tbWVudGVkIG91dCBmb3IgcHJvZHVjdGlvbiBidWlsZAotUEtHTkFNRT1PcGVuU1NICi0jIHJldmlzaW9ucyB3aXRoaW4gdGhlIHNhbWUgdmVyc2lvbiAoUkVWPWEpCi0jUkVWPQotU1lTVklOSVRfTkFNRT1vcGVuc3NoZAotQVdLPSR7QVdLOj0ibmF3ayJ9Ci1NQUtFPSR7TUFLRTo9Im1ha2UifQotU1NIRFVJRD02NwkjIERlZmF1bHQgcHJpdnNlcCB1aWQKLVNTSERHSUQ9NjcJIyBEZWZhdWx0IHByaXZzZXAgZ2lkCi0jIHVuY29tbWVudCB0aGVzZSBuZXh0IHRocmVlIGFzIG5lZWRlZAotI1BFUk1JVF9ST09UX0xPR0lOPW5vCi0jWDExX0ZPUldBUkRJTkc9eWVzCi0jVVNSX0xPQ0FMX0lTX1NZTUxJTks9eWVzCi0jIFN5c3RlbSBWIGluaXQgcnVuIGxldmVscwotU1lTVklOSVRTVEFSVD1TOTgKLVNZU1ZJTklUU1RPUFQ9SzMwCi0jIFdlIHdpbGwgc291cmNlIHRoZXNlIGlmIHRoZXkgZXhpc3QKLVBPU1RfTUFLRV9JTlNUQUxMX0ZJWEVTPS4vcGtnLXBvc3QtbWFrZS1pbnN0YWxsLWZpeGVzLnNoCi1QT1NUX1BST1RPVFlQRV9FRElUUz0uL3BrZy1wb3N0LXByb3RvdHlwZS1lZGl0LnNoCi0jIFdlJ2xsIGJlIG9uZSBsZXZlbCBkZWVwZXIgbG9va2luZyBmb3IgdGhlc2UKLVBLR19QUkVJTlNUQUxMX0xPQ0FMPS4uL3BrZy1wcmVpbnN0YWxsLmxvY2FsCi1QS0dfUE9TVElOU1RBTExfTE9DQUw9Li4vcGtnLXBvc3RpbnN0YWxsLmxvY2FsCi1QS0dfUFJFUkVNT1ZFX0xPQ0FMPS4uL3BrZy1wcmVyZW1vdmUubG9jYWwKLVBLR19QT1NUUkVNT1ZFX0xPQ0FMPS4uL3BrZy1wb3N0cmVtb3ZlLmxvY2FsCi1QS0dfUkVRVUVTVF9MT0NBTD0uLi9wa2ctcmVxdWVzdC5sb2NhbAotIyBlbmQgb2Ygc291cmNlZCBmaWxlcwotIwotT1BFTlNTSEQ9b3BlbnNzaGQuaW5pdAotT1BFTlNTSF9NQU5JRkVTVD1vcGVuc3NoLnhtbAotT1BFTlNTSF9GTVJJPXN2Yzovc2l0ZS8ke1NZU1ZJTklUX05BTUV9OmRlZmF1bHQKLVNNRl9NRVRIT0RfRElSPS9saWIvc3ZjL21ldGhvZC9zaXRlCi1TTUZfTUFOSUZFU1RfRElSPS92YXIvc3ZjL21hbmlmZXN0L3NpdGUKLQotUEFUSF9HUk9VUEFERF9QUk9HPUBQQVRIX0dST1VQQUREX1BST0dACi1QQVRIX1VTRVJBRERfUFJPRz1AUEFUSF9VU0VSQUREX1BST0dACi1QQVRIX1BBU1NXRF9QUk9HPUBQQVRIX1BBU1NXRF9QUk9HQAotIwotIyBsaXN0IG9mIHN5c3RlbSBkaXJlY3RvcmllcyB3ZSBkbyBOT1Qgd2FudCB0byBjaGFuZ2Ugb3duZXIvZ3JvdXAvcGVybXMKLSMgd2hlbiBpbnN0YWxsaW5nIG91ciBwYWNrYWdlCi1TWVNURU1fRElSPSIvZXRjCVwKLS9ldGMvaW5pdC5kCQlcCi0vZXRjL3JjUy5kCQlcCi0vZXRjL3JjMC5kCQlcCi0vZXRjL3JjMS5kCQlcCi0vZXRjL3JjMi5kCQlcCi0vZXRjL29wdAkJXAotL2xpYgkJCVwKLS9saWIvc3ZjCQlcCi0vbGliL3N2Yy9tZXRob2QJCVwKLS9saWIvc3ZjL21ldGhvZC9zaXRlCVwKLS9vcHQJCQlcCi0vb3B0L2JpbgkJXAotL3VzcgkJCVwKLS91c3IvYmluCQlcCi0vdXNyL2xpYgkJXAotL3Vzci9zYmluCQlcCi0vdXNyL3NoYXJlCQlcCi0vdXNyL3NoYXJlL21hbgkJXAotL3Vzci9zaGFyZS9tYW4vbWFuMQlcCi0vdXNyL3NoYXJlL21hbi9tYW44CVwKLS91c3IvbG9jYWwJCVwKLS91c3IvbG9jYWwvYmluCQlcCi0vdXNyL2xvY2FsL2V0YwkJXAotL3Vzci9sb2NhbC9saWJleGVjCVwKLS91c3IvbG9jYWwvbWFuCQlcCi0vdXNyL2xvY2FsL21hbi9tYW4xCVwKLS91c3IvbG9jYWwvbWFuL21hbjgJXAotL3Vzci9sb2NhbC9zYmluCQlcCi0vdXNyL2xvY2FsL3NoYXJlCVwKLS92YXIJCQlcCi0vdmFyL29wdAkJXAotL3Zhci9ydW4JCVwKLS92YXIvc3ZjCQlcCi0vdmFyL3N2Yy9tYW5pZmVzdAlcCi0vdmFyL3N2Yy9tYW5pZmVzdC9zaXRlICBcCi0vdmFyL3RtcAkJXAotL3RtcCIKLQotIyBXZSBtYXkgbmVlZCB0byBidWlsZCBhcyByb290IHNvIHdlIG1ha2Ugc3VyZSBQQVRIIGlzIHNldCB1cAotIyBvbmx5IHNldCB0aGUgcGF0aCBpZiBpdCdzIG5vdCBzZXQgYWxyZWFkeQotWyAtZCAvb3B0L2JpbiBdICAmJiAgewotCWVjaG8gJFBBVEggfCBncmVwICI6L29wdC9iaW4iICA+IC9kZXYvbnVsbCAyPiYxCi0JWyAkPyAtbmUgMCBdICYmIFBBVEg9JFBBVEg6L29wdC9iaW4KLX0KLVsgLWQgL3Vzci9sb2NhbC9iaW4gXSAgJiYgIHsKLQllY2hvICRQQVRIIHwgZ3JlcCAiOi91c3IvbG9jYWwvYmluIiAgPiAvZGV2L251bGwgMj4mMQotCVsgJD8gLW5lIDAgXSAmJiBQQVRIPSRQQVRIOi91c3IvbG9jYWwvYmluCi19Ci1bIC1kIC91c3IvY2NzL2JpbiBdICAmJiAgewotCWVjaG8gJFBBVEggfCBncmVwICI6L3Vzci9jY3MvYmluIiAgPiAvZGV2L251bGwgMj4mMQotCVsgJD8gLW5lIDAgXSAmJiBQQVRIPSRQQVRIOi91c3IvY2NzL2JpbgotfQotZXhwb3J0IFBBVEgKLSMKLQotWyAtZiBNYWtlZmlsZSBdICB8fCAgewotCWVjaG8gIlBsZWFzZSBydW4gdGhpcyBzY3JpcHQgZnJvbSB5b3VyIGJ1aWxkIGRpcmVjdG9yeSIKLQlleGl0IDEKLX0KLQotIyB3ZSB3aWxsIGxvb2sgZm9yIG9wZW5zc2gtY29uZmlnLmxvY2FsIHRvIG92ZXJyaWRlIHRoZSBhYm92ZSBvcHRpb25zCi1bIC1zIC4vb3BlbnNzaC1jb25maWcubG9jYWwgXSAgJiYgIC4gLi9vcGVuc3NoLWNvbmZpZy5sb2NhbAotCi1TVEFSVD1gcHdkYAotRkFLRV9ST09UPSRTVEFSVC9wa2cKLQotIyMgRmlsbCBpbiBzb21lIGRldGFpbHMsIGxpa2UgcHJlZml4IGFuZCBzeXNjb25mZGlyCi1mb3IgY29uZnZhciBpbiBwcmVmaXggZXhlY19wcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhZGlyIG1hbmRpciBzeXNjb25mZGlyIHBpZGRpciBzcmNkaXIKLWRvCi0JZXZhbCAkY29uZnZhcj1gZ3JlcCAiXiRjb25mdmFyPSIgTWFrZWZpbGUgfCBjdXQgLWQgPSAtZiAyYAotZG9uZQotCi0jIyBBcmUgd2UgdXNpbmcgU29sYXJpcycgU01GPwotRE9fU01GPTAKLWlmIGVncmVwICJeI2RlZmluZSBVU0VfU09MQVJJU19QUk9DRVNTX0NPTlRSQUNUUyIgY29uZmlnLmggPiAvZGV2L251bGwgMj4mMQotdGhlbgotCURPX1NNRj0xCi1maQotCi0jIyBDb2xsZWN0IHZhbHVlIG9mIHByaXZzZXAgdXNlcgotZm9yIGNvbmZ2YXIgaW4gU1NIX1BSSVZTRVBfVVNFUgotZG8KLQlldmFsICRjb25mdmFyPWBhd2sgJy8jZGVmaW5lWyBcdF0nJGNvbmZ2YXInL3twcmludCAkM30nIGNvbmZpZy5oYAotZG9uZQotCi0jIyBTZXQgcHJpdnNlcCBkZWZhdWx0cyBpZiBub3QgZGVmaW5lZAotaWYgWyAteiAiJFNTSF9QUklWU0VQX1VTRVIiIF0KLXRoZW4KLQlTU0hfUFJJVlNFUF9VU0VSPXNzaGQKLWZpCi0KLSMjIEV4dHJhY3QgY29tbW9uIGluZm8gcmVxdWlyZXMgZm9yIHRoZSAnaW5mbycgcGFydCBvZiB0aGUgcGFja2FnZS4KLVZFUlNJT049YC4vc3NoIC1WIDI+JjEgfCBzZWQgLWUgJ3MvLC4qLy8nYAotCi1BUkNIPWB1bmFtZSAtbWAKLURFRl9NU0c9IlxuIgotT1NfVkVSPWB1bmFtZSAtdmAKLVNDUklQVF9TSEVMTD0vc2Jpbi9zaAotVU5BTUVfUj1gdW5hbWUgLXJgCi1VTkFNRV9TPWB1bmFtZSAtc2AKLWNhc2UgJHtVTkFNRV9TfSBpbgotCVN1bk9TKQlVTkFNRV9TPVNvbGFyaXMKLQkJT1NfVkVSPSR7VU5BTUVfUn0KLQkJQVJDSD1gdW5hbWUgLXBgCi0JCVJDU19EPXllcwotCQlERUZfTVNHPSIoZGVmYXVsdDogbikiCi0JCTs7Ci0JU0NPX1NWKQljYXNlICR7VU5BTUVfUn0gaW4KLQkJCTMuMikJVU5BTUVfUz1PcGVuU2VydmVyNQotCQlPU19WRVI9YHVuYW1lIC1YIHwgZ3JlcCBSZWxlYXNlIHwgc2VkIC1lICdzL15SZWwuKjMuMnYvLydgCi0JCQkJOzsKLQkJCTUpCVVOQU1FX1M9T3BlblNlcnZlcjYKLQkJCQk7OwotCQllc2FjCi0JCVNDUklQVF9TSEVMTD0vYmluL3NoCi0JCVJDMV9EPW5vCi0JCURFRl9NU0c9IihkZWZhdWx0OiBuKSIKLQkJOzsKLWVzYWMKLQotY2FzZSBgYmFzZW5hbWUgJDBgIGluCi0JYnVpbGRwa2cuc2gpCi0jIyBTdGFydCBieSBmYWtpbmcgcm9vdCBpbnN0YWxsCi1lY2hvICJGYWtpbmcgcm9vdCBpbnN0YWxsLi4uIgotWyAtZCAkRkFLRV9ST09UIF0gICYmICBybSAtZnIgJEZBS0VfUk9PVAotbWtkaXIgJEZBS0VfUk9PVAotJHtNQUtFfSBpbnN0YWxsLW5va2V5cyBERVNURElSPSRGQUtFX1JPT1QKLWlmIFsgJD8gLWd0IDAgXQotdGhlbgotCWVjaG8gIkZha2Ugcm9vdCBpbnN0YWxsIGZhaWxlZCwgc3RvcHBpbmcuIgotCWV4aXQgMQotZmkKLQotIyMgU2V0dXAgb3VyIHJ1biBsZXZlbCBzdHVmZiB3aGlsZSB3ZSBhcmUgYXQgaXQuCi1pZiBbICRET19TTUYgLWVxIDEgXQotdGhlbgotCSMgRm9yIFNvbGFyaXMnIFNNRiwgL2xpYi9zdmMvbWV0aG9kL3NpdGUgaXMgdGhlIHByZWZlcnJlZCBwbGFjZQotCSMgZm9yIHN0YXJ0L3N0b3Agc2NyaXB0cyB0aGF0IGFyZW4ndCBzdXBwbGllZCB3aXRoIHRoZSBPUywgYW5kCi0JIyBzaW1pbGFybHkgL3Zhci9zdmMvbWFuaWZlc3Qvc2l0ZSBmb3IgbWFuaWZlc3RzLgotCW1rZGlyIC1wICRGQUtFX1JPT1Qke1RFU1RfRElSfSR7U01GX01FVEhPRF9ESVJ9Ci0JbWtkaXIgLXAgJEZBS0VfUk9PVCR7VEVTVF9ESVJ9JHtTTUZfTUFOSUZFU1RfRElSfQotCi0JY3AgJHtPUEVOU1NIRH0gJEZBS0VfUk9PVCR7VEVTVF9ESVJ9JHtTTUZfTUVUSE9EX0RJUn0vJHtTWVNWSU5JVF9OQU1FfQotCWNobW9kIDc0NCAkRkFLRV9ST09UJHtURVNUX0RJUn0ke1NNRl9NRVRIT0RfRElSfS8ke1NZU1ZJTklUX05BTUV9Ci0KLQljYXQgJHtPUEVOU1NIX01BTklGRVNUfSB8IFwKLQkgICAgc2VkIC1lICJzfF9fU1lTVklOSVRfTkFNRV9ffCR7U1lTVklOSVRfTkFNRX18IiBcCi0JICAgIC1lICJzfF9fU01GX01FVEhPRF9ESVJfX3wke1NNRl9NRVRIT0RfRElSfXwiIFwKLQkgICAgPiAkRkFLRV9ST09UJHtURVNUX0RJUn0ke1NNRl9NQU5JRkVTVF9ESVJ9LyR7U1lTVklOSVRfTkFNRX0ueG1sCi0JY2htb2QgNjQ0ICRGQUtFX1JPT1Qke1RFU1RfRElSfSR7U01GX01BTklGRVNUX0RJUn0vJHtTWVNWSU5JVF9OQU1FfS54bWwKLWVsc2UKLQlta2RpciAtcCAkRkFLRV9ST09UJHtURVNUX0RJUn0vZXRjL2luaXQuZAotCi0JY3AgJHtPUEVOU1NIRH0gJEZBS0VfUk9PVCR7VEVTVF9ESVJ9L2V0Yy9pbml0LmQvJHtTWVNWSU5JVF9OQU1FfQotCWNobW9kIDc0NCAkRkFLRV9ST09UJHtURVNUX0RJUn0vZXRjL2luaXQuZC8ke1NZU1ZJTklUX05BTUV9Ci1maQotCi1bICIke1BFUk1JVF9ST09UX0xPR0lOfSIgPSBubyBdICAmJiAgXAotCXBlcmwgLXAgLWkgLWUgInMvI1Blcm1pdFJvb3RMb2dpbiB5ZXMvUGVybWl0Um9vdExvZ2luIG5vLyIgXAotCQkkRkFLRV9ST09UJHtzeXNjb25mZGlyfS9zc2hkX2NvbmZpZwotWyAiJHtYMTFfRk9SV0FSRElOR30iID0geWVzIF0gICYmICBcCi0JcGVybCAtcCAtaSAtZSAicy8jWDExRm9yd2FyZGluZyBuby9YMTFGb3J3YXJkaW5nIHllcy8iIFwKLQkJJEZBS0VfUk9PVCR7c3lzY29uZmRpcn0vc3NoZF9jb25maWcKLSMgZml4IFByaW50TW90ZAotcGVybCAtcCAtaSAtZSAicy8jUHJpbnRNb3RkIHllcy9QcmludE1vdGQgbm8vIiBcCi0JJEZBS0VfUk9PVCR7c3lzY29uZmRpcn0vc3NoZF9jb25maWcKLQotIyBXZSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSBjb25maWcgZmlsZXMgb24gbXVsdGlwbGUgaW5zdGFsbHMKLW12ICRGQUtFX1JPT1Qke3N5c2NvbmZkaXJ9L3NzaF9jb25maWcgJEZBS0VfUk9PVCR7c3lzY29uZmRpcn0vc3NoX2NvbmZpZy5kZWZhdWx0Ci1tdiAkRkFLRV9ST09UJHtzeXNjb25mZGlyfS9zc2hkX2NvbmZpZyAkRkFLRV9ST09UJHtzeXNjb25mZGlyfS9zc2hkX2NvbmZpZy5kZWZhdWx0Ci0KLSMgbG9jYWwgdHdlZWtzIGhlcmUKLVsgLXMgIiR7UE9TVF9NQUtFX0lOU1RBTExfRklYRVN9IiBdICAmJiAgLiAke1BPU1RfTUFLRV9JTlNUQUxMX0ZJWEVTfQotCi1jZCAkRkFLRV9ST09UCi0KLSMjIE9rLCB0aGlzIGlzIG91dHJpZ2h0IHdyb25nLCBidXQgaXQgd2lsbCB3b3JrLiAgSSdtIHRpcmVkIG9mIHBrZ21rCi0jIyB3aGluaW5nLgotZm9yIGkgaW4gKjsgZG8KLSAgUFJPVE9fQVJHUz0iJFBST1RPX0FSR1MgJGk9LyRpIjsKLWRvbmUKLQotIyMgQnVpbGQgaW5mbyBmaWxlCi1lY2hvICJCdWlsZGluZyBwa2dpbmZvIGZpbGUuLi4iCi1jYXQgPiBwa2dpbmZvIDw8IF9FT0YKLVBLRz0kUEtHTkFNRQotTkFNRT0iT3BlblNTSCBQb3J0YWJsZSBmb3IgJHtVTkFNRV9TfSIKLURFU0M9IlNlY3VyZSBTaGVsbCByZW1vdGUgYWNjZXNzIHV0aWxpdHk7IHJlcGxhY2VzIHRlbG5ldCBhbmQgcmxvZ2luL3JzaC4iCi1WRU5ET1I9Ik9wZW5TU0ggUG9ydGFibGUgVGVhbSAtIGh0dHA6Ly93d3cub3BlbnNzaC5jb20vcG9ydGFibGUuaHRtbCIKLUFSQ0g9JEFSQ0gKLVZFUlNJT049JFZFUlNJT04kUkVWCi1DQVRFR09SWT0iU2VjdXJpdHksYXBwbGljYXRpb24iCi1CQVNFRElSPS8KLUNMQVNTRVM9Im5vbmUiCi1QU1RBTVA9IiR7VU5BTUVfU30gJHtPU19WRVJ9ICR7QVJDSH0gYGRhdGUgJyslZCViJVkgJUg6JU0nYCIKLV9FT0YKLQotIyMgQnVpbGQgZW1wdHkgZGVwZW5kIGZpbGUgdGhhdCBtYXkgZ2V0IHVwZGF0ZWQgYnkgJFBPU1RfUFJPVE9UWVBFX0VESVRTCi1lY2hvICJCdWlsZGluZyBkZXBlbmQgZmlsZS4uLiIKLXRvdWNoIGRlcGVuZAotCi0jIyBCdWlsZCBzcGFjZSBmaWxlCi1lY2hvICJCdWlsZGluZyBzcGFjZSBmaWxlLi4uIgotaWYgWyAkRE9fU01GIC1lcSAxIF0KLXRoZW4KLQkjIFhYWCBJcyB0aGlzIG5lY2Vzc2FyeT8gIElmIG5vdCwgcmVtb3ZlIHNwYWNlIGxpbmUgZnJvbSBtay1wcm90by5hd2suCi0JdG91Y2ggc3BhY2UKLWVsc2UKLQljYXQgPiBzcGFjZSA8PCBfRU9GCi0jIGV4dHJhIHNwYWNlIHJlcXVpcmVkIGJ5IHN0YXJ0L3N0b3AgbGlua3MgYWRkZWQgYnkgaW5zdGFsbGYgCi0jIGluIHBvc3RpbnN0YWxsCi0kVEVTVF9ESVIvZXRjL3JjMC5kLyR7U1lTVklOSVRTVE9QVH0ke1NZU1ZJTklUX05BTUV9IDAgMQotJFRFU1RfRElSL2V0Yy9yYzIuZC8ke1NZU1ZJTklUU1RBUlR9JHtTWVNWSU5JVF9OQU1FfSAwIDEKLV9FT0YKLQlbICIkUkMxX0QiID0gbm8gXSAgfHwgIFwKLQllY2hvICIkVEVTVF9ESVIvZXRjL3JjMS5kLyR7U1lTVklOSVRTVE9QVH0ke1NZU1ZJTklUX05BTUV9IDAgMSIgPj4gc3BhY2UKLQlbICIkUkNTX0QiID0geWVzIF0gICYmICBcCi0JZWNobyAiJFRFU1RfRElSL2V0Yy9yY1MuZC8ke1NZU1ZJTklUU1RPUFR9JHtTWVNWSU5JVF9OQU1FfSAwIDEiID4+IHNwYWNlCi1maQotCi0jIyBCdWlsZCBwcmVpbnN0YWxsIGZpbGUKLWVjaG8gIkJ1aWxkaW5nIHByZWluc3RhbGwgZmlsZS4uLiIKLWNhdCA+IHByZWluc3RhbGwgPDwgX0VPRgotIyEgJHtTQ1JJUFRfU0hFTEx9Ci0jCi1fRU9GCi0KLSMgbG9jYWwgcHJlaW5zdGFsbCBjaGFuZ2VzIGhlcmUKLVsgLXMgIiR7UEtHX1BSRUlOU1RBTExfTE9DQUx9IiBdICAmJiAgLiAke1BLR19QUkVJTlNUQUxMX0xPQ0FMfQotCi1jYXQgPj4gcHJlaW5zdGFsbCA8PCBfRU9GCi0jCi1pZiBbICJcJHtQUkVfSU5TX1NUT1B9IiA9ICJ5ZXMiIF0KLXRoZW4KLQlpZiBbICRET19TTUYgLWVxIDEgXSAKLQl0aGVuCi0JCXN2Y2FkbSBkaXNhYmxlICRPUEVOU1NIX0ZNUkkKLQllbHNlCi0JCSR7VEVTVF9ESVJ9L2V0Yy9pbml0LmQvJHtTWVNWSU5JVF9OQU1FfSBzdG9wCi0JZmkKLWZpCi0KLWV4aXQgMAotX0VPRgotCi0jIyBCdWlsZCBwb3N0aW5zdGFsbCBmaWxlCi1lY2hvICJCdWlsZGluZyBwb3N0aW5zdGFsbCBmaWxlLi4uIgotY2F0ID4gcG9zdGluc3RhbGwgPDwgX0VPRgotIyEgJHtTQ1JJUFRfU0hFTEx9Ci0jCi1bIC1mIFwke1BLR19JTlNUQUxMX1JPT1R9JHtzeXNjb25mZGlyfS9zc2hfY29uZmlnIF0gIHx8ICBcXAotCWNwIC1wIFwke1BLR19JTlNUQUxMX1JPT1R9JHtzeXNjb25mZGlyfS9zc2hfY29uZmlnLmRlZmF1bHQgXFwKLQkJXCR7UEtHX0lOU1RBTExfUk9PVH0ke3N5c2NvbmZkaXJ9L3NzaF9jb25maWcKLVsgLWYgXCR7UEtHX0lOU1RBTExfUk9PVH0ke3N5c2NvbmZkaXJ9L3NzaGRfY29uZmlnIF0gIHx8ICBcXAotCWNwIC1wIFwke1BLR19JTlNUQUxMX1JPT1R9JHtzeXNjb25mZGlyfS9zc2hkX2NvbmZpZy5kZWZhdWx0IFxcCi0JCVwke1BLR19JTlNUQUxMX1JPT1R9JHtzeXNjb25mZGlyfS9zc2hkX2NvbmZpZwotCi0jIG1ha2UgcmM/LmQgZGlycyBvbmx5IGlmIHdlIGFyZSBkb2luZyBhIHRlc3QgaW5zdGFsbAotWyAtbiAiJHtURVNUX0RJUn0iIF0gICYmICBbICRET19TTUYgLW5lIDEgXSAmJiB7Ci0JWyAiJFJDU19EIiA9IHllcyBdICAmJiAgbWtkaXIgLXAgJHtURVNUX0RJUn0vZXRjL3JjUy5kCi0JbWtkaXIgLXAgJHtURVNUX0RJUn0vZXRjL3JjMC5kCi0JWyAiJFJDMV9EIiA9IG5vIF0gIHx8ICBta2RpciAtcCAke1RFU1RfRElSfS9ldGMvcmMxLmQKLQlta2RpciAtcCAke1RFU1RfRElSfS9ldGMvcmMyLmQKLX0KLQotaWYgWyAkRE9fU01GIC1lcSAxIF0KLXRoZW4KLQkjIERlbGV0ZSB0aGUgZXhpc3Rpbmcgc2VydmljZSwgaWYgaXQgZXhpc3RzLCB0aGVuIGltcG9ydCB0aGUgCi0JIyBuZXcgb25lLgotCWlmIHN2Y3MgJE9QRU5TU0hfRk1SSSA+IC9kZXYvbnVsbCAyPiYxCi0JdGhlbgotCQlzdmNjZmcgZGVsZXRlIC1mICRPUEVOU1NIX0ZNUkkKLQlmaQotCSMgTk9URSwgVGhlIG1hbmlmZXN0IGRpc2FibGVzIHNzaGQgYnkgZGVmYXVsdC4KLQlzdmNjZmcgaW1wb3J0ICR7VEVTVF9ESVJ9JHtTTUZfTUFOSUZFU1RfRElSfS8ke1NZU1ZJTklUX05BTUV9LnhtbAotZWxzZQotCWlmIFsgIlwke1VTRV9TWU1fTElOS1N9IiA9IHllcyBdCi0JdGhlbgotCQlbICIkUkNTX0QiID0geWVzIF0gICYmICBcCi0JaW5zdGFsbGYgJHtQS0dOQU1FfSBcJHtQS0dfSU5TVEFMTF9ST09UfSRURVNUX0RJUi9ldGMvcmNTLmQvJHtTWVNWSU5JVFNUT1BUfSR7U1lTVklOSVRfTkFNRX09Li4vaW5pdC5kLyR7U1lTVklOSVRfTkFNRX0gcwotCQlpbnN0YWxsZiAke1BLR05BTUV9IFwke1BLR19JTlNUQUxMX1JPT1R9JFRFU1RfRElSL2V0Yy9yYzAuZC8ke1NZU1ZJTklUU1RPUFR9JHtTWVNWSU5JVF9OQU1FfT0uLi9pbml0LmQvJHtTWVNWSU5JVF9OQU1FfSBzCi0JCVsgIiRSQzFfRCIgPSBubyBdICB8fCAgXAotCQlpbnN0YWxsZiAke1BLR05BTUV9IFwke1BLR19JTlNUQUxMX1JPT1R9JFRFU1RfRElSL2V0Yy9yYzEuZC8ke1NZU1ZJTklUU1RPUFR9JHtTWVNWSU5JVF9OQU1FfT0uLi9pbml0LmQvJHtTWVNWSU5JVF9OQU1FfSBzCi0JCWluc3RhbGxmICR7UEtHTkFNRX0gXCR7UEtHX0lOU1RBTExfUk9PVH0kVEVTVF9ESVIvZXRjL3JjMi5kLyR7U1lTVklOSVRTVEFSVH0ke1NZU1ZJTklUX05BTUV9PS4uL2luaXQuZC8ke1NZU1ZJTklUX05BTUV9IHMKLQllbHNlCi0JCVsgIiRSQ1NfRCIgPSB5ZXMgXSAgJiYgIFwKLQlpbnN0YWxsZiAke1BLR05BTUV9IFwke1BLR19JTlNUQUxMX1JPT1R9JFRFU1RfRElSL2V0Yy9yY1MuZC8ke1NZU1ZJTklUU1RPUFR9JHtTWVNWSU5JVF9OQU1FfT1cJHtQS0dfSU5TVEFMTF9ST09UfSRURVNUX0RJUi9ldGMvaW5pdC5kLyR7U1lTVklOSVRfTkFNRX0gbAotCQlpbnN0YWxsZiAke1BLR05BTUV9IFwke1BLR19JTlNUQUxMX1JPT1R9JFRFU1RfRElSL2V0Yy9yYzAuZC8ke1NZU1ZJTklUU1RPUFR9JHtTWVNWSU5JVF9OQU1FfT1cJHtQS0dfSU5TVEFMTF9ST09UfSRURVNUX0RJUi9ldGMvaW5pdC5kLyR7U1lTVklOSVRfTkFNRX0gbAotCQlbICIkUkMxX0QiID0gbm8gXSAgfHwgIFwKLQkJaW5zdGFsbGYgJHtQS0dOQU1FfSBcJHtQS0dfSU5TVEFMTF9ST09UfSRURVNUX0RJUi9ldGMvcmMxLmQvJHtTWVNWSU5JVFNUT1BUfSR7U1lTVklOSVRfTkFNRX09XCR7UEtHX0lOU1RBTExfUk9PVH0kVEVTVF9ESVIvZXRjL2luaXQuZC8ke1NZU1ZJTklUX05BTUV9IGwKLQkJaW5zdGFsbGYgJHtQS0dOQU1FfSBcJHtQS0dfSU5TVEFMTF9ST09UfSRURVNUX0RJUi9ldGMvcmMyLmQvJHtTWVNWSU5JVFNUQVJUfSR7U1lTVklOSVRfTkFNRX09XCR7UEtHX0lOU1RBTExfUk9PVH0kVEVTVF9ESVIvZXRjL2luaXQuZC8ke1NZU1ZJTklUX05BTUV9IGwKLQlmaQotZmkKLQotIyBJZiBwaWRkaXIgZG9lc24ndCBleGlzdCB3ZSBhZGQgaXQuIChJZS4gLS13aXRoLXBpZC1kaXI9L3Zhci9vcHQvc3NoKQotWyAtZCAkcGlkZGlyIF0gIHx8ICBpbnN0YWxsZiAke1BLR05BTUV9IFwke1BLR19JTlNUQUxMX1JPT1R9JFRFU1RfRElSJHBpZGRpciBkIDA3NTUgcm9vdCBzeXMKLQotX0VPRgotCi0jIGxvY2FsIHBvc3RpbnN0YWxsIGNoYW5nZXMgaGVyZQotWyAtcyAiJHtQS0dfUE9TVElOU1RBTExfTE9DQUx9IiBdICAmJiAgLiAke1BLR19QT1NUSU5TVEFMTF9MT0NBTH0KLQotY2F0ID4+IHBvc3RpbnN0YWxsIDw8IF9FT0YKLWluc3RhbGxmIC1mICR7UEtHTkFNRX0KLQotIyBVc2UgY2hyb290IHRvIGhhbmRsZSBQS0dfSU5TVEFMTF9ST09UCi1pZiBbICEgLXogIlwke1BLR19JTlNUQUxMX1JPT1R9IiBdCi10aGVuCi0JY2hyb290PSJjaHJvb3QgXCR7UEtHX0lOU1RBTExfUk9PVH0iCi1maQotIyBJZiB0aGlzIGlzIGEgdGVzdCBidWlsZCwgd2Ugd2lsbCBza2lwIHRoZSBncm91cGFkZC91c2VyYWRkL3Bhc3N3ZCBjb21tYW5kcwotaWYgWyAhIC16ICIke1RFU1RfRElSfSIgXQotdGhlbgotCWNocm9vdD1lY2hvCi1maQotCi0JZWNobyAiUHJpdmlsZWdlU2VwYXJhdGlvbiB1c2VyIGFsd2F5cyByZXF1aXJlZC4iCi0JaWYgY3V0IC1mMSAtZDogXCR7UEtHX0lOU1RBTExfUk9PVH0vZXRjL3Bhc3N3ZCB8IGVncmVwICdeJyRTU0hfUFJJVlNFUF9VU0VSJ1wkJyA+L2Rldi9udWxsCi0JdGhlbgotCQllY2hvICJQcml2U2VwIHVzZXIgJFNTSF9QUklWU0VQX1VTRVIgYWxyZWFkeSBleGlzdHMuIgotCQlTU0hfUFJJVlNFUF9HUk9VUD1cYGdyZXAgIl4kU1NIX1BSSVZTRVBfVVNFUjoiIFwke1BLR19JTlNUQUxMX1JPT1R9L2V0Yy9wYXNzd2QgfCBhd2sgLUY6ICd7cHJpbnQgXCQ0fSdcYAotCQlTU0hfUFJJVlNFUF9HUk9VUD1cYGdyZXAgIjpcJFNTSF9QUklWU0VQX0dST1VQOiIgXCR7UEtHX0lOU1RBTExfUk9PVH0vZXRjL2dyb3VwIHwgYXdrIC1GOiAne3ByaW50IFwkMX0nXGAKLQllbHNlCi0JCURPX1BBU1NXRD15ZXMKLQlmaQotCVsgLXogIlwkU1NIX1BSSVZTRVBfR1JPVVAiIF0gICYmICBTU0hfUFJJVlNFUF9HUk9VUD0kU1NIX1BSSVZTRVBfVVNFUgotCi0JIyBncm91cCByZXF1aXJlZD8KLQlpZiBjdXQgLWYxIC1kOiBcJHtQS0dfSU5TVEFMTF9ST09UfS9ldGMvZ3JvdXAgfCBlZ3JlcCAnXidcJFNTSF9QUklWU0VQX0dST1VQJ1wkJyA+L2Rldi9udWxsCi0JdGhlbgotCQllY2hvICJQcml2U2VwIGdyb3VwIFwkU1NIX1BSSVZTRVBfR1JPVVAgYWxyZWFkeSBleGlzdHMuIgotCWVsc2UKLQkJRE9fR1JPVVA9eWVzCi0JZmkKLQotCSMgY3JlYXRlIGdyb3VwIGlmIHJlcXVpcmVkCi0JWyAiXCRET19HUk9VUCIgPSB5ZXMgXSAgJiYgIHsKLQkJIyBVc2UgZ2lkIG9mIDY3IGlmIHBvc3NpYmxlCi0JCWlmIGN1dCAtZjMgLWQ6IFwke1BLR19JTlNUQUxMX1JPT1R9L2V0Yy9ncm91cCB8IGVncmVwICdeJyRTU0hER0lEJ1wkJyA+L2Rldi9udWxsCi0JCXRoZW4KLQkJCToKLQkJZWxzZQotCQkJc3NoZGdpZD0iLWcgJFNTSERHSUQiCi0JCWZpCi0JCWVjaG8gIkNyZWF0aW5nIFByaXZTZXAgZ3JvdXAgXCRTU0hfUFJJVlNFUF9HUk9VUC4iCi0JCVwkY2hyb290ICR7UEFUSF9HUk9VUEFERF9QUk9HfSBcJHNzaGRnaWQgXCRTU0hfUFJJVlNFUF9HUk9VUAotCX0KLQotCSMgQ3JlYXRlIHVzZXIgaWYgcmVxdWlyZWQKLQlbICJcJERPX1BBU1NXRCIgPSB5ZXMgXSAgJiYgIHsKLQkJIyBVc2UgdWlkIG9mIDY3IGlmIHBvc3NpYmxlCi0JCWlmIGN1dCAtZjMgLWQ6IFwke1BLR19JTlNUQUxMX1JPT1R9L2V0Yy9wYXNzd2QgfCBlZ3JlcCAnXickU1NIRFVJRCdcJCcgPi9kZXYvbnVsbAotCQl0aGVuCi0JCQk6Ci0JCWVsc2UKLQkJCXNzaGR1aWQ9Ii11ICRTU0hEVUlEIgotCQlmaQotCQllY2hvICJDcmVhdGluZyBQcml2U2VwIHVzZXIgJFNTSF9QUklWU0VQX1VTRVIuIgotCQlcJGNocm9vdCAke1BBVEhfVVNFUkFERF9QUk9HfSAtYyAnU1NIRCBQcml2U2VwIFVzZXInIC1zIC9iaW4vZmFsc2UgLWcgJFNTSF9QUklWU0VQX1VTRVIgXCRzc2hkdWlkICRTU0hfUFJJVlNFUF9VU0VSCi0JCVwkY2hyb290ICR7UEFUSF9QQVNTV0RfUFJPR30gLWwgJFNTSF9QUklWU0VQX1VTRVIKLQl9Ci0KLWlmIFsgIlwke1BPU1RfSU5TX1NUQVJUfSIgPSAieWVzIiBdCi10aGVuCi0JaWYgWyAkRE9fU01GIC1lcSAxIF0KLQl0aGVuCi0JCXN2Y2FkbSBlbmFibGUgJE9QRU5TU0hfRk1SSQotCWVsc2UKLQkJJHtURVNUX0RJUn0vZXRjL2luaXQuZC8ke1NZU1ZJTklUX05BTUV9IHN0YXJ0Ci0JZmkKLWZpCi1leGl0IDAKLV9FT0YKLQotIyMgQnVpbGQgcHJlcmVtb3ZlIGZpbGUKLWVjaG8gIkJ1aWxkaW5nIHByZXJlbW92ZSBmaWxlLi4uIgotY2F0ID4gcHJlcmVtb3ZlIDw8IF9FT0YKLSMhICR7U0NSSVBUX1NIRUxMfQotIwotaWYgWyAkRE9fU01GIC1lcSAxIF0gCi10aGVuCi0Jc3ZjYWRtIGRpc2FibGUgJE9QRU5TU0hfRk1SSQotZWxzZQotCSR7VEVTVF9ESVJ9L2V0Yy9pbml0LmQvJHtTWVNWSU5JVF9OQU1FfSBzdG9wCi1maQotX0VPRgotCi0jIGxvY2FsIHByZXJlbW92ZSBjaGFuZ2VzIGhlcmUKLVsgLXMgIiR7UEtHX1BSRVJFTU9WRV9MT0NBTH0iIF0gICYmICAuICR7UEtHX1BSRVJFTU9WRV9MT0NBTH0KLQotY2F0ID4+IHByZXJlbW92ZSA8PCBfRU9GCi1leGl0IDAKLV9FT0YKLQotIyMgQnVpbGQgcG9zdHJlbW92ZSBmaWxlCi1lY2hvICJCdWlsZGluZyBwb3N0cmVtb3ZlIGZpbGUuLi4iCi1jYXQgPiBwb3N0cmVtb3ZlIDw8IF9FT0YKLSMhICR7U0NSSVBUX1NIRUxMfQotIwotaWYgWyAkRE9fU01GIC1lcSAxIF0KLXRoZW4KLQlpZiBzdmNzICRPUEVOU1NIX0ZNUkkgPiAvZGV2L251bGwgMj4mMQotCXRoZW4KLQkJc3ZjY2ZnIGRlbGV0ZSAtZiAkT1BFTlNTSF9GTVJJCi0JZmkKLWZpCi1fRU9GCi0KLSMgbG9jYWwgcG9zdHJlbW92ZSBjaGFuZ2VzIGhlcmUKLVsgLXMgIiR7UEtHX1BPU1RSRU1PVkVfTE9DQUx9IiBdICAmJiAgLiAke1BLR19QT1NUUkVNT1ZFX0xPQ0FMfQotCi1jYXQgPj4gcG9zdHJlbW92ZSA8PCBfRU9GCi1leGl0IDAKLV9FT0YKLQotIyMgQnVpbGQgcmVxdWVzdCBmaWxlCi1lY2hvICJCdWlsZGluZyByZXF1ZXN0IGZpbGUuLi4iCi1jYXQgPiByZXF1ZXN0IDw8IF9FT0YKLXRyYXAgJ2V4aXQgMycgMTUKLQotX0VPRgotCi1bIC14IC91c3IvYmluL2NreW9ybiBdICB8fCAgY2F0ID4+IHJlcXVlc3QgPDwgX0VPRgotCi1ja3lvcm4oKSB7Ci0jIGZvciBzb21lIHN0cmFuZ2UgcmVhc29uIE9wZW5TZXJ2ZXI1IGhhcyBubyBja3lvcm4KLSMgV2UgYnVpbGQgYSBzdHJpcGVkIGRvd24gdmVyc2lvbiBoZXJlCi0KLURFRkFVTFQ9bgotUFJPTVBUPSJZZXMgb3IgTm8gW3llcyxubyw/LHF1aXRdIgotSEVMUF9QUk9NUFQ9IiAgICAgICAgRW50ZXIgeSBvciB5ZXMgaWYgeW91ciBhbnN3ZXIgaXMgeWVzOyBuIG9yIG5vIGlmIHlvdXIgYW5zd2VyIGlzIG5vLiIKLVVTQUdFPSJ1c2FnZTogY2t5b3JuIFtvcHRpb25zXQotd2hlcmUgb3B0aW9ucyBtYXkgaW5jbHVkZToKLSAgICAgICAgLWQgZGVmYXVsdAotICAgICAgICAtaCBoZWxwCi0gICAgICAgIC1wIHByb21wdAotIgotCi1pZiBbIFwkIyAhPSAwIF0KLXRoZW4KLQl3aGlsZSBnZXRvcHRzIGQ6cDpoOiBjCi0JZG8KLQkJY2FzZSBcJGMgaW4KLQkJCWgpCUhFTFBfUFJPTVBUPSJcJE9QVEFSRyIgOzsKLQkJCWQpCURFRkFVTFQ9XCRPUFRBUkcgOzsKLQkJCXApCVBST01QVD1cJE9QVEFSRyA7OwotCQkJXFw/KQllY2hvICJcJFVTQUdFIiAxPiYyCi0JCQkJZXhpdCAxIDs7Ci0JCWVzYWMKLQlkb25lCi0Jc2hpZnQgXGBleHByIFwkT1BUSU5EIC0gMVxgCi1maQotCi13aGlsZSB0cnVlCi1kbwotCWVjaG8gIlwke1BST01QVH1cXGMgIiAxPiYyCi0JcmVhZCBrZXkKLQlbIC16ICJcJGtleSIgXSAgJiYgIGtleT1cJERFRkFVTFQKLQljYXNlIFwka2V5IGluCi0JCVtuLE5dfFtuLE5dW28sT118W3ksWV18W3ksWV1bZSxFXVtzLFNdKQllY2hvICJcJHtrZXl9XFxjIgotCQkJZXhpdCAwIDs7Ci0JCVxcPykJZWNobyBcJEhFTFBfUFJPTVBUIDE+JjIgOzsKLQkJcXxxdWl0KQllY2hvICJxXFxjIiAxPiYyCi0JCQlleGl0IDMgOzsKLQllc2FjCi1kb25lCi0KLX0KLQotX0VPRgotCi1pZiBbICRET19TTUYgLWVxIDEgXQotdGhlbgotCSMgVGhpcyBjb3VsZCBnZXQgaGFpcnksIGFzIHRoZSBydW5uaW5nIHNzaGQgbWF5IG5vdCBiZSB1bmRlciBTTUYuCi0JIyBXZSdsbCBhc3N1bWUgYW4gZWFybGllciB2ZXJzaW9uIG9mIE9wZW5TU0ggc3RhcnRlZCB2aWEgU01GLgotCWNhdCA+PiByZXF1ZXN0IDw8IF9FT0YKLVBSRV9JTlNfU1RPUD1ubwotUE9TVF9JTlNfU1RBUlQ9bm8KLSMgZGV0ZXJtaW5lIGlmIHNob3VsZCByZXN0YXJ0IHRoZSBkYWVtb24KLWlmIFsgLXMgJHtwaWRkaXJ9L3NzaGQucGlkICBdICYmIFwKLSAgICAvdXNyL2Jpbi9zdmNzIC1IICRPUEVOU1NIX0ZNUkkgMj4mMSB8IGVncmVwICJeb25saW5lIiA+IC9kZXYvbnVsbCAyPiYxCi10aGVuCi0JYW5zPVxgY2t5b3JuIC1kIG4gXAotLXAgIlNob3VsZCB0aGUgcnVubmluZyBzc2hkIGRhZW1vbiBiZSByZXN0YXJ0ZWQ/ICR7REVGX01TR30iXGAgfHwgZXhpdCBcJD8KLQljYXNlIFwkYW5zIGluCi0JCVt5LFldKikJUFJFX0lOU19TVE9QPXllcwotCQkJUE9TVF9JTlNfU1RBUlQ9eWVzCi0JCQk7OwotCWVzYWMKLQotZWxzZQotCi0jIGRldGVybWluZSBpZiB3ZSBzaG91bGQgc3RhcnQgc3NoZAotCWFucz1cYGNreW9ybiAtZCBuIFwKLS1wICJTdGFydCB0aGUgc3NoZCBkYWVtb24gYWZ0ZXIgaW5zdGFsbGluZyB0aGlzIHBhY2thZ2U/ICR7REVGX01TR30iXGAgfHwgZXhpdCBcJD8KLQljYXNlIFwkYW5zIGluCi0JCVt5LFldKikJUE9TVF9JTlNfU1RBUlQ9eWVzIDs7Ci0JZXNhYwotZmkKLQotIyBtYWtlIHBhcmFtZXRlcnMgYXZhaWxhYmxlIHRvIGluc3RhbGxhdGlvbiBzZXJ2aWNlLAotIyBhbmQgc28gdG8gYW55IG90aGVyIHBhY2thZ2luZyBzY3JpcHRzCi1jYXQgPlwkMSA8PCEKLVBSRV9JTlNfU1RPUD0nXCRQUkVfSU5TX1NUT1AnCi1QT1NUX0lOU19TVEFSVD0nXCRQT1NUX0lOU19TVEFSVCcKLSEKLQotX0VPRgotZWxzZQotCWNhdCA+PiByZXF1ZXN0IDw8IF9FT0YKLVVTRV9TWU1fTElOS1M9bm8KLVBSRV9JTlNfU1RPUD1ubwotUE9TVF9JTlNfU1RBUlQ9bm8KLSMgVXNlIHN5bWJvbGljIGxpbmtzPwotYW5zPVxgY2t5b3JuIC1kIG4gXAotLXAgIkRvIHlvdSB3YW50IHN5bWJvbGljIGxpbmtzIGZvciB0aGUgc3RhcnQvc3RvcCBzY3JpcHRzPyAke0RFRl9NU0d9IlxgIHx8IGV4aXQgXCQ/Ci1jYXNlIFwkYW5zIGluCi0JW3ksWV0qKQlVU0VfU1lNX0xJTktTPXllcyA7OwotZXNhYwotCi0jIGRldGVybWluZSBpZiBzaG91bGQgcmVzdGFydCB0aGUgZGFlbW9uCi1pZiBbIC1zICR7cGlkZGlyfS9zc2hkLnBpZCAgLWEgIC1mICR7VEVTVF9ESVJ9L2V0Yy9pbml0LmQvJHtTWVNWSU5JVF9OQU1FfSBdCi10aGVuCi0JYW5zPVxgY2t5b3JuIC1kIG4gXAotLXAgIlNob3VsZCB0aGUgcnVubmluZyBzc2hkIGRhZW1vbiBiZSByZXN0YXJ0ZWQ/ICR7REVGX01TR30iXGAgfHwgZXhpdCBcJD8KLQljYXNlIFwkYW5zIGluCi0JCVt5LFldKikJUFJFX0lOU19TVE9QPXllcwotCQkJUE9TVF9JTlNfU1RBUlQ9eWVzCi0JCQk7OwotCWVzYWMKLQotZWxzZQotCi0jIGRldGVybWluZSBpZiB3ZSBzaG91bGQgc3RhcnQgc3NoZAotCWFucz1cYGNreW9ybiAtZCBuIFwKLS1wICJTdGFydCB0aGUgc3NoZCBkYWVtb24gYWZ0ZXIgaW5zdGFsbGluZyB0aGlzIHBhY2thZ2U/ICR7REVGX01TR30iXGAgfHwgZXhpdCBcJD8KLQljYXNlIFwkYW5zIGluCi0JCVt5LFldKikJUE9TVF9JTlNfU1RBUlQ9eWVzIDs7Ci0JZXNhYwotZmkKLQotIyBtYWtlIHBhcmFtZXRlcnMgYXZhaWxhYmxlIHRvIGluc3RhbGxhdGlvbiBzZXJ2aWNlLAotIyBhbmQgc28gdG8gYW55IG90aGVyIHBhY2thZ2luZyBzY3JpcHRzCi1jYXQgPlwkMSA8PCEKLVVTRV9TWU1fTElOS1M9J1wkVVNFX1NZTV9MSU5LUycKLVBSRV9JTlNfU1RPUD0nXCRQUkVfSU5TX1NUT1AnCi1QT1NUX0lOU19TVEFSVD0nXCRQT1NUX0lOU19TVEFSVCcKLSEKLQotX0VPRgotZmkKLQotIyBsb2NhbCByZXF1ZXN0IGNoYW5nZXMgaGVyZQotWyAtcyAiJHtQS0dfUkVRVUVTVF9MT0NBTH0iIF0gICYmICAuICR7UEtHX1JFUVVFU1RfTE9DQUx9Ci0KLWNhdCA+PiByZXF1ZXN0IDw8IF9FT0YKLWV4aXQgMAotCi1fRU9GCi0KLSMjIE5leHQgQnVpbGQgb3VyIHByb3RvdHlwZQotZWNobyAiQnVpbGRpbmcgcHJvdG90eXBlIGZpbGUuLi4iCi1jYXQgPm1rLXByb3RvLmF3ayA8PCBfRU9GCi0JICAgIEJFR0lOIHsgcHJpbnQgImkgcGtnaW5mbyI7IHByaW50ICJpIGRlcGVuZCI7IFxcCi0JCSAgICBwcmludCAiaSBwcmVpbnN0YWxsIjsgcHJpbnQgImkgcG9zdGluc3RhbGwiOyBcXAotIAkJICAgIHByaW50ICJpIHByZXJlbW92ZSI7IHByaW50ICJpIHBvc3RyZW1vdmUiOyBcXAotCQkgICAgcHJpbnQgImkgcmVxdWVzdCI7IHByaW50ICJpIHNwYWNlIjsgXFwKLQkJICAgIHNwbGl0KCIkU1lTVEVNX0RJUiIsc3lzX2ZpbGVzKTsgfQotCSAgICB7Ci0JICAgICBmb3IgKGRpciBpbiBzeXNfZmlsZXMpIHsgaWYgKCBcJDMgIT0gc3lzX2ZpbGVzW2Rpcl0gKQotCQkgICAgIHsgaWYgKCBcJDEgPT0gInMiICkKLQkJCXsgXCQ1PSIiOyBcJDY9IiI7IH0KLQkJICAgICBlbHNlCi0JCQl7IFwkNT0icm9vdCI7IFwkNj0ic3lzIjsgfQotCQkgICAgIH0KLQkJZWxzZQotCQkgICAgIHsgXCQ0PSI/IjsgXCQ1PSI/IjsgXCQ2PSI/IjsgYnJlYWs7fQotCSAgICB9IH0KLQkgICAgeyBwcmludDsgfQotX0VPRgotCi1maW5kIC4gfCBlZ3JlcCAtdiAicHJvdG90eXBlfHBrZ2luZm98bWstcHJvdG8uYXdrIiB8IHNvcnQgfCBcCi0JcGtncHJvdG8gJFBST1RPX0FSR1MgfCAke0FXS30gLWYgbWstcHJvdG8uYXdrID4gcHJvdG90eXBlCi0KLSMgL3Vzci9sb2NhbCBpcyBhIHN5bWxpbmsgb24gc29tZSBzeXN0ZW1zCi1bICIke1VTUl9MT0NBTF9JU19TWU1MSU5LfSIgPSB5ZXMgXSAgJiYgIHsKLQlncmVwIC12ICJeZCBub25lIC91c3IvbG9jYWwgPyA/ID8kIiBwcm90b3R5cGUgPiBwcm90b3R5cGUubmV3Ci0JbXYgcHJvdG90eXBlLm5ldyBwcm90b3R5cGUKLX0KLQotIyMgU3RlcCBiYWNrIGEgZGlyZWN0b3J5IGFuZCBub3cgYnVpbGQgdGhlIHBhY2thZ2UuCi1jZCAuLgotIyBsb2NhbCBwcm90b3R5cGUgdHdlZWtzIGhlcmUKLVsgLXMgIiR7UE9TVF9QUk9UT1RZUEVfRURJVFN9IiBdICAmJiAgLiAke1BPU1RfUFJPVE9UWVBFX0VESVRTfQotCi1lY2hvICJCdWlsZGluZyBwYWNrYWdlLi4iCi1wa2dtayAtZCAke0ZBS0VfUk9PVH0gLWYgJEZBS0VfUk9PVC9wcm90b3R5cGUgLW8KLWVjaG8gfCBwa2d0cmFucyAtb3MgJHtGQUtFX1JPT1R9ICR7U1RBUlR9LyRQS0dOQU1FLSRWRVJTSU9OJFJFVi0kVU5BTUVfUy0kQVJDSC5wa2cKLQk7OwotCi0JanVzdHBrZy5zaCkKLXJtIC1mciAke0ZBS0VfUk9PVH0vJHtQS0dOQU1FfQotZ3JlcCAtdiAiXlBTVEFNUD0iICRGQUtFX1JPT1QvcGtnaW5mbyA+ICQkdG1wCi1tdiAkJHRtcCAkRkFLRV9ST09UL3BrZ2luZm8KLWNhdCA+PiAkRkFLRV9ST09UL3BrZ2luZm8gPDwgX0VPRgotUFNUQU1QPSIke1VOQU1FX1N9ICR7T1NfVkVSfSAke0FSQ0h9IGBkYXRlICcrJWQlYiVZICVIOiVNJ2AiCi1fRU9GCi1wa2dtayAtZCAke0ZBS0VfUk9PVH0gLWYgJEZBS0VfUk9PVC9wcm90b3R5cGUgLW8KLWVjaG8gfCBwa2d0cmFucyAtb3MgJHtGQUtFX1JPT1R9ICR7U1RBUlR9LyRQS0dOQU1FLSRWRVJTSU9OJFJFVi0kVU5BTUVfUy0kQVJDSC5wa2cKLQk7OwotCi1lc2FjCi0KLVsgIiR7UkVNT1ZFX0ZBS0VfUk9PVF9XSEVOX0RPTkV9IiA9IHllcyBdICAmJiAgcm0gLXJmICRGQUtFX1JPT1QKLWV4aXQgMAotCmRpZmYgLS1naXQgYS9jYW5vaG9zdC5jIGIvY2Fub2hvc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiZDhhMy4uMDAwMDAwMAotLS0gYS9jYW5vaG9zdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qICRPcGVuQlNEOiBjYW5vaG9zdC5jLHYgMS42NiAyMDEwLzAxLzEzIDAxOjIwOjIwIGR0dWNrZXIgRXhwICQgKi8KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiBGdW5jdGlvbnMgZm9yIHJldHVybmluZyB0aGUgY2Fub25pY2FsIGhvc3QgbmFtZSBvZiB0aGUgcmVtb3RlIHNpdGUuCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAiY2Fub2hvc3QuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLXN0YXRpYyB2b2lkIGNoZWNrX2lwX29wdGlvbnMoaW50LCBjaGFyICopOwotc3RhdGljIGNoYXIgKmNhbm9uaWNhbF9ob3N0X2lwID0gTlVMTDsKLXN0YXRpYyBpbnQgY2FjaGVkX3BvcnQgPSAtMTsKLQotLyoKLSAqIFJldHVybiB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIGhvc3QgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgc29ja2V0LiBUaGUKLSAqIGNhbGxlciBzaG91bGQgZnJlZSB0aGUgcmV0dXJuZWQgc3RyaW5nIHdpdGggeGZyZWUuCi0gKi8KLQotc3RhdGljIGNoYXIgKgotZ2V0X3JlbW90ZV9ob3N0bmFtZShpbnQgc29jaywgaW50IHVzZV9kbnMpCi17Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZnJvbTsKLQlpbnQgaTsKLQlzb2NrbGVuX3QgZnJvbWxlbjsKLQlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaSwgKmFpdG9wOwotCWNoYXIgbmFtZVtOSV9NQVhIT1NUXSwgbnRvcFtOSV9NQVhIT1NUXSwgbnRvcDJbTklfTUFYSE9TVF07Ci0KLQkvKiBHZXQgSVAgYWRkcmVzcyBvZiBjbGllbnQuICovCi0JZnJvbWxlbiA9IHNpemVvZihmcm9tKTsKLQltZW1zZXQoJmZyb20sIDAsIHNpemVvZihmcm9tKSk7Ci0JaWYgKGdldHBlZXJuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbSwgJmZyb21sZW4pIDwgMCkgewotCQlkZWJ1ZygiZ2V0cGVlcm5hbWUgZmFpbGVkOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQljbGVhbnVwX2V4aXQoMjU1KTsKLQl9Ci0KLQlpZiAoZnJvbS5zc19mYW1pbHkgPT0gQUZfSU5FVCkKLQkJY2hlY2tfaXBfb3B0aW9ucyhzb2NrLCBudG9wKTsKLQotCWlwdjY0X25vcm1hbGlzZV9tYXBwZWQoJmZyb20sICZmcm9tbGVuKTsKLQotCWlmIChmcm9tLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikKLQkJZnJvbWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKLQotCWlmIChnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyICopJmZyb20sIGZyb21sZW4sIG50b3AsIHNpemVvZihudG9wKSwKLQkgICAgTlVMTCwgMCwgTklfTlVNRVJJQ0hPU1QpICE9IDApCi0JCWZhdGFsKCJnZXRfcmVtb3RlX2hvc3RuYW1lOiBnZXRuYW1laW5mbyBOSV9OVU1FUklDSE9TVCBmYWlsZWQiKTsKLQotCWlmICghdXNlX2RucykKLQkJcmV0dXJuIHhzdHJkdXAobnRvcCk7Ci0KLQlkZWJ1ZzMoIlRyeWluZyB0byByZXZlcnNlIG1hcCBhZGRyZXNzICUuMTAwcy4iLCBudG9wKTsKLQkvKiBNYXAgdGhlIElQIGFkZHJlc3MgdG8gYSBob3N0IG5hbWUuICovCi0JaWYgKGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbSwgZnJvbWxlbiwgbmFtZSwgc2l6ZW9mKG5hbWUpLAotCSAgICBOVUxMLCAwLCBOSV9OQU1FUkVRRCkgIT0gMCkgewotCQkvKiBIb3N0IG5hbWUgbm90IGZvdW5kLiAgVXNlIGlwIGFkZHJlc3MuICovCi0JCXJldHVybiB4c3RyZHVwKG50b3ApOwotCX0KLQotCS8qCi0JICogaWYgcmV2ZXJzZSBsb29rdXAgcmVzdWx0IGxvb2tzIGxpa2UgYSBudW1lcmljIGhvc3RuYW1lLAotCSAqIHNvbWVvbmUgaXMgdHJ5aW5nIHRvIHRyaWNrIHVzIGJ5IFBUUiByZWNvcmQgbGlrZSBmb2xsb3dpbmc6Ci0JICoJMS4xLjEuMTAuaW4tYWRkci5hcnBhLglJTiBQVFIJMi4zLjQuNQotCSAqLwotCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsJLypkdW1teSovCi0JaGludHMuYWlfZmxhZ3MgPSBBSV9OVU1FUklDSE9TVDsKLQlpZiAoZ2V0YWRkcmluZm8obmFtZSwgTlVMTCwgJmhpbnRzLCAmYWkpID09IDApIHsKLQkJbG9naXQoIk5hc3R5IFBUUiByZWNvcmQgXCIlc1wiIGlzIHNldCB1cCBmb3IgJXMsIGlnbm9yaW5nIiwKLQkJICAgIG5hbWUsIG50b3ApOwotCQlmcmVlYWRkcmluZm8oYWkpOwotCQlyZXR1cm4geHN0cmR1cChudG9wKTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlcnQgaXQgdG8gYWxsIGxvd2VyY2FzZSAod2hpY2ggaXMgZXhwZWN0ZWQgYnkgdGhlIHJlc3QKLQkgKiBvZiB0aGlzIHNvZnR3YXJlKS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBuYW1lW2ldOyBpKyspCi0JCWlmIChpc3VwcGVyKG5hbWVbaV0pKQotCQkJbmFtZVtpXSA9IChjaGFyKXRvbG93ZXIobmFtZVtpXSk7Ci0JLyoKLQkgKiBNYXAgaXQgYmFjayB0byBhbiBJUCBhZGRyZXNzIGFuZCBjaGVjayB0aGF0IHRoZSBnaXZlbgotCSAqIGFkZHJlc3MgYWN0dWFsbHkgaXMgYW4gYWRkcmVzcyBvZiB0aGlzIGhvc3QuICBUaGlzIGlzCi0JICogbmVjZXNzYXJ5IGJlY2F1c2UgYW55b25lIHdpdGggYWNjZXNzIHRvIGEgbmFtZSBzZXJ2ZXIgY2FuCi0JICogZGVmaW5lIGFyYml0cmFyeSBuYW1lcyBmb3IgYW4gSVAgYWRkcmVzcy4gTWFwcGluZyBmcm9tCi0JICogbmFtZSB0byBJUCBhZGRyZXNzIGNhbiBiZSB0cnVzdGVkIGJldHRlciAoYnV0IGNhbiBzdGlsbCBiZQotCSAqIGZvb2xlZCBpZiB0aGUgaW50cnVkZXIgaGFzIGFjY2VzcyB0byB0aGUgbmFtZSBzZXJ2ZXIgb2YKLQkgKiB0aGUgZG9tYWluKS4KLQkgKi8KLQltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLQloaW50cy5haV9mYW1pbHkgPSBmcm9tLnNzX2ZhbWlseTsKLQloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotCWlmIChnZXRhZGRyaW5mbyhuYW1lLCBOVUxMLCAmaGludHMsICZhaXRvcCkgIT0gMCkgewotCQlsb2dpdCgicmV2ZXJzZSBtYXBwaW5nIGNoZWNraW5nIGdldGFkZHJpbmZvIGZvciAlLjcwMHMgIgotCQkgICAgIlslc10gZmFpbGVkIC0gUE9TU0lCTEUgQlJFQUstSU4gQVRURU1QVCEiLCBuYW1lLCBudG9wKTsKLQkJcmV0dXJuIHhzdHJkdXAobnRvcCk7Ci0JfQotCS8qIExvb2sgZm9yIHRoZSBhZGRyZXNzIGZyb20gdGhlIGxpc3Qgb2YgYWRkcmVzc2VzLiAqLwotCWZvciAoYWkgPSBhaXRvcDsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKLQkJaWYgKGdldG5hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwgbnRvcDIsCi0JCSAgICBzaXplb2YobnRvcDIpLCBOVUxMLCAwLCBOSV9OVU1FUklDSE9TVCkgPT0gMCAmJgotCQkgICAgKHN0cmNtcChudG9wLCBudG9wMikgPT0gMCkpCi0JCQkJYnJlYWs7Ci0JfQotCWZyZWVhZGRyaW5mbyhhaXRvcCk7Ci0JLyogSWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXN0LCB0aGUgYWRkcmVzcyB3YXMgbm90IHRoZXJlLiAqLwotCWlmICghYWkpIHsKLQkJLyogQWRkcmVzcyBub3QgZm91bmQgZm9yIHRoZSBob3N0IG5hbWUuICovCi0JCWxvZ2l0KCJBZGRyZXNzICUuMTAwcyBtYXBzIHRvICUuNjAwcywgYnV0IHRoaXMgZG9lcyBub3QgIgotCQkgICAgIm1hcCBiYWNrIHRvIHRoZSBhZGRyZXNzIC0gUE9TU0lCTEUgQlJFQUstSU4gQVRURU1QVCEiLAotCQkgICAgbnRvcCwgbmFtZSk7Ci0JCXJldHVybiB4c3RyZHVwKG50b3ApOwotCX0KLQlyZXR1cm4geHN0cmR1cChuYW1lKTsKLX0KLQotLyoKLSAqIElmIElQIG9wdGlvbnMgYXJlIHN1cHBvcnRlZCwgbWFrZSBzdXJlIHRoZXJlIGFyZSBub25lIChsb2cgYW5kCi0gKiBkaXNjb25uZWN0IHRoZW0gaWYgYW55IGFyZSBmb3VuZCkuICBCYXNpY2FsbHkgd2UgYXJlIHdvcnJpZWQgYWJvdXQKLSAqIHNvdXJjZSByb3V0aW5nOyBpdCBjYW4gYmUgdXNlZCB0byBwcmV0ZW5kIHlvdSBhcmUgc29tZWJvZHkKLSAqIChpcC1hZGRyZXNzKSB5b3UgYXJlIG5vdC4gVGhhdCBpdHNlbGYgbWF5IGJlICJhbG1vc3QgYWNjZXB0YWJsZSIKLSAqIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgYnV0IHJob3N0cyBhdXRlbnRpY2F0aW9uIGlzIHVzZWxlc3MKLSAqIGlmIHNvdXJjZSByb3V0aW5nIGlzIGFjY2VwdGVkLiBOb3RpY2UgYWxzbyB0aGF0IGlmIHdlIGp1c3QgZHJvcHBlZAotICogc291cmNlIHJvdXRpbmcgaGVyZSwgdGhlIG90aGVyIHNpZGUgY291bGQgdXNlIElQIHNwb29maW5nIHRvIGRvCi0gKiByZXN0IG9mIHRoZSBpbnRlcmFjdGlvbiBhbmQgY291bGQgc3RpbGwgYnlwYXNzIHNlY3VyaXR5LiAgU28gd2UKLSAqIGV4aXQgaGVyZSBpZiB3ZSBkZXRlY3QgYW55IElQIG9wdGlvbnMuCi0gKi8KLS8qIElQdjQgb25seSAqLwotc3RhdGljIHZvaWQKLWNoZWNrX2lwX29wdGlvbnMoaW50IHNvY2ssIGNoYXIgKmlwYWRkcikKLXsKLSNpZmRlZiBJUF9PUFRJT05TCi0JdV9jaGFyIG9wdGlvbnNbMjAwXTsKLQljaGFyIHRleHRbc2l6ZW9mKG9wdGlvbnMpICogMyArIDFdOwotCXNvY2tsZW5fdCBvcHRpb25fc2l6ZTsKLQl1X2ludCBpOwotCWludCBpcHByb3RvOwotCXN0cnVjdCBwcm90b2VudCAqaXA7Ci0KLQlpZiAoKGlwID0gZ2V0cHJvdG9ieW5hbWUoImlwIikpICE9IE5VTEwpCi0JCWlwcHJvdG8gPSBpcC0+cF9wcm90bzsKLQllbHNlCi0JCWlwcHJvdG8gPSBJUFBST1RPX0lQOwotCW9wdGlvbl9zaXplID0gc2l6ZW9mKG9wdGlvbnMpOwotCWlmIChnZXRzb2Nrb3B0KHNvY2ssIGlwcHJvdG8sIElQX09QVElPTlMsIG9wdGlvbnMsCi0JICAgICZvcHRpb25fc2l6ZSkgPj0gMCAmJiBvcHRpb25fc2l6ZSAhPSAwKSB7Ci0JCXRleHRbMF0gPSAnXDAnOwotCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9uX3NpemU7IGkrKykKLQkJCXNucHJpbnRmKHRleHQgKyBpKjMsIHNpemVvZih0ZXh0KSAtIGkqMywKLQkJCSAgICAiICUyLjJ4Iiwgb3B0aW9uc1tpXSk7Ci0JCWZhdGFsKCJDb25uZWN0aW9uIGZyb20gJS4xMDBzIHdpdGggSVAgb3B0aW9uczolLjgwMHMiLAotCQkgICAgaXBhZGRyLCB0ZXh0KTsKLQl9Ci0jZW5kaWYgLyogSVBfT1BUSU9OUyAqLwotfQotCi12b2lkCi1pcHY2NF9ub3JtYWxpc2VfbWFwcGVkKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLCBzb2NrbGVuX3QgKmxlbikKLXsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkcjsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmE0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHI7Ci0Jc3RydWN0IGluX2FkZHIgaW5hZGRyOwotCXVfaW50MTZfdCBwb3J0OwotCi0JaWYgKGFkZHItPnNzX2ZhbWlseSAhPSBBRl9JTkVUNiB8fAotCSAgICAhSU42X0lTX0FERFJfVjRNQVBQRUQoJmE2LT5zaW42X2FkZHIpKQotCQlyZXR1cm47Ci0KLQlkZWJ1ZzMoIk5vcm1hbGlzaW5nIG1hcHBlZCBJUHY0IGluIElQdjYgYWRkcmVzcyIpOwotCi0JbWVtY3B5KCZpbmFkZHIsICgoY2hhciAqKSZhNi0+c2luNl9hZGRyKSArIDEyLCBzaXplb2YoaW5hZGRyKSk7Ci0JcG9ydCA9IGE2LT5zaW42X3BvcnQ7Ci0KLQliemVybyhhNCwgc2l6ZW9mKCphNCkpOwotCi0JYTQtPnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCSpsZW4gPSBzaXplb2YoKmE0KTsKLQltZW1jcHkoJmE0LT5zaW5fYWRkciwgJmluYWRkciwgc2l6ZW9mKGluYWRkcikpOwotCWE0LT5zaW5fcG9ydCA9IHBvcnQ7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBob3N0IGluIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBjdXJyZW50Ci0gKiBjb25uZWN0aW9uLiAgVGhlIGhvc3QgbmFtZSBpcyBjYWNoZWQsIHNvIGl0IGlzIGVmZmljaWVudCB0byBjYWxsIHRoaXMKLSAqIHNldmVyYWwgdGltZXMuCi0gKi8KLQotY29uc3QgY2hhciAqCi1nZXRfY2Fub25pY2FsX2hvc3RuYW1lKGludCB1c2VfZG5zKQotewotCWNoYXIgKmhvc3Q7Ci0Jc3RhdGljIGNoYXIgKmNhbm9uaWNhbF9ob3N0X25hbWUgPSBOVUxMOwotCXN0YXRpYyBjaGFyICpyZW1vdGVfaXAgPSBOVUxMOwotCi0JLyogQ2hlY2sgaWYgd2UgaGF2ZSBwcmV2aW91c2x5IHJldHJpZXZlZCBuYW1lIHdpdGggc2FtZSBvcHRpb24uICovCi0JaWYgKHVzZV9kbnMgJiYgY2Fub25pY2FsX2hvc3RfbmFtZSAhPSBOVUxMKQotCQlyZXR1cm4gY2Fub25pY2FsX2hvc3RfbmFtZTsKLQlpZiAoIXVzZV9kbnMgJiYgcmVtb3RlX2lwICE9IE5VTEwpCi0JCXJldHVybiByZW1vdGVfaXA7Ci0KLQkvKiBHZXQgdGhlIHJlYWwgaG9zdG5hbWUgaWYgc29ja2V0OyBvdGhlcndpc2UgcmV0dXJuIFVOS05PV04uICovCi0JaWYgKHBhY2tldF9jb25uZWN0aW9uX2lzX29uX3NvY2tldCgpKQotCQlob3N0ID0gZ2V0X3JlbW90ZV9ob3N0bmFtZShwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSwgdXNlX2Rucyk7Ci0JZWxzZQotCQlob3N0ID0gIlVOS05PV04iOwotCi0JaWYgKHVzZV9kbnMpCi0JCWNhbm9uaWNhbF9ob3N0X25hbWUgPSBob3N0OwotCWVsc2UKLQkJcmVtb3RlX2lwID0gaG9zdDsKLQlyZXR1cm4gaG9zdDsKLX0KLQotLyoKLSAqIFJldHVybnMgdGhlIGxvY2FsL3JlbW90ZSBJUC1hZGRyZXNzL2hvc3RuYW1lIG9mIHNvY2tldCBhcyBhIHN0cmluZy4KLSAqIFRoZSByZXR1cm5lZCBzdHJpbmcgbXVzdCBiZSBmcmVlZC4KLSAqLwotc3RhdGljIGNoYXIgKgotZ2V0X3NvY2tldF9hZGRyZXNzKGludCBzb2NrLCBpbnQgcmVtb3RlLCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKLQlzb2NrbGVuX3QgYWRkcmxlbjsKLQljaGFyIG50b3BbTklfTUFYSE9TVF07Ci0JaW50IHI7Ci0KLQkvKiBHZXQgSVAgYWRkcmVzcyBvZiBjbGllbnQuICovCi0JYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKLQltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0KLQlpZiAocmVtb3RlKSB7Ci0JCWlmIChnZXRwZWVybmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRybGVuKQotCQkgICAgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIHsKLQkJaWYgKGdldHNvY2tuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJsZW4pCi0JCSAgICA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBXb3JrIGFyb3VuZCBMaW51eCBJUHY2IHdlaXJkbmVzcyAqLwotCWlmIChhZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikKLQkJYWRkcmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKLQotCWlwdjY0X25vcm1hbGlzZV9tYXBwZWQoJmFkZHIsICZhZGRybGVuKTsKLQotCS8qIEdldCB0aGUgYWRkcmVzcyBpbiBhc2NpaS4gKi8KLQlpZiAoKHIgPSBnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIGFkZHJsZW4sIG50b3AsCi0JICAgIHNpemVvZihudG9wKSwgTlVMTCwgMCwgZmxhZ3MpKSAhPSAwKSB7Ci0JCWVycm9yKCJnZXRfc29ja2V0X2FkZHJlc3M6IGdldG5hbWVpbmZvICVkIGZhaWxlZDogJXMiLCBmbGFncywKLQkJICAgIHNzaF9nYWlfc3RyZXJyb3IocikpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHhzdHJkdXAobnRvcCk7Ci19Ci0KLWNoYXIgKgotZ2V0X3BlZXJfaXBhZGRyKGludCBzb2NrKQotewotCWNoYXIgKnA7Ci0KLQlpZiAoKHAgPSBnZXRfc29ja2V0X2FkZHJlc3Moc29jaywgMSwgTklfTlVNRVJJQ0hPU1QpKSAhPSBOVUxMKQotCQlyZXR1cm4gcDsKLQlyZXR1cm4geHN0cmR1cCgiVU5LTk9XTiIpOwotfQotCi1jaGFyICoKLWdldF9sb2NhbF9pcGFkZHIoaW50IHNvY2spCi17Ci0JY2hhciAqcDsKLQotCWlmICgocCA9IGdldF9zb2NrZXRfYWRkcmVzcyhzb2NrLCAwLCBOSV9OVU1FUklDSE9TVCkpICE9IE5VTEwpCi0JCXJldHVybiBwOwotCXJldHVybiB4c3RyZHVwKCJVTktOT1dOIik7Ci19Ci0KLWNoYXIgKgotZ2V0X2xvY2FsX25hbWUoaW50IGZkKQotewotCWNoYXIgKmhvc3QsIG15bmFtZVtOSV9NQVhIT1NUXTsKLQotCS8qIEFzc3VtZSB3ZSB3ZXJlIHBhc3NlZCBhIHNvY2tldCAqLwotCWlmICgoaG9zdCA9IGdldF9zb2NrZXRfYWRkcmVzcyhmZCwgMCwgTklfTkFNRVJFUUQpKSAhPSBOVUxMKQotCQlyZXR1cm4gaG9zdDsKLQotCS8qIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSB3ZXJlIHBhc3NlZCBhIHBpcGUgKi8KLQlpZiAoZ2V0aG9zdG5hbWUobXluYW1lLCBzaXplb2YobXluYW1lKSkgPT0gLTEpIHsKLQkJdmVyYm9zZSgiZ2V0X2xvY2FsX25hbWU6IGdldGhvc3RuYW1lOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JfSBlbHNlIHsKLQkJaG9zdCA9IHhzdHJkdXAobXluYW1lKTsKLQl9Ci0KLQlyZXR1cm4gaG9zdDsKLX0KLQotdm9pZAotY2xlYXJfY2FjaGVkX2FkZHIodm9pZCkKLXsKLQlpZiAoY2Fub25pY2FsX2hvc3RfaXAgIT0gTlVMTCkgewotCQl4ZnJlZShjYW5vbmljYWxfaG9zdF9pcCk7Ci0JCWNhbm9uaWNhbF9ob3N0X2lwID0gTlVMTDsKLQl9Ci0JY2FjaGVkX3BvcnQgPSAtMTsKLX0KLQotLyoKLSAqIFJldHVybnMgdGhlIElQLWFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBob3N0IGFzIGEgc3RyaW5nLiAgVGhlIHJldHVybmVkCi0gKiBzdHJpbmcgbXVzdCBub3QgYmUgZnJlZWQuCi0gKi8KLQotY29uc3QgY2hhciAqCi1nZXRfcmVtb3RlX2lwYWRkcih2b2lkKQotewotCS8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBjYWNoZWQgdGhlIGlwYWRkci4gKi8KLQlpZiAoY2Fub25pY2FsX2hvc3RfaXAgPT0gTlVMTCkgewotCQlpZiAocGFja2V0X2Nvbm5lY3Rpb25faXNfb25fc29ja2V0KCkpIHsKLQkJCWNhbm9uaWNhbF9ob3N0X2lwID0KLQkJCSAgICBnZXRfcGVlcl9pcGFkZHIocGFja2V0X2dldF9jb25uZWN0aW9uX2luKCkpOwotCQkJaWYgKGNhbm9uaWNhbF9ob3N0X2lwID09IE5VTEwpCi0JCQkJY2xlYW51cF9leGl0KDI1NSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBJZiBub3Qgb24gc29ja2V0LCByZXR1cm4gVU5LTk9XTi4gKi8KLQkJCWNhbm9uaWNhbF9ob3N0X2lwID0geHN0cmR1cCgiVU5LTk9XTiIpOwotCQl9Ci0JfQotCXJldHVybiBjYW5vbmljYWxfaG9zdF9pcDsKLX0KLQotY29uc3QgY2hhciAqCi1nZXRfcmVtb3RlX25hbWVfb3JfaXAodV9pbnQgdXRtcF9sZW4sIGludCB1c2VfZG5zKQotewotCXN0YXRpYyBjb25zdCBjaGFyICpyZW1vdGUgPSAiIjsKLQlpZiAodXRtcF9sZW4gPiAwKQotCQlyZW1vdGUgPSBnZXRfY2Fub25pY2FsX2hvc3RuYW1lKHVzZV9kbnMpOwotCWlmICh1dG1wX2xlbiA9PSAwIHx8IHN0cmxlbihyZW1vdGUpID4gdXRtcF9sZW4pCi0JCXJlbW90ZSA9IGdldF9yZW1vdGVfaXBhZGRyKCk7Ci0JcmV0dXJuIHJlbW90ZTsKLX0KLQotLyogUmV0dXJucyB0aGUgbG9jYWwvcmVtb3RlIHBvcnQgZm9yIHRoZSBzb2NrZXQuICovCi0KLWludAotZ2V0X3NvY2tfcG9ydChpbnQgc29jaywgaW50IGxvY2FsKQotewotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGZyb207Ci0Jc29ja2xlbl90IGZyb21sZW47Ci0JY2hhciBzdHJwb3J0W05JX01BWFNFUlZdOwotCWludCByOwotCi0JLyogR2V0IElQIGFkZHJlc3Mgb2YgY2xpZW50LiAqLwotCWZyb21sZW4gPSBzaXplb2YoZnJvbSk7Ci0JbWVtc2V0KCZmcm9tLCAwLCBzaXplb2YoZnJvbSkpOwotCWlmIChsb2NhbCkgewotCQlpZiAoZ2V0c29ja25hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tLCAmZnJvbWxlbikgPCAwKSB7Ci0JCQllcnJvcigiZ2V0c29ja25hbWUgZmFpbGVkOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoZ2V0cGVlcm5hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tLCAmZnJvbWxlbikgPCAwKSB7Ci0JCQlkZWJ1ZygiZ2V0cGVlcm5hbWUgZmFpbGVkOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JLyogV29yayBhcm91bmQgTGludXggSVB2NiB3ZWlyZG5lc3MgKi8KLQlpZiAoZnJvbS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpCi0JCWZyb21sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7Ci0KLQkvKiBSZXR1cm4gcG9ydCBudW1iZXIuICovCi0JaWYgKChyID0gZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tLCBmcm9tbGVuLCBOVUxMLCAwLAotCSAgICBzdHJwb3J0LCBzaXplb2Yoc3RycG9ydCksIE5JX05VTUVSSUNTRVJWKSkgIT0gMCkKLQkJZmF0YWwoImdldF9zb2NrX3BvcnQ6IGdldG5hbWVpbmZvIE5JX05VTUVSSUNTRVJWIGZhaWxlZDogJXMiLAotCQkgICAgc3NoX2dhaV9zdHJlcnJvcihyKSk7Ci0JcmV0dXJuIGF0b2koc3RycG9ydCk7Ci19Ci0KLS8qIFJldHVybnMgcmVtb3RlL2xvY2FsIHBvcnQgbnVtYmVyIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uLiAqLwotCi1zdGF0aWMgaW50Ci1nZXRfcG9ydChpbnQgbG9jYWwpCi17Ci0JLyoKLQkgKiBJZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgYSBzb2NrZXQsIHJldHVybiA2NTUzNS4gIFRoaXMgaXMKLQkgKiBpbnRlbnRpb25hbGx5IGNob3NlbiB0byBiZSBhbiB1bnByaXZpbGVnZWQgcG9ydCBudW1iZXIuCi0JICovCi0JaWYgKCFwYWNrZXRfY29ubmVjdGlvbl9pc19vbl9zb2NrZXQoKSkKLQkJcmV0dXJuIDY1NTM1OwotCi0JLyogR2V0IHNvY2tldCBhbmQgcmV0dXJuIHRoZSBwb3J0IG51bWJlci4gKi8KLQlyZXR1cm4gZ2V0X3NvY2tfcG9ydChwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSwgbG9jYWwpOwotfQotCi1pbnQKLWdldF9wZWVyX3BvcnQoaW50IHNvY2spCi17Ci0JcmV0dXJuIGdldF9zb2NrX3BvcnQoc29jaywgMCk7Ci19Ci0KLWludAotZ2V0X3JlbW90ZV9wb3J0KHZvaWQpCi17Ci0JLyogQ2FjaGUgdG8gYXZvaWQgZ2V0cGVlcm5hbWUoKSBvbiBhIGRlYWQgY29ubmVjdGlvbiAqLwotCWlmIChjYWNoZWRfcG9ydCA9PSAtMSkKLQkJY2FjaGVkX3BvcnQgPSBnZXRfcG9ydCgwKTsKLQotCXJldHVybiBjYWNoZWRfcG9ydDsKLX0KLQotaW50Ci1nZXRfbG9jYWxfcG9ydCh2b2lkKQotewotCXJldHVybiBnZXRfcG9ydCgxKTsKLX0KZGlmZiAtLWdpdCBhL2Nhbm9ob3N0LmggYi9jYW5vaG9zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzg2MzZmLi4wMDAwMDAwCi0tLSBhL2Nhbm9ob3N0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiAkT3BlbkJTRDogY2Fub2hvc3QuaCx2IDEuMTEgMjAwOS8wNS8yNyAwNjozMToyNSBhbmRyZWFzIEV4cCAkICovCi0KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotCi1jb25zdCBjaGFyCSpnZXRfY2Fub25pY2FsX2hvc3RuYW1lKGludCk7Ci1jb25zdCBjaGFyCSpnZXRfcmVtb3RlX2lwYWRkcih2b2lkKTsKLWNvbnN0IGNoYXIJKmdldF9yZW1vdGVfbmFtZV9vcl9pcCh1X2ludCwgaW50KTsKLQotY2hhcgkJKmdldF9wZWVyX2lwYWRkcihpbnQpOwotaW50CQkgZ2V0X3BlZXJfcG9ydChpbnQpOwotY2hhcgkJKmdldF9sb2NhbF9pcGFkZHIoaW50KTsKLWNoYXIJCSpnZXRfbG9jYWxfbmFtZShpbnQpOwotCi1pbnQJCSBnZXRfcmVtb3RlX3BvcnQodm9pZCk7Ci1pbnQJCSBnZXRfbG9jYWxfcG9ydCh2b2lkKTsKLWludAkJIGdldF9zb2NrX3BvcnQoaW50LCBpbnQpOwotdm9pZAkJIGNsZWFyX2NhY2hlZF9hZGRyKHZvaWQpOwotCi12b2lkCQkgaXB2NjRfbm9ybWFsaXNlX21hcHBlZChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqLCBzb2NrbGVuX3QgKik7CmRpZmYgLS1naXQgYS9jaGFubmVscy5jIGIvY2hhbm5lbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkNGE5Zi4uMDAwMDAwMAotLS0gYS9jaGFubmVscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY0MiArMCwwIEBACi0vKiAkT3BlbkJTRDogY2hhbm5lbHMuYyx2IDEuMzExIDIwMTEvMDYvMjIgMjI6MDg6NDIgZGptIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgZ2VuZXJpYyBzb2NrZXQgY29ubmVjdGlvbiBmb3J3YXJkaW5nLgotICogVGhlcmUgaXMgYWxzbyBjb2RlIGZvciBpbml0aWF0aW5nIGNvbm5lY3Rpb24gZm9yd2FyZGluZyBmb3IgWDExIGNvbm5lY3Rpb25zLAotICogYXJiaXRyYXJ5IHRjcC9pcCBjb25uZWN0aW9ucywgYW5kIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudCBjb25uZWN0aW9uLgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKgotICogU1NIMiBzdXBwb3J0IGFkZGVkIGJ5IE1hcmt1cyBGcmllZGwuCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgRHVnIFNvbmcuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZW8gZGUgUmFhZHQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy91bi5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpZmRlZiBIQVZFX1NZU19USU1FX0gKLSMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAic3NoLmgiCi0jaW5jbHVkZSAic3NoMS5oIgotI2luY2x1ZGUgInNzaDIuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAiY2hhbm5lbHMuaCIKLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJjYW5vaG9zdC5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImF1dGhmZC5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotCi0vKiAtLSBjaGFubmVsIGNvcmUgKi8KLQotLyoKLSAqIFBvaW50ZXIgdG8gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgYWxsb2NhdGVkIGNoYW5uZWxzLiAgVGhlIGFycmF5IGlzCi0gKiBkeW5hbWljYWxseSBleHRlbmRlZCBhcyBuZWVkZWQuCi0gKi8KLXN0YXRpYyBDaGFubmVsICoqY2hhbm5lbHMgPSBOVUxMOwotCi0vKgotICogU2l6ZSBvZiB0aGUgY2hhbm5lbCBhcnJheS4gIEFsbCBzbG90cyBvZiB0aGUgYXJyYXkgbXVzdCBhbHdheXMgYmUKLSAqIGluaXRpYWxpemVkIChhdCBsZWFzdCB0aGUgdHlwZSBmaWVsZCk7IHVudXNlZCBzbG90cyBzZXQgdG8gTlVMTAotICovCi1zdGF0aWMgdV9pbnQgY2hhbm5lbHNfYWxsb2MgPSAwOwotCi0vKgotICogTWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgdmFsdWUgdXNlZCBpbiBhbnkgb2YgdGhlIGNoYW5uZWxzLiAgVGhpcyBpcwotICogdXBkYXRlZCBpbiBjaGFubmVsX25ldy4KLSAqLwotc3RhdGljIGludCBjaGFubmVsX21heF9mZCA9IDA7Ci0KLQotLyogLS0gdGNwIGZvcndhcmRpbmcgKi8KLQotLyoKLSAqIERhdGEgc3RydWN0dXJlIGZvciBzdG9yaW5nIHdoaWNoIGhvc3RzIGFyZSBwZXJtaXR0ZWQgZm9yIGZvcndhcmQgcmVxdWVzdHMuCi0gKiBUaGUgbG9jYWwgc2lkZXMgb2YgYW55IHJlbW90ZSBmb3J3YXJkcyBhcmUgc3RvcmVkIGluIHRoaXMgYXJyYXkgdG8gcHJldmVudAotICogYSBjb3JydXB0IHJlbW90ZSBzZXJ2ZXIgZnJvbSBhY2Nlc3NpbmcgYXJiaXRyYXJ5IFRDUC9JUCBwb3J0cyBvbiBvdXIgbG9jYWwKLSAqIG5ldHdvcmsgKHdoaWNoIG1pZ2h0IGJlIGJlaGluZCBhIGZpcmV3YWxsKS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgKmhvc3RfdG9fY29ubmVjdDsJCS8qIENvbm5lY3QgdG8gJ2hvc3QnLiAqLwotCXVfc2hvcnQgcG9ydF90b19jb25uZWN0OwkvKiBDb25uZWN0IHRvICdwb3J0Jy4gKi8KLQl1X3Nob3J0IGxpc3Rlbl9wb3J0OwkJLyogUmVtb3RlIHNpZGUgc2hvdWxkIGxpc3RlbiBwb3J0IG51bWJlci4gKi8KLX0gRm9yd2FyZFBlcm1pc3Npb247Ci0KLS8qIExpc3Qgb2YgYWxsIHBlcm1pdHRlZCBob3N0L3BvcnQgcGFpcnMgdG8gY29ubmVjdCBieSB0aGUgdXNlci4gKi8KLXN0YXRpYyBGb3J3YXJkUGVybWlzc2lvbiAqcGVybWl0dGVkX29wZW5zID0gTlVMTDsKLQotLyogTGlzdCBvZiBhbGwgcGVybWl0dGVkIGhvc3QvcG9ydCBwYWlycyB0byBjb25uZWN0IGJ5IHRoZSBhZG1pbi4gKi8KLXN0YXRpYyBGb3J3YXJkUGVybWlzc2lvbiAqcGVybWl0dGVkX2FkbV9vcGVucyA9IE5VTEw7Ci0KLS8qIE51bWJlciBvZiBwZXJtaXR0ZWQgaG9zdC9wb3J0IHBhaXJzIGluIHRoZSBhcnJheSBwZXJtaXR0ZWQgYnkgdGhlIHVzZXIuICovCi1zdGF0aWMgaW50IG51bV9wZXJtaXR0ZWRfb3BlbnMgPSAwOwotCi0vKiBOdW1iZXIgb2YgcGVybWl0dGVkIGhvc3QvcG9ydCBwYWlyIGluIHRoZSBhcnJheSBwZXJtaXR0ZWQgYnkgdGhlIGFkbWluLiAqLwotc3RhdGljIGludCBudW1fYWRtX3Blcm1pdHRlZF9vcGVucyA9IDA7Ci0KLS8qCi0gKiBJZiB0aGlzIGlzIHRydWUsIGFsbCBvcGVucyBhcmUgcGVybWl0dGVkLiAgVGhpcyBpcyB0aGUgY2FzZSBvbiB0aGUgc2VydmVyCi0gKiBvbiB3aGljaCB3ZSBoYXZlIHRvIHRydXN0IHRoZSBjbGllbnQgYW55d2F5LCBhbmQgdGhlIHVzZXIgY291bGQgZG8KLSAqIGFueXRoaW5nIGFmdGVyIGxvZ2dpbmcgaW4gYW55d2F5LgotICovCi1zdGF0aWMgaW50IGFsbF9vcGVuc19wZXJtaXR0ZWQgPSAwOwotCi0KLS8qIC0tIFgxMSBmb3J3YXJkaW5nICovCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIGZha2UgWDExIGRpc3BsYXlzIHRvIHRyeS4gKi8KLSNkZWZpbmUgTUFYX0RJU1BMQVlTICAxMDAwCi0KLS8qIFNhdmVkIFgxMSBsb2NhbCAoY2xpZW50KSBkaXNwbGF5LiAqLwotc3RhdGljIGNoYXIgKngxMV9zYXZlZF9kaXNwbGF5ID0gTlVMTDsKLQotLyogU2F2ZWQgWDExIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIG5hbWUuICovCi1zdGF0aWMgY2hhciAqeDExX3NhdmVkX3Byb3RvID0gTlVMTDsKLQotLyogU2F2ZWQgWDExIGF1dGhlbnRpY2F0aW9uIGRhdGEuICBUaGlzIGlzIHRoZSByZWFsIGRhdGEuICovCi1zdGF0aWMgY2hhciAqeDExX3NhdmVkX2RhdGEgPSBOVUxMOwotc3RhdGljIHVfaW50IHgxMV9zYXZlZF9kYXRhX2xlbiA9IDA7Ci0KLS8qCi0gKiBGYWtlIFgxMSBhdXRoZW50aWNhdGlvbiBkYXRhLiAgVGhpcyBpcyB3aGF0IHRoZSBzZXJ2ZXIgd2lsbCBiZSBzZW5kaW5nIHVzOwotICogd2Ugc2hvdWxkIHJlcGxhY2UgYW55IG9jY3VycmVuY2VzIG9mIHRoaXMgYnkgdGhlIHJlYWwgZGF0YS4KLSAqLwotc3RhdGljIHVfY2hhciAqeDExX2Zha2VfZGF0YSA9IE5VTEw7Ci1zdGF0aWMgdV9pbnQgeDExX2Zha2VfZGF0YV9sZW47Ci0KLQotLyogLS0gYWdlbnQgZm9yd2FyZGluZyAqLwotCi0jZGVmaW5lCU5VTV9TT0NLUwkxMAotCi0vKiBBRl9VTlNQRUMgb3IgQUZfSU5FVCBvciBBRl9JTkVUNiAqLwotc3RhdGljIGludCBJUHY0b3I2ID0gQUZfVU5TUEVDOwotCi0vKiBoZWxwZXIgKi8KLXN0YXRpYyB2b2lkIHBvcnRfb3Blbl9oZWxwZXIoQ2hhbm5lbCAqYywgY2hhciAqcnR5cGUpOwotCi0vKiBub24tYmxvY2tpbmcgY29ubmVjdCBoZWxwZXJzICovCi1zdGF0aWMgaW50IGNvbm5lY3RfbmV4dChzdHJ1Y3QgY2hhbm5lbF9jb25uZWN0ICopOwotc3RhdGljIHZvaWQgY2hhbm5lbF9jb25uZWN0X2N0eF9mcmVlKHN0cnVjdCBjaGFubmVsX2Nvbm5lY3QgKik7Ci0KLS8qIC0tIGNoYW5uZWwgY29yZSAqLwotCi1DaGFubmVsICoKLWNoYW5uZWxfYnlfaWQoaW50IGlkKQotewotCUNoYW5uZWwgKmM7Ci0KLQlpZiAoaWQgPCAwIHx8ICh1X2ludClpZCA+PSBjaGFubmVsc19hbGxvYykgewotCQlsb2dpdCgiY2hhbm5lbF9ieV9pZDogJWQ6IGJhZCBpZCIsIGlkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWMgPSBjaGFubmVsc1tpZF07Ci0JaWYgKGMgPT0gTlVMTCkgewotCQlsb2dpdCgiY2hhbm5lbF9ieV9pZDogJWQ6IGJhZCBpZDogY2hhbm5lbCBmcmVlIiwgaWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGM7Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIHRoZSBjaGFubmVsIGlmIGl0IGlzIGFsbG93ZWQgdG8gcmVjZWl2ZSBwcm90b2NvbCBtZXNzYWdlcy4KLSAqIFByaXZhdGUgY2hhbm5lbHMsIGxpa2UgbGlzdGVuaW5nIHNvY2tldHMsIG1heSBub3QgcmVjZWl2ZSBtZXNzYWdlcy4KLSAqLwotQ2hhbm5lbCAqCi1jaGFubmVsX2xvb2t1cChpbnQgaWQpCi17Ci0JQ2hhbm5lbCAqYzsKLQotCWlmICgoYyA9IGNoYW5uZWxfYnlfaWQoaWQpKSA9PSBOVUxMKQotCQlyZXR1cm4gKE5VTEwpOwotCi0Jc3dpdGNoIChjLT50eXBlKSB7Ci0JY2FzZSBTU0hfQ0hBTk5FTF9YMTFfT1BFTjoKLQljYXNlIFNTSF9DSEFOTkVMX0xBUlZBTDoKLQljYXNlIFNTSF9DSEFOTkVMX0NPTk5FQ1RJTkc6Ci0JY2FzZSBTU0hfQ0hBTk5FTF9EWU5BTUlDOgotCWNhc2UgU1NIX0NIQU5ORUxfT1BFTklORzoKLQljYXNlIFNTSF9DSEFOTkVMX09QRU46Ci0JY2FzZSBTU0hfQ0hBTk5FTF9JTlBVVF9EUkFJTklORzoKLQljYXNlIFNTSF9DSEFOTkVMX09VVFBVVF9EUkFJTklORzoKLQkJcmV0dXJuIChjKTsKLQl9Ci0JbG9naXQoIk5vbi1wdWJsaWMgY2hhbm5lbCAlZCwgdHlwZSAlZC4iLCBpZCwgYy0+dHlwZSk7Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotLyoKLSAqIFJlZ2lzdGVyIGZpbGVkZXNjcmlwdG9ycyBmb3IgYSBjaGFubmVsLCB1c2VkIHdoZW4gYWxsb2NhdGluZyBhIGNoYW5uZWwgb3IKLSAqIHdoZW4gdGhlIGNoYW5uZWwgY29uc3VtZXIvcHJvZHVjZXIgaXMgcmVhZHksIGUuZy4gc2hlbGwgZXhlYydkCi0gKi8KLXN0YXRpYyB2b2lkCi1jaGFubmVsX3JlZ2lzdGVyX2ZkcyhDaGFubmVsICpjLCBpbnQgcmZkLCBpbnQgd2ZkLCBpbnQgZWZkLAotICAgIGludCBleHR1c2FnZSwgaW50IG5vbmJsb2NrLCBpbnQgaXNfdHR5KQotewotCS8qIFVwZGF0ZSB0aGUgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgdmFsdWUuICovCi0JY2hhbm5lbF9tYXhfZmQgPSBNQVgoY2hhbm5lbF9tYXhfZmQsIHJmZCk7Ci0JY2hhbm5lbF9tYXhfZmQgPSBNQVgoY2hhbm5lbF9tYXhfZmQsIHdmZCk7Ci0JY2hhbm5lbF9tYXhfZmQgPSBNQVgoY2hhbm5lbF9tYXhfZmQsIGVmZCk7Ci0KLQlpZiAocmZkICE9IC0xKQotCQlmY250bChyZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOwotCWlmICh3ZmQgIT0gLTEgJiYgd2ZkICE9IHJmZCkKLQkJZmNudGwod2ZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLQlpZiAoZWZkICE9IC0xICYmIGVmZCAhPSByZmQgJiYgZWZkICE9IHdmZCkKLQkJZmNudGwoZWZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLQotCWMtPnJmZCA9IHJmZDsKLQljLT53ZmQgPSB3ZmQ7Ci0JYy0+c29jayA9IChyZmQgPT0gd2ZkKSA/IHJmZCA6IC0xOwotCWMtPmVmZCA9IGVmZDsKLQljLT5leHRlbmRlZF91c2FnZSA9IGV4dHVzYWdlOwotCi0JaWYgKChjLT5pc2F0dHkgPSBpc190dHkpICE9IDApCi0JCWRlYnVnMigiY2hhbm5lbCAlZDogcmZkICVkIGlzYXR0eSIsIGMtPnNlbGYsIGMtPnJmZCk7Ci0JYy0+d2ZkX2lzYXR0eSA9IGlzX3R0eSB8fCBpc2F0dHkoYy0+d2ZkKTsKLQotCS8qIGVuYWJsZSBub25ibG9ja2luZyBtb2RlICovCi0JaWYgKG5vbmJsb2NrKSB7Ci0JCWlmIChyZmQgIT0gLTEpCi0JCQlzZXRfbm9uYmxvY2socmZkKTsKLQkJaWYgKHdmZCAhPSAtMSkKLQkJCXNldF9ub25ibG9jayh3ZmQpOwotCQlpZiAoZWZkICE9IC0xKQotCQkJc2V0X25vbmJsb2NrKGVmZCk7Ci0JfQotfQotCi0vKgotICogQWxsb2NhdGUgYSBuZXcgY2hhbm5lbCBvYmplY3QgYW5kIHNldCBpdHMgdHlwZSBhbmQgc29ja2V0LiBUaGlzIHdpbGwgY2F1c2UKLSAqIHJlbW90ZV9uYW1lIHRvIGJlIGZyZWVkLgotICovCi1DaGFubmVsICoKLWNoYW5uZWxfbmV3KGNoYXIgKmN0eXBlLCBpbnQgdHlwZSwgaW50IHJmZCwgaW50IHdmZCwgaW50IGVmZCwKLSAgICB1X2ludCB3aW5kb3csIHVfaW50IG1heHBhY2ssIGludCBleHR1c2FnZSwgY2hhciAqcmVtb3RlX25hbWUsIGludCBub25ibG9jaykKLXsKLQlpbnQgZm91bmQ7Ci0JdV9pbnQgaTsKLQlDaGFubmVsICpjOwotCi0JLyogRG8gaW5pdGlhbCBhbGxvY2F0aW9uIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwuICovCi0JaWYgKGNoYW5uZWxzX2FsbG9jID09IDApIHsKLQkJY2hhbm5lbHNfYWxsb2MgPSAxMDsKLQkJY2hhbm5lbHMgPSB4Y2FsbG9jKGNoYW5uZWxzX2FsbG9jLCBzaXplb2YoQ2hhbm5lbCAqKSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKQotCQkJY2hhbm5lbHNbaV0gPSBOVUxMOwotCX0KLQkvKiBUcnkgdG8gZmluZCBhIGZyZWUgc2xvdCB3aGVyZSB0byBwdXQgdGhlIG5ldyBjaGFubmVsLiAqLwotCWZvciAoZm91bmQgPSAtMSwgaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKQotCQlpZiAoY2hhbm5lbHNbaV0gPT0gTlVMTCkgewotCQkJLyogRm91bmQgYSBmcmVlIHNsb3QuICovCi0JCQlmb3VuZCA9IChpbnQpaTsKLQkJCWJyZWFrOwotCQl9Ci0JaWYgKGZvdW5kIDwgMCkgewotCQkvKiBUaGVyZSBhcmUgbm8gZnJlZSBzbG90cy4gIFRha2UgbGFzdCsxIHNsb3QgYW5kIGV4cGFuZCB0aGUgYXJyYXkuICAqLwotCQlmb3VuZCA9IGNoYW5uZWxzX2FsbG9jOwotCQlpZiAoY2hhbm5lbHNfYWxsb2MgPiAxMDAwMCkKLQkJCWZhdGFsKCJjaGFubmVsX25ldzogaW50ZXJuYWwgZXJyb3I6IGNoYW5uZWxzX2FsbG9jICVkICIKLQkJCSAgICAidG9vIGJpZy4iLCBjaGFubmVsc19hbGxvYyk7Ci0JCWNoYW5uZWxzID0geHJlYWxsb2MoY2hhbm5lbHMsIGNoYW5uZWxzX2FsbG9jICsgMTAsCi0JCSAgICBzaXplb2YoQ2hhbm5lbCAqKSk7Ci0JCWNoYW5uZWxzX2FsbG9jICs9IDEwOwotCQlkZWJ1ZzIoImNoYW5uZWw6IGV4cGFuZGluZyAlZCIsIGNoYW5uZWxzX2FsbG9jKTsKLQkJZm9yIChpID0gZm91bmQ7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKQotCQkJY2hhbm5lbHNbaV0gPSBOVUxMOwotCX0KLQkvKiBJbml0aWFsaXplIGFuZCByZXR1cm4gbmV3IGNoYW5uZWwuICovCi0JYyA9IGNoYW5uZWxzW2ZvdW5kXSA9IHhjYWxsb2MoMSwgc2l6ZW9mKENoYW5uZWwpKTsKLQlidWZmZXJfaW5pdCgmYy0+aW5wdXQpOwotCWJ1ZmZlcl9pbml0KCZjLT5vdXRwdXQpOwotCWJ1ZmZlcl9pbml0KCZjLT5leHRlbmRlZCk7Ci0JYy0+cGF0aCA9IE5VTEw7Ci0JYy0+b3N0YXRlID0gQ0hBTl9PVVRQVVRfT1BFTjsKLQljLT5pc3RhdGUgPSBDSEFOX0lOUFVUX09QRU47Ci0JYy0+ZmxhZ3MgPSAwOwotCWNoYW5uZWxfcmVnaXN0ZXJfZmRzKGMsIHJmZCwgd2ZkLCBlZmQsIGV4dHVzYWdlLCBub25ibG9jaywgMCk7Ci0JYy0+c2VsZiA9IGZvdW5kOwotCWMtPnR5cGUgPSB0eXBlOwotCWMtPmN0eXBlID0gY3R5cGU7Ci0JYy0+bG9jYWxfd2luZG93ID0gd2luZG93OwotCWMtPmxvY2FsX3dpbmRvd19tYXggPSB3aW5kb3c7Ci0JYy0+bG9jYWxfY29uc3VtZWQgPSAwOwotCWMtPmxvY2FsX21heHBhY2tldCA9IG1heHBhY2s7Ci0JYy0+cmVtb3RlX2lkID0gLTE7Ci0JYy0+cmVtb3RlX25hbWUgPSB4c3RyZHVwKHJlbW90ZV9uYW1lKTsKLQljLT5yZW1vdGVfd2luZG93ID0gMDsKLQljLT5yZW1vdGVfbWF4cGFja2V0ID0gMDsKLQljLT5mb3JjZV9kcmFpbiA9IDA7Ci0JYy0+c2luZ2xlX2Nvbm5lY3Rpb24gPSAwOwotCWMtPmRldGFjaF91c2VyID0gTlVMTDsKLQljLT5kZXRhY2hfY2xvc2UgPSAwOwotCWMtPm9wZW5fY29uZmlybSA9IE5VTEw7Ci0JYy0+b3Blbl9jb25maXJtX2N0eCA9IE5VTEw7Ci0JYy0+aW5wdXRfZmlsdGVyID0gTlVMTDsKLQljLT5vdXRwdXRfZmlsdGVyID0gTlVMTDsKLQljLT5maWx0ZXJfY3R4ID0gTlVMTDsKLQljLT5maWx0ZXJfY2xlYW51cCA9IE5VTEw7Ci0JYy0+Y3RsX2NoYW4gPSAtMTsKLQljLT5tdXhfcmNiID0gTlVMTDsKLQljLT5tdXhfY3R4ID0gTlVMTDsKLQljLT5tdXhfcGF1c2UgPSAwOwotCWMtPmRlbGF5ZWQgPSAxOwkJLyogcHJldmVudCBjYWxsIHRvIGNoYW5uZWxfcG9zdCBoYW5kbGVyICovCi0JVEFJTFFfSU5JVCgmYy0+c3RhdHVzX2NvbmZpcm1zKTsKLQlkZWJ1ZygiY2hhbm5lbCAlZDogbmV3IFslc10iLCBmb3VuZCwgcmVtb3RlX25hbWUpOwotCXJldHVybiBjOwotfQotCi1zdGF0aWMgaW50Ci1jaGFubmVsX2ZpbmRfbWF4ZmQodm9pZCkKLXsKLQl1X2ludCBpOwotCWludCBtYXggPSAwOwotCUNoYW5uZWwgKmM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHNfYWxsb2M7IGkrKykgewotCQljID0gY2hhbm5lbHNbaV07Ci0JCWlmIChjICE9IE5VTEwpIHsKLQkJCW1heCA9IE1BWChtYXgsIGMtPnJmZCk7Ci0JCQltYXggPSBNQVgobWF4LCBjLT53ZmQpOwotCQkJbWF4ID0gTUFYKG1heCwgYy0+ZWZkKTsKLQkJfQotCX0KLQlyZXR1cm4gbWF4OwotfQotCi1pbnQKLWNoYW5uZWxfY2xvc2VfZmQoaW50ICpmZHApCi17Ci0JaW50IHJldCA9IDAsIGZkID0gKmZkcDsKLQotCWlmIChmZCAhPSAtMSkgewotCQlyZXQgPSBjbG9zZShmZCk7Ci0JCSpmZHAgPSAtMTsKLQkJaWYgKGZkID09IGNoYW5uZWxfbWF4X2ZkKQotCQkJY2hhbm5lbF9tYXhfZmQgPSBjaGFubmVsX2ZpbmRfbWF4ZmQoKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogQ2xvc2UgYWxsIGNoYW5uZWwgZmQvc29ja2V0LiAqLwotc3RhdGljIHZvaWQKLWNoYW5uZWxfY2xvc2VfZmRzKENoYW5uZWwgKmMpCi17Ci0JY2hhbm5lbF9jbG9zZV9mZCgmYy0+c29jayk7Ci0JY2hhbm5lbF9jbG9zZV9mZCgmYy0+cmZkKTsKLQljaGFubmVsX2Nsb3NlX2ZkKCZjLT53ZmQpOwotCWNoYW5uZWxfY2xvc2VfZmQoJmMtPmVmZCk7Ci19Ci0KLS8qIEZyZWUgdGhlIGNoYW5uZWwgYW5kIGNsb3NlIGl0cyBmZC9zb2NrZXQuICovCi12b2lkCi1jaGFubmVsX2ZyZWUoQ2hhbm5lbCAqYykKLXsKLQljaGFyICpzOwotCXVfaW50IGksIG47Ci0Jc3RydWN0IGNoYW5uZWxfY29uZmlybSAqY2M7Ci0KLQlmb3IgKG4gPSAwLCBpID0gMDsgaSA8IGNoYW5uZWxzX2FsbG9jOyBpKyspCi0JCWlmIChjaGFubmVsc1tpXSkKLQkJCW4rKzsKLQlkZWJ1ZygiY2hhbm5lbCAlZDogZnJlZTogJXMsIG5jaGFubmVscyAldSIsIGMtPnNlbGYsCi0JICAgIGMtPnJlbW90ZV9uYW1lID8gYy0+cmVtb3RlX25hbWUgOiAiPz8/Iiwgbik7Ci0KLQlzID0gY2hhbm5lbF9vcGVuX21lc3NhZ2UoKTsKLQlkZWJ1ZzMoImNoYW5uZWwgJWQ6IHN0YXR1czogJXMiLCBjLT5zZWxmLCBzKTsKLQl4ZnJlZShzKTsKLQotCWlmIChjLT5zb2NrICE9IC0xKQotCQlzaHV0ZG93bihjLT5zb2NrLCBTSFVUX1JEV1IpOwotCWNoYW5uZWxfY2xvc2VfZmRzKGMpOwotCWJ1ZmZlcl9mcmVlKCZjLT5pbnB1dCk7Ci0JYnVmZmVyX2ZyZWUoJmMtPm91dHB1dCk7Ci0JYnVmZmVyX2ZyZWUoJmMtPmV4dGVuZGVkKTsKLQlpZiAoYy0+cmVtb3RlX25hbWUpIHsKLQkJeGZyZWUoYy0+cmVtb3RlX25hbWUpOwotCQljLT5yZW1vdGVfbmFtZSA9IE5VTEw7Ci0JfQotCWlmIChjLT5wYXRoKSB7Ci0JCXhmcmVlKGMtPnBhdGgpOwotCQljLT5wYXRoID0gTlVMTDsKLQl9Ci0Jd2hpbGUgKChjYyA9IFRBSUxRX0ZJUlNUKCZjLT5zdGF0dXNfY29uZmlybXMpKSAhPSBOVUxMKSB7Ci0JCWlmIChjYy0+YWJhbmRvbl9jYiAhPSBOVUxMKQotCQkJY2MtPmFiYW5kb25fY2IoYywgY2MtPmN0eCk7Ci0JCVRBSUxRX1JFTU9WRSgmYy0+c3RhdHVzX2NvbmZpcm1zLCBjYywgZW50cnkpOwotCQliemVybyhjYywgc2l6ZW9mKCpjYykpOwotCQl4ZnJlZShjYyk7Ci0JfQotCWlmIChjLT5maWx0ZXJfY2xlYW51cCAhPSBOVUxMICYmIGMtPmZpbHRlcl9jdHggIT0gTlVMTCkKLQkJYy0+ZmlsdGVyX2NsZWFudXAoYy0+c2VsZiwgYy0+ZmlsdGVyX2N0eCk7Ci0JY2hhbm5lbHNbYy0+c2VsZl0gPSBOVUxMOwotCXhmcmVlKGMpOwotfQotCi12b2lkCi1jaGFubmVsX2ZyZWVfYWxsKHZvaWQpCi17Ci0JdV9pbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKQotCQlpZiAoY2hhbm5lbHNbaV0gIT0gTlVMTCkKLQkJCWNoYW5uZWxfZnJlZShjaGFubmVsc1tpXSk7Ci19Ci0KLS8qCi0gKiBDbG9zZXMgdGhlIHNvY2tldHMvZmRzIG9mIGFsbCBjaGFubmVscy4gIFRoaXMgaXMgdXNlZCB0byBjbG9zZSBleHRyYSBmaWxlCi0gKiBkZXNjcmlwdG9ycyBhZnRlciBhIGZvcmsuCi0gKi8KLXZvaWQKLWNoYW5uZWxfY2xvc2VfYWxsKHZvaWQpCi17Ci0JdV9pbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKQotCQlpZiAoY2hhbm5lbHNbaV0gIT0gTlVMTCkKLQkJCWNoYW5uZWxfY2xvc2VfZmRzKGNoYW5uZWxzW2ldKTsKLX0KLQotLyoKLSAqIFN0b3AgbGlzdGVuaW5nIHRvIGNoYW5uZWxzLgotICovCi12b2lkCi1jaGFubmVsX3N0b3BfbGlzdGVuaW5nKHZvaWQpCi17Ci0JdV9pbnQgaTsKLQlDaGFubmVsICpjOwotCi0JZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzX2FsbG9jOyBpKyspIHsKLQkJYyA9IGNoYW5uZWxzW2ldOwotCQlpZiAoYyAhPSBOVUxMKSB7Ci0JCQlzd2l0Y2ggKGMtPnR5cGUpIHsKLQkJCWNhc2UgU1NIX0NIQU5ORUxfQVVUSF9TT0NLRVQ6Ci0JCQljYXNlIFNTSF9DSEFOTkVMX1BPUlRfTElTVEVORVI6Ci0JCQljYXNlIFNTSF9DSEFOTkVMX1JQT1JUX0xJU1RFTkVSOgotCQkJY2FzZSBTU0hfQ0hBTk5FTF9YMTFfTElTVEVORVI6Ci0JCQkJY2hhbm5lbF9jbG9zZV9mZCgmYy0+c29jayk7Ci0JCQkJY2hhbm5lbF9mcmVlKGMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKgotICogUmV0dXJucyB0cnVlIGlmIG5vIGNoYW5uZWwgaGFzIHRvbyBtdWNoIGJ1ZmZlcmVkIGRhdGEsIGFuZCBmYWxzZSBpZiBvbmUgb3IKLSAqIG1vcmUgY2hhbm5lbCBpcyBvdmVyZnVsbC4KLSAqLwotaW50Ci1jaGFubmVsX25vdF92ZXJ5X211Y2hfYnVmZmVyZWRfZGF0YSh2b2lkKQotewotCXVfaW50IGk7Ci0JQ2hhbm5lbCAqYzsKLQotCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKSB7Ci0JCWMgPSBjaGFubmVsc1tpXTsKLQkJaWYgKGMgIT0gTlVMTCAmJiBjLT50eXBlID09IFNTSF9DSEFOTkVMX09QRU4pIHsKLSNpZiAwCi0JCQlpZiAoIWNvbXBhdDIwICYmCi0JCQkgICAgYnVmZmVyX2xlbigmYy0+aW5wdXQpID4gcGFja2V0X2dldF9tYXhzaXplKCkpIHsKLQkJCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGJpZyBpbnB1dCBidWZmZXIgJWQiLAotCQkJCSAgICBjLT5zZWxmLCBidWZmZXJfbGVuKCZjLT5pbnB1dCkpOwotCQkJCXJldHVybiAwOwotCQkJfQotI2VuZGlmCi0JCQlpZiAoYnVmZmVyX2xlbigmYy0+b3V0cHV0KSA+IHBhY2tldF9nZXRfbWF4c2l6ZSgpKSB7Ci0JCQkJZGVidWcyKCJjaGFubmVsICVkOiBiaWcgb3V0cHV0IGJ1ZmZlciAldSA+ICV1IiwKLQkJCQkgICAgYy0+c2VsZiwgYnVmZmVyX2xlbigmYy0+b3V0cHV0KSwKLQkJCQkgICAgcGFja2V0X2dldF9tYXhzaXplKCkpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAxOwotfQotCi0vKiBSZXR1cm5zIHRydWUgaWYgYW55IGNoYW5uZWwgaXMgc3RpbGwgb3Blbi4gKi8KLWludAotY2hhbm5lbF9zdGlsbF9vcGVuKHZvaWQpCi17Ci0JdV9pbnQgaTsKLQlDaGFubmVsICpjOwotCi0JZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzX2FsbG9jOyBpKyspIHsKLQkJYyA9IGNoYW5uZWxzW2ldOwotCQlpZiAoYyA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCXN3aXRjaCAoYy0+dHlwZSkgewotCQljYXNlIFNTSF9DSEFOTkVMX1gxMV9MSVNURU5FUjoKLQkJY2FzZSBTU0hfQ0hBTk5FTF9QT1JUX0xJU1RFTkVSOgotCQljYXNlIFNTSF9DSEFOTkVMX1JQT1JUX0xJU1RFTkVSOgotCQljYXNlIFNTSF9DSEFOTkVMX01VWF9MSVNURU5FUjoKLQkJY2FzZSBTU0hfQ0hBTk5FTF9DTE9TRUQ6Ci0JCWNhc2UgU1NIX0NIQU5ORUxfQVVUSF9TT0NLRVQ6Ci0JCWNhc2UgU1NIX0NIQU5ORUxfRFlOQU1JQzoKLQkJY2FzZSBTU0hfQ0hBTk5FTF9DT05ORUNUSU5HOgotCQljYXNlIFNTSF9DSEFOTkVMX1pPTUJJRToKLQkJCWNvbnRpbnVlOwotCQljYXNlIFNTSF9DSEFOTkVMX0xBUlZBTDoKLQkJCWlmICghY29tcGF0MjApCi0JCQkJZmF0YWwoImNhbm5vdCBoYXBwZW46IFNTSF9DSEFOTkVMX0xBUlZBTCIpOwotCQkJY29udGludWU7Ci0JCWNhc2UgU1NIX0NIQU5ORUxfT1BFTklORzoKLQkJY2FzZSBTU0hfQ0hBTk5FTF9PUEVOOgotCQljYXNlIFNTSF9DSEFOTkVMX1gxMV9PUEVOOgotCQljYXNlIFNTSF9DSEFOTkVMX01VWF9DTElFTlQ6Ci0JCQlyZXR1cm4gMTsKLQkJY2FzZSBTU0hfQ0hBTk5FTF9JTlBVVF9EUkFJTklORzoKLQkJY2FzZSBTU0hfQ0hBTk5FTF9PVVRQVVRfRFJBSU5JTkc6Ci0JCQlpZiAoIWNvbXBhdDEzKQotCQkJCWZhdGFsKCJjYW5ub3QgaGFwcGVuOiBPVVRfRFJBSU4iKTsKLQkJCXJldHVybiAxOwotCQlkZWZhdWx0OgotCQkJZmF0YWwoImNoYW5uZWxfc3RpbGxfb3BlbjogYmFkIGNoYW5uZWwgdHlwZSAlZCIsIGMtPnR5cGUpOwotCQkJLyogTk9UUkVBQ0hFRCAqLwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiBSZXR1cm5zIHRoZSBpZCBvZiBhbiBvcGVuIGNoYW5uZWwgc3VpdGFibGUgZm9yIGtlZXBhbGl2aW5nICovCi1pbnQKLWNoYW5uZWxfZmluZF9vcGVuKHZvaWQpCi17Ci0JdV9pbnQgaTsKLQlDaGFubmVsICpjOwotCi0JZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzX2FsbG9jOyBpKyspIHsKLQkJYyA9IGNoYW5uZWxzW2ldOwotCQlpZiAoYyA9PSBOVUxMIHx8IGMtPnJlbW90ZV9pZCA8IDApCi0JCQljb250aW51ZTsKLQkJc3dpdGNoIChjLT50eXBlKSB7Ci0JCWNhc2UgU1NIX0NIQU5ORUxfQ0xPU0VEOgotCQljYXNlIFNTSF9DSEFOTkVMX0RZTkFNSUM6Ci0JCWNhc2UgU1NIX0NIQU5ORUxfWDExX0xJU1RFTkVSOgotCQljYXNlIFNTSF9DSEFOTkVMX1BPUlRfTElTVEVORVI6Ci0JCWNhc2UgU1NIX0NIQU5ORUxfUlBPUlRfTElTVEVORVI6Ci0JCWNhc2UgU1NIX0NIQU5ORUxfTVVYX0xJU1RFTkVSOgotCQljYXNlIFNTSF9DSEFOTkVMX01VWF9DTElFTlQ6Ci0JCWNhc2UgU1NIX0NIQU5ORUxfT1BFTklORzoKLQkJY2FzZSBTU0hfQ0hBTk5FTF9DT05ORUNUSU5HOgotCQljYXNlIFNTSF9DSEFOTkVMX1pPTUJJRToKLQkJCWNvbnRpbnVlOwotCQljYXNlIFNTSF9DSEFOTkVMX0xBUlZBTDoKLQkJY2FzZSBTU0hfQ0hBTk5FTF9BVVRIX1NPQ0tFVDoKLQkJY2FzZSBTU0hfQ0hBTk5FTF9PUEVOOgotCQljYXNlIFNTSF9DSEFOTkVMX1gxMV9PUEVOOgotCQkJcmV0dXJuIGk7Ci0JCWNhc2UgU1NIX0NIQU5ORUxfSU5QVVRfRFJBSU5JTkc6Ci0JCWNhc2UgU1NIX0NIQU5ORUxfT1VUUFVUX0RSQUlOSU5HOgotCQkJaWYgKCFjb21wYXQxMykKLQkJCQlmYXRhbCgiY2Fubm90IGhhcHBlbjogT1VUX0RSQUlOIik7Ci0JCQlyZXR1cm4gaTsKLQkJZGVmYXVsdDoKLQkJCWZhdGFsKCJjaGFubmVsX2ZpbmRfb3BlbjogYmFkIGNoYW5uZWwgdHlwZSAlZCIsIGMtPnR5cGUpOwotCQkJLyogTk9UUkVBQ0hFRCAqLwotCQl9Ci0JfQotCXJldHVybiAtMTsKLX0KLQotCi0vKgotICogUmV0dXJucyBhIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgY3VycmVudGx5IG9wZW4gZm9yd2FyZGVkIGNvbm5lY3Rpb25zLAotICogc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gdGhlIGNsaWVudC4gIFRoZSBtZXNzYWdlIGNvbnRhaW5zIGNybGYgcGFpcnMgZm9yCi0gKiBuZXdsaW5lcy4KLSAqLwotY2hhciAqCi1jaGFubmVsX29wZW5fbWVzc2FnZSh2b2lkKQotewotCUJ1ZmZlciBidWZmZXI7Ci0JQ2hhbm5lbCAqYzsKLQljaGFyIGJ1ZlsxMDI0XSwgKmNwOwotCXVfaW50IGk7Ci0KLQlidWZmZXJfaW5pdCgmYnVmZmVyKTsKLQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJUaGUgZm9sbG93aW5nIGNvbm5lY3Rpb25zIGFyZSBvcGVuOlxyXG4iKTsKLQlidWZmZXJfYXBwZW5kKCZidWZmZXIsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKSB7Ci0JCWMgPSBjaGFubmVsc1tpXTsKLQkJaWYgKGMgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlzd2l0Y2ggKGMtPnR5cGUpIHsKLQkJY2FzZSBTU0hfQ0hBTk5FTF9YMTFfTElTVEVORVI6Ci0JCWNhc2UgU1NIX0NIQU5ORUxfUE9SVF9MSVNURU5FUjoKLQkJY2FzZSBTU0hfQ0hBTk5FTF9SUE9SVF9MSVNURU5FUjoKLQkJY2FzZSBTU0hfQ0hBTk5FTF9DTE9TRUQ6Ci0JCWNhc2UgU1NIX0NIQU5ORUxfQVVUSF9TT0NLRVQ6Ci0JCWNhc2UgU1NIX0NIQU5ORUxfWk9NQklFOgotCQljYXNlIFNTSF9DSEFOTkVMX01VWF9DTElFTlQ6Ci0JCWNhc2UgU1NIX0NIQU5ORUxfTVVYX0xJU1RFTkVSOgotCQkJY29udGludWU7Ci0JCWNhc2UgU1NIX0NIQU5ORUxfTEFSVkFMOgotCQljYXNlIFNTSF9DSEFOTkVMX09QRU5JTkc6Ci0JCWNhc2UgU1NIX0NIQU5ORUxfQ09OTkVDVElORzoKLQkJY2FzZSBTU0hfQ0hBTk5FTF9EWU5BTUlDOgotCQljYXNlIFNTSF9DSEFOTkVMX09QRU46Ci0JCWNhc2UgU1NIX0NIQU5ORUxfWDExX09QRU46Ci0JCWNhc2UgU1NIX0NIQU5ORUxfSU5QVVRfRFJBSU5JTkc6Ci0JCWNhc2UgU1NIX0NIQU5ORUxfT1VUUFVUX0RSQUlOSU5HOgotCQkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLAotCQkJICAgICIgICMlZCAlLjMwMHMgKHQlZCByJWQgaSVkLyVkIG8lZC8lZCBmZCAlZC8lZCBjYyAlZClcclxuIiwKLQkJCSAgICBjLT5zZWxmLCBjLT5yZW1vdGVfbmFtZSwKLQkJCSAgICBjLT50eXBlLCBjLT5yZW1vdGVfaWQsCi0JCQkgICAgYy0+aXN0YXRlLCBidWZmZXJfbGVuKCZjLT5pbnB1dCksCi0JCQkgICAgYy0+b3N0YXRlLCBidWZmZXJfbGVuKCZjLT5vdXRwdXQpLAotCQkJICAgIGMtPnJmZCwgYy0+d2ZkLCBjLT5jdGxfY2hhbik7Ci0JCQlidWZmZXJfYXBwZW5kKCZidWZmZXIsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotCQkJY29udGludWU7Ci0JCWRlZmF1bHQ6Ci0JCQlmYXRhbCgiY2hhbm5lbF9vcGVuX21lc3NhZ2U6IGJhZCBjaGFubmVsIHR5cGUgJWQiLCBjLT50eXBlKTsKLQkJCS8qIE5PVFJFQUNIRUQgKi8KLQkJfQotCX0KLQlidWZmZXJfYXBwZW5kKCZidWZmZXIsICJcMCIsIDEpOwotCWNwID0geHN0cmR1cChidWZmZXJfcHRyKCZidWZmZXIpKTsKLQlidWZmZXJfZnJlZSgmYnVmZmVyKTsKLQlyZXR1cm4gY3A7Ci19Ci0KLXZvaWQKLWNoYW5uZWxfc2VuZF9vcGVuKGludCBpZCkKLXsKLQlDaGFubmVsICpjID0gY2hhbm5lbF9sb29rdXAoaWQpOwotCi0JaWYgKGMgPT0gTlVMTCkgewotCQlsb2dpdCgiY2hhbm5lbF9zZW5kX29wZW46ICVkOiBiYWQgaWQiLCBpZCk7Ci0JCXJldHVybjsKLQl9Ci0JZGVidWcyKCJjaGFubmVsICVkOiBzZW5kIG9wZW4iLCBpZCk7Ci0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0NIQU5ORUxfT1BFTik7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKGMtPmN0eXBlKTsKLQlwYWNrZXRfcHV0X2ludChjLT5zZWxmKTsKLQlwYWNrZXRfcHV0X2ludChjLT5sb2NhbF93aW5kb3cpOwotCXBhY2tldF9wdXRfaW50KGMtPmxvY2FsX21heHBhY2tldCk7Ci0JcGFja2V0X3NlbmQoKTsKLX0KLQotdm9pZAotY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0KGludCBpZCwgY2hhciAqc2VydmljZSwgaW50IHdhbnRjb25maXJtKQotewotCUNoYW5uZWwgKmMgPSBjaGFubmVsX2xvb2t1cChpZCk7Ci0KLQlpZiAoYyA9PSBOVUxMKSB7Ci0JCWxvZ2l0KCJjaGFubmVsX3JlcXVlc3Rfc3RhcnQ6ICVkOiB1bmtub3duIGNoYW5uZWwgaWQiLCBpZCk7Ci0JCXJldHVybjsKLQl9Ci0JZGVidWcyKCJjaGFubmVsICVkOiByZXF1ZXN0ICVzIGNvbmZpcm0gJWQiLCBpZCwgc2VydmljZSwgd2FudGNvbmZpcm0pOwotCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX1JFUVVFU1QpOwotCXBhY2tldF9wdXRfaW50KGMtPnJlbW90ZV9pZCk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKHNlcnZpY2UpOwotCXBhY2tldF9wdXRfY2hhcih3YW50Y29uZmlybSk7Ci19Ci0KLXZvaWQKLWNoYW5uZWxfcmVnaXN0ZXJfc3RhdHVzX2NvbmZpcm0oaW50IGlkLCBjaGFubmVsX2NvbmZpcm1fY2IgKmNiLAotICAgIGNoYW5uZWxfY29uZmlybV9hYmFuZG9uX2NiICphYmFuZG9uX2NiLCB2b2lkICpjdHgpCi17Ci0Jc3RydWN0IGNoYW5uZWxfY29uZmlybSAqY2M7Ci0JQ2hhbm5lbCAqYzsKLQotCWlmICgoYyA9IGNoYW5uZWxfbG9va3VwKGlkKSkgPT0gTlVMTCkKLQkJZmF0YWwoImNoYW5uZWxfcmVnaXN0ZXJfZXhwZWN0OiAlZDogYmFkIGlkIiwgaWQpOwotCi0JY2MgPSB4bWFsbG9jKHNpemVvZigqY2MpKTsKLQljYy0+Y2IgPSBjYjsKLQljYy0+YWJhbmRvbl9jYiA9IGFiYW5kb25fY2I7Ci0JY2MtPmN0eCA9IGN0eDsKLQlUQUlMUV9JTlNFUlRfVEFJTCgmYy0+c3RhdHVzX2NvbmZpcm1zLCBjYywgZW50cnkpOwotfQotCi12b2lkCi1jaGFubmVsX3JlZ2lzdGVyX29wZW5fY29uZmlybShpbnQgaWQsIGNoYW5uZWxfb3Blbl9mbiAqZm4sIHZvaWQgKmN0eCkKLXsKLQlDaGFubmVsICpjID0gY2hhbm5lbF9sb29rdXAoaWQpOwotCi0JaWYgKGMgPT0gTlVMTCkgewotCQlsb2dpdCgiY2hhbm5lbF9yZWdpc3Rlcl9vcGVuX2NvbmZpcm06ICVkOiBiYWQgaWQiLCBpZCk7Ci0JCXJldHVybjsKLQl9Ci0JYy0+b3Blbl9jb25maXJtID0gZm47Ci0JYy0+b3Blbl9jb25maXJtX2N0eCA9IGN0eDsKLX0KLQotdm9pZAotY2hhbm5lbF9yZWdpc3Rlcl9jbGVhbnVwKGludCBpZCwgY2hhbm5lbF9jYWxsYmFja19mbiAqZm4sIGludCBkb19jbG9zZSkKLXsKLQlDaGFubmVsICpjID0gY2hhbm5lbF9ieV9pZChpZCk7Ci0KLQlpZiAoYyA9PSBOVUxMKSB7Ci0JCWxvZ2l0KCJjaGFubmVsX3JlZ2lzdGVyX2NsZWFudXA6ICVkOiBiYWQgaWQiLCBpZCk7Ci0JCXJldHVybjsKLQl9Ci0JYy0+ZGV0YWNoX3VzZXIgPSBmbjsKLQljLT5kZXRhY2hfY2xvc2UgPSBkb19jbG9zZTsKLX0KLQotdm9pZAotY2hhbm5lbF9jYW5jZWxfY2xlYW51cChpbnQgaWQpCi17Ci0JQ2hhbm5lbCAqYyA9IGNoYW5uZWxfYnlfaWQoaWQpOwotCi0JaWYgKGMgPT0gTlVMTCkgewotCQlsb2dpdCgiY2hhbm5lbF9jYW5jZWxfY2xlYW51cDogJWQ6IGJhZCBpZCIsIGlkKTsKLQkJcmV0dXJuOwotCX0KLQljLT5kZXRhY2hfdXNlciA9IE5VTEw7Ci0JYy0+ZGV0YWNoX2Nsb3NlID0gMDsKLX0KLQotdm9pZAotY2hhbm5lbF9yZWdpc3Rlcl9maWx0ZXIoaW50IGlkLCBjaGFubmVsX2luZmlsdGVyX2ZuICppZm4sCi0gICAgY2hhbm5lbF9vdXRmaWx0ZXJfZm4gKm9mbiwgY2hhbm5lbF9maWx0ZXJfY2xlYW51cF9mbiAqY2ZuLCB2b2lkICpjdHgpCi17Ci0JQ2hhbm5lbCAqYyA9IGNoYW5uZWxfbG9va3VwKGlkKTsKLQotCWlmIChjID09IE5VTEwpIHsKLQkJbG9naXQoImNoYW5uZWxfcmVnaXN0ZXJfZmlsdGVyOiAlZDogYmFkIGlkIiwgaWQpOwotCQlyZXR1cm47Ci0JfQotCWMtPmlucHV0X2ZpbHRlciA9IGlmbjsKLQljLT5vdXRwdXRfZmlsdGVyID0gb2ZuOwotCWMtPmZpbHRlcl9jdHggPSBjdHg7Ci0JYy0+ZmlsdGVyX2NsZWFudXAgPSBjZm47Ci19Ci0KLXZvaWQKLWNoYW5uZWxfc2V0X2ZkcyhpbnQgaWQsIGludCByZmQsIGludCB3ZmQsIGludCBlZmQsCi0gICAgaW50IGV4dHVzYWdlLCBpbnQgbm9uYmxvY2ssIGludCBpc190dHksIHVfaW50IHdpbmRvd19tYXgpCi17Ci0JQ2hhbm5lbCAqYyA9IGNoYW5uZWxfbG9va3VwKGlkKTsKLQotCWlmIChjID09IE5VTEwgfHwgYy0+dHlwZSAhPSBTU0hfQ0hBTk5FTF9MQVJWQUwpCi0JCWZhdGFsKCJjaGFubmVsX2FjdGl2YXRlIGZvciBub24tbGFydmFsIGNoYW5uZWwgJWQuIiwgaWQpOwotCWNoYW5uZWxfcmVnaXN0ZXJfZmRzKGMsIHJmZCwgd2ZkLCBlZmQsIGV4dHVzYWdlLCBub25ibG9jaywgaXNfdHR5KTsKLQljLT50eXBlID0gU1NIX0NIQU5ORUxfT1BFTjsKLQljLT5sb2NhbF93aW5kb3cgPSBjLT5sb2NhbF93aW5kb3dfbWF4ID0gd2luZG93X21heDsKLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfQ0hBTk5FTF9XSU5ET1dfQURKVVNUKTsKLQlwYWNrZXRfcHV0X2ludChjLT5yZW1vdGVfaWQpOwotCXBhY2tldF9wdXRfaW50KGMtPmxvY2FsX3dpbmRvdyk7Ci0JcGFja2V0X3NlbmQoKTsKLX0KLQotLyoKLSAqICdjaGFubmVsX3ByZSonIGFyZSBjYWxsZWQganVzdCBiZWZvcmUgc2VsZWN0KCkgdG8gYWRkIGFueSBiaXRzIHJlbGV2YW50IHRvCi0gKiBjaGFubmVscyBpbiB0aGUgc2VsZWN0IGJpdG1hc2tzLgotICovCi0vKgotICogJ2NoYW5uZWxfcG9zdConOiBwZXJmb3JtIGFueSBhcHByb3ByaWF0ZSBvcGVyYXRpb25zIGZvciBjaGFubmVscyB3aGljaAotICogaGF2ZSBldmVudHMgcGVuZGluZy4KLSAqLwotdHlwZWRlZiB2b2lkIGNoYW5fZm4oQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KTsKLWNoYW5fZm4gKmNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX01BWF9UWVBFXTsKLWNoYW5fZm4gKmNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9NQVhfVFlQRV07Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotY2hhbm5lbF9wcmVfbGlzdGVuZXIoQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQotewotCUZEX1NFVChjLT5zb2NrLCByZWFkc2V0KTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1jaGFubmVsX3ByZV9jb25uZWN0aW5nKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKLXsKLQlkZWJ1ZzMoImNoYW5uZWwgJWQ6IHdhaXRpbmcgZm9yIGNvbm5lY3Rpb24iLCBjLT5zZWxmKTsKLQlGRF9TRVQoYy0+c29jaywgd3JpdGVzZXQpOwotfQotCi1zdGF0aWMgdm9pZAotY2hhbm5lbF9wcmVfb3Blbl8xMyhDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCi17Ci0JaWYgKGJ1ZmZlcl9sZW4oJmMtPmlucHV0KSA8IHBhY2tldF9nZXRfbWF4c2l6ZSgpKQotCQlGRF9TRVQoYy0+c29jaywgcmVhZHNldCk7Ci0JaWYgKGJ1ZmZlcl9sZW4oJmMtPm91dHB1dCkgPiAwKQotCQlGRF9TRVQoYy0+c29jaywgd3JpdGVzZXQpOwotfQotCi1zdGF0aWMgdm9pZAotY2hhbm5lbF9wcmVfb3BlbihDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCi17Ci0JdV9pbnQgbGltaXQgPSBjb21wYXQyMCA/IGMtPnJlbW90ZV93aW5kb3cgOiBwYWNrZXRfZ2V0X21heHNpemUoKTsKLQotCWlmIChjLT5pc3RhdGUgPT0gQ0hBTl9JTlBVVF9PUEVOICYmCi0JICAgIGxpbWl0ID4gMCAmJgotCSAgICBidWZmZXJfbGVuKCZjLT5pbnB1dCkgPCBsaW1pdCAmJgotCSAgICBidWZmZXJfY2hlY2tfYWxsb2MoJmMtPmlucHV0LCBDSEFOX1JCVUYpKQotCQlGRF9TRVQoYy0+cmZkLCByZWFkc2V0KTsKLQlpZiAoYy0+b3N0YXRlID09IENIQU5fT1VUUFVUX09QRU4gfHwKLQkgICAgYy0+b3N0YXRlID09IENIQU5fT1VUUFVUX1dBSVRfRFJBSU4pIHsKLQkJaWYgKGJ1ZmZlcl9sZW4oJmMtPm91dHB1dCkgPiAwKSB7Ci0JCQlGRF9TRVQoYy0+d2ZkLCB3cml0ZXNldCk7Ci0JCX0gZWxzZSBpZiAoYy0+b3N0YXRlID09IENIQU5fT1VUUFVUX1dBSVRfRFJBSU4pIHsKLQkJCWlmIChDSEFOTkVMX0VGRF9PVVRQVVRfQUNUSVZFKGMpKQotCQkJCWRlYnVnMigiY2hhbm5lbCAlZDogb2J1Zl9lbXB0eSBkZWxheWVkIGVmZCAlZC8oJWQpIiwKLQkJCQkgICAgYy0+c2VsZiwgYy0+ZWZkLCBidWZmZXJfbGVuKCZjLT5leHRlbmRlZCkpOwotCQkJZWxzZQotCQkJCWNoYW5fb2J1Zl9lbXB0eShjKTsKLQkJfQotCX0KLQkvKiogWFhYIGNoZWNrIGNsb3NlIGNvbmRpdGlvbnMsIHRvbyAqLwotCWlmIChjb21wYXQyMCAmJiBjLT5lZmQgIT0gLTEgJiYgCi0JICAgICEoYy0+aXN0YXRlID09IENIQU5fSU5QVVRfQ0xPU0VEICYmIGMtPm9zdGF0ZSA9PSBDSEFOX09VVFBVVF9DTE9TRUQpKSB7Ci0JCWlmIChjLT5leHRlbmRlZF91c2FnZSA9PSBDSEFOX0VYVEVOREVEX1dSSVRFICYmCi0JCSAgICBidWZmZXJfbGVuKCZjLT5leHRlbmRlZCkgPiAwKQotCQkJRkRfU0VUKGMtPmVmZCwgd3JpdGVzZXQpOwotCQllbHNlIGlmIChjLT5lZmQgIT0gLTEgJiYgIShjLT5mbGFncyAmIENIQU5fRU9GX1NFTlQpICYmCi0JCSAgICAoYy0+ZXh0ZW5kZWRfdXNhZ2UgPT0gQ0hBTl9FWFRFTkRFRF9SRUFEIHx8Ci0JCSAgICBjLT5leHRlbmRlZF91c2FnZSA9PSBDSEFOX0VYVEVOREVEX0lHTk9SRSkgJiYKLQkJICAgIGJ1ZmZlcl9sZW4oJmMtPmV4dGVuZGVkKSA8IGMtPnJlbW90ZV93aW5kb3cpCi0JCQlGRF9TRVQoYy0+ZWZkLCByZWFkc2V0KTsKLQl9Ci0JLyogWFhYOiBXaGF0IGFib3V0IGVmZD8gcmFjZXM/ICovCi19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotY2hhbm5lbF9wcmVfaW5wdXRfZHJhaW5pbmcoQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQotewotCWlmIChidWZmZXJfbGVuKCZjLT5pbnB1dCkgPT0gMCkgewotCQlwYWNrZXRfc3RhcnQoU1NIX01TR19DSEFOTkVMX0NMT1NFKTsKLQkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKLQkJcGFja2V0X3NlbmQoKTsKLQkJYy0+dHlwZSA9IFNTSF9DSEFOTkVMX0NMT1NFRDsKLQkJZGVidWcyKCJjaGFubmVsICVkOiBjbG9zaW5nIGFmdGVyIGlucHV0IGRyYWluLiIsIGMtPnNlbGYpOwotCX0KLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1jaGFubmVsX3ByZV9vdXRwdXRfZHJhaW5pbmcoQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQotewotCWlmIChidWZmZXJfbGVuKCZjLT5vdXRwdXQpID09IDApCi0JCWNoYW5fbWFya19kZWFkKGMpOwotCWVsc2UKLQkJRkRfU0VUKGMtPnNvY2ssIHdyaXRlc2V0KTsKLX0KLQotLyoKLSAqIFRoaXMgaXMgYSBzcGVjaWFsIHN0YXRlIGZvciBYMTEgYXV0aGVudGljYXRpb24gc3Bvb2ZpbmcuICBBbiBvcGVuZWQgWDExCi0gKiBjb25uZWN0aW9uICh3aGVuIGF1dGhlbnRpY2F0aW9uIHNwb29maW5nIGlzIGJlaW5nIGRvbmUpIHJlbWFpbnMgaW4gdGhpcwotICogc3RhdGUgdW50aWwgdGhlIGZpcnN0IHBhY2tldCBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlYWQuICBUaGUgYXV0aGVudGljYXRpb24KLSAqIGRhdGEgaW4gdGhhdCBwYWNrZXQgaXMgdGhlbiBzdWJzdGl0dXRlZCBieSB0aGUgcmVhbCBkYXRhIGlmIGl0IG1hdGNoZXMgdGhlCi0gKiBmYWtlIGRhdGEsIGFuZCB0aGUgY2hhbm5lbCBpcyBwdXQgaW50byBub3JtYWwgbW9kZS4KLSAqIFhYWCBBbGwgdGhpcyBoYXBwZW5zIGF0IHRoZSBjbGllbnQgc2lkZS4KLSAqIFJldHVybnM6IDAgPSBuZWVkIG1vcmUgZGF0YSwgLTEgPSB3cm9uZyBjb29raWUsIDEgPSBvawotICovCi1zdGF0aWMgaW50Ci14MTFfb3Blbl9oZWxwZXIoQnVmZmVyICpiKQotewotCXVfY2hhciAqdWNwOwotCXVfaW50IHByb3RvX2xlbiwgZGF0YV9sZW47Ci0KLQkvKiBDaGVjayBpZiB0aGUgZml4ZWQgc2l6ZSBwYXJ0IG9mIHRoZSBwYWNrZXQgaXMgaW4gYnVmZmVyLiAqLwotCWlmIChidWZmZXJfbGVuKGIpIDwgMTIpCi0JCXJldHVybiAwOwotCi0JLyogUGFyc2UgdGhlIGxlbmd0aHMgb2YgdmFyaWFibGUtbGVuZ3RoIGZpZWxkcy4gKi8KLQl1Y3AgPSBidWZmZXJfcHRyKGIpOwotCWlmICh1Y3BbMF0gPT0gMHg0MikgewkvKiBCeXRlIG9yZGVyIE1TQiBmaXJzdC4gKi8KLQkJcHJvdG9fbGVuID0gMjU2ICogdWNwWzZdICsgdWNwWzddOwotCQlkYXRhX2xlbiA9IDI1NiAqIHVjcFs4XSArIHVjcFs5XTsKLQl9IGVsc2UgaWYgKHVjcFswXSA9PSAweDZjKSB7CS8qIEJ5dGUgb3JkZXIgTFNCIGZpcnN0LiAqLwotCQlwcm90b19sZW4gPSB1Y3BbNl0gKyAyNTYgKiB1Y3BbN107Ci0JCWRhdGFfbGVuID0gdWNwWzhdICsgMjU2ICogdWNwWzldOwotCX0gZWxzZSB7Ci0JCWRlYnVnMigiSW5pdGlhbCBYMTEgcGFja2V0IGNvbnRhaW5zIGJhZCBieXRlIG9yZGVyIGJ5dGU6IDB4JXgiLAotCQkgICAgdWNwWzBdKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIENoZWNrIGlmIHRoZSB3aG9sZSBwYWNrZXQgaXMgaW4gYnVmZmVyLiAqLwotCWlmIChidWZmZXJfbGVuKGIpIDwKLQkgICAgMTIgKyAoKHByb3RvX2xlbiArIDMpICYgfjMpICsgKChkYXRhX2xlbiArIDMpICYgfjMpKQotCQlyZXR1cm4gMDsKLQotCS8qIENoZWNrIGlmIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIG1hdGNoZXMuICovCi0JaWYgKHByb3RvX2xlbiAhPSBzdHJsZW4oeDExX3NhdmVkX3Byb3RvKSB8fAotCSAgICBtZW1jbXAodWNwICsgMTIsIHgxMV9zYXZlZF9wcm90bywgcHJvdG9fbGVuKSAhPSAwKSB7Ci0JCWRlYnVnMigiWDExIGNvbm5lY3Rpb24gdXNlcyBkaWZmZXJlbnQgYXV0aGVudGljYXRpb24gcHJvdG9jb2wuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogQ2hlY2sgaWYgYXV0aGVudGljYXRpb24gZGF0YSBtYXRjaGVzIG91ciBmYWtlIGRhdGEuICovCi0JaWYgKGRhdGFfbGVuICE9IHgxMV9mYWtlX2RhdGFfbGVuIHx8Ci0JICAgIHRpbWluZ3NhZmVfYmNtcCh1Y3AgKyAxMiArICgocHJvdG9fbGVuICsgMykgJiB+MyksCi0JCXgxMV9mYWtlX2RhdGEsIHgxMV9mYWtlX2RhdGFfbGVuKSAhPSAwKSB7Ci0JCWRlYnVnMigiWDExIGF1dGggZGF0YSBkb2VzIG5vdCBtYXRjaCBmYWtlIGRhdGEuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogQ2hlY2sgZmFrZSBkYXRhIGxlbmd0aCAqLwotCWlmICh4MTFfZmFrZV9kYXRhX2xlbiAhPSB4MTFfc2F2ZWRfZGF0YV9sZW4pIHsKLQkJZXJyb3IoIlgxMSBmYWtlX2RhdGFfbGVuICVkICE9IHNhdmVkX2RhdGFfbGVuICVkIiwKLQkJICAgIHgxMV9mYWtlX2RhdGFfbGVuLCB4MTFfc2F2ZWRfZGF0YV9sZW4pOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qCi0JICogUmVjZWl2ZWQgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgYW5kIGRhdGEgbWF0Y2gKLQkgKiBvdXIgZmFrZSBkYXRhLiBTdWJzdGl0dXRlIHRoZSBmYWtlIGRhdGEgd2l0aCByZWFsCi0JICogZGF0YS4KLQkgKi8KLQltZW1jcHkodWNwICsgMTIgKyAoKHByb3RvX2xlbiArIDMpICYgfjMpLAotCSAgICB4MTFfc2F2ZWRfZGF0YSwgeDExX3NhdmVkX2RhdGFfbGVuKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLWNoYW5uZWxfcHJlX3gxMV9vcGVuXzEzKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKLXsKLQlpbnQgcmV0ID0geDExX29wZW5faGVscGVyKCZjLT5vdXRwdXQpOwotCi0JaWYgKHJldCA9PSAxKSB7Ci0JCS8qIFN0YXJ0IG5vcm1hbCBwcm9jZXNzaW5nIGZvciB0aGUgY2hhbm5lbC4gKi8KLQkJYy0+dHlwZSA9IFNTSF9DSEFOTkVMX09QRU47Ci0JCWNoYW5uZWxfcHJlX29wZW5fMTMoYywgcmVhZHNldCwgd3JpdGVzZXQpOwotCX0gZWxzZSBpZiAocmV0ID09IC0xKSB7Ci0JCS8qCi0JCSAqIFdlIGhhdmUgcmVjZWl2ZWQgYW4gWDExIGNvbm5lY3Rpb24gdGhhdCBoYXMgYmFkCi0JCSAqIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLgotCQkgKi8KLQkJbG9naXQoIlgxMSBjb25uZWN0aW9uIHJlamVjdGVkIGJlY2F1c2Ugb2Ygd3JvbmcgYXV0aGVudGljYXRpb24uIik7Ci0JCWJ1ZmZlcl9jbGVhcigmYy0+aW5wdXQpOwotCQlidWZmZXJfY2xlYXIoJmMtPm91dHB1dCk7Ci0JCWNoYW5uZWxfY2xvc2VfZmQoJmMtPnNvY2spOwotCQljLT5zb2NrID0gLTE7Ci0JCWMtPnR5cGUgPSBTU0hfQ0hBTk5FTF9DTE9TRUQ7Ci0JCXBhY2tldF9zdGFydChTU0hfTVNHX0NIQU5ORUxfQ0xPU0UpOwotCQlwYWNrZXRfcHV0X2ludChjLT5yZW1vdGVfaWQpOwotCQlwYWNrZXRfc2VuZCgpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWNoYW5uZWxfcHJlX3gxMV9vcGVuKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKLXsKLQlpbnQgcmV0ID0geDExX29wZW5faGVscGVyKCZjLT5vdXRwdXQpOwotCi0JLyogYy0+Zm9yY2VfZHJhaW4gPSAxOyAqLwotCi0JaWYgKHJldCA9PSAxKSB7Ci0JCWMtPnR5cGUgPSBTU0hfQ0hBTk5FTF9PUEVOOwotCQljaGFubmVsX3ByZV9vcGVuKGMsIHJlYWRzZXQsIHdyaXRlc2V0KTsKLQl9IGVsc2UgaWYgKHJldCA9PSAtMSkgewotCQlsb2dpdCgiWDExIGNvbm5lY3Rpb24gcmVqZWN0ZWQgYmVjYXVzZSBvZiB3cm9uZyBhdXRoZW50aWNhdGlvbi4iKTsKLQkJZGVidWcyKCJYMTEgcmVqZWN0ZWQgJWQgaSVkL28lZCIsIGMtPnNlbGYsIGMtPmlzdGF0ZSwgYy0+b3N0YXRlKTsKLQkJY2hhbl9yZWFkX2ZhaWxlZChjKTsKLQkJYnVmZmVyX2NsZWFyKCZjLT5pbnB1dCk7Ci0JCWNoYW5faWJ1Zl9lbXB0eShjKTsKLQkJYnVmZmVyX2NsZWFyKCZjLT5vdXRwdXQpOwotCQkvKiBmb3IgcHJvdG8gdjEsIHRoZSBwZWVyIHdpbGwgc2VuZCBhbiBJRU9GICovCi0JCWlmIChjb21wYXQyMCkKLQkJCWNoYW5fd3JpdGVfZmFpbGVkKGMpOwotCQllbHNlCi0JCQljLT50eXBlID0gU1NIX0NIQU5ORUxfT1BFTjsKLQkJZGVidWcyKCJYMTEgY2xvc2VkICVkIGklZC9vJWQiLCBjLT5zZWxmLCBjLT5pc3RhdGUsIGMtPm9zdGF0ZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotY2hhbm5lbF9wcmVfbXV4X2NsaWVudChDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCi17Ci0JaWYgKGMtPmlzdGF0ZSA9PSBDSEFOX0lOUFVUX09QRU4gJiYgIWMtPm11eF9wYXVzZSAmJgotCSAgICBidWZmZXJfY2hlY2tfYWxsb2MoJmMtPmlucHV0LCBDSEFOX1JCVUYpKQotCQlGRF9TRVQoYy0+cmZkLCByZWFkc2V0KTsKLQlpZiAoYy0+aXN0YXRlID09IENIQU5fSU5QVVRfV0FJVF9EUkFJTikgewotCQkvKiBjbGVhciBidWZmZXIgaW1tZWRpYXRlbHkgKGRpc2NhcmQgYW55IHBhcnRpYWwgcGFja2V0KSAqLwotCQlidWZmZXJfY2xlYXIoJmMtPmlucHV0KTsKLQkJY2hhbl9pYnVmX2VtcHR5KGMpOwotCQkvKiBTdGFydCBvdXRwdXQgZHJhaW4uIFhYWCBqdXN0IGtpbGwgY2hhbj8gKi8KLQkJY2hhbl9yY3ZkX29jbG9zZShjKTsKLQl9Ci0JaWYgKGMtPm9zdGF0ZSA9PSBDSEFOX09VVFBVVF9PUEVOIHx8Ci0JICAgIGMtPm9zdGF0ZSA9PSBDSEFOX09VVFBVVF9XQUlUX0RSQUlOKSB7Ci0JCWlmIChidWZmZXJfbGVuKCZjLT5vdXRwdXQpID4gMCkKLQkJCUZEX1NFVChjLT53ZmQsIHdyaXRlc2V0KTsKLQkJZWxzZSBpZiAoYy0+b3N0YXRlID09IENIQU5fT1VUUFVUX1dBSVRfRFJBSU4pCi0JCQljaGFuX29idWZfZW1wdHkoYyk7Ci0JfQotfQotCi0vKiB0cnkgdG8gZGVjb2RlIGEgc29ja3M0IGhlYWRlciAqLwotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLWNoYW5uZWxfZGVjb2RlX3NvY2tzNChDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCi17Ci0JY2hhciAqcCwgKmhvc3Q7Ci0JdV9pbnQgbGVuLCBoYXZlLCBpLCBmb3VuZCwgbmVlZDsKLQljaGFyIHVzZXJuYW1lWzI1Nl07Ci0Jc3RydWN0IHsKLQkJdV9pbnQ4X3QgdmVyc2lvbjsKLQkJdV9pbnQ4X3QgY29tbWFuZDsKLQkJdV9pbnQxNl90IGRlc3RfcG9ydDsKLQkJc3RydWN0IGluX2FkZHIgZGVzdF9hZGRyOwotCX0gczRfcmVxLCBzNF9yc3A7Ci0KLQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGRlY29kZSBzb2NrczQiLCBjLT5zZWxmKTsKLQotCWhhdmUgPSBidWZmZXJfbGVuKCZjLT5pbnB1dCk7Ci0JbGVuID0gc2l6ZW9mKHM0X3JlcSk7Ci0JaWYgKGhhdmUgPCBsZW4pCi0JCXJldHVybiAwOwotCXAgPSBidWZmZXJfcHRyKCZjLT5pbnB1dCk7Ci0KLQluZWVkID0gMTsKLQkvKiBTT0NLUzRBIHVzZXMgYW4gaW52YWxpZCBJUCBhZGRyZXNzIDAuMC4wLnggKi8KLQlpZiAocFs0XSA9PSAwICYmIHBbNV0gPT0gMCAmJiBwWzZdID09IDAgJiYgcFs3XSAhPSAwKSB7Ci0JCWRlYnVnMigiY2hhbm5lbCAlZDogc29ja3M0YSByZXF1ZXN0IiwgYy0+c2VsZik7Ci0JCS8qIC4uLiBhbmQgbmVlZHMgYW4gZXh0cmEgc3RyaW5nICh0aGUgaG9zdG5hbWUpICovCi0JCW5lZWQgPSAyOwotCX0KLQkvKiBDaGVjayBmb3IgdGVybWluYXRpbmcgTlVMIG9uIHRoZSBzdHJpbmcocykgKi8KLQlmb3IgKGZvdW5kID0gMCwgaSA9IGxlbjsgaSA8IGhhdmU7IGkrKykgewotCQlpZiAocFtpXSA9PSAnXDAnKSB7Ci0JCQlmb3VuZCsrOwotCQkJaWYgKGZvdW5kID09IG5lZWQpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPiAxMDI0KSB7Ci0JCQkvKiB0aGUgcGVlciBpcyBwcm9iYWJseSBzZW5kaW5nIGdhcmJhZ2UgKi8KLQkJCWRlYnVnKCJjaGFubmVsICVkOiBkZWNvZGUgc29ja3M0OiB0b28gbG9uZyIsCi0JCQkgICAgYy0+c2VsZik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JaWYgKGZvdW5kIDwgbmVlZCkKLQkJcmV0dXJuIDA7Ci0JYnVmZmVyX2dldCgmYy0+aW5wdXQsIChjaGFyICopJnM0X3JlcS52ZXJzaW9uLCAxKTsKLQlidWZmZXJfZ2V0KCZjLT5pbnB1dCwgKGNoYXIgKikmczRfcmVxLmNvbW1hbmQsIDEpOwotCWJ1ZmZlcl9nZXQoJmMtPmlucHV0LCAoY2hhciAqKSZzNF9yZXEuZGVzdF9wb3J0LCAyKTsKLQlidWZmZXJfZ2V0KCZjLT5pbnB1dCwgKGNoYXIgKikmczRfcmVxLmRlc3RfYWRkciwgNCk7Ci0JaGF2ZSA9IGJ1ZmZlcl9sZW4oJmMtPmlucHV0KTsKLQlwID0gYnVmZmVyX3B0cigmYy0+aW5wdXQpOwotCWxlbiA9IHN0cmxlbihwKTsKLQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGRlY29kZSBzb2NrczQ6IHVzZXIgJXMvJWQiLCBjLT5zZWxmLCBwLCBsZW4pOwotCWxlbisrOwkJCQkJLyogdHJhaWxpbmcgJ1wwJyAqLwotCWlmIChsZW4gPiBoYXZlKQotCQlmYXRhbCgiY2hhbm5lbCAlZDogZGVjb2RlIHNvY2tzNDogbGVuICVkID4gaGF2ZSAlZCIsCi0JCSAgICBjLT5zZWxmLCBsZW4sIGhhdmUpOwotCXN0cmxjcHkodXNlcm5hbWUsIHAsIHNpemVvZih1c2VybmFtZSkpOwotCWJ1ZmZlcl9jb25zdW1lKCZjLT5pbnB1dCwgbGVuKTsKLQotCWlmIChjLT5wYXRoICE9IE5VTEwpIHsKLQkJeGZyZWUoYy0+cGF0aCk7Ci0JCWMtPnBhdGggPSBOVUxMOwotCX0KLQlpZiAobmVlZCA9PSAxKSB7CQkJLyogU09DS1M0OiBvbmUgc3RyaW5nICovCi0JCWhvc3QgPSBpbmV0X250b2EoczRfcmVxLmRlc3RfYWRkcik7Ci0JCWMtPnBhdGggPSB4c3RyZHVwKGhvc3QpOwotCX0gZWxzZSB7CQkJCS8qIFNPQ0tTNEE6IHR3byBzdHJpbmdzICovCi0JCWhhdmUgPSBidWZmZXJfbGVuKCZjLT5pbnB1dCk7Ci0JCXAgPSBidWZmZXJfcHRyKCZjLT5pbnB1dCk7Ci0JCWxlbiA9IHN0cmxlbihwKTsKLQkJZGVidWcyKCJjaGFubmVsICVkOiBkZWNvZGUgc29ja3M0YTogaG9zdCAlcy8lZCIsCi0JCSAgICBjLT5zZWxmLCBwLCBsZW4pOwotCQlsZW4rKzsJCQkJLyogdHJhaWxpbmcgJ1wwJyAqLwotCQlpZiAobGVuID4gaGF2ZSkKLQkJCWZhdGFsKCJjaGFubmVsICVkOiBkZWNvZGUgc29ja3M0YTogbGVuICVkID4gaGF2ZSAlZCIsCi0JCQkgICAgYy0+c2VsZiwgbGVuLCBoYXZlKTsKLQkJaWYgKGxlbiA+IE5JX01BWEhPU1QpIHsKLQkJCWVycm9yKCJjaGFubmVsICVkOiBob3N0bmFtZSBcIiUuMTAwc1wiIHRvbyBsb25nIiwKLQkJCSAgICBjLT5zZWxmLCBwKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQljLT5wYXRoID0geHN0cmR1cChwKTsKLQkJYnVmZmVyX2NvbnN1bWUoJmMtPmlucHV0LCBsZW4pOwotCX0KLQljLT5ob3N0X3BvcnQgPSBudG9ocyhzNF9yZXEuZGVzdF9wb3J0KTsKLQotCWRlYnVnMigiY2hhbm5lbCAlZDogZHluYW1pYyByZXF1ZXN0OiBzb2NrczQgaG9zdCAlcyBwb3J0ICV1IGNvbW1hbmQgJXUiLAotCSAgICBjLT5zZWxmLCBjLT5wYXRoLCBjLT5ob3N0X3BvcnQsIHM0X3JlcS5jb21tYW5kKTsKLQotCWlmIChzNF9yZXEuY29tbWFuZCAhPSAxKSB7Ci0JCWRlYnVnKCJjaGFubmVsICVkOiBjYW5ub3QgaGFuZGxlOiAlcyBjbiAlZCIsCi0JCSAgICBjLT5zZWxmLCBuZWVkID09IDEgPyAiU09DS1M0IiA6ICJTT0NLUzRBIiwgczRfcmVxLmNvbW1hbmQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXM0X3JzcC52ZXJzaW9uID0gMDsJCQkvKiB2bjogMCBmb3IgcmVwbHkgKi8KLQlzNF9yc3AuY29tbWFuZCA9IDkwOwkJCS8qIGNkOiByZXEgZ3JhbnRlZCAqLwotCXM0X3JzcC5kZXN0X3BvcnQgPSAwOwkJCS8qIGlnbm9yZWQgKi8KLQlzNF9yc3AuZGVzdF9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CS8qIGlnbm9yZWQgKi8KLQlidWZmZXJfYXBwZW5kKCZjLT5vdXRwdXQsICZzNF9yc3AsIHNpemVvZihzNF9yc3ApKTsKLQlyZXR1cm4gMTsKLX0KLQotLyogdHJ5IHRvIGRlY29kZSBhIHNvY2tzNSBoZWFkZXIgKi8KLSNkZWZpbmUgU1NIX1NPQ0tTNV9BVVRIRE9ORQkweDEwMDAKLSNkZWZpbmUgU1NIX1NPQ0tTNV9OT0FVVEgJMHgwMAotI2RlZmluZSBTU0hfU09DS1M1X0lQVjQJCTB4MDEKLSNkZWZpbmUgU1NIX1NPQ0tTNV9ET01BSU4JMHgwMwotI2RlZmluZSBTU0hfU09DS1M1X0lQVjYJCTB4MDQKLSNkZWZpbmUgU1NIX1NPQ0tTNV9DT05ORUNUCTB4MDEKLSNkZWZpbmUgU1NIX1NPQ0tTNV9TVUNDRVNTCTB4MDAKLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLWNoYW5uZWxfZGVjb2RlX3NvY2tzNShDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCi17Ci0Jc3RydWN0IHsKLQkJdV9pbnQ4X3QgdmVyc2lvbjsKLQkJdV9pbnQ4X3QgY29tbWFuZDsKLQkJdV9pbnQ4X3QgcmVzZXJ2ZWQ7Ci0JCXVfaW50OF90IGF0eXA7Ci0JfSBzNV9yZXEsIHM1X3JzcDsKLQl1X2ludDE2X3QgZGVzdF9wb3J0OwotCXVfY2hhciAqcCwgZGVzdF9hZGRyWzI1NSsxXSwgbnRvcFtJTkVUNl9BRERSU1RSTEVOXTsKLQl1X2ludCBoYXZlLCBuZWVkLCBpLCBmb3VuZCwgbm1ldGhvZHMsIGFkZHJsZW4sIGFmOwotCi0JZGVidWcyKCJjaGFubmVsICVkOiBkZWNvZGUgc29ja3M1IiwgYy0+c2VsZik7Ci0JcCA9IGJ1ZmZlcl9wdHIoJmMtPmlucHV0KTsKLQlpZiAocFswXSAhPSAweDA1KQotCQlyZXR1cm4gLTE7Ci0JaGF2ZSA9IGJ1ZmZlcl9sZW4oJmMtPmlucHV0KTsKLQlpZiAoIShjLT5mbGFncyAmIFNTSF9TT0NLUzVfQVVUSERPTkUpKSB7Ci0JCS8qIGZvcm1hdDogdmVyIHwgbm1ldGhvZHMgfCBtZXRob2RzICovCi0JCWlmIChoYXZlIDwgMikKLQkJCXJldHVybiAwOwotCQlubWV0aG9kcyA9IHBbMV07Ci0JCWlmIChoYXZlIDwgbm1ldGhvZHMgKyAyKQotCQkJcmV0dXJuIDA7Ci0JCS8qIGxvb2sgZm9yIG1ldGhvZDogIk5PIEFVVEhFTlRJQ0FUSU9OIFJFUVVJUkVEIiAqLwotCQlmb3IgKGZvdW5kID0gMCwgaSA9IDI7IGkgPCBubWV0aG9kcyArIDI7IGkrKykgewotCQkJaWYgKHBbaV0gPT0gU1NIX1NPQ0tTNV9OT0FVVEgpIHsKLQkJCQlmb3VuZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFmb3VuZCkgewotCQkJZGVidWcoImNoYW5uZWwgJWQ6IG1ldGhvZCBTU0hfU09DS1M1X05PQVVUSCBub3QgZm91bmQiLAotCQkJICAgIGMtPnNlbGYpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWJ1ZmZlcl9jb25zdW1lKCZjLT5pbnB1dCwgbm1ldGhvZHMgKyAyKTsKLQkJYnVmZmVyX3B1dF9jaGFyKCZjLT5vdXRwdXQsIDB4MDUpOwkJLyogdmVyc2lvbiAqLwotCQlidWZmZXJfcHV0X2NoYXIoJmMtPm91dHB1dCwgU1NIX1NPQ0tTNV9OT0FVVEgpOwkvKiBtZXRob2QgKi8KLQkJRkRfU0VUKGMtPnNvY2ssIHdyaXRlc2V0KTsKLQkJYy0+ZmxhZ3MgfD0gU1NIX1NPQ0tTNV9BVVRIRE9ORTsKLQkJZGVidWcyKCJjaGFubmVsICVkOiBzb2NrczUgYXV0aCBkb25lIiwgYy0+c2VsZik7Ci0JCXJldHVybiAwOwkJCQkvKiBuZWVkIG1vcmUgKi8KLQl9Ci0JZGVidWcyKCJjaGFubmVsICVkOiBzb2NrczUgcG9zdCBhdXRoIiwgYy0+c2VsZik7Ci0JaWYgKGhhdmUgPCBzaXplb2YoczVfcmVxKSsxKQotCQlyZXR1cm4gMDsJCQkvKiBuZWVkIG1vcmUgKi8KLQltZW1jcHkoJnM1X3JlcSwgcCwgc2l6ZW9mKHM1X3JlcSkpOwotCWlmIChzNV9yZXEudmVyc2lvbiAhPSAweDA1IHx8Ci0JICAgIHM1X3JlcS5jb21tYW5kICE9IFNTSF9TT0NLUzVfQ09OTkVDVCB8fAotCSAgICBzNV9yZXEucmVzZXJ2ZWQgIT0gMHgwMCkgewotCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IG9ubHkgc29ja3M1IGNvbm5lY3Qgc3VwcG9ydGVkIiwgYy0+c2VsZik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc3dpdGNoIChzNV9yZXEuYXR5cCl7Ci0JY2FzZSBTU0hfU09DS1M1X0lQVjQ6Ci0JCWFkZHJsZW4gPSA0OwotCQlhZiA9IEFGX0lORVQ7Ci0JCWJyZWFrOwotCWNhc2UgU1NIX1NPQ0tTNV9ET01BSU46Ci0JCWFkZHJsZW4gPSBwW3NpemVvZihzNV9yZXEpXTsKLQkJYWYgPSAtMTsKLQkJYnJlYWs7Ci0JY2FzZSBTU0hfU09DS1M1X0lQVjY6Ci0JCWFkZHJsZW4gPSAxNjsKLQkJYWYgPSBBRl9JTkVUNjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGVidWcyKCJjaGFubmVsICVkOiBiYWQgc29ja3M1IGF0eXAgJWQiLCBjLT5zZWxmLCBzNV9yZXEuYXR5cCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbmVlZCA9IHNpemVvZihzNV9yZXEpICsgYWRkcmxlbiArIDI7Ci0JaWYgKHM1X3JlcS5hdHlwID09IFNTSF9TT0NLUzVfRE9NQUlOKQotCQluZWVkKys7Ci0JaWYgKGhhdmUgPCBuZWVkKQotCQlyZXR1cm4gMDsKLQlidWZmZXJfY29uc3VtZSgmYy0+aW5wdXQsIHNpemVvZihzNV9yZXEpKTsKLQlpZiAoczVfcmVxLmF0eXAgPT0gU1NIX1NPQ0tTNV9ET01BSU4pCi0JCWJ1ZmZlcl9jb25zdW1lKCZjLT5pbnB1dCwgMSk7ICAgIC8qIGhvc3Qgc3RyaW5nIGxlbmd0aCAqLwotCWJ1ZmZlcl9nZXQoJmMtPmlucHV0LCAoY2hhciAqKSZkZXN0X2FkZHIsIGFkZHJsZW4pOwotCWJ1ZmZlcl9nZXQoJmMtPmlucHV0LCAoY2hhciAqKSZkZXN0X3BvcnQsIDIpOwotCWRlc3RfYWRkclthZGRybGVuXSA9ICdcMCc7Ci0JaWYgKGMtPnBhdGggIT0gTlVMTCkgewotCQl4ZnJlZShjLT5wYXRoKTsKLQkJYy0+cGF0aCA9IE5VTEw7Ci0JfQotCWlmIChzNV9yZXEuYXR5cCA9PSBTU0hfU09DS1M1X0RPTUFJTikgewotCQlpZiAoYWRkcmxlbiA+PSBOSV9NQVhIT1NUKSB7Ci0JCQllcnJvcigiY2hhbm5lbCAlZDogZHluYW1pYyByZXF1ZXN0OiBzb2NrczUgaG9zdG5hbWUgIgotCQkJICAgICJcIiUuMTAwc1wiIHRvbyBsb25nIiwgYy0+c2VsZiwgZGVzdF9hZGRyKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQljLT5wYXRoID0geHN0cmR1cChkZXN0X2FkZHIpOwotCX0gZWxzZSB7Ci0JCWlmIChpbmV0X250b3AoYWYsIGRlc3RfYWRkciwgbnRvcCwgc2l6ZW9mKG50b3ApKSA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQljLT5wYXRoID0geHN0cmR1cChudG9wKTsKLQl9Ci0JYy0+aG9zdF9wb3J0ID0gbnRvaHMoZGVzdF9wb3J0KTsKLQotCWRlYnVnMigiY2hhbm5lbCAlZDogZHluYW1pYyByZXF1ZXN0OiBzb2NrczUgaG9zdCAlcyBwb3J0ICV1IGNvbW1hbmQgJXUiLAotCSAgICBjLT5zZWxmLCBjLT5wYXRoLCBjLT5ob3N0X3BvcnQsIHM1X3JlcS5jb21tYW5kKTsKLQotCXM1X3JzcC52ZXJzaW9uID0gMHgwNTsKLQlzNV9yc3AuY29tbWFuZCA9IFNTSF9TT0NLUzVfU1VDQ0VTUzsKLQlzNV9yc3AucmVzZXJ2ZWQgPSAwOwkJCS8qIGlnbm9yZWQgKi8KLQlzNV9yc3AuYXR5cCA9IFNTSF9TT0NLUzVfSVBWNDsKLQkoKHN0cnVjdCBpbl9hZGRyICopJmRlc3RfYWRkciktPnNfYWRkciA9IElOQUREUl9BTlk7Ci0JZGVzdF9wb3J0ID0gMDsJCQkJLyogaWdub3JlZCAqLwotCi0JYnVmZmVyX2FwcGVuZCgmYy0+b3V0cHV0LCAmczVfcnNwLCBzaXplb2YoczVfcnNwKSk7Ci0JYnVmZmVyX2FwcGVuZCgmYy0+b3V0cHV0LCAmZGVzdF9hZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKLQlidWZmZXJfYXBwZW5kKCZjLT5vdXRwdXQsICZkZXN0X3BvcnQsIHNpemVvZihkZXN0X3BvcnQpKTsKLQlyZXR1cm4gMTsKLX0KLQotQ2hhbm5lbCAqCi1jaGFubmVsX2Nvbm5lY3Rfc3RkaW9fZndkKGNvbnN0IGNoYXIgKmhvc3RfdG9fY29ubmVjdCwgdV9zaG9ydCBwb3J0X3RvX2Nvbm5lY3QsCi0gICAgaW50IGluLCBpbnQgb3V0KQotewotCUNoYW5uZWwgKmM7Ci0KLQlkZWJ1ZygiY2hhbm5lbF9jb25uZWN0X3N0ZGlvX2Z3ZCAlczolZCIsIGhvc3RfdG9fY29ubmVjdCwKLQkgICAgcG9ydF90b19jb25uZWN0KTsKLQotCWMgPSBjaGFubmVsX25ldygic3RkaW8tZm9yd2FyZCIsIFNTSF9DSEFOTkVMX09QRU5JTkcsIGluLCBvdXQsCi0JICAgIC0xLCBDSEFOX1RDUF9XSU5ET1dfREVGQVVMVCwgQ0hBTl9UQ1BfUEFDS0VUX0RFRkFVTFQsCi0JICAgIDAsICJzdGRpby1mb3J3YXJkIiwgLypub25ibG9jayovMCk7Ci0KLQljLT5wYXRoID0geHN0cmR1cChob3N0X3RvX2Nvbm5lY3QpOwotCWMtPmhvc3RfcG9ydCA9IHBvcnRfdG9fY29ubmVjdDsKLQljLT5saXN0ZW5pbmdfcG9ydCA9IDA7Ci0JYy0+Zm9yY2VfZHJhaW4gPSAxOwotCi0JY2hhbm5lbF9yZWdpc3Rlcl9mZHMoYywgaW4sIG91dCwgLTEsIDAsIDEsIDApOwotCXBvcnRfb3Blbl9oZWxwZXIoYywgImRpcmVjdC10Y3BpcCIpOwotCi0JcmV0dXJuIGM7Ci19Ci0KLS8qIGR5bmFtaWMgcG9ydCBmb3J3YXJkaW5nICovCi1zdGF0aWMgdm9pZAotY2hhbm5lbF9wcmVfZHluYW1pYyhDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCi17Ci0JdV9jaGFyICpwOwotCXVfaW50IGhhdmU7Ci0JaW50IHJldDsKLQotCWhhdmUgPSBidWZmZXJfbGVuKCZjLT5pbnB1dCk7Ci0JZGVidWcyKCJjaGFubmVsICVkOiBwcmVfZHluYW1pYzogaGF2ZSAlZCIsIGMtPnNlbGYsIGhhdmUpOwotCS8qIGJ1ZmZlcl9kdW1wKCZjLT5pbnB1dCk7ICovCi0JLyogY2hlY2sgaWYgdGhlIGZpeGVkIHNpemUgcGFydCBvZiB0aGUgcGFja2V0IGlzIGluIGJ1ZmZlci4gKi8KLQlpZiAoaGF2ZSA8IDMpIHsKLQkJLyogbmVlZCBtb3JlICovCi0JCUZEX1NFVChjLT5zb2NrLCByZWFkc2V0KTsKLQkJcmV0dXJuOwotCX0KLQkvKiB0cnkgdG8gZ3Vlc3MgdGhlIHByb3RvY29sICovCi0JcCA9IGJ1ZmZlcl9wdHIoJmMtPmlucHV0KTsKLQlzd2l0Y2ggKHBbMF0pIHsKLQljYXNlIDB4MDQ6Ci0JCXJldCA9IGNoYW5uZWxfZGVjb2RlX3NvY2tzNChjLCByZWFkc2V0LCB3cml0ZXNldCk7Ci0JCWJyZWFrOwotCWNhc2UgMHgwNToKLQkJcmV0ID0gY2hhbm5lbF9kZWNvZGVfc29ja3M1KGMsIHJlYWRzZXQsIHdyaXRlc2V0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLTE7Ci0JCWJyZWFrOwotCX0KLQlpZiAocmV0IDwgMCkgewotCQljaGFuX21hcmtfZGVhZChjKTsKLQl9IGVsc2UgaWYgKHJldCA9PSAwKSB7Ci0JCWRlYnVnMigiY2hhbm5lbCAlZDogcHJlX2R5bmFtaWM6IG5lZWQgbW9yZSIsIGMtPnNlbGYpOwotCQkvKiBuZWVkIG1vcmUgKi8KLQkJRkRfU0VUKGMtPnNvY2ssIHJlYWRzZXQpOwotCX0gZWxzZSB7Ci0JCS8qIHN3aXRjaCB0byB0aGUgbmV4dCBzdGF0ZSAqLwotCQljLT50eXBlID0gU1NIX0NIQU5ORUxfT1BFTklORzsKLQkJcG9ydF9vcGVuX2hlbHBlcihjLCAiZGlyZWN0LXRjcGlwIik7Ci0JfQotfQotCi0vKiBUaGlzIGlzIG91ciBmYWtlIFgxMSBzZXJ2ZXIgc29ja2V0LiAqLwotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1jaGFubmVsX3Bvc3RfeDExX2xpc3RlbmVyKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKLXsKLQlDaGFubmVsICpuYzsKLQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOwotCWludCBuZXdzb2NrOwotCXNvY2tsZW5fdCBhZGRybGVuOwotCWNoYXIgYnVmWzE2Mzg0XSwgKnJlbW90ZV9pcGFkZHI7Ci0JaW50IHJlbW90ZV9wb3J0OwotCi0JaWYgKEZEX0lTU0VUKGMtPnNvY2ssIHJlYWRzZXQpKSB7Ci0JCWRlYnVnKCJYMTEgY29ubmVjdGlvbiByZXF1ZXN0ZWQuIik7Ci0JCWFkZHJsZW4gPSBzaXplb2YoYWRkcik7Ci0JCW5ld3NvY2sgPSBhY2NlcHQoYy0+c29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcmxlbik7Ci0JCWlmIChjLT5zaW5nbGVfY29ubmVjdGlvbikgewotCQkJZGVidWcyKCJzaW5nbGVfY29ubmVjdGlvbjogY2xvc2luZyBYMTEgbGlzdGVuZXIuIik7Ci0JCQljaGFubmVsX2Nsb3NlX2ZkKCZjLT5zb2NrKTsKLQkJCWNoYW5fbWFya19kZWFkKGMpOwotCQl9Ci0JCWlmIChuZXdzb2NrIDwgMCkgewotCQkJZXJyb3IoImFjY2VwdDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCXJldHVybjsKLQkJfQotCQlzZXRfbm9kZWxheShuZXdzb2NrKTsKLQkJcmVtb3RlX2lwYWRkciA9IGdldF9wZWVyX2lwYWRkcihuZXdzb2NrKTsKLQkJcmVtb3RlX3BvcnQgPSBnZXRfcGVlcl9wb3J0KG5ld3NvY2spOwotCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJYMTEgY29ubmVjdGlvbiBmcm9tICUuMjAwcyBwb3J0ICVkIiwKLQkJICAgIHJlbW90ZV9pcGFkZHIsIHJlbW90ZV9wb3J0KTsKLQotCQluYyA9IGNoYW5uZWxfbmV3KCJhY2NlcHRlZCB4MTEgc29ja2V0IiwKLQkJICAgIFNTSF9DSEFOTkVMX09QRU5JTkcsIG5ld3NvY2ssIG5ld3NvY2ssIC0xLAotCQkgICAgYy0+bG9jYWxfd2luZG93X21heCwgYy0+bG9jYWxfbWF4cGFja2V0LCAwLCBidWYsIDEpOwotCQlpZiAoY29tcGF0MjApIHsKLQkJCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX09QRU4pOwotCQkJcGFja2V0X3B1dF9jc3RyaW5nKCJ4MTEiKTsKLQkJCXBhY2tldF9wdXRfaW50KG5jLT5zZWxmKTsKLQkJCXBhY2tldF9wdXRfaW50KG5jLT5sb2NhbF93aW5kb3dfbWF4KTsKLQkJCXBhY2tldF9wdXRfaW50KG5jLT5sb2NhbF9tYXhwYWNrZXQpOwotCQkJLyogb3JpZ2luYXRvciBpcGFkZHIgYW5kIHBvcnQgKi8KLQkJCXBhY2tldF9wdXRfY3N0cmluZyhyZW1vdGVfaXBhZGRyKTsKLQkJCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfWDExRldEKSB7Ci0JCQkJZGVidWcyKCJzc2gyIHgxMSBidWcgY29tcGF0IG1vZGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGFja2V0X3B1dF9pbnQocmVtb3RlX3BvcnQpOwotCQkJfQotCQkJcGFja2V0X3NlbmQoKTsKLQkJfSBlbHNlIHsKLQkJCXBhY2tldF9zdGFydChTU0hfU01TR19YMTFfT1BFTik7Ci0JCQlwYWNrZXRfcHV0X2ludChuYy0+c2VsZik7Ci0JCQlpZiAocGFja2V0X2dldF9wcm90b2NvbF9mbGFncygpICYKLQkJCSAgICBTU0hfUFJPVE9GTEFHX0hPU1RfSU5fRldEX09QRU4pCi0JCQkJcGFja2V0X3B1dF9jc3RyaW5nKGJ1Zik7Ci0JCQlwYWNrZXRfc2VuZCgpOwotCQl9Ci0JCXhmcmVlKHJlbW90ZV9pcGFkZHIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXBvcnRfb3Blbl9oZWxwZXIoQ2hhbm5lbCAqYywgY2hhciAqcnR5cGUpCi17Ci0JaW50IGRpcmVjdDsKLQljaGFyIGJ1ZlsxMDI0XTsKLQljaGFyICpyZW1vdGVfaXBhZGRyID0gZ2V0X3BlZXJfaXBhZGRyKGMtPnNvY2spOwotCWludCByZW1vdGVfcG9ydCA9IGdldF9wZWVyX3BvcnQoYy0+c29jayk7Ci0KLQlpZiAocmVtb3RlX3BvcnQgPT0gLTEpIHsKLQkJLyogRmFrZSBhZGRyL3BvcnQgdG8gYXBwZWFzZSBwZWVycyB0aGF0IHZhbGlkYXRlIGl0IChUZWN0aWEpICovCi0JCXhmcmVlKHJlbW90ZV9pcGFkZHIpOwotCQlyZW1vdGVfaXBhZGRyID0geHN0cmR1cCgiMTI3LjAuMC4xIik7Ci0JCXJlbW90ZV9wb3J0ID0gNjU1MzU7Ci0JfQotCi0JZGlyZWN0ID0gKHN0cmNtcChydHlwZSwgImRpcmVjdC10Y3BpcCIpID09IDApOwotCi0Jc25wcmludGYoYnVmLCBzaXplb2YgYnVmLAotCSAgICAiJXM6IGxpc3RlbmluZyBwb3J0ICVkIGZvciAlLjEwMHMgcG9ydCAlZCwgIgotCSAgICAiY29ubmVjdCBmcm9tICUuMjAwcyBwb3J0ICVkIiwKLQkgICAgcnR5cGUsIGMtPmxpc3RlbmluZ19wb3J0LCBjLT5wYXRoLCBjLT5ob3N0X3BvcnQsCi0JICAgIHJlbW90ZV9pcGFkZHIsIHJlbW90ZV9wb3J0KTsKLQotCXhmcmVlKGMtPnJlbW90ZV9uYW1lKTsKLQljLT5yZW1vdGVfbmFtZSA9IHhzdHJkdXAoYnVmKTsKLQotCWlmIChjb21wYXQyMCkgewotCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfQ0hBTk5FTF9PUEVOKTsKLQkJcGFja2V0X3B1dF9jc3RyaW5nKHJ0eXBlKTsKLQkJcGFja2V0X3B1dF9pbnQoYy0+c2VsZik7Ci0JCXBhY2tldF9wdXRfaW50KGMtPmxvY2FsX3dpbmRvd19tYXgpOwotCQlwYWNrZXRfcHV0X2ludChjLT5sb2NhbF9tYXhwYWNrZXQpOwotCQlpZiAoZGlyZWN0KSB7Ci0JCQkvKiB0YXJnZXQgaG9zdCwgcG9ydCAqLwotCQkJcGFja2V0X3B1dF9jc3RyaW5nKGMtPnBhdGgpOwotCQkJcGFja2V0X3B1dF9pbnQoYy0+aG9zdF9wb3J0KTsKLQkJfSBlbHNlIHsKLQkJCS8qIGxpc3RlbiBhZGRyZXNzLCBwb3J0ICovCi0JCQlwYWNrZXRfcHV0X2NzdHJpbmcoYy0+cGF0aCk7Ci0JCQlwYWNrZXRfcHV0X2ludChjLT5saXN0ZW5pbmdfcG9ydCk7Ci0JCX0KLQkJLyogb3JpZ2luYXRvciBob3N0IGFuZCBwb3J0ICovCi0JCXBhY2tldF9wdXRfY3N0cmluZyhyZW1vdGVfaXBhZGRyKTsKLQkJcGFja2V0X3B1dF9pbnQoKHVfaW50KXJlbW90ZV9wb3J0KTsKLQkJcGFja2V0X3NlbmQoKTsKLQl9IGVsc2UgewotCQlwYWNrZXRfc3RhcnQoU1NIX01TR19QT1JUX09QRU4pOwotCQlwYWNrZXRfcHV0X2ludChjLT5zZWxmKTsKLQkJcGFja2V0X3B1dF9jc3RyaW5nKGMtPnBhdGgpOwotCQlwYWNrZXRfcHV0X2ludChjLT5ob3N0X3BvcnQpOwotCQlpZiAocGFja2V0X2dldF9wcm90b2NvbF9mbGFncygpICYKLQkJICAgIFNTSF9QUk9UT0ZMQUdfSE9TVF9JTl9GV0RfT1BFTikKLQkJCXBhY2tldF9wdXRfY3N0cmluZyhjLT5yZW1vdGVfbmFtZSk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JfQotCXhmcmVlKHJlbW90ZV9pcGFkZHIpOwotfQotCi1zdGF0aWMgdm9pZAotY2hhbm5lbF9zZXRfcmV1c2VhZGRyKGludCBmZCkKLXsKLQlpbnQgb24gPSAxOwotCi0JLyoKLQkgKiBTZXQgc29ja2V0IG9wdGlvbnMuCi0JICogQWxsb3cgbG9jYWwgcG9ydCByZXVzZSBpbiBUSU1FX1dBSVQuCi0JICovCi0JaWYgKHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKSA9PSAtMSkKLQkJZXJyb3IoInNldHNvY2tvcHQgU09fUkVVU0VBRERSIGZkICVkOiAlcyIsIGZkLCBzdHJlcnJvcihlcnJubykpOwotfQotCi0vKgotICogVGhpcyBzb2NrZXQgaXMgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucyB0byBhIGZvcndhcmRlZCBUQ1AvSVAgcG9ydC4KLSAqLwotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1jaGFubmVsX3Bvc3RfcG9ydF9saXN0ZW5lcihDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCi17Ci0JQ2hhbm5lbCAqbmM7Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKLQlpbnQgbmV3c29jaywgbmV4dHN0YXRlOwotCXNvY2tsZW5fdCBhZGRybGVuOwotCWNoYXIgKnJ0eXBlOwotCi0JaWYgKEZEX0lTU0VUKGMtPnNvY2ssIHJlYWRzZXQpKSB7Ci0JCWRlYnVnKCJDb25uZWN0aW9uIHRvIHBvcnQgJWQgZm9yd2FyZGluZyAiCi0JCSAgICAidG8gJS4xMDBzIHBvcnQgJWQgcmVxdWVzdGVkLiIsCi0JCSAgICBjLT5saXN0ZW5pbmdfcG9ydCwgYy0+cGF0aCwgYy0+aG9zdF9wb3J0KTsKLQotCQlpZiAoYy0+dHlwZSA9PSBTU0hfQ0hBTk5FTF9SUE9SVF9MSVNURU5FUikgewotCQkJbmV4dHN0YXRlID0gU1NIX0NIQU5ORUxfT1BFTklORzsKLQkJCXJ0eXBlID0gImZvcndhcmRlZC10Y3BpcCI7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYy0+aG9zdF9wb3J0ID09IDApIHsKLQkJCQluZXh0c3RhdGUgPSBTU0hfQ0hBTk5FTF9EWU5BTUlDOwotCQkJCXJ0eXBlID0gImR5bmFtaWMtdGNwaXAiOwotCQkJfSBlbHNlIHsKLQkJCQluZXh0c3RhdGUgPSBTU0hfQ0hBTk5FTF9PUEVOSU5HOwotCQkJCXJ0eXBlID0gImRpcmVjdC10Y3BpcCI7Ci0JCQl9Ci0JCX0KLQotCQlhZGRybGVuID0gc2l6ZW9mKGFkZHIpOwotCQluZXdzb2NrID0gYWNjZXB0KGMtPnNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJsZW4pOwotCQlpZiAobmV3c29jayA8IDApIHsKLQkJCWVycm9yKCJhY2NlcHQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0X25vZGVsYXkobmV3c29jayk7Ci0JCW5jID0gY2hhbm5lbF9uZXcocnR5cGUsIG5leHRzdGF0ZSwgbmV3c29jaywgbmV3c29jaywgLTEsCi0JCSAgICBjLT5sb2NhbF93aW5kb3dfbWF4LCBjLT5sb2NhbF9tYXhwYWNrZXQsIDAsIHJ0eXBlLCAxKTsKLQkJbmMtPmxpc3RlbmluZ19wb3J0ID0gYy0+bGlzdGVuaW5nX3BvcnQ7Ci0JCW5jLT5ob3N0X3BvcnQgPSBjLT5ob3N0X3BvcnQ7Ci0JCWlmIChjLT5wYXRoICE9IE5VTEwpCi0JCQluYy0+cGF0aCA9IHhzdHJkdXAoYy0+cGF0aCk7Ci0KLQkJaWYgKG5leHRzdGF0ZSAhPSBTU0hfQ0hBTk5FTF9EWU5BTUlDKQotCQkJcG9ydF9vcGVuX2hlbHBlcihuYywgcnR5cGUpOwotCX0KLX0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50IHNvY2tldCBsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zIGZyb20KLSAqIGNsaWVudHMuCi0gKi8KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotY2hhbm5lbF9wb3N0X2F1dGhfbGlzdGVuZXIoQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQotewotCUNoYW5uZWwgKm5jOwotCWludCBuZXdzb2NrOwotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7Ci0Jc29ja2xlbl90IGFkZHJsZW47Ci0KLQlpZiAoRkRfSVNTRVQoYy0+c29jaywgcmVhZHNldCkpIHsKLQkJYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKLQkJbmV3c29jayA9IGFjY2VwdChjLT5zb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRybGVuKTsKLQkJaWYgKG5ld3NvY2sgPCAwKSB7Ci0JCQllcnJvcigiYWNjZXB0IGZyb20gYXV0aCBzb2NrZXQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbmMgPSBjaGFubmVsX25ldygiYWNjZXB0ZWQgYXV0aCBzb2NrZXQiLAotCQkgICAgU1NIX0NIQU5ORUxfT1BFTklORywgbmV3c29jaywgbmV3c29jaywgLTEsCi0JCSAgICBjLT5sb2NhbF93aW5kb3dfbWF4LCBjLT5sb2NhbF9tYXhwYWNrZXQsCi0JCSAgICAwLCAiYWNjZXB0ZWQgYXV0aCBzb2NrZXQiLCAxKTsKLQkJaWYgKGNvbXBhdDIwKSB7Ci0JCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfQ0hBTk5FTF9PUEVOKTsKLQkJCXBhY2tldF9wdXRfY3N0cmluZygiYXV0aC1hZ2VudEBvcGVuc3NoLmNvbSIpOwotCQkJcGFja2V0X3B1dF9pbnQobmMtPnNlbGYpOwotCQkJcGFja2V0X3B1dF9pbnQoYy0+bG9jYWxfd2luZG93X21heCk7Ci0JCQlwYWNrZXRfcHV0X2ludChjLT5sb2NhbF9tYXhwYWNrZXQpOwotCQl9IGVsc2UgewotCQkJcGFja2V0X3N0YXJ0KFNTSF9TTVNHX0FHRU5UX09QRU4pOwotCQkJcGFja2V0X3B1dF9pbnQobmMtPnNlbGYpOwotCQl9Ci0JCXBhY2tldF9zZW5kKCk7Ci0JfQotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLWNoYW5uZWxfcG9zdF9jb25uZWN0aW5nKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKLXsKLQlpbnQgZXJyID0gMCwgc29jazsKLQlzb2NrbGVuX3Qgc3ogPSBzaXplb2YoZXJyKTsKLQotCWlmIChGRF9JU1NFVChjLT5zb2NrLCB3cml0ZXNldCkpIHsKLQkJaWYgKGdldHNvY2tvcHQoYy0+c29jaywgU09MX1NPQ0tFVCwgU09fRVJST1IsICZlcnIsICZzeikgPCAwKSB7Ci0JCQllcnIgPSBlcnJubzsKLQkJCWVycm9yKCJnZXRzb2Nrb3B0IFNPX0VSUk9SIGZhaWxlZCIpOwotCQl9Ci0JCWlmIChlcnIgPT0gMCkgewotCQkJZGVidWcoImNoYW5uZWwgJWQ6IGNvbm5lY3RlZCB0byAlcyBwb3J0ICVkIiwKLQkJCSAgICBjLT5zZWxmLCBjLT5jb25uZWN0X2N0eC5ob3N0LCBjLT5jb25uZWN0X2N0eC5wb3J0KTsKLQkJCWNoYW5uZWxfY29ubmVjdF9jdHhfZnJlZSgmYy0+Y29ubmVjdF9jdHgpOwotCQkJYy0+dHlwZSA9IFNTSF9DSEFOTkVMX09QRU47Ci0JCQlpZiAoY29tcGF0MjApIHsKLQkJCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfQ0hBTk5FTF9PUEVOX0NPTkZJUk1BVElPTik7Ci0JCQkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKLQkJCQlwYWNrZXRfcHV0X2ludChjLT5zZWxmKTsKLQkJCQlwYWNrZXRfcHV0X2ludChjLT5sb2NhbF93aW5kb3cpOwotCQkJCXBhY2tldF9wdXRfaW50KGMtPmxvY2FsX21heHBhY2tldCk7Ci0JCQl9IGVsc2UgewotCQkJCXBhY2tldF9zdGFydChTU0hfTVNHX0NIQU5ORUxfT1BFTl9DT05GSVJNQVRJT04pOwotCQkJCXBhY2tldF9wdXRfaW50KGMtPnJlbW90ZV9pZCk7Ci0JCQkJcGFja2V0X3B1dF9pbnQoYy0+c2VsZik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlkZWJ1ZygiY2hhbm5lbCAlZDogY29ubmVjdGlvbiBmYWlsZWQ6ICVzIiwKLQkJCSAgICBjLT5zZWxmLCBzdHJlcnJvcihlcnIpKTsKLQkJCS8qIFRyeSBuZXh0IGFkZHJlc3MsIGlmIGFueSAqLwotCQkJaWYgKChzb2NrID0gY29ubmVjdF9uZXh0KCZjLT5jb25uZWN0X2N0eCkpID4gMCkgewotCQkJCWNsb3NlKGMtPnNvY2spOwotCQkJCWMtPnNvY2sgPSBjLT5yZmQgPSBjLT53ZmQgPSBzb2NrOwotCQkJCWNoYW5uZWxfbWF4X2ZkID0gY2hhbm5lbF9maW5kX21heGZkKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLyogRXhoYXVzdGVkIGFsbCBhZGRyZXNzZXMgKi8KLQkJCWVycm9yKCJjb25uZWN0X3RvICUuMTAwcyBwb3J0ICVkOiBmYWlsZWQuIiwKLQkJCSAgICBjLT5jb25uZWN0X2N0eC5ob3N0LCBjLT5jb25uZWN0X2N0eC5wb3J0KTsKLQkJCWNoYW5uZWxfY29ubmVjdF9jdHhfZnJlZSgmYy0+Y29ubmVjdF9jdHgpOwotCQkJaWYgKGNvbXBhdDIwKSB7Ci0JCQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0NIQU5ORUxfT1BFTl9GQUlMVVJFKTsKLQkJCQlwYWNrZXRfcHV0X2ludChjLT5yZW1vdGVfaWQpOwotCQkJCXBhY2tldF9wdXRfaW50KFNTSDJfT1BFTl9DT05ORUNUX0ZBSUxFRCk7Ci0JCQkJaWYgKCEoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX09QRU5GQUlMVVJFKSkgewotCQkJCQlwYWNrZXRfcHV0X2NzdHJpbmcoc3RyZXJyb3IoZXJyKSk7Ci0JCQkJCXBhY2tldF9wdXRfY3N0cmluZygiIik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlwYWNrZXRfc3RhcnQoU1NIX01TR19DSEFOTkVMX09QRU5fRkFJTFVSRSk7Ci0JCQkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKLQkJCX0KLQkJCWNoYW5fbWFya19kZWFkKGMpOwotCQl9Ci0JCXBhY2tldF9zZW5kKCk7Ci0JfQotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGludAotY2hhbm5lbF9oYW5kbGVfcmZkKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKLXsKLQljaGFyIGJ1ZltDSEFOX1JCVUZdOwotCWludCBsZW4sIGZvcmNlOwotCi0JZm9yY2UgPSBjLT5pc2F0dHkgJiYgYy0+ZGV0YWNoX2Nsb3NlICYmIGMtPmlzdGF0ZSAhPSBDSEFOX0lOUFVUX0NMT1NFRDsKLQlpZiAoYy0+cmZkICE9IC0xICYmIChmb3JjZSB8fCBGRF9JU1NFVChjLT5yZmQsIHJlYWRzZXQpKSkgewotCQllcnJubyA9IDA7Ci0JCWxlbiA9IHJlYWQoYy0+cmZkLCBidWYsIHNpemVvZihidWYpKTsKLQkJaWYgKGxlbiA8IDAgJiYgKGVycm5vID09IEVJTlRSIHx8Ci0JCSAgICAoKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgJiYgIWZvcmNlKSkpCi0JCQlyZXR1cm4gMTsKLSNpZm5kZWYgUFRZX1pFUk9SRUFECi0JCWlmIChsZW4gPD0gMCkgewotI2Vsc2UKLQkJaWYgKCghYy0+aXNhdHR5ICYmIGxlbiA8PSAwKSB8fAotCQkgICAgKGMtPmlzYXR0eSAmJiAobGVuIDwgMCB8fCAobGVuID09IDAgJiYgZXJybm8gIT0gMCkpKSkgewotI2VuZGlmCi0JCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHJlYWQ8PTAgcmZkICVkIGxlbiAlZCIsCi0JCQkgICAgYy0+c2VsZiwgYy0+cmZkLCBsZW4pOwotCQkJaWYgKGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfT1BFTikgewotCQkJCWRlYnVnMigiY2hhbm5lbCAlZDogbm90IG9wZW4iLCBjLT5zZWxmKTsKLQkJCQljaGFuX21hcmtfZGVhZChjKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9IGVsc2UgaWYgKGNvbXBhdDEzKSB7Ci0JCQkJYnVmZmVyX2NsZWFyKCZjLT5vdXRwdXQpOwotCQkJCWMtPnR5cGUgPSBTU0hfQ0hBTk5FTF9JTlBVVF9EUkFJTklORzsKLQkJCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGlucHV0IGRyYWluaW5nLiIsIGMtPnNlbGYpOwotCQkJfSBlbHNlIHsKLQkJCQljaGFuX3JlYWRfZmFpbGVkKGMpOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChjLT5pbnB1dF9maWx0ZXIgIT0gTlVMTCkgewotCQkJaWYgKGMtPmlucHV0X2ZpbHRlcihjLCBidWYsIGxlbikgPT0gLTEpIHsKLQkJCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGZpbHRlciBzdG9wcyIsIGMtPnNlbGYpOwotCQkJCWNoYW5fcmVhZF9mYWlsZWQoYyk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoYy0+ZGF0YWdyYW0pIHsKLQkJCWJ1ZmZlcl9wdXRfc3RyaW5nKCZjLT5pbnB1dCwgYnVmLCBsZW4pOwotCQl9IGVsc2UgewotCQkJYnVmZmVyX2FwcGVuZCgmYy0+aW5wdXQsIGJ1ZiwgbGVuKTsKLQkJfQotCX0KLQlyZXR1cm4gMTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLWNoYW5uZWxfaGFuZGxlX3dmZChDaGFubmVsICpjLCBmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCi17Ci0Jc3RydWN0IHRlcm1pb3MgdGlvOwotCXVfY2hhciAqZGF0YSA9IE5VTEwsICpidWY7Ci0JdV9pbnQgZGxlbiwgb2xlbiA9IDA7Ci0JaW50IGxlbjsKLQotCS8qIFNlbmQgYnVmZmVyZWQgb3V0cHV0IGRhdGEgdG8gdGhlIHNvY2tldC4gKi8KLQlpZiAoYy0+d2ZkICE9IC0xICYmCi0JICAgIEZEX0lTU0VUKGMtPndmZCwgd3JpdGVzZXQpICYmCi0JICAgIGJ1ZmZlcl9sZW4oJmMtPm91dHB1dCkgPiAwKSB7Ci0JCW9sZW4gPSBidWZmZXJfbGVuKCZjLT5vdXRwdXQpOwotCQlpZiAoYy0+b3V0cHV0X2ZpbHRlciAhPSBOVUxMKSB7Ci0JCQlpZiAoKGJ1ZiA9IGMtPm91dHB1dF9maWx0ZXIoYywgJmRhdGEsICZkbGVuKSkgPT0gTlVMTCkgewotCQkJCWRlYnVnMigiY2hhbm5lbCAlZDogZmlsdGVyIHN0b3BzIiwgYy0+c2VsZik7Ci0JCQkJaWYgKGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfT1BFTikKLQkJCQkJY2hhbl9tYXJrX2RlYWQoYyk7Ci0JCQkJZWxzZQotCQkJCQljaGFuX3dyaXRlX2ZhaWxlZChjKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoYy0+ZGF0YWdyYW0pIHsKLQkJCWJ1ZiA9IGRhdGEgPSBidWZmZXJfZ2V0X3N0cmluZygmYy0+b3V0cHV0LCAmZGxlbik7Ci0JCX0gZWxzZSB7Ci0JCQlidWYgPSBkYXRhID0gYnVmZmVyX3B0cigmYy0+b3V0cHV0KTsKLQkJCWRsZW4gPSBidWZmZXJfbGVuKCZjLT5vdXRwdXQpOwotCQl9Ci0KLQkJaWYgKGMtPmRhdGFncmFtKSB7Ci0JCQkvKiBpZ25vcmUgdHJ1bmNhdGVkIHdyaXRlcywgZGF0YWdyYW1zIG1pZ2h0IGdldCBsb3N0ICovCi0JCQlsZW4gPSB3cml0ZShjLT53ZmQsIGJ1ZiwgZGxlbik7Ci0JCQl4ZnJlZShkYXRhKTsKLQkJCWlmIChsZW4gPCAwICYmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4gfHwKLQkJCSAgICBlcnJubyA9PSBFV09VTERCTE9DSykpCi0JCQkJcmV0dXJuIDE7Ci0JCQlpZiAobGVuIDw9IDApIHsKLQkJCQlpZiAoYy0+dHlwZSAhPSBTU0hfQ0hBTk5FTF9PUEVOKQotCQkJCQljaGFuX21hcmtfZGVhZChjKTsKLQkJCQllbHNlCi0JCQkJCWNoYW5fd3JpdGVfZmFpbGVkKGMpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWdvdG8gb3V0OwotCQl9Ci0jaWZkZWYgX0FJWAotCQkvKiBYWFg6IExhdGVyIEFJWCB2ZXJzaW9ucyBjYW4ndCBwdXNoIGFzIG11Y2ggZGF0YSB0byB0dHkgKi8KLQkJaWYgKGNvbXBhdDIwICYmIGMtPndmZF9pc2F0dHkpCi0JCQlkbGVuID0gTUlOKGRsZW4sIDgqMTAyNCk7Ci0jZW5kaWYKLQotCQlsZW4gPSB3cml0ZShjLT53ZmQsIGJ1ZiwgZGxlbik7Ci0JCWlmIChsZW4gPCAwICYmCi0JCSAgICAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSkKLQkJCXJldHVybiAxOwotCQlpZiAobGVuIDw9IDApIHsKLQkJCWlmIChjLT50eXBlICE9IFNTSF9DSEFOTkVMX09QRU4pIHsKLQkJCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IG5vdCBvcGVuIiwgYy0+c2VsZik7Ci0JCQkJY2hhbl9tYXJrX2RlYWQoYyk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfSBlbHNlIGlmIChjb21wYXQxMykgewotCQkJCWJ1ZmZlcl9jbGVhcigmYy0+b3V0cHV0KTsKLQkJCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGlucHV0IGRyYWluaW5nLiIsIGMtPnNlbGYpOwotCQkJCWMtPnR5cGUgPSBTU0hfQ0hBTk5FTF9JTlBVVF9EUkFJTklORzsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hhbl93cml0ZV9mYWlsZWQoYyk7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLSNpZm5kZWYgQlJPS0VOX1RDR0VUQVRUUl9JQ0FOT04KLQkJaWYgKGNvbXBhdDIwICYmIGMtPmlzYXR0eSAmJiBkbGVuID49IDEgJiYgYnVmWzBdICE9ICdccicpIHsKLQkJCWlmICh0Y2dldGF0dHIoYy0+d2ZkLCAmdGlvKSA9PSAwICYmCi0JCQkgICAgISh0aW8uY19sZmxhZyAmIEVDSE8pICYmICh0aW8uY19sZmxhZyAmIElDQU5PTikpIHsKLQkJCQkvKgotCQkJCSAqIFNpbXVsYXRlIGVjaG8gdG8gcmVkdWNlIHRoZSBpbXBhY3Qgb2YKLQkJCQkgKiB0cmFmZmljIGFuYWx5c2lzLiBXZSBuZWVkIHRvIG1hdGNoIHRoZQotCQkJCSAqIHNpemUgb2YgYSBTU0gyX01TR19DSEFOTkVMX0RBVEEgbWVzc2FnZQotCQkJCSAqICg0IGJ5dGUgY2hhbm5lbCBpZCArIGJ1ZikKLQkJCQkgKi8KLQkJCQlwYWNrZXRfc2VuZF9pZ25vcmUoNCArIGxlbik7Ci0JCQkJcGFja2V0X3NlbmQoKTsKLQkJCX0KLQkJfQotI2VuZGlmCi0JCWJ1ZmZlcl9jb25zdW1lKCZjLT5vdXRwdXQsIGxlbik7Ci0JfQotIG91dDoKLQlpZiAoY29tcGF0MjAgJiYgb2xlbiA+IDApCi0JCWMtPmxvY2FsX2NvbnN1bWVkICs9IG9sZW4gLSBidWZmZXJfbGVuKCZjLT5vdXRwdXQpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1jaGFubmVsX2hhbmRsZV9lZmQoQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQotewotCWNoYXIgYnVmW0NIQU5fUkJVRl07Ci0JaW50IGxlbjsKLQotLyoqIFhYWCBoYW5kbGUgZHJhaW4gZWZkLCB0b28gKi8KLQlpZiAoYy0+ZWZkICE9IC0xKSB7Ci0JCWlmIChjLT5leHRlbmRlZF91c2FnZSA9PSBDSEFOX0VYVEVOREVEX1dSSVRFICYmCi0JCSAgICBGRF9JU1NFVChjLT5lZmQsIHdyaXRlc2V0KSAmJgotCQkgICAgYnVmZmVyX2xlbigmYy0+ZXh0ZW5kZWQpID4gMCkgewotCQkJbGVuID0gd3JpdGUoYy0+ZWZkLCBidWZmZXJfcHRyKCZjLT5leHRlbmRlZCksCi0JCQkgICAgYnVmZmVyX2xlbigmYy0+ZXh0ZW5kZWQpKTsKLQkJCWRlYnVnMigiY2hhbm5lbCAlZDogd3JpdHRlbiAlZCB0byBlZmQgJWQiLAotCQkJICAgIGMtPnNlbGYsIGxlbiwgYy0+ZWZkKTsKLQkJCWlmIChsZW4gPCAwICYmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4gfHwKLQkJCSAgICBlcnJubyA9PSBFV09VTERCTE9DSykpCi0JCQkJcmV0dXJuIDE7Ci0JCQlpZiAobGVuIDw9IDApIHsKLQkJCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGNsb3Npbmcgd3JpdGUtZWZkICVkIiwKLQkJCQkgICAgYy0+c2VsZiwgYy0+ZWZkKTsKLQkJCQljaGFubmVsX2Nsb3NlX2ZkKCZjLT5lZmQpOwotCQkJfSBlbHNlIHsKLQkJCQlidWZmZXJfY29uc3VtZSgmYy0+ZXh0ZW5kZWQsIGxlbik7Ci0JCQkJYy0+bG9jYWxfY29uc3VtZWQgKz0gbGVuOwotCQkJfQotCQl9IGVsc2UgaWYgKGMtPmVmZCAhPSAtMSAmJgotCQkgICAgKGMtPmV4dGVuZGVkX3VzYWdlID09IENIQU5fRVhURU5ERURfUkVBRCB8fAotCQkgICAgYy0+ZXh0ZW5kZWRfdXNhZ2UgPT0gQ0hBTl9FWFRFTkRFRF9JR05PUkUpICYmCi0JCSAgICAoYy0+ZGV0YWNoX2Nsb3NlIHx8IEZEX0lTU0VUKGMtPmVmZCwgcmVhZHNldCkpKSB7Ci0JCQlsZW4gPSByZWFkKGMtPmVmZCwgYnVmLCBzaXplb2YoYnVmKSk7Ci0JCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHJlYWQgJWQgZnJvbSBlZmQgJWQiLAotCQkJICAgIGMtPnNlbGYsIGxlbiwgYy0+ZWZkKTsKLQkJCWlmIChsZW4gPCAwICYmIChlcnJubyA9PSBFSU5UUiB8fCAoKGVycm5vID09IEVBR0FJTiB8fAotCQkJICAgIGVycm5vID09IEVXT1VMREJMT0NLKSAmJiAhYy0+ZGV0YWNoX2Nsb3NlKSkpCi0JCQkJcmV0dXJuIDE7Ci0JCQlpZiAobGVuIDw9IDApIHsKLQkJCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGNsb3NpbmcgcmVhZC1lZmQgJWQiLAotCQkJCSAgICBjLT5zZWxmLCBjLT5lZmQpOwotCQkJCWNoYW5uZWxfY2xvc2VfZmQoJmMtPmVmZCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjLT5leHRlbmRlZF91c2FnZSA9PSBDSEFOX0VYVEVOREVEX0lHTk9SRSkgewotCQkJCQlkZWJ1ZzMoImNoYW5uZWwgJWQ6IGRpc2NhcmQgZWZkIiwKLQkJCQkJICAgIGMtPnNlbGYpOwotCQkJCX0gZWxzZQotCQkJCQlidWZmZXJfYXBwZW5kKCZjLT5leHRlbmRlZCwgYnVmLCBsZW4pOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1jaGFubmVsX2NoZWNrX3dpbmRvdyhDaGFubmVsICpjKQotewotCWlmIChjLT50eXBlID09IFNTSF9DSEFOTkVMX09QRU4gJiYKLQkgICAgIShjLT5mbGFncyAmIChDSEFOX0NMT1NFX1NFTlR8Q0hBTl9DTE9TRV9SQ1ZEKSkgJiYKLQkgICAgKChjLT5sb2NhbF93aW5kb3dfbWF4IC0gYy0+bG9jYWxfd2luZG93ID4KLQkgICAgYy0+bG9jYWxfbWF4cGFja2V0KjMpIHx8Ci0JICAgIGMtPmxvY2FsX3dpbmRvdyA8IGMtPmxvY2FsX3dpbmRvd19tYXgvMikgJiYKLQkgICAgYy0+bG9jYWxfY29uc3VtZWQgPiAwKSB7Ci0JCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX1dJTkRPV19BREpVU1QpOwotCQlwYWNrZXRfcHV0X2ludChjLT5yZW1vdGVfaWQpOwotCQlwYWNrZXRfcHV0X2ludChjLT5sb2NhbF9jb25zdW1lZCk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JCWRlYnVnMigiY2hhbm5lbCAlZDogd2luZG93ICVkIHNlbnQgYWRqdXN0ICVkIiwKLQkJICAgIGMtPnNlbGYsIGMtPmxvY2FsX3dpbmRvdywKLQkJICAgIGMtPmxvY2FsX2NvbnN1bWVkKTsKLQkJYy0+bG9jYWxfd2luZG93ICs9IGMtPmxvY2FsX2NvbnN1bWVkOwotCQljLT5sb2NhbF9jb25zdW1lZCA9IDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotY2hhbm5lbF9wb3N0X29wZW4oQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQotewotCWNoYW5uZWxfaGFuZGxlX3JmZChjLCByZWFkc2V0LCB3cml0ZXNldCk7Ci0JY2hhbm5lbF9oYW5kbGVfd2ZkKGMsIHJlYWRzZXQsIHdyaXRlc2V0KTsKLQlpZiAoIWNvbXBhdDIwKQotCQlyZXR1cm47Ci0JY2hhbm5lbF9oYW5kbGVfZWZkKGMsIHJlYWRzZXQsIHdyaXRlc2V0KTsKLQljaGFubmVsX2NoZWNrX3dpbmRvdyhjKTsKLX0KLQotc3RhdGljIHVfaW50Ci1yZWFkX211eChDaGFubmVsICpjLCB1X2ludCBuZWVkKQotewotCWNoYXIgYnVmW0NIQU5fUkJVRl07Ci0JaW50IGxlbjsKLQl1X2ludCBybGVuOwotCi0JaWYgKGJ1ZmZlcl9sZW4oJmMtPmlucHV0KSA8IG5lZWQpIHsKLQkJcmxlbiA9IG5lZWQgLSBidWZmZXJfbGVuKCZjLT5pbnB1dCk7Ci0JCWxlbiA9IHJlYWQoYy0+cmZkLCBidWYsIE1JTihybGVuLCBDSEFOX1JCVUYpKTsKLQkJaWYgKGxlbiA8PSAwKSB7Ci0JCQlpZiAoZXJybm8gIT0gRUlOVFIgJiYgZXJybm8gIT0gRUFHQUlOKSB7Ci0JCQkJZGVidWcyKCJjaGFubmVsICVkOiBjdGwgcmVhZDw9MCByZmQgJWQgbGVuICVkIiwKLQkJCQkgICAgYy0+c2VsZiwgYy0+cmZkLCBsZW4pOwotCQkJCWNoYW5fcmVhZF9mYWlsZWQoYyk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJYnVmZmVyX2FwcGVuZCgmYy0+aW5wdXQsIGJ1ZiwgbGVuKTsKLQl9Ci0JcmV0dXJuIGJ1ZmZlcl9sZW4oJmMtPmlucHV0KTsKLX0KLQotc3RhdGljIHZvaWQKLWNoYW5uZWxfcG9zdF9tdXhfY2xpZW50KENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKLXsKLQl1X2ludCBuZWVkOwotCXNzaXplX3QgbGVuOwotCi0JaWYgKCFjb21wYXQyMCkKLQkJZmF0YWwoIiVzOiBlbnRlcmVkIHdpdGggIWNvbXBhdDIwIiwgX19mdW5jX18pOwotCi0JaWYgKGMtPnJmZCAhPSAtMSAmJiAhYy0+bXV4X3BhdXNlICYmIEZEX0lTU0VUKGMtPnJmZCwgcmVhZHNldCkgJiYKLQkgICAgKGMtPmlzdGF0ZSA9PSBDSEFOX0lOUFVUX09QRU4gfHwKLQkgICAgYy0+aXN0YXRlID09IENIQU5fSU5QVVRfV0FJVF9EUkFJTikpIHsKLQkJLyoKLQkJICogRG9uJ3Qgbm90IHJlYWQgcGFzdCB0aGUgcHJlY2lzZSBlbmQgb2YgcGFja2V0cyB0bwotCQkgKiBhdm9pZCBkaXNydXB0aW5nIGZkIHBhc3NpbmcuCi0JCSAqLwotCQlpZiAocmVhZF9tdXgoYywgNCkgPCA0KSAvKiByZWFkIGhlYWRlciAqLwotCQkJcmV0dXJuOwotCQluZWVkID0gZ2V0X3UzMihidWZmZXJfcHRyKCZjLT5pbnB1dCkpOwotI2RlZmluZSBDSEFOTkVMX01VWF9NQVhfUEFDS0VUCSgyNTYgKiAxMDI0KQotCQlpZiAobmVlZCA+IENIQU5ORUxfTVVYX01BWF9QQUNLRVQpIHsKLQkJCWRlYnVnMigiY2hhbm5lbCAlZDogcGFja2V0IHRvbyBiaWcgJXUgPiAldSIsCi0JCQkgICAgYy0+c2VsZiwgQ0hBTk5FTF9NVVhfTUFYX1BBQ0tFVCwgbmVlZCk7Ci0JCQljaGFuX3JjdmRfb2Nsb3NlKGMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChyZWFkX211eChjLCBuZWVkICsgNCkgPCBuZWVkICsgNCkgLyogcmVhZCBib2R5ICovCi0JCQlyZXR1cm47Ci0JCWlmIChjLT5tdXhfcmNiKGMpICE9IDApIHsKLQkJCWRlYnVnKCJjaGFubmVsICVkOiBtdXhfcmNiIGZhaWxlZCIsIGMtPnNlbGYpOwotCQkJY2hhbl9tYXJrX2RlYWQoYyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlpZiAoYy0+d2ZkICE9IC0xICYmIEZEX0lTU0VUKGMtPndmZCwgd3JpdGVzZXQpICYmCi0JICAgIGJ1ZmZlcl9sZW4oJmMtPm91dHB1dCkgPiAwKSB7Ci0JCWxlbiA9IHdyaXRlKGMtPndmZCwgYnVmZmVyX3B0cigmYy0+b3V0cHV0KSwKLQkJICAgIGJ1ZmZlcl9sZW4oJmMtPm91dHB1dCkpOwotCQlpZiAobGVuIDwgMCAmJiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKSkKLQkJCXJldHVybjsKLQkJaWYgKGxlbiA8PSAwKSB7Ci0JCQljaGFuX21hcmtfZGVhZChjKTsKLQkJCXJldHVybjsKLQkJfQotCQlidWZmZXJfY29uc3VtZSgmYy0+b3V0cHV0LCBsZW4pOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWNoYW5uZWxfcG9zdF9tdXhfbGlzdGVuZXIoQ2hhbm5lbCAqYywgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQotewotCUNoYW5uZWwgKm5jOwotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7Ci0Jc29ja2xlbl90IGFkZHJsZW47Ci0JaW50IG5ld3NvY2s7Ci0JdWlkX3QgZXVpZDsKLQlnaWRfdCBlZ2lkOwotCi0JaWYgKCFGRF9JU1NFVChjLT5zb2NrLCByZWFkc2V0KSkKLQkJcmV0dXJuOwotCi0JZGVidWcoIm11bHRpcGxleGluZyBjb250cm9sIGNvbm5lY3Rpb24iKTsKLQotCS8qCi0JICogQWNjZXB0IGNvbm5lY3Rpb24gb24gY29udHJvbCBzb2NrZXQKLQkgKi8KLQltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0JYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKLQlpZiAoKG5ld3NvY2sgPSBhY2NlcHQoYy0+c29jaywgKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsCi0JICAgICZhZGRybGVuKSkgPT0gLTEpIHsKLQkJZXJyb3IoIiVzIGFjY2VwdDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChnZXRwZWVyZWlkKG5ld3NvY2ssICZldWlkLCAmZWdpZCkgPCAwKSB7Ci0JCWVycm9yKCIlcyBnZXRwZWVyZWlkIGZhaWxlZDogJXMiLCBfX2Z1bmNfXywKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCWNsb3NlKG5ld3NvY2spOwotCQlyZXR1cm47Ci0JfQotCWlmICgoZXVpZCAhPSAwKSAmJiAoZ2V0dWlkKCkgIT0gZXVpZCkpIHsKLQkJZXJyb3IoIm11bHRpcGxleCB1aWQgbWlzbWF0Y2g6IHBlZXIgZXVpZCAldSAhPSB1aWQgJXUiLAotCQkgICAgKHVfaW50KWV1aWQsICh1X2ludClnZXR1aWQoKSk7Ci0JCWNsb3NlKG5ld3NvY2spOwotCQlyZXR1cm47Ci0JfQotCW5jID0gY2hhbm5lbF9uZXcoIm11bHRpcGxleCBjbGllbnQiLCBTU0hfQ0hBTk5FTF9NVVhfQ0xJRU5ULAotCSAgICBuZXdzb2NrLCBuZXdzb2NrLCAtMSwgYy0+bG9jYWxfd2luZG93X21heCwKLQkgICAgYy0+bG9jYWxfbWF4cGFja2V0LCAwLCAibXV4LWNvbnRyb2wiLCAxKTsKLQluYy0+bXV4X3JjYiA9IGMtPm11eF9yY2I7Ci0JZGVidWczKCIlczogbmV3IG11eCBjaGFubmVsICVkIGZkICVkIiwgX19mdW5jX18sCi0JICAgIG5jLT5zZWxmLCBuYy0+c29jayk7Ci0JLyogZXN0YWJsaXNoIHN0YXRlICovCi0JbmMtPm11eF9yY2IobmMpOwotCS8qIG11eCBzdGF0ZSB0cmFuc2l0aW9ucyBtdXN0IG5vdCBlbGljaXQgcHJvdG9jb2wgbWVzc2FnZXMgKi8KLQluYy0+ZmxhZ3MgfD0gQ0hBTl9MT0NBTDsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1jaGFubmVsX3Bvc3Rfb3V0cHV0X2RyYWluXzEzKENoYW5uZWwgKmMsIGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKLXsKLQlpbnQgbGVuOwotCi0JLyogU2VuZCBidWZmZXJlZCBvdXRwdXQgZGF0YSB0byB0aGUgc29ja2V0LiAqLwotCWlmIChGRF9JU1NFVChjLT5zb2NrLCB3cml0ZXNldCkgJiYgYnVmZmVyX2xlbigmYy0+b3V0cHV0KSA+IDApIHsKLQkJbGVuID0gd3JpdGUoYy0+c29jaywgYnVmZmVyX3B0cigmYy0+b3V0cHV0KSwKLQkJCSAgICBidWZmZXJfbGVuKCZjLT5vdXRwdXQpKTsKLQkJaWYgKGxlbiA8PSAwKQotCQkJYnVmZmVyX2NsZWFyKCZjLT5vdXRwdXQpOwotCQllbHNlCi0JCQlidWZmZXJfY29uc3VtZSgmYy0+b3V0cHV0LCBsZW4pOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWNoYW5uZWxfaGFuZGxlcl9pbml0XzIwKHZvaWQpCi17Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfT1BFTl0gPQkJCSZjaGFubmVsX3ByZV9vcGVuOwotCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX1gxMV9PUEVOXSA9CQkmY2hhbm5lbF9wcmVfeDExX29wZW47Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfUE9SVF9MSVNURU5FUl0gPQkmY2hhbm5lbF9wcmVfbGlzdGVuZXI7Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfUlBPUlRfTElTVEVORVJdID0JJmNoYW5uZWxfcHJlX2xpc3RlbmVyOwotCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX1gxMV9MSVNURU5FUl0gPQkJJmNoYW5uZWxfcHJlX2xpc3RlbmVyOwotCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX0FVVEhfU09DS0VUXSA9CQkmY2hhbm5lbF9wcmVfbGlzdGVuZXI7Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfQ09OTkVDVElOR10gPQkJJmNoYW5uZWxfcHJlX2Nvbm5lY3Rpbmc7Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfRFlOQU1JQ10gPQkJJmNoYW5uZWxfcHJlX2R5bmFtaWM7Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfTVVYX0xJU1RFTkVSXSA9CQkmY2hhbm5lbF9wcmVfbGlzdGVuZXI7Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfTVVYX0NMSUVOVF0gPQkJJmNoYW5uZWxfcHJlX211eF9jbGllbnQ7Ci0KLQljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfT1BFTl0gPQkJJmNoYW5uZWxfcG9zdF9vcGVuOwotCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9QT1JUX0xJU1RFTkVSXSA9CSZjaGFubmVsX3Bvc3RfcG9ydF9saXN0ZW5lcjsKLQljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfUlBPUlRfTElTVEVORVJdID0JJmNoYW5uZWxfcG9zdF9wb3J0X2xpc3RlbmVyOwotCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9YMTFfTElTVEVORVJdID0JJmNoYW5uZWxfcG9zdF94MTFfbGlzdGVuZXI7Ci0JY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX0FVVEhfU09DS0VUXSA9CQkmY2hhbm5lbF9wb3N0X2F1dGhfbGlzdGVuZXI7Ci0JY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX0NPTk5FQ1RJTkddID0JCSZjaGFubmVsX3Bvc3RfY29ubmVjdGluZzsKLQljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfRFlOQU1JQ10gPQkJJmNoYW5uZWxfcG9zdF9vcGVuOwotCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9NVVhfTElTVEVORVJdID0JJmNoYW5uZWxfcG9zdF9tdXhfbGlzdGVuZXI7Ci0JY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX01VWF9DTElFTlRdID0JCSZjaGFubmVsX3Bvc3RfbXV4X2NsaWVudDsKLX0KLQotc3RhdGljIHZvaWQKLWNoYW5uZWxfaGFuZGxlcl9pbml0XzEzKHZvaWQpCi17Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfT1BFTl0gPQkJCSZjaGFubmVsX3ByZV9vcGVuXzEzOwotCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX1gxMV9PUEVOXSA9CQkmY2hhbm5lbF9wcmVfeDExX29wZW5fMTM7Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfWDExX0xJU1RFTkVSXSA9CQkmY2hhbm5lbF9wcmVfbGlzdGVuZXI7Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfUE9SVF9MSVNURU5FUl0gPQkmY2hhbm5lbF9wcmVfbGlzdGVuZXI7Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfQVVUSF9TT0NLRVRdID0JCSZjaGFubmVsX3ByZV9saXN0ZW5lcjsKLQljaGFubmVsX3ByZVtTU0hfQ0hBTk5FTF9JTlBVVF9EUkFJTklOR10gPQkmY2hhbm5lbF9wcmVfaW5wdXRfZHJhaW5pbmc7Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfT1VUUFVUX0RSQUlOSU5HXSA9CSZjaGFubmVsX3ByZV9vdXRwdXRfZHJhaW5pbmc7Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfQ09OTkVDVElOR10gPQkJJmNoYW5uZWxfcHJlX2Nvbm5lY3Rpbmc7Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfRFlOQU1JQ10gPQkJJmNoYW5uZWxfcHJlX2R5bmFtaWM7Ci0KLQljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfT1BFTl0gPQkJJmNoYW5uZWxfcG9zdF9vcGVuOwotCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9YMTFfTElTVEVORVJdID0JJmNoYW5uZWxfcG9zdF94MTFfbGlzdGVuZXI7Ci0JY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX1BPUlRfTElTVEVORVJdID0JJmNoYW5uZWxfcG9zdF9wb3J0X2xpc3RlbmVyOwotCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9BVVRIX1NPQ0tFVF0gPQkJJmNoYW5uZWxfcG9zdF9hdXRoX2xpc3RlbmVyOwotCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9PVVRQVVRfRFJBSU5JTkddID0JJmNoYW5uZWxfcG9zdF9vdXRwdXRfZHJhaW5fMTM7Ci0JY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX0NPTk5FQ1RJTkddID0JCSZjaGFubmVsX3Bvc3RfY29ubmVjdGluZzsKLQljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfRFlOQU1JQ10gPQkJJmNoYW5uZWxfcG9zdF9vcGVuOwotfQotCi1zdGF0aWMgdm9pZAotY2hhbm5lbF9oYW5kbGVyX2luaXRfMTUodm9pZCkKLXsKLQljaGFubmVsX3ByZVtTU0hfQ0hBTk5FTF9PUEVOXSA9CQkJJmNoYW5uZWxfcHJlX29wZW47Ci0JY2hhbm5lbF9wcmVbU1NIX0NIQU5ORUxfWDExX09QRU5dID0JCSZjaGFubmVsX3ByZV94MTFfb3BlbjsKLQljaGFubmVsX3ByZVtTU0hfQ0hBTk5FTF9YMTFfTElTVEVORVJdID0JCSZjaGFubmVsX3ByZV9saXN0ZW5lcjsKLQljaGFubmVsX3ByZVtTU0hfQ0hBTk5FTF9QT1JUX0xJU1RFTkVSXSA9CSZjaGFubmVsX3ByZV9saXN0ZW5lcjsKLQljaGFubmVsX3ByZVtTU0hfQ0hBTk5FTF9BVVRIX1NPQ0tFVF0gPQkJJmNoYW5uZWxfcHJlX2xpc3RlbmVyOwotCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX0NPTk5FQ1RJTkddID0JCSZjaGFubmVsX3ByZV9jb25uZWN0aW5nOwotCWNoYW5uZWxfcHJlW1NTSF9DSEFOTkVMX0RZTkFNSUNdID0JCSZjaGFubmVsX3ByZV9keW5hbWljOwotCi0JY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX1gxMV9MSVNURU5FUl0gPQkmY2hhbm5lbF9wb3N0X3gxMV9saXN0ZW5lcjsKLQljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfUE9SVF9MSVNURU5FUl0gPQkmY2hhbm5lbF9wb3N0X3BvcnRfbGlzdGVuZXI7Ci0JY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX0FVVEhfU09DS0VUXSA9CQkmY2hhbm5lbF9wb3N0X2F1dGhfbGlzdGVuZXI7Ci0JY2hhbm5lbF9wb3N0W1NTSF9DSEFOTkVMX09QRU5dID0JCSZjaGFubmVsX3Bvc3Rfb3BlbjsKLQljaGFubmVsX3Bvc3RbU1NIX0NIQU5ORUxfQ09OTkVDVElOR10gPQkJJmNoYW5uZWxfcG9zdF9jb25uZWN0aW5nOwotCWNoYW5uZWxfcG9zdFtTU0hfQ0hBTk5FTF9EWU5BTUlDXSA9CQkmY2hhbm5lbF9wb3N0X29wZW47Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGFubmVsX2hhbmRsZXJfaW5pdCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IFNTSF9DSEFOTkVMX01BWF9UWVBFOyBpKyspIHsKLQkJY2hhbm5lbF9wcmVbaV0gPSBOVUxMOwotCQljaGFubmVsX3Bvc3RbaV0gPSBOVUxMOwotCX0KLQlpZiAoY29tcGF0MjApCi0JCWNoYW5uZWxfaGFuZGxlcl9pbml0XzIwKCk7Ci0JZWxzZSBpZiAoY29tcGF0MTMpCi0JCWNoYW5uZWxfaGFuZGxlcl9pbml0XzEzKCk7Ci0JZWxzZQotCQljaGFubmVsX2hhbmRsZXJfaW5pdF8xNSgpOwotfQotCi0vKiBnYyBkZWFkIGNoYW5uZWxzICovCi1zdGF0aWMgdm9pZAotY2hhbm5lbF9nYXJiYWdlX2NvbGxlY3QoQ2hhbm5lbCAqYykKLXsKLQlpZiAoYyA9PSBOVUxMKQotCQlyZXR1cm47Ci0JaWYgKGMtPmRldGFjaF91c2VyICE9IE5VTEwpIHsKLQkJaWYgKCFjaGFuX2lzX2RlYWQoYywgYy0+ZGV0YWNoX2Nsb3NlKSkKLQkJCXJldHVybjsKLQkJZGVidWcyKCJjaGFubmVsICVkOiBnYzogbm90aWZ5IHVzZXIiLCBjLT5zZWxmKTsKLQkJYy0+ZGV0YWNoX3VzZXIoYy0+c2VsZiwgTlVMTCk7Ci0JCS8qIGlmIHdlIHN0aWxsIGhhdmUgYSBjYWxsYmFjayAqLwotCQlpZiAoYy0+ZGV0YWNoX3VzZXIgIT0gTlVMTCkKLQkJCXJldHVybjsKLQkJZGVidWcyKCJjaGFubmVsICVkOiBnYzogdXNlciBkZXRhY2hlZCIsIGMtPnNlbGYpOwotCX0KLQlpZiAoIWNoYW5faXNfZGVhZChjLCAxKSkKLQkJcmV0dXJuOwotCWRlYnVnMigiY2hhbm5lbCAlZDogZ2FyYmFnZSBjb2xsZWN0aW5nIiwgYy0+c2VsZik7Ci0JY2hhbm5lbF9mcmVlKGMpOwotfQotCi1zdGF0aWMgdm9pZAotY2hhbm5lbF9oYW5kbGVyKGNoYW5fZm4gKmZ0YWJbXSwgZmRfc2V0ICpyZWFkc2V0LCBmZF9zZXQgKndyaXRlc2V0KQotewotCXN0YXRpYyBpbnQgZGlkX2luaXQgPSAwOwotCXVfaW50IGksIG9hbGxvYzsKLQlDaGFubmVsICpjOwotCi0JaWYgKCFkaWRfaW5pdCkgewotCQljaGFubmVsX2hhbmRsZXJfaW5pdCgpOwotCQlkaWRfaW5pdCA9IDE7Ci0JfQotCWZvciAoaSA9IDAsIG9hbGxvYyA9IGNoYW5uZWxzX2FsbG9jOyBpIDwgb2FsbG9jOyBpKyspIHsKLQkJYyA9IGNoYW5uZWxzW2ldOwotCQlpZiAoYyA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCWlmIChjLT5kZWxheWVkKSB7Ci0JCQlpZiAoZnRhYiA9PSBjaGFubmVsX3ByZSkKLQkJCQljLT5kZWxheWVkID0gMDsKLQkJCWVsc2UKLQkJCQljb250aW51ZTsKLQkJfQotCQlpZiAoZnRhYltjLT50eXBlXSAhPSBOVUxMKQotCQkJKCpmdGFiW2MtPnR5cGVdKShjLCByZWFkc2V0LCB3cml0ZXNldCk7Ci0JCWNoYW5uZWxfZ2FyYmFnZV9jb2xsZWN0KGMpOwotCX0KLX0KLQotLyoKLSAqIEFsbG9jYXRlL3VwZGF0ZSBzZWxlY3QgYml0bWFza3MgYW5kIGFkZCBhbnkgYml0cyByZWxldmFudCB0byBjaGFubmVscyBpbgotICogc2VsZWN0IGJpdG1hc2tzLgotICovCi12b2lkCi1jaGFubmVsX3ByZXBhcmVfc2VsZWN0KGZkX3NldCAqKnJlYWRzZXRwLCBmZF9zZXQgKip3cml0ZXNldHAsIGludCAqbWF4ZmRwLAotICAgIHVfaW50ICpuYWxsb2NwLCBpbnQgcmVrZXlpbmcpCi17Ci0JdV9pbnQgbiwgc3osIG5mZHNldDsKLQotCW4gPSBNQVgoKm1heGZkcCwgY2hhbm5lbF9tYXhfZmQpOwotCi0JbmZkc2V0ID0gaG93bWFueShuKzEsIE5GREJJVFMpOwotCS8qIEV4cGxpY2l0bHkgdGVzdCBoZXJlLCBiZWNhdXNlIHhyZWFsbG9jIGlzbid0IGFsd2F5cyBjYWxsZWQgKi8KLQlpZiAobmZkc2V0ICYmIFNJWkVfVF9NQVggLyBuZmRzZXQgPCBzaXplb2YoZmRfbWFzaykpCi0JCWZhdGFsKCJjaGFubmVsX3ByZXBhcmVfc2VsZWN0OiBtYXhfZmQgKCVkKSBpcyB0b28gbGFyZ2UiLCBuKTsKLQlzeiA9IG5mZHNldCAqIHNpemVvZihmZF9tYXNrKTsKLQotCS8qIHBlcmhhcHMgY2hlY2sgc3ogPCBuYWxsb2MvMiBhbmQgc2hyaW5rPyAqLwotCWlmICgqcmVhZHNldHAgPT0gTlVMTCB8fCBzeiA+ICpuYWxsb2NwKSB7Ci0JCSpyZWFkc2V0cCA9IHhyZWFsbG9jKCpyZWFkc2V0cCwgbmZkc2V0LCBzaXplb2YoZmRfbWFzaykpOwotCQkqd3JpdGVzZXRwID0geHJlYWxsb2MoKndyaXRlc2V0cCwgbmZkc2V0LCBzaXplb2YoZmRfbWFzaykpOwotCQkqbmFsbG9jcCA9IHN6OwotCX0KLQkqbWF4ZmRwID0gbjsKLQltZW1zZXQoKnJlYWRzZXRwLCAwLCBzeik7Ci0JbWVtc2V0KCp3cml0ZXNldHAsIDAsIHN6KTsKLQotCWlmICghcmVrZXlpbmcpCi0JCWNoYW5uZWxfaGFuZGxlcihjaGFubmVsX3ByZSwgKnJlYWRzZXRwLCAqd3JpdGVzZXRwKTsKLX0KLQotLyoKLSAqIEFmdGVyIHNlbGVjdCwgcGVyZm9ybSBhbnkgYXBwcm9wcmlhdGUgb3BlcmF0aW9ucyBmb3IgY2hhbm5lbHMgd2hpY2ggaGF2ZQotICogZXZlbnRzIHBlbmRpbmcuCi0gKi8KLXZvaWQKLWNoYW5uZWxfYWZ0ZXJfc2VsZWN0KGZkX3NldCAqcmVhZHNldCwgZmRfc2V0ICp3cml0ZXNldCkKLXsKLQljaGFubmVsX2hhbmRsZXIoY2hhbm5lbF9wb3N0LCByZWFkc2V0LCB3cml0ZXNldCk7Ci19Ci0KLQotLyogSWYgdGhlcmUgaXMgZGF0YSB0byBzZW5kIHRvIHRoZSBjb25uZWN0aW9uLCBlbnF1ZXVlIHNvbWUgb2YgaXQgbm93LiAqLwotdm9pZAotY2hhbm5lbF9vdXRwdXRfcG9sbCh2b2lkKQotewotCUNoYW5uZWwgKmM7Ci0JdV9pbnQgaSwgbGVuOwotCi0JZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzX2FsbG9jOyBpKyspIHsKLQkJYyA9IGNoYW5uZWxzW2ldOwotCQlpZiAoYyA9PSBOVUxMKQotCQkJY29udGludWU7Ci0KLQkJLyoKLQkJICogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBjaGFubmVscyB0aGF0IGNhbiBoYXZlIGJ1ZmZlcmVkCi0JCSAqIGluY29taW5nIGRhdGEuCi0JCSAqLwotCQlpZiAoY29tcGF0MTMpIHsKLQkJCWlmIChjLT50eXBlICE9IFNTSF9DSEFOTkVMX09QRU4gJiYKLQkJCSAgICBjLT50eXBlICE9IFNTSF9DSEFOTkVMX0lOUFVUX0RSQUlOSU5HKQotCQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgewotCQkJaWYgKGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfT1BFTikKLQkJCQljb250aW51ZTsKLQkJfQotCQlpZiAoY29tcGF0MjAgJiYKLQkJICAgIChjLT5mbGFncyAmIChDSEFOX0NMT1NFX1NFTlR8Q0hBTl9DTE9TRV9SQ1ZEKSkpIHsKLQkJCS8qIFhYWCBpcyB0aGlzIHRydWU/ICovCi0JCQlkZWJ1ZzMoImNoYW5uZWwgJWQ6IHdpbGwgbm90IHNlbmQgZGF0YSBhZnRlciBjbG9zZSIsIGMtPnNlbGYpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBHZXQgdGhlIGFtb3VudCBvZiBidWZmZXJlZCBkYXRhIGZvciB0aGlzIGNoYW5uZWwuICovCi0JCWlmICgoYy0+aXN0YXRlID09IENIQU5fSU5QVVRfT1BFTiB8fAotCQkgICAgYy0+aXN0YXRlID09IENIQU5fSU5QVVRfV0FJVF9EUkFJTikgJiYKLQkJICAgIChsZW4gPSBidWZmZXJfbGVuKCZjLT5pbnB1dCkpID4gMCkgewotCQkJaWYgKGMtPmRhdGFncmFtKSB7Ci0JCQkJaWYgKGxlbiA+IDApIHsKLQkJCQkJdV9jaGFyICpkYXRhOwotCQkJCQl1X2ludCBkbGVuOwotCi0JCQkJCWRhdGEgPSBidWZmZXJfZ2V0X3N0cmluZygmYy0+aW5wdXQsCi0JCQkJCSAgICAmZGxlbik7Ci0JCQkJCWlmIChkbGVuID4gYy0+cmVtb3RlX3dpbmRvdyB8fAotCQkJCQkgICAgZGxlbiA+IGMtPnJlbW90ZV9tYXhwYWNrZXQpIHsKLQkJCQkJCWRlYnVnKCJjaGFubmVsICVkOiBkYXRhZ3JhbSAiCi0JCQkJCQkgICAgInRvbyBiaWcgZm9yIGNoYW5uZWwiLAotCQkJCQkJICAgIGMtPnNlbGYpOwotCQkJCQkJeGZyZWUoZGF0YSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfQ0hBTk5FTF9EQVRBKTsKLQkJCQkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKLQkJCQkJcGFja2V0X3B1dF9zdHJpbmcoZGF0YSwgZGxlbik7Ci0JCQkJCXBhY2tldF9zZW5kKCk7Ci0JCQkJCWMtPnJlbW90ZV93aW5kb3cgLT0gZGxlbiArIDQ7Ci0JCQkJCXhmcmVlKGRhdGEpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8qCi0JCQkgKiBTZW5kIHNvbWUgZGF0YSBmb3IgdGhlIG90aGVyIHNpZGUgb3ZlciB0aGUgc2VjdXJlCi0JCQkgKiBjb25uZWN0aW9uLgotCQkJICovCi0JCQlpZiAoY29tcGF0MjApIHsKLQkJCQlpZiAobGVuID4gYy0+cmVtb3RlX3dpbmRvdykKLQkJCQkJbGVuID0gYy0+cmVtb3RlX3dpbmRvdzsKLQkJCQlpZiAobGVuID4gYy0+cmVtb3RlX21heHBhY2tldCkKLQkJCQkJbGVuID0gYy0+cmVtb3RlX21heHBhY2tldDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBhY2tldF9pc19pbnRlcmFjdGl2ZSgpKSB7Ci0JCQkJCWlmIChsZW4gPiAxMDI0KQotCQkJCQkJbGVuID0gNTEyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIEtlZXAgdGhlIHBhY2tldHMgYXQgcmVhc29uYWJsZSBzaXplLiAqLwotCQkJCQlpZiAobGVuID4gcGFja2V0X2dldF9tYXhzaXplKCkvMikKLQkJCQkJCWxlbiA9IHBhY2tldF9nZXRfbWF4c2l6ZSgpLzI7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGxlbiA+IDApIHsKLQkJCQlwYWNrZXRfc3RhcnQoY29tcGF0MjAgPwotCQkJCSAgICBTU0gyX01TR19DSEFOTkVMX0RBVEEgOiBTU0hfTVNHX0NIQU5ORUxfREFUQSk7Ci0JCQkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKLQkJCQlwYWNrZXRfcHV0X3N0cmluZyhidWZmZXJfcHRyKCZjLT5pbnB1dCksIGxlbik7Ci0JCQkJcGFja2V0X3NlbmQoKTsKLQkJCQlidWZmZXJfY29uc3VtZSgmYy0+aW5wdXQsIGxlbik7Ci0JCQkJYy0+cmVtb3RlX3dpbmRvdyAtPSBsZW47Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoYy0+aXN0YXRlID09IENIQU5fSU5QVVRfV0FJVF9EUkFJTikgewotCQkJaWYgKGNvbXBhdDEzKQotCQkJCWZhdGFsKCJjYW5ub3QgaGFwcGVuOiBpc3RhdGUgPT0gSU5QVVRfV0FJVF9EUkFJTiBmb3IgcHJvdG8gMS4zIik7Ci0JCQkvKgotCQkJICogaW5wdXQtYnVmZmVyIGlzIGVtcHR5IGFuZCByZWFkLXNvY2tldCBzaHV0ZG93bjoKLQkJCSAqIHRlbGwgcGVlciwgdGhhdCB3ZSB3aWxsIG5vdCBzZW5kIG1vcmUgZGF0YTogc2VuZCBJRU9GLgotCQkJICogaGFjayBmb3IgZXh0ZW5kZWQgZGF0YTogZGVsYXkgRU9GIGlmIEVGRCBzdGlsbCBpbiB1c2UuCi0JCQkgKi8KLQkJCWlmIChDSEFOTkVMX0VGRF9JTlBVVF9BQ1RJVkUoYykpCi0JCQkJZGVidWcyKCJjaGFubmVsICVkOiBpYnVmX2VtcHR5IGRlbGF5ZWQgZWZkICVkLyglZCkiLAotCQkJCSAgICBjLT5zZWxmLCBjLT5lZmQsIGJ1ZmZlcl9sZW4oJmMtPmV4dGVuZGVkKSk7Ci0JCQllbHNlCi0JCQkJY2hhbl9pYnVmX2VtcHR5KGMpOwotCQl9Ci0JCS8qIFNlbmQgZXh0ZW5kZWQgZGF0YSwgaS5lLiBzdGRlcnIgKi8KLQkJaWYgKGNvbXBhdDIwICYmCi0JCSAgICAhKGMtPmZsYWdzICYgQ0hBTl9FT0ZfU0VOVCkgJiYKLQkJICAgIGMtPnJlbW90ZV93aW5kb3cgPiAwICYmCi0JCSAgICAobGVuID0gYnVmZmVyX2xlbigmYy0+ZXh0ZW5kZWQpKSA+IDAgJiYKLQkJICAgIGMtPmV4dGVuZGVkX3VzYWdlID09IENIQU5fRVhURU5ERURfUkVBRCkgewotCQkJZGVidWcyKCJjaGFubmVsICVkOiByd2luICV1IGVsZW4gJXUgZXVzZSAlZCIsCi0JCQkgICAgYy0+c2VsZiwgYy0+cmVtb3RlX3dpbmRvdywgYnVmZmVyX2xlbigmYy0+ZXh0ZW5kZWQpLAotCQkJICAgIGMtPmV4dGVuZGVkX3VzYWdlKTsKLQkJCWlmIChsZW4gPiBjLT5yZW1vdGVfd2luZG93KQotCQkJCWxlbiA9IGMtPnJlbW90ZV93aW5kb3c7Ci0JCQlpZiAobGVuID4gYy0+cmVtb3RlX21heHBhY2tldCkKLQkJCQlsZW4gPSBjLT5yZW1vdGVfbWF4cGFja2V0OwotCQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0NIQU5ORUxfRVhURU5ERURfREFUQSk7Ci0JCQlwYWNrZXRfcHV0X2ludChjLT5yZW1vdGVfaWQpOwotCQkJcGFja2V0X3B1dF9pbnQoU1NIMl9FWFRFTkRFRF9EQVRBX1NUREVSUik7Ci0JCQlwYWNrZXRfcHV0X3N0cmluZyhidWZmZXJfcHRyKCZjLT5leHRlbmRlZCksIGxlbik7Ci0JCQlwYWNrZXRfc2VuZCgpOwotCQkJYnVmZmVyX2NvbnN1bWUoJmMtPmV4dGVuZGVkLCBsZW4pOwotCQkJYy0+cmVtb3RlX3dpbmRvdyAtPSBsZW47Ci0JCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHNlbnQgZXh0IGRhdGEgJWQiLCBjLT5zZWxmLCBsZW4pOwotCQl9Ci0JfQotfQotCi0KLS8qIC0tIHByb3RvY29sIGlucHV0ICovCi0KLS8qIEFSR1NVU0VEICovCi12b2lkCi1jaGFubmVsX2lucHV0X2RhdGEoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JaW50IGlkOwotCWNoYXIgKmRhdGE7Ci0JdV9pbnQgZGF0YV9sZW4sIHdpbl9sZW47Ci0JQ2hhbm5lbCAqYzsKLQotCS8qIEdldCB0aGUgY2hhbm5lbCBudW1iZXIgYW5kIHZlcmlmeSBpdC4gKi8KLQlpZCA9IHBhY2tldF9nZXRfaW50KCk7Ci0JYyA9IGNoYW5uZWxfbG9va3VwKGlkKTsKLQlpZiAoYyA9PSBOVUxMKQotCQlwYWNrZXRfZGlzY29ubmVjdCgiUmVjZWl2ZWQgZGF0YSBmb3Igbm9uZXhpc3RlbnQgY2hhbm5lbCAlZC4iLCBpZCk7Ci0KLQkvKiBJZ25vcmUgYW55IGRhdGEgZm9yIG5vbi1vcGVuIGNoYW5uZWxzIChtaWdodCBoYXBwZW4gb24gY2xvc2UpICovCi0JaWYgKGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfT1BFTiAmJgotCSAgICBjLT50eXBlICE9IFNTSF9DSEFOTkVMX1gxMV9PUEVOKQotCQlyZXR1cm47Ci0KLQkvKiBHZXQgdGhlIGRhdGEuICovCi0JZGF0YSA9IHBhY2tldF9nZXRfc3RyaW5nX3B0cigmZGF0YV9sZW4pOwotCXdpbl9sZW4gPSBkYXRhX2xlbjsKLQlpZiAoYy0+ZGF0YWdyYW0pCi0JCXdpbl9sZW4gKz0gNDsgIC8qIHN0cmluZyBsZW5ndGggaGVhZGVyICovCi0KLQkvKgotCSAqIElnbm9yZSBkYXRhIGZvciBwcm90b2NvbCA+IDEuMyBpZiBvdXRwdXQgZW5kIGlzIG5vIGxvbmdlciBvcGVuLgotCSAqIEZvciBwcm90b2NvbCAyIHRoZSBzZW5kaW5nIHNpZGUgaXMgcmVkdWNpbmcgaXRzIHdpbmRvdyBhcyBpdCBzZW5kcwotCSAqIGRhdGEsIHNvIHdlIG11c3QgJ2Zha2UnIGNvbnN1bXB0aW9uIG9mIHRoZSBkYXRhIGluIG9yZGVyIHRvIGVuc3VyZQotCSAqIHRoYXQgd2luZG93IHVwZGF0ZXMgYXJlIHNlbnQgYmFjay4gIE90aGVyd2lzZSB0aGUgY29ubmVjdGlvbiBtaWdodAotCSAqIGRlYWRsb2NrLgotCSAqLwotCWlmICghY29tcGF0MTMgJiYgYy0+b3N0YXRlICE9IENIQU5fT1VUUFVUX09QRU4pIHsKLQkJaWYgKGNvbXBhdDIwKSB7Ci0JCQljLT5sb2NhbF93aW5kb3cgLT0gd2luX2xlbjsKLQkJCWMtPmxvY2FsX2NvbnN1bWVkICs9IHdpbl9sZW47Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWlmIChjb21wYXQyMCkgewotCQlpZiAod2luX2xlbiA+IGMtPmxvY2FsX21heHBhY2tldCkgewotCQkJbG9naXQoImNoYW5uZWwgJWQ6IHJjdmQgYmlnIHBhY2tldCAlZCwgbWF4cGFjayAlZCIsCi0JCQkgICAgYy0+c2VsZiwgd2luX2xlbiwgYy0+bG9jYWxfbWF4cGFja2V0KTsKLQkJfQotCQlpZiAod2luX2xlbiA+IGMtPmxvY2FsX3dpbmRvdykgewotCQkJbG9naXQoImNoYW5uZWwgJWQ6IHJjdmQgdG9vIG11Y2ggZGF0YSAlZCwgd2luICVkIiwKLQkJCSAgICBjLT5zZWxmLCB3aW5fbGVuLCBjLT5sb2NhbF93aW5kb3cpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWMtPmxvY2FsX3dpbmRvdyAtPSB3aW5fbGVuOwotCX0KLQlpZiAoYy0+ZGF0YWdyYW0pCi0JCWJ1ZmZlcl9wdXRfc3RyaW5nKCZjLT5vdXRwdXQsIGRhdGEsIGRhdGFfbGVuKTsKLQllbHNlCi0JCWJ1ZmZlcl9hcHBlbmQoJmMtPm91dHB1dCwgZGF0YSwgZGF0YV9sZW4pOwotCXBhY2tldF9jaGVja19lb20oKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQKLWNoYW5uZWxfaW5wdXRfZXh0ZW5kZWRfZGF0YShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlpbnQgaWQ7Ci0JY2hhciAqZGF0YTsKLQl1X2ludCBkYXRhX2xlbiwgdGNvZGU7Ci0JQ2hhbm5lbCAqYzsKLQotCS8qIEdldCB0aGUgY2hhbm5lbCBudW1iZXIgYW5kIHZlcmlmeSBpdC4gKi8KLQlpZCA9IHBhY2tldF9nZXRfaW50KCk7Ci0JYyA9IGNoYW5uZWxfbG9va3VwKGlkKTsKLQotCWlmIChjID09IE5VTEwpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJSZWNlaXZlZCBleHRlbmRlZF9kYXRhIGZvciBiYWQgY2hhbm5lbCAlZC4iLCBpZCk7Ci0JaWYgKGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfT1BFTikgewotCQlsb2dpdCgiY2hhbm5lbCAlZDogZXh0IGRhdGEgZm9yIG5vbiBvcGVuIiwgaWQpOwotCQlyZXR1cm47Ci0JfQotCWlmIChjLT5mbGFncyAmIENIQU5fRU9GX1JDVkQpIHsKLQkJaWYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19FWFRFT0YpCi0JCQlkZWJ1ZygiY2hhbm5lbCAlZDogYWNjZXB0aW5nIGV4dCBkYXRhIGFmdGVyIGVvZiIsIGlkKTsKLQkJZWxzZQotCQkJcGFja2V0X2Rpc2Nvbm5lY3QoIlJlY2VpdmVkIGV4dGVuZGVkX2RhdGEgYWZ0ZXIgRU9GICIKLQkJCSAgICAib24gY2hhbm5lbCAlZC4iLCBpZCk7Ci0JfQotCXRjb2RlID0gcGFja2V0X2dldF9pbnQoKTsKLQlpZiAoYy0+ZWZkID09IC0xIHx8Ci0JICAgIGMtPmV4dGVuZGVkX3VzYWdlICE9IENIQU5fRVhURU5ERURfV1JJVEUgfHwKLQkgICAgdGNvZGUgIT0gU1NIMl9FWFRFTkRFRF9EQVRBX1NUREVSUikgewotCQlsb2dpdCgiY2hhbm5lbCAlZDogYmFkIGV4dCBkYXRhIiwgYy0+c2VsZik7Ci0JCXJldHVybjsKLQl9Ci0JZGF0YSA9IHBhY2tldF9nZXRfc3RyaW5nKCZkYXRhX2xlbik7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCWlmIChkYXRhX2xlbiA+IGMtPmxvY2FsX3dpbmRvdykgewotCQlsb2dpdCgiY2hhbm5lbCAlZDogcmN2ZCB0b28gbXVjaCBleHRlbmRlZF9kYXRhICVkLCB3aW4gJWQiLAotCQkgICAgYy0+c2VsZiwgZGF0YV9sZW4sIGMtPmxvY2FsX3dpbmRvdyk7Ci0JCXhmcmVlKGRhdGEpOwotCQlyZXR1cm47Ci0JfQotCWRlYnVnMigiY2hhbm5lbCAlZDogcmN2ZCBleHQgZGF0YSAlZCIsIGMtPnNlbGYsIGRhdGFfbGVuKTsKLQljLT5sb2NhbF93aW5kb3cgLT0gZGF0YV9sZW47Ci0JYnVmZmVyX2FwcGVuZCgmYy0+ZXh0ZW5kZWQsIGRhdGEsIGRhdGFfbGVuKTsKLQl4ZnJlZShkYXRhKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQKLWNoYW5uZWxfaW5wdXRfaWVvZihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlpbnQgaWQ7Ci0JQ2hhbm5lbCAqYzsKLQotCWlkID0gcGFja2V0X2dldF9pbnQoKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0JYyA9IGNoYW5uZWxfbG9va3VwKGlkKTsKLQlpZiAoYyA9PSBOVUxMKQotCQlwYWNrZXRfZGlzY29ubmVjdCgiUmVjZWl2ZWQgaWVvZiBmb3Igbm9uZXhpc3RlbnQgY2hhbm5lbCAlZC4iLCBpZCk7Ci0JY2hhbl9yY3ZkX2llb2YoYyk7Ci0KLQkvKiBYWFggZm9yY2UgaW5wdXQgY2xvc2UgKi8KLQlpZiAoYy0+Zm9yY2VfZHJhaW4gJiYgYy0+aXN0YXRlID09IENIQU5fSU5QVVRfT1BFTikgewotCQlkZWJ1ZygiY2hhbm5lbCAlZDogRk9SQ0UgaW5wdXQgZHJhaW4iLCBjLT5zZWxmKTsKLQkJYy0+aXN0YXRlID0gQ0hBTl9JTlBVVF9XQUlUX0RSQUlOOwotCQlpZiAoYnVmZmVyX2xlbigmYy0+aW5wdXQpID09IDApCi0JCQljaGFuX2lidWZfZW1wdHkoYyk7Ci0JfQotCi19Ci0KLS8qIEFSR1NVU0VEICovCi12b2lkCi1jaGFubmVsX2lucHV0X2Nsb3NlKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQotewotCWludCBpZDsKLQlDaGFubmVsICpjOwotCi0JaWQgPSBwYWNrZXRfZ2V0X2ludCgpOwotCXBhY2tldF9jaGVja19lb20oKTsKLQljID0gY2hhbm5lbF9sb29rdXAoaWQpOwotCWlmIChjID09IE5VTEwpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJSZWNlaXZlZCBjbG9zZSBmb3Igbm9uZXhpc3RlbnQgY2hhbm5lbCAlZC4iLCBpZCk7Ci0KLQkvKgotCSAqIFNlbmQgYSBjb25maXJtYXRpb24gdGhhdCB3ZSBoYXZlIGNsb3NlZCB0aGUgY2hhbm5lbCBhbmQgbm8gbW9yZQotCSAqIGRhdGEgaXMgY29taW5nIGZvciBpdC4KLQkgKi8KLQlwYWNrZXRfc3RhcnQoU1NIX01TR19DSEFOTkVMX0NMT1NFX0NPTkZJUk1BVElPTik7Ci0JcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKLQlwYWNrZXRfc2VuZCgpOwotCi0JLyoKLQkgKiBJZiB0aGUgY2hhbm5lbCBpcyBpbiBjbG9zZWQgc3RhdGUsIHdlIGhhdmUgc2VudCBhIGNsb3NlIHJlcXVlc3QsCi0JICogYW5kIHRoZSBvdGhlciBzaWRlIHdpbGwgZXZlbnR1YWxseSByZXNwb25kIHdpdGggYSBjb25maXJtYXRpb24uCi0JICogVGh1cywgd2UgY2Fubm90IGZyZWUgdGhlIGNoYW5uZWwgaGVyZSwgYmVjYXVzZSB0aGVuIHRoZXJlIHdvdWxkIGJlCi0JICogbm8tb25lIHRvIHJlY2VpdmUgdGhlIGNvbmZpcm1hdGlvbi4gIFRoZSBjaGFubmVsIGdldHMgZnJlZWQgd2hlbgotCSAqIHRoZSBjb25maXJtYXRpb24gYXJyaXZlcy4KLQkgKi8KLQlpZiAoYy0+dHlwZSAhPSBTU0hfQ0hBTk5FTF9DTE9TRUQpIHsKLQkJLyoKLQkJICogTm90IGEgY2xvc2VkIGNoYW5uZWwgLSBtYXJrIGl0IGFzIGRyYWluaW5nLCB3aGljaCB3aWxsCi0JCSAqIGNhdXNlIGl0IHRvIGJlIGZyZWVkIGxhdGVyLgotCQkgKi8KLQkJYnVmZmVyX2NsZWFyKCZjLT5pbnB1dCk7Ci0JCWMtPnR5cGUgPSBTU0hfQ0hBTk5FTF9PVVRQVVRfRFJBSU5JTkc7Ci0JfQotfQotCi0vKiBwcm90byB2ZXJzaW9uIDEuNSBvdmVybG9hZHMgQ0xPU0VfQ09ORklSTUFUSU9OIHdpdGggT0NMT1NFICovCi0vKiBBUkdTVVNFRCAqLwotdm9pZAotY2hhbm5lbF9pbnB1dF9vY2xvc2UoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JaW50IGlkID0gcGFja2V0X2dldF9pbnQoKTsKLQlDaGFubmVsICpjID0gY2hhbm5lbF9sb29rdXAoaWQpOwotCi0JcGFja2V0X2NoZWNrX2VvbSgpOwotCWlmIChjID09IE5VTEwpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJSZWNlaXZlZCBvY2xvc2UgZm9yIG5vbmV4aXN0ZW50IGNoYW5uZWwgJWQuIiwgaWQpOwotCWNoYW5fcmN2ZF9vY2xvc2UoYyk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi12b2lkCi1jaGFubmVsX2lucHV0X2Nsb3NlX2NvbmZpcm1hdGlvbihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlpbnQgaWQgPSBwYWNrZXRfZ2V0X2ludCgpOwotCUNoYW5uZWwgKmMgPSBjaGFubmVsX2xvb2t1cChpZCk7Ci0KLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0JaWYgKGMgPT0gTlVMTCkKLQkJcGFja2V0X2Rpc2Nvbm5lY3QoIlJlY2VpdmVkIGNsb3NlIGNvbmZpcm1hdGlvbiBmb3IgIgotCQkgICAgIm91dC1vZi1yYW5nZSBjaGFubmVsICVkLiIsIGlkKTsKLQlpZiAoYy0+dHlwZSAhPSBTU0hfQ0hBTk5FTF9DTE9TRUQpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJSZWNlaXZlZCBjbG9zZSBjb25maXJtYXRpb24gZm9yICIKLQkJICAgICJub24tY2xvc2VkIGNoYW5uZWwgJWQgKHR5cGUgJWQpLiIsIGlkLCBjLT50eXBlKTsKLQljaGFubmVsX2ZyZWUoYyk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi12b2lkCi1jaGFubmVsX2lucHV0X29wZW5fY29uZmlybWF0aW9uKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQotewotCWludCBpZCwgcmVtb3RlX2lkOwotCUNoYW5uZWwgKmM7Ci0KLQlpZCA9IHBhY2tldF9nZXRfaW50KCk7Ci0JYyA9IGNoYW5uZWxfbG9va3VwKGlkKTsKLQotCWlmIChjPT1OVUxMIHx8IGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfT1BFTklORykKLQkJcGFja2V0X2Rpc2Nvbm5lY3QoIlJlY2VpdmVkIG9wZW4gY29uZmlybWF0aW9uIGZvciAiCi0JCSAgICAibm9uLW9wZW5pbmcgY2hhbm5lbCAlZC4iLCBpZCk7Ci0JcmVtb3RlX2lkID0gcGFja2V0X2dldF9pbnQoKTsKLQkvKiBSZWNvcmQgdGhlIHJlbW90ZSBjaGFubmVsIG51bWJlciBhbmQgbWFyayB0aGF0IHRoZSBjaGFubmVsIGlzIG5vdyBvcGVuLiAqLwotCWMtPnJlbW90ZV9pZCA9IHJlbW90ZV9pZDsKLQljLT50eXBlID0gU1NIX0NIQU5ORUxfT1BFTjsKLQotCWlmIChjb21wYXQyMCkgewotCQljLT5yZW1vdGVfd2luZG93ID0gcGFja2V0X2dldF9pbnQoKTsKLQkJYy0+cmVtb3RlX21heHBhY2tldCA9IHBhY2tldF9nZXRfaW50KCk7Ci0JCWlmIChjLT5vcGVuX2NvbmZpcm0pIHsKLQkJCWRlYnVnMigiY2FsbGJhY2sgc3RhcnQiKTsKLQkJCWMtPm9wZW5fY29uZmlybShjLT5zZWxmLCAxLCBjLT5vcGVuX2NvbmZpcm1fY3R4KTsKLQkJCWRlYnVnMigiY2FsbGJhY2sgZG9uZSIpOwotCQl9Ci0JCWRlYnVnMigiY2hhbm5lbCAlZDogb3BlbiBjb25maXJtIHJ3aW5kb3cgJXUgcm1heCAldSIsIGMtPnNlbGYsCi0JCSAgICBjLT5yZW1vdGVfd2luZG93LCBjLT5yZW1vdGVfbWF4cGFja2V0KTsKLQl9Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotfQotCi1zdGF0aWMgY2hhciAqCi1yZWFzb24ydHh0KGludCByZWFzb24pCi17Ci0Jc3dpdGNoIChyZWFzb24pIHsKLQljYXNlIFNTSDJfT1BFTl9BRE1JTklTVFJBVElWRUxZX1BST0hJQklURUQ6Ci0JCXJldHVybiAiYWRtaW5pc3RyYXRpdmVseSBwcm9oaWJpdGVkIjsKLQljYXNlIFNTSDJfT1BFTl9DT05ORUNUX0ZBSUxFRDoKLQkJcmV0dXJuICJjb25uZWN0IGZhaWxlZCI7Ci0JY2FzZSBTU0gyX09QRU5fVU5LTk9XTl9DSEFOTkVMX1RZUEU6Ci0JCXJldHVybiAidW5rbm93biBjaGFubmVsIHR5cGUiOwotCWNhc2UgU1NIMl9PUEVOX1JFU09VUkNFX1NIT1JUQUdFOgotCQlyZXR1cm4gInJlc291cmNlIHNob3J0YWdlIjsKLQl9Ci0JcmV0dXJuICJ1bmtub3duIHJlYXNvbiI7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi12b2lkCi1jaGFubmVsX2lucHV0X29wZW5fZmFpbHVyZShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlpbnQgaWQsIHJlYXNvbjsKLQljaGFyICptc2cgPSBOVUxMLCAqbGFuZyA9IE5VTEw7Ci0JQ2hhbm5lbCAqYzsKLQotCWlkID0gcGFja2V0X2dldF9pbnQoKTsKLQljID0gY2hhbm5lbF9sb29rdXAoaWQpOwotCi0JaWYgKGM9PU5VTEwgfHwgYy0+dHlwZSAhPSBTU0hfQ0hBTk5FTF9PUEVOSU5HKQotCQlwYWNrZXRfZGlzY29ubmVjdCgiUmVjZWl2ZWQgb3BlbiBmYWlsdXJlIGZvciAiCi0JCSAgICAibm9uLW9wZW5pbmcgY2hhbm5lbCAlZC4iLCBpZCk7Ci0JaWYgKGNvbXBhdDIwKSB7Ci0JCXJlYXNvbiA9IHBhY2tldF9nZXRfaW50KCk7Ci0JCWlmICghKGRhdGFmZWxsb3dzICYgU1NIX0JVR19PUEVORkFJTFVSRSkpIHsKLQkJCW1zZyAgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQkJCWxhbmcgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQkJfQotCQlsb2dpdCgiY2hhbm5lbCAlZDogb3BlbiBmYWlsZWQ6ICVzJXMlcyIsIGlkLAotCQkgICAgcmVhc29uMnR4dChyZWFzb24pLCBtc2cgPyAiOiAiOiAiIiwgbXNnID8gbXNnIDogIiIpOwotCQlpZiAobXNnICE9IE5VTEwpCi0JCQl4ZnJlZShtc2cpOwotCQlpZiAobGFuZyAhPSBOVUxMKQotCQkJeGZyZWUobGFuZyk7Ci0JCWlmIChjLT5vcGVuX2NvbmZpcm0pIHsKLQkJCWRlYnVnMigiY2FsbGJhY2sgc3RhcnQiKTsKLQkJCWMtPm9wZW5fY29uZmlybShjLT5zZWxmLCAwLCBjLT5vcGVuX2NvbmZpcm1fY3R4KTsKLQkJCWRlYnVnMigiY2FsbGJhY2sgZG9uZSIpOwotCQl9Ci0JfQotCXBhY2tldF9jaGVja19lb20oKTsKLQkvKiBTY2hlZHVsZSB0aGUgY2hhbm5lbCBmb3IgY2xlYW51cC9kZWxldGlvbi4gKi8KLQljaGFuX21hcmtfZGVhZChjKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQKLWNoYW5uZWxfaW5wdXRfd2luZG93X2FkanVzdChpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlDaGFubmVsICpjOwotCWludCBpZDsKLQl1X2ludCBhZGp1c3Q7Ci0KLQlpZiAoIWNvbXBhdDIwKQotCQlyZXR1cm47Ci0KLQkvKiBHZXQgdGhlIGNoYW5uZWwgbnVtYmVyIGFuZCB2ZXJpZnkgaXQuICovCi0JaWQgPSBwYWNrZXRfZ2V0X2ludCgpOwotCWMgPSBjaGFubmVsX2xvb2t1cChpZCk7Ci0KLQlpZiAoYyA9PSBOVUxMKSB7Ci0JCWxvZ2l0KCJSZWNlaXZlZCB3aW5kb3cgYWRqdXN0IGZvciBub24tb3BlbiBjaGFubmVsICVkLiIsIGlkKTsKLQkJcmV0dXJuOwotCX0KLQlhZGp1c3QgPSBwYWNrZXRfZ2V0X2ludCgpOwotCXBhY2tldF9jaGVja19lb20oKTsKLQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHJjdmQgYWRqdXN0ICV1IiwgaWQsIGFkanVzdCk7Ci0JYy0+cmVtb3RlX3dpbmRvdyArPSBhZGp1c3Q7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi12b2lkCi1jaGFubmVsX2lucHV0X3BvcnRfb3BlbihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlDaGFubmVsICpjID0gTlVMTDsKLQl1X3Nob3J0IGhvc3RfcG9ydDsKLQljaGFyICpob3N0LCAqb3JpZ2luYXRvcl9zdHJpbmc7Ci0JaW50IHJlbW90ZV9pZDsKLQotCXJlbW90ZV9pZCA9IHBhY2tldF9nZXRfaW50KCk7Ci0JaG9zdCA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOwotCWhvc3RfcG9ydCA9IHBhY2tldF9nZXRfaW50KCk7Ci0KLQlpZiAocGFja2V0X2dldF9wcm90b2NvbF9mbGFncygpICYgU1NIX1BST1RPRkxBR19IT1NUX0lOX0ZXRF9PUEVOKSB7Ci0JCW9yaWdpbmF0b3Jfc3RyaW5nID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JfSBlbHNlIHsKLQkJb3JpZ2luYXRvcl9zdHJpbmcgPSB4c3RyZHVwKCJ1bmtub3duIChyZW1vdGUgZGlkIG5vdCBzdXBwbHkgbmFtZSkiKTsKLQl9Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCWMgPSBjaGFubmVsX2Nvbm5lY3RfdG8oaG9zdCwgaG9zdF9wb3J0LAotCSAgICAiY29ubmVjdGVkIHNvY2tldCIsIG9yaWdpbmF0b3Jfc3RyaW5nKTsKLQl4ZnJlZShvcmlnaW5hdG9yX3N0cmluZyk7Ci0JeGZyZWUoaG9zdCk7Ci0JaWYgKGMgPT0gTlVMTCkgewotCQlwYWNrZXRfc3RhcnQoU1NIX01TR19DSEFOTkVMX09QRU5fRkFJTFVSRSk7Ci0JCXBhY2tldF9wdXRfaW50KHJlbW90ZV9pZCk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JfSBlbHNlCi0JCWMtPnJlbW90ZV9pZCA9IHJlbW90ZV9pZDsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQKLWNoYW5uZWxfaW5wdXRfc3RhdHVzX2NvbmZpcm0oaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JQ2hhbm5lbCAqYzsKLQlzdHJ1Y3QgY2hhbm5lbF9jb25maXJtICpjYzsKLQlpbnQgaWQ7Ci0KLQkvKiBSZXNldCBrZWVwYWxpdmUgdGltZW91dCAqLwotCXBhY2tldF9zZXRfYWxpdmVfdGltZW91dHMoMCk7Ci0KLQlpZCA9IHBhY2tldF9nZXRfaW50KCk7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JZGVidWcyKCJjaGFubmVsX2lucHV0X3N0YXR1c19jb25maXJtOiB0eXBlICVkIGlkICVkIiwgdHlwZSwgaWQpOwotCi0JaWYgKChjID0gY2hhbm5lbF9sb29rdXAoaWQpKSA9PSBOVUxMKSB7Ci0JCWxvZ2l0KCJjaGFubmVsX2lucHV0X3N0YXR1c19jb25maXJtOiAlZDogdW5rbm93biIsIGlkKTsKLQkJcmV0dXJuOwotCX0JCi0JOwotCWlmICgoY2MgPSBUQUlMUV9GSVJTVCgmYy0+c3RhdHVzX2NvbmZpcm1zKSkgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWNjLT5jYih0eXBlLCBjLCBjYy0+Y3R4KTsKLQlUQUlMUV9SRU1PVkUoJmMtPnN0YXR1c19jb25maXJtcywgY2MsIGVudHJ5KTsKLQliemVybyhjYywgc2l6ZW9mKCpjYykpOwotCXhmcmVlKGNjKTsKLX0KLQotLyogLS0gdGNwIGZvcndhcmRpbmcgKi8KLQotdm9pZAotY2hhbm5lbF9zZXRfYWYoaW50IGFmKQotewotCUlQdjRvcjYgPSBhZjsKLX0KLQotc3RhdGljIGludAotY2hhbm5lbF9zZXR1cF9md2RfbGlzdGVuZXIoaW50IHR5cGUsIGNvbnN0IGNoYXIgKmxpc3Rlbl9hZGRyLAotICAgIHVfc2hvcnQgbGlzdGVuX3BvcnQsIGludCAqYWxsb2NhdGVkX2xpc3Rlbl9wb3J0LAotICAgIGNvbnN0IGNoYXIgKmhvc3RfdG9fY29ubmVjdCwgdV9zaG9ydCBwb3J0X3RvX2Nvbm5lY3QsIGludCBnYXRld2F5X3BvcnRzKQotewotCUNoYW5uZWwgKmM7Ci0JaW50IHNvY2ssIHIsIHN1Y2Nlc3MgPSAwLCB3aWxkY2FyZCA9IDAsIGlzX2NsaWVudDsKLQlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaSwgKmFpdG9wOwotCWNvbnN0IGNoYXIgKmhvc3QsICphZGRyOwotCWNoYXIgbnRvcFtOSV9NQVhIT1NUXSwgc3RycG9ydFtOSV9NQVhTRVJWXTsKLQlpbl9wb3J0X3QgKmxwb3J0X3A7Ci0KLQlob3N0ID0gKHR5cGUgPT0gU1NIX0NIQU5ORUxfUlBPUlRfTElTVEVORVIpID8KLQkgICAgbGlzdGVuX2FkZHIgOiBob3N0X3RvX2Nvbm5lY3Q7Ci0JaXNfY2xpZW50ID0gKHR5cGUgPT0gU1NIX0NIQU5ORUxfUE9SVF9MSVNURU5FUik7Ci0KLQlpZiAoaG9zdCA9PSBOVUxMKSB7Ci0JCWVycm9yKCJObyBmb3J3YXJkIGhvc3QgbmFtZS4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChzdHJsZW4oaG9zdCkgPj0gTklfTUFYSE9TVCkgewotCQllcnJvcigiRm9yd2FyZCBob3N0IG5hbWUgdG9vIGxvbmcuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEgcG9ydCBmb3J3YXJkIGxpc3RlbnMgdG8gbG9vcGJhY2ssCi0JICogc3BlY2lmaWVkIGFkZHJlc3Mgb3Igd2lsZGNhcmQuIE9uIHRoZSBjbGllbnQsIGEgc3BlY2lmaWVkIGJpbmQKLQkgKiBhZGRyZXNzIHdpbGwgYWx3YXlzIG92ZXJyaWRlIGdhdGV3YXlfcG9ydHMuIE9uIHRoZSBzZXJ2ZXIsIGEKLQkgKiBnYXRld2F5X3BvcnRzIG9mIDEgKGBgeWVzJycpIHdpbGwgb3ZlcnJpZGUgdGhlIGNsaWVudCdzCi0JICogc3BlY2lmaWNhdGlvbiBhbmQgZm9yY2UgYSB3aWxkY2FyZCBiaW5kLCB3aGVyZWFzIGEgdmFsdWUgb2YgMgotCSAqIChgYGNsaWVudHNwZWNpZmllZCcnKSB3aWxsIGJpbmQgdG8gd2hhdGV2ZXIgYWRkcmVzcyB0aGUgY2xpZW50Ci0JICogYXNrZWQgZm9yLgotCSAqCi0JICogU3BlY2lhbC1jYXNlIGxpc3Rlbl9hZGRycyBhcmU6Ci0JICoKLQkgKiAiMC4wLjAuMCIgICAgICAgICAgICAgICAtPiB3aWxkY2FyZCB2NC92NiBpZiBTU0hfT0xEX0ZPUldBUkRfQUREUgotCSAqICIiIChlbXB0eSBzdHJpbmcpLCAiKiIgIC0+IHdpbGRjYXJkIHY0L3Y2Ci0JICogImxvY2FsaG9zdCIgICAgICAgICAgICAgLT4gbG9vcGJhY2sgdjQvdjYKLQkgKi8KLQlhZGRyID0gTlVMTDsKLQlpZiAobGlzdGVuX2FkZHIgPT0gTlVMTCkgewotCQkvKiBObyBhZGRyZXNzIHNwZWNpZmllZDogZGVmYXVsdCB0byBnYXRld2F5X3BvcnRzIHNldHRpbmcgKi8KLQkJaWYgKGdhdGV3YXlfcG9ydHMpCi0JCQl3aWxkY2FyZCA9IDE7Ci0JfSBlbHNlIGlmIChnYXRld2F5X3BvcnRzIHx8IGlzX2NsaWVudCkgewotCQlpZiAoKChkYXRhZmVsbG93cyAmIFNTSF9PTERfRk9SV0FSRF9BRERSKSAmJgotCQkgICAgc3RyY21wKGxpc3Rlbl9hZGRyLCAiMC4wLjAuMCIpID09IDAgJiYgaXNfY2xpZW50ID09IDApIHx8Ci0JCSAgICAqbGlzdGVuX2FkZHIgPT0gJ1wwJyB8fCBzdHJjbXAobGlzdGVuX2FkZHIsICIqIikgPT0gMCB8fAotCQkgICAgKCFpc19jbGllbnQgJiYgZ2F0ZXdheV9wb3J0cyA9PSAxKSkKLQkJCXdpbGRjYXJkID0gMTsKLQkJZWxzZSBpZiAoc3RyY21wKGxpc3Rlbl9hZGRyLCAibG9jYWxob3N0IikgIT0gMCkKLQkJCWFkZHIgPSBsaXN0ZW5fYWRkcjsKLQl9Ci0KLQlkZWJ1ZzMoImNoYW5uZWxfc2V0dXBfZndkX2xpc3RlbmVyOiB0eXBlICVkIHdpbGRjYXJkICVkIGFkZHIgJXMiLAotCSAgICB0eXBlLCB3aWxkY2FyZCwgKGFkZHIgPT0gTlVMTCkgPyAiTlVMTCIgOiBhZGRyKTsKLQotCS8qCi0JICogZ2V0YWRkcmluZm8gcmV0dXJucyBhIGxvb3BiYWNrIGFkZHJlc3MgaWYgdGhlIGhvc3RuYW1lIGlzCi0JICogc2V0IHRvIE5VTEwgYW5kIGhpbnRzLmFpX2ZsYWdzIGlzIG5vdCBBSV9QQVNTSVZFCi0JICovCi0JbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JaGludHMuYWlfZmFtaWx5ID0gSVB2NG9yNjsKLQloaW50cy5haV9mbGFncyA9IHdpbGRjYXJkID8gQUlfUEFTU0lWRSA6IDA7Ci0JaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLQlzbnByaW50ZihzdHJwb3J0LCBzaXplb2Ygc3RycG9ydCwgIiVkIiwgbGlzdGVuX3BvcnQpOwotCWlmICgociA9IGdldGFkZHJpbmZvKGFkZHIsIHN0cnBvcnQsICZoaW50cywgJmFpdG9wKSkgIT0gMCkgewotCQlpZiAoYWRkciA9PSBOVUxMKSB7Ci0JCQkvKiBUaGlzIHJlYWxseSBzaG91bGRuJ3QgaGFwcGVuICovCi0JCQlwYWNrZXRfZGlzY29ubmVjdCgiZ2V0YWRkcmluZm86IGZhdGFsIGVycm9yOiAlcyIsCi0JCQkgICAgc3NoX2dhaV9zdHJlcnJvcihyKSk7Ci0JCX0gZWxzZSB7Ci0JCQllcnJvcigiY2hhbm5lbF9zZXR1cF9md2RfbGlzdGVuZXI6ICIKLQkJCSAgICAiZ2V0YWRkcmluZm8oJS42NHMpOiAlcyIsIGFkZHIsCi0JCQkgICAgc3NoX2dhaV9zdHJlcnJvcihyKSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChhbGxvY2F0ZWRfbGlzdGVuX3BvcnQgIT0gTlVMTCkKLQkJKmFsbG9jYXRlZF9saXN0ZW5fcG9ydCA9IDA7Ci0JZm9yIChhaSA9IGFpdG9wOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgewotCQlzd2l0Y2ggKGFpLT5haV9mYW1pbHkpIHsKLQkJY2FzZSBBRl9JTkVUOgotCQkJbHBvcnRfcCA9ICYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFpLT5haV9hZGRyKS0+Ci0JCQkgICAgc2luX3BvcnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBBRl9JTkVUNjoKLQkJCWxwb3J0X3AgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWktPmFpX2FkZHIpLT4KLQkJCSAgICBzaW42X3BvcnQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qCi0JCSAqIElmIGFsbG9jYXRpbmcgYSBwb3J0IGZvciAtUiBmb3J3YXJkcywgdGhlbiB1c2UgdGhlCi0JCSAqIHNhbWUgcG9ydCBmb3IgYWxsIGFkZHJlc3MgZmFtaWxpZXMuCi0JCSAqLwotCQlpZiAodHlwZSA9PSBTU0hfQ0hBTk5FTF9SUE9SVF9MSVNURU5FUiAmJiBsaXN0ZW5fcG9ydCA9PSAwICYmCi0JCSAgICBhbGxvY2F0ZWRfbGlzdGVuX3BvcnQgIT0gTlVMTCAmJiAqYWxsb2NhdGVkX2xpc3Rlbl9wb3J0ID4gMCkKLQkJCSpscG9ydF9wID0gaHRvbnMoKmFsbG9jYXRlZF9saXN0ZW5fcG9ydCk7Ci0KLQkJaWYgKGdldG5hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwgbnRvcCwgc2l6ZW9mKG50b3ApLAotCQkgICAgc3RycG9ydCwgc2l6ZW9mKHN0cnBvcnQpLCBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVikgIT0gMCkgewotCQkJZXJyb3IoImNoYW5uZWxfc2V0dXBfZndkX2xpc3RlbmVyOiBnZXRuYW1laW5mbyBmYWlsZWQiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIENyZWF0ZSBhIHBvcnQgdG8gbGlzdGVuIGZvciB0aGUgaG9zdC4gKi8KLQkJc29jayA9IHNvY2tldChhaS0+YWlfZmFtaWx5LCBhaS0+YWlfc29ja3R5cGUsIGFpLT5haV9wcm90b2NvbCk7Ci0JCWlmIChzb2NrIDwgMCkgewotCQkJLyogdGhpcyBpcyBubyBlcnJvciBzaW5jZSBrZXJuZWwgbWF5IG5vdCBzdXBwb3J0IGlwdjYgKi8KLQkJCXZlcmJvc2UoInNvY2tldDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJY2hhbm5lbF9zZXRfcmV1c2VhZGRyKHNvY2spOwotCQlpZiAoYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUNikKLQkJCXNvY2tfc2V0X3Y2b25seShzb2NrKTsKLQotCQlkZWJ1ZygiTG9jYWwgZm9yd2FyZGluZyBsaXN0ZW5pbmcgb24gJXMgcG9ydCAlcy4iLAotCQkgICAgbnRvcCwgc3RycG9ydCk7Ci0KLQkJLyogQmluZCB0aGUgc29ja2V0IHRvIHRoZSBhZGRyZXNzLiAqLwotCQlpZiAoYmluZChzb2NrLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCkgewotCQkJLyogYWRkcmVzcyBjYW4gYmUgaW4gdXNlIGlwdjYgYWRkcmVzcyBpcyBhbHJlYWR5IGJvdW5kICovCi0JCQlpZiAoIWFpLT5haV9uZXh0KQotCQkJCWVycm9yKCJiaW5kOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJZWxzZQotCQkJCXZlcmJvc2UoImJpbmQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLQkJCWNsb3NlKHNvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJLyogU3RhcnQgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucyBvbiB0aGUgc29ja2V0LiAqLwotCQlpZiAobGlzdGVuKHNvY2ssIFNTSF9MSVNURU5fQkFDS0xPRykgPCAwKSB7Ci0JCQllcnJvcigibGlzdGVuOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJY2xvc2Uoc29jayk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qCi0JCSAqIGxpc3Rlbl9wb3J0ID09IDAgcmVxdWVzdHMgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgcG9ydCAtCi0JCSAqIHJlY29yZCB3aGF0IHdlIGdvdC4KLQkJICovCi0JCWlmICh0eXBlID09IFNTSF9DSEFOTkVMX1JQT1JUX0xJU1RFTkVSICYmIGxpc3Rlbl9wb3J0ID09IDAgJiYKLQkJICAgIGFsbG9jYXRlZF9saXN0ZW5fcG9ydCAhPSBOVUxMICYmCi0JCSAgICAqYWxsb2NhdGVkX2xpc3Rlbl9wb3J0ID09IDApIHsKLQkJCSphbGxvY2F0ZWRfbGlzdGVuX3BvcnQgPSBnZXRfc29ja19wb3J0KHNvY2ssIDEpOwotCQkJZGVidWcoIkFsbG9jYXRlZCBsaXN0ZW4gcG9ydCAlZCIsCi0JCQkgICAgKmFsbG9jYXRlZF9saXN0ZW5fcG9ydCk7Ci0JCX0KLQotCQkvKiBBbGxvY2F0ZSBhIGNoYW5uZWwgbnVtYmVyIGZvciB0aGUgc29ja2V0LiAqLwotCQljID0gY2hhbm5lbF9uZXcoInBvcnQgbGlzdGVuZXIiLCB0eXBlLCBzb2NrLCBzb2NrLCAtMSwKLQkJICAgIENIQU5fVENQX1dJTkRPV19ERUZBVUxULCBDSEFOX1RDUF9QQUNLRVRfREVGQVVMVCwKLQkJICAgIDAsICJwb3J0IGxpc3RlbmVyIiwgMSk7Ci0JCWMtPnBhdGggPSB4c3RyZHVwKGhvc3QpOwotCQljLT5ob3N0X3BvcnQgPSBwb3J0X3RvX2Nvbm5lY3Q7Ci0JCWMtPmxpc3RlbmluZ19wb3J0ID0gbGlzdGVuX3BvcnQ7Ci0JCXN1Y2Nlc3MgPSAxOwotCX0KLQlpZiAoc3VjY2VzcyA9PSAwKQotCQllcnJvcigiY2hhbm5lbF9zZXR1cF9md2RfbGlzdGVuZXI6IGNhbm5vdCBsaXN0ZW4gdG8gcG9ydDogJWQiLAotCQkgICAgbGlzdGVuX3BvcnQpOwotCWZyZWVhZGRyaW5mbyhhaXRvcCk7Ci0JcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLWludAotY2hhbm5lbF9jYW5jZWxfcnBvcnRfbGlzdGVuZXIoY29uc3QgY2hhciAqaG9zdCwgdV9zaG9ydCBwb3J0KQotewotCXVfaW50IGk7Ci0JaW50IGZvdW5kID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsc19hbGxvYzsgaSsrKSB7Ci0JCUNoYW5uZWwgKmMgPSBjaGFubmVsc1tpXTsKLQotCQlpZiAoYyAhPSBOVUxMICYmIGMtPnR5cGUgPT0gU1NIX0NIQU5ORUxfUlBPUlRfTElTVEVORVIgJiYKLQkJICAgIHN0cmNtcChjLT5wYXRoLCBob3N0KSA9PSAwICYmIGMtPmxpc3RlbmluZ19wb3J0ID09IHBvcnQpIHsKLQkJCWRlYnVnMigiJXM6IGNsb3NlIGNoYW5uZWwgJWQiLCBfX2Z1bmNfXywgaSk7Ci0JCQljaGFubmVsX2ZyZWUoYyk7Ci0JCQlmb3VuZCA9IDE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKGZvdW5kKTsKLX0KLQotLyogcHJvdG9jb2wgbG9jYWwgcG9ydCBmd2QsIHVzZWQgYnkgc3NoIChhbmQgc3NoZCBpbiB2MSkgKi8KLWludAotY2hhbm5lbF9zZXR1cF9sb2NhbF9md2RfbGlzdGVuZXIoY29uc3QgY2hhciAqbGlzdGVuX2hvc3QsIHVfc2hvcnQgbGlzdGVuX3BvcnQsCi0gICAgY29uc3QgY2hhciAqaG9zdF90b19jb25uZWN0LCB1X3Nob3J0IHBvcnRfdG9fY29ubmVjdCwgaW50IGdhdGV3YXlfcG9ydHMpCi17Ci0JcmV0dXJuIGNoYW5uZWxfc2V0dXBfZndkX2xpc3RlbmVyKFNTSF9DSEFOTkVMX1BPUlRfTElTVEVORVIsCi0JICAgIGxpc3Rlbl9ob3N0LCBsaXN0ZW5fcG9ydCwgTlVMTCwgaG9zdF90b19jb25uZWN0LCBwb3J0X3RvX2Nvbm5lY3QsCi0JICAgIGdhdGV3YXlfcG9ydHMpOwotfQotCi0vKiBwcm90b2NvbCB2MiByZW1vdGUgcG9ydCBmd2QsIHVzZWQgYnkgc3NoZCAqLwotaW50Ci1jaGFubmVsX3NldHVwX3JlbW90ZV9md2RfbGlzdGVuZXIoY29uc3QgY2hhciAqbGlzdGVuX2FkZHJlc3MsCi0gICAgdV9zaG9ydCBsaXN0ZW5fcG9ydCwgaW50ICphbGxvY2F0ZWRfbGlzdGVuX3BvcnQsIGludCBnYXRld2F5X3BvcnRzKQotewotCXJldHVybiBjaGFubmVsX3NldHVwX2Z3ZF9saXN0ZW5lcihTU0hfQ0hBTk5FTF9SUE9SVF9MSVNURU5FUiwKLQkgICAgbGlzdGVuX2FkZHJlc3MsIGxpc3Rlbl9wb3J0LCBhbGxvY2F0ZWRfbGlzdGVuX3BvcnQsCi0JICAgIE5VTEwsIDAsIGdhdGV3YXlfcG9ydHMpOwotfQotCi0vKgotICogSW5pdGlhdGUgZm9yd2FyZGluZyBvZiBjb25uZWN0aW9ucyB0byBwb3J0ICJwb3J0IiBvbiByZW1vdGUgaG9zdCB0aHJvdWdoCi0gKiB0aGUgc2VjdXJlIGNoYW5uZWwgdG8gaG9zdDpwb3J0IGZyb20gbG9jYWwgc2lkZS4KLSAqLwotCi1pbnQKLWNoYW5uZWxfcmVxdWVzdF9yZW1vdGVfZm9yd2FyZGluZyhjb25zdCBjaGFyICpsaXN0ZW5faG9zdCwgdV9zaG9ydCBsaXN0ZW5fcG9ydCwKLSAgICBjb25zdCBjaGFyICpob3N0X3RvX2Nvbm5lY3QsIHVfc2hvcnQgcG9ydF90b19jb25uZWN0KQotewotCWludCB0eXBlLCBzdWNjZXNzID0gMDsKLQotCS8qIFNlbmQgdGhlIGZvcndhcmQgcmVxdWVzdCB0byB0aGUgcmVtb3RlIHNpZGUuICovCi0JaWYgKGNvbXBhdDIwKSB7Ci0JCWNvbnN0IGNoYXIgKmFkZHJlc3NfdG9fYmluZDsKLQkJaWYgKGxpc3Rlbl9ob3N0ID09IE5VTEwpIHsKLQkJCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfUkZXRF9BRERSKQotCQkJCWFkZHJlc3NfdG9fYmluZCA9ICIxMjcuMC4wLjEiOwotCQkJZWxzZQotCQkJCWFkZHJlc3NfdG9fYmluZCA9ICJsb2NhbGhvc3QiOwotCQl9IGVsc2UgaWYgKCpsaXN0ZW5faG9zdCA9PSAnXDAnIHx8Ci0JCQkgICBzdHJjbXAobGlzdGVuX2hvc3QsICIqIikgPT0gMCkgewotCQkJaWYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19SRldEX0FERFIpCi0JCQkJYWRkcmVzc190b19iaW5kID0gIjAuMC4wLjAiOwotCQkJZWxzZQotCQkJCWFkZHJlc3NfdG9fYmluZCA9ICIiOwotCQl9IGVsc2UKLQkJCWFkZHJlc3NfdG9fYmluZCA9IGxpc3Rlbl9ob3N0OwotCi0JCXBhY2tldF9zdGFydChTU0gyX01TR19HTE9CQUxfUkVRVUVTVCk7Ci0JCXBhY2tldF9wdXRfY3N0cmluZygidGNwaXAtZm9yd2FyZCIpOwotCQlwYWNrZXRfcHV0X2NoYXIoMSk7CQkJLyogYm9vbGVhbjogd2FudCByZXBseSAqLwotCQlwYWNrZXRfcHV0X2NzdHJpbmcoYWRkcmVzc190b19iaW5kKTsKLQkJcGFja2V0X3B1dF9pbnQobGlzdGVuX3BvcnQpOwotCQlwYWNrZXRfc2VuZCgpOwotCQlwYWNrZXRfd3JpdGVfd2FpdCgpOwotCQkvKiBBc3N1bWUgdGhhdCBzZXJ2ZXIgYWNjZXB0cyB0aGUgcmVxdWVzdCAqLwotCQlzdWNjZXNzID0gMTsKLQl9IGVsc2UgewotCQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfUE9SVF9GT1JXQVJEX1JFUVVFU1QpOwotCQlwYWNrZXRfcHV0X2ludChsaXN0ZW5fcG9ydCk7Ci0JCXBhY2tldF9wdXRfY3N0cmluZyhob3N0X3RvX2Nvbm5lY3QpOwotCQlwYWNrZXRfcHV0X2ludChwb3J0X3RvX2Nvbm5lY3QpOwotCQlwYWNrZXRfc2VuZCgpOwotCQlwYWNrZXRfd3JpdGVfd2FpdCgpOwotCi0JCS8qIFdhaXQgZm9yIHJlc3BvbnNlIGZyb20gdGhlIHJlbW90ZSBzaWRlLiAqLwotCQl0eXBlID0gcGFja2V0X3JlYWQoKTsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgU1NIX1NNU0dfU1VDQ0VTUzoKLQkJCXN1Y2Nlc3MgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1NIX1NNU0dfRkFJTFVSRToKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLyogVW5rbm93biBwYWNrZXQgKi8KLQkJCXBhY2tldF9kaXNjb25uZWN0KCJQcm90b2NvbCBlcnJvciBmb3IgcG9ydCBmb3J3YXJkIHJlcXVlc3Q6IgotCQkJICAgICJyZWNlaXZlZCBwYWNrZXQgdHlwZSAlZC4iLCB0eXBlKTsKLQkJfQotCX0KLQlpZiAoc3VjY2VzcykgewotCQkvKiBSZWNvcmQgdGhhdCBjb25uZWN0aW9uIHRvIHRoaXMgaG9zdC9wb3J0IGlzIHBlcm1pdHRlZC4gKi8KLQkJcGVybWl0dGVkX29wZW5zID0geHJlYWxsb2MocGVybWl0dGVkX29wZW5zLAotCQkgICAgbnVtX3Blcm1pdHRlZF9vcGVucyArIDEsIHNpemVvZigqcGVybWl0dGVkX29wZW5zKSk7Ci0JCXBlcm1pdHRlZF9vcGVuc1tudW1fcGVybWl0dGVkX29wZW5zXS5ob3N0X3RvX2Nvbm5lY3QgPSB4c3RyZHVwKGhvc3RfdG9fY29ubmVjdCk7Ci0JCXBlcm1pdHRlZF9vcGVuc1tudW1fcGVybWl0dGVkX29wZW5zXS5wb3J0X3RvX2Nvbm5lY3QgPSBwb3J0X3RvX2Nvbm5lY3Q7Ci0JCXBlcm1pdHRlZF9vcGVuc1tudW1fcGVybWl0dGVkX29wZW5zXS5saXN0ZW5fcG9ydCA9IGxpc3Rlbl9wb3J0OwotCQludW1fcGVybWl0dGVkX29wZW5zKys7Ci0JfQotCXJldHVybiAoc3VjY2VzcyA/IDAgOiAtMSk7Ci19Ci0KLS8qCi0gKiBSZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiByZW1vdGUgZm9yd2FyZGluZyBvZiBjb25uZWN0aW9uIGhvc3Q6cG9ydCBmcm9tCi0gKiBsb2NhbCBzaWRlLgotICovCi12b2lkCi1jaGFubmVsX3JlcXVlc3RfcmZvcndhcmRfY2FuY2VsKGNvbnN0IGNoYXIgKmhvc3QsIHVfc2hvcnQgcG9ydCkKLXsKLQlpbnQgaTsKLQotCWlmICghY29tcGF0MjApCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fcGVybWl0dGVkX29wZW5zOyBpKyspIHsKLQkJaWYgKHBlcm1pdHRlZF9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QgIT0gTlVMTCAmJgotCQkgICAgcGVybWl0dGVkX29wZW5zW2ldLmxpc3Rlbl9wb3J0ID09IHBvcnQpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPj0gbnVtX3Blcm1pdHRlZF9vcGVucykgewotCQlkZWJ1ZygiJXM6IHJlcXVlc3RlZCBmb3J3YXJkIG5vdCBmb3VuZCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfR0xPQkFMX1JFUVVFU1QpOwotCXBhY2tldF9wdXRfY3N0cmluZygiY2FuY2VsLXRjcGlwLWZvcndhcmQiKTsKLQlwYWNrZXRfcHV0X2NoYXIoMCk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKGhvc3QgPT0gTlVMTCA/ICIiIDogaG9zdCk7Ci0JcGFja2V0X3B1dF9pbnQocG9ydCk7Ci0JcGFja2V0X3NlbmQoKTsKLQotCXBlcm1pdHRlZF9vcGVuc1tpXS5saXN0ZW5fcG9ydCA9IDA7Ci0JcGVybWl0dGVkX29wZW5zW2ldLnBvcnRfdG9fY29ubmVjdCA9IDA7Ci0JeGZyZWUocGVybWl0dGVkX29wZW5zW2ldLmhvc3RfdG9fY29ubmVjdCk7Ci0JcGVybWl0dGVkX29wZW5zW2ldLmhvc3RfdG9fY29ubmVjdCA9IE5VTEw7Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIGNhbGxlZCBhZnRlciByZWNlaXZpbmcgQ0hBTk5FTF9GT1JXQVJESU5HX1JFUVVFU1QuICBUaGlzIGluaXRhdGVzCi0gKiBsaXN0ZW5pbmcgZm9yIHRoZSBwb3J0LCBhbmQgc2VuZHMgYmFjayBhIHN1Y2Nlc3MgcmVwbHkgKG9yIGRpc2Nvbm5lY3QKLSAqIG1lc3NhZ2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yKS4KLSAqLwotaW50Ci1jaGFubmVsX2lucHV0X3BvcnRfZm9yd2FyZF9yZXF1ZXN0KGludCBpc19yb290LCBpbnQgZ2F0ZXdheV9wb3J0cykKLXsKLQl1X3Nob3J0IHBvcnQsIGhvc3RfcG9ydDsKLQlpbnQgc3VjY2VzcyA9IDA7Ci0JY2hhciAqaG9zdG5hbWU7Ci0KLQkvKiBHZXQgYXJndW1lbnRzIGZyb20gdGhlIHBhY2tldC4gKi8KLQlwb3J0ID0gcGFja2V0X2dldF9pbnQoKTsKLQlob3N0bmFtZSA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOwotCWhvc3RfcG9ydCA9IHBhY2tldF9nZXRfaW50KCk7Ci0KLSNpZm5kZWYgSEFWRV9DWUdXSU4KLQkvKgotCSAqIENoZWNrIHRoYXQgYW4gdW5wcml2aWxlZ2VkIHVzZXIgaXMgbm90IHRyeWluZyB0byBmb3J3YXJkIGEKLQkgKiBwcml2aWxlZ2VkIHBvcnQuCi0JICovCi0JaWYgKHBvcnQgPCBJUFBPUlRfUkVTRVJWRUQgJiYgIWlzX3Jvb3QpCi0JCXBhY2tldF9kaXNjb25uZWN0KAotCQkgICAgIlJlcXVlc3RlZCBmb3J3YXJkaW5nIG9mIHBvcnQgJWQgYnV0IHVzZXIgaXMgbm90IHJvb3QuIiwKLQkJICAgIHBvcnQpOwotCWlmIChob3N0X3BvcnQgPT0gMCkKLQkJcGFja2V0X2Rpc2Nvbm5lY3QoIkR5bmFtaWMgZm9yd2FyZGluZyBkZW5pZWQuIik7Ci0jZW5kaWYKLQotCS8qIEluaXRpYXRlIGZvcndhcmRpbmcgKi8KLQlzdWNjZXNzID0gY2hhbm5lbF9zZXR1cF9sb2NhbF9md2RfbGlzdGVuZXIoTlVMTCwgcG9ydCwgaG9zdG5hbWUsCi0JICAgIGhvc3RfcG9ydCwgZ2F0ZXdheV9wb3J0cyk7Ci0KLQkvKiBGcmVlIHRoZSBhcmd1bWVudCBzdHJpbmcuICovCi0JeGZyZWUoaG9zdG5hbWUpOwotCi0JcmV0dXJuIChzdWNjZXNzID8gMCA6IC0xKTsKLX0KLQotLyoKLSAqIFBlcm1pdHMgb3BlbmluZyB0byBhbnkgaG9zdC9wb3J0IGlmIHBlcm1pdHRlZF9vcGVuc1tdIGlzIGVtcHR5LiAgVGhpcyBpcwotICogdXN1YWxseSBjYWxsZWQgYnkgdGhlIHNlcnZlciwgYmVjYXVzZSB0aGUgdXNlciBjb3VsZCBjb25uZWN0IHRvIGFueSBwb3J0Ci0gKiBhbnl3YXksIGFuZCB0aGUgc2VydmVyIGhhcyBubyB3YXkgdG8ga25vdyBidXQgdG8gdHJ1c3QgdGhlIGNsaWVudCBhbnl3YXkuCi0gKi8KLXZvaWQKLWNoYW5uZWxfcGVybWl0X2FsbF9vcGVucyh2b2lkKQotewotCWlmIChudW1fcGVybWl0dGVkX29wZW5zID09IDApCi0JCWFsbF9vcGVuc19wZXJtaXR0ZWQgPSAxOwotfQotCi12b2lkCi1jaGFubmVsX2FkZF9wZXJtaXR0ZWRfb3BlbnMoY2hhciAqaG9zdCwgaW50IHBvcnQpCi17Ci0JZGVidWcoImFsbG93IHBvcnQgZm9yd2FyZGluZyB0byBob3N0ICVzIHBvcnQgJWQiLCBob3N0LCBwb3J0KTsKLQotCXBlcm1pdHRlZF9vcGVucyA9IHhyZWFsbG9jKHBlcm1pdHRlZF9vcGVucywKLQkgICAgbnVtX3Blcm1pdHRlZF9vcGVucyArIDEsIHNpemVvZigqcGVybWl0dGVkX29wZW5zKSk7Ci0JcGVybWl0dGVkX29wZW5zW251bV9wZXJtaXR0ZWRfb3BlbnNdLmhvc3RfdG9fY29ubmVjdCA9IHhzdHJkdXAoaG9zdCk7Ci0JcGVybWl0dGVkX29wZW5zW251bV9wZXJtaXR0ZWRfb3BlbnNdLnBvcnRfdG9fY29ubmVjdCA9IHBvcnQ7Ci0JbnVtX3Blcm1pdHRlZF9vcGVucysrOwotCi0JYWxsX29wZW5zX3Blcm1pdHRlZCA9IDA7Ci19Ci0KLWludAotY2hhbm5lbF9hZGRfYWRtX3Blcm1pdHRlZF9vcGVucyhjaGFyICpob3N0LCBpbnQgcG9ydCkKLXsKLQlkZWJ1ZygiY29uZmlnIGFsbG93cyBwb3J0IGZvcndhcmRpbmcgdG8gaG9zdCAlcyBwb3J0ICVkIiwgaG9zdCwgcG9ydCk7Ci0KLQlwZXJtaXR0ZWRfYWRtX29wZW5zID0geHJlYWxsb2MocGVybWl0dGVkX2FkbV9vcGVucywKLQkgICAgbnVtX2FkbV9wZXJtaXR0ZWRfb3BlbnMgKyAxLCBzaXplb2YoKnBlcm1pdHRlZF9hZG1fb3BlbnMpKTsKLQlwZXJtaXR0ZWRfYWRtX29wZW5zW251bV9hZG1fcGVybWl0dGVkX29wZW5zXS5ob3N0X3RvX2Nvbm5lY3QKLQkgICAgID0geHN0cmR1cChob3N0KTsKLQlwZXJtaXR0ZWRfYWRtX29wZW5zW251bV9hZG1fcGVybWl0dGVkX29wZW5zXS5wb3J0X3RvX2Nvbm5lY3QgPSBwb3J0OwotCXJldHVybiArK251bV9hZG1fcGVybWl0dGVkX29wZW5zOwotfQotCi12b2lkCi1jaGFubmVsX2NsZWFyX3Blcm1pdHRlZF9vcGVucyh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9wZXJtaXR0ZWRfb3BlbnM7IGkrKykKLQkJaWYgKHBlcm1pdHRlZF9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QgIT0gTlVMTCkKLQkJCXhmcmVlKHBlcm1pdHRlZF9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QpOwotCWlmIChudW1fcGVybWl0dGVkX29wZW5zID4gMCkgewotCQl4ZnJlZShwZXJtaXR0ZWRfb3BlbnMpOwotCQlwZXJtaXR0ZWRfb3BlbnMgPSBOVUxMOwotCX0KLQludW1fcGVybWl0dGVkX29wZW5zID0gMDsKLX0KLQotdm9pZAotY2hhbm5lbF9jbGVhcl9hZG1fcGVybWl0dGVkX29wZW5zKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2FkbV9wZXJtaXR0ZWRfb3BlbnM7IGkrKykKLQkJaWYgKHBlcm1pdHRlZF9hZG1fb3BlbnNbaV0uaG9zdF90b19jb25uZWN0ICE9IE5VTEwpCi0JCQl4ZnJlZShwZXJtaXR0ZWRfYWRtX29wZW5zW2ldLmhvc3RfdG9fY29ubmVjdCk7Ci0JaWYgKG51bV9hZG1fcGVybWl0dGVkX29wZW5zID4gMCkgewotCQl4ZnJlZShwZXJtaXR0ZWRfYWRtX29wZW5zKTsKLQkJcGVybWl0dGVkX2FkbV9vcGVucyA9IE5VTEw7Ci0JfQotCW51bV9hZG1fcGVybWl0dGVkX29wZW5zID0gMDsKLX0KLQotdm9pZAotY2hhbm5lbF9wcmludF9hZG1fcGVybWl0dGVkX29wZW5zKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlwcmludGYoInBlcm1pdG9wZW4iKTsKLQlpZiAobnVtX2FkbV9wZXJtaXR0ZWRfb3BlbnMgPT0gMCkgewotCQlwcmludGYoIiBhbnlcbiIpOwotCQlyZXR1cm47Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBudW1fYWRtX3Blcm1pdHRlZF9vcGVuczsgaSsrKQotCQlpZiAocGVybWl0dGVkX2FkbV9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QgIT0gTlVMTCkKLQkJCXByaW50ZigiICVzOiVkIiwgcGVybWl0dGVkX2FkbV9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QsCi0JCQkgICAgcGVybWl0dGVkX2FkbV9vcGVuc1tpXS5wb3J0X3RvX2Nvbm5lY3QpOwotCXByaW50ZigiXG4iKTsKLX0KLQotLyogVHJ5IHRvIHN0YXJ0IG5vbi1ibG9ja2luZyBjb25uZWN0IHRvIG5leHQgaG9zdCBpbiBjY3R4IGxpc3QgKi8KLXN0YXRpYyBpbnQKLWNvbm5lY3RfbmV4dChzdHJ1Y3QgY2hhbm5lbF9jb25uZWN0ICpjY3R4KQotewotCWludCBzb2NrLCBzYXZlZF9lcnJubzsKLQljaGFyIG50b3BbTklfTUFYSE9TVF0sIHN0cnBvcnRbTklfTUFYU0VSVl07Ci0KLQlmb3IgKDsgY2N0eC0+YWk7IGNjdHgtPmFpID0gY2N0eC0+YWktPmFpX25leHQpIHsKLQkJaWYgKGNjdHgtPmFpLT5haV9mYW1pbHkgIT0gQUZfSU5FVCAmJgotCQkgICAgY2N0eC0+YWktPmFpX2ZhbWlseSAhPSBBRl9JTkVUNikKLQkJCWNvbnRpbnVlOwotCQlpZiAoZ2V0bmFtZWluZm8oY2N0eC0+YWktPmFpX2FkZHIsIGNjdHgtPmFpLT5haV9hZGRybGVuLAotCQkgICAgbnRvcCwgc2l6ZW9mKG50b3ApLCBzdHJwb3J0LCBzaXplb2Yoc3RycG9ydCksCi0JCSAgICBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVikgIT0gMCkgewotCQkJZXJyb3IoImNvbm5lY3RfbmV4dDogZ2V0bmFtZWluZm8gZmFpbGVkIik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoKHNvY2sgPSBzb2NrZXQoY2N0eC0+YWktPmFpX2ZhbWlseSwgY2N0eC0+YWktPmFpX3NvY2t0eXBlLAotCQkgICAgY2N0eC0+YWktPmFpX3Byb3RvY29sKSkgPT0gLTEpIHsKLQkJCWlmIChjY3R4LT5haS0+YWlfbmV4dCA9PSBOVUxMKQotCQkJCWVycm9yKCJzb2NrZXQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQllbHNlCi0JCQkJdmVyYm9zZSgic29ja2V0OiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHNldF9ub25ibG9jayhzb2NrKSA9PSAtMSkKLQkJCWZhdGFsKCIlczogc2V0X25vbmJsb2NrKCVkKSIsIF9fZnVuY19fLCBzb2NrKTsKLQkJaWYgKGNvbm5lY3Qoc29jaywgY2N0eC0+YWktPmFpX2FkZHIsCi0JCSAgICBjY3R4LT5haS0+YWlfYWRkcmxlbikgPT0gLTEgJiYgZXJybm8gIT0gRUlOUFJPR1JFU1MpIHsKLQkJCWRlYnVnKCJjb25uZWN0X25leHQ6IGhvc3QgJS4xMDBzIChbJS4xMDBzXTolcyk6ICIKLQkJCSAgICAiJS4xMDBzIiwgY2N0eC0+aG9zdCwgbnRvcCwgc3RycG9ydCwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQkJc2F2ZWRfZXJybm8gPSBlcnJubzsKLQkJCWNsb3NlKHNvY2spOwotCQkJZXJybm8gPSBzYXZlZF9lcnJubzsKLQkJCWNvbnRpbnVlOwkvKiBmYWlsIC0tIHRyeSBuZXh0ICovCi0JCX0KLQkJZGVidWcoImNvbm5lY3RfbmV4dDogaG9zdCAlLjEwMHMgKFslLjEwMHNdOiVzKSAiCi0JCSAgICAiaW4gcHJvZ3Jlc3MsIGZkPSVkIiwgY2N0eC0+aG9zdCwgbnRvcCwgc3RycG9ydCwgc29jayk7Ci0JCWNjdHgtPmFpID0gY2N0eC0+YWktPmFpX25leHQ7Ci0JCXNldF9ub2RlbGF5KHNvY2spOwotCQlyZXR1cm4gc29jazsKLQl9Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdm9pZAotY2hhbm5lbF9jb25uZWN0X2N0eF9mcmVlKHN0cnVjdCBjaGFubmVsX2Nvbm5lY3QgKmNjdHgpCi17Ci0JeGZyZWUoY2N0eC0+aG9zdCk7Ci0JaWYgKGNjdHgtPmFpdG9wKQotCQlmcmVlYWRkcmluZm8oY2N0eC0+YWl0b3ApOwotCWJ6ZXJvKGNjdHgsIHNpemVvZigqY2N0eCkpOwotCWNjdHgtPmhvc3QgPSBOVUxMOwotCWNjdHgtPmFpID0gY2N0eC0+YWl0b3AgPSBOVUxMOwotfQotCi0vKiBSZXR1cm4gQ09OTkVDVElORyBjaGFubmVsIHRvIHJlbW90ZSBob3N0LCBwb3J0ICovCi1zdGF0aWMgQ2hhbm5lbCAqCi1jb25uZWN0X3RvKGNvbnN0IGNoYXIgKmhvc3QsIHVfc2hvcnQgcG9ydCwgY2hhciAqY3R5cGUsIGNoYXIgKnJuYW1lKQotewotCXN0cnVjdCBhZGRyaW5mbyBoaW50czsKLQlpbnQgZ2FpZXJyOwotCWludCBzb2NrID0gLTE7Ci0JY2hhciBzdHJwb3J0W05JX01BWFNFUlZdOwotCXN0cnVjdCBjaGFubmVsX2Nvbm5lY3QgY2N0eDsKLQlDaGFubmVsICpjOwotCi0JbWVtc2V0KCZjY3R4LCAwLCBzaXplb2YoY2N0eCkpOwotCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotCWhpbnRzLmFpX2ZhbWlseSA9IElQdjRvcjY7Ci0JaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLQlzbnByaW50ZihzdHJwb3J0LCBzaXplb2Ygc3RycG9ydCwgIiVkIiwgcG9ydCk7Ci0JaWYgKChnYWllcnIgPSBnZXRhZGRyaW5mbyhob3N0LCBzdHJwb3J0LCAmaGludHMsICZjY3R4LmFpdG9wKSkgIT0gMCkgewotCQllcnJvcigiY29ubmVjdF90byAlLjEwMHM6IHVua25vd24gaG9zdCAoJXMpIiwgaG9zdCwKLQkJICAgIHNzaF9nYWlfc3RyZXJyb3IoZ2FpZXJyKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWNjdHguaG9zdCA9IHhzdHJkdXAoaG9zdCk7Ci0JY2N0eC5wb3J0ID0gcG9ydDsKLQljY3R4LmFpID0gY2N0eC5haXRvcDsKLQotCWlmICgoc29jayA9IGNvbm5lY3RfbmV4dCgmY2N0eCkpID09IC0xKSB7Ci0JCWVycm9yKCJjb25uZWN0IHRvICUuMTAwcyBwb3J0ICVkIGZhaWxlZDogJXMiLAotCQkgICAgaG9zdCwgcG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJY2hhbm5lbF9jb25uZWN0X2N0eF9mcmVlKCZjY3R4KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWMgPSBjaGFubmVsX25ldyhjdHlwZSwgU1NIX0NIQU5ORUxfQ09OTkVDVElORywgc29jaywgc29jaywgLTEsCi0JICAgIENIQU5fVENQX1dJTkRPV19ERUZBVUxULCBDSEFOX1RDUF9QQUNLRVRfREVGQVVMVCwgMCwgcm5hbWUsIDEpOwotCWMtPmNvbm5lY3RfY3R4ID0gY2N0eDsKLQlyZXR1cm4gYzsKLX0KLQotQ2hhbm5lbCAqCi1jaGFubmVsX2Nvbm5lY3RfYnlfbGlzdGVuX2FkZHJlc3ModV9zaG9ydCBsaXN0ZW5fcG9ydCwgY2hhciAqY3R5cGUsIGNoYXIgKnJuYW1lKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9wZXJtaXR0ZWRfb3BlbnM7IGkrKykgewotCQlpZiAocGVybWl0dGVkX29wZW5zW2ldLmhvc3RfdG9fY29ubmVjdCAhPSBOVUxMICYmCi0JCSAgICBwZXJtaXR0ZWRfb3BlbnNbaV0ubGlzdGVuX3BvcnQgPT0gbGlzdGVuX3BvcnQpIHsKLQkJCXJldHVybiBjb25uZWN0X3RvKAotCQkJICAgIHBlcm1pdHRlZF9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QsCi0JCQkgICAgcGVybWl0dGVkX29wZW5zW2ldLnBvcnRfdG9fY29ubmVjdCwgY3R5cGUsIHJuYW1lKTsKLQkJfQotCX0KLQllcnJvcigiV0FSTklORzogU2VydmVyIHJlcXVlc3RzIGZvcndhcmRpbmcgZm9yIHVua25vd24gbGlzdGVuX3BvcnQgJWQiLAotCSAgICBsaXN0ZW5fcG9ydCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIENoZWNrIGlmIGNvbm5lY3RpbmcgdG8gdGhhdCBwb3J0IGlzIHBlcm1pdHRlZCBhbmQgY29ubmVjdC4gKi8KLUNoYW5uZWwgKgotY2hhbm5lbF9jb25uZWN0X3RvKGNvbnN0IGNoYXIgKmhvc3QsIHVfc2hvcnQgcG9ydCwgY2hhciAqY3R5cGUsIGNoYXIgKnJuYW1lKQotewotCWludCBpLCBwZXJtaXQsIHBlcm1pdF9hZG0gPSAxOwotCi0JcGVybWl0ID0gYWxsX29wZW5zX3Blcm1pdHRlZDsKLQlpZiAoIXBlcm1pdCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3Blcm1pdHRlZF9vcGVuczsgaSsrKQotCQkJaWYgKHBlcm1pdHRlZF9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QgIT0gTlVMTCAmJgotCQkJICAgIHBlcm1pdHRlZF9vcGVuc1tpXS5wb3J0X3RvX2Nvbm5lY3QgPT0gcG9ydCAmJgotCQkJICAgIHN0cmNtcChwZXJtaXR0ZWRfb3BlbnNbaV0uaG9zdF90b19jb25uZWN0LCBob3N0KSA9PSAwKQotCQkJCXBlcm1pdCA9IDE7Ci0JfQotCi0JaWYgKG51bV9hZG1fcGVybWl0dGVkX29wZW5zID4gMCkgewotCQlwZXJtaXRfYWRtID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IG51bV9hZG1fcGVybWl0dGVkX29wZW5zOyBpKyspCi0JCQlpZiAocGVybWl0dGVkX2FkbV9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QgIT0gTlVMTCAmJgotCQkJICAgIHBlcm1pdHRlZF9hZG1fb3BlbnNbaV0ucG9ydF90b19jb25uZWN0ID09IHBvcnQgJiYKLQkJCSAgICBzdHJjbXAocGVybWl0dGVkX2FkbV9vcGVuc1tpXS5ob3N0X3RvX2Nvbm5lY3QsIGhvc3QpCi0JCQkgICAgPT0gMCkKLQkJCQlwZXJtaXRfYWRtID0gMTsKLQl9Ci0KLQlpZiAoIXBlcm1pdCB8fCAhcGVybWl0X2FkbSkgewotCQlsb2dpdCgiUmVjZWl2ZWQgcmVxdWVzdCB0byBjb25uZWN0IHRvIGhvc3QgJS4xMDBzIHBvcnQgJWQsICIKLQkJICAgICJidXQgdGhlIHJlcXVlc3Qgd2FzIGRlbmllZC4iLCBob3N0LCBwb3J0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBjb25uZWN0X3RvKGhvc3QsIHBvcnQsIGN0eXBlLCBybmFtZSk7Ci19Ci0KLXZvaWQKLWNoYW5uZWxfc2VuZF93aW5kb3dfY2hhbmdlcyh2b2lkKQotewotCXVfaW50IGk7Ci0Jc3RydWN0IHdpbnNpemUgd3M7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHNfYWxsb2M7IGkrKykgewotCQlpZiAoY2hhbm5lbHNbaV0gPT0gTlVMTCB8fCAhY2hhbm5lbHNbaV0tPmNsaWVudF90dHkgfHwKLQkJICAgIGNoYW5uZWxzW2ldLT50eXBlICE9IFNTSF9DSEFOTkVMX09QRU4pCi0JCQljb250aW51ZTsKLQkJaWYgKGlvY3RsKGNoYW5uZWxzW2ldLT5yZmQsIFRJT0NHV0lOU1osICZ3cykgPCAwKQotCQkJY29udGludWU7Ci0JCWNoYW5uZWxfcmVxdWVzdF9zdGFydChpLCAid2luZG93LWNoYW5nZSIsIDApOwotCQlwYWNrZXRfcHV0X2ludCgodV9pbnQpd3Mud3NfY29sKTsKLQkJcGFja2V0X3B1dF9pbnQoKHVfaW50KXdzLndzX3Jvdyk7Ci0JCXBhY2tldF9wdXRfaW50KCh1X2ludCl3cy53c194cGl4ZWwpOwotCQlwYWNrZXRfcHV0X2ludCgodV9pbnQpd3Mud3NfeXBpeGVsKTsKLQkJcGFja2V0X3NlbmQoKTsKLQl9Ci19Ci0KLS8qIC0tIFgxMSBmb3J3YXJkaW5nICovCi0KLS8qCi0gKiBDcmVhdGVzIGFuIGludGVybmV0IGRvbWFpbiBzb2NrZXQgZm9yIGxpc3RlbmluZyBmb3IgWDExIGNvbm5lY3Rpb25zLgotICogUmV0dXJucyAwIGFuZCBhIHN1aXRhYmxlIGRpc3BsYXkgbnVtYmVyIGZvciB0aGUgRElTUExBWSB2YXJpYWJsZQotICogc3RvcmVkIGluIGRpc3BsYXlfbnVtYmVycCAsIG9yIC0xIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAqLwotaW50Ci14MTFfY3JlYXRlX2Rpc3BsYXlfaW5ldChpbnQgeDExX2Rpc3BsYXlfb2Zmc2V0LCBpbnQgeDExX3VzZV9sb2NhbGhvc3QsCi0gICAgaW50IHNpbmdsZV9jb25uZWN0aW9uLCB1X2ludCAqZGlzcGxheV9udW1iZXJwLCBpbnQgKipjaGFuaWRzKQotewotCUNoYW5uZWwgKm5jID0gTlVMTDsKLQlpbnQgZGlzcGxheV9udW1iZXIsIHNvY2s7Ci0JdV9zaG9ydCBwb3J0OwotCXN0cnVjdCBhZGRyaW5mbyBoaW50cywgKmFpLCAqYWl0b3A7Ci0JY2hhciBzdHJwb3J0W05JX01BWFNFUlZdOwotCWludCBnYWllcnIsIG4sIG51bV9zb2NrcyA9IDAsIHNvY2tzW05VTV9TT0NLU107Ci0KLQlpZiAoY2hhbmlkcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQlmb3IgKGRpc3BsYXlfbnVtYmVyID0geDExX2Rpc3BsYXlfb2Zmc2V0OwotCSAgICBkaXNwbGF5X251bWJlciA8IE1BWF9ESVNQTEFZUzsKLQkgICAgZGlzcGxheV9udW1iZXIrKykgewotCQlwb3J0ID0gNjAwMCArIGRpc3BsYXlfbnVtYmVyOwotCQltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLQkJaGludHMuYWlfZmFtaWx5ID0gSVB2NG9yNjsKLQkJaGludHMuYWlfZmxhZ3MgPSB4MTFfdXNlX2xvY2FsaG9zdCA/IDA6IEFJX1BBU1NJVkU7Ci0JCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0JCXNucHJpbnRmKHN0cnBvcnQsIHNpemVvZiBzdHJwb3J0LCAiJWQiLCBwb3J0KTsKLQkJaWYgKChnYWllcnIgPSBnZXRhZGRyaW5mbyhOVUxMLCBzdHJwb3J0LCAmaGludHMsICZhaXRvcCkpICE9IDApIHsKLQkJCWVycm9yKCJnZXRhZGRyaW5mbzogJS4xMDBzIiwgc3NoX2dhaV9zdHJlcnJvcihnYWllcnIpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlmb3IgKGFpID0gYWl0b3A7IGFpOyBhaSA9IGFpLT5haV9uZXh0KSB7Ci0JCQlpZiAoYWktPmFpX2ZhbWlseSAhPSBBRl9JTkVUICYmIGFpLT5haV9mYW1pbHkgIT0gQUZfSU5FVDYpCi0JCQkJY29udGludWU7Ci0JCQlzb2NrID0gc29ja2V0KGFpLT5haV9mYW1pbHksIGFpLT5haV9zb2NrdHlwZSwKLQkJCSAgICBhaS0+YWlfcHJvdG9jb2wpOwotCQkJaWYgKHNvY2sgPCAwKSB7Ci0JCQkJaWYgKChlcnJubyAhPSBFSU5WQUwpICYmIChlcnJubyAhPSBFQUZOT1NVUFBPUlQpCi0jaWZkZWYgRVBGTk9TVVBQT1JUCi0JCQkJICAgICYmIChlcnJubyAhPSBFUEZOT1NVUFBPUlQpCi0jZW5kaWYgCi0JCQkJICAgICkgewotCQkJCQllcnJvcigic29ja2V0OiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJCQlmcmVlYWRkcmluZm8oYWl0b3ApOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGVidWcoIngxMV9jcmVhdGVfZGlzcGxheV9pbmV0OiBTb2NrZXQgZmFtaWx5ICVkIG5vdCBzdXBwb3J0ZWQiLAotCQkJCQkJIGFpLT5haV9mYW1pbHkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUNikKLQkJCQlzb2NrX3NldF92Nm9ubHkoc29jayk7Ci0JCQlpZiAoeDExX3VzZV9sb2NhbGhvc3QpCi0JCQkJY2hhbm5lbF9zZXRfcmV1c2VhZGRyKHNvY2spOwotCQkJaWYgKGJpbmQoc29jaywgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKSA8IDApIHsKLQkJCQlkZWJ1ZzIoImJpbmQgcG9ydCAlZDogJS4xMDBzIiwgcG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQljbG9zZShzb2NrKTsKLQotCQkJCWZvciAobiA9IDA7IG4gPCBudW1fc29ja3M7IG4rKykgewotCQkJCQljbG9zZShzb2Nrc1tuXSk7Ci0JCQkJfQotCQkJCW51bV9zb2NrcyA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzb2Nrc1tudW1fc29ja3MrK10gPSBzb2NrOwotCQkJaWYgKG51bV9zb2NrcyA9PSBOVU1fU09DS1MpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZnJlZWFkZHJpbmZvKGFpdG9wKTsKLQkJaWYgKG51bV9zb2NrcyA+IDApCi0JCQlicmVhazsKLQl9Ci0JaWYgKGRpc3BsYXlfbnVtYmVyID49IE1BWF9ESVNQTEFZUykgewotCQllcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIGludGVybmV0LWRvbWFpbiBYMTEgZGlzcGxheSBzb2NrZXQuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogU3RhcnQgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucyBvbiB0aGUgc29ja2V0LiAqLwotCWZvciAobiA9IDA7IG4gPCBudW1fc29ja3M7IG4rKykgewotCQlzb2NrID0gc29ja3Nbbl07Ci0JCWlmIChsaXN0ZW4oc29jaywgU1NIX0xJU1RFTl9CQUNLTE9HKSA8IDApIHsKLQkJCWVycm9yKCJsaXN0ZW46ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQljbG9zZShzb2NrKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCS8qIEFsbG9jYXRlIGEgY2hhbm5lbCBmb3IgZWFjaCBzb2NrZXQuICovCi0JKmNoYW5pZHMgPSB4Y2FsbG9jKG51bV9zb2NrcyArIDEsIHNpemVvZigqKmNoYW5pZHMpKTsKLQlmb3IgKG4gPSAwOyBuIDwgbnVtX3NvY2tzOyBuKyspIHsKLQkJc29jayA9IHNvY2tzW25dOwotCQluYyA9IGNoYW5uZWxfbmV3KCJ4MTEgbGlzdGVuZXIiLAotCQkgICAgU1NIX0NIQU5ORUxfWDExX0xJU1RFTkVSLCBzb2NrLCBzb2NrLCAtMSwKLQkJICAgIENIQU5fWDExX1dJTkRPV19ERUZBVUxULCBDSEFOX1gxMV9QQUNLRVRfREVGQVVMVCwKLQkJICAgIDAsICJYMTEgaW5ldCBsaXN0ZW5lciIsIDEpOwotCQluYy0+c2luZ2xlX2Nvbm5lY3Rpb24gPSBzaW5nbGVfY29ubmVjdGlvbjsKLQkJKCpjaGFuaWRzKVtuXSA9IG5jLT5zZWxmOwotCX0KLQkoKmNoYW5pZHMpW25dID0gLTE7Ci0KLQkvKiBSZXR1cm4gdGhlIGRpc3BsYXkgbnVtYmVyIGZvciB0aGUgRElTUExBWSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gKi8KLQkqZGlzcGxheV9udW1iZXJwID0gZGlzcGxheV9udW1iZXI7Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludAotY29ubmVjdF9sb2NhbF94c29ja2V0X3BhdGgoY29uc3QgY2hhciAqcGF0aG5hbWUpCi17Ci0JaW50IHNvY2s7Ci0Jc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7Ci0KLQlzb2NrID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKLQlpZiAoc29jayA8IDApCi0JCWVycm9yKCJzb2NrZXQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotCWFkZHIuc3VuX2ZhbWlseSA9IEFGX1VOSVg7Ci0Jc3RybGNweShhZGRyLnN1bl9wYXRoLCBwYXRobmFtZSwgc2l6ZW9mIGFkZHIuc3VuX3BhdGgpOwotCWlmIChjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA9PSAwKQotCQlyZXR1cm4gc29jazsKLQljbG9zZShzb2NrKTsKLQllcnJvcigiY29ubmVjdCAlLjEwMHM6ICUuMTAwcyIsIGFkZHIuc3VuX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50Ci1jb25uZWN0X2xvY2FsX3hzb2NrZXQodV9pbnQgZG5yKQotewotCWNoYXIgYnVmWzEwMjRdOwotCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgX1BBVEhfVU5JWF9YLCBkbnIpOwotCXJldHVybiBjb25uZWN0X2xvY2FsX3hzb2NrZXRfcGF0aChidWYpOwotfQotCi1pbnQKLXgxMV9jb25uZWN0X2Rpc3BsYXkodm9pZCkKLXsKLQl1X2ludCBkaXNwbGF5X251bWJlcjsKLQljb25zdCBjaGFyICpkaXNwbGF5OwotCWNoYXIgYnVmWzEwMjRdLCAqY3A7Ci0Jc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWksICphaXRvcDsKLQljaGFyIHN0cnBvcnRbTklfTUFYU0VSVl07Ci0JaW50IGdhaWVyciwgc29jayA9IDA7Ci0KLQkvKiBUcnkgdG8gb3BlbiBhIHNvY2tldCBmb3IgdGhlIGxvY2FsIFggc2VydmVyLiAqLwotCWRpc3BsYXkgPSBnZXRlbnYoIkRJU1BMQVkiKTsKLQlpZiAoIWRpc3BsYXkpIHsKLQkJZXJyb3IoIkRJU1BMQVkgbm90IHNldC4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkvKgotCSAqIE5vdyB3ZSBkZWNvZGUgdGhlIHZhbHVlIG9mIHRoZSBESVNQTEFZIHZhcmlhYmxlIGFuZCBtYWtlIGEKLQkgKiBjb25uZWN0aW9uIHRvIHRoZSByZWFsIFggc2VydmVyLgotCSAqLwotCi0JLyogQ2hlY2sgaWYgdGhlIGRpc3BsYXkgaXMgZnJvbSBsYXVuY2hkLiAqLwotI2lmZGVmIF9fQVBQTEVfXwotCWlmIChzdHJuY21wKGRpc3BsYXksICIvdG1wL2xhdW5jaCIsIDExKSA9PSAwKSB7Ci0JCXNvY2sgPSBjb25uZWN0X2xvY2FsX3hzb2NrZXRfcGF0aChkaXNwbGF5KTsKLQkJaWYgKHNvY2sgPCAwKQotCQkJcmV0dXJuIC0xOwotCi0JCS8qIE9LLCB3ZSBub3cgaGF2ZSBhIGNvbm5lY3Rpb24gdG8gdGhlIGRpc3BsYXkuICovCi0JCXJldHVybiBzb2NrOwotCX0KLSNlbmRpZgotCS8qCi0JICogQ2hlY2sgaWYgaXQgaXMgYSB1bml4IGRvbWFpbiBzb2NrZXQuICBVbml4IGRvbWFpbiBkaXNwbGF5cyBhcmUgaW4KLQkgKiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOiB1bml4OmRbLnNdLCA6ZFsuc10sIDo6ZFsuc10KLQkgKi8KLQlpZiAoc3RybmNtcChkaXNwbGF5LCAidW5peDoiLCA1KSA9PSAwIHx8Ci0JICAgIGRpc3BsYXlbMF0gPT0gJzonKSB7Ci0JCS8qIENvbm5lY3QgdG8gdGhlIHVuaXggZG9tYWluIHNvY2tldC4gKi8KLQkJaWYgKHNzY2FuZihzdHJyY2hyKGRpc3BsYXksICc6JykgKyAxLCAiJXUiLCAmZGlzcGxheV9udW1iZXIpICE9IDEpIHsKLQkJCWVycm9yKCJDb3VsZCBub3QgcGFyc2UgZGlzcGxheSBudW1iZXIgZnJvbSBESVNQTEFZOiAlLjEwMHMiLAotCQkJICAgIGRpc3BsYXkpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCS8qIENyZWF0ZSBhIHNvY2tldC4gKi8KLQkJc29jayA9IGNvbm5lY3RfbG9jYWxfeHNvY2tldChkaXNwbGF5X251bWJlcik7Ci0JCWlmIChzb2NrIDwgMCkKLQkJCXJldHVybiAtMTsKLQotCQkvKiBPSywgd2Ugbm93IGhhdmUgYSBjb25uZWN0aW9uIHRvIHRoZSBkaXNwbGF5LiAqLwotCQlyZXR1cm4gc29jazsKLQl9Ci0JLyoKLQkgKiBDb25uZWN0IHRvIGFuIGluZXQgc29ja2V0LiAgVGhlIERJU1BMQVkgdmFsdWUgaXMgc3VwcG9zZWRseQotCSAqIGhvc3RuYW1lOmRbLnNdLCB3aGVyZSBob3N0bmFtZSBtYXkgYWxzbyBiZSBudW1lcmljIElQIGFkZHJlc3MuCi0JICovCi0Jc3RybGNweShidWYsIGRpc3BsYXksIHNpemVvZihidWYpKTsKLQljcCA9IHN0cmNocihidWYsICc6Jyk7Ci0JaWYgKCFjcCkgewotCQllcnJvcigiQ291bGQgbm90IGZpbmQgJzonIGluIERJU1BMQVk6ICUuMTAwcyIsIGRpc3BsYXkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpjcCA9IDA7Ci0JLyogYnVmIG5vdyBjb250YWlucyB0aGUgaG9zdCBuYW1lLiAgQnV0IGZpcnN0IHdlIHBhcnNlIHRoZSBkaXNwbGF5IG51bWJlci4gKi8KLQlpZiAoc3NjYW5mKGNwICsgMSwgIiV1IiwgJmRpc3BsYXlfbnVtYmVyKSAhPSAxKSB7Ci0JCWVycm9yKCJDb3VsZCBub3QgcGFyc2UgZGlzcGxheSBudW1iZXIgZnJvbSBESVNQTEFZOiAlLjEwMHMiLAotCQkgICAgZGlzcGxheSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBMb29rIHVwIHRoZSBob3N0IGFkZHJlc3MgKi8KLQltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLQloaW50cy5haV9mYW1pbHkgPSBJUHY0b3I2OwotCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0Jc25wcmludGYoc3RycG9ydCwgc2l6ZW9mIHN0cnBvcnQsICIldSIsIDYwMDAgKyBkaXNwbGF5X251bWJlcik7Ci0JaWYgKChnYWllcnIgPSBnZXRhZGRyaW5mbyhidWYsIHN0cnBvcnQsICZoaW50cywgJmFpdG9wKSkgIT0gMCkgewotCQllcnJvcigiJS4xMDBzOiB1bmtub3duIGhvc3QuICglcykiLCBidWYsCi0JCXNzaF9nYWlfc3RyZXJyb3IoZ2FpZXJyKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZm9yIChhaSA9IGFpdG9wOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgewotCQkvKiBDcmVhdGUgYSBzb2NrZXQuICovCi0JCXNvY2sgPSBzb2NrZXQoYWktPmFpX2ZhbWlseSwgYWktPmFpX3NvY2t0eXBlLCBhaS0+YWlfcHJvdG9jb2wpOwotCQlpZiAoc29jayA8IDApIHsKLQkJCWRlYnVnMigic29ja2V0OiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJY29udGludWU7Ci0JCX0KLQkJLyogQ29ubmVjdCBpdCB0byB0aGUgZGlzcGxheS4gKi8KLQkJaWYgKGNvbm5lY3Qoc29jaywgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKSA8IDApIHsKLQkJCWRlYnVnMigiY29ubmVjdCAlLjEwMHMgcG9ydCAldTogJS4xMDBzIiwgYnVmLAotCQkJICAgIDYwMDAgKyBkaXNwbGF5X251bWJlciwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCWNsb3NlKHNvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJLyogU3VjY2VzcyAqLwotCQlicmVhazsKLQl9Ci0JZnJlZWFkZHJpbmZvKGFpdG9wKTsKLQlpZiAoIWFpKSB7Ci0JCWVycm9yKCJjb25uZWN0ICUuMTAwcyBwb3J0ICV1OiAlLjEwMHMiLCBidWYsIDYwMDAgKyBkaXNwbGF5X251bWJlciwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2V0X25vZGVsYXkoc29jayk7Ci0JcmV0dXJuIHNvY2s7Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIGNhbGxlZCB3aGVuIFNTSF9TTVNHX1gxMV9PUEVOIGlzIHJlY2VpdmVkLiAgVGhlIHBhY2tldCBjb250YWlucwotICogdGhlIHJlbW90ZSBjaGFubmVsIG51bWJlci4gIFdlIHNob3VsZCBkbyB3aGF0ZXZlciB3ZSB3YW50LCBhbmQgcmVzcG9uZAotICogd2l0aCBlaXRoZXIgU1NIX01TR19PUEVOX0NPTkZJUk1BVElPTiBvciBTU0hfTVNHX09QRU5fRkFJTFVSRS4KLSAqLwotCi0vKiBBUkdTVVNFRCAqLwotdm9pZAoteDExX2lucHV0X29wZW4oaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JQ2hhbm5lbCAqYyA9IE5VTEw7Ci0JaW50IHJlbW90ZV9pZCwgc29jayA9IDA7Ci0JY2hhciAqcmVtb3RlX2hvc3Q7Ci0KLQlkZWJ1ZygiUmVjZWl2ZWQgWDExIG9wZW4gcmVxdWVzdC4iKTsKLQotCXJlbW90ZV9pZCA9IHBhY2tldF9nZXRfaW50KCk7Ci0KLQlpZiAocGFja2V0X2dldF9wcm90b2NvbF9mbGFncygpICYgU1NIX1BST1RPRkxBR19IT1NUX0lOX0ZXRF9PUEVOKSB7Ci0JCXJlbW90ZV9ob3N0ID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JfSBlbHNlIHsKLQkJcmVtb3RlX2hvc3QgPSB4c3RyZHVwKCJ1bmtub3duIChyZW1vdGUgZGlkIG5vdCBzdXBwbHkgbmFtZSkiKTsKLQl9Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JLyogT2J0YWluIGEgY29ubmVjdGlvbiB0byB0aGUgcmVhbCBYIGRpc3BsYXkuICovCi0Jc29jayA9IHgxMV9jb25uZWN0X2Rpc3BsYXkoKTsKLQlpZiAoc29jayAhPSAtMSkgewotCQkvKiBBbGxvY2F0ZSBhIGNoYW5uZWwgZm9yIHRoaXMgY29ubmVjdGlvbi4gKi8KLQkJYyA9IGNoYW5uZWxfbmV3KCJjb25uZWN0ZWQgeDExIHNvY2tldCIsCi0JCSAgICBTU0hfQ0hBTk5FTF9YMTFfT1BFTiwgc29jaywgc29jaywgLTEsIDAsIDAsIDAsCi0JCSAgICByZW1vdGVfaG9zdCwgMSk7Ci0JCWMtPnJlbW90ZV9pZCA9IHJlbW90ZV9pZDsKLQkJYy0+Zm9yY2VfZHJhaW4gPSAxOwotCX0KLQl4ZnJlZShyZW1vdGVfaG9zdCk7Ci0JaWYgKGMgPT0gTlVMTCkgewotCQkvKiBTZW5kIHJlZnVzYWwgdG8gdGhlIHJlbW90ZSBob3N0LiAqLwotCQlwYWNrZXRfc3RhcnQoU1NIX01TR19DSEFOTkVMX09QRU5fRkFJTFVSRSk7Ci0JCXBhY2tldF9wdXRfaW50KHJlbW90ZV9pZCk7Ci0JfSBlbHNlIHsKLQkJLyogU2VuZCBhIGNvbmZpcm1hdGlvbiB0byB0aGUgcmVtb3RlIGhvc3QuICovCi0JCXBhY2tldF9zdGFydChTU0hfTVNHX0NIQU5ORUxfT1BFTl9DT05GSVJNQVRJT04pOwotCQlwYWNrZXRfcHV0X2ludChyZW1vdGVfaWQpOwotCQlwYWNrZXRfcHV0X2ludChjLT5zZWxmKTsKLQl9Ci0JcGFja2V0X3NlbmQoKTsKLX0KLQotLyogZHVtbXkgcHJvdG9jb2wgaGFuZGxlciB0aGF0IGRlbmllcyBTU0gtMSByZXF1ZXN0cyAoYWdlbnQveDExKSAqLwotLyogQVJHU1VTRUQgKi8KLXZvaWQKLWRlbnlfaW5wdXRfb3BlbihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlpbnQgcmNoYW4gPSBwYWNrZXRfZ2V0X2ludCgpOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBTU0hfU01TR19BR0VOVF9PUEVOOgotCQllcnJvcigiV2FybmluZzogc3NoIHNlcnZlciB0cmllZCBhZ2VudCBmb3J3YXJkaW5nLiIpOwotCQlicmVhazsKLQljYXNlIFNTSF9TTVNHX1gxMV9PUEVOOgotCQllcnJvcigiV2FybmluZzogc3NoIHNlcnZlciB0cmllZCBYMTEgZm9yd2FyZGluZy4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyb3IoImRlbnlfaW5wdXRfb3BlbjogdHlwZSAlZCIsIHR5cGUpOwotCQlicmVhazsKLQl9Ci0JZXJyb3IoIldhcm5pbmc6IHRoaXMgaXMgcHJvYmFibHkgYSBicmVhay1pbiBhdHRlbXB0IGJ5IGEgbWFsaWNpb3VzIHNlcnZlci4iKTsKLQlwYWNrZXRfc3RhcnQoU1NIX01TR19DSEFOTkVMX09QRU5fRkFJTFVSRSk7Ci0JcGFja2V0X3B1dF9pbnQocmNoYW4pOwotCXBhY2tldF9zZW5kKCk7Ci19Ci0KLS8qCi0gKiBSZXF1ZXN0cyBmb3J3YXJkaW5nIG9mIFgxMSBjb25uZWN0aW9ucywgZ2VuZXJhdGVzIGZha2UgYXV0aGVudGljYXRpb24KLSAqIGRhdGEsIGFuZCBlbmFibGVzIGF1dGhlbnRpY2F0aW9uIHNwb29maW5nLgotICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBjbGllbnQgb25seS4KLSAqLwotdm9pZAoteDExX3JlcXVlc3RfZm9yd2FyZGluZ193aXRoX3Nwb29maW5nKGludCBjbGllbnRfc2Vzc2lvbl9pZCwgY29uc3QgY2hhciAqZGlzcCwKLSAgICBjb25zdCBjaGFyICpwcm90bywgY29uc3QgY2hhciAqZGF0YSwgaW50IHdhbnRfcmVwbHkpCi17Ci0JdV9pbnQgZGF0YV9sZW4gPSAodV9pbnQpIHN0cmxlbihkYXRhKSAvIDI7Ci0JdV9pbnQgaSwgdmFsdWU7Ci0JY2hhciAqbmV3X2RhdGE7Ci0JaW50IHNjcmVlbl9udW1iZXI7Ci0JY29uc3QgY2hhciAqY3A7Ci0JdV9pbnQzMl90IHJuZCA9IDA7Ci0KLQlpZiAoeDExX3NhdmVkX2Rpc3BsYXkgPT0gTlVMTCkKLQkJeDExX3NhdmVkX2Rpc3BsYXkgPSB4c3RyZHVwKGRpc3ApOwotCWVsc2UgaWYgKHN0cmNtcChkaXNwLCB4MTFfc2F2ZWRfZGlzcGxheSkgIT0gMCkgewotCQllcnJvcigieDExX3JlcXVlc3RfZm9yd2FyZGluZ193aXRoX3Nwb29maW5nOiBkaWZmZXJlbnQgIgotCQkgICAgIiRESVNQTEFZIGFscmVhZHkgZm9yd2FyZGVkIik7Ci0JCXJldHVybjsKLQl9Ci0KLQljcCA9IHN0cmNocihkaXNwLCAnOicpOwotCWlmIChjcCkKLQkJY3AgPSBzdHJjaHIoY3AsICcuJyk7Ci0JaWYgKGNwKQotCQlzY3JlZW5fbnVtYmVyID0gKHVfaW50KXN0cnRvbnVtKGNwICsgMSwgMCwgNDAwLCBOVUxMKTsKLQllbHNlCi0JCXNjcmVlbl9udW1iZXIgPSAwOwotCi0JaWYgKHgxMV9zYXZlZF9wcm90byA9PSBOVUxMKSB7Ci0JCS8qIFNhdmUgcHJvdG9jb2wgbmFtZS4gKi8KLQkJeDExX3NhdmVkX3Byb3RvID0geHN0cmR1cChwcm90byk7Ci0JCS8qCi0JCSAqIEV4dHJhY3QgcmVhbCBhdXRoZW50aWNhdGlvbiBkYXRhIGFuZCBnZW5lcmF0ZSBmYWtlIGRhdGEKLQkJICogb2YgdGhlIHNhbWUgbGVuZ3RoLgotCQkgKi8KLQkJeDExX3NhdmVkX2RhdGEgPSB4bWFsbG9jKGRhdGFfbGVuKTsKLQkJeDExX2Zha2VfZGF0YSA9IHhtYWxsb2MoZGF0YV9sZW4pOwotCQlmb3IgKGkgPSAwOyBpIDwgZGF0YV9sZW47IGkrKykgewotCQkJaWYgKHNzY2FuZihkYXRhICsgMiAqIGksICIlMngiLCAmdmFsdWUpICE9IDEpCi0JCQkJZmF0YWwoIngxMV9yZXF1ZXN0X2ZvcndhcmRpbmc6IGJhZCAiCi0JCQkJICAgICJhdXRoZW50aWNhdGlvbiBkYXRhOiAlLjEwMHMiLCBkYXRhKTsKLQkJCWlmIChpICUgNCA9PSAwKQotCQkJCXJuZCA9IGFyYzRyYW5kb20oKTsKLQkJCXgxMV9zYXZlZF9kYXRhW2ldID0gdmFsdWU7Ci0JCQl4MTFfZmFrZV9kYXRhW2ldID0gcm5kICYgMHhmZjsKLQkJCXJuZCA+Pj0gODsKLQkJfQotCQl4MTFfc2F2ZWRfZGF0YV9sZW4gPSBkYXRhX2xlbjsKLQkJeDExX2Zha2VfZGF0YV9sZW4gPSBkYXRhX2xlbjsKLQl9Ci0KLQkvKiBDb252ZXJ0IHRoZSBmYWtlIGRhdGEgaW50byBoZXguICovCi0JbmV3X2RhdGEgPSB0b2hleCh4MTFfZmFrZV9kYXRhLCBkYXRhX2xlbik7Ci0KLQkvKiBTZW5kIHRoZSByZXF1ZXN0IHBhY2tldC4gKi8KLQlpZiAoY29tcGF0MjApIHsKLQkJY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0KGNsaWVudF9zZXNzaW9uX2lkLCAieDExLXJlcSIsIHdhbnRfcmVwbHkpOwotCQlwYWNrZXRfcHV0X2NoYXIoMCk7CS8qIFhYWCBib29sIHNpbmdsZSBjb25uZWN0aW9uICovCi0JfSBlbHNlIHsKLQkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX1gxMV9SRVFVRVNUX0ZPUldBUkRJTkcpOwotCX0KLQlwYWNrZXRfcHV0X2NzdHJpbmcocHJvdG8pOwotCXBhY2tldF9wdXRfY3N0cmluZyhuZXdfZGF0YSk7Ci0JcGFja2V0X3B1dF9pbnQoc2NyZWVuX251bWJlcik7Ci0JcGFja2V0X3NlbmQoKTsKLQlwYWNrZXRfd3JpdGVfd2FpdCgpOwotCXhmcmVlKG5ld19kYXRhKTsKLX0KLQotCi0vKiAtLSBhZ2VudCBmb3J3YXJkaW5nICovCi0KLS8qIFNlbmRzIGEgbWVzc2FnZSB0byB0aGUgc2VydmVyIHRvIHJlcXVlc3QgYXV0aGVudGljYXRpb24gZmQgZm9yd2FyZGluZy4gKi8KLQotdm9pZAotYXV0aF9yZXF1ZXN0X2ZvcndhcmRpbmcodm9pZCkKLXsKLQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfQUdFTlRfUkVRVUVTVF9GT1JXQVJESU5HKTsKLQlwYWNrZXRfc2VuZCgpOwotCXBhY2tldF93cml0ZV93YWl0KCk7Ci19CmRpZmYgLS1naXQgYS9jaGFubmVscy5oIGIvY2hhbm5lbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5NDFjOC4uMDAwMDAwMAotLS0gYS9jaGFubmVscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qICRPcGVuQlNEOiBjaGFubmVscy5oLHYgMS4xMDUgMjAxMS8wNi8yMiAyMjowODo0MiBkam0gRXhwICQgKi8KLQotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIENIQU5ORUxfSAotI2RlZmluZSBDSEFOTkVMX0gKLQotLyogRGVmaW5pdGlvbnMgZm9yIGNoYW5uZWwgdHlwZXMuICovCi0jZGVmaW5lIFNTSF9DSEFOTkVMX1gxMV9MSVNURU5FUgkxCS8qIExpc3RlbmluZyBmb3IgaW5ldCBYMTEgY29ubi4gKi8KLSNkZWZpbmUgU1NIX0NIQU5ORUxfUE9SVF9MSVNURU5FUgkyCS8qIExpc3RlbmluZyBvbiBhIHBvcnQuICovCi0jZGVmaW5lIFNTSF9DSEFOTkVMX09QRU5JTkcJCTMJLyogd2FpdGluZyBmb3IgY29uZmlybWF0aW9uICovCi0jZGVmaW5lIFNTSF9DSEFOTkVMX09QRU4JCTQJLyogbm9ybWFsIG9wZW4gdHdvLXdheSBjaGFubmVsICovCi0jZGVmaW5lIFNTSF9DSEFOTkVMX0NMT1NFRAkJNQkvKiB3YWl0aW5nIGZvciBjbG9zZSBjb25maXJtYXRpb24gKi8KLSNkZWZpbmUgU1NIX0NIQU5ORUxfQVVUSF9TT0NLRVQJCTYJLyogYXV0aGVudGljYXRpb24gc29ja2V0ICovCi0jZGVmaW5lIFNTSF9DSEFOTkVMX1gxMV9PUEVOCQk3CS8qIHJlYWRpbmcgZmlyc3QgWDExIHBhY2tldCAqLwotI2RlZmluZSBTU0hfQ0hBTk5FTF9JTlBVVF9EUkFJTklORwk4CS8qIHNlbmRpbmcgcmVtYWluaW5nIGRhdGEgdG8gY29ubiAqLwotI2RlZmluZSBTU0hfQ0hBTk5FTF9PVVRQVVRfRFJBSU5JTkcJOQkvKiBzZW5kaW5nIHJlbWFpbmluZyBkYXRhIHRvIGFwcCAqLwotI2RlZmluZSBTU0hfQ0hBTk5FTF9MQVJWQUwJCTEwCS8qIGxhcnZhbCBzZXNzaW9uICovCi0jZGVmaW5lIFNTSF9DSEFOTkVMX1JQT1JUX0xJU1RFTkVSCTExCS8qIExpc3RlbmluZyB0byBhIFItc3R5bGUgcG9ydCAgKi8KLSNkZWZpbmUgU1NIX0NIQU5ORUxfQ09OTkVDVElORwkJMTIKLSNkZWZpbmUgU1NIX0NIQU5ORUxfRFlOQU1JQwkJMTMKLSNkZWZpbmUgU1NIX0NIQU5ORUxfWk9NQklFCQkxNAkvKiBBbG1vc3QgZGVhZC4gKi8KLSNkZWZpbmUgU1NIX0NIQU5ORUxfTVVYX0xJU1RFTkVSCTE1CS8qIExpc3RlbmVyIGZvciBtdXggY29ubi4gKi8KLSNkZWZpbmUgU1NIX0NIQU5ORUxfTVVYX0NMSUVOVAkJMTYJLyogQ29ubi4gdG8gbXV4IHNsYXZlICovCi0jZGVmaW5lIFNTSF9DSEFOTkVMX01BWF9UWVBFCQkxNwotCi1zdHJ1Y3QgQ2hhbm5lbDsKLXR5cGVkZWYgc3RydWN0IENoYW5uZWwgQ2hhbm5lbDsKLQotdHlwZWRlZiB2b2lkIGNoYW5uZWxfb3Blbl9mbihpbnQsIGludCwgdm9pZCAqKTsKLXR5cGVkZWYgdm9pZCBjaGFubmVsX2NhbGxiYWNrX2ZuKGludCwgdm9pZCAqKTsKLXR5cGVkZWYgaW50IGNoYW5uZWxfaW5maWx0ZXJfZm4oc3RydWN0IENoYW5uZWwgKiwgY2hhciAqLCBpbnQpOwotdHlwZWRlZiB2b2lkIGNoYW5uZWxfZmlsdGVyX2NsZWFudXBfZm4oaW50LCB2b2lkICopOwotdHlwZWRlZiB1X2NoYXIgKmNoYW5uZWxfb3V0ZmlsdGVyX2ZuKHN0cnVjdCBDaGFubmVsICosIHVfY2hhciAqKiwgdV9pbnQgKik7Ci0KLS8qIENoYW5uZWwgc3VjY2Vzcy9mYWlsdXJlIGNhbGxiYWNrcyAqLwotdHlwZWRlZiB2b2lkIGNoYW5uZWxfY29uZmlybV9jYihpbnQsIHN0cnVjdCBDaGFubmVsICosIHZvaWQgKik7Ci10eXBlZGVmIHZvaWQgY2hhbm5lbF9jb25maXJtX2FiYW5kb25fY2Ioc3RydWN0IENoYW5uZWwgKiwgdm9pZCAqKTsKLXN0cnVjdCBjaGFubmVsX2NvbmZpcm0gewotCVRBSUxRX0VOVFJZKGNoYW5uZWxfY29uZmlybSkgZW50cnk7Ci0JY2hhbm5lbF9jb25maXJtX2NiICpjYjsKLQljaGFubmVsX2NvbmZpcm1fYWJhbmRvbl9jYiAqYWJhbmRvbl9jYjsKLQl2b2lkICpjdHg7Ci19OwotVEFJTFFfSEVBRChjaGFubmVsX2NvbmZpcm1zLCBjaGFubmVsX2NvbmZpcm0pOwotCi0vKiBDb250ZXh0IGZvciBub24tYmxvY2tpbmcgY29ubmVjdHMgKi8KLXN0cnVjdCBjaGFubmVsX2Nvbm5lY3QgewotCWNoYXIgKmhvc3Q7Ci0JaW50IHBvcnQ7Ci0Jc3RydWN0IGFkZHJpbmZvICphaSwgKmFpdG9wOwotfTsKLQotLyogQ2FsbGJhY2tzIGZvciBtdXggY2hhbm5lbHMgYmFjayBpbnRvIGNsaWVudC1zcGVjaWZpYyBjb2RlICovCi10eXBlZGVmIGludCBtdXhfY2FsbGJhY2tfZm4oc3RydWN0IENoYW5uZWwgKik7Ci0KLXN0cnVjdCBDaGFubmVsIHsKLQlpbnQgICAgIHR5cGU7CQkvKiBjaGFubmVsIHR5cGUvc3RhdGUgKi8KLQlpbnQgICAgIHNlbGY7CQkvKiBteSBvd24gY2hhbm5lbCBpZGVudGlmaWVyICovCi0JaW50ICAgICByZW1vdGVfaWQ7CS8qIGNoYW5uZWwgaWRlbnRpZmllciBmb3IgcmVtb3RlIHBlZXIgKi8KLQl1X2ludCAgIGlzdGF0ZTsJCS8qIGlucHV0IGZyb20gY2hhbm5lbCAoc3RhdGUgb2YgcmVjZWl2ZSBoYWxmKSAqLwotCXVfaW50ICAgb3N0YXRlOwkJLyogb3V0cHV0IHRvIGNoYW5uZWwgIChzdGF0ZSBvZiB0cmFuc21pdCBoYWxmKSAqLwotCWludCAgICAgZmxhZ3M7CQkvKiBjbG9zZSBzZW50L3JjdmQgKi8KLQlpbnQgICAgIHJmZDsJCS8qIHJlYWQgZmQgKi8KLQlpbnQgICAgIHdmZDsJCS8qIHdyaXRlIGZkICovCi0JaW50ICAgICBlZmQ7CQkvKiBleHRlbmRlZCBmZCAqLwotCWludCAgICAgc29jazsJCS8qIHNvY2sgZmQgKi8KLQlpbnQgICAgIGN0bF9jaGFuOwkvKiBjb250cm9sIGNoYW5uZWwgKG11bHRpcGxleGVkIGNvbm5lY3Rpb25zKSAqLwotCWludCAgICAgaXNhdHR5OwkJLyogcmZkIGlzIGEgdHR5ICovCi0JaW50ICAgICB3ZmRfaXNhdHR5OwkvKiB3ZmQgaXMgYSB0dHkgKi8KLQlpbnQJY2xpZW50X3R0eTsJLyogKGNsaWVudCkgVFRZIGhhcyBiZWVuIHJlcXVlc3RlZCAqLwotCWludCAgICAgZm9yY2VfZHJhaW47CS8qIGZvcmNlIGNsb3NlIG9uIGlFT0YgKi8KLQlpbnQgICAgIGRlbGF5ZWQ7CS8qIHBvc3Qtc2VsZWN0IGhhbmRsZXJzIGZvciBuZXdseSBjcmVhdGVkCi0JCQkJICogY2hhbm5lbHMgYXJlIGRlbGF5ZWQgdW50aWwgdGhlIGZpcnN0IGNhbGwKLQkJCQkgKiB0byBhIG1hdGNoaW5nIHByZS1zZWxlY3QgaGFuZGxlci4gCi0JCQkJICogdGhpcyB3YXkgcG9zdC1zZWxlY3QgaGFuZGxlcnMgYXJlIG5vdAotCQkJCSAqIGFjY2lkZW5seSBjYWxsZWQgaWYgYSBGRCBnZXRzIHJldXNlZCAqLwotCUJ1ZmZlciAgaW5wdXQ7CQkvKiBkYXRhIHJlYWQgZnJvbSBzb2NrZXQsIHRvIGJlIHNlbnQgb3ZlcgotCQkJCSAqIGVuY3J5cHRlZCBjb25uZWN0aW9uICovCi0JQnVmZmVyICBvdXRwdXQ7CQkvKiBkYXRhIHJlY2VpdmVkIG92ZXIgZW5jcnlwdGVkIGNvbm5lY3Rpb24gZm9yCi0JCQkJICogc2VuZCBvbiBzb2NrZXQgKi8KLQlCdWZmZXIgIGV4dGVuZGVkOwotCWNoYXIgICAgKnBhdGg7Ci0JCS8qIHBhdGggZm9yIHVuaXggZG9tYWluIHNvY2tldHMsIG9yIGhvc3QgbmFtZSBmb3IgZm9yd2FyZHMgKi8KLQlpbnQgICAgIGxpc3RlbmluZ19wb3J0OwkvKiBwb3J0IGJlaW5nIGxpc3RlbmVkIGZvciBmb3J3YXJkcyAqLwotCWludCAgICAgaG9zdF9wb3J0OwkvKiByZW1vdGUgcG9ydCB0byBjb25uZWN0IGZvciBmb3J3YXJkcyAqLwotCWNoYXIgICAqcmVtb3RlX25hbWU7CS8qIHJlbW90ZSBob3N0bmFtZSAqLwotCi0JdV9pbnQJcmVtb3RlX3dpbmRvdzsKLQl1X2ludAlyZW1vdGVfbWF4cGFja2V0OwotCXVfaW50CWxvY2FsX3dpbmRvdzsKLQl1X2ludAlsb2NhbF93aW5kb3dfbWF4OwotCXVfaW50CWxvY2FsX2NvbnN1bWVkOwotCXVfaW50CWxvY2FsX21heHBhY2tldDsKLQlpbnQgICAgIGV4dGVuZGVkX3VzYWdlOwotCWludAlzaW5nbGVfY29ubmVjdGlvbjsKLQotCWNoYXIgICAqY3R5cGU7CQkvKiB0eXBlICovCi0KLQkvKiBjYWxsYmFjayAqLwotCWNoYW5uZWxfb3Blbl9mbgkJKm9wZW5fY29uZmlybTsKLQl2b2lkCQkJKm9wZW5fY29uZmlybV9jdHg7Ci0JY2hhbm5lbF9jYWxsYmFja19mbgkqZGV0YWNoX3VzZXI7Ci0JaW50CQkJZGV0YWNoX2Nsb3NlOwotCXN0cnVjdCBjaGFubmVsX2NvbmZpcm1zCXN0YXR1c19jb25maXJtczsKLQotCS8qIGZpbHRlciAqLwotCWNoYW5uZWxfaW5maWx0ZXJfZm4JKmlucHV0X2ZpbHRlcjsKLQljaGFubmVsX291dGZpbHRlcl9mbgkqb3V0cHV0X2ZpbHRlcjsKLQl2b2lkCQkJKmZpbHRlcl9jdHg7Ci0JY2hhbm5lbF9maWx0ZXJfY2xlYW51cF9mbiAqZmlsdGVyX2NsZWFudXA7Ci0KLQkvKiBrZWVwIGJvdW5kYXJpZXMgKi8KLQlpbnQgICAgIAkJZGF0YWdyYW07Ci0KLQkvKiBub24tYmxvY2tpbmcgY29ubmVjdCAqLwotCXN0cnVjdCBjaGFubmVsX2Nvbm5lY3QJY29ubmVjdF9jdHg7Ci0KLQkvKiBtdWx0aXBsZXhpbmcgcHJvdG9jb2wgaG9vaywgY2FsbGVkIGZvciBlYWNoIHBhY2tldCByZWNlaXZlZCAqLwotCW11eF9jYWxsYmFja19mbgkJKm11eF9yY2I7Ci0Jdm9pZAkJCSptdXhfY3R4OwotCWludAkJCW11eF9wYXVzZTsKLX07Ci0KLSNkZWZpbmUgQ0hBTl9FWFRFTkRFRF9JR05PUkUJCTAKLSNkZWZpbmUgQ0hBTl9FWFRFTkRFRF9SRUFECQkxCi0jZGVmaW5lIENIQU5fRVhURU5ERURfV1JJVEUJCTIKLQotLyogZGVmYXVsdCB3aW5kb3cvcGFja2V0IHNpemVzIGZvciB0Y3AveDExLWZ3ZC1jaGFubmVsICovCi0jZGVmaW5lIENIQU5fU0VTX1BBQ0tFVF9ERUZBVUxUCSgzMioxMDI0KQotI2RlZmluZSBDSEFOX1NFU19XSU5ET1dfREVGQVVMVAkoNjQqQ0hBTl9TRVNfUEFDS0VUX0RFRkFVTFQpCi0jZGVmaW5lIENIQU5fVENQX1BBQ0tFVF9ERUZBVUxUCSgzMioxMDI0KQotI2RlZmluZSBDSEFOX1RDUF9XSU5ET1dfREVGQVVMVAkoNjQqQ0hBTl9UQ1BfUEFDS0VUX0RFRkFVTFQpCi0jZGVmaW5lIENIQU5fWDExX1BBQ0tFVF9ERUZBVUxUCSgxNioxMDI0KQotI2RlZmluZSBDSEFOX1gxMV9XSU5ET1dfREVGQVVMVAkoNCpDSEFOX1gxMV9QQUNLRVRfREVGQVVMVCkKLQotLyogcG9zc2libGUgaW5wdXQgc3RhdGVzICovCi0jZGVmaW5lIENIQU5fSU5QVVRfT1BFTgkJCTAKLSNkZWZpbmUgQ0hBTl9JTlBVVF9XQUlUX0RSQUlOCQkxCi0jZGVmaW5lIENIQU5fSU5QVVRfV0FJVF9PQ0xPU0UJCTIKLSNkZWZpbmUgQ0hBTl9JTlBVVF9DTE9TRUQJCTMKLQotLyogcG9zc2libGUgb3V0cHV0IHN0YXRlcyAqLwotI2RlZmluZSBDSEFOX09VVFBVVF9PUEVOCQkwCi0jZGVmaW5lIENIQU5fT1VUUFVUX1dBSVRfRFJBSU4JCTEKLSNkZWZpbmUgQ0hBTl9PVVRQVVRfV0FJVF9JRU9GCQkyCi0jZGVmaW5lIENIQU5fT1VUUFVUX0NMT1NFRAkJMwotCi0jZGVmaW5lIENIQU5fQ0xPU0VfU0VOVAkJCTB4MDEKLSNkZWZpbmUgQ0hBTl9DTE9TRV9SQ1ZECQkJMHgwMgotI2RlZmluZSBDSEFOX0VPRl9TRU5UCQkJMHgwNAotI2RlZmluZSBDSEFOX0VPRl9SQ1ZECQkJMHgwOAotI2RlZmluZSBDSEFOX0xPQ0FMCQkJMHgxMAotCi0jZGVmaW5lIENIQU5fUkJVRgkxNioxMDI0Ci0KLS8qIGNoZWNrIHdoZXRoZXIgJ2VmZCcgaXMgc3RpbGwgaW4gdXNlICovCi0jZGVmaW5lIENIQU5ORUxfRUZEX0lOUFVUX0FDVElWRShjKSBcCi0JKGNvbXBhdDIwICYmIGMtPmV4dGVuZGVkX3VzYWdlID09IENIQU5fRVhURU5ERURfUkVBRCAmJiBcCi0JKGMtPmVmZCAhPSAtMSB8fCBcCi0JYnVmZmVyX2xlbigmYy0+ZXh0ZW5kZWQpID4gMCkpCi0jZGVmaW5lIENIQU5ORUxfRUZEX09VVFBVVF9BQ1RJVkUoYykgXAotCShjb21wYXQyMCAmJiBjLT5leHRlbmRlZF91c2FnZSA9PSBDSEFOX0VYVEVOREVEX1dSSVRFICYmIFwKLQljLT5lZmQgIT0gLTEgJiYgKCEoYy0+ZmxhZ3MgJiAoQ0hBTl9FT0ZfUkNWRHxDSEFOX0NMT1NFX1JDVkQpKSB8fCBcCi0JYnVmZmVyX2xlbigmYy0+ZXh0ZW5kZWQpID4gMCkpCi0KLS8qIGNoYW5uZWwgbWFuYWdlbWVudCAqLwotCi1DaGFubmVsCSpjaGFubmVsX2J5X2lkKGludCk7Ci1DaGFubmVsCSpjaGFubmVsX2xvb2t1cChpbnQpOwotQ2hhbm5lbCAqY2hhbm5lbF9uZXcoY2hhciAqLCBpbnQsIGludCwgaW50LCBpbnQsIHVfaW50LCB1X2ludCwgaW50LCBjaGFyICosIGludCk7Ci12b2lkCSBjaGFubmVsX3NldF9mZHMoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCB1X2ludCk7Ci12b2lkCSBjaGFubmVsX2ZyZWUoQ2hhbm5lbCAqKTsKLXZvaWQJIGNoYW5uZWxfZnJlZV9hbGwodm9pZCk7Ci12b2lkCSBjaGFubmVsX3N0b3BfbGlzdGVuaW5nKHZvaWQpOwotCi12b2lkCSBjaGFubmVsX3NlbmRfb3BlbihpbnQpOwotdm9pZAkgY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0KGludCwgY2hhciAqLCBpbnQpOwotdm9pZAkgY2hhbm5lbF9yZWdpc3Rlcl9jbGVhbnVwKGludCwgY2hhbm5lbF9jYWxsYmFja19mbiAqLCBpbnQpOwotdm9pZAkgY2hhbm5lbF9yZWdpc3Rlcl9vcGVuX2NvbmZpcm0oaW50LCBjaGFubmVsX29wZW5fZm4gKiwgdm9pZCAqKTsKLXZvaWQJIGNoYW5uZWxfcmVnaXN0ZXJfZmlsdGVyKGludCwgY2hhbm5lbF9pbmZpbHRlcl9mbiAqLAotICAgIGNoYW5uZWxfb3V0ZmlsdGVyX2ZuICosIGNoYW5uZWxfZmlsdGVyX2NsZWFudXBfZm4gKiwgdm9pZCAqKTsKLXZvaWQJIGNoYW5uZWxfcmVnaXN0ZXJfc3RhdHVzX2NvbmZpcm0oaW50LCBjaGFubmVsX2NvbmZpcm1fY2IgKiwKLSAgICBjaGFubmVsX2NvbmZpcm1fYWJhbmRvbl9jYiAqLCB2b2lkICopOwotdm9pZAkgY2hhbm5lbF9jYW5jZWxfY2xlYW51cChpbnQpOwotaW50CSBjaGFubmVsX2Nsb3NlX2ZkKGludCAqKTsKLXZvaWQJIGNoYW5uZWxfc2VuZF93aW5kb3dfY2hhbmdlcyh2b2lkKTsKLQotLyogcHJvdG9jb2wgaGFuZGxlciAqLwotCi12b2lkCSBjaGFubmVsX2lucHV0X2Nsb3NlKGludCwgdV9pbnQzMl90LCB2b2lkICopOwotdm9pZAkgY2hhbm5lbF9pbnB1dF9jbG9zZV9jb25maXJtYXRpb24oaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Ci12b2lkCSBjaGFubmVsX2lucHV0X2RhdGEoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Ci12b2lkCSBjaGFubmVsX2lucHV0X2V4dGVuZGVkX2RhdGEoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Ci12b2lkCSBjaGFubmVsX2lucHV0X2llb2YoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Ci12b2lkCSBjaGFubmVsX2lucHV0X29jbG9zZShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKLXZvaWQJIGNoYW5uZWxfaW5wdXRfb3Blbl9jb25maXJtYXRpb24oaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Ci12b2lkCSBjaGFubmVsX2lucHV0X29wZW5fZmFpbHVyZShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKLXZvaWQJIGNoYW5uZWxfaW5wdXRfcG9ydF9vcGVuKGludCwgdV9pbnQzMl90LCB2b2lkICopOwotdm9pZAkgY2hhbm5lbF9pbnB1dF93aW5kb3dfYWRqdXN0KGludCwgdV9pbnQzMl90LCB2b2lkICopOwotdm9pZAkgY2hhbm5lbF9pbnB1dF9zdGF0dXNfY29uZmlybShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKLQotLyogZmlsZSBkZXNjcmlwdG9yIGhhbmRsaW5nIChyZWFkL3dyaXRlKSAqLwotCi12b2lkCSBjaGFubmVsX3ByZXBhcmVfc2VsZWN0KGZkX3NldCAqKiwgZmRfc2V0ICoqLCBpbnQgKiwgdV9pbnQqLCBpbnQpOwotdm9pZCAgICAgY2hhbm5lbF9hZnRlcl9zZWxlY3QoZmRfc2V0ICosIGZkX3NldCAqKTsKLXZvaWQgICAgIGNoYW5uZWxfb3V0cHV0X3BvbGwodm9pZCk7Ci0KLWludCAgICAgIGNoYW5uZWxfbm90X3ZlcnlfbXVjaF9idWZmZXJlZF9kYXRhKHZvaWQpOwotdm9pZCAgICAgY2hhbm5lbF9jbG9zZV9hbGwodm9pZCk7Ci1pbnQgICAgICBjaGFubmVsX3N0aWxsX29wZW4odm9pZCk7Ci1jaGFyCSpjaGFubmVsX29wZW5fbWVzc2FnZSh2b2lkKTsKLWludAkgY2hhbm5lbF9maW5kX29wZW4odm9pZCk7Ci0KLS8qIHRjcCBmb3J3YXJkaW5nICovCi12b2lkCSBjaGFubmVsX3NldF9hZihpbnQgYWYpOwotdm9pZCAgICAgY2hhbm5lbF9wZXJtaXRfYWxsX29wZW5zKHZvaWQpOwotdm9pZAkgY2hhbm5lbF9hZGRfcGVybWl0dGVkX29wZW5zKGNoYXIgKiwgaW50KTsKLWludAkgY2hhbm5lbF9hZGRfYWRtX3Blcm1pdHRlZF9vcGVucyhjaGFyICosIGludCk7Ci12b2lkCSBjaGFubmVsX2NsZWFyX3Blcm1pdHRlZF9vcGVucyh2b2lkKTsKLXZvaWQJIGNoYW5uZWxfY2xlYXJfYWRtX3Blcm1pdHRlZF9vcGVucyh2b2lkKTsKLXZvaWQgCSBjaGFubmVsX3ByaW50X2FkbV9wZXJtaXR0ZWRfb3BlbnModm9pZCk7Ci1pbnQgICAgICBjaGFubmVsX2lucHV0X3BvcnRfZm9yd2FyZF9yZXF1ZXN0KGludCwgaW50KTsKLUNoYW5uZWwJKmNoYW5uZWxfY29ubmVjdF90byhjb25zdCBjaGFyICosIHVfc2hvcnQsIGNoYXIgKiwgY2hhciAqKTsKLUNoYW5uZWwJKmNoYW5uZWxfY29ubmVjdF9zdGRpb19md2QoY29uc3QgY2hhciosIHVfc2hvcnQsIGludCwgaW50KTsKLUNoYW5uZWwJKmNoYW5uZWxfY29ubmVjdF9ieV9saXN0ZW5fYWRkcmVzcyh1X3Nob3J0LCBjaGFyICosIGNoYXIgKik7Ci1pbnQJIGNoYW5uZWxfcmVxdWVzdF9yZW1vdGVfZm9yd2FyZGluZyhjb25zdCBjaGFyICosIHVfc2hvcnQsCi0JICAgICBjb25zdCBjaGFyICosIHVfc2hvcnQpOwotaW50CSBjaGFubmVsX3NldHVwX2xvY2FsX2Z3ZF9saXN0ZW5lcihjb25zdCBjaGFyICosIHVfc2hvcnQsCi0JICAgICBjb25zdCBjaGFyICosIHVfc2hvcnQsIGludCk7Ci12b2lkCSBjaGFubmVsX3JlcXVlc3RfcmZvcndhcmRfY2FuY2VsKGNvbnN0IGNoYXIgKmhvc3QsIHVfc2hvcnQgcG9ydCk7Ci1pbnQJIGNoYW5uZWxfc2V0dXBfcmVtb3RlX2Z3ZF9saXN0ZW5lcihjb25zdCBjaGFyICosIHVfc2hvcnQsIGludCAqLCBpbnQpOwotaW50CSBjaGFubmVsX2NhbmNlbF9ycG9ydF9saXN0ZW5lcihjb25zdCBjaGFyICosIHVfc2hvcnQpOwotCi0vKiB4MTEgZm9yd2FyZGluZyAqLwotCi1pbnQJIHgxMV9jb25uZWN0X2Rpc3BsYXkodm9pZCk7Ci1pbnQJIHgxMV9jcmVhdGVfZGlzcGxheV9pbmV0KGludCwgaW50LCBpbnQsIHVfaW50ICosIGludCAqKik7Ci12b2lkICAgICB4MTFfaW5wdXRfb3BlbihpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKLXZvaWQJIHgxMV9yZXF1ZXN0X2ZvcndhcmRpbmdfd2l0aF9zcG9vZmluZyhpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCSAgICAgY29uc3QgY2hhciAqLCBpbnQpOwotdm9pZAkgZGVueV9pbnB1dF9vcGVuKGludCwgdV9pbnQzMl90LCB2b2lkICopOwotCi0vKiBhZ2VudCBmb3J3YXJkaW5nICovCi0KLXZvaWQJIGF1dGhfcmVxdWVzdF9mb3J3YXJkaW5nKHZvaWQpOwotCi0vKiBjaGFubmVsIGNsb3NlICovCi0KLWludAkgY2hhbl9pc19kZWFkKENoYW5uZWwgKiwgaW50KTsKLXZvaWQJIGNoYW5fbWFya19kZWFkKENoYW5uZWwgKik7Ci0KLS8qIGNoYW5uZWwgZXZlbnRzICovCi0KLXZvaWQJIGNoYW5fcmN2ZF9vY2xvc2UoQ2hhbm5lbCAqKTsKLXZvaWQJIGNoYW5fcmN2ZF9lb3coQ2hhbm5lbCAqKTsJLyogU1NIMi1vbmx5ICovCi12b2lkCSBjaGFuX3JlYWRfZmFpbGVkKENoYW5uZWwgKik7Ci12b2lkCSBjaGFuX2lidWZfZW1wdHkoQ2hhbm5lbCAqKTsKLQotdm9pZAkgY2hhbl9yY3ZkX2llb2YoQ2hhbm5lbCAqKTsKLXZvaWQJIGNoYW5fd3JpdGVfZmFpbGVkKENoYW5uZWwgKik7Ci12b2lkCSBjaGFuX29idWZfZW1wdHkoQ2hhbm5lbCAqKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jaXBoZXItM2RlczEuYyBiL2NpcGhlci0zZGVzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2FhNTg4Li4wMDAwMDAwCi0tLSBhL2NpcGhlci0zZGVzMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qICRPcGVuQlNEOiBjaXBoZXItM2RlczEuYyx2IDEuNyAyMDEwLzEwLzAxIDIzOjA1OjMyIGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJsb2cuaCIKLQotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmgiCi0KLS8qCi0gKiBUaGlzIGlzIHVzZWQgYnkgU1NIMToKLSAqCi0gKiBXaGF0IGtpbmQgb2YgdHJpcGxlIERFUyBhcmUgdGhlc2UgMiByb3V0aW5lcz8KLSAqCi0gKiBXaHkgaXMgdGhlcmUgYSByZWR1bmRhbnQgaW5pdGlhbGl6YXRpb24gdmVjdG9yPwotICoKLSAqIElmIG9ubHkgaXYzIHdhcyB1c2VkLCB0aGVuLCB0aGlzIHdvdWxkIHRpbGwgZWZmZWN0IGhhdmUgYmVlbgotICogb3V0ZXItY2JjLiBIb3dldmVyLCB0aGVyZSBpcyBhbHNvIGEgcHJpdmF0ZSBpdjEgPT0gaXYyIHdoaWNoCi0gKiBwZXJoYXBzIG1ha2VzIGRpZmZlcmVudGlhbCBhbmFseXNpcyBlYXNpZXIuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUKLSAqIHByaXZhdGUgaXYxIHByb2JhYmx5IG1ha2VzIHRoZSBDUkMtMzIgYXR0YWNrIGluZWZmZWN0aXZlLiBUaGlzIGlzIGEKLSAqIHJlc3VsdCBvZiB0aGF0IHRoZXJlIGlzIG5vIGxvbmdlciBhbnkga25vd24gaXYxIHRvIHVzZSB3aGVuCi0gKiBjaG9vc2luZyB0aGUgWCBibG9jay4KLSAqLwotc3RydWN0IHNzaDFfM2Rlc19jdHgKLXsKLQlFVlBfQ0lQSEVSX0NUWAlrMSwgazIsIGszOwotfTsKLQotY29uc3QgRVZQX0NJUEhFUiAqIGV2cF9zc2gxXzNkZXModm9pZCk7Ci12b2lkIHNzaDFfM2Rlc19pdihFVlBfQ0lQSEVSX0NUWCAqLCBpbnQsIHVfY2hhciAqLCBpbnQpOwotCi1zdGF0aWMgaW50Ci1zc2gxXzNkZXNfaW5pdChFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1X2NoYXIgKmtleSwgY29uc3QgdV9jaGFyICppdiwKLSAgICBpbnQgZW5jKQotewotCXN0cnVjdCBzc2gxXzNkZXNfY3R4ICpjOwotCXVfY2hhciAqazEsICprMiwgKmszOwotCi0JaWYgKChjID0gRVZQX0NJUEhFUl9DVFhfZ2V0X2FwcF9kYXRhKGN0eCkpID09IE5VTEwpIHsKLQkJYyA9IHhtYWxsb2Moc2l6ZW9mKCpjKSk7Ci0JCUVWUF9DSVBIRVJfQ1RYX3NldF9hcHBfZGF0YShjdHgsIGMpOwotCX0KLQlpZiAoa2V5ID09IE5VTEwpCi0JCXJldHVybiAoMSk7Ci0JaWYgKGVuYyA9PSAtMSkKLQkJZW5jID0gY3R4LT5lbmNyeXB0OwotCWsxID0gazIgPSBrMyA9ICh1X2NoYXIgKikga2V5OwotCWsyICs9IDg7Ci0JaWYgKEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoY3R4KSA+PSAxNis4KSB7Ci0JCWlmIChlbmMpCi0JCQlrMyArPSAxNjsKLQkJZWxzZQotCQkJazEgKz0gMTY7Ci0JfQotCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmMtPmsxKTsKLQlFVlBfQ0lQSEVSX0NUWF9pbml0KCZjLT5rMik7Ci0JRVZQX0NJUEhFUl9DVFhfaW5pdCgmYy0+azMpOwotI2lmZGVmIFNTSF9PTERfRVZQCi0JRVZQX0NpcGhlckluaXQoJmMtPmsxLCBFVlBfZGVzX2NiYygpLCBrMSwgTlVMTCwgZW5jKTsKLQlFVlBfQ2lwaGVySW5pdCgmYy0+azIsIEVWUF9kZXNfY2JjKCksIGsyLCBOVUxMLCAhZW5jKTsKLQlFVlBfQ2lwaGVySW5pdCgmYy0+azMsIEVWUF9kZXNfY2JjKCksIGszLCBOVUxMLCBlbmMpOwotI2Vsc2UKLQlpZiAoRVZQX0NpcGhlckluaXQoJmMtPmsxLCBFVlBfZGVzX2NiYygpLCBrMSwgTlVMTCwgZW5jKSA9PSAwIHx8Ci0JICAgIEVWUF9DaXBoZXJJbml0KCZjLT5rMiwgRVZQX2Rlc19jYmMoKSwgazIsIE5VTEwsICFlbmMpID09IDAgfHwKLQkgICAgRVZQX0NpcGhlckluaXQoJmMtPmszLCBFVlBfZGVzX2NiYygpLCBrMywgTlVMTCwgZW5jKSA9PSAwKSB7Ci0JCW1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKLQkJeGZyZWUoYyk7Ci0JCUVWUF9DSVBIRVJfQ1RYX3NldF9hcHBfZGF0YShjdHgsIE5VTEwpOwotCQlyZXR1cm4gKDApOwotCX0KLSNlbmRpZgotCXJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNzaDFfM2Rlc19jYmMoRVZQX0NJUEhFUl9DVFggKmN0eCwgdV9jaGFyICpkZXN0LCBjb25zdCB1X2NoYXIgKnNyYywKLSAgICBMSUJDUllQVE9fRVZQX0lOTF9UWVBFIGxlbikKLXsKLQlzdHJ1Y3Qgc3NoMV8zZGVzX2N0eCAqYzsKLQotCWlmICgoYyA9IEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShjdHgpKSA9PSBOVUxMKSB7Ci0JCWVycm9yKCJzc2gxXzNkZXNfY2JjOiBubyBjb250ZXh0Iik7Ci0JCXJldHVybiAoMCk7Ci0JfQotI2lmZGVmIFNTSF9PTERfRVZQCi0JRVZQX0NpcGhlcigmYy0+azEsIGRlc3QsICh1X2NoYXIgKilzcmMsIGxlbik7Ci0JRVZQX0NpcGhlcigmYy0+azIsIGRlc3QsIGRlc3QsIGxlbik7Ci0JRVZQX0NpcGhlcigmYy0+azMsIGRlc3QsIGRlc3QsIGxlbik7Ci0jZWxzZQotCWlmIChFVlBfQ2lwaGVyKCZjLT5rMSwgZGVzdCwgKHVfY2hhciAqKXNyYywgbGVuKSA9PSAwIHx8Ci0JICAgIEVWUF9DaXBoZXIoJmMtPmsyLCBkZXN0LCBkZXN0LCBsZW4pID09IDAgfHwKLQkgICAgRVZQX0NpcGhlcigmYy0+azMsIGRlc3QsIGRlc3QsIGxlbikgPT0gMCkKLQkJcmV0dXJuICgwKTsKLSNlbmRpZgotCXJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNzaDFfM2Rlc19jbGVhbnVwKEVWUF9DSVBIRVJfQ1RYICpjdHgpCi17Ci0Jc3RydWN0IHNzaDFfM2Rlc19jdHggKmM7Ci0KLQlpZiAoKGMgPSBFVlBfQ0lQSEVSX0NUWF9nZXRfYXBwX2RhdGEoY3R4KSkgIT0gTlVMTCkgewotCQlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjLT5rMSk7Ci0JCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmMtPmsyKTsKLQkJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmYy0+azMpOwotCQltZW1zZXQoYywgMCwgc2l6ZW9mKCpjKSk7Ci0JCXhmcmVlKGMpOwotCQlFVlBfQ0lQSEVSX0NUWF9zZXRfYXBwX2RhdGEoY3R4LCBOVUxMKTsKLQl9Ci0JcmV0dXJuICgxKTsKLX0KLQotdm9pZAotc3NoMV8zZGVzX2l2KEVWUF9DSVBIRVJfQ1RYICpldnAsIGludCBkb3NldCwgdV9jaGFyICppdiwgaW50IGxlbikKLXsKLQlzdHJ1Y3Qgc3NoMV8zZGVzX2N0eCAqYzsKLQotCWlmIChsZW4gIT0gMjQpCi0JCWZhdGFsKCIlczogYmFkIDNkZXMgaXYgbGVuZ3RoOiAlZCIsIF9fZnVuY19fLCBsZW4pOwotCWlmICgoYyA9IEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShldnApKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IG5vIDNkZXMgY29udGV4dCIsIF9fZnVuY19fKTsKLQlpZiAoZG9zZXQpIHsKLQkJZGVidWczKCIlczogSW5zdGFsbGVkIDNERVMgSVYiLCBfX2Z1bmNfXyk7Ci0JCW1lbWNweShjLT5rMS5pdiwgaXYsIDgpOwotCQltZW1jcHkoYy0+azIuaXYsIGl2ICsgOCwgOCk7Ci0JCW1lbWNweShjLT5rMy5pdiwgaXYgKyAxNiwgOCk7Ci0JfSBlbHNlIHsKLQkJZGVidWczKCIlczogQ29weWluZyAzREVTIElWIiwgX19mdW5jX18pOwotCQltZW1jcHkoaXYsIGMtPmsxLml2LCA4KTsKLQkJbWVtY3B5KGl2ICsgOCwgYy0+azIuaXYsIDgpOwotCQltZW1jcHkoaXYgKyAxNiwgYy0+azMuaXYsIDgpOwotCX0KLX0KLQotY29uc3QgRVZQX0NJUEhFUiAqCi1ldnBfc3NoMV8zZGVzKHZvaWQpCi17Ci0Jc3RhdGljIEVWUF9DSVBIRVIgc3NoMV8zZGVzOwotCi0JbWVtc2V0KCZzc2gxXzNkZXMsIDAsIHNpemVvZihFVlBfQ0lQSEVSKSk7Ci0Jc3NoMV8zZGVzLm5pZCA9IE5JRF91bmRlZjsKLQlzc2gxXzNkZXMuYmxvY2tfc2l6ZSA9IDg7Ci0Jc3NoMV8zZGVzLml2X2xlbiA9IDA7Ci0Jc3NoMV8zZGVzLmtleV9sZW4gPSAxNjsKLQlzc2gxXzNkZXMuaW5pdCA9IHNzaDFfM2Rlc19pbml0OwotCXNzaDFfM2Rlcy5jbGVhbnVwID0gc3NoMV8zZGVzX2NsZWFudXA7Ci0Jc3NoMV8zZGVzLmRvX2NpcGhlciA9IHNzaDFfM2Rlc19jYmM7Ci0jaWZuZGVmIFNTSF9PTERfRVZQCi0Jc3NoMV8zZGVzLmZsYWdzID0gRVZQX0NJUEhfQ0JDX01PREUgfCBFVlBfQ0lQSF9WQVJJQUJMRV9MRU5HVEg7Ci0jZW5kaWYKLQlyZXR1cm4gKCZzc2gxXzNkZXMpOwotfQpkaWZmIC0tZ2l0IGEvY2lwaGVyLWFjc3MuYyBiL2NpcGhlci1hY3NzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NTVmOTIuLjAwMDAwMDAKLS0tIGEvY2lwaGVyLWFjc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIE9wZW5CU0QgcHJvamVjdAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWYgIWRlZmluZWQoRVZQX0NUUkxfU0VUX0FDU1NfTU9ERSkgJiYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMEwpCi0KLSNpbmNsdWRlICJhY3NzLmgiCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKLQotI2RlZmluZSBkYXRhKGN0eCkgKChFVlBfQUNTU19LRVkgKikoY3R4KS0+Y2lwaGVyX2RhdGEpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlBQ1NTX0tFWSBrczsKLX0gRVZQX0FDU1NfS0VZOwotCi0jZGVmaW5lIEVWUF9DVFJMX1NFVF9BQ1NTX01PREUgICAgICAgICAgMHhmZjA2Ci0jZGVmaW5lIEVWUF9DVFJMX1NFVF9BQ1NTX1NVQktFWSAgICAgICAgMHhmZjA3Ci0KLXN0YXRpYyBpbnQKLWFjc3NfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LCBpbnQgZW5jKQotewotCWFjc3Nfc2V0a2V5KCZkYXRhKGN0eCktPmtzLGtleSxlbmMsQUNTU19EQVRBKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotYWNzc19jaXBoKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sCi0gICAgTElCQ1JZUFRPX0VWUF9JTkxfVFlQRSBpbmwpCi17Ci0JYWNzcygmZGF0YShjdHgpLT5rcyxpbmwsaW4sb3V0KTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotYWNzc19jdHJsKEVWUF9DSVBIRVJfQ1RYICpjdHgsIGludCB0eXBlLCBpbnQgYXJnLCB2b2lkICpwdHIpCi17Ci0Jc3dpdGNoKHR5cGUpIHsKLQljYXNlIEVWUF9DVFJMX1NFVF9BQ1NTX01PREU6Ci0JCWRhdGEoY3R4KS0+a3MubW9kZSA9IGFyZzsKLQkJcmV0dXJuIDE7Ci0JY2FzZSBFVlBfQ1RSTF9TRVRfQUNTU19TVUJLRVk6Ci0JCWFjc3Nfc2V0c3Via2V5KCZkYXRhKGN0eCktPmtzLCh1bnNpZ25lZCBjaGFyICopcHRyKTsKLQkJcmV0dXJuIDE7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KLX0KLQotY29uc3QgRVZQX0NJUEhFUiAqCi1ldnBfYWNzcyh2b2lkKQotewotCXN0YXRpYyBFVlBfQ0lQSEVSIGFjc3NfY2lwaGVyOwotCi0JbWVtc2V0KCZhY3NzX2NpcGhlciwgMCwgc2l6ZW9mKEVWUF9DSVBIRVIpKTsKLQotCWFjc3NfY2lwaGVyLm5pZCA9IE5JRF91bmRlZjsKLQlhY3NzX2NpcGhlci5ibG9ja19zaXplID0gMTsKLQlhY3NzX2NpcGhlci5rZXlfbGVuID0gNTsKLQlhY3NzX2NpcGhlci5pbml0ID0gYWNzc19pbml0X2tleTsKLQlhY3NzX2NpcGhlci5kb19jaXBoZXIgPSBhY3NzX2NpcGg7Ci0JYWNzc19jaXBoZXIuY3R4X3NpemUgPSBzaXplb2YoRVZQX0FDU1NfS0VZKTsKLQlhY3NzX2NpcGhlci5jdHJsID0gYWNzc19jdHJsOwotCi0JcmV0dXJuICgmYWNzc19jaXBoZXIpOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2NpcGhlci1hZXMuYyBiL2NpcGhlci1hZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkYTZkMi4uMDAwMDAwMAotLS0gYS9jaXBoZXItYWVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLS8qIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgb3IgYnJva2VuIE9wZW5TU0wgdmVyc2lvbnMgKi8KLSNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC5oIgotCi0jaWZkZWYgVVNFX0JVSUxUSU5fUklKTkRBRUwKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInJpam5kYWVsLmgiCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImxvZy5oIgotCi0jZGVmaW5lIFJJSk5EQUVMX0JMT0NLU0laRSAxNgotc3RydWN0IHNzaF9yaWpuZGFlbF9jdHgKLXsKLQlyaWpuZGFlbF9jdHgJcl9jdHg7Ci0JdV9jaGFyCQlyX2l2W1JJSk5EQUVMX0JMT0NLU0laRV07Ci19OwotCi1jb25zdCBFVlBfQ0lQSEVSICogZXZwX3Jpam5kYWVsKHZvaWQpOwotdm9pZCBzc2hfcmlqbmRhZWxfaXYoRVZQX0NJUEhFUl9DVFggKiwgaW50LCB1X2NoYXIgKiwgdV9pbnQpOwotCi1zdGF0aWMgaW50Ci1zc2hfcmlqbmRhZWxfaW5pdChFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1X2NoYXIgKmtleSwgY29uc3QgdV9jaGFyICppdiwKLSAgICBpbnQgZW5jKQotewotCXN0cnVjdCBzc2hfcmlqbmRhZWxfY3R4ICpjOwotCi0JaWYgKChjID0gRVZQX0NJUEhFUl9DVFhfZ2V0X2FwcF9kYXRhKGN0eCkpID09IE5VTEwpIHsKLQkJYyA9IHhtYWxsb2Moc2l6ZW9mKCpjKSk7Ci0JCUVWUF9DSVBIRVJfQ1RYX3NldF9hcHBfZGF0YShjdHgsIGMpOwotCX0KLQlpZiAoa2V5ICE9IE5VTEwpIHsKLQkJaWYgKGVuYyA9PSAtMSkKLQkJCWVuYyA9IGN0eC0+ZW5jcnlwdDsKLQkJcmlqbmRhZWxfc2V0X2tleSgmYy0+cl9jdHgsICh1X2NoYXIgKilrZXksCi0JCSAgICA4KkVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoY3R4KSwgZW5jKTsKLQl9Ci0JaWYgKGl2ICE9IE5VTEwpCi0JCW1lbWNweShjLT5yX2l2LCBpdiwgUklKTkRBRUxfQkxPQ0tTSVpFKTsKLQlyZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgaW50Ci1zc2hfcmlqbmRhZWxfY2JjKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVfY2hhciAqZGVzdCwgY29uc3QgdV9jaGFyICpzcmMsCi0gICAgTElCQ1JZUFRPX0VWUF9JTkxfVFlQRSBsZW4pCi17Ci0Jc3RydWN0IHNzaF9yaWpuZGFlbF9jdHggKmM7Ci0JdV9jaGFyIGJ1ZltSSUpOREFFTF9CTE9DS1NJWkVdOwotCXVfY2hhciAqY3ByZXYsICpjbm93LCAqcGxhaW4sICppdnA7Ci0JaW50IGksIGosIGJsb2NrcyA9IGxlbiAvIFJJSk5EQUVMX0JMT0NLU0laRTsKLQotCWlmIChsZW4gPT0gMCkKLQkJcmV0dXJuICgxKTsKLQlpZiAobGVuICUgUklKTkRBRUxfQkxPQ0tTSVpFKQotCQlmYXRhbCgic3NoX3Jpam5kYWVsX2NiYzogYmFkIGxlbiAlZCIsIGxlbik7Ci0JaWYgKChjID0gRVZQX0NJUEhFUl9DVFhfZ2V0X2FwcF9kYXRhKGN0eCkpID09IE5VTEwpIHsKLQkJZXJyb3IoInNzaF9yaWpuZGFlbF9jYmM6IG5vIGNvbnRleHQiKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JaWYgKGN0eC0+ZW5jcnlwdCkgewotCQljbm93ICA9IGRlc3Q7Ci0JCXBsYWluID0gKHVfY2hhciAqKXNyYzsKLQkJY3ByZXYgPSBjLT5yX2l2OwotCQlmb3IgKGkgPSAwOyBpIDwgYmxvY2tzOyBpKyssIHBsYWluKz1SSUpOREFFTF9CTE9DS1NJWkUsCi0JCSAgICBjbm93Kz1SSUpOREFFTF9CTE9DS1NJWkUpIHsKLQkJCWZvciAoaiA9IDA7IGogPCBSSUpOREFFTF9CTE9DS1NJWkU7IGorKykKLQkJCQlidWZbal0gPSBwbGFpbltqXSBeIGNwcmV2W2pdOwotCQkJcmlqbmRhZWxfZW5jcnlwdCgmYy0+cl9jdHgsIGJ1ZiwgY25vdyk7Ci0JCQljcHJldiA9IGNub3c7Ci0JCX0KLQkJbWVtY3B5KGMtPnJfaXYsIGNwcmV2LCBSSUpOREFFTF9CTE9DS1NJWkUpOwotCX0gZWxzZSB7Ci0JCWNub3cgID0gKHVfY2hhciAqKSAoc3JjK2xlbi1SSUpOREFFTF9CTE9DS1NJWkUpOwotCQlwbGFpbiA9IGRlc3QrbGVuLVJJSk5EQUVMX0JMT0NLU0laRTsKLQotCQltZW1jcHkoYnVmLCBjbm93LCBSSUpOREFFTF9CTE9DS1NJWkUpOwotCQlmb3IgKGkgPSBibG9ja3M7IGkgPiAwOyBpLS0sIGNub3ctPVJJSk5EQUVMX0JMT0NLU0laRSwKLQkJICAgIHBsYWluLT1SSUpOREFFTF9CTE9DS1NJWkUpIHsKLQkJCXJpam5kYWVsX2RlY3J5cHQoJmMtPnJfY3R4LCBjbm93LCBwbGFpbik7Ci0JCQlpdnAgPSAoaSA9PSAxKSA/IGMtPnJfaXYgOiBjbm93LVJJSk5EQUVMX0JMT0NLU0laRTsKLQkJCWZvciAoaiA9IDA7IGogPCBSSUpOREFFTF9CTE9DS1NJWkU7IGorKykKLQkJCQlwbGFpbltqXSBePSBpdnBbal07Ci0JCX0KLQkJbWVtY3B5KGMtPnJfaXYsIGJ1ZiwgUklKTkRBRUxfQkxPQ0tTSVpFKTsKLQl9Ci0JcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIGludAotc3NoX3Jpam5kYWVsX2NsZWFudXAoRVZQX0NJUEhFUl9DVFggKmN0eCkKLXsKLQlzdHJ1Y3Qgc3NoX3Jpam5kYWVsX2N0eCAqYzsKLQotCWlmICgoYyA9IEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShjdHgpKSAhPSBOVUxMKSB7Ci0JCW1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKLQkJeGZyZWUoYyk7Ci0JCUVWUF9DSVBIRVJfQ1RYX3NldF9hcHBfZGF0YShjdHgsIE5VTEwpOwotCX0KLQlyZXR1cm4gKDEpOwotfQotCi12b2lkCi1zc2hfcmlqbmRhZWxfaXYoRVZQX0NJUEhFUl9DVFggKmV2cCwgaW50IGRvc2V0LCB1X2NoYXIgKiBpdiwgdV9pbnQgbGVuKQotewotCXN0cnVjdCBzc2hfcmlqbmRhZWxfY3R4ICpjOwotCi0JaWYgKChjID0gRVZQX0NJUEhFUl9DVFhfZ2V0X2FwcF9kYXRhKGV2cCkpID09IE5VTEwpCi0JCWZhdGFsKCJzc2hfcmlqbmRhZWxfaXY6IG5vIGNvbnRleHQiKTsKLQlpZiAoZG9zZXQpCi0JCW1lbWNweShjLT5yX2l2LCBpdiwgbGVuKTsKLQllbHNlCi0JCW1lbWNweShpdiwgYy0+cl9pdiwgbGVuKTsKLX0KLQotY29uc3QgRVZQX0NJUEhFUiAqCi1ldnBfcmlqbmRhZWwodm9pZCkKLXsKLQlzdGF0aWMgRVZQX0NJUEhFUiByaWpuZGFsX2NiYzsKLQotCW1lbXNldCgmcmlqbmRhbF9jYmMsIDAsIHNpemVvZihFVlBfQ0lQSEVSKSk7Ci0JcmlqbmRhbF9jYmMubmlkID0gTklEX3VuZGVmOwotCXJpam5kYWxfY2JjLmJsb2NrX3NpemUgPSBSSUpOREFFTF9CTE9DS1NJWkU7Ci0JcmlqbmRhbF9jYmMuaXZfbGVuID0gUklKTkRBRUxfQkxPQ0tTSVpFOwotCXJpam5kYWxfY2JjLmtleV9sZW4gPSAxNjsKLQlyaWpuZGFsX2NiYy5pbml0ID0gc3NoX3Jpam5kYWVsX2luaXQ7Ci0JcmlqbmRhbF9jYmMuY2xlYW51cCA9IHNzaF9yaWpuZGFlbF9jbGVhbnVwOwotCXJpam5kYWxfY2JjLmRvX2NpcGhlciA9IHNzaF9yaWpuZGFlbF9jYmM7Ci0jaWZuZGVmIFNTSF9PTERfRVZQCi0JcmlqbmRhbF9jYmMuZmxhZ3MgPSBFVlBfQ0lQSF9DQkNfTU9ERSB8IEVWUF9DSVBIX1ZBUklBQkxFX0xFTkdUSCB8Ci0JICAgIEVWUF9DSVBIX0FMV0FZU19DQUxMX0lOSVQgfCBFVlBfQ0lQSF9DVVNUT01fSVY7Ci0jZW5kaWYKLQlyZXR1cm4gKCZyaWpuZGFsX2NiYyk7Ci19Ci0jZW5kaWYgLyogVVNFX0JVSUxUSU5fUklKTkRBRUwgKi8KZGlmZiAtLWdpdCBhL2NpcGhlci1iZjEuYyBiL2NpcGhlci1iZjEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5NTA5ZC4uMDAwMDAwMAotLS0gYS9jaXBoZXItYmYxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyogJE9wZW5CU0Q6IGNpcGhlci1iZjEuYyx2IDEuNiAyMDEwLzEwLzAxIDIzOjA1OjMyIGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJsb2cuaCIKLQotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmgiCi0KLS8qCi0gKiBTU0gxIHVzZXMgYSB2YXJpYXRpb24gb24gQmxvd2Zpc2gsIGFsbCBieXRlcyBtdXN0IGJlIHN3YXBwZWQgYmVmb3JlCi0gKiBhbmQgYWZ0ZXIgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLiBUaHVzIHRoZSBzd2FwX2J5dGVzIHN0dWZmICh5dWspLgotICovCi0KLWNvbnN0IEVWUF9DSVBIRVIgKiBldnBfc3NoMV9iZih2b2lkKTsKLQotc3RhdGljIHZvaWQKLXN3YXBfYnl0ZXMoY29uc3QgdV9jaGFyICpzcmMsIHVfY2hhciAqZHN0LCBpbnQgbikKLXsKLQl1X2NoYXIgY1s0XTsKLQotCS8qIFByb2Nlc3MgNCBieXRlcyBldmVyeSBsYXAuICovCi0JZm9yIChuID0gbiAvIDQ7IG4gPiAwOyBuLS0pIHsKLQkJY1szXSA9ICpzcmMrKzsKLQkJY1syXSA9ICpzcmMrKzsKLQkJY1sxXSA9ICpzcmMrKzsKLQkJY1swXSA9ICpzcmMrKzsKLQotCQkqZHN0KysgPSBjWzBdOwotCQkqZHN0KysgPSBjWzFdOwotCQkqZHN0KysgPSBjWzJdOwotCQkqZHN0KysgPSBjWzNdOwotCX0KLX0KLQotI2lmZGVmIFNTSF9PTERfRVZQCi1zdGF0aWMgdm9pZCBiZl9zc2gxX2luaXQgKEVWUF9DSVBIRVJfQ1RYICogY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCi0JCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LCBpbnQgZW5jKQotewotCWlmIChpdiAhPSBOVUxMKQotCQltZW1jcHkgKCYoY3R4LT5vaXZbMF0pLCBpdiwgOCk7Ci0JbWVtY3B5ICgmKGN0eC0+aXZbMF0pLCAmKGN0eC0+b2l2WzBdKSwgOCk7Ci0JaWYgKGtleSAhPSBOVUxMKQotCQlCRl9zZXRfa2V5ICgmKGN0eC0+Yy5iZl9rcyksIEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGggKGN0eCksCi0JCQkgICAga2V5KTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50ICgqb3JpZ19iZikoRVZQX0NJUEhFUl9DVFggKiwgdV9jaGFyICosCi0gICAgY29uc3QgdV9jaGFyICosIExJQkNSWVBUT19FVlBfSU5MX1RZUEUpID0gTlVMTDsKLQotc3RhdGljIGludAotYmZfc3NoMV9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdV9jaGFyICpvdXQsIGNvbnN0IHVfY2hhciAqaW4sCi0gICAgTElCQ1JZUFRPX0VWUF9JTkxfVFlQRSBsZW4pCi17Ci0JaW50IHJldDsKLQotCXN3YXBfYnl0ZXMoaW4sIG91dCwgbGVuKTsKLQlyZXQgPSAoKm9yaWdfYmYpKGN0eCwgb3V0LCBvdXQsIGxlbik7Ci0Jc3dhcF9ieXRlcyhvdXQsIG91dCwgbGVuKTsKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLWNvbnN0IEVWUF9DSVBIRVIgKgotZXZwX3NzaDFfYmYodm9pZCkKLXsKLQlzdGF0aWMgRVZQX0NJUEhFUiBzc2gxX2JmOwotCi0JbWVtY3B5KCZzc2gxX2JmLCBFVlBfYmZfY2JjKCksIHNpemVvZihFVlBfQ0lQSEVSKSk7Ci0Jb3JpZ19iZiA9IHNzaDFfYmYuZG9fY2lwaGVyOwotCXNzaDFfYmYubmlkID0gTklEX3VuZGVmOwotI2lmZGVmIFNTSF9PTERfRVZQCi0Jc3NoMV9iZi5pbml0ID0gYmZfc3NoMV9pbml0OwotI2VuZGlmCi0Jc3NoMV9iZi5kb19jaXBoZXIgPSBiZl9zc2gxX2NpcGhlcjsKLQlzc2gxX2JmLmtleV9sZW4gPSAzMjsKLQlyZXR1cm4gKCZzc2gxX2JmKTsKLX0KZGlmZiAtLWdpdCBhL2NpcGhlci1jdHIuYyBiL2NpcGhlci1jdHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5NzViNC4uMDAwMDAwMAotLS0gYS9jaXBoZXItY3RyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGNpcGhlci1jdHIuYyx2IDEuMTEgMjAxMC8xMC8wMSAyMzowNTozMiBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWFya3VzIEZyaWVkbCA8bWFya3VzQG9wZW5ic2Qub3JnPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImxvZy5oIgotCi0vKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIG9yIGJyb2tlbiBPcGVuU1NMIHZlcnNpb25zICovCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKLQotI2lmbmRlZiBVU0VfQlVJTFRJTl9SSUpOREFFTAotI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+Ci0jZW5kaWYKLQotY29uc3QgRVZQX0NJUEhFUiAqZXZwX2Flc18xMjhfY3RyKHZvaWQpOwotdm9pZCBzc2hfYWVzX2N0cl9pdihFVlBfQ0lQSEVSX0NUWCAqLCBpbnQsIHVfY2hhciAqLCBzaXplX3QpOwotCi1zdHJ1Y3Qgc3NoX2Flc19jdHJfY3R4Ci17Ci0JQUVTX0tFWQkJYWVzX2N0eDsKLQl1X2NoYXIJCWFlc19jb3VudGVyW0FFU19CTE9DS19TSVpFXTsKLX07Ci0KLS8qCi0gKiBpbmNyZW1lbnQgY291bnRlciAnY3RyJywKLSAqIHRoZSBjb3VudGVyIGlzIG9mIHNpemUgJ2xlbicgYnl0ZXMgYW5kIHN0b3JlZCBpbiBuZXR3b3JrLWJ5dGUtb3JkZXIuCi0gKiAoTFNCIGF0IGN0cltsZW4tMV0sIE1TQiBhdCBjdHJbMF0pCi0gKi8KLXN0YXRpYyB2b2lkCi1zc2hfY3RyX2luYyh1X2NoYXIgKmN0ciwgc2l6ZV90IGxlbikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKQotCQlpZiAoKytjdHJbaV0pCS8qIGNvbnRpbnVlIG9uIG92ZXJmbG93ICovCi0JCQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQKLXNzaF9hZXNfY3RyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVfY2hhciAqZGVzdCwgY29uc3QgdV9jaGFyICpzcmMsCi0gICAgTElCQ1JZUFRPX0VWUF9JTkxfVFlQRSBsZW4pCi17Ci0Jc3RydWN0IHNzaF9hZXNfY3RyX2N0eCAqYzsKLQlzaXplX3QgbiA9IDA7Ci0JdV9jaGFyIGJ1ZltBRVNfQkxPQ0tfU0laRV07Ci0KLQlpZiAobGVuID09IDApCi0JCXJldHVybiAoMSk7Ci0JaWYgKChjID0gRVZQX0NJUEhFUl9DVFhfZ2V0X2FwcF9kYXRhKGN0eCkpID09IE5VTEwpCi0JCXJldHVybiAoMCk7Ci0KLQl3aGlsZSAoKGxlbi0tKSA+IDApIHsKLQkJaWYgKG4gPT0gMCkgewotCQkJQUVTX2VuY3J5cHQoYy0+YWVzX2NvdW50ZXIsIGJ1ZiwgJmMtPmFlc19jdHgpOwotCQkJc3NoX2N0cl9pbmMoYy0+YWVzX2NvdW50ZXIsIEFFU19CTE9DS19TSVpFKTsKLQkJfQotCQkqKGRlc3QrKykgPSAqKHNyYysrKSBeIGJ1ZltuXTsKLQkJbiA9IChuICsgMSkgJSBBRVNfQkxPQ0tfU0laRTsKLQl9Ci0JcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIGludAotc3NoX2Flc19jdHJfaW5pdChFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1X2NoYXIgKmtleSwgY29uc3QgdV9jaGFyICppdiwKLSAgICBpbnQgZW5jKQotewotCXN0cnVjdCBzc2hfYWVzX2N0cl9jdHggKmM7Ci0KLQlpZiAoKGMgPSBFVlBfQ0lQSEVSX0NUWF9nZXRfYXBwX2RhdGEoY3R4KSkgPT0gTlVMTCkgewotCQljID0geG1hbGxvYyhzaXplb2YoKmMpKTsKLQkJRVZQX0NJUEhFUl9DVFhfc2V0X2FwcF9kYXRhKGN0eCwgYyk7Ci0JfQotCWlmIChrZXkgIT0gTlVMTCkKLQkJQUVTX3NldF9lbmNyeXB0X2tleShrZXksIEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoY3R4KSAqIDgsCi0JCSAgICAmYy0+YWVzX2N0eCk7Ci0JaWYgKGl2ICE9IE5VTEwpCi0JCW1lbWNweShjLT5hZXNfY291bnRlciwgaXYsIEFFU19CTE9DS19TSVpFKTsKLQlyZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgaW50Ci1zc2hfYWVzX2N0cl9jbGVhbnVwKEVWUF9DSVBIRVJfQ1RYICpjdHgpCi17Ci0Jc3RydWN0IHNzaF9hZXNfY3RyX2N0eCAqYzsKLQotCWlmICgoYyA9IEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShjdHgpKSAhPSBOVUxMKSB7Ci0JCW1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKLQkJeGZyZWUoYyk7Ci0JCUVWUF9DSVBIRVJfQ1RYX3NldF9hcHBfZGF0YShjdHgsIE5VTEwpOwotCX0KLQlyZXR1cm4gKDEpOwotfQotCi12b2lkCi1zc2hfYWVzX2N0cl9pdihFVlBfQ0lQSEVSX0NUWCAqZXZwLCBpbnQgZG9zZXQsIHVfY2hhciAqIGl2LCBzaXplX3QgbGVuKQotewotCXN0cnVjdCBzc2hfYWVzX2N0cl9jdHggKmM7Ci0KLQlpZiAoKGMgPSBFVlBfQ0lQSEVSX0NUWF9nZXRfYXBwX2RhdGEoZXZwKSkgPT0gTlVMTCkKLQkJZmF0YWwoInNzaF9hZXNfY3RyX2l2OiBubyBjb250ZXh0Iik7Ci0JaWYgKGRvc2V0KQotCQltZW1jcHkoYy0+YWVzX2NvdW50ZXIsIGl2LCBsZW4pOwotCWVsc2UKLQkJbWVtY3B5KGl2LCBjLT5hZXNfY291bnRlciwgbGVuKTsKLX0KLQotY29uc3QgRVZQX0NJUEhFUiAqCi1ldnBfYWVzXzEyOF9jdHIodm9pZCkKLXsKLQlzdGF0aWMgRVZQX0NJUEhFUiBhZXNfY3RyOwotCi0JbWVtc2V0KCZhZXNfY3RyLCAwLCBzaXplb2YoRVZQX0NJUEhFUikpOwotCWFlc19jdHIubmlkID0gTklEX3VuZGVmOwotCWFlc19jdHIuYmxvY2tfc2l6ZSA9IEFFU19CTE9DS19TSVpFOwotCWFlc19jdHIuaXZfbGVuID0gQUVTX0JMT0NLX1NJWkU7Ci0JYWVzX2N0ci5rZXlfbGVuID0gMTY7Ci0JYWVzX2N0ci5pbml0ID0gc3NoX2Flc19jdHJfaW5pdDsKLQlhZXNfY3RyLmNsZWFudXAgPSBzc2hfYWVzX2N0cl9jbGVhbnVwOwotCWFlc19jdHIuZG9fY2lwaGVyID0gc3NoX2Flc19jdHI7Ci0jaWZuZGVmIFNTSF9PTERfRVZQCi0JYWVzX2N0ci5mbGFncyA9IEVWUF9DSVBIX0NCQ19NT0RFIHwgRVZQX0NJUEhfVkFSSUFCTEVfTEVOR1RIIHwKLQkgICAgRVZQX0NJUEhfQUxXQVlTX0NBTExfSU5JVCB8IEVWUF9DSVBIX0NVU1RPTV9JVjsKLSNlbmRpZgotCXJldHVybiAoJmFlc19jdHIpOwotfQpkaWZmIC0tZ2l0IGEvY2lwaGVyLmMgYi9jaXBoZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiODY2Zi4uMDAwMDAwMAotLS0gYS9jaXBoZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vKiAkT3BlbkJTRDogY2lwaGVyLmMsdiAxLjgyIDIwMDkvMDEvMjYgMDk6NTg6MTUgbWFya3VzIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBOaWVscyBQcm92b3MuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImNpcGhlci5oIgotCi0vKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIG9yIGJyb2tlbiBPcGVuU1NMIHZlcnNpb25zICovCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKLQotZXh0ZXJuIGNvbnN0IEVWUF9DSVBIRVIgKmV2cF9zc2gxX2JmKHZvaWQpOwotZXh0ZXJuIGNvbnN0IEVWUF9DSVBIRVIgKmV2cF9zc2gxXzNkZXModm9pZCk7Ci1leHRlcm4gdm9pZCBzc2gxXzNkZXNfaXYoRVZQX0NJUEhFUl9DVFggKiwgaW50LCB1X2NoYXIgKiwgaW50KTsKLWV4dGVybiBjb25zdCBFVlBfQ0lQSEVSICpldnBfYWVzXzEyOF9jdHIodm9pZCk7Ci1leHRlcm4gdm9pZCBzc2hfYWVzX2N0cl9pdihFVlBfQ0lQSEVSX0NUWCAqLCBpbnQsIHVfY2hhciAqLCB1X2ludCk7Ci0KLXN0cnVjdCBDaXBoZXIgewotCWNoYXIJKm5hbWU7Ci0JaW50CW51bWJlcjsJCS8qIGZvciBzc2gxIG9ubHkgKi8KLQl1X2ludAlibG9ja19zaXplOwotCXVfaW50CWtleV9sZW47Ci0JdV9pbnQJZGlzY2FyZF9sZW47Ci0JdV9pbnQJY2JjX21vZGU7Ci0JY29uc3QgRVZQX0NJUEhFUgkqKCpldnB0eXBlKSh2b2lkKTsKLX0gY2lwaGVyc1tdID0gewotCXsgIm5vbmUiLAkJU1NIX0NJUEhFUl9OT05FLCA4LCAwLCAwLCAwLCBFVlBfZW5jX251bGwgfSwKLQl7ICJkZXMiLAkJU1NIX0NJUEhFUl9ERVMsIDgsIDgsIDAsIDEsIEVWUF9kZXNfY2JjIH0sCi0JeyAiM2RlcyIsCQlTU0hfQ0lQSEVSXzNERVMsIDgsIDE2LCAwLCAxLCBldnBfc3NoMV8zZGVzIH0sCi0JeyAiYmxvd2Zpc2giLAkJU1NIX0NJUEhFUl9CTE9XRklTSCwgOCwgMzIsIDAsIDEsIGV2cF9zc2gxX2JmIH0sCi0KLQl7ICIzZGVzLWNiYyIsCQlTU0hfQ0lQSEVSX1NTSDIsIDgsIDI0LCAwLCAxLCBFVlBfZGVzX2VkZTNfY2JjIH0sCi0JeyAiYmxvd2Zpc2gtY2JjIiwJU1NIX0NJUEhFUl9TU0gyLCA4LCAxNiwgMCwgMSwgRVZQX2JmX2NiYyB9LAotI2lmbmRlZiBBTkRST0lECi0JeyAiY2FzdDEyOC1jYmMiLAlTU0hfQ0lQSEVSX1NTSDIsIDgsIDE2LCAwLCAxLCBFVlBfY2FzdDVfY2JjIH0sCi0jZW5kaWYKLQl7ICJhcmNmb3VyIiwJCVNTSF9DSVBIRVJfU1NIMiwgOCwgMTYsIDAsIDAsIEVWUF9yYzQgfSwKLQl7ICJhcmNmb3VyMTI4IiwJCVNTSF9DSVBIRVJfU1NIMiwgOCwgMTYsIDE1MzYsIDAsIEVWUF9yYzQgfSwKLQl7ICJhcmNmb3VyMjU2IiwJCVNTSF9DSVBIRVJfU1NIMiwgOCwgMzIsIDE1MzYsIDAsIEVWUF9yYzQgfSwKLQl7ICJhZXMxMjgtY2JjIiwJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDE2LCAwLCAxLCBFVlBfYWVzXzEyOF9jYmMgfSwKLQl7ICJhZXMxOTItY2JjIiwJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDI0LCAwLCAxLCBFVlBfYWVzXzE5Ml9jYmMgfSwKLQl7ICJhZXMyNTYtY2JjIiwJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDMyLCAwLCAxLCBFVlBfYWVzXzI1Nl9jYmMgfSwKLQl7ICJyaWpuZGFlbC1jYmNAbHlzYXRvci5saXUuc2UiLAotCQkJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDMyLCAwLCAxLCBFVlBfYWVzXzI1Nl9jYmMgfSwKLQl7ICJhZXMxMjgtY3RyIiwJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDE2LCAwLCAwLCBldnBfYWVzXzEyOF9jdHIgfSwKLQl7ICJhZXMxOTItY3RyIiwJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDI0LCAwLCAwLCBldnBfYWVzXzEyOF9jdHIgfSwKLQl7ICJhZXMyNTYtY3RyIiwJCVNTSF9DSVBIRVJfU1NIMiwgMTYsIDMyLCAwLCAwLCBldnBfYWVzXzEyOF9jdHIgfSwKLSNpZmRlZiBVU0VfQ0lQSEVSX0FDU1MKLQl7ICJhY3NzQG9wZW5zc2gub3JnIiwJU1NIX0NJUEhFUl9TU0gyLCAxNiwgNSwgMCwgMCwgRVZQX2Fjc3MgfSwKLSNlbmRpZgotCXsgTlVMTCwJCQlTU0hfQ0lQSEVSX0lOVkFMSUQsIDAsIDAsIDAsIDAsIE5VTEwgfQotfTsKLQotLyotLSovCi0KLXVfaW50Ci1jaXBoZXJfYmxvY2tzaXplKGNvbnN0IENpcGhlciAqYykKLXsKLQlyZXR1cm4gKGMtPmJsb2NrX3NpemUpOwotfQotCi11X2ludAotY2lwaGVyX2tleWxlbihjb25zdCBDaXBoZXIgKmMpCi17Ci0JcmV0dXJuIChjLT5rZXlfbGVuKTsKLX0KLQotdV9pbnQKLWNpcGhlcl9nZXRfbnVtYmVyKGNvbnN0IENpcGhlciAqYykKLXsKLQlyZXR1cm4gKGMtPm51bWJlcik7Ci19Ci0KLXVfaW50Ci1jaXBoZXJfaXNfY2JjKGNvbnN0IENpcGhlciAqYykKLXsKLQlyZXR1cm4gKGMtPmNiY19tb2RlKTsKLX0KLQotdV9pbnQKLWNpcGhlcl9tYXNrX3NzaDEoaW50IGNsaWVudCkKLXsKLQl1X2ludCBtYXNrID0gMDsKLQltYXNrIHw9IDEgPDwgU1NIX0NJUEhFUl8zREVTOwkJLyogTWFuZGF0b3J5ICovCi0JbWFzayB8PSAxIDw8IFNTSF9DSVBIRVJfQkxPV0ZJU0g7Ci0JaWYgKGNsaWVudCkgewotCQltYXNrIHw9IDEgPDwgU1NIX0NJUEhFUl9ERVM7Ci0JfQotCXJldHVybiBtYXNrOwotfQotCi1DaXBoZXIgKgotY2lwaGVyX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlDaXBoZXIgKmM7Ci0JZm9yIChjID0gY2lwaGVyczsgYy0+bmFtZSAhPSBOVUxMOyBjKyspCi0JCWlmIChzdHJjbXAoYy0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJCXJldHVybiBjOwotCXJldHVybiBOVUxMOwotfQotCi1DaXBoZXIgKgotY2lwaGVyX2J5X251bWJlcihpbnQgaWQpCi17Ci0JQ2lwaGVyICpjOwotCWZvciAoYyA9IGNpcGhlcnM7IGMtPm5hbWUgIT0gTlVMTDsgYysrKQotCQlpZiAoYy0+bnVtYmVyID09IGlkKQotCQkJcmV0dXJuIGM7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUJQ0lQSEVSX1NFUAkiLCIKLWludAotY2lwaGVyc192YWxpZChjb25zdCBjaGFyICpuYW1lcykKLXsKLQlDaXBoZXIgKmM7Ci0JY2hhciAqY2lwaGVyX2xpc3QsICpjcDsKLQljaGFyICpwOwotCi0JaWYgKG5hbWVzID09IE5VTEwgfHwgc3RyY21wKG5hbWVzLCAiIikgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JY2lwaGVyX2xpc3QgPSBjcCA9IHhzdHJkdXAobmFtZXMpOwotCWZvciAoKHAgPSBzdHJzZXAoJmNwLCBDSVBIRVJfU0VQKSk7IHAgJiYgKnAgIT0gJ1wwJzsKLQkgICAgKHAgPSBzdHJzZXAoJmNwLCBDSVBIRVJfU0VQKSkpIHsKLQkJYyA9IGNpcGhlcl9ieV9uYW1lKHApOwotCQlpZiAoYyA9PSBOVUxMIHx8IGMtPm51bWJlciAhPSBTU0hfQ0lQSEVSX1NTSDIpIHsKLQkJCWRlYnVnKCJiYWQgY2lwaGVyICVzIFslc10iLCBwLCBuYW1lcyk7Ci0JCQl4ZnJlZShjaXBoZXJfbGlzdCk7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIHsKLQkJCWRlYnVnMygiY2lwaGVyIG9rOiAlcyBbJXNdIiwgcCwgbmFtZXMpOwotCQl9Ci0JfQotCWRlYnVnMygiY2lwaGVycyBvazogWyVzXSIsIG5hbWVzKTsKLQl4ZnJlZShjaXBoZXJfbGlzdCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBQYXJzZXMgdGhlIG5hbWUgb2YgdGhlIGNpcGhlci4gIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgY29ycmVzcG9uZGluZwotICogY2lwaGVyLCBvciAtMSBvbiBlcnJvci4KLSAqLwotCi1pbnQKLWNpcGhlcl9udW1iZXIoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlDaXBoZXIgKmM7Ci0JaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWZvciAoYyA9IGNpcGhlcnM7IGMtPm5hbWUgIT0gTlVMTDsgYysrKQotCQlpZiAoc3RyY2FzZWNtcChjLT5uYW1lLCBuYW1lKSA9PSAwKQotCQkJcmV0dXJuIGMtPm51bWJlcjsKLQlyZXR1cm4gLTE7Ci19Ci0KLWNoYXIgKgotY2lwaGVyX25hbWUoaW50IGlkKQotewotCUNpcGhlciAqYyA9IGNpcGhlcl9ieV9udW1iZXIoaWQpOwotCXJldHVybiAoYz09TlVMTCkgPyAiPHVua25vd24+IiA6IGMtPm5hbWU7Ci19Ci0KLXZvaWQKLWNpcGhlcl9pbml0KENpcGhlckNvbnRleHQgKmNjLCBDaXBoZXIgKmNpcGhlciwKLSAgICBjb25zdCB1X2NoYXIgKmtleSwgdV9pbnQga2V5bGVuLCBjb25zdCB1X2NoYXIgKml2LCB1X2ludCBpdmxlbiwKLSAgICBpbnQgZG9fZW5jcnlwdCkKLXsKLQlzdGF0aWMgaW50IGRvd2FybiA9IDE7Ci0jaWZkZWYgU1NIX09MRF9FVlAKLQlFVlBfQ0lQSEVSICp0eXBlOwotI2Vsc2UKLQljb25zdCBFVlBfQ0lQSEVSICp0eXBlOwotCWludCBrbGVuOwotI2VuZGlmCi0JdV9jaGFyICpqdW5rLCAqZGlzY2FyZDsKLQotCWlmIChjaXBoZXItPm51bWJlciA9PSBTU0hfQ0lQSEVSX0RFUykgewotCQlpZiAoZG93YXJuKSB7Ci0JCQllcnJvcigiV2FybmluZzogdXNlIG9mIERFUyBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCAiCi0JCQkgICAgImR1ZSB0byBjcnlwdG9ncmFwaGljIHdlYWtuZXNzZXMiKTsKLQkJCWRvd2FybiA9IDA7Ci0JCX0KLQkJaWYgKGtleWxlbiA+IDgpCi0JCQlrZXlsZW4gPSA4OwotCX0KLQljYy0+cGxhaW50ZXh0ID0gKGNpcGhlci0+bnVtYmVyID09IFNTSF9DSVBIRVJfTk9ORSk7Ci0KLQlpZiAoa2V5bGVuIDwgY2lwaGVyLT5rZXlfbGVuKQotCQlmYXRhbCgiY2lwaGVyX2luaXQ6IGtleSBsZW5ndGggJWQgaXMgaW5zdWZmaWNpZW50IGZvciAlcy4iLAotCQkgICAga2V5bGVuLCBjaXBoZXItPm5hbWUpOwotCWlmIChpdiAhPSBOVUxMICYmIGl2bGVuIDwgY2lwaGVyLT5ibG9ja19zaXplKQotCQlmYXRhbCgiY2lwaGVyX2luaXQ6IGl2IGxlbmd0aCAlZCBpcyBpbnN1ZmZpY2llbnQgZm9yICVzLiIsCi0JCSAgICBpdmxlbiwgY2lwaGVyLT5uYW1lKTsKLQljYy0+Y2lwaGVyID0gY2lwaGVyOwotCi0JdHlwZSA9ICgqY2lwaGVyLT5ldnB0eXBlKSgpOwotCi0JRVZQX0NJUEhFUl9DVFhfaW5pdCgmY2MtPmV2cCk7Ci0jaWZkZWYgU1NIX09MRF9FVlAKLQlpZiAodHlwZS0+a2V5X2xlbiA+IDAgJiYgdHlwZS0+a2V5X2xlbiAhPSBrZXlsZW4pIHsKLQkJZGVidWcoImNpcGhlcl9pbml0OiBzZXQga2V5bGVuICglZCAtPiAlZCkiLAotCQkgICAgdHlwZS0+a2V5X2xlbiwga2V5bGVuKTsKLQkJdHlwZS0+a2V5X2xlbiA9IGtleWxlbjsKLQl9Ci0JRVZQX0NpcGhlckluaXQoJmNjLT5ldnAsIHR5cGUsICh1X2NoYXIgKilrZXksICh1X2NoYXIgKilpdiwKLQkgICAgKGRvX2VuY3J5cHQgPT0gQ0lQSEVSX0VOQ1JZUFQpKTsKLSNlbHNlCi0JaWYgKEVWUF9DaXBoZXJJbml0KCZjYy0+ZXZwLCB0eXBlLCBOVUxMLCAodV9jaGFyICopaXYsCi0JICAgIChkb19lbmNyeXB0ID09IENJUEhFUl9FTkNSWVBUKSkgPT0gMCkKLQkJZmF0YWwoImNpcGhlcl9pbml0OiBFVlBfQ2lwaGVySW5pdCBmYWlsZWQgZm9yICVzIiwKLQkJICAgIGNpcGhlci0+bmFtZSk7Ci0Ja2xlbiA9IEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoJmNjLT5ldnApOwotCWlmIChrbGVuID4gMCAmJiBrZXlsZW4gIT0gKHVfaW50KWtsZW4pIHsKLQkJZGVidWcyKCJjaXBoZXJfaW5pdDogc2V0IGtleWxlbiAoJWQgLT4gJWQpIiwga2xlbiwga2V5bGVuKTsKLQkJaWYgKEVWUF9DSVBIRVJfQ1RYX3NldF9rZXlfbGVuZ3RoKCZjYy0+ZXZwLCBrZXlsZW4pID09IDApCi0JCQlmYXRhbCgiY2lwaGVyX2luaXQ6IHNldCBrZXlsZW4gZmFpbGVkICglZCAtPiAlZCkiLAotCQkJICAgIGtsZW4sIGtleWxlbik7Ci0JfQotCWlmIChFVlBfQ2lwaGVySW5pdCgmY2MtPmV2cCwgTlVMTCwgKHVfY2hhciAqKWtleSwgTlVMTCwgLTEpID09IDApCi0JCWZhdGFsKCJjaXBoZXJfaW5pdDogRVZQX0NpcGhlckluaXQ6IHNldCBrZXkgZmFpbGVkIGZvciAlcyIsCi0JCSAgICBjaXBoZXItPm5hbWUpOwotI2VuZGlmCi0KLQlpZiAoY2lwaGVyLT5kaXNjYXJkX2xlbiA+IDApIHsKLQkJanVuayA9IHhtYWxsb2MoY2lwaGVyLT5kaXNjYXJkX2xlbik7Ci0JCWRpc2NhcmQgPSB4bWFsbG9jKGNpcGhlci0+ZGlzY2FyZF9sZW4pOwotCQlpZiAoRVZQX0NpcGhlcigmY2MtPmV2cCwgZGlzY2FyZCwganVuaywKLQkJICAgIGNpcGhlci0+ZGlzY2FyZF9sZW4pID09IDApCi0JCQlmYXRhbCgiZXZwX2NyeXB0OiBFVlBfQ2lwaGVyIGZhaWxlZCBkdXJpbmcgZGlzY2FyZCIpOwotCQltZW1zZXQoZGlzY2FyZCwgMCwgY2lwaGVyLT5kaXNjYXJkX2xlbik7Ci0JCXhmcmVlKGp1bmspOwotCQl4ZnJlZShkaXNjYXJkKTsKLQl9Ci19Ci0KLXZvaWQKLWNpcGhlcl9jcnlwdChDaXBoZXJDb250ZXh0ICpjYywgdV9jaGFyICpkZXN0LCBjb25zdCB1X2NoYXIgKnNyYywgdV9pbnQgbGVuKQotewotCWlmIChsZW4gJSBjYy0+Y2lwaGVyLT5ibG9ja19zaXplKQotCQlmYXRhbCgiY2lwaGVyX2VuY3J5cHQ6IGJhZCBwbGFpbnRleHQgbGVuZ3RoICVkIiwgbGVuKTsKLQlpZiAoRVZQX0NpcGhlcigmY2MtPmV2cCwgZGVzdCwgKHVfY2hhciAqKXNyYywgbGVuKSA9PSAwKQotCQlmYXRhbCgiZXZwX2NyeXB0OiBFVlBfQ2lwaGVyIGZhaWxlZCIpOwotfQotCi12b2lkCi1jaXBoZXJfY2xlYW51cChDaXBoZXJDb250ZXh0ICpjYykKLXsKLQlpZiAoRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY2MtPmV2cCkgPT0gMCkKLQkJZXJyb3IoImNpcGhlcl9jbGVhbnVwOiBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwIGZhaWxlZCIpOwotfQotCi0vKgotICogU2VsZWN0cyB0aGUgY2lwaGVyLCBhbmQga2V5cyBpZiBieSBjb21wdXRpbmcgdGhlIE1ENSBjaGVja3N1bSBvZiB0aGUKLSAqIHBhc3NwaHJhc2UgYW5kIHVzaW5nIHRoZSByZXN1bHRpbmcgMTYgYnl0ZXMgYXMgdGhlIGtleS4KLSAqLwotCi12b2lkCi1jaXBoZXJfc2V0X2tleV9zdHJpbmcoQ2lwaGVyQ29udGV4dCAqY2MsIENpcGhlciAqY2lwaGVyLAotICAgIGNvbnN0IGNoYXIgKnBhc3NwaHJhc2UsIGludCBkb19lbmNyeXB0KQotewotCU1ENV9DVFggbWQ7Ci0JdV9jaGFyIGRpZ2VzdFsxNl07Ci0KLQlNRDVfSW5pdCgmbWQpOwotCU1ENV9VcGRhdGUoJm1kLCAoY29uc3QgdV9jaGFyICopcGFzc3BocmFzZSwgc3RybGVuKHBhc3NwaHJhc2UpKTsKLQlNRDVfRmluYWwoZGlnZXN0LCAmbWQpOwotCi0JY2lwaGVyX2luaXQoY2MsIGNpcGhlciwgZGlnZXN0LCAxNiwgTlVMTCwgMCwgZG9fZW5jcnlwdCk7Ci0KLQltZW1zZXQoZGlnZXN0LCAwLCBzaXplb2YoZGlnZXN0KSk7Ci0JbWVtc2V0KCZtZCwgMCwgc2l6ZW9mKG1kKSk7Ci19Ci0KLS8qCi0gKiBFeHBvcnRzIGFuIElWIGZyb20gdGhlIENpcGhlckNvbnRleHQgcmVxdWlyZWQgdG8gZXhwb3J0IHRoZSBrZXkKLSAqIHN0YXRlIGJhY2sgZnJvbSB0aGUgdW5wcml2aWxlZ2VkIGNoaWxkIHRvIHRoZSBwcml2aWxlZ2VkIHBhcmVudAotICogcHJvY2Vzcy4KLSAqLwotCi1pbnQKLWNpcGhlcl9nZXRfa2V5aXZfbGVuKGNvbnN0IENpcGhlckNvbnRleHQgKmNjKQotewotCUNpcGhlciAqYyA9IGNjLT5jaXBoZXI7Ci0JaW50IGl2bGVuOwotCi0JaWYgKGMtPm51bWJlciA9PSBTU0hfQ0lQSEVSXzNERVMpCi0JCWl2bGVuID0gMjQ7Ci0JZWxzZQotCQlpdmxlbiA9IEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aCgmY2MtPmV2cCk7Ci0JcmV0dXJuIChpdmxlbik7Ci19Ci0KLXZvaWQKLWNpcGhlcl9nZXRfa2V5aXYoQ2lwaGVyQ29udGV4dCAqY2MsIHVfY2hhciAqaXYsIHVfaW50IGxlbikKLXsKLQlDaXBoZXIgKmMgPSBjYy0+Y2lwaGVyOwotCWludCBldnBsZW47Ci0KLQlzd2l0Y2ggKGMtPm51bWJlcikgewotCWNhc2UgU1NIX0NJUEhFUl9TU0gyOgotCWNhc2UgU1NIX0NJUEhFUl9ERVM6Ci0JY2FzZSBTU0hfQ0lQSEVSX0JMT1dGSVNIOgotCQlldnBsZW4gPSBFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoJmNjLT5ldnApOwotCQlpZiAoZXZwbGVuIDw9IDApCi0JCQlyZXR1cm47Ci0JCWlmICgodV9pbnQpZXZwbGVuICE9IGxlbikKLQkJCWZhdGFsKCIlczogd3JvbmcgaXYgbGVuZ3RoICVkICE9ICVkIiwgX19mdW5jX18sCi0JCQkgICAgZXZwbGVuLCBsZW4pOwotI2lmZGVmIFVTRV9CVUlMVElOX1JJSk5EQUVMCi0JCWlmIChjLT5ldnB0eXBlID09IGV2cF9yaWpuZGFlbCkKLQkJCXNzaF9yaWpuZGFlbF9pdigmY2MtPmV2cCwgMCwgaXYsIGxlbik7Ci0JCWVsc2UKLSNlbmRpZgotCQlpZiAoYy0+ZXZwdHlwZSA9PSBldnBfYWVzXzEyOF9jdHIpCi0JCQlzc2hfYWVzX2N0cl9pdigmY2MtPmV2cCwgMCwgaXYsIGxlbik7Ci0JCWVsc2UKLQkJCW1lbWNweShpdiwgY2MtPmV2cC5pdiwgbGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBTU0hfQ0lQSEVSXzNERVM6Ci0JCXNzaDFfM2Rlc19pdigmY2MtPmV2cCwgMCwgaXYsIDI0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmF0YWwoIiVzOiBiYWQgY2lwaGVyICVkIiwgX19mdW5jX18sIGMtPm51bWJlcik7Ci0JfQotfQotCi12b2lkCi1jaXBoZXJfc2V0X2tleWl2KENpcGhlckNvbnRleHQgKmNjLCB1X2NoYXIgKml2KQotewotCUNpcGhlciAqYyA9IGNjLT5jaXBoZXI7Ci0JaW50IGV2cGxlbiA9IDA7Ci0KLQlzd2l0Y2ggKGMtPm51bWJlcikgewotCWNhc2UgU1NIX0NJUEhFUl9TU0gyOgotCWNhc2UgU1NIX0NJUEhFUl9ERVM6Ci0JY2FzZSBTU0hfQ0lQSEVSX0JMT1dGSVNIOgotCQlldnBsZW4gPSBFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoJmNjLT5ldnApOwotCQlpZiAoZXZwbGVuID09IDApCi0JCQlyZXR1cm47Ci0jaWZkZWYgVVNFX0JVSUxUSU5fUklKTkRBRUwKLQkJaWYgKGMtPmV2cHR5cGUgPT0gZXZwX3Jpam5kYWVsKQotCQkJc3NoX3Jpam5kYWVsX2l2KCZjYy0+ZXZwLCAxLCBpdiwgZXZwbGVuKTsKLQkJZWxzZQotI2VuZGlmCi0JCWlmIChjLT5ldnB0eXBlID09IGV2cF9hZXNfMTI4X2N0cikKLQkJCXNzaF9hZXNfY3RyX2l2KCZjYy0+ZXZwLCAxLCBpdiwgZXZwbGVuKTsKLQkJZWxzZQotCQkJbWVtY3B5KGNjLT5ldnAuaXYsIGl2LCBldnBsZW4pOwotCQlicmVhazsKLQljYXNlIFNTSF9DSVBIRVJfM0RFUzoKLQkJc3NoMV8zZGVzX2l2KCZjYy0+ZXZwLCAxLCBpdiwgMjQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlmYXRhbCgiJXM6IGJhZCBjaXBoZXIgJWQiLCBfX2Z1bmNfXywgYy0+bnVtYmVyKTsKLQl9Ci19Ci0KLSNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNzAwMEwKLSNkZWZpbmUgRVZQX1hfU1RBVEUoZXZwKQkmKGV2cCkuYwotI2RlZmluZSBFVlBfWF9TVEFURV9MRU4oZXZwKQlzaXplb2YoKGV2cCkuYykKLSNlbHNlCi0jZGVmaW5lIEVWUF9YX1NUQVRFKGV2cCkJKGV2cCkuY2lwaGVyX2RhdGEKLSNkZWZpbmUgRVZQX1hfU1RBVEVfTEVOKGV2cCkJKGV2cCkuY2lwaGVyLT5jdHhfc2l6ZQotI2VuZGlmCi0KLWludAotY2lwaGVyX2dldF9rZXljb250ZXh0KGNvbnN0IENpcGhlckNvbnRleHQgKmNjLCB1X2NoYXIgKmRhdCkKLXsKLQlDaXBoZXIgKmMgPSBjYy0+Y2lwaGVyOwotCWludCBwbGVuID0gMDsKLQotCWlmIChjLT5ldnB0eXBlID09IEVWUF9yYzQgfHwgYy0+ZXZwdHlwZSA9PSBFVlBfYWNzcykgewotCQlwbGVuID0gRVZQX1hfU1RBVEVfTEVOKGNjLT5ldnApOwotCQlpZiAoZGF0ID09IE5VTEwpCi0JCQlyZXR1cm4gKHBsZW4pOwotCQltZW1jcHkoZGF0LCBFVlBfWF9TVEFURShjYy0+ZXZwKSwgcGxlbik7Ci0JfQotCXJldHVybiAocGxlbik7Ci19Ci0KLXZvaWQKLWNpcGhlcl9zZXRfa2V5Y29udGV4dChDaXBoZXJDb250ZXh0ICpjYywgdV9jaGFyICpkYXQpCi17Ci0JQ2lwaGVyICpjID0gY2MtPmNpcGhlcjsKLQlpbnQgcGxlbjsKLQotCWlmIChjLT5ldnB0eXBlID09IEVWUF9yYzQgfHwgYy0+ZXZwdHlwZSA9PSBFVlBfYWNzcykgewotCQlwbGVuID0gRVZQX1hfU1RBVEVfTEVOKGNjLT5ldnApOwotCQltZW1jcHkoRVZQX1hfU1RBVEUoY2MtPmV2cCksIGRhdCwgcGxlbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY2lwaGVyLmggYi9jaXBoZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkMjI3MC4uMDAwMDAwMAotLS0gYS9jaXBoZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qICRPcGVuQlNEOiBjaXBoZXIuaCx2IDEuMzcgMjAwOS8wMS8yNiAwOTo1ODoxNSBtYXJrdXMgRXhwICQgKi8KLQotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBDSVBIRVJfSAotI2RlZmluZSBDSVBIRVJfSAotCi0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLS8qCi0gKiBDaXBoZXIgdHlwZXMgZm9yIFNTSC0xLiAgTmV3IHR5cGVzIGNhbiBiZSBhZGRlZCwgYnV0IG9sZCB0eXBlcyBzaG91bGQgbm90Ci0gKiBiZSByZW1vdmVkIGZvciBjb21wYXRpYmlsaXR5LiAgVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSBpcyAzMS4KLSAqLwotI2RlZmluZSBTU0hfQ0lQSEVSX1NTSDIJCS0zCi0jZGVmaW5lIFNTSF9DSVBIRVJfSU5WQUxJRAktMgkvKiBObyB2YWxpZCBjaXBoZXIgc2VsZWN0ZWQuICovCi0jZGVmaW5lIFNTSF9DSVBIRVJfTk9UX1NFVAktMQkvKiBOb25lIHNlbGVjdGVkIChpbnZhbGlkIG51bWJlcikuICovCi0jZGVmaW5lIFNTSF9DSVBIRVJfTk9ORQkJMAkvKiBubyBlbmNyeXB0aW9uICovCi0jZGVmaW5lIFNTSF9DSVBIRVJfSURFQQkJMQkvKiBJREVBIENGQiAqLwotI2RlZmluZSBTU0hfQ0lQSEVSX0RFUwkJMgkvKiBERVMgQ0JDICovCi0jZGVmaW5lIFNTSF9DSVBIRVJfM0RFUwkJMwkvKiAzREVTIENCQyAqLwotI2RlZmluZSBTU0hfQ0lQSEVSX0JST0tFTl9UU1MJNAkvKiBUUkkncyBTaW1wbGUgU3RyZWFtIGVuY3J5cHRpb24gQ0JDICovCi0jZGVmaW5lIFNTSF9DSVBIRVJfQlJPS0VOX1JDNAk1CS8qIEFsbGVnZWQgUkM0ICovCi0jZGVmaW5lIFNTSF9DSVBIRVJfQkxPV0ZJU0gJNgotI2RlZmluZSBTU0hfQ0lQSEVSX1JFU0VSVkVECTcKLSNkZWZpbmUgU1NIX0NJUEhFUl9NQVgJCTMxCi0KLSNkZWZpbmUgQ0lQSEVSX0VOQ1JZUFQJCTEKLSNkZWZpbmUgQ0lQSEVSX0RFQ1JZUFQJCTAKLQotdHlwZWRlZiBzdHJ1Y3QgQ2lwaGVyIENpcGhlcjsKLXR5cGVkZWYgc3RydWN0IENpcGhlckNvbnRleHQgQ2lwaGVyQ29udGV4dDsKLQotc3RydWN0IENpcGhlcjsKLXN0cnVjdCBDaXBoZXJDb250ZXh0IHsKLQlpbnQJcGxhaW50ZXh0OwotCUVWUF9DSVBIRVJfQ1RYIGV2cDsKLQlDaXBoZXIgKmNpcGhlcjsKLX07Ci0KLXVfaW50CSBjaXBoZXJfbWFza19zc2gxKGludCk7Ci1DaXBoZXIJKmNpcGhlcl9ieV9uYW1lKGNvbnN0IGNoYXIgKik7Ci1DaXBoZXIJKmNpcGhlcl9ieV9udW1iZXIoaW50KTsKLWludAkgY2lwaGVyX251bWJlcihjb25zdCBjaGFyICopOwotY2hhcgkqY2lwaGVyX25hbWUoaW50KTsKLWludAkgY2lwaGVyc192YWxpZChjb25zdCBjaGFyICopOwotdm9pZAkgY2lwaGVyX2luaXQoQ2lwaGVyQ29udGV4dCAqLCBDaXBoZXIgKiwgY29uc3QgdV9jaGFyICosIHVfaW50LAotICAgIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgaW50KTsKLXZvaWQJIGNpcGhlcl9jcnlwdChDaXBoZXJDb250ZXh0ICosIHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotdm9pZAkgY2lwaGVyX2NsZWFudXAoQ2lwaGVyQ29udGV4dCAqKTsKLXZvaWQJIGNpcGhlcl9zZXRfa2V5X3N0cmluZyhDaXBoZXJDb250ZXh0ICosIENpcGhlciAqLCBjb25zdCBjaGFyICosIGludCk7Ci11X2ludAkgY2lwaGVyX2Jsb2Nrc2l6ZShjb25zdCBDaXBoZXIgKik7Ci11X2ludAkgY2lwaGVyX2tleWxlbihjb25zdCBDaXBoZXIgKik7Ci11X2ludAkgY2lwaGVyX2lzX2NiYyhjb25zdCBDaXBoZXIgKik7Ci0KLXVfaW50CSBjaXBoZXJfZ2V0X251bWJlcihjb25zdCBDaXBoZXIgKik7Ci12b2lkCSBjaXBoZXJfZ2V0X2tleWl2KENpcGhlckNvbnRleHQgKiwgdV9jaGFyICosIHVfaW50KTsKLXZvaWQJIGNpcGhlcl9zZXRfa2V5aXYoQ2lwaGVyQ29udGV4dCAqLCB1X2NoYXIgKik7Ci1pbnQJIGNpcGhlcl9nZXRfa2V5aXZfbGVuKGNvbnN0IENpcGhlckNvbnRleHQgKik7Ci1pbnQJIGNpcGhlcl9nZXRfa2V5Y29udGV4dChjb25zdCBDaXBoZXJDb250ZXh0ICosIHVfY2hhciAqKTsKLXZvaWQJIGNpcGhlcl9zZXRfa2V5Y29udGV4dChDaXBoZXJDb250ZXh0ICosIHVfY2hhciAqKTsKLSNlbmRpZgkJCQkvKiBDSVBIRVJfSCAqLwpkaWZmIC0tZ2l0IGEvY2xlYW51cC5jIGIvY2xlYW51cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzhmOTY1Li4wMDAwMDAwCi0tLSBhL2NsZWFudXAuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qICRPcGVuQlNEOiBjbGVhbnVwLmMsdiAxLjUgMjAwNi8wOC8wMyAwMzozNDo0MiBkZXJhYWR0IEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzIE1hcmt1cyBGcmllZGwgPG1hcmt1c0BvcGVuYnNkLm9yZz4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJsb2cuaCIKLQotLyogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAqLwotdm9pZAotY2xlYW51cF9leGl0KGludCBpKQotewotCV9leGl0KGkpOwotfQpkaWZmIC0tZ2l0IGEvY2xpZW50bG9vcC5jIGIvY2xpZW50bG9vcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTliMDFmLi4wMDAwMDAwCi0tLSBhL2NsaWVudGxvb3AuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNzUgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGNsaWVudGxvb3AuYyx2IDEuMjM2IDIwMTEvMDYvMjIgMjI6MDg6NDIgZGptIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogVGhlIG1haW4gbG9vcCBmb3IgdGhlIGludGVyYWN0aXZlIHNlc3Npb24gKGNsaWVudCBzaWRlKS4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlbyBkZSBSYWFkdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqCi0gKiBTU0gyIHN1cHBvcnQgYWRkZWQgYnkgTWFya3VzIEZyaWVkbC4KLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAotIyBpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmZGVmIEhBVkVfUEFUSFNfSAotI2luY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJzc2guaCIKLSNpbmNsdWRlICJzc2gxLmgiCi0jaW5jbHVkZSAic3NoMi5oIgotI2luY2x1ZGUgInBhY2tldC5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImNvbXBhdC5oIgotI2luY2x1ZGUgImNoYW5uZWxzLmgiCi0jaW5jbHVkZSAiZGlzcGF0Y2guaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJjaXBoZXIuaCIKLSNpbmNsdWRlICJrZXguaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJyZWFkY29uZi5oIgotI2luY2x1ZGUgImNsaWVudGxvb3AuaCIKLSNpbmNsdWRlICJzc2hjb25uZWN0LmgiCi0jaW5jbHVkZSAiYXV0aGZkLmgiCi0jaW5jbHVkZSAiYXRvbWljaW8uaCIKLSNpbmNsdWRlICJzc2hwdHkuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAibWF0Y2guaCIKLSNpbmNsdWRlICJtc2cuaCIKLSNpbmNsdWRlICJyb2FtaW5nLmgiCi0KLS8qIGltcG9ydCBvcHRpb25zICovCi1leHRlcm4gT3B0aW9ucyBvcHRpb25zOwotCi0vKiBGbGFnIGluZGljYXRpbmcgdGhhdCBzdGRpbiBzaG91bGQgYmUgcmVkaXJlY3RlZCBmcm9tIC9kZXYvbnVsbC4gKi8KLWV4dGVybiBpbnQgc3RkaW5fbnVsbF9mbGFnOwotCi0vKiBGbGFnIGluZGljYXRpbmcgdGhhdCBubyBzaGVsbCBoYXMgYmVlbiByZXF1ZXN0ZWQgKi8KLWV4dGVybiBpbnQgbm9fc2hlbGxfZmxhZzsKLQotLyogQ29udHJvbCBzb2NrZXQgKi8KLWV4dGVybiBpbnQgbXV4c2VydmVyX3NvY2s7IC8qIFhYWCB1c2UgbXV4X2NsaWVudF9jbGVhbnVwKCkgaW5zdGVhZCAqLwotCi0vKgotICogTmFtZSBvZiB0aGUgaG9zdCB3ZSBhcmUgY29ubmVjdGluZyB0by4gIFRoaXMgaXMgdGhlIG5hbWUgZ2l2ZW4gb24gdGhlCi0gKiBjb21tYW5kIGxpbmUsIG9yIHRoZSBIb3N0TmFtZSBzcGVjaWZpZWQgZm9yIHRoZSB1c2VyLXN1cHBsaWVkIG5hbWUgaW4gYQotICogY29uZmlndXJhdGlvbiBmaWxlLgotICovCi1leHRlcm4gY2hhciAqaG9zdDsKLQotLyoKLSAqIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBoYXZlIHJlY2VpdmVkIGEgd2luZG93IGNoYW5nZSBzaWduYWwgd2hpY2ggaGFzCi0gKiBub3QgeWV0IGJlZW4gcHJvY2Vzc2VkLiAgVGhpcyB3aWxsIGNhdXNlIGEgbWVzc2FnZSBpbmRpY2F0aW5nIHRoZSBuZXcKLSAqIHdpbmRvdyBzaXplIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlciBhIGxpdHRsZSBsYXRlci4gIFRoaXMgaXMgdm9sYXRpbGUKLSAqIGJlY2F1c2UgdGhpcyBpcyB1cGRhdGVkIGluIGEgc2lnbmFsIGhhbmRsZXIuCi0gKi8KLXN0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgcmVjZWl2ZWRfd2luZG93X2NoYW5nZV9zaWduYWwgPSAwOwotc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCByZWNlaXZlZF9zaWduYWwgPSAwOwotCi0vKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgdXNlcidzIHRlcm1pbmFsIGlzIGluIG5vbi1ibG9ja2luZyBtb2RlLiAqLwotc3RhdGljIGludCBpbl9ub25fYmxvY2tpbmdfbW9kZSA9IDA7Ci0KLS8qIFRpbWUgd2hlbiBiYWNrZ3JvdW5kZWQgY29udHJvbCBtYXN0ZXIgdXNpbmcgQ29udHJvbFBlcnNpc3Qgc2hvdWxkIGV4aXQgKi8KLXN0YXRpYyB0aW1lX3QgY29udHJvbF9wZXJzaXN0X2V4aXRfdGltZSA9IDA7Ci0KLS8qIENvbW1vbiBkYXRhIGZvciB0aGUgY2xpZW50IGxvb3AgY29kZS4gKi8KLXZvbGF0aWxlIHNpZ19hdG9taWNfdCBxdWl0X3BlbmRpbmc7IC8qIFNldCBub24temVybyB0byBxdWl0IHRoZSBsb29wLiAqLwotc3RhdGljIGludCBlc2NhcGVfY2hhcjE7CS8qIEVzY2FwZSBjaGFyYWN0ZXIuIChwcm90bzEgb25seSkgKi8KLXN0YXRpYyBpbnQgZXNjYXBlX3BlbmRpbmcxOwkvKiBMYXN0IGNoYXJhY3RlciB3YXMgYW4gZXNjYXBlIChwcm90bzEgb25seSkgKi8KLXN0YXRpYyBpbnQgbGFzdF93YXNfY3I7CQkvKiBMYXN0IGNoYXJhY3RlciB3YXMgYSBuZXdsaW5lLiAqLwotc3RhdGljIGludCBleGl0X3N0YXR1czsJCS8qIFVzZWQgdG8gc3RvcmUgdGhlIGNvbW1hbmQgZXhpdCBzdGF0dXMuICovCi1zdGF0aWMgaW50IHN0ZGluX2VvZjsJCS8qIEVPRiBoYXMgYmVlbiBlbmNvdW50ZXJlZCBvbiBzdGRlcnIuICovCi1zdGF0aWMgQnVmZmVyIHN0ZGluX2J1ZmZlcjsJLyogQnVmZmVyIGZvciBzdGRpbiBkYXRhLiAqLwotc3RhdGljIEJ1ZmZlciBzdGRvdXRfYnVmZmVyOwkvKiBCdWZmZXIgZm9yIHN0ZG91dCBkYXRhLiAqLwotc3RhdGljIEJ1ZmZlciBzdGRlcnJfYnVmZmVyOwkvKiBCdWZmZXIgZm9yIHN0ZGVyciBkYXRhLiAqLwotc3RhdGljIHVfaW50IGJ1ZmZlcl9oaWdoOwkvKiBTb2Z0IG1heCBidWZmZXIgc2l6ZS4gKi8KLXN0YXRpYyBpbnQgY29ubmVjdGlvbl9pbjsJLyogQ29ubmVjdGlvbiB0byBzZXJ2ZXIgKGlucHV0KS4gKi8KLXN0YXRpYyBpbnQgY29ubmVjdGlvbl9vdXQ7CS8qIENvbm5lY3Rpb24gdG8gc2VydmVyIChvdXRwdXQpLiAqLwotc3RhdGljIGludCBuZWVkX3Jla2V5aW5nOwkvKiBTZXQgdG8gbm9uLXplcm8gaWYgcmVrZXlpbmcgaXMgcmVxdWVzdGVkLiAqLwotc3RhdGljIGludCBzZXNzaW9uX2Nsb3NlZDsJLyogSW4gU1NIMjogbG9naW4gc2Vzc2lvbiBjbG9zZWQuICovCi1zdGF0aWMgaW50IHgxMV9yZWZ1c2VfdGltZTsJLyogSWYgPjAsIHJlZnVzZSB4MTEgb3BlbnMgYWZ0ZXIgdGhpcyB0aW1lLiAqLwotCi1zdGF0aWMgdm9pZCBjbGllbnRfaW5pdF9kaXNwYXRjaCh2b2lkKTsKLWludAlzZXNzaW9uX2lkZW50ID0gLTE7Ci0KLWludAlzZXNzaW9uX3Jlc3VtZWQgPSAwOwotCi0vKiBUcmFjayBlc2NhcGUgcGVyIHByb3RvMiBjaGFubmVsICovCi1zdHJ1Y3QgZXNjYXBlX2ZpbHRlcl9jdHggewotCWludCBlc2NhcGVfcGVuZGluZzsKLQlpbnQgZXNjYXBlX2NoYXI7Ci19OwotCi0vKiBDb250ZXh0IGZvciBjaGFubmVsIGNvbmZpcm1hdGlvbiByZXBsaWVzICovCi1zdHJ1Y3QgY2hhbm5lbF9yZXBseV9jdHggewotCWNvbnN0IGNoYXIgKnJlcXVlc3RfdHlwZTsKLQlpbnQgaWQ7Ci0JZW51bSBjb25maXJtX2FjdGlvbiBhY3Rpb247Ci19OwotCi0vKiBHbG9iYWwgcmVxdWVzdCBzdWNjZXNzL2ZhaWx1cmUgY2FsbGJhY2tzICovCi1zdHJ1Y3QgZ2xvYmFsX2NvbmZpcm0gewotCVRBSUxRX0VOVFJZKGdsb2JhbF9jb25maXJtKSBlbnRyeTsKLQlnbG9iYWxfY29uZmlybV9jYiAqY2I7Ci0Jdm9pZCAqY3R4OwotCWludCByZWZfY291bnQ7Ci19OwotVEFJTFFfSEVBRChnbG9iYWxfY29uZmlybXMsIGdsb2JhbF9jb25maXJtKTsKLXN0YXRpYyBzdHJ1Y3QgZ2xvYmFsX2NvbmZpcm1zIGdsb2JhbF9jb25maXJtcyA9Ci0gICAgVEFJTFFfSEVBRF9JTklUSUFMSVpFUihnbG9iYWxfY29uZmlybXMpOwotCi0vKlhYWCovCi1leHRlcm4gS2V4ICp4eHhfa2V4OwotCi12b2lkIHNzaF9wcm9jZXNzX3Nlc3Npb24yX3NldHVwKGludCwgaW50LCBpbnQsIEJ1ZmZlciAqKTsKLQotLyogUmVzdG9yZXMgc3RkaW4gdG8gYmxvY2tpbmcgbW9kZS4gKi8KLQotc3RhdGljIHZvaWQKLWxlYXZlX25vbl9ibG9ja2luZyh2b2lkKQotewotCWlmIChpbl9ub25fYmxvY2tpbmdfbW9kZSkgewotCQl1bnNldF9ub25ibG9jayhmaWxlbm8oc3RkaW4pKTsKLQkJaW5fbm9uX2Jsb2NraW5nX21vZGUgPSAwOwotCX0KLX0KLQotLyogUHV0cyBzdGRpbiB0ZXJtaW5hbCBpbiBub24tYmxvY2tpbmcgbW9kZS4gKi8KLQotc3RhdGljIHZvaWQKLWVudGVyX25vbl9ibG9ja2luZyh2b2lkKQotewotCWluX25vbl9ibG9ja2luZ19tb2RlID0gMTsKLQlzZXRfbm9uYmxvY2soZmlsZW5vKHN0ZGluKSk7Ci19Ci0KLS8qCi0gKiBTaWduYWwgaGFuZGxlciBmb3IgdGhlIHdpbmRvdyBjaGFuZ2Ugc2lnbmFsIChTSUdXSU5DSCkuICBUaGlzIGp1c3Qgc2V0cyBhCi0gKiBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgd2luZG93IGhhcyBjaGFuZ2VkLgotICovCi0vKkFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotd2luZG93X2NoYW5nZV9oYW5kbGVyKGludCBzaWcpCi17Ci0JcmVjZWl2ZWRfd2luZG93X2NoYW5nZV9zaWduYWwgPSAxOwotCXNpZ25hbChTSUdXSU5DSCwgd2luZG93X2NoYW5nZV9oYW5kbGVyKTsKLX0KLQotLyoKLSAqIFNpZ25hbCBoYW5kbGVyIGZvciBzaWduYWxzIHRoYXQgY2F1c2UgdGhlIHByb2dyYW0gdG8gdGVybWluYXRlLiAgVGhlc2UKLSAqIHNpZ25hbHMgbXVzdCBiZSB0cmFwcGVkIHRvIHJlc3RvcmUgdGVybWluYWwgbW9kZXMuCi0gKi8KLS8qQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1zaWduYWxfaGFuZGxlcihpbnQgc2lnKQotewotCXJlY2VpdmVkX3NpZ25hbCA9IHNpZzsKLQlxdWl0X3BlbmRpbmcgPSAxOwotfQotCi0vKgotICogUmV0dXJucyBjdXJyZW50IHRpbWUgaW4gc2Vjb25kcyBmcm9tIEphbiAxLCAxOTcwIHdpdGggdGhlIG1heGltdW0KLSAqIGF2YWlsYWJsZSByZXNvbHV0aW9uLgotICovCi0KLXN0YXRpYyBkb3VibGUKLWdldF9jdXJyZW50X3RpbWUodm9pZCkKLXsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKLQlyZXR1cm4gKGRvdWJsZSkgdHYudHZfc2VjICsgKGRvdWJsZSkgdHYudHZfdXNlYyAvIDEwMDAwMDAuMDsKLX0KLQotLyoKLSAqIFNldHMgY29udHJvbF9wZXJzaXN0X2V4aXRfdGltZSB0byB0aGUgYWJzb2x1dGUgdGltZSB3aGVuIHRoZQotICogYmFja2dyb3VuZGVkIGNvbnRyb2wgbWFzdGVyIHNob3VsZCBleGl0IGR1ZSB0byBleHBpcnkgb2YgdGhlCi0gKiBDb250cm9sUGVyc2lzdCB0aW1lb3V0LiAgU2V0cyBpdCB0byAwIGlmIHdlIGFyZSBub3QgYSBiYWNrZ3JvdW5kZWQKLSAqIGNvbnRyb2wgbWFzdGVyIHByb2Nlc3MsIG9yIGlmIHRoZXJlIGlzIG5vIENvbnRyb2xQZXJzaXN0IHRpbWVvdXQuCi0gKi8KLXN0YXRpYyB2b2lkCi1zZXRfY29udHJvbF9wZXJzaXN0X2V4aXRfdGltZSh2b2lkKQotewotCWlmIChtdXhzZXJ2ZXJfc29jayA9PSAtMSB8fCAhb3B0aW9ucy5jb250cm9sX3BlcnNpc3QKLQkgICAgfHwgb3B0aW9ucy5jb250cm9sX3BlcnNpc3RfdGltZW91dCA9PSAwKSB7Ci0JCS8qIG5vdCB1c2luZyBhIENvbnRyb2xQZXJzaXN0IHRpbWVvdXQgKi8KLQkJY29udHJvbF9wZXJzaXN0X2V4aXRfdGltZSA9IDA7Ci0JfSBlbHNlIGlmIChjaGFubmVsX3N0aWxsX29wZW4oKSkgewotCQkvKiBzb21lIGNsaWVudCBjb25uZWN0aW9ucyBhcmUgc3RpbGwgb3BlbiAqLwotCQlpZiAoY29udHJvbF9wZXJzaXN0X2V4aXRfdGltZSA+IDApCi0JCQlkZWJ1ZzIoIiVzOiBjYW5jZWwgc2NoZWR1bGVkIGV4aXQiLCBfX2Z1bmNfXyk7Ci0JCWNvbnRyb2xfcGVyc2lzdF9leGl0X3RpbWUgPSAwOwotCX0gZWxzZSBpZiAoY29udHJvbF9wZXJzaXN0X2V4aXRfdGltZSA8PSAwKSB7Ci0JCS8qIGEgY2xpZW50IGNvbm5lY3Rpb24gaGFzIHJlY2VudGx5IGNsb3NlZCAqLwotCQljb250cm9sX3BlcnNpc3RfZXhpdF90aW1lID0gdGltZShOVUxMKSArCi0JCQkodGltZV90KW9wdGlvbnMuY29udHJvbF9wZXJzaXN0X3RpbWVvdXQ7Ci0JCWRlYnVnMigiJXM6IHNjaGVkdWxlIGV4aXQgaW4gJWQgc2Vjb25kcyIsIF9fZnVuY19fLAotCQkgICAgb3B0aW9ucy5jb250cm9sX3BlcnNpc3RfdGltZW91dCk7Ci0JfQotCS8qIGVsc2Ugd2UgYXJlIGFscmVhZHkgY291bnRpbmcgZG93biB0byB0aGUgdGltZW91dCAqLwotfQotCi0jZGVmaW5lIFNTSF9YMTFfUFJPVE8gIk1JVC1NQUdJQy1DT09LSUUtMSIKLXZvaWQKLWNsaWVudF94MTFfZ2V0X3Byb3RvKGNvbnN0IGNoYXIgKmRpc3BsYXksIGNvbnN0IGNoYXIgKnhhdXRoX3BhdGgsCi0gICAgdV9pbnQgdHJ1c3RlZCwgdV9pbnQgdGltZW91dCwgY2hhciAqKl9wcm90bywgY2hhciAqKl9kYXRhKQotewotCWNoYXIgY21kWzEwMjRdOwotCWNoYXIgbGluZVs1MTJdOwotCWNoYXIgeGRpc3BsYXlbNTEyXTsKLQlzdGF0aWMgY2hhciBwcm90b1s1MTJdLCBkYXRhWzUxMl07Ci0JRklMRSAqZjsKLQlpbnQgZ290X2RhdGEgPSAwLCBnZW5lcmF0ZWQgPSAwLCBkb191bmxpbmsgPSAwLCBpOwotCWNoYXIgKnhhdXRoZGlyLCAqeGF1dGhmaWxlOwotCXN0cnVjdCBzdGF0IHN0OwotCXVfaW50IG5vdzsKLQotCXhhdXRoZGlyID0geGF1dGhmaWxlID0gTlVMTDsKLQkqX3Byb3RvID0gcHJvdG87Ci0JKl9kYXRhID0gZGF0YTsKLQlwcm90b1swXSA9IGRhdGFbMF0gPSAnXDAnOwotCi0JaWYgKHhhdXRoX3BhdGggPT0gTlVMTCB8fChzdGF0KHhhdXRoX3BhdGgsICZzdCkgPT0gLTEpKSB7Ci0JCWRlYnVnKCJObyB4YXV0aCBwcm9ncmFtLiIpOwotCX0gZWxzZSB7Ci0JCWlmIChkaXNwbGF5ID09IE5VTEwpIHsKLQkJCWRlYnVnKCJ4MTFfZ2V0X3Byb3RvOiBESVNQTEFZIG5vdCBzZXQiKTsKLQkJCXJldHVybjsKLQkJfQotCQkvKgotCQkgKiBIYW5kbGUgRmFtaWx5TG9jYWwgY2FzZSB3aGVyZSAkRElTUExBWSBkb2VzCi0JCSAqIG5vdCBtYXRjaCBhbiBhdXRob3JpemF0aW9uIGVudHJ5LiAgRm9yIHRoaXMgd2UKLQkJICoganVzdCB0cnkgInhhdXRoIGxpc3QgdW5peDpkaXNwbGF5bnVtLnNjcmVlbm51bSIuCi0JCSAqIFhYWDogImxvY2FsaG9zdCIgbWF0Y2ggdG8gZGV0ZXJtaW5lIEZhbWlseUxvY2FsCi0JCSAqICAgICAgaXMgbm90IHBlcmZlY3QuCi0JCSAqLwotCQlpZiAoc3RybmNtcChkaXNwbGF5LCAibG9jYWxob3N0OiIsIDEwKSA9PSAwKSB7Ci0JCQlzbnByaW50Zih4ZGlzcGxheSwgc2l6ZW9mKHhkaXNwbGF5KSwgInVuaXg6JXMiLAotCQkJICAgIGRpc3BsYXkgKyAxMCk7Ci0JCQlkaXNwbGF5ID0geGRpc3BsYXk7Ci0JCX0KLQkJaWYgKHRydXN0ZWQgPT0gMCkgewotCQkJeGF1dGhkaXIgPSB4bWFsbG9jKE1BWFBBVEhMRU4pOwotCQkJeGF1dGhmaWxlID0geG1hbGxvYyhNQVhQQVRITEVOKTsKLQkJCW1rdGVtcF9wcm90byh4YXV0aGRpciwgTUFYUEFUSExFTik7Ci0JCQlpZiAobWtkdGVtcCh4YXV0aGRpcikgIT0gTlVMTCkgewotCQkJCWRvX3VubGluayA9IDE7Ci0JCQkJc25wcmludGYoeGF1dGhmaWxlLCBNQVhQQVRITEVOLCAiJXMveGF1dGhmaWxlIiwKLQkJCQkgICAgeGF1dGhkaXIpOwotCQkJCXNucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksCi0JCQkJICAgICIlcyAtZiAlcyBnZW5lcmF0ZSAlcyAiIFNTSF9YMTFfUFJPVE8KLQkJCQkgICAgIiB1bnRydXN0ZWQgdGltZW91dCAldSAyPiIgX1BBVEhfREVWTlVMTCwKLQkJCQkgICAgeGF1dGhfcGF0aCwgeGF1dGhmaWxlLCBkaXNwbGF5LCB0aW1lb3V0KTsKLQkJCQlkZWJ1ZzIoIngxMV9nZXRfcHJvdG86ICVzIiwgY21kKTsKLQkJCQlpZiAoc3lzdGVtKGNtZCkgPT0gMCkKLQkJCQkJZ2VuZXJhdGVkID0gMTsKLQkJCQlpZiAoeDExX3JlZnVzZV90aW1lID09IDApIHsKLQkJCQkJbm93ID0gdGltZShOVUxMKSArIDE7Ci0JCQkJCWlmIChVSU5UX01BWCAtIHRpbWVvdXQgPCBub3cpCi0JCQkJCQl4MTFfcmVmdXNlX3RpbWUgPSBVSU5UX01BWDsKLQkJCQkJZWxzZQotCQkJCQkJeDExX3JlZnVzZV90aW1lID0gbm93ICsgdGltZW91dDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBXaGVuIGluIHVudHJ1c3RlZCBtb2RlLCB3ZSByZWFkIHRoZSBjb29raWUgb25seSBpZiBpdCB3YXMKLQkJICogc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZCBhcyBhbiB1bnRydXN0ZWQgb25lIGluIHRoZSBzdGVwCi0JCSAqIGFib3ZlLgotCQkgKi8KLQkJaWYgKHRydXN0ZWQgfHwgZ2VuZXJhdGVkKSB7Ci0JCQlzbnByaW50ZihjbWQsIHNpemVvZihjbWQpLAotCQkJICAgICIlcyAlcyVzIGxpc3QgJXMgMj4iIF9QQVRIX0RFVk5VTEwsCi0JCQkgICAgeGF1dGhfcGF0aCwKLQkJCSAgICBnZW5lcmF0ZWQgPyAiLWYgIiA6ICIiICwKLQkJCSAgICBnZW5lcmF0ZWQgPyB4YXV0aGZpbGUgOiAiIiwKLQkJCSAgICBkaXNwbGF5KTsKLQkJCWRlYnVnMigieDExX2dldF9wcm90bzogJXMiLCBjbWQpOwotCQkJZiA9IHBvcGVuKGNtZCwgInIiKTsKLQkJCWlmIChmICYmIGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikgJiYKLQkJCSAgICBzc2NhbmYobGluZSwgIiUqcyAlNTExcyAlNTExcyIsIHByb3RvLCBkYXRhKSA9PSAyKQotCQkJCWdvdF9kYXRhID0gMTsKLQkJCWlmIChmKQotCQkJCXBjbG9zZShmKTsKLQkJfSBlbHNlCi0JCQllcnJvcigiV2FybmluZzogdW50cnVzdGVkIFgxMSBmb3J3YXJkaW5nIHNldHVwIGZhaWxlZDogIgotCQkJICAgICJ4YXV0aCBrZXkgZGF0YSBub3QgZ2VuZXJhdGVkIik7Ci0JfQotCi0JaWYgKGRvX3VubGluaykgewotCQl1bmxpbmsoeGF1dGhmaWxlKTsKLQkJcm1kaXIoeGF1dGhkaXIpOwotCX0KLQlpZiAoeGF1dGhkaXIpCi0JCXhmcmVlKHhhdXRoZGlyKTsKLQlpZiAoeGF1dGhmaWxlKQotCQl4ZnJlZSh4YXV0aGZpbGUpOwotCi0JLyoKLQkgKiBJZiB3ZSBkaWRuJ3QgZ2V0IGF1dGhlbnRpY2F0aW9uIGRhdGEsIGp1c3QgbWFrZSB1cCBzb21lCi0JICogZGF0YS4gIFRoZSBmb3J3YXJkaW5nIGNvZGUgd2lsbCBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlCi0JICogcmVzcG9uc2UgYW55d2F5LCBhbmQgc3Vic3RpdHV0ZSB0aGlzIGRhdGEuICBUaGUgWDExCi0JICogc2VydmVyLCBob3dldmVyLCB3aWxsIGlnbm9yZSB0aGlzIGZha2UgZGF0YSBhbmQgdXNlCi0JICogd2hhdGV2ZXIgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBpdCB3YXMgdXNpbmcgb3RoZXJ3aXNlCi0JICogZm9yIHRoZSBsb2NhbCBjb25uZWN0aW9uLgotCSAqLwotCWlmICghZ290X2RhdGEpIHsKLQkJdV9pbnQzMl90IHJuZCA9IDA7Ci0KLQkJbG9naXQoIldhcm5pbmc6IE5vIHhhdXRoIGRhdGE7ICIKLQkJICAgICJ1c2luZyBmYWtlIGF1dGhlbnRpY2F0aW9uIGRhdGEgZm9yIFgxMSBmb3J3YXJkaW5nLiIpOwotCQlzdHJsY3B5KHByb3RvLCBTU0hfWDExX1BST1RPLCBzaXplb2YgcHJvdG8pOwotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQkJaWYgKGkgJSA0ID09IDApCi0JCQkJcm5kID0gYXJjNHJhbmRvbSgpOwotCQkJc25wcmludGYoZGF0YSArIDIgKiBpLCBzaXplb2YgZGF0YSAtIDIgKiBpLCAiJTAyeCIsCi0JCQkgICAgcm5kICYgMHhmZik7Ci0JCQlybmQgPj49IDg7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBpbnRlcmFjdGl2ZSBpcyBlbnRlcmVkLiAgVGhpcyBjaGVja3MgaWYgdGhlcmUgaXMKLSAqIGFuIEVPRiBjb21pbmcgb24gc3RkaW4uICBXZSBtdXN0IGNoZWNrIHRoaXMgZXhwbGljaXRseSwgYXMgc2VsZWN0KCkgZG9lcwotICogbm90IGFwcGVhciB0byB3YWtlIHVwIHdoZW4gcmVkaXJlY3RpbmcgZnJvbSAvZGV2L251bGwuCi0gKi8KLQotc3RhdGljIHZvaWQKLWNsaWVudF9jaGVja19pbml0aWFsX2VvZl9vbl9zdGRpbih2b2lkKQotewotCWludCBsZW47Ci0JY2hhciBidWZbMV07Ci0KLQkvKgotCSAqIElmIHN0YW5kYXJkIGlucHV0IGlzIHRvIGJlICJyZWRpcmVjdGVkIGZyb20gL2Rldi9udWxsIiwgd2Ugc2ltcGx5Ci0JICogbWFyayB0aGF0IHdlIGhhdmUgc2VlbiBhbiBFT0YgYW5kIHNlbmQgYW4gRU9GIG1lc3NhZ2UgdG8gdGhlCi0JICogc2VydmVyLiBPdGhlcndpc2UsIHdlIHRyeSB0byByZWFkIGEgc2luZ2xlIGNoYXJhY3RlcjsgaXQgYXBwZWFycwotCSAqIHRoYXQgZm9yIHNvbWUgZmlsZXMsIHN1Y2ggL2Rldi9udWxsLCBzZWxlY3QoKSBuZXZlciB3YWtlcyB1cCBmb3IKLQkgKiByZWFkIGZvciB0aGlzIGRlc2NyaXB0b3IsIHdoaWNoIG1lYW5zIHRoYXQgd2UgbmV2ZXIgZ2V0IEVPRi4gIFRoaXMKLQkgKiB3YXkgd2Ugd2lsbCBnZXQgdGhlIEVPRiBpZiBzdGRpbiBjb21lcyBmcm9tIC9kZXYvbnVsbCBvciBzaW1pbGFyLgotCSAqLwotCWlmIChzdGRpbl9udWxsX2ZsYWcpIHsKLQkJLyogRmFrZSBFT0Ygb24gc3RkaW4uICovCi0JCWRlYnVnKCJTZW5kaW5nIGVvZi4iKTsKLQkJc3RkaW5fZW9mID0gMTsKLQkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0VPRik7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JfSBlbHNlIHsKLQkJZW50ZXJfbm9uX2Jsb2NraW5nKCk7Ci0KLQkJLyogQ2hlY2sgZm9yIGltbWVkaWF0ZSBFT0Ygb24gc3RkaW4uICovCi0JCWxlbiA9IHJlYWQoZmlsZW5vKHN0ZGluKSwgYnVmLCAxKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQkvKgotCQkJICogRU9GLiAgUmVjb3JkIHRoYXQgd2UgaGF2ZSBzZWVuIGl0IGFuZCBzZW5kCi0JCQkgKiBFT0YgdG8gc2VydmVyLgotCQkJICovCi0JCQlkZWJ1ZygiU2VuZGluZyBlb2YuIik7Ci0JCQlzdGRpbl9lb2YgPSAxOwotCQkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0VPRik7Ci0JCQlwYWNrZXRfc2VuZCgpOwotCQl9IGVsc2UgaWYgKGxlbiA+IDApIHsKLQkJCS8qCi0JCQkgKiBHb3QgZGF0YS4gIFdlIG11c3Qgc3RvcmUgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciwKLQkJCSAqIGFuZCBhbHNvIHByb2Nlc3MgaXQgYXMgYW4gZXNjYXBlIGNoYXJhY3RlciBpZgotCQkJICogYXBwcm9wcmlhdGUuCi0JCQkgKi8KLQkJCWlmICgodV9jaGFyKSBidWZbMF0gPT0gZXNjYXBlX2NoYXIxKQotCQkJCWVzY2FwZV9wZW5kaW5nMSA9IDE7Ci0JCQllbHNlCi0JCQkJYnVmZmVyX2FwcGVuZCgmc3RkaW5fYnVmZmVyLCBidWYsIDEpOwotCQl9Ci0JCWxlYXZlX25vbl9ibG9ja2luZygpOwotCX0KLX0KLQotCi0vKgotICogTWFrZSBwYWNrZXRzIGZyb20gYnVmZmVyZWQgc3RkaW4gZGF0YSwgYW5kIGJ1ZmZlciB0aGVtIGZvciBzZW5kaW5nIHRvIHRoZQotICogY29ubmVjdGlvbi4KLSAqLwotCi1zdGF0aWMgdm9pZAotY2xpZW50X21ha2VfcGFja2V0c19mcm9tX3N0ZGluX2RhdGEodm9pZCkKLXsKLQl1X2ludCBsZW47Ci0KLQkvKiBTZW5kIGJ1ZmZlcmVkIHN0ZGluIGRhdGEgdG8gdGhlIHNlcnZlci4gKi8KLQl3aGlsZSAoYnVmZmVyX2xlbigmc3RkaW5fYnVmZmVyKSA+IDAgJiYKLQkgICAgcGFja2V0X25vdF92ZXJ5X211Y2hfZGF0YV90b193cml0ZSgpKSB7Ci0JCWxlbiA9IGJ1ZmZlcl9sZW4oJnN0ZGluX2J1ZmZlcik7Ci0JCS8qIEtlZXAgdGhlIHBhY2tldHMgYXQgcmVhc29uYWJsZSBzaXplLiAqLwotCQlpZiAobGVuID4gcGFja2V0X2dldF9tYXhzaXplKCkpCi0JCQlsZW4gPSBwYWNrZXRfZ2V0X21heHNpemUoKTsKLQkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX1NURElOX0RBVEEpOwotCQlwYWNrZXRfcHV0X3N0cmluZyhidWZmZXJfcHRyKCZzdGRpbl9idWZmZXIpLCBsZW4pOwotCQlwYWNrZXRfc2VuZCgpOwotCQlidWZmZXJfY29uc3VtZSgmc3RkaW5fYnVmZmVyLCBsZW4pOwotCQkvKiBJZiB3ZSBoYXZlIGEgcGVuZGluZyBFT0YsIHNlbmQgaXQgbm93LiAqLwotCQlpZiAoc3RkaW5fZW9mICYmIGJ1ZmZlcl9sZW4oJnN0ZGluX2J1ZmZlcikgPT0gMCkgewotCQkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0VPRik7Ci0JCQlwYWNrZXRfc2VuZCgpOwotCQl9Ci0JfQotfQotCi0vKgotICogQ2hlY2tzIGlmIHRoZSBjbGllbnQgd2luZG93IGhhcyBjaGFuZ2VkLCBhbmQgc2VuZHMgYSBwYWNrZXQgYWJvdXQgaXQgdG8KLSAqIHRoZSBzZXJ2ZXIgaWYgc28uICBUaGUgYWN0dWFsIGNoYW5nZSBpcyBkZXRlY3RlZCBlbHNld2hlcmUgKGJ5IGEgc29mdHdhcmUKLSAqIGludGVycnVwdCBvbiBVbml4KTsgdGhpcyBqdXN0IGNoZWNrcyB0aGUgZmxhZyBhbmQgc2VuZHMgYSBtZXNzYWdlIGlmCi0gKiBhcHByb3ByaWF0ZS4KLSAqLwotCi1zdGF0aWMgdm9pZAotY2xpZW50X2NoZWNrX3dpbmRvd19jaGFuZ2Uodm9pZCkKLXsKLQlzdHJ1Y3Qgd2luc2l6ZSB3czsKLQotCWlmICghIHJlY2VpdmVkX3dpbmRvd19jaGFuZ2Vfc2lnbmFsKQotCQlyZXR1cm47Ci0JLyoqIFhYWCByYWNlICovCi0JcmVjZWl2ZWRfd2luZG93X2NoYW5nZV9zaWduYWwgPSAwOwotCi0JZGVidWcyKCJjbGllbnRfY2hlY2tfd2luZG93X2NoYW5nZTogY2hhbmdlZCIpOwotCi0JaWYgKGNvbXBhdDIwKSB7Ci0JCWNoYW5uZWxfc2VuZF93aW5kb3dfY2hhbmdlcygpOwotCX0gZWxzZSB7Ci0JCWlmIChpb2N0bChmaWxlbm8oc3RkaW4pLCBUSU9DR1dJTlNaLCAmd3MpIDwgMCkKLQkJCXJldHVybjsKLQkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX1dJTkRPV19TSVpFKTsKLQkJcGFja2V0X3B1dF9pbnQoKHVfaW50KXdzLndzX3Jvdyk7Ci0JCXBhY2tldF9wdXRfaW50KCh1X2ludCl3cy53c19jb2wpOwotCQlwYWNrZXRfcHV0X2ludCgodV9pbnQpd3Mud3NfeHBpeGVsKTsKLQkJcGFja2V0X3B1dF9pbnQoKHVfaW50KXdzLndzX3lwaXhlbCk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotY2xpZW50X2dsb2JhbF9yZXF1ZXN0X3JlcGx5KGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQotewotCXN0cnVjdCBnbG9iYWxfY29uZmlybSAqZ2M7Ci0KLQlpZiAoKGdjID0gVEFJTFFfRklSU1QoJmdsb2JhbF9jb25maXJtcykpID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAoZ2MtPmNiICE9IE5VTEwpCi0JCWdjLT5jYih0eXBlLCBzZXEsIGdjLT5jdHgpOwotCWlmICgtLWdjLT5yZWZfY291bnQgPD0gMCkgewotCQlUQUlMUV9SRU1PVkUoJmdsb2JhbF9jb25maXJtcywgZ2MsIGVudHJ5KTsKLQkJYnplcm8oZ2MsIHNpemVvZigqZ2MpKTsKLQkJeGZyZWUoZ2MpOwotCX0KLQotCXBhY2tldF9zZXRfYWxpdmVfdGltZW91dHMoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXJ2ZXJfYWxpdmVfY2hlY2sodm9pZCkKLXsKLQlpZiAocGFja2V0X2luY19hbGl2ZV90aW1lb3V0cygpID4gb3B0aW9ucy5zZXJ2ZXJfYWxpdmVfY291bnRfbWF4KSB7Ci0JCWxvZ2l0KCJUaW1lb3V0LCBzZXJ2ZXIgJXMgbm90IHJlc3BvbmRpbmcuIiwgaG9zdCk7Ci0JCWNsZWFudXBfZXhpdCgyNTUpOwotCX0KLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfR0xPQkFMX1JFUVVFU1QpOwotCXBhY2tldF9wdXRfY3N0cmluZygia2VlcGFsaXZlQG9wZW5zc2guY29tIik7Ci0JcGFja2V0X3B1dF9jaGFyKDEpOyAgICAgLyogYm9vbGVhbjogd2FudCByZXBseSAqLwotCXBhY2tldF9zZW5kKCk7Ci0JLyogSW5zZXJ0IGFuIGVtcHR5IHBsYWNlaG9sZGVyIHRvIG1haW50YWluIG9yZGVyaW5nICovCi0JY2xpZW50X3JlZ2lzdGVyX2dsb2JhbF9jb25maXJtKE5VTEwsIE5VTEwpOwotfQotCi0vKgotICogV2FpdHMgdW50aWwgdGhlIGNsaWVudCBjYW4gZG8gc29tZXRoaW5nIChzb21lIGRhdGEgYmVjb21lcyBhdmFpbGFibGUgb24KLSAqIG9uZSBvZiB0aGUgZmlsZSBkZXNjcmlwdG9ycykuCi0gKi8KLXN0YXRpYyB2b2lkCi1jbGllbnRfd2FpdF91bnRpbF9jYW5fZG9fc29tZXRoaW5nKGZkX3NldCAqKnJlYWRzZXRwLCBmZF9zZXQgKip3cml0ZXNldHAsCi0gICAgaW50ICptYXhmZHAsIHVfaW50ICpuYWxsb2NwLCBpbnQgcmVrZXlpbmcpCi17Ci0Jc3RydWN0IHRpbWV2YWwgdHYsICp0dnA7Ci0JaW50IHRpbWVvdXRfc2VjczsKLQlpbnQgcmV0OwotCi0JLyogQWRkIGFueSBzZWxlY3Rpb25zIGJ5IHRoZSBjaGFubmVsIG1lY2hhbmlzbS4gKi8KLQljaGFubmVsX3ByZXBhcmVfc2VsZWN0KHJlYWRzZXRwLCB3cml0ZXNldHAsIG1heGZkcCwgbmFsbG9jcCwgcmVrZXlpbmcpOwotCi0JaWYgKCFjb21wYXQyMCkgewotCQkvKiBSZWFkIGZyb20gdGhlIGNvbm5lY3Rpb24sIHVubGVzcyBvdXIgYnVmZmVycyBhcmUgZnVsbC4gKi8KLQkJaWYgKGJ1ZmZlcl9sZW4oJnN0ZG91dF9idWZmZXIpIDwgYnVmZmVyX2hpZ2ggJiYKLQkJICAgIGJ1ZmZlcl9sZW4oJnN0ZGVycl9idWZmZXIpIDwgYnVmZmVyX2hpZ2ggJiYKLQkJICAgIGNoYW5uZWxfbm90X3ZlcnlfbXVjaF9idWZmZXJlZF9kYXRhKCkpCi0JCQlGRF9TRVQoY29ubmVjdGlvbl9pbiwgKnJlYWRzZXRwKTsKLQkJLyoKLQkJICogUmVhZCBmcm9tIHN0ZGluLCB1bmxlc3Mgd2UgaGF2ZSBzZWVuIEVPRiBvciBoYXZlIHZlcnkgbXVjaAotCQkgKiBidWZmZXJlZCBkYXRhIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KLQkJICovCi0JCWlmICghc3RkaW5fZW9mICYmIHBhY2tldF9ub3RfdmVyeV9tdWNoX2RhdGFfdG9fd3JpdGUoKSkKLQkJCUZEX1NFVChmaWxlbm8oc3RkaW4pLCAqcmVhZHNldHApOwotCi0JCS8qIFNlbGVjdCBzdGRvdXQvc3RkZXJyIGlmIGhhdmUgZGF0YSBpbiBidWZmZXIuICovCi0JCWlmIChidWZmZXJfbGVuKCZzdGRvdXRfYnVmZmVyKSA+IDApCi0JCQlGRF9TRVQoZmlsZW5vKHN0ZG91dCksICp3cml0ZXNldHApOwotCQlpZiAoYnVmZmVyX2xlbigmc3RkZXJyX2J1ZmZlcikgPiAwKQotCQkJRkRfU0VUKGZpbGVubyhzdGRlcnIpLCAqd3JpdGVzZXRwKTsKLQl9IGVsc2UgewotCQkvKiBjaGFubmVsX3ByZXBhcmVfc2VsZWN0IGNvdWxkIGhhdmUgY2xvc2VkIHRoZSBsYXN0IGNoYW5uZWwgKi8KLQkJaWYgKHNlc3Npb25fY2xvc2VkICYmICFjaGFubmVsX3N0aWxsX29wZW4oKSAmJgotCQkgICAgIXBhY2tldF9oYXZlX2RhdGFfdG9fd3JpdGUoKSkgewotCQkJLyogY2xlYXIgbWFzayBzaW5jZSB3ZSBkaWQgbm90IGNhbGwgc2VsZWN0KCkgKi8KLQkJCW1lbXNldCgqcmVhZHNldHAsIDAsICpuYWxsb2NwKTsKLQkJCW1lbXNldCgqd3JpdGVzZXRwLCAwLCAqbmFsbG9jcCk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQlGRF9TRVQoY29ubmVjdGlvbl9pbiwgKnJlYWRzZXRwKTsKLQkJfQotCX0KLQotCS8qIFNlbGVjdCBzZXJ2ZXIgY29ubmVjdGlvbiBpZiBoYXZlIGRhdGEgdG8gd3JpdGUgdG8gdGhlIHNlcnZlci4gKi8KLQlpZiAocGFja2V0X2hhdmVfZGF0YV90b193cml0ZSgpKQotCQlGRF9TRVQoY29ubmVjdGlvbl9vdXQsICp3cml0ZXNldHApOwotCi0JLyoKLQkgKiBXYWl0IGZvciBzb21ldGhpbmcgdG8gaGFwcGVuLiAgVGhpcyB3aWxsIHN1c3BlbmQgdGhlIHByb2Nlc3MgdW50aWwKLQkgKiBzb21lIHNlbGVjdGVkIGRlc2NyaXB0b3IgY2FuIGJlIHJlYWQsIHdyaXR0ZW4sIG9yIGhhcyBzb21lIG90aGVyCi0JICogZXZlbnQgcGVuZGluZywgb3IgYSB0aW1lb3V0IGV4cGlyZXMuCi0JICovCi0KLQl0aW1lb3V0X3NlY3MgPSBJTlRfTUFYOyAvKiB3ZSB1c2UgSU5UX01BWCB0byBtZWFuIG5vIHRpbWVvdXQgKi8KLQlpZiAob3B0aW9ucy5zZXJ2ZXJfYWxpdmVfaW50ZXJ2YWwgPiAwICYmIGNvbXBhdDIwKQotCQl0aW1lb3V0X3NlY3MgPSBvcHRpb25zLnNlcnZlcl9hbGl2ZV9pbnRlcnZhbDsKLQlzZXRfY29udHJvbF9wZXJzaXN0X2V4aXRfdGltZSgpOwotCWlmIChjb250cm9sX3BlcnNpc3RfZXhpdF90aW1lID4gMCkgewotCQl0aW1lb3V0X3NlY3MgPSBNSU4odGltZW91dF9zZWNzLAotCQkJY29udHJvbF9wZXJzaXN0X2V4aXRfdGltZSAtIHRpbWUoTlVMTCkpOwotCQlpZiAodGltZW91dF9zZWNzIDwgMCkKLQkJCXRpbWVvdXRfc2VjcyA9IDA7Ci0JfQotCWlmICh0aW1lb3V0X3NlY3MgPT0gSU5UX01BWCkKLQkJdHZwID0gTlVMTDsKLQllbHNlIHsKLQkJdHYudHZfc2VjID0gdGltZW91dF9zZWNzOwotCQl0di50dl91c2VjID0gMDsKLQkJdHZwID0gJnR2OwotCX0KLQotCXJldCA9IHNlbGVjdCgoKm1heGZkcCkrMSwgKnJlYWRzZXRwLCAqd3JpdGVzZXRwLCBOVUxMLCB0dnApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWNoYXIgYnVmWzEwMF07Ci0KLQkJLyoKLQkJICogV2UgaGF2ZSB0byBjbGVhciB0aGUgc2VsZWN0IG1hc2tzLCBiZWNhdXNlIHdlIHJldHVybi4KLQkJICogV2UgaGF2ZSB0byByZXR1cm4sIGJlY2F1c2UgdGhlIG1haW5sb29wIGNoZWNrcyBmb3IgdGhlIGZsYWdzCi0JCSAqIHNldCBieSB0aGUgc2lnbmFsIGhhbmRsZXJzLgotCQkgKi8KLQkJbWVtc2V0KCpyZWFkc2V0cCwgMCwgKm5hbGxvY3ApOwotCQltZW1zZXQoKndyaXRlc2V0cCwgMCwgKm5hbGxvY3ApOwotCi0JCWlmIChlcnJubyA9PSBFSU5UUikKLQkJCXJldHVybjsKLQkJLyogTm90ZTogd2UgbWlnaHQgc3RpbGwgaGF2ZSBkYXRhIGluIHRoZSBidWZmZXJzLiAqLwotCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJzZWxlY3Q6ICVzXHJcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWJ1ZmZlcl9hcHBlbmQoJnN0ZGVycl9idWZmZXIsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotCQlxdWl0X3BlbmRpbmcgPSAxOwotCX0gZWxzZSBpZiAocmV0ID09IDApCi0JCXNlcnZlcl9hbGl2ZV9jaGVjaygpOwotfQotCi1zdGF0aWMgdm9pZAotY2xpZW50X3N1c3BlbmRfc2VsZihCdWZmZXIgKmJpbiwgQnVmZmVyICpib3V0LCBCdWZmZXIgKmJlcnIpCi17Ci0JLyogRmx1c2ggc3Rkb3V0IGFuZCBzdGRlcnIgYnVmZmVycy4gKi8KLQlpZiAoYnVmZmVyX2xlbihib3V0KSA+IDApCi0JCWF0b21pY2lvKHZ3cml0ZSwgZmlsZW5vKHN0ZG91dCksIGJ1ZmZlcl9wdHIoYm91dCksCi0JCSAgICBidWZmZXJfbGVuKGJvdXQpKTsKLQlpZiAoYnVmZmVyX2xlbihiZXJyKSA+IDApCi0JCWF0b21pY2lvKHZ3cml0ZSwgZmlsZW5vKHN0ZGVyciksIGJ1ZmZlcl9wdHIoYmVyciksCi0JCSAgICBidWZmZXJfbGVuKGJlcnIpKTsKLQotCWxlYXZlX3Jhd19tb2RlKG9wdGlvbnMucmVxdWVzdF90dHkgPT0gUkVRVUVTVF9UVFlfRk9SQ0UpOwotCi0JLyoKLQkgKiBGcmVlIChhbmQgY2xlYXIpIHRoZSBidWZmZXIgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGdldHMKLQkgKiB3cml0dGVuIHRvIHN3YXAuCi0JICovCi0JYnVmZmVyX2ZyZWUoYmluKTsKLQlidWZmZXJfZnJlZShib3V0KTsKLQlidWZmZXJfZnJlZShiZXJyKTsKLQotCS8qIFNlbmQgdGhlIHN1c3BlbmQgc2lnbmFsIHRvIHRoZSBwcm9ncmFtIGl0c2VsZi4gKi8KLQlraWxsKGdldHBpZCgpLCBTSUdUU1RQKTsKLQotCS8qIFJlc2V0IHdpbmRvdyBzaXplcyBpbiBjYXNlIHRoZXkgaGF2ZSBjaGFuZ2VkICovCi0JcmVjZWl2ZWRfd2luZG93X2NoYW5nZV9zaWduYWwgPSAxOwotCi0JLyogT0ssIHdlIGhhdmUgYmVlbiBjb250aW51ZWQgYnkgdGhlIHVzZXIuIFJlaW5pdGlhbGl6ZSBidWZmZXJzLiAqLwotCWJ1ZmZlcl9pbml0KGJpbik7Ci0JYnVmZmVyX2luaXQoYm91dCk7Ci0JYnVmZmVyX2luaXQoYmVycik7Ci0KLQllbnRlcl9yYXdfbW9kZShvcHRpb25zLnJlcXVlc3RfdHR5ID09IFJFUVVFU1RfVFRZX0ZPUkNFKTsKLX0KLQotc3RhdGljIHZvaWQKLWNsaWVudF9wcm9jZXNzX25ldF9pbnB1dChmZF9zZXQgKnJlYWRzZXQpCi17Ci0JaW50IGxlbiwgY29udCA9IDA7Ci0JY2hhciBidWZbU1NIX0lPQlVGU1pdOwotCi0JLyoKLQkgKiBSZWFkIGlucHV0IGZyb20gdGhlIHNlcnZlciwgYW5kIGFkZCBhbnkgc3VjaCBkYXRhIHRvIHRoZSBidWZmZXIgb2YKLQkgKiB0aGUgcGFja2V0IHN1YnN5c3RlbS4KLQkgKi8KLQlpZiAoRkRfSVNTRVQoY29ubmVjdGlvbl9pbiwgcmVhZHNldCkpIHsKLQkJLyogUmVhZCBhcyBtdWNoIGFzIHBvc3NpYmxlLiAqLwotCQlsZW4gPSByb2FtaW5nX3JlYWQoY29ubmVjdGlvbl9pbiwgYnVmLCBzaXplb2YoYnVmKSwgJmNvbnQpOwotCQlpZiAobGVuID09IDAgJiYgY29udCA9PSAwKSB7Ci0JCQkvKgotCQkJICogUmVjZWl2ZWQgRU9GLiAgVGhlIHJlbW90ZSBob3N0IGhhcyBjbG9zZWQgdGhlCi0JCQkgKiBjb25uZWN0aW9uLgotCQkJICovCi0JCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsCi0JCQkgICAgIkNvbm5lY3Rpb24gdG8gJS4zMDBzIGNsb3NlZCBieSByZW1vdGUgaG9zdC5cclxuIiwKLQkJCSAgICBob3N0KTsKLQkJCWJ1ZmZlcl9hcHBlbmQoJnN0ZGVycl9idWZmZXIsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotCQkJcXVpdF9wZW5kaW5nID0gMTsKLQkJCXJldHVybjsKLQkJfQotCQkvKgotCQkgKiBUaGVyZSBpcyBhIGtlcm5lbCBidWcgb24gU29sYXJpcyB0aGF0IGNhdXNlcyBzZWxlY3QgdG8KLQkJICogc29tZXRpbWVzIHdha2UgdXAgZXZlbiB0aG91Z2ggdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUuCi0JCSAqLwotCQlpZiAobGVuIDwgMCAmJgotCQkgICAgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykpCi0JCQlsZW4gPSAwOwotCi0JCWlmIChsZW4gPCAwKSB7Ci0JCQkvKgotCQkJICogQW4gZXJyb3IgaGFzIGVuY291bnRlcmVkLiAgUGVyaGFwcyB0aGVyZSBpcyBhCi0JCQkgKiBuZXR3b3JrIHByb2JsZW0uCi0JCQkgKi8KLQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwKLQkJCSAgICAiUmVhZCBmcm9tIHJlbW90ZSBob3N0ICUuMzAwczogJS4xMDBzXHJcbiIsCi0JCQkgICAgaG9zdCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCWJ1ZmZlcl9hcHBlbmQoJnN0ZGVycl9idWZmZXIsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotCQkJcXVpdF9wZW5kaW5nID0gMTsKLQkJCXJldHVybjsKLQkJfQotCQlwYWNrZXRfcHJvY2Vzc19pbmNvbWluZyhidWYsIGxlbik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotY2xpZW50X3N0YXR1c19jb25maXJtKGludCB0eXBlLCBDaGFubmVsICpjLCB2b2lkICpjdHgpCi17Ci0Jc3RydWN0IGNoYW5uZWxfcmVwbHlfY3R4ICpjciA9IChzdHJ1Y3QgY2hhbm5lbF9yZXBseV9jdHggKiljdHg7Ci0JY2hhciBlcnJtc2dbMjU2XTsKLQlpbnQgdG9jaGFuOwotCi0JLyoKLQkgKiBJZiBhIFRUWSB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQsIHRoZW4gYSBmYWlsdXJlIHRvIGFsbG9jYXRlCi0JICogb25lIGlzIGZhdGFsLgotCSAqLwotCWlmIChjci0+YWN0aW9uID09IENPTkZJUk1fVFRZICYmCi0JICAgIChvcHRpb25zLnJlcXVlc3RfdHR5ID09IFJFUVVFU1RfVFRZX0ZPUkNFIHx8Ci0JICAgIG9wdGlvbnMucmVxdWVzdF90dHkgPT0gUkVRVUVTVF9UVFlfWUVTKSkKLQkJY3ItPmFjdGlvbiA9IENPTkZJUk1fQ0xPU0U7Ci0KLQkvKiBYWFggc3VwcmVzcyBvbiBtdXggX2NsaWVudF8gcXVpZXRtb2RlICovCi0JdG9jaGFuID0gb3B0aW9ucy5sb2dfbGV2ZWwgPj0gU1lTTE9HX0xFVkVMX0VSUk9SICYmCi0JICAgIGMtPmN0bF9jaGFuICE9IC0xICYmIGMtPmV4dGVuZGVkX3VzYWdlID09IENIQU5fRVhURU5ERURfV1JJVEU7Ci0KLQlpZiAodHlwZSA9PSBTU0gyX01TR19DSEFOTkVMX1NVQ0NFU1MpIHsKLQkJZGVidWcyKCIlcyByZXF1ZXN0IGFjY2VwdGVkIG9uIGNoYW5uZWwgJWQiLAotCQkgICAgY3ItPnJlcXVlc3RfdHlwZSwgYy0+c2VsZik7Ci0JfSBlbHNlIGlmICh0eXBlID09IFNTSDJfTVNHX0NIQU5ORUxfRkFJTFVSRSkgewotCQlpZiAodG9jaGFuKSB7Ci0JCQlzbnByaW50ZihlcnJtc2csIHNpemVvZihlcnJtc2cpLAotCQkJICAgICIlcyByZXF1ZXN0IGZhaWxlZFxyXG4iLCBjci0+cmVxdWVzdF90eXBlKTsKLQkJfSBlbHNlIHsKLQkJCXNucHJpbnRmKGVycm1zZywgc2l6ZW9mKGVycm1zZyksCi0JCQkgICAgIiVzIHJlcXVlc3QgZmFpbGVkIG9uIGNoYW5uZWwgJWQiLAotCQkJICAgIGNyLT5yZXF1ZXN0X3R5cGUsIGMtPnNlbGYpOwotCQl9Ci0JCS8qIElmIGVycm9yIG9jY3VycmVkIG9uIHByaW1hcnkgc2Vzc2lvbiBjaGFubmVsLCB0aGVuIGV4aXQgKi8KLQkJaWYgKGNyLT5hY3Rpb24gPT0gQ09ORklSTV9DTE9TRSAmJiBjLT5zZWxmID09IHNlc3Npb25faWRlbnQpCi0JCQlmYXRhbCgiJXMiLCBlcnJtc2cpOwotCQkvKgotCQkgKiBJZiBlcnJvciBvY2N1cnJlZCBvbiBtdXggY2xpZW50LCBhcHBlbmQgdG8KLQkJICogdGhlaXIgc3RkZXJyLgotCQkgKi8KLQkJaWYgKHRvY2hhbikgewotCQkJYnVmZmVyX2FwcGVuZCgmYy0+ZXh0ZW5kZWQsIGVycm1zZywKLQkJCSAgICBzdHJsZW4oZXJybXNnKSk7Ci0JCX0gZWxzZQotCQkJZXJyb3IoIiVzIiwgZXJybXNnKTsKLQkJaWYgKGNyLT5hY3Rpb24gPT0gQ09ORklSTV9UVFkpIHsKLQkJCS8qCi0JCQkgKiBJZiBhIFRUWSBhbGxvY2F0aW9uIGVycm9yIG9jY3VycmVkLCB0aGVuIGFycmFuZ2UKLQkJCSAqIGZvciB0aGUgY29ycmVjdCBUVFkgdG8gbGVhdmUgcmF3IG1vZGUuCi0JCQkgKi8KLQkJCWlmIChjLT5zZWxmID09IHNlc3Npb25faWRlbnQpCi0JCQkJbGVhdmVfcmF3X21vZGUoMCk7Ci0JCQllbHNlCi0JCQkJbXV4X3R0eV9hbGxvY19mYWlsZWQoYyk7Ci0JCX0gZWxzZSBpZiAoY3ItPmFjdGlvbiA9PSBDT05GSVJNX0NMT1NFKSB7Ci0JCQljaGFuX3JlYWRfZmFpbGVkKGMpOwotCQkJY2hhbl93cml0ZV9mYWlsZWQoYyk7Ci0JCX0KLQl9Ci0JeGZyZWUoY3IpOwotfQotCi1zdGF0aWMgdm9pZAotY2xpZW50X2FiYW5kb25fc3RhdHVzX2NvbmZpcm0oQ2hhbm5lbCAqYywgdm9pZCAqY3R4KQotewotCXhmcmVlKGN0eCk7Ci19Ci0KLXZvaWQKLWNsaWVudF9leHBlY3RfY29uZmlybShpbnQgaWQsIGNvbnN0IGNoYXIgKnJlcXVlc3QsCi0gICAgZW51bSBjb25maXJtX2FjdGlvbiBhY3Rpb24pCi17Ci0Jc3RydWN0IGNoYW5uZWxfcmVwbHlfY3R4ICpjciA9IHhtYWxsb2Moc2l6ZW9mKCpjcikpOwotCi0JY3ItPnJlcXVlc3RfdHlwZSA9IHJlcXVlc3Q7Ci0JY3ItPmFjdGlvbiA9IGFjdGlvbjsKLQotCWNoYW5uZWxfcmVnaXN0ZXJfc3RhdHVzX2NvbmZpcm0oaWQsIGNsaWVudF9zdGF0dXNfY29uZmlybSwKLQkgICAgY2xpZW50X2FiYW5kb25fc3RhdHVzX2NvbmZpcm0sIGNyKTsKLX0KLQotdm9pZAotY2xpZW50X3JlZ2lzdGVyX2dsb2JhbF9jb25maXJtKGdsb2JhbF9jb25maXJtX2NiICpjYiwgdm9pZCAqY3R4KQotewotCXN0cnVjdCBnbG9iYWxfY29uZmlybSAqZ2MsICpsYXN0X2djOwotCi0JLyogQ29hbGVzY2UgaWRlbnRpY2FsIGNhbGxiYWNrcyAqLwotCWxhc3RfZ2MgPSBUQUlMUV9MQVNUKCZnbG9iYWxfY29uZmlybXMsIGdsb2JhbF9jb25maXJtcyk7Ci0JaWYgKGxhc3RfZ2MgJiYgbGFzdF9nYy0+Y2IgPT0gY2IgJiYgbGFzdF9nYy0+Y3R4ID09IGN0eCkgewotCQlpZiAoKytsYXN0X2djLT5yZWZfY291bnQgPj0gSU5UX01BWCkKLQkJCWZhdGFsKCIlczogbGFzdF9nYy0+cmVmX2NvdW50ID0gJWQiLAotCQkJICAgIF9fZnVuY19fLCBsYXN0X2djLT5yZWZfY291bnQpOwotCQlyZXR1cm47Ci0JfQotCi0JZ2MgPSB4bWFsbG9jKHNpemVvZigqZ2MpKTsKLQlnYy0+Y2IgPSBjYjsKLQlnYy0+Y3R4ID0gY3R4OwotCWdjLT5yZWZfY291bnQgPSAxOwotCVRBSUxRX0lOU0VSVF9UQUlMKCZnbG9iYWxfY29uZmlybXMsIGdjLCBlbnRyeSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2NtZGxpbmUodm9pZCkKLXsKLQl2b2lkICgqaGFuZGxlcikoaW50KTsKLQljaGFyICpzLCAqY21kLCAqY2FuY2VsX2hvc3Q7Ci0JaW50IGRlbGV0ZSA9IDA7Ci0JaW50IGxvY2FsID0gMCwgcmVtb3RlID0gMCwgZHluYW1pYyA9IDA7Ci0JaW50IGNhbmNlbF9wb3J0OwotCUZvcndhcmQgZndkOwotCi0JYnplcm8oJmZ3ZCwgc2l6ZW9mKGZ3ZCkpOwotCWZ3ZC5saXN0ZW5faG9zdCA9IGZ3ZC5jb25uZWN0X2hvc3QgPSBOVUxMOwotCi0JbGVhdmVfcmF3X21vZGUob3B0aW9ucy5yZXF1ZXN0X3R0eSA9PSBSRVFVRVNUX1RUWV9GT1JDRSk7Ci0JaGFuZGxlciA9IHNpZ25hbChTSUdJTlQsIFNJR19JR04pOwotCWNtZCA9IHMgPSByZWFkX3Bhc3NwaHJhc2UoIlxyXG5zc2g+ICIsIFJQX0VDSE8pOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gb3V0OwotCXdoaWxlIChpc3NwYWNlKCpzKSkKLQkJcysrOwotCWlmICgqcyA9PSAnLScpCi0JCXMrKzsJLyogU2tpcCBjbWRsaW5lICctJywgaWYgYW55ICovCi0JaWYgKCpzID09ICdcMCcpCi0JCWdvdG8gb3V0OwotCi0JaWYgKCpzID09ICdoJyB8fCAqcyA9PSAnSCcgfHwgKnMgPT0gJz8nKSB7Ci0JCWxvZ2l0KCJDb21tYW5kczoiKTsKLQkJbG9naXQoIiAgICAgIC1MW2JpbmRfYWRkcmVzczpdcG9ydDpob3N0Omhvc3Rwb3J0ICAgICIKLQkJICAgICJSZXF1ZXN0IGxvY2FsIGZvcndhcmQiKTsKLQkJbG9naXQoIiAgICAgIC1SW2JpbmRfYWRkcmVzczpdcG9ydDpob3N0Omhvc3Rwb3J0ICAgICIKLQkJICAgICJSZXF1ZXN0IHJlbW90ZSBmb3J3YXJkIik7Ci0JCWxvZ2l0KCIgICAgICAtRFtiaW5kX2FkZHJlc3M6XXBvcnQgICAgICAgICAgICAgICAgICAiCi0JCSAgICAiUmVxdWVzdCBkeW5hbWljIGZvcndhcmQiKTsKLQkJbG9naXQoIiAgICAgIC1LUltiaW5kX2FkZHJlc3M6XXBvcnQgICAgICAgICAgICAgICAgICIKLQkJICAgICJDYW5jZWwgcmVtb3RlIGZvcndhcmQiKTsKLQkJaWYgKCFvcHRpb25zLnBlcm1pdF9sb2NhbF9jb21tYW5kKQotCQkJZ290byBvdXQ7Ci0JCWxvZ2l0KCIgICAgICAhYXJncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi0JCSAgICAiRXhlY3V0ZSBsb2NhbCBjb21tYW5kIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICgqcyA9PSAnIScgJiYgb3B0aW9ucy5wZXJtaXRfbG9jYWxfY29tbWFuZCkgewotCQlzKys7Ci0JCXNzaF9sb2NhbF9jbWQocyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICgqcyA9PSAnSycpIHsKLQkJZGVsZXRlID0gMTsKLQkJcysrOwotCX0KLQlpZiAoKnMgPT0gJ0wnKQotCQlsb2NhbCA9IDE7Ci0JZWxzZSBpZiAoKnMgPT0gJ1InKQotCQlyZW1vdGUgPSAxOwotCWVsc2UgaWYgKCpzID09ICdEJykKLQkJZHluYW1pYyA9IDE7Ci0JZWxzZSB7Ci0JCWxvZ2l0KCJJbnZhbGlkIGNvbW1hbmQuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICgobG9jYWwgfHwgZHluYW1pYykgJiYgZGVsZXRlKSB7Ci0JCWxvZ2l0KCJOb3Qgc3VwcG9ydGVkLiIpOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKHJlbW90ZSAmJiBkZWxldGUgJiYgIWNvbXBhdDIwKSB7Ci0JCWxvZ2l0KCJOb3Qgc3VwcG9ydGVkIGZvciBTU0ggcHJvdG9jb2wgdmVyc2lvbiAxLiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl3aGlsZSAoaXNzcGFjZSgqKytzKSkKLQkJOwotCi0JLyogWFhYIHVwZGF0ZSBsaXN0IG9mIGZvcndhcmRzIGluIG9wdGlvbnMgKi8KLQlpZiAoZGVsZXRlKSB7Ci0JCWNhbmNlbF9wb3J0ID0gMDsKLQkJY2FuY2VsX2hvc3QgPSBocGRlbGltKCZzKTsJLyogbWF5IGJlIE5VTEwgKi8KLQkJaWYgKHMgIT0gTlVMTCkgewotCQkJY2FuY2VsX3BvcnQgPSBhMnBvcnQocyk7Ci0JCQljYW5jZWxfaG9zdCA9IGNsZWFuaG9zdG5hbWUoY2FuY2VsX2hvc3QpOwotCQl9IGVsc2UgewotCQkJY2FuY2VsX3BvcnQgPSBhMnBvcnQoY2FuY2VsX2hvc3QpOwotCQkJY2FuY2VsX2hvc3QgPSBOVUxMOwotCQl9Ci0JCWlmIChjYW5jZWxfcG9ydCA8PSAwKSB7Ci0JCQlsb2dpdCgiQmFkIGZvcndhcmRpbmcgY2xvc2UgcG9ydCIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJY2hhbm5lbF9yZXF1ZXN0X3Jmb3J3YXJkX2NhbmNlbChjYW5jZWxfaG9zdCwgY2FuY2VsX3BvcnQpOwotCX0gZWxzZSB7Ci0JCWlmICghcGFyc2VfZm9yd2FyZCgmZndkLCBzLCBkeW5hbWljLCByZW1vdGUpKSB7Ci0JCQlsb2dpdCgiQmFkIGZvcndhcmRpbmcgc3BlY2lmaWNhdGlvbi4iKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWlmIChsb2NhbCB8fCBkeW5hbWljKSB7Ci0JCQlpZiAoY2hhbm5lbF9zZXR1cF9sb2NhbF9md2RfbGlzdGVuZXIoZndkLmxpc3Rlbl9ob3N0LAotCQkJICAgIGZ3ZC5saXN0ZW5fcG9ydCwgZndkLmNvbm5lY3RfaG9zdCwKLQkJCSAgICBmd2QuY29ubmVjdF9wb3J0LCBvcHRpb25zLmdhdGV3YXlfcG9ydHMpIDwgMCkgewotCQkJCWxvZ2l0KCJQb3J0IGZvcndhcmRpbmcgZmFpbGVkLiIpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGNoYW5uZWxfcmVxdWVzdF9yZW1vdGVfZm9yd2FyZGluZyhmd2QubGlzdGVuX2hvc3QsCi0JCQkgICAgZndkLmxpc3Rlbl9wb3J0LCBmd2QuY29ubmVjdF9ob3N0LAotCQkJICAgIGZ3ZC5jb25uZWN0X3BvcnQpIDwgMCkgewotCQkJCWxvZ2l0KCJQb3J0IGZvcndhcmRpbmcgZmFpbGVkLiIpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0KLQkJbG9naXQoIkZvcndhcmRpbmcgcG9ydC4iKTsKLQl9Ci0KLW91dDoKLQlzaWduYWwoU0lHSU5ULCBoYW5kbGVyKTsKLQllbnRlcl9yYXdfbW9kZShvcHRpb25zLnJlcXVlc3RfdHR5ID09IFJFUVVFU1RfVFRZX0ZPUkNFKTsKLQlpZiAoY21kKQotCQl4ZnJlZShjbWQpOwotCWlmIChmd2QubGlzdGVuX2hvc3QgIT0gTlVMTCkKLQkJeGZyZWUoZndkLmxpc3Rlbl9ob3N0KTsKLQlpZiAoZndkLmNvbm5lY3RfaG9zdCAhPSBOVUxMKQotCQl4ZnJlZShmd2QuY29ubmVjdF9ob3N0KTsKLX0KLQotLyogCi0gKiBQcm9jZXNzIHRoZSBjaGFyYWN0ZXJzIG9uZSBieSBvbmUsIGNhbGwgd2l0aCBjPT1OVUxMIGZvciBwcm90bzEgY2FzZS4KLSAqLwotc3RhdGljIGludAotcHJvY2Vzc19lc2NhcGVzKENoYW5uZWwgKmMsIEJ1ZmZlciAqYmluLCBCdWZmZXIgKmJvdXQsIEJ1ZmZlciAqYmVyciwKLSAgICBjaGFyICpidWYsIGludCBsZW4pCi17Ci0JY2hhciBzdHJpbmdbMTAyNF07Ci0JcGlkX3QgcGlkOwotCWludCBieXRlcyA9IDA7Ci0JdV9pbnQgaTsKLQl1X2NoYXIgY2g7Ci0JY2hhciAqczsKLQlpbnQgKmVzY2FwZV9wZW5kaW5ncCwgZXNjYXBlX2NoYXI7Ci0Jc3RydWN0IGVzY2FwZV9maWx0ZXJfY3R4ICplZmM7Ci0KLQlpZiAoYyA9PSBOVUxMKSB7Ci0JCWVzY2FwZV9wZW5kaW5ncCA9ICZlc2NhcGVfcGVuZGluZzE7Ci0JCWVzY2FwZV9jaGFyID0gZXNjYXBlX2NoYXIxOwotCX0gZWxzZSB7Ci0JCWlmIChjLT5maWx0ZXJfY3R4ID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQkJZWZjID0gKHN0cnVjdCBlc2NhcGVfZmlsdGVyX2N0eCAqKWMtPmZpbHRlcl9jdHg7Ci0JCWVzY2FwZV9wZW5kaW5ncCA9ICZlZmMtPmVzY2FwZV9wZW5kaW5nOwotCQllc2NhcGVfY2hhciA9IGVmYy0+ZXNjYXBlX2NoYXI7Ci0JfQotCQotCWlmIChsZW4gPD0gMCkKLQkJcmV0dXJuICgwKTsKLQotCWZvciAoaSA9IDA7IGkgPCAodV9pbnQpbGVuOyBpKyspIHsKLQkJLyogR2V0IG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLiAqLwotCQljaCA9IGJ1ZltpXTsKLQotCQlpZiAoKmVzY2FwZV9wZW5kaW5ncCkgewotCQkJLyogV2UgaGF2ZSBwcmV2aW91c2x5IHNlZW4gYW4gZXNjYXBlIGNoYXJhY3Rlci4gKi8KLQkJCS8qIENsZWFyIHRoZSBmbGFnIG5vdy4gKi8KLQkJCSplc2NhcGVfcGVuZGluZ3AgPSAwOwotCi0JCQkvKiBQcm9jZXNzIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4gKi8KLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJy4nOgotCQkJCS8qIFRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbi4gKi8KLQkJCQlzbnByaW50ZihzdHJpbmcsIHNpemVvZiBzdHJpbmcsICIlYy5cclxuIiwKLQkJCQkgICAgZXNjYXBlX2NoYXIpOwotCQkJCWJ1ZmZlcl9hcHBlbmQoYmVyciwgc3RyaW5nLCBzdHJsZW4oc3RyaW5nKSk7Ci0KLQkJCQlpZiAoYyAmJiBjLT5jdGxfY2hhbiAhPSAtMSkgewotCQkJCQljaGFuX3JlYWRfZmFpbGVkKGMpOwotCQkJCQljaGFuX3dyaXRlX2ZhaWxlZChjKTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfSBlbHNlCi0JCQkJCXF1aXRfcGVuZGluZyA9IDE7Ci0JCQkJcmV0dXJuIC0xOwotCi0JCQljYXNlICdaJyAtIDY0OgotCQkJCS8qIFhYWCBzdXBwb3J0IHRoaXMgZm9yIG11eCBjbGllbnRzICovCi0JCQkJaWYgKGMgJiYgYy0+Y3RsX2NoYW4gIT0gLTEpIHsKLSBub2VzY2FwZToKLQkJCQkJc25wcmludGYoc3RyaW5nLCBzaXplb2Ygc3RyaW5nLAotCQkJCQkgICAgIiVjJWMgZXNjYXBlIG5vdCBhdmFpbGFibGUgdG8gIgotCQkJCQkgICAgIm11bHRpcGxleGVkIHNlc3Npb25zXHJcbiIsCi0JCQkJCSAgICBlc2NhcGVfY2hhciwgY2gpOwotCQkJCQlidWZmZXJfYXBwZW5kKGJlcnIsIHN0cmluZywKLQkJCQkJICAgIHN0cmxlbihzdHJpbmcpKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8qIFN1c3BlbmQgdGhlIHByb2dyYW0uIEluZm9ybSB0aGUgdXNlciAqLwotCQkJCXNucHJpbnRmKHN0cmluZywgc2l6ZW9mIHN0cmluZywKLQkJCQkgICAgIiVjXlogW3N1c3BlbmQgc3NoXVxyXG4iLCBlc2NhcGVfY2hhcik7Ci0JCQkJYnVmZmVyX2FwcGVuZChiZXJyLCBzdHJpbmcsIHN0cmxlbihzdHJpbmcpKTsKLQotCQkJCS8qIFJlc3RvcmUgdGVybWluYWwgbW9kZXMgYW5kIHN1c3BlbmQuICovCi0JCQkJY2xpZW50X3N1c3BlbmRfc2VsZihiaW4sIGJvdXQsIGJlcnIpOwotCi0JCQkJLyogV2UgaGF2ZSBiZWVuIGNvbnRpbnVlZC4gKi8KLQkJCQljb250aW51ZTsKLQotCQkJY2FzZSAnQic6Ci0JCQkJaWYgKGNvbXBhdDIwKSB7Ci0JCQkJCXNucHJpbnRmKHN0cmluZywgc2l6ZW9mIHN0cmluZywKLQkJCQkJICAgICIlY0JcclxuIiwgZXNjYXBlX2NoYXIpOwotCQkJCQlidWZmZXJfYXBwZW5kKGJlcnIsIHN0cmluZywKLQkJCQkJICAgIHN0cmxlbihzdHJpbmcpKTsKLQkJCQkJY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0KHNlc3Npb25faWRlbnQsCi0JCQkJCSAgICAiYnJlYWsiLCAwKTsKLQkJCQkJcGFja2V0X3B1dF9pbnQoMTAwMCk7Ci0JCQkJCXBhY2tldF9zZW5kKCk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCi0JCQljYXNlICdSJzoKLQkJCQlpZiAoY29tcGF0MjApIHsKLQkJCQkJaWYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19OT1JFS0VZKQotCQkJCQkJbG9naXQoIlNlcnZlciBkb2VzIG5vdCAiCi0JCQkJCQkgICAgInN1cHBvcnQgcmUta2V5aW5nIik7Ci0JCQkJCWVsc2UKLQkJCQkJCW5lZWRfcmVrZXlpbmcgPSAxOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQotCQkJY2FzZSAnJic6Ci0JCQkJaWYgKGMgJiYgYy0+Y3RsX2NoYW4gIT0gLTEpCi0JCQkJCWdvdG8gbm9lc2NhcGU7Ci0JCQkJLyoKLQkJCQkgKiBEZXRhY2ggdGhlIHByb2dyYW0gKGNvbnRpbnVlIHRvIHNlcnZlCi0JCQkJICogY29ubmVjdGlvbnMsIGJ1dCBwdXQgaW4gYmFja2dyb3VuZCBhbmQgbm8KLQkJCQkgKiBtb3JlIG5ldyBjb25uZWN0aW9ucykuCi0JCQkJICovCi0JCQkJLyogUmVzdG9yZSB0dHkgbW9kZXMuICovCi0JCQkJbGVhdmVfcmF3X21vZGUoCi0JCQkJICAgIG9wdGlvbnMucmVxdWVzdF90dHkgPT0gUkVRVUVTVF9UVFlfRk9SQ0UpOwotCi0JCQkJLyogU3RvcCBsaXN0ZW5pbmcgZm9yIG5ldyBjb25uZWN0aW9ucy4gKi8KLQkJCQljaGFubmVsX3N0b3BfbGlzdGVuaW5nKCk7Ci0KLQkJCQlzbnByaW50ZihzdHJpbmcsIHNpemVvZiBzdHJpbmcsCi0JCQkJICAgICIlYyYgW2JhY2tncm91bmRlZF1cbiIsIGVzY2FwZV9jaGFyKTsKLQkJCQlidWZmZXJfYXBwZW5kKGJlcnIsIHN0cmluZywgc3RybGVuKHN0cmluZykpOwotCi0JCQkJLyogRm9yayBpbnRvIGJhY2tncm91bmQuICovCi0JCQkJcGlkID0gZm9yaygpOwotCQkJCWlmIChwaWQgPCAwKSB7Ci0JCQkJCWVycm9yKCJmb3JrOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHBpZCAhPSAwKSB7CS8qIFRoaXMgaXMgdGhlIHBhcmVudC4gKi8KLQkJCQkJLyogVGhlIHBhcmVudCBqdXN0IGV4aXRzLiAqLwotCQkJCQlleGl0KDApOwotCQkJCX0KLQkJCQkvKiBUaGUgY2hpbGQgY29udGludWVzIHNlcnZpbmcgY29ubmVjdGlvbnMuICovCi0JCQkJaWYgKGNvbXBhdDIwKSB7Ci0JCQkJCWJ1ZmZlcl9hcHBlbmQoYmluLCAiXDAwNCIsIDEpOwotCQkJCQkvKiBmYWtlIEVPRiBvbiBzdGRpbiAqLwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfSBlbHNlIGlmICghc3RkaW5fZW9mKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFNlbmRpbmcgU1NIX0NNU0dfRU9GIGFsb25lIGRvZXMgbm90Ci0JCQkJCSAqIGFsd2F5cyBhcHBlYXIgdG8gYmUgZW5vdWdoLiAgU28gd2UKLQkJCQkJICogdHJ5IHRvIHNlbmQgYW4gRU9GIGNoYXJhY3RlciBmaXJzdC4KLQkJCQkJICovCi0JCQkJCXBhY2tldF9zdGFydChTU0hfQ01TR19TVERJTl9EQVRBKTsKLQkJCQkJcGFja2V0X3B1dF9zdHJpbmcoIlwwMDQiLCAxKTsKLQkJCQkJcGFja2V0X3NlbmQoKTsKLQkJCQkJLyogQ2xvc2Ugc3RkaW4uICovCi0JCQkJCXN0ZGluX2VvZiA9IDE7Ci0JCQkJCWlmIChidWZmZXJfbGVuKGJpbikgPT0gMCkgewotCQkJCQkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0VPRik7Ci0JCQkJCQlwYWNrZXRfc2VuZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCi0JCQljYXNlICc/JzoKLQkJCQlpZiAoYyAmJiBjLT5jdGxfY2hhbiAhPSAtMSkgewotCQkJCQlzbnByaW50ZihzdHJpbmcsIHNpemVvZiBzdHJpbmcsCi0iJWM/XHJcblwKLVN1cHBvcnRlZCBlc2NhcGUgc2VxdWVuY2VzOlxyXG5cCi0gICVjLiAgLSB0ZXJtaW5hdGUgc2Vzc2lvblxyXG5cCi0gICVjQiAgLSBzZW5kIGEgQlJFQUsgdG8gdGhlIHJlbW90ZSBzeXN0ZW1cclxuXAotICAlY1IgIC0gUmVxdWVzdCByZWtleSAoU1NIIHByb3RvY29sIDIgb25seSlcclxuXAotICAlYyMgIC0gbGlzdCBmb3J3YXJkZWQgY29ubmVjdGlvbnNcclxuXAotICAlYz8gIC0gdGhpcyBtZXNzYWdlXHJcblwKLSAgJWMlYyAgLSBzZW5kIHRoZSBlc2NhcGUgY2hhcmFjdGVyIGJ5IHR5cGluZyBpdCB0d2ljZVxyXG5cCi0oTm90ZSB0aGF0IGVzY2FwZXMgYXJlIG9ubHkgcmVjb2duaXplZCBpbW1lZGlhdGVseSBhZnRlciBuZXdsaW5lLilcclxuIiwKLQkJCQkJICAgIGVzY2FwZV9jaGFyLCBlc2NhcGVfY2hhciwKLQkJCQkJICAgIGVzY2FwZV9jaGFyLCBlc2NhcGVfY2hhciwKLQkJCQkJICAgIGVzY2FwZV9jaGFyLCBlc2NhcGVfY2hhciwKLQkJCQkJICAgIGVzY2FwZV9jaGFyLCBlc2NhcGVfY2hhcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc25wcmludGYoc3RyaW5nLCBzaXplb2Ygc3RyaW5nLAotIiVjP1xyXG5cCi1TdXBwb3J0ZWQgZXNjYXBlIHNlcXVlbmNlczpcclxuXAotICAlYy4gIC0gdGVybWluYXRlIGNvbm5lY3Rpb24gKGFuZCBhbnkgbXVsdGlwbGV4ZWQgc2Vzc2lvbnMpXHJcblwKLSAgJWNCICAtIHNlbmQgYSBCUkVBSyB0byB0aGUgcmVtb3RlIHN5c3RlbVxyXG5cCi0gICVjQyAgLSBvcGVuIGEgY29tbWFuZCBsaW5lXHJcblwKLSAgJWNSICAtIFJlcXVlc3QgcmVrZXkgKFNTSCBwcm90b2NvbCAyIG9ubHkpXHJcblwKLSAgJWNeWiAtIHN1c3BlbmQgc3NoXHJcblwKLSAgJWMjICAtIGxpc3QgZm9yd2FyZGVkIGNvbm5lY3Rpb25zXHJcblwKLSAgJWMmICAtIGJhY2tncm91bmQgc3NoICh3aGVuIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb25zIHRvIHRlcm1pbmF0ZSlcclxuXAotICAlYz8gIC0gdGhpcyBtZXNzYWdlXHJcblwKLSAgJWMlYyAgLSBzZW5kIHRoZSBlc2NhcGUgY2hhcmFjdGVyIGJ5IHR5cGluZyBpdCB0d2ljZVxyXG5cCi0oTm90ZSB0aGF0IGVzY2FwZXMgYXJlIG9ubHkgcmVjb2duaXplZCBpbW1lZGlhdGVseSBhZnRlciBuZXdsaW5lLilcclxuIiwKLQkJCQkJICAgIGVzY2FwZV9jaGFyLCBlc2NhcGVfY2hhciwKLQkJCQkJICAgIGVzY2FwZV9jaGFyLCBlc2NhcGVfY2hhciwKLQkJCQkJICAgIGVzY2FwZV9jaGFyLCBlc2NhcGVfY2hhciwKLQkJCQkJICAgIGVzY2FwZV9jaGFyLCBlc2NhcGVfY2hhciwKLQkJCQkJICAgIGVzY2FwZV9jaGFyLCBlc2NhcGVfY2hhciwKLQkJCQkJICAgIGVzY2FwZV9jaGFyKTsKLQkJCQl9Ci0JCQkJYnVmZmVyX2FwcGVuZChiZXJyLCBzdHJpbmcsIHN0cmxlbihzdHJpbmcpKTsKLQkJCQljb250aW51ZTsKLQotCQkJY2FzZSAnIyc6Ci0JCQkJc25wcmludGYoc3RyaW5nLCBzaXplb2Ygc3RyaW5nLCAiJWMjXHJcbiIsCi0JCQkJICAgIGVzY2FwZV9jaGFyKTsKLQkJCQlidWZmZXJfYXBwZW5kKGJlcnIsIHN0cmluZywgc3RybGVuKHN0cmluZykpOwotCQkJCXMgPSBjaGFubmVsX29wZW5fbWVzc2FnZSgpOwotCQkJCWJ1ZmZlcl9hcHBlbmQoYmVyciwgcywgc3RybGVuKHMpKTsKLQkJCQl4ZnJlZShzKTsKLQkJCQljb250aW51ZTsKLQotCQkJY2FzZSAnQyc6Ci0JCQkJaWYgKGMgJiYgYy0+Y3RsX2NoYW4gIT0gLTEpCi0JCQkJCWdvdG8gbm9lc2NhcGU7Ci0JCQkJcHJvY2Vzc19jbWRsaW5lKCk7Ci0JCQkJY29udGludWU7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKGNoICE9IGVzY2FwZV9jaGFyKSB7Ci0JCQkJCWJ1ZmZlcl9wdXRfY2hhcihiaW4sIGVzY2FwZV9jaGFyKTsKLQkJCQkJYnl0ZXMrKzsKLQkJCQl9Ci0JCQkJLyogRXNjYXBlZCBjaGFyYWN0ZXJzIGZhbGwgdGhyb3VnaCBoZXJlICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogVGhlIHByZXZpb3VzIGNoYXJhY3RlciB3YXMgbm90IGFuIGVzY2FwZSBjaGFyLgotCQkJICogQ2hlY2sgaWYgdGhpcyBpcyBhbiBlc2NhcGUuCi0JCQkgKi8KLQkJCWlmIChsYXN0X3dhc19jciAmJiBjaCA9PSBlc2NhcGVfY2hhcikgewotCQkJCS8qCi0JCQkJICogSXQgaXMuIFNldCB0aGUgZmxhZyBhbmQgY29udGludWUgdG8KLQkJCQkgKiBuZXh0IGNoYXJhY3Rlci4KLQkJCQkgKi8KLQkJCQkqZXNjYXBlX3BlbmRpbmdwID0gMTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIE5vcm1hbCBjaGFyYWN0ZXIuICBSZWNvcmQgd2hldGhlciBpdCB3YXMgYSBuZXdsaW5lLAotCQkgKiBhbmQgYXBwZW5kIGl0IHRvIHRoZSBidWZmZXIuCi0JCSAqLwotCQlsYXN0X3dhc19jciA9IChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpOwotCQlidWZmZXJfcHV0X2NoYXIoYmluLCBjaCk7Ci0JCWJ5dGVzKys7Ci0JfQotCXJldHVybiBieXRlczsKLX0KLQotc3RhdGljIHZvaWQKLWNsaWVudF9wcm9jZXNzX2lucHV0KGZkX3NldCAqcmVhZHNldCkKLXsKLQlpbnQgbGVuOwotCWNoYXIgYnVmW1NTSF9JT0JVRlNaXTsKLQotCS8qIFJlYWQgaW5wdXQgZnJvbSBzdGRpbi4gKi8KLQlpZiAoRkRfSVNTRVQoZmlsZW5vKHN0ZGluKSwgcmVhZHNldCkpIHsKLQkJLyogUmVhZCBhcyBtdWNoIGFzIHBvc3NpYmxlLiAqLwotCQlsZW4gPSByZWFkKGZpbGVubyhzdGRpbiksIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCQlpZiAobGVuIDwgMCAmJgotCQkgICAgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykpCi0JCQlyZXR1cm47CQkvKiB3ZSdsbCB0cnkgYWdhaW4gbGF0ZXIgKi8KLQkJaWYgKGxlbiA8PSAwKSB7Ci0JCQkvKgotCQkJICogUmVjZWl2ZWQgRU9GIG9yIGVycm9yLiAgVGhleSBhcmUgdHJlYXRlZAotCQkJICogc2ltaWxhcmx5LCBleGNlcHQgdGhhdCBhbiBlcnJvciBtZXNzYWdlIGlzIHByaW50ZWQKLQkJCSAqIGlmIGl0IHdhcyBhbiBlcnJvciBjb25kaXRpb24uCi0JCQkgKi8KLQkJCWlmIChsZW4gPCAwKSB7Ci0JCQkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAicmVhZDogJS4xMDBzXHJcbiIsCi0JCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCQkJYnVmZmVyX2FwcGVuZCgmc3RkZXJyX2J1ZmZlciwgYnVmLCBzdHJsZW4oYnVmKSk7Ci0JCQl9Ci0JCQkvKiBNYXJrIHRoYXQgd2UgaGF2ZSBzZWVuIEVPRi4gKi8KLQkJCXN0ZGluX2VvZiA9IDE7Ci0JCQkvKgotCQkJICogU2VuZCBhbiBFT0YgbWVzc2FnZSB0byB0aGUgc2VydmVyIHVubGVzcyB0aGVyZSBpcwotCQkJICogZGF0YSBpbiB0aGUgYnVmZmVyLiAgSWYgdGhlcmUgaXMgZGF0YSBpbiB0aGUKLQkJCSAqIGJ1ZmZlciwgbm8gbWVzc2FnZSB3aWxsIGJlIHNlbnQgbm93LiAgQ29kZQotCQkJICogZWxzZXdoZXJlIHdpbGwgc2VuZCB0aGUgRU9GIHdoZW4gdGhlIGJ1ZmZlcgotCQkJICogYmVjb21lcyBlbXB0eSBpZiBzdGRpbl9lb2YgaXMgc2V0LgotCQkJICovCi0JCQlpZiAoYnVmZmVyX2xlbigmc3RkaW5fYnVmZmVyKSA9PSAwKSB7Ci0JCQkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0VPRik7Ci0JCQkJcGFja2V0X3NlbmQoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlc2NhcGVfY2hhcjEgPT0gU1NIX0VTQ0FQRUNIQVJfTk9ORSkgewotCQkJLyoKLQkJCSAqIE5vcm1hbCBzdWNjZXNzZnVsIHJlYWQsIGFuZCBubyBlc2NhcGUgY2hhcmFjdGVyLgotCQkJICogSnVzdCBhcHBlbmQgdGhlIGRhdGEgdG8gYnVmZmVyLgotCQkJICovCi0JCQlidWZmZXJfYXBwZW5kKCZzdGRpbl9idWZmZXIsIGJ1ZiwgbGVuKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBOb3JtYWwsIHN1Y2Nlc3NmdWwgcmVhZC4gIEJ1dCB3ZSBoYXZlIGFuIGVzY2FwZQotCQkJICogY2hhcmFjdGVyIGFuZCBoYXZlIHRvIHByb2Nlc3MgdGhlIGNoYXJhY3RlcnMgb25lCi0JCQkgKiBieSBvbmUuCi0JCQkgKi8KLQkJCWlmIChwcm9jZXNzX2VzY2FwZXMoTlVMTCwgJnN0ZGluX2J1ZmZlciwKLQkJCSAgICAmc3Rkb3V0X2J1ZmZlciwgJnN0ZGVycl9idWZmZXIsIGJ1ZiwgbGVuKSA9PSAtMSkKLQkJCQlyZXR1cm47Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jbGllbnRfcHJvY2Vzc19vdXRwdXQoZmRfc2V0ICp3cml0ZXNldCkKLXsKLQlpbnQgbGVuOwotCWNoYXIgYnVmWzEwMF07Ci0KLQkvKiBXcml0ZSBidWZmZXJlZCBvdXRwdXQgdG8gc3Rkb3V0LiAqLwotCWlmIChGRF9JU1NFVChmaWxlbm8oc3Rkb3V0KSwgd3JpdGVzZXQpKSB7Ci0JCS8qIFdyaXRlIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZS4gKi8KLQkJbGVuID0gd3JpdGUoZmlsZW5vKHN0ZG91dCksIGJ1ZmZlcl9wdHIoJnN0ZG91dF9idWZmZXIpLAotCQkgICAgYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcikpOwotCQlpZiAobGVuIDw9IDApIHsKLQkJCWlmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4gfHwKLQkJCSAgICBlcnJubyA9PSBFV09VTERCTE9DSykKLQkJCQlsZW4gPSAwOwotCQkJZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBBbiBlcnJvciBvciBFT0Ygd2FzIGVuY291bnRlcmVkLiAgUHV0IGFuCi0JCQkJICogZXJyb3IgbWVzc2FnZSB0byBzdGRlcnIgYnVmZmVyLgotCQkJCSAqLwotCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwKLQkJCQkgICAgIndyaXRlIHN0ZG91dDogJS41MHNcclxuIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQlidWZmZXJfYXBwZW5kKCZzdGRlcnJfYnVmZmVyLCBidWYsIHN0cmxlbihidWYpKTsKLQkJCQlxdWl0X3BlbmRpbmcgPSAxOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvKiBDb25zdW1lIHByaW50ZWQgZGF0YSBmcm9tIHRoZSBidWZmZXIuICovCi0JCWJ1ZmZlcl9jb25zdW1lKCZzdGRvdXRfYnVmZmVyLCBsZW4pOwotCX0KLQkvKiBXcml0ZSBidWZmZXJlZCBvdXRwdXQgdG8gc3RkZXJyLiAqLwotCWlmIChGRF9JU1NFVChmaWxlbm8oc3RkZXJyKSwgd3JpdGVzZXQpKSB7Ci0JCS8qIFdyaXRlIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZS4gKi8KLQkJbGVuID0gd3JpdGUoZmlsZW5vKHN0ZGVyciksIGJ1ZmZlcl9wdHIoJnN0ZGVycl9idWZmZXIpLAotCQkgICAgYnVmZmVyX2xlbigmc3RkZXJyX2J1ZmZlcikpOwotCQlpZiAobGVuIDw9IDApIHsKLQkJCWlmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4gfHwKLQkJCSAgICBlcnJubyA9PSBFV09VTERCTE9DSykKLQkJCQlsZW4gPSAwOwotCQkJZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBFT0Ygb3IgZXJyb3IsIGJ1dCBjYW4ndCBldmVuIHByaW50Ci0JCQkJICogZXJyb3IgbWVzc2FnZS4KLQkJCQkgKi8KLQkJCQlxdWl0X3BlbmRpbmcgPSAxOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvKiBDb25zdW1lIHByaW50ZWQgY2hhcmFjdGVycyBmcm9tIHRoZSBidWZmZXIuICovCi0JCWJ1ZmZlcl9jb25zdW1lKCZzdGRlcnJfYnVmZmVyLCBsZW4pOwotCX0KLX0KLQotLyoKLSAqIEdldCBwYWNrZXRzIGZyb20gdGhlIGNvbm5lY3Rpb24gaW5wdXQgYnVmZmVyLCBhbmQgcHJvY2VzcyB0aGVtIGFzIGxvbmcgYXMKLSAqIHRoZXJlIGFyZSBwYWNrZXRzIGF2YWlsYWJsZS4KLSAqCi0gKiBBbnkgdW5rbm93biBwYWNrZXRzIHJlY2VpdmVkIGR1cmluZyB0aGUgYWN0dWFsCi0gKiBzZXNzaW9uIGNhdXNlIHRoZSBzZXNzaW9uIHRvIHRlcm1pbmF0ZS4gIFRoaXMgaXMKLSAqIGludGVuZGVkIHRvIG1ha2UgZGVidWdnaW5nIGVhc2llciBzaW5jZSBubwotICogY29uZmlybWF0aW9ucyBhcmUgc2VudC4gIEFueSBjb21wYXRpYmxlIHByb3RvY29sCi0gKiBleHRlbnNpb25zIG11c3QgYmUgbmVnb3RpYXRlZCBkdXJpbmcgdGhlCi0gKiBwcmVwYXJhdG9yeSBwaGFzZS4KLSAqLwotCi1zdGF0aWMgdm9pZAotY2xpZW50X3Byb2Nlc3NfYnVmZmVyZWRfaW5wdXRfcGFja2V0cyh2b2lkKQotewotCWRpc3BhdGNoX3J1bihESVNQQVRDSF9OT05CTE9DSywgJnF1aXRfcGVuZGluZywKLQkgICAgY29tcGF0MjAgPyB4eHhfa2V4IDogTlVMTCk7Ci19Ci0KLS8qIHNjYW4gYnVmW10gZm9yICd+JyBiZWZvcmUgc2VuZGluZyBkYXRhIHRvIHRoZSBwZWVyICovCi0KLS8qIEhlbHBlcjogYWxsb2NhdGUgYSBuZXcgZXNjYXBlX2ZpbHRlcl9jdHggYW5kIGZpbGwgaW4gaXRzIGVzY2FwZSBjaGFyICovCi12b2lkICoKLWNsaWVudF9uZXdfZXNjYXBlX2ZpbHRlcl9jdHgoaW50IGVzY2FwZV9jaGFyKQotewotCXN0cnVjdCBlc2NhcGVfZmlsdGVyX2N0eCAqcmV0OwotCi0JcmV0ID0geG1hbGxvYyhzaXplb2YoKnJldCkpOwotCXJldC0+ZXNjYXBlX3BlbmRpbmcgPSAwOwotCXJldC0+ZXNjYXBlX2NoYXIgPSBlc2NhcGVfY2hhcjsKLQlyZXR1cm4gKHZvaWQgKilyZXQ7Ci19Ci0KLS8qIEZyZWUgdGhlIGVzY2FwZSBmaWx0ZXIgY29udGV4dCBvbiBjaGFubmVsIGZyZWUgKi8KLXZvaWQKLWNsaWVudF9maWx0ZXJfY2xlYW51cChpbnQgY2lkLCB2b2lkICpjdHgpCi17Ci0JeGZyZWUoY3R4KTsKLX0KLQotaW50Ci1jbGllbnRfc2ltcGxlX2VzY2FwZV9maWx0ZXIoQ2hhbm5lbCAqYywgY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWlmIChjLT5leHRlbmRlZF91c2FnZSAhPSBDSEFOX0VYVEVOREVEX1dSSVRFKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBwcm9jZXNzX2VzY2FwZXMoYywgJmMtPmlucHV0LCAmYy0+b3V0cHV0LCAmYy0+ZXh0ZW5kZWQsCi0JICAgIGJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIHZvaWQKLWNsaWVudF9jaGFubmVsX2Nsb3NlZChpbnQgaWQsIHZvaWQgKmFyZykKLXsKLQljaGFubmVsX2NhbmNlbF9jbGVhbnVwKGlkKTsKLQlzZXNzaW9uX2Nsb3NlZCA9IDE7Ci0JbGVhdmVfcmF3X21vZGUob3B0aW9ucy5yZXF1ZXN0X3R0eSA9PSBSRVFVRVNUX1RUWV9GT1JDRSk7Ci19Ci0KLS8qCi0gKiBJbXBsZW1lbnRzIHRoZSBpbnRlcmFjdGl2ZSBzZXNzaW9uIHdpdGggdGhlIHNlcnZlci4gIFRoaXMgaXMgY2FsbGVkIGFmdGVyCi0gKiB0aGUgdXNlciBoYXMgYmVlbiBhdXRoZW50aWNhdGVkLCBhbmQgYSBjb21tYW5kIGhhcyBiZWVuIHN0YXJ0ZWQgb24gdGhlCi0gKiByZW1vdGUgaG9zdC4gIElmIGVzY2FwZV9jaGFyICE9IFNTSF9FU0NBUEVDSEFSX05PTkUsIGl0IGlzIHRoZSBjaGFyYWN0ZXIKLSAqIHVzZWQgYXMgYW4gZXNjYXBlIGNoYXJhY3RlciBmb3IgdGVybWluYXRpbmcgb3Igc3VzcGVuZGluZyB0aGUgc2Vzc2lvbi4KLSAqLwotCi1pbnQKLWNsaWVudF9sb29wKGludCBoYXZlX3B0eSwgaW50IGVzY2FwZV9jaGFyX2FyZywgaW50IHNzaDJfY2hhbl9pZCkKLXsKLQlmZF9zZXQgKnJlYWRzZXQgPSBOVUxMLCAqd3JpdGVzZXQgPSBOVUxMOwotCWRvdWJsZSBzdGFydF90aW1lLCB0b3RhbF90aW1lOwotCWludCBtYXhfZmQgPSAwLCBtYXhfZmQyID0gMCwgbGVuLCByZWtleWluZyA9IDA7Ci0JdV9pbnQ2NF90IGlieXRlcywgb2J5dGVzOwotCXVfaW50IG5hbGxvYyA9IDA7Ci0JY2hhciBidWZbMTAwXTsKLQotCWRlYnVnKCJFbnRlcmluZyBpbnRlcmFjdGl2ZSBzZXNzaW9uLiIpOwotCi0Jc3RhcnRfdGltZSA9IGdldF9jdXJyZW50X3RpbWUoKTsKLQotCS8qIEluaXRpYWxpemUgdmFyaWFibGVzLiAqLwotCWVzY2FwZV9wZW5kaW5nMSA9IDA7Ci0JbGFzdF93YXNfY3IgPSAxOwotCWV4aXRfc3RhdHVzID0gLTE7Ci0Jc3RkaW5fZW9mID0gMDsKLQlidWZmZXJfaGlnaCA9IDY0ICogMTAyNDsKLQljb25uZWN0aW9uX2luID0gcGFja2V0X2dldF9jb25uZWN0aW9uX2luKCk7Ci0JY29ubmVjdGlvbl9vdXQgPSBwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25fb3V0KCk7Ci0JbWF4X2ZkID0gTUFYKGNvbm5lY3Rpb25faW4sIGNvbm5lY3Rpb25fb3V0KTsKLQotCWlmICghY29tcGF0MjApIHsKLQkJLyogZW5hYmxlIG5vbmJsb2NraW5nIHVubGVzcyB0dHkgKi8KLQkJaWYgKCFpc2F0dHkoZmlsZW5vKHN0ZGluKSkpCi0JCQlzZXRfbm9uYmxvY2soZmlsZW5vKHN0ZGluKSk7Ci0JCWlmICghaXNhdHR5KGZpbGVubyhzdGRvdXQpKSkKLQkJCXNldF9ub25ibG9jayhmaWxlbm8oc3Rkb3V0KSk7Ci0JCWlmICghaXNhdHR5KGZpbGVubyhzdGRlcnIpKSkKLQkJCXNldF9ub25ibG9jayhmaWxlbm8oc3RkZXJyKSk7Ci0JCW1heF9mZCA9IE1BWChtYXhfZmQsIGZpbGVubyhzdGRpbikpOwotCQltYXhfZmQgPSBNQVgobWF4X2ZkLCBmaWxlbm8oc3Rkb3V0KSk7Ci0JCW1heF9mZCA9IE1BWChtYXhfZmQsIGZpbGVubyhzdGRlcnIpKTsKLQl9Ci0JcXVpdF9wZW5kaW5nID0gMDsKLQllc2NhcGVfY2hhcjEgPSBlc2NhcGVfY2hhcl9hcmc7Ci0KLQkvKiBJbml0aWFsaXplIGJ1ZmZlcnMuICovCi0JYnVmZmVyX2luaXQoJnN0ZGluX2J1ZmZlcik7Ci0JYnVmZmVyX2luaXQoJnN0ZG91dF9idWZmZXIpOwotCWJ1ZmZlcl9pbml0KCZzdGRlcnJfYnVmZmVyKTsKLQotCWNsaWVudF9pbml0X2Rpc3BhdGNoKCk7Ci0KLQkvKgotCSAqIFNldCBzaWduYWwgaGFuZGxlcnMsIChlLmcuIHRvIHJlc3RvcmUgbm9uLWJsb2NraW5nIG1vZGUpCi0JICogYnV0IGRvbid0IG92ZXJ3cml0ZSBTSUdfSUdOLCBtYXRjaGVzIGJlaGF2aW91ciBmcm9tIHJzaCgxKQotCSAqLwotCWlmIChzaWduYWwoU0lHSFVQLCBTSUdfSUdOKSAhPSBTSUdfSUdOKQotCQlzaWduYWwoU0lHSFVQLCBzaWduYWxfaGFuZGxlcik7Ci0JaWYgKHNpZ25hbChTSUdJTlQsIFNJR19JR04pICE9IFNJR19JR04pCi0JCXNpZ25hbChTSUdJTlQsIHNpZ25hbF9oYW5kbGVyKTsKLQlpZiAoc2lnbmFsKFNJR1FVSVQsIFNJR19JR04pICE9IFNJR19JR04pCi0JCXNpZ25hbChTSUdRVUlULCBzaWduYWxfaGFuZGxlcik7Ci0JaWYgKHNpZ25hbChTSUdURVJNLCBTSUdfSUdOKSAhPSBTSUdfSUdOKQotCQlzaWduYWwoU0lHVEVSTSwgc2lnbmFsX2hhbmRsZXIpOwotCXNpZ25hbChTSUdXSU5DSCwgd2luZG93X2NoYW5nZV9oYW5kbGVyKTsKLQotCWlmIChoYXZlX3B0eSkKLQkJZW50ZXJfcmF3X21vZGUob3B0aW9ucy5yZXF1ZXN0X3R0eSA9PSBSRVFVRVNUX1RUWV9GT1JDRSk7Ci0KLQlpZiAoY29tcGF0MjApIHsKLQkJc2Vzc2lvbl9pZGVudCA9IHNzaDJfY2hhbl9pZDsKLQkJaWYgKHNlc3Npb25faWRlbnQgIT0gLTEpIHsKLQkJCWlmIChlc2NhcGVfY2hhcl9hcmcgIT0gU1NIX0VTQ0FQRUNIQVJfTk9ORSkgewotCQkJCWNoYW5uZWxfcmVnaXN0ZXJfZmlsdGVyKHNlc3Npb25faWRlbnQsCi0JCQkJICAgIGNsaWVudF9zaW1wbGVfZXNjYXBlX2ZpbHRlciwgTlVMTCwKLQkJCQkgICAgY2xpZW50X2ZpbHRlcl9jbGVhbnVwLAotCQkJCSAgICBjbGllbnRfbmV3X2VzY2FwZV9maWx0ZXJfY3R4KAotCQkJCSAgICBlc2NhcGVfY2hhcl9hcmcpKTsKLQkJCX0KLQkJCWNoYW5uZWxfcmVnaXN0ZXJfY2xlYW51cChzZXNzaW9uX2lkZW50LAotCQkJICAgIGNsaWVudF9jaGFubmVsX2Nsb3NlZCwgMCk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBDaGVjayBpZiB3ZSBzaG91bGQgaW1tZWRpYXRlbHkgc2VuZCBlb2Ygb24gc3RkaW4uICovCi0JCWNsaWVudF9jaGVja19pbml0aWFsX2VvZl9vbl9zdGRpbigpOwotCX0KLQotCS8qIE1haW4gbG9vcCBvZiB0aGUgY2xpZW50IGZvciB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbiBtb2RlLiAqLwotCXdoaWxlICghcXVpdF9wZW5kaW5nKSB7Ci0KLQkJLyogUHJvY2VzcyBidWZmZXJlZCBwYWNrZXRzIHNlbnQgYnkgdGhlIHNlcnZlci4gKi8KLQkJY2xpZW50X3Byb2Nlc3NfYnVmZmVyZWRfaW5wdXRfcGFja2V0cygpOwotCi0JCWlmIChjb21wYXQyMCAmJiBzZXNzaW9uX2Nsb3NlZCAmJiAhY2hhbm5lbF9zdGlsbF9vcGVuKCkpCi0JCQlicmVhazsKLQotCQlyZWtleWluZyA9ICh4eHhfa2V4ICE9IE5VTEwgJiYgIXh4eF9rZXgtPmRvbmUpOwotCi0JCWlmIChyZWtleWluZykgewotCQkJZGVidWcoInJla2V5aW5nIGluIHByb2dyZXNzIik7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogTWFrZSBwYWNrZXRzIG9mIGJ1ZmZlcmVkIHN0ZGluIGRhdGEsIGFuZCBidWZmZXIKLQkJCSAqIHRoZW0gZm9yIHNlbmRpbmcgdG8gdGhlIHNlcnZlci4KLQkJCSAqLwotCQkJaWYgKCFjb21wYXQyMCkKLQkJCQljbGllbnRfbWFrZV9wYWNrZXRzX2Zyb21fc3RkaW5fZGF0YSgpOwotCi0JCQkvKgotCQkJICogTWFrZSBwYWNrZXRzIGZyb20gYnVmZmVyZWQgY2hhbm5lbCBkYXRhLCBhbmQKLQkJCSAqIGVucXVldWUgdGhlbSBmb3Igc2VuZGluZyB0byB0aGUgc2VydmVyLgotCQkJICovCi0JCQlpZiAocGFja2V0X25vdF92ZXJ5X211Y2hfZGF0YV90b193cml0ZSgpKQotCQkJCWNoYW5uZWxfb3V0cHV0X3BvbGwoKTsKLQotCQkJLyoKLQkJCSAqIENoZWNrIGlmIHRoZSB3aW5kb3cgc2l6ZSBoYXMgY2hhbmdlZCwgYW5kIGJ1ZmZlciBhCi0JCQkgKiBtZXNzYWdlIGFib3V0IGl0IHRvIHRoZSBzZXJ2ZXIgaWYgc28uCi0JCQkgKi8KLQkJCWNsaWVudF9jaGVja193aW5kb3dfY2hhbmdlKCk7Ci0KLQkJCWlmIChxdWl0X3BlbmRpbmcpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLyoKLQkJICogV2FpdCB1bnRpbCB3ZSBoYXZlIHNvbWV0aGluZyB0byBkbyAoc29tZXRoaW5nIGJlY29tZXMKLQkJICogYXZhaWxhYmxlIG9uIG9uZSBvZiB0aGUgZGVzY3JpcHRvcnMpLgotCQkgKi8KLQkJbWF4X2ZkMiA9IG1heF9mZDsKLQkJY2xpZW50X3dhaXRfdW50aWxfY2FuX2RvX3NvbWV0aGluZygmcmVhZHNldCwgJndyaXRlc2V0LAotCQkgICAgJm1heF9mZDIsICZuYWxsb2MsIHJla2V5aW5nKTsKLQotCQlpZiAocXVpdF9wZW5kaW5nKQotCQkJYnJlYWs7Ci0KLQkJLyogRG8gY2hhbm5lbCBvcGVyYXRpb25zIHVubGVzcyByZWtleWluZyBpbiBwcm9ncmVzcy4gKi8KLQkJaWYgKCFyZWtleWluZykgewotCQkJY2hhbm5lbF9hZnRlcl9zZWxlY3QocmVhZHNldCwgd3JpdGVzZXQpOwotCQkJaWYgKG5lZWRfcmVrZXlpbmcgfHwgcGFja2V0X25lZWRfcmVrZXlpbmcoKSkgewotCQkJCWRlYnVnKCJuZWVkIHJla2V5aW5nIik7Ci0JCQkJeHh4X2tleC0+ZG9uZSA9IDA7Ci0JCQkJa2V4X3NlbmRfa2V4aW5pdCh4eHhfa2V4KTsKLQkJCQluZWVkX3Jla2V5aW5nID0gMDsKLQkJCX0KLQkJfQotCi0JCS8qIEJ1ZmZlciBpbnB1dCBmcm9tIHRoZSBjb25uZWN0aW9uLiAgKi8KLQkJY2xpZW50X3Byb2Nlc3NfbmV0X2lucHV0KHJlYWRzZXQpOwotCi0JCWlmIChxdWl0X3BlbmRpbmcpCi0JCQlicmVhazsKLQotCQlpZiAoIWNvbXBhdDIwKSB7Ci0JCQkvKiBCdWZmZXIgZGF0YSBmcm9tIHN0ZGluICovCi0JCQljbGllbnRfcHJvY2Vzc19pbnB1dChyZWFkc2V0KTsKLQkJCS8qCi0JCQkgKiBQcm9jZXNzIG91dHB1dCB0byBzdGRvdXQgYW5kIHN0ZGVyci4gIE91dHB1dCB0bwotCQkJICogdGhlIGNvbm5lY3Rpb24gaXMgcHJvY2Vzc2VkIGVsc2V3aGVyZSAoYWJvdmUpLgotCQkJICovCi0JCQljbGllbnRfcHJvY2Vzc19vdXRwdXQod3JpdGVzZXQpOwotCQl9Ci0KLQkJaWYgKHNlc3Npb25fcmVzdW1lZCkgewotCQkJY29ubmVjdGlvbl9pbiA9IHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpOwotCQkJY29ubmVjdGlvbl9vdXQgPSBwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25fb3V0KCk7Ci0JCQltYXhfZmQgPSBNQVgobWF4X2ZkLCBjb25uZWN0aW9uX291dCk7Ci0JCQltYXhfZmQgPSBNQVgobWF4X2ZkLCBjb25uZWN0aW9uX2luKTsKLQkJCXNlc3Npb25fcmVzdW1lZCA9IDA7Ci0JCX0KLQotCQkvKgotCQkgKiBTZW5kIGFzIG11Y2ggYnVmZmVyZWQgcGFja2V0IGRhdGEgYXMgcG9zc2libGUgdG8gdGhlCi0JCSAqIHNlbmRlci4KLQkJICovCi0JCWlmIChGRF9JU1NFVChjb25uZWN0aW9uX291dCwgd3JpdGVzZXQpKQotCQkJcGFja2V0X3dyaXRlX3BvbGwoKTsKLQotCQkvKgotCQkgKiBJZiB3ZSBhcmUgYSBiYWNrZ3JvdW5kZWQgY29udHJvbCBtYXN0ZXIsIGFuZCB0aGUKLQkJICogdGltZW91dCBoYXMgZXhwaXJlZCB3aXRob3V0IGFueSBhY3RpdmUgY2xpZW50Ci0JCSAqIGNvbm5lY3Rpb25zLCB0aGVuIHF1aXQuCi0JCSAqLwotCQlpZiAoY29udHJvbF9wZXJzaXN0X2V4aXRfdGltZSA+IDApIHsKLQkJCWlmICh0aW1lKE5VTEwpID49IGNvbnRyb2xfcGVyc2lzdF9leGl0X3RpbWUpIHsKLQkJCQlkZWJ1ZygiQ29udHJvbFBlcnNpc3QgdGltZW91dCBleHBpcmVkIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHJlYWRzZXQpCi0JCXhmcmVlKHJlYWRzZXQpOwotCWlmICh3cml0ZXNldCkKLQkJeGZyZWUod3JpdGVzZXQpOwotCi0JLyogVGVybWluYXRlIHRoZSBzZXNzaW9uLiAqLwotCi0JLyogU3RvcCB3YXRjaGluZyBmb3Igd2luZG93IGNoYW5nZS4gKi8KLQlzaWduYWwoU0lHV0lOQ0gsIFNJR19ERkwpOwotCi0JaWYgKGNvbXBhdDIwKSB7Ci0JCXBhY2tldF9zdGFydChTU0gyX01TR19ESVNDT05ORUNUKTsKLQkJcGFja2V0X3B1dF9pbnQoU1NIMl9ESVNDT05ORUNUX0JZX0FQUExJQ0FUSU9OKTsKLQkJcGFja2V0X3B1dF9jc3RyaW5nKCJkaXNjb25uZWN0ZWQgYnkgdXNlciIpOwotCQlwYWNrZXRfcHV0X2NzdHJpbmcoIiIpOyAvKiBsYW5ndWFnZSB0YWcgKi8KLQkJcGFja2V0X3NlbmQoKTsKLQkJcGFja2V0X3dyaXRlX3dhaXQoKTsKLQl9Ci0KLQljaGFubmVsX2ZyZWVfYWxsKCk7Ci0KLQlpZiAoaGF2ZV9wdHkpCi0JCWxlYXZlX3Jhd19tb2RlKG9wdGlvbnMucmVxdWVzdF90dHkgPT0gUkVRVUVTVF9UVFlfRk9SQ0UpOwotCi0JLyogcmVzdG9yZSBibG9ja2luZyBpbyAqLwotCWlmICghaXNhdHR5KGZpbGVubyhzdGRpbikpKQotCQl1bnNldF9ub25ibG9jayhmaWxlbm8oc3RkaW4pKTsKLQlpZiAoIWlzYXR0eShmaWxlbm8oc3Rkb3V0KSkpCi0JCXVuc2V0X25vbmJsb2NrKGZpbGVubyhzdGRvdXQpKTsKLQlpZiAoIWlzYXR0eShmaWxlbm8oc3RkZXJyKSkpCi0JCXVuc2V0X25vbmJsb2NrKGZpbGVubyhzdGRlcnIpKTsKLQotCS8qCi0JICogSWYgdGhlcmUgd2FzIG5vIHNoZWxsIG9yIGNvbW1hbmQgcmVxdWVzdGVkLCB0aGVyZSB3aWxsIGJlIG5vIHJlbW90ZQotCSAqIGV4aXQgc3RhdHVzIHRvIGJlIHJldHVybmVkLiAgSW4gdGhhdCBjYXNlLCBjbGVhciBlcnJvciBjb2RlIGlmIHRoZQotCSAqIGNvbm5lY3Rpb24gd2FzIGRlbGliZXJhdGVseSB0ZXJtaW5hdGVkIGF0IHRoaXMgZW5kLgotCSAqLwotCWlmIChub19zaGVsbF9mbGFnICYmIHJlY2VpdmVkX3NpZ25hbCA9PSBTSUdURVJNKSB7Ci0JCXJlY2VpdmVkX3NpZ25hbCA9IDA7Ci0JCWV4aXRfc3RhdHVzID0gMDsKLQl9Ci0KLQlpZiAocmVjZWl2ZWRfc2lnbmFsKQotCQlmYXRhbCgiS2lsbGVkIGJ5IHNpZ25hbCAlZC4iLCAoaW50KSByZWNlaXZlZF9zaWduYWwpOwotCi0JLyoKLQkgKiBJbiBpbnRlcmFjdGl2ZSBtb2RlICh3aXRoIHBzZXVkbyB0dHkpIGRpc3BsYXkgYSBtZXNzYWdlIGluZGljYXRpbmcKLQkgKiB0aGF0IHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZC4KLQkgKi8KLQlpZiAoaGF2ZV9wdHkgJiYgb3B0aW9ucy5sb2dfbGV2ZWwgIT0gU1lTTE9HX0xFVkVMX1FVSUVUKSB7Ci0JCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwKLQkJICAgICJDb25uZWN0aW9uIHRvICUuNjRzIGNsb3NlZC5cclxuIiwgaG9zdCk7Ci0JCWJ1ZmZlcl9hcHBlbmQoJnN0ZGVycl9idWZmZXIsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotCX0KLQotCS8qIE91dHB1dCBhbnkgYnVmZmVyZWQgZGF0YSBmb3Igc3Rkb3V0LiAqLwotCWlmIChidWZmZXJfbGVuKCZzdGRvdXRfYnVmZmVyKSA+IDApIHsKLQkJbGVuID0gYXRvbWljaW8odndyaXRlLCBmaWxlbm8oc3Rkb3V0KSwKLQkJICAgIGJ1ZmZlcl9wdHIoJnN0ZG91dF9idWZmZXIpLCBidWZmZXJfbGVuKCZzdGRvdXRfYnVmZmVyKSk7Ci0JCWlmIChsZW4gPCAwIHx8ICh1X2ludClsZW4gIT0gYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcikpCi0JCQllcnJvcigiV3JpdGUgZmFpbGVkIGZsdXNoaW5nIHN0ZG91dCBidWZmZXIuIik7Ci0JCWVsc2UKLQkJCWJ1ZmZlcl9jb25zdW1lKCZzdGRvdXRfYnVmZmVyLCBsZW4pOwotCX0KLQotCS8qIE91dHB1dCBhbnkgYnVmZmVyZWQgZGF0YSBmb3Igc3RkZXJyLiAqLwotCWlmIChidWZmZXJfbGVuKCZzdGRlcnJfYnVmZmVyKSA+IDApIHsKLQkJbGVuID0gYXRvbWljaW8odndyaXRlLCBmaWxlbm8oc3RkZXJyKSwKLQkJICAgIGJ1ZmZlcl9wdHIoJnN0ZGVycl9idWZmZXIpLCBidWZmZXJfbGVuKCZzdGRlcnJfYnVmZmVyKSk7Ci0JCWlmIChsZW4gPCAwIHx8ICh1X2ludClsZW4gIT0gYnVmZmVyX2xlbigmc3RkZXJyX2J1ZmZlcikpCi0JCQllcnJvcigiV3JpdGUgZmFpbGVkIGZsdXNoaW5nIHN0ZGVyciBidWZmZXIuIik7Ci0JCWVsc2UKLQkJCWJ1ZmZlcl9jb25zdW1lKCZzdGRlcnJfYnVmZmVyLCBsZW4pOwotCX0KLQotCS8qIENsZWFyIGFuZCBmcmVlIGFueSBidWZmZXJzLiAqLwotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZmZXJfZnJlZSgmc3RkaW5fYnVmZmVyKTsKLQlidWZmZXJfZnJlZSgmc3Rkb3V0X2J1ZmZlcik7Ci0JYnVmZmVyX2ZyZWUoJnN0ZGVycl9idWZmZXIpOwotCi0JLyogUmVwb3J0IGJ5dGVzIHRyYW5zZmVycmVkLCBhbmQgdHJhbnNmZXIgcmF0ZXMuICovCi0JdG90YWxfdGltZSA9IGdldF9jdXJyZW50X3RpbWUoKSAtIHN0YXJ0X3RpbWU7Ci0JcGFja2V0X2dldF9zdGF0ZShNT0RFX0lOLCBOVUxMLCBOVUxMLCBOVUxMLCAmaWJ5dGVzKTsKLQlwYWNrZXRfZ2V0X3N0YXRlKE1PREVfT1VULCBOVUxMLCBOVUxMLCBOVUxMLCAmb2J5dGVzKTsKLQl2ZXJib3NlKCJUcmFuc2ZlcnJlZDogc2VudCAlbGx1LCByZWNlaXZlZCAlbGx1IGJ5dGVzLCBpbiAlLjFmIHNlY29uZHMiLAotCSAgICAodW5zaWduZWQgbG9uZyBsb25nKW9ieXRlcywgKHVuc2lnbmVkIGxvbmcgbG9uZylpYnl0ZXMsIHRvdGFsX3RpbWUpOwotCWlmICh0b3RhbF90aW1lID4gMCkKLQkJdmVyYm9zZSgiQnl0ZXMgcGVyIHNlY29uZDogc2VudCAlLjFmLCByZWNlaXZlZCAlLjFmIiwKLQkJICAgIG9ieXRlcyAvIHRvdGFsX3RpbWUsIGlieXRlcyAvIHRvdGFsX3RpbWUpOwotCS8qIFJldHVybiB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIHByb2dyYW0uICovCi0JZGVidWcoIkV4aXQgc3RhdHVzICVkIiwgZXhpdF9zdGF0dXMpOwotCXJldHVybiBleGl0X3N0YXR1czsKLX0KLQotLyoqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWNsaWVudF9pbnB1dF9zdGRvdXRfZGF0YShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQl1X2ludCBkYXRhX2xlbjsKLQljaGFyICpkYXRhID0gcGFja2V0X2dldF9zdHJpbmcoJmRhdGFfbGVuKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0JYnVmZmVyX2FwcGVuZCgmc3Rkb3V0X2J1ZmZlciwgZGF0YSwgZGF0YV9sZW4pOwotCW1lbXNldChkYXRhLCAwLCBkYXRhX2xlbik7Ci0JeGZyZWUoZGF0YSk7Ci19Ci1zdGF0aWMgdm9pZAotY2xpZW50X2lucHV0X3N0ZGVycl9kYXRhKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQotewotCXVfaW50IGRhdGFfbGVuOwotCWNoYXIgKmRhdGEgPSBwYWNrZXRfZ2V0X3N0cmluZygmZGF0YV9sZW4pOwotCXBhY2tldF9jaGVja19lb20oKTsKLQlidWZmZXJfYXBwZW5kKCZzdGRlcnJfYnVmZmVyLCBkYXRhLCBkYXRhX2xlbik7Ci0JbWVtc2V0KGRhdGEsIDAsIGRhdGFfbGVuKTsKLQl4ZnJlZShkYXRhKTsKLX0KLXN0YXRpYyB2b2lkCi1jbGllbnRfaW5wdXRfZXhpdF9zdGF0dXMoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JZXhpdF9zdGF0dXMgPSBwYWNrZXRfZ2V0X2ludCgpOwotCXBhY2tldF9jaGVja19lb20oKTsKLQkvKiBBY2tub3dsZWRnZSB0aGUgZXhpdC4gKi8KLQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfRVhJVF9DT05GSVJNQVRJT04pOwotCXBhY2tldF9zZW5kKCk7Ci0JLyoKLQkgKiBNdXN0IHdhaXQgZm9yIHBhY2tldCB0byBiZSBzZW50IHNpbmNlIHdlIGFyZQotCSAqIGV4aXRpbmcgdGhlIGxvb3AuCi0JICovCi0JcGFja2V0X3dyaXRlX3dhaXQoKTsKLQkvKiBGbGFnIHRoYXQgd2Ugd2FudCB0byBleGl0LiAqLwotCXF1aXRfcGVuZGluZyA9IDE7Ci19Ci1zdGF0aWMgdm9pZAotY2xpZW50X2lucHV0X2FnZW50X29wZW4oaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JQ2hhbm5lbCAqYyA9IE5VTEw7Ci0JaW50IHJlbW90ZV9pZCwgc29jazsKLQotCS8qIFJlYWQgdGhlIHJlbW90ZSBjaGFubmVsIG51bWJlciBmcm9tIHRoZSBtZXNzYWdlLiAqLwotCXJlbW90ZV9pZCA9IHBhY2tldF9nZXRfaW50KCk7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JLyoKLQkgKiBHZXQgYSBjb25uZWN0aW9uIHRvIHRoZSBsb2NhbCBhdXRoZW50aWNhdGlvbiBhZ2VudCAodGhpcyBtYXkgYWdhaW4KLQkgKiBnZXQgZm9yd2FyZGVkKS4KLQkgKi8KLQlzb2NrID0gc3NoX2dldF9hdXRoZW50aWNhdGlvbl9zb2NrZXQoKTsKLQotCS8qCi0JICogSWYgd2UgY291bGQgbm90IGNvbm5lY3QgdGhlIGFnZW50LCBzZW5kIGFuIGVycm9yIG1lc3NhZ2UgYmFjayB0bwotCSAqIHRoZSBzZXJ2ZXIuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiB1bmxlc3MgdGhlIGFnZW50IGRpZXMsCi0JICogYmVjYXVzZSBhdXRoZW50aWNhdGlvbiBmb3J3YXJkaW5nIGlzIG9ubHkgZW5hYmxlZCBpZiB3ZSBoYXZlIGFuCi0JICogYWdlbnQuCi0JICovCi0JaWYgKHNvY2sgPj0gMCkgewotCQljID0gY2hhbm5lbF9uZXcoIiIsIFNTSF9DSEFOTkVMX09QRU4sIHNvY2ssIHNvY2ssCi0JCSAgICAtMSwgMCwgMCwgMCwgImF1dGhlbnRpY2F0aW9uIGFnZW50IGNvbm5lY3Rpb24iLCAxKTsKLQkJYy0+cmVtb3RlX2lkID0gcmVtb3RlX2lkOwotCQljLT5mb3JjZV9kcmFpbiA9IDE7Ci0JfQotCWlmIChjID09IE5VTEwpIHsKLQkJcGFja2V0X3N0YXJ0KFNTSF9NU0dfQ0hBTk5FTF9PUEVOX0ZBSUxVUkUpOwotCQlwYWNrZXRfcHV0X2ludChyZW1vdGVfaWQpOwotCX0gZWxzZSB7Ci0JCS8qIFNlbmQgYSBjb25maXJtYXRpb24gdG8gdGhlIHJlbW90ZSBob3N0LiAqLwotCQlkZWJ1ZygiRm9yd2FyZGluZyBhdXRoZW50aWNhdGlvbiBjb25uZWN0aW9uLiIpOwotCQlwYWNrZXRfc3RhcnQoU1NIX01TR19DSEFOTkVMX09QRU5fQ09ORklSTUFUSU9OKTsKLQkJcGFja2V0X3B1dF9pbnQocmVtb3RlX2lkKTsKLQkJcGFja2V0X3B1dF9pbnQoYy0+c2VsZik7Ci0JfQotCXBhY2tldF9zZW5kKCk7Ci19Ci0KLXN0YXRpYyBDaGFubmVsICoKLWNsaWVudF9yZXF1ZXN0X2ZvcndhcmRlZF90Y3BpcChjb25zdCBjaGFyICpyZXF1ZXN0X3R5cGUsIGludCByY2hhbikKLXsKLQlDaGFubmVsICpjID0gTlVMTDsKLQljaGFyICpsaXN0ZW5fYWRkcmVzcywgKm9yaWdpbmF0b3JfYWRkcmVzczsKLQl1X3Nob3J0IGxpc3Rlbl9wb3J0LCBvcmlnaW5hdG9yX3BvcnQ7Ci0KLQkvKiBHZXQgcmVzdCBvZiB0aGUgcGFja2V0ICovCi0JbGlzdGVuX2FkZHJlc3MgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQlsaXN0ZW5fcG9ydCA9IHBhY2tldF9nZXRfaW50KCk7Ci0Jb3JpZ2luYXRvcl9hZGRyZXNzID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0Jb3JpZ2luYXRvcl9wb3J0ID0gcGFja2V0X2dldF9pbnQoKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlkZWJ1ZygiY2xpZW50X3JlcXVlc3RfZm9yd2FyZGVkX3RjcGlwOiBsaXN0ZW4gJXMgcG9ydCAlZCwgIgotCSAgICAib3JpZ2luYXRvciAlcyBwb3J0ICVkIiwgbGlzdGVuX2FkZHJlc3MsIGxpc3Rlbl9wb3J0LAotCSAgICBvcmlnaW5hdG9yX2FkZHJlc3MsIG9yaWdpbmF0b3JfcG9ydCk7Ci0KLQljID0gY2hhbm5lbF9jb25uZWN0X2J5X2xpc3Rlbl9hZGRyZXNzKGxpc3Rlbl9wb3J0LAotCSAgICAiZm9yd2FyZGVkLXRjcGlwIiwgb3JpZ2luYXRvcl9hZGRyZXNzKTsKLQotCXhmcmVlKG9yaWdpbmF0b3JfYWRkcmVzcyk7Ci0JeGZyZWUobGlzdGVuX2FkZHJlc3MpOwotCXJldHVybiBjOwotfQotCi1zdGF0aWMgQ2hhbm5lbCAqCi1jbGllbnRfcmVxdWVzdF94MTEoY29uc3QgY2hhciAqcmVxdWVzdF90eXBlLCBpbnQgcmNoYW4pCi17Ci0JQ2hhbm5lbCAqYyA9IE5VTEw7Ci0JY2hhciAqb3JpZ2luYXRvcjsKLQl1X3Nob3J0IG9yaWdpbmF0b3JfcG9ydDsKLQlpbnQgc29jazsKLQotCWlmICghb3B0aW9ucy5mb3J3YXJkX3gxMSkgewotCQllcnJvcigiV2FybmluZzogc3NoIHNlcnZlciB0cmllZCBYMTEgZm9yd2FyZGluZy4iKTsKLQkJZXJyb3IoIldhcm5pbmc6IHRoaXMgaXMgcHJvYmFibHkgYSBicmVhay1pbiBhdHRlbXB0IGJ5IGEgIgotCQkgICAgIm1hbGljaW91cyBzZXJ2ZXIuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoeDExX3JlZnVzZV90aW1lICE9IDAgJiYgdGltZShOVUxMKSA+PSB4MTFfcmVmdXNlX3RpbWUpIHsKLQkJdmVyYm9zZSgiUmVqZWN0ZWQgWDExIGNvbm5lY3Rpb24gYWZ0ZXIgRm9yd2FyZFgxMVRpbWVvdXQgIgotCQkgICAgImV4cGlyZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9yaWdpbmF0b3IgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1gxMUZXRCkgewotCQlkZWJ1ZzIoImJ1Z2d5IHNlcnZlcjogeDExIHJlcXVlc3Qgdy9vIG9yaWdpbmF0b3JfcG9ydCIpOwotCQlvcmlnaW5hdG9yX3BvcnQgPSAwOwotCX0gZWxzZSB7Ci0JCW9yaWdpbmF0b3JfcG9ydCA9IHBhY2tldF9nZXRfaW50KCk7Ci0JfQotCXBhY2tldF9jaGVja19lb20oKTsKLQkvKiBYWFggY2hlY2sgcGVybWlzc2lvbiAqLwotCWRlYnVnKCJjbGllbnRfcmVxdWVzdF94MTE6IHJlcXVlc3QgZnJvbSAlcyAlZCIsIG9yaWdpbmF0b3IsCi0JICAgIG9yaWdpbmF0b3JfcG9ydCk7Ci0JeGZyZWUob3JpZ2luYXRvcik7Ci0Jc29jayA9IHgxMV9jb25uZWN0X2Rpc3BsYXkoKTsKLQlpZiAoc29jayA8IDApCi0JCXJldHVybiBOVUxMOwotCWMgPSBjaGFubmVsX25ldygieDExIiwKLQkgICAgU1NIX0NIQU5ORUxfWDExX09QRU4sIHNvY2ssIHNvY2ssIC0xLAotCSAgICBDSEFOX1RDUF9XSU5ET1dfREVGQVVMVCwgQ0hBTl9YMTFfUEFDS0VUX0RFRkFVTFQsIDAsICJ4MTEiLCAxKTsKLQljLT5mb3JjZV9kcmFpbiA9IDE7Ci0JcmV0dXJuIGM7Ci19Ci0KLXN0YXRpYyBDaGFubmVsICoKLWNsaWVudF9yZXF1ZXN0X2FnZW50KGNvbnN0IGNoYXIgKnJlcXVlc3RfdHlwZSwgaW50IHJjaGFuKQotewotCUNoYW5uZWwgKmMgPSBOVUxMOwotCWludCBzb2NrOwotCi0JaWYgKCFvcHRpb25zLmZvcndhcmRfYWdlbnQpIHsKLQkJZXJyb3IoIldhcm5pbmc6IHNzaCBzZXJ2ZXIgdHJpZWQgYWdlbnQgZm9yd2FyZGluZy4iKTsKLQkJZXJyb3IoIldhcm5pbmc6IHRoaXMgaXMgcHJvYmFibHkgYSBicmVhay1pbiBhdHRlbXB0IGJ5IGEgIgotCQkgICAgIm1hbGljaW91cyBzZXJ2ZXIuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzb2NrID0gc3NoX2dldF9hdXRoZW50aWNhdGlvbl9zb2NrZXQoKTsKLQlpZiAoc29jayA8IDApCi0JCXJldHVybiBOVUxMOwotCWMgPSBjaGFubmVsX25ldygiYXV0aGVudGljYXRpb24gYWdlbnQgY29ubmVjdGlvbiIsCi0JICAgIFNTSF9DSEFOTkVMX09QRU4sIHNvY2ssIHNvY2ssIC0xLAotCSAgICBDSEFOX1gxMV9XSU5ET1dfREVGQVVMVCwgQ0hBTl9UQ1BfUEFDS0VUX0RFRkFVTFQsIDAsCi0JICAgICJhdXRoZW50aWNhdGlvbiBhZ2VudCBjb25uZWN0aW9uIiwgMSk7Ci0JYy0+Zm9yY2VfZHJhaW4gPSAxOwotCXJldHVybiBjOwotfQotCi1pbnQKLWNsaWVudF9yZXF1ZXN0X3R1bl9md2QoaW50IHR1bl9tb2RlLCBpbnQgbG9jYWxfdHVuLCBpbnQgcmVtb3RlX3R1bikKLXsKLQlDaGFubmVsICpjOwotCWludCBmZDsKLQotCWlmICh0dW5fbW9kZSA9PSBTU0hfVFVOTU9ERV9OTykKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWNvbXBhdDIwKSB7Ci0JCWVycm9yKCJUdW5uZWwgZm9yd2FyZGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBwcm90b2NvbCAxIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlkZWJ1ZygiUmVxdWVzdGluZyB0dW4gdW5pdCAlZCBpbiBtb2RlICVkIiwgbG9jYWxfdHVuLCB0dW5fbW9kZSk7Ci0KLQkvKiBPcGVuIGxvY2FsIHR1bm5lbCBkZXZpY2UgKi8KLQlpZiAoKGZkID0gdHVuX29wZW4obG9jYWxfdHVuLCB0dW5fbW9kZSkpID09IC0xKSB7Ci0JCWVycm9yKCJUdW5uZWwgZGV2aWNlIG9wZW4gZmFpbGVkLiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JYyA9IGNoYW5uZWxfbmV3KCJ0dW4iLCBTU0hfQ0hBTk5FTF9PUEVOSU5HLCBmZCwgZmQsIC0xLAotCSAgICBDSEFOX1RDUF9XSU5ET1dfREVGQVVMVCwgQ0hBTl9UQ1BfUEFDS0VUX0RFRkFVTFQsIDAsICJ0dW4iLCAxKTsKLQljLT5kYXRhZ3JhbSA9IDE7Ci0KLSNpZiBkZWZpbmVkKFNTSF9UVU5fRklMVEVSKQotCWlmIChvcHRpb25zLnR1bl9vcGVuID09IFNTSF9UVU5NT0RFX1BPSU5UT1BPSU5UKQotCQljaGFubmVsX3JlZ2lzdGVyX2ZpbHRlcihjLT5zZWxmLCBzeXNfdHVuX2luZmlsdGVyLAotCQkgICAgc3lzX3R1bl9vdXRmaWx0ZXIsIE5VTEwsIE5VTEwpOwotI2VuZGlmCi0KLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfQ0hBTk5FTF9PUEVOKTsKLQlwYWNrZXRfcHV0X2NzdHJpbmcoInR1bkBvcGVuc3NoLmNvbSIpOwotCXBhY2tldF9wdXRfaW50KGMtPnNlbGYpOwotCXBhY2tldF9wdXRfaW50KGMtPmxvY2FsX3dpbmRvd19tYXgpOwotCXBhY2tldF9wdXRfaW50KGMtPmxvY2FsX21heHBhY2tldCk7Ci0JcGFja2V0X3B1dF9pbnQodHVuX21vZGUpOwotCXBhY2tldF9wdXRfaW50KHJlbW90ZV90dW4pOwotCXBhY2tldF9zZW5kKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogWFhYWCBtb3ZlIHRvIGdlbmVyaWMgaW5wdXQgaGFuZGxlciAqLwotc3RhdGljIHZvaWQKLWNsaWVudF9pbnB1dF9jaGFubmVsX29wZW4oaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JQ2hhbm5lbCAqYyA9IE5VTEw7Ci0JY2hhciAqY3R5cGU7Ci0JaW50IHJjaGFuOwotCXVfaW50IHJtYXhwYWNrLCByd2luZG93LCBsZW47Ci0KLQljdHlwZSA9IHBhY2tldF9nZXRfc3RyaW5nKCZsZW4pOwotCXJjaGFuID0gcGFja2V0X2dldF9pbnQoKTsKLQlyd2luZG93ID0gcGFja2V0X2dldF9pbnQoKTsKLQlybWF4cGFjayA9IHBhY2tldF9nZXRfaW50KCk7Ci0KLQlkZWJ1ZygiY2xpZW50X2lucHV0X2NoYW5uZWxfb3BlbjogY3R5cGUgJXMgcmNoYW4gJWQgd2luICVkIG1heCAlZCIsCi0JICAgIGN0eXBlLCByY2hhbiwgcndpbmRvdywgcm1heHBhY2spOwotCi0JaWYgKHN0cmNtcChjdHlwZSwgImZvcndhcmRlZC10Y3BpcCIpID09IDApIHsKLQkJYyA9IGNsaWVudF9yZXF1ZXN0X2ZvcndhcmRlZF90Y3BpcChjdHlwZSwgcmNoYW4pOwotCX0gZWxzZSBpZiAoc3RyY21wKGN0eXBlLCAieDExIikgPT0gMCkgewotCQljID0gY2xpZW50X3JlcXVlc3RfeDExKGN0eXBlLCByY2hhbik7Ci0JfSBlbHNlIGlmIChzdHJjbXAoY3R5cGUsICJhdXRoLWFnZW50QG9wZW5zc2guY29tIikgPT0gMCkgewotCQljID0gY2xpZW50X3JlcXVlc3RfYWdlbnQoY3R5cGUsIHJjaGFuKTsKLQl9Ci0vKiBYWFggZHVwbGljYXRlIDogKi8KLQlpZiAoYyAhPSBOVUxMKSB7Ci0JCWRlYnVnKCJjb25maXJtICVzIiwgY3R5cGUpOwotCQljLT5yZW1vdGVfaWQgPSByY2hhbjsKLQkJYy0+cmVtb3RlX3dpbmRvdyA9IHJ3aW5kb3c7Ci0JCWMtPnJlbW90ZV9tYXhwYWNrZXQgPSBybWF4cGFjazsKLQkJaWYgKGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfQ09OTkVDVElORykgewotCQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0NIQU5ORUxfT1BFTl9DT05GSVJNQVRJT04pOwotCQkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKLQkJCXBhY2tldF9wdXRfaW50KGMtPnNlbGYpOwotCQkJcGFja2V0X3B1dF9pbnQoYy0+bG9jYWxfd2luZG93KTsKLQkJCXBhY2tldF9wdXRfaW50KGMtPmxvY2FsX21heHBhY2tldCk7Ci0JCQlwYWNrZXRfc2VuZCgpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZGVidWcoImZhaWx1cmUgJXMiLCBjdHlwZSk7Ci0JCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX09QRU5fRkFJTFVSRSk7Ci0JCXBhY2tldF9wdXRfaW50KHJjaGFuKTsKLQkJcGFja2V0X3B1dF9pbnQoU1NIMl9PUEVOX0FETUlOSVNUUkFUSVZFTFlfUFJPSElCSVRFRCk7Ci0JCWlmICghKGRhdGFmZWxsb3dzICYgU1NIX0JVR19PUEVORkFJTFVSRSkpIHsKLQkJCXBhY2tldF9wdXRfY3N0cmluZygib3BlbiBmYWlsZWQiKTsKLQkJCXBhY2tldF9wdXRfY3N0cmluZygiIik7Ci0JCX0KLQkJcGFja2V0X3NlbmQoKTsKLQl9Ci0JeGZyZWUoY3R5cGUpOwotfQotc3RhdGljIHZvaWQKLWNsaWVudF9pbnB1dF9jaGFubmVsX3JlcShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlDaGFubmVsICpjID0gTlVMTDsKLQlpbnQgZXhpdHZhbCwgaWQsIHJlcGx5LCBzdWNjZXNzID0gMDsKLQljaGFyICpydHlwZTsKLQotCWlkID0gcGFja2V0X2dldF9pbnQoKTsKLQlydHlwZSA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOwotCXJlcGx5ID0gcGFja2V0X2dldF9jaGFyKCk7Ci0KLQlkZWJ1ZygiY2xpZW50X2lucHV0X2NoYW5uZWxfcmVxOiBjaGFubmVsICVkIHJ0eXBlICVzIHJlcGx5ICVkIiwKLQkgICAgaWQsIHJ0eXBlLCByZXBseSk7Ci0KLQlpZiAoaWQgPT0gLTEpIHsKLQkJZXJyb3IoImNsaWVudF9pbnB1dF9jaGFubmVsX3JlcTogcmVxdWVzdCBmb3IgY2hhbm5lbCAtMSIpOwotCX0gZWxzZSBpZiAoKGMgPSBjaGFubmVsX2xvb2t1cChpZCkpID09IE5VTEwpIHsKLQkJZXJyb3IoImNsaWVudF9pbnB1dF9jaGFubmVsX3JlcTogY2hhbm5lbCAlZDogIgotCQkgICAgInVua25vd24gY2hhbm5lbCIsIGlkKTsKLQl9IGVsc2UgaWYgKHN0cmNtcChydHlwZSwgImVvd0BvcGVuc3NoLmNvbSIpID09IDApIHsKLQkJcGFja2V0X2NoZWNrX2VvbSgpOwotCQljaGFuX3JjdmRfZW93KGMpOwotCX0gZWxzZSBpZiAoc3RyY21wKHJ0eXBlLCAiZXhpdC1zdGF0dXMiKSA9PSAwKSB7Ci0JCWV4aXR2YWwgPSBwYWNrZXRfZ2V0X2ludCgpOwotCQlpZiAoYy0+Y3RsX2NoYW4gIT0gLTEpIHsKLQkJCW11eF9leGl0X21lc3NhZ2UoYywgZXhpdHZhbCk7Ci0JCQlzdWNjZXNzID0gMTsKLQkJfSBlbHNlIGlmIChpZCA9PSBzZXNzaW9uX2lkZW50KSB7Ci0JCQkvKiBSZWNvcmQgZXhpdCB2YWx1ZSBvZiBsb2NhbCBzZXNzaW9uICovCi0JCQlzdWNjZXNzID0gMTsKLQkJCWV4aXRfc3RhdHVzID0gZXhpdHZhbDsKLQkJfSBlbHNlIHsKLQkJCS8qIFByb2JhYmx5IGZvciBhIG11eCBjaGFubmVsIHRoYXQgaGFzIGFscmVhZHkgY2xvc2VkICovCi0JCQlkZWJ1ZygiJXM6IG5vIHNpbmsgZm9yIGV4aXQtc3RhdHVzIG9uIGNoYW5uZWwgJWQiLAotCQkJICAgIF9fZnVuY19fLCBpZCk7Ci0JCX0KLQkJcGFja2V0X2NoZWNrX2VvbSgpOwotCX0KLQlpZiAocmVwbHkgJiYgYyAhPSBOVUxMKSB7Ci0JCXBhY2tldF9zdGFydChzdWNjZXNzID8KLQkJICAgIFNTSDJfTVNHX0NIQU5ORUxfU1VDQ0VTUyA6IFNTSDJfTVNHX0NIQU5ORUxfRkFJTFVSRSk7Ci0JCXBhY2tldF9wdXRfaW50KGMtPnJlbW90ZV9pZCk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JfQotCXhmcmVlKHJ0eXBlKTsKLX0KLXN0YXRpYyB2b2lkCi1jbGllbnRfaW5wdXRfZ2xvYmFsX3JlcXVlc3QoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JY2hhciAqcnR5cGU7Ci0JaW50IHdhbnRfcmVwbHk7Ci0JaW50IHN1Y2Nlc3MgPSAwOwotCi0JcnR5cGUgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQl3YW50X3JlcGx5ID0gcGFja2V0X2dldF9jaGFyKCk7Ci0JZGVidWcoImNsaWVudF9pbnB1dF9nbG9iYWxfcmVxdWVzdDogcnR5cGUgJXMgd2FudF9yZXBseSAlZCIsCi0JICAgIHJ0eXBlLCB3YW50X3JlcGx5KTsKLQlpZiAod2FudF9yZXBseSkgewotCQlwYWNrZXRfc3RhcnQoc3VjY2VzcyA/Ci0JCSAgICBTU0gyX01TR19SRVFVRVNUX1NVQ0NFU1MgOiBTU0gyX01TR19SRVFVRVNUX0ZBSUxVUkUpOwotCQlwYWNrZXRfc2VuZCgpOwotCQlwYWNrZXRfd3JpdGVfd2FpdCgpOwotCX0KLQl4ZnJlZShydHlwZSk7Ci19Ci0KLXZvaWQKLWNsaWVudF9zZXNzaW9uMl9zZXR1cChpbnQgaWQsIGludCB3YW50X3R0eSwgaW50IHdhbnRfc3Vic3lzdGVtLAotICAgIGNvbnN0IGNoYXIgKnRlcm0sIHN0cnVjdCB0ZXJtaW9zICp0aW9wLCBpbnQgaW5fZmQsIEJ1ZmZlciAqY21kLCBjaGFyICoqZW52KQotewotCWludCBsZW47Ci0JQ2hhbm5lbCAqYyA9IE5VTEw7Ci0KLQlkZWJ1ZzIoIiVzOiBpZCAlZCIsIF9fZnVuY19fLCBpZCk7Ci0KLQlpZiAoKGMgPSBjaGFubmVsX2xvb2t1cChpZCkpID09IE5VTEwpCi0JCWZhdGFsKCJjbGllbnRfc2Vzc2lvbjJfc2V0dXA6IGNoYW5uZWwgJWQ6IHVua25vd24gY2hhbm5lbCIsIGlkKTsKLQotCXBhY2tldF9zZXRfaW50ZXJhY3RpdmUod2FudF90dHksCi0JICAgIG9wdGlvbnMuaXBfcW9zX2ludGVyYWN0aXZlLCBvcHRpb25zLmlwX3Fvc19idWxrKTsKLQotCWlmICh3YW50X3R0eSkgewotCQlzdHJ1Y3Qgd2luc2l6ZSB3czsKLQotCQkvKiBTdG9yZSB3aW5kb3cgc2l6ZSBpbiB0aGUgcGFja2V0LiAqLwotCQlpZiAoaW9jdGwoaW5fZmQsIFRJT0NHV0lOU1osICZ3cykgPCAwKQotCQkJbWVtc2V0KCZ3cywgMCwgc2l6ZW9mKHdzKSk7Ci0KLQkJY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0KGlkLCAicHR5LXJlcSIsIDEpOwotCQljbGllbnRfZXhwZWN0X2NvbmZpcm0oaWQsICJQVFkgYWxsb2NhdGlvbiIsIENPTkZJUk1fVFRZKTsKLQkJcGFja2V0X3B1dF9jc3RyaW5nKHRlcm0gIT0gTlVMTCA/IHRlcm0gOiAiIik7Ci0JCXBhY2tldF9wdXRfaW50KCh1X2ludCl3cy53c19jb2wpOwotCQlwYWNrZXRfcHV0X2ludCgodV9pbnQpd3Mud3Nfcm93KTsKLQkJcGFja2V0X3B1dF9pbnQoKHVfaW50KXdzLndzX3hwaXhlbCk7Ci0JCXBhY2tldF9wdXRfaW50KCh1X2ludCl3cy53c195cGl4ZWwpOwotCQlpZiAodGlvcCA9PSBOVUxMKQotCQkJdGlvcCA9IGdldF9zYXZlZF90aW8oKTsKLQkJdHR5X21ha2VfbW9kZXMoLTEsIHRpb3ApOwotCQlwYWNrZXRfc2VuZCgpOwotCQkvKiBYWFggd2FpdCBmb3IgcmVwbHkgKi8KLQkJYy0+Y2xpZW50X3R0eSA9IDE7Ci0JfQotCi0JLyogVHJhbnNmZXIgYW55IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGNsaWVudCB0byBzZXJ2ZXIgKi8KLQlpZiAob3B0aW9ucy5udW1fc2VuZF9lbnYgIT0gMCAmJiBlbnYgIT0gTlVMTCkgewotCQlpbnQgaSwgaiwgbWF0Y2hlZDsKLQkJY2hhciAqbmFtZSwgKnZhbDsKLQotCQlkZWJ1ZygiU2VuZGluZyBlbnZpcm9ubWVudC4iKTsKLQkJZm9yIChpID0gMDsgZW52W2ldICE9IE5VTEw7IGkrKykgewotCQkJLyogU3BsaXQgKi8KLQkJCW5hbWUgPSB4c3RyZHVwKGVudltpXSk7Ci0JCQlpZiAoKHZhbCA9IHN0cmNocihuYW1lLCAnPScpKSA9PSBOVUxMKSB7Ci0JCQkJeGZyZWUobmFtZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkqdmFsKysgPSAnXDAnOwotCi0JCQltYXRjaGVkID0gMDsKLQkJCWZvciAoaiA9IDA7IGogPCBvcHRpb25zLm51bV9zZW5kX2VudjsgaisrKSB7Ci0JCQkJaWYgKG1hdGNoX3BhdHRlcm4obmFtZSwgb3B0aW9ucy5zZW5kX2VudltqXSkpIHsKLQkJCQkJbWF0Y2hlZCA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbWF0Y2hlZCkgewotCQkJCWRlYnVnMygiSWdub3JlZCBlbnYgJXMiLCBuYW1lKTsKLQkJCQl4ZnJlZShuYW1lKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZGVidWcoIlNlbmRpbmcgZW52ICVzID0gJXMiLCBuYW1lLCB2YWwpOwotCQkJY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0KGlkLCAiZW52IiwgMCk7Ci0JCQlwYWNrZXRfcHV0X2NzdHJpbmcobmFtZSk7Ci0JCQlwYWNrZXRfcHV0X2NzdHJpbmcodmFsKTsKLQkJCXBhY2tldF9zZW5kKCk7Ci0JCQl4ZnJlZShuYW1lKTsKLQkJfQotCX0KLQotCWxlbiA9IGJ1ZmZlcl9sZW4oY21kKTsKLQlpZiAobGVuID4gMCkgewotCQlpZiAobGVuID4gOTAwKQotCQkJbGVuID0gOTAwOwotCQlpZiAod2FudF9zdWJzeXN0ZW0pIHsKLQkJCWRlYnVnKCJTZW5kaW5nIHN1YnN5c3RlbTogJS4qcyIsCi0JCQkgICAgbGVuLCAodV9jaGFyKilidWZmZXJfcHRyKGNtZCkpOwotCQkJY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0KGlkLCAic3Vic3lzdGVtIiwgMSk7Ci0JCQljbGllbnRfZXhwZWN0X2NvbmZpcm0oaWQsICJzdWJzeXN0ZW0iLCBDT05GSVJNX0NMT1NFKTsKLQkJfSBlbHNlIHsKLQkJCWRlYnVnKCJTZW5kaW5nIGNvbW1hbmQ6ICUuKnMiLAotCQkJICAgIGxlbiwgKHVfY2hhciopYnVmZmVyX3B0cihjbWQpKTsKLQkJCWNoYW5uZWxfcmVxdWVzdF9zdGFydChpZCwgImV4ZWMiLCAxKTsKLQkJCWNsaWVudF9leHBlY3RfY29uZmlybShpZCwgImV4ZWMiLCBDT05GSVJNX0NMT1NFKTsKLQkJfQotCQlwYWNrZXRfcHV0X3N0cmluZyhidWZmZXJfcHRyKGNtZCksIGJ1ZmZlcl9sZW4oY21kKSk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JfSBlbHNlIHsKLQkJY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0KGlkLCAic2hlbGwiLCAxKTsKLQkJY2xpZW50X2V4cGVjdF9jb25maXJtKGlkLCAic2hlbGwiLCBDT05GSVJNX0NMT1NFKTsKLQkJcGFja2V0X3NlbmQoKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jbGllbnRfaW5pdF9kaXNwYXRjaF8yMCh2b2lkKQotewotCWRpc3BhdGNoX2luaXQoJmRpc3BhdGNoX3Byb3RvY29sX2Vycm9yKTsKLQotCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX0NMT1NFLCAmY2hhbm5lbF9pbnB1dF9vY2xvc2UpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX0RBVEEsICZjaGFubmVsX2lucHV0X2RhdGEpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX0VPRiwgJmNoYW5uZWxfaW5wdXRfaWVvZik7Ci0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX0NIQU5ORUxfRVhURU5ERURfREFUQSwgJmNoYW5uZWxfaW5wdXRfZXh0ZW5kZWRfZGF0YSk7Ci0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX0NIQU5ORUxfT1BFTiwgJmNsaWVudF9pbnB1dF9jaGFubmVsX29wZW4pOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX09QRU5fQ09ORklSTUFUSU9OLCAmY2hhbm5lbF9pbnB1dF9vcGVuX2NvbmZpcm1hdGlvbik7Ci0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX0NIQU5ORUxfT1BFTl9GQUlMVVJFLCAmY2hhbm5lbF9pbnB1dF9vcGVuX2ZhaWx1cmUpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX1JFUVVFU1QsICZjbGllbnRfaW5wdXRfY2hhbm5lbF9yZXEpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX1dJTkRPV19BREpVU1QsICZjaGFubmVsX2lucHV0X3dpbmRvd19hZGp1c3QpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX1NVQ0NFU1MsICZjaGFubmVsX2lucHV0X3N0YXR1c19jb25maXJtKTsKLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9GQUlMVVJFLCAmY2hhbm5lbF9pbnB1dF9zdGF0dXNfY29uZmlybSk7Ci0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX0dMT0JBTF9SRVFVRVNULCAmY2xpZW50X2lucHV0X2dsb2JhbF9yZXF1ZXN0KTsKLQotCS8qIHJla2V5aW5nICovCi0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX0tFWElOSVQsICZrZXhfaW5wdXRfa2V4aW5pdCk7Ci0KLQkvKiBnbG9iYWwgcmVxdWVzdCByZXBseSBtZXNzYWdlcyAqLwotCWRpc3BhdGNoX3NldChTU0gyX01TR19SRVFVRVNUX0ZBSUxVUkUsICZjbGllbnRfZ2xvYmFsX3JlcXVlc3RfcmVwbHkpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19SRVFVRVNUX1NVQ0NFU1MsICZjbGllbnRfZ2xvYmFsX3JlcXVlc3RfcmVwbHkpOwotfQotCi1zdGF0aWMgdm9pZAotY2xpZW50X2luaXRfZGlzcGF0Y2hfMTModm9pZCkKLXsKLQlkaXNwYXRjaF9pbml0KE5VTEwpOwotCWRpc3BhdGNoX3NldChTU0hfTVNHX0NIQU5ORUxfQ0xPU0UsICZjaGFubmVsX2lucHV0X2Nsb3NlKTsKLQlkaXNwYXRjaF9zZXQoU1NIX01TR19DSEFOTkVMX0NMT1NFX0NPTkZJUk1BVElPTiwgJmNoYW5uZWxfaW5wdXRfY2xvc2VfY29uZmlybWF0aW9uKTsKLQlkaXNwYXRjaF9zZXQoU1NIX01TR19DSEFOTkVMX0RBVEEsICZjaGFubmVsX2lucHV0X2RhdGEpOwotCWRpc3BhdGNoX3NldChTU0hfTVNHX0NIQU5ORUxfT1BFTl9DT05GSVJNQVRJT04sICZjaGFubmVsX2lucHV0X29wZW5fY29uZmlybWF0aW9uKTsKLQlkaXNwYXRjaF9zZXQoU1NIX01TR19DSEFOTkVMX09QRU5fRkFJTFVSRSwgJmNoYW5uZWxfaW5wdXRfb3Blbl9mYWlsdXJlKTsKLQlkaXNwYXRjaF9zZXQoU1NIX01TR19QT1JUX09QRU4sICZjaGFubmVsX2lucHV0X3BvcnRfb3Blbik7Ci0JZGlzcGF0Y2hfc2V0KFNTSF9TTVNHX0VYSVRTVEFUVVMsICZjbGllbnRfaW5wdXRfZXhpdF9zdGF0dXMpOwotCWRpc3BhdGNoX3NldChTU0hfU01TR19TVERFUlJfREFUQSwgJmNsaWVudF9pbnB1dF9zdGRlcnJfZGF0YSk7Ci0JZGlzcGF0Y2hfc2V0KFNTSF9TTVNHX1NURE9VVF9EQVRBLCAmY2xpZW50X2lucHV0X3N0ZG91dF9kYXRhKTsKLQotCWRpc3BhdGNoX3NldChTU0hfU01TR19BR0VOVF9PUEVOLCBvcHRpb25zLmZvcndhcmRfYWdlbnQgPwotCSAgICAmY2xpZW50X2lucHV0X2FnZW50X29wZW4gOiAmZGVueV9pbnB1dF9vcGVuKTsKLQlkaXNwYXRjaF9zZXQoU1NIX1NNU0dfWDExX09QRU4sIG9wdGlvbnMuZm9yd2FyZF94MTEgPwotCSAgICAmeDExX2lucHV0X29wZW4gOiAmZGVueV9pbnB1dF9vcGVuKTsKLX0KLQotc3RhdGljIHZvaWQKLWNsaWVudF9pbml0X2Rpc3BhdGNoXzE1KHZvaWQpCi17Ci0JY2xpZW50X2luaXRfZGlzcGF0Y2hfMTMoKTsKLQlkaXNwYXRjaF9zZXQoU1NIX01TR19DSEFOTkVMX0NMT1NFLCAmY2hhbm5lbF9pbnB1dF9pZW9mKTsKLQlkaXNwYXRjaF9zZXQoU1NIX01TR19DSEFOTkVMX0NMT1NFX0NPTkZJUk1BVElPTiwgJiBjaGFubmVsX2lucHV0X29jbG9zZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jbGllbnRfaW5pdF9kaXNwYXRjaCh2b2lkKQotewotCWlmIChjb21wYXQyMCkKLQkJY2xpZW50X2luaXRfZGlzcGF0Y2hfMjAoKTsKLQllbHNlIGlmIChjb21wYXQxMykKLQkJY2xpZW50X2luaXRfZGlzcGF0Y2hfMTMoKTsKLQllbHNlCi0JCWNsaWVudF9pbml0X2Rpc3BhdGNoXzE1KCk7Ci19Ci0KLXZvaWQKLWNsaWVudF9zdG9wX211eCh2b2lkKQotewotCWlmIChvcHRpb25zLmNvbnRyb2xfcGF0aCAhPSBOVUxMICYmIG11eHNlcnZlcl9zb2NrICE9IC0xKQotCQl1bmxpbmsob3B0aW9ucy5jb250cm9sX3BhdGgpOwotCS8qCi0JICogSWYgd2UgYXJlIGluIHBlcnNpc3QgbW9kZSwgc2lnbmFsIHRoYXQgd2Ugc2hvdWxkIGNsb3NlIHdoZW4gYWxsCi0JICogYWN0aXZlIGNoYW5uZWxzIGFyZSBjbG9zZWQuCi0JICovCi0JaWYgKG9wdGlvbnMuY29udHJvbF9wZXJzaXN0KSB7Ci0JCXNlc3Npb25fY2xvc2VkID0gMTsKLQkJc2V0cHJvY3RpdGxlKCJbc3RvcHBlZCBtdXhdIik7Ci0JfQotfQotCi0vKiBjbGllbnQgc3BlY2lmaWMgZmF0YWwgY2xlYW51cCAqLwotdm9pZAotY2xlYW51cF9leGl0KGludCBpKQotewotCWxlYXZlX3Jhd19tb2RlKG9wdGlvbnMucmVxdWVzdF90dHkgPT0gUkVRVUVTVF9UVFlfRk9SQ0UpOwotCWxlYXZlX25vbl9ibG9ja2luZygpOwotCWlmIChvcHRpb25zLmNvbnRyb2xfcGF0aCAhPSBOVUxMICYmIG11eHNlcnZlcl9zb2NrICE9IC0xKQotCQl1bmxpbmsob3B0aW9ucy5jb250cm9sX3BhdGgpOwotCXNzaF9raWxsX3Byb3h5X2NvbW1hbmQoKTsKLQlfZXhpdChpKTsKLX0KZGlmZiAtLWdpdCBhL2NsaWVudGxvb3AuaCBiL2NsaWVudGxvb3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1OWI1ZS4uMDAwMDAwMAotLS0gYS9jbGllbnRsb29wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiAkT3BlbkJTRDogY2xpZW50bG9vcC5oLHYgMS4yOCAyMDExLzA2LzIyIDIyOjA4OjQyIGRqbSBFeHAgJCAqLwotCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0KLS8qIENsaWVudCBzaWRlIG1haW4gbG9vcCBmb3IgdGhlIGludGVyYWN0aXZlIHNlc3Npb24uICovCi1pbnQJIGNsaWVudF9sb29wKGludCwgaW50LCBpbnQpOwotdm9pZAkgY2xpZW50X3gxMV9nZXRfcHJvdG8oY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVfaW50LCB1X2ludCwKLQkgICAgY2hhciAqKiwgY2hhciAqKik7Ci12b2lkCSBjbGllbnRfZ2xvYmFsX3JlcXVlc3RfcmVwbHlfZndkKGludCwgdV9pbnQzMl90LCB2b2lkICopOwotdm9pZAkgY2xpZW50X3Nlc3Npb24yX3NldHVwKGludCwgaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgc3RydWN0IHRlcm1pb3MgKiwKLQkgICAgaW50LCBCdWZmZXIgKiwgY2hhciAqKik7Ci1pbnQJIGNsaWVudF9yZXF1ZXN0X3R1bl9md2QoaW50LCBpbnQsIGludCk7Ci12b2lkCSBjbGllbnRfc3RvcF9tdXgodm9pZCk7Ci0KLS8qIEVzY2FwZSBmaWx0ZXIgZm9yIHByb3RvY29sIDIgc2Vzc2lvbnMgKi8KLXZvaWQJKmNsaWVudF9uZXdfZXNjYXBlX2ZpbHRlcl9jdHgoaW50KTsKLXZvaWQJIGNsaWVudF9maWx0ZXJfY2xlYW51cChpbnQsIHZvaWQgKik7Ci1pbnQJIGNsaWVudF9zaW1wbGVfZXNjYXBlX2ZpbHRlcihDaGFubmVsICosIGNoYXIgKiwgaW50KTsKLQotLyogR2xvYmFsIHJlcXVlc3QgY29uZmlybWF0aW9uIGNhbGxiYWNrcyAqLwotdHlwZWRlZiB2b2lkIGdsb2JhbF9jb25maXJtX2NiKGludCwgdV9pbnQzMl90IHNlcSwgdm9pZCAqKTsKLXZvaWQJIGNsaWVudF9yZWdpc3Rlcl9nbG9iYWxfY29uZmlybShnbG9iYWxfY29uZmlybV9jYiAqLCB2b2lkICopOwotCi0vKiBDaGFubmVsIHJlcXVlc3QgY29uZmlybWF0aW9uIGNhbGxiYWNrcyAqLwotZW51bSBjb25maXJtX2FjdGlvbiB7IENPTkZJUk1fV0FSTiA9IDAsIENPTkZJUk1fQ0xPU0UsIENPTkZJUk1fVFRZIH07Ci12b2lkIGNsaWVudF9leHBlY3RfY29uZmlybShpbnQsIGNvbnN0IGNoYXIgKiwgZW51bSBjb25maXJtX2FjdGlvbik7Ci0KLS8qIE11bHRpcGxleGluZyBwcm90b2NvbCB2ZXJzaW9uICovCi0jZGVmaW5lIFNTSE1VWF9WRVIJCQk0Ci0KLS8qIE11bHRpcGxleGluZyBjb250cm9sIHByb3RvY29sIGZsYWdzICovCi0jZGVmaW5lIFNTSE1VWF9DT01NQU5EX09QRU4JCTEJLyogT3BlbiBuZXcgY29ubmVjdGlvbiAqLwotI2RlZmluZSBTU0hNVVhfQ09NTUFORF9BTElWRV9DSEVDSwkyCS8qIENoZWNrIG1hc3RlciBpcyBhbGl2ZSAqLwotI2RlZmluZSBTU0hNVVhfQ09NTUFORF9URVJNSU5BVEUJMwkvKiBBc2sgbWFzdGVyIHRvIGV4aXQgKi8KLSNkZWZpbmUgU1NITVVYX0NPTU1BTkRfU1RESU9fRldECTQJLyogT3BlbiBzdGRpbyBmd2QgKHNzaCAtVykgKi8KLSNkZWZpbmUgU1NITVVYX0NPTU1BTkRfRk9SV0FSRAkJNQkvKiBGb3J3YXJkIG9ubHksIG5vIGNvbW1hbmQgKi8KLSNkZWZpbmUgU1NITVVYX0NPTU1BTkRfU1RPUAkJNgkvKiBEaXNhYmxlIG11eCBidXQgbm90IGNvbm4gKi8KLQotdm9pZAltdXhzZXJ2ZXJfbGlzdGVuKHZvaWQpOwotdm9pZAltdXhjbGllbnQoY29uc3QgY2hhciAqKTsKLXZvaWQJbXV4X2V4aXRfbWVzc2FnZShDaGFubmVsICosIGludCk7Ci12b2lkCW11eF90dHlfYWxsb2NfZmFpbGVkKENoYW5uZWwgKik7Ci0KZGlmZiAtLWdpdCBhL2NvbXBhdC5jIGIvY29tcGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzU0MWQuLjAwMDAwMDAKLS0tIGEvY29tcGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGNvbXBhdC5jLHYgMS43OCAyMDA4LzA5LzExIDE0OjIyOjM3IG1hcmt1cyBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgInBhY2tldC5oIgotI2luY2x1ZGUgImNvbXBhdC5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgIm1hdGNoLmgiCi0KLWludCBjb21wYXQxMyA9IDA7Ci1pbnQgY29tcGF0MjAgPSAwOwotaW50IGRhdGFmZWxsb3dzID0gMDsKLQotdm9pZAotZW5hYmxlX2NvbXBhdDIwKHZvaWQpCi17Ci0JZGVidWcoIkVuYWJsaW5nIGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgcHJvdG9jb2wgMi4wIik7Ci0JY29tcGF0MjAgPSAxOwotfQotdm9pZAotZW5hYmxlX2NvbXBhdDEzKHZvaWQpCi17Ci0JZGVidWcoIkVuYWJsaW5nIGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgcHJvdG9jb2wgMS4zIik7Ci0JY29tcGF0MTMgPSAxOwotfQotLyogZGF0YWZlbGxvd3MgYnVnIGNvbXBhdGliaWxpdHkgKi8KLXZvaWQKLWNvbXBhdF9kYXRhZmVsbG93cyhjb25zdCBjaGFyICp2ZXJzaW9uKQotewotCWludCBpOwotCXN0YXRpYyBzdHJ1Y3QgewotCQljaGFyCSpwYXQ7Ci0JCWludAlidWdzOwotCX0gY2hlY2tbXSA9IHsKLQkJeyAiT3BlblNTSC0yLjAqLCIKLQkJICAiT3BlblNTSC0yLjEqLCIKLQkJICAiT3BlblNTSF8yLjEqLCIKLQkJICAiT3BlblNTSF8yLjIqIiwJU1NIX09MRF9TRVNTSU9OSUR8U1NIX0JVR19CQU5ORVJ8Ci0JCQkJCVNTSF9PTERfREhHRVh8U1NIX0JVR19OT1JFS0VZfAotCQkJCQlTU0hfQlVHX0VYVEVPRnxTU0hfT0xEX0ZPUldBUkRfQUREUn0sCi0JCXsgIk9wZW5TU0hfMi4zLjAqIiwJU1NIX0JVR19CQU5ORVJ8U1NIX0JVR19CSUdFTkRJQU5BRVN8Ci0JCQkJCVNTSF9PTERfREhHRVh8U1NIX0JVR19OT1JFS0VZfAotCQkJCQlTU0hfQlVHX0VYVEVPRnxTU0hfT0xEX0ZPUldBUkRfQUREUn0sCi0JCXsgIk9wZW5TU0hfMi4zLioiLAlTU0hfQlVHX0JJR0VORElBTkFFU3xTU0hfT0xEX0RIR0VYfAotCQkJCQlTU0hfQlVHX05PUkVLRVl8U1NIX0JVR19FWFRFT0Z8Ci0JCQkJCVNTSF9PTERfRk9SV0FSRF9BRERSfSwKLQkJeyAiT3BlblNTSF8yLjUuMHAxKiwiCi0JCSAgIk9wZW5TU0hfMi41LjFwMSoiLAotCQkJCQlTU0hfQlVHX0JJR0VORElBTkFFU3xTU0hfT0xEX0RIR0VYfAotCQkJCQlTU0hfQlVHX05PUkVLRVl8U1NIX0JVR19FWFRFT0Z8Ci0JCQkJCVNTSF9PTERfRk9SV0FSRF9BRERSfSwKLQkJeyAiT3BlblNTSF8yLjUuMCosIgotCQkgICJPcGVuU1NIXzIuNS4xKiwiCi0JCSAgIk9wZW5TU0hfMi41LjIqIiwJU1NIX09MRF9ESEdFWHxTU0hfQlVHX05PUkVLRVl8Ci0JCQkJCVNTSF9CVUdfRVhURU9GfFNTSF9PTERfRk9SV0FSRF9BRERSfSwKLQkJeyAiT3BlblNTSF8yLjUuMyoiLAlTU0hfQlVHX05PUkVLRVl8U1NIX0JVR19FWFRFT0Z8Ci0JCQkJCVNTSF9PTERfRk9SV0FSRF9BRERSfSwKLQkJeyAiT3BlblNTSF8yLiosIgotCQkgICJPcGVuU1NIXzMuMCosIgotCQkgICJPcGVuU1NIXzMuMSoiLAlTU0hfQlVHX0VYVEVPRnxTU0hfT0xEX0ZPUldBUkRfQUREUn0sCi0JCXsgIk9wZW5TU0hfMy4qIiwJU1NIX09MRF9GT1JXQVJEX0FERFIgfSwKLQkJeyAiU3VuX1NTSF8xLjAqIiwJU1NIX0JVR19OT1JFS0VZfFNTSF9CVUdfRVhURU9GfSwKLQkJeyAiT3BlblNTSF80KiIsCQkwIH0sCi0JCXsgIk9wZW5TU0gqIiwJCVNTSF9ORVdfT1BFTlNTSCB9LAotCQl7ICIqTWluZFRlcm0qIiwJCTAgfSwKLQkJeyAiMi4xLjAqIiwJCVNTSF9CVUdfU0lHQkxPQnxTU0hfQlVHX0hNQUN8Ci0JCQkJCVNTSF9PTERfU0VTU0lPTklEfFNTSF9CVUdfREVCVUd8Ci0JCQkJCVNTSF9CVUdfUlNBU0lHTUQ1fFNTSF9CVUdfSEJTRVJWSUNFfAotCQkJCQlTU0hfQlVHX0ZJUlNUS0VYIH0sCi0JCXsgIjIuMSAqIiwJCVNTSF9CVUdfU0lHQkxPQnxTU0hfQlVHX0hNQUN8Ci0JCQkJCVNTSF9PTERfU0VTU0lPTklEfFNTSF9CVUdfREVCVUd8Ci0JCQkJCVNTSF9CVUdfUlNBU0lHTUQ1fFNTSF9CVUdfSEJTRVJWSUNFfAotCQkJCQlTU0hfQlVHX0ZJUlNUS0VYIH0sCi0JCXsgIjIuMC4xMyosIgotCQkgICIyLjAuMTQqLCIKLQkJICAiMi4wLjE1KiwiCi0JCSAgIjIuMC4xNiosIgotCQkgICIyLjAuMTcqLCIKLQkJICAiMi4wLjE4KiwiCi0JCSAgIjIuMC4xOSoiLAkJU1NIX0JVR19TSUdCTE9CfFNTSF9CVUdfSE1BQ3wKLQkJCQkJU1NIX09MRF9TRVNTSU9OSUR8U1NIX0JVR19ERUJVR3wKLQkJCQkJU1NIX0JVR19QS1NFUlZJQ0V8U1NIX0JVR19YMTFGV0R8Ci0JCQkJCVNTSF9CVUdfUEtPS3xTU0hfQlVHX1JTQVNJR01ENXwKLQkJCQkJU1NIX0JVR19IQlNFUlZJQ0V8U1NIX0JVR19PUEVORkFJTFVSRXwKLQkJCQkJU1NIX0JVR19EVU1NWUNIQU58U1NIX0JVR19GSVJTVEtFWCB9LAotCQl7ICIyLjAuMTEqLCIKLQkJICAiMi4wLjEyKiIsCQlTU0hfQlVHX1NJR0JMT0J8U1NIX0JVR19ITUFDfAotCQkJCQlTU0hfT0xEX1NFU1NJT05JRHxTU0hfQlVHX0RFQlVHfAotCQkJCQlTU0hfQlVHX1BLU0VSVklDRXxTU0hfQlVHX1gxMUZXRHwKLQkJCQkJU1NIX0JVR19QS0FVVEh8U1NIX0JVR19QS09LfAotCQkJCQlTU0hfQlVHX1JTQVNJR01ENXxTU0hfQlVHX09QRU5GQUlMVVJFfAotCQkJCQlTU0hfQlVHX0RVTU1ZQ0hBTnxTU0hfQlVHX0ZJUlNUS0VYIH0sCi0JCXsgIjIuMC4qIiwJCVNTSF9CVUdfU0lHQkxPQnxTU0hfQlVHX0hNQUN8Ci0JCQkJCVNTSF9PTERfU0VTU0lPTklEfFNTSF9CVUdfREVCVUd8Ci0JCQkJCVNTSF9CVUdfUEtTRVJWSUNFfFNTSF9CVUdfWDExRldEfAotCQkJCQlTU0hfQlVHX1BLQVVUSHxTU0hfQlVHX1BLT0t8Ci0JCQkJCVNTSF9CVUdfUlNBU0lHTUQ1fFNTSF9CVUdfT1BFTkZBSUxVUkV8Ci0JCQkJCVNTSF9CVUdfREVSSVZFS0VZfFNTSF9CVUdfRFVNTVlDSEFOfAotCQkJCQlTU0hfQlVHX0ZJUlNUS0VYIH0sCi0JCXsgIjIuMi4wKiwiCi0JCSAgIjIuMy4wKiIsCQlTU0hfQlVHX0hNQUN8U1NIX0JVR19ERUJVR3wKLQkJCQkJU1NIX0JVR19SU0FTSUdNRDV8U1NIX0JVR19GSVJTVEtFWCB9LAotCQl7ICIyLjMuKiIsCQlTU0hfQlVHX0RFQlVHfFNTSF9CVUdfUlNBU0lHTUQ1fAotCQkJCQlTU0hfQlVHX0ZJUlNUS0VYIH0sCi0JCXsgIjIuNCIsCQlTU0hfT0xEX1NFU1NJT05JRCB9LAkvKiBWYW4gRHlrZSAqLwotCQl7ICIyLioiLAkJU1NIX0JVR19ERUJVR3xTU0hfQlVHX0ZJUlNUS0VYfAotCQkJCQlTU0hfQlVHX1JGV0RfQUREUiB9LAotCQl7ICIzLjAuKiIsCQlTU0hfQlVHX0RFQlVHIH0sCi0JCXsgIjMuMCBTZWN1cmVDUlQqIiwJU1NIX09MRF9TRVNTSU9OSUQgfSwKLQkJeyAiMS43IFNlY3VyZUZYKiIsCVNTSF9PTERfU0VTU0lPTklEIH0sCi0JCXsgIjEuMi4xOCosIgotCQkgICIxLjIuMTkqLCIKLQkJICAiMS4yLjIwKiwiCi0JCSAgIjEuMi4yMSosIgotCQkgICIxLjIuMjIqIiwJCVNTSF9CVUdfSUdOT1JFTVNHIH0sCi0JCXsgIjEuMy4yKiIsCQkvKiBGLVNlY3VyZSAqLwotCQkJCQlTU0hfQlVHX0lHTk9SRU1TRyB9LAotCQl7ICIqU1NIIENvbXBhdGlibGUgU2VydmVyKiIsCQkJLyogTmV0c2NyZWVuICovCi0JCQkJCVNTSF9CVUdfUEFTU1dPUkRQQUQgfSwKLQkJeyAiKk9TVV8wKiwiCi0JCSAgIk9TVV8xLjAqLCIKLQkJICAiT1NVXzEuMSosIgotCQkgICJPU1VfMS4yKiwiCi0JCSAgIk9TVV8xLjMqLCIKLQkJICAiT1NVXzEuNCosIgotCQkgICJPU1VfMS41YWxwaGExKiwiCi0JCSAgIk9TVV8xLjVhbHBoYTIqLCIKLQkJICAiT1NVXzEuNWFscGhhMyoiLAlTU0hfQlVHX1BBU1NXT1JEUEFEIH0sCi0JCXsgIipTU0hfVmVyc2lvbl9NYXBwZXIqIiwKLQkJCQkJU1NIX0JVR19TQ0FOTkVSIH0sCi0JCXsgIlByb2JlLSoiLAotCQkJCQlTU0hfQlVHX1BST0JFIH0sCi0JCXsgTlVMTCwJCQkwIH0KLQl9OwotCi0JLyogcHJvY2VzcyB0YWJsZSwgcmV0dXJuIGZpcnN0IG1hdGNoICovCi0JZm9yIChpID0gMDsgY2hlY2tbaV0ucGF0OyBpKyspIHsKLQkJaWYgKG1hdGNoX3BhdHRlcm5fbGlzdCh2ZXJzaW9uLCBjaGVja1tpXS5wYXQsCi0JCSAgICBzdHJsZW4oY2hlY2tbaV0ucGF0KSwgMCkgPT0gMSkgewotCQkJZGVidWcoIm1hdGNoOiAlcyBwYXQgJXMiLCB2ZXJzaW9uLCBjaGVja1tpXS5wYXQpOwotCQkJZGF0YWZlbGxvd3MgPSBjaGVja1tpXS5idWdzOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCWRlYnVnKCJubyBtYXRjaDogJXMiLCB2ZXJzaW9uKTsKLX0KLQotI2RlZmluZQlTRVAJIiwiCi1pbnQKLXByb3RvX3NwZWMoY29uc3QgY2hhciAqc3BlYykKLXsKLQljaGFyICpzLCAqcCwgKnE7Ci0JaW50IHJldCA9IFNTSF9QUk9UT19VTktOT1dOOwotCi0JaWYgKHNwZWMgPT0gTlVMTCkKLQkJcmV0dXJuIHJldDsKLQlxID0gcyA9IHhzdHJkdXAoc3BlYyk7Ci0JZm9yICgocCA9IHN0cnNlcCgmcSwgU0VQKSk7IHAgJiYgKnAgIT0gJ1wwJzsgKHAgPSBzdHJzZXAoJnEsIFNFUCkpKSB7Ci0JCXN3aXRjaCAoYXRvaShwKSkgewotCQljYXNlIDE6Ci0JCQlpZiAocmV0ID09IFNTSF9QUk9UT19VTktOT1dOKQotCQkJCXJldCB8PSBTU0hfUFJPVE9fMV9QUkVGRVJSRUQ7Ci0JCQlyZXQgfD0gU1NIX1BST1RPXzE7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJcmV0IHw9IFNTSF9QUk9UT18yOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlsb2dpdCgiaWdub3JpbmcgYmFkIHByb3RvIHNwZWM6ICclcycuIiwgcCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQl4ZnJlZShzKTsKLQlyZXR1cm4gcmV0OwotfQotCi1jaGFyICoKLWNvbXBhdF9jaXBoZXJfcHJvcG9zYWwoY2hhciAqY2lwaGVyX3Byb3ApCi17Ci0JQnVmZmVyIGI7Ci0JY2hhciAqb3JpZ19wcm9wLCAqZml4X2NpcGhlcnM7Ci0JY2hhciAqY3AsICp0bXA7Ci0KLQlpZiAoIShkYXRhZmVsbG93cyAmIFNTSF9CVUdfQklHRU5ESUFOQUVTKSkKLQkJcmV0dXJuKGNpcGhlcl9wcm9wKTsKLQotCWJ1ZmZlcl9pbml0KCZiKTsKLQl0bXAgPSBvcmlnX3Byb3AgPSB4c3RyZHVwKGNpcGhlcl9wcm9wKTsKLQl3aGlsZSAoKGNwID0gc3Ryc2VwKCZ0bXAsICIsIikpICE9IE5VTEwpIHsKLQkJaWYgKHN0cm5jbXAoY3AsICJhZXMiLCAzKSAhPSAwKSB7Ci0JCQlpZiAoYnVmZmVyX2xlbigmYikgPiAwKQotCQkJCWJ1ZmZlcl9hcHBlbmQoJmIsICIsIiwgMSk7Ci0JCQlidWZmZXJfYXBwZW5kKCZiLCBjcCwgc3RybGVuKGNwKSk7Ci0JCX0KLQl9Ci0JYnVmZmVyX2FwcGVuZCgmYiwgIlwwIiwgMSk7Ci0JZml4X2NpcGhlcnMgPSB4c3RyZHVwKGJ1ZmZlcl9wdHIoJmIpKTsKLQlidWZmZXJfZnJlZSgmYik7Ci0JeGZyZWUob3JpZ19wcm9wKTsKLQlkZWJ1ZzIoIk9yaWdpbmFsIGNpcGhlciBwcm9wb3NhbDogJXMiLCBjaXBoZXJfcHJvcCk7Ci0JZGVidWcyKCJDb21wYXQgY2lwaGVyIHByb3Bvc2FsOiAlcyIsIGZpeF9jaXBoZXJzKTsKLQlpZiAoISpmaXhfY2lwaGVycykKLQkJZmF0YWwoIk5vIGF2YWlsYWJsZSBjaXBoZXJzIGZvdW5kLiIpOwotCi0JcmV0dXJuKGZpeF9jaXBoZXJzKTsKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdC5oIGIvY29tcGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Y2YyODIuLjAwMDAwMDAKLS0tIGEvY29tcGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKiAkT3BlbkJTRDogY29tcGF0LmgsdiAxLjQyIDIwMDgvMDkvMTEgMTQ6MjI6MzcgbWFya3VzIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAsIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgQ09NUEFUX0gKLSNkZWZpbmUgQ09NUEFUX0gKLQotI2RlZmluZQlTU0hfUFJPVE9fVU5LTk9XTgkweDAwCi0jZGVmaW5lCVNTSF9QUk9UT18xCQkweDAxCi0jZGVmaW5lCVNTSF9QUk9UT18xX1BSRUZFUlJFRAkweDAyCi0jZGVmaW5lCVNTSF9QUk9UT18yCQkweDA0Ci0KLSNkZWZpbmUgU1NIX0JVR19TSUdCTE9CCQkweDAwMDAwMDAxCi0jZGVmaW5lIFNTSF9CVUdfUEtTRVJWSUNFCTB4MDAwMDAwMDIKLSNkZWZpbmUgU1NIX0JVR19ITUFDCQkweDAwMDAwMDA0Ci0jZGVmaW5lIFNTSF9CVUdfWDExRldECQkweDAwMDAwMDA4Ci0jZGVmaW5lIFNTSF9PTERfU0VTU0lPTklECTB4MDAwMDAwMTAKLSNkZWZpbmUgU1NIX0JVR19QS0FVVEgJCTB4MDAwMDAwMjAKLSNkZWZpbmUgU1NIX0JVR19ERUJVRwkJMHgwMDAwMDA0MAotI2RlZmluZSBTU0hfQlVHX0JBTk5FUgkJMHgwMDAwMDA4MAotI2RlZmluZSBTU0hfQlVHX0lHTk9SRU1TRwkweDAwMDAwMTAwCi0jZGVmaW5lIFNTSF9CVUdfUEtPSwkJMHgwMDAwMDIwMAotI2RlZmluZSBTU0hfQlVHX1BBU1NXT1JEUEFECTB4MDAwMDA0MDAKLSNkZWZpbmUgU1NIX0JVR19TQ0FOTkVSCQkweDAwMDAwODAwCi0jZGVmaW5lIFNTSF9CVUdfQklHRU5ESUFOQUVTCTB4MDAwMDEwMDAKLSNkZWZpbmUgU1NIX0JVR19SU0FTSUdNRDUJMHgwMDAwMjAwMAotI2RlZmluZSBTU0hfT0xEX0RIR0VYCQkweDAwMDA0MDAwCi0jZGVmaW5lIFNTSF9CVUdfTk9SRUtFWQkJMHgwMDAwODAwMAotI2RlZmluZSBTU0hfQlVHX0hCU0VSVklDRQkweDAwMDEwMDAwCi0jZGVmaW5lIFNTSF9CVUdfT1BFTkZBSUxVUkUJMHgwMDAyMDAwMAotI2RlZmluZSBTU0hfQlVHX0RFUklWRUtFWQkweDAwMDQwMDAwCi0jZGVmaW5lIFNTSF9CVUdfRFVNTVlDSEFOCTB4MDAxMDAwMDAKLSNkZWZpbmUgU1NIX0JVR19FWFRFT0YJCTB4MDAyMDAwMDAKLSNkZWZpbmUgU1NIX0JVR19QUk9CRQkJMHgwMDQwMDAwMAotI2RlZmluZSBTU0hfQlVHX0ZJUlNUS0VYCTB4MDA4MDAwMDAKLSNkZWZpbmUgU1NIX09MRF9GT1JXQVJEX0FERFIJMHgwMTAwMDAwMAotI2RlZmluZSBTU0hfQlVHX1JGV0RfQUREUgkweDAyMDAwMDAwCi0jZGVmaW5lIFNTSF9ORVdfT1BFTlNTSAkJMHgwNDAwMDAwMAotCi12b2lkICAgICBlbmFibGVfY29tcGF0MTModm9pZCk7Ci12b2lkICAgICBlbmFibGVfY29tcGF0MjAodm9pZCk7Ci12b2lkICAgICBjb21wYXRfZGF0YWZlbGxvd3MoY29uc3QgY2hhciAqKTsKLWludAkgcHJvdG9fc3BlYyhjb25zdCBjaGFyICopOwotY2hhcgkqY29tcGF0X2NpcGhlcl9wcm9wb3NhbChjaGFyICopOwotCi1leHRlcm4gaW50IGNvbXBhdDEzOwotZXh0ZXJuIGludCBjb21wYXQyMDsKLWV4dGVybiBpbnQgZGF0YWZlbGxvd3M7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXByZXNzLmMgYi9jb21wcmVzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDc3OGU1Li4wMDAwMDAwCi0tLSBhL2NvbXByZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGNvbXByZXNzLmMsdiAxLjI2IDIwMTAvMDkvMDggMDQ6MTM6MzEgZGVyYWFkdCBFeHAgJCAqLwotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIEludGVyZmFjZSB0byBwYWNrZXQgY29tcHJlc3Npb24gZm9yIHNzaC4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImNvbXByZXNzLmgiCi0KLSNpbmNsdWRlIDx6bGliLmg+Ci0KLXpfc3RyZWFtIGluY29taW5nX3N0cmVhbTsKLXpfc3RyZWFtIG91dGdvaW5nX3N0cmVhbTsKLXN0YXRpYyBpbnQgY29tcHJlc3NfaW5pdF9zZW5kX2NhbGxlZCA9IDA7Ci1zdGF0aWMgaW50IGNvbXByZXNzX2luaXRfcmVjdl9jYWxsZWQgPSAwOwotc3RhdGljIGludCBpbmZsYXRlX2ZhaWxlZCA9IDA7Ci1zdGF0aWMgaW50IGRlZmxhdGVfZmFpbGVkID0gMDsKLQotLyoKLSAqIEluaXRpYWxpemVzIGNvbXByZXNzaW9uOyBsZXZlbCBpcyBjb21wcmVzc2lvbiBsZXZlbCBmcm9tIDEgdG8gOQotICogKGFzIGluIGd6aXApLgotICovCi0KLXZvaWQKLWJ1ZmZlcl9jb21wcmVzc19pbml0X3NlbmQoaW50IGxldmVsKQotewotCWlmIChjb21wcmVzc19pbml0X3NlbmRfY2FsbGVkID09IDEpCi0JCWRlZmxhdGVFbmQoJm91dGdvaW5nX3N0cmVhbSk7Ci0JY29tcHJlc3NfaW5pdF9zZW5kX2NhbGxlZCA9IDE7Ci0JZGVidWcoIkVuYWJsaW5nIGNvbXByZXNzaW9uIGF0IGxldmVsICVkLiIsIGxldmVsKTsKLQlpZiAobGV2ZWwgPCAxIHx8IGxldmVsID4gOSkKLQkJZmF0YWwoIkJhZCBjb21wcmVzc2lvbiBsZXZlbCAlZC4iLCBsZXZlbCk7Ci0JZGVmbGF0ZUluaXQoJm91dGdvaW5nX3N0cmVhbSwgbGV2ZWwpOwotfQotdm9pZAotYnVmZmVyX2NvbXByZXNzX2luaXRfcmVjdih2b2lkKQotewotCWlmIChjb21wcmVzc19pbml0X3JlY3ZfY2FsbGVkID09IDEpCi0JCWluZmxhdGVFbmQoJmluY29taW5nX3N0cmVhbSk7Ci0JY29tcHJlc3NfaW5pdF9yZWN2X2NhbGxlZCA9IDE7Ci0JaW5mbGF0ZUluaXQoJmluY29taW5nX3N0cmVhbSk7Ci19Ci0KLS8qIEZyZWVzIGFueSBkYXRhIHN0cnVjdHVyZXMgYWxsb2NhdGVkIGZvciBjb21wcmVzc2lvbi4gKi8KLQotdm9pZAotYnVmZmVyX2NvbXByZXNzX3VuaW5pdCh2b2lkKQotewotCWRlYnVnKCJjb21wcmVzcyBvdXRnb2luZzogcmF3IGRhdGEgJWxsdSwgY29tcHJlc3NlZCAlbGx1LCBmYWN0b3IgJS4yZiIsCi0JICAgICh1bnNpZ25lZCBsb25nIGxvbmcpb3V0Z29pbmdfc3RyZWFtLnRvdGFsX2luLAotCSAgICAodW5zaWduZWQgbG9uZyBsb25nKW91dGdvaW5nX3N0cmVhbS50b3RhbF9vdXQsCi0JICAgIG91dGdvaW5nX3N0cmVhbS50b3RhbF9pbiA9PSAwID8gMC4wIDoKLQkgICAgKGRvdWJsZSkgb3V0Z29pbmdfc3RyZWFtLnRvdGFsX291dCAvIG91dGdvaW5nX3N0cmVhbS50b3RhbF9pbik7Ci0JZGVidWcoImNvbXByZXNzIGluY29taW5nOiByYXcgZGF0YSAlbGx1LCBjb21wcmVzc2VkICVsbHUsIGZhY3RvciAlLjJmIiwKLQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpbmNvbWluZ19zdHJlYW0udG90YWxfb3V0LAotCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWluY29taW5nX3N0cmVhbS50b3RhbF9pbiwKLQkgICAgaW5jb21pbmdfc3RyZWFtLnRvdGFsX291dCA9PSAwID8gMC4wIDoKLQkgICAgKGRvdWJsZSkgaW5jb21pbmdfc3RyZWFtLnRvdGFsX2luIC8gaW5jb21pbmdfc3RyZWFtLnRvdGFsX291dCk7Ci0JaWYgKGNvbXByZXNzX2luaXRfcmVjdl9jYWxsZWQgPT0gMSAmJiBpbmZsYXRlX2ZhaWxlZCA9PSAwKQotCQlpbmZsYXRlRW5kKCZpbmNvbWluZ19zdHJlYW0pOwotCWlmIChjb21wcmVzc19pbml0X3NlbmRfY2FsbGVkID09IDEgJiYgZGVmbGF0ZV9mYWlsZWQgPT0gMCkKLQkJZGVmbGF0ZUVuZCgmb3V0Z29pbmdfc3RyZWFtKTsKLX0KLQotLyoKLSAqIENvbXByZXNzZXMgdGhlIGNvbnRlbnRzIG9mIGlucHV0X2J1ZmZlciBpbnRvIG91dHB1dF9idWZmZXIuICBBbGwgcGFja2V0cwotICogY29tcHJlc3NlZCB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgZm9ybSBhIHNpbmdsZSBjb21wcmVzc2VkIGRhdGEgc3RyZWFtOwotICogaG93ZXZlciwgZGF0YSB3aWxsIGJlIGZsdXNoZWQgYXQgdGhlIGVuZCBvZiBldmVyeSBjYWxsIHNvIHRoYXQgZWFjaAotICogb3V0cHV0X2J1ZmZlciBjYW4gYmUgZGVjb21wcmVzc2VkIGluZGVwZW5kZW50bHkgKGJ1dCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAqIG9yZGVyIHNpbmNlIHRoZXkgdG9nZXRoZXIgZm9ybSBhIHNpbmdsZSBjb21wcmVzc2lvbiBzdHJlYW0pIGJ5IHRoZQotICogcmVjZWl2ZXIuICBUaGlzIGFwcGVuZHMgdGhlIGNvbXByZXNzZWQgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KLSAqLwotCi12b2lkCi1idWZmZXJfY29tcHJlc3MoQnVmZmVyICogaW5wdXRfYnVmZmVyLCBCdWZmZXIgKiBvdXRwdXRfYnVmZmVyKQotewotCXVfY2hhciBidWZbNDA5Nl07Ci0JaW50IHN0YXR1czsKLQotCS8qIFRoaXMgY2FzZSBpcyBub3QgaGFuZGxlZCBiZWxvdy4gKi8KLQlpZiAoYnVmZmVyX2xlbihpbnB1dF9idWZmZXIpID09IDApCi0JCXJldHVybjsKLQotCS8qIElucHV0IGlzIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgYnVmZmVyLiAqLwotCW91dGdvaW5nX3N0cmVhbS5uZXh0X2luID0gYnVmZmVyX3B0cihpbnB1dF9idWZmZXIpOwotCW91dGdvaW5nX3N0cmVhbS5hdmFpbF9pbiA9IGJ1ZmZlcl9sZW4oaW5wdXRfYnVmZmVyKTsKLQotCS8qIExvb3AgY29tcHJlc3NpbmcgdW50aWwgZGVmbGF0ZSgpIHJldHVybnMgd2l0aCBhdmFpbF9vdXQgIT0gMC4gKi8KLQlkbyB7Ci0JCS8qIFNldCB1cCBmaXhlZC1zaXplIG91dHB1dCBidWZmZXIuICovCi0JCW91dGdvaW5nX3N0cmVhbS5uZXh0X291dCA9IGJ1ZjsKLQkJb3V0Z29pbmdfc3RyZWFtLmF2YWlsX291dCA9IHNpemVvZihidWYpOwotCi0JCS8qIENvbXByZXNzIGFzIG11Y2ggZGF0YSBpbnRvIHRoZSBidWZmZXIgYXMgcG9zc2libGUuICovCi0JCXN0YXR1cyA9IGRlZmxhdGUoJm91dGdvaW5nX3N0cmVhbSwgWl9QQVJUSUFMX0ZMVVNIKTsKLQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJY2FzZSBaX09LOgotCQkJLyogQXBwZW5kIGNvbXByZXNzZWQgZGF0YSB0byBvdXRwdXRfYnVmZmVyLiAqLwotCQkJYnVmZmVyX2FwcGVuZChvdXRwdXRfYnVmZmVyLCBidWYsCi0JCQkgICAgc2l6ZW9mKGJ1ZikgLSBvdXRnb2luZ19zdHJlYW0uYXZhaWxfb3V0KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGVmbGF0ZV9mYWlsZWQgPSAxOwotCQkJZmF0YWwoImJ1ZmZlcl9jb21wcmVzczogZGVmbGF0ZSByZXR1cm5lZCAlZCIsIHN0YXR1cyk7Ci0JCQkvKiBOT1RSRUFDSEVEICovCi0JCX0KLQl9IHdoaWxlIChvdXRnb2luZ19zdHJlYW0uYXZhaWxfb3V0ID09IDApOwotfQotCi0vKgotICogVW5jb21wcmVzc2VzIHRoZSBjb250ZW50cyBvZiBpbnB1dF9idWZmZXIgaW50byBvdXRwdXRfYnVmZmVyLiAgQWxsIHBhY2tldHMKLSAqIHVuY29tcHJlc3NlZCB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgZm9ybSBhIHNpbmdsZSBjb21wcmVzc2VkIGRhdGEKLSAqIHN0cmVhbTsgaG93ZXZlciwgZGF0YSB3aWxsIGJlIGZsdXNoZWQgYXQgdGhlIGVuZCBvZiBldmVyeSBjYWxsIHNvIHRoYXQKLSAqIGVhY2ggb3V0cHV0X2J1ZmZlci4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgZm9yIHRoZSBzYW1lIHNpemUgdW5pdHMgdGhhdCB0aGUKLSAqIGJ1ZmZlcl9jb21wcmVzcyB3YXMgY2FsbGVkLCBhbmQgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCBidWZmZXJzIGNvbXByZXNzZWQKLSAqIHdpdGggdGhhdC4gIFRoaXMgYXBwZW5kcyB0aGUgdW5jb21wcmVzc2VkIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIuCi0gKi8KLQotdm9pZAotYnVmZmVyX3VuY29tcHJlc3MoQnVmZmVyICogaW5wdXRfYnVmZmVyLCBCdWZmZXIgKiBvdXRwdXRfYnVmZmVyKQotewotCXVfY2hhciBidWZbNDA5Nl07Ci0JaW50IHN0YXR1czsKLQotCWluY29taW5nX3N0cmVhbS5uZXh0X2luID0gYnVmZmVyX3B0cihpbnB1dF9idWZmZXIpOwotCWluY29taW5nX3N0cmVhbS5hdmFpbF9pbiA9IGJ1ZmZlcl9sZW4oaW5wdXRfYnVmZmVyKTsKLQotCWZvciAoOzspIHsKLQkJLyogU2V0IHVwIGZpeGVkLXNpemUgb3V0cHV0IGJ1ZmZlci4gKi8KLQkJaW5jb21pbmdfc3RyZWFtLm5leHRfb3V0ID0gYnVmOwotCQlpbmNvbWluZ19zdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZW9mKGJ1Zik7Ci0KLQkJc3RhdHVzID0gaW5mbGF0ZSgmaW5jb21pbmdfc3RyZWFtLCBaX1BBUlRJQUxfRkxVU0gpOwotCQlzd2l0Y2ggKHN0YXR1cykgewotCQljYXNlIFpfT0s6Ci0JCQlidWZmZXJfYXBwZW5kKG91dHB1dF9idWZmZXIsIGJ1ZiwKLQkJCSAgICBzaXplb2YoYnVmKSAtIGluY29taW5nX3N0cmVhbS5hdmFpbF9vdXQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgWl9CVUZfRVJST1I6Ci0JCQkvKgotCQkJICogQ29tbWVudHMgaW4gemxpYi5oIHNheSB0aGF0IHdlIHNob3VsZCBrZWVwIGNhbGxpbmcKLQkJCSAqIGluZmxhdGUoKSB1bnRpbCB3ZSBnZXQgYW4gZXJyb3IuICBUaGlzIGFwcGVhcnMgdG8KLQkJCSAqIGJlIHRoZSBlcnJvciB0aGF0IHdlIGdldC4KLQkJCSAqLwotCQkJcmV0dXJuOwotCQlkZWZhdWx0OgotCQkJaW5mbGF0ZV9mYWlsZWQgPSAxOwotCQkJZmF0YWwoImJ1ZmZlcl91bmNvbXByZXNzOiBpbmZsYXRlIHJldHVybmVkICVkIiwgc3RhdHVzKTsKLQkJCS8qIE5PVFJFQUNIRUQgKi8KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbXByZXNzLmggYi9jb21wcmVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MThkNmZkLi4wMDAwMDAwCi0tLSBhL2NvbXByZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiAkT3BlbkJTRDogY29tcHJlc3MuaCx2IDEuMTIgMjAwNi8wMy8yNSAyMjoyMjo0MyBkam0gRXhwICQgKi8KLQotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIEludGVyZmFjZSB0byBwYWNrZXQgY29tcHJlc3Npb24gZm9yIHNzaC4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpZm5kZWYgQ09NUFJFU1NfSAotI2RlZmluZSBDT01QUkVTU19ICi0KLXZvaWQJIGJ1ZmZlcl9jb21wcmVzc19pbml0X3NlbmQoaW50KTsKLXZvaWQJIGJ1ZmZlcl9jb21wcmVzc19pbml0X3JlY3Yodm9pZCk7Ci12b2lkICAgICBidWZmZXJfY29tcHJlc3NfdW5pbml0KHZvaWQpOwotdm9pZCAgICAgYnVmZmVyX2NvbXByZXNzKEJ1ZmZlciAqLCBCdWZmZXIgKik7Ci12b2lkICAgICBidWZmZXJfdW5jb21wcmVzcyhCdWZmZXIgKiwgQnVmZmVyICopOwotCi0jZW5kaWYJCQkJLyogQ09NUFJFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvY29uZmlnLmd1ZXNzIGIvY29uZmlnLmd1ZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODU1M2M0Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy5ndWVzcworKysgL2Rldi9udWxsCkBAIC0xLDE1MTEgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAotIyAgIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLXRpbWVzdGFtcD0nMjAxMS0wMS0yMycKLQotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotIyAwMjExMC0xMzAxLCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotCi0jIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4gIFBsZWFzZSBzZW5kIHBhdGNoZXMgKGNvbnRleHQKLSMgZGlmZiBmb3JtYXQpIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBhbmQgaW5jbHVkZSBhIENoYW5nZUxvZwotIyBlbnRyeS4KLSMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCi0jCi0jIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdCBmcm9tOgotIyBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKLQotbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCi0KLXVzYWdlPSJcCi1Vc2FnZTogJDAgW09QVElPTl0KLQotT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHN5c3RlbSBcYCRtZScgaXMgcnVuIG9uLgotCi1PcGVyYXRpb24gbW9kZXM6Ci0gIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0Ci0gIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0Ci0KLVJlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCi0KLXZlcnNpb249IlwKLUdOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCi0KLU9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwKLTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTwotd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgotCi1oZWxwPSIKLVRyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotIyBQYXJzZSBjb21tYW5kIGxpbmUKLXdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwotICBjYXNlICQxIGluCi0gICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKLSAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OwotICAgIC0taGVscCB8IC0taCogfCAtaCApCi0gICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OwotICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZwotICAgICAgIHNoaWZ0OyBicmVhayA7OwotICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KLSAgICAgICBicmVhayA7OwotICAgIC0qICkKLSAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgotICAgICAgIGV4aXQgMSA7OwotICAgICogKQotICAgICAgIGJyZWFrIDs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAkIyAhPSAwOyB0aGVuCi0gIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgotICBleGl0IDEKLWZpCi0KLXRyYXAgJ2V4aXQgMScgMSAyIDE1Ci0KLSMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKLSMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKLSMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQotIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgotCi0jIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCi0jIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCi0KLSMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KLQotc2V0X2NjX2Zvcl9idWlsZD0nCi10cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKLXRyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Ci06ICR7VE1QRElSPS90bXB9IDsKLSB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8Ci0geyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKLSB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKLSB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7Ci1kdW1teT0kdG1wL2R1bW15IDsKLXRtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOwotY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgotICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOwotCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KLQkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKLQkgIGZpIDsKLQlkb25lIDsKLQlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgotCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKLQlmaQotCTs7Ci0gLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKLSAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Ci1lc2FjIDsgc2V0X2NjX2Zvcl9idWlsZD0gOycKLQotIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KLSMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQotaWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKLWZpCi0KLVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgotVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCi1VTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgotVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCi0KLSMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KLQotY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgotICAgICo6TmV0QlNEOio6KikKLQkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgotCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKLQkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQotCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAotCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKLQkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKLQkjIG9iamVjdCBmaWxlIGZvcm1hdC4KLQkjCi0JIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCi0JIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCi0Jc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgotCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAotCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAotCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KLQkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OwotCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7Ci0JICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7Ci0JICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKLQkgICAgc2g1ZWwpIG1hY2hpbmU9c2g1bGUtdW5rbm93biA7OwotCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7Ci0JZXNhYwotCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAotCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgotCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKLQkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAotCQkJfCBncmVwIC1xIF9fRUxGX18KLQkJdGhlbgotCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgotCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/Ci0JCSAgICBvcz1uZXRic2QKLQkJZWxzZQotCQkgICAgb3M9bmV0YnNkZWxmCi0JCWZpCi0JCTs7Ci0JICAgICopCi0JICAgICAgICBvcz1uZXRic2QKLQkJOzsKLQllc2FjCi0JIyBUaGUgT1MgcmVsZWFzZQotCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCi0JIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAotCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKLQkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KLQljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgotCSAgICBEZWJpYW4qKQotCQlyZWxlYXNlPSctZ251JwotCQk7OwotCSAgICAqKQotCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCQk7OwotCWVzYWMKLQkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKLQkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKLQkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCi0JZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCi0JZXhpdCA7OwotICAgICo6T3BlbkJTRDoqOiopCi0JVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAotCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpla2tvQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOlNvbGlkQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zb2xpZGJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgbWFjcHBjOk1pckJTRDoqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOk1pckJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBhbHBoYTpPU0YxOio6KikKLQljYXNlICRVTkFNRV9SRUxFQVNFIGluCi0JKjQuMCkKLQkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKLQkJOzsKLQkqNS4qKQotCSAgICAgICAgVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDR9J2AKLQkJOzsKLQllc2FjCi0JIyBBY2NvcmRpbmcgdG8gQ29tcGFxLCAvdXNyL3NiaW4vcHNyaW5mbyBoYXMgYmVlbiBhdmFpbGFibGUgb24KLQkjIE9TRi8xIGFuZCBUcnU2NCBzeXN0ZW1zIHByb2R1Y2VkIHNpbmNlIDE5OTUuICBJIGhvcGUgdGhhdAotCSMgY292ZXJzIG1vc3Qgc3lzdGVtcyBydW5uaW5nIHRvZGF5LiAgVGhpcyBjb2RlIHBpcGVzIHRoZSBDUFUKLQkjIHR5cGVzIHRocm91Z2ggaGVhZCAtbiAxLCBzbyB3ZSBvbmx5IGRldGVjdCB0aGUgdHlwZSBvZiBDUFUgMC4KLQlBTFBIQV9DUFVfVFlQRT1gL3Vzci9zYmluL3BzcmluZm8gLXYgfCBzZWQgLW4gLWUgJ3MvXiAgVGhlIGFscGhhIFwoLipcKSBwcm9jZXNzb3IuKiQvXDEvcCcgfCBoZWFkIC1uIDFgCi0JY2FzZSAiJEFMUEhBX0NQVV9UWVBFIiBpbgotCSAgICAiRVY0ICgyMTA2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkVWNC41ICgyMTA2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkxDQTQgKDIxMDY2LzIxMDY4KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OwotCSAgICAiRVY1ICgyMTE2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIgOzsKLQkgICAgIkVWNS42ICgyMTE2NEEpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IiA7OwotCSAgICAiRVY1LjYgKDIxMTY0UEMpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIgOzsKLQkgICAgIkVWNS43ICgyMTE2NFBDKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTciIDs7Ci0JICAgICJFVjYgKDIxMjY0KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IiA7OwotCSAgICAiRVY2LjcgKDIxMjY0QSkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciIDs7Ci0JICAgICJFVjYuOENCICgyMTI2NEMpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OwotCSAgICAiRVY2LjhBTCAoMjEyNjRCKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKLQkgICAgIkVWNi44Q1ggKDIxMjY0RCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7Ci0JICAgICJFVjYuOUEgKDIxMjY0L0VWNjlBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OSIgOzsKLQkgICAgIkVWNyAoMjEzNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjciIDs7Ci0JICAgICJFVjcuOSAoMjEzNjRBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3OSIgOzsKLQllc2FjCi0JIyBBIFBuLm4gdmVyc2lvbiBpcyBhIHBhdGNoZWQgdmVyc2lvbi4KLQkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KLQkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgotCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgotCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1BWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotCSMgUmVzZXQgRVhJVCB0cmFwIGJlZm9yZSBleGl0aW5nIHRvIGF2b2lkIHNwdXJpb3VzIG5vbi16ZXJvIGV4aXQgY29kZS4KLQlleGl0Y29kZT0kPwotCXRyYXAgJycgMAotCWV4aXQgJGV4aXRjb2RlIDs7Ci0gICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKLQkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/Ci0JIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCi0JIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/Ci0JZWNobyBhbHBoYS1wYy1pbnRlcml4Ci0JZXhpdCA7OwotICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKLQllY2hvIGFscGhhLWRlYy13aW5udDMuNQotCWV4aXQgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstdW5rbm93bi1zeXN2NAotCWV4aXQgOzsKLSAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKLQlleGl0IDs7Ci0gICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCi0JZXhpdCA7OwotICAgICo6T1MvMzkwOio6KikKLQllY2hvIGkzNzAtaWJtLW9wZW5lZGl0aW9uCi0JZXhpdCA7OwotICAgICo6ei9WTToqOiopCi0JZWNobyBzMzkwLWlibS16dm1vZQotCWV4aXQgOzsKLSAgICAqOk9TNDAwOio6KikKLSAgICAgICAgZWNobyBwb3dlcnBjLWlibS1vczQwMAotCWV4aXQgOzsKLSAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCi0JZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBhcm06cmlzY29zOio6Knxhcm06UklTQ09TOio6KikKLQllY2hvIGFybS11bmtub3duLXJpc2NvcwotCWV4aXQgOzsKLSAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQotCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKLQlleGl0IDs7Ci0gICAgUHlyYW1pZCo6T1N4KjoqOiogfCBNSVMqOk9TeCo6KjoqIHwgTUlTKjpTTVBfREMtT1N4KjoqOiopCi0JIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KLQlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCi0JZWxzZQotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKLQlmaQotCWV4aXQgOzsKLSAgICBOSUxFKjoqOio6ZGNvc3gpCi0JZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAotCWV4aXQgOzsKLSAgICBEUlM/NjAwMDp1bml4OjQuMDo2KikKLQllY2hvIHNwYXJjLWljbC1ueDYKLQlleGl0IDs7Ci0gICAgRFJTPzYwMDA6VU5JWF9TVjo0LjIqOjcqIHwgRFJTPzYwMDA6aXNpczo0LjIqOjcqKQotCWNhc2UgYC91c3IvYmluL3VuYW1lIC1wYCBpbgotCSAgICBzcGFyYykgZWNobyBzcGFyYy1pY2wtbng3OyBleGl0IDs7Ci0JZXNhYyA7OwotICAgIHMzOTB4OlN1bk9TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCA7OwotICAgIHN1bjRIOlN1bk9TOjUuKjoqKQotCWVjaG8gc3BhcmMtaGFsLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCA7OwotICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgaTg2cGM6QXVyb3JhVVg6NS4qOiogfCBpODZ4ZW46QXVyb3JhVVg6NS4qOiopCi0JZWNobyBpMzg2LXBjLWF1cm9yYXV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBpODZwYzpTdW5PUzo1Lio6KiB8IGk4NnhlbjpTdW5PUzo1Lio6KikKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JU1VOX0FSQ0g9ImkzODYiCi0JIyBJZiB0aGVyZSBpcyBhIGNvbXBpbGVyLCBzZWUgaWYgaXQgaXMgY29uZmlndXJlZCBmb3IgNjQtYml0IG9iamVjdHMuCi0JIyBOb3RlIHRoYXQgdGhlIFN1biBjYyBkb2VzIG5vdCB0dXJuIF9fTFA2NF9fIGludG8gMSBsaWtlIGdjYyBkb2VzLgotCSMgVGhpcyB0ZXN0IHdvcmtzIGZvciBib3RoIGNvbXBpbGVycy4KLQlpZiBbICIkQ0NfRk9SX0JVSUxEIiAhPSAnbm9fY29tcGlsZXJfZm91bmQnIF07IHRoZW4KLQkgICAgaWYgKGVjaG8gJyNpZmRlZiBfX2FtZDY0JzsgZWNobyBJU182NEJJVF9BUkNIOyBlY2hvICcjZW5kaWYnKSB8IFwKLQkJKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8IFwKLQkJZ3JlcCBJU182NEJJVF9BUkNIID4vZGV2L251bGwKLQkgICAgdGhlbgotCQlTVU5fQVJDSD0ieDg2XzY0IgotCSAgICBmaQotCWZpCi0JZWNobyAke1NVTl9BUkNIfS1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgOzsKLSAgICBzdW40KjpTdW5PUzo2KjoqKQotCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCi0JIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKLQkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCA7OwotICAgIHN1bjQqOlN1bk9TOio6KikKLQljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCi0JICAgIFNlcmllcyp8UzQqKQotCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKLQkJOzsKLQllc2FjCi0JIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgotCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCi0JZXhpdCA7OwotICAgIHN1bjMqOlN1bk9TOio6KikKLQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBzdW4qOio6NC4yQlNEOiopCi0JVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKLQl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCi0JY2FzZSAiYC9iaW4vYXJjaGAiIGluCi0JICAgIHN1bjMpCi0JCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JICAgIHN1bjQpCi0JCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCWVzYWMKLQlleGl0IDs7Ci0gICAgYXVzaHA6U3VuT1M6KjoqKQotCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAjIFRoZSBzaXR1YXRpb24gZm9yIE1pTlQgaXMgYSBsaXR0bGUgY29uZnVzaW5nLiAgVGhlIG1hY2hpbmUgbmFtZQotICAgICMgY2FuIGJlIHZpcnR1YWxseSBldmVyeXRoaW5nIChldmVyeXRoaW5nIHdoaWNoIGlzIG5vdAotICAgICMgImF0YXJpc3QiIG9yICJhdGFyaXN0ZSIgYXQgbGVhc3Qgc2hvdWxkIGhhdmUgYSBwcm9jZXNzb3IKLSAgICAjID4gbTY4MDAwKS4gIFRoZSBzeXN0ZW0gbmFtZSByYW5nZXMgZnJvbSAiTWlOVCIgb3ZlciAiRnJlZU1pTlQiCi0gICAgIyB0byB0aGUgbG93ZXJjYXNlIHZlcnNpb24gIm1pbnQiIChvciAiZnJlZW1pbnQiKS4gIEZpbmFsbHkKLSAgICAjIHRoZSBzeXN0ZW0gbmFtZSAiVE9TIiBkZW5vdGVzIGEgc3lzdGVtIHdoaWNoIGlzIGFjdHVhbGx5IG5vdAotICAgICMgTWlOVC4gIEJ1dCBNaU5UIGlzIGRvd253YXJkIGNvbXBhdGlibGUgdG8gVE9TLCBzbyB0aGlzIHNob3VsZAotICAgICMgYmUgbm8gcHJvYmxlbS4KLSAgICBhdGFyaXN0W2VdOipNaU5UOio6KiB8IGF0YXJpc3RbZV06Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKLQllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCA7OwotICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgbWlsYW4qOipNaU5UOio6KiB8IG1pbGFuKjoqbWludDoqOiogfCAqbWlsYW4qOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCA7OwotICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgOzsKLSAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCA7OwotICAgIG02OGs6bWFjaHRlbjoqOiopCi0JZWNobyBtNjhrLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCi0JZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFJJU0MqOk1hY2g6KjoqKQotCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKLQlleGl0IDs7Ci0gICAgUklTQyo6VUxUUklYOio6KikKLQllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgVkFYKjpVTFRSSVgqOio6KikKLQllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKLQllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCi0JaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSNlbHNlCi0JaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKLSNlbmRpZgotCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjZW5kaWYKLQkgIGV4aXQgKC0xKTsKLQl9Ci1FT0YKLQkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJgotCSAgZHVtbXlhcmc9YGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgJiYKLQkgIFNZU1RFTV9OQU1FPWAkZHVtbXkgJGR1bW15YXJnYCAmJgotCSAgICB7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KLQllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKLQllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKLQlleGl0IDs7Ci0gICAgTW90b3JvbGE6Kjo0LjM6UEw4LSopCi0JZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAotCWV4aXQgOzsKLSAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKLQlleGl0IDs7Ci0gICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKLQllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAotCWV4aXQgOzsKLSAgICBtODhrOkNYL1VYOjcqOiopCi0JZWNobyBtODhrLWhhcnJpcy1jeHV4NwotCWV4aXQgOzsKLSAgICBtODhrOio6NCo6UjQqKQotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAotCWV4aXQgOzsKLSAgICBtODhrOio6Myo6UjMqKQotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MwotCWV4aXQgOzsKLSAgICBBVmlpT046ZGd1eDoqOiopCi0gICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCi0gICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCi0JaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQotCXRoZW4KLQkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCi0JICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCi0JICAgIHRoZW4KLQkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGVsc2UKLQkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGZpCi0JZWxzZQotCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLQlmaQotIAlleGl0IDs7Ci0gICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKLQllY2hvIG04OGstZG9scGhpbi1zeXN2MwotCWV4aXQgOzsKLSAgICBNODgqOio6UjMqOiopCi0JIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMwotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MwotCWV4aXQgOzsKLSAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKLQllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCi0JZXhpdCA7OwotICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCi0JZWNobyBtNjhrLXRla3Ryb25peC1ic2QKLQlleGl0IDs7Ci0gICAgKjpJUklYKjoqOiopCi0JZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAotCWV4aXQgOzsKLSAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCi0JZWNobyByb21wLWlibS1haXggICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKLQlleGl0IDs7ICAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCi0gICAgaSo4NjpBSVg6KjoqKQotCWVjaG8gaTM4Ni1pYm0tYWl4Ci0JZXhpdCA7OwotICAgIGlhNjQ6QUlYOio6KikKLQlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KLQkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKLQllbHNlCi0JCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLQllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDs7Ci0gICAgKjpBSVg6MjozKQotCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYwotCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgotCi0JCW1haW4oKQotCQkJewotCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCi0JCQkJZXhpdCgxKTsKLQkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7Ci0JCQlleGl0KDApOwotCQkJfQotRU9GCi0JCWlmICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgCi0JCXRoZW4KLQkJCWVjaG8gIiRTWVNURU1fTkFNRSIKLQkJZWxzZQotCQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41Ci0JCWZpCi0JZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40Ci0JZWxzZQotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCi0JZmkKLQlleGl0IDs7Ci0gICAgKjpBSVg6KjpbNDU2N10pCi0JSUJNX0NQVV9JRD1gL3Vzci9zYmluL2xzZGV2IC1DIC1jIHByb2Nlc3NvciAtUyBhdmFpbGFibGUgfCBzZWQgMXEgfCBhd2sgJ3sgcHJpbnQgJDEgfSdgCi0JaWYgL3Vzci9zYmluL2xzYXR0ciAtRWwgJHtJQk1fQ1BVX0lEfSB8IGdyZXAgJyBQT1dFUicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCUlCTV9BUkNIPXJzNjAwMAotCWVsc2UKLQkJSUJNX0FSQ0g9cG93ZXJwYwotCWZpCi0JaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCi0JCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCi0JZWxzZQotCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgOzsKLSAgICAqOkFJWDoqOiopCi0JZWNobyByczYwMDAtaWJtLWFpeAotCWV4aXQgOzsKLSAgICBpYm1ydDo0LjRCU0Q6Knxyb21wLWlibTpCU0Q6KikKLQllY2hvIHJvbXAtaWJtLWJzZDQuNAotCWV4aXQgOzsKLSAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgQlNEIGFuZAotCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KLQlleGl0IDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMwotICAgICo6Qk9TWDoqOiopCi0JZWNobyByczYwMDAtYnVsbC1ib3N4Ci0JZXhpdCA7OwotICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCi0JZWNobyBtNjhrLWJ1bGwtc3lzdjMKLQlleGl0IDs7Ci0gICAgOTAwMC9bMzRdPz86NC4zYnNkOjEuKjoqKQotCWVjaG8gbTY4ay1ocC1ic2QKLQlleGl0IDs7Ci0gICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKLQllY2hvIG02OGstaHAtYnNkNC40Ci0JZXhpdCA7OwotICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKLQkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KLQkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAotICAgICAgICAgICAgICAgICAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCi0gICAgICAgICAgICAgICAgICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCi0gICAgICAgICAgICAgICAgICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7Ci0JCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKLSAgICAgICAgICAgICAgICAgICAgZXNhYwotCQlmaQotCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KLQkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID4kZHVtbXkuYwotCi0gICAgICAgICAgICAgICNkZWZpbmUgX0hQVVhfU09VUkNFCi0gICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0gICAgICAgICAgICAgIGludCBtYWluICgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOwotICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0KLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KQotICAgICAgICAgICAgICAJewotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpCi0gICAgICAgICAgICAgIAkJewotICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJfSBicmVhazsKLSAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KLSAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgIGV4aXQgKDApOwotICAgICAgICAgICAgICB9Ci1FT0YKLQkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAkZHVtbXlgCi0JCSAgICB0ZXN0IC16ICIkSFBfQVJDSCIgJiYgSFBfQVJDSD1ocHBhCi0JCWZpIDs7Ci0JZXNhYwotCWlmIFsgJHtIUF9BUkNIfSA9ICJocHBhMi4wdyIgXQotCXRoZW4KLQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCi0JICAgICMgaHBwYTIuMHctaHAtaHB1eCogaGFzIGEgNjQtYml0IGtlcm5lbCBhbmQgYSBjb21waWxlciBnZW5lcmF0aW5nCi0JICAgICMgMzItYml0IGNvZGUuICBocHBhNjQtaHAtaHB1eCogaGFzIHRoZSBzYW1lIGtlcm5lbCBhbmQgYSBjb21waWxlcgotCSAgICAjIGdlbmVyYXRpbmcgNjQtYml0IGNvZGUuICBHTlUgYW5kIEhQIHVzZSBkaWZmZXJlbnQgbm9tZW5jbGF0dXJlOgotCSAgICAjCi0JICAgICMgJCBDQ19GT1JfQlVJTEQ9Y2MgLi9jb25maWcuZ3Vlc3MKLQkgICAgIyA9PiBocHBhMi4wdy1ocC1ocHV4MTEuMjMKLQkgICAgIyAkIENDX0ZPUl9CVUlMRD0iY2MgK0RBMi4wdyIgLi9jb25maWcuZ3Vlc3MKLQkgICAgIyA9PiBocHBhNjQtaHAtaHB1eDExLjIzCi0KLQkgICAgaWYgZWNobyBfX0xQNjRfXyB8IChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfAotCQlncmVwIC1xIF9fTFA2NF9fCi0JICAgIHRoZW4KLQkJSFBfQVJDSD0iaHBwYTIuMHciCi0JICAgIGVsc2UKLQkJSFBfQVJDSD0iaHBwYTY0IgotCSAgICBmaQotCWZpCi0JZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQotCWV4aXQgOzsKLSAgICBpYTY0OkhQLVVYOio6KikKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQllY2hvIGlhNjQtaHAtaHB1eCR7SFBVWF9SRVZ9Ci0JZXhpdCA7OwotICAgIDMwNTAqOkhJLVVYOio6KikKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjaW5jbHVkZSA8dW5pc3RkLmg+Ci0JaW50Ci0JbWFpbiAoKQotCXsKLQkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKLQkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCi0JICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAotCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCi0JICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGNwdSkKLQkJewotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCi0JICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGV4aXQgKDApOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCi0JCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQotCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKLQlleGl0IDs7Ci0gICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1ic2QKLQlleGl0IDs7Ci0gICAgOTAwMC84Pz86NC4zYnNkOio6KikKLQllY2hvIGhwcGExLjAtaHAtYnNkCi0JZXhpdCA7OwotICAgICo5Pz8qOk1QRS9pWDoqOiogfCAqMzAwMCo6TVBFL2lYOio6KikKLQllY2hvIGhwcGExLjAtaHAtbXBlaXgKLQlleGl0IDs7Ci0gICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCi0JZWNobyBocHBhMS4xLWhwLW9zZgotCWV4aXQgOzsKLSAgICBocDg/PzpPU0YxOio6KikKLQllY2hvIGhwcGExLjAtaHAtb3NmCi0JZXhpdCA7OwotICAgIGkqODY6T1NGMToqOiopCi0JaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKLQllbHNlCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKLQlmaQotCWV4aXQgOzsKLSAgICBwYXJpc2MqOkxpdGVzKjoqOiopCi0JZWNobyBocHBhMS4xLWhwLWxpdGVzCi0JZXhpdCA7OwotICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgOzsKLSAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLSAgICAgICAgZXhpdCA7OwotICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKLQllY2hvIGMzNC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgOzsKLSAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCi0JZWNobyBjMzgtY29udmV4LWJzZAotICAgICAgICBleGl0IDs7Ci0gICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCA7OwotICAgIENSQVkqWS1NUDoqOio6KikKLQllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAotCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgQ1JBWSpUUzoqOio6KikKLQllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBDUkFZKlQzRToqOio6KikKLQllY2hvIGFscGhhZXY1LWNyYXktdW5pY29zbWske1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgQ1JBWSpTVjE6KjoqOiopCi0JZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgKjpVTklDT1MvbXA6KjoqKQotCWVjaG8gY3JheW52LWNyYXktdW5pY29zbXAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDs7Ci0gICAgRjMwWzAxXTpVTklYX1N5c3RlbV9WOio6KiB8IEY3MDA6VU5JWF9TeXN0ZW1fVjoqOiopCi0JRlVKSVRTVV9QUk9DPWB1bmFtZSAtbSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLSAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAotICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAotICAgICAgICBlY2hvICIke0ZVSklUU1VfUFJPQ30tZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgotICAgICAgICBleGl0IDs7Ci0gICAgNTAwMDpVTklYX1N5c3RlbV9WOjQuKjoqKQotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0gICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCi0gICAgICAgIGVjaG8gInNwYXJjLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKLQlleGl0IDs7Ci0gICAgaSo4NjpCU0QvMzg2Oio6KiB8IGkqODY6QlNEL09TOio6KiB8ICo6QXNjZW5kXCBFbWJlZGRlZC9PUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIHNwYXJjKjpCU0QvT1M6KjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOkJTRC9PUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpGcmVlQlNEOio6KikKLQljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KLQkgICAgcGM5OCkKLQkJZWNobyBpMzg2LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKLQkgICAgYW1kNjQpCi0JCWVjaG8geDg2XzY0LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKLQkgICAgKikKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKLQllc2FjCi0JZXhpdCA7OwotICAgIGkqOkNZR1dJTio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luCi0JZXhpdCA7OwotICAgICo6TUlOR1cqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKLQlleGl0IDs7Ci0gICAgaSo6d2luZG93czMyKjoqKQotICAgIAkjIHVuYW1lIC1tIGluY2x1ZGVzICItcGMiIG9uIHRoaXMgc3lzdGVtLgotICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tbWluZ3czMgotCWV4aXQgOzsKLSAgICBpKjpQVyo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcHczMgotCWV4aXQgOzsKLSAgICAqOkludGVyaXgqOiopCi0gICAgCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgotCSAgICB4ODYpCi0JCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQotCQlleGl0IDs7Ci0JICAgIGF1dGhlbnRpY2FtZCB8IGdlbnVpbmVpbnRlbCB8IEVNNjRUKQotCQllY2hvIHg4Nl82NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9Ci0JCWV4aXQgOzsKLQkgICAgSUE2NCkKLQkJZWNobyBpYTY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KLQkJZXhpdCA7OwotCWVzYWMgOzsKLSAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCi0JZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKLQlleGl0IDs7Ci0gICAgODY2NDpXaW5kb3dzX05UOiopCi0JZWNobyB4ODZfNjQtcGMtbWtzCi0JZXhpdCA7OwotICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQotCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KLQkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQotCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KLQllY2hvIGk1ODYtcGMtaW50ZXJpeAotCWV4aXQgOzsKLSAgICBpKjpVV0lOKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCi0JZXhpdCA7OwotICAgIGFtZDY0OkNZR1dJTio6KjoqIHwgeDg2XzY0OkNZR1dJTio6KjoqKQotCWVjaG8geDg2XzY0LXVua25vd24tY3lnd2luCi0JZXhpdCA7OwotICAgIHAqOkNZR1dJTio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgotCWV4aXQgOzsKLSAgICBwcmVwKjpTdW5PUzo1Lio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCA7OwotICAgICo6R05VOio6KikKLQkjIHRoZSBHTlUgc3lzdGVtCi0JZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCi0JZXhpdCA7OwotICAgICo6R05VLyo6KjoqKQotCSMgb3RoZXIgc3lzdGVtcyB3aXRoIEdOVSBsaWJjIGFuZCB1c2VybGFuZAotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWBlY2hvICR7VU5BTUVfU1lTVEVNfSB8IHNlZCAncyxeW14vXSovLCwnIHwgdHIgJ1tBLVpdJyAnW2Etel0nYGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AtZ251Ci0JZXhpdCA7OwotICAgIGkqODY6TWluaXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAotCWV4aXQgOzsKLSAgICBhbHBoYTpMaW51eDoqOiopCi0JY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KLQkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7Ci0JICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKLQkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKLQkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7Ci0JICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKLQkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OwotICAgICAgICBlc2FjCi0Jb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyAvYmluL3NoIHwgZ3JlcCAtcSBsZC5zby4xCi0JaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4gTElCQz0ibGliYzEiIDsgZWxzZSBMSUJDPSIiIDsgZmkKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUke0xJQkN9Ci0JZXhpdCA7OwotICAgIGFybSo6TGludXg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlpZiBlY2hvIF9fQVJNX0VBQklfXyB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCi0JICAgIHwgZ3JlcCAtcSBfX0FSTV9FQUJJX18KLQl0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251ZWFiaQotCWZpCi0JZXhpdCA7OwotICAgIGF2cjMyKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGNyaXM6TGludXg6KjoqKQotCWVjaG8gY3Jpcy1heGlzLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBjcmlzdjMyOkxpbnV4Oio6KikKLQllY2hvIGNyaXN2MzItYXhpcy1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgZnJ2OkxpbnV4Oio6KikKLSAgICAJZWNobyBmcnYtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgaSo4NjpMaW51eDoqOiopCi0JTElCQz1nbnUKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjaWZkZWYgX19kaWV0bGliY19fCi0JTElCQz1kaWV0bGliYwotCSNlbmRpZgotRU9GCi0JZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgJ15MSUJDJ2AKLQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30iCi0JZXhpdCA7OwotICAgIGlhNjQ6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBtMzJyKjpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIG02OCo6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBtaXBzOkxpbnV4Oio6KiB8IG1pcHM2NDpMaW51eDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI3VuZGVmIENQVQotCSN1bmRlZiAke1VOQU1FX01BQ0hJTkV9Ci0JI3VuZGVmICR7VU5BTUVfTUFDSElORX1lbAotCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpCi0JQ1BVPSR7VU5BTUVfTUFDSElORX1lbAotCSNlbHNlCi0JI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKLQlDUFU9JHtVTkFNRV9NQUNISU5FfQotCSNlbHNlCi0JQ1BVPQotCSNlbmRpZgotCSNlbmRpZgotRU9GCi0JZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgJ15DUFUnYAotCXRlc3QgeCIke0NQVX0iICE9IHggJiYgeyBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC1nbnUiOyBleGl0OyB9Ci0JOzsKLSAgICBvcjMyOkxpbnV4Oio6KikKLQllY2hvIG9yMzItdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgcGFkcmU6TGludXg6KjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgcGFyaXNjNjQ6TGludXg6KjoqIHwgaHBwYTY0OkxpbnV4Oio6KikKLQllY2hvIGhwcGE2NC11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCi0JIyBMb29rIGZvciBDUFUgbGV2ZWwKLQljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgotCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtZ251IDs7Ci0JICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKLQkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OwotCWVzYWMKLQlleGl0IDs7Ci0gICAgcHBjNjQ6TGludXg6KjoqKQotCWVjaG8gcG93ZXJwYzY0LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHBwYzpMaW51eDoqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHMzOTA6TGludXg6KjoqIHwgczM5MHg6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tbGludXgKLQlleGl0IDs7Ci0gICAgc2g2NCo6TGludXg6KjoqKQotICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgc2gqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHRpbGUqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdGlsZXJhLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICB2YXg6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHg4Nl82NDpMaW51eDoqOiopCi0JZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgeHRlbnNhKjpMaW51eDoqOiopCi0gICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBpKjg2OkRZTklYL3B0eDo0KjoqKQotCSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuCi0JIyBlYXJsaWVyIHZlcnNpb25zIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aAotCSMgc3lzbmFtZSBhbmQgbm9kZW5hbWUuCi0JZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKLQlleGl0IDs7Ci0gICAgaSo4NjpVTklYX1NWOjQuMk1QOjIuKikKLSAgICAgICAgIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgotICAgICAgICAjIG51bWJlciBzZXJpZXMgc3RhcnRpbmcgd2l0aCAyLi4uCi0gICAgICAgICMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKLQkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCi0gICAgICAgICMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCA7OwotICAgIGkqODY6T1MvMjoqOiopCi0JIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKLQkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAotCWV4aXQgOzsKLSAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKLQlleGl0IDs7Ci0gICAgaSo4NjphdGhlb3M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWF0aGVvcwotCWV4aXQgOzsKLSAgICBpKjg2OnN5bGxhYmxlOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKLQlleGl0IDs7Ci0gICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LlswMl0qOiopCi0JZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBpKjg2OipET1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCi0JZXhpdCA7OwotICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCi0JVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCi0JaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KLQlmaQotCWV4aXQgOzsKLSAgICBpKjg2Oio6NTpbNjc4XSopCi0gICAgCSMgVW5peFdhcmUgNy54LCBPcGVuVU5JWCBhbmQgT3BlblNlcnZlciA2LgotCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCi0JICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OwotCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKLQkgICAgKlBlbnQqfCpDZWxlcm9uKSBVTkFNRV9NQUNISU5FPWk2ODYgOzsKLQllc2FjCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCA7OwotICAgIGkqODY6KjozLjI6KikKLQlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCi0JCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKLQllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAotCQkoL2Jpbi91bmFtZSAtWHxncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKLQkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgotCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudCAqSUknID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgotCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bSBQcm8nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgotCWZpCi0JZXhpdCA7OwotICAgIHBjOio6KjoqKQotCSMgTGVmdCBoZXJlIGZvciBjb21wYXRpYmlsaXR5OgotICAgICAgICAjIHVuYW1lIC1tIHByaW50cyBmb3IgREpHUFAgYWx3YXlzICdwYycsIGJ1dCBpdCBwcmludHMgbm90aGluZyBhYm91dAotICAgICAgICAjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpNTg2LgotCSMgTm90ZTogd2hhdGV2ZXIgdGhpcyBpcywgaXQgTVVTVCBiZSB0aGUgc2FtZSBhcyB3aGF0IGNvbmZpZy5zdWIKLQkjIHByaW50cyBmb3IgdGhlICJkamdwcCIgaG9zdCwgb3IgZWxzZSBHREIgY29uZmlndXJ5IHdpbGwgZGVjaWRlIHRoYXQKLQkjIHRoaXMgaXMgYSBjcm9zcy1idWlsZC4KLQllY2hvIGk1ODYtcGMtbXNkb3NkamdwcAotICAgICAgICBleGl0IDs7Ci0gICAgSW50ZWw6TWFjaDozKjoqKQotCWVjaG8gaTM4Ni1wYy1tYWNoMwotCWV4aXQgOzsKLSAgICBwYXJhZ29uOio6KjoqKQotCWVjaG8gaTg2MC1pbnRlbC1vc2YxCi0JZXhpdCA7OwotICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKLQlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAotCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KLQkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0Ci0JZmkKLQlleGl0IDs7Ci0gICAgbWluaSo6Q1RJWDpTWVMqNToqKQotCSMgIm1pbmlmcmFtZSIKLQllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKLQlleGl0IDs7Ci0gICAgbWM2OGs6VU5JWDpTWVNURU01OjMuNTFtKQotCWVjaG8gbTY4ay1jb252ZXJnZW50LXN5c3YKLQlleGl0IDs7Ci0gICAgTTY4MD8wOkQtTklYOjUuMzoqKQotCWVjaG8gbTY4ay1kaWFiLWRuaXgKLQlleGl0IDs7Ci0gICAgTTY4KjoqOlIzVls1Njc4XSo6KikKLQl0ZXN0IC1yIC9zeXNWNjggJiYgeyBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnOyBleGl0OyB9IDs7Ci0gICAgM1szNDVdPz86Kjo0LjA6My4wIHwgM1szNF0/P0E6Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDNbMzRdPz8vKjoqOjQuMDozLjAgfCA0NDAwOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wIHwgU0RTMjoqOjQuMDozLjAgfCBTSEcyOio6NC4wOjMuMCB8IFM3NTAxKjoqOjQuMDozLjApCi0JT1NfUkVMPScnCi0JdGVzdCAtciAvZXRjLy5yZWxpZCBcCi0JJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLQkgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9Ci0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCi0JICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OwotICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQotICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLSAgICAgICAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKLSAgICBOQ1IqOio6NC4yOiogfCBNUFJBUyo6Kjo0LjI6KikKLQlPU19SRUw9Jy4zJwotCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAotCSAgICAmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotCSAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAotCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgcHRlcm9uID4vZGV2L251bGwgXAotCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OwotICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQotCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQotCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAotCWV4aXQgOzsKLSAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKLQllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICByczYwMDA6THlueE9TOjIuKjoqKQotCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuWzAyXSo6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCi0JZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgOzsKLSAgICBSTSo6U0lOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgOzsKLSAgICAqOlNJTklYLSo6KjoqKQotCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCi0JCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKLQllbHNlCi0JCWVjaG8gbnMzMmstc25pLXN5c3YKLQlmaQotCWV4aXQgOzsKLSAgICBQRU5USVVNOio6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAotICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KLSAgICAgICAgZWNobyBpNTg2LXVuaXN5cy1zeXN2NAotICAgICAgICBleGl0IDs7Ci0gICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCi0JIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgotCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCA7OwotICAgICo6KjoqOkZUWCopCi0JIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCi0JZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKLQlleGl0IDs7Ci0gICAgaSo4NjpWT1M6KjoqKQotCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zdHJhdHVzLXZvcwotCWV4aXQgOzsKLSAgICAqOlZPUzoqOiopCi0JIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCi0JZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCi0JZXhpdCA7OwotICAgIG1jNjgqOkEvVVg6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKLQllY2hvIG1pcHMtc29ueS1uZXdzb3M2Ci0JZXhpdCA7OwotICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQotCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgotCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWVsc2UKLQkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAgICAgICAgZXhpdCA7OwotICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYmUtYmVvcwotCWV4aXQgOzsKLSAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCi0JZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKLQlleGl0IDs7Ci0gICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KLQllY2hvIGk1ODYtcGMtYmVvcwotCWV4aXQgOzsKLSAgICBCZVBDOkhhaWt1Oio6KikJIyBIYWlrdSBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCi0JZWNobyBpNTg2LXBjLWhhaWt1Ci0JZXhpdCA7OwotICAgIFNYLTQ6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBTWC01OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgU1gtNjpTVVBFUi1VWDoqOiopCi0JZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFNYLTc6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBTWC04OlNVUEVSLVVYOio6KikKLQllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgU1gtOFI6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6UmhhcHNvZHk6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpEYXJ3aW46KjoqKQotCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCi0JY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCi0JICAgIGkzODYpCi0JCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCi0JCSAgaWYgKGVjaG8gJyNpZmRlZiBfX0xQNjRfXyc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCi0JCSAgICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCi0JCSAgICAgIGdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCi0JCSAgdGhlbgotCQkgICAgICBVTkFNRV9QUk9DRVNTT1I9Ing4Nl82NCIKLQkJICBmaQotCQlmaSA7OwotCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OwotCWVzYWMKLQllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQotCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgCi0JaWYgdGVzdCAiJFVOQU1FX1BST0NFU1NPUiIgPSAieDg2IjsgdGhlbgotCQlVTkFNRV9QUk9DRVNTT1I9aTM4NgotCQlVTkFNRV9NQUNISU5FPXBjCi0JZmkKLQllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6UU5YOio6NCopCi0JZWNobyBpMzg2LXBjLXFueAotCWV4aXQgOzsKLSAgICBORU8tPzpOT05TVE9QX0tFUk5FTDoqOiopCi0JZWNobyBuZW8tdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgTlNFLT86Tk9OU1RPUF9LRVJORUw6KjoqKQotCWVjaG8gbnNlLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIE5TUi0/Ok5PTlNUT1BfS0VSTkVMOio6KikKLQllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOk5vblN0b3AtVVg6KjoqKQotCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4Ci0JZXhpdCA7OwotICAgIEJTMjAwMDpQT1NJWCo6KjoqKQotCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgotCWV4aXQgOzsKLSAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOlBsYW45Oio6KikKLQkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKLQkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgotCSMgb3BlcmF0aW5nIHN5c3RlbXMuCi0JaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KLQkgICAgVU5BTUVfTUFDSElORT1pMzg2Ci0JZWxzZQotCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKLQlmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45Ci0JZXhpdCA7OwotICAgICo6VE9QUy0xMDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAotCWV4aXQgOzsKLSAgICAqOlRFTkVYOio6KikKLQllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKLQlleGl0IDs7Ci0gICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLWRlYy10b3BzMjAKLQlleGl0IDs7Ci0gICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLXhrbC10b3BzMjAKLQlleGl0IDs7Ci0gICAgKjpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCi0JZXhpdCA7OwotICAgICo6SVRTOio6KikKLQllY2hvIHBkcDEwLXVua25vd24taXRzCi0JZXhpdCA7OwotICAgIFNFSToqOio6U0VJVVgpCi0gICAgICAgIGVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6RHJhZ29uRmx5Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHlgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCi0JZXhpdCA7OwotICAgICo6KlZNUzoqOiopCi0gICAgCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KLQkgICAgQSopIGVjaG8gYWxwaGEtZGVjLXZtcyA7IGV4aXQgOzsKLQkgICAgSSopIGVjaG8gaWE2NC1kZWMtdm1zIDsgZXhpdCA7OwotCSAgICBWKikgZWNobyB2YXgtZGVjLXZtcyA7IGV4aXQgOzsKLQllc2FjIDs7Ci0gICAgKjpYRU5JWDoqOlN5c1YpCi0JZWNobyBpMzg2LXBjLXhlbml4Ci0JZXhpdCA7OwotICAgIGkqODY6c2t5b3M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1za3lvc2BlY2hvICR7VU5BTUVfUkVMRUFTRX1gIHwgc2VkIC1lICdzLyAuKiQvLycKLQlleGl0IDs7Ci0gICAgaSo4NjpyZG9zOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcmRvcwotCWV4aXQgOzsKLSAgICBpKjg2OkFST1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1hcm9zCi0JZXhpdCA7OwotZXNhYwotCi0jZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKLSNlY2hvICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIDE+JjIKLQotZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotY2F0ID4kZHVtbXkuYyA8PEVPRgotI2lmZGVmIF9TRVFVRU5UXwotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLSNlbmRpZgotbWFpbiAoKQotewotI2lmIGRlZmluZWQgKHNvbnkpCi0jaWYgZGVmaW5lZCAoTUlQU0VCKQotICAvKiBCRkQgd2FudHMgImJzZCIgaW5zdGVhZCBvZiAibmV3c29zIi4gIFBlcmhhcHMgQkZEIHNob3VsZCBiZSBjaGFuZ2VkLAotICAgICBJIGRvbid0IGtub3cuLi4uICAqLwotICBwcmludGYgKCJtaXBzLXNvbnktYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotICBwcmludGYgKCJtNjhrLXNvbnktbmV3c29zJXNcbiIsCi0jaWZkZWYgTkVXU09TNAotICAgICAgICAgICI0IgotI2Vsc2UKLQkgICIiCi0jZW5kaWYKLSAgICAgICAgICk7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCi0gIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQotICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChOZVhUKQotI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQotI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgotI2VuZGlmCi0gIGludCB2ZXJzaW9uOwotICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7Ci0gIGlmICh2ZXJzaW9uIDwgNCkKLSAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBlbHNlCi0gICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKLSAgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCi0jaWYgZGVmaW5lZCAoVU1BWFYpCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotI2lmIGRlZmluZWQgKENNVSkKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCi0gIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHNlcXVlbnQpCi0jaWYgZGVmaW5lZCAoaTM4NikKLSAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChuczMyMDAwKQotICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQotICAgIHN0cnVjdCB1dHNuYW1lIHVuOwotCi0gICAgdW5hbWUoJnVuKTsKLQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKLQlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOwotICAgIH0KLSAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLwotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkICh2YXgpCi0jIGlmICFkZWZpbmVkICh1bHRyaXgpCi0jICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgIGlmIGRlZmluZWQgKEJTRCkKLSMgICBpZiBCU0QgPT0gNDMKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7Ci0jICAgZWxzZQotIyAgICBpZiBCU0QgPT0gMTk5MDA2Ci0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKLSMgICAgZWxzZQotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZWxzZQotICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jICBlbmRpZgotIyBlbHNlCi0gICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKLSAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSAgZXhpdCAoMSk7Ci19Ci1FT0YKLQotJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKLQl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KLQotIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgotCi10ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQ7IH0KLQotIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQotCi1pZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQotdGhlbgotICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCi0gICAgYzEqKQotCWVjaG8gYzEtY29udmV4LWJzZAotCWV4aXQgOzsKLSAgICBjMiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotCWV4aXQgOzsKLSAgICBjMzQqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLQlleGl0IDs7Ci0gICAgYzM4KikKLQllY2hvIGMzOC1jb252ZXgtYnNkCi0JZXhpdCA7OwotICAgIGM0KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLQlleGl0IDs7Ci0gICAgZXNhYwotZmkKLQotY2F0ID4mMiA8PEVPRgotJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQotCi1UaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQotdGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQotZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCi0KLSAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECi1hbmQKLSAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAotCi1JZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKLXNlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCi1wZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAotaW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgotCi1jb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAotCi11bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLQotL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKLS9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKLQotaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAotL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCi0vdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKLS9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCi0vdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKLS91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAotCi1VTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQotVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KLVVOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KLVVOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059Ci1FT0YKLQotZXhpdCAxCi0KLSMgTG9jYWwgdmFyaWFibGVzOgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgotIyB0aW1lLXN0YW1wLWVuZDogIiciCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2NvbmZpZy5oIGIvY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZDhjM2UuLjAwMDAwMDAKLS0tIGEvY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTM5ICswLDAgQEAKLS8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGZyb20gY29uZmlnLmguaW4gYnkgY29uZmlndXJlIGFuZCB0aGVuIGhhbmQgbW9kaWZpZWQgZm9yIGFuZHJvaWQgKi8KLS8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgYnVpbGRpbmcgdW5pdmVyc2FsIChpbnRlcm5hbCBoZWxwZXIgbWFjcm8pICovCi0vKiAjdW5kZWYgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxEICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIGdldGFkZHJpbmZvIHRoYXQgZmFpbHMgZm9yIHRoZSBhbGwtemVyb3MgSVB2NiBhZGRyZXNzCi0gICAqLwotLyogI3VuZGVmIEFJWF9HRVROQU1FSU5GT19IQUNLICovCi0KLS8qIERlZmluZSBpZiB5b3VyIEFJWCBsb2dpbmZhaWxlZCgpIGZ1bmN0aW9uIHRha2VzIDQgYXJndW1lbnRzIChBSVggPj0gNS4yKSAqLwotLyogI3VuZGVmIEFJWF9MT0dJTkZBSUxFRF80QVJHICovCi0KLS8qIFN5c3RlbSBvbmx5IHN1cHBvcnRzIElQdjQgYXVkaXQgcmVjb3JkcyAqLwotLyogI3VuZGVmIEFVX0lQdjQgKi8KLQotLyogRGVmaW5lIGlmIHlvdXIgcmVzb2x2ZXIgbGlicyBuZWVkIHRoaXMgZm9yIGdldHJyc2V0YnluYW1lICovCi0vKiAjdW5kZWYgQklORF84X0NPTVBBVCAqLwotCi0vKiBEZWZpbmUgaWYgY21zZ190eXBlIGlzIG5vdCBwYXNzZWQgY29ycmVjdGx5ICovCi0vKiAjdW5kZWYgQlJPS0VOX0NNU0dfVFlQRSAqLwotCi0vKiBnZXRhZGRyaW5mbyBpcyBicm9rZW4gKGlmIHByZXNlbnQpICovCi0vKiAjdW5kZWYgQlJPS0VOX0dFVEFERFJJTkZPICovCi0KLS8qIGdldGdyb3VwcygwLE5VTEwpIHdpbGwgcmV0dXJuIC0xICovCi0vKiAjdW5kZWYgQlJPS0VOX0dFVEdST1VQUyAqLwotCi0vKiBGcmVlQlNEIGdsb2IgZG9lcyBub3QgZG8gd2hhdCB3ZSBuZWVkICovCi0vKiAjdW5kZWYgQlJPS0VOX0dMT0IgKi8KLQotLyogRGVmaW5lIGlmIHlvdSBzeXN0ZW0ncyBpbmV0X250b2EgaXMgYnVzdGVkIChlLmcuIElyaXggZ2NjIGlzc3VlKSAqLwotLyogI3VuZGVmIEJST0tFTl9JTkVUX05UT0EgKi8KLQotLyogaWFfdWluZm8gcm91dGluZXMgbm90IHN1cHBvcnRlZCBieSBPUyB5ZXQgKi8KLS8qICN1bmRlZiBCUk9LRU5fTElCSUFGICovCi0KLS8qIFVsdHJpeCBtbWFwIGNhbid0IG1hcCBmaWxlcyAqLwotLyogI3VuZGVmIEJST0tFTl9NTUFQICovCi0KLS8qIERlZmluZSBpZiB5b3VyIHN0cnVjdCBkaXJlbnQgZXhwZWN0cyB5b3UgdG8gYWxsb2NhdGUgZXh0cmEgc3BhY2UgZm9yIGRfbmFtZQotICAgKi8KLS8qICN1bmRlZiBCUk9LRU5fT05FX0JZVEVfRElSRU5UX0RfTkFNRSAqLwotCi0vKiBDYW4ndCBkbyBjb21wYXJpc29ucyBvbiByZWFkdiAqLwotLyogI3VuZGVmIEJST0tFTl9SRUFEVl9DT01QQVJJU09OICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIGJyb2tlbiByZWFscGF0aC4gKi8KLS8qICN1bmRlZiBCUk9LRU5fUkVBTFBBVEggKi8KLQotLyogTmVlZGVkIGZvciBOZVhUICovCi0vKiAjdW5kZWYgQlJPS0VOX1NBVkVEX1VJRFMgKi8KLQotLyogRGVmaW5lIGlmIHlvdXIgc2V0cmVnaWQoKSBpcyBicm9rZW4gKi8KLS8qICN1bmRlZiBCUk9LRU5fU0VUUkVHSUQgKi8KLQotLyogRGVmaW5lIGlmIHlvdXIgc2V0cmVzZ2lkKCkgaXMgYnJva2VuICovCi0vKiAjdW5kZWYgQlJPS0VOX1NFVFJFU0dJRCAqLwotCi0vKiBEZWZpbmUgaWYgeW91ciBzZXRyZXN1aWQoKSBpcyBicm9rZW4gKi8KLS8qICN1bmRlZiBCUk9LRU5fU0VUUkVTVUlEICovCi0KLS8qIERlZmluZSBpZiB5b3VyIHNldHJldWlkKCkgaXMgYnJva2VuICovCi0vKiAjdW5kZWYgQlJPS0VOX1NFVFJFVUlEICovCi0KLS8qIEx5bnhPUyBoYXMgYnJva2VuIHNldHZidWYoKSBpbXBsZW1lbnRhdGlvbiAqLwotLyogI3VuZGVmIEJST0tFTl9TRVRWQlVGICovCi0KLS8qIFFOWCBzaGFkb3cgc3VwcG9ydCBpcyBicm9rZW4gKi8KLS8qICN1bmRlZiBCUk9LRU5fU0hBRE9XX0VYUElSRSAqLwotCi0vKiBEZWZpbmUgaWYgeW91ciBzbnByaW50ZiBpcyBidXN0ZWQgKi8KLS8qICN1bmRlZiBCUk9LRU5fU05QUklOVEYgKi8KLQotLyogdGNnZXRhdHRyIHdpdGggSUNBTk9OIG1heSBoYW5nICovCi0vKiAjdW5kZWYgQlJPS0VOX1RDR0VUQVRUUl9JQ0FOT04gKi8KLQotLyogdXBkd3RtcHggaXMgYnJva2VuIChpZiBwcmVzZW50KSAqLwotLyogI3VuZGVmIEJST0tFTl9VUERXVE1QWCAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgQlNEIGF1dGggc3VwcG9ydCAqLwotLyogI3VuZGVmIEJTRF9BVVRIICovCi0KLS8qIERlZmluZSBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IHRoZSBwYXRoIHRvIHlvdXIgbGFzdGxvZyBmaWxlICovCi0vKiAjdW5kZWYgQ09ORl9MQVNUTE9HX0ZJTEUgKi8KLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIHBhdGggdG8geW91ciB1dG1wIGZpbGUgKi8KLS8qICN1bmRlZiBDT05GX1VUTVBfRklMRSAqLwotCi0vKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gc3BlY2lmeSB0aGUgcGF0aCB0byB5b3VyIHd0bXB4IGZpbGUgKi8KLS8qICN1bmRlZiBDT05GX1dUTVBYX0ZJTEUgKi8KLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIHBhdGggdG8geW91ciB3dG1wIGZpbGUgKi8KLS8qICN1bmRlZiBDT05GX1dUTVBfRklMRSAqLwotCi0vKiBEZWZpbmUgaWYgeW91ciBwbGF0Zm9ybSBuZWVkcyB0byBza2lwIHBvc3QgYXV0aCBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZyAqLwotLyogI3VuZGVmIERJU0FCTEVfRkRfUEFTU0lORyAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIGxhc3Rsb2cgKi8KLS8qICN1bmRlZiBESVNBQkxFX0xBU1RMT0cgKi8KLQotLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB5b3VyIHN5c3RlbSdzIGxvZ2luKCkgY2FsbCAqLwotLyogI3VuZGVmIERJU0FCTEVfTE9HSU4gKi8KLQotLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBwdXR1dGxpbmUoKSBldGMuIHRvIHdyaXRlIFt1d110bXAgKi8KLS8qICN1bmRlZiBESVNBQkxFX1BVVFVUTElORSAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHB1dHV0eGxpbmUoKSBldGMuIHRvIHdyaXRlIFt1d110bXB4ICovCi0vKiAjdW5kZWYgRElTQUJMRV9QVVRVVFhMSU5FICovCi0KLS8qIERlZmluZSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHNoYWRvdyBwYXNzd29yZHMgKi8KLSNkZWZpbmUgRElTQUJMRV9TSEFET1cgMQotCi0vKiBEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHV0bXAgKi8KLSNkZWZpbmUgRElTQUJMRV9VVE1QIDEKLQotLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB1dG1weCAqLwotI2RlZmluZSBESVNBQkxFX1VUTVBYIDEKLQotLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB3dG1wICovCi0jZGVmaW5lIERJU0FCTEVfV1RNUCAxCi0KLS8qIERlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2Ugd3RtcHggKi8KLSNkZWZpbmUgRElTQUJMRV9XVE1QWCAxCi0KLS8qIEVuYWJsZSBmb3IgUEtDUyMxMSBzdXBwb3J0ICovCi0jZGVmaW5lIEVOQUJMRV9QS0NTMTEgLyoqLwotCi0vKiBGaWxlIG5hbWVzIG1heSBub3QgY29udGFpbiBiYWNrc2xhc2ggY2hhcmFjdGVycyAqLwotLyogI3VuZGVmIEZJTEVTWVNURU1fTk9fQkFDS1NMQVNIICovCi0KLS8qIGZzaWRfdCBoYXMgbWVtYmVyIHZhbCAqLwotLyogI3VuZGVmIEZTSURfSEFTX1ZBTCAqLwotCi0vKiBmc2lkX3QgaGFzIG1lbWJlciBfX3ZhbCAqLwotLyogI3VuZGVmIEZTSURfSEFTX19fVkFMICovCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBgZ2V0cGdycCcgZnVuY3Rpb24gcmVxdWlyZXMgemVybyBhcmd1bWVudHMuICovCi0jZGVmaW5lIEdFVFBHUlBfVk9JRCAxCi0KLS8qIENvbmZsaWN0aW5nIGRlZnMgZm9yIGdldHNwbmFtICovCi0vKiAjdW5kZWYgR0VUU1BOQU1fQ09ORkxJQ1RJTkdfREVGUyAqLwotCi0vKiBEZWZpbmUgaWYgeW91ciBzeXN0ZW0gZ2xvYigpIGZ1bmN0aW9uIGhhcyB0aGUgR0xPQl9BTFRESVJGVU5DIGV4dGVuc2lvbiAqLwotI2RlZmluZSBHTE9CX0hBU19BTFRESVJGVU5DIDEKLQotLyogRGVmaW5lIGlmIHlvdXIgc3lzdGVtIGdsb2IoKSBmdW5jdGlvbiBoYXMgZ2xfbWF0Y2hjIG9wdGlvbnMgaW4gZ2xvYl90ICovCi0vKiAjdW5kZWYgR0xPQl9IQVNfR0xfTUFUQ0hDICovCi0KLS8qIERlZmluZSBpZiB5b3VyIHN5c3RlbSBnbG9iKCkgZnVuY3Rpb24gaGFzIGdsX3N0YXR2IG9wdGlvbnMgaW4gZ2xvYl90ICovCi0vKiAjdW5kZWYgR0xPQl9IQVNfR0xfU1RBVFYgKi8KLQotLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgR1NTQVBJIHN1cHBvcnQgaW4gdGhlIHZlcnNpb24gMiBwcm90b2NvbCAqLwotLyogI3VuZGVmIEdTU0FQSSAqLwotCi0vKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gdXNlIHNoYWRvdyBwYXNzd29yZCBleHBpcmUgZmllbGQgKi8KLSNkZWZpbmUgSEFTX1NIQURPV19FWFBJUkUgMQotCi0vKiBEZWZpbmUgaWYgeW91ciBzeXN0ZW0gdXNlcyBhY2Nlc3MgcmlnaHRzIHN0eWxlIGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nICovCi0vKiAjdW5kZWYgSEFWRV9BQ0NSSUdIVFNfSU5fTVNHSERSICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9hZGRyIGluIHV0bXAuaCAqLwotI2RlZmluZSBIQVZFX0FERFJfSU5fVVRNUCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9hZGRyIGluIHV0bXB4LmggKi8KLSNkZWZpbmUgSEFWRV9BRERSX0lOX1VUTVBYIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X2FkZHJfdjYgaW4gdXRtcC5oICovCi0jZGVmaW5lIEhBVkVfQUREUl9WNl9JTl9VVE1QIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X2FkZHJfdjYgaW4gdXRtcHguaCAqLwotI2RlZmluZSBIQVZFX0FERFJfVjZfSU5fVVRNUFggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFyYzRyYW5kb20nIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfQVJDNFJBTkRPTSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFyYzRyYW5kb21fYnVmJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX0FSQzRSQU5ET01fQlVGICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXJjNHJhbmRvbV91bmlmb3JtJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX0FSQzRSQU5ET01fVU5JRk9STSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFzcHJpbnRmJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9BU1BSSU5URiAxCi0KLS8qIE9wZW5CU0QncyBnY2MgaGFzIGJvdW5kZWQgKi8KLS8qICN1bmRlZiBIQVZFX0FUVFJJQlVURV9fQk9VTkRFRF9fICovCi0KLS8qIEhhdmUgYXR0cmlidXRlIG5vbm51bGwgKi8KLSNkZWZpbmUgSEFWRV9BVFRSSUJVVEVfX05PTk5VTExfXyAxCi0KLS8qIE9wZW5CU0QncyBnY2MgaGFzIHNlbnRpbmVsICovCi0vKiAjdW5kZWYgSEFWRV9BVFRSSUJVVEVfX1NFTlRJTkVMX18gKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdWdfZ2V0X21hY2hpbmUnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfQVVHX0dFVF9NQUNISU5FICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYjY0X250b3AnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfQjY0X05UT1AgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBiNjRfcHRvbicgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9CNjRfUFRPTiAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJhc2VuYW1lIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX0JBU0VOQU1FIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBiY29weScgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfQkNPUFkgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGJpbmRyZXN2cG9ydF9zYScgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9CSU5EUkVTVlBPUlRfU0EgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBCTl9pc19wcmltZV9leCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfQk5fSVNfUFJJTUVfRVggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGJzbS9hdWRpdC5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX0JTTV9BVURJVF9IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8YnN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX0JTVFJJTkdfSCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNsb2NrJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9DTE9DSyAxCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBjbG9ja190IGRhdGEgdHlwZSAqLwotI2RlZmluZSBIQVZFX0NMT0NLX1QgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNsb3NlZnJvbScgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9DTE9TRUZST00gKi8KLQotLyogRGVmaW5lIGlmIGdhaV9zdHJlcnJvcigpIHJldHVybnMgY29uc3QgY2hhciAqICovCi0jZGVmaW5lIEhBVkVfQ09OU1RfR0FJX1NUUkVSUk9SX1BST1RPIDEKLQotLyogRGVmaW5lIGlmIHlvdXIgc3lzdGVtIHVzZXMgYW5jaWxsYXJ5IGRhdGEgc3R5bGUgZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcgKi8KLSNkZWZpbmUgSEFWRV9DT05UUk9MX0lOX01TR0hEUiAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y3J5cHRvL3NoYTIuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9DUllQVE9fU0hBMl9IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y3J5cHQuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjZGVmaW5lIEhBVkVfQ1JZUFRfSCAxICovCi0KLS8qIERlZmluZSBpZiB5b3UgYXJlIG9uIEN5Z3dpbiAqLwotLyogI3VuZGVmIEhBVkVfQ1lHV0lOICovCi0KLS8qIERlZmluZSBpZiB5b3VyIGxpYnJhcmllcyBkZWZpbmUgZGFlbW9uKCkgKi8KLSNkZWZpbmUgSEFWRV9EQUVNT04gMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYGF1dGhlbnRpY2F0ZScsIGFuZCB0byAwIGlmIHlvdQotICAgZG9uJ3QuICovCi0vKiAjdW5kZWYgSEFWRV9ERUNMX0FVVEhFTlRJQ0FURSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYEdMT0JfTk9NQVRDSCcsIGFuZCB0byAwIGlmIHlvdQotICAgZG9uJ3QuICovCi0jZGVmaW5lIEhBVkVfREVDTF9HTE9CX05PTUFUQ0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYGhfZXJybm8nLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotI2RlZmluZSBIQVZFX0RFQ0xfSF9FUlJOTyAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgbG9naW5mYWlsZWQnLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotLyogI3VuZGVmIEhBVkVfREVDTF9MT0dJTkZBSUxFRCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYGxvZ2lucmVzdHJpY3Rpb25zJywgYW5kIHRvIDAgaWYKLSAgIHlvdSBkb24ndC4gKi8KLS8qICN1bmRlZiBIQVZFX0RFQ0xfTE9HSU5SRVNUUklDVElPTlMgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBsb2dpbnN1Y2Nlc3MnLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotLyogI3VuZGVmIEhBVkVfREVDTF9MT0dJTlNVQ0NFU1MgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBNQVhTWU1MSU5LUycsIGFuZCB0byAwIGlmIHlvdQotICAgZG9uJ3QuICovCi0jZGVmaW5lIEhBVkVfREVDTF9NQVhTWU1MSU5LUyAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgb2Zmc2V0b2YnLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotI2RlZmluZSBIQVZFX0RFQ0xfT0ZGU0VUT0YgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYE9fTk9OQkxPQ0snLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotI2RlZmluZSBIQVZFX0RFQ0xfT19OT05CTE9DSyAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgcGFzc3dkZXhwaXJlZCcsIGFuZCB0byAwIGlmIHlvdQotICAgZG9uJ3QuICovCi0vKiAjdW5kZWYgSEFWRV9ERUNMX1BBU1NXREVYUElSRUQgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBzZXRhdXRoZGInLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotLyogI3VuZGVmIEhBVkVfREVDTF9TRVRBVVRIREIgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBTSFVUX1JEJywgYW5kIHRvIDAgaWYgeW91Ci0gICBkb24ndC4gKi8KLSNkZWZpbmUgSEFWRV9ERUNMX1NIVVRfUkQgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYHdyaXRldicsIGFuZCB0byAwIGlmIHlvdSBkb24ndC4KLSAgICovCi0jZGVmaW5lIEhBVkVfREVDTF9XUklURVYgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYF9nZXRsb25nJywgYW5kIHRvIDAgaWYgeW91Ci0gICBkb24ndC4gKi8KLSNkZWZpbmUgSEFWRV9ERUNMX19HRVRMT05HIDAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBfZ2V0c2hvcnQnLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotI2RlZmluZSBIQVZFX0RFQ0xfX0dFVFNIT1JUIDAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIC9kZXYvcHRteCAqLwotI2RlZmluZSBIQVZFX0RFVl9QVE1YIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIC9kZXYvcHRjICovCi0vKiAjdW5kZWYgSEFWRV9ERVZfUFRTX0FORF9QVEMgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkaXJlbnQuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfRElSRU5UX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGRpcmZkJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9ESVJGRCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZGlybmFtZScgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfRElSTkFNRSAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXgnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX0RTQV9HRU5FUkFURV9QQVJBTUVURVJTX0VYIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlbmRpYW4uaD4gaGVhZGVyIGZpbGUuICovCi0jaWZuZGVmIEhBVkVfRU5ESUFOX0gKLSNkZWZpbmUgSEFWRV9FTkRJQU5fSCAxCi0jZW5kaWYKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBlbmR1dGVudCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfRU5EVVRFTlQgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGVuZHV0eGVudCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfRU5EVVRYRU5UIDEKLQotLyogRGVmaW5lIGlmIHlvdXIgc3lzdGVtIGhhcyAvZXRjL2RlZmF1bHQvbG9naW4gKi8KLS8qICN1bmRlZiBIQVZFX0VUQ19ERUZBVUxUX0xPR0lOICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgRVZQX3NoYTI1NicgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfRVZQX1NIQTI1NiAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9leGl0IGluIHV0bXAuaCAqLwotI2RlZmluZSBIQVZFX0VYSVRfSU5fVVRNUCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmNobW9kJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9GQ0hNT0QgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZjaG93bicgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfRkNIT1dOIDEKLQotLyogVXNlIEZfQ0xPU0VNIGZjbnRsIGZvciBjbG9zZWZyb20gKi8KLS8qICN1bmRlZiBIQVZFX0ZDTlRMX0NMT1NFTSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZlYXR1cmVzLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX0ZFQVRVUkVTX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZsb2F0aW5ncG9pbnQuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9GTE9BVElOR1BPSU5UX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmbXRfc2NhbGVkJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX0ZNVF9TQ0FMRUQgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmcmVlYWRkcmluZm8nIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX0ZSRUVBRERSSU5GTyAxCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBmc2Jsa2NudF90Jy4gKi8KLSNkZWZpbmUgSEFWRV9GU0JMS0NOVF9UIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGZzZmlsY250X3QnLiAqLwotI2RlZmluZSBIQVZFX0ZTRklMQ05UX1QgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZzdGF0dmZzJyBmdW5jdGlvbi4gKi8KLS8qICNkZWZpbmUgSEFWRV9GU1RBVFZGUyAxICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnV0aW1lcycgZnVuY3Rpb24uICovCi0vKiAjZGVmaW5lIEhBVkVfRlVUSU1FUyAxICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2FpX3N0cmVycm9yJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9HQUlfU1RSRVJST1IgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGFkZHJpbmZvJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9HRVRBRERSSU5GTyAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0YXVkaXQnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfR0VUQVVESVQgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRhdWRpdF9hZGRyJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX0dFVEFVRElUX0FERFIgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRjd2QnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX0dFVENXRCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0Z3JvdXBsaXN0JyBmdW5jdGlvbi4gKi8KLS8qICNkZWZpbmUgSEFWRV9HRVRHUk9VUExJU1QgMSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGdyc2V0JyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX0dFVEdSU0VUICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0bGFzdGxvZ3hieW5hbWUnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfR0VUTEFTVExPR1hCWU5BTUUgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRsdWlkJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX0dFVExVSUQgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRuYW1laW5mbycgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfR0VUTkFNRUlORk8gMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldG9wdCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfR0VUT1BUIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxnZXRvcHQuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfR0VUT1BUX0ggMQotCi0vKiBEZWZpbmUgaWYgeW91ciBnZXRvcHQoMykgZGVmaW5lcyBhbmQgdXNlcyBvcHRyZXNldCAqLwotLyogI3VuZGVmIEhBVkVfR0VUT1BUX09QVFJFU0VUICovCi0KLS8qIERlZmluZSBpZiB5b3VyIGxpYnJhcmllcyBkZWZpbmUgZ2V0cGFnZXNpemUoKSAqLwotI2RlZmluZSBIQVZFX0dFVFBBR0VTSVpFIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwZWVyZWlkJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX0dFVFBFRVJFSUQgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwZWVydWNyZWQnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfR0VUUEVFUlVDUkVEICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cHdhbmFtJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX0dFVFBXQU5BTSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHJsaW1pdCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfR0VUUkxJTUlUIDEKLQotLyogRGVmaW5lIGlmIGdldHJyc2V0YnluYW1lKCkgZXhpc3RzICovCi0vKiAjdW5kZWYgSEFWRV9HRVRSUlNFVEJZTkFNRSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHJ1c2FnZScgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9HRVRSVVNBR0UgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRzZXVzZXJieW5hbWUnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfR0VUU0VVU0VSQllOQU1FICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dGltZW9mZGF5JyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHR0eWVudCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfR0VUVFRZRU5UIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR1dGVudCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfR0VUVVRFTlQgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHV0aWQnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX0dFVFVUSUQgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHV0bGluZScgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfR0VUVVRMSU5FIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR1dHhlbnQnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX0dFVFVUWEVOVCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dXR4aWQnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX0dFVFVUWElEIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR1dHhsaW5lJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9HRVRVVFhMSU5FIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR1dHh1c2VyJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX0dFVFVUWFVTRVIgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRfZGVmYXVsdF9jb250ZXh0X3dpdGhfbGV2ZWwnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfR0VUX0RFRkFVTFRfQ09OVEVYVF9XSVRIX0xFVkVMICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2xvYicgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfR0xPQiAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Z2xvYi5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9HTE9CX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdyb3VwX2Zyb21fZ2lkJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX0dST1VQX0ZST01fR0lEICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Z3NzYXBpX2dlbmVyaWMuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9HU1NBUElfR0VORVJJQ19IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Z3NzYXBpL2dzc2FwaV9nZW5lcmljLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfR1NTQVBJX0dTU0FQSV9HRU5FUklDX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxnc3NhcGkvZ3NzYXBpLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfR1NTQVBJX0dTU0FQSV9IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Z3NzYXBpL2dzc2FwaV9rcmI1Lmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfR1NTQVBJX0dTU0FQSV9LUkI1X0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxnc3NhcGkuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9HU1NBUElfSCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGdzc2FwaV9rcmI1Lmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfR1NTQVBJX0tSQjVfSCAqLwotCi0vKiBEZWZpbmUgaWYgSEVBREVSLmFkIGV4aXN0cyBpbiBhcnBhL25hbWVzZXIuaCAqLwotI2RlZmluZSBIQVZFX0hFQURFUl9BRCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9ob3N0IGluIHV0bXAuaCAqLwotI2RlZmluZSBIQVZFX0hPU1RfSU5fVVRNUCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9ob3N0IGluIHV0bXB4LmggKi8KLSNkZWZpbmUgSEFWRV9IT1NUX0lOX1VUTVBYIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpYWYuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9JQUZfSCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGlhLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfSUFfSCAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdXRfaWQgaW4gdXRtcC5oICovCi0jZGVmaW5lIEhBVkVfSURfSU5fVVRNUCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9pZCBpbiB1dG1weC5oICovCi0jZGVmaW5lIEhBVkVfSURfSU5fVVRNUFggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGluZXRfYXRvbicgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfSU5FVF9BVE9OIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpbmV0X250b2EnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX0lORVRfTlRPQSAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaW5ldF9udG9wJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9JTkVUX05UT1AgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlubmV0Z3InIGZ1bmN0aW9uLiAqLwotLyogI2RlZmluZSBIQVZFX0lOTkVUR1IgMSAqLwotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgaW50NjRfdCBkYXRhIHR5cGUgKi8KLSNkZWZpbmUgSEFWRV9JTlQ2NF9UIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIGludHh4X3QgZGF0YSB0eXBlICovCi0jZGVmaW5lIEhBVkVfSU5UWFhfVCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBpbl9hZGRyX3QnLiAqLwotI2RlZmluZSBIQVZFX0lOX0FERFJfVCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBpbl9wb3J0X3QnLiAqLwotLyogI2RlZmluZSBIQVZFX0lOX1BPUlRfVCAxICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBpc2JsYW5rKDNDKS4gKi8KLSNkZWZpbmUgSEFWRV9JU0JMQU5LIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsYXN0bG9nLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX0xBU1RMT0dfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGliYXVkaXQuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9MSUJBVURJVF9IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYnNtJyBsaWJyYXJ5ICgtbGJzbSkuICovCi0vKiAjdW5kZWYgSEFWRV9MSUJCU00gKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjcnlwdCcgbGlicmFyeSAoLWxjcnlwdCkuICovCi0vKiAjdW5kZWYgSEFWRV9MSUJDUllQVCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGRsJyBsaWJyYXJ5ICgtbGRsKS4gKi8KLS8qICN1bmRlZiBIQVZFX0xJQkRMICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGliZ2VuLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX0xJQkdFTl9IIDEKLQotLyogRGVmaW5lIGlmIHN5c3RlbSBoYXMgbGliaWFmIHRoYXQgc3VwcG9ydHMgc2V0X2lkICovCi0vKiAjdW5kZWYgSEFWRV9MSUJJQUYgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBuZXR3b3JrJyBsaWJyYXJ5ICgtbG5ldHdvcmspLiAqLwotLyogI3VuZGVmIEhBVkVfTElCTkVUV09SSyAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5zbCcgbGlicmFyeSAoLWxuc2wpLiAqLwotI2RlZmluZSBIQVZFX0xJQk5TTCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGFtJyBsaWJyYXJ5ICgtbHBhbSkuICovCi0vKiAjdW5kZWYgSEFWRV9MSUJQQU0gKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzb2NrZXQnIGxpYnJhcnkgKC1sc29ja2V0KS4gKi8KLS8qICN1bmRlZiBIQVZFX0xJQlNPQ0tFVCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpYnV0aWwuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9MSUJVVElMX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB4bmV0JyBsaWJyYXJ5ICgtbHhuZXQpLiAqLwotLyogI3VuZGVmIEhBVkVfTElCWE5FVCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHonIGxpYnJhcnkgKC1seikuICovCi0jZGVmaW5lIEhBVkVfTElCWiAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX0xJTUlUU19IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9pZl90dW4uaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfTElOVVhfSUZfVFVOX0ggMQotCi0vKiBEZWZpbmUgaWYgeW91ciBsaWJyYXJpZXMgZGVmaW5lIGxvZ2luKCkgKi8KLS8qICNkZWZpbmUgSEFWRV9MT0dJTiAxICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bG9naW5fY2FwLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfTE9HSU5fQ0FQX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2dpbl9nZXRjYXBib29sJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX0xPR0lOX0dFVENBUEJPT0wgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsb2dpbi5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX0xPR0lOX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2dvdXQnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX0xPR09VVCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbG9nd3RtcCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfTE9HV1RNUCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBsb25nIGRvdWJsZScuICovCi0jZGVmaW5lIEhBVkVfTE9OR19ET1VCTEUgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgbG9uZyBsb25nJy4gKi8KLSNkZWZpbmUgSEFWRV9MT05HX0xPTkcgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1haWxsb2NrLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfTUFJTExPQ0tfSCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1kNV9jcnlwdCcgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9NRDVfQ1JZUFQgKi8KLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIGFsbG93IE1ENSBwYXNzd29yZHMgKi8KLS8qICN1bmRlZiBIQVZFX01ENV9QQVNTV09SRFMgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZW1tb3ZlJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9NRU1NT1ZFIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rZHRlbXAnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX01LRFRFTVAgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1tYXAnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX01NQVAgMQotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgbW9kZV90IGRhdGEgdHlwZSAqLwotI2RlZmluZSBIQVZFX01PREVfVCAxCi0KLS8qIFNvbWUgc3lzdGVtcyBwdXQgbmFub3NsZWVwIG91dHNpZGUgb2YgbGliYyAqLwotI2RlZmluZSBIQVZFX05BTk9TTEVFUCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmRpci5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX05ESVJfSCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGRiLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX05FVERCX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGdyb3VwLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfTkVUR1JPVVBfSCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldC9pZl90dW4uaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9ORVRfSUZfVFVOX0ggKi8KLQotLyogRGVmaW5lIGlmIHlvdSBhcmUgb24gTmVYVCAqLwotLyogI3VuZGVmIEhBVkVfTkVYVCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5nZXRhZGRyaW5mbycgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9OR0VUQUREUklORk8gKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBuc2xlZXAnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfTlNMRUVQICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgb2dldGFkZHJpbmZvJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX09HRVRBRERSSU5GTyAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYW4gb2xkIHZlcnNpb24gb2YgUEFNIHdoaWNoIHRha2VzIG9ubHkgb25lIGFyZ3VtZW50IHRvCi0gICBwYW1fc3RyZXJyb3IgKi8KLS8qICN1bmRlZiBIQVZFX09MRF9QQU0gKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBvcGVubG9nX3InIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfT1BFTkxPR19SICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgb3BlbnB0eScgZnVuY3Rpb24uICovCi0vKiAjZGVmaW5lIEhBVkVfT1BFTlBUWSAxICovCi0KLS8qIERlZmluZSBpZiB5b3VyIHNzbCBoZWFkZXJzIGFyZSBpbmNsdWRlZCB3aXRoICNpbmNsdWRlIDxvcGVuc3NsL2hlYWRlci5oPiAqLwotI2RlZmluZSBIQVZFX09QRU5TU0wgMQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgRGlnaXRhbCBVbml4IFNlY3VyaXR5IEludGVncmF0aW9uIEFyY2hpdGVjdHVyZSAqLwotLyogI3VuZGVmIEhBVkVfT1NGX1NJQSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBhbV9nZXRlbnZsaXN0JyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX1BBTV9HRVRFTlZMSVNUICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cGFtL3BhbV9hcHBsLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfUEFNX1BBTV9BUFBMX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwYW1fcHV0ZW52JyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX1BBTV9QVVRFTlYgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwYXRocy5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9QQVRIU19IIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X3BpZCBpbiB1dG1wLmggKi8KLSNkZWZpbmUgSEFWRV9QSURfSU5fVVRNUCAxCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBwaWRfdCBkYXRhIHR5cGUgKi8KLSNkZWZpbmUgSEFWRV9QSURfVCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG9sbCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfUE9MTCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cG9sbC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9QT0xMX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHByY3RsJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9QUkNUTCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSAvcHJvYy8kcGlkL2ZkICovCi0jZGVmaW5lIEhBVkVfUFJPQ19QSUQgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBzdGF0JyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX1BTVEFUICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cHR5Lmg+IGhlYWRlciBmaWxlLiAqLwotLyogI2RlZmluZSBIQVZFX1BUWV9IIDEgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwdXR1dGxpbmUnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1BVVFVUTElORSAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHV0dXR4bGluZScgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfUFVUVVRYTElORSAxCi0KLS8qIERlZmluZSBpZiB5b3VyIHBhc3N3b3JkIGhhcyBhIHB3X2NoYW5nZSBmaWVsZCAqLwotLyogI3VuZGVmIEhBVkVfUFdfQ0hBTkdFX0lOX1BBU1NXRCAqLwotCi0vKiBEZWZpbmUgaWYgeW91ciBwYXNzd29yZCBoYXMgYSBwd19nZWNvcyBmaWVsZCAqLwotLyogI3VuZGVmIEhBVkVfUFdfR0VDT1NfSU5fUEFTU1dEICovCi0KLS8qIERlZmluZSBpZiB5b3VyIHBhc3N3b3JkIGhhcyBhIHB3X2NsYXNzIGZpZWxkICovCi0vKiAjdW5kZWYgSEFWRV9QV19DTEFTU19JTl9QQVNTV0QgKi8KLQotLyogRGVmaW5lIGlmIHlvdXIgcGFzc3dvcmQgaGFzIGEgcHdfZXhwaXJlIGZpZWxkICovCi0vKiAjdW5kZWYgSEFWRV9QV19FWFBJUkVfSU5fUEFTU1dEICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmVhZHBhc3NwaHJhc2UnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfUkVBRFBBU1NQSFJBU0UgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxyZWFkcGFzc3BocmFzZS5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1JFQURQQVNTUEhSQVNFX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByZWFscGF0aCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfUkVBTFBBVEggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJlY3Ztc2cnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1JFQ1ZNU0cgMQotCi0vKiBzeXMvcmVzb3VyY2UuaCBoYXMgUkxJTUlUX05QUk9DICovCi0jZGVmaW5lIEhBVkVfUkxJTUlUX05QUk9DIC8qKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxycGMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjZGVmaW5lIEhBVkVfUlBDX1RZUEVTX0ggMSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJyZXN2cG9ydF9hZicgZnVuY3Rpb24uICovCi0vKiAjZGVmaW5lIEhBVkVfUlJFU1ZQT1JUX0FGIDEgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBSU0FfZ2VuZXJhdGVfa2V5X2V4JyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9SU0FfR0VORVJBVEVfS0VZX0VYIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9SU0FfR0VUX0RFRkFVTFRfTUVUSE9EIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzYW5kYm94Lmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfU0FOREJPWF9IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2FuZGJveF9pbml0JyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX1NBTkRCT1hfSU5JVCAqLwotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgc2FfZmFtaWx5X3QgZGF0YSB0eXBlICovCi0jZGVmaW5lIEhBVkVfU0FfRkFNSUxZX1QgMQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgU2VjdXJlV2FyZS1iYXNlZCBwcm90ZWN0ZWQgcGFzc3dvcmQgZGF0YWJhc2UgKi8KLS8qICN1bmRlZiBIQVZFX1NFQ1VSRVdBUkUgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzZWN1cml0eS9wYW1fYXBwbC5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1NFQ1VSSVRZX1BBTV9BUFBMX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZW5kbXNnJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TRU5ETVNHIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRhdXRoZGInIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfU0VUQVVUSERCICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0ZHRhYmxlc2l6ZScgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9TRVREVEFCTEVTSVpFICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0ZWdpZCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfU0VURUdJRCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0ZW52JyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TRVRFTlYgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGV1aWQnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NFVEVVSUQgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGdyb3VwZW50JyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX1NFVEdST1VQRU5UICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0Z3JvdXBzJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TRVRHUk9VUFMgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGxvZ2luJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX1NFVExPR0lOICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0bHVpZCcgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9TRVRMVUlEICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cGFzc2VudCcgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9TRVRQQVNTRU5UICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cGNyZWQnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfU0VUUENSRUQgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRwcm9jdGl0bGUnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfU0VUUFJPQ1RJVExFICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cmVnaWQnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NFVFJFR0lEIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRyZXNnaWQnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NFVFJFU0dJRCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cmVzdWlkJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TRVRSRVNVSUQgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHJldWlkJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TRVRSRVVJRCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cmxpbWl0JyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TRVRSTElNSVQgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHNpZCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfU0VUU0lEIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXR1dGVudCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfU0VUVVRFTlQgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHV0eGRiJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX1NFVFVUWERCICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0dXR4ZW50JyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TRVRVVFhFTlQgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHZidWYnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NFVFZCVUYgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldF9pZCcgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9TRVRfSUQgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBTSEEyNTZfVXBkYXRlJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TSEEyNTZfVVBEQVRFIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaGEyLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfU0hBMl9IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2hhZG93Lmg+IGhlYWRlciBmaWxlLiAqLwotLyogI2RlZmluZSBIQVZFX1NIQURPV19IIDEgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWdhY3Rpb24nIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NJR0FDVElPTiAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lndmVjJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TSUdWRUMgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgc2lnX2F0b21pY190Jy4gKi8KLSNkZWZpbmUgSEFWRV9TSUdfQVRPTUlDX1QgMQotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgc2l6ZV90IGRhdGEgdHlwZSAqLwotI2RlZmluZSBIQVZFX1NJWkVfVCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc25wcmludGYnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NOUFJJTlRGIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzb2NrZXRwYWlyJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TT0NLRVRQQUlSIDEKLQotLyogSGF2ZSBQRUVSQ1JFRCBzb2NrZXQgb3B0aW9uICovCi0jZGVmaW5lIEhBVkVfU09fUEVFUkNSRUQgMQotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgc3NpemVfdCBkYXRhIHR5cGUgKi8KLSNkZWZpbmUgSEFWRV9TU0laRV9UIDEKLQotLyogRmllbGRzIGluIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICovCi0jZGVmaW5lIEhBVkVfU1NfRkFNSUxZX0lOX1NTIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdGF0ZnMnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NUQVRGUyAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RhdHZmcycgZnVuY3Rpb24uICovCi0vKiAjZGVmaW5lIEhBVkVfU1RBVFZGUyAxICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkZGVmLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NURERFRl9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1RESU5UX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZHVwJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TVFJEVVAgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TVFJFUlJPUiAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZnRpbWUnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NUUkZUSU1FIDEKLQotLyogU2lsbHkgbWtzdGVtcCgpICovCi0jZGVmaW5lIEhBVkVfU1RSSUNUX01LU1RFTVAgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmxjYXQnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfU1RSTENBVCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmxjcHknIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfU1RSTENQWSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cm1vZGUnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfU1RSTU9ERSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cm52aXMnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfU1RSTlZJUyAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnB0aW1lJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TVFJQVElNRSAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3Ryc2VwJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TVFJTRVAgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvbGwnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NUUlRPTEwgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvbnVtJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX1NUUlRPTlVNICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG91bCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfU1RSVE9VTCAxCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3QgYWRkcmluZm8gZGF0YSB0eXBlICovCi0jZGVmaW5lIEhBVkVfU1RSVUNUX0FERFJJTkZPIDEKLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCBpbjZfYWRkciBkYXRhIHR5cGUgKi8KLSNkZWZpbmUgSEFWRV9TVFJVQ1RfSU42X0FERFIgMQotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgc3RydWN0IHNvY2thZGRyX2luNiBkYXRhIHR5cGUgKi8KLSNkZWZpbmUgSEFWRV9TVFJVQ1RfU09DS0FERFJfSU42IDEKLQotLyogRGVmaW5lIHRvIDEgaWYgYHNpbjZfc2NvcGVfaWQnIGlzIGEgbWVtYmVyIG9mIGBzdHJ1Y3Qgc29ja2FkZHJfaW42Jy4gKi8KLSNkZWZpbmUgSEFWRV9TVFJVQ1RfU09DS0FERFJfSU42X1NJTjZfU0NPUEVfSUQgMQotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZGF0YSB0eXBlICovCi0jZGVmaW5lIEhBVkVfU1RSVUNUX1NPQ0tBRERSX1NUT1JBR0UgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiBgc3RfYmxrc2l6ZScgaXMgYSBtZW1iZXIgb2YgYHN0cnVjdCBzdGF0Jy4gKi8KLSNkZWZpbmUgSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTEtTSVpFIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHN0cnVjdCB0aW1lc3BlYycuICovCi0jZGVmaW5lIEhBVkVfU1RSVUNUX1RJTUVTUEVDIDEKLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCB0aW1ldmFsICovCi0jZGVmaW5lIEhBVkVfU1RSVUNUX1RJTUVWQUwgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN3YXAzMicgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9TV0FQMzIgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzeXNjb25mJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TWVNDT05GIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN5c2xlbiBpbiB1dG1weC5oICovCi0vKiAjdW5kZWYgSEFWRV9TWVNMRU5fSU5fVVRNUFggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvYXVkaXQuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9TWVNfQVVESVRfSCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9iaXR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI2RlZmluZSBIQVZFX1NZU19CSVRZUEVTX0ggMSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9ic2R0dHkuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9TWVNfQlNEVFRZX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvY2RlZnMuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1lTX0NERUZTX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXIuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1lTX0RJUl9IIDEKLQotLyogRGVmaW5lIGlmIHlvdXIgc3lzdGVtIGRlZmluZXMgc3lzX2Vycmxpc3RbXSAqLwotI2RlZmluZSBIQVZFX1NZU19FUlJMSVNUIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbW1hbi5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TWVNfTU1BTl9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbW91bnQuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1lTX01PVU5UX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9uZGlyLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfU1lTX05ESVJfSCAqLwotCi0vKiBEZWZpbmUgaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBzeXNfbmVyciAqLwotI2RlZmluZSBIQVZFX1NZU19ORVJSIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcG9sbC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TWVNfUE9MTF9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcHJjdGwuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1lTX1BSQ1RMX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1NZU19QU1RBVF9IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3B0bXMuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9TWVNfUFRNU19IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbGVjdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TWVNfU0VMRUNUX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0dmZzLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI2RlZmluZSBIQVZFX1NZU19TVEFUVkZTX0ggMSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdHJlYW0uaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9TWVNfU1RSRUFNX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3Ryb3B0cy5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1NZU19TVFJPUFRTX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RydGlvLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfU1lTX1NUUlRJT19IICovCi0KLS8qIEZvcmNlIHVzZSBvZiBzeXMvc3lzbG9nLmggb24gVWx0cml4ICovCi0vKiAjdW5kZWYgSEFWRV9TWVNfU1lTTE9HX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3lzbWFjcm9zLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NZU19TWVNNQUNST1NfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWVycy5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1NZU19USU1FUlNfSCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NZU19USU1FX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3VuLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NZU19VTl9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0Y2dldHBncnAnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1RDR0VUUEdSUCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGNzZW5kYnJlYWsnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1RDU0VOREJSRUFLIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0aW1lJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9USU1FIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1RJTUVfSCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF90aW1lIGluIHV0bXAuaCAqLwotLyogI3VuZGVmIEhBVkVfVElNRV9JTl9VVE1QICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF90aW1lIGluIHV0bXB4LmggKi8KLS8qICN1bmRlZiBIQVZFX1RJTUVfSU5fVVRNUFggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0aW1pbmdzYWZlX2JjbXAnIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfVElNSU5HU0FGRV9CQ01QICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dG1wZGlyLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfVE1QRElSX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0cnVuY2F0ZScgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfVFJVTkNBVEUgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHR0eWVudC5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICNkZWZpbmUgSEFWRV9UVFlFTlRfSCAxICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF90diBpbiB1dG1wLmggKi8KLSNkZWZpbmUgSEFWRV9UVl9JTl9VVE1QIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X3R2IGluIHV0bXB4LmggKi8KLSNkZWZpbmUgSEFWRV9UVl9JTl9VVE1QWCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF90eXBlIGluIHV0bXAuaCAqLwotI2RlZmluZSBIQVZFX1RZUEVfSU5fVVRNUCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF90eXBlIGluIHV0bXB4LmggKi8KLSNkZWZpbmUgSEFWRV9UWVBFX0lOX1VUTVBYIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1Y3JlZC5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1VDUkVEX0ggKi8KLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIHVpbnR4eF90IGRhdGEgdHlwZSAqLwotI2RlZmluZSBIQVZFX1VJTlRYWF9UIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHVuc2V0ZW52JyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9VTlNFVEVOViAxCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGB1bnNpZ25lZCBsb25nIGxvbmcnLiAqLwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0xPTkdfTE9ORyAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXBkd3RtcCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfVVBEV1RNUCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXBkd3RtcHgnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1VQRFdUTVBYIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1c2Vyc2VjLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfVVNFUlNFQ19IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXNlcl9mcm9tX3VpZCcgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9VU0VSX0ZST01fVUlEICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dXRpbC5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1VUSUxfSCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHV0aW1lcycgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfVVRJTUVTIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1dGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9VVElNRV9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1dG1wbmFtZScgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfVVRNUE5BTUUgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHV0bXB4bmFtZScgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfVVRNUFhOQU1FIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1dG1weC5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICNkZWZpbmUgSEFWRV9VVE1QWF9IIDEgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1dG1wLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1VUTVBfSCAxCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSB1X2NoYXIgZGF0YSB0eXBlICovCi0jZGVmaW5lIEhBVkVfVV9DSEFSIDEKLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIHVfaW50IGRhdGEgdHlwZSAqLwotI2RlZmluZSBIQVZFX1VfSU5UIDEKLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIHVfaW50NjRfdCBkYXRhIHR5cGUgKi8KLSNkZWZpbmUgSEFWRV9VX0lOVDY0X1QgMQotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgdV9pbnR4eF90IGRhdGEgdHlwZSAqLwotI2RlZmluZSBIQVZFX1VfSU5UWFhfVCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdmFzcHJpbnRmJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9WQVNQUklOVEYgMQotCi0vKiBEZWZpbmUgaWYgdmFfY29weSBleGlzdHMgKi8KLSNkZWZpbmUgSEFWRV9WQV9DT1BZIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2aGFuZ3VwJyBmdW5jdGlvbi4gKi8KLS8qICNkZWZpbmUgSEFWRV9WSEFOR1VQIDEgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx2aXMuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9WSVNfSCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZzbnByaW50ZicgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfVlNOUFJJTlRGIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB3YWl0cGlkJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9XQUlUUElEIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZ2V0bG9uZycgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfX0dFVExPTkcgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9nZXRwdHknIGZ1bmN0aW9uLiAqLwotLyogI3VuZGVmIEhBVkVfX0dFVFBUWSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9nZXRzaG9ydCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfX0dFVFNIT1JUIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCBfX3Jlc19zdGF0ZSBfcmVzIGFzIGFuIGV4dGVybiAqLwotI2RlZmluZSBIQVZFX19SRVNfRVhURVJOIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfX2I2NF9udG9wJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX19fQjY0X05UT1AgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfX2I2NF9wdG9uJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX19fQjY0X1BUT04gKi8KLQotLyogRGVmaW5lIGlmIGNvbXBpbGVyIGltcGxlbWVudHMgX19GVU5DVElPTl9fICovCi0jZGVmaW5lIEhBVkVfX19GVU5DVElPTl9fIDEKLQotLyogRGVmaW5lIGlmIGxpYmMgZGVmaW5lcyBfX3Byb2duYW1lICovCi0jZGVmaW5lIEhBVkVfX19QUk9HTkFNRSAxCi0KLS8qIEZpZWxkcyBpbiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqLwotLyogI3VuZGVmIEhBVkVfX19TU19GQU1JTFlfSU5fU1MgKi8KLQotLyogRGVmaW5lIGlmIF9fdmFfY29weSBleGlzdHMgKi8KLSNkZWZpbmUgSEFWRV9fX1ZBX0NPUFkgMQotCi0vKiBEZWZpbmUgaWYgY29tcGlsZXIgaW1wbGVtZW50cyBfX2Z1bmNfXyAqLwotI2RlZmluZSBIQVZFX19fZnVuY19fIDEKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91IGFyZSB1c2luZyB0aGUgSGVpbWRhbCB2ZXJzaW9uIG9mIEtlcmJlcm9zIFY1ICovCi0vKiAjdW5kZWYgSEVJTURBTCAqLwotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gdXNlIElQIGFkZHJlc3MgaW5zdGVhZCBvZiBob3N0bmFtZSBpbiAkRElTUExBWSAqLwotLyogI3VuZGVmIElQQUREUl9JTl9ESVNQTEFZICovCi0KLS8qIERldGVjdCBJUHY0IGluIElQdjYgbWFwcGVkIGFkZHJlc3NlcyBhbmQgdHJlYXQgYXMgSVB2NCAqLwotI2RlZmluZSBJUFY0X0lOX0lQVjYgMQotCi0vKiBEZWZpbmUgaWYgeW91ciBzeXN0ZW0gY2hva2VkIG9uIElQIFRPUyBzZXR0aW5nICovCi0vKiAjdW5kZWYgSVBfVE9TX0lTX0JST0tFTiAqLwotCi0vKiBEZWZpbmUgaWYgeW91IHdhbnQgS2VyYmVyb3MgNSBzdXBwb3J0ICovCi0vKiAjdW5kZWYgS1JCNSAqLwotCi0vKiBEZWZpbmUgaWYgcHV0dXR4bGluZSB1cGRhdGVzIGxhc3Rsb2cgdG9vICovCi0vKiAjdW5kZWYgTEFTVExPR19XUklURV9QVVRVVFhMSU5FICovCi0KLS8qIERlZmluZSBpZiB5b3Ugd2FudCBUQ1AgV3JhcHBlcnMgc3VwcG9ydCAqLwotLyogI3VuZGVmIExJQldSQVAgKi8KLQotLyogRGVmaW5lIHRvIHdoYXRldmVyIGxpbmsoKSByZXR1cm5zIGZvciAibm90IHN1cHBvcnRlZCIgaWYgaXQgZG9lc24ndCByZXR1cm4KLSAgIEVPUE5PVFNVUFAuICovCi0jZGVmaW5lIExJTktfT1BOT1RTVVBQX0VSUk5PIEVQRVJNCi0KLS8qIEFkanVzdCBMaW51eCBvdXQtb2YtbWVtb3J5IGtpbGxlciAqLwotI2RlZmluZSBMSU5VWF9PT01fQURKVVNUIDEKLQotLyogbWF4IHZhbHVlIG9mIGxvbmcgbG9uZyBjYWxjdWxhdGVkIGJ5IGNvbmZpZ3VyZSAqLwotLyogI3VuZGVmIExMT05HX01BWCAqLwotCi0vKiBtaW4gdmFsdWUgb2YgbG9uZyBsb25nIGNhbGN1bGF0ZWQgYnkgY29uZmlndXJlICovCi0vKiAjdW5kZWYgTExPTkdfTUlOICovCi0KLS8qIEFjY291bnQgbG9ja2VkIHdpdGggcHcoMSkgKi8KLSNkZWZpbmUgTE9DS0VEX1BBU1NXRF9QUkVGSVggIiEiCi0KLS8qIFN0cmluZyB1c2VkIGluIC9ldGMvcGFzc3dkIHRvIGRlbm90ZSBsb2NrZWQgYWNjb3VudCAqLwotLyogI3VuZGVmIExPQ0tFRF9QQVNTV0RfU1RSSU5HICovCi0KLS8qIFN0cmluZyB1c2VkIGluIC9ldGMvcGFzc3dkIHRvIGRlbm90ZSBsb2NrZWQgYWNjb3VudCAqLwotLyogI3VuZGVmIExPQ0tFRF9QQVNTV0RfU1VCU1RSICovCi0KLS8qIFNvbWUgdmVyc2lvbnMgb2YgL2Jpbi9sb2dpbiBuZWVkIHRoZSBURVJNIHN1cHBsaWVkIG9uIHRoZSBjb21tYW5kbGluZSAqLwotLyogI3VuZGVmIExPR0lOX05FRURTX1RFUk0gKi8KLQotLyogU29tZSBzeXN0ZW1zIG5lZWQgYSB1dG1weCBlbnRyeSBmb3IgL2Jpbi9sb2dpbiB0byB3b3JrICovCi0vKiAjdW5kZWYgTE9HSU5fTkVFRFNfVVRNUFggKi8KLQotLyogRGVmaW5lIGlmIHlvdXIgbG9naW4gcHJvZ3JhbSBjYW5ub3QgaGFuZGxlIGVuZCBvZiBvcHRpb25zICgiLS0iKSAqLwotLyogI3VuZGVmIExPR0lOX05PX0VORE9QVCAqLwotCi0vKiBJZiB5b3VyIGhlYWRlciBmaWxlcyBkb24ndCBkZWZpbmUgTE9HSU5fUFJPR1JBTSwgdGhlbiB1c2UgdGhpcyAoZGV0ZWN0ZWQpCi0gICBmcm9tIGVudmlyb25tZW50IGFuZCBQQVRIICovCi0jZGVmaW5lIExPR0lOX1BST0dSQU1fRkFMTEJBQ0sgIi9iaW4vbG9naW4iCi0KLS8qIFNldCB0aGlzIHRvIHlvdXIgbWFpbCBkaXJlY3RvcnkgaWYgeW91IGRvIG5vdCBoYXZlIF9QQVRIX01BSUxESVIgKi8KLS8qICN1bmRlZiBNQUlMX0RJUkVDVE9SWSAqLwotCi0vKiBEZWZpbmUgb24gKm50by1xbnggc3lzdGVtcyAqLwotI2RlZmluZSBNSVNTSU5HX0ZEX01BU0sgMQotCi0vKiBEZWZpbmUgb24gKm50by1xbnggc3lzdGVtcyAqLwotI2RlZmluZSBNSVNTSU5HX0hPV01BTlkgMQotCi0vKiBEZWZpbmUgb24gKm50by1xbnggc3lzdGVtcyAqLwotLyogI3VuZGVmIE1JU1NJTkdfTkZEQklUUyAqLwotCi0vKiBOZWVkIHNldHBncnAgdG8gYWNxdWlyZSBjb250cm9sbGluZyB0dHkgKi8KLS8qICN1bmRlZiBORUVEX1NFVFBHUlAgKi8KLQotLyogRGVmaW5lIGlmIHRoZSBjb25jZXB0IG9mIHBvcnRzIG9ubHkgYWNjZXNzaWJsZSB0byBzdXBlcnVzZXJzIGlzbid0IGtub3duICovCi0vKiAjdW5kZWYgTk9fSVBQT1JUX1JFU0VSVkVEX0NPTkNFUFQgKi8KLQotLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBsYXN0bG9nIGluIHNlc3Npb24uYyAqLwotLyogI3VuZGVmIE5PX1NTSF9MQVNUTE9HICovCi0KLS8qIERlZmluZSBpZiBYMTEgZG9lc24ndCBzdXBwb3J0IEFGX1VOSVggc29ja2V0cyBvbiB0aGF0IHN5c3RlbSAqLwotLyogI3VuZGVmIE5PX1gxMV9VTklYX1NPQ0tFVFMgKi8KLQotLyogRGVmaW5lIGlmIEVWUF9EaWdlc3RVcGRhdGUgcmV0dXJucyB2b2lkICovCi0vKiAjdW5kZWYgT1BFTlNTTF9FVlBfRElHRVNUVVBEQVRFX1ZPSUQgKi8KLQotLyogbGliY3J5cHRvIGluY2x1ZGVzIGNvbXBsZXRlIEVDQyBzdXBwb3J0ICovCi0jZGVmaW5lIE9QRU5TU0xfSEFTX0VDQyAxCi0KLS8qIGxpYmNyeXB0byBpcyBtaXNzaW5nIEFFUyAxOTIgYW5kIDI1NiBiaXQgZnVuY3Rpb25zICovCi0vKiAjdW5kZWYgT1BFTlNTTF9MT0JPVE9NSVNFRF9BRVMgKi8KLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IE9wZW5TU0wncyBpbnRlcm5hbGx5IHNlZWRlZCBQUk5HIG9ubHkgKi8KLSNkZWZpbmUgT1BFTlNTTF9QUk5HX09OTFkgMQotCi0vKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KLSNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIm9wZW5zc2gtdW5peC1kZXZAbWluZHJvdC5vcmciCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSNkZWZpbmUgUEFDS0FHRV9OQU1FICJPcGVuU1NIIgotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJPcGVuU1NIIFBvcnRhYmxlIgotCi0vKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAib3BlbnNzaCIKLQotLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KLSNkZWZpbmUgUEFDS0FHRV9VUkwgIiIKLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICJQb3J0YWJsZSIKLQotLyogRGVmaW5lIGlmIHlvdSBhcmUgdXNpbmcgU29sYXJpcy1kZXJpdmVkIFBBTSB3aGljaCBwYXNzZXMgcGFtX21lc3NhZ2VzIHRvCi0gICB0aGUgY29udmVyc2F0aW9uIGZ1bmN0aW9uIHdpdGggYW4gZXh0cmEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KLS8qICN1bmRlZiBQQU1fU1VOX0NPREVCQVNFICovCi0KLS8qIFdvcmsgYXJvdW5kIHByb2JsZW1hdGljIExpbnV4IFBBTSBtb2R1bGVzIGhhbmRsaW5nIG9mIFBBTV9UVFkgKi8KLSNkZWZpbmUgUEFNX1RUWV9LTFVER0UgMQotCi0vKiBtdXN0IHN1cHBseSB1c2VybmFtZSB0byBwYXNzd2QgKi8KLS8qICN1bmRlZiBQQVNTV0RfTkVFRFNfVVNFUk5BTUUgKi8KLQotLyogUG9ydCBudW1iZXIgb2YgUFJOR0QvRUdEIHJhbmRvbSBudW1iZXIgc29ja2V0ICovCi0vKiAjdW5kZWYgUFJOR0RfUE9SVCAqLwotCi0vKiBMb2NhdGlvbiBvZiBQUk5HRC9FR0QgcmFuZG9tIG51bWJlciBzb2NrZXQgKi8KLS8qICN1bmRlZiBQUk5HRF9TT0NLRVQgKi8KLQotLyogcmVhZCgxKSBjYW4gcmV0dXJuIDAgZm9yIGEgbm9uLWNsb3NlZCBmZCAqLwotLyogI3VuZGVmIFBUWV9aRVJPUkVBRCAqLwotCi0vKiBTYW5kYm94IHVzaW5nIERhcndpbiBzYW5kYm94X2luaXQoMykgKi8KLS8qICN1bmRlZiBTQU5EQk9YX0RBUldJTiAqLwotCi0vKiBubyBwcml2c2VwIHNhbmRib3hpbmcgKi8KLS8qICN1bmRlZiBTQU5EQk9YX05VTEwgKi8KLQotLyogU2FuZGJveCB1c2luZyBzZXRybGltaXQoMikgKi8KLSNkZWZpbmUgU0FOREJPWF9STElNSVQgMQotCi0vKiBTYW5kYm94IHVzaW5nIHN5c3RyYWNlKDQpICovCi0vKiAjdW5kZWYgU0FOREJPWF9TWVNUUkFDRSAqLwotCi0vKiBEZWZpbmUgaWYgeW91ciBwbGF0Zm9ybSBicmVha3MgZG9pbmcgYSBzZXRldWlkIGJlZm9yZSBhIHNldHVpZCAqLwotLyogI3VuZGVmIFNFVEVVSURfQlJFQUtTX1NFVFVJRCAqLwotCi0vKiBUaGUgc2l6ZSBvZiBgY2hhcicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KLSNkZWZpbmUgU0laRU9GX0NIQVIgMQotCi0vKiBUaGUgc2l6ZSBvZiBgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotI2RlZmluZSBTSVpFT0ZfSU5UIDQKLQotLyogVGhlIHNpemUgb2YgYGxvbmcgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotI2RlZmluZSBTSVpFT0ZfTE9OR19JTlQgOAotCi0vKiBUaGUgc2l6ZSBvZiBgbG9uZyBsb25nIGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KLSNkZWZpbmUgU0laRU9GX0xPTkdfTE9OR19JTlQgOAotCi0vKiBUaGUgc2l6ZSBvZiBgc2hvcnQgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotI2RlZmluZSBTSVpFT0ZfU0hPUlRfSU5UIDIKLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IFMvS2V5IHN1cHBvcnQgKi8KLS8qICN1bmRlZiBTS0VZICovCi0KLS8qIERlZmluZSBpZiB5b3VyIHNrZXljaGFsbGVuZ2UoKSBmdW5jdGlvbiB0YWtlcyA0IGFyZ3VtZW50cyAoTmV0QlNEKSAqLwotLyogI3VuZGVmIFNLRVlDSEFMTEVOR0VfNEFSRyAqLwotCi0vKiBEZWZpbmUgYXMgY29uc3QgaWYgc25wcmludGYoKSBjYW4gZGVjbGFyZSBjb25zdCBjaGFyICpmbXQgKi8KLSNkZWZpbmUgU05QUklOVEZfQ09OU1QgY29uc3QKLQotLyogRGVmaW5lIHRvIGEgU2V0IFByb2Nlc3MgVGl0bGUgdHlwZSBpZiB5b3VyIHN5c3RlbSBpcyBzdXBwb3J0ZWQgYnkKLSAgIGJzZC1zZXRwcm9jdGl0bGUuYyAqLwotI2RlZmluZSBTUFRfVFlQRSBTUFRfUkVVU0VBUkdWCi0KLS8qIERlZmluZSBpZiBzc2hkIHNvbWVob3cgcmVhY3F1aXJlcyBhIGNvbnRyb2xsaW5nIFRUWSBhZnRlciBzZXRzaWQoKSAqLwotLyogI3VuZGVmIFNTSERfQUNRVUlSRVNfQ1RUWSAqLwotCi0vKiBEZWZpbmUgaWYgcGFtX2NoYXV0aHRvayB3YW50cyByZWFsIHVpZCBzZXQgdG8gdGhlIHVucHJpdidlZCB1c2VyICovCi0vKiAjdW5kZWYgU1NIUEFNX0NIQVVUSFRPS19ORUVEU19SVUlEICovCi0KLS8qIFVzZSBhdWRpdCBkZWJ1Z2dpbmcgbW9kdWxlICovCi0vKiAjdW5kZWYgU1NIX0FVRElUX0VWRU5UUyAqLwotCi0vKiBXaW5kb3dzIGlzIHNlbnNpdGl2ZSB0byByZWFkIGJ1ZmZlciBzaXplICovCi0vKiAjdW5kZWYgU1NIX0lPQlVGU1ogKi8KLQotLyogbm9uLXByaXZpbGVnZWQgdXNlciBmb3IgcHJpdmlsZWdlIHNlcGFyYXRpb24gKi8KLSNkZWZpbmUgU1NIX1BSSVZTRVBfVVNFUiAic2hlbGwiCi0KLS8qIFVzZSB0dW5uZWwgZGV2aWNlIGNvbXBhdGliaWxpdHkgdG8gT3BlbkJTRCAqLwotI2RlZmluZSBTU0hfVFVOX0NPTVBBVF9BRiAxCi0KLS8qIE9wZW4gdHVubmVsIGRldmljZXMgdGhlIEZyZWVCU0Qgd2F5ICovCi0vKiAjdW5kZWYgU1NIX1RVTl9GUkVFQlNEICovCi0KLS8qIE9wZW4gdHVubmVsIGRldmljZXMgdGhlIExpbnV4IHR1bi90YXAgd2F5ICovCi0jZGVmaW5lIFNTSF9UVU5fTElOVVggMQotCi0vKiBObyBsYXllciAyIHR1bm5lbCBzdXBwb3J0ICovCi0vKiAjdW5kZWYgU1NIX1RVTl9OT19MMiAqLwotCi0vKiBPcGVuIHR1bm5lbCBkZXZpY2VzIHRoZSBPcGVuQlNEIHdheSAqLwotLyogI3VuZGVmIFNTSF9UVU5fT1BFTkJTRCAqLwotCi0vKiBQcmVwZW5kIHRoZSBhZGRyZXNzIGZhbWlseSB0byBJUCB0dW5uZWwgdHJhZmZpYyAqLwotI2RlZmluZSBTU0hfVFVOX1BSRVBFTkRfQUYgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IGEgZGlmZmVyZW50ICRQQVRIIGZvciB0aGUgc3VwZXJ1c2VyICovCi0vKiAjdW5kZWYgU1VQRVJVU0VSX1BBVEggKi8KLQotLyogc3lzbG9nX3IgZnVuY3Rpb24gaXMgc2FmZSB0byB1c2UgaW4gaW4gYSBzaWduYWwgaGFuZGxlciAqLwotLyogI3VuZGVmIFNZU0xPR19SX1NBRkVfSU5fU0lHSEFORCAqLwotCi0vKiBTdXBwb3J0IHBhc3N3b3JkcyA+IDggY2hhcnMgKi8KLS8qICN1bmRlZiBVTklYV0FSRV9MT05HX1BBU1NXT1JEUyAqLwotCi0vKiBTcGVjaWZ5IGRlZmF1bHQgJFBBVEggKi8KLSNkZWZpbmUgVVNFUl9QQVRIICIvc2JpbjovdmVuZG9yL2Jpbjovc3lzdGVtL3NiaW46L3N5c3RlbS9iaW46L3N5c3RlbS94YmluIgotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byB1c2UgbGlia2FmcycgQUZTIHN1cHBvcnQgKi8KLS8qICN1bmRlZiBVU0VfQUZTICovCi0KLS8qIFVzZSBCU00gYXVkaXQgbW9kdWxlICovCi0vKiAjdW5kZWYgVVNFX0JTTV9BVURJVCAqLwotCi0vKiBVc2UgYnRtcCB0byBsb2cgYmFkIGxvZ2lucyAqLwotLyogI2RlZmluZSBVU0VfQlRNUCAxICovCi0KLS8qIFVzZSBsaWJlZGl0IGZvciBzZnRwICovCi0vKiAjdW5kZWYgVVNFX0xJQkVESVQgKi8KLQotLyogVXNlIExpbnV4IGF1ZGl0IG1vZHVsZSAqLwotLyogI3VuZGVmIFVTRV9MSU5VWF9BVURJVCAqLwotCi0vKiBFbmFibGUgT3BlblNTTCBlbmdpbmUgc3VwcG9ydCAqLwotLyogI3VuZGVmIFVTRV9PUEVOU1NMX0VOR0lORSAqLwotCi0vKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIFBBTSBzdXBwb3J0ICovCi0vKiAjdW5kZWYgVVNFX1BBTSAqLwotCi0vKiBVc2UgUElQRVMgaW5zdGVhZCBvZiBhIHNvY2tldHBhaXIoKSAqLwotLyogI3VuZGVmIFVTRV9QSVBFUyAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgU29sYXJpcyBwcm9jZXNzIGNvbnRyYWN0cyAqLwotLyogI3VuZGVmIFVTRV9TT0xBUklTX1BST0NFU1NfQ09OVFJBQ1RTICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBTb2xhcmlzIHByb2plY3RzICovCi0vKiAjdW5kZWYgVVNFX1NPTEFSSVNfUFJPSkVDVFMgKi8KLQotLyogRGVmaW5lIGlmIHlvdSBzaG91bGRuJ3Qgc3RyaXAgJ3R0eScgZnJvbSB5b3VyIHR0eW5hbWUgaW4gW3V3XXRtcCAqLwotLyogI3VuZGVmIFdJVEhfQUJCUkVWX05PX1RUWSAqLwotCi0vKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIEFJWDQncyBhdXRoZW50aWNhdGUgZnVuY3Rpb24gKi8KLS8qICN1bmRlZiBXSVRIX0FJWEFVVEhFTlRJQ0FURSAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUvd2FudCBhcnJheXMgKGNsdXN0ZXItd2lkZSBzZXNzaW9uIG1hbmFnbWVudCwgbm90IEMKLSAgIGFycmF5cykgKi8KLS8qICN1bmRlZiBXSVRIX0lSSVhfQVJSQVkgKi8KLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IElSSVggYXVkaXQgdHJhaWxzICovCi0vKiAjdW5kZWYgV0lUSF9JUklYX0FVRElUICovCi0KLS8qIERlZmluZSBpZiB5b3Ugd2FudCBJUklYIGtlcm5lbCBqb2JzICovCi0vKiAjdW5kZWYgV0lUSF9JUklYX0pPQlMgKi8KLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IElSSVggcHJvamVjdCBtYW5hZ2VtZW50ICovCi0vKiAjdW5kZWYgV0lUSF9JUklYX1BST0pFQ1QgKi8KLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IFNFTGludXggc3VwcG9ydC4gKi8KLS8qICN1bmRlZiBXSVRIX1NFTElOVVggKi8KLQotLyogRGVmaW5lIFdPUkRTX0JJR0VORElBTiB0byAxIGlmIHlvdXIgcHJvY2Vzc29yIHN0b3JlcyB3b3JkcyB3aXRoIHRoZSBtb3N0Ci0gICBzaWduaWZpY2FudCBieXRlIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsKS4gKi8KLSNpZiBkZWZpbmVkIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRAotIyBpZiBkZWZpbmVkIF9fQklHX0VORElBTl9fCi0jICBkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKLSMgZW5kaWYKLSNlbHNlCi0jIGlmbmRlZiBXT1JEU19CSUdFTkRJQU4KLS8qICMgIHVuZGVmIFdPUkRTX0JJR0VORElBTiAqLwotIyBlbmRpZgotI2VuZGlmCi0KLS8qIERlZmluZSBpZiB4YXV0aCBpcyBmb3VuZCBpbiB5b3VyIHBhdGggKi8KLSNkZWZpbmUgWEFVVEhfUEFUSCAiL3Vzci9iaW4veGF1dGgiCi0KLS8qIE51bWJlciBvZiBiaXRzIGluIGEgZmlsZSBvZmZzZXQsIG9uIGhvc3RzIHdoZXJlIHRoaXMgaXMgc2V0dGFibGUuICovCi0vKiAjdW5kZWYgX0ZJTEVfT0ZGU0VUX0JJVFMgKi8KLQotLyogRGVmaW5lIGZvciBsYXJnZSBmaWxlcywgb24gQUlYLXN0eWxlIGhvc3RzLiAqLwotLyogI3VuZGVmIF9MQVJHRV9GSUxFUyAqLwotCi0vKiBsb2cgZm9yIGJhZCBsb2dpbiBhdHRlbXB0cyAqLwotI2RlZmluZSBfUEFUSF9CVE1QICIvdmFyL2xvZy9idG1wIgotCi0vKiBGdWxsIHBhdGggb2YgeW91ciAicGFzc3dkIiBwcm9ncmFtICovCi0jZGVmaW5lIF9QQVRIX1BBU1NXRF9QUk9HICIvdXNyL2Jpbi9wYXNzd2QiCi0KLS8qIFNwZWNpZnkgbG9jYXRpb24gb2Ygc3NoLnBpZCAqLwotI2RlZmluZSBfUEFUSF9TU0hfUElERElSICIvdmFyL3J1biIKLQotLyogRGVmaW5lIGlmIHdlIGRvbid0IGhhdmUgc3RydWN0IF9fcmVzX3N0YXRlIGluIHJlc29sdi5oICovCi0vKiAjdW5kZWYgX19yZXNfc3RhdGUgKi8KLQotLyogRGVmaW5lIHRvIGBfX2lubGluZV9fJyBvciBgX19pbmxpbmUnIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyCi0gICBjYWxscyBpdCwgb3IgdG8gbm90aGluZyBpZiAnaW5saW5lJyBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIGFueSBuYW1lLiAgKi8KLSNpZm5kZWYgX19jcGx1c3BsdXMKLS8qICN1bmRlZiBpbmxpbmUgKi8KLSNlbmRpZgotCi0vKiB0eXBlIHRvIHVzZSBpbiBwbGFjZSBvZiBzb2NrbGVuX3QgaWYgbm90IGRlZmluZWQgKi8KLS8qICN1bmRlZiBzb2NrbGVuX3QgKi8KLQotI2RlZmluZSBTU0hESVIgIi9kYXRhL3NzaCIKLQotI2RlZmluZSBfUEFUSF9QUklWU0VQX0NIUk9PVF9ESVIgIi9kYXRhL3NzaC9lbXB0eSIKLQotI2RlZmluZSBfUEFUSF9TU0hfUFJPR1JBTSAiL3N5c3RlbS9iaW4vc2Z0cCIKZGlmZiAtLWdpdCBhL2NvbmZpZy5oLmluIGIvY29uZmlnLmguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjY2QzN2YuLjAwMDAwMDAKLS0tIGEvY29uZmlnLmguaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNTMwICswLDAgQEAKLS8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgYnVpbGRpbmcgdW5pdmVyc2FsIChpbnRlcm5hbCBoZWxwZXIgbWFjcm8pICovCi0jdW5kZWYgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIGdldGFkZHJpbmZvIHRoYXQgZmFpbHMgZm9yIHRoZSBhbGwtemVyb3MgSVB2NiBhZGRyZXNzCi0gICAqLwotI3VuZGVmIEFJWF9HRVROQU1FSU5GT19IQUNLCi0KLS8qIERlZmluZSBpZiB5b3VyIEFJWCBsb2dpbmZhaWxlZCgpIGZ1bmN0aW9uIHRha2VzIDQgYXJndW1lbnRzIChBSVggPj0gNS4yKSAqLwotI3VuZGVmIEFJWF9MT0dJTkZBSUxFRF80QVJHCi0KLS8qIFN5c3RlbSBvbmx5IHN1cHBvcnRzIElQdjQgYXVkaXQgcmVjb3JkcyAqLwotI3VuZGVmIEFVX0lQdjQKLQotLyogRGVmaW5lIGlmIHlvdXIgcmVzb2x2ZXIgbGlicyBuZWVkIHRoaXMgZm9yIGdldHJyc2V0YnluYW1lICovCi0jdW5kZWYgQklORF84X0NPTVBBVAotCi0vKiBEZWZpbmUgaWYgY21zZ190eXBlIGlzIG5vdCBwYXNzZWQgY29ycmVjdGx5ICovCi0jdW5kZWYgQlJPS0VOX0NNU0dfVFlQRQotCi0vKiBnZXRhZGRyaW5mbyBpcyBicm9rZW4gKGlmIHByZXNlbnQpICovCi0jdW5kZWYgQlJPS0VOX0dFVEFERFJJTkZPCi0KLS8qIGdldGdyb3VwcygwLE5VTEwpIHdpbGwgcmV0dXJuIC0xICovCi0jdW5kZWYgQlJPS0VOX0dFVEdST1VQUwotCi0vKiBGcmVlQlNEIGdsb2IgZG9lcyBub3QgZG8gd2hhdCB3ZSBuZWVkICovCi0jdW5kZWYgQlJPS0VOX0dMT0IKLQotLyogRGVmaW5lIGlmIHlvdSBzeXN0ZW0ncyBpbmV0X250b2EgaXMgYnVzdGVkIChlLmcuIElyaXggZ2NjIGlzc3VlKSAqLwotI3VuZGVmIEJST0tFTl9JTkVUX05UT0EKLQotLyogaWFfdWluZm8gcm91dGluZXMgbm90IHN1cHBvcnRlZCBieSBPUyB5ZXQgKi8KLSN1bmRlZiBCUk9LRU5fTElCSUFGCi0KLS8qIFVsdHJpeCBtbWFwIGNhbid0IG1hcCBmaWxlcyAqLwotI3VuZGVmIEJST0tFTl9NTUFQCi0KLS8qIERlZmluZSBpZiB5b3VyIHN0cnVjdCBkaXJlbnQgZXhwZWN0cyB5b3UgdG8gYWxsb2NhdGUgZXh0cmEgc3BhY2UgZm9yIGRfbmFtZQotICAgKi8KLSN1bmRlZiBCUk9LRU5fT05FX0JZVEVfRElSRU5UX0RfTkFNRQotCi0vKiBDYW4ndCBkbyBjb21wYXJpc29ucyBvbiByZWFkdiAqLwotI3VuZGVmIEJST0tFTl9SRUFEVl9DT01QQVJJU09OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIGJyb2tlbiByZWFscGF0aC4gKi8KLSN1bmRlZiBCUk9LRU5fUkVBTFBBVEgKLQotLyogTmVlZGVkIGZvciBOZVhUICovCi0jdW5kZWYgQlJPS0VOX1NBVkVEX1VJRFMKLQotLyogRGVmaW5lIGlmIHlvdXIgc2V0cmVnaWQoKSBpcyBicm9rZW4gKi8KLSN1bmRlZiBCUk9LRU5fU0VUUkVHSUQKLQotLyogRGVmaW5lIGlmIHlvdXIgc2V0cmVzZ2lkKCkgaXMgYnJva2VuICovCi0jdW5kZWYgQlJPS0VOX1NFVFJFU0dJRAotCi0vKiBEZWZpbmUgaWYgeW91ciBzZXRyZXN1aWQoKSBpcyBicm9rZW4gKi8KLSN1bmRlZiBCUk9LRU5fU0VUUkVTVUlECi0KLS8qIERlZmluZSBpZiB5b3VyIHNldHJldWlkKCkgaXMgYnJva2VuICovCi0jdW5kZWYgQlJPS0VOX1NFVFJFVUlECi0KLS8qIEx5bnhPUyBoYXMgYnJva2VuIHNldHZidWYoKSBpbXBsZW1lbnRhdGlvbiAqLwotI3VuZGVmIEJST0tFTl9TRVRWQlVGCi0KLS8qIFFOWCBzaGFkb3cgc3VwcG9ydCBpcyBicm9rZW4gKi8KLSN1bmRlZiBCUk9LRU5fU0hBRE9XX0VYUElSRQotCi0vKiBEZWZpbmUgaWYgeW91ciBzbnByaW50ZiBpcyBidXN0ZWQgKi8KLSN1bmRlZiBCUk9LRU5fU05QUklOVEYKLQotLyogdGNnZXRhdHRyIHdpdGggSUNBTk9OIG1heSBoYW5nICovCi0jdW5kZWYgQlJPS0VOX1RDR0VUQVRUUl9JQ0FOT04KLQotLyogdXBkd3RtcHggaXMgYnJva2VuIChpZiBwcmVzZW50KSAqLwotI3VuZGVmIEJST0tFTl9VUERXVE1QWAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgQlNEIGF1dGggc3VwcG9ydCAqLwotI3VuZGVmIEJTRF9BVVRICi0KLS8qIERlZmluZSBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IHRoZSBwYXRoIHRvIHlvdXIgbGFzdGxvZyBmaWxlICovCi0jdW5kZWYgQ09ORl9MQVNUTE9HX0ZJTEUKLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIHBhdGggdG8geW91ciB1dG1wIGZpbGUgKi8KLSN1bmRlZiBDT05GX1VUTVBfRklMRQotCi0vKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gc3BlY2lmeSB0aGUgcGF0aCB0byB5b3VyIHd0bXB4IGZpbGUgKi8KLSN1bmRlZiBDT05GX1dUTVBYX0ZJTEUKLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIHBhdGggdG8geW91ciB3dG1wIGZpbGUgKi8KLSN1bmRlZiBDT05GX1dUTVBfRklMRQotCi0vKiBEZWZpbmUgaWYgeW91ciBwbGF0Zm9ybSBuZWVkcyB0byBza2lwIHBvc3QgYXV0aCBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZyAqLwotI3VuZGVmIERJU0FCTEVfRkRfUEFTU0lORwotCi0vKiBEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIGxhc3Rsb2cgKi8KLSN1bmRlZiBESVNBQkxFX0xBU1RMT0cKLQotLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB5b3VyIHN5c3RlbSdzIGxvZ2luKCkgY2FsbCAqLwotI3VuZGVmIERJU0FCTEVfTE9HSU4KLQotLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBwdXR1dGxpbmUoKSBldGMuIHRvIHdyaXRlIFt1d110bXAgKi8KLSN1bmRlZiBESVNBQkxFX1BVVFVUTElORQotCi0vKiBEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHB1dHV0eGxpbmUoKSBldGMuIHRvIHdyaXRlIFt1d110bXB4ICovCi0jdW5kZWYgRElTQUJMRV9QVVRVVFhMSU5FCi0KLS8qIERlZmluZSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHNoYWRvdyBwYXNzd29yZHMgKi8KLSN1bmRlZiBESVNBQkxFX1NIQURPVwotCi0vKiBEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHV0bXAgKi8KLSN1bmRlZiBESVNBQkxFX1VUTVAKLQotLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB1dG1weCAqLwotI3VuZGVmIERJU0FCTEVfVVRNUFgKLQotLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB3dG1wICovCi0jdW5kZWYgRElTQUJMRV9XVE1QCi0KLS8qIERlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2Ugd3RtcHggKi8KLSN1bmRlZiBESVNBQkxFX1dUTVBYCi0KLS8qIEVuYWJsZSBmb3IgUEtDUyMxMSBzdXBwb3J0ICovCi0jdW5kZWYgRU5BQkxFX1BLQ1MxMQotCi0vKiBGaWxlIG5hbWVzIG1heSBub3QgY29udGFpbiBiYWNrc2xhc2ggY2hhcmFjdGVycyAqLwotI3VuZGVmIEZJTEVTWVNURU1fTk9fQkFDS1NMQVNICi0KLS8qIGZzaWRfdCBoYXMgbWVtYmVyIHZhbCAqLwotI3VuZGVmIEZTSURfSEFTX1ZBTAotCi0vKiBmc2lkX3QgaGFzIG1lbWJlciBfX3ZhbCAqLwotI3VuZGVmIEZTSURfSEFTX19fVkFMCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBgZ2V0cGdycCcgZnVuY3Rpb24gcmVxdWlyZXMgemVybyBhcmd1bWVudHMuICovCi0jdW5kZWYgR0VUUEdSUF9WT0lECi0KLS8qIENvbmZsaWN0aW5nIGRlZnMgZm9yIGdldHNwbmFtICovCi0jdW5kZWYgR0VUU1BOQU1fQ09ORkxJQ1RJTkdfREVGUwotCi0vKiBEZWZpbmUgaWYgeW91ciBzeXN0ZW0gZ2xvYigpIGZ1bmN0aW9uIGhhcyB0aGUgR0xPQl9BTFRESVJGVU5DIGV4dGVuc2lvbiAqLwotI3VuZGVmIEdMT0JfSEFTX0FMVERJUkZVTkMKLQotLyogRGVmaW5lIGlmIHlvdXIgc3lzdGVtIGdsb2IoKSBmdW5jdGlvbiBoYXMgZ2xfbWF0Y2hjIG9wdGlvbnMgaW4gZ2xvYl90ICovCi0jdW5kZWYgR0xPQl9IQVNfR0xfTUFUQ0hDCi0KLS8qIERlZmluZSBpZiB5b3VyIHN5c3RlbSBnbG9iKCkgZnVuY3Rpb24gaGFzIGdsX3N0YXR2IG9wdGlvbnMgaW4gZ2xvYl90ICovCi0jdW5kZWYgR0xPQl9IQVNfR0xfU1RBVFYKLQotLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgR1NTQVBJIHN1cHBvcnQgaW4gdGhlIHZlcnNpb24gMiBwcm90b2NvbCAqLwotI3VuZGVmIEdTU0FQSQotCi0vKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gdXNlIHNoYWRvdyBwYXNzd29yZCBleHBpcmUgZmllbGQgKi8KLSN1bmRlZiBIQVNfU0hBRE9XX0VYUElSRQotCi0vKiBEZWZpbmUgaWYgeW91ciBzeXN0ZW0gdXNlcyBhY2Nlc3MgcmlnaHRzIHN0eWxlIGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nICovCi0jdW5kZWYgSEFWRV9BQ0NSSUdIVFNfSU5fTVNHSERSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9hZGRyIGluIHV0bXAuaCAqLwotI3VuZGVmIEhBVkVfQUREUl9JTl9VVE1QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9hZGRyIGluIHV0bXB4LmggKi8KLSN1bmRlZiBIQVZFX0FERFJfSU5fVVRNUFgKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X2FkZHJfdjYgaW4gdXRtcC5oICovCi0jdW5kZWYgSEFWRV9BRERSX1Y2X0lOX1VUTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X2FkZHJfdjYgaW4gdXRtcHguaCAqLwotI3VuZGVmIEhBVkVfQUREUl9WNl9JTl9VVE1QWAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFyYzRyYW5kb20nIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfQVJDNFJBTkRPTQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFyYzRyYW5kb21fYnVmJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0FSQzRSQU5ET01fQlVGCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXJjNHJhbmRvbV91bmlmb3JtJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0FSQzRSQU5ET01fVU5JRk9STQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFzcHJpbnRmJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0FTUFJJTlRGCi0KLS8qIE9wZW5CU0QncyBnY2MgaGFzIGJvdW5kZWQgKi8KLSN1bmRlZiBIQVZFX0FUVFJJQlVURV9fQk9VTkRFRF9fCi0KLS8qIEhhdmUgYXR0cmlidXRlIG5vbm51bGwgKi8KLSN1bmRlZiBIQVZFX0FUVFJJQlVURV9fTk9OTlVMTF9fCi0KLS8qIE9wZW5CU0QncyBnY2MgaGFzIHNlbnRpbmVsICovCi0jdW5kZWYgSEFWRV9BVFRSSUJVVEVfX1NFTlRJTkVMX18KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdWdfZ2V0X21hY2hpbmUnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfQVVHX0dFVF9NQUNISU5FCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYjY0X250b3AnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfQjY0X05UT1AKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBiNjRfcHRvbicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9CNjRfUFRPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJhc2VuYW1lIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfQkFTRU5BTUUKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBiY29weScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9CQ09QWQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGJpbmRyZXN2cG9ydF9zYScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9CSU5EUkVTVlBPUlRfU0EKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBCTl9pc19wcmltZV9leCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9CTl9JU19QUklNRV9FWAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGJzbS9hdWRpdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0JTTV9BVURJVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8YnN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0JTVFJJTkdfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNsb2NrJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0NMT0NLCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBjbG9ja190IGRhdGEgdHlwZSAqLwotI3VuZGVmIEhBVkVfQ0xPQ0tfVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNsb3NlZnJvbScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9DTE9TRUZST00KLQotLyogRGVmaW5lIGlmIGdhaV9zdHJlcnJvcigpIHJldHVybnMgY29uc3QgY2hhciAqICovCi0jdW5kZWYgSEFWRV9DT05TVF9HQUlfU1RSRVJST1JfUFJPVE8KLQotLyogRGVmaW5lIGlmIHlvdXIgc3lzdGVtIHVzZXMgYW5jaWxsYXJ5IGRhdGEgc3R5bGUgZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcgKi8KLSN1bmRlZiBIQVZFX0NPTlRST0xfSU5fTVNHSERSCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y3J5cHRvL3NoYTIuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9DUllQVE9fU0hBMl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y3J5cHQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9DUllQVF9ICi0KLS8qIERlZmluZSBpZiB5b3UgYXJlIG9uIEN5Z3dpbiAqLwotI3VuZGVmIEhBVkVfQ1lHV0lOCi0KLS8qIERlZmluZSBpZiB5b3VyIGxpYnJhcmllcyBkZWZpbmUgZGFlbW9uKCkgKi8KLSN1bmRlZiBIQVZFX0RBRU1PTgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYGF1dGhlbnRpY2F0ZScsIGFuZCB0byAwIGlmIHlvdQotICAgZG9uJ3QuICovCi0jdW5kZWYgSEFWRV9ERUNMX0FVVEhFTlRJQ0FURQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYEdMT0JfTk9NQVRDSCcsIGFuZCB0byAwIGlmIHlvdQotICAgZG9uJ3QuICovCi0jdW5kZWYgSEFWRV9ERUNMX0dMT0JfTk9NQVRDSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYGhfZXJybm8nLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotI3VuZGVmIEhBVkVfREVDTF9IX0VSUk5PCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgbG9naW5mYWlsZWQnLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotI3VuZGVmIEhBVkVfREVDTF9MT0dJTkZBSUxFRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYGxvZ2lucmVzdHJpY3Rpb25zJywgYW5kIHRvIDAgaWYKLSAgIHlvdSBkb24ndC4gKi8KLSN1bmRlZiBIQVZFX0RFQ0xfTE9HSU5SRVNUUklDVElPTlMKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBsb2dpbnN1Y2Nlc3MnLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotI3VuZGVmIEhBVkVfREVDTF9MT0dJTlNVQ0NFU1MKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBNQVhTWU1MSU5LUycsIGFuZCB0byAwIGlmIHlvdQotICAgZG9uJ3QuICovCi0jdW5kZWYgSEFWRV9ERUNMX01BWFNZTUxJTktTCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgb2Zmc2V0b2YnLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotI3VuZGVmIEhBVkVfREVDTF9PRkZTRVRPRgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYE9fTk9OQkxPQ0snLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotI3VuZGVmIEhBVkVfREVDTF9PX05PTkJMT0NLCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgcGFzc3dkZXhwaXJlZCcsIGFuZCB0byAwIGlmIHlvdQotICAgZG9uJ3QuICovCi0jdW5kZWYgSEFWRV9ERUNMX1BBU1NXREVYUElSRUQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBzZXRhdXRoZGInLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotI3VuZGVmIEhBVkVfREVDTF9TRVRBVVRIREIKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBTSFVUX1JEJywgYW5kIHRvIDAgaWYgeW91Ci0gICBkb24ndC4gKi8KLSN1bmRlZiBIQVZFX0RFQ0xfU0hVVF9SRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYHdyaXRldicsIGFuZCB0byAwIGlmIHlvdSBkb24ndC4KLSAgICovCi0jdW5kZWYgSEFWRV9ERUNMX1dSSVRFVgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYF9nZXRsb25nJywgYW5kIHRvIDAgaWYgeW91Ci0gICBkb24ndC4gKi8KLSN1bmRlZiBIQVZFX0RFQ0xfX0dFVExPTkcKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBfZ2V0c2hvcnQnLCBhbmQgdG8gMCBpZiB5b3UKLSAgIGRvbid0LiAqLwotI3VuZGVmIEhBVkVfREVDTF9fR0VUU0hPUlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIC9kZXYvcHRteCAqLwotI3VuZGVmIEhBVkVfREVWX1BUTVgKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIC9kZXYvcHRjICovCi0jdW5kZWYgSEFWRV9ERVZfUFRTX0FORF9QVEMKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkaXJlbnQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9ESVJFTlRfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGRpcmZkJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0RJUkZECi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZGlybmFtZScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9ESVJOQU1FCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXgnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfRFNBX0dFTkVSQVRFX1BBUkFNRVRFUlNfRVgKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlbmRpYW4uaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9FTkRJQU5fSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGVuZHV0ZW50JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0VORFVURU5UCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZW5kdXR4ZW50JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0VORFVUWEVOVAotCi0vKiBEZWZpbmUgaWYgeW91ciBzeXN0ZW0gaGFzIC9ldGMvZGVmYXVsdC9sb2dpbiAqLwotI3VuZGVmIEhBVkVfRVRDX0RFRkFVTFRfTE9HSU4KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBFVlBfc2hhMjU2JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0VWUF9TSEEyNTYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X2V4aXQgaW4gdXRtcC5oICovCi0jdW5kZWYgSEFWRV9FWElUX0lOX1VUTVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmY2htb2QnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfRkNITU9ECi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmNob3duJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0ZDSE9XTgotCi0vKiBVc2UgRl9DTE9TRU0gZmNudGwgZm9yIGNsb3NlZnJvbSAqLwotI3VuZGVmIEhBVkVfRkNOVExfQ0xPU0VNCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmVhdHVyZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9GRUFUVVJFU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmxvYXRpbmdwb2ludC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0ZMT0FUSU5HUE9JTlRfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZtdF9zY2FsZWQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfRk1UX1NDQUxFRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZyZWVhZGRyaW5mbycgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9GUkVFQUREUklORk8KLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGZzYmxrY250X3QnLiAqLwotI3VuZGVmIEhBVkVfRlNCTEtDTlRfVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgZnNmaWxjbnRfdCcuICovCi0jdW5kZWYgSEFWRV9GU0ZJTENOVF9UCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnN0YXR2ZnMnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfRlNUQVRWRlMKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmdXRpbWVzJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0ZVVElNRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnYWlfc3RyZXJyb3InIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0FJX1NUUkVSUk9SCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0YWRkcmluZm8nIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUQUREUklORk8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRhdWRpdCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HRVRBVURJVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGF1ZGl0X2FkZHInIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUQVVESVRfQUREUgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGN3ZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRncm91cGxpc3QnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUR1JPVVBMSVNUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0Z3JzZXQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUR1JTRVQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRsYXN0bG9neGJ5bmFtZScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HRVRMQVNUTE9HWEJZTkFNRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGx1aWQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUTFVJRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldG5hbWVpbmZvJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0dFVE5BTUVJTkZPCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0b3B0JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0dFVE9QVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGdldG9wdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0dFVE9QVF9ICi0KLS8qIERlZmluZSBpZiB5b3VyIGdldG9wdCgzKSBkZWZpbmVzIGFuZCB1c2VzIG9wdHJlc2V0ICovCi0jdW5kZWYgSEFWRV9HRVRPUFRfT1BUUkVTRVQKLQotLyogRGVmaW5lIGlmIHlvdXIgbGlicmFyaWVzIGRlZmluZSBnZXRwYWdlc2l6ZSgpICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHBlZXJlaWQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUUEVFUkVJRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHBlZXJ1Y3JlZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HRVRQRUVSVUNSRUQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwd2FuYW0nIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUUFdBTkFNCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cmxpbWl0JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0dFVFJMSU1JVAotCi0vKiBEZWZpbmUgaWYgZ2V0cnJzZXRieW5hbWUoKSBleGlzdHMgKi8KLSN1bmRlZiBIQVZFX0dFVFJSU0VUQllOQU1FCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cnVzYWdlJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0dFVFJVU0FHRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHNldXNlcmJ5bmFtZScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HRVRTRVVTRVJCWU5BTUUKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR0aW1lb2ZkYXknIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUVElNRU9GREFZCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dHR5ZW50JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0dFVFRUWUVOVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHV0ZW50JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0dFVFVURU5UCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dXRpZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HRVRVVElECi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dXRsaW5lJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0dFVFVUTElORQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHV0eGVudCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HRVRVVFhFTlQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR1dHhpZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HRVRVVFhJRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHV0eGxpbmUnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUVVRYTElORQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHV0eHVzZXInIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUVVRYVVNFUgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldF9kZWZhdWx0X2NvbnRleHRfd2l0aF9sZXZlbCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HRVRfREVGQVVMVF9DT05URVhUX1dJVEhfTEVWRUwKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnbG9iJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0dMT0IKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxnbG9iLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfR0xPQl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ3JvdXBfZnJvbV9naWQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR1JPVVBfRlJPTV9HSUQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxnc3NhcGlfZ2VuZXJpYy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0dTU0FQSV9HRU5FUklDX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxnc3NhcGkvZ3NzYXBpX2dlbmVyaWMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9HU1NBUElfR1NTQVBJX0dFTkVSSUNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGdzc2FwaS9nc3NhcGkuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9HU1NBUElfR1NTQVBJX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxnc3NhcGkvZ3NzYXBpX2tyYjUuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9HU1NBUElfR1NTQVBJX0tSQjVfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGdzc2FwaS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0dTU0FQSV9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Z3NzYXBpX2tyYjUuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9HU1NBUElfS1JCNV9ICi0KLS8qIERlZmluZSBpZiBIRUFERVIuYWQgZXhpc3RzIGluIGFycGEvbmFtZXNlci5oICovCi0jdW5kZWYgSEFWRV9IRUFERVJfQUQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X2hvc3QgaW4gdXRtcC5oICovCi0jdW5kZWYgSEFWRV9IT1NUX0lOX1VUTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X2hvc3QgaW4gdXRtcHguaCAqLwotI3VuZGVmIEhBVkVfSE9TVF9JTl9VVE1QWAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGlhZi5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0lBRl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aWEuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9JQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB1dF9pZCBpbiB1dG1wLmggKi8KLSN1bmRlZiBIQVZFX0lEX0lOX1VUTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X2lkIGluIHV0bXB4LmggKi8KLSN1bmRlZiBIQVZFX0lEX0lOX1VUTVBYCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaW5ldF9hdG9uJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0lORVRfQVRPTgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGluZXRfbnRvYScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9JTkVUX05UT0EKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpbmV0X250b3AnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfSU5FVF9OVE9QCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaW5uZXRncicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9JTk5FVEdSCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBpbnQ2NF90IGRhdGEgdHlwZSAqLwotI3VuZGVmIEhBVkVfSU5UNjRfVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgaW50eHhfdCBkYXRhIHR5cGUgKi8KLSN1bmRlZiBIQVZFX0lOVFhYX1QKLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGluX2FkZHJfdCcuICovCi0jdW5kZWYgSEFWRV9JTl9BRERSX1QKLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGluX3BvcnRfdCcuICovCi0jdW5kZWYgSEFWRV9JTl9QT1JUX1QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGlzYmxhbmsoM0MpLiAqLwotI3VuZGVmIEhBVkVfSVNCTEFOSwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxhc3Rsb2cuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9MQVNUTE9HX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJhdWRpdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0xJQkFVRElUX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBic20nIGxpYnJhcnkgKC1sYnNtKS4gKi8KLSN1bmRlZiBIQVZFX0xJQkJTTQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNyeXB0JyBsaWJyYXJ5ICgtbGNyeXB0KS4gKi8KLSN1bmRlZiBIQVZFX0xJQkNSWVBUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZGwnIGxpYnJhcnkgKC1sZGwpLiAqLwotI3VuZGVmIEhBVkVfTElCREwKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJnZW4uaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9MSUJHRU5fSAotCi0vKiBEZWZpbmUgaWYgc3lzdGVtIGhhcyBsaWJpYWYgdGhhdCBzdXBwb3J0cyBzZXRfaWQgKi8KLSN1bmRlZiBIQVZFX0xJQklBRgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5ldHdvcmsnIGxpYnJhcnkgKC1sbmV0d29yaykuICovCi0jdW5kZWYgSEFWRV9MSUJORVRXT1JLCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbnNsJyBsaWJyYXJ5ICgtbG5zbCkuICovCi0jdW5kZWYgSEFWRV9MSUJOU0wKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwYW0nIGxpYnJhcnkgKC1scGFtKS4gKi8KLSN1bmRlZiBIQVZFX0xJQlBBTQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNvY2tldCcgbGlicmFyeSAoLWxzb2NrZXQpLiAqLwotI3VuZGVmIEhBVkVfTElCU09DS0VUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGlidXRpbC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0xJQlVUSUxfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHhuZXQnIGxpYnJhcnkgKC1seG5ldCkuICovCi0jdW5kZWYgSEFWRV9MSUJYTkVUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgeicgbGlicmFyeSAoLWx6KS4gKi8KLSN1bmRlZiBIQVZFX0xJQloKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L2lmX3R1bi5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0xJTlVYX0lGX1RVTl9ICi0KLS8qIERlZmluZSBpZiB5b3VyIGxpYnJhcmllcyBkZWZpbmUgbG9naW4oKSAqLwotI3VuZGVmIEhBVkVfTE9HSU4KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsb2dpbl9jYXAuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9MT0dJTl9DQVBfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvZ2luX2dldGNhcGJvb2wnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfTE9HSU5fR0VUQ0FQQk9PTAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxvZ2luLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfTE9HSU5fSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvZ291dCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9MT0dPVVQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2d3dG1wJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0xPR1dUTVAKLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGxvbmcgZG91YmxlJy4gKi8KLSN1bmRlZiBIQVZFX0xPTkdfRE9VQkxFCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBsb25nIGxvbmcnLiAqLwotI3VuZGVmIEhBVkVfTE9OR19MT05HCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWFpbGxvY2suaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9NQUlMTE9DS19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWQ1X2NyeXB0JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX01ENV9DUllQVAotCi0vKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gYWxsb3cgTUQ1IHBhc3N3b3JkcyAqLwotI3VuZGVmIEhBVkVfTUQ1X1BBU1NXT1JEUwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbW1vdmUnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfTUVNTU9WRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWtkdGVtcCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9NS0RURU1QCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbW1hcCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBtb2RlX3QgZGF0YSB0eXBlICovCi0jdW5kZWYgSEFWRV9NT0RFX1QKLQotLyogU29tZSBzeXN0ZW1zIHB1dCBuYW5vc2xlZXAgb3V0c2lkZSBvZiBsaWJjICovCi0jdW5kZWYgSEFWRV9OQU5PU0xFRVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZGlyLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfTkRJUl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0ZGIuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9ORVREQl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0Z3JvdXAuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9ORVRHUk9VUF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0L2lmX3R1bi5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX05FVF9JRl9UVU5fSAotCi0vKiBEZWZpbmUgaWYgeW91IGFyZSBvbiBOZVhUICovCi0jdW5kZWYgSEFWRV9ORVhUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbmdldGFkZHJpbmZvJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX05HRVRBRERSSU5GTwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5zbGVlcCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9OU0xFRVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBvZ2V0YWRkcmluZm8nIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfT0dFVEFERFJJTkZPCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBvZiBQQU0gd2hpY2ggdGFrZXMgb25seSBvbmUgYXJndW1lbnQgdG8KLSAgIHBhbV9zdHJlcnJvciAqLwotI3VuZGVmIEhBVkVfT0xEX1BBTQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG9wZW5sb2dfcicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9PUEVOTE9HX1IKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBvcGVucHR5JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX09QRU5QVFkKLQotLyogRGVmaW5lIGlmIHlvdXIgc3NsIGhlYWRlcnMgYXJlIGluY2x1ZGVkIHdpdGggI2luY2x1ZGUgPG9wZW5zc2wvaGVhZGVyLmg+ICovCi0jdW5kZWYgSEFWRV9PUEVOU1NMCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBEaWdpdGFsIFVuaXggU2VjdXJpdHkgSW50ZWdyYXRpb24gQXJjaGl0ZWN0dXJlICovCi0jdW5kZWYgSEFWRV9PU0ZfU0lBCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGFtX2dldGVudmxpc3QnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfUEFNX0dFVEVOVkxJU1QKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwYW0vcGFtX2FwcGwuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9QQU1fUEFNX0FQUExfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBhbV9wdXRlbnYnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfUEFNX1BVVEVOVgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHBhdGhzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfUEFUSFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdXRfcGlkIGluIHV0bXAuaCAqLwotI3VuZGVmIEhBVkVfUElEX0lOX1VUTVAKLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIHBpZF90IGRhdGEgdHlwZSAqLwotI3VuZGVmIEhBVkVfUElEX1QKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwb2xsJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1BPTEwKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwb2xsLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfUE9MTF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHJjdGwnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfUFJDVEwKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIC9wcm9jLyRwaWQvZmQgKi8KLSN1bmRlZiBIQVZFX1BST0NfUElECi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHN0YXQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfUFNUQVQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwdHkuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9QVFlfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHB1dHV0bGluZScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9QVVRVVExJTkUKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwdXR1dHhsaW5lJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1BVVFVUWExJTkUKLQotLyogRGVmaW5lIGlmIHlvdXIgcGFzc3dvcmQgaGFzIGEgcHdfY2hhbmdlIGZpZWxkICovCi0jdW5kZWYgSEFWRV9QV19DSEFOR0VfSU5fUEFTU1dECi0KLS8qIERlZmluZSBpZiB5b3VyIHBhc3N3b3JkIGhhcyBhIHB3X2dlY29zIGZpZWxkICovCi0jdW5kZWYgSEFWRV9QV19HRUNPU19JTl9QQVNTV0QKLQotLyogRGVmaW5lIGlmIHlvdXIgcGFzc3dvcmQgaGFzIGEgcHdfY2xhc3MgZmllbGQgKi8KLSN1bmRlZiBIQVZFX1BXX0NMQVNTX0lOX1BBU1NXRAotCi0vKiBEZWZpbmUgaWYgeW91ciBwYXNzd29yZCBoYXMgYSBwd19leHBpcmUgZmllbGQgKi8KLSN1bmRlZiBIQVZFX1BXX0VYUElSRV9JTl9QQVNTV0QKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByZWFkcGFzc3BocmFzZScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9SRUFEUEFTU1BIUkFTRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHJlYWRwYXNzcGhyYXNlLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfUkVBRFBBU1NQSFJBU0VfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJlYWxwYXRoJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1JFQUxQQVRICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmVjdm1zZycgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9SRUNWTVNHCi0KLS8qIHN5cy9yZXNvdXJjZS5oIGhhcyBSTElNSVRfTlBST0MgKi8KLSN1bmRlZiBIQVZFX1JMSU1JVF9OUFJPQwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHJwYy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1JQQ19UWVBFU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcnJlc3Zwb3J0X2FmJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1JSRVNWUE9SVF9BRgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYFJTQV9nZW5lcmF0ZV9rZXlfZXgnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfUlNBX0dFTkVSQVRFX0tFWV9FWAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYFJTQV9nZXRfZGVmYXVsdF9tZXRob2QnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfUlNBX0dFVF9ERUZBVUxUX01FVEhPRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNhbmRib3guaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TQU5EQk9YX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzYW5kYm94X2luaXQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0FOREJPWF9JTklUCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzYV9mYW1pbHlfdCBkYXRhIHR5cGUgKi8KLSN1bmRlZiBIQVZFX1NBX0ZBTUlMWV9UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBTZWN1cmVXYXJlLWJhc2VkIHByb3RlY3RlZCBwYXNzd29yZCBkYXRhYmFzZSAqLwotI3VuZGVmIEhBVkVfU0VDVVJFV0FSRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNlY3VyaXR5L3BhbV9hcHBsLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU0VDVVJJVFlfUEFNX0FQUExfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNlbmRtc2cnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VORE1TRwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGF1dGhkYicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TRVRBVVRIREIKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRkdGFibGVzaXplJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NFVERUQUJMRVNJWkUKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRlZ2lkJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NFVEVHSUQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRlbnYnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0ZXVpZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TRVRFVUlECi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0Z3JvdXBlbnQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VUR1JPVVBFTlQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRncm91cHMnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VUR1JPVVBTCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0bG9naW4nIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VUTE9HSU4KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRsdWlkJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NFVExVSUQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRwYXNzZW50JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NFVFBBU1NFTlQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRwY3JlZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TRVRQQ1JFRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHByb2N0aXRsZScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TRVRQUk9DVElUTEUKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRyZWdpZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TRVRSRUdJRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHJlc2dpZCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TRVRSRVNHSUQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRyZXN1aWQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VUUkVTVUlECi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cmV1aWQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VUUkVVSUQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRybGltaXQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VUUkxJTUlUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0c2lkJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NFVFNJRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHV0ZW50JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NFVFVURU5UCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0dXR4ZGInIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VUVVRYREIKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXR1dHhlbnQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VUVVRYRU5UCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0dmJ1ZicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TRVRWQlVGCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0X2lkJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NFVF9JRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYFNIQTI1Nl9VcGRhdGUnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0hBMjU2X1VQREFURQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNoYTIuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TSEEyX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaGFkb3cuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TSEFET1dfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpZ2FjdGlvbicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TSUdBQ1RJT04KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWd2ZWMnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0lHVkVDCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzaWdfYXRvbWljX3QnLiAqLwotI3VuZGVmIEhBVkVfU0lHX0FUT01JQ19UCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzaXplX3QgZGF0YSB0eXBlICovCi0jdW5kZWYgSEFWRV9TSVpFX1QKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzbnByaW50ZicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TTlBSSU5URgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNvY2tldHBhaXInIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU09DS0VUUEFJUgotCi0vKiBIYXZlIFBFRVJDUkVEIHNvY2tldCBvcHRpb24gKi8KLSN1bmRlZiBIQVZFX1NPX1BFRVJDUkVECi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzc2l6ZV90IGRhdGEgdHlwZSAqLwotI3VuZGVmIEhBVkVfU1NJWkVfVAotCi0vKiBGaWVsZHMgaW4gc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKi8KLSN1bmRlZiBIQVZFX1NTX0ZBTUlMWV9JTl9TUwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0YXRmcycgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TVEFURlMKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdGF0dmZzJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NUQVRWRlMKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRkZWYuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVERERUZfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NURElOVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJkdXAnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1RSRFVQCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3InIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1RSRVJST1IKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJmdGltZScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TVFJGVElNRQotCi0vKiBTaWxseSBta3N0ZW1wKCkgKi8KLSN1bmRlZiBIQVZFX1NUUklDVF9NS1NURU1QCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybGNhdCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TVFJMQ0FUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybGNweScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TVFJMQ1BZCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybW9kZScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TVFJNT0RFCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybnZpcycgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TVFJOVklTCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RycHRpbWUnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1RSUFRJTUUKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJzZXAnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1RSU0VQCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9sbCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TVFJUT0xMCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9udW0nIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1RSVE9OVU0KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b3VsJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NUUlRPVUwKLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCBhZGRyaW5mbyBkYXRhIHR5cGUgKi8KLSN1bmRlZiBIQVZFX1NUUlVDVF9BRERSSU5GTwotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgc3RydWN0IGluNl9hZGRyIGRhdGEgdHlwZSAqLwotI3VuZGVmIEhBVkVfU1RSVUNUX0lONl9BRERSCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3Qgc29ja2FkZHJfaW42IGRhdGEgdHlwZSAqLwotI3VuZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX0lONgotCi0vKiBEZWZpbmUgdG8gMSBpZiBgc2luNl9zY29wZV9pZCcgaXMgYSBtZW1iZXIgb2YgYHN0cnVjdCBzb2NrYWRkcl9pbjYnLiAqLwotI3VuZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX0lONl9TSU42X1NDT1BFX0lECi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBkYXRhIHR5cGUgKi8KLSN1bmRlZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9TVE9SQUdFCi0KLS8qIERlZmluZSB0byAxIGlmIGBzdF9ibGtzaXplJyBpcyBhIG1lbWJlciBvZiBgc3RydWN0IHN0YXQnLiAqLwotI3VuZGVmIEhBVkVfU1RSVUNUX1NUQVRfU1RfQkxLU0laRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgc3RydWN0IHRpbWVzcGVjJy4gKi8KLSN1bmRlZiBIQVZFX1NUUlVDVF9USU1FU1BFQwotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgc3RydWN0IHRpbWV2YWwgKi8KLSN1bmRlZiBIQVZFX1NUUlVDVF9USU1FVkFMCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3dhcDMyJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NXQVAzMgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN5c2NvbmYnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1lTQ09ORgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgc3lzbGVuIGluIHV0bXB4LmggKi8KLSN1bmRlZiBIQVZFX1NZU0xFTl9JTl9VVE1QWAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9hdWRpdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19BVURJVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2JpdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfQklUWVBFU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2JzZHR0eS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19CU0RUVFlfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9jZGVmcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19DREVGU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2Rpci5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBzeXNfZXJybGlzdFtdICovCi0jdW5kZWYgSEFWRV9TWVNfRVJSTElTVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9tbWFuLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX01NQU5fSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9tb3VudC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19NT1VOVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL25kaXIuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3VyIHN5c3RlbSBkZWZpbmVzIHN5c19uZXJyICovCi0jdW5kZWYgSEFWRV9TWVNfTkVSUgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wb2xsLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1BPTExfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wcmN0bC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19QUkNUTF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BzdGF0Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1BTVEFUX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcHRtcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19QVE1TX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VsZWN0Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1NFTEVDVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXR2ZnMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfU1RBVFZGU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfU1RBVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0cmVhbS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19TVFJFQU1fSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdHJvcHRzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1NUUk9QVFNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdHJ0aW8uaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfU1RSVElPX0gKLQotLyogRm9yY2UgdXNlIG9mIHN5cy9zeXNsb2cuaCBvbiBVbHRyaXggKi8KLSN1bmRlZiBIQVZFX1NZU19TWVNMT0dfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zeXNtYWNyb3MuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfU1lTTUFDUk9TX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZXJzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVSU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRV9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdW4uaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfVU5fSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRjZ2V0cGdycCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9UQ0dFVFBHUlAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0Y3NlbmRicmVhaycgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9UQ1NFTkRCUkVBSwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRpbWUnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfVElNRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9USU1FX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X3RpbWUgaW4gdXRtcC5oICovCi0jdW5kZWYgSEFWRV9USU1FX0lOX1VUTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X3RpbWUgaW4gdXRtcHguaCAqLwotI3VuZGVmIEhBVkVfVElNRV9JTl9VVE1QWAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRpbWluZ3NhZmVfYmNtcCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9USU1JTkdTQUZFX0JDTVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx0bXBkaXIuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9UTVBESVJfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRydW5jYXRlJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1RSVU5DQVRFCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dHR5ZW50Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfVFRZRU5UX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X3R2IGluIHV0bXAuaCAqLwotI3VuZGVmIEhBVkVfVFZfSU5fVVRNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdXRfdHYgaW4gdXRtcHguaCAqLwotI3VuZGVmIEhBVkVfVFZfSU5fVVRNUFgKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X3R5cGUgaW4gdXRtcC5oICovCi0jdW5kZWYgSEFWRV9UWVBFX0lOX1VUTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHV0X3R5cGUgaW4gdXRtcHguaCAqLwotI3VuZGVmIEhBVkVfVFlQRV9JTl9VVE1QWAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVjcmVkLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfVUNSRURfSAotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgdWludHh4X3QgZGF0YSB0eXBlICovCi0jdW5kZWYgSEFWRV9VSU5UWFhfVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdW5zZXRlbnYnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfVU5TRVRFTlYKLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHVuc2lnbmVkIGxvbmcgbG9uZycuICovCi0jdW5kZWYgSEFWRV9VTlNJR05FRF9MT05HX0xPTkcKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1cGR3dG1wJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1VQRFdUTVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1cGR3dG1weCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9VUERXVE1QWAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVzZXJzZWMuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9VU0VSU0VDX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1c2VyX2Zyb21fdWlkJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1VTRVJfRlJPTV9VSUQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1dGlsLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfVVRJTF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXRpbWVzJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1VUSU1FUwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHV0aW1lLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfVVRJTUVfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHV0bXBuYW1lJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1VUTVBOQU1FCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXRtcHhuYW1lJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1VUTVBYTkFNRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHV0bXB4Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfVVRNUFhfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHV0bXAuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9VVE1QX0gKLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIHVfY2hhciBkYXRhIHR5cGUgKi8KLSN1bmRlZiBIQVZFX1VfQ0hBUgotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgdV9pbnQgZGF0YSB0eXBlICovCi0jdW5kZWYgSEFWRV9VX0lOVAotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgdV9pbnQ2NF90IGRhdGEgdHlwZSAqLwotI3VuZGVmIEhBVkVfVV9JTlQ2NF9UCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSB1X2ludHh4X3QgZGF0YSB0eXBlICovCi0jdW5kZWYgSEFWRV9VX0lOVFhYX1QKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2YXNwcmludGYnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfVkFTUFJJTlRGCi0KLS8qIERlZmluZSBpZiB2YV9jb3B5IGV4aXN0cyAqLwotI3VuZGVmIEhBVkVfVkFfQ09QWQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZoYW5ndXAnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfVkhBTkdVUAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHZpcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1ZJU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnNucHJpbnRmJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1ZTTlBSSU5URgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHdhaXRwaWQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfV0FJVFBJRAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9nZXRsb25nJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX19HRVRMT05HCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2dldHB0eScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9fR0VUUFRZCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2dldHNob3J0JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX19HRVRTSE9SVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgc3RydWN0IF9fcmVzX3N0YXRlIF9yZXMgYXMgYW4gZXh0ZXJuICovCi0jdW5kZWYgSEFWRV9fUkVTX0VYVEVSTgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9fYjY0X250b3AnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfX19CNjRfTlRPUAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9fYjY0X3B0b24nIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfX19CNjRfUFRPTgotCi0vKiBEZWZpbmUgaWYgY29tcGlsZXIgaW1wbGVtZW50cyBfX0ZVTkNUSU9OX18gKi8KLSN1bmRlZiBIQVZFX19fRlVOQ1RJT05fXwotCi0vKiBEZWZpbmUgaWYgbGliYyBkZWZpbmVzIF9fcHJvZ25hbWUgKi8KLSN1bmRlZiBIQVZFX19fUFJPR05BTUUKLQotLyogRmllbGRzIGluIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICovCi0jdW5kZWYgSEFWRV9fX1NTX0ZBTUlMWV9JTl9TUwotCi0vKiBEZWZpbmUgaWYgX192YV9jb3B5IGV4aXN0cyAqLwotI3VuZGVmIEhBVkVfX19WQV9DT1BZCi0KLS8qIERlZmluZSBpZiBjb21waWxlciBpbXBsZW1lbnRzIF9fZnVuY19fICovCi0jdW5kZWYgSEFWRV9fX2Z1bmNfXwotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBIZWltZGFsIHZlcnNpb24gb2YgS2VyYmVyb3MgVjUgKi8KLSN1bmRlZiBIRUlNREFMCi0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byB1c2UgSVAgYWRkcmVzcyBpbnN0ZWFkIG9mIGhvc3RuYW1lIGluICRESVNQTEFZICovCi0jdW5kZWYgSVBBRERSX0lOX0RJU1BMQVkKLQotLyogRGV0ZWN0IElQdjQgaW4gSVB2NiBtYXBwZWQgYWRkcmVzc2VzIGFuZCB0cmVhdCBhcyBJUHY0ICovCi0jdW5kZWYgSVBWNF9JTl9JUFY2Ci0KLS8qIERlZmluZSBpZiB5b3VyIHN5c3RlbSBjaG9rZWQgb24gSVAgVE9TIHNldHRpbmcgKi8KLSN1bmRlZiBJUF9UT1NfSVNfQlJPS0VOCi0KLS8qIERlZmluZSBpZiB5b3Ugd2FudCBLZXJiZXJvcyA1IHN1cHBvcnQgKi8KLSN1bmRlZiBLUkI1Ci0KLS8qIERlZmluZSBpZiBwdXR1dHhsaW5lIHVwZGF0ZXMgbGFzdGxvZyB0b28gKi8KLSN1bmRlZiBMQVNUTE9HX1dSSVRFX1BVVFVUWExJTkUKLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IFRDUCBXcmFwcGVycyBzdXBwb3J0ICovCi0jdW5kZWYgTElCV1JBUAotCi0vKiBEZWZpbmUgdG8gd2hhdGV2ZXIgbGluaygpIHJldHVybnMgZm9yICJub3Qgc3VwcG9ydGVkIiBpZiBpdCBkb2Vzbid0IHJldHVybgotICAgRU9QTk9UU1VQUC4gKi8KLSN1bmRlZiBMSU5LX09QTk9UU1VQUF9FUlJOTwotCi0vKiBBZGp1c3QgTGludXggb3V0LW9mLW1lbW9yeSBraWxsZXIgKi8KLSN1bmRlZiBMSU5VWF9PT01fQURKVVNUCi0KLS8qIG1heCB2YWx1ZSBvZiBsb25nIGxvbmcgY2FsY3VsYXRlZCBieSBjb25maWd1cmUgKi8KLSN1bmRlZiBMTE9OR19NQVgKLQotLyogbWluIHZhbHVlIG9mIGxvbmcgbG9uZyBjYWxjdWxhdGVkIGJ5IGNvbmZpZ3VyZSAqLwotI3VuZGVmIExMT05HX01JTgotCi0vKiBBY2NvdW50IGxvY2tlZCB3aXRoIHB3KDEpICovCi0jdW5kZWYgTE9DS0VEX1BBU1NXRF9QUkVGSVgKLQotLyogU3RyaW5nIHVzZWQgaW4gL2V0Yy9wYXNzd2QgdG8gZGVub3RlIGxvY2tlZCBhY2NvdW50ICovCi0jdW5kZWYgTE9DS0VEX1BBU1NXRF9TVFJJTkcKLQotLyogU3RyaW5nIHVzZWQgaW4gL2V0Yy9wYXNzd2QgdG8gZGVub3RlIGxvY2tlZCBhY2NvdW50ICovCi0jdW5kZWYgTE9DS0VEX1BBU1NXRF9TVUJTVFIKLQotLyogU29tZSB2ZXJzaW9ucyBvZiAvYmluL2xvZ2luIG5lZWQgdGhlIFRFUk0gc3VwcGxpZWQgb24gdGhlIGNvbW1hbmRsaW5lICovCi0jdW5kZWYgTE9HSU5fTkVFRFNfVEVSTQotCi0vKiBTb21lIHN5c3RlbXMgbmVlZCBhIHV0bXB4IGVudHJ5IGZvciAvYmluL2xvZ2luIHRvIHdvcmsgKi8KLSN1bmRlZiBMT0dJTl9ORUVEU19VVE1QWAotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2dpbiBwcm9ncmFtIGNhbm5vdCBoYW5kbGUgZW5kIG9mIG9wdGlvbnMgKCItLSIpICovCi0jdW5kZWYgTE9HSU5fTk9fRU5ET1BUCi0KLS8qIElmIHlvdXIgaGVhZGVyIGZpbGVzIGRvbid0IGRlZmluZSBMT0dJTl9QUk9HUkFNLCB0aGVuIHVzZSB0aGlzIChkZXRlY3RlZCkKLSAgIGZyb20gZW52aXJvbm1lbnQgYW5kIFBBVEggKi8KLSN1bmRlZiBMT0dJTl9QUk9HUkFNX0ZBTExCQUNLCi0KLS8qIFNldCB0aGlzIHRvIHlvdXIgbWFpbCBkaXJlY3RvcnkgaWYgeW91IGRvIG5vdCBoYXZlIF9QQVRIX01BSUxESVIgKi8KLSN1bmRlZiBNQUlMX0RJUkVDVE9SWQotCi0vKiBEZWZpbmUgb24gKm50by1xbnggc3lzdGVtcyAqLwotI3VuZGVmIE1JU1NJTkdfRkRfTUFTSwotCi0vKiBEZWZpbmUgb24gKm50by1xbnggc3lzdGVtcyAqLwotI3VuZGVmIE1JU1NJTkdfSE9XTUFOWQotCi0vKiBEZWZpbmUgb24gKm50by1xbnggc3lzdGVtcyAqLwotI3VuZGVmIE1JU1NJTkdfTkZEQklUUwotCi0vKiBOZWVkIHNldHBncnAgdG8gYWNxdWlyZSBjb250cm9sbGluZyB0dHkgKi8KLSN1bmRlZiBORUVEX1NFVFBHUlAKLQotLyogRGVmaW5lIGlmIHRoZSBjb25jZXB0IG9mIHBvcnRzIG9ubHkgYWNjZXNzaWJsZSB0byBzdXBlcnVzZXJzIGlzbid0IGtub3duICovCi0jdW5kZWYgTk9fSVBQT1JUX1JFU0VSVkVEX0NPTkNFUFQKLQotLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBsYXN0bG9nIGluIHNlc3Npb24uYyAqLwotI3VuZGVmIE5PX1NTSF9MQVNUTE9HCi0KLS8qIERlZmluZSBpZiBYMTEgZG9lc24ndCBzdXBwb3J0IEFGX1VOSVggc29ja2V0cyBvbiB0aGF0IHN5c3RlbSAqLwotI3VuZGVmIE5PX1gxMV9VTklYX1NPQ0tFVFMKLQotLyogRGVmaW5lIGlmIEVWUF9EaWdlc3RVcGRhdGUgcmV0dXJucyB2b2lkICovCi0jdW5kZWYgT1BFTlNTTF9FVlBfRElHRVNUVVBEQVRFX1ZPSUQKLQotLyogbGliY3J5cHRvIGluY2x1ZGVzIGNvbXBsZXRlIEVDQyBzdXBwb3J0ICovCi0jdW5kZWYgT1BFTlNTTF9IQVNfRUNDCi0KLS8qIGxpYmNyeXB0byBpcyBtaXNzaW5nIEFFUyAxOTIgYW5kIDI1NiBiaXQgZnVuY3Rpb25zICovCi0jdW5kZWYgT1BFTlNTTF9MT0JPVE9NSVNFRF9BRVMKLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IE9wZW5TU0wncyBpbnRlcm5hbGx5IHNlZWRlZCBQUk5HIG9ubHkgKi8KLSN1bmRlZiBPUEVOU1NMX1BSTkdfT05MWQotCi0vKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KLSN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9OQU1FCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1NUUklORwotCi0vKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9UQVJOQU1FCi0KLS8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9VUkwKLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBhcmUgdXNpbmcgU29sYXJpcy1kZXJpdmVkIFBBTSB3aGljaCBwYXNzZXMgcGFtX21lc3NhZ2VzIHRvCi0gICB0aGUgY29udmVyc2F0aW9uIGZ1bmN0aW9uIHdpdGggYW4gZXh0cmEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KLSN1bmRlZiBQQU1fU1VOX0NPREVCQVNFCi0KLS8qIFdvcmsgYXJvdW5kIHByb2JsZW1hdGljIExpbnV4IFBBTSBtb2R1bGVzIGhhbmRsaW5nIG9mIFBBTV9UVFkgKi8KLSN1bmRlZiBQQU1fVFRZX0tMVURHRQotCi0vKiBtdXN0IHN1cHBseSB1c2VybmFtZSB0byBwYXNzd2QgKi8KLSN1bmRlZiBQQVNTV0RfTkVFRFNfVVNFUk5BTUUKLQotLyogUG9ydCBudW1iZXIgb2YgUFJOR0QvRUdEIHJhbmRvbSBudW1iZXIgc29ja2V0ICovCi0jdW5kZWYgUFJOR0RfUE9SVAotCi0vKiBMb2NhdGlvbiBvZiBQUk5HRC9FR0QgcmFuZG9tIG51bWJlciBzb2NrZXQgKi8KLSN1bmRlZiBQUk5HRF9TT0NLRVQKLQotLyogcmVhZCgxKSBjYW4gcmV0dXJuIDAgZm9yIGEgbm9uLWNsb3NlZCBmZCAqLwotI3VuZGVmIFBUWV9aRVJPUkVBRAotCi0vKiBTYW5kYm94IHVzaW5nIERhcndpbiBzYW5kYm94X2luaXQoMykgKi8KLSN1bmRlZiBTQU5EQk9YX0RBUldJTgotCi0vKiBubyBwcml2c2VwIHNhbmRib3hpbmcgKi8KLSN1bmRlZiBTQU5EQk9YX05VTEwKLQotLyogU2FuZGJveCB1c2luZyBzZXRybGltaXQoMikgKi8KLSN1bmRlZiBTQU5EQk9YX1JMSU1JVAotCi0vKiBTYW5kYm94IHVzaW5nIHN5c3RyYWNlKDQpICovCi0jdW5kZWYgU0FOREJPWF9TWVNUUkFDRQotCi0vKiBEZWZpbmUgaWYgeW91ciBwbGF0Zm9ybSBicmVha3MgZG9pbmcgYSBzZXRldWlkIGJlZm9yZSBhIHNldHVpZCAqLwotI3VuZGVmIFNFVEVVSURfQlJFQUtTX1NFVFVJRAotCi0vKiBUaGUgc2l6ZSBvZiBgY2hhcicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KLSN1bmRlZiBTSVpFT0ZfQ0hBUgotCi0vKiBUaGUgc2l6ZSBvZiBgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotI3VuZGVmIFNJWkVPRl9JTlQKLQotLyogVGhlIHNpemUgb2YgYGxvbmcgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotI3VuZGVmIFNJWkVPRl9MT05HX0lOVAotCi0vKiBUaGUgc2l6ZSBvZiBgbG9uZyBsb25nIGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KLSN1bmRlZiBTSVpFT0ZfTE9OR19MT05HX0lOVAotCi0vKiBUaGUgc2l6ZSBvZiBgc2hvcnQgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotI3VuZGVmIFNJWkVPRl9TSE9SVF9JTlQKLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IFMvS2V5IHN1cHBvcnQgKi8KLSN1bmRlZiBTS0VZCi0KLS8qIERlZmluZSBpZiB5b3VyIHNrZXljaGFsbGVuZ2UoKSBmdW5jdGlvbiB0YWtlcyA0IGFyZ3VtZW50cyAoTmV0QlNEKSAqLwotI3VuZGVmIFNLRVlDSEFMTEVOR0VfNEFSRwotCi0vKiBEZWZpbmUgYXMgY29uc3QgaWYgc25wcmludGYoKSBjYW4gZGVjbGFyZSBjb25zdCBjaGFyICpmbXQgKi8KLSN1bmRlZiBTTlBSSU5URl9DT05TVAotCi0vKiBEZWZpbmUgdG8gYSBTZXQgUHJvY2VzcyBUaXRsZSB0eXBlIGlmIHlvdXIgc3lzdGVtIGlzIHN1cHBvcnRlZCBieQotICAgYnNkLXNldHByb2N0aXRsZS5jICovCi0jdW5kZWYgU1BUX1RZUEUKLQotLyogRGVmaW5lIGlmIHNzaGQgc29tZWhvdyByZWFjcXVpcmVzIGEgY29udHJvbGxpbmcgVFRZIGFmdGVyIHNldHNpZCgpICovCi0jdW5kZWYgU1NIRF9BQ1FVSVJFU19DVFRZCi0KLS8qIERlZmluZSBpZiBwYW1fY2hhdXRodG9rIHdhbnRzIHJlYWwgdWlkIHNldCB0byB0aGUgdW5wcml2J2VkIHVzZXIgKi8KLSN1bmRlZiBTU0hQQU1fQ0hBVVRIVE9LX05FRURTX1JVSUQKLQotLyogVXNlIGF1ZGl0IGRlYnVnZ2luZyBtb2R1bGUgKi8KLSN1bmRlZiBTU0hfQVVESVRfRVZFTlRTCi0KLS8qIFdpbmRvd3MgaXMgc2Vuc2l0aXZlIHRvIHJlYWQgYnVmZmVyIHNpemUgKi8KLSN1bmRlZiBTU0hfSU9CVUZTWgotCi0vKiBub24tcHJpdmlsZWdlZCB1c2VyIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbiAqLwotI3VuZGVmIFNTSF9QUklWU0VQX1VTRVIKLQotLyogVXNlIHR1bm5lbCBkZXZpY2UgY29tcGF0aWJpbGl0eSB0byBPcGVuQlNEICovCi0jdW5kZWYgU1NIX1RVTl9DT01QQVRfQUYKLQotLyogT3BlbiB0dW5uZWwgZGV2aWNlcyB0aGUgRnJlZUJTRCB3YXkgKi8KLSN1bmRlZiBTU0hfVFVOX0ZSRUVCU0QKLQotLyogT3BlbiB0dW5uZWwgZGV2aWNlcyB0aGUgTGludXggdHVuL3RhcCB3YXkgKi8KLSN1bmRlZiBTU0hfVFVOX0xJTlVYCi0KLS8qIE5vIGxheWVyIDIgdHVubmVsIHN1cHBvcnQgKi8KLSN1bmRlZiBTU0hfVFVOX05PX0wyCi0KLS8qIE9wZW4gdHVubmVsIGRldmljZXMgdGhlIE9wZW5CU0Qgd2F5ICovCi0jdW5kZWYgU1NIX1RVTl9PUEVOQlNECi0KLS8qIFByZXBlbmQgdGhlIGFkZHJlc3MgZmFtaWx5IHRvIElQIHR1bm5lbCB0cmFmZmljICovCi0jdW5kZWYgU1NIX1RVTl9QUkVQRU5EX0FGCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgeW91IHdhbnQgYSBkaWZmZXJlbnQgJFBBVEggZm9yIHRoZSBzdXBlcnVzZXIgKi8KLSN1bmRlZiBTVVBFUlVTRVJfUEFUSAotCi0vKiBzeXNsb2dfciBmdW5jdGlvbiBpcyBzYWZlIHRvIHVzZSBpbiBpbiBhIHNpZ25hbCBoYW5kbGVyICovCi0jdW5kZWYgU1lTTE9HX1JfU0FGRV9JTl9TSUdIQU5ECi0KLS8qIFN1cHBvcnQgcGFzc3dvcmRzID4gOCBjaGFycyAqLwotI3VuZGVmIFVOSVhXQVJFX0xPTkdfUEFTU1dPUkRTCi0KLS8qIFNwZWNpZnkgZGVmYXVsdCAkUEFUSCAqLwotI3VuZGVmIFVTRVJfUEFUSAotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byB1c2UgbGlia2FmcycgQUZTIHN1cHBvcnQgKi8KLSN1bmRlZiBVU0VfQUZTCi0KLS8qIFVzZSBCU00gYXVkaXQgbW9kdWxlICovCi0jdW5kZWYgVVNFX0JTTV9BVURJVAotCi0vKiBVc2UgYnRtcCB0byBsb2cgYmFkIGxvZ2lucyAqLwotI3VuZGVmIFVTRV9CVE1QCi0KLS8qIFVzZSBsaWJlZGl0IGZvciBzZnRwICovCi0jdW5kZWYgVVNFX0xJQkVESVQKLQotLyogVXNlIExpbnV4IGF1ZGl0IG1vZHVsZSAqLwotI3VuZGVmIFVTRV9MSU5VWF9BVURJVAotCi0vKiBFbmFibGUgT3BlblNTTCBlbmdpbmUgc3VwcG9ydCAqLwotI3VuZGVmIFVTRV9PUEVOU1NMX0VOR0lORQotCi0vKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIFBBTSBzdXBwb3J0ICovCi0jdW5kZWYgVVNFX1BBTQotCi0vKiBVc2UgUElQRVMgaW5zdGVhZCBvZiBhIHNvY2tldHBhaXIoKSAqLwotI3VuZGVmIFVTRV9QSVBFUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgU29sYXJpcyBwcm9jZXNzIGNvbnRyYWN0cyAqLwotI3VuZGVmIFVTRV9TT0xBUklTX1BST0NFU1NfQ09OVFJBQ1RTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBTb2xhcmlzIHByb2plY3RzICovCi0jdW5kZWYgVVNFX1NPTEFSSVNfUFJPSkVDVFMKLQotLyogRGVmaW5lIGlmIHlvdSBzaG91bGRuJ3Qgc3RyaXAgJ3R0eScgZnJvbSB5b3VyIHR0eW5hbWUgaW4gW3V3XXRtcCAqLwotI3VuZGVmIFdJVEhfQUJCUkVWX05PX1RUWQotCi0vKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIEFJWDQncyBhdXRoZW50aWNhdGUgZnVuY3Rpb24gKi8KLSN1bmRlZiBXSVRIX0FJWEFVVEhFTlRJQ0FURQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUvd2FudCBhcnJheXMgKGNsdXN0ZXItd2lkZSBzZXNzaW9uIG1hbmFnbWVudCwgbm90IEMKLSAgIGFycmF5cykgKi8KLSN1bmRlZiBXSVRIX0lSSVhfQVJSQVkKLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IElSSVggYXVkaXQgdHJhaWxzICovCi0jdW5kZWYgV0lUSF9JUklYX0FVRElUCi0KLS8qIERlZmluZSBpZiB5b3Ugd2FudCBJUklYIGtlcm5lbCBqb2JzICovCi0jdW5kZWYgV0lUSF9JUklYX0pPQlMKLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IElSSVggcHJvamVjdCBtYW5hZ2VtZW50ICovCi0jdW5kZWYgV0lUSF9JUklYX1BST0pFQ1QKLQotLyogRGVmaW5lIGlmIHlvdSB3YW50IFNFTGludXggc3VwcG9ydC4gKi8KLSN1bmRlZiBXSVRIX1NFTElOVVgKLQotLyogRGVmaW5lIFdPUkRTX0JJR0VORElBTiB0byAxIGlmIHlvdXIgcHJvY2Vzc29yIHN0b3JlcyB3b3JkcyB3aXRoIHRoZSBtb3N0Ci0gICBzaWduaWZpY2FudCBieXRlIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsKS4gKi8KLSNpZiBkZWZpbmVkIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRAotIyBpZiBkZWZpbmVkIF9fQklHX0VORElBTl9fCi0jICBkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKLSMgZW5kaWYKLSNlbHNlCi0jIGlmbmRlZiBXT1JEU19CSUdFTkRJQU4KLSMgIHVuZGVmIFdPUkRTX0JJR0VORElBTgotIyBlbmRpZgotI2VuZGlmCi0KLS8qIERlZmluZSBpZiB4YXV0aCBpcyBmb3VuZCBpbiB5b3VyIHBhdGggKi8KLSN1bmRlZiBYQVVUSF9QQVRICi0KLS8qIE51bWJlciBvZiBiaXRzIGluIGEgZmlsZSBvZmZzZXQsIG9uIGhvc3RzIHdoZXJlIHRoaXMgaXMgc2V0dGFibGUuICovCi0jdW5kZWYgX0ZJTEVfT0ZGU0VUX0JJVFMKLQotLyogRGVmaW5lIGZvciBsYXJnZSBmaWxlcywgb24gQUlYLXN0eWxlIGhvc3RzLiAqLwotI3VuZGVmIF9MQVJHRV9GSUxFUwotCi0vKiBsb2cgZm9yIGJhZCBsb2dpbiBhdHRlbXB0cyAqLwotI3VuZGVmIF9QQVRIX0JUTVAKLQotLyogRnVsbCBwYXRoIG9mIHlvdXIgInBhc3N3ZCIgcHJvZ3JhbSAqLwotI3VuZGVmIF9QQVRIX1BBU1NXRF9QUk9HCi0KLS8qIFNwZWNpZnkgbG9jYXRpb24gb2Ygc3NoLnBpZCAqLwotI3VuZGVmIF9QQVRIX1NTSF9QSURESVIKLQotLyogRGVmaW5lIGlmIHdlIGRvbid0IGhhdmUgc3RydWN0IF9fcmVzX3N0YXRlIGluIHJlc29sdi5oICovCi0jdW5kZWYgX19yZXNfc3RhdGUKLQotLyogRGVmaW5lIHRvIGBfX2lubGluZV9fJyBvciBgX19pbmxpbmUnIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyCi0gICBjYWxscyBpdCwgb3IgdG8gbm90aGluZyBpZiAnaW5saW5lJyBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIGFueSBuYW1lLiAgKi8KLSNpZm5kZWYgX19jcGx1c3BsdXMKLSN1bmRlZiBpbmxpbmUKLSNlbmRpZgotCi0vKiB0eXBlIHRvIHVzZSBpbiBwbGFjZSBvZiBzb2NrbGVuX3QgaWYgbm90IGRlZmluZWQgKi8KLSN1bmRlZiBzb2NrbGVuX3QKZGlmZiAtLWdpdCBhL2NvbmZpZy5zdWIgYi9jb25maWcuc3ViCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDgxNjk2Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy5zdWIKKysrIC9kZXYvbnVsbApAQCAtMSwxNzM5ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAotIyAgIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLXRpbWVzdGFtcD0nMjAxMS0wMS0wMScKLQotIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCi0jIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKLSMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSMgMDIxMTAtMTMwMSwgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLQotIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKLSMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgR05VIENoYW5nZUxvZyBlbnRyeS4KLSMKLSMgQ29uZmlndXJhdGlvbiBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIGFuZCBjYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIHR5cGUuCi0jIFN1cHBseSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdHlwZSBhcyBhbiBhcmd1bWVudC4KLSMgSWYgaXQgaXMgaW52YWxpZCwgd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGV4aXQgd2l0aCBjb2RlIDEuCi0jIE90aGVyd2lzZSwgd2UgcHJpbnQgdGhlIGNhbm9uaWNhbCBjb25maWcgdHlwZSBvbiBzdGRvdXQgYW5kIHN1Y2NlZWQuCi0KLSMgWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc2NyaXB0IGZyb206Ci0jIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuc3ViO2hiPUhFQUQKLQotIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKLSMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCi0jIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCi0jIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCi0jIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAotIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCi0jIGNvbmZpZ3VyYXRpb24uCi0KLSMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCi0jIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0jIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCi0jIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KLQotbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCi0KLXVzYWdlPSJcCi1Vc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUwotICAgICAgICQwIFtPUFRJT05dIEFMSUFTCi0KLUNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KLQotT3BlcmF0aW9uIG1vZGVzOgotICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKLSAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAotICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAotCi1SZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgotCi12ZXJzaW9uPSJcCi1HTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKLQotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAotMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCi13YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCi0KLWhlbHA9IgotVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0jIFBhcnNlIGNvbW1hbmQgbGluZQotd2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCi0gIGNhc2UgJDEgaW4KLSAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQotICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OwotICAgIC0tdmVyc2lvbiB8IC12ICkKLSAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7Ci0gICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7Ci0gICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCi0gICAgICAgc2hpZnQ7IGJyZWFrIDs7Ci0gICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgotICAgICAgIGJyZWFrIDs7Ci0gICAgLSogKQotICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIKLSAgICAgICBleGl0IDEgOzsKLQotICAgICpsb2NhbCopCi0gICAgICAgIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCi0gICAgICAgZWNobyAkMQotICAgICAgIGV4aXQgOzsKLQotICAgICogKQotICAgICAgIGJyZWFrIDs7Ci0gIGVzYWMKLWRvbmUKLQotY2FzZSAkIyBpbgotIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKLSAgICBleGl0IDE7OwotIDEpIDs7Ci0gKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCi0gICAgZXhpdCAxOzsKLWVzYWMKLQotIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgotIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KLW1heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAotY2FzZSAkbWF5YmVfb3MgaW4KLSAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtYW5kcm9pZCogfCBsaW51eC1kaWV0bGliYyB8IGxpbnV4LW5ld2xpYiogfCBcCi0gIGxpbnV4LXVjbGliYyogfCB1Y2xpbnV4LXVjbGliYyogfCB1Y2xpbnV4LWdudSogfCBrZnJlZWJzZCotZ251KiB8IFwKLSAga25ldGJzZCotZ251KiB8IG5ldGJzZCotZ251KiB8IFwKLSAga29wZW5zb2xhcmlzKi1nbnUqIHwgXAotICBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCi0gICAgb3M9LSRtYXliZV9vcwotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCi0gICAgOzsKLSAgKikKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCi0gICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCi0gICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAotICAgIGVsc2Ugb3M9OyBmaQotICAgIDs7Ci1lc2FjCi0KLSMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbwotIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KLSMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKLSMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgotY2FzZSAkb3MgaW4KLQktc3VuKm9zKikKLQkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCi0JCTs7Ci0JLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKLQktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKLQktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAotCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCi0JLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKLQktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKLQktYXBwbGUgfCAtYXhpcyB8IC1rbnV0aCB8IC1jcmF5IHwgLW1pY3JvYmxhemUpCi0JCW9zPQotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0gICAgICAgIC1ibHVlZ2VuZSopCi0JICAgICAgICBvcz0tY25rCi0JCTs7Ci0JLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCi0JCW9zPQotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLXNjb3V0KQotCQk7OwotCS13cnMpCi0JCW9zPS12eHdvcmtzCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktY2hvcnVzb3MqKQotCQlvcz0tY2hvcnVzb3MKLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotIAktY2hvcnVzcmRiKQotIAkJb3M9LWNob3J1c3JkYgotCQliYXNpY19tYWNoaW5lPSQxCi0gCQk7OwotCS1oaXV4KikKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQktc2NvNikKLQkJb3M9LXNjbzV2NgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzUpCi0JCW9zPS1zY28zLjJ2NQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzQpCi0JCW9zPS1zY28zLjJ2NAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMi5bNC05XSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjJ2WzQtOV0qKQotCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzV2NiopCi0JCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvKikKLQkJb3M9LXNjbzMuMnYyCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktdWRrKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1pc2MpCi0JCW9zPS1pc2MyLjIKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1jbGl4KikKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKLQkJOzsKLQktaXNjKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1seW54KikKLQkJb3M9LWx5bnhvcwotCQk7OwotCS1wdHgqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKLQkJOzsKLQktd2luZG93c250KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAotCQk7OwotCS1wc29zKikKLQkJb3M9LXBzb3MKLQkJOzsKLQktbWludCB8IC1taW50WzAtOV0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKLQkJb3M9LW1pbnQKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KLQkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgotCTE3NTBhIHwgNTgwIFwKLQl8IGEyOWsgXAotCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYWV2Nls3OF0gfCBhbHBoYXBjYTVbNjddIFwKLQl8IGFscGhhNjQgfCBhbHBoYTY0ZXZbNC04XSB8IGFscGhhNjRldjU2IHwgYWxwaGE2NGV2Nls3OF0gfCBhbHBoYTY0cGNhNVs2N10gXAotCXwgYW0zM18yLjAgXAotCXwgYXJjIHwgYXJtIHwgYXJtW2JsXWUgfCBhcm1lW2xiXSB8IGFybXZbMjM0NV0gfCBhcm12WzM0NV1bbGJdIHwgYXZyIHwgYXZyMzIgXAotCXwgYmZpbiBcCi0JfCBjNHggfCBjbGlwcGVyIFwKLQl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCi0JfCBmaWRvIHwgZnIzMCB8IGZydiBcCi0JfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAotCXwgaTM3MCB8IGk4NjAgfCBpOTYwIHwgaWE2NCBcCi0JfCBpcDJrIHwgaXEyMDAwIFwKLQl8IGxtMzIgXAotCXwgbTMyYyB8IG0zMnIgfCBtMzJybGUgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayBcCi0JfCBtYXhxIHwgbWIgfCBtaWNyb2JsYXplIHwgbWNvcmUgfCBtZXAgfCBtZXRhZyBcCi0JfCBtaXBzIHwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIFwKLQl8IG1pcHMxNiBcCi0JfCBtaXBzNjQgfCBtaXBzNjRlbCBcCi0JfCBtaXBzNjRvY3Rlb24gfCBtaXBzNjRvY3Rlb25lbCBcCi0JfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAotCXwgbWlwczY0cjU5MDAgfCBtaXBzNjRyNTkwMGVsIFwKLQl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCi0JfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCi0JfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCBcCi0JfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCi0JfCBtaXBzNjR2cjU5MDAgfCBtaXBzNjR2cjU5MDBlbCBcCi0JfCBtaXBzaXNhMzIgfCBtaXBzaXNhMzJlbCBcCi0JfCBtaXBzaXNhMzJyMiB8IG1pcHNpc2EzMnIyZWwgXAotCXwgbWlwc2lzYTY0IHwgbWlwc2lzYTY0ZWwgXAotCXwgbWlwc2lzYTY0cjIgfCBtaXBzaXNhNjRyMmVsIFwKLQl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKLQl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCi0JfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAotCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAotCXwgbW94aWUgXAotCXwgbXQgXAotCXwgbXNwNDMwIFwKLQl8IG5kczMyIHwgbmRzMzJsZSB8IG5kczMyYmUgXAotCXwgbmlvcyB8IG5pb3MyIFwKLQl8IG5zMTZrIHwgbnMzMmsgXAotCXwgb3IzMiBcCi0JfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAotCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAotCXwgcHlyYW1pZCBcCi0JfCByeCBcCi0JfCBzY29yZSBcCi0JfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAotCXwgc2g2NCB8IHNoNjRsZSBcCi0JfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCi0JfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAotCXwgc3B1IHwgc3Ryb25nYXJtIFwKLQl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzU0eCB8IHRpYzU1eCB8IHRpYzZ4IHwgdGljODAgfCB0cm9uIFwKLQl8IHViaWNvbTMyIFwKLQl8IHY4NTAgfCB2ODUwZSBcCi0JfCB3ZTMyayBcCi0JfCB4ODYgfCB4YzE2eCB8IHhzY2FsZSB8IHhzY2FsZWVbYmxdIHwgeHN0b3JteTE2IHwgeHRlbnNhIFwKLQl8IHo4ayB8IHo4MCkKLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCTs7Ci0JYzU0eCkKLQkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgotCQk7OwotCWM1NXgpCi0JCWJhc2ljX21hY2hpbmU9dGljNTV4LXVua25vd24KLQkJOzsKLQljNngpCi0JCWJhc2ljX21hY2hpbmU9dGljNngtdW5rbm93bgotCQk7OwotCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMiB8IHBpY29jaGlwKQotCQkjIE1vdG9yb2xhIDY4SEMxMS8xMi4KLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCW9zPS1ub25lCi0JCTs7Ci0JbTg4MTEwIHwgbTY4MFsxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB2NzAgfCB3NjUgfCB6OGspCi0JCTs7Ci0JbXMxKQotCQliYXNpY19tYWNoaW5lPW10LXVua25vd24KLQkJOzsKLQotCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCi0JIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCi0JIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgotCWkqODYgfCB4ODZfNjQpCi0JICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCi0JICA7OwotCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCi0JKi0qLSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgotCTU4MC0qIFwKLQl8IGEyOWstKiBcCi0JfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKLQl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCi0JfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIFwKLQl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAotCXwgYXZyLSogfCBhdnIzMi0qIFwKLQl8IGJmaW4tKiB8IGJzMjAwMC0qIFwKLQl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM0eC0qIFwKLQl8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCi0JfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCi0JfCBlbHhzaS0qIFwKLQl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZpZG8tKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKLQl8IGg4MzAwLSogfCBoODUwMC0qIFwKLQl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCi0JfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAotCXwgaXAyay0qIHwgaXEyMDAwLSogXAotCXwgbG0zMi0qIFwKLQl8IG0zMmMtKiB8IG0zMnItKiB8IG0zMnJsZS0qIFwKLQl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCi0JfCBtODgxMTAtKiB8IG04OGstKiB8IG1heHEtKiB8IG1jb3JlLSogfCBtZXRhZy0qIHwgbWljcm9ibGF6ZS0qIFwKLQl8IG1pcHMtKiB8IG1pcHNiZS0qIHwgbWlwc2ViLSogfCBtaXBzZWwtKiB8IG1pcHNsZS0qIFwKLQl8IG1pcHMxNi0qIFwKLQl8IG1pcHM2NC0qIHwgbWlwczY0ZWwtKiBcCi0JfCBtaXBzNjRvY3Rlb24tKiB8IG1pcHM2NG9jdGVvbmVsLSogXAotCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCi0JfCBtaXBzNjRyNTkwMC0qIHwgbWlwczY0cjU5MDBlbC0qIFwKLQl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAotCXwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIFwKLQl8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiBcCi0JfCBtaXBzNjR2cjUwMDAtKiB8IG1pcHM2NHZyNTAwMGVsLSogXAotCXwgbWlwczY0dnI1OTAwLSogfCBtaXBzNjR2cjU5MDBlbC0qIFwKLQl8IG1pcHNpc2EzMi0qIHwgbWlwc2lzYTMyZWwtKiBcCi0JfCBtaXBzaXNhMzJyMi0qIHwgbWlwc2lzYTMycjJlbC0qIFwKLQl8IG1pcHNpc2E2NC0qIHwgbWlwc2lzYTY0ZWwtKiBcCi0JfCBtaXBzaXNhNjRyMi0qIHwgbWlwc2lzYTY0cjJlbC0qIFwKLQl8IG1pcHNpc2E2NHNiMS0qIHwgbWlwc2lzYTY0c2IxZWwtKiBcCi0JfCBtaXBzaXNhNjRzcjcxay0qIHwgbWlwc2lzYTY0c3I3MWtlbC0qIFwKLQl8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAotCXwgbW1peC0qIFwKLQl8IG10LSogXAotCXwgbXNwNDMwLSogXAotCXwgbmRzMzItKiB8IG5kczMybGUtKiB8IG5kczMyYmUtKiBcCi0JfCBuaW9zLSogfCBuaW9zMi0qIFwKLQl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAotCXwgb3Jpb24tKiBcCi0JfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKLQl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCi0JfCBweXJhbWlkLSogXAotCXwgcm9tcC0qIHwgcnM2MDAwLSogfCByeC0qIFwKLQl8IHNoLSogfCBzaFsxMjM0XS0qIHwgc2hbMjRdYS0qIHwgc2hbMjRdYWViLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hlYi0qIHwgc2hiZS0qIFwKLQl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAotCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjNjRiLSogfCBzcGFyYzY0di0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogXAotCXwgc3BhcmNsaXRlLSogXAotCXwgc3BhcmN2OC0qIHwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHNwYXJjdjl2LSogfCBzdHJvbmdhcm0tKiB8IHN2MS0qIHwgc3g/LSogXAotCXwgdGFob2UtKiB8IHRodW1iLSogXAotCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogXAotCXwgdGlsZS0qIHwgdGlsZWd4LSogXAotCXwgdHJvbi0qIFwKLQl8IHViaWNvbTMyLSogXAotCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKLQl8IHdlMzJrLSogXAotCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhjMTZ4LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKiBcCi0JfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYSotKiBcCi0JfCB5bXAtKiBcCi0JfCB6OGstKiB8IHo4MC0qKQotCQk7OwotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUsIHdpdGggZ2xvYiBtYXRjaC4KLQl4dGVuc2EqKQotCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCi0JIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KLQkzODZic2QpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1ic2QKLQkJOzsKLQkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0Ci0JCTs7Ci0JM2IqKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCWEyOWtoaWYpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotICAgIAlhYmFjdXMpCi0JCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KLQkJOzsKLQlhZG9iZTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKLQkJb3M9LXNjb3V0Ci0JCTs7Ci0JYWxsaWFudCB8IGZ4ODApCi0JCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50Ci0JCTs7Ci0JYWx0b3MgfCBhbHRvczMwNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcwotCQk7OwotCWFtMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQotCQlvcz0tYnNkCi0JCTs7Ci0JYW1kNjQpCi0JCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCi0JCTs7Ci0JYW1kNjQtKikKLQkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlhbWRhaGwpCi0JCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAotCQlvcz0tc3lzdgotCQk7OwotCWFtaWdhIHwgYW1pZ2EtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJOzsKLQlhbWlnYW9zIHwgYW1pZ2Fkb3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JYW1pZ2F1bml4IHwgYW1peCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JYXBvbGxvNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LXN5c3YKLQkJOzsKLQlhcG9sbG82OGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tYnNkCi0JCTs7Ci0JYXJvcykKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1hcm9zCi0JCTs7Ci0JYXV4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJb3M9LWF1eAotCQk7OwotCWJhbGFuY2UpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQlibGFja2ZpbikKLQkJYmFzaWNfbWFjaGluZT1iZmluLXVua25vd24KLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JYmxhY2tmaW4tKikKLQkJYmFzaWNfbWFjaGluZT1iZmluLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCW9zPS1saW51eAotCQk7OwotCWJsdWVnZW5lKikKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQotCQlvcz0tY25rCi0JCTs7Ci0JYzU0eC0qKQotCQliYXNpY19tYWNoaW5lPXRpYzU0eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCWM1NXgtKikKLQkJYmFzaWNfbWFjaGluZT10aWM1NXgtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQljNngtKikKLQkJYmFzaWNfbWFjaGluZT10aWM2eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCWM5MCkKLQkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0gICAgICAgIGNlZ2NjKQotCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCi0JCW9zPS1jZWdjYwotCQk7OwotCWNvbnZleC1jMSkKLQkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMikKLQkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzIpCi0JCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzNCkKLQkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM4KQotCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNyYXkgfCBqOTApCi0JCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyYXludikKLQkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQotCQlvcz0tdW5pY29zbXAKLQkJOzsKLQljcjE2IHwgY3IxNi0qKQotCQliYXNpY19tYWNoaW5lPWNyMTYtdW5rbm93bgotCQlvcz0tZWxmCi0JCTs7Ci0JY3JkcyB8IHVub3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCi0JCTs7Ci0JY3Jpc3YzMiB8IGNyaXN2MzItKiB8IGV0cmF4ZnMqKQotCQliYXNpY19tYWNoaW5lPWNyaXN2MzItYXhpcwotCQk7OwotCWNyaXMgfCBjcmlzLSogfCBldHJheCopCi0JCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCi0JCTs7Ci0JY3J4KQotCQliYXNpY19tYWNoaW5lPWNyeC11bmtub3duCi0JCW9zPS1lbGYKLQkJOzsKLQlkYTMwIHwgZGEzMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAotCQk7OwotCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKLQkJYmFzaWNfbWFjaGluZT1taXBzLWRlYwotCQk7OwotCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMxMAotCQk7OwotCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMyMAotCQk7OwotCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCi0JICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQotCQk7OwotCWRlbHRhODgpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQotCQlvcz0tc3lzdjMKLQkJOzsKLQlkaWNvcykKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCW9zPS1kaWNvcwotCQk7OwotCWRqZ3BwKQotCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKLQkJb3M9LW1zZG9zZGpncHAKLQkJOzsKLQlkcHgyMCB8IGRweDIwLSopCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKLQkJb3M9LWJvc3gKLQkJOzsKLQlkcHgyKiB8IGRweDIqLWJ1bGwpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MwotCQk7OwotCWVibW9uMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS1lYm1vbgotCQk7OwotCWVseHNpKQotCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCi0JCW9zPS1ic2QKLQkJOzsKLQllbmNvcmUgfCB1bWF4IHwgbW1heCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKLQkJOzsKLQllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgotCQlvcz0tb3NlCi0JCTs7Ci0JZngyODAwKQotCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAotCQk7OwotCWdlbml4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCi0JCTs7Ci0JZ21pY3JvKQotCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JZ28zMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1nbzMyCi0JCTs7Ci0JaDMwNTByKiB8IGhpdXgqKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCWg4MzAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWg4MzAweHJheSkKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS14cmF5Ci0JCTs7Ci0JaDg1MDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaGFycmlzKQotCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCi0JCW9zPS1zeXN2MwotCQk7OwotCWhwMzAwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwMzAwYnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWJzZAotCQk7OwotCWhwMzAwaHB1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCi0JCTs7Ci0JaHA5azNbMi05XVswLTldKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocHBhLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLQlocHBhb3NmKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LW9zZgotCQk7OwotCWhwcHJvKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LXByb2VsZgotCQk7OwotCWkzNzAtaWJtKiB8IGlibSopCi0JCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KLQkJOzsKLSMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPwotCWkqODZ2MzIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjMyCi0JCTs7Ci0JaSo4NnY0KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2NAotCQk7OwotCWkqODZ2KQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YKLQkJOzsKLQlpKjg2c29sMikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCWkzODZtYWNoKQotCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAotCQlvcz0tbWFjaAotCQk7OwotCWkzODYtdnN0YSB8IHZzdGEpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS12c3RhCi0JCTs7Ci0JaXJpcyB8IGlyaXM0ZCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQotCQljYXNlICRvcyBpbgotCQkgICAgLWlyaXgqKQotCQkJOzsKLQkJICAgICopCi0JCQlvcz0taXJpeDQKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQlpc2k2OCB8IGlzaSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQotCQlvcz0tc3lzdgotCQk7OwotCW02OGtub21tdSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbTY4a25vbW11LSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQlvcz0tbGludXgKLQkJOzsKLQltODhrLW9tcm9uKikKLQkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCi0JCTs7Ci0JbWFnbnVtIHwgbTMyMzApCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWVybGluKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKLQkJb3M9LXN5c3YKLQkJOzsKLSAgICAgICAgbWljcm9ibGF6ZSkKLQkJYmFzaWNfbWFjaGluZT1taWNyb2JsYXplLXhpbGlueAotCQk7OwotCW1pbmd3MzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tbWluZ3czMgotCQk7OwotCW1pbmd3MzJjZSkKLQkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgotCQlvcz0tbWluZ3czMmNlCi0JCTs7Ci0JbWluaWZyYW1lKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50Ci0JCTs7Ci0JKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQotCQlvcz0tbWludAotCQk7OwotCW1pcHMzKi0qKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAotCQk7OwotCW1pcHMzKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgotCQk7OwotCW1vbml0b3IpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQltb3JwaG9zKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgotCQlvcz0tbW9ycGhvcwotCQk7OwotCW1zZG9zKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LW1zZG9zCi0JCTs7Ci0JbXMxLSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbXMxLS9tdC0vJ2AKLQkJOzsKLQltdnMpCi0JCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KLQkJb3M9LW12cwotCQk7OwotCW5jcjMwMDApCi0JCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JbmV0YnNkMzg2KQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tbmV0YnNkCi0JCTs7Ci0JbmV0d2luZGVyKQotCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAotCQlvcz0tbGludXgKLQkJOzsKLQluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQotCQliYXNpY19tYWNoaW5lPW02OGstc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmV3czEwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5lY3Y3MCkKLQkJYmFzaWNfbWFjaGluZT12NzAtbmVjCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbmV4dCB8IG0qLW5leHQgKQotCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAotCQljYXNlICRvcyBpbgotCQkgICAgLW5leHRzdGVwKiApCi0JCQk7OwotCQkgICAgLW5zMiopCi0JCSAgICAgIG9zPS1uZXh0c3RlcDIKLQkJCTs7Ci0JCSAgICAqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAzCi0JCQk7OwotCQllc2FjCi0JCTs7Ci0JbmgzMDAwKQotCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCi0JCW9zPS1jeHV4Ci0JCTs7Ci0JbmhbNDVdMDAwKQotCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCi0JCW9zPS1jeHV4Ci0JCTs7Ci0JbmluZHk5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAotCQlvcz0tbmluZHkKLQkJOzsKLQltb245NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAotCQlvcz0tbW9uOTYwCi0JCTs7Ci0Jbm9uc3RvcHV4KQotCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCi0JCW9zPS1ub25zdG9wdXgKLQkJOzsKLQlucDEpCi0JCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCi0JCTs7Ci0gICAgICAgIG5lby10YW5kZW0pCi0JCWJhc2ljX21hY2hpbmU9bmVvLXRhbmRlbQotCQk7OwotICAgICAgICBuc2UtdGFuZGVtKQotCQliYXNpY19tYWNoaW5lPW5zZS10YW5kZW0KLQkJOzsKLQluc3ItdGFuZGVtKQotCQliYXNpY19tYWNoaW5lPW5zci10YW5kZW0KLQkJOzsKLQlvcDUwbi0qIHwgb3A2MGMtKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0Jb3BlbnJpc2MgfCBvcGVucmlzYy0qKQotCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgotCQk7OwotCW9zNDAwKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCi0JCW9zPS1vczQwMAotCQk7OwotCU9TRTY4MDAwIHwgb3NlNjgwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlvczY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKLQkJb3M9LW9zNjhrCi0JCTs7Ci0JcGEtaGl0YWNoaSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQlwYXJhZ29uKQotCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKLQkJb3M9LW9zZgotCQk7OwotCXBhcmlzYykKLQkJYmFzaWNfbWFjaGluZT1ocHBhLXVua25vd24KLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JcGFyaXNjLSopCi0JCWJhc2ljX21hY2hpbmU9aHBwYS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQlvcz0tbGludXgKLQkJOzsKLQlwYmQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCi0JCTs7Ci0JcGJiKQotCQliYXNpY19tYWNoaW5lPW02OGstdHRpCi0JCTs7Ci0JcGM1MzIgfCBwYzUzMi0qKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCi0JCTs7Ci0JcGM5OCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCTs7Ci0JcGM5OC0qKQotCQliYXNpY19tYWNoaW5lPWkzODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4Z2VuIHwgdmlhYzMpCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1wYwotCQk7OwotCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYgfCBhdGhsb24gfCBhdGhsb25fKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCTs7Ci0JcGVudGl1bWlpIHwgcGVudGl1bTIgfCBwZW50aXVtaWlpIHwgcGVudGl1bTMpCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQk7OwotCXBlbnRpdW00KQotCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKLQkJOzsKLQlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhnZW4tKiB8IHZpYWMzLSopCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bWlpLSogfCBwZW50aXVtMi0qIHwgcGVudGl1bWlpaS0qIHwgcGVudGl1bTMtKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bTQtKikKLQkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcG4pCi0JCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKLQkJOzsKLQlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KLQkJOzsKLQlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JCTs7Ci0JcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCi0JCTs7Ci0JcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgotCQk7OwotCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCi0JCTs7Ci0JcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwczIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KLQkJOzsKLQlwdzMyKQotCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgotCQlvcz0tcHczMgotCQk7OwotCXJkb3MpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tcmRvcwotCQk7OwotCXJvbTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4awotCQlvcz0tY29mZgotCQk7OwotCXJtWzQ2XTAwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucwotCQk7OwotCXJ0cGMgfCBydHBjLSopCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlzMzkwIHwgczM5MC0qKQotCQliYXNpY19tYWNoaW5lPXMzOTAtaWJtCi0JCTs7Ci0JczM5MHggfCBzMzkweC0qKQotCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQotCQk7OwotCXNhMjkyMDApCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXNiMSkKLQkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjEtdW5rbm93bgotCQk7OwotCXNiMWVsKQotCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMWVsLXVua25vd24KLQkJOzsKLQlzZGUpCi0JCWJhc2ljX21hY2hpbmU9bWlwc2lzYTMyLXNkZQotCQlvcz0tZWxmCi0JCTs7Ci0Jc2VpKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2VpCi0JCW9zPS1zZWl1eAotCQk7OwotCXNlcXVlbnQpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCTs7Ci0Jc2gpCi0JCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0Jc2g1ZWwpCi0JCWJhc2ljX21hY2hpbmU9c2g1bGUtdW5rbm93bgotCQk7OwotCXNoNjQpCi0JCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCi0JCTs7Ci0Jc3BhcmNsaXRlLXdycyB8IHNpbXNvLXdycykKLQkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jc3BzNykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YyCi0JCTs7Ci0Jc3B1cikKLQkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KLQkJOzsKLQlzdDIwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KLQkJOzsKLQlzdHJhdHVzKQotCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cwotCQlvcz0tc3lzdjQKLQkJOzsKLQlzdW4yKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJOzsKLQlzdW4yb3MzKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjJvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuM29zMykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuM29zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNG9zMykKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjRvczQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40c29sMikKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0Jc3VuMyB8IHN1bjMtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQk7OwotCXN1bjQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0Jc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KLQkJOzsKLQlzdjEpCi0JCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXN5bW1ldHJ5KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQl0M2UpCi0JCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdDkwKQotCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLSAgICAgICAgIyBUaGlzIG11c3QgYmUgbWF0Y2hlZCBiZWZvcmUgdGlsZSouCi0gICAgICAgIHRpbGVneCopCi0JCWJhc2ljX21hY2hpbmU9dGlsZWd4LXVua25vd24KLQkJb3M9LWxpbnV4LWdudQotCQk7OwotCXRpbGUqKQotCQliYXNpY19tYWNoaW5lPXRpbGUtdW5rbm93bgotCQlvcz0tbGludXgtZ251Ci0JCTs7Ci0JdHgzOSkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCi0JCTs7Ci0JdHgzOWVsKQotCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgotCQk7OwotCXRvYWQxKQotCQliYXNpY19tYWNoaW5lPXBkcDEwLXhrbAotCQlvcz0tdG9wczIwCi0JCTs7Ci0JdG93ZXIgfCB0b3dlci0zMikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5jcgotCQk7OwotCXRwZikKLQkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KLQkJb3M9LXRwZgotCQk7OwotCXVkaTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0JdWx0cmEzKQotCQliYXNpY19tYWNoaW5lPWEyOWstbnl1Ci0JCW9zPS1zeW0xCi0JCTs7Ci0JdjgxMCB8IG5lY3Y4MTApCi0JCWJhc2ljX21hY2hpbmU9djgxMC1uZWMKLQkJb3M9LW5vbmUKLQkJOzsKLQl2YXh2KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQl2bXMpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tdm1zCi0JCTs7Ci0JdnBwKnx2eHx2eC0qKQotCQliYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQotCQk7OwotCXZ4d29ya3M5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0JdzY1KikKLQkJYmFzaWNfbWFjaGluZT13NjUtd2RjCi0JCW9zPS1ub25lCi0JCTs7Ci0Jdzg5ay0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JeGJveCkKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCW9zPS1taW5ndzMyCi0JCTs7Ci0JeHBzIHwgeHBzMTAwKQotCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKLQkJOzsKLQl5bXApCi0JCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXo4ay0qLWNvZmYpCi0JCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KLQkJb3M9LXNpbQotCQk7OwotCXo4MC0qLWNvZmYpCi0JCWJhc2ljX21hY2hpbmU9ejgwLXVua25vd24KLQkJb3M9LXNpbQotCQk7OwotCW5vbmUpCi0JCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCi0JCW9zPS1ub25lCi0JCTs7Ci0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KLSMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KLQl3ODlrKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQk7OwotCW9wNTBuKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0Jb3A2MGMpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQlyb21wKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JbW1peCkKLQkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCi0JCTs7Ci0JcnM2MDAwKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQl2YXgpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQk7OwotCXBkcDEwKQotCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0Ci0JCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgotCQk7OwotCXBkcDExKQotCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYwotCQk7OwotCXdlMzJrKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCXNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzM0XWViIHwgc2hbMTIzNF1sZSB8IHNoWzIzXWVsZSkKLQkJYmFzaWNfbWFjaGluZT1zaC11bmtub3duCi0JCTs7Ci0Jc3BhcmMgfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0JY3lkcmEpCi0JCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQotCQk7OwotCW9yaW9uKQotCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAotCQk7OwotCW9yaW9uMTA1KQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCi0JCTs7Ci0JbWFjIHwgbXB3IHwgbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCTs7Ci0JcG1hYyB8IHBtYWMtbXB3KQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKLQkJOzsKLQkqLXVua25vd24pCi0JCSMgTWFrZSBzdXJlIHRvIG1hdGNoIGFuIGFscmVhZHktY2Fub25pY2FsaXplZCBtYWNoaW5lIG5hbWUuCi0JCTs7Ci0JKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotCi0jIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWRpZ2l0YWwqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKLQkJOzsKLQkqLWNvbW1vZG9yZSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCi0JCTs7Ci0JKikKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLWlmIFsgeCIkb3MiICE9IHgiIiBdCi10aGVuCi1jYXNlICRvcyBpbgotICAgICAgICAjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcwotICAgICAgICAjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgotCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgotICAgICAgICAtYXVyb3JhdXgpCi0JICAgICAgICBvcz0tYXVyb3JhdXgKLQkJOzsKLQktc29sYXJpczEgfCAtc29sYXJpczEuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAotCQk7OwotCS1zb2xhcmlzKQotCQlvcz0tc29sYXJpczIKLQkJOzsKLQktc3ZyNCopCi0JCW9zPS1zeXN2NAotCQk7OwotCS11bml4d2FyZSopCi0JCW9zPS1zeXN2NC4ydXcKLQkJOzsKLQktZ251L2xpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgotCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCi0JIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KLQkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCi0JLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAotCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLWNuayogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKLQkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLWF1cm9yYXV4KiB8IC1zb2xhcmlzKiBcCi0JICAgICAgfCAtc3ltKiB8IC1rb3BlbnNvbGFyaXMqIFwKLQkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKLQkgICAgICB8IC1hb3MqIHwgLWFyb3MqIFwKLQkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAotCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAotCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbWlyYnNkKiB8IC1uZXRic2QqIFwKLQkgICAgICB8IC1vcGVuYnNkKiB8IC1zb2xpZGJzZCogXAotCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAotCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKLQkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCi0JICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCi0JICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogfCAtY2VnY2MqIFwKLQkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC1saW51eC1hbmRyb2lkKiBcCi0JICAgICAgfCAtbGludXgtbmV3bGliKiB8IC1saW51eC11Y2xpYmMqIFwKLQkgICAgICB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCi0JICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtbWtzKiB8IC1yaGFwc29keSogfCAtZGFyd2luKiB8IC1vcGVuZWQqIFwKLQkgICAgICB8IC1vcGVuc3RlcCogfCAtb3NraXQqIHwgLWNvbml4KiB8IC1wdzMyKiB8IC1ub25zdG9wdXgqIFwKLQkgICAgICB8IC1zdG9ybS1jaGFvcyogfCAtdG9wczEwKiB8IC10ZW5leCogfCAtdG9wczIwKiB8IC1pdHMqIFwKLQkgICAgICB8IC1vczIqIHwgLXZvcyogfCAtcGFsbW9zKiB8IC11Y2xpbnV4KiB8IC1udWNsZXVzKiBcCi0JICAgICAgfCAtbW9ycGhvcyogfCAtc3VwZXJ1eCogfCAtcnRtayogfCAtcnRtay1ub3ZhKiB8IC13aW5kaXNzKiBcCi0JICAgICAgfCAtcG93ZXJtYXgqIHwgLWRuaXgqIHwgLW54NiB8IC1ueDcgfCAtc2VpKiB8IC1kcmFnb25mbHkqIFwKLQkgICAgICB8IC1za3lvcyogfCAtaGFpa3UqIHwgLXJkb3MqIHwgLXRvcHBlcnMqIHwgLWRyb3BzKiB8IC1lcyopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1xbngqKQotCQljYXNlICRiYXNpY19tYWNoaW5lIGluCi0JCSAgICB4ODYtKiB8IGkqODYtKikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LW50byRvcwotCQkJOzsKLQkJZXNhYwotCQk7OwotCS1udG8tcW54KikKLQkJOzsKLQktbnRvKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCi0JCTs7Ci0JLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAotCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKLQkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQotCQk7OwotCS1tYWMqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCi0JCTs7Ci0JLWxpbnV4LWRpZXRsaWJjKQotCQlvcz0tbGludXgtZGlldGxpYmMKLQkJOzsKLQktbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JLXN1bm9zNSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKLQkJOzsKLQktc3Vub3M2KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAotCQk7OwotCS1vcGVuZWQqKQotCQlvcz0tb3BlbmVkaXRpb24KLQkJOzsKLSAgICAgICAgLW9zNDAwKikKLQkJb3M9LW9zNDAwCi0JCTs7Ci0JLXdpbmNlKikKLQkJb3M9LXdpbmNlCi0JCTs7Ci0JLW9zZnJvc2UqKQotCQlvcz0tb3Nmcm9zZQotCQk7OwotCS1vc2YqKQotCQlvcz0tb3NmCi0JCTs7Ci0JLXV0ZWsqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWR5bml4KikKLQkJb3M9LWJzZAotCQk7OwotCS1hY2lzKikKLQkJb3M9LWFvcwotCQk7OwotCS1hdGhlb3MqKQotCQlvcz0tYXRoZW9zCi0JCTs7Ci0JLXN5bGxhYmxlKikKLQkJb3M9LXN5bGxhYmxlCi0JCTs7Ci0JLTM4NmJzZCkKLQkJb3M9LWJzZAotCQk7OwotCS1jdGl4KiB8IC11dHMqKQotCQlvcz0tc3lzdgotCQk7OwotCS1ub3ZhKikKLQkJb3M9LXJ0bWstbm92YQotCQk7OwotCS1uczIgKQotCQlvcz0tbmV4dHN0ZXAyCi0JCTs7Ci0JLW5zayopCi0JCW9zPS1uc2sKLQkJOzsKLQkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCi0JLXNpbml4NS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAotCQk7OwotCS1zaW5peCopCi0JCW9zPS1zeXN2NAotCQk7OwotICAgICAgICAtdHBmKikKLQkJb3M9LXRwZgotCQk7OwotCS10cml0b24qKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktb3NzKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCS1zdnIzKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3lzdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCi0JLXN5c3YqKQotCQk7OwotCS1vc2UqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLWVzMTgwMCopCi0JCW9zPS1vc2UKLQkJOzsKLQkteGVuaXgpCi0JCW9zPS14ZW5peAotCQk7OwotCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCi0JCW9zPS1taW50Ci0JCTs7Ci0JLWFyb3MqKQotCQlvcz0tYXJvcwotCQk7OwotCS1rYW9zKikKLQkJb3M9LWthb3MKLQkJOzsKLQktenZtb2UpCi0JCW9zPS16dm1vZQotCQk7OwotCS1kaWNvcyopCi0JCW9zPS1kaWNvcwotCQk7OwotICAgICAgICAtbmFjbCopCi0JICAgICAgICA7OwotCS1ub25lKQotCQk7OwotCSopCi0JCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgotCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi1lbHNlCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KLSMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCi0jIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKLSMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKLSMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQotIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCi0jIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgotCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0gICAgICAgIHNjb3JlLSopCi0JCW9zPS1lbGYKLQkJOzsKLSAgICAgICAgc3B1LSopCi0JCW9zPS1lbGYKLQkJOzsKLQkqLWFjb3JuKQotCQlvcz0tcmlzY2l4MS4yCi0JCTs7Ci0JYXJtKi1yZWJlbCkKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JYXJtKi1zZW1pKQotCQlvcz0tYW91dAotCQk7OwotICAgICAgICBjNHgtKiB8IHRpYzR4LSopCi0gICAgICAgIAlvcz0tY29mZgotCQk7OwotCXRpYzU0eC0qKQotCQlvcz0tY29mZgotCQk7OwotCXRpYzU1eC0qKQotCQlvcz0tY29mZgotCQk7OwotCXRpYzZ4LSopCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgdGhlICotZGVjIGVudHJ5LgotCXBkcDEwLSopCi0JCW9zPS10b3BzMjAKLQkJOzsKLQlwZHAxMS0qKQotCQlvcz0tbm9uZQotCQk7OwotCSotZGVjIHwgdmF4LSopCi0JCW9zPS11bHRyaXg0LjIKLQkJOzsKLQltNjgqLWFwb2xsbykKLQkJb3M9LWRvbWFpbgotCQk7OwotCWkzODYtc3VuKQotCQlvcz0tc3Vub3M0LjAuMgotCQk7OwotCW02ODAwMC1zdW4pCi0JCW9zPS1zdW5vczMKLQkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCi0JCSMgZGVmYXVsdC4KLQkJIyBvcz0tc3Vub3M0Ci0JCTs7Ci0JbTY4Ki1jaXNjbykKLQkJb3M9LWFvdXQKLQkJOzsKLSAgICAgICAgbWVwLSopCi0JCW9zPS1lbGYKLQkJOzsKLQltaXBzKi1jaXNjbykKLQkJb3M9LWVsZgotCQk7OwotCW1pcHMqLSopCi0JCW9zPS1lbGYKLQkJOzsKLQlvcjMyLSopCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KLQkJb3M9LXN5c3YzCi0JCTs7Ci0Jc3BhcmMtKiB8ICotc3VuKQotCQlvcz0tc3Vub3M0LjEuMQotCQk7OwotCSotYmUpCi0JCW9zPS1iZW9zCi0JCTs7Ci0JKi1oYWlrdSkKLQkJb3M9LWhhaWt1Ci0JCTs7Ci0JKi1pYm0pCi0JCW9zPS1haXgKLQkJOzsKLSAgICAJKi1rbnV0aCkKLQkJb3M9LW1taXh3YXJlCi0JCTs7Ci0JKi13ZWMpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLXdpbmJvbmQpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLW9raSkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotaHApCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JKi1oaXRhY2hpKQotCQlvcz0taGl1eAotCQk7OwotCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKLQkJb3M9LXN5c3YKLQkJOzsKLQkqLWNibSkKLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQkqLWRnKQotCQlvcz0tZGd1eAotCQk7OwotCSotZG9scGhpbikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JbTY4ay1jY3VyKQotCQlvcz0tcnR1Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCW9zPS1sdW5hCi0JCTs7Ci0JKi1uZXh0ICkKLQkJb3M9LW5leHRzdGVwCi0JCTs7Ci0JKi1zZXF1ZW50KQotCQlvcz0tcHR4Ci0JCTs7Ci0JKi1jcmRzKQotCQlvcz0tdW5vcwotCQk7OwotCSotbnMpCi0JCW9zPS1nZW5peAotCQk7OwotCWkzNzAtKikKLQkJb3M9LW12cwotCQk7OwotCSotbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotCSotZ291bGQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JKi1oaWdobGV2ZWwpCi0JCW9zPS1ic2QKLQkJOzsKLQkqLWVuY29yZSkKLQkJb3M9LWJzZAotCQk7OwotCSotc2dpKQotCQlvcz0taXJpeAotCQk7OwotCSotc2llbWVucykKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JKi1tYXNzY29tcCkKLQkJb3M9LXJ0dQotCQk7OwotCWYzMFswMV0tZnVqaXRzdSB8IGY3MDAtZnVqaXRzdSkKLQkJb3M9LXV4cHYKLQkJOzsKLQkqLXJvbTY4aykKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLSpidWcpCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi1hcHBsZSkKLQkJb3M9LW1hY29zCi0JCTs7Ci0JKi1hdGFyaSopCi0JCW9zPS1taW50Ci0JCTs7Ci0JKikKLQkJb3M9LW5vbmUKLQkJOzsKLWVzYWMKLWZpCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCi0jIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgotdmVuZG9yPXVua25vd24KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLXVua25vd24pCi0JCWNhc2UgJG9zIGluCi0JCQktcmlzY2l4KikKLQkJCQl2ZW5kb3I9YWNvcm4KLQkJCQk7OwotCQkJLXN1bm9zKikKLQkJCQl2ZW5kb3I9c3VuCi0JCQkJOzsKLQkJCS1jbmsqfC1haXgqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLWJlb3MqKQotCQkJCXZlbmRvcj1iZQotCQkJCTs7Ci0JCQktaHB1eCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1tcGVpeCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1oaXV4KikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktdW5vcyopCi0JCQkJdmVuZG9yPWNyZHMKLQkJCQk7OwotCQkJLWRndXgqKQotCQkJCXZlbmRvcj1kZwotCQkJCTs7Ci0JCQktbHVuYSopCi0JCQkJdmVuZG9yPW9tcm9uCi0JCQkJOzsKLQkJCS1nZW5peCopCi0JCQkJdmVuZG9yPW5zCi0JCQkJOzsKLQkJCS1tdnMqIHwgLW9wZW5lZCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktb3M0MDAqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLXB0eCopCi0JCQkJdmVuZG9yPXNlcXVlbnQKLQkJCQk7OwotCQkJLXRwZiopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktdnhzaW0qIHwgLXZ4d29ya3MqIHwgLXdpbmRpc3MqKQotCQkJCXZlbmRvcj13cnMKLQkJCQk7OwotCQkJLWF1eCopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJCS1obXMqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS1tcHcqIHwgLW1hY29zKikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKLQkJCQl2ZW5kb3I9YXRhcmkKLQkJCQk7OwotCQkJLXZvcyopCi0JCQkJdmVuZG9yPXN0cmF0dXMKLQkJCQk7OwotCQllc2FjCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCi0JCTs7Ci1lc2FjCi0KLWVjaG8gJGJhc2ljX21hY2hpbmUkb3MKLWV4aXQKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDJkODUwLi4wMDAwMDAwCi0tLSBhL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDE3NTY5ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgRnJvbSBjb25maWd1cmUuYWMgUmV2aXNpb246IDEuNDgwIC4KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY4IGZvciBPcGVuU1NIIFBvcnRhYmxlLgotIwotIyBSZXBvcnQgYnVncyB0byA8b3BlbnNzaC11bml4LWRldkBtaW5kcm90Lm9yZz4uCi0jCi0jCi0jIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLSMgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4KLSMKLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi0jIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICMoCi0gICpwb3NpeCopIDoKLSAgICBzZXQgLW8gcG9zaXggOzsgIygKLSAgKikgOgotICAgICA7OwotZXNhYwotZmkKLQotCi1hc19ubD0nCi0nCi1leHBvcnQgYXNfbmwKLSMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCi1hc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJwotYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCi1hc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobwotIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCi0jIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgotaWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAotICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCi0gIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJwotZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19lY2hvPSdwcmludGYgJXNcbicKLSAgYXNfZWNob19uPSdwcmludGYgJXMnCi1lbHNlCi0gIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgotICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCi0gICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJwotICBlbHNlCi0gICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKLSAgICBhc19lY2hvX25fYm9keT0nZXZhbAotICAgICAgYXJnPSQxOwotICAgICAgY2FzZSAkYXJnIGluICMoCi0gICAgICAqIiRhc19ubCIqKQotCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOwotCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7Ci0gICAgICBlc2FjOwotICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgotICAgICcKLSAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKLSAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJwotICBmaQotICBleHBvcnQgYXNfZWNob19ib2R5Ci0gIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKLWZpCi0KLSMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgotaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgUEFUSF9TRVBBUkFUT1I9OgotICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7Ci0gICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKLSAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICB9Ci1maQotCi0KLSMgSUZTCi0jIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcwotIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCi0jIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKLSMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKLUlGUz0iICIiCSRhc19ubCIKLQotIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KLWFzX215c2VsZj0KLWNhc2UgJDAgaW4gIygoCi0gICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKLSAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICAgICA7OwotZXNhYwotIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJwotIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCi1pZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCi0gIGFzX215c2VsZj0kMAotZmkKLWlmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KLSAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKLSAgZXhpdCAxCi1maQotCi0jIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCi0jIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCi0jIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCi0jIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgotZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAotZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKLSAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6Ci1kb25lCi1QUzE9JyQgJwotUFMyPSc+ICcKLVBTND0nKyAnCi0KLSMgTkxTIG51aXNhbmNlcy4KLUxDX0FMTD1DCi1leHBvcnQgTENfQUxMCi1MQU5HVUFHRT1DCi1leHBvcnQgTEFOR1VBR0UKLQotIyBDRFBBVEguCi0odW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICi0KLWlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KLSAgYXNfYm91cm5lX2NvbXBhdGlibGU9ImlmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiAjKAotICAqcG9zaXgqKSA6Ci0gICAgc2V0IC1vIHBvc2l4IDs7ICMoCi0gICopIDoKLSAgICAgOzsKLWVzYWMKLWZpCi0iCi0gIGFzX3JlcXVpcmVkPSJhc19mbl9yZXR1cm4gKCkgeyAoZXhpdCBcJDEpOyB9Ci1hc19mbl9zdWNjZXNzICgpIHsgYXNfZm5fcmV0dXJuIDA7IH0KLWFzX2ZuX2ZhaWx1cmUgKCkgeyBhc19mbl9yZXR1cm4gMTsgfQotYXNfZm5fcmV0X3N1Y2Nlc3MgKCkgeyByZXR1cm4gMDsgfQotYXNfZm5fcmV0X2ZhaWx1cmUgKCkgeyByZXR1cm4gMTsgfQotCi1leGl0Y29kZT0wCi1hc19mbl9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9zdWNjZXNzIGZhaWxlZC47IH0KLWFzX2ZuX2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQotYXNfZm5fcmV0X3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9zdWNjZXNzIGZhaWxlZC47IH0KLWFzX2ZuX3JldF9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfZmFpbHVyZSBzdWNjZWVkZWQuOyB9Ci1pZiAoIHNldCB4OyBhc19mbl9yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbiA6Ci0KLWVsc2UKLSAgZXhpdGNvZGU9MTsgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotdGVzdCB4XCRleGl0Y29kZSA9IHgwIHx8IGV4aXQgMSIKLSAgYXNfc3VnZ2VzdGVkPSIgIGFzX2xpbmVub18xPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMWE9XCRMSU5FTk8KLSAgYXNfbGluZW5vXzI9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18yYT1cJExJTkVOTwotICBldmFsICd0ZXN0IFwieFwkYXNfbGluZW5vXzEnXCRhc19ydW4nXCIgIT0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIiAmJgotICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xJ1wkYXNfcnVuJyArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIicgfHwgZXhpdCAxCi10ZXN0IFwkKCggMSArIDEgKSkgPSAyIHx8IGV4aXQgMSIKLSAgaWYgKGV2YWwgIiRhc19yZXF1aXJlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLWVsc2UKLSAgYXNfaGF2ZV9yZXF1aXJlZD1ubwotZmkKLSAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4eWVzICYmIChldmFsICIkYXNfc3VnZ2VzdGVkIikgMj4vZGV2L251bGw7IHRoZW4gOgotCi1lbHNlCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWFzX2ZvdW5kPWZhbHNlCi1mb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGFzX2ZvdW5kPToKLSAgY2FzZSAkYXNfZGlyIGluICMoCi0JIC8qKQotCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KLQkgICAgICMgVHJ5IG9ubHkgc2hlbGxzIHRoYXQgZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KLQkgICAgIGFzX3NoZWxsPSRhc19kaXIvJGFzX2Jhc2UKLQkgICAgIGlmIHsgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgotCQkgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgotICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCi0JCSAgIGlmIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3N1Z2dlc3RlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGJyZWFrIDIKLWZpCi1maQotCSAgIGRvbmU7OwotICAgICAgIGVzYWMKLSAgYXNfZm91bmQ9ZmFsc2UKLWRvbmUKLSRhc19mb3VuZCB8fCB7IGlmIHsgdGVzdCAtZiAiJFNIRUxMIiB8fCB0ZXN0IC1mICIkU0hFTEwuZXhlIjsgfSAmJgotCSAgICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkU0hFTEwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgQ09ORklHX1NIRUxMPSRTSEVMTCBhc19oYXZlX3JlcXVpcmVkPXllcwotZmk7IH0KLUlGUz0kYXNfc2F2ZV9JRlMKLQotCi0gICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbiA6Ci0gICMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCi0JIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KLQkjIHdvcmtzIGFyb3VuZCBzaGVsbHMgdGhhdCBjYW5ub3QgdW5zZXQgbm9uZXhpc3RlbnQgdmFyaWFibGVzLgotCSMgUHJlc2VydmUgLXYgYW5kIC14IHRvIHRoZSByZXBsYWNlbWVudCBzaGVsbC4KLQlCQVNIX0VOVj0vZGV2L251bGwKLQlFTlY9L2Rldi9udWxsCi0JKHVuc2V0IEJBU0hfRU5WKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQkFTSF9FTlYgRU5WCi0JZXhwb3J0IENPTkZJR19TSEVMTAotCWNhc2UgJC0gaW4gIyAoKCgoCi0JICAqdip4KiB8ICp4KnYqICkgYXNfb3B0cz0tdnggOzsKLQkgICp2KiApIGFzX29wdHM9LXYgOzsKLQkgICp4KiApIGFzX29wdHM9LXggOzsKLQkgICogKSBhc19vcHRzPSA7OwotCWVzYWMKLQlleGVjICIkQ09ORklHX1NIRUxMIiAkYXNfb3B0cyAiJGFzX215c2VsZiIgJHsxKyIkQCJ9Ci1maQotCi0gICAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4bm87IHRoZW4gOgotICAkYXNfZWNobyAiJDA6IFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwiCi0gICRhc19lY2hvICIkMDogdGhlIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uIgotICBpZiB0ZXN0IHgke1pTSF9WRVJTSU9OK3NldH0gPSB4c2V0IDsgdGhlbgotICAgICRhc19lY2hvICIkMDogSW4gcGFydGljdWxhciwgenNoICRaU0hfVkVSU0lPTiBoYXMgYnVncyBhbmQgc2hvdWxkIgotICAgICRhc19lY2hvICIkMDogYmUgdXBncmFkZWQgdG8genNoIDQuMy40IG9yIGxhdGVyLiIKLSAgZWxzZQotICAgICRhc19lY2hvICIkMDogUGxlYXNlIHRlbGwgYnVnLWF1dG9jb25mQGdudS5vcmcgYW5kCi0kMDogb3BlbnNzaC11bml4LWRldkBtaW5kcm90Lm9yZyBhYm91dCB5b3VyIHN5c3RlbSwKLSQwOiBpbmNsdWRpbmcgYW55IGVycm9yIHBvc3NpYmx5IG91dHB1dCBiZWZvcmUgdGhpcwotJDA6IG1lc3NhZ2UuIFRoZW4gaW5zdGFsbCBhIG1vZGVybiBzaGVsbCwgb3IgbWFudWFsbHkgcnVuCi0kMDogdGhlIHNjcmlwdCB1bmRlciBzdWNoIGEgc2hlbGwgaWYgeW91IGRvIGhhdmUgb25lLiIKLSAgZmkKLSAgZXhpdCAxCi1maQotZmkKLWZpCi1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotZXhwb3J0IFNIRUxMCi0jIFVuc2V0IG1vcmUgdmFyaWFibGVzIGtub3duIHRvIGludGVyZmVyZSB3aXRoIGJlaGF2aW9yIG9mIGNvbW1vbiB0b29scy4KLUNMSUNPTE9SX0ZPUkNFPSBHUkVQX09QVElPTlM9Ci11bnNldCBDTElDT0xPUl9GT1JDRSBHUkVQX09QVElPTlMKLQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIFNoZWxsIEZ1bmN0aW9ucy4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyBhc19mbl91bnNldCBWQVIKLSMgLS0tLS0tLS0tLS0tLS0tCi0jIFBvcnRhYmx5IHVuc2V0IFZBUi4KLWFzX2ZuX3Vuc2V0ICgpCi17Ci0gIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KLX0KLWFzX3Vuc2V0PWFzX2ZuX3Vuc2V0Ci0KLSMgYXNfZm5fc2V0X3N0YXR1cyBTVEFUVVMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2V0ICQ/IHRvIFNUQVRVUywgd2l0aG91dCBmb3JraW5nLgotYXNfZm5fc2V0X3N0YXR1cyAoKQotewotICByZXR1cm4gJDEKLX0gIyBhc19mbl9zZXRfc3RhdHVzCi0KLSMgYXNfZm5fZXhpdCBTVEFUVVMKLSMgLS0tLS0tLS0tLS0tLS0tLS0KLSMgRXhpdCB0aGUgc2hlbGwgd2l0aCBTVEFUVVMsIGV2ZW4gaW4gYSAidHJhcCAwIiBvciAic2V0IC1lIiBjb250ZXh0LgotYXNfZm5fZXhpdCAoKQotewotICBzZXQgK2UKLSAgYXNfZm5fc2V0X3N0YXR1cyAkMQotICBleGl0ICQxCi19ICMgYXNfZm5fZXhpdAotCi0jIGFzX2ZuX21rZGlyX3AKLSMgLS0tLS0tLS0tLS0tLQotIyBDcmVhdGUgIiRhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCi1hc19mbl9ta2Rpcl9wICgpCi17Ci0KLSAgY2FzZSAkYXNfZGlyIGluICMoCi0gIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKLSAgZXNhYwotICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKLSAgICBhc19kaXJzPQotICAgIHdoaWxlIDo7IGRvCi0gICAgICBjYXNlICRhc19kaXIgaW4gIygKLSAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAotICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKLSAgICAgIGVzYWMKLSAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCi0gICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAotJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJGFzX2RpciIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawotICAgIGRvbmUKLSAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCi0gIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCi0KLQotfSAjIGFzX2ZuX21rZGlyX3AKLSMgYXNfZm5fYXBwZW5kIFZBUiBWQUxVRQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEFwcGVuZCB0aGUgdGV4dCBpbiBWQUxVRSB0byB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiBWQVIuIFRha2UKLSMgYWR2YW50YWdlIG9mIGFueSBzaGVsbCBvcHRpbWl6YXRpb25zIHRoYXQgYWxsb3cgYW1vcnRpemVkIGxpbmVhciBncm93dGggb3ZlcgotIyByZXBlYXRlZCBhcHBlbmRzLCBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHF1YWRyYXRpYyBncm93dGggcHJlc2VudCBpbiBuYWl2ZQotIyBpbXBsZW1lbnRhdGlvbnMuCi1pZiAoZXZhbCAiYXNfdmFyPTE7IGFzX3Zhcis9MjsgdGVzdCB4XCRhc192YXIgPSB4MTIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGV2YWwgJ2FzX2ZuX2FwcGVuZCAoKQotICB7Ci0gICAgZXZhbCAkMSs9XCQyCi0gIH0nCi1lbHNlCi0gIGFzX2ZuX2FwcGVuZCAoKQotICB7Ci0gICAgZXZhbCAkMT1cJCQxXCQyCi0gIH0KLWZpICMgYXNfZm5fYXBwZW5kCi0KLSMgYXNfZm5fYXJpdGggQVJHLi4uCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBQZXJmb3JtIGFyaXRobWV0aWMgZXZhbHVhdGlvbiBvbiB0aGUgQVJHcywgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlCi0jIGdsb2JhbCAkYXNfdmFsLiBUYWtlIGFkdmFudGFnZSBvZiBzaGVsbHMgdGhhdCBjYW4gYXZvaWQgZm9ya3MuIFRoZSBhcmd1bWVudHMKLSMgbXVzdCBiZSBwb3J0YWJsZSBhY3Jvc3MgJCgoKSkgYW5kIGV4cHIuCi1pZiAoZXZhbCAidGVzdCBcJCgoIDEgKyAxICkpID0gMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKLSAgZXZhbCAnYXNfZm5fYXJpdGggKCkKLSAgewotICAgIGFzX3ZhbD0kKCggJCogKSkKLSAgfScKLWVsc2UKLSAgYXNfZm5fYXJpdGggKCkKLSAgewotICAgIGFzX3ZhbD1gZXhwciAiJEAiIHx8IHRlc3QgJD8gLWVxIDFgCi0gIH0KLWZpICMgYXNfZm5fYXJpdGgKLQotCi0jIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKLSMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQotIyBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KLWFzX2ZuX2Vycm9yICgpCi17Ci0gIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCi0gIGlmIHRlc3QgIiQ0IjsgdGhlbgotICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKLSAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCi19ICMgYXNfZm5fZXJyb3IKLQotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi1pZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfZGlybmFtZT1kaXJuYW1lCi1lbHNlCi0gIGFzX2Rpcm5hbWU9ZmFsc2UKLWZpCi0KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYLyIkMCIgfAotICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLQotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLQotICBhc19saW5lbm9fMT0kTElORU5PIGFzX2xpbmVub18xYT0kTElORU5PCi0gIGFzX2xpbmVub18yPSRMSU5FTk8gYXNfbGluZW5vXzJhPSRMSU5FTk8KLSAgZXZhbCAndGVzdCAieCRhc19saW5lbm9fMSckYXNfcnVuJyIgIT0gIngkYXNfbGluZW5vXzInJGFzX3J1biciICYmCi0gIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEnJGFzX3J1bicgKyAxYCIgPSAieCRhc19saW5lbm9fMickYXNfcnVuJyInIHx8IHsKLSAgIyBCbGFtZSBMZWUgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCi0gIHNlZCAtbiAnCi0gICAgcAotICAgIC9bJF1MSU5FTk8vPQotICAnIDwkYXNfbXlzZWxmIHwKLSAgICBzZWQgJwotICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KLSAgICAgIHQgbGluZW5vCi0gICAgICBiCi0gICAgICA6bGluZW5vCi0gICAgICBOCi0gICAgICA6bG9vcAotICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCi0gICAgICB0IGxvb3AKLSAgICAgIHMvLVxuLiovLwotICAgICcgPiRhc19tZS5saW5lbm8gJiYKLSAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMjsgYXNfZm5fZXhpdCAxOyB9Ci0KLSAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKLSAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCi0gICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCi0gIC4gIi4vJGFzX21lLmxpbmVubyIKLSAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCi0gIGV4aXQKLX0KLQotRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KLWNhc2UgYGVjaG8gLW4geGAgaW4gIygoKCgoCi0tbiopCi0gIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgotICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KLSAgeHkpICBFQ0hPX0M9J1xjJzs7Ci0gICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKLSAgICAgICBFQ0hPX1Q9JwknOzsKLSAgZXNhYzs7Ci0qKQotICBFQ0hPX049Jy1uJzs7Ci1lc2FjCi0KLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCi1pZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KLSAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQotZWxzZQotICBybSAtZiBjb25mJCQuZGlyCi0gIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKLWZpCi1pZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFzX2xuX3M9J2xuIC1zJwotICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6Ci0gICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KLSAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KLSAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgotICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSAgICAgIGFzX2xuX3M9J2NwIC1wJwotICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFzX2xuX3M9bG4KLSAgZWxzZQotICAgIGFzX2xuX3M9J2NwIC1wJwotICBmaQotZWxzZQotICBhc19sbl9zPSdjcCAtcCcKLWZpCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCi1ybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi0KLWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJwotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQotCi1pZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Rlc3RfeD0ndGVzdCAteCcKLWVsc2UKLSAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYXNfbHNfTF9vcHRpb249TAotICBlbHNlCi0gICAgYXNfbHNfTF9vcHRpb249Ci0gIGZpCi0gIGFzX3Rlc3RfeD0nCi0gICAgZXZhbCBzaCAtYyAnXCcnCi0gICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KLQl0ZXN0IC1kICIkMS8uIjsKLSAgICAgIGVsc2UKLQljYXNlICQxIGluICMoCi0JLSopc2V0ICIuLyQxIjs7Ci0JZXNhYzsKLQljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbiAjKCgKLQk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCi0gICAgJ1wnJyBzaAotICAnCi1maQotYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi1hc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0KLXRlc3QgLW4gIiRESkRJUiIgfHwgZXhlYyA3PCYwIDwvZGV2L251bGwKLWV4ZWMgNj4mMQotCi0jIE5hbWUgb2YgdGhlIGhvc3QuCi0jIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBvbGQgR05VL0xpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCi0jIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KLWFjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotCi0jCi0jIEluaXRpYWxpemF0aW9ucy4KLSMKLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLWFjX2NsZWFuX2ZpbGVzPQotYWNfY29uZmlnX2xpYm9ial9kaXI9LgotTElCT0JKUz0KLWNyb3NzX2NvbXBpbGluZz1ubwotc3ViZGlycz0KLU1GTEFHUz0KLU1BS0VGTEFHUz0KLQotIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCi1QQUNLQUdFX05BTUU9J09wZW5TU0gnCi1QQUNLQUdFX1RBUk5BTUU9J29wZW5zc2gnCi1QQUNLQUdFX1ZFUlNJT049J1BvcnRhYmxlJwotUEFDS0FHRV9TVFJJTkc9J09wZW5TU0ggUG9ydGFibGUnCi1QQUNLQUdFX0JVR1JFUE9SVD0nb3BlbnNzaC11bml4LWRldkBtaW5kcm90Lm9yZycKLVBBQ0tBR0VfVVJMPScnCi0KLWFjX3VuaXF1ZV9maWxlPSJzc2guYyIKLSMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KLWFjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotI2lmZGVmIFNURENfSEVBREVSUwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX1NURExJQl9ICi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAotIyAgaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jIGVuZGlmCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9JTlRUWVBFU19ICi0jIGluY2x1ZGUgPGludHR5cGVzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURElOVF9ICi0jIGluY2x1ZGUgPHN0ZGludC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiIKLQotYWNfc3Vic3RfdmFycz0nTFRMSUJPQkpTCi1MSUJPQkpTCi1URVNUX1NTSF9JUFY2Ci1waWRkaXIKLXVzZXJfcGF0aAotbWFuc3ViZGlyCi1NQU5UWVBFCi1YQVVUSF9QQVRICi1TVFJJUF9PUFQKLXhhdXRoX3BhdGgKLVBSSVZTRVBfUEFUSAotS1JCNUNPTkYKLVNTSERMSUJTCi1TU0hMSUJTCi1TU0hfUFJJVlNFUF9VU0VSCi1DT01NRU5UX09VVF9FQ0MKLVRFU1RfU1NIX0VDQwotVEVTVF9TU0hfU0hBMjU2Ci1MSUJFRElUCi1QS0dDT05GSUcKLUxECi1QQVRIX1BBU1NXRF9QUk9HCi1MT0dJTl9QUk9HUkFNX0ZBTExCQUNLCi1TVEFSVFVQX1NDUklQVF9TSEVMTAotTUFLRV9QQUNLQUdFX1NVUFBPUlRFRAotUEFUSF9VU0VSQUREX1BST0cKLVBBVEhfR1JPVVBBRERfUFJPRwotTUFORk1UCi1URVNUX1NIRUxMCi1NQU5ET0MKLU5ST0ZGCi1HUk9GRgotU0gKLVRFU1RfTUlOVVNfU19TSAotRU5UCi1TRUQKLVBFUkwKLUtJTEwKLUNBVAotQVIKLUlOU1RBTExfREFUQQotSU5TVEFMTF9TQ1JJUFQKLUlOU1RBTExfUFJPR1JBTQotUkFOTElCCi1BV0sKLUVHUkVQCi1HUkVQCi1DUFAKLWhvc3Rfb3MKLWhvc3RfdmVuZG9yCi1ob3N0X2NwdQotaG9zdAotYnVpbGRfb3MKLWJ1aWxkX3ZlbmRvcgotYnVpbGRfY3B1Ci1idWlsZAotT0JKRVhUCi1FWEVFWFQKLWFjX2N0X0NDCi1DUFBGTEFHUwotTERGTEFHUwotQ0ZMQUdTCi1DQwotdGFyZ2V0X2FsaWFzCi1ob3N0X2FsaWFzCi1idWlsZF9hbGlhcwotTElCUwotRUNIT19UCi1FQ0hPX04KLUVDSE9fQwotREVGUwotbWFuZGlyCi1sb2NhbGVkaXIKLWxpYmRpcgotcHNkaXIKLXBkZmRpcgotZHZpZGlyCi1odG1sZGlyCi1pbmZvZGlyCi1kb2NkaXIKLW9sZGluY2x1ZGVkaXIKLWluY2x1ZGVkaXIKLWxvY2Fsc3RhdGVkaXIKLXNoYXJlZHN0YXRlZGlyCi1zeXNjb25mZGlyCi1kYXRhZGlyCi1kYXRhcm9vdGRpcgotbGliZXhlY2Rpcgotc2JpbmRpcgotYmluZGlyCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi1wcmVmaXgKLWV4ZWNfcHJlZml4Ci1QQUNLQUdFX1VSTAotUEFDS0FHRV9CVUdSRVBPUlQKLVBBQ0tBR0VfU1RSSU5HCi1QQUNLQUdFX1ZFUlNJT04KLVBBQ0tBR0VfVEFSTkFNRQotUEFDS0FHRV9OQU1FCi1QQVRIX1NFUEFSQVRPUgotU0hFTEwnCi1hY19zdWJzdF9maWxlcz0nJwotYWNfdXNlcl9vcHRzPScKLWVuYWJsZV9vcHRpb25fY2hlY2tpbmcKLWVuYWJsZV9sYXJnZWZpbGUKLXdpdGhfc3RhY2twcm90ZWN0Ci13aXRoX3JwYXRoCi13aXRoX2NmbGFncwotd2l0aF9jcHBmbGFncwotd2l0aF9sZGZsYWdzCi13aXRoX2xpYnMKLXdpdGhfV2Vycm9yCi13aXRoX3NvbGFyaXNfY29udHJhY3RzCi13aXRoX3NvbGFyaXNfcHJvamVjdHMKLXdpdGhfb3Nmc2lhCi13aXRoX3psaWIKLXdpdGhfemxpYl92ZXJzaW9uX2NoZWNrCi13aXRoX3NrZXkKLXdpdGhfdGNwX3dyYXBwZXJzCi13aXRoX2xpYmVkaXQKLXdpdGhfYXVkaXQKLXdpdGhfc3NsX2Rpcgotd2l0aF9vcGVuc3NsX2hlYWRlcl9jaGVjawotd2l0aF9zc2xfZW5naW5lCi13aXRoX3BybmdkX3BvcnQKLXdpdGhfcHJuZ2Rfc29ja2V0Ci13aXRoX3BhbQotd2l0aF9wcml2c2VwX3VzZXIKLXdpdGhfc2FuZGJveAotd2l0aF9zZWxpbnV4Ci13aXRoX2tlcmJlcm9zNQotd2l0aF9wcml2c2VwX3BhdGgKLXdpdGhfeGF1dGgKLWVuYWJsZV9zdHJpcAotd2l0aF9tYWlsZGlyCi13aXRoX21hbnR5cGUKLXdpdGhfbWQ1X3Bhc3N3b3Jkcwotd2l0aF9zaGFkb3cKLXdpdGhfaXBhZGRyX2Rpc3BsYXkKLWVuYWJsZV9ldGNfZGVmYXVsdF9sb2dpbgotd2l0aF9kZWZhdWx0X3BhdGgKLXdpdGhfc3VwZXJ1c2VyX3BhdGgKLXdpdGhfNGluNgotd2l0aF9ic2RfYXV0aAotd2l0aF9waWRfZGlyCi1lbmFibGVfbGFzdGxvZwotZW5hYmxlX3V0bXAKLWVuYWJsZV91dG1weAotZW5hYmxlX3d0bXAKLWVuYWJsZV93dG1weAotZW5hYmxlX2xpYnV0aWwKLWVuYWJsZV9wdXR1dGxpbmUKLWVuYWJsZV9wdXR1dHhsaW5lCi13aXRoX2xhc3Rsb2cKLScKLSAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCi1ob3N0X2FsaWFzCi10YXJnZXRfYWxpYXMKLUNDCi1DRkxBR1MKLUxERkxBR1MKLUxJQlMKLUNQUEZMQUdTCi1DUFAnCi0KLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotYWNfaW5pdF9oZWxwPQotYWNfaW5pdF92ZXJzaW9uPWZhbHNlCi1hY191bnJlY29nbml6ZWRfb3B0cz0KLWFjX3VucmVjb2duaXplZF9zZXA9Ci0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotY2FjaGVfZmlsZT0vZGV2L251bGwKLWV4ZWNfcHJlZml4PU5PTkUKLW5vX2NyZWF0ZT0KLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLQotIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCi0jIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKLSMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4Ci0jIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCi0jIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgotIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCi1kYXRhZGlyPScke2RhdGFyb290ZGlyfScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWRvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKLWluZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCi1odG1sZGlyPScke2RvY2Rpcn0nCi1kdmlkaXI9JyR7ZG9jZGlyfScKLXBkZmRpcj0nJHtkb2NkaXJ9JwotcHNkaXI9JyR7ZG9jZGlyfScKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCi1tYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKLQotYWNfcHJldj0KLWFjX2Rhc2hkYXNoPQotZm9yIGFjX29wdGlvbgotZG8KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICo9PyopIGFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7Ci0gICo9KSAgIGFjX29wdGFyZz0gOzsKLSAgKikgICAgYWNfb3B0YXJnPXllcyA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KLSAgLS0pCi0gICAgYWNfZGFzaGRhc2g9eWVzIDs7Ci0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKLQotICAtLWNvbmZpZy1jYWNoZSB8IC1DKQotICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCi0gICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCi0gIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQotICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKLSAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAotICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKLSAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0iZW5hYmxlXyRhY191c2Vyb3B0IgotIiopIDs7Ci0gICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKLQkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKLSAgICBlc2FjCi0gICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKLQotICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQotICAgIGFjX3ByZXY9ZG9jZGlyIDs7Ci0gIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQotICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKLSAgICBhY19wcmV2PWR2aWRpciA7OwotICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQotICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0iZW5hYmxlXyRhY191c2Vyb3B0IgotIiopIDs7Ci0gICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWVuYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgotCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OwotICAgIGVzYWMKLSAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQotICAgIGFjX2luaXRfaGVscD1sb25nIDs7Ci0gIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKLSAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7Ci0gIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKLSAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKLSAgICBhY19wcmV2PWh0bWxkaXIgOzsKLSAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCi0gIHwgLS1odD0qKQotICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCi0gICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKLSAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKLSAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OwotCi0gIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCi0gICAgYWNfcHJldj1wZGZkaXIgOzsKLSAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKLSAgICBwZGZkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCi0gICAgYWNfcHJldj1wc2RpciA7OwotICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKLSAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9JGFjX29wdGFyZyA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQotICAgIGFjX2luaXRfdmVyc2lvbj06IDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgotICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAotICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKLSAgICBjYXNlICRhY191c2VyX29wdHMgaW4KLSAgICAgICoiCi0id2l0aF8kYWNfdXNlcm9wdCIKLSIqKSA7OwotICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRoLSRhY191c2Vyb3B0X29yaWciCi0JIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7Ci0gICAgZXNhYwotICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKLSAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKLSAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCi0gICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCi0gICAgICAqIgotIndpdGhfJGFjX3VzZXJvcHQiCi0iKikgOzsKLSAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgotCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OwotICAgIGVzYWMKLSAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OwotCi0gIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkYWNfb3B0aW9uJwotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgICA7OwotCi0gICo9KikKLSAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGNhc2UgJGFjX2VudnZhciBpbiAjKAotICAgICAgJycgfCBbMC05XSogfCAqWyFfJGFzX2NyX2FsbnVtXSogKQotICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFyaWFibGUgbmFtZTogXGAkYWNfZW52dmFyJyIgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCi0gICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKLQotICAqKQotICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KLSAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKLSAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKLSAgICA6ICIke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufSIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKLSAgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyI7IHRoZW4KLSAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgotICAgIG5vKSA7OwotICAgIGZhdGFsKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgOzsKLSAgICAqKSAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyIDs7Ci0gIGVzYWMKLWZpCi0KLSMgQ2hlY2sgYWxsIGRpcmVjdG9yeSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5LgotZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCi0JCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAotCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCi0JCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCi1kbwotICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KLSAgY2FzZSAkYWNfdmFsIGluCi0gICAgKi8gKQotICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbXi9dXCknIFx8ICJYJGFjX3ZhbCIgOiAnWFwoLipcKSdgCi0gICAgICBldmFsICRhY192YXI9XCRhY192YWw7OwotICBlc2FjCi0gICMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KLSAgY2FzZSAkYWNfdmFsIGluCi0gICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKLSAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7Ci0gIGVzYWMKLSAgYXNfZm5fZXJyb3IgJD8gImV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiCi1kb25lCi0KLSMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKLSMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgotIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgotYnVpbGQ9JGJ1aWxkX2FsaWFzCi1ob3N0PSRob3N0X2FsaWFzCi10YXJnZXQ9JHRhcmdldF9hbGlhcwotCi0jIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCi1pZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KLSAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCi0gICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaWYgeW91IHdhbnRlZCB0byBzZXQgdGhlIC0tYnVpbGQgdHlwZSwgZG9uJ3QgdXNlIC0taG9zdC4KLSAgICBJZiBhIGNyb3NzIGNvbXBpbGVyIGlzIGRldGVjdGVkIHRoZW4gY3Jvc3MgY29tcGlsZSBtb2RlIHdpbGwgYmUgdXNlZCIgPiYyCi0gIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9eWVzCi0gIGZpCi1maQotCi1hY190b29sX3ByZWZpeD0KLXRlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KLQotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAotCi0KLWFjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgotYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgotYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKLXRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAotICBhc19mbl9lcnJvciAkPyAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgotCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KLSAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19teXNlbGYiIHx8Ci0kYXNfZXhwciBYIiRhc19teXNlbGYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19teXNlbGYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgotICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKLWZpCi1hY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCi1hY19hYnNfY29uZmRpcj1gKAotCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgYXNfZm5fZXJyb3IgJD8gIiRhY19tc2ciCi0JcHdkKWAKLSMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCi1pZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCi0gIHNyY2Rpcj0uCi1maQotIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KLSMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbwotIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCi1jYXNlICRzcmNkaXIgaW4KLSovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OwotZXNhYwotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLSAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQotICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLWRvbmUKLQotIwotIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgotIwotaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KLSAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgY2F0IDw8X0FDRU9GCi1cYGNvbmZpZ3VyZScgY29uZmlndXJlcyBPcGVuU1NIIFBvcnRhYmxlIHRvIGFkYXB0IHRvIG1hbnkga2luZHMgb2Ygc3lzdGVtcy4KLQotVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtWQVI9VkFMVUVdLi4uCi0KLVRvIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4sIENDLCBDRkxBR1MuLi4pLCBzcGVjaWZ5IHRoZW0gYXMKLVZBUj1WQUxVRS4gIFNlZSBiZWxvdyBmb3IgZGVzY3JpcHRpb25zIG9mIHNvbWUgb2YgdGhlIHVzZWZ1bCB2YXJpYWJsZXMuCi0KLURlZmF1bHRzIGZvciB0aGUgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGluIGJyYWNrZXRzLgotCi1Db25maWd1cmF0aW9uOgotICAtaCwgLS1oZWxwICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAotICAgICAgLS1oZWxwPXNob3J0ICAgICAgICBkaXNwbGF5IG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhpcyBwYWNrYWdlCi0gICAgICAtLWhlbHA9cmVjdXJzaXZlICAgIGRpc3BsYXkgdGhlIHNob3J0IGhlbHAgb2YgYWxsIHRoZSBpbmNsdWRlZCBwYWNrYWdlcwotICAtViwgLS12ZXJzaW9uICAgICAgICAgICBkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgLXEsIC0tcXVpZXQsIC0tc2lsZW50ICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcgLi4uJyBtZXNzYWdlcwotICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCi0gIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCi0gIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQotCi1JbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYXQotCi1CeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KLVxgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5Ci1hbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAotZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KLQotRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCi0KLUZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Ci0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCi0gIC0tZGF0YXJvb3RkaXI9RElSICAgICAgIHJlYWQtb25seSBhcmNoLi1pbmRlcGVuZGVudCBkYXRhIHJvb3QgW1BSRUZJWC9zaGFyZV0KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUl0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9pbmZvXQotICAtLWxvY2FsZWRpcj1ESVIgICAgICAgICBsb2NhbGUtZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSL2xvY2FsZV0KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL21hbl0KLSAgLS1kb2NkaXI9RElSICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiByb290IFtEQVRBUk9PVERJUi9kb2Mvb3BlbnNzaF0KLSAgLS1odG1sZGlyPURJUiAgICAgICAgICAgaHRtbCBkb2N1bWVudGF0aW9uIFtET0NESVJdCi0gIC0tZHZpZGlyPURJUiAgICAgICAgICAgIGR2aSBkb2N1bWVudGF0aW9uIFtET0NESVJdCi0gIC0tcGRmZGlyPURJUiAgICAgICAgICAgIHBkZiBkb2N1bWVudGF0aW9uIFtET0NESVJdCi0gIC0tcHNkaXI9RElSICAgICAgICAgICAgIHBzIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KLV9BQ0VPRgotCi0gIGNhdCA8PFxfQUNFT0YKLQotU3lzdGVtIHR5cGVzOgotICAtLWJ1aWxkPUJVSUxEICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtndWVzc2VkXQotICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF0KLV9BQ0VPRgotZmkKLQotaWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KLSAgY2FzZSAkYWNfaW5pdF9oZWxwIGluCi0gICAgIHNob3J0IHwgcmVjdXJzaXZlICkgZWNobyAiQ29uZmlndXJhdGlvbiBvZiBPcGVuU1NIIFBvcnRhYmxlOiI7OwotICAgZXNhYwotICBjYXQgPDxcX0FDRU9GCi0KLU9wdGlvbmFsIEZlYXR1cmVzOgotICAtLWRpc2FibGUtb3B0aW9uLWNoZWNraW5nICBpZ25vcmUgdW5yZWNvZ25pemVkIC0tZW5hYmxlLy0td2l0aCBvcHRpb25zCi0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLWRpc2FibGUtbGFyZ2VmaWxlICAgICBvbWl0IHN1cHBvcnQgZm9yIGxhcmdlIGZpbGVzCi0gIC0tZGlzYWJsZS1zdHJpcCAgICAgICAgIERpc2FibGUgY2FsbGluZyBzdHJpcCgxKSBvbiBpbnN0YWxsCi0gIC0tZGlzYWJsZS1ldGMtZGVmYXVsdC1sb2dpbiBEaXNhYmxlIHVzaW5nIFBBVEggZnJvbSAvZXRjL2RlZmF1bHQvbG9naW4gbm8KLSAgLS1kaXNhYmxlLWxhc3Rsb2cgICAgICAgZGlzYWJsZSB1c2Ugb2YgbGFzdGxvZyBldmVuIGlmIGRldGVjdGVkIG5vCi0gIC0tZGlzYWJsZS11dG1wICAgICAgICAgIGRpc2FibGUgdXNlIG9mIHV0bXAgZXZlbiBpZiBkZXRlY3RlZCBubwotICAtLWRpc2FibGUtdXRtcHggICAgICAgICBkaXNhYmxlIHVzZSBvZiB1dG1weCBldmVuIGlmIGRldGVjdGVkIG5vCi0gIC0tZGlzYWJsZS13dG1wICAgICAgICAgIGRpc2FibGUgdXNlIG9mIHd0bXAgZXZlbiBpZiBkZXRlY3RlZCBubwotICAtLWRpc2FibGUtd3RtcHggICAgICAgICBkaXNhYmxlIHVzZSBvZiB3dG1weCBldmVuIGlmIGRldGVjdGVkIG5vCi0gIC0tZGlzYWJsZS1saWJ1dGlsICAgICAgIGRpc2FibGUgdXNlIG9mIGxpYnV0aWwgKGxvZ2luKCkgZXRjLikgbm8KLSAgLS1kaXNhYmxlLXB1dHV0bGluZSAgICAgZGlzYWJsZSB1c2Ugb2YgcHV0dXRsaW5lKCkgZXRjLiAodXd0bXApIG5vCi0gIC0tZGlzYWJsZS1wdXR1dHhsaW5lICAgIGRpc2FibGUgdXNlIG9mIHB1dHV0eGxpbmUoKSBldGMuICh1d3RtcHgpIG5vCi0KLU9wdGlvbmFsIFBhY2thZ2VzOgotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXdpdGhvdXQtc3RhY2twcm90ZWN0ICBEb24ndCB1c2UgY29tcGlsZXIncyBzdGFjayBwcm90ZWN0aW9uCi0gIC0td2l0aG91dC1ycGF0aCAgICAgICAgIERpc2FibGUgYXV0by1hZGRlZCAtUiBsaW5rZXIgcGF0aHMKLSAgLS13aXRoLWNmbGFncyAgICAgICAgICAgU3BlY2lmeSBhZGRpdGlvbmFsIGZsYWdzIHRvIHBhc3MgdG8gY29tcGlsZXIKLSAgLS13aXRoLWNwcGZsYWdzICAgICAgICAgU3BlY2lmeSBhZGRpdGlvbmFsIGZsYWdzIHRvIHBhc3MgdG8gcHJlcHJvY2Vzc29yCi0gIC0td2l0aC1sZGZsYWdzICAgICAgICAgIFNwZWNpZnkgYWRkaXRpb25hbCBmbGFncyB0byBwYXNzIHRvIGxpbmtlcgotICAtLXdpdGgtbGlicyAgICAgICAgICAgICBTcGVjaWZ5IGFkZGl0aW9uYWwgbGlicmFyaWVzIHRvIGxpbmsgd2l0aAotICAtLXdpdGgtV2Vycm9yICAgICAgICAgICBCdWlsZCBtYWluIGNvZGUgd2l0aCAtV2Vycm9yCi0gIC0td2l0aC1zb2xhcmlzLWNvbnRyYWN0cyBFbmFibGUgU29sYXJpcyBwcm9jZXNzIGNvbnRyYWN0cyAoZXhwZXJpbWVudGFsKQotICAtLXdpdGgtc29sYXJpcy1wcm9qZWN0cyBFbmFibGUgU29sYXJpcyBwcm9qZWN0cyAoZXhwZXJpbWVudGFsKQotICAtLXdpdGgtb3Nmc2lhICAgICAgICAgICBFbmFibGUgRGlnaXRhbCBVbml4IFNJQQotICAtLXdpdGgtemxpYj1QQVRIICAgICAgICBVc2UgemxpYiBpbiBQQVRICi0gIC0td2l0aG91dC16bGliLXZlcnNpb24tY2hlY2sgRGlzYWJsZSB6bGliIHZlcnNpb24gY2hlY2sKLSAgLS13aXRoLXNrZXlbPVBBVEhdICAgICAgRW5hYmxlIFMvS2V5IHN1cHBvcnQgKG9wdGlvbmFsbHkgaW4gUEFUSCkKLSAgLS13aXRoLXRjcC13cmFwcGVyc1s9UEFUSF0gRW5hYmxlIHRjcHdyYXBwZXJzIHN1cHBvcnQgKG9wdGlvbmFsbHkgaW4gUEFUSCkKLSAgLS13aXRoLWxpYmVkaXRbPVBBVEhdICAgRW5hYmxlIGxpYmVkaXQgc3VwcG9ydCBmb3Igc2Z0cAotICAtLXdpdGgtYXVkaXQ9bW9kdWxlICAgICBFbmFibGUgYXVkaXQgc3VwcG9ydCAobW9kdWxlcz1kZWJ1Zyxic20sbGludXgpCi0gIC0td2l0aC1zc2wtZGlyPVBBVEggICAgIFNwZWNpZnkgcGF0aCB0byBPcGVuU1NMIGluc3RhbGxhdGlvbgotICAtLXdpdGhvdXQtb3BlbnNzbC1oZWFkZXItY2hlY2sgRGlzYWJsZSBPcGVuU1NMIHZlcnNpb24gY29uc2lzdGVuY3kgY2hlY2sKLSAgLS13aXRoLXNzbC1lbmdpbmUgICAgICAgRW5hYmxlIE9wZW5TU0wgKGhhcmR3YXJlKSBFTkdJTkUgc3VwcG9ydAotICAtLXdpdGgtcHJuZ2QtcG9ydD1QT1JUICByZWFkIGVudHJvcHkgZnJvbSBQUk5HRC9FR0QgVENQIGxvY2FsaG9zdDpQT1JUCi0gIC0td2l0aC1wcm5nZC1zb2NrZXQ9RklMRSByZWFkIGVudHJvcHkgZnJvbSBQUk5HRC9FR0Qgc29ja2V0IEZJTEUgKGRlZmF1bHQ9L3Zhci9ydW4vZWdkLXBvb2wpCi0gIC0td2l0aC1wYW0gICAgICAgICAgICAgIEVuYWJsZSBQQU0gc3VwcG9ydAotICAtLXdpdGgtcHJpdnNlcC11c2VyPXVzZXIgU3BlY2lmeSBub24tcHJpdmlsZWdlZCB1c2VyIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbgotICAtLXdpdGgtc2FuZGJveD1zdHlsZSAgICBTcGVjaWZ5IHByaXZpbGVnZSBzZXBhcmF0aW9uIHNhbmRib3ggKG5vLCBkYXJ3aW4sIHJsaW1pdCwgc3lzdHJhY2UpCi0gIC0td2l0aC1zZWxpbnV4ICAgICAgICAgIEVuYWJsZSBTRUxpbnV4IHN1cHBvcnQKLSAgLS13aXRoLWtlcmJlcm9zNT1QQVRIICAgRW5hYmxlIEtlcmJlcm9zIDUgc3VwcG9ydAotICAtLXdpdGgtcHJpdnNlcC1wYXRoPXh4eCBQYXRoIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbiBjaHJvb3QgKGRlZmF1bHQ9L3Zhci9lbXB0eSkKLSAgLS13aXRoLXhhdXRoPVBBVEggICAgICAgU3BlY2lmeSBwYXRoIHRvIHhhdXRoIHByb2dyYW0KLSAgLS13aXRoLW1haWxkaXI9L3BhdGgvdG8vbWFpbCAgICBTcGVjaWZ5IHlvdXIgc3lzdGVtIG1haWwgZGlyZWN0b3J5Ci0gIC0td2l0aC1tYW50eXBlPW1hbnxjYXR8ZG9jICBTZXQgbWFuIHBhZ2UgdHlwZQotICAtLXdpdGgtbWQ1LXBhc3N3b3JkcyAgICBFbmFibGUgdXNlIG9mIE1ENSBwYXNzd29yZHMKLSAgLS13aXRob3V0LXNoYWRvdyAgICAgICAgRGlzYWJsZSBzaGFkb3cgcGFzc3dvcmQgc3VwcG9ydAotICAtLXdpdGgtaXBhZGRyLWRpc3BsYXkgICBVc2UgaXAgYWRkcmVzcyBpbnN0ZWFkIG9mIGhvc3RuYW1lIGluIFwkRElTUExBWQotICAtLXdpdGgtZGVmYXVsdC1wYXRoPSAgICBTcGVjaWZ5IGRlZmF1bHQgXCRQQVRIIGVudmlyb25tZW50IGZvciBzZXJ2ZXIKLSAgLS13aXRoLXN1cGVydXNlci1wYXRoPSAgU3BlY2lmeSBkaWZmZXJlbnQgcGF0aCBmb3Igc3VwZXItdXNlcgotICAtLXdpdGgtNGluNiAgICAgICAgICAgICBDaGVjayBmb3IgYW5kIGNvbnZlcnQgSVB2NCBpbiBJUHY2IG1hcHBlZCBhZGRyZXNzZXMKLSAgLS13aXRoLWJzZC1hdXRoICAgICAgICAgRW5hYmxlIEJTRCBhdXRoIHN1cHBvcnQKLSAgLS13aXRoLXBpZC1kaXI9UEFUSCAgICAgU3BlY2lmeSBsb2NhdGlvbiBvZiBzc2gucGlkIGZpbGUKLSAgLS13aXRoLWxhc3Rsb2c9RklMRXxESVIgc3BlY2lmeSBsYXN0bG9nIGxvY2F0aW9uIGNvbW1vbiBsb2NhdGlvbnMKLQotU29tZSBpbmZsdWVudGlhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6Ci0gIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAotICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCi0gIExERkxBR1MgICAgIGxpbmtlciBmbGFncywgZS5nLiAtTDxsaWIgZGlyPiBpZiB5b3UgaGF2ZSBsaWJyYXJpZXMgaW4gYQotICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+Ci0gIExJQlMgICAgICAgIGxpYnJhcmllcyB0byBwYXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KLSAgQ1BQRkxBR1MgICAgKE9iamVjdGl2ZSkgQy9DKysgcHJlcHJvY2Vzc29yIGZsYWdzLCBlLmcuIC1JPGluY2x1ZGUgZGlyPiBpZgotICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KLSAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNzb3IKLQotVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKLWl0IHRvIGZpbmQgbGlicmFyaWVzIGFuZCBwcm9ncmFtcyB3aXRoIG5vbnN0YW5kYXJkIG5hbWVzL2xvY2F0aW9ucy4KLQotUmVwb3J0IGJ1Z3MgdG8gPG9wZW5zc2gtdW5peC1kZXZAbWluZHJvdC5vcmc+LgotX0FDRU9GCi1hY19zdGF0dXM9JD8KLWZpCi0KLWlmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KLSAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KLSAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKLSAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAotICAgICAgeyBjZCAiJHNyY2RpciIgJiYgYWNfcHdkPWBwd2RgICYmIHNyY2Rpcj0uICYmIHRlc3QgLWQgIiRhY19kaXIiOyB9IHx8Ci0gICAgICBjb250aW51ZQotICAgIGFjX2J1aWxkZGlyPS4KLQotY2FzZSAiJGFjX2RpciIgaW4KLS4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotKikKLSAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKLSAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLSAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9Ci0gICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCi0gICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKLSAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgotICAgICAgZWNobyAmJgotICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQotICAgIGVsc2UKLSAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCi0gICAgZmkgfHwgYWNfc3RhdHVzPSQ/Ci0gICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQotICBkb25lCi1maQotCi10ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKLWlmICRhY19pbml0X3ZlcnNpb247IHRoZW4KLSAgY2F0IDw8XF9BQ0VPRgotT3BlblNTSCBjb25maWd1cmUgUG9ydGFibGUKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OAotCi1Db3B5cmlnaHQgKEMpIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1UaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotX0FDRU9GCi0gIGV4aXQKLWZpCi0KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgQXV0b2NvbmYgaW5pdGlhbGl6YXRpb24uICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLQotIyBhY19mbl9jX3RyeV9jb21waWxlIExJTkVOTwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUcnkgdG8gY29tcGlsZSBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9jX3RyeV9jb21waWxlICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX3JldHZhbD0xCi1maQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gIyBhY19mbl9jX3RyeV9jb21waWxlCi0KLSMgYWNfZm5fY190cnlfcnVuIExJTkVOTwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4gQXNzdW1lcwotIyB0aGF0IGV4ZWN1dGFibGVzICpjYW4qIGJlIHJ1bi4KLWFjX2ZuX2NfdHJ5X3J1biAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuIDoKLSAgYWNfcmV0dmFsPTAKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0gICAgICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgICAgICBhY19yZXR2YWw9JGFjX3N0YXR1cwotZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbwotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gIyBhY19mbl9jX3RyeV9ydW4KLQotIyBhY19mbl9jX3RyeV9jcHAgTElORU5PCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVHJ5IHRvIHByZXByb2Nlc3MgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgotYWNfZm5fY190cnlfY3BwICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICBmaQotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSA+IGNvbmZ0ZXN0LmkgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbiA6Ci0gIGFjX3JldHZhbD0wCi1lbHNlCi0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gICAgYWNfcmV0dmFsPTEKLWZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSAjIGFjX2ZuX2NfdHJ5X2NwcAotCi0jIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMgYW5kIGNhbiBiZSBjb21waWxlZCB1c2luZyB0aGUgaW5jbHVkZSBmaWxlcyBpbgotIyBJTkNMVURFUywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgotYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSQ0Ci0jaW5jbHVkZSA8JDI+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgZXZhbCAiJDM9eWVzIgotZWxzZQotICBldmFsICIkMz1ubyIKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ldmFsIGFjX3Jlcz1cJCQzCi0JICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLSRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCi0KLX0gIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlCi0KLSMgYWNfZm5fY19jaGVja19kZWNsIExJTkVOTyBTWU1CT0wgVkFSIElOQ0xVREVTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUZXN0cyB3aGV0aGVyIFNZTUJPTCBpcyBkZWNsYXJlZCBpbiBJTkNMVURFUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIKLSMgYWNjb3JkaW5nbHkuCi1hY19mbl9jX2NoZWNrX2RlY2wgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBhc19kZWNsX25hbWU9YGVjaG8gJDJ8c2VkICdzLyAqKC4qLy8nYAotICBhc19kZWNsX3VzZT1gZWNobyAkMnxzZWQgLWUgJ3MvKC8oKC8nIC1lICdzLykvKSAwJi8nIC1lICdzLywvKSAwJiAoL2cnYAotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJGFzX2RlY2xfbmFtZSBpcyBkZWNsYXJlZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRhc19kZWNsX25hbWUgaXMgZGVjbGFyZWQuLi4gIiA+JjY7IH0KLWlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotaW50Ci1tYWluICgpCi17Ci0jaWZuZGVmICRhc19kZWNsX25hbWUKLSNpZmRlZiBfX2NwbHVzcGx1cwotICAodm9pZCkgJGFzX2RlY2xfdXNlOwotI2Vsc2UKLSAgKHZvaWQpICRhc19kZWNsX25hbWU7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgZXZhbCAiJDM9eWVzIgotZWxzZQotICBldmFsICIkMz1ubyIKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ldmFsIGFjX3Jlcz1cJCQzCi0JICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLSRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCi0KLX0gIyBhY19mbl9jX2NoZWNrX2RlY2wKLQotIyBhY19mbl9jX3RyeV9saW5rIExJTkVOTwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCi1hY19mbl9jX3RyeV9saW5rICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLSAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgewotCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAotCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICAgICAgIH07IHRoZW4gOgotICBhY19yZXR2YWw9MAotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX3JldHZhbD0xCi1maQotICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCi0gICMgY3JlYXRlZCBieSB0aGUgUEdJIGNvbXBpbGVyIChjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vKSwgYXMgaXQgd291bGQKLSAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKLSAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgotICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKLQotfSAjIGFjX2ZuX2NfdHJ5X2xpbmsKLQotIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzLCBnaXZpbmcgYSB3YXJuaW5nIGlmIGl0IGNhbm5vdCBiZSBjb21waWxlZCB1c2luZwotIyB0aGUgaW5jbHVkZSBmaWxlcyBpbiBJTkNMVURFUyBhbmQgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSCi0jIGFjY29yZGluZ2x5LgotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIGlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZmkKLWV2YWwgYWNfcmVzPVwkJDMKLQkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotZWxzZQotICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgdXNhYmlsaXR5IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nICQyIHVzYWJpbGl0eS4uLiAiID4mNjsgfQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJDQKLSNpbmNsdWRlIDwkMj4KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCi1lbHNlCi0gIGFjX2hlYWRlcl9jb21waWxlcj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQotCi0jIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgcHJlc2VuY2UiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgcHJlc2VuY2UuLi4gIiA+JjY7IH0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDwkMj4KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotZWxzZQotICBhY19oZWFkZXJfcHJlcHJvYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9Ci0KLSMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPwotY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAjKCgKLSAgeWVzOm5vOiApCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQotICAgIDs7Ci0gIG5vOnllczoqICkKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KLSggJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIFJlcG9ydCB0aGlzIHRvIG9wZW5zc2gtdW5peC1kZXZAbWluZHJvdC5vcmcgIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMiCi0gICAgICkgfCBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKLSAgICA7OwotZXNhYwotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBldmFsICIkMz1cJGFjX2hlYWRlcl9jb21waWxlciIKLWZpCi1ldmFsIGFjX3Jlcz1cJCQzCi0JICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLSRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KLWZpCi0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19ICMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbAotCi0jIGFjX2ZuX2NfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKLWFjX2ZuX2NfY2hlY2tfZnVuYyAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkMiB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQyLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICQyIGlubm9jdW91c18kMgotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkMiAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkMgotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICQyICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJDIgfHwgZGVmaW5lZCBfX3N0dWJfX18kMgotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkMiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBldmFsICIkMz15ZXMiCi1lbHNlCi0gIGV2YWwgIiQzPW5vIgotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19ICMgYWNfZm5fY19jaGVja19mdW5jCi0KLSMgYWNfZm5fY19jaGVja190eXBlIExJTkVOTyBUWVBFIFZBUiBJTkNMVURFUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRlc3RzIHdoZXRoZXIgVFlQRSBleGlzdHMgYWZ0ZXIgaGF2aW5nIGluY2x1ZGVkIElOQ0xVREVTLCBzZXR0aW5nIGNhY2hlCi0jIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KLWFjX2ZuX2NfY2hlY2tfdHlwZSAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGV2YWwgIiQzPW5vIgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotaW50Ci1tYWluICgpCi17Ci1pZiAoc2l6ZW9mICgkMikpCi0JIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSQ0Ci1pbnQKLW1haW4gKCkKLXsKLWlmIChzaXplb2YgKCgkMikpKQotCSAgICByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotCi1lbHNlCi0gIGV2YWwgIiQzPXllcyIKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ldmFsIGFjX3Jlcz1cJCQzCi0JICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLSRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCi0KLX0gIyBhY19mbl9jX2NoZWNrX3R5cGUKLQotIyBhY19mbl9jX2NvbXB1dGVfaW50IExJTkVOTyBFWFBSIFZBUiBJTkNMVURFUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUcmllcyB0byBmaW5kIHRoZSBjb21waWxlLXRpbWUgdmFsdWUgb2YgRVhQUiBpbiBhIHByb2dyYW0gdGhhdCBpbmNsdWRlcwotIyBJTkNMVURFUywgc2V0dGluZyBWQVIgYWNjb3JkaW5nbHkuIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgY291bGQgYmUKLSMgY29tcHV0ZWQKLWFjX2ZuX2NfY29tcHV0ZV9pbnQgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAgICMgRGVwZW5kaW5nIHVwb24gdGhlIHNpemUsIGNvbXB1dGUgdGhlIGxvIGFuZCBoaSBib3VuZHMuCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpID49IDApXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfbG89MCBhY19taWQ9MAotICB3aGlsZSA6OyBkbwotICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSQ0Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgkMikgPD0gJGFjX21pZCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19oaT0kYWNfbWlkOyBicmVhawotZWxzZQotICBhc19mbl9hcml0aCAkYWNfbWlkICsgMSAmJiBhY19sbz0kYXNfdmFsCi0JCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgotCQkJICBhY19sbz0gYWNfaGk9Ci0JCQkgIGJyZWFrCi0JCQlmaQotCQkJYXNfZm5fYXJpdGggMiAnKicgJGFjX21pZCArIDEgJiYgYWNfbWlkPSRhc192YWwKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgZG9uZQotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpIDwgMCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19oaT0tMSBhY19taWQ9LTEKLSAgd2hpbGUgOjsgZG8KLSAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpID49ICRhY19taWQpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfbG89JGFjX21pZDsgYnJlYWsKLWVsc2UKLSAgYXNfZm5fYXJpdGggJygnICRhY19taWQgJyknIC0gMSAmJiBhY19oaT0kYXNfdmFsCi0JCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgotCQkJICBhY19sbz0gYWNfaGk9Ci0JCQkgIGJyZWFrCi0JCQlmaQotCQkJYXNfZm5fYXJpdGggMiAnKicgJGFjX21pZCAmJiBhY19taWQ9JGFzX3ZhbAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBkb25lCi1lbHNlCi0gIGFjX2xvPSBhY19oaT0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCi13aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCi0gIGFzX2ZuX2FyaXRoICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sbyAmJiBhY19taWQ9JGFzX3ZhbAotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpIDw9ICRhY19taWQpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfaGk9JGFjX21pZAotZWxzZQotICBhc19mbl9hcml0aCAnKCcgJGFjX21pZCAnKScgKyAxICYmIGFjX2xvPSRhc192YWwKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWRvbmUKLWNhc2UgJGFjX2xvIGluICMoKAotPyopIGV2YWwgIiQzPVwkYWNfbG8iOyBhY19yZXR2YWw9MCA7OwotJycpIGFjX3JldHZhbD0xIDs7Ci1lc2FjCi0gIGVsc2UKLSAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gJDI7IH0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAkMjsgfQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci1pbnQKLW1haW4gKCkKLXsKLQotICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOwotICBpZiAoISBmKQotICAgIHJldHVybiAxOwotICBpZiAoKCQyKSA8IDApCi0gICAgewotICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7Ci0gICAgICBpZiAoaSAhPSAoJDIpKQotCXJldHVybiAxOwotICAgICAgZnByaW50ZiAoZiwgIiVsZCIsIGkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKLSAgICAgIGlmIChpICE9ICgkMikpCi0JcmV0dXJuIDE7Ci0gICAgICBmcHJpbnRmIChmLCAiJWx1IiwgaSk7Ci0gICAgfQotICAvKiBEbyBub3Qgb3V0cHV0IGEgdHJhaWxpbmcgbmV3bGluZSwgYXMgdGhpcyBjYXVzZXMgXHJcbiBjb25mdXNpb24KLSAgICAgb24gc29tZSBwbGF0Zm9ybXMuICAqLwotICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGVjaG8gPj5jb25mdGVzdC52YWw7IHJlYWQgJDMgPGNvbmZ0ZXN0LnZhbDsgYWNfcmV0dmFsPTAKLWVsc2UKLSAgYWNfcmV0dmFsPTEKLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1ybSAtZiBjb25mdGVzdC52YWwKLQotICBmaQotICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KLSAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCi0KLX0gIyBhY19mbl9jX2NvbXB1dGVfaW50Ci0KLSMgYWNfZm5fY19jaGVja19tZW1iZXIgTElORU5PIEFHR1IgTUVNQkVSIFZBUiBJTkNMVURFUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRyaWVzIHRvIGZpbmQgaWYgdGhlIGZpZWxkIE1FTUJFUiBleGlzdHMgaW4gdHlwZSBBR0dSLCBhZnRlciBpbmNsdWRpbmcKLSMgSU5DTFVERVMsIHNldHRpbmcgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgotYWNfZm5fY19jaGVja19tZW1iZXIgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMi4kMyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuJDMuLi4gIiA+JjY7IH0KLWlmIGV2YWwgXCR7JDQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNQotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgJDIgYWNfYWdncjsKLWlmIChhY19hZ2dyLiQzKQotcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgZXZhbCAiJDQ9eWVzIgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNQotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgJDIgYWNfYWdncjsKLWlmIChzaXplb2YgYWNfYWdnci4kMykKLXJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGV2YWwgIiQ0PXllcyIKLWVsc2UKLSAgZXZhbCAiJDQ9bm8iCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotZXZhbCBhY19yZXM9XCQkNAotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19ICMgYWNfZm5fY19jaGVja19tZW1iZXIKLWNhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0KLUl0IHdhcyBjcmVhdGVkIGJ5IE9wZW5TU0ggJGFzX21lIFBvcnRhYmxlLCB3aGljaCB3YXMKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OC4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwotCi0gICQgJDAgJEAKLQotX0FDRU9GCi1leGVjIDU+PmNvbmZpZy5sb2cKLXsKLWNhdCA8PF9BU1VOQU1FCi0jIyAtLS0tLS0tLS0gIyMKLSMjIFBsYXRmb3JtLiAjIwotIyMgLS0tLS0tLS0tICMjCi0KLWhvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCi11bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLQotL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0vYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKLQotL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAotL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAotL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotL3Vzci9iaW4vaG9zdGluZm8gICAgICA9IGAoL3Vzci9iaW4vaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgfHwgZWNobyB1bmtub3duYAotL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAotL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAotL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAotCi1fQVNVTkFNRQotCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgJGFzX2VjaG8gIlBBVEg6ICRhc19kaXIiCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotfSA+JjUKLQotY2F0ID4mNSA8PF9BQ0VPRgotCi0KLSMjIC0tLS0tLS0tLS0tICMjCi0jIyBDb3JlIHRlc3RzLiAjIwotIyMgLS0tLS0tLS0tLS0gIyMKLQotX0FDRU9GCi0KLQotIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCi0jIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotYWNfY29uZmlndXJlX2FyZ3MwPQotYWNfY29uZmlndXJlX2FyZ3MxPQotYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKLWZvciBhY19wYXNzIGluIDEgMgotZG8KLSAgZm9yIGFjX2FyZwotICBkbwotICAgIGNhc2UgJGFjX2FyZyBpbgotICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKLSAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgICAgY29udGludWUgOzsKLSAgICAqXCcqKQotICAgICAgYWNfYXJnPWAkYXNfZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSAgICBlc2FjCi0gICAgY2FzZSAkYWNfcGFzcyBpbgotICAgIDEpIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczAgIiAnJGFjX2FyZyciIDs7Ci0gICAgMikKLSAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczEgIiAnJGFjX2FyZyciCi0gICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KLQlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCi0gICAgICBlbHNlCi0JY2FzZSAkYWNfYXJnIGluCi0JICAqPSogfCAtLWNvbmZpZy1jYWNoZSB8IC1DIHwgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qIFwKLQkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKLQkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKLQkgIHwgLXdpdGgtKiB8IC0td2l0aC0qIHwgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qIHwgLS14KQotCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KLQkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OwotCSAgICBlc2FjCi0JICAgIDs7Ci0JICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIgotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLWRvbmUKLXsgYWNfY29uZmlndXJlX2FyZ3MwPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwO30KLXsgYWNfY29uZmlndXJlX2FyZ3MxPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxO30KLQotIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQotIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKLSMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgotIyBXQVJOSU5HOiBVc2UgJ1wnJyB0byByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSB3aXRoaW4gdGhlIHRyYXAuCi0jIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCi10cmFwICdleGl0X3N0YXR1cz0kPwotICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KLSAgewotICAgIGVjaG8KLQotICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBDYWNoZSB2YXJpYWJsZXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tICMjIgotICAgIGVjaG8KLSAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotKAotICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdcJydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ1wnJ2A7IGRvCi0gICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgY2FzZSAkYWNfdmFsIGluICMoCi0gICAgKiR7YXNfbmx9KikKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OwotICAgICAgZXNhYwotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCi0gICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAotICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKLSAgICAgIGVzYWMgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgIHNlZCAtbiBcCi0JInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7Ci0JICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCi0gICAgICA7OyAjKAotICAgICopCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pCi0gICAgZWNobwotCi0gICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBPdXRwdXQgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMiCi0gICAgZWNobwotICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKLSAgICBkbwotICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgICBjYXNlICRhY192YWwgaW4KLSAgICAgICpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKLSAgICAgIGVzYWMKLSAgICAgICRhc19lY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKLSAgICBkb25lIHwgc29ydAotICAgIGVjaG8KLQotICAgIGlmIHRlc3QgLW4gIiRhY19zdWJzdF9maWxlcyI7IHRoZW4KLSAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjIgotICAgICAgZWNobwotICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKLSAgICAgIGRvCi0JZXZhbCBhY192YWw9XCQkYWNfdmFyCi0JY2FzZSAkYWNfdmFsIGluCi0JKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotCWVzYWMKLQkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0gICAgICBkb25lIHwgc29ydAotICAgICAgZWNobwotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KLSAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLSAjIwotIyMgY29uZmRlZnMuaC4gIyMKLSMjIC0tLS0tLS0tLS0tICMjIgotICAgICAgZWNobwotICAgICAgY2F0IGNvbmZkZWZzLmgKLSAgICAgIGVjaG8KLSAgICBmaQotICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKLSAgICAgICRhc19lY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKLSAgfSA+JjUKLSAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCi0gICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgotICAgIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLWZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbwotICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyBhc19mbl9leGl0IDEnICRhY19zaWduYWwKLWRvbmUKLWFjX3NpZ25hbD0wCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAotCi0kYXNfZWNobyAiLyogY29uZmRlZnMuaCAqLyIgPiBjb25mZGVmcy5oCi0KLSMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKLV9BQ0VPRgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKLV9BQ0VPRgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKLV9BQ0VPRgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCi1fQUNFT0YKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgotX0FDRU9GCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRV9VUkwgIiRQQUNLQUdFX1VSTCIKLV9BQ0VPRgotCi0KLSMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgotIyBQcmVmZXIgYW4gZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWFjX3NpdGVfZmlsZTE9Tk9ORQotYWNfc2l0ZV9maWxlMj1OT05FCi1pZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICMgV2UgZG8gbm90IHdhbnQgYSBQQVRIIHNlYXJjaCBmb3IgY29uZmlnLnNpdGUuCi0gIGNhc2UgJENPTkZJR19TSVRFIGluICMoKAotICAgIC0qKSAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7Ci0gICAgKi8qKSBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURTs7Ci0gICAgKikgICBhY19zaXRlX2ZpbGUxPS4vJENPTkZJR19TSVRFOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCi0gIGFjX3NpdGVfZmlsZTI9JHByZWZpeC9ldGMvY29uZmlnLnNpdGUKLWVsc2UKLSAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKLSAgYWNfc2l0ZV9maWxlMj0kYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKLWRvCi0gIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCi0gIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkYWNfc2l0ZV9maWxlIiAmJiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KLSAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKLSAgICAuICIkYWNfc2l0ZV9maWxlIiBcCi0gICAgICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJmYWlsZWQgdG8gbG9hZCBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwgZmlsZXMKLSAgIyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuICBESkdQUCBlbXVsYXRlcyBpdCBhcyBhIHJlZ3VsYXIgZmlsZS4KLSAgaWYgdGVzdCAvZGV2L251bGwgIT0gIiRjYWNoZV9maWxlIiAmJiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgICBjYXNlICRjYWNoZV9maWxlIGluCi0gICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gIiRjYWNoZV9maWxlIjs7Ci0gICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7Ci0gICAgZXNhYwotICBmaQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICA+JGNhY2hlX2ZpbGUKLWZpCi0KLSMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKLSMgdmFsdWUuCi1hY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKLWZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCi0gIGV2YWwgYWNfb2xkX3NldD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0Ci0gIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0Ci0gIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKLSAgZXZhbCBhY19uZXdfdmFsPVwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZQotICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCi0gICAgc2V0LCkKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KLSAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7Ci0gICAgLHNldCkKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQotICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKLSAgICAsKTs7Ci0gICAgKikKLSAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KLQkjIGRpZmZlcmVuY2VzIGluIHdoaXRlc3BhY2UgZG8gbm90IGxlYWQgdG8gZmFpbHVyZS4KLQlhY19vbGRfdmFsX3c9YGVjaG8geCAkYWNfb2xkX3ZhbGAKLQlhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKLQlpZiB0ZXN0ICIkYWNfb2xkX3ZhbF93IiAhPSAiJGFjX25ld192YWxfdyI7IHRoZW4KLQkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JICBhY19jYWNoZV9jb3JydXB0ZWQ9OgotCWVsc2UKLQkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JICBldmFsICRhY192YXI9XCRhY19vbGRfdmFsCi0JZmkKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mNQotJGFzX2VjaG8gIiRhc19tZTogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiYyO30KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mNQotJGFzX2VjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiYyO30KLSAgICAgIGZpOzsKLSAgZXNhYwotICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCi0gIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgotICAgIGNhc2UgJGFjX25ld192YWwgaW4KLSAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gJGFzX2VjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgotICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCi0gICAgICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MgIiAnJGFjX2FyZyciIDs7Ci0gICAgZXNhYwotICBmaQotZG9uZQotaWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQotICBhc19mbl9lcnJvciAkPyAicnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgIiRMSU5FTk8iIDUKLWZpCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTWFpbiBib2R5IG9mIHNjcmlwdC4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0KLWFjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgY29uZmlnLmgiCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1Ci0kYXNfZWNobyAiJENDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KLSAgYWNfY3RfQ0M9JENDCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCi1pZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KLSAgICBDQz0iIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIENDPSRhY19jdF9DQwotICBmaQotZWxzZQotICBDQz0iJGFjX2N2X3Byb2dfQ0MiCi1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQotJGFzX2VjaG8gIiRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIGZpCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0gICAgICAgY29udGludWUKLSAgICAgZmkKLSAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQotJGFzX2VjaG8gIiRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotICBkbwotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQotJGFzX2VjaG8gIiRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gICAgdGVzdCAtbiAiJENDIiAmJiBicmVhawotICBkb25lCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICBhY19jdF9DQz0kQ0MKLSAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfYWNfY3RfQ0MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQwotaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCi1kb25lCi0KLSAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCi0gICAgQ0M9IiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBDQz0kYWNfY3RfQ0MKLSAgZmkKLWZpCi0KLWZpCi0KLQotdGVzdCAteiAiJENDIiAmJiB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotCi0jIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCi0kYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKLXNldCBYICRhY19jb21waWxlCi1hY19jb21waWxlcj0kMgotZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbwotICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCi0gIGFjX3N0YXR1cz0kPwotICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgIHNlZCAnMTBhXAotLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgotICAgICAgICAgMTBxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQotICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLWRvbmUKLQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1hY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcwotYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0IgotIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgotIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgotIyBvZiBleGVleHQuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsgfQotYWNfbGlua19kZWZhdWx0PWAkYXNfZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKLQotIyBUaGUgcG9zc2libGUgb3V0cHV0IGZpbGVzOgotYWNfZmlsZXM9ImEub3V0IGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBhLmV4ZSBhX291dC5leGUgYi5vdXQgY29uZnRlc3QuKiIKLQotYWNfcm1maWxlcz0KLWZvciBhY19maWxlIGluICRhY19maWxlcwotZG8KLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKLSAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKLSAgZXNhYwotZG9uZQotcm0gLWYgJGFjX3JtZmlsZXMKLQotaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKLSAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCi0jIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJwotIyBpbiBhIE1ha2VmaWxlLiAgV2Ugc2hvdWxkIG5vdCBvdmVycmlkZSBhY19jdl9leGVleHQgaWYgaXQgd2FzIGNhY2hlZCwKLSMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCi0jIEF1dG9jb25mLgotZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzICcnCi1kbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkKLQk7OwotICAgIFthYl0ub3V0ICkKLQkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAotCSMgY2VydGFpbmx5IHJpZ2h0LgotCWJyZWFrOzsKLSAgICAqLiogKQotCWlmIHRlc3QgIiR7YWNfY3ZfZXhlZXh0K3NldH0iID0gc2V0ICYmIHRlc3QgIiRhY19jdl9leGVleHQiICE9IG5vOwotCXRoZW4gOjsgZWxzZQotCSAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAotCWZpCi0JIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUgYmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90Ci0JIyBzYWZlOiBjcm9zcyBjb21waWxlcnMgbWF5IG5vdCBhZGQgdGhlIHN1ZmZpeCBpZiBnaXZlbiBhbiBgLW8nCi0JIyBhcmd1bWVudCwgc28gd2UgbWF5IG5lZWQgdG8ga25vdyBpdCBhdCB0aGF0IHBvaW50IGFscmVhZHkuCi0JIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCi0JIyBhY3R1YWxseSB3b3JraW5nLgotCWJyZWFrOzsKLSAgICAqICkKLQlicmVhazs7Ci0gIGVzYWMKLWRvbmUKLXRlc3QgIiRhY19jdl9leGVleHQiID0gbm8gJiYgYWNfY3ZfZXhlZXh0PQotCi1lbHNlCi0gIGFjX2ZpbGU9JycKLWZpCi1pZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi17IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yIDc3ICJDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICIgPiY2OyB9Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhY19maWxlIiA+JjY7IH0KLWFjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0Ci0KLXJtIC1mIC1yIGEub3V0IGEub3V0LmRTWU0gYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0Ci1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gIiA+JjY7IH0KLWlmIHsgeyBhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKLSAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCi0jIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKLSMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCi0jIGBybScuCi1mb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7Ci0gICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCi0JICBicmVhazs7Ci0gICAgKiApIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotZWxzZQotICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9leGVleHQiID4mNjsgfQotCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1FWEVFWFQ9JGFjX2N2X2V4ZWV4dAotYWNfZXhlZXh0PSRFWEVFWFQKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotaW50Ci1tYWluICgpCi17Ci1GSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5vdXQiLCAidyIpOwotIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGNvbmZ0ZXN0Lm91dCIKLSMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgotICB7IHsgYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotICBpZiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19jdl9leGVleHQnCi0gIHsgeyBjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfTsgdGhlbgotICAgIGNyb3NzX2NvbXBpbGluZz1ubwotICBlbHNlCi0gICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSBtYXliZTsgdGhlbgotCWNyb3NzX2NvbXBpbGluZz15ZXMKLSAgICBlbHNlCi0JeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgotSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotICAgIGZpCi0gIGZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQotJGFzX2VjaG8gIiRjcm9zc19jb21waWxpbmciID4mNjsgfQotCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBjb25mdGVzdC5vdXQKLWFjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X29iamV4dCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKLWlmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKLSAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOwotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNICkgOzsKLSAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKLSAgICAgICBicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWVsc2UKLSAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfb2JqZXh0IiA+JjY7IH0KLU9CSkVYVD0kYWNfY3Zfb2JqZXh0Ci1hY19vYmpleHQ9JE9CSkVYVAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2NfY29tcGlsZXJfZ251Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgX19HTlVDX18KLSAgICAgICBjaG9rZSBtZQotI2VuZGlmCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jb21waWxlcl9nbnU9eWVzCi1lbHNlCi0gIGFjX2NvbXBpbGVyX2dudT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi1hY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9Ci1hY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2NjX2crOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKLSAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCi0gICBhY19jdl9wcm9nX2NjX2c9bm8KLSAgIENGTEFHUz0iLWciCi0gICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBDRkxBR1M9IiIKLSAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotCi1lbHNlCi0gIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotCSBDRkxBR1M9Ii1nIgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQotJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfY2NfYzg5Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19jODk9bm8KLWFjX3NhdmVfQ0M9JENDCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLwotc3RydWN0IGJ1ZiB7IGludCB4OyB9OwotRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKLXN0YXRpYyBjaGFyICplIChwLCBpKQotICAgICBjaGFyICoqcDsKLSAgICAgaW50IGk7Ci17Ci0gIHJldHVybiBwW2ldOwotfQotc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQotewotICBjaGFyICpzOwotICB2YV9saXN0IHY7Ci0gIHZhX3N0YXJ0ICh2LHApOwotICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOwotICB2YV9lbmQgKHYpOwotICByZXR1cm4gczsKLX0KLQotLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKLSAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KLSAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAotICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAotICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgotICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCi0gICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCi1pbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOwotCi0vKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKLSAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KLSNkZWZpbmUgRk9PKHgpICd4JwotaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07Ci0KLWludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOwotc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307Ci1zdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKLWludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOwotaW50IGFyZ2M7Ci1jaGFyICoqYXJndjsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1mb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCi0JLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKLWRvCi0gIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgotICBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0Ci0gIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCi1kb25lCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1DQz0kYWNfc2F2ZV9DQwotCi1maQotIyBBQ19DQUNIRV9WQUwKLWNhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCi0gIHgpCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKLSRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7Ci0gIHhubykKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQotJGFzX2VjaG8gInVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKLSAgKikKLSAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OwotZXNhYwotaWYgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0aGVuIDoKLQotZmkKLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAiJHNyY2RpciIgIiRzcmNkaXIvLi4iICIkc3JjZGlyLy4uLy4uIjsgZG8KLSAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIGluc3RhbGwtc2gsIGluc3RhbGwuc2gsIG9yIHNodG9vbCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgIiRMSU5FTk8iIDUKLWZpCi0KLSMgVGhlc2UgdGhyZWUgdmFyaWFibGVzIGFyZSB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAotIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgotIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5Ci0jIHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMuCi1hY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi1hY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KLWFjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi0kU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAiJExJTkVOTyIgNQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2J1aWxkKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCi10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKLXRlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgotICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAiJExJTkVOTyIgNQotYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAotICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9idWlsZCIgPiY2OyB9Ci1jYXNlICRhY19jdl9idWlsZCBpbgotKi0qLSopIDs7Ci0qKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiICIkTElORU5PIiA1OzsKLWVzYWMKLWJ1aWxkPSRhY19jdl9idWlsZAotYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJwotc2V0IHggJGFjX2N2X2J1aWxkCi1zaGlmdAotYnVpbGRfY3B1PSQxCi1idWlsZF92ZW5kb3I9JDIKLXNoaWZ0OyBzaGlmdAotIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCi0jIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Ci1idWlsZF9vcz0kKgotSUZTPSRhY19zYXZlX0lGUwotY2FzZSAkYnVpbGRfb3MgaW4gKlwgKikgYnVpbGRfb3M9YGVjaG8gIiRidWlsZF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9ob3N0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAieCRob3N0X2FsaWFzIiA9IHg7IHRoZW4KLSAgYWNfY3ZfaG9zdD0kYWNfY3ZfYnVpbGQKLWVsc2UKLSAgYWNfY3ZfaG9zdD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkaG9zdF9hbGlhc2AgfHwKLSAgICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaG9zdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hvc3QiID4mNjsgfQotY2FzZSAkYWNfY3ZfaG9zdCBpbgotKi0qLSopIDs7Ci0qKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgIiRMSU5FTk8iIDU7OwotZXNhYwotaG9zdD0kYWNfY3ZfaG9zdAotYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJwotc2V0IHggJGFjX2N2X2hvc3QKLXNoaWZ0Ci1ob3N0X2NwdT0kMQotaG9zdF92ZW5kb3I9JDIKLXNoaWZ0OyBzaGlmdAotIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCi0jIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Ci1ob3N0X29zPSQqCi1JRlM9JGFjX3NhdmVfSUZTCi1jYXNlICRob3N0X29zIGluICpcICopIGhvc3Rfb3M9YGVjaG8gIiRob3N0X29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYwotCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAotICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCi0gICAgZG8KLSAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKLSAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgotICBicmVhawotZmkKLQotICAgIGRvbmUKLSAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCi0KLWZpCi0gIENQUD0kYWNfY3ZfcHJvZ19DUFAKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9JENQUAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUKLSRhc19lY2hvICIkQ1BQIiA+JjY7IH0KLWFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKLSAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgotCi1lbHNlCi0gIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgJD8gIkMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLWZpCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcGF0aF9HUkVQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCi0gIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQotICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCi0jIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCi0gICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9HUkVQCi1jYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCi0qR05VKikKLSAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIiBhY19wYXRoX0dSRVBfZm91bmQ9Ojs7Ci0qKQotICBhY19jb3VudD0wCi0gICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgotICB3aGlsZSA6Ci0gIGRvCi0gICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKLSAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCi0gICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCi0gICAgJGFzX2VjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKLSAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawotICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKLSAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCi0gICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKLSAgICAgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIKLSAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50Ci0gICAgZmkKLSAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gIGRvbmUKLSAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Ci1lc2FjCi0KLSAgICAgICRhY19wYXRoX0dSRVBfZm91bmQgJiYgYnJlYWsgMwotICAgIGRvbmUKLSAgZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0gIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0dSRVAiOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1Ci0gIGZpCi1lbHNlCi0gIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KLSBHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX0VHUkVQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKLSAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCi0gICBlbHNlCi0gICAgIGlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KLSAgYWNfcGF0aF9FR1JFUF9mb3VuZD1mYWxzZQotICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19wcm9nIGluIGVncmVwOyBkbwotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKLSAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfRUdSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0VHUkVQIjsgfSB8fCBjb250aW51ZQotIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KLSAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCi1jYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgotKkdOVSopCi0gIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OwotKikKLSAgYWNfY291bnQ9MAotICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKLSAgd2hpbGUgOgotICBkbwotICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCi0gICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgotICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgotICAgICRhc19lY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgotICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawotICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKLSAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgotICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCi0gICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIKLSAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAotICAgIGZpCi0gICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICBkb25lCi0gIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OwotZXNhYwotCi0gICAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCi0gICAgZG9uZQotICBkb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLSAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfRUdSRVAiOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZWdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQotICBmaQotZWxzZQotICBhY19jdl9wYXRoX0VHUkVQPSRFR1JFUAotZmkKLQotICAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQotJGFzX2VjaG8gIiRhY19jdl9wYXRoX0VHUkVQIiA+JjY7IH0KLSBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9oZWFkZXJfc3RkYys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICA6Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQotIyBkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2Vsc2UKLSMgZGVmaW5lIElTTE9XRVIoYykgXAotCQkgICAoKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdpJykgXAotCQkgICAgIHx8ICgnaicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKLQkJICAgICB8fCAoJ3MnIDw9IChjKSAmJiAoYykgPD0gJ3onKSkKLSMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAoKGMpIHwgMHg0MCkgOiAoYykpCi0jZW5kaWYKLQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludAotbWFpbiAoKQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkKLQl8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKLSAgICAgIHJldHVybiAyOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1maQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkYyIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBTVERDX0hFQURFUlMgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLSMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCi1mb3IgYWNfaGVhZGVyIGluIHN5cy90eXBlcy5oIHN5cy9zdGF0Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIFwKLQkJICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCi1kbyA6Ci0gIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0Ci0iCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi0KLWRvbmUKLQotCi0geyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfY19iaWdlbmRpYW4rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCi0gICAgIyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgdW5pdmVyc2FsIGNvbXBpbGVyLgotICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpZm5kZWYgX19BUFBMRV9DQ19fCi0JICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCi0JICAgICAjZW5kaWYKLQkgICAgIHR5cGVkZWYgaW50IGR1bW15OwotCi1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLQotCSMgQ2hlY2sgZm9yIHBvdGVudGlhbCAtYXJjaCBmbGFncy4gIEl0IGlzIG5vdCB1bml2ZXJzYWwgdW5sZXNzCi0JIyB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIC1hcmNoIGZsYWdzIHdpdGggZGlmZmVyZW50IHZhbHVlcy4KLQlhY19hcmNoPQotCWFjX3ByZXY9Ci0JZm9yIGFjX3dvcmQgaW4gJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTOyBkbwotCSBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLQkgICBjYXNlICRhY193b3JkIGluCi0JICAgICBpPzg2IHwgeDg2XzY0IHwgcHBjIHwgcHBjNjQpCi0JICAgICAgIGlmIHRlc3QgLXogIiRhY19hcmNoIiB8fCB0ZXN0ICIkYWNfYXJjaCIgPSAiJGFjX3dvcmQiOyB0aGVuCi0JCSBhY19hcmNoPSRhY193b3JkCi0JICAgICAgIGVsc2UKLQkJIGFjX2N2X2NfYmlnZW5kaWFuPXVuaXZlcnNhbAotCQkgYnJlYWsKLQkgICAgICAgZmkKLQkgICAgICAgOzsKLQkgICBlc2FjCi0JICAgYWNfcHJldj0KLQkgZWxpZiB0ZXN0ICJ4JGFjX3dvcmQiID0gIngtYXJjaCI7IHRoZW4KLQkgICBhY19wcmV2PWFyY2gKLQkgZmkKLSAgICAgICBkb25lCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCi0gICAgICAjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgotICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCSAgICAgI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi1pbnQKLW1haW4gKCkKLXsKLSNpZiAhIChkZWZpbmVkIEJZVEVfT1JERVIgJiYgZGVmaW5lZCBCSUdfRU5ESUFOIFwKLQkJICAgICAmJiBkZWZpbmVkIExJVFRMRV9FTkRJQU4gJiYgQllURV9PUkRFUiAmJiBCSUdfRU5ESUFOIFwKLQkJICAgICAmJiBMSVRUTEVfRU5ESUFOKQotCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKLQkgICAgICNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KLQkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLWludAotbWFpbiAoKQotewotI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgotCQkgbm90IGJpZyBlbmRpYW4KLQkJI2VuZGlmCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKLWVsc2UKLSAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgICBmaQotICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgotICAgICAgIyBTZWUgaWYgPGxpbWl0cy5oPiBkZWZpbmVzIF9MSVRUTEVfRU5ESUFOIG9yIF9CSUdfRU5ESUFOIChlLmcuLCBTb2xhcmlzKS4KLSAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotaW50Ci1tYWluICgpCi17Ci0jaWYgISAoZGVmaW5lZCBfTElUVExFX0VORElBTiB8fCBkZWZpbmVkIF9CSUdfRU5ESUFOKQotCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKLQkgICAgICNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBfQklHX0VORElBTiBvciBub3QuCi0JIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotaW50Ci1tYWluICgpCi17Ci0jaWZuZGVmIF9CSUdfRU5ESUFOCi0JCSBub3QgYmlnIGVuZGlhbgotCQkjZW5kaWYKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2NfYmlnZW5kaWFuPXllcwotZWxzZQotICBhY19jdl9jX2JpZ2VuZGlhbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIGZpCi0gICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCi0gICAgICAjIENvbXBpbGUgYSB0ZXN0IHByb2dyYW0uCi0gICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gICMgVHJ5IHRvIGd1ZXNzIGJ5IGdyZXBwaW5nIHZhbHVlcyBmcm9tIGFuIG9iamVjdCBmaWxlLgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1zaG9ydCBpbnQgYXNjaWlfbW1bXSA9Ci0JCSAgeyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07Ci0JCXNob3J0IGludCBhc2NpaV9paVtdID0KLQkJICB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKLQkJaW50IHVzZV9hc2NpaSAoaW50IGkpIHsKLQkJICByZXR1cm4gYXNjaWlfbW1baV0gKyBhc2NpaV9paVtpXTsKLQkJfQotCQlzaG9ydCBpbnQgZWJjZGljX2lpW10gPQotCQkgIHsgMHg4OUQzLCAweEUzRTMsIDB4ODU5MywgMHg5NUM1LCAweDg5QzQsIDB4OTU4MSwgMCB9OwotCQlzaG9ydCBpbnQgZWJjZGljX21tW10gPQotCQkgIHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9OwotCQlpbnQgdXNlX2ViY2RpYyAoaW50IGkpIHsKLQkJICByZXR1cm4gZWJjZGljX21tW2ldICsgZWJjZGljX2lpW2ldOwotCQl9Ci0JCWV4dGVybiBpbnQgZm9vOwotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiB1c2VfYXNjaWkgKGZvbykgPT0gdXNlX2ViY2RpYyAoZm9vKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBpZiBncmVwIEJJR2VuRGlhblN5UyBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGw7IHRoZW4KLQkgICAgICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKLQkgICAgZmkKLQkgICAgaWYgZ3JlcCBMaVRUbGVFbkRpYW4gY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsIDsgdGhlbgotCSAgICAgIGlmIHRlc3QgIiRhY19jdl9jX2JpZ2VuZGlhbiIgPSB1bmtub3duOyB0aGVuCi0JCWFjX2N2X2NfYmlnZW5kaWFuPW5vCi0JICAgICAgZWxzZQotCQkjIGZpbmRpbmcgYm90aCBzdHJpbmdzIGlzIHVubGlrZWx5IHRvIGhhcHBlbiwgYnV0IHdobyBrbm93cz8KLQkJYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgotCSAgICAgIGZpCi0JICAgIGZpCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci1pbnQKLW1haW4gKCkKLXsKLQotCSAgICAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLwotCSAgICAgdW5pb24KLQkgICAgIHsKLQkgICAgICAgbG9uZyBpbnQgbDsKLQkgICAgICAgY2hhciBjW3NpemVvZiAobG9uZyBpbnQpXTsKLQkgICAgIH0gdTsKLQkgICAgIHUubCA9IDE7Ci0JICAgICByZXR1cm4gdS5jW3NpemVvZiAobG9uZyBpbnQpIC0gMV0gPT0gMTsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfY19iaWdlbmRpYW49bm8KLWVsc2UKLSAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotICAgIGZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2JpZ2VuZGlhbiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjY7IH0KLSBjYXNlICRhY19jdl9jX2JpZ2VuZGlhbiBpbiAjKAotICAgeWVzKQotICAgICAkYXNfZWNobyAiI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMSIgPj5jb25mZGVmcy5oCi07OyAjKAotICAgbm8pCi0gICAgICA7OyAjKAotICAgdW5pdmVyc2FsKQotCi0kYXNfZWNobyAiI2RlZmluZSBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQgMSIgPj5jb25mZGVmcy5oCi0KLSAgICAgOzsgIygKLSAgICopCi0gICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bmtub3duIGVuZGlhbm5lc3MKLSBwcmVzZXR0aW5nIGFjX2N2X2NfYmlnZW5kaWFuPW5vIChvciB5ZXMpIHdpbGwgaGVscCIgIiRMSU5FTk8iIDUgOzsKLSBlc2FjCi0KLQotIyBDaGVja3MgZm9yIHByb2dyYW1zLgotZm9yIGFjX3Byb2cgaW4gZ2F3ayBtYXdrIG5hd2sgYXdrCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfQVdLKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19BV0s9IiRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUFXSz0kYWNfY3ZfcHJvZ19BV0sKLWlmIHRlc3QgLW4gIiRBV0siOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVdLIiA+JjUKLSRhc19lY2hvICIkQVdLIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKLWRvbmUKLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAotICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCi0gICAgZG8KLSAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKLSAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgotICBicmVhawotZmkKLQotICAgIGRvbmUKLSAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCi0KLWZpCi0gIENQUD0kYWNfY3ZfcHJvZ19DUFAKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9JENQUAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUKLSRhc19lY2hvICIkQ1BQIiA+JjY7IH0KLWFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKLSAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgotCi1lbHNlCi0gIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgJD8gIkMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLWZpCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLVJBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUkFOTElCIiA+JjUKLSRhc19lY2hvICIkUkFOTElCIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi0gIGFjX2N0X1JBTkxJQj0kUkFOTElCCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgotaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQotJGFzX2VjaG8gIiRhY19jdF9SQU5MSUIiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgotICAgIFJBTkxJQj0iOiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBSQU5MSUI9JGFjX2N0X1JBTkxJQgotICBmaQotZWxzZQotICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcwotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLSMgUmVqZWN0IGluc3RhbGwgcHJvZ3JhbXMgdGhhdCBjYW5ub3QgaW5zdGFsbCBtdWx0aXBsZSBmaWxlcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmICR7YWNfY3ZfcGF0aF9pbnN0YWxsKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotY2FzZSAkYXNfZGlyLyBpbiAjKCgKLSAgLi8gfCAuLy8gfCAvW2NDXS8qIHwgXAotICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKLSAgPzpbXFwvXW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11PUzJbXFwvXUlOU1RBTExbXFwvXSogfCBcCi0gIC91c3IvdWNiLyogKSA7OwotICAqKQotICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgIyBieSBkZWZhdWx0LgotICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCi0JICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCi0JICAgIGVjaG8gdHdvID4gY29uZnRlc3QudHdvCi0JICAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgotCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgotCSAgICAgIHRlc3QgLXMgY29uZnRlc3Qub25lICYmIHRlc3QgLXMgY29uZnRlc3QudHdvICYmCi0JICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCi0JICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCi0JICAgIHRoZW4KLQkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgICAgYnJlYWsgMwotCSAgICBmaQotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgIGRvbmUKLSAgICA7OwotZXNhYwotCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCi0gICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgotICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJElOU1RBTEwiID4mNQotJGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3BhdGhfRUdSRVArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQotICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKLSAgIGVsc2UKLSAgICAgaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgotICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCi0gICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCi0jIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKLWNhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCi0qR05VKikKLSAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7Ci0qKQotICBhY19jb3VudD0wCi0gICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgotICB3aGlsZSA6Ci0gIGRvCi0gICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKLSAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCi0gICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCi0gICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCi0gICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCi0gICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhawotICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAotICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCi0gICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKLSAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgotICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50Ci0gICAgZmkKLSAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gIGRvbmUKLSAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Ci1lc2FjCi0KLSAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKLSAgICBkb25lCi0gIGRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KLSAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1Ci0gIGZpCi1lbHNlCi0gIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCi1maQotCi0gICBmaQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQotIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhcjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3BhdGhfQVIrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRBUiBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9BUj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLUFSPSRhY19jdl9wYXRoX0FSCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVIiID4mNQotJGFzX2VjaG8gIiRBUiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNhdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2F0OyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcGF0aF9DQVQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRDQVQgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfQ0FUPSIkQ0FUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9DQVQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgOzsKLWVzYWMKLWZpCi1DQVQ9JGFjX2N2X3BhdGhfQ0FUCi1pZiB0ZXN0IC1uICIkQ0FUIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENBVCIgPiY1Ci0kYXNfZWNobyAiJENBVCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImtpbGwiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGtpbGw7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX0tJTEwrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRLSUxMIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0tJTEw9IiRLSUxMIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9LSUxMPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotS0lMTD0kYWNfY3ZfcGF0aF9LSUxMCi1pZiB0ZXN0IC1uICIkS0lMTCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRLSUxMIiA+JjUKLSRhc19lY2hvICIkS0lMTCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1mb3IgYWNfcHJvZyBpbiBwZXJsNSBwZXJsCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3BhdGhfUEVSTCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJFBFUkwgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfUEVSTD0iJFBFUkwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX1BFUkw9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgOzsKLWVzYWMKLWZpCi1QRVJMPSRhY19jdl9wYXRoX1BFUkwKLWlmIHRlc3QgLW4gIiRQRVJMIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBFUkwiID4mNQotJGFzX2VjaG8gIiRQRVJMIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJFBFUkwiICYmIGJyZWFrCi1kb25lCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic2VkIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBzZWQ7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX1NFRCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJFNFRCBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9TRUQ9IiRTRUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX1NFRD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLVNFRD0kYWNfY3ZfcGF0aF9TRUQKLWlmIHRlc3QgLW4gIiRTRUQiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU0VEIiA+JjUKLSRhc19lY2hvICIkU0VEIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJlbnQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGVudDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3BhdGhfRU5UKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2FzZSAkRU5UIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0VOVD0iJEVOVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhfRU5UPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotRU5UPSRhY19jdl9wYXRoX0VOVAotaWYgdGVzdCAtbiAiJEVOVCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRFTlQiID4mNQotJGFzX2VjaG8gIiRFTlQiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImJhc2giLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGJhc2g7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX1RFU1RfTUlOVVNfU19TSCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJFRFU1RfTUlOVVNfU19TSCBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9URVNUX01JTlVTX1NfU0g9IiRURVNUX01JTlVTX1NfU0giICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX1RFU1RfTUlOVVNfU19TSD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLVRFU1RfTUlOVVNfU19TSD0kYWNfY3ZfcGF0aF9URVNUX01JTlVTX1NfU0gKLWlmIHRlc3QgLW4gIiRURVNUX01JTlVTX1NfU0giOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkVEVTVF9NSU5VU19TX1NIIiA+JjUKLSRhc19lY2hvICIkVEVTVF9NSU5VU19TX1NIIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAia3NoIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBrc2g7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX1RFU1RfTUlOVVNfU19TSCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJFRFU1RfTUlOVVNfU19TSCBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9URVNUX01JTlVTX1NfU0g9IiRURVNUX01JTlVTX1NfU0giICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX1RFU1RfTUlOVVNfU19TSD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLVRFU1RfTUlOVVNfU19TSD0kYWNfY3ZfcGF0aF9URVNUX01JTlVTX1NfU0gKLWlmIHRlc3QgLW4gIiRURVNUX01JTlVTX1NfU0giOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkVEVTVF9NSU5VU19TX1NIIiA+JjUKLSRhc19lY2hvICIkVEVTVF9NSU5VU19TX1NIIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic2giLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHNoOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcGF0aF9URVNUX01JTlVTX1NfU0grOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRURVNUX01JTlVTX1NfU0ggaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfVEVTVF9NSU5VU19TX1NIPSIkVEVTVF9NSU5VU19TX1NIIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9URVNUX01JTlVTX1NfU0g9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgOzsKLWVzYWMKLWZpCi1URVNUX01JTlVTX1NfU0g9JGFjX2N2X3BhdGhfVEVTVF9NSU5VU19TX1NICi1pZiB0ZXN0IC1uICIkVEVTVF9NSU5VU19TX1NIIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFRFU1RfTUlOVVNfU19TSCIgPiY1Ci0kYXNfZWNobyAiJFRFU1RfTUlOVVNfU19TSCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInNoIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBzaDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3BhdGhfU0grOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRTSCBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9TSD0iJFNIIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9TSD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLVNIPSRhY19jdl9wYXRoX1NICi1pZiB0ZXN0IC1uICIkU0giOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU0giID4mNQotJGFzX2VjaG8gIiRTSCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdyb2ZmIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBncm9mZjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3BhdGhfR1JPRkYrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRHUk9GRiBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9HUk9GRj0iJEdST0ZGIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9HUk9GRj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLUdST0ZGPSRhY19jdl9wYXRoX0dST0ZGCi1pZiB0ZXN0IC1uICIkR1JPRkYiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkR1JPRkYiID4mNQotJGFzX2VjaG8gIiRHUk9GRiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm5yb2ZmIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBucm9mZjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3BhdGhfTlJPRkYrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICROUk9GRiBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9OUk9GRj0iJE5ST0ZGIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9OUk9GRj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLU5ST0ZGPSRhY19jdl9wYXRoX05ST0ZGCi1pZiB0ZXN0IC1uICIkTlJPRkYiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTlJPRkYiID4mNQotJGFzX2VjaG8gIiROUk9GRiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1hbmRvYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbWFuZG9jOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcGF0aF9NQU5ET0MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRNQU5ET0MgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfTUFORE9DPSIkTUFORE9DIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9NQU5ET0M9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgOzsKLWVzYWMKLWZpCi1NQU5ET0M9JGFjX2N2X3BhdGhfTUFORE9DCi1pZiB0ZXN0IC1uICIkTUFORE9DIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BTkRPQyIgPiY1Ci0kYXNfZWNobyAiJE1BTkRPQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1URVNUX1NIRUxMPXNoCi0KLQotaWYgdGVzdCAieCRNQU5ET0MiICE9ICJ4IiA7IHRoZW4KLQlNQU5GTVQ9IiRNQU5ET0MiCi1lbGlmIHRlc3QgIngkTlJPRkYiICE9ICJ4IiA7IHRoZW4KLQlNQU5GTVQ9IiROUk9GRiAtbWFuZG9jIgotZWxpZiB0ZXN0ICJ4JEdST0ZGIiAhPSAieCIgOyB0aGVuCi0JTUFORk1UPSIkR1JPRkYgLW1hbmRvYyAtVGFzY2lpIgotZWxzZQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogbm8gbWFucGFnZSBmb3JtYXR0ZWQgZm91bmQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogbm8gbWFucGFnZSBmb3JtYXR0ZWQgZm91bmQiID4mMjt9Ci0JTUFORk1UPSJmYWxzZSIKLWZpCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJncm91cGFkZCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ3JvdXBhZGQ7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX1BBVEhfR1JPVVBBRERfUFJPRys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJFBBVEhfR1JPVVBBRERfUFJPRyBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9QQVRIX0dST1VQQUREX1BST0c9IiRQQVRIX0dST1VQQUREX1BST0ciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluIC91c3Ivc2JpbiR7UEFUSF9TRVBBUkFUT1J9L2V0YwotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9QQVRIX0dST1VQQUREX1BST0c9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfUEFUSF9HUk9VUEFERF9QUk9HIiAmJiBhY19jdl9wYXRoX1BBVEhfR1JPVVBBRERfUFJPRz0iZ3JvdXBhZGQiCi0gIDs7Ci1lc2FjCi1maQotUEFUSF9HUk9VUEFERF9QUk9HPSRhY19jdl9wYXRoX1BBVEhfR1JPVVBBRERfUFJPRwotaWYgdGVzdCAtbiAiJFBBVEhfR1JPVVBBRERfUFJPRyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQQVRIX0dST1VQQUREX1BST0ciID4mNQotJGFzX2VjaG8gIiRQQVRIX0dST1VQQUREX1BST0ciID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ1c2VyYWRkIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB1c2VyYWRkOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcGF0aF9QQVRIX1VTRVJBRERfUFJPRys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJFBBVEhfVVNFUkFERF9QUk9HIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX1BBVEhfVVNFUkFERF9QUk9HPSIkUEFUSF9VU0VSQUREX1BST0ciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluIC91c3Ivc2JpbiR7UEFUSF9TRVBBUkFUT1J9L2V0YwotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9QQVRIX1VTRVJBRERfUFJPRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9QQVRIX1VTRVJBRERfUFJPRyIgJiYgYWNfY3ZfcGF0aF9QQVRIX1VTRVJBRERfUFJPRz0idXNlcmFkZCIKLSAgOzsKLWVzYWMKLWZpCi1QQVRIX1VTRVJBRERfUFJPRz0kYWNfY3ZfcGF0aF9QQVRIX1VTRVJBRERfUFJPRwotaWYgdGVzdCAtbiAiJFBBVEhfVVNFUkFERF9QUk9HIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBBVEhfVVNFUkFERF9QUk9HIiA+JjUKLSRhc19lY2hvICIkUEFUSF9VU0VSQUREX1BST0ciID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwa2dtayIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcGtnbWs7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX01BS0VfUEFDS0FHRV9TVVBQT1JURUQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTUFLRV9QQUNLQUdFX1NVUFBPUlRFRCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19NQUtFX1BBQ0tBR0VfU1VQUE9SVEVEPSIkTUFLRV9QQUNLQUdFX1NVUFBPUlRFRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX01BS0VfUEFDS0FHRV9TVVBQT1JURUQ9InllcyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19NQUtFX1BBQ0tBR0VfU1VQUE9SVEVEIiAmJiBhY19jdl9wcm9nX01BS0VfUEFDS0FHRV9TVVBQT1JURUQ9Im5vIgotZmkKLWZpCi1NQUtFX1BBQ0tBR0VfU1VQUE9SVEVEPSRhY19jdl9wcm9nX01BS0VfUEFDS0FHRV9TVVBQT1JURUQKLWlmIHRlc3QgLW4gIiRNQUtFX1BBQ0tBR0VfU1VQUE9SVEVEIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BS0VfUEFDS0FHRV9TVVBQT1JURUQiID4mNQotJGFzX2VjaG8gIiRNQUtFX1BBQ0tBR0VfU1VQUE9SVEVEIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLWlmIHRlc3QgLXggL3NiaW4vc2g7IHRoZW4KLQlTVEFSVFVQX1NDUklQVF9TSEVMTD0vc2Jpbi9zaAotCi1lbHNlCi0JU1RBUlRVUF9TQ1JJUFRfU0hFTEw9L2Jpbi9zaAotCi1maQotCi0jIFN5c3RlbSBmZWF0dXJlcwotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxhcmdlZmlsZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9sYXJnZWZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9sYXJnZWZpbGU7Ci1maQotCi1pZiB0ZXN0ICIkZW5hYmxlX2xhcmdlZmlsZSIgIT0gbm87IHRoZW4KLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzcGVjaWFsIEMgY29tcGlsZXIgb3B0aW9ucyBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzcGVjaWFsIEMgY29tcGlsZXIgb3B0aW9ucyBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3N5c19sYXJnZWZpbGVfQ0MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jdl9zeXNfbGFyZ2VmaWxlX0NDPW5vCi0gICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgotICAgICAgIGFjX3NhdmVfQ0M9JENDCi0gICAgICAgd2hpbGUgOjsgZG8KLQkgIyBJUklYIDYuMiBhbmQgbGF0ZXIgZG8gbm90IHN1cHBvcnQgbGFyZ2UgZmlsZXMgYnkgZGVmYXVsdCwKLQkgIyBzbyB1c2UgdGhlIEMgY29tcGlsZXIncyAtbjMyIG9wdGlvbiBpZiB0aGF0IGhlbHBzLgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gLyogQ2hlY2sgdGhhdCBvZmZfdCBjYW4gcmVwcmVzZW50IDIqKjYzIC0gMSBjb3JyZWN0bHkuCi0gICAgV2UgY2FuJ3Qgc2ltcGx5IGRlZmluZSBMQVJHRV9PRkZfVCB0byBiZSA5MjIzMzcyMDM2ODU0Nzc1ODA3LAotICAgIHNpbmNlIHNvbWUgQysrIGNvbXBpbGVycyBtYXNxdWVyYWRpbmcgYXMgQyBjb21waWxlcnMKLSAgICBpbmNvcnJlY3RseSByZWplY3QgOTIyMzM3MjAzNjg1NDc3NTgwNy4gICovCi0jZGVmaW5lIExBUkdFX09GRl9UICgoKG9mZl90KSAxIDw8IDYyKSAtIDEgKyAoKG9mZl90KSAxIDw8IDYyKSkKLSAgaW50IG9mZl90X2lzX2xhcmdlWyhMQVJHRV9PRkZfVCAlIDIxNDc0ODM2MjkgPT0gNzIxCi0JCSAgICAgICAmJiBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSkKLQkJICAgICAgPyAxIDogLTFdOwotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotCSBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGJyZWFrCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAotCSBDQz0iJENDIC1uMzIiCi0JIGlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3Zfc3lzX2xhcmdlZmlsZV9DQz0nIC1uMzInOyBicmVhawotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKLQkgYnJlYWsKLSAgICAgICBkb25lCi0gICAgICAgQ0M9JGFjX3NhdmVfQ0MKLSAgICAgICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gICAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3N5c19sYXJnZWZpbGVfQ0MiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zeXNfbGFyZ2VmaWxlX0NDIiA+JjY7IH0KLSAgaWYgdGVzdCAiJGFjX2N2X3N5c19sYXJnZWZpbGVfQ0MiICE9IG5vOyB0aGVuCi0gICAgQ0M9JENDJGFjX2N2X3N5c19sYXJnZWZpbGVfQ0MKLSAgZmkKLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfRklMRV9PRkZTRVRfQklUUyB2YWx1ZSBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBfRklMRV9PRkZTRVRfQklUUyB2YWx1ZSBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3N5c19maWxlX29mZnNldF9iaXRzKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgd2hpbGUgOjsgZG8KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotIC8qIENoZWNrIHRoYXQgb2ZmX3QgY2FuIHJlcHJlc2VudCAyKio2MyAtIDEgY29ycmVjdGx5LgotICAgIFdlIGNhbid0IHNpbXBseSBkZWZpbmUgTEFSR0VfT0ZGX1QgdG8gYmUgOTIyMzM3MjAzNjg1NDc3NTgwNywKLSAgICBzaW5jZSBzb21lIEMrKyBjb21waWxlcnMgbWFzcXVlcmFkaW5nIGFzIEMgY29tcGlsZXJzCi0gICAgaW5jb3JyZWN0bHkgcmVqZWN0IDkyMjMzNzIwMzY4NTQ3NzU4MDcuICAqLwotI2RlZmluZSBMQVJHRV9PRkZfVCAoKChvZmZfdCkgMSA8PCA2MikgLSAxICsgKChvZmZfdCkgMSA8PCA2MikpCi0gIGludCBvZmZfdF9pc19sYXJnZVsoTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjI5ID09IDcyMQotCQkgICAgICAgJiYgTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjQ3ID09IDEpCi0JCSAgICAgID8gMSA6IC0xXTsKLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3Zfc3lzX2ZpbGVfb2Zmc2V0X2JpdHM9bm87IGJyZWFrCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAvKiBDaGVjayB0aGF0IG9mZl90IGNhbiByZXByZXNlbnQgMioqNjMgLSAxIGNvcnJlY3RseS4KLSAgICBXZSBjYW4ndCBzaW1wbHkgZGVmaW5lIExBUkdFX09GRl9UIHRvIGJlIDkyMjMzNzIwMzY4NTQ3NzU4MDcsCi0gICAgc2luY2Ugc29tZSBDKysgY29tcGlsZXJzIG1hc3F1ZXJhZGluZyBhcyBDIGNvbXBpbGVycwotICAgIGluY29ycmVjdGx5IHJlamVjdCA5MjIzMzcyMDM2ODU0Nzc1ODA3LiAgKi8KLSNkZWZpbmUgTEFSR0VfT0ZGX1QgKCgob2ZmX3QpIDEgPDwgNjIpIC0gMSArICgob2ZmX3QpIDEgPDwgNjIpKQotICBpbnQgb2ZmX3RfaXNfbGFyZ2VbKExBUkdFX09GRl9UICUgMjE0NzQ4MzYyOSA9PSA3MjEKLQkJICAgICAgICYmIExBUkdFX09GRl9UICUgMjE0NzQ4MzY0NyA9PSAxKQotCQkgICAgICA/IDEgOiAtMV07Ci1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzPTY0OyBicmVhawotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cz11bmtub3duCi0gIGJyZWFrCi1kb25lCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzIiA+JjY7IH0KLWNhc2UgJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzIGluICMoCi0gIG5vIHwgdW5rbm93bikgOzsKLSAgKikKLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzCi1fQUNFT0YKLTs7Ci1lc2FjCi1ybSAtcmYgY29uZnRlc3QqCi0gIGlmIHRlc3QgJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzID0gdW5rbm93bjsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIF9MQVJHRV9GSUxFUyB2YWx1ZSBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBfTEFSR0VfRklMRVMgdmFsdWUgbmVlZGVkIGZvciBsYXJnZSBmaWxlcy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9zeXNfbGFyZ2VfZmlsZXMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICB3aGlsZSA6OyBkbwotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gLyogQ2hlY2sgdGhhdCBvZmZfdCBjYW4gcmVwcmVzZW50IDIqKjYzIC0gMSBjb3JyZWN0bHkuCi0gICAgV2UgY2FuJ3Qgc2ltcGx5IGRlZmluZSBMQVJHRV9PRkZfVCB0byBiZSA5MjIzMzcyMDM2ODU0Nzc1ODA3LAotICAgIHNpbmNlIHNvbWUgQysrIGNvbXBpbGVycyBtYXNxdWVyYWRpbmcgYXMgQyBjb21waWxlcnMKLSAgICBpbmNvcnJlY3RseSByZWplY3QgOTIyMzM3MjAzNjg1NDc3NTgwNy4gICovCi0jZGVmaW5lIExBUkdFX09GRl9UICgoKG9mZl90KSAxIDw8IDYyKSAtIDEgKyAoKG9mZl90KSAxIDw8IDYyKSkKLSAgaW50IG9mZl90X2lzX2xhcmdlWyhMQVJHRV9PRkZfVCAlIDIxNDc0ODM2MjkgPT0gNzIxCi0JCSAgICAgICAmJiBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSkKLQkJICAgICAgPyAxIDogLTFdOwotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zeXNfbGFyZ2VfZmlsZXM9bm87IGJyZWFrCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNkZWZpbmUgX0xBUkdFX0ZJTEVTIDEKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAvKiBDaGVjayB0aGF0IG9mZl90IGNhbiByZXByZXNlbnQgMioqNjMgLSAxIGNvcnJlY3RseS4KLSAgICBXZSBjYW4ndCBzaW1wbHkgZGVmaW5lIExBUkdFX09GRl9UIHRvIGJlIDkyMjMzNzIwMzY4NTQ3NzU4MDcsCi0gICAgc2luY2Ugc29tZSBDKysgY29tcGlsZXJzIG1hc3F1ZXJhZGluZyBhcyBDIGNvbXBpbGVycwotICAgIGluY29ycmVjdGx5IHJlamVjdCA5MjIzMzcyMDM2ODU0Nzc1ODA3LiAgKi8KLSNkZWZpbmUgTEFSR0VfT0ZGX1QgKCgob2ZmX3QpIDEgPDwgNjIpIC0gMSArICgob2ZmX3QpIDEgPDwgNjIpKQotICBpbnQgb2ZmX3RfaXNfbGFyZ2VbKExBUkdFX09GRl9UICUgMjE0NzQ4MzYyOSA9PSA3MjEKLQkJICAgICAgICYmIExBUkdFX09GRl9UICUgMjE0NzQ4MzY0NyA9PSAxKQotCQkgICAgICA/IDEgOiAtMV07Ci1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3N5c19sYXJnZV9maWxlcz0xOyBicmVhawotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9zeXNfbGFyZ2VfZmlsZXM9dW5rbm93bgotICBicmVhawotZG9uZQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzIiA+JjY7IH0KLWNhc2UgJGFjX2N2X3N5c19sYXJnZV9maWxlcyBpbiAjKAotICBubyB8IHVua25vd24pIDs7Ci0gICopCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIF9MQVJHRV9GSUxFUyAkYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzCi1fQUNFT0YKLTs7Ci1lc2FjCi1ybSAtcmYgY29uZnRlc3QqCi0gIGZpCi1maQotCi0KLWlmIHRlc3QgLXogIiRBUiIgOyB0aGVuCi0JYXNfZm5fZXJyb3IgJD8gIioqKiAnYXInIG1pc3NpbmcsIHBsZWFzZSBpbnN0YWxsIG9yIGZpeCB5b3VyIFwkUEFUSCAqKioiICIkTElORU5PIiA1Ci1maQotCi0jIFVzZSBMT0dJTl9QUk9HUkFNIGZyb20gZW52aXJvbm1lbnQgaWYgcG9zc2libGUKLWlmIHRlc3QgISAteiAiJExPR0lOX1BST0dSQU0iIDsgdGhlbgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIExPR0lOX1BST0dSQU1fRkFMTEJBQ0sgIiRMT0dJTl9QUk9HUkFNIgotX0FDRU9GCi0KLWVsc2UKLQkjIFNlYXJjaCBmb3IgbG9naW4KLQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImxvZ2luIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBsb2dpbjsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3BhdGhfTE9HSU5fUFJPR1JBTV9GQUxMQkFDSys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJExPR0lOX1BST0dSQU1fRkFMTEJBQ0sgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfTE9HSU5fUFJPR1JBTV9GQUxMQkFDSz0iJExPR0lOX1BST0dSQU1fRkFMTEJBQ0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX0xPR0lOX1BST0dSQU1fRkFMTEJBQ0s9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgOzsKLWVzYWMKLWZpCi1MT0dJTl9QUk9HUkFNX0ZBTExCQUNLPSRhY19jdl9wYXRoX0xPR0lOX1BST0dSQU1fRkFMTEJBQ0sKLWlmIHRlc3QgLW4gIiRMT0dJTl9QUk9HUkFNX0ZBTExCQUNLIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExPR0lOX1BST0dSQU1fRkFMTEJBQ0siID4mNQotJGFzX2VjaG8gIiRMT0dJTl9QUk9HUkFNX0ZBTExCQUNLIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLQlpZiB0ZXN0ICEgLXogIiRMT0dJTl9QUk9HUkFNX0ZBTExCQUNLIiA7IHRoZW4KLQkJY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBMT0dJTl9QUk9HUkFNX0ZBTExCQUNLICIkTE9HSU5fUFJPR1JBTV9GQUxMQkFDSyIKLV9BQ0VPRgotCi0JZmkKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicGFzc3dkIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBwYXNzd2Q7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX1BBVEhfUEFTU1dEX1BST0crOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRQQVRIX1BBU1NXRF9QUk9HIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX1BBVEhfUEFTU1dEX1BST0c9IiRQQVRIX1BBU1NXRF9QUk9HIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9QQVRIX1BBU1NXRF9QUk9HPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotUEFUSF9QQVNTV0RfUFJPRz0kYWNfY3ZfcGF0aF9QQVRIX1BBU1NXRF9QUk9HCi1pZiB0ZXN0IC1uICIkUEFUSF9QQVNTV0RfUFJPRyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQQVRIX1BBU1NXRF9QUk9HIiA+JjUKLSRhc19lY2hvICIkUEFUSF9QQVNTV0RfUFJPRyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1pZiB0ZXN0ICEgLXogIiRQQVRIX1BBU1NXRF9QUk9HIiA7IHRoZW4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBfUEFUSF9QQVNTV0RfUFJPRyAiJFBBVEhfUEFTU1dEX1BST0ciCi1fQUNFT0YKLQotZmkKLQotaWYgdGVzdCAteiAiJExEIiA7IHRoZW4KLQlMRD0kQ0MKLWZpCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbmxpbmUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfY19pbmxpbmUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi10eXBlZGVmIGludCBmb29fdDsKLXN0YXRpYyAkYWNfa3cgZm9vX3Qgc3RhdGljX2ZvbyAoKSB7cmV0dXJuIDA7IH0KLSRhY19rdyBmb29fdCBmb28gKCkge3JldHVybiAwOyB9Ci0jZW5kaWYKLQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2NfaW5saW5lPSRhY19rdwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICB0ZXN0ICIkYWNfY3ZfY19pbmxpbmUiICE9IG5vICYmIGJyZWFrCi1kb25lCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfaW5saW5lIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfY19pbmxpbmUiID4mNjsgfQotCi1jYXNlICRhY19jdl9jX2lubGluZSBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gICopCi0gICAgY2FzZSAkYWNfY3ZfY19pbmxpbmUgaW4KLSAgICAgIG5vKSBhY192YWw9OzsKLSAgICAgICopIGFjX3ZhbD0kYWNfY3ZfY19pbmxpbmU7OwotICAgIGVzYWMKLSAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIGlubGluZSAkYWNfdmFsCi0jZW5kaWYKLV9BQ0VPRgotICAgIDs7Ci1lc2FjCi0KLQotYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiTExPTkdfTUFYIiAiYWNfY3ZfaGF2ZV9kZWNsX0xMT05HX01BWCIgIiNpbmNsdWRlIDxsaW1pdHMuaD4KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX0xMT05HX01BWCIgPSB4eWVzOyB0aGVuIDoKLSAgaGF2ZV9sbG9uZ19tYXg9MQotZmkKLQotYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiU1lTVFJfUE9MSUNZX0tJTEwiICJhY19jdl9oYXZlX2RlY2xfU1lTVFJfUE9MSUNZX0tJTEwiICIKLQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCSNpbmNsdWRlIDxkZXYvc3lzdHJhY2UuaD4KLQotIgotaWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfU1lTVFJfUE9MSUNZX0tJTEwiID0geHllczsgdGhlbiA6Ci0gIGhhdmVfc3lzdHJfcG9saWN5X2tpbGw9MQotZmkKLQotYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUkxJTUlUX05QUk9DIiAiYWNfY3ZfaGF2ZV9kZWNsX1JMSU1JVF9OUFJPQyIgIgotCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JMSU1JVF9OUFJPQyIgPSB4eWVzOyB0aGVuIDoKLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9STElNSVRfTlBST0MgLyoqLyIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotdXNlX3N0YWNrX3Byb3RlY3Rvcj0xCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3RhY2twcm90ZWN0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9zdGFja3Byb3RlY3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3N0YWNrcHJvdGVjdDsKLSAgICBpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyI7IHRoZW4KLQl1c2Vfc3RhY2tfcHJvdGVjdG9yPTAKLSAgICBmaQotZmkKLQotCi0KLWlmIHRlc3QgIiRHQ0MiID0gInllcyIgfHwgdGVzdCAiJEdDQyIgPSAiZWdjcyI7IHRoZW4KLQl7Ci0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLVdhbGwiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJENDIHN1cHBvcnRzIC1XYWxsLi4uICIgPiY2OyB9Ci0Jc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgotCUNGTEFHUz0iJENGTEFHUyAtV2FsbCIKLQlfZGVmaW5lX2ZsYWc9IiIKLQl0ZXN0ICJ4JF9kZWZpbmVfZmxhZyIgPSAieCIgJiYgX2RlZmluZV9mbGFnPSItV2FsbCIKLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi1pbnQgbWFpbih2b2lkKSB7IHJldHVybiAwOyB9Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0JCSAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTICRfZGVmaW5lX2ZsYWciCi1lbHNlCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MiCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLX0KLQl7Ci0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLVdwb2ludGVyLWFyaXRoIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmICRDQyBzdXBwb3J0cyAtV3BvaW50ZXItYXJpdGguLi4gIiA+JjY7IH0KLQlzYXZlZF9DRkxBR1M9IiRDRkxBR1MiCi0JQ0ZMQUdTPSIkQ0ZMQUdTIC1XcG9pbnRlci1hcml0aCIKLQlfZGVmaW5lX2ZsYWc9IiIKLQl0ZXN0ICJ4JF9kZWZpbmVfZmxhZyIgPSAieCIgJiYgX2RlZmluZV9mbGFnPSItV3BvaW50ZXItYXJpdGgiCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotaW50IG1haW4odm9pZCkgeyByZXR1cm4gMDsgfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCQkgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyAkX2RlZmluZV9mbGFnIgotZWxzZQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0JCSAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci19Ci0JewotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJENDIHN1cHBvcnRzIC1XdW5pbml0aWFsaXplZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLVd1bmluaXRpYWxpemVkLi4uICIgPiY2OyB9Ci0Jc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgotCUNGTEFHUz0iJENGTEFHUyAtV3VuaW5pdGlhbGl6ZWQiCi0JX2RlZmluZV9mbGFnPSIiCi0JdGVzdCAieCRfZGVmaW5lX2ZsYWciID0gIngiICYmIF9kZWZpbmVfZmxhZz0iLVd1bmluaXRpYWxpemVkIgotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLWludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MgJF9kZWZpbmVfZmxhZyIKLWVsc2UKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQkgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotfQotCXsKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRDQyBzdXBwb3J0cyAtV3NpZ24tY29tcGFyZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLVdzaWduLWNvbXBhcmUuLi4gIiA+JjY7IH0KLQlzYXZlZF9DRkxBR1M9IiRDRkxBR1MiCi0JQ0ZMQUdTPSIkQ0ZMQUdTIC1Xc2lnbi1jb21wYXJlIgotCV9kZWZpbmVfZmxhZz0iIgotCXRlc3QgIngkX2RlZmluZV9mbGFnIiA9ICJ4IiAmJiBfZGVmaW5lX2ZsYWc9Ii1Xc2lnbi1jb21wYXJlIgotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLWludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MgJF9kZWZpbmVfZmxhZyIKLWVsc2UKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQkgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotfQotCXsKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRDQyBzdXBwb3J0cyAtV2Zvcm1hdC1zZWN1cml0eSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLVdmb3JtYXQtc2VjdXJpdHkuLi4gIiA+JjY7IH0KLQlzYXZlZF9DRkxBR1M9IiRDRkxBR1MiCi0JQ0ZMQUdTPSIkQ0ZMQUdTIC1XZm9ybWF0LXNlY3VyaXR5IgotCV9kZWZpbmVfZmxhZz0iIgotCXRlc3QgIngkX2RlZmluZV9mbGFnIiA9ICJ4IiAmJiBfZGVmaW5lX2ZsYWc9Ii1XZm9ybWF0LXNlY3VyaXR5IgotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLWludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MgJF9kZWZpbmVfZmxhZyIKLWVsc2UKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQkgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotfQotCXsKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRDQyBzdXBwb3J0cyAtV3BvaW50ZXItc2lnbiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLVdwb2ludGVyLXNpZ24uLi4gIiA+JjY7IH0KLQlzYXZlZF9DRkxBR1M9IiRDRkxBR1MiCi0JQ0ZMQUdTPSIkQ0ZMQUdTIC1XcG9pbnRlci1zaWduIgotCV9kZWZpbmVfZmxhZz0iLVduby1wb2ludGVyLXNpZ24iCi0JdGVzdCAieCRfZGVmaW5lX2ZsYWciID0gIngiICYmIF9kZWZpbmVfZmxhZz0iLVdwb2ludGVyLXNpZ24iCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotaW50IG1haW4odm9pZCkgeyByZXR1cm4gMDsgfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCQkgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyAkX2RlZmluZV9mbGFnIgotZWxzZQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0JCSAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci19Ci0JewotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJENDIHN1cHBvcnRzIC1XdW51c2VkLXJlc3VsdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLVd1bnVzZWQtcmVzdWx0Li4uICIgPiY2OyB9Ci0Jc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgotCUNGTEFHUz0iJENGTEFHUyAtV3VudXNlZC1yZXN1bHQiCi0JX2RlZmluZV9mbGFnPSItV25vLXVudXNlZC1yZXN1bHQiCi0JdGVzdCAieCRfZGVmaW5lX2ZsYWciID0gIngiICYmIF9kZWZpbmVfZmxhZz0iLVd1bnVzZWQtcmVzdWx0IgotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLWludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MgJF9kZWZpbmVfZmxhZyIKLWVsc2UKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQkgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotfQotCXsKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRDQyBzdXBwb3J0cyAtZm5vLXN0cmljdC1hbGlhc2luZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgLWZuby1zdHJpY3QtYWxpYXNpbmcuLi4gIiA+JjY7IH0KLQlzYXZlZF9DRkxBR1M9IiRDRkxBR1MiCi0JQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8tc3RyaWN0LWFsaWFzaW5nIgotCV9kZWZpbmVfZmxhZz0iIgotCXRlc3QgIngkX2RlZmluZV9mbGFnIiA9ICJ4IiAmJiBfZGVmaW5lX2ZsYWc9Ii1mbm8tc3RyaWN0LWFsaWFzaW5nIgotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLWludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MgJF9kZWZpbmVfZmxhZyIKLWVsc2UKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQkgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotfQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZ2NjIHZlcnNpb24iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZ2NjIHZlcnNpb24uLi4gIiA+JjY7IH0KLQlHQ0NfVkVSPWAkQ0MgLXYgMj4mMSB8ICRBV0sgJy9nY2MgdmVyc2lvbiAve3ByaW50ICQzfSdgCi0JY2FzZSAkR0NDX1ZFUiBpbgotCQkxLiopIG5vX2F0dHJpYl9ub25udWxsPTEgOzsKLQkJMi44KiB8IDIuOSopCi0JCSAgICAgbm9fYXR0cmliX25vbm51bGw9MQotCQkgICAgIDs7Ci0JCTIuKikgbm9fYXR0cmliX25vbm51bGw9MSA7OwotCQkqKSA7OwotCWVzYWMKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEdDQ19WRVIiID4mNQotJGFzX2VjaG8gIiRHQ0NfVkVSIiA+JjY7IH0KLQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJENDIGFjY2VwdHMgLWZuby1idWlsdGluLW1lbXNldCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkQ0MgYWNjZXB0cyAtZm5vLWJ1aWx0aW4tbWVtc2V0Li4uICIgPiY2OyB9Ci0Jc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgotCUNGTEFHUz0iJENGTEFHUyAtZm5vLWJ1aWx0aW4tbWVtc2V0IgotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8c3RyaW5nLmg+Ci1pbnQKLW1haW4gKCkKLXsKLSBjaGFyIGJbMTBdOyBtZW1zZXQoYiwgMCwgc2l6ZW9mKGIpKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQkgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLQkjIC1mc3RhY2stcHJvdGVjdG9yLWFsbCBkb2Vzbid0IGFsd2F5cyB3b3JrIGZvciBzb21lIEdDQyB2ZXJzaW9ucwotCSMgYW5kL29yIHBsYXRmb3Jtcywgc28gd2UgdGVzdCBpZiB3ZSBjYW4uICBJZiBpdCdzIG5vdCBzdXBwb3J0ZWQKLQkjIG9uIGEgZ2l2ZW4gcGxhdGZvcm0gZ2NjIHdpbGwgZW1pdCBhIHdhcm5pbmcgc28gd2UgdXNlIC1XZXJyb3IuCi0JaWYgdGVzdCAieCR1c2Vfc3RhY2tfcHJvdGVjdG9yIiA9ICJ4MSI7IHRoZW4KLQkgICAgZm9yIHQgaW4gLWZzdGFjay1wcm90ZWN0b3ItYWxsIC1mc3RhY2stcHJvdGVjdG9yOyBkbwotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRDQyBzdXBwb3J0cyAkdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkQ0Mgc3VwcG9ydHMgJHQuLi4gIiA+JjY7IH0KLQkJc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgotCQlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKLQkJQ0ZMQUdTPSIkQ0ZMQUdTICR0IC1XZXJyb3IiCi0JCUxERkxBR1M9IiRMREZMQUdTICR0IC1XZXJyb3IiCi0JCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8c3RkaW8uaD4KLWludAotbWFpbiAoKQotewotCi0JY2hhciB4WzI1Nl07Ci0Jc25wcmludGYoeCwgc2l6ZW9mKHgpLCAiWFhYIik7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQkJICAgICAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTICR0IgotCQkgICAgICBMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyAkdCIKLQkJICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkdCB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkdCB3b3Jrcy4uLiAiID4mNjsgfQotCQkgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogY2Fubm90IHRlc3QiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBjYW5ub3QgdGVzdCIgPiYyO30KLQkJCSAgYnJlYWsKLQotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci1pbnQKLW1haW4gKCkKLXsKLQotCWNoYXIgeFsyNTZdOwotCXNucHJpbnRmKHgsIHNpemVvZih4KSwgIlhYWCIpOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQkJCSAgYnJlYWsKLWVsc2UKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQotZWxzZQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCQlDRkxBR1M9IiRzYXZlZF9DRkxBR1MiCi0JCUxERkxBR1M9IiRzYXZlZF9MREZMQUdTIgotCSAgICBkb25lCi0JZmkKLQotCWlmIHRlc3QgLXogIiRoYXZlX2xsb25nX21heCI7IHRoZW4KLQkJIyByZXRyeSBMTE9OR19NQVggd2l0aCAtc3RkPWdudTk5LCBuZWVkZWQgb24gc29tZSBMaW51eGVzCi0JCXVuc2V0IGFjX2N2X2hhdmVfZGVjbF9MTE9OR19NQVgKLQkJc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgotCQlDRkxBR1M9IiRDRkxBR1MgLXN0ZD1nbnU5OSIKLQkJYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiTExPTkdfTUFYIiAiYWNfY3ZfaGF2ZV9kZWNsX0xMT05HX01BWCIgIiNpbmNsdWRlIDxsaW1pdHMuaD4KLQotIgotaWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfTExPTkdfTUFYIiA9IHh5ZXM7IHRoZW4gOgotICBoYXZlX2xsb25nX21heD0xCi1lbHNlCi0gIENGTEFHUz0iJHNhdmVkX0NGTEFHUyIKLWZpCi0KLQlmaQotZmkKLQotaWYgdGVzdCAieCRub19hdHRyaWJfbm9ubnVsbCIgIT0gIngxIiA7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9BVFRSSUJVVEVfX05PTk5VTExfXyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXJwYXRoIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9ycGF0aCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfcnBhdGg7Ci0JCWlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIiA7IHRoZW4KLQkJCW5lZWRfZGFzaF9yPSIiCi0JCWZpCi0JCWlmIHRlc3QgIngkd2l0aHZhbCIgPSAieHllcyIgOyB0aGVuCi0JCQluZWVkX2Rhc2hfcj0xCi0JCWZpCi0KLQotZmkKLQotCi0jIEFsbG93IHVzZXIgdG8gc3BlY2lmeSBmbGFncwotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWNmbGFncyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfY2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9jZmxhZ3M7Ci0JCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCi0JCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0JCQlDRkxBR1M9IiRDRkxBR1MgJHdpdGh2YWwiCi0JCWZpCi0KLQotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWNwcGZsYWdzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9jcHBmbGFncytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfY3BwZmxhZ3M7Ci0JCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCi0JCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0JCQlDUFBGTEFHUz0iJENQUEZMQUdTICR3aXRodmFsIgotCQlmaQotCi0KLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1sZGZsYWdzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9sZGZsYWdzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9sZGZsYWdzOwotCQlpZiB0ZXN0IC1uICIkd2l0aHZhbCIgICYmICB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iICAmJiAgXAotCQkgICAgdGVzdCAieCR7d2l0aHZhbH0iICE9ICJ4eWVzIjsgdGhlbgotCQkJTERGTEFHUz0iJExERkxBR1MgJHdpdGh2YWwiCi0JCWZpCi0KLQotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWxpYnMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2xpYnMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2xpYnM7Ci0JCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCi0JCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0JCQlMSUJTPSIkTElCUyAkd2l0aHZhbCIKLQkJZmkKLQotCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtV2Vycm9yIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9XZXJyb3Irc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX1dlcnJvcjsKLQkJaWYgdGVzdCAtbiAiJHdpdGh2YWwiICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIjsgdGhlbgotCQkJd2Vycm9yX2ZsYWdzPSItV2Vycm9yIgotCQkJaWYgdGVzdCAieCR7d2l0aHZhbH0iICE9ICJ4eWVzIjsgdGhlbgotCQkJCXdlcnJvcl9mbGFncz0iJHdpdGh2YWwiCi0JCQlmaQotCQlmaQotCi0KLWZpCi0KLQotZm9yIGFjX2hlYWRlciBpbiAgXAotCWJzdHJpbmcuaCBcCi0JY3J5cHQuaCBcCi0JY3J5cHRvL3NoYTIuaCBcCi0JZGlyZW50LmggXAotCWVuZGlhbi5oIFwKLQlmZWF0dXJlcy5oIFwKLQlmY250bC5oIFwKLQlmbG9hdGluZ3BvaW50LmggXAotCWdldG9wdC5oIFwKLQlnbG9iLmggXAotCWlhLmggXAotCWlhZi5oIFwKLQlsaW1pdHMuaCBcCi0JbG9naW4uaCBcCi0JbWFpbGxvY2suaCBcCi0JbmRpci5oIFwKLQluZXQvaWZfdHVuLmggXAotCW5ldGRiLmggXAotCW5ldGdyb3VwLmggXAotCXBhbS9wYW1fYXBwbC5oIFwKLQlwYXRocy5oIFwKLQlwb2xsLmggXAotCXB0eS5oIFwKLQlyZWFkcGFzc3BocmFzZS5oIFwKLQlycGMvdHlwZXMuaCBcCi0Jc2VjdXJpdHkvcGFtX2FwcGwuaCBcCi0Jc2hhMi5oIFwKLQlzaGFkb3cuaCBcCi0Jc3RkZGVmLmggXAotCXN0ZGludC5oIFwKLQlzdHJpbmcuaCBcCi0Jc3RyaW5ncy5oIFwKLQlzeXMvYXVkaXQuaCBcCi0Jc3lzL2JpdHlwZXMuaCBcCi0Jc3lzL2JzZHR0eS5oIFwKLQlzeXMvY2RlZnMuaCBcCi0Jc3lzL2Rpci5oIFwKLQlzeXMvbW1hbi5oIFwKLQlzeXMvbmRpci5oIFwKLQlzeXMvcG9sbC5oIFwKLQlzeXMvcHJjdGwuaCBcCi0Jc3lzL3BzdGF0LmggXAotCXN5cy9zZWxlY3QuaCBcCi0Jc3lzL3N0YXQuaCBcCi0Jc3lzL3N0cmVhbS5oIFwKLQlzeXMvc3Ryb3B0cy5oIFwKLQlzeXMvc3RydGlvLmggXAotCXN5cy9zdGF0dmZzLmggXAotCXN5cy9zeXNtYWNyb3MuaCBcCi0Jc3lzL3RpbWUuaCBcCi0Jc3lzL3RpbWVycy5oIFwKLQlzeXMvdW4uaCBcCi0JdGltZS5oIFwKLQl0bXBkaXIuaCBcCi0JdHR5ZW50LmggXAotCXVjcmVkLmggXAotCXVuaXN0ZC5oIFwKLQl1c2Vyc2VjLmggXAotCXV0aWwuaCBcCi0JdXRpbWUuaCBcCi0JdXRtcC5oIFwKLQl1dG1weC5oIFwKLQl2aXMuaCBcCi0KLWRvIDoKLSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi0KLWRvbmUKLQotCi0jIGxhc3Rsb2cuaCByZXF1aXJlcyBzeXMvdGltZS5oIHRvIGJlIGluY2x1ZGVkIGZpcnN0IG9uIFNvbGFyaXMKLWZvciBhY19oZWFkZXIgaW4gbGFzdGxvZy5oCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJsYXN0bG9nLmgiICJhY19jdl9oZWFkZXJfbGFzdGxvZ19oIiAiCi0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLQotIgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGFzdGxvZ19oIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTEFTVExPR19IIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLQotIyBzeXMvcHRtcy5oIHJlcXVpcmVzIHN5cy9zdHJlYW0uaCB0byBiZSBpbmNsdWRlZCBmaXJzdCBvbiBTb2xhcmlzCi1mb3IgYWNfaGVhZGVyIGluIHN5cy9wdG1zLmgKLWRvIDoKLSAgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgInN5cy9wdG1zLmgiICJhY19jdl9oZWFkZXJfc3lzX3B0bXNfaCIgIgotI2lmZGVmIEhBVkVfU1lTX1NUUkVBTV9ICi0jIGluY2x1ZGUgPHN5cy9zdHJlYW0uaD4KLSNlbmRpZgotCi0iCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zeXNfcHRtc19oIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfU1lTX1BUTVNfSCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi0KLSMgbG9naW5fY2FwLmggcmVxdWlyZXMgc3lzL3R5cGVzLmggb24gTmV0QlNECi1mb3IgYWNfaGVhZGVyIGluIGxvZ2luX2NhcC5oCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJsb2dpbl9jYXAuaCIgImFjX2N2X2hlYWRlcl9sb2dpbl9jYXBfaCIgIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0iCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9sb2dpbl9jYXBfaCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xPR0lOX0NBUF9IIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLQotIyBvbGRlciBCU0RzIG5lZWQgc3lzL3BhcmFtLmggYmVmb3JlIHN5cy9tb3VudC5oCi1mb3IgYWNfaGVhZGVyIGluIHN5cy9tb3VudC5oCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJzeXMvbW91bnQuaCIgImFjX2N2X2hlYWRlcl9zeXNfbW91bnRfaCIgIgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0iCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zeXNfbW91bnRfaCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX1NZU19NT1VOVF9IIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLQotIyBNZXNzYWdlcyBmb3IgZmVhdHVyZXMgdGVzdGVkIGZvciBpbiB0YXJnZXQtc3BlY2lmaWMgc2VjdGlvbgotU0lBX01TRz0ibm8iCi1TUENfTVNHPSJubyIKLVNQX01TRz0ibm8iCi0KLSMgQ2hlY2sgZm9yIHNvbWUgdGFyZ2V0LXNwZWNpZmljIHN0dWZmCi1jYXNlICIkaG9zdCIgaW4KLSotKi1haXgqKQotCSMgU29tZSB2ZXJzaW9ucyBvZiBWQUMgd29uJ3QgYWxsb3cgbWFjcm8gcmVkZWZpbml0aW9ucyBhdAotCSMgLXFsYW5nbGV2ZWw9YW5zaSwgYW5kIGF1dG9jb25mIDIuNjAgc29tZXRpbWVzIGluc2lzdHMgb24gdXNpbmcgdGhhdAotCSMgcGFydGljdWxhcmx5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgdmFjIG9yIHhsYy4KLQkjIEl0IGFsc28gdGhyb3dzIGVycm9ycyBhYm91dCBudWxsIG1hY3JvIGFyZ21lbnRzLCBidXQgdGhlc2UgYXJlCi0JIyBub3QgZmF0YWwuCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBjb21waWxlciBhbGxvd3MgbWFjcm8gcmVkZWZpbml0aW9ucyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiBjb21waWxlciBhbGxvd3MgbWFjcm8gcmVkZWZpbml0aW9ucy4uLiAiID4mNjsgfQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2RlZmluZSB0ZXN0bWFjcm8gZm9vCi0jZGVmaW5lIHRlc3RtYWNybyBiYXIKLWludAotbWFpbiAoKQotewotIGV4aXQoMCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1lbHNlCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQkgICAgICBDQz0iYGVjaG8gJENDIHwgc2VkICdzLy1xbGFuZ2x2bFw9YW5zaS8vZydgIgotCSAgICAgIExEPSJgZWNobyAkTEQgfCBzZWQgJ3MvLXFsYW5nbHZsXD1hbnNpLy9nJ2AiCi0JICAgICAgQ0ZMQUdTPSJgZWNobyAkQ0ZMQUdTIHwgc2VkICdzLy1xbGFuZ2x2bFw9YW5zaS8vZydgIgotCSAgICAgIENQUEZMQUdTPSJgZWNobyAkQ1BQRkxBR1MgfCBzZWQgJ3MvLXFsYW5nbHZsXD1hbnNpLy9nJ2AiCi0KLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gc3BlY2lmeSBibGlicGF0aCBmb3IgbGlua2VyICgkTEQpIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBzcGVjaWZ5IGJsaWJwYXRoIGZvciBsaW5rZXIgKCRMRCkuLi4gIiA+JjY7IH0KLQlpZiAodGVzdCAteiAiJGJsaWJwYXRoIik7IHRoZW4KLQkJYmxpYnBhdGg9Ii91c3IvbGliOi9saWIiCi0JZmkKLQlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKLQlpZiB0ZXN0ICIkR0NDIiA9ICJ5ZXMiOyB0aGVuCi0JCWZsYWdzPSItV2wsLWJsaWJwYXRoOiAtV2wsLXJwYXRoLCAtYmxpYnBhdGg6IgotCWVsc2UKLQkJZmxhZ3M9Ii1ibGlicGF0aDogLVdsLC1ibGlicGF0aDogLVdsLC1ycGF0aCwiCi0JZmkKLQlmb3IgdHJ5ZmxhZ3MgaW4gJGZsYWdzIDtkbwotCQlpZiAodGVzdCAteiAiJGJsaWJmbGFncyIpOyB0aGVuCi0JCQlMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyAkdHJ5ZmxhZ3MkYmxpYnBhdGgiCi0JCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYmxpYmZsYWdzPSR0cnlmbGFncwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0JCWZpCi0JZG9uZQotCWlmICh0ZXN0IC16ICIkYmxpYmZsYWdzIik7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vdCBmb3VuZCIgPiY1Ci0kYXNfZWNobyAibm90IGZvdW5kIiA+JjY7IH0KLQkJYXNfZm5fZXJyb3IgJD8gIioqKiBtdXN0IGJlIGFibGUgdG8gc3BlY2lmeSBibGlicGF0aCBvbiBBSVggLSBjaGVjayBjb25maWcubG9nIiAiJExJTkVOTyIgNQotCWVsc2UKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRibGliZmxhZ3MiID4mNQotJGFzX2VjaG8gIiRibGliZmxhZ3MiID4mNjsgfQotCWZpCi0JTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0JCWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImF1dGhlbnRpY2F0ZSIgImFjX2N2X2Z1bmNfYXV0aGVudGljYXRlIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX2F1dGhlbnRpY2F0ZSIgPSB4eWVzOyB0aGVuIDoKLQotJGFzX2VjaG8gIiNkZWZpbmUgV0lUSF9BSVhBVVRIRU5USUNBVEUgMSIgPj5jb25mZGVmcy5oCi0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYXV0aGVudGljYXRlIGluIC1scyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgYXV0aGVudGljYXRlIGluIC1scy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfc19hdXRoZW50aWNhdGUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHMgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGF1dGhlbnRpY2F0ZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGF1dGhlbnRpY2F0ZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfc19hdXRoZW50aWNhdGU9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9zX2F1dGhlbnRpY2F0ZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc19hdXRoZW50aWNhdGUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfc19hdXRoZW50aWNhdGUiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfc19hdXRoZW50aWNhdGUiID0geHllczsgdGhlbiA6Ci0gICAkYXNfZWNobyAiI2RlZmluZSBXSVRIX0FJWEFVVEhFTlRJQ0FURSAxIiA+PmNvbmZkZWZzLmgKLQotCQkJCUxJQlM9IiRMSUJTIC1scyIKLQotZmkKLQotCi1maQotCi0JCWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgImF1dGhlbnRpY2F0ZSIgImFjX2N2X2hhdmVfZGVjbF9hdXRoZW50aWNhdGUiICIjaW5jbHVkZSA8dXNlcnNlYy5oPgotIgotaWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfYXV0aGVudGljYXRlIiA9IHh5ZXM7IHRoZW4gOgotICBhY19oYXZlX2RlY2w9MQotZWxzZQotICBhY19oYXZlX2RlY2w9MAotZmkKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0RFQ0xfQVVUSEVOVElDQVRFICRhY19oYXZlX2RlY2wKLV9BQ0VPRgotYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAibG9naW5yZXN0cmljdGlvbnMiICJhY19jdl9oYXZlX2RlY2xfbG9naW5yZXN0cmljdGlvbnMiICIjaW5jbHVkZSA8dXNlcnNlYy5oPgotIgotaWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfbG9naW5yZXN0cmljdGlvbnMiID0geHllczsgdGhlbiA6Ci0gIGFjX2hhdmVfZGVjbD0xCi1lbHNlCi0gIGFjX2hhdmVfZGVjbD0wCi1maQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfREVDTF9MT0dJTlJFU1RSSUNUSU9OUyAkYWNfaGF2ZV9kZWNsCi1fQUNFT0YKLWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgImxvZ2luc3VjY2VzcyIgImFjX2N2X2hhdmVfZGVjbF9sb2dpbnN1Y2Nlc3MiICIjaW5jbHVkZSA8dXNlcnNlYy5oPgotIgotaWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfbG9naW5zdWNjZXNzIiA9IHh5ZXM7IHRoZW4gOgotICBhY19oYXZlX2RlY2w9MQotZWxzZQotICBhY19oYXZlX2RlY2w9MAotZmkKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0RFQ0xfTE9HSU5TVUNDRVNTICRhY19oYXZlX2RlY2wKLV9BQ0VPRgotYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAicGFzc3dkZXhwaXJlZCIgImFjX2N2X2hhdmVfZGVjbF9wYXNzd2RleHBpcmVkIiAiI2luY2x1ZGUgPHVzZXJzZWMuaD4KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX3Bhc3N3ZGV4cGlyZWQiID0geHllczsgdGhlbiA6Ci0gIGFjX2hhdmVfZGVjbD0xCi1lbHNlCi0gIGFjX2hhdmVfZGVjbD0wCi1maQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfREVDTF9QQVNTV0RFWFBJUkVEICRhY19oYXZlX2RlY2wKLV9BQ0VPRgotYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAic2V0YXV0aGRiIiAiYWNfY3ZfaGF2ZV9kZWNsX3NldGF1dGhkYiIgIiNpbmNsdWRlIDx1c2Vyc2VjLmg+Ci0iCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9zZXRhdXRoZGIiID0geHllczsgdGhlbiA6Ci0gIGFjX2hhdmVfZGVjbD0xCi1lbHNlCi0gIGFjX2hhdmVfZGVjbD0wCi1maQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfREVDTF9TRVRBVVRIREIgJGFjX2hhdmVfZGVjbAotX0FDRU9GCi0KLQkJYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAibG9naW5mYWlsZWQiICJhY19jdl9oYXZlX2RlY2xfbG9naW5mYWlsZWQiICIjaW5jbHVkZSA8dXNlcnNlYy5oPgotCi0iCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9sb2dpbmZhaWxlZCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfaGF2ZV9kZWNsPTEKLWVsc2UKLSAgYWNfaGF2ZV9kZWNsPTAKLWZpCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ERUNMX0xPR0lORkFJTEVEICRhY19oYXZlX2RlY2wKLV9BQ0VPRgotaWYgdGVzdCAkYWNfaGF2ZV9kZWNsID0gMTsgdGhlbiA6Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgbG9naW5mYWlsZWQgdGFrZXMgNCBhcmd1bWVudHMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgbG9naW5mYWlsZWQgdGFrZXMgNCBhcmd1bWVudHMuLi4gIiA+JjY7IH0KLQkgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDx1c2Vyc2VjLmg+Ci1pbnQKLW1haW4gKCkKLXsKLSAodm9pZClsb2dpbmZhaWxlZCgidXNlciIsImhvc3QiLCJ0dHkiLDApOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0KLSRhc19lY2hvICIjZGVmaW5lIEFJWF9MT0dJTkZBSUxFRF80QVJHIDEiID4+Y29uZmRlZnMuaAotCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0JZm9yIGFjX2Z1bmMgaW4gZ2V0Z3JzZXQgc2V0YXV0aGRiCi1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLWRvbmUKLQotCWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIkZfQ0xPU0VNIiAiYWNfY3ZfaGF2ZV9kZWNsX0ZfQ0xPU0VNIiAiICNpbmNsdWRlIDxsaW1pdHMuaD4KLQkgICAgICAjaW5jbHVkZSA8ZmNudGwuaD4KLQotIgotaWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfRl9DTE9TRU0iID0geHllczsgdGhlbiA6Ci0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfRkNOVExfQ0xPU0VNIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0JY2hlY2tfZm9yX2FpeF9icm9rZW5fZ2V0YWRkcmluZm89MQotCi0kYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fUkVBTFBBVEggMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgU0VURVVJRF9CUkVBS1NfU0VUVUlEIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRVVJRCAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9MQVNUTE9HIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIExPR0lOX05FRURTX1VUTVBYIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIFNQVF9UWVBFIFNQVF9SRVVTRUFSR1YiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIFNTSFBBTV9DSEFVVEhUT0tfTkVFRFNfUlVJRCAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBQVFlfWkVST1JFQUQgMSIgPj5jb25mZGVmcy5oCi0KLQk7OwotKi0qLWN5Z3dpbiopCi0JY2hlY2tfZm9yX2xpYmNyeXB0X2xhdGVyPTEKLQlMSUJTPSIkTElCUyAvdXNyL2xpYi90ZXh0cmVhZG1vZGUubyIKLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9DWUdXSU4gMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1BJUEVTIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfU0hBRE9XIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIE5PX1gxMV9VTklYX1NPQ0tFVFMgMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgTk9fSVBQT1JUX1JFU0VSVkVEX0NPTkNFUFQgMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9GRF9QQVNTSU5HIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIFNTSF9JT0JVRlNaIDY1NTM1IiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBGSUxFU1lTVEVNX05PX0JBQ0tTTEFTSCAxIiA+PmNvbmZkZWZzLmgKLQotCTs7Ci0qLSotZGd1eCopCi0KLSRhc19lY2hvICIjZGVmaW5lIElQX1RPU19JU19CUk9LRU4gMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBTRVRFVUlEX0JSRUFLU19TRVRVSUQgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVVSUQgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCi0KLQk7OwotKi0qLWRhcndpbiopCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBoYXZlIHdvcmtpbmcgZ2V0YWRkcmluZm8iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgaGF2ZSB3b3JraW5nIGdldGFkZHJpbmZvLi4uICIgPiY2OyB9Ci0JaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogYXNzdW1lIGl0IGlzIHdvcmtpbmciID4mNQotJGFzX2VjaG8gImFzc3VtZSBpdCBpcyB3b3JraW5nIiA+JjY7IH0KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxtYWNoLW8vZHlsZC5oPgotbWFpbigpIHsgaWYgKE5TVmVyc2lvbk9mUnVuVGltZUxpYnJhcnkoIlN5c3RlbSIpID49ICg2MCA8PCAxNikpCi0JCWV4aXQoMCk7Ci0JZWxzZQotCQlleGl0KDEpOwotfQotCi1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogd29ya2luZyIgPiY1Ci0kYXNfZWNobyAid29ya2luZyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBidWdneSIgPiY1Ci0kYXNfZWNobyAiYnVnZ3kiID4mNjsgfQotCi0kYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fR0VUQUREUklORk8gMSIgPj5jb25mZGVmcy5oCi0KLQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQkkYXNfZWNobyAiI2RlZmluZSBTRVRFVUlEX0JSRUFLU19TRVRVSUQgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVVSUQgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX0dMT0IgMSIgPj5jb25mZGVmcy5oCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBCSU5EXzhfQ09NUEFUIDEKLV9BQ0VPRgotCi0KLSRhc19lY2hvICIjZGVmaW5lIFNTSF9UVU5fRlJFRUJTRCAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBTU0hfVFVOX0NPTVBBVF9BRiAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBTU0hfVFVOX1BSRVBFTkRfQUYgMSIgPj5jb25mZGVmcy5oCi0KLQotCWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIkFVX0lQdjQiICJhY19jdl9oYXZlX2RlY2xfQVVfSVB2NCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfQVVfSVB2NCIgPSB4eWVzOyB0aGVuIDoKLQotZWxzZQotCi0kYXNfZWNobyAiI2RlZmluZSBBVV9JUHY0IDAiID4+Y29uZmRlZnMuaAotCi0JICAgICNpbmNsdWRlIDxic20vYXVkaXQuaD4KLQotJGFzX2VjaG8gIiNkZWZpbmUgTEFTVExPR19XUklURV9QVVRVVFhMSU5FIDEiID4+Y29uZmRlZnMuaAotCi0KLWZpCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgU1BUX1RZUEUgU1BUX1JFVVNFQVJHViIgPj5jb25mZGVmcy5oCi0KLQlmb3IgYWNfZnVuYyBpbiBzYW5kYm94X2luaXQKLWRvIDoKLSAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic2FuZGJveF9pbml0IiAiYWNfY3ZfZnVuY19zYW5kYm94X2luaXQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2FuZGJveF9pbml0IiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfU0FOREJPWF9JTklUIDEKLV9BQ0VPRgotCi1maQotZG9uZQotCi0JZm9yIGFjX2hlYWRlciBpbiBzYW5kYm94LmgKLWRvIDoKLSAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInNhbmRib3guaCIgImFjX2N2X2hlYWRlcl9zYW5kYm94X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3NhbmRib3hfaCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX1NBTkRCT1hfSCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi0JOzsKLSotKi1kcmFnb25mbHkqKQotCVNTSERMSUJTPSIkU1NIRExJQlMgLWxjcnlwdCIKLQk7OwotKi0qLWhhaWt1KikKLSAgICBMSUJTPSIkTElCUyAtbGJzZCAiCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc29ja2V0IGluIC1sbmV0d29yayIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc29ja2V0IGluIC1sbmV0d29yay4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfbmV0d29ya19zb2NrZXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbG5ldHdvcmsgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHNvY2tldCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIHNvY2tldCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfbmV0d29ya19zb2NrZXQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9uZXR3b3JrX3NvY2tldD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfbmV0d29ya19zb2NrZXQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfbmV0d29ya19zb2NrZXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfbmV0d29ya19zb2NrZXQiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJORVRXT1JLIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1sbmV0d29yayAkTElCUyIKLQotZmkKLQotICAgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfVV9JTlQ2NF9UIDEiID4+Y29uZmRlZnMuaAotCi0gICAgTUFOVFlQRT1tYW4KLSAgICA7OwotKi0qLWhwdXgqKQotCSMgZmlyc3Qgd2UgZGVmaW5lIGFsbCBvZiB0aGUgb3B0aW9ucyBjb21tb24gdG8gYWxsIEhQLVVYIHJlbGVhc2VzCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9IUFVYX1NPVVJDRSAtRF9YT1BFTl9TT1VSQ0UgLURfWE9QRU5fU09VUkNFX0VYVEVOREVEPTEiCi0JSVBBRERSX0lOX0RJU1BMQVk9eWVzCi0JJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1BJUEVTIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIExPR0lOX05PX0VORE9QVCAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIExPR0lOX05FRURTX1VUTVBYIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIExPQ0tFRF9QQVNTV0RfU1RSSU5HIFwiKlwiIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIFNQVF9UWVBFIFNQVF9QU1RBVCIgPj5jb25mZGVmcy5oCi0KLQltYWlsZGlyPSIvdmFyL21haWwiCi0JTElCUz0iJExJQlMgLWxzZWMiCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdF9lcnJvciBpbiAtbHhuZXQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHRfZXJyb3IgaW4gLWx4bmV0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl94bmV0X3RfZXJyb3IrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHhuZXQgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHRfZXJyb3IgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiB0X2Vycm9yICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl94bmV0X3RfZXJyb3I9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl94bmV0X3RfZXJyb3I9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3huZXRfdF9lcnJvciIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl94bmV0X3RfZXJyb3IiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfeG5ldF90X2Vycm9yIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTElCWE5FVCAxCi1fQUNFT0YKLQotICBMSUJTPSItbHhuZXQgJExJQlMiCi0KLWVsc2UKLSAgYXNfZm5fZXJyb3IgJD8gIioqKiAtbHhuZXQgbmVlZGVkIG9uIEhQLVVYIC0gY2hlY2sgY29uZmlnLmxvZyAqKioiICIkTElORU5PIiA1Ci1maQotCi0KLQkjIG5leHQsIHdlIGRlZmluZSBhbGwgb2YgdGhlIG9wdGlvbnMgc3BlY2lmaWMgdG8gbWFqb3IgcmVsZWFzZXMKLQljYXNlICIkaG9zdCIgaW4KLQkqLSotaHB1eDEwKikKLQkJaWYgdGVzdCAteiAiJEdDQyI7IHRoZW4KLQkJCUNGTEFHUz0iJENGTEFHUyAtQWUiCi0JCWZpCi0JCTs7Ci0JKi0qLWhwdXgxMSopCi0KLSRhc19lY2hvICIjZGVmaW5lIFBBTV9TVU5fQ09ERUJBU0UgMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9VVE1QIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIFVTRV9CVE1QIDEiID4+Y29uZmRlZnMuaAotCi0JCWNoZWNrX2Zvcl9ocHV4X2Jyb2tlbl9nZXRhZGRyaW5mbz0xCi0JCWNoZWNrX2Zvcl9jb25mbGljdGluZ19nZXRzcG5hbT0xCi0JCTs7Ci0JZXNhYwotCi0JIyBsYXN0bHksIHdlIGRlZmluZSBvcHRpb25zIHNwZWNpZmljIHRvIG1pbm9yIHJlbGVhc2VzCi0JY2FzZSAiJGhvc3QiIGluCi0JKi0qLWhwdXgxMC4yNikKLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TRUNVUkVXQVJFIDEiID4+Y29uZmRlZnMuaAotCi0JCWRpc2FibGVfcHRteF9jaGVjaz15ZXMKLQkJTElCUz0iJExJQlMgLWxzZWNwdyIKLQkJOzsKLQllc2FjCi0JOzsKLSotKi1pcml4NSopCi0JUEFUSD0iJFBBVEg6L3Vzci9ldGMiCi0KLSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9JTkVUX05UT0EgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBTRVRFVUlEX0JSRUFLU19TRVRVSUQgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVVSUQgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgV0lUSF9BQkJSRVZfTk9fVFRZIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgTE9DS0VEX1BBU1NXRF9TVFJJTkcgXCIqTEsqXCIiID4+Y29uZmRlZnMuaAotCi0JOzsKLSotKi1pcml4NiopCi0JUEFUSD0iJFBBVEg6L3Vzci9ldGMiCi0KLSRhc19lY2hvICIjZGVmaW5lIFdJVEhfSVJJWF9BUlJBWSAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBXSVRIX0lSSVhfUFJPSkVDVCAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBXSVRIX0lSSVhfQVVESVQgMSIgPj5jb25mZGVmcy5oCi0KLQlhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJqbGltaXRfc3RhcnRqb2IiICJhY19jdl9mdW5jX2psaW1pdF9zdGFydGpvYiIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19qbGltaXRfc3RhcnRqb2IiID0geHllczsgdGhlbiA6Ci0KLSRhc19lY2hvICIjZGVmaW5lIFdJVEhfSVJJWF9KT0JTIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0JJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX0lORVRfTlRPQSAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIFNFVEVVSURfQlJFQUtTX1NFVFVJRCAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRVVJRCAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRUdJRCAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fVVBEV1RNUFggMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBXSVRIX0FCQlJFVl9OT19UVFkgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBMT0NLRURfUEFTU1dEX1NUUklORyBcIipMSypcIiIgPj5jb25mZGVmcy5oCi0KLQk7OwotKi0qLWsqYnNkKi1nbnUgfCAqLSota29wZW5zb2xhcmlzKi1nbnUpCi0JY2hlY2tfZm9yX2xpYmNyeXB0X2xhdGVyPTEKLQkkYXNfZWNobyAiI2RlZmluZSBQQU1fVFRZX0tMVURHRSAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIExPQ0tFRF9QQVNTV0RfUFJFRklYIFwiIVwiIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIFNQVF9UWVBFIFNQVF9SRVVTRUFSR1YiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIF9QQVRIX0JUTVAgXCIvdmFyL2xvZy9idG1wXCIiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIFVTRV9CVE1QIDEiID4+Y29uZmRlZnMuaAotCi0JOzsKLSotKi1saW51eCopCi0Jbm9fZGV2X3B0bXg9MQotCWNoZWNrX2Zvcl9saWJjcnlwdF9sYXRlcj0xCi0JY2hlY2tfZm9yX29wZW5wdHlfY3R0eV9idWc9MQotCi0kYXNfZWNobyAiI2RlZmluZSBQQU1fVFRZX0tMVURHRSAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBMT0NLRURfUEFTU1dEX1BSRUZJWCBcIiFcIiIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBTUFRfVFlQRSBTUFRfUkVVU0VBUkdWIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBMSU5LX09QTk9UU1VQUF9FUlJOTyBFUEVSTSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgX1BBVEhfQlRNUCBcIi92YXIvbG9nL2J0bXBcIiIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBVU0VfQlRNUCAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBMSU5VWF9PT01fQURKVVNUIDEiID4+Y29uZmRlZnMuaAotCi0JaW5ldDZfZGVmYXVsdF80aW42PXllcwotCWNhc2UgYHVuYW1lIC1yYCBpbgotCTEuKnwyLjAuKikKLQotJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX0NNU0dfVFlQRSAxIiA+PmNvbmZkZWZzLmgKLQotCQk7OwotCWVzYWMKLQkjIHR1big0KSBmb3J3YXJkaW5nIGNvbXBhdCBjb2RlCi0JZm9yIGFjX2hlYWRlciBpbiBsaW51eC9pZl90dW4uaAotZG8gOgotICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibGludXgvaWZfdHVuLmgiICJhY19jdl9oZWFkZXJfbGludXhfaWZfdHVuX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X2lmX3R1bl9oIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTElOVVhfSUZfVFVOX0ggMQotX0FDRU9GCi0KLWZpCi0KLWRvbmUKLQotCWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X2lmX3R1bl9oIiA9ICJ4eWVzIiA7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgU1NIX1RVTl9MSU5VWCAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBTU0hfVFVOX0NPTVBBVF9BRiAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBTU0hfVFVOX1BSRVBFTkRfQUYgMSIgPj5jb25mZGVmcy5oCi0KLQlmaQotCTs7Ci1taXBzLXNvbnktYnNkfG1pcHMtc29ueS1uZXdzb3M0KQotCi0kYXNfZWNobyAiI2RlZmluZSBORUVEX1NFVFBHUlAgMSIgPj5jb25mZGVmcy5oCi0KLQlTT05ZPTEKLQk7OwotKi0qLW5ldGJzZCopCi0JY2hlY2tfZm9yX2xpYmNyeXB0X2JlZm9yZT0xCi0JaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQkJbmVlZF9kYXNoX3I9MQotCWZpCi0KLSRhc19lY2hvICIjZGVmaW5lIFNTSF9UVU5fRlJFRUJTRCAxIiA+PmNvbmZkZWZzLmgKLQotCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJuZXQvaWZfdGFwLmgiICJhY19jdl9oZWFkZXJfbmV0X2lmX3RhcF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9uZXRfaWZfdGFwX2giID0geHllczsgdGhlbiA6Ci0KLWVsc2UKLQotJGFzX2VjaG8gIiNkZWZpbmUgU1NIX1RVTl9OT19MMiAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi0KLSRhc19lY2hvICIjZGVmaW5lIFNTSF9UVU5fUFJFUEVORF9BRiAxIiA+PmNvbmZkZWZzLmgKLQotCTs7Ci0qLSotZnJlZWJzZCopCi0JY2hlY2tfZm9yX2xpYmNyeXB0X2xhdGVyPTEKLQotJGFzX2VjaG8gIiNkZWZpbmUgTE9DS0VEX1BBU1NXRF9QUkVGSVggXCIqTE9DS0VEKlwiIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBTU0hfVFVOX0ZSRUVCU0QgMSIgPj5jb25mZGVmcy5oCi0KLQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibmV0L2lmX3RhcC5oIiAiYWNfY3ZfaGVhZGVyX25ldF9pZl90YXBfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbmV0X2lmX3RhcF9oIiA9IHh5ZXM7IHRoZW4gOgotCi1lbHNlCi0KLSRhc19lY2hvICIjZGVmaW5lIFNTSF9UVU5fTk9fTDIgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotCi0kYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fR0xPQiAxIiA+PmNvbmZkZWZzLmgKLQotCTs7Ci0qLSotYnNkaSopCi0JJGFzX2VjaG8gIiNkZWZpbmUgU0VURVVJRF9CUkVBS1NfU0VUVUlEIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFVUlEIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFR0lEIDEiID4+Y29uZmRlZnMuaAotCi0JOzsKLSotbmV4dC0qKQotCWNvbmZfbGFzdGxvZ19sb2NhdGlvbj0iL3Vzci9hZG0vbGFzdGxvZyIKLQljb25mX3V0bXBfbG9jYXRpb249L2V0Yy91dG1wCi0JY29uZl93dG1wX2xvY2F0aW9uPS91c3IvYWRtL3d0bXAKLQltYWlsZGlyPS91c3Ivc3Bvb2wvbWFpbAotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX05FWFQgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fUkVBTFBBVEggMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBVU0VfUElQRVMgMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NBVkVEX1VJRFMgMSIgPj5jb25mZGVmcy5oCi0KLQk7OwotKi0qLW9wZW5ic2QqKQotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0FUVFJJQlVURV9fU0VOVElORUxfXyAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0FUVFJJQlVURV9fQk9VTkRFRF9fIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIFNTSF9UVU5fT1BFTkJTRCAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBTWVNMT0dfUl9TQUZFX0lOX1NJR0hBTkQgMSIgPj5jb25mZGVmcy5oCi0KLQk7OwotKi0qLXNvbGFyaXMqKQotCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCi0JCW5lZWRfZGFzaF9yPTEKLQlmaQotCSRhc19lY2hvICIjZGVmaW5lIFBBTV9TVU5fQ09ERUJBU0UgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBMT0dJTl9ORUVEU19VVE1QWCAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBMT0dJTl9ORUVEU19URVJNIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgUEFNX1RUWV9LTFVER0UgMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgU1NIUEFNX0NIQVVUSFRPS19ORUVEU19SVUlEIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgTE9DS0VEX1BBU1NXRF9TVFJJTkcgXCIqTEsqXCIiID4+Y29uZmRlZnMuaAotCi0JIyBQdXNoaW5nIFNUUkVBTVMgbW9kdWxlcyB3aWxsIGNhdXNlIHNzaGQgdG8gYWNxdWlyZSBhIGNvbnRyb2xsaW5nIHR0eS4KLQotJGFzX2VjaG8gIiNkZWZpbmUgU1NIRF9BQ1FVSVJFU19DVFRZIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIFBBU1NXRF9ORUVEU19VU0VSTkFNRSAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fVENHRVRBVFRSX0lDQU5PTiAxIiA+PmNvbmZkZWZzLmgKLQotCWV4dGVybmFsX3BhdGhfZmlsZT0vZXRjL2RlZmF1bHQvbG9naW4KLQkjIGhhcmR3aXJlIGxhc3Rsb2cgbG9jYXRpb24gKGNhbid0IGRldGVjdCBpdCBvbiBzb21lIHZlcnNpb25zKQotCWNvbmZfbGFzdGxvZ19sb2NhdGlvbj0iL3Zhci9hZG0vbGFzdGxvZyIKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBvYnNvbGV0ZSB1dG1wIGFuZCB3dG1wIGluIHNvbGFyaXMyLngiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG9ic29sZXRlIHV0bXAgYW5kIHd0bXAgaW4gc29sYXJpczIueC4uLiAiID4mNjsgfQotCXNvbDJ2ZXI9YGVjaG8gIiRob3N0Inwgc2VkIC1lICdzLy4qWzAtOV1cLi8vJ2AKLQlpZiB0ZXN0ICIkc29sMnZlciIgLWdlIDg7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQkJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9VVE1QIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfV1RNUCAxIiA+PmNvbmZkZWZzLmgKLQotCWVsc2UKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0JZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zb2xhcmlzLWNvbnRyYWN0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfc29sYXJpc19jb250cmFjdHMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3NvbGFyaXNfY29udHJhY3RzOwotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjdF90bXBsX2FjdGl2YXRlIGluIC1sY29udHJhY3QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGN0X3RtcGxfYWN0aXZhdGUgaW4gLWxjb250cmFjdC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfY29udHJhY3RfY3RfdG1wbF9hY3RpdmF0ZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sY29udHJhY3QgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGN0X3RtcGxfYWN0aXZhdGUgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBjdF90bXBsX2FjdGl2YXRlICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9jb250cmFjdF9jdF90bXBsX2FjdGl2YXRlPXllcwotZWxzZQotICBhY19jdl9saWJfY29udHJhY3RfY3RfdG1wbF9hY3RpdmF0ZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfY29udHJhY3RfY3RfdG1wbF9hY3RpdmF0ZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9jb250cmFjdF9jdF90bXBsX2FjdGl2YXRlIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2NvbnRyYWN0X2N0X3RtcGxfYWN0aXZhdGUiID0geHllczsgdGhlbiA6Ci0KLSRhc19lY2hvICIjZGVmaW5lIFVTRV9TT0xBUklTX1BST0NFU1NfQ09OVFJBQ1RTIDEiID4+Y29uZmRlZnMuaAotCi0JCQkgIFNTSERMSUJTPSIkU1NIRExJQlMgLWxjb250cmFjdCIKLQkJCSAgU1BDX01TRz0ieWVzIgotZmkKLQotCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc29sYXJpcy1wcm9qZWN0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfc29sYXJpc19wcm9qZWN0cytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfc29sYXJpc19wcm9qZWN0czsKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc2V0cHJvamVjdCBpbiAtbHByb2plY3QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNldHByb2plY3QgaW4gLWxwcm9qZWN0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9wcm9qZWN0X3NldHByb2plY3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHByb2plY3QgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHNldHByb2plY3QgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBzZXRwcm9qZWN0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9wcm9qZWN0X3NldHByb2plY3Q9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9wcm9qZWN0X3NldHByb2plY3Q9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3Byb2plY3Rfc2V0cHJvamVjdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9wcm9qZWN0X3NldHByb2plY3QiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfcHJvamVjdF9zZXRwcm9qZWN0IiA9IHh5ZXM7IHRoZW4gOgotCi0kYXNfZWNobyAiI2RlZmluZSBVU0VfU09MQVJJU19QUk9KRUNUUyAxIiA+PmNvbmZkZWZzLmgKLQotCQkJU1NIRExJQlM9IiRTU0hETElCUyAtbHByb2plY3QiCi0JCQlTUF9NU0c9InllcyIKLWZpCi0KLQotZmkKLQotCTs7Ci0qLSotc3Vub3M0KikKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EU1VOT1M0IgotCWZvciBhY19mdW5jIGluIGdldHB3YW5hbQotZG8gOgotICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRwd2FuYW0iICJhY19jdl9mdW5jX2dldHB3YW5hbSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRwd2FuYW0iID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9HRVRQV0FOQU0gMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLQkkYXNfZWNobyAiI2RlZmluZSBQQU1fU1VOX0NPREVCQVNFIDEiID4+Y29uZmRlZnMuaAotCi0JY29uZl91dG1wX2xvY2F0aW9uPS9ldGMvdXRtcAotCWNvbmZfd3RtcF9sb2NhdGlvbj0vdmFyL2FkbS93dG1wCi0JY29uZl9sYXN0bG9nX2xvY2F0aW9uPS92YXIvYWRtL2xhc3Rsb2cKLQkkYXNfZWNobyAiI2RlZmluZSBVU0VfUElQRVMgMSIgPj5jb25mZGVmcy5oCi0KLQk7OwotKi1uY3Itc3lzdiopCi0JTElCUz0iJExJQlMgLWxjODkiCi0JJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1BJUEVTIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgU1NIRF9BQ1FVSVJFU19DVFRZIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgU0VURVVJRF9CUkVBS1NfU0VUVUlEIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFVUlEIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFR0lEIDEiID4+Y29uZmRlZnMuaAotCi0JOzsKLSotc25pLXN5c3YqKQotCSMgL3Vzci91Y2JsaWIgTVVTVCBOT1QgYmUgc2VhcmNoZWQgb24gUmVsaWFudFVOSVgKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbHN5bSBpbiAtbGRsIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbHN5bSBpbiAtbGRsLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9kbF9kbHN5bSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sZGwgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRsc3ltICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZGxzeW0gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2RsX2Rsc3ltPXllcwotZWxzZQotICBhY19jdl9saWJfZGxfZGxzeW09bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsc3ltIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2RsX2Rsc3ltIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2RsX2Rsc3ltIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTElCREwgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxkbCAkTElCUyIKLQotZmkKLQotCSMgLWxyZXNvbHYgbmVlZHMgdG8gYmUgYXQgdGhlIGVuZCBvZiBMSUJTIG9yIEROUyBsb29rdXBzIGJyZWFrCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcmVzX3F1ZXJ5IGluIC1scmVzb2x2IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciByZXNfcXVlcnkgaW4gLWxyZXNvbHYuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3Jlc29sdl9yZXNfcXVlcnkrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHJlc29sdiAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgcmVzX3F1ZXJ5ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcmVzX3F1ZXJ5ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9yZXNvbHZfcmVzX3F1ZXJ5PXllcwotZWxzZQotICBhY19jdl9saWJfcmVzb2x2X3Jlc19xdWVyeT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcmVzb2x2X3Jlc19xdWVyeSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9yZXNvbHZfcmVzX3F1ZXJ5IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3Jlc29sdl9yZXNfcXVlcnkiID0geHllczsgdGhlbiA6Ci0gICBMSUJTPSIkTElCUyAtbHJlc29sdiIKLWZpCi0KLQlJUEFERFJfSU5fRElTUExBWT15ZXMKLQkkYXNfZWNobyAiI2RlZmluZSBVU0VfUElQRVMgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBJUF9UT1NfSVNfQlJPS0VOIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgU0VURVVJRF9CUkVBS1NfU0VUVUlEIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFVUlEIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFR0lEIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgU1NIRF9BQ1FVSVJFU19DVFRZIDEiID4+Y29uZmRlZnMuaAotCi0JZXh0ZXJuYWxfcGF0aF9maWxlPS9ldGMvZGVmYXVsdC9sb2dpbgotCSMgL3Vzci91Y2JsaWIvbGlidWNiLmEgbm8gbG9uZ2VyIG5lZWRlZCBvbiBSZWxpYW50VU5JWAotCSMgQXR0ZW50aW9uOiBhbHdheXMgdGFrZSBjYXJlIHRvIGJpbmQgbGlic29ja2V0IGFuZCBsaWJuc2wgYmVmb3JlIGxpYmMsCi0JIyBvdGhlcndpc2UgeW91IHdpbGwgZmluZCBsb3RzIG9mICJTSU9DR1BHUlAgZXJybm8gMjIiIG9uIHN5c2xvZwotCTs7Ci0jIFVuaXhXYXJlIDEueCwgVW5peFdhcmUgMi54LCBhbmQgb3RoZXJzIGJhc2VkIG9uIGNvZGUgZnJvbSBVbml2ZWwuCi0qLSotc3lzdjQuMiopCi0JJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1BJUEVTIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgU0VURVVJRF9CUkVBS1NfU0VUVUlEIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFVUlEIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFR0lEIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIFBBU1NXRF9ORUVEU19VU0VSTkFNRSAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIExPQ0tFRF9QQVNTV0RfU1RSSU5HIFwiKkxLKlwiIiA+PmNvbmZkZWZzLmgKLQotCTs7Ci0jIFVuaXhXYXJlIDcueCwgT3BlblVOSVggOAotKi0qLXN5c3Y1KikKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EdnNucHJpbnRmPV94dnNucHJpbnRmIC1Ec25wcmludGY9X3hzbnByaW50ZiIKLQotJGFzX2VjaG8gIiNkZWZpbmUgVU5JWFdBUkVfTE9OR19QQVNTV09SRFMgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBVU0VfUElQRVMgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBTRVRFVUlEX0JSRUFLU19TRVRVSUQgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fR0VUQUREUklORk8gMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVVSUQgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBQQVNTV0RfTkVFRFNfVVNFUk5BTUUgMSIgPj5jb25mZGVmcy5oCi0KLQljYXNlICIkaG9zdCIgaW4KLQkqLSotc3lzdjVTQ09fU1YqKQkjIFNDTyBPcGVuU2VydmVyIDYueAotCQltYWlsZGlyPS92YXIvc3Bvb2wvbWFpbAotCQlURVNUX1NIRUxMPS91OTUvYmluL3NoCi0KLSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9MSUJJQUYgMSIgPj5jb25mZGVmcy5oCi0KLQkJJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1VQRFdUTVBYIDEiID4+Y29uZmRlZnMuaAotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdldGx1aWQgaW4gLWxwcm90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBnZXRsdWlkIGluIC1scHJvdC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfcHJvdF9nZXRsdWlkKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxwcm90ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBnZXRsdWlkICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZ2V0bHVpZCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfcHJvdF9nZXRsdWlkPXllcwotZWxzZQotICBhY19jdl9saWJfcHJvdF9nZXRsdWlkPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9wcm90X2dldGx1aWQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfcHJvdF9nZXRsdWlkIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3Byb3RfZ2V0bHVpZCIgPSB4eWVzOyB0aGVuIDoKLSAgIExJQlM9IiRMSUJTIC1scHJvdCIKLQkJCWZvciBhY19mdW5jIGluIGdldGx1aWQgc2V0bHVpZAotZG8gOgotICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLQkJCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfU0VDVVJFV0FSRSAxIiA+PmNvbmZkZWZzLmgKLQotCQkJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9TSEFET1cgMSIgPj5jb25mZGVmcy5oCi0KLQotZmkKLQotCQk7OwotCSopCSRhc19lY2hvICIjZGVmaW5lIExPQ0tFRF9QQVNTV0RfU1RSSU5HIFwiKkxLKlwiIiA+PmNvbmZkZWZzLmgKLQotCQljaGVja19mb3JfbGliY3J5cHRfbGF0ZXI9MQotCQk7OwotCWVzYWMKLQk7OwotKi0qLXN5c3YqKQotCTs7Ci0jIFNDTyBVTklYIGFuZCBPRU0gdmVyc2lvbnMgb2YgU0NPIFVOSVgKLSotKi1zY28zLjJ2NCopCi0JYXNfZm5fZXJyb3IgJD8gIlwiVGhpcyBQbGF0Zm9ybSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLlwiIiAiJExJTkVOTyIgNQotCTs7Ci0jIFNDTyBPcGVuU2VydmVyIDUueAotKi0qLXNjbzMuMnY1KikKLQlpZiB0ZXN0IC16ICIkR0NDIjsgdGhlbgotCQlDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0JZmkKLQlMSUJTPSIkTElCUyAtbHByb3QgLWx4IC1sdGluZm8gLWxtIgotCW5vX2Rldl9wdG14PTEKLQkkYXNfZWNobyAiI2RlZmluZSBVU0VfUElQRVMgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBIQVZFX1NFQ1VSRVdBUkUgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX1NIQURPVyAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfRkRfUEFTU0lORyAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIFNFVEVVSURfQlJFQUtTX1NFVFVJRCAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9HRVRBRERSSU5GTyAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRVVJRCAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRUdJRCAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIFdJVEhfQUJCUkVWX05PX1RUWSAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9VUERXVE1QWCAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIFBBU1NXRF9ORUVEU19VU0VSTkFNRSAxIiA+PmNvbmZkZWZzLmgKLQotCWZvciBhY19mdW5jIGluIGdldGx1aWQgc2V0bHVpZAotZG8gOgotICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLQlNQU5UWVBFPW1hbgotCVRFU1RfU0hFTEw9a3NoCi0JOzsKLSotKi11bmljb3NtayopCi0KLSRhc19lY2hvICIjZGVmaW5lIE5PX1NTSF9MQVNUTE9HIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgU0VURVVJRF9CUkVBS1NfU0VUVUlEIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFVUlEIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFJFR0lEIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1BJUEVTIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9GRF9QQVNTSU5HIDEiID4+Y29uZmRlZnMuaAotCi0JTERGTEFHUz0iJExERkxBR1MiCi0JTElCUz0iJExJQlMgLWxnZW4gLWxyc2MgLWxzaGFyZSAtbHVleCAtbGFjbSIKLQlNQU5UWVBFPWNhdAotCTs7Ci0qLSotdW5pY29zbXAqKQotCSRhc19lY2hvICIjZGVmaW5lIFNFVEVVSURfQlJFQUtTX1NFVFVJRCAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRVVJRCAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRUdJRCAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIFdJVEhfQUJCUkVWX05PX1RUWSAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIFVTRV9QSVBFUyAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfRkRfUEFTU0lORyAxIiA+PmNvbmZkZWZzLmgKLQotCUxERkxBR1M9IiRMREZMQUdTIgotCUxJQlM9IiRMSUJTIC1sZ2VuIC1sYWNpZCAtbGRiIgotCU1BTlRZUEU9Y2F0Ci0JOzsKLSotKi11bmljb3MqKQotCSRhc19lY2hvICIjZGVmaW5lIFNFVEVVSURfQlJFQUtTX1NFVFVJRCAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRVVJRCAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRUdJRCAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIFVTRV9QSVBFUyAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfRkRfUEFTU0lORyAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIE5PX1NTSF9MQVNUTE9HIDEiID4+Y29uZmRlZnMuaAotCi0JTERGTEFHUz0iJExERkxBR1MgLVdsLC1EbXNnbGV2ZWw9MzM0OmZhdGFsIgotCUxJQlM9IiRMSUJTIC1sZ2VuIC1scnNjIC1sc2hhcmUgLWx1ZXggLWxhY20iCi0JTUFOVFlQRT1jYXQKLQk7OwotKi1kZWMtb3NmKikKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBEaWdpdGFsIFVuaXggU0lBIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBEaWdpdGFsIFVuaXggU0lBLi4uICIgPiY2OyB9Ci0Jbm9fb3Nmc2lhPSIiCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtb3Nmc2lhIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9vc2ZzaWErc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX29zZnNpYTsKLQkJCWlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIiA7IHRoZW4KLQkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogZGlzYWJsZWQiID4mNQotJGFzX2VjaG8gImRpc2FibGVkIiA+JjY7IH0KLQkJCQlub19vc2ZzaWE9MQotCQkJZmkKLQotZmkKLQotCWlmIHRlc3QgLXogIiRub19vc2ZzaWEiIDsgdGhlbgotCQlpZiB0ZXN0IC1mIC9ldGMvc2lhL21hdHJpeC5jb25mOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX09TRl9TSUEgMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9MT0dJTiAxIiA+PmNvbmZkZWZzLmgKLQotCQkJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9GRF9QQVNTSU5HIDEiID4+Y29uZmRlZnMuaAotCi0JCQlMSUJTPSIkTElCUyAtbHNlY3VyaXR5IC1sZGIgLWxtIC1sYXVkIgotCQkJU0lBX01TRz0ieWVzIgotCQllbHNlCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQotJGFzX2VjaG8gIiNkZWZpbmUgTE9DS0VEX1BBU1NXRF9TVUJTVFIgXCJOb2xvZ2luXCIiID4+Y29uZmRlZnMuaAotCi0JCWZpCi0JZmkKLQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fR0VUQUREUklORk8gMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBTRVRFVUlEX0JSRUFLU19TRVRVSUQgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVVSUQgMSIgPj5jb25mZGVmcy5oCi0KLQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVHSUQgMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1JFQURWX0NPTVBBUklTT04gMSIgPj5jb25mZGVmcy5oCi0KLQk7OwotCi0qLSotbnRvLXFueCopCi0JJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1BJUEVTIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgTk9fWDExX1VOSVhfU09DS0VUUyAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBNSVNTSU5HX05GREJJVFMgMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgTUlTU0lOR19IT1dNQU5ZIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIE1JU1NJTkdfRkRfTUFTSyAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfTEFTVExPRyAxIiA+PmNvbmZkZWZzLmgKLQotCSRhc19lY2hvICIjZGVmaW5lIFNTSERfQUNRVUlSRVNfQ1RUWSAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0hBRE9XX0VYUElSRSAxIiA+PmNvbmZkZWZzLmgKLQotCWVuYWJsZV9ldGNfZGVmYXVsdF9sb2dpbj1ubwkjIGhhcyBpbmNvbXBhdGlibGUgL2V0Yy9kZWZhdWx0L2xvZ2luCi0JY2FzZSAiJGhvc3QiIGluCi0JKi0qLW50by1xbng2KikKLQkJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9GRF9QQVNTSU5HIDEiID4+Y29uZmRlZnMuaAotCi0JCTs7Ci0JZXNhYwotCTs7Ci0KLSotKi11bHRyaXgqKQotCi0kYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fR0VUR1JPVVBTIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9NTUFQIDEiID4+Y29uZmRlZnMuaAotCi0JJGFzX2VjaG8gIiNkZWZpbmUgTkVFRF9TRVRQR1JQIDEiID4+Y29uZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1lTX1NZU0xPR19IIDEiID4+Y29uZmRlZnMuaAotCi0JOzsKLQotKi0qLWx5bnhvcykKLSAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1EX19OT19JTkNMVURFX1dBUk5fXyIKLQkkYXNfZWNobyAiI2RlZmluZSBNSVNTSU5HX0hPV01BTlkgMSIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NFVFZCVUYgMSIgPj5jb25mZGVmcy5oCi0KLSAgICAgICAgOzsKLWVzYWMKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBjb21waWxlciBhbmQgZmxhZ3MgZm9yIHNhbml0eSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBjb21waWxlciBhbmQgZmxhZ3MgZm9yIHNhbml0eS4uLiAiID4mNjsgfQotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyBjb21waWxlciBzYW5pdHkiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmcgY29tcGlsZXIgc2FuaXR5IiA+JjI7fQotCi1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8c3RkaW8uaD4KLWludAotbWFpbiAoKQotewotIGV4aXQoMCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQkJYXNfZm5fZXJyb3IgJD8gIioqKiBjb21waWxlciBjYW5ub3QgY3JlYXRlIHdvcmtpbmcgZXhlY3V0YWJsZXMsIGNoZWNrIGNvbmZpZy5sb2cgKioqIiAiJExJTkVOTyIgNQotCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCi0jIENoZWNrcyBmb3IgbGlicmFyaWVzLgotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAieXBfbWF0Y2giICJhY19jdl9mdW5jX3lwX21hdGNoIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3lwX21hdGNoIiA9IHh5ZXM7IHRoZW4gOgotCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHlwX21hdGNoIGluIC1sbnNsIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciB5cF9tYXRjaCBpbiAtbG5zbC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfbnNsX3lwX21hdGNoKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxuc2wgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHlwX21hdGNoICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4geXBfbWF0Y2ggKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX25zbF95cF9tYXRjaD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX25zbF95cF9tYXRjaD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfbnNsX3lwX21hdGNoIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX25zbF95cF9tYXRjaCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9uc2xfeXBfbWF0Y2giID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJOU0wgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxuc2wgJExJQlMiCi0KLWZpCi0KLWZpCi0KLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInNldHNvY2tvcHQiICJhY19jdl9mdW5jX3NldHNvY2tvcHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2V0c29ja29wdCIgPSB4eWVzOyB0aGVuIDoKLQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzZXRzb2Nrb3B0IGluIC1sc29ja2V0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzZXRzb2Nrb3B0IGluIC1sc29ja2V0Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9zb2NrZXRfc2V0c29ja29wdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sc29ja2V0ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzZXRzb2Nrb3B0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gc2V0c29ja29wdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfc29ja2V0X3NldHNvY2tvcHQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9zb2NrZXRfc2V0c29ja29wdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc29ja2V0X3NldHNvY2tvcHQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfc29ja2V0X3NldHNvY2tvcHQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfc29ja2V0X3NldHNvY2tvcHQiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJTT0NLRVQgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxzb2NrZXQgJExJQlMiCi0KLWZpCi0KLWZpCi0KLQotZm9yIGFjX2Z1bmMgaW4gZGlybmFtZQotZG8gOgotICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJkaXJuYW1lIiAiYWNfY3ZfZnVuY19kaXJuYW1lIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX2Rpcm5hbWUiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ESVJOQU1FIDEKLV9BQ0VPRgotIGZvciBhY19oZWFkZXIgaW4gbGliZ2VuLmgKLWRvIDoKLSAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpYmdlbi5oIiAiYWNfY3ZfaGVhZGVyX2xpYmdlbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saWJnZW5faCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xJQkdFTl9IIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLWVsc2UKLQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRpcm5hbWUgaW4gLWxnZW4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRpcm5hbWUgaW4gLWxnZW4uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2dlbl9kaXJuYW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxnZW4gICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRpcm5hbWUgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkaXJuYW1lICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9nZW5fZGlybmFtZT15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2dlbl9kaXJuYW1lPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9nZW5fZGlybmFtZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9nZW5fZGlybmFtZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9nZW5fZGlybmFtZSIgPSB4eWVzOyB0aGVuIDoKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBicm9rZW4gZGlybmFtZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgYnJva2VuIGRpcm5hbWUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV9icm9rZW5fZGlybmFtZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQkJCXNhdmVfTElCUz0iJExJQlMiCi0JCQlMSUJTPSIkTElCUyAtbGdlbiIKLQkJCWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfYnJva2VuX2Rpcm5hbWU9Im5vIgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxsaWJnZW4uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gICAgY2hhciAqcywgYnVmWzMyXTsKLQotICAgIHN0cm5jcHkoYnVmLCIvZXRjIiwgMzIpOwotICAgIHMgPSBkaXJuYW1lKGJ1Zik7Ci0gICAgaWYgKCFzIHx8IHN0cm5jbXAocywgIi8iLCAzMikgIT0gMCkgewotCWV4aXQoMSk7Ci0gICAgfSBlbHNlIHsKLQlleGl0KDApOwotICAgIH0KLX0KLQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfYnJva2VuX2Rpcm5hbWU9Im5vIgotZWxzZQotICAgYWNfY3ZfaGF2ZV9icm9rZW5fZGlybmFtZT0ieWVzIgotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQkJCUxJQlM9IiRzYXZlX0xJQlMiCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfYnJva2VuX2Rpcm5hbWUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX2Jyb2tlbl9kaXJuYW1lIiA+JjY7IH0KLQkJaWYgdGVzdCAieCRhY19jdl9oYXZlX2Jyb2tlbl9kaXJuYW1lIiA9ICJ4bm8iIDsgdGhlbgotCQkJTElCUz0iJExJQlMgLWxnZW4iCi0JCQkkYXNfZWNobyAiI2RlZmluZSBIQVZFX0RJUk5BTUUgMSIgPj5jb25mZGVmcy5oCi0KLQkJCWZvciBhY19oZWFkZXIgaW4gbGliZ2VuLmgKLWRvIDoKLSAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpYmdlbi5oIiAiYWNfY3ZfaGVhZGVyX2xpYmdlbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saWJnZW5faCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xJQkdFTl9IIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLQkJZmkKLQotZmkKLQotCi1maQotZG9uZQotCi0KLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdldHNwbmFtIiAiYWNfY3ZfZnVuY19nZXRzcG5hbSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRzcG5hbSIgPSB4eWVzOyB0aGVuIDoKLQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnZXRzcG5hbSBpbiAtbGdlbiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0c3BuYW0gaW4gLWxnZW4uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2dlbl9nZXRzcG5hbSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sZ2VuICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBnZXRzcG5hbSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldHNwbmFtICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9nZW5fZ2V0c3BuYW09eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9nZW5fZ2V0c3BuYW09bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2dlbl9nZXRzcG5hbSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9nZW5fZ2V0c3BuYW0iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZ2VuX2dldHNwbmFtIiA9IHh5ZXM7IHRoZW4gOgotICBMSUJTPSIkTElCUyAtbGdlbiIKLWZpCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBiYXNlbmFtZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGJhc2VuYW1lLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3NlYXJjaF9iYXNlbmFtZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUwotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGJhc2VuYW1lICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gYmFzZW5hbWUgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWZvciBhY19saWIgaW4gJycgZ2VuOyBkbwotICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgotICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKLSAgZWxzZQotICAgIGFjX3Jlcz0tbCRhY19saWIKLSAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCi0gIGZpCi0gIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3Zfc2VhcmNoX2Jhc2VuYW1lPSRhY19yZXMKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQKLSAgaWYgJHthY19jdl9zZWFyY2hfYmFzZW5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICBicmVhawotZmkKLWRvbmUKLWlmICR7YWNfY3Zfc2VhcmNoX2Jhc2VuYW1lKzp9IGZhbHNlOyB0aGVuIDoKLQotZWxzZQotICBhY19jdl9zZWFyY2hfYmFzZW5hbWU9bm8KLWZpCi1ybSBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9iYXNlbmFtZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9iYXNlbmFtZSIgPiY2OyB9Ci1hY19yZXM9JGFjX2N2X3NlYXJjaF9iYXNlbmFtZQotaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgotICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0JBU0VOQU1FIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC16bGliIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF96bGliK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF96bGliOyAgaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4bm8iIDsgdGhlbgotCQlhc19mbl9lcnJvciAkPyAiKioqIHpsaWIgaXMgcmVxdWlyZWQgKioqIiAiJExJTkVOTyIgNQotCSAgZWxpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4eWVzIjsgdGhlbgotCQlpZiB0ZXN0IC1kICIkd2l0aHZhbC9saWIiOyB0aGVuCi0JCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KLQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0vbGliIC1SJHt3aXRodmFsfS9saWIgJHtMREZMQUdTfSIKLQkJCWVsc2UKLQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCi0JCQlmaQotCQllbHNlCi0JCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KLQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0gLVIke3dpdGh2YWx9ICR7TERGTEFHU30iCi0JCQllbHNlCi0JCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9ICR7TERGTEFHU30iCi0JCQlmaQotCQlmaQotCQlpZiB0ZXN0IC1kICIkd2l0aHZhbC9pbmNsdWRlIjsgdGhlbgotCQkJQ1BQRkxBR1M9Ii1JJHt3aXRodmFsfS9pbmNsdWRlICR7Q1BQRkxBR1N9IgotCQllbHNlCi0JCQlDUFBGTEFHUz0iLUkke3dpdGh2YWx9ICR7Q1BQRkxBR1N9IgotCQlmaQotCWZpCi0KLWZpCi0KLQotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInpsaWIuaCIgImFjX2N2X2hlYWRlcl96bGliX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3psaWJfaCIgPSB4eWVzOyB0aGVuIDoKLQotZWxzZQotICBhc19mbl9lcnJvciAkPyAiKioqIHpsaWIuaCBtaXNzaW5nIC0gcGxlYXNlIGluc3RhbGwgZmlyc3Qgb3IgY2hlY2sgY29uZmlnLmxvZyAqKioiICIkTElORU5PIiA1Ci1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRlZmxhdGUgaW4gLWx6IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkZWZsYXRlIGluIC1sei4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfel9kZWZsYXRlKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWx6ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkZWZsYXRlICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZGVmbGF0ZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfel9kZWZsYXRlPXllcwotZWxzZQotICBhY19jdl9saWJfel9kZWZsYXRlPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl96X2RlZmxhdGUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfel9kZWZsYXRlIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3pfZGVmbGF0ZSIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xJQlogMQotX0FDRU9GCi0KLSAgTElCUz0iLWx6ICRMSUJTIgotCi1lbHNlCi0KLQkJc2F2ZWRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLQkJc2F2ZWRfTERGTEFHUz0iJExERkxBR1MiCi0JCXNhdmVfTElCUz0iJExJQlMiCi0JCQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCi0JCQlMREZMQUdTPSItTC91c3IvbG9jYWwvbGliIC1SL3Vzci9sb2NhbC9saWIgJHtzYXZlZF9MREZMQUdTfSIKLQkJZWxzZQotCQkJTERGTEFHUz0iLUwvdXNyL2xvY2FsL2xpYiAke3NhdmVkX0xERkxBR1N9IgotCQlmaQotCQlDUFBGTEFHUz0iLUkvdXNyL2xvY2FsL2luY2x1ZGUgJHtzYXZlZF9DUFBGTEFHU30iCi0JCUxJQlM9IiRMSUJTIC1seiIKLQkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRlZmxhdGUgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkZWZsYXRlICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gICRhc19lY2hvICIjZGVmaW5lIEhBVkVfTElCWiAxIiA+PmNvbmZkZWZzLmgKLQotZWxzZQotCi0JCQkJYXNfZm5fZXJyb3IgJD8gIioqKiB6bGliIG1pc3NpbmcgLSBwbGVhc2UgaW5zdGFsbCBmaXJzdCBvciBjaGVjayBjb25maWcubG9nICoqKiIgIiRMSU5FTk8iIDUKLQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC16bGliLXZlcnNpb24tY2hlY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3psaWJfdmVyc2lvbl9jaGVjaytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfemxpYl92ZXJzaW9uX2NoZWNrOyAgIGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIiA7IHRoZW4KLQkJemxpYl9jaGVja19ub25mYXRhbD0xCi0JICAgZmkKLQotCi1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHBvc3NpYmx5IGJ1Z2d5IHpsaWIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHBvc3NpYmx5IGJ1Z2d5IHpsaWIuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmcgemxpYiB2ZXJzaW9uIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIHpsaWIgdmVyc2lvbiIgPiYyO30KLQotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHpsaWIuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLQlpbnQgYT0wLCBiPTAsIGM9MCwgZD0wLCBuLCB2OwotCW4gPSBzc2NhbmYoWkxJQl9WRVJTSU9OLCAiJWQuJWQuJWQuJWQiLCAmYSwgJmIsICZjLCAmZCk7Ci0JaWYgKG4gIT0gMyAmJiBuICE9IDQpCi0JCWV4aXQoMSk7Ci0JdiA9IGEqMTAwMDAwMCArIGIqMTAwMDAgKyBjKjEwMCArIGQ7Ci0JZnByaW50ZihzdGRlcnIsICJmb3VuZCB6bGliIHZlcnNpb24gJXMgKCVkKVxuIiwgWkxJQl9WRVJTSU9OLCB2KTsKLQotCS8qIDEuMS40IGlzIE9LICovCi0JaWYgKGEgPT0gMSAmJiBiID09IDEgJiYgYyA+PSA0KQotCQlleGl0KDApOwotCi0JLyogMS4yLjMgYW5kIHVwIGFyZSBPSyAqLwotCWlmICh2ID49IDEwMjAzMDApCi0JCWV4aXQoMCk7Ci0KLQlleGl0KDIpOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWVsc2UKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0JICBpZiB0ZXN0IC16ICIkemxpYl9jaGVja19ub25mYXRhbCIgOyB0aGVuCi0JCWFzX2ZuX2Vycm9yICQ/ICIqKiogemxpYiB0b28gb2xkIC0gY2hlY2sgY29uZmlnLmxvZyAqKioKLVlvdXIgcmVwb3J0ZWQgemxpYiB2ZXJzaW9uIGhhcyBrbm93biBzZWN1cml0eSBwcm9ibGVtcy4gIEl0J3MgcG9zc2libGUgeW91cgotdmVuZG9yIGhhcyBmaXhlZCB0aGVzZSBwcm9ibGVtcyB3aXRob3V0IGNoYW5naW5nIHRoZSB2ZXJzaW9uIG51bWJlci4gIElmIHlvdQotYXJlIHN1cmUgdGhpcyBpcyB0aGUgY2FzZSwgeW91IGNhbiBkaXNhYmxlIHRoZSBjaGVjayBieSBydW5uaW5nCi1cIi4vY29uZmlndXJlIC0td2l0aG91dC16bGliLXZlcnNpb24tY2hlY2tcIi4KLUlmIHlvdSBhcmUgaW4gZG91YnQsIHVwZ3JhZGUgemxpYiB0byB2ZXJzaW9uIDEuMi4zIG9yIGdyZWF0ZXIuCi1TZWUgaHR0cDovL3d3dy5nemlwLm9yZy96bGliLyBmb3IgZGV0YWlscy4iICIkTElORU5PIiA1Ci0JICBlbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogemxpYiB2ZXJzaW9uIG1heSBoYXZlIHNlY3VyaXR5IHByb2JsZW1zIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHpsaWIgdmVyc2lvbiBtYXkgaGF2ZSBzZWN1cml0eSBwcm9ibGVtcyIgPiYyO30KLQkgIGZpCi0KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0KLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInN0cmNhc2VjbXAiICJhY19jdl9mdW5jX3N0cmNhc2VjbXAiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc3RyY2FzZWNtcCIgPSB4eWVzOyB0aGVuIDoKLQotZWxzZQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RyY2FzZWNtcCBpbiAtbHJlc29sdiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RyY2FzZWNtcCBpbiAtbHJlc29sdi4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfcmVzb2x2X3N0cmNhc2VjbXArOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHJlc29sdiAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgc3RyY2FzZWNtcCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIHN0cmNhc2VjbXAgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3Jlc29sdl9zdHJjYXNlY21wPXllcwotZWxzZQotICBhY19jdl9saWJfcmVzb2x2X3N0cmNhc2VjbXA9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3Jlc29sdl9zdHJjYXNlY21wIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3Jlc29sdl9zdHJjYXNlY21wIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3Jlc29sdl9zdHJjYXNlY21wIiA9IHh5ZXM7IHRoZW4gOgotICBMSUJTPSIkTElCUyAtbHJlc29sdiIKLWZpCi0KLQotZmkKLQotZm9yIGFjX2Z1bmMgaW4gdXRpbWVzCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInV0aW1lcyIgImFjX2N2X2Z1bmNfdXRpbWVzIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3V0aW1lcyIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX1VUSU1FUyAxCi1fQUNFT0YKLQotZWxzZQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdXRpbWVzIGluIC1sYzg5IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dGltZXMgaW4gLWxjODkuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2M4OV91dGltZXMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGM4OSAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgdXRpbWVzICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gdXRpbWVzICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9jODlfdXRpbWVzPXllcwotZWxzZQotICBhY19jdl9saWJfYzg5X3V0aW1lcz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfYzg5X3V0aW1lcyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9jODlfdXRpbWVzIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2M4OV91dGltZXMiID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICIjZGVmaW5lIEhBVkVfVVRJTUVTIDEiID4+Y29uZmRlZnMuaAotCi0JCQkJCUxJQlM9IiRMSUJTIC1sYzg5IgotZmkKLQotCi1maQotZG9uZQotCi0KLWZvciBhY19oZWFkZXIgaW4gbGlidXRpbC5oCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJsaWJ1dGlsLmgiICJhY19jdl9oZWFkZXJfbGlidXRpbF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saWJ1dGlsX2giID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJVVElMX0ggMQotX0FDRU9GCi0KLWZpCi0KLWRvbmUKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGxvZ2luIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgbG9naW4uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2VhcmNoX2xvZ2luKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgbG9naW4gKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBsb2dpbiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotZm9yIGFjX2xpYiBpbiAnJyB1dGlsIGJzZDsgZG8KLSAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KLSAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCi0gIGVsc2UKLSAgICBhY19yZXM9LWwkYWNfbGliCi0gICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgotICBmaQotICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3NlYXJjaF9sb2dpbj0kYWNfcmVzCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0Ci0gIGlmICR7YWNfY3Zfc2VhcmNoX2xvZ2luKzp9IGZhbHNlOyB0aGVuIDoKLSAgYnJlYWsKLWZpCi1kb25lCi1pZiAke2FjX2N2X3NlYXJjaF9sb2dpbis6fSBmYWxzZTsgdGhlbiA6Ci0KLWVsc2UKLSAgYWNfY3Zfc2VhcmNoX2xvZ2luPW5vCi1maQotcm0gY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfbG9naW4iID4mNQotJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfbG9naW4iID4mNjsgfQotYWNfcmVzPSRhY19jdl9zZWFyY2hfbG9naW4KLWlmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuIDoKLSAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MT0dJTiAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotZm9yIGFjX2Z1bmMgaW4gZm10X3NjYWxlZCBsb2dvdXQgdXBkd3RtcCBsb2d3dG1wCi1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLWRvbmUKLQotCi1mb3IgYWNfZnVuYyBpbiBzdHJmdGltZQotZG8gOgotICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzdHJmdGltZSIgImFjX2N2X2Z1bmNfc3RyZnRpbWUiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc3RyZnRpbWUiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9TVFJGVElNRSAxCi1fQUNFT0YKLQotZWxzZQotICAjIHN0cmZ0aW1lIGlzIGluIC1saW50bCBvbiBTQ08gVU5JWC4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0cmZ0aW1lIGluIC1saW50bCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RyZnRpbWUgaW4gLWxpbnRsLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzdHJmdGltZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIHN0cmZ0aW1lICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lPXllcwotZWxzZQotICBhY19jdl9saWJfaW50bF9zdHJmdGltZT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfaW50bF9zdHJmdGltZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2ludGxfc3RyZnRpbWUiID0geHllczsgdGhlbiA6Ci0gICRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1RSRlRJTUUgMSIgPj5jb25mZGVmcy5oCi0KLUxJQlM9Ii1saW50bCAkTElCUyIKLWZpCi0KLWZpCi1kb25lCi0KLQotIyBDaGVjayBmb3IgQUxURElSRlVOQyBnbG9iKCkgZXh0ZW5zaW9uCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTE9CX0FMVERJUkZVTkMgc3VwcG9ydCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgR0xPQl9BTFRESVJGVU5DIHN1cHBvcnQuLi4gIiA+JjY7IH0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotCQkjaW5jbHVkZSA8Z2xvYi5oPgotCQkjaWZkZWYgR0xPQl9BTFRESVJGVU5DCi0JCUZPVU5ESVQKLQkJI2VuZGlmCi0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgIkZPVU5ESVQiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0KLQotJGFzX2VjaG8gIiNkZWZpbmUgR0xPQl9IQVNfQUxURElSRlVOQyAxIiA+PmNvbmZkZWZzLmgKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi1lbHNlCi0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0KLQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi0KLSMgQ2hlY2sgZm9yIGcuZ2xfbWF0Y2hjIGdsb2IoKSBleHRlbnNpb24KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdsX21hdGNoYyBmaWVsZCBpbiBnbG9iX3QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdsX21hdGNoYyBmaWVsZCBpbiBnbG9iX3QuLi4gIiA+JjY7IH0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8Z2xvYi5oPgotaW50Ci1tYWluICgpCi17Ci0gZ2xvYl90IGc7IGcuZ2xfbWF0Y2hjID0gMTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotCi0KLSRhc19lY2hvICIjZGVmaW5lIEdMT0JfSEFTX0dMX01BVENIQyAxIiA+PmNvbmZkZWZzLmgKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi1lbHNlCi0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotIyBDaGVjayBmb3IgZy5nbF9zdGF0diBnbG9iKCkgZXh0ZW5zaW9uCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnbF9zdGF0diBhbmQgR0xPQl9LRUVQU1RBVCBleHRlbnNpb25zIGZvciBnbG9iIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBnbF9zdGF0diBhbmQgR0xPQl9LRUVQU1RBVCBleHRlbnNpb25zIGZvciBnbG9iLi4uICIgPiY2OyB9Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPGdsb2IuaD4KLWludAotbWFpbiAoKQotewotCi0jaWZuZGVmIEdMT0JfS0VFUFNUQVQKLSNlcnJvciAiZ2xvYiBkb2VzIG5vdCBzdXBwb3J0IEdMT0JfS0VFUFNUQVQgZXh0ZW5zaW9uIgotI2VuZGlmCi1nbG9iX3QgZzsKLWcuZ2xfc3RhdHYgPSBOVUxMOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLQotCi0kYXNfZWNobyAiI2RlZmluZSBHTE9CX0hBU19HTF9TVEFUViAxIiA+PmNvbmZkZWZzLmgKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi1lbHNlCi0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0KLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1hY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJHTE9CX05PTUFUQ0giICJhY19jdl9oYXZlX2RlY2xfR0xPQl9OT01BVENIIiAiI2luY2x1ZGUgPGdsb2IuaD4KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX0dMT0JfTk9NQVRDSCIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfaGF2ZV9kZWNsPTEKLWVsc2UKLSAgYWNfaGF2ZV9kZWNsPTAKLWZpCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ERUNMX0dMT0JfTk9NQVRDSCAkYWNfaGF2ZV9kZWNsCi1fQUNFT0YKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgc3RydWN0IGRpcmVudCBhbGxvY2F0ZXMgc3BhY2UgZm9yIGRfbmFtZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN0cnVjdCBkaXJlbnQgYWxsb2NhdGVzIHNwYWNlIGZvciBkX25hbWUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogYXNzdW1pbmcgQlJPS0VOX09ORV9CWVRFX0RJUkVOVF9EX05BTUUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBhc3N1bWluZyBCUk9LRU5fT05FX0JZVEVfRElSRU5UX0RfTkFNRSIgPiYyO30KLQkJJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX09ORV9CWVRFX0RJUkVOVF9EX05BTUUgMSIgPj5jb25mZGVmcy5oCi0KLQotCi1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotaW50Ci1tYWluICgpCi17Ci0KLQlzdHJ1Y3QgZGlyZW50IGQ7Ci0JZXhpdChzaXplb2YoZC5kX25hbWUpPD1zaXplb2YoY2hhcikpOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCi0kYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fT05FX0JZVEVfRElSRU5UX0RfTkFNRSAxIiA+PmNvbmZkZWZzLmgKLQotCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAvcHJvYy9waWQvZmQgZGlyZWN0b3J5IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAvcHJvYy9waWQvZmQgZGlyZWN0b3J5Li4uICIgPiY2OyB9Ci1pZiB0ZXN0IC1kICIvcHJvYy8kJC9mZCIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfUFJPQ19QSUQgMSIgPj5jb25mZGVmcy5oCi0KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotIyBDaGVjayB3aGV0aGVyIHVzZXIgd2FudHMgUy9LZXkgc3VwcG9ydAotU0tFWV9NU0c9Im5vIgotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXNrZXkgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3NrZXkrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3NrZXk7Ci0JCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCi0KLQkJCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInh5ZXMiIDsgdGhlbgotCQkJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkke3dpdGh2YWx9L2luY2x1ZGUiCi0JCQkJTERGTEFHUz0iJExERkxBR1MgLUwke3dpdGh2YWx9L2xpYiIKLQkJCWZpCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgU0tFWSAxIiA+PmNvbmZkZWZzLmgKLQotCQkJTElCUz0iLWxza2V5ICRMSUJTIgotCQkJU0tFWV9NU0c9InllcyIKLQotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igcy9rZXkgc3VwcG9ydCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igcy9rZXkgc3VwcG9ydC4uLiAiID4mNjsgfQotCQkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxza2V5Lmg+Ci0KLWludAotbWFpbiAoKQotewotCi0JY2hhciAqZmYgPSBza2V5X2tleWluZm8oIiIpOyBmZj0iIjsKLQlleGl0KDApOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLQotCQkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQkJCQkJYXNfZm5fZXJyb3IgJD8gIioqIEluY29tcGxldGUgb3IgbWlzc2luZyBzL2tleSBsaWJyYXJpZXMuIiAiJExJTkVOTyIgNQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgICAgICAgICAgICAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgc2tleWNoYWxsZW5nZSB0YWtlcyA0IGFyZ3VtZW50cyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiBza2V5Y2hhbGxlbmdlIHRha2VzIDQgYXJndW1lbnRzLi4uICIgPiY2OyB9Ci0JCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHNrZXkuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLQkodm9pZClza2V5Y2hhbGxlbmdlKE5VTEwsIm5hbWUiLCIiLDApOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLQotCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0KLSRhc19lY2hvICIjZGVmaW5lIFNLRVlDSEFMTEVOR0VfNEFSRyAxIiA+PmNvbmZkZWZzLmgKLQotZWxzZQotCi0JCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQkJZmkKLQotCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciB1c2VyIHdhbnRzIFRDUCB3cmFwcGVycyBzdXBwb3J0Ci1UQ1BXX01TRz0ibm8iCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGNwLXdyYXBwZXJzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF90Y3Bfd3JhcHBlcnMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3RjcF93cmFwcGVyczsKLQkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQkJCXNhdmVkX0xJQlM9IiRMSUJTIgotCQkJc2F2ZWRfTERGTEFHUz0iJExERkxBR1MiCi0JCQlzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotCQkJaWYgdGVzdCAtbiAiJHt3aXRodmFsfSIgJiYgXAotCQkJICAgIHRlc3QgIngke3dpdGh2YWx9IiAhPSAieHllcyI7IHRoZW4KLQkJCQlpZiB0ZXN0IC1kICIke3dpdGh2YWx9L2xpYiI7IHRoZW4KLQkJCQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCi0JCQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0vbGliIC1SJHt3aXRodmFsfS9saWIgJHtMREZMQUdTfSIKLQkJCQkJZWxzZQotCQkJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAke0xERkxBR1N9IgotCQkJCQlmaQotCQkJCWVsc2UKLQkJCQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCi0JCQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0gLVIke3dpdGh2YWx9ICR7TERGTEFHU30iCi0JCQkJCWVsc2UKLQkJCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfSAke0xERkxBR1N9IgotCQkJCQlmaQotCQkJCWZpCi0JCQkJaWYgdGVzdCAtZCAiJHt3aXRodmFsfS9pbmNsdWRlIjsgdGhlbgotCQkJCQlDUFBGTEFHUz0iLUkke3dpdGh2YWx9L2luY2x1ZGUgJHtDUFBGTEFHU30iCi0JCQkJZWxzZQotCQkJCQlDUFBGTEFHUz0iLUkke3dpdGh2YWx9ICR7Q1BQRkxBR1N9IgotCQkJCWZpCi0JCQlmaQotCQkJTElCUz0iLWx3cmFwICRMSUJTIgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlid3JhcCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlid3JhcC4uLiAiID4mNjsgfQotCQkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDx0Y3BkLmg+Ci1pbnQgZGVueV9zZXZlcml0eSA9IDAsIGFsbG93X3NldmVyaXR5ID0gMDsKLQotaW50Ci1tYWluICgpCi17Ci0KLQlob3N0c19hY2Nlc3MoMCk7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotCi0JCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0KLSRhc19lY2hvICIjZGVmaW5lIExJQldSQVAgMSIgPj5jb25mZGVmcy5oCi0KLQkJCQkJU1NIRExJQlM9IiRTU0hETElCUyAtbHdyYXAiCi0JCQkJCVRDUFdfTVNHPSJ5ZXMiCi0KLWVsc2UKLQotCQkJCQlhc19mbl9lcnJvciAkPyAiKioqIGxpYndyYXAgbWlzc2luZyIgIiRMSU5FTk8iIDUKLQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQkJCUxJQlM9IiRzYXZlZF9MSUJTIgotCQlmaQotCi0KLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIHVzZXIgd2FudHMgbGliZWRpdCBzdXBwb3J0Ci1MSUJFRElUX01TRz0ibm8iCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGliZWRpdCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbGliZWRpdCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfbGliZWRpdDsgIGlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCi0JCWlmIHRlc3QgIngkd2l0aHZhbCIgPSAieHllcyIgOyB0aGVuCi0JCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInBrZy1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHBrZy1jb25maWc7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX1BLR0NPTkZJRys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJFBLR0NPTkZJRyBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9QS0dDT05GSUc9IiRQS0dDT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX1BLR0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9QS0dDT05GSUciICYmIGFjX2N2X3BhdGhfUEtHQ09ORklHPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1QS0dDT05GSUc9JGFjX2N2X3BhdGhfUEtHQ09ORklHCi1pZiB0ZXN0IC1uICIkUEtHQ09ORklHIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBLR0NPTkZJRyIgPiY1Ci0kYXNfZWNobyAiJFBLR0NPTkZJRyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0JCQlpZiB0ZXN0ICJ4JFBLR0NPTkZJRyIgIT0gInhubyI7IHRoZW4KLQkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRQS0dDT05GSUcga25vd3MgYWJvdXQgbGliZWRpdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiAkUEtHQ09ORklHIGtub3dzIGFib3V0IGxpYmVkaXQuLi4gIiA+JjY7IH0KLQkJCSAJaWYgIiRQS0dDT05GSUciIGxpYmVkaXQ7IHRoZW4KLQkJCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQkJCQkJdXNlX3BrZ2NvbmZpZ19mb3JfbGliZWRpdD15ZXMKLQkJCQllbHNlCi0JCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQkJCWZpCi0JCQlmaQotCQllbHNlCi0JCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHt3aXRodmFsfS9pbmNsdWRlIgotCQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCi0JCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAtUiR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCi0JCQllbHNlCi0JCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAke0xERkxBR1N9IgotCQkJZmkKLQkJZmkKLQkJaWYgdGVzdCAieCR1c2VfcGtnY29uZmlnX2Zvcl9saWJlZGl0IiA9ICJ4eWVzIjsgdGhlbgotCQkJTElCRURJVD1gJFBLR0NPTkZJRyAtLWxpYnMtb25seS1sIGxpYmVkaXRgCi0JCQlDUFBGTEFHUz0iJENQUEZMQUdTIGAkUEtHQ09ORklHIC0tY2ZsYWdzIGxpYmVkaXRgIgotCQllbHNlCi0JCQlMSUJFRElUPSItbGVkaXQgLWxjdXJzZXMiCi0JCWZpCi0JCU9USEVSTElCUz1gZWNobyAkTElCRURJVCB8IHNlZCAncy8tbGVkaXQvLydgCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGVsX2luaXQgaW4gLWxlZGl0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBlbF9pbml0IGluIC1sZWRpdC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfZWRpdF9lbF9pbml0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxlZGl0ICAkT1RIRVJMSUJTCi0JCSAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBlbF9pbml0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZWxfaW5pdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfZWRpdF9lbF9pbml0PXllcwotZWxzZQotICBhY19jdl9saWJfZWRpdF9lbF9pbml0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9lZGl0X2VsX2luaXQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZWRpdF9lbF9pbml0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2VkaXRfZWxfaW5pdCIgPSB4eWVzOyB0aGVuIDoKLQotJGFzX2VjaG8gIiNkZWZpbmUgVVNFX0xJQkVESVQgMSIgPj5jb25mZGVmcy5oCi0KLQkJCSAgTElCRURJVF9NU0c9InllcyIKLQotCi1lbHNlCi0gICBhc19mbl9lcnJvciAkPyAibGliZWRpdCBub3QgZm91bmQiICIkTElORU5PIiA1Ci1maQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgbGliZWRpdCB2ZXJzaW9uIGlzIGNvbXBhdGlibGUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgbGliZWRpdCB2ZXJzaW9uIGlzIGNvbXBhdGlibGUuLi4gIiA+JjY7IH0KLQkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxoaXN0ZWRpdC5oPgotaW50Ci1tYWluICgpCi17Ci0KLQlpbnQgaSA9IEhfU0VUU0laRTsKLQllbF9pbml0KCIiLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlleGl0KDApOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1lbHNlCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQkJICAgICAgYXNfZm5fZXJyb3IgJD8gImxpYmVkaXQgdmVyc2lvbiBpcyBub3QgY29tcGF0aWJsZSIgIiRMSU5FTk8iIDUKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCWZpCi0KLWZpCi0KLQotQVVESVRfTU9EVUxFPW5vbmUKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1hdWRpdCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfYXVkaXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2F1ZGl0OwotCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VwcG9ydGVkIGF1ZGl0IG1vZHVsZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VwcG9ydGVkIGF1ZGl0IG1vZHVsZS4uLiAiID4mNjsgfQotCSAgY2FzZSAiJHdpdGh2YWwiIGluCi0JICBic20pCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBic20iID4mNQotJGFzX2VjaG8gImJzbSIgPiY2OyB9Ci0JCUFVRElUX01PRFVMRT1ic20KLQkJCQlmb3IgYWNfaGVhZGVyIGluIGJzbS9hdWRpdC5oCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJic20vYXVkaXQuaCIgImFjX2N2X2hlYWRlcl9ic21fYXVkaXRfaCIgIgotI2lmZGVmIEhBVkVfVElNRV9ICi0jIGluY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotCi0KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2JzbV9hdWRpdF9oIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfQlNNX0FVRElUX0ggMQotX0FDRU9GCi0KLWVsc2UKLSAgYXNfZm5fZXJyb3IgJD8gIkJTTSBlbmFibGVkIGFuZCBic20vYXVkaXQuaCBub3QgZm91bmQiICIkTElORU5PIiA1Ci1maQotCi1kb25lCi0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0YXVkaXQgaW4gLWxic20iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGF1ZGl0IGluIC1sYnNtLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9ic21fZ2V0YXVkaXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGJzbSAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZ2V0YXVkaXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBnZXRhdWRpdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfYnNtX2dldGF1ZGl0PXllcwotZWxzZQotICBhY19jdl9saWJfYnNtX2dldGF1ZGl0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9ic21fZ2V0YXVkaXQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfYnNtX2dldGF1ZGl0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2JzbV9nZXRhdWRpdCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xJQkJTTSAxCi1fQUNFT0YKLQotICBMSUJTPSItbGJzbSAkTElCUyIKLQotZWxzZQotICBhc19mbl9lcnJvciAkPyAiQlNNIGVuYWJsZWQgYW5kIHJlcXVpcmVkIGxpYnJhcnkgbm90IGZvdW5kIiAiJExJTkVOTyIgNQotZmkKLQotCQlmb3IgYWNfZnVuYyBpbiBnZXRhdWRpdAotZG8gOgotICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRhdWRpdCIgImFjX2N2X2Z1bmNfZ2V0YXVkaXQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0YXVkaXQiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9HRVRBVURJVCAxCi1fQUNFT0YKLQotZWxzZQotICBhc19mbl9lcnJvciAkPyAiQlNNIGVuYWJsZWQgYW5kIHJlcXVpcmVkIGZ1bmN0aW9uIG5vdCBmb3VuZCIgIiRMSU5FTk8iIDUKLWZpCi1kb25lCi0KLQkJIyBUaGVzZSBhcmUgb3B0aW9uYWwKLQkJZm9yIGFjX2Z1bmMgaW4gZ2V0YXVkaXRfYWRkciBhdWdfZ2V0X21hY2hpbmUKLWRvIDoKLSAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotZG9uZQotCi0KLSRhc19lY2hvICIjZGVmaW5lIFVTRV9CU01fQVVESVQgMSIgPj5jb25mZGVmcy5oCi0KLQkJOzsKLQkgIGxpbnV4KQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbGludXgiID4mNQotJGFzX2VjaG8gImxpbnV4IiA+JjY7IH0KLQkJQVVESVRfTU9EVUxFPWxpbnV4Ci0JCQkJZm9yIGFjX2hlYWRlciBpbiBsaWJhdWRpdC5oCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJsaWJhdWRpdC5oIiAiYWNfY3ZfaGVhZGVyX2xpYmF1ZGl0X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpYmF1ZGl0X2giID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJBVURJVF9IIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLQkJU1NIRExJQlM9IiRTU0hETElCUyAtbGF1ZGl0IgotCi0kYXNfZWNobyAiI2RlZmluZSBVU0VfTElOVVhfQVVESVQgMSIgPj5jb25mZGVmcy5oCi0KLQkJOzsKLQkgIGRlYnVnKQotCQlBVURJVF9NT0RVTEU9ZGVidWcKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGRlYnVnIiA+JjUKLSRhc19lY2hvICJkZWJ1ZyIgPiY2OyB9Ci0KLSRhc19lY2hvICIjZGVmaW5lIFNTSF9BVURJVF9FVkVOVFMgMSIgPj5jb25mZGVmcy5oCi0KLQkJOzsKLQkgIG5vKQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQkJOzsKLQkgICopCi0JCWFzX2ZuX2Vycm9yICQ/ICJVbmtub3duIGF1ZGl0IG1vZHVsZSAkd2l0aHZhbCIgIiRMSU5FTk8iIDUKLQkJOzsKLQllc2FjCi0KLWZpCi0KLQotZm9yIGFjX2Z1bmMgaW4gIFwKLQlhcmM0cmFuZG9tIFwKLQlhcmM0cmFuZG9tX2J1ZiBcCi0JYXJjNHJhbmRvbV91bmlmb3JtIFwKLQlhc3ByaW50ZiBcCi0JYjY0X250b3AgXAotCV9fYjY0X250b3AgXAotCWI2NF9wdG9uIFwKLQlfX2I2NF9wdG9uIFwKLQliY29weSBcCi0JYmluZHJlc3Zwb3J0X3NhIFwKLQljbG9jayBcCi0JY2xvc2Vmcm9tIFwKLQlkaXJmZCBcCi0JZmNobW9kIFwKLQlmY2hvd24gXAotCWZyZWVhZGRyaW5mbyBcCi0JZnN0YXR2ZnMgXAotCWZ1dGltZXMgXAotCWdldGFkZHJpbmZvIFwKLQlnZXRjd2QgXAotCWdldGdyb3VwbGlzdCBcCi0JZ2V0bmFtZWluZm8gXAotCWdldG9wdCBcCi0JZ2V0cGVlcmVpZCBcCi0JZ2V0cGVlcnVjcmVkIFwKLQlfZ2V0cHR5IFwKLQlnZXRybGltaXQgXAotCWdldHR0eWVudCBcCi0JZ2xvYiBcCi0JZ3JvdXBfZnJvbV9naWQgXAotCWluZXRfYXRvbiBcCi0JaW5ldF9udG9hIFwKLQlpbmV0X250b3AgXAotCWlubmV0Z3IgXAotCWxvZ2luX2dldGNhcGJvb2wgXAotCW1kNV9jcnlwdCBcCi0JbWVtbW92ZSBcCi0JbWtkdGVtcCBcCi0JbW1hcCBcCi0JbmdldGFkZHJpbmZvIFwKLQluc2xlZXAgXAotCW9nZXRhZGRyaW5mbyBcCi0Jb3BlbmxvZ19yIFwKLQlvcGVucHR5IFwKLQlwb2xsIFwKLQlwcmN0bCBcCi0JcHN0YXQgXAotCXJlYWRwYXNzcGhyYXNlIFwKLQlyZWFscGF0aCBcCi0JcmVjdm1zZyBcCi0JcnJlc3Zwb3J0X2FmIFwKLQlzZW5kbXNnIFwKLQlzZXRkdGFibGVzaXplIFwKLQlzZXRlZ2lkIFwKLQlzZXRlbnYgXAotCXNldGV1aWQgXAotCXNldGdyb3VwZW50IFwKLQlzZXRncm91cHMgXAotCXNldGxvZ2luIFwKLQlzZXRwYXNzZW50XAotCXNldHBjcmVkIFwKLQlzZXRwcm9jdGl0bGUgXAotCXNldHJlZ2lkIFwKLQlzZXRyZXVpZCBcCi0Jc2V0cmxpbWl0IFwKLQlzZXRzaWQgXAotCXNldHZidWYgXAotCXNpZ2FjdGlvbiBcCi0Jc2lndmVjIFwKLQlzbnByaW50ZiBcCi0Jc29ja2V0cGFpciBcCi0Jc3RhdGZzIFwKLQlzdGF0dmZzIFwKLQlzdHJkdXAgXAotCXN0cmVycm9yIFwKLQlzdHJsY2F0IFwKLQlzdHJsY3B5IFwKLQlzdHJtb2RlIFwKLQlzdHJudmlzIFwKLQlzdHJwdGltZSBcCi0Jc3RydG9udW0gXAotCXN0cnRvbGwgXAotCXN0cnRvdWwgXAotCXN3YXAzMiBcCi0Jc3lzY29uZiBcCi0JdGNnZXRwZ3JwIFwKLQl0aW1pbmdzYWZlX2JjbXAgXAotCXRydW5jYXRlIFwKLQl1bnNldGVudiBcCi0JdXBkd3RtcHggXAotCXVzZXJfZnJvbV91aWQgXAotCXZhc3ByaW50ZiBcCi0Jdmhhbmd1cCBcCi0JdnNucHJpbnRmIFwKLQl3YWl0cGlkIFwKLQotZG8gOgotICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxjdHlwZS5oPgotaW50Ci1tYWluICgpCi17Ci0gcmV0dXJuIChpc2JsYW5rKCdhJykpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfSVNCTEFOSyAxIiA+PmNvbmZkZWZzLmgKLQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotIyBQS0NTIzExIHN1cHBvcnQgcmVxdWlyZXMgZGxvcGVuKCkgYW5kIGNvCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZGxvcGVuIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZGxvcGVuLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3NlYXJjaF9kbG9wZW4rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkbG9wZW4gKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkbG9wZW4gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWZvciBhY19saWIgaW4gJycgZGw7IGRvCi0gIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCi0gICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgotICBlbHNlCi0gICAgYWNfcmVzPS1sJGFjX2xpYgotICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKLSAgZmkKLSAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zZWFyY2hfZGxvcGVuPSRhY19yZXMKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQKLSAgaWYgJHthY19jdl9zZWFyY2hfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKLSAgYnJlYWsKLWZpCi1kb25lCi1pZiAke2FjX2N2X3NlYXJjaF9kbG9wZW4rOn0gZmFsc2U7IHRoZW4gOgotCi1lbHNlCi0gIGFjX2N2X3NlYXJjaF9kbG9wZW49bm8KLWZpCi1ybSBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9kbG9wZW4iID4mNQotJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfZGxvcGVuIiA+JjY7IH0KLWFjX3Jlcz0kYWNfY3Zfc2VhcmNoX2Rsb3BlbgotaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgotICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgotCi0kYXNfZWNobyAiI2RlZmluZSBFTkFCTEVfUEtDUzExIC8qKi8iID4+Y29uZmRlZnMuaAotCi0KLWZpCi0KLQotIyBJUklYIGhhcyBhIGNvbnN0IGNoYXIgcmV0dXJuIHZhbHVlIGZvciBnYWlfc3RyZXJyb3IoKQotZm9yIGFjX2Z1bmMgaW4gZ2FpX3N0cmVycm9yCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdhaV9zdHJlcnJvciIgImFjX2N2X2Z1bmNfZ2FpX3N0cmVycm9yIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX2dhaV9zdHJlcnJvciIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0dBSV9TVFJFUlJPUiAxCi1fQUNFT0YKLQotCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfR0FJX1NUUkVSUk9SIDEiID4+Y29uZmRlZnMuaAotCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0KLWNvbnN0IGNoYXIgKmdhaV9zdHJlcnJvcihpbnQpOwotCi1pbnQKLW1haW4gKCkKLXsKLQotCWNoYXIgKnN0cjsKLQlzdHIgPSBnYWlfc3RyZXJyb3IoMCk7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfQ09OU1RfR0FJX1NUUkVSUk9SX1BST1RPIDEiID4+Y29uZmRlZnMuaAotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotZG9uZQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBuYW5vc2xlZXAiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBuYW5vc2xlZXAuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2VhcmNoX25hbm9zbGVlcCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUwotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIG5hbm9zbGVlcCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIG5hbm9zbGVlcCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotZm9yIGFjX2xpYiBpbiAnJyBydCBwb3NpeDQ7IGRvCi0gIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCi0gICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgotICBlbHNlCi0gICAgYWNfcmVzPS1sJGFjX2xpYgotICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKLSAgZmkKLSAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zZWFyY2hfbmFub3NsZWVwPSRhY19yZXMKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQKLSAgaWYgJHthY19jdl9zZWFyY2hfbmFub3NsZWVwKzp9IGZhbHNlOyB0aGVuIDoKLSAgYnJlYWsKLWZpCi1kb25lCi1pZiAke2FjX2N2X3NlYXJjaF9uYW5vc2xlZXArOn0gZmFsc2U7IHRoZW4gOgotCi1lbHNlCi0gIGFjX2N2X3NlYXJjaF9uYW5vc2xlZXA9bm8KLWZpCi1ybSBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9uYW5vc2xlZXAiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfbmFub3NsZWVwIiA+JjY7IH0KLWFjX3Jlcz0kYWNfY3Zfc2VhcmNoX25hbm9zbGVlcAotaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgotICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX05BTk9TTEVFUCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi1hY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJnZXRydXNhZ2UiICJhY19jdl9oYXZlX2RlY2xfZ2V0cnVzYWdlIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9nZXRydXNhZ2UiID0geHllczsgdGhlbiA6Ci0gIGZvciBhY19mdW5jIGluIGdldHJ1c2FnZQotZG8gOgotICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRydXNhZ2UiICJhY19jdl9mdW5jX2dldHJ1c2FnZSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRydXNhZ2UiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9HRVRSVVNBR0UgMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLWZpCi0KLWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgInN0cnNlcCIgImFjX2N2X2hhdmVfZGVjbF9zdHJzZXAiICIKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX3N0cnNlcCIgPSB4eWVzOyB0aGVuIDoKLSAgZm9yIGFjX2Z1bmMgaW4gc3Ryc2VwCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInN0cnNlcCIgImFjX2N2X2Z1bmNfc3Ryc2VwIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3N0cnNlcCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX1NUUlNFUCAxCi1fQUNFT0YKLQotZmkKLWRvbmUKLQotZmkKLQotCi1hY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJ0Y3NlbmRicmVhayIgImFjX2N2X2hhdmVfZGVjbF90Y3NlbmRicmVhayIgIiNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX3Rjc2VuZGJyZWFrIiA9IHh5ZXM7IHRoZW4gOgotICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX1RDU0VOREJSRUFLIDEiID4+Y29uZmRlZnMuaAotCi1lbHNlCi0gIGZvciBhY19mdW5jIGluIHRjc2VuZGJyZWFrCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInRjc2VuZGJyZWFrIiAiYWNfY3ZfZnVuY190Y3NlbmRicmVhayIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY190Y3NlbmRicmVhayIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX1RDU0VOREJSRUFLIDEKLV9BQ0VPRgotCi1maQotZG9uZQotCi1maQotCi0KLWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgImhfZXJybm8iICJhY19jdl9oYXZlX2RlY2xfaF9lcnJubyIgIiNpbmNsdWRlIDxuZXRkYi5oPgotIgotaWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfaF9lcnJubyIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfaGF2ZV9kZWNsPTEKLWVsc2UKLSAgYWNfaGF2ZV9kZWNsPTAKLWZpCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ERUNMX0hfRVJSTk8gJGFjX2hhdmVfZGVjbAotX0FDRU9GCi0KLQotYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiU0hVVF9SRCIgImFjX2N2X2hhdmVfZGVjbF9TSFVUX1JEIiAiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0iCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9TSFVUX1JEIiA9IHh5ZXM7IHRoZW4gOgotICBhY19oYXZlX2RlY2w9MQotZWxzZQotICBhY19oYXZlX2RlY2w9MAotZmkKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0RFQ0xfU0hVVF9SRCAkYWNfaGF2ZV9kZWNsCi1fQUNFT0YKLQotCi1hY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJPX05PTkJMT0NLIiAiYWNfY3ZfaGF2ZV9kZWNsX09fTk9OQkxPQ0siICIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfRkNOVExfSAotIyBpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmCi0KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX09fTk9OQkxPQ0siID0geHllczsgdGhlbiA6Ci0gIGFjX2hhdmVfZGVjbD0xCi1lbHNlCi0gIGFjX2hhdmVfZGVjbD0wCi1maQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfREVDTF9PX05PTkJMT0NLICRhY19oYXZlX2RlY2wKLV9BQ0VPRgotCi0KLWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIndyaXRldiIgImFjX2N2X2hhdmVfZGVjbF93cml0ZXYiICIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdWlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX3dyaXRldiIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfaGF2ZV9kZWNsPTEKLWVsc2UKLSAgYWNfaGF2ZV9kZWNsPTAKLWZpCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ERUNMX1dSSVRFViAkYWNfaGF2ZV9kZWNsCi1fQUNFT0YKLQotCi1hY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJNQVhTWU1MSU5LUyIgImFjX2N2X2hhdmVfZGVjbF9NQVhTWU1MSU5LUyIgIgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0iCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9NQVhTWU1MSU5LUyIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfaGF2ZV9kZWNsPTEKLWVsc2UKLSAgYWNfaGF2ZV9kZWNsPTAKLWZpCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ERUNMX01BWFNZTUxJTktTICRhY19oYXZlX2RlY2wKLV9BQ0VPRgotCi0KLWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIm9mZnNldG9mIiAiYWNfY3ZfaGF2ZV9kZWNsX29mZnNldG9mIiAiCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSIKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX29mZnNldG9mIiA9IHh5ZXM7IHRoZW4gOgotICBhY19oYXZlX2RlY2w9MQotZWxzZQotICBhY19oYXZlX2RlY2w9MAotZmkKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0RFQ0xfT0ZGU0VUT0YgJGFjX2hhdmVfZGVjbAotX0FDRU9GCi0KLQotZm9yIGFjX2Z1bmMgaW4gc2V0cmVzdWlkCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInNldHJlc3VpZCIgImFjX2N2X2Z1bmNfc2V0cmVzdWlkIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3NldHJlc3VpZCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX1NFVFJFU1VJRCAxCi1fQUNFT0YKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHNldHJlc3VpZCBzZWVtcyB0byB3b3JrIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHNldHJlc3VpZCBzZWVtcyB0byB3b3JrLi4uICIgPiY2OyB9Ci0JaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIHNldHJlc3VpZCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyBzZXRyZXN1aWQiID4mMjt9Ci0KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLQllcnJubz0wOwotCXNldHJlc3VpZCgwLDAsMCk7Ci0JaWYgKGVycm5vPT1FTk9TWVMpCi0JCWV4aXQoMSk7Ci0JZWxzZQotCQlleGl0KDApOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotCi0kYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fU0VUUkVTVUlEIDEiID4+Y29uZmRlZnMuaAotCi0JCSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm90IGltcGxlbWVudGVkIiA+JjUKLSRhc19lY2hvICJub3QgaW1wbGVtZW50ZWQiID4mNjsgfQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQotZmkKLWRvbmUKLQotCi1mb3IgYWNfZnVuYyBpbiBzZXRyZXNnaWQKLWRvIDoKLSAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic2V0cmVzZ2lkIiAiYWNfY3ZfZnVuY19zZXRyZXNnaWQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2V0cmVzZ2lkIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfU0VUUkVTR0lEIDEKLV9BQ0VPRgotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgc2V0cmVzZ2lkIHNlZW1zIHRvIHdvcmsiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgc2V0cmVzZ2lkIHNlZW1zIHRvIHdvcmsuLi4gIiA+JjY7IH0KLQlpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmcgc2V0cmVzdWlkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIHNldHJlc3VpZCIgPiYyO30KLQotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotCWVycm5vPTA7Ci0Jc2V0cmVzZ2lkKDAsMCwwKTsKLQlpZiAoZXJybm89PUVOT1NZUykKLQkJZXhpdCgxKTsKLQllbHNlCi0JCWV4aXQoMCk7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1lbHNlCi0KLSRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TRVRSRVNHSUQgMSIgPj5jb25mZGVmcy5oCi0KLQkJIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub3QgaW1wbGVtZW50ZWQiID4mNQotJGFzX2VjaG8gIm5vdCBpbXBsZW1lbnRlZCIgPiY2OyB9Ci1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCi1maQotZG9uZQotCi0KLWZvciBhY19mdW5jIGluIGdldHRpbWVvZmRheSB0aW1lCi1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZW5kdXRlbnQgZ2V0dXRlbnQgZ2V0dXRpZCBnZXR1dGxpbmUgcHV0dXRsaW5lIHNldHV0ZW50Ci1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gdXRtcG5hbWUKLWRvIDoKLSAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAidXRtcG5hbWUiICJhY19jdl9mdW5jX3V0bXBuYW1lIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3V0bXBuYW1lIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfVVRNUE5BTUUgMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGVuZHV0eGVudCBnZXR1dHhlbnQgZ2V0dXR4aWQgZ2V0dXR4bGluZSBnZXR1dHh1c2VyIHB1dHV0eGxpbmUKLWRvIDoKLSAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBzZXR1dHhkYiBzZXR1dHhlbnQgdXRtcHhuYW1lCi1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0bGFzdGxvZ3hieW5hbWUKLWRvIDoKLSAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZ2V0bGFzdGxvZ3hieW5hbWUiICJhY19jdl9mdW5jX2dldGxhc3Rsb2d4YnluYW1lIgotaWYgdGVzdCAieCRhY19jdl9mdW5jX2dldGxhc3Rsb2d4YnluYW1lIiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfR0VUTEFTVExPR1hCWU5BTUUgMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLQotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZGFlbW9uIiAiYWNfY3ZfZnVuY19kYWVtb24iCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZGFlbW9uIiA9IHh5ZXM7IHRoZW4gOgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0RBRU1PTiAxIiA+PmNvbmZkZWZzLmgKLQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkYWVtb24gaW4gLWxic2QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRhZW1vbiBpbiAtbGJzZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfYnNkX2RhZW1vbis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sYnNkICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkYWVtb24gKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkYWVtb24gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2JzZF9kYWVtb249eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9ic2RfZGFlbW9uPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9ic2RfZGFlbW9uIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2JzZF9kYWVtb24iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfYnNkX2RhZW1vbiIgPSB4eWVzOyB0aGVuIDoKLSAgTElCUz0iJExJQlMgLWxic2QiOyAkYXNfZWNobyAiI2RlZmluZSBIQVZFX0RBRU1PTiAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi1maQotCi0KLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdldHBhZ2VzaXplIiAiYWNfY3ZfZnVuY19nZXRwYWdlc2l6ZSIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRwYWdlc2l6ZSIgPSB4eWVzOyB0aGVuIDoKLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9HRVRQQUdFU0laRSAxIiA+PmNvbmZkZWZzLmgKLQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnZXRwYWdlc2l6ZSBpbiAtbHVjYiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0cGFnZXNpemUgaW4gLWx1Y2IuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3VjYl9nZXRwYWdlc2l6ZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sdWNiICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBnZXRwYWdlc2l6ZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldHBhZ2VzaXplICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl91Y2JfZ2V0cGFnZXNpemU9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl91Y2JfZ2V0cGFnZXNpemU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3VjYl9nZXRwYWdlc2l6ZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl91Y2JfZ2V0cGFnZXNpemUiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfdWNiX2dldHBhZ2VzaXplIiA9IHh5ZXM7IHRoZW4gOgotICBMSUJTPSIkTElCUyAtbHVjYiI7ICRhc19lY2hvICIjZGVmaW5lIEhBVkVfR0VUUEFHRVNJWkUgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotZmkKLQotCi0jIENoZWNrIGZvciBicm9rZW4gc25wcmludGYKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19zbnByaW50ZiIgPSAieHllcyIgOyB0aGVuCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHNucHJpbnRmIGNvcnJlY3RseSB0ZXJtaW5hdGVzIGxvbmcgc3RyaW5ncyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHNucHJpbnRmIGNvcnJlY3RseSB0ZXJtaW5hdGVzIGxvbmcgc3RyaW5ncy4uLiAiID4mNjsgfQotCWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBBc3N1bWluZyB3b3JraW5nIHNucHJpbnRmKCkiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBBc3N1bWluZyB3b3JraW5nIHNucHJpbnRmKCkiID4mMjt9Ci0KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxzdGRpby5oPgotaW50Ci1tYWluICgpCi17Ci0KLQljaGFyIGJbNV07Ci0Jc25wcmludGYoYiw1LCIxMjM0NTY3ODkiKTsKLQlleGl0KGJbNF0hPSdcMCcpOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQotJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NOUFJJTlRGIDEiID4+Y29uZmRlZnMuaAotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICoqKioqKiBZb3VyIHNucHJpbnRmKCkgZnVuY3Rpb24gaXMgYnJva2VuLCBjb21wbGFpbiB0byB5b3VyIHZlbmRvciIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAqKioqKiogWW91ciBzbnByaW50ZigpIGZ1bmN0aW9uIGlzIGJyb2tlbiwgY29tcGxhaW4gdG8geW91ciB2ZW5kb3IiID4mMjt9Ci0KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1maQotCi0jIElmIHdlIGRvbid0IGhhdmUgYSB3b3JraW5nIGFzcHJpbnRmLCB0aGVuIHdlIHN0cm9uZ2x5IGRlcGVuZCBvbiB2c25wcmludGYKLSMgcmV0dXJuaW5nIHRoZSByaWdodCB0aGluZyBvbiBvdmVyZmxvdzogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGl0IHRyaWVkIHRvCi0jIGNyZWF0ZSAoYXMgcGVyIFNVU3YzKQotaWYgdGVzdCAieCRhY19jdl9mdW5jX2FzcHJpbnRmIiAhPSAieHllcyIgJiYgXAotICAgdGVzdCAieCRhY19jdl9mdW5jX3ZzbnByaW50ZiIgPSAieHllcyIgOyB0aGVuCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHZzbnByaW50ZiByZXR1cm5zIGNvcnJlY3QgdmFsdWVzIG9uIG92ZXJmbG93IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdnNucHJpbnRmIHJldHVybnMgY29ycmVjdCB2YWx1ZXMgb24gb3ZlcmZsb3cuLi4gIiA+JjY7IH0KLQlpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogQXNzdW1pbmcgd29ya2luZyB2c25wcmludGYoKSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IEFzc3VtaW5nIHdvcmtpbmcgdnNucHJpbnRmKCkiID4mMjt9Ci0KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotaW50IHhfc25wcmludGYoY2hhciAqc3RyLHNpemVfdCBjb3VudCxjb25zdCBjaGFyICpmbXQsLi4uKQotewotCXNpemVfdCByZXQ7IHZhX2xpc3QgYXA7Ci0JdmFfc3RhcnQoYXAsIGZtdCk7IHJldCA9IHZzbnByaW50ZihzdHIsIGNvdW50LCBmbXQsIGFwKTsgdmFfZW5kKGFwKTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQKLW1haW4gKCkKLXsKLQotCWNoYXIgeFsxXTsKLQlleGl0KHhfc25wcmludGYoeCwgMSwgIiVzICVkIiwgImhlbGxvIiwgMTIzNDUpID09IDExID8gMCA6IDEpOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQotJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1NOUFJJTlRGIDEiID4+Y29uZmRlZnMuaAotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICoqKioqKiBZb3VyIHZzbnByaW50ZigpIGZ1bmN0aW9uIGlzIGJyb2tlbiwgY29tcGxhaW4gdG8geW91ciB2ZW5kb3IiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogKioqKioqIFlvdXIgdnNucHJpbnRmKCkgZnVuY3Rpb24gaXMgYnJva2VuLCBjb21wbGFpbiB0byB5b3VyIHZlbmRvciIgPiYyO30KLQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi0KLSMgT24gc3lzdGVtcyB3aGVyZSBbdl1zbnByaW50ZiBpcyBicm9rZW4sIGJ1dCBpcyBkZWNsYXJlZCBpbiBzdGRpbywKLSMgY2hlY2sgdGhhdCB0aGUgZm10IGFyZ3VtZW50IGlzIGNvbnN0IGNoYXIgKiBvciBqdXN0IGNoYXIgKi4KLSMgVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3Igd2hlbiBCUk9LRU5fU05QUklOVEYKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBzbnByaW50ZiBjYW4gZGVjbGFyZSBjb25zdCBjaGFyICpmbXQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzbnByaW50ZiBjYW4gZGVjbGFyZSBjb25zdCBjaGFyICpmbXQuLi4gIiA+JjY7IH0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci1pbnQgc25wcmludGYoY2hhciAqYSwgc2l6ZV90IGIsIGNvbnN0IGNoYXIgKmMsIC4uLikgeyByZXR1cm4gMDsgfQotCi1pbnQKLW1haW4gKCkKLXsKLQotCXNucHJpbnRmKDAsIDAsIDApOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQotJGFzX2VjaG8gIiNkZWZpbmUgU05QUklOVEZfQ09OU1QgY29uc3QiID4+Y29uZmRlZnMuaAotCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICAgICRhc19lY2hvICIjZGVmaW5lIFNOUFJJTlRGX0NPTlNUIC8qIG5vdCBjb25zdCAqLyIgPj5jb25mZGVmcy5oCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotIyBDaGVjayBmb3IgbWlzc2luZyBnZXRwZWVyZWlkIChvciBlcXVpdikgc3VwcG9ydAotTk9fUEVFUkNIRUNLPSIiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0cGVlcmVpZCIgIT0gInh5ZXMiIC1hICJ4JGFjX2N2X2Z1bmNfZ2V0cGVlcnVjcmVkIiAhPSAieHllcyI7IHRoZW4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgc3lzdGVtIHN1cHBvcnRzIFNPX1BFRVJDUkVEIGdldHNvY2tvcHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzeXN0ZW0gc3VwcG9ydHMgU09fUEVFUkNSRUQgZ2V0c29ja29wdC4uLiAiID4mNjsgfQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLWludAotbWFpbiAoKQotewotaW50IGkgPSBTT19QRUVSQ1JFRDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TT19QRUVSQ1JFRCAxIiA+PmNvbmZkZWZzLmgKLQotCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQlOT19QRUVSQ0hFQ0s9MQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfbWtkdGVtcCIgPSAieHllcyIgOyB0aGVuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAob3Zlcmx5KSBzdHJpY3QgbWtzdGVtcCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgKG92ZXJseSkgc3RyaWN0IG1rc3RlbXAuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCQkkYXNfZWNobyAiI2RlZmluZSBIQVZFX1NUUklDVF9NS1NURU1QIDEiID4+Y29uZmRlZnMuaAotCi0KLQotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLQljaGFyIHRlbXBsYXRlW109ImNvbmZ0ZXN0Lm1rc3RlbXAtdGVzdCI7Ci0JaWYgKG1rc3RlbXAodGVtcGxhdGUpID09IC0xKQotCQlleGl0KDEpOwotCXVubGluayh0ZW1wbGF0ZSk7Ci0JZXhpdCgwKTsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQotZWxzZQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1RSSUNUX01LU1RFTVAgMSIgPj5jb25mZGVmcy5oCi0KLQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi0KLWlmIHRlc3QgISAteiAiJGNoZWNrX2Zvcl9vcGVucHR5X2N0dHlfYnVnIjsgdGhlbgotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgb3BlbnB0eSBjb3JyZWN0bHkgaGFuZGxlcyBjb250cm9sbGluZyB0dHkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgb3BlbnB0eSBjb3JyZWN0bHkgaGFuZGxlcyBjb250cm9sbGluZyB0dHkuLi4gIiA+JjY7IH0KLQlpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBjcm9zcy1jb21waWxpbmcsIGFzc3VtaW5nIHllcyIgPiY1Ci0kYXNfZWNobyAiY3Jvc3MtY29tcGlsaW5nLCBhc3N1bWluZyB5ZXMiID4mNjsgfQotCi0KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotCXBpZF90IHBpZDsKLQlpbnQgZmQsIHB0eWZkLCB0dHlmZCwgc3RhdHVzOwotCi0JcGlkID0gZm9yaygpOwotCWlmIChwaWQgPCAwKSB7CQkvKiBmYWlsZWQgKi8KLQkJZXhpdCgxKTsKLQl9IGVsc2UgaWYgKHBpZCA+IDApIHsJLyogcGFyZW50ICovCi0JCXdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKTsKLQkJaWYgKFdJRkVYSVRFRChzdGF0dXMpKQotCQkJZXhpdChXRVhJVFNUQVRVUyhzdGF0dXMpKTsKLQkJZWxzZQotCQkJZXhpdCgyKTsKLQl9IGVsc2UgewkJLyogY2hpbGQgKi8KLQkJY2xvc2UoMCk7IGNsb3NlKDEpOyBjbG9zZSgyKTsKLQkJc2V0c2lkKCk7Ci0JCW9wZW5wdHkoJnB0eWZkLCAmdHR5ZmQsIE5VTEwsIE5VTEwsIE5VTEwpOwotCQlmZCA9IG9wZW4oIi9kZXYvdHR5IiwgT19SRFdSIHwgT19OT0NUVFkpOwotCQlpZiAoZmQgPj0gMCkKLQkJCWV4aXQoMyk7CS8qIEFjcXVpcmVkIGN0dHk6IGJyb2tlbiAqLwotCQllbHNlCi0JCQlleGl0KDApOwkvKiBEaWQgbm90IGFjcXVpcmUgY3R0eTogT0sgKi8KLQl9Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0KLWVsc2UKLQotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0JCQkkYXNfZWNobyAiI2RlZmluZSBTU0hEX0FDUVVJUkVTX0NUVFkgMSIgPj5jb25mZGVmcy5oCi0KLQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi0KLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRhZGRyaW5mbyIgPSAieHllcyIgJiYgXAotICAgIHRlc3QgIngkY2hlY2tfZm9yX2hwdXhfYnJva2VuX2dldGFkZHJpbmZvIiA9ICJ4MSI7IHRoZW4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGdldGFkZHJpbmZvIHNlZW1zIHRvIHdvcmsiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgZ2V0YWRkcmluZm8gc2VlbXMgdG8gd29yay4uLiAiID4mNjsgfQotCWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLQotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGNyb3NzLWNvbXBpbGluZywgYXNzdW1pbmcgeWVzIiA+JjUKLSRhc19lY2hvICJjcm9zcy1jb21waWxpbmcsIGFzc3VtaW5nIHllcyIgPiY2OyB9Ci0KLQotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi0jZGVmaW5lIFRFU1RfUE9SVCAiMjIyMiIKLQotaW50Ci1tYWluICgpCi17Ci0KLQlpbnQgZXJyLCBzb2NrOwotCXN0cnVjdCBhZGRyaW5mbyAqZ2FpX2FpLCAqYWksIGhpbnRzOwotCWNoYXIgbnRvcFtOSV9NQVhIT1NUXSwgc3RycG9ydFtOSV9NQVhTRVJWXSwgKm5hbWUgPSBOVUxMOwotCi0JbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOwotCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0JaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOwotCi0JZXJyID0gZ2V0YWRkcmluZm8obmFtZSwgVEVTVF9QT1JULCAmaGludHMsICZnYWlfYWkpOwotCWlmIChlcnIgIT0gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImdldGFkZHJpbmZvIGZhaWxlZCAoJXMpIiwgZ2FpX3N0cmVycm9yKGVycikpOwotCQlleGl0KDEpOwotCX0KLQotCWZvciAoYWkgPSBnYWlfYWk7IGFpICE9IE5VTEw7IGFpID0gYWktPmFpX25leHQpIHsKLQkJaWYgKGFpLT5haV9mYW1pbHkgIT0gQUZfSU5FVDYpCi0JCQljb250aW51ZTsKLQotCQllcnIgPSBnZXRuYW1laW5mbyhhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4sIG50b3AsCi0JCSAgICBzaXplb2YobnRvcCksIHN0cnBvcnQsIHNpemVvZihzdHJwb3J0KSwKLQkJICAgIE5JX05VTUVSSUNIT1NUfE5JX05VTUVSSUNTRVJWKTsKLQotCQlpZiAoZXJyICE9IDApIHsKLQkJCWlmIChlcnIgPT0gRUFJX1NZU1RFTSkKLQkJCQlwZXJyb3IoImdldG5hbWVpbmZvIEVBSV9TWVNURU0iKTsKLQkJCWVsc2UKLQkJCQlmcHJpbnRmKHN0ZGVyciwgImdldG5hbWVpbmZvIGZhaWxlZDogJXNcbiIsCi0JCQkJICAgIGdhaV9zdHJlcnJvcihlcnIpKTsKLQkJCWV4aXQoMik7Ci0JCX0KLQotCQlzb2NrID0gc29ja2V0KGFpLT5haV9mYW1pbHksIGFpLT5haV9zb2NrdHlwZSwgYWktPmFpX3Byb3RvY29sKTsKLQkJaWYgKHNvY2sgPCAwKQotCQkJcGVycm9yKCJzb2NrZXQiKTsKLQkJaWYgKGJpbmQoc29jaywgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKSA8IDApIHsKLQkJCWlmIChlcnJubyA9PSBFQkFERikKLQkJCQlleGl0KDMpOwotCQl9Ci0JfQotCWV4aXQoMCk7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0KLWVsc2UKLQotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0JCQkkYXNfZWNobyAiI2RlZmluZSBCUk9LRU5fR0VUQUREUklORk8gMSIgPj5jb25mZGVmcy5oCi0KLQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi0KLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRhZGRyaW5mbyIgPSAieHllcyIgJiYgXAotICAgIHRlc3QgIngkY2hlY2tfZm9yX2FpeF9icm9rZW5fZ2V0YWRkcmluZm8iID0gIngxIjsgdGhlbgotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgZ2V0YWRkcmluZm8gc2VlbXMgdG8gd29yayIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiBnZXRhZGRyaW5mbyBzZWVtcyB0byB3b3JrLi4uICIgPiY2OyB9Ci0JaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogY3Jvc3MtY29tcGlsaW5nLCBhc3N1bWluZyBubyIgPiY1Ci0kYXNfZWNobyAiY3Jvc3MtY29tcGlsaW5nLCBhc3N1bWluZyBubyIgPiY2OyB9Ci0KLQotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi0jZGVmaW5lIFRFU1RfUE9SVCAiMjIyMiIKLQotaW50Ci1tYWluICgpCi17Ci0KLQlpbnQgZXJyLCBzb2NrOwotCXN0cnVjdCBhZGRyaW5mbyAqZ2FpX2FpLCAqYWksIGhpbnRzOwotCWNoYXIgbnRvcFtOSV9NQVhIT1NUXSwgc3RycG9ydFtOSV9NQVhTRVJWXSwgKm5hbWUgPSBOVUxMOwotCi0JbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOwotCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0JaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOwotCi0JZXJyID0gZ2V0YWRkcmluZm8obmFtZSwgVEVTVF9QT1JULCAmaGludHMsICZnYWlfYWkpOwotCWlmIChlcnIgIT0gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImdldGFkZHJpbmZvIGZhaWxlZCAoJXMpIiwgZ2FpX3N0cmVycm9yKGVycikpOwotCQlleGl0KDEpOwotCX0KLQotCWZvciAoYWkgPSBnYWlfYWk7IGFpICE9IE5VTEw7IGFpID0gYWktPmFpX25leHQpIHsKLQkJaWYgKGFpLT5haV9mYW1pbHkgIT0gQUZfSU5FVCAmJiBhaS0+YWlfZmFtaWx5ICE9IEFGX0lORVQ2KQotCQkJY29udGludWU7Ci0KLQkJZXJyID0gZ2V0bmFtZWluZm8oYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuLCBudG9wLAotCQkgICAgc2l6ZW9mKG50b3ApLCBzdHJwb3J0LCBzaXplb2Yoc3RycG9ydCksCi0JCSAgICBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVik7Ci0KLQkJaWYgKGFpLT5haV9mYW1pbHkgPT0gQUZfSU5FVCAmJiBlcnIgIT0gMCkgewotCQkJcGVycm9yKCJnZXRuYW1laW5mbyIpOwotCQkJZXhpdCgyKTsKLQkJfQotCX0KLQlleGl0KDApOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi0kYXNfZWNobyAiI2RlZmluZSBBSVhfR0VUTkFNRUlORk9fSEFDSyAxIiA+PmNvbmZkZWZzLmgKLQotCi1lbHNlCi0KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQkJJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX0dFVEFERFJJTkZPIDEiID4+Y29uZmRlZnMuaAotCi0KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1maQotCi1pZiB0ZXN0ICJ4JGNoZWNrX2Zvcl9jb25mbGljdGluZ19nZXRzcG5hbSIgPSAieDEiOyB0aGVuCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgY29uZmxpY3RpbmcgZ2V0c3BuYW0gaW4gc2hhZG93LmgiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGNvbmZsaWN0aW5nIGdldHNwbmFtIGluIHNoYWRvdy5oLi4uICIgPiY2OyB9Ci0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxzaGFkb3cuaD4KLWludAotbWFpbiAoKQotewotIGV4aXQoMCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLQotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0KLWVsc2UKLQotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQotJGFzX2VjaG8gIiNkZWZpbmUgR0VUU1BOQU1fQ09ORkxJQ1RJTkdfREVGUyAxIiA+PmNvbmZkZWZzLmgKLQotCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBnZXRwZ3JwIHJlcXVpcmVzIHplcm8gYXJndW1lbnRzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgZ2V0cGdycCByZXF1aXJlcyB6ZXJvIGFyZ3VtZW50cy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9mdW5jX2dldHBncnBfdm9pZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gICMgVXNlIGl0IHdpdGggYSBzaW5nbGUgYXJnLgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWludAotbWFpbiAoKQotewotZ2V0cGdycCAoMCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19nZXRwZ3JwX3ZvaWQ9bm8KLWVsc2UKLSAgYWNfY3ZfZnVuY19nZXRwZ3JwX3ZvaWQ9eWVzCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfZ2V0cGdycF92b2lkIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfZnVuY19nZXRwZ3JwX3ZvaWQiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfZnVuY19nZXRwZ3JwX3ZvaWQgPSB5ZXM7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgR0VUUEdSUF9WT0lEIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0KLSMgU2VhcmNoIGZvciBPcGVuU1NMCi1zYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotc2F2ZWRfTERGTEFHUz0iJExERkxBR1MiCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3NsLWRpciB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfc3NsX2RpcitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfc3NsX2RpcjsKLQkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQkJCWNhc2UgIiR3aXRodmFsIiBpbgotCQkJCSMgUmVsYXRpdmUgcGF0aHMKLQkJCQkuLyp8Li4vKikJd2l0aHZhbD0iYHB3ZGAvJHdpdGh2YWwiCi0JCQllc2FjCi0JCQlpZiB0ZXN0IC1kICIkd2l0aHZhbC9saWIiOyB0aGVuCi0JCQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCi0JCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfS9saWIgLVIke3dpdGh2YWx9L2xpYiAke0xERkxBR1N9IgotCQkJCWVsc2UKLQkJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAke0xERkxBR1N9IgotCQkJCWZpCi0JCQllbGlmIHRlc3QgLWQgIiR3aXRodmFsL2xpYjY0IjsgdGhlbgotCQkJCWlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgotCQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0vbGliNjQgLVIke3dpdGh2YWx9L2xpYjY0ICR7TERGTEFHU30iCi0JCQkJZWxzZQotCQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0vbGliNjQgJHtMREZMQUdTfSIKLQkJCQlmaQotCQkJZWxzZQotCQkJCWlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgotCQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0gLVIke3dpdGh2YWx9ICR7TERGTEFHU30iCi0JCQkJZWxzZQotCQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0gJHtMREZMQUdTfSIKLQkJCQlmaQotCQkJZmkKLQkJCWlmIHRlc3QgLWQgIiR3aXRodmFsL2luY2x1ZGUiOyB0aGVuCi0JCQkJQ1BQRkxBR1M9Ii1JJHt3aXRodmFsfS9pbmNsdWRlICR7Q1BQRkxBR1N9IgotCQkJZWxzZQotCQkJCUNQUEZMQUdTPSItSSR7d2l0aHZhbH0gJHtDUFBGTEFHU30iCi0JCQlmaQotCQlmaQotCi0KLWZpCi0KLUxJQlM9Ii1sY3J5cHRvICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFJBTkRfYWRkICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gUkFORF9hZGQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9PUEVOU1NMIDEiID4+Y29uZmRlZnMuaAotCi1lbHNlCi0KLQkJCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KLQkJCUxERkxBR1M9Ii1ML3Vzci9sb2NhbC9zc2wvbGliIC1SL3Vzci9sb2NhbC9zc2wvbGliICR7c2F2ZWRfTERGTEFHU30iCi0JCWVsc2UKLQkJCUxERkxBR1M9Ii1ML3Vzci9sb2NhbC9zc2wvbGliICR7c2F2ZWRfTERGTEFHU30iCi0JCWZpCi0JCUNQUEZMQUdTPSItSS91c3IvbG9jYWwvc3NsL2luY2x1ZGUgJHtzYXZlZF9DUFBGTEFHU30iCi0JCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJvcGVuc3NsL29wZW5zc2x2LmgiICJhY19jdl9oZWFkZXJfb3BlbnNzbF9vcGVuc3Nsdl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9vcGVuc3NsX29wZW5zc2x2X2giID0geHllczsgdGhlbiA6Ci0KLWVsc2UKLSAgYXNfZm5fZXJyb3IgJD8gIioqKiBPcGVuU1NMIGhlYWRlcnMgbWlzc2luZyAtIHBsZWFzZSBpbnN0YWxsIGZpcnN0IG9yIGNoZWNrIGNvbmZpZy5sb2cgKioqIiAiJExJTkVOTyIgNQotZmkKLQotCi0JCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBSQU5EX2FkZCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIFJBTkRfYWRkICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gICRhc19lY2hvICIjZGVmaW5lIEhBVkVfT1BFTlNTTCAxIiA+PmNvbmZkZWZzLmgKLQotZWxzZQotCi0JCQkJYXNfZm5fZXJyb3IgJD8gIioqKiBDYW4ndCBmaW5kIHJlY2VudCBPcGVuU1NMIGxpYmNyeXB0byAoc2VlIGNvbmZpZy5sb2cgZm9yIGRldGFpbHMpICoqKiIgIiRMSU5FTk8iIDUKLQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotIyBEZXRlcm1pbmUgT3BlblNTTCBoZWFkZXIgdmVyc2lvbgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBPcGVuU1NMIGhlYWRlciB2ZXJzaW9uIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIE9wZW5TU0wgaGVhZGVyIHZlcnNpb24uLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIiA+JjI7fQotCi0KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+Ci0jZGVmaW5lIERBVEEgImNvbmZ0ZXN0LnNzbGluY3ZlciIKLQotaW50Ci1tYWluICgpCi17Ci0KLQlGSUxFICpmZDsKLQlpbnQgcmM7Ci0KLQlmZCA9IGZvcGVuKERBVEEsInciKTsKLQlpZihmZCA9PSBOVUxMKQotCQlleGl0KDEpOwotCi0JaWYgKChyYyA9IGZwcmludGYoZmQgLCIleCAoJXMpXG4iLCBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSLCBPUEVOU1NMX1ZFUlNJT05fVEVYVCkpIDwwKQotCQlleGl0KDEpOwotCi0JZXhpdCgwKTsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLQotCQlzc2xfaGVhZGVyX3Zlcj1gY2F0IGNvbmZ0ZXN0LnNzbGluY3ZlcmAKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRzc2xfaGVhZGVyX3ZlciIgPiY1Ci0kYXNfZWNobyAiJHNzbF9oZWFkZXJfdmVyIiA+JjY7IH0KLQotZWxzZQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub3QgZm91bmQiID4mNQotJGFzX2VjaG8gIm5vdCBmb3VuZCIgPiY2OyB9Ci0JCWFzX2ZuX2Vycm9yICQ/ICJPcGVuU1NMIHZlcnNpb24gaGVhZGVyIG5vdCBmb3VuZC4iICIkTElORU5PIiA1Ci0KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0KLSMgRGV0ZXJtaW5lIE9wZW5TU0wgbGlicmFyeSB2ZXJzaW9uCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIE9wZW5TU0wgbGlicmFyeSB2ZXJzaW9uIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIE9wZW5TU0wgbGlicmFyeSB2ZXJzaW9uLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyIgPiYyO30KLQotCi1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgotI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+Ci0jZGVmaW5lIERBVEEgImNvbmZ0ZXN0LnNzbGxpYnZlciIKLQotaW50Ci1tYWluICgpCi17Ci0KLQlGSUxFICpmZDsKLQlpbnQgcmM7Ci0KLQlmZCA9IGZvcGVuKERBVEEsInciKTsKLQlpZihmZCA9PSBOVUxMKQotCQlleGl0KDEpOwotCi0JaWYgKChyYyA9IGZwcmludGYoZmQgLCIleCAoJXMpXG4iLCBTU0xlYXkoKSwgU1NMZWF5X3ZlcnNpb24oU1NMRUFZX1ZFUlNJT04pKSkgPDApCi0JCWV4aXQoMSk7Ci0KLQlleGl0KDApOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotCi0JCXNzbF9saWJyYXJ5X3Zlcj1gY2F0IGNvbmZ0ZXN0LnNzbGxpYnZlcmAKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRzc2xfbGlicmFyeV92ZXIiID4mNQotJGFzX2VjaG8gIiRzc2xfbGlicmFyeV92ZXIiID4mNjsgfQotCi1lbHNlCi0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vdCBmb3VuZCIgPiY1Ci0kYXNfZWNobyAibm90IGZvdW5kIiA+JjY7IH0KLQkJYXNfZm5fZXJyb3IgJD8gIk9wZW5TU0wgbGlicmFyeSBub3QgZm91bmQuIiAiJExJTkVOTyIgNQotCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtb3BlbnNzbC1oZWFkZXItY2hlY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX29wZW5zc2xfaGVhZGVyX2NoZWNrK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9vcGVuc3NsX2hlYWRlcl9jaGVjazsgICBpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyIgOyB0aGVuCi0JCW9wZW5zc2xfY2hlY2tfbm9uZmF0YWw9MQotCSAgIGZpCi0KLQotZmkKLQotCi0jIFNhbml0eSBjaGVjayBPcGVuU1NMIGhlYWRlcnMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBPcGVuU1NMJ3MgaGVhZGVycyBtYXRjaCB0aGUgbGlicmFyeSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIE9wZW5TU0wncyBoZWFkZXJzIG1hdGNoIHRoZSBsaWJyYXJ5Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyIgPiYyO30KLQotCi1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbHYuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLQlleGl0KFNTTGVheSgpID09IE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPyAwIDogMSk7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQotZWxzZQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQlpZiB0ZXN0ICJ4JG9wZW5zc2xfY2hlY2tfbm9uZmF0YWwiID0gIngiOyB0aGVuCi0JCQlhc19mbl9lcnJvciAkPyAiWW91ciBPcGVuU1NMIGhlYWRlcnMgZG8gbm90IG1hdGNoIHlvdXIKLWxpYnJhcnkuIENoZWNrIGNvbmZpZy5sb2cgZm9yIGRldGFpbHMuCi1JZiB5b3UgYXJlIHN1cmUgeW91ciBpbnN0YWxsYXRpb24gaXMgY29uc2lzdGVudCwgeW91IGNhbiBkaXNhYmxlIHRoZSBjaGVjawotYnkgcnVubmluZyBcIi4vY29uZmlndXJlIC0td2l0aG91dC1vcGVuc3NsLWhlYWRlci1jaGVja1wiLgotQWxzbyBzZWUgY29udHJpYi9maW5kc3NsLnNoIGZvciBoZWxwIGlkZW50aWZ5aW5nIGhlYWRlci9saWJyYXJ5IG1pc21hdGNoZXMuCi0iICIkTElORU5PIiA1Ci0JCWVsc2UKLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogWW91ciBPcGVuU1NMIGhlYWRlcnMgZG8gbm90IG1hdGNoIHlvdXIKLWxpYnJhcnkuIENoZWNrIGNvbmZpZy5sb2cgZm9yIGRldGFpbHMuCi1BbHNvIHNlZSBjb250cmliL2ZpbmRzc2wuc2ggZm9yIGhlbHAgaWRlbnRpZnlpbmcgaGVhZGVyL2xpYnJhcnkgbWlzbWF0Y2hlcy4iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogWW91ciBPcGVuU1NMIGhlYWRlcnMgZG8gbm90IG1hdGNoIHlvdXIKLWxpYnJhcnkuIENoZWNrIGNvbmZpZy5sb2cgZm9yIGRldGFpbHMuCi1BbHNvIHNlZSBjb250cmliL2ZpbmRzc2wuc2ggZm9yIGhlbHAgaWRlbnRpZnlpbmcgaGVhZGVyL2xpYnJhcnkgbWlzbWF0Y2hlcy4iID4mMjt9Ci0JCWZpCi0KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgcHJvZ3JhbXMgdXNpbmcgT3BlblNTTCBmdW5jdGlvbnMgd2lsbCBsaW5rIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHByb2dyYW1zIHVzaW5nIE9wZW5TU0wgZnVuY3Rpb25zIHdpbGwgbGluay4uLiAiID4mNjsgfQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotaW50Ci1tYWluICgpCi17Ci0gU1NMZWF5X2FkZF9hbGxfYWxnb3JpdGhtcygpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQotZWxzZQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQlzYXZlZF9MSUJTPSIkTElCUyIKLQkJTElCUz0iJExJQlMgLWxkbCIKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBwcm9ncmFtcyB1c2luZyBPcGVuU1NMIG5lZWQgLWxkbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiBwcm9ncmFtcyB1c2luZyBPcGVuU1NMIG5lZWQgLWxkbC4uLiAiID4mNjsgfQotCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci1pbnQKLW1haW4gKCkKLXsKLSBTU0xlYXlfYWRkX2FsbF9hbGdvcml0aG1zKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLQotCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0KLWVsc2UKLQotCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQkJCUxJQlM9IiRzYXZlZF9MSUJTIgotCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCi1mb3IgYWNfZnVuYyBpbiBSU0FfZ2VuZXJhdGVfa2V5X2V4IERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzX2V4IEJOX2lzX3ByaW1lX2V4IFJTQV9nZXRfZGVmYXVsdF9tZXRob2QKLWRvIDoKLSAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotZG9uZQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zc2wtZW5naW5lIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9zc2xfZW5naW5lK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9zc2xfZW5naW5lOyAgaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgT3BlblNTTCBFTkdJTkUgc3VwcG9ydCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgT3BlblNTTCBFTkdJTkUgc3VwcG9ydC4uLiAiID4mNjsgfQotCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotCUVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpOwotCUVOR0lORV9yZWdpc3Rlcl9hbGxfY29tcGxldGUoKTsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi0kYXNfZWNobyAiI2RlZmluZSBVU0VfT1BFTlNTTF9FTkdJTkUgMSIgPj5jb25mZGVmcy5oCi0KLQotZWxzZQotICAgYXNfZm5fZXJyb3IgJD8gIk9wZW5TU0wgRU5HSU5FIHN1cHBvcnQgbm90IGZvdW5kIiAiJExJTkVOTyIgNQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0JICBmaQotCi1maQotCi0KLSMgQ2hlY2sgZm9yIE9wZW5TU0wgd2l0aG91dCBFVlBfYWVzX3sxOTIsMjU2fV9jYmMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBPcGVuU1NMIGhhcyBjcmlwcGxlZCBBRVMgc3VwcG9ydCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIE9wZW5TU0wgaGFzIGNyaXBwbGVkIEFFUyBzdXBwb3J0Li4uICIgPiY2OyB9Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotCWV4aXQoRVZQX2Flc18xOTJfY2JjKCkgPT0gTlVMTCB8fCBFVlBfYWVzXzI1Nl9jYmMoKSA9PSBOVUxMKTsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0KLWVsc2UKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi0kYXNfZWNobyAiI2RlZmluZSBPUEVOU1NMX0xPQk9UT01JU0VEX0FFUyAxIiA+PmNvbmZkZWZzLmgKLQotCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIEVWUF9EaWdlc3RVcGRhdGUgcmV0dXJucyBhbiBpbnQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgRVZQX0RpZ2VzdFVwZGF0ZSByZXR1cm5zIGFuIGludC4uLiAiID4mNjsgfQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLQlpZihFVlBfRGlnZXN0VXBkYXRlKE5VTEwsIE5VTEwsMCkpCi0JCWV4aXQoMCk7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0KLWVsc2UKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQotJGFzX2VjaG8gIiNkZWZpbmUgT1BFTlNTTF9FVlBfRElHRVNUVVBEQVRFX1ZPSUQgMSIgPj5jb25mZGVmcy5oCi0KLQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotIyBTb21lIHN5c3RlbXMgd2FudCBjcnlwdCgpIGZyb20gbGliY3J5cHQsICpub3QqIHRoZSB2ZXJzaW9uIGluIE9wZW5TU0wsCi0jIGJlY2F1c2UgdGhlIHN5c3RlbSBjcnlwdCgpIGlzIG1vcmUgZmVhdHVyZWZ1bC4KLWlmIHRlc3QgIngkY2hlY2tfZm9yX2xpYmNyeXB0X2JlZm9yZSIgPSAieDEiOyB0aGVuCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgY3J5cHQgaW4gLWxjcnlwdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgY3J5cHQgaW4gLWxjcnlwdC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfY3J5cHRfY3J5cHQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGNyeXB0ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBjcnlwdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGNyeXB0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9jcnlwdF9jcnlwdD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2NyeXB0X2NyeXB0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9jcnlwdF9jcnlwdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9jcnlwdF9jcnlwdCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9jcnlwdF9jcnlwdCIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xJQkNSWVBUIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1sY3J5cHQgJExJQlMiCi0KLWZpCi0KLWZpCi0KLSMgU29tZSBMaW51eCBzeXN0ZW1zIChTbGFja3dhcmUpIG5lZWQgY3J5cHQoKSBmcm9tIGxpYmNyeXB0LCAqbm90KiB0aGUKLSMgdmVyc2lvbiBpbiBPcGVuU1NMLgotaWYgdGVzdCAieCRjaGVja19mb3JfbGliY3J5cHRfbGF0ZXIiID0gIngxIjsgdGhlbgotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGNyeXB0IGluIC1sY3J5cHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGNyeXB0IGluIC1sY3J5cHQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2NyeXB0X2NyeXB0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxjcnlwdCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgY3J5cHQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBjcnlwdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfY3J5cHRfY3J5cHQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9jcnlwdF9jcnlwdD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfY3J5cHRfY3J5cHQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfY3J5cHRfY3J5cHQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfY3J5cHRfY3J5cHQiID0geHllczsgdGhlbiA6Ci0gIExJQlM9IiRMSUJTIC1sY3J5cHQiCi1maQotCi1maQotCi0jIFNlYXJjaCBmb3IgU0hBMjU2IHN1cHBvcnQgaW4gbGliYyBhbmQvb3IgT3BlblNTTAotZm9yIGFjX2Z1bmMgaW4gU0hBMjU2X1VwZGF0ZSBFVlBfc2hhMjU2Ci1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLSBURVNUX1NTSF9TSEEyNTY9eWVzCi1lbHNlCi0gIFRFU1RfU1NIX1NIQTI1Nj1ubwotZmkKLWRvbmUKLQotCi0KLSMgQ2hlY2sgY29tcGxldGUgRUNDIHN1cHBvcnQgaW4gT3BlblNTTAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIE9wZW5TU0wgaGFzIGNvbXBsZXRlIEVDQyBzdXBwb3J0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgT3BlblNTTCBoYXMgY29tcGxldGUgRUNDIHN1cHBvcnQuLi4gIiA+JjY7IH0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2VjZGguaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+Ci0jaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MDA5MDgwN2YgLyogMC45LjhnICovCi0jIGVycm9yICJPcGVuU1NMIDwgMC45LjhnIGhhcyB1bnJlbGlhYmxlIEVDQyBjb2RlIgotI2VuZGlmCi0KLWludAotbWFpbiAoKQotewotCi0JRUNfS0VZICplID0gRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKE5JRF9zZWNwNTIxcjEpOwotCWNvbnN0IEVWUF9NRCAqbSA9IEVWUF9zaGE1MTIoKTsgLyogV2UgbmVlZCB0aGlzIHRvbyAqLwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi0kYXNfZWNobyAiI2RlZmluZSBPUEVOU1NMX0hBU19FQ0MgMSIgPj5jb25mZGVmcy5oCi0KLQkJVEVTVF9TU0hfRUNDPXllcwotCQlDT01NRU5UX09VVF9FQ0M9IiIKLQotZWxzZQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQlURVNUX1NTSF9FQ0M9bm8KLQkJQ09NTUVOVF9PVVRfRUNDPSIjbm8gZWNjIyIKLQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotCi0KLXNhdmVkX0xJQlM9IiRMSUJTIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaWFfb3BlbmluZm8gaW4gLWxpYWYiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGlhX29wZW5pbmZvIGluIC1saWFmLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9pYWZfaWFfb3BlbmluZm8rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGlhZiAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgaWFfb3BlbmluZm8gKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBpYV9vcGVuaW5mbyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfaWFmX2lhX29wZW5pbmZvPXllcwotZWxzZQotICBhY19jdl9saWJfaWFmX2lhX29wZW5pbmZvPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9pYWZfaWFfb3BlbmluZm8iID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfaWFmX2lhX29wZW5pbmZvIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2lhZl9pYV9vcGVuaW5mbyIgPSB4eWVzOyB0aGVuIDoKLQotCUxJQlM9IiRMSUJTIC1saWFmIgotCWZvciBhY19mdW5jIGluIHNldF9pZAotZG8gOgotICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzZXRfaWQiICJhY19jdl9mdW5jX3NldF9pZCIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19zZXRfaWQiID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9TRVRfSUQgMQotX0FDRU9GCi0gU1NIRExJQlM9IiRTU0hETElCUyAtbGlhZiIKLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MSUJJQUYgMSIgPj5jb25mZGVmcy5oCi0KLQotZmkKLWRvbmUKLQotCi1maQotCi1MSUJTPSIkc2F2ZWRfTElCUyIKLQotIyMjIENvbmZpZ3VyZSBjcnlwdG9ncmFwaGljIHJhbmRvbSBudW1iZXIgc3VwcG9ydAotCi0jIENoZWNrIHdoZXRlciBPcGVuU1NMIHNlZWRzIGl0c2VsZgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIE9wZW5TU0wncyBQUk5HIGlzIGludGVybmFsbHkgc2VlZGVkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgT3BlblNTTCdzIFBSTkcgaXMgaW50ZXJuYWxseSBzZWVkZWQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogYXNzdW1pbmcgeWVzIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogYXNzdW1pbmcgeWVzIiA+JjI7fQotCQkjIFRoaXMgaXMgc2FmZSwgc2luY2Ugd2Ugd2lsbCBmYXRhbCgpIGF0IHJ1bnRpbWUgaWYKLQkJIyBPcGVuU1NMIGlzIG5vdCBzZWVkZWQgY29ycmVjdGx5LgotCQlPUEVOU1NMX1NFRURTX0lUU0VMRj15ZXMKLQotCi1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotCWV4aXQoUkFORF9zdGF0dXMoKSA9PSAxID8gMCA6IDEpOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotCi0JCU9QRU5TU0xfU0VFRFNfSVRTRUxGPXllcwotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi1lbHNlCi0KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0KLSMgUFJOR0QgVENQIHNvY2tldAotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXBybmdkLXBvcnQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3BybmdkX3BvcnQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3BybmdkX3BvcnQ7Ci0JCWNhc2UgIiR3aXRodmFsIiBpbgotCQlubykKLQkJCXdpdGh2YWw9IiIKLQkJCTs7Ci0JCVswLTldKikKLQkJCTs7Ci0JCSopCi0JCQlhc19mbl9lcnJvciAkPyAiWW91IG11c3Qgc3BlY2lmeSBhIG51bWVyaWMgcG9ydCBudW1iZXIgZm9yIC0td2l0aC1wcm5nZC1wb3J0IiAiJExJTkVOTyIgNQotCQkJOzsKLQkJZXNhYwotCQlpZiB0ZXN0ICEgLXogIiR3aXRodmFsIiA7IHRoZW4KLQkJCVBSTkdEX1BPUlQ9IiR3aXRodmFsIgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBSTkdEX1BPUlQgJFBSTkdEX1BPUlQKLV9BQ0VPRgotCi0JCWZpCi0KLQotZmkKLQotCi0jIFBSTkdEIFVuaXggZG9tYWluIHNvY2tldAotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXBybmdkLXNvY2tldCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfcHJuZ2Rfc29ja2V0K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9wcm5nZF9zb2NrZXQ7Ci0JCWNhc2UgIiR3aXRodmFsIiBpbgotCQl5ZXMpCi0JCQl3aXRodmFsPSIvdmFyL3J1bi9lZ2QtcG9vbCIKLQkJCTs7Ci0JCW5vKQotCQkJd2l0aHZhbD0iIgotCQkJOzsKLQkJLyopCi0JCQk7OwotCQkqKQotCQkJYXNfZm5fZXJyb3IgJD8gIllvdSBtdXN0IHNwZWNpZnkgYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgZW50cm9weSBzb2NrZXQiICIkTElORU5PIiA1Ci0JCQk7OwotCQllc2FjCi0KLQkJaWYgdGVzdCAhIC16ICIkd2l0aHZhbCIgOyB0aGVuCi0JCQlpZiB0ZXN0ICEgLXogIiRQUk5HRF9QT1JUIiA7IHRoZW4KLQkJCQlhc19mbl9lcnJvciAkPyAiWW91IG1heSBub3Qgc3BlY2lmeSBib3RoIGEgUFJOR0QvRUdEIHBvcnQgYW5kIHNvY2tldCIgIiRMSU5FTk8iIDUKLQkJCWZpCi0JCQlpZiB0ZXN0ICEgLXIgIiR3aXRodmFsIiA7IHRoZW4KLQkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IEVudHJvcHkgc29ja2V0IGlzIG5vdCByZWFkYWJsZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBFbnRyb3B5IHNvY2tldCBpcyBub3QgcmVhZGFibGUiID4mMjt9Ci0JCQlmaQotCQkJUFJOR0RfU09DS0VUPSIkd2l0aHZhbCIKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQUk5HRF9TT0NLRVQgIiRQUk5HRF9TT0NLRVQiCi1fQUNFT0YKLQotCQlmaQotCi1lbHNlCi0KLQkJIyBDaGVjayBmb3IgZXhpc3Rpbmcgc29ja2V0IG9ubHkgaWYgd2UgZG9uJ3QgaGF2ZSBhIHJhbmRvbSBkZXZpY2UgYWxyZWFkeQotCQlpZiB0ZXN0ICJ4JE9QRU5TU0xfU0VFRFNfSVRTRUxGIiAhPSAieHllcyIgOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBQUk5HRC9FR0Qgc29ja2V0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBQUk5HRC9FR0Qgc29ja2V0Li4uICIgPiY2OyB9Ci0JCQkjIEluc2VydCBvdGhlciBsb2NhdGlvbnMgaGVyZQotCQkJZm9yIHNvY2sgaW4gL3Zhci9ydW4vZWdkLXBvb2wgL2Rldi9lZ2QtcG9vbCAvZXRjL2VudHJvcHk7IGRvCi0JCQkJaWYgdGVzdCAtciAkc29jayAmJiAkVEVTVF9NSU5VU19TX1NIIC1jICJ0ZXN0IC1TICRzb2NrIC1vIC1wICRzb2NrIiA7IHRoZW4KLQkJCQkJUFJOR0RfU09DS0VUPSIkc29jayIKLQkJCQkJY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQUk5HRF9TT0NLRVQgIiRQUk5HRF9TT0NLRVQiCi1fQUNFT0YKLQotCQkJCQlicmVhazsKLQkJCQlmaQotCQkJZG9uZQotCQkJaWYgdGVzdCAhIC16ICIkUFJOR0RfU09DS0VUIiA7IHRoZW4KLQkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBSTkdEX1NPQ0tFVCIgPiY1Ci0kYXNfZWNobyAiJFBSTkdEX1NPQ0tFVCIgPiY2OyB9Ci0JCQllbHNlCi0JCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vdCBmb3VuZCIgPiY1Ci0kYXNfZWNobyAibm90IGZvdW5kIiA+JjY7IH0KLQkJCWZpCi0JCWZpCi0KLQotZmkKLQotCi0jIFdoaWNoIHJhbmRvbW5lc3Mgc291cmNlIGRvIHdlIHVzZT8KLWlmIHRlc3QgISAteiAiJFBSTkdEX1BPUlQiIDsgdGhlbgotCVJBTkRfTVNHPSJQUk5HZCBwb3J0ICRQUk5HRF9QT1JUIgotZWxpZiB0ZXN0ICEgLXogIiRQUk5HRF9TT0NLRVQiIDsgdGhlbgotCVJBTkRfTVNHPSJQUk5HZCBzb2NrZXQgJFBSTkdEX1NPQ0tFVCIKLWVsaWYgdGVzdCAhIC16ICIkT1BFTlNTTF9TRUVEU19JVFNFTEYiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBPUEVOU1NMX1BSTkdfT05MWSAxIiA+PmNvbmZkZWZzLmgKLQotCVJBTkRfTVNHPSJPcGVuU1NMIGludGVybmFsIE9OTFkiCi1lbHNlCi0JYXNfZm5fZXJyb3IgJD8gIk9wZW5TU0ggaGFzIG5vIHNvdXJjZSBvZiByYW5kb20gbnVtYmVycy4gUGxlYXNlIGNvbmZpZ3VyZSBPcGVuU1NMIHdpdGggYW4gZW50cm9weSBzb3VyY2Ugb3IgcmUtcnVuIGNvbmZpZ3VyZSB1c2luZyBvbmUgb2YgdGhlIC0td2l0aC1wcm5nZC1wb3J0IG9yIC0td2l0aC1wcm5nZC1zb2NrZXQgb3B0aW9ucyIgIiRMSU5FTk8iIDUKLWZpCi0KLSMgQ2hlY2sgZm9yIFBBTSBsaWJzCi1QQU1fTVNHPSJubyIKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1wYW0gd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3BhbStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfcGFtOwotCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgotCQkJaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc2VjdXJpdHlfcGFtX2FwcGxfaCIgIT0gInh5ZXMiICYmIFwKLQkJCSAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3BhbV9wYW1fYXBwbF9oIiAhPSAieHllcyIgOyB0aGVuCi0JCQkJYXNfZm5fZXJyb3IgJD8gIlBBTSBoZWFkZXJzIG5vdCBmb3VuZCIgIiRMSU5FTk8iIDUKLQkJCWZpCi0KLQkJCXNhdmVkX0xJQlM9IiRMSUJTIgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYl9kbF9kbG9wZW4rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGRsICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkbG9wZW4gKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkbG9wZW4gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2RsX2Rsb3Blbj15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2RsX2Rsb3Blbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbF9kbG9wZW4iID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJETCAxCi1fQUNFT0YKLQotICBMSUJTPSItbGRsICRMSUJTIgotCi1maQotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBwYW1fc2V0X2l0ZW0gaW4gLWxwYW0iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHBhbV9zZXRfaXRlbSBpbiAtbHBhbS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfcGFtX3BhbV9zZXRfaXRlbSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1scGFtICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBwYW1fc2V0X2l0ZW0gKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBwYW1fc2V0X2l0ZW0gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX3BhbV9wYW1fc2V0X2l0ZW09eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9wYW1fcGFtX3NldF9pdGVtPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9wYW1fcGFtX3NldF9pdGVtIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3BhbV9wYW1fc2V0X2l0ZW0iID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfcGFtX3BhbV9zZXRfaXRlbSIgPSB4eWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xJQlBBTSAxCi1fQUNFT0YKLQotICBMSUJTPSItbHBhbSAkTElCUyIKLQotZWxzZQotICBhc19mbl9lcnJvciAkPyAiKioqIGxpYnBhbSBtaXNzaW5nIiAiJExJTkVOTyIgNQotZmkKLQotCQkJZm9yIGFjX2Z1bmMgaW4gcGFtX2dldGVudmxpc3QKLWRvIDoKLSAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAicGFtX2dldGVudmxpc3QiICJhY19jdl9mdW5jX3BhbV9nZXRlbnZsaXN0IgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3BhbV9nZXRlbnZsaXN0IiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfUEFNX0dFVEVOVkxJU1QgMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLQkJCWZvciBhY19mdW5jIGluIHBhbV9wdXRlbnYKLWRvIDoKLSAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAicGFtX3B1dGVudiIgImFjX2N2X2Z1bmNfcGFtX3B1dGVudiIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19wYW1fcHV0ZW52IiA9IHh5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfUEFNX1BVVEVOViAxCi1fQUNFT0YKLQotZmkKLWRvbmUKLQotCQkJTElCUz0iJHNhdmVkX0xJQlMiCi0KLQkJCVBBTV9NU0c9InllcyIKLQotCQkJU1NIRExJQlM9IiRTU0hETElCUyAtbHBhbSIKLQotJGFzX2VjaG8gIiNkZWZpbmUgVVNFX1BBTSAxIiA+PmNvbmZkZWZzLmgKLQotCi0JCQlpZiB0ZXN0ICRhY19jdl9saWJfZGxfZGxvcGVuID0geWVzOyB0aGVuCi0JCQkJY2FzZSAiJExJQlMiIGluCi0JCQkJKi1sZGwqKQotCQkJCQkjIGxpYmRsIGFscmVhZHkgaW4gTElCUwotCQkJCQk7OwotCQkJCSopCi0JCQkJCVNTSERMSUJTPSIkU1NIRExJQlMgLWxkbCIKLQkJCQkJOzsKLQkJCQllc2FjCi0JCQlmaQotCQlmaQotCi0KLWZpCi0KLQotIyBDaGVjayBmb3Igb2xkZXIgUEFNCi1pZiB0ZXN0ICJ4JFBBTV9NU0ciID0gInh5ZXMiIDsgdGhlbgotCSMgQ2hlY2sgUEFNIHN0cmVycm9yIGFyZ3VtZW50cyAob2xkIFBBTSkKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgcGFtX3N0cmVycm9yIHRha2VzIG9ubHkgb25lIGFyZ3VtZW50IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgcGFtX3N0cmVycm9yIHRha2VzIG9ubHkgb25lIGFyZ3VtZW50Li4uICIgPiY2OyB9Ci0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgZGVmaW5lZChIQVZFX1NFQ1VSSVRZX1BBTV9BUFBMX0gpCi0jaW5jbHVkZSA8c2VjdXJpdHkvcGFtX2FwcGwuaD4KLSNlbGlmIGRlZmluZWQgKEhBVkVfUEFNX1BBTV9BUFBMX0gpCi0jaW5jbHVkZSA8cGFtL3BhbV9hcHBsLmg+Ci0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci0KLSh2b2lkKXBhbV9zdHJlcnJvcigocGFtX2hhbmRsZV90ICopTlVMTCwgLTEpOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1lbHNlCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9PTERfUEFNIDEiID4+Y29uZmRlZnMuaAotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCQkJUEFNX01TRz0ieWVzIChvbGQgbGlicmFyeSkiCi0KLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotU1NIX1BSSVZTRVBfVVNFUj1zc2hkCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcHJpdnNlcC11c2VyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9wcml2c2VwX3VzZXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3ByaXZzZXBfdXNlcjsKLQkJaWYgdGVzdCAtbiAiJHdpdGh2YWwiICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiAgJiYgIFwKLQkJICAgIHRlc3QgIngke3dpdGh2YWx9IiAhPSAieHllcyI7IHRoZW4KLQkJCVNTSF9QUklWU0VQX1VTRVI9JHdpdGh2YWwKLQkJZmkKLQotCi1maQotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgU1NIX1BSSVZTRVBfVVNFUiAiJFNTSF9QUklWU0VQX1VTRVIiCi1fQUNFT0YKLQotCi0KLSMgRGVjaWRlIHdoaWNoIHNhbmRib3ggc3R5bGUgdG8gdXNlCi1zYW5kYm94X2FyZz0iIgotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXNhbmRib3ggd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3NhbmRib3grc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3NhbmRib3g7Ci0JCWlmIHRlc3QgIngkd2l0aHZhbCIgPSAieHllcyIgOyB0aGVuCi0JCQlzYW5kYm94X2FyZz0iIgotCQllbHNlCi0JCQlzYW5kYm94X2FyZz0iJHdpdGh2YWwiCi0JCWZpCi0KLQotZmkKLQotaWYgdGVzdCAieCRzYW5kYm94X2FyZyIgPSAieHN5c3RyYWNlIiB8fCBcCi0gICAoIHRlc3QgLXogIiRzYW5kYm94X2FyZyIgJiYgdGVzdCAieCRoYXZlX3N5c3RyX3BvbGljeV9raWxsIiA9ICJ4MSIgKSA7IHRoZW4KLQl0ZXN0ICJ4JGhhdmVfc3lzdHJfcG9saWN5X2tpbGwiICE9ICJ4MSIgJiYgXAotCQlhc19mbl9lcnJvciAkPyAic3lzdHJhY2Ugc2FuZGJveCByZXF1aXJlcyBzeXN0cmFjZSBoZWFkZXJzIGFuZCBTWVNUUl9QT0xJQ1lfS0lMTCBzdXBwb3J0IiAiJExJTkVOTyIgNQotCVNBTkRCT1hfU1RZTEU9InN5c3RyYWNlIgotCi0kYXNfZWNobyAiI2RlZmluZSBTQU5EQk9YX1NZU1RSQUNFIDEiID4+Y29uZmRlZnMuaAotCi1lbGlmIHRlc3QgIngkc2FuZGJveF9hcmciID0gInhkYXJ3aW4iIHx8IFwKLSAgICAgKCB0ZXN0IC16ICIkc2FuZGJveF9hcmciICYmIHRlc3QgIngkYWNfY3ZfZnVuY19zYW5kYm94X2luaXQiID0gInh5ZXMiICYmIFwKLSAgICAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zYW5kYm94X2giID0gInh5ZXMiKSA7IHRoZW4KLQl0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2FuZGJveF9pbml0IiAhPSAieHllcyIgLW8gXAotCSAgICAgIngkYWNfY3ZfaGVhZGVyX3NhbmRib3hfaCIgIT0gInh5ZXMiICYmIFwKLQkJYXNfZm5fZXJyb3IgJD8gIkRhcndpbiBzZWF0YmVsdCBzYW5kYm94IHJlcXVpcmVzIHNhbmRib3guaCBhbmQgc2FuZGJveF9pbml0IGZ1bmN0aW9uIiAiJExJTkVOTyIgNQotCVNBTkRCT1hfU1RZTEU9ImRhcndpbiIKLQotJGFzX2VjaG8gIiNkZWZpbmUgU0FOREJPWF9EQVJXSU4gMSIgPj5jb25mZGVmcy5oCi0KLWVsaWYgdGVzdCAieCRzYW5kYm94X2FyZyIgPSAieHJsaW1pdCIgfHwgXAotICAgICAoIHRlc3QgLXogIiRzYW5kYm94X2FyZyIgJiYgdGVzdCAieCRhY19jdl9mdW5jX3NldHJsaW1pdCIgPSAieHllcyIgKSA7IHRoZW4KLQl0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2V0cmxpbWl0IiAhPSAieHllcyIgJiYgXAotCQlhc19mbl9lcnJvciAkPyAicmxpbWl0IHNhbmRib3ggcmVxdWlyZXMgc2V0cmxpbWl0IGZ1bmN0aW9uIiAiJExJTkVOTyIgNQotCVNBTkRCT1hfU1RZTEU9InJsaW1pdCIKLQotJGFzX2VjaG8gIiNkZWZpbmUgU0FOREJPWF9STElNSVQgMSIgPj5jb25mZGVmcy5oCi0KLWVsaWYgdGVzdCAteiAiJHNhbmRib3hfYXJnIiB8fCB0ZXN0ICJ4JHNhbmRib3hfYXJnIiA9ICJ4bm8iIHx8IFwKLSAgICAgdGVzdCAieCRzYW5kYm94X2FyZyIgPSAieG5vbmUiIHx8IHRlc3QgIngkc2FuZGJveF9hcmciID0gInhudWxsIiA7IHRoZW4KLQlTQU5EQk9YX1NUWUxFPSJub25lIgotCi0kYXNfZWNobyAiI2RlZmluZSBTQU5EQk9YX05VTEwgMSIgPj5jb25mZGVmcy5oCi0KLWVsc2UKLQlhc19mbl9lcnJvciAkPyAidW5zdXBwb3J0ZWQgLS13aXRoLXNhbmRib3giICIkTElORU5PIiA1Ci1maQotCi0jIENoZWFwIGhhY2sgdG8gZW5zdXJlIE5FV1MtT1MgbGlicmFyaWVzIGFyZSBhcnJhbmdlZCByaWdodC4KLWlmIHRlc3QgISAteiAiJFNPTlkiIDsgdGhlbgotICBMSUJTPSIkTElCUyAtbGliZXJ0eSI7Ci1maQotCi0jIENoZWNrIGZvciAgbG9uZyBsb25nIGRhdGF0eXBlcwotYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAibG9uZyBsb25nIiAiYWNfY3ZfdHlwZV9sb25nX2xvbmciICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9sb25nX2xvbmciID0geHllczsgdGhlbiA6Ci0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MT05HX0xPTkcgMQotX0FDRU9GCi0KLQotZmkKLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVuc2lnbmVkIGxvbmcgbG9uZyIgImFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nIiA9IHh5ZXM7IHRoZW4gOgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfTE9OR19MT05HIDEKLV9BQ0VPRgotCi0KLWZpCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJsb25nIGRvdWJsZSIgImFjX2N2X3R5cGVfbG9uZ19kb3VibGUiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9sb25nX2RvdWJsZSIgPSB4eWVzOyB0aGVuIDoKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0xPTkdfRE9VQkxFIDEKLV9BQ0VPRgotCi0KLWZpCi0KLQotIyBDaGVjayBkYXRhdHlwZSBzaXplcwotIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKLSMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKLSMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgotIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBjaGFyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgY2hhci4uLiAiID4mNjsgfQotaWYgJHthY19jdl9zaXplb2ZfY2hhcis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKGNoYXIpKSIgImFjX2N2X3NpemVvZl9jaGFyIiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6Ci0KLWVsc2UKLSAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfY2hhciIgPSB5ZXM7IHRoZW4KLSAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChjaGFyKQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLSAgIGVsc2UKLSAgICAgYWNfY3Zfc2l6ZW9mX2NoYXI9MAotICAgZmkKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9jaGFyIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2NoYXIiID4mNjsgfQotCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBTSVpFT0ZfQ0hBUiAkYWNfY3Zfc2l6ZW9mX2NoYXIKLV9BQ0VPRgotCi0KLSMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCi0jIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCi0jIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KLSMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2Ygc2hvcnQgaW50IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygc2hvcnQgaW50Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3NpemVvZl9zaG9ydF9pbnQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChzaG9ydCBpbnQpKSIgImFjX2N2X3NpemVvZl9zaG9ydF9pbnQiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKLQotZWxzZQotICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9zaG9ydF9pbnQiID0geWVzOyB0aGVuCi0gICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAoc2hvcnQgaW50KQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLSAgIGVsc2UKLSAgICAgYWNfY3Zfc2l6ZW9mX3Nob3J0X2ludD0wCi0gICBmaQotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3Nob3J0X2ludCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3NpemVvZl9zaG9ydF9pbnQiID4mNjsgfQotCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBTSVpFT0ZfU0hPUlRfSU5UICRhY19jdl9zaXplb2Zfc2hvcnRfaW50Ci1fQUNFT0YKLQotCi0jIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgotIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwotIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCi0jIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIGludCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIGludC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9zaXplb2ZfaW50Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAoaW50KSkiICJhY19jdl9zaXplb2ZfaW50IiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6Ci0KLWVsc2UKLSAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50IiA9IHllczsgdGhlbgotICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGludCkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci0gICBlbHNlCi0gICAgIGFjX2N2X3NpemVvZl9pbnQ9MAotICAgZmkKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9pbnQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zaXplb2ZfaW50IiA+JjY7IH0KLQotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgU0laRU9GX0lOVCAkYWNfY3Zfc2l6ZW9mX2ludAotX0FDRU9GCi0KLQotIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKLSMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKLSMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgotIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGludCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIGxvbmcgaW50Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3NpemVvZl9sb25nX2ludCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKGxvbmcgaW50KSkiICJhY19jdl9zaXplb2ZfbG9uZ19pbnQiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKLQotZWxzZQotICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9sb25nX2ludCIgPSB5ZXM7IHRoZW4KLSAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGludCkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci0gICBlbHNlCi0gICAgIGFjX2N2X3NpemVvZl9sb25nX2ludD0wCi0gICBmaQotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2xvbmdfaW50IiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2xvbmdfaW50IiA+JjY7IH0KLQotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgU0laRU9GX0xPTkdfSU5UICRhY19jdl9zaXplb2ZfbG9uZ19pbnQKLV9BQ0VPRgotCi0KLSMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCi0jIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCi0jIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KLSMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgbG9uZyBsb25nIGludCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZyBpbnQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZ19pbnQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChsb25nIGxvbmcgaW50KSkiICJhY19jdl9zaXplb2ZfbG9uZ19sb25nX2ludCIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgotCi1lbHNlCi0gIGlmIHRlc3QgIiRhY19jdl90eXBlX2xvbmdfbG9uZ19pbnQiID0geWVzOyB0aGVuCi0gICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBsb25nIGludCkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci0gICBlbHNlCi0gICAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmdfaW50PTAKLSAgIGZpCi1maQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfbG9uZ19sb25nX2ludCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3NpemVvZl9sb25nX2xvbmdfaW50IiA+JjY7IH0KLQotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgU0laRU9GX0xPTkdfTE9OR19JTlQgJGFjX2N2X3NpemVvZl9sb25nX2xvbmdfaW50Ci1fQUNFT0YKLQotCi0KLSMgU2FuaXR5IGNoZWNrIGxvbmcgbG9uZyBmb3Igc29tZSBwbGF0Zm9ybXMgKEFJWCkKLWlmIHRlc3QgIngkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZ19pbnQiID0gIng0IiA7IHRoZW4KLQlhY19jdl9zaXplb2ZfbG9uZ19sb25nX2ludD0wCi1maQotCi0jIGNvbXB1dGUgTExPTkdfTUlOIGFuZCBMTE9OR19NQVggaWYgd2UgZG9uJ3Qga25vdyB0aGVtLgotaWYgdGVzdCAteiAiJGhhdmVfbGxvbmdfbWF4IjsgdGhlbgotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG1heCB2YWx1ZSBvZiBsb25nIGxvbmciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG1heCB2YWx1ZSBvZiBsb25nIGxvbmcuLi4gIiA+JjY7IH0KLQlpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmciID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmciID4mMjt9Ci0KLQotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotLyogV2h5IGlzIHRoaXMgc28gZGFtbiBoYXJkPyAqLwotI2lmZGVmIF9fR05VQ19fCi0jIHVuZGVmIF9fR05VQ19fCi0jZW5kaWYKLSNkZWZpbmUgX19VU0VfSVNPQzk5Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jZGVmaW5lIERBVEEgImNvbmZ0ZXN0LmxsbWlubWF4IgotI2RlZmluZSBteV9hYnMoYSkgKChhKSA8IDAgPyAoKGEpICogLTEpIDogKGEpKQotCi0vKgotICogcHJpbnRmIGluIGxpYmMgb24gc29tZSBwbGF0Zm9ybXMgKGVnIG9sZCBUcnU2NCkgZG9lcyBub3QgdW5kZXJzdGFuZCAlbGxkIHNvCi0gKiB3ZSBkbyB0aGlzIHRoZSBoYXJkIHdheS4KLSAqLwotc3RhdGljIGludAotZnByaW50X2xsKEZJTEUgKmYsIGxvbmcgbG9uZyBuKQotewotCXVuc2lnbmVkIGludCBpOwotCWludCBsW3NpemVvZihsb25nIGxvbmcpICogOF07Ci0KLQlpZiAobiA8IDApCi0JCWlmIChmcHJpbnRmKGYsICItIikgPCAwKQotCQkJcmV0dXJuIC0xOwotCWZvciAoaSA9IDA7IG4gIT0gMDsgaSsrKSB7Ci0JCWxbaV0gPSBteV9hYnMobiAlIDEwKTsKLQkJbiAvPSAxMDsKLQl9Ci0JZG8gewotCQlpZiAoZnByaW50ZihmLCAiJWQiLCBsWy0taV0pIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9IHdoaWxlIChpICE9IDApOwotCWlmIChmcHJpbnRmKGYsICIgIikgPCAwKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAotbWFpbiAoKQotewotCi0JRklMRSAqZjsKLQlsb25nIGxvbmcgaSwgbGxtaW4sIGxsbWF4ID0gMDsKLQotCWlmKChmID0gZm9wZW4oREFUQSwidyIpKSA9PSBOVUxMKQotCQlleGl0KDEpOwotCi0jaWYgZGVmaW5lZChMTE9OR19NSU4pICYmIGRlZmluZWQoTExPTkdfTUFYKQotCWZwcmludGYoc3RkZXJyLCAiVXNpbmcgc3lzdGVtIGhlYWRlciBmb3IgTExPTkdfTUlOIGFuZCBMTE9OR19NQVhcbiIpOwotCWxsbWluID0gTExPTkdfTUlOOwotCWxsbWF4ID0gTExPTkdfTUFYOwotI2Vsc2UKLQlmcHJpbnRmKHN0ZGVyciwgIkNhbGN1bGF0aW5nICBMTE9OR19NSU4gYW5kIExMT05HX01BWFxuIik7Ci0JLyogVGhpcyB3aWxsIHdvcmsgb24gb25lJ3MgY29tcGxlbWVudCBhbmQgdHdvJ3MgY29tcGxlbWVudCAqLwotCWZvciAoaSA9IDE7IGkgPiBsbG1heDsgaSA8PD0gMSwgaSsrKQotCQlsbG1heCA9IGk7Ci0JbGxtaW4gPSBsbG1heCArIDFMTDsJLyogd3JhcCAqLwotI2VuZGlmCi0KLQkvKiBTYW5pdHkgY2hlY2sgKi8KLQlpZiAobGxtaW4gKyAxIDwgbGxtaW4gfHwgbGxtaW4gLSAxIDwgbGxtaW4gfHwgbGxtYXggKyAxID4gbGxtYXgKLQkgICAgfHwgbGxtYXggLSAxID4gbGxtYXggfHwgbGxtaW4gPT0gbGxtYXggfHwgbGxtaW4gPT0gMAotCSAgICB8fCBsbG1heCA9PSAwIHx8IGxsbWF4IDwgTE9OR19NQVggfHwgbGxtaW4gPiBMT05HX01JTikgewotCQlmcHJpbnRmKGYsICJ1bmtub3duIHVua25vd25cbiIpOwotCQlleGl0KDIpOwotCX0KLQotCWlmIChmcHJpbnRfbGwoZiwgbGxtaW4pIDwgMCkKLQkJZXhpdCgzKTsKLQlpZiAoZnByaW50X2xsKGYsIGxsbWF4KSA8IDApCi0JCWV4aXQoNCk7Ci0JaWYgKGZjbG9zZShmKSA8IDApCi0JCWV4aXQoNSk7Ci0JZXhpdCgwKTsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLQotCQkJbGxvbmdfbWluPWAkQVdLICd7cHJpbnQgJDF9JyBjb25mdGVzdC5sbG1pbm1heGAKLQkJCWxsb25nX21heD1gJEFXSyAne3ByaW50ICQyfScgY29uZnRlc3QubGxtaW5tYXhgCi0KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGxvbmdfbWF4IiA+JjUKLSRhc19lY2hvICIkbGxvbmdfbWF4IiA+JjY7IH0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBMTE9OR19NQVggJHtsbG9uZ19tYXh9TEwKLV9BQ0VPRgotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBtaW4gdmFsdWUgb2YgbG9uZyBsb25nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBtaW4gdmFsdWUgb2YgbG9uZyBsb25nLi4uICIgPiY2OyB9Ci0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxsb25nX21pbiIgPiY1Ci0kYXNfZWNobyAiJGxsb25nX21pbiIgPiY2OyB9Ci0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgTExPTkdfTUlOICR7bGxvbmdfbWlufUxMCi1fQUNFT0YKLQotCi1lbHNlCi0KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub3QgZm91bmQiID4mNQotJGFzX2VjaG8gIm5vdCBmb3VuZCIgPiY2OyB9Ci0KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1maQotCi0KLSMgTW9yZSBjaGVja3MgZm9yIGRhdGEgdHlwZXMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHVfaW50IHR5cGUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVfaW50IHR5cGUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV91X2ludCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotaW50Ci1tYWluICgpCi17Ci0gdV9pbnQgYTsgYSA9IDE7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfdV9pbnQ9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hhdmVfdV9pbnQ9Im5vIgotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfdV9pbnQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX3VfaW50IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV91X2ludCIgPSAieHllcyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfVV9JTlQgMSIgPj5jb25mZGVmcy5oCi0KLQloYXZlX3VfaW50PTEKLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGludFhYX3QgdHlwZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGludFhYX3QgdHlwZXMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV9pbnR4eF90Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci1pbnQKLW1haW4gKCkKLXsKLSBpbnQ4X3QgYTsgaW50MTZfdCBiOyBpbnQzMl90IGM7IGEgPSBiID0gYyA9IDE7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfaW50eHhfdD0ieWVzIgotZWxzZQotICAgYWNfY3ZfaGF2ZV9pbnR4eF90PSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX2ludHh4X3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX2ludHh4X3QiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9oYXZlX2ludHh4X3QiID0gInh5ZXMiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0lOVFhYX1QgMSIgPj5jb25mZGVmcy5oCi0KLQloYXZlX2ludHh4X3Q9MQotZmkKLQotaWYgKHRlc3QgLXogIiRoYXZlX2ludHh4X3QiICYmIFwKLQkgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zdGRpbnRfaCIgPSAieHllcyIpCi10aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW50WFhfdCB0eXBlcyBpbiBzdGRpbnQuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgaW50WFhfdCB0eXBlcyBpbiBzdGRpbnQuaC4uLiAiID4mNjsgfQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8c3RkaW50Lmg+Ci1pbnQKLW1haW4gKCkKLXsKLSBpbnQ4X3QgYTsgaW50MTZfdCBiOyBpbnQzMl90IGM7IGEgPSBiID0gYyA9IDE7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLQotCQkJJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9JTlRYWF9UIDEiID4+Y29uZmRlZnMuaAotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi1lbHNlCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW50NjRfdCB0eXBlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbnQ2NF90IHR5cGUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV9pbnQ2NF90Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfU1RESU5UX0gKLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICi0jIGluY2x1ZGUgPHN5cy9iaXR5cGVzLmg+Ci0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci0KLWludDY0X3QgYTsgYSA9IDE7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgYWNfY3ZfaGF2ZV9pbnQ2NF90PSJ5ZXMiCi1lbHNlCi0gICBhY19jdl9oYXZlX2ludDY0X3Q9Im5vIgotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfaW50NjRfdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hhdmVfaW50NjRfdCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfaW50NjRfdCIgPSAieHllcyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfSU5UNjRfVCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdV9pbnRYWF90IHR5cGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciB1X2ludFhYX3QgdHlwZXMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV91X2ludHh4X3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLWludAotbWFpbiAoKQotewotIHVfaW50OF90IGE7IHVfaW50MTZfdCBiOyB1X2ludDMyX3QgYzsgYSA9IGIgPSBjID0gMTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgYWNfY3ZfaGF2ZV91X2ludHh4X3Q9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hhdmVfdV9pbnR4eF90PSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX3VfaW50eHhfdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hhdmVfdV9pbnR4eF90IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV91X2ludHh4X3QiID0gInh5ZXMiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1VfSU5UWFhfVCAxIiA+PmNvbmZkZWZzLmgKLQotCWhhdmVfdV9pbnR4eF90PTEKLWZpCi0KLWlmIHRlc3QgLXogIiRoYXZlX3VfaW50eHhfdCIgOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdV9pbnRYWF90IHR5cGVzIGluIHN5cy9zb2NrZXQuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdV9pbnRYWF90IHR5cGVzIGluIHN5cy9zb2NrZXQuaC4uLiAiID4mNjsgfQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotaW50Ci1tYWluICgpCi17Ci0gdV9pbnQ4X3QgYTsgdV9pbnQxNl90IGI7IHVfaW50MzJfdCBjOyBhID0gYiA9IGMgPSAxOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0KLQkJCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfVV9JTlRYWF9UIDEiID4+Y29uZmRlZnMuaAotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi1lbHNlCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdV9pbnQ2NF90IHR5cGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciB1X2ludDY0X3QgdHlwZXMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV91X2ludDY0X3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLWludAotbWFpbiAoKQotewotIHVfaW50NjRfdCBhOyBhID0gMTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgYWNfY3ZfaGF2ZV91X2ludDY0X3Q9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hhdmVfdV9pbnQ2NF90PSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX3VfaW50NjRfdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hhdmVfdV9pbnQ2NF90IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV91X2ludDY0X3QiID0gInh5ZXMiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1VfSU5UNjRfVCAxIiA+PmNvbmZkZWZzLmgKLQotCWhhdmVfdV9pbnQ2NF90PTEKLWZpCi0KLWlmIHRlc3QgLXogIiRoYXZlX3VfaW50NjRfdCIgOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdV9pbnQ2NF90IHR5cGUgaW4gc3lzL2JpdHlwZXMuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdV9pbnQ2NF90IHR5cGUgaW4gc3lzL2JpdHlwZXMuaC4uLiAiID4mNjsgfQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KLWludAotbWFpbiAoKQotewotIHVfaW50NjRfdCBhOyBhID0gMQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0KLQkJCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfVV9JTlQ2NF9UIDEiID4+Y29uZmRlZnMuaAotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi1lbHNlCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotaWYgdGVzdCAteiAiJGhhdmVfdV9pbnR4eF90IiA7IHRoZW4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1aW50WFhfdCB0eXBlcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdWludFhYX3QgdHlwZXMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV91aW50eHhfdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLWludAotbWFpbiAoKQotewotCi0JdWludDhfdCBhOwotCXVpbnQxNl90IGI7Ci0JdWludDMyX3QgYzsKLQlhID0gYiA9IGMgPSAxOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfdWludHh4X3Q9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hhdmVfdWludHh4X3Q9Im5vIgotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfdWludHh4X3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX3VpbnR4eF90IiA+JjY7IH0KLQlpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfdWludHh4X3QiID0gInh5ZXMiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1VJTlRYWF9UIDEiID4+Y29uZmRlZnMuaAotCi0JZmkKLWZpCi0KLWlmIHRlc3QgLXogIiRoYXZlX3VpbnR4eF90IiA7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1aW50WFhfdCB0eXBlcyBpbiBzdGRpbnQuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdWludFhYX3QgdHlwZXMgaW4gc3RkaW50LmguLi4gIiA+JjY7IH0KLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPHN0ZGludC5oPgotaW50Ci1tYWluICgpCi17Ci0gdWludDhfdCBhOyB1aW50MTZfdCBiOyB1aW50MzJfdCBjOyBhID0gYiA9IGMgPSAxOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0KLQkJCSRhc19lY2hvICIjZGVmaW5lIEhBVkVfVUlOVFhYX1QgMSIgPj5jb25mZGVmcy5oCi0KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0KLWVsc2UKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1pZiAodGVzdCAteiAiJGhhdmVfdV9pbnR4eF90IiB8fCB0ZXN0IC16ICIkaGF2ZV9pbnR4eF90IiAmJiBcCi0JICAgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX2JpdHlwZXNfaCIgPSAieHllcyIpCi10aGVuCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW50WFhfdCBhbmQgdV9pbnRYWF90IHR5cGVzIGluIHN5cy9iaXR5cGVzLmgiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGludFhYX3QgYW5kIHVfaW50WFhfdCB0eXBlcyBpbiBzeXMvYml0eXBlcy5oLi4uICIgPiY2OyB9Ci0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLQkJCWludDhfdCBhOyBpbnQxNl90IGI7IGludDMyX3QgYzsKLQkJCXVfaW50OF90IGU7IHVfaW50MTZfdCBmOyB1X2ludDMyX3QgZzsKLQkJCWEgPSBiID0gYyA9IGUgPSBmID0gZyA9IDE7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotCi0JCQkkYXNfZWNobyAiI2RlZmluZSBIQVZFX1VfSU5UWFhfVCAxIiA+PmNvbmZkZWZzLmgKLQotCQkJJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9JTlRYWF9UIDEiID4+Y29uZmRlZnMuaAotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHVfY2hhciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdV9jaGFyLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hhdmVfdV9jaGFyKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci1pbnQKLW1haW4gKCkKLXsKLSB1X2NoYXIgZm9vOyBmb28gPSAxMjU7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfdV9jaGFyPSJ5ZXMiCi1lbHNlCi0gICBhY19jdl9oYXZlX3VfY2hhcj0ibm8iCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV91X2NoYXIiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX3VfY2hhciIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfdV9jaGFyIiA9ICJ4eWVzIiA7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9VX0NIQVIgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQotICAgYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic29ja2xlbl90IiAiYWNfY3ZfdHlwZV9zb2NrbGVuX3QiICIjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX3NvY2tsZW5fdCIgPSB4eWVzOyB0aGVuIDoKLQotZWxzZQotCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzb2NrbGVuX3QgZXF1aXZhbGVudCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc29ja2xlbl90IGVxdWl2YWxlbnQuLi4gIiA+JjY7IH0KLSAgICAgIGlmICR7Y3VybF9jdl9zb2NrbGVuX3RfZXF1aXYrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JICMgU3lzdGVtcyBoYXZlIGVpdGhlciAic3RydWN0IHNvY2thZGRyICoiIG9yCi0JICMgInZvaWQgKiIgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBnZXRwZWVybmFtZQotCSBjdXJsX2N2X3NvY2tsZW5fdF9lcXVpdj0KLQkgZm9yIGFyZzIgaW4gInN0cnVjdCBzb2NrYWRkciIgdm9pZDsgZG8KLQkgICAgZm9yIHQgaW4gaW50IHNpemVfdCB1bnNpZ25lZCBsb25nICJ1bnNpZ25lZCBsb25nIjsgZG8KLQkgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0JCSAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCQkgICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLQkJICBpbnQgZ2V0cGVlcm5hbWUgKGludCwgJGFyZzIgKiwgJHQgKik7Ci0KLWludAotbWFpbiAoKQotewotCi0JCSAgJHQgbGVuOwotCQkgIGdldHBlZXJuYW1lKDAsMCwmbGVuKTsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0KLQkJICBjdXJsX2N2X3NvY2tsZW5fdF9lcXVpdj0iJHQiCi0JCSAgYnJlYWsKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCSAgICBkb25lCi0JIGRvbmUKLQotCSBpZiB0ZXN0ICJ4JGN1cmxfY3Zfc29ja2xlbl90X2VxdWl2IiA9IHg7IHRoZW4KLQkgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBmaW5kIGEgdHlwZSB0byB1c2UgaW4gcGxhY2Ugb2Ygc29ja2xlbl90IiAiJExJTkVOTyIgNQotCSBmaQotCi1maQotCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGN1cmxfY3Zfc29ja2xlbl90X2VxdWl2IiA+JjUKLSRhc19lY2hvICIkY3VybF9jdl9zb2NrbGVuX3RfZXF1aXYiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIHNvY2tsZW5fdCAkY3VybF9jdl9zb2NrbGVuX3RfZXF1aXYKLV9BQ0VPRgotCi1maQotCi0KLQotYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic2lnX2F0b21pY190IiAiYWNfY3ZfdHlwZV9zaWdfYXRvbWljX3QiICIjaW5jbHVkZSA8c2lnbmFsLmg+Ci0iCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc2lnX2F0b21pY190IiA9IHh5ZXM7IHRoZW4gOgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfU0lHX0FUT01JQ19UIDEKLV9BQ0VPRgotCi0KLWZpCi0KLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgImZzYmxrY250X3QiICJhY19jdl90eXBlX2ZzYmxrY250X3QiICIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKLSNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfU1RBVEZTX0gKLSNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19TVEFUVkZTX0gKLSNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgotI2VuZGlmCi0KLSIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9mc2Jsa2NudF90IiA9IHh5ZXM7IHRoZW4gOgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfRlNCTEtDTlRfVCAxCi1fQUNFT0YKLQotCi1maQotYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAiZnNmaWxjbnRfdCIgImFjX2N2X3R5cGVfZnNmaWxjbnRfdCIgIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAotI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19TVEFURlNfSAotI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1NUQVRWRlNfSAotI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+Ci0jZW5kaWYKLQotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX2ZzZmlsY250X3QiID0geHllczsgdGhlbiA6Ci0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9GU0ZJTENOVF9UIDEKLV9BQ0VPRgotCi0KLWZpCi0KLQotYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAiaW5fYWRkcl90IiAiYWNfY3ZfdHlwZV9pbl9hZGRyX3QiICIjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX2luX2FkZHJfdCIgPSB4eWVzOyB0aGVuIDoKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0lOX0FERFJfVCAxCi1fQUNFT0YKLQotCi1maQotYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAiaW5fcG9ydF90IiAiYWNfY3ZfdHlwZV9pbl9wb3J0X3QiICIjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotIgotaWYgdGVzdCAieCRhY19jdl90eXBlX2luX3BvcnRfdCIgPSB4eWVzOyB0aGVuIDoKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0lOX1BPUlRfVCAxCi1fQUNFT0YKLQotCi1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc2l6ZV90Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hhdmVfc2l6ZV90Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci1pbnQKLW1haW4gKCkKLXsKLSBzaXplX3QgZm9vOyBmb28gPSAxMjM1OwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICBhY19jdl9oYXZlX3NpemVfdD0ieWVzIgotZWxzZQotICAgYWNfY3ZfaGF2ZV9zaXplX3Q9Im5vIgotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfc2l6ZV90IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaGF2ZV9zaXplX3QiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9oYXZlX3NpemVfdCIgPSAieHllcyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfU0laRV9UIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzc2l6ZV90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzc2l6ZV90Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hhdmVfc3NpemVfdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotaW50Ci1tYWluICgpCi17Ci0gc3NpemVfdCBmb287IGZvbyA9IDEyMzU7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfc3NpemVfdD0ieWVzIgotZWxzZQotICAgYWNfY3ZfaGF2ZV9zc2l6ZV90PSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX3NzaXplX3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX3NzaXplX3QiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9oYXZlX3NzaXplX3QiID0gInh5ZXMiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1NTSVpFX1QgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGNsb2NrX3QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGNsb2NrX3QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV9jbG9ja190Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8dGltZS5oPgotaW50Ci1tYWluICgpCi17Ci0gY2xvY2tfdCBmb287IGZvbyA9IDEyMzU7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfY2xvY2tfdD0ieWVzIgotZWxzZQotICAgYWNfY3ZfaGF2ZV9jbG9ja190PSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX2Nsb2NrX3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX2Nsb2NrX3QiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9oYXZlX2Nsb2NrX3QiID0gInh5ZXMiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0NMT0NLX1QgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNhX2ZhbWlseV90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzYV9mYW1pbHlfdC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9oYXZlX3NhX2ZhbWlseV90Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotaW50Ci1tYWluICgpCi17Ci0gc2FfZmFtaWx5X3QgZm9vOyBmb28gPSAxMjM1OwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICBhY19jdl9oYXZlX3NhX2ZhbWlseV90PSJ5ZXMiCi1lbHNlCi0gICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi1pbnQKLW1haW4gKCkKLXsKLSBzYV9mYW1pbHlfdCBmb287IGZvbyA9IDEyMzU7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfc2FfZmFtaWx5X3Q9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hhdmVfc2FfZmFtaWx5X3Q9Im5vIgotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9zYV9mYW1pbHlfdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hhdmVfc2FfZmFtaWx5X3QiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9oYXZlX3NhX2ZhbWlseV90IiA9ICJ4eWVzIiA7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TQV9GQU1JTFlfVCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcGlkX3QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHBpZF90Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hhdmVfcGlkX3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLWludAotbWFpbiAoKQotewotIHBpZF90IGZvbzsgZm9vID0gMTIzNTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgYWNfY3ZfaGF2ZV9waWRfdD0ieWVzIgotZWxzZQotICAgYWNfY3ZfaGF2ZV9waWRfdD0ibm8iCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9waWRfdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hhdmVfcGlkX3QiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9oYXZlX3BpZF90IiA9ICJ4eWVzIiA7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9QSURfVCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbW9kZV90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBtb2RlX3QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV9tb2RlX3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLWludAotbWFpbiAoKQotewotIG1vZGVfdCBmb287IGZvbyA9IDEyMzU7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfbW9kZV90PSJ5ZXMiCi1lbHNlCi0gICBhY19jdl9oYXZlX21vZGVfdD0ibm8iCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9tb2RlX3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX21vZGVfdCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfbW9kZV90IiA9ICJ4eWVzIiA7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9NT0RFX1QgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi1pbnQKLW1haW4gKCkKLXsKLSBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICBhY19jdl9oYXZlX3N0cnVjdF9zb2NrYWRkcl9zdG9yYWdlPSJ5ZXMiCi1lbHNlCi0gICBhY19jdl9oYXZlX3N0cnVjdF9zb2NrYWRkcl9zdG9yYWdlPSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX3N0cnVjdF9zb2NrYWRkcl9zdG9yYWdlIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaGF2ZV9zdHJ1Y3Rfc29ja2FkZHJfc3RvcmFnZSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UiID0gInh5ZXMiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1NUUlVDVF9TT0NLQUREUl9TVE9SQUdFIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdHJ1Y3Qgc29ja2FkZHJfaW42IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdHJ1Y3Qgc29ja2FkZHJfaW42Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX2luNis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLWludAotbWFpbiAoKQotewotIHN0cnVjdCBzb2NrYWRkcl9pbjYgczsgcy5zaW42X2ZhbWlseSA9IDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX2luNj0ieWVzIgotZWxzZQotICAgYWNfY3ZfaGF2ZV9zdHJ1Y3Rfc29ja2FkZHJfaW42PSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX3N0cnVjdF9zb2NrYWRkcl9pbjYiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX3N0cnVjdF9zb2NrYWRkcl9pbjYiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9oYXZlX3N0cnVjdF9zb2NrYWRkcl9pbjYiID0gInh5ZXMiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1NUUlVDVF9TT0NLQUREUl9JTjYgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0cnVjdCBpbjZfYWRkciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RydWN0IGluNl9hZGRyLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hhdmVfc3RydWN0X2luNl9hZGRyKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotaW50Ci1tYWluICgpCi17Ci0gc3RydWN0IGluNl9hZGRyIHM7IHMuczZfYWRkclswXSA9IDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfc3RydWN0X2luNl9hZGRyPSJ5ZXMiCi1lbHNlCi0gICBhY19jdl9oYXZlX3N0cnVjdF9pbjZfYWRkcj0ibm8iCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9zdHJ1Y3RfaW42X2FkZHIiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX3N0cnVjdF9pbjZfYWRkciIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfc3RydWN0X2luNl9hZGRyIiA9ICJ4eWVzIiA7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TVFJVQ1RfSU42X0FERFIgMSIgPj5jb25mZGVmcy5oCi0KLQotCWFjX2ZuX2NfY2hlY2tfbWVtYmVyICIkTElORU5PIiAic3RydWN0IHNvY2thZGRyX2luNiIgInNpbjZfc2NvcGVfaWQiICJhY19jdl9tZW1iZXJfc3RydWN0X3NvY2thZGRyX2luNl9zaW42X3Njb3BlX2lkIiAiCi0jaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi0iCi1pZiB0ZXN0ICJ4JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc29ja2FkZHJfaW42X3NpbjZfc2NvcGVfaWQiID0geHllczsgdGhlbiA6Ci0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9TVFJVQ1RfU09DS0FERFJfSU42X1NJTjZfU0NPUEVfSUQgMQotX0FDRU9GCi0KLQotZmkKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RydWN0IGFkZHJpbmZvIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdHJ1Y3QgYWRkcmluZm8uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV9zdHJ1Y3RfYWRkcmluZm8rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0KLWludAotbWFpbiAoKQotewotIHN0cnVjdCBhZGRyaW5mbyBzOyBzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgYWNfY3ZfaGF2ZV9zdHJ1Y3RfYWRkcmluZm89InllcyIKLWVsc2UKLSAgIGFjX2N2X2hhdmVfc3RydWN0X2FkZHJpbmZvPSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX3N0cnVjdF9hZGRyaW5mbyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hhdmVfc3RydWN0X2FkZHJpbmZvIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9zdHJ1Y3RfYWRkcmluZm8iID0gInh5ZXMiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1NUUlVDVF9BRERSSU5GTyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RydWN0IHRpbWV2YWwiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0cnVjdCB0aW1ldmFsLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hhdmVfc3RydWN0X3RpbWV2YWwrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxzeXMvdGltZS5oPgotaW50Ci1tYWluICgpCi17Ci0gc3RydWN0IHRpbWV2YWwgdHY7IHR2LnR2X3NlYyA9IDE7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfc3RydWN0X3RpbWV2YWw9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hhdmVfc3RydWN0X3RpbWV2YWw9Im5vIgotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfc3RydWN0X3RpbWV2YWwiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX3N0cnVjdF90aW1ldmFsIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9zdHJ1Y3RfdGltZXZhbCIgPSAieHllcyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1RSVUNUX1RJTUVWQUwgMSIgPj5jb25mZGVmcy5oCi0KLQloYXZlX3N0cnVjdF90aW1ldmFsPTEKLWZpCi0KLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInN0cnVjdCB0aW1lc3BlYyIgImFjX2N2X3R5cGVfc3RydWN0X3RpbWVzcGVjIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X3RpbWVzcGVjIiA9IHh5ZXM7IHRoZW4gOgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfU1RSVUNUX1RJTUVTUEVDIDEKLV9BQ0VPRgotCi0KLWZpCi0KLQotIyBXZSBuZWVkIGludDY0X3Qgb3IgZWxzZSBjZXJ0aWFuIHBhcnRzIG9mIHRoZSBjb21waWxlIHdpbGwgZmFpbC4KLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9pbnQ2NF90IiA9ICJ4bm8iICYmIFwKLQl0ZXN0ICJ4JGFjX2N2X3NpemVvZl9sb25nX2ludCIgIT0gIng4IiAmJiBcCi0JdGVzdCAieCRhY19jdl9zaXplb2ZfbG9uZ19sb25nX2ludCIgPSAieDAiIDsgdGhlbgotCWVjaG8gIk9wZW5TU0ggcmVxdWlyZXMgaW50NjRfdCBzdXBwb3J0LiAgQ29udGFjdCB5b3VyIHZlbmRvciBvciBpbnN0YWxsIgotCWVjaG8gImFuIGFsdGVybmF0aXZlIGNvbXBpbGVyIChJLkUuLCBHQ0MpIGJlZm9yZSBjb250aW51aW5nLiIKLQllY2hvICIiCi0JZXhpdCAxOwotZWxzZQotCWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IEFzc3VtaW5nIHdvcmtpbmcgc25wcmludGYoKSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IEFzc3VtaW5nIHdvcmtpbmcgc25wcmludGYoKSIgPiYyO30KLQotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2lmZGVmIEhBVkVfU05QUklOVEYKLW1haW4oKQotewotCWNoYXIgYnVmWzUwXTsKLQljaGFyIGV4cGVjdGVkX291dFs1MF07Ci0JaW50IG1henNpemUgPSA1MCA7Ci0jaWYgKFNJWkVPRl9MT05HX0lOVCA9PSA4KQotCWxvbmcgaW50IG51bSA9IDB4N2ZmZmZmZmZmZmZmZmZmZjsKLSNlbHNlCi0JbG9uZyBsb25nIG51bSA9IDB4N2ZmZmZmZmZmZmZmZmZmZmxsOwotI2VuZGlmCi0Jc3RyY3B5KGV4cGVjdGVkX291dCwgIjkyMjMzNzIwMzY4NTQ3NzU4MDciKTsKLQlzbnByaW50ZihidWYsIG1henNpemUsICIlbGxkIiwgbnVtKTsKLQlpZihzdHJjbXAoYnVmLCBleHBlY3RlZF9vdXQpICE9IDApCi0JCWV4aXQoMSk7Ci0JZXhpdCgwKTsKLX0KLSNlbHNlCi1tYWluKCkgeyBleGl0KDApOyB9Ci0jZW5kaWYKLQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgIHRydWUKLWVsc2UKLSAgICRhc19lY2hvICIjZGVmaW5lIEJST0tFTl9TTlBSSU5URiAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfaG9zdCcgaW4gaGVhZGVyICd1dG1wLmgnCi0JCW9zc2hfc2FmZT1gZWNobyAidXRtcC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLQkJb3NzaF92YXJuYW1lPSJvc3NoX2N2XyRvc3NoX3NhZmUiIl9oYXNfInV0X2hvc3QKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1dF9ob3N0IGZpZWxkIGluIHV0bXAuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfaG9zdCBmaWVsZCBpbiB1dG1wLmguLi4gIiA+JjY7IH0KLQlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDx1dG1wLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgInV0X2hvc3QiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAJCQlldmFsICIkb3NzaF92YXJuYW1lPXllcyIKLWVsc2UKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLQlvc3NoX3Jlc3VsdD1gZXZhbCAnZWNobyAkJyIkb3NzaF92YXJuYW1lImAKLQlpZiB0ZXN0IC1uICJgZWNobyAkb3NzaF92YXJuYW1lYCI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRvc3NoX3Jlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJG9zc2hfcmVzdWx0IiA+JjY7IH0KLQkJaWYgdGVzdCAieCRvc3NoX3Jlc3VsdCIgPSAieHllcyI7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9IT1NUX0lOX1VUTVAgMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfaG9zdCcgaW4gaGVhZGVyICd1dG1weC5oJwotCQlvc3NoX3NhZmU9YGVjaG8gInV0bXB4LmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfaG9zdAotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV0X2hvc3QgZmllbGQgaW4gdXRtcHguaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfaG9zdCBmaWVsZCBpbiB1dG1weC5oLi4uICIgPiY2OyB9Ci0JaWYgZXZhbCBcJHskb3NzaF92YXJuYW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8dXRtcHguaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAidXRfaG9zdCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgotZWxzZQotICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAotCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQotCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0hPU1RfSU5fVVRNUFggMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAnc3lzbGVuJyBpbiBoZWFkZXIgJ3V0bXB4LmgnCi0JCW9zc2hfc2FmZT1gZWNobyAidXRtcHguaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0JCW9zc2hfdmFybmFtZT0ib3NzaF9jdl8kb3NzaF9zYWZlIiJfaGFzXyJzeXNsZW4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzeXNsZW4gZmllbGQgaW4gdXRtcHguaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3lzbGVuIGZpZWxkIGluIHV0bXB4LmguLi4gIiA+JjY7IH0KLQlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDx1dG1weC5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJzeXNsZW4iID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAJCQlldmFsICIkb3NzaF92YXJuYW1lPXllcyIKLWVsc2UKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLQlvc3NoX3Jlc3VsdD1gZXZhbCAnZWNobyAkJyIkb3NzaF92YXJuYW1lImAKLQlpZiB0ZXN0IC1uICJgZWNobyAkb3NzaF92YXJuYW1lYCI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRvc3NoX3Jlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJG9zc2hfcmVzdWx0IiA+JjY7IH0KLQkJaWYgdGVzdCAieCRvc3NoX3Jlc3VsdCIgPSAieHllcyI7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TWVNMRU5fSU5fVVRNUFggMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfcGlkJyBpbiBoZWFkZXIgJ3V0bXAuaCcKLQkJb3NzaF9zYWZlPWBlY2hvICJ1dG1wLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfcGlkCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdXRfcGlkIGZpZWxkIGluIHV0bXAuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfcGlkIGZpZWxkIGluIHV0bXAuaC4uLiAiID4mNjsgfQotCWlmIGV2YWwgXCR7JG9zc2hfdmFybmFtZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHV0bXAuaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAidXRfcGlkIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT15ZXMiCi1lbHNlCi0gICAJCQlldmFsICIkb3NzaF92YXJuYW1lPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi0Jb3NzaF9yZXN1bHQ9YGV2YWwgJ2VjaG8gJCciJG9zc2hfdmFybmFtZSJgCi0JaWYgdGVzdCAtbiAiYGVjaG8gJG9zc2hfdmFybmFtZWAiOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkb3NzaF9yZXN1bHQiID4mNQotJGFzX2VjaG8gIiRvc3NoX3Jlc3VsdCIgPiY2OyB9Ci0JCWlmIHRlc3QgIngkb3NzaF9yZXN1bHQiID0gInh5ZXMiOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfUElEX0lOX1VUTVAgMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfdHlwZScgaW4gaGVhZGVyICd1dG1wLmgnCi0JCW9zc2hfc2FmZT1gZWNobyAidXRtcC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLQkJb3NzaF92YXJuYW1lPSJvc3NoX2N2XyRvc3NoX3NhZmUiIl9oYXNfInV0X3R5cGUKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1dF90eXBlIGZpZWxkIGluIHV0bXAuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfdHlwZSBmaWVsZCBpbiB1dG1wLmguLi4gIiA+JjY7IH0KLQlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDx1dG1wLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgInV0X3R5cGUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAJCQlldmFsICIkb3NzaF92YXJuYW1lPXllcyIKLWVsc2UKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLQlvc3NoX3Jlc3VsdD1gZXZhbCAnZWNobyAkJyIkb3NzaF92YXJuYW1lImAKLQlpZiB0ZXN0IC1uICJgZWNobyAkb3NzaF92YXJuYW1lYCI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRvc3NoX3Jlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJG9zc2hfcmVzdWx0IiA+JjY7IH0KLQkJaWYgdGVzdCAieCRvc3NoX3Jlc3VsdCIgPSAieHllcyI7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9UWVBFX0lOX1VUTVAgMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfdHlwZScgaW4gaGVhZGVyICd1dG1weC5oJwotCQlvc3NoX3NhZmU9YGVjaG8gInV0bXB4LmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfdHlwZQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV0X3R5cGUgZmllbGQgaW4gdXRtcHguaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfdHlwZSBmaWVsZCBpbiB1dG1weC5oLi4uICIgPiY2OyB9Ci0JaWYgZXZhbCBcJHskb3NzaF92YXJuYW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8dXRtcHguaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAidXRfdHlwZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgotZWxzZQotICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAotCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQotCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1RZUEVfSU5fVVRNUFggMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfdHYnIGluIGhlYWRlciAndXRtcC5oJwotCQlvc3NoX3NhZmU9YGVjaG8gInV0bXAuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0JCW9zc2hfdmFybmFtZT0ib3NzaF9jdl8kb3NzaF9zYWZlIiJfaGFzXyJ1dF90dgotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV0X3R2IGZpZWxkIGluIHV0bXAuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfdHYgZmllbGQgaW4gdXRtcC5oLi4uICIgPiY2OyB9Ci0JaWYgZXZhbCBcJHskb3NzaF92YXJuYW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8dXRtcC5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJ1dF90diIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgotZWxzZQotICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAotCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQotCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1RWX0lOX1VUTVAgMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfaWQnIGluIGhlYWRlciAndXRtcC5oJwotCQlvc3NoX3NhZmU9YGVjaG8gInV0bXAuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0JCW9zc2hfdmFybmFtZT0ib3NzaF9jdl8kb3NzaF9zYWZlIiJfaGFzXyJ1dF9pZAotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV0X2lkIGZpZWxkIGluIHV0bXAuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfaWQgZmllbGQgaW4gdXRtcC5oLi4uICIgPiY2OyB9Ci0JaWYgZXZhbCBcJHskb3NzaF92YXJuYW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8dXRtcC5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJ1dF9pZCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgotZWxzZQotICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAotCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQotCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0lEX0lOX1VUTVAgMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfaWQnIGluIGhlYWRlciAndXRtcHguaCcKLQkJb3NzaF9zYWZlPWBlY2hvICJ1dG1weC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLQkJb3NzaF92YXJuYW1lPSJvc3NoX2N2XyRvc3NoX3NhZmUiIl9oYXNfInV0X2lkCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdXRfaWQgZmllbGQgaW4gdXRtcHguaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfaWQgZmllbGQgaW4gdXRtcHguaC4uLiAiID4mNjsgfQotCWlmIGV2YWwgXCR7JG9zc2hfdmFybmFtZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHV0bXB4Lmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgInV0X2lkIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT15ZXMiCi1lbHNlCi0gICAJCQlldmFsICIkb3NzaF92YXJuYW1lPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi0Jb3NzaF9yZXN1bHQ9YGV2YWwgJ2VjaG8gJCciJG9zc2hfdmFybmFtZSJgCi0JaWYgdGVzdCAtbiAiYGVjaG8gJG9zc2hfdmFybmFtZWAiOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkb3NzaF9yZXN1bHQiID4mNQotJGFzX2VjaG8gIiRvc3NoX3Jlc3VsdCIgPiY2OyB9Ci0JCWlmIHRlc3QgIngkb3NzaF9yZXN1bHQiID0gInh5ZXMiOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfSURfSU5fVVRNUFggMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfYWRkcicgaW4gaGVhZGVyICd1dG1wLmgnCi0JCW9zc2hfc2FmZT1gZWNobyAidXRtcC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLQkJb3NzaF92YXJuYW1lPSJvc3NoX2N2XyRvc3NoX3NhZmUiIl9oYXNfInV0X2FkZHIKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1dF9hZGRyIGZpZWxkIGluIHV0bXAuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfYWRkciBmaWVsZCBpbiB1dG1wLmguLi4gIiA+JjY7IH0KLQlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDx1dG1wLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgInV0X2FkZHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAJCQlldmFsICIkb3NzaF92YXJuYW1lPXllcyIKLWVsc2UKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLQlvc3NoX3Jlc3VsdD1gZXZhbCAnZWNobyAkJyIkb3NzaF92YXJuYW1lImAKLQlpZiB0ZXN0IC1uICJgZWNobyAkb3NzaF92YXJuYW1lYCI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRvc3NoX3Jlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJG9zc2hfcmVzdWx0IiA+JjY7IH0KLQkJaWYgdGVzdCAieCRvc3NoX3Jlc3VsdCIgPSAieHllcyI7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9BRERSX0lOX1VUTVAgMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfYWRkcicgaW4gaGVhZGVyICd1dG1weC5oJwotCQlvc3NoX3NhZmU9YGVjaG8gInV0bXB4LmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfYWRkcgotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV0X2FkZHIgZmllbGQgaW4gdXRtcHguaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfYWRkciBmaWVsZCBpbiB1dG1weC5oLi4uICIgPiY2OyB9Ci0JaWYgZXZhbCBcJHskb3NzaF92YXJuYW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8dXRtcHguaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAidXRfYWRkciIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgotZWxzZQotICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAotCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQotCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0FERFJfSU5fVVRNUFggMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfYWRkcl92NicgaW4gaGVhZGVyICd1dG1wLmgnCi0JCW9zc2hfc2FmZT1gZWNobyAidXRtcC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLQkJb3NzaF92YXJuYW1lPSJvc3NoX2N2XyRvc3NoX3NhZmUiIl9oYXNfInV0X2FkZHJfdjYKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1dF9hZGRyX3Y2IGZpZWxkIGluIHV0bXAuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfYWRkcl92NiBmaWVsZCBpbiB1dG1wLmguLi4gIiA+JjY7IH0KLQlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDx1dG1wLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgInV0X2FkZHJfdjYiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAJCQlldmFsICIkb3NzaF92YXJuYW1lPXllcyIKLWVsc2UKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLQlvc3NoX3Jlc3VsdD1gZXZhbCAnZWNobyAkJyIkb3NzaF92YXJuYW1lImAKLQlpZiB0ZXN0IC1uICJgZWNobyAkb3NzaF92YXJuYW1lYCI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRvc3NoX3Jlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJG9zc2hfcmVzdWx0IiA+JjY7IH0KLQkJaWYgdGVzdCAieCRvc3NoX3Jlc3VsdCIgPSAieHllcyI7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9BRERSX1Y2X0lOX1VUTVAgMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfYWRkcl92NicgaW4gaGVhZGVyICd1dG1weC5oJwotCQlvc3NoX3NhZmU9YGVjaG8gInV0bXB4LmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfYWRkcl92NgotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV0X2FkZHJfdjYgZmllbGQgaW4gdXRtcHguaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfYWRkcl92NiBmaWVsZCBpbiB1dG1weC5oLi4uICIgPiY2OyB9Ci0JaWYgZXZhbCBcJHskb3NzaF92YXJuYW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8dXRtcHguaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAidXRfYWRkcl92NiIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgotZWxzZQotICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAotCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQotCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0FERFJfVjZfSU5fVVRNUFggMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfZXhpdCcgaW4gaGVhZGVyICd1dG1wLmgnCi0JCW9zc2hfc2FmZT1gZWNobyAidXRtcC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLQkJb3NzaF92YXJuYW1lPSJvc3NoX2N2XyRvc3NoX3NhZmUiIl9oYXNfInV0X2V4aXQKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1dF9leGl0IGZpZWxkIGluIHV0bXAuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfZXhpdCBmaWVsZCBpbiB1dG1wLmguLi4gIiA+JjY7IH0KLQlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDx1dG1wLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgInV0X2V4aXQiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAJCQlldmFsICIkb3NzaF92YXJuYW1lPXllcyIKLWVsc2UKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLQlvc3NoX3Jlc3VsdD1gZXZhbCAnZWNobyAkJyIkb3NzaF92YXJuYW1lImAKLQlpZiB0ZXN0IC1uICJgZWNobyAkb3NzaF92YXJuYW1lYCI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRvc3NoX3Jlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJG9zc2hfcmVzdWx0IiA+JjY7IH0KLQkJaWYgdGVzdCAieCRvc3NoX3Jlc3VsdCIgPSAieHllcyI7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9FWElUX0lOX1VUTVAgMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfdGltZScgaW4gaGVhZGVyICd1dG1wLmgnCi0JCW9zc2hfc2FmZT1gZWNobyAidXRtcC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLQkJb3NzaF92YXJuYW1lPSJvc3NoX2N2XyRvc3NoX3NhZmUiIl9oYXNfInV0X3RpbWUKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1dF90aW1lIGZpZWxkIGluIHV0bXAuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfdGltZSBmaWVsZCBpbiB1dG1wLmguLi4gIiA+JjY7IH0KLQlpZiBldmFsIFwkeyRvc3NoX3Zhcm5hbWUrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDx1dG1wLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgInV0X3RpbWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAJCQlldmFsICIkb3NzaF92YXJuYW1lPXllcyIKLWVsc2UKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLQlvc3NoX3Jlc3VsdD1gZXZhbCAnZWNobyAkJyIkb3NzaF92YXJuYW1lImAKLQlpZiB0ZXN0IC1uICJgZWNobyAkb3NzaF92YXJuYW1lYCI7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRvc3NoX3Jlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJG9zc2hfcmVzdWx0IiA+JjY7IH0KLQkJaWYgdGVzdCAieCRvc3NoX3Jlc3VsdCIgPSAieHllcyI7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9USU1FX0lOX1VUTVAgMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfdGltZScgaW4gaGVhZGVyICd1dG1weC5oJwotCQlvc3NoX3NhZmU9YGVjaG8gInV0bXB4LmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotCQlvc3NoX3Zhcm5hbWU9Im9zc2hfY3ZfJG9zc2hfc2FmZSIiX2hhc18idXRfdGltZQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV0X3RpbWUgZmllbGQgaW4gdXRtcHguaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfdGltZSBmaWVsZCBpbiB1dG1weC5oLi4uICIgPiY2OyB9Ci0JaWYgZXZhbCBcJHskb3NzaF92YXJuYW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8dXRtcHguaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAidXRfdGltZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgIAkJCWV2YWwgIiRvc3NoX3Zhcm5hbWU9eWVzIgotZWxzZQotICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotCW9zc2hfcmVzdWx0PWBldmFsICdlY2hvICQnIiRvc3NoX3Zhcm5hbWUiYAotCWlmIHRlc3QgLW4gImBlY2hvICRvc3NoX3Zhcm5hbWVgIjsgdGhlbgotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJG9zc2hfcmVzdWx0IiA+JjUKLSRhc19lY2hvICIkb3NzaF9yZXN1bHQiID4mNjsgfQotCQlpZiB0ZXN0ICJ4JG9zc2hfcmVzdWx0IiA9ICJ4eWVzIjsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1RJTUVfSU5fVVRNUFggMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotIyBsb29rIGZvciBmaWVsZCAndXRfdHYnIGluIGhlYWRlciAndXRtcHguaCcKLQkJb3NzaF9zYWZlPWBlY2hvICJ1dG1weC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLQkJb3NzaF92YXJuYW1lPSJvc3NoX2N2XyRvc3NoX3NhZmUiIl9oYXNfInV0X3R2Ci0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdXRfdHYgZmllbGQgaW4gdXRtcHguaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdXRfdHYgZmllbGQgaW4gdXRtcHguaC4uLiAiID4mNjsgfQotCWlmIGV2YWwgXCR7JG9zc2hfdmFybmFtZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHV0bXB4Lmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgInV0X3R2IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICAgCQkJZXZhbCAiJG9zc2hfdmFybmFtZT15ZXMiCi1lbHNlCi0gICAJCQlldmFsICIkb3NzaF92YXJuYW1lPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi0Jb3NzaF9yZXN1bHQ9YGV2YWwgJ2VjaG8gJCciJG9zc2hfdmFybmFtZSJgCi0JaWYgdGVzdCAtbiAiYGVjaG8gJG9zc2hfdmFybmFtZWAiOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkb3NzaF9yZXN1bHQiID4mNQotJGFzX2VjaG8gIiRvc3NoX3Jlc3VsdCIgPiY2OyB9Ci0JCWlmIHRlc3QgIngkb3NzaF9yZXN1bHQiID0gInh5ZXMiOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfVFZfSU5fVVRNUFggMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi0KLQotYWNfZm5fY19jaGVja19tZW1iZXIgIiRMSU5FTk8iICJzdHJ1Y3Qgc3RhdCIgInN0X2Jsa3NpemUiICJhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxrc2l6ZSIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxrc2l6ZSIgPSB4eWVzOyB0aGVuIDoKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX1NUUlVDVF9TVEFUX1NUX0JMS1NJWkUgMQotX0FDRU9GCi0KLQotZmkKLQotYWNfZm5fY19jaGVja19tZW1iZXIgIiRMSU5FTk8iICJzdHJ1Y3QgX19yZXNfc3RhdGUiICJyZXRyYW5zIiAiYWNfY3ZfbWVtYmVyX3N0cnVjdF9fX3Jlc19zdGF0ZV9yZXRyYW5zIiAiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZiBIQVZFX1NZU19UWVBFU19ICi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvbmFtZXNlci5oPgotI2luY2x1ZGUgPHJlc29sdi5oPgotCi0iCi1pZiB0ZXN0ICJ4JGFjX2N2X21lbWJlcl9zdHJ1Y3RfX19yZXNfc3RhdGVfcmV0cmFucyIgPSB4eWVzOyB0aGVuIDoKLQotZWxzZQotCi0kYXNfZWNobyAiI2RlZmluZSBfX3Jlc19zdGF0ZSBzdGF0ZSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3NfZmFtaWx5IGZpZWxkIGluIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzc19mYW1pbHkgZmllbGQgaW4gc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV9zc19mYW1pbHlfaW5fc3RydWN0X3NzKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotaW50Ci1tYWluICgpCi17Ci0gc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugczsgcy5zc19mYW1pbHkgPSAxOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICBhY19jdl9oYXZlX3NzX2ZhbWlseV9pbl9zdHJ1Y3Rfc3M9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hhdmVfc3NfZmFtaWx5X2luX3N0cnVjdF9zcz0ibm8iCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfc3NfZmFtaWx5X2luX3N0cnVjdF9zcyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hhdmVfc3NfZmFtaWx5X2luX3N0cnVjdF9zcyIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfc3NfZmFtaWx5X2luX3N0cnVjdF9zcyIgPSAieHllcyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1NfRkFNSUxZX0lOX1NTIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfX3NzX2ZhbWlseSBmaWVsZCBpbiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgX19zc19mYW1pbHkgZmllbGQgaW4gc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV9fX3NzX2ZhbWlseV9pbl9zdHJ1Y3Rfc3MrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi1pbnQKLW1haW4gKCkKLXsKLSBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzOyBzLl9fc3NfZmFtaWx5ID0gMTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgYWNfY3ZfaGF2ZV9fX3NzX2ZhbWlseV9pbl9zdHJ1Y3Rfc3M9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hhdmVfX19zc19mYW1pbHlfaW5fc3RydWN0X3NzPSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX19fc3NfZmFtaWx5X2luX3N0cnVjdF9zcyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hhdmVfX19zc19mYW1pbHlfaW5fc3RydWN0X3NzIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9fX3NzX2ZhbWlseV9pbl9zdHJ1Y3Rfc3MiID0gInh5ZXMiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX19fU1NfRkFNSUxZX0lOX1NTIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBwd19jbGFzcyBmaWVsZCBpbiBzdHJ1Y3QgcGFzc3dkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBwd19jbGFzcyBmaWVsZCBpbiBzdHJ1Y3QgcGFzc3dkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hhdmVfcHdfY2xhc3NfaW5fc3RydWN0X3Bhc3N3ZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPHB3ZC5oPgotaW50Ci1tYWluICgpCi17Ci0gc3RydWN0IHBhc3N3ZCBwOyBwLnB3X2NsYXNzID0gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgYWNfY3ZfaGF2ZV9wd19jbGFzc19pbl9zdHJ1Y3RfcGFzc3dkPSJ5ZXMiCi1lbHNlCi0gICBhY19jdl9oYXZlX3B3X2NsYXNzX2luX3N0cnVjdF9wYXNzd2Q9Im5vIgotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfcHdfY2xhc3NfaW5fc3RydWN0X3Bhc3N3ZCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hhdmVfcHdfY2xhc3NfaW5fc3RydWN0X3Bhc3N3ZCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfcHdfY2xhc3NfaW5fc3RydWN0X3Bhc3N3ZCIgPSAieHllcyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfUFdfQ0xBU1NfSU5fUEFTU1dEIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBwd19leHBpcmUgZmllbGQgaW4gc3RydWN0IHBhc3N3ZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgcHdfZXhwaXJlIGZpZWxkIGluIHN0cnVjdCBwYXNzd2QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV9wd19leHBpcmVfaW5fc3RydWN0X3Bhc3N3ZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPHB3ZC5oPgotaW50Ci1tYWluICgpCi17Ci0gc3RydWN0IHBhc3N3ZCBwOyBwLnB3X2V4cGlyZSA9IDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfcHdfZXhwaXJlX2luX3N0cnVjdF9wYXNzd2Q9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hhdmVfcHdfZXhwaXJlX2luX3N0cnVjdF9wYXNzd2Q9Im5vIgotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfcHdfZXhwaXJlX2luX3N0cnVjdF9wYXNzd2QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX3B3X2V4cGlyZV9pbl9zdHJ1Y3RfcGFzc3dkIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9wd19leHBpcmVfaW5fc3RydWN0X3Bhc3N3ZCIgPSAieHllcyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfUFdfRVhQSVJFX0lOX1BBU1NXRCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcHdfY2hhbmdlIGZpZWxkIGluIHN0cnVjdCBwYXNzd2QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB3X2NoYW5nZSBmaWVsZCBpbiBzdHJ1Y3QgcGFzc3dkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hhdmVfcHdfY2hhbmdlX2luX3N0cnVjdF9wYXNzd2QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxwd2QuaD4KLWludAotbWFpbiAoKQotewotIHN0cnVjdCBwYXNzd2QgcDsgcC5wd19jaGFuZ2UgPSAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICBhY19jdl9oYXZlX3B3X2NoYW5nZV9pbl9zdHJ1Y3RfcGFzc3dkPSJ5ZXMiCi1lbHNlCi0gICBhY19jdl9oYXZlX3B3X2NoYW5nZV9pbl9zdHJ1Y3RfcGFzc3dkPSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX3B3X2NoYW5nZV9pbl9zdHJ1Y3RfcGFzc3dkIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaGF2ZV9wd19jaGFuZ2VfaW5fc3RydWN0X3Bhc3N3ZCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfcHdfY2hhbmdlX2luX3N0cnVjdF9wYXNzd2QiID0gInh5ZXMiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1BXX0NIQU5HRV9JTl9QQVNTV0QgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHB3X2dlY29zIGZpZWxkIGluIHN0cnVjdCBwYXNzd2QiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB3X2dlY29zIGZpZWxkIGluIHN0cnVjdCBwYXNzd2QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV9wd19nZWNvc19pbl9zdHJ1Y3RfcGFzc3dkKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8cHdkLmg+Ci1pbnQKLW1haW4gKCkKLXsKLSBzdHJ1Y3QgcGFzc3dkIHA7IHAucHdfZ2Vjb3MgPSAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICBhY19jdl9oYXZlX3B3X2dlY29zX2luX3N0cnVjdF9wYXNzd2Q9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hhdmVfcHdfZ2Vjb3NfaW5fc3RydWN0X3Bhc3N3ZD0ibm8iCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9wd19nZWNvc19pbl9zdHJ1Y3RfcGFzc3dkIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaGF2ZV9wd19nZWNvc19pbl9zdHJ1Y3RfcGFzc3dkIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9wd19nZWNvc19pbl9zdHJ1Y3RfcGFzc3dkIiA9ICJ4eWVzIiA7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9QV19HRUNPU19JTl9QQVNTV0QgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG1zZ19hY2NyaWdodHMgZmllbGQgaW4gc3RydWN0IG1zZ2hkciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgbXNnX2FjY3JpZ2h0cyBmaWVsZCBpbiBzdHJ1Y3QgbXNnaGRyLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hhdmVfYWNjcmlnaHRzX2luX21zZ2hkcis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotI2lmZGVmIG1zZ19hY2NyaWdodHMKLSNlcnJvciAibXNnX2FjY3JpZ2h0cyBpcyBhIG1hY3JvIgotZXhpdCgxKTsKLSNlbmRpZgotc3RydWN0IG1zZ2hkciBtOwotbS5tc2dfYWNjcmlnaHRzID0gMDsKLWV4aXQoMCk7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgYWNfY3ZfaGF2ZV9hY2NyaWdodHNfaW5fbXNnaGRyPSJ5ZXMiCi1lbHNlCi0gICBhY19jdl9oYXZlX2FjY3JpZ2h0c19pbl9tc2doZHI9Im5vIgotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfYWNjcmlnaHRzX2luX21zZ2hkciIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hhdmVfYWNjcmlnaHRzX2luX21zZ2hkciIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfYWNjcmlnaHRzX2luX21zZ2hkciIgPSAieHllcyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfQUNDUklHSFRTX0lOX01TR0hEUiAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBzdHJ1Y3Qgc3RhdHZmcy5mX2ZzaWQgaXMgaW50ZWdyYWwgdHlwZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiBzdHJ1Y3Qgc3RhdHZmcy5mX2ZzaWQgaXMgaW50ZWdyYWwgdHlwZS4uLiAiID4mNjsgfQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpZmRlZiBIQVZFX1NZU19USU1FX0gKLSMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX01PVU5UX0gKLSNpbmNsdWRlIDxzeXMvbW91bnQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1NUQVRWRlNfSAotI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+Ci0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci0gc3RydWN0IHN0YXR2ZnMgczsgcy5mX2ZzaWQgPSAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGZzaWRfdCBoYXMgbWVtYmVyIHZhbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiBmc2lkX3QgaGFzIG1lbWJlciB2YWwuLi4gIiA+JjY7IH0KLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgotCi1pbnQKLW1haW4gKCkKLXsKLSBmc2lkX3QgdDsgdC52YWxbMF0gPSAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi0kYXNfZWNobyAiI2RlZmluZSBGU0lEX0hBU19WQUwgMSIgPj5jb25mZGVmcy5oCi0KLWVsc2UKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBmX2ZzaWQgaGFzIG1lbWJlciBfX3ZhbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiBmX2ZzaWQgaGFzIG1lbWJlciBfX3ZhbC4uLiAiID4mNjsgfQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+Ci0KLWludAotbWFpbiAoKQotewotIGZzaWRfdCB0OyB0Ll9fdmFsWzBdID0gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQotJGFzX2VjaG8gIiNkZWZpbmUgRlNJRF9IQVNfX19WQUwgMSIgPj5jb25mZGVmcy5oCi0KLWVsc2UKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG1zZ19jb250cm9sIGZpZWxkIGluIHN0cnVjdCBtc2doZHIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG1zZ19jb250cm9sIGZpZWxkIGluIHN0cnVjdCBtc2doZHIuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV9jb250cm9sX2luX21zZ2hkcis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotI2lmZGVmIG1zZ19jb250cm9sCi0jZXJyb3IgIm1zZ19jb250cm9sIGlzIGEgbWFjcm8iCi1leGl0KDEpOwotI2VuZGlmCi1zdHJ1Y3QgbXNnaGRyIG07Ci1tLm1zZ19jb250cm9sID0gMDsKLWV4aXQoMCk7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgYWNfY3ZfaGF2ZV9jb250cm9sX2luX21zZ2hkcj0ieWVzIgotZWxzZQotICAgYWNfY3ZfaGF2ZV9jb250cm9sX2luX21zZ2hkcj0ibm8iCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9jb250cm9sX2luX21zZ2hkciIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hhdmVfY29udHJvbF9pbl9tc2doZHIiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9oYXZlX2NvbnRyb2xfaW5fbXNnaGRyIiA9ICJ4eWVzIiA7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9DT05UUk9MX0lOX01TR0hEUiAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBsaWJjIGRlZmluZXMgX19wcm9nbmFtZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiBsaWJjIGRlZmluZXMgX19wcm9nbmFtZS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJjX2RlZmluZXNfX19wcm9nbmFtZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotIGV4dGVybiBjaGFyICpfX3Byb2duYW1lOyBwcmludGYoIiVzIiwgX19wcm9nbmFtZSk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2xpYmNfZGVmaW5lc19fX3Byb2duYW1lPSJ5ZXMiCi1lbHNlCi0gICBhY19jdl9saWJjX2RlZmluZXNfX19wcm9nbmFtZT0ibm8iCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJjX2RlZmluZXNfX19wcm9nbmFtZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYmNfZGVmaW5lc19fX3Byb2duYW1lIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliY19kZWZpbmVzX19fcHJvZ25hbWUiID0gInh5ZXMiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX19fUFJPR05BTUUgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgaW1wbGVtZW50cyBfX0ZVTkNUSU9OX18iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgaW1wbGVtZW50cyBfX0ZVTkNUSU9OX18uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfY2NfaW1wbGVtZW50c19fX0ZVTkNUSU9OX18rOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxzdGRpby5oPgotaW50Ci1tYWluICgpCi17Ci0gcHJpbnRmKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2NjX2ltcGxlbWVudHNfX19GVU5DVElPTl9fPSJ5ZXMiCi1lbHNlCi0gICBhY19jdl9jY19pbXBsZW1lbnRzX19fRlVOQ1RJT05fXz0ibm8iCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jY19pbXBsZW1lbnRzX19fRlVOQ1RJT05fXyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2NjX2ltcGxlbWVudHNfX19GVU5DVElPTl9fIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfY2NfaW1wbGVtZW50c19fX0ZVTkNUSU9OX18iID0gInh5ZXMiIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX19fRlVOQ1RJT05fXyAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBpbXBsZW1lbnRzIF9fZnVuY19fIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGltcGxlbWVudHMgX19mdW5jX18uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfY2NfaW1wbGVtZW50c19fX2Z1bmNfXys6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci1pbnQKLW1haW4gKCkKLXsKLSBwcmludGYoIiVzIiwgX19mdW5jX18pOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gICBhY19jdl9jY19pbXBsZW1lbnRzX19fZnVuY19fPSJ5ZXMiCi1lbHNlCi0gICBhY19jdl9jY19pbXBsZW1lbnRzX19fZnVuY19fPSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NjX2ltcGxlbWVudHNfX19mdW5jX18iID4mNQotJGFzX2VjaG8gIiRhY19jdl9jY19pbXBsZW1lbnRzX19fZnVuY19fIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfY2NfaW1wbGVtZW50c19fX2Z1bmNfXyIgPSAieHllcyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfX19mdW5jX18gMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB2YV9jb3B5IGV4aXN0cyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHZhX2NvcHkgZXhpc3RzLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hhdmVfdmFfY29weSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLXZhX2xpc3QgeCx5OwotCi1pbnQKLW1haW4gKCkKLXsKLSB2YV9jb3B5KHgseSk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2hhdmVfdmFfY29weT0ieWVzIgotZWxzZQotICAgYWNfY3ZfaGF2ZV92YV9jb3B5PSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfdmFfY29weSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2hhdmVfdmFfY29weSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfdmFfY29weSIgPSAieHllcyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfVkFfQ09QWSAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIF9fdmFfY29weSBleGlzdHMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBfX3ZhX2NvcHkgZXhpc3RzLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2hhdmVfX192YV9jb3B5Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotdmFfbGlzdCB4LHk7Ci0KLWludAotbWFpbiAoKQotewotIF9fdmFfY29weSh4LHkpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gICBhY19jdl9oYXZlX19fdmFfY29weT0ieWVzIgotZWxzZQotICAgYWNfY3ZfaGF2ZV9fX3ZhX2NvcHk9Im5vIgotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9fX3ZhX2NvcHkiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX19fdmFfY29weSIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfX192YV9jb3B5IiA9ICJ4eWVzIiA7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9fX1ZBX0NPUFkgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBnZXRvcHQgaGFzIG9wdHJlc2V0IHN1cHBvcnQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBnZXRvcHQgaGFzIG9wdHJlc2V0IHN1cHBvcnQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfaGF2ZV9nZXRvcHRfb3B0cmVzZXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotCi0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxnZXRvcHQuaD4KLWludAotbWFpbiAoKQotewotIGV4dGVybiBpbnQgb3B0cmVzZXQ7IG9wdHJlc2V0ID0gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICAgYWNfY3ZfaGF2ZV9nZXRvcHRfb3B0cmVzZXQ9InllcyIKLWVsc2UKLSAgIGFjX2N2X2hhdmVfZ2V0b3B0X29wdHJlc2V0PSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfZ2V0b3B0X29wdHJlc2V0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaGF2ZV9nZXRvcHRfb3B0cmVzZXQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9oYXZlX2dldG9wdF9vcHRyZXNldCIgPSAieHllcyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfR0VUT1BUX09QVFJFU0VUIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGxpYmMgZGVmaW5lcyBzeXNfZXJybGlzdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiBsaWJjIGRlZmluZXMgc3lzX2Vycmxpc3QuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliY19kZWZpbmVzX3N5c19lcnJsaXN0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLQotCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0gZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHN5c19lcnJsaXN0W107IHByaW50ZigiJXMiLCBzeXNfZXJybGlzdFswXSk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2xpYmNfZGVmaW5lc19zeXNfZXJybGlzdD0ieWVzIgotZWxzZQotICAgYWNfY3ZfbGliY19kZWZpbmVzX3N5c19lcnJsaXN0PSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYmNfZGVmaW5lc19zeXNfZXJybGlzdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYmNfZGVmaW5lc19zeXNfZXJybGlzdCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYmNfZGVmaW5lc19zeXNfZXJybGlzdCIgPSAieHllcyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1lTX0VSUkxJU1QgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBsaWJjIGRlZmluZXMgc3lzX25lcnIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgbGliYyBkZWZpbmVzIHN5c19uZXJyLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X2xpYmNfZGVmaW5lc19zeXNfbmVycis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0KLQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotIGV4dGVybiBpbnQgc3lzX25lcnI7IHByaW50ZigiJWkiLCBzeXNfbmVycik7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIGFjX2N2X2xpYmNfZGVmaW5lc19zeXNfbmVycj0ieWVzIgotZWxzZQotICAgYWNfY3ZfbGliY19kZWZpbmVzX3N5c19uZXJyPSJubyIKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYmNfZGVmaW5lc19zeXNfbmVyciIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYmNfZGVmaW5lc19zeXNfbmVyciIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYmNfZGVmaW5lc19zeXNfbmVyciIgPSAieHllcyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1lTX05FUlIgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLSMgQ2hlY2sgbGlicmFyaWVzIG5lZWRlZCBieSBETlMgZmluZ2VycHJpbnQgc3VwcG9ydAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGdldHJyc2V0YnluYW1lIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZ2V0cnJzZXRieW5hbWUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2VhcmNoX2dldHJyc2V0YnluYW1lKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZ2V0cnJzZXRieW5hbWUgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBnZXRycnNldGJ5bmFtZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotZm9yIGFjX2xpYiBpbiAnJyByZXNvbHY7IGRvCi0gIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCi0gICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgotICBlbHNlCi0gICAgYWNfcmVzPS1sJGFjX2xpYgotICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKLSAgZmkKLSAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zZWFyY2hfZ2V0cnJzZXRieW5hbWU9JGFjX3JlcwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICBpZiAke2FjX2N2X3NlYXJjaF9nZXRycnNldGJ5bmFtZSs6fSBmYWxzZTsgdGhlbiA6Ci0gIGJyZWFrCi1maQotZG9uZQotaWYgJHthY19jdl9zZWFyY2hfZ2V0cnJzZXRieW5hbWUrOn0gZmFsc2U7IHRoZW4gOgotCi1lbHNlCi0gIGFjX2N2X3NlYXJjaF9nZXRycnNldGJ5bmFtZT1ubwotZmkKLXJtIGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX2dldHJyc2V0YnluYW1lIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX2dldHJyc2V0YnluYW1lIiA+JjY7IH0KLWFjX3Jlcz0kYWNfY3Zfc2VhcmNoX2dldHJyc2V0YnluYW1lCi1pZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6Ci0gIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfR0VUUlJTRVRCWU5BTUUgMSIgPj5jb25mZGVmcy5oCi0KLWVsc2UKLQotCQkjIE5lZWRlZCBieSBvdXIgZ2V0cnJzZXRieW5hbWUoKQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgcmVzX3F1ZXJ5IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgcmVzX3F1ZXJ5Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3NlYXJjaF9yZXNfcXVlcnkrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciByZXNfcXVlcnkgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiByZXNfcXVlcnkgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWZvciBhY19saWIgaW4gJycgcmVzb2x2OyBkbwotICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgotICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKLSAgZWxzZQotICAgIGFjX3Jlcz0tbCRhY19saWIKLSAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCi0gIGZpCi0gIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3Zfc2VhcmNoX3Jlc19xdWVyeT0kYWNfcmVzCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0Ci0gIGlmICR7YWNfY3Zfc2VhcmNoX3Jlc19xdWVyeSs6fSBmYWxzZTsgdGhlbiA6Ci0gIGJyZWFrCi1maQotZG9uZQotaWYgJHthY19jdl9zZWFyY2hfcmVzX3F1ZXJ5Kzp9IGZhbHNlOyB0aGVuIDoKLQotZWxzZQotICBhY19jdl9zZWFyY2hfcmVzX3F1ZXJ5PW5vCi1maQotcm0gY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfcmVzX3F1ZXJ5IiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX3Jlc19xdWVyeSIgPiY2OyB9Ci1hY19yZXM9JGFjX2N2X3NlYXJjaF9yZXNfcXVlcnkKLWlmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuIDoKLSAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKLQotZmkKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZG5fZXhwYW5kIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZG5fZXhwYW5kLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3NlYXJjaF9kbl9leHBhbmQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkbl9leHBhbmQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkbl9leHBhbmQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWZvciBhY19saWIgaW4gJycgcmVzb2x2OyBkbwotICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgotICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKLSAgZWxzZQotICAgIGFjX3Jlcz0tbCRhY19saWIKLSAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCi0gIGZpCi0gIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3Zfc2VhcmNoX2RuX2V4cGFuZD0kYWNfcmVzCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0Ci0gIGlmICR7YWNfY3Zfc2VhcmNoX2RuX2V4cGFuZCs6fSBmYWxzZTsgdGhlbiA6Ci0gIGJyZWFrCi1maQotZG9uZQotaWYgJHthY19jdl9zZWFyY2hfZG5fZXhwYW5kKzp9IGZhbHNlOyB0aGVuIDoKLQotZWxzZQotICBhY19jdl9zZWFyY2hfZG5fZXhwYW5kPW5vCi1maQotcm0gY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfZG5fZXhwYW5kIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX2RuX2V4cGFuZCIgPiY2OyB9Ci1hY19yZXM9JGFjX2N2X3NlYXJjaF9kbl9leHBhbmQKLWlmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuIDoKLSAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKLQotZmkKLQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHJlc19xdWVyeSB3aWxsIGxpbmsiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgcmVzX3F1ZXJ5IHdpbGwgbGluay4uLiAiID4mNjsgfQotCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxyZXNvbHYuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLQlyZXNfcXVlcnkgKDAsIDAsIDAsIDAsIDApOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0JCSAgICBzYXZlZF9MSUJTPSIkTElCUyIKLQkJICAgIExJQlM9IiRMSUJTIC1scmVzb2x2IgotCQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcmVzX3F1ZXJ5IGluIC1scmVzb2x2IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciByZXNfcXVlcnkgaW4gLWxyZXNvbHYuLi4gIiA+JjY7IH0KLQkJICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHJlc29sdi5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotCXJlc19xdWVyeSAoMCwgMCwgMCwgMCwgMCk7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotICBMSUJTPSIkc2F2ZWRfTElCUyIKLQkJCSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQkJZm9yIGFjX2Z1bmMgaW4gX2dldHNob3J0IF9nZXRsb25nCi1kbyA6Ci0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLWRvbmUKLQotCQlhY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJfZ2V0c2hvcnQiICJhY19jdl9oYXZlX2RlY2xfX2dldHNob3J0IiAiI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCQkgICAgI2luY2x1ZGUgPGFycGEvbmFtZXNlci5oPgotIgotaWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfX2dldHNob3J0IiA9IHh5ZXM7IHRoZW4gOgotICBhY19oYXZlX2RlY2w9MQotZWxzZQotICBhY19oYXZlX2RlY2w9MAotZmkKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX0RFQ0xfX0dFVFNIT1JUICRhY19oYXZlX2RlY2wKLV9BQ0VPRgotYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiX2dldGxvbmciICJhY19jdl9oYXZlX2RlY2xfX2dldGxvbmciICIjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JCSAgICAjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+Ci0iCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9fZ2V0bG9uZyIgPSB4eWVzOyB0aGVuIDoKLSAgYWNfaGF2ZV9kZWNsPTEKLWVsc2UKLSAgYWNfaGF2ZV9kZWNsPTAKLWZpCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ERUNMX19HRVRMT05HICRhY19oYXZlX2RlY2wKLV9BQ0VPRgotCi0JCWFjX2ZuX2NfY2hlY2tfbWVtYmVyICIkTElORU5PIiAiSEVBREVSIiAiYWQiICJhY19jdl9tZW1iZXJfSEVBREVSX2FkIiAiI2luY2x1ZGUgPGFycGEvbmFtZXNlci5oPgotIgotaWYgdGVzdCAieCRhY19jdl9tZW1iZXJfSEVBREVSX2FkIiA9IHh5ZXM7IHRoZW4gOgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0hFQURFUl9BRCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotCi1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgc3RydWN0IF9fcmVzX3N0YXRlIF9yZXMgaXMgYW4gZXh0ZXJuIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHN0cnVjdCBfX3Jlc19zdGF0ZSBfcmVzIGlzIGFuIGV4dGVybi4uLiAiID4mNjsgfQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZiBIQVZFX1NZU19UWVBFU19ICi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvbmFtZXNlci5oPgotI2luY2x1ZGUgPHJlc29sdi5oPgotZXh0ZXJuIHN0cnVjdCBfX3Jlc19zdGF0ZSBfcmVzOwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfX1JFU19FWFRFUk4gMSIgPj5jb25mZGVmcy5oCi0KLQotZWxzZQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCi0jIENoZWNrIHdoZXRoZXIgdXNlciB3YW50cyBTRUxpbnV4IHN1cHBvcnQKLVNFTElOVVhfTVNHPSJubyIKLUxJQlNFTElOVVg9IiIKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zZWxpbnV4IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9zZWxpbnV4K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9zZWxpbnV4OyAgaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQkJc2F2ZV9MSUJTPSIkTElCUyIKLQotJGFzX2VjaG8gIiNkZWZpbmUgV0lUSF9TRUxJTlVYIDEiID4+Y29uZmRlZnMuaAotCi0JCVNFTElOVVhfTVNHPSJ5ZXMiCi0JCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJzZWxpbnV4L3NlbGludXguaCIgImFjX2N2X2hlYWRlcl9zZWxpbnV4X3NlbGludXhfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc2VsaW51eF9zZWxpbnV4X2giID0geHllczsgdGhlbiA6Ci0KLWVsc2UKLSAgYXNfZm5fZXJyb3IgJD8gIlNFTGludXggc3VwcG9ydCByZXF1aXJlcyBzZWxpbnV4LmggaGVhZGVyIiAiJExJTkVOTyIgNQotZmkKLQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNldGV4ZWNjb24gaW4gLWxzZWxpbnV4IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBzZXRleGVjY29uIGluIC1sc2VsaW51eC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfc2VsaW51eF9zZXRleGVjY29uKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxzZWxpbnV4ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzZXRleGVjY29uICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gc2V0ZXhlY2NvbiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfc2VsaW51eF9zZXRleGVjY29uPXllcwotZWxzZQotICBhY19jdl9saWJfc2VsaW51eF9zZXRleGVjY29uPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zZWxpbnV4X3NldGV4ZWNjb24iID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfc2VsaW51eF9zZXRleGVjY29uIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3NlbGludXhfc2V0ZXhlY2NvbiIgPSB4eWVzOyB0aGVuIDoKLSAgIExJQlNFTElOVVg9Ii1sc2VsaW51eCIKLQkJCSAgTElCUz0iJExJQlMgLWxzZWxpbnV4IgotCi1lbHNlCi0gIGFzX2ZuX2Vycm9yICQ/ICJTRUxpbnV4IHN1cHBvcnQgcmVxdWlyZXMgbGlic2VsaW51eCBsaWJyYXJ5IiAiJExJTkVOTyIgNQotZmkKLQotCQlTU0hMSUJTPSIkU1NITElCUyAkTElCU0VMSU5VWCIKLQkJU1NIRExJQlM9IiRTU0hETElCUyAkTElCU0VMSU5VWCIKLQkJZm9yIGFjX2Z1bmMgaW4gZ2V0c2V1c2VyYnluYW1lIGdldF9kZWZhdWx0X2NvbnRleHRfd2l0aF9sZXZlbAotZG8gOgotICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLQkJTElCUz0iJHNhdmVfTElCUyIKLQlmaQotCi1maQotCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgdXNlciB3YW50cyBLZXJiZXJvcyA1IHN1cHBvcnQKLUtSQjVfTVNHPSJubyIKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1rZXJiZXJvczUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2tlcmJlcm9zNStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfa2VyYmVyb3M1OyAgaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQkJaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4eWVzIiA7IHRoZW4KLQkJCUtSQjVST09UPSIvdXNyL2xvY2FsIgotCQllbHNlCi0JCQlLUkI1Uk9PVD0ke3dpdGh2YWx9Ci0JCWZpCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgS1JCNSAxIiA+PmNvbmZkZWZzLmgKLQotCQlLUkI1X01TRz0ieWVzIgotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAia3JiNS1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGtyYjUtY29uZmlnOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfcGF0aF9LUkI1Q09ORis6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJEtSQjVDT05GIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0tSQjVDT05GPSIkS1JCNUNPTkYiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1hc19kdW1teT0iJEtSQjVST09UL2JpbjokUEFUSCIKLWZvciBhc19kaXIgaW4gJGFzX2R1bW15Ci1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX0tSQjVDT05GPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0tSQjVDT05GIiAmJiBhY19jdl9wYXRoX0tSQjVDT05GPSIkS1JCNVJPT1QvYmluL2tyYjUtY29uZmlnIgotICA7OwotZXNhYwotZmkKLUtSQjVDT05GPSRhY19jdl9wYXRoX0tSQjVDT05GCi1pZiB0ZXN0IC1uICIkS1JCNUNPTkYiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkS1JCNUNPTkYiID4mNQotJGFzX2VjaG8gIiRLUkI1Q09ORiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0JCWlmIHRlc3QgLXggJEtSQjVDT05GIDsgdGhlbgotCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnc3NhcGkgc3VwcG9ydCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3NzYXBpIHN1cHBvcnQuLi4gIiA+JjY7IH0KLQkJCWlmICRLUkI1Q09ORiB8IGdyZXAgZ3NzYXBpID4vZGV2L251bGwgOyB0aGVuCi0JCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQotJGFzX2VjaG8gIiNkZWZpbmUgR1NTQVBJIDEiID4+Y29uZmRlZnMuaAotCi0JCQkJazVjb25mb3B0cz1nc3NhcGkKLQkJCWVsc2UKLQkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQkJCQlrNWNvbmZvcHRzPSIiCi0JCQlmaQotCQkJSzVDRkxBR1M9ImAkS1JCNUNPTkYgLS1jZmxhZ3MgJGs1Y29uZm9wdHNgIgotCQkJSzVMSUJTPSJgJEtSQjVDT05GIC0tbGlicyAkazVjb25mb3B0c2AiCi0JCQlDUFBGTEFHUz0iJENQUEZMQUdTICRLNUNGTEFHUyIKLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgSGVpbWRhbCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBIZWltZGFsLi4uICIgPiY2OyB9Ci0JCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPGtyYjUuaD4KLQotaW50Ci1tYWluICgpCi17Ci0gY2hhciAqdG1wID0gaGVpbWRhbF92ZXJzaW9uOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi0kYXNfZWNobyAiI2RlZmluZSBIRUlNREFMIDEiID4+Y29uZmRlZnMuaAotCi1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0JCWVsc2UKLQkJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkke0tSQjVST09UfS9pbmNsdWRlIgotCQkJTERGTEFHUz0iJExERkxBR1MgLUwke0tSQjVST09UfS9saWIiCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEhlaW1kYWwiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgSGVpbWRhbC4uLiAiID4mNjsgfQotCQkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxrcmI1Lmg+Ci0KLWludAotbWFpbiAoKQotewotIGNoYXIgKnRtcCA9IGhlaW1kYWxfdmVyc2lvbjsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQkJCQkJICRhc19lY2hvICIjZGVmaW5lIEhFSU1EQUwgMSIgPj5jb25mZGVmcy5oCi0KLQkJCQkJIEs1TElCUz0iLWxrcmI1IgotCQkJCQkgSzVMSUJTPSIkSzVMSUJTIC1sY29tX2VyciAtbGFzbjEiCi0JCQkJCSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBuZXRfd3JpdGUgaW4gLWxyb2tlbiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgbmV0X3dyaXRlIGluIC1scm9rZW4uLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3Jva2VuX25ldF93cml0ZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1scm9rZW4gICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIG5ldF93cml0ZSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIG5ldF93cml0ZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfcm9rZW5fbmV0X3dyaXRlPXllcwotZWxzZQotICBhY19jdl9saWJfcm9rZW5fbmV0X3dyaXRlPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9yb2tlbl9uZXRfd3JpdGUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfcm9rZW5fbmV0X3dyaXRlIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX3Jva2VuX25ldF93cml0ZSIgPSB4eWVzOyB0aGVuIDoKLSAgSzVMSUJTPSIkSzVMSUJTIC1scm9rZW4iCi1maQotCi0JCQkJCSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkZXNfY2JjX2VuY3J5cHQgaW4gLWxkZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRlc19jYmNfZW5jcnlwdCBpbiAtbGRlcy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfZGVzX2Rlc19jYmNfZW5jcnlwdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sZGVzICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkZXNfY2JjX2VuY3J5cHQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBkZXNfY2JjX2VuY3J5cHQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2Rlc19kZXNfY2JjX2VuY3J5cHQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9kZXNfZGVzX2NiY19lbmNyeXB0PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kZXNfZGVzX2NiY19lbmNyeXB0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2Rlc19kZXNfY2JjX2VuY3J5cHQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZGVzX2Rlc19jYmNfZW5jcnlwdCIgPSB4eWVzOyB0aGVuIDoKLSAgSzVMSUJTPSIkSzVMSUJTIC1sZGVzIgotZmkKLQotCi1lbHNlCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQkJCQkJIEs1TElCUz0iLWxrcmI1IC1sazVjcnlwdG8gLWxjb21fZXJyIgotCi0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBkbl9leHBhbmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBkbl9leHBhbmQuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2VhcmNoX2RuX2V4cGFuZCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUwotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRuX2V4cGFuZCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRuX2V4cGFuZCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotZm9yIGFjX2xpYiBpbiAnJyByZXNvbHY7IGRvCi0gIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCi0gICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgotICBlbHNlCi0gICAgYWNfcmVzPS1sJGFjX2xpYgotICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKLSAgZmkKLSAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zZWFyY2hfZG5fZXhwYW5kPSRhY19yZXMKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQKLSAgaWYgJHthY19jdl9zZWFyY2hfZG5fZXhwYW5kKzp9IGZhbHNlOyB0aGVuIDoKLSAgYnJlYWsKLWZpCi1kb25lCi1pZiAke2FjX2N2X3NlYXJjaF9kbl9leHBhbmQrOn0gZmFsc2U7IHRoZW4gOgotCi1lbHNlCi0gIGFjX2N2X3NlYXJjaF9kbl9leHBhbmQ9bm8KLWZpCi1ybSBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9kbl9leHBhbmQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfZG5fZXhwYW5kIiA+JjY7IH0KLWFjX3Jlcz0kYWNfY3Zfc2VhcmNoX2RuX2V4cGFuZAotaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgotICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgotCi1maQotCi0KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdzc19pbml0X3NlY19jb250ZXh0IGluIC1sZ3NzYXBpX2tyYjUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdzc19pbml0X3NlY19jb250ZXh0IGluIC1sZ3NzYXBpX2tyYjUuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX2dzc2FwaV9rcmI1X2dzc19pbml0X3NlY19jb250ZXh0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxnc3NhcGlfa3JiNSAkSzVMSUJTICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGdzc19pbml0X3NlY19jb250ZXh0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZ3NzX2luaXRfc2VjX2NvbnRleHQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2dzc2FwaV9rcmI1X2dzc19pbml0X3NlY19jb250ZXh0PXllcwotZWxzZQotICBhY19jdl9saWJfZ3NzYXBpX2tyYjVfZ3NzX2luaXRfc2VjX2NvbnRleHQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2dzc2FwaV9rcmI1X2dzc19pbml0X3NlY19jb250ZXh0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2dzc2FwaV9rcmI1X2dzc19pbml0X3NlY19jb250ZXh0IiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2dzc2FwaV9rcmI1X2dzc19pbml0X3NlY19jb250ZXh0IiA9IHh5ZXM7IHRoZW4gOgotICAgJGFzX2VjaG8gIiNkZWZpbmUgR1NTQVBJIDEiID4+Y29uZmRlZnMuaAotCi0JCQkJICBLNUxJQlM9Ii1sZ3NzYXBpX2tyYjUgJEs1TElCUyIKLWVsc2UKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdzc19pbml0X3NlY19jb250ZXh0IGluIC1sZ3NzYXBpIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBnc3NfaW5pdF9zZWNfY29udGV4dCBpbiAtbGdzc2FwaS4uLiAiID4mNjsgfQotaWYgJHthY19jdl9saWJfZ3NzYXBpX2dzc19pbml0X3NlY19jb250ZXh0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxnc3NhcGkgJEs1TElCUyAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBnc3NfaW5pdF9zZWNfY29udGV4dCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdzc19pbml0X3NlY19jb250ZXh0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9nc3NhcGlfZ3NzX2luaXRfc2VjX2NvbnRleHQ9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl9nc3NhcGlfZ3NzX2luaXRfc2VjX2NvbnRleHQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2dzc2FwaV9nc3NfaW5pdF9zZWNfY29udGV4dCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9nc3NhcGlfZ3NzX2luaXRfc2VjX2NvbnRleHQiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZ3NzYXBpX2dzc19pbml0X3NlY19jb250ZXh0IiA9IHh5ZXM7IHRoZW4gOgotICAgJGFzX2VjaG8gIiNkZWZpbmUgR1NTQVBJIDEiID4+Y29uZmRlZnMuaAotCi0JCQkJCSAgSzVMSUJTPSItbGdzc2FwaSAkSzVMSUJTIgotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IENhbm5vdCBmaW5kIGFueSBzdWl0YWJsZSBnc3MtYXBpIGxpYnJhcnkgLSBidWlsZCBtYXkgZmFpbCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDYW5ub3QgZmluZCBhbnkgc3VpdGFibGUgZ3NzLWFwaSBsaWJyYXJ5IC0gYnVpbGQgbWF5IGZhaWwiID4mMjt9Ci1maQotCi0KLWZpCi0KLQotCQkJYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImdzc2FwaS5oIiAiYWNfY3ZfaGVhZGVyX2dzc2FwaV9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9nc3NhcGlfaCIgPSB4eWVzOyB0aGVuIDoKLQotZWxzZQotICAgdW5zZXQgYWNfY3ZfaGVhZGVyX2dzc2FwaV9oCi0JCQkJICBDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHtLUkI1Uk9PVH0vaW5jbHVkZS9nc3NhcGkiCi0JCQkJICBmb3IgYWNfaGVhZGVyIGluIGdzc2FwaS5oCi1kbyA6Ci0gIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJnc3NhcGkuaCIgImFjX2N2X2hlYWRlcl9nc3NhcGlfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfZ3NzYXBpX2giID0geHllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9HU1NBUElfSCAxCi1fQUNFT0YKLQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IENhbm5vdCBmaW5kIGFueSBzdWl0YWJsZSBnc3MtYXBpIGhlYWRlciAtIGJ1aWxkIG1heSBmYWlsIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhbm5vdCBmaW5kIGFueSBzdWl0YWJsZSBnc3MtYXBpIGhlYWRlciAtIGJ1aWxkIG1heSBmYWlsIiA+JjI7fQotCi1maQotCi1kb25lCi0KLQotCi1maQotCi0KLQotCQkJb2xkQ1BQPSIkQ1BQRkxBR1MiCi0JCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHtLUkI1Uk9PVH0vaW5jbHVkZS9nc3NhcGkiCi0JCQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiZ3NzYXBpX2tyYjUuaCIgImFjX2N2X2hlYWRlcl9nc3NhcGlfa3JiNV9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9nc3NhcGlfa3JiNV9oIiA9IHh5ZXM7IHRoZW4gOgotCi1lbHNlCi0gICBDUFBGTEFHUz0iJG9sZENQUCIKLWZpCi0KLQotCi0JCWZpCi0JCWlmIHRlc3QgISAteiAiJG5lZWRfZGFzaF9yIiA7IHRoZW4KLQkJCUxERkxBR1M9IiRMREZMQUdTIC1SJHtLUkI1Uk9PVH0vbGliIgotCQlmaQotCQlpZiB0ZXN0ICEgLXogIiRibGlicGF0aCIgOyB0aGVuCi0JCQlibGlicGF0aD0iJGJsaWJwYXRoOiR7S1JCNVJPT1R9L2xpYiIKLQkJZmkKLQotCQlmb3IgYWNfaGVhZGVyIGluIGdzc2FwaS5oIGdzc2FwaS9nc3NhcGkuaAotZG8gOgotICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi0JCWZvciBhY19oZWFkZXIgaW4gZ3NzYXBpX2tyYjUuaCBnc3NhcGkvZ3NzYXBpX2tyYjUuaAotZG8gOgotICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi0JCWZvciBhY19oZWFkZXIgaW4gZ3NzYXBpX2dlbmVyaWMuaCBnc3NhcGkvZ3NzYXBpX2dlbmVyaWMuaAotZG8gOgotICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi0KLQkJTElCUz0iJExJQlMgJEs1TElCUyIKLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGtfaGFzYWZzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcga19oYXNhZnMuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3Zfc2VhcmNoX2tfaGFzYWZzKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIga19oYXNhZnMgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBrX2hhc2FmcyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotZm9yIGFjX2xpYiBpbiAnJyBrYWZzOyBkbwotICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgotICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKLSAgZWxzZQotICAgIGFjX3Jlcz0tbCRhY19saWIKLSAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCi0gIGZpCi0gIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3Zfc2VhcmNoX2tfaGFzYWZzPSRhY19yZXMKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQKLSAgaWYgJHthY19jdl9zZWFyY2hfa19oYXNhZnMrOn0gZmFsc2U7IHRoZW4gOgotICBicmVhawotZmkKLWRvbmUKLWlmICR7YWNfY3Zfc2VhcmNoX2tfaGFzYWZzKzp9IGZhbHNlOyB0aGVuIDoKLQotZWxzZQotICBhY19jdl9zZWFyY2hfa19oYXNhZnM9bm8KLWZpCi1ybSBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9rX2hhc2FmcyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9rX2hhc2FmcyIgPiY2OyB9Ci1hY19yZXM9JGFjX2N2X3NlYXJjaF9rX2hhc2FmcwotaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgotICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgotCi0kYXNfZWNobyAiI2RlZmluZSBVU0VfQUZTIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0JZmkKLQotCi1maQotCi0KLSMgTG9va2luZyBmb3IgcHJvZ3JhbXMsIHBhdGhzIGFuZCBmaWxlcwotCi1QUklWU0VQX1BBVEg9L3Zhci9lbXB0eQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXByaXZzZXAtcGF0aCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfcHJpdnNlcF9wYXRoK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9wcml2c2VwX3BhdGg7Ci0JCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCi0JCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0JCQlQUklWU0VQX1BBVEg9JHdpdGh2YWwKLQkJZmkKLQotCi1maQotCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXhhdXRoIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF94YXV0aCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfeGF1dGg7Ci0JCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCi0JCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0JCQl4YXV0aF9wYXRoPSR3aXRodmFsCi0JCWZpCi0KLWVsc2UKLQotCQlUZXN0UGF0aD0iJFBBVEgiCi0JCVRlc3RQYXRoPSIke1Rlc3RQYXRofSR7UEFUSF9TRVBBUkFUT1J9L3Vzci9YL2JpbiIKLQkJVGVzdFBhdGg9IiR7VGVzdFBhdGh9JHtQQVRIX1NFUEFSQVRPUn0vdXNyL2Jpbi9YMTEiCi0JCVRlc3RQYXRoPSIke1Rlc3RQYXRofSR7UEFUSF9TRVBBUkFUT1J9L3Vzci9YMTFSNi9iaW4iCi0JCVRlc3RQYXRoPSIke1Rlc3RQYXRofSR7UEFUSF9TRVBBUkFUT1J9L3Vzci9vcGVud2luL2JpbiIKLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4YXV0aCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGF1dGg7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX3hhdXRoX3BhdGgrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICR4YXV0aF9wYXRoIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX3hhdXRoX3BhdGg9IiR4YXV0aF9wYXRoIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkVGVzdFBhdGgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhfeGF1dGhfcGF0aD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLXhhdXRoX3BhdGg9JGFjX2N2X3BhdGhfeGF1dGhfcGF0aAotaWYgdGVzdCAtbiAiJHhhdXRoX3BhdGgiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkeGF1dGhfcGF0aCIgPiY1Ci0kYXNfZWNobyAiJHhhdXRoX3BhdGgiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotCQlpZiAodGVzdCAhIC16ICIkeGF1dGhfcGF0aCIgJiYgdGVzdCAteCAiL3Vzci9vcGVud2luL2Jpbi94YXV0aCIpIDsgdGhlbgotCQkJeGF1dGhfcGF0aD0iL3Vzci9vcGVud2luL2Jpbi94YXV0aCIKLQkJZmkKLQotCi1maQotCi0KLVNUUklQX09QVD0tcwotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0cmlwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0cmlwK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfc3RyaXA7Ci0JCWlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iIDsgdGhlbgotCQkJU1RSSVBfT1BUPQotCQlmaQotCi0KLWZpCi0KLQotCi1pZiB0ZXN0IC16ICIkeGF1dGhfcGF0aCIgOyB0aGVuCi0JWEFVVEhfUEFUSD0idW5kZWZpbmVkIgotCi1lbHNlCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgWEFVVEhfUEFUSCAiJHhhdXRoX3BhdGgiCi1fQUNFT0YKLQotCVhBVVRIX1BBVEg9JHhhdXRoX3BhdGgKLQotZmkKLQotIyBDaGVjayBmb3IgbWFpbCBkaXJlY3RvcnkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1tYWlsZGlyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9tYWlsZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9tYWlsZGlyOwotCWlmIHRlc3QgIlgkd2l0aHZhbCIgIT0gWCAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0geG5vICAmJiAgXAotCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0geHllczsgdGhlbgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIE1BSUxfRElSRUNUT1JZICIkd2l0aHZhbCIKLV9BQ0VPRgotCi0JICAgIGZpCi0KLWVsc2UKLQotCWlmIHRlc3QgIlgkbWFpbGRpciIgIT0gIlgiOyB0aGVuCi0JICAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgTUFJTF9ESVJFQ1RPUlkgIiRtYWlsZGlyIgotX0FDRU9GCi0KLQllbHNlCi0JICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgRGlzY292ZXJpbmcgc3lzdGVtIG1haWwgZGlyZWN0b3J5IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIERpc2NvdmVyaW5nIHN5c3RlbSBtYWlsIGRpcmVjdG9yeS4uLiAiID4mNjsgfQotCSAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiB1c2UgLS13aXRoLW1haWxkaXI9L3BhdGgvdG8vbWFpbCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IHVzZSAtLXdpdGgtbWFpbGRpcj0vcGF0aC90by9tYWlsIiA+JjI7fQotCi0KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZmRlZiBIQVZFX1BBVEhTX0gKLSNpbmNsdWRlIDxwYXRocy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9NQUlMTE9DS19ICi0jaW5jbHVkZSA8bWFpbGxvY2suaD4KLSNlbmRpZgotI2RlZmluZSBEQVRBICJjb25mdGVzdC5tYWlsZGlyIgotCi1pbnQKLW1haW4gKCkKLXsKLQotCUZJTEUgKmZkOwotCWludCByYzsKLQotCWZkID0gZm9wZW4oREFUQSwidyIpOwotCWlmKGZkID09IE5VTEwpCi0JCWV4aXQoMSk7Ci0KLSNpZiBkZWZpbmVkIChfUEFUSF9NQUlMRElSKQotCWlmICgocmMgPSBmcHJpbnRmKGZkICwiX1BBVEhfTUFJTERJUjolc1xuIiwgX1BBVEhfTUFJTERJUikpIDwwKQotCQlleGl0KDEpOwotI2VsaWYgZGVmaW5lZCAoTUFJTERJUikKLQlpZiAoKHJjID0gZnByaW50ZihmZCAsIk1BSUxESVI6JXNcbiIsIE1BSUxESVIpKSA8MCkKLQkJZXhpdCgxKTsKLSNlbGlmIGRlZmluZWQgKF9QQVRIX01BSUwpCi0JaWYgKChyYyA9IGZwcmludGYoZmQgLCJfUEFUSF9NQUlMOiVzXG4iLCBfUEFUSF9NQUlMKSkgPDApCi0JCWV4aXQoMSk7Ci0jZWxzZQotCWV4aXQgKDIpOwotI2VuZGlmCi0KLQlleGl0KDApOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotCi0JIAkgICAgbWFpbGRpcl93aGF0PWBhd2sgLUY6ICd7cHJpbnQgJDF9JyBjb25mdGVzdC5tYWlsZGlyYAotCQkgICAgbWFpbGRpcj1gYXdrIC1GOiAne3ByaW50ICQyfScgY29uZnRlc3QubWFpbGRpciBcCi0JCQl8IHNlZCAnc3wvJHx8J2AKLQkJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBVc2luZzogJG1haWxkaXIgZnJvbSAkbWFpbGRpcl93aGF0IiA+JjUKLSRhc19lY2hvICJVc2luZzogJG1haWxkaXIgZnJvbSAkbWFpbGRpcl93aGF0IiA+JjY7IH0KLQkJICAgIGlmIHRlc3QgIngkbWFpbGRpcl93aGF0IiAhPSAieF9QQVRIX01BSUxESVIiOyB0aGVuCi0JCQljYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIE1BSUxfRElSRUNUT1JZICIkbWFpbGRpciIKLV9BQ0VPRgotCi0JCSAgICBmaQotCi1lbHNlCi0KLQkJICAgIGlmIHRlc3QgIlgkYWNfc3RhdHVzIiA9ICJYMiI7dGhlbgotIyBvdXIgdGVzdCBwcm9ncmFtIGRpZG4ndCBmaW5kIGl0LiBEZWZhdWx0IHRvIC92YXIvc3Bvb2wvbWFpbAotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IFVzaW5nOiBkZWZhdWx0IHZhbHVlIG9mIC92YXIvc3Bvb2wvbWFpbCIgPiY1Ci0kYXNfZWNobyAiVXNpbmc6IGRlZmF1bHQgdmFsdWUgb2YgL3Zhci9zcG9vbC9tYWlsIiA+JjY7IH0KLQkJCWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgTUFJTF9ESVJFQ1RPUlkgIi92YXIvc3Bvb2wvbWFpbCIKLV9BQ0VPRgotCi0JCSAgICAgZWxzZQotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICoqKiBub3QgZm91bmQgKioqIiA+JjUKLSRhc19lY2hvICIqKiogbm90IGZvdW5kICoqKiIgPiY2OyB9Ci0JCSAgICAgZmkKLQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQlmaQotCi0KLWZpCi0gIyBtYWlsZGlyCi0KLWlmIHRlc3QgISAteiAiJGNyb3NzX2NvbXBpbGluZyIgJiYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInh5ZXMiOyB0aGVuCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IERpc2FibGluZyAvZGV2L3B0bXggdGVzdCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IERpc2FibGluZyAvZGV2L3B0bXggdGVzdCIgPiYyO30KLQlkaXNhYmxlX3B0bXhfY2hlY2s9eWVzCi1maQotaWYgdGVzdCAteiAiJG5vX2Rldl9wdG14IiA7IHRoZW4KLQlpZiB0ZXN0ICJ4JGRpc2FibGVfcHRteF9jaGVjayIgIT0gInh5ZXMiIDsgdGhlbgotCQlhc19hY19GaWxlPWAkYXNfZWNobyAiYWNfY3ZfZmlsZV8iL2Rldi9wdG14IiIgfCAkYXNfdHJfc2hgCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBcIi9kZXYvcHRteFwiIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBcIi9kZXYvcHRteFwiLi4uICIgPiY2OyB9Ci1pZiBldmFsIFwkeyRhc19hY19GaWxlKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgJiYKLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjaGVjayBmb3IgZmlsZSBleGlzdGVuY2Ugd2hlbiBjcm9zcyBjb21waWxpbmciICIkTElORU5PIiA1Ci1pZiB0ZXN0IC1yICIiL2Rldi9wdG14IiI7IHRoZW4KLSAgZXZhbCAiJGFzX2FjX0ZpbGU9eWVzIgotZWxzZQotICBldmFsICIkYXNfYWNfRmlsZT1ubyIKLWZpCi1maQotZXZhbCBhY19yZXM9XCQkYXNfYWNfRmlsZQotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0ZpbGUiXCIgPSB4InllcyI7IHRoZW4gOgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ERVZfUFRNWCAxCi1fQUNFT0YKLQotCQkJCWhhdmVfZGV2X3B0bXg9MQotCi0KLWZpCi0KLQlmaQotZmkKLQotaWYgdGVzdCAhIC16ICIkY3Jvc3NfY29tcGlsaW5nIiAmJiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgIT0gInh5ZXMiOyB0aGVuCi0JYXNfYWNfRmlsZT1gJGFzX2VjaG8gImFjX2N2X2ZpbGVfIi9kZXYvcHRjIiIgfCAkYXNfdHJfc2hgCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBcIi9kZXYvcHRjXCIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFwiL2Rldi9wdGNcIi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskYXNfYWNfRmlsZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzICYmCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY2hlY2sgZm9yIGZpbGUgZXhpc3RlbmNlIHdoZW4gY3Jvc3MgY29tcGlsaW5nIiAiJExJTkVOTyIgNQotaWYgdGVzdCAtciAiIi9kZXYvcHRjIiI7IHRoZW4KLSAgZXZhbCAiJGFzX2FjX0ZpbGU9eWVzIgotZWxzZQotICBldmFsICIkYXNfYWNfRmlsZT1ubyIKLWZpCi1maQotZXZhbCBhY19yZXM9XCQkYXNfYWNfRmlsZQotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0ZpbGUiXCIgPSB4InllcyI7IHRoZW4gOgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ERVZfUFRTX0FORF9QVEMgMQotX0FDRU9GCi0KLQkJCWhhdmVfZGV2X3B0Yz0xCi0KLQotZmkKLQotZWxzZQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBEaXNhYmxpbmcgL2Rldi9wdGMgdGVzdCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjcm9zcyBjb21waWxpbmc6IERpc2FibGluZyAvZGV2L3B0YyB0ZXN0IiA+JjI7fQotZmkKLQotIyBPcHRpb25zIGZyb20gaGVyZSBvbi4gU29tZSBvZiB0aGVzZSBhcmUgcHJlc2V0IGJ5IHBsYXRmb3JtIGFib3ZlCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbWFudHlwZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbWFudHlwZStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfbWFudHlwZTsKLQkJY2FzZSAiJHdpdGh2YWwiIGluCi0JCW1hbnxjYXR8ZG9jKQotCQkJTUFOVFlQRT0kd2l0aHZhbAotCQkJOzsKLQkJKikKLQkJCWFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIG1hbiB0eXBlOiAkd2l0aHZhbCIgIiRMSU5FTk8iIDUKLQkJCTs7Ci0JCWVzYWMKLQotCi1maQotCi1pZiB0ZXN0IC16ICIkTUFOVFlQRSI7IHRoZW4KLQlUZXN0UGF0aD0iL3Vzci9iaW4ke1BBVEhfU0VQQVJBVE9SfS91c3IvdWNiIgotCWZvciBhY19wcm9nIGluIG5yb2ZmIGF3ZgotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wYXRoX05ST0ZGKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2FzZSAkTlJPRkYgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfTlJPRkY9IiROUk9GRiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFRlc3RQYXRoCi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX05ST0ZGPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotTlJPRkY9JGFjX2N2X3BhdGhfTlJPRkYKLWlmIHRlc3QgLW4gIiROUk9GRiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICROUk9GRiIgPiY1Ci0kYXNfZWNobyAiJE5ST0ZGIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJE5ST0ZGIiAmJiBicmVhawotZG9uZQotdGVzdCAtbiAiJE5ST0ZGIiB8fCBOUk9GRj0iL2Jpbi9mYWxzZSIKLQotCWlmICR7TlJPRkZ9IC1tZG9jICR7c3JjZGlyfS9zc2guMSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJTUFOVFlQRT1kb2MKLQllbGlmICR7TlJPRkZ9IC1tYW4gJHtzcmNkaXJ9L3NzaC4xID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlNQU5UWVBFPW1hbgotCWVsc2UKLQkJTUFOVFlQRT1jYXQKLQlmaQotZmkKLQotaWYgdGVzdCAiJE1BTlRZUEUiID0gImRvYyI7IHRoZW4KLQltYW5zdWJkaXI9bWFuOwotZWxzZQotCW1hbnN1YmRpcj0kTUFOVFlQRTsKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIHRvIGVuYWJsZSBNRDUgcGFzc3dvcmRzCi1NRDVfTVNHPSJubyIKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1tZDUtcGFzc3dvcmRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9tZDVfcGFzc3dvcmRzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9tZDVfcGFzc3dvcmRzOwotCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX01ENV9QQVNTV09SRFMgMSIgPj5jb25mZGVmcy5oCi0KLQkJCU1ENV9NU0c9InllcyIKLQkJZmkKLQotCi1maQotCi0KLSMgV2hldGhlciB0byBkaXNhYmxlIHNoYWRvdyBwYXNzd29yZCBzdXBwb3J0Ci0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc2hhZG93IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9zaGFkb3crc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3NoYWRvdzsKLQkJaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4bm8iIDsgdGhlbgotCQkJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9TSEFET1cgMSIgPj5jb25mZGVmcy5oCi0KLQkJCWRpc2FibGVfc2hhZG93PXllcwotCQlmaQotCi0KLWZpCi0KLQotaWYgdGVzdCAteiAiJGRpc2FibGVfc2hhZG93IiA7IHRoZW4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBzeXN0ZW1zIGhhcyBleHBpcmUgc2hhZG93IGluZm9ybWF0aW9uIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBzeXN0ZW1zIGhhcyBleHBpcmUgc2hhZG93IGluZm9ybWF0aW9uLi4uICIgPiY2OyB9Ci0JY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2hhZG93Lmg+Ci1zdHJ1Y3Qgc3B3ZCBzcDsKLQotaW50Ci1tYWluICgpCi17Ci0gc3Auc3BfZXhwaXJlID0gc3Auc3BfbHN0Y2hnID0gc3Auc3BfaW5hY3QgPSAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICBzcF9leHBpcmVfYXZhaWxhYmxlPXllcwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotCi0JaWYgdGVzdCAieCRzcF9leHBpcmVfYXZhaWxhYmxlIiA9ICJ4eWVzIiA7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFTX1NIQURPV19FWFBJUkUgMSIgPj5jb25mZGVmcy5oCi0KLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCWZpCi1maQotCi0jIFVzZSBpcCBhZGRyZXNzIGluc3RlYWQgb2YgaG9zdG5hbWUgaW4gJERJU1BMQVkKLWlmIHRlc3QgISAteiAiJElQQUREUl9JTl9ESVNQTEFZIiA7IHRoZW4KLQlESVNQTEFZX0hBQ0tfTVNHPSJ5ZXMiCi0KLSRhc19lY2hvICIjZGVmaW5lIElQQUREUl9JTl9ESVNQTEFZIDEiID4+Y29uZmRlZnMuaAotCi1lbHNlCi0JRElTUExBWV9IQUNLX01TRz0ibm8iCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaXBhZGRyLWRpc3BsYXkgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2lwYWRkcl9kaXNwbGF5K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9pcGFkZHJfZGlzcGxheTsKLQkJCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCi0JCQkJJGFzX2VjaG8gIiNkZWZpbmUgSVBBRERSX0lOX0RJU1BMQVkgMSIgPj5jb25mZGVmcy5oCi0KLQkJCQlESVNQTEFZX0hBQ0tfTVNHPSJ5ZXMiCi0JCQlmaQotCi0KLWZpCi0KLWZpCi0KLSMgY2hlY2sgZm9yIC9ldGMvZGVmYXVsdC9sb2dpbiBhbmQgdXNlIGl0IGlmIHByZXNlbnQuCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZXRjLWRlZmF1bHQtbG9naW4gd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZXRjX2RlZmF1bHRfbG9naW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9ldGNfZGVmYXVsdF9sb2dpbjsgIGlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogL2V0Yy9kZWZhdWx0L2xvZ2luIGhhbmRsaW5nIGRpc2FibGVkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IC9ldGMvZGVmYXVsdC9sb2dpbiBoYW5kbGluZyBkaXNhYmxlZCIgPiY2O30KLQkJZXRjX2RlZmF1bHRfbG9naW49bm8KLQkgIGVsc2UKLQkJZXRjX2RlZmF1bHRfbG9naW49eWVzCi0JICBmaQotZWxzZQotICAgaWYgdGVzdCAhIC16ICIkY3Jvc3NfY29tcGlsaW5nIiAmJiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieHllcyI7Ci0JICB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmcgL2V0Yy9kZWZhdWx0L2xvZ2luIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNyb3NzIGNvbXBpbGluZzogbm90IGNoZWNraW5nIC9ldGMvZGVmYXVsdC9sb2dpbiIgPiYyO30KLQkJZXRjX2RlZmF1bHRfbG9naW49bm8KLQkgIGVsc2UKLQkJZXRjX2RlZmF1bHRfbG9naW49eWVzCi0JICBmaQotCi1maQotCi0KLWlmIHRlc3QgIngkZXRjX2RlZmF1bHRfbG9naW4iICE9ICJ4bm8iOyB0aGVuCi0JYXNfYWNfRmlsZT1gJGFzX2VjaG8gImFjX2N2X2ZpbGVfIi9ldGMvZGVmYXVsdC9sb2dpbiIiIHwgJGFzX3RyX3NoYAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgXCIvZXRjL2RlZmF1bHQvbG9naW5cIiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgXCIvZXRjL2RlZmF1bHQvbG9naW5cIi4uLiAiID4mNjsgfQotaWYgZXZhbCBcJHskYXNfYWNfRmlsZSs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzICYmCi0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY2hlY2sgZm9yIGZpbGUgZXhpc3RlbmNlIHdoZW4gY3Jvc3MgY29tcGlsaW5nIiAiJExJTkVOTyIgNQotaWYgdGVzdCAtciAiIi9ldGMvZGVmYXVsdC9sb2dpbiIiOyB0aGVuCi0gIGV2YWwgIiRhc19hY19GaWxlPXllcyIKLWVsc2UKLSAgZXZhbCAiJGFzX2FjX0ZpbGU9bm8iCi1maQotZmkKLWV2YWwgYWNfcmVzPVwkJGFzX2FjX0ZpbGUKLQkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19GaWxlIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgIGV4dGVybmFsX3BhdGhfZmlsZT0vZXRjL2RlZmF1bHQvbG9naW4KLWZpCi0KLQlpZiB0ZXN0ICJ4JGV4dGVybmFsX3BhdGhfZmlsZSIgPSAieC9ldGMvZGVmYXVsdC9sb2dpbiI7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9FVENfREVGQVVMVF9MT0dJTiAxIiA+PmNvbmZkZWZzLmgKLQotCWZpCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2xvZ2luX2dldGNhcGJvb2wgPSAieWVzIiAmJiBcCi0JdGVzdCAkYWNfY3ZfaGVhZGVyX2xvZ2luX2NhcF9oID0gInllcyIgOyB0aGVuCi0JZXh0ZXJuYWxfcGF0aF9maWxlPS9ldGMvbG9naW4uY29uZgotZmkKLQotIyBXaGV0aGVyIHRvIG1lc3Mgd2l0aCB0aGUgZGVmYXVsdCBwYXRoCi1TRVJWRVJfUEFUSF9NU0c9IihkZWZhdWx0KSIKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1kZWZhdWx0LXBhdGggd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2RlZmF1bHRfcGF0aCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfZGVmYXVsdF9wYXRoOwotCQlpZiB0ZXN0ICJ4JGV4dGVybmFsX3BhdGhfZmlsZSIgPSAieC9ldGMvbG9naW4uY29uZiIgOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6Ci0tLXdpdGgtZGVmYXVsdC1wYXRoPVBBVEggaGFzIG5vIGVmZmVjdCBvbiB0aGlzIHN5c3RlbS4KLUVkaXQgL2V0Yy9sb2dpbi5jb25mIGluc3RlYWQuIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6Ci0tLXdpdGgtZGVmYXVsdC1wYXRoPVBBVEggaGFzIG5vIGVmZmVjdCBvbiB0aGlzIHN5c3RlbS4KLUVkaXQgL2V0Yy9sb2dpbi5jb25mIGluc3RlYWQuIiA+JjI7fQotCQllbGlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCi0JCQlpZiB0ZXN0ICEgLXogIiRleHRlcm5hbF9wYXRoX2ZpbGUiIDsgdGhlbgotCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzoKLS0td2l0aC1kZWZhdWx0LXBhdGg9UEFUSCB3aWxsIG9ubHkgYmUgdXNlZCBpZiBQQVRIIGlzIG5vdCBkZWZpbmVkIGluCi0kZXh0ZXJuYWxfcGF0aF9maWxlIC4iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzoKLS0td2l0aC1kZWZhdWx0LXBhdGg9UEFUSCB3aWxsIG9ubHkgYmUgdXNlZCBpZiBQQVRIIGlzIG5vdCBkZWZpbmVkIGluCi0kZXh0ZXJuYWxfcGF0aF9maWxlIC4iID4mMjt9Ci0JCQlmaQotCQkJdXNlcl9wYXRoPSIkd2l0aHZhbCIKLQkJCVNFUlZFUl9QQVRIX01TRz0iJHdpdGh2YWwiCi0JCWZpCi0KLWVsc2UKLSAgIGlmIHRlc3QgIngkZXh0ZXJuYWxfcGF0aF9maWxlIiA9ICJ4L2V0Yy9sb2dpbi5jb25mIiA7IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBNYWtlIHN1cmUgdGhlIHBhdGggdG8gc2NwIGlzIGluIC9ldGMvbG9naW4uY29uZiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBNYWtlIHN1cmUgdGhlIHBhdGggdG8gc2NwIGlzIGluIC9ldGMvbG9naW4uY29uZiIgPiYyO30KLQllbHNlCi0JCWlmIHRlc3QgISAteiAiJGV4dGVybmFsX3BhdGhfZmlsZSIgOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6Ci1JZiBQQVRIIGlzIGRlZmluZWQgaW4gJGV4dGVybmFsX3BhdGhfZmlsZSwgZW5zdXJlIHRoZSBwYXRoIHRvIHNjcCBpcyBpbmNsdWRlZCwKLW90aGVyd2lzZSBzY3Agd2lsbCBub3Qgd29yay4iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzoKLUlmIFBBVEggaXMgZGVmaW5lZCBpbiAkZXh0ZXJuYWxfcGF0aF9maWxlLCBlbnN1cmUgdGhlIHBhdGggdG8gc2NwIGlzIGluY2x1ZGVkLAotb3RoZXJ3aXNlIHNjcCB3aWxsIG5vdCB3b3JrLiIgPiYyO30KLQkJZmkKLQkJaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICAgdXNlcl9wYXRoPSIvdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbiIKLQotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIGZpbmQgb3V0IHdoYXQgU1REUEFUSCBpcyAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9QQVRIU19ICi0jIGluY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLSNpZm5kZWYgX1BBVEhfU1REUEFUSAotIyBpZmRlZiBfUEFUSF9VU0VSUEFUSAkvKiBJcml4ICovCi0jICBkZWZpbmUgX1BBVEhfU1REUEFUSCBfUEFUSF9VU0VSUEFUSAotIyBlbHNlCi0jICBkZWZpbmUgX1BBVEhfU1REUEFUSCAiL3Vzci9iaW46L2JpbjovdXNyL3NiaW46L3NiaW4iCi0jIGVuZGlmCi0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jZGVmaW5lIERBVEEgImNvbmZ0ZXN0LnN0ZHBhdGgiCi0KLWludAotbWFpbiAoKQotewotCi0JRklMRSAqZmQ7Ci0JaW50IHJjOwotCi0JZmQgPSBmb3BlbihEQVRBLCJ3Iik7Ci0JaWYoZmQgPT0gTlVMTCkKLQkJZXhpdCgxKTsKLQotCWlmICgocmMgPSBmcHJpbnRmKGZkLCIlcyIsIF9QQVRIX1NURFBBVEgpKSA8IDApCi0JCWV4aXQoMSk7Ci0KLQlleGl0KDApOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICAgdXNlcl9wYXRoPWBjYXQgY29uZnRlc3Quc3RkcGF0aGAKLWVsc2UKLSAgIHVzZXJfcGF0aD0iL3Vzci9iaW46L2JpbjovdXNyL3NiaW46L3NiaW4iCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQotIyBtYWtlIHN1cmUgJGJpbmRpciBpcyBpbiBVU0VSX1BBVEggc28gc2NwIHdpbGwgd29yawotCQl0X2JpbmRpcj1gZXZhbCBlY2hvICR7YmluZGlyfWAKLQkJY2FzZSAkdF9iaW5kaXIgaW4KLQkJCU5PTkUvKikgdF9iaW5kaXI9YGVjaG8gJHRfYmluZGlyIHwgc2VkICJzfk5PTkV+JHByZWZpeH4iYCA7OwotCQllc2FjCi0JCWNhc2UgJHRfYmluZGlyIGluCi0JCQlOT05FLyopIHRfYmluZGlyPWBlY2hvICR0X2JpbmRpciB8IHNlZCAic35OT05FfiRhY19kZWZhdWx0X3ByZWZpeH4iYCA7OwotCQllc2FjCi0JCWVjaG8gJHVzZXJfcGF0aCB8IGdyZXAgIjokdF9iaW5kaXIiICA+IC9kZXYvbnVsbCAyPiYxCi0JCWlmIHRlc3QgJD8gLW5lIDAgIDsgdGhlbgotCQkJZWNobyAkdXNlcl9wYXRoIHwgZ3JlcCAiXiR0X2JpbmRpciIgID4gL2Rldi9udWxsIDI+JjEKLQkJCWlmIHRlc3QgJD8gLW5lIDAgIDsgdGhlbgotCQkJCXVzZXJfcGF0aD0kdXNlcl9wYXRoOiR0X2JpbmRpcgotCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBBZGRpbmcgJHRfYmluZGlyIHRvIFVTRVJfUEFUSCBzbyBzY3Agd2lsbCB3b3JrIiA+JjUKLSRhc19lY2hvICJBZGRpbmcgJHRfYmluZGlyIHRvIFVTRVJfUEFUSCBzbyBzY3Agd2lsbCB3b3JrIiA+JjY7IH0KLQkJCWZpCi0JCWZpCi0JZmkKLQotZmkKLQotaWYgdGVzdCAieCRleHRlcm5hbF9wYXRoX2ZpbGUiICE9ICJ4L2V0Yy9sb2dpbi5jb25mIiA7IHRoZW4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBVU0VSX1BBVEggIiR1c2VyX3BhdGgiCi1fQUNFT0YKLQotCi1maQotCi0jIFNldCBzdXBlcnVzZXIgcGF0aCBzZXBhcmF0ZWx5IHRvIHVzZXIgcGF0aAotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXN1cGVydXNlci1wYXRoIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9zdXBlcnVzZXJfcGF0aCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfc3VwZXJ1c2VyX3BhdGg7Ci0JCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCi0JCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgU1VQRVJVU0VSX1BBVEggIiR3aXRodmFsIgotX0FDRU9GCi0KLQkJCXN1cGVydXNlcl9wYXRoPSR3aXRodmFsCi0JCWZpCi0KLQotZmkKLQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgd2UgbmVlZCB0byBjb252ZXJ0IElQdjQgaW4gSVB2Ni1tYXBwZWQgYWRkcmVzc2VzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHdlIG5lZWQgdG8gY29udmVydCBJUHY0IGluIElQdjYtbWFwcGVkIGFkZHJlc3Nlcy4uLiAiID4mNjsgfQotSVBWNF9JTjZfSEFDS19NU0c9Im5vIgotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLTRpbjYgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoXzRpbjYrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoXzRpbjY7Ci0JCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotCi0kYXNfZWNobyAiI2RlZmluZSBJUFY0X0lOX0lQVjYgMSIgPj5jb25mZGVmcy5oCi0KLQkJCUlQVjRfSU42X0hBQ0tfTVNHPSJ5ZXMiCi0JCWVsc2UKLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQlmaQotCi1lbHNlCi0KLQkJaWYgdGVzdCAieCRpbmV0Nl9kZWZhdWx0XzRpbjYiID0gInh5ZXMiOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIChkZWZhdWx0KSIgPiY1Ci0kYXNfZWNobyAieWVzIChkZWZhdWx0KSIgPiY2OyB9Ci0JCQkkYXNfZWNobyAiI2RlZmluZSBJUFY0X0lOX0lQVjYgMSIgPj5jb25mZGVmcy5oCi0KLQkJCUlQVjRfSU42X0hBQ0tfTVNHPSJ5ZXMiCi0JCWVsc2UKLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyAoZGVmYXVsdCkiID4mNQotJGFzX2VjaG8gIm5vIChkZWZhdWx0KSIgPiY2OyB9Ci0JCWZpCi0KLQotZmkKLQotCi0jIFdoZXRoZXIgdG8gZW5hYmxlIEJTRCBhdXRoIHN1cHBvcnQKLUJTRF9BVVRIX01TRz1ubwotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWJzZC1hdXRoIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9ic2RfYXV0aCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfYnNkX2F1dGg7Ci0JCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEJTRF9BVVRIIDEiID4+Y29uZmRlZnMuaAotCi0JCQlCU0RfQVVUSF9NU0c9eWVzCi0JCWZpCi0KLQotZmkKLQotCi0jIFdoZXJlIHRvIHBsYWNlIHNzaGQucGlkCi1waWRkaXI9L3Zhci9ydW4KLSMgbWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzCi1pZiB0ZXN0ICEgLWQgJHBpZGRpciA7IHRoZW4KLQlwaWRkaXI9YGV2YWwgZWNobyAke3N5c2NvbmZkaXJ9YAotCWNhc2UgJHBpZGRpciBpbgotCQlOT05FLyopIHBpZGRpcj1gZWNobyAkcGlkZGlyIHwgc2VkICJzfk5PTkV+JGFjX2RlZmF1bHRfcHJlZml4fiJgIDs7Ci0JZXNhYwotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXBpZC1kaXIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3BpZF9kaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3BpZF9kaXI7Ci0JCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCi0JCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0JCQlwaWRkaXI9JHdpdGh2YWwKLQkJCWlmIHRlc3QgISAtZCAkcGlkZGlyIDsgdGhlbgotCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAqKiBubyAkcGlkZGlyIGRpcmVjdG9yeSBvbiB0aGlzIHN5c3RlbSAqKiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAqKiBubyAkcGlkZGlyIGRpcmVjdG9yeSBvbiB0aGlzIHN5c3RlbSAqKiIgPiYyO30KLQkJCWZpCi0JCWZpCi0KLQotZmkKLQotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgX1BBVEhfU1NIX1BJRERJUiAiJHBpZGRpciIKLV9BQ0VPRgotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxhc3Rsb2cgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGFzdGxvZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX2xhc3Rsb2c7Ci0JCWlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iIDsgdGhlbgotCQkJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9MQVNUTE9HIDEiID4+Y29uZmRlZnMuaAotCi0JCWZpCi0KLQotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXV0bXAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfdXRtcCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX3V0bXA7Ci0JCWlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iIDsgdGhlbgotCQkJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9VVE1QIDEiID4+Y29uZmRlZnMuaAotCi0JCWZpCi0KLQotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXV0bXB4IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3V0bXB4K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfdXRtcHg7Ci0JCWlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX1VUTVBYIDEiID4+Y29uZmRlZnMuaAotCi0JCWZpCi0KLQotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXd0bXAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfd3RtcCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX3d0bXA7Ci0JCWlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iIDsgdGhlbgotCQkJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9XVE1QIDEiID4+Y29uZmRlZnMuaAotCi0JCWZpCi0KLQotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXd0bXB4IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3d0bXB4K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfd3RtcHg7Ci0JCWlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iIDsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX1dUTVBYIDEiID4+Y29uZmRlZnMuaAotCi0JCWZpCi0KLQotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnV0aWwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidXRpbCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX2xpYnV0aWw7Ci0JCWlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iIDsgdGhlbgotCQkJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9MT0dJTiAxIiA+PmNvbmZkZWZzLmgKLQotCQlmaQotCi0KLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1wdXR1dGxpbmUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfcHV0dXRsaW5lK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfcHV0dXRsaW5lOwotCQlpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSAieG5vIiA7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9QVVRVVExJTkUgMSIgPj5jb25mZGVmcy5oCi0KLQkJZmkKLQotCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcHV0dXR4bGluZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9wdXR1dHhsaW5lK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfcHV0dXR4bGluZTsKLQkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfUFVUVVRYTElORSAxIiA+PmNvbmZkZWZzLmgKLQotCQlmaQotCi0KLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1sYXN0bG9nIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9sYXN0bG9nK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9sYXN0bG9nOwotCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyIgOyB0aGVuCi0JCQkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX0xBU1RMT0cgMSIgPj5jb25mZGVmcy5oCi0KLQkJZWxpZiB0ZXN0IC1uICIkd2l0aHZhbCIgICYmICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0JCQljb25mX2xhc3Rsb2dfbG9jYXRpb249JHdpdGh2YWwKLQkJZmkKLQotCi1maQotCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB5b3VyIHN5c3RlbSBkZWZpbmVzIExBU1RMT0dfRklMRSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB5b3VyIHN5c3RlbSBkZWZpbmVzIExBU1RMT0dfRklMRS4uLiAiID4mNjsgfQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRtcC5oPgotI2lmZGVmIEhBVkVfTEFTVExPR19ICi0jICBpbmNsdWRlIDxsYXN0bG9nLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1BBVEhTX0gKLSMgIGluY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0xPR0lOX0gKLSMgaW5jbHVkZSA8bG9naW4uaD4KLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLSBjaGFyICpsYXN0bG9nID0gTEFTVExPR19GSUxFOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHlvdXIgc3lzdGVtIGRlZmluZXMgX1BBVEhfTEFTVExPRyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB5b3VyIHN5c3RlbSBkZWZpbmVzIF9QQVRIX0xBU1RMT0cuLi4gIiA+JjY7IH0KLQkJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRtcC5oPgotI2lmZGVmIEhBVkVfTEFTVExPR19ICi0jICBpbmNsdWRlIDxsYXN0bG9nLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1BBVEhTX0gKLSMgIGluY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci0gY2hhciAqbGFzdGxvZyA9IF9QQVRIX0xBU1RMT0c7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1lbHNlCi0KLQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQkJc3lzdGVtX2xhc3Rsb2dfcGF0aD1ubwotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotaWYgdGVzdCAteiAiJGNvbmZfbGFzdGxvZ19sb2NhdGlvbiI7IHRoZW4KLQlpZiB0ZXN0IHgiJHN5c3RlbV9sYXN0bG9nX3BhdGgiID0geCJubyIgOyB0aGVuCi0JCWZvciBmIGluIC92YXIvbG9nL2xhc3Rsb2cgL3Vzci9hZG0vbGFzdGxvZyAvdmFyL2FkbS9sYXN0bG9nIC9ldGMvc2VjdXJpdHkvbGFzdGxvZyA7IGRvCi0JCQkJaWYgKHRlc3QgLWQgIiRmIiB8fCB0ZXN0IC1mICIkZiIpIDsgdGhlbgotCQkJCQljb25mX2xhc3Rsb2dfbG9jYXRpb249JGYKLQkJCQlmaQotCQlkb25lCi0JCWlmIHRlc3QgLXogIiRjb25mX2xhc3Rsb2dfbG9jYXRpb24iOyB0aGVuCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICoqIENhbm5vdCBmaW5kIGxhc3Rsb2cgKioiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogKiogQ2Fubm90IGZpbmQgbGFzdGxvZyAqKiIgPiYyO30KLQkJCQkJZmkKLQlmaQotZmkKLQotaWYgdGVzdCAtbiAiJGNvbmZfbGFzdGxvZ19sb2NhdGlvbiI7IHRoZW4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBDT05GX0xBU1RMT0dfRklMRSAiJGNvbmZfbGFzdGxvZ19sb2NhdGlvbiIKLV9BQ0VPRgotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHlvdXIgc3lzdGVtIGRlZmluZXMgVVRNUF9GSUxFIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHlvdXIgc3lzdGVtIGRlZmluZXMgVVRNUF9GSUxFLi4uICIgPiY2OyB9Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dG1wLmg+Ci0jaWZkZWYgSEFWRV9QQVRIU19ICi0jICBpbmNsdWRlIDxwYXRocy5oPgotI2VuZGlmCi0KLWludAotbWFpbiAoKQotewotIGNoYXIgKnV0bXAgPSBVVE1QX0ZJTEU7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1lbHNlCi0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLQkgIHN5c3RlbV91dG1wX3BhdGg9bm8KLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAteiAiJGNvbmZfdXRtcF9sb2NhdGlvbiI7IHRoZW4KLQlpZiB0ZXN0IHgiJHN5c3RlbV91dG1wX3BhdGgiID0geCJubyIgOyB0aGVuCi0JCWZvciBmIGluIC9ldGMvdXRtcCAvdXNyL2FkbS91dG1wIC92YXIvcnVuL3V0bXA7IGRvCi0JCQlpZiB0ZXN0IC1mICRmIDsgdGhlbgotCQkJCWNvbmZfdXRtcF9sb2NhdGlvbj0kZgotCQkJZmkKLQkJZG9uZQotCQlpZiB0ZXN0IC16ICIkY29uZl91dG1wX2xvY2F0aW9uIjsgdGhlbgotCQkJJGFzX2VjaG8gIiNkZWZpbmUgRElTQUJMRV9VVE1QIDEiID4+Y29uZmRlZnMuaAotCi0JCWZpCi0JZmkKLWZpCi1pZiB0ZXN0IC1uICIkY29uZl91dG1wX2xvY2F0aW9uIjsgdGhlbgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIENPTkZfVVRNUF9GSUxFICIkY29uZl91dG1wX2xvY2F0aW9uIgotX0FDRU9GCi0KLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBXVE1QX0ZJTEUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBXVE1QX0ZJTEUuLi4gIiA+JjY7IH0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0bXAuaD4KLSNpZmRlZiBIQVZFX1BBVEhTX0gKLSMgIGluY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci0gY2hhciAqd3RtcCA9IFdUTVBfRklMRTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWVsc2UKLSAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCSAgc3lzdGVtX3d0bXBfcGF0aD1ubwotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0IC16ICIkY29uZl93dG1wX2xvY2F0aW9uIjsgdGhlbgotCWlmIHRlc3QgeCIkc3lzdGVtX3d0bXBfcGF0aCIgPSB4Im5vIiA7IHRoZW4KLQkJZm9yIGYgaW4gL3Vzci9hZG0vd3RtcCAvdmFyL2xvZy93dG1wOyBkbwotCQkJaWYgdGVzdCAtZiAkZiA7IHRoZW4KLQkJCQljb25mX3d0bXBfbG9jYXRpb249JGYKLQkJCWZpCi0JCWRvbmUKLQkJaWYgdGVzdCAteiAiJGNvbmZfd3RtcF9sb2NhdGlvbiI7IHRoZW4KLQkJCSRhc19lY2hvICIjZGVmaW5lIERJU0FCTEVfV1RNUCAxIiA+PmNvbmZkZWZzLmgKLQotCQlmaQotCWZpCi1maQotaWYgdGVzdCAtbiAiJGNvbmZfd3RtcF9sb2NhdGlvbiI7IHRoZW4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBDT05GX1dUTVBfRklMRSAiJGNvbmZfd3RtcF9sb2NhdGlvbiIKLV9BQ0VPRgotCi1maQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBXVE1QWF9GSUxFIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHlvdXIgc3lzdGVtIGRlZmluZXMgV1RNUFhfRklMRS4uLiAiID4mNjsgfQotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRtcC5oPgotI2lmZGVmIEhBVkVfVVRNUFhfSAotI2luY2x1ZGUgPHV0bXB4Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1BBVEhTX0gKLSMgIGluY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci0gY2hhciAqd3RtcHggPSBXVE1QWF9GSUxFOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0JICBzeXN0ZW1fd3RtcHhfcGF0aD1ubwotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0IC16ICIkY29uZl93dG1weF9sb2NhdGlvbiI7IHRoZW4KLQlpZiB0ZXN0IHgiJHN5c3RlbV93dG1weF9wYXRoIiA9IHgibm8iIDsgdGhlbgotCQkkYXNfZWNobyAiI2RlZmluZSBESVNBQkxFX1dUTVBYIDEiID4+Y29uZmRlZnMuaAotCi0JZmkKLWVsc2UKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBDT05GX1dUTVBYX0ZJTEUgIiRjb25mX3d0bXB4X2xvY2F0aW9uIgotX0FDRU9GCi0KLWZpCi0KLQotaWYgdGVzdCAhIC16ICIkYmxpYnBhdGgiIDsgdGhlbgotCUxERkxBR1M9IiRMREZMQUdTICRibGliZmxhZ3MkYmxpYnBhdGgiCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBQbGVhc2UgY2hlY2sgYW5kIGVkaXQgYmxpYnBhdGggaW4gTERGTEFHUyBpbiBNYWtlZmlsZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBQbGVhc2UgY2hlY2sgYW5kIGVkaXQgYmxpYnBhdGggaW4gTERGTEFHUyBpbiBNYWtlZmlsZSIgPiYyO30KLWZpCi0KLUNGTEFHUz0iJENGTEFHUyAkd2Vycm9yX2ZsYWdzIgotCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0YWRkcmluZm8iICE9ICJ4eWVzIiA7IHRoZW4KLQlURVNUX1NTSF9JUFY2PW5vCi1lbHNlCi0JVEVTVF9TU0hfSVBWNj15ZXMKLWZpCi1hY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJCUk9LRU5fR0VUQUREUklORk8iICJhY19jdl9oYXZlX2RlY2xfQlJPS0VOX0dFVEFERFJJTkZPIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9CUk9LRU5fR0VUQUREUklORk8iID0geHllczsgdGhlbiA6Ci0gIFRFU1RfU1NIX0lQVjY9bm8KLWZpCi0KLVRFU1RfU1NIX0lQVjY9JFRFU1RfU1NIX0lQVjYKLQotCi0KLWFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlZmlsZSBidWlsZHBrZy5zaCBvcGVuc3NoZC5pbml0IG9wZW5zc2gueG1sIG9wZW5ic2QtY29tcGF0L01ha2VmaWxlIG9wZW5ic2QtY29tcGF0L3JlZ3Jlc3MvTWFrZWZpbGUgc3VydmV5LnNoIgotCi1jYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLCBzZWUgY29uZmlndXJlJ3Mgb3B0aW9uIC0tY29uZmlnLWNhY2hlLgotIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAotIyB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdAotIyB0aGUgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi0jIGBhY19jdl9lbnZfZm9vJyB2YXJpYWJsZXMgKHNldCBvciB1bnNldCkgd2lsbCBiZSBvdmVycmlkZGVuIHdoZW4KLSMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKLSMgZm9sbG93aW5nIHZhbHVlcy4KLQotX0FDRU9GCi0KLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgd2Uga2lsbCB2YXJpYWJsZXMgY29udGFpbmluZyBuZXdsaW5lcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLSgKLSAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdgOyBkbwotICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAotICAgICoke2FzX25sfSopCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKLSAgICAgIGVzYWMKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAotICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKLSAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7Ci0gICAgICBlc2FjIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzOiBkb3VibGUtcXVvdGUKLSAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwuCi0gICAgICBzZWQgLW4gXAotCSJzLycvJ1xcXFwnJy9nOwotCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgotICAgICAgOzsgIygKLSAgICAqKQotICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICAgIHNlZCAtbiAiL15bXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSo9L3AiCi0gICAgICA7OwotICAgIGVzYWMgfAotICAgIHNvcnQKLSkgfAotICBzZWQgJwotICAgICAvXmFjX2N2X2Vudl8vYiBlbmQKLSAgICAgdCBjbGVhcgotICAgICA6Y2xlYXIKLSAgICAgcy9eXChbXj1dKlwpPVwoLipbe31dLipcKSQvdGVzdCAiJHtcMStzZXR9IiA9IHNldCB8fCAmLwotICAgICB0IGVuZAotICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KLSAgICAgOmVuZCcgPj5jb25mY2FjaGUKLWlmIGRpZmYgIiRjYWNoZV9maWxlIiBjb25mY2FjaGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKLSAgaWYgdGVzdCAtdyAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRjYWNoZV9maWxlIiAhPSAieC9kZXYvbnVsbCI7IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gICAgICBpZiB0ZXN0ICEgLWYgIiRjYWNoZV9maWxlIiB8fCB0ZXN0IC1oICIkY2FjaGVfZmlsZSI7IHRoZW4KLQljYXQgY29uZmNhY2hlID4iJGNhY2hlX2ZpbGUiCi0gICAgICBlbHNlCi0gICAgICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4gIygKLSAgICAgICAgKi8qIHwgPzoqKQotCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIkJCAmJgotCSAgbXYgLWYgIiRjYWNoZV9maWxlIiQkICIkY2FjaGVfZmlsZSIgOzsgIygKLSAgICAgICAgKikKLQkgIG12IC1mIGNvbmZjYWNoZSAiJGNhY2hlX2ZpbGUiIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLWFjX2xpYm9ianM9Ci1hY19sdGxpYm9ianM9Ci1VPQotZm9yIGFjX2kgaW4gOiAkTElCT0JKUzsgZG8gdGVzdCAieCRhY19pIiA9IHg6ICYmIGNvbnRpbnVlCi0gICMgMS4gUmVtb3ZlIHRoZSBleHRlbnNpb24sIGFuZCAkVSBpZiBhbHJlYWR5IGluc3RhbGxlZC4KLSAgYWNfc2NyaXB0PSdzL1wkVVwuLy4vO3MvXC5vJC8vO3MvXC5vYmokLy8nCi0gIGFjX2k9YCRhc19lY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAotICAjIDIuIFByZXBlbmQgTElCT0JKRElSLiAgV2hlbiB1c2VkIHdpdGggYXV0b21ha2U+PTEuMTAgTElCT0JKRElSCi0gICMgICAgd2lsbCBiZSBzZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBMSUJPQkpTIG9iamVjdHMgYXJlIGJ1aWx0LgotICBhc19mbl9hcHBlbmQgYWNfbGlib2JqcyAiIFwke0xJQk9CSkRJUn0kYWNfaVwkVS4kYWNfb2JqZXh0IgotICBhc19mbl9hcHBlbmQgYWNfbHRsaWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pIickVS5sbycKLWRvbmUKLUxJQk9CSlM9JGFjX2xpYm9ianMKLQotTFRMSUJPQkpTPSRhY19sdGxpYm9ianMKLQotCi0KLQotOiAiJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30iCi1hY193cml0ZV9mYWlsPTAKLWFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KLWFzX3dyaXRlX2ZhaWw9MAotY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKLSMhICRTSEVMTAotIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWRlYnVnPWZhbHNlCi1hY19jc19yZWNoZWNrPWZhbHNlCi1hY19jc19zaWxlbnQ9ZmFsc2UKLQotU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KLWV4cG9ydCBTSEVMTAotX0FTRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0KLSMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQotRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gIygKLSAgKnBvc2l4KikgOgotICAgIHNldCAtbyBwb3NpeCA7OyAjKAotICAqKSA6Ci0gICAgIDs7Ci1lc2FjCi1maQotCi0KLWFzX25sPScKLScKLWV4cG9ydCBhc19ubAotIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KLWFzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCi1hc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KLWFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCi0jIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKLSMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCi1pZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCi0gICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19lY2hvPSdwcmludCAtciAtLScKLSAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCi1lbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2VjaG89J3ByaW50ZiAlc1xuJwotICBhc19lY2hvX249J3ByaW50ZiAlcycKLWVsc2UKLSAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCi0gICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKLSAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCi0gIGVsc2UKLSAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJwotICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCi0gICAgICBhcmc9JDE7Ci0gICAgICBjYXNlICRhcmcgaW4gIygKLSAgICAgICoiJGFzX25sIiopCi0JZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7Ci0JYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKLSAgICAgIGVzYWM7Ci0gICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCi0gICAgJwotICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQotICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCi0gIGZpCi0gIGV4cG9ydCBhc19lY2hvX2JvZHkKLSAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJwotZmkKLQotIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCi1pZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgotICBQQVRIX1NFUEFSQVRPUj06Ci0gIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKLSAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAotICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCi0gIH0KLWZpCi0KLQotIyBJRlMKLSMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCi0jIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KLSMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAotIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQotSUZTPSIgIiIJJGFzX25sIgotCi0jIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgotYXNfbXlzZWxmPQotY2FzZSAkMCBpbiAjKCgKLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gICAgIDs7Ci1lc2FjCi0jIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCi0jIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLWlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KLSAgYXNfbXlzZWxmPSQwCi1maQotaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgotICBleGl0IDEKLWZpCi0KLSMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KLSMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKLSMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKLSMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCi1mb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICi1kbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAotICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKLWRvbmUKLVBTMT0nJCAnCi1QUzI9Jz4gJwotUFM0PScrICcKLQotIyBOTFMgbnVpc2FuY2VzLgotTENfQUxMPUMKLWV4cG9ydCBMQ19BTEwKLUxBTkdVQUdFPUMKLWV4cG9ydCBMQU5HVUFHRQotCi0jIENEUEFUSC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotCi0jIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKLSMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQotIyBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KLWFzX2ZuX2Vycm9yICgpCi17Ci0gIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCi0gIGlmIHRlc3QgIiQ0IjsgdGhlbgotICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKLSAgZmkKLSAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKLSAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCi19ICMgYXNfZm5fZXJyb3IKLQotCi0jIGFzX2ZuX3NldF9zdGF0dXMgU1RBVFVTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNldCAkPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy4KLWFzX2ZuX3NldF9zdGF0dXMgKCkKLXsKLSAgcmV0dXJuICQxCi19ICMgYXNfZm5fc2V0X3N0YXR1cwotCi0jIGFzX2ZuX2V4aXQgU1RBVFVTCi0jIC0tLS0tLS0tLS0tLS0tLS0tCi0jIEV4aXQgdGhlIHNoZWxsIHdpdGggU1RBVFVTLCBldmVuIGluIGEgInRyYXAgMCIgb3IgInNldCAtZSIgY29udGV4dC4KLWFzX2ZuX2V4aXQgKCkKLXsKLSAgc2V0ICtlCi0gIGFzX2ZuX3NldF9zdGF0dXMgJDEKLSAgZXhpdCAkMQotfSAjIGFzX2ZuX2V4aXQKLQotIyBhc19mbl91bnNldCBWQVIKLSMgLS0tLS0tLS0tLS0tLS0tCi0jIFBvcnRhYmx5IHVuc2V0IFZBUi4KLWFzX2ZuX3Vuc2V0ICgpCi17Ci0gIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KLX0KLWFzX3Vuc2V0PWFzX2ZuX3Vuc2V0Ci0jIGFzX2ZuX2FwcGVuZCBWQVIgVkFMVUUKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4gVkFSLiBUYWtlCi0jIGFkdmFudGFnZSBvZiBhbnkgc2hlbGwgb3B0aW1pemF0aW9ucyB0aGF0IGFsbG93IGFtb3J0aXplZCBsaW5lYXIgZ3Jvd3RoIG92ZXIKLSMgcmVwZWF0ZWQgYXBwZW5kcywgaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCBxdWFkcmF0aWMgZ3Jvd3RoIHByZXNlbnQgaW4gbmFpdmUKLSMgaW1wbGVtZW50YXRpb25zLgotaWYgKGV2YWwgImFzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeFwkYXNfdmFyID0geDEyIikgMj4vZGV2L251bGw7IHRoZW4gOgotICBldmFsICdhc19mbl9hcHBlbmQgKCkKLSAgewotICAgIGV2YWwgJDErPVwkMgotICB9JwotZWxzZQotICBhc19mbl9hcHBlbmQgKCkKLSAgewotICAgIGV2YWwgJDE9XCQkMVwkMgotICB9Ci1maSAjIGFzX2ZuX2FwcGVuZAotCi0jIGFzX2ZuX2FyaXRoIEFSRy4uLgotIyAtLS0tLS0tLS0tLS0tLS0tLS0KLSMgUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZQotIyBnbG9iYWwgJGFzX3ZhbC4gVGFrZSBhZHZhbnRhZ2Ugb2Ygc2hlbGxzIHRoYXQgY2FuIGF2b2lkIGZvcmtzLiBUaGUgYXJndW1lbnRzCi0jIG11c3QgYmUgcG9ydGFibGUgYWNyb3NzICQoKCkpIGFuZCBleHByLgotaWYgKGV2YWwgInRlc3QgXCQoKCAxICsgMSApKSA9IDIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGV2YWwgJ2FzX2ZuX2FyaXRoICgpCi0gIHsKLSAgICBhc192YWw9JCgoICQqICkpCi0gIH0nCi1lbHNlCi0gIGFzX2ZuX2FyaXRoICgpCi0gIHsKLSAgICBhc192YWw9YGV4cHIgIiRAIiB8fCB0ZXN0ICQ/IC1lcSAxYAotICB9Ci1maSAjIGFzX2ZuX2FyaXRoCi0KLQotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi1pZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfZGlybmFtZT1kaXJuYW1lCi1lbHNlCi0gIGFzX2Rpcm5hbWU9ZmFsc2UKLWZpCi0KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0kYXNfZWNobyBYLyIkMCIgfAotICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLQotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLUVDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Ci1jYXNlIGBlY2hvIC1uIHhgIGluICMoKCgoKAotLW4qKQotICBjYXNlIGBlY2hvICd4eVxjJ2AgaW4KLSAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCi0gIHh5KSAgRUNIT19DPSdcYyc7OwotICAqKSAgIGVjaG8gYGVjaG8ga3NoODggYnVnIG9uIEFJWCA2LjFgID4gL2Rldi9udWxsCi0gICAgICAgRUNIT19UPScJJzs7Ci0gIGVzYWM7OwotKikKLSAgRUNIT19OPSctbic7OwotZXNhYwotCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQotaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCi0gIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLWVsc2UKLSAgcm0gLWYgY29uZiQkLmRpcgotICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi1maQotaWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgotICBpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhc19sbl9zPSdsbiAtcycKLSAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCi0gICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KLSAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8Ci0gICAgICBhc19sbl9zPSdjcCAtcCcKLSAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhc19sbl9zPWxuCi0gIGVsc2UKLSAgICBhc19sbl9zPSdjcCAtcCcKLSAgZmkKLWVsc2UKLSAgYXNfbG5fcz0nY3AgLXAnCi1maQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQotcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAotCi0KLSMgYXNfZm5fbWtkaXJfcAotIyAtLS0tLS0tLS0tLS0tCi0jIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KLWFzX2ZuX21rZGlyX3AgKCkKLXsKLQotICBjYXNlICRhc19kaXIgaW4gIygKLSAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OwotICBlc2FjCi0gIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgewotICAgIGFzX2RpcnM9Ci0gICAgd2hpbGUgOjsgZG8KLSAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAotICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCi0gICAgICAqKSBhc19xZGlyPSRhc19kaXI7OwotICAgICAgZXNhYwotICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKLSAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8Ci0kYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotJGFzX2VjaG8gWCIkYXNfZGlyIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCi0gICAgZG9uZQotICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKLSAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKLQotCi19ICMgYXNfZm5fbWtkaXJfcAotaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCi1lbHNlCi0gIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCi0gIGFzX21rZGlyX3A9ZmFsc2UKLWZpCi0KLWlmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYXNfdGVzdF94PSd0ZXN0IC14JwotZWxzZQotICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBhc19sc19MX29wdGlvbj1MCi0gIGVsc2UKLSAgICBhc19sc19MX29wdGlvbj0KLSAgZmkKLSAgYXNfdGVzdF94PScKLSAgICBldmFsIHNoIC1jICdcJycKLSAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgotCXRlc3QgLWQgIiQxLy4iOwotICAgICAgZWxzZQotCWNhc2UgJDEgaW4gIygKLQktKilzZXQgIi4vJDEiOzsKLQllc2FjOwotCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluICMoKAotCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKLSAgICAnXCcnIHNoCi0gICcKLWZpCi1hc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCi1hc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotCi0jIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KLWFzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLQotZXhlYyA2PiYxCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTWFpbiBib2R5IG9mICRDT05GSUdfU1RBVFVTIHNjcmlwdC4gIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi1fQVNFT0YKLXRlc3QgJGFzX3dyaXRlX2ZhaWwgPSAwICYmIGNobW9kICt4ICRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi0jIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICQwIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KLSMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgotIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KLWFjX2xvZz0iCi1UaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5IE9wZW5TU0ggJGFzX21lIFBvcnRhYmxlLCB3aGljaCB3YXMKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OC4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwotCi0gIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKLSAgQ09ORklHX0hFQURFUlMgID0gJENPTkZJR19IRUFERVJTCi0gIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKLSAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUwotICAkICQwICRACi0KLW9uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotIgotCi1fQUNFT0YKLQotY2FzZSAkYWNfY29uZmlnX2ZpbGVzIGluICoiCi0iKikgc2V0IHggJGFjX2NvbmZpZ19maWxlczsgc2hpZnQ7IGFjX2NvbmZpZ19maWxlcz0kKjs7Ci1lc2FjCi0KLWNhc2UgJGFjX2NvbmZpZ19oZWFkZXJzIGluICoiCi0iKikgc2V0IHggJGFjX2NvbmZpZ19oZWFkZXJzOyBzaGlmdDsgYWNfY29uZmlnX2hlYWRlcnM9JCo7OwotZXNhYwotCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgotY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgotY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLWFjX2NzX3VzYWdlPSJcCi1cYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGFjdGlvbnMKLWZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiAgVW5sZXNzIHRoZSBmaWxlcwotYW5kIGFjdGlvbnMgYXJlIHNwZWNpZmllZCBhcyBUQUdzLCBhbGwgYXJlIGluc3RhbnRpYXRlZCBieSBkZWZhdWx0LgotCi1Vc2FnZTogJDAgW09QVElPTl0uLi4gW1RBR10uLi4KLQotICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAotICAgICAgLS1jb25maWcgICAgIHByaW50IGNvbmZpZ3VyYXRpb24sIHRoZW4gZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQKLSAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCi0gICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKLSAgICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KLSAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKLSAgICAgIC0taGVhZGVyPUZJTEVbOlRFTVBMQVRFXQotICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCi0KLUNvbmZpZ3VyYXRpb24gZmlsZXM6Ci0kY29uZmlnX2ZpbGVzCi0KLUNvbmZpZ3VyYXRpb24gaGVhZGVyczoKLSRjb25maWdfaGVhZGVycwotCi1SZXBvcnQgYnVncyB0byA8b3BlbnNzaC11bml4LWRldkBtaW5kcm90Lm9yZz4uIgotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotYWNfY3NfY29uZmlnPSJgJGFzX2VjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYCIKLWFjX2NzX3ZlcnNpb249IlxcCi1PcGVuU1NIIGNvbmZpZy5zdGF0dXMgUG9ydGFibGUKLWNvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OCwKLSAgd2l0aCBvcHRpb25zIFxcIlwkYWNfY3NfY29uZmlnXFwiCi0KLUNvcHlyaWdodCAoQykgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKLQotYWNfcHdkPSckYWNfcHdkJwotc3JjZGlyPSckc3JjZGlyJwotSU5TVEFMTD0nJElOU1RBTEwnCi1BV0s9JyRBV0snCi10ZXN0IC1uICJcJEFXSyIgfHwgQVdLPWF3awotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLSMgVGhlIGRlZmF1bHQgbGlzdHMgYXBwbHkgaWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhbnkgZmlsZS4KLWFjX25lZWRfZGVmYXVsdHM9Ogotd2hpbGUgdGVzdCAkIyAhPSAwCi1kbwotICBjYXNlICQxIGluCi0gIC0tKj0/KikKLSAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAotICAgIGFjX29wdGFyZz1gZXhwciAiWCQxIiA6ICdYW149XSo9XCguKlwpJ2AKLSAgICBhY19zaGlmdD06Ci0gICAgOzsKLSAgLS0qPSkKLSAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAotICAgIGFjX29wdGFyZz0KLSAgICBhY19zaGlmdD06Ci0gICAgOzsKLSAgKikKLSAgICBhY19vcHRpb249JDEKLSAgICBhY19vcHRhcmc9JDIKLSAgICBhY19zaGlmdD1zaGlmdAotICAgIDs7Ci0gIGVzYWMKLQotICBjYXNlICRhY19vcHRpb24gaW4KLSAgIyBIYW5kbGluZyBvZiB0aGUgb3B0aW9ucy4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgYWNfY3NfcmVjaGVjaz06IDs7Ci0gIC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdiB8IC1WICkKLSAgICAkYXNfZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7Ci0gIC0tY29uZmlnIHwgLS1jb25maSB8IC0tY29uZiB8IC0tY29uIHwgLS1jbyB8IC0tYyApCi0gICAgJGFzX2VjaG8gIiRhY19jc19jb25maWciOyBleGl0IDs7Ci0gIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCi0gICAgZGVidWc9OiA7OwotICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQotICAgICRhY19zaGlmdAotICAgIGNhc2UgJGFjX29wdGFyZyBpbgotICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0gICAgJycpIGFzX2ZuX2Vycm9yICQ/ICJtaXNzaW5nIGZpbGUgYXJndW1lbnQiIDs7Ci0gICAgZXNhYwotICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfRklMRVMgIiAnJGFjX29wdGFyZyciCi0gICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7Ci0gIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKLSAgICAkYWNfc2hpZnQKLSAgICBjYXNlICRhY19vcHRhcmcgaW4KLSAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgIGVzYWMKLSAgICBhc19mbl9hcHBlbmQgQ09ORklHX0hFQURFUlMgIiAnJGFjX29wdGFyZyciCi0gICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7Ci0gIC0taGUgfCAtLWgpCi0gICAgIyBDb25mbGljdCBiZXR3ZWVuIC0taGVscCBhbmQgLS1oZWFkZXIKLSAgICBhc19mbl9lcnJvciAkPyAiYW1iaWd1b3VzIG9wdGlvbjogXGAkMScKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIjs7Ci0gIC0taGVscCB8IC0taGVsIHwgLWggKQotICAgICRhc19lY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDs7Ci0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKLSAgICBhY19jc19zaWxlbnQ9OiA7OwotCi0gICMgVGhpcyBpcyBhbiBlcnJvci4KLSAgLSopIGFzX2ZuX2Vycm9yICQ/ICJ1bnJlY29nbml6ZWQgb3B0aW9uOiBcYCQxJwotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDs7Ci0KLSAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ190YXJnZXRzICIgJDEiCi0gICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2UgOzsKLQotICBlc2FjCi0gIHNoaWZ0Ci1kb25lCi0KLWFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPQotCi1pZiAkYWNfY3Nfc2lsZW50OyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLSAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKLWZpCi0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1pZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KLSAgc2V0IFggJyRTSEVMTCcgJyQwJyAkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbgotICBzaGlmdAotICBcJGFzX2VjaG8gInJ1bm5pbmcgQ09ORklHX1NIRUxMPSRTSEVMTCBcJCoiID4mNgotICBDT05GSUdfU0hFTEw9JyRTSEVMTCcKLSAgZXhwb3J0IENPTkZJR19TSEVMTAotICBleGVjICJcJEAiCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLWV4ZWMgNT4+Y29uZmlnLmxvZwotewotICBlY2hvCi0gIHNlZCAnaDtzLy4vLS9nO3MvXi4uLi8jIyAvO3MvLi4uJC8gIyMvO3A7eDtwO3gnIDw8X0FTQk9YCi0jIyBSdW5uaW5nICRhc19tZS4gIyMKLV9BU0JPWAotICAkYXNfZWNobyAiJGFjX2xvZyIKLX0gPiY1Ci0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotCi0jIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KLWZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cwotZG8KLSAgY2FzZSAkYWNfY29uZmlnX3RhcmdldCBpbgotICAgICJjb25maWcuaCIpIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgY29uZmlnLmgiIDs7Ci0gICAgIk1ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OwotICAgICJidWlsZHBrZy5zaCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBidWlsZHBrZy5zaCIgOzsKLSAgICAib3BlbnNzaGQuaW5pdCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBvcGVuc3NoZC5pbml0IiA7OwotICAgICJvcGVuc3NoLnhtbCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBvcGVuc3NoLnhtbCIgOzsKLSAgICAib3BlbmJzZC1jb21wYXQvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgb3BlbmJzZC1jb21wYXQvTWFrZWZpbGUiIDs7Ci0gICAgIm9wZW5ic2QtY29tcGF0L3JlZ3Jlc3MvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgb3BlbmJzZC1jb21wYXQvcmVncmVzcy9NYWtlZmlsZSIgOzsKLSAgICAic3VydmV5LnNoIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHN1cnZleS5zaCIgOzsKLQotICAqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBhcmd1bWVudDogXGAkYWNfY29uZmlnX3RhcmdldCciICIkTElORU5PIiA1OzsKLSAgZXNhYwotZG9uZQotCi0KLSMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKLSMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgotIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQotIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KLWlmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCi0gIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCi0gIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCi1maQotCi0jIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKLSMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKLSMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KLSMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KLSMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKLSMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgotJGRlYnVnIHx8Ci17Ci0gIHRtcD0gYWNfdG1wPQotICB0cmFwICdleGl0X3N0YXR1cz0kPwotICA6ICIke2FjX3RtcDo9JHRtcH0iCi0gIHsgdGVzdCAhIC1kICIkYWNfdG1wIiB8fCBybSAtZnIgIiRhY190bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLSAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKLX0KLSMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgotCi17Ci0gIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1kICIkdG1wIgotfSAgfHwKLXsKLSAgdG1wPS4vY29uZiQkLSRSQU5ET00KLSAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCi19IHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQotYWNfdG1wPSR0bXAKLQotIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KLSMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgnLgotaWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLQotCi1hY19jcj1gZWNobyBYIHwgdHIgWCAnXDAxNSdgCi0jIE9uIGN5Z3dpbiwgYmFzaCBjYW4gZWF0IFxyIGluc2lkZSBgYCBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgaWduY3IuCi0jIEJ1dCB3ZSBrbm93IG9mIG5vIG90aGVyIHNoZWxsIHdoZXJlIGFjX2NyIHdvdWxkIGJlIGVtcHR5IGF0IHRoaXMKLSMgcG9pbnQsIHNvIHdlIGNhbiB1c2UgYSBiYXNoaXNtIGFzIGEgZmFsbGJhY2suCi1pZiB0ZXN0ICJ4JGFjX2NyIiA9IHg7IHRoZW4KLSAgZXZhbCBhY19jcj1cJFwnXFxyXCcKLWZpCi1hY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCi1pZiB0ZXN0ICIkYWNfY3NfYXdrX2NyIiA9ICJhJHthY19jcn1iIjsgdGhlbgotICBhY19jc19hd2tfY3I9J1xccicKLWVsc2UKLSAgYWNfY3NfYXdrX2NyPSRhY19jcgotZmkKLQotZWNobyAnQkVHSU4geycgPiIkYWNfdG1wL3N1YnMxLmF3ayIgJiYKLV9BQ0VPRgotCi0KLXsKLSAgZWNobyAiY2F0ID5jb25mJCRzdWJzLmF3ayA8PF9BQ0VPRiIgJiYKLSAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgotICBlY2hvICJfQUNFT0YiCi19ID5jb25mJCRzdWJzLnNoIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKLWFjX2RlbGltX251bT1gZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgZ3JlcCAtYyAnXidgCi1hY19kZWxpbT0nJSFfISMgJwotZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCi0gIC4gLi9jb25mJCRzdWJzLnNoIHx8Ci0gICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQotCi0gIGFjX2RlbGltX249YHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5hd2sgfCBncmVwIC1jIFhgCi0gIGlmIHRlc3QgJGFjX2RlbGltX24gPSAkYWNfZGVsaW1fbnVtOyB0aGVuCi0gICAgYnJlYWsKLSAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KLSAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1Ci0gIGVsc2UKLSAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgotICBmaQotZG9uZQotcm0gLWYgY29uZiQkc3Vicy5zaAotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLWNhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8XFxfQUNBV0sgJiYKLV9BQ0VPRgotc2VkIC1uICcKLWgKLXMvXi9TWyIvOyBzLyEuKi8iXT0vCi1wCi1nCi1zL15bXiFdKiEvLwotOnJlcGwKLXQgcmVwbAotcy8nIiRhY19kZWxpbSInJC8vCi10IGRlbGltCi06bmwKLWgKLXMvXCguXHsxNDhcfVwpLi4qL1wxLwotdCBtb3JlMQotcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLwotcAotbgotYiByZXBsCi06bW9yZTEKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KLXAKLWcKLXMvLlx7MTQ4XH0vLwotdCBubAotOmRlbGltCi1oCi1zL1woLlx7MTQ4XH1cKS4uKi9cMS8KLXQgbW9yZTIKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvCi1wCi1iCi06bW9yZTIKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KLXAKLWcKLXMvLlx7MTQ4XH0vLwotdCBkZWxpbQotJyA8Y29uZiQkc3Vicy5hd2sgfCBzZWQgJwotL15bXiIiXS97Ci0gIE4KLSAgcy9cbi8vCi19Ci0nID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCi1ybSAtZiBjb25mJCRzdWJzLmF3awotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1fQUNBV0sKLWNhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8X0FDQVdLICYmCi0gIGZvciAoa2V5IGluIFMpIFNfaXNfc2V0W2tleV0gPSAxCi0gIEZTID0gIgciCi0KLX0KLXsKLSAgbGluZSA9ICQgMAotICBuZmllbGRzID0gc3BsaXQobGluZSwgZmllbGQsICJAIikKLSAgc3Vic3RlZCA9IDAKLSAgbGVuID0gbGVuZ3RoKGZpZWxkWzFdKQotICBmb3IgKGkgPSAyOyBpIDwgbmZpZWxkczsgaSsrKSB7Ci0gICAga2V5ID0gZmllbGRbaV0KLSAgICBrZXlsZW4gPSBsZW5ndGgoa2V5KQotICAgIGlmIChTX2lzX3NldFtrZXldKSB7Ci0gICAgICB2YWx1ZSA9IFNba2V5XQotICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCAxLCBsZW4pICIiIHZhbHVlICIiIHN1YnN0cihsaW5lLCBsZW4gKyBrZXlsZW4gKyAzKQotICAgICAgbGVuICs9IGxlbmd0aCh2YWx1ZSkgKyBsZW5ndGgoZmllbGRbKytpXSkKLSAgICAgIHN1YnN0ZWQgPSAxCi0gICAgfSBlbHNlCi0gICAgICBsZW4gKz0gMSArIGtleWxlbgotICB9Ci0KLSAgcHJpbnQgbGluZQotfQotCi1fQUNBV0sKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotaWYgc2VkICJzLyRhY19jci8vIiA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCi1lbHNlCi0gIGNhdAotZmkgPCAiJGFjX3RtcC9zdWJzMS5hd2siID4gIiRhY190bXAvc3Vicy5hd2siIFwKLSAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQotX0FDRU9GCi0KLSMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgc29sZSAkKHNyY2RpciksCi0jICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZW50cmllcyBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCi0jIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQotIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPVsJIF0qL3sKLWgKLXMvLy8KLXMvXi86Lwotcy9bCSBdKiQvOi8KLXMvOlwkKHNyY2Rpcik6LzovZwotcy86XCR7c3JjZGlyfTovOi9nCi1zLzpAc3JjZGlyQDovOi9nCi1zL146Ki8vCi1zLzoqJC8vCi14Ci1zL1woPVsJIF0qXCkuKi9cMS8KLUcKLXMvXG4vLwotcy9eW149XSo9WwkgXSokLy8KLX0nCi1maQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1maSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCi0KLSMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfSEVBREVSUyBzZWN0aW9uLgotIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgotIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCi1pZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCi1jYXQgPiIkYWNfdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKLUJFR0lOIHsKLV9BQ0VPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcwotIyBoZXJlLWRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bwotIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgotCi0jIENyZWF0ZSBhIGRlbGltaXRlciBzdHJpbmcgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBjb25mZGVmcy5oLCB0byBlYXNlCi0jIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCi1hY19kZWxpbT0nJSFfISMgJwotZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIDo7IGRvCi0gIGFjX3R0PWBzZWQgLW4gIi8kYWNfZGVsaW0vcCIgY29uZmRlZnMuaGAKLSAgaWYgdGVzdCAteiAiJGFjX3R0IjsgdGhlbgotICAgIGJyZWFrCi0gIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSUyIgIiRMSU5FTk8iIDUKLSAgZWxzZQotICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCi0gIGZpCi1kb25lCi0KLSMgRm9yIHRoZSBhd2sgc2NyaXB0LCBEIGlzIGFuIGFycmF5IG9mIG1hY3JvIHZhbHVlcyBrZXllZCBieSBuYW1lLAotIyBsaWtld2lzZSBQIGNvbnRhaW5zIG1hY3JvIHBhcmFtZXRlcnMgaWYgYW55LiAgUHJlc2VydmUgYmFja3NsYXNoCi0jIG5ld2xpbmUgc2VxdWVuY2VzLgotCi1hY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgotc2VkIC1uICcKLXMvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwotdCByc2V0Ci06cnNldAotcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovIC8KLXQgZGVmCi1kCi06ZGVmCi1zL1xcJC8vCi10IGJzbmwKLXMvWyJcXF0vXFwmL2cKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAotRFsiXDEiXT0iIFwzIi9wCi1zL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMiIvcAotZAotOmJzbmwKLXMvWyJcXF0vXFwmL2cKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAotRFsiXDEiXT0iIFwzXFxcXFxcbiJcXC9wCi10IGNvbnQKLXMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyXFxcXFxcbiJcXC9wCi10IGNvbnQKLWQKLTpjb250Ci1uCi1zLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKLXQgY2xlYXIKLTpjbGVhcgotcy9cXCQvLwotdCBic25sYwotcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi9wCi1kCi06YnNubGMKLXMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcXFxcXG4iXFwvcAotYiBjb250Ci0nIDxjb25mZGVmcy5oIHwgc2VkICcKLXMvJyIkYWNfZGVsaW0iJy8iXFxcCi0iL2cnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotICBmb3IgKGtleSBpbiBEKSBEX2lzX3NldFtrZXldID0gMQotICBGUyA9ICIHIgotfQotL15bXHQgXSojW1x0IF0qKGRlZmluZXx1bmRlZilbXHQgXSskYWNfd29yZF9yZShbXHQgKF18XCQpLyB7Ci0gIGxpbmUgPSBcJCAwCi0gIHNwbGl0KGxpbmUsIGFyZywgIiAiKQotICBpZiAoYXJnWzFdID09ICIjIikgewotICAgIGRlZnVuZGVmID0gYXJnWzJdCi0gICAgbWFjMSA9IGFyZ1szXQotICB9IGVsc2UgewotICAgIGRlZnVuZGVmID0gc3Vic3RyKGFyZ1sxXSwgMikKLSAgICBtYWMxID0gYXJnWzJdCi0gIH0KLSAgc3BsaXQobWFjMSwgbWFjMiwgIigiKSAjKQotICBtYWNybyA9IG1hYzJbMV0KLSAgcHJlZml4ID0gc3Vic3RyKGxpbmUsIDEsIGluZGV4KGxpbmUsIGRlZnVuZGVmKSAtIDEpCi0gIGlmIChEX2lzX3NldFttYWNyb10pIHsKLSAgICAjIFByZXNlcnZlIHRoZSB3aGl0ZSBzcGFjZSBzdXJyb3VuZGluZyB0aGUgIiMiLgotICAgIHByaW50IHByZWZpeCAiZGVmaW5lIiwgbWFjcm8gUFttYWNyb10gRFttYWNyb10KLSAgICBuZXh0Ci0gIH0gZWxzZSB7Ci0gICAgIyBSZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvciBleGFtcGxlLAotICAgICMgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLSAgICBpZiAoZGVmdW5kZWYgPT0gInVuZGVmIikgewotICAgICAgcHJpbnQgIi8qIiwgcHJlZml4IGRlZnVuZGVmLCBtYWNybywgIiovIgotICAgICAgbmV4dAotICAgIH0KLSAgfQotfQoteyBwcmludCB9Ci1fQUNBV0sKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQotICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKLWZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgotCi0KLWV2YWwgc2V0IFggIiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICAgICIKLXNoaWZ0Ci1mb3IgYWNfdGFnCi1kbwotICBjYXNlICRhY190YWcgaW4KLSAgOltGSExDXSkgYWNfbW9kZT0kYWNfdGFnOyBjb250aW51ZTs7Ci0gIGVzYWMKLSAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KLSAgOltGSExdKjoqKTs7Ci0gIDpMKiB8IDpDKjoqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB0YWcgXGAkYWNfdGFnJyIgIiRMSU5FTk8iIDU7OwotICA6W0ZIXS0pIGFjX3RhZz0tOi07OwotICA6W0ZIXSopIGFjX3RhZz0kYWNfdGFnOiRhY190YWcuaW47OwotICBlc2FjCi0gIGFjX3NhdmVfSUZTPSRJRlMKLSAgSUZTPToKLSAgc2V0IHggJGFjX3RhZwotICBJRlM9JGFjX3NhdmVfSUZTCi0gIHNoaWZ0Ci0gIGFjX2ZpbGU9JDEKLSAgc2hpZnQKLQotICBjYXNlICRhY19tb2RlIGluCi0gIDpMKSBhY19zb3VyY2U9JDE7OwotICA6W0ZIXSkKLSAgICBhY19maWxlX2lucHV0cz0KLSAgICBmb3IgYWNfZgotICAgIGRvCi0gICAgICBjYXNlICRhY19mIGluCi0gICAgICAtKSBhY19mPSIkYWNfdG1wL3N0ZGluIjs7Ci0gICAgICAqKSAjIExvb2sgZm9yIHRoZSBmaWxlIGZpcnN0IGluIHRoZSBidWlsZCB0cmVlLCB0aGVuIGluIHRoZSBzb3VyY2UgdHJlZQotCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKLQkgIyBiZWNhdXNlICRhY19mIGNhbm5vdCBjb250YWluIGA6Jy4KLQkgdGVzdCAtZiAiJGFjX2YiIHx8Ci0JICAgY2FzZSAkYWNfZiBpbgotCSAgIFtcXC8kXSopIGZhbHNlOzsKLQkgICAqKSB0ZXN0IC1mICIkc3JjZGlyLyRhY19mIiAmJiBhY19mPSIkc3JjZGlyLyRhY19mIjs7Ci0JICAgZXNhYyB8fAotCSAgIGFzX2ZuX2Vycm9yIDEgImNhbm5vdCBmaW5kIGlucHV0IGZpbGU6IFxgJGFjX2YnIiAiJExJTkVOTyIgNTs7Ci0gICAgICBlc2FjCi0gICAgICBjYXNlICRhY19mIGluICpcJyopIGFjX2Y9YCRhc19lY2hvICIkYWNfZiIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyBlc2FjCi0gICAgICBhc19mbl9hcHBlbmQgYWNfZmlsZV9pbnB1dHMgIiAnJGFjX2YnIgotICAgIGRvbmUKLQotICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0Ci0gICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgotICAgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCi0gICAgY29uZmlndXJlX2lucHV0PSdHZW5lcmF0ZWQgZnJvbSAnYAotCSAgJGFzX2VjaG8gIiQqIiB8IHNlZCAnc3xeW146XSovfHw7c3w6W146XSovfCwgfGcnCi0JYCcgYnkgY29uZmlndXJlLicKLSAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCi0gICAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgJGNvbmZpZ3VyZV9pbnB1dCIKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9Ci0gICAgZmkKLSAgICAjIE5ldXRyYWxpemUgc3BlY2lhbCBjaGFyYWN0ZXJzIGludGVycHJldGVkIGJ5IHNlZCBpbiByZXBsYWNlbWVudCBzdHJpbmdzLgotICAgIGNhc2UgJGNvbmZpZ3VyZV9pbnB1dCBpbiAjKAotICAgICpcJiogfCAqXHwqIHwgKlxcKiApCi0gICAgICAgYWNfc2VkX2NvbmZfaW5wdXQ9YCRhc19lY2hvICIkY29uZmlndXJlX2lucHV0IiB8Ci0gICAgICAgc2VkICdzL1tcXFxcJnxdL1xcXFwmL2cnYDs7ICMoCi0gICAgKikgYWNfc2VkX2NvbmZfaW5wdXQ9JGNvbmZpZ3VyZV9pbnB1dDs7Ci0gICAgZXNhYwotCi0gICAgY2FzZSAkYWNfdGFnIGluCi0gICAgKjotOiogfCAqOi0pIGNhdCA+IiRhY190bXAvc3RkaW4iIFwKLSAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNSA7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0KLSAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX2ZpbGUiIHx8Ci0kYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLSRhc19lY2hvIFgiJGFjX2ZpbGUiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICBhc19kaXI9IiRhY19kaXIiOyBhc19mbl9ta2Rpcl9wCi0gIGFjX2J1aWxkZGlyPS4KLQotY2FzZSAiJGFjX2RpciIgaW4KLS4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotKikKLSAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKLSAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKLSAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgotICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0gICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotICBlc2FjIDs7Ci1lc2FjCi1hY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLWFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKLSMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci1hY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLQotY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICBhY19zcmNkaXI9LgotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KLSAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci1lc2FjCi1hY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Ci0KLQotICBjYXNlICRhY19tb2RlIGluCi0gIDpGKQotICAjCi0gICMgQ09ORklHX0ZJTEUKLSAgIwotCi0gIGNhc2UgJElOU1RBTEwgaW4KLSAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OwotICAqKSBhY19JTlNUQUxMPSRhY190b3BfYnVpbGRfcHJlZml4JElOU1RBTEwgOzsKLSAgZXNhYwotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLSMgSWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90IGtub3cgYWJvdXQgZGF0YXJvb3RkaXIsIGV4cGFuZCBpdC4KLSMgRklYTUU6IFRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZCBhIGZldyB5ZWFycyBhZnRlciAyLjYwLgotYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49Ci1hY19zZWRfZGF0YXJvb3Q9JwotL2RhdGFyb290ZGlyLyB7Ci0gIHAKLSAgcQotfQotL0BkYXRhZGlyQC9wCi0vQGRvY2RpckAvcAotL0BpbmZvZGlyQC9wCi0vQGxvY2FsZWRpckAvcAotL0BtYW5kaXJAL3AnCi1jYXNlIGBldmFsICJzZWQgLW4gXCJcJGFjX3NlZF9kYXRhcm9vdFwiICRhY19maWxlX2lucHV0cyJgIGluCi0qZGF0YXJvb3RkaXIqKSBhY19kYXRhcm9vdGRpcl9zZWVuPXllczs7Ci0qQGRhdGFkaXJAKnwqQGRvY2RpckAqfCpAaW5mb2RpckAqfCpAbG9jYWxlZGlyQCp8KkBtYW5kaXJAKikKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjI7fQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLSAgYWNfZGF0YXJvb3RkaXJfaGFjaz0nCi0gIHMmQGRhdGFkaXJAJiRkYXRhZGlyJmcKLSAgcyZAZG9jZGlyQCYkZG9jZGlyJmcKLSAgcyZAaW5mb2RpckAmJGluZm9kaXImZwotICBzJkBsb2NhbGVkaXJAJiRsb2NhbGVkaXImZwotICBzJkBtYW5kaXJAJiRtYW5kaXImZwotICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7OwotZXNhYwotX0FDRU9GCi0KLSMgTmV1dHJhbGl6ZSBWUEFUSCB3aGVuIGAkc3JjZGlyJyA9IGAuJy4KLSMgU2hlbGwgY29kZSBpbiBjb25maWd1cmUuYWMgbWlnaHQgc2V0IGV4dHJhc3ViLgotIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPwotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCi1hY19zZWRfZXh0cmE9IiRhY192cHN1YgotJGV4dHJhc3ViCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKLTp0Ci0vQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCi1zfEBjb25maWd1cmVfaW5wdXRAfCRhY19zZWRfY29uZl9pbnB1dHw7dCB0Ci1zJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKLXMmQHRvcF9idWlsZF9wcmVmaXhAJiRhY190b3BfYnVpbGRfcHJlZml4Jjt0IHQKLXMmQHNyY2RpckAmJGFjX3NyY2RpciY7dCB0Ci1zJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0Ci1zJkB0b3Bfc3JjZGlyQCYkYWNfdG9wX3NyY2RpciY7dCB0Ci1zJkBhYnNfdG9wX3NyY2RpckAmJGFjX2Fic190b3Bfc3JjZGlyJjt0IHQKLXMmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAotcyZAYWJzX2J1aWxkZGlyQCYkYWNfYWJzX2J1aWxkZGlyJjt0IHQKLXMmQGFic190b3BfYnVpbGRkaXJAJiRhY19hYnNfdG9wX2J1aWxkZGlyJjt0IHQKLXMmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKLSRhY19kYXRhcm9vdGRpcl9oYWNrCi0iCi1ldmFsIHNlZCBcIlwkYWNfc2VkX2V4dHJhXCIgIiRhY19maWxlX2lucHV0cyIgfCAkQVdLIC1mICIkYWNfdG1wL3N1YnMuYXdrIiBcCi0gID4kYWNfdG1wL291dCB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKLQotdGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKLSAgeyBhY19vdXQ9YHNlZCAtbiAnL1wke2RhdGFyb290ZGlyfS9wJyAiJGFjX3RtcC9vdXQiYDsgdGVzdCAtbiAiJGFjX291dCI7IH0gJiYKLSAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgXAotICAgICAgIiRhY190bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi13aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi13aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQiID4mMjt9Ci0KLSAgcm0gLWYgIiRhY190bXAvc3RkaW4iCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgLSkgY2F0ICIkYWNfdG1wL291dCIgJiYgcm0gLWYgIiRhY190bXAvb3V0Ijs7Ci0gICopIHJtIC1mICIkYWNfZmlsZSIgJiYgbXYgIiRhY190bXAvb3V0IiAiJGFjX2ZpbGUiOzsKLSAgZXNhYyBcCi0gIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQotIDs7Ci0gIDpIKQotICAjCi0gICMgQ09ORklHX0hFQURFUgotICAjCi0gIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KLSAgICB7Ci0gICAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKLSAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiRhY190bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIgotICAgIH0gPiIkYWNfdG1wL2NvbmZpZy5oIiBcCi0gICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKLSAgICBpZiBkaWZmICIkYWNfZmlsZSIgIiRhY190bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQotICAgIGVsc2UKLSAgICAgIHJtIC1mICIkYWNfZmlsZSIKLSAgICAgIG12ICIkYWNfdG1wL2NvbmZpZy5oIiAiJGFjX2ZpbGUiIFwKLQl8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKLSAgICBmaQotICBlbHNlCi0gICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCi0gICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIgXAotICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgLSIgIiRMSU5FTk8iIDUKLSAgZmkKLSA7OwotCi0KLSAgZXNhYwotCi1kb25lICMgZm9yIGFjX3RhZwotCi0KLWFzX2ZuX2V4aXQgMAotX0FDRU9GCi1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQotCi10ZXN0ICRhY193cml0ZV9mYWlsID0gMCB8fAotICBhc19mbl9lcnJvciAkPyAid3JpdGUgZmFpbHVyZSBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKLQotCi0jIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGFuZCB0aGVuIGNhbGxzIGNvbmZpZy5zdGF0dXMuCi0jIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KLSMgVW5mb3J0dW5hdGVseSwgb24gRE9TIHRoaXMgZmFpbHMsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdCBvcGVuCi0jIGJ5IGNvbmZpZ3VyZSwgc28gY29uZmlnLnN0YXR1cyB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0OyBpdHMKLSMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCi0jIGVmZmVjdGl2ZWx5IGNsb3NpbmcgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kCi0jIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5zdGF0dXMuICBXaGVuIGNvbWluZyBiYWNrIHRvIGNvbmZpZ3VyZSwgd2UKLSMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCi1pZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KLSAgYWNfY3Nfc3VjY2Vzcz06Ci0gIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KLSAgdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKLSAgICBhY19jb25maWdfc3RhdHVzX2FyZ3M9IiRhY19jb25maWdfc3RhdHVzX2FyZ3MgLS1xdWlldCIKLSAgZXhlYyA1Pi9kZXYvbnVsbAotICAkU0hFTEwgJENPTkZJR19TVEFUVVMgJGFjX2NvbmZpZ19zdGF0dXNfYXJncyB8fCBhY19jc19zdWNjZXNzPWZhbHNlCi0gIGV4ZWMgNT4+Y29uZmlnLmxvZwotICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAotICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KLSAgJGFjX2NzX3N1Y2Nlc3MgfHwgYXNfZm5fZXhpdCAxCi1maQotaWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIiAmJiB0ZXN0ICIkZW5hYmxlX29wdGlvbl9jaGVja2luZyIgIT0gbm87IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMjt9Ci1maQotCi0KLSMgUHJpbnQgc3VtbWFyeSBvZiBvcHRpb25zCi0KLSMgU29tZW9uZSBwbGVhc2Ugc2hvdyBtZSBhIGJldHRlciB3YXkgOikKLUE9YGV2YWwgZWNobyAke3ByZWZpeH1gIDsgQT1gZXZhbCBlY2hvICR7QX1gCi1CPWBldmFsIGVjaG8gJHtiaW5kaXJ9YCA7IEI9YGV2YWwgZWNobyAke0J9YAotQz1gZXZhbCBlY2hvICR7c2JpbmRpcn1gIDsgQz1gZXZhbCBlY2hvICR7Q31gCi1EPWBldmFsIGVjaG8gJHtzeXNjb25mZGlyfWAgOyBEPWBldmFsIGVjaG8gJHtEfWAKLUU9YGV2YWwgZWNobyAke2xpYmV4ZWNkaXJ9L3NzaC1hc2twYXNzYCA7IEU9YGV2YWwgZWNobyAke0V9YAotRj1gZXZhbCBlY2hvICR7bWFuZGlyfS8ke21hbnN1YmRpcn1YYCA7IEY9YGV2YWwgZWNobyAke0Z9YAotRz1gZXZhbCBlY2hvICR7cGlkZGlyfWAgOyBHPWBldmFsIGVjaG8gJHtHfWAKLUg9YGV2YWwgZWNobyAke1BSSVZTRVBfUEFUSH1gIDsgSD1gZXZhbCBlY2hvICR7SH1gCi1JPWBldmFsIGVjaG8gJHt1c2VyX3BhdGh9YCA7IEk9YGV2YWwgZWNobyAke0l9YAotSj1gZXZhbCBlY2hvICR7c3VwZXJ1c2VyX3BhdGh9YCA7IEo9YGV2YWwgZWNobyAke0p9YAotCi1lY2hvICIiCi1lY2hvICJPcGVuU1NIIGhhcyBiZWVuIGNvbmZpZ3VyZWQgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IgotZWNobyAiICAgICAgICAgICAgICAgICAgICAgVXNlciBiaW5hcmllczogJEIiCi1lY2hvICIgICAgICAgICAgICAgICAgICAgU3lzdGVtIGJpbmFyaWVzOiAkQyIKLWVjaG8gIiAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gZmlsZXM6ICREIgotZWNobyAiICAgICAgICAgICAgICAgICAgIEFza3Bhc3MgcHJvZ3JhbTogJEUiCi1lY2hvICIgICAgICAgICAgICAgICAgICAgICAgTWFudWFsIHBhZ2VzOiAkRiIKLWVjaG8gIiAgICAgICAgICAgICAgICAgICAgICAgICAgUElEIGZpbGU6ICRHIgotZWNobyAiICBQcml2aWxlZ2Ugc2VwYXJhdGlvbiBjaHJvb3QgcGF0aDogJEgiCi1pZiB0ZXN0ICJ4JGV4dGVybmFsX3BhdGhfZmlsZSIgPSAieC9ldGMvbG9naW4uY29uZiIgOyB0aGVuCi1lY2hvICIgICBBdCBydW50aW1lLCBzc2hkIHdpbGwgdXNlIHRoZSBwYXRoIGRlZmluZWQgaW4gJGV4dGVybmFsX3BhdGhfZmlsZSIKLWVjaG8gIiAgIE1ha2Ugc3VyZSB0aGUgcGF0aCB0byBzY3AgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIHNjcCB3aWxsIG5vdCB3b3JrIgotZWxzZQotZWNobyAiICAgICAgICAgICAgc3NoZCBkZWZhdWx0IHVzZXIgUEFUSDogJEkiCi0JaWYgdGVzdCAhIC16ICIkZXh0ZXJuYWxfcGF0aF9maWxlIjsgdGhlbgotZWNobyAiICAgKElmIFBBVEggaXMgc2V0IGluICRleHRlcm5hbF9wYXRoX2ZpbGUgaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQuIElmIgotZWNobyAiICAgdXNlZCwgZW5zdXJlIHRoZSBwYXRoIHRvIHNjcCBpcyBwcmVzZW50LCBvdGhlcndpc2Ugc2NwIHdpbGwgbm90IHdvcmsuKSIKLQlmaQotZmkKLWlmIHRlc3QgISAteiAiJHN1cGVydXNlcl9wYXRoIiA7IHRoZW4KLWVjaG8gIiAgICAgICAgICBzc2hkIHN1cGVydXNlciB1c2VyIFBBVEg6ICRKIgotZmkKLWVjaG8gIiAgICAgICAgICAgICAgICAgICAgTWFucGFnZSBmb3JtYXQ6ICRNQU5UWVBFIgotZWNobyAiICAgICAgICAgICAgICAgICAgICAgICBQQU0gc3VwcG9ydDogJFBBTV9NU0ciCi1lY2hvICIgICAgICAgICAgICAgICAgICAgT1NGIFNJQSBzdXBwb3J0OiAkU0lBX01TRyIKLWVjaG8gIiAgICAgICAgICAgICAgICAgS2VyYmVyb3NWIHN1cHBvcnQ6ICRLUkI1X01TRyIKLWVjaG8gIiAgICAgICAgICAgICAgICAgICBTRUxpbnV4IHN1cHBvcnQ6ICRTRUxJTlVYX01TRyIKLWVjaG8gIiAgICAgICAgICAgICAgICAgU21hcnRjYXJkIHN1cHBvcnQ6ICRTQ0FSRF9NU0ciCi1lY2hvICIgICAgICAgICAgICAgICAgICAgICBTL0tFWSBzdXBwb3J0OiAkU0tFWV9NU0ciCi1lY2hvICIgICAgICAgICAgICAgIFRDUCBXcmFwcGVycyBzdXBwb3J0OiAkVENQV19NU0ciCi1lY2hvICIgICAgICAgICAgICAgIE1ENSBwYXNzd29yZCBzdXBwb3J0OiAkTUQ1X01TRyIKLWVjaG8gIiAgICAgICAgICAgICAgICAgICBsaWJlZGl0IHN1cHBvcnQ6ICRMSUJFRElUX01TRyIKLWVjaG8gIiAgU29sYXJpcyBwcm9jZXNzIGNvbnRyYWN0IHN1cHBvcnQ6ICRTUENfTVNHIgotZWNobyAiICAgICAgICAgICBTb2xhcmlzIHByb2plY3Qgc3VwcG9ydDogJFNQX01TRyIKLWVjaG8gIiAgICAgICBJUCBhZGRyZXNzIGluIFwkRElTUExBWSBoYWNrOiAkRElTUExBWV9IQUNLX01TRyIKLWVjaG8gIiAgICAgICAgICAgVHJhbnNsYXRlIHY0IGluIHY2IGhhY2s6ICRJUFY0X0lONl9IQUNLX01TRyIKLWVjaG8gIiAgICAgICAgICAgICAgICAgIEJTRCBBdXRoIHN1cHBvcnQ6ICRCU0RfQVVUSF9NU0ciCi1lY2hvICIgICAgICAgICAgICAgIFJhbmRvbSBudW1iZXIgc291cmNlOiAkUkFORF9NU0ciCi1lY2hvICIgICAgICAgICAgICAgUHJpdnNlcCBzYW5kYm94IHN0eWxlOiAkU0FOREJPWF9TVFlMRSIKLQotZWNobyAiIgotCi1lY2hvICIgICAgICAgICAgICAgIEhvc3Q6ICR7aG9zdH0iCi1lY2hvICIgICAgICAgICAgQ29tcGlsZXI6ICR7Q0N9IgotZWNobyAiICAgIENvbXBpbGVyIGZsYWdzOiAke0NGTEFHU30iCi1lY2hvICJQcmVwcm9jZXNzb3IgZmxhZ3M6ICR7Q1BQRkxBR1N9IgotZWNobyAiICAgICAgTGlua2VyIGZsYWdzOiAke0xERkxBR1N9IgotZWNobyAiICAgICAgICAgTGlicmFyaWVzOiAke0xJQlN9IgotaWYgdGVzdCAhIC16ICIke1NTSERMSUJTfSI7IHRoZW4KLWVjaG8gIiAgICAgICAgICtmb3Igc3NoZDogJHtTU0hETElCU30iCi1maQotaWYgdGVzdCAhIC16ICIke1NTSExJQlN9IjsgdGhlbgotZWNobyAiICAgICAgICAgICtmb3Igc3NoOiAke1NTSExJQlN9IgotZmkKLQotZWNobyAiIgotCi1pZiB0ZXN0ICJ4JE1BS0VfUEFDS0FHRV9TVVBQT1JURUQiID0gInh5ZXMiIDsgdGhlbgotCWVjaG8gIlNWUjQgc3R5bGUgcGFja2FnZXMgYXJlIHN1cHBvcnRlZCB3aXRoIFwibWFrZSBwYWNrYWdlXCIiCi0JZWNobyAiIgotZmkKLQotaWYgdGVzdCAieCRQQU1fTVNHIiA9ICJ4eWVzIiA7IHRoZW4KLQllY2hvICJQQU0gaXMgZW5hYmxlZC4gWW91IG1heSBuZWVkIHRvIGluc3RhbGwgYSBQQU0gY29udHJvbCBmaWxlICIKLQllY2hvICJmb3Igc3NoZCwgb3RoZXJ3aXNlIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIG1heSBmYWlsLiAiCi0JZWNobyAiRXhhbXBsZSBQQU0gY29udHJvbCBmaWxlcyBjYW4gYmUgZm91bmQgaW4gdGhlIGNvbnRyaWIvICIKLQllY2hvICJzdWJkaXJlY3RvcnkiCi0JZWNobyAiIgotZmkKLQotaWYgdGVzdCAhIC16ICIkTk9fUEVFUkNIRUNLIiA7IHRoZW4KLQllY2hvICJXQVJOSU5HOiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHlvdSBhcmUgdXNpbmcgZG9lcyBub3QiCi0JZWNobyAiYXBwZWFyIHRvIHN1cHBvcnQgZ2V0cGVlcmVpZCgpLCBnZXRwZWVydWNyZWQoKSBvciB0aGUiCi0JZWNobyAiU09fUEVFUkNSRUQgZ2V0c29ja29wdCgpIG9wdGlvbi4gVGhlc2UgZmFjaWxpdGllcyBhcmUgdXNlZCB0byIKLQllY2hvICJlbmZvcmNlIHNlY3VyaXR5IGNoZWNrcyB0byBwcmV2ZW50IHVuYXV0aG9yaXNlZCBjb25uZWN0aW9ucyB0byIKLQllY2hvICJzc2gtYWdlbnQuIFRoZWlyIGFic2VuY2UgaW5jcmVhc2VzIHRoZSByaXNrIHRoYXQgYSBtYWxpY2lvdXMiCi0JZWNobyAidXNlciBjYW4gY29ubmVjdCB0byB5b3VyIGFnZW50LiIKLQllY2hvICIiCi1maQotCi1pZiB0ZXN0ICIkQVVESVRfTU9EVUxFIiA9ICJic20iIDsgdGhlbgotCWVjaG8gIldBUk5JTkc6IEJTTSBhdWRpdCBzdXBwb3J0IGlzIGN1cnJlbnRseSBjb25zaWRlcmVkIEVYUEVSSU1FTlRBTC4iCi0JZWNobyAiU2VlIHRoZSBTb2xhcmlzIHNlY3Rpb24gaW4gUkVBRE1FLnBsYXRmb3JtIGZvciBkZXRhaWxzLiIKLWZpCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTQwYjEuLjAwMDAwMDAKLS0tIGEvY29uZmlndXJlLmFjCisrKyAvZGV2L251bGwKQEAgLTEsNDMwNCArMCwwIEBACi0jICRJZDogY29uZmlndXJlLmFjLHYgMS40ODAgMjAxMS8wOC8xOCAwNDo0ODoyNCB0aW0gRXhwICQKLSMKLSMgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgRGFtaWVuIE1pbGxlcgotIwotIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotIwotIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotIyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0jIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotIyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi1BQ19JTklUKFtPcGVuU1NIXSwgW1BvcnRhYmxlXSwgW29wZW5zc2gtdW5peC1kZXZAbWluZHJvdC5vcmddKQotQUNfUkVWSVNJT04oJFJldmlzaW9uOiAxLjQ4MCAkKQotQUNfQ09ORklHX1NSQ0RJUihbc3NoLmNdKQotQUNfTEFORyhbQ10pCi0KLUFDX0NPTkZJR19IRUFERVIoW2NvbmZpZy5oXSkKLUFDX1BST0dfQ0MKLUFDX0NBTk9OSUNBTF9IT1NUCi1BQ19DX0JJR0VORElBTgotCi0jIENoZWNrcyBmb3IgcHJvZ3JhbXMuCi1BQ19QUk9HX0FXSwotQUNfUFJPR19DUFAKLUFDX1BST0dfUkFOTElCCi1BQ19QUk9HX0lOU1RBTEwKLUFDX1BST0dfRUdSRVAKLUFDX1BBVEhfUFJPRyhbQVJdLCBbYXJdKQotQUNfUEFUSF9QUk9HKFtDQVRdLCBbY2F0XSkKLUFDX1BBVEhfUFJPRyhbS0lMTF0sIFtraWxsXSkKLUFDX1BBVEhfUFJPR1MoW1BFUkxdLCBbcGVybDUgcGVybF0pCi1BQ19QQVRIX1BST0coW1NFRF0sIFtzZWRdKQotQUNfU1VCU1QoW1BFUkxdKQotQUNfUEFUSF9QUk9HKFtFTlRdLCBbZW50XSkKLUFDX1NVQlNUKFtFTlRdKQotQUNfUEFUSF9QUk9HKFtURVNUX01JTlVTX1NfU0hdLCBbYmFzaF0pCi1BQ19QQVRIX1BST0coW1RFU1RfTUlOVVNfU19TSF0sIFtrc2hdKQotQUNfUEFUSF9QUk9HKFtURVNUX01JTlVTX1NfU0hdLCBbc2hdKQotQUNfUEFUSF9QUk9HKFtTSF0sIFtzaF0pCi1BQ19QQVRIX1BST0coW0dST0ZGXSwgW2dyb2ZmXSkKLUFDX1BBVEhfUFJPRyhbTlJPRkZdLCBbbnJvZmZdKQotQUNfUEFUSF9QUk9HKFtNQU5ET0NdLCBbbWFuZG9jXSkKLUFDX1NVQlNUKFtURVNUX1NIRUxMXSwgW3NoXSkKLQotZG5sIHNlbGVjdCBtYW5wYWdlIGZvcm1hdHRlcgotaWYgdGVzdCAieCRNQU5ET0MiICE9ICJ4IiA7IHRoZW4KLQlNQU5GTVQ9IiRNQU5ET0MiCi1lbGlmIHRlc3QgIngkTlJPRkYiICE9ICJ4IiA7IHRoZW4KLQlNQU5GTVQ9IiROUk9GRiAtbWFuZG9jIgotZWxpZiB0ZXN0ICJ4JEdST0ZGIiAhPSAieCIgOyB0aGVuCi0JTUFORk1UPSIkR1JPRkYgLW1hbmRvYyAtVGFzY2lpIgotZWxzZQotCUFDX01TR19XQVJOKFtubyBtYW5wYWdlIGZvcm1hdHRlZCBmb3VuZF0pCi0JTUFORk1UPSJmYWxzZSIKLWZpCi1BQ19TVUJTVChbTUFORk1UXSkKLQotZG5sIGZvciBidWlsZHBrZy5zaAotQUNfUEFUSF9QUk9HKFtQQVRIX0dST1VQQUREX1BST0ddLCBbZ3JvdXBhZGRdLCBbZ3JvdXBhZGRdLAotCVsvdXNyL3NiaW4ke1BBVEhfU0VQQVJBVE9SfS9ldGNdKQotQUNfUEFUSF9QUk9HKFtQQVRIX1VTRVJBRERfUFJPR10sIFt1c2VyYWRkXSwgW3VzZXJhZGRdLAotCVsvdXNyL3NiaW4ke1BBVEhfU0VQQVJBVE9SfS9ldGNdKQotQUNfQ0hFQ0tfUFJPRyhbTUFLRV9QQUNLQUdFX1NVUFBPUlRFRF0sIFtwa2dta10sIFt5ZXNdLCBbbm9dKQotaWYgdGVzdCAteCAvc2Jpbi9zaDsgdGhlbgotCUFDX1NVQlNUKFtTVEFSVFVQX1NDUklQVF9TSEVMTF0sIFsvc2Jpbi9zaF0pCi1lbHNlCi0JQUNfU1VCU1QoW1NUQVJUVVBfU0NSSVBUX1NIRUxMXSwgWy9iaW4vc2hdKQotZmkKLQotIyBTeXN0ZW0gZmVhdHVyZXMKLUFDX1NZU19MQVJHRUZJTEUKLQotaWYgdGVzdCAteiAiJEFSIiA7IHRoZW4KLQlBQ19NU0dfRVJST1IoWyoqKiAnYXInIG1pc3NpbmcsIHBsZWFzZSBpbnN0YWxsIG9yIGZpeCB5b3VyIFwkUEFUSCAqKipdKQotZmkKLQotIyBVc2UgTE9HSU5fUFJPR1JBTSBmcm9tIGVudmlyb25tZW50IGlmIHBvc3NpYmxlCi1pZiB0ZXN0ICEgLXogIiRMT0dJTl9QUk9HUkFNIiA7IHRoZW4KLQlBQ19ERUZJTkVfVU5RVU9URUQoW0xPR0lOX1BST0dSQU1fRkFMTEJBQ0tdLCBbIiRMT0dJTl9QUk9HUkFNIl0sCi0JCVtJZiB5b3VyIGhlYWRlciBmaWxlcyBkb24ndCBkZWZpbmUgTE9HSU5fUFJPR1JBTSwKLQkJdGhlbiB1c2UgdGhpcyAoZGV0ZWN0ZWQpIGZyb20gZW52aXJvbm1lbnQgYW5kIFBBVEhdKQotZWxzZQotCSMgU2VhcmNoIGZvciBsb2dpbgotCUFDX1BBVEhfUFJPRyhbTE9HSU5fUFJPR1JBTV9GQUxMQkFDS10sIFtsb2dpbl0pCi0JaWYgdGVzdCAhIC16ICIkTE9HSU5fUFJPR1JBTV9GQUxMQkFDSyIgOyB0aGVuCi0JCUFDX0RFRklORV9VTlFVT1RFRChbTE9HSU5fUFJPR1JBTV9GQUxMQkFDS10sIFsiJExPR0lOX1BST0dSQU1fRkFMTEJBQ0siXSkKLQlmaQotZmkKLQotQUNfUEFUSF9QUk9HKFtQQVRIX1BBU1NXRF9QUk9HXSwgW3Bhc3N3ZF0pCi1pZiB0ZXN0ICEgLXogIiRQQVRIX1BBU1NXRF9QUk9HIiA7IHRoZW4KLQlBQ19ERUZJTkVfVU5RVU9URUQoW19QQVRIX1BBU1NXRF9QUk9HXSwgWyIkUEFUSF9QQVNTV0RfUFJPRyJdLAotCQlbRnVsbCBwYXRoIG9mIHlvdXIgInBhc3N3ZCIgcHJvZ3JhbV0pCi1maQotCi1pZiB0ZXN0IC16ICIkTEQiIDsgdGhlbgotCUxEPSRDQwotZmkKLUFDX1NVQlNUKFtMRF0pCi0KLUFDX0NfSU5MSU5FCi0KLUFDX0NIRUNLX0RFQ0woW0xMT05HX01BWF0sIFtoYXZlX2xsb25nX21heD0xXSwgLCBbI2luY2x1ZGUgPGxpbWl0cy5oPl0pCi1BQ19DSEVDS19ERUNMKFtTWVNUUl9QT0xJQ1lfS0lMTF0sIFtoYXZlX3N5c3RyX3BvbGljeV9raWxsPTFdLCAsIFsKLQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCSNpbmNsdWRlIDxkZXYvc3lzdHJhY2UuaD4KLV0pCi1BQ19DSEVDS19ERUNMKFtSTElNSVRfTlBST0NdLAotICAgIFtBQ19ERUZJTkUoW0hBVkVfUkxJTUlUX05QUk9DXSwgW10sIFtzeXMvcmVzb3VyY2UuaCBoYXMgUkxJTUlUX05QUk9DXSldLCAsIFsKLQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotXSkKLQotdXNlX3N0YWNrX3Byb3RlY3Rvcj0xCi1BQ19BUkdfV0lUSChbc3RhY2twcm90ZWN0XSwKLSAgICBbICAtLXdpdGhvdXQtc3RhY2twcm90ZWN0ICBEb24ndCB1c2UgY29tcGlsZXIncyBzdGFjayBwcm90ZWN0aW9uXSwgWwotICAgIGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIjsgdGhlbgotCXVzZV9zdGFja19wcm90ZWN0b3I9MAotICAgIGZpIF0pCi0KLQotaWYgdGVzdCAiJEdDQyIgPSAieWVzIiB8fCB0ZXN0ICIkR0NDIiA9ICJlZ2NzIjsgdGhlbgotCU9TU0hfQ0hFQ0tfQ0ZMQUdfQ09NUElMRShbLVdhbGxdKQotCU9TU0hfQ0hFQ0tfQ0ZMQUdfQ09NUElMRShbLVdwb2ludGVyLWFyaXRoXSkKLQlPU1NIX0NIRUNLX0NGTEFHX0NPTVBJTEUoWy1XdW5pbml0aWFsaXplZF0pCi0JT1NTSF9DSEVDS19DRkxBR19DT01QSUxFKFstV3NpZ24tY29tcGFyZV0pCi0JT1NTSF9DSEVDS19DRkxBR19DT01QSUxFKFstV2Zvcm1hdC1zZWN1cml0eV0pCi0JT1NTSF9DSEVDS19DRkxBR19DT01QSUxFKFstV3BvaW50ZXItc2lnbl0sIFstV25vLXBvaW50ZXItc2lnbl0pCi0JT1NTSF9DSEVDS19DRkxBR19DT01QSUxFKFstV3VudXNlZC1yZXN1bHRdLCBbLVduby11bnVzZWQtcmVzdWx0XSkKLQlPU1NIX0NIRUNLX0NGTEFHX0NPTVBJTEUoWy1mbm8tc3RyaWN0LWFsaWFzaW5nXSkKLQlBQ19NU0dfQ0hFQ0tJTkcoW2djYyB2ZXJzaW9uXSkKLQlHQ0NfVkVSPWAkQ0MgLXYgMj4mMSB8ICRBV0sgJy9nY2MgdmVyc2lvbiAve3ByaW50ICQzfSdgCi0JY2FzZSAkR0NDX1ZFUiBpbgotCQkxLiopIG5vX2F0dHJpYl9ub25udWxsPTEgOzsKLQkJMi44KiB8IDIuOSopCi0JCSAgICAgbm9fYXR0cmliX25vbm51bGw9MQotCQkgICAgIDs7Ci0JCTIuKikgbm9fYXR0cmliX25vbm51bGw9MSA7OwotCQkqKSA7OwotCWVzYWMKLQlBQ19NU0dfUkVTVUxUKFskR0NDX1ZFUl0pCi0KLQlBQ19NU0dfQ0hFQ0tJTkcoW2lmICRDQyBhY2NlcHRzIC1mbm8tYnVpbHRpbi1tZW1zZXRdKQotCXNhdmVkX0NGTEFHUz0iJENGTEFHUyIKLQlDRkxBR1M9IiRDRkxBR1MgLWZuby1idWlsdGluLW1lbXNldCIKLQlBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzdHJpbmcuaD4gXV0sCi0JCQlbWyBjaGFyIGJbMTBdOyBtZW1zZXQoYiwgMCwgc2l6ZW9mKGIpKTsgXV0pXSwKLQkJWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKSBdLAotCQlbIEFDX01TR19SRVNVTFQoW25vXSkKLQkJICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MiIF0KLQkpCi0KLQkjIC1mc3RhY2stcHJvdGVjdG9yLWFsbCBkb2Vzbid0IGFsd2F5cyB3b3JrIGZvciBzb21lIEdDQyB2ZXJzaW9ucwotCSMgYW5kL29yIHBsYXRmb3Jtcywgc28gd2UgdGVzdCBpZiB3ZSBjYW4uICBJZiBpdCdzIG5vdCBzdXBwb3J0ZWQKLQkjIG9uIGEgZ2l2ZW4gcGxhdGZvcm0gZ2NjIHdpbGwgZW1pdCBhIHdhcm5pbmcgc28gd2UgdXNlIC1XZXJyb3IuCi0JaWYgdGVzdCAieCR1c2Vfc3RhY2tfcHJvdGVjdG9yIiA9ICJ4MSI7IHRoZW4KLQkgICAgZm9yIHQgaW4gLWZzdGFjay1wcm90ZWN0b3ItYWxsIC1mc3RhY2stcHJvdGVjdG9yOyBkbwotCQlBQ19NU0dfQ0hFQ0tJTkcoW2lmICRDQyBzdXBwb3J0cyAkdF0pCi0JCXNhdmVkX0NGTEFHUz0iJENGTEFHUyIKLQkJc2F2ZWRfTERGTEFHUz0iJExERkxBR1MiCi0JCUNGTEFHUz0iJENGTEFHUyAkdCAtV2Vycm9yIgotCQlMREZMQUdTPSIkTERGTEFHUyAkdCAtV2Vycm9yIgotCQlBQ19MSU5LX0lGRUxTRSgKLQkJCVtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN0ZGlvLmg+IF1dLAotCQkJW1sKLQljaGFyIHhbMjU2XTsKLQlzbnByaW50Zih4LCBzaXplb2YoeCksICJYWFgiKTsKLQkJCSBdXSldLAotCQkgICAgWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCQkgICAgICBDRkxBR1M9IiRzYXZlZF9DRkxBR1MgJHQiCi0JCSAgICAgIExERkxBR1M9IiRzYXZlZF9MREZMQUdTICR0IgotCQkgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmICR0IHdvcmtzXSkKLQkJICAgICAgQUNfUlVOX0lGRUxTRSgKLQkJCVtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN0ZGlvLmg+IF1dLAotCQkJW1sKLQljaGFyIHhbMjU2XTsKLQlzbnByaW50Zih4LCBzaXplb2YoeCksICJYWFgiKTsKLQkJCV1dKV0sCi0JCQlbIEFDX01TR19SRVNVTFQoW3llc10pCi0JCQkgIGJyZWFrIF0sCi0JCQlbIEFDX01TR19SRVNVTFQoW25vXSkgXSwKLQkJCVsgQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZzogY2Fubm90IHRlc3RdKQotCQkJICBicmVhayBdCi0JCSAgICAgICkKLQkJICAgIF0sCi0JCSAgICBbIEFDX01TR19SRVNVTFQoW25vXSkgXQotCQkpCi0JCUNGTEFHUz0iJHNhdmVkX0NGTEFHUyIKLQkJTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0JICAgIGRvbmUKLQlmaQotCi0JaWYgdGVzdCAteiAiJGhhdmVfbGxvbmdfbWF4IjsgdGhlbgotCQkjIHJldHJ5IExMT05HX01BWCB3aXRoIC1zdGQ9Z251OTksIG5lZWRlZCBvbiBzb21lIExpbnV4ZXMKLQkJdW5zZXQgYWNfY3ZfaGF2ZV9kZWNsX0xMT05HX01BWAotCQlzYXZlZF9DRkxBR1M9IiRDRkxBR1MiCi0JCUNGTEFHUz0iJENGTEFHUyAtc3RkPWdudTk5IgotCQlBQ19DSEVDS19ERUNMKFtMTE9OR19NQVhdLAotCQkgICAgW2hhdmVfbGxvbmdfbWF4PTFdLAotCQkgICAgW0NGTEFHUz0iJHNhdmVkX0NGTEFHUyJdLAotCQkgICAgWyNpbmNsdWRlIDxsaW1pdHMuaD5dCi0JCSkKLQlmaQotZmkKLQotaWYgdGVzdCAieCRub19hdHRyaWJfbm9ubnVsbCIgIT0gIngxIiA7IHRoZW4KLQlBQ19ERUZJTkUoW0hBVkVfQVRUUklCVVRFX19OT05OVUxMX19dLCBbMV0sIFtIYXZlIGF0dHJpYnV0ZSBub25udWxsXSkKLWZpCi0KLUFDX0FSR19XSVRIKFtycGF0aF0sCi0JWyAgLS13aXRob3V0LXJwYXRoICAgICAgICAgRGlzYWJsZSBhdXRvLWFkZGVkIC1SIGxpbmtlciBwYXRoc10sCi0JWwotCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyIgOyB0aGVuCi0JCQluZWVkX2Rhc2hfcj0iIgotCQlmaQotCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInh5ZXMiIDsgdGhlbgotCQkJbmVlZF9kYXNoX3I9MQotCQlmaQotCV0KLSkKLQotIyBBbGxvdyB1c2VyIHRvIHNwZWNpZnkgZmxhZ3MKLUFDX0FSR19XSVRIKFtjZmxhZ3NdLAotCVsgIC0td2l0aC1jZmxhZ3MgICAgICAgICAgIFNwZWNpZnkgYWRkaXRpb25hbCBmbGFncyB0byBwYXNzIHRvIGNvbXBpbGVyXSwKLQlbCi0JCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCi0JCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0JCQlDRkxBR1M9IiRDRkxBR1MgJHdpdGh2YWwiCi0JCWZpCi0JXQotKQotQUNfQVJHX1dJVEgoW2NwcGZsYWdzXSwKLQlbICAtLXdpdGgtY3BwZmxhZ3MgICAgICAgICBTcGVjaWZ5IGFkZGl0aW9uYWwgZmxhZ3MgdG8gcGFzcyB0byBwcmVwcm9jZXNzb3JdICwKLQlbCi0JCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCi0JCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0JCQlDUFBGTEFHUz0iJENQUEZMQUdTICR3aXRodmFsIgotCQlmaQotCV0KLSkKLUFDX0FSR19XSVRIKFtsZGZsYWdzXSwKLQlbICAtLXdpdGgtbGRmbGFncyAgICAgICAgICBTcGVjaWZ5IGFkZGl0aW9uYWwgZmxhZ3MgdG8gcGFzcyB0byBsaW5rZXJdLAotCVsKLQkJaWYgdGVzdCAtbiAiJHdpdGh2YWwiICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiAgJiYgIFwKLQkJICAgIHRlc3QgIngke3dpdGh2YWx9IiAhPSAieHllcyI7IHRoZW4KLQkJCUxERkxBR1M9IiRMREZMQUdTICR3aXRodmFsIgotCQlmaQotCV0KLSkKLUFDX0FSR19XSVRIKFtsaWJzXSwKLQlbICAtLXdpdGgtbGlicyAgICAgICAgICAgICBTcGVjaWZ5IGFkZGl0aW9uYWwgbGlicmFyaWVzIHRvIGxpbmsgd2l0aF0sCi0JWwotCQlpZiB0ZXN0IC1uICIkd2l0aHZhbCIgICYmICB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iICAmJiAgXAotCQkgICAgdGVzdCAieCR7d2l0aHZhbH0iICE9ICJ4eWVzIjsgdGhlbgotCQkJTElCUz0iJExJQlMgJHdpdGh2YWwiCi0JCWZpCi0JXQotKQotQUNfQVJHX1dJVEgoW1dlcnJvcl0sCi0JWyAgLS13aXRoLVdlcnJvciAgICAgICAgICAgQnVpbGQgbWFpbiBjb2RlIHdpdGggLVdlcnJvcl0sCi0JWwotCQlpZiB0ZXN0IC1uICIkd2l0aHZhbCIgICYmICB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iOyB0aGVuCi0JCQl3ZXJyb3JfZmxhZ3M9Ii1XZXJyb3IiCi0JCQlpZiB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0JCQkJd2Vycm9yX2ZsYWdzPSIkd2l0aHZhbCIKLQkJCWZpCi0JCWZpCi0JXQotKQotCi1BQ19DSEVDS19IRUFERVJTKFsgXAotCWJzdHJpbmcuaCBcCi0JY3J5cHQuaCBcCi0JY3J5cHRvL3NoYTIuaCBcCi0JZGlyZW50LmggXAotCWVuZGlhbi5oIFwKLQlmZWF0dXJlcy5oIFwKLQlmY250bC5oIFwKLQlmbG9hdGluZ3BvaW50LmggXAotCWdldG9wdC5oIFwKLQlnbG9iLmggXAotCWlhLmggXAotCWlhZi5oIFwKLQlsaW1pdHMuaCBcCi0JbG9naW4uaCBcCi0JbWFpbGxvY2suaCBcCi0JbmRpci5oIFwKLQluZXQvaWZfdHVuLmggXAotCW5ldGRiLmggXAotCW5ldGdyb3VwLmggXAotCXBhbS9wYW1fYXBwbC5oIFwKLQlwYXRocy5oIFwKLQlwb2xsLmggXAotCXB0eS5oIFwKLQlyZWFkcGFzc3BocmFzZS5oIFwKLQlycGMvdHlwZXMuaCBcCi0Jc2VjdXJpdHkvcGFtX2FwcGwuaCBcCi0Jc2hhMi5oIFwKLQlzaGFkb3cuaCBcCi0Jc3RkZGVmLmggXAotCXN0ZGludC5oIFwKLQlzdHJpbmcuaCBcCi0Jc3RyaW5ncy5oIFwKLQlzeXMvYXVkaXQuaCBcCi0Jc3lzL2JpdHlwZXMuaCBcCi0Jc3lzL2JzZHR0eS5oIFwKLQlzeXMvY2RlZnMuaCBcCi0Jc3lzL2Rpci5oIFwKLQlzeXMvbW1hbi5oIFwKLQlzeXMvbmRpci5oIFwKLQlzeXMvcG9sbC5oIFwKLQlzeXMvcHJjdGwuaCBcCi0Jc3lzL3BzdGF0LmggXAotCXN5cy9zZWxlY3QuaCBcCi0Jc3lzL3N0YXQuaCBcCi0Jc3lzL3N0cmVhbS5oIFwKLQlzeXMvc3Ryb3B0cy5oIFwKLQlzeXMvc3RydGlvLmggXAotCXN5cy9zdGF0dmZzLmggXAotCXN5cy9zeXNtYWNyb3MuaCBcCi0Jc3lzL3RpbWUuaCBcCi0Jc3lzL3RpbWVycy5oIFwKLQlzeXMvdW4uaCBcCi0JdGltZS5oIFwKLQl0bXBkaXIuaCBcCi0JdHR5ZW50LmggXAotCXVjcmVkLmggXAotCXVuaXN0ZC5oIFwKLQl1c2Vyc2VjLmggXAotCXV0aWwuaCBcCi0JdXRpbWUuaCBcCi0JdXRtcC5oIFwKLQl1dG1weC5oIFwKLQl2aXMuaCBcCi1dKQotCi0jIGxhc3Rsb2cuaCByZXF1aXJlcyBzeXMvdGltZS5oIHRvIGJlIGluY2x1ZGVkIGZpcnN0IG9uIFNvbGFyaXMKLUFDX0NIRUNLX0hFQURFUlMoW2xhc3Rsb2cuaF0sIFtdLCBbXSwgWwotI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAotIyBpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmCi1dKQotCi0jIHN5cy9wdG1zLmggcmVxdWlyZXMgc3lzL3N0cmVhbS5oIHRvIGJlIGluY2x1ZGVkIGZpcnN0IG9uIFNvbGFyaXMKLUFDX0NIRUNLX0hFQURFUlMoW3N5cy9wdG1zLmhdLCBbXSwgW10sIFsKLSNpZmRlZiBIQVZFX1NZU19TVFJFQU1fSAotIyBpbmNsdWRlIDxzeXMvc3RyZWFtLmg+Ci0jZW5kaWYKLV0pCi0KLSMgbG9naW5fY2FwLmggcmVxdWlyZXMgc3lzL3R5cGVzLmggb24gTmV0QlNECi1BQ19DSEVDS19IRUFERVJTKFtsb2dpbl9jYXAuaF0sIFtdLCBbXSwgWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotXSkKLQotIyBvbGRlciBCU0RzIG5lZWQgc3lzL3BhcmFtLmggYmVmb3JlIHN5cy9tb3VudC5oCi1BQ19DSEVDS19IRUFERVJTKFtzeXMvbW91bnQuaF0sIFtdLCBbXSwgWwotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotXSkKLQotIyBNZXNzYWdlcyBmb3IgZmVhdHVyZXMgdGVzdGVkIGZvciBpbiB0YXJnZXQtc3BlY2lmaWMgc2VjdGlvbgotU0lBX01TRz0ibm8iCi1TUENfTVNHPSJubyIKLVNQX01TRz0ibm8iCi0KLSMgQ2hlY2sgZm9yIHNvbWUgdGFyZ2V0LXNwZWNpZmljIHN0dWZmCi1jYXNlICIkaG9zdCIgaW4KLSotKi1haXgqKQotCSMgU29tZSB2ZXJzaW9ucyBvZiBWQUMgd29uJ3QgYWxsb3cgbWFjcm8gcmVkZWZpbml0aW9ucyBhdAotCSMgLXFsYW5nbGV2ZWw9YW5zaSwgYW5kIGF1dG9jb25mIDIuNjAgc29tZXRpbWVzIGluc2lzdHMgb24gdXNpbmcgdGhhdAotCSMgcGFydGljdWxhcmx5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgdmFjIG9yIHhsYy4KLQkjIEl0IGFsc28gdGhyb3dzIGVycm9ycyBhYm91dCBudWxsIG1hY3JvIGFyZ21lbnRzLCBidXQgdGhlc2UgYXJlCi0JIyBub3QgZmF0YWwuCi0JQUNfTVNHX0NIRUNLSU5HKFtpZiBjb21waWxlciBhbGxvd3MgbWFjcm8gcmVkZWZpbml0aW9uc10pCi0JQUNfQ09NUElMRV9JRkVMU0UoCi0JICAgIFtBQ19MQU5HX1BST0dSQU0oW1sKLSNkZWZpbmUgdGVzdG1hY3JvIGZvbwotI2RlZmluZSB0ZXN0bWFjcm8gYmFyXV0sCi0JICAgIFtbIGV4aXQoMCk7IF1dKV0sCi0JICAgIFsgQUNfTVNHX1JFU1VMVChbeWVzXSkgXSwKLQkgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCi0JICAgICAgQ0M9ImBlY2hvICRDQyB8IHNlZCAncy8tcWxhbmdsdmxcPWFuc2kvL2cnYCIKLQkgICAgICBMRD0iYGVjaG8gJExEIHwgc2VkICdzLy1xbGFuZ2x2bFw9YW5zaS8vZydgIgotCSAgICAgIENGTEFHUz0iYGVjaG8gJENGTEFHUyB8IHNlZCAncy8tcWxhbmdsdmxcPWFuc2kvL2cnYCIKLQkgICAgICBDUFBGTEFHUz0iYGVjaG8gJENQUEZMQUdTIHwgc2VkICdzLy1xbGFuZ2x2bFw9YW5zaS8vZydgIgotCSAgICBdCi0JKQotCi0JQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gc3BlY2lmeSBibGlicGF0aCBmb3IgbGlua2VyICgkTEQpXSkKLQlpZiAodGVzdCAteiAiJGJsaWJwYXRoIik7IHRoZW4KLQkJYmxpYnBhdGg9Ii91c3IvbGliOi9saWIiCi0JZmkKLQlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKLQlpZiB0ZXN0ICIkR0NDIiA9ICJ5ZXMiOyB0aGVuCi0JCWZsYWdzPSItV2wsLWJsaWJwYXRoOiAtV2wsLXJwYXRoLCAtYmxpYnBhdGg6IgotCWVsc2UKLQkJZmxhZ3M9Ii1ibGlicGF0aDogLVdsLC1ibGlicGF0aDogLVdsLC1ycGF0aCwiCi0JZmkKLQlmb3IgdHJ5ZmxhZ3MgaW4gJGZsYWdzIDtkbwotCQlpZiAodGVzdCAteiAiJGJsaWJmbGFncyIpOyB0aGVuCi0JCQlMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyAkdHJ5ZmxhZ3MkYmxpYnBhdGgiCi0JCQlBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbXV0sIFtbXV0pXSwKLQkJCVtibGliZmxhZ3M9JHRyeWZsYWdzXSwgW10pCi0JCWZpCi0JZG9uZQotCWlmICh0ZXN0IC16ICIkYmxpYmZsYWdzIik7IHRoZW4KLQkJQUNfTVNHX1JFU1VMVChbbm90IGZvdW5kXSkKLQkJQUNfTVNHX0VSUk9SKFsqKiogbXVzdCBiZSBhYmxlIHRvIHNwZWNpZnkgYmxpYnBhdGggb24gQUlYIC0gY2hlY2sgY29uZmlnLmxvZ10pCi0JZWxzZQotCQlBQ19NU0dfUkVTVUxUKFskYmxpYmZsYWdzXSkKLQlmaQotCUxERkxBR1M9IiRzYXZlZF9MREZMQUdTIgotCWRubCBDaGVjayBmb3IgYXV0aGVudGljYXRlLiAgTWlnaHQgYmUgaW4gbGlicy5hIG9uIG9sZGVyIEFJWGVzCi0JQUNfQ0hFQ0tfRlVOQyhbYXV0aGVudGljYXRlXSwgW0FDX0RFRklORShbV0lUSF9BSVhBVVRIRU5USUNBVEVdLCBbMV0sCi0JCVtEZWZpbmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIEFJWDQncyBhdXRoZW50aWNhdGUgZnVuY3Rpb25dKV0sCi0JCVtBQ19DSEVDS19MSUIoW3NdLCBbYXV0aGVudGljYXRlXSwKLQkJCVsgQUNfREVGSU5FKFtXSVRIX0FJWEFVVEhFTlRJQ0FURV0pCi0JCQkJTElCUz0iJExJQlMgLWxzIgotCQkJXSkKLQkJXSkKLQlkbmwgQ2hlY2sgZm9yIHZhcmlvdXMgYXV0aCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgaW4gaGVhZGVycy4KLQlBQ19DSEVDS19ERUNMUyhbYXV0aGVudGljYXRlLCBsb2dpbnJlc3RyaWN0aW9ucywgbG9naW5zdWNjZXNzLAotCSAgICBwYXNzd2RleHBpcmVkLCBzZXRhdXRoZGJdLCAsICwgWyNpbmNsdWRlIDx1c2Vyc2VjLmg+XSkKLQlkbmwgQ2hlY2sgaWYgbG9naW5mYWlsZWQgaXMgZGVjbGFyZWQgYW5kIHRha2VzIDQgYXJndW1lbnRzIChBSVggPj0gNS4yKQotCUFDX0NIRUNLX0RFQ0xTKFtsb2dpbmZhaWxlZF0sCi0JICAgIFtBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxvZ2luZmFpbGVkIHRha2VzIDQgYXJndW1lbnRzXSkKLQkgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8dXNlcnNlYy5oPiBdXSwKLQkJW1sgKHZvaWQpbG9naW5mYWlsZWQoInVzZXIiLCJob3N0IiwidHR5IiwwKTsgXV0pXSwKLQkJW0FDX01TR19SRVNVTFQoW3llc10pCi0JCUFDX0RFRklORShbQUlYX0xPR0lORkFJTEVEXzRBUkddLCBbMV0sCi0JCQlbRGVmaW5lIGlmIHlvdXIgQUlYIGxvZ2luZmFpbGVkKCkgZnVuY3Rpb24KLQkJCXRha2VzIDQgYXJndW1lbnRzIChBSVggPj0gNS4yKV0pXSwgW0FDX01TR19SRVNVTFQoW25vXSkKLQkgICAgXSldLAotCSAgICBbXSwKLQkgICAgWyNpbmNsdWRlIDx1c2Vyc2VjLmg+XQotCSkKLQlBQ19DSEVDS19GVU5DUyhbZ2V0Z3JzZXQgc2V0YXV0aGRiXSkKLQlBQ19DSEVDS19ERUNMKFtGX0NMT1NFTV0sCi0JICAgIEFDX0RFRklORShbSEFWRV9GQ05UTF9DTE9TRU1dLCBbMV0sIFtVc2UgRl9DTE9TRU0gZmNudGwgZm9yIGNsb3NlZnJvbV0pLAotCSAgICBbXSwKLQkgICAgWyAjaW5jbHVkZSA8bGltaXRzLmg+Ci0JICAgICAgI2luY2x1ZGUgPGZjbnRsLmg+IF0KLQkpCi0JY2hlY2tfZm9yX2FpeF9icm9rZW5fZ2V0YWRkcmluZm89MQotCUFDX0RFRklORShbQlJPS0VOX1JFQUxQQVRIXSwgWzFdLCBbRGVmaW5lIGlmIHlvdSBoYXZlIGEgYnJva2VuIHJlYWxwYXRoLl0pCi0JQUNfREVGSU5FKFtTRVRFVUlEX0JSRUFLU19TRVRVSURdLCBbMV0sCi0JICAgIFtEZWZpbmUgaWYgeW91ciBwbGF0Zm9ybSBicmVha3MgZG9pbmcgYSBzZXRldWlkIGJlZm9yZSBhIHNldHVpZF0pCi0JQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVVSURdLCBbMV0sIFtEZWZpbmUgaWYgeW91ciBzZXRyZXVpZCgpIGlzIGJyb2tlbl0pCi0JQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVHSURdLCBbMV0sIFtEZWZpbmUgaWYgeW91ciBzZXRyZWdpZCgpIGlzIGJyb2tlbl0pCi0JZG5sIEFJWCBoYW5kbGVzIGxhc3Rsb2cgYXMgcGFydCBvZiBpdHMgbG9naW4gbWVzc2FnZQotCUFDX0RFRklORShbRElTQUJMRV9MQVNUTE9HXSwgWzFdLCBbRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBsYXN0bG9nXSkKLQlBQ19ERUZJTkUoW0xPR0lOX05FRURTX1VUTVBYXSwgWzFdLAotCQlbU29tZSBzeXN0ZW1zIG5lZWQgYSB1dG1weCBlbnRyeSBmb3IgL2Jpbi9sb2dpbiB0byB3b3JrXSkKLQlBQ19ERUZJTkUoW1NQVF9UWVBFXSwgW1NQVF9SRVVTRUFSR1ZdLAotCQlbRGVmaW5lIHRvIGEgU2V0IFByb2Nlc3MgVGl0bGUgdHlwZSBpZiB5b3VyIHN5c3RlbSBpcwotCQlzdXBwb3J0ZWQgYnkgYnNkLXNldHByb2N0aXRsZS5jXSkKLQlBQ19ERUZJTkUoW1NTSFBBTV9DSEFVVEhUT0tfTkVFRFNfUlVJRF0sIFsxXSwKLQkgICAgW0FJWCA1LjIgYW5kIDUuMyAoYW5kIHByZXN1bWFibHkgbmV3ZXIpIHJlcXVpcmUgdGhpc10pCi0JQUNfREVGSU5FKFtQVFlfWkVST1JFQURdLCBbMV0sIFtyZWFkKDEpIGNhbiByZXR1cm4gMCBmb3IgYSBub24tY2xvc2VkIGZkXSkKLQk7OwotKi0qLWN5Z3dpbiopCi0JY2hlY2tfZm9yX2xpYmNyeXB0X2xhdGVyPTEKLQlMSUJTPSIkTElCUyAvdXNyL2xpYi90ZXh0cmVhZG1vZGUubyIKLQlBQ19ERUZJTkUoW0hBVkVfQ1lHV0lOXSwgWzFdLCBbRGVmaW5lIGlmIHlvdSBhcmUgb24gQ3lnd2luXSkKLQlBQ19ERUZJTkUoW1VTRV9QSVBFU10sIFsxXSwgW1VzZSBQSVBFUyBpbnN0ZWFkIG9mIGEgc29ja2V0cGFpcigpXSkKLQlBQ19ERUZJTkUoW0RJU0FCTEVfU0hBRE9XXSwgWzFdLAotCQlbRGVmaW5lIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgc2hhZG93IHBhc3N3b3Jkc10pCi0JQUNfREVGSU5FKFtOT19YMTFfVU5JWF9TT0NLRVRTXSwgWzFdLAotCQlbRGVmaW5lIGlmIFgxMSBkb2Vzbid0IHN1cHBvcnQgQUZfVU5JWCBzb2NrZXRzIG9uIHRoYXQgc3lzdGVtXSkKLQlBQ19ERUZJTkUoW05PX0lQUE9SVF9SRVNFUlZFRF9DT05DRVBUXSwgWzFdLAotCQlbRGVmaW5lIGlmIHRoZSBjb25jZXB0IG9mIHBvcnRzIG9ubHkgYWNjZXNzaWJsZSB0bwotCQlzdXBlcnVzZXJzIGlzbid0IGtub3duXSkKLQlBQ19ERUZJTkUoW0RJU0FCTEVfRkRfUEFTU0lOR10sIFsxXSwKLQkJW0RlZmluZSBpZiB5b3VyIHBsYXRmb3JtIG5lZWRzIHRvIHNraXAgcG9zdCBhdXRoCi0JCWZpbGUgZGVzY3JpcHRvciBwYXNzaW5nXSkKLQlBQ19ERUZJTkUoW1NTSF9JT0JVRlNaXSwgWzY1NTM1XSwgW1dpbmRvd3MgaXMgc2Vuc2l0aXZlIHRvIHJlYWQgYnVmZmVyIHNpemVdKQotCUFDX0RFRklORShbRklMRVNZU1RFTV9OT19CQUNLU0xBU0hdLCBbMV0sIFtGaWxlIG5hbWVzIG1heSBub3QgY29udGFpbiBiYWNrc2xhc2ggY2hhcmFjdGVyc10pIAotCTs7Ci0qLSotZGd1eCopCi0JQUNfREVGSU5FKFtJUF9UT1NfSVNfQlJPS0VOXSwgWzFdLAotCQlbRGVmaW5lIGlmIHlvdXIgc3lzdGVtIGNob2tlZCBvbiBJUCBUT1Mgc2V0dGluZ10pCi0JQUNfREVGSU5FKFtTRVRFVUlEX0JSRUFLU19TRVRVSURdKQotCUFDX0RFRklORShbQlJPS0VOX1NFVFJFVUlEXSkKLQlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRUdJRF0pCi0JOzsKLSotKi1kYXJ3aW4qKQotCUFDX01TR19DSEVDS0lORyhbaWYgd2UgaGF2ZSB3b3JraW5nIGdldGFkZHJpbmZvXSkKLQlBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbWyAjaW5jbHVkZSA8bWFjaC1vL2R5bGQuaD4KLW1haW4oKSB7IGlmIChOU1ZlcnNpb25PZlJ1blRpbWVMaWJyYXJ5KCJTeXN0ZW0iKSA+PSAoNjAgPDwgMTYpKQotCQlleGl0KDApOwotCWVsc2UKLQkJZXhpdCgxKTsKLX0KLQkJCV1dKV0sCi0JW0FDX01TR19SRVNVTFQoW3dvcmtpbmddKV0sCi0JW0FDX01TR19SRVNVTFQoW2J1Z2d5XSkKLQlBQ19ERUZJTkUoW0JST0tFTl9HRVRBRERSSU5GT10sIFsxXSwKLQkJW2dldGFkZHJpbmZvIGlzIGJyb2tlbiAoaWYgcHJlc2VudCldKQotCV0sCi0JW0FDX01TR19SRVNVTFQoW2Fzc3VtZSBpdCBpcyB3b3JraW5nXSldKQotCUFDX0RFRklORShbU0VURVVJRF9CUkVBS1NfU0VUVUlEXSkKLQlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRVVJRF0pCi0JQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVHSURdKQotCUFDX0RFRklORShbQlJPS0VOX0dMT0JdLCBbMV0sIFtPUyBYIGdsb2IgZG9lcyBub3QgZG8gd2hhdCB3ZSBleHBlY3RdKQotCUFDX0RFRklORV9VTlFVT1RFRChbQklORF84X0NPTVBBVF0sIFsxXSwKLQkJW0RlZmluZSBpZiB5b3VyIHJlc29sdmVyIGxpYnMgbmVlZCB0aGlzIGZvciBnZXRycnNldGJ5bmFtZV0pCi0JQUNfREVGSU5FKFtTU0hfVFVOX0ZSRUVCU0RdLCBbMV0sIFtPcGVuIHR1bm5lbCBkZXZpY2VzIHRoZSBGcmVlQlNEIHdheV0pCi0JQUNfREVGSU5FKFtTU0hfVFVOX0NPTVBBVF9BRl0sIFsxXSwKLQkgICAgW1VzZSB0dW5uZWwgZGV2aWNlIGNvbXBhdGliaWxpdHkgdG8gT3BlbkJTRF0pCi0JQUNfREVGSU5FKFtTU0hfVFVOX1BSRVBFTkRfQUZdLCBbMV0sCi0JICAgIFtQcmVwZW5kIHRoZSBhZGRyZXNzIGZhbWlseSB0byBJUCB0dW5uZWwgdHJhZmZpY10pCi0JbTRfcGF0dGVybl9hbGxvdyhbQVVfSVB2XSkKLQlBQ19DSEVDS19ERUNMKFtBVV9JUHY0XSwgW10sIAotCSAgICBBQ19ERUZJTkUoW0FVX0lQdjRdLCBbMF0sIFtTeXN0ZW0gb25seSBzdXBwb3J0cyBJUHY0IGF1ZGl0IHJlY29yZHNdKQotCSAgICBbI2luY2x1ZGUgPGJzbS9hdWRpdC5oPl0KLQlBQ19ERUZJTkUoW0xBU1RMT0dfV1JJVEVfUFVUVVRYTElORV0sIFsxXSwKLQkgICAgW0RlZmluZSBpZiBwdXR1dHhsaW5lIHVwZGF0ZXMgbGFzdGxvZyB0b29dKQotCSkKLQlBQ19ERUZJTkUoW1NQVF9UWVBFXSwgW1NQVF9SRVVTRUFSR1ZdLAotCQlbRGVmaW5lIHRvIGEgU2V0IFByb2Nlc3MgVGl0bGUgdHlwZSBpZiB5b3VyIHN5c3RlbSBpcwotCQlzdXBwb3J0ZWQgYnkgYnNkLXNldHByb2N0aXRsZS5jXSkKLQlBQ19DSEVDS19GVU5DUyhbc2FuZGJveF9pbml0XSkKLQlBQ19DSEVDS19IRUFERVJTKFtzYW5kYm94LmhdKQotCTs7Ci0qLSotZHJhZ29uZmx5KikKLQlTU0hETElCUz0iJFNTSERMSUJTIC1sY3J5cHQiCi0JOzsKLSotKi1oYWlrdSopIAotICAgIExJQlM9IiRMSUJTIC1sYnNkICIKLSAgICBBQ19DSEVDS19MSUIoW25ldHdvcmtdLCBbc29ja2V0XSkKLSAgICBBQ19ERUZJTkUoW0hBVkVfVV9JTlQ2NF9UXSkKLSAgICBNQU5UWVBFPW1hbiAKLSAgICA7OyAKLSotKi1ocHV4KikKLQkjIGZpcnN0IHdlIGRlZmluZSBhbGwgb2YgdGhlIG9wdGlvbnMgY29tbW9uIHRvIGFsbCBIUC1VWCByZWxlYXNlcwotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfSFBVWF9TT1VSQ0UgLURfWE9QRU5fU09VUkNFIC1EX1hPUEVOX1NPVVJDRV9FWFRFTkRFRD0xIgotCUlQQUREUl9JTl9ESVNQTEFZPXllcwotCUFDX0RFRklORShbVVNFX1BJUEVTXSkKLQlBQ19ERUZJTkUoW0xPR0lOX05PX0VORE9QVF0sIFsxXSwKLQkgICAgW0RlZmluZSBpZiB5b3VyIGxvZ2luIHByb2dyYW0gY2Fubm90IGhhbmRsZSBlbmQgb2Ygb3B0aW9ucyAoIi0tIildKQotCUFDX0RFRklORShbTE9HSU5fTkVFRFNfVVRNUFhdKQotCUFDX0RFRklORShbTE9DS0VEX1BBU1NXRF9TVFJJTkddLCBbIioiXSwKLQkJW1N0cmluZyB1c2VkIGluIC9ldGMvcGFzc3dkIHRvIGRlbm90ZSBsb2NrZWQgYWNjb3VudF0pCi0JQUNfREVGSU5FKFtTUFRfVFlQRV0sIFtTUFRfUFNUQVRdKQotCW1haWxkaXI9Ii92YXIvbWFpbCIKLQlMSUJTPSIkTElCUyAtbHNlYyIKLQlBQ19DSEVDS19MSUIoW3huZXRdLCBbdF9lcnJvcl0sICwKLQkgICAgW0FDX01TR19FUlJPUihbKioqIC1seG5ldCBuZWVkZWQgb24gSFAtVVggLSBjaGVjayBjb25maWcubG9nICoqKl0pXSkKLQotCSMgbmV4dCwgd2UgZGVmaW5lIGFsbCBvZiB0aGUgb3B0aW9ucyBzcGVjaWZpYyB0byBtYWpvciByZWxlYXNlcwotCWNhc2UgIiRob3N0IiBpbgotCSotKi1ocHV4MTAqKQotCQlpZiB0ZXN0IC16ICIkR0NDIjsgdGhlbgotCQkJQ0ZMQUdTPSIkQ0ZMQUdTIC1BZSIKLQkJZmkKLQkJOzsKLQkqLSotaHB1eDExKikKLQkJQUNfREVGSU5FKFtQQU1fU1VOX0NPREVCQVNFXSwgWzFdLAotCQkJW0RlZmluZSBpZiB5b3UgYXJlIHVzaW5nIFNvbGFyaXMtZGVyaXZlZCBQQU0gd2hpY2gKLQkJCXBhc3NlcyBwYW1fbWVzc2FnZXMgdG8gdGhlIGNvbnZlcnNhdGlvbiBmdW5jdGlvbgotCQkJd2l0aCBhbiBleHRyYSBsZXZlbCBvZiBpbmRpcmVjdGlvbl0pCi0JCUFDX0RFRklORShbRElTQUJMRV9VVE1QXSwgWzFdLAotCQkJW0RlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgdXRtcF0pCi0JCUFDX0RFRklORShbVVNFX0JUTVBdLCBbMV0sIFtVc2UgYnRtcCB0byBsb2cgYmFkIGxvZ2luc10pCi0JCWNoZWNrX2Zvcl9ocHV4X2Jyb2tlbl9nZXRhZGRyaW5mbz0xCi0JCWNoZWNrX2Zvcl9jb25mbGljdGluZ19nZXRzcG5hbT0xCi0JCTs7Ci0JZXNhYwotCi0JIyBsYXN0bHksIHdlIGRlZmluZSBvcHRpb25zIHNwZWNpZmljIHRvIG1pbm9yIHJlbGVhc2VzCi0JY2FzZSAiJGhvc3QiIGluCi0JKi0qLWhwdXgxMC4yNikKLQkJQUNfREVGSU5FKFtIQVZFX1NFQ1VSRVdBUkVdLCBbMV0sCi0JCQlbRGVmaW5lIGlmIHlvdSBoYXZlIFNlY3VyZVdhcmUtYmFzZWQKLQkJCXByb3RlY3RlZCBwYXNzd29yZCBkYXRhYmFzZV0pCi0JCWRpc2FibGVfcHRteF9jaGVjaz15ZXMKLQkJTElCUz0iJExJQlMgLWxzZWNwdyIKLQkJOzsKLQllc2FjCi0JOzsKLSotKi1pcml4NSopCi0JUEFUSD0iJFBBVEg6L3Vzci9ldGMiCi0JQUNfREVGSU5FKFtCUk9LRU5fSU5FVF9OVE9BXSwgWzFdLAotCQlbRGVmaW5lIGlmIHlvdSBzeXN0ZW0ncyBpbmV0X250b2EgaXMgYnVzdGVkCi0JCShlLmcuIElyaXggZ2NjIGlzc3VlKV0pCi0JQUNfREVGSU5FKFtTRVRFVUlEX0JSRUFLU19TRVRVSURdKQotCUFDX0RFRklORShbQlJPS0VOX1NFVFJFVUlEXSkKLQlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRUdJRF0pCi0JQUNfREVGSU5FKFtXSVRIX0FCQlJFVl9OT19UVFldLCBbMV0sCi0JCVtEZWZpbmUgaWYgeW91IHNob3VsZG4ndCBzdHJpcCAndHR5JyBmcm9tIHlvdXIKLQkJdHR5bmFtZSBpbiBbdXdddG1wXSkKLQlBQ19ERUZJTkUoW0xPQ0tFRF9QQVNTV0RfU1RSSU5HXSwgWyIqTEsqIl0pCi0JOzsKLSotKi1pcml4NiopCi0JUEFUSD0iJFBBVEg6L3Vzci9ldGMiCi0JQUNfREVGSU5FKFtXSVRIX0lSSVhfQVJSQVldLCBbMV0sCi0JCVtEZWZpbmUgaWYgeW91IGhhdmUvd2FudCBhcnJheXMKLQkJKGNsdXN0ZXItd2lkZSBzZXNzaW9uIG1hbmFnbWVudCwgbm90IEMgYXJyYXlzKV0pCi0JQUNfREVGSU5FKFtXSVRIX0lSSVhfUFJPSkVDVF0sIFsxXSwKLQkJW0RlZmluZSBpZiB5b3Ugd2FudCBJUklYIHByb2plY3QgbWFuYWdlbWVudF0pCi0JQUNfREVGSU5FKFtXSVRIX0lSSVhfQVVESVRdLCBbMV0sCi0JCVtEZWZpbmUgaWYgeW91IHdhbnQgSVJJWCBhdWRpdCB0cmFpbHNdKQotCUFDX0NIRUNLX0ZVTkMoW2psaW1pdF9zdGFydGpvYl0sIFtBQ19ERUZJTkUoW1dJVEhfSVJJWF9KT0JTXSwgWzFdLAotCQlbRGVmaW5lIGlmIHlvdSB3YW50IElSSVgga2VybmVsIGpvYnNdKV0pCi0JQUNfREVGSU5FKFtCUk9LRU5fSU5FVF9OVE9BXSkKLQlBQ19ERUZJTkUoW1NFVEVVSURfQlJFQUtTX1NFVFVJRF0pCi0JQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVVSURdKQotCUFDX0RFRklORShbQlJPS0VOX1NFVFJFR0lEXSkKLQlBQ19ERUZJTkUoW0JST0tFTl9VUERXVE1QWF0sIFsxXSwgW3VwZHd0bXB4IGlzIGJyb2tlbiAoaWYgcHJlc2VudCldKQotCUFDX0RFRklORShbV0lUSF9BQkJSRVZfTk9fVFRZXSkKLQlBQ19ERUZJTkUoW0xPQ0tFRF9QQVNTV0RfU1RSSU5HXSwgWyIqTEsqIl0pCi0JOzsKLSotKi1rKmJzZCotZ251IHwgKi0qLWtvcGVuc29sYXJpcyotZ251KQotCWNoZWNrX2Zvcl9saWJjcnlwdF9sYXRlcj0xCi0JQUNfREVGSU5FKFtQQU1fVFRZX0tMVURHRV0pCi0JQUNfREVGSU5FKFtMT0NLRURfUEFTU1dEX1BSRUZJWF0sIFsiISJdKQotCUFDX0RFRklORShbU1BUX1RZUEVdLCBbU1BUX1JFVVNFQVJHVl0pCi0JQUNfREVGSU5FKFtfUEFUSF9CVE1QXSwgWyIvdmFyL2xvZy9idG1wIl0sIFtsb2cgZm9yIGJhZCBsb2dpbiBhdHRlbXB0c10pCi0JQUNfREVGSU5FKFtVU0VfQlRNUF0sIFsxXSwgW1VzZSBidG1wIHRvIGxvZyBiYWQgbG9naW5zXSkKLQk7OwotKi0qLWxpbnV4KikKLQlub19kZXZfcHRteD0xCi0JY2hlY2tfZm9yX2xpYmNyeXB0X2xhdGVyPTEKLQljaGVja19mb3Jfb3BlbnB0eV9jdHR5X2J1Zz0xCi0JQUNfREVGSU5FKFtQQU1fVFRZX0tMVURHRV0sIFsxXSwKLQkJW1dvcmsgYXJvdW5kIHByb2JsZW1hdGljIExpbnV4IFBBTSBtb2R1bGVzIGhhbmRsaW5nIG9mIFBBTV9UVFldKQotCUFDX0RFRklORShbTE9DS0VEX1BBU1NXRF9QUkVGSVhdLCBbIiEiXSwKLQkJW1N0cmluZyB1c2VkIGluIC9ldGMvcGFzc3dkIHRvIGRlbm90ZSBsb2NrZWQgYWNjb3VudF0pCi0JQUNfREVGSU5FKFtTUFRfVFlQRV0sIFtTUFRfUkVVU0VBUkdWXSkKLQlBQ19ERUZJTkUoW0xJTktfT1BOT1RTVVBQX0VSUk5PXSwgW0VQRVJNXSwKLQkJW0RlZmluZSB0byB3aGF0ZXZlciBsaW5rKCkgcmV0dXJucyBmb3IgIm5vdCBzdXBwb3J0ZWQiCi0JCWlmIGl0IGRvZXNuJ3QgcmV0dXJuIEVPUE5PVFNVUFAuXSkKLQlBQ19ERUZJTkUoW19QQVRIX0JUTVBdLCBbIi92YXIvbG9nL2J0bXAiXSwgW2xvZyBmb3IgYmFkIGxvZ2luIGF0dGVtcHRzXSkKLQlBQ19ERUZJTkUoW1VTRV9CVE1QXSkKLQlBQ19ERUZJTkUoW0xJTlVYX09PTV9BREpVU1RdLCBbMV0sIFtBZGp1c3QgTGludXggb3V0LW9mLW1lbW9yeSBraWxsZXJdKQotCWluZXQ2X2RlZmF1bHRfNGluNj15ZXMKLQljYXNlIGB1bmFtZSAtcmAgaW4KLQkxLip8Mi4wLiopCi0JCUFDX0RFRklORShbQlJPS0VOX0NNU0dfVFlQRV0sIFsxXSwKLQkJCVtEZWZpbmUgaWYgY21zZ190eXBlIGlzIG5vdCBwYXNzZWQgY29ycmVjdGx5XSkKLQkJOzsKLQllc2FjCi0JIyB0dW4oNCkgZm9yd2FyZGluZyBjb21wYXQgY29kZQotCUFDX0NIRUNLX0hFQURFUlMoW2xpbnV4L2lmX3R1bi5oXSkKLQlpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF9pZl90dW5faCIgPSAieHllcyIgOyB0aGVuCi0JCUFDX0RFRklORShbU1NIX1RVTl9MSU5VWF0sIFsxXSwKLQkJICAgIFtPcGVuIHR1bm5lbCBkZXZpY2VzIHRoZSBMaW51eCB0dW4vdGFwIHdheV0pCi0JCUFDX0RFRklORShbU1NIX1RVTl9DT01QQVRfQUZdLCBbMV0sCi0JCSAgICBbVXNlIHR1bm5lbCBkZXZpY2UgY29tcGF0aWJpbGl0eSB0byBPcGVuQlNEXSkKLQkJQUNfREVGSU5FKFtTU0hfVFVOX1BSRVBFTkRfQUZdLCBbMV0sCi0JCSAgICBbUHJlcGVuZCB0aGUgYWRkcmVzcyBmYW1pbHkgdG8gSVAgdHVubmVsIHRyYWZmaWNdKQotCWZpCi0JOzsKLW1pcHMtc29ueS1ic2R8bWlwcy1zb255LW5ld3NvczQpCi0JQUNfREVGSU5FKFtORUVEX1NFVFBHUlBdLCBbMV0sIFtOZWVkIHNldHBncnAgdG8gYWNxdWlyZSBjb250cm9sbGluZyB0dHldKQotCVNPTlk9MQotCTs7Ci0qLSotbmV0YnNkKikKLQljaGVja19mb3JfbGliY3J5cHRfYmVmb3JlPTEKLQlpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgotCQluZWVkX2Rhc2hfcj0xCi0JZmkKLQlBQ19ERUZJTkUoW1NTSF9UVU5fRlJFRUJTRF0sIFsxXSwgW09wZW4gdHVubmVsIGRldmljZXMgdGhlIEZyZWVCU0Qgd2F5XSkKLQlBQ19DSEVDS19IRUFERVIoW25ldC9pZl90YXAuaF0sICwKLQkgICAgQUNfREVGSU5FKFtTU0hfVFVOX05PX0wyXSwgWzFdLCBbTm8gbGF5ZXIgMiB0dW5uZWwgc3VwcG9ydF0pKQotCUFDX0RFRklORShbU1NIX1RVTl9QUkVQRU5EX0FGXSwgWzFdLAotCSAgICBbUHJlcGVuZCB0aGUgYWRkcmVzcyBmYW1pbHkgdG8gSVAgdHVubmVsIHRyYWZmaWNdKQotCTs7Ci0qLSotZnJlZWJzZCopCi0JY2hlY2tfZm9yX2xpYmNyeXB0X2xhdGVyPTEKLQlBQ19ERUZJTkUoW0xPQ0tFRF9QQVNTV0RfUFJFRklYXSwgWyIqTE9DS0VEKiJdLCBbQWNjb3VudCBsb2NrZWQgd2l0aCBwdygxKV0pCi0JQUNfREVGSU5FKFtTU0hfVFVOX0ZSRUVCU0RdLCBbMV0sIFtPcGVuIHR1bm5lbCBkZXZpY2VzIHRoZSBGcmVlQlNEIHdheV0pCi0JQUNfQ0hFQ0tfSEVBREVSKFtuZXQvaWZfdGFwLmhdLCAsCi0JICAgIEFDX0RFRklORShbU1NIX1RVTl9OT19MMl0sIFsxXSwgW05vIGxheWVyIDIgdHVubmVsIHN1cHBvcnRdKSkKLQlBQ19ERUZJTkUoW0JST0tFTl9HTE9CXSwgWzFdLCBbRnJlZUJTRCBnbG9iIGRvZXMgbm90IGRvIHdoYXQgd2UgbmVlZF0pCi0JOzsKLSotKi1ic2RpKikKLQlBQ19ERUZJTkUoW1NFVEVVSURfQlJFQUtTX1NFVFVJRF0pCi0JQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVVSURdKQotCUFDX0RFRklORShbQlJPS0VOX1NFVFJFR0lEXSkKLQk7OwotKi1uZXh0LSopCi0JY29uZl9sYXN0bG9nX2xvY2F0aW9uPSIvdXNyL2FkbS9sYXN0bG9nIgotCWNvbmZfdXRtcF9sb2NhdGlvbj0vZXRjL3V0bXAKLQljb25mX3d0bXBfbG9jYXRpb249L3Vzci9hZG0vd3RtcAotCW1haWxkaXI9L3Vzci9zcG9vbC9tYWlsCi0JQUNfREVGSU5FKFtIQVZFX05FWFRdLCBbMV0sIFtEZWZpbmUgaWYgeW91IGFyZSBvbiBOZVhUXSkKLQlBQ19ERUZJTkUoW0JST0tFTl9SRUFMUEFUSF0pCi0JQUNfREVGSU5FKFtVU0VfUElQRVNdKQotCUFDX0RFRklORShbQlJPS0VOX1NBVkVEX1VJRFNdLCBbMV0sIFtOZWVkZWQgZm9yIE5lWFRdKQotCTs7Ci0qLSotb3BlbmJzZCopCi0JQUNfREVGSU5FKFtIQVZFX0FUVFJJQlVURV9fU0VOVElORUxfX10sIFsxXSwgW09wZW5CU0QncyBnY2MgaGFzIHNlbnRpbmVsXSkKLQlBQ19ERUZJTkUoW0hBVkVfQVRUUklCVVRFX19CT1VOREVEX19dLCBbMV0sIFtPcGVuQlNEJ3MgZ2NjIGhhcyBib3VuZGVkXSkKLQlBQ19ERUZJTkUoW1NTSF9UVU5fT1BFTkJTRF0sIFsxXSwgW09wZW4gdHVubmVsIGRldmljZXMgdGhlIE9wZW5CU0Qgd2F5XSkKLQlBQ19ERUZJTkUoW1NZU0xPR19SX1NBRkVfSU5fU0lHSEFORF0sIFsxXSwKLQkgICAgW3N5c2xvZ19yIGZ1bmN0aW9uIGlzIHNhZmUgdG8gdXNlIGluIGluIGEgc2lnbmFsIGhhbmRsZXJdKQotCTs7Ci0qLSotc29sYXJpcyopCi0JaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQkJbmVlZF9kYXNoX3I9MQotCWZpCi0JQUNfREVGSU5FKFtQQU1fU1VOX0NPREVCQVNFXSkKLQlBQ19ERUZJTkUoW0xPR0lOX05FRURTX1VUTVBYXSkKLQlBQ19ERUZJTkUoW0xPR0lOX05FRURTX1RFUk1dLCBbMV0sCi0JCVtTb21lIHZlcnNpb25zIG9mIC9iaW4vbG9naW4gbmVlZCB0aGUgVEVSTSBzdXBwbGllZAotCQlvbiB0aGUgY29tbWFuZGxpbmVdKQotCUFDX0RFRklORShbUEFNX1RUWV9LTFVER0VdKQotCUFDX0RFRklORShbU1NIUEFNX0NIQVVUSFRPS19ORUVEU19SVUlEXSwgWzFdLAotCQlbRGVmaW5lIGlmIHBhbV9jaGF1dGh0b2sgd2FudHMgcmVhbCB1aWQgc2V0Ci0JCXRvIHRoZSB1bnByaXYnZWQgdXNlcl0pCi0JQUNfREVGSU5FKFtMT0NLRURfUEFTU1dEX1NUUklOR10sIFsiKkxLKiJdKQotCSMgUHVzaGluZyBTVFJFQU1TIG1vZHVsZXMgd2lsbCBjYXVzZSBzc2hkIHRvIGFjcXVpcmUgYSBjb250cm9sbGluZyB0dHkuCi0JQUNfREVGSU5FKFtTU0hEX0FDUVVJUkVTX0NUVFldLCBbMV0sCi0JCVtEZWZpbmUgaWYgc3NoZCBzb21laG93IHJlYWNxdWlyZXMgYSBjb250cm9sbGluZyBUVFkKLQkJYWZ0ZXIgc2V0c2lkKCldKQotCUFDX0RFRklORShbUEFTU1dEX05FRURTX1VTRVJOQU1FXSwgWzFdLCBbbXVzdCBzdXBwbHkgdXNlcm5hbWUgdG8gcGFzc3dkCi0JCWluIGNhc2UgdGhlIG5hbWUgaXMgbG9uZ2VyIHRoYW4gOCBjaGFyc10pCi0JQUNfREVGSU5FKFtCUk9LRU5fVENHRVRBVFRSX0lDQU5PTl0sIFsxXSwgW3RjZ2V0YXR0ciB3aXRoIElDQU5PTiBtYXkgaGFuZ10pCi0JZXh0ZXJuYWxfcGF0aF9maWxlPS9ldGMvZGVmYXVsdC9sb2dpbgotCSMgaGFyZHdpcmUgbGFzdGxvZyBsb2NhdGlvbiAoY2FuJ3QgZGV0ZWN0IGl0IG9uIHNvbWUgdmVyc2lvbnMpCi0JY29uZl9sYXN0bG9nX2xvY2F0aW9uPSIvdmFyL2FkbS9sYXN0bG9nIgotCUFDX01TR19DSEVDS0lORyhbZm9yIG9ic29sZXRlIHV0bXAgYW5kIHd0bXAgaW4gc29sYXJpczIueF0pCi0Jc29sMnZlcj1gZWNobyAiJGhvc3QifCBzZWQgLWUgJ3MvLipbWzAtOV1dXC4vLydgCi0JaWYgdGVzdCAiJHNvbDJ2ZXIiIC1nZSA4OyB0aGVuCi0JCUFDX01TR19SRVNVTFQoW3llc10pCi0JCUFDX0RFRklORShbRElTQUJMRV9VVE1QXSkKLQkJQUNfREVGSU5FKFtESVNBQkxFX1dUTVBdLCBbMV0sCi0JCQlbRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB3dG1wXSkKLQllbHNlCi0JCUFDX01TR19SRVNVTFQoW25vXSkKLQlmaQotCUFDX0FSR19XSVRIKFtzb2xhcmlzLWNvbnRyYWN0c10sCi0JCVsgIC0td2l0aC1zb2xhcmlzLWNvbnRyYWN0cyBFbmFibGUgU29sYXJpcyBwcm9jZXNzIGNvbnRyYWN0cyAoZXhwZXJpbWVudGFsKV0sCi0JCVsKLQkJQUNfQ0hFQ0tfTElCKFtjb250cmFjdF0sIFtjdF90bXBsX2FjdGl2YXRlXSwKLQkJCVsgQUNfREVGSU5FKFtVU0VfU09MQVJJU19QUk9DRVNTX0NPTlRSQUNUU10sIFsxXSwKLQkJCQlbRGVmaW5lIGlmIHlvdSBoYXZlIFNvbGFyaXMgcHJvY2VzcyBjb250cmFjdHNdKQotCQkJICBTU0hETElCUz0iJFNTSERMSUJTIC1sY29udHJhY3QiCi0JCQkgIFNQQ19NU0c9InllcyIgXSwgKQotCQldLAotCSkKLQlBQ19BUkdfV0lUSChbc29sYXJpcy1wcm9qZWN0c10sCi0JCVsgIC0td2l0aC1zb2xhcmlzLXByb2plY3RzIEVuYWJsZSBTb2xhcmlzIHByb2plY3RzIChleHBlcmltZW50YWwpXSwKLQkJWwotCQlBQ19DSEVDS19MSUIoW3Byb2plY3RdLCBbc2V0cHJvamVjdF0sCi0JCQlbIEFDX0RFRklORShbVVNFX1NPTEFSSVNfUFJPSkVDVFNdLCBbMV0sCi0JCQkJW0RlZmluZSBpZiB5b3UgaGF2ZSBTb2xhcmlzIHByb2plY3RzXSkKLQkJCVNTSERMSUJTPSIkU1NIRExJQlMgLWxwcm9qZWN0IgotCQkJU1BfTVNHPSJ5ZXMiIF0sICkKLQkJXSwKLQkpCi0JOzsKLSotKi1zdW5vczQqKQotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURTVU5PUzQiCi0JQUNfQ0hFQ0tfRlVOQ1MoW2dldHB3YW5hbV0pCi0JQUNfREVGSU5FKFtQQU1fU1VOX0NPREVCQVNFXSkKLQljb25mX3V0bXBfbG9jYXRpb249L2V0Yy91dG1wCi0JY29uZl93dG1wX2xvY2F0aW9uPS92YXIvYWRtL3d0bXAKLQljb25mX2xhc3Rsb2dfbG9jYXRpb249L3Zhci9hZG0vbGFzdGxvZwotCUFDX0RFRklORShbVVNFX1BJUEVTXSkKLQk7OwotKi1uY3Itc3lzdiopCi0JTElCUz0iJExJQlMgLWxjODkiCi0JQUNfREVGSU5FKFtVU0VfUElQRVNdKQotCUFDX0RFRklORShbU1NIRF9BQ1FVSVJFU19DVFRZXSkKLQlBQ19ERUZJTkUoW1NFVEVVSURfQlJFQUtTX1NFVFVJRF0pCi0JQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVVSURdKQotCUFDX0RFRklORShbQlJPS0VOX1NFVFJFR0lEXSkKLQk7OwotKi1zbmktc3lzdiopCi0JIyAvdXNyL3VjYmxpYiBNVVNUIE5PVCBiZSBzZWFyY2hlZCBvbiBSZWxpYW50VU5JWAotCUFDX0NIRUNLX0xJQihbZGxdLCBbZGxzeW1dLCAsKQotCSMgLWxyZXNvbHYgbmVlZHMgdG8gYmUgYXQgdGhlIGVuZCBvZiBMSUJTIG9yIEROUyBsb29rdXBzIGJyZWFrCi0JQUNfQ0hFQ0tfTElCKFtyZXNvbHZdLCBbcmVzX3F1ZXJ5XSwgWyBMSUJTPSIkTElCUyAtbHJlc29sdiIgXSkKLQlJUEFERFJfSU5fRElTUExBWT15ZXMKLQlBQ19ERUZJTkUoW1VTRV9QSVBFU10pCi0JQUNfREVGSU5FKFtJUF9UT1NfSVNfQlJPS0VOXSkKLQlBQ19ERUZJTkUoW1NFVEVVSURfQlJFQUtTX1NFVFVJRF0pCi0JQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVVSURdKQotCUFDX0RFRklORShbQlJPS0VOX1NFVFJFR0lEXSkKLQlBQ19ERUZJTkUoW1NTSERfQUNRVUlSRVNfQ1RUWV0pCi0JZXh0ZXJuYWxfcGF0aF9maWxlPS9ldGMvZGVmYXVsdC9sb2dpbgotCSMgL3Vzci91Y2JsaWIvbGlidWNiLmEgbm8gbG9uZ2VyIG5lZWRlZCBvbiBSZWxpYW50VU5JWAotCSMgQXR0ZW50aW9uOiBhbHdheXMgdGFrZSBjYXJlIHRvIGJpbmQgbGlic29ja2V0IGFuZCBsaWJuc2wgYmVmb3JlIGxpYmMsCi0JIyBvdGhlcndpc2UgeW91IHdpbGwgZmluZCBsb3RzIG9mICJTSU9DR1BHUlAgZXJybm8gMjIiIG9uIHN5c2xvZwotCTs7Ci0jIFVuaXhXYXJlIDEueCwgVW5peFdhcmUgMi54LCBhbmQgb3RoZXJzIGJhc2VkIG9uIGNvZGUgZnJvbSBVbml2ZWwuCi0qLSotc3lzdjQuMiopCi0JQUNfREVGSU5FKFtVU0VfUElQRVNdKQotCUFDX0RFRklORShbU0VURVVJRF9CUkVBS1NfU0VUVUlEXSkKLQlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRVVJRF0pCi0JQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVHSURdKQotCUFDX0RFRklORShbUEFTU1dEX05FRURTX1VTRVJOQU1FXSwgWzFdLCBbbXVzdCBzdXBwbHkgdXNlcm5hbWUgdG8gcGFzc3dkXSkKLQlBQ19ERUZJTkUoW0xPQ0tFRF9QQVNTV0RfU1RSSU5HXSwgWyIqTEsqIl0pCi0JOzsKLSMgVW5peFdhcmUgNy54LCBPcGVuVU5JWCA4Ci0qLSotc3lzdjUqKQotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUR2c25wcmludGY9X3h2c25wcmludGYgLURzbnByaW50Zj1feHNucHJpbnRmIgotCUFDX0RFRklORShbVU5JWFdBUkVfTE9OR19QQVNTV09SRFNdLCBbMV0sIFtTdXBwb3J0IHBhc3N3b3JkcyA+IDggY2hhcnNdKQotCUFDX0RFRklORShbVVNFX1BJUEVTXSkKLQlBQ19ERUZJTkUoW1NFVEVVSURfQlJFQUtTX1NFVFVJRF0pCi0JQUNfREVGSU5FKFtCUk9LRU5fR0VUQUREUklORk9dKQotCUFDX0RFRklORShbQlJPS0VOX1NFVFJFVUlEXSkKLQlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRUdJRF0pCi0JQUNfREVGSU5FKFtQQVNTV0RfTkVFRFNfVVNFUk5BTUVdKQotCWNhc2UgIiRob3N0IiBpbgotCSotKi1zeXN2NVNDT19TViopCSMgU0NPIE9wZW5TZXJ2ZXIgNi54Ci0JCW1haWxkaXI9L3Zhci9zcG9vbC9tYWlsCi0JCVRFU1RfU0hFTEw9L3U5NS9iaW4vc2gKLQkJQUNfREVGSU5FKFtCUk9LRU5fTElCSUFGXSwgWzFdLAotCQkJW2lhX3VpbmZvIHJvdXRpbmVzIG5vdCBzdXBwb3J0ZWQgYnkgT1MgeWV0XSkKLQkJQUNfREVGSU5FKFtCUk9LRU5fVVBEV1RNUFhdKQotCQlBQ19DSEVDS19MSUIoW3Byb3RdLCBbZ2V0bHVpZF0sIFsgTElCUz0iJExJQlMgLWxwcm90IgotCQkJQUNfQ0hFQ0tfRlVOQ1MoW2dldGx1aWQgc2V0bHVpZF0sICwgLCBbLWxwcm90XSkKLQkJCUFDX0RFRklORShbSEFWRV9TRUNVUkVXQVJFXSkKLQkJCUFDX0RFRklORShbRElTQUJMRV9TSEFET1ddKQotCQkJXSwgLCApCi0JCTs7Ci0JKikJQUNfREVGSU5FKFtMT0NLRURfUEFTU1dEX1NUUklOR10sIFsiKkxLKiJdKQotCQljaGVja19mb3JfbGliY3J5cHRfbGF0ZXI9MQotCQk7OwotCWVzYWMKLQk7OwotKi0qLXN5c3YqKQotCTs7Ci0jIFNDTyBVTklYIGFuZCBPRU0gdmVyc2lvbnMgb2YgU0NPIFVOSVgKLSotKi1zY28zLjJ2NCopCi0JQUNfTVNHX0VSUk9SKCJUaGlzIFBsYXRmb3JtIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIikKLQk7OwotIyBTQ08gT3BlblNlcnZlciA1LngKLSotKi1zY28zLjJ2NSopCi0JaWYgdGVzdCAteiAiJEdDQyI7IHRoZW4KLQkJQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotCWZpCi0JTElCUz0iJExJQlMgLWxwcm90IC1seCAtbHRpbmZvIC1sbSIKLQlub19kZXZfcHRteD0xCi0JQUNfREVGSU5FKFtVU0VfUElQRVNdKQotCUFDX0RFRklORShbSEFWRV9TRUNVUkVXQVJFXSkKLQlBQ19ERUZJTkUoW0RJU0FCTEVfU0hBRE9XXSkKLQlBQ19ERUZJTkUoW0RJU0FCTEVfRkRfUEFTU0lOR10pCi0JQUNfREVGSU5FKFtTRVRFVUlEX0JSRUFLU19TRVRVSURdKQotCUFDX0RFRklORShbQlJPS0VOX0dFVEFERFJJTkZPXSkKLQlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRVVJRF0pCi0JQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVHSURdKQotCUFDX0RFRklORShbV0lUSF9BQkJSRVZfTk9fVFRZXSkKLQlBQ19ERUZJTkUoW0JST0tFTl9VUERXVE1QWF0pCi0JQUNfREVGSU5FKFtQQVNTV0RfTkVFRFNfVVNFUk5BTUVdKQotCUFDX0NIRUNLX0ZVTkNTKFtnZXRsdWlkIHNldGx1aWRdKQotCU1BTlRZUEU9bWFuCi0JVEVTVF9TSEVMTD1rc2gKLQk7OwotKi0qLXVuaWNvc21rKikKLQlBQ19ERUZJTkUoW05PX1NTSF9MQVNUTE9HXSwgWzFdLAotCQlbRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBsYXN0bG9nIGluIHNlc3Npb24uY10pCi0JQUNfREVGSU5FKFtTRVRFVUlEX0JSRUFLU19TRVRVSURdKQotCUFDX0RFRklORShbQlJPS0VOX1NFVFJFVUlEXSkKLQlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRUdJRF0pCi0JQUNfREVGSU5FKFtVU0VfUElQRVNdKQotCUFDX0RFRklORShbRElTQUJMRV9GRF9QQVNTSU5HXSkKLQlMREZMQUdTPSIkTERGTEFHUyIKLQlMSUJTPSIkTElCUyAtbGdlbiAtbHJzYyAtbHNoYXJlIC1sdWV4IC1sYWNtIgotCU1BTlRZUEU9Y2F0Ci0JOzsKLSotKi11bmljb3NtcCopCi0JQUNfREVGSU5FKFtTRVRFVUlEX0JSRUFLU19TRVRVSURdKQotCUFDX0RFRklORShbQlJPS0VOX1NFVFJFVUlEXSkKLQlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRUdJRF0pCi0JQUNfREVGSU5FKFtXSVRIX0FCQlJFVl9OT19UVFldKQotCUFDX0RFRklORShbVVNFX1BJUEVTXSkKLQlBQ19ERUZJTkUoW0RJU0FCTEVfRkRfUEFTU0lOR10pCi0JTERGTEFHUz0iJExERkxBR1MiCi0JTElCUz0iJExJQlMgLWxnZW4gLWxhY2lkIC1sZGIiCi0JTUFOVFlQRT1jYXQKLQk7OwotKi0qLXVuaWNvcyopCi0JQUNfREVGSU5FKFtTRVRFVUlEX0JSRUFLU19TRVRVSURdKQotCUFDX0RFRklORShbQlJPS0VOX1NFVFJFVUlEXSkKLQlBQ19ERUZJTkUoW0JST0tFTl9TRVRSRUdJRF0pCi0JQUNfREVGSU5FKFtVU0VfUElQRVNdKQotCUFDX0RFRklORShbRElTQUJMRV9GRF9QQVNTSU5HXSkKLQlBQ19ERUZJTkUoW05PX1NTSF9MQVNUTE9HXSkKLQlMREZMQUdTPSIkTERGTEFHUyAtV2wsLURtc2dsZXZlbD0zMzQ6ZmF0YWwiCi0JTElCUz0iJExJQlMgLWxnZW4gLWxyc2MgLWxzaGFyZSAtbHVleCAtbGFjbSIKLQlNQU5UWVBFPWNhdAotCTs7Ci0qLWRlYy1vc2YqKQotCUFDX01TR19DSEVDS0lORyhbZm9yIERpZ2l0YWwgVW5peCBTSUFdKQotCW5vX29zZnNpYT0iIgotCUFDX0FSR19XSVRIKFtvc2ZzaWFdLAotCQlbICAtLXdpdGgtb3Nmc2lhICAgICAgICAgICBFbmFibGUgRGlnaXRhbCBVbml4IFNJQV0sCi0JCVsKLQkJCWlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIiA7IHRoZW4KLQkJCQlBQ19NU0dfUkVTVUxUKFtkaXNhYmxlZF0pCi0JCQkJbm9fb3Nmc2lhPTEKLQkJCWZpCi0JCV0sCi0JKQotCWlmIHRlc3QgLXogIiRub19vc2ZzaWEiIDsgdGhlbgotCQlpZiB0ZXN0IC1mIC9ldGMvc2lhL21hdHJpeC5jb25mOyB0aGVuCi0JCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCQkJQUNfREVGSU5FKFtIQVZFX09TRl9TSUFdLCBbMV0sCi0JCQkJW0RlZmluZSBpZiB5b3UgaGF2ZSBEaWdpdGFsIFVuaXggU2VjdXJpdHkKLQkJCQlJbnRlZ3JhdGlvbiBBcmNoaXRlY3R1cmVdKQotCQkJQUNfREVGSU5FKFtESVNBQkxFX0xPR0lOXSwgWzFdLAotCQkJCVtEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHlvdXIKLQkJCQlzeXN0ZW0ncyBsb2dpbigpIGNhbGxdKQotCQkJQUNfREVGSU5FKFtESVNBQkxFX0ZEX1BBU1NJTkddKQotCQkJTElCUz0iJExJQlMgLWxzZWN1cml0eSAtbGRiIC1sbSAtbGF1ZCIKLQkJCVNJQV9NU0c9InllcyIKLQkJZWxzZQotCQkJQUNfTVNHX1JFU1VMVChbbm9dKQotCQkJQUNfREVGSU5FKFtMT0NLRURfUEFTU1dEX1NVQlNUUl0sIFsiTm9sb2dpbiJdLAotCQkJICBbU3RyaW5nIHVzZWQgaW4gL2V0Yy9wYXNzd2QgdG8gZGVub3RlIGxvY2tlZCBhY2NvdW50XSkKLQkJZmkKLQlmaQotCUFDX0RFRklORShbQlJPS0VOX0dFVEFERFJJTkZPXSkKLQlBQ19ERUZJTkUoW1NFVEVVSURfQlJFQUtTX1NFVFVJRF0pCi0JQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVVSURdKQotCUFDX0RFRklORShbQlJPS0VOX1NFVFJFR0lEXSkKLQlBQ19ERUZJTkUoW0JST0tFTl9SRUFEVl9DT01QQVJJU09OXSwgWzFdLCBbQ2FuJ3QgZG8gY29tcGFyaXNvbnMgb24gcmVhZHZdKQotCTs7Ci0KLSotKi1udG8tcW54KikKLQlBQ19ERUZJTkUoW1VTRV9QSVBFU10pCi0JQUNfREVGSU5FKFtOT19YMTFfVU5JWF9TT0NLRVRTXSkKLQlBQ19ERUZJTkUoW01JU1NJTkdfTkZEQklUU10sIFsxXSwgW0RlZmluZSBvbiAqbnRvLXFueCBzeXN0ZW1zXSkKLQlBQ19ERUZJTkUoW01JU1NJTkdfSE9XTUFOWV0sIFsxXSwgW0RlZmluZSBvbiAqbnRvLXFueCBzeXN0ZW1zXSkKLQlBQ19ERUZJTkUoW01JU1NJTkdfRkRfTUFTS10sIFsxXSwgW0RlZmluZSBvbiAqbnRvLXFueCBzeXN0ZW1zXSkKLQlBQ19ERUZJTkUoW0RJU0FCTEVfTEFTVExPR10pCi0JQUNfREVGSU5FKFtTU0hEX0FDUVVJUkVTX0NUVFldKQotCUFDX0RFRklORShbQlJPS0VOX1NIQURPV19FWFBJUkVdLCBbMV0sIFtRTlggc2hhZG93IHN1cHBvcnQgaXMgYnJva2VuXSkKLQllbmFibGVfZXRjX2RlZmF1bHRfbG9naW49bm8JIyBoYXMgaW5jb21wYXRpYmxlIC9ldGMvZGVmYXVsdC9sb2dpbgotCWNhc2UgIiRob3N0IiBpbgotCSotKi1udG8tcW54NiopCi0JCUFDX0RFRklORShbRElTQUJMRV9GRF9QQVNTSU5HXSkKLQkJOzsKLQllc2FjCi0JOzsKLQotKi0qLXVsdHJpeCopCi0JQUNfREVGSU5FKFtCUk9LRU5fR0VUR1JPVVBTXSwgWzFdLCBbZ2V0Z3JvdXBzKDAsTlVMTCkgd2lsbCByZXR1cm4gLTFdKQotCUFDX0RFRklORShbQlJPS0VOX01NQVBdLCBbMV0sIFtVbHRyaXggbW1hcCBjYW4ndCBtYXAgZmlsZXNdKQotCUFDX0RFRklORShbTkVFRF9TRVRQR1JQXSkKLQlBQ19ERUZJTkUoW0hBVkVfU1lTX1NZU0xPR19IXSwgWzFdLCBbRm9yY2UgdXNlIG9mIHN5cy9zeXNsb2cuaCBvbiBVbHRyaXhdKQotCTs7Ci0KLSotKi1seW54b3MpCi0gICAgICAgIENGTEFHUz0iJENGTEFHUyAtRF9fTk9fSU5DTFVERV9XQVJOX18iCi0JQUNfREVGSU5FKFtNSVNTSU5HX0hPV01BTlldKQotICAgICAgICBBQ19ERUZJTkUoW0JST0tFTl9TRVRWQlVGXSwgWzFdLCBbTHlueE9TIGhhcyBicm9rZW4gc2V0dmJ1ZigpIGltcGxlbWVudGF0aW9uXSkKLSAgICAgICAgOzsKLWVzYWMKLQotQUNfTVNHX0NIRUNLSU5HKFtjb21waWxlciBhbmQgZmxhZ3MgZm9yIHNhbml0eV0pCi1BQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN0ZGlvLmg+IF1dLCBbWyBleGl0KDApOyBdXSldLAotCVsJQUNfTVNHX1JFU1VMVChbeWVzXSkgXSwKLQlbCi0JCUFDX01TR19SRVNVTFQoW25vXSkKLQkJQUNfTVNHX0VSUk9SKFsqKiogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSB3b3JraW5nIGV4ZWN1dGFibGVzLCBjaGVjayBjb25maWcubG9nICoqKl0pCi0JXSwKLQlbCUFDX01TR19XQVJOKFtjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyBjb21waWxlciBzYW5pdHldKSBdCi0pCi0KLWRubCBDaGVja3MgZm9yIGhlYWRlciBmaWxlcy4KLSMgQ2hlY2tzIGZvciBsaWJyYXJpZXMuCi1BQ19DSEVDS19GVU5DKFt5cF9tYXRjaF0sICwgW0FDX0NIRUNLX0xJQihbbnNsXSwgW3lwX21hdGNoXSldKQotQUNfQ0hFQ0tfRlVOQyhbc2V0c29ja29wdF0sICwgW0FDX0NIRUNLX0xJQihbc29ja2V0XSwgW3NldHNvY2tvcHRdKV0pCi0KLWRubCBJUklYIGFuZCBTb2xhcmlzIDIuNS4xIGhhdmUgZGlybmFtZSgpIGluIGxpYmdlbgotQUNfQ0hFQ0tfRlVOQ1MoW2Rpcm5hbWVdLCBbQUNfQ0hFQ0tfSEVBREVSUyhbbGliZ2VuLmhdKV0gLCBbCi0JQUNfQ0hFQ0tfTElCKFtnZW5dLCBbZGlybmFtZV0sIFsKLQkJQUNfQ0FDSEVfQ0hFQ0soW2ZvciBicm9rZW4gZGlybmFtZV0sCi0JCQlhY19jdl9oYXZlX2Jyb2tlbl9kaXJuYW1lLCBbCi0JCQlzYXZlX0xJQlM9IiRMSUJTIgotCQkJTElCUz0iJExJQlMgLWxnZW4iCi0JCQlBQ19SVU5fSUZFTFNFKAotCQkJCVtBQ19MQU5HX1NPVVJDRShbWwotI2luY2x1ZGUgPGxpYmdlbi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgICBjaGFyICpzLCBidWZbMzJdOwotCi0gICAgc3RybmNweShidWYsIi9ldGMiLCAzMik7Ci0gICAgcyA9IGRpcm5hbWUoYnVmKTsKLSAgICBpZiAoIXMgfHwgc3RybmNtcChzLCAiLyIsIDMyKSAhPSAwKSB7Ci0JZXhpdCgxKTsKLSAgICB9IGVsc2UgewotCWV4aXQoMCk7Ci0gICAgfQotfQotCQkJCV1dKV0sCi0JCQkJWyBhY19jdl9oYXZlX2Jyb2tlbl9kaXJuYW1lPSJubyIgXSwKLQkJCQlbIGFjX2N2X2hhdmVfYnJva2VuX2Rpcm5hbWU9InllcyIgXSwKLQkJCQlbIGFjX2N2X2hhdmVfYnJva2VuX2Rpcm5hbWU9Im5vIiBdLAotCQkJKQotCQkJTElCUz0iJHNhdmVfTElCUyIKLQkJXSkKLQkJaWYgdGVzdCAieCRhY19jdl9oYXZlX2Jyb2tlbl9kaXJuYW1lIiA9ICJ4bm8iIDsgdGhlbgotCQkJTElCUz0iJExJQlMgLWxnZW4iCi0JCQlBQ19ERUZJTkUoW0hBVkVfRElSTkFNRV0pCi0JCQlBQ19DSEVDS19IRUFERVJTKFtsaWJnZW4uaF0pCi0JCWZpCi0JXSkKLV0pCi0KLUFDX0NIRUNLX0ZVTkMoW2dldHNwbmFtXSwgLAotCVtBQ19DSEVDS19MSUIoW2dlbl0sIFtnZXRzcG5hbV0sIFtMSUJTPSIkTElCUyAtbGdlbiJdKV0pCi1BQ19TRUFSQ0hfTElCUyhbYmFzZW5hbWVdLCBbZ2VuXSwgW0FDX0RFRklORShbSEFWRV9CQVNFTkFNRV0sIFsxXSwKLQlbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBiYXNlbmFtZSBmdW5jdGlvbi5dKV0pCi0KLWRubCB6bGliIGlzIHJlcXVpcmVkCi1BQ19BUkdfV0lUSChbemxpYl0sCi0JWyAgLS13aXRoLXpsaWI9UEFUSCAgICAgICAgVXNlIHpsaWIgaW4gUEFUSF0sCi0JWyBpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyIgOyB0aGVuCi0JCUFDX01TR19FUlJPUihbKioqIHpsaWIgaXMgcmVxdWlyZWQgKioqXSkKLQkgIGVsaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieHllcyI7IHRoZW4KLQkJaWYgdGVzdCAtZCAiJHdpdGh2YWwvbGliIjsgdGhlbgotCQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCi0JCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAtUiR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCi0JCQllbHNlCi0JCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAke0xERkxBR1N9IgotCQkJZmkKLQkJZWxzZQotCQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCi0JCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9IC1SJHt3aXRodmFsfSAke0xERkxBR1N9IgotCQkJZWxzZQotCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfSAke0xERkxBR1N9IgotCQkJZmkKLQkJZmkKLQkJaWYgdGVzdCAtZCAiJHdpdGh2YWwvaW5jbHVkZSI7IHRoZW4KLQkJCUNQUEZMQUdTPSItSSR7d2l0aHZhbH0vaW5jbHVkZSAke0NQUEZMQUdTfSIKLQkJZWxzZQotCQkJQ1BQRkxBR1M9Ii1JJHt3aXRodmFsfSAke0NQUEZMQUdTfSIKLQkJZmkKLQlmaSBdCi0pCi0KLUFDX0NIRUNLX0hFQURFUihbemxpYi5oXSwgLFtBQ19NU0dfRVJST1IoWyoqKiB6bGliLmggbWlzc2luZyAtIHBsZWFzZSBpbnN0YWxsIGZpcnN0IG9yIGNoZWNrIGNvbmZpZy5sb2cgKioqXSldKQotQUNfQ0hFQ0tfTElCKFt6XSwgW2RlZmxhdGVdLCAsCi0JWwotCQlzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotCQlzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKLQkJc2F2ZV9MSUJTPSIkTElCUyIKLQkJZG5sIENoZWNrIGRlZmF1bHQgemxpYiBpbnN0YWxsIGRpcgotCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KLQkJCUxERkxBR1M9Ii1ML3Vzci9sb2NhbC9saWIgLVIvdXNyL2xvY2FsL2xpYiAke3NhdmVkX0xERkxBR1N9IgotCQllbHNlCi0JCQlMREZMQUdTPSItTC91c3IvbG9jYWwvbGliICR7c2F2ZWRfTERGTEFHU30iCi0JCWZpCi0JCUNQUEZMQUdTPSItSS91c3IvbG9jYWwvaW5jbHVkZSAke3NhdmVkX0NQUEZMQUdTfSIKLQkJTElCUz0iJExJQlMgLWx6IgotCQlBQ19UUllfTElOS19GVU5DKFtkZWZsYXRlXSwgW0FDX0RFRklORShbSEFWRV9MSUJaXSldLAotCQkJWwotCQkJCUFDX01TR19FUlJPUihbKioqIHpsaWIgbWlzc2luZyAtIHBsZWFzZSBpbnN0YWxsIGZpcnN0IG9yIGNoZWNrIGNvbmZpZy5sb2cgKioqXSkKLQkJCV0KLQkJKQotCV0KLSkKLQotQUNfQVJHX1dJVEgoW3psaWItdmVyc2lvbi1jaGVja10sCi0JWyAgLS13aXRob3V0LXpsaWItdmVyc2lvbi1jaGVjayBEaXNhYmxlIHpsaWIgdmVyc2lvbiBjaGVja10sCi0JWyAgaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4bm8iIDsgdGhlbgotCQl6bGliX2NoZWNrX25vbmZhdGFsPTEKLQkgICBmaQotCV0KLSkKLQotQUNfTVNHX0NIRUNLSU5HKFtmb3IgcG9zc2libHkgYnVnZ3kgemxpYl0pCi1BQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHpsaWIuaD4KLQldXSwKLQlbWwotCWludCBhPTAsIGI9MCwgYz0wLCBkPTAsIG4sIHY7Ci0JbiA9IHNzY2FuZihaTElCX1ZFUlNJT04sICIlZC4lZC4lZC4lZCIsICZhLCAmYiwgJmMsICZkKTsKLQlpZiAobiAhPSAzICYmIG4gIT0gNCkKLQkJZXhpdCgxKTsKLQl2ID0gYSoxMDAwMDAwICsgYioxMDAwMCArIGMqMTAwICsgZDsKLQlmcHJpbnRmKHN0ZGVyciwgImZvdW5kIHpsaWIgdmVyc2lvbiAlcyAoJWQpXG4iLCBaTElCX1ZFUlNJT04sIHYpOwotCi0JLyogMS4xLjQgaXMgT0sgKi8KLQlpZiAoYSA9PSAxICYmIGIgPT0gMSAmJiBjID49IDQpCi0JCWV4aXQoMCk7Ci0KLQkvKiAxLjIuMyBhbmQgdXAgYXJlIE9LICovCi0JaWYgKHYgPj0gMTAyMDMwMCkKLQkJZXhpdCgwKTsKLQotCWV4aXQoMik7Ci0JXV0pXSwKLQlBQ19NU0dfUkVTVUxUKFtub10pLAotCVsgQUNfTVNHX1JFU1VMVChbeWVzXSkKLQkgIGlmIHRlc3QgLXogIiR6bGliX2NoZWNrX25vbmZhdGFsIiA7IHRoZW4KLQkJQUNfTVNHX0VSUk9SKFsqKiogemxpYiB0b28gb2xkIC0gY2hlY2sgY29uZmlnLmxvZyAqKioKLVlvdXIgcmVwb3J0ZWQgemxpYiB2ZXJzaW9uIGhhcyBrbm93biBzZWN1cml0eSBwcm9ibGVtcy4gIEl0J3MgcG9zc2libGUgeW91cgotdmVuZG9yIGhhcyBmaXhlZCB0aGVzZSBwcm9ibGVtcyB3aXRob3V0IGNoYW5naW5nIHRoZSB2ZXJzaW9uIG51bWJlci4gIElmIHlvdQotYXJlIHN1cmUgdGhpcyBpcyB0aGUgY2FzZSwgeW91IGNhbiBkaXNhYmxlIHRoZSBjaGVjayBieSBydW5uaW5nCi0iLi9jb25maWd1cmUgLS13aXRob3V0LXpsaWItdmVyc2lvbi1jaGVjayIuCi1JZiB5b3UgYXJlIGluIGRvdWJ0LCB1cGdyYWRlIHpsaWIgdG8gdmVyc2lvbiAxLjIuMyBvciBncmVhdGVyLgotU2VlIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi8gZm9yIGRldGFpbHMuXSkKLQkgIGVsc2UKLQkJQUNfTVNHX1dBUk4oW3psaWIgdmVyc2lvbiBtYXkgaGF2ZSBzZWN1cml0eSBwcm9ibGVtc10pCi0JICBmaQotCV0sCi0JWwlBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmcgemxpYiB2ZXJzaW9uXSkgXQotKQotCi1kbmwgVW5peFdhcmUgMi54Ci1BQ19DSEVDS19GVU5DKFtzdHJjYXNlY21wXSwKLQlbXSwgWyBBQ19DSEVDS19MSUIoW3Jlc29sdl0sIFtzdHJjYXNlY21wXSwgW0xJQlM9IiRMSUJTIC1scmVzb2x2Il0pIF0KLSkKLUFDX0NIRUNLX0ZVTkNTKFt1dGltZXNdLAotCVtdLCBbIEFDX0NIRUNLX0xJQihbYzg5XSwgW3V0aW1lc10sIFtBQ19ERUZJTkUoW0hBVkVfVVRJTUVTXSkKLQkJCQkJTElCUz0iJExJQlMgLWxjODkiXSkgXQotKQotCi1kbmwgICAgQ2hlY2tzIGZvciBsaWJ1dGlsIGZ1bmN0aW9ucwotQUNfQ0hFQ0tfSEVBREVSUyhbbGlidXRpbC5oXSkKLUFDX1NFQVJDSF9MSUJTKFtsb2dpbl0sIFt1dGlsIGJzZF0sIFtBQ19ERUZJTkUoW0hBVkVfTE9HSU5dLCBbMV0sCi0JW0RlZmluZSBpZiB5b3VyIGxpYnJhcmllcyBkZWZpbmUgbG9naW4oKV0pXSkKLUFDX0NIRUNLX0ZVTkNTKFtmbXRfc2NhbGVkIGxvZ291dCB1cGR3dG1wIGxvZ3d0bXBdKQotCi1BQ19GVU5DX1NUUkZUSU1FCi0KLSMgQ2hlY2sgZm9yIEFMVERJUkZVTkMgZ2xvYigpIGV4dGVuc2lvbgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgR0xPQl9BTFRESVJGVU5DIHN1cHBvcnRdKQotQUNfRUdSRVBfQ1BQKFtGT1VORElUXSwKLQlbCi0JCSNpbmNsdWRlIDxnbG9iLmg+Ci0JCSNpZmRlZiBHTE9CX0FMVERJUkZVTkMKLQkJRk9VTkRJVAotCQkjZW5kaWYKLQldLAotCVsKLQkJQUNfREVGSU5FKFtHTE9CX0hBU19BTFRESVJGVU5DXSwgWzFdLAotCQkJW0RlZmluZSBpZiB5b3VyIHN5c3RlbSBnbG9iKCkgZnVuY3Rpb24gaGFzCi0JCQl0aGUgR0xPQl9BTFRESVJGVU5DIGV4dGVuc2lvbl0pCi0JCUFDX01TR19SRVNVTFQoW3llc10pCi0JXSwKLQlbCi0JCUFDX01TR19SRVNVTFQoW25vXSkKLQldCi0pCi0KLSMgQ2hlY2sgZm9yIGcuZ2xfbWF0Y2hjIGdsb2IoKSBleHRlbnNpb24KLUFDX01TR19DSEVDS0lORyhbZm9yIGdsX21hdGNoYyBmaWVsZCBpbiBnbG9iX3RdKQotQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8Z2xvYi5oPiBdXSwKLQlbWyBnbG9iX3QgZzsgZy5nbF9tYXRjaGMgPSAxOyBdXSldLAotCVsKLQkJQUNfREVGSU5FKFtHTE9CX0hBU19HTF9NQVRDSENdLCBbMV0sCi0JCQlbRGVmaW5lIGlmIHlvdXIgc3lzdGVtIGdsb2IoKSBmdW5jdGlvbiBoYXMKLQkJCWdsX21hdGNoYyBvcHRpb25zIGluIGdsb2JfdF0pCi0JCUFDX01TR19SRVNVTFQoW3llc10pCi0JXSwgWwotCQlBQ19NU0dfUkVTVUxUKFtub10pCi1dKQotCi0jIENoZWNrIGZvciBnLmdsX3N0YXR2IGdsb2IoKSBleHRlbnNpb24KLUFDX01TR19DSEVDS0lORyhbZm9yIGdsX3N0YXR2IGFuZCBHTE9CX0tFRVBTVEFUIGV4dGVuc2lvbnMgZm9yIGdsb2JdKQotQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8Z2xvYi5oPiBdXSwgW1sKLSNpZm5kZWYgR0xPQl9LRUVQU1RBVAotI2Vycm9yICJnbG9iIGRvZXMgbm90IHN1cHBvcnQgR0xPQl9LRUVQU1RBVCBleHRlbnNpb24iCi0jZW5kaWYKLWdsb2JfdCBnOwotZy5nbF9zdGF0diA9IE5VTEw7Ci1dXSldLAotCVsKLQkJQUNfREVGSU5FKFtHTE9CX0hBU19HTF9TVEFUVl0sIFsxXSwKLQkJCVtEZWZpbmUgaWYgeW91ciBzeXN0ZW0gZ2xvYigpIGZ1bmN0aW9uIGhhcwotCQkJZ2xfc3RhdHYgb3B0aW9ucyBpbiBnbG9iX3RdKQotCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCV0sIFsKLQkJQUNfTVNHX1JFU1VMVChbbm9dKQotCQotXSkKLQotQUNfQ0hFQ0tfREVDTFMoW0dMT0JfTk9NQVRDSF0sICwgLCBbI2luY2x1ZGUgPGdsb2IuaD5dKQotCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc3RydWN0IGRpcmVudCBhbGxvY2F0ZXMgc3BhY2UgZm9yIGRfbmFtZV0pCi1BQ19SVU5fSUZFTFNFKAotCVtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD5dXSwKLQlbWwotCXN0cnVjdCBkaXJlbnQgZDsKLQlleGl0KHNpemVvZihkLmRfbmFtZSk8PXNpemVvZihjaGFyKSk7Ci0JXV0pXSwKLQlbQUNfTVNHX1JFU1VMVChbeWVzXSldLAotCVsKLQkJQUNfTVNHX1JFU1VMVChbbm9dKQotCQlBQ19ERUZJTkUoW0JST0tFTl9PTkVfQllURV9ESVJFTlRfRF9OQU1FXSwgWzFdLAotCQkJW0RlZmluZSBpZiB5b3VyIHN0cnVjdCBkaXJlbnQgZXhwZWN0cyB5b3UgdG8KLQkJCWFsbG9jYXRlIGV4dHJhIHNwYWNlIGZvciBkX25hbWVdKQotCV0sCi0JWwotCQlBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBhc3N1bWluZyBCUk9LRU5fT05FX0JZVEVfRElSRU5UX0RfTkFNRV0pCi0JCUFDX0RFRklORShbQlJPS0VOX09ORV9CWVRFX0RJUkVOVF9EX05BTUVdKQotCV0KLSkKLQotQUNfTVNHX0NIRUNLSU5HKFtmb3IgL3Byb2MvcGlkL2ZkIGRpcmVjdG9yeV0pCi1pZiB0ZXN0IC1kICIvcHJvYy8kJC9mZCIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX1BST0NfUElEXSwgWzFdLCBbRGVmaW5lIGlmIHlvdSBoYXZlIC9wcm9jLyRwaWQvZmRdKQotCUFDX01TR19SRVNVTFQoW3llc10pCi1lbHNlCi0JQUNfTVNHX1JFU1VMVChbbm9dKQotZmkKLQotIyBDaGVjayB3aGV0aGVyIHVzZXIgd2FudHMgUy9LZXkgc3VwcG9ydAotU0tFWV9NU0c9Im5vIgotQUNfQVJHX1dJVEgoW3NrZXldLAotCVsgIC0td2l0aC1za2V5W1s9UEFUSF1dICAgICAgRW5hYmxlIFMvS2V5IHN1cHBvcnQgKG9wdGlvbmFsbHkgaW4gUEFUSCldLAotCVsKLQkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQotCQkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieHllcyIgOyB0aGVuCi0JCQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSR7d2l0aHZhbH0vaW5jbHVkZSIKLQkJCQlMREZMQUdTPSIkTERGTEFHUyAtTCR7d2l0aHZhbH0vbGliIgotCQkJZmkKLQotCQkJQUNfREVGSU5FKFtTS0VZXSwgWzFdLCBbRGVmaW5lIGlmIHlvdSB3YW50IFMvS2V5IHN1cHBvcnRdKQotCQkJTElCUz0iLWxza2V5ICRMSUJTIgotCQkJU0tFWV9NU0c9InllcyIKLQotCQkJQUNfTVNHX0NIRUNLSU5HKFtmb3Igcy9rZXkgc3VwcG9ydF0pCi0JCQlBQ19MSU5LX0lGRUxTRSgKLQkJCQlbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxza2V5Lmg+Ci0JCQkJXV0sIFtbCi0JY2hhciAqZmYgPSBza2V5X2tleWluZm8oIiIpOyBmZj0iIjsKLQlleGl0KDApOwotCQkJCV1dKV0sCi0JCQkJW0FDX01TR19SRVNVTFQoW3llc10pXSwKLQkJCQlbCi0JCQkJCUFDX01TR19SRVNVTFQoW25vXSkKLQkJCQkJQUNfTVNHX0VSUk9SKFsqKiBJbmNvbXBsZXRlIG9yIG1pc3Npbmcgcy9rZXkgbGlicmFyaWVzLl0pCi0JCQkJXSkKLSAgICAgICAgICAgICAgICAgCUFDX01TR19DSEVDS0lORyhbaWYgc2tleWNoYWxsZW5nZSB0YWtlcyA0IGFyZ3VtZW50c10pCi0JCQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxza2V5Lmg+Ci0JCQkJXV0sIFtbCi0JKHZvaWQpc2tleWNoYWxsZW5nZShOVUxMLCJuYW1lIiwiIiwwKTsKLQkJCQldXSldLAotCQkJWwotCQkJCUFDX01TR19SRVNVTFQoW3llc10pCi0JCQkJQUNfREVGSU5FKFtTS0VZQ0hBTExFTkdFXzRBUkddLCBbMV0sCi0JCQkJCVtEZWZpbmUgaWYgeW91ciBza2V5Y2hhbGxlbmdlKCkKLQkJCQkJZnVuY3Rpb24gdGFrZXMgNCBhcmd1bWVudHMgKE5ldEJTRCldKV0sCi0JCQlbCi0JCQkJQUNfTVNHX1JFU1VMVChbbm9dKQotCQkJXSkKLQkJZmkKLQldCi0pCi0KLSMgQ2hlY2sgd2hldGhlciB1c2VyIHdhbnRzIFRDUCB3cmFwcGVycyBzdXBwb3J0Ci1UQ1BXX01TRz0ibm8iCi1BQ19BUkdfV0lUSChbdGNwLXdyYXBwZXJzXSwKLQlbICAtLXdpdGgtdGNwLXdyYXBwZXJzW1s9UEFUSF1dIEVuYWJsZSB0Y3B3cmFwcGVycyBzdXBwb3J0IChvcHRpb25hbGx5IGluIFBBVEgpXSwKLQlbCi0JCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCi0JCQlzYXZlZF9MSUJTPSIkTElCUyIKLQkJCXNhdmVkX0xERkxBR1M9IiRMREZMQUdTIgotCQkJc2F2ZWRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLQkJCWlmIHRlc3QgLW4gIiR7d2l0aHZhbH0iICYmIFwKLQkJCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0JCQkJaWYgdGVzdCAtZCAiJHt3aXRodmFsfS9saWIiOyB0aGVuCi0JCQkJCWlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgotCQkJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAtUiR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCi0JCQkJCWVsc2UKLQkJCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfS9saWIgJHtMREZMQUdTfSIKLQkJCQkJZmkKLQkJCQllbHNlCi0JCQkJCWlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgotCQkJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9IC1SJHt3aXRodmFsfSAke0xERkxBR1N9IgotCQkJCQllbHNlCi0JCQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0gJHtMREZMQUdTfSIKLQkJCQkJZmkKLQkJCQlmaQotCQkJCWlmIHRlc3QgLWQgIiR7d2l0aHZhbH0vaW5jbHVkZSI7IHRoZW4KLQkJCQkJQ1BQRkxBR1M9Ii1JJHt3aXRodmFsfS9pbmNsdWRlICR7Q1BQRkxBR1N9IgotCQkJCWVsc2UKLQkJCQkJQ1BQRkxBR1M9Ii1JJHt3aXRodmFsfSAke0NQUEZMQUdTfSIKLQkJCQlmaQotCQkJZmkKLQkJCUxJQlM9Ii1sd3JhcCAkTElCUyIKLQkJCUFDX01TR19DSEVDS0lORyhbZm9yIGxpYndyYXBdKQotCQkJQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8dGNwZC5oPgotaW50IGRlbnlfc2V2ZXJpdHkgPSAwLCBhbGxvd19zZXZlcml0eSA9IDA7Ci0JCQkJXV0sIFtbCi0JaG9zdHNfYWNjZXNzKDApOwotCQkJCV1dKV0sIFsKLQkJCQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKLQkJCQkJQUNfREVGSU5FKFtMSUJXUkFQXSwgWzFdLAotCQkJCQkJW0RlZmluZSBpZiB5b3Ugd2FudAotCQkJCQkJVENQIFdyYXBwZXJzIHN1cHBvcnRdKQotCQkJCQlTU0hETElCUz0iJFNTSERMSUJTIC1sd3JhcCIKLQkJCQkJVENQV19NU0c9InllcyIKLQkJCQldLCBbCi0JCQkJCUFDX01TR19FUlJPUihbKioqIGxpYndyYXAgbWlzc2luZ10pCi0JCQkJCi0JCQldKQotCQkJTElCUz0iJHNhdmVkX0xJQlMiCi0JCWZpCi0JXQotKQotCi0jIENoZWNrIHdoZXRoZXIgdXNlciB3YW50cyBsaWJlZGl0IHN1cHBvcnQKLUxJQkVESVRfTVNHPSJubyIKLUFDX0FSR19XSVRIKFtsaWJlZGl0XSwKLQlbICAtLXdpdGgtbGliZWRpdFtbPVBBVEhdXSAgIEVuYWJsZSBsaWJlZGl0IHN1cHBvcnQgZm9yIHNmdHBdLAotCVsgaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQkJaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4eWVzIiA7IHRoZW4KLQkJCUFDX1BBVEhfUFJPRyhbUEtHQ09ORklHXSwgW3BrZy1jb25maWddLCBbbm9dKQotCQkJaWYgdGVzdCAieCRQS0dDT05GSUciICE9ICJ4bm8iOyB0aGVuCi0JCQkJQUNfTVNHX0NIRUNLSU5HKFtpZiAkUEtHQ09ORklHIGtub3dzIGFib3V0IGxpYmVkaXRdKQotCQkJIAlpZiAiJFBLR0NPTkZJRyIgbGliZWRpdDsgdGhlbgotCQkJCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCQkJCQl1c2VfcGtnY29uZmlnX2Zvcl9saWJlZGl0PXllcwotCQkJCWVsc2UKLQkJCQkJQUNfTVNHX1JFU1VMVChbbm9dKQotCQkJCWZpCi0JCQlmaQotCQllbHNlCi0JCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHt3aXRodmFsfS9pbmNsdWRlIgotCQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCi0JCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAtUiR7d2l0aHZhbH0vbGliICR7TERGTEFHU30iCi0JCQllbHNlCi0JCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYiAke0xERkxBR1N9IgotCQkJZmkKLQkJZmkKLQkJaWYgdGVzdCAieCR1c2VfcGtnY29uZmlnX2Zvcl9saWJlZGl0IiA9ICJ4eWVzIjsgdGhlbgotCQkJTElCRURJVD1gJFBLR0NPTkZJRyAtLWxpYnMtb25seS1sIGxpYmVkaXRgCi0JCQlDUFBGTEFHUz0iJENQUEZMQUdTIGAkUEtHQ09ORklHIC0tY2ZsYWdzIGxpYmVkaXRgIgotCQllbHNlCi0JCQlMSUJFRElUPSItbGVkaXQgLWxjdXJzZXMiCi0JCWZpCi0JCU9USEVSTElCUz1gZWNobyAkTElCRURJVCB8IHNlZCAncy8tbGVkaXQvLydgCi0JCUFDX0NIRUNLX0xJQihbZWRpdF0sIFtlbF9pbml0XSwKLQkJCVsgQUNfREVGSU5FKFtVU0VfTElCRURJVF0sIFsxXSwgW1VzZSBsaWJlZGl0IGZvciBzZnRwXSkKLQkJCSAgTElCRURJVF9NU0c9InllcyIKLQkJCSAgQUNfU1VCU1QoW0xJQkVESVRdKQotCQkJXSwKLQkJCVsgQUNfTVNHX0VSUk9SKFtsaWJlZGl0IG5vdCBmb3VuZF0pIF0sCi0JCQlbICRPVEhFUkxJQlMgXQotCQkpCi0JCUFDX01TR19DSEVDS0lORyhbaWYgbGliZWRpdCB2ZXJzaW9uIGlzIGNvbXBhdGlibGVdKQotCQlBQ19DT01QSUxFX0lGRUxTRSgKLQkJICAgIFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPGhpc3RlZGl0Lmg+IF1dLAotCQkgICAgW1sKLQlpbnQgaSA9IEhfU0VUU0laRTsKLQllbF9pbml0KCIiLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlleGl0KDApOwotCQkgICAgXV0pXSwKLQkJICAgIFsgQUNfTVNHX1JFU1VMVChbeWVzXSkgXSwKLQkJICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQotCQkgICAgICBBQ19NU0dfRVJST1IoW2xpYmVkaXQgdmVyc2lvbiBpcyBub3QgY29tcGF0aWJsZV0pIF0KLQkJKQotCWZpIF0KLSkKLQotQVVESVRfTU9EVUxFPW5vbmUKLUFDX0FSR19XSVRIKFthdWRpdF0sCi0JWyAgLS13aXRoLWF1ZGl0PW1vZHVsZSAgICAgRW5hYmxlIGF1ZGl0IHN1cHBvcnQgKG1vZHVsZXM9ZGVidWcsYnNtLGxpbnV4KV0sCi0JWwotCSAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3VwcG9ydGVkIGF1ZGl0IG1vZHVsZV0pCi0JICBjYXNlICIkd2l0aHZhbCIgaW4KLQkgIGJzbSkKLQkJQUNfTVNHX1JFU1VMVChbYnNtXSkKLQkJQVVESVRfTU9EVUxFPWJzbQotCQlkbmwgICAgQ2hlY2tzIGZvciBoZWFkZXJzLCBsaWJzIGFuZCBmdW5jdGlvbnMKLQkJQUNfQ0hFQ0tfSEVBREVSUyhbYnNtL2F1ZGl0LmhdLCBbXSwKLQkJICAgIFtBQ19NU0dfRVJST1IoW0JTTSBlbmFibGVkIGFuZCBic20vYXVkaXQuaCBub3QgZm91bmRdKV0sCi0JCSAgICBbCi0jaWZkZWYgSEFWRV9USU1FX0gKLSMgaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0JCSAgICBdCi0pCi0JCUFDX0NIRUNLX0xJQihbYnNtXSwgW2dldGF1ZGl0XSwgW10sCi0JCSAgICBbQUNfTVNHX0VSUk9SKFtCU00gZW5hYmxlZCBhbmQgcmVxdWlyZWQgbGlicmFyeSBub3QgZm91bmRdKV0pCi0JCUFDX0NIRUNLX0ZVTkNTKFtnZXRhdWRpdF0sIFtdLAotCQkgICAgW0FDX01TR19FUlJPUihbQlNNIGVuYWJsZWQgYW5kIHJlcXVpcmVkIGZ1bmN0aW9uIG5vdCBmb3VuZF0pXSkKLQkJIyBUaGVzZSBhcmUgb3B0aW9uYWwKLQkJQUNfQ0hFQ0tfRlVOQ1MoW2dldGF1ZGl0X2FkZHIgYXVnX2dldF9tYWNoaW5lXSkKLQkJQUNfREVGSU5FKFtVU0VfQlNNX0FVRElUXSwgWzFdLCBbVXNlIEJTTSBhdWRpdCBtb2R1bGVdKQotCQk7OwotCSAgbGludXgpCi0JCUFDX01TR19SRVNVTFQoW2xpbnV4XSkKLQkJQVVESVRfTU9EVUxFPWxpbnV4Ci0JCWRubCAgICBDaGVja3MgZm9yIGhlYWRlcnMsIGxpYnMgYW5kIGZ1bmN0aW9ucwotCQlBQ19DSEVDS19IRUFERVJTKFtsaWJhdWRpdC5oXSkKLQkJU1NIRExJQlM9IiRTU0hETElCUyAtbGF1ZGl0IgotCQlBQ19ERUZJTkUoW1VTRV9MSU5VWF9BVURJVF0sIFsxXSwgW1VzZSBMaW51eCBhdWRpdCBtb2R1bGVdKQotCQk7OwotCSAgZGVidWcpCi0JCUFVRElUX01PRFVMRT1kZWJ1ZwotCQlBQ19NU0dfUkVTVUxUKFtkZWJ1Z10pCi0JCUFDX0RFRklORShbU1NIX0FVRElUX0VWRU5UU10sIFsxXSwgW1VzZSBhdWRpdCBkZWJ1Z2dpbmcgbW9kdWxlXSkKLQkJOzsKLQkgIG5vKQotCQlBQ19NU0dfUkVTVUxUKFtub10pCi0JCTs7Ci0JICAqKQotCQlBQ19NU0dfRVJST1IoW1Vua25vd24gYXVkaXQgbW9kdWxlICR3aXRodmFsXSkKLQkJOzsKLQllc2FjIF0KLSkKLQotZG5sICAgIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuIFBsZWFzZSBrZWVwIGluIGFscGhhYmV0aWNhbCBvcmRlcgotQUNfQ0hFQ0tfRlVOQ1MoWyBcCi0JYXJjNHJhbmRvbSBcCi0JYXJjNHJhbmRvbV9idWYgXAotCWFyYzRyYW5kb21fdW5pZm9ybSBcCi0JYXNwcmludGYgXAotCWI2NF9udG9wIFwKLQlfX2I2NF9udG9wIFwKLQliNjRfcHRvbiBcCi0JX19iNjRfcHRvbiBcCi0JYmNvcHkgXAotCWJpbmRyZXN2cG9ydF9zYSBcCi0JY2xvY2sgXAotCWNsb3NlZnJvbSBcCi0JZGlyZmQgXAotCWZjaG1vZCBcCi0JZmNob3duIFwKLQlmcmVlYWRkcmluZm8gXAotCWZzdGF0dmZzIFwKLQlmdXRpbWVzIFwKLQlnZXRhZGRyaW5mbyBcCi0JZ2V0Y3dkIFwKLQlnZXRncm91cGxpc3QgXAotCWdldG5hbWVpbmZvIFwKLQlnZXRvcHQgXAotCWdldHBlZXJlaWQgXAotCWdldHBlZXJ1Y3JlZCBcCi0JX2dldHB0eSBcCi0JZ2V0cmxpbWl0IFwKLQlnZXR0dHllbnQgXAotCWdsb2IgXAotCWdyb3VwX2Zyb21fZ2lkIFwKLQlpbmV0X2F0b24gXAotCWluZXRfbnRvYSBcCi0JaW5ldF9udG9wIFwKLQlpbm5ldGdyIFwKLQlsb2dpbl9nZXRjYXBib29sIFwKLQltZDVfY3J5cHQgXAotCW1lbW1vdmUgXAotCW1rZHRlbXAgXAotCW1tYXAgXAotCW5nZXRhZGRyaW5mbyBcCi0JbnNsZWVwIFwKLQlvZ2V0YWRkcmluZm8gXAotCW9wZW5sb2dfciBcCi0Jb3BlbnB0eSBcCi0JcG9sbCBcCi0JcHJjdGwgXAotCXBzdGF0IFwKLQlyZWFkcGFzc3BocmFzZSBcCi0JcmVhbHBhdGggXAotCXJlY3Ztc2cgXAotCXJyZXN2cG9ydF9hZiBcCi0Jc2VuZG1zZyBcCi0Jc2V0ZHRhYmxlc2l6ZSBcCi0Jc2V0ZWdpZCBcCi0Jc2V0ZW52IFwKLQlzZXRldWlkIFwKLQlzZXRncm91cGVudCBcCi0Jc2V0Z3JvdXBzIFwKLQlzZXRsb2dpbiBcCi0Jc2V0cGFzc2VudFwKLQlzZXRwY3JlZCBcCi0Jc2V0cHJvY3RpdGxlIFwKLQlzZXRyZWdpZCBcCi0Jc2V0cmV1aWQgXAotCXNldHJsaW1pdCBcCi0Jc2V0c2lkIFwKLQlzZXR2YnVmIFwKLQlzaWdhY3Rpb24gXAotCXNpZ3ZlYyBcCi0Jc25wcmludGYgXAotCXNvY2tldHBhaXIgXAotCXN0YXRmcyBcCi0Jc3RhdHZmcyBcCi0Jc3RyZHVwIFwKLQlzdHJlcnJvciBcCi0Jc3RybGNhdCBcCi0Jc3RybGNweSBcCi0Jc3RybW9kZSBcCi0Jc3RybnZpcyBcCi0Jc3RycHRpbWUgXAotCXN0cnRvbnVtIFwKLQlzdHJ0b2xsIFwKLQlzdHJ0b3VsIFwKLQlzd2FwMzIgXAotCXN5c2NvbmYgXAotCXRjZ2V0cGdycCBcCi0JdGltaW5nc2FmZV9iY21wIFwKLQl0cnVuY2F0ZSBcCi0JdW5zZXRlbnYgXAotCXVwZHd0bXB4IFwKLQl1c2VyX2Zyb21fdWlkIFwKLQl2YXNwcmludGYgXAotCXZoYW5ndXAgXAotCXZzbnByaW50ZiBcCi0Jd2FpdHBpZCBcCi1dKQotCi1BQ19MSU5LX0lGRUxTRSgKLSAgICAgICAgW0FDX0xBTkdfUFJPR1JBTSgKLSAgICAgICAgICAgW1sgI2luY2x1ZGUgPGN0eXBlLmg+IF1dLAotICAgICAgICAgICBbWyByZXR1cm4gKGlzYmxhbmsoJ2EnKSk7IF1dKV0sCi0JW0FDX0RFRklORShbSEFWRV9JU0JMQU5LXSwgWzFdLCBbRGVmaW5lIGlmIHlvdSBoYXZlIGlzYmxhbmsoM0MpLl0pCi1dKQotCi0jIFBLQ1MjMTEgc3VwcG9ydCByZXF1aXJlcyBkbG9wZW4oKSBhbmQgY28KLUFDX1NFQVJDSF9MSUJTKFtkbG9wZW5dLCBbZGxdLAotICAgIFtBQ19ERUZJTkUoW0VOQUJMRV9QS0NTMTFdLCBbXSwgW0VuYWJsZSBmb3IgUEtDUyMxMSBzdXBwb3J0XSldCi0pCi0KLSMgSVJJWCBoYXMgYSBjb25zdCBjaGFyIHJldHVybiB2YWx1ZSBmb3IgZ2FpX3N0cmVycm9yKCkKLUFDX0NIRUNLX0ZVTkNTKFtnYWlfc3RyZXJyb3JdLCBbCi0JQUNfREVGSU5FKFtIQVZFX0dBSV9TVFJFUlJPUl0pCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotCi1jb25zdCBjaGFyICpnYWlfc3RyZXJyb3IoaW50KTsKLQkJCV1dLCBbWwotCWNoYXIgKnN0cjsKLQlzdHIgPSBnYWlfc3RyZXJyb3IoMCk7Ci0JCQldXSldLCBbCi0JCUFDX0RFRklORShbSEFWRV9DT05TVF9HQUlfU1RSRVJST1JfUFJPVE9dLCBbMV0sCi0JCVtEZWZpbmUgaWYgZ2FpX3N0cmVycm9yKCkgcmV0dXJucyBjb25zdCBjaGFyICpdKV0sIFtdKV0pCi0KLUFDX1NFQVJDSF9MSUJTKFtuYW5vc2xlZXBdLCBbcnQgcG9zaXg0XSwgW0FDX0RFRklORShbSEFWRV9OQU5PU0xFRVBdLCBbMV0sCi0JW1NvbWUgc3lzdGVtcyBwdXQgbmFub3NsZWVwIG91dHNpZGUgb2YgbGliY10pXSkKLQotZG5sIE1ha2Ugc3VyZSBwcm90b3R5cGVzIGFyZSBkZWZpbmVkIGZvciB0aGVzZSBiZWZvcmUgdXNpbmcgdGhlbS4KLUFDX0NIRUNLX0RFQ0woW2dldHJ1c2FnZV0sIFtBQ19DSEVDS19GVU5DUyhbZ2V0cnVzYWdlXSldKQotQUNfQ0hFQ0tfREVDTChbc3Ryc2VwXSwKLQlbQUNfQ0hFQ0tfRlVOQ1MoW3N0cnNlcF0pXSwKLQlbXSwKLQlbCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCV0pCi0KLWRubCB0Y3NlbmRicmVhayBtaWdodCBiZSBhIG1hY3JvCi1BQ19DSEVDS19ERUNMKFt0Y3NlbmRicmVha10sCi0JW0FDX0RFRklORShbSEFWRV9UQ1NFTkRCUkVBS10pXSwKLQlbQUNfQ0hFQ0tfRlVOQ1MoW3Rjc2VuZGJyZWFrXSldLAotCVsjaW5jbHVkZSA8dGVybWlvcy5oPl0KLSkKLQotQUNfQ0hFQ0tfREVDTFMoW2hfZXJybm9dLCAsICxbI2luY2x1ZGUgPG5ldGRiLmg+XSkKLQotQUNfQ0hFQ0tfREVDTFMoW1NIVVRfUkRdLCAsICwKLQlbCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCV0pCi0KLUFDX0NIRUNLX0RFQ0xTKFtPX05PTkJMT0NLXSwgLCAsCi0JWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAotIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9GQ05UTF9ICi0jIGluY2x1ZGUgPGZjbnRsLmg+Ci0jZW5kaWYKLQldKQotCi1BQ19DSEVDS19ERUNMUyhbd3JpdGV2XSwgLCAsIFsKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdWlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0JXSkKLQotQUNfQ0hFQ0tfREVDTFMoW01BWFNZTUxJTktTXSwgLCAsIFsKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQldKQotCi1BQ19DSEVDS19ERUNMUyhbb2Zmc2V0b2ZdLCAsICwgWwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCV0pCi0KLUFDX0NIRUNLX0ZVTkNTKFtzZXRyZXN1aWRdLCBbCi0JZG5sIFNvbWUgcGxhdG9ybXMgaGF2ZSBzZXRyZXN1aWQgdGhhdCBpc24ndCBpbXBsZW1lbnRlZCwgdGVzdCBmb3IgdGhpcwotCUFDX01TR19DSEVDS0lORyhbaWYgc2V0cmVzdWlkIHNlZW1zIHRvIHdvcmtdKQotCUFDX1JVTl9JRkVMU0UoCi0JCVtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCQldXSwgW1sKLQllcnJubz0wOwotCXNldHJlc3VpZCgwLDAsMCk7Ci0JaWYgKGVycm5vPT1FTk9TWVMpCi0JCWV4aXQoMSk7Ci0JZWxzZQotCQlleGl0KDApOwotCQldXSldLAotCQlbQUNfTVNHX1JFU1VMVChbeWVzXSldLAotCQlbQUNfREVGSU5FKFtCUk9LRU5fU0VUUkVTVUlEXSwgWzFdLAotCQkJW0RlZmluZSBpZiB5b3VyIHNldHJlc3VpZCgpIGlzIGJyb2tlbl0pCi0JCSBBQ19NU0dfUkVTVUxUKFtub3QgaW1wbGVtZW50ZWRdKV0sCi0JCVtBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmcgc2V0cmVzdWlkXSldCi0JKQotXSkKLQotQUNfQ0hFQ0tfRlVOQ1MoW3NldHJlc2dpZF0sIFsKLQlkbmwgU29tZSBwbGF0b3JtcyBoYXZlIHNldHJlc2dpZCB0aGF0IGlzbid0IGltcGxlbWVudGVkLCB0ZXN0IGZvciB0aGlzCi0JQUNfTVNHX0NIRUNLSU5HKFtpZiBzZXRyZXNnaWQgc2VlbXMgdG8gd29ya10pCi0JQUNfUlVOX0lGRUxTRSgKLQkJW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0JCV1dLCBbWwotCWVycm5vPTA7Ci0Jc2V0cmVzZ2lkKDAsMCwwKTsKLQlpZiAoZXJybm89PUVOT1NZUykKLQkJZXhpdCgxKTsKLQllbHNlCi0JCWV4aXQoMCk7Ci0JCV1dKV0sCi0JCVtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCi0JCVtBQ19ERUZJTkUoW0JST0tFTl9TRVRSRVNHSURdLCBbMV0sCi0JCQlbRGVmaW5lIGlmIHlvdXIgc2V0cmVzZ2lkKCkgaXMgYnJva2VuXSkKLQkJIEFDX01TR19SRVNVTFQoW25vdCBpbXBsZW1lbnRlZF0pXSwKLQkJW0FDX01TR19XQVJOKFtjcm9zcyBjb21waWxpbmc6IG5vdCBjaGVja2luZyBzZXRyZXN1aWRdKV0KLQkpCi1dKQotCi1kbmwgICAgQ2hlY2tzIGZvciB0aW1lIGZ1bmN0aW9ucwotQUNfQ0hFQ0tfRlVOQ1MoW2dldHRpbWVvZmRheSB0aW1lXSkKLWRubCAgICBDaGVja3MgZm9yIHV0bXAgZnVuY3Rpb25zCi1BQ19DSEVDS19GVU5DUyhbZW5kdXRlbnQgZ2V0dXRlbnQgZ2V0dXRpZCBnZXR1dGxpbmUgcHV0dXRsaW5lIHNldHV0ZW50XSkKLUFDX0NIRUNLX0ZVTkNTKFt1dG1wbmFtZV0pCi1kbmwgICAgQ2hlY2tzIGZvciB1dG1weCBmdW5jdGlvbnMKLUFDX0NIRUNLX0ZVTkNTKFtlbmR1dHhlbnQgZ2V0dXR4ZW50IGdldHV0eGlkIGdldHV0eGxpbmUgZ2V0dXR4dXNlciBwdXR1dHhsaW5lXSkKLUFDX0NIRUNLX0ZVTkNTKFtzZXR1dHhkYiBzZXR1dHhlbnQgdXRtcHhuYW1lXSkKLWRubCAgICBDaGVja3MgZm9yIGxhc3Rsb2cgZnVuY3Rpb25zCi1BQ19DSEVDS19GVU5DUyhbZ2V0bGFzdGxvZ3hieW5hbWVdKQotCi1BQ19DSEVDS19GVU5DKFtkYWVtb25dLAotCVtBQ19ERUZJTkUoW0hBVkVfREFFTU9OXSwgWzFdLCBbRGVmaW5lIGlmIHlvdXIgbGlicmFyaWVzIGRlZmluZSBkYWVtb24oKV0pXSwKLQlbQUNfQ0hFQ0tfTElCKFtic2RdLCBbZGFlbW9uXSwKLQkJW0xJQlM9IiRMSUJTIC1sYnNkIjsgQUNfREVGSU5FKFtIQVZFX0RBRU1PTl0pXSldCi0pCi0KLUFDX0NIRUNLX0ZVTkMoW2dldHBhZ2VzaXplXSwKLQlbQUNfREVGSU5FKFtIQVZFX0dFVFBBR0VTSVpFXSwgWzFdLAotCQlbRGVmaW5lIGlmIHlvdXIgbGlicmFyaWVzIGRlZmluZSBnZXRwYWdlc2l6ZSgpXSldLAotCVtBQ19DSEVDS19MSUIoW3VjYl0sIFtnZXRwYWdlc2l6ZV0sCi0JCVtMSUJTPSIkTElCUyAtbHVjYiI7IEFDX0RFRklORShbSEFWRV9HRVRQQUdFU0laRV0pXSldCi0pCi0KLSMgQ2hlY2sgZm9yIGJyb2tlbiBzbnByaW50ZgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3NucHJpbnRmIiA9ICJ4eWVzIiA7IHRoZW4KLQlBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc25wcmludGYgY29ycmVjdGx5IHRlcm1pbmF0ZXMgbG9uZyBzdHJpbmdzXSkKLQlBQ19SVU5fSUZFTFNFKAotCQlbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzdGRpby5oPiBdXSwKLQkJW1sKLQljaGFyIGJbNV07Ci0Jc25wcmludGYoYiw1LCIxMjM0NTY3ODkiKTsKLQlleGl0KGJbNF0hPSdcMCcpOyAKLQkJXV0pXSwKLQkJW0FDX01TR19SRVNVTFQoW3llc10pXSwKLQkJWwotCQkJQUNfTVNHX1JFU1VMVChbbm9dKQotCQkJQUNfREVGSU5FKFtCUk9LRU5fU05QUklOVEZdLCBbMV0sCi0JCQkJW0RlZmluZSBpZiB5b3VyIHNucHJpbnRmIGlzIGJ1c3RlZF0pCi0JCQlBQ19NU0dfV0FSTihbKioqKioqIFlvdXIgc25wcmludGYoKSBmdW5jdGlvbiBpcyBicm9rZW4sIGNvbXBsYWluIHRvIHlvdXIgdmVuZG9yXSkKLQkJXSwKLQkJWyBBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBBc3N1bWluZyB3b3JraW5nIHNucHJpbnRmKCldKSBdCi0JKQotZmkKLQotIyBJZiB3ZSBkb24ndCBoYXZlIGEgd29ya2luZyBhc3ByaW50ZiwgdGhlbiB3ZSBzdHJvbmdseSBkZXBlbmQgb24gdnNucHJpbnRmCi0jIHJldHVybmluZyB0aGUgcmlnaHQgdGhpbmcgb24gb3ZlcmZsb3c6IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpdCB0cmllZCB0bwotIyBjcmVhdGUgKGFzIHBlciBTVVN2MykKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19hc3ByaW50ZiIgIT0gInh5ZXMiICYmIFwKLSAgIHRlc3QgIngkYWNfY3ZfZnVuY192c25wcmludGYiID0gInh5ZXMiIDsgdGhlbgotCUFDX01TR19DSEVDS0lORyhbd2hldGhlciB2c25wcmludGYgcmV0dXJucyBjb3JyZWN0IHZhbHVlcyBvbiBvdmVyZmxvd10pCi0JQUNfUlVOX0lGRUxTRSgKLQkJW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLWludCB4X3NucHJpbnRmKGNoYXIgKnN0cixzaXplX3QgY291bnQsY29uc3QgY2hhciAqZm10LC4uLikKLXsKLQlzaXplX3QgcmV0OyB2YV9saXN0IGFwOwotCXZhX3N0YXJ0KGFwLCBmbXQpOyByZXQgPSB2c25wcmludGYoc3RyLCBjb3VudCwgZm10LCBhcCk7IHZhX2VuZChhcCk7Ci0JcmV0dXJuIHJldDsKLX0KLQkJXV0sIFtbCi0JY2hhciB4WzFdOwotCWV4aXQoeF9zbnByaW50Zih4LCAxLCAiJXMgJWQiLCAiaGVsbG8iLCAxMjM0NSkgPT0gMTEgPyAwIDogMSk7Ci0JCV1dKV0sCi0JCVtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCi0JCVsKLQkJCUFDX01TR19SRVNVTFQoW25vXSkKLQkJCUFDX0RFRklORShbQlJPS0VOX1NOUFJJTlRGXSwgWzFdLAotCQkJCVtEZWZpbmUgaWYgeW91ciBzbnByaW50ZiBpcyBidXN0ZWRdKQotCQkJQUNfTVNHX1dBUk4oWyoqKioqKiBZb3VyIHZzbnByaW50ZigpIGZ1bmN0aW9uIGlzIGJyb2tlbiwgY29tcGxhaW4gdG8geW91ciB2ZW5kb3JdKQotCQldLAotCQlbIEFDX01TR19XQVJOKFtjcm9zcyBjb21waWxpbmc6IEFzc3VtaW5nIHdvcmtpbmcgdnNucHJpbnRmKCldKSBdCi0JKQotZmkKLQotIyBPbiBzeXN0ZW1zIHdoZXJlIFt2XXNucHJpbnRmIGlzIGJyb2tlbiwgYnV0IGlzIGRlY2xhcmVkIGluIHN0ZGlvLAotIyBjaGVjayB0aGF0IHRoZSBmbXQgYXJndW1lbnQgaXMgY29uc3QgY2hhciAqIG9yIGp1c3QgY2hhciAqLgotIyBUaGlzIGlzIG9ubHkgdXNlZnVsIGZvciB3aGVuIEJST0tFTl9TTlBSSU5URgotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHNucHJpbnRmIGNhbiBkZWNsYXJlIGNvbnN0IGNoYXIgKmZtdF0pCi1BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLWludCBzbnByaW50ZihjaGFyICphLCBzaXplX3QgYiwgY29uc3QgY2hhciAqYywgLi4uKSB7IHJldHVybiAwOyB9Ci0JCV1dLCBbWwotCXNucHJpbnRmKDAsIDAsIDApOwotCQldXSldLAotICAgW0FDX01TR19SRVNVTFQoW3llc10pCi0gICAgQUNfREVGSU5FKFtTTlBSSU5URl9DT05TVF0sIFtjb25zdF0sCi0gICAgICAgICAgICAgIFtEZWZpbmUgYXMgY29uc3QgaWYgc25wcmludGYoKSBjYW4gZGVjbGFyZSBjb25zdCBjaGFyICpmbXRdKV0sCi0gICBbQUNfTVNHX1JFU1VMVChbbm9dKQotICAgIEFDX0RFRklORShbU05QUklOVEZfQ09OU1RdLCBbLyogbm90IGNvbnN0ICovXSldKQotCi0jIENoZWNrIGZvciBtaXNzaW5nIGdldHBlZXJlaWQgKG9yIGVxdWl2KSBzdXBwb3J0Ci1OT19QRUVSQ0hFQ0s9IiIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRwZWVyZWlkIiAhPSAieHllcyIgLWEgIngkYWNfY3ZfZnVuY19nZXRwZWVydWNyZWQiICE9ICJ4eWVzIjsgdGhlbgotCUFDX01TR19DSEVDS0lORyhbd2hldGhlciBzeXN0ZW0gc3VwcG9ydHMgU09fUEVFUkNSRUQgZ2V0c29ja29wdF0pCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD5dXSwgW1tpbnQgaSA9IFNPX1BFRVJDUkVEO11dKV0sCi0JCVsgQUNfTVNHX1JFU1VMVChbeWVzXSkKLQkJICBBQ19ERUZJTkUoW0hBVkVfU09fUEVFUkNSRURdLCBbMV0sIFtIYXZlIFBFRVJDUkVEIHNvY2tldCBvcHRpb25dKQotCQldLCBbQUNfTVNHX1JFU1VMVChbbm9dKQotCQlOT19QRUVSQ0hFQ0s9MQotICAgICAgICBdKQotZmkKLQotZG5sIHNlZSB3aGV0aGVyIG1rc3RlbXAoKSByZXF1aXJlcyBYWFhYWFgKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19ta2R0ZW1wIiA9ICJ4eWVzIiA7IHRoZW4KLUFDX01TR19DSEVDS0lORyhbZm9yIChvdmVybHkpIHN0cmljdCBta3N0ZW1wXSkKLUFDX1JVTl9JRkVMU0UoCi0JW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCV1dLCBbWwotCWNoYXIgdGVtcGxhdGVbXT0iY29uZnRlc3QubWtzdGVtcC10ZXN0IjsKLQlpZiAobWtzdGVtcCh0ZW1wbGF0ZSkgPT0gLTEpCi0JCWV4aXQoMSk7Ci0JdW5saW5rKHRlbXBsYXRlKTsKLQlleGl0KDApOwotCV1dKV0sCi0JWwotCQlBQ19NU0dfUkVTVUxUKFtub10pCi0JXSwKLQlbCi0JCUFDX01TR19SRVNVTFQoW3llc10pCi0JCUFDX0RFRklORShbSEFWRV9TVFJJQ1RfTUtTVEVNUF0sIFsxXSwgW1NpbGx5IG1rc3RlbXAoKV0pCi0JXSwKLQlbCi0JCUFDX01TR19SRVNVTFQoW3llc10pCi0JCUFDX0RFRklORShbSEFWRV9TVFJJQ1RfTUtTVEVNUF0pCi0JXQotKQotZmkKLQotZG5sIG1ha2Ugc3VyZSB0aGF0IG9wZW5wdHkgZG9lcyBub3QgcmVhY3F1aXJlIGNvbnRyb2xsaW5nIHRlcm1pbmFsCi1pZiB0ZXN0ICEgLXogIiRjaGVja19mb3Jfb3BlbnB0eV9jdHR5X2J1ZyI7IHRoZW4KLQlBQ19NU0dfQ0hFQ0tJTkcoW2lmIG9wZW5wdHkgY29ycmVjdGx5IGhhbmRsZXMgY29udHJvbGxpbmcgdHR5XSkKLQlBQ19SVU5fSUZFTFNFKAotCQlbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotCQldXSwgW1sKLQlwaWRfdCBwaWQ7Ci0JaW50IGZkLCBwdHlmZCwgdHR5ZmQsIHN0YXR1czsKLQotCXBpZCA9IGZvcmsoKTsKLQlpZiAocGlkIDwgMCkgewkJLyogZmFpbGVkICovCi0JCWV4aXQoMSk7Ci0JfSBlbHNlIGlmIChwaWQgPiAwKSB7CS8qIHBhcmVudCAqLwotCQl3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCk7Ci0JCWlmIChXSUZFWElURUQoc3RhdHVzKSkKLQkJCWV4aXQoV0VYSVRTVEFUVVMoc3RhdHVzKSk7Ci0JCWVsc2UKLQkJCWV4aXQoMik7Ci0JfSBlbHNlIHsJCS8qIGNoaWxkICovCi0JCWNsb3NlKDApOyBjbG9zZSgxKTsgY2xvc2UoMik7Ci0JCXNldHNpZCgpOwotCQlvcGVucHR5KCZwdHlmZCwgJnR0eWZkLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQkJZmQgPSBvcGVuKCIvZGV2L3R0eSIsIE9fUkRXUiB8IE9fTk9DVFRZKTsKLQkJaWYgKGZkID49IDApCi0JCQlleGl0KDMpOwkvKiBBY3F1aXJlZCBjdHR5OiBicm9rZW4gKi8KLQkJZWxzZQotCQkJZXhpdCgwKTsJLyogRGlkIG5vdCBhY3F1aXJlIGN0dHk6IE9LICovCi0JfQotCQldXSldLAotCQlbCi0JCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCQldLAotCQlbCi0JCQlBQ19NU0dfUkVTVUxUKFtub10pCi0JCQlBQ19ERUZJTkUoW1NTSERfQUNRVUlSRVNfQ1RUWV0pCi0JCV0sCi0JCVsKLQkJCUFDX01TR19SRVNVTFQoW2Nyb3NzLWNvbXBpbGluZywgYXNzdW1pbmcgeWVzXSkKLQkJXQotCSkKLWZpCi0KLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRhZGRyaW5mbyIgPSAieHllcyIgJiYgXAotICAgIHRlc3QgIngkY2hlY2tfZm9yX2hwdXhfYnJva2VuX2dldGFkZHJpbmZvIiA9ICJ4MSI7IHRoZW4KLQlBQ19NU0dfQ0hFQ0tJTkcoW2lmIGdldGFkZHJpbmZvIHNlZW1zIHRvIHdvcmtdKQotCUFDX1JVTl9JRkVMU0UoCi0JCVtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi0jZGVmaW5lIFRFU1RfUE9SVCAiMjIyMiIKLQkJXV0sIFtbCi0JaW50IGVyciwgc29jazsKLQlzdHJ1Y3QgYWRkcmluZm8gKmdhaV9haSwgKmFpLCBoaW50czsKLQljaGFyIG50b3BbTklfTUFYSE9TVF0sIHN0cnBvcnRbTklfTUFYU0VSVl0sICpuYW1lID0gTlVMTDsKLQotCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotCWhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKLQloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotCWhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKLQotCWVyciA9IGdldGFkZHJpbmZvKG5hbWUsIFRFU1RfUE9SVCwgJmhpbnRzLCAmZ2FpX2FpKTsKLQlpZiAoZXJyICE9IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJnZXRhZGRyaW5mbyBmYWlsZWQgKCVzKSIsIGdhaV9zdHJlcnJvcihlcnIpKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlmb3IgKGFpID0gZ2FpX2FpOyBhaSAhPSBOVUxMOyBhaSA9IGFpLT5haV9uZXh0KSB7Ci0JCWlmIChhaS0+YWlfZmFtaWx5ICE9IEFGX0lORVQ2KQotCQkJY29udGludWU7Ci0KLQkJZXJyID0gZ2V0bmFtZWluZm8oYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuLCBudG9wLAotCQkgICAgc2l6ZW9mKG50b3ApLCBzdHJwb3J0LCBzaXplb2Yoc3RycG9ydCksCi0JCSAgICBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVik7Ci0KLQkJaWYgKGVyciAhPSAwKSB7Ci0JCQlpZiAoZXJyID09IEVBSV9TWVNURU0pCi0JCQkJcGVycm9yKCJnZXRuYW1laW5mbyBFQUlfU1lTVEVNIik7Ci0JCQllbHNlCi0JCQkJZnByaW50ZihzdGRlcnIsICJnZXRuYW1laW5mbyBmYWlsZWQ6ICVzXG4iLAotCQkJCSAgICBnYWlfc3RyZXJyb3IoZXJyKSk7Ci0JCQlleGl0KDIpOwotCQl9Ci0KLQkJc29jayA9IHNvY2tldChhaS0+YWlfZmFtaWx5LCBhaS0+YWlfc29ja3R5cGUsIGFpLT5haV9wcm90b2NvbCk7Ci0JCWlmIChzb2NrIDwgMCkKLQkJCXBlcnJvcigic29ja2V0Iik7Ci0JCWlmIChiaW5kKHNvY2ssIGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbikgPCAwKSB7Ci0JCQlpZiAoZXJybm8gPT0gRUJBREYpCi0JCQkJZXhpdCgzKTsKLQkJfQotCX0KLQlleGl0KDApOwotCQldXSldLAotCQlbCi0JCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCQldLAotCQlbCi0JCQlBQ19NU0dfUkVTVUxUKFtub10pCi0JCQlBQ19ERUZJTkUoW0JST0tFTl9HRVRBRERSSU5GT10pCi0JCV0sCi0JCVsKLQkJCUFDX01TR19SRVNVTFQoW2Nyb3NzLWNvbXBpbGluZywgYXNzdW1pbmcgeWVzXSkKLQkJXQotCSkKLWZpCi0KLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRhZGRyaW5mbyIgPSAieHllcyIgJiYgXAotICAgIHRlc3QgIngkY2hlY2tfZm9yX2FpeF9icm9rZW5fZ2V0YWRkcmluZm8iID0gIngxIjsgdGhlbgotCUFDX01TR19DSEVDS0lORyhbaWYgZ2V0YWRkcmluZm8gc2VlbXMgdG8gd29ya10pCi0JQUNfUlVOX0lGRUxTRSgKLQkJW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLSNkZWZpbmUgVEVTVF9QT1JUICIyMjIyIgotCQldXSwgW1sKLQlpbnQgZXJyLCBzb2NrOwotCXN0cnVjdCBhZGRyaW5mbyAqZ2FpX2FpLCAqYWksIGhpbnRzOwotCWNoYXIgbnRvcFtOSV9NQVhIT1NUXSwgc3RycG9ydFtOSV9NQVhTRVJWXSwgKm5hbWUgPSBOVUxMOwotCi0JbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOwotCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0JaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOwotCi0JZXJyID0gZ2V0YWRkcmluZm8obmFtZSwgVEVTVF9QT1JULCAmaGludHMsICZnYWlfYWkpOwotCWlmIChlcnIgIT0gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImdldGFkZHJpbmZvIGZhaWxlZCAoJXMpIiwgZ2FpX3N0cmVycm9yKGVycikpOwotCQlleGl0KDEpOwotCX0KLQotCWZvciAoYWkgPSBnYWlfYWk7IGFpICE9IE5VTEw7IGFpID0gYWktPmFpX25leHQpIHsKLQkJaWYgKGFpLT5haV9mYW1pbHkgIT0gQUZfSU5FVCAmJiBhaS0+YWlfZmFtaWx5ICE9IEFGX0lORVQ2KQotCQkJY29udGludWU7Ci0KLQkJZXJyID0gZ2V0bmFtZWluZm8oYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuLCBudG9wLAotCQkgICAgc2l6ZW9mKG50b3ApLCBzdHJwb3J0LCBzaXplb2Yoc3RycG9ydCksCi0JCSAgICBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVik7Ci0KLQkJaWYgKGFpLT5haV9mYW1pbHkgPT0gQUZfSU5FVCAmJiBlcnIgIT0gMCkgewotCQkJcGVycm9yKCJnZXRuYW1laW5mbyIpOwotCQkJZXhpdCgyKTsKLQkJfQotCX0KLQlleGl0KDApOwotCQldXSldLAotCQlbCi0JCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCQkJQUNfREVGSU5FKFtBSVhfR0VUTkFNRUlORk9fSEFDS10sIFsxXSwKLQkJCQlbRGVmaW5lIGlmIHlvdSBoYXZlIGEgZ2V0YWRkcmluZm8gdGhhdCBmYWlscwotCQkJCWZvciB0aGUgYWxsLXplcm9zIElQdjYgYWRkcmVzc10pCi0JCV0sCi0JCVsKLQkJCUFDX01TR19SRVNVTFQoW25vXSkKLQkJCUFDX0RFRklORShbQlJPS0VOX0dFVEFERFJJTkZPXSkKLQkJXSwKLQkJWwotCQkJQUNfTVNHX1JFU1VMVChbY3Jvc3MtY29tcGlsaW5nLCBhc3N1bWluZyBub10pCi0JCV0KLQkpCi1maQotCi1pZiB0ZXN0ICJ4JGNoZWNrX2Zvcl9jb25mbGljdGluZ19nZXRzcG5hbSIgPSAieDEiOyB0aGVuCi0JQUNfTVNHX0NIRUNLSU5HKFtmb3IgY29uZmxpY3RpbmcgZ2V0c3BuYW0gaW4gc2hhZG93LmhdKQotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHNoYWRvdy5oPiBdXSwKLQkJW1sgZXhpdCgwKTsgXV0pXSwKLQkJWwotCQkJQUNfTVNHX1JFU1VMVChbbm9dKQotCQldLAotCQlbCi0JCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCQkJQUNfREVGSU5FKFtHRVRTUE5BTV9DT05GTElDVElOR19ERUZTXSwgWzFdLAotCQkJICAgIFtDb25mbGljdGluZyBkZWZzIGZvciBnZXRzcG5hbV0pCi0JCV0KLQkpCi1maQotCi1BQ19GVU5DX0dFVFBHUlAKLQotIyBTZWFyY2ggZm9yIE9wZW5TU0wKLXNhdmVkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi1zYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKLUFDX0FSR19XSVRIKFtzc2wtZGlyXSwKLQlbICAtLXdpdGgtc3NsLWRpcj1QQVRIICAgICBTcGVjaWZ5IHBhdGggdG8gT3BlblNTTCBpbnN0YWxsYXRpb24gXSwKLQlbCi0JCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCi0JCQljYXNlICIkd2l0aHZhbCIgaW4KLQkJCQkjIFJlbGF0aXZlIHBhdGhzCi0JCQkJLi8qfC4uLyopCXdpdGh2YWw9ImBwd2RgLyR3aXRodmFsIgotCQkJZXNhYwotCQkJaWYgdGVzdCAtZCAiJHdpdGh2YWwvbGliIjsgdGhlbgotCQkJCWlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgotCQkJCQlMREZMQUdTPSItTCR7d2l0aHZhbH0vbGliIC1SJHt3aXRodmFsfS9saWIgJHtMREZMQUdTfSIKLQkJCQllbHNlCi0JCQkJCUxERkxBR1M9Ii1MJHt3aXRodmFsfS9saWIgJHtMREZMQUdTfSIKLQkJCQlmaQotCQkJZWxpZiB0ZXN0IC1kICIkd2l0aHZhbC9saWI2NCI7IHRoZW4KLQkJCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KLQkJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYjY0IC1SJHt3aXRodmFsfS9saWI2NCAke0xERkxBR1N9IgotCQkJCWVsc2UKLQkJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9L2xpYjY0ICR7TERGTEFHU30iCi0JCQkJZmkKLQkJCWVsc2UKLQkJCQlpZiB0ZXN0IC1uICIke25lZWRfZGFzaF9yfSI7IHRoZW4KLQkJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9IC1SJHt3aXRodmFsfSAke0xERkxBR1N9IgotCQkJCWVsc2UKLQkJCQkJTERGTEFHUz0iLUwke3dpdGh2YWx9ICR7TERGTEFHU30iCi0JCQkJZmkKLQkJCWZpCi0JCQlpZiB0ZXN0IC1kICIkd2l0aHZhbC9pbmNsdWRlIjsgdGhlbgotCQkJCUNQUEZMQUdTPSItSSR7d2l0aHZhbH0vaW5jbHVkZSAke0NQUEZMQUdTfSIKLQkJCWVsc2UKLQkJCQlDUFBGTEFHUz0iLUkke3dpdGh2YWx9ICR7Q1BQRkxBR1N9IgotCQkJZmkKLQkJZmkKLQldCi0pCi1MSUJTPSItbGNyeXB0byAkTElCUyIKLUFDX1RSWV9MSU5LX0ZVTkMoW1JBTkRfYWRkXSwgW0FDX0RFRklORShbSEFWRV9PUEVOU1NMXSwgWzFdLAotCVtEZWZpbmUgaWYgeW91ciBzc2wgaGVhZGVycyBhcmUgaW5jbHVkZWQKLQl3aXRoICNpbmNsdWRlIDxvcGVuc3NsL2hlYWRlci5oPl0pXSwKLQlbCi0JCWRubCBDaGVjayBkZWZhdWx0IG9wZW5zc2wgaW5zdGFsbCBkaXIKLQkJaWYgdGVzdCAtbiAiJHtuZWVkX2Rhc2hfcn0iOyB0aGVuCi0JCQlMREZMQUdTPSItTC91c3IvbG9jYWwvc3NsL2xpYiAtUi91c3IvbG9jYWwvc3NsL2xpYiAke3NhdmVkX0xERkxBR1N9IgotCQllbHNlCi0JCQlMREZMQUdTPSItTC91c3IvbG9jYWwvc3NsL2xpYiAke3NhdmVkX0xERkxBR1N9IgotCQlmaQotCQlDUFBGTEFHUz0iLUkvdXNyL2xvY2FsL3NzbC9pbmNsdWRlICR7c2F2ZWRfQ1BQRkxBR1N9IgotCQlBQ19DSEVDS19IRUFERVIoW29wZW5zc2wvb3BlbnNzbHYuaF0sICwKLQkJICAgIFtBQ19NU0dfRVJST1IoWyoqKiBPcGVuU1NMIGhlYWRlcnMgbWlzc2luZyAtIHBsZWFzZSBpbnN0YWxsIGZpcnN0IG9yIGNoZWNrIGNvbmZpZy5sb2cgKioqXSldKQotCQlBQ19UUllfTElOS19GVU5DKFtSQU5EX2FkZF0sIFtBQ19ERUZJTkUoW0hBVkVfT1BFTlNTTF0pXSwKLQkJCVsKLQkJCQlBQ19NU0dfRVJST1IoWyoqKiBDYW4ndCBmaW5kIHJlY2VudCBPcGVuU1NMIGxpYmNyeXB0byAoc2VlIGNvbmZpZy5sb2cgZm9yIGRldGFpbHMpICoqKl0pCi0JCQldCi0JCSkKLQldCi0pCi0KLSMgRGV0ZXJtaW5lIE9wZW5TU0wgaGVhZGVyIHZlcnNpb24KLUFDX01TR19DSEVDS0lORyhbT3BlblNTTCBoZWFkZXIgdmVyc2lvbl0pCi1BQ19SVU5fSUZFTFNFKAotCVtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbHYuaD4KLSNkZWZpbmUgREFUQSAiY29uZnRlc3Quc3NsaW5jdmVyIgotCV1dLCBbWwotCUZJTEUgKmZkOwotCWludCByYzsKLQotCWZkID0gZm9wZW4oREFUQSwidyIpOwotCWlmKGZkID09IE5VTEwpCi0JCWV4aXQoMSk7Ci0KLQlpZiAoKHJjID0gZnByaW50ZihmZCAsIiV4ICglcylcbiIsIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIsIE9QRU5TU0xfVkVSU0lPTl9URVhUKSkgPDApCi0JCWV4aXQoMSk7Ci0KLQlleGl0KDApOwotCV1dKV0sCi0JWwotCQlzc2xfaGVhZGVyX3Zlcj1gY2F0IGNvbmZ0ZXN0LnNzbGluY3ZlcmAKLQkJQUNfTVNHX1JFU1VMVChbJHNzbF9oZWFkZXJfdmVyXSkKLQldLAotCVsKLQkJQUNfTVNHX1JFU1VMVChbbm90IGZvdW5kXSkKLQkJQUNfTVNHX0VSUk9SKFtPcGVuU1NMIHZlcnNpb24gaGVhZGVyIG5vdCBmb3VuZC5dKQotCV0sCi0JWwotCQlBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmddKQotCV0KLSkKLQotIyBEZXRlcm1pbmUgT3BlblNTTCBsaWJyYXJ5IHZlcnNpb24KLUFDX01TR19DSEVDS0lORyhbT3BlblNTTCBsaWJyYXJ5IHZlcnNpb25dKQotQUNfUlVOX0lGRUxTRSgKLQlbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KLSNkZWZpbmUgREFUQSAiY29uZnRlc3Quc3NsbGlidmVyIgotCV1dLCBbWwotCUZJTEUgKmZkOwotCWludCByYzsKLQotCWZkID0gZm9wZW4oREFUQSwidyIpOwotCWlmKGZkID09IE5VTEwpCi0JCWV4aXQoMSk7Ci0KLQlpZiAoKHJjID0gZnByaW50ZihmZCAsIiV4ICglcylcbiIsIFNTTGVheSgpLCBTU0xlYXlfdmVyc2lvbihTU0xFQVlfVkVSU0lPTikpKSA8MCkKLQkJZXhpdCgxKTsKLQotCWV4aXQoMCk7Ci0JXV0pXSwKLQlbCi0JCXNzbF9saWJyYXJ5X3Zlcj1gY2F0IGNvbmZ0ZXN0LnNzbGxpYnZlcmAKLQkJQUNfTVNHX1JFU1VMVChbJHNzbF9saWJyYXJ5X3Zlcl0pCi0JXSwKLQlbCi0JCUFDX01TR19SRVNVTFQoW25vdCBmb3VuZF0pCi0JCUFDX01TR19FUlJPUihbT3BlblNTTCBsaWJyYXJ5IG5vdCBmb3VuZC5dKQotCV0sCi0JWwotCQlBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmddKQotCV0KLSkKLQotQUNfQVJHX1dJVEgoW29wZW5zc2wtaGVhZGVyLWNoZWNrXSwKLQlbICAtLXdpdGhvdXQtb3BlbnNzbC1oZWFkZXItY2hlY2sgRGlzYWJsZSBPcGVuU1NMIHZlcnNpb24gY29uc2lzdGVuY3kgY2hlY2tdLAotCVsgIGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIiA7IHRoZW4KLQkJb3BlbnNzbF9jaGVja19ub25mYXRhbD0xCi0JICAgZmkKLQldCi0pCi0KLSMgU2FuaXR5IGNoZWNrIE9wZW5TU0wgaGVhZGVycwotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE9wZW5TU0wncyBoZWFkZXJzIG1hdGNoIHRoZSBsaWJyYXJ5XSkKLUFDX1JVTl9JRkVMU0UoCi0JW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbHYuaD4KLQldXSwgW1sKLQlleGl0KFNTTGVheSgpID09IE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPyAwIDogMSk7Ci0JXV0pXSwKLQlbCi0JCUFDX01TR19SRVNVTFQoW3llc10pCi0JXSwKLQlbCi0JCUFDX01TR19SRVNVTFQoW25vXSkKLQkJaWYgdGVzdCAieCRvcGVuc3NsX2NoZWNrX25vbmZhdGFsIiA9ICJ4IjsgdGhlbgotCQkJQUNfTVNHX0VSUk9SKFtZb3VyIE9wZW5TU0wgaGVhZGVycyBkbyBub3QgbWF0Y2ggeW91cgotbGlicmFyeS4gQ2hlY2sgY29uZmlnLmxvZyBmb3IgZGV0YWlscy4KLUlmIHlvdSBhcmUgc3VyZSB5b3VyIGluc3RhbGxhdGlvbiBpcyBjb25zaXN0ZW50LCB5b3UgY2FuIGRpc2FibGUgdGhlIGNoZWNrCi1ieSBydW5uaW5nICIuL2NvbmZpZ3VyZSAtLXdpdGhvdXQtb3BlbnNzbC1oZWFkZXItY2hlY2siLgotQWxzbyBzZWUgY29udHJpYi9maW5kc3NsLnNoIGZvciBoZWxwIGlkZW50aWZ5aW5nIGhlYWRlci9saWJyYXJ5IG1pc21hdGNoZXMuCi1dKQotCQllbHNlCi0JCQlBQ19NU0dfV0FSTihbWW91ciBPcGVuU1NMIGhlYWRlcnMgZG8gbm90IG1hdGNoIHlvdXIKLWxpYnJhcnkuIENoZWNrIGNvbmZpZy5sb2cgZm9yIGRldGFpbHMuCi1BbHNvIHNlZSBjb250cmliL2ZpbmRzc2wuc2ggZm9yIGhlbHAgaWRlbnRpZnlpbmcgaGVhZGVyL2xpYnJhcnkgbWlzbWF0Y2hlcy5dKQotCQlmaQotCV0sCi0JWwotCQlBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmddKQotCV0KLSkKLQotQUNfTVNHX0NIRUNLSU5HKFtpZiBwcm9ncmFtcyB1c2luZyBPcGVuU1NMIGZ1bmN0aW9ucyB3aWxsIGxpbmtdKQotQUNfTElOS19JRkVMU0UoCi0JW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4gXV0sCi0JW1sgU1NMZWF5X2FkZF9hbGxfYWxnb3JpdGhtcygpOyBdXSldLAotCVsKLQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKLQldLAotCVsKLQkJQUNfTVNHX1JFU1VMVChbbm9dKQotCQlzYXZlZF9MSUJTPSIkTElCUyIKLQkJTElCUz0iJExJQlMgLWxkbCIKLQkJQUNfTVNHX0NIRUNLSU5HKFtpZiBwcm9ncmFtcyB1c2luZyBPcGVuU1NMIG5lZWQgLWxkbF0pCi0JCUFDX0xJTktfSUZFTFNFKAotCQkJW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4gXV0sCi0JCQlbWyBTU0xlYXlfYWRkX2FsbF9hbGdvcml0aG1zKCk7IF1dKV0sCi0JCQlbCi0JCQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKLQkJCV0sCi0JCQlbCi0JCQkJQUNfTVNHX1JFU1VMVChbbm9dKQotCQkJCUxJQlM9IiRzYXZlZF9MSUJTIgotCQkJXQotCQkpCi0JXQotKQotCi1BQ19DSEVDS19GVU5DUyhbUlNBX2dlbmVyYXRlX2tleV9leCBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVyc19leCBCTl9pc19wcmltZV9leCBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kXSkKLQotQUNfQVJHX1dJVEgoW3NzbC1lbmdpbmVdLAotCVsgIC0td2l0aC1zc2wtZW5naW5lICAgICAgIEVuYWJsZSBPcGVuU1NMIChoYXJkd2FyZSkgRU5HSU5FIHN1cHBvcnQgXSwKLQlbIGlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCi0JCUFDX01TR19DSEVDS0lORyhbZm9yIE9wZW5TU0wgRU5HSU5FIHN1cHBvcnRdKQotCQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KLQkJCV1dLCBbWwotCUVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpOwotCUVOR0lORV9yZWdpc3Rlcl9hbGxfY29tcGxldGUoKTsKLQkJCV1dKV0sCi0JCQlbIEFDX01TR19SRVNVTFQoW3llc10pCi0JCQkgIEFDX0RFRklORShbVVNFX09QRU5TU0xfRU5HSU5FXSwgWzFdLAotCQkJICAgICBbRW5hYmxlIE9wZW5TU0wgZW5naW5lIHN1cHBvcnRdKQotCQkJXSwgWyBBQ19NU0dfRVJST1IoW09wZW5TU0wgRU5HSU5FIHN1cHBvcnQgbm90IGZvdW5kXSkKLQkJXSkKLQkgIGZpIF0KLSkKLQotIyBDaGVjayBmb3IgT3BlblNTTCB3aXRob3V0IEVWUF9hZXNfezE5MiwyNTZ9X2NiYwotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE9wZW5TU0wgaGFzIGNyaXBwbGVkIEFFUyBzdXBwb3J0XSkKLUFDX0xJTktfSUZFTFNFKAotCVtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotCV1dLCBbWwotCWV4aXQoRVZQX2Flc18xOTJfY2JjKCkgPT0gTlVMTCB8fCBFVlBfYWVzXzI1Nl9jYmMoKSA9PSBOVUxMKTsKLQldXSldLAotCVsKLQkJQUNfTVNHX1JFU1VMVChbbm9dKQotCV0sCi0JWwotCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCQlBQ19ERUZJTkUoW09QRU5TU0xfTE9CT1RPTUlTRURfQUVTXSwgWzFdLAotCQkgICAgW2xpYmNyeXB0byBpcyBtaXNzaW5nIEFFUyAxOTIgYW5kIDI1NiBiaXQgZnVuY3Rpb25zXSkKLQldCi0pCi0KLUFDX01TR19DSEVDS0lORyhbaWYgRVZQX0RpZ2VzdFVwZGF0ZSByZXR1cm5zIGFuIGludF0pCi1BQ19MSU5LX0lGRUxTRSgKLQlbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLQldXSwgW1sKLQlpZihFVlBfRGlnZXN0VXBkYXRlKE5VTEwsIE5VTEwsMCkpCi0JCWV4aXQoMCk7Ci0JXV0pXSwKLQlbCi0JCUFDX01TR19SRVNVTFQoW3llc10pCi0JXSwKLQlbCi0JCUFDX01TR19SRVNVTFQoW25vXSkKLQkJQUNfREVGSU5FKFtPUEVOU1NMX0VWUF9ESUdFU1RVUERBVEVfVk9JRF0sIFsxXSwKLQkJICAgIFtEZWZpbmUgaWYgRVZQX0RpZ2VzdFVwZGF0ZSByZXR1cm5zIHZvaWRdKQotCV0KLSkKLQotIyBTb21lIHN5c3RlbXMgd2FudCBjcnlwdCgpIGZyb20gbGliY3J5cHQsICpub3QqIHRoZSB2ZXJzaW9uIGluIE9wZW5TU0wsCi0jIGJlY2F1c2UgdGhlIHN5c3RlbSBjcnlwdCgpIGlzIG1vcmUgZmVhdHVyZWZ1bC4KLWlmIHRlc3QgIngkY2hlY2tfZm9yX2xpYmNyeXB0X2JlZm9yZSIgPSAieDEiOyB0aGVuCi0JQUNfQ0hFQ0tfTElCKFtjcnlwdF0sIFtjcnlwdF0pCi1maQotCi0jIFNvbWUgTGludXggc3lzdGVtcyAoU2xhY2t3YXJlKSBuZWVkIGNyeXB0KCkgZnJvbSBsaWJjcnlwdCwgKm5vdCogdGhlCi0jIHZlcnNpb24gaW4gT3BlblNTTC4KLWlmIHRlc3QgIngkY2hlY2tfZm9yX2xpYmNyeXB0X2xhdGVyIiA9ICJ4MSI7IHRoZW4KLQlBQ19DSEVDS19MSUIoW2NyeXB0XSwgW2NyeXB0XSwgW0xJQlM9IiRMSUJTIC1sY3J5cHQiXSkKLWZpCi0KLSMgU2VhcmNoIGZvciBTSEEyNTYgc3VwcG9ydCBpbiBsaWJjIGFuZC9vciBPcGVuU1NMCi1BQ19DSEVDS19GVU5DUyhbU0hBMjU2X1VwZGF0ZSBFVlBfc2hhMjU2XSwgW1RFU1RfU1NIX1NIQTI1Nj15ZXNdLAotICAgIFtURVNUX1NTSF9TSEEyNTY9bm9dKQotQUNfU1VCU1QoW1RFU1RfU1NIX1NIQTI1Nl0pCi0KLSMgQ2hlY2sgY29tcGxldGUgRUNDIHN1cHBvcnQgaW4gT3BlblNTTAotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE9wZW5TU0wgaGFzIGNvbXBsZXRlIEVDQyBzdXBwb3J0XSkKLUFDX0xJTktfSUZFTFNFKAotCVtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9lY2RoLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9lY2RzYS5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgotI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDAwOTA4MDdmIC8qIDAuOS44ZyAqLwotIyBlcnJvciAiT3BlblNTTCA8IDAuOS44ZyBoYXMgdW5yZWxpYWJsZSBFQ0MgY29kZSIKLSNlbmRpZgotCV1dLCBbWwotCUVDX0tFWSAqZSA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZShOSURfc2VjcDUyMXIxKTsKLQljb25zdCBFVlBfTUQgKm0gPSBFVlBfc2hhNTEyKCk7IC8qIFdlIG5lZWQgdGhpcyB0b28gKi8KLQldXSldLAotCVsKLQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKLQkJQUNfREVGSU5FKFtPUEVOU1NMX0hBU19FQ0NdLCBbMV0sCi0JCSAgICBbbGliY3J5cHRvIGluY2x1ZGVzIGNvbXBsZXRlIEVDQyBzdXBwb3J0XSkKLQkJVEVTVF9TU0hfRUNDPXllcwotCQlDT01NRU5UX09VVF9FQ0M9IiIKLQldLAotCVsKLQkJQUNfTVNHX1JFU1VMVChbbm9dKQotCQlURVNUX1NTSF9FQ0M9bm8KLQkJQ09NTUVOVF9PVVRfRUNDPSIjbm8gZWNjIyIKLQldCi0pCi1BQ19TVUJTVChbVEVTVF9TU0hfRUNDXSkKLUFDX1NVQlNUKFtDT01NRU5UX09VVF9FQ0NdKQotCi1zYXZlZF9MSUJTPSIkTElCUyIKLUFDX0NIRUNLX0xJQihbaWFmXSwgW2lhX29wZW5pbmZvXSwgWwotCUxJQlM9IiRMSUJTIC1saWFmIgotCUFDX0NIRUNLX0ZVTkNTKFtzZXRfaWRdLCBbU1NIRExJQlM9IiRTU0hETElCUyAtbGlhZiIKLQkJCQlBQ19ERUZJTkUoW0hBVkVfTElCSUFGXSwgWzFdLAotICAgICAgICAJCVtEZWZpbmUgaWYgc3lzdGVtIGhhcyBsaWJpYWYgdGhhdCBzdXBwb3J0cyBzZXRfaWRdKQotCQkJCV0pCi1dKQotTElCUz0iJHNhdmVkX0xJQlMiCi0KLSMjIyBDb25maWd1cmUgY3J5cHRvZ3JhcGhpYyByYW5kb20gbnVtYmVyIHN1cHBvcnQKLQotIyBDaGVjayB3aGV0ZXIgT3BlblNTTCBzZWVkcyBpdHNlbGYKLUFDX01TR19DSEVDS0lORyhbd2hldGhlciBPcGVuU1NMJ3MgUFJORyBpcyBpbnRlcm5hbGx5IHNlZWRlZF0pCi1BQ19SVU5fSUZFTFNFKAotCVtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KLQldXSwgW1sKLQlleGl0KFJBTkRfc3RhdHVzKCkgPT0gMSA/IDAgOiAxKTsKLQldXSldLAotCVsKLQkJT1BFTlNTTF9TRUVEU19JVFNFTEY9eWVzCi0JCUFDX01TR19SRVNVTFQoW3llc10pCi0JXSwKLQlbCi0JCUFDX01TR19SRVNVTFQoW25vXSkKLQldLAotCVsKLQkJQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZzogYXNzdW1pbmcgeWVzXSkKLQkJIyBUaGlzIGlzIHNhZmUsIHNpbmNlIHdlIHdpbGwgZmF0YWwoKSBhdCBydW50aW1lIGlmCi0JCSMgT3BlblNTTCBpcyBub3Qgc2VlZGVkIGNvcnJlY3RseS4KLQkJT1BFTlNTTF9TRUVEU19JVFNFTEY9eWVzCi0JXQotKQotCi0jIFBSTkdEIFRDUCBzb2NrZXQKLUFDX0FSR19XSVRIKFtwcm5nZC1wb3J0XSwKLQlbICAtLXdpdGgtcHJuZ2QtcG9ydD1QT1JUICByZWFkIGVudHJvcHkgZnJvbSBQUk5HRC9FR0QgVENQIGxvY2FsaG9zdDpQT1JUXSwKLQlbCi0JCWNhc2UgIiR3aXRodmFsIiBpbgotCQlubykKLQkJCXdpdGh2YWw9IiIKLQkJCTs7Ci0JCVtbMC05XV0qKQotCQkJOzsKLQkJKikKLQkJCUFDX01TR19FUlJPUihbWW91IG11c3Qgc3BlY2lmeSBhIG51bWVyaWMgcG9ydCBudW1iZXIgZm9yIC0td2l0aC1wcm5nZC1wb3J0XSkKLQkJCTs7Ci0JCWVzYWMKLQkJaWYgdGVzdCAhIC16ICIkd2l0aHZhbCIgOyB0aGVuCi0JCQlQUk5HRF9QT1JUPSIkd2l0aHZhbCIKLQkJCUFDX0RFRklORV9VTlFVT1RFRChbUFJOR0RfUE9SVF0sIFskUFJOR0RfUE9SVF0sCi0JCQkJW1BvcnQgbnVtYmVyIG9mIFBSTkdEL0VHRCByYW5kb20gbnVtYmVyIHNvY2tldF0pCi0JCWZpCi0JXQotKQotCi0jIFBSTkdEIFVuaXggZG9tYWluIHNvY2tldAotQUNfQVJHX1dJVEgoW3BybmdkLXNvY2tldF0sCi0JWyAgLS13aXRoLXBybmdkLXNvY2tldD1GSUxFIHJlYWQgZW50cm9weSBmcm9tIFBSTkdEL0VHRCBzb2NrZXQgRklMRSAoZGVmYXVsdD0vdmFyL3J1bi9lZ2QtcG9vbCldLAotCVsKLQkJY2FzZSAiJHdpdGh2YWwiIGluCi0JCXllcykKLQkJCXdpdGh2YWw9Ii92YXIvcnVuL2VnZC1wb29sIgotCQkJOzsKLQkJbm8pCi0JCQl3aXRodmFsPSIiCi0JCQk7OwotCQkvKikKLQkJCTs7Ci0JCSopCi0JCQlBQ19NU0dfRVJST1IoW1lvdSBtdXN0IHNwZWNpZnkgYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgZW50cm9weSBzb2NrZXRdKQotCQkJOzsKLQkJZXNhYwotCi0JCWlmIHRlc3QgISAteiAiJHdpdGh2YWwiIDsgdGhlbgotCQkJaWYgdGVzdCAhIC16ICIkUFJOR0RfUE9SVCIgOyB0aGVuCi0JCQkJQUNfTVNHX0VSUk9SKFtZb3UgbWF5IG5vdCBzcGVjaWZ5IGJvdGggYSBQUk5HRC9FR0QgcG9ydCBhbmQgc29ja2V0XSkKLQkJCWZpCi0JCQlpZiB0ZXN0ICEgLXIgIiR3aXRodmFsIiA7IHRoZW4KLQkJCQlBQ19NU0dfV0FSTihbRW50cm9weSBzb2NrZXQgaXMgbm90IHJlYWRhYmxlXSkKLQkJCWZpCi0JCQlQUk5HRF9TT0NLRVQ9IiR3aXRodmFsIgotCQkJQUNfREVGSU5FX1VOUVVPVEVEKFtQUk5HRF9TT0NLRVRdLCBbIiRQUk5HRF9TT0NLRVQiXSwKLQkJCQlbTG9jYXRpb24gb2YgUFJOR0QvRUdEIHJhbmRvbSBudW1iZXIgc29ja2V0XSkKLQkJZmkKLQldLAotCVsKLQkJIyBDaGVjayBmb3IgZXhpc3Rpbmcgc29ja2V0IG9ubHkgaWYgd2UgZG9uJ3QgaGF2ZSBhIHJhbmRvbSBkZXZpY2UgYWxyZWFkeQotCQlpZiB0ZXN0ICJ4JE9QRU5TU0xfU0VFRFNfSVRTRUxGIiAhPSAieHllcyIgOyB0aGVuCi0JCQlBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBQUk5HRC9FR0Qgc29ja2V0XSkKLQkJCSMgSW5zZXJ0IG90aGVyIGxvY2F0aW9ucyBoZXJlCi0JCQlmb3Igc29jayBpbiAvdmFyL3J1bi9lZ2QtcG9vbCAvZGV2L2VnZC1wb29sIC9ldGMvZW50cm9weTsgZG8KLQkJCQlpZiB0ZXN0IC1yICRzb2NrICYmICRURVNUX01JTlVTX1NfU0ggLWMgInRlc3QgLVMgJHNvY2sgLW8gLXAgJHNvY2siIDsgdGhlbgotCQkJCQlQUk5HRF9TT0NLRVQ9IiRzb2NrIgotCQkJCQlBQ19ERUZJTkVfVU5RVU9URUQoW1BSTkdEX1NPQ0tFVF0sIFsiJFBSTkdEX1NPQ0tFVCJdKQotCQkJCQlicmVhazsKLQkJCQlmaQotCQkJZG9uZQotCQkJaWYgdGVzdCAhIC16ICIkUFJOR0RfU09DS0VUIiA7IHRoZW4KLQkJCQlBQ19NU0dfUkVTVUxUKFskUFJOR0RfU09DS0VUXSkKLQkJCWVsc2UKLQkJCQlBQ19NU0dfUkVTVUxUKFtub3QgZm91bmRdKQotCQkJZmkKLQkJZmkKLQldCi0pCi0KLSMgV2hpY2ggcmFuZG9tbmVzcyBzb3VyY2UgZG8gd2UgdXNlPwotaWYgdGVzdCAhIC16ICIkUFJOR0RfUE9SVCIgOyB0aGVuCi0JUkFORF9NU0c9IlBSTkdkIHBvcnQgJFBSTkdEX1BPUlQiCi1lbGlmIHRlc3QgISAteiAiJFBSTkdEX1NPQ0tFVCIgOyB0aGVuCi0JUkFORF9NU0c9IlBSTkdkIHNvY2tldCAkUFJOR0RfU09DS0VUIgotZWxpZiB0ZXN0ICEgLXogIiRPUEVOU1NMX1NFRURTX0lUU0VMRiIgOyB0aGVuCi0JQUNfREVGSU5FKFtPUEVOU1NMX1BSTkdfT05MWV0sIFsxXSwKLQkJW0RlZmluZSBpZiB5b3Ugd2FudCBPcGVuU1NMJ3MgaW50ZXJuYWxseSBzZWVkZWQgUFJORyBvbmx5XSkKLQlSQU5EX01TRz0iT3BlblNTTCBpbnRlcm5hbCBPTkxZIgotZWxzZQotCUFDX01TR19FUlJPUihbT3BlblNTSCBoYXMgbm8gc291cmNlIG9mIHJhbmRvbSBudW1iZXJzLiBQbGVhc2UgY29uZmlndXJlIE9wZW5TU0wgd2l0aCBhbiBlbnRyb3B5IHNvdXJjZSBvciByZS1ydW4gY29uZmlndXJlIHVzaW5nIG9uZSBvZiB0aGUgLS13aXRoLXBybmdkLXBvcnQgb3IgLS13aXRoLXBybmdkLXNvY2tldCBvcHRpb25zXSkKLWZpCi0KLSMgQ2hlY2sgZm9yIFBBTSBsaWJzCi1QQU1fTVNHPSJubyIKLUFDX0FSR19XSVRIKFtwYW1dLAotCVsgIC0td2l0aC1wYW0gICAgICAgICAgICAgIEVuYWJsZSBQQU0gc3VwcG9ydCBdLAotCVsKLQkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQkJCWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3NlY3VyaXR5X3BhbV9hcHBsX2giICE9ICJ4eWVzIiAmJiBcCi0JCQkgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9wYW1fcGFtX2FwcGxfaCIgIT0gInh5ZXMiIDsgdGhlbgotCQkJCUFDX01TR19FUlJPUihbUEFNIGhlYWRlcnMgbm90IGZvdW5kXSkKLQkJCWZpCi0KLQkJCXNhdmVkX0xJQlM9IiRMSUJTIgotCQkJQUNfQ0hFQ0tfTElCKFtkbF0sIFtkbG9wZW5dLCAsICkKLQkJCUFDX0NIRUNLX0xJQihbcGFtXSwgW3BhbV9zZXRfaXRlbV0sICwgW0FDX01TR19FUlJPUihbKioqIGxpYnBhbSBtaXNzaW5nXSldKQotCQkJQUNfQ0hFQ0tfRlVOQ1MoW3BhbV9nZXRlbnZsaXN0XSkKLQkJCUFDX0NIRUNLX0ZVTkNTKFtwYW1fcHV0ZW52XSkKLQkJCUxJQlM9IiRzYXZlZF9MSUJTIgotCi0JCQlQQU1fTVNHPSJ5ZXMiCi0KLQkJCVNTSERMSUJTPSIkU1NIRExJQlMgLWxwYW0iCi0JCQlBQ19ERUZJTkUoW1VTRV9QQU1dLCBbMV0sCi0JCQkJW0RlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgUEFNIHN1cHBvcnRdKQotCi0JCQlpZiB0ZXN0ICRhY19jdl9saWJfZGxfZGxvcGVuID0geWVzOyB0aGVuCi0JCQkJY2FzZSAiJExJQlMiIGluCi0JCQkJKi1sZGwqKQotCQkJCQkjIGxpYmRsIGFscmVhZHkgaW4gTElCUwotCQkJCQk7OwotCQkJCSopCi0JCQkJCVNTSERMSUJTPSIkU1NIRExJQlMgLWxkbCIKLQkJCQkJOzsKLQkJCQllc2FjCi0JCQlmaQotCQlmaQotCV0KLSkKLQotIyBDaGVjayBmb3Igb2xkZXIgUEFNCi1pZiB0ZXN0ICJ4JFBBTV9NU0ciID0gInh5ZXMiIDsgdGhlbgotCSMgQ2hlY2sgUEFNIHN0cmVycm9yIGFyZ3VtZW50cyAob2xkIFBBTSkKLQlBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgcGFtX3N0cmVycm9yIHRha2VzIG9ubHkgb25lIGFyZ3VtZW50XSkKLQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgZGVmaW5lZChIQVZFX1NFQ1VSSVRZX1BBTV9BUFBMX0gpCi0jaW5jbHVkZSA8c2VjdXJpdHkvcGFtX2FwcGwuaD4KLSNlbGlmIGRlZmluZWQgKEhBVkVfUEFNX1BBTV9BUFBMX0gpCi0jaW5jbHVkZSA8cGFtL3BhbV9hcHBsLmg+Ci0jZW5kaWYKLQkJXV0sIFtbCi0odm9pZClwYW1fc3RyZXJyb3IoKHBhbV9oYW5kbGVfdCAqKU5VTEwsIC0xKTsKLQkJXV0pXSwgW0FDX01TR19SRVNVTFQoW25vXSldLCBbCi0JCQlBQ19ERUZJTkUoW0hBVkVfT0xEX1BBTV0sIFsxXSwKLQkJCQlbRGVmaW5lIGlmIHlvdSBoYXZlIGFuIG9sZCB2ZXJzaW9uIG9mIFBBTQotCQkJCXdoaWNoIHRha2VzIG9ubHkgb25lIGFyZ3VtZW50IHRvIHBhbV9zdHJlcnJvcl0pCi0JCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCQkJUEFNX01TRz0ieWVzIChvbGQgbGlicmFyeSkiCi0JCQotCV0pCi1maQotCi1TU0hfUFJJVlNFUF9VU0VSPXNzaGQKLUFDX0FSR19XSVRIKFtwcml2c2VwLXVzZXJdLAotCVsgIC0td2l0aC1wcml2c2VwLXVzZXI9dXNlciBTcGVjaWZ5IG5vbi1wcml2aWxlZ2VkIHVzZXIgZm9yIHByaXZpbGVnZSBzZXBhcmF0aW9uXSwKLQlbCi0JCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCi0JCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0JCQlTU0hfUFJJVlNFUF9VU0VSPSR3aXRodmFsCi0JCWZpCi0JXQotKQotQUNfREVGSU5FX1VOUVVPVEVEKFtTU0hfUFJJVlNFUF9VU0VSXSwgWyIkU1NIX1BSSVZTRVBfVVNFUiJdLAotCVtub24tcHJpdmlsZWdlZCB1c2VyIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbl0pCi1BQ19TVUJTVChbU1NIX1BSSVZTRVBfVVNFUl0pCi0KLSMgRGVjaWRlIHdoaWNoIHNhbmRib3ggc3R5bGUgdG8gdXNlCi1zYW5kYm94X2FyZz0iIgotQUNfQVJHX1dJVEgoW3NhbmRib3hdLAotCVsgIC0td2l0aC1zYW5kYm94PXN0eWxlICAgIFNwZWNpZnkgcHJpdmlsZWdlIHNlcGFyYXRpb24gc2FuZGJveCAobm8sIGRhcndpbiwgcmxpbWl0LCBzeXN0cmFjZSldLAotCVsKLQkJaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4eWVzIiA7IHRoZW4KLQkJCXNhbmRib3hfYXJnPSIiCi0JCWVsc2UKLQkJCXNhbmRib3hfYXJnPSIkd2l0aHZhbCIKLQkJZmkKLQldCi0pCi1pZiB0ZXN0ICJ4JHNhbmRib3hfYXJnIiA9ICJ4c3lzdHJhY2UiIHx8IFwKLSAgICggdGVzdCAteiAiJHNhbmRib3hfYXJnIiAmJiB0ZXN0ICJ4JGhhdmVfc3lzdHJfcG9saWN5X2tpbGwiID0gIngxIiApIDsgdGhlbgotCXRlc3QgIngkaGF2ZV9zeXN0cl9wb2xpY3lfa2lsbCIgIT0gIngxIiAmJiBcCi0JCUFDX01TR19FUlJPUihbc3lzdHJhY2Ugc2FuZGJveCByZXF1aXJlcyBzeXN0cmFjZSBoZWFkZXJzIGFuZCBTWVNUUl9QT0xJQ1lfS0lMTCBzdXBwb3J0XSkKLQlTQU5EQk9YX1NUWUxFPSJzeXN0cmFjZSIKLQlBQ19ERUZJTkUoW1NBTkRCT1hfU1lTVFJBQ0VdLCBbMV0sIFtTYW5kYm94IHVzaW5nIHN5c3RyYWNlKDQpXSkKLWVsaWYgdGVzdCAieCRzYW5kYm94X2FyZyIgPSAieGRhcndpbiIgfHwgXAotICAgICAoIHRlc3QgLXogIiRzYW5kYm94X2FyZyIgJiYgdGVzdCAieCRhY19jdl9mdW5jX3NhbmRib3hfaW5pdCIgPSAieHllcyIgJiYgXAotICAgICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3NhbmRib3hfaCIgPSAieHllcyIpIDsgdGhlbgotCXRlc3QgIngkYWNfY3ZfZnVuY19zYW5kYm94X2luaXQiICE9ICJ4eWVzIiAtbyBcCi0JICAgICAieCRhY19jdl9oZWFkZXJfc2FuZGJveF9oIiAhPSAieHllcyIgJiYgXAotCQlBQ19NU0dfRVJST1IoW0RhcndpbiBzZWF0YmVsdCBzYW5kYm94IHJlcXVpcmVzIHNhbmRib3guaCBhbmQgc2FuZGJveF9pbml0IGZ1bmN0aW9uXSkKLQlTQU5EQk9YX1NUWUxFPSJkYXJ3aW4iCi0JQUNfREVGSU5FKFtTQU5EQk9YX0RBUldJTl0sIFsxXSwgW1NhbmRib3ggdXNpbmcgRGFyd2luIHNhbmRib3hfaW5pdCgzKV0pCi1lbGlmIHRlc3QgIngkc2FuZGJveF9hcmciID0gInhybGltaXQiIHx8IFwKLSAgICAgKCB0ZXN0IC16ICIkc2FuZGJveF9hcmciICYmIHRlc3QgIngkYWNfY3ZfZnVuY19zZXRybGltaXQiID0gInh5ZXMiICkgOyB0aGVuCi0JdGVzdCAieCRhY19jdl9mdW5jX3NldHJsaW1pdCIgIT0gInh5ZXMiICYmIFwKLQkJQUNfTVNHX0VSUk9SKFtybGltaXQgc2FuZGJveCByZXF1aXJlcyBzZXRybGltaXQgZnVuY3Rpb25dKQotCVNBTkRCT1hfU1RZTEU9InJsaW1pdCIKLQlBQ19ERUZJTkUoW1NBTkRCT1hfUkxJTUlUXSwgWzFdLCBbU2FuZGJveCB1c2luZyBzZXRybGltaXQoMildKQotZWxpZiB0ZXN0IC16ICIkc2FuZGJveF9hcmciIHx8IHRlc3QgIngkc2FuZGJveF9hcmciID0gInhubyIgfHwgXAotICAgICB0ZXN0ICJ4JHNhbmRib3hfYXJnIiA9ICJ4bm9uZSIgfHwgdGVzdCAieCRzYW5kYm94X2FyZyIgPSAieG51bGwiIDsgdGhlbgotCVNBTkRCT1hfU1RZTEU9Im5vbmUiCi0JQUNfREVGSU5FKFtTQU5EQk9YX05VTExdLCBbMV0sIFtubyBwcml2c2VwIHNhbmRib3hpbmddKQotZWxzZQotCUFDX01TR19FUlJPUihbdW5zdXBwb3J0ZWQgLS13aXRoLXNhbmRib3hdKQotZmkKLQotIyBDaGVhcCBoYWNrIHRvIGVuc3VyZSBORVdTLU9TIGxpYnJhcmllcyBhcmUgYXJyYW5nZWQgcmlnaHQuCi1pZiB0ZXN0ICEgLXogIiRTT05ZIiA7IHRoZW4KLSAgTElCUz0iJExJQlMgLWxpYmVydHkiOwotZmkKLQotIyBDaGVjayBmb3IgIGxvbmcgbG9uZyBkYXRhdHlwZXMKLUFDX0NIRUNLX1RZUEVTKFtsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZywgbG9uZyBkb3VibGVdKQotCi0jIENoZWNrIGRhdGF0eXBlIHNpemVzCi1BQ19DSEVDS19TSVpFT0YoW2NoYXJdLCBbMV0pCi1BQ19DSEVDS19TSVpFT0YoW3Nob3J0IGludF0sIFsyXSkKLUFDX0NIRUNLX1NJWkVPRihbaW50XSwgWzRdKQotQUNfQ0hFQ0tfU0laRU9GKFtsb25nIGludF0sIFs0XSkKLUFDX0NIRUNLX1NJWkVPRihbbG9uZyBsb25nIGludF0sIFs4XSkKLQotIyBTYW5pdHkgY2hlY2sgbG9uZyBsb25nIGZvciBzb21lIHBsYXRmb3JtcyAoQUlYKQotaWYgdGVzdCAieCRhY19jdl9zaXplb2ZfbG9uZ19sb25nX2ludCIgPSAieDQiIDsgdGhlbgotCWFjX2N2X3NpemVvZl9sb25nX2xvbmdfaW50PTAKLWZpCi0KLSMgY29tcHV0ZSBMTE9OR19NSU4gYW5kIExMT05HX01BWCBpZiB3ZSBkb24ndCBrbm93IHRoZW0uCi1pZiB0ZXN0IC16ICIkaGF2ZV9sbG9uZ19tYXgiOyB0aGVuCi0JQUNfTVNHX0NIRUNLSU5HKFtmb3IgbWF4IHZhbHVlIG9mIGxvbmcgbG9uZ10pCi0JQUNfUlVOX0lGRUxTRSgKLQkJW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0vKiBXaHkgaXMgdGhpcyBzbyBkYW1uIGhhcmQ/ICovCi0jaWZkZWYgX19HTlVDX18KLSMgdW5kZWYgX19HTlVDX18KLSNlbmRpZgotI2RlZmluZSBfX1VTRV9JU09DOTkKLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNkZWZpbmUgREFUQSAiY29uZnRlc3QubGxtaW5tYXgiCi0jZGVmaW5lIG15X2FicyhhKSAoKGEpIDwgMCA/ICgoYSkgKiAtMSkgOiAoYSkpCi0KLS8qCi0gKiBwcmludGYgaW4gbGliYyBvbiBzb21lIHBsYXRmb3JtcyAoZWcgb2xkIFRydTY0KSBkb2VzIG5vdCB1bmRlcnN0YW5kICVsbGQgc28KLSAqIHdlIGRvIHRoaXMgdGhlIGhhcmQgd2F5LgotICovCi1zdGF0aWMgaW50Ci1mcHJpbnRfbGwoRklMRSAqZiwgbG9uZyBsb25nIG4pCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JaW50IGxbc2l6ZW9mKGxvbmcgbG9uZykgKiA4XTsKLQotCWlmIChuIDwgMCkKLQkJaWYgKGZwcmludGYoZiwgIi0iKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JZm9yIChpID0gMDsgbiAhPSAwOyBpKyspIHsKLQkJbFtpXSA9IG15X2FicyhuICUgMTApOwotCQluIC89IDEwOwotCX0KLQlkbyB7Ci0JCWlmIChmcHJpbnRmKGYsICIlZCIsIGxbLS1pXSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0gd2hpbGUgKGkgIT0gMCk7Ci0JaWYgKGZwcmludGYoZiwgIiAiKSA8IDApCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gMDsKLX0KLQkJXV0sIFtbCi0JRklMRSAqZjsKLQlsb25nIGxvbmcgaSwgbGxtaW4sIGxsbWF4ID0gMDsKLQotCWlmKChmID0gZm9wZW4oREFUQSwidyIpKSA9PSBOVUxMKQotCQlleGl0KDEpOwotCi0jaWYgZGVmaW5lZChMTE9OR19NSU4pICYmIGRlZmluZWQoTExPTkdfTUFYKQotCWZwcmludGYoc3RkZXJyLCAiVXNpbmcgc3lzdGVtIGhlYWRlciBmb3IgTExPTkdfTUlOIGFuZCBMTE9OR19NQVhcbiIpOwotCWxsbWluID0gTExPTkdfTUlOOwotCWxsbWF4ID0gTExPTkdfTUFYOwotI2Vsc2UKLQlmcHJpbnRmKHN0ZGVyciwgIkNhbGN1bGF0aW5nICBMTE9OR19NSU4gYW5kIExMT05HX01BWFxuIik7Ci0JLyogVGhpcyB3aWxsIHdvcmsgb24gb25lJ3MgY29tcGxlbWVudCBhbmQgdHdvJ3MgY29tcGxlbWVudCAqLwotCWZvciAoaSA9IDE7IGkgPiBsbG1heDsgaSA8PD0gMSwgaSsrKQotCQlsbG1heCA9IGk7Ci0JbGxtaW4gPSBsbG1heCArIDFMTDsJLyogd3JhcCAqLwotI2VuZGlmCi0KLQkvKiBTYW5pdHkgY2hlY2sgKi8KLQlpZiAobGxtaW4gKyAxIDwgbGxtaW4gfHwgbGxtaW4gLSAxIDwgbGxtaW4gfHwgbGxtYXggKyAxID4gbGxtYXgKLQkgICAgfHwgbGxtYXggLSAxID4gbGxtYXggfHwgbGxtaW4gPT0gbGxtYXggfHwgbGxtaW4gPT0gMAotCSAgICB8fCBsbG1heCA9PSAwIHx8IGxsbWF4IDwgTE9OR19NQVggfHwgbGxtaW4gPiBMT05HX01JTikgewotCQlmcHJpbnRmKGYsICJ1bmtub3duIHVua25vd25cbiIpOwotCQlleGl0KDIpOwotCX0KLQotCWlmIChmcHJpbnRfbGwoZiwgbGxtaW4pIDwgMCkKLQkJZXhpdCgzKTsKLQlpZiAoZnByaW50X2xsKGYsIGxsbWF4KSA8IDApCi0JCWV4aXQoNCk7Ci0JaWYgKGZjbG9zZShmKSA8IDApCi0JCWV4aXQoNSk7Ci0JZXhpdCgwKTsKLQkJXV0pXSwKLQkJWwotCQkJbGxvbmdfbWluPWAkQVdLICd7cHJpbnQgJDF9JyBjb25mdGVzdC5sbG1pbm1heGAKLQkJCWxsb25nX21heD1gJEFXSyAne3ByaW50ICQyfScgY29uZnRlc3QubGxtaW5tYXhgCi0KLQkJCUFDX01TR19SRVNVTFQoWyRsbG9uZ19tYXhdKQotCQkJQUNfREVGSU5FX1VOUVVPVEVEKFtMTE9OR19NQVhdLCBbJHtsbG9uZ19tYXh9TExdLAotCQkJICAgIFttYXggdmFsdWUgb2YgbG9uZyBsb25nIGNhbGN1bGF0ZWQgYnkgY29uZmlndXJlXSkKLQkJCUFDX01TR19DSEVDS0lORyhbZm9yIG1pbiB2YWx1ZSBvZiBsb25nIGxvbmddKQotCQkJQUNfTVNHX1JFU1VMVChbJGxsb25nX21pbl0pCi0JCQlBQ19ERUZJTkVfVU5RVU9URUQoW0xMT05HX01JTl0sIFske2xsb25nX21pbn1MTF0sCi0JCQkgICAgW21pbiB2YWx1ZSBvZiBsb25nIGxvbmcgY2FsY3VsYXRlZCBieSBjb25maWd1cmVdKQotCQldLAotCQlbCi0JCQlBQ19NU0dfUkVTVUxUKFtub3QgZm91bmRdKQotCQldLAotCQlbCi0JCQlBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmddKQotCQldCi0JKQotZmkKLQotCi0jIE1vcmUgY2hlY2tzIGZvciBkYXRhIHR5cGVzCi1BQ19DQUNIRV9DSEVDSyhbZm9yIHVfaW50IHR5cGVdLCBhY19jdl9oYXZlX3VfaW50LCBbCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IF1dLAotCVtbIHVfaW50IGE7IGEgPSAxO11dKV0sCi0JWyBhY19jdl9oYXZlX3VfaW50PSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV91X2ludD0ibm8iIAotCV0pCi1dKQotaWYgdGVzdCAieCRhY19jdl9oYXZlX3VfaW50IiA9ICJ4eWVzIiA7IHRoZW4KLQlBQ19ERUZJTkUoW0hBVkVfVV9JTlRdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgdV9pbnQgZGF0YSB0eXBlXSkKLQloYXZlX3VfaW50PTEKLWZpCi0KLUFDX0NBQ0hFX0NIRUNLKFtmb3IgaW50WFhfdCB0eXBlc10sIGFjX2N2X2hhdmVfaW50eHhfdCwgWwotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN5cy90eXBlcy5oPiBdXSwKLQlbWyBpbnQ4X3QgYTsgaW50MTZfdCBiOyBpbnQzMl90IGM7IGEgPSBiID0gYyA9IDE7XV0pXSwKLQlbIGFjX2N2X2hhdmVfaW50eHhfdD0ieWVzIiBdLCBbIGFjX2N2X2hhdmVfaW50eHhfdD0ibm8iIAotCV0pCi1dKQotaWYgdGVzdCAieCRhY19jdl9oYXZlX2ludHh4X3QiID0gInh5ZXMiIDsgdGhlbgotCUFDX0RFRklORShbSEFWRV9JTlRYWF9UXSwgWzFdLCBbZGVmaW5lIGlmIHlvdSBoYXZlIGludHh4X3QgZGF0YSB0eXBlXSkKLQloYXZlX2ludHh4X3Q9MQotZmkKLQotaWYgKHRlc3QgLXogIiRoYXZlX2ludHh4X3QiICYmIFwKLQkgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zdGRpbnRfaCIgPSAieHllcyIpCi10aGVuCi0gICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgaW50WFhfdCB0eXBlcyBpbiBzdGRpbnQuaF0pCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3RkaW50Lmg+IF1dLAotCVtbIGludDhfdCBhOyBpbnQxNl90IGI7IGludDMyX3QgYzsgYSA9IGIgPSBjID0gMTtdXSldLAotCQlbCi0JCQlBQ19ERUZJTkUoW0hBVkVfSU5UWFhfVF0pCi0JCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCQldLCBbIEFDX01TR19SRVNVTFQoW25vXSkgCi0JXSkKLWZpCi0KLUFDX0NBQ0hFX0NIRUNLKFtmb3IgaW50NjRfdCB0eXBlXSwgYWNfY3ZfaGF2ZV9pbnQ2NF90LCBbCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfU1RESU5UX0gKLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICi0jIGluY2x1ZGUgPHN5cy9iaXR5cGVzLmg+Ci0jZW5kaWYKLQkJXV0sIFtbCi1pbnQ2NF90IGE7IGEgPSAxOwotCQldXSldLAotCVsgYWNfY3ZfaGF2ZV9pbnQ2NF90PSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV9pbnQ2NF90PSJubyIgCi0JXSkKLV0pCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfaW50NjRfdCIgPSAieHllcyIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX0lOVDY0X1RdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgaW50NjRfdCBkYXRhIHR5cGVdKQotZmkKLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciB1X2ludFhYX3QgdHlwZXNdLCBhY19jdl9oYXZlX3VfaW50eHhfdCwgWwotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN5cy90eXBlcy5oPiBdXSwKLQlbWyB1X2ludDhfdCBhOyB1X2ludDE2X3QgYjsgdV9pbnQzMl90IGM7IGEgPSBiID0gYyA9IDE7XV0pXSwKLQlbIGFjX2N2X2hhdmVfdV9pbnR4eF90PSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV91X2ludHh4X3Q9Im5vIiAKLQldKQotXSkKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV91X2ludHh4X3QiID0gInh5ZXMiIDsgdGhlbgotCUFDX0RFRklORShbSEFWRV9VX0lOVFhYX1RdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgdV9pbnR4eF90IGRhdGEgdHlwZV0pCi0JaGF2ZV91X2ludHh4X3Q9MQotZmkKLQotaWYgdGVzdCAteiAiJGhhdmVfdV9pbnR4eF90IiA7IHRoZW4KLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB1X2ludFhYX3QgdHlwZXMgaW4gc3lzL3NvY2tldC5oXSkKLQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+IF1dLAotCVtbIHVfaW50OF90IGE7IHVfaW50MTZfdCBiOyB1X2ludDMyX3QgYzsgYSA9IGIgPSBjID0gMTtdXSldLAotCQlbCi0JCQlBQ19ERUZJTkUoW0hBVkVfVV9JTlRYWF9UXSkKLQkJCUFDX01TR19SRVNVTFQoW3llc10pCi0JCV0sIFsgQUNfTVNHX1JFU1VMVChbbm9dKSAKLQldKQotZmkKLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciB1X2ludDY0X3QgdHlwZXNdLCBhY19jdl9oYXZlX3VfaW50NjRfdCwgWwotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN5cy90eXBlcy5oPiBdXSwKLQlbWyB1X2ludDY0X3QgYTsgYSA9IDE7XV0pXSwKLQlbIGFjX2N2X2hhdmVfdV9pbnQ2NF90PSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV91X2ludDY0X3Q9Im5vIiAKLQldKQotXSkKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV91X2ludDY0X3QiID0gInh5ZXMiIDsgdGhlbgotCUFDX0RFRklORShbSEFWRV9VX0lOVDY0X1RdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgdV9pbnQ2NF90IGRhdGEgdHlwZV0pCi0JaGF2ZV91X2ludDY0X3Q9MQotZmkKLQotaWYgdGVzdCAteiAiJGhhdmVfdV9pbnQ2NF90IiA7IHRoZW4KLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB1X2ludDY0X3QgdHlwZSBpbiBzeXMvYml0eXBlcy5oXSkKLQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPiBdXSwKLQlbWyB1X2ludDY0X3QgYTsgYSA9IDFdXSldLAotCQlbCi0JCQlBQ19ERUZJTkUoW0hBVkVfVV9JTlQ2NF9UXSkKLQkJCUFDX01TR19SRVNVTFQoW3llc10pCi0JCV0sIFsgQUNfTVNHX1JFU1VMVChbbm9dKSAKLQldKQotZmkKLQotaWYgdGVzdCAteiAiJGhhdmVfdV9pbnR4eF90IiA7IHRoZW4KLQlBQ19DQUNIRV9DSEVDSyhbZm9yIHVpbnRYWF90IHR5cGVzXSwgYWNfY3ZfaGF2ZV91aW50eHhfdCwgWwotCQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JCQldXSwgW1sKLQl1aW50OF90IGE7Ci0JdWludDE2X3QgYjsKLQl1aW50MzJfdCBjOwotCWEgPSBiID0gYyA9IDE7Ci0JCQldXSldLAotCQlbIGFjX2N2X2hhdmVfdWludHh4X3Q9InllcyIgXSwgWyBhY19jdl9oYXZlX3VpbnR4eF90PSJubyIgCi0JCV0pCi0JXSkKLQlpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfdWludHh4X3QiID0gInh5ZXMiIDsgdGhlbgotCQlBQ19ERUZJTkUoW0hBVkVfVUlOVFhYX1RdLCBbMV0sCi0JCQlbZGVmaW5lIGlmIHlvdSBoYXZlIHVpbnR4eF90IGRhdGEgdHlwZV0pCi0JZmkKLWZpCi0KLWlmIHRlc3QgLXogIiRoYXZlX3VpbnR4eF90IiA7IHRoZW4KLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB1aW50WFhfdCB0eXBlcyBpbiBzdGRpbnQuaF0pCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3RkaW50Lmg+IF1dLAotCVtbIHVpbnQ4X3QgYTsgdWludDE2X3QgYjsgdWludDMyX3QgYzsgYSA9IGIgPSBjID0gMTtdXSldLAotCQlbCi0JCQlBQ19ERUZJTkUoW0hBVkVfVUlOVFhYX1RdKQotCQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKLQkJXSwgWyBBQ19NU0dfUkVTVUxUKFtub10pIAotCV0pCi1maQotCi1pZiAodGVzdCAteiAiJGhhdmVfdV9pbnR4eF90IiB8fCB0ZXN0IC16ICIkaGF2ZV9pbnR4eF90IiAmJiBcCi0JICAgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX2JpdHlwZXNfaCIgPSAieHllcyIpCi10aGVuCi0JQUNfTVNHX0NIRUNLSU5HKFtmb3IgaW50WFhfdCBhbmQgdV9pbnRYWF90IHR5cGVzIGluIHN5cy9iaXR5cGVzLmhdKQotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgotCQldXSwgW1sKLQkJCWludDhfdCBhOyBpbnQxNl90IGI7IGludDMyX3QgYzsKLQkJCXVfaW50OF90IGU7IHVfaW50MTZfdCBmOyB1X2ludDMyX3QgZzsKLQkJCWEgPSBiID0gYyA9IGUgPSBmID0gZyA9IDE7Ci0JCV1dKV0sCi0JCVsKLQkJCUFDX0RFRklORShbSEFWRV9VX0lOVFhYX1RdKQotCQkJQUNfREVGSU5FKFtIQVZFX0lOVFhYX1RdKQotCQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKLQkJXSwgW0FDX01TR19SRVNVTFQoW25vXSkKLQldKQotZmkKLQotCi1BQ19DQUNIRV9DSEVDSyhbZm9yIHVfY2hhcl0sIGFjX2N2X2hhdmVfdV9jaGFyLCBbCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IF1dLAotCVtbIHVfY2hhciBmb287IGZvbyA9IDEyNTsgXV0pXSwKLQlbIGFjX2N2X2hhdmVfdV9jaGFyPSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV91X2NoYXI9Im5vIiAKLQldKQotXSkKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV91X2NoYXIiID0gInh5ZXMiIDsgdGhlbgotCUFDX0RFRklORShbSEFWRV9VX0NIQVJdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgdV9jaGFyIGRhdGEgdHlwZV0pCi1maQotCi1UWVBFX1NPQ0tMRU5fVAotCi1BQ19DSEVDS19UWVBFUyhbc2lnX2F0b21pY190XSwgLCAsIFsjaW5jbHVkZSA8c2lnbmFsLmg+XSkKLUFDX0NIRUNLX1RZUEVTKFtmc2Jsa2NudF90LCBmc2ZpbGNudF90XSwgLCAsIFsKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKLSNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfU1RBVEZTX0gKLSNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19TVEFUVkZTX0gKLSNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgotI2VuZGlmCi1dKQotCi1BQ19DSEVDS19UWVBFUyhbaW5fYWRkcl90LCBpbl9wb3J0X3RdLCAsICwKLVsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPl0pCi0KLUFDX0NBQ0hFX0NIRUNLKFtmb3Igc2l6ZV90XSwgYWNfY3ZfaGF2ZV9zaXplX3QsIFsKLQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gXV0sCi0JW1sgc2l6ZV90IGZvbzsgZm9vID0gMTIzNTsgXV0pXSwKLQlbIGFjX2N2X2hhdmVfc2l6ZV90PSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV9zaXplX3Q9Im5vIiAKLQldKQotXSkKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9zaXplX3QiID0gInh5ZXMiIDsgdGhlbgotCUFDX0RFRklORShbSEFWRV9TSVpFX1RdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgc2l6ZV90IGRhdGEgdHlwZV0pCi1maQotCi1BQ19DQUNIRV9DSEVDSyhbZm9yIHNzaXplX3RdLCBhY19jdl9oYXZlX3NzaXplX3QsIFsKLQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gXV0sCi0JW1sgc3NpemVfdCBmb287IGZvbyA9IDEyMzU7IF1dKV0sCi0JWyBhY19jdl9oYXZlX3NzaXplX3Q9InllcyIgXSwgWyBhY19jdl9oYXZlX3NzaXplX3Q9Im5vIiAKLQldKQotXSkKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9zc2l6ZV90IiA9ICJ4eWVzIiA7IHRoZW4KLQlBQ19ERUZJTkUoW0hBVkVfU1NJWkVfVF0sIFsxXSwgW2RlZmluZSBpZiB5b3UgaGF2ZSBzc2l6ZV90IGRhdGEgdHlwZV0pCi1maQotCi1BQ19DQUNIRV9DSEVDSyhbZm9yIGNsb2NrX3RdLCBhY19jdl9oYXZlX2Nsb2NrX3QsIFsKLQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDx0aW1lLmg+IF1dLAotCVtbIGNsb2NrX3QgZm9vOyBmb28gPSAxMjM1OyBdXSldLAotCVsgYWNfY3ZfaGF2ZV9jbG9ja190PSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV9jbG9ja190PSJubyIgCi0JXSkKLV0pCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfY2xvY2tfdCIgPSAieHllcyIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX0NMT0NLX1RdLCBbMV0sIFtkZWZpbmUgaWYgeW91IGhhdmUgY2xvY2tfdCBkYXRhIHR5cGVdKQotZmkKLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzYV9mYW1pbHlfdF0sIGFjX2N2X2hhdmVfc2FfZmFtaWx5X3QsIFsKLQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCQldXSwgW1sgc2FfZmFtaWx5X3QgZm9vOyBmb28gPSAxMjM1OyBdXSldLAotCVsgYWNfY3ZfaGF2ZV9zYV9mYW1pbHlfdD0ieWVzIiBdLAotCVsgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0JCV1dLCBbWyBzYV9mYW1pbHlfdCBmb287IGZvbyA9IDEyMzU7IF1dKV0sCi0JCVsgYWNfY3ZfaGF2ZV9zYV9mYW1pbHlfdD0ieWVzIiBdLAotCQlbIGFjX2N2X2hhdmVfc2FfZmFtaWx5X3Q9Im5vIiBdCi0JKQotCV0pCi1dKQotaWYgdGVzdCAieCRhY19jdl9oYXZlX3NhX2ZhbWlseV90IiA9ICJ4eWVzIiA7IHRoZW4KLQlBQ19ERUZJTkUoW0hBVkVfU0FfRkFNSUxZX1RdLCBbMV0sCi0JCVtkZWZpbmUgaWYgeW91IGhhdmUgc2FfZmFtaWx5X3QgZGF0YSB0eXBlXSkKLWZpCi0KLUFDX0NBQ0hFX0NIRUNLKFtmb3IgcGlkX3RdLCBhY19jdl9oYXZlX3BpZF90LCBbCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IF1dLAotCVtbIHBpZF90IGZvbzsgZm9vID0gMTIzNTsgXV0pXSwKLQlbIGFjX2N2X2hhdmVfcGlkX3Q9InllcyIgXSwgWyBhY19jdl9oYXZlX3BpZF90PSJubyIgCi0JXSkKLV0pCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfcGlkX3QiID0gInh5ZXMiIDsgdGhlbgotCUFDX0RFRklORShbSEFWRV9QSURfVF0sIFsxXSwgW2RlZmluZSBpZiB5b3UgaGF2ZSBwaWRfdCBkYXRhIHR5cGVdKQotZmkKLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciBtb2RlX3RdLCBhY19jdl9oYXZlX21vZGVfdCwgWwotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN5cy90eXBlcy5oPiBdXSwKLQlbWyBtb2RlX3QgZm9vOyBmb28gPSAxMjM1OyBdXSldLAotCVsgYWNfY3ZfaGF2ZV9tb2RlX3Q9InllcyIgXSwgWyBhY19jdl9oYXZlX21vZGVfdD0ibm8iIAotCV0pCi1dKQotaWYgdGVzdCAieCRhY19jdl9oYXZlX21vZGVfdCIgPSAieHllcyIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX01PREVfVF0sIFsxXSwgW2RlZmluZSBpZiB5b3UgaGF2ZSBtb2RlX3QgZGF0YSB0eXBlXSkKLWZpCi0KLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZV0sIGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UsIFsKLQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCQldXSwgW1sgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgczsgXV0pXSwKLQlbIGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2U9InllcyIgXSwKLQlbIGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2U9Im5vIiAKLQldKQotXSkKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9zdHJ1Y3Rfc29ja2FkZHJfc3RvcmFnZSIgPSAieHllcyIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX1NUUlVDVF9TT0NLQUREUl9TVE9SQUdFXSwgWzFdLAotCQlbZGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGRhdGEgdHlwZV0pCi1maQotCi1BQ19DQUNIRV9DSEVDSyhbZm9yIHN0cnVjdCBzb2NrYWRkcl9pbjZdLCBhY19jdl9oYXZlX3N0cnVjdF9zb2NrYWRkcl9pbjYsIFsKLQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCQldXSwgW1sgc3RydWN0IHNvY2thZGRyX2luNiBzOyBzLnNpbjZfZmFtaWx5ID0gMDsgXV0pXSwKLQlbIGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX2luNj0ieWVzIiBdLAotCVsgYWNfY3ZfaGF2ZV9zdHJ1Y3Rfc29ja2FkZHJfaW42PSJubyIgCi0JXSkKLV0pCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfc3RydWN0X3NvY2thZGRyX2luNiIgPSAieHllcyIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX1NUUlVDVF9TT0NLQUREUl9JTjZdLCBbMV0sCi0JCVtkZWZpbmUgaWYgeW91IGhhdmUgc3RydWN0IHNvY2thZGRyX2luNiBkYXRhIHR5cGVdKQotZmkKLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzdHJ1Y3QgaW42X2FkZHJdLCBhY19jdl9oYXZlX3N0cnVjdF9pbjZfYWRkciwgWwotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0JCV1dLCBbWyBzdHJ1Y3QgaW42X2FkZHIgczsgcy5zNl9hZGRyWzBdID0gMDsgXV0pXSwKLQlbIGFjX2N2X2hhdmVfc3RydWN0X2luNl9hZGRyPSJ5ZXMiIF0sCi0JWyBhY19jdl9oYXZlX3N0cnVjdF9pbjZfYWRkcj0ibm8iIAotCV0pCi1dKQotaWYgdGVzdCAieCRhY19jdl9oYXZlX3N0cnVjdF9pbjZfYWRkciIgPSAieHllcyIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX1NUUlVDVF9JTjZfQUREUl0sIFsxXSwKLQkJW2RlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3QgaW42X2FkZHIgZGF0YSB0eXBlXSkKLQotZG5sIE5vdyBjaGVjayBmb3Igc2luNl9zY29wZV9pZAotCUFDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBzb2NrYWRkcl9pbjYuc2luNl9zY29wZV9pZF0sICwgLAotCQlbCi0jaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCQldKQotZmkKLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzdHJ1Y3QgYWRkcmluZm9dLCBhY19jdl9oYXZlX3N0cnVjdF9hZGRyaW5mbywgWwotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLQkJXV0sIFtbIHN0cnVjdCBhZGRyaW5mbyBzOyBzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsgXV0pXSwKLQlbIGFjX2N2X2hhdmVfc3RydWN0X2FkZHJpbmZvPSJ5ZXMiIF0sCi0JWyBhY19jdl9oYXZlX3N0cnVjdF9hZGRyaW5mbz0ibm8iIAotCV0pCi1dKQotaWYgdGVzdCAieCRhY19jdl9oYXZlX3N0cnVjdF9hZGRyaW5mbyIgPSAieHllcyIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX1NUUlVDVF9BRERSSU5GT10sIFsxXSwKLQkJW2RlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3QgYWRkcmluZm8gZGF0YSB0eXBlXSkKLWZpCi0KLUFDX0NBQ0hFX0NIRUNLKFtmb3Igc3RydWN0IHRpbWV2YWxdLCBhY19jdl9oYXZlX3N0cnVjdF90aW1ldmFsLCBbCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8c3lzL3RpbWUuaD4gXV0sCi0JW1sgc3RydWN0IHRpbWV2YWwgdHY7IHR2LnR2X3NlYyA9IDE7XV0pXSwKLQlbIGFjX2N2X2hhdmVfc3RydWN0X3RpbWV2YWw9InllcyIgXSwKLQlbIGFjX2N2X2hhdmVfc3RydWN0X3RpbWV2YWw9Im5vIiAKLQldKQotXSkKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9zdHJ1Y3RfdGltZXZhbCIgPSAieHllcyIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX1NUUlVDVF9USU1FVkFMXSwgWzFdLCBbZGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCB0aW1ldmFsXSkKLQloYXZlX3N0cnVjdF90aW1ldmFsPTEKLWZpCi0KLUFDX0NIRUNLX1RZUEVTKFtzdHJ1Y3QgdGltZXNwZWNdKQotCi0jIFdlIG5lZWQgaW50NjRfdCBvciBlbHNlIGNlcnRpYW4gcGFydHMgb2YgdGhlIGNvbXBpbGUgd2lsbCBmYWlsLgotaWYgdGVzdCAieCRhY19jdl9oYXZlX2ludDY0X3QiID0gInhubyIgJiYgXAotCXRlc3QgIngkYWNfY3Zfc2l6ZW9mX2xvbmdfaW50IiAhPSAieDgiICYmIFwKLQl0ZXN0ICJ4JGFjX2N2X3NpemVvZl9sb25nX2xvbmdfaW50IiA9ICJ4MCIgOyB0aGVuCi0JZWNobyAiT3BlblNTSCByZXF1aXJlcyBpbnQ2NF90IHN1cHBvcnQuICBDb250YWN0IHlvdXIgdmVuZG9yIG9yIGluc3RhbGwiCi0JZWNobyAiYW4gYWx0ZXJuYXRpdmUgY29tcGlsZXIgKEkuRS4sIEdDQykgYmVmb3JlIGNvbnRpbnVpbmcuIgotCWVjaG8gIiIKLQlleGl0IDE7Ci1lbHNlCi1kbmwgdGVzdCBzbnByaW50ZiAoYnJva2VuIG9uIFNDTyB3L2djYykKLQlBQ19SVU5fSUZFTFNFKAotCQlbQUNfTEFOR19TT1VSQ0UoW1sKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2lmZGVmIEhBVkVfU05QUklOVEYKLW1haW4oKQotewotCWNoYXIgYnVmWzUwXTsKLQljaGFyIGV4cGVjdGVkX291dFs1MF07Ci0JaW50IG1henNpemUgPSA1MCA7Ci0jaWYgKFNJWkVPRl9MT05HX0lOVCA9PSA4KQotCWxvbmcgaW50IG51bSA9IDB4N2ZmZmZmZmZmZmZmZmZmZjsKLSNlbHNlCi0JbG9uZyBsb25nIG51bSA9IDB4N2ZmZmZmZmZmZmZmZmZmZmxsOwotI2VuZGlmCi0Jc3RyY3B5KGV4cGVjdGVkX291dCwgIjkyMjMzNzIwMzY4NTQ3NzU4MDciKTsKLQlzbnByaW50ZihidWYsIG1henNpemUsICIlbGxkIiwgbnVtKTsKLQlpZihzdHJjbXAoYnVmLCBleHBlY3RlZF9vdXQpICE9IDApCi0JCWV4aXQoMSk7Ci0JZXhpdCgwKTsKLX0KLSNlbHNlCi1tYWluKCkgeyBleGl0KDApOyB9Ci0jZW5kaWYKLQkJXV0pXSwgWyB0cnVlIF0sIFsgQUNfREVGSU5FKFtCUk9LRU5fU05QUklOVEZdKSBdLAotCQlBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBBc3N1bWluZyB3b3JraW5nIHNucHJpbnRmKCldKQotCSkKLWZpCi0KLWRubCBDaGVja3MgZm9yIHN0cnVjdHVyZSBtZW1iZXJzCi1PU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3V0X2hvc3RdLCBbdXRtcC5oXSwgW0hBVkVfSE9TVF9JTl9VVE1QXSkKLU9TU0hfQ0hFQ0tfSEVBREVSX0ZPUl9GSUVMRChbdXRfaG9zdF0sIFt1dG1weC5oXSwgW0hBVkVfSE9TVF9JTl9VVE1QWF0pCi1PU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3N5c2xlbl0sIFt1dG1weC5oXSwgW0hBVkVfU1lTTEVOX0lOX1VUTVBYXSkKLU9TU0hfQ0hFQ0tfSEVBREVSX0ZPUl9GSUVMRChbdXRfcGlkXSwgW3V0bXAuaF0sIFtIQVZFX1BJRF9JTl9VVE1QXSkKLU9TU0hfQ0hFQ0tfSEVBREVSX0ZPUl9GSUVMRChbdXRfdHlwZV0sIFt1dG1wLmhdLCBbSEFWRV9UWVBFX0lOX1VUTVBdKQotT1NTSF9DSEVDS19IRUFERVJfRk9SX0ZJRUxEKFt1dF90eXBlXSwgW3V0bXB4LmhdLCBbSEFWRV9UWVBFX0lOX1VUTVBYXSkKLU9TU0hfQ0hFQ0tfSEVBREVSX0ZPUl9GSUVMRChbdXRfdHZdLCBbdXRtcC5oXSwgW0hBVkVfVFZfSU5fVVRNUF0pCi1PU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3V0X2lkXSwgW3V0bXAuaF0sIFtIQVZFX0lEX0lOX1VUTVBdKQotT1NTSF9DSEVDS19IRUFERVJfRk9SX0ZJRUxEKFt1dF9pZF0sIFt1dG1weC5oXSwgW0hBVkVfSURfSU5fVVRNUFhdKQotT1NTSF9DSEVDS19IRUFERVJfRk9SX0ZJRUxEKFt1dF9hZGRyXSwgW3V0bXAuaF0sIFtIQVZFX0FERFJfSU5fVVRNUF0pCi1PU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3V0X2FkZHJdLCBbdXRtcHguaF0sIFtIQVZFX0FERFJfSU5fVVRNUFhdKQotT1NTSF9DSEVDS19IRUFERVJfRk9SX0ZJRUxEKFt1dF9hZGRyX3Y2XSwgW3V0bXAuaF0sIFtIQVZFX0FERFJfVjZfSU5fVVRNUF0pCi1PU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3V0X2FkZHJfdjZdLCBbdXRtcHguaF0sIFtIQVZFX0FERFJfVjZfSU5fVVRNUFhdKQotT1NTSF9DSEVDS19IRUFERVJfRk9SX0ZJRUxEKFt1dF9leGl0XSwgW3V0bXAuaF0sIFtIQVZFX0VYSVRfSU5fVVRNUF0pCi1PU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3V0X3RpbWVdLCBbdXRtcC5oXSwgW0hBVkVfVElNRV9JTl9VVE1QXSkKLU9TU0hfQ0hFQ0tfSEVBREVSX0ZPUl9GSUVMRChbdXRfdGltZV0sIFt1dG1weC5oXSwgW0hBVkVfVElNRV9JTl9VVE1QWF0pCi1PU1NIX0NIRUNLX0hFQURFUl9GT1JfRklFTEQoW3V0X3R2XSwgW3V0bXB4LmhdLCBbSEFWRV9UVl9JTl9VVE1QWF0pCi0KLUFDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBzdGF0LnN0X2Jsa3NpemVdKQotQUNfQ0hFQ0tfTUVNQkVSKFtzdHJ1Y3QgX19yZXNfc3RhdGUucmV0cmFuc10sIFtdLCBbQUNfREVGSU5FKFtfX3Jlc19zdGF0ZV0sIFtzdGF0ZV0sCi0JW0RlZmluZSBpZiB3ZSBkb24ndCBoYXZlIHN0cnVjdCBfX3Jlc19zdGF0ZSBpbiByZXNvbHYuaF0pXSwKLVsKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmIEhBVkVfU1lTX1RZUEVTX0gKLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+Ci0jaW5jbHVkZSA8cmVzb2x2Lmg+Ci1dKQotCi1BQ19DQUNIRV9DSEVDSyhbZm9yIHNzX2ZhbWlseSBmaWVsZCBpbiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZV0sCi0JCWFjX2N2X2hhdmVfc3NfZmFtaWx5X2luX3N0cnVjdF9zcywgWwotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0JCV1dLCBbWyBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzOyBzLnNzX2ZhbWlseSA9IDE7IF1dKV0sCi0JWyBhY19jdl9oYXZlX3NzX2ZhbWlseV9pbl9zdHJ1Y3Rfc3M9InllcyIgXSwKLQlbIGFjX2N2X2hhdmVfc3NfZmFtaWx5X2luX3N0cnVjdF9zcz0ibm8iIF0pCi1dKQotaWYgdGVzdCAieCRhY19jdl9oYXZlX3NzX2ZhbWlseV9pbl9zdHJ1Y3Rfc3MiID0gInh5ZXMiIDsgdGhlbgotCUFDX0RFRklORShbSEFWRV9TU19GQU1JTFlfSU5fU1NdLCBbMV0sIFtGaWVsZHMgaW4gc3RydWN0IHNvY2thZGRyX3N0b3JhZ2VdKQotZmkKLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciBfX3NzX2ZhbWlseSBmaWVsZCBpbiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZV0sCi0JCWFjX2N2X2hhdmVfX19zc19mYW1pbHlfaW5fc3RydWN0X3NzLCBbCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQkJXV0sIFtbIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHM7IHMuX19zc19mYW1pbHkgPSAxOyBdXSldLAotCVsgYWNfY3ZfaGF2ZV9fX3NzX2ZhbWlseV9pbl9zdHJ1Y3Rfc3M9InllcyIgXSwKLQlbIGFjX2N2X2hhdmVfX19zc19mYW1pbHlfaW5fc3RydWN0X3NzPSJubyIgCi0JXSkKLV0pCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfX19zc19mYW1pbHlfaW5fc3RydWN0X3NzIiA9ICJ4eWVzIiA7IHRoZW4KLQlBQ19ERUZJTkUoW0hBVkVfX19TU19GQU1JTFlfSU5fU1NdLCBbMV0sCi0JCVtGaWVsZHMgaW4gc3RydWN0IHNvY2thZGRyX3N0b3JhZ2VdKQotZmkKLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciBwd19jbGFzcyBmaWVsZCBpbiBzdHJ1Y3QgcGFzc3dkXSwKLQkJYWNfY3ZfaGF2ZV9wd19jbGFzc19pbl9zdHJ1Y3RfcGFzc3dkLCBbCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8cHdkLmg+IF1dLAotCVtbIHN0cnVjdCBwYXNzd2QgcDsgcC5wd19jbGFzcyA9IDA7IF1dKV0sCi0JWyBhY19jdl9oYXZlX3B3X2NsYXNzX2luX3N0cnVjdF9wYXNzd2Q9InllcyIgXSwKLQlbIGFjX2N2X2hhdmVfcHdfY2xhc3NfaW5fc3RydWN0X3Bhc3N3ZD0ibm8iIAotCV0pCi1dKQotaWYgdGVzdCAieCRhY19jdl9oYXZlX3B3X2NsYXNzX2luX3N0cnVjdF9wYXNzd2QiID0gInh5ZXMiIDsgdGhlbgotCUFDX0RFRklORShbSEFWRV9QV19DTEFTU19JTl9QQVNTV0RdLCBbMV0sCi0JCVtEZWZpbmUgaWYgeW91ciBwYXNzd29yZCBoYXMgYSBwd19jbGFzcyBmaWVsZF0pCi1maQotCi1BQ19DQUNIRV9DSEVDSyhbZm9yIHB3X2V4cGlyZSBmaWVsZCBpbiBzdHJ1Y3QgcGFzc3dkXSwKLQkJYWNfY3ZfaGF2ZV9wd19leHBpcmVfaW5fc3RydWN0X3Bhc3N3ZCwgWwotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHB3ZC5oPiBdXSwKLQlbWyBzdHJ1Y3QgcGFzc3dkIHA7IHAucHdfZXhwaXJlID0gMDsgXV0pXSwKLQlbIGFjX2N2X2hhdmVfcHdfZXhwaXJlX2luX3N0cnVjdF9wYXNzd2Q9InllcyIgXSwKLQlbIGFjX2N2X2hhdmVfcHdfZXhwaXJlX2luX3N0cnVjdF9wYXNzd2Q9Im5vIiAKLQldKQotXSkKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9wd19leHBpcmVfaW5fc3RydWN0X3Bhc3N3ZCIgPSAieHllcyIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX1BXX0VYUElSRV9JTl9QQVNTV0RdLCBbMV0sCi0JCVtEZWZpbmUgaWYgeW91ciBwYXNzd29yZCBoYXMgYSBwd19leHBpcmUgZmllbGRdKQotZmkKLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciBwd19jaGFuZ2UgZmllbGQgaW4gc3RydWN0IHBhc3N3ZF0sCi0JCWFjX2N2X2hhdmVfcHdfY2hhbmdlX2luX3N0cnVjdF9wYXNzd2QsIFsKLQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxwd2QuaD4gXV0sCi0JW1sgc3RydWN0IHBhc3N3ZCBwOyBwLnB3X2NoYW5nZSA9IDA7IF1dKV0sCi0JWyBhY19jdl9oYXZlX3B3X2NoYW5nZV9pbl9zdHJ1Y3RfcGFzc3dkPSJ5ZXMiIF0sCi0JWyBhY19jdl9oYXZlX3B3X2NoYW5nZV9pbl9zdHJ1Y3RfcGFzc3dkPSJubyIgCi0JXSkKLV0pCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfcHdfY2hhbmdlX2luX3N0cnVjdF9wYXNzd2QiID0gInh5ZXMiIDsgdGhlbgotCUFDX0RFRklORShbSEFWRV9QV19DSEFOR0VfSU5fUEFTU1dEXSwgWzFdLAotCQlbRGVmaW5lIGlmIHlvdXIgcGFzc3dvcmQgaGFzIGEgcHdfY2hhbmdlIGZpZWxkXSkKLWZpCi0KLUFDX0NBQ0hFX0NIRUNLKFtmb3IgcHdfZ2Vjb3MgZmllbGQgaW4gc3RydWN0IHBhc3N3ZF0sCi0JCWFjX2N2X2hhdmVfcHdfZ2Vjb3NfaW5fc3RydWN0X3Bhc3N3ZCwgWwotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHB3ZC5oPiBdXSwKLQlbWyBzdHJ1Y3QgcGFzc3dkIHA7IHAucHdfZ2Vjb3MgPSAwOyBdXSldLAotCVsgYWNfY3ZfaGF2ZV9wd19nZWNvc19pbl9zdHJ1Y3RfcGFzc3dkPSJ5ZXMiIF0sCi0JWyBhY19jdl9oYXZlX3B3X2dlY29zX2luX3N0cnVjdF9wYXNzd2Q9Im5vIiAKLQldKQotXSkKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9wd19nZWNvc19pbl9zdHJ1Y3RfcGFzc3dkIiA9ICJ4eWVzIiA7IHRoZW4KLQlBQ19ERUZJTkUoW0hBVkVfUFdfR0VDT1NfSU5fUEFTU1dEXSwgWzFdLAotCQlbRGVmaW5lIGlmIHlvdXIgcGFzc3dvcmQgaGFzIGEgcHdfZ2Vjb3MgZmllbGRdKQotZmkKLQotZG5sIG1ha2Ugc3VyZSB3ZSdyZSB1c2luZyB0aGUgcmVhbCBzdHJ1Y3R1cmUgbWVtYmVycyBhbmQgbm90IGRlZmluZXMKLUFDX0NBQ0hFX0NIRUNLKFtmb3IgbXNnX2FjY3JpZ2h0cyBmaWVsZCBpbiBzdHJ1Y3QgbXNnaGRyXSwKLQkJYWNfY3ZfaGF2ZV9hY2NyaWdodHNfaW5fbXNnaGRyLCBbCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdWlvLmg+Ci0JCV1dLCBbWwotI2lmZGVmIG1zZ19hY2NyaWdodHMKLSNlcnJvciAibXNnX2FjY3JpZ2h0cyBpcyBhIG1hY3JvIgotZXhpdCgxKTsKLSNlbmRpZgotc3RydWN0IG1zZ2hkciBtOwotbS5tc2dfYWNjcmlnaHRzID0gMDsKLWV4aXQoMCk7Ci0JCV1dKV0sCi0JCVsgYWNfY3ZfaGF2ZV9hY2NyaWdodHNfaW5fbXNnaGRyPSJ5ZXMiIF0sCi0JCVsgYWNfY3ZfaGF2ZV9hY2NyaWdodHNfaW5fbXNnaGRyPSJubyIgXQotCSkKLV0pCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfYWNjcmlnaHRzX2luX21zZ2hkciIgPSAieHllcyIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX0FDQ1JJR0hUU19JTl9NU0dIRFJdLCBbMV0sCi0JCVtEZWZpbmUgaWYgeW91ciBzeXN0ZW0gdXNlcyBhY2Nlc3MgcmlnaHRzIHN0eWxlCi0JCWZpbGUgZGVzY3JpcHRvciBwYXNzaW5nXSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhbaWYgc3RydWN0IHN0YXR2ZnMuZl9mc2lkIGlzIGludGVncmFsIHR5cGVdKQotQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19NT1VOVF9ICi0jaW5jbHVkZSA8c3lzL21vdW50Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19TVEFUVkZTX0gKLSNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgotI2VuZGlmCi0JXV0sIFtbIHN0cnVjdCBzdGF0dmZzIHM7IHMuZl9mc2lkID0gMDsgXV0pXSwKLQlbIEFDX01TR19SRVNVTFQoW3llc10pIF0sCi0JWyBBQ19NU0dfUkVTVUxUKFtub10pCi0KLQlBQ19NU0dfQ0hFQ0tJTkcoW2lmIGZzaWRfdCBoYXMgbWVtYmVyIHZhbF0pCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+Ci0JXV0sIFtbIGZzaWRfdCB0OyB0LnZhbFswXSA9IDA7IF1dKV0sCi0JWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCSAgQUNfREVGSU5FKFtGU0lEX0hBU19WQUxdLCBbMV0sIFtmc2lkX3QgaGFzIG1lbWJlciB2YWxdKSBdLAotCVsgQUNfTVNHX1JFU1VMVChbbm9dKSBdKQotCi0JQUNfTVNHX0NIRUNLSU5HKFtpZiBmX2ZzaWQgaGFzIG1lbWJlciBfX3ZhbF0pCi0JQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+Ci0JXV0sIFtbIGZzaWRfdCB0OyB0Ll9fdmFsWzBdID0gMDsgXV0pXSwKLQlbIEFDX01TR19SRVNVTFQoW3llc10pCi0JICBBQ19ERUZJTkUoW0ZTSURfSEFTX19fVkFMXSwgWzFdLCBbZnNpZF90IGhhcyBtZW1iZXIgX192YWxdKSBdLAotCVsgQUNfTVNHX1JFU1VMVChbbm9dKSBdKQotXSkKLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciBtc2dfY29udHJvbCBmaWVsZCBpbiBzdHJ1Y3QgbXNnaGRyXSwKLQkJYWNfY3ZfaGF2ZV9jb250cm9sX2luX21zZ2hkciwgWwotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotCQldXSwgW1sKLSNpZmRlZiBtc2dfY29udHJvbAotI2Vycm9yICJtc2dfY29udHJvbCBpcyBhIG1hY3JvIgotZXhpdCgxKTsKLSNlbmRpZgotc3RydWN0IG1zZ2hkciBtOwotbS5tc2dfY29udHJvbCA9IDA7Ci1leGl0KDApOwotCQldXSldLAotCQlbIGFjX2N2X2hhdmVfY29udHJvbF9pbl9tc2doZHI9InllcyIgXSwKLQkJWyBhY19jdl9oYXZlX2NvbnRyb2xfaW5fbXNnaGRyPSJubyIgXQotCSkKLV0pCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfY29udHJvbF9pbl9tc2doZHIiID0gInh5ZXMiIDsgdGhlbgotCUFDX0RFRklORShbSEFWRV9DT05UUk9MX0lOX01TR0hEUl0sIFsxXSwKLQkJW0RlZmluZSBpZiB5b3VyIHN5c3RlbSB1c2VzIGFuY2lsbGFyeSBkYXRhIHN0eWxlCi0JCWZpbGUgZGVzY3JpcHRvciBwYXNzaW5nXSkKLWZpCi0KLUFDX0NBQ0hFX0NIRUNLKFtpZiBsaWJjIGRlZmluZXMgX19wcm9nbmFtZV0sIGFjX2N2X2xpYmNfZGVmaW5lc19fX3Byb2duYW1lLCBbCi0JQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW11dLAotCQlbWyBleHRlcm4gY2hhciAqX19wcm9nbmFtZTsgcHJpbnRmKCIlcyIsIF9fcHJvZ25hbWUpOyBdXSldLAotCVsgYWNfY3ZfbGliY19kZWZpbmVzX19fcHJvZ25hbWU9InllcyIgXSwKLQlbIGFjX2N2X2xpYmNfZGVmaW5lc19fX3Byb2duYW1lPSJubyIgCi0JXSkKLV0pCi1pZiB0ZXN0ICJ4JGFjX2N2X2xpYmNfZGVmaW5lc19fX3Byb2duYW1lIiA9ICJ4eWVzIiA7IHRoZW4KLQlBQ19ERUZJTkUoW0hBVkVfX19QUk9HTkFNRV0sIFsxXSwgW0RlZmluZSBpZiBsaWJjIGRlZmluZXMgX19wcm9nbmFtZV0pCi1maQotCi1BQ19DQUNIRV9DSEVDSyhbd2hldGhlciAkQ0MgaW1wbGVtZW50cyBfX0ZVTkNUSU9OX19dLCBhY19jdl9jY19pbXBsZW1lbnRzX19fRlVOQ1RJT05fXywgWwotCUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPHN0ZGlvLmg+IF1dLAotCQlbWyBwcmludGYoIiVzIiwgX19GVU5DVElPTl9fKTsgXV0pXSwKLQlbIGFjX2N2X2NjX2ltcGxlbWVudHNfX19GVU5DVElPTl9fPSJ5ZXMiIF0sCi0JWyBhY19jdl9jY19pbXBsZW1lbnRzX19fRlVOQ1RJT05fXz0ibm8iIAotCV0pCi1dKQotaWYgdGVzdCAieCRhY19jdl9jY19pbXBsZW1lbnRzX19fRlVOQ1RJT05fXyIgPSAieHllcyIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX19fRlVOQ1RJT05fX10sIFsxXSwKLQkJW0RlZmluZSBpZiBjb21waWxlciBpbXBsZW1lbnRzIF9fRlVOQ1RJT05fX10pCi1maQotCi1BQ19DQUNIRV9DSEVDSyhbd2hldGhlciAkQ0MgaW1wbGVtZW50cyBfX2Z1bmNfX10sIGFjX2N2X2NjX2ltcGxlbWVudHNfX19mdW5jX18sIFsKLQlBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxzdGRpby5oPiBdXSwKLQkJW1sgcHJpbnRmKCIlcyIsIF9fZnVuY19fKTsgXV0pXSwKLQlbIGFjX2N2X2NjX2ltcGxlbWVudHNfX19mdW5jX189InllcyIgXSwKLQlbIGFjX2N2X2NjX2ltcGxlbWVudHNfX19mdW5jX189Im5vIiAKLQldKQotXSkKLWlmIHRlc3QgIngkYWNfY3ZfY2NfaW1wbGVtZW50c19fX2Z1bmNfXyIgPSAieHllcyIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX19fZnVuY19fXSwgWzFdLCBbRGVmaW5lIGlmIGNvbXBpbGVyIGltcGxlbWVudHMgX19mdW5jX19dKQotZmkKLQotQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdmFfY29weSBleGlzdHNdLCBhY19jdl9oYXZlX3ZhX2NvcHksIFsKLQlBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci12YV9saXN0IHgseTsKLQkJXV0sIFtbIHZhX2NvcHkoeCx5KTsgXV0pXSwKLQlbIGFjX2N2X2hhdmVfdmFfY29weT0ieWVzIiBdLAotCVsgYWNfY3ZfaGF2ZV92YV9jb3B5PSJubyIgCi0JXSkKLV0pCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfdmFfY29weSIgPSAieHllcyIgOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX1ZBX0NPUFldLCBbMV0sIFtEZWZpbmUgaWYgdmFfY29weSBleGlzdHNdKQotZmkKLQotQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgX192YV9jb3B5IGV4aXN0c10sIGFjX2N2X2hhdmVfX192YV9jb3B5LCBbCi0JQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotdmFfbGlzdCB4LHk7Ci0JCV1dLCBbWyBfX3ZhX2NvcHkoeCx5KTsgXV0pXSwKLQlbIGFjX2N2X2hhdmVfX192YV9jb3B5PSJ5ZXMiIF0sIFsgYWNfY3ZfaGF2ZV9fX3ZhX2NvcHk9Im5vIiAKLQldKQotXSkKLWlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9fX3ZhX2NvcHkiID0gInh5ZXMiIDsgdGhlbgotCUFDX0RFRklORShbSEFWRV9fX1ZBX0NPUFldLCBbMV0sIFtEZWZpbmUgaWYgX192YV9jb3B5IGV4aXN0c10pCi1maQotCi1BQ19DQUNIRV9DSEVDSyhbd2hldGhlciBnZXRvcHQgaGFzIG9wdHJlc2V0IHN1cHBvcnRdLAotCQlhY19jdl9oYXZlX2dldG9wdF9vcHRyZXNldCwgWwotCUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sgI2luY2x1ZGUgPGdldG9wdC5oPiBdXSwKLQkJW1sgZXh0ZXJuIGludCBvcHRyZXNldDsgb3B0cmVzZXQgPSAwOyBdXSldLAotCVsgYWNfY3ZfaGF2ZV9nZXRvcHRfb3B0cmVzZXQ9InllcyIgXSwKLQlbIGFjX2N2X2hhdmVfZ2V0b3B0X29wdHJlc2V0PSJubyIgCi0JXSkKLV0pCi1pZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZ2V0b3B0X29wdHJlc2V0IiA9ICJ4eWVzIiA7IHRoZW4KLQlBQ19ERUZJTkUoW0hBVkVfR0VUT1BUX09QVFJFU0VUXSwgWzFdLAotCQlbRGVmaW5lIGlmIHlvdXIgZ2V0b3B0KDMpIGRlZmluZXMgYW5kIHVzZXMgb3B0cmVzZXRdKQotZmkKLQotQUNfQ0FDSEVfQ0hFQ0soW2lmIGxpYmMgZGVmaW5lcyBzeXNfZXJybGlzdF0sIGFjX2N2X2xpYmNfZGVmaW5lc19zeXNfZXJybGlzdCwgWwotCUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSwKLVtbIGV4dGVybiBjb25zdCBjaGFyICpjb25zdCBzeXNfZXJybGlzdFtdOyBwcmludGYoIiVzIiwgc3lzX2Vycmxpc3RbMF0pO11dKV0sCi0JWyBhY19jdl9saWJjX2RlZmluZXNfc3lzX2Vycmxpc3Q9InllcyIgXSwKLQlbIGFjX2N2X2xpYmNfZGVmaW5lc19zeXNfZXJybGlzdD0ibm8iIAotCV0pCi1dKQotaWYgdGVzdCAieCRhY19jdl9saWJjX2RlZmluZXNfc3lzX2Vycmxpc3QiID0gInh5ZXMiIDsgdGhlbgotCUFDX0RFRklORShbSEFWRV9TWVNfRVJSTElTVF0sIFsxXSwKLQkJW0RlZmluZSBpZiB5b3VyIHN5c3RlbSBkZWZpbmVzIHN5c19lcnJsaXN0W11dKQotZmkKLQotCi1BQ19DQUNIRV9DSEVDSyhbaWYgbGliYyBkZWZpbmVzIHN5c19uZXJyXSwgYWNfY3ZfbGliY19kZWZpbmVzX3N5c19uZXJyLCBbCi0JQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW11dLAotW1sgZXh0ZXJuIGludCBzeXNfbmVycjsgcHJpbnRmKCIlaSIsIHN5c19uZXJyKTtdXSldLAotCVsgYWNfY3ZfbGliY19kZWZpbmVzX3N5c19uZXJyPSJ5ZXMiIF0sCi0JWyBhY19jdl9saWJjX2RlZmluZXNfc3lzX25lcnI9Im5vIiAKLQldKQotXSkKLWlmIHRlc3QgIngkYWNfY3ZfbGliY19kZWZpbmVzX3N5c19uZXJyIiA9ICJ4eWVzIiA7IHRoZW4KLQlBQ19ERUZJTkUoW0hBVkVfU1lTX05FUlJdLCBbMV0sIFtEZWZpbmUgaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBzeXNfbmVycl0pCi1maQotCi0jIENoZWNrIGxpYnJhcmllcyBuZWVkZWQgYnkgRE5TIGZpbmdlcnByaW50IHN1cHBvcnQKLUFDX1NFQVJDSF9MSUJTKFtnZXRycnNldGJ5bmFtZV0sIFtyZXNvbHZdLAotCVtBQ19ERUZJTkUoW0hBVkVfR0VUUlJTRVRCWU5BTUVdLCBbMV0sCi0JCVtEZWZpbmUgaWYgZ2V0cnJzZXRieW5hbWUoKSBleGlzdHNdKV0sCi0JWwotCQkjIE5lZWRlZCBieSBvdXIgZ2V0cnJzZXRieW5hbWUoKQotCQlBQ19TRUFSQ0hfTElCUyhbcmVzX3F1ZXJ5XSwgW3Jlc29sdl0pCi0JCUFDX1NFQVJDSF9MSUJTKFtkbl9leHBhbmRdLCBbcmVzb2x2XSkKLQkJQUNfTVNHX0NIRUNLSU5HKFtpZiByZXNfcXVlcnkgd2lsbCBsaW5rXSkKLQkJQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHJlc29sdi5oPgotCQkJCV1dLCBbWwotCXJlc19xdWVyeSAoMCwgMCwgMCwgMCwgMCk7Ci0JCQkJXV0pXSwKLQkJICAgIEFDX01TR19SRVNVTFQoW3llc10pLAotCQkgICBbQUNfTVNHX1JFU1VMVChbbm9dKQotCQkgICAgc2F2ZWRfTElCUz0iJExJQlMiCi0JCSAgICBMSUJTPSIkTElCUyAtbHJlc29sdiIKLQkJICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHJlc19xdWVyeSBpbiAtbHJlc29sdl0pCi0JCSAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvbmFtZXNlci5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8cmVzb2x2Lmg+Ci0JCQkJXV0sIFtbCi0JcmVzX3F1ZXJ5ICgwLCAwLCAwLCAwLCAwKTsKLQkJCQldXSldLAotCQkJW0FDX01TR19SRVNVTFQoW3llc10pXSwKLQkJCVtMSUJTPSIkc2F2ZWRfTElCUyIKLQkJCSBBQ19NU0dfUkVTVUxUKFtub10pXSkKLQkJICAgIF0pCi0JCUFDX0NIRUNLX0ZVTkNTKFtfZ2V0c2hvcnQgX2dldGxvbmddKQotCQlBQ19DSEVDS19ERUNMUyhbX2dldHNob3J0LCBfZ2V0bG9uZ10sICwgLAotCQkgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkJICAgICNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD5dKQotCQlBQ19DSEVDS19NRU1CRVIoW0hFQURFUi5hZF0sCi0JCQlbQUNfREVGSU5FKFtIQVZFX0hFQURFUl9BRF0sIFsxXSwKLQkJCSAgICBbRGVmaW5lIGlmIEhFQURFUi5hZCBleGlzdHMgaW4gYXJwYS9uYW1lc2VyLmhdKV0sICwKLQkJCVsjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+XSkKLQldKQotCi1BQ19NU0dfQ0hFQ0tJTkcoW2lmIHN0cnVjdCBfX3Jlc19zdGF0ZSBfcmVzIGlzIGFuIGV4dGVybl0pCi1BQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZiBIQVZFX1NZU19UWVBFU19ICi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvbmFtZXNlci5oPgotI2luY2x1ZGUgPHJlc29sdi5oPgotZXh0ZXJuIHN0cnVjdCBfX3Jlc19zdGF0ZSBfcmVzOwotCQldXSwgW1sgXV0pXSwKLQkJW0FDX01TR19SRVNVTFQoW3llc10pCi0JCSBBQ19ERUZJTkUoW0hBVkVfX1JFU19FWFRFUk5dLCBbMV0sCi0JCSAgICBbRGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCBfX3Jlc19zdGF0ZSBfcmVzIGFzIGFuIGV4dGVybl0pCi0JCV0sCi0JCVsgQUNfTVNHX1JFU1VMVChbbm9dKSBdCi0pCi0KLSMgQ2hlY2sgd2hldGhlciB1c2VyIHdhbnRzIFNFTGludXggc3VwcG9ydAotU0VMSU5VWF9NU0c9Im5vIgotTElCU0VMSU5VWD0iIgotQUNfQVJHX1dJVEgoW3NlbGludXhdLAotCVsgIC0td2l0aC1zZWxpbnV4ICAgICAgICAgIEVuYWJsZSBTRUxpbnV4IHN1cHBvcnRdLAotCVsgaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQkJc2F2ZV9MSUJTPSIkTElCUyIKLQkJQUNfREVGSU5FKFtXSVRIX1NFTElOVVhdLCBbMV0sCi0JCQlbRGVmaW5lIGlmIHlvdSB3YW50IFNFTGludXggc3VwcG9ydC5dKQotCQlTRUxJTlVYX01TRz0ieWVzIgotCQlBQ19DSEVDS19IRUFERVIoW3NlbGludXgvc2VsaW51eC5oXSwgLAotCQkJQUNfTVNHX0VSUk9SKFtTRUxpbnV4IHN1cHBvcnQgcmVxdWlyZXMgc2VsaW51eC5oIGhlYWRlcl0pKQotCQlBQ19DSEVDS19MSUIoW3NlbGludXhdLCBbc2V0ZXhlY2Nvbl0sCi0JCQlbIExJQlNFTElOVVg9Ii1sc2VsaW51eCIKLQkJCSAgTElCUz0iJExJQlMgLWxzZWxpbnV4IgotCQkJXSwKLQkJCUFDX01TR19FUlJPUihbU0VMaW51eCBzdXBwb3J0IHJlcXVpcmVzIGxpYnNlbGludXggbGlicmFyeV0pKQotCQlTU0hMSUJTPSIkU1NITElCUyAkTElCU0VMSU5VWCIKLQkJU1NIRExJQlM9IiRTU0hETElCUyAkTElCU0VMSU5VWCIKLQkJQUNfQ0hFQ0tfRlVOQ1MoW2dldHNldXNlcmJ5bmFtZSBnZXRfZGVmYXVsdF9jb250ZXh0X3dpdGhfbGV2ZWxdKQotCQlMSUJTPSIkc2F2ZV9MSUJTIgotCWZpIF0KLSkKLUFDX1NVQlNUKFtTU0hMSUJTXSkKLUFDX1NVQlNUKFtTU0hETElCU10pCi0KLSMgQ2hlY2sgd2hldGhlciB1c2VyIHdhbnRzIEtlcmJlcm9zIDUgc3VwcG9ydAotS1JCNV9NU0c9Im5vIgotQUNfQVJHX1dJVEgoW2tlcmJlcm9zNV0sCi0JWyAgLS13aXRoLWtlcmJlcm9zNT1QQVRIICAgRW5hYmxlIEtlcmJlcm9zIDUgc3VwcG9ydF0sCi0JWyBpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgotCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInh5ZXMiIDsgdGhlbgotCQkJS1JCNVJPT1Q9Ii91c3IvbG9jYWwiCi0JCWVsc2UKLQkJCUtSQjVST09UPSR7d2l0aHZhbH0KLQkJZmkKLQotCQlBQ19ERUZJTkUoW0tSQjVdLCBbMV0sIFtEZWZpbmUgaWYgeW91IHdhbnQgS2VyYmVyb3MgNSBzdXBwb3J0XSkKLQkJS1JCNV9NU0c9InllcyIKLQotCQlBQ19QQVRIX1BST0coW0tSQjVDT05GXSwgW2tyYjUtY29uZmlnXSwKLQkJCSAgICAgWyRLUkI1Uk9PVC9iaW4va3JiNS1jb25maWddLAotCQkJICAgICBbJEtSQjVST09UL2JpbjokUEFUSF0pCi0JCWlmIHRlc3QgLXggJEtSQjVDT05GIDsgdGhlbgotCi0JCQlBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBnc3NhcGkgc3VwcG9ydF0pCi0JCQlpZiAkS1JCNUNPTkYgfCBncmVwIGdzc2FwaSA+L2Rldi9udWxsIDsgdGhlbgotCQkJCUFDX01TR19SRVNVTFQoW3llc10pCi0JCQkJQUNfREVGSU5FKFtHU1NBUEldLCBbMV0sCi0JCQkJCVtEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCBHU1NBUEkKLQkJCQkJc3VwcG9ydCBpbiB0aGUgdmVyc2lvbiAyIHByb3RvY29sXSkKLQkJCQlrNWNvbmZvcHRzPWdzc2FwaQotCQkJZWxzZQotCQkJCUFDX01TR19SRVNVTFQoW25vXSkKLQkJCQlrNWNvbmZvcHRzPSIiCi0JCQlmaQotCQkJSzVDRkxBR1M9ImAkS1JCNUNPTkYgLS1jZmxhZ3MgJGs1Y29uZm9wdHNgIgotCQkJSzVMSUJTPSJgJEtSQjVDT05GIC0tbGlicyAkazVjb25mb3B0c2AiCi0JCQlDUFBGTEFHUz0iJENQUEZMQUdTICRLNUNGTEFHUyIKLQkJCUFDX01TR19DSEVDS0lORyhbd2hldGhlciB3ZSBhcmUgdXNpbmcgSGVpbWRhbF0pCi0JCQlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbICNpbmNsdWRlIDxrcmI1Lmg+Ci0JCQkJXV0sIFtbIGNoYXIgKnRtcCA9IGhlaW1kYWxfdmVyc2lvbjsgXV0pXSwKLQkJCQlbIEFDX01TR19SRVNVTFQoW3llc10pCi0JCQkJQUNfREVGSU5FKFtIRUlNREFMXSwgWzFdLAotCQkJCVtEZWZpbmUgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBIZWltZGFsCi0JCQkJdmVyc2lvbiBvZiBLZXJiZXJvcyBWNV0pIF0sCi0JCQkJW0FDX01TR19SRVNVTFQoW25vXSkKLQkJCV0pCi0JCWVsc2UKLQkJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkke0tSQjVST09UfS9pbmNsdWRlIgotCQkJTERGTEFHUz0iJExERkxBR1MgLUwke0tSQjVST09UfS9saWIiCi0JCQlBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgd2UgYXJlIHVzaW5nIEhlaW1kYWxdKQotCQkJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyAjaW5jbHVkZSA8a3JiNS5oPgotCQkJCV1dLCBbWyBjaGFyICp0bXAgPSBoZWltZGFsX3ZlcnNpb247IF1dKV0sCi0JCQkJCVsgQUNfTVNHX1JFU1VMVChbeWVzXSkKLQkJCQkJIEFDX0RFRklORShbSEVJTURBTF0pCi0JCQkJCSBLNUxJQlM9Ii1sa3JiNSIKLQkJCQkJIEs1TElCUz0iJEs1TElCUyAtbGNvbV9lcnIgLWxhc24xIgotCQkJCQkgQUNfQ0hFQ0tfTElCKFtyb2tlbl0sIFtuZXRfd3JpdGVdLAotCQkJCQkgICBbSzVMSUJTPSIkSzVMSUJTIC1scm9rZW4iXSkKLQkJCQkJIEFDX0NIRUNLX0xJQihbZGVzXSwgW2Rlc19jYmNfZW5jcnlwdF0sCi0JCQkJCSAgIFtLNUxJQlM9IiRLNUxJQlMgLWxkZXMiXSkKLQkJCQkgICAgICAgXSwgWyBBQ19NU0dfUkVTVUxUKFtub10pCi0JCQkJCSBLNUxJQlM9Ii1sa3JiNSAtbGs1Y3J5cHRvIC1sY29tX2VyciIKLQkJCQkgICAgICAgCi0JCQldKQotCQkJQUNfU0VBUkNIX0xJQlMoW2RuX2V4cGFuZF0sIFtyZXNvbHZdKQotCi0JCQlBQ19DSEVDS19MSUIoW2dzc2FwaV9rcmI1XSwgW2dzc19pbml0X3NlY19jb250ZXh0XSwKLQkJCQlbIEFDX0RFRklORShbR1NTQVBJXSkKLQkJCQkgIEs1TElCUz0iLWxnc3NhcGlfa3JiNSAkSzVMSUJTIiBdLAotCQkJCVsgQUNfQ0hFQ0tfTElCKFtnc3NhcGldLCBbZ3NzX2luaXRfc2VjX2NvbnRleHRdLAotCQkJCQlbIEFDX0RFRklORShbR1NTQVBJXSkKLQkJCQkJICBLNUxJQlM9Ii1sZ3NzYXBpICRLNUxJQlMiIF0sCi0JCQkJCUFDX01TR19XQVJOKFtDYW5ub3QgZmluZCBhbnkgc3VpdGFibGUgZ3NzLWFwaSBsaWJyYXJ5IC0gYnVpbGQgbWF5IGZhaWxdKSwKLQkJCQkJJEs1TElCUykKLQkJCQldLAotCQkJCSRLNUxJQlMpCi0KLQkJCUFDX0NIRUNLX0hFQURFUihbZ3NzYXBpLmhdLCAsCi0JCQkJWyB1bnNldCBhY19jdl9oZWFkZXJfZ3NzYXBpX2gKLQkJCQkgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkke0tSQjVST09UfS9pbmNsdWRlL2dzc2FwaSIKLQkJCQkgIEFDX0NIRUNLX0hFQURFUlMoW2dzc2FwaS5oXSwgLAotCQkJCQlBQ19NU0dfV0FSTihbQ2Fubm90IGZpbmQgYW55IHN1aXRhYmxlIGdzcy1hcGkgaGVhZGVyIC0gYnVpbGQgbWF5IGZhaWxdKQotCQkJCSAgKQotCQkJCV0KLQkJCSkKLQotCQkJb2xkQ1BQPSIkQ1BQRkxBR1MiCi0JCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHtLUkI1Uk9PVH0vaW5jbHVkZS9nc3NhcGkiCi0JCQlBQ19DSEVDS19IRUFERVIoW2dzc2FwaV9rcmI1LmhdLCAsCi0JCQkJCVsgQ1BQRkxBR1M9IiRvbGRDUFAiIF0pCi0KLQkJZmkKLQkJaWYgdGVzdCAhIC16ICIkbmVlZF9kYXNoX3IiIDsgdGhlbgotCQkJTERGTEFHUz0iJExERkxBR1MgLVIke0tSQjVST09UfS9saWIiCi0JCWZpCi0JCWlmIHRlc3QgISAteiAiJGJsaWJwYXRoIiA7IHRoZW4KLQkJCWJsaWJwYXRoPSIkYmxpYnBhdGg6JHtLUkI1Uk9PVH0vbGliIgotCQlmaQotCi0JCUFDX0NIRUNLX0hFQURFUlMoW2dzc2FwaS5oIGdzc2FwaS9nc3NhcGkuaF0pCi0JCUFDX0NIRUNLX0hFQURFUlMoW2dzc2FwaV9rcmI1LmggZ3NzYXBpL2dzc2FwaV9rcmI1LmhdKQotCQlBQ19DSEVDS19IRUFERVJTKFtnc3NhcGlfZ2VuZXJpYy5oIGdzc2FwaS9nc3NhcGlfZ2VuZXJpYy5oXSkKLQotCQlMSUJTPSIkTElCUyAkSzVMSUJTIgotCQlBQ19TRUFSQ0hfTElCUyhba19oYXNhZnNdLCBba2Fmc10sIFtBQ19ERUZJTkUoW1VTRV9BRlNdLCBbMV0sCi0JCQlbRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgdG8gdXNlIGxpYmthZnMnIEFGUyBzdXBwb3J0XSldKQotCWZpCi0JXQotKQotCi0jIExvb2tpbmcgZm9yIHByb2dyYW1zLCBwYXRocyBhbmQgZmlsZXMKLQotUFJJVlNFUF9QQVRIPS92YXIvZW1wdHkKLUFDX0FSR19XSVRIKFtwcml2c2VwLXBhdGhdLAotCVsgIC0td2l0aC1wcml2c2VwLXBhdGg9eHh4IFBhdGggZm9yIHByaXZpbGVnZSBzZXBhcmF0aW9uIGNocm9vdCAoZGVmYXVsdD0vdmFyL2VtcHR5KV0sCi0JWwotCQlpZiB0ZXN0IC1uICIkd2l0aHZhbCIgICYmICB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iICAmJiAgXAotCQkgICAgdGVzdCAieCR7d2l0aHZhbH0iICE9ICJ4eWVzIjsgdGhlbgotCQkJUFJJVlNFUF9QQVRIPSR3aXRodmFsCi0JCWZpCi0JXQotKQotQUNfU1VCU1QoW1BSSVZTRVBfUEFUSF0pCi0KLUFDX0FSR19XSVRIKFt4YXV0aF0sCi0JWyAgLS13aXRoLXhhdXRoPVBBVEggICAgICAgU3BlY2lmeSBwYXRoIHRvIHhhdXRoIHByb2dyYW0gXSwKLQlbCi0JCWlmIHRlc3QgLW4gIiR3aXRodmFsIiAgJiYgIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgICYmICBcCi0JCSAgICB0ZXN0ICJ4JHt3aXRodmFsfSIgIT0gInh5ZXMiOyB0aGVuCi0JCQl4YXV0aF9wYXRoPSR3aXRodmFsCi0JCWZpCi0JXSwKLQlbCi0JCVRlc3RQYXRoPSIkUEFUSCIKLQkJVGVzdFBhdGg9IiR7VGVzdFBhdGh9JHtQQVRIX1NFUEFSQVRPUn0vdXNyL1gvYmluIgotCQlUZXN0UGF0aD0iJHtUZXN0UGF0aH0ke1BBVEhfU0VQQVJBVE9SfS91c3IvYmluL1gxMSIKLQkJVGVzdFBhdGg9IiR7VGVzdFBhdGh9JHtQQVRIX1NFUEFSQVRPUn0vdXNyL1gxMVI2L2JpbiIKLQkJVGVzdFBhdGg9IiR7VGVzdFBhdGh9JHtQQVRIX1NFUEFSQVRPUn0vdXNyL29wZW53aW4vYmluIgotCQlBQ19QQVRIX1BST0coW3hhdXRoX3BhdGhdLCBbeGF1dGhdLCAsIFskVGVzdFBhdGhdKQotCQlpZiAodGVzdCAhIC16ICIkeGF1dGhfcGF0aCIgJiYgdGVzdCAteCAiL3Vzci9vcGVud2luL2Jpbi94YXV0aCIpIDsgdGhlbgotCQkJeGF1dGhfcGF0aD0iL3Vzci9vcGVud2luL2Jpbi94YXV0aCIKLQkJZmkKLQldCi0pCi0KLVNUUklQX09QVD0tcwotQUNfQVJHX0VOQUJMRShbc3RyaXBdLAotCVsgIC0tZGlzYWJsZS1zdHJpcCAgICAgICAgIERpc2FibGUgY2FsbGluZyBzdHJpcCgxKSBvbiBpbnN0YWxsXSwKLQlbCi0JCWlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iIDsgdGhlbgotCQkJU1RSSVBfT1BUPQotCQlmaQotCV0KLSkKLUFDX1NVQlNUKFtTVFJJUF9PUFRdKQotCi1pZiB0ZXN0IC16ICIkeGF1dGhfcGF0aCIgOyB0aGVuCi0JWEFVVEhfUEFUSD0idW5kZWZpbmVkIgotCUFDX1NVQlNUKFtYQVVUSF9QQVRIXSkKLWVsc2UKLQlBQ19ERUZJTkVfVU5RVU9URUQoW1hBVVRIX1BBVEhdLCBbIiR4YXV0aF9wYXRoIl0sCi0JCVtEZWZpbmUgaWYgeGF1dGggaXMgZm91bmQgaW4geW91ciBwYXRoXSkKLQlYQVVUSF9QQVRIPSR4YXV0aF9wYXRoCi0JQUNfU1VCU1QoW1hBVVRIX1BBVEhdKQotZmkKLQotZG5sICMgLS13aXRoLW1haWxkaXI9L3BhdGgvdG8vbWFpbCBnZXRzIHRvcCBwcmlvcml0eS4KLWRubCAjIGlmIG1haWxkaXIgaXMgc2V0IGluIHRoZSBwbGF0Zm9ybSBjYXNlIHN0YXRlbWVudCBhYm92ZSB3ZSB1c2UgdGhhdC4KLWRubCAjIE90aGVyd2lzZSB3ZSBydW4gYSBwcm9ncmFtIHRvIGdldCB0aGUgZGlyIGZyb20gc3lzdGVtIGhlYWRlcnMuCi1kbmwgIyBXZSBmaXJzdCBsb29rIGZvciBfUEFUSF9NQUlMRElSIHRoZW4gTUFJTERJUiB0aGVuIF9QQVRIX01BSUwKLWRubCAjIElmIHdlIGZpbmQgX1BBVEhfTUFJTERJUiB3ZSBkbyBub3RoaW5nIGJlY2F1c2UgdGhhdCBpcyB3aGF0Ci1kbmwgIyBzZXNzaW9uLmMgZXhwZWN0cyBhbnl3YXkuIE90aGVyd2lzZSB3ZSBzZXQgdG8gdGhlIHZhbHVlIGZvdW5kCi1kbmwgIyBzdHJpcHBpbmcgYW55IHRyYWlsaW5nIHNsYXNoLiBJZiBmb3Igc29tZSBzdHJhZ2UgcmVhc29uIG91ciBwcm9ncmFtCi1kbmwgIyBkb2VzIG5vdCBmaW5kIHdoYXQgaXQgbmVlZHMsIHdlIGRlZmF1bHQgdG8gL3Zhci9zcG9vbC9tYWlsLgotIyBDaGVjayBmb3IgbWFpbCBkaXJlY3RvcnkKLUFDX0FSR19XSVRIKFttYWlsZGlyXSwKLSAgICBbICAtLXdpdGgtbWFpbGRpcj0vcGF0aC90by9tYWlsICAgIFNwZWNpZnkgeW91ciBzeXN0ZW0gbWFpbCBkaXJlY3RvcnldLAotICAgIFsKLQlpZiB0ZXN0ICJYJHdpdGh2YWwiICE9IFggICYmICB0ZXN0ICJ4JHdpdGh2YWwiICE9IHhubyAgJiYgIFwKLQkgICAgdGVzdCAieCR7d2l0aHZhbH0iICE9IHh5ZXM7IHRoZW4KLQkJQUNfREVGSU5FX1VOUVVPVEVEKFtNQUlMX0RJUkVDVE9SWV0sIFsiJHdpdGh2YWwiXSwKLSAgICAgICAgICAgIFtTZXQgdGhpcyB0byB5b3VyIG1haWwgZGlyZWN0b3J5IGlmIHlvdSBkbyBub3QgaGF2ZSBfUEFUSF9NQUlMRElSXSkKLQkgICAgZmkKLSAgICAgXSxbCi0JaWYgdGVzdCAiWCRtYWlsZGlyIiAhPSAiWCI7IHRoZW4KLQkgICAgQUNfREVGSU5FX1VOUVVPVEVEKFtNQUlMX0RJUkVDVE9SWV0sIFsiJG1haWxkaXIiXSkKLQllbHNlCi0JICAgIEFDX01TR19DSEVDS0lORyhbRGlzY292ZXJpbmcgc3lzdGVtIG1haWwgZGlyZWN0b3J5XSkKLQkgICAgQUNfUlVOX0lGRUxTRSgKLQkJW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZkZWYgSEFWRV9QQVRIU19ICi0jaW5jbHVkZSA8cGF0aHMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfTUFJTExPQ0tfSAotI2luY2x1ZGUgPG1haWxsb2NrLmg+Ci0jZW5kaWYKLSNkZWZpbmUgREFUQSAiY29uZnRlc3QubWFpbGRpciIKLQldXSwgW1sKLQlGSUxFICpmZDsKLQlpbnQgcmM7Ci0KLQlmZCA9IGZvcGVuKERBVEEsInciKTsKLQlpZihmZCA9PSBOVUxMKQotCQlleGl0KDEpOwotCi0jaWYgZGVmaW5lZCAoX1BBVEhfTUFJTERJUikKLQlpZiAoKHJjID0gZnByaW50ZihmZCAsIl9QQVRIX01BSUxESVI6JXNcbiIsIF9QQVRIX01BSUxESVIpKSA8MCkKLQkJZXhpdCgxKTsKLSNlbGlmIGRlZmluZWQgKE1BSUxESVIpCi0JaWYgKChyYyA9IGZwcmludGYoZmQgLCJNQUlMRElSOiVzXG4iLCBNQUlMRElSKSkgPDApCi0JCWV4aXQoMSk7Ci0jZWxpZiBkZWZpbmVkIChfUEFUSF9NQUlMKQotCWlmICgocmMgPSBmcHJpbnRmKGZkICwiX1BBVEhfTUFJTDolc1xuIiwgX1BBVEhfTUFJTCkpIDwwKQotCQlleGl0KDEpOwotI2Vsc2UKLQlleGl0ICgyKTsKLSNlbmRpZgotCi0JZXhpdCgwKTsKLQkJXV0pXSwKLQkJWwotCSAJICAgIG1haWxkaXJfd2hhdD1gYXdrIC1GOiAne3ByaW50ICQxfScgY29uZnRlc3QubWFpbGRpcmAKLQkJICAgIG1haWxkaXI9YGF3ayAtRjogJ3twcmludCAkMn0nIGNvbmZ0ZXN0Lm1haWxkaXIgXAotCQkJfCBzZWQgJ3N8LyR8fCdgCi0JCSAgICBBQ19NU0dfUkVTVUxUKFtVc2luZzogJG1haWxkaXIgZnJvbSAkbWFpbGRpcl93aGF0XSkKLQkJICAgIGlmIHRlc3QgIngkbWFpbGRpcl93aGF0IiAhPSAieF9QQVRIX01BSUxESVIiOyB0aGVuCi0JCQlBQ19ERUZJTkVfVU5RVU9URUQoW01BSUxfRElSRUNUT1JZXSwgWyIkbWFpbGRpciJdKQotCQkgICAgZmkKLQkJXSwKLQkJWwotCQkgICAgaWYgdGVzdCAiWCRhY19zdGF0dXMiID0gIlgyIjt0aGVuCi0jIG91ciB0ZXN0IHByb2dyYW0gZGlkbid0IGZpbmQgaXQuIERlZmF1bHQgdG8gL3Zhci9zcG9vbC9tYWlsCi0JCQlBQ19NU0dfUkVTVUxUKFtVc2luZzogZGVmYXVsdCB2YWx1ZSBvZiAvdmFyL3Nwb29sL21haWxdKQotCQkJQUNfREVGSU5FX1VOUVVPVEVEKFtNQUlMX0RJUkVDVE9SWV0sIFsiL3Zhci9zcG9vbC9tYWlsIl0pCi0JCSAgICAgZWxzZQotCQkJQUNfTVNHX1JFU1VMVChbKioqIG5vdCBmb3VuZCAqKipdKQotCQkgICAgIGZpCi0JCV0sCi0JCVsKLQkJCUFDX01TR19XQVJOKFtjcm9zcyBjb21waWxpbmc6IHVzZSAtLXdpdGgtbWFpbGRpcj0vcGF0aC90by9tYWlsXSkKLQkJXQotCSAgICApCi0JZmkKLSAgICBdCi0pICMgbWFpbGRpcgotCi1pZiB0ZXN0ICEgLXogIiRjcm9zc19jb21waWxpbmciICYmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4eWVzIjsgdGhlbgotCUFDX01TR19XQVJOKFtjcm9zcyBjb21waWxpbmc6IERpc2FibGluZyAvZGV2L3B0bXggdGVzdF0pCi0JZGlzYWJsZV9wdG14X2NoZWNrPXllcwotZmkKLWlmIHRlc3QgLXogIiRub19kZXZfcHRteCIgOyB0aGVuCi0JaWYgdGVzdCAieCRkaXNhYmxlX3B0bXhfY2hlY2siICE9ICJ4eWVzIiA7IHRoZW4KLQkJQUNfQ0hFQ0tfRklMRShbIi9kZXYvcHRteCJdLAotCQkJWwotCQkJCUFDX0RFRklORV9VTlFVT1RFRChbSEFWRV9ERVZfUFRNWF0sIFsxXSwKLQkJCQkJW0RlZmluZSBpZiB5b3UgaGF2ZSAvZGV2L3B0bXhdKQotCQkJCWhhdmVfZGV2X3B0bXg9MQotCQkJXQotCQkpCi0JZmkKLWZpCi0KLWlmIHRlc3QgISAteiAiJGNyb3NzX2NvbXBpbGluZyIgJiYgdGVzdCAieCRjcm9zc19jb21waWxpbmciICE9ICJ4eWVzIjsgdGhlbgotCUFDX0NIRUNLX0ZJTEUoWyIvZGV2L3B0YyJdLAotCQlbCi0JCQlBQ19ERUZJTkVfVU5RVU9URUQoW0hBVkVfREVWX1BUU19BTkRfUFRDXSwgWzFdLAotCQkJCVtEZWZpbmUgaWYgeW91IGhhdmUgL2Rldi9wdGNdKQotCQkJaGF2ZV9kZXZfcHRjPTEKLQkJXQotCSkKLWVsc2UKLQlBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBEaXNhYmxpbmcgL2Rldi9wdGMgdGVzdF0pCi1maQotCi0jIE9wdGlvbnMgZnJvbSBoZXJlIG9uLiBTb21lIG9mIHRoZXNlIGFyZSBwcmVzZXQgYnkgcGxhdGZvcm0gYWJvdmUKLUFDX0FSR19XSVRIKFttYW50eXBlXSwKLQlbICAtLXdpdGgtbWFudHlwZT1tYW58Y2F0fGRvYyAgU2V0IG1hbiBwYWdlIHR5cGVdLAotCVsKLQkJY2FzZSAiJHdpdGh2YWwiIGluCi0JCW1hbnxjYXR8ZG9jKQotCQkJTUFOVFlQRT0kd2l0aHZhbAotCQkJOzsKLQkJKikKLQkJCUFDX01TR19FUlJPUihbaW52YWxpZCBtYW4gdHlwZTogJHdpdGh2YWxdKQotCQkJOzsKLQkJZXNhYwotCV0KLSkKLWlmIHRlc3QgLXogIiRNQU5UWVBFIjsgdGhlbgotCVRlc3RQYXRoPSIvdXNyL2JpbiR7UEFUSF9TRVBBUkFUT1J9L3Vzci91Y2IiCi0JQUNfUEFUSF9QUk9HUyhbTlJPRkZdLCBbbnJvZmYgYXdmXSwgWy9iaW4vZmFsc2VdLCBbJFRlc3RQYXRoXSkKLQlpZiAke05ST0ZGfSAtbWRvYyAke3NyY2Rpcn0vc3NoLjEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCU1BTlRZUEU9ZG9jCi0JZWxpZiAke05ST0ZGfSAtbWFuICR7c3JjZGlyfS9zc2guMSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJTUFOVFlQRT1tYW4KLQllbHNlCi0JCU1BTlRZUEU9Y2F0Ci0JZmkKLWZpCi1BQ19TVUJTVChbTUFOVFlQRV0pCi1pZiB0ZXN0ICIkTUFOVFlQRSIgPSAiZG9jIjsgdGhlbgotCW1hbnN1YmRpcj1tYW47Ci1lbHNlCi0JbWFuc3ViZGlyPSRNQU5UWVBFOwotZmkKLUFDX1NVQlNUKFttYW5zdWJkaXJdKQotCi0jIENoZWNrIHdoZXRoZXIgdG8gZW5hYmxlIE1ENSBwYXNzd29yZHMKLU1ENV9NU0c9Im5vIgotQUNfQVJHX1dJVEgoW21kNS1wYXNzd29yZHNdLAotCVsgIC0td2l0aC1tZDUtcGFzc3dvcmRzICAgIEVuYWJsZSB1c2Ugb2YgTUQ1IHBhc3N3b3Jkc10sCi0JWwotCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgotCQkJQUNfREVGSU5FKFtIQVZFX01ENV9QQVNTV09SRFNdLCBbMV0sCi0JCQkJW0RlZmluZSBpZiB5b3Ugd2FudCB0byBhbGxvdyBNRDUgcGFzc3dvcmRzXSkKLQkJCU1ENV9NU0c9InllcyIKLQkJZmkKLQldCi0pCi0KLSMgV2hldGhlciB0byBkaXNhYmxlIHNoYWRvdyBwYXNzd29yZCBzdXBwb3J0Ci1BQ19BUkdfV0lUSChbc2hhZG93XSwKLQlbICAtLXdpdGhvdXQtc2hhZG93ICAgICAgICBEaXNhYmxlIHNoYWRvdyBwYXNzd29yZCBzdXBwb3J0XSwKLQlbCi0JCWlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIiA7IHRoZW4KLQkJCUFDX0RFRklORShbRElTQUJMRV9TSEFET1ddKQotCQkJZGlzYWJsZV9zaGFkb3c9eWVzCi0JCWZpCi0JXQotKQotCi1pZiB0ZXN0IC16ICIkZGlzYWJsZV9zaGFkb3ciIDsgdGhlbgotCUFDX01TR19DSEVDS0lORyhbaWYgdGhlIHN5c3RlbXMgaGFzIGV4cGlyZSBzaGFkb3cgaW5mb3JtYXRpb25dKQotCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaGFkb3cuaD4KLXN0cnVjdCBzcHdkIHNwOwotCQldXSwgW1sgc3Auc3BfZXhwaXJlID0gc3Auc3BfbHN0Y2hnID0gc3Auc3BfaW5hY3QgPSAwOyBdXSldLAotCQlbIHNwX2V4cGlyZV9hdmFpbGFibGU9eWVzIF0sIFsKLQldKQotCi0JaWYgdGVzdCAieCRzcF9leHBpcmVfYXZhaWxhYmxlIiA9ICJ4eWVzIiA7IHRoZW4KLQkJQUNfTVNHX1JFU1VMVChbeWVzXSkKLQkJQUNfREVGSU5FKFtIQVNfU0hBRE9XX0VYUElSRV0sIFsxXSwKLQkJICAgIFtEZWZpbmUgaWYgeW91IHdhbnQgdG8gdXNlIHNoYWRvdyBwYXNzd29yZCBleHBpcmUgZmllbGRdKQotCWVsc2UKLQkJQUNfTVNHX1JFU1VMVChbbm9dKQotCWZpCi1maQotCi0jIFVzZSBpcCBhZGRyZXNzIGluc3RlYWQgb2YgaG9zdG5hbWUgaW4gJERJU1BMQVkKLWlmIHRlc3QgISAteiAiJElQQUREUl9JTl9ESVNQTEFZIiA7IHRoZW4KLQlESVNQTEFZX0hBQ0tfTVNHPSJ5ZXMiCi0JQUNfREVGSU5FKFtJUEFERFJfSU5fRElTUExBWV0sIFsxXSwKLQkJW0RlZmluZSBpZiB5b3UgbmVlZCB0byB1c2UgSVAgYWRkcmVzcwotCQlpbnN0ZWFkIG9mIGhvc3RuYW1lIGluICRESVNQTEFZXSkKLWVsc2UKLQlESVNQTEFZX0hBQ0tfTVNHPSJubyIKLQlBQ19BUkdfV0lUSChbaXBhZGRyLWRpc3BsYXldLAotCQlbICAtLXdpdGgtaXBhZGRyLWRpc3BsYXkgICBVc2UgaXAgYWRkcmVzcyBpbnN0ZWFkIG9mIGhvc3RuYW1lIGluIFwkRElTUExBWV0sCi0JCVsKLQkJCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCi0JCQkJQUNfREVGSU5FKFtJUEFERFJfSU5fRElTUExBWV0pCi0JCQkJRElTUExBWV9IQUNLX01TRz0ieWVzIgotCQkJZmkKLQkJXQotCSkKLWZpCi0KLSMgY2hlY2sgZm9yIC9ldGMvZGVmYXVsdC9sb2dpbiBhbmQgdXNlIGl0IGlmIHByZXNlbnQuCi1BQ19BUkdfRU5BQkxFKFtldGMtZGVmYXVsdC1sb2dpbl0sCi0JWyAgLS1kaXNhYmxlLWV0Yy1kZWZhdWx0LWxvZ2luIERpc2FibGUgdXNpbmcgUEFUSCBmcm9tIC9ldGMvZGVmYXVsdC9sb2dpbiBbbm9dXSwKLQlbIGlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iOyB0aGVuCi0JCUFDX01TR19OT1RJQ0UoWy9ldGMvZGVmYXVsdC9sb2dpbiBoYW5kbGluZyBkaXNhYmxlZF0pCi0JCWV0Y19kZWZhdWx0X2xvZ2luPW5vCi0JICBlbHNlCi0JCWV0Y19kZWZhdWx0X2xvZ2luPXllcwotCSAgZmkgXSwKLQlbIGlmIHRlc3QgISAteiAiJGNyb3NzX2NvbXBpbGluZyIgJiYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInh5ZXMiOwotCSAgdGhlbgotCQlBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nOiBub3QgY2hlY2tpbmcgL2V0Yy9kZWZhdWx0L2xvZ2luXSkKLQkJZXRjX2RlZmF1bHRfbG9naW49bm8KLQkgIGVsc2UKLQkJZXRjX2RlZmF1bHRfbG9naW49eWVzCi0JICBmaSBdCi0pCi0KLWlmIHRlc3QgIngkZXRjX2RlZmF1bHRfbG9naW4iICE9ICJ4bm8iOyB0aGVuCi0JQUNfQ0hFQ0tfRklMRShbIi9ldGMvZGVmYXVsdC9sb2dpbiJdLAotCSAgICBbIGV4dGVybmFsX3BhdGhfZmlsZT0vZXRjL2RlZmF1bHQvbG9naW4gXSkKLQlpZiB0ZXN0ICJ4JGV4dGVybmFsX3BhdGhfZmlsZSIgPSAieC9ldGMvZGVmYXVsdC9sb2dpbiI7IHRoZW4KLQkJQUNfREVGSU5FKFtIQVZFX0VUQ19ERUZBVUxUX0xPR0lOXSwgWzFdLAotCQkJW0RlZmluZSBpZiB5b3VyIHN5c3RlbSBoYXMgL2V0Yy9kZWZhdWx0L2xvZ2luXSkKLQlmaQotZmkKLQotZG5sIEJTRCBzeXN0ZW1zIHVzZSAvZXRjL2xvZ2luLmNvbmYgc28gLS13aXRoLWRlZmF1bHQtcGF0aD0gaGFzIG5vIGVmZmVjdAotaWYgdGVzdCAkYWNfY3ZfZnVuY19sb2dpbl9nZXRjYXBib29sID0gInllcyIgJiYgXAotCXRlc3QgJGFjX2N2X2hlYWRlcl9sb2dpbl9jYXBfaCA9ICJ5ZXMiIDsgdGhlbgotCWV4dGVybmFsX3BhdGhfZmlsZT0vZXRjL2xvZ2luLmNvbmYKLWZpCi0KLSMgV2hldGhlciB0byBtZXNzIHdpdGggdGhlIGRlZmF1bHQgcGF0aAotU0VSVkVSX1BBVEhfTVNHPSIoZGVmYXVsdCkiCi1BQ19BUkdfV0lUSChbZGVmYXVsdC1wYXRoXSwKLQlbICAtLXdpdGgtZGVmYXVsdC1wYXRoPSAgICBTcGVjaWZ5IGRlZmF1bHQgXCRQQVRIIGVudmlyb25tZW50IGZvciBzZXJ2ZXJdLAotCVsKLQkJaWYgdGVzdCAieCRleHRlcm5hbF9wYXRoX2ZpbGUiID0gIngvZXRjL2xvZ2luLmNvbmYiIDsgdGhlbgotCQkJQUNfTVNHX1dBUk4oWwotLS13aXRoLWRlZmF1bHQtcGF0aD1QQVRIIGhhcyBubyBlZmZlY3Qgb24gdGhpcyBzeXN0ZW0uCi1FZGl0IC9ldGMvbG9naW4uY29uZiBpbnN0ZWFkLl0pCi0JCWVsaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQkJCWlmIHRlc3QgISAteiAiJGV4dGVybmFsX3BhdGhfZmlsZSIgOyB0aGVuCi0JCQkJQUNfTVNHX1dBUk4oWwotLS13aXRoLWRlZmF1bHQtcGF0aD1QQVRIIHdpbGwgb25seSBiZSB1c2VkIGlmIFBBVEggaXMgbm90IGRlZmluZWQgaW4KLSRleHRlcm5hbF9wYXRoX2ZpbGUgLl0pCi0JCQlmaQotCQkJdXNlcl9wYXRoPSIkd2l0aHZhbCIKLQkJCVNFUlZFUl9QQVRIX01TRz0iJHdpdGh2YWwiCi0JCWZpCi0JXSwKLQlbIGlmIHRlc3QgIngkZXh0ZXJuYWxfcGF0aF9maWxlIiA9ICJ4L2V0Yy9sb2dpbi5jb25mIiA7IHRoZW4KLQkJQUNfTVNHX1dBUk4oW01ha2Ugc3VyZSB0aGUgcGF0aCB0byBzY3AgaXMgaW4gL2V0Yy9sb2dpbi5jb25mXSkKLQllbHNlCi0JCWlmIHRlc3QgISAteiAiJGV4dGVybmFsX3BhdGhfZmlsZSIgOyB0aGVuCi0JCQlBQ19NU0dfV0FSTihbCi1JZiBQQVRIIGlzIGRlZmluZWQgaW4gJGV4dGVybmFsX3BhdGhfZmlsZSwgZW5zdXJlIHRoZSBwYXRoIHRvIHNjcCBpcyBpbmNsdWRlZCwKLW90aGVyd2lzZSBzY3Agd2lsbCBub3Qgd29yay5dKQotCQlmaQotCQlBQ19SVU5fSUZFTFNFKAotCQkJW0FDX0xBTkdfUFJPR1JBTShbWwotLyogZmluZCBvdXQgd2hhdCBTVERQQVRIIGlzICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1BBVEhTX0gKLSMgaW5jbHVkZSA8cGF0aHMuaD4KLSNlbmRpZgotI2lmbmRlZiBfUEFUSF9TVERQQVRICi0jIGlmZGVmIF9QQVRIX1VTRVJQQVRICS8qIElyaXggKi8KLSMgIGRlZmluZSBfUEFUSF9TVERQQVRIIF9QQVRIX1VTRVJQQVRICi0jIGVsc2UKLSMgIGRlZmluZSBfUEFUSF9TVERQQVRIICIvdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbiIKLSMgZW5kaWYKLSNlbmRpZgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNkZWZpbmUgREFUQSAiY29uZnRlc3Quc3RkcGF0aCIKLQkJCV1dLCBbWwotCUZJTEUgKmZkOwotCWludCByYzsKLQotCWZkID0gZm9wZW4oREFUQSwidyIpOwotCWlmKGZkID09IE5VTEwpCi0JCWV4aXQoMSk7Ci0KLQlpZiAoKHJjID0gZnByaW50ZihmZCwiJXMiLCBfUEFUSF9TVERQQVRIKSkgPCAwKQotCQlleGl0KDEpOwotCi0JZXhpdCgwKTsKLQkJXV0pXSwKLQkJWyB1c2VyX3BhdGg9YGNhdCBjb25mdGVzdC5zdGRwYXRoYCBdLAotCQlbIHVzZXJfcGF0aD0iL3Vzci9iaW46L2JpbjovdXNyL3NiaW46L3NiaW4iIF0sCi0JCVsgdXNlcl9wYXRoPSIvdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbiIgXQotCSkKLSMgbWFrZSBzdXJlICRiaW5kaXIgaXMgaW4gVVNFUl9QQVRIIHNvIHNjcCB3aWxsIHdvcmsKLQkJdF9iaW5kaXI9YGV2YWwgZWNobyAke2JpbmRpcn1gCi0JCWNhc2UgJHRfYmluZGlyIGluCi0JCQlOT05FLyopIHRfYmluZGlyPWBlY2hvICR0X2JpbmRpciB8IHNlZCAic35OT05FfiRwcmVmaXh+ImAgOzsKLQkJZXNhYwotCQljYXNlICR0X2JpbmRpciBpbgotCQkJTk9ORS8qKSB0X2JpbmRpcj1gZWNobyAkdF9iaW5kaXIgfCBzZWQgInN+Tk9ORX4kYWNfZGVmYXVsdF9wcmVmaXh+ImAgOzsKLQkJZXNhYwotCQllY2hvICR1c2VyX3BhdGggfCBncmVwICI6JHRfYmluZGlyIiAgPiAvZGV2L251bGwgMj4mMQotCQlpZiB0ZXN0ICQ/IC1uZSAwICA7IHRoZW4KLQkJCWVjaG8gJHVzZXJfcGF0aCB8IGdyZXAgIl4kdF9iaW5kaXIiICA+IC9kZXYvbnVsbCAyPiYxCi0JCQlpZiB0ZXN0ICQ/IC1uZSAwICA7IHRoZW4KLQkJCQl1c2VyX3BhdGg9JHVzZXJfcGF0aDokdF9iaW5kaXIKLQkJCQlBQ19NU0dfUkVTVUxUKFtBZGRpbmcgJHRfYmluZGlyIHRvIFVTRVJfUEFUSCBzbyBzY3Agd2lsbCB3b3JrXSkKLQkJCWZpCi0JCWZpCi0JZmkgXQotKQotaWYgdGVzdCAieCRleHRlcm5hbF9wYXRoX2ZpbGUiICE9ICJ4L2V0Yy9sb2dpbi5jb25mIiA7IHRoZW4KLQlBQ19ERUZJTkVfVU5RVU9URUQoW1VTRVJfUEFUSF0sIFsiJHVzZXJfcGF0aCJdLCBbU3BlY2lmeSBkZWZhdWx0ICRQQVRIXSkKLQlBQ19TVUJTVChbdXNlcl9wYXRoXSkKLWZpCi0KLSMgU2V0IHN1cGVydXNlciBwYXRoIHNlcGFyYXRlbHkgdG8gdXNlciBwYXRoCi1BQ19BUkdfV0lUSChbc3VwZXJ1c2VyLXBhdGhdLAotCVsgIC0td2l0aC1zdXBlcnVzZXItcGF0aD0gIFNwZWNpZnkgZGlmZmVyZW50IHBhdGggZm9yIHN1cGVyLXVzZXJdLAotCVsKLQkJaWYgdGVzdCAtbiAiJHdpdGh2YWwiICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiAgJiYgIFwKLQkJICAgIHRlc3QgIngke3dpdGh2YWx9IiAhPSAieHllcyI7IHRoZW4KLQkJCUFDX0RFRklORV9VTlFVT1RFRChbU1VQRVJVU0VSX1BBVEhdLCBbIiR3aXRodmFsIl0sCi0JCQkJW0RlZmluZSBpZiB5b3Ugd2FudCBhIGRpZmZlcmVudCAkUEFUSAotCQkJCWZvciB0aGUgc3VwZXJ1c2VyXSkKLQkJCXN1cGVydXNlcl9wYXRoPSR3aXRodmFsCi0JCWZpCi0JXQotKQotCi0KLUFDX01TR19DSEVDS0lORyhbaWYgd2UgbmVlZCB0byBjb252ZXJ0IElQdjQgaW4gSVB2Ni1tYXBwZWQgYWRkcmVzc2VzXSkKLUlQVjRfSU42X0hBQ0tfTVNHPSJubyIKLUFDX0FSR19XSVRIKDRpbjYsCi0JWyAgLS13aXRoLTRpbjYgICAgICAgICAgICAgQ2hlY2sgZm9yIGFuZCBjb252ZXJ0IElQdjQgaW4gSVB2NiBtYXBwZWQgYWRkcmVzc2VzXSwKLQlbCi0JCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInhubyIgOyB0aGVuCi0JCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQotCQkJQUNfREVGSU5FKFtJUFY0X0lOX0lQVjZdLCBbMV0sCi0JCQkJW0RldGVjdCBJUHY0IGluIElQdjYgbWFwcGVkIGFkZHJlc3NlcwotCQkJCWFuZCB0cmVhdCBhcyBJUHY0XSkKLQkJCUlQVjRfSU42X0hBQ0tfTVNHPSJ5ZXMiCi0JCWVsc2UKLQkJCUFDX01TR19SRVNVTFQoW25vXSkKLQkJZmkKLQldLCBbCi0JCWlmIHRlc3QgIngkaW5ldDZfZGVmYXVsdF80aW42IiA9ICJ4eWVzIjsgdGhlbgotCQkJQUNfTVNHX1JFU1VMVChbeWVzIChkZWZhdWx0KV0pCi0JCQlBQ19ERUZJTkUoW0lQVjRfSU5fSVBWNl0pCi0JCQlJUFY0X0lONl9IQUNLX01TRz0ieWVzIgotCQllbHNlCi0JCQlBQ19NU0dfUkVTVUxUKFtubyAoZGVmYXVsdCldKQotCQlmaQotCV0KLSkKLQotIyBXaGV0aGVyIHRvIGVuYWJsZSBCU0QgYXV0aCBzdXBwb3J0Ci1CU0RfQVVUSF9NU0c9bm8KLUFDX0FSR19XSVRIKFtic2QtYXV0aF0sCi0JWyAgLS13aXRoLWJzZC1hdXRoICAgICAgICAgRW5hYmxlIEJTRCBhdXRoIHN1cHBvcnRdLAotCVsKLQkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQkJCUFDX0RFRklORShbQlNEX0FVVEhdLCBbMV0sCi0JCQkJW0RlZmluZSBpZiB5b3UgaGF2ZSBCU0QgYXV0aCBzdXBwb3J0XSkKLQkJCUJTRF9BVVRIX01TRz15ZXMKLQkJZmkKLQldCi0pCi0KLSMgV2hlcmUgdG8gcGxhY2Ugc3NoZC5waWQKLXBpZGRpcj0vdmFyL3J1bgotIyBtYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMKLWlmIHRlc3QgISAtZCAkcGlkZGlyIDsgdGhlbgotCXBpZGRpcj1gZXZhbCBlY2hvICR7c3lzY29uZmRpcn1gCi0JY2FzZSAkcGlkZGlyIGluCi0JCU5PTkUvKikgcGlkZGlyPWBlY2hvICRwaWRkaXIgfCBzZWQgInN+Tk9ORX4kYWNfZGVmYXVsdF9wcmVmaXh+ImAgOzsKLQllc2FjCi1maQotCi1BQ19BUkdfV0lUSChbcGlkLWRpcl0sCi0JWyAgLS13aXRoLXBpZC1kaXI9UEFUSCAgICAgU3BlY2lmeSBsb2NhdGlvbiBvZiBzc2gucGlkIGZpbGVdLAotCVsKLQkJaWYgdGVzdCAtbiAiJHdpdGh2YWwiICAmJiAgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiAgJiYgIFwKLQkJICAgIHRlc3QgIngke3dpdGh2YWx9IiAhPSAieHllcyI7IHRoZW4KLQkJCXBpZGRpcj0kd2l0aHZhbAotCQkJaWYgdGVzdCAhIC1kICRwaWRkaXIgOyB0aGVuCi0JCQlBQ19NU0dfV0FSTihbKiogbm8gJHBpZGRpciBkaXJlY3Rvcnkgb24gdGhpcyBzeXN0ZW0gKipdKQotCQkJZmkKLQkJZmkKLQldCi0pCi0KLUFDX0RFRklORV9VTlFVT1RFRChbX1BBVEhfU1NIX1BJRERJUl0sIFsiJHBpZGRpciJdLCAKLQlbU3BlY2lmeSBsb2NhdGlvbiBvZiBzc2gucGlkXSkKLUFDX1NVQlNUKFtwaWRkaXJdKQotCi1kbmwgYWxsb3cgdXNlciB0byBkaXNhYmxlIHNvbWUgbG9naW4gcmVjb3JkaW5nIGZlYXR1cmVzCi1BQ19BUkdfRU5BQkxFKFtsYXN0bG9nXSwKLQlbICAtLWRpc2FibGUtbGFzdGxvZyAgICAgICBkaXNhYmxlIHVzZSBvZiBsYXN0bG9nIGV2ZW4gaWYgZGV0ZWN0ZWQgW25vXV0sCi0JWwotCQlpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSAieG5vIiA7IHRoZW4KLQkJCUFDX0RFRklORShbRElTQUJMRV9MQVNUTE9HXSkKLQkJZmkKLQldCi0pCi1BQ19BUkdfRU5BQkxFKFt1dG1wXSwKLQlbICAtLWRpc2FibGUtdXRtcCAgICAgICAgICBkaXNhYmxlIHVzZSBvZiB1dG1wIGV2ZW4gaWYgZGV0ZWN0ZWQgW25vXV0sCi0JWwotCQlpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSAieG5vIiA7IHRoZW4KLQkJCUFDX0RFRklORShbRElTQUJMRV9VVE1QXSkKLQkJZmkKLQldCi0pCi1BQ19BUkdfRU5BQkxFKFt1dG1weF0sCi0JWyAgLS1kaXNhYmxlLXV0bXB4ICAgICAgICAgZGlzYWJsZSB1c2Ugb2YgdXRtcHggZXZlbiBpZiBkZXRlY3RlZCBbbm9dXSwKLQlbCi0JCWlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iIDsgdGhlbgotCQkJQUNfREVGSU5FKFtESVNBQkxFX1VUTVBYXSwgWzFdLAotCQkJCVtEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHV0bXB4XSkKLQkJZmkKLQldCi0pCi1BQ19BUkdfRU5BQkxFKFt3dG1wXSwKLQlbICAtLWRpc2FibGUtd3RtcCAgICAgICAgICBkaXNhYmxlIHVzZSBvZiB3dG1wIGV2ZW4gaWYgZGV0ZWN0ZWQgW25vXV0sCi0JWwotCQlpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSAieG5vIiA7IHRoZW4KLQkJCUFDX0RFRklORShbRElTQUJMRV9XVE1QXSkKLQkJZmkKLQldCi0pCi1BQ19BUkdfRU5BQkxFKFt3dG1weF0sCi0JWyAgLS1kaXNhYmxlLXd0bXB4ICAgICAgICAgZGlzYWJsZSB1c2Ugb2Ygd3RtcHggZXZlbiBpZiBkZXRlY3RlZCBbbm9dXSwKLQlbCi0JCWlmIHRlc3QgIngkZW5hYmxldmFsIiA9ICJ4bm8iIDsgdGhlbgotCQkJQUNfREVGSU5FKFtESVNBQkxFX1dUTVBYXSwgWzFdLAotCQkJCVtEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHd0bXB4XSkKLQkJZmkKLQldCi0pCi1BQ19BUkdfRU5BQkxFKFtsaWJ1dGlsXSwKLQlbICAtLWRpc2FibGUtbGlidXRpbCAgICAgICBkaXNhYmxlIHVzZSBvZiBsaWJ1dGlsIChsb2dpbigpIGV0Yy4pIFtub11dLAotCVsKLQkJaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInhubyIgOyB0aGVuCi0JCQlBQ19ERUZJTkUoW0RJU0FCTEVfTE9HSU5dKQotCQlmaQotCV0KLSkKLUFDX0FSR19FTkFCTEUoW3B1dHV0bGluZV0sCi0JWyAgLS1kaXNhYmxlLXB1dHV0bGluZSAgICAgZGlzYWJsZSB1c2Ugb2YgcHV0dXRsaW5lKCkgZXRjLiAoW3V3XXRtcCkgW25vXV0sCi0JWwotCQlpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSAieG5vIiA7IHRoZW4KLQkJCUFDX0RFRklORShbRElTQUJMRV9QVVRVVExJTkVdLCBbMV0sCi0JCQkJW0RlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgcHV0dXRsaW5lKCkKLQkJCQlldGMuIHRvIHdyaXRlIFt1d110bXBdKQotCQlmaQotCV0KLSkKLUFDX0FSR19FTkFCTEUoW3B1dHV0eGxpbmVdLAotCVsgIC0tZGlzYWJsZS1wdXR1dHhsaW5lICAgIGRpc2FibGUgdXNlIG9mIHB1dHV0eGxpbmUoKSBldGMuIChbdXdddG1weCkgW25vXV0sCi0JWwotCQlpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSAieG5vIiA7IHRoZW4KLQkJCUFDX0RFRklORShbRElTQUJMRV9QVVRVVFhMSU5FXSwgWzFdLAotCQkJCVtEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHB1dHV0eGxpbmUoKQotCQkJCWV0Yy4gdG8gd3JpdGUgW3V3XXRtcHhdKQotCQlmaQotCV0KLSkKLUFDX0FSR19XSVRIKFtsYXN0bG9nXSwKLSAgWyAgLS13aXRoLWxhc3Rsb2c9RklMRXxESVIgc3BlY2lmeSBsYXN0bG9nIGxvY2F0aW9uIFtjb21tb24gbG9jYXRpb25zXV0sCi0JWwotCQlpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyIgOyB0aGVuCi0JCQlBQ19ERUZJTkUoW0RJU0FCTEVfTEFTVExPR10pCi0JCWVsaWYgdGVzdCAtbiAiJHdpdGh2YWwiICAmJiAgdGVzdCAieCR7d2l0aHZhbH0iICE9ICJ4eWVzIjsgdGhlbgotCQkJY29uZl9sYXN0bG9nX2xvY2F0aW9uPSR3aXRodmFsCi0JCWZpCi0JXQotKQotCi1kbmwgbGFzdGxvZywgW3V3XXRtcHg/IGRldGVjdGlvbgotZG5sICBOT1RFOiBzZXQgdGhlIHBhdGhzIGluIHRoZSBwbGF0Zm9ybSBzZWN0aW9uIHRvIGF2b2lkIHRoZQotZG5sICAgbmVlZCBmb3IgY29tbWFuZC1saW5lIHBhcmFtZXRlcnMKLWRubCBsYXN0bG9nIGFuZCBbdXdddG1wIGFyZSBzdWJqZWN0IHRvIGEgZmlsZSBzZWFyY2ggaWYgYWxsIGVsc2UgZmFpbHMKLQotZG5sIGxhc3Rsb2cgZGV0ZWN0aW9uCi1kbmwgIE5PVEU6IHRoZSBjb2RlIGl0c2VsZiB3aWxsIGRldGVjdCBpZiBsYXN0bG9nIGlzIGEgZGlyZWN0b3J5Ci1BQ19NU0dfQ0hFQ0tJTkcoW2lmIHlvdXIgc3lzdGVtIGRlZmluZXMgTEFTVExPR19GSUxFXSkKLUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dG1wLmg+Ci0jaWZkZWYgSEFWRV9MQVNUTE9HX0gKLSMgIGluY2x1ZGUgPGxhc3Rsb2cuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfUEFUSFNfSAotIyAgaW5jbHVkZSA8cGF0aHMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfTE9HSU5fSAotIyBpbmNsdWRlIDxsb2dpbi5oPgotI2VuZGlmCi0JXV0sIFtbIGNoYXIgKmxhc3Rsb2cgPSBMQVNUTE9HX0ZJTEU7IF1dKV0sCi0JCVsgQUNfTVNHX1JFU1VMVChbeWVzXSkgXSwKLQkJWwotCQlBQ19NU0dfUkVTVUxUKFtub10pCi0JCUFDX01TR19DSEVDS0lORyhbaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBfUEFUSF9MQVNUTE9HXSkKLQkJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0bXAuaD4KLSNpZmRlZiBIQVZFX0xBU1RMT0dfSAotIyAgaW5jbHVkZSA8bGFzdGxvZy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9QQVRIU19ICi0jICBpbmNsdWRlIDxwYXRocy5oPgotI2VuZGlmCi0JCV1dLCBbWyBjaGFyICpsYXN0bG9nID0gX1BBVEhfTEFTVExPRzsgXV0pXSwKLQkJWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKSBdLAotCQlbCi0JCQlBQ19NU0dfUkVTVUxUKFtub10pCi0JCQlzeXN0ZW1fbGFzdGxvZ19wYXRoPW5vCi0JCV0pCi1dKQotCi1pZiB0ZXN0IC16ICIkY29uZl9sYXN0bG9nX2xvY2F0aW9uIjsgdGhlbgotCWlmIHRlc3QgeCIkc3lzdGVtX2xhc3Rsb2dfcGF0aCIgPSB4Im5vIiA7IHRoZW4KLQkJZm9yIGYgaW4gL3Zhci9sb2cvbGFzdGxvZyAvdXNyL2FkbS9sYXN0bG9nIC92YXIvYWRtL2xhc3Rsb2cgL2V0Yy9zZWN1cml0eS9sYXN0bG9nIDsgZG8KLQkJCQlpZiAodGVzdCAtZCAiJGYiIHx8IHRlc3QgLWYgIiRmIikgOyB0aGVuCi0JCQkJCWNvbmZfbGFzdGxvZ19sb2NhdGlvbj0kZgotCQkJCWZpCi0JCWRvbmUKLQkJaWYgdGVzdCAteiAiJGNvbmZfbGFzdGxvZ19sb2NhdGlvbiI7IHRoZW4KLQkJCUFDX01TR19XQVJOKFsqKiBDYW5ub3QgZmluZCBsYXN0bG9nICoqXSkKLQkJCWRubCBEb24ndCBkZWZpbmUgRElTQUJMRV9MQVNUTE9HIC0gdGhhdCBtZWFucyB3ZSBkb24ndCB0cnkgd3RtcC93dG1weAotCQlmaQotCWZpCi1maQotCi1pZiB0ZXN0IC1uICIkY29uZl9sYXN0bG9nX2xvY2F0aW9uIjsgdGhlbgotCUFDX0RFRklORV9VTlFVT1RFRChbQ09ORl9MQVNUTE9HX0ZJTEVdLCBbIiRjb25mX2xhc3Rsb2dfbG9jYXRpb24iXSwKLQkJW0RlZmluZSBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IHRoZSBwYXRoIHRvIHlvdXIgbGFzdGxvZyBmaWxlXSkKLWZpCi0KLWRubCB1dG1wIGRldGVjdGlvbgotQUNfTVNHX0NIRUNLSU5HKFtpZiB5b3VyIHN5c3RlbSBkZWZpbmVzIFVUTVBfRklMRV0pCi1BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRtcC5oPgotI2lmZGVmIEhBVkVfUEFUSFNfSAotIyAgaW5jbHVkZSA8cGF0aHMuaD4KLSNlbmRpZgotCV1dLCBbWyBjaGFyICp1dG1wID0gVVRNUF9GSUxFOyBdXSldLAotCVsgQUNfTVNHX1JFU1VMVChbeWVzXSkgXSwKLQlbIEFDX01TR19SRVNVTFQoW25vXSkKLQkgIHN5c3RlbV91dG1wX3BhdGg9bm8gCi1dKQotaWYgdGVzdCAteiAiJGNvbmZfdXRtcF9sb2NhdGlvbiI7IHRoZW4KLQlpZiB0ZXN0IHgiJHN5c3RlbV91dG1wX3BhdGgiID0geCJubyIgOyB0aGVuCi0JCWZvciBmIGluIC9ldGMvdXRtcCAvdXNyL2FkbS91dG1wIC92YXIvcnVuL3V0bXA7IGRvCi0JCQlpZiB0ZXN0IC1mICRmIDsgdGhlbgotCQkJCWNvbmZfdXRtcF9sb2NhdGlvbj0kZgotCQkJZmkKLQkJZG9uZQotCQlpZiB0ZXN0IC16ICIkY29uZl91dG1wX2xvY2F0aW9uIjsgdGhlbgotCQkJQUNfREVGSU5FKFtESVNBQkxFX1VUTVBdKQotCQlmaQotCWZpCi1maQotaWYgdGVzdCAtbiAiJGNvbmZfdXRtcF9sb2NhdGlvbiI7IHRoZW4KLQlBQ19ERUZJTkVfVU5RVU9URUQoW0NPTkZfVVRNUF9GSUxFXSwgWyIkY29uZl91dG1wX2xvY2F0aW9uIl0sCi0JCVtEZWZpbmUgaWYgeW91IHdhbnQgdG8gc3BlY2lmeSB0aGUgcGF0aCB0byB5b3VyIHV0bXAgZmlsZV0pCi1maQotCi1kbmwgd3RtcCBkZXRlY3Rpb24KLUFDX01TR19DSEVDS0lORyhbaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBXVE1QX0ZJTEVdKQotQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0bXAuaD4KLSNpZmRlZiBIQVZFX1BBVEhTX0gKLSMgIGluY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLQldXSwgW1sgY2hhciAqd3RtcCA9IFdUTVBfRklMRTsgXV0pXSwKLQlbIEFDX01TR19SRVNVTFQoW3llc10pIF0sCi0JWyBBQ19NU0dfUkVTVUxUKFtub10pCi0JICBzeXN0ZW1fd3RtcF9wYXRoPW5vIAotXSkKLWlmIHRlc3QgLXogIiRjb25mX3d0bXBfbG9jYXRpb24iOyB0aGVuCi0JaWYgdGVzdCB4IiRzeXN0ZW1fd3RtcF9wYXRoIiA9IHgibm8iIDsgdGhlbgotCQlmb3IgZiBpbiAvdXNyL2FkbS93dG1wIC92YXIvbG9nL3d0bXA7IGRvCi0JCQlpZiB0ZXN0IC1mICRmIDsgdGhlbgotCQkJCWNvbmZfd3RtcF9sb2NhdGlvbj0kZgotCQkJZmkKLQkJZG9uZQotCQlpZiB0ZXN0IC16ICIkY29uZl93dG1wX2xvY2F0aW9uIjsgdGhlbgotCQkJQUNfREVGSU5FKFtESVNBQkxFX1dUTVBdKQotCQlmaQotCWZpCi1maQotaWYgdGVzdCAtbiAiJGNvbmZfd3RtcF9sb2NhdGlvbiI7IHRoZW4KLQlBQ19ERUZJTkVfVU5RVU9URUQoW0NPTkZfV1RNUF9GSUxFXSwgWyIkY29uZl93dG1wX2xvY2F0aW9uIl0sCi0JCVtEZWZpbmUgaWYgeW91IHdhbnQgdG8gc3BlY2lmeSB0aGUgcGF0aCB0byB5b3VyIHd0bXAgZmlsZV0pCi1maQotCi0KLWRubCB3dG1weCBkZXRlY3Rpb24KLUFDX01TR19DSEVDS0lORyhbaWYgeW91ciBzeXN0ZW0gZGVmaW5lcyBXVE1QWF9GSUxFXSkKLUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dG1wLmg+Ci0jaWZkZWYgSEFWRV9VVE1QWF9ICi0jaW5jbHVkZSA8dXRtcHguaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfUEFUSFNfSAotIyAgaW5jbHVkZSA8cGF0aHMuaD4KLSNlbmRpZgotCV1dLCBbWyBjaGFyICp3dG1weCA9IFdUTVBYX0ZJTEU7IF1dKV0sCi0JWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKSBdLAotCVsgQUNfTVNHX1JFU1VMVChbbm9dKQotCSAgc3lzdGVtX3d0bXB4X3BhdGg9bm8gCi1dKQotaWYgdGVzdCAteiAiJGNvbmZfd3RtcHhfbG9jYXRpb24iOyB0aGVuCi0JaWYgdGVzdCB4IiRzeXN0ZW1fd3RtcHhfcGF0aCIgPSB4Im5vIiA7IHRoZW4KLQkJQUNfREVGSU5FKFtESVNBQkxFX1dUTVBYXSkKLQlmaQotZWxzZQotCUFDX0RFRklORV9VTlFVT1RFRChbQ09ORl9XVE1QWF9GSUxFXSwgWyIkY29uZl93dG1weF9sb2NhdGlvbiJdLAotCQlbRGVmaW5lIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIHBhdGggdG8geW91ciB3dG1weCBmaWxlXSkKLWZpCi0KLQotaWYgdGVzdCAhIC16ICIkYmxpYnBhdGgiIDsgdGhlbgotCUxERkxBR1M9IiRMREZMQUdTICRibGliZmxhZ3MkYmxpYnBhdGgiCi0JQUNfTVNHX1dBUk4oW1BsZWFzZSBjaGVjayBhbmQgZWRpdCBibGlicGF0aCBpbiBMREZMQUdTIGluIE1ha2VmaWxlXSkKLWZpCi0KLWRubCBBZGRpbmcgLVdlcnJvciB0byBDRkxBR1MgZWFybHkgcHJldmVudHMgY29uZmlndXJlIHRlc3RzIGZyb20gcnVubmluZy4KLWRubCBBZGQgbm93LgotQ0ZMQUdTPSIkQ0ZMQUdTICR3ZXJyb3JfZmxhZ3MiCi0KLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRhZGRyaW5mbyIgIT0gInh5ZXMiIDsgdGhlbgotCVRFU1RfU1NIX0lQVjY9bm8KLWVsc2UKLQlURVNUX1NTSF9JUFY2PXllcwotZmkKLUFDX0NIRUNLX0RFQ0woW0JST0tFTl9HRVRBRERSSU5GT10sICBbVEVTVF9TU0hfSVBWNj1ub10pCi1BQ19TVUJTVChbVEVTVF9TU0hfSVBWNl0sIFskVEVTVF9TU0hfSVBWNl0pCi0KLUFDX0VYRUVYVAotQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZSBidWlsZHBrZy5zaCBvcGVuc3NoZC5pbml0IG9wZW5zc2gueG1sIFwKLQlvcGVuYnNkLWNvbXBhdC9NYWtlZmlsZSBvcGVuYnNkLWNvbXBhdC9yZWdyZXNzL01ha2VmaWxlIFwKLQlzdXJ2ZXkuc2hdKQotQUNfT1VUUFVUCi0KLSMgUHJpbnQgc3VtbWFyeSBvZiBvcHRpb25zCi0KLSMgU29tZW9uZSBwbGVhc2Ugc2hvdyBtZSBhIGJldHRlciB3YXkgOikKLUE9YGV2YWwgZWNobyAke3ByZWZpeH1gIDsgQT1gZXZhbCBlY2hvICR7QX1gCi1CPWBldmFsIGVjaG8gJHtiaW5kaXJ9YCA7IEI9YGV2YWwgZWNobyAke0J9YAotQz1gZXZhbCBlY2hvICR7c2JpbmRpcn1gIDsgQz1gZXZhbCBlY2hvICR7Q31gCi1EPWBldmFsIGVjaG8gJHtzeXNjb25mZGlyfWAgOyBEPWBldmFsIGVjaG8gJHtEfWAKLUU9YGV2YWwgZWNobyAke2xpYmV4ZWNkaXJ9L3NzaC1hc2twYXNzYCA7IEU9YGV2YWwgZWNobyAke0V9YAotRj1gZXZhbCBlY2hvICR7bWFuZGlyfS8ke21hbnN1YmRpcn1YYCA7IEY9YGV2YWwgZWNobyAke0Z9YAotRz1gZXZhbCBlY2hvICR7cGlkZGlyfWAgOyBHPWBldmFsIGVjaG8gJHtHfWAKLUg9YGV2YWwgZWNobyAke1BSSVZTRVBfUEFUSH1gIDsgSD1gZXZhbCBlY2hvICR7SH1gCi1JPWBldmFsIGVjaG8gJHt1c2VyX3BhdGh9YCA7IEk9YGV2YWwgZWNobyAke0l9YAotSj1gZXZhbCBlY2hvICR7c3VwZXJ1c2VyX3BhdGh9YCA7IEo9YGV2YWwgZWNobyAke0p9YAotCi1lY2hvICIiCi1lY2hvICJPcGVuU1NIIGhhcyBiZWVuIGNvbmZpZ3VyZWQgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IgotZWNobyAiICAgICAgICAgICAgICAgICAgICAgVXNlciBiaW5hcmllczogJEIiCi1lY2hvICIgICAgICAgICAgICAgICAgICAgU3lzdGVtIGJpbmFyaWVzOiAkQyIKLWVjaG8gIiAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gZmlsZXM6ICREIgotZWNobyAiICAgICAgICAgICAgICAgICAgIEFza3Bhc3MgcHJvZ3JhbTogJEUiCi1lY2hvICIgICAgICAgICAgICAgICAgICAgICAgTWFudWFsIHBhZ2VzOiAkRiIKLWVjaG8gIiAgICAgICAgICAgICAgICAgICAgICAgICAgUElEIGZpbGU6ICRHIgotZWNobyAiICBQcml2aWxlZ2Ugc2VwYXJhdGlvbiBjaHJvb3QgcGF0aDogJEgiCi1pZiB0ZXN0ICJ4JGV4dGVybmFsX3BhdGhfZmlsZSIgPSAieC9ldGMvbG9naW4uY29uZiIgOyB0aGVuCi1lY2hvICIgICBBdCBydW50aW1lLCBzc2hkIHdpbGwgdXNlIHRoZSBwYXRoIGRlZmluZWQgaW4gJGV4dGVybmFsX3BhdGhfZmlsZSIKLWVjaG8gIiAgIE1ha2Ugc3VyZSB0aGUgcGF0aCB0byBzY3AgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIHNjcCB3aWxsIG5vdCB3b3JrIgotZWxzZQotZWNobyAiICAgICAgICAgICAgc3NoZCBkZWZhdWx0IHVzZXIgUEFUSDogJEkiCi0JaWYgdGVzdCAhIC16ICIkZXh0ZXJuYWxfcGF0aF9maWxlIjsgdGhlbgotZWNobyAiICAgKElmIFBBVEggaXMgc2V0IGluICRleHRlcm5hbF9wYXRoX2ZpbGUgaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQuIElmIgotZWNobyAiICAgdXNlZCwgZW5zdXJlIHRoZSBwYXRoIHRvIHNjcCBpcyBwcmVzZW50LCBvdGhlcndpc2Ugc2NwIHdpbGwgbm90IHdvcmsuKSIKLQlmaQotZmkKLWlmIHRlc3QgISAteiAiJHN1cGVydXNlcl9wYXRoIiA7IHRoZW4KLWVjaG8gIiAgICAgICAgICBzc2hkIHN1cGVydXNlciB1c2VyIFBBVEg6ICRKIgotZmkKLWVjaG8gIiAgICAgICAgICAgICAgICAgICAgTWFucGFnZSBmb3JtYXQ6ICRNQU5UWVBFIgotZWNobyAiICAgICAgICAgICAgICAgICAgICAgICBQQU0gc3VwcG9ydDogJFBBTV9NU0ciCi1lY2hvICIgICAgICAgICAgICAgICAgICAgT1NGIFNJQSBzdXBwb3J0OiAkU0lBX01TRyIKLWVjaG8gIiAgICAgICAgICAgICAgICAgS2VyYmVyb3NWIHN1cHBvcnQ6ICRLUkI1X01TRyIKLWVjaG8gIiAgICAgICAgICAgICAgICAgICBTRUxpbnV4IHN1cHBvcnQ6ICRTRUxJTlVYX01TRyIKLWVjaG8gIiAgICAgICAgICAgICAgICAgU21hcnRjYXJkIHN1cHBvcnQ6ICRTQ0FSRF9NU0ciCi1lY2hvICIgICAgICAgICAgICAgICAgICAgICBTL0tFWSBzdXBwb3J0OiAkU0tFWV9NU0ciCi1lY2hvICIgICAgICAgICAgICAgIFRDUCBXcmFwcGVycyBzdXBwb3J0OiAkVENQV19NU0ciCi1lY2hvICIgICAgICAgICAgICAgIE1ENSBwYXNzd29yZCBzdXBwb3J0OiAkTUQ1X01TRyIKLWVjaG8gIiAgICAgICAgICAgICAgICAgICBsaWJlZGl0IHN1cHBvcnQ6ICRMSUJFRElUX01TRyIKLWVjaG8gIiAgU29sYXJpcyBwcm9jZXNzIGNvbnRyYWN0IHN1cHBvcnQ6ICRTUENfTVNHIgotZWNobyAiICAgICAgICAgICBTb2xhcmlzIHByb2plY3Qgc3VwcG9ydDogJFNQX01TRyIKLWVjaG8gIiAgICAgICBJUCBhZGRyZXNzIGluIFwkRElTUExBWSBoYWNrOiAkRElTUExBWV9IQUNLX01TRyIKLWVjaG8gIiAgICAgICAgICAgVHJhbnNsYXRlIHY0IGluIHY2IGhhY2s6ICRJUFY0X0lONl9IQUNLX01TRyIKLWVjaG8gIiAgICAgICAgICAgICAgICAgIEJTRCBBdXRoIHN1cHBvcnQ6ICRCU0RfQVVUSF9NU0ciCi1lY2hvICIgICAgICAgICAgICAgIFJhbmRvbSBudW1iZXIgc291cmNlOiAkUkFORF9NU0ciCi1lY2hvICIgICAgICAgICAgICAgUHJpdnNlcCBzYW5kYm94IHN0eWxlOiAkU0FOREJPWF9TVFlMRSIKLQotZWNobyAiIgotCi1lY2hvICIgICAgICAgICAgICAgIEhvc3Q6ICR7aG9zdH0iCi1lY2hvICIgICAgICAgICAgQ29tcGlsZXI6ICR7Q0N9IgotZWNobyAiICAgIENvbXBpbGVyIGZsYWdzOiAke0NGTEFHU30iCi1lY2hvICJQcmVwcm9jZXNzb3IgZmxhZ3M6ICR7Q1BQRkxBR1N9IgotZWNobyAiICAgICAgTGlua2VyIGZsYWdzOiAke0xERkxBR1N9IgotZWNobyAiICAgICAgICAgTGlicmFyaWVzOiAke0xJQlN9IgotaWYgdGVzdCAhIC16ICIke1NTSERMSUJTfSI7IHRoZW4KLWVjaG8gIiAgICAgICAgICtmb3Igc3NoZDogJHtTU0hETElCU30iCi1maQotaWYgdGVzdCAhIC16ICIke1NTSExJQlN9IjsgdGhlbgotZWNobyAiICAgICAgICAgICtmb3Igc3NoOiAke1NTSExJQlN9IgotZmkKLQotZWNobyAiIgotCi1pZiB0ZXN0ICJ4JE1BS0VfUEFDS0FHRV9TVVBQT1JURUQiID0gInh5ZXMiIDsgdGhlbgotCWVjaG8gIlNWUjQgc3R5bGUgcGFja2FnZXMgYXJlIHN1cHBvcnRlZCB3aXRoIFwibWFrZSBwYWNrYWdlXCIiCi0JZWNobyAiIgotZmkKLQotaWYgdGVzdCAieCRQQU1fTVNHIiA9ICJ4eWVzIiA7IHRoZW4KLQllY2hvICJQQU0gaXMgZW5hYmxlZC4gWW91IG1heSBuZWVkIHRvIGluc3RhbGwgYSBQQU0gY29udHJvbCBmaWxlICIKLQllY2hvICJmb3Igc3NoZCwgb3RoZXJ3aXNlIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIG1heSBmYWlsLiAiCi0JZWNobyAiRXhhbXBsZSBQQU0gY29udHJvbCBmaWxlcyBjYW4gYmUgZm91bmQgaW4gdGhlIGNvbnRyaWIvICIKLQllY2hvICJzdWJkaXJlY3RvcnkiCi0JZWNobyAiIgotZmkKLQotaWYgdGVzdCAhIC16ICIkTk9fUEVFUkNIRUNLIiA7IHRoZW4KLQllY2hvICJXQVJOSU5HOiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHlvdSBhcmUgdXNpbmcgZG9lcyBub3QiCi0JZWNobyAiYXBwZWFyIHRvIHN1cHBvcnQgZ2V0cGVlcmVpZCgpLCBnZXRwZWVydWNyZWQoKSBvciB0aGUiCi0JZWNobyAiU09fUEVFUkNSRUQgZ2V0c29ja29wdCgpIG9wdGlvbi4gVGhlc2UgZmFjaWxpdGllcyBhcmUgdXNlZCB0byIKLQllY2hvICJlbmZvcmNlIHNlY3VyaXR5IGNoZWNrcyB0byBwcmV2ZW50IHVuYXV0aG9yaXNlZCBjb25uZWN0aW9ucyB0byIKLQllY2hvICJzc2gtYWdlbnQuIFRoZWlyIGFic2VuY2UgaW5jcmVhc2VzIHRoZSByaXNrIHRoYXQgYSBtYWxpY2lvdXMiCi0JZWNobyAidXNlciBjYW4gY29ubmVjdCB0byB5b3VyIGFnZW50LiIKLQllY2hvICIiCi1maQotCi1pZiB0ZXN0ICIkQVVESVRfTU9EVUxFIiA9ICJic20iIDsgdGhlbgotCWVjaG8gIldBUk5JTkc6IEJTTSBhdWRpdCBzdXBwb3J0IGlzIGN1cnJlbnRseSBjb25zaWRlcmVkIEVYUEVSSU1FTlRBTC4iCi0JZWNobyAiU2VlIHRoZSBTb2xhcmlzIHNlY3Rpb24gaW4gUkVBRE1FLnBsYXRmb3JtIGZvciBkZXRhaWxzLiIKLWZpCmRpZmYgLS1naXQgYS9jb250cmliL01ha2VmaWxlIGIvY29udHJpYi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzNGViMi4uMDAwMDAwMAotLS0gYS9jb250cmliL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotYWxsOgotCUBlY2hvICJWYWxpZCB0YXJnZXRzOiBnbm9tZS1zc2gtYXNrcGFzczEgZ25vbWUtc3NoLWFza3Bhc3MyIgotCi1nbm9tZS1zc2gtYXNrcGFzczE6IGdub21lLXNzaC1hc2twYXNzMS5jCi0JJChDQykgYGdub21lLWNvbmZpZyAtLWNmbGFncyBnbm9tZSBnbm9tZXVpYCBcCi0JCWdub21lLXNzaC1hc2twYXNzMS5jIC1vIGdub21lLXNzaC1hc2twYXNzMSBcCi0JCWBnbm9tZS1jb25maWcgLS1saWJzIGdub21lIGdub21ldWlgCi0KLWdub21lLXNzaC1hc2twYXNzMjogZ25vbWUtc3NoLWFza3Bhc3MyLmMKLQkkKENDKSBgcGtnLWNvbmZpZyAtLWNmbGFncyBndGsrLTIuMGAgXAotCQlnbm9tZS1zc2gtYXNrcGFzczIuYyAtbyBnbm9tZS1zc2gtYXNrcGFzczIgXAotCQlgcGtnLWNvbmZpZyAtLWxpYnMgZ3RrKy0yLjAgeDExYAotCi1jbGVhbjoKLQlybSAtZiAqLm8gZ25vbWUtc3NoLWFza3Bhc3MxIGdub21lLXNzaC1hc2twYXNzMiBnbm9tZS1zc2gtYXNrcGFzcwpkaWZmIC0tZ2l0IGEvY29udHJpYi9SRUFETUUgYi9jb250cmliL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwMjIzOC4uMDAwMDAwMAotLS0gYS9jb250cmliL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLU90aGVyIHBhdGNoZXMgYW5kIGFkZG9ucyBmb3IgT3BlblNTSC4gUGxlYXNlIHNlbmQgc3VibWlzc2lvbnMgdG8KLWRqbUBtaW5kcm90Lm9yZwotCi1FeHRlcm5hbGx5IG1haW50YWluZWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TU0ggUHJveHkgQ29tbWFuZCAtLSBjb25uZWN0LmMKLQotU2h1bi1pY2hpIEdPVE8gPGdvdG9oQGltYXN5Lm9yLmpwPiBoYXMgd3JpdHRlbiBhIHZlcnkgdXNlZnVsIFByb3h5Q29tbWFuZAotd2hpY2ggYWxsb3dzIHRoZSB1c2Ugb2Ygb3V0Ym91bmQgU1NIIGZyb20gYmVoaW5kIGEgU09DS1M0LCBTT0NLUzUgb3IKLWh0dHBzIENPTk5FQ1Qgc3R5bGUgcHJveHkgc2VydmVyLiBIaXMgcGFnZSBmb3IgY29ubmVjdC5jIGhhcyBleHRlbnNpdmUKLWRvY3VtZW50YXRpb24gb24gaXRzIHVzZSBhcyB3ZWxsIGFzIGNvbXBpbGVkIHZlcnNpb25zIGZvciBXaW4zMi4KLQotaHR0cDovL3d3dy50YWl5by5jby5qcC9+Z290b2gvc3NoL2Nvbm5lY3QuaHRtbAotCi0KLVgxMSBTU0ggQXNrcGFzczoKLQotSmltIEtub2JsZSA8am1rbm9ibGVAcG9ib3guY29tPiBoYXMgd3JpdHRlbiBhbiBleGNlbGxlbnQgWDExCi1wYXNzcGhyYXNlIHJlcXVlc3Rlci4gVGhpcyBpcyBoaWdobHkgcmVjb21tZW5kZWQ6Ci0KLWh0dHA6Ly93d3cuam1rbm9ibGUubmV0L3NvZnR3YXJlL3gxMS1zc2gtYXNrcGFzcy8KLQotCi1JbiB0aGlzIGRpcmVjdG9yeQotLS0tLS0tLS0tLS0tLS0tLS0KLQotc3NoLWNvcHktaWQ6Ci0KLVBoaWwgSGFuZHMnIDxwaGlsQGhhbmRzLmNvbT4gc2hlbGwgc2NyaXB0IHRvIGF1dG9tYXRlIHRoZSBwcm9jZXNzIG9mIGFkZGluZwoteW91ciBwdWJsaWMga2V5IHRvIGEgcmVtb3RlIG1hY2hpbmUncyB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzIGZpbGUuCi0KLWdub21lLXNzaC1hc2twYXNzWzEyXToKLQotQSBHTk9NRSBhbmQgR3RrMiBwYXNzcGhyYXNlIHJlcXVlc3RlcnMuIFVzZSAibWFrZSBnbm9tZS1zc2gtYXNrcGFzczEiIG9yCi0ibWFrZSBnbm9tZS1zc2gtYXNrcGFzczIiIHRvIGJ1aWxkLgotCi1zc2hkLnBhbS5nZW5lcmljOgotCi1BIGdlbmVyaWMgUEFNIGNvbmZpZyBmaWxlIHdoaWNoIG1heSBiZSB1c2VmdWwgb24geW91ciBzeXN0ZW0uIFlNTVYKLQotc3NoZC5wYW0uZnJlZWJzZDoKLQotQSBQQU0gY29uZmlnIGZpbGUgd2hpY2ggd29ya3Mgd2l0aCBGcmVlQlNEJ3MgUEFNIHBvcnQuIENvbnRyaWJ1dGVkIGJ5Ci1Eb21pbmlrIEJyZXR0bmFjaGVyIDxkb21pQHNhYXJnYXRlLmRlPgotCi1maW5kc3NsLnNoOgotCi1TZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMgb2YgT3BlblNTTCBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgYW5kIHByaW50IHRoZWlyIAotdmVyc2lvbnMuICBUaGlzIGlzIGludGVuZGVkIHRvIGhlbHAgZGlhZ25vc2UgT3BlblNTSCdzICJPcGVuU1NMIGhlYWRlcnMgZG8gbm90Ci1tYXRjaCB5b3VyIGxpYnJhcnkiIGVycm9ycy4gCi0KLWFpeDoKLSAgICBGaWxlcyB0byBidWlsZCBhbiBBSVggbmF0aXZlIChpbnN0YWxscCBvciBTTUlUIGluc3RhbGxhYmxlKSBwYWNrYWdlLgotCi1jYWxkZXJhOgotICAgIFJQTSBzcGVjIGZpbGUgYW5kIHNjcmlwdHMgZm9yIGJ1aWxkaW5nIENhbGRlcmEgT3BlbkxpbnVpeCBwYWNrYWdlcwotCi1jeWd3aW46Ci0gICAgU3VwcG9ydCBmaWxlcyBmb3IgQ3lnd2luCi0KLWhwdXg6Ci0gICAgU3VwcG9ydCBmaWxlcyBmb3IgSFAtVVgKLQotcmVkaGF0OgotICAgIFJQTSBzcGVjIGZpbGUgYW5kIHNjcmlwdHMgZm9yIGJ1aWxkaW5nIFJlZGhhdCBwYWNrYWdlcwotCi1zdXNlOgotICAgIFJQTSBzcGVjIGZpbGUgYW5kIHNjcmlwdHMgZm9yIGJ1aWxkaW5nIFN1U0UgcGFja2FnZXMKLQpkaWZmIC0tZ2l0IGEvY29udHJpYi9haXgvUkVBRE1FIGIvY29udHJpYi9haXgvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTI5OTM1Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvYWl4L1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLU92ZXJ2aWV3OgotCi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBmaWxlcyB0byBidWlsZCBhbiBBSVggbmF0aXZlIChpbnN0YWxscCBvciBTTUlUCi1pbnN0YWxsYWJsZSkgb3BlbnNzaCBwYWNrYWdlLgotCi0KLURpcmVjdGlvbnM6Ci0KLShvcHRpb25hbCkgY3JlYXRlIGNvbmZpZy5sb2NhbCBpbiB5b3VyIGJ1aWxkIGRpcgotLi9jb25maWd1cmUgW29wdGlvbnNdCi1jb250cmliL2FpeC9idWlsZGJmZi5zaAotCi1UaGUgZmlsZSBjb25maWcubG9jYWwgb3IgdGhlIGVudmlyb25tZW50IGlzIHJlYWQgdG8gc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9ucwotKGRlZmF1bHQgZmlyc3QpOgotUEVSTUlUX1JPT1RfTE9HSU49W25vfHllc10KLVgxMV9GT1JXQVJESU5HPVtub3x5ZXNdCi1BSVhfU1JDPVtub3x5ZXNdCi0KLUFja25vd2xlZGdlbWVudHM6Ci0KLVRoZSBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeSBhcmUgYmFzZWQgb24gQmVuIExpbmRzdHJvbSdzIFNvbGFyaXMKLWJ1aWxkcGtnLnNoLiBCZW4gYWxzbyBzdXBwbGllZCBpbnZlbnRvcnkuc2guCi0KLUppbSBBYmJleSdzIChHUEwnZWQpIGxwcGJ1aWxkLTIuMSB3YXMgdXNlZCB0byBsZWFybiBob3cgdG8gYnVpbGQgLmJmZidzCi1hbmQgZm9yIGNvbXBhcmlzb24gd2l0aCB0aGUgb3V0cHV0IGZyb20gdGhpcyBzY3JpcHQsIGhvd2V2ZXIgbm8gY29kZQotZnJvbSBscHBidWlsZCBpcyBpbmNsdWRlZCBhbmQgaXQgaXMgbm90IHJlcXVpcmVkIGZvciBvcGVyYXRpb24uCi0KLVNSQyBzdXBwb3J0IGJhc2VkIG9uIGV4YW1wbGVzIHByb3ZpZGVkIGJ5IFNhbmRvciBTa2xhciBhbmQgTWFhcnRlbiBLcmV1Z2VyLgotUHJpdlNlcCBhY2NvdW50IGhhbmRsaW5nIGZpeGVzIGNvbnRyaWJ1dGVkIGJ5IFcuIEVhcmwgQWxsZW4uCi0KLQotT3RoZXIgbm90ZXM6Ci0KLVRoZSBzY3JpcHQgdHJlYXRzIGFsbCBwYWNrYWdlcyBhcyBVU1IgcGFja2FnZXMgKG5vdCBST09UK1VTUiB3aGVuCi1hcHByb3ByaWF0ZSkuICBJdCBzZWVtcyB0byB3b3JrLCB0aG91Z2guLi4uLi4KLQotSWYgdGhlcmUgYXJlIGFueSBwYXRjaGVzIHRvIHRoaXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBpbnRlZ3JhdGVkIHRoZXkKLW1heSBiZSBmb3VuZCBhdCBodHRwOi8vd3d3LnppcC5jb20uYXUvfmR0dWNrZXIvb3BlbnNzaC8uCi0KLQotRGlzY2xhaW1lcjoKLQotSXQgaXMgaG9wZWQgdGhhdCBpdCBpcyB1c2VmdWwgYnV0IHRoZXJlIGlzIG5vIHdhcnJhbnR5LiBJZiBpdCBicmVha3MKLXlvdSBnZXQgdG8ga2VlcCBib3RoIHBpZWNlcy4KLQotCi0JLSBEYXJyZW4gVHVja2VyIChkdHVja2VyIGF0IHppcCBkb3QgY29tIGRvdCBhdSkKLQkgIDIwMDIvMDMvMDEKLQotJElkOiBSRUFETUUsdiAxLjQgMjAwMy8wOC8yNSAwNTowMTowNCBkdHVja2VyIEV4cCAkCmRpZmYgLS1naXQgYS9jb250cmliL2FpeC9idWlsZGJmZi5zaCBiL2NvbnRyaWIvYWl4L2J1aWxkYmZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MWQ4Y2MzLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvYWl4L2J1aWxkYmZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBidWlsZGJmZi5zaDogQ3JlYXRlIEFJWCBTTUlULWluc3RhbGxhYmxlIE9wZW5TU0ggcGFja2FnZXMKLSMgJElkOiBidWlsZGJmZi5zaCx2IDEuMTMgMjAxMS8wNS8wNSAwMzo0ODo0MSBkam0gRXhwICQKLSMKLSMgQXV0aG9yOiBEYXJyZW4gVHVja2VyIChkdHVja2VyIGF0IHppcCBkb3QgY29tIGRvdCBhdSkKLSMgVGhpcyBmaWxlIGlzIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiBhbmQgY29tZXMgd2l0aCBhYnNvbHV0ZWx5Ci0jIG5vIHdhcnJhbnR5LgotIwotIyBCYXNlZCBvcmlnaW5hbGx5IG9uIEJlbiBMaW5kc3Ryb20ncyBidWlsZHBrZy5zaCBmb3IgU29sYXJpcwotIwotCi0jCi0jIFR1bmFibGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncwotIyAJY3JlYXRlIGEgImNvbmZpZy5sb2NhbCIgaW4geW91ciBidWlsZCBkaXJlY3Rvcnkgb3Igc2V0Ci0jCWVudmlyb25tZW50IHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGVzZS4KLSMKLVsgLXogIiRQRVJNSVRfUk9PVF9MT0dJTiIgXSAmJiBQRVJNSVRfUk9PVF9MT0dJTj1ubwotWyAteiAiJFgxMV9GT1JXQVJESU5HIiBdICYmIFgxMV9GT1JXQVJESU5HPW5vCi1bIC16ICIkQUlYX1NSQyIgXSAmJiBBSVhfU1JDPW5vCi0KLXVtYXNrIDAyMgotCi1zdGFydGRpcj1gcHdkYAotCi1wZXJsIC12ID4vZGV2L251bGwgfHwgKGVjaG8gcGVybCByZXF1aXJlZDsgZXhpdCAxKQotCi0jIFBhdGggdG8gaW52ZW50b3J5LnNoOiBzYW1lIHBsYWNlIGFzIGJ1aWxkYmZmLnNoCi1pZiAgZWNobyAkMCB8IGVncmVwICdeLycKLXRoZW4KLQlpbnZlbnRvcnk9YGRpcm5hbWUgJDBgL2ludmVudG9yeS5zaAkJIyBhYnNvbHV0ZSBwYXRoCi1lbHNlCi0JaW52ZW50b3J5PWBwd2RgL2BkaXJuYW1lICQwYC9pbnZlbnRvcnkuc2gJIyByZWxhdGl2ZSBwYXRoCi1maQotCi0jCi0jIFdlIHN0aWxsIHN1cHBvcnQgcnVubmluZyBmcm9tIGNvbnRyaWIvYWl4LCBidXQgdGhpcyBpcyBkZXByZWNhdGVkCi0jCi1pZiBwd2QgfCBlZ3JlcCAnY29udHJpYi9haXgkJwotdGhlbgotCWVjaG8gIkNoYW5naW5nIGRpcmVjdG9yeSB0byBgcHdkYC8uLi8uLiIKLQllY2hvICJQbGVhc2UgcnVuIGJ1aWxkYmZmLnNoIGZyb20geW91ciBidWlsZCBkaXJlY3RvcnkgaW4gZnV0dXJlLiIKLQljZCAuLi8uLgotCWNvbnRyaWJhaXg9MQotZmkKLQotaWYgWyAhIC1mIE1ha2VmaWxlIF0KLXRoZW4KLQllY2hvICJNYWtlZmlsZSBub3QgZm91bmQgKGRpZCB5b3UgcnVuIGNvbmZpZ3VyZT8pIgotCWV4aXQgMQotZmkKLQotIwotIyBEaXJlY3RvcmllcyB1c2VkIGR1cmluZyBidWlsZDoKLSMgY3VycmVudCBkaXIgPSAkb2JqZGlyCQlkaXJlY3RvcnkgeW91IHJhbiAuL2NvbmZpZ3VyZSBpbi4KLSMgJG9iamRpci8kUEtHRElSLyAJCWRpcmVjdG9yeSBwYWNrYWdlIGZpbGVzIGFyZSBjb25zdHJ1Y3RlZCBpbgotIyAkb2JqZGlyLyRQS0dESVIvcm9vdC8JCXBhY2thZ2Ugcm9vdCAoJEZBS0VfUk9PVCkKLSMKLW9iamRpcj1gcHdkYAotUEtHTkFNRT1vcGVuc3NoCi1QS0dESVI9cGFja2FnZQotCi0jCi0jIENvbGxlY3QgbG9jYWwgY29uZmlndXJhdGlvbiBzZXR0aW5ncyB0byBvdmVycmlkZSBkZWZhdWx0cwotIwotaWYgWyAtcyAuL2NvbmZpZy5sb2NhbCBdCi10aGVuCi0JZWNobyBSZWFkaW5nIGxvY2FsIHNldHRpbmdzIGZyb20gY29uZmlnLmxvY2FsCi0JLiAuL2NvbmZpZy5sb2NhbAotZmkKLQotIwotIyBGaWxsIGluIHNvbWUgZGV0YWlscyBmcm9tIE1ha2VmaWxlLCBsaWtlIHByZWZpeCBhbmQgc3lzY29uZmRpcgotIwl0aGUgZXZhbCBhbHNvIGV4cGFuZHMgdmFyaWFibGVzIGxpa2Ugc3lzY29uZmRpcj0ke3ByZWZpeH0vZXRjCi0jCXByb3ZpZGVkIHRoZXkgYXJlIGV2YWwnZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIKLSMKLWZvciBjb25mdmFyIGluIHByZWZpeCBleGVjX3ByZWZpeCBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFkaXIgbWFuZGlyIG1hbnN1YmRpciBzeXNjb25mZGlyIHBpZGRpciBzcmNkaXIKLWRvCi0JZXZhbCAkY29uZnZhcj1gZ3JlcCAiXiRjb25mdmFyPSIgJG9iamRpci9NYWtlZmlsZSB8IGN1dCAtZCA9IC1mIDJgCi1kb25lCi0KLSMKLSMgQ29sbGVjdCB2YWx1ZXMgb2YgcHJpdnNlcCB1c2VyIGFuZCBwcml2c2VwIHBhdGgKLSMJY3VycmVudGx5IG9ubHkgZm91bmQgaW4gY29uZmlnLmgKLSMKLWZvciBjb25mdmFyIGluIFNTSF9QUklWU0VQX1VTRVIgUFJJVlNFUF9QQVRICi1kbwotCWV2YWwgJGNvbmZ2YXI9YGF3ayAnLyNkZWZpbmVbIFx0XSckY29uZnZhcicve3ByaW50ICQzfScgJG9iamRpci9jb25maWcuaGAKLWRvbmUKLQotIyBTZXQgcHJpdnNlcCBkZWZhdWx0cyBpZiBub3QgZGVmaW5lZAotaWYgWyAteiAiJFNTSF9QUklWU0VQX1VTRVIiIF0KLXRoZW4KLQlTU0hfUFJJVlNFUF9VU0VSPXNzaGQKLWZpCi1pZiBbIC16ICIkUFJJVlNFUF9QQVRIIiBdCi10aGVuCi0JUFJJVlNFUF9QQVRIPS92YXIvZW1wdHkKLWZpCi0KLSMgQ2xlYW4gcGFja2FnZSBidWlsZCBkaXJlY3RvcnkKLXJtIC1yZiAkb2JqZGlyLyRQS0dESVIKLUZBS0VfUk9PVD0kb2JqZGlyLyRQS0dESVIvcm9vdAotbWtkaXIgLXAgJEZBS0VfUk9PVAotCi0jIFN0YXJ0IGJ5IGZha2luZyByb290IGluc3RhbGwKLWVjaG8gIkZha2luZyByb290IGluc3RhbGwuLi4iCi1jZCAkb2JqZGlyCi1tYWtlIGluc3RhbGwtbm9rZXlzIERFU1RESVI9JEZBS0VfUk9PVAotCi1pZiBbICQ/IC1ndCAwIF0KLXRoZW4KLQllY2hvICJGYWtlIHJvb3QgaW5zdGFsbCBmYWlsZWQsIHN0b3BwaW5nLiIKLQlleGl0IDEKLWZpCi0KLSMKLSMgQ29weSBpbmZvcm1hdGlvbmFsIGZpbGVzIHRvIGluY2x1ZGUgaW4gcGFja2FnZQotIwotY3AgJHNyY2Rpci9MSUNFTkNFICRvYmpkaXIvJFBLR0RJUi8KLWNwICRzcmNkaXIvUkVBRE1FKiAkb2JqZGlyLyRQS0dESVIvCi0KLSMKLSMgRXh0cmFjdCBjb21tb24gaW5mbyByZXF1aXJlcyBmb3IgdGhlICdpbmZvJyBwYXJ0IG9mIHRoZSBwYWNrYWdlLgotIwlBSVggcmVxdWlyZXMgNC1wYXJ0IHZlcnNpb24gbnVtYmVycwotIwotVkVSU0lPTj1gLi9zc2ggLVYgMj4mMSB8IGN1dCAtZiAxIC1kICwgfCBjdXQgLWYgMiAtZCBfYAotTUFKT1I9YGVjaG8gJFZFUlNJT04gfCBjdXQgLWYgMSAtZCBwIHwgY3V0IC1mIDEgLWQgLmAKLU1JTk9SPWBlY2hvICRWRVJTSU9OIHwgY3V0IC1mIDEgLWQgcCB8IGN1dCAtZiAyIC1kIC5gCi1QQVRDSD1gZWNobyAkVkVSU0lPTiB8IGN1dCAtZiAxIC1kIHAgfCBjdXQgLWYgMyAtZCAuYAotUE9SVEFCTEU9YGVjaG8gJFZFUlNJT04gfCBhd2sgJ0JFR0lOe0ZTPSJwIn17cHJpbnQgJDJ9J2AKLVsgIiRQQVRDSCIgPSAiIiBdICYmIFBBVENIPTAKLVsgIiRQT1JUQUJMRSIgPSAiIiBdICYmIFBPUlRBQkxFPTAKLUJGRlZFUlNJT049YHByaW50ZiAiJWQuJWQuJWQuJWQiICRNQUpPUiAkTUlOT1IgJFBBVENIICRQT1JUQUJMRWAKLQotZWNobyAiQnVpbGRpbmcgQkZGIGZvciAkUEtHTkFNRSAkVkVSU0lPTiAocGFja2FnZSB2ZXJzaW9uICRCRkZWRVJTSU9OKSIKLQotIwotIyBTZXQgc3NoIGFuZCBzc2hkIHBhcmFtZXRlcnMgYXMgcGVyIGNvbmZpZy5sb2NhbAotIwotaWYgWyAiJHtQRVJNSVRfUk9PVF9MT0dJTn0iID0gbm8gXQotdGhlbgotCXBlcmwgLXAgLWkgLWUgInMvI1Blcm1pdFJvb3RMb2dpbiB5ZXMvUGVybWl0Um9vdExvZ2luIG5vLyIgXAotCQkkRkFLRV9ST09ULyR7c3lzY29uZmRpcn0vc3NoZF9jb25maWcKLWZpCi1pZiBbICIke1gxMV9GT1JXQVJESU5HfSIgPSB5ZXMgXQotdGhlbgotCXBlcmwgLXAgLWkgLWUgInMvI1gxMUZvcndhcmRpbmcgbm8vWDExRm9yd2FyZGluZyB5ZXMvIiBcCi0JCSRGQUtFX1JPT1QvJHtzeXNjb25mZGlyfS9zc2hkX2NvbmZpZwotZmkKLQotCi0jIFJlbmFtZSBjb25maWcgZmlsZXM7IHBvc3RpbnN0YWxsIHNjcmlwdCB3aWxsIGNvcHkgdGhlbSBpZiBuZWNlc3NhcnkKLWZvciBjZmdmaWxlIGluIHNzaF9jb25maWcgc3NoZF9jb25maWcKLWRvCi0JbXYgJEZBS0VfUk9PVC8kc3lzY29uZmRpci8kY2ZnZmlsZSAkRkFLRV9ST09ULyRzeXNjb25mZGlyLyRjZmdmaWxlLmRlZmF1bHQKLWRvbmUKLQotIwotIyBHZW5lcmF0ZSBscHAgY29udHJvbCBmaWxlcy4KLSMJd29ya2luZyBkaXIgaXMgJEZBS0VfUk9PVCBidXQgZmlsZXMgYXJlIGdlbmVyYXRlZCBpbiBkaXIgYWJvdmUKLSMJYW5kIG1vdmVkIGludG8gcGxhY2UganVzdCBiZWZvcmUgY3JlYXRpb24gb2YgLmJmZgotIwotY2QgJEZBS0VfUk9PVAotZWNobyBHZW5lcmF0aW5nIExQUCBjb250cm9sIGZpbGVzCi1maW5kIC4gISAtbmFtZSAuIC1wcmludCA+Li4vb3BlbnNzaC5hbAotJGludmVudG9yeSA+Li4vb3BlbnNzaC5pbnZlbnRvcnkKLQotY2F0IDw8RU9EID4uLi9vcGVuc3NoLmNvcHlyaWdodAotVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciBhIEJTRC1zdHlsZSBsaWNlbnNlLgotRm9yIHRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UsIHNlZSAvdXNyL2xwcC9vcGVuc3NoL0xJQ0VOQ0UKLUVPRAotCi0jCi0jIG9wZW5zc2guc2l6ZSBmaWxlIGFsbG93cyBmaWxlc3lzdGVtIGV4cGFuc2lvbiBhcyByZXF1aXJlZAotIyBnZW5lcmF0ZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgZmlsZXMKLSMgdGhlbiBjYWxjdWxhdGUgZGlzayB1c2FnZSBmb3IgZWFjaCBkaXJlY3RvcnkgYW5kIHN0b3JlIGluIG9wZW5zc2guc2l6ZQotIwotZmlsZXM9YGZpbmQgLiAtdHlwZSBmIC1wcmludGAKLWRpcnM9YGZvciBmaWxlIGluICRmaWxlczsgZG8gZGlybmFtZSAkZmlsZTsgZG9uZSB8IHNvcnQgLXVgCi1mb3IgZGlyIGluICRkaXJzCi1kbwotCWR1ICRkaXIKLWRvbmUgPiAuLi9vcGVuc3NoLnNpemUKLQotIwotIyBDcmVhdGUgcG9zdGluc3RhbGwgc2NyaXB0Ci0jCi1jYXQgPDxFT0YgPj4uLi9vcGVuc3NoLnBvc3RfaQotIyEvYmluL3NoCi0KLWVjaG8gQ3JlYXRpbmcgY29uZmlncyBmcm9tIGRlZmF1bHRzIGlmIG5lY2Vzc2FyeS4KLWZvciBjZmdmaWxlIGluIHNzaF9jb25maWcgc3NoZF9jb25maWcKLWRvCi0JaWYgWyAhIC1mICRzeXNjb25mZGlyL1wkY2ZnZmlsZSBdCi0JdGhlbgotCQllY2hvICJDcmVhdGluZyBcJGNmZ2ZpbGUgZnJvbSBkZWZhdWx0IgotCQljcCAkc3lzY29uZmRpci9cJGNmZ2ZpbGUuZGVmYXVsdCAkc3lzY29uZmRpci9cJGNmZ2ZpbGUKLQllbHNlCi0JCWVjaG8gIlwkY2ZnZmlsZSBhbHJlYWR5IGV4aXN0cy4iCi0JZmkKLWRvbmUKLWVjaG8KLQotIyBDcmVhdGUgUHJpdmlsZWdlU2VwYXJhdGlvbiB1c2VyIGFuZCBncm91cCBpZiBub3QgcHJlc2VudAotZWNobyBDaGVja2luZyBmb3IgUHJpdmlsZWdlU2VwYXJhdGlvbiB1c2VyIGFuZCBncm91cC4KLWlmIGN1dCAtZjEgLWQ6IC9ldGMvZ3JvdXAgfCBlZ3JlcCAnXickU1NIX1BSSVZTRVBfVVNFUidcJCcgPi9kZXYvbnVsbAotdGhlbgotCWVjaG8gIlByaXZTZXAgZ3JvdXAgJFNTSF9QUklWU0VQX1VTRVIgYWxyZWFkeSBleGlzdHMuIgotZWxzZQotCWVjaG8gIkNyZWF0aW5nIFByaXZTZXAgZ3JvdXAgJFNTSF9QUklWU0VQX1VTRVIuIgotCW1rZ3JvdXAgLUEgJFNTSF9QUklWU0VQX1VTRVIKLWZpCi0KLSMgQ3JlYXRlIHVzZXIgaWYgcmVxdWlyZWQKLWlmIGxzdXNlciAiJFNTSF9QUklWU0VQX1VTRVIiID4vZGV2L251bGwKLXRoZW4KLQllY2hvICJQcml2U2VwIHVzZXIgJFNTSF9QUklWU0VQX1VTRVIgYWxyZWFkeSBleGlzdHMuIgotZWxzZQotCWVjaG8gIkNyZWF0aW5nIFByaXZTZXAgdXNlciAkU1NIX1BSSVZTRVBfVVNFUi4iCi0JbWt1c2VyIGdlY29zPSdTU0hEIFByaXZTZXAgVXNlcicgbG9naW49ZmFsc2UgcmxvZ2luPWZhbHNlIGFjY291bnRfbG9ja2VkPXRydWUgcGdycD0kU1NIX1BSSVZTRVBfVVNFUiAkU1NIX1BSSVZTRVBfVVNFUgotZmkKLQotaWYgZWdyZXAgJ15bIFx0XSpVc2VQcml2aWxlZ2VTZXBhcmF0aW9uWyBcdF0rbm8nICRzeXNjb25mZGlyL3NzaGRfY29uZmlnID4vZGV2L251bGwKLXRoZW4KLQllY2hvIFVzZVByaXZpbGVnZVNlcGFyYXRpb24gbm90IGVuYWJsZWQsIHByaXZzZXAgZGlyZWN0b3J5IG5vdCByZXF1aXJlZC4KLWVsc2UKLQkjIGNyZWF0ZSBjaHJvb3QgZGlyZWN0b3J5IGlmIHJlcXVpcmVkCi0JaWYgWyAtZCAkUFJJVlNFUF9QQVRIIF0KLQl0aGVuCi0JCWVjaG8gIlByaXZTZXAgY2hyb290IGRpcmVjdG9yeSAkUFJJVlNFUF9QQVRIIGFscmVhZHkgZXhpc3RzLiIKLQllbHNlCi0JCWVjaG8gIkNyZWF0aW5nIFByaXZTZXAgY2hyb290IGRpcmVjdG9yeSAkUFJJVlNFUF9QQVRILiIKLQkJbWtkaXIgJFBSSVZTRVBfUEFUSAotCQljaG93biAwICRQUklWU0VQX1BBVEgKLQkJY2hncnAgMCAkUFJJVlNFUF9QQVRICi0JCWNobW9kIDc1NSAkUFJJVlNFUF9QQVRICi0JZmkKLWZpCi1lY2hvCi0KLSMgR2VuZXJhdGUga2V5cyB1bmxlc3MgdGhleSBhbHJlYWR5IGV4aXN0Ci1lY2hvIENyZWF0aW5nIGhvc3Qga2V5cyBpZiByZXF1aXJlZC4KLWlmIFsgLWYgIiRzeXNjb25mZGlyL3NzaF9ob3N0X2tleSIgXSA7IHRoZW4KLQllY2hvICIkc3lzY29uZmRpci9zc2hfaG9zdF9rZXkgYWxyZWFkeSBleGlzdHMsIHNraXBwaW5nLiIKLWVsc2UKLQkkYmluZGlyL3NzaC1rZXlnZW4gLXQgcnNhMSAtZiAkc3lzY29uZmRpci9zc2hfaG9zdF9rZXkgLU4gIiIKLWZpCi1pZiBbIC1mICRzeXNjb25mZGlyL3NzaF9ob3N0X2RzYV9rZXkgXSA7IHRoZW4KLQllY2hvICIkc3lzY29uZmRpci9zc2hfaG9zdF9kc2Ffa2V5IGFscmVhZHkgZXhpc3RzLCBza2lwcGluZy4iCi1lbHNlCi0JJGJpbmRpci9zc2gta2V5Z2VuIC10IGRzYSAtZiAkc3lzY29uZmRpci9zc2hfaG9zdF9kc2Ffa2V5IC1OICIiCi1maQotaWYgWyAtZiAkc3lzY29uZmRpci9zc2hfaG9zdF9yc2Ffa2V5IF0gOyB0aGVuCi0JZWNobyAiJHN5c2NvbmZkaXIvc3NoX2hvc3RfcnNhX2tleSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcuIgotZWxzZQotCSRiaW5kaXIvc3NoLWtleWdlbiAtdCByc2EgLWYgJHN5c2NvbmZkaXIvc3NoX2hvc3RfcnNhX2tleSAtTiAiIgotZmkKLWVjaG8KLQotIyBTZXQgc3RhcnR1cCBjb21tYW5kIGRlcGVuZGluZyBvbiBTUkMgc3VwcG9ydAotaWYgWyAiJEFJWF9TUkMiID0gInllcyIgXQotdGhlbgotCWVjaG8gQ3JlYXRpbmcgU1JDIHNzaGQgc3Vic3lzdGVtLgotCXJtc3N5cyAtcyBzc2hkIDI+JjEgPi9kZXYvbnVsbAotCW1rc3N5cyAtcyBzc2hkIC1wICIkc2JpbmRpci9zc2hkIiAtYSAnLUQnIC11IDAgLVMgLW4gMTUgLWYgOSAtUiAtRyB0Y3BpcAotCXN0YXJ0dXBjbWQ9InN0YXJ0ICRzYmluZGlyL3NzaGQgXFxcIlxcXCRzcmNfcnVubmluZ1xcXCIiCi0Jb2xkc3RhcnRjbWQ9IiRzYmluZGlyL3NzaGQiCi1lbHNlCi0Jc3RhcnR1cGNtZD0iJHNiaW5kaXIvc3NoZCIKLQlvbGRzdGFydGNtZD0ic3RhcnQgJHNiaW5kaXIvc3NoZCBcXFwiJHNyY19ydW5uaW5nXFxcIiIKLWZpCi0KLSMgSWYgbWlncmF0aW5nIHRvIG9yIGZyb20gU1JDLCBjaGFuZ2UgcHJldmlvdXMgc3RhcnR1cCBjb21tYW5kCi0jIG90aGVyd2lzZSBhZGQgdG8gcmMudGNwaXAKLWlmIGVncmVwICJeXCRvbGRzdGFydGNtZCIgL2V0Yy9yYy50Y3BpcCA+L2Rldi9udWxsCi10aGVuCi0JaWYgc2VkICJzfF5cJG9sZHN0YXJ0Y21kfFwkc3RhcnR1cGNtZHxnIiAvZXRjL3JjLnRjcGlwID4vZXRjL3JjLnRjcGlwLm5ldwotCXRoZW4KLQkJY2htb2QgMDc1NSAvZXRjL3JjLnRjcGlwLm5ldwotCQltdiAvZXRjL3JjLnRjcGlwIC9ldGMvcmMudGNwaXAub2xkICYmIFwKLQkJbXYgL2V0Yy9yYy50Y3BpcC5uZXcgL2V0Yy9yYy50Y3BpcAotCWVsc2UKLQkJZWNobyAiVXBkYXRpbmcgL2V0Yy9yYy50Y3BpcCBmYWlsZWQsIHBsZWFzZSBjaGVjay4iCi0JZmkKLWVsc2UKLQkjIEFkZCB0byBzeXN0ZW0gc3RhcnR1cCBpZiByZXF1aXJlZAotCWlmIGdyZXAgIl5cJHN0YXJ0dXBjbWQiIC9ldGMvcmMudGNwaXAgPi9kZXYvbnVsbAotCXRoZW4KLQkJZWNobyAic3NoZCBmb3VuZCBpbiByYy50Y3BpcCwgbm90IGFkZGluZy4iCi0JZWxzZQotCQllY2hvICJBZGRpbmcgc3NoZCB0byByYy50Y3BpcCIKLQkJZWNobyA+Pi9ldGMvcmMudGNwaXAKLQkJZWNobyAiIyBTdGFydCBzc2hkIiA+Pi9ldGMvcmMudGNwaXAKLQkJZWNobyAiXCRzdGFydHVwY21kIiA+Pi9ldGMvcmMudGNwaXAKLQlmaQotZmkKLUVPRgotCi0jCi0jIENyZWF0ZSBsaWJscHAuYSBhbmQgbW92ZSBjb250cm9sIGZpbGVzIGludG8gaXQKLSMKLWVjaG8gQ3JlYXRpbmcgbGlibHBwLmEKLSgKLQljZCAuLgotCWZvciBpIGluIG9wZW5zc2guYWwgb3BlbnNzaC5jb3B5cmlnaHQgb3BlbnNzaC5pbnZlbnRvcnkgb3BlbnNzaC5wb3N0X2kgb3BlbnNzaC5zaXplIExJQ0VOQ0UgUkVBRE1FKgotCWRvCi0JCWFyIC1yIGxpYmxwcC5hICRpCi0JCXJtICRpCi0JZG9uZQotKQotCi0jCi0jIENyZWF0ZSBscHBfbmFtZQotIwotIyBUaGlzIHdpbGwgZW5kIHVwIGxvb2tpbmcgc29tZXRoaW5nIGxpa2U6Ci0jIDQgUiBJIE9wZW5TU0ggewotIyBPcGVuU1NIIDMuMC4yLjEgMSBOIFUgZW5fVVMgT3BlblNTSCAzLjAuMnAxIFBvcnRhYmxlIGZvciBBSVgKLSMgWwotIyAlCi0jIC91c3IvbG9jYWwvYmluIDgwNzMKLSMgL3Vzci9sb2NhbC9ldGMgMTg5Ci0jIC91c3IvbG9jYWwvbGliZXhlYyAxODUKLSMgL3Vzci9sb2NhbC9tYW4vbWFuMSAxNDUKLSMgL3Vzci9sb2NhbC9tYW4vbWFuOCA4MwotIyAvdXNyL2xvY2FsL3NiaW4gMjEwNQotIyAvdXNyL2xvY2FsL3NoYXJlIDMKLSMgJQotIyBdCi0jIH0KLQotZWNobyBDcmVhdGluZyBscHBfbmFtZQotY2F0IDw8RU9GID4uLi9scHBfbmFtZQotNCBSIEkgJFBLR05BTUUgewotJFBLR05BTUUgJEJGRlZFUlNJT04gMSBOIFUgZW5fVVMgT3BlblNTSCAkVkVSU0lPTiBQb3J0YWJsZSBmb3IgQUlYCi1bCi0lCi1FT0YKLQotZm9yIGkgaW4gJGJpbmRpciAkc3lzY29uZmRpciAkbGliZXhlY2RpciAkbWFuZGlyLyR7bWFuc3ViZGlyfTEgJG1hbmRpci8ke21hbnN1YmRpcn04ICRzYmluZGlyICRkYXRhZGlyIC91c3IvbHBwL29wZW5zc2gKLWRvCi0JIyBnZXQgc2l6ZSBpbiA1MTIgYnl0ZSBibG9ja3MKLQlpZiBbIC1kICRGQUtFX1JPT1QvJGkgXQotCXRoZW4KLQkJc2l6ZT1gZHUgJEZBS0VfUk9PVC8kaSB8IGF3ayAne3ByaW50ICQxfSdgCi0JCWVjaG8gIiRpICRzaXplIiA+Pi4uL2xwcF9uYW1lCi0JZmkKLWRvbmUKLQotZWNobyAnJScgPj4uLi9scHBfbmFtZQotZWNobyAnXScgPj4uLi9scHBfbmFtZQotZWNobyAnfScgPj4uLi9scHBfbmFtZQotCi0jCi0jIE1vdmUgcGllY2VzIGludG8gcGxhY2UKLSMKLW1rZGlyIC1wIHVzci9scHAvb3BlbnNzaAotbXYgLi4vbGlibHBwLmEgdXNyL2xwcC9vcGVuc3NoCi1tdiAuLi9scHBfbmFtZSAuCi0KLSMKLSMgTm93IGludm9rZSBiYWNrdXAgdG8gY3JlYXRlIC5iZmYgZmlsZQotIwlub3RlOiBscHBfbmFtZSBuZWVkcyB0byBiZSB0aGUgZmlyc3QgZmlsZSBzbyB3ZSBnZW5lcmF0ZSB0aGUKLSMJZmlsZSBsaXN0IG9uIHRoZSBmbHkgYW5kIGZlZWQgaXQgdG8gYmFja3VwIHVzaW5nIC1pCi0jCi1lY2hvIENyZWF0aW5nICRQS0dOQU1FLSRWRVJTSU9OLmJmZiB3aXRoIGJhY2t1cC4uLgotcm0gLWYgJFBLR05BTUUtJFZFUlNJT04uYmZmCi0oCi0JZWNobyAiLi9scHBfbmFtZSIKLQlmaW5kIC4gISAtbmFtZSBscHBfbmFtZSAtYSAhIC1uYW1lIC4gLXByaW50Ci0pIHwgYmFja3VwICAtaSAtcSAtZiAuLi8kUEtHTkFNRS0kVkVSU0lPTi5iZmYgJGZpbGVsaXN0Ci0KLSMKLSMgTW92ZSBwYWNrYWdlIGludG8gZmluYWwgbG9jYXRpb24gYW5kIGNsZWFuIHVwCi0jCi1tdiAuLi8kUEtHTkFNRS0kVkVSU0lPTi5iZmYgJHN0YXJ0ZGlyCi1jZCAkc3RhcnRkaXIKLXJtIC1yZiAkb2JqZGlyLyRQS0dESVIKLQotZWNobyAkMDogZG9uZS4KLQpkaWZmIC0tZ2l0IGEvY29udHJpYi9haXgvaW52ZW50b3J5LnNoIGIvY29udHJpYi9haXgvaW52ZW50b3J5LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjY0MWU3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvYWl4L2ludmVudG9yeS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBpbnZlbnRvcnkuc2gKLSMgJElkOiBpbnZlbnRvcnkuc2gsdiAxLjYgMjAwMy8xMS8yMSAxMjo0ODo1NiBkam0gRXhwICQKLSMKLSMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IEJlbiBMaW5kc3Ryb20sIG1vZGlmaWVkIGJ5IERhcnJlbiBUdWNrZXIgdG8gdXNlIHBlcmwKLSMgVGhpcyBmaWxlIGlzIHBsYWNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgotIwotIyBUaGlzIHdpbGwgcHJvZHVjZSBhbiBBSVggcGFja2FnZSBpbnZlbnRvcnkgZmlsZSwgd2hpY2ggbG9va3MgbGlrZToKLSMKLSMgL3Vzci9sb2NhbC9iaW46Ci0jICAgICAgICAgIGNsYXNzPWFwcGx5LGludmVudG9yeSxvcGVuc3NoCi0jICAgICAgICAgIG93bmVyPXJvb3QKLSMgICAgICAgICAgZ3JvdXA9c3lzdGVtCi0jICAgICAgICAgIG1vZGU9NzU1Ci0jICAgICAgICAgIHR5cGU9RElSRUNUT1JZCi0jIC91c3IvbG9jYWwvYmluL3Nsb2dpbjoKLSMgICAgICAgICAgY2xhc3M9YXBwbHksaW52ZW50b3J5LG9wZW5zc2gKLSMgICAgICAgICAgb3duZXI9cm9vdAotIyAgICAgICAgICBncm91cD1zeXN0ZW0KLSMgICAgICAgICAgbW9kZT03NzcKLSMgICAgICAgICAgdHlwZT1TWU1MSU5LCi0jICAgICAgICAgIHRhcmdldD1zc2gKLSMgL3Vzci9sb2NhbC9zaGFyZS9Tc2guYmluOgotIyAgICAgICAgICBjbGFzcz1hcHBseSxpbnZlbnRvcnksb3BlbnNzaAotIyAgICAgICAgICBvd25lcj1yb290Ci0jICAgICAgICAgIGdyb3VwPXN5c3RlbQotIyAgICAgICAgICBtb2RlPTY0NAotIyAgICAgICAgICB0eXBlPUZJTEUKLSMgICAgICAgICAgc2l6ZT1WT0xBVElMRQotIyAgICAgICAgICBjaGVja3N1bT1WT0xBVElMRQotCi1maW5kIC4gISAtbmFtZSAuIC1wcmludCB8IHBlcmwgLW5lICd7Ci0JY2hvbXA7Ci0JaWYgKCAtbCAkXyApIHsKLQkJKCRkZXYsJGlubywkbW9kLCRubCwkdWlkLCRnaWQsJHJkZXYsJHN6LCRhdCwkbXQsJGN0LCRic3osJGJsayk9bHN0YXQ7Ci0JfSBlbHNlIHsKLQkJKCRkZXYsJGlubywkbW9kLCRubCwkdWlkLCRnaWQsJHJkZXYsJHN6LCRhdCwkbXQsJGN0LCRic3osJGJsayk9c3RhdDsKLQl9Ci0KLQkjIFN0YXJ0IHRvIGRpc3BsYXkgaW52ZW50b3J5IGluZm9ybWF0aW9uCi0JJG5hbWUgPSAkXzsKLQkkbmFtZSA9fiBzfF4ufHw7CSMgU3RyaXAgbGVhZGluZyBkb3QgZnJvbSBwYXRoCi0JcHJpbnQgIiRuYW1lOlxuIjsKLQlwcmludCAiXHRjbGFzcz1hcHBseSxpbnZlbnRvcnksb3BlbnNzaFxuIjsKLQlwcmludCAiXHRvd25lcj1yb290XG4iOwotCXByaW50ICJcdGdyb3VwPXN5c3RlbVxuIjsKLQlwcmludGYgIlx0bW9kZT0lbG9cbiIsICRtb2QgJiAwNzc3NzsJIyBNYXNrIHBlcm0gYml0cwotCQotCWlmICggLWwgJF8gKSB7Ci0JCSMgRW50cnkgaXMgU3ltTGluawotCQlwcmludCAiXHR0eXBlPVNZTUxJTktcbiI7Ci0JCXByaW50ZiAiXHR0YXJnZXQ9JXNcbiIsIHJlYWRsaW5rKCRfKTsKLQl9IGVsc2lmICggLWYgJF8gKSB7Ci0JCSMgRW50cnkgaXMgRmlsZQotCQlwcmludCAiXHR0eXBlPUZJTEVcbiI7Ci0JCXByaW50ICJcdHNpemU9JHN6XG4iOwotCQlwcmludCAiXHRjaGVja3N1bT1WT0xBVElMRVxuIjsKLQl9IGVsc2lmICggLWQgJF8gKSB7Ci0JCSMgRW50cnkgaXMgRGlyZWN0b3J5Ci0JCXByaW50ICJcdHR5cGU9RElSRUNUT1JZXG4iOwotCX0KLX0nCmRpZmYgLS1naXQgYS9jb250cmliL2FpeC9wYW0uY29uZiBiL2NvbnRyaWIvYWl4L3BhbS5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTUyOGIwLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvYWl4L3BhbS5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIwotIyBQQU0gY29uZmlndXJhdGlvbiBmaWxlIC9ldGMvcGFtLmNvbmYKLSMgRXhhbXBsZSBmb3IgT3BlblNTSCBvbiBBSVggNS4yCi0jCi0KLSMgQXV0aGVudGljYXRpb24gTWFuYWdlbWVudAotc3NoZCAgICBhdXRoICAgICAgICAgICAgcmVxdWlyZWQgICAgICAgIC91c3IvbGliL3NlY3VyaXR5L3BhbV9haXgKLU9USEVSICAgYXV0aCAgICAgICAgICAgIHJlcXVpcmVkICAgICAgICAvdXNyL2xpYi9zZWN1cml0eS9wYW1fYWl4Ci0KLSMgQWNjb3VudCBNYW5hZ2VtZW50Ci1zc2hkICAgIGFjY291bnQgICAgICAgICByZXF1aXJlZCAgICAgICAgL3Vzci9saWIvc2VjdXJpdHkvcGFtX2FpeAotT1RIRVIgICBhY2NvdW50ICAgICAgICAgcmVxdWlyZWQgICAgICAgIC91c3IvbGliL3NlY3VyaXR5L3BhbV9haXgKLQotIyBQYXNzd29yZCBNYW5hZ2VtZW50Ci1zc2hkICAgIHBhc3N3b3JkICAgICAgICByZXF1aXJlZCAgICAgICAgL3Vzci9saWIvc2VjdXJpdHkvcGFtX2FpeAotT1RIRVIgICBwYXNzd29yZCAgICAgICAgcmVxdWlyZWQgICAgICAgIC91c3IvbGliL3NlY3VyaXR5L3BhbV9haXgKLQotIyBTZXNzaW9uIE1hbmFnZW1lbnQKLXNzaGQgICAgc2Vzc2lvbiAgICAgICAgIHJlcXVpcmVkICAgICAgICAvdXNyL2xpYi9zZWN1cml0eS9wYW1fYWl4Ci1PVEhFUiAgIHNlc3Npb24gICAgICAgICByZXF1aXJlZCAgICAgICAgL3Vzci9saWIvc2VjdXJpdHkvcGFtX2FpeApkaWZmIC0tZ2l0IGEvY29udHJpYi9jYWxkZXJhL29wZW5zc2guc3BlYyBiL2NvbnRyaWIvY2FsZGVyYS9vcGVuc3NoLnNwZWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZDQ0MWQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9jYWxkZXJhL29wZW5zc2guc3BlYworKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0KLSMgU29tZSBvZiB0aGlzIHdpbGwgbmVlZCByZS1ldmFsdWF0aW9uIHBvc3QtTFNCLiAgVGhlIFNWSWRpciBpcyB0aGVyZQotIyBiZWNhdXNlIHRoZSBsaW5rIGFwcGVhcmVkIGJyb2tlbi4gIFRoZSByZXN0IGlzIGZvciBlYXN5IGNvbXBpbGF0aW9uLAotIyB0aGUgdHJhZGVvZmYgb3BlbiB0byBkaXNjdXNzaW9uLiAgKExDOTU3KQotCi0lZGVmaW5lCVNWSWRpcgkJL2V0Yy9yYy5kL2luaXQuZAotJXshP19kZWZhdWx0ZG9jZGlyOiVkZWZpbmUJX2RlZmF1bHRkb2NkaXIJJXtfcHJlZml4fS9zaGFyZS9kb2MvcGFja2FnZXN9Ci0leyE/U1ZJY2RpcjolZGVmaW5lCQlTVkljZGlyCQkvZXRjL3N5c2NvbmZpZy9kYWVtb25zfQotCi0lZGVmaW5lIF9tYW5kaXIJCSV7X3ByZWZpeH0vc2hhcmUvbWFuL2VuCi0lZGVmaW5lIF9zeXNjb25mZGlyCS9ldGMvc3NoCi0lZGVmaW5lCV9saWJleGVjZGlyCSV7X2xpYmRpcn0vc3NoCi0KLSMgRG8gd2Ugd2FudCB0byBkaXNhYmxlIHJvb3RfbG9naW4/ICgxPXllcyAwPW5vKQotJWRlZmluZSBub19yb290X2xvZ2luIDAKLQotI29sZCBjdnMgc3R1ZmYuICBwbGVhc2UgdXBkYXRlIGJlZm9yZSB1c2UuICBtYXkgYmUgZGVwcmVjYXRlZC4KLSVkZWZpbmUgdXNlX3N0YWJsZQkxCi0lZGVmaW5lIHZlcnNpb24gCTUuOXAxCi0laWYgJXt1c2Vfc3RhYmxlfQotICAlZGVmaW5lIGN2cwkJJXtuaWx9Ci0gICVkZWZpbmUgcmVsZWFzZSAJMQotJWVsc2UKLSAgJWRlZmluZSBjdnMJCWN2czIwMDUwMzE1Ci0gICVkZWZpbmUgcmVsZWFzZSAJMHIxCi0lZW5kaWYKLSVkZWZpbmUgeHNhCQl4MTEtc3NoLWFza3Bhc3MJCQotJWRlZmluZSBhc2twYXNzCQkle3hzYX0tMS4yLjQuMQotCi0jIE9wZW5TU0ggcHJpdmlsZWdlIHNlcGFyYXRpb24gcmVxdWlyZXMgYSB1c2VyICYgZ3JvdXAgSUQKLSVkZWZpbmUgc3NoZF91aWQgICAgNjcKLSVkZWZpbmUgc3NoZF9naWQgICAgNjcKLQotTmFtZSAgICAgICAgCTogb3BlbnNzaAotVmVyc2lvbiAgICAgCTogJXt2ZXJzaW9ufSV7Y3ZzfQotUmVsZWFzZSAgICAgCTogJXtyZWxlYXNlfQotR3JvdXAgICAgICAgCTogU3lzdGVtL05ldHdvcmsKLQotU3VtbWFyeSAgICAgCTogT3BlblNTSCBmcmVlIFNlY3VyZSBTaGVsbCAoU1NIKSBpbXBsZW1lbnRhdGlvbi4KLVN1bW1hcnkoZGUpIAk6IE9wZW5TU0ggLSBmcmVpZSBJbXBsZW1lbnRhdGlvbiBkZXIgU2VjdXJlIFNoZWxsIChTU0gpLgotU3VtbWFyeShlcykgCTogT3BlblNTSCBpbXBsZW1lbnRhY2nzbiBsaWJyZSBkZSBTZWN1cmUgU2hlbGwgKFNTSCkuCi1TdW1tYXJ5KGZyKSAJOiBJbXBs6W1lbnRhdGlvbiBsaWJyZSBkdSBzaGVsbCBz6WN1cmlz6SBPcGVuU1NIIChTU0gpLgotU3VtbWFyeShpdCkgCTogSW1wbGVtZW50YXppb25lIGdyYXR1aXRhIE9wZW5TU0ggZGVsbGEgU2VjdXJlIFNoZWxsLgotU3VtbWFyeShwdCkgCTogSW1wbGVtZW50YefjbyBsaXZyZSBPcGVuU1NIIGRvIHByb3RvY29sbyAnU2VjdXJlIFNoZWxsJyAoU1NIKS4KLVN1bW1hcnkocHRfQlIpIAk6IEltcGxlbWVudGHn428gbGl2cmUgT3BlblNTSCBkbyBwcm90b2NvbG8gU2VjdXJlIFNoZWxsIChTU0gpLgotCi1Db3B5cmlnaHQgICAJOiBCU0QKLVBhY2thZ2VyICAgIAk6IFJheW11bmQgV2lsbCA8cmF5QGNhbGRlcmEuZGU+Ci1VUkwgICAgICAgICAJOiBodHRwOi8vd3d3Lm9wZW5zc2guY29tLwotCi1PYnNvbGV0ZXMgICAJOiBzc2gsIHNzaC1jbGllbnRzLCBvcGVuc3NoLWNsaWVudHMKLQotQnVpbGRSb290ICAgCTogL3RtcC8le25hbWV9LSV7dmVyc2lvbn0KLUJ1aWxkUmVxdWlyZXMJOiBYRnJlZTg2LWltYWtlCi0KLSMgJXt1c2Vfc3RhYmxlfT09MToJZnRwOi8vZnRwLm9wZW5ic2Qub3JnL3B1Yi9PcGVuQlNEL09wZW5TU0gvcG9ydGFibGUKLSMgJXt1c2Vfc3RhYmxlfT09MDoJOnBzZXJ2ZXI6Y3ZzQGJhc3MuZGlyZWN0aGl0LmNvbTovY3ZzL29wZW5zc2hfY3ZzCi1Tb3VyY2UwOiBzZWUtYWJvdmU6Ly4uLi9vcGVuc3NoLSV7dmVyc2lvbn0udGFyLmd6Ci0laWYgJXt1c2Vfc3RhYmxlfQotU291cmNlMTogc2VlLWFib3ZlOi8uLi4vb3BlbnNzaC0le3ZlcnNpb259LnRhci5nei5hc2MKLSVlbmRpZgotU291cmNlMjogaHR0cDovL3d3dy5qbWtub2JsZS5uZXQvc29mdHdhcmUvJXt4c2F9LyV7YXNrcGFzc30udGFyLmd6Ci1Tb3VyY2UzOiBodHRwOi8vd3d3Lm9wZW5zc2guY29tL2ZhcS5odG1sCi0KLSVQYWNrYWdlIHNlcnZlcgotR3JvdXAgICAgICAgCTogU3lzdGVtL05ldHdvcmsKLVJlcXVpcmVzICAgIAk6IG9wZW5zc2ggPSAle3ZlcnNpb259Ci1PYnNvbGV0ZXMgICAJOiBzc2gtc2VydmVyCi0KLVN1bW1hcnkgICAgIAk6IE9wZW5TU0ggU2VjdXJlIFNoZWxsIHByb3RvY29sIHNlcnZlciAoc3NoZCkuCi1TdW1tYXJ5KGRlKSAJOiBPcGVuU1NIIFNlY3VyZSBTaGVsbCBQcm90b2NvbC1TZXJ2ZXIgKHNzaGQpLgotU3VtbWFyeShlcykgCTogU2Vydmlkb3IgZGVsIHByb3RvY29sbyBPcGVuU1NIIFNlY3VyZSBTaGVsbCAoc3NoZCkuCi1TdW1tYXJ5KGZyKSAJOiBTZXJ2ZXVyIGRlIHByb3RvY29sZSBkdSBzaGVsbCBz6WN1cmlz6SBPcGVuU1NIIChzc2hkKS4KLVN1bW1hcnkoaXQpIAk6IFNlcnZlciBPcGVuU1NIIHBlciBpbCBwcm90b2NvbGxvIFNlY3VyZSBTaGVsbCAoc3NoZCkuCi1TdW1tYXJ5KHB0KSAJOiBTZXJ2aWRvciBkbyBwcm90b2NvbG8gJ1NlY3VyZSBTaGVsbCcgT3BlblNTSCAoc3NoZCkuCi1TdW1tYXJ5KHB0X0JSKSAJOiBTZXJ2aWRvciBkbyBwcm90b2NvbG8gU2VjdXJlIFNoZWxsIE9wZW5TU0ggKHNzaGQpLgotCi0KLSVQYWNrYWdlIGFza3Bhc3MKLUdyb3VwICAgICAgIAk6IFN5c3RlbS9OZXR3b3JrCi1SZXF1aXJlcyAgICAJOiBvcGVuc3NoID0gJXt2ZXJzaW9ufQotVVJMICAgICAgIAk6IGh0dHA6Ly93d3cuam1rbm9ibGUubmV0L3NvZnR3YXJlL3gxMS1zc2gtYXNrcGFzcy8KLU9ic29sZXRlcyAgIAk6IHNzaC1leHRyYXMKLQotU3VtbWFyeSAgICAgCTogT3BlblNTSCBYMTEgcGFzcy1waHJhc2UgZGlhbG9nLgotU3VtbWFyeShkZSkgCTogT3BlblNTSCBYMTEgUGFzc3dvcnQtRGlhbG9nLgotU3VtbWFyeShlcykgCTogQXBsaWNhY2nzbiBkZSBwZXRpY2nzbiBkZSBmcmFzZSBjbGF2ZSBPcGVuU1NIIFgxMS4KLVN1bW1hcnkoZnIpIAk6IERpYWxvZ3VlIHBhc3MtcGhyYXNlIFgxMSBkJ09wZW5TU0guCi1TdW1tYXJ5KGl0KSAJOiBGaW5lc3RyYSBkaSBkaWFsb2dvIFgxMSBwZXIgbGEgZnJhc2Ugc2VncmV0YSBkaSBPcGVuU1NILgotU3VtbWFyeShwdCkgCTogRGnhbG9nbyBkZSBwZWRpZG8gZGUgc2VuaGEgcGFyYSBYMTEgZG8gT3BlblNTSC4KLVN1bW1hcnkocHRfQlIpIAk6IERp4WxvZ28gZGUgcGVkaWRvIGRlIHNlbmhhIHBhcmEgWDExIGRvIE9wZW5TU0guCi0KLQotJURlc2NyaXB0aW9uCi1PcGVuU1NIIChTZWN1cmUgU2hlbGwpIHByb3ZpZGVzIGFjY2VzcyB0byBhIHJlbW90ZSBzeXN0ZW0uIEl0IHJlcGxhY2VzCi10ZWxuZXQsIHJsb2dpbiwgIHJleGVjLCBhbmQgcnNoLCBhbmQgcHJvdmlkZXMgc2VjdXJlIGVuY3J5cHRlZCAKLWNvbW11bmljYXRpb25zIGJldHdlZW4gdHdvIHVudHJ1c3RlZCBob3N0cyBvdmVyIGFuIGluc2VjdXJlIG5ldHdvcmsuICAKLVgxMSBjb25uZWN0aW9ucyBhbmQgYXJiaXRyYXJ5IFRDUC9JUCBwb3J0cyBjYW4gYWxzbyBiZSBmb3J3YXJkZWQgb3ZlciAKLXRoZSBzZWN1cmUgY2hhbm5lbC4KLQotJURlc2NyaXB0aW9uIC1sIGRlCi1PcGVuU1NIIChTZWN1cmUgU2hlbGwpIHN0ZWxsdCBkZW4gWnVnYW5nIHp1IGFuZGVyZW4gUmVjaG5lcm4gaGVyLiBFcyBlcnNldHp0Ci10ZWxuZXQsIHJsb2dpbiwgcmV4ZWMgdW5kIHJzaCB1bmQgc3RlbGx0IGVpbmUgc2ljaGVyZSwgdmVyc2NobPxzc2VsdGUKLVZlcmJpbmR1bmcgendpc2NoZW4gendlaSBuaWNodCB2ZXJ0cmF1ZW5zd/xyZGlnZW4gSG9zdHMg/GJlciBlaW5lIHVuc2ljaGVyZXMKLU5ldHp3ZXJrIGhlci4gWDExIFZlcmJpbmR1bmdlbiB1bmQgYmVsaWViaWdlIGFuZGVyZSBUQ1AvSVAgUG9ydHMga/ZubmVuIGViZW5zbwot/GJlciBkZW4gc2ljaGVyZW4gQ2hhbm5lbCB3ZWl0ZXJnZWxlaXRldCB3ZXJkZW4uCi0KLSVEZXNjcmlwdGlvbiAtbCBlcwotT3BlblNTSCAoU2VjdXJlIFNoZWxsKSBwcm9wb3JjaW9uYSBhY2Nlc28gYSBzaXN0ZW1hcyByZW1vdG9zLiBSZWVtcGxhemEgYQotdGVsbmV0LCBybG9naW4sIHJleGVjLCB5IHJzaCwgeSBwcm9wb3JjaW9uYSBjb211bmljYWNpb25lcyBzZWd1cmFzIGVuY3JpcHRhZGFzCi1lbnRyZSBkb3MgZXF1aXBvcyBlbnRyZSBsb3MgcXVlIG5vIHNlIGhhIGVzdGFibGVjaWRvIGNvbmZpYW56YSBhIHRyYXbpcyBkZSB1bmEKLXJlZCBpbnNlZ3VyYS4gTGFzIGNvbmV4aW9uZXMgWDExIHkgcHVlcnRvcyBUQ1AvSVAgYXJiaXRyYXJpb3MgdGFtYmnpbiBwdWVkZW4KLXNlciBjYW5hbGl6YWRhcyBzb2JyZSBlbCBjYW5hbCBzZWd1cm8uCi0KLSVEZXNjcmlwdGlvbiAtbCBmcgotT3BlblNTSCAoU2VjdXJlIFNoZWxsKSBmb3Vybml0IHVuIGFjY+hzIOAgdW4gc3lzdOhtZSBkaXN0YW50LiBJbCByZW1wbGFjZQotdGVsbmV0LCBybG9naW4sIHJleGVjIGV0IHJzaCwgdG91dCBlbiBhc3N1cmFudCBkZXMgY29tbXVuaWNhdGlvbnMgY3J5cHTpZXMKLXNlY3VyaXPpZXMgZW50cmUgZGV1eCBo9HRlcyBub24gZmlhYmlsaXPpcyBzdXIgdW4gculzZWF1IG5vbiBz6WN1cmlz6S4gRGVzCi1jb25uZXhpb25zIFgxMSBldCBkZXMgcG9ydHMgVENQL0lQIGFyYml0cmFpcmVzIHBldXZlbnQg6WdhbGVtZW50IOp0cmUKLXRyYW5zbWlzIHN1ciBsZSBjYW5hbCBz6WN1cmlz6S4KLQotJURlc2NyaXB0aW9uIC1sIGl0Ci1PcGVuU1NIIChTZWN1cmUgU2hlbGwpIGZvcm5pc2NlIGwnYWNjZXNzbyBhZCB1biBzaXN0ZW1hIHJlbW90by4KLVNvc3RpdHVpc2NlIHRlbG5ldCwgcmxvZ2luLCByZXhlYywgZSByc2gsIGUgZm9ybmlzY2UgY29tdW5pY2F6aW9uaSBzaWN1cmUKLWUgY3JpdHRhdGUgdHJhIGR1ZSBob3N0IG5vbiBmaWRhdGkgc3UgdW5hIHJldGUgbm9uIHNpY3VyYS4gTGUgY29ubmVzc2lvbmkKLVgxMSBhZCB1bmEgcG9ydGEgVENQL0lQIGFyYml0cmFyaWEgcG9zc29ubyBlc3NlcmUgaW5vbHRyYXRlIGF0dHJhdmVyc28KLXVuIGNhbmFsZSBzaWN1cm8uCi0KLSVEZXNjcmlwdGlvbiAtbCBwdAotT3BlblNTSCAoU2VjdXJlIFNoZWxsKSBmb3JuZWNlIGFjZXNzbyBhIHVtIHNpc3RlbWEgcmVtb3RvLiBTdWJzdGl0dWkgbwotdGVsbmV0LCBybG9naW4sIHJleGVjLCBlIG8gcnNoIGUgZm9ybmVjZSBjb211bmljYef1ZXMgc2VndXJhcyBlIGNpZnJhZGFzCi1lbnRyZSBkdWFzIG3hcXVpbmFzIHNlbSBjb25maWFu52Egbfp0dWEgc29icmUgdW1hIHJlZGUgaW5zZWd1cmEuCi1MaWdh5/VlcyBYMTEgZSBwb3J0b3MgVENQL0lQIGFyYml0cuFyaW9zIHRhbWLpbSBwb2RlciBzZXIgcmVlbnZpYWRvcwotcGVsbyBjYW5hbCBzZWd1cm8uCi0KLSVEZXNjcmlwdGlvbiAtbCBwdF9CUgotTyBPcGVuU1NIIChTZWN1cmUgU2hlbGwpIGZvcm5lY2UgYWNlc3NvIGEgdW0gc2lzdGVtYSByZW1vdG8uIFN1YnN0aXR1aSBvCi10ZWxuZXQsIHJsb2dpbiwgcmV4ZWMsIGUgbyByc2ggZSBmb3JuZWNlIGNvbXVuaWNh5/VlcyBzZWd1cmFzIGUgY3JpcHRvZ3JhZmFkYXMKLWVudHJlIGR1YXMgbeFxdWluYXMgc2VtIGNvbmZpYW7nYSBt+nR1YSBzb2JyZSB1bWEgcmVkZSBpbnNlZ3VyYS4KLUxpZ2Hn9WVzIFgxMSBlIHBvcnRhcyBUQ1AvSVAgYXJiaXRy4XJpYXMgdGFtYultIHBvZGVtIHNlciByZWVudmlhZGFzCi1wZWxvIGNhbmFsIHNlZ3Vyby4KLQotJURlc2NyaXB0aW9uIHNlcnZlcgotVGhpcyBwYWNrYWdlIGluc3RhbGxzIHRoZSBzc2hkLCB0aGUgc2VydmVyIHBvcnRpb24gb2YgT3BlblNTSC4gCi0KLSVEZXNjcmlwdGlvbiAtbCBkZSBzZXJ2ZXIKLURpZXNlcyBQYWtldCBpbnN0YWxsaWVydCBkZW4gc3NoZCwgZGVuIFNlcnZlci1UZWlsIGRlciBPcGVuU1NILgotCi0lRGVzY3JpcHRpb24gLWwgZXMgc2VydmVyCi1Fc3RlIHBhcXVldGUgaW5zdGFsYSBzc2hkLCBsYSBwYXJ0ZSBzZXJ2aWRvciBkZSBPcGVuU1NILgotCi0lRGVzY3JpcHRpb24gLWwgZnIgc2VydmVyCi1DZSBwYXF1ZXRhZ2UgaW5zdGFsbGUgbGUgJ3NzaGQnLCBwYXJ0aWUgc2VydmV1ciBkZSBPcGVuU1NILgotCi0lRGVzY3JpcHRpb24gLWwgaXQgc2VydmVyCi1RdWVzdG8gcGFjY2hldHRvIGluc3RhbGxhIHNzaGQsIGlsIHNlcnZlciBkaSBPcGVuU1NILgotCi0lRGVzY3JpcHRpb24gLWwgcHQgc2VydmVyCi1Fc3RlIHBhY290ZSBpbnRhbGEgbyBzc2hkLCBvIHNlcnZpZG9yIGRvIE9wZW5TU0guCi0KLSVEZXNjcmlwdGlvbiAtbCBwdF9CUiBzZXJ2ZXIKLUVzdGUgcGFjb3RlIGludGFsYSBvIHNzaGQsIG8gc2Vydmlkb3IgZG8gT3BlblNTSC4KLQotJURlc2NyaXB0aW9uIGFza3Bhc3MKLVRoaXMgcGFja2FnZSBjb250YWlucyBhbiBYMTEtYmFzZWQgcGFzcy1waHJhc2UgZGlhbG9nIHVzZWQgcGVyCi1kZWZhdWx0IGJ5IHNzaC1hZGQoMSkuIEl0IGlzIGJhc2VkIG9uICV7YXNrcGFzc30KLWJ5IEppbSBLbm9ibGUgPGpta25vYmxlQHBvYm94LmNvbT4uCi0KLQotJVByZXAKLSVzZXR1cCAlKFsgLXogIiV7Y3ZzfSIgXSB8fCBlY2hvICItbiAle25hbWV9X2N2cyIpIC1hMgotJWlmICEgJXt1c2Vfc3RhYmxlfQotICBhdXRvcmVjb25mCi0lZW5kaWYKLQotCi0lQnVpbGQKLUNGTEFHUz0iJFJQTV9PUFRfRkxBR1MiIFwKLSVjb25maWd1cmUgXAotICAgICAgICAgICAgLS13aXRoLXBhbSBcCi0gICAgICAgICAgICAtLXdpdGgtdGNwLXdyYXBwZXJzIFwKLQkgICAgLS13aXRoLXByaXZzZXAtcGF0aD0le192YXJ9L2VtcHR5L3NzaGQgXAotCSAgICAjbGVhdmUgdGhpcyBsaW5lIGZvciBlYXN5IGVkaXRzLgotCi0lX19tYWtlCi0KLWNkICV7YXNrcGFzc30KLSVjb25maWd1cmUgXAotCSAgICAjbGVhdmUgdGhpcyBsaW5lIGZvciBlYXN5IGVkaXRzLgotCi14bWttZgotJV9fbWFrZSBpbmNsdWRlcwotJV9fbWFrZQotCi0KLSVJbnN0YWxsCi1bICV7YnVpbGRyb290fSAhPSAiLyIgXSAmJiBybSAtcmYgJXtidWlsZHJvb3R9Ci0KLW1ha2UgaW5zdGFsbCBERVNURElSPSV7YnVpbGRyb290fQotJW1ha2VpbnN0YWxsIC1DICV7YXNrcGFzc30gXAotICAgIEJJTkRJUj0le19saWJleGVjZGlyfSBcCi0gICAgTUFOUEFUSD0le19tYW5kaXJ9IFwKLSAgICBERVNURElSPSV7YnVpbGRyb290fQotCi0jIE9wZW5MaW51eCBzcGVjaWZpYyBjb25maWd1cmF0aW9uCi1ta2RpciAtcCAle2J1aWxkcm9vdH17L2V0Yy9wYW0uZCwle1NWSWNkaXJ9LCV7U1ZJZGlyfX0KLW1rZGlyIC1wICV7YnVpbGRyb290fSV7X3Zhcn0vZW1wdHkvc3NoZAotCi0jIGVuYWJsaW5nIFgxMSBmb3J3YXJkaW5nIG9uIHRoZSBzZXJ2ZXIgaXMgY29udmVuaWVudCBhbmQgb2theSwKLSMgb24gdGhlIGNsaWVudCBzaWRlIGl0J3MgYSBwb3RlbnRpYWwgc2VjdXJpdHkgcmlzayEKLSVfX3BlcmwgLXBpIC1lICdzOiNYMTFGb3J3YXJkaW5nIG5vOlgxMUZvcndhcmRpbmcgeWVzOmcnIFwKLSAgICAle2J1aWxkcm9vdH0le19zeXNjb25mZGlyfS9zc2hkX2NvbmZpZwotCi0laWYgJXtub19yb290X2xvZ2lufQotJV9fcGVybCAtcGkgLWUgJ3M6I1Blcm1pdFJvb3RMb2dpbiB5ZXM6UGVybWl0Um9vdExvZ2luIG5vOmcnIFwKLSAgICAle2J1aWxkcm9vdH0le19zeXNjb25mZGlyfS9zc2hkX2NvbmZpZwotJWVuZGlmCi0KLWluc3RhbGwgLW02NDQgY29udHJpYi9jYWxkZXJhL3NzaGQucGFtICV7YnVpbGRyb290fS9ldGMvcGFtLmQvc3NoZAotIyBGSVhNRTogZGlzYWJsZWQsIGZpbmQgb3V0IHdoeSB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoIG5pcwotJV9fcGVybCAtcGkgLWUgJ3M6KC4qcGFtX2xpbWl0cy4qKTojJDE6JyBcCi0gICAgJXtidWlsZHJvb3R9L2V0Yy9wYW0uZC9zc2hkCi0KLWluc3RhbGwgLW0gMDc1NSBjb250cmliL2NhbGRlcmEvc3NoZC5pbml0ICV7YnVpbGRyb290fSV7U1ZJZGlyfS9zc2hkCi0KLSMgdGhlIGxhc3Qgb25lIGlzIG5lZWRsZXNzLCBidXQgbW9yZSBmdXR1cmUtcHJvb2YKLWZpbmQgJXtidWlsZHJvb3R9JXtTVklkaXJ9IC10eXBlIGYgLWV4ZWMgXAotICAgICVfX3BlcmwgLXBpIC1lICdzOlxAU1ZJZGlyXEA6JXtTVklkaXJ9Omc7XAotCQkgICAgczpcQHN5c2NvbmZkaXJcQDole19zeXNjb25mZGlyfTpnOyBcCi0JCSAgICBzOi91c3Ivc2Jpbjole19zYmluZGlyfTpnJ1wKLSAgICBce1x9IFw7Ci0KLWNhdCA8PC1Fb0QgPiAle2J1aWxkcm9vdH0le1NWSWNkaXJ9L3NzaGQKLQlJREVOVD1zc2hkCi0JREVTQ1JJUFRJVkU9Ik9wZW5TU0ggc2VjdXJlIHNoZWxsIGRhZW1vbiIKLQkjIFRoaXMgc2VydmljZSB3aWxsIGJlIG1hcmtlZCBhcyAnc2tpcHBlZCcgb24gYm9vdCBpZiB0aGVyZQotCSMgaXMgbm8gaG9zdCBrZXkuIFVzZSBzc2gtaG9zdC1rZXlnZW4gdG8gZ2VuZXJhdGUgb25lCi0JT05CT09UPSJ5ZXMiCi0JT1BUSU9OUz0iIgotRW9ECi0KLVNLRz0le2J1aWxkcm9vdH0le19zYmluZGlyfS9zc2gtaG9zdC1rZXlnZW4KLWluc3RhbGwgLW0gMDc1NSBjb250cmliL2NhbGRlcmEvc3NoLWhvc3Qta2V5Z2VuICRTS0cKLSMgRml4IHVwIHNvbWUgcGF0aCBuYW1lcyBpbiB0aGUga2V5Z2VuIHRveV5Ib2wKLSAgICAlX19wZXJsIC1waSAtZSAnczpcQHN5c2NvbmZkaXJcQDole19zeXNjb25mZGlyfTpnOyBcCi0JCSAgICBzOlxAc3Noa2V5Z2VuXEA6JXtfYmluZGlyfS9zc2gta2V5Z2VuOmcnIFwKLQkle2J1aWxkcm9vdH0le19zYmluZGlyfS9zc2gtaG9zdC1rZXlnZW4KLQotIyBUaGlzIGxvb2tzIHRlcnJpYmxlLiAgRXhwZWN0IGl0IHRvIGNoYW5nZS4KLSMgaW5zdGFsbCByZW1haW5pbmcgZG9jcwotRG9jRD0iJXtidWlsZHJvb3R9JXtfZGVmYXVsdGRvY2Rpcn0vJXtuYW1lfS0le3ZlcnNpb259IgotbWtkaXIgLXAgJERvY0QvJXthc2twYXNzfQotY3AgLWEgQ1JFRElUUyBDaGFuZ2VMb2cgTElDRU5DRSBPVkVSVklFVyBSRUFETUUqIFRPRE8gUFJPVE9DT0wqICREb2NECi1pbnN0YWxsIC1wIC1tIDA0NDQgJXtTT1VSQ0UzfSAgJERvY0QvZmFxLmh0bWwKLWNwIC1hICV7YXNrcGFzc30ve1JFQURNRSxDaGFuZ2VMb2csVE9ETyxTc2hBc2twYXNzKi5hZH0gICREb2NELyV7YXNrcGFzc30KLSVpZiAle3VzZV9zdGFibGV9Ci0gIGNwIC1wICV7YXNrcGFzc30vJXt4c2F9Lm1hbiAkRG9jRC8le2Fza3Bhc3N9LyV7eHNhfS4xCi0lZWxzZQotICBjcCAtcCAle2Fza3Bhc3N9LyV7eHNhfS5tYW4gJXtidWlsZHJvb3R9JXtfbWFuZGlyfW1hbjEvJXt4c2F9LjEKLSAgbG4gLXMgICV7eHNhfS4xICV7YnVpbGRyb290fSV7X21hbmRpcn1tYW4xL3NzaC1hc2twYXNzLjEKLSVlbmRpZgotCi1maW5kICV7YnVpbGRyb290fSV7X21hbmRpcn0gLXR5cGUgZiAtbm90IC1uYW1lCScqLmd6JyAtcHJpbnQwIHwgeGFyZ3MgLTByICVfX2d6aXAgLTluZgotcm0gJXtidWlsZHJvb3R9JXtfbWFuZGlyfS9tYW4xL3Nsb2dpbi4xICYmIFwKLSAgICBsbiAtcyAle19tYW5kaXJ9L21hbjEvc3NoLjEuZ3ogXAotICAgICV7YnVpbGRyb290fSV7X21hbmRpcn0vbWFuMS9zbG9naW4uMS5negotCi0KLSVDbGVhbgotIyV7cm1ERVNURElSfQotWyAle2J1aWxkcm9vdH0gIT0gIi8iIF0gJiYgcm0gLXJmICV7YnVpbGRyb290fQotCi0lUG9zdAotIyBHZW5lcmF0ZSBob3N0IGtleSB3aGVuIG5vbmUgaXMgcHJlc2VudCB0byBnZXQgdXAgYW5kIHJ1bm5pbmcsCi0jIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgcmVxdWlyZSB0aGlzIGZvciBob3N0LWJhc2VkIGF1dGghCi0jIHNzaC1ob3N0LWtleWdlbiBjaGVja3MgZm9yIGV4aXN0aW5nIGtleXMuCi0vdXNyL3NiaW4vc3NoLWhvc3Qta2V5Z2VuCi06ICMgdG8gcHJvdGVjdCB0aGUgcnBtIGRhdGFiYXNlCi0KLSVwcmUgc2VydmVyCi0le19zYmluZGlyfS9ncm91cGFkZCAtZyAle3NzaGRfZ2lkfSBzc2hkIDI+L2Rldi9udWxsIHx8IDoKLSV7X3NiaW5kaXJ9L3VzZXJhZGQgLWQgL3Zhci9lbXB0eS9zc2hkIC1zIC9iaW4vZmFsc2UgLXUgJXtzc2hkX3VpZH0gXAotCS1jICJTU0ggRGFlbW9uIHZpcnR1YWwgdXNlciIgLWcgc3NoZCBzc2hkIDI+L2Rldi9udWxsIHx8IDoKLTogIyB0byBwcm90ZWN0IHRoZSBycG0gZGF0YWJhc2UKLQotJVBvc3Qgc2VydmVyCi1pZiBbIC14ICV7TFNCaW5pdH0taW5zdGFsbCBdOyB0aGVuCi0gICV7TFNCaW5pdH0taW5zdGFsbCBzc2hkCi1lbHNlCi0gIGxpc2EgLS1TeXNWLWluaXQgaW5zdGFsbCBzc2hkIFM1NSAyOjM6NDo1IEs0NSAwOjE6NgotZmkKLQotISAle1NWSWRpcn0vc3NoZCBzdGF0dXMgfHwgJXtTVklkaXJ9L3NzaGQgcmVzdGFydAotOiAjIHRvIHByb3RlY3QgdGhlIHJwbSBkYXRhYmFzZQotCi0KLSVQcmVVbiBzZXJ2ZXIKLVsgIiQxIiA9IDAgXSB8fCBleGl0IDAKLSEgJXtTVklkaXJ9L3NzaGQgc3RhdHVzIHx8ICV7U1ZJZGlyfS9zc2hkIHN0b3AKLWlmIFsgLXggJXtMU0Jpbml0fS1yZW1vdmUgXTsgdGhlbgotICAle0xTQmluaXR9LXJlbW92ZSBzc2hkCi1lbHNlCi0gIGxpc2EgLS1TeXNWLWluaXQgcmVtb3ZlIHNzaGQgJDEKLWZpCi06ICMgdG8gcHJvdGVjdCB0aGUgcnBtIGRhdGFiYXNlCi0KLSVGaWxlcyAKLSVkZWZhdHRyKC0scm9vdCxyb290KQotJWRpciAle19zeXNjb25mZGlyfQotJWNvbmZpZyAle19zeXNjb25mZGlyfS9zc2hfY29uZmlnCi0le19iaW5kaXJ9L3NjcAotJXtfYmluZGlyfS9zZnRwCi0le19iaW5kaXJ9L3NzaAotJXtfYmluZGlyfS9zbG9naW4KLSV7X2JpbmRpcn0vc3NoLWFkZAotJWF0dHIoMjc1NSxyb290LG5vYm9keSkgJXtfYmluZGlyfS9zc2gtYWdlbnQKLSV7X2JpbmRpcn0vc3NoLWtleWdlbgotJXtfYmluZGlyfS9zc2gta2V5c2NhbgotJWRpciAle19saWJleGVjZGlyfQotJWF0dHIoNDcxMSxyb290LHJvb3QpICV7X2xpYmV4ZWNkaXJ9L3NzaC1rZXlzaWduCi0le19saWJleGVjZGlyfS9zc2gtcGtjczExLWhlbHBlcgotJXtfc2JpbmRpcn0vc3NoLWhvc3Qta2V5Z2VuCi0lZGlyICV7X2RlZmF1bHRkb2NkaXJ9LyV7bmFtZX0tJXt2ZXJzaW9ufQotJXtfZGVmYXVsdGRvY2Rpcn0vJXtuYW1lfS0le3ZlcnNpb259L0NSRURJVFMKLSV7X2RlZmF1bHRkb2NkaXJ9LyV7bmFtZX0tJXt2ZXJzaW9ufS9DaGFuZ2VMb2cKLSV7X2RlZmF1bHRkb2NkaXJ9LyV7bmFtZX0tJXt2ZXJzaW9ufS9MSUNFTkNFCi0le19kZWZhdWx0ZG9jZGlyfS8le25hbWV9LSV7dmVyc2lvbn0vT1ZFUlZJRVcKLSV7X2RlZmF1bHRkb2NkaXJ9LyV7bmFtZX0tJXt2ZXJzaW9ufS9SRUFETUUqCi0le19kZWZhdWx0ZG9jZGlyfS8le25hbWV9LSV7dmVyc2lvbn0vVE9ETwotJXtfZGVmYXVsdGRvY2Rpcn0vJXtuYW1lfS0le3ZlcnNpb259L2ZhcS5odG1sCi0le19tYW5kaXJ9L21hbjEvKgotJXtfbWFuZGlyfS9tYW44L3NzaC1rZXlzaWduLjguZ3oKLSV7X21hbmRpcn0vbWFuOC9zc2gtcGtjczExLWhlbHBlci44Lmd6Ci0le19tYW5kaXJ9L21hbjUvc3NoX2NvbmZpZy41Lmd6Ci0gCi0lRmlsZXMgc2VydmVyCi0lZGVmYXR0cigtLHJvb3Qscm9vdCkKLSVkaXIgJXtfdmFyfS9lbXB0eS9zc2hkCi0lY29uZmlnICV7U1ZJZGlyfS9zc2hkCi0lY29uZmlnIC9ldGMvcGFtLmQvc3NoZAotJWNvbmZpZyAle19zeXNjb25mZGlyfS9tb2R1bGkKLSVjb25maWcgJXtfc3lzY29uZmRpcn0vc3NoZF9jb25maWcKLSVjb25maWcgJXtTVkljZGlyfS9zc2hkCi0le19saWJleGVjZGlyfS9zZnRwLXNlcnZlcgotJXtfc2JpbmRpcn0vc3NoZAotJXtfbWFuZGlyfS9tYW41L21vZHVsaS41Lmd6Ci0le19tYW5kaXJ9L21hbjUvc3NoZF9jb25maWcuNS5negotJXtfbWFuZGlyfS9tYW44L3NmdHAtc2VydmVyLjguZ3oKLSV7X21hbmRpcn0vbWFuOC9zc2hkLjguZ3oKLSAKLSVGaWxlcyBhc2twYXNzCi0lZGVmYXR0cigtLHJvb3Qscm9vdCkKLSV7X2xpYmV4ZWNkaXJ9L3NzaC1hc2twYXNzCi0le19saWJleGVjZGlyfS94MTEtc3NoLWFza3Bhc3MKLSV7X2RlZmF1bHRkb2NkaXJ9LyV7bmFtZX0tJXt2ZXJzaW9ufS8le2Fza3Bhc3N9Ci0gCi0KLSVDaGFuZ2VMb2cKLSogVHVlIEphbiAxOCAyMDExIFRpbSBSaWNlIDx0aW1AbXVsdGl0YWxlbnRzLm5ldD4KLS0gVXNlIENGTEFHUyBmcm9tIE1ha2VmaWxlIGluc3RlYWQgb2YgUlBNIHNvIGJ1aWxkIGNvbXBsZXRlcy4KLS0gU2lnbmF0dXJlcyB3ZXJlIGNoYW5nZWQgdG8gLmFzYyBzaW5jZSA0LjFwMS4KLQotKiBNb24gSmFuIDAxIDE5OTggLi4uCi1UZW1wbGF0ZSBWZXJzaW9uOiAxLjMxCi0KLSRJZDogb3BlbnNzaC5zcGVjLHYgMS43NS4yLjEgMjAxMS8wOS8wNSAwMDoyODoxMSBkam0gRXhwICQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvY2FsZGVyYS9zc2gtaG9zdC1rZXlnZW4gYi9jb250cmliL2NhbGRlcmEvc3NoLWhvc3Qta2V5Z2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjM4MmRkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvY2FsZGVyYS9zc2gtaG9zdC1rZXlnZW4KKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jISAvYmluL3NoCi0jCi0jICRJZDogc3NoLWhvc3Qta2V5Z2VuLHYgMS4zIDIwMDgvMTEvMDMgMDk6MTY6MDEgZGptIEV4cCAkCi0jCi0jIFRoaXMgc2NyaXB0IGlzIG5vcm1hbGx5IHJ1biBvbmx5ICpvbmNlKiBmb3IgYSBnaXZlbiBob3N0Ci0jIChpbiBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lKSAtLSBvbiB1cGRhdGVzL3VwZ3JhZGVzL3JlY292ZXJ5Ci0jIHRoZSBzc2hfaG9zdF9rZXkqIGZpbGVzIF9zaG91bGRfIGJlIHJldGFpbmVkISBPdGhlcndpc2UgZmFsc2UKLSMgIm1hbi1pbi10aGUtbWlkZGxlLWF0dGFjayIgYWxlcnRzIHdpbGwgZnJpZ2h0ZW4gdW5zdXNwZWN0aW5nCi0jIGNsaWVudHMuLi4KLQota2V5ZGlyPUBzeXNjb25mZGlyQAota2V5Z2VuPUBzc2hrZXlnZW5ACi0KLWlmIFsgLWYgJGtleWRpci9zc2hfaG9zdF9rZXkgLW8gXAotCSAgICAgLWYgJGtleWRpci9zc2hfaG9zdF9rZXkucHViIF07IHRoZW4KLSAgZWNobyAiWW91IGFscmVhZHkgaGF2ZSBhbiBTU0gxIFJTQSBob3N0IGtleSBpbiAka2V5ZGlyL3NzaF9ob3N0X2tleS4iCi1lbHNlCi0gIGVjaG8gIkdlbmVyYXRpbmcgU1NIMSBSU0EgaG9zdCBrZXkuIgotICAka2V5Z2VuIC10IHJzYTEgLWYgJGtleWRpci9zc2hfaG9zdF9rZXkgLUMgJycgLU4gJycKLWZpCi0KLWlmIFsgLWYgJGtleWRpci9zc2hfaG9zdF9yc2Ffa2V5IC1vIFwKLQkgICAgIC1mICRrZXlkaXIvc3NoX2hvc3RfcnNhX2tleS5wdWIgXTsgdGhlbgotICBlY2hvICJZb3UgYWxyZWFkeSBoYXZlIGFuIFNTSDIgUlNBIGhvc3Qga2V5IGluICRrZXlkaXIvc3NoX2hvc3RfcnNhX2tleS4iCi1lbHNlCi0gIGVjaG8gIkdlbmVyYXRpbmcgU1NIMiBSU0EgaG9zdCBrZXkuIgotICAka2V5Z2VuIC10IHJzYSAtZiAka2V5ZGlyL3NzaF9ob3N0X3JzYV9rZXkgLUMgJycgLU4gJycKLWZpCi0KLWlmIFsgLWYgJGtleWRpci9zc2hfaG9zdF9kc2Ffa2V5IC1vIFwKLQkgICAgIC1mICRrZXlkaXIvc3NoX2hvc3RfZHNhX2tleS5wdWIgXTsgdGhlbgotICBlY2hvICJZb3UgYWxyZWFkeSBoYXZlIGFuIFNTSDIgRFNBIGhvc3Qga2V5IGluICRrZXlkaXIvc3NoX2hvc3RfZHNhX2tleS4iCi1lbHNlCi0gIGVjaG8gIkdlbmVyYXRpbmcgU1NIMiBEU0EgaG9zdCBrZXkuIgotICAka2V5Z2VuIC10IGRzYSAtZiAka2V5ZGlyL3NzaF9ob3N0X2RzYV9rZXkgLUMgJycgLU4gJycKLWZpCmRpZmYgLS1naXQgYS9jb250cmliL2NhbGRlcmEvc3NoZC5pbml0IGIvY29udHJpYi9jYWxkZXJhL3NzaGQuaW5pdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTgzMTQ2Zi4uMDAwMDAwMAotLS0gYS9jb250cmliL2NhbGRlcmEvc3NoZC5pbml0CisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIwotIyAkSWQ6IHNzaGQuaW5pdCx2IDEuNCAyMDAzLzExLzIxIDEyOjQ4OjU3IGRqbSBFeHAgJAotIwotIyMjIEJFR0lOIElOSVQgSU5GTwotIyBQcm92aWRlczoKLSMgUmVxdWlyZWQtU3RhcnQ6ICRuZXR3b3JrCi0jIFJlcXVpcmVkLVN0b3A6Ci0jIERlZmF1bHQtU3RhcnQ6ICAzIDQgNQotIyBEZWZhdWx0LVN0b3A6ICAgMCAxIDIgNgotIyBEZXNjcmlwdGlvbjogc3NoZAotIyAgICAgICAgICAgICAgICBCcmluZyB1cC9kb3duIHRoZSBPcGVuU1NIIHNlY3VyZSBzaGVsbCBkYWVtb24uCi0jIyMgRU5EIElOSVQgSU5GTwotIwotIyBXcml0dGVuIGJ5IE1pcXVlbCB2YW4gU21vb3JlbmJ1cmcgPG1pcXVlbHNAZHJpbmtlbC5vdy5vcmc+LgotIyBNb2RpZmllZCBmb3IgRGViaWFuIEdOVS9MaW51eCBieSBJYW4gTXVyZG9jayA8aW11cmRvY2tAZ251LmFpLm1pdC5lZHU+LgotIyBNb2RpZmllZCBmb3IgT3BlbkxpbnV4IGJ5IFJheW11bmQgV2lsbCA8cmF5QGNhbGRlcmEuZGU+Ci0KLU5BTUU9c3NoZAotREFFTU9OPS91c3Ivc2Jpbi8kTkFNRQotIyBIYWNrLUFsZXJ0KFRNKSEgIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGdldCBhcm91bmQgdGhlICdyZWxvYWQnLXByb2JsZW0KLSMgY3JlYXRlZCBieSByZWNlbnQgT3BlblNTSCBkYWVtb24vc3NkIGNvbWJpbmF0aW9ucy4gU2VlIENhbGRlcmEgaW50ZXJuYWwKLSMgUFIgW2xpbnV4LzgyNzhdIGZvciBkZXRhaWxzLi4uCi1QSURGPS92YXIvcnVuLyROQU1FLnBpZAotTkFNRT0kREFFTU9OCi0KLV9zdGF0dXMoKSB7Ci0gIFsgLXogIiQxIiBdIHx8IGxvY2FsIHBpZGY9IiQxIgotICBsb2NhbCByZXQ9LTEKLSAgbG9jYWwgcGlkCi0gIGlmIFsgLW4gIiRwaWRmIiBdICYmIFsgIC1yICIkcGlkZiIgXTsgdGhlbgotICAgIHBpZD0kKGhlYWQgLTEgJHBpZGYpCi0gIGVsc2UKLSAgICBwaWQ9JChwaWRvZiAkTkFNRSkKLSAgZmkKLQotICBpZiBbICEgLWUgJFNWSWxvY2sgXTsgdGhlbgotICAgICMgbm8gbG9jay1maWxlID0+IG5vdCBzdGFydGVkID09IHN0b3BwZWQ/Ci0gICAgcmV0PTMKLSAgZWxpZiBbIC1uICIkcGlkZiIgLWEgISAtZiAiJHBpZGYiIF0gfHwgWyAteiAiJHBpZCIgXTsgdGhlbgotICAgICMgcGlkLWZpbGUgZ2l2ZW4gYnV0IG5vdCBwcmVzZW50IG9yIG5vIHBpZCA9PiBkaWVkLCBidXQgd2FzIG5vdCBzdG9wcGVkCi0gICAgcmV0PTIKLSAgZWxpZiBbIC1yIC9wcm9jLyRwaWQvY21kbGluZSBdICYmCi0gICAgICAgZWNobyAtbmUgJE5BTUUnXDAwMCcgfCBjbXAgLXMgLSAvcHJvYy8kcGlkL2NtZGxpbmU7IHRoZW4KLSAgICAjIHBpZC1maWxlIGdpdmVuIGFuZCBwcmVzZW50IG9yIHBpZCBmb3VuZCA9PiBjaGVjayBwcm9jZXNzLi4uCi0gICAgIyBidXQgZG9uJ3QgY29tcGFyZSBleGUsIGFzIHRoaXMgd2lsbCBmYWlsIGFmdGVyIGFuIHVwZGF0ZSEKLSAgICAjIGNvbXBhcmVzIE9LID0+IGFsbCdzIHdlbGwsIHRoYXQgZW5kcyB3ZWxsLi4uCi0gICAgcmV0PTAKLSAgZWxzZQotICAgICMgbm8gc3VjaCBwcm9jZXNzIG9yIGV4ZSBkb2VzIG5vdCBtYXRjaCA9PiBzdGFsZSBwaWQtZmlsZSBvciBwcm9jZXNzIGRpZWQKLSAgICAjICAganVzdCByZWNlbnRseS4uLgotICAgIHJldD0xCi0gIGZpCi0gIHJldHVybiAkcmV0Ci19Ci0KLSMgU291cmNlIGZ1bmN0aW9uIGxpYnJhcnkgKGFuZCBzZXQgdml0YWwgdmFyaWFibGVzKS4KLS4gQFNWSWRpckAvZnVuY3Rpb25zCi0KLWNhc2UgIiQxIiBpbgotIHN0YXJ0KQotICBbICEgLWUgJFNWSWxvY2sgXSB8fCBleGl0IDAKLSAgWyAteCAkREFFTU9OIF0gfHwgZXhpdCA1Ci0gIFNWSWVtcHR5Q29uZmlnIEBzeXNjb25mZGlyQC9zc2hkX2NvbmZpZyAmJiBleGl0IDYKLQotICBpZiBbICEgXCggLWYgQHN5c2NvbmZkaXJAL3NzaF9ob3N0X2tleSAtYSAgICAgICAgICAgIFwKLQkgICAgLWYgQHN5c2NvbmZkaXJAL3NzaF9ob3N0X2tleS5wdWIgXCkgLWEgICAgIFwKLSAgICAgICAhIFwoIC1mIEBzeXNjb25mZGlyQC9zc2hfaG9zdF9yc2Ffa2V5IC1hICAgICAgICBcCi0JICAgIC1mIEBzeXNjb25mZGlyQC9zc2hfaG9zdF9yc2Ffa2V5LnB1YiBcKSAtYSBcCi0gICAgICAgISBcKCAtZiBAc3lzY29uZmRpckAvc3NoX2hvc3RfZHNhX2tleSAtYSAgICAgICAgXAotCSAgICAtZiBAc3lzY29uZmRpckAvc3NoX2hvc3RfZHNhX2tleS5wdWIgXCkgXTsgdGhlbgotCi0gICAgZWNobyAiJFNWSXN1YnN5czogaG9zdCBrZXkgbm90IGluaXRpYWxpemVkOiBza2lwcGVkISIKLSAgICBlY2hvICIkU1ZJc3Vic3lzOiB1c2Ugc3NoLWhvc3Qta2V5Z2VuIHRvIGdlbmVyYXRlIG9uZSEiCi0gICAgZXhpdCA2Ci0gIGZpCi0KLSAgZWNobyAtbiAiU3RhcnRpbmcgJFNWSXN1YnN5cyBzZXJ2aWNlczogIgotICBzc2QgLVMgLXggJERBRU1PTiAtbiAkTkFNRSAtLSAkT1BUSU9OUwotICByZXQ9JD8KLQotICBlY2hvICAiLiIKLSAgdG91Y2ggJFNWSWxvY2sKLSAgOzsKLQotIHN0b3ApCi0gIFsgLWUgJFNWSWxvY2sgXSB8fCBleGl0IDAKLQotICBlY2hvIC1uICJTdG9wcGluZyAkU1ZJc3Vic3lzIHNlcnZpY2VzOiAiCi0gIHNzZCAtSyAtcCAkUElERiAtbiAkTkFNRQotICByZXQ9JD8KLQotICBlY2hvICIuIgotICBybSAtZiAkU1ZJbG9jawotICA7OwotCi0gZm9yY2UtcmVsb2FkfHJlbG9hZCkKLSAgWyAtZSAkU1ZJbG9jayBdIHx8IGV4aXQgMAotCi0gIGVjaG8gIlJlbG9hZGluZyAkU1ZJc3Vic3lzIGNvbmZpZ3VyYXRpb24gZmlsZXM6ICIKLSAgc3NkIC1LIC0tc2lnbmFsIDEgLXEgLXAgJFBJREYgLW4gJE5BTUUKLSAgcmV0PSQ/Ci0gIGVjaG8gImRvbmUuIgotICA7OwotCi0gcmVzdGFydCkKLSAgJDAgc3RvcAotICAkMCBzdGFydAotICByZXQ9JD8KLSAgOzsKLQotIHN0YXR1cykKLSAgX3N0YXR1cyAkUElERgotICByZXQ9JD8KLSAgOzsKLQotICopCi0gIGVjaG8gIlVzYWdlOiAkU1ZJc2NyaXB0IHtbcmVdc3RhcnR8c3RvcHxbZm9yY2UtXXJlbG9hZHxzdGF0dXN9IgotICByZXQ9MgotICA7OwotCi1lc2FjCi0KLWV4aXQgJHJldAotCmRpZmYgLS1naXQgYS9jb250cmliL2NhbGRlcmEvc3NoZC5wYW0gYi9jb250cmliL2NhbGRlcmEvc3NoZC5wYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNTBhOWEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9jYWxkZXJhL3NzaGQucGFtCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jJVBBTS0xLjAKLWF1dGggICAgICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX3B3ZGIuc28gc2hhZG93IG5vZGVsYXkKLWFjY291bnQgICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX25vbG9naW4uc28KLWFjY291bnQgICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX3B3ZGIuc28KLXBhc3N3b3JkICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX2NyYWNrbGliLnNvCi1wYXNzd29yZCAgIHJlcXVpcmVkICAgICAvbGliL3NlY3VyaXR5L3BhbV9wd2RiLnNvIHNoYWRvdyBudWxsb2sgdXNlX2F1dGh0b2sKLXNlc3Npb24gICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX3B3ZGIuc28KLXNlc3Npb24gICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX2xpbWl0cy5zbwpkaWZmIC0tZ2l0IGEvY29udHJpYi9jeWd3aW4vTWFrZWZpbGUgYi9jb250cmliL2N5Z3dpbi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM4NTdmMi4uMDAwMDAwMAotLS0gYS9jb250cmliL2N5Z3dpbi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLXNyY2Rpcj0uLi8uLgotY29weWlkc3JjZGlyPS4uCi1wcmVmaXg9L3VzcgotZXhlY19wcmVmaXg9JChwcmVmaXgpCi1iaW5kaXI9JChwcmVmaXgpL2JpbgotZGF0YWRpcj0kKHByZWZpeCkvc2hhcmUKLW1hbmRpcj0kKGRhdGFkaXIpL21hbgotZG9jZGlyPSQoZGF0YWRpcikvZG9jCi1zc2hkb2NkaXI9JChkb2NkaXIpL29wZW5zc2gKLWN5Z2RvY2Rpcj0kKGRvY2RpcikvQ3lnd2luCi1zeXNjb25mZGlyPS9ldGMKLWRlZmF1bHRzZGlyPSQoc3lzY29uZmRpcikvZGVmYXVsdHMvZXRjCi1pbmV0ZGVmZGlyPSQoZGVmYXVsdHNkaXIpL2luZXRkLmQKLVBSSVZTRVBfUEFUSD0vdmFyL2VtcHR5Ci1JTlNUQUxMPS91c3IvYmluL2luc3RhbGwgLWMKLQotREVTVERJUj0KLQotYWxsOgotCUBlY2hvCi0JQGVjaG8gIlVzZSBcYG1ha2UgY3lnd2luLXBvc3RpbnN0YWxsIERFU1RESVI9W3BhY2thZ2UgZGlyZWN0b3J5XSciCi0JQGVjaG8gIkJlIHN1cmUgaGF2aW5nIERFU1RESVIgc2V0IGNvcnJlY3RseSEiCi0JQGVjaG8KLQotbW92ZS1jb25maWctZmlsZXM6ICQoREVTVERJUikkKHN5c2NvbmZkaXIpL3NzaF9jb25maWcgJChERVNURElSKSQoc3lzY29uZmRpcikvc3NoZF9jb25maWcKLQkkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKERFU1RESVIpJChkZWZhdWx0c2RpcikKLQltdiAkKERFU1RESVIpJChzeXNjb25mZGlyKS9zc2hfY29uZmlnICQoREVTVERJUikkKGRlZmF1bHRzZGlyKQotCW12ICQoREVTVERJUikkKHN5c2NvbmZkaXIpL3NzaGRfY29uZmlnICQoREVTVERJUikkKGRlZmF1bHRzZGlyKQotCi1yZW1vdmUtZW1wdHktZGlyOgotCXJtIC1yZiAkKERFU1RESVIpJChQUklWU0VQX1BBVEgpCi0KLWluc3RhbGwtaW5ldGQtY29uZmlnOgotCSQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKGluZXRkZWZkaXIpCi0JJChJTlNUQUxMKSAtbSA2NDQgc3NoZC1pbmV0ZCAgJChERVNURElSKSQoaW5ldGRlZmRpcikvc3NoZC1pbmV0ZAotCi1pbnN0YWxsLXNzaGRvYzoKLQkkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKERFU1RESVIpJChzc2hkb2NkaXIpCi0JJChJTlNUQUxMKSAtbSA2NDQgJChzcmNkaXIpL0NSRURJVFMgJChERVNURElSKSQoc3NoZG9jZGlyKS9DUkVESVRTCi0JJChJTlNUQUxMKSAtbSA2NDQgJChzcmNkaXIpL0NoYW5nZUxvZyAkKERFU1RESVIpJChzc2hkb2NkaXIpL0NoYW5nZUxvZwotCSQoSU5TVEFMTCkgLW0gNjQ0ICQoc3JjZGlyKS9MSUNFTkNFICQoREVTVERJUikkKHNzaGRvY2RpcikvTElDRU5DRQotCSQoSU5TVEFMTCkgLW0gNjQ0ICQoc3JjZGlyKS9PVkVSVklFVyAkKERFU1RESVIpJChzc2hkb2NkaXIpL09WRVJWSUVXCi0JJChJTlNUQUxMKSAtbSA2NDQgJChzcmNkaXIpL1BST1RPQ09MICQoREVTVERJUikkKHNzaGRvY2RpcikvUFJPVE9DT0wKLQkkKElOU1RBTEwpIC1tIDY0NCAkKHNyY2RpcikvUFJPVE9DT0wuYWdlbnQgJChERVNURElSKSQoc3NoZG9jZGlyKS9QUk9UT0NPTC5hZ2VudAotCSQoSU5TVEFMTCkgLW0gNjQ0ICQoc3JjZGlyKS9QUk9UT0NPTC5jZXJ0a2V5cyAkKERFU1RESVIpJChzc2hkb2NkaXIpL1BST1RPQ09MLmNlcnRrZXlzCi0JJChJTlNUQUxMKSAtbSA2NDQgJChzcmNkaXIpL1BST1RPQ09MLm11eCAkKERFU1RESVIpJChzc2hkb2NkaXIpL1BST1RPQ09MLm11eAotCSQoSU5TVEFMTCkgLW0gNjQ0ICQoc3JjZGlyKS9SRUFETUUgJChERVNURElSKSQoc3NoZG9jZGlyKS9SRUFETUUKLQkkKElOU1RBTEwpIC1tIDY0NCAkKHNyY2RpcikvUkVBRE1FLmRucyAkKERFU1RESVIpJChzc2hkb2NkaXIpL1JFQURNRS5kbnMKLQkkKElOU1RBTEwpIC1tIDY0NCAkKHNyY2RpcikvUkVBRE1FLnBsYXRmb3JtICQoREVTVERJUikkKHNzaGRvY2RpcikvUkVBRE1FLnBsYXRmb3JtCi0JJChJTlNUQUxMKSAtbSA2NDQgJChzcmNkaXIpL1JFQURNRS5wcml2c2VwICQoREVTVERJUikkKHNzaGRvY2RpcikvUkVBRE1FLnByaXZzZXAKLQkkKElOU1RBTEwpIC1tIDY0NCAkKHNyY2RpcikvUkVBRE1FLnR1biAkKERFU1RESVIpJChzc2hkb2NkaXIpL1JFQURNRS50dW4KLQkkKElOU1RBTEwpIC1tIDY0NCAkKHNyY2RpcikvVE9ETyAkKERFU1RESVIpJChzc2hkb2NkaXIpL1RPRE8KLQkkKElOU1RBTEwpIC1tIDY0NCAkKHNyY2RpcikvV0FSTklORy5STkcgJChERVNURElSKSQoc3NoZG9jZGlyKS9XQVJOSU5HLlJORwotCi1pbnN0YWxsLWN5Z3dpbmRvYzogUkVBRE1FCi0JJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChERVNURElSKSQoY3lnZG9jZGlyKQotCSQoSU5TVEFMTCkgLW0gNjQ0IFJFQURNRSAkKERFU1RESVIpJChjeWdkb2NkaXIpL29wZW5zc2guUkVBRE1FCi0KLWluc3RhbGwtZG9jOiBpbnN0YWxsLXNzaGRvYyBpbnN0YWxsLWN5Z3dpbmRvYwotCi1pbnN0YWxsLXNjcmlwdHM6IHNzaC1ob3N0LWNvbmZpZyBzc2gtdXNlci1jb25maWcKLQkkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKERFU1RESVIpJChiaW5kaXIpCi0JJChJTlNUQUxMKSAtbSA3NTUgc3NoLWhvc3QtY29uZmlnICQoREVTVERJUikkKGJpbmRpcikvc3NoLWhvc3QtY29uZmlnCi0JJChJTlNUQUxMKSAtbSA3NTUgc3NoLXVzZXItY29uZmlnICQoREVTVERJUikkKGJpbmRpcikvc3NoLXVzZXItY29uZmlnCi0KLWluc3RhbGwtY29weS1pZDogJChjb3B5aWRzcmNkaXIpL3NzaC1jb3B5LWlkICQoY29weWlkc3JjZGlyKS9zc2gtY29weS1pZC4xCi0JJChJTlNUQUxMKSAtbSA3NTUgJChjb3B5aWRzcmNkaXIpL3NzaC1jb3B5LWlkICQoREVTVERJUikkKGJpbmRpcikvc3NoLWNvcHktaWQKLQkkKElOU1RBTEwpIC1tIDY0NCAkKGNvcHlpZHNyY2Rpcikvc3NoLWNvcHktaWQuMSAkKERFU1RESVIpJChtYW5kaXIpL21hbjEvc3NoLWNvcHktaWQuMQotCi1nemlwLW1hbi1wYWdlczoKLQlybSAkKERFU1RESVIpJChtYW5kaXIpL21hbjEvc2xvZ2luLjEKLQlnemlwICQoREVTVERJUikkKG1hbmRpcikvbWFuMS8qLjEKLQlnemlwICQoREVTVERJUikkKG1hbmRpcikvbWFuNS8qLjUKLQlnemlwICQoREVTVERJUikkKG1hbmRpcikvbWFuOC8qLjgKLQljZCAkKERFU1RESVIpJChtYW5kaXIpL21hbjEgJiYgbG4gLXMgc3NoLjEuZ3ogc2xvZ2luLjEuZ3oKLQotY3lnd2luLXBvc3RpbnN0YWxsOiBtb3ZlLWNvbmZpZy1maWxlcyByZW1vdmUtZW1wdHktZGlyIGluc3RhbGwtaW5ldGQtY29uZmlnIGluc3RhbGwtZG9jIGluc3RhbGwtc2NyaXB0cyBpbnN0YWxsLWNvcHktaWQgZ3ppcC1tYW4tcGFnZXMKLQlAZWNobyAiQ3lnd2luIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmluaXNoZWQuIgpkaWZmIC0tZ2l0IGEvY29udHJpYi9jeWd3aW4vUkVBRE1FIGIvY29udHJpYi9jeWd3aW4vUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjkxMWU5Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvY3lnd2luL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi1UaGlzIHBhY2thZ2UgZGVzY3JpYmVzIGltcG9ydGFudCBDeWd3aW4gc3BlY2lmaWMgc3R1ZmYgY29uY2VybmluZyBPcGVuU1NILgotCi1UaGUgYmluYXJ5IHBhY2thZ2UgaXMgdXN1YWxseSBidWlsdCBmb3IgcmVjZW50IEN5Z3dpbiB2ZXJzaW9ucyBhbmQgbWlnaHQKLW5vdCBydW4gb24gb2xkZXIgdmVyc2lvbnMuICBQbGVhc2UgY2hlY2sgaHR0cDovL2N5Z3dpbi5jb20vIGZvciBpbmZvcm1hdGlvbgotYWJvdXQgY3VycmVudCBDeWd3aW4gcmVsZWFzZXMuCi0KLUJ1aWxkIGluc3RydWN0aW9ucyBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1JbXBvcnRhbnQgY2hhbmdlIHNpbmNlIDMuNy4xcDItMjoKLQotVGhlIHNzaC1ob3N0LWNvbmZpZyBmaWxlIGRvZXNuJ3QgY3JlYXRlIHRoZSAvZXRjL3NzaF9jb25maWcgYW5kCi0vZXRjL3NzaGRfY29uZmlnIGZpbGVzIGZyb20gYnVpbHRpbiBoZXJlLXNjcmlwdHMgYW55bW9yZSwgYnV0IGl0IHVzZXMKLXNrZWxldG9uIGZpbGVzIGluc3RhbGxlZCBpbiAvZXRjL2RlZmF1bHRzL2V0Yy4KLQotQWxzbyBpdCBub3cgdHJpZXMgaGFyZCB0byBjcmVhdGUgYXBwcm9wcmlhdGUgcGVybWlzc2lvbnMgb24gZmlsZXMuCi1TYW1lIGFwcGxpZXMgZm9yIHNzaC11c2VyLWNvbmZpZy4KLQotQWZ0ZXIgY3JlYXRpbmcgdGhlIHNzaGQgc2VydmljZSB3aXRoIHNzaC1ob3N0LWNvbmZpZywgaXQncyBhZHZpc2FibGUgdG8KLWNhbGwgc3NoLXVzZXItY29uZmlnIGZvciBhbGwgYWZmZWN0ZWQgdXNlcnMsIGFsc28gYWxyZWFkeSBleGlzaW5nIHVzZXIKLWNvbmZpZ3VyYXRpb25zLiAgSW4gdGhlIGxhdHRlciBjYXNlLCBmaWxlIGFuZCBkaXJlY3RvcnkgcGVybWlzc2lvbnMgYXJlCi1jaGVja2VkIGFuZCBjaGFuZ2VkLCBpZiByZXF1aXJlZWQgdG8gbWF0Y2ggdGhlIGhvc3QgY29uZmlndXJhdGlvbi4KLQotSW1wb3J0YW50IG5vdGUgZm9yIFdpbmRvd3MgMjAwMyBTZXJ2ZXIgdXNlcnM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotMjAwMyBTZXJ2ZXIgaGFzIGEgZnVubnkgbmV3IGZlYXR1cmUuICBXaGVuIHN0YXJ0aW5nIHNlcnZpY2VzIHVuZGVyIFNZU1RFTQotYWNjb3VudCwgdGhlc2Ugc2VydmljZXMgaGF2ZSBuZWFybHkgYWxsIHVzZXIgcmlnaHRzIHdoaWNoIFNZU1RFTSBob2xkcy4uLgotZXhjZXB0IGZvciB0aGUgIkNyZWF0ZSBhIHRva2VuIG9iamVjdCIgcmlnaHQsIHdoaWNoIGlzIG5lZWRlZCB0byBhbGxvdwotcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiA6LSgKLQotVGhlcmUncyBubyB3YXkgYXJvdW5kIHRoaXMsIGV4Y2VwdCBmb3IgY3JlYXRpbmcgYSBzdWJzdGl0dXRlIGFjY291bnQgd2hpY2gKLWhhcyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlcy4gIEJhc2ljYWxseSwgdGhpcyBhY2NvdW50IHNob3VsZCBiZSBtZW1iZXIKLW9mIHRoZSBhZG1pbmlzdHJhdG9ycyBncm91cCwgcGx1cyBpdCBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHVzZXIgcmlnaHRzOgotCi0JQ3JlYXRlIGEgdG9rZW4gb2JqZWN0Ci0JTG9nb24gYXMgYSBzZXJ2aWNlCi0JUmVwbGFjZSBhIHByb2Nlc3MgbGV2ZWwgdG9rZW4KLQlJbmNyZWFzZSBRdW90YQotCi1UaGUgc3NoLWhvc3QtY29uZmlnIHNjcmlwdCBhc2tzIHlvdSwgaWYgaXQgc2hvdWxkIGNyZWF0ZSBzdWNoIGFuIGFjY291bnQsCi1jYWxsZWQgInNzaGRfc2VydmVyIi4gIElmIHlvdSBzYXkgIm5vIiBoZXJlLCB5b3UncmUgb24geW91ciBvd24uICBQbGVhc2UKLWZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb24gaW4gc3NoLWhvc3QtY29uZmlnIGV4YWN0bHkgaWYgcG9zc2libGUuICBOb3RlIHRoYXQKLXNzaC11c2VyLWNvbmZpZyBzZXRzIHRoZSBwZXJtaXNzaW9ucyBvbiAyMDAzIFNlcnZlciBtYWNoaW5lcyBkZXBlbmRlbnQgb2YKLXdoZXRoZXIgYSBzc2hkX3NlcnZlciBhY2NvdW50IGV4aXN0cyBvciBub3QuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1JbXBvcnRhbnQgY2hhbmdlIHNpbmNlIDMuNHAxLTI6Ci0KLVRoaXMgdmVyc2lvbiBhZGRzIHByaXZpbGVnZSBzZXBhcmF0aW9uIGFzIGRlZmF1bHQgc2V0dGluZywgc2VlCi0vdXNyL2RvYy9vcGVuc3NoL1JFQURNRS5wcml2c2VwLiAgQWNjb3JkaW5nIHRvIHRoYXQgZG9jdW1lbnQgdGhlCi1wcml2c2VwIGZlYXR1cmUgcmVxdWlyZXMgYSBub24tcHJpdmlsZWdlZCBhY2NvdW50IGNhbGxlZCAnc3NoZCcuCi0KLVRoZSBuZXcgc3NoLWhvc3QtY29uZmlnIGZpbGUgd2hpY2ggaXMgcGFydCBvZiB0aGlzIHZlcnNpb24gYXNrcwotdG8gY3JlYXRlICdzc2hkJyBhcyBsb2NhbCB1c2VyIGlmIHlvdSB3YW50IHRvIHVzZSBwcml2aWxlZ2UKLXNlcGFyYXRpb24uICBJZiB5b3UgY29uZmlybSwgaXQgY3JlYXRlcyB0aGF0IE5UIHVzZXIgYW5kIGFkZHMKLXRoZSBuZWNlc3NhcnkgZW50cnkgdG8gL2V0Yy9wYXNzd2QuCi0KLU9uIDl4L01lIHN5c3RlbXMgdGhlIHNjcmlwdCBqdXN0IHNldHMgVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiB0byAibm8iCi1zaW5jZSB0aGF0IGZlYXR1cmUgZG9lc24ndCBtYWtlIGFueSBzZW5zZSBvbiBhIHN5c3RlbSB3aGljaCBkb2Vzbid0Ci1kaWZmZXIgYmV0d2VlbiBwcml2aWxlZ2VkIGFuZCB1bnByaXZpbGVnZWQgdXNlcnMuCi0KLVRoZSBuZXcgc3NoLWhvc3QtY29uZmlnIHNjcmlwdCBhbHNvIGFkZHMgdGhlIC92YXIvZW1wdHkgZGlyZWN0b3J5Ci1uZWVkZWQgYnkgcHJpdmlsZWdlIHNlcGFyYXRpb24uICBXaGVuIGNyZWF0aW5nIHRoZSAvdmFyL2VtcHR5IGRpcmVjdG9yeQotYnkgeW91cnNlbGYsIHBsZWFzZSBub3RlIHRoYXQgaW4gY29udHJhc3QgdG8gdGhlIFJFQURNRS5wcml2c2VwIGRvY3VtZW50Ci10aGUgb3duZXIgc3Nob3VsZCBub3QgYmUgInJvb3QiIGJ1dCB0aGUgdXNlciB3aGljaCBpcyBydW5uaW5nIHNzaGQuICBTbywKLWluIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIHRoaXMgaXMgU1lTVEVNLiAgVGhlIHNzaC1ob3N0LWNvbmZpZyBzY3JpcHQKLWNob3ducyAvdmFyL2VtcHR5IGFjY29yZGluZ2x5LgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotSW1wb3J0YW50IGNoYW5nZSBzaW5jZSAzLjAuMXAxLTI6Ci0KLVRoaXMgdmVyc2lvbiBpbnRyb2R1Y2VzIHRoZSBhYmlsaXR5IHRvIHJlZ2lzdGVyIHNzaGQgYXMgc2VydmljZSBvbgotV2luZG93cyA5eC9NZSBzeXN0ZW1zLiAgVGhpcyBpcyBkb25lIG9ubHkgd2hlbiB0aGUgb3B0aW9ucyAtRCBhbmQvb3IKLS1kIGFyZSBub3QgZ2l2ZW4uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1JbXBvcnRhbnQgY2hhbmdlIHNpbmNlIDIuOXAyOgotCi1TaW5jZSBDeWd3aW4gaXMgYWJsZSB0byBzd2l0Y2ggdXNlciBjb250ZXh0IHdpdGhvdXQgcGFzc3dvcmQgYmVnaW5uaW5nCi13aXRoIHZlcnNpb24gMS4zLjIsIE9wZW5TU0ggbm93IGFsbG93cyB0byBkbyBzbyB3aGVuIGl0J3MgcnVubmluZyB1bmRlcgotYSB2ZXJzaW9uID49IDEuMy4yLiBLZWVwIGluIG1pbmQgdGhhdCBgbnRzZWMnIGhhcyB0byBiZSBhY3RpdmF0ZWQgdG8KLWFsbG93IHRoYXQgZmVhdHVyZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUltcG9ydGFudCBjaGFuZ2Ugc2luY2UgMi4zLjBwMToKLQotV2hlbiB1c2luZyBgbnRlYScgb3IgYG50c2VjJyB5b3Ugbm93IGhhdmUgdG8gY2FyZSBmb3IgdGhlIG93bmVyc2hpcAotYW5kIHBlcm1pc3Npb24gYml0cyBvZiB5b3VyIGhvc3Qga2V5IGZpbGVzIGFuZCB5b3VyIHByaXZhdGUga2V5IGZpbGVzLgotVGhlIGhvc3Qga2V5IGZpbGVzIGhhdmUgdG8gYmUgb3duZWQgYnkgdGhlIE5UIGFjY291bnQgd2hpY2ggc3RhcnRzCi1zc2hkLiBUaGUgdXNlciBrZXkgZmlsZXMgaGF2ZSB0byBiZSBvd25lZCBieSB0aGUgdXNlci4gVGhlIHBlcm1pc3Npb24KLWJpdHMgb2YgdGhlIHByaXZhdGUga2V5IGZpbGVzIChob3N0IGFuZCB1c2VyKSBoYXZlIHRvIGJlIGF0IGxlYXN0Ci1ydy0tLS0tLS0gKDA2MDApIQotCi1Ob3RlIHRoYXQgdGhpcyBpcyBmb3JjZWQgdW5kZXIgYG50c2VjJyBvbmx5IGlmIHRoZSBmaWxlcyBhcmUgb24gYSBOVEZTCi1maWxlc3lzdGVtICh3aGljaCBpcyByZWNvbW1lbmRlZCkgZHVlIHRvIHRoZSBsYWNrIG9mIGFueSBiYXNpYyBzZWN1cml0eQotZmVhdHVyZXMgb2YgdGhlIEZBVC9GQVQzMiBmaWxlc3lzdGVtcy4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JZiB5b3UgYXJlIGluc3RhbGxpbmcgT3BlblNTSCB0aGUgZmlyc3QgdGltZSwgeW91IGNhbiBnZW5lcmF0ZSBnbG9iYWwgY29uZmlnCi1maWxlcyBhbmQgc2VydmVyIGtleXMgYnkgcnVubmluZwotCi0gICAvdXNyL2Jpbi9zc2gtaG9zdC1jb25maWcKLQotTm90ZSB0aGF0IHRoaXMgYmluYXJ5IGFyY2hpdmUgZG9lc24ndCBjb250YWluIGRlZmF1bHQgY29uZmlnIGZpbGVzIGluIC9ldGMuCi1UaGF0IGZpbGVzIGFyZSBvbmx5IGNyZWF0ZWQgaWYgc3NoLWhvc3QtY29uZmlnIGlzIHN0YXJ0ZWQuCi0KLUlmIHlvdSBhcmUgdXBkYXRpbmcgeW91ciBpbnN0YWxsYXRpb24geW91IG1heSBydW4gdGhlIGFib3ZlIHNzaC1ob3N0LWNvbmZpZwotYXMgd2VsbCB0byBtb3ZlIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlcyB0byB0aGUgbmV3IGxvY2F0aW9uIGFuZCB0bwotZXJhc2UgdGhlIGZpbGVzIGF0IHRoZSBvbGQgbG9jYXRpb24uCi0KLVRvIHN1cHBvcnQgdGVzdGluZyBhbmQgdW5hdHRlbmRlZCBpbnN0YWxsYXRpb24gc3NoLWhvc3QtY29uZmlnIGdvdAotc29tZSBvcHRpb25zOgotCi11c2FnZTogc3NoLWhvc3QtY29uZmlnIFtPUFRJT05dLi4uCi1PcHRpb25zOgotICAgIC0tZGVidWcgIC1kICAgICAgICAgICAgRW5hYmxlIHNoZWxsJ3MgZGVidWcgb3V0cHV0LgotICAgIC0teWVzICAgIC15ICAgICAgICAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCAieWVzIiBhdXRvbWF0aWNhbGx5LgotICAgIC0tbm8gICAgIC1uICAgICAgICAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCAibm8iIGF1dG9tYXRpY2FsbHkuCi0gICAgLS1jeWd3aW4gLWMgPG9wdGlvbnM+ICBVc2UgIm9wdGlvbnMiIGFzIHZhbHVlIGZvciBDWUdXSU4gZW52aXJvbm1lbnQgdmFyLgotICAgIC0tcG9ydCAgIC1wIDxuPiAgICAgICAgc3NoZCBsaXN0ZW5zIG9uIHBvcnQgbi4KLSAgICAtLXB3ZCAgICAtdyA8cGFzc3dkPiAgIFVzZSAicHdkIiBhcyBwYXNzd29yZCBmb3IgdXNlciAnc3NoZF9zZXJ2ZXInLgotCi1BZGRpdGlvbmFsbHkgc3NoLWhvc3QtY29uZmlnIG5vdyBhc2tzIGlmIGl0IHNob3VsZCBpbnN0YWxsIHNzaGQgYXMgYQotc2VydmljZSB3aGVuIHJ1bm5pbmcgdW5kZXIgTlQvVzJLLiBUaGlzIHJlcXVpcmVzIGN5Z3J1bnNydiBpbnN0YWxsZWQuCi0KLVlvdSBjYW4gY3JlYXRlIHRoZSBwcml2YXRlIGFuZCBwdWJsaWMga2V5cyBmb3IgYSB1c2VyIG5vdyBieSBydW5uaW5nCi0KLSAgL3Vzci9iaW4vc3NoLXVzZXItY29uZmlnCi0KLXVuZGVyIHRoZSB1c2VycyBhY2NvdW50LgotCi1UbyBzdXBwb3J0IHRlc3RpbmcgYW5kIHVuYXR0ZW5kZWQgaW5zdGFsbGF0aW9uIHNzaC11c2VyLWNvbmZpZyBnb3QKLXNvbWUgb3B0aW9ucyBhcyB3ZWxsOgotCi11c2FnZTogc3NoLXVzZXItY29uZmlnIFtPUFRJT05dLi4uCi1PcHRpb25zOgotICAgIC0tZGVidWcgICAgICAtZCAgICAgICAgRW5hYmxlIHNoZWxsJ3MgZGVidWcgb3V0cHV0LgotICAgIC0teWVzICAgICAgICAteSAgICAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCAieWVzIiBhdXRvbWF0aWNhbGx5LgotICAgIC0tbm8gICAgICAgICAtbiAgICAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCAibm8iIGF1dG9tYXRpY2FsbHkuCi0gICAgLS1wYXNzcGhyYXNlIC1wIHdvcmQgICBVc2UgIndvcmQiIGFzIHBhc3NwaHJhc2UgYXV0b21hdGljYWxseS4KLQotSW5zdGFsbCBzc2hkIGFzIGRhZW1vbiB2aWEgY3lncnVuc3J2LmV4ZSAocmVjb21tZW5kZWQgb24gTlQvVzJLKSwgdmlhIGluZXRkCi0ocmVzdWx0cyBpbiB2ZXJ5IHNsb3cgZGVhbW9uIHN0YXJ0dXAhKSBvciBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKHJlY29tbWVuZGVkCi1vbiA5WC9NRSkuCi0KLUlmIHlvdSBzdGFydCBzc2hkIGFzIGRlYW1vbiB2aWEgY3lncnVuc3J2LmV4ZSB5b3UgTVVTVCBnaXZlIHRoZQotIi1EIiBvcHRpb24gdG8gc3NoZC4gT3RoZXJ3aXNlIHRoZSBzZXJ2aWNlIGNhbid0IGdldCBzdGFydGVkIGF0IGFsbC4KLQotSWYgc3RhcnRpbmcgdmlhIGluZXRkLCBjb3B5IHNzaGQgdG8gZWcuIC91c3Ivc2Jpbi9pbi5zc2hkIGFuZCBhZGQgdGhlCi1mb2xsb3dpbmcgbGluZSB0byB5b3VyIGluZXRkLmNvbmYgZmlsZToKLQotc3NoIHN0cmVhbSB0Y3Agbm93YWl0IHJvb3QgL3Vzci9zYmluL2luLnNzaGQgc3NoZCAtaQotCi1Nb3Jlb3ZlciB5b3UnbGwgaGF2ZSB0byBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHlvdXIKLSR7U1lTVEVNUk9PVH0vc3lzdGVtMzIvZHJpdmVycy9ldGMvc2VydmljZXMgZmlsZToKLQotICAgc3NoICAgICAgICAgMjIvdGNwICAgICAgICAgICNTU0ggZGFlbW9uCi0KLVBsZWFzZSBub3RlIHRoYXQgT3BlblNTSCBkb2VzIG5ldmVyIHVzZSB0aGUgdmFsdWUgb2YgJEhPTUUgdG8KLXNlYXJjaCBmb3IgdGhlIHVzZXJzIGNvbmZpZ3VyYXRpb24gZmlsZXMhIEl0IGFsd2F5cyB1c2VzIHRoZQotdmFsdWUgb2YgdGhlIHB3X2RpciBmaWVsZCBpbiAvZXRjL3Bhc3N3ZCBhcyB0aGUgaG9tZSBkaXJlY3RvcnkuCi1JZiBubyBob21lIGRpcmV0b3J5IGlzIHNldCBpbiAvZXRjL3Bhc3N3ZCwgdGhlIHJvb3QgZGlyZWN0b3J5Ci1pcyB1c2VkIGluc3RlYWQhCi0KLVlvdSBtYXkgdXNlIGFsbCBmZWF0dXJlcyBvZiB0aGUgQ1lHV0lOPW50c2VjIHNldHRpbmcgdGhlIHNhbWUKLXdheSBhcyB0aGV5IGFyZSB1c2VkIGJ5IEN5Z3dpbidzIGxvZ2luKDEpIHBvcnQ6Ci0KLSAgVGhlIHB3X2dlY29zIGZpZWxkIG1heSBjb250YWluIGFuIGFkZGl0aW9uYWwgZmllbGQsIHRoYXQgYmVnaW5zCi0gIHdpdGggKHVwcGVyIGNhc2UhKSAiVS0iLCBmb2xsb3dlZCBieSB0aGUgZG9tYWluIGFuZCB0aGUgdXNlcm5hbWUKLSAgc2VwYXJhdGVkIGJ5IGEgYmFja3NsYXNoLgotICBDQVVUSU9OOiBUaGUgU0lEIF9tdXN0XyByZW1haW4gdGhlIF9sYXN0XyBmaWVsZCBpbiBwd19nZWNvcyEKLSAgQlRXOiBUaGUgZmllbGQgc2VwYXJhdG9yIGluIHB3X2dlY29zIGlzIHRoZSBjb21tYS4KLSAgVGhlIHVzZXJuYW1lIGluIHB3X25hbWUgaXRzZWxmIG1heSBiZSBhbnkgbmljZSBuYW1lOgotCi0gICAgZG9tdXNlcjo6MTEwNDo1MTM6Sm9obiBEb2UsVS1kb21haW5cdXNlcixTLTEtNS0yMS0uLi4KLQotICBOb3cgeW91IG1heSB1c2UgYGRvbXVzZXInIGFzIHlvdXIgbG9naW4gbmFtZSB3aXRoIHRlbG5ldCEKLSAgVGhpcyBpcyBwb3NzaWJsZSBhZGRpdGlvbmFsbHkgZm9yIGxvY2FsIHVzZXJzLCBpZiB5b3UgZG9uJ3QgbGlrZQotICB5b3VyIE5UIGxvZ2luIG5hbWUgOy0pIFlvdSBvbmx5IGhhdmUgdG8gbGVhdmUgb3V0IHRoZSBkb21haW46Ci0KLSAgICBsb2N1c2VyOjoxMTA0OjUxMzpKb2huIERvZSxVLXVzZXIsUy0xLTUtMjEtLi4uCi0KLU5vdGUgdGhhdCB0aGUgQ1lHV0lOPW50c2VjIHNldHRpbmcgaXMgcmVxdWlyZWQgZm9yIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24uCi0KLVNTSDIgc2VydmVyIGFuZCB1c2VyIGtleXMgYXJlIGdlbmVyYXRlZCBieSB0aGUgYHNzaC0qLWNvbmZpZycgc2NyaXB0cwotYXMgd2VsbC4KLQotSWYgeW91IHdhbnQgdG8gYnVpbGQgZnJvbSBzb3VyY2UsIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0bwotY29uZmlndXJlIGFyZSB1c2VkIGZvciB0aGUgQ3lnd2luIGJpbmFyeSBkaXN0cmlidXRpb246Ci0KLQktLXByZWZpeD0vdXNyIFwKLQktLXN5c2NvbmZkaXI9L2V0YyBcCi0JLS1saWJleGVjZGlyPScke3NiaW5kaXJ9JyBcCi0JLS1sb2NhbHN0YXRlZGlyPS92YXIgXAotCS0tZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJyBcCi0JLS1tYW5kaXI9JyR7ZGF0YWRpcn0vbWFuJyBcCi0JLS1pbmZvZGlyPScke2RhdGFkaXJ9L2luZm8nCi0JLS13aXRoLXRjcC13cmFwcGVycwotCS0td2l0aC1saWJlZGl0Ci0KLUlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIEN5Z3dpbiBwYWNrYWdlLCBlcXVpdmFsZW50IHRvIHRoZSBvbmUKLWluIHRoZSBDeWd3aW4gYmluYXJ5IGRpc3RyaWJ1dGlvbiwgaW5zdGFsbCBsaWtlIHRoaXM6Ci0KLQlta2RpciAvdG1wL2N5Z3dpbi1zc2gKLQljZCAke2J1aWxkZGlyfQotCW1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvY3lnd2luLXNzaAotCWNkICR7c3JjZGlyfS9jb250cmliL2N5Z3dpbgotCW1ha2UgY3lnd2luLXBvc3RpbnN0YWxsIERFU1RESVI9L3RtcC9jeWd3aW4tc3NoCi0JY2QgL3RtcC9jeWd3aW4tc3NoCi0JZmluZCAqIFwhIC10eXBlIGQgfCB0YXIgY3ZqZlQgbXktb3BlbnNzaC50YXIuYnoyIC0KLQotWW91IG11c3QgaGF2ZSBpbnN0YWxsZWQgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyB0byBiZSBhYmxlIHRvIGJ1aWxkIE9wZW5TU0g6Ci0KLS0gemxpYgotLSBvcGVuc3NsLWRldmVsCi0KLUlmIHlvdSB3YW50IHRvIGJ1aWxkIHdpdGggLS13aXRoLXRjcC13cmFwcGVycywgeW91IGFsc28gbmVlZCB0aGUgcGFja2FnZQotCi0tIHRjcF93cmFwcGVycwotCi1JZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIC0td2l0aC1saWJlZGl0LCB5b3UgYWxzbyBuZWVkIHRoZSBwYWNrYWdlCi0KLS0gbGliZWRpdC1kZXZlbAotCi1QbGVhc2Ugc2VuZCByZXF1ZXN0cywgZXJyb3IgcmVwb3J0cyBldGMuIHRvIGN5Z3dpbkBjeWd3aW4uY29tLgotCi0KLUhhdmUgZnVuLAotCi1Db3Jpbm5hIFZpbnNjaGVuCi1DeWd3aW4gRGV2ZWxvcGVyCi1SZWQgSGF0IEluYy4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvY3lnd2luL3NzaC1ob3N0LWNvbmZpZyBiL2NvbnRyaWIvY3lnd2luL3NzaC1ob3N0LWNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FjMzlhNi4uMDAwMDAwMAotLS0gYS9jb250cmliL2N5Z3dpbi9zc2gtaG9zdC1jb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw3NTcgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgc3NoLWhvc3QtY29uZmlnLCBDb3B5cmlnaHQgMjAwMC0yMDExIFJlZCBIYXQgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ3lnd2luIHBvcnQgb2YgT3BlblNTSC4KLSMKLSMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0jIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSMKLSMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgIAotIyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgCi0jIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAKLSMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgIAotIyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgCi0jIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAKLSMgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgSW5pdGlhbGl6YXRpb24KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DU0lIX1NDUklQVD0vdXNyL3NoYXJlL2NzaWgvY3lnd2luLXNlcnZpY2UtaW5zdGFsbGF0aW9uLWhlbHBlci5zaAotCi0jIExpc3Qgb2YgYXBwcyB1c2VkLiAgVGhpcyBpcyBjaGVja2FkIGZvciBleGlzdGFuY2UgaW4gY3NpaF9zYW5pdHlfY2hlY2sKLSMgRG9uJ3QgdXNlICphbnkqIHRyYW5zaWVudCBjb21tYW5kcyBiZWZvcmUgc291cmNpbmcgdGhlIGNzaWggaGVscGVyIHNjcmlwdCwKLSMgb3RoZXJ3aXNlIHRoZSBzYW5pdHkgY2hlY2tzIGFyZSBzaG9ydC1jaXJjdWl0ZWQuCi1kZWNsYXJlIC1hIGNzaWhfcmVxdWlyZWRfY29tbWFuZHM9KAotICAvdXNyL2Jpbi9iYXNlbmFtZSBjb3JldXRpbHMKLSAgL3Vzci9iaW4vY2F0IGNvcmV1dGlscwotICAvdXNyL2Jpbi9jaG1vZCBjb3JldXRpbHMKLSAgL3Vzci9iaW4vZGlybmFtZSBjb3JldXRpbHMKLSAgL3Vzci9iaW4vaWQgY29yZXV0aWxzCi0gIC91c3IvYmluL212IGNvcmV1dGlscwotICAvdXNyL2Jpbi9ybSBjb3JldXRpbHMKLSAgL3Vzci9iaW4vY3lncGF0aCBjeWd3aW4KLSAgL3Vzci9iaW4vbW91bnQgY3lnd2luCi0gIC91c3IvYmluL3BzIGN5Z3dpbgotICAvdXNyL2Jpbi9zZXRmYWNsIGN5Z3dpbgotICAvdXNyL2Jpbi91bW91bnQgY3lnd2luCi0gIC91c3IvYmluL2NtcCBkaWZmdXRpbHMKLSAgL3Vzci9iaW4vZ3JlcCBncmVwCi0gIC91c3IvYmluL2F3ayBnYXdrCi0gIC91c3IvYmluL3NzaC1rZXlnZW4gb3BlbnNzaAotICAvdXNyL3NiaW4vc3NoZCBvcGVuc3NoCi0gIC91c3IvYmluL3NlZCBzZWQKLSkKLWNzaWhfc2FuaXR5X2NoZWNrX3NlcnZlcj15ZXMKLXNvdXJjZSAke0NTSUhfU0NSSVBUfQotCi1QUk9HTkFNRT0kKC91c3IvYmluL2Jhc2VuYW1lICQwKQotX3RkaXI9JCgvdXNyL2Jpbi9kaXJuYW1lICQwKQotUFJPR0RJUj0kKGNkICRfdGRpciAmJiBwd2QpCi0KLSMgU3ViZGlyZWN0b3J5IHdoZXJlIHRoZSBuZXcgcGFja2FnZSBpcyBiZWluZyBpbnN0YWxsZWQKLVBSRUZJWD0vdXNyCi0KLSMgRGlyZWN0b3J5IHdoZXJlIHRoZSBjb25maWcgZmlsZXMgYXJlIHN0b3JlZAotU1lTQ09ORkRJUj0vZXRjCi1MT0NBTFNUQVRFRElSPS92YXIKLQotcG9ydF9udW1iZXI9MjIKLXByaXZzZXBfY29uZmlndXJlZD1ubwotcHJpdnNlcF91c2VkPXllcwotY3lnd2luX3ZhbHVlPSIiCi11c2VyX2FjY291bnQ9Ci1wYXNzd29yZF92YWx1ZT0KLW9wdF9mb3JjZT1ubwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgUm91dGluZTogY3JlYXRlX2hvc3Rfa2V5cwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1jcmVhdGVfaG9zdF9rZXlzKCkgewotICBsb2NhbCByZXQ9MAotCi0gIGlmIFsgISAtZiAiJHtTWVNDT05GRElSfS9zc2hfaG9zdF9rZXkiIF0KLSAgdGhlbgotICAgIGNzaWhfaW5mb3JtICJHZW5lcmF0aW5nICR7U1lTQ09ORkRJUn0vc3NoX2hvc3Rfa2V5IgotICAgIGlmICEgL3Vzci9iaW4vc3NoLWtleWdlbiAtdCByc2ExIC1mICR7U1lTQ09ORkRJUn0vc3NoX2hvc3Rfa2V5IC1OICcnID4gL2Rldi9udWxsCi0gICAgdGhlbgotICAgIAljc2loX3dhcm5pbmcgIkdlbmVyYXRpbmcgJHtTWVNDT05GRElSfS9zc2hfaG9zdF9rZXkgZmFpbGVkISIKLQlsZXQgKytyZXQKLSAgICBmaQotICBmaQotCi0gIGlmIFsgISAtZiAiJHtTWVNDT05GRElSfS9zc2hfaG9zdF9yc2Ffa2V5IiBdCi0gIHRoZW4KLSAgICBjc2loX2luZm9ybSAiR2VuZXJhdGluZyAke1NZU0NPTkZESVJ9L3NzaF9ob3N0X3JzYV9rZXkiCi0gICAgaWYgISAvdXNyL2Jpbi9zc2gta2V5Z2VuIC10IHJzYSAtZiAke1NZU0NPTkZESVJ9L3NzaF9ob3N0X3JzYV9rZXkgLU4gJycgPiAvZGV2L251bGwKLSAgICB0aGVuCi0gICAgCWNzaWhfd2FybmluZyAiR2VuZXJhdGluZyAke1NZU0NPTkZESVJ9L3NzaF9ob3N0X2tleSBmYWlsZWQhIgotCWxldCArK3JldAotICAgIGZpCi0gIGZpCi0KLSAgaWYgWyAhIC1mICIke1NZU0NPTkZESVJ9L3NzaF9ob3N0X2RzYV9rZXkiIF0KLSAgdGhlbgotICAgIGNzaWhfaW5mb3JtICJHZW5lcmF0aW5nICR7U1lTQ09ORkRJUn0vc3NoX2hvc3RfZHNhX2tleSIKLSAgICBpZiAhIC91c3IvYmluL3NzaC1rZXlnZW4gLXQgZHNhIC1mICR7U1lTQ09ORkRJUn0vc3NoX2hvc3RfZHNhX2tleSAtTiAnJyA+IC9kZXYvbnVsbAotICAgIHRoZW4KLSAgICAJY3NpaF93YXJuaW5nICJHZW5lcmF0aW5nICR7U1lTQ09ORkRJUn0vc3NoX2hvc3Rfa2V5IGZhaWxlZCEiCi0JbGV0ICsrcmV0Ci0gICAgZmkKLSAgZmkKLQotICBpZiBbICEgLWYgIiR7U1lTQ09ORkRJUn0vc3NoX2hvc3RfZWNkc2Ffa2V5IiBdCi0gIHRoZW4KLSAgICBjc2loX2luZm9ybSAiR2VuZXJhdGluZyAke1NZU0NPTkZESVJ9L3NzaF9ob3N0X2VjZHNhX2tleSIKLSAgICBpZiAhIC91c3IvYmluL3NzaC1rZXlnZW4gLXQgZWNkc2EgLWYgJHtTWVNDT05GRElSfS9zc2hfaG9zdF9lY2RzYV9rZXkgLU4gJycgPiAvZGV2L251bGwKLSAgICB0aGVuCi0gICAgCWNzaWhfd2FybmluZyAiR2VuZXJhdGluZyAke1NZU0NPTkZESVJ9L3NzaF9ob3N0X2tleSBmYWlsZWQhIgotCWxldCArK3JldAotICAgIGZpCi0gIGZpCi0gIHJldHVybiAkcmV0Ci19ICMgLS0tIEVuZCBvZiBjcmVhdGVfaG9zdF9rZXlzIC0tLSAjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBSb3V0aW5lOiB1cGRhdGVfc2VydmljZXNfZmlsZQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci11cGRhdGVfc2VydmljZXNfZmlsZSgpIHsKLSAgbG9jYWwgX215X2V0Y2Rpcj0iL3NzaC1ob3N0LWNvbmZpZy4kJCIKLSAgbG9jYWwgX3dpbl9ldGNkaXIKLSAgbG9jYWwgX3NlcnZpY2VzCi0gIGxvY2FsIF9zcGFjZXMKLSAgbG9jYWwgX3NlcnZfdG1wCi0gIGxvY2FsIF93c2VydmljZXMKLSAgbG9jYWwgcmV0PTAKLQotICBfd2luX2V0Y2Rpcj0iJHtTWVNURU1ST09UfVxcc3lzdGVtMzJcXGRyaXZlcnNcXGV0YyIKLSAgX3NlcnZpY2VzPSIke19teV9ldGNkaXJ9L3NlcnZpY2VzIgotICBfc3BhY2VzPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAjIgotICBfc2Vydl90bXA9IiR7X215X2V0Y2Rpcn0vc3J2Lm91dC4kJCIKLQotICAvdXNyL2Jpbi9tb3VudCAtbyB0ZXh0LHBvc2l4PTAsbm9hY2wgLWYgIiR7X3dpbl9ldGNkaXJ9IiAiJHtfbXlfZXRjZGlyfSIKLQotICAjIERlcGVuZHMgb24gdGhlIGFib3ZlIG1vdW50Ci0gIF93c2VydmljZXM9YGN5Z3BhdGggLXcgIiR7X3NlcnZpY2VzfSJgCi0KLSAgIyBSZW1vdmUgc3NoZCAyMi9wb3J0IGZyb20gc2VydmljZXMKLSAgaWYgWyBgL3Vzci9iaW4vZ3JlcCAtcSAnc3NoZFsgXHRdWyBcdF0qMjInICIke19zZXJ2aWNlc30iOyBlY2hvICQ/YCAtZXEgMCBdCi0gIHRoZW4KLSAgICAvdXNyL2Jpbi9ncmVwIC12ICdzc2hkWyBcdF1bIFx0XSoyMicgIiR7X3NlcnZpY2VzfSIgPiAiJHtfc2Vydl90bXB9IgotICAgIGlmIFsgLWYgIiR7X3NlcnZfdG1wfSIgXQotICAgIHRoZW4KLSAgICAgIGlmIC91c3IvYmluL212ICIke19zZXJ2X3RtcH0iICIke19zZXJ2aWNlc30iCi0gICAgICB0aGVuCi0JY3NpaF9pbmZvcm0gIlJlbW92aW5nIHNzaGQgZnJvbSAke193c2VydmljZXN9IgotICAgICAgZWxzZQotCWNzaWhfd2FybmluZyAiUmVtb3Zpbmcgc3NoZCBmcm9tICR7X3dzZXJ2aWNlc30gZmFpbGVkISIKLQlsZXQgKytyZXQKLSAgICAgIGZpCi0gICAgICAvdXNyL2Jpbi9ybSAtZiAiJHtfc2Vydl90bXB9IgotICAgIGVsc2UKLSAgICAgIGNzaWhfd2FybmluZyAiUmVtb3Zpbmcgc3NoZCBmcm9tICR7X3dzZXJ2aWNlc30gZmFpbGVkISIKLSAgICAgIGxldCArK3JldAotICAgIGZpCi0gIGZpCi0KLSAgIyBBZGQgc3NoIDIyL3RjcCAgYW5kIHNzaCAyMi91ZHAgdG8gc2VydmljZXMKLSAgaWYgWyBgL3Vzci9iaW4vZ3JlcCAtcSAnc3NoWyBcdF1bIFx0XSoyMicgIiR7X3NlcnZpY2VzfSI7IGVjaG8gJD9gIC1uZSAwIF0KLSAgdGhlbgotICAgIGlmIC91c3IvYmluL2F3ayAneyBpZiAoICQyIH4gL14yM1wvdGNwLyApIHByaW50ICJzc2ggICAgICAgICAgICAgICAgMjIvdGNwJyIke19zcGFjZXN9IidTU0ggUmVtb3RlIExvZ2luIFByb3RvY29sXG5zc2ggICAgICAgICAgICAgICAgMjIvdWRwJyIke19zcGFjZXN9IidTU0ggUmVtb3RlIExvZ2luIFByb3RvY29sIjsgcHJpbnQgJDA7IH0nIDwgIiR7X3NlcnZpY2VzfSIgPiAiJHtfc2Vydl90bXB9IgotICAgIHRoZW4KLSAgICAgIGlmIC91c3IvYmluL212ICIke19zZXJ2X3RtcH0iICIke19zZXJ2aWNlc30iCi0gICAgICB0aGVuCi0JY3NpaF9pbmZvcm0gIkFkZGVkIHNzaCB0byAke193c2VydmljZXN9IgotICAgICAgZWxzZQotCWNzaWhfd2FybmluZyAiQWRkaW5nIHNzaCB0byAke193c2VydmljZXN9IGZhaWxlZCEiCi0JbGV0ICsrcmV0Ci0gICAgICBmaQotICAgICAgL3Vzci9iaW4vcm0gLWYgIiR7X3NlcnZfdG1wfSIKLSAgICBlbHNlCi0gICAgICBjc2loX3dhcm5pbmcgIkFkZGluZyBzc2ggdG8gJHtfd3NlcnZpY2VzfSBmYWlsZWQhIgotICAgICAgbGV0ICsrcmV0Ci0gICAgZmkKLSAgZmkKLSAgL3Vzci9iaW4vdW1vdW50ICIke19teV9ldGNkaXJ9IgotICByZXR1cm4gJHJldAotfSAjIC0tLSBFbmQgb2YgdXBkYXRlX3NlcnZpY2VzX2ZpbGUgLS0tICMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFJvdXRpbmU6IHNzaGRfcHJpdnNlcAotIyAgTU9ESUZJRVM6IHByaXZzZXBfY29uZmlndXJlZCAgcHJpdnNlcF91c2VkCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXNzaGRfcHJpdnNlcCgpIHsKLSAgbG9jYWwgc3NoZGNvbmZpZ190bXAKLSAgbG9jYWwgcmV0PTAKLQotICBpZiBbICIke3ByaXZzZXBfY29uZmlndXJlZH0iICE9ICJ5ZXMiIF0KLSAgdGhlbgotICAgIGNzaWhfaW5mb3JtICJQcml2aWxlZ2Ugc2VwYXJhdGlvbiBpcyBzZXQgdG8geWVzIGJ5IGRlZmF1bHQgc2luY2UgT3BlblNTSCAzLjMuIgotICAgIGNzaWhfaW5mb3JtICJIb3dldmVyLCB0aGlzIHJlcXVpcmVzIGEgbm9uLXByaXZpbGVnZWQgYWNjb3VudCBjYWxsZWQgJ3NzaGQnLiIKLSAgICBjc2loX2luZm9ybSAiRm9yIG1vcmUgaW5mbyBvbiBwcml2aWxlZ2Ugc2VwYXJhdGlvbiByZWFkIC91c3Ivc2hhcmUvZG9jL29wZW5zc2gvUkVBRE1FLnByaXZzZXAuIgotICAgIGlmIGNzaWhfcmVxdWVzdCAiU2hvdWxkIHByaXZpbGVnZSBzZXBhcmF0aW9uIGJlIHVzZWQ/IgotICAgIHRoZW4KLSAgICAgIHByaXZzZXBfdXNlZD15ZXMKLSAgICAgIGlmICEgY3NpaF9jcmVhdGVfdW5wcml2aWxlZ2VkX3VzZXIgc3NoZAotICAgICAgdGhlbgotCWNzaWhfZXJyb3JfcmVjb3ZlcmFibGUgIkNvdWxkbid0IGNyZWF0ZSB1c2VyICdzc2hkJyEiCi0JY3NpaF9lcnJvcl9yZWNvdmVyYWJsZSAiUHJpdmlsZWdlIHNlcGFyYXRpb24gc2V0IHRvICdubycgYWdhaW4hIgotCWNzaWhfZXJyb3JfcmVjb3ZlcmFibGUgIkNoZWNrIHlvdXIgJHtTWVNDT05GRElSfS9zc2hkX2NvbmZpZyBmaWxlISIKLQlsZXQgKytyZXQKLQlwcml2c2VwX3VzZWQ9bm8KLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgcHJpdnNlcF91c2VkPW5vCi0gICAgZmkKLSAgZmkKLQotICAjIENyZWF0ZSBkZWZhdWx0IHNzaGRfY29uZmlnIGZyb20gc2tlbGV0b24gZmlsZXMgaW4gL2V0Yy9kZWZhdWx0cy9ldGMgb3IKLSAgIyBtb2RpZnkgdG8gYWRkIHRoZSBtaXNzaW5nIHByaXZzZXAgY29uZmlndXJhdGlvbiBvcHRpb24KLSAgaWYgL3Vzci9iaW4vY21wICIke1NZU0NPTkZESVJ9L3NzaGRfY29uZmlnIiAiJHtTWVNDT05GRElSfS9kZWZhdWx0cy8ke1NZU0NPTkZESVJ9L3NzaGRfY29uZmlnIiA+L2Rldi9udWxsIDI+JjEKLSAgdGhlbgotICAgIGNzaWhfaW5mb3JtICJVcGRhdGluZyAke1NZU0NPTkZESVJ9L3NzaGRfY29uZmlnIGZpbGUiCi0gICAgc3NoZGNvbmZpZ190bXA9JHtTWVNDT05GRElSfS9zc2hkX2NvbmZpZy4kJAotICAgIC91c3IvYmluL3NlZCAtZSAicy9eI1VzZVByaXZpbGVnZVNlcGFyYXRpb24geWVzL1VzZVByaXZpbGVnZVNlcGFyYXRpb24gJHtwcml2c2VwX3VzZWR9LwotICAJICBzL14jUG9ydCAyMi9Qb3J0ICR7cG9ydF9udW1iZXJ9LwotICAJICBzL14jU3RyaWN0TW9kZXMgeWVzL1N0cmljdE1vZGVzIG5vLyIgXAotCTwgJHtTWVNDT05GRElSfS9zc2hkX2NvbmZpZyBcCi0JPiAiJHtzc2hkY29uZmlnX3RtcH0iCi0gICAgaWYgISAvdXNyL2Jpbi9tdiAiJHtzc2hkY29uZmlnX3RtcH0iICR7U1lTQ09ORkRJUn0vc3NoZF9jb25maWcKLSAgICB0aGVuCi0JY3NpaF93YXJuaW5nICJTZXR0aW5nIHByaXZpbGVnZSBzZXBhcmF0aW9uIHRvICd5ZXMnIGZhaWxlZCEiCi0JY3NpaF93YXJuaW5nICJDaGVjayB5b3VyICR7U1lTQ09ORkRJUn0vc3NoZF9jb25maWcgZmlsZSEiCi0JbGV0ICsrcmV0Ci0gICAgZmkKLSAgZWxpZiBbICIke3ByaXZzZXBfY29uZmlndXJlZH0iICE9ICJ5ZXMiIF0KLSAgdGhlbgotICAgIGVjaG8gPj4gJHtTWVNDT05GRElSfS9zc2hkX2NvbmZpZwotICAgIGlmICEgZWNobyAiVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiAke3ByaXZzZXBfdXNlZH0iID4+ICR7U1lTQ09ORkRJUn0vc3NoZF9jb25maWcKLSAgICB0aGVuCi0JY3NpaF93YXJuaW5nICJTZXR0aW5nIHByaXZpbGVnZSBzZXBhcmF0aW9uIHRvICd5ZXMnIGZhaWxlZCEiCi0JY3NpaF93YXJuaW5nICJDaGVjayB5b3VyICR7U1lTQ09ORkRJUn0vc3NoZF9jb25maWcgZmlsZSEiCi0JbGV0ICsrcmV0Ci0gICAgZmkKLSAgZmkKLSAgcmV0dXJuICRyZXQKLX0gIyAtLS0gRW5kIG9mIHNzaGRfcHJpdnNlcCAtLS0gIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgUm91dGluZTogdXBkYXRlX2luZXRkX2NvbmYKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdXBkYXRlX2luZXRkX2NvbmYoKSB7Ci0gIGxvY2FsIF9pbmV0Y25mPSIke1NZU0NPTkZESVJ9L2luZXRkLmNvbmYiCi0gIGxvY2FsIF9pbmV0Y25mX3RtcD0iJHtTWVNDT05GRElSfS9pbmV0ZC5jb25mLiQkIgotICBsb2NhbCBfaW5ldGNuZl9kaXI9IiR7U1lTQ09ORkRJUn0vaW5ldGQuZCIKLSAgbG9jYWwgX3NzaGRfaW5ldGRfY29uZj0iJHtfaW5ldGNuZl9kaXJ9L3NzaGQtaW5ldGQiCi0gIGxvY2FsIF9zc2hkX2luZXRkX2NvbmZfdG1wPSIke19pbmV0Y25mX2Rpcn0vc3NoZC1pbmV0ZC4kJCIKLSAgbG9jYWwgX3dpdGhfY29tbWVudD0xCi0gIGxvY2FsIHJldD0wCi0KLSAgaWYgWyAtZCAiJHtfaW5ldGNuZl9kaXJ9IiBdCi0gIHRoZW4KLSAgICAjIHdlIGhhdmUgaW5ldHV0aWxzLTEuNSBpbmV0ZC5kIHN1cHBvcnQKLSAgICBpZiBbIC1mICIke19pbmV0Y25mfSIgXQotICAgIHRoZW4KLSAgICAgIC91c3IvYmluL2dyZXAgLXEgJ15bIFx0XSpzc2gnICIke19pbmV0Y25mfSIgJiYgX3dpdGhfY29tbWVudD0wCi0KLSAgICAgICMgY2hlY2sgZm9yIHNzaGQgT1Igc3NoIGluIHRvcC1sZXZlbCBpbmV0ZC5jb25mIGZpbGUsIGFuZCByZW1vdmUKLSAgICAgICMgd2lsbCBiZSByZXBsYWNlZCBieSBhIGZpbGUgaW4gaW5ldGQuZC8KLSAgICAgIGlmIFsgYC91c3IvYmluL2dyZXAgLXEgJ15bIyBcdF0qc3NoJyAiJHtfaW5ldGNuZn0iOyBlY2hvICQ/YCAtZXEgMCBdCi0gICAgICB0aGVuCi0JL3Vzci9iaW4vZ3JlcCAtdiAnXlsjIFx0XSpzc2gnICIke19pbmV0Y25mfSIgPj4gIiR7X2luZXRjbmZfdG1wfSIKLQlpZiBbIC1mICIke19pbmV0Y25mX3RtcH0iIF0KLQl0aGVuCi0JICBpZiAvdXNyL2Jpbi9tdiAiJHtfaW5ldGNuZl90bXB9IiAiJHtfaW5ldGNuZn0iCi0JICB0aGVuCi0gIAkgICAgY3NpaF9pbmZvcm0gIlJlbW92ZWQgc3NoW2RdIGZyb20gJHtfaW5ldGNuZn0iCi0JICBlbHNlCi0gIAkgICAgY3NpaF93YXJuaW5nICJSZW1vdmluZyBzc2hbZF0gZnJvbSAke19pbmV0Y25mfSBmYWlsZWQhIgotCSAgICBsZXQgKytyZXQKLQkgIGZpCi0JICAvdXNyL2Jpbi9ybSAtZiAiJHtfaW5ldGNuZl90bXB9IgotCWVsc2UKLQkgIGNzaWhfd2FybmluZyAiUmVtb3Zpbmcgc3NoW2RdIGZyb20gJHtfaW5ldGNuZn0gZmFpbGVkISIKLQkgIGxldCArK3JldAotCWZpCi0gICAgICBmaQotICAgIGZpCi0KLSAgICBjc2loX2luc3RhbGxfY29uZmlnICIke19zc2hkX2luZXRkX2NvbmZ9IiAgICIke1NZU0NPTkZESVJ9L2RlZmF1bHRzIgotICAgIGlmIC91c3IvYmluL2NtcCAiJHtTWVNDT05GRElSfS9kZWZhdWx0cyR7X3NzaGRfaW5ldGRfY29uZn0iICIke19zc2hkX2luZXRkX2NvbmZ9IiA+L2Rldi9udWxsIDI+JjEKLSAgICB0aGVuCi0gICAgICBpZiBbICIke193aXRoX2NvbW1lbnR9IiAtZXEgMCBdCi0gICAgICB0aGVuCi0JL3Vzci9iaW4vc2VkIC1lICdzL0BDT01NRU5UQFsgXHRdKi8vJyA8ICIke19zc2hkX2luZXRkX2NvbmZ9IiA+ICIke19zc2hkX2luZXRkX2NvbmZfdG1wfSIKLSAgICAgIGVsc2UKLQkvdXNyL2Jpbi9zZWQgLWUgJ3MvQENPTU1FTlRAWyBcdF0qLyMgLycgPCAiJHtfc3NoZF9pbmV0ZF9jb25mfSIgPiAiJHtfc3NoZF9pbmV0ZF9jb25mX3RtcH0iCi0gICAgICBmaQotICAgICAgaWYgL3Vzci9iaW4vbXYgIiR7X3NzaGRfaW5ldGRfY29uZl90bXB9IiAiJHtfc3NoZF9pbmV0ZF9jb25mfSIKLSAgICAgIHRoZW4KLQljc2loX2luZm9ybSAiVXBkYXRlZCAke19zc2hkX2luZXRkX2NvbmZ9IgotICAgICAgZWxzZQotCWNzaWhfd2FybmluZyAiVXBkYXRpbmcgJHtfc3NoZF9pbmV0ZF9jb25mfSBmYWlsZWQhIgotCWxldCArK3JldAotICAgICAgZmkKLSAgICBmaQotCi0gIGVsaWYgWyAtZiAiJHtfaW5ldGNuZn0iIF0KLSAgdGhlbgotICAgIC91c3IvYmluL2dyZXAgLXEgJ15bIFx0XSpzc2hkJyAiJHtfaW5ldGNuZn0iICYmIF93aXRoX2NvbW1lbnQ9MAotCi0gICAgIyBjaGVjayBmb3Igc3NoZCBpbiB0b3AtbGV2ZWwgaW5ldGQuY29uZiBmaWxlLCBhbmQgcmVtb3ZlCi0gICAgIyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgZmlsZSBpbiBpbmV0ZC5kLwotICAgIGlmIFsgYC91c3IvYmluL2dyZXAgLXEgJ15bIyBcdF0qc3NoZCcgIiR7X2luZXRjbmZ9IjsgZWNobyAkP2AgLWVxIDAgXQotICAgIHRoZW4KLSAgICAgIC91c3IvYmluL2dyZXAgLXYgJ15bIyBcdF0qc3NoZCcgIiR7X2luZXRjbmZ9IiA+PiAiJHtfaW5ldGNuZl90bXB9IgotICAgICAgaWYgWyAtZiAiJHtfaW5ldGNuZl90bXB9IiBdCi0gICAgICB0aGVuCi0JaWYgL3Vzci9iaW4vbXYgIiR7X2luZXRjbmZfdG1wfSIgIiR7X2luZXRjbmZ9IgotCXRoZW4KLQkgICAgY3NpaF9pbmZvcm0gIlJlbW92ZWQgc3NoZCBmcm9tICR7X2luZXRjbmZ9IgotCWVsc2UKLQkgICAgY3NpaF93YXJuaW5nICJSZW1vdmluZyBzc2hkIGZyb20gJHtfaW5ldGNuZn0gZmFpbGVkISIKLQkgICAgbGV0ICsrcmV0Ci0JZmkKLQkvdXNyL2Jpbi9ybSAtZiAiJHtfaW5ldGNuZl90bXB9IgotICAgICAgZWxzZQotCWNzaWhfd2FybmluZyAiUmVtb3Zpbmcgc3NoZCBmcm9tICR7X2luZXRjbmZ9IGZhaWxlZCEiCi0JbGV0ICsrcmV0Ci0gICAgICBmaQotICAgIGZpCi0KLSAgICAjIEFkZCBzc2ggbGluZSB0byBpbmV0ZC5jb25mCi0gICAgaWYgWyBgL3Vzci9iaW4vZ3JlcCAtcSAnXlsjIFx0XSpzc2gnICIke19pbmV0Y25mfSI7IGVjaG8gJD9gIC1uZSAwIF0KLSAgICB0aGVuCi0gICAgICBpZiBbICIke193aXRoX2NvbW1lbnR9IiAtZXEgMCBdCi0gICAgICB0aGVuCi0JZWNobyAnc3NoICBzdHJlYW0gIHRjcCAgICAgbm93YWl0ICByb290ICAgIC91c3Ivc2Jpbi9zc2hkIHNzaGQgLWknID4+ICIke19pbmV0Y25mfSIKLSAgICAgIGVsc2UKLQllY2hvICcjIHNzaCAgc3RyZWFtICB0Y3AgICAgIG5vd2FpdCAgcm9vdCAgICAvdXNyL3NiaW4vc3NoZCBzc2hkIC1pJyA+PiAiJHtfaW5ldGNuZn0iCi0gICAgICBmaQotICAgICAgaWYgWyAkPyAtZXEgMCBdCi0gICAgICB0aGVuCi0JY3NpaF9pbmZvcm0gIkFkZGVkIHNzaCB0byAke19pbmV0Y25mfSIKLSAgICAgIGVsc2UKLQljc2loX3dhcm5pbmcgIkFkZGluZyBzc2ggdG8gJHtfaW5ldGNuZn0gZmFpbGVkISIKLQlsZXQgKytyZXQKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLSAgcmV0dXJuICRyZXQKLX0gIyAtLS0gRW5kIG9mIHVwZGF0ZV9pbmV0ZF9jb25mIC0tLSAjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBSb3V0aW5lOiBjaGVja19zZXJ2aWNlX2ZpbGVzX293bmVyc2hpcAotIyAgIENoZWNrcyB0aGF0IHRoZSBmaWxlcyBpbiAvZXRjIGFuZCAvdmFyIGJlbG9uZyB0byB0aGUgcmlnaHQgb3duZXIKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotY2hlY2tfc2VydmljZV9maWxlc19vd25lcnNoaXAoKSB7Ci0gIGxvY2FsIHJ1bl9zZXJ2aWNlX2FzPSQxCi0gIGxvY2FsIHJldD0wCi0KLSAgaWYgWyAteiAiJHtydW5fc2VydmljZV9hc30iIF0KLSAgdGhlbgotICAgIGFjY250X25hbWU9JCgvdXNyL2Jpbi9jeWdydW5zcnYgLVZRIHNzaGQgfCAvdXNyL2Jpbi9zZWQgLW5lICdzL15BY2NvdW50ICo6ICovL2dwJykKLSAgICBpZiBbICIke2FjY250X25hbWV9IiA9ICJMb2NhbFN5c3RlbSIgXQotICAgIHRoZW4KLSAgICAgICMgQ29udmVydCAiTG9jYWxTeXN0ZW0iIHRvICJTWVNURU0iIGFzIGlzIHRoZSBjb3JyZWN0IGFjY291bnQgbmFtZQotICAgICAgYWNjbnRfbmFtZT0iU1lTVEVNOiIKLSAgICBlbGlmIFtbICIke2FjY250X25hbWV9IiA9fiBeXC5cXCBdXQotICAgIHRoZW4KLSAgICAgICMgQ29udmVydCAiLiIgZG9tYWluIHRvIGxvY2FsIG1hY2hpbmUgbmFtZQotICAgICAgYWNjbnRfbmFtZT0iVS0ke0NPTVBVVEVSTkFNRX0ke2FjY250X25hbWUjLn0sIgotICAgIGZpCi0gICAgcnVuX3NlcnZpY2VfYXM9JCgvdXNyL2Jpbi9ncmVwIC1GaSAiJHthY2NudF9uYW1lfSIgL2V0Yy9wYXNzd2QgfCAvdXNyL2Jpbi9hd2sgLUY6ICd7cHJpbnQgJDE7fScpCi0gICAgaWYgWyAteiAiJHtydW5fc2VydmljZV9hc30iIF0KLSAgICB0aGVuCi0gICAgICBjc2loX3dhcm5pbmcgIkNvdWxkbid0IGRldGVybWluZSBuYW1lIG9mIHVzZXIgcnVubmluZyBzc2hkIHNlcnZpY2UgZnJvbSAvZXRjL3Bhc3N3ZCEiCi0gICAgICBjc2loX3dhcm5pbmcgIkFzIGEgcmVzdWx0LCB0aGlzIHNjcmlwdCBjYW5ub3QgbWFrZSBzdXJlIHRoYXQgdGhlIGZpbGVzIHVzZWQiCi0gICAgICBjc2loX3dhcm5pbmcgImJ5IHRoZSBzc2hkIHNlcnZpY2UgYmVsb25nIHRvIHRoZSB1c2VyIHJ1bm5pbmcgdGhlIHNlcnZpY2UuIgotICAgICAgY3NpaF93YXJuaW5nICJQbGVhc2UgcmUtcnVuIHRoZSBta3Bhc3N3ZCB0b29sIHRvIG1ha2Ugc3VyZSB0aGUgL2V0Yy9wYXNzd2QiCi0gICAgICBjc2loX3dhcm5pbmcgImZpbGUgaXMgaW4gYSBnb29kIHNoYXBlLiIKLSAgICAgIHJldHVybiAxCi0gICAgZmkKLSAgZmkKLSAgZm9yIGkgaW4gIiR7U1lTQ09ORkRJUn0iL3NzaF9jb25maWcgIiR7U1lTQ09ORkRJUn0iL3NzaGRfY29uZmlnICIke1NZU0NPTkZESVJ9Ii9zc2hfaG9zdF8qa2V5ICIke1NZU0NPTkZESVJ9Ii9zc2hfaG9zdF8qa2V5LnB1YgotICBkbwotICAgIGlmIFsgLWYgIiRpIiBdCi0gICAgdGhlbgotICAgICAgaWYgISBjaG93biAiJHtydW5fc2VydmljZV9hc30iLjU0NCAiJGkiID4vZGV2L251bGwgMj4mMQotICAgICAgdGhlbgotCWNzaWhfd2FybmluZyAiQ291bGRuJ3QgY2hhbmdlIG93bmVyIG9mICRpISIKLQlsZXQgKytyZXQKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBpZiAhIGNob3duICIke3J1bl9zZXJ2aWNlX2FzfSIuNTQ0ICR7TE9DQUxTVEFURURJUn0vZW1wdHkgPi9kZXYvbnVsbCAyPiYxCi0gIHRoZW4KLSAgICBjc2loX3dhcm5pbmcgIkNvdWxkbid0IGNoYW5nZSBvd25lciBvZiAke0xPQ0FMU1RBVEVESVJ9L2VtcHR5ISIKLSAgICBsZXQgKytyZXQKLSAgZmkKLSAgaWYgISBjaG93biAiJHtydW5fc2VydmljZV9hc30iLjU0NCAke0xPQ0FMU1RBVEVESVJ9L2xvZy9sYXN0bG9nID4vZGV2L251bGwgMj4mMQotICB0aGVuCi0gICAgY3NpaF93YXJuaW5nICJDb3VsZG4ndCBjaGFuZ2Ugb3duZXIgb2YgJHtMT0NBTFNUQVRFRElSfS9sb2cvbGFzdGxvZyEiCi0gICAgbGV0ICsrcmV0Ci0gIGZpCi0gIGlmIFsgLWYgJHtMT0NBTFNUQVRFRElSfS9sb2cvc3NoZC5sb2cgXQotICB0aGVuCi0gICAgaWYgISBjaG93biAiJHtydW5fc2VydmljZV9hc30iLjU0NCAke0xPQ0FMU1RBVEVESVJ9L2xvZy9zc2hkLmxvZyA+L2Rldi9udWxsIDI+JjEKLSAgICB0aGVuCi0gICAgICBjc2loX3dhcm5pbmcgIkNvdWxkbid0IGNoYW5nZSBvd25lciBvZiAke0xPQ0FMU1RBVEVESVJ9L2xvZy9zc2hkLmxvZyEiCi0gICAgICBsZXQgKytyZXQKLSAgICBmaQotICBmaQotICBpZiBbICRyZXQgLW5lIDAgXQotICB0aGVuCi0gICAgY3NpaF93YXJuaW5nICJDb3VsZG4ndCBjaGFuZ2Ugb3duZXIgb2YgaW1wb3J0YW50IGZpbGVzIHRvICR7cnVuX3NlcnZpY2VfYXN9ISIKLSAgICBjc2loX3dhcm5pbmcgIlRoaXMgbWF5IGNhdXNlIHRoZSBzc2hkIHNlcnZpY2UgdG8gZmFpbCEgIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCIKLSAgICBjc2loX3dhcm5pbmcgInlvdSBoYXZlIHN1dWZmaWNpZW50IHBlcm1pc3Npb25zIHRvIGNoYW5nZSB0aGUgb3duZXJzaGlwIG9mIGZpbGVzIgotICAgIGNzaWhfd2FybmluZyAiYW5kIHRyeSB0byBydW4gdGhlIHNzaC1ob3N0LWNvbmZpZyBzY3JpcHQgYWdhaW4uIgotICBmaQotICByZXR1cm4gJHJldAotfSAjIC0tLSBFbmQgb2YgY2hlY2tfc2VydmljZV9maWxlc19vd25lcnNoaXAgLS0tICMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFJvdXRpbmU6IGluc3RhbGxfc2VydmljZQotIyAgIEluc3RhbGwgc3NoZCBhcyBhIHNlcnZpY2UKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaW5zdGFsbF9zZXJ2aWNlKCkgewotICBsb2NhbCBydW5fc2VydmljZV9hcwotICBsb2NhbCBwYXNzd29yZAotICBsb2NhbCByZXQ9MAotCi0gIGVjaG8KLSAgaWYgL3Vzci9iaW4vY3lncnVuc3J2IC1RIHNzaGQgPi9kZXYvbnVsbCAyPiYxCi0gIHRoZW4KLSAgICBjc2loX2luZm9ybSAiU3NoZCBzZXJ2aWNlIGlzIGFscmVhZHkgaW5zdGFsbGVkLiIKLSAgICBjaGVja19zZXJ2aWNlX2ZpbGVzX293bmVyc2hpcCAiIiB8fCBsZXQgcmV0Kz0kPwotICBlbHNlCi0gICAgZWNobyAtZSAiJHtfY3NpaF9RVUVSWV9TVFJ9IERvIHlvdSB3YW50IHRvIGluc3RhbGwgc3NoZCBhcyBhIHNlcnZpY2U/IgotICAgIGlmIGNzaWhfcmVxdWVzdCAiKFNheSBcIm5vXCIgaWYgaXQgaXMgYWxyZWFkeSBpbnN0YWxsZWQgYXMgYSBzZXJ2aWNlKSIKLSAgICB0aGVuCi0gICAgICBjc2loX2dldF9jeWdlbnYgIiR7Y3lnd2luX3ZhbHVlfSIKLQotICAgICAgaWYgKCBjc2loX2lzX250MjAwMyB8fCBbICIkY3NpaF9GT1JDRV9QUklWSUxFR0VEX1VTRVIiID0gInllcyIgXSApCi0gICAgICB0aGVuCi0JY3NpaF9pbmZvcm0gIk9uIFdpbmRvd3MgU2VydmVyIDIwMDMsIFdpbmRvd3MgVmlzdGEsIGFuZCBhYm92ZSwgdGhlIgotCWNzaWhfaW5mb3JtICJTWVNURU0gYWNjb3VudCBjYW5ub3Qgc2V0dWlkIHRvIG90aGVyIHVzZXJzIC0tIGEgY2FwYWJpbGl0eSIKLQljc2loX2luZm9ybSAic3NoZCByZXF1aXJlcy4gIFlvdSBuZWVkIHRvIGhhdmUgb3IgdG8gY3JlYXRlIGEgcHJpdmlsZWdlZCIKLQljc2loX2luZm9ybSAiYWNjb3VudC4gIFRoaXMgc2NyaXB0IHdpbGwgaGVscCB5b3UgZG8gc28uIgotCWVjaG8KLQotCVsgIiR7b3B0X2ZvcmNlfSIgPSAieWVzIiBdICYmIG9wdF9mPS1mCi0JWyAtbiAiJHt1c2VyX2FjY291bnR9IiBdICYmIG9wdF91PSItdSAiIiR7dXNlcl9hY2NvdW50fSIiIgotCWNzaWhfc2VsZWN0X3ByaXZpbGVnZWRfdXNlcm5hbWUgJHtvcHRfZn0gJHtvcHRfdX0gc3NoZAotCi0JaWYgISBjc2loX2NyZWF0ZV9wcml2aWxlZ2VkX3VzZXIgIiR7cGFzc3dvcmRfdmFsdWV9IgotCXRoZW4KLQkgIGNzaWhfZXJyb3JfcmVjb3ZlcmFibGUgIlRoZXJlIHdhcyBhIHNlcmlvdXMgcHJvYmxlbSBjcmVhdGluZyBhIHByaXZpbGVnZWQgdXNlci4iCi0JICBjc2loX3JlcXVlc3QgIkRvIHlvdSB3YW50IHRvIHByb2NlZWQgYW55d2F5PyIgfHwgZXhpdCAxCi0JICBsZXQgKytyZXQKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBOZXZlciByZXR1cm5zIGVtcHR5IGlmIE5UIG9yIGFib3ZlCi0gICAgICBydW5fc2VydmljZV9hcz0kKGNzaWhfc2VydmljZV9zaG91bGRfcnVuX2FzKQotCi0gICAgICBpZiBbICIke3J1bl9zZXJ2aWNlX2FzfSIgPSAiJHtjc2loX1BSSVZJTEVHRURfVVNFUk5BTUV9IiBdCi0gICAgICB0aGVuCi0JcGFzc3dvcmQ9IiR7Y3NpaF9QUklWSUxFR0VEX1BBU1NXT1JEfSIKLQlpZiBbIC16ICIke3Bhc3N3b3JkfSIgXQotCXRoZW4KLQkgIGNzaWhfZ2V0X3ZhbHVlICJQbGVhc2UgZW50ZXIgdGhlIHBhc3N3b3JkIGZvciB1c2VyICcke3J1bl9zZXJ2aWNlX2FzfSc6IiAiLXMiCi0JICBwYXNzd29yZD0iJHtjc2loX3ZhbHVlfSIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBBdCB0aGlzIHBvaW50LCB3ZSBlaXRoZXIgaGF2ZSAkcnVuX3NlcnZpY2VfYXMgPSAic3lzdGVtIiBhbmQKLSAgICAgICMgJHBhc3N3b3JkIGlzIGVtcHR5LCBvciAkcnVuX3NlcnZpY2VfYXMgaXMgc29tZSBwcml2aWxlZ2VkIHVzZXIgYW5kCi0gICAgICAjIChob3BlZnVsbHkpICRwYXNzd29yZCBjb250YWlucyB0aGUgY29ycmVjdCBwYXNzd29yZC4gIFNvLCBmcm9tIGhlcmUKLSAgICAgICMgb3V0LCB3ZSB1c2UgJy16ICIke3Bhc3N3b3JkfSInIHRvIGRpc2NyaW1pbmF0ZSB0aGUgdHdvIGNhc2VzLgotCi0gICAgICBjc2loX2NoZWNrX3VzZXIgIiR7cnVuX3NlcnZpY2VfYXN9IgotCi0gICAgICBpZiBbIC1uICIke2NzaWhfY3lnZW52fSIgXQotICAgICAgdGhlbgotCWN5Z3dpbl9lbnY9KCAtZSAiQ1lHV0lOPSR7Y3NpaF9jeWdlbnZ9IiApCi0gICAgICBmaQotICAgICAgaWYgWyAteiAiJHtwYXNzd29yZH0iIF0KLSAgICAgIHRoZW4KLQlpZiAvdXNyL2Jpbi9jeWdydW5zcnYgLUkgc3NoZCAtZCAiQ1lHV0lOIHNzaGQiIC1wIC91c3Ivc2Jpbi9zc2hkIFwKLQkJCSAgICAgIC1hICItRCIgLXkgdGNwaXAgIiR7Y3lnd2luX2VudltAXX0iCi0JdGhlbgotCSAgZWNobwotCSAgY3NpaF9pbmZvcm0gIlRoZSBzc2hkIHNlcnZpY2UgaGFzIGJlZW4gaW5zdGFsbGVkIHVuZGVyIHRoZSBMb2NhbFN5c3RlbSIKLQkgIGNzaWhfaW5mb3JtICJhY2NvdW50IChhbHNvIGtub3duIGFzIFNZU1RFTSkuIFRvIHN0YXJ0IHRoZSBzZXJ2aWNlIG5vdywgY2FsbCIKLQkgIGNzaWhfaW5mb3JtICJcYG5ldCBzdGFydCBzc2hkJyBvciBcYGN5Z3J1bnNydiAtUyBzc2hkJy4gIE90aGVyd2lzZSwgaXQiCi0JICBjc2loX2luZm9ybSAid2lsbCBzdGFydCBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBuZXh0IHJlYm9vdC4iCi0JZmkKLSAgICAgIGVsc2UKLQlpZiAvdXNyL2Jpbi9jeWdydW5zcnYgLUkgc3NoZCAtZCAiQ1lHV0lOIHNzaGQiIC1wIC91c3Ivc2Jpbi9zc2hkIFwKLQkJCSAgICAgIC1hICItRCIgLXkgdGNwaXAgIiR7Y3lnd2luX2VudltAXX0iIFwKLQkJCSAgICAgIC11ICIke3J1bl9zZXJ2aWNlX2FzfSIgLXcgIiR7cGFzc3dvcmR9IgotCXRoZW4KLQkgIGVjaG8KLQkgIGNzaWhfaW5mb3JtICJUaGUgc3NoZCBzZXJ2aWNlIGhhcyBiZWVuIGluc3RhbGxlZCB1bmRlciB0aGUgJyR7cnVuX3NlcnZpY2VfYXN9JyIKLQkgIGNzaWhfaW5mb3JtICJhY2NvdW50LiAgVG8gc3RhcnQgdGhlIHNlcnZpY2Ugbm93LCBjYWxsIFxgbmV0IHN0YXJ0IHNzaGQnIG9yIgotCSAgY3NpaF9pbmZvcm0gIlxgY3lncnVuc3J2IC1TIHNzaGQnLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIHN0YXJ0IGF1dG9tYXRpY2FsbHkiCi0JICBjc2loX2luZm9ybSAiYWZ0ZXIgdGhlIG5leHQgcmVib290LiIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgL3Vzci9iaW4vY3lncnVuc3J2IC1RIHNzaGQgPi9kZXYvbnVsbCAyPiYxCi0gICAgICB0aGVuCi0JY2hlY2tfc2VydmljZV9maWxlc19vd25lcnNoaXAgIiR7cnVuX3NlcnZpY2VfYXN9IiB8fCBsZXQgcmV0Kz0kPwotICAgICAgZWxzZQotCWNzaWhfZXJyb3JfcmVjb3ZlcmFibGUgIkluc3RhbGxpbmcgc3NoZCBhcyBhIHNlcnZpY2UgZmFpbGVkISIKLQlsZXQgKytyZXQKLSAgICAgIGZpCi0gICAgZmkgIyB1c2VyIGFsbG93ZWQgdXMgdG8gaW5zdGFsbCBhcyBzZXJ2aWNlCi0gIGZpICMgc2VydmljZSBub3QgeWV0IGluc3RhbGxlZAotICByZXR1cm4gJHJldAotfSAjIC0tLSBFbmQgb2YgaW5zdGFsbF9zZXJ2aWNlIC0tLSAjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBNYWluIEVudHJ5IFBvaW50Ci0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBDaGVjayBob3cgdGhlIHNjcmlwdCBoYXMgYmVlbiBzdGFydGVkLiAgSWYKLSMgICAoMSkgaXQgaGFzIGJlZW4gc3RhcnRlZCBieSBnaXZpbmcgdGhlIGZ1bGwgcGF0aCBhbmQKLSMgICAgICAgdGhhdCBwYXRoIGlzIC9ldGMvcG9zdGluc3RhbGwsIE9SCi0jICAgKDIpIE90aGVyd2lzZSwgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0jICAgICAgIFNTSF9IT1NUX0NPTkZJR19BVVRPX0FOU1dFUl9OTyBpcyBzZXQKLSMgdGhlbiBzZXQgYXV0b19hbnN3ZXIgdG8gIm5vIi4gIFRoaXMgYWxsb3dzIGF1dG9tYXRpYwotIyBjcmVhdGlvbiBvZiB0aGUgY29uZmlnIGZpbGVzIGluIC9ldGMgdy9vIG92ZXJ3cml0aW5nCi0jIHRoZW0gaWYgdGhleSBhbHJlYWR5IGV4aXN0LiAgSW4gYm90aCBjYXNlcywgY29sb3IKLSMgZXNjYXBlIHNlcXVlbmNlcyBhcmUgc3VwcHJlc3NlZCwgc28gYXMgdG8gcHJldmVudAotIyBjbHV0dGVyaW5nIHNldHVwJ3MgbG9nZmlsZXMuCi1pZiBbICIkUFJPR0RJUiIgPSAiL2V0Yy9wb3N0aW5zdGFsbCIgXQotdGhlbgotICBjc2loX2F1dG9fYW5zd2VyPSJubyIKLSAgY3NpaF9kaXNhYmxlX2NvbG9yCi0gIG9wdF9mb3JjZT15ZXMKLWZpCi1pZiBbIC1uICIke1NTSF9IT1NUX0NPTkZJR19BVVRPX0FOU1dFUl9OT30iIF0KLXRoZW4KLSAgY3NpaF9hdXRvX2Fuc3dlcj0ibm8iCi0gIGNzaWhfZGlzYWJsZV9jb2xvcgotICBvcHRfZm9yY2U9eWVzCi1maQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgUGFyc2Ugb3B0aW9ucwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci13aGlsZSA6Ci1kbwotICBjYXNlICQjIGluCi0gIDApCi0gICAgYnJlYWsKLSAgICA7OwotICBlc2FjCi0KLSAgb3B0aW9uPSQxCi0gIHNoaWZ0Ci0KLSAgY2FzZSAiJHtvcHRpb259IiBpbgotICAtZCB8IC0tZGVidWcgKQotICAgIHNldCAteAotICAgIGNzaWhfdHJhY2Vfb24KLSAgICA7OwotCi0gIC15IHwgLS15ZXMgKQotICAgIGNzaWhfYXV0b19hbnN3ZXI9eWVzCi0gICAgb3B0X2ZvcmNlPXllcwotICAgIDs7Ci0KLSAgLW4gfCAtLW5vICkKLSAgICBjc2loX2F1dG9fYW5zd2VyPW5vCi0gICAgb3B0X2ZvcmNlPXllcwotICAgIDs7Ci0KLSAgLWMgfCAtLWN5Z3dpbiApCi0gICAgY3lnd2luX3ZhbHVlPSIkMSIKLSAgICBzaGlmdAotICAgIDs7Ci0KLSAgLXAgfCAtLXBvcnQgKQotICAgIHBvcnRfbnVtYmVyPSQxCi0gICAgc2hpZnQKLSAgICA7OwotCi0gIC11IHwgLS11c2VyICkKLSAgICB1c2VyX2FjY291bnQ9IiQxIgotICAgIHNoaWZ0Ci0gICAgOzsKLSAgICAKLSAgLXcgfCAtLXB3ZCApCi0gICAgcGFzc3dvcmRfdmFsdWU9IiQxIgotICAgIHNoaWZ0Ci0gICAgOzsKLQotICAtLXByaXZpbGVnZWQgKQotICAgIGNzaWhfRk9SQ0VfUFJJVklMRUdFRF9VU0VSPXllcwotICAgIDs7Ci0KLSAgKikKLSAgICBlY2hvICJ1c2FnZTogJHtwcm9nbmFtZX0gW09QVElPTl0uLi4iCi0gICAgZWNobwotICAgIGVjaG8gIlRoaXMgc2NyaXB0IGNyZWF0ZXMgYW4gT3BlblNTSCBob3N0IGNvbmZpZ3VyYXRpb24uIgotICAgIGVjaG8KLSAgICBlY2hvICJPcHRpb25zOiIKLSAgICBlY2hvICIgIC0tZGVidWcgIC1kICAgICAgICAgICAgRW5hYmxlIHNoZWxsJ3MgZGVidWcgb3V0cHV0LiIKLSAgICBlY2hvICIgIC0teWVzICAgIC15ICAgICAgICAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCBcInllc1wiIGF1dG9tYXRpY2FsbHkuIgotICAgIGVjaG8gIiAgLS1ubyAgICAgLW4gICAgICAgICAgICBBbnN3ZXIgYWxsIHF1ZXN0aW9ucyB3aXRoIFwibm9cIiBhdXRvbWF0aWNhbGx5LiIKLSAgICBlY2hvICIgIC0tY3lnd2luIC1jIDxvcHRpb25zPiAgVXNlIFwib3B0aW9uc1wiIGFzIHZhbHVlIGZvciBDWUdXSU4gZW52aXJvbm1lbnQgdmFyLiIKLSAgICBlY2hvICIgIC0tcG9ydCAgIC1wIDxuPiAgICAgICAgc3NoZCBsaXN0ZW5zIG9uIHBvcnQgbi4iCi0gICAgZWNobyAiICAtLXVzZXIgICAtdSA8YWNjb3VudD4gIHByaXZpbGVnZWQgdXNlciBmb3Igc2VydmljZS4iCi0gICAgZWNobyAiICAtLXB3ZCAgICAtdyA8cGFzc3dkPiAgIFVzZSBcInB3ZFwiIGFzIHBhc3N3b3JkIGZvciBwcml2aWxlZ2VkIHVzZXIuIgotICAgIGVjaG8gIiAgLS1wcml2aWxlZ2VkICAgICAgICAgICBPbiBXaW5kb3dzIE5ULzJrL1hQLCByZXF1aXJlIHByaXZpbGVnZWQgdXNlciIKLSAgICBlY2hvICIgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBMb2NhbFN5c3RlbSBmb3Igc3NoZCBzZXJ2aWNlLiIKLSAgICBlY2hvCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBBY3Rpb24hCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBDaGVjayBmb3IgcnVubmluZyBzc2gvc3NoZCBwcm9jZXNzZXMgZmlyc3QuIFJlZnVzZSB0byBkbyBhbnl0aGluZyB3aGlsZQotIyBzb21lIHNzaCBwcm9jZXNzZXMgYXJlIHN0aWxsIHJ1bm5pbmcKLWlmIC91c3IvYmluL3BzIC1lZiB8IC91c3IvYmluL2dyZXAgLXEgJy9zc2hkXD8kJwotdGhlbgotICBlY2hvCi0gIGNzaWhfZXJyb3IgIlRoZXJlIGFyZSBzdGlsbCBzc2ggcHJvY2Vzc2VzIHJ1bm5pbmcuIFBsZWFzZSBzaHV0IHRoZW0gZG93biBmaXJzdC4iCi1maQotCi0jIE1ha2Ugc3VyZSB0aGUgdXNlciBpcyBydW5uaW5nIGluIGFuIGFkbWluaXN0cmF0aXZlIGNvbnRleHQKLWFkbWluPSQoL3Vzci9iaW4vaWQgLUcgfCAvdXNyL2Jpbi9ncmVwIC1FcSAnXDw1NDRcPicgJiYgZWNobyB5ZXMgfHwgZWNobyBubykKLWlmIFsgIiR7YWRtaW59IiAhPSAieWVzIiBdCi10aGVuCi0gIGVjaG8KLSAgY3NpaF93YXJuaW5nICJSdW5uaW5nIHRoaXMgc2NyaXB0IHR5cGljYWxseSByZXF1aXJlcyBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMhIgotICBjc2loX3dhcm5pbmcgIkhvd2V2ZXIsIGl0IHNlZW1zIHlvdXIgYWNjb3VudCBkb2VzIG5vdCBoYXZlIHRoZXNlIHByaXZpbGVnZXMuIgotICBjc2loX3dhcm5pbmcgIkhlcmUncyB0aGUgbGlzdCBvZiBncm91cHMgaW4geW91ciB1c2VyIHRva2VuOiIKLSAgZWNobwotICBmb3IgaSBpbiAkKC91c3IvYmluL2lkIC1HKQotICBkbwotICAgIC91c3IvYmluL2F3ayAtRjogIi9bXjpdKjpbXjpdKjokaToveyBwcmludCBcIiAgICBcIiBcJDE7IH0iIC9ldGMvZ3JvdXAKLSAgZG9uZQotICBlY2hvCi0gIGNzaWhfd2FybmluZyAiVGhpcyB1c3VhbGx5IG1lYW5zIHlvdSdyZSBydW5uaW5nIHRoaXMgc2NyaXB0IGZyb20gYSBub24tYWRtaW4iCi0gIGNzaWhfd2FybmluZyAiZGVza3RvcCBzZXNzaW9uLCBvciBpbiBhIG5vbi1lbGV2YXRlZCBzaGVsbCB1bmRlciBVQUMgY29udHJvbC4iCi0gIGVjaG8KLSAgY3NpaF93YXJuaW5nICJNYWtlIHN1cmUgeW91IGhhdmUgdGhlIGFwcHJvcHJpYXRlIHByaXZpbGVnZXMgcmlnaHQgbm93LCIKLSAgY3NpaF93YXJuaW5nICJvdGhlcndpc2UgcGFydHMgb2YgdGhpcyBzY3JpcHQgd2lsbCBwcm9iYWJseSBmYWlsISIKLSAgZWNobwotICBlY2hvIC1lICIke19jc2loX1FVRVJZX1NUUn0gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPyAgKFNheSBcIm5vXCIgaWYgeW91J3JlIG5vdCBzdXJlIgotICBpZiAhIGNzaWhfcmVxdWVzdCAieW91IGhhdmUgdGhlIHJlcXVpcmVkIHByaXZpbGVnZXMpIgotICB0aGVuCi0gICAgZWNobwotICAgIGNzaWhfaW5mb3JtICJPay4gIEV4aXRpbmcuICBNYWtlIHN1cmUgdG8gc3dpdGNoIHRvIGFuIGFkbWluaXN0cmF0aXZlIGFjY291bnQiCi0gICAgY3NpaF9pbmZvcm0gIm9yIHRvIHN0YXJ0IHRoaXMgc2NyaXB0IGZyb20gYW4gZWxldmF0ZWQgc2hlbGwuIgotICAgIGV4aXQgMQotICBmaQotZmkKLQotZWNobwotCi13YXJuaW5nX2NudD0wCi0KLSMgQ2hlY2sgZm9yICR7U1lTQ09ORkRJUn0gZGlyZWN0b3J5Ci1jc2loX21ha2VfZGlyICIke1NZU0NPTkZESVJ9IiAiQ2Fubm90IGNyZWF0ZSBnbG9iYWwgY29uZmlndXJhdGlvbiBmaWxlcy4iCi1pZiAhIC91c3IvYmluL2NobW9kIDc3NSAiJHtTWVNDT05GRElSfSIgPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGNzaWhfd2FybmluZyAiQ2FuJ3Qgc2V0IHBlcm1pc3Npb25zIG9uICR7U1lTQ09ORkRJUn0hIgotICBsZXQgKyt3YXJuaW5nX2NudAotZmkKLWlmICEgL3Vzci9iaW4vc2V0ZmFjbCAtbSB1OnN5c3RlbTpyd3ggIiR7U1lTQ09ORkRJUn0iID4vZGV2L251bGwgMj4mMQotdGhlbgotICBjc2loX3dhcm5pbmcgIkNhbid0IHNldCBleHRlbmRlZCBwZXJtaXNzaW9ucyBvbiAke1NZU0NPTkZESVJ9ISIKLSAgbGV0ICsrd2FybmluZ19jbnQKLWZpCi0KLSMgQ2hlY2sgZm9yIC92YXIvbG9nIGRpcmVjdG9yeQotY3NpaF9tYWtlX2RpciAiJHtMT0NBTFNUQVRFRElSfS9sb2ciICJDYW5ub3QgY3JlYXRlIGxvZyBkaXJlY3RvcnkuIgotaWYgISAvdXNyL2Jpbi9jaG1vZCA3NzUgIiR7TE9DQUxTVEFURURJUn0vbG9nIiA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgY3NpaF93YXJuaW5nICJDYW4ndCBzZXQgcGVybWlzc2lvbnMgb24gJHtMT0NBTFNUQVRFRElSfS9sb2chIgotICBsZXQgKyt3YXJuaW5nX2NudAotZmkKLWlmICEgL3Vzci9iaW4vc2V0ZmFjbCAtbSB1OnN5c3RlbTpyd3ggIiR7TE9DQUxTVEFURURJUn0vbG9nIiA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgY3NpaF93YXJuaW5nICJDYW4ndCBzZXQgZXh0ZW5kZWQgcGVybWlzc2lvbnMgb24gJHtMT0NBTFNUQVRFRElSfS9sb2chIgotICBsZXQgKyt3YXJuaW5nX2NudAotZmkKLQotIyBDcmVhdGUgL3Zhci9sb2cvbGFzdGxvZyBpZiBub3QgYWxyZWFkeSBleGlzdHMKLWlmIFsgLWUgJHtMT0NBTFNUQVRFRElSfS9sb2cvbGFzdGxvZyAtYSAhIC1mICR7TE9DQUxTVEFURURJUn0vbG9nL2xhc3Rsb2cgXQotdGhlbgotICBlY2hvCi0gIGNzaWhfZXJyb3JfbXVsdGkgIiR7TE9DQUxTVEFURURJUn0vbG9nL2xhc3Rsb2cgZXhpc3RzLCBidXQgaXMgbm90IGEgZmlsZS4iIFwKLQkJICAgIkNhbm5vdCBjcmVhdGUgc3NoIGhvc3QgY29uZmlndXJhdGlvbi4iCi1maQotaWYgWyAhIC1lICR7TE9DQUxTVEFURURJUn0vbG9nL2xhc3Rsb2cgXQotdGhlbgotICAvdXNyL2Jpbi9jYXQgL2Rldi9udWxsID4gJHtMT0NBTFNUQVRFRElSfS9sb2cvbGFzdGxvZwotICBpZiAhIC91c3IvYmluL2NobW9kIDY0NCAke0xPQ0FMU1RBVEVESVJ9L2xvZy9sYXN0bG9nID4vZGV2L251bGwgMj4mMQotICB0aGVuCi0gICAgY3NpaF93YXJuaW5nICJDYW4ndCBzZXQgcGVybWlzc2lvbnMgb24gJHtMT0NBTFNUQVRFRElSfS9sb2cvbGFzdGxvZyEiCi0gICAgbGV0ICsrd2FybmluZ19jbnQKLSAgZmkKLWZpCi0KLSMgQ3JlYXRlIC92YXIvZW1wdHkgZmlsZSB1c2VkIGFzIGNocm9vdCBqYWlsIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbgotY3NpaF9tYWtlX2RpciAiJHtMT0NBTFNUQVRFRElSfS9lbXB0eSIgIkNhbm5vdCBjcmVhdGUgJHtMT0NBTFNUQVRFRElSfS9lbXB0eSBkaXJlY3RvcnkuIgotaWYgISAvdXNyL2Jpbi9jaG1vZCA3NTUgIiR7TE9DQUxTVEFURURJUn0vZW1wdHkiID4vZGV2L251bGwgMj4mMQotdGhlbgotICBjc2loX3dhcm5pbmcgIkNhbid0IHNldCBwZXJtaXNzaW9ucyBvbiAke0xPQ0FMU1RBVEVESVJ9L2VtcHR5ISIKLSAgbGV0ICsrd2FybmluZ19jbnQKLWZpCi1pZiAhIC91c3IvYmluL3NldGZhY2wgLW0gdTpzeXN0ZW06cnd4ICIke0xPQ0FMU1RBVEVESVJ9L2VtcHR5IiA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgY3NpaF93YXJuaW5nICJDYW4ndCBzZXQgZXh0ZW5kZWQgcGVybWlzc2lvbnMgb24gJHtMT0NBTFNUQVRFRElSfS9lbXB0eSEiCi0gIGxldCArK3dhcm5pbmdfY250Ci1maQotCi0jIGhvc3Qga2V5cwotY3JlYXRlX2hvc3Rfa2V5cyB8fCBsZXQgd2FybmluZ19jbnQrPSQ/Ci0KLSMgaGFuZGxlIHNzaF9jb25maWcKLWNzaWhfaW5zdGFsbF9jb25maWcgIiR7U1lTQ09ORkRJUn0vc3NoX2NvbmZpZyIgIiR7U1lTQ09ORkRJUn0vZGVmYXVsdHMiIHx8IGxldCArK3dhcm5pbmdfY250Ci1pZiAvdXNyL2Jpbi9jbXAgIiR7U1lTQ09ORkRJUn0vc3NoX2NvbmZpZyIgIiR7U1lTQ09ORkRJUn0vZGVmYXVsdHMvJHtTWVNDT05GRElSfS9zc2hfY29uZmlnIiA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgaWYgWyAiJHtwb3J0X251bWJlcn0iICE9ICIyMiIgXQotICB0aGVuCi0gICAgY3NpaF9pbmZvcm0gIlVwZGF0aW5nICR7U1lTQ09ORkRJUn0vc3NoX2NvbmZpZyBmaWxlIHdpdGggcmVxdWVzdGVkIHBvcnQiCi0gICAgZWNobyAiSG9zdCBsb2NhbGhvc3QiID4+ICR7U1lTQ09ORkRJUn0vc3NoX2NvbmZpZwotICAgIGVjaG8gIiAgICBQb3J0ICR7cG9ydF9udW1iZXJ9IiA+PiAke1NZU0NPTkZESVJ9L3NzaF9jb25maWcKLSAgZmkKLWZpCi0KLSMgaGFuZGxlIHNzaGRfY29uZmlnIChhbmQgcHJpdnNlcCkKLWNzaWhfaW5zdGFsbF9jb25maWcgIiR7U1lTQ09ORkRJUn0vc3NoZF9jb25maWciICIke1NZU0NPTkZESVJ9L2RlZmF1bHRzIiB8fCBsZXQgKyt3YXJuaW5nX2NudAotaWYgISAvdXNyL2Jpbi9jbXAgIiR7U1lTQ09ORkRJUn0vc3NoZF9jb25maWciICIke1NZU0NPTkZESVJ9L2RlZmF1bHRzLyR7U1lTQ09ORkRJUn0vc3NoZF9jb25maWciID4vZGV2L251bGwgMj4mMQotdGhlbgotICAvdXNyL2Jpbi9ncmVwIC1xIFVzZVByaXZpbGVnZVNlcGFyYXRpb24gJHtTWVNDT05GRElSfS9zc2hkX2NvbmZpZyAmJiBwcml2c2VwX2NvbmZpZ3VyZWQ9eWVzCi1maQotc3NoZF9wcml2c2VwIHx8IGxldCB3YXJuaW5nX2NudCs9JD8KLQotdXBkYXRlX3NlcnZpY2VzX2ZpbGUgfHwgbGV0IHdhcm5pbmdfY250Kz0kPwotdXBkYXRlX2luZXRkX2NvbmYgfHwgbGV0IHdhcm5pbmdfY250Kz0kPwotaW5zdGFsbF9zZXJ2aWNlIHx8IGxldCB3YXJuaW5nX2NudCs9JD8KLQotZWNobwotaWYgWyAkd2FybmluZ19jbnQgLWVxIDAgXQotdGhlbgotICBjc2loX2luZm9ybSAiSG9zdCBjb25maWd1cmF0aW9uIGZpbmlzaGVkLiBIYXZlIGZ1biEiCi1lbHNlCi0gIGNzaWhfd2FybmluZyAiSG9zdCBjb25maWd1cmF0aW9uIGV4aXRlZCB3aXRoICR7d2FybmluZ19jbnR9IGVycm9ycyBvciB3YXJuaW5ncyEiCi0gIGNzaWhfd2FybmluZyAiTWFrZSBzdXJlIHRoYXQgYWxsIHByb2JsZW1zIHJlcG9ydGVkIGFyZSBmaXhlZCwiCi0gIGNzaWhfd2FybmluZyAidGhlbiByZS1ydW4gc3NoLWhvc3QtY29uZmlnLiIKLWZpCi1leGl0ICR3YXJuaW5nX2NudApkaWZmIC0tZ2l0IGEvY29udHJpYi9jeWd3aW4vc3NoLXVzZXItY29uZmlnIGIvY29udHJpYi9jeWd3aW4vc3NoLXVzZXItY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjdhZTYwLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvY3lnd2luL3NzaC11c2VyLWNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBzc2gtdXNlci1jb25maWcsIENvcHlyaWdodCAyMDAwLTIwMDggUmVkIEhhdCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDeWd3aW4gcG9ydCBvZiBPcGVuU1NILgotIwotIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotIwotIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgCi0jIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAKLSMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgIAotIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgCi0jIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAKLSMgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgIAotIyBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBJbml0aWFsaXphdGlvbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1QUk9HTkFNRT0kKGJhc2VuYW1lIC0tICQwKQotX3RkaXI9JChkaXJuYW1lIC0tICQwKQotUFJPR0RJUj0kKGNkICRfdGRpciAmJiBwd2QpCi0KLUNTSUhfU0NSSVBUPS91c3Ivc2hhcmUvY3NpaC9jeWd3aW4tc2VydmljZS1pbnN0YWxsYXRpb24taGVscGVyLnNoCi0KLSMgU3ViZGlyZWN0b3J5IHdoZXJlIHRoZSBuZXcgcGFja2FnZSBpcyBiZWluZyBpbnN0YWxsZWQKLVBSRUZJWD0vdXNyCi0KLSMgRGlyZWN0b3J5IHdoZXJlIHRoZSBjb25maWcgZmlsZXMgYXJlIHN0b3JlZAotU1lTQ09ORkRJUj0vZXRjCi0KLXNvdXJjZSAke0NTSUhfU0NSSVBUfQotCi1hdXRvX3Bhc3NwaHJhc2U9Im5vIgotcGFzc3BocmFzZT0iIgotcHdkaG9tZT0KLXdpdGhfcGFzc3BocmFzZT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFJvdXRpbmU6IGNyZWF0ZV9pZGVudGl0eQotIyAgIG9wdGlvbmFsbHkgY3JlYXRlIGlkZW50aXR5IG9mIHR5cGUgYXJndW1lbnQgaW4gfi8uc3NoCi0jICAgb3B0aW9uYWxseSBhZGQgcmVzdWx0IHRvIH4vLnNzaC9hdXRob3JpemVkX2tleXMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotY3JlYXRlX2lkZW50aXR5KCkgewotICBsb2NhbCBmaWxlPSIkMSIKLSAgbG9jYWwgdHlwZT0iJDIiCi0gIGxvY2FsIG5hbWU9IiQzIgotICBpZiBbICEgLWYgIiR7cHdkaG9tZX0vLnNzaC8ke2ZpbGV9IiBdCi0gIHRoZW4KLSAgICBpZiBjc2loX3JlcXVlc3QgIlNoYWxsIEkgY3JlYXRlIGEgJHtuYW1lfSBpZGVudGl0eSBmaWxlIGZvciB5b3U/IgotICAgIHRoZW4KLSAgICAgIGNzaWhfaW5mb3JtICJHZW5lcmF0aW5nICR7cHdkaG9tZX0vLnNzaC8ke2ZpbGV9IgotICAgICAgaWYgWyAiJHt3aXRoX3Bhc3NwaHJhc2V9IiA9ICJ5ZXMiIF0KLSAgICAgIHRoZW4KLSAgICAgICAgc3NoLWtleWdlbiAtdCAiJHt0eXBlfSIgLU4gIiR7cGFzc3BocmFzZX0iIC1mICIke3B3ZGhvbWV9Ly5zc2gvJHtmaWxlfSIgPiAvZGV2L251bGwKLSAgICAgIGVsc2UKLSAgICAgICAgc3NoLWtleWdlbiAtdCAiJHt0eXBlfSIgLWYgIiR7cHdkaG9tZX0vLnNzaC8ke2ZpbGV9IiA+IC9kZXYvbnVsbAotICAgICAgZmkKLSAgICAgIGlmIGNzaWhfcmVxdWVzdCAiRG8geW91IHdhbnQgdG8gdXNlIHRoaXMgaWRlbnRpdHkgdG8gbG9naW4gdG8gdGhpcyBtYWNoaW5lPyIKLSAgICAgIHRoZW4KLSAgICAgICAgY3NpaF9pbmZvcm0gIkFkZGluZyB0byAke3B3ZGhvbWV9Ly5zc2gvYXV0aG9yaXplZF9rZXlzIgotICAgICAgICBjYXQgIiR7cHdkaG9tZX0vLnNzaC8ke2ZpbGV9LnB1YiIgPj4gIiR7cHdkaG9tZX0vLnNzaC9hdXRob3JpemVkX2tleXMiCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi19ICMgPT09IEVuZCBvZiBjcmVhdGVfc3NoMV9pZGVudGl0eSgpID09PSAjCi1yZWFkb25seSAtZiBjcmVhdGVfaWRlbnRpdHkKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFJvdXRpbmU6IGNoZWNrX3VzZXJfaG9tZWRpcgotIyAgIFBlcmZvcm0gdmFyaW91cyBjaGVja3Mgb24gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeQotIyBTRVRTIEdMT0JBTCBWQVJJQUJMRToKLSMgICBwd2Rob21lCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWNoZWNrX3VzZXJfaG9tZWRpcigpIHsKLSAgbG9jYWwgdWlkPSQoaWQgLXUpCi0gIHB3ZGhvbWU9JChhd2sgLUY6ICd7IGlmICggJDMgPT0gJyR7dWlkfScgKSBwcmludCAkNjsgfScgPCAke1NZU0NPTkZESVJ9L3Bhc3N3ZCkKLSAgaWYgWyAiWCR7cHdkaG9tZX0iID0gIlgiIF0KLSAgdGhlbgotICAgIGNzaWhfZXJyb3JfbXVsdGkgXAotICAgICAgIlRoZXJlIGlzIG5vIGhvbWUgZGlyZWN0b3J5IHNldCBmb3IgeW91IGluICR7U1lTQ09ORkRJUn0vcGFzc3dkLiIgXAotICAgICAgJ1NldHRpbmcgJEhPTUUgaXMgbm90IHN1ZmZpY2llbnQhJwotICBmaQotICAKLSAgaWYgWyAhIC1kICIke3B3ZGhvbWV9IiBdCi0gIHRoZW4KLSAgICBjc2loX2Vycm9yX211bHRpIFwKLSAgICAgICIke3B3ZGhvbWV9IGlzIHNldCBpbiAke1NZU0NPTkZESVJ9L3Bhc3N3ZCBhcyB5b3VyIGhvbWUgZGlyZWN0b3J5IiBcCi0gICAgICAnYnV0IGl0IGlzIG5vdCBhIHZhbGlkIGRpcmVjdG9yeS4gQ2Fubm90IGNyZWF0ZSB1c2VyIGlkZW50aXR5IGZpbGVzLicKLSAgZmkKLSAgCi0gICMgSWYgaG9tZSBpcyB0aGUgcm9vdCBkaXIsIHNldCBob21lIHRvIGVtcHR5IHN0cmluZyB0byBhdm9pZCBlcnJvciBtZXNzYWdlcwotICAjIGluIHN1YnNlcXVlbnQgcGFydHMgb2YgdGhhdCBzY3JpcHQuCi0gIGlmIFsgIlgke3B3ZGhvbWV9IiA9ICJYLyIgXQotICB0aGVuCi0gICAgIyBCdXQgZmlyc3QgcmFpc2UgYSB3YXJuaW5nIQotICAgIGNzaWhfd2FybmluZyAiWW91ciBob21lIGRpcmVjdG9yeSBpbiAke1NZU0NPTkZESVJ9L3Bhc3N3ZCBpcyBzZXQgdG8gcm9vdCAoLykuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkISIKLSAgICBpZiBjc2loX3JlcXVlc3QgIldvdWxkIHlvdSBsaWtlIHRvIHByb2NlZWQgYW55d2F5PyIKLSAgICB0aGVuCi0gICAgICBwd2Rob21lPScnCi0gICAgZWxzZQotICAgICAgY3NpaF93YXJuaW5nICJFeGl0aW5nLiBDb25maWd1cmF0aW9uIGlzIG5vdCBjb21wbGV0ZSIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0gIGZpCi0gIAotICBpZiBbIC1kICIke3B3ZGhvbWV9IiAtYSBjc2loX2lzX250IC1hIC1uICJgY2htb2QgLWMgZy13LG8tdyAiJHtwd2Rob21lfSJgIiBdCi0gIHRoZW4KLSAgICBlY2hvCi0gICAgY3NpaF93YXJuaW5nICdncm91cCBhbmQgb3RoZXIgaGF2ZSBiZWVuIHJldm9rZWQgd3JpdGUgcGVybWlzc2lvbiB0byB5b3VyIGhvbWUnCi0gICAgY3NpaF93YXJuaW5nICJkaXJlY3RvcnkgJHtwd2Rob21lfS4iCi0gICAgY3NpaF93YXJuaW5nICdUaGlzIGlzIHJlcXVpcmVkIGJ5IE9wZW5TU0ggdG8gYWxsb3cgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiB1c2luZycKLSAgICBjc2loX3dhcm5pbmcgJ3RoZSBrZXkgZmlsZXMgc3RvcmVkIGluIHlvdXIgLnNzaCBzdWJkaXJlY3RvcnkuJwotICAgIGNzaWhfd2FybmluZyAnUmV2ZXJ0IHRoaXMgY2hhbmdlIE9OTFkgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIScKLSAgICBlY2hvCi0gIGZpCi19ICMgPT09IEVuZCBvZiBjaGVja191c2VyX2hvbWVkaXIoKSA9PT0gIwotcmVhZG9ubHkgLWYgY2hlY2tfdXNlcl9ob21lZGlyCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBSb3V0aW5lOiBjaGVja191c2VyX2RvdF9zc2hfZGlyCi0jICAgUGVyZm9ybSB2YXJpb3VzIGNoZWNrcyBvbiB0aGUgfi8uc3NoIGRpcmVjdG9yeQotIyBQUkVSRVFVSVNJVEU6Ci0jICAgcHdkaG9tZSAtLSBjaGVja191c2VyX2hvbWVkaXIoKQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1jaGVja191c2VyX2RvdF9zc2hfZGlyKCkgewotICBpZiBbIC1lICIke3B3ZGhvbWV9Ly5zc2giIC1hICEgLWQgIiR7cHdkaG9tZX0vLnNzaCIgXQotICB0aGVuCi0gICAgY3NpaF9lcnJvciAiJHtwd2Rob21lfS8uc3NoIGlzIGV4aXN0YW50IGJ1dCBub3QgYSBkaXJlY3RvcnkuIENhbm5vdCBjcmVhdGUgdXNlciBpZGVudGl0eSBmaWxlcy4iCi0gIGZpCi0gIAotICBpZiBbICEgLWUgIiR7cHdkaG9tZX0vLnNzaCIgXQotICB0aGVuCi0gICAgbWtkaXIgIiR7cHdkaG9tZX0vLnNzaCIKLSAgICBpZiBbICEgLWUgIiR7cHdkaG9tZX0vLnNzaCIgXQotICAgIHRoZW4KLSAgICAgIGNzaWhfZXJyb3IgIkNyZWF0aW5nIHVzZXJzICR7cHdkaG9tZX0vLnNzaCBkaXJlY3RvcnkgZmFpbGVkIgotICAgIGZpCi0gIGZpCi19ICMgPT09IEVuZCBvZiBjaGVja191c2VyX2RvdF9zc2hfZGlyKCkgPT09ICMKLXJlYWRvbmx5IC1mIGNoZWNrX3VzZXJfZG90X3NzaF9kaXIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFJvdXRpbmU6IGZpeF9hdXRob3JpemVkX2tleXNfcGVybXMKLSMgICBDb3JyZWN0cyB0aGUgcGVybWlzc2lvbnMgb2Ygfi8uc3NoL2F1dGhvcml6ZWRfa2V5cwotIyBQUkVSRVFVSVNJVEU6Ci0jICAgcHdkaG9tZSAgIC0tIGNoZWNrX3VzZXJfaG9tZWRpcigpCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWZpeF9hdXRob3JpemVkX2tleXNfcGVybXMoKSB7Ci0gIGlmIFsgY3NpaF9pc19udCAtYSAtZSAiJHtwd2Rob21lfS8uc3NoL2F1dGhvcml6ZWRfa2V5cyIgXQotICB0aGVuCi0gICAgaWYgISBzZXRmYWNsIC1tICJ1Ojpydy0sZzo6LS0tLG86Oi0tLSIgIiR7cHdkaG9tZX0vLnNzaC9hdXRob3JpemVkX2tleXMiCi0gICAgdGhlbgotICAgICAgY3NpaF93YXJuaW5nICJTZXR0aW5nIGNvcnJlY3QgcGVybWlzc2lvbnMgdG8gJHtwd2Rob21lfS8uc3NoL2F1dGhvcml6ZWRfa2V5cyIKLSAgICAgIGNzaWhfd2FybmluZyAiZmFpbGVkLiAgUGxlYXNlIGNhcmUgZm9yIHRoZSBjb3JyZWN0IHBlcm1pc3Npb25zLiAgVGhlIG1pbmltdW0gcmVxdWlyZW1lbnQiCi0gICAgICBjc2loX3dhcm5pbmcgImlzLCB0aGUgb3duZXIgbmVlZHMgcmVhZCBwZXJtaXNzaW9ucy4iCi0gICAgICBlY2hvCi0gICAgZmkKLSAgZmkKLX0gIyA9PT0gRW5kIG9mIGZpeF9hdXRob3JpemVkX2tleXNfcGVybXMoKSA9PT0gIwotcmVhZG9ubHkgLWYgZml4X2F1dGhvcml6ZWRfa2V5c19wZXJtcwotCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBNYWluIEVudHJ5IFBvaW50Ci0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBDaGVjayBob3cgdGhlIHNjcmlwdCBoYXMgYmVlbiBzdGFydGVkLiAgSWYKLSMgICAoMSkgaXQgaGFzIGJlZW4gc3RhcnRlZCBieSBnaXZpbmcgdGhlIGZ1bGwgcGF0aCBhbmQKLSMgICAgICAgdGhhdCBwYXRoIGlzIC9ldGMvcG9zdGluc3RhbGwsIE9SCi0jICAgKDIpIE90aGVyd2lzZSwgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0jICAgICAgIFNTSF9VU0VSX0NPTkZJR19BVVRPX0FOU1dFUl9OTyBpcyBzZXQKLSMgdGhlbiBzZXQgYXV0b19hbnN3ZXIgdG8gIm5vIi4gIFRoaXMgYWxsb3dzIGF1dG9tYXRpYwotIyBjcmVhdGlvbiBvZiB0aGUgY29uZmlnIGZpbGVzIGluIC9ldGMgdy9vIG92ZXJ3cml0aW5nCi0jIHRoZW0gaWYgdGhleSBhbHJlYWR5IGV4aXN0LiAgSW4gYm90aCBjYXNlcywgY29sb3IKLSMgZXNjYXBlIHNlcXVlbmNlcyBhcmUgc3VwcHJlc3NlZCwgc28gYXMgdG8gcHJldmVudAotIyBjbHV0dGVyaW5nIHNldHVwJ3MgbG9nZmlsZXMuCi1pZiBbICIkUFJPR0RJUiIgPSAiL2V0Yy9wb3N0aW5zdGFsbCIgXQotdGhlbgotICBjc2loX2F1dG9fYW5zd2VyPSJubyIKLSAgY3NpaF9kaXNhYmxlX2NvbG9yCi1maQotaWYgWyAtbiAiJHtTU0hfVVNFUl9DT05GSUdfQVVUT19BTlNXRVJfTk99IiBdCi10aGVuCi0gIGNzaWhfYXV0b19hbnN3ZXI9Im5vIgotICBjc2loX2Rpc2FibGVfY29sb3IKLWZpCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBQYXJzZSBvcHRpb25zCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXdoaWxlIDoKLWRvCi0gIGNhc2UgJCMgaW4KLSAgMCkKLSAgICBicmVhawotICAgIDs7Ci0gIGVzYWMKLQotICBvcHRpb249JDEKLSAgc2hpZnQKLQotICBjYXNlICIkb3B0aW9uIiBpbgotICAtZCB8IC0tZGVidWcgKQotICAgIHNldCAteAotICAgIGNzaWhfdHJhY2Vfb24KLSAgICA7OwotCi0gIC15IHwgLS15ZXMgKQotICAgIGNzaWhfYXV0b19hbnN3ZXI9eWVzCi0gICAgOzsKLQotICAtbiB8IC0tbm8gKQotICAgIGNzaWhfYXV0b19hbnN3ZXI9bm8KLSAgICA7OwotCi0gIC1wIHwgLS1wYXNzcGhyYXNlICkKLSAgICB3aXRoX3Bhc3NwaHJhc2U9InllcyIKLSAgICBwYXNzcGhyYXNlPSQxCi0gICAgc2hpZnQKLSAgICA7OwotCi0gIC0tcHJpdmlsZWdlZCApCi0gICAgY3NpaF9GT1JDRV9QUklWSUxFR0VEX1VTRVI9eWVzCi0gICAgOzsKLQotICAqKQotICAgIGVjaG8gInVzYWdlOiAke1BST0dOQU1FfSBbT1BUSU9OXS4uLiIKLSAgICBlY2hvCi0gICAgZWNobyAiVGhpcyBzY3JpcHQgY3JlYXRlcyBhbiBPcGVuU1NIIHVzZXIgY29uZmlndXJhdGlvbi4iCi0gICAgZWNobwotICAgIGVjaG8gIk9wdGlvbnM6IgotICAgIGVjaG8gIiAgICAtLWRlYnVnICAgICAgLWQgICAgICAgIEVuYWJsZSBzaGVsbCdzIGRlYnVnIG91dHB1dC4iCi0gICAgZWNobyAiICAgIC0teWVzICAgICAgICAteSAgICAgICAgQW5zd2VyIGFsbCBxdWVzdGlvbnMgd2l0aCBcInllc1wiIGF1dG9tYXRpY2FsbHkuIgotICAgIGVjaG8gIiAgICAtLW5vICAgICAgICAgLW4gICAgICAgIEFuc3dlciBhbGwgcXVlc3Rpb25zIHdpdGggXCJub1wiIGF1dG9tYXRpY2FsbHkuIgotICAgIGVjaG8gIiAgICAtLXBhc3NwaHJhc2UgLXAgd29yZCAgIFVzZSBcIndvcmRcIiBhcyBwYXNzcGhyYXNlIGF1dG9tYXRpY2FsbHkuIgotICAgIGVjaG8gIiAgICAtLXByaXZpbGVnZWQgICAgICAgICAgIE9uIFdpbmRvd3MgTlQvMmsvWFAsIGFzc3VtZSBwcml2aWxlZ2VkIHVzZXIiCi0gICAgZWNobyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBMb2NhbFN5c3RlbSBmb3Igc3NoZCBzZXJ2aWNlLiIKLSAgICBlY2hvCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBBY3Rpb24hCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBDaGVjayBwYXNzd2QgZmlsZQotaWYgWyAhIC1mICR7U1lTQ09ORkRJUn0vcGFzc3dkIF0KLXRoZW4KLSAgY3NpaF9lcnJvcl9tdWx0aSBcCi0gICAgIiR7U1lTQ09ORkRJUn0vcGFzc3dkIGlzIG5vbmV4aXN0YW50LiBQbGVhc2UgZ2VuZXJhdGUgYW4gJHtTWVNDT05GRElSfS9wYXNzd2QgZmlsZSIgXAotICAgICdmaXJzdCB1c2luZyBta3Bhc3N3ZC4gQ2hlY2sgaWYgaXQgY29udGFpbnMgYW4gZW50cnkgZm9yIHlvdSBhbmQnIFwKLSAgICAncGxlYXNlIGNhcmUgZm9yIHRoZSBob21lIGRpcmVjdG9yeSBpbiB5b3VyIGVudHJ5IGFzIHdlbGwuJwotZmkKLQotY2hlY2tfdXNlcl9ob21lZGlyCi1jaGVja191c2VyX2RvdF9zc2hfZGlyCi1jcmVhdGVfaWRlbnRpdHkgaWRfcnNhIHJzYSAiU1NIMiBSU0EiCi1jcmVhdGVfaWRlbnRpdHkgaWRfZHNhIGRzYSAiU1NIMiBEU0EiCi1jcmVhdGVfaWRlbnRpdHkgaWRfZWNkc2EgZWNkc2EgIlNTSDIgRUNEU0EiCi1jcmVhdGVfaWRlbnRpdHkgaWRlbnRpdHkgcnNhMSAiKGRlcHJlY2F0ZWQpIFNTSDEgUlNBIgotZml4X2F1dGhvcml6ZWRfa2V5c19wZXJtcwotCi1lY2hvCi1jc2loX2luZm9ybSAiQ29uZmlndXJhdGlvbiBmaW5pc2hlZC4gSGF2ZSBmdW4hIgotCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvY3lnd2luL3NzaGQtaW5ldGQgYi9jb250cmliL2N5Z3dpbi9zc2hkLWluZXRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTZiZjA3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvY3lnd2luL3NzaGQtaW5ldGQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgVGhpcyBmaWxlIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBzc2hkIGFzIGEgc2xhdmUgb2YgdGhlIGluZXRkIHNlcnZpY2UKLSMgVG8gZG8gc28sIHRoZSBsaW5lIGJlbG93IHNob3VsZCBiZSB1bmNvbW1lbnRlZC4KLUBDT01NRU5UQCBzc2ggIHN0cmVhbSAgdGNwICAgICBub3dhaXQgIHJvb3QgICAgL3Vzci9zYmluL3NzaGQgc3NoZCAtaQotCmRpZmYgLS1naXQgYS9jb250cmliL2ZpbmRzc2wuc2ggYi9jb250cmliL2ZpbmRzc2wuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2M2ZkMjYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9maW5kc3NsLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyAkSWQ6IGZpbmRzc2wuc2gsdiAxLjQgMjAwNy8wMi8xOSAxMTo0NDoyNSBkdHVja2VyIEV4cCAkCi0jCi0jIGZpbmRzc2wuc2gKLSMJU2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzIG9mIE9wZW5TU0wgaGVhZGVycyBhbmQgbGlicmFyaWVzCi0jCWFuZCBwcmludCB0aGVpciB2ZXJzaW9ucy4KLSMJSW50ZW5kZWQgdG8gaGVscCBkaWFnbm9zZSBPcGVuU1NIJ3MgIk9wZW5TU0wgaGVhZGVycyBkbyBub3QKLSMJbWF0Y2ggeW91ciBsaWJyYXJ5IiBlcnJvcnMuCi0jCi0jCVdyaXR0ZW4gYnkgRGFycmVuIFR1Y2tlciAoZHR1Y2tlciBhdCB6aXAgZG90IGNvbSBkb3QgYXUpCi0jCVRoaXMgZmlsZSBpcyBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4uCi0jCi0jCVJlbGVhc2UgaGlzdG9yeToKLSMJMjAwMi0wNy0yNzogSW5pdGlhbCByZWxlYXNlLgotIwkyMDAyLTA4LTA0OiBBZGRlZCBwdWJsaWMgZG9tYWluIG5vdGljZS4KLSMJMjAwMy0wNi0yNDogSW5jb3Jwb3JhdGVkIHJlYWRtZSwgc2V0IGxpYnJhcnkgcGF0aHMuIEZpcnN0IGN2cyB2ZXJzaW9uLgotIwkyMDA0LTEyLTEzOiBBZGQgdHJhcHMgdG8gY2xlYW51cCB0ZW1wIGZpbGVzLCBmcm9tIEFtYXJlbmRyYSBHb2Rib2xlLgotIwotIyAiT3BlblNTTCBoZWFkZXJzIGRvIG5vdCBtYXRjaCB5b3VyIGxpYnJhcnkiIGFyZSB1c3VhbGx5IGNhdXNlZCBieQotIyBPcGVuU1NIJ3MgY29uZmlndXJlIHBpY2tpbmcgdXAgYW4gb2xkZXIgdmVyc2lvbiBvZiBPcGVuU1NMIGhlYWRlcnMKLSMgb3IgbGlicmFyaWVzLiAgWW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyAjIHByb2NlZHVyZSB0byBoZWxwIGlkZW50aWZ5Ci0jIHRoZSBjYXVzZS4KLSMKLSMgVGhlICBvdXRwdXQgIG9mICBjb25maWd1cmUgIHdpbGwgIHRlbGwgeW91IHRoZSB2ZXJzaW9ucyBvZiB0aGUgT3BlblNTTAotIyBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgdGhhdCB3ZXJlIHBpY2tlZCB1cCwgZm9yIGV4YW1wbGU6Ci0jCi0jIGNoZWNraW5nIE9wZW5TU0wgaGVhZGVyIHZlcnNpb24uLi4gOTA2MDRmIChPcGVuU1NMIDAuOS42ZCA5IE1heSAyMDAyKQotIyBjaGVja2luZyBPcGVuU1NMIGxpYnJhcnkgdmVyc2lvbi4uLiA5MDYwMmYgKE9wZW5TU0wgMC45LjZiIFtlbmdpbmVdIDkgSnVsIDIwMDEpCi0jIGNoZWNraW5nIHdoZXRoZXIgT3BlblNTTCdzIGhlYWRlcnMgbWF0Y2ggdGhlIGxpYnJhcnkuLi4gbm8KLSMgY29uZmlndXJlOiBlcnJvcjogWW91ciBPcGVuU1NMIGhlYWRlcnMgZG8gbm90IG1hdGNoIHlvdXIgbGlicmFyeQotIwotIyBOb3cgcnVuIGZpbmRzc2wuc2guIFRoaXMgc2hvdWxkIGlkZW50aWZ5IHRoZSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMKLSMgcHJlc2VudCAgYW5kICB0aGVpciAgdmVyc2lvbnMuICBZb3UgIHNob3VsZCAgYmUgIGFibGUgIHRvIGlkZW50aWZ5IHRoZQotIyBsaWJyYXJpZXMgIGFuZCBoZWFkZXJzIHVzZWQgYW5kIGFkanVzdCB5b3VyIENGTEFHUyBvciByZW1vdmUgaW5jb3JyZWN0Ci0jIHZlcnNpb25zLiAgVGhlICBvdXRwdXQgd2lsbCBzaG93IE9wZW5TU0wncyBpbnRlcm5hbCB2ZXJzaW9uIGlkZW50aWZpZXIKLSMgYW5kIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlOgotCi0jICQgLi9maW5kc3NsLnNoCi0jIFNlYXJjaGluZyBmb3IgT3BlblNTTCBoZWFkZXIgZmlsZXMuCi0jIDB4MDA5MDYwNGZMIC91c3IvaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmgKLSMgMHgwMDkwNjA0ZkwgL3Vzci9sb2NhbC9zc2wvaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmgKLSMKLSMgU2VhcmNoaW5nIGZvciBPcGVuU1NMIHNoYXJlZCBsaWJyYXJ5IGZpbGVzLgotIyAweDAwOTA2MDJmTCAvbGliL2xpYmNyeXB0by5zby4wLjkuNmIKLSMgMHgwMDkwNjAyZkwgL2xpYi9saWJjcnlwdG8uc28uMgotIyAweDAwOTA1ODFmTCAvdXNyL2xpYi9saWJjcnlwdG8uc28uMAotIyAweDAwOTA2MDJmTCAvdXNyL2xpYi9saWJjcnlwdG8uc28KLSMgMHgwMDkwNTgxZkwgL3Vzci9saWIvbGliY3J5cHRvLnNvLjAuOS41YQotIyAweDAwOTA2MDBmTCAvdXNyL2xpYi9saWJjcnlwdG8uc28uMC45LjYKLSMgMHgwMDkwNjAwZkwgL3Vzci9saWIvbGliY3J5cHRvLnNvLjEKLSMKLSMgU2VhcmNoaW5nIGZvciBPcGVuU1NMIHN0YXRpYyBsaWJyYXJ5IGZpbGVzLgotIyAweDAwOTA2MDJmTCAvdXNyL2xpYi9saWJjcnlwdG8uYQotIyAweDAwOTA2MDRmTCAvdXNyL2xvY2FsL3NzbC9saWIvbGliY3J5cHRvLmEKLSMKLSMgSW4gIHRoaXMgIGV4YW1wbGUsIEkgZ2F2ZSBjb25maWd1cmUgbm8gZXh0cmEgZmxhZ3MsIHNvIGl0J3MgcGlja2luZyB1cAotIyB0aGUgIE9wZW5TU0wgaGVhZGVyIGZyb20gL3Vzci9pbmNsdWRlL29wZW5zc2wgKDkwNjA0ZikgYW5kIHRoZSBsaWJyYXJ5Ci0jIGZyb20gL3Vzci9saWIvICg5MDYwMmYpLgotCi0jCi0jIEFkanVzdCB0aGVzZSB0byBzdWl0IHlvdXIgY29tcGlsZXIuCi0jIFlvdSBtYXkgYWxzbyBuZWVkIHRvIHNldCB0aGUgKkxJQipQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlcyBpZgotIyBERUZBVUxUX0xJQlBBVEggaXMgbm90IGNvcnJlY3QgZm9yIHlvdXIgc3lzdGVtLgotIwotQ0M9Z2NjCi1TVEFUSUM9LXN0YXRpYwotCi0jCi0jIENsZWFudXAgb24gaW50ZXJydXB0Ci0jCi10cmFwICdybSAtZiBjb25mdGVzdC5jJyBJTlQgSFVQIFRFUk0KLQotIwotIyBTZXQgdXAgY29uZnRlc3QgQyBzb3VyY2UKLSMKLXJtIC1mIGZpbmRzc2wubG9nCi1jYXQgPmNvbmZ0ZXN0LmMgPDxFT0QKLSNpbmNsdWRlIDxzdGRpby5oPgotaW50IG1haW4oKXtwcmludGYoIjB4JTA4eExcbiIsIFNTTGVheSgpKTt9Ci1FT0QKLQotIwotIyBTZXQgZGVmYXVsdCBsaWJyYXJ5IHBhdGhzIGlmIG5vdCBhbHJlYWR5IHNldAotIwotREVGQVVMVF9MSUJQQVRIPS91c3IvbGliOi91c3IvbG9jYWwvbGliCi1MSUJQQVRIPSR7TElCUEFUSDo9JERFRkFVTFRfTElCUEFUSH0KLUxEX0xJQlJBUllfUEFUSD0ke0xEX0xJQlJBUllfUEFUSDo9JERFRkFVTFRfTElCUEFUSH0KLUxJQlJBUllfUEFUSD0ke0xJQlJBUllfUEFUSDo9JERFRkFVTFRfTElCUEFUSH0KLWV4cG9ydCBMSUJQQVRIIExEX0xJQlJBUllfUEFUSCBMSUJSQVJZX1BBVEgKLQotIyBub3QgYWxsIHBsYXRmb3JtcyBoYXZlIGEgJ3doaWNoJyBjb21tYW5kCi1pZiB3aGljaCBscyA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgOiB3aGljaCBpcyBkZWZpbmVkCi1lbHNlCi0gICAgd2hpY2ggKCkgewotCXNhdmVJRlM9IiRJRlMiCi0JSUZTPToKLQlmb3IgcCBpbiAkUEFUSDsgZG8KLQkgICAgaWYgdGVzdCAteCAiJHAvJDEiIC1hIC1mICIkcC8kMSI7IHRoZW4KLQkJSUZTPSIkc2F2ZUlGUyIKLQkJZWNobyAiJHAvJDEiCi0JCXJldHVybiAwCi0JICAgIGZpCi0JZG9uZQotCUlGUz0iJHNhdmVJRlMiCi0JcmV0dXJuIDEKLSAgICB9Ci1maQotCi0jCi0jIFNlYXJjaCBmb3IgT3BlblNTTCBoZWFkZXJzIGFuZCBwcmludCB2ZXJzaW9ucwotIwotZWNobyBTZWFyY2hpbmcgZm9yIE9wZW5TU0wgaGVhZGVyIGZpbGVzLgotaWYgWyAteCAiYHdoaWNoIGxvY2F0ZWAiIF0KLXRoZW4KLQloZWFkZXJzPWBsb2NhdGUgb3BlbnNzbHYuaGAKLWVsc2UKLQloZWFkZXJzPWBmaW5kIC8gLW5hbWUgb3BlbnNzbHYuaCAtcHJpbnQgMj4vZGV2L251bGxgCi1maQotCi1mb3IgaGVhZGVyIGluICRoZWFkZXJzCi1kbwotCXZlcj1gYXdrICcvT1BFTlNTTF9WRVJTSU9OX05VTUJFUi97cHJpbnRmIFwkM30nICRoZWFkZXJgCi0JZWNobyAiJHZlciAkaGVhZGVyIgotZG9uZQotZWNobwotCi0jCi0jIFNlYXJjaCBmb3Igc2hhcmVkIGxpYnJhcmllcy4KLSMgUmVsaWVzIG9uIHNoYXJlZCBsaWJyYXJpZXMgbG9va2luZyBsaWtlICJsaWJjcnlwdG8ucyoiCi0jCi1lY2hvIFNlYXJjaGluZyBmb3IgT3BlblNTTCBzaGFyZWQgbGlicmFyeSBmaWxlcy4KLWlmIFsgLXggImB3aGljaCBsb2NhdGVgIiBdCi10aGVuCi0JbGlicmFyaWVzPWBsb2NhdGUgbGliY3J5cHRvLnNgCi1lbHNlCi0JbGlicmFyaWVzPWBmaW5kIC8gLW5hbWUgJ2xpYmNyeXB0by5zKicgLXByaW50IDI+L2Rldi9udWxsYAotZmkKLQotZm9yIGxpYiBpbiAkbGlicmFyaWVzCi1kbwotCShlY2hvICJUcnlpbmcgbGliY3J5cHRvICRsaWIiID4+ZmluZHNzbC5sb2cKLQlkaXI9YGRpcm5hbWUgJGxpYmAKLQlMSUJQQVRIPSIkZGlyOiRMSUJQQVRIIgotCUxEX0xJQlJBUllfUEFUSD0iJGRpcjokTElCUEFUSCIKLQlMSUJSQVJZX1BBVEg9IiRkaXI6JExJQlBBVEgiCi0JZXhwb3J0IExJQlBBVEggTERfTElCUkFSWV9QQVRIIExJQlJBUllfUEFUSAotCSR7Q0N9IC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGxpYiAyPj5maW5kc3NsLmxvZwotCWlmIFsgLXggLi9jb25mdGVzdCBdCi0JdGhlbgotCQl2ZXI9YC4vY29uZnRlc3QgMj4vZGV2L251bGxgCi0JCXJtIC1mIC4vY29uZnRlc3QKLQkJZWNobyAiJHZlciAkbGliIgotCWZpKQotZG9uZQotZWNobwotCi0jCi0jIFNlYXJjaCBmb3Igc3RhdGljIE9wZW5TU0wgbGlicmFyaWVzIGFuZCBwcmludCB2ZXJzaW9ucwotIwotZWNobyBTZWFyY2hpbmcgZm9yIE9wZW5TU0wgc3RhdGljIGxpYnJhcnkgZmlsZXMuCi1pZiBbIC14ICJgd2hpY2ggbG9jYXRlYCIgXQotdGhlbgotCWxpYnJhcmllcz1gbG9jYXRlIGxpYmNyeXB0by5hYAotZWxzZQotCWxpYnJhcmllcz1gZmluZCAvIC1uYW1lIGxpYmNyeXB0by5hIC1wcmludCAyPi9kZXYvbnVsbGAKLWZpCi0KLWZvciBsaWIgaW4gJGxpYnJhcmllcwotZG8KLQlsaWJkaXI9YGRpcm5hbWUgJGxpYmAKLQllY2hvICJUcnlpbmcgbGliY3J5cHRvICRsaWIiID4+ZmluZHNzbC5sb2cKLQkke0NDfSAke1NUQVRJQ30gLW8gY29uZnRlc3QgY29uZnRlc3QuYyAtTCR7bGliZGlyfSAtbGNyeXB0byAyPj5maW5kc3NsLmxvZwotCWlmIFsgLXggLi9jb25mdGVzdCBdCi0JdGhlbgotCQl2ZXI9YC4vY29uZnRlc3QgMj4vZGV2L251bGxgCi0JCXJtIC1mIC4vY29uZnRlc3QKLQkJZWNobyAiJHZlciAkbGliIgotCWZpCi1kb25lCi0KLSMKLSMgQ2xlYW4gdXAKLSMKLXJtIC1mIGNvbmZ0ZXN0LmMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ25vbWUtc3NoLWFza3Bhc3MxLmMgYi9jb250cmliL2dub21lLXNzaC1hc2twYXNzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDUxMDMyLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZ25vbWUtc3NoLWFza3Bhc3MxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKgotICogVGhpcyBpcyBhIHNpbXBsZSBHTk9NRSBTU0ggcGFzc3BocmFzZSBncmFiYmVyLiBUbyB1c2UgaXQsIHNldCB0aGUKLSAqIGVudmlyb25tZW50IHZhcmlhYmxlIFNTSF9BU0tQQVNTIHRvIHBvaW50IHRvIHRoZSBsb2NhdGlvbiBvZgotICogZ25vbWUtc3NoLWFza3Bhc3MgYmVmb3JlIGNhbGxpbmcgInNzaC1hZGQgPCAvZGV2L251bGwiLgotICoKLSAqIFRoZXJlIGlzIG9ubHkgdHdvIHJ1bi10aW1lIG9wdGlvbnM6IGlmIHlvdSBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0gKiAiR05PTUVfU1NIX0FTS1BBU1NfR1JBQl9TRVJWRVI9dHJ1ZSIgdGhlbiBnbm9tZS1zc2gtYXNrcGFzcyB3aWxsIGdyYWIKLSAqIHRoZSBYIHNlcnZlci4gSWYgeW91IHNldCAiR05PTUVfU1NIX0FTS1BBU1NfR1JBQl9QT0lOVEVSPXRydWUiLCB0aGVuIHRoZQotICogcG9pbnRlciB3aWxsIGJlIGdyYWJiZWQgdG9vLiBUaGVzZSBtYXkgaGF2ZSBzb21lIGJlbmVmaXQgdG8gc2VjdXJpdHkgaWYKLSAqIHlvdSBkb24ndCB0cnVzdCB5b3VyIFggc2VydmVyLiBXZSBncmFiIHRoZSBrZXlib2FyZCBhbHdheXMuCi0gKi8KLQotLyoKLSAqIENvbXBpbGUgd2l0aDoKLSAqCi0gKiBjYyBgZ25vbWUtY29uZmlnIC0tY2ZsYWdzIGdub21lIGdub21ldWlgIFwKLSAqICAgIGdub21lLXNzaC1hc2twYXNzMS5jIC1vIGdub21lLXNzaC1hc2twYXNzIFwKLSAqICAgIGBnbm9tZS1jb25maWcgLS1saWJzIGdub21lIGdub21ldWlgCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGdub21lLmg+Ci0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlIDxnZGsvZ2RreC5oPgotCi12b2lkCi1yZXBvcnRfZmFpbGVkX2dyYWIgKHZvaWQpCi17Ci0JR3RrV2lkZ2V0ICplcnI7Ci0KLQllcnIgPSBnbm9tZV9tZXNzYWdlX2JveF9uZXcoIkNvdWxkIG5vdCBncmFiIGtleWJvYXJkIG9yIG1vdXNlLlxuIgotCQkiQSBtYWxpY2lvdXMgY2xpZW50IG1heSBiZSBlYXZlc2Ryb3BwaW5nIG9uIHlvdXIgc2Vzc2lvbi4iLAotCQkJCSAgICBHTk9NRV9NRVNTQUdFX0JPWF9FUlJPUiwgIkVYSVQiLCBOVUxMKTsKLQlndGtfd2luZG93X3NldF9wb3NpdGlvbihHVEtfV0lORE9XKGVyciksIEdUS19XSU5fUE9TX0NFTlRFUik7Ci0JZ3RrX29iamVjdF9zZXQoR1RLX09CSkVDVChlcnIpLCAidHlwZSIsIEdUS19XSU5ET1dfUE9QVVAsIE5VTEwpOwotCi0JZ25vbWVfZGlhbG9nX3J1bl9hbmRfY2xvc2UoR05PTUVfRElBTE9HKGVycikpOwotfQotCi1pbnQKLXBhc3NwaHJhc2VfZGlhbG9nKGNoYXIgKm1lc3NhZ2UpCi17Ci0JY2hhciAqcGFzc3BocmFzZTsKLQljaGFyICoqbWVzc2FnZXM7Ci0JaW50IHJlc3VsdCwgaSwgZ3JhYl9zZXJ2ZXIsIGdyYWJfcG9pbnRlcjsKLQlHdGtXaWRnZXQgKmRpYWxvZywgKmVudHJ5LCAqbGFiZWw7Ci0KLQlncmFiX3NlcnZlciA9IChnZXRlbnYoIkdOT01FX1NTSF9BU0tQQVNTX0dSQUJfU0VSVkVSIikgIT0gTlVMTCk7Ci0JZ3JhYl9wb2ludGVyID0gKGdldGVudigiR05PTUVfU1NIX0FTS1BBU1NfR1JBQl9QT0lOVEVSIikgIT0gTlVMTCk7Ci0KLQlkaWFsb2cgPSBnbm9tZV9kaWFsb2dfbmV3KCJPcGVuU1NIIiwgR05PTUVfU1RPQ0tfQlVUVE9OX09LLAotCSAgICBHTk9NRV9TVE9DS19CVVRUT05fQ0FOQ0VMLCBOVUxMKTsKLQotCW1lc3NhZ2VzID0gZ19zdHJzcGxpdChtZXNzYWdlLCAiXFxuIiwgMCk7Ci0JaWYgKG1lc3NhZ2VzKQotCQlmb3IoaSA9IDA7IG1lc3NhZ2VzW2ldOyBpKyspIHsKLQkJCWxhYmVsID0gZ3RrX2xhYmVsX25ldyhtZXNzYWdlc1tpXSk7Ci0JCQlndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWChHTk9NRV9ESUFMT0coZGlhbG9nKS0+dmJveCksCi0JCQkgICAgbGFiZWwsIEZBTFNFLCBGQUxTRSwgMCk7Ci0JCX0KLQotCWVudHJ5ID0gZ3RrX2VudHJ5X25ldygpOwotCWd0a19ib3hfcGFja19zdGFydChHVEtfQk9YKEdOT01FX0RJQUxPRyhkaWFsb2cpLT52Ym94KSwgZW50cnksIEZBTFNFLAotCSAgICBGQUxTRSwgMCk7Ci0JZ3RrX2VudHJ5X3NldF92aXNpYmlsaXR5KEdUS19FTlRSWShlbnRyeSksIEZBTFNFKTsKLQlndGtfd2lkZ2V0X2dyYWJfZm9jdXMoZW50cnkpOwotCi0JLyogQ2VudGVyIHdpbmRvdyBhbmQgcHJlcGFyZSBmb3IgZ3JhYiAqLwotCWd0a19vYmplY3Rfc2V0KEdUS19PQkpFQ1QoZGlhbG9nKSwgInR5cGUiLCBHVEtfV0lORE9XX1BPUFVQLCBOVUxMKTsKLQlnbm9tZV9kaWFsb2dfc2V0X2RlZmF1bHQoR05PTUVfRElBTE9HKGRpYWxvZyksIDApOwotCWd0a193aW5kb3dfc2V0X3Bvc2l0aW9uIChHVEtfV0lORE9XKGRpYWxvZyksIEdUS19XSU5fUE9TX0NFTlRFUik7Ci0JZ3RrX3dpbmRvd19zZXRfcG9saWN5KEdUS19XSU5ET1coZGlhbG9nKSwgRkFMU0UsIEZBTFNFLCBUUlVFKTsKLQlnbm9tZV9kaWFsb2dfY2xvc2VfaGlkZXMoR05PTUVfRElBTE9HKGRpYWxvZyksIFRSVUUpOwotCWd0a19jb250YWluZXJfc2V0X2JvcmRlcl93aWR0aChHVEtfQ09OVEFJTkVSKEdOT01FX0RJQUxPRyhkaWFsb2cpLT52Ym94KSwKLQkgICAgR05PTUVfUEFEKTsKLQlndGtfd2lkZ2V0X3Nob3dfYWxsKGRpYWxvZyk7Ci0KLQkvKiBHcmFiIGZvY3VzICovCi0JaWYgKGdyYWJfc2VydmVyKQotCQlYR3JhYlNlcnZlcihHREtfRElTUExBWSgpKTsKLQlpZiAoZ3JhYl9wb2ludGVyICYmIGdka19wb2ludGVyX2dyYWIoZGlhbG9nLT53aW5kb3csIFRSVUUsIDAsCi0JICAgIE5VTEwsIE5VTEwsIEdES19DVVJSRU5UX1RJTUUpKQotCQlnb3RvIG5vZ3JhYjsKLQlpZiAoZ2RrX2tleWJvYXJkX2dyYWIoZGlhbG9nLT53aW5kb3csIEZBTFNFLCBHREtfQ1VSUkVOVF9USU1FKSkKLQkJZ290byBub2dyYWJrYjsKLQotCS8qIE1ha2UgPGVudGVyPiBjbG9zZSBkaWFsb2cgKi8KLQlnbm9tZV9kaWFsb2dfZWRpdGFibGVfZW50ZXJzKEdOT01FX0RJQUxPRyhkaWFsb2cpLCBHVEtfRURJVEFCTEUoZW50cnkpKTsKLQotCS8qIFJ1biBkaWFsb2cgKi8KLQlyZXN1bHQgPSBnbm9tZV9kaWFsb2dfcnVuKEdOT01FX0RJQUxPRyhkaWFsb2cpKTsKLQotCS8qIFVuZ3JhYiAqLwotCWlmIChncmFiX3NlcnZlcikKLQkJWFVuZ3JhYlNlcnZlcihHREtfRElTUExBWSgpKTsKLQlpZiAoZ3JhYl9wb2ludGVyKQotCQlnZGtfcG9pbnRlcl91bmdyYWIoR0RLX0NVUlJFTlRfVElNRSk7Ci0JZ2RrX2tleWJvYXJkX3VuZ3JhYihHREtfQ1VSUkVOVF9USU1FKTsKLQlnZGtfZmx1c2goKTsKLQotCS8qIFJlcG9ydCBwYXNzcGhyYXNlIGlmIHVzZXIgc2VsZWN0ZWQgT0sgKi8KLQlwYXNzcGhyYXNlID0gZ3RrX2VudHJ5X2dldF90ZXh0KEdUS19FTlRSWShlbnRyeSkpOwotCWlmIChyZXN1bHQgPT0gMCkKLQkJcHV0cyhwYXNzcGhyYXNlKTsKLQkJCi0JLyogWmVybyBwYXNzcGhyYXNlIGluIG1lbW9yeSAqLwotCW1lbXNldChwYXNzcGhyYXNlLCAnXDAnLCBzdHJsZW4ocGFzc3BocmFzZSkpOwotCWd0a19lbnRyeV9zZXRfdGV4dChHVEtfRU5UUlkoZW50cnkpLCBwYXNzcGhyYXNlKTsKLQkJCQotCWdub21lX2RpYWxvZ19jbG9zZShHTk9NRV9ESUFMT0coZGlhbG9nKSk7Ci0JcmV0dXJuIChyZXN1bHQgPT0gMCA/IDAgOiAtMSk7Ci0KLQkvKiBBdCBsZWFzdCBvbmUgZ3JhYiBmYWlsZWQgLSB1bmdyYWIgd2hhdCB3ZSBnb3QsIGFuZCByZXBvcnQKLQkgICB0aGUgZmFpbHVyZSB0byB0aGUgdXNlci4gIE5vdGUgdGhhdCBYR3JhYlNlcnZlcigpIGNhbm5vdAotCSAgIGZhaWwuICAqLwotIG5vZ3JhYmtiOgotCWdka19wb2ludGVyX3VuZ3JhYihHREtfQ1VSUkVOVF9USU1FKTsKLSBub2dyYWI6Ci0JaWYgKGdyYWJfc2VydmVyKQotCQlYVW5ncmFiU2VydmVyKEdES19ESVNQTEFZKCkpOwotCWdub21lX2RpYWxvZ19jbG9zZShHTk9NRV9ESUFMT0coZGlhbG9nKSk7Ci0JCi0JcmVwb3J0X2ZhaWxlZF9ncmFiKCk7Ci0JcmV0dXJuICgtMSk7Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0JY2hhciAqbWVzc2FnZTsKLQlpbnQgcmVzdWx0OwotCi0JZ25vbWVfaW5pdCgiR05PTUUgc3NoLWFza3Bhc3MiLCAiMC4xIiwgYXJnYywgYXJndik7Ci0KLQlpZiAoYXJnYyA9PSAyKQotCQltZXNzYWdlID0gYXJndlsxXTsKLQllbHNlCi0JCW1lc3NhZ2UgPSAiRW50ZXIgeW91ciBPcGVuU1NIIHBhc3NwaHJhc2U6IjsKLQotCXNldHZidWYoc3Rkb3V0LCAwLCBfSU9OQkYsIDApOwotCXJlc3VsdCA9IHBhc3NwaHJhc2VfZGlhbG9nKG1lc3NhZ2UpOwotCi0JcmV0dXJuIChyZXN1bHQpOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9nbm9tZS1zc2gtYXNrcGFzczIuYyBiL2NvbnRyaWIvZ25vbWUtc3NoLWFza3Bhc3MyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOTdjMzAuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9nbm9tZS1zc2gtYXNrcGFzczIuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS8qIEdUSzIgc3VwcG9ydCBieSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+ICovCi0KLS8qCi0gKiBUaGlzIGlzIGEgc2ltcGxlIEdOT01FIFNTSCBwYXNzcGhyYXNlIGdyYWJiZXIuIFRvIHVzZSBpdCwgc2V0IHRoZQotICogZW52aXJvbm1lbnQgdmFyaWFibGUgU1NIX0FTS1BBU1MgdG8gcG9pbnQgdG8gdGhlIGxvY2F0aW9uIG9mCi0gKiBnbm9tZS1zc2gtYXNrcGFzcyBiZWZvcmUgY2FsbGluZyAic3NoLWFkZCA8IC9kZXYvbnVsbCIuCi0gKgotICogVGhlcmUgaXMgb25seSB0d28gcnVuLXRpbWUgb3B0aW9uczogaWYgeW91IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAqICJHTk9NRV9TU0hfQVNLUEFTU19HUkFCX1NFUlZFUj10cnVlIiB0aGVuIGdub21lLXNzaC1hc2twYXNzIHdpbGwgZ3JhYgotICogdGhlIFggc2VydmVyLiBJZiB5b3Ugc2V0ICJHTk9NRV9TU0hfQVNLUEFTU19HUkFCX1BPSU5URVI9dHJ1ZSIsIHRoZW4gdGhlCi0gKiBwb2ludGVyIHdpbGwgYmUgZ3JhYmJlZCB0b28uIFRoZXNlIG1heSBoYXZlIHNvbWUgYmVuZWZpdCB0byBzZWN1cml0eSBpZgotICogeW91IGRvbid0IHRydXN0IHlvdXIgWCBzZXJ2ZXIuIFdlIGdyYWIgdGhlIGtleWJvYXJkIGFsd2F5cy4KLSAqLwotCi0jZGVmaW5lIEdSQUJfVFJJRVMJMTYKLSNkZWZpbmUgR1JBQl9XQUlUCTI1MCAvKiBtaWxsaXNlY29uZHMgKi8KLQotLyoKLSAqIENvbXBpbGUgd2l0aDoKLSAqCi0gKiBjYyAtV2FsbCBgcGtnLWNvbmZpZyAtLWNmbGFncyBndGsrLTIuMGAgXAotICogICAgZ25vbWUtc3NoLWFza3Bhc3MyLmMgLW8gZ25vbWUtc3NoLWFza3Bhc3MgXAotICogICAgYHBrZy1jb25maWcgLS1saWJzIGd0aystMi4wYAotICoKLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPGd0ay9ndGsuaD4KLSNpbmNsdWRlIDxnZGsvZ2RreC5oPgotCi1zdGF0aWMgdm9pZAotcmVwb3J0X2ZhaWxlZF9ncmFiIChjb25zdCBjaGFyICp3aGF0KQotewotCUd0a1dpZGdldCAqZXJyOwotCi0JZXJyID0gZ3RrX21lc3NhZ2VfZGlhbG9nX25ldyhOVUxMLCAwLAotCQkJCSAgICAgR1RLX01FU1NBR0VfRVJST1IsCi0JCQkJICAgICBHVEtfQlVUVE9OU19DTE9TRSwKLQkJCQkgICAgICJDb3VsZCBub3QgZ3JhYiAlcy4gIgotCQkJCSAgICAgIkEgbWFsaWNpb3VzIGNsaWVudCBtYXkgYmUgZWF2ZXNkcm9wcGluZyAiCi0JCQkJICAgICAib24geW91ciBzZXNzaW9uLiIsIHdoYXQpOwotCWd0a193aW5kb3dfc2V0X3Bvc2l0aW9uKEdUS19XSU5ET1coZXJyKSwgR1RLX1dJTl9QT1NfQ0VOVEVSKTsKLQlndGtfbGFiZWxfc2V0X2xpbmVfd3JhcChHVEtfTEFCRUwoKEdUS19NRVNTQUdFX0RJQUxPRyhlcnIpKS0+bGFiZWwpLAotCQkJCVRSVUUpOwotCi0JZ3RrX2RpYWxvZ19ydW4oR1RLX0RJQUxPRyhlcnIpKTsKLQotCWd0a193aWRnZXRfZGVzdHJveShlcnIpOwotfQotCi1zdGF0aWMgdm9pZAotb2tfZGlhbG9nKEd0a1dpZGdldCAqZW50cnksIGdwb2ludGVyIGRpYWxvZykKLXsKLQlnX3JldHVybl9pZl9mYWlsKEdUS19JU19ESUFMT0coZGlhbG9nKSk7Ci0JZ3RrX2RpYWxvZ19yZXNwb25zZShHVEtfRElBTE9HKGRpYWxvZyksIEdUS19SRVNQT05TRV9PSyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhc3NwaHJhc2VfZGlhbG9nKGNoYXIgKm1lc3NhZ2UpCi17Ci0JY29uc3QgY2hhciAqZmFpbGVkOwotCWNoYXIgKnBhc3NwaHJhc2UsICpsb2NhbDsKLQlpbnQgcmVzdWx0LCBncmFiX3RyaWVzLCBncmFiX3NlcnZlciwgZ3JhYl9wb2ludGVyOwotCUd0a1dpZGdldCAqZGlhbG9nLCAqZW50cnk7Ci0JR2RrR3JhYlN0YXR1cyBzdGF0dXM7Ci0KLQlncmFiX3NlcnZlciA9IChnZXRlbnYoIkdOT01FX1NTSF9BU0tQQVNTX0dSQUJfU0VSVkVSIikgIT0gTlVMTCk7Ci0JZ3JhYl9wb2ludGVyID0gKGdldGVudigiR05PTUVfU1NIX0FTS1BBU1NfR1JBQl9QT0lOVEVSIikgIT0gTlVMTCk7Ci0JZ3JhYl90cmllcyA9IDA7Ci0KLQlkaWFsb2cgPSBndGtfbWVzc2FnZV9kaWFsb2dfbmV3KE5VTEwsIDAsCi0JCQkJCUdUS19NRVNTQUdFX1FVRVNUSU9OLAotCQkJCQlHVEtfQlVUVE9OU19PS19DQU5DRUwsCi0JCQkJCSIlcyIsCi0JCQkJCW1lc3NhZ2UpOwotCi0JZW50cnkgPSBndGtfZW50cnlfbmV3KCk7Ci0JZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1goR1RLX0RJQUxPRyhkaWFsb2cpLT52Ym94KSwgZW50cnksIEZBTFNFLAotCSAgICBGQUxTRSwgMCk7Ci0JZ3RrX2VudHJ5X3NldF92aXNpYmlsaXR5KEdUS19FTlRSWShlbnRyeSksIEZBTFNFKTsKLQlndGtfd2lkZ2V0X2dyYWJfZm9jdXMoZW50cnkpOwotCWd0a193aWRnZXRfc2hvdyhlbnRyeSk7Ci0KLQlndGtfd2luZG93X3NldF90aXRsZShHVEtfV0lORE9XKGRpYWxvZyksICJPcGVuU1NIIik7Ci0JZ3RrX3dpbmRvd19zZXRfcG9zaXRpb24gKEdUS19XSU5ET1coZGlhbG9nKSwgR1RLX1dJTl9QT1NfQ0VOVEVSKTsKLQlndGtfd2luZG93X3NldF9rZWVwX2Fib3ZlKEdUS19XSU5ET1coZGlhbG9nKSwgVFJVRSk7Ci0JZ3RrX2xhYmVsX3NldF9saW5lX3dyYXAoR1RLX0xBQkVMKChHVEtfTUVTU0FHRV9ESUFMT0coZGlhbG9nKSktPmxhYmVsKSwKLQkJCQlUUlVFKTsKLQotCS8qIE1ha2UgPGVudGVyPiBjbG9zZSBkaWFsb2cgKi8KLQlndGtfZGlhbG9nX3NldF9kZWZhdWx0X3Jlc3BvbnNlKEdUS19ESUFMT0coZGlhbG9nKSwgR1RLX1JFU1BPTlNFX09LKTsKLQlnX3NpZ25hbF9jb25uZWN0KEdfT0JKRUNUKGVudHJ5KSwgImFjdGl2YXRlIiwKLQkJCSBHX0NBTExCQUNLKG9rX2RpYWxvZyksIGRpYWxvZyk7Ci0KLQlndGtfd2luZG93X3NldF9rZWVwX2Fib3ZlKEdUS19XSU5ET1coZGlhbG9nKSwgVFJVRSk7Ci0KLQkvKiBHcmFiIGZvY3VzICovCi0JZ3RrX3dpZGdldF9zaG93X25vdyhkaWFsb2cpOwotCWlmIChncmFiX3BvaW50ZXIpIHsKLQkJZm9yKDs7KSB7Ci0JCQlzdGF0dXMgPSBnZGtfcG9pbnRlcl9ncmFiKAotCQkJICAgKEdUS19XSURHRVQoZGlhbG9nKSktPndpbmRvdywgVFJVRSwgMCwgTlVMTCwKLQkJCSAgIE5VTEwsIEdES19DVVJSRU5UX1RJTUUpOwotCQkJaWYgKHN0YXR1cyA9PSBHREtfR1JBQl9TVUNDRVNTKQotCQkJCWJyZWFrOwotCQkJdXNsZWVwKEdSQUJfV0FJVCAqIDEwMDApOwotCQkJaWYgKCsrZ3JhYl90cmllcyA+IEdSQUJfVFJJRVMpIHsKLQkJCQlmYWlsZWQgPSAibW91c2UiOwotCQkJCWdvdG8gbm9ncmFiOwotCQkJfQotCQl9Ci0JfQotCWZvcig7OykgewotCQlzdGF0dXMgPSBnZGtfa2V5Ym9hcmRfZ3JhYigoR1RLX1dJREdFVChkaWFsb2cpKS0+d2luZG93LAotCQkgICBGQUxTRSwgR0RLX0NVUlJFTlRfVElNRSk7Ci0JCWlmIChzdGF0dXMgPT0gR0RLX0dSQUJfU1VDQ0VTUykKLQkJCWJyZWFrOwotCQl1c2xlZXAoR1JBQl9XQUlUICogMTAwMCk7Ci0JCWlmICgrK2dyYWJfdHJpZXMgPiBHUkFCX1RSSUVTKSB7Ci0JCQlmYWlsZWQgPSAia2V5Ym9hcmQiOwotCQkJZ290byBub2dyYWJrYjsKLQkJfQotCX0KLQlpZiAoZ3JhYl9zZXJ2ZXIpIHsKLQkJZ2RrX3gxMV9ncmFiX3NlcnZlcigpOwotCX0KLQotCXJlc3VsdCA9IGd0a19kaWFsb2dfcnVuKEdUS19ESUFMT0coZGlhbG9nKSk7Ci0KLQkvKiBVbmdyYWIgKi8KLQlpZiAoZ3JhYl9zZXJ2ZXIpCi0JCVhVbmdyYWJTZXJ2ZXIoR0RLX0RJU1BMQVkoKSk7Ci0JaWYgKGdyYWJfcG9pbnRlcikKLQkJZ2RrX3BvaW50ZXJfdW5ncmFiKEdES19DVVJSRU5UX1RJTUUpOwotCWdka19rZXlib2FyZF91bmdyYWIoR0RLX0NVUlJFTlRfVElNRSk7Ci0JZ2RrX2ZsdXNoKCk7Ci0KLQkvKiBSZXBvcnQgcGFzc3BocmFzZSBpZiB1c2VyIHNlbGVjdGVkIE9LICovCi0JcGFzc3BocmFzZSA9IGdfc3RyZHVwKGd0a19lbnRyeV9nZXRfdGV4dChHVEtfRU5UUlkoZW50cnkpKSk7Ci0JaWYgKHJlc3VsdCA9PSBHVEtfUkVTUE9OU0VfT0spIHsKLQkJbG9jYWwgPSBnX2xvY2FsZV9mcm9tX3V0ZjgocGFzc3BocmFzZSwgc3RybGVuKHBhc3NwaHJhc2UpLAotCQkJCQkgICBOVUxMLCBOVUxMLCBOVUxMKTsKLQkJaWYgKGxvY2FsICE9IE5VTEwpIHsKLQkJCXB1dHMobG9jYWwpOwotCQkJbWVtc2V0KGxvY2FsLCAnXDAnLCBzdHJsZW4obG9jYWwpKTsKLQkJCWdfZnJlZShsb2NhbCk7Ci0JCX0gZWxzZSB7Ci0JCQlwdXRzKHBhc3NwaHJhc2UpOwotCQl9Ci0JfQotCQkKLQkvKiBaZXJvIHBhc3NwaHJhc2UgaW4gbWVtb3J5ICovCi0JbWVtc2V0KHBhc3NwaHJhc2UsICdcYicsIHN0cmxlbihwYXNzcGhyYXNlKSk7Ci0JZ3RrX2VudHJ5X3NldF90ZXh0KEdUS19FTlRSWShlbnRyeSksIHBhc3NwaHJhc2UpOwotCW1lbXNldChwYXNzcGhyYXNlLCAnXDAnLCBzdHJsZW4ocGFzc3BocmFzZSkpOwotCWdfZnJlZShwYXNzcGhyYXNlKTsKLQkJCQotCWd0a193aWRnZXRfZGVzdHJveShkaWFsb2cpOwotCXJldHVybiAocmVzdWx0ID09IEdUS19SRVNQT05TRV9PSyA/IDAgOiAtMSk7Ci0KLQkvKiBBdCBsZWFzdCBvbmUgZ3JhYiBmYWlsZWQgLSB1bmdyYWIgd2hhdCB3ZSBnb3QsIGFuZCByZXBvcnQKLQkgICB0aGUgZmFpbHVyZSB0byB0aGUgdXNlci4gIE5vdGUgdGhhdCBYR3JhYlNlcnZlcigpIGNhbm5vdAotCSAgIGZhaWwuICAqLwotIG5vZ3JhYmtiOgotCWdka19wb2ludGVyX3VuZ3JhYihHREtfQ1VSUkVOVF9USU1FKTsKLSBub2dyYWI6Ci0JaWYgKGdyYWJfc2VydmVyKQotCQlYVW5ncmFiU2VydmVyKEdES19ESVNQTEFZKCkpOwotCWd0a193aWRnZXRfZGVzdHJveShkaWFsb2cpOwotCQotCXJlcG9ydF9mYWlsZWRfZ3JhYihmYWlsZWQpOwotCi0JcmV0dXJuICgtMSk7Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0JY2hhciAqbWVzc2FnZTsKLQlpbnQgcmVzdWx0OwotCi0JZ3RrX2luaXQoJmFyZ2MsICZhcmd2KTsKLQotCWlmIChhcmdjID4gMSkgewotCQltZXNzYWdlID0gZ19zdHJqb2ludigiICIsIGFyZ3YgKyAxKTsKLQl9IGVsc2UgewotCQltZXNzYWdlID0gZ19zdHJkdXAoIkVudGVyIHlvdXIgT3BlblNTSCBwYXNzcGhyYXNlOiIpOwotCX0KLQotCXNldHZidWYoc3Rkb3V0LCAwLCBfSU9OQkYsIDApOwotCXJlc3VsdCA9IHBhc3NwaHJhc2VfZGlhbG9nKG1lc3NhZ2UpOwotCWdfZnJlZShtZXNzYWdlKTsKLQotCXJldHVybiAocmVzdWx0KTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvaHB1eC9SRUFETUUgYi9jb250cmliL2hwdXgvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGJmYTg0Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvaHB1eC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1SRUFETUUgZm9yIE9wZW5TU0ggSFAtVVggY29udHJpYiBmaWxlcwotS2V2aW4gU3RldmVzIDxzdGV2ZXNrQHBvYm94LmNvbT4KLQotc3NoZDoJCWNvbmZpZ3VyYXRpb24gZmlsZSBmb3Igc3NoZC5yYwotc3NoZC5yYzoJU1NIIHN0YXJ0dXAgc2NyaXB0Ci1lZ2Q6CQljb25maWd1cmF0aW9uIGZpbGUgZm9yIGVnZC5yYwotZWdkLnJjOgkJRUdEIChlbnRyb3B5IGdhdGhlcmluZyBkYWVtb24pIHN0YXJ0dXAgc2NyaXB0Ci0KLVRvIGluc3RhbGw6Ci0KLXNzaGQucmM6Ci0KLW8gVmVyaWZ5IHBhdGhzIGluIHNzaGQucmMgbWF0Y2ggeW91ciBsb2NhbCBpbnN0YWxsYXRpb24KLSAgKFdIQVRfUEFUSCBhbmQgV0hBVF9QSUQpCi1vIEN1c3RvbWl6ZSBzc2hkIGlmIG5lZWRlZCAoU1NIRF9BUkdTKQotbyBJbnN0YWxsOgotCi0gICMgY3Agc3NoZCAvZXRjL3JjLmNvbmZpZy5kCi0gICMgY2htb2QgNDQ0IC9ldGMvcmMuY29uZmlnLmQvc3NoZAotICAjIGNwIHNzaGQucmMgL3NiaW4vaW5pdC5kCi0gICMgY2htb2QgNTU1IC9zYmluL2luaXQuZC9zc2hkLnJjCi0gICMgbG4gLXMgL3NiaW4vaW5pdC5kL3NzaGQucmMgL3NiaW4vcmMxLmQvSzEwMHNzaGQKLSAgIyBsbiAtcyAvc2Jpbi9pbml0LmQvc3NoZC5yYyAvc2Jpbi9yYzIuZC9TOTAwc3NoZAotCi1lZ2QucmM6Ci0KLW8gVmVyaWZ5IGVnZC5wbCBwYXRoIGluIGVnZC5yYyBtYXRjaGVzIHlvdXIgbG9jYWwgaW5zdGFsbGF0aW9uCi0gIChXSEFUX1BBVEgpCi1vIEN1c3RvbWl6ZSBlZ2QgaWYgbmVlZGVkIChFR0RfQVJHUyBhbmQgRUdEX0xPRykKLW8gQWRkIHBzZXVkbyBhY2NvdW50OgotCi0gICMgZ3JvdXBhZGQgZWdkCi0gICMgdXNlcmFkZCAtZyBlZ2QgZWdkCi0gICMgbWtkaXIgLXAgL2V0Yy9vcHQvZWdkCi0gICMgY2hvd24gZWdkOmVnZCAvZXRjL29wdC9lZ2QKLSAgIyBjaG1vZCA3MTEgL2V0Yy9vcHQvZWdkCi0KLW8gSW5zdGFsbDoKLQotICAjIGNwIGVnZCAvZXRjL3JjLmNvbmZpZy5kCi0gICMgY2htb2QgNDQ0IC9ldGMvcmMuY29uZmlnLmQvZWdkCi0gICMgY3AgZWdkLnJjIC9zYmluL2luaXQuZAotICAjIGNobW9kIDU1NSAvc2Jpbi9pbml0LmQvZWdkLnJjCi0gICMgbG4gLXMgL3NiaW4vaW5pdC5kL2VnZC5yYyAvc2Jpbi9yYzEuZC9LNjAwZWdkCi0gICMgbG4gLXMgL3NiaW4vaW5pdC5kL2VnZC5yYyAvc2Jpbi9yYzIuZC9TNDAwZWdkCmRpZmYgLS1naXQgYS9jb250cmliL2hwdXgvZWdkIGIvY29udHJpYi9ocHV4L2VnZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhZjBiZC4uMDAwMDAwMAotLS0gYS9jb250cmliL2hwdXgvZWdkCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyBFR0RfU1RBUlQ6CQlTZXQgdG8gMSB0byBzdGFydCBlbnRyb3B5IGdhdGhlcmluZyBkYWVtb24KLSMgRUdEX0FSR1M6CQlDb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIHBhc3MgdG8gZWdkCi0jIEVHRF9MT0c6CQlFR0Qgc3Rkb3V0IGFuZCBzdGRlcnIgbG9nIGZpbGUgKGRlZmF1bHQgL2V0Yy9vcHQvZWdkL2VnZC5sb2cpCi0jCi0jIFRvIGNvbmZpZ3VyZSB0aGUgZWdkIGVudmlyb25tZW50OgotCi0jIGdyb3VwYWRkIGVnZAotIyB1c2VyYWRkIC1nIGVnZCBlZ2QKLSMgbWtkaXIgLXAgL2V0Yy9vcHQvZWdkCi0jIGNob3duIGVnZDplZ2QgL2V0Yy9vcHQvZWdkCi0jIGNobW9kIDcxMSAvZXRjL29wdC9lZ2QKLQotRUdEX1NUQVJUPTEKLUVHRF9BUkdTPScvZXRjL29wdC9lZ2QvZW50cm9weScKLUVHRF9MT0c9CmRpZmYgLS1naXQgYS9jb250cmliL2hwdXgvZWdkLnJjIGIvY29udHJpYi9ocHV4L2VnZC5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE5ZGVhNy4uMDAwMDAwMAotLS0gYS9jb250cmliL2hwdXgvZWdkLnJjCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotIyEvc2Jpbi9zaAotCi0jCi0jIGVnZC5yYzogRUdEIHN0YXJ0LXVwIGFuZCBzaHV0ZG93biBzY3JpcHQKLSMKLQotIyBBbGxvd2VkIGV4aXQgdmFsdWVzOgotIyAgICAgICAwID0gc3VjY2VzczsgY2F1c2VzICJPSyIgdG8gc2hvdyB1cCBpbiBjaGVja2xpc3QuCi0jICAgICAgIDEgPSBmYWlsdXJlOyBjYXVzZXMgIkZBSUwiIHRvIHNob3cgdXAgaW4gY2hlY2tsaXN0LgotIyAgICAgICAyID0gc2tpcDsgY2F1c2VzICJOL0EiIHRvIHNob3cgdXAgaW4gdGhlIGNoZWNrbGlzdC4KLSMgICAgICAgICAgIFVzZSB0aGlzIHZhbHVlIGlmIGV4ZWN1dGlvbiBvZiB0aGlzIHNjcmlwdCBpcyBvdmVycmlkZGVuCi0jICAgICAgICAgICBieSB0aGUgdXNlIG9mIGEgY29udHJvbCB2YXJpYWJsZSwgb3IgaWYgdGhpcyBzY3JpcHQgaXMgbm90Ci0jICAgICAgICAgICBhcHByb3ByaWF0ZSB0byBleGVjdXRlIGZvciBzb21lIG90aGVyIHJlYXNvbi4KLSMgICAgICAgMyA9IHJlYm9vdDsgY2F1c2VzIHRoZSBzeXN0ZW0gdG8gYmUgcmVib290ZWQgYWZ0ZXIgZXhlY3V0aW9uLgotCi0jIElucHV0IGFuZCBvdXRwdXQ6Ci0jICAgICAgIHN0ZGluIGlzIHJlZGlyZWN0ZWQgZnJvbSAvZGV2L251bGwKLSMKLSMgICAgICAgc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIHJlZGlyZWN0ZWQgdG8gdGhlIC9ldGMvcmMubG9nIGZpbGUKLSMgICAgICAgZHVyaW5nIGNoZWNrbGlzdCBtb2RlLCBvciB0byB0aGUgY29uc29sZSBpbiByYXcgbW9kZS4KLQotdW1hc2sgMDIyCi0KLVBBVEg9L3Vzci9zYmluOi91c3IvYmluOi9zYmluCi1leHBvcnQgUEFUSAotCi1XSEFUPSdFR0QgKGVudHJvcHkgZ2F0aGVyaW5nIGRhZW1vbiknCi1XSEFUX1BBVEg9L29wdC9wZXJsL2Jpbi9lZ2QucGwKLVdIQVRfQ09ORklHPS9ldGMvcmMuY29uZmlnLmQvZWdkCi1XSEFUX0xPRz0vZXRjL29wdC9lZ2QvZWdkLmxvZwotCi0jIE5PVEU6IElmIHlvdXIgc2NyaXB0IGV4ZWN1dGVzIGluIHJ1biBzdGF0ZSAwIG9yIHN0YXRlIDEsIHRoZW4gL3VzciBtaWdodAotIyAgICAgICBub3QgYmUgYXZhaWxhYmxlLiAgRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIGNvbW1hbmRzIG9yIGZpbGVzIGluCi0jICAgICAgIC91c3IgdW5sZXNzIHlvdXIgc2NyaXB0IGV4ZWN1dGVzIGluIHJ1biBzdGF0ZSAyIG9yIGdyZWF0ZXIuICBPdGhlcgotIyAgICAgICBmaWxlIHN5c3RlbXMgdHlwaWNhbGx5IG5vdCBtb3VudGVkIHVudGlsIHJ1biBzdGF0ZSAyIGluY2x1ZGUgL3ZhcgotIyAgICAgICBhbmQgL29wdC4KLQotcnZhbD0wCi0KLSMgQ2hlY2sgdGhlIGV4aXQgdmFsdWUgb2YgYSBjb21tYW5kIHJ1biBieSB0aGlzIHNjcmlwdC4gIElmIG5vbi16ZXJvLCB0aGUKLSMgZXhpdCBjb2RlIGlzIGVjaG9lZCB0byB0aGUgbG9nIGZpbGUgYW5kIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBzY3JpcHQKLSMgaXMgc2V0IHRvIGluZGljYXRlIGZhaWx1cmUuCi0KLXNldF9yZXR1cm4oKSB7Ci0JeD0kPwotCWlmIFsgJHggLW5lIDAgXTsgdGhlbgotCQllY2hvICJFWElUIENPREU6ICR4IgotCQlydmFsPTEJIyBzY3JpcHQgRkFJTGVkCi0JZmkKLX0KLQotY2FzZSAkMSBpbgotJ3N0YXJ0X21zZycpCi0JZWNobyAiU3RhcnRpbmcgJFdIQVQiCi0JOzsKLQotJ3N0b3BfbXNnJykKLQllY2hvICJTdG9wcGluZyAkV0hBVCIKLQk7OwotCi0nc3RhcnQnKQotCWlmIFsgLWYgJFdIQVRfQ09ORklHIF0gOyB0aGVuCi0JCS4gJFdIQVRfQ09ORklHCi0JZWxzZQotCQllY2hvICJFUlJPUjogJFdIQVRfQ09ORklHIGRlZmF1bHRzIGZpbGUgTUlTU0lORyIKLQlmaQotCQotCi0JaWYgWyAiJEVHRF9TVEFSVCIgLWVxIDEgLWEgLXggJFdIQVRfUEFUSCBdOyB0aGVuCi0JCUVHRF9MT0c9JHtFR0RfTE9HOi0kV0hBVF9MT0d9Ci0JCXN1IGVnZCAtYyAibm9odXAgJFdIQVRfUEFUSCAkRUdEX0FSR1MgPiRFR0RfTE9HIDI+JjEiICYmCi0JCQllY2hvICRXSEFUIHN0YXJ0ZWQKLQkJc2V0X3JldHVybgotCWVsc2UKLQkJcnZhbD0yCi0JZmkKLQk7OwotCi0nc3RvcCcpCi0JcGlkPWBwcyAtZnVlZ2QgfCBhd2sgJyQxID09ICJlZ2QiIHsgcHJpbnQgJDIgfSdgCi0JaWYgWyAiWCRwaWQiICE9ICJYIiBdOyB0aGVuCi0JCWlmIGtpbGwgIiRwaWQiOyB0aGVuCi0JCQllY2hvICIkV0hBVCBzdG9wcGVkIgotCQllbHNlCi0JCQlydmFsPTEKLQkJCWVjaG8gIlVuYWJsZSB0byBzdG9wICRXSEFUIgotCQlmaQotCWZpCi0Jc2V0X3JldHVybgotCTs7Ci0KLSopCi0JZWNobyAidXNhZ2U6ICQwIHtzdGFydHxzdG9wfHN0YXJ0X21zZ3xzdG9wX21zZ30iCi0JcnZhbD0xCi0JOzsKLWVzYWMKLQotZXhpdCAkcnZhbApkaWZmIC0tZ2l0IGEvY29udHJpYi9ocHV4L3NzaGQgYi9jb250cmliL2hwdXgvc3NoZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViNWU5Mi4uMDAwMDAwMAotLS0gYS9jb250cmliL2hwdXgvc3NoZAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBTU0hEX1NUQVJUOgkJU2V0IHRvIDEgdG8gc3RhcnQgU1NIIGRhZW1vbgotIyBTU0hEX0FSR1M6CQlDb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIHBhc3MgdG8gc3NoZAotIwotU1NIRF9TVEFSVD0xCi1TU0hEX0FSR1M9CmRpZmYgLS1naXQgYS9jb250cmliL2hwdXgvc3NoZC5yYyBiL2NvbnRyaWIvaHB1eC9zc2hkLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOWExMDk5Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvaHB1eC9zc2hkLnJjCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotIyEvc2Jpbi9zaAotCi0jCi0jIHNzaGQucmM6IFNTSCBkYWVtb24gc3RhcnQtdXAgYW5kIHNodXRkb3duIHNjcmlwdAotIwotCi0jIEFsbG93ZWQgZXhpdCB2YWx1ZXM6Ci0jCTAgPSBzdWNjZXNzOyBjYXVzZXMgIk9LIiB0byBzaG93IHVwIGluIGNoZWNrbGlzdC4KLSMJMSA9IGZhaWx1cmU7IGNhdXNlcyAiRkFJTCIgdG8gc2hvdyB1cCBpbiBjaGVja2xpc3QuCi0jCTIgPSBza2lwOyBjYXVzZXMgIk4vQSIgdG8gc2hvdyB1cCBpbiB0aGUgY2hlY2tsaXN0LgotIyAgICAgICAgICAgVXNlIHRoaXMgdmFsdWUgaWYgZXhlY3V0aW9uIG9mIHRoaXMgc2NyaXB0IGlzIG92ZXJyaWRkZW4KLSMJICAgIGJ5IHRoZSB1c2Ugb2YgYSBjb250cm9sIHZhcmlhYmxlLCBvciBpZiB0aGlzIHNjcmlwdCBpcyBub3QKLSMJICAgIGFwcHJvcHJpYXRlIHRvIGV4ZWN1dGUgZm9yIHNvbWUgb3RoZXIgcmVhc29uLgotIyAgICAgICAzID0gcmVib290OyBjYXVzZXMgdGhlIHN5c3RlbSB0byBiZSByZWJvb3RlZCBhZnRlciBleGVjdXRpb24uCi0KLSMgSW5wdXQgYW5kIG91dHB1dDoKLSMJc3RkaW4gaXMgcmVkaXJlY3RlZCBmcm9tIC9kZXYvbnVsbAotIwotIwlzdGRvdXQgYW5kIHN0ZGVyciBhcmUgcmVkaXJlY3RlZCB0byB0aGUgL2V0Yy9yYy5sb2cgZmlsZQotIwlkdXJpbmcgY2hlY2tsaXN0IG1vZGUsIG9yIHRvIHRoZSBjb25zb2xlIGluIHJhdyBtb2RlLgotCi1QQVRIPS91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbgotZXhwb3J0IFBBVEgKLQotV0hBVD0nT3BlblNTSCcKLVdIQVRfUEFUSD0vb3B0L29wZW5zc2gvc2Jpbi9zc2hkCi1XSEFUX1BJRD0vdmFyL3J1bi9zc2hkLnBpZAotV0hBVF9DT05GSUc9L2V0Yy9yYy5jb25maWcuZC9zc2hkCi0KLSMgTk9URTogSWYgeW91ciBzY3JpcHQgZXhlY3V0ZXMgaW4gcnVuIHN0YXRlIDAgb3Igc3RhdGUgMSwgdGhlbiAvdXNyIG1pZ2h0Ci0jCW5vdCBiZSBhdmFpbGFibGUuICBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgY29tbWFuZHMgb3IgZmlsZXMgaW4KLSMJL3VzciB1bmxlc3MgeW91ciBzY3JpcHQgZXhlY3V0ZXMgaW4gcnVuIHN0YXRlIDIgb3IgZ3JlYXRlci4gIE90aGVyCi0jCWZpbGUgc3lzdGVtcyB0eXBpY2FsbHkgbm90IG1vdW50ZWQgdW50aWwgcnVuIHN0YXRlIDIgaW5jbHVkZSAvdmFyCi0jCWFuZCAvb3B0LgotCi1ydmFsPTAKLQotIyBDaGVjayB0aGUgZXhpdCB2YWx1ZSBvZiBhIGNvbW1hbmQgcnVuIGJ5IHRoaXMgc2NyaXB0LiAgSWYgbm9uLXplcm8sIHRoZQotIyBleGl0IGNvZGUgaXMgZWNob2VkIHRvIHRoZSBsb2cgZmlsZSBhbmQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIHNjcmlwdAotIyBpcyBzZXQgdG8gaW5kaWNhdGUgZmFpbHVyZS4KLQotc2V0X3JldHVybigpIHsKLQl4PSQ/Ci0JaWYgWyAkeCAtbmUgMCBdOyB0aGVuCi0JCWVjaG8gIkVYSVQgQ09ERTogJHgiCi0JCXJ2YWw9MQkjIHNjcmlwdCBGQUlMZWQKLQlmaQotfQotCi1jYXNlICQxIGluCi0nc3RhcnRfbXNnJykKLQllY2hvICJTdGFydGluZyAkV0hBVCIKLQk7OwotCi0nc3RvcF9tc2cnKQotCWVjaG8gIlN0b3BwaW5nICRXSEFUIgotCTs7Ci0KLSdzdGFydCcpCi0JaWYgWyAtZiAkV0hBVF9DT05GSUcgXSA7IHRoZW4KLQkJLiAkV0hBVF9DT05GSUcKLQllbHNlCi0JCWVjaG8gIkVSUk9SOiAkV0hBVF9DT05GSUcgZGVmYXVsdHMgZmlsZSBNSVNTSU5HIgotCWZpCi0JCi0JaWYgWyAiJFNTSERfU1RBUlQiIC1lcSAxIC1hIC14ICIkV0hBVF9QQVRIIiBdOyB0aGVuCi0JCSRXSEFUX1BBVEggJFNTSERfQVJHUyAmJiBlY2hvICIkV0hBVCBzdGFydGVkIgotCQlzZXRfcmV0dXJuCi0JZWxzZQotCQlydmFsPTIKLQlmaQotCTs7Ci0KLSdzdG9wJykKLQlpZiBraWxsIGBjYXQgJFdIQVRfUElEYDsgdGhlbgotCQllY2hvICIkV0hBVCBzdG9wcGVkIgotCWVsc2UKLQkJcnZhbD0xCi0JCWVjaG8gIlVuYWJsZSB0byBzdG9wICRXSEFUIgotCWZpCi0Jc2V0X3JldHVybgotCTs7Ci0KLSopCi0JZWNobyAidXNhZ2U6ICQwIHtzdGFydHxzdG9wfHN0YXJ0X21zZ3xzdG9wX21zZ30iCi0JcnZhbD0xCi0JOzsKLWVzYWMKLQotZXhpdCAkcnZhbApkaWZmIC0tZ2l0IGEvY29udHJpYi9yZWRoYXQvZ25vbWUtc3NoLWFza3Bhc3MuY3NoIGIvY29udHJpYi9yZWRoYXQvZ25vbWUtc3NoLWFza3Bhc3MuY3NoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDc3NzEyLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcmVkaGF0L2dub21lLXNzaC1hc2twYXNzLmNzaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXNldGVudiBTU0hfQVNLUEFTUyAvdXNyL2xpYmV4ZWMvb3BlbnNzaC9nbm9tZS1zc2gtYXNrcGFzcwpkaWZmIC0tZ2l0IGEvY29udHJpYi9yZWRoYXQvZ25vbWUtc3NoLWFza3Bhc3Muc2ggYi9jb250cmliL3JlZGhhdC9nbm9tZS1zc2gtYXNrcGFzcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU1MTg5Zi4uMDAwMDAwMAotLS0gYS9jb250cmliL3JlZGhhdC9nbm9tZS1zc2gtYXNrcGFzcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotU1NIX0FTS1BBU1M9L3Vzci9saWJleGVjL29wZW5zc2gvZ25vbWUtc3NoLWFza3Bhc3MKLWV4cG9ydCBTU0hfQVNLUEFTUwpkaWZmIC0tZ2l0IGEvY29udHJpYi9yZWRoYXQvb3BlbnNzaC5zcGVjIGIvY29udHJpYi9yZWRoYXQvb3BlbnNzaC5zcGVjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTZkZTA4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcmVkaGF0L29wZW5zc2guc3BlYworKysgL2Rldi9udWxsCkBAIC0xLDgxMiArMCwwIEBACi0lZGVmaW5lIHZlciA1LjlwMQotJWRlZmluZSByZWwgMQotCi0jIE9wZW5TU0ggcHJpdmlsZWdlIHNlcGFyYXRpb24gcmVxdWlyZXMgYSB1c2VyICYgZ3JvdXAgSUQKLSVkZWZpbmUgc3NoZF91aWQgICAgNzQKLSVkZWZpbmUgc3NoZF9naWQgICAgNzQKLQotIyBWZXJzaW9uIG9mIHNzaC1hc2twYXNzCi0lZGVmaW5lIGF2ZXJzaW9uIDEuMi40LjEKLQotIyBEbyB3ZSB3YW50IHRvIGRpc2FibGUgYnVpbGRpbmcgb2YgeDExLWFza3Bhc3M/ICgxPXllcyAwPW5vKQotJWRlZmluZSBub194MTFfYXNrcGFzcyAwCi0KLSMgRG8gd2Ugd2FudCB0byBkaXNhYmxlIGJ1aWxkaW5nIG9mIGdub21lLWFza3Bhc3M/ICgxPXllcyAwPW5vKQotJWRlZmluZSBub19nbm9tZV9hc2twYXNzIDAKLQotIyBEbyB3ZSB3YW50IHRvIGxpbmsgYWdhaW5zdCBhIHN0YXRpYyBsaWJjcnlwdG8/ICgxPXllcyAwPW5vKQotJWRlZmluZSBzdGF0aWNfbGliY3J5cHRvIDAKLQotIyBEbyB3ZSB3YW50IHNtYXJ0Y2FyZCBzdXBwb3J0ICgxPXllcyAwPW5vKQotJWRlZmluZSBzY2FyZCAwCi0KLSMgVXNlIEdUSzIgaW5zdGVhZCBvZiBHTk9NRSBpbiBnbm9tZS1zc2gtYXNrcGFzcwotJWRlZmluZSBndGsyIDEKLQotIyBJcyB0aGlzIGJ1aWxkIGZvciBSSEwgNi54PwotJWRlZmluZSBidWlsZDZ4IDAKLQotIyBEbyB3ZSB3YW50IGtlcmJlcm9zNSBzdXBwb3J0ICgxPXllcyAwPW5vKQotJWRlZmluZSBrZXJiZXJvczUgMQotCi0jIFJlc2VydmUgb3B0aW9ucyB0byBvdmVycmlkZSBhc2twYXNzIHNldHRpbmdzIHdpdGg6Ci0jIHJwbSAtYmF8LS1yZWJ1aWxkIC0tZGVmaW5lICdza2lwX3h4eCAxJwotJXs/c2tpcF94MTFfYXNrcGFzczolZGVmaW5lIG5vX3gxMV9hc2twYXNzIDF9Ci0lez9za2lwX2dub21lX2Fza3Bhc3M6JWRlZmluZSBub19nbm9tZV9hc2twYXNzIDF9Ci0KLSMgQWRkIG9wdGlvbiB0byBidWlsZCB3aXRob3V0IEdUSzIgZm9yIG9sZGVyIHBsYXRmb3JtcyB3aXRoIG9ubHkgR1RLKy4KLSMgUmVkSGF0IDw9IDcuMiBhbmQgUmVkIEhhdCBBZHZhbmNlZCBTZXJ2ZXIgMi4xIGFyZSBleGFtcGxlcy4KLSMgcnBtIC1iYXwtLXJlYnVpbGQgLS1kZWZpbmUgJ25vX2d0azIgMScKLSV7P25vX2d0azI6JWRlZmluZSBndGsyIDB9Ci0KLSMgSXMgdGhpcyBhIGJ1aWxkIGZvciBSSEwgNi54IG9yIGVhcmxpZXI/Ci0lez9idWlsZF82eDolZGVmaW5lIGJ1aWxkNnggMX0KLQotIyBJZiB0aGlzIGlzIFJITCA2LngsIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaGFzIHN5c2NvbmZkaXIgaW4gL3Vzci9ldGMuCi0laWYgJXtidWlsZDZ4fQotJWRlZmluZSBfc3lzY29uZmRpciAvZXRjCi0lZW5kaWYKLQotIyBPcHRpb25zIGZvciBzdGF0aWMgT3BlblNTTCBsaW5rOgotIyBycG0gLWJhfC0tcmVidWlsZCAtLWRlZmluZSAic3RhdGljX29wZW5zc2wgMSIKLSV7P3N0YXRpY19vcGVuc3NsOiVkZWZpbmUgc3RhdGljX2xpYmNyeXB0byAxfQotCi0jIE9wdGlvbnMgZm9yIFNtYXJ0Y2FyZCBzdXBwb3J0OiAobmVlZHMgbGlic2VjdG9rIGFuZCBvcGVuc3NsLWVuZ2luZSkKLSMgcnBtIC1iYXwtLXJlYnVpbGQgLS1kZWZpbmUgInNtYXJ0Y2FyZCAxIgotJXs/c21hcnRjYXJkOiVkZWZpbmUgc2NhcmQgMX0KLQotIyBJcyB0aGlzIGEgYnVpbGQgZm9yIHRoZSByZXNjdWUgQ0QgKHdpdGhvdXQgUEFNLCB3aXRoIE1ENSk/ICgxPXllcyAwPW5vKQotJWRlZmluZSByZXNjdWUgMAotJXs/YnVpbGRfcmVzY3VlOiVkZWZpbmUgcmVzY3VlIDF9Ci0KLSMgVHVybiBvZmYgc29tZSBzdHVmZiBmb3IgcmVzdWNlIGJ1aWxkcwotJWlmICV7cmVzY3VlfQotJWRlZmluZSBrZXJiZXJvczUgMAotJWVuZGlmCi0KLVN1bW1hcnk6IFRoZSBPcGVuU1NIIGltcGxlbWVudGF0aW9uIG9mIFNTSCBwcm90b2NvbCB2ZXJzaW9ucyAxIGFuZCAyLgotTmFtZTogb3BlbnNzaAotVmVyc2lvbjogJXt2ZXJ9Ci0laWYgJXtyZXNjdWV9Ci1SZWxlYXNlOiAle3JlbH1yZXNjdWUKLSVlbHNlCi1SZWxlYXNlOiAle3JlbH0KLSVlbmRpZgotVVJMOiBodHRwOi8vd3d3Lm9wZW5zc2guY29tL3BvcnRhYmxlLmh0bWwKLVNvdXJjZTA6IGZ0cDovL2Z0cC5vcGVuYnNkLm9yZy9wdWIvT3BlbkJTRC9PcGVuU1NIL3BvcnRhYmxlL29wZW5zc2gtJXt2ZXJzaW9ufS50YXIuZ3oKLSVpZiAhICV7bm9feDExX2Fza3Bhc3N9Ci1Tb3VyY2UxOiBodHRwOi8vd3d3Lmpta25vYmxlLm5ldC9zb2Z0d2FyZS94MTEtc3NoLWFza3Bhc3MveDExLXNzaC1hc2twYXNzLSV7YXZlcnNpb259LnRhci5negotJWVuZGlmCi1MaWNlbnNlOiBCU0QKLUdyb3VwOiBBcHBsaWNhdGlvbnMvSW50ZXJuZXQKLUJ1aWxkUm9vdDogJXtfdG1wcGF0aH0vJXtuYW1lfS0le3ZlcnNpb259LWJ1aWxkcm9vdAotT2Jzb2xldGVzOiBzc2gKLSVpZiAle2J1aWxkNnh9Ci1QcmVSZXE6IGluaXRzY3JpcHRzID49IDUuMDAKLSVlbHNlCi1SZXF1aXJlczogaW5pdHNjcmlwdHMgPj0gNS4yMAotJWVuZGlmCi1CdWlsZFJlcXVpcmVzOiBwZXJsLCBvcGVuc3NsLWRldmVsLCB0Y3Bfd3JhcHBlcnMKLUJ1aWxkUmVxdWlyZXM6IC9iaW4vbG9naW4KLSVpZiAhICV7YnVpbGQ2eH0KLUJ1aWxkUHJlUmVxOiBnbGliYy1kZXZlbCwgcGFtCi0lZWxzZQotQnVpbGRSZXF1aXJlczogL3Vzci9pbmNsdWRlL3NlY3VyaXR5L3BhbV9hcHBsLmgKLSVlbmRpZgotJWlmICEgJXtub194MTFfYXNrcGFzc30KLUJ1aWxkUmVxdWlyZXM6IC91c3IvaW5jbHVkZS9YMTEvWGxpYi5oCi0lZW5kaWYKLSVpZiAhICV7bm9fZ25vbWVfYXNrcGFzc30KLUJ1aWxkUmVxdWlyZXM6IHBrZ2NvbmZpZwotJWVuZGlmCi0laWYgJXtrZXJiZXJvczV9Ci1CdWlsZFJlcXVpcmVzOiBrcmI1LWRldmVsCi1CdWlsZFJlcXVpcmVzOiBrcmI1LWxpYnMKLSVlbmRpZgotCi0lcGFja2FnZSBjbGllbnRzCi1TdW1tYXJ5OiBPcGVuU1NIIGNsaWVudHMuCi1SZXF1aXJlczogb3BlbnNzaCA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQotR3JvdXA6IEFwcGxpY2F0aW9ucy9JbnRlcm5ldAotT2Jzb2xldGVzOiBzc2gtY2xpZW50cwotCi0lcGFja2FnZSBzZXJ2ZXIKLVN1bW1hcnk6IFRoZSBPcGVuU1NIIHNlcnZlciBkYWVtb24uCi1Hcm91cDogU3lzdGVtIEVudmlyb25tZW50L0RhZW1vbnMKLU9ic29sZXRlczogc3NoLXNlcnZlcgotUmVxdWlyZXM6IG9wZW5zc2ggPSAle3ZlcnNpb259LSV7cmVsZWFzZX0sIGNoa2NvbmZpZyA+PSAwLjkKLSVpZiAhICV7YnVpbGQ2eH0KLVJlcXVpcmVzOiAvZXRjL3BhbS5kL3N5c3RlbS1hdXRoCi0lZW5kaWYKLQotJXBhY2thZ2UgYXNrcGFzcwotU3VtbWFyeTogQSBwYXNzcGhyYXNlIGRpYWxvZyBmb3IgT3BlblNTSCBhbmQgWC4KLUdyb3VwOiBBcHBsaWNhdGlvbnMvSW50ZXJuZXQKLVJlcXVpcmVzOiBvcGVuc3NoID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9Ci1PYnNvbGV0ZXM6IHNzaC1leHRyYXMKLQotJXBhY2thZ2UgYXNrcGFzcy1nbm9tZQotU3VtbWFyeTogQSBwYXNzcGhyYXNlIGRpYWxvZyBmb3IgT3BlblNTSCwgWCwgYW5kIEdOT01FLgotR3JvdXA6IEFwcGxpY2F0aW9ucy9JbnRlcm5ldAotUmVxdWlyZXM6IG9wZW5zc2ggPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KLU9ic29sZXRlczogc3NoLWV4dHJhcwotCi0lZGVzY3JpcHRpb24KLVNTSCAoU2VjdXJlIFNIZWxsKSBpcyBhIHByb2dyYW0gZm9yIGxvZ2dpbmcgaW50byBhbmQgZXhlY3V0aW5nCi1jb21tYW5kcyBvbiBhIHJlbW90ZSBtYWNoaW5lLiBTU0ggaXMgaW50ZW5kZWQgdG8gcmVwbGFjZSBybG9naW4gYW5kCi1yc2gsIGFuZCB0byBwcm92aWRlIHNlY3VyZSBlbmNyeXB0ZWQgY29tbXVuaWNhdGlvbnMgYmV0d2VlbiB0d28KLXVudHJ1c3RlZCBob3N0cyBvdmVyIGFuIGluc2VjdXJlIG5ldHdvcmsuIFgxMSBjb25uZWN0aW9ucyBhbmQKLWFyYml0cmFyeSBUQ1AvSVAgcG9ydHMgY2FuIGFsc28gYmUgZm9yd2FyZGVkIG92ZXIgdGhlIHNlY3VyZSBjaGFubmVsLgotCi1PcGVuU1NIIGlzIE9wZW5CU0QncyB2ZXJzaW9uIG9mIHRoZSBsYXN0IGZyZWUgdmVyc2lvbiBvZiBTU0gsIGJyaW5naW5nCi1pdCB1cCB0byBkYXRlIGluIHRlcm1zIG9mIHNlY3VyaXR5IGFuZCBmZWF0dXJlcywgYXMgd2VsbCBhcyByZW1vdmluZwotYWxsIHBhdGVudGVkIGFsZ29yaXRobXMgdG8gc2VwYXJhdGUgbGlicmFyaWVzLgotCi1UaGlzIHBhY2thZ2UgaW5jbHVkZXMgdGhlIGNvcmUgZmlsZXMgbmVjZXNzYXJ5IGZvciBib3RoIHRoZSBPcGVuU1NICi1jbGllbnQgYW5kIHNlcnZlci4gVG8gbWFrZSB0aGlzIHBhY2thZ2UgdXNlZnVsLCB5b3Ugc2hvdWxkIGFsc28KLWluc3RhbGwgb3BlbnNzaC1jbGllbnRzLCBvcGVuc3NoLXNlcnZlciwgb3IgYm90aC4KLQotJWRlc2NyaXB0aW9uIGNsaWVudHMKLU9wZW5TU0ggaXMgYSBmcmVlIHZlcnNpb24gb2YgU1NIIChTZWN1cmUgU0hlbGwpLCBhIHByb2dyYW0gZm9yIGxvZ2dpbmcKLWludG8gYW5kIGV4ZWN1dGluZyBjb21tYW5kcyBvbiBhIHJlbW90ZSBtYWNoaW5lLiBUaGlzIHBhY2thZ2UgaW5jbHVkZXMKLXRoZSBjbGllbnRzIG5lY2Vzc2FyeSB0byBtYWtlIGVuY3J5cHRlZCBjb25uZWN0aW9ucyB0byBTU0ggc2VydmVycy4KLVlvdSdsbCBhbHNvIG5lZWQgdG8gaW5zdGFsbCB0aGUgb3BlbnNzaCBwYWNrYWdlIG9uIE9wZW5TU0ggY2xpZW50cy4KLQotJWRlc2NyaXB0aW9uIHNlcnZlcgotT3BlblNTSCBpcyBhIGZyZWUgdmVyc2lvbiBvZiBTU0ggKFNlY3VyZSBTSGVsbCksIGEgcHJvZ3JhbSBmb3IgbG9nZ2luZwotaW50byBhbmQgZXhlY3V0aW5nIGNvbW1hbmRzIG9uIGEgcmVtb3RlIG1hY2hpbmUuIFRoaXMgcGFja2FnZSBjb250YWlucwotdGhlIHNlY3VyZSBzaGVsbCBkYWVtb24gKHNzaGQpLiBUaGUgc3NoZCBkYWVtb24gYWxsb3dzIFNTSCBjbGllbnRzIHRvCi1zZWN1cmVseSBjb25uZWN0IHRvIHlvdXIgU1NIIHNlcnZlci4gWW91IGFsc28gbmVlZCB0byBoYXZlIHRoZSBvcGVuc3NoCi1wYWNrYWdlIGluc3RhbGxlZC4KLQotJWRlc2NyaXB0aW9uIGFza3Bhc3MKLU9wZW5TU0ggaXMgYSBmcmVlIHZlcnNpb24gb2YgU1NIIChTZWN1cmUgU0hlbGwpLCBhIHByb2dyYW0gZm9yIGxvZ2dpbmcKLWludG8gYW5kIGV4ZWN1dGluZyBjb21tYW5kcyBvbiBhIHJlbW90ZSBtYWNoaW5lLiBUaGlzIHBhY2thZ2UgY29udGFpbnMKLWFuIFgxMSBwYXNzcGhyYXNlIGRpYWxvZyBmb3IgT3BlblNTSC4KLQotJWRlc2NyaXB0aW9uIGFza3Bhc3MtZ25vbWUKLU9wZW5TU0ggaXMgYSBmcmVlIHZlcnNpb24gb2YgU1NIIChTZWN1cmUgU0hlbGwpLCBhIHByb2dyYW0gZm9yIGxvZ2dpbmcKLWludG8gYW5kIGV4ZWN1dGluZyBjb21tYW5kcyBvbiBhIHJlbW90ZSBtYWNoaW5lLiBUaGlzIHBhY2thZ2UgY29udGFpbnMKLWFuIFgxMSBwYXNzcGhyYXNlIGRpYWxvZyBmb3IgT3BlblNTSCBhbmQgdGhlIEdOT01FIEdVSSBkZXNrdG9wCi1lbnZpcm9ubWVudC4KLQotJXByZXAKLQotJWlmICEgJXtub194MTFfYXNrcGFzc30KLSVzZXR1cCAtcSAtYSAxCi0lZWxzZQotJXNldHVwIC1xCi0lZW5kaWYKLQotJWJ1aWxkCi0laWYgJXtyZXNjdWV9Ci1DRkxBR1M9IiRSUE1fT1BUX0ZMQUdTIC1PcyI7IGV4cG9ydCBDRkxBR1MKLSVlbmRpZgotCi0laWYgJXtrZXJiZXJvczV9Ci1LNURJUj1gcnBtIC1xbCBrcmI1LWRldmVsIHwgZ3JlcCBpbmNsdWRlL2tyYjUuaCB8IHNlZCAncyxcL2luY2x1ZGVcL2tyYjUuaCwsJ2AKLWVjaG8gSzVESVI9JEs1RElSCi0lZW5kaWYKLQotJWNvbmZpZ3VyZSBcCi0JLS1zeXNjb25mZGlyPSV7X3N5c2NvbmZkaXJ9L3NzaCBcCi0JLS1saWJleGVjZGlyPSV7X2xpYmV4ZWNkaXJ9L29wZW5zc2ggXAotCS0tZGF0YWRpcj0le19kYXRhZGlyfS9vcGVuc3NoIFwKLQktLXdpdGgtdGNwLXdyYXBwZXJzIFwKLQktLXdpdGgtcnNoPSV7X2JpbmRpcn0vcnNoIFwKLQktLXdpdGgtZGVmYXVsdC1wYXRoPS91c3IvbG9jYWwvYmluOi9iaW46L3Vzci9iaW4gXAotCS0td2l0aC1zdXBlcnVzZXItcGF0aD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW4gXAotCS0td2l0aC1wcml2c2VwLXBhdGg9JXtfdmFyfS9lbXB0eS9zc2hkIFwKLQktLXdpdGgtbWQ1LXBhc3N3b3JkcyBcCi0laWYgJXtzY2FyZH0KLQktLXdpdGgtc21hcnRjYXJkIFwKLSVlbmRpZgotJWlmICV7cmVzY3VlfQotCS0td2l0aG91dC1wYW0gXAotJWVsc2UKLQktLXdpdGgtcGFtIFwKLSVlbmRpZgotJWlmICV7a2VyYmVyb3M1fQotCSAtLXdpdGgta2VyYmVyb3M1PSRLNURJUiBcCi0lZW5kaWYKLQotCi0laWYgJXtzdGF0aWNfbGliY3J5cHRvfQotcGVybCAtcGkgLWUgInN8LWxjcnlwdG98JXtfbGliZGlyfS9saWJjcnlwdG8uYXxnIiBNYWtlZmlsZQotJWVuZGlmCi0KLW1ha2UKLQotJWlmICEgJXtub194MTFfYXNrcGFzc30KLXB1c2hkIHgxMS1zc2gtYXNrcGFzcy0le2F2ZXJzaW9ufQotJWNvbmZpZ3VyZSAtLWxpYmV4ZWNkaXI9JXtfbGliZXhlY2Rpcn0vb3BlbnNzaAoteG1rbWYgLWEKLW1ha2UKLXBvcGQKLSVlbmRpZgotCi0jIERlZmluZSBhIHZhcmlhYmxlIHRvIHRvZ2dsZSBnbm9tZTEvZ3RrMiBidWlsZGluZy4gIFRoaXMgaXMgbmVjZXNzYXJ5Ci0jIGJlY2F1c2UgUlBNIGRvZXNuJ3QgaGFuZGxlIG5lc3RlZCAlaWYgc3RhdGVtZW50cy4KLSVpZiAle2d0azJ9Ci0JZ3RrMj15ZXMKLSVlbHNlCi0JZ3RrMj1ubwotJWVuZGlmCi0KLSVpZiAhICV7bm9fZ25vbWVfYXNrcGFzc30KLXB1c2hkIGNvbnRyaWIKLWlmIFsgJGd0azIgPSB5ZXMgXSA7IHRoZW4KLQltYWtlIGdub21lLXNzaC1hc2twYXNzMgotCW12IGdub21lLXNzaC1hc2twYXNzMiBnbm9tZS1zc2gtYXNrcGFzcwotZWxzZQotCW1ha2UgZ25vbWUtc3NoLWFza3Bhc3MxCi0JbXYgZ25vbWUtc3NoLWFza3Bhc3MxIGdub21lLXNzaC1hc2twYXNzCi1maQotcG9wZAotJWVuZGlmCi0KLSVpbnN0YWxsCi1ybSAtcmYgJFJQTV9CVUlMRF9ST09UCi1ta2RpciAtcCAtbTc1NSAkUlBNX0JVSUxEX1JPT1Qle19zeXNjb25mZGlyfS9zc2gKLW1rZGlyIC1wIC1tNzU1ICRSUE1fQlVJTERfUk9PVCV7X2xpYmV4ZWNkaXJ9L29wZW5zc2gKLW1rZGlyIC1wIC1tNzU1ICRSUE1fQlVJTERfUk9PVCV7X3Zhcn0vZW1wdHkvc3NoZAotCi1tYWtlIGluc3RhbGwgREVTVERJUj0kUlBNX0JVSUxEX1JPT1QKLQotaW5zdGFsbCAtZCAkUlBNX0JVSUxEX1JPT1QvZXRjL3BhbS5kLwotaW5zdGFsbCAtZCAkUlBNX0JVSUxEX1JPT1QvZXRjL3JjLmQvaW5pdC5kCi1pbnN0YWxsIC1kICRSUE1fQlVJTERfUk9PVCV7X2xpYmV4ZWNkaXJ9L29wZW5zc2gKLSVpZiAle2J1aWxkNnh9Ci1pbnN0YWxsIC1tNjQ0IGNvbnRyaWIvcmVkaGF0L3NzaGQucGFtLm9sZCAkUlBNX0JVSUxEX1JPT1QvZXRjL3BhbS5kL3NzaGQKLSVlbHNlCi1pbnN0YWxsIC1tNjQ0IGNvbnRyaWIvcmVkaGF0L3NzaGQucGFtICAgICAkUlBNX0JVSUxEX1JPT1QvZXRjL3BhbS5kL3NzaGQKLSVlbmRpZgotaW5zdGFsbCAtbTc1NSBjb250cmliL3JlZGhhdC9zc2hkLmluaXQgJFJQTV9CVUlMRF9ST09UL2V0Yy9yYy5kL2luaXQuZC9zc2hkCi0KLSVpZiAhICV7bm9feDExX2Fza3Bhc3N9Ci1pbnN0YWxsIC1zIHgxMS1zc2gtYXNrcGFzcy0le2F2ZXJzaW9ufS94MTEtc3NoLWFza3Bhc3MgJFJQTV9CVUlMRF9ST09UJXtfbGliZXhlY2Rpcn0vb3BlbnNzaC94MTEtc3NoLWFza3Bhc3MKLWxuIC1zIHgxMS1zc2gtYXNrcGFzcyAkUlBNX0JVSUxEX1JPT1Qle19saWJleGVjZGlyfS9vcGVuc3NoL3NzaC1hc2twYXNzCi0lZW5kaWYKLQotJWlmICEgJXtub19nbm9tZV9hc2twYXNzfQotaW5zdGFsbCAtcyBjb250cmliL2dub21lLXNzaC1hc2twYXNzICRSUE1fQlVJTERfUk9PVCV7X2xpYmV4ZWNkaXJ9L29wZW5zc2gvZ25vbWUtc3NoLWFza3Bhc3MKLSVlbmRpZgotCi0laWYgISAle3NjYXJkfQotCSBybSAtZiAkUlBNX0JVSUxEX1JPT1QvdXNyL3NoYXJlL29wZW5zc2gvU3NoLmJpbgotJWVuZGlmCi0KLSVpZiAhICV7bm9fZ25vbWVfYXNrcGFzc30KLWluc3RhbGwgLW0gNzU1IC1kICRSUE1fQlVJTERfUk9PVCV7X3N5c2NvbmZkaXJ9L3Byb2ZpbGUuZC8KLWluc3RhbGwgLW0gNzU1IGNvbnRyaWIvcmVkaGF0L2dub21lLXNzaC1hc2twYXNzLmNzaCAkUlBNX0JVSUxEX1JPT1Qle19zeXNjb25mZGlyfS9wcm9maWxlLmQvCi1pbnN0YWxsIC1tIDc1NSBjb250cmliL3JlZGhhdC9nbm9tZS1zc2gtYXNrcGFzcy5zaCAkUlBNX0JVSUxEX1JPT1Qle19zeXNjb25mZGlyfS9wcm9maWxlLmQvCi0lZW5kaWYKLQotcGVybCAtcGkgLWUgInN8JFJQTV9CVUlMRF9ST09UfHxnIiAkUlBNX0JVSUxEX1JPT1Qle19tYW5kaXJ9L21hbiovKgotCi0lY2xlYW4KLXJtIC1yZiAkUlBNX0JVSUxEX1JPT1QKLQotJXRyaWdnZXJ1biBzZXJ2ZXIgLS0gc3NoLXNlcnZlcgotaWYgWyAiJDEiICE9IDAgLWEgLXIgL3Zhci9ydW4vc3NoZC5waWQgXSA7IHRoZW4KLQl0b3VjaCAvdmFyL3J1bi9zc2hkLnJlc3RhcnQKLWZpCi0KLSV0cmlnZ2VydW4gc2VydmVyIC0tIG9wZW5zc2gtc2VydmVyIDwgMi41LjBwMQotIyBDb3VudCB0aGUgbnVtYmVyIG9mIEhvc3RLZXkgYW5kIEhvc3REc2FLZXkgc3RhdGVtZW50cyB3ZSBoYXZlLgotZ2F3awknQkVHSU4ge0lHTk9SRUNBU0U9MX0KLQkgL15ob3N0a2V5LyB8fCAvXmhvc3Rkc2FrZXkvIHtzYXdob3N0a2V5ID0gc2F3aG9zdGtleSArIDF9Ci0JIEVORCB7ZXhpdCBzYXdob3N0a2V5fScgL2V0Yy9zc2gvc3NoZF9jb25maWcKLSMgQW5kIGlmIHdlIG9ubHkgZm91bmQgb25lLCB3ZSBrbm93IHRoZSBjbGllbnQgd2FzIHJlbHlpbmcgb24gdGhlIG9sZCBkZWZhdWx0Ci0jIGJlaGF2aW9yLCB3aGljaCBsb2FkZWQgdGhlIHRoZSBTU0gyIERTQSBob3N0IGtleSB3aGVuIEhvc3REc2FLZXkgd2Fzbid0Ci0jIHNwZWNpZmllZC4gIE5vdyB0aGF0IEhvc3RLZXkgaXMgdXNlZCBmb3IgYm90aCBTU0gxIGFuZCBTU0gyIGtleXMsIHNwZWNpZnlpbmcKLSMgb25lIG51bGxpZmllcyB0aGUgZGVmYXVsdCwgd2hpY2ggd291bGQgaGF2ZSBsb2FkZWQgYm90aC4KLWlmIFsgJD8gLWVxIDEgXSA7IHRoZW4KLQllY2hvIEhvc3RLZXkgL2V0Yy9zc2gvc3NoX2hvc3RfcnNhX2tleSA+PiAvZXRjL3NzaC9zc2hkX2NvbmZpZwotCWVjaG8gSG9zdEtleSAvZXRjL3NzaC9zc2hfaG9zdF9kc2Ffa2V5ID4+IC9ldGMvc3NoL3NzaGRfY29uZmlnCi1maQotCi0ldHJpZ2dlcnBvc3R1biBzZXJ2ZXIgLS0gc3NoLXNlcnZlcgotaWYgWyAiJDEiICE9IDAgXSA7IHRoZW4KLQkvc2Jpbi9jaGtjb25maWcgLS1hZGQgc3NoZAotCWlmIHRlc3QgLWYgL3Zhci9ydW4vc3NoZC5yZXN0YXJ0IDsgdGhlbgotCQlybSAtZiAvdmFyL3J1bi9zc2hkLnJlc3RhcnQKLQkJL3NiaW4vc2VydmljZSBzc2hkIHN0YXJ0ID4gL2Rldi9udWxsIDI+JjEgfHwgOgotCWZpCi1maQotCi0lcHJlIHNlcnZlcgotJXtfc2JpbmRpcn0vZ3JvdXBhZGQgLXIgLWcgJXtzc2hkX2dpZH0gc3NoZCAyPi9kZXYvbnVsbCB8fCA6Ci0le19zYmluZGlyfS91c2VyYWRkIC1kIC92YXIvZW1wdHkvc3NoZCAtcyAvYmluL2ZhbHNlIC11ICV7c3NoZF91aWR9IFwKLQktZyBzc2hkIC1NIC1yIHNzaGQgMj4vZGV2L251bGwgfHwgOgotCi0lcG9zdCBzZXJ2ZXIKLS9zYmluL2Noa2NvbmZpZyAtLWFkZCBzc2hkCi0KLSVwb3N0dW4gc2VydmVyCi0vc2Jpbi9zZXJ2aWNlIHNzaGQgY29uZHJlc3RhcnQgPiAvZGV2L251bGwgMj4mMSB8fCA6Ci0KLSVwcmV1biBzZXJ2ZXIKLWlmIFsgIiQxIiA9IDAgXQotdGhlbgotCS9zYmluL3NlcnZpY2Ugc3NoZCBzdG9wID4gL2Rldi9udWxsIDI+JjEgfHwgOgotCS9zYmluL2Noa2NvbmZpZyAtLWRlbCBzc2hkCi1maQotCi0lZmlsZXMKLSVkZWZhdHRyKC0scm9vdCxyb290KQotJWRvYyBDUkVESVRTIENoYW5nZUxvZyBJTlNUQUxMIExJQ0VOQ0UgT1ZFUlZJRVcgUkVBRE1FKiBQUk9UT0NPTCogVE9ETyBXQVJOSU5HKgotJWF0dHIoMDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vc2NwCi0lYXR0cigwNjQ0LHJvb3Qscm9vdCkgJXtfbWFuZGlyfS9tYW4xL3NjcC4xKgotJWF0dHIoMDc1NSxyb290LHJvb3QpICVkaXIgJXtfc3lzY29uZmRpcn0vc3NoCi0lYXR0cigwNjAwLHJvb3Qscm9vdCkgJWNvbmZpZyhub3JlcGxhY2UpICV7X3N5c2NvbmZkaXJ9L3NzaC9tb2R1bGkKLSVpZiAhICV7cmVzY3VlfQotJWF0dHIoMDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vc3NoLWtleWdlbgotJWF0dHIoMDY0NCxyb290LHJvb3QpICV7X21hbmRpcn0vbWFuMS9zc2gta2V5Z2VuLjEqCi0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJWRpciAle19saWJleGVjZGlyfS9vcGVuc3NoCi0lYXR0cig0NzExLHJvb3Qscm9vdCkgJXtfbGliZXhlY2Rpcn0vb3BlbnNzaC9zc2gta2V5c2lnbgotJWF0dHIoMDc1NSxyb290LHJvb3QpICV7X2xpYmV4ZWNkaXJ9L29wZW5zc2gvc3NoLXBrY3MxMS1oZWxwZXIKLSVhdHRyKDA2NDQscm9vdCxyb290KSAle19tYW5kaXJ9L21hbjgvc3NoLWtleXNpZ24uOCoKLSVhdHRyKDA2NDQscm9vdCxyb290KSAle19tYW5kaXJ9L21hbjgvc3NoLXBrY3MxMS1oZWxwZXIuOCoKLSVlbmRpZgotJWlmICV7c2NhcmR9Ci0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJWRpciAle19kYXRhZGlyfS9vcGVuc3NoCi0lYXR0cigwNjQ0LHJvb3Qscm9vdCkgJXtfZGF0YWRpcn0vb3BlbnNzaC9Tc2guYmluCi0lZW5kaWYKLQotJWZpbGVzIGNsaWVudHMKLSVkZWZhdHRyKC0scm9vdCxyb290KQotJWF0dHIoMDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vc3NoCi0lYXR0cigwNjQ0LHJvb3Qscm9vdCkgJXtfbWFuZGlyfS9tYW4xL3NzaC4xKgotJWF0dHIoMDY0NCxyb290LHJvb3QpICV7X21hbmRpcn0vbWFuNS9zc2hfY29uZmlnLjUqCi0lYXR0cigwNjQ0LHJvb3Qscm9vdCkgJWNvbmZpZyhub3JlcGxhY2UpICV7X3N5c2NvbmZkaXJ9L3NzaC9zc2hfY29uZmlnCi0lYXR0cigtLHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zbG9naW4KLSVhdHRyKC0scm9vdCxyb290KSAle19tYW5kaXJ9L21hbjEvc2xvZ2luLjEqCi0laWYgISAle3Jlc2N1ZX0KLSVhdHRyKDI3NTUscm9vdCxub2JvZHkpICV7X2JpbmRpcn0vc3NoLWFnZW50Ci0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zc2gtYWRkCi0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zc2gta2V5c2NhbgotJWF0dHIoMDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vc2Z0cAotJWF0dHIoMDY0NCxyb290LHJvb3QpICV7X21hbmRpcn0vbWFuMS9zc2gtYWdlbnQuMSoKLSVhdHRyKDA2NDQscm9vdCxyb290KSAle19tYW5kaXJ9L21hbjEvc3NoLWFkZC4xKgotJWF0dHIoMDY0NCxyb290LHJvb3QpICV7X21hbmRpcn0vbWFuMS9zc2gta2V5c2Nhbi4xKgotJWF0dHIoMDY0NCxyb290LHJvb3QpICV7X21hbmRpcn0vbWFuMS9zZnRwLjEqCi0lZW5kaWYKLQotJWlmICEgJXtyZXNjdWV9Ci0lZmlsZXMgc2VydmVyCi0lZGVmYXR0cigtLHJvb3Qscm9vdCkKLSVkaXIgJWF0dHIoMDExMSxyb290LHJvb3QpICV7X3Zhcn0vZW1wdHkvc3NoZAotJWF0dHIoMDc1NSxyb290LHJvb3QpICV7X3NiaW5kaXJ9L3NzaGQKLSVhdHRyKDA3NTUscm9vdCxyb290KSAle19saWJleGVjZGlyfS9vcGVuc3NoL3NmdHAtc2VydmVyCi0lYXR0cigwNjQ0LHJvb3Qscm9vdCkgJXtfbWFuZGlyfS9tYW44L3NzaGQuOCoKLSVhdHRyKDA2NDQscm9vdCxyb290KSAle19tYW5kaXJ9L21hbjUvbW9kdWxpLjUqCi0lYXR0cigwNjQ0LHJvb3Qscm9vdCkgJXtfbWFuZGlyfS9tYW41L3NzaGRfY29uZmlnLjUqCi0lYXR0cigwNjQ0LHJvb3Qscm9vdCkgJXtfbWFuZGlyfS9tYW44L3NmdHAtc2VydmVyLjgqCi0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJWRpciAle19zeXNjb25mZGlyfS9zc2gKLSVhdHRyKDA2MDAscm9vdCxyb290KSAlY29uZmlnKG5vcmVwbGFjZSkgJXtfc3lzY29uZmRpcn0vc3NoL3NzaGRfY29uZmlnCi0lYXR0cigwNjAwLHJvb3Qscm9vdCkgJWNvbmZpZyhub3JlcGxhY2UpIC9ldGMvcGFtLmQvc3NoZAotJWF0dHIoMDc1NSxyb290LHJvb3QpICVjb25maWcgL2V0Yy9yYy5kL2luaXQuZC9zc2hkCi0lZW5kaWYKLQotJWlmICEgJXtub194MTFfYXNrcGFzc30KLSVmaWxlcyBhc2twYXNzCi0lZGVmYXR0cigtLHJvb3Qscm9vdCkKLSVkb2MgeDExLXNzaC1hc2twYXNzLSV7YXZlcnNpb259L1JFQURNRQotJWRvYyB4MTEtc3NoLWFza3Bhc3MtJXthdmVyc2lvbn0vQ2hhbmdlTG9nCi0lZG9jIHgxMS1zc2gtYXNrcGFzcy0le2F2ZXJzaW9ufS9Tc2hBc2twYXNzKi5hZAotJWF0dHIoMDc1NSxyb290LHJvb3QpICV7X2xpYmV4ZWNkaXJ9L29wZW5zc2gvc3NoLWFza3Bhc3MKLSVhdHRyKDA3NTUscm9vdCxyb290KSAle19saWJleGVjZGlyfS9vcGVuc3NoL3gxMS1zc2gtYXNrcGFzcwotJWVuZGlmCi0KLSVpZiAhICV7bm9fZ25vbWVfYXNrcGFzc30KLSVmaWxlcyBhc2twYXNzLWdub21lCi0lZGVmYXR0cigtLHJvb3Qscm9vdCkKLSVhdHRyKDA3NTUscm9vdCxyb290KSAlY29uZmlnICV7X3N5c2NvbmZkaXJ9L3Byb2ZpbGUuZC9nbm9tZS1zc2gtYXNrcGFzcy4qCi0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfbGliZXhlY2Rpcn0vb3BlbnNzaC9nbm9tZS1zc2gtYXNrcGFzcwotJWVuZGlmCi0KLSVjaGFuZ2Vsb2cKLSogV2VkIEp1bCAxNCAyMDEwIFRpbSBSaWNlIDx0aW1AbXVsdGl0YWxlbnRzLm5ldD4KLS0gdGVzdCBmb3Igc2tpcF94MTFfYXNrcGFzcyAobGluZSA3Nykgc2hvdWxkIGhhdmUgYmVlbiBmb3Igbm9feDExX2Fza3Bhc3MKLQotKiBNb24gSnVuIDIgMjAwMyBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0tIFJlbW92ZSBub2lwNiBvcHRpb24uIFRoaXMgbWF5IGJlIGNvbnRyb2xsZWQgYXQgcnVuLXRpbWUgaW4gY2xpZW50IGNvbmZpZwotICBmaWxlIHVzaW5nIG5ldyBBZGRyZXNzRmFtaWx5IGRpcmVjdGl2ZQotCi0qIE1vbiBNYXkgMTIgMjAwMyBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0tIERvbid0IGluc3RhbGwgcHJvZmlsZS5kIHNjcmlwdHMgd2hlbiBub3QgYnVpbGRpbmcgd2l0aCBHTk9NRS9HVEsgYXNrcGFzcwotICAocGF0Y2ggZnJvbSBiZXRAcmFodWwubmV0KQotCi0qIFdlZCBPY3QgMDEgMjAwMiBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0tIEluc3RhbGwgc3NoLWFnZW50IHNldGdpZCBub2JvZHkgdG8gcHJldmVudCBwdHJhY2UoKSBrZXkgdGhlZnQgYXR0YWNrcwotCi0qIE1vbiBTZXAgMzAgMjAwMiBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0tIFVzZSBjb250cmliLyBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgYXNrcGFzcyBwcm9ncmFtcwotCi0qIEZyaSBKdW4gMjEgMjAwMiBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0tIE1lcmdlIGluIHNwZWMgY2hhbmdlcyBmcm9tIHNlYmFAaXEucGwgKFNlYmFzdGlhbiBQYWNodXRhKQotLSBBZGQgbmV3IHtzc2gsc3NoZH1fY29uZmlnLjUgbWFucGFnZXMKLS0gQWRkIG5ldyBzc2gta2V5c2lnbiBwcm9ncmFtIGFuZCByZW1vdmUgc2V0dWlkIGZyb20gc3NoIGNsaWVudAotCi0qIEZyaSBNYXkgMTAgMjAwMiBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0tIE1lcmdlIGluIHNwZWMgY2hhbmdlcyBmcm9tIFJlZEhhdCwgcmVvcmdhbnNpZSBhIGxpdHRsZQotLSBBZGQgUHJpdnNlcCB1c2VyLCBncm91cCBhbmQgZGlyZWN0b3J5Ci0KLSogVGh1IE1hciAgNyAyMDAyIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4gMy4xcDEtMgotLSBidW1wIGFuZCBncmluZCAodGhyb3VnaCB0aGUgYnVpbGQgc3lzdGVtKQotCi0qIFRodSBNYXIgIDcgMjAwMiBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+IDMuMXAxLTEKLS0gcmVxdWlyZSBzaGFydXRpbHMgZm9yIGJ1aWxkaW5nIChtaW5kcm90ICMxMzcpCi0tIHJlcXVpcmUgZGIxLWRldmVsIG9ubHkgd2hlbiBidWlsZGluZyBmb3IgNi54ICgjNTUxMDUpLCB3aGljaCBwcm9iYWJseSB3b24ndAotICB3b3JrIGFueXdheSAoMy4xIHJlcXVpcmVzIE9wZW5TU0wgMC45LjYgdG8gYnVpbGQpLCBidXQgd2hhdCB0aGUgaGVjawotLSByZXF1aXJlIHBhbS1kZXZlbCBieSBmaWxlIChub3QgYnkgcGFja2FnZSBuYW1lKSBhZ2FpbgotLSBhZGQgTWFya3VzJ3MgcGF0Y2ggdG8gY29tcGlsZSB3aXRoIE9wZW5TU0wgMC45LjVhIChmcm9tCi0gIGh0dHA6Ly9idWd6aWxsYS5taW5kcm90Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQxKSBhbmQgYXBwbHkgaXQgaWYgd2UncmUKLSAgYnVpbGRpbmcgZm9yIDYueAotCi0qIFRodSBNYXIgIDcgMjAwMiBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+IDMuMXAxLTAKLS0gdXBkYXRlIHRvIDMuMXAxCi0KLSogVHVlIE1hciAgNSAyMDAyIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4gU05BUC0yMDAyMDMwNQotLSB1cGRhdGUgdG8gU05BUC0yMDAyMDMwNQotLSBkcm9wIGRlYnVnIHBhdGNoLCBmaXhlZCB1cHN0cmVhbQotCi0qIFdlZCBGZWIgMjAgMjAwMiBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+IFNOQVAtMjAwMjAyMjAKLS0gdXBkYXRlIHRvIFNOQVAtMjAwMjAyMjAgZm9yIHRlc3RpbmcgcHVycG9zZXMgKHlvdSd2ZSBiZWVuIHdhcm5lZCwgaWYgdGhlcmUncwotICBhbnl0aGluZyB0byBiZSB3YXJuZWQgYWJvdXQsIGdzcyBwYXRjaGVzIHdvbid0IGFwcGx5LCBJIGRvbid0IG1pbmQpCi0KLSogV2VkIEZlYiAxMyAyMDAyIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4gMy4wLjJwMS0zCi0tIGFkZCBwYXRjaGVzIGZyb20gU2ltb24gV2lsa2luc29uIGFuZCBOaWNvbGFzIFdpbGxpYW1zIGZvciBHU1NBUEkga2V5Ci0gIGV4Y2hhbmdlLCBhdXRoZW50aWNhdGlvbiwgYW5kIG5hbWVkIGtleSBzdXBwb3J0Ci0KLSogV2VkIEphbiAyMyAyMDAyIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4gMy4wLjJwMS0yCi0tIHJlbW92ZSBkZXBlbmRlbmN5IG9uIGRiMS1kZXZlbCwgd2hpY2ggaGFzIGp1c3QgYmVlbiBzd2FsbG93ZWQgdXAgd2hvbGUKLSAgYnkgZ25vbWUtbGlicy1kZXZlbAotCi0qIFN1biBEZWMgMjkgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIGFkanVzdCBidWlsZCBkZXBlbmRlbmNpZXMgc28gdGhhdCBidWlsZDZ4IGFjdHVhbGx5IHdvcmtzIHJpZ2h0IChmaXgKLSAgZnJvbSBIdWdvIHZhbiBkZXIgS29vaWopCi0KLSogVHVlIERlYyAgNCAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4gMy4wLjJwMS0xCi0tIHVwZGF0ZSB0byAzLjAuMnAxCi0KLSogRnJpIE5vdiAxNiAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4gMy4wLjFwMS0xCi0tIHVwZGF0ZSB0byAzLjAuMXAxCi0KLSogVHVlIE5vdiAxMyAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gdXBkYXRlIHRvIGN1cnJlbnQgQ1ZTIChub3QgZm9yIHVzZSBpbiBkaXN0cmlidXRpb24pCi0KLSogVGh1IE5vdiAgOCAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4gMy4wcDEtMQotLSBtZXJnZSBzb21lIG9mIERhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4gY2hhbmdlcyBmcm9tIHRoZSB1cHN0cmVhbQotICAzLjBwMSBzcGVjIGZpbGUgYW5kIGluaXQgc2NyaXB0Ci0KLSogV2VkIE5vdiAgNyAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gdXBkYXRlIHRvIDMuMHAxCi0tIHVwZGF0ZSB0byB4MTEtc3NoLWFza3Bhc3MgMS4yLjQuMQotLSBjaGFuZ2UgYnVpbGQgZGVwZW5kZW5jeSBvbiBhIGZpbGUgZnJvbSBwYW0tZGV2ZWwgdG8gdGhlIHBhbS1kZXZlbCBwYWNrYWdlCi0tIHJlcGxhY2UgcHJpbWVzIHdpdGggbW9kdWxpCi0KLSogVGh1IFNlcCAyNyAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4gMi45cDItOQotLSBpbmNvcnBvcmF0ZSBmaXggZnJvbSBNYXJrdXMgRnJpZWRsJ3MgYWR2aXNvcnkgZm9yIElQLWJhc2VkIGF1dGhvcml6YXRpb24gYnVncwotCi0qIFRodSBTZXAgMTMgMjAwMSBCZXJuaGFyZCBSb3NlbmtyYWVuemVyIDxiZXJvQHJlZGhhdC5jb20+IDIuOXAyLTgKLS0gTWVyZ2UgY2hhbmdlcyB0byByZXNjdWUgYnVpbGQgZnJvbSBjdXJyZW50IHN5c2FkbWluIHN1cnZpdmFsIGNkCi0KLSogVGh1IFNlcCAgNiAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4gMi45cDItNwotLSBmaXggc2NwJ3Mgc2VydmVyJ3MgcmVwb3J0aW5nIG9mIGZpbGUgc2l6ZXMsIGFuZCBidWlsZCB3aXRoIHRoZSBwcm9wZXIKLSAgcHJlcHJvY2Vzc29yIGRlZmluZSB0byBnZXQgbGFyZ2UtZmlsZSBjYXBhYmxlIG9wZW4oKSwgc3RhdCgpLCBldGMuCi0gIChzZnRwIGhhcyBiZWVuIGRvaW5nIHRoaXMgY29ycmVjdGx5IGFsbCBhbG9uZykgKCM1MTgyNykKLS0gY29uZmlndXJlIHdpdGhvdXQgLS13aXRoLWlwdjQtZGVmYXVsdCBvbiBSSEwgNy54IGFuZCBuZXdlciAoIzQ1OTg3LCM1MjI0NykKLS0gcHVsbCBjdnMgcGF0Y2ggdG8gZml4IHN1cHBvcnQgZm9yIC9ldGMvbm9sb2dpbiBmb3Igbm9uLVBBTSBsb2dpbnMgKCM0NzI5OCkKLS0gbWFyayBwcm9maWxlLmQgc2NyaXB0bGV0cyBhcyBjb25maWcgZmlsZXMgKCM0MjMzNykKLS0gcmVmZXIgdG8gSmFzb24gU3RvbmUncyBtYWlsIGZvciB6c2ggd29ya2Fyb3VuZCBmb3IgZXhpdC1oYW5naW5nIHF1YXNpLWJ1ZwotLSBjaGFuZ2UgYSBjb3VwbGUgb2YgbG9nKCkgc3RhdGVtZW50cyB0byBkZWJ1ZygpIHN0YXRlbWVudHMgKCM1MDc1MSkKLS0gcHVsbCBjdnMgcGF0Y2ggdG8gYWRkIC10IGZsYWcgdG8gc3NoZCAoIzI4NjExKQotLSBjbGVhciBmZF9zZXRzIGNvcnJlY3RseSAob25lIGJpdCBwZXIgRkQsIG5vdCBvbmUgYnl0ZSBwZXIgRkQpICgjNDMyMjEpCi0KLSogTW9uIEF1ZyAyMCAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4gMi45cDItNgotLSBhZGQgZGIxLWRldmVsIGFzIGEgQnVpbGRQcmVyZXF1aXNpdGUgKG5vdGVkIGJ5IEhhbnMgRWNrZSkKLQotKiBUaHUgQXVnIDE2IDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBwdWxsIGN2cyBwYXRjaCB0byBmaXggcmVtb3RlIHBvcnQgZm9yd2FyZGluZyB3aXRoIHByb3RvY29sIDIKLQotKiBUaHUgQXVnICA5IDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBwdWxsIGN2cyBwYXRjaCB0byBhZGQgc2Vzc2lvbiBpbml0aWFsaXphdGlvbiB0byBuby1wdHkgc2Vzc2lvbnMKLS0gcHVsbCBjdnMgcGF0Y2ggdG8gbm90IGN1dCBvZmYgY2hhbGxlbmdlcmVzcG9uc2UgYXV0aCBuZWVkbGVzc2x5Ci0tIHJlZnVzZSB0byBkbyBYMTEgZm9yd2FyZGluZyBpZiB4YXV0aCBpc24ndCB0aGVyZSwgaGFuZHkgaWYgeW91IGVuYWJsZQotICBpdCBieSBkZWZhdWx0IG9uIGEgc3lzdGVtIHRoYXQgZG9lc24ndCBoYXZlIFggaW5zdGFsbGVkICgjNDkyNjMpCi0KLSogV2VkIEF1ZyAgOCAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gZG9uJ3QgYXBwbHkgcGF0Y2hlcyB0byBjb2RlIHdlIGRvbid0IGludGVuZCB0byBidWlsZCAoc3BvdHRlZCBieSBNYXR0IEdhbGdvY2kpCi0KLSogTW9uIEF1ZyAgNiAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gcGFzcyBPUFRJT05TIGNvcnJlY3RseSB0byBpbml0bG9nICgjNTAxNTEpCi0KLSogV2VkIEp1bCAyNSAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gc3dpdGNoIHRvIHgxMS1zc2gtYXNrcGFzcyAxLjIuMgotCi0qIFdlZCBKdWwgMTEgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIHJlYnVpbGQgaW4gbmV3IGVudmlyb25tZW50Ci0KLSogTW9uIEp1biAyNSAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gZGlzYWJsZSB0aGUgZ3NzYXBpIHBhdGNoCi0KLSogTW9uIEp1biAxOCAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gdXBkYXRlIHRvIDIuOXAyCi0tIHJlZnJlc2ggdG8gYSBuZXcgdmVyc2lvbiBvZiB0aGUgZ3NzYXBpIHBhdGNoCi0KLSogVGh1IEp1biAgNyAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gY2hhbmdlIENvcHlyaWdodDogQlNEIHRvIExpY2Vuc2U6IEJTRAotLSBhZGQgTWFya3VzIEZyaWVkbCdzIHVudmVyaWZpZWQgcGF0Y2ggZm9yIHRoZSBjb29raWUgZmlsZSBkZWxldGlvbiBwcm9ibGVtCi0gIHNvIHRoYXQgd2UgY2FuIHZlcmlmeSBpdAotLSBkcm9wIHBhdGNoIHRvIGNoZWNrIGlmIHhhdXRoIGlzIHByZXNlbnQgKHdhcyBmb2xkZWQgaW50byBjb29raWUgcGF0Y2gpCi0tIGRvbid0IGFwcGx5IGdzc2FwaSBwYXRjaGVzIGZvciB0aGUgZXJyYXRhIGNhbmRpZGF0ZQotLSBjbGVhciBzdXBwbGVtZW50YWwgZ3JvdXBzIGxpc3QgYXQgc3RhcnR1cAotCi0qIEZyaSBNYXkgMjUgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIGZpeCBhbiBlcnJvciBwYXJzaW5nIHRoZSBuZXcgZGVmYXVsdCBzc2hkX2NvbmZpZwotLSBhZGQgYSBmaXggZnJvbSBNYXJrdXMgRnJpZWRsICh2aWEgb3BlbnNzaC11bml4LWRldikgZm9yIHNzaC1rZXlnZW4gbm90Ci0gIGRlYWxpbmcgd2l0aCBjb21tZW50cyByaWdodAotCi0qIFRodSBNYXkgMjQgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIGFkZCBpbiBTaW1vbiBXaWxraW5zb24ncyBHU1NBUEkgcGF0Y2ggdG8gZ2l2ZSBpdCBzb21lIHRlc3RpbmcgaW4taG91c2UsCi0gIHRvIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBuZXh0IGJldGEgY3ljbGUgYmVjYXVzZSBpdCdzIGEgYmlnIGRlcGFydHVyZQotICBmcm9tIHRoZSB1cHN0cmVhbSB2ZXJzaW9uCi0KLSogVGh1IE1heSAgMyAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gZmluaXNoIG1hcmtpbmcgc3RyaW5ncyBpbiB0aGUgaW5pdCBzY3JpcHQgZm9yIHRyYW5zbGF0aW9uCi0tIG1vZGlmeSBpbml0IHNjcmlwdCB0byBzb3VyY2UgL2V0Yy9zeXNjb25maWcvc3NoZCBhbmQgcGFzcyAkT1BUSU9OUyB0byBzc2hkCi0gIGF0IHN0YXJ0dXAgKGNoYW5nZSBtZXJnZWQgZnJvbSBvcGVuc3NoLmNvbSBpbml0IHNjcmlwdCwgb3JpZ2luYWxseSBieQotICBQZWtrYSBTYXZvbGEpCi0tIHJlZnVzZSB0byBkbyBYMTEgZm9yd2FyZGluZyBpZiB4YXV0aCBpc24ndCB0aGVyZSwgaGFuZHkgaWYgeW91IGVuYWJsZQotICBpdCBieSBkZWZhdWx0IG9uIGEgc3lzdGVtIHRoYXQgZG9lc24ndCBoYXZlIFggaW5zdGFsbGVkCi0KLSogV2VkIE1heSAgMiAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gdXBkYXRlIHRvIDIuOQotLSBkcm9wIHZhcmlvdXMgcGF0Y2hlcyB0aGF0IGNhbWUgZnJvbSBvciB3ZW50IHVwc3RyZWFtIG9yIHRvIG9yIGZyb20gQ1ZTCi0KLSogV2VkIEFwciAxOCAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gb25seSByZXF1aXJlIGluaXRzY3JpcHRzIDUuMDAgb24gNi4yIChyZXBvcnRlZCBieSBQZXRlciBCaWVyaW5nZXIpCi0KLSogU3VuIEFwciAgOCAyMDAxIFByZXN0b24gQnJvd24gPHBicm93bkByZWRoYXQuY29tPgotLSByZW1vdmUgZXhwbGljaXQgb3BlbnNzbCByZXF1aXJlbWVudCwgZml4ZXMgYnVpbGRkaXN0cm8gaXNzdWUKLS0gbWFrZSBpbml0c2NyaXB0IHN0b3AoKSBmdW5jdGlvbiB3YWl0IHVudGlsIHNzaGQgcmVhbGx5IGRlYWQgdG8gYXZvaWQKLSAgcmFjZXMgaW4gY29uZHJlc3RhcnQKLQotKiBNb24gQXByICAyIDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBtZW50aW9uIHRoYXQgY2hhbGxlbmdlcmVwb25zZSBzdXBwb3J0cyBQQU0sIHNvIGRpc2FibGluZyBwYXNzd29yZCBkb2Vzbid0Ci0gIGxpbWl0IHVzZXJzIHRvIHB1YmtleSBhbmQgcnNhIGF1dGggKCMzNDM3OCkKLS0gYnlwYXNzIHRoZSBkYWVtb24oKSBmdW5jdGlvbiBpbiB0aGUgaW5pdCBzY3JpcHQgYW5kIGNhbGwgaW5pdGxvZyBkaXJlY3RseSwKLSAgYmVjYXVzZSBkYWVtb24oKSB3b24ndCBzdGFydCBhIGRhZW1vbiBpdCBkZXRlY3RzIGlzIGFscmVhZHkgcnVubmluZyAobGlrZQotICBvcGVuIGNvbm5lY3Rpb25zKQotLSByZXF1aXJlIHRoZSB2ZXJzaW9uIG9mIG9wZW5zc2wgd2UgaGFkIHdoZW4gd2Ugd2VyZSBidWlsdAotCi0qIEZyaSBNYXIgMjMgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIG1ha2UgZG9fcGFtX3NldGNyZWQoKSBzbWFydCBlbm91Z2ggdG8ga25vdyB3aGVuIHRvIGVzdGFibGlzaCBjcmVkcyBhbmQKLSAgd2hlbiB0byByZWluaXRpYWxpemUgdGhlbQotLSBhZGQgaW4gYSBjb3VwbGUgb2Ygb3RoZXIgZml4ZXMgZnJvbSBEYW1pZW4gZm9yIGluY2x1c2lvbiBpbiB0aGUgZXJyYXRhCi0KLSogVGh1IE1hciAyMiAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gdXBkYXRlIHRvIDIuNS4ycDIKLS0gY2FsbCBzZXRjcmVkKCkgYWdhaW4gYWZ0ZXIgaW5pdGdyb3VwcywgYmVjYXVzZSB0aGUgImNyZWRzIiBjb3VsZCBhY3R1YWxseQotICBiZSBncm91cCBtZW1iZXJzaGlwcwotCi0qIFR1ZSBNYXIgMjAgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIHVwZGF0ZSB0byAyLjUuMnAxIChpbmNsdWRlcyBlbmRpYW5uZXNzIGZpeGVzIGluIHRoZSByaWpuZGFlbCBpbXBsZW1lbnRhdGlvbikKLS0gZG9uJ3QgZW5hYmxlIGNoYWxsZW5nZS1yZXNwb25zZSBieSBkZWZhdWx0IHVudGlsIHdlIGZpbmQgYSB3YXkgdG8gbm90Ci0gIGhhdmUgdG9vIG1hbnkgdXNlcmF1dGggcmVxdWVzdHMgKHdlIG1heSBtYWtlIHVwIHRvIHNpeCBwdWJrZXkgYW5kIHVwIHRvCi0gIHRocmVlIHBhc3N3b3JkIGF0dGVtcHRzIGFzIGl0IGlzKQotLSByZW1vdmUgYnVpbGQgZGVwZW5kZW5jeSBvbiByc2ggdG8gbWF0Y2ggb3BlbnNzaC5jb20ncyBwYWNrYWdlcyBtb3JlIGNsb3NlbHkKLQotKiBTYXQgTWFyICAzIDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSByZW1vdmUgZGVwZW5kZW5jeSBvbiBvcGVuc3NsIC0tIHdvdWxkIG5lZWQgdG8gYmUgdG9vIHByZWNpc2UKLQotKiBGcmkgTWFyICAyIDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSByZWJ1aWxkIGluIG5ldyBlbnZpcm9ubWVudAotCi0qIE1vbiBGZWIgMjYgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIFJldmVydCB0aGUgcGF0Y2ggdG8gbW92ZSBwYW1fb3Blbl9zZXNzaW9uLgotLSBJbml0IHNjcmlwdCBhbmQgc3BlYyBmaWxlIGNoYW5nZXMgZnJvbSBQZWtrYSBTYXZvbGEuICgjMjg3NTApCi0tIFBhdGNoIHNmdHAgdG8gcmVjb2duaXplICctbyBwcm90b2NvbCcgYXJndW1lbnRzLiAoIzI5NTQwKQotCi0qIFRodSBGZWIgMjIgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIENodWNrIHRoZSBjbG9zaW5nIHBhdGNoLgotLSBBZGQgYSB0cmlnZ2VyIHRvIGFkZCBob3N0IGtleXMgZm9yIHByb3RvY29sIDIgdG8gdGhlIGNvbmZpZyBmaWxlLCBub3cgdGhhdAotICBjb25maWd1cmF0aW9uIGZpbGUgc3ludGF4IHJlcXVpcmVzIHVzIHRvIHNwZWNpZnkgaXQgd2l0aCBIb3N0S2V5IGlmIHdlCi0gIHNwZWNpZnkgYW55IG90aGVyIEhvc3RLZXkgdmFsdWVzLCB3aGljaCB3ZSBkby4KLQotKiBUdWUgRmViIDIwIDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBSZWRvIHBhdGNoIHRvIG1vdmUgcGFtX29wZW5fc2Vzc2lvbiBhZnRlciB0aGUgc2VydmVyIHNldHVpZCgpcyB0byB0aGUgdXNlci4KLS0gUmV3b3JrIHRoZSBub3BhbSBwYXRjaCB0byB1c2UgYmUgcGlja2VkIHVwIGJ5IGF1dG9jb25mLgotCi0qIE1vbiBGZWIgMTkgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIFVwZGF0ZSBmb3IgMi41LjFwMS4KLS0gQWRkIGluaXQgc2NyaXB0IG1vZHMgZnJvbSBQZWtrYSBTYXZvbGEuCi0tIFR3ZWFrIHRoZSBpbml0IHNjcmlwdCB0byBtYXRjaCB0aGUgQ1ZTIGNvbnRyaWIgc2NyaXB0IG1vcmUgY2xvc2VseS4KLS0gUmVkbyBwYXRjaCB0byBzc2gtYWRkIHRvIHRyeSB0byBhZGRpbmcgYm90aCBpZGVudGl0eSBhbmQgaWRfZHNhIHRvIGFsc28gdHJ5Ci0gIGFkZGluZyBpZF9yc2EuCi0KLSogRnJpIEZlYiAxNiAyMDAxIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gVXBkYXRlIGZvciAyLjUuMHAxLgotLSBVc2UgJFJQTV9PUFRfRkxBR1MgaW5zdGVhZCBvZiAtTyB3aGVuIGJ1aWxkaW5nIGdub21lLXNzaC1hc2twYXNzCi0tIFJlc3luYyB3aXRoIHBhcnRzIG9mIERhbWllbiBNaWxsZXIncyBvcGVuc3NoLnNwZWMgZnJvbSBDVlMsIGluY2x1ZGluZwotICB1cGRhdGUgb2YgeDExIGFza3Bhc3MgdG8gMS4yLjAuCi0tIE9ubHkgcmVxdWlyZSBvcGVuc3NsIChkb24ndCBwcmVyZXEpIGJlY2F1c2Ugd2UgZ2VuZXJhdGUga2V5cyBpbiB0aGUgaW5pdAotICBzY3JpcHQgbm93LgotCi0qIFR1ZSBGZWIgMTMgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIERvbid0IG9wZW4gYSBQQU0gc2Vzc2lvbiB1bnRpbCB3ZSd2ZSBmb3JrZWQgYW5kIGJlY29tZSB0aGUgdXNlciAoIzI1NjkwKS4KLS0gQXBwbHkgQW5kcmV3IEJhcnRsZXR0J3MgcGF0Y2ggZm9yIGxldHRpbmcgcGFtX2F1dGhlbnRpY2F0ZSgpIGtub3cgd2hpY2gKLSAgaG9zdCB0aGUgdXNlciBpcyBhdHRlbXB0aW5nIGEgbG9naW4gZnJvbS4KLS0gUmVzeW5jIHdpdGggcGFydHMgb2YgRGFtaWVuIE1pbGxlcidzIG9wZW5zc2guc3BlYyBmcm9tIENWUy4KLS0gRG9uJ3QgZXhwb3NlIEtiZEludCByZXNwb25zZXMgaW4gZGVidWcgbWVzc2FnZXMgKGZyb20gQ1ZTKS4KLS0gRGV0ZWN0IGFuZCBoYW5kbGUgZXJyb3JzIGluIHJzYV97cHVibGljLHByaXZhdGV9X2RlY3J5cHQgKGZyb20gQ1ZTKS4KLQotKiBXZWQgRmViICA3IDIwMDEgVHJvbmQgRWl2aW5kIEdsb21zcnhkIDx0ZWdAcmVkaGF0LmNvbT4KLS0gaTE4bi10d2VhayB0byBpbml0c2NyaXB0LgotCi0qIFR1ZSBKYW4gMjMgMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIE1vcmUgZ2V0dGV4dGl6aW5nLgotLSBDbG9zZSBhbGwgZmlsZXMgYWZ0ZXIgZ29pbmcgaW50byBkYWVtb24gbW9kZSAobmVlZHMgbW9yZSB0ZXN0aW5nKS4KLS0gRXh0cmFjdCBwYXRjaCBmcm9tIENWUyB0byBoYW5kbGUgYXV0aCBiYW5uZXJzIChpbiB0aGUgY2xpZW50KS4KLS0gRXh0cmFjdCBwYXRjaCBmcm9tIENWUyB0byBoYW5kbGUgY29tcGF0IHdlaXJkbmVzcy4KLQotKiBGcmkgSmFuIDE5IDIwMDEgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBGaW5pc2ggd2l0aCB0aGUgZ2V0dGV4dGl6aW5nLgotCi0qIFRodSBKYW4gMTggMjAwMSBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIEZpeCBhIGJ1ZyBpbiBhdXRoMi1wYW0uYyAoIzIzODc3KQotLSBHZXR0ZXh0aXplIHRoZSBpbml0IHNjcmlwdC4KLQotKiBXZWQgRGVjIDIwIDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBJbmNvcnBvcmF0ZSBhIHN3aXRjaCBmb3IgdXNpbmcgUEFNIGNvbmZpZ3MgZm9yIDYueCwganVzdCBpbiBjYXNlLgotCi0qIFR1ZSBEZWMgIDUgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIEluY29ycG9yYXRlIEJlcm8ncyBjaGFuZ2VzIGZvciBhIGJ1aWxkIHNwZWNpZmljYWxseSBmb3IgcmVzY3VlIENEcy4KLQotKiBXZWQgTm92IDI5IDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBEb24ndCB0cmVhdCBwYW1fc2V0Y3JlZCgpIGZhaWx1cmUgYXMgZmF0YWwgdW5sZXNzIHBhbV9hdXRoZW50aWNhdGUoKSBoYXMKLSAgc3VjY2VlZGVkLCB0byBhbGxvdyBwdWJsaWMta2V5IGF1dGhlbnRpY2F0aW9uIGFmdGVyIGEgZmFpbHVyZSB3aXRoICJub25lIgotICBhdXRoZW50aWNhdGlvbi4gICgjMjEyNjgpCi0KLSogVHVlIE5vdiAyOCAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gVXBkYXRlIHRvIHgxMS1hc2twYXNzIDEuMS4xLiAoIzIxMzAxKQotLSBEb24ndCBzZWNvbmQtZ3Vlc3MgZml4cGF0aHMsIHdoaWNoIGNhdXNlcyBwYXRocyB0byBnZXQgZml4ZWQgdHdpY2UuICgjMjEyOTApCi0KLSogTW9uIE5vdiAyNyAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gTWVyZ2UgbXVsdGlwbGUgUEFNIHRleHQgbWVzc2FnZXMgaW50byBzdWJzZXF1ZW50IHByb21wdHMgd2hlbiBwb3NzaWJsZSB3aGVuCi0gIGRvaW5nIGtleWJvYXJkLWludGVyYWN0aXZlIGF1dGhlbnRpY2F0aW9uLgotCi0qIFN1biBOb3YgMjYgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIERpc2FibGUgdGhlIGJ1aWx0LWluIE1ENSBwYXNzd29yZCBzdXBwb3J0LiAgV2UncmUgdXNpbmcgUEFNLgotLSBUYWtlIGEgY3JhY2sgYXQgZG9pbmcga2V5Ym9hcmQtaW50ZXJhY3RpdmUgYXV0aGVudGljYXRpb24gd2l0aCBQQU0sIGFuZAotICBlbmFibGUgdXNlIG9mIGl0IGluIHRoZSBkZWZhdWx0IGNsaWVudCBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIGNsaWVudAotICB3aWxsIHRyeSBpdCB3aGVuIHRoZSBzZXJ2ZXIgZGlzYWxsb3dzIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLgotLSBCdWlsZCB3aXRoIGRlYnVnZ2luZyBmbGFncy4gIEJ1aWxkIHJvb3QgcG9saWNpZXMgc3RyaXAgYWxsIGJpbmFyaWVzIGFueXdheS4KLQotKiBUdWUgTm92IDIxIDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBVc2UgREVTVERJUiBpbnN0ZWFkIG9mICUlbWFrZWluc3RhbGwuCi0tIFJlbW92ZSAvdXNyL1gxMVI2L2JpbiBmcm9tIHRoZSBwYXRoLWZpeGluZyBwYXRjaC4KLQotKiBNb24gTm92IDIwIDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBBZGQgdGhlIHByaW1lcyBmaWxlIGZyb20gdGhlIGxhdGVzdCBzbmFwc2hvdCB0byB0aGUgbWFpbiBwYWNrYWdlICgjMjA4ODQpLgotLSBBZGQgdGhlIGRldiBwYWNrYWdlIHRvIHRoZSBwcmVyZXEgbGlzdCAoIzE5OTg0KS4KLS0gUmVtb3ZlIHRoZSBkZWZhdWx0IHBhdGggYW5kIG1pbWljIGxvZ2luJ3MgYmVoYXZpb3IgaW4gdGhlIHNlcnZlciBpdHNlbGYuCi0KLSogRnJpIE5vdiAxNyAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gUmVzeW5jIHdpdGggY29uZGl0aW9uYWwgb3B0aW9ucyBpbiBEYW1pZW4gTWlsbGVyJ3MgLnNwZWMgZmlsZSBmb3IgYW4gZXJyYXRhLgotLSBDaGFuZ2UgbGliZXhlY2RpciBmcm9tICUle19saWJleGVjZGlyfS9zc2ggdG8gJSV7X2xpYmV4ZWNkaXJ9L29wZW5zc2guCi0KLSogVHVlIE5vdiAgNyAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gVXBkYXRlIHRvIE9wZW5TU0ggMi4zLjBwMS4KLS0gVXBkYXRlIHRvIHgxMS1hc2twYXNzIDEuMS4wLgotLSBFbmFibGUga2V5Ym9hcmQtaW50ZXJhY3RpdmUgYXV0aGVudGljYXRpb24uCi0KLSogTW9uIE9jdCAzMCAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gVXBkYXRlIHRvIHNzaC1hc2twYXNzLXgxMSAxLjAuMy4KLS0gQ2hhbmdlIGF1dGhlbnRpY2F0aW9uIHJlbGF0ZWQgbWVzc2FnZXMgdG8gYmUgcHJpdmF0ZSAoIzE5OTY2KS4KLQotKiBUdWUgT2N0IDEwIDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBQYXRjaCBzc2gta2V5Z2VuIHRvIGJlIGFibGUgdG8gbGlzdCBzaWduYXR1cmVzIGZvciBEU0EgcHVibGljIGtleSBmaWxlcwotICBpdCBnZW5lcmF0ZXMuCi0KLSogVGh1IE9jdCAgNSAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gQWRkIEJ1aWxkUmVxdWlyZXMgb24gL3Vzci9pbmNsdWRlL3NlY3VyaXR5L3BhbV9hcHBsLmggdG8gYmUgc3VyZSB3ZSBhbHdheXMKLSAgYnVpbGQgUEFNIGF1dGhlbnRpY2F0aW9uIGluLgotLSBUcnkgc2V0dGluZyBTU0hfQVNLUEFTUyBpZiBnbm9tZS1zc2gtYXNrcGFzcyBpcyBpbnN0YWxsZWQuCi0tIENsZWFuIG91dCBuby1sb25nZXItdXNlZCBwYXRjaGVzLgotLSBQYXRjaCBzc2gtYWRkIHRvIHRyeSB0byBhZGQgYm90aCBpZGVudGl0eSBhbmQgaWRfZHNhLCBhbmQgdG8gZXJyb3Igb25seQotICB3aGVuIG5laXRoZXIgZXhpc3RzLgotCi0qIE1vbiBPY3QgIDIgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIFVwZGF0ZSB4MTEtYXNrcGFzcyB0byAxLjAuMi4gKCMxNzgzNSkKLS0gQWRkIEJ1aWxkUmVxdWlyZXNzIGZvciAvYmluL2xvZ2luIGFuZCAvdXNyL2Jpbi9yc2ggc28gdGhhdCBjb25maWd1cmUgd2lsbAotICBhbHdheXMgZmluZCB0aGVtIGluIHRoZSByaWdodCBwbGFjZS4gKCMxNzkwOSkKLS0gU2V0IHRoZSBkZWZhdWx0IHBhdGggdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG9uZSBzdXBwbGllZCBieSAvYmluL2xvZ2luLCBidXQKLSAgYWRkIC91c3IvWDExUjYvYmluLiAoIzE3OTA5KQotLSBUcnkgdG8gaGFuZGxlIG9ic29sZXRpb24gb2Ygc3NoLXNlcnZlciBtb3JlIGNsZWFubHkuICBQYWNrYWdlIG5hbWVzCi0gIGFyZSBkaWZmZXJlbnQsIGJ1dCBpbml0IHNjcmlwdCBuYW1lIGlzbid0LiAoIzE3ODY1KQotCi0qIFdlZCBTZXAgIDYgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIFVwZGF0ZSB0byAyLjIuMHAxLiAoIzE3ODM1KQotLSBUd2VhayB0aGUgaW5pdCBzY3JpcHQgdG8gYWxsb3cgcHJvcGVyIHJlc3RhcnRpbmcuICgjMTgwMjMpCi0KLSogV2VkIEF1ZyAyMyAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gVXBkYXRlIHRvIDIwMDAwODIzIHNuYXBzaG90LgotLSBDaGFuZ2Ugc3VicGFja2FnZSByZXF1aXJlbWVudHMgZnJvbSAlJXt2ZXJzaW9ufSB0byAlJXt2ZXJzaW9ufS0lJXtyZWxlYXNlfQotLSBCYWNrIG91dCB0aGUgcGlwZSBwYXRjaC4KLQotKiBNb24gSnVsIDE3IDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBVcGRhdGUgdG8gMi4xLjFwNCwgd2hpY2ggaW5jbHVkZXMgZml4ZXMgZm9yIGNvbmZpZyBmaWxlIHBhcnNpbmcgcHJvYmxlbXMuCi0tIE1vdmUgdGhlIGluaXQgc2NyaXB0IGJhY2suCi0tIEFkZCBEYW1pZW4ncyBxdWljayBmaXggZm9yIHdhY2tpbmVzcy4KLQotKiBXZWQgSnVsIDEyIDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBVcGRhdGUgdG8gMi4xLjFwMywgd2hpY2ggaW5jbHVkZXMgZml4ZXMgZm9yIFgxMSBmb3J3YXJkaW5nIGFuZCBzdHJ0b2soKS4KLQotKiBUaHUgSnVsICA2IDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBNb3ZlIGNvbmRyZXN0YXJ0IHRvIHNlcnZlciBwb3N0dW4uCi0tIE1vdmUga2V5IGdlbmVyYXRpb24gdG8gaW5pdCBzY3JpcHQuCi0tIEFjdHVhbGx5IHVzZSB0aGUgcmlnaHQgcGF0Y2ggZm9yIG1vdmluZyB0aGUga2V5IGdlbmVyYXRpb24gdG8gdGhlIGluaXQgc2NyaXB0LgotLSBDbGVhbiB1cCB0aGUgaW5pdCBzY3JpcHQgYSBiaXQuCi0KLSogV2VkIEp1bCAgNSAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gRml4IFgxMSBmb3J3YXJkaW5nLCBmcm9tIG1haWwgcG9zdCBieSBDaGFuIFNoaWgtUGluZyBSaWNoYXJkLgotCi0qIFN1biBKdWwgIDIgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIFVwZGF0ZSB0byAyLjEuMXAyLgotLSBVc2Ugb2Ygc3RydG9rKCkgY29uc2lkZXJlZCBoYXJtZnVsLgotCi0qIFNhdCBKdWwgIDEgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIEdldCB0aGUgYnVpbGQgcm9vdCBvdXQgb2YgdGhlIG1hbiBwYWdlcy4KLQotKiBUaHUgSnVuIDI5IDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBBZGQgYW5kIHVzZSBjb25kcmVzdGFydCBzdXBwb3J0IGluIHRoZSBpbml0IHNjcmlwdC4KLS0gQWRkIG5ld2VyIGluaXRzY3JpcHRzIGFzIGEgcHJlcmVxLgotCi0qIFR1ZSBKdW4gMjcgMjAwMCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+Ci0tIEJ1aWxkIGluIG5ldyBlbnZpcm9ubWVudCAocmVsZWFzZSAyKQotLSBNb3ZlIC1jbGllbnRzIHN1YnBhY2thZ2UgdG8gQXBwbGljYXRpb25zL0ludGVybmV0IGdyb3VwCi0KLSogRnJpIEp1biAgOSAyMDAwIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4KLS0gVXBkYXRlIHRvIDIuMi4xcDEKLQotKiBTYXQgSnVuICAzIDIwMDAgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPgotLSBQYXRjaCB0byBidWlsZCB3aXRoIG5laXRoZXIgUlNBIG5vciBSU0FyZWYuCi0tIE1pc2NlbGxhbmVvdXMgRkhTLWNvbXBsaWFuY2UgdHdlYWtzLgotLSBGaXggZm9yIHBvc3NpYmx5LWNvbXByZXNzZWQgbWFuIHBhZ2VzLgotCi0qIFdlZCBNYXIgMTUgMjAwMCBEYW1pZW4gTWlsbGVyIDxkam1AaWJzLmNvbS5hdT4KLS0gVXBkYXRlZCBmb3IgbmV3IGxvY2F0aW9uCi0tIFVwZGF0ZWQgZm9yIG5ldyBnbm9tZS1zc2gtYXNrcGFzcyBidWlsZAotCi0qIFN1biBEZWMgMjYgMTk5OSBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0tIEFkZGVkIEppbSBLbm9ibGUncyA8am1rbm9ibGVAcG9ib3guY29tPiBhc2twYXNzCi0KLSogTW9uIE5vdiAxNSAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4KLS0gU3BsaXQgc3VicGFja2FnZXMgZnVydGhlciBiYXNlZCBvbiBwYXRjaCBmcm9tIGppbSBrbm9ibGUgPGpta25vYmxlQHBvYm94LmNvbT4KLQotKiBTYXQgTm92IDEzIDE5OTkgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgotLSBBZGRlZCAnT2Jzb2xldGVzJyBkaXJlY3RpdmVzCi0KLSogVHVlIE5vdiAwOSAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBpYnMuY29tLmF1PgotLSBVc2UgbWFrZSBpbnN0YWxsCi0tIFN1YnBhY2thZ2VzCi0KLSogTW9uIE5vdiAwOCAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBpYnMuY29tLmF1PgotLSBBZGRlZCBsaW5rcyBmb3Igc2xvZ2luCi0tIEZpeGVkIHBlcm1zIG9uIG1hbnBhZ2VzCi0KLSogU2F0IE9jdCAzMCAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBpYnMuY29tLmF1PgotLSBSZW5hbWVkIGluaXQgc2NyaXB0Ci0KLSogRnJpIE9jdCAyOSAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBpYnMuY29tLmF1PgotLSBCYWNrIHRvIG9sZCBiaW5hcnkgbmFtZXMKLQotKiBUaHUgT2N0IDI4IDE5OTkgRGFtaWVuIE1pbGxlciA8ZGptQGlicy5jb20uYXU+Ci0tIFVzZSBhdXRvY29uZgotLSBOZXcgYmluYXJ5IG5hbWVzCi0KLSogV2VkIE9jdCAyNyAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBpYnMuY29tLmF1PgotLSBJbml0aWFsIFJQTWlmaWNhdGlvbiwgYmFzZWQgb24gSmFuICJZZW55YSIgS2FzcHJ6YWsncyA8a2FzQGZpLm11bmkuY3o+IHNwZWMuCmRpZmYgLS1naXQgYS9jb250cmliL3JlZGhhdC9zc2hkLmluaXQgYi9jb250cmliL3JlZGhhdC9zc2hkLmluaXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5YTc1MTcuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9yZWRoYXQvc3NoZC5pbml0CisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIEluaXQgZmlsZSBmb3IgT3BlblNTSCBzZXJ2ZXIgZGFlbW9uCi0jCi0jIGNoa2NvbmZpZzogMjM0NSA1NSAyNQotIyBkZXNjcmlwdGlvbjogT3BlblNTSCBzZXJ2ZXIgZGFlbW9uCi0jCi0jIHByb2Nlc3NuYW1lOiBzc2hkCi0jIGNvbmZpZzogL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5Ci0jIGNvbmZpZzogL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5LnB1YgotIyBjb25maWc6IC9ldGMvc3NoL3NzaF9yYW5kb21fc2VlZAotIyBjb25maWc6IC9ldGMvc3NoL3NzaGRfY29uZmlnCi0jIHBpZGZpbGU6IC92YXIvcnVuL3NzaGQucGlkCi0KLSMgc291cmNlIGZ1bmN0aW9uIGxpYnJhcnkKLS4gL2V0Yy9yYy5kL2luaXQuZC9mdW5jdGlvbnMKLQotIyBwdWxsIGluIHN5c2NvbmZpZyBzZXR0aW5ncwotWyAtZiAvZXRjL3N5c2NvbmZpZy9zc2hkIF0gJiYgLiAvZXRjL3N5c2NvbmZpZy9zc2hkCi0KLVJFVFZBTD0wCi1wcm9nPSJzc2hkIgotCi0jIFNvbWUgZnVuY3Rpb25zIHRvIG1ha2UgdGhlIGJlbG93IG1vcmUgcmVhZGFibGUKLVNTSEQ9L3Vzci9zYmluL3NzaGQKLVBJRF9GSUxFPS92YXIvcnVuL3NzaGQucGlkCi0KLWRvX3Jlc3RhcnRfc2FuaXR5X2NoZWNrKCkKLXsKLQkkU1NIRCAtdAotCVJFVFZBTD0kPwotCWlmIFsgISAiJFJFVFZBTCIgPSAwIF07IHRoZW4KLQkJZmFpbHVyZSAkIkNvbmZpZ3VyYXRpb24gZmlsZSBvciBrZXlzIGFyZSBpbnZhbGlkIgotCQllY2hvCi0JZmkKLX0KLQotc3RhcnQoKQotewotCSMgQ3JlYXRlIGtleXMgaWYgbmVjZXNzYXJ5Ci0JL3Vzci9iaW4vc3NoLWtleWdlbiAtQQotCWlmIFsgLXggL3NiaW4vcmVzdG9yZWNvbiBdOyB0aGVuCi0JCS9zYmluL3Jlc3RvcmVjb24gL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5LnB1YgotCQkvc2Jpbi9yZXN0b3JlY29uIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkucHViCi0JCS9zYmluL3Jlc3RvcmVjb24gL2V0Yy9zc2gvc3NoX2hvc3RfZHNhX2tleS5wdWIKLQkJL3NiaW4vcmVzdG9yZWNvbiAvZXRjL3NzaC9zc2hfaG9zdF9lY2RzYV9rZXkucHViCi0JZmkKLQotCWVjaG8gLW4gJCJTdGFydGluZyAkcHJvZzoiCi0JJFNTSEQgJE9QVElPTlMgJiYgc3VjY2VzcyB8fCBmYWlsdXJlCi0JUkVUVkFMPSQ/Ci0JWyAiJFJFVFZBTCIgPSAwIF0gJiYgdG91Y2ggL3Zhci9sb2NrL3N1YnN5cy9zc2hkCi0JZWNobwotfQotCi1zdG9wKCkKLXsKLQllY2hvIC1uICQiU3RvcHBpbmcgJHByb2c6IgotCWtpbGxwcm9jICRTU0hEIC1URVJNCi0JUkVUVkFMPSQ/Ci0JWyAiJFJFVFZBTCIgPSAwIF0gJiYgcm0gLWYgL3Zhci9sb2NrL3N1YnN5cy9zc2hkCi0JZWNobwotfQotCi1yZWxvYWQoKQotewotCWVjaG8gLW4gJCJSZWxvYWRpbmcgJHByb2c6IgotCWtpbGxwcm9jICRTU0hEIC1IVVAKLQlSRVRWQUw9JD8KLQllY2hvCi19Ci0KLWNhc2UgIiQxIiBpbgotCXN0YXJ0KQotCQlzdGFydAotCQk7OwotCXN0b3ApCi0JCXN0b3AKLQkJOzsKLQlyZXN0YXJ0KQotCQlzdG9wCi0JCXN0YXJ0Ci0JCTs7Ci0JcmVsb2FkKQotCQlyZWxvYWQKLQkJOzsKLQljb25kcmVzdGFydCkKLQkJaWYgWyAtZiAvdmFyL2xvY2svc3Vic3lzL3NzaGQgXSA7IHRoZW4KLQkJCWRvX3Jlc3RhcnRfc2FuaXR5X2NoZWNrCi0JCQlpZiBbICIkUkVUVkFMIiA9IDAgXSA7IHRoZW4KLQkJCQlzdG9wCi0JCQkJIyBhdm9pZCByYWNlCi0JCQkJc2xlZXAgMwotCQkJCXN0YXJ0Ci0JCQlmaQotCQlmaQotCQk7OwotCXN0YXR1cykKLQkJc3RhdHVzICRTU0hECi0JCVJFVFZBTD0kPwotCQk7OwotCSopCi0JCWVjaG8gJCJVc2FnZTogJDAge3N0YXJ0fHN0b3B8cmVzdGFydHxyZWxvYWR8Y29uZHJlc3RhcnR8c3RhdHVzfSIKLQkJUkVUVkFMPTEKLWVzYWMKLWV4aXQgJFJFVFZBTApkaWZmIC0tZ2l0IGEvY29udHJpYi9yZWRoYXQvc3NoZC5pbml0Lm9sZCBiL2NvbnRyaWIvcmVkaGF0L3NzaGQuaW5pdC5vbGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkZWI2MDguLjAwMDAwMDAKLS0tIGEvY29udHJpYi9yZWRoYXQvc3NoZC5pbml0Lm9sZAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBJbml0IGZpbGUgZm9yIE9wZW5TU0ggc2VydmVyIGRhZW1vbgotIwotIyBjaGtjb25maWc6IDIzNDUgNTUgMjUKLSMgZGVzY3JpcHRpb246IE9wZW5TU0ggc2VydmVyIGRhZW1vbgotIwotIyBwcm9jZXNzbmFtZTogc3NoZAotIyBjb25maWc6IC9ldGMvc3NoL3NzaF9ob3N0X2tleQotIyBjb25maWc6IC9ldGMvc3NoL3NzaF9ob3N0X2tleS5wdWIKLSMgY29uZmlnOiAvZXRjL3NzaC9zc2hfcmFuZG9tX3NlZWQKLSMgY29uZmlnOiAvZXRjL3NzaC9zc2hkX2NvbmZpZwotIyBwaWRmaWxlOiAvdmFyL3J1bi9zc2hkLnBpZAotCi0jIHNvdXJjZSBmdW5jdGlvbiBsaWJyYXJ5Ci0uIC9ldGMvcmMuZC9pbml0LmQvZnVuY3Rpb25zCi0KLSMgcHVsbCBpbiBzeXNjb25maWcgc2V0dGluZ3MKLVsgLWYgL2V0Yy9zeXNjb25maWcvc3NoZCBdICYmIC4gL2V0Yy9zeXNjb25maWcvc3NoZAotCi1SRVRWQUw9MAotcHJvZz0ic3NoZCIKLQotIyBTb21lIGZ1bmN0aW9ucyB0byBtYWtlIHRoZSBiZWxvdyBtb3JlIHJlYWRhYmxlCi1LRVlHRU49L3Vzci9iaW4vc3NoLWtleWdlbgotU1NIRD0vdXNyL3NiaW4vc3NoZAotUlNBMV9LRVk9L2V0Yy9zc2gvc3NoX2hvc3Rfa2V5Ci1SU0FfS0VZPS9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkKLURTQV9LRVk9L2V0Yy9zc2gvc3NoX2hvc3RfZHNhX2tleQotUElEX0ZJTEU9L3Zhci9ydW4vc3NoZC5waWQKLQotbXlfc3VjY2VzcygpIHsKLSAgbG9jYWwgbXNnCi0gIGlmIFsgJCMgLWd0IDEgXTsgdGhlbgotICAgIG1zZz0iJDIiCi0gIGVsc2UKLSAgICBtc2c9ImRvbmUiCi0gIGZpCi0gIGNhc2UgImB0eXBlIC10eXBlIHN1Y2Nlc3NgIiBpbgotICAgIGZ1bmN0aW9uKQotICAgICAgc3VjY2VzcyAiJDEiCi0gICAgOzsKLSAgICAqKQotICAgICAgZWNobyAtbiAiJHttc2d9IgotICAgIDs7Ci0gIGVzYWMKLX0KLW15X2ZhaWx1cmUoKSB7Ci0gIGxvY2FsIG1zZwotICBpZiBbICQjIC1ndCAxIF07IHRoZW4KLSAgICBtc2c9IiQyIgotICBlbHNlCi0gICAgbXNnPSJGQUlMRUQiCi0gIGZpCi0gIGNhc2UgImB0eXBlIC10eXBlIGZhaWx1cmVgIiBpbgotICAgIGZ1bmN0aW9uKQotICAgICAgZmFpbHVyZSAiJDEiCi0gICAgOzsKLSAgICAqKQotICAgICAgZWNobyAtbiAiJHttc2d9IgotICAgIDs7Ci0gIGVzYWMKLX0KLWRvX3JzYTFfa2V5Z2VuKCkgewotCWlmIFsgISAtcyAkUlNBMV9LRVkgXTsgdGhlbgotCQllY2hvIC1uICJHZW5lcmF0aW5nIFNTSDEgUlNBIGhvc3Qga2V5OiAiCi0JCWlmICRLRVlHRU4gLXEgLXQgcnNhMSAtZiAkUlNBMV9LRVkgLUMgJycgLU4gJycgPiYvZGV2L251bGw7IHRoZW4KLQkJCWNobW9kIDYwMCAkUlNBMV9LRVkKLQkJCWNobW9kIDY0NCAkUlNBMV9LRVkucHViCi0JCQlteV9zdWNjZXNzICJSU0ExIGtleSBnZW5lcmF0aW9uIgotCQkJZWNobwotCQllbHNlCi0JCQlteV9mYWlsdXJlICJSU0ExIGtleSBnZW5lcmF0aW9uIgotCQkJZWNobwotCQkJZXhpdCAxCi0JCWZpCi0JZmkKLX0KLWRvX3JzYV9rZXlnZW4oKSB7Ci0JaWYgWyAhIC1zICRSU0FfS0VZIF07IHRoZW4KLQkJZWNobyAtbiAiR2VuZXJhdGluZyBTU0gyIFJTQSBob3N0IGtleTogIgotCQlpZiAkS0VZR0VOIC1xIC10IHJzYSAtZiAkUlNBX0tFWSAtQyAnJyAtTiAnJyA+Ji9kZXYvbnVsbDsgdGhlbgotCQkJY2htb2QgNjAwICRSU0FfS0VZCi0JCQljaG1vZCA2NDQgJFJTQV9LRVkucHViCi0JCQlteV9zdWNjZXNzICJSU0Ega2V5IGdlbmVyYXRpb24iCi0JCQllY2hvCi0JCWVsc2UKLQkJCW15X2ZhaWx1cmUgIlJTQSBrZXkgZ2VuZXJhdGlvbiIKLQkJCWVjaG8KLQkJCWV4aXQgMQotCQlmaQotCWZpCi19Ci1kb19kc2Ffa2V5Z2VuKCkgewotCWlmIFsgISAtcyAkRFNBX0tFWSBdOyB0aGVuCi0JCWVjaG8gLW4gIkdlbmVyYXRpbmcgU1NIMiBEU0EgaG9zdCBrZXk6ICIKLQkJaWYgJEtFWUdFTiAtcSAtdCBkc2EgLWYgJERTQV9LRVkgLUMgJycgLU4gJycgPiYvZGV2L251bGw7IHRoZW4KLQkJCWNobW9kIDYwMCAkRFNBX0tFWQotCQkJY2htb2QgNjQ0ICREU0FfS0VZLnB1YgotCQkJbXlfc3VjY2VzcyAiRFNBIGtleSBnZW5lcmF0aW9uIgotCQkJZWNobwotCQllbHNlCi0JCQlteV9mYWlsdXJlICJEU0Ega2V5IGdlbmVyYXRpb24iCi0JCQllY2hvCi0JCQlleGl0IDEKLQkJZmkKLQlmaQotfQotZG9fcmVzdGFydF9zYW5pdHlfY2hlY2soKSB7Ci0JJFNTSEQgLXQKLQlSRVRWQUw9JD8KLQlpZiBbICEgIiRSRVRWQUwiID0gMCBdOyB0aGVuCi0JCW15X2ZhaWx1cmUgIkNvbmZpZ3VyYXRpb24gZmlsZSBvciBrZXlzIgotCQllY2hvCi0JZmkKLX0KLQotCi1jYXNlICIkMSIgaW4KLQlzdGFydCkKLQkJIyBDcmVhdGUga2V5cyBpZiBuZWNlc3NhcnkKLQkJZG9fcnNhMV9rZXlnZW47Ci0JCWRvX3JzYV9rZXlnZW47Ci0JCWRvX2RzYV9rZXlnZW47Ci0JCQotCQllY2hvIC1uICJTdGFydGluZyBzc2hkOiAiCi0JCWlmIFsgISAtZiAkUElEX0ZJTEUgXSA7IHRoZW4KLQkJCXNzaGQgJE9QVElPTlMKLQkJCVJFVFZBTD0kPwotCQkJaWYgWyAiJFJFVFZBTCIgPSAiMCIgXSA7IHRoZW4KLQkJCQlteV9zdWNjZXNzICJzc2hkIHN0YXJ0dXAiICJzc2hkIgotCQkJCXRvdWNoIC92YXIvbG9jay9zdWJzeXMvc3NoZAotCQkJZWxzZQotCQkJCW15X2ZhaWx1cmUgInNzaGQgc3RhcnR1cCIgIiIKLQkJCWZpCi0JCWZpCi0JCWVjaG8KLQkJOzsKLQlzdG9wKQotCQllY2hvIC1uICJTaHV0dGluZyBkb3duIHNzaGQ6ICIKLQkJaWYgWyAtZiAkUElEX0ZJTEUgXSA7IHRoZW4KLQkJCWtpbGxwcm9jIHNzaGQKLQkJCVJFVFZBTD0kPwotCQkJWyAkUkVUVkFMIC1lcSAwIF0gJiYgcm0gLWYgL3Zhci9sb2NrL3N1YnN5cy9zc2hkCi0JCWZpCi0JCWVjaG8KLQkJOzsKLQlyZXN0YXJ0KQotCQlkb19yZXN0YXJ0X3Nhbml0eV9jaGVjawotCQkkMCBzdG9wCi0JCSQwIHN0YXJ0Ci0JCVJFVFZBTD0kPwotCQk7OwotCWNvbmRyZXN0YXJ0KQotCQlpZiBbIC1mIC92YXIvbG9jay9zdWJzeXMvc3NoZCBdIDsgdGhlbgotCQkJZG9fcmVzdGFydF9zYW5pdHlfY2hlY2sKLQkJCSQwIHN0b3AKLQkJCSQwIHN0YXJ0Ci0JCQlSRVRWQUw9JD8KLQkJZmkKLQkJOzsKLQlzdGF0dXMpCi0JCXN0YXR1cyBzc2hkCi0JCVJFVFZBTD0kPwotCQk7OwotCSopCi0JCWVjaG8gIlVzYWdlOiBzc2hkIHtzdGFydHxzdG9wfHJlc3RhcnR8c3RhdHVzfGNvbmRyZXN0YXJ0fSIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi0KLWV4aXQgJFJFVFZBTApkaWZmIC0tZ2l0IGEvY29udHJpYi9yZWRoYXQvc3NoZC5wYW0gYi9jb250cmliL3JlZGhhdC9zc2hkLnBhbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhNWFkYi4uMDAwMDAwMAotLS0gYS9jb250cmliL3JlZGhhdC9zc2hkLnBhbQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyVQQU0tMS4wCi1hdXRoICAgICAgIHJlcXVpcmVkICAgICBwYW1fc3RhY2suc28gc2VydmljZT1zeXN0ZW0tYXV0aAotYWNjb3VudCAgICByZXF1aXJlZCAgICAgcGFtX25vbG9naW4uc28KLWFjY291bnQgICAgcmVxdWlyZWQgICAgIHBhbV9zdGFjay5zbyBzZXJ2aWNlPXN5c3RlbS1hdXRoCi1wYXNzd29yZCAgIHJlcXVpcmVkICAgICBwYW1fc3RhY2suc28gc2VydmljZT1zeXN0ZW0tYXV0aAotc2Vzc2lvbiAgICByZXF1aXJlZCAgICAgcGFtX3N0YWNrLnNvIHNlcnZpY2U9c3lzdGVtLWF1dGgKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcmVkaGF0L3NzaGQucGFtLm9sZCBiL2NvbnRyaWIvcmVkaGF0L3NzaGQucGFtLm9sZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkY2IzNC4uMDAwMDAwMAotLS0gYS9jb250cmliL3JlZGhhdC9zc2hkLnBhbS5vbGQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMlUEFNLTEuMAotYXV0aCAgICAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fcHdkYi5zbyBzaGFkb3cgbm9kZWxheQotYXV0aCAgICAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fbm9sb2dpbi5zbwotYWNjb3VudCAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fcHdkYi5zbwotcGFzc3dvcmQgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fY3JhY2tsaWIuc28KLXBhc3N3b3JkICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX3B3ZGIuc28gc2hhZG93IG51bGxvayB1c2VfYXV0aHRvawotc2Vzc2lvbiAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fcHdkYi5zbwotc2Vzc2lvbiAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fbGltaXRzLnNvCmRpZmYgLS1naXQgYS9jb250cmliL3NvbGFyaXMvUkVBRE1FIGIvY29udHJpYi9zb2xhcmlzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmVmZGQ0Yi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NvbGFyaXMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotVGhlIGZvbGxvd2luZyBpcyBhIG5ldyBwYWNrYWdlIGJ1aWxkIHNjcmlwdCBmb3IgU29sYXJpcy4gICBUaGlzIGlzIGJlaW5nCi1pbnRyb2R1Y2VkIGludG8gT3BlblNTSCAzLjAgYW5kIGFib3ZlIGluIGhvcGVzIG9mIHNpbXBsaWZ5aW5nIHRoZSBidWlsZAotcHJvY2Vzcy4gIEFzIG9mIDMuMXAyIHRoZSBzY3JpcHQgc2hvdWxkIHdvcmsgb24gYWxsIHBsYXRmb3JtcyB0aGF0IGhhdmUKLVNWUjQgc3R5bGUgcGFja2FnZSB0b29scy4KLQotVGhlIGJ1aWxkIHByb2Nlc3MgaXMgY2FsbGVkIGEgJ2R1bW15IGluc3RhbGwnLi4gV2hpY2ggbWVhbnMgdGhlIHNvZnR3YXJlIGRvZXMKLWEgICJtYWtlIGluc3RhbGwtbm9rZXlzIERFU1RESVI9W2Zha2Vyb290XSIuICBUaGlzIHdheSBhbGwgbWFucGFnZXMgc2hvdWxkCi1iZSBoYW5kbGVkIGNvcnJlY3RseSBhbmQga2V5IGFyZSBkZWZlcmVkIHVudGlsIHRoZSBmaXJzdCB0aW1lIHRoZSBzc2hkCi1pcyBzdGFydGVkLgotCi1EaXJlY3Rpb25zOgotCi0xLiBtYWtlIC1GIE1ha2VmaWxlLmluIGRpc3RwcmVwICAoT25seSBpZiB5b3UgYXJlIGdldHRpbmcgZnJvbSB0aGUgQ1ZTIHRyZWUpCi0yLiAuL2NvbmZpZ3VyZSAtLXdpdGgtcGFtIFsuLmFueSBvdGhlciBvcHRpb25zIHlvdSB3YW50Li5dCi0zLiBsb29rIGF0IHRoZSB0b3Agb2YgYnVpbGRwa2cuc2ggZm9yIHRoZSBjb25maWd1cmFibGUgb3B0aW9ucyBhbmQgcHV0Ci0gICBhbnkgY2hhbmdlcyB5b3Ugd2FudCBpbiBvcGVuc3NoLWNvbmZpZy5sb2NhbC4gQWRkaXRpb25hbCBjdXN0b21pemF0aW9ucwotICAgY2FuIGJlIGRvbmUgdG8gdGhlIGJ1aWxkIHByb2Nlc3MgYnkgY3JlYXRpbmcgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZwotICAgc2NyaXB0cyB0aGF0IHdpbGwgYmUgc291cmNlZCBieSBidWlsZHBrZy5zaC4KLQlwa2dfcG9zdF9tYWtlX2luc3RhbGxfZml4ZXMuc2ggcGtnLXBvc3QtcHJvdG90eXBlLWVkaXQuc2gKLQlwa2ctcHJlaW5zdGFsbC5sb2NhbCBwa2ctcG9zdGluc3RhbGwubG9jYWwgcGtnLXByZXJlbW92ZS5sb2NhbAotCXBrZy1wb3N0cmVtb3ZlLmxvY2FsIHBrZy1yZXF1ZXN0LmxvY2FsCi00LiBSdW4gIm1ha2UgcGFja2FnZSIKLQotSWYgYWxsIGdvZXMgd2VsbCB5b3Ugc2hvdWxkIGhhdmUgYSBzb2xhcmlzIHBhY2thZ2UgcmVhZHkgdG8gYmUgaW5zdGFsbGVkLgotCi1JZiB5b3UgaGF2ZSBhbnkgcHJvYmxlbXMgd2l0aCB0aGlzIHNjcmlwdCBwbGVhc2UgcG9zdCB0aGVtIHRvCi1vcGVuc3NoLXVuaXgtZGV2QG1pbmRyb3Qub3JnIGFuZCBJIHdpbGwgdHJ5IHRvIGFzc2lzdCB5b3UgYXMgYmVzdCBhcyBJIGNhbi4KLQotLSBCZW4gTGluZHN0cm9tCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3NoLWNvcHktaWQgYi9jb250cmliL3NzaC1jb3B5LWlkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDUxYWNlLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3NoLWNvcHktaWQKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBTaGVsbCBzY3JpcHQgdG8gaW5zdGFsbCB5b3VyIHB1YmxpYyBrZXkgb24gYSByZW1vdGUgbWFjaGluZQotIyBUYWtlcyB0aGUgcmVtb3RlIG1hY2hpbmUgbmFtZSBhcyBhbiBhcmd1bWVudC4KLSMgT2J2aW91c2x5LCB0aGUgcmVtb3RlIG1hY2hpbmUgbXVzdCBhY2NlcHQgcGFzc3dvcmQgYXV0aGVudGljYXRpb24sCi0jIG9yIG9uZSBvZiB0aGUgb3RoZXIga2V5cyBpbiB5b3VyIHNzaC1hZ2VudCwgZm9yIHRoaXMgdG8gd29yay4KLQotSURfRklMRT0iJHtIT01FfS8uc3NoL2lkX3JzYS5wdWIiCi0KLWlmIFsgIi1pIiA9ICIkMSIgXTsgdGhlbgotICBzaGlmdAotICAjIGNoZWNrIGlmIHdlIGhhdmUgMiBwYXJhbWV0ZXJzIGxlZnQsIGlmIHNvIHRoZSBmaXJzdCBpcyB0aGUgbmV3IElEIGZpbGUKLSAgaWYgWyAtbiAiJDIiIF07IHRoZW4KLSAgICBpZiBleHByICIkMSIgOiAiLipcLnB1YiIgPiAvZGV2L251bGwgOyB0aGVuCi0gICAgICBJRF9GSUxFPSIkMSIKLSAgICBlbHNlCi0gICAgICBJRF9GSUxFPSIkMS5wdWIiCi0gICAgZmkKLSAgICBzaGlmdCAgICAgICAgICMgYW5kIHRoaXMgc2hvdWxkIGxlYXZlICQxIGFzIHRoZSB0YXJnZXQgbmFtZQotICBmaQotZWxzZQotICBpZiBbIHgkU1NIX0FVVEhfU09DSyAhPSB4IF0gJiYgc3NoLWFkZCAtTCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBHRVRfSUQ9IiRHRVRfSUQgc3NoLWFkZCAtTCIKLSAgZmkKLWZpCi0KLWlmIFsgLXogImBldmFsICRHRVRfSURgIiBdICYmIFsgLXIgIiR7SURfRklMRX0iIF0gOyB0aGVuCi0gIEdFVF9JRD0iY2F0IFwiJHtJRF9GSUxFfVwiIgotZmkKLQotaWYgWyAteiAiYGV2YWwgJEdFVF9JRGAiIF07IHRoZW4KLSAgZWNobyAiJDA6IEVSUk9SOiBObyBpZGVudGl0aWVzIGZvdW5kIiA+JjIKLSAgZXhpdCAxCi1maQotCi1pZiBbICIkIyIgLWx0IDEgXSB8fCBbICIkMSIgPSAiLWgiIF0gfHwgWyAiJDEiID0gIi0taGVscCIgXTsgdGhlbgotICBlY2hvICJVc2FnZTogJDAgWy1pIFtpZGVudGl0eV9maWxlXV0gW3VzZXJAXW1hY2hpbmUiID4mMgotICBleGl0IDEKLWZpCi0KLSMgc3RyaXAgYW55IHRyYWlsaW5nIGNvbG9uCi1ob3N0PWBlY2hvICQxIHwgc2VkICdzLzokLy8nYAotCi17IGV2YWwgIiRHRVRfSUQiIDsgfSB8IHNzaCAkaG9zdCAidW1hc2sgMDc3OyB0ZXN0IC1kIH4vLnNzaCB8fCBta2RpciB+Ly5zc2ggOyBjYXQgPj4gfi8uc3NoL2F1dGhvcml6ZWRfa2V5cyIgfHwgZXhpdCAxCi0KLWNhdCA8PEVPRgotTm93IHRyeSBsb2dnaW5nIGludG8gdGhlIG1hY2hpbmUsIHdpdGggInNzaCAnJGhvc3QnIiwgYW5kIGNoZWNrIGluOgotCi0gIH4vLnNzaC9hdXRob3JpemVkX2tleXMKLQotdG8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgYWRkZWQgZXh0cmEga2V5cyB0aGF0IHlvdSB3ZXJlbid0IGV4cGVjdGluZy4KLQotRU9GCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3NoLWNvcHktaWQuMSBiL2NvbnRyaWIvc3NoLWNvcHktaWQuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxNWFiMi4uMDAwMDAwMAotLS0gYS9jb250cmliL3NzaC1jb3B5LWlkLjEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0uaWcgXCIgIC0qLSBucm9mZiAtKi0KLUNvcHlyaWdodCAoYykgMTk5OSBQaGlsaXAgSGFuZHMgQ29tcHV0aW5nIDxodHRwOi8vd3d3LmhhbmRzLmNvbS8+Ci0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KLS4uCi0uVEggU1NILUNPUFktSUQgMSAiMTQgTm92ZW1iZXIgMTk5OSIgIk9wZW5TU0giCi0uU0ggTkFNRQotc3NoLWNvcHktaWQgXC0gaW5zdGFsbCB5b3VyIHB1YmxpYyBrZXkgaW4gYSByZW1vdGUgbWFjaGluZSdzIGF1dGhvcml6ZWRfa2V5cwotLlNIIFNZTk9QU0lTCi0uQiBzc2gtY29weS1pZCBbLWkgW2lkZW50aXR5X2ZpbGVdXQotLkkgIlt1c2VyQF1tYWNoaW5lIgotLmJyCi0uU0ggREVTQ1JJUFRJT04KLS5CUiBzc2gtY29weS1pZAotaXMgYSBzY3JpcHQgdGhhdCB1c2VzIHNzaCB0byBsb2cgaW50byBhIHJlbW90ZSBtYWNoaW5lIGFuZAotYXBwZW5kIHRoZSBpbmRpY2F0ZWQgaWRlbnRpdHkgZmlsZSB0byB0aGF0IG1hY2hpbmUncwotLkIgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cwotZmlsZS4KLS5QUAotSWYgdGhlCi0uQiAtaQotb3B0aW9uIGlzIGdpdmVuIHRoZW4gdGhlIGlkZW50aXR5IGZpbGUgKGRlZmF1bHRzIHRvCi0uQlIgfi8uc3NoL2lkX3JzYS5wdWIgKQotaXMgdXNlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkga2V5cyBpbiB5b3VyCi0uQlIgc3NoLWFnZW50IC4KLU90aGVyd2lzZSwgaWYgdGhpczoKLS5QUAotLkIgIiAgICAgIHNzaC1hZGQgLUwiCi0uUFAKLXByb3ZpZGVzIGFueSBvdXRwdXQsIGl0IHVzZXMgdGhhdCBpbiBwcmVmZXJlbmNlIHRvIHRoZSBpZGVudGl0eSBmaWxlLgotLlBQCi1JZiB0aGUKLS5CIC1pCi1vcHRpb24gaXMgdXNlZCwgb3IgdGhlCi0uQiBzc2gtYWRkCi1wcm9kdWNlZCBubyBvdXRwdXQsIHRoZW4gaXQgdXNlcyB0aGUgY29udGVudHMgb2YgdGhlIGlkZW50aXR5Ci1maWxlLiAgT25jZSBpdCBoYXMgb25lIG9yIG1vcmUgZmluZ2VycHJpbnRzIChieSB3aGF0ZXZlciBtZWFucykgaXQKLXVzZXMgc3NoIHRvIGFwcGVuZCB0aGVtIHRvCi0uQiB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzCi1vbiB0aGUgcmVtb3RlIG1hY2hpbmUgKGNyZWF0aW5nIHRoZSBmaWxlLCBhbmQgZGlyZWN0b3J5LCBpZiBuZWNlc3NhcnkuKQotCi0uU0ggTk9URVMKLVRoaXMgcHJvZ3JhbSBkb2VzIG5vdCBtb2RpZnkgdGhlIHBlcm1pc3Npb25zIG9mIGFueQotcHJlLWV4aXN0aW5nIGZpbGVzIG9yIGRpcmVjdG9yaWVzLiBUaGVyZWZvcmUsIGlmIHRoZSByZW1vdGUKLS5CIHNzaGQKLWhhcwotLkIgU3RyaWN0TW9kZXMKLXNldCBpbiBpdHMKLWNvbmZpZ3VyYXRpb24sIHRoZW4gdGhlIHVzZXIncyBob21lLAotLkIgfi8uc3NoCi1mb2xkZXIsIGFuZAotLkIgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cwotZmlsZSBtYXkgbmVlZCB0byBoYXZlIGdyb3VwIHdyaXRhYmlsaXR5IGRpc2FibGVkIG1hbnVhbGx5LCBlLmcuIHZpYQotCi0uQiAiICAgICAgY2htb2QgZ28tdyB+IH4vLnNzaCB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzIgotCi1vbiB0aGUgcmVtb3RlIG1hY2hpbmUuCi0KLS5TSCAiU0VFIEFMU08iCi0uQlIgc3NoICgxKSwKLS5CUiBzc2gtYWdlbnQgKDEpLAotLkJSIHNzaGQgKDgpCmRpZmYgLS1naXQgYS9jb250cmliL3NzaGQucGFtLmZyZWVic2QgYi9jb250cmliL3NzaGQucGFtLmZyZWVic2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYmMzNjQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zc2hkLnBhbS5mcmVlYnNkCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zc2hkICAgIGF1dGggICAgICByZXF1aXJlZCAgcGFtX3VuaXguc28gICAgdHJ5X2ZpcnN0X3Bhc3MKLXNzaGQgICAgYWNjb3VudCAgIHJlcXVpcmVkICBwYW1fdW5peC5zbwotc3NoZCAgICBwYXNzd29yZCAgcmVxdWlyZWQgIHBhbV9wZXJtaXQuc28KLXNzaGQgICAgc2Vzc2lvbiAgIHJlcXVpcmVkICBwYW1fcGVybWl0LnNvCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3NoZC5wYW0uZ2VuZXJpYyBiL2NvbnRyaWIvc3NoZC5wYW0uZ2VuZXJpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1ZjBmZS4uMDAwMDAwMAotLS0gYS9jb250cmliL3NzaGQucGFtLmdlbmVyaWMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMlUEFNLTEuMAotYXV0aCAgICAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fdW5peC5zbyBzaGFkb3cgbm9kZWxheQotYWNjb3VudCAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fbm9sb2dpbi5zbwotYWNjb3VudCAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fdW5peC5zbwotcGFzc3dvcmQgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fY3JhY2tsaWIuc28KLXBhc3N3b3JkICAgcmVxdWlyZWQgICAgIC9saWIvc2VjdXJpdHkvcGFtX3VuaXguc28gc2hhZG93IG51bGxvayB1c2VfYXV0aHRvawotc2Vzc2lvbiAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fdW5peC5zbwotc2Vzc2lvbiAgICByZXF1aXJlZCAgICAgL2xpYi9zZWN1cml0eS9wYW1fbGltaXRzLnNvCmRpZmYgLS1naXQgYS9jb250cmliL3N1c2Uvb3BlbnNzaC5zcGVjIGIvY29udHJpYi9zdXNlL29wZW5zc2guc3BlYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0ZGZlYS4uMDAwMDAwMAotLS0gYS9jb250cmliL3N1c2Uvb3BlbnNzaC5zcGVjCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLSMgRGVmYXVsdCB2YWx1ZXMgZm9yIGFkZGl0aW9uYWwgY29tcG9uZW50cwotJWRlZmluZSBidWlsZF94MTFfYXNrcGFzcwkxCi0KLSMgRGVmaW5lIHRoZSBVSUQvR0lEIHRvIHVzZSBmb3IgcHJpdmlsZWdlIHNlcGFyYXRpb24KLSVkZWZpbmUgc3NoZF9naWQJNjUKLSVkZWZpbmUgc3NoZF91aWQJNzEKLQotIyBUaGUgdmVyc2lvbiBvZiB4MTEtc3NoLWFza3Bhc3MgdG8gdXNlCi0lZGVmaW5lIHh2ZXJzaW9uCTEuMi40LjEKLQotIyBBbGxvdyB0aGUgYWJpbGl0eSB0byBvdmVycmlkZSBkZWZhdWx0cyB3aXRoIC1EIHNraXBfeHh4PTEKLSV7P3NraXBfeDExX2Fza3Bhc3M6JWRlZmluZSBidWlsZF94MTFfYXNrcGFzcyAwfQotCi1TdW1tYXJ5OglPcGVuU1NILCBhIGZyZWUgU2VjdXJlIFNoZWxsIChTU0gpIHByb3RvY29sIGltcGxlbWVudGF0aW9uCi1OYW1lOgkJb3BlbnNzaAotVmVyc2lvbjoJNS45cDEKLVVSTDoJCWh0dHA6Ly93d3cub3BlbnNzaC5jb20vCi1SZWxlYXNlOgkxCi1Tb3VyY2UwOglvcGVuc3NoLSV7dmVyc2lvbn0udGFyLmd6Ci1Tb3VyY2UxOgl4MTEtc3NoLWFza3Bhc3MtJXt4dmVyc2lvbn0udGFyLmd6Ci1MaWNlbnNlOglCU0QKLUdyb3VwOgkJUHJvZHVjdGl2aXR5L05ldHdvcmtpbmcvU1NICi1CdWlsZFJvb3Q6CSV7X3RtcHBhdGh9L29wZW5zc2gtJXt2ZXJzaW9ufS1idWlsZHJvb3QKLVByZVJlcToJCW9wZW5zc2wKLU9ic29sZXRlczoJc3NoCi1Qcm92aWRlczoJc3NoCi0jCi0jIChCdWlsZFtpbmddIFByZXJlcVt1aXNpdGVzXSBvbmx5IHdvcmsgZm9yIFJQTSAyLjk1IGFuZCBuZXdlci4pCi0jIGJ1aWxkaW5nIHByZXJlcXVpc2l0ZXMgLS0gc3R1ZmYgZm9yCi0jICAgT3BlblNTTCAob3BlbnNzbC1kZXZlbCksCi0jICAgVENQIFdyYXBwZXJzICh0Y3BkLWRldmVsKSwKLSMgICBhbmQgR25vbWUgKGdsaWJkZXYsIGd0a2RldiwgYW5kIGdubGlic2QpCi0jCi1CdWlsZFByZXJlcToJb3BlbnNzbAotQnVpbGRQcmVyZXE6CXRjcGQtZGV2ZWwKLUJ1aWxkUHJlcmVxOgl6bGliLWRldmVsCi0jQnVpbGRQcmVyZXE6CWdsaWJkZXYKLSNCdWlsZFByZXJlcToJZ3RrZGV2Ci0jQnVpbGRQcmVyZXE6CWdubGlic2QKLQotJXBhY2thZ2UJYXNrcGFzcwotU3VtbWFyeToJQSBwYXNzcGhyYXNlIGRpYWxvZyBmb3IgT3BlblNTSCBhbmQgdGhlIFggd2luZG93IFN5c3RlbS4KLUdyb3VwOgkJUHJvZHVjdGl2aXR5L05ldHdvcmtpbmcvU1NICi1SZXF1aXJlczoJb3BlbnNzaCA9ICV7dmVyc2lvbn0KLU9ic29sZXRlczoJc3NoLWV4dHJhcwotUHJvdmlkZXM6CW9wZW5zc2g6JHtfbGliZGlyfS9zc2gvc3NoLWFza3Bhc3MKLQotJWlmICV7YnVpbGRfeDExX2Fza3Bhc3N9Ci1CdWlsZFByZXJlcToJWEZyZWU4Ni1kZXZlbAotJWVuZGlmCi0KLSVkZXNjcmlwdGlvbgotU3NoIChTZWN1cmUgU2hlbGwpIGlzIGEgcHJvZ3JhbSBmb3IgbG9nZ2luZyBpbnRvIGEgcmVtb3RlIG1hY2hpbmUgYW5kIGZvcgotZXhlY3V0aW5nIGNvbW1hbmRzIGluIGEgcmVtb3RlIG1hY2hpbmUuICBJdCBpcyBpbnRlbmRlZCB0byByZXBsYWNlCi1ybG9naW4gYW5kIHJzaCwgYW5kIHByb3ZpZGUgc2VjdXJlIGVuY3J5cHRlZCBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuCi10d28gdW50cnVzdGVkIGhvc3RzIG92ZXIgYW4gaW5zZWN1cmUgbmV0d29yay4gIFgxMSBjb25uZWN0aW9ucyBhbmQKLWFyYml0cmFyeSBUQ1AvSVAgcG9ydHMgY2FuIGFsc28gYmUgZm9yd2FyZGVkIG92ZXIgdGhlIHNlY3VyZSBjaGFubmVsLgotCi1PcGVuU1NIIGlzIE9wZW5CU0QncyByZXdvcmsgb2YgdGhlIGxhc3QgZnJlZSB2ZXJzaW9uIG9mIFNTSCwgYnJpbmdpbmcgaXQKLXVwIHRvIGRhdGUgaW4gdGVybXMgb2Ygc2VjdXJpdHkgYW5kIGZlYXR1cmVzLCBhcyB3ZWxsIGFzIHJlbW92aW5nIGFsbAotcGF0ZW50ZWQgYWxnb3JpdGhtcyB0byBzZXBlcmF0ZSBsaWJyYXJpZXMgKE9wZW5TU0wpLgotCi1UaGlzIHBhY2thZ2UgaW5jbHVkZXMgYWxsIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYm90aCB0aGUgT3BlblNTSAotY2xpZW50IGFuZCBzZXJ2ZXIuCi0KLSVkZXNjcmlwdGlvbiBhc2twYXNzCi1Tc2ggKFNlY3VyZSBTaGVsbCkgaXMgYSBwcm9ncmFtIGZvciBsb2dnaW5nIGludG8gYSByZW1vdGUgbWFjaGluZSBhbmQgZm9yCi1leGVjdXRpbmcgY29tbWFuZHMgaW4gYSByZW1vdGUgbWFjaGluZS4gIEl0IGlzIGludGVuZGVkIHRvIHJlcGxhY2UKLXJsb2dpbiBhbmQgcnNoLCBhbmQgcHJvdmlkZSBzZWN1cmUgZW5jcnlwdGVkIGNvbW11bmljYXRpb25zIGJldHdlZW4KLXR3byB1bnRydXN0ZWQgaG9zdHMgb3ZlciBhbiBpbnNlY3VyZSBuZXR3b3JrLiAgWDExIGNvbm5lY3Rpb25zIGFuZAotYXJiaXRyYXJ5IFRDUC9JUCBwb3J0cyBjYW4gYWxzbyBiZSBmb3J3YXJkZWQgb3ZlciB0aGUgc2VjdXJlIGNoYW5uZWwuCi0KLU9wZW5TU0ggaXMgT3BlbkJTRCdzIHJld29yayBvZiB0aGUgbGFzdCBmcmVlIHZlcnNpb24gb2YgU1NILCBicmluZ2luZyBpdAotdXAgdG8gZGF0ZSBpbiB0ZXJtcyBvZiBzZWN1cml0eSBhbmQgZmVhdHVyZXMsIGFzIHdlbGwgYXMgcmVtb3ZpbmcgYWxsCi1wYXRlbnRlZCBhbGdvcml0aG1zIHRvIHNlcGVyYXRlIGxpYnJhcmllcyAoT3BlblNTTCkuCi0KLVRoaXMgcGFja2FnZSBjb250YWlucyBhbiBYIFdpbmRvdyBTeXN0ZW0gcGFzc3BocmFzZSBkaWFsb2cgZm9yIE9wZW5TU0guCi0KLSVjaGFuZ2Vsb2cKLSogV2VkIE9jdCAyNiAyMDA1IElhaW4gTW9yZ2FuIDxpbW9yZ2FuQG5hcy5uYXNhLmdvdj4KLS0gUmVtb3ZlZCBhY2NpZGVudGFsIGluY2x1c2lvbiBvZiAtLXdpdGhvdXQtemxpYi12ZXJzaW9uLWNoZWNrCi0qIFR1ZSBPY3QgMjUgMjAwNSBJYWluIE1vcmdhbiA8aW1vcmdhbkBuYXMubmFzYS5nb3Y+Ci0tIE92ZXJoYXVsIHRvIGRlYWwgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiBTdVNFIGFuZCBPcGVuU1NICi0qIE1vbiBKdW4gMTIgMjAwMCBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0tIEdsb2IgbWFucGFnZXMgdG8gY2F0Y2ggY29tcHJlc3NlZCBmaWxlcwotKiBXZWQgTWFyIDE1IDIwMDAgRGFtaWVuIE1pbGxlciA8ZGptQGlicy5jb20uYXU+Ci0tIFVwZGF0ZWQgZm9yIG5ldyBsb2NhdGlvbgotLSBVcGRhdGVkIGZvciBuZXcgZ25vbWUtc3NoLWFza3Bhc3MgYnVpbGQKLSogU3VuIERlYyAyNiAxOTk5IENocmlzIFNhaWEgPGNzYWlhQHd0b3dlci5jb20+Ci0tIE1hZGUgc3ltbGluayB0byBnbm9tZS1zc2gtYXNrcGFzcyBjYWxsZWQgc3NoLWFza3Bhc3MKLSogV2VkIE5vdiAyNCAxOTk5IENocmlzIFNhaWEgPGNzYWlhQHd0b3dlci5jb20+Ci0tIFJlbW92ZWQgcGF0Y2hlcyB0aGF0IGluY2x1ZGVkIC9ldGMvcGFtLmQvc3NoZCwgL3NiaW4vaW5pdC5kL3JjLnNzaGQsIGFuZAotICAvdmFyL2FkbS9maWxsdXAtdGVtcGxhdGVzL3JjLmNvbmZpZy5zc2hkLCBzaW5jZSBEYW1pZW4gbWVyZ2VkIHRoZXNlIGludG8KLSAgaGlzIHJlbGVhc2VkIHRhcmZpbGUKLS0gQ2hhbmdlZCBwZXJtaXNzaW9ucyBvbiBzc2hfY29uZmlnIGluIHRoZSBpbnN0YWxsIHByb2NlZHVyZSB0byA2NDQgZnJvbSA2MDAKLSAgZXZlbiB0aG91Z2ggaXQgd2FzIGNvcnJlY3QgaW4gdGhlICVmaWxlcyBzZWN0aW9uIGFuZCB0aHVzIHJpZ2h0IGluIHRoZSBSUE1zCi0tIFBvc3RpbnN0YWxsIHNjcmlwdCBmb3IgdGhlIHNlcnZlciBub3cgb25seSBwcmludHMgIkdlbmVyYXRpbmcgU1NIIGhvc3QKLSAga2V5Li4uIiBpZiB3ZSBuZWVkIHRvIGFjdHVhbGx5IGRvIHRoaXMsIGluIG9yZGVyIHRvIGVsaW1pbmF0ZSBhIGNvbmZ1c2luZwotICBtZXNzYWdlIGlmIGFuIFNTSCBob3N0IGtleSBpcyBhbHJlYWR5IGluIHBsYWNlCi0tIE1hcmtlZCBhbGwgbWFudWFsIHBhZ2VzIGFzICVkb2ModW1lbnRhdGlvbikKLSogTW9uIE5vdiAyMiAxOTk5IENocmlzIFNhaWEgPGNzYWlhQHd0b3dlci5jb20+Ci0tIEFkZGVkIGZsYWcgdG8gY29uZmlndXJlIGRhZW1vbiB3aXRoIFRDUCBXcmFwcGVycyBzdXBwb3J0Ci0tIEFkZGVkIGJ1aWxkaW5nIHByZXJlcXVpc2l0ZXMgKHdvcmtzIGluIFJQTSAzLjAgYW5kIG5ld2VyKQotKiBUaHUgTm92IDE4IDE5OTkgQ2hyaXMgU2FpYSA8Y3NhaWFAd3Rvd2VyLmNvbT4KLS0gTWFkZSB0aGlzIHBhY2thZ2UgY29ycmVjdCBmb3IgU3VTRS4KLS0gQ2hhbmdlZCBpbnN0YW5jZXMgb2YgcGFtX3B3ZGIuc28gdG8gcGFtX3VuaXguc28sIHNpbmNlIGl0IHdvcmtzIG1vcmUgcHJvcGVybHkKLSAgd2l0aCBTdVNFLCBhbmQgbGliX3B3ZGIuc28gaXNuJ3QgaW5zdGFsbGVkIGJ5IGRlZmF1bHQuCi0qIE1vbiBOb3YgMTUgMTk5OSBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0tIFNwbGl0IHN1YnBhY2thZ2VzIGZ1cnRoZXIgYmFzZWQgb24gcGF0Y2ggZnJvbSBqaW0ga25vYmxlIDxqbWtub2JsZUBwb2JveC5jb20+Ci0qIFNhdCBOb3YgMTMgMTk5OSBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0tIEFkZGVkICdPYnNvbGV0ZXMnIGRpcmVjdGl2ZXMKLSogVHVlIE5vdiAwOSAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBpYnMuY29tLmF1PgotLSBVc2UgbWFrZSBpbnN0YWxsCi0tIFN1YnBhY2thZ2VzCi0qIE1vbiBOb3YgMDggMTk5OSBEYW1pZW4gTWlsbGVyIDxkam1AaWJzLmNvbS5hdT4KLS0gQWRkZWQgbGlua3MgZm9yIHNsb2dpbgotLSBGaXhlZCBwZXJtcyBvbiBtYW5wYWdlcwotKiBTYXQgT2N0IDMwIDE5OTkgRGFtaWVuIE1pbGxlciA8ZGptQGlicy5jb20uYXU+Ci0tIFJlbmFtZWQgaW5pdCBzY3JpcHQKLSogRnJpIE9jdCAyOSAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBpYnMuY29tLmF1PgotLSBCYWNrIHRvIG9sZCBiaW5hcnkgbmFtZXMKLSogVGh1IE9jdCAyOCAxOTk5IERhbWllbiBNaWxsZXIgPGRqbUBpYnMuY29tLmF1PgotLSBVc2UgYXV0b2NvbmYKLS0gTmV3IGJpbmFyeSBuYW1lcwotKiBXZWQgT2N0IDI3IDE5OTkgRGFtaWVuIE1pbGxlciA8ZGptQGlicy5jb20uYXU+Ci0tIEluaXRpYWwgUlBNaWZpY2F0aW9uLCBiYXNlZCBvbiBKYW4gIlllbnlhIiBLYXNwcnphaydzIDxrYXNAZmkubXVuaS5jej4gc3BlYy4KLQotJXByZXAKLQotJWlmICV7YnVpbGRfeDExX2Fza3Bhc3N9Ci0lc2V0dXAgLXEgLWEgMQotJWVsc2UKLSVzZXR1cCAtcQotJWVuZGlmCi0KLSVidWlsZAotQ0ZMQUdTPSIkUlBNX09QVF9GTEFHUyIgXAotJWNvbmZpZ3VyZQktLXByZWZpeD0vdXNyIFwKLQkJLS1zeXNjb25mZGlyPSV7X3N5c2NvbmZkaXJ9L3NzaCBcCi0JCS0tbWFuZGlyPSV7X21hbmRpcn0gXAotCQktLXdpdGgtcHJpdnNlcC1wYXRoPS92YXIvbGliL2VtcHR5IFwKLQkJLS13aXRoLXBhbSBcCi0JCS0td2l0aC10Y3Atd3JhcHBlcnMgXAotCQktLWxpYmV4ZWNkaXI9JXtfbGliZGlyfS9zc2gKLW1ha2UKLQotJWlmICV7YnVpbGRfeDExX2Fza3Bhc3N9Ci1jZCB4MTEtc3NoLWFza3Bhc3MtJXt4dmVyc2lvbn0KLSVjb25maWd1cmUJLS1tYW5kaXI9L3Vzci9YMTFSNi9tYW4gXAotCQktLWxpYmV4ZWNkaXI9JXtfbGliZGlyfS9zc2gKLXhta21mIC1hCi1tYWtlCi1jZCAuLgotJWVuZGlmCi0KLSVpbnN0YWxsCi1ybSAtcmYgJFJQTV9CVUlMRF9ST09UCi1tYWtlIGluc3RhbGwgREVTVERJUj0kUlBNX0JVSUxEX1JPT1QvCi1pbnN0YWxsIC1kICRSUE1fQlVJTERfUk9PVC9ldGMvcGFtLmQvCi1pbnN0YWxsIC1kICRSUE1fQlVJTERfUk9PVC9ldGMvaW5pdC5kLwotaW5zdGFsbCAtZCAkUlBNX0JVSUxEX1JPT1QvdmFyL2FkbS9maWxsdXAtdGVtcGxhdGVzCi1pbnN0YWxsIC1tNjQ0IGNvbnRyaWIvc3NoZC5wYW0uZ2VuZXJpYyAkUlBNX0JVSUxEX1JPT1QvZXRjL3BhbS5kL3NzaGQKLWluc3RhbGwgLW03NDQgY29udHJpYi9zdXNlL3JjLnNzaGQgJFJQTV9CVUlMRF9ST09UL2V0Yy9pbml0LmQvc3NoZAotaW5zdGFsbCAtbTc0NCBjb250cmliL3N1c2Uvc3lzY29uZmlnLnNzaCBcCi0gICAkUlBNX0JVSUxEX1JPT1QvdmFyL2FkbS9maWxsdXAtdGVtcGxhdGVzCi0KLSVpZiAle2J1aWxkX3gxMV9hc2twYXNzfQotY2QgeDExLXNzaC1hc2twYXNzLSV7eHZlcnNpb259Ci1tYWtlIGluc3RhbGwgaW5zdGFsbC5tYW4gQklORElSPSV7X2xpYmRpcn0vc3NoIERFU1RESVI9JFJQTV9CVUlMRF9ST09ULwotcm0gLWYgJFJQTV9CVUlMRF9ST09UL3Vzci9zaGFyZS9Tc2guYmluCi0lZW5kaWYKLQotJWNsZWFuCi1ybSAtcmYgJFJQTV9CVUlMRF9ST09UCi0KLSVwcmUKLS91c3Ivc2Jpbi9ncm91cGFkZCAtZyAle3NzaGRfZ2lkfSAtbyAtciBzc2hkIDI+IC9kZXYvbnVsbCB8fCA6Ci0vdXNyL3NiaW4vdXNlcmFkZCAtciAtbyAtZyBzc2hkIC11ICV7c3NoZF91aWR9IC1zIC9iaW4vZmFsc2UgLWMgIlNTSCBQcml2aWxlZ2UgU2VwYXJhdGlvbiBVc2VyIiAtZCAvdmFyL2xpYi9zc2hkIHNzaGQgMj4gL2Rldi9udWxsIHx8IDoKLQotJXBvc3QKLS91c3IvYmluL3NzaC1rZXlnZW4gLUEKLSV7ZmlsbHVwX2FuZF9pbnNzZXJ2IC1uIC15IHNzaCBzc2hkfQotJXJ1bl9wZXJtaXNzaW9ucwotCi0ldmVyaWZ5c2NyaXB0Ci0ldmVyaWZ5X3Blcm1pc3Npb25zIC1lIC9ldGMvc3NoL3NzaGRfY29uZmlnIC1lIC9ldGMvc3NoL3NzaF9jb25maWcgLWUgL3Vzci9iaW4vc3NoCi0KLSVwcmV1bgotJXN0b3Bfb25fcmVtb3ZhbCBzc2hkCi0KLSVwb3N0dW4KLSVyZXN0YXJ0X29uX3VwZGF0ZSBzc2hkCi0le2luc3NlcnZfY2xlYW51cH0KLQotJWZpbGVzCi0lZGVmYXR0cigtLHJvb3Qscm9vdCkKLSVkb2MgQ2hhbmdlTG9nIE9WRVJWSUVXIFJFQURNRSogUFJPVE9DT0wqCi0lZG9jIFRPRE8gQ1JFRElUUyBMSUNFTkNFCi0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJWRpciAle19zeXNjb25mZGlyfS9zc2gKLSVhdHRyKDA2NDQscm9vdCxyb290KSAlY29uZmlnKG5vcmVwbGFjZSkgJXtfc3lzY29uZmRpcn0vc3NoL3NzaF9jb25maWcKLSVhdHRyKDA2MDAscm9vdCxyb290KSAlY29uZmlnKG5vcmVwbGFjZSkgJXtfc3lzY29uZmRpcn0vc3NoL3NzaGRfY29uZmlnCi0lYXR0cigwNjAwLHJvb3Qscm9vdCkgJWNvbmZpZyhub3JlcGxhY2UpICV7X3N5c2NvbmZkaXJ9L3NzaC9tb2R1bGkKLSVhdHRyKDA2NDQscm9vdCxyb290KSAlY29uZmlnKG5vcmVwbGFjZSkgL2V0Yy9wYW0uZC9zc2hkCi0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJWNvbmZpZyAvZXRjL2luaXQuZC9zc2hkCi0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zc2gta2V5Z2VuCi0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zY3AKLSVhdHRyKDA3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3NzaAotJWF0dHIoLSxyb290LHJvb3QpICV7X2JpbmRpcn0vc2xvZ2luCi0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zc2gtYWdlbnQKLSVhdHRyKDA3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3NzaC1hZGQKLSVhdHRyKDA3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3NzaC1rZXlzY2FuCi0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zZnRwCi0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfc2JpbmRpcn0vc3NoZAotJWF0dHIoMDc1NSxyb290LHJvb3QpICVkaXIgJXtfbGliZGlyfS9zc2gKLSVhdHRyKDA3NTUscm9vdCxyb290KSAle19saWJkaXJ9L3NzaC9zZnRwLXNlcnZlcgotJWF0dHIoNDcxMSxyb290LHJvb3QpICV7X2xpYmRpcn0vc3NoL3NzaC1rZXlzaWduCi0lYXR0cigwNzU1LHJvb3Qscm9vdCkgJXtfbGliZGlyfS9zc2gvc3NoLXBrY3MxMS1oZWxwZXIKLSVhdHRyKDA2NDQscm9vdCxyb290KSAlZG9jICV7X21hbmRpcn0vbWFuMS9zY3AuMSoKLSVhdHRyKDA2NDQscm9vdCxyb290KSAlZG9jICV7X21hbmRpcn0vbWFuMS9zZnRwLjEqCi0lYXR0cigtLHJvb3Qscm9vdCkgJWRvYyAle19tYW5kaXJ9L21hbjEvc2xvZ2luLjEqCi0lYXR0cigwNjQ0LHJvb3Qscm9vdCkgJWRvYyAle19tYW5kaXJ9L21hbjEvc3NoLjEqCi0lYXR0cigwNjQ0LHJvb3Qscm9vdCkgJWRvYyAle19tYW5kaXJ9L21hbjEvc3NoLWFkZC4xKgotJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgJXtfbWFuZGlyfS9tYW4xL3NzaC1hZ2VudC4xKgotJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgJXtfbWFuZGlyfS9tYW4xL3NzaC1rZXlnZW4uMSoKLSVhdHRyKDA2NDQscm9vdCxyb290KSAlZG9jICV7X21hbmRpcn0vbWFuMS9zc2gta2V5c2Nhbi4xKgotJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgJXtfbWFuZGlyfS9tYW41L21vZHVsaS41KgotJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgJXtfbWFuZGlyfS9tYW41L3NzaF9jb25maWcuNSoKLSVhdHRyKDA2NDQscm9vdCxyb290KSAlZG9jICV7X21hbmRpcn0vbWFuNS9zc2hkX2NvbmZpZy41KgotJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgJXtfbWFuZGlyfS9tYW44L3NmdHAtc2VydmVyLjgqCi0lYXR0cigwNjQ0LHJvb3Qscm9vdCkgJWRvYyAle19tYW5kaXJ9L21hbjgvc3NoLWtleXNpZ24uOCoKLSVhdHRyKDA2NDQscm9vdCxyb290KSAlZG9jICV7X21hbmRpcn0vbWFuOC9zc2gtcGtjczExLWhlbHBlci44KgotJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgJXtfbWFuZGlyfS9tYW44L3NzaGQuOCoKLSVhdHRyKDA2NDQscm9vdCxyb290KSAvdmFyL2FkbS9maWxsdXAtdGVtcGxhdGVzL3N5c2NvbmZpZy5zc2gKLQotJWlmICV7YnVpbGRfeDExX2Fza3Bhc3N9Ci0lZmlsZXMgYXNrcGFzcwotJWRlZmF0dHIoLSxyb290LHJvb3QpCi0lZG9jIHgxMS1zc2gtYXNrcGFzcy0le3h2ZXJzaW9ufS9SRUFETUUKLSVkb2MgeDExLXNzaC1hc2twYXNzLSV7eHZlcnNpb259L0NoYW5nZUxvZwotJWRvYyB4MTEtc3NoLWFza3Bhc3MtJXt4dmVyc2lvbn0vU3NoQXNrcGFzcyouYWQKLSVhdHRyKDA3NTUscm9vdCxyb290KSAle19saWJkaXJ9L3NzaC9zc2gtYXNrcGFzcwotJWF0dHIoMDc1NSxyb290LHJvb3QpICV7X2xpYmRpcn0vc3NoL3gxMS1zc2gtYXNrcGFzcwotJWF0dHIoMDY0NCxyb290LHJvb3QpICVkb2MgL3Vzci9YMTFSNi9tYW4vbWFuMS9zc2gtYXNrcGFzcy4xeCoKLSVhdHRyKDA2NDQscm9vdCxyb290KSAlZG9jIC91c3IvWDExUjYvbWFuL21hbjEveDExLXNzaC1hc2twYXNzLjF4KgotJWF0dHIoMDY0NCxyb290LHJvb3QpICVjb25maWcgL3Vzci9YMTFSNi9saWIvWDExL2FwcC1kZWZhdWx0cy9Tc2hBc2twYXNzCi0lZW5kaWYKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3VzZS9yYy5jb25maWcuc3NoZCBiL2NvbnRyaWIvc3VzZS9yYy5jb25maWcuc3NoZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhYTdhNS4uMDAwMDAwMAotLS0gYS9jb250cmliL3N1c2UvcmMuY29uZmlnLnNzaGQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMKLSMgU3RhcnQgdGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBEYWVtb24/Ci0jCi1TVEFSVF9TU0hEPSJ5ZXMiCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3VzZS9yYy5zc2hkIGIvY29udHJpYi9zdXNlL3JjLnNzaGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhM2JjNDEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9zdXNlL3JjLnNzaGQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKGMpIDE5OTUtMjAwMCBTdVNFIEdtYkggTnVlcm5iZXJnLCBHZXJtYW55LgotIwotIyBBdXRob3I6IEppcmkgU21pZCA8ZmVlZGJhY2tAc3VzZS5kZT4KLSMKLSMgL2V0Yy9pbml0LmQvc3NoZAotIwotIyAgIGFuZCBzeW1ib2xpYyBpdHMgbGluawotIwotIyAvdXNyL3NiaW4vcmNzc2hkCi0jCi0jIyMgQkVHSU4gSU5JVCBJTkZPCi0jIFByb3ZpZGVzOiBzc2hkCi0jIFJlcXVpcmVkLVN0YXJ0OiAkbmV0d29yayAkcmVtb3RlX2ZzCi0jIFJlcXVpcmVkLVN0b3A6ICRuZXR3b3JrICRyZW1vdGVfZnMKLSMgRGVmYXVsdC1TdGFydDogMyA1Ci0jIERlZmF1bHQtU3RvcDogMCAxIDIgNgotIyBEZXNjcmlwdGlvbjogU3RhcnQgdGhlIHNzaGQgZGFlbW9uCi0jIyMgRU5EIElOSVQgSU5GTwotCi1TU0hEX0JJTj0vdXNyL3NiaW4vc3NoZAotdGVzdCAteCAkU1NIRF9CSU4gfHwgZXhpdCA1Ci0KLVNTSERfU1lTQ09ORklHPS9ldGMvc3lzY29uZmlnL3NzaAotdGVzdCAtciAkU1NIRF9TWVNDT05GSUcgfHwgZXhpdCA2Ci0uICRTU0hEX1NZU0NPTkZJRwotCi1TU0hEX1BJREZJTEU9L3Zhci9ydW4vc3NoZC5pbml0LnBpZAotCi0uIC9ldGMvcmMuc3RhdHVzCi0KLSMgU2hlbGwgZnVuY3Rpb25zIHNvdXJjZWQgZnJvbSAvZXRjL3JjLnN0YXR1czoKLSMgICAgICByY19jaGVjayAgICAgICAgIGNoZWNrIGFuZCBzZXQgbG9jYWwgYW5kIG92ZXJhbGwgcmMgc3RhdHVzCi0jICAgICAgcmNfc3RhdHVzICAgICAgICBjaGVjayBhbmQgc2V0IGxvY2FsIGFuZCBvdmVyYWxsIHJjIHN0YXR1cwotIyAgICAgIHJjX3N0YXR1cyAtdiAgICAgZGl0dG8gYnV0IGJlIHZlcmJvc2UgaW4gbG9jYWwgcmMgc3RhdHVzCi0jICAgICAgcmNfc3RhdHVzIC12IC1yICBkaXR0byBhbmQgY2xlYXIgdGhlIGxvY2FsIHJjIHN0YXR1cwotIyAgICAgIHJjX2ZhaWxlZCAgICAgICAgc2V0IGxvY2FsIGFuZCBvdmVyYWxsIHJjIHN0YXR1cyB0byBmYWlsZWQKLSMgICAgICByY19yZXNldCAgICAgICAgIGNsZWFyIGxvY2FsIHJjIHN0YXR1cyAob3ZlcmFsbCByZW1haW5zKQotIyAgICAgIHJjX2V4aXQgICAgICAgICAgZXhpdCBhcHByb3ByaWF0ZSB0byBvdmVyYWxsIHJjIHN0YXR1cwotCi0jIEZpcnN0IHJlc2V0IHN0YXR1cyBvZiB0aGlzIHNlcnZpY2UKLXJjX3Jlc2V0Ci0KLWNhc2UgIiQxIiBpbgotICAgIHN0YXJ0KQotCSMgR2VuZXJhdGUgYW55IG1pc3NpbmcgaG9zdCBrZXlzCi0Jc3NoLWtleWdlbiAtQQotCWVjaG8gLW4gIlN0YXJ0aW5nIFNTSCBkYWVtb24iCi0JIyMgU3RhcnQgZGFlbW9uIHdpdGggc3RhcnRwcm9jKDgpLiBJZiB0aGlzIGZhaWxzCi0JIyMgdGhlIGVjaG8gcmV0dXJuIHZhbHVlIGlzIHNldCBhcHByb3ByaWF0ZS4KLQotCXN0YXJ0cHJvYyAtZiAtcCAkU1NIRF9QSURGSUxFIC91c3Ivc2Jpbi9zc2hkICRTU0hEX09QVFMgLW8gIlBpZEZpbGU9JFNTSERfUElERklMRSIgCi0KLQkjIFJlbWVtYmVyIHN0YXR1cyBhbmQgYmUgdmVyYm9zZQotCXJjX3N0YXR1cyAtdgotCTs7Ci0gICAgc3RvcCkKLQllY2hvIC1uICJTaHV0dGluZyBkb3duIFNTSCBkYWVtb24iCi0JIyMgU3RvcCBkYWVtb24gd2l0aCBraWxscHJvYyg4KSBhbmQgaWYgdGhpcyBmYWlscwotCSMjIHNldCBlY2hvIHRoZSBlY2hvIHJldHVybiB2YWx1ZS4KLQotCWtpbGxwcm9jIC1wICRTU0hEX1BJREZJTEUgLVRFUk0gL3Vzci9zYmluL3NzaGQKLQotCSMgUmVtZW1iZXIgc3RhdHVzIGFuZCBiZSB2ZXJib3NlCi0JcmNfc3RhdHVzIC12Ci0JOzsKLSAgICB0cnktcmVzdGFydCkKLSAgICAgICAgIyMgU3RvcCB0aGUgc2VydmljZSBhbmQgaWYgdGhpcyBzdWNjZWVkcyAoaS5lLiB0aGUgCi0gICAgICAgICMjIHNlcnZpY2Ugd2FzIHJ1bm5pbmcgYmVmb3JlKSwgc3RhcnQgaXQgYWdhaW4uCi0gICAgICAgICQwIHN0YXR1cyA+L2Rldi9udWxsICYmICAkMCByZXN0YXJ0Ci0KLSAgICAgICAgIyBSZW1lbWJlciBzdGF0dXMgYW5kIGJlIHF1aWV0Ci0gICAgICAgIHJjX3N0YXR1cwotICAgICAgICA7OwotICAgIHJlc3RhcnQpCi0gICAgICAgICMjIFN0b3AgdGhlIHNlcnZpY2UgYW5kIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCB3YXMKLSAgICAgICAgIyMgcnVubmluZyBvciBub3QsIHN0YXJ0IGl0IGFnYWluLgotICAgICAgICAkMCBzdG9wCi0gICAgICAgICQwIHN0YXJ0Ci0KLSAgICAgICAgIyBSZW1lbWJlciBzdGF0dXMgYW5kIGJlIHF1aWV0Ci0gICAgICAgIHJjX3N0YXR1cwotICAgICAgICA7OwotICAgIGZvcmNlLXJlbG9hZHxyZWxvYWQpCi0JIyMgU2lnbmFsIHRoZSBkYWVtb24gdG8gcmVsb2FkIGl0cyBjb25maWcuIE1vc3QgZGFlbW9ucwotCSMjIGRvIHRoaXMgb24gc2lnbmFsIDEgKFNJR0hVUCkuCi0KLQllY2hvIC1uICJSZWxvYWQgc2VydmljZSBzc2hkIgotCi0Ja2lsbHByb2MgLXAgJFNTSERfUElERklMRSAtSFVQIC91c3Ivc2Jpbi9zc2hkCi0KLSAgICAgICAgcmNfc3RhdHVzIC12Ci0KLSAgICAgICAgOzsKLSAgICBzdGF0dXMpCi0JZWNobyAtbiAiQ2hlY2tpbmcgZm9yIHNlcnZpY2Ugc3NoZCAiCi0gICAgICAgICMjIENoZWNrIHN0YXR1cyB3aXRoIGNoZWNrcHJvYyg4KSwgaWYgcHJvY2VzcyBpcyBydW5uaW5nCi0gICAgICAgICMjIGNoZWNrcHJvYyB3aWxsIHJldHVybiB3aXRoIGV4aXQgc3RhdHVzIDAuCi0KLSAgICAgICAgIyBTdGF0dXMgaGFzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGZvciB0aGUgc3RhdHVzIGNvbW1hbmQ6Ci0gICAgICAgICMgMCAtIHNlcnZpY2UgcnVubmluZwotICAgICAgICAjIDEgLSBzZXJ2aWNlIGRlYWQsIGJ1dCAvdmFyL3J1bi8gIHBpZCAgZmlsZSBleGlzdHMKLSAgICAgICAgIyAyIC0gc2VydmljZSBkZWFkLCBidXQgL3Zhci9sb2NrLyBsb2NrIGZpbGUgZXhpc3RzCi0gICAgICAgICMgMyAtIHNlcnZpY2Ugbm90IHJ1bm5pbmcKLQotCWNoZWNrcHJvYyAtcCAkU1NIRF9QSURGSUxFIC91c3Ivc2Jpbi9zc2hkCi0KLQlyY19zdGF0dXMgLXYKLQk7OwotICAgIHByb2JlKQotCSMjIE9wdGlvbmFsOiBQcm9iZSBmb3IgdGhlIG5lY2Vzc2l0eSBvZiBhIHJlbG9hZCwKLQkjIyBnaXZlIG91dCB0aGUgYXJndW1lbnQgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGEgcmVsb2FkLgotCi0gICAgICAgIHRlc3QgL2V0Yy9zc2gvc3NoZF9jb25maWcgLW50ICRTU0hEX1BJREZJTEUgJiYgZWNobyByZWxvYWQKLQk7OwotICAgICopCi0JZWNobyAiVXNhZ2U6ICQwIHtzdGFydHxzdG9wfHN0YXR1c3x0cnktcmVzdGFydHxyZXN0YXJ0fGZvcmNlLXJlbG9hZHxyZWxvYWR8cHJvYmV9IgotCWV4aXQgMQotCTs7Ci1lc2FjCi1yY19leGl0CmRpZmYgLS1naXQgYS9jb250cmliL3N1c2Uvc3lzY29uZmlnLnNzaCBiL2NvbnRyaWIvc3VzZS9zeXNjb25maWcuc3NoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmEzN2U1Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvc3VzZS9zeXNjb25maWcuc3NoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jIyBQYXRoOglOZXR3b3JrL1JlbW90ZSBhY2Nlc3MvU1NICi0jIyBEZXNjcmlwdGlvbjoJU1NIIHNlcnZlciBzZXR0aW5ncwotIyMgVHlwZToJc3RyaW5nCi0jIyBEZWZhdWx0OgkiIgotIyMgU2VydmljZVJlc3RhcnQ6IHNzaGQKLSMKLSMgT3B0aW9ucyBmb3Igc3NoZAotIwotU1NIRF9PUFRTPSIiCmRpZmYgLS1naXQgYS9jcmMzMi5jIGIvY3JjMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5MmViNC4uMDAwMDAwMAotLS0gYS9jcmMzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qICRPcGVuQlNEOiBjcmMzMi5jLHYgMS4xMSAyMDA2LzA0LzIyIDE4OjI5OjMzIHN0ZXZlc2sgRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2luY2x1ZGUgImNyYzMyLmgiCi0KLXN0YXRpYyBjb25zdCB1X2ludDMyX3QgY3JjMzJ0YWJbXSA9IHsKLQkweDAwMDAwMDAwTCwgMHg3NzA3MzA5NkwsIDB4ZWUwZTYxMmNMLCAweDk5MDk1MWJhTCwKLQkweDA3NmRjNDE5TCwgMHg3MDZhZjQ4ZkwsIDB4ZTk2M2E1MzVMLCAweDllNjQ5NWEzTCwKLQkweDBlZGI4ODMyTCwgMHg3OWRjYjhhNEwsIDB4ZTBkNWU5MWVMLCAweDk3ZDJkOTg4TCwKLQkweDA5YjY0YzJiTCwgMHg3ZWIxN2NiZEwsIDB4ZTdiODJkMDdMLCAweDkwYmYxZDkxTCwKLQkweDFkYjcxMDY0TCwgMHg2YWIwMjBmMkwsIDB4ZjNiOTcxNDhMLCAweDg0YmU0MWRlTCwKLQkweDFhZGFkNDdkTCwgMHg2ZGRkZTRlYkwsIDB4ZjRkNGI1NTFMLCAweDgzZDM4NWM3TCwKLQkweDEzNmM5ODU2TCwgMHg2NDZiYThjMEwsIDB4ZmQ2MmY5N2FMLCAweDhhNjVjOWVjTCwKLQkweDE0MDE1YzRmTCwgMHg2MzA2NmNkOUwsIDB4ZmEwZjNkNjNMLCAweDhkMDgwZGY1TCwKLQkweDNiNmUyMGM4TCwgMHg0YzY5MTA1ZUwsIDB4ZDU2MDQxZTRMLCAweGEyNjc3MTcyTCwKLQkweDNjMDNlNGQxTCwgMHg0YjA0ZDQ0N0wsIDB4ZDIwZDg1ZmRMLCAweGE1MGFiNTZiTCwKLQkweDM1YjVhOGZhTCwgMHg0MmIyOTg2Y0wsIDB4ZGJiYmM5ZDZMLCAweGFjYmNmOTQwTCwKLQkweDMyZDg2Y2UzTCwgMHg0NWRmNWM3NUwsIDB4ZGNkNjBkY2ZMLCAweGFiZDEzZDU5TCwKLQkweDI2ZDkzMGFjTCwgMHg1MWRlMDAzYUwsIDB4YzhkNzUxODBMLCAweGJmZDA2MTE2TCwKLQkweDIxYjRmNGI1TCwgMHg1NmIzYzQyM0wsIDB4Y2ZiYTk1OTlMLCAweGI4YmRhNTBmTCwKLQkweDI4MDJiODllTCwgMHg1ZjA1ODgwOEwsIDB4YzYwY2Q5YjJMLCAweGIxMGJlOTI0TCwKLQkweDJmNmY3Yzg3TCwgMHg1ODY4NGMxMUwsIDB4YzE2MTFkYWJMLCAweGI2NjYyZDNkTCwKLQkweDc2ZGM0MTkwTCwgMHgwMWRiNzEwNkwsIDB4OThkMjIwYmNMLCAweGVmZDUxMDJhTCwKLQkweDcxYjE4NTg5TCwgMHgwNmI2YjUxZkwsIDB4OWZiZmU0YTVMLCAweGU4YjhkNDMzTCwKLQkweDc4MDdjOWEyTCwgMHgwZjAwZjkzNEwsIDB4OTYwOWE4OGVMLCAweGUxMGU5ODE4TCwKLQkweDdmNmEwZGJiTCwgMHgwODZkM2QyZEwsIDB4OTE2NDZjOTdMLCAweGU2NjM1YzAxTCwKLQkweDZiNmI1MWY0TCwgMHgxYzZjNjE2MkwsIDB4ODU2NTMwZDhMLCAweGYyNjIwMDRlTCwKLQkweDZjMDY5NWVkTCwgMHgxYjAxYTU3YkwsIDB4ODIwOGY0YzFMLCAweGY1MGZjNDU3TCwKLQkweDY1YjBkOWM2TCwgMHgxMmI3ZTk1MEwsIDB4OGJiZWI4ZWFMLCAweGZjYjk4ODdjTCwKLQkweDYyZGQxZGRmTCwgMHgxNWRhMmQ0OUwsIDB4OGNkMzdjZjNMLCAweGZiZDQ0YzY1TCwKLQkweDRkYjI2MTU4TCwgMHgzYWI1NTFjZUwsIDB4YTNiYzAwNzRMLCAweGQ0YmIzMGUyTCwKLQkweDRhZGZhNTQxTCwgMHgzZGQ4OTVkN0wsIDB4YTRkMWM0NmRMLCAweGQzZDZmNGZiTCwKLQkweDQzNjllOTZhTCwgMHgzNDZlZDlmY0wsIDB4YWQ2Nzg4NDZMLCAweGRhNjBiOGQwTCwKLQkweDQ0MDQyZDczTCwgMHgzMzAzMWRlNUwsIDB4YWEwYTRjNWZMLCAweGRkMGQ3Y2M5TCwKLQkweDUwMDU3MTNjTCwgMHgyNzAyNDFhYUwsIDB4YmUwYjEwMTBMLCAweGM5MGMyMDg2TCwKLQkweDU3NjhiNTI1TCwgMHgyMDZmODViM0wsIDB4Yjk2NmQ0MDlMLCAweGNlNjFlNDlmTCwKLQkweDVlZGVmOTBlTCwgMHgyOWQ5Yzk5OEwsIDB4YjBkMDk4MjJMLCAweGM3ZDdhOGI0TCwKLQkweDU5YjMzZDE3TCwgMHgyZWI0MGQ4MUwsIDB4YjdiZDVjM2JMLCAweGMwYmE2Y2FkTCwKLQkweGVkYjg4MzIwTCwgMHg5YWJmYjNiNkwsIDB4MDNiNmUyMGNMLCAweDc0YjFkMjlhTCwKLQkweGVhZDU0NzM5TCwgMHg5ZGQyNzdhZkwsIDB4MDRkYjI2MTVMLCAweDczZGMxNjgzTCwKLQkweGUzNjMwYjEyTCwgMHg5NDY0M2I4NEwsIDB4MGQ2ZDZhM2VMLCAweDdhNmE1YWE4TCwKLQkweGU0MGVjZjBiTCwgMHg5MzA5ZmY5ZEwsIDB4MGEwMGFlMjdMLCAweDdkMDc5ZWIxTCwKLQkweGYwMGY5MzQ0TCwgMHg4NzA4YTNkMkwsIDB4MWUwMWYyNjhMLCAweDY5MDZjMmZlTCwKLQkweGY3NjI1NzVkTCwgMHg4MDY1NjdjYkwsIDB4MTk2YzM2NzFMLCAweDZlNmIwNmU3TCwKLQkweGZlZDQxYjc2TCwgMHg4OWQzMmJlMEwsIDB4MTBkYTdhNWFMLCAweDY3ZGQ0YWNjTCwKLQkweGY5YjlkZjZmTCwgMHg4ZWJlZWZmOUwsIDB4MTdiN2JlNDNMLCAweDYwYjA4ZWQ1TCwKLQkweGQ2ZDZhM2U4TCwgMHhhMWQxOTM3ZUwsIDB4MzhkOGMyYzRMLCAweDRmZGZmMjUyTCwKLQkweGQxYmI2N2YxTCwgMHhhNmJjNTc2N0wsIDB4M2ZiNTA2ZGRMLCAweDQ4YjIzNjRiTCwKLQkweGQ4MGQyYmRhTCwgMHhhZjBhMWI0Y0wsIDB4MzYwMzRhZjZMLCAweDQxMDQ3YTYwTCwKLQkweGRmNjBlZmMzTCwgMHhhODY3ZGY1NUwsIDB4MzE2ZThlZWZMLCAweDQ2NjliZTc5TCwKLQkweGNiNjFiMzhjTCwgMHhiYzY2ODMxYUwsIDB4MjU2ZmQyYTBMLCAweDUyNjhlMjM2TCwKLQkweGNjMGM3Nzk1TCwgMHhiYjBiNDcwM0wsIDB4MjIwMjE2YjlMLCAweDU1MDUyNjJmTCwKLQkweGM1YmEzYmJlTCwgMHhiMmJkMGIyOEwsIDB4MmJiNDVhOTJMLCAweDVjYjM2YTA0TCwKLQkweGMyZDdmZmE3TCwgMHhiNWQwY2YzMUwsIDB4MmNkOTllOGJMLCAweDViZGVhZTFkTCwKLQkweDliNjRjMmIwTCwgMHhlYzYzZjIyNkwsIDB4NzU2YWEzOWNMLCAweDAyNmQ5MzBhTCwKLQkweDljMDkwNmE5TCwgMHhlYjBlMzYzZkwsIDB4NzIwNzY3ODVMLCAweDA1MDA1NzEzTCwKLQkweDk1YmY0YTgyTCwgMHhlMmI4N2ExNEwsIDB4N2JiMTJiYWVMLCAweDBjYjYxYjM4TCwKLQkweDkyZDI4ZTliTCwgMHhlNWQ1YmUwZEwsIDB4N2NkY2VmYjdMLCAweDBiZGJkZjIxTCwKLQkweDg2ZDNkMmQ0TCwgMHhmMWQ0ZTI0MkwsIDB4NjhkZGIzZjhMLCAweDFmZGE4MzZlTCwKLQkweDgxYmUxNmNkTCwgMHhmNmI5MjY1YkwsIDB4NmZiMDc3ZTFMLCAweDE4Yjc0Nzc3TCwKLQkweDg4MDg1YWU2TCwgMHhmZjBmNmE3MEwsIDB4NjYwNjNiY2FMLCAweDExMDEwYjVjTCwKLQkweDhmNjU5ZWZmTCwgMHhmODYyYWU2OUwsIDB4NjE2YmZmZDNMLCAweDE2NmNjZjQ1TCwKLQkweGEwMGFlMjc4TCwgMHhkNzBkZDJlZUwsIDB4NGUwNDgzNTRMLCAweDM5MDNiM2MyTCwKLQkweGE3NjcyNjYxTCwgMHhkMDYwMTZmN0wsIDB4NDk2OTQ3NGRMLCAweDNlNmU3N2RiTCwKLQkweGFlZDE2YTRhTCwgMHhkOWQ2NWFkY0wsIDB4NDBkZjBiNjZMLCAweDM3ZDgzYmYwTCwKLQkweGE5YmNhZTUzTCwgMHhkZWJiOWVjNUwsIDB4NDdiMmNmN2ZMLCAweDMwYjVmZmU5TCwKLQkweGJkYmRmMjFjTCwgMHhjYWJhYzI4YUwsIDB4NTNiMzkzMzBMLCAweDI0YjRhM2E2TCwKLQkweGJhZDAzNjA1TCwgMHhjZGQ3MDY5M0wsIDB4NTRkZTU3MjlMLCAweDIzZDk2N2JmTCwKLQkweGIzNjY3YTJlTCwgMHhjNDYxNGFiOEwsIDB4NWQ2ODFiMDJMLCAweDJhNmYyYjk0TCwKLQkweGI0MGJiZTM3TCwgMHhjMzBjOGVhMUwsIDB4NWEwNWRmMWJMLCAweDJkMDJlZjhkTAotfTsKLQotdV9pbnQzMl90Ci1zc2hfY3JjMzIoY29uc3QgdV9jaGFyICpidWYsIHVfaW50MzJfdCBzaXplKQotewotCXVfaW50MzJfdCBpLCBjcmM7Ci0KLQljcmMgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCWNyYyA9IGNyYzMydGFiWyhjcmMgXiBidWZbaV0pICYgMHhmZl0gXiAoY3JjID4+IDgpOwotCXJldHVybiBjcmM7Ci19CmRpZmYgLS1naXQgYS9jcmMzMi5oIGIvY3JjMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3MTMxYS4uMDAwMDAwMAotLS0gYS9jcmMzMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGNyYzMyLmgsdiAxLjE1IDIwMDYvMDMvMjUgMjI6MjI6NDMgZGptIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgU1NIX0NSQzMyX0gKLSNkZWZpbmUgU1NIX0NSQzMyX0gKLXVfaW50MzJfdAkgc3NoX2NyYzMyKGNvbnN0IHVfY2hhciAqLCB1X2ludDMyX3QpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9kZWF0dGFjay5jIGIvZGVhdHRhY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIzN2U0ZC4uMDAwMDAwMAotLS0gYS9kZWF0dGFjay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qICRPcGVuQlNEOiBkZWF0dGFjay5jLHYgMS4zMCAyMDA2LzA5LzE2IDE5OjUzOjM3IGRqbSBFeHAgJCAqLwotLyoKLSAqIENyeXB0b2dyYXBoaWMgYXR0YWNrIGRldGVjdG9yIGZvciBzc2ggLSBzb3VyY2UgY29kZQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OCBDT1JFIFNESSBTLkEuLCBCdWVub3MgQWlyZXMsIEFyZ2VudGluYS4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5Ci0gKiBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0Ci0gKiB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMgcmV0YWluZWQuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIENPUkUgU0RJIFMuQS4gQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIFJFU1VMVElORyBGUk9NIFRIRSBVU0UgT1IgTUlTVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLgotICoKLSAqIEFyaWVsIEZ1dG9yYW5za3kgPGZ1dG9AY29yZS1zZGkuY29tPgotICogPGh0dHA6Ly93d3cuY29yZS1zZGkuY29tPgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImRlYXR0YWNrLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAiY3JjMzIuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLS8qCi0gKiBDUkMgYXR0YWNrIGRldGVjdGlvbiBoYXMgYSB3b3JzdC1jYXNlIGJlaGF2aW91ciB0aGF0IGlzIE8oTl4zKSBvdmVyCi0gKiB0aGUgbnVtYmVyIG9mIGlkZW50aWNhbCBibG9ja3MgaW4gYSBwYWNrZXQuIFRoaXMgYmVoYXZpb3VyIGNhbiBiZSAKLSAqIGV4cGxvaXRlZCB0byBjcmVhdGUgYSBsaW1pdGVkIGRlbmlhbCBvZiBzZXJ2aWNlIGF0dGFjay4gCi0gKiAKLSAqIEhvd2V2ZXIsIGJlY2F1c2Ugd2UgYXJlIGRlYWxpbmcgd2l0aCBlbmNyeXB0ZWQgZGF0YSwgaWRlbnRpY2FsCi0gKiBibG9ja3Mgc2hvdWxkIG9ubHkgb2NjdXIgZXZlcnkgMl4zNSBtYXhpbWFsbHktc2l6ZWQgcGFja2V0cyBvciBzby4gCi0gKiBDb25zZXF1ZW50bHksIHdlIGNhbiBkZXRlY3QgdGhpcyBEb1MgYnkgbG9va2luZyBmb3IgaWRlbnRpY2FsIGJsb2NrcwotICogaW4gYSBwYWNrZXQuCi0gKgotICogVGhlIHBhcmFtZXRlciBiZWxvdyBkZXRlcm1pbmVzIGhvdyBtYW55IGlkZW50aWNhbCBibG9ja3Mgd2Ugd2lsbAotICogYWNjZXB0IGluIGEgc2luZ2xlIHBhY2tldCwgdHJhZGluZyBvZmYgYmV0d2VlbiBhdHRhY2sgZGV0ZWN0aW9uIGFuZAotICogbGlrZWxpaG9vZCBvZiB0ZXJtaW5hdGluZyBhIGxlZ2l0aW1hdGUgY29ubmVjdGlvbi4gQSB2YWx1ZSBvZiAzMiAKLSAqIGNvcnJlc3BvbmRzIHRvIGFuIGF2ZXJhZ2Ugb2YgMl40MCBtZXNzYWdlcyBiZWZvcmUgYW4gYXR0YWNrIGlzCi0gKiBtaXNkZXRlY3RlZAotICovCi0jZGVmaW5lIE1BWF9JREVOVElDQUwJMzIKLQotLyogU1NIIENvbnN0YW50cyAqLwotI2RlZmluZSBTU0hfTUFYQkxPQ0tTCSgzMiAqIDEwMjQpCi0jZGVmaW5lIFNTSF9CTE9DS1NJWkUJKDgpCi0KLS8qIEhhc2hpbmcgY29uc3RhbnRzICovCi0jZGVmaW5lIEhBU0hfTUlOU0laRQkoOCAqIDEwMjQpCi0jZGVmaW5lIEhBU0hfRU5UUllTSVpFCSgyKQotI2RlZmluZSBIQVNIX0ZBQ1RPUih4KQkoKHgpKjMvMikKLSNkZWZpbmUgSEFTSF9VTlVTRURDSEFSCSgweGZmKQotI2RlZmluZSBIQVNIX1VOVVNFRAkoMHhmZmZmKQotI2RlZmluZSBIQVNIX0lWCQkoMHhmZmZlKQotCi0jZGVmaW5lIEhBU0hfTUlOQkxPQ0tTCSg3KlNTSF9CTE9DS1NJWkUpCi0KLQotLyogSGFzaCBmdW5jdGlvbiAoSW5wdXQga2V5cyBhcmUgY2lwaGVyIHJlc3VsdHMpICovCi0jZGVmaW5lIEhBU0goeCkJCWdldF91MzIoeCkKLQotI2RlZmluZSBDTVAoYSwgYikJKG1lbWNtcChhLCBiLCBTU0hfQkxPQ0tTSVpFKSkKLQotc3RhdGljIHZvaWQKLWNyY191cGRhdGUodV9pbnQzMl90ICphLCB1X2ludDMyX3QgYikKLXsKLQliIF49ICphOwotCSphID0gc3NoX2NyYzMyKCh1X2NoYXIgKikmYiwgc2l6ZW9mKGIpKTsKLX0KLQotLyogZGV0ZWN0IGlmIGEgYmxvY2sgaXMgdXNlZCBpbiBhIHBhcnRpY3VsYXIgcGF0dGVybiAqLwotc3RhdGljIGludAotY2hlY2tfY3JjKHVfY2hhciAqUywgdV9jaGFyICpidWYsIHVfaW50MzJfdCBsZW4pCi17Ci0JdV9pbnQzMl90IGNyYzsKLQl1X2NoYXIgKmM7Ci0KLQljcmMgPSAwOwotCWZvciAoYyA9IGJ1ZjsgYyA8IGJ1ZiArIGxlbjsgYyArPSBTU0hfQkxPQ0tTSVpFKSB7Ci0JCWlmICghQ01QKFMsIGMpKSB7Ci0JCQljcmNfdXBkYXRlKCZjcmMsIDEpOwotCQkJY3JjX3VwZGF0ZSgmY3JjLCAwKTsKLQkJfSBlbHNlIHsKLQkJCWNyY191cGRhdGUoJmNyYywgMCk7Ci0JCQljcmNfdXBkYXRlKCZjcmMsIDApOwotCQl9Ci0JfQotCXJldHVybiAoY3JjID09IDApOwotfQotCi0KLS8qIERldGVjdCBhIGNyYzMyIGNvbXBlbnNhdGlvbiBhdHRhY2sgb24gYSBwYWNrZXQgKi8KLWludAotZGV0ZWN0X2F0dGFjayh1X2NoYXIgKmJ1ZiwgdV9pbnQzMl90IGxlbikKLXsKLQlzdGF0aWMgdV9pbnQxNl90ICpoID0gKHVfaW50MTZfdCAqKSBOVUxMOwotCXN0YXRpYyB1X2ludDMyX3QgbiA9IEhBU0hfTUlOU0laRSAvIEhBU0hfRU5UUllTSVpFOwotCXVfaW50MzJfdCBpLCBqOwotCXVfaW50MzJfdCBsLCBzYW1lOwotCXVfY2hhciAqYzsKLQl1X2NoYXIgKmQ7Ci0KLQlpZiAobGVuID4gKFNTSF9NQVhCTE9DS1MgKiBTU0hfQkxPQ0tTSVpFKSB8fAotCSAgICBsZW4gJSBTU0hfQkxPQ0tTSVpFICE9IDApIHsKLQkJZmF0YWwoImRldGVjdF9hdHRhY2s6IGJhZCBsZW5ndGggJWQiLCBsZW4pOwotCX0KLQlmb3IgKGwgPSBuOyBsIDwgSEFTSF9GQUNUT1IobGVuIC8gU1NIX0JMT0NLU0laRSk7IGwgPSBsIDw8IDIpCi0JCTsKLQotCWlmIChoID09IE5VTEwpIHsKLQkJZGVidWcoIkluc3RhbGxpbmcgY3JjIGNvbXBlbnNhdGlvbiBhdHRhY2sgZGV0ZWN0b3IuIik7Ci0JCWggPSAodV9pbnQxNl90ICopIHhjYWxsb2MobCwgSEFTSF9FTlRSWVNJWkUpOwotCQluID0gbDsKLQl9IGVsc2UgewotCQlpZiAobCA+IG4pIHsKLQkJCWggPSAodV9pbnQxNl90ICopeHJlYWxsb2MoaCwgbCwgSEFTSF9FTlRSWVNJWkUpOwotCQkJbiA9IGw7Ci0JCX0KLQl9Ci0KLQlpZiAobGVuIDw9IEhBU0hfTUlOQkxPQ0tTKSB7Ci0JCWZvciAoYyA9IGJ1ZjsgYyA8IGJ1ZiArIGxlbjsgYyArPSBTU0hfQkxPQ0tTSVpFKSB7Ci0JCQlmb3IgKGQgPSBidWY7IGQgPCBjOyBkICs9IFNTSF9CTE9DS1NJWkUpIHsKLQkJCQlpZiAoIUNNUChjLCBkKSkgewotCQkJCQlpZiAoKGNoZWNrX2NyYyhjLCBidWYsIGxlbikpKQotCQkJCQkJcmV0dXJuIChERUFUVEFDS19ERVRFQ1RFRCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKERFQVRUQUNLX09LKTsKLQl9Ci0JbWVtc2V0KGgsIEhBU0hfVU5VU0VEQ0hBUiwgbiAqIEhBU0hfRU5UUllTSVpFKTsKLQotCWZvciAoYyA9IGJ1Ziwgc2FtZSA9IGogPSAwOyBjIDwgKGJ1ZiArIGxlbik7IGMgKz0gU1NIX0JMT0NLU0laRSwgaisrKSB7Ci0JCWZvciAoaSA9IEhBU0goYykgJiAobiAtIDEpOyBoW2ldICE9IEhBU0hfVU5VU0VEOwotCQkgICAgaSA9IChpICsgMSkgJiAobiAtIDEpKSB7Ci0JCQlpZiAoIUNNUChjLCBidWYgKyBoW2ldICogU1NIX0JMT0NLU0laRSkpIHsKLQkJCQlpZiAoKytzYW1lID4gTUFYX0lERU5USUNBTCkKLQkJCQkJcmV0dXJuIChERUFUVEFDS19ET1NfREVURUNURUQpOwotCQkJCWlmIChjaGVja19jcmMoYywgYnVmLCBsZW4pKQotCQkJCQlyZXR1cm4gKERFQVRUQUNLX0RFVEVDVEVEKTsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWhbaV0gPSBqOwotCX0KLQlyZXR1cm4gKERFQVRUQUNLX09LKTsKLX0KZGlmZiAtLWdpdCBhL2RlYXR0YWNrLmggYi9kZWF0dGFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzE2ZmIyLi4wMDAwMDAwCi0tLSBhL2RlYXR0YWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiAkT3BlbkJTRDogZGVhdHRhY2suaCx2IDEuMTAgMjAwNi8wOS8xNiAxOTo1MzozNyBkam0gRXhwICQgKi8KLQotLyoKLSAqIENyeXB0b2dyYXBoaWMgYXR0YWNrIGRldGVjdG9yIGZvciBzc2ggLSBIZWFkZXIgZmlsZQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OCBDT1JFIFNESSBTLkEuLCBCdWVub3MgQWlyZXMsIEFyZ2VudGluYS4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5Ci0gKiBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0Ci0gKiB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMgcmV0YWluZWQuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIENPUkUgU0RJIFMuQS4gQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIFJFU1VMVElORyBGUk9NIFRIRSBVU0UgT1IgTUlTVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLgotICoKLSAqIEFyaWVsIEZ1dG9yYW5za3kgPGZ1dG9AY29yZS1zZGkuY29tPgotICogPGh0dHA6Ly93d3cuY29yZS1zZGkuY29tPgotICovCi0KLSNpZm5kZWYgX0RFQVRUQUNLX0gKLSNkZWZpbmUgX0RFQVRUQUNLX0gKLQotLyogUmV0dXJuIGNvZGVzICovCi0jZGVmaW5lIERFQVRUQUNLX09LCQkwCi0jZGVmaW5lIERFQVRUQUNLX0RFVEVDVEVECTEKLSNkZWZpbmUgREVBVFRBQ0tfRE9TX0RFVEVDVEVECTIKLQotaW50CSBkZXRlY3RfYXR0YWNrKHVfY2hhciAqLCB1X2ludDMyX3QpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9kZWZpbmVzLmggYi9kZWZpbmVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0Y2NjNTQuLjAwMDAwMDAKLS0tIGEvZGVmaW5lcy5oCisrKyAvZGV2L251bGwKQEAgLTEsODExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMyBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfREVGSU5FU19ICi0jZGVmaW5lIF9ERUZJTkVTX0gKLQotLyogJElkOiBkZWZpbmVzLmgsdiAxLjE2NyAyMDExLzA2LzAzIDAxOjE3OjQ5IHRpbSBFeHAgJCAqLwotCi0KLS8qIENvbnN0YW50cyAqLwotCi0jaWYgZGVmaW5lZChIQVZFX0RFQ0xfU0hVVF9SRCkgJiYgSEFWRV9ERUNMX1NIVVRfUkQgPT0gMAotZW51bQotewotICBTSFVUX1JEID0gMCwJCS8qIE5vIG1vcmUgcmVjZXB0aW9ucy4gICovCi0gIFNIVVRfV1IsCQkJLyogTm8gbW9yZSB0cmFuc21pc3Npb25zLiAgKi8KLSAgU0hVVF9SRFdSCQkJLyogTm8gbW9yZSByZWNlcHRpb25zIG9yIHRyYW5zbWlzc2lvbnMuICAqLwotfTsKLSMgZGVmaW5lIFNIVVRfUkQgICBTSFVUX1JECi0jIGRlZmluZSBTSFVUX1dSICAgU0hVVF9XUgotIyBkZWZpbmUgU0hVVF9SRFdSIFNIVVRfUkRXUgotI2VuZGlmCi0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgSVAgdHlwZSBvZiBzZXJ2aWNlIChpcF90b3MpCi0gKi8KLSNpbmNsdWRlIDxuZXRpbmV0L2luX3N5c3RtLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgotI2lmbmRlZiBJUFRPU19MT1dERUxBWQotIyBkZWZpbmUgSVBUT1NfTE9XREVMQVkgICAgICAgICAgMHgxMAotIyBkZWZpbmUgSVBUT1NfVEhST1VHSFBVVCAgICAgICAgMHgwOAotIyBkZWZpbmUgSVBUT1NfUkVMSUFCSUxJVFkgICAgICAgMHgwNAotIyBkZWZpbmUgSVBUT1NfTE9XQ09TVCAgICAgICAgICAgMHgwMgotIyBkZWZpbmUgSVBUT1NfTUlOQ09TVCAgICAgICAgICAgSVBUT1NfTE9XQ09TVAotI2VuZGlmIC8qIElQVE9TX0xPV0RFTEFZICovCi0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgRGlmZlNlcnYgQ29kZXBvaW50cyBhcyBwZXIgUkZDMjQ3NAotICovCi0jaWZuZGVmIElQVE9TX0RTQ1BfQUYxMQotIyBkZWZpbmUJSVBUT1NfRFNDUF9BRjExCQkweDI4Ci0jIGRlZmluZQlJUFRPU19EU0NQX0FGMTIJCTB4MzAKLSMgZGVmaW5lCUlQVE9TX0RTQ1BfQUYxMwkJMHgzOAotIyBkZWZpbmUJSVBUT1NfRFNDUF9BRjIxCQkweDQ4Ci0jIGRlZmluZQlJUFRPU19EU0NQX0FGMjIJCTB4NTAKLSMgZGVmaW5lCUlQVE9TX0RTQ1BfQUYyMwkJMHg1OAotIyBkZWZpbmUJSVBUT1NfRFNDUF9BRjMxCQkweDY4Ci0jIGRlZmluZQlJUFRPU19EU0NQX0FGMzIJCTB4NzAKLSMgZGVmaW5lCUlQVE9TX0RTQ1BfQUYzMwkJMHg3OAotIyBkZWZpbmUJSVBUT1NfRFNDUF9BRjQxCQkweDg4Ci0jIGRlZmluZQlJUFRPU19EU0NQX0FGNDIJCTB4OTAKLSMgZGVmaW5lCUlQVE9TX0RTQ1BfQUY0MwkJMHg5OAotIyBkZWZpbmUJSVBUT1NfRFNDUF9FRgkJMHhiOAotI2VuZGlmIC8qIElQVE9TX0RTQ1BfQUYxMSAqLwotI2lmbmRlZiBJUFRPU19EU0NQX0NTMAotIyBkZWZpbmUJSVBUT1NfRFNDUF9DUzAJCTB4MDAKLSMgZGVmaW5lCUlQVE9TX0RTQ1BfQ1MxCQkweDIwCi0jIGRlZmluZQlJUFRPU19EU0NQX0NTMgkJMHg0MAotIyBkZWZpbmUJSVBUT1NfRFNDUF9DUzMJCTB4NjAKLSMgZGVmaW5lCUlQVE9TX0RTQ1BfQ1M0CQkweDgwCi0jIGRlZmluZQlJUFRPU19EU0NQX0NTNQkJMHhhMAotIyBkZWZpbmUJSVBUT1NfRFNDUF9DUzYJCTB4YzAKLSMgZGVmaW5lCUlQVE9TX0RTQ1BfQ1M3CQkweGUwCi0jZW5kaWYgLyogSVBUT1NfRFNDUF9DUzAgKi8KLSNpZm5kZWYgSVBUT1NfRFNDUF9FRgotIyBkZWZpbmUJSVBUT1NfRFNDUF9FRgkJMHhiOAotI2VuZGlmIC8qIElQVE9TX0RTQ1BfRUYgKi8KLQotI2lmbmRlZiBNQVhQQVRITEVOCi0jIGlmZGVmIFBBVEhfTUFYCi0jICBkZWZpbmUgTUFYUEFUSExFTiBQQVRIX01BWAotIyBlbHNlIC8qIFBBVEhfTUFYICovCi0jICBkZWZpbmUgTUFYUEFUSExFTiA2NAotLyogcmVhbHBhdGggdXNlcyBhIGZpeGVkIGJ1ZmZlciBvZiBzaXplIE1BWFBBVEhMRU4sIHNvIGZvcmNlIHVzZSBvZiBvdXJzICovCi0jICBpZm5kZWYgQlJPS0VOX1JFQUxQQVRICi0jICAgZGVmaW5lIEJST0tFTl9SRUFMUEFUSCAxCi0jICBlbmRpZiAvKiBCUk9LRU5fUkVBTFBBVEggKi8KLSMgZW5kaWYgLyogUEFUSF9NQVggKi8KLSNlbmRpZiAvKiBNQVhQQVRITEVOICovCi0KLSNpZm5kZWYgUEFUSF9NQVgKLSMgaWZkZWYgX1BPU0lYX1BBVEhfTUFYCi0jIGRlZmluZSBQQVRIX01BWCBfUE9TSVhfUEFUSF9NQVgKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChIQVZFX0RFQ0xfTUFYU1lNTElOS1MpICYmIEhBVkVfREVDTF9NQVhTWU1MSU5LUyA9PSAwCi0jIGRlZmluZSBNQVhTWU1MSU5LUyA1Ci0jZW5kaWYKLQotI2lmbmRlZiBTVERJTl9GSUxFTk8KLSMgZGVmaW5lIFNURElOX0ZJTEVOTyAgICAwCi0jZW5kaWYKLSNpZm5kZWYgU1RET1VUX0ZJTEVOTwotIyBkZWZpbmUgU1RET1VUX0ZJTEVOTyAgIDEKLSNlbmRpZgotI2lmbmRlZiBTVERFUlJfRklMRU5PCi0jIGRlZmluZSBTVERFUlJfRklMRU5PICAgMgotI2VuZGlmCi0KLSNpZm5kZWYgTkdST1VQU19NQVgJLyogRGlzYWJsZSBncm91cGFjY2VzcyBpZiBOR1JPVVBfTUFYIGlzIG5vdCBzZXQgKi8KLSNpZmRlZiBOR1JPVVBTCi0jZGVmaW5lIE5HUk9VUFNfTUFYIE5HUk9VUFMKLSNlbHNlCi0jZGVmaW5lIE5HUk9VUFNfTUFYIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhBVkVfREVDTF9PX05PTkJMT0NLKSAmJiBIQVZFX0RFQ0xfT19OT05CTE9DSyA9PSAwCi0jIGRlZmluZSBPX05PTkJMT0NLICAgICAgMDAwMDQJLyogTm9uIEJsb2NraW5nIE9wZW4gKi8KLSNlbmRpZgotCi0jaWZuZGVmIFNfSUZTT0NLCi0jIGRlZmluZSBTX0lGU09DSyAwCi0jZW5kaWYgLyogU19JRlNPQ0sgKi8KLQotI2lmbmRlZiBTX0lTRElSCi0jIGRlZmluZSBTX0lTRElSKG1vZGUpCSgoKG1vZGUpICYgKF9TX0lGTVQpKSA9PSAoX1NfSUZESVIpKQotI2VuZGlmIC8qIFNfSVNESVIgKi8KLQotI2lmbmRlZiBTX0lTUkVHCi0jIGRlZmluZSBTX0lTUkVHKG1vZGUpCSgoKG1vZGUpICYgKF9TX0lGTVQpKSA9PSAoX1NfSUZSRUcpKQotI2VuZGlmIC8qIFNfSVNSRUcgKi8KLQotI2lmbmRlZiBTX0lTTE5LCi0jIGRlZmluZSBTX0lTTE5LKG1vZGUpCSgoKG1vZGUpICYgU19JRk1UKSA9PSBTX0lGTE5LKQotI2VuZGlmIC8qIFNfSVNMTksgKi8KLQotI2lmbmRlZiBTX0lYVVNSCi0jIGRlZmluZSBTX0lYVVNSCQkJMDAwMDEwMAkvKiBleGVjdXRlL3NlYXJjaCBwZXJtaXNzaW9uLCAqLwotIyBkZWZpbmUgU19JWEdSUAkJCTAwMDAwMTAJLyogZXhlY3V0ZS9zZWFyY2ggcGVybWlzc2lvbiwgKi8KLSMgZGVmaW5lIFNfSVhPVEgJCQkwMDAwMDAxCS8qIGV4ZWN1dGUvc2VhcmNoIHBlcm1pc3Npb24sICovCi0jIGRlZmluZSBfU19JV1VTUgkJCTAwMDAyMDAJLyogd3JpdGUgcGVybWlzc2lvbiwgKi8KLSMgZGVmaW5lIFNfSVdVU1IJCQlfU19JV1VTUgkvKiB3cml0ZSBwZXJtaXNzaW9uLCBvd25lciAqLwotIyBkZWZpbmUgU19JV0dSUAkJCTAwMDAwMjAJLyogd3JpdGUgcGVybWlzc2lvbiwgZ3JvdXAgKi8KLSMgZGVmaW5lIFNfSVdPVEgJCQkwMDAwMDAyCS8qIHdyaXRlIHBlcm1pc3Npb24sIG90aGVyICovCi0jIGRlZmluZSBTX0lSVVNSCQkJMDAwMDQwMAkvKiByZWFkIHBlcm1pc3Npb24sIG93bmVyICovCi0jIGRlZmluZSBTX0lSR1JQCQkJMDAwMDA0MAkvKiByZWFkIHBlcm1pc3Npb24sIGdyb3VwICovCi0jIGRlZmluZSBTX0lST1RICQkJMDAwMDAwNAkvKiByZWFkIHBlcm1pc3Npb24sIG90aGVyICovCi0jIGRlZmluZSBTX0lSV1hVCQkJMDAwMDcwMAkvKiByZWFkLCB3cml0ZSwgZXhlY3V0ZSAqLwotIyBkZWZpbmUgU19JUldYRwkJCTAwMDAwNzAJLyogcmVhZCwgd3JpdGUsIGV4ZWN1dGUgKi8KLSMgZGVmaW5lIFNfSVJXWE8JCQkwMDAwMDA3CS8qIHJlYWQsIHdyaXRlLCBleGVjdXRlICovCi0jZW5kaWYgLyogU19JWFVTUiAqLwotCi0jaWYgIWRlZmluZWQoTUFQX0FOT04pICYmIGRlZmluZWQoTUFQX0FOT05ZTU9VUykKLSNkZWZpbmUgTUFQX0FOT04gTUFQX0FOT05ZTU9VUwotI2VuZGlmCi0KLSNpZm5kZWYgTUFQX0ZBSUxFRAotIyBkZWZpbmUgTUFQX0ZBSUxFRCAoKHZvaWQgKiktMSkKLSNlbmRpZgotCi0vKiAqLSotbnRvLXFueCBkb2Vzbid0IGRlZmluZSB0aGlzIGNvbnN0YW50IGluIHRoZSBzeXN0ZW0gaGVhZGVycyAqLwotI2lmZGVmIE1JU1NJTkdfTkZEQklUUwotIyBkZWZpbmUJTkZEQklUUyAoOCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkKLSNlbmRpZgotCi0vKgotU0NPIE9wZW4gU2VydmVyIDMgaGFzIElOQUREUl9MT09QQkFDSyBkZWZpbmVkIGluIHJwYy9ycGMuaCBidXQKLWluY2x1ZGluZyBycGMvcnBjLmggYnJlYWtzIFNvbGFyaXMgNgotKi8KLSNpZm5kZWYgSU5BRERSX0xPT1BCQUNLCi0jZGVmaW5lIElOQUREUl9MT09QQkFDSyAoKHVfbG9uZykweDdmMDAwMDAxKQotI2VuZGlmCi0KLS8qIFR5cGVzICovCi0KLS8qIElmIHN5cy90eXBlcy5oIGRvZXMgbm90IHN1cHBseSBpbnRYWF90LCBzdXBwbHkgdGhlbSBvdXJzZWx2ZXMgKi8KLS8qIChvciBkaWUgdHJ5aW5nKSAqLwotCi0jaWZuZGVmIEhBVkVfVV9JTlQKLXR5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50OwotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9JTlRYWF9UCi0jIGlmIChTSVpFT0ZfQ0hBUiA9PSAxKQotdHlwZWRlZiBjaGFyIGludDhfdDsKLSMgZWxzZQotIyAgZXJyb3IgIjggYml0IGludCB0eXBlIG5vdCBmb3VuZC4iCi0jIGVuZGlmCi0jIGlmIChTSVpFT0ZfU0hPUlRfSU5UID09IDIpCi10eXBlZGVmIHNob3J0IGludCBpbnQxNl90OwotIyBlbHNlCi0jICBpZmRlZiBfVU5JQ09TCi0jICAgaWYgKFNJWkVPRl9TSE9SVF9JTlQgPT0gNCkKLXR5cGVkZWYgc2hvcnQgaW50MTZfdDsKLSMgICBlbHNlCi10eXBlZGVmIGxvbmcgIGludDE2X3Q7Ci0jICAgZW5kaWYKLSMgIGVsc2UKLSMgICBlcnJvciAiMTYgYml0IGludCB0eXBlIG5vdCBmb3VuZC4iCi0jICBlbmRpZiAvKiBfVU5JQ09TICovCi0jIGVuZGlmCi0jIGlmIChTSVpFT0ZfSU5UID09IDQpCi10eXBlZGVmIGludCBpbnQzMl90OwotIyBlbHNlCi0jICBpZmRlZiBfVU5JQ09TCi10eXBlZGVmIGxvbmcgIGludDMyX3Q7Ci0jICBlbHNlCi0jICAgZXJyb3IgIjMyIGJpdCBpbnQgdHlwZSBub3QgZm91bmQuIgotIyAgZW5kaWYgLyogX1VOSUNPUyAqLwotIyBlbmRpZgotI2VuZGlmCi0KLS8qIElmIHN5cy90eXBlcy5oIGRvZXMgbm90IHN1cHBseSB1X2ludFhYX3QsIHN1cHBseSB0aGVtIG91cnNlbHZlcyAqLwotI2lmbmRlZiBIQVZFX1VfSU5UWFhfVAotIyBpZmRlZiBIQVZFX1VJTlRYWF9UCi10eXBlZGVmIHVpbnQ4X3QgdV9pbnQ4X3Q7Ci10eXBlZGVmIHVpbnQxNl90IHVfaW50MTZfdDsKLXR5cGVkZWYgdWludDMyX3QgdV9pbnQzMl90OwotIyBkZWZpbmUgSEFWRV9VX0lOVFhYX1QgMQotIyBlbHNlCi0jICBpZiAoU0laRU9GX0NIQVIgPT0gMSkKLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1X2ludDhfdDsKLSMgIGVsc2UKLSMgICBlcnJvciAiOCBiaXQgaW50IHR5cGUgbm90IGZvdW5kLiIKLSMgIGVuZGlmCi0jICBpZiAoU0laRU9GX1NIT1JUX0lOVCA9PSAyKQotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgdV9pbnQxNl90OwotIyAgZWxzZQotIyAgIGlmZGVmIF9VTklDT1MKLSMgICAgaWYgKFNJWkVPRl9TSE9SVF9JTlQgPT0gNCkKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdV9pbnQxNl90OwotIyAgICBlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVfaW50MTZfdDsKLSMgICAgZW5kaWYKLSMgICBlbHNlCi0jICAgIGVycm9yICIxNiBiaXQgaW50IHR5cGUgbm90IGZvdW5kLiIKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgIGlmIChTSVpFT0ZfSU5UID09IDQpCi10eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDMyX3Q7Ci0jICBlbHNlCi0jICAgaWZkZWYgX1VOSUNPUwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICB1X2ludDMyX3Q7Ci0jICAgZWxzZQotIyAgICBlcnJvciAiMzIgYml0IGludCB0eXBlIG5vdCBmb3VuZC4iCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZGVmaW5lIF9fQklUX1RZUEVTX0RFRklORURfXwotI2VuZGlmCi0KLS8qIDY0LWJpdCB0eXBlcyAqLwotI2lmbmRlZiBIQVZFX0lOVDY0X1QKLSMgaWYgKFNJWkVPRl9MT05HX0lOVCA9PSA4KQotdHlwZWRlZiBsb25nIGludCBpbnQ2NF90OwotIyBlbHNlCi0jICBpZiAoU0laRU9GX0xPTkdfTE9OR19JTlQgPT0gOCkKLXR5cGVkZWYgbG9uZyBsb25nIGludCBpbnQ2NF90OwotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBIQVZFX1VfSU5UNjRfVAotIyBpZiAoU0laRU9GX0xPTkdfSU5UID09IDgpCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHVfaW50NjRfdDsKLSMgZWxzZQotIyAgaWYgKFNJWkVPRl9MT05HX0xPTkdfSU5UID09IDgpCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgdV9pbnQ2NF90OwotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfVV9DSEFSCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgdV9jaGFyOwotIyBkZWZpbmUgSEFWRV9VX0NIQVIKLSNlbmRpZiAvKiBIQVZFX1VfQ0hBUiAqLwotCi0jaWZuZGVmIFNJWkVfVF9NQVgKLSNkZWZpbmUgU0laRV9UX01BWCBVTE9OR19NQVgKLSNlbmRpZiAvKiBTSVpFX1RfTUFYICovCi0KLSNpZm5kZWYgSEFWRV9TSVpFX1QKLXR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKLSMgZGVmaW5lIEhBVkVfU0laRV9UCi0jIGRlZmluZSBTSVpFX1RfTUFYIFVJTlRfTUFYCi0jZW5kaWYgLyogSEFWRV9TSVpFX1QgKi8KLQotI2lmbmRlZiBTSVpFX01BWAotI2RlZmluZSBTSVpFX01BWCBTSVpFX1RfTUFYCi0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NTSVpFX1QKLXR5cGVkZWYgaW50IHNzaXplX3Q7Ci0jIGRlZmluZSBIQVZFX1NTSVpFX1QKLSNlbmRpZiAvKiBIQVZFX1NTSVpFX1QgKi8KLQotI2lmbmRlZiBIQVZFX0NMT0NLX1QKLXR5cGVkZWYgbG9uZyBjbG9ja190OwotIyBkZWZpbmUgSEFWRV9DTE9DS19UCi0jZW5kaWYgLyogSEFWRV9DTE9DS19UICovCi0KLSNpZm5kZWYgSEFWRV9TQV9GQU1JTFlfVAotdHlwZWRlZiBpbnQgc2FfZmFtaWx5X3Q7Ci0jIGRlZmluZSBIQVZFX1NBX0ZBTUlMWV9UCi0jZW5kaWYgLyogSEFWRV9TQV9GQU1JTFlfVCAqLwotCi0jaWZuZGVmIEhBVkVfUElEX1QKLXR5cGVkZWYgaW50IHBpZF90OwotIyBkZWZpbmUgSEFWRV9QSURfVAotI2VuZGlmIC8qIEhBVkVfUElEX1QgKi8KLQotI2lmbmRlZiBIQVZFX1NJR19BVE9NSUNfVAotdHlwZWRlZiBpbnQgc2lnX2F0b21pY190OwotIyBkZWZpbmUgSEFWRV9TSUdfQVRPTUlDX1QKLSNlbmRpZiAvKiBIQVZFX1NJR19BVE9NSUNfVCAqLwotCi0jaWZuZGVmIEhBVkVfTU9ERV9UCi10eXBlZGVmIGludCBtb2RlX3Q7Ci0jIGRlZmluZSBIQVZFX01PREVfVAotI2VuZGlmIC8qIEhBVkVfTU9ERV9UICovCi0KLSNpZiAhZGVmaW5lZChIQVZFX1NTX0ZBTUlMWV9JTl9TUykgJiYgZGVmaW5lZChIQVZFX19fU1NfRkFNSUxZX0lOX1NTKQotIyBkZWZpbmUgc3NfZmFtaWx5IF9fc3NfZmFtaWx5Ci0jZW5kaWYgLyogIWRlZmluZWQoSEFWRV9TU19GQU1JTFlfSU5fU1MpICYmIGRlZmluZWQoSEFWRV9TQV9GQU1JTFlfSU5fU1MpICovCi0KLSNpZm5kZWYgSEFWRV9TWVNfVU5fSAotc3RydWN0CXNvY2thZGRyX3VuIHsKLQlzaG9ydAlzdW5fZmFtaWx5OwkJLyogQUZfVU5JWCAqLwotCWNoYXIJc3VuX3BhdGhbMTA4XTsJCS8qIHBhdGggbmFtZSAoZ2FnKSAqLwotfTsKLSNlbmRpZiAvKiBIQVZFX1NZU19VTl9IICovCi0KLSNpZm5kZWYgSEFWRV9JTl9BRERSX1QKLXR5cGVkZWYgdV9pbnQzMl90CWluX2FkZHJfdDsKLSNlbmRpZgotI2lmbmRlZiBIQVZFX0lOX1BPUlRfVAotdHlwZWRlZiB1X2ludDE2X3QJaW5fcG9ydF90OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEJST0tFTl9TWVNfVEVSTUlPX0gpICYmICFkZWZpbmVkKF9TVFJVQ1RfV0lOU0laRSkKLSNkZWZpbmUgX1NUUlVDVF9XSU5TSVpFCi1zdHJ1Y3Qgd2luc2l6ZSB7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCB3c19yb3c7ICAgICAgICAgIC8qIHJvd3MsIGluIGNoYXJhY3RlcnMgKi8KLSAgICAgIHVuc2lnbmVkIHNob3J0IHdzX2NvbDsgICAgICAgICAgLyogY29sdW1ucywgaW4gY2hhcmFjdGVyICovCi0gICAgICB1bnNpZ25lZCBzaG9ydCB3c194cGl4ZWw7ICAgICAgIC8qIGhvcml6b250YWwgc2l6ZSwgcGl4ZWxzICovCi0gICAgICB1bnNpZ25lZCBzaG9ydCB3c195cGl4ZWw7ICAgICAgIC8qIHZlcnRpY2FsIHNpemUsIHBpeGVscyAqLwotfTsKLSNlbmRpZgotCi0vKiAqLSotbnRvLXFueCBkb2VzIG5vdCBkZWZpbmUgdGhpcyB0eXBlIGluIHRoZSBzeXN0ZW0gaGVhZGVycyAqLwotI2lmZGVmIE1JU1NJTkdfRkRfTUFTSwotIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJZmRfbWFzazsKLSNlbmRpZgotCi0vKiBQYXRocyAqLwotCi0jaWZuZGVmIF9QQVRIX0JTSEVMTAotIyBkZWZpbmUgX1BBVEhfQlNIRUxMICIvYmluL3NoIgotI2VuZGlmCi0KLSNpZmRlZiBVU0VSX1BBVEgKLSMgaWZkZWYgX1BBVEhfU1REUEFUSAotIyAgdW5kZWYgX1BBVEhfU1REUEFUSAotIyBlbmRpZgotIyBkZWZpbmUgX1BBVEhfU1REUEFUSCBVU0VSX1BBVEgKLSNlbmRpZgotCi0jaWZuZGVmIF9QQVRIX1NURFBBVEgKLSMgZGVmaW5lIF9QQVRIX1NURFBBVEggIi91c3IvYmluOi9iaW46L3Vzci9zYmluOi9zYmluIgotI2VuZGlmCi0KLSNpZm5kZWYgU1VQRVJVU0VSX1BBVEgKLSMgZGVmaW5lIFNVUEVSVVNFUl9QQVRICV9QQVRIX1NURFBBVEgKLSNlbmRpZgotCi0jaWZuZGVmIF9QQVRIX0RFVk5VTEwKLSMgZGVmaW5lIF9QQVRIX0RFVk5VTEwgIi9kZXYvbnVsbCIKLSNlbmRpZgotCi0vKiB1c2VyIG1heSBoYXZlIHNldCBhIGRpZmZlcmVudCBwYXRoICovCi0jaWYgZGVmaW5lZChfUEFUSF9NQUlMRElSKSAmJiBkZWZpbmVkKE1BSUxfRElSRUNUT1JZKQotIyB1bmRlZiBfUEFUSF9NQUlMRElSIE1BSUxESVIKLSNlbmRpZiAvKiBkZWZpbmVkKF9QQVRIX01BSUxESVIpICYmIGRlZmluZWQoTUFJTF9ESVJFQ1RPUlkpICovCi0KLSNpZmRlZiBNQUlMX0RJUkVDVE9SWQotIyBkZWZpbmUgX1BBVEhfTUFJTERJUiBNQUlMX0RJUkVDVE9SWQotI2VuZGlmCi0KLSNpZm5kZWYgX1BBVEhfTk9MT0dJTgotIyBkZWZpbmUgX1BBVEhfTk9MT0dJTiAiL2V0Yy9ub2xvZ2luIgotI2VuZGlmCi0KLS8qIERlZmluZSB0aGlzIHRvIGJlIHRoZSBwYXRoIG9mIHRoZSB4YXV0aCBwcm9ncmFtLiAqLwotI2lmZGVmIFhBVVRIX1BBVEgKLSNkZWZpbmUgX1BBVEhfWEFVVEggWEFVVEhfUEFUSAotI2VuZGlmIC8qIFhBVVRIX1BBVEggKi8KLQotLyogZGVyaXZlZCBmcm9tIFhGNC94Yy9saWIvZHBzL1hsaWJuZXQuaCAqLwotI2lmbmRlZiBYX1VOSVhfUEFUSAotIyAgaWZkZWYgX19ocHV4Ci0jICAgIGRlZmluZSBYX1VOSVhfUEFUSCAiL3Zhci9zcG9vbC9zb2NrZXRzL1gxMS8ldSIKLSMgIGVsc2UKLSMgICAgZGVmaW5lIFhfVU5JWF9QQVRIICIvdG1wLy5YMTEtdW5peC9YJXUiCi0jICBlbmRpZgotI2VuZGlmIC8qIFhfVU5JWF9QQVRIICovCi0jZGVmaW5lIF9QQVRIX1VOSVhfWCBYX1VOSVhfUEFUSAotCi0jaWZuZGVmIF9QQVRIX1RUWQotIyBkZWZpbmUgX1BBVEhfVFRZICIvZGV2L3R0eSIKLSNlbmRpZgotCi0vKiBNYWNyb3MgKi8KLQotI2lmIGRlZmluZWQoSEFWRV9MT0dJTl9HRVRDQVBCT09MKSAmJiBkZWZpbmVkKEhBVkVfTE9HSU5fQ0FQX0gpCi0jIGRlZmluZSBIQVZFX0xPR0lOX0NBUAotI2VuZGlmCi0KLSNpZm5kZWYgTUFYCi0jIGRlZmluZSBNQVgoYSxiKSAoKChhKT4oYikpPyhhKTooYikpCi0jIGRlZmluZSBNSU4oYSxiKSAoKChhKTwoYikpPyhhKTooYikpCi0jZW5kaWYKLQotI2lmbmRlZiByb3VuZHVwCi0jIGRlZmluZSByb3VuZHVwKHgsIHkpICAgKCgoKHgpKygoeSktMSkpLyh5KSkqKHkpKQotI2VuZGlmCi0KLSNpZm5kZWYgdGltZXJzdWIKLSNkZWZpbmUgdGltZXJzdWIoYSwgYiwgcmVzdWx0KQkJCQkJXAotICAgZG8gewkJCQkJCQkJXAotICAgICAgKHJlc3VsdCktPnR2X3NlYyA9IChhKS0+dHZfc2VjIC0gKGIpLT50dl9zZWM7CQlcCi0gICAgICAocmVzdWx0KS0+dHZfdXNlYyA9IChhKS0+dHZfdXNlYyAtIChiKS0+dHZfdXNlYzsJCVwKLSAgICAgIGlmICgocmVzdWx0KS0+dHZfdXNlYyA8IDApIHsJCQkJXAotCSAtLShyZXN1bHQpLT50dl9zZWM7CQkJCQlcCi0JIChyZXN1bHQpLT50dl91c2VjICs9IDEwMDAwMDA7CQkJCVwKLSAgICAgIH0JCQkJCQkJCVwKLSAgIH0gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmbmRlZiBUSU1FVkFMX1RPX1RJTUVTUEVDCi0jZGVmaW5lCVRJTUVWQUxfVE9fVElNRVNQRUModHYsIHRzKSB7CQkJCQlcCi0JKHRzKS0+dHZfc2VjID0gKHR2KS0+dHZfc2VjOwkJCQkJXAotCSh0cyktPnR2X25zZWMgPSAodHYpLT50dl91c2VjICogMTAwMDsJCQkJXAotfQotI2VuZGlmCi0KLSNpZm5kZWYgVElNRVNQRUNfVE9fVElNRVZBTAotI2RlZmluZQlUSU1FU1BFQ19UT19USU1FVkFMKHR2LCB0cykgewkJCQkJXAotCSh0diktPnR2X3NlYyA9ICh0cyktPnR2X3NlYzsJCQkJCVwKLQkodHYpLT50dl91c2VjID0gKHRzKS0+dHZfbnNlYyAvIDEwMDA7CQkJCVwKLX0KLSNlbmRpZgotCi0jaWZuZGVmIF9fUAotIyBkZWZpbmUgX19QKHgpIHgKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSU42X0lTX0FERFJfVjRNQVBQRUQpCi0jIGRlZmluZSBJTjZfSVNfQUREUl9WNE1BUFBFRChhKSBcCi0JKCgoKHVfaW50MzJfdCAqKSAoYSkpWzBdID09IDApICYmICgoKHVfaW50MzJfdCAqKSAoYSkpWzFdID09IDApICYmIFwKLQkgKCgodV9pbnQzMl90ICopIChhKSlbMl0gPT0gaHRvbmwgKDB4ZmZmZikpKQotI2VuZGlmIC8qICFkZWZpbmVkKElONl9JU19BRERSX1Y0TUFQUEVEKSAqLwotCi0jaWYgIWRlZmluZWQoX19HTlVDX18pIHx8IChfX0dOVUNfXyA8IDIpCi0jIGRlZmluZSBfX2F0dHJpYnV0ZV9fKHgpCi0jZW5kaWYgLyogIWRlZmluZWQoX19HTlVDX18pIHx8IChfX0dOVUNfXyA8IDIpICovCi0KLSNpZiAhZGVmaW5lZChIQVZFX0FUVFJJQlVURV9fU0VOVElORUxfXykgJiYgIWRlZmluZWQoX19zZW50aW5lbF9fKQotIyBkZWZpbmUgX19zZW50aW5lbF9fCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEhBVkVfQVRUUklCVVRFX19CT1VOREVEX18pICYmICFkZWZpbmVkKF9fYm91bmRlZF9fKQotIyBkZWZpbmUgX19ib3VuZGVkX18oeCwgeSwgeikKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSEFWRV9BVFRSSUJVVEVfX05PTk5VTExfXykgJiYgIWRlZmluZWQoX19ub25udWxsX18pCi0jIGRlZmluZSBfX25vbm51bGxfXyh4KQotI2VuZGlmCi0KLS8qICotKi1udG8tcW54IGRvZXNuJ3QgZGVmaW5lIHRoaXMgbWFjcm8gaW4gdGhlIHN5c3RlbSBoZWFkZXJzICovCi0jaWZkZWYgTUlTU0lOR19IT1dNQU5ZCi0jIGRlZmluZSBob3dtYW55KHgseSkJKCgoeCkrKCh5KS0xKSkvKHkpKQotI2VuZGlmCi0KLSNpZm5kZWYgT1NTSF9BTElHTkJZVEVTCi0jZGVmaW5lIE9TU0hfQUxJR05CWVRFUwkoc2l6ZW9mKGludCkgLSAxKQotI2VuZGlmCi0jaWZuZGVmIF9fQ01TR19BTElHTgotI2RlZmluZQlfX0NNU0dfQUxJR04ocCkgKCgodV9pbnQpKHApICsgT1NTSF9BTElHTkJZVEVTKSAmfiBPU1NIX0FMSUdOQllURVMpCi0jZW5kaWYKLQotLyogTGVuZ3RoIG9mIHRoZSBjb250ZW50cyBvZiBhIGNvbnRyb2wgbWVzc2FnZSBvZiBsZW5ndGggbGVuICovCi0jaWZuZGVmIENNU0dfTEVOCi0jZGVmaW5lCUNNU0dfTEVOKGxlbikJKF9fQ01TR19BTElHTihzaXplb2Yoc3RydWN0IGNtc2doZHIpKSArIChsZW4pKQotI2VuZGlmCi0KLS8qIExlbmd0aCBvZiB0aGUgc3BhY2UgdGFrZW4gdXAgYnkgYSBwYWRkZWQgY29udHJvbCBtZXNzYWdlIG9mIGxlbmd0aCBsZW4gKi8KLSNpZm5kZWYgQ01TR19TUEFDRQotI2RlZmluZQlDTVNHX1NQQUNFKGxlbikJKF9fQ01TR19BTElHTihzaXplb2Yoc3RydWN0IGNtc2doZHIpKSArIF9fQ01TR19BTElHTihsZW4pKQotI2VuZGlmCi0KLS8qIGdpdmVuIHBvaW50ZXIgdG8gc3RydWN0IGNtc2doZHIsIHJldHVybiBwb2ludGVyIHRvIGRhdGEgKi8KLSNpZm5kZWYgQ01TR19EQVRBCi0jZGVmaW5lIENNU0dfREFUQShjbXNnKSAoKHVfY2hhciAqKShjbXNnKSArIF9fQ01TR19BTElHTihzaXplb2Yoc3RydWN0IGNtc2doZHIpKSkKLSNlbmRpZiAvKiBDTVNHX0RBVEEgKi8KLQotLyoKLSAqIFJGQyAyMjkyIHJlcXVpcmVzIHRvIGNoZWNrIG1zZ19jb250cm9sbGVuLCBpbiBjYXNlIHRoYXQgdGhlIGtlcm5lbCByZXR1cm5zCi0gKiBhbiBlbXB0eSBsaXN0IGZvciBzb21lIHJlYXNvbnMuCi0gKi8KLSNpZm5kZWYgQ01TR19GSVJTVEhEUgotI2RlZmluZSBDTVNHX0ZJUlNUSERSKG1oZHIpIFwKLQkoKG1oZHIpLT5tc2dfY29udHJvbGxlbiA+PSBzaXplb2Yoc3RydWN0IGNtc2doZHIpID8gXAotCSAoc3RydWN0IGNtc2doZHIgKikobWhkciktPm1zZ19jb250cm9sIDogXAotCSAoc3RydWN0IGNtc2doZHIgKilOVUxMKQotI2VuZGlmIC8qIENNU0dfRklSU1RIRFIgKi8KLQotI2lmIGRlZmluZWQoSEFWRV9ERUNMX09GRlNFVE9GKSAmJiBIQVZFX0RFQ0xfT0ZGU0VUT0YgPT0gMAotIyBkZWZpbmUgb2Zmc2V0b2YodHlwZSwgbWVtYmVyKSAoKHNpemVfdCkgJigodHlwZSAqKTApLT5tZW1iZXIpCi0jZW5kaWYKLQotLyogU2V0IHVwIEJTRC1zdHlsZSBCWVRFX09SREVSIGRlZmluaXRpb24gaWYgaXQgaXNuJ3QgdGhlcmUgYWxyZWFkeSAqLwotLyogWFhYOiBkb2Vzbid0IHRyeSB0byBjb3BlIHdpdGggc3RyYW5nZSBieXRlIG9yZGVycyAoUERQX0VORElBTikgKi8KLSNpZm5kZWYgQllURV9PUkRFUgotIyBpZm5kZWYgTElUVExFX0VORElBTgotIyAgZGVmaW5lIExJVFRMRV9FTkRJQU4gIDEyMzQKLSMgZW5kaWYgLyogTElUVExFX0VORElBTiAqLwotIyBpZm5kZWYgQklHX0VORElBTgotIyAgZGVmaW5lIEJJR19FTkRJQU4gICAgIDQzMjEKLSMgZW5kaWYgLyogQklHX0VORElBTiAqLwotIyBpZmRlZiBXT1JEU19CSUdFTkRJQU4KLSMgIGRlZmluZSBCWVRFX09SREVSIEJJR19FTkRJQU4KLSMgZWxzZSAvKiBXT1JEU19CSUdFTkRJQU4gKi8KLSMgIGRlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KLSMgZW5kaWYgLyogV09SRFNfQklHRU5ESUFOICovCi0jZW5kaWYgLyogQllURV9PUkRFUiAqLwotCi0vKiBGdW5jdGlvbiByZXBsYWNlbWVudCAvIGNvbXBhdGliaWxpdHkgaGFja3MgKi8KLQotI2lmICFkZWZpbmVkKEhBVkVfR0VUQUREUklORk8pICYmIChkZWZpbmVkKEhBVkVfT0dFVEFERFJJTkZPKSB8fCBkZWZpbmVkKEhBVkVfTkdFVEFERFJJTkZPKSkKLSMgZGVmaW5lIEhBVkVfR0VUQUREUklORk8KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfR0VUT1BUX09QVFJFU0VUCi0jIHVuZGVmIGdldG9wdAotIyB1bmRlZiBvcHRlcnIKLSMgdW5kZWYgb3B0aW5kCi0jIHVuZGVmIG9wdG9wdAotIyB1bmRlZiBvcHRyZXNldAotIyB1bmRlZiBvcHRhcmcKLSMgZGVmaW5lIGdldG9wdChhYywgYXYsIG8pICBCU0RnZXRvcHQoYWMsIGF2LCBvKQotIyBkZWZpbmUgb3B0ZXJyICAgICAgICAgICAgIEJTRG9wdGVycgotIyBkZWZpbmUgb3B0aW5kICAgICAgICAgICAgIEJTRG9wdGluZAotIyBkZWZpbmUgb3B0b3B0ICAgICAgICAgICAgIEJTRG9wdG9wdAotIyBkZWZpbmUgb3B0cmVzZXQgICAgICAgICAgIEJTRG9wdHJlc2V0Ci0jIGRlZmluZSBvcHRhcmcgICAgICAgICAgICAgQlNEb3B0YXJnCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQlJPS0VOX0dFVEFERFJJTkZPKSAmJiBkZWZpbmVkKEhBVkVfR0VUQUREUklORk8pCi0jIHVuZGVmIEhBVkVfR0VUQUREUklORk8KLSNlbmRpZgotI2lmIGRlZmluZWQoQlJPS0VOX0dFVEFERFJJTkZPKSAmJiBkZWZpbmVkKEhBVkVfRlJFRUFERFJJTkZPKQotIyB1bmRlZiBIQVZFX0ZSRUVBRERSSU5GTwotI2VuZGlmCi0jaWYgZGVmaW5lZChCUk9LRU5fR0VUQUREUklORk8pICYmIGRlZmluZWQoSEFWRV9HQUlfU1RSRVJST1IpCi0jIHVuZGVmIEhBVkVfR0FJX1NUUkVSUk9SCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQlJPS0VOX1VQRFdUTVBYKSAmJiBkZWZpbmVkKEhBVkVfVVBEV1RNUFgpCi0jIHVuZGVmIEhBVkVfVVBEV1RNUFgKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChCUk9LRU5fU0hBRE9XX0VYUElSRSkgJiYgZGVmaW5lZChIQVNfU0hBRE9XX0VYUElSRSkKLSMgdW5kZWYgSEFTX1NIQURPV19FWFBJUkUKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChIQVZFX09QRU5MT0dfUikgJiYgZGVmaW5lZChTWVNMT0dfREFUQV9JTklUKSAmJiBcCi0gICAgZGVmaW5lZChTWVNMT0dfUl9TQUZFX0lOX1NJR0hBTkQpCi0jIGRlZmluZSBET19MT0dfU0FGRV9JTl9TSUdIQU5ECi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEhBVkVfTUVNTU9WRSkgJiYgZGVmaW5lZChIQVZFX0JDT1BZKQotIyBkZWZpbmUgbWVtbW92ZShzMSwgczIsIG4pIGJjb3B5KChzMiksIChzMSksIChuKSkKLSNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX01FTU1PVkUpICYmIGRlZmluZWQoSEFWRV9CQ09QWSkgKi8KLQotI2lmIGRlZmluZWQoSEFWRV9WSEFOR1VQKSAmJiAhZGVmaW5lZChIQVZFX0RFVl9QVE1YKQotIyAgZGVmaW5lIFVTRV9WSEFOR1VQCi0jZW5kaWYgLyogZGVmaW5lZChIQVZFX1ZIQU5HVVApICYmICFkZWZpbmVkKEhBVkVfREVWX1BUTVgpICovCi0KLSNpZm5kZWYgR0VUUEdSUF9WT0lECi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBkZWZpbmUgZ2V0cGdycCgpIGdldHBncnAoMCkKLSNlbmRpZgotCi0jaWZkZWYgVVNFX0JTTV9BVURJVAotIyBkZWZpbmUgU1NIX0FVRElUX0VWRU5UUwotIyBkZWZpbmUgQ1VTVE9NX1NTSF9BVURJVF9FVkVOVFMKLSNlbmRpZgotCi0jaWZkZWYgVVNFX0xJTlVYX0FVRElUCi0jIGRlZmluZSBTU0hfQVVESVRfRVZFTlRTCi0jIGRlZmluZSBDVVNUT01fU1NIX0FVRElUX0VWRU5UUwotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChIQVZFX19fZnVuY19fKSAmJiBkZWZpbmVkKEhBVkVfX19GVU5DVElPTl9fKQotIyAgZGVmaW5lIF9fZnVuY19fIF9fRlVOQ1RJT05fXwotI2VsaWYgIWRlZmluZWQoSEFWRV9fX2Z1bmNfXykKLSMgIGRlZmluZSBfX2Z1bmNfXyAiIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEtSQjUpICYmICFkZWZpbmVkKEhFSU1EQUwpCi0jICBkZWZpbmUga3JiNV9nZXRfZXJyX3RleHQoY29udGV4dCxjb2RlKSBlcnJvcl9tZXNzYWdlKGNvZGUpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoU0tFWUNIQUxMRU5HRV80QVJHKQotIyBkZWZpbmUgX2NvbXBhdF9za2V5Y2hhbGxlbmdlKGEsYixjLGQpIHNrZXljaGFsbGVuZ2UoYSxiLGMsZCkKLSNlbHNlCi0jIGRlZmluZSBfY29tcGF0X3NrZXljaGFsbGVuZ2UoYSxiLGMsZCkgc2tleWNoYWxsZW5nZShhLGIsYykKLSNlbmRpZgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZSAqLwotI2lmZGVmIEhBVkVfU1lTQ09ORgotIyBkZWZpbmUgU1NIX1NZU0ZETUFYIHN5c2NvbmYoX1NDX09QRU5fTUFYKQotI2Vsc2UKLSMgZGVmaW5lIFNTSF9TWVNGRE1BWCAxMDAwMAotI2VuZGlmCi0KLSNpZmRlZiBGU0lEX0hBU19WQUwKLS8qIGVuY29kZSBmX2ZzaWQgaW50byBhIDY0IGJpdCB2YWx1ZSAgKi8KLSNkZWZpbmUgRlNJRF9UT19VTE9ORyhmKSBcCi0JKCgoKHVfaW50NjRfdCkoZikudmFsWzBdICYgMHhmZmZmZmZmZlVMKSA8PCAzMikgfCBcCi0JICAgICgoZikudmFsWzFdICYgMHhmZmZmZmZmZlVMKSkKLSNlbGlmIGRlZmluZWQoRlNJRF9IQVNfX19WQUwpCi0jZGVmaW5lIEZTSURfVE9fVUxPTkcoZikgXAotCSgoKCh1X2ludDY0X3QpKGYpLl9fdmFsWzBdICYgMHhmZmZmZmZmZlVMKSA8PCAzMikgfCBcCi0JICAgICgoZikuX192YWxbMV0gJiAweGZmZmZmZmZmVUwpKQotI2Vsc2UKLSMgZGVmaW5lIEZTSURfVE9fVUxPTkcoZikgKChmKSkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0x5bnhfXykKLSAvKgotICAqIEx5bnhPUyBkZWZpbmVzIHRoZXNlIGluIHBhcmFtLmggd2hpY2ggd2UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSBzaW5jZQotICAqIGl0IHdpbGwgYWxzbyBwdWxsIGluIGEgYnVuY2ggb2Yga2VybmVsIGRlZmluaXRpb25zLgotICAqLwotIyBkZWZpbmUgQUxJR05CWVRFUyAoc2l6ZW9mKGludCkgLSAxKQotIyBkZWZpbmUgQUxJR04ocCkgKCgodW5zaWduZWQpcCArIEFMSUdOQllURVMpICYgfkFMSUdOQllURVMpCi0gIC8qIE1pc3NpbmcgcHJvdG90eXBlcyBvbiBMeW54T1MgKi8KLSAgaW50IHNucHJpbnRmIChjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOwotICBpbnQgbWtzdGVtcCAoY2hhciAqKTsKLSAgY2hhciAqY3J5cHQgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLSAgaW50IHNldGV1aWQgKHVpZF90KTsKLSAgaW50IHNldGVnaWQgKGdpZF90KTsKLSAgY2hhciAqbWtkdGVtcCAoY2hhciAqKTsKLSAgaW50IHJyZXN2cG9ydF9hZiAoaW50ICosIHNhX2ZhbWlseV90KTsKLSAgaW50IGlubmV0Z3IgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLQotLyoKLSAqIERlZmluZSB0aGlzIHRvIHVzZSBwaXBlcyBpbnN0ZWFkIG9mIHNvY2tldHBhaXJzIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlCi0gKiBjbGllbnQgcHJvZ3JhbS4gIFNvY2tldHBhaXJzIGRvIG5vdCBzZWVtIHRvIHdvcmsgb24gYWxsIHN5c3RlbXMuCi0gKgotICogY29uZmlndXJlLmFjIHNldHMgdGhpcyBmb3IgYSBmZXcgT1MncyB3aGljaCBhcmUga25vd24gdG8gaGF2ZSBwcm9ibGVtcwotICogYnV0IHlvdSBtYXkgbmVlZCB0byBzZXQgaXQgeW91cnNlbGYKLSAqLwotLyogI2RlZmluZSBVU0VfUElQRVMgMSAqLwotCi0vKioKLSAqKiBsb2dpbiByZWNvcmRlciBkZWZpbml0aW9ucwotICoqLwotCi0vKiBGSVhNRTogcHV0IGRlZmF1bHQgcGF0aHMgYmFjayBpbiAqLwotI2lmbmRlZiBVVE1QX0ZJTEUKLSMgIGlmZGVmIF9QQVRIX1VUTVAKLSMgICAgZGVmaW5lIFVUTVBfRklMRSBfUEFUSF9VVE1QCi0jICBlbHNlCi0jICAgIGlmZGVmIENPTkZfVVRNUF9GSUxFCi0jICAgICAgZGVmaW5lIFVUTVBfRklMRSBDT05GX1VUTVBfRklMRQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBXVE1QX0ZJTEUKLSMgIGlmZGVmIF9QQVRIX1dUTVAKLSMgICAgZGVmaW5lIFdUTVBfRklMRSBfUEFUSF9XVE1QCi0jICBlbHNlCi0jICAgIGlmZGVmIENPTkZfV1RNUF9GSUxFCi0jICAgICAgZGVmaW5lIFdUTVBfRklMRSBDT05GX1dUTVBfRklMRQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotLyogcGljayB1cCB0aGUgdXNlcidzIGxvY2F0aW9uIGZvciBsYXN0bG9nIGlmIGdpdmVuICovCi0jaWZuZGVmIExBU1RMT0dfRklMRQotIyAgaWZkZWYgX1BBVEhfTEFTVExPRwotIyAgICBkZWZpbmUgTEFTVExPR19GSUxFIF9QQVRIX0xBU1RMT0cKLSMgIGVsc2UKLSMgICAgaWZkZWYgQ09ORl9MQVNUTE9HX0ZJTEUKLSMgICAgICBkZWZpbmUgTEFTVExPR19GSUxFIENPTkZfTEFTVExPR19GSUxFCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhBVkVfU0hBRE9XX0gpICYmICFkZWZpbmVkKERJU0FCTEVfU0hBRE9XKQotIyBkZWZpbmUgVVNFX1NIQURPVwotI2VuZGlmCi0KLS8qIFRoZSBsb2dpbigpIGxpYnJhcnkgZnVuY3Rpb24gaW4gbGlidXRpbCBpcyBmaXJzdCBjaG9pY2UgKi8KLSNpZiBkZWZpbmVkKEhBVkVfTE9HSU4pICYmICFkZWZpbmVkKERJU0FCTEVfTE9HSU4pCi0jICBkZWZpbmUgVVNFX0xPR0lOCi0KLSNlbHNlCi0vKiBTaW1wbHkgc2VsZWN0IHlvdXIgZmF2b3VyaXRlIGxvZ2luIHR5cGVzLiAqLwotLyogQ2FuJ3QgZG8gaWYtZWxzZSBiZWNhdXNlIHNvbWUgc3lzdGVtcyB1c2Ugc2V2ZXJhbC4uLiA8c2lnaD4gKi8KLSMgIGlmICFkZWZpbmVkKERJU0FCTEVfVVRNUFgpCi0jICAgIGRlZmluZSBVU0VfVVRNUFgKLSMgIGVuZGlmCi0jICBpZiBkZWZpbmVkKFVUTVBfRklMRSkgJiYgIWRlZmluZWQoRElTQUJMRV9VVE1QKQotIyAgICBkZWZpbmUgVVNFX1VUTVAKLSMgIGVuZGlmCi0jICBpZiBkZWZpbmVkKFdUTVBYX0ZJTEUpICYmICFkZWZpbmVkKERJU0FCTEVfV1RNUFgpCi0jICAgIGRlZmluZSBVU0VfV1RNUFgKLSMgIGVuZGlmCi0jICBpZiBkZWZpbmVkKFdUTVBfRklMRSkgJiYgIWRlZmluZWQoRElTQUJMRV9XVE1QKQotIyAgICBkZWZpbmUgVVNFX1dUTVAKLSMgIGVuZGlmCi0KLSNlbmRpZgotCi0jaWZuZGVmIFVUX0xJTkVTSVpFCi0jIGRlZmluZSBVVF9MSU5FU0laRSA4Ci0jZW5kaWYKLQotLyogSSBob3BlIHRoYXQgdGhlIHByZXNlbmNlIG9mIExBU1RMT0dfRklMRSBpcyBlbm91Z2ggdG8gZGV0ZWN0IHRoaXMgKi8KLSNpZiBkZWZpbmVkKExBU1RMT0dfRklMRSkgJiYgIWRlZmluZWQoRElTQUJMRV9MQVNUTE9HKQotIyAgZGVmaW5lIFVTRV9MQVNUTE9HCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfT1NGX1NJQQotIyBpZmRlZiBVU0VfU0hBRE9XCi0jICB1bmRlZiBVU0VfU0hBRE9XCi0jIGVuZGlmCi0jIGRlZmluZSBDVVNUT01fU1lTX0FVVEhfUEFTU1dEIDEKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChIQVZFX0xJQklBRikgJiYgZGVmaW5lZChIQVZFX1NFVF9JRCkgJiYgIWRlZmluZWQoSEFWRV9TRUNVUkVXQVJFKQotIyBkZWZpbmUgQ1VTVE9NX1NZU19BVVRIX1BBU1NXRCAxCi0jZW5kaWYKLSNpZiBkZWZpbmVkKEhBVkVfTElCSUFGKSAmJiBkZWZpbmVkKEhBVkVfU0VUX0lEKSAmJiAhZGVmaW5lZChCUk9LRU5fTElCSUFGKQotIyBkZWZpbmUgVVNFX0xJQklBRgotI2VuZGlmCi0KLS8qIEhQLVVYIDExLjExICovCi0jaWZkZWYgQlRNUF9GSUxFCi0jIGRlZmluZSBfUEFUSF9CVE1QIEJUTVBfRklMRQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFVTRV9CVE1QKSAmJiBkZWZpbmVkKF9QQVRIX0JUTVApCi0jIGRlZmluZSBDVVNUT01fRkFJTEVEX0xPR0lOCi0jZW5kaWYKLQotLyoqIGVuZCBvZiBsb2dpbiByZWNvcmRlciBkZWZpbml0aW9ucyAqLwotCi0jaWZkZWYgQlJPS0VOX0dFVEdST1VQUwotIyBkZWZpbmUgZ2V0Z3JvdXBzKGEsYikgKChhKT09MCAmJiAoYik9PU5VTEwgPyBOR1JPVVBTX01BWCA6IGdldGdyb3VwcygoYSksKGIpKSkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChIQVZFX01NQVApICYmIGRlZmluZWQoQlJPS0VOX01NQVApCi0jIHVuZGVmIEhBVkVfTU1BUAotI2VuZGlmCi0KLSNpZm5kZWYgSU9WX01BWAotIyBpZiBkZWZpbmVkKF9YT1BFTl9JT1ZfTUFYKQotIyAgZGVmaW5lCUlPVl9NQVgJCV9YT1BFTl9JT1ZfTUFYCi0jIGVsaWYgZGVmaW5lZChERUZfSU9WX01BWCkKLSMgIGRlZmluZQlJT1ZfTUFYCQlERUZfSU9WX01BWAotIyBlbHNlCi0jICBkZWZpbmUJSU9WX01BWAkJMTYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEVXT1VMREJMT0NLCi0jIGRlZmluZSBFV09VTERCTE9DSyBFQUdBSU4KLSNlbmRpZgotCi0jaWZuZGVmIElORVQ2X0FERFJTVFJMRU4JLyogZm9yIG5vbiBJUHY2IG1hY2hpbmVzICovCi0jZGVmaW5lIElORVQ2X0FERFJTVFJMRU4gNDYKLSNlbmRpZgotCi0jaWZuZGVmIFNTSF9JT0JVRlNaCi0jIGRlZmluZSBTU0hfSU9CVUZTWiA4MTkyCi0jZW5kaWYKLQotI2lmbmRlZiBfTlNJRwotIyBpZmRlZiBOU0lHCi0jICBkZWZpbmUgX05TSUcgTlNJRwotIyBlbHNlCi0jICBkZWZpbmUgX05TSUcgMTI4Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9ERUZJTkVTX0ggKi8KZGlmZiAtLWdpdCBhL2RoLmMgYi9kaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTAyOWQ4Li4wMDAwMDAwCi0tLSBhL2RoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGRoLmMsdiAxLjQ4IDIwMDkvMTAvMDEgMTE6Mzc6MzMgZ3J1bmsgRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgTmllbHMgUHJvdm9zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+Ci0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiZGguaCIKLSNpbmNsdWRlICJwYXRobmFtZXMuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLXN0YXRpYyBpbnQKLXBhcnNlX3ByaW1lKGludCBsaW5lbnVtLCBjaGFyICpsaW5lLCBzdHJ1Y3QgZGhncm91cCAqZGhnKQotewotCWNoYXIgKmNwLCAqYXJnOwotCWNoYXIgKnN0cnNpemUsICpnZW4sICpwcmltZTsKLQljb25zdCBjaGFyICplcnJzdHIgPSBOVUxMOwotCWxvbmcgbG9uZyBuOwotCi0JY3AgPSBsaW5lOwotCWlmICgoYXJnID0gc3RyZGVsaW0oJmNwKSkgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JLyogSWdub3JlIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotCWlmICgqYXJnID09ICdcMCcpCi0JCWFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JaWYgKCFhcmcgfHwgISphcmcgfHwgKmFyZyA9PSAnIycpCi0JCXJldHVybiAwOwotCi0JLyogdGltZSAqLwotCWlmIChjcCA9PSBOVUxMIHx8ICphcmcgPT0gJ1wwJykKLQkJZ290byBmYWlsOwotCWFyZyA9IHN0cnNlcCgmY3AsICIgIik7IC8qIHR5cGUgKi8KLQlpZiAoY3AgPT0gTlVMTCB8fCAqYXJnID09ICdcMCcpCi0JCWdvdG8gZmFpbDsKLQkvKiBFbnN1cmUgdGhpcyBpcyBhIHNhZmUgcHJpbWUgKi8KLQluID0gc3RydG9udW0oYXJnLCAwLCA1LCAmZXJyc3RyKTsKLQlpZiAoZXJyc3RyICE9IE5VTEwgfHwgbiAhPSBNT0RVTElfVFlQRV9TQUZFKQotCQlnb3RvIGZhaWw7Ci0JYXJnID0gc3Ryc2VwKCZjcCwgIiAiKTsgLyogdGVzdHMgKi8KLQlpZiAoY3AgPT0gTlVMTCB8fCAqYXJnID09ICdcMCcpCi0JCWdvdG8gZmFpbDsKLQkvKiBFbnN1cmUgcHJpbWUgaGFzIGJlZW4gdGVzdGVkIGFuZCBpcyBub3QgY29tcG9zaXRlICovCi0JbiA9IHN0cnRvbnVtKGFyZywgMCwgMHgxZiwgJmVycnN0cik7Ci0JaWYgKGVycnN0ciAhPSBOVUxMIHx8Ci0JICAgIChuICYgTU9EVUxJX1RFU1RTX0NPTVBPU0lURSkgfHwgIShuICYgfk1PRFVMSV9URVNUU19DT01QT1NJVEUpKQotCQlnb3RvIGZhaWw7Ci0JYXJnID0gc3Ryc2VwKCZjcCwgIiAiKTsgLyogdHJpZXMgKi8KLQlpZiAoY3AgPT0gTlVMTCB8fCAqYXJnID09ICdcMCcpCi0JCWdvdG8gZmFpbDsKLQluID0gc3RydG9udW0oYXJnLCAwLCAxPDwzMCwgJmVycnN0cik7Ci0JaWYgKGVycnN0ciAhPSBOVUxMIHx8IG4gPT0gMCkKLQkJZ290byBmYWlsOwotCXN0cnNpemUgPSBzdHJzZXAoJmNwLCAiICIpOyAvKiBzaXplICovCi0JaWYgKGNwID09IE5VTEwgfHwgKnN0cnNpemUgPT0gJ1wwJyB8fAotCSAgICAoZGhnLT5zaXplID0gKGludClzdHJ0b251bShzdHJzaXplLCAwLCA2NCoxMDI0LCAmZXJyc3RyKSkgPT0gMCB8fAotCSAgICBlcnJzdHIpCi0JCWdvdG8gZmFpbDsKLQkvKiBUaGUgd2hvbGUgZ3JvdXAgaXMgb25lIGJpdCBsYXJnZXIgKi8KLQlkaGctPnNpemUrKzsKLQlnZW4gPSBzdHJzZXAoJmNwLCAiICIpOyAvKiBnZW4gKi8KLQlpZiAoY3AgPT0gTlVMTCB8fCAqZ2VuID09ICdcMCcpCi0JCWdvdG8gZmFpbDsKLQlwcmltZSA9IHN0cnNlcCgmY3AsICIgIik7IC8qIHByaW1lICovCi0JaWYgKGNwICE9IE5VTEwgfHwgKnByaW1lID09ICdcMCcpCi0JCWdvdG8gZmFpbDsKLQotCWlmICgoZGhnLT5nID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJwYXJzZV9wcmltZTogQk5fbmV3IGZhaWxlZCIpOwotCWlmICgoZGhnLT5wID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJwYXJzZV9wcmltZTogQk5fbmV3IGZhaWxlZCIpOwotCWlmIChCTl9oZXgyYm4oJmRoZy0+ZywgZ2VuKSA9PSAwKQotCQlnb3RvIGZhaWxjbGVhbjsKLQotCWlmIChCTl9oZXgyYm4oJmRoZy0+cCwgcHJpbWUpID09IDApCi0JCWdvdG8gZmFpbGNsZWFuOwotCi0JaWYgKEJOX251bV9iaXRzKGRoZy0+cCkgIT0gZGhnLT5zaXplKQotCQlnb3RvIGZhaWxjbGVhbjsKLQotCWlmIChCTl9pc196ZXJvKGRoZy0+ZykgfHwgQk5faXNfb25lKGRoZy0+ZykpCi0JCWdvdG8gZmFpbGNsZWFuOwotCi0JcmV0dXJuICgxKTsKLQotIGZhaWxjbGVhbjoKLQlCTl9jbGVhcl9mcmVlKGRoZy0+Zyk7Ci0JQk5fY2xlYXJfZnJlZShkaGctPnApOwotIGZhaWw6Ci0JZXJyb3IoIkJhZCBwcmltZSBkZXNjcmlwdGlvbiBpbiBsaW5lICVkIiwgbGluZW51bSk7Ci0JcmV0dXJuICgwKTsKLX0KLQotREggKgotY2hvb3NlX2RoKGludCBtaW4sIGludCB3YW50Yml0cywgaW50IG1heCkKLXsKLQlGSUxFICpmOwotCWNoYXIgbGluZVs0MDk2XTsKLQlpbnQgYmVzdCwgYmVzdGNvdW50LCB3aGljaDsKLQlpbnQgbGluZW51bTsKLQlzdHJ1Y3QgZGhncm91cCBkaGc7Ci0KLQlpZiAoKGYgPSBmb3BlbihfUEFUSF9ESF9NT0RVTEksICJyIikpID09IE5VTEwgJiYKLQkgICAgKGYgPSBmb3BlbihfUEFUSF9ESF9QUklNRVMsICJyIikpID09IE5VTEwpIHsKLQkJbG9naXQoIldBUk5JTkc6ICVzIGRvZXMgbm90IGV4aXN0LCB1c2luZyBmaXhlZCBtb2R1bHVzIiwKLQkJICAgIF9QQVRIX0RIX01PRFVMSSk7Ci0JCXJldHVybiAoZGhfbmV3X2dyb3VwMTQoKSk7Ci0JfQotCi0JbGluZW51bSA9IDA7Ci0JYmVzdCA9IGJlc3Rjb3VudCA9IDA7Ci0Jd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKLQkJbGluZW51bSsrOwotCQlpZiAoIXBhcnNlX3ByaW1lKGxpbmVudW0sIGxpbmUsICZkaGcpKQotCQkJY29udGludWU7Ci0JCUJOX2NsZWFyX2ZyZWUoZGhnLmcpOwotCQlCTl9jbGVhcl9mcmVlKGRoZy5wKTsKLQotCQlpZiAoZGhnLnNpemUgPiBtYXggfHwgZGhnLnNpemUgPCBtaW4pCi0JCQljb250aW51ZTsKLQotCQlpZiAoKGRoZy5zaXplID4gd2FudGJpdHMgJiYgZGhnLnNpemUgPCBiZXN0KSB8fAotCQkgICAgKGRoZy5zaXplID4gYmVzdCAmJiBiZXN0IDwgd2FudGJpdHMpKSB7Ci0JCQliZXN0ID0gZGhnLnNpemU7Ci0JCQliZXN0Y291bnQgPSAwOwotCQl9Ci0JCWlmIChkaGcuc2l6ZSA9PSBiZXN0KQotCQkJYmVzdGNvdW50Kys7Ci0JfQotCXJld2luZChmKTsKLQotCWlmIChiZXN0Y291bnQgPT0gMCkgewotCQlmY2xvc2UoZik7Ci0JCWxvZ2l0KCJXQVJOSU5HOiBubyBzdWl0YWJsZSBwcmltZXMgaW4gJXMiLCBfUEFUSF9ESF9QUklNRVMpOwotCQlyZXR1cm4gKGRoX25ld19ncm91cDE0KCkpOwotCX0KLQotCWxpbmVudW0gPSAwOwotCXdoaWNoID0gYXJjNHJhbmRvbV91bmlmb3JtKGJlc3Rjb3VudCk7Ci0Jd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKLQkJaWYgKCFwYXJzZV9wcmltZShsaW5lbnVtLCBsaW5lLCAmZGhnKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKGRoZy5zaXplID4gbWF4IHx8IGRoZy5zaXplIDwgbWluKSB8fAotCQkgICAgZGhnLnNpemUgIT0gYmVzdCB8fAotCQkgICAgbGluZW51bSsrICE9IHdoaWNoKSB7Ci0JCQlCTl9jbGVhcl9mcmVlKGRoZy5nKTsKLQkJCUJOX2NsZWFyX2ZyZWUoZGhnLnApOwotCQkJY29udGludWU7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWZjbG9zZShmKTsKLQlpZiAobGluZW51bSAhPSB3aGljaCsxKQotCQlmYXRhbCgiV0FSTklORzogbGluZSAlZCBkaXNhcHBlYXJlZCBpbiAlcywgZ2l2aW5nIHVwIiwKLQkJICAgIHdoaWNoLCBfUEFUSF9ESF9QUklNRVMpOwotCi0JcmV0dXJuIChkaF9uZXdfZ3JvdXAoZGhnLmcsIGRoZy5wKSk7Ci19Ci0KLS8qIGRpZmZpZS1oZWxsbWFuLWdyb3VwTi1zaGExICovCi0KLWludAotZGhfcHViX2lzX3ZhbGlkKERIICpkaCwgQklHTlVNICpkaF9wdWIpCi17Ci0JaW50IGk7Ci0JaW50IG4gPSBCTl9udW1fYml0cyhkaF9wdWIpOwotCWludCBiaXRzX3NldCA9IDA7Ci0JQklHTlVNICp0bXA7Ci0KLQlpZiAoZGhfcHViLT5uZWcpIHsKLQkJbG9naXQoImludmFsaWQgcHVibGljIERIIHZhbHVlOiBuZWdhdGl2ZSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKEJOX2NtcChkaF9wdWIsIEJOX3ZhbHVlX29uZSgpKSAhPSAxKSB7CS8qIHB1Yl9leHAgPD0gMSAqLwotCQlsb2dpdCgiaW52YWxpZCBwdWJsaWMgREggdmFsdWU6IDw9IDEiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCh0bXAgPSBCTl9uZXcoKSkgPT0gTlVMTCkgewotCQllcnJvcigiJXM6IEJOX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIUJOX3N1Yih0bXAsIGRoLT5wLCBCTl92YWx1ZV9vbmUoKSkgfHwKLQkgICAgQk5fY21wKGRoX3B1YiwgdG1wKSAhPSAtMSkgewkJLyogcHViX2V4cCA+IHAtMiAqLwotCQlCTl9jbGVhcl9mcmVlKHRtcCk7Ci0JCWxvZ2l0KCJpbnZhbGlkIHB1YmxpYyBESCB2YWx1ZTogPj0gcC0xIik7Ci0JCXJldHVybiAwOwotCX0KLQlCTl9jbGVhcl9mcmVlKHRtcCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IG47IGkrKykKLQkJaWYgKEJOX2lzX2JpdF9zZXQoZGhfcHViLCBpKSkKLQkJCWJpdHNfc2V0Kys7Ci0JZGVidWcyKCJiaXRzIHNldDogJWQvJWQiLCBiaXRzX3NldCwgQk5fbnVtX2JpdHMoZGgtPnApKTsKLQotCS8qIGlmIGc9PTIgYW5kIGJpdHNfc2V0PT0xIHRoZW4gY29tcHV0aW5nIGxvZ19nKGRoX3B1YikgaXMgdHJpdmlhbCAqLwotCWlmIChiaXRzX3NldCA+IDEpCi0JCXJldHVybiAxOwotCi0JbG9naXQoImludmFsaWQgcHVibGljIERIIHZhbHVlICglZC8lZCkiLCBiaXRzX3NldCwgQk5fbnVtX2JpdHMoZGgtPnApKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotZGhfZ2VuX2tleShESCAqZGgsIGludCBuZWVkKQotewotCWludCBpLCBiaXRzX3NldCwgdHJpZXMgPSAwOwotCi0JaWYgKGRoLT5wID09IE5VTEwpCi0JCWZhdGFsKCJkaF9nZW5fa2V5OiBkaC0+cCA9PSBOVUxMIik7Ci0JaWYgKG5lZWQgPiBJTlRfTUFYIC8gMiB8fCAyICogbmVlZCA+PSBCTl9udW1fYml0cyhkaC0+cCkpCi0JCWZhdGFsKCJkaF9nZW5fa2V5OiBncm91cCB0b28gc21hbGw6ICVkICgyKm5lZWQgJWQpIiwKLQkJICAgIEJOX251bV9iaXRzKGRoLT5wKSwgMipuZWVkKTsKLQlkbyB7Ci0JCWlmIChkaC0+cHJpdl9rZXkgIT0gTlVMTCkKLQkJCUJOX2NsZWFyX2ZyZWUoZGgtPnByaXZfa2V5KTsKLQkJaWYgKChkaC0+cHJpdl9rZXkgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCJkaF9nZW5fa2V5OiBCTl9uZXcgZmFpbGVkIik7Ci0JCS8qIGdlbmVyYXRlIGEgMipuZWVkIGJpdHMgcmFuZG9tIHByaXZhdGUgZXhwb25lbnQgKi8KLQkJaWYgKCFCTl9yYW5kKGRoLT5wcml2X2tleSwgMipuZWVkLCAwLCAwKSkKLQkJCWZhdGFsKCJkaF9nZW5fa2V5OiBCTl9yYW5kIGZhaWxlZCIpOwotCQlpZiAoREhfZ2VuZXJhdGVfa2V5KGRoKSA9PSAwKQotCQkJZmF0YWwoIkRIX2dlbmVyYXRlX2tleSIpOwotCQlmb3IgKGkgPSAwLCBiaXRzX3NldCA9IDA7IGkgPD0gQk5fbnVtX2JpdHMoZGgtPnByaXZfa2V5KTsgaSsrKQotCQkJaWYgKEJOX2lzX2JpdF9zZXQoZGgtPnByaXZfa2V5LCBpKSkKLQkJCQliaXRzX3NldCsrOwotCQlkZWJ1ZzIoImRoX2dlbl9rZXk6IHByaXYga2V5IGJpdHMgc2V0OiAlZC8lZCIsCi0JCSAgICBiaXRzX3NldCwgQk5fbnVtX2JpdHMoZGgtPnByaXZfa2V5KSk7Ci0JCWlmICh0cmllcysrID4gMTApCi0JCQlmYXRhbCgiZGhfZ2VuX2tleTogdG9vIG1hbnkgYmFkIGtleXM6IGdpdmluZyB1cCIpOwotCX0gd2hpbGUgKCFkaF9wdWJfaXNfdmFsaWQoZGgsIGRoLT5wdWJfa2V5KSk7Ci19Ci0KLURIICoKLWRoX25ld19ncm91cF9hc2MoY29uc3QgY2hhciAqZ2VuLCBjb25zdCBjaGFyICptb2R1bHVzKQotewotCURIICpkaDsKLQotCWlmICgoZGggPSBESF9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoImRoX25ld19ncm91cF9hc2M6IERIX25ldyIpOwotCi0JaWYgKEJOX2hleDJibigmZGgtPnAsIG1vZHVsdXMpID09IDApCi0JCWZhdGFsKCJCTl9oZXgyYm4gcCIpOwotCWlmIChCTl9oZXgyYm4oJmRoLT5nLCBnZW4pID09IDApCi0JCWZhdGFsKCJCTl9oZXgyYm4gZyIpOwotCi0JcmV0dXJuIChkaCk7Ci19Ci0KLS8qCi0gKiBUaGlzIGp1c3QgcmV0dXJucyB0aGUgZ3JvdXAsIHdlIHN0aWxsIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGV4Y2hhbmdlCi0gKiB2YWx1ZS4KLSAqLwotCi1ESCAqCi1kaF9uZXdfZ3JvdXAoQklHTlVNICpnZW4sIEJJR05VTSAqbW9kdWx1cykKLXsKLQlESCAqZGg7Ci0KLQlpZiAoKGRoID0gREhfbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJkaF9uZXdfZ3JvdXA6IERIX25ldyIpOwotCWRoLT5wID0gbW9kdWx1czsKLQlkaC0+ZyA9IGdlbjsKLQotCXJldHVybiAoZGgpOwotfQotCi1ESCAqCi1kaF9uZXdfZ3JvdXAxKHZvaWQpCi17Ci0Jc3RhdGljIGNoYXIgKmdlbiA9ICIyIiwgKmdyb3VwMSA9Ci0JICAgICJGRkZGRkZGRiIgIkZGRkZGRkZGIiAiQzkwRkRBQTIiICIyMTY4QzIzNCIgIkM0QzY2MjhCIiAiODBEQzFDRDEiCi0JICAgICIyOTAyNEUwOCIgIjhBNjdDQzc0IiAiMDIwQkJFQTYiICIzQjEzOUIyMiIgIjUxNEEwODc5IiAiOEUzNDA0REQiCi0JICAgICJFRjk1MTlCMyIgIkNEM0E0MzFCIiAiMzAyQjBBNkQiICJGMjVGMTQzNyIgIjRGRTEzNTZEIiAiNkQ1MUMyNDUiCi0JICAgICJFNDg1QjU3NiIgIjYyNUU3RUM2IiAiRjQ0QzQyRTkiICJBNjM3RUQ2QiIgIjBCRkY1Q0I2IiAiRjQwNkI3RUQiCi0JICAgICJFRTM4NkJGQiIgIjVBODk5RkE1IiAiQUU5RjI0MTEiICI3QzRCMUZFNiIgIjQ5Mjg2NjUxIiAiRUNFNjUzODEiCi0JICAgICJGRkZGRkZGRiIgIkZGRkZGRkZGIjsKLQotCXJldHVybiAoZGhfbmV3X2dyb3VwX2FzYyhnZW4sIGdyb3VwMSkpOwotfQotCi1ESCAqCi1kaF9uZXdfZ3JvdXAxNCh2b2lkKQotewotCXN0YXRpYyBjaGFyICpnZW4gPSAiMiIsICpncm91cDE0ID0KLQkgICAgIkZGRkZGRkZGIiAiRkZGRkZGRkYiICJDOTBGREFBMiIgIjIxNjhDMjM0IiAiQzRDNjYyOEIiICI4MERDMUNEMSIKLQkgICAgIjI5MDI0RTA4IiAiOEE2N0NDNzQiICIwMjBCQkVBNiIgIjNCMTM5QjIyIiAiNTE0QTA4NzkiICI4RTM0MDRERCIKLQkgICAgIkVGOTUxOUIzIiAiQ0QzQTQzMUIiICIzMDJCMEE2RCIgIkYyNUYxNDM3IiAiNEZFMTM1NkQiICI2RDUxQzI0NSIKLQkgICAgIkU0ODVCNTc2IiAiNjI1RTdFQzYiICJGNDRDNDJFOSIgIkE2MzdFRDZCIiAiMEJGRjVDQjYiICJGNDA2QjdFRCIKLQkgICAgIkVFMzg2QkZCIiAiNUE4OTlGQTUiICJBRTlGMjQxMSIgIjdDNEIxRkU2IiAiNDkyODY2NTEiICJFQ0U0NUIzRCIKLQkgICAgIkMyMDA3Q0I4IiAiQTE2M0JGMDUiICI5OERBNDgzNiIgIjFDNTVEMzlBIiAiNjkxNjNGQTgiICJGRDI0Q0Y1RiIKLQkgICAgIjgzNjU1RDIzIiAiRENBM0FEOTYiICIxQzYyRjM1NiIgIjIwODU1MkJCIiAiOUVENTI5MDciICI3MDk2OTY2RCIKLQkgICAgIjY3MEMzNTRFIiAiNEFCQzk4MDQiICJGMTc0NkMwOCIgIkNBMTgyMTdDIiAiMzI5MDVFNDYiICIyRTM2Q0UzQiIKLQkgICAgIkUzOUU3NzJDIiAiMTgwRTg2MDMiICI5QjI3ODNBMiIgIkVDMDdBMjhGIiAiQjVDNTVERjAiICI2RjRDNTJDOSIKLQkgICAgIkRFMkJDQkY2IiAiOTU1ODE3MTgiICIzOTk1NDk3QyIgIkVBOTU2QUU1IiAiMTVEMjI2MTgiICI5OEZBMDUxMCIKLQkgICAgIjE1NzI4RTVBIiAiOEFBQ0FBNjgiICJGRkZGRkZGRiIgIkZGRkZGRkZGIjsKLQotCXJldHVybiAoZGhfbmV3X2dyb3VwX2FzYyhnZW4sIGdyb3VwMTQpKTsKLX0KLQotLyoKLSAqIEVzdGltYXRlcyB0aGUgZ3JvdXAgb3JkZXIgZm9yIGEgRGlmZmllLUhlbGxtYW4gZ3JvdXAgdGhhdCBoYXMgYW4KLSAqIGF0dGFjayBjb21wbGV4aXR5IGFwcHJveGltYXRlbHkgdGhlIHNhbWUgYXMgTygyKipiaXRzKS4gIEVzdGltYXRlCi0gKiB3aXRoOiAgTyhleHAoMS45MjIzICogKGxuIHEpXigxLzMpIChsbiBsbiBxKV4oMi8zKSkpCi0gKi8KLQotaW50Ci1kaF9lc3RpbWF0ZShpbnQgYml0cykKLXsKLQotCWlmIChiaXRzIDw9IDEyOCkKLQkJcmV0dXJuICgxMDI0KTsJLyogTygyKio4NikgKi8KLQlpZiAoYml0cyA8PSAxOTIpCi0JCXJldHVybiAoMjA0OCk7CS8qIE8oMioqMTE2KSAqLwotCXJldHVybiAoNDA5Nik7CQkvKiBPKDIqKjE1NikgKi8KLX0KZGlmZiAtLWdpdCBhL2RoLmggYi9kaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmMxNDgwLi4wMDAwMDAwCi0tLSBhL2RoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiAkT3BlbkJTRDogZGguaCx2IDEuMTAgMjAwOC8wNi8yNiAwOToxOTo0MCBkam0gRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBOaWVscyBQcm92b3MuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotI2lmbmRlZiBESF9ICi0jZGVmaW5lIERIX0gKLQotc3RydWN0IGRoZ3JvdXAgewotCWludCBzaXplOwotCUJJR05VTSAqZzsKLQlCSUdOVU0gKnA7Ci19OwotCi1ESAkqY2hvb3NlX2RoKGludCwgaW50LCBpbnQpOwotREgJKmRoX25ld19ncm91cF9hc2MoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotREgJKmRoX25ld19ncm91cChCSUdOVU0gKiwgQklHTlVNICopOwotREgJKmRoX25ld19ncm91cDEodm9pZCk7Ci1ESAkqZGhfbmV3X2dyb3VwMTQodm9pZCk7Ci0KLXZvaWQJIGRoX2dlbl9rZXkoREggKiwgaW50KTsKLWludAkgZGhfcHViX2lzX3ZhbGlkKERIICosIEJJR05VTSAqKTsKLQotaW50CSBkaF9lc3RpbWF0ZShpbnQpOwotCi0jZGVmaW5lIERIX0dSUF9NSU4JMTAyNAotI2RlZmluZSBESF9HUlBfTUFYCTgxOTIKLQotLyoKLSAqIFZhbHVlcyBmb3IgInR5cGUiIGZpZWxkIG9mIG1vZHVsaSg1KQotICogU3BlY2lmaWVzIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgdGhlIHByaW1lIG1vZHVsdXMuCi0gKi8KLSNkZWZpbmUgTU9EVUxJX1RZUEVfVU5LTk9XTgkJKDApCi0jZGVmaW5lIE1PRFVMSV9UWVBFX1VOU1RSVUNUVVJFRAkoMSkKLSNkZWZpbmUgTU9EVUxJX1RZUEVfU0FGRQkJKDIpCi0jZGVmaW5lIE1PRFVMSV9UWVBFX1NDSE5PUlIJCSgzKQotI2RlZmluZSBNT0RVTElfVFlQRV9TT1BISUVfR0VSTUFJTgkoNCkKLSNkZWZpbmUgTU9EVUxJX1RZUEVfU1RST05HCQkoNSkKLQotLyoKLSAqIFZhbHVlcyBmb3IgInRlc3RzIiBmaWVsZCBvZiBtb2R1bGkoNSkKLSAqIFNwZWNpZmllcyB0aGUgbWV0aG9kcyB1c2VkIGluIGNoZWNraW5nIGZvciBwcmltYWxpdHkuCi0gKiBVc3VhbGx5LCBtb3JlIHRoYW4gb25lIHRlc3QgaXMgdXNlZC4KLSAqLwotI2RlZmluZSBNT0RVTElfVEVTVFNfVU5URVNURUQJCSgweDAwKQotI2RlZmluZSBNT0RVTElfVEVTVFNfQ09NUE9TSVRFCQkoMHgwMSkKLSNkZWZpbmUgTU9EVUxJX1RFU1RTX1NJRVZFCQkoMHgwMikKLSNkZWZpbmUgTU9EVUxJX1RFU1RTX01JTExFUl9SQUJJTgkoMHgwNCkKLSNkZWZpbmUgTU9EVUxJX1RFU1RTX0pBQ09CSQkJKDB4MDgpCi0jZGVmaW5lIE1PRFVMSV9URVNUU19FTExJUFRJQwkJKDB4MTApCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kaXNwYXRjaC5jIGIvZGlzcGF0Y2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiYjgwOS4uMDAwMDAwMAotLS0gYS9kaXNwYXRjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qICRPcGVuQlNEOiBkaXNwYXRjaC5jLHYgMS4yMiAyMDA4LzEwLzMxIDE1OjA1OjM0IHN0ZXZlc2sgRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgInNzaDEuaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAiZGlzcGF0Y2guaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJjb21wYXQuaCIKLQotI2RlZmluZSBESVNQQVRDSF9NQVgJMjU1Ci0KLWRpc3BhdGNoX2ZuICpkaXNwYXRjaFtESVNQQVRDSF9NQVhdOwotCi12b2lkCi1kaXNwYXRjaF9wcm90b2NvbF9lcnJvcihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlsb2dpdCgiZGlzcGF0Y2hfcHJvdG9jb2xfZXJyb3I6IHR5cGUgJWQgc2VxICV1IiwgdHlwZSwgc2VxKTsKLQlpZiAoIWNvbXBhdDIwKQotCQlmYXRhbCgicHJvdG9jb2wgZXJyb3IiKTsKLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVU5JTVBMRU1FTlRFRCk7Ci0JcGFja2V0X3B1dF9pbnQoc2VxKTsKLQlwYWNrZXRfc2VuZCgpOwotCXBhY2tldF93cml0ZV93YWl0KCk7Ci19Ci12b2lkCi1kaXNwYXRjaF9wcm90b2NvbF9pZ25vcmUoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JbG9naXQoImRpc3BhdGNoX3Byb3RvY29sX2lnbm9yZTogdHlwZSAlZCBzZXEgJXUiLCB0eXBlLCBzZXEpOwotfQotdm9pZAotZGlzcGF0Y2hfaW5pdChkaXNwYXRjaF9mbiAqZGZsdCkKLXsKLQl1X2ludCBpOwotCWZvciAoaSA9IDA7IGkgPCBESVNQQVRDSF9NQVg7IGkrKykKLQkJZGlzcGF0Y2hbaV0gPSBkZmx0OwotfQotdm9pZAotZGlzcGF0Y2hfcmFuZ2UodV9pbnQgZnJvbSwgdV9pbnQgdG8sIGRpc3BhdGNoX2ZuICpmbikKLXsKLQl1X2ludCBpOwotCi0JZm9yIChpID0gZnJvbTsgaSA8PSB0bzsgaSsrKSB7Ci0JCWlmIChpID49IERJU1BBVENIX01BWCkKLQkJCWJyZWFrOwotCQlkaXNwYXRjaFtpXSA9IGZuOwotCX0KLX0KLXZvaWQKLWRpc3BhdGNoX3NldChpbnQgdHlwZSwgZGlzcGF0Y2hfZm4gKmZuKQotewotCWRpc3BhdGNoW3R5cGVdID0gZm47Ci19Ci12b2lkCi1kaXNwYXRjaF9ydW4oaW50IG1vZGUsIHZvbGF0aWxlIHNpZ19hdG9taWNfdCAqZG9uZSwgdm9pZCAqY3R4dCkKLXsKLQlmb3IgKDs7KSB7Ci0JCWludCB0eXBlOwotCQl1X2ludDMyX3Qgc2VxbnI7Ci0KLQkJaWYgKG1vZGUgPT0gRElTUEFUQ0hfQkxPQ0spIHsKLQkJCXR5cGUgPSBwYWNrZXRfcmVhZF9zZXFucigmc2VxbnIpOwotCQl9IGVsc2UgewotCQkJdHlwZSA9IHBhY2tldF9yZWFkX3BvbGxfc2VxbnIoJnNlcW5yKTsKLQkJCWlmICh0eXBlID09IFNTSF9NU0dfTk9ORSkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHR5cGUgPiAwICYmIHR5cGUgPCBESVNQQVRDSF9NQVggJiYgZGlzcGF0Y2hbdHlwZV0gIT0gTlVMTCkKLQkJCSgqZGlzcGF0Y2hbdHlwZV0pKHR5cGUsIHNlcW5yLCBjdHh0KTsKLQkJZWxzZQotCQkJcGFja2V0X2Rpc2Nvbm5lY3QoInByb3RvY29sIGVycm9yOiByY3ZkIHR5cGUgJWQiLCB0eXBlKTsKLQkJaWYgKGRvbmUgIT0gTlVMTCAmJiAqZG9uZSkKLQkJCXJldHVybjsKLQl9Ci19CmRpZmYgLS1naXQgYS9kaXNwYXRjaC5oIGIvZGlzcGF0Y2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzZDFhMS4uMDAwMDAwMAotLS0gYS9kaXNwYXRjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGRpc3BhdGNoLmgsdiAxLjExIDIwMDYvMDQvMjAgMDk6Mjc6MDkgZGptIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotZW51bSB7Ci0JRElTUEFUQ0hfQkxPQ0ssCi0JRElTUEFUQ0hfTk9OQkxPQ0sKLX07Ci0KLXR5cGVkZWYgdm9pZCBkaXNwYXRjaF9mbihpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKLQotdm9pZAkgZGlzcGF0Y2hfaW5pdChkaXNwYXRjaF9mbiAqKTsKLXZvaWQJIGRpc3BhdGNoX3NldChpbnQsIGRpc3BhdGNoX2ZuICopOwotdm9pZAkgZGlzcGF0Y2hfcmFuZ2UodV9pbnQsIHVfaW50LCBkaXNwYXRjaF9mbiAqKTsKLXZvaWQJIGRpc3BhdGNoX3J1bihpbnQsIHZvbGF0aWxlIHNpZ19hdG9taWNfdCAqLCB2b2lkICopOwotdm9pZAkgZGlzcGF0Y2hfcHJvdG9jb2xfZXJyb3IoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Ci12b2lkCSBkaXNwYXRjaF9wcm90b2NvbF9pZ25vcmUoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7CmRpZmYgLS1naXQgYS9kbnMuYyBiL2Rucy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2MxMzFmLi4wMDAwMDAwCi0tLSBhL2Rucy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qICRPcGVuQlNEOiBkbnMuYyx2IDEuMjcgMjAxMC8wOC8zMSAxMTo1NDo0NSBkam0gRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBXZXNsZXkgR3JpZmZpbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwMyBKYWtvYiBTY2hseXRlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiZG5zLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICplcnJzZXRfdGV4dFtdID0gewotCSJzdWNjZXNzIiwJCS8qIDAgRVJSU0VUX1NVQ0NFU1MgKi8KLQkib3V0IG9mIG1lbW9yeSIsCS8qIDEgRVJSU0VUX05PTUVNT1JZICovCi0JImdlbmVyYWwgZmFpbHVyZSIsCS8qIDIgRVJSU0VUX0ZBSUwgKi8KLQkiaW52YWxpZCBwYXJhbWV0ZXIiLAkvKiAzIEVSUlNFVF9JTlZBTCAqLwotCSJuYW1lIGRvZXMgbm90IGV4aXN0IiwJLyogNCBFUlJTRVRfTk9OQU1FICovCi0JImRhdGEgZG9lcyBub3QgZXhpc3QiLAkvKiA1IEVSUlNFVF9OT0RBVEEgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWRuc19yZXN1bHRfdG90ZXh0KHVuc2lnbmVkIGludCByZXMpCi17Ci0Jc3dpdGNoIChyZXMpIHsKLQljYXNlIEVSUlNFVF9TVUNDRVNTOgotCQlyZXR1cm4gZXJyc2V0X3RleHRbRVJSU0VUX1NVQ0NFU1NdOwotCWNhc2UgRVJSU0VUX05PTUVNT1JZOgotCQlyZXR1cm4gZXJyc2V0X3RleHRbRVJSU0VUX05PTUVNT1JZXTsKLQljYXNlIEVSUlNFVF9GQUlMOgotCQlyZXR1cm4gZXJyc2V0X3RleHRbRVJSU0VUX0ZBSUxdOwotCWNhc2UgRVJSU0VUX0lOVkFMOgotCQlyZXR1cm4gZXJyc2V0X3RleHRbRVJSU0VUX0lOVkFMXTsKLQljYXNlIEVSUlNFVF9OT05BTUU6Ci0JCXJldHVybiBlcnJzZXRfdGV4dFtFUlJTRVRfTk9OQU1FXTsKLQljYXNlIEVSUlNFVF9OT0RBVEE6Ci0JCXJldHVybiBlcnJzZXRfdGV4dFtFUlJTRVRfTk9EQVRBXTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gInVua25vd24gZXJyb3IiOwotCX0KLX0KLQotLyoKLSAqIFJlYWQgU1NIRlAgcGFyYW1ldGVycyBmcm9tIGtleSBidWZmZXIuCi0gKi8KLXN0YXRpYyBpbnQKLWRuc19yZWFkX2tleSh1X2ludDhfdCAqYWxnb3JpdGhtLCB1X2ludDhfdCAqZGlnZXN0X3R5cGUsCi0gICAgdV9jaGFyICoqZGlnZXN0LCB1X2ludCAqZGlnZXN0X2xlbiwgS2V5ICprZXkpCi17Ci0JaW50IHN1Y2Nlc3MgPSAwOwotCi0Jc3dpdGNoIChrZXktPnR5cGUpIHsKLQljYXNlIEtFWV9SU0E6Ci0JCSphbGdvcml0aG0gPSBTU0hGUF9LRVlfUlNBOwotCQlicmVhazsKLQljYXNlIEtFWV9EU0E6Ci0JCSphbGdvcml0aG0gPSBTU0hGUF9LRVlfRFNBOwotCQlicmVhazsKLQkvKiBYWFggS0VZX0VDRFNBICovCi0JZGVmYXVsdDoKLQkJKmFsZ29yaXRobSA9IFNTSEZQX0tFWV9SRVNFUlZFRDsgLyogMCAqLwotCX0KLQotCWlmICgqYWxnb3JpdGhtKSB7Ci0JCSpkaWdlc3RfdHlwZSA9IFNTSEZQX0hBU0hfU0hBMTsKLQkJKmRpZ2VzdCA9IGtleV9maW5nZXJwcmludF9yYXcoa2V5LCBTU0hfRlBfU0hBMSwgZGlnZXN0X2xlbik7Ci0JCWlmICgqZGlnZXN0ID09IE5VTEwpCi0JCQlmYXRhbCgiZG5zX3JlYWRfa2V5OiBudWxsIGZyb20ga2V5X2ZpbmdlcnByaW50X3JhdygpIik7Ci0JCXN1Y2Nlc3MgPSAxOwotCX0gZWxzZSB7Ci0JCSpkaWdlc3RfdHlwZSA9IFNTSEZQX0hBU0hfUkVTRVJWRUQ7Ci0JCSpkaWdlc3QgPSBOVUxMOwotCQkqZGlnZXN0X2xlbiA9IDA7Ci0JCXN1Y2Nlc3MgPSAwOwotCX0KLQotCXJldHVybiBzdWNjZXNzOwotfQotCi0vKgotICogUmVhZCBTU0hGUCBwYXJhbWV0ZXJzIGZyb20gcmRhdGEgYnVmZmVyLgotICovCi1zdGF0aWMgaW50Ci1kbnNfcmVhZF9yZGF0YSh1X2ludDhfdCAqYWxnb3JpdGhtLCB1X2ludDhfdCAqZGlnZXN0X3R5cGUsCi0gICAgdV9jaGFyICoqZGlnZXN0LCB1X2ludCAqZGlnZXN0X2xlbiwgdV9jaGFyICpyZGF0YSwgaW50IHJkYXRhX2xlbikKLXsKLQlpbnQgc3VjY2VzcyA9IDA7Ci0KLQkqYWxnb3JpdGhtID0gU1NIRlBfS0VZX1JFU0VSVkVEOwotCSpkaWdlc3RfdHlwZSA9IFNTSEZQX0hBU0hfUkVTRVJWRUQ7Ci0KLQlpZiAocmRhdGFfbGVuID49IDIpIHsKLQkJKmFsZ29yaXRobSA9IHJkYXRhWzBdOwotCQkqZGlnZXN0X3R5cGUgPSByZGF0YVsxXTsKLQkJKmRpZ2VzdF9sZW4gPSByZGF0YV9sZW4gLSAyOwotCi0JCWlmICgqZGlnZXN0X2xlbiA+IDApIHsKLQkJCSpkaWdlc3QgPSAodV9jaGFyICopIHhtYWxsb2MoKmRpZ2VzdF9sZW4pOwotCQkJbWVtY3B5KCpkaWdlc3QsIHJkYXRhICsgMiwgKmRpZ2VzdF9sZW4pOwotCQl9IGVsc2UgewotCQkJKmRpZ2VzdCA9ICh1X2NoYXIgKil4c3RyZHVwKCIiKTsKLQkJfQotCi0JCXN1Y2Nlc3MgPSAxOwotCX0KLQotCXJldHVybiBzdWNjZXNzOwotfQotCi0vKgotICogQ2hlY2sgaWYgaG9zdG5hbWUgaXMgbnVtZXJpY2FsLgotICogUmV0dXJucyAtMSBpZiBob3N0bmFtZSBpcyBudW1lcmljLCAwIG90aGVyd2lzZQotICovCi1zdGF0aWMgaW50Ci1pc19udW1lcmljX2hvc3RuYW1lKGNvbnN0IGNoYXIgKmhvc3RuYW1lKQotewotCXN0cnVjdCBhZGRyaW5mbyBoaW50cywgKmFpOwotCi0JLyoKLQkgKiBXZSBzaG91bGRuJ3QgZXZlciBnZXQgYSBudWxsIGhvc3QgYnV0IGlmIHdlIGRvIHRoZW4gbG9nIGFuIGVycm9yCi0JICogYW5kIHJldHVybiAtMSB3aGljaCBzdG9wcyBETlMga2V5IGZpbmdlcnByaW50IHByb2Nlc3NpbmcuCi0JICovCi0JaWYgKGhvc3RuYW1lID09IE5VTEwpIHsKLQkJZXJyb3IoImlzX251bWVyaWNfaG9zdG5hbWUgY2FsbGVkIHdpdGggTlVMTCBob3N0bmFtZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOwotCWhpbnRzLmFpX2ZsYWdzID0gQUlfTlVNRVJJQ0hPU1Q7Ci0KLQlpZiAoZ2V0YWRkcmluZm8oaG9zdG5hbWUsIE5VTEwsICZoaW50cywgJmFpKSA9PSAwKSB7Ci0JCWZyZWVhZGRyaW5mbyhhaSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFZlcmlmeSB0aGUgZ2l2ZW4gaG9zdG5hbWUsIGFkZHJlc3MgYW5kIGhvc3Qga2V5IHVzaW5nIEROUy4KLSAqIFJldHVybnMgMCBpZiBsb29rdXAgc3VjY2VlZHMsIC0xIG90aGVyd2lzZQotICovCi1pbnQKLXZlcmlmeV9ob3N0X2tleV9kbnMoY29uc3QgY2hhciAqaG9zdG5hbWUsIHN0cnVjdCBzb2NrYWRkciAqYWRkcmVzcywKLSAgICBLZXkgKmhvc3RrZXksIGludCAqZmxhZ3MpCi17Ci0JdV9pbnQgY291bnRlcjsKLQlpbnQgcmVzdWx0OwotCXN0cnVjdCBycnNldGluZm8gKmZpbmdlcnByaW50cyA9IE5VTEw7Ci0KLQl1X2ludDhfdCBob3N0a2V5X2FsZ29yaXRobTsKLQl1X2ludDhfdCBob3N0a2V5X2RpZ2VzdF90eXBlOwotCXVfY2hhciAqaG9zdGtleV9kaWdlc3Q7Ci0JdV9pbnQgaG9zdGtleV9kaWdlc3RfbGVuOwotCi0JdV9pbnQ4X3QgZG5za2V5X2FsZ29yaXRobTsKLQl1X2ludDhfdCBkbnNrZXlfZGlnZXN0X3R5cGU7Ci0JdV9jaGFyICpkbnNrZXlfZGlnZXN0OwotCXVfaW50IGRuc2tleV9kaWdlc3RfbGVuOwotCi0JKmZsYWdzID0gMDsKLQotCWRlYnVnMygidmVyaWZ5X2hvc3Rfa2V5X2RucyIpOwotCWlmIChob3N0a2V5ID09IE5VTEwpCi0JCWZhdGFsKCJObyBrZXkgdG8gbG9vayB1cCEiKTsKLQotCWlmIChpc19udW1lcmljX2hvc3RuYW1lKGhvc3RuYW1lKSkgewotCQlkZWJ1Zygic2tpcHBlZCBETlMgbG9va3VwIGZvciBudW1lcmljYWwgaG9zdG5hbWUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotI2lmbmRlZiBBTkRST0lECi0JcmVzdWx0ID0gZ2V0cnJzZXRieW5hbWUoaG9zdG5hbWUsIEROU19SREFUQUNMQVNTX0lOLAotCSAgICBETlNfUkRBVEFUWVBFX1NTSEZQLCAwLCAmZmluZ2VycHJpbnRzKTsKLSNlbHNlCi0JLyogdW5zdXBwb3J0ZWQgaW4gYW5kcm9pZCAqLwotCXJlc3VsdCA9IC0xOwotI2VuZGlmCi0JaWYgKHJlc3VsdCkgewotCQl2ZXJib3NlKCJETlMgbG9va3VwIGVycm9yOiAlcyIsIGRuc19yZXN1bHRfdG90ZXh0KHJlc3VsdCkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGZpbmdlcnByaW50cy0+cnJpX2ZsYWdzICYgUlJTRVRfVkFMSURBVEVEKSB7Ci0JCSpmbGFncyB8PSBETlNfVkVSSUZZX1NFQ1VSRTsKLQkJZGVidWcoImZvdW5kICVkIHNlY3VyZSBmaW5nZXJwcmludHMgaW4gRE5TIiwKLQkJICAgIGZpbmdlcnByaW50cy0+cnJpX25yZGF0YXMpOwotCX0gZWxzZSB7Ci0JCWRlYnVnKCJmb3VuZCAlZCBpbnNlY3VyZSBmaW5nZXJwcmludHMgaW4gRE5TIiwKLQkJICAgIGZpbmdlcnByaW50cy0+cnJpX25yZGF0YXMpOwotCX0KLQotCS8qIEluaXRpYWxpemUgaG9zdCBrZXkgcGFyYW1ldGVycyAqLwotCWlmICghZG5zX3JlYWRfa2V5KCZob3N0a2V5X2FsZ29yaXRobSwgJmhvc3RrZXlfZGlnZXN0X3R5cGUsCi0JICAgICZob3N0a2V5X2RpZ2VzdCwgJmhvc3RrZXlfZGlnZXN0X2xlbiwgaG9zdGtleSkpIHsKLQkJZXJyb3IoIkVycm9yIGNhbGN1bGF0aW5nIGhvc3Qga2V5IGZpbmdlcnByaW50LiIpOwotI2lmbmRlZiBBTkRST0lECi0JCWZyZWVycnNldChmaW5nZXJwcmludHMpOwotI2VuZGlmCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoZmluZ2VycHJpbnRzLT5ycmlfbnJkYXRhcykKLQkJKmZsYWdzIHw9IEROU19WRVJJRllfRk9VTkQ7Ci0KLQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgZmluZ2VycHJpbnRzLT5ycmlfbnJkYXRhczsgY291bnRlcisrKSB7Ci0JCS8qCi0JCSAqIEV4dHJhY3QgdGhlIGtleSBmcm9tIHRoZSBhbnN3ZXIuIElnbm9yZSBhbnkgYmFkbHkKLQkJICogZm9ybWF0dGVkIGZpbmdlcnByaW50cy4KLQkJICovCi0JCWlmICghZG5zX3JlYWRfcmRhdGEoJmRuc2tleV9hbGdvcml0aG0sICZkbnNrZXlfZGlnZXN0X3R5cGUsCi0JCSAgICAmZG5za2V5X2RpZ2VzdCwgJmRuc2tleV9kaWdlc3RfbGVuLAotCQkgICAgZmluZ2VycHJpbnRzLT5ycmlfcmRhdGFzW2NvdW50ZXJdLnJkaV9kYXRhLAotCQkgICAgZmluZ2VycHJpbnRzLT5ycmlfcmRhdGFzW2NvdW50ZXJdLnJkaV9sZW5ndGgpKSB7Ci0JCQl2ZXJib3NlKCJFcnJvciBwYXJzaW5nIGZpbmdlcnByaW50IGZyb20gRE5TLiIpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBDaGVjayBpZiB0aGUgY3VycmVudCBrZXkgaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIGtleSAqLwotCQlpZiAoaG9zdGtleV9hbGdvcml0aG0gPT0gZG5za2V5X2FsZ29yaXRobSAmJgotCQkgICAgaG9zdGtleV9kaWdlc3RfdHlwZSA9PSBkbnNrZXlfZGlnZXN0X3R5cGUpIHsKLQotCQkJaWYgKGhvc3RrZXlfZGlnZXN0X2xlbiA9PSBkbnNrZXlfZGlnZXN0X2xlbiAmJgotCQkJICAgIG1lbWNtcChob3N0a2V5X2RpZ2VzdCwgZG5za2V5X2RpZ2VzdCwKLQkJCSAgICBob3N0a2V5X2RpZ2VzdF9sZW4pID09IDApIHsKLQotCQkJCSpmbGFncyB8PSBETlNfVkVSSUZZX01BVENIOwotCQkJfQotCQl9Ci0JCXhmcmVlKGRuc2tleV9kaWdlc3QpOwotCX0KLQotCXhmcmVlKGhvc3RrZXlfZGlnZXN0KTsgLyogZnJvbSBrZXlfZmluZ2VycHJpbnRfcmF3KCkgKi8KLSNpZm5kZWYgQU5EUk9JRAotCWZyZWVycnNldChmaW5nZXJwcmludHMpOwotI2VuZGlmCi0KLQlpZiAoKmZsYWdzICYgRE5TX1ZFUklGWV9GT1VORCkKLQkJaWYgKCpmbGFncyAmIEROU19WRVJJRllfTUFUQ0gpCi0JCQlkZWJ1ZygibWF0Y2hpbmcgaG9zdCBrZXkgZmluZ2VycHJpbnQgZm91bmQgaW4gRE5TIik7Ci0JCWVsc2UKLQkJCWRlYnVnKCJtaXNtYXRjaGluZyBob3N0IGtleSBmaW5nZXJwcmludCBmb3VuZCBpbiBETlMiKTsKLQllbHNlCi0JCWRlYnVnKCJubyBob3N0IGtleSBmaW5nZXJwcmludCBmb3VuZCBpbiBETlMiKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogRXhwb3J0IHRoZSBmaW5nZXJwcmludCBvZiBhIGtleSBhcyBhIEROUyByZXNvdXJjZSByZWNvcmQKLSAqLwotaW50Ci1leHBvcnRfZG5zX3JyKGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBLZXkgKmtleSwgRklMRSAqZiwgaW50IGdlbmVyaWMpCi17Ci0JdV9pbnQ4X3QgcmRhdGFfcHVia2V5X2FsZ29yaXRobSA9IDA7Ci0JdV9pbnQ4X3QgcmRhdGFfZGlnZXN0X3R5cGUgPSBTU0hGUF9IQVNIX1NIQTE7Ci0JdV9jaGFyICpyZGF0YV9kaWdlc3Q7Ci0JdV9pbnQgcmRhdGFfZGlnZXN0X2xlbjsKLQotCXVfaW50IGk7Ci0JaW50IHN1Y2Nlc3MgPSAwOwotCi0JaWYgKGRuc19yZWFkX2tleSgmcmRhdGFfcHVia2V5X2FsZ29yaXRobSwgJnJkYXRhX2RpZ2VzdF90eXBlLAotCSAgICAmcmRhdGFfZGlnZXN0LCAmcmRhdGFfZGlnZXN0X2xlbiwga2V5KSkgewotCi0JCWlmIChnZW5lcmljKQotCQkJZnByaW50ZihmLCAiJXMgSU4gVFlQRSVkIFxcIyAlZCAlMDJ4ICUwMnggIiwgaG9zdG5hbWUsCi0JCQkgICAgRE5TX1JEQVRBVFlQRV9TU0hGUCwgMiArIHJkYXRhX2RpZ2VzdF9sZW4sCi0JCQkgICAgcmRhdGFfcHVia2V5X2FsZ29yaXRobSwgcmRhdGFfZGlnZXN0X3R5cGUpOwotCQllbHNlCi0JCQlmcHJpbnRmKGYsICIlcyBJTiBTU0hGUCAlZCAlZCAiLCBob3N0bmFtZSwKLQkJCSAgICByZGF0YV9wdWJrZXlfYWxnb3JpdGhtLCByZGF0YV9kaWdlc3RfdHlwZSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHJkYXRhX2RpZ2VzdF9sZW47IGkrKykKLQkJCWZwcmludGYoZiwgIiUwMngiLCByZGF0YV9kaWdlc3RbaV0pOwotCQlmcHJpbnRmKGYsICJcbiIpOwotCQl4ZnJlZShyZGF0YV9kaWdlc3QpOyAvKiBmcm9tIGtleV9maW5nZXJwcmludF9yYXcoKSAqLwotCQlzdWNjZXNzID0gMTsKLQl9IGVsc2UgewotCQllcnJvcigiZXhwb3J0X2Ruc19ycjogdW5zdXBwb3J0ZWQgYWxnb3JpdGhtIik7Ci0JfQotCi0JcmV0dXJuIHN1Y2Nlc3M7Ci19CmRpZmYgLS1naXQgYS9kbnMuaCBiL2Rucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGNmZDdiLi4wMDAwMDAwCi0tLSBhL2Rucy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGRucy5oLHYgMS4xMSAyMDEwLzAyLzI2IDIwOjI5OjU0IGRqbSBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzIFdlc2xleSBHcmlmZmluLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDAzIEpha29iIFNjaGx5dGVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIEROU19ICi0jZGVmaW5lIEROU19ICi0KLWVudW0gc3NoZnBfdHlwZXMgewotCVNTSEZQX0tFWV9SRVNFUlZFRCwKLQlTU0hGUF9LRVlfUlNBLAotCVNTSEZQX0tFWV9EU0EKLX07Ci0KLWVudW0gc3NoZnBfaGFzaGVzIHsKLQlTU0hGUF9IQVNIX1JFU0VSVkVELAotCVNTSEZQX0hBU0hfU0hBMQotfTsKLQotI2RlZmluZSBETlNfUkRBVEFDTEFTU19JTgkxCi0jZGVmaW5lIEROU19SREFUQVRZUEVfU1NIRlAJNDQKLQotI2RlZmluZSBETlNfVkVSSUZZX0ZPVU5ECTB4MDAwMDAwMDEKLSNkZWZpbmUgRE5TX1ZFUklGWV9NQVRDSAkweDAwMDAwMDAyCi0jZGVmaW5lIEROU19WRVJJRllfU0VDVVJFCTB4MDAwMDAwMDQKLQotaW50CXZlcmlmeV9ob3N0X2tleV9kbnMoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc29ja2FkZHIgKiwgS2V5ICosIGludCAqKTsKLWludAlleHBvcnRfZG5zX3JyKGNvbnN0IGNoYXIgKiwgS2V5ICosIEZJTEUgKiwgaW50KTsKLQotI2VuZGlmIC8qIEROU19IICovCmRpZmYgLS1naXQgYS9lbnRyb3B5LmMgYi9lbnRyb3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNmQzZWMuLjAwMDAwMDAKLS0tIGEvZW50cm9weS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2lmZGVmIEhBVkVfU1lTX1VOX0gKLSMgaW5jbHVkZSA8c3lzL3VuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+IC8qIGZvciBvZmZzZXRvZiAqLwotCi0jaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgotCi0jaW5jbHVkZSAic3NoLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJhdG9taWNpby5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotCi0vKgotICogUG9ydGFibGUgT3BlblNTSCBQUk5HIHNlZWRpbmc6Ci0gKiBJZiBPcGVuU1NMIGhhcyBub3QgImludGVybmFsbHkgc2VlZGVkIiBpdHNlbGYgKGUuZy4gcHVsbGVkIGRhdGEgZnJvbQotICogL2Rldi9yYW5kb20pLCB0aGVuIGNvbGxlY3QgUkFORE9NX1NFRURfU0laRSBieXRlcyBvZiByYW5kb21uZXNzIGZyb20KLSAqIFBSTkdkLgotICovCi0jaWZuZGVmIE9QRU5TU0xfUFJOR19PTkxZCi0KLSNkZWZpbmUgUkFORE9NX1NFRURfU0laRSA0OAotCi0vKgotICogQ29sbGVjdCAnbGVuJyBieXRlcyBvZiBlbnRyb3B5IGludG8gJ2J1ZicgZnJvbSBQUk5HRC9FR0QgZGFlbW9uCi0gKiBsaXN0ZW5pbmcgZWl0aGVyIG9uICd0Y3BfcG9ydCcsIG9yIHZpYSBVbml4IGRvbWFpbiBzb2NrZXQgYXQgKgotICogJ3NvY2tldF9wYXRoJy4KLSAqIEVpdGhlciBhIG5vbi16ZXJvIHRjcF9wb3J0IG9yIGEgbm9uLW51bGwgc29ja2V0X3BhdGggbXVzdCBiZQotICogc3VwcGxpZWQuCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSAqLwotaW50Ci1nZXRfcmFuZG9tX2J5dGVzX3BybmdkKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbiwKLSAgICB1bnNpZ25lZCBzaG9ydCB0Y3BfcG9ydCwgY2hhciAqc29ja2V0X3BhdGgpCi17Ci0JaW50IGZkLCBhZGRyX2xlbiwgcnZhbCwgZXJyb3JzOwotCXVfY2hhciBtc2dbMl07Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHJfaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmFkZHI7Ci0Jc3RydWN0IHNvY2thZGRyX3VuICphZGRyX3VuID0gKHN0cnVjdCBzb2NrYWRkcl91biAqKSZhZGRyOwotCW15c2lnX3Qgb2xkX3NpZ3BpcGU7Ci0KLQkvKiBTYW5pdHkgY2hlY2tzICovCi0JaWYgKHNvY2tldF9wYXRoID09IE5VTEwgJiYgdGNwX3BvcnQgPT0gMCkKLQkJZmF0YWwoIllvdSBtdXN0IHNwZWNpZnkgYSBwb3J0IG9yIGEgc29ja2V0Iik7Ci0JaWYgKHNvY2tldF9wYXRoICE9IE5VTEwgJiYKLQkgICAgc3RybGVuKHNvY2tldF9wYXRoKSA+PSBzaXplb2YoYWRkcl91bi0+c3VuX3BhdGgpKQotCQlmYXRhbCgiUmFuZG9tIHBvb2wgcGF0aCBpcyB0b28gbG9uZyIpOwotCWlmIChsZW4gPD0gMCB8fCBsZW4gPiAyNTUpCi0JCWZhdGFsKCJUb28gbWFueSBieXRlcyAoJWQpIHRvIHJlYWQgZnJvbSBQUk5HRCIsIGxlbik7Ci0KLQltZW1zZXQoJmFkZHIsICdcMCcsIHNpemVvZihhZGRyKSk7Ci0KLQlpZiAodGNwX3BvcnQgIT0gMCkgewotCQlhZGRyX2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQkJYWRkcl9pbi0+c2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKTsKLQkJYWRkcl9pbi0+c2luX3BvcnQgPSBodG9ucyh0Y3BfcG9ydCk7Ci0JCWFkZHJfbGVuID0gc2l6ZW9mKCphZGRyX2luKTsKLQl9IGVsc2UgewotCQlhZGRyX3VuLT5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKLQkJc3RybGNweShhZGRyX3VuLT5zdW5fcGF0aCwgc29ja2V0X3BhdGgsCi0JCSAgICBzaXplb2YoYWRkcl91bi0+c3VuX3BhdGgpKTsKLQkJYWRkcl9sZW4gPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKSArCi0JCSAgICBzdHJsZW4oc29ja2V0X3BhdGgpICsgMTsKLQl9Ci0KLQlvbGRfc2lncGlwZSA9IG15c2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwotCi0JZXJyb3JzID0gMDsKLQlydmFsID0gLTE7Ci1yZW9wZW46Ci0JZmQgPSBzb2NrZXQoYWRkci5zc19mYW1pbHksIFNPQ0tfU1RSRUFNLCAwKTsKLQlpZiAoZmQgPT0gLTEpIHsKLQkJZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb25uZWN0KGZkLCAoc3RydWN0IHNvY2thZGRyKikmYWRkciwgYWRkcl9sZW4pID09IC0xKSB7Ci0JCWlmICh0Y3BfcG9ydCAhPSAwKSB7Ci0JCQllcnJvcigiQ291bGRuJ3QgY29ubmVjdCB0byBQUk5HRCBwb3J0ICVkOiAlcyIsCi0JCQkgICAgdGNwX3BvcnQsIHN0cmVycm9yKGVycm5vKSk7Ci0JCX0gZWxzZSB7Ci0JCQllcnJvcigiQ291bGRuJ3QgY29ubmVjdCB0byBQUk5HRCBzb2NrZXQgXCIlc1wiOiAlcyIsCi0JCQkgICAgYWRkcl91bi0+c3VuX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQotCS8qIFNlbmQgYmxvY2tpbmcgcmVhZCByZXF1ZXN0IHRvIFBSTkdEICovCi0JbXNnWzBdID0gMHgwMjsKLQltc2dbMV0gPSBsZW47Ci0KLQlpZiAoYXRvbWljaW8odndyaXRlLCBmZCwgbXNnLCBzaXplb2YobXNnKSkgIT0gc2l6ZW9mKG1zZykpIHsKLQkJaWYgKGVycm5vID09IEVQSVBFICYmIGVycm9ycyA8IDEwKSB7Ci0JCQljbG9zZShmZCk7Ci0JCQllcnJvcnMrKzsKLQkJCWdvdG8gcmVvcGVuOwotCQl9Ci0JCWVycm9yKCJDb3VsZG4ndCB3cml0ZSB0byBQUk5HRCBzb2NrZXQ6ICVzIiwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoYXRvbWljaW8ocmVhZCwgZmQsIGJ1ZiwgbGVuKSAhPSAoc2l6ZV90KWxlbikgewotCQlpZiAoZXJybm8gPT0gRVBJUEUgJiYgZXJyb3JzIDwgMTApIHsKLQkJCWNsb3NlKGZkKTsKLQkJCWVycm9ycysrOwotCQkJZ290byByZW9wZW47Ci0JCX0KLQkJZXJyb3IoIkNvdWxkbid0IHJlYWQgZnJvbSBQUk5HRCBzb2NrZXQ6ICVzIiwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlydmFsID0gMDsKLWRvbmU6Ci0JbXlzaWduYWwoU0lHUElQRSwgb2xkX3NpZ3BpcGUpOwotCWlmIChmZCAhPSAtMSkKLQkJY2xvc2UoZmQpOwotCXJldHVybiBydmFsOwotfQotCi1zdGF0aWMgaW50Ci1zZWVkX2Zyb21fcHJuZ2QodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgYnl0ZXMpCi17Ci0jaWZkZWYgUFJOR0RfUE9SVAotCWRlYnVnKCJ0cnlpbmcgZWdkL3BybmdkIHBvcnQgJWQiLCBQUk5HRF9QT1JUKTsKLQlpZiAoZ2V0X3JhbmRvbV9ieXRlc19wcm5nZChidWYsIGJ5dGVzLCBQUk5HRF9QT1JULCBOVUxMKSA9PSAwKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotI2lmZGVmIFBSTkdEX1NPQ0tFVAotCWRlYnVnKCJ0cnlpbmcgZWdkL3BybmdkIHNvY2tldCAlcyIsIFBSTkdEX1NPQ0tFVCk7Ci0JaWYgKGdldF9yYW5kb21fYnl0ZXNfcHJuZ2QoYnVmLCBieXRlcywgMCwgUFJOR0RfU09DS0VUKSA9PSAwKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCXJldHVybiAtMTsKLX0KLQotdm9pZAotcmV4ZWNfc2VuZF9ybmdfc2VlZChCdWZmZXIgKm0pCi17Ci0JdV9jaGFyIGJ1ZltSQU5ET01fU0VFRF9TSVpFXTsKLQotCWlmIChSQU5EX2J5dGVzKGJ1Ziwgc2l6ZW9mKGJ1ZikpIDw9IDApIHsKLQkJZXJyb3IoIkNvdWxkbid0IG9idGFpbiByYW5kb20gYnl0ZXMgKGVycm9yICVsZCkiLAotCQkgICAgRVJSX2dldF9lcnJvcigpKTsKLQkJYnVmZmVyX3B1dF9zdHJpbmcobSwgIiIsIDApOwotCX0gZWxzZSAKLQkJYnVmZmVyX3B1dF9zdHJpbmcobSwgYnVmLCBzaXplb2YoYnVmKSk7Ci19Ci0KLXZvaWQKLXJleGVjX3JlY3Zfcm5nX3NlZWQoQnVmZmVyICptKQotewotCXVfY2hhciAqYnVmOwotCXVfaW50IGxlbjsKLQotCWJ1ZiA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChtLCAmbGVuKTsKLQlpZiAoYnVmICE9IE5VTEwpIHsKLQkJZGVidWczKCJyZXhlY19yZWN2X3JuZ19zZWVkOiBzZWVkaW5nIHJuZyB3aXRoICV1IGJ5dGVzIiwgbGVuKTsKLQkJUkFORF9hZGQoYnVmLCBsZW4sIGxlbik7Ci0JfQotfQotI2VuZGlmIC8qIE9QRU5TU0xfUFJOR19PTkxZICovCi0KLXZvaWQKLXNlZWRfcm5nKHZvaWQpCi17Ci0jaWZuZGVmIE9QRU5TU0xfUFJOR19PTkxZCi0JdW5zaWduZWQgY2hhciBidWZbUkFORE9NX1NFRURfU0laRV07Ci0jZW5kaWYKLQkvKgotCSAqIE9wZW5TU0wgdmVyc2lvbiBudW1iZXJzOiBNTk5GRlBQUzogbWFqb3IgbWlub3IgZml4IHBhdGNoIHN0YXR1cwotCSAqIFdlIG1hdGNoIG1ham9yLCBtaW5vciwgZml4IGFuZCBzdGF0dXMgKG5vdCBwYXRjaCkKLQkgKi8KLQlpZiAoKFNTTGVheSgpIF4gT1BFTlNTTF9WRVJTSU9OX05VTUJFUikgJiB+MHhmZjBMKQotCQlmYXRhbCgiT3BlblNTTCB2ZXJzaW9uIG1pc21hdGNoLiBCdWlsdCBhZ2FpbnN0ICVseCwgeW91ICIKLQkJICAgICJoYXZlICVseCIsICh1X2xvbmcpT1BFTlNTTF9WRVJTSU9OX05VTUJFUiwgU1NMZWF5KCkpOwotCi0jaWZuZGVmIE9QRU5TU0xfUFJOR19PTkxZCi0JaWYgKFJBTkRfc3RhdHVzKCkgPT0gMSkgewotCQlkZWJ1ZzMoIlJORyBpcyByZWFkeSwgc2tpcHBpbmcgc2VlZGluZyIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHNlZWRfZnJvbV9wcm5nZChidWYsIHNpemVvZihidWYpKSA9PSAtMSkKLQkJZmF0YWwoIkNvdWxkIG5vdCBvYnRhaW4gc2VlZCBmcm9tIFBSTkdkIik7Ci0JUkFORF9hZGQoYnVmLCBzaXplb2YoYnVmKSwgc2l6ZW9mKGJ1ZikpOwotCW1lbXNldChidWYsICdcMCcsIHNpemVvZihidWYpKTsKLQotI2VuZGlmIC8qIE9QRU5TU0xfUFJOR19PTkxZICovCi0JaWYgKFJBTkRfc3RhdHVzKCkgIT0gMSkKLQkJZmF0YWwoIlBSTkcgaXMgbm90IHNlZWRlZCIpOwotfQpkaWZmIC0tZ2l0IGEvZW50cm9weS5oIGIvZW50cm9weS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzFlYmNjLi4wMDAwMDAwCi0tLSBhL2VudHJvcHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogJElkOiBlbnRyb3B5LmgsdiAxLjUgMjAwNS8wOS8yNyAxMjo0NjozMiBkdHVja2VyIEV4cCAkICovCi0KLSNpZm5kZWYgX1JBTkRPTVNfSAotI2RlZmluZSBfUkFORE9NU19ICi0KLSNpbmNsdWRlICJidWZmZXIuaCIKLQotdm9pZCBzZWVkX3JuZyh2b2lkKTsKLXZvaWQgaW5pdF9ybmcodm9pZCk7Ci0KLXZvaWQgcmV4ZWNfc2VuZF9ybmdfc2VlZChCdWZmZXIgKik7Ci12b2lkIHJleGVjX3JlY3Zfcm5nX3NlZWQoQnVmZmVyICopOwotCi0jZW5kaWYgLyogX1JBTkRPTVNfSCAqLwpkaWZmIC0tZ2l0IGEvZmF0YWwuYyBiL2ZhdGFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNWFhM2YuLjAwMDAwMDAKLS0tIGEvZmF0YWwuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qICRPcGVuQlNEOiBmYXRhbC5jLHYgMS43IDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAibG9nLmgiCi0KLS8qIEZhdGFsIG1lc3NhZ2VzLiAgVGhpcyBmdW5jdGlvbiBuZXZlciByZXR1cm5zLiAqLwotCi12b2lkCi1mYXRhbChjb25zdCBjaGFyICpmbXQsLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JZG9fbG9nKFNZU0xPR19MRVZFTF9GQVRBTCwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0JY2xlYW51cF9leGl0KDI1NSk7Ci19CmRpZmYgLS1naXQgYS9maXhwYXRocyBiL2ZpeHBhdGhzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MGE2Nzk5Li4wMDAwMDAwCi0tLSBhL2ZpeHBhdGhzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIGZpeHBhdGhzICAtIHN1YnN0aXR1dGUgbWFrZWZpbGUgdmFyaWFibGVzIGludG8gdGV4dCBmaWxlcwotIyBVc2FnZTogZml4cGF0aHMgLURzb21ldGhpbmc9c29tZXRoaW5nZWxzZSAuLi4KLQotZGllKCkgewotCWVjaG8gJCoKLQlleGl0IC0xCi19Ci0KLXRlc3QgLW4gImBlY2hvICQxfGdyZXAgLS0gLURgIiB8fCBcCi0JZGllICQwOiBub3RoaW5nIHRvIGRvIC0gbm8gc3Vic3RpdHV0aW9ucyBsaXN0ZWQhCi0KLXRlc3QgLW4gImBlY2hvICQxfGdyZXAgLS0gJy1EW149XVwrPVteIF1cKydgIiB8fCBcCi0JZGllICQwOiBlcnJvciBpbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotCi10ZXN0IC1uICJgZWNobyAkKnxncmVwIC0tICcgW14tXSdgIiB8fCBcCi0JZGllIFVzYWdlOiAkMCAnWy1Ec3RyaW5nPXJlcGxhY2VtZW50XSBbW2luZmlsZV0gLi4uXScKLQotc2VkIGBlY2hvICQqfHNlZCAtZSAncy8tRFwoW149XVwrXCk9XChbXiBdKlwpLy1lIHM9XDE9XDI9Zy9nJ2AKLQotZXhpdCAwCmRpZmYgLS1naXQgYS9maXhwcm9ncyBiL2ZpeHByb2dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjc2ZWUzLi4wMDAwMDAwCi0tLSBhL2ZpeHByb2dzCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIyEvdXNyL2Jpbi9wZXJsCi0jCi0jIGZpeHByb2dzICAtIHJ1biB0aHJvdWdoIHRoZSBsaXN0IG9mIGVudHJvcHkgY29tbWFuZHMgYW5kCi0jICAgICAgICAgICAgIHNjb3JlIG91dCB0aGUgbG9zZXJzCi0jCi0KLSRlbnRzY2FsZSA9IDUwOyAjIGRpdmlzb3IgZm9yIG9wdGlvbmFsIGVudHJvcHkgbWVhc3VyZW1lbnQKLQotc3ViIHVzYWdlIHsKLSAgcmV0dXJuKCJVc2FnZTogJDAgPGNvbW1hbmQgZmlsZT5cbiIpOwotfQotCi1pZiAoKCQjQVJHViA9PSAtMSkgfHwgKCQjQVJHVj4xKSkgewotICBkaWUoJnVzYWdlKTsKLX0KLQotIyAndW5kb2N1bWVudGVkJyBvcHRpb24gLSBydW4gZW50IChpbiBzZWNvbmQgcGFyYW0pIG9uIHRoZSBvdXRwdXQKLWlmICgkI0FSR1Y9PTEpIHsKLSAgJGVudGNtZD0kQVJHVlsxXQotfSBlbHNlIHsKLSAgJGVudGNtZCA9ICIiCi19OwotCi0kaW5maWxlbmFtZSA9ICRBUkdWWzBdOwotCi1pZiAoIW9wZW4oSU4sICI8Ii4kaW5maWxlbmFtZSkpIHsKLSAgZGllKCJDb3VsZG4ndCBvcGVuIGlucHV0IGZpbGUiKTsKLX0KLSRvdXRmaWxlbmFtZT0kaW5maWxlbmFtZS4iLm91dCI7Ci1pZiAoIW9wZW4oT1VULCAiPiRvdXRmaWxlbmFtZSIpKSB7Ci0gIGRpZSgiQ291bGRuJ3Qgb3BlbiBvdXRwdXQgZmlsZSAkb3V0ZmlsZW5hbWUiKTsKLX0KLUBpbmZpbGU9PElOPjsKLQotc2VsZWN0KE9VVCk7ICR8PTE7IHNlbGVjdChTVERPVVQpOwotCi1mb3JlYWNoIChAaW5maWxlKSB7Ci0gIGlmICgvXlxzKlwjLyB8fCAvXlxzKiQvKSB7Ci0gICAgcHJpbnQgT1VUOwotICAgIG5leHQ7Ci0gIH0KLSAgKCRjbWQsICRwYXRoLCAkZXN0KSA9IC9eXCIoW15cIl0rKVwiXHMrKFtcd1wvXy1dKylccysoW1xkXC5cLV0rKS9vOwotICBAYXJncyA9IHNwbGl0KC8gLywgJGNtZCk7Ci0gICBpZiAoISAoJHBpZCA9IGZvcmsoKSkpIHsKLSAgICAgIyBjaGlsZAotICAgICBjbG9zZSBTVERJTjsgY2xvc2UgU1RET1VUOyBjbG9zZSBTVERFUlI7Ci0gICAgIG9wZW4gKFNURElOLCAgIjwvZGV2L251bGwiKTsKLSAgICAgb3BlbiAoU1RET1VULCAiPi9kZXYvbnVsbCIpOwotICAgICBvcGVuIChTVERFUlIsICI+L2Rldi9udWxsIik7Ci0gICAgIGV4ZWMgJHBhdGggQGFyZ3M7Ci0gICAgIGV4aXQgMTsgIyBzaG91bGRuJ3QgYmUgaGVyZQotICAgfQotICAgIyBwYXJlbnQKLSAgIHdhaXRwaWQgKCRwaWQsIDApOyAkcmV0PSQ/ID4+IDg7Ci0KLSAgaWYgKCRyZXQgIT0gMCkgewotICAgICRwYXRoID0gInVuZGVmIjsKLSAgfSBlbHNlIHsKLSAgICBpZiAoJGVudGNtZCBuZSAiIikgewotICAgICAgIyBub3cgdHJ5IHRvIHJ1biBlbnQgb24gdGhlIGNvbW1hbmQKLSAgICAgICRtb3N0YXJncz1qb2luKCIgIiwgc3BsaWNlKEBhcmdzLDEpKTsKLSAgICAgIHByaW50ICJFdmFsdWF0aW5nICckcGF0aCAkbW9zdGFyZ3MnXG4iOwotICAgICAgQGVudCA9IHF4eyRwYXRoICRtb3N0YXJncyB8ICRlbnRjbWQgLWIgLXR9OwotICAgICAgQGVudCA9IGdyZXAoL14xLC8sIEBlbnQpOwotICAgICAgKCRudWxsLCAkbnVsbCwgJHJhdGUpID0gc3BsaXQoLywvLCAkZW50WzBdKTsKLSAgICAgICRlc3QgPSAkcmF0ZSAvICRlbnRzY2FsZTsJCSMgc2NhbGUgdGhlIGVzdGltYXRlIGJhY2sKLSAgICB9Ci0gIH0KLSAgcHJpbnQgT1VUICJcIiRjbWRcIiAkcGF0aCAkZXN0XG4iOwotfQotCi1jbG9zZShJTik7CmRpZmYgLS1naXQgYS9ncm91cGFjY2Vzcy5jIGIvZ3JvdXBhY2Nlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2NGVjYi4uMDAwMDAwMAotLS0gYS9ncm91cGFjY2Vzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qICRPcGVuQlNEOiBncm91cGFjY2Vzcy5jLHYgMS4xMyAyMDA4LzA3LzA0IDAzOjQ0OjU5IGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBLZXZpbiBTdGV2ZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0jaW5jbHVkZSA8Z3JwLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAiZ3JvdXBhY2Nlc3MuaCIKLSNpbmNsdWRlICJtYXRjaC5oIgotI2luY2x1ZGUgImxvZy5oIgotCi1zdGF0aWMgaW50IG5ncm91cHM7Ci1zdGF0aWMgY2hhciAqKmdyb3Vwc19ieW5hbWU7Ci0KLS8qCi0gKiBJbml0aWFsaXplIGdyb3VwIGFjY2VzcyBsaXN0IGZvciB1c2VyIHdpdGggcHJpbWFyeSAoYmFzZSkgYW5kCi0gKiBzdXBwbGVtZW50YXJ5IGdyb3Vwcy4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGdyb3VwcyBpbiB0aGUgbGlzdC4KLSAqLwotaW50Ci1nYV9pbml0KGNvbnN0IGNoYXIgKnVzZXIsIGdpZF90IGJhc2UpCi17Ci0jaWZkZWYgQU5EUk9JRAotCXJldHVybiAwOwotI2Vsc2UKLQlnaWRfdCAqZ3JvdXBzX2J5Z2lkOwotCWludCBpLCBqOwotCXN0cnVjdCBncm91cCAqZ3I7Ci0KLQlpZiAobmdyb3VwcyA+IDApCi0JCWdhX2ZyZWUoKTsKLQotCW5ncm91cHMgPSBOR1JPVVBTX01BWDsKLSNpZiBkZWZpbmVkKEhBVkVfU1lTQ09ORikgJiYgZGVmaW5lZChfU0NfTkdST1VQU19NQVgpCi0Jbmdyb3VwcyA9IE1BWChOR1JPVVBTX01BWCwgc3lzY29uZihfU0NfTkdST1VQU19NQVgpKTsKLSNlbmRpZgotCi0JZ3JvdXBzX2J5Z2lkID0geGNhbGxvYyhuZ3JvdXBzLCBzaXplb2YoKmdyb3Vwc19ieWdpZCkpOwotCWdyb3Vwc19ieW5hbWUgPSB4Y2FsbG9jKG5ncm91cHMsIHNpemVvZigqZ3JvdXBzX2J5bmFtZSkpOwotCi0JaWYgKGdldGdyb3VwbGlzdCh1c2VyLCBiYXNlLCBncm91cHNfYnlnaWQsICZuZ3JvdXBzKSA9PSAtMSkKLQkJbG9naXQoImdldGdyb3VwbGlzdDogZ3JvdXBzIGxpc3QgdG9vIHNtYWxsIik7Ci0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspCi0JCWlmICgoZ3IgPSBnZXRncmdpZChncm91cHNfYnlnaWRbaV0pKSAhPSBOVUxMKQotCQkJZ3JvdXBzX2J5bmFtZVtqKytdID0geHN0cmR1cChnci0+Z3JfbmFtZSk7Ci0JeGZyZWUoZ3JvdXBzX2J5Z2lkKTsKLQlyZXR1cm4gKG5ncm91cHMgPSBqKTsKLSNlbmRpZgotfQotCi0vKgotICogUmV0dXJuIDEgaWYgb25lIG9mIHVzZXIncyBncm91cHMgaXMgY29udGFpbmVkIGluIGdyb3Vwcy4KLSAqIFJldHVybiAwIG90aGVyd2lzZS4gIFVzZSBtYXRjaF9wYXR0ZXJuKCkgZm9yIHN0cmluZyBjb21wYXJpc29uLgotICovCi1pbnQKLWdhX21hdGNoKGNoYXIgKiBjb25zdCAqZ3JvdXBzLCBpbnQgbikKLXsKLQlpbnQgaSwgajsKLQotCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCBuOyBqKyspCi0JCQlpZiAobWF0Y2hfcGF0dGVybihncm91cHNfYnluYW1lW2ldLCBncm91cHNbal0pKQotCQkJCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi0vKgotICogUmV0dXJuIDEgaWYgb25lIG9mIHVzZXIncyBncm91cHMgbWF0Y2hlcyBncm91cF9wYXR0ZXJuIGxpc3QuCi0gKiBSZXR1cm4gMCBvbiBuZWdhdGVkIG9yIG5vIG1hdGNoLgotICovCi1pbnQKLWdhX21hdGNoX3BhdHRlcm5fbGlzdChjb25zdCBjaGFyICpncm91cF9wYXR0ZXJuKQotewotCWludCBpLCBmb3VuZCA9IDA7Ci0Jc2l6ZV90IGxlbiA9IHN0cmxlbihncm91cF9wYXR0ZXJuKTsKLQotCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKLQkJc3dpdGNoIChtYXRjaF9wYXR0ZXJuX2xpc3QoZ3JvdXBzX2J5bmFtZVtpXSwKLQkJICAgIGdyb3VwX3BhdHRlcm4sIGxlbiwgMCkpIHsKLQkJY2FzZSAtMToKLQkJCXJldHVybiAwOwkvKiBOZWdhdGVkIG1hdGNoIHdpbnMgKi8KLQkJY2FzZSAwOgotCQkJY29udGludWU7Ci0JCWNhc2UgMToKLQkJCWZvdW5kID0gMTsKLQkJfQotCX0KLQlyZXR1cm4gZm91bmQ7Ci19Ci0KLS8qCi0gKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGdyb3VwIGFjY2VzcyBsaXN0LgotICovCi12b2lkCi1nYV9mcmVlKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAobmdyb3VwcyA+IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykKLQkJCXhmcmVlKGdyb3Vwc19ieW5hbWVbaV0pOwotCQluZ3JvdXBzID0gMDsKLQkJeGZyZWUoZ3JvdXBzX2J5bmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZ3JvdXBhY2Nlc3MuaCBiL2dyb3VwYWNjZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDU3OGUuLjAwMDAwMDAKLS0tIGEvZ3JvdXBhY2Nlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qICRPcGVuQlNEOiBncm91cGFjY2Vzcy5oLHYgMS44IDIwMDgvMDcvMDQgMDM6NDQ6NTkgZGptIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgS2V2aW4gU3RldmVzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBHUk9VUEFDQ0VTU19ICi0jZGVmaW5lIEdST1VQQUNDRVNTX0gKLQotaW50CSBnYV9pbml0KGNvbnN0IGNoYXIgKiwgZ2lkX3QpOwotaW50CSBnYV9tYXRjaChjaGFyICogY29uc3QgKiwgaW50KTsKLWludAkgZ2FfbWF0Y2hfcGF0dGVybl9saXN0KGNvbnN0IGNoYXIgKik7Ci12b2lkCSBnYV9mcmVlKHZvaWQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dzcy1nZW5yLmMgYi9nc3MtZ2Vuci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDJmMzg1Li4wMDAwMDAwCi0tLSBhL2dzcy1nZW5yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGdzcy1nZW5yLmMsdiAxLjIwIDIwMDkvMDYvMjIgMDU6Mzk6MjggZHR1Y2tlciBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDcgU2ltb24gV2lsa2luc29uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZkZWYgR1NTQVBJCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgInNzaDIuaCIKLQotI2luY2x1ZGUgInNzaC1nc3MuaCIKLQotZXh0ZXJuIHVfY2hhciAqc2Vzc2lvbl9pZDI7Ci1leHRlcm4gdV9pbnQgc2Vzc2lvbl9pZDJfbGVuOwotCi0vKiBDaGVjayB0aGF0IHRoZSBPSUQgaW4gYSBkYXRhIHN0cmVhbSBtYXRjaGVzIHRoYXQgaW4gdGhlIGNvbnRleHQgKi8KLWludAotc3NoX2dzc2FwaV9jaGVja19vaWQoR3NzY3R4dCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQotewotCXJldHVybiAoY3R4ICE9IE5VTEwgJiYgY3R4LT5vaWQgIT0gR1NTX0NfTk9fT0lEICYmCi0JICAgIGN0eC0+b2lkLT5sZW5ndGggPT0gbGVuICYmCi0JICAgIG1lbWNtcChjdHgtPm9pZC0+ZWxlbWVudHMsIGRhdGEsIGxlbikgPT0gMCk7Ci19Ci0KLS8qIFNldCB0aGUgY29udGV4dHMgT0lEIGZyb20gYSBkYXRhIHN0cmVhbSAqLwotdm9pZAotc3NoX2dzc2FwaV9zZXRfb2lkX2RhdGEoR3NzY3R4dCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQotewotCWlmIChjdHgtPm9pZCAhPSBHU1NfQ19OT19PSUQpIHsKLQkJeGZyZWUoY3R4LT5vaWQtPmVsZW1lbnRzKTsKLQkJeGZyZWUoY3R4LT5vaWQpOwotCX0KLQljdHgtPm9pZCA9IHhtYWxsb2Moc2l6ZW9mKGdzc19PSURfZGVzYykpOwotCWN0eC0+b2lkLT5sZW5ndGggPSBsZW47Ci0JY3R4LT5vaWQtPmVsZW1lbnRzID0geG1hbGxvYyhsZW4pOwotCW1lbWNweShjdHgtPm9pZC0+ZWxlbWVudHMsIGRhdGEsIGxlbik7Ci19Ci0KLS8qIFNldCB0aGUgY29udGV4dHMgT0lEICovCi12b2lkCi1zc2hfZ3NzYXBpX3NldF9vaWQoR3NzY3R4dCAqY3R4LCBnc3NfT0lEIG9pZCkKLXsKLQlzc2hfZ3NzYXBpX3NldF9vaWRfZGF0YShjdHgsIG9pZC0+ZWxlbWVudHMsIG9pZC0+bGVuZ3RoKTsKLX0KLQotLyogQWxsIHRoaXMgZWZmb3J0IHRvIHJlcG9ydCBhbiBlcnJvciAuLi4gKi8KLXZvaWQKLXNzaF9nc3NhcGlfZXJyb3IoR3NzY3R4dCAqY3R4dCkKLXsKLQljaGFyICpzOwotCi0JcyA9IHNzaF9nc3NhcGlfbGFzdF9lcnJvcihjdHh0LCBOVUxMLCBOVUxMKTsKLQlkZWJ1ZygiJXMiLCBzKTsKLQl4ZnJlZShzKTsKLX0KLQotY2hhciAqCi1zc2hfZ3NzYXBpX2xhc3RfZXJyb3IoR3NzY3R4dCAqY3R4dCwgT01fdWludDMyICptYWpvcl9zdGF0dXMsCi0gICAgT01fdWludDMyICptaW5vcl9zdGF0dXMpCi17Ci0JT01fdWludDMyIGxtaW47Ci0JZ3NzX2J1ZmZlcl9kZXNjIG1zZyA9IEdTU19DX0VNUFRZX0JVRkZFUjsKLQlPTV91aW50MzIgY3R4OwotCUJ1ZmZlciBiOwotCWNoYXIgKnJldDsKLQotCWJ1ZmZlcl9pbml0KCZiKTsKLQotCWlmIChtYWpvcl9zdGF0dXMgIT0gTlVMTCkKLQkJKm1ham9yX3N0YXR1cyA9IGN0eHQtPm1ham9yOwotCWlmIChtaW5vcl9zdGF0dXMgIT0gTlVMTCkKLQkJKm1pbm9yX3N0YXR1cyA9IGN0eHQtPm1pbm9yOwotCi0JY3R4ID0gMDsKLQkvKiBUaGUgR1NTQVBJIGVycm9yICovCi0JZG8gewotCQlnc3NfZGlzcGxheV9zdGF0dXMoJmxtaW4sIGN0eHQtPm1ham9yLAotCQkgICAgR1NTX0NfR1NTX0NPREUsIGN0eHQtPm9pZCwgJmN0eCwgJm1zZyk7Ci0KLQkJYnVmZmVyX2FwcGVuZCgmYiwgbXNnLnZhbHVlLCBtc2cubGVuZ3RoKTsKLQkJYnVmZmVyX3B1dF9jaGFyKCZiLCAnXG4nKTsKLQotCQlnc3NfcmVsZWFzZV9idWZmZXIoJmxtaW4sICZtc2cpOwotCX0gd2hpbGUgKGN0eCAhPSAwKTsKLQotCS8qIFRoZSBtZWNoYW5pc20gc3BlY2lmaWMgZXJyb3IgKi8KLQlkbyB7Ci0JCWdzc19kaXNwbGF5X3N0YXR1cygmbG1pbiwgY3R4dC0+bWlub3IsCi0JCSAgICBHU1NfQ19NRUNIX0NPREUsIGN0eHQtPm9pZCwgJmN0eCwgJm1zZyk7Ci0KLQkJYnVmZmVyX2FwcGVuZCgmYiwgbXNnLnZhbHVlLCBtc2cubGVuZ3RoKTsKLQkJYnVmZmVyX3B1dF9jaGFyKCZiLCAnXG4nKTsKLQotCQlnc3NfcmVsZWFzZV9idWZmZXIoJmxtaW4sICZtc2cpOwotCX0gd2hpbGUgKGN0eCAhPSAwKTsKLQotCWJ1ZmZlcl9wdXRfY2hhcigmYiwgJ1wwJyk7Ci0JcmV0ID0geG1hbGxvYyhidWZmZXJfbGVuKCZiKSk7Ci0JYnVmZmVyX2dldCgmYiwgcmV0LCBidWZmZXJfbGVuKCZiKSk7Ci0JYnVmZmVyX2ZyZWUoJmIpOwotCXJldHVybiAocmV0KTsKLX0KLQotLyoKLSAqIEluaXRpYWxpc2Ugb3VyIEdTU0FQSSBjb250ZXh0LiBXZSB1c2UgdGhpcyBvcGFxdWUgc3RydWN0dXJlIHRvIGNvbnRhaW4gYWxsCi0gKiBvZiB0aGUgZGF0YSB3aGljaCBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZlciBuZWVkIHRvIHBlcnNpc3QgYWNyb3NzCi0gKiB7YWNjZXB0LGluaXR9X3NlY19jb250ZXh0IGNhbGxzLCBzbyB0aGF0IHdoZW4gd2UgZG8gaXQgZnJvbSB0aGUgdXNlcmF1dGgKLSAqIHN0dWZmIGxpZmUgaXMgYSBsaXR0bGUgZWFzaWVyCi0gKi8KLXZvaWQKLXNzaF9nc3NhcGlfYnVpbGRfY3R4KEdzc2N0eHQgKipjdHgpCi17Ci0JKmN0eCA9IHhjYWxsb2MoMSwgc2l6ZW9mIChHc3NjdHh0KSk7Ci0JKCpjdHgpLT5jb250ZXh0ID0gR1NTX0NfTk9fQ09OVEVYVDsKLQkoKmN0eCktPm5hbWUgPSBHU1NfQ19OT19OQU1FOwotCSgqY3R4KS0+b2lkID0gR1NTX0NfTk9fT0lEOwotCSgqY3R4KS0+Y3JlZHMgPSBHU1NfQ19OT19DUkVERU5USUFMOwotCSgqY3R4KS0+Y2xpZW50ID0gR1NTX0NfTk9fTkFNRTsKLQkoKmN0eCktPmNsaWVudF9jcmVkcyA9IEdTU19DX05PX0NSRURFTlRJQUw7Ci19Ci0KLS8qIERlbGV0ZSBvdXIgY29udGV4dCwgcHJvdmlkaW5nIGl0IGhhcyBiZWVuIGJ1aWx0IGNvcnJlY3RseSAqLwotdm9pZAotc3NoX2dzc2FwaV9kZWxldGVfY3R4KEdzc2N0eHQgKipjdHgpCi17Ci0JT01fdWludDMyIG1zOwotCi0JaWYgKCgqY3R4KSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JaWYgKCgqY3R4KS0+Y29udGV4dCAhPSBHU1NfQ19OT19DT05URVhUKQotCQlnc3NfZGVsZXRlX3NlY19jb250ZXh0KCZtcywgJigqY3R4KS0+Y29udGV4dCwgR1NTX0NfTk9fQlVGRkVSKTsKLQlpZiAoKCpjdHgpLT5uYW1lICE9IEdTU19DX05PX05BTUUpCi0JCWdzc19yZWxlYXNlX25hbWUoJm1zLCAmKCpjdHgpLT5uYW1lKTsKLQlpZiAoKCpjdHgpLT5vaWQgIT0gR1NTX0NfTk9fT0lEKSB7Ci0JCXhmcmVlKCgqY3R4KS0+b2lkLT5lbGVtZW50cyk7Ci0JCXhmcmVlKCgqY3R4KS0+b2lkKTsKLQkJKCpjdHgpLT5vaWQgPSBHU1NfQ19OT19PSUQ7Ci0JfQotCWlmICgoKmN0eCktPmNyZWRzICE9IEdTU19DX05PX0NSRURFTlRJQUwpCi0JCWdzc19yZWxlYXNlX2NyZWQoJm1zLCAmKCpjdHgpLT5jcmVkcyk7Ci0JaWYgKCgqY3R4KS0+Y2xpZW50ICE9IEdTU19DX05PX05BTUUpCi0JCWdzc19yZWxlYXNlX25hbWUoJm1zLCAmKCpjdHgpLT5jbGllbnQpOwotCWlmICgoKmN0eCktPmNsaWVudF9jcmVkcyAhPSBHU1NfQ19OT19DUkVERU5USUFMKQotCQlnc3NfcmVsZWFzZV9jcmVkKCZtcywgJigqY3R4KS0+Y2xpZW50X2NyZWRzKTsKLQotCXhmcmVlKCpjdHgpOwotCSpjdHggPSBOVUxMOwotfQotCi0vKgotICogV3JhcHBlciB0byBpbml0X3NlY19jb250ZXh0Ci0gKiBSZXF1aXJlcyB0aGF0IHRoZSBjb250ZXh0IGNvbnRhaW5zOgotICoJb2lkCi0gKglzZXJ2ZXIgbmFtZSAoZnJvbSBzc2hfZ3NzYXBpX2ltcG9ydF9uYW1lKQotICovCi1PTV91aW50MzIKLXNzaF9nc3NhcGlfaW5pdF9jdHgoR3NzY3R4dCAqY3R4LCBpbnQgZGVsZWdfY3JlZHMsIGdzc19idWZmZXJfZGVzYyAqcmVjdl90b2ssCi0gICAgZ3NzX2J1ZmZlcl9kZXNjKiBzZW5kX3RvaywgT01fdWludDMyICpmbGFncykKLXsKLQlpbnQgZGVsZWdfZmxhZyA9IDA7Ci0KLQlpZiAoZGVsZWdfY3JlZHMpIHsKLQkJZGVsZWdfZmxhZyA9IEdTU19DX0RFTEVHX0ZMQUc7Ci0JCWRlYnVnKCJEZWxlZ2F0aW5nIGNyZWRlbnRpYWxzIik7Ci0JfQotCi0JY3R4LT5tYWpvciA9IGdzc19pbml0X3NlY19jb250ZXh0KCZjdHgtPm1pbm9yLAotCSAgICBHU1NfQ19OT19DUkVERU5USUFMLCAmY3R4LT5jb250ZXh0LCBjdHgtPm5hbWUsIGN0eC0+b2lkLAotCSAgICBHU1NfQ19NVVRVQUxfRkxBRyB8IEdTU19DX0lOVEVHX0ZMQUcgfCBkZWxlZ19mbGFnLAotCSAgICAwLCBOVUxMLCByZWN2X3RvaywgTlVMTCwgc2VuZF90b2ssIGZsYWdzLCBOVUxMKTsKLQotCWlmIChHU1NfRVJST1IoY3R4LT5tYWpvcikpCi0JCXNzaF9nc3NhcGlfZXJyb3IoY3R4KTsKLQotCXJldHVybiAoY3R4LT5tYWpvcik7Ci19Ci0KLS8qIENyZWF0ZSBhIHNlcnZpY2UgbmFtZSBmb3IgdGhlIGdpdmVuIGhvc3QgKi8KLU9NX3VpbnQzMgotc3NoX2dzc2FwaV9pbXBvcnRfbmFtZShHc3NjdHh0ICpjdHgsIGNvbnN0IGNoYXIgKmhvc3QpCi17Ci0JZ3NzX2J1ZmZlcl9kZXNjIGdzc2J1ZjsKLQljaGFyICp2YWw7Ci0KLQl4YXNwcmludGYoJnZhbCwgImhvc3RAJXMiLCBob3N0KTsKLQlnc3NidWYudmFsdWUgPSB2YWw7Ci0JZ3NzYnVmLmxlbmd0aCA9IHN0cmxlbihnc3NidWYudmFsdWUpOwotCi0JaWYgKChjdHgtPm1ham9yID0gZ3NzX2ltcG9ydF9uYW1lKCZjdHgtPm1pbm9yLAotCSAgICAmZ3NzYnVmLCBHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSwgJmN0eC0+bmFtZSkpKQotCQlzc2hfZ3NzYXBpX2Vycm9yKGN0eCk7Ci0KLQl4ZnJlZShnc3NidWYudmFsdWUpOwotCXJldHVybiAoY3R4LT5tYWpvcik7Ci19Ci0KLU9NX3VpbnQzMgotc3NoX2dzc2FwaV9zaWduKEdzc2N0eHQgKmN0eCwgZ3NzX2J1ZmZlcl90IGJ1ZmZlciwgZ3NzX2J1ZmZlcl90IGhhc2gpCi17Ci0JaWYgKChjdHgtPm1ham9yID0gZ3NzX2dldF9taWMoJmN0eC0+bWlub3IsIGN0eC0+Y29udGV4dCwKLQkgICAgR1NTX0NfUU9QX0RFRkFVTFQsIGJ1ZmZlciwgaGFzaCkpKQotCQlzc2hfZ3NzYXBpX2Vycm9yKGN0eCk7Ci0KLQlyZXR1cm4gKGN0eC0+bWFqb3IpOwotfQotCi12b2lkCi1zc2hfZ3NzYXBpX2J1aWxkbWljKEJ1ZmZlciAqYiwgY29uc3QgY2hhciAqdXNlciwgY29uc3QgY2hhciAqc2VydmljZSwKLSAgICBjb25zdCBjaGFyICpjb250ZXh0KQotewotCWJ1ZmZlcl9pbml0KGIpOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKGIsIHNlc3Npb25faWQyLCBzZXNzaW9uX2lkMl9sZW4pOwotCWJ1ZmZlcl9wdXRfY2hhcihiLCBTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoYiwgdXNlcik7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKGIsIHNlcnZpY2UpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZyhiLCBjb250ZXh0KTsKLX0KLQotaW50Ci1zc2hfZ3NzYXBpX2NoZWNrX21lY2hhbmlzbShHc3NjdHh0ICoqY3R4LCBnc3NfT0lEIG9pZCwgY29uc3QgY2hhciAqaG9zdCkKLXsKLQlnc3NfYnVmZmVyX2Rlc2MgdG9rZW4gPSBHU1NfQ19FTVBUWV9CVUZGRVI7Ci0JT01fdWludDMyIG1ham9yLCBtaW5vcjsKLQlnc3NfT0lEX2Rlc2Mgc3BuZWdvX29pZCA9IHs2LCAodm9pZCAqKSJceDJCXHgwNlx4MDFceDA1XHgwNVx4MDIifTsKLQotCS8qIFJGQyA0NDYyIHNheXMgd2UgTVVTVCBOT1QgZG8gU1BORUdPICovCi0JaWYgKG9pZC0+bGVuZ3RoID09IHNwbmVnb19vaWQubGVuZ3RoICYmIAotCSAgICAobWVtY21wKG9pZC0+ZWxlbWVudHMsIHNwbmVnb19vaWQuZWxlbWVudHMsIG9pZC0+bGVuZ3RoKSA9PSAwKSkKLQkJcmV0dXJuIDA7IC8qIGZhbHNlICovCi0KLQlzc2hfZ3NzYXBpX2J1aWxkX2N0eChjdHgpOwotCXNzaF9nc3NhcGlfc2V0X29pZCgqY3R4LCBvaWQpOwotCW1ham9yID0gc3NoX2dzc2FwaV9pbXBvcnRfbmFtZSgqY3R4LCBob3N0KTsKLQlpZiAoIUdTU19FUlJPUihtYWpvcikpIHsKLQkJbWFqb3IgPSBzc2hfZ3NzYXBpX2luaXRfY3R4KCpjdHgsIDAsIEdTU19DX05PX0JVRkZFUiwgJnRva2VuLCAKLQkJICAgIE5VTEwpOwotCQlnc3NfcmVsZWFzZV9idWZmZXIoJm1pbm9yLCAmdG9rZW4pOwotCQlpZiAoKCpjdHgpLT5jb250ZXh0ICE9IEdTU19DX05PX0NPTlRFWFQpCi0JCQlnc3NfZGVsZXRlX3NlY19jb250ZXh0KCZtaW5vciwgJigqY3R4KS0+Y29udGV4dCwKLQkJCSAgICBHU1NfQ19OT19CVUZGRVIpOwotCX0KLQotCWlmIChHU1NfRVJST1IobWFqb3IpKSAKLQkJc3NoX2dzc2FwaV9kZWxldGVfY3R4KGN0eCk7Ci0KLQlyZXR1cm4gKCFHU1NfRVJST1IobWFqb3IpKTsKLX0KLQotI2VuZGlmIC8qIEdTU0FQSSAqLwpkaWZmIC0tZ2l0IGEvZ3NzLXNlcnYta3JiNS5jIGIvZ3NzLXNlcnYta3JiNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTYyNWFjLi4wMDAwMDAwCi0tLSBhL2dzcy1zZXJ2LWtyYjUuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKiAkT3BlbkJTRDogZ3NzLXNlcnYta3JiNS5jLHYgMS43IDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgU2ltb24gV2lsa2luc29uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZkZWYgR1NTQVBJCi0jaWZkZWYgS1JCNQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotI2luY2x1ZGUgImF1dGguaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJzZXJ2Y29uZi5oIgotCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAic3NoLWdzcy5oIgotCi1leHRlcm4gU2VydmVyT3B0aW9ucyBvcHRpb25zOwotCi0jaWZkZWYgSEVJTURBTAotIyBpbmNsdWRlIDxrcmI1Lmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX0dTU0FQSV9LUkI1X0gKLSMgIGluY2x1ZGUgPGdzc2FwaV9rcmI1Lmg+Ci0jIGVsaWYgSEFWRV9HU1NBUElfR1NTQVBJX0tSQjVfSAotIyAgaW5jbHVkZSA8Z3NzYXBpL2dzc2FwaV9rcmI1Lmg+Ci0jIGVuZGlmCi0jZW5kaWYKLQotc3RhdGljIGtyYjVfY29udGV4dCBrcmJfY29udGV4dCA9IE5VTEw7Ci0KLS8qIEluaXRpYWxpc2UgdGhlIGtyYjUgbGlicmFyeSwgZm9yIHRoZSBzdHVmZiB0aGF0IEdTU0FQSSB3b24ndCBkbyAqLwotCi1zdGF0aWMgaW50Ci1zc2hfZ3NzYXBpX2tyYjVfaW5pdCh2b2lkKQotewotCWtyYjVfZXJyb3JfY29kZSBwcm9ibGVtOwotCi0JaWYgKGtyYl9jb250ZXh0ICE9IE5VTEwpCi0JCXJldHVybiAxOwotCi0JcHJvYmxlbSA9IGtyYjVfaW5pdF9jb250ZXh0KCZrcmJfY29udGV4dCk7Ci0JaWYgKHByb2JsZW0pIHsKLQkJbG9naXQoIkNhbm5vdCBpbml0aWFsaXplIGtyYjUgY29udGV4dCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyogQ2hlY2sgaWYgdGhpcyB1c2VyIGlzIE9LIHRvIGxvZ2luLiBUaGlzIG9ubHkgd29ya3Mgd2l0aCBrcmI1IC0gb3RoZXIKLSAqIEdTU0FQSSBtZWNoYW5pc21zIHdpbGwgbmVlZCB0aGVpciBvd24uCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHVzZXIgaXMgT0sgdG8gbG9nIGluLCBvdGhlcndpc2UgcmV0dXJucyAwCi0gKi8KLQotc3RhdGljIGludAotc3NoX2dzc2FwaV9rcmI1X3VzZXJvayhzc2hfZ3NzYXBpX2NsaWVudCAqY2xpZW50LCBjaGFyICpuYW1lKQotewotCWtyYjVfcHJpbmNpcGFsIHByaW5jOwotCWludCByZXR2YWw7Ci0KLQlpZiAoc3NoX2dzc2FwaV9rcmI1X2luaXQoKSA9PSAwKQotCQlyZXR1cm4gMDsKLQotCWlmICgocmV0dmFsID0ga3JiNV9wYXJzZV9uYW1lKGtyYl9jb250ZXh0LCBjbGllbnQtPmV4cG9ydGVkbmFtZS52YWx1ZSwKLQkgICAgJnByaW5jKSkpIHsKLQkJbG9naXQoImtyYjVfcGFyc2VfbmFtZSgpOiAlLjEwMHMiLAotCQkgICAga3JiNV9nZXRfZXJyX3RleHQoa3JiX2NvbnRleHQsIHJldHZhbCkpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGtyYjVfa3VzZXJvayhrcmJfY29udGV4dCwgcHJpbmMsIG5hbWUpKSB7Ci0JCXJldHZhbCA9IDE7Ci0JCWxvZ2l0KCJBdXRob3JpemVkIHRvICVzLCBrcmI1IHByaW5jaXBhbCAlcyAoa3JiNV9rdXNlcm9rKSIsCi0JCSAgICBuYW1lLCAoY2hhciAqKWNsaWVudC0+ZGlzcGxheW5hbWUudmFsdWUpOwotCX0gZWxzZQotCQlyZXR2YWwgPSAwOwotCi0Ja3JiNV9mcmVlX3ByaW5jaXBhbChrcmJfY29udGV4dCwgcHJpbmMpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLQotLyogVGhpcyB3cml0ZXMgb3V0IGFueSBmb3J3YXJkZWQgY3JlZGVudGlhbHMgZnJvbSB0aGUgc3RydWN0dXJlIHBvcHVsYXRlZAotICogZHVyaW5nIHVzZXJhdXRoLiBDYWxsZWQgYWZ0ZXIgd2UgaGF2ZSBzZXR1aWQgdG8gdGhlIHVzZXIgKi8KLQotc3RhdGljIHZvaWQKLXNzaF9nc3NhcGlfa3JiNV9zdG9yZWNyZWRzKHNzaF9nc3NhcGlfY2xpZW50ICpjbGllbnQpCi17Ci0Ja3JiNV9jY2FjaGUgY2NhY2hlOwotCWtyYjVfZXJyb3JfY29kZSBwcm9ibGVtOwotCWtyYjVfcHJpbmNpcGFsIHByaW5jOwotCU9NX3VpbnQzMiBtYWpfc3RhdHVzLCBtaW5fc3RhdHVzOwotCWludCBsZW47Ci0KLQlpZiAoY2xpZW50LT5jcmVkcyA9PSBOVUxMKSB7Ci0JCWRlYnVnKCJObyBjcmVkZW50aWFscyBzdG9yZWQiKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChzc2hfZ3NzYXBpX2tyYjVfaW5pdCgpID09IDApCi0JCXJldHVybjsKLQotI2lmZGVmIEhFSU1EQUwKLQlpZiAoKHByb2JsZW0gPSBrcmI1X2NjX2dlbl9uZXcoa3JiX2NvbnRleHQsICZrcmI1X2ZjY19vcHMsICZjY2FjaGUpKSkgewotCQlsb2dpdCgia3JiNV9jY19nZW5fbmV3KCk6ICUuMTAwcyIsCi0JCSAgICBrcmI1X2dldF9lcnJfdGV4dChrcmJfY29udGV4dCwgcHJvYmxlbSkpOwotCQlyZXR1cm47Ci0JfQotI2Vsc2UKLQlpZiAoKHByb2JsZW0gPSBzc2hfa3JiNV9jY19nZW4oa3JiX2NvbnRleHQsICZjY2FjaGUpKSkgewotCQlsb2dpdCgic3NoX2tyYjVfY2NfZ2VuKCk6ICUuMTAwcyIsCi0JCSAgICBrcmI1X2dldF9lcnJfdGV4dChrcmJfY29udGV4dCwgcHJvYmxlbSkpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCS8qICNpZmRlZiBIRUlNREFMICovCi0KLQlpZiAoKHByb2JsZW0gPSBrcmI1X3BhcnNlX25hbWUoa3JiX2NvbnRleHQsCi0JICAgIGNsaWVudC0+ZXhwb3J0ZWRuYW1lLnZhbHVlLCAmcHJpbmMpKSkgewotCQlsb2dpdCgia3JiNV9wYXJzZV9uYW1lKCk6ICUuMTAwcyIsCi0JCSAgICBrcmI1X2dldF9lcnJfdGV4dChrcmJfY29udGV4dCwgcHJvYmxlbSkpOwotCQlrcmI1X2NjX2Rlc3Ryb3koa3JiX2NvbnRleHQsIGNjYWNoZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoKHByb2JsZW0gPSBrcmI1X2NjX2luaXRpYWxpemUoa3JiX2NvbnRleHQsIGNjYWNoZSwgcHJpbmMpKSkgewotCQlsb2dpdCgia3JiNV9jY19pbml0aWFsaXplKCk6ICUuMTAwcyIsCi0JCSAgICBrcmI1X2dldF9lcnJfdGV4dChrcmJfY29udGV4dCwgcHJvYmxlbSkpOwotCQlrcmI1X2ZyZWVfcHJpbmNpcGFsKGtyYl9jb250ZXh0LCBwcmluYyk7Ci0JCWtyYjVfY2NfZGVzdHJveShrcmJfY29udGV4dCwgY2NhY2hlKTsKLQkJcmV0dXJuOwotCX0KLQotCWtyYjVfZnJlZV9wcmluY2lwYWwoa3JiX2NvbnRleHQsIHByaW5jKTsKLQotCWlmICgobWFqX3N0YXR1cyA9IGdzc19rcmI1X2NvcHlfY2NhY2hlKCZtaW5fc3RhdHVzLAotCSAgICBjbGllbnQtPmNyZWRzLCBjY2FjaGUpKSkgewotCQlsb2dpdCgiZ3NzX2tyYjVfY29weV9jY2FjaGUoKSBmYWlsZWQiKTsKLQkJa3JiNV9jY19kZXN0cm95KGtyYl9jb250ZXh0LCBjY2FjaGUpOwotCQlyZXR1cm47Ci0JfQotCi0JY2xpZW50LT5zdG9yZS5maWxlbmFtZSA9IHhzdHJkdXAoa3JiNV9jY19nZXRfbmFtZShrcmJfY29udGV4dCwgY2NhY2hlKSk7Ci0JY2xpZW50LT5zdG9yZS5lbnZ2YXIgPSAiS1JCNUNDTkFNRSI7Ci0JbGVuID0gc3RybGVuKGNsaWVudC0+c3RvcmUuZmlsZW5hbWUpICsgNjsKLQljbGllbnQtPnN0b3JlLmVudnZhbCA9IHhtYWxsb2MobGVuKTsKLQlzbnByaW50ZihjbGllbnQtPnN0b3JlLmVudnZhbCwgbGVuLCAiRklMRTolcyIsIGNsaWVudC0+c3RvcmUuZmlsZW5hbWUpOwotCi0jaWZkZWYgVVNFX1BBTQotCWlmIChvcHRpb25zLnVzZV9wYW0pCi0JCWRvX3BhbV9wdXRlbnYoY2xpZW50LT5zdG9yZS5lbnZ2YXIsIGNsaWVudC0+c3RvcmUuZW52dmFsKTsKLSNlbmRpZgotCi0Ja3JiNV9jY19jbG9zZShrcmJfY29udGV4dCwgY2NhY2hlKTsKLQotCXJldHVybjsKLX0KLQotc3NoX2dzc2FwaV9tZWNoIGdzc2FwaV9rZXJiZXJvc19tZWNoID0gewotCSJ0b1dNNVNsdzVFdzhNcWtheSthbDJnPT0iLAotCSJLZXJiZXJvcyIsCi0JezksICJceDJBXHg4Nlx4NDhceDg2XHhGN1x4MTJceDAxXHgwMlx4MDIifSwKLQlOVUxMLAotCSZzc2hfZ3NzYXBpX2tyYjVfdXNlcm9rLAotCU5VTEwsCi0JJnNzaF9nc3NhcGlfa3JiNV9zdG9yZWNyZWRzCi19OwotCi0jZW5kaWYgLyogS1JCNSAqLwotCi0jZW5kaWYgLyogR1NTQVBJICovCmRpZmYgLS1naXQgYS9nc3Mtc2Vydi5jIGIvZ3NzLXNlcnYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcxOWMxMy4uMDAwMDAwMAotLS0gYS9nc3Mtc2Vydi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8qICRPcGVuQlNEOiBnc3Mtc2Vydi5jLHYgMS4yMyAyMDExLzA4LzAxIDE5OjE4OjE1IG1hcmt1cyBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgU2ltb24gV2lsa2luc29uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZkZWYgR1NTQVBJCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgiCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImNoYW5uZWxzLmgiCi0jaW5jbHVkZSAic2Vzc2lvbi5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLQotI2luY2x1ZGUgInNzaC1nc3MuaCIKLQotc3RhdGljIHNzaF9nc3NhcGlfY2xpZW50IGdzc2FwaV9jbGllbnQgPQotICAgIHsgR1NTX0NfRU1QVFlfQlVGRkVSLCBHU1NfQ19FTVBUWV9CVUZGRVIsCi0gICAgR1NTX0NfTk9fQ1JFREVOVElBTCwgTlVMTCwge05VTEwsIE5VTEwsIE5VTEx9fTsKLQotc3NoX2dzc2FwaV9tZWNoIGdzc2FwaV9udWxsX21lY2ggPQotICAgIHsgTlVMTCwgTlVMTCwgezAsIE5VTEx9LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsKLQotI2lmZGVmIEtSQjUKLWV4dGVybiBzc2hfZ3NzYXBpX21lY2ggZ3NzYXBpX2tlcmJlcm9zX21lY2g7Ci0jZW5kaWYKLQotc3NoX2dzc2FwaV9tZWNoKiBzdXBwb3J0ZWRfbWVjaHNbXT0gewotI2lmZGVmIEtSQjUKLQkmZ3NzYXBpX2tlcmJlcm9zX21lY2gsCi0jZW5kaWYKLQkmZ3NzYXBpX251bGxfbWVjaCwKLX07Ci0KLQotLyoKLSAqIEFjcXVpcmUgY3JlZGVudGlhbHMgZm9yIGEgc2VydmVyIHJ1bm5pbmcgb24gdGhlIGN1cnJlbnQgaG9zdC4KLSAqIFJlcXVpcmVzIHRoYXQgdGhlIGNvbnRleHQgc3RydWN0dXJlIGNvbnRhaW5zIGEgdmFsaWQgT0lECi0gKi8KLQotLyogUmV0dXJucyBhIEdTU0FQSSBlcnJvciBjb2RlICovCi0vKiBQcml2aWxlZ2VkIChjYWxsZWQgZnJvbSBzc2hfZ3NzYXBpX3NlcnZlcl9jdHgpICovCi1zdGF0aWMgT01fdWludDMyCi1zc2hfZ3NzYXBpX2FjcXVpcmVfY3JlZChHc3NjdHh0ICpjdHgpCi17Ci0JT01fdWludDMyIHN0YXR1czsKLQljaGFyIGxuYW1lW01BWEhPU1ROQU1FTEVOXTsKLQlnc3NfT0lEX3NldCBvaWRzZXQ7Ci0KLQlnc3NfY3JlYXRlX2VtcHR5X29pZF9zZXQoJnN0YXR1cywgJm9pZHNldCk7Ci0JZ3NzX2FkZF9vaWRfc2V0X21lbWJlcigmc3RhdHVzLCBjdHgtPm9pZCwgJm9pZHNldCk7Ci0KLQlpZiAoZ2V0aG9zdG5hbWUobG5hbWUsIE1BWEhPU1ROQU1FTEVOKSkgewotCQlnc3NfcmVsZWFzZV9vaWRfc2V0KCZzdGF0dXMsICZvaWRzZXQpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQlpZiAoR1NTX0VSUk9SKHNzaF9nc3NhcGlfaW1wb3J0X25hbWUoY3R4LCBsbmFtZSkpKSB7Ci0JCWdzc19yZWxlYXNlX29pZF9zZXQoJnN0YXR1cywgJm9pZHNldCk7Ci0JCXJldHVybiAoY3R4LT5tYWpvcik7Ci0JfQotCi0JaWYgKChjdHgtPm1ham9yID0gZ3NzX2FjcXVpcmVfY3JlZCgmY3R4LT5taW5vciwKLQkgICAgY3R4LT5uYW1lLCAwLCBvaWRzZXQsIEdTU19DX0FDQ0VQVCwgJmN0eC0+Y3JlZHMsIE5VTEwsIE5VTEwpKSkKLQkJc3NoX2dzc2FwaV9lcnJvcihjdHgpOwotCi0JZ3NzX3JlbGVhc2Vfb2lkX3NldCgmc3RhdHVzLCAmb2lkc2V0KTsKLQlyZXR1cm4gKGN0eC0+bWFqb3IpOwotfQotCi0vKiBQcml2aWxlZ2VkICovCi1PTV91aW50MzIKLXNzaF9nc3NhcGlfc2VydmVyX2N0eChHc3NjdHh0ICoqY3R4LCBnc3NfT0lEIG9pZCkKLXsKLQlpZiAoKmN0eCkKLQkJc3NoX2dzc2FwaV9kZWxldGVfY3R4KGN0eCk7Ci0Jc3NoX2dzc2FwaV9idWlsZF9jdHgoY3R4KTsKLQlzc2hfZ3NzYXBpX3NldF9vaWQoKmN0eCwgb2lkKTsKLQlyZXR1cm4gKHNzaF9nc3NhcGlfYWNxdWlyZV9jcmVkKCpjdHgpKTsKLX0KLQotLyogVW5wcml2aWxlZ2VkICovCi12b2lkCi1zc2hfZ3NzYXBpX3N1cHBvcnRlZF9vaWRzKGdzc19PSURfc2V0ICpvaWRzZXQpCi17Ci0JaW50IGkgPSAwOwotCU9NX3VpbnQzMiBtaW5fc3RhdHVzOwotCWludCBwcmVzZW50OwotCWdzc19PSURfc2V0IHN1cHBvcnRlZDsKLQotCWdzc19jcmVhdGVfZW1wdHlfb2lkX3NldCgmbWluX3N0YXR1cywgb2lkc2V0KTsKLQlnc3NfaW5kaWNhdGVfbWVjaHMoJm1pbl9zdGF0dXMsICZzdXBwb3J0ZWQpOwotCi0Jd2hpbGUgKHN1cHBvcnRlZF9tZWNoc1tpXS0+bmFtZSAhPSBOVUxMKSB7Ci0JCWlmIChHU1NfRVJST1IoZ3NzX3Rlc3Rfb2lkX3NldF9tZW1iZXIoJm1pbl9zdGF0dXMsCi0JCSAgICAmc3VwcG9ydGVkX21lY2hzW2ldLT5vaWQsIHN1cHBvcnRlZCwgJnByZXNlbnQpKSkKLQkJCXByZXNlbnQgPSAwOwotCQlpZiAocHJlc2VudCkKLQkJCWdzc19hZGRfb2lkX3NldF9tZW1iZXIoJm1pbl9zdGF0dXMsCi0JCQkgICAgJnN1cHBvcnRlZF9tZWNoc1tpXS0+b2lkLCBvaWRzZXQpOwotCQlpKys7Ci0JfQotCi0JZ3NzX3JlbGVhc2Vfb2lkX3NldCgmbWluX3N0YXR1cywgJnN1cHBvcnRlZCk7Ci19Ci0KLQotLyogV3JhcHBlciBhcm91bmQgYWNjZXB0X3NlY19jb250ZXh0Ci0gKiBSZXF1aXJlcyB0aGF0IHRoZSBjb250ZXh0IGNvbnRhaW5zOgotICogICAgb2lkCi0gKiAgICBjcmVkZW50aWFscwkoZnJvbSBzc2hfZ3NzYXBpX2FjcXVpcmVfY3JlZCkKLSAqLwotLyogUHJpdmlsZWdlZCAqLwotT01fdWludDMyCi1zc2hfZ3NzYXBpX2FjY2VwdF9jdHgoR3NzY3R4dCAqY3R4LCBnc3NfYnVmZmVyX2Rlc2MgKnJlY3ZfdG9rLAotICAgIGdzc19idWZmZXJfZGVzYyAqc2VuZF90b2ssIE9NX3VpbnQzMiAqZmxhZ3MpCi17Ci0JT01fdWludDMyIHN0YXR1czsKLQlnc3NfT0lEIG1lY2g7Ci0KLQljdHgtPm1ham9yID0gZ3NzX2FjY2VwdF9zZWNfY29udGV4dCgmY3R4LT5taW5vciwKLQkgICAgJmN0eC0+Y29udGV4dCwgY3R4LT5jcmVkcywgcmVjdl90b2ssCi0JICAgIEdTU19DX05PX0NIQU5ORUxfQklORElOR1MsICZjdHgtPmNsaWVudCwgJm1lY2gsCi0JICAgIHNlbmRfdG9rLCBmbGFncywgTlVMTCwgJmN0eC0+Y2xpZW50X2NyZWRzKTsKLQotCWlmIChHU1NfRVJST1IoY3R4LT5tYWpvcikpCi0JCXNzaF9nc3NhcGlfZXJyb3IoY3R4KTsKLQotCWlmIChjdHgtPmNsaWVudF9jcmVkcykKLQkJZGVidWcoIlJlY2VpdmVkIHNvbWUgY2xpZW50IGNyZWRlbnRpYWxzIik7Ci0JZWxzZQotCQlkZWJ1ZygiR290IG5vIGNsaWVudCBjcmVkZW50aWFscyIpOwotCi0Jc3RhdHVzID0gY3R4LT5tYWpvcjsKLQotCS8qIE5vdywgaWYgd2UncmUgY29tcGxldGUgYW5kIHdlIGhhdmUgdGhlIHJpZ2h0IGZsYWdzLCB0aGVuCi0JICogd2UgZmxhZyB0aGUgdXNlciBhcyBhbHNvIGhhdmluZyBiZWVuIGF1dGhlbnRpY2F0ZWQKLQkgKi8KLQotCWlmICgoKGZsYWdzID09IE5VTEwpIHx8ICgoKmZsYWdzICYgR1NTX0NfTVVUVUFMX0ZMQUcpICYmCi0JICAgICgqZmxhZ3MgJiBHU1NfQ19JTlRFR19GTEFHKSkpICYmIChjdHgtPm1ham9yID09IEdTU19TX0NPTVBMRVRFKSkgewotCQlpZiAoc3NoX2dzc2FwaV9nZXRjbGllbnQoY3R4LCAmZ3NzYXBpX2NsaWVudCkpCi0JCQlmYXRhbCgiQ291bGRuJ3QgY29udmVydCBjbGllbnQgbmFtZSIpOwotCX0KLQotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoKLSAqIFRoaXMgcGFyc2VzIGFuIGV4cG9ydGVkIG5hbWUsIGV4dHJhY3RpbmcgdGhlIG1lY2hhbmlzbSBzcGVjaWZpYyBwb3J0aW9uCi0gKiB0byB1c2UgZm9yIEFDTCBjaGVja2luZy4gSXQgdmVyaWZpZXMgdGhhdCB0aGUgbmFtZSBiZWxvbmdzIHRoZSBtZWNoYW5pc20KLSAqIG9yaWdpbmFsbHkgc2VsZWN0ZWQuCi0gKi8KLXN0YXRpYyBPTV91aW50MzIKLXNzaF9nc3NhcGlfcGFyc2VfZW5hbWUoR3NzY3R4dCAqY3R4LCBnc3NfYnVmZmVyX3QgZW5hbWUsIGdzc19idWZmZXJfdCBuYW1lKQotewotCXVfY2hhciAqdG9rOwotCU9NX3VpbnQzMiBvZmZzZXQ7Ci0JT01fdWludDMyIG9pZGw7Ci0KLQl0b2sgPSBlbmFtZS0+dmFsdWU7Ci0KLQkvKgotCSAqIENoZWNrIHRoYXQgZW5hbWUgaXMgbG9uZyBlbm91Z2ggZm9yIGFsbCBvZiB0aGUgZml4ZWQgbGVuZ3RoCi0JICogaGVhZGVyLCBhbmQgdGhhdCB0aGUgaW5pdGlhbCBJRCBieXRlcyBhcmUgY29ycmVjdAotCSAqLwotCi0JaWYgKGVuYW1lLT5sZW5ndGggPCA2IHx8IG1lbWNtcCh0b2ssICJceDA0XHgwMSIsIDIpICE9IDApCi0JCXJldHVybiBHU1NfU19GQUlMVVJFOwotCi0JLyoKLQkgKiBFeHRyYWN0IHRoZSBPSUQsIGFuZCBjaGVjayBpdC4gSGVyZSBHU1NBUEkgYnJlYWtzIHdpdGggdHJhZGl0aW9uCi0JICogYW5kIGRvZXMgdXNlIHRoZSBPSUQgdHlwZSBhbmQgbGVuZ3RoIGJ5dGVzLiBUbyBjb25mdXNlIHRoaW5ncwotCSAqIHRoZXJlIGFyZSB0d28gbGVuZ3RocyAtIHRoZSBmaXJzdCBpbmNsdWRpbmcgdGhlc2UsIGFuZCB0aGUKLQkgKiBzZWNvbmQgd2l0aG91dC4KLQkgKi8KLQotCW9pZGwgPSBnZXRfdTE2KHRvaysyKTsgLyogbGVuZ3RoIGluY2x1ZGluZyBuZXh0IHR3byBieXRlcyAqLwotCW9pZGwgPSBvaWRsLTI7IC8qIHR1cm4gaXQgaW50byB0aGUgX3JlYWxfIGxlbmd0aCBvZiB0aGUgdmFyaWFibGUgT0lEICovCi0KLQkvKgotCSAqIENoZWNrIHRoZSBCRVIgZW5jb2RpbmcgZm9yIGNvcnJlY3QgdHlwZSBhbmQgbGVuZ3RoLCB0aGF0IHRoZQotCSAqIHN0cmluZyBpcyBsb25nIGVub3VnaCBhbmQgdGhhdCB0aGUgT0lEIG1hdGNoZXMgdGhhdCBpbiBvdXIgY29udGV4dAotCSAqLwotCWlmICh0b2tbNF0gIT0gMHgwNiB8fCB0b2tbNV0gIT0gb2lkbCB8fAotCSAgICBlbmFtZS0+bGVuZ3RoIDwgb2lkbCs2IHx8Ci0JICAgICFzc2hfZ3NzYXBpX2NoZWNrX29pZChjdHgsIHRvays2LCBvaWRsKSkKLQkJcmV0dXJuIEdTU19TX0ZBSUxVUkU7Ci0KLQlvZmZzZXQgPSBvaWRsKzY7Ci0KLQlpZiAoZW5hbWUtPmxlbmd0aCA8IG9mZnNldCs0KQotCQlyZXR1cm4gR1NTX1NfRkFJTFVSRTsKLQotCW5hbWUtPmxlbmd0aCA9IGdldF91MzIodG9rK29mZnNldCk7Ci0Jb2Zmc2V0ICs9IDQ7Ci0KLQlpZiAoVUlOVF9NQVggLSBvZmZzZXQgPCBuYW1lLT5sZW5ndGgpCi0JCXJldHVybiBHU1NfU19GQUlMVVJFOwotCWlmIChlbmFtZS0+bGVuZ3RoIDwgb2Zmc2V0K25hbWUtPmxlbmd0aCkKLQkJcmV0dXJuIEdTU19TX0ZBSUxVUkU7Ci0KLQluYW1lLT52YWx1ZSA9IHhtYWxsb2MobmFtZS0+bGVuZ3RoKzEpOwotCW1lbWNweShuYW1lLT52YWx1ZSwgdG9rK29mZnNldCwgbmFtZS0+bGVuZ3RoKTsKLQkoKGNoYXIgKiluYW1lLT52YWx1ZSlbbmFtZS0+bGVuZ3RoXSA9IDA7Ci0KLQlyZXR1cm4gR1NTX1NfQ09NUExFVEU7Ci19Ci0KLS8qIEV4dHJhY3QgdGhlIGNsaWVudCBkZXRhaWxzIGZyb20gYSBnaXZlbiBjb250ZXh0LiBUaGlzIGNhbiBvbmx5IHJlbGlhYmx5Ci0gKiBiZSBjYWxsZWQgb25jZSBmb3IgYSBjb250ZXh0ICovCi0KLS8qIFByaXZpbGVnZWQgKGNhbGxlZCBmcm9tIGFjY2VwdF9zZWN1cmVfY3R4KSAqLwotT01fdWludDMyCi1zc2hfZ3NzYXBpX2dldGNsaWVudChHc3NjdHh0ICpjdHgsIHNzaF9nc3NhcGlfY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IGkgPSAwOwotCi0JZ3NzX2J1ZmZlcl9kZXNjIGVuYW1lOwotCi0JY2xpZW50LT5tZWNoID0gTlVMTDsKLQotCXdoaWxlIChzdXBwb3J0ZWRfbWVjaHNbaV0tPm5hbWUgIT0gTlVMTCkgewotCQlpZiAoc3VwcG9ydGVkX21lY2hzW2ldLT5vaWQubGVuZ3RoID09IGN0eC0+b2lkLT5sZW5ndGggJiYKLQkJICAgIChtZW1jbXAoc3VwcG9ydGVkX21lY2hzW2ldLT5vaWQuZWxlbWVudHMsCi0JCSAgICBjdHgtPm9pZC0+ZWxlbWVudHMsIGN0eC0+b2lkLT5sZW5ndGgpID09IDApKQotCQkJY2xpZW50LT5tZWNoID0gc3VwcG9ydGVkX21lY2hzW2ldOwotCQlpKys7Ci0JfQotCi0JaWYgKGNsaWVudC0+bWVjaCA9PSBOVUxMKQotCQlyZXR1cm4gR1NTX1NfRkFJTFVSRTsKLQotCWlmICgoY3R4LT5tYWpvciA9IGdzc19kaXNwbGF5X25hbWUoJmN0eC0+bWlub3IsIGN0eC0+Y2xpZW50LAotCSAgICAmY2xpZW50LT5kaXNwbGF5bmFtZSwgTlVMTCkpKSB7Ci0JCXNzaF9nc3NhcGlfZXJyb3IoY3R4KTsKLQkJcmV0dXJuIChjdHgtPm1ham9yKTsKLQl9Ci0KLQlpZiAoKGN0eC0+bWFqb3IgPSBnc3NfZXhwb3J0X25hbWUoJmN0eC0+bWlub3IsIGN0eC0+Y2xpZW50LAotCSAgICAmZW5hbWUpKSkgewotCQlzc2hfZ3NzYXBpX2Vycm9yKGN0eCk7Ci0JCXJldHVybiAoY3R4LT5tYWpvcik7Ci0JfQotCi0JaWYgKChjdHgtPm1ham9yID0gc3NoX2dzc2FwaV9wYXJzZV9lbmFtZShjdHgsJmVuYW1lLAotCSAgICAmY2xpZW50LT5leHBvcnRlZG5hbWUpKSkgewotCQlyZXR1cm4gKGN0eC0+bWFqb3IpOwotCX0KLQotCS8qIFdlIGNhbid0IGNvcHkgdGhpcyBzdHJ1Y3R1cmUsIHNvIHdlIGp1c3QgbW92ZSB0aGUgcG9pbnRlciB0byBpdCAqLwotCWNsaWVudC0+Y3JlZHMgPSBjdHgtPmNsaWVudF9jcmVkczsKLQljdHgtPmNsaWVudF9jcmVkcyA9IEdTU19DX05PX0NSRURFTlRJQUw7Ci0JcmV0dXJuIChjdHgtPm1ham9yKTsKLX0KLQotLyogQXMgdXNlciAtIGNhbGxlZCBvbiBmYXRhbC9leGl0ICovCi12b2lkCi1zc2hfZ3NzYXBpX2NsZWFudXBfY3JlZHModm9pZCkKLXsKLQlpZiAoZ3NzYXBpX2NsaWVudC5zdG9yZS5maWxlbmFtZSAhPSBOVUxMKSB7Ci0JCS8qIFVubGluayBwcm9iYWJseSBpc24ndCBzdWZmaWNpZW50ICovCi0JCWRlYnVnKCJyZW1vdmluZyBnc3NhcGkgY3JlZCBmaWxlXCIlc1wiIiwKLQkJICAgIGdzc2FwaV9jbGllbnQuc3RvcmUuZmlsZW5hbWUpOwotCQl1bmxpbmsoZ3NzYXBpX2NsaWVudC5zdG9yZS5maWxlbmFtZSk7Ci0JfQotfQotCi0vKiBBcyB1c2VyICovCi12b2lkCi1zc2hfZ3NzYXBpX3N0b3JlY3JlZHModm9pZCkKLXsKLQlpZiAoZ3NzYXBpX2NsaWVudC5tZWNoICYmIGdzc2FwaV9jbGllbnQubWVjaC0+c3RvcmVjcmVkcykgewotCQkoKmdzc2FwaV9jbGllbnQubWVjaC0+c3RvcmVjcmVkcykoJmdzc2FwaV9jbGllbnQpOwotCX0gZWxzZQotCQlkZWJ1Zygic3NoX2dzc2FwaV9zdG9yZWNyZWRzOiBOb3QgYSBHU1NBUEkgbWVjaGFuaXNtIik7Ci19Ci0KLS8qIFRoaXMgYWxsb3dzIEdTU0FQSSBtZXRob2RzIHRvIGRvIHRoaW5ncyB0byB0aGUgY2hpbGRzIGVudmlyb25tZW50IGJhc2VkCi0gKiBvbiB0aGUgcGFzc2VkIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgYW5kIGNyZWRlbnRpYWxzLgotICovCi0vKiBBcyB1c2VyICovCi12b2lkCi1zc2hfZ3NzYXBpX2RvX2NoaWxkKGNoYXIgKioqZW52cCwgdV9pbnQgKmVudnNpemVwKQotewotCi0JaWYgKGdzc2FwaV9jbGllbnQuc3RvcmUuZW52dmFyICE9IE5VTEwgJiYKLQkgICAgZ3NzYXBpX2NsaWVudC5zdG9yZS5lbnZ2YWwgIT0gTlVMTCkgewotCQlkZWJ1ZygiU2V0dGluZyAlcyB0byAlcyIsIGdzc2FwaV9jbGllbnQuc3RvcmUuZW52dmFyLAotCQkgICAgZ3NzYXBpX2NsaWVudC5zdG9yZS5lbnZ2YWwpOwotCQljaGlsZF9zZXRfZW52KGVudnAsIGVudnNpemVwLCBnc3NhcGlfY2xpZW50LnN0b3JlLmVudnZhciwKLQkJICAgIGdzc2FwaV9jbGllbnQuc3RvcmUuZW52dmFsKTsKLQl9Ci19Ci0KLS8qIFByaXZpbGVnZWQgKi8KLWludAotc3NoX2dzc2FwaV91c2Vyb2soY2hhciAqdXNlcikKLXsKLQlPTV91aW50MzIgbG1pbjsKLQotCWlmIChnc3NhcGlfY2xpZW50LmV4cG9ydGVkbmFtZS5sZW5ndGggPT0gMCB8fAotCSAgICBnc3NhcGlfY2xpZW50LmV4cG9ydGVkbmFtZS52YWx1ZSA9PSBOVUxMKSB7Ci0JCWRlYnVnKCJObyBzdWl0YWJsZSBjbGllbnQgZGF0YSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGdzc2FwaV9jbGllbnQubWVjaCAmJiBnc3NhcGlfY2xpZW50Lm1lY2gtPnVzZXJvaykKLQkJaWYgKCgqZ3NzYXBpX2NsaWVudC5tZWNoLT51c2Vyb2spKCZnc3NhcGlfY2xpZW50LCB1c2VyKSkKLQkJCXJldHVybiAxOwotCQllbHNlIHsKLQkJCS8qIERlc3Ryb3kgZGVsZWdhdGVkIGNyZWRlbnRpYWxzIGlmIHVzZXJvayBmYWlscyAqLwotCQkJZ3NzX3JlbGVhc2VfYnVmZmVyKCZsbWluLCAmZ3NzYXBpX2NsaWVudC5kaXNwbGF5bmFtZSk7Ci0JCQlnc3NfcmVsZWFzZV9idWZmZXIoJmxtaW4sICZnc3NhcGlfY2xpZW50LmV4cG9ydGVkbmFtZSk7Ci0JCQlnc3NfcmVsZWFzZV9jcmVkKCZsbWluLCAmZ3NzYXBpX2NsaWVudC5jcmVkcyk7Ci0JCQltZW1zZXQoJmdzc2FwaV9jbGllbnQsIDAsIHNpemVvZihzc2hfZ3NzYXBpX2NsaWVudCkpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQllbHNlCi0JCWRlYnVnKCJzc2hfZ3NzYXBpX3VzZXJvazogVW5rbm93biBHU1NBUEkgbWVjaGFuaXNtIik7Ci0JcmV0dXJuICgwKTsKLX0KLQotLyogUHJpdmlsZWdlZCAqLwotT01fdWludDMyCi1zc2hfZ3NzYXBpX2NoZWNrbWljKEdzc2N0eHQgKmN0eCwgZ3NzX2J1ZmZlcl90IGdzc2J1ZiwgZ3NzX2J1ZmZlcl90IGdzc21pYykKLXsKLQljdHgtPm1ham9yID0gZ3NzX3ZlcmlmeV9taWMoJmN0eC0+bWlub3IsIGN0eC0+Y29udGV4dCwKLQkgICAgZ3NzYnVmLCBnc3NtaWMsIE5VTEwpOwotCi0JcmV0dXJuIChjdHgtPm1ham9yKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9ob3N0ZmlsZS5jIGIvaG9zdGZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmOTI0Yi4uMDAwMDAwMAotLS0gYS9ob3N0ZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDg4ICswLDAgQEAKLS8qICRPcGVuQlNEOiBob3N0ZmlsZS5jLHYgMS41MCAyMDEwLzEyLzA0IDEzOjMxOjM3IGRqbSBFeHAgJCAqLwotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIEZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBrbm93biBob3N0cyBmaWxlcy4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgTmllbHMgUHJvdm9zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+Ci0KLSNpbmNsdWRlIDxyZXNvbHYuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgIm1hdGNoLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLXN0cnVjdCBob3N0a2V5cyB7Ci0Jc3RydWN0IGhvc3RrZXlfZW50cnkgKmVudHJpZXM7Ci0JdV9pbnQgbnVtX2VudHJpZXM7Ci19OwotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3NhbHQoY29uc3QgY2hhciAqcywgdV9pbnQgbCwgY2hhciAqc2FsdCwgc2l6ZV90IHNhbHRfbGVuKQotewotCWNoYXIgKnAsICpiNjRzYWx0OwotCXVfaW50IGI2NGxlbjsKLQlpbnQgcmV0OwotCi0JaWYgKGwgPCBzaXplb2YoSEFTSF9NQUdJQykgLSAxKSB7Ci0JCWRlYnVnMigiZXh0cmFjdF9zYWx0OiBzdHJpbmcgdG9vIHNob3J0Iik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlpZiAoc3RybmNtcChzLCBIQVNIX01BR0lDLCBzaXplb2YoSEFTSF9NQUdJQykgLSAxKSAhPSAwKSB7Ci0JCWRlYnVnMigiZXh0cmFjdF9zYWx0OiBpbnZhbGlkIG1hZ2ljIGlkZW50aWZpZXIiKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCXMgKz0gc2l6ZW9mKEhBU0hfTUFHSUMpIC0gMTsKLQlsIC09IHNpemVvZihIQVNIX01BR0lDKSAtIDE7Ci0JaWYgKChwID0gbWVtY2hyKHMsIEhBU0hfREVMSU0sIGwpKSA9PSBOVUxMKSB7Ci0JCWRlYnVnMigiZXh0cmFjdF9zYWx0OiBtaXNzaW5nIHNhbHQgdGVybWluYXRpb24gY2hhcmFjdGVyIik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCWI2NGxlbiA9IHAgLSBzOwotCS8qIFNhbml0eSBjaGVjayAqLwotCWlmIChiNjRsZW4gPT0gMCB8fCBiNjRsZW4gPiAxMDI0KSB7Ci0JCWRlYnVnMigiZXh0cmFjdF9zYWx0OiBiYWQgZW5jb2RlZCBzYWx0IGxlbmd0aCAldSIsIGI2NGxlbik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQliNjRzYWx0ID0geG1hbGxvYygxICsgYjY0bGVuKTsKLQltZW1jcHkoYjY0c2FsdCwgcywgYjY0bGVuKTsKLQliNjRzYWx0W2I2NGxlbl0gPSAnXDAnOwotCi0JcmV0ID0gX19iNjRfcHRvbihiNjRzYWx0LCBzYWx0LCBzYWx0X2xlbik7Ci0JeGZyZWUoYjY0c2FsdCk7Ci0JaWYgKHJldCA9PSAtMSkgewotCQlkZWJ1ZzIoImV4dHJhY3Rfc2FsdDogc2FsdCBkZWNvZGUgZXJyb3IiKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWlmIChyZXQgIT0gU0hBX0RJR0VTVF9MRU5HVEgpIHsKLQkJZGVidWcyKCJleHRyYWN0X3NhbHQ6IGV4cGVjdGVkIHNhbHQgbGVuICVkLCBnb3QgJWQiLAotCQkgICAgU0hBX0RJR0VTVF9MRU5HVEgsIHJldCk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCXJldHVybiAoMCk7Ci19Ci0KLWNoYXIgKgotaG9zdF9oYXNoKGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKm5hbWVfZnJvbV9ob3N0ZmlsZSwgdV9pbnQgc3JjX2xlbikKLXsKLQljb25zdCBFVlBfTUQgKm1kID0gRVZQX3NoYTEoKTsKLQlITUFDX0NUWCBtYWNfY3R4OwotCWNoYXIgc2FsdFsyNTZdLCByZXN1bHRbMjU2XSwgdXVfc2FsdFs1MTJdLCB1dV9yZXN1bHRbNTEyXTsKLQlzdGF0aWMgY2hhciBlbmNvZGVkWzEwMjRdOwotCXVfaW50IGksIGxlbjsKLQotCWxlbiA9IEVWUF9NRF9zaXplKG1kKTsKLQotCWlmIChuYW1lX2Zyb21faG9zdGZpbGUgPT0gTlVMTCkgewotCQkvKiBDcmVhdGUgbmV3IHNhbHQgKi8KLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJc2FsdFtpXSA9IGFyYzRyYW5kb20oKTsKLQl9IGVsc2UgewotCQkvKiBFeHRyYWN0IHNhbHQgZnJvbSBrbm93biBob3N0IGVudHJ5ICovCi0JCWlmIChleHRyYWN0X3NhbHQobmFtZV9mcm9tX2hvc3RmaWxlLCBzcmNfbGVuLCBzYWx0LAotCQkgICAgc2l6ZW9mKHNhbHQpKSA9PSAtMSkKLQkJCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JSE1BQ19Jbml0KCZtYWNfY3R4LCBzYWx0LCBsZW4sIG1kKTsKLQlITUFDX1VwZGF0ZSgmbWFjX2N0eCwgaG9zdCwgc3RybGVuKGhvc3QpKTsKLQlITUFDX0ZpbmFsKCZtYWNfY3R4LCByZXN1bHQsIE5VTEwpOwotCUhNQUNfY2xlYW51cCgmbWFjX2N0eCk7Ci0KLQlpZiAoX19iNjRfbnRvcChzYWx0LCBsZW4sIHV1X3NhbHQsIHNpemVvZih1dV9zYWx0KSkgPT0gLTEgfHwKLQkgICAgX19iNjRfbnRvcChyZXN1bHQsIGxlbiwgdXVfcmVzdWx0LCBzaXplb2YodXVfcmVzdWx0KSkgPT0gLTEpCi0JCWZhdGFsKCJob3N0X2hhc2g6IF9fYjY0X250b3AgZmFpbGVkIik7Ci0KLQlzbnByaW50ZihlbmNvZGVkLCBzaXplb2YoZW5jb2RlZCksICIlcyVzJWMlcyIsIEhBU0hfTUFHSUMsIHV1X3NhbHQsCi0JICAgIEhBU0hfREVMSU0sIHV1X3Jlc3VsdCk7Ci0KLQlyZXR1cm4gKGVuY29kZWQpOwotfQotCi0vKgotICogUGFyc2VzIGFuIFJTQSAobnVtYmVyIG9mIGJpdHMsIGUsIG4pIG9yIERTQSBrZXkgZnJvbSBhIHN0cmluZy4gIE1vdmVzIHRoZQotICogcG9pbnRlciBvdmVyIHRoZSBrZXkuICBTa2lwcyBhbnkgd2hpdGVzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBhdCBlbmQuCi0gKi8KLQotaW50Ci1ob3N0ZmlsZV9yZWFkX2tleShjaGFyICoqY3BwLCB1X2ludCAqYml0c3AsIEtleSAqcmV0KQotewotCWNoYXIgKmNwOwotCi0JLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICovCi0JZm9yIChjcCA9ICpjcHA7ICpjcCA9PSAnICcgfHwgKmNwID09ICdcdCc7IGNwKyspCi0JCTsKLQotCWlmIChrZXlfcmVhZChyZXQsICZjcCkgIT0gMSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBTa2lwIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovCi0JZm9yICg7ICpjcCA9PSAnICcgfHwgKmNwID09ICdcdCc7IGNwKyspCi0JCTsKLQotCS8qIFJldHVybiByZXN1bHRzLiAqLwotCSpjcHAgPSBjcDsKLQlpZiAoYml0c3AgIT0gTlVMTCkKLQkJKmJpdHNwID0ga2V5X3NpemUocmV0KTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotaG9zdGZpbGVfY2hlY2tfa2V5KGludCBiaXRzLCBjb25zdCBLZXkgKmtleSwgY29uc3QgY2hhciAqaG9zdCwKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgdV9sb25nIGxpbmVudW0pCi17Ci0JaWYgKGtleSA9PSBOVUxMIHx8IGtleS0+dHlwZSAhPSBLRVlfUlNBMSB8fCBrZXktPnJzYSA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQlpZiAoYml0cyAhPSBCTl9udW1fYml0cyhrZXktPnJzYS0+bikpIHsKLQkJbG9naXQoIldhcm5pbmc6ICVzLCBsaW5lICVsdToga2V5c2l6ZSBtaXNtYXRjaCBmb3IgaG9zdCAlczogIgotCQkgICAgImFjdHVhbCAlZCB2cy4gYW5ub3VuY2VkICVkLiIsCi0JCSAgICBmaWxlbmFtZSwgbGluZW51bSwgaG9zdCwgQk5fbnVtX2JpdHMoa2V5LT5yc2EtPm4pLCBiaXRzKTsKLQkJbG9naXQoIldhcm5pbmc6IHJlcGxhY2UgJWQgd2l0aCAlZCBpbiAlcywgbGluZSAlbHUuIiwKLQkJICAgIGJpdHMsIEJOX251bV9iaXRzKGtleS0+cnNhLT5uKSwgZmlsZW5hbWUsIGxpbmVudW0pOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIEhvc3RrZXlNYXJrZXIKLWNoZWNrX21hcmtlcnMoY2hhciAqKmNwcCkKLXsKLQljaGFyIG1hcmtlclszMl0sICpzcCwgKmNwID0gKmNwcDsKLQlpbnQgcmV0ID0gTVJLX05PTkU7Ci0KLQl3aGlsZSAoKmNwID09ICdAJykgewotCQkvKiBPbmx5IG9uZSBtYXJrZXIgaXMgYWxsb3dlZCAqLwotCQlpZiAocmV0ICE9IE1SS19OT05FKQotCQkJcmV0dXJuIE1SS19FUlJPUjsKLQkJLyogTWFya2VycyBhcmUgdGVybWluYXRlZCBieSB3aGl0ZXNwYWNlICovCi0JCWlmICgoc3AgPSBzdHJjaHIoY3AsICcgJykpID09IE5VTEwgJiYKLQkJICAgIChzcCA9IHN0cmNocihjcCwgJ1x0JykpID09IE5VTEwpCi0JCQlyZXR1cm4gTVJLX0VSUk9SOwotCQkvKiBFeHRyYWN0IG1hcmtlciBmb3IgY29tcGFyaXNvbiAqLwotCQlpZiAoc3AgPD0gY3AgKyAxIHx8IHNwID49IGNwICsgc2l6ZW9mKG1hcmtlcikpCi0JCQlyZXR1cm4gTVJLX0VSUk9SOwotCQltZW1jcHkobWFya2VyLCBjcCwgc3AgLSBjcCk7Ci0JCW1hcmtlcltzcCAtIGNwXSA9ICdcMCc7Ci0JCWlmIChzdHJjbXAobWFya2VyLCBDQV9NQVJLRVIpID09IDApCi0JCQlyZXQgPSBNUktfQ0E7Ci0JCWVsc2UgaWYgKHN0cmNtcChtYXJrZXIsIFJFVk9LRV9NQVJLRVIpID09IDApCi0JCQlyZXQgPSBNUktfUkVWT0tFOwotCQllbHNlCi0JCQlyZXR1cm4gTVJLX0VSUk9SOwotCi0JCS8qIFNraXAgcGFzdCBtYXJrZXIgYW5kIGFueSB3aGl0ZXNwYWNlIHRoYXQgZm9sbG93cyBpdCAqLwotCQljcCA9IHNwOwotCQlmb3IgKDsgKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JzsgY3ArKykKLQkJCTsKLQl9Ci0JKmNwcCA9IGNwOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0cnVjdCBob3N0a2V5cyAqCi1pbml0X2hvc3RrZXlzKHZvaWQpCi17Ci0Jc3RydWN0IGhvc3RrZXlzICpyZXQgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmV0KSk7Ci0KLQlyZXQtPmVudHJpZXMgPSBOVUxMOwotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQKLWxvYWRfaG9zdGtleXMoc3RydWN0IGhvc3RrZXlzICpob3N0a2V5cywgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqcGF0aCkKLXsKLQlGSUxFICpmOwotCWNoYXIgbGluZVs4MTkyXTsKLQl1X2xvbmcgbGluZW51bSA9IDAsIG51bV9sb2FkZWQgPSAwOwotCWNoYXIgKmNwLCAqY3AyLCAqaGFzaGVkX2hvc3Q7Ci0JSG9zdGtleU1hcmtlciBtYXJrZXI7Ci0JS2V5ICprZXk7Ci0JaW50IGtiaXRzOwotCi0JaWYgKChmID0gZm9wZW4ocGF0aCwgInIiKSkgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWRlYnVnMygiJXM6IGxvYWRpbmcgZW50cmllcyBmb3IgaG9zdCBcIiUuMTAwc1wiIGZyb20gZmlsZSBcIiVzXCIiLAotCSAgICBfX2Z1bmNfXywgaG9zdCwgcGF0aCk7Ci0Jd2hpbGUgKHJlYWRfa2V5ZmlsZV9saW5lKGYsIHBhdGgsIGxpbmUsIHNpemVvZihsaW5lKSwgJmxpbmVudW0pID09IDApIHsKLQkJY3AgPSBsaW5lOwotCi0JCS8qIFNraXAgYW55IGxlYWRpbmcgd2hpdGVzcGFjZSwgY29tbWVudHMgYW5kIGVtcHR5IGxpbmVzLiAqLwotCQlmb3IgKDsgKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JzsgY3ArKykKLQkJCTsKLQkJaWYgKCEqY3AgfHwgKmNwID09ICcjJyB8fCAqY3AgPT0gJ1xuJykKLQkJCWNvbnRpbnVlOwotCi0JCWlmICgobWFya2VyID0gY2hlY2tfbWFya2VycygmY3ApKSA9PSBNUktfRVJST1IpIHsKLQkJCXZlcmJvc2UoIiVzOiBpbnZhbGlkIG1hcmtlciBhdCAlczolbHUiLAotCQkJICAgIF9fZnVuY19fLCBwYXRoLCBsaW5lbnVtKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogRmluZCB0aGUgZW5kIG9mIHRoZSBob3N0IG5hbWUgcG9ydGlvbi4gKi8KLQkJZm9yIChjcDIgPSBjcDsgKmNwMiAmJiAqY3AyICE9ICcgJyAmJiAqY3AyICE9ICdcdCc7IGNwMisrKQotCQkJOwotCi0JCS8qIENoZWNrIGlmIHRoZSBob3N0IG5hbWUgbWF0Y2hlcy4gKi8KLQkJaWYgKG1hdGNoX2hvc3RuYW1lKGhvc3QsIGNwLCAodV9pbnQpIChjcDIgLSBjcCkpICE9IDEpIHsKLQkJCWlmICgqY3AgIT0gSEFTSF9ERUxJTSkKLQkJCQljb250aW51ZTsKLQkJCWhhc2hlZF9ob3N0ID0gaG9zdF9oYXNoKGhvc3QsIGNwLCAodV9pbnQpIChjcDIgLSBjcCkpOwotCQkJaWYgKGhhc2hlZF9ob3N0ID09IE5VTEwpIHsKLQkJCQlkZWJ1ZygiSW52YWxpZCBoYXNoZWQgaG9zdCBsaW5lICVsdSBvZiAlcyIsCi0JCQkJICAgIGxpbmVudW0sIHBhdGgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHN0cm5jbXAoaGFzaGVkX2hvc3QsIGNwLCAodV9pbnQpIChjcDIgLSBjcCkpICE9IDApCi0JCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBHb3QgYSBtYXRjaC4gIFNraXAgaG9zdCBuYW1lLiAqLwotCQljcCA9IGNwMjsKLQotCQkvKgotCQkgKiBFeHRyYWN0IHRoZSBrZXkgZnJvbSB0aGUgbGluZS4gIFRoaXMgd2lsbCBza2lwIGFueSBsZWFkaW5nCi0JCSAqIHdoaXRlc3BhY2UuICBJZ25vcmUgYmFkbHkgZm9ybWF0dGVkIGxpbmVzLgotCQkgKi8KLQkJa2V5ID0ga2V5X25ldyhLRVlfVU5TUEVDKTsKLQkJaWYgKCFob3N0ZmlsZV9yZWFkX2tleSgmY3AsICZrYml0cywga2V5KSkgewotCQkJa2V5X2ZyZWUoa2V5KTsKLQkJCWtleSA9IGtleV9uZXcoS0VZX1JTQTEpOwotCQkJaWYgKCFob3N0ZmlsZV9yZWFkX2tleSgmY3AsICZrYml0cywga2V5KSkgewotCQkJCWtleV9mcmVlKGtleSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFob3N0ZmlsZV9jaGVja19rZXkoa2JpdHMsIGtleSwgaG9zdCwgcGF0aCwgbGluZW51bSkpCi0JCQljb250aW51ZTsKLQotCQlkZWJ1ZzMoIiVzOiBmb3VuZCAlc2tleSB0eXBlICVzIGluIGZpbGUgJXM6JWx1IiwgX19mdW5jX18sCi0JCSAgICBtYXJrZXIgPT0gTVJLX05PTkUgPyAiIiA6Ci0JCSAgICAobWFya2VyID09IE1SS19DQSA/ICJjYSAiIDogInJldm9rZWQgIiksCi0JCSAgICBrZXlfdHlwZShrZXkpLCBwYXRoLCBsaW5lbnVtKTsKLQkJaG9zdGtleXMtPmVudHJpZXMgPSB4cmVhbGxvYyhob3N0a2V5cy0+ZW50cmllcywKLQkJICAgIGhvc3RrZXlzLT5udW1fZW50cmllcyArIDEsIHNpemVvZigqaG9zdGtleXMtPmVudHJpZXMpKTsKLQkJaG9zdGtleXMtPmVudHJpZXNbaG9zdGtleXMtPm51bV9lbnRyaWVzXS5ob3N0ID0geHN0cmR1cChob3N0KTsKLQkJaG9zdGtleXMtPmVudHJpZXNbaG9zdGtleXMtPm51bV9lbnRyaWVzXS5maWxlID0geHN0cmR1cChwYXRoKTsKLQkJaG9zdGtleXMtPmVudHJpZXNbaG9zdGtleXMtPm51bV9lbnRyaWVzXS5saW5lID0gbGluZW51bTsKLQkJaG9zdGtleXMtPmVudHJpZXNbaG9zdGtleXMtPm51bV9lbnRyaWVzXS5rZXkgPSBrZXk7Ci0JCWhvc3RrZXlzLT5lbnRyaWVzW2hvc3RrZXlzLT5udW1fZW50cmllc10ubWFya2VyID0gbWFya2VyOwotCQlob3N0a2V5cy0+bnVtX2VudHJpZXMrKzsKLQkJbnVtX2xvYWRlZCsrOwotCX0KLQlkZWJ1ZzMoIiVzOiBsb2FkZWQgJWx1IGtleXMiLCBfX2Z1bmNfXywgbnVtX2xvYWRlZCk7Ci0JZmNsb3NlKGYpOwotCXJldHVybjsKLX0JCi0KLXZvaWQKLWZyZWVfaG9zdGtleXMoc3RydWN0IGhvc3RrZXlzICpob3N0a2V5cykKLXsKLQl1X2ludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGhvc3RrZXlzLT5udW1fZW50cmllczsgaSsrKSB7Ci0JCXhmcmVlKGhvc3RrZXlzLT5lbnRyaWVzW2ldLmhvc3QpOwotCQl4ZnJlZShob3N0a2V5cy0+ZW50cmllc1tpXS5maWxlKTsKLQkJa2V5X2ZyZWUoaG9zdGtleXMtPmVudHJpZXNbaV0ua2V5KTsKLQkJYnplcm8oaG9zdGtleXMtPmVudHJpZXMgKyBpLCBzaXplb2YoKmhvc3RrZXlzLT5lbnRyaWVzKSk7Ci0JfQotCWlmIChob3N0a2V5cy0+ZW50cmllcyAhPSBOVUxMKQotCQl4ZnJlZShob3N0a2V5cy0+ZW50cmllcyk7Ci0JaG9zdGtleXMtPmVudHJpZXMgPSBOVUxMOwotCWhvc3RrZXlzLT5udW1fZW50cmllcyA9IDA7Ci0JeGZyZWUoaG9zdGtleXMpOwotfQotCi1zdGF0aWMgaW50Ci1jaGVja19rZXlfbm90X3Jldm9rZWQoc3RydWN0IGhvc3RrZXlzICpob3N0a2V5cywgS2V5ICprKQotewotCWludCBpc19jZXJ0ID0ga2V5X2lzX2NlcnQoayk7Ci0JdV9pbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBob3N0a2V5cy0+bnVtX2VudHJpZXM7IGkrKykgewotCQlpZiAoaG9zdGtleXMtPmVudHJpZXNbaV0ubWFya2VyICE9IE1SS19SRVZPS0UpCi0JCQljb250aW51ZTsKLQkJaWYgKGtleV9lcXVhbF9wdWJsaWMoaywgaG9zdGtleXMtPmVudHJpZXNbaV0ua2V5KSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKGlzX2NlcnQgJiYKLQkJICAgIGtleV9lcXVhbF9wdWJsaWMoay0+Y2VydC0+c2lnbmF0dXJlX2tleSwKLQkJICAgIGhvc3RrZXlzLT5lbnRyaWVzW2ldLmtleSkpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKgotICogTWF0Y2gga2V5cyBhZ2FpbnN0IGEgc3BlY2lmaWVkIGtleSwgb3IgbG9vayBvbmUgdXAgYnkga2V5IHR5cGUuCi0gKgotICogSWYgbG9va2luZyBmb3IgYSBrZXl0eXBlIChrZXkgPT0gTlVMTCkgYW5kIG9uZSBpcyBmb3VuZCB0aGVuIHJldHVybgotICogSE9TVF9GT1VORCwgb3RoZXJ3aXNlIEhPU1RfTkVXLgotICoKLSAqIElmIGxvb2tpbmcgZm9yIGEga2V5IChrZXkgIT0gTlVMTCk6Ci0gKiAgMS4gSWYgdGhlIGtleSBpcyBhIGNlcnQgYW5kIGEgbWF0Y2hpbmcgQ0EgaXMgZm91bmQsIHJldHVybiBIT1NUX09LCi0gKiAgMi4gSWYgdGhlIGtleSBpcyBub3QgYSBjZXJ0IGFuZCBhIG1hdGNoaW5nIGtleSBpcyBmb3VuZCwgcmV0dXJuIEhPU1RfT0sKLSAqICAzLiBJZiBubyBrZXkgbWF0Y2hlcyBidXQgYSBrZXkgd2l0aCBhIGRpZmZlcmVudCB0eXBlIGlzIGZvdW5kLCB0aGVuCi0gKiAgICAgcmV0dXJuIEhPU1RfQ0hBTkdFRAotICogIDQuIElmIG5vIG1hdGNoaW5nIGtleXMgYXJlIGZvdW5kLCB0aGVuIHJldHVybiBIT1NUX05FVy4KLSAqCi0gKiBGaW5hbGx5LCBjaGVjayBhbnkgZm91bmQga2V5IGlzIG5vdCByZXZva2VkLgotICovCi1zdGF0aWMgSG9zdFN0YXR1cwotY2hlY2tfaG9zdGtleXNfYnlfa2V5X29yX3R5cGUoc3RydWN0IGhvc3RrZXlzICpob3N0a2V5cywKLSAgICBLZXkgKmssIGludCBrZXl0eXBlLCBjb25zdCBzdHJ1Y3QgaG9zdGtleV9lbnRyeSAqKmZvdW5kKQotewotCXVfaW50IGk7Ci0JSG9zdFN0YXR1cyBlbmRfcmV0dXJuID0gSE9TVF9ORVc7Ci0JaW50IHdhbnRfY2VydCA9IGtleV9pc19jZXJ0KGspOwotCUhvc3RrZXlNYXJrZXIgd2FudF9tYXJrZXIgPSB3YW50X2NlcnQgPyBNUktfQ0EgOiBNUktfTk9ORTsKLQlpbnQgcHJvdG8gPSAoayA/IGstPnR5cGUgOiBrZXl0eXBlKSA9PSBLRVlfUlNBMSA/IDEgOiAyOwotCi0JaWYgKGZvdW5kICE9IE5VTEwpCi0JCSpmb3VuZCA9IE5VTEw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaG9zdGtleXMtPm51bV9lbnRyaWVzOyBpKyspIHsKLQkJaWYgKHByb3RvID09IDEgJiYgaG9zdGtleXMtPmVudHJpZXNbaV0ua2V5LT50eXBlICE9IEtFWV9SU0ExKQotCQkJY29udGludWU7Ci0JCWlmIChwcm90byA9PSAyICYmIGhvc3RrZXlzLT5lbnRyaWVzW2ldLmtleS0+dHlwZSA9PSBLRVlfUlNBMSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoaG9zdGtleXMtPmVudHJpZXNbaV0ubWFya2VyICE9IHdhbnRfbWFya2VyKQotCQkJY29udGludWU7Ci0JCWlmIChrID09IE5VTEwpIHsKLQkJCWlmIChob3N0a2V5cy0+ZW50cmllc1tpXS5rZXktPnR5cGUgIT0ga2V5dHlwZSkKLQkJCQljb250aW51ZTsKLQkJCWVuZF9yZXR1cm4gPSBIT1NUX0ZPVU5EOwotCQkJaWYgKGZvdW5kICE9IE5VTEwpCi0JCQkJKmZvdW5kID0gaG9zdGtleXMtPmVudHJpZXMgKyBpOwotCQkJayA9IGhvc3RrZXlzLT5lbnRyaWVzW2ldLmtleTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICh3YW50X2NlcnQpIHsKLQkJCWlmIChrZXlfZXF1YWxfcHVibGljKGstPmNlcnQtPnNpZ25hdHVyZV9rZXksCi0JCQkgICAgaG9zdGtleXMtPmVudHJpZXNbaV0ua2V5KSkgewotCQkJCS8qIEEgbWF0Y2hpbmcgQ0EgZXhpc3RzICovCi0JCQkJZW5kX3JldHVybiA9IEhPU1RfT0s7Ci0JCQkJaWYgKGZvdW5kICE9IE5VTEwpCi0JCQkJCSpmb3VuZCA9IGhvc3RrZXlzLT5lbnRyaWVzICsgaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChrZXlfZXF1YWwoaywgaG9zdGtleXMtPmVudHJpZXNbaV0ua2V5KSkgewotCQkJCWVuZF9yZXR1cm4gPSBIT1NUX09LOwotCQkJCWlmIChmb3VuZCAhPSBOVUxMKQotCQkJCQkqZm91bmQgPSBob3N0a2V5cy0+ZW50cmllcyArIGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBBIG5vbi1tYWNoaW5nIGtleSBleGlzdHMgKi8KLQkJCWVuZF9yZXR1cm4gPSBIT1NUX0NIQU5HRUQ7Ci0JCQlpZiAoZm91bmQgIT0gTlVMTCkKLQkJCQkqZm91bmQgPSBob3N0a2V5cy0+ZW50cmllcyArIGk7Ci0JCX0KLQl9Ci0JaWYgKGNoZWNrX2tleV9ub3RfcmV2b2tlZChob3N0a2V5cywgaykgIT0gMCkgewotCQllbmRfcmV0dXJuID0gSE9TVF9SRVZPS0VEOwotCQlpZiAoZm91bmQgIT0gTlVMTCkKLQkJCSpmb3VuZCA9IE5VTEw7Ci0JfQotCXJldHVybiBlbmRfcmV0dXJuOwotfQotCQotSG9zdFN0YXR1cwotY2hlY2tfa2V5X2luX2hvc3RrZXlzKHN0cnVjdCBob3N0a2V5cyAqaG9zdGtleXMsIEtleSAqa2V5LAotICAgIGNvbnN0IHN0cnVjdCBob3N0a2V5X2VudHJ5ICoqZm91bmQpCi17Ci0JaWYgKGtleSA9PSBOVUxMKQotCQlmYXRhbCgibm8ga2V5IHRvIGxvb2sgdXAiKTsKLQlyZXR1cm4gY2hlY2tfaG9zdGtleXNfYnlfa2V5X29yX3R5cGUoaG9zdGtleXMsIGtleSwgMCwgZm91bmQpOwotfQotCi1pbnQKLWxvb2t1cF9rZXlfaW5faG9zdGtleXNfYnlfdHlwZShzdHJ1Y3QgaG9zdGtleXMgKmhvc3RrZXlzLCBpbnQga2V5dHlwZSwKLSAgICBjb25zdCBzdHJ1Y3QgaG9zdGtleV9lbnRyeSAqKmZvdW5kKQotewotCXJldHVybiAoY2hlY2tfaG9zdGtleXNfYnlfa2V5X29yX3R5cGUoaG9zdGtleXMsIE5VTEwsIGtleXR5cGUsCi0JICAgIGZvdW5kKSA9PSBIT1NUX0ZPVU5EKTsKLX0KLQotLyoKLSAqIEFwcGVuZHMgYW4gZW50cnkgdG8gdGhlIGhvc3QgZmlsZS4gIFJldHVybnMgZmFsc2UgaWYgdGhlIGVudHJ5IGNvdWxkIG5vdAotICogYmUgYXBwZW5kZWQuCi0gKi8KLQotaW50Ci1hZGRfaG9zdF90b19ob3N0ZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgS2V5ICprZXksCi0gICAgaW50IHN0b3JlX2hhc2gpCi17Ci0JRklMRSAqZjsKLQlpbnQgc3VjY2VzcyA9IDA7Ci0JY2hhciAqaGFzaGVkX2hvc3QgPSBOVUxMOwotCi0JaWYgKGtleSA9PSBOVUxMKQotCQlyZXR1cm4gMTsJLyogWFhYID8gKi8KLQlmID0gZm9wZW4oZmlsZW5hbWUsICJhIik7Ci0JaWYgKCFmKQotCQlyZXR1cm4gMDsKLQotCWlmIChzdG9yZV9oYXNoKSB7Ci0JCWlmICgoaGFzaGVkX2hvc3QgPSBob3N0X2hhc2goaG9zdCwgTlVMTCwgMCkpID09IE5VTEwpIHsKLQkJCWVycm9yKCJhZGRfaG9zdF90b19ob3N0ZmlsZTogaG9zdF9oYXNoIGZhaWxlZCIpOwotCQkJZmNsb3NlKGYpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JZnByaW50ZihmLCAiJXMgIiwgc3RvcmVfaGFzaCA/IGhhc2hlZF9ob3N0IDogaG9zdCk7Ci0KLQlpZiAoa2V5X3dyaXRlKGtleSwgZikpIHsKLQkJc3VjY2VzcyA9IDE7Ci0JfSBlbHNlIHsKLQkJZXJyb3IoImFkZF9ob3N0X3RvX2hvc3RmaWxlOiBzYXZpbmcga2V5IGluICVzIGZhaWxlZCIsIGZpbGVuYW1lKTsKLQl9Ci0JZnByaW50ZihmLCAiXG4iKTsKLQlmY2xvc2UoZik7Ci0JcmV0dXJuIHN1Y2Nlc3M7Ci19CmRpZmYgLS1naXQgYS9ob3N0ZmlsZS5oIGIvaG9zdGZpbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0ZDQyMi4uMDAwMDAwMAotLS0gYS9ob3N0ZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGhvc3RmaWxlLmgsdiAxLjE5IDIwMTAvMTEvMjkgMjM6NDU6NTEgZGptIEV4cCAkICovCi0KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotI2lmbmRlZiBIT1NURklMRV9ICi0jZGVmaW5lIEhPU1RGSUxFX0gKLQotdHlwZWRlZiBlbnVtIHsKLQlIT1NUX09LLCBIT1NUX05FVywgSE9TVF9DSEFOR0VELCBIT1NUX1JFVk9LRUQsIEhPU1RfRk9VTkQKLX0gICAgICAgSG9zdFN0YXR1czsKLQotdHlwZWRlZiBlbnVtIHsKLQlNUktfRVJST1IsIE1SS19OT05FLCBNUktfUkVWT0tFLCBNUktfQ0EKLX0JSG9zdGtleU1hcmtlcjsKLQotc3RydWN0IGhvc3RrZXlfZW50cnkgewotCWNoYXIgKmhvc3Q7Ci0JY2hhciAqZmlsZTsKLQl1X2xvbmcgbGluZTsKLQlLZXkgKmtleTsKLQlIb3N0a2V5TWFya2VyIG1hcmtlcjsKLX07Ci1zdHJ1Y3QgaG9zdGtleXM7Ci0KLXN0cnVjdCBob3N0a2V5cyAqaW5pdF9ob3N0a2V5cyh2b2lkKTsKLXZvaWQJIGxvYWRfaG9zdGtleXMoc3RydWN0IGhvc3RrZXlzICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLXZvaWQJIGZyZWVfaG9zdGtleXMoc3RydWN0IGhvc3RrZXlzICopOwotCi1Ib3N0U3RhdHVzIGNoZWNrX2tleV9pbl9ob3N0a2V5cyhzdHJ1Y3QgaG9zdGtleXMgKiwgS2V5ICosCi0gICAgY29uc3Qgc3RydWN0IGhvc3RrZXlfZW50cnkgKiopOwotaW50CSBsb29rdXBfa2V5X2luX2hvc3RrZXlzX2J5X3R5cGUoc3RydWN0IGhvc3RrZXlzICosIGludCwKLSAgICBjb25zdCBzdHJ1Y3QgaG9zdGtleV9lbnRyeSAqKik7Ci0KLWludAkgaG9zdGZpbGVfcmVhZF9rZXkoY2hhciAqKiwgdV9pbnQgKiwgS2V5ICopOwotaW50CSBhZGRfaG9zdF90b19ob3N0ZmlsZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgS2V5ICosIGludCk7Ci0KLSNkZWZpbmUgSEFTSF9NQUdJQwkifDF8IgotI2RlZmluZSBIQVNIX0RFTElNCSd8JwotCi0jZGVmaW5lIENBX01BUktFUgkiQGNlcnQtYXV0aG9yaXR5IgotI2RlZmluZSBSRVZPS0VfTUFSS0VSCSJAcmV2b2tlZCIKLQotY2hhcgkqaG9zdF9oYXNoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB1X2ludCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZXMuaCBiL2luY2x1ZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YzUzZDkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKiAkT3BlbkJTRDogaW5jbHVkZXMuaCx2IDEuNTQgMjAwNi8wNy8yMiAyMDo0ODoyMyBzdGV2ZXNrIEV4cCAkICovCi0KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiBUaGlzIGZpbGUgaW5jbHVkZXMgbW9zdCBvZiB0aGUgbmVlZGVkIHN5c3RlbSBoZWFkZXJzLgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLQotI2lmbmRlZiBJTkNMVURFU19ICi0jZGVmaW5lIElOQ0xVREVTX0gKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jZGVmaW5lIF9HTlVfU09VUkNFIC8qIGFjdGl2YXRlIGV4dHJhIHByb3RvdHlwZXMgZm9yIGdsaWJjICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+IC8qIEZvciBDTVNHXyogKi8KLQotI2lmZGVmIEhBVkVfTElNSVRTX0gKLSMgaW5jbHVkZSA8bGltaXRzLmg+IC8qIEZvciBQQVRIX01BWCAqLwotI2VuZGlmCi0jaWZkZWYgSEFWRV9CU1RSSU5HX0gKLSMgaW5jbHVkZSA8YnN0cmluZy5oPgotI2VuZGlmCi0jaWYgZGVmaW5lZChIQVZFX0dMT0JfSCkgJiYgZGVmaW5lZChHTE9CX0hBU19BTFRESVJGVU5DKSAmJiBcCi0gICAgZGVmaW5lZChHTE9CX0hBU19HTF9NQVRDSEMpICYmIGRlZmluZWQoR0xPQl9IQVNfR0xfU1RBVFYpICYmIFwKLSAgICBkZWZpbmVkKEhBVkVfREVDTF9HTE9CX05PTUFUQ0gpICYmICBIQVZFX0RFQ0xfR0xPQl9OT01BVENIICE9IDAgJiYgXAotICAgICFkZWZpbmVkKEJST0tFTl9HTE9CKQotIyBpbmNsdWRlIDxnbG9iLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0VORElBTl9ICi0jIGluY2x1ZGUgPGVuZGlhbi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9UVFlFTlRfSAotIyBpbmNsdWRlIDx0dHllbnQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVVRJTUVfSAotIyBpbmNsdWRlIDx1dGltZS5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9NQUlMTE9DS19ICi0jIGluY2x1ZGUgPG1haWxsb2NrLmg+IC8qIEZvciBfUEFUSF9NQUlMRElSICovCi0jZW5kaWYKLSNpZmRlZiBIQVZFX05FWFQKLSMgaW5jbHVkZSA8bGliYy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9QQVRIU19ICi0jIGluY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLQotLyoKLSAqLSotbnRvLXFueCBuZWVkcyB0aGVzZSBoZWFkZXJzIGZvciBzdHJjYXNlY21wIGFuZCBMQVNUTE9HX0ZJTEUgcmVzcGVjdGl2ZWx5Ci0gKi8KLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0xPR0lOX0gKLSMgaW5jbHVkZSA8bG9naW4uaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VVE1QX0gKLSMgIGluY2x1ZGUgPHV0bXAuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVVRNUFhfSAotIyAgaW5jbHVkZSA8dXRtcHguaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfTEFTVExPR19ICi0jICBpbmNsdWRlIDxsYXN0bG9nLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICi0jIGluY2x1ZGUgPHN5cy9zZWxlY3QuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX0JTRFRUWV9ICi0jIGluY2x1ZGUgPHN5cy9ic2R0dHkuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RESU5UX0gKLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICi0jIGluY2x1ZGUgPHN5cy9iaXR5cGVzLmg+IC8qIEZvciB1X2ludFhYX3QgKi8KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX0NERUZTX0gKLSMgaW5jbHVkZSA8c3lzL2NkZWZzLmg+IC8qIEZvciBfX1AoKSAqLwotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfU1RBVF9ICi0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+IC8qIEZvciBTXyogY29uc3RhbnRzIGFuZCBtYWNyb3MgKi8KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1NZU01BQ1JPU19ICi0jIGluY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4gLyogRm9yIE1JTiwgTUFYLCBldGMgKi8KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX01NQU5fSAotI2luY2x1ZGUgPHN5cy9tbWFuLmg+IC8qIGZvciBNQVBfQU5PTllNT1VTICovCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19TVFJUSU9fSAotI2luY2x1ZGUgPHN5cy9zdHJ0aW8uaD4JLyogZm9yIFRJT0NDQlJLIG9uIEhQLVVYICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKEhBVkVfU1lTX1BUTVNfSCkgJiYgZGVmaW5lZChIQVZFX0RFVl9QVE1YKQotIyBpZiBkZWZpbmVkKEhBVkVfU1lTX1NUUkVBTV9IKQotIyAgaW5jbHVkZSA8c3lzL3N0cmVhbS5oPgkvKiByZXFkIGZvciBxdWV1ZV90IG9uIFNvbGFyaXMgMi41LjEgKi8KLSMgZW5kaWYKLSNpbmNsdWRlIDxzeXMvcHRtcy5oPgkvKiBmb3IgZ3JhbnRwdCgpIGFuZCBmcmllbmRzICovCi0jZW5kaWYKLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luX3N5c3RtLmg+IC8qIEZvciB0eXBlZGVmcyAqLwotI2lmZGVmIEhBVkVfUlBDX1RZUEVTX0gKLSMgaW5jbHVkZSA8cnBjL3R5cGVzLmg+IC8qIEZvciBJTkFERFJfTE9PUEJBQ0sgKi8KLSNlbmRpZgotI2lmZGVmIFVTRV9QQU0KLSNpZiBkZWZpbmVkKEhBVkVfU0VDVVJJVFlfUEFNX0FQUExfSCkKLSMgaW5jbHVkZSA8c2VjdXJpdHkvcGFtX2FwcGwuaD4KLSNlbGlmIGRlZmluZWQgKEhBVkVfUEFNX1BBTV9BUFBMX0gpCi0jIGluY2x1ZGUgPHBhbS9wYW1fYXBwbC5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1JFQURQQVNTUEhSQVNFX0gKLSMgaW5jbHVkZSA8cmVhZHBhc3NwaHJhc2UuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9JQV9ICi0jIGluY2x1ZGUgPGlhLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfSUFGX0gKLSMgaW5jbHVkZSA8aWFmLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVE1QRElSX0gKLSMgaW5jbHVkZSA8dG1wZGlyLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTElCVVRJTF9ICi0jIGluY2x1ZGUgPGxpYnV0aWwuaD4gLyogT3BlbnB0eSBvbiBGcmVlQlNEIGF0IGxlYXN0ICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoS1JCNSkgJiYgZGVmaW5lZChVU0VfQUZTKQotIyBpbmNsdWRlIDxrcmI1Lmg+Ci0jIGluY2x1ZGUgPGthZnMuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChIQVZFX1NZU19TWVNMT0dfSCkKLSMgaW5jbHVkZSA8c3lzL3N5c2xvZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0vKgotICogT24gSFAtVVggMTEuMTEsIHNoYWRvdy5oIGFuZCBwcm90LmggcHJvdmlkZSBjb25mbGljdGluZyBkZWNsYXJhdGlvbnMKLSAqIG9mIGdldHNwbmFtIHdoZW4gX0lOQ0xVREVfX1NURENfXyBpcyBkZWZpbmVkLCBzbyB3ZSB1bnNldCBpdCBoZXJlLgotICovCi0jaWZkZWYgR0VUU1BOQU1fQ09ORkxJQ1RJTkdfREVGUwotIyBpZmRlZiBfSU5DTFVERV9fU1REQ19fCi0jICB1bmRlZiBfSU5DTFVERV9fU1REQ19fCi0jIGVuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbHYuaD4gLyogRm9yIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgKi8KLQotI2luY2x1ZGUgImRlZmluZXMuaCIKLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbmJzZC1jb21wYXQuaCIKLSNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9ic2QtbmV4dHN0ZXAuaCIKLQotI2luY2x1ZGUgImVudHJvcHkuaCIKLQotI2VuZGlmIC8qIElOQ0xVREVTX0ggKi8KZGlmZiAtLWdpdCBhL2luc3RhbGwtc2ggYi9pbnN0YWxsLXNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjBhYmJmLi4wMDAwMDAwCi0tLSBhL2luc3RhbGwtc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQotIyBUaGlzIGNvbWVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCkuCi0jCi0jIENvcHlyaWdodCAxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5Ci0jCi0jIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotIyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotIyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKLSMgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAotIyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQotIyBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLSMgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0jCi0jIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50Ci0jIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0Ci0jIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCi0jCi0jIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KLSMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KLSMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCi0KLQotIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0Ci0KLSMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KLWRvaXQ9IiR7RE9JVFBST0ctfSIKLQotCi0jIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KLQotbXZwcm9nPSIke01WUFJPRy1tdn0iCi1jcHByb2c9IiR7Q1BQUk9HLWNwfSIKLWNobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgotY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCi1jaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKLXN0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igotcm1wcm9nPSIke1JNUFJPRy1ybX0iCi1ta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKLQotdHJhbnNmb3JtYmFzZW5hbWU9IiIKLXRyYW5zZm9ybV9hcmc9IiIKLWluc3RjbWQ9IiRtdnByb2ciCi1jaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgotY2hvd25jbWQ9IiIKLWNoZ3JwY21kPSIiCi1zdHJpcGNtZD0iIgotcm1jbWQ9IiRybXByb2cgLWYiCi1tdmNtZD0iJG12cHJvZyIKLXNyYz0iIgotZHN0PSIiCi1kaXJfYXJnPSIiCi0KLXdoaWxlIFsgeCIkMSIgIT0geCBdOyBkbwotICAgIGNhc2UgJDEgaW4KLQktYykgaW5zdGNtZD0iJGNwcHJvZyIKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWQpIGRpcl9hcmc9dHJ1ZQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktcykgc3RyaXBjbWQ9IiRzdHJpcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS10PSopIHRyYW5zZm9ybWFyZz1gZWNobyAkMSB8IHNlZCAncy8tdD0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1iPSopIHRyYW5zZm9ybWJhc2VuYW1lPWBlY2hvICQxIHwgc2VkICdzLy1iPS8vJ2AKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JKikgIGlmIFsgeCIkc3JjIiA9IHggXQotCSAgICB0aGVuCi0JCXNyYz0kMQotCSAgICBlbHNlCi0JCSMgdGhpcyBjb2xvbiBpcyB0byB3b3JrIGFyb3VuZCBhIDM4NkJTRCAvYmluL3NoIGJ1ZwotCQk6Ci0JCWRzdD0kMQotCSAgICBmaQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0gICAgZXNhYwotZG9uZQotCi1pZiBbIHgiJHNyYyIgPSB4IF0KLXRoZW4KLQllY2hvICJpbnN0YWxsOglubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIKLQlleGl0IDEKLWVsc2UKLQl0cnVlCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXTsgdGhlbgotCWRzdD0kc3JjCi0Jc3JjPSIiCi0JCi0JaWYgWyAtZCAkZHN0IF07IHRoZW4KLQkJaW5zdGNtZD06Ci0JCWNobW9kY21kPSIiCi0JZWxzZQotCQlpbnN0Y21kPW1rZGlyCi0JZmkKLWVsc2UKLQotIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kCi0jIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkCi0jIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KLQotCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KLQl0aGVuCi0JCXRydWUKLQllbHNlCi0JCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgotCQlleGl0IDEKLQlmaQotCQotCWlmIFsgeCIkZHN0IiA9IHggXQotCXRoZW4KLQkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgotCQlleGl0IDEKLQllbHNlCi0JCXRydWUKLQlmaQotCi0jIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQotIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCi0KLQlpZiBbIC1kICRkc3QgXQotCXRoZW4KLQkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKLQllbHNlCi0JCXRydWUKLQlmaQotZmkKLQotIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCi1kc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCi0KLSMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCi0jICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKLQotIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KLWlmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgotZGVmYXVsdElGUz0nCQotJwotSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKLQotb0lGUz0iJHtJRlN9IgotIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KLUlGUz0nJScKLXNldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAotSUZTPSIke29JRlN9IgotCi1wYXRoY29tcD0nJwotCi13aGlsZSBbICQjIC1uZSAwIF0gOyBkbwotCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCi0Jc2hpZnQKLQotCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOwotCXRoZW4KLQkJJG1rZGlycHJvZyAiJHtwYXRoY29tcH0iCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotCXBhdGhjb21wPSIke3BhdGhjb21wfS8iCi1kb25lCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXQotdGhlbgotCSRkb2l0ICRpbnN0Y21kICRkc3QgJiYKLQotCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkKLWVsc2UKLQotIyBJZiB3ZSdyZSBnb2luZyB0byByZW5hbWUgdGhlIGZpbmFsIGV4ZWN1dGFibGUsIGRldGVybWluZSB0aGUgbmFtZSBub3cuCi0KLQlpZiBbIHgiJHRyYW5zZm9ybWFyZyIgPSB4IF0KLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0ICR0cmFuc2Zvcm1iYXNlbmFtZSB8Ci0JCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKLQlmaQotCi0jIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKLQotCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0KLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotIyBNYWtlIGEgdGVtcCBmaWxlIG5hbWUgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCi0KLQlkc3R0bXA9JGRzdGRpci8jaW5zdC4kJCMKLQotIyBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCi0KLQkkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAgJiYKLQotCXRyYXAgInJtIC1mICR7ZHN0dG1wfSIgMCAmJgotCi0jIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMKLQotIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bwotIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCi0jIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgotCi0JaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQotIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotCi0JJGRvaXQgJHJtY21kIC1mICRkc3RkaXIvJGRzdGZpbGUgJiYKLQkkZG9pdCAkbXZjbWQgJGRzdHRtcCAkZHN0ZGlyLyRkc3RmaWxlCi0KLWZpICYmCi0KLQotZXhpdCAwCmRpZmYgLS1naXQgYS9qcGFrZS5jIGIvanBha2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5YTRiYy4uMDAwMDAwMAotLS0gYS9qcGFrZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qICRPcGVuQlNEOiBqcGFrZS5jLHYgMS42IDIwMTAvMDkvMjAgMDQ6NTQ6MDcgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA4IERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLS8qCi0gKiBTaGFyZWQgY29tcG9uZW50cyBvZiB6ZXJvLWtub3dsZWRnZSBwYXNzd29yZCBhdXRoIHVzaW5nIEotUEFLRSBwcm90b2NvbAotICogYXMgZGVzY3JpYmVkIGluOgotICoKLSAqIEYuIEhhbywgUC4gUnlhbiwgIlBhc3N3b3JkIEF1dGhlbnRpY2F0ZWQgS2V5IEV4Y2hhbmdlIGJ5IEp1Z2dsaW5nIiwKLSAqIDE2dGggV29ya3Nob3Agb24gU2VjdXJpdHkgUHJvdG9jb2xzLCBDYW1icmlkZ2UsIEFwcmlsIDIwMDgKLSAqCi0gKiBodHRwOi8vZ3JvdXBlci5pZWVlLm9yZy9ncm91cHMvMTM2My9SZXNlYXJjaC9jb250cmlidXRpb25zL2hhby1yeWFuLTIwMDgucGRmCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJhdXRoLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAiZGlzcGF0Y2guaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLSNpbmNsdWRlICJqcGFrZS5oIgotI2luY2x1ZGUgInNjaG5vcnIuaCIKLQotI2lmZGVmIEpQQUtFCi0KLS8qIFJGQzM1MjYgZ3JvdXAgNSwgMTUzNiBiaXRzICovCi0jZGVmaW5lIEpQQUtFX0dST1VQX0cgIjIiCi0jZGVmaW5lIEpQQUtFX0dST1VQX1AgXAotCSJGRkZGRkZGRkZGRkZGRkZGQzkwRkRBQTIyMTY4QzIzNEM0QzY2MjhCODBEQzFDRDEyOTAyNEUwODhBNjdDQzc0IiBcCi0JIjAyMEJCRUE2M0IxMzlCMjI1MTRBMDg3OThFMzQwNERERUY5NTE5QjNDRDNBNDMxQjMwMkIwQTZERjI1RjE0MzciIFwKLQkiNEZFMTM1NkQ2RDUxQzI0NUU0ODVCNTc2NjI1RTdFQzZGNDRDNDJFOUE2MzdFRDZCMEJGRjVDQjZGNDA2QjdFRCIgXAotCSJFRTM4NkJGQjVBODk5RkE1QUU5RjI0MTE3QzRCMUZFNjQ5Mjg2NjUxRUNFNDVCM0RDMjAwN0NCOEExNjNCRjA1IiBcCi0JIjk4REE0ODM2MUM1NUQzOUE2OTE2M0ZBOEZEMjRDRjVGODM2NTVEMjNEQ0EzQUQ5NjFDNjJGMzU2MjA4NTUyQkIiIFwKLQkiOUVENTI5MDc3MDk2OTY2RDY3MEMzNTRFNEFCQzk4MDRGMTc0NkMwOENBMjM3MzI3RkZGRkZGRkZGRkZGRkZGRiIKLQotc3RydWN0IG1vZHBfZ3JvdXAgKgotanBha2VfZGVmYXVsdF9ncm91cCh2b2lkKQotewotCXJldHVybiBtb2RwX2dyb3VwX2Zyb21fZ19hbmRfc2FmZV9wKEpQQUtFX0dST1VQX0csIEpQQUtFX0dST1VQX1ApOwotfQotCi1zdHJ1Y3QganBha2VfY3R4ICoKLWpwYWtlX25ldyh2b2lkKQotewotCXN0cnVjdCBqcGFrZV9jdHggKnJldDsKLQotCXJldCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpyZXQpKTsKLQotCXJldC0+Z3JwID0ganBha2VfZGVmYXVsdF9ncm91cCgpOwotCi0JcmV0LT5zID0gcmV0LT5rID0gTlVMTDsKLQlyZXQtPngxID0gcmV0LT54MiA9IHJldC0+eDMgPSByZXQtPng0ID0gTlVMTDsKLQlyZXQtPmdfeDEgPSByZXQtPmdfeDIgPSByZXQtPmdfeDMgPSByZXQtPmdfeDQgPSBOVUxMOwotCXJldC0+YSA9IHJldC0+YiA9IE5VTEw7Ci0KLQlyZXQtPmNsaWVudF9pZCA9IHJldC0+c2VydmVyX2lkID0gTlVMTDsKLQlyZXQtPmhfa19jaWRfc2Vzc2lkID0gcmV0LT5oX2tfc2lkX3Nlc3NpZCA9IE5VTEw7Ci0KLQlkZWJ1ZzMoIiVzOiBhbGxvYyAlcCIsIF9fZnVuY19fLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotdm9pZAotanBha2VfZnJlZShzdHJ1Y3QganBha2VfY3R4ICpwY3R4KQotewotCWRlYnVnMygiJXM6IGZyZWUgJXAiLCBfX2Z1bmNfXywgcGN0eCk7Ci0KLSNkZWZpbmUgSlBBS0VfQk5fQ0xFQVJfRlJFRSh2KQkJCVwKLQlkbyB7CQkJCQlcCi0JCWlmICgodikgIT0gTlVMTCkgewkJXAotCQkJQk5fY2xlYXJfZnJlZSh2KTsJXAotCQkJKHYpID0gTlVMTDsJCVwKLQkJfQkJCQlcCi0JfSB3aGlsZSAoMCkKLSNkZWZpbmUgSlBBS0VfQlVGX0NMRUFSX0ZSRUUodiwgbCkJCVwKLQlkbyB7CQkJCQlcCi0JCWlmICgodikgIT0gTlVMTCkgewkJXAotCQkJYnplcm8oKHYpLCAobCkpOwlcCi0JCQl4ZnJlZSh2KTsJCVwKLQkJCSh2KSA9IE5VTEw7CQlcCi0JCQkobCkgPSAwOwkJXAotCQl9CQkJCVwKLQl9IHdoaWxlICgwKQotCi0JSlBBS0VfQk5fQ0xFQVJfRlJFRShwY3R4LT5zKTsKLQlKUEFLRV9CTl9DTEVBUl9GUkVFKHBjdHgtPmspOwotCUpQQUtFX0JOX0NMRUFSX0ZSRUUocGN0eC0+eDEpOwotCUpQQUtFX0JOX0NMRUFSX0ZSRUUocGN0eC0+eDIpOwotCUpQQUtFX0JOX0NMRUFSX0ZSRUUocGN0eC0+eDMpOwotCUpQQUtFX0JOX0NMRUFSX0ZSRUUocGN0eC0+eDQpOwotCUpQQUtFX0JOX0NMRUFSX0ZSRUUocGN0eC0+Z194MSk7Ci0JSlBBS0VfQk5fQ0xFQVJfRlJFRShwY3R4LT5nX3gyKTsKLQlKUEFLRV9CTl9DTEVBUl9GUkVFKHBjdHgtPmdfeDMpOwotCUpQQUtFX0JOX0NMRUFSX0ZSRUUocGN0eC0+Z194NCk7Ci0JSlBBS0VfQk5fQ0xFQVJfRlJFRShwY3R4LT5hKTsKLQlKUEFLRV9CTl9DTEVBUl9GUkVFKHBjdHgtPmIpOwotCi0JSlBBS0VfQlVGX0NMRUFSX0ZSRUUocGN0eC0+Y2xpZW50X2lkLCBwY3R4LT5jbGllbnRfaWRfbGVuKTsKLQlKUEFLRV9CVUZfQ0xFQVJfRlJFRShwY3R4LT5zZXJ2ZXJfaWQsIHBjdHgtPnNlcnZlcl9pZF9sZW4pOwotCUpQQUtFX0JVRl9DTEVBUl9GUkVFKHBjdHgtPmhfa19jaWRfc2Vzc2lkLCBwY3R4LT5oX2tfY2lkX3Nlc3NpZF9sZW4pOwotCUpQQUtFX0JVRl9DTEVBUl9GUkVFKHBjdHgtPmhfa19zaWRfc2Vzc2lkLCBwY3R4LT5oX2tfc2lkX3Nlc3NpZF9sZW4pOwotCi0jdW5kZWYgSlBBS0VfQk5fQ0xFQVJfRlJFRQotI3VuZGVmIEpQQUtFX0JVRl9DTEVBUl9GUkVFCi0KLQliemVybyhwY3R4LCBzaXplb2YocGN0eCkpOwotCXhmcmVlKHBjdHgpOwotfQotCi0vKiBkdW1wIGVudGlyZSBqcGFrZV9jdHguIE5CLiBpbmNsdWRlcyBwcml2YXRlIHZhbHVlcyEgKi8KLXZvaWQKLWpwYWtlX2R1bXAoc3RydWN0IGpwYWtlX2N0eCAqcGN0eCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JY2hhciAqb3V0OwotCXZhX2xpc3QgYXJnczsKLQotCW91dCA9IE5VTEw7Ci0JdmFfc3RhcnQoYXJncywgZm10KTsKLQl2YXNwcmludGYoJm91dCwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0JaWYgKG91dCA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IHZhc3ByaW50ZiBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0KLQlkZWJ1ZzMoIiVzOiAlcyAoY3R4IGF0ICVwKSIsIF9fZnVuY19fLCBvdXQsIHBjdHgpOwotCWlmIChwY3R4ID09IE5VTEwpIHsKLQkJZnJlZShvdXQpOwotCQlyZXR1cm47Ci0JfQotCi0jZGVmaW5lIEpQQUtFX0RVTVBfQk4oYSkJZG8geyBcCi0JCWlmICgoYSkgIT0gTlVMTCkgXAotCQkJSlBBS0VfREVCVUdfQk4oKChhKSwgIiVzID0gIiwgI2EpKTsgXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIEpQQUtFX0RVTVBfQlVGKGEsIGIpCWRvIHsgXAotCQlpZiAoKGEpICE9IE5VTEwpIFwKLQkJCUpQQUtFX0RFQlVHX0JVRigoYSwgYiwgIiVzIiwgI2EpKTsgXAotCX0gd2hpbGUgKDApCi0KLQlKUEFLRV9EVU1QX0JOKHBjdHgtPnMpOwotCUpQQUtFX0RVTVBfQk4ocGN0eC0+ayk7Ci0JSlBBS0VfRFVNUF9CTihwY3R4LT54MSk7Ci0JSlBBS0VfRFVNUF9CTihwY3R4LT54Mik7Ci0JSlBBS0VfRFVNUF9CTihwY3R4LT54Myk7Ci0JSlBBS0VfRFVNUF9CTihwY3R4LT54NCk7Ci0JSlBBS0VfRFVNUF9CTihwY3R4LT5nX3gxKTsKLQlKUEFLRV9EVU1QX0JOKHBjdHgtPmdfeDIpOwotCUpQQUtFX0RVTVBfQk4ocGN0eC0+Z194Myk7Ci0JSlBBS0VfRFVNUF9CTihwY3R4LT5nX3g0KTsKLQlKUEFLRV9EVU1QX0JOKHBjdHgtPmEpOwotCUpQQUtFX0RVTVBfQk4ocGN0eC0+Yik7Ci0KLQlKUEFLRV9EVU1QX0JVRihwY3R4LT5jbGllbnRfaWQsIHBjdHgtPmNsaWVudF9pZF9sZW4pOwotCUpQQUtFX0RVTVBfQlVGKHBjdHgtPnNlcnZlcl9pZCwgcGN0eC0+c2VydmVyX2lkX2xlbik7Ci0JSlBBS0VfRFVNUF9CVUYocGN0eC0+aF9rX2NpZF9zZXNzaWQsIHBjdHgtPmhfa19jaWRfc2Vzc2lkX2xlbik7Ci0JSlBBS0VfRFVNUF9CVUYocGN0eC0+aF9rX3NpZF9zZXNzaWQsIHBjdHgtPmhfa19zaWRfc2Vzc2lkX2xlbik7Ci0KLQlkZWJ1ZzMoIiVzOiAlcyBkb25lIiwgX19mdW5jX18sIG91dCk7Ci0JZnJlZShvdXQpOwotfQotCi0vKiBTaGFyZWQgcGFydHMgb2Ygc3RlcCAxIGV4Y2hhbmdlIGNhbGN1bGF0aW9uICovCi12b2lkCi1qcGFrZV9zdGVwMShzdHJ1Y3QgbW9kcF9ncm91cCAqZ3JwLAotICAgIHVfY2hhciAqKmlkLCB1X2ludCAqaWRfbGVuLAotICAgIEJJR05VTSAqKnByaXYxLCBCSUdOVU0gKipwcml2MiwgQklHTlVNICoqZ19wcml2MSwgQklHTlVNICoqZ19wcml2MiwKLSAgICB1X2NoYXIgKipwcml2MV9wcm9vZiwgdV9pbnQgKnByaXYxX3Byb29mX2xlbiwKLSAgICB1X2NoYXIgKipwcml2Ml9wcm9vZiwgdV9pbnQgKnByaXYyX3Byb29mX2xlbikKLXsKLQlCTl9DVFggKmJuX2N0eDsKLQotCWlmICgoYm5fY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEJOX0NUWF9uZXciLCBfX2Z1bmNfXyk7Ci0KLQkvKiBSYW5kb20gbm9uY2UgdG8gcHJldmVudCByZXBsYXkgKi8KLQkqaWQgPSB4bWFsbG9jKEtaUF9JRF9MRU4pOwotCSppZF9sZW4gPSBLWlBfSURfTEVOOwotCWFyYzRyYW5kb21fYnVmKCppZCwgKmlkX2xlbik7Ci0KLQkvKgotCSAqIHgxL3gzIGlzIGEgcmFuZG9tIGVsZW1lbnQgb2YgWnEKLQkgKiB4Mi94NCBpcyBhIHJhbmRvbSBlbGVtZW50IG9mIFoqcQotCSAqIFdlIGFsc28gZXhjbHVkZSBbMV0gZnJvbSB4MS94MyBjYW5kaWRhdGVzIGFuZCBbMCwgMV0gZnJvbQotCSAqIHgyL3g0IGNhbmRpYXRlcyB0byBhdm9pZCBwb3NzaWJsZSBkZWdlbmVyYWN5IChpLmUuIGdeMCwgZ14xKS4KLQkgKi8KLQlpZiAoKCpwcml2MSA9IGJuX3JhbmRfcmFuZ2VfZ3Rfb25lKGdycC0+cSkpID09IE5VTEwgfHwKLQkgICAgKCpwcml2MiA9IGJuX3JhbmRfcmFuZ2VfZ3Rfb25lKGdycC0+cSkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogYm5fcmFuZF9yYW5nZV9ndF9vbmUiLCBfX2Z1bmNfXyk7Ci0KLQkvKgotCSAqIGNsaWVudDogZ194MSA9IGdeeDEgbW9kIHAgLyBzZXJ2ZXI6IGdfeDMgPSBnXngzIG1vZCBwCi0JICogY2xpZW50OiBnX3gyID0gZ154MiBtb2QgcCAvIHNlcnZlcjogZ194NCA9IGdeeDQgbW9kIHAKLQkgKi8KLQlpZiAoKCpnX3ByaXYxID0gQk5fbmV3KCkpID09IE5VTEwgfHwKLQkgICAgKCpnX3ByaXYyID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fbmV3IiwgX19mdW5jX18pOwotCWlmIChCTl9tb2RfZXhwKCpnX3ByaXYxLCBncnAtPmcsICpwcml2MSwgZ3JwLT5wLCBibl9jdHgpID09IC0xKQotCQlmYXRhbCgiJXM6IEJOX21vZF9leHAiLCBfX2Z1bmNfXyk7Ci0JaWYgKEJOX21vZF9leHAoKmdfcHJpdjIsIGdycC0+ZywgKnByaXYyLCBncnAtPnAsIGJuX2N0eCkgPT0gLTEpCi0JCWZhdGFsKCIlczogQk5fbW9kX2V4cCIsIF9fZnVuY19fKTsKLQotCS8qIEdlbmVyYXRlIHByb29mcyBmb3IgaG9sZGluZyB4MS94MyBhbmQgeDIveDQgKi8KLQlpZiAoc2Nobm9ycl9zaWduX2J1ZihncnAtPnAsIGdycC0+cSwgZ3JwLT5nLAotCSAgICAqcHJpdjEsICpnX3ByaXYxLCAqaWQsICppZF9sZW4sCi0JICAgIHByaXYxX3Byb29mLCBwcml2MV9wcm9vZl9sZW4pICE9IDApCi0JCWZhdGFsKCIlczogc2Nobm9ycl9zaWduIiwgX19mdW5jX18pOwotCWlmIChzY2hub3JyX3NpZ25fYnVmKGdycC0+cCwgZ3JwLT5xLCBncnAtPmcsCi0JICAgICpwcml2MiwgKmdfcHJpdjIsICppZCwgKmlkX2xlbiwKLQkgICAgcHJpdjJfcHJvb2YsIHByaXYyX3Byb29mX2xlbikgIT0gMCkKLQkJZmF0YWwoIiVzOiBzY2hub3JyX3NpZ24iLCBfX2Z1bmNfXyk7Ci0KLQlCTl9DVFhfZnJlZShibl9jdHgpOwotfQotCi0vKiBTaGFyZWQgcGFydHMgb2Ygc3RlcCAyIGV4Y2hhbmdlIGNhbGN1bGF0aW9uICovCi12b2lkCi1qcGFrZV9zdGVwMihzdHJ1Y3QgbW9kcF9ncm91cCAqZ3JwLCBCSUdOVU0gKnMsCi0gICAgQklHTlVNICpteXB1YjEsIEJJR05VTSAqdGhlaXJwdWIxLCBCSUdOVU0gKnRoZWlycHViMiwgQklHTlVNICpteXByaXYyLAotICAgIGNvbnN0IHVfY2hhciAqdGhlaXJpZCwgdV9pbnQgdGhlaXJpZF9sZW4sCi0gICAgY29uc3QgdV9jaGFyICpteWlkLCB1X2ludCBteWlkX2xlbiwKLSAgICBjb25zdCB1X2NoYXIgKnRoZWlycHViMV9wcm9vZiwgdV9pbnQgdGhlaXJwdWIxX3Byb29mX2xlbiwKLSAgICBjb25zdCB1X2NoYXIgKnRoZWlycHViMl9wcm9vZiwgdV9pbnQgdGhlaXJwdWIyX3Byb29mX2xlbiwKLSAgICBCSUdOVU0gKipuZXdwdWIsCi0gICAgdV9jaGFyICoqbmV3cHViX2V4cG9uZW50X3Byb29mLCB1X2ludCAqbmV3cHViX2V4cG9uZW50X3Byb29mX2xlbikKLXsKLQlCTl9DVFggKmJuX2N0eDsKLQlCSUdOVU0gKnRtcCwgKmV4cG9uZW50OwotCi0JLyogVmFsaWRhdGUgcGVlcidzIHN0ZXAgMSB2YWx1ZXMgKi8KLQlpZiAoQk5fY21wKHRoZWlycHViMSwgQk5fdmFsdWVfb25lKCkpIDw9IDApCi0JCWZhdGFsKCIlczogdGhlaXJwdWIxIDw9IDEiLCBfX2Z1bmNfXyk7Ci0JaWYgKEJOX2NtcCh0aGVpcnB1YjEsIGdycC0+cCkgPj0gMCkKLQkJZmF0YWwoIiVzOiB0aGVpcnB1YjEgPj0gcCIsIF9fZnVuY19fKTsKLQlpZiAoQk5fY21wKHRoZWlycHViMiwgQk5fdmFsdWVfb25lKCkpIDw9IDApCi0JCWZhdGFsKCIlczogdGhlaXJwdWIyIDw9IDEiLCBfX2Z1bmNfXyk7Ci0JaWYgKEJOX2NtcCh0aGVpcnB1YjIsIGdycC0+cCkgPj0gMCkKLQkJZmF0YWwoIiVzOiB0aGVpcnB1YjIgPj0gcCIsIF9fZnVuY19fKTsKLQotCWlmIChzY2hub3JyX3ZlcmlmeV9idWYoZ3JwLT5wLCBncnAtPnEsIGdycC0+ZywgdGhlaXJwdWIxLAotCSAgICB0aGVpcmlkLCB0aGVpcmlkX2xlbiwgdGhlaXJwdWIxX3Byb29mLCB0aGVpcnB1YjFfcHJvb2ZfbGVuKSAhPSAxKQotCQlmYXRhbCgiJXM6IHNjaG5vcnJfdmVyaWZ5IHRoZWlycHViMSBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JaWYgKHNjaG5vcnJfdmVyaWZ5X2J1ZihncnAtPnAsIGdycC0+cSwgZ3JwLT5nLCB0aGVpcnB1YjIsCi0JICAgIHRoZWlyaWQsIHRoZWlyaWRfbGVuLCB0aGVpcnB1YjJfcHJvb2YsIHRoZWlycHViMl9wcm9vZl9sZW4pICE9IDEpCi0JCWZhdGFsKCIlczogc2Nobm9ycl92ZXJpZnkgdGhlaXJwdWIyIGZhaWxlZCIsIF9fZnVuY19fKTsKLQotCWlmICgoYm5fY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEJOX0NUWF9uZXciLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoKCpuZXdwdWIgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAotCSAgICAodG1wID0gQk5fbmV3KCkpID09IE5VTEwgfHwKLQkgICAgKGV4cG9uZW50ID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fbmV3IiwgX19mdW5jX18pOwotCi0JLyoKLQkgKiBjbGllbnQ6IGV4cG9uZW50ID0geDIgKiBzIG1vZCBwCi0JICogc2VydmVyOiBleHBvbmVudCA9IHg0ICogcyBtb2QgcAotCSAqLwotCWlmIChCTl9tb2RfbXVsKGV4cG9uZW50LCBteXByaXYyLCBzLCBncnAtPnEsIGJuX2N0eCkgIT0gMSkKLQkJZmF0YWwoIiVzOiBCTl9tb2RfbXVsIChleHBvbmVudCA9IG15cHJpdjIgKiBzIG1vZCBwKSIsCi0JCSAgICBfX2Z1bmNfXyk7Ci0KLQkvKgotCSAqIGNsaWVudDogdG1wID0gZ14oeDEgKyB4MyArIHg0KSBtb2QgcAotCSAqIHNlcnZlcjogdG1wID0gZ14oeDEgKyB4MiArIHgzKSBtb2QgcAotCSAqLwotCWlmIChCTl9tb2RfbXVsKHRtcCwgbXlwdWIxLCB0aGVpcnB1YjEsIGdycC0+cCwgYm5fY3R4KSAhPSAxKQotCQlmYXRhbCgiJXM6IEJOX21vZF9tdWwgKHRtcCA9IG15cHViMSAqIHRoZWlycHViMSBtb2QgcCkiLAotCQkgICAgX19mdW5jX18pOwotCWlmIChCTl9tb2RfbXVsKHRtcCwgdG1wLCB0aGVpcnB1YjIsIGdycC0+cCwgYm5fY3R4KSAhPSAxKQotCQlmYXRhbCgiJXM6IEJOX21vZF9tdWwgKHRtcCA9IHRtcCAqIHRoZWlycHViMiBtb2QgcCkiLCBfX2Z1bmNfXyk7Ci0KLQkvKgotCSAqIGNsaWVudDogYSA9IHRtcF5leHBvbmVudCA9IGdeKCh4MSt4Myt4NCkgKiB4MiAqIHMpIG1vZCBwCi0JICogc2VydmVyOiBiID0gdG1wXmV4cG9uZW50ID0gZ14oKHgxK3gyK3gzKSAqIHg0ICogcykgbW9kIHAKLQkgKi8KLQlpZiAoQk5fbW9kX2V4cCgqbmV3cHViLCB0bXAsIGV4cG9uZW50LCBncnAtPnAsIGJuX2N0eCkgIT0gMSkKLQkJZmF0YWwoIiVzOiBCTl9tb2RfbXVsIChuZXdwdWIgPSB0bXBeZXhwb25lbnQgbW9kIHApIiwgX19mdW5jX18pOwotCi0JSlBBS0VfREVCVUdfQk4oKHRtcCwgIiVzOiB0bXAgPSAiLCBfX2Z1bmNfXykpOwotCUpQQUtFX0RFQlVHX0JOKChleHBvbmVudCwgIiVzOiBleHBvbmVudCA9ICIsIF9fZnVuY19fKSk7Ci0KLQkvKiBOb3RlIHRoZSBnZW5lcmF0b3IgaGVyZSBpcyAndG1wJywgbm90IGcgKi8KLQlpZiAoc2Nobm9ycl9zaWduX2J1ZihncnAtPnAsIGdycC0+cSwgdG1wLCBleHBvbmVudCwgKm5ld3B1YiwKLQkgICAgbXlpZCwgbXlpZF9sZW4sCi0JICAgIG5ld3B1Yl9leHBvbmVudF9wcm9vZiwgbmV3cHViX2V4cG9uZW50X3Byb29mX2xlbikgIT0gMCkKLQkJZmF0YWwoIiVzOiBzY2hub3JyX3NpZ24gbmV3cHViIiwgX19mdW5jX18pOwotCi0JQk5fY2xlYXJfZnJlZSh0bXApOyAvKiBYWFggc3Rhc2ggZm9yIGxhdGVyIHVzZT8gKi8KLQlCTl9jbGVhcl9mcmVlKGV4cG9uZW50KTsgLyogWFhYIHN0YXNoIGZvciBsYXRlciB1c2U/ICh5ZXMsIGluIGNvbmYpICovCi0KLQlCTl9DVFhfZnJlZShibl9jdHgpOwotfQotCi0vKiBDb25maXJtYXRpb24gaGFzaCBjYWxjdWxhdGlvbiAqLwotdm9pZAotanBha2VfY29uZmlybV9oYXNoKGNvbnN0IEJJR05VTSAqaywKLSAgICBjb25zdCB1X2NoYXIgKmVuZHBvaW50X2lkLCB1X2ludCBlbmRwb2ludF9pZF9sZW4sCi0gICAgY29uc3QgdV9jaGFyICpzZXNzX2lkLCB1X2ludCBzZXNzX2lkX2xlbiwKLSAgICB1X2NoYXIgKipjb25maXJtX2hhc2gsIHVfaW50ICpjb25maXJtX2hhc2hfbGVuKQotewotCUJ1ZmZlciBiOwotCi0JLyoKLQkgKiBDYWxjdWxhdGUgY29uZmlybWF0aW9uIHByb29mOgotCSAqICAgICBjbGllbnQ6IEgoayB8fCBjbGllbnRfaWQgfHwgc2Vzc2lvbl9pZCkKLQkgKiAgICAgc2VydmVyOiBIKGsgfHwgc2VydmVyX2lkIHx8IHNlc3Npb25faWQpCi0JICovCi0JYnVmZmVyX2luaXQoJmIpOwotCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgayk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJmIsIGVuZHBvaW50X2lkLCBlbmRwb2ludF9pZF9sZW4pOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBzZXNzX2lkLCBzZXNzX2lkX2xlbik7Ci0JaWYgKGhhc2hfYnVmZmVyKGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSwgRVZQX3NoYTI1NigpLAotCSAgICBjb25maXJtX2hhc2gsIGNvbmZpcm1faGFzaF9sZW4pICE9IDApCi0JCWZhdGFsKCIlczogaGFzaF9idWZmZXIiLCBfX2Z1bmNfXyk7Ci0JYnVmZmVyX2ZyZWUoJmIpOwotfQotCi0vKiBTaGFyZWQgcGFydHMgb2Yga2V5IGRlcml2YXRpb24gYW5kIGNvbmZpcm1hdGlvbiBjYWxjdWxhdGlvbiAqLwotdm9pZAotanBha2Vfa2V5X2NvbmZpcm0oc3RydWN0IG1vZHBfZ3JvdXAgKmdycCwgQklHTlVNICpzLCBCSUdOVU0gKnN0ZXAyX3ZhbCwKLSAgICBCSUdOVU0gKm15cHJpdjIsIEJJR05VTSAqbXlwdWIxLCBCSUdOVU0gKm15cHViMiwKLSAgICBCSUdOVU0gKnRoZWlycHViMSwgQklHTlVNICp0aGVpcnB1YjIsCi0gICAgY29uc3QgdV9jaGFyICpteV9pZCwgdV9pbnQgbXlfaWRfbGVuLAotICAgIGNvbnN0IHVfY2hhciAqdGhlaXJfaWQsIHVfaW50IHRoZWlyX2lkX2xlbiwKLSAgICBjb25zdCB1X2NoYXIgKnNlc3NfaWQsIHVfaW50IHNlc3NfaWRfbGVuLAotICAgIGNvbnN0IHVfY2hhciAqdGhlaXJwcml2Ml9zX3Byb29mLCB1X2ludCB0aGVpcnByaXYyX3NfcHJvb2ZfbGVuLAotICAgIEJJR05VTSAqKmssCi0gICAgdV9jaGFyICoqY29uZmlybV9oYXNoLCB1X2ludCAqY29uZmlybV9oYXNoX2xlbikKLXsKLQlCTl9DVFggKmJuX2N0eDsKLQlCSUdOVU0gKnRtcDsKLQotCWlmICgoYm5fY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEJOX0NUWF9uZXciLCBfX2Z1bmNfXyk7Ci0JaWYgKCh0bXAgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAotCSAgICAoKmsgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7Ci0KLQkvKiBWYWxpZGF0ZSBzdGVwIDIgdmFsdWVzICovCi0JaWYgKEJOX2NtcChzdGVwMl92YWwsIEJOX3ZhbHVlX29uZSgpKSA8PSAwKQotCQlmYXRhbCgiJXM6IHN0ZXAyX3ZhbCA8PSAxIiwgX19mdW5jX18pOwotCWlmIChCTl9jbXAoc3RlcDJfdmFsLCBncnAtPnApID49IDApCi0JCWZhdGFsKCIlczogc3RlcDJfdmFsID49IHAiLCBfX2Z1bmNfXyk7Ci0KLQkvKgotCSAqIHRoZWlycHJpdjJfc19wcm9vZiBpcyBjYWxjdWxhdGVkIHdpdGggYSBkaWZmZXJlbnQgZ2VuZXJhdG9yOgotCSAqIHRtcCA9IGdeKG15cHJpdjErbXlwcml2Mit0aGVpcnB1YjEpID0gZ15teXB1YjEqZ15teXB1YjIqZ150aGVpcnB1YjEKLQkgKiBDYWxjdWxhdGUgaXQgaGVyZSBzbyB3ZSBjYW4gY2hlY2sgdGhlIHNpZ25hdHVyZS4KLQkgKi8KLQlpZiAoQk5fbW9kX211bCh0bXAsIG15cHViMSwgbXlwdWIyLCBncnAtPnAsIGJuX2N0eCkgIT0gMSkKLQkJZmF0YWwoIiVzOiBCTl9tb2RfbXVsICh0bXAgPSBteXB1YjEgKiBteXB1YjIgbW9kIHApIiwgX19mdW5jX18pOwotCWlmIChCTl9tb2RfbXVsKHRtcCwgdG1wLCB0aGVpcnB1YjEsIGdycC0+cCwgYm5fY3R4KSAhPSAxKQotCQlmYXRhbCgiJXM6IEJOX21vZF9tdWwgKHRtcCA9IHRtcCAqIHRoZWlycHViMSBtb2QgcCkiLCBfX2Z1bmNfXyk7Ci0KLQlKUEFLRV9ERUJVR19CTigodG1wLCAiJXM6IHRtcCA9ICIsIF9fZnVuY19fKSk7Ci0KLQlpZiAoc2Nobm9ycl92ZXJpZnlfYnVmKGdycC0+cCwgZ3JwLT5xLCB0bXAsIHN0ZXAyX3ZhbCwgCi0JICAgIHRoZWlyX2lkLCB0aGVpcl9pZF9sZW4sCi0JICAgIHRoZWlycHJpdjJfc19wcm9vZiwgdGhlaXJwcml2Ml9zX3Byb29mX2xlbikgIT0gMSkKLQkJZmF0YWwoIiVzOiBzY2hub3JyX3ZlcmlmeSB0aGVpcnByaXYyX3NfcHJvb2YgZmFpbGVkIiwgX19mdW5jX18pOwotCi0JLyoKLQkgKiBEZXJpdmUgc2hhcmVkIGtleToKLQkgKiAgICAgY2xpZW50OiBrID0gKGIgLyBnXih4Mip4NCpzKSleeDIgPSBnXigoeDEreDMpKngyKng0KnMpCi0JICogICAgIHNlcnZlcjogayA9IChhIC8gZ14oeDIqeDQqcykpXng0ID0gZ14oKHgxK3gzKSp4Mip4NCpzKQotCSAqCi0JICogQ29tcHV0ZWQgYXM6Ci0JICogICAgIGNsaWVudDogayA9IChnX3g0XihxIC0gKHgyICogcykpICogYileeDIgbW9kIHAKLQkgKiAgICAgc2VydmVyOiBrID0gKGdfeDJeKHEgLSAoeDQgKiBzKSkgKiBiKV54NCBtb2QgcAotCSAqLwotCWlmIChCTl9tdWwodG1wLCBteXByaXYyLCBzLCBibl9jdHgpICE9IDEpCi0JCWZhdGFsKCIlczogQk5fbXVsICh0bXAgPSBteXByaXYyICogcykiLCBfX2Z1bmNfXyk7Ci0JaWYgKEJOX21vZF9zdWIodG1wLCBncnAtPnEsIHRtcCwgZ3JwLT5xLCBibl9jdHgpICE9IDEpCi0JCWZhdGFsKCIlczogQk5fbW9kX3N1YiAodG1wID0gcSAtIHRtcCBtb2QgcSkiLCBfX2Z1bmNfXyk7Ci0JaWYgKEJOX21vZF9leHAodG1wLCB0aGVpcnB1YjIsIHRtcCwgZ3JwLT5wLCBibl9jdHgpICE9IDEpCi0JCWZhdGFsKCIlczogQk5fbW9kX2V4cCAodG1wID0gdGhlaXJwdWIyXnRtcCkgbW9kIHAiLCBfX2Z1bmNfXyk7Ci0JaWYgKEJOX21vZF9tdWwodG1wLCB0bXAsIHN0ZXAyX3ZhbCwgZ3JwLT5wLCBibl9jdHgpICE9IDEpCi0JCWZhdGFsKCIlczogQk5fbW9kX211bCAodG1wID0gdG1wICogc3RlcDJfdmFsKSBtb2QgcCIsIF9fZnVuY19fKTsKLQlpZiAoQk5fbW9kX2V4cCgqaywgdG1wLCBteXByaXYyLCBncnAtPnAsIGJuX2N0eCkgIT0gMSkKLQkJZmF0YWwoIiVzOiBCTl9tb2RfZXhwIChrID0gdG1wXm15cHJpdjIpIG1vZCBwIiwgX19mdW5jX18pOwotCQotCUJOX0NUWF9mcmVlKGJuX2N0eCk7Ci0JQk5fY2xlYXJfZnJlZSh0bXApOwotCi0JanBha2VfY29uZmlybV9oYXNoKCprLCBteV9pZCwgbXlfaWRfbGVuLCBzZXNzX2lkLCBzZXNzX2lkX2xlbiwKLQkgICAgY29uZmlybV9oYXNoLCBjb25maXJtX2hhc2hfbGVuKTsKLX0KLQotLyoKLSAqIENhbGN1bGF0ZSBhbmQgY2hlY2sgY29uZmlybWF0aW9uIGhhc2ggZnJvbSBwZWVyLiBSZXR1cm5zIDEgb24gc3VjY2VzcwotICogMCBvbiBmYWlsdXJlL21pc21hdGNoLgotICovCi1pbnQKLWpwYWtlX2NoZWNrX2NvbmZpcm0oY29uc3QgQklHTlVNICprLAotICAgIGNvbnN0IHVfY2hhciAqcGVlcl9pZCwgdV9pbnQgcGVlcl9pZF9sZW4sCi0gICAgY29uc3QgdV9jaGFyICpzZXNzX2lkLCB1X2ludCBzZXNzX2lkX2xlbiwKLSAgICBjb25zdCB1X2NoYXIgKnBlZXJfY29uZmlybV9oYXNoLCB1X2ludCBwZWVyX2NvbmZpcm1faGFzaF9sZW4pCi17Ci0JdV9jaGFyICpleHBlY3RlZF9jb25maXJtX2hhc2g7Ci0JdV9pbnQgZXhwZWN0ZWRfY29uZmlybV9oYXNoX2xlbjsKLQlpbnQgc3VjY2VzcyA9IDA7Ci0KLQkvKiBDYWxjdWxhdGUgYW5kIHZlcmlmeSBleHBlY3RlZCBjb25maXJtYXRpb24gaGFzaCAqLwotCWpwYWtlX2NvbmZpcm1faGFzaChrLCBwZWVyX2lkLCBwZWVyX2lkX2xlbiwgc2Vzc19pZCwgc2Vzc19pZF9sZW4sCi0JICAgICZleHBlY3RlZF9jb25maXJtX2hhc2gsICZleHBlY3RlZF9jb25maXJtX2hhc2hfbGVuKTsKLQotCUpQQUtFX0RFQlVHX0JVRigoZXhwZWN0ZWRfY29uZmlybV9oYXNoLCBleHBlY3RlZF9jb25maXJtX2hhc2hfbGVuLAotCSAgICAiJXM6IGV4cGVjdGVkIGNvbmZpcm0gaGFzaCIsIF9fZnVuY19fKSk7Ci0JSlBBS0VfREVCVUdfQlVGKChwZWVyX2NvbmZpcm1faGFzaCwgcGVlcl9jb25maXJtX2hhc2hfbGVuLAotCSAgICAiJXM6IHJlY2VpdmVkIGNvbmZpcm0gaGFzaCIsIF9fZnVuY19fKSk7Ci0KLQlpZiAocGVlcl9jb25maXJtX2hhc2hfbGVuICE9IGV4cGVjdGVkX2NvbmZpcm1faGFzaF9sZW4pCi0JCWVycm9yKCIlczogY29uZmlybWF0aW9uIGxlbmd0aCBtaXNtYXRjaCAobXkgJXUgdGhlbSAldSkiLAotCQkgICAgX19mdW5jX18sIGV4cGVjdGVkX2NvbmZpcm1faGFzaF9sZW4sIHBlZXJfY29uZmlybV9oYXNoX2xlbik7Ci0JZWxzZSBpZiAodGltaW5nc2FmZV9iY21wKHBlZXJfY29uZmlybV9oYXNoLCBleHBlY3RlZF9jb25maXJtX2hhc2gsCi0JICAgIGV4cGVjdGVkX2NvbmZpcm1faGFzaF9sZW4pID09IDApCi0JCXN1Y2Nlc3MgPSAxOwotCWJ6ZXJvKGV4cGVjdGVkX2NvbmZpcm1faGFzaCwgZXhwZWN0ZWRfY29uZmlybV9oYXNoX2xlbik7Ci0JeGZyZWUoZXhwZWN0ZWRfY29uZmlybV9oYXNoKTsKLQlkZWJ1ZzMoIiVzOiBzdWNjZXNzID0gJWQiLCBfX2Z1bmNfXywgc3VjY2Vzcyk7Ci0JcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLS8qIFhYWCBtYWluKCkgZnVuY3Rpb24gd2l0aCB0ZXN0cyAqLwotCi0jZW5kaWYgLyogSlBBS0UgKi8KLQpkaWZmIC0tZ2l0IGEvanBha2UuaCBiL2pwYWtlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZjJjZjAuLjAwMDAwMDAKLS0tIGEvanBha2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKiAkT3BlbkJTRDoganBha2UuaCx2IDEuMiAyMDA5LzAzLzA1IDA3OjE4OjE5IGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIEpQQUtFX0gKLSNkZWZpbmUgSlBBS0VfSAotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+Ci0KLS8qIFNldCBKUEFLRV9ERUJVRyBpbiBDRkxBR1MgZm9yIHByaXZhY3ktdmlvbGF0aW5nIGRlYnVnZ2luZyAqLwotI2lmbmRlZiBKUEFLRV9ERUJVRwotIyBkZWZpbmUgSlBBS0VfREVCVUdfQk4oYSkKLSMgZGVmaW5lIEpQQUtFX0RFQlVHX0JVRihhKQotIyBkZWZpbmUgSlBBS0VfREVCVUdfQ1RYKGEpCi0jZWxzZQotIyBkZWZpbmUgSlBBS0VfREVCVUdfQk4oYSkJZGVidWczX2JuIGEKLSMgZGVmaW5lIEpQQUtFX0RFQlVHX0JVRihhKQlkZWJ1ZzNfYnVmIGEKLSMgZGVmaW5lIEpQQUtFX0RFQlVHX0NUWChhKQlqcGFrZV9kdW1wIGEKLSNlbmRpZiAvKiBKUEFLRV9ERUJVRyAqLwotCi0jZGVmaW5lIEtaUF9JRF9MRU4JMTYJLyogTGVuZ3RoIG9mIGNsaWVudCBhbmQgc2VydmVyIElEcyAqLwotCi1zdHJ1Y3QganBha2VfY3R4IHsKLQkvKiBQYXJhbWV0ZXJzICovCi0Jc3RydWN0IG1vZHBfZ3JvdXAgKmdycDsKLQotCS8qIFByaXZhdGUgdmFsdWVzIHNoYXJlZCBieSBjbGllbnQgYW5kIHNlcnZlciAqLwotCUJJR05VTSAqczsJCQkvKiBTZWNyZXQgKHNhbHRlZCwgY3J5cHRlZCBwYXNzd29yZCkgKi8KLQlCSUdOVU0gKms7CQkJLyogRGVyaXZlZCBrZXkgKi8KLQotCS8qIENsaWVudCBwcml2YXRlIHZhbHVlcyAoTlVMTCBmb3Igc2VydmVyKSAqLwotCUJJR05VTSAqeDE7CQkJLyogcmFuZG9tIGluIFpxICovCi0JQklHTlVNICp4MjsJCQkvKiByYW5kb20gaW4gWipxICovCi0KLQkvKiBTZXJ2ZXIgcHJpdmF0ZSB2YWx1ZXMgKE5VTEwgZm9yIHNlcnZlcikgKi8KLQlCSUdOVU0gKngzOwkJCS8qIHJhbmRvbSBpbiBacSAqLwotCUJJR05VTSAqeDQ7CQkJLyogcmFuZG9tIGluIFoqcSAqLwotCi0JLyogU3RlcCAxOiBDLT5TICovCi0JdV9jaGFyICpjbGllbnRfaWQ7CQkvKiBBbnRpLXJlcGxheSBub25jZSAqLwotCXVfaW50IGNsaWVudF9pZF9sZW47Ci0JQklHTlVNICpnX3gxOwkJCS8qIGdeeDEgKi8KLQlCSUdOVU0gKmdfeDI7CQkJLyogZ154MiAqLwotCi0JLyogU3RlcCAxOiBTLT5DICovCi0JdV9jaGFyICpzZXJ2ZXJfaWQ7CQkvKiBBbnRpLXJlcGxheSBub25jZSAqLwotCXVfaW50IHNlcnZlcl9pZF9sZW47Ci0JQklHTlVNICpnX3gzOwkJCS8qIGdeeDMgKi8KLQlCSUdOVU0gKmdfeDQ7CQkJLyogZ154NCAqLwotCi0JLyogU3RlcCAyOiBDLT5TICovCi0JQklHTlVNICphOwkJCS8qIGdeKCh4MSt4Myt4NCkqeDIqcykgKi8KLQotCS8qIFN0ZXAgMjogUy0+QyAqLwotCUJJR05VTSAqYjsJCQkvKiBnXigoeDEreDIreDMpKng0KnMpICovCi0KLQkvKiBDb25maXJtYXRpb246IEMtPlMgKi8KLQl1X2NoYXIgKmhfa19jaWRfc2Vzc2lkOwkJLyogSChrIHx8IGNsaWVudF9pZCB8fCBzZXNzaW9uX2lkKSAqLwotCXVfaW50IGhfa19jaWRfc2Vzc2lkX2xlbjsKLQotCS8qIENvbmZpcm1hdGlvbjogUy0+QyAqLwotCXVfY2hhciAqaF9rX3NpZF9zZXNzaWQ7CQkvKiBIKGsgfHwgc2VydmVyX2lkIHx8IHNlc3Npb25faWQpICovCi0JdV9pbnQgaF9rX3NpZF9zZXNzaWRfbGVuOwotfTsKLQotLyoganBha2UuYyAqLwotc3RydWN0IG1vZHBfZ3JvdXAgKmpwYWtlX2RlZmF1bHRfZ3JvdXAodm9pZCk7Ci12b2lkIGpwYWtlX2R1bXAoc3RydWN0IGpwYWtlX2N0eCAqLCBjb25zdCBjaGFyICosIC4uLikKLSAgICBfX2F0dHJpYnV0ZV9fKChfX25vbm51bGxfXyAoMikpKQotICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7Ci1zdHJ1Y3QganBha2VfY3R4ICpqcGFrZV9uZXcodm9pZCk7Ci12b2lkIGpwYWtlX2ZyZWUoc3RydWN0IGpwYWtlX2N0eCAqKTsKLQotdm9pZCBqcGFrZV9zdGVwMShzdHJ1Y3QgbW9kcF9ncm91cCAqLCB1X2NoYXIgKiosIHVfaW50ICosCi0gICAgQklHTlVNICoqLCBCSUdOVU0gKiosIEJJR05VTSAqKiwgQklHTlVNICoqLAotICAgIHVfY2hhciAqKiwgdV9pbnQgKiwgdV9jaGFyICoqLCB1X2ludCAqKTsKLQotdm9pZCBqcGFrZV9zdGVwMihzdHJ1Y3QgbW9kcF9ncm91cCAqLCBCSUdOVU0gKiwKLSAgICBCSUdOVU0gKiwgQklHTlVNICosIEJJR05VTSAqLCBCSUdOVU0gKiwKLSAgICBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludCwKLSAgICBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludCwKLSAgICBCSUdOVU0gKiosIHVfY2hhciAqKiwgdV9pbnQgKik7Ci0KLXZvaWQganBha2VfY29uZmlybV9oYXNoKGNvbnN0IEJJR05VTSAqLAotICAgIGNvbnN0IHVfY2hhciAqLCB1X2ludCwKLSAgICBjb25zdCB1X2NoYXIgKiwgdV9pbnQsCi0gICAgdV9jaGFyICoqLCB1X2ludCAqKTsKLQotdm9pZCBqcGFrZV9rZXlfY29uZmlybShzdHJ1Y3QgbW9kcF9ncm91cCAqLCBCSUdOVU0gKiwgQklHTlVNICosCi0gICAgQklHTlVNICosIEJJR05VTSAqLCBCSUdOVU0gKiwgQklHTlVNICosIEJJR05VTSAqLAotICAgIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50LAotICAgIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50LAotICAgIEJJR05VTSAqKiwgdV9jaGFyICoqLCB1X2ludCAqKTsKLQotaW50IGpwYWtlX2NoZWNrX2NvbmZpcm0oY29uc3QgQklHTlVNICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCwKLSAgICBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci0KLSNlbmRpZiAvKiBKUEFLRV9IICovCi0KZGlmZiAtLWdpdCBhL2tleC5jIGIva2V4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NWUyOGYuLjAwMDAwMDAKLS0tIGEva2V4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTAgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGtleC5jLHYgMS44NiAyMDEwLzA5LzIyIDA1OjAxOjI5IGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInNzaDIuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJjaXBoZXIuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJrZXguaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJtYWMuaCIKLSNpbmNsdWRlICJtYXRjaC5oIgotI2luY2x1ZGUgImRpc3BhdGNoLmgiCi0jaW5jbHVkZSAibW9uaXRvci5oIgotI2luY2x1ZGUgInJvYW1pbmcuaCIKLQotI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMEwKLSMgaWYgZGVmaW5lZChIQVZFX0VWUF9TSEEyNTYpCi0jIGRlZmluZSBldnBfc3NoX3NoYTI1NiBFVlBfc2hhMjU2Ci0jIGVsc2UKLWV4dGVybiBjb25zdCBFVlBfTUQgKmV2cF9zc2hfc2hhMjU2KHZvaWQpOwotIyBlbmRpZgotI2VuZGlmCi0KLS8qIHByb3RvdHlwZSAqLwotc3RhdGljIHZvaWQga2V4X2tleGluaXRfZmluaXNoKEtleCAqKTsKLXN0YXRpYyB2b2lkIGtleF9jaG9vc2VfY29uZihLZXggKik7Ci0KLS8qIFZhbGlkYXRlIEtFWCBtZXRob2QgbmFtZSBsaXN0ICovCi1pbnQKLWtleF9uYW1lc192YWxpZChjb25zdCBjaGFyICpuYW1lcykKLXsKLQljaGFyICpzLCAqY3AsICpwOwotCi0JaWYgKG5hbWVzID09IE5VTEwgfHwgc3RyY21wKG5hbWVzLCAiIikgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JcyA9IGNwID0geHN0cmR1cChuYW1lcyk7Ci0JZm9yICgocCA9IHN0cnNlcCgmY3AsICIsIikpOyBwICYmICpwICE9ICdcMCc7Ci0JICAgIChwID0gc3Ryc2VwKCZjcCwgIiwiKSkpIHsKLQkgICAgCWlmIChzdHJjbXAocCwgS0VYX0RIR0VYX1NIQTI1NikgIT0gMCAmJgotCQkgICAgc3RyY21wKHAsIEtFWF9ESEdFWF9TSEExKSAhPSAwICYmCi0JCSAgICBzdHJjbXAocCwgS0VYX0RIMTQpICE9IDAgJiYKLQkJICAgIHN0cmNtcChwLCBLRVhfREgxKSAhPSAwICYmCi0JCSAgICAoc3RybmNtcChwLCBLRVhfRUNESF9TSEEyX1NURU0sCi0JCSAgICBzaXplb2YoS0VYX0VDREhfU0hBMl9TVEVNKSAtIDEpICE9IDAgfHwKLQkJICAgIGtleF9lY2RoX25hbWVfdG9fbmlkKHApID09IC0xKSkgewotCQkJZXJyb3IoIlVuc3VwcG9ydGVkIEtFWCBhbGdvcml0aG0gXCIlLjEwMHNcIiIsIHApOwotCQkJeGZyZWUocyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlkZWJ1ZzMoImtleCBuYW1lcyBvazogWyVzXSIsIG5hbWVzKTsKLQl4ZnJlZShzKTsKLQlyZXR1cm4gMTsKLX0KLQotLyogcHV0IGFsZ29yaXRobSBwcm9wb3NhbCBpbnRvIGJ1ZmZlciAqLwotc3RhdGljIHZvaWQKLWtleF9wcm9wMmJ1ZihCdWZmZXIgKmIsIGNoYXIgKnByb3Bvc2FsW1BST1BPU0FMX01BWF0pCi17Ci0JdV9pbnQgaTsKLQotCWJ1ZmZlcl9jbGVhcihiKTsKLQkvKgotCSAqIGFkZCBhIGR1bW15IGNvb2tpZSwgdGhlIGNvb2tpZSB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5Ci0JICoga2V4X3NlbmRfa2V4aW5pdCgpLCBlYWNoIHRpbWUgYSBrZXhpbml0IGlzIHNldAotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBLRVhfQ09PS0lFX0xFTjsgaSsrKQotCQlidWZmZXJfcHV0X2NoYXIoYiwgMCk7Ci0JZm9yIChpID0gMDsgaSA8IFBST1BPU0FMX01BWDsgaSsrKQotCQlidWZmZXJfcHV0X2NzdHJpbmcoYiwgcHJvcG9zYWxbaV0pOwotCWJ1ZmZlcl9wdXRfY2hhcihiLCAwKTsJCQkvKiBmaXJzdF9rZXhfcGFja2V0X2ZvbGxvd3MgKi8KLQlidWZmZXJfcHV0X2ludChiLCAwKTsJCQkvKiB1aW50MzIgcmVzZXJ2ZWQgKi8KLX0KLQotLyogcGFyc2UgYnVmZmVyIGFuZCByZXR1cm4gYWxnb3JpdGhtIHByb3Bvc2FsICovCi1zdGF0aWMgY2hhciAqKgota2V4X2J1ZjJwcm9wKEJ1ZmZlciAqcmF3LCBpbnQgKmZpcnN0X2tleF9mb2xsb3dzKQotewotCUJ1ZmZlciBiOwotCXVfaW50IGk7Ci0JY2hhciAqKnByb3Bvc2FsOwotCi0JcHJvcG9zYWwgPSB4Y2FsbG9jKFBST1BPU0FMX01BWCwgc2l6ZW9mKGNoYXIgKikpOwotCi0JYnVmZmVyX2luaXQoJmIpOwotCWJ1ZmZlcl9hcHBlbmQoJmIsIGJ1ZmZlcl9wdHIocmF3KSwgYnVmZmVyX2xlbihyYXcpKTsKLQkvKiBza2lwIGNvb2tpZSAqLwotCWZvciAoaSA9IDA7IGkgPCBLRVhfQ09PS0lFX0xFTjsgaSsrKQotCQlidWZmZXJfZ2V0X2NoYXIoJmIpOwotCS8qIGV4dHJhY3Qga2V4IGluaXQgcHJvcG9zYWwgc3RyaW5ncyAqLwotCWZvciAoaSA9IDA7IGkgPCBQUk9QT1NBTF9NQVg7IGkrKykgewotCQlwcm9wb3NhbFtpXSA9IGJ1ZmZlcl9nZXRfY3N0cmluZygmYixOVUxMKTsKLQkJZGVidWcyKCJrZXhfcGFyc2Vfa2V4aW5pdDogJXMiLCBwcm9wb3NhbFtpXSk7Ci0JfQotCS8qIGZpcnN0IGtleCBmb2xsb3dzIC8gcmVzZXJ2ZWQgKi8KLQlpID0gYnVmZmVyX2dldF9jaGFyKCZiKTsKLQlpZiAoZmlyc3Rfa2V4X2ZvbGxvd3MgIT0gTlVMTCkKLQkJKmZpcnN0X2tleF9mb2xsb3dzID0gaTsKLQlkZWJ1ZzIoImtleF9wYXJzZV9rZXhpbml0OiBmaXJzdF9rZXhfZm9sbG93cyAlZCAiLCBpKTsKLQlpID0gYnVmZmVyX2dldF9pbnQoJmIpOwotCWRlYnVnMigia2V4X3BhcnNlX2tleGluaXQ6IHJlc2VydmVkICV1ICIsIGkpOwotCWJ1ZmZlcl9mcmVlKCZiKTsKLQlyZXR1cm4gcHJvcG9zYWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1rZXhfcHJvcF9mcmVlKGNoYXIgKipwcm9wb3NhbCkKLXsKLQl1X2ludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IFBST1BPU0FMX01BWDsgaSsrKQotCQl4ZnJlZShwcm9wb3NhbFtpXSk7Ci0JeGZyZWUocHJvcG9zYWwpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLWtleF9wcm90b2NvbF9lcnJvcihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQllcnJvcigiSG0sIGtleCBwcm90b2NvbCBlcnJvcjogdHlwZSAlZCBzZXEgJXUiLCB0eXBlLCBzZXEpOwotfQotCi1zdGF0aWMgdm9pZAota2V4X3Jlc2V0X2Rpc3BhdGNoKHZvaWQpCi17Ci0JZGlzcGF0Y2hfcmFuZ2UoU1NIMl9NU0dfVFJBTlNQT1JUX01JTiwKLQkgICAgU1NIMl9NU0dfVFJBTlNQT1JUX01BWCwgJmtleF9wcm90b2NvbF9lcnJvcik7Ci0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX0tFWElOSVQsICZrZXhfaW5wdXRfa2V4aW5pdCk7Ci19Ci0KLXZvaWQKLWtleF9maW5pc2goS2V4ICprZXgpCi17Ci0Ja2V4X3Jlc2V0X2Rpc3BhdGNoKCk7Ci0KLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfTkVXS0VZUyk7Ci0JcGFja2V0X3NlbmQoKTsKLQkvKiBwYWNrZXRfd3JpdGVfd2FpdCgpOyAqLwotCWRlYnVnKCJTU0gyX01TR19ORVdLRVlTIHNlbnQiKTsKLQotCWRlYnVnKCJleHBlY3RpbmcgU1NIMl9NU0dfTkVXS0VZUyIpOwotCXBhY2tldF9yZWFkX2V4cGVjdChTU0gyX01TR19ORVdLRVlTKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0JZGVidWcoIlNTSDJfTVNHX05FV0tFWVMgcmVjZWl2ZWQiKTsKLQotCWtleC0+ZG9uZSA9IDE7Ci0JYnVmZmVyX2NsZWFyKCZrZXgtPnBlZXIpOwotCS8qIGJ1ZmZlcl9jbGVhcigma2V4LT5teSk7ICovCi0Ja2V4LT5mbGFncyAmPSB+S0VYX0lOSVRfU0VOVDsKLQl4ZnJlZShrZXgtPm5hbWUpOwotCWtleC0+bmFtZSA9IE5VTEw7Ci19Ci0KLXZvaWQKLWtleF9zZW5kX2tleGluaXQoS2V4ICprZXgpCi17Ci0JdV9pbnQzMl90IHJuZCA9IDA7Ci0JdV9jaGFyICpjb29raWU7Ci0JdV9pbnQgaTsKLQotCWlmIChrZXggPT0gTlVMTCkgewotCQllcnJvcigia2V4X3NlbmRfa2V4aW5pdDogbm8ga2V4LCBjYW5ub3QgcmVrZXkiKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoa2V4LT5mbGFncyAmIEtFWF9JTklUX1NFTlQpIHsKLQkJZGVidWcoIktFWF9JTklUX1NFTlQiKTsKLQkJcmV0dXJuOwotCX0KLQlrZXgtPmRvbmUgPSAwOwotCi0JLyogZ2VuZXJhdGUgYSByYW5kb20gY29va2llICovCi0JaWYgKGJ1ZmZlcl9sZW4oJmtleC0+bXkpIDwgS0VYX0NPT0tJRV9MRU4pCi0JCWZhdGFsKCJrZXhfc2VuZF9rZXhpbml0OiBrZXggcHJvcG9zYWwgdG9vIHNob3J0Iik7Ci0JY29va2llID0gYnVmZmVyX3B0cigma2V4LT5teSk7Ci0JZm9yIChpID0gMDsgaSA8IEtFWF9DT09LSUVfTEVOOyBpKyspIHsKLQkJaWYgKGkgJSA0ID09IDApCi0JCQlybmQgPSBhcmM0cmFuZG9tKCk7Ci0JCWNvb2tpZVtpXSA9IHJuZDsKLQkJcm5kID4+PSA4OwotCX0KLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfS0VYSU5JVCk7Ci0JcGFja2V0X3B1dF9yYXcoYnVmZmVyX3B0cigma2V4LT5teSksIGJ1ZmZlcl9sZW4oJmtleC0+bXkpKTsKLQlwYWNrZXRfc2VuZCgpOwotCWRlYnVnKCJTU0gyX01TR19LRVhJTklUIHNlbnQiKTsKLQlrZXgtPmZsYWdzIHw9IEtFWF9JTklUX1NFTlQ7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi12b2lkCi1rZXhfaW5wdXRfa2V4aW5pdChpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQljaGFyICpwdHI7Ci0JdV9pbnQgaSwgZGxlbjsKLQlLZXggKmtleCA9IChLZXggKiljdHh0OwotCi0JZGVidWcoIlNTSDJfTVNHX0tFWElOSVQgcmVjZWl2ZWQiKTsKLQlpZiAoa2V4ID09IE5VTEwpCi0JCWZhdGFsKCJrZXhfaW5wdXRfa2V4aW5pdDogbm8ga2V4LCBjYW5ub3QgcmVrZXkiKTsKLQotCXB0ciA9IHBhY2tldF9nZXRfcmF3KCZkbGVuKTsKLQlidWZmZXJfYXBwZW5kKCZrZXgtPnBlZXIsIHB0ciwgZGxlbik7Ci0KLQkvKiBkaXNjYXJkIHBhY2tldCAqLwotCWZvciAoaSA9IDA7IGkgPCBLRVhfQ09PS0lFX0xFTjsgaSsrKQotCQlwYWNrZXRfZ2V0X2NoYXIoKTsKLQlmb3IgKGkgPSAwOyBpIDwgUFJPUE9TQUxfTUFYOyBpKyspCi0JCXhmcmVlKHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpKTsKLQkodm9pZCkgcGFja2V0X2dldF9jaGFyKCk7Ci0JKHZvaWQpIHBhY2tldF9nZXRfaW50KCk7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0Ja2V4X2tleGluaXRfZmluaXNoKGtleCk7Ci19Ci0KLUtleCAqCi1rZXhfc2V0dXAoY2hhciAqcHJvcG9zYWxbUFJPUE9TQUxfTUFYXSkKLXsKLQlLZXggKmtleDsKLQotCWtleCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCprZXgpKTsKLQlidWZmZXJfaW5pdCgma2V4LT5wZWVyKTsKLQlidWZmZXJfaW5pdCgma2V4LT5teSk7Ci0Ja2V4X3Byb3AyYnVmKCZrZXgtPm15LCBwcm9wb3NhbCk7Ci0Ja2V4LT5kb25lID0gMDsKLQotCWtleF9zZW5kX2tleGluaXQoa2V4KTsJCQkJCS8qIHdlIHN0YXJ0ICovCi0Ja2V4X3Jlc2V0X2Rpc3BhdGNoKCk7Ci0KLQlyZXR1cm4ga2V4OwotfQotCi1zdGF0aWMgdm9pZAota2V4X2tleGluaXRfZmluaXNoKEtleCAqa2V4KQotewotCWlmICghKGtleC0+ZmxhZ3MgJiBLRVhfSU5JVF9TRU5UKSkKLQkJa2V4X3NlbmRfa2V4aW5pdChrZXgpOwotCi0Ja2V4X2Nob29zZV9jb25mKGtleCk7Ci0KLQlpZiAoa2V4LT5rZXhfdHlwZSA+PSAwICYmIGtleC0+a2V4X3R5cGUgPCBLRVhfTUFYICYmCi0JICAgIGtleC0+a2V4W2tleC0+a2V4X3R5cGVdICE9IE5VTEwpIHsKLQkJKGtleC0+a2V4W2tleC0+a2V4X3R5cGVdKShrZXgpOwotCX0gZWxzZSB7Ci0JCWZhdGFsKCJVbnN1cHBvcnRlZCBrZXkgZXhjaGFuZ2UgJWQiLCBrZXgtPmtleF90eXBlKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaG9vc2VfZW5jKEVuYyAqZW5jLCBjaGFyICpjbGllbnQsIGNoYXIgKnNlcnZlcikKLXsKLQljaGFyICpuYW1lID0gbWF0Y2hfbGlzdChjbGllbnQsIHNlcnZlciwgTlVMTCk7Ci0JaWYgKG5hbWUgPT0gTlVMTCkKLQkJZmF0YWwoIm5vIG1hdGNoaW5nIGNpcGhlciBmb3VuZDogY2xpZW50ICVzIHNlcnZlciAlcyIsCi0JCSAgICBjbGllbnQsIHNlcnZlcik7Ci0JaWYgKChlbmMtPmNpcGhlciA9IGNpcGhlcl9ieV9uYW1lKG5hbWUpKSA9PSBOVUxMKQotCQlmYXRhbCgibWF0Y2hpbmcgY2lwaGVyIGlzIG5vdCBzdXBwb3J0ZWQ6ICVzIiwgbmFtZSk7Ci0JZW5jLT5uYW1lID0gbmFtZTsKLQllbmMtPmVuYWJsZWQgPSAwOwotCWVuYy0+aXYgPSBOVUxMOwotCWVuYy0+a2V5ID0gTlVMTDsKLQllbmMtPmtleV9sZW4gPSBjaXBoZXJfa2V5bGVuKGVuYy0+Y2lwaGVyKTsKLQllbmMtPmJsb2NrX3NpemUgPSBjaXBoZXJfYmxvY2tzaXplKGVuYy0+Y2lwaGVyKTsKLX0KLQotc3RhdGljIHZvaWQKLWNob29zZV9tYWMoTWFjICptYWMsIGNoYXIgKmNsaWVudCwgY2hhciAqc2VydmVyKQotewotCWNoYXIgKm5hbWUgPSBtYXRjaF9saXN0KGNsaWVudCwgc2VydmVyLCBOVUxMKTsKLQlpZiAobmFtZSA9PSBOVUxMKQotCQlmYXRhbCgibm8gbWF0Y2hpbmcgbWFjIGZvdW5kOiBjbGllbnQgJXMgc2VydmVyICVzIiwKLQkJICAgIGNsaWVudCwgc2VydmVyKTsKLQlpZiAobWFjX3NldHVwKG1hYywgbmFtZSkgPCAwKQotCQlmYXRhbCgidW5zdXBwb3J0ZWQgbWFjICVzIiwgbmFtZSk7Ci0JLyogdHJ1bmNhdGUgdGhlIGtleSAqLwotCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfSE1BQykKLQkJbWFjLT5rZXlfbGVuID0gMTY7Ci0JbWFjLT5uYW1lID0gbmFtZTsKLQltYWMtPmtleSA9IE5VTEw7Ci0JbWFjLT5lbmFibGVkID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLWNob29zZV9jb21wKENvbXAgKmNvbXAsIGNoYXIgKmNsaWVudCwgY2hhciAqc2VydmVyKQotewotCWNoYXIgKm5hbWUgPSBtYXRjaF9saXN0KGNsaWVudCwgc2VydmVyLCBOVUxMKTsKLQlpZiAobmFtZSA9PSBOVUxMKQotCQlmYXRhbCgibm8gbWF0Y2hpbmcgY29tcCBmb3VuZDogY2xpZW50ICVzIHNlcnZlciAlcyIsIGNsaWVudCwgc2VydmVyKTsKLQlpZiAoc3RyY21wKG5hbWUsICJ6bGliQG9wZW5zc2guY29tIikgPT0gMCkgewotCQljb21wLT50eXBlID0gQ09NUF9ERUxBWUVEOwotCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJ6bGliIikgPT0gMCkgewotCQljb21wLT50eXBlID0gQ09NUF9aTElCOwotCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJub25lIikgPT0gMCkgewotCQljb21wLT50eXBlID0gQ09NUF9OT05FOwotCX0gZWxzZSB7Ci0JCWZhdGFsKCJ1bnN1cHBvcnRlZCBjb21wICVzIiwgbmFtZSk7Ci0JfQotCWNvbXAtPm5hbWUgPSBuYW1lOwotfQotCi1zdGF0aWMgdm9pZAotY2hvb3NlX2tleChLZXggKmssIGNoYXIgKmNsaWVudCwgY2hhciAqc2VydmVyKQotewotCWstPm5hbWUgPSBtYXRjaF9saXN0KGNsaWVudCwgc2VydmVyLCBOVUxMKTsKLQlpZiAoay0+bmFtZSA9PSBOVUxMKQotCQlmYXRhbCgiVW5hYmxlIHRvIG5lZ290aWF0ZSBhIGtleSBleGNoYW5nZSBtZXRob2QiKTsKLQlpZiAoc3RyY21wKGstPm5hbWUsIEtFWF9ESDEpID09IDApIHsKLQkJay0+a2V4X3R5cGUgPSBLRVhfREhfR1JQMV9TSEExOwotCQlrLT5ldnBfbWQgPSBFVlBfc2hhMSgpOwotCX0gZWxzZSBpZiAoc3RyY21wKGstPm5hbWUsIEtFWF9ESDE0KSA9PSAwKSB7Ci0JCWstPmtleF90eXBlID0gS0VYX0RIX0dSUDE0X1NIQTE7Ci0JCWstPmV2cF9tZCA9IEVWUF9zaGExKCk7Ci0JfSBlbHNlIGlmIChzdHJjbXAoay0+bmFtZSwgS0VYX0RIR0VYX1NIQTEpID09IDApIHsKLQkJay0+a2V4X3R5cGUgPSBLRVhfREhfR0VYX1NIQTE7Ci0JCWstPmV2cF9tZCA9IEVWUF9zaGExKCk7Ci0jaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA3MDAwTAotCX0gZWxzZSBpZiAoc3RyY21wKGstPm5hbWUsIEtFWF9ESEdFWF9TSEEyNTYpID09IDApIHsKLQkJay0+a2V4X3R5cGUgPSBLRVhfREhfR0VYX1NIQTI1NjsKLQkJay0+ZXZwX21kID0gZXZwX3NzaF9zaGEyNTYoKTsKLQl9IGVsc2UgaWYgKHN0cm5jbXAoay0+bmFtZSwgS0VYX0VDREhfU0hBMl9TVEVNLAotCSAgICBzaXplb2YoS0VYX0VDREhfU0hBMl9TVEVNKSAtIDEpID09IDApIHsKLSAJCWstPmtleF90eXBlID0gS0VYX0VDREhfU0hBMjsKLQkJay0+ZXZwX21kID0ga2V4X2VjZGhfbmFtZV90b19ldnBtZChrLT5uYW1lKTsKLSNlbmRpZgotCX0gZWxzZQotCQlmYXRhbCgiYmFkIGtleCBhbGcgJXMiLCBrLT5uYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLWNob29zZV9ob3N0a2V5YWxnKEtleCAqaywgY2hhciAqY2xpZW50LCBjaGFyICpzZXJ2ZXIpCi17Ci0JY2hhciAqaG9zdGtleWFsZyA9IG1hdGNoX2xpc3QoY2xpZW50LCBzZXJ2ZXIsIE5VTEwpOwotCWlmIChob3N0a2V5YWxnID09IE5VTEwpCi0JCWZhdGFsKCJubyBob3N0a2V5IGFsZyIpOwotCWstPmhvc3RrZXlfdHlwZSA9IGtleV90eXBlX2Zyb21fbmFtZShob3N0a2V5YWxnKTsKLQlpZiAoay0+aG9zdGtleV90eXBlID09IEtFWV9VTlNQRUMpCi0JCWZhdGFsKCJiYWQgaG9zdGtleSBhbGcgJyVzJyIsIGhvc3RrZXlhbGcpOwotCXhmcmVlKGhvc3RrZXlhbGcpOwotfQotCi1zdGF0aWMgaW50Ci1wcm9wb3NhbHNfbWF0Y2goY2hhciAqbXlbUFJPUE9TQUxfTUFYXSwgY2hhciAqcGVlcltQUk9QT1NBTF9NQVhdKQotewotCXN0YXRpYyBpbnQgY2hlY2tbXSA9IHsKLQkJUFJPUE9TQUxfS0VYX0FMR1MsIFBST1BPU0FMX1NFUlZFUl9IT1NUX0tFWV9BTEdTLCAtMQotCX07Ci0JaW50ICppZHg7Ci0JY2hhciAqcDsKLQotCWZvciAoaWR4ID0gJmNoZWNrWzBdOyAqaWR4ICE9IC0xOyBpZHgrKykgewotCQlpZiAoKHAgPSBzdHJjaHIobXlbKmlkeF0sICcsJykpICE9IE5VTEwpCi0JCQkqcCA9ICdcMCc7Ci0JCWlmICgocCA9IHN0cmNocihwZWVyWyppZHhdLCAnLCcpKSAhPSBOVUxMKQotCQkJKnAgPSAnXDAnOwotCQlpZiAoc3RyY21wKG15WyppZHhdLCBwZWVyWyppZHhdKSAhPSAwKSB7Ci0JCQlkZWJ1ZzIoInByb3Bvc2FsIG1pc21hdGNoOiBteSAlcyBwZWVyICVzIiwKLQkJCSAgICBteVsqaWR4XSwgcGVlclsqaWR4XSk7Ci0JCQlyZXR1cm4gKDApOwotCQl9Ci0JfQotCWRlYnVnMigicHJvcG9zYWxzIG1hdGNoIik7Ci0JcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLWtleF9jaG9vc2VfY29uZihLZXggKmtleCkKLXsKLQlOZXdrZXlzICpuZXdrZXlzOwotCWNoYXIgKipteSwgKipwZWVyOwotCWNoYXIgKipjcHJvcCwgKipzcHJvcDsKLQlpbnQgbmVuYywgbm1hYywgbmNvbXA7Ci0JdV9pbnQgbW9kZSwgY3RvcywgbmVlZDsKLQlpbnQgZmlyc3Rfa2V4X2ZvbGxvd3MsIHR5cGU7Ci0KLQlteSAgID0ga2V4X2J1ZjJwcm9wKCZrZXgtPm15LCBOVUxMKTsKLQlwZWVyID0ga2V4X2J1ZjJwcm9wKCZrZXgtPnBlZXIsICZmaXJzdF9rZXhfZm9sbG93cyk7Ci0KLQlpZiAoa2V4LT5zZXJ2ZXIpIHsKLQkJY3Byb3A9cGVlcjsKLQkJc3Byb3A9bXk7Ci0JfSBlbHNlIHsKLQkJY3Byb3A9bXk7Ci0JCXNwcm9wPXBlZXI7Ci0JfQotCi0JLyogQ2hlY2sgd2hldGhlciBzZXJ2ZXIgb2ZmZXJzIHJvYW1pbmcgKi8KLQlpZiAoIWtleC0+c2VydmVyKSB7Ci0JCWNoYXIgKnJvYW1pbmc7Ci0JCXJvYW1pbmcgPSBtYXRjaF9saXN0KEtFWF9SRVNVTUUsIHBlZXJbUFJPUE9TQUxfS0VYX0FMR1NdLCBOVUxMKTsKLQkJaWYgKHJvYW1pbmcpIHsKLQkJCWtleC0+cm9hbWluZyA9IDE7Ci0JCQl4ZnJlZShyb2FtaW5nKTsKLQkJfQotCX0KLQotCS8qIEFsZ29yaXRobSBOZWdvdGlhdGlvbiAqLwotCWZvciAobW9kZSA9IDA7IG1vZGUgPCBNT0RFX01BWDsgbW9kZSsrKSB7Ci0JCW5ld2tleXMgPSB4Y2FsbG9jKDEsIHNpemVvZigqbmV3a2V5cykpOwotCQlrZXgtPm5ld2tleXNbbW9kZV0gPSBuZXdrZXlzOwotCQljdG9zID0gKCFrZXgtPnNlcnZlciAmJiBtb2RlID09IE1PREVfT1VUKSB8fAotCQkgICAgKGtleC0+c2VydmVyICYmIG1vZGUgPT0gTU9ERV9JTik7Ci0JCW5lbmMgID0gY3RvcyA/IFBST1BPU0FMX0VOQ19BTEdTX0NUT1MgIDogUFJPUE9TQUxfRU5DX0FMR1NfU1RPQzsKLQkJbm1hYyAgPSBjdG9zID8gUFJPUE9TQUxfTUFDX0FMR1NfQ1RPUyAgOiBQUk9QT1NBTF9NQUNfQUxHU19TVE9DOwotCQluY29tcCA9IGN0b3MgPyBQUk9QT1NBTF9DT01QX0FMR1NfQ1RPUyA6IFBST1BPU0FMX0NPTVBfQUxHU19TVE9DOwotCQljaG9vc2VfZW5jICgmbmV3a2V5cy0+ZW5jLCAgY3Byb3BbbmVuY10sICBzcHJvcFtuZW5jXSk7Ci0JCWNob29zZV9tYWMgKCZuZXdrZXlzLT5tYWMsICBjcHJvcFtubWFjXSwgIHNwcm9wW25tYWNdKTsKLQkJY2hvb3NlX2NvbXAoJm5ld2tleXMtPmNvbXAsIGNwcm9wW25jb21wXSwgc3Byb3BbbmNvbXBdKTsKLQkJZGVidWcoImtleDogJXMgJXMgJXMgJXMiLAotCQkgICAgY3RvcyA/ICJjbGllbnQtPnNlcnZlciIgOiAic2VydmVyLT5jbGllbnQiLAotCQkgICAgbmV3a2V5cy0+ZW5jLm5hbWUsCi0JCSAgICBuZXdrZXlzLT5tYWMubmFtZSwKLQkJICAgIG5ld2tleXMtPmNvbXAubmFtZSk7Ci0JfQotCWNob29zZV9rZXgoa2V4LCBjcHJvcFtQUk9QT1NBTF9LRVhfQUxHU10sIHNwcm9wW1BST1BPU0FMX0tFWF9BTEdTXSk7Ci0JY2hvb3NlX2hvc3RrZXlhbGcoa2V4LCBjcHJvcFtQUk9QT1NBTF9TRVJWRVJfSE9TVF9LRVlfQUxHU10sCi0JICAgIHNwcm9wW1BST1BPU0FMX1NFUlZFUl9IT1NUX0tFWV9BTEdTXSk7Ci0JbmVlZCA9IDA7Ci0JZm9yIChtb2RlID0gMDsgbW9kZSA8IE1PREVfTUFYOyBtb2RlKyspIHsKLQkJbmV3a2V5cyA9IGtleC0+bmV3a2V5c1ttb2RlXTsKLQkJaWYgKG5lZWQgPCBuZXdrZXlzLT5lbmMua2V5X2xlbikKLQkJCW5lZWQgPSBuZXdrZXlzLT5lbmMua2V5X2xlbjsKLQkJaWYgKG5lZWQgPCBuZXdrZXlzLT5lbmMuYmxvY2tfc2l6ZSkKLQkJCW5lZWQgPSBuZXdrZXlzLT5lbmMuYmxvY2tfc2l6ZTsKLQkJaWYgKG5lZWQgPCBuZXdrZXlzLT5tYWMua2V5X2xlbikKLQkJCW5lZWQgPSBuZXdrZXlzLT5tYWMua2V5X2xlbjsKLQl9Ci0JLyogWFhYIG5lZWQgcnVuZGVuPyAqLwotCWtleC0+d2VfbmVlZCA9IG5lZWQ7Ci0KLQkvKiBpZ25vcmUgdGhlIG5leHQgbWVzc2FnZSBpZiB0aGUgcHJvcG9zYWxzIGRvIG5vdCBtYXRjaCAqLwotCWlmIChmaXJzdF9rZXhfZm9sbG93cyAmJiAhcHJvcG9zYWxzX21hdGNoKG15LCBwZWVyKSAmJgotCSAgICAhKGRhdGFmZWxsb3dzICYgU1NIX0JVR19GSVJTVEtFWCkpIHsKLQkJdHlwZSA9IHBhY2tldF9yZWFkKCk7Ci0JCWRlYnVnMigic2tpcHBpbmcgbmV4dCBwYWNrZXQgKHR5cGUgJXUpIiwgdHlwZSk7Ci0JfQotCi0Ja2V4X3Byb3BfZnJlZShteSk7Ci0Ja2V4X3Byb3BfZnJlZShwZWVyKTsKLX0KLQotc3RhdGljIHVfY2hhciAqCi1kZXJpdmVfa2V5KEtleCAqa2V4LCBpbnQgaWQsIHVfaW50IG5lZWQsIHVfY2hhciAqaGFzaCwgdV9pbnQgaGFzaGxlbiwKLSAgICBCSUdOVU0gKnNoYXJlZF9zZWNyZXQpCi17Ci0JQnVmZmVyIGI7Ci0JRVZQX01EX0NUWCBtZDsKLQljaGFyIGMgPSBpZDsKLQl1X2ludCBoYXZlOwotCWludCBtZHN6OwotCXVfY2hhciAqZGlnZXN0OwotCi0JaWYgKChtZHN6ID0gRVZQX01EX3NpemUoa2V4LT5ldnBfbWQpKSA8PSAwKQotCQlmYXRhbCgiYmFkIGtleCBtZCBzaXplICVkIiwgbWRzeik7Ci0JZGlnZXN0ID0geG1hbGxvYyhyb3VuZHVwKG5lZWQsIG1kc3opKTsKLQotCWJ1ZmZlcl9pbml0KCZiKTsKLQlidWZmZXJfcHV0X2JpZ251bTIoJmIsIHNoYXJlZF9zZWNyZXQpOwotCi0JLyogSzEgPSBIQVNIKEsgfHwgSCB8fCAiQSIgfHwgc2Vzc2lvbl9pZCkgKi8KLQlFVlBfRGlnZXN0SW5pdCgmbWQsIGtleC0+ZXZwX21kKTsKLQlpZiAoIShkYXRhZmVsbG93cyAmIFNTSF9CVUdfREVSSVZFS0VZKSkKLQkJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7Ci0JRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGhhc2gsIGhhc2hsZW4pOwotCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCAmYywgMSk7Ci0JRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGtleC0+c2Vzc2lvbl9pZCwga2V4LT5zZXNzaW9uX2lkX2xlbik7Ci0JRVZQX0RpZ2VzdEZpbmFsKCZtZCwgZGlnZXN0LCBOVUxMKTsKLQotCS8qCi0JICogZXhwYW5kIGtleToKLQkgKiBLbiA9IEhBU0goSyB8fCBIIHx8IEsxIHx8IEsyIHx8IC4uLiB8fCBLbi0xKQotCSAqIEtleSA9IEsxIHx8IEsyIHx8IC4uLiB8fCBLbgotCSAqLwotCWZvciAoaGF2ZSA9IG1kc3o7IG5lZWQgPiBoYXZlOyBoYXZlICs9IG1kc3opIHsKLQkJRVZQX0RpZ2VzdEluaXQoJm1kLCBrZXgtPmV2cF9tZCk7Ci0JCWlmICghKGRhdGFmZWxsb3dzICYgU1NIX0JVR19ERVJJVkVLRVkpKQotCQkJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7Ci0JCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBoYXNoLCBoYXNobGVuKTsKLQkJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGRpZ2VzdCwgaGF2ZSk7Ci0JCUVWUF9EaWdlc3RGaW5hbCgmbWQsIGRpZ2VzdCArIGhhdmUsIE5VTEwpOwotCX0KLQlidWZmZXJfZnJlZSgmYik7Ci0jaWZkZWYgREVCVUdfS0VYCi0JZnByaW50ZihzdGRlcnIsICJrZXkgJyVjJz09ICIsIGMpOwotCWR1bXBfZGlnZXN0KCJrZXkiLCBkaWdlc3QsIG5lZWQpOwotI2VuZGlmCi0JcmV0dXJuIGRpZ2VzdDsKLX0KLQotTmV3a2V5cyAqY3VycmVudF9rZXlzW01PREVfTUFYXTsKLQotI2RlZmluZSBOS0VZUwk2Ci12b2lkCi1rZXhfZGVyaXZlX2tleXMoS2V4ICprZXgsIHVfY2hhciAqaGFzaCwgdV9pbnQgaGFzaGxlbiwgQklHTlVNICpzaGFyZWRfc2VjcmV0KQotewotCXVfY2hhciAqa2V5c1tOS0VZU107Ci0JdV9pbnQgaSwgbW9kZSwgY3RvczsKLQotCWZvciAoaSA9IDA7IGkgPCBOS0VZUzsgaSsrKSB7Ci0JCWtleXNbaV0gPSBkZXJpdmVfa2V5KGtleCwgJ0EnK2ksIGtleC0+d2VfbmVlZCwgaGFzaCwgaGFzaGxlbiwKLQkJICAgIHNoYXJlZF9zZWNyZXQpOwotCX0KLQotCWRlYnVnMigia2V4X2Rlcml2ZV9rZXlzIik7Ci0JZm9yIChtb2RlID0gMDsgbW9kZSA8IE1PREVfTUFYOyBtb2RlKyspIHsKLQkJY3VycmVudF9rZXlzW21vZGVdID0ga2V4LT5uZXdrZXlzW21vZGVdOwotCQlrZXgtPm5ld2tleXNbbW9kZV0gPSBOVUxMOwotCQljdG9zID0gKCFrZXgtPnNlcnZlciAmJiBtb2RlID09IE1PREVfT1VUKSB8fAotCQkgICAgKGtleC0+c2VydmVyICYmIG1vZGUgPT0gTU9ERV9JTik7Ci0JCWN1cnJlbnRfa2V5c1ttb2RlXS0+ZW5jLml2ICA9IGtleXNbY3RvcyA/IDAgOiAxXTsKLQkJY3VycmVudF9rZXlzW21vZGVdLT5lbmMua2V5ID0ga2V5c1tjdG9zID8gMiA6IDNdOwotCQljdXJyZW50X2tleXNbbW9kZV0tPm1hYy5rZXkgPSBrZXlzW2N0b3MgPyA0IDogNV07Ci0JfQotfQotCi1OZXdrZXlzICoKLWtleF9nZXRfbmV3a2V5cyhpbnQgbW9kZSkKLXsKLQlOZXdrZXlzICpyZXQ7Ci0KLQlyZXQgPSBjdXJyZW50X2tleXNbbW9kZV07Ci0JY3VycmVudF9rZXlzW21vZGVdID0gTlVMTDsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkCi1kZXJpdmVfc3NoMV9zZXNzaW9uX2lkKEJJR05VTSAqaG9zdF9tb2R1bHVzLCBCSUdOVU0gKnNlcnZlcl9tb2R1bHVzLAotICAgIHVfaW50OF90IGNvb2tpZVs4XSwgdV9pbnQ4X3QgaWRbMTZdKQotewotCWNvbnN0IEVWUF9NRCAqZXZwX21kID0gRVZQX21kNSgpOwotCUVWUF9NRF9DVFggbWQ7Ci0JdV9pbnQ4X3QgbmJ1ZlsyMDQ4XSwgb2J1ZltFVlBfTUFYX01EX1NJWkVdOwotCWludCBsZW47Ci0KLQlFVlBfRGlnZXN0SW5pdCgmbWQsIGV2cF9tZCk7Ci0KLQlsZW4gPSBCTl9udW1fYnl0ZXMoaG9zdF9tb2R1bHVzKTsKLQlpZiAobGVuIDwgKDUxMiAvIDgpIHx8ICh1X2ludClsZW4gPiBzaXplb2YobmJ1ZikpCi0JCWZhdGFsKCIlczogYmFkIGhvc3QgbW9kdWx1cyAobGVuICVkKSIsIF9fZnVuY19fLCBsZW4pOwotCUJOX2JuMmJpbihob3N0X21vZHVsdXMsIG5idWYpOwotCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBuYnVmLCBsZW4pOwotCi0JbGVuID0gQk5fbnVtX2J5dGVzKHNlcnZlcl9tb2R1bHVzKTsKLQlpZiAobGVuIDwgKDUxMiAvIDgpIHx8ICh1X2ludClsZW4gPiBzaXplb2YobmJ1ZikpCi0JCWZhdGFsKCIlczogYmFkIHNlcnZlciBtb2R1bHVzIChsZW4gJWQpIiwgX19mdW5jX18sIGxlbik7Ci0JQk5fYm4yYmluKHNlcnZlcl9tb2R1bHVzLCBuYnVmKTsKLQlFVlBfRGlnZXN0VXBkYXRlKCZtZCwgbmJ1ZiwgbGVuKTsKLQotCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBjb29raWUsIDgpOwotCi0JRVZQX0RpZ2VzdEZpbmFsKCZtZCwgb2J1ZiwgTlVMTCk7Ci0JbWVtY3B5KGlkLCBvYnVmLCAxNik7Ci0KLQltZW1zZXQobmJ1ZiwgMCwgc2l6ZW9mKG5idWYpKTsKLQltZW1zZXQob2J1ZiwgMCwgc2l6ZW9mKG9idWYpKTsKLQltZW1zZXQoJm1kLCAwLCBzaXplb2YobWQpKTsKLX0KLQotI2lmIGRlZmluZWQoREVCVUdfS0VYKSB8fCBkZWZpbmVkKERFQlVHX0tFWERIKSB8fCBkZWZpbmVkKERFQlVHX0tFWEVDREgpCi12b2lkCi1kdW1wX2RpZ2VzdChjaGFyICptc2csIHVfY2hhciAqZGlnZXN0LCBpbnQgbGVuKQotewotCWludCBpOwotCi0JZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbXNnKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJZnByaW50ZihzdGRlcnIsICIlMDJ4IiwgZGlnZXN0W2ldKTsKLQkJaWYgKGklMzIgPT0gMzEpCi0JCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCWVsc2UgaWYgKGklOCA9PSA3KQotCQkJZnByaW50ZihzdGRlcnIsICIgIik7Ci0JfQotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEva2V4LmggYi9rZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3M2QzYy4uMDAwMDAwMAotLS0gYS9rZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKiAkT3BlbkJTRDoga2V4LmgsdiAxLjUyIDIwMTAvMDkvMjIgMDU6MDE6MjkgZGptIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0jaWZuZGVmIEtFWF9ICi0jZGVmaW5lIEtFWF9ICi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KLSNlbmRpZgotCi0jZGVmaW5lIEtFWF9DT09LSUVfTEVOCTE2Ci0KLSNkZWZpbmUJS0VYX0RIMQkJCSJkaWZmaWUtaGVsbG1hbi1ncm91cDEtc2hhMSIKLSNkZWZpbmUJS0VYX0RIMTQJCSJkaWZmaWUtaGVsbG1hbi1ncm91cDE0LXNoYTEiCi0jZGVmaW5lCUtFWF9ESEdFWF9TSEExCQkiZGlmZmllLWhlbGxtYW4tZ3JvdXAtZXhjaGFuZ2Utc2hhMSIKLSNkZWZpbmUJS0VYX0RIR0VYX1NIQTI1NgkiZGlmZmllLWhlbGxtYW4tZ3JvdXAtZXhjaGFuZ2Utc2hhMjU2IgotI2RlZmluZQlLRVhfUkVTVU1FCQkicmVzdW1lQGFwcGdhdGUuY29tIgotLyogVGhlIGZvbGxvd2luZyByZXByZXNlbnRzIHRoZSBmYW1pbHkgb2YgRUNESCBtZXRob2RzICovCi0jZGVmaW5lCUtFWF9FQ0RIX1NIQTJfU1RFTQkiZWNkaC1zaGEyLSIKLQotI2RlZmluZSBDT01QX05PTkUJMAotI2RlZmluZSBDT01QX1pMSUIJMQotI2RlZmluZSBDT01QX0RFTEFZRUQJMgotCi1lbnVtIGtleF9pbml0X3Byb3Bvc2FscyB7Ci0JUFJPUE9TQUxfS0VYX0FMR1MsCi0JUFJPUE9TQUxfU0VSVkVSX0hPU1RfS0VZX0FMR1MsCi0JUFJPUE9TQUxfRU5DX0FMR1NfQ1RPUywKLQlQUk9QT1NBTF9FTkNfQUxHU19TVE9DLAotCVBST1BPU0FMX01BQ19BTEdTX0NUT1MsCi0JUFJPUE9TQUxfTUFDX0FMR1NfU1RPQywKLQlQUk9QT1NBTF9DT01QX0FMR1NfQ1RPUywKLQlQUk9QT1NBTF9DT01QX0FMR1NfU1RPQywKLQlQUk9QT1NBTF9MQU5HX0NUT1MsCi0JUFJPUE9TQUxfTEFOR19TVE9DLAotCVBST1BPU0FMX01BWAotfTsKLQotZW51bSBrZXhfbW9kZXMgewotCU1PREVfSU4sCi0JTU9ERV9PVVQsCi0JTU9ERV9NQVgKLX07Ci0KLWVudW0ga2V4X2V4Y2hhbmdlIHsKLQlLRVhfREhfR1JQMV9TSEExLAotCUtFWF9ESF9HUlAxNF9TSEExLAotCUtFWF9ESF9HRVhfU0hBMSwKLQlLRVhfREhfR0VYX1NIQTI1NiwKLQlLRVhfRUNESF9TSEEyLAotCUtFWF9NQVgKLX07Ci0KLSNkZWZpbmUgS0VYX0lOSVRfU0VOVAkweDAwMDEKLQotdHlwZWRlZiBzdHJ1Y3QgS2V4IEtleDsKLXR5cGVkZWYgc3RydWN0IE1hYyBNYWM7Ci10eXBlZGVmIHN0cnVjdCBDb21wIENvbXA7Ci10eXBlZGVmIHN0cnVjdCBFbmMgRW5jOwotdHlwZWRlZiBzdHJ1Y3QgTmV3a2V5cyBOZXdrZXlzOwotCi1zdHJ1Y3QgRW5jIHsKLQljaGFyCSpuYW1lOwotCUNpcGhlcgkqY2lwaGVyOwotCWludAllbmFibGVkOwotCXVfaW50CWtleV9sZW47Ci0JdV9pbnQJYmxvY2tfc2l6ZTsKLQl1X2NoYXIJKmtleTsKLQl1X2NoYXIJKml2OwotfTsKLXN0cnVjdCBNYWMgewotCWNoYXIJKm5hbWU7Ci0JaW50CWVuYWJsZWQ7Ci0JdV9pbnQJbWFjX2xlbjsKLQl1X2NoYXIJKmtleTsKLQl1X2ludAlrZXlfbGVuOwotCWludAl0eXBlOwotCWNvbnN0IEVWUF9NRAkqZXZwX21kOwotCUhNQUNfQ1RYCWV2cF9jdHg7Ci0Jc3RydWN0IHVtYWNfY3R4ICp1bWFjX2N0eDsKLX07Ci1zdHJ1Y3QgQ29tcCB7Ci0JaW50CXR5cGU7Ci0JaW50CWVuYWJsZWQ7Ci0JY2hhcgkqbmFtZTsKLX07Ci1zdHJ1Y3QgTmV3a2V5cyB7Ci0JRW5jCWVuYzsKLQlNYWMJbWFjOwotCUNvbXAJY29tcDsKLX07Ci1zdHJ1Y3QgS2V4IHsKLQl1X2NoYXIJKnNlc3Npb25faWQ7Ci0JdV9pbnQJc2Vzc2lvbl9pZF9sZW47Ci0JTmV3a2V5cwkqbmV3a2V5c1tNT0RFX01BWF07Ci0JdV9pbnQJd2VfbmVlZDsKLQlpbnQJc2VydmVyOwotCWNoYXIJKm5hbWU7Ci0JaW50CWhvc3RrZXlfdHlwZTsKLQlpbnQJa2V4X3R5cGU7Ci0JaW50CXJvYW1pbmc7Ci0JQnVmZmVyCW15OwotCUJ1ZmZlcglwZWVyOwotCXNpZ19hdG9taWNfdCBkb25lOwotCWludAlmbGFnczsKLQljb25zdCBFVlBfTUQgKmV2cF9tZDsKLQljaGFyCSpjbGllbnRfdmVyc2lvbl9zdHJpbmc7Ci0JY2hhcgkqc2VydmVyX3ZlcnNpb25fc3RyaW5nOwotCWludAkoKnZlcmlmeV9ob3N0X2tleSkoS2V5ICopOwotCUtleQkqKCpsb2FkX2hvc3RfcHVibGljX2tleSkoaW50KTsKLQlLZXkJKigqbG9hZF9ob3N0X3ByaXZhdGVfa2V5KShpbnQpOwotCWludAkoKmhvc3Rfa2V5X2luZGV4KShLZXkgKik7Ci0Jdm9pZAkoKmtleFtLRVhfTUFYXSkoS2V4ICopOwotfTsKLQotaW50CSBrZXhfbmFtZXNfdmFsaWQoY29uc3QgY2hhciAqKTsKLQotS2V4CSprZXhfc2V0dXAoY2hhciAqW1BST1BPU0FMX01BWF0pOwotdm9pZAkga2V4X2ZpbmlzaChLZXggKik7Ci0KLXZvaWQJIGtleF9zZW5kX2tleGluaXQoS2V4ICopOwotdm9pZAkga2V4X2lucHV0X2tleGluaXQoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Ci12b2lkCSBrZXhfZGVyaXZlX2tleXMoS2V4ICosIHVfY2hhciAqLCB1X2ludCwgQklHTlVNICopOwotCi1OZXdrZXlzICprZXhfZ2V0X25ld2tleXMoaW50KTsKLQotdm9pZAkga2V4ZGhfY2xpZW50KEtleCAqKTsKLXZvaWQJIGtleGRoX3NlcnZlcihLZXggKik7Ci12b2lkCSBrZXhnZXhfY2xpZW50KEtleCAqKTsKLXZvaWQJIGtleGdleF9zZXJ2ZXIoS2V4ICopOwotdm9pZAkga2V4ZWNkaF9jbGllbnQoS2V4ICopOwotdm9pZAkga2V4ZWNkaF9zZXJ2ZXIoS2V4ICopOwotCi12b2lkCi1rZXhfZGhfaGFzaChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50LCB1X2NoYXIgKiwgaW50LAotICAgIEJJR05VTSAqLCBCSUdOVU0gKiwgQklHTlVNICosIHVfY2hhciAqKiwgdV9pbnQgKik7Ci12b2lkCi1rZXhnZXhfaGFzaChjb25zdCBFVlBfTUQgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50LCBjaGFyICosCi0gICAgaW50LCB1X2NoYXIgKiwgaW50LCBpbnQsIGludCwgaW50LCBCSUdOVU0gKiwgQklHTlVNICosIEJJR05VTSAqLAotICAgIEJJR05VTSAqLCBCSUdOVU0gKiwgdV9jaGFyICoqLCB1X2ludCAqKTsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLXZvaWQKLWtleF9lY2RoX2hhc2goY29uc3QgRVZQX01EICosIGNvbnN0IEVDX0dST1VQICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCwKLSAgICBjaGFyICosIGludCwgdV9jaGFyICosIGludCwgY29uc3QgRUNfUE9JTlQgKiwgY29uc3QgRUNfUE9JTlQgKiwKLSAgICBjb25zdCBCSUdOVU0gKiwgdV9jaGFyICoqLCB1X2ludCAqKTsKLWludAlrZXhfZWNkaF9uYW1lX3RvX25pZChjb25zdCBjaGFyICopOwotY29uc3QgRVZQX01EICprZXhfZWNkaF9uYW1lX3RvX2V2cG1kKGNvbnN0IGNoYXIgKik7Ci0jZWxzZQotIyBkZWZpbmUga2V4X2VjZGhfbmFtZV90b19uaWQoeCkgKC0xKQotIyBkZWZpbmUga2V4X2VjZGhfbmFtZV90b19ldnBtZCh4KSAoTlVMTCkKLSNlbmRpZgotCi12b2lkCi1kZXJpdmVfc3NoMV9zZXNzaW9uX2lkKEJJR05VTSAqLCBCSUdOVU0gKiwgdV9pbnQ4X3RbOF0sIHVfaW50OF90WzE2XSk7Ci0KLSNpZiBkZWZpbmVkKERFQlVHX0tFWCkgfHwgZGVmaW5lZChERUJVR19LRVhESCkgfHwgZGVmaW5lZChERUJVR19LRVhFQ0RIKQotdm9pZAlkdW1wX2RpZ2VzdChjaGFyICosIHVfY2hhciAqLCBpbnQpOwotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEva2V4ZGguYyBiL2tleGRoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZTIyZjUuLjAwMDAwMDAKLS0tIGEva2V4ZGguYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qICRPcGVuQlNEOiBrZXhkaC5jLHYgMS4yMyAyMDA2LzA4LzAzIDAzOjM0OjQyIGRlcmFhZHQgRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0KLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiY2lwaGVyLmgiCi0jaW5jbHVkZSAia2V4LmgiCi0KLXZvaWQKLWtleF9kaF9oYXNoKAotICAgIGNoYXIgKmNsaWVudF92ZXJzaW9uX3N0cmluZywKLSAgICBjaGFyICpzZXJ2ZXJfdmVyc2lvbl9zdHJpbmcsCi0gICAgY2hhciAqY2tleGluaXQsIGludCBja2V4aW5pdGxlbiwKLSAgICBjaGFyICpza2V4aW5pdCwgaW50IHNrZXhpbml0bGVuLAotICAgIHVfY2hhciAqc2VydmVyaG9zdGtleWJsb2IsIGludCBzYmxvYmxlbiwKLSAgICBCSUdOVU0gKmNsaWVudF9kaF9wdWIsCi0gICAgQklHTlVNICpzZXJ2ZXJfZGhfcHViLAotICAgIEJJR05VTSAqc2hhcmVkX3NlY3JldCwKLSAgICB1X2NoYXIgKipoYXNoLCB1X2ludCAqaGFzaGxlbikKLXsKLQlCdWZmZXIgYjsKLQlzdGF0aWMgdV9jaGFyIGRpZ2VzdFtFVlBfTUFYX01EX1NJWkVdOwotCWNvbnN0IEVWUF9NRCAqZXZwX21kID0gRVZQX3NoYTEoKTsKLQlFVlBfTURfQ1RYIG1kOwotCi0JYnVmZmVyX2luaXQoJmIpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgY2xpZW50X3ZlcnNpb25fc3RyaW5nKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIHNlcnZlcl92ZXJzaW9uX3N0cmluZyk7Ci0KLQkvKiBrZXhpbml0IG1lc3NhZ2VzOiBmYWtlIGhlYWRlcjogbGVuK1NTSDJfTVNHX0tFWElOSVQgKi8KLQlidWZmZXJfcHV0X2ludCgmYiwgY2tleGluaXRsZW4rMSk7Ci0JYnVmZmVyX3B1dF9jaGFyKCZiLCBTU0gyX01TR19LRVhJTklUKTsKLQlidWZmZXJfYXBwZW5kKCZiLCBja2V4aW5pdCwgY2tleGluaXRsZW4pOwotCWJ1ZmZlcl9wdXRfaW50KCZiLCBza2V4aW5pdGxlbisxKTsKLQlidWZmZXJfcHV0X2NoYXIoJmIsIFNTSDJfTVNHX0tFWElOSVQpOwotCWJ1ZmZlcl9hcHBlbmQoJmIsIHNrZXhpbml0LCBza2V4aW5pdGxlbik7Ci0KLQlidWZmZXJfcHV0X3N0cmluZygmYiwgc2VydmVyaG9zdGtleWJsb2IsIHNibG9ibGVuKTsKLQlidWZmZXJfcHV0X2JpZ251bTIoJmIsIGNsaWVudF9kaF9wdWIpOwotCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgc2VydmVyX2RoX3B1Yik7Ci0JYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBzaGFyZWRfc2VjcmV0KTsKLQotI2lmZGVmIERFQlVHX0tFWAotCWJ1ZmZlcl9kdW1wKCZiKTsKLSNlbmRpZgotCUVWUF9EaWdlc3RJbml0KCZtZCwgZXZwX21kKTsKLQlFVlBfRGlnZXN0VXBkYXRlKCZtZCwgYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpKTsKLQlFVlBfRGlnZXN0RmluYWwoJm1kLCBkaWdlc3QsIE5VTEwpOwotCi0JYnVmZmVyX2ZyZWUoJmIpOwotCi0jaWZkZWYgREVCVUdfS0VYCi0JZHVtcF9kaWdlc3QoImhhc2giLCBkaWdlc3QsIEVWUF9NRF9zaXplKGV2cF9tZCkpOwotI2VuZGlmCi0JKmhhc2ggPSBkaWdlc3Q7Ci0JKmhhc2hsZW4gPSBFVlBfTURfc2l6ZShldnBfbWQpOwotfQpkaWZmIC0tZ2l0IGEva2V4ZGhjLmMgYi9rZXhkaGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjZWI1ZC4uMDAwMDAwMAotLS0gYS9rZXhkaGMuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKiAkT3BlbkJTRDoga2V4ZGhjLmMsdiAxLjEyIDIwMTAvMTEvMTAgMDE6MzM6MDcgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJjaXBoZXIuaCIKLSNpbmNsdWRlICJrZXguaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJkaC5oIgotI2luY2x1ZGUgInNzaDIuaCIKLQotdm9pZAota2V4ZGhfY2xpZW50KEtleCAqa2V4KQotewotCUJJR05VTSAqZGhfc2VydmVyX3B1YiA9IE5VTEwsICpzaGFyZWRfc2VjcmV0ID0gTlVMTDsKLQlESCAqZGg7Ci0JS2V5ICpzZXJ2ZXJfaG9zdF9rZXk7Ci0JdV9jaGFyICpzZXJ2ZXJfaG9zdF9rZXlfYmxvYiA9IE5VTEwsICpzaWduYXR1cmUgPSBOVUxMOwotCXVfY2hhciAqa2J1ZiwgKmhhc2g7Ci0JdV9pbnQga2xlbiwgc2xlbiwgc2Jsb2JsZW4sIGhhc2hsZW47Ci0JaW50IGtvdXQ7Ci0KLQkvKiBnZW5lcmF0ZSBhbmQgc2VuZCAnZScsIGNsaWVudCBESCBwdWJsaWMga2V5ICovCi0Jc3dpdGNoIChrZXgtPmtleF90eXBlKSB7Ci0JY2FzZSBLRVhfREhfR1JQMV9TSEExOgotCQlkaCA9IGRoX25ld19ncm91cDEoKTsKLQkJYnJlYWs7Ci0JY2FzZSBLRVhfREhfR1JQMTRfU0hBMToKLQkJZGggPSBkaF9uZXdfZ3JvdXAxNCgpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlmYXRhbCgiJXM6IFVuZXhwZWN0ZWQgS0VYIHR5cGUgJWQiLCBfX2Z1bmNfXywga2V4LT5rZXhfdHlwZSk7Ci0JfQotCWRoX2dlbl9rZXkoZGgsIGtleC0+d2VfbmVlZCAqIDgpOwotCXBhY2tldF9zdGFydChTU0gyX01TR19LRVhESF9JTklUKTsKLQlwYWNrZXRfcHV0X2JpZ251bTIoZGgtPnB1Yl9rZXkpOwotCXBhY2tldF9zZW5kKCk7Ci0KLQlkZWJ1Zygic2VuZGluZyBTU0gyX01TR19LRVhESF9JTklUIik7Ci0jaWZkZWYgREVCVUdfS0VYREgKLQlESHBhcmFtc19wcmludF9mcChzdGRlcnIsIGRoKTsKLQlmcHJpbnRmKHN0ZGVyciwgInB1Yj0gIik7Ci0JQk5fcHJpbnRfZnAoc3RkZXJyLCBkaC0+cHViX2tleSk7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotI2VuZGlmCi0KLQlkZWJ1ZygiZXhwZWN0aW5nIFNTSDJfTVNHX0tFWERIX1JFUExZIik7Ci0JcGFja2V0X3JlYWRfZXhwZWN0KFNTSDJfTVNHX0tFWERIX1JFUExZKTsKLQotCS8qIGtleSwgY2VydCAqLwotCXNlcnZlcl9ob3N0X2tleV9ibG9iID0gcGFja2V0X2dldF9zdHJpbmcoJnNibG9ibGVuKTsKLQlzZXJ2ZXJfaG9zdF9rZXkgPSBrZXlfZnJvbV9ibG9iKHNlcnZlcl9ob3N0X2tleV9ibG9iLCBzYmxvYmxlbik7Ci0JaWYgKHNlcnZlcl9ob3N0X2tleSA9PSBOVUxMKQotCQlmYXRhbCgiY2Fubm90IGRlY29kZSBzZXJ2ZXJfaG9zdF9rZXlfYmxvYiIpOwotCWlmIChzZXJ2ZXJfaG9zdF9rZXktPnR5cGUgIT0ga2V4LT5ob3N0a2V5X3R5cGUpCi0JCWZhdGFsKCJ0eXBlIG1pc21hdGNoIGZvciBkZWNvZGVkIHNlcnZlcl9ob3N0X2tleV9ibG9iIik7Ci0JaWYgKGtleC0+dmVyaWZ5X2hvc3Rfa2V5ID09IE5VTEwpCi0JCWZhdGFsKCJjYW5ub3QgdmVyaWZ5IHNlcnZlcl9ob3N0X2tleSIpOwotCWlmIChrZXgtPnZlcmlmeV9ob3N0X2tleShzZXJ2ZXJfaG9zdF9rZXkpID09IC0xKQotCQlmYXRhbCgic2VydmVyX2hvc3Rfa2V5IHZlcmlmaWNhdGlvbiBmYWlsZWQiKTsKLQotCS8qIERIIHBhcmFtZXRlciBmLCBzZXJ2ZXIgcHVibGljIERIIGtleSAqLwotCWlmICgoZGhfc2VydmVyX3B1YiA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiZGhfc2VydmVyX3B1YiA9PSBOVUxMIik7Ci0JcGFja2V0X2dldF9iaWdudW0yKGRoX3NlcnZlcl9wdWIpOwotCi0jaWZkZWYgREVCVUdfS0VYREgKLQlmcHJpbnRmKHN0ZGVyciwgImRoX3NlcnZlcl9wdWI9ICIpOwotCUJOX3ByaW50X2ZwKHN0ZGVyciwgZGhfc2VydmVyX3B1Yik7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCWRlYnVnKCJiaXRzICVkIiwgQk5fbnVtX2JpdHMoZGhfc2VydmVyX3B1YikpOwotI2VuZGlmCi0KLQkvKiBzaWduZWQgSCAqLwotCXNpZ25hdHVyZSA9IHBhY2tldF9nZXRfc3RyaW5nKCZzbGVuKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlpZiAoIWRoX3B1Yl9pc192YWxpZChkaCwgZGhfc2VydmVyX3B1YikpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJiYWQgc2VydmVyIHB1YmxpYyBESCB2YWx1ZSIpOwotCi0Ja2xlbiA9IERIX3NpemUoZGgpOwotCWtidWYgPSB4bWFsbG9jKGtsZW4pOwotCWlmICgoa291dCA9IERIX2NvbXB1dGVfa2V5KGtidWYsIGRoX3NlcnZlcl9wdWIsIGRoKSkgPCAwKQotCQlmYXRhbCgiREhfY29tcHV0ZV9rZXk6IGZhaWxlZCIpOwotI2lmZGVmIERFQlVHX0tFWERICi0JZHVtcF9kaWdlc3QoInNoYXJlZCBzZWNyZXQiLCBrYnVmLCBrb3V0KTsKLSNlbmRpZgotCWlmICgoc2hhcmVkX3NlY3JldCA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgia2V4ZGhfY2xpZW50OiBCTl9uZXcgZmFpbGVkIik7Ci0JaWYgKEJOX2JpbjJibihrYnVmLCBrb3V0LCBzaGFyZWRfc2VjcmV0KSA9PSBOVUxMKQotCQlmYXRhbCgia2V4ZGhfY2xpZW50OiBCTl9iaW4yYm4gZmFpbGVkIik7Ci0JbWVtc2V0KGtidWYsIDAsIGtsZW4pOwotCXhmcmVlKGtidWYpOwotCi0JLyogY2FsYyBhbmQgdmVyaWZ5IEggKi8KLQlrZXhfZGhfaGFzaCgKLQkgICAga2V4LT5jbGllbnRfdmVyc2lvbl9zdHJpbmcsCi0JICAgIGtleC0+c2VydmVyX3ZlcnNpb25fc3RyaW5nLAotCSAgICBidWZmZXJfcHRyKCZrZXgtPm15KSwgYnVmZmVyX2xlbigma2V4LT5teSksCi0JICAgIGJ1ZmZlcl9wdHIoJmtleC0+cGVlciksIGJ1ZmZlcl9sZW4oJmtleC0+cGVlciksCi0JICAgIHNlcnZlcl9ob3N0X2tleV9ibG9iLCBzYmxvYmxlbiwKLQkgICAgZGgtPnB1Yl9rZXksCi0JICAgIGRoX3NlcnZlcl9wdWIsCi0JICAgIHNoYXJlZF9zZWNyZXQsCi0JICAgICZoYXNoLCAmaGFzaGxlbgotCSk7Ci0JeGZyZWUoc2VydmVyX2hvc3Rfa2V5X2Jsb2IpOwotCUJOX2NsZWFyX2ZyZWUoZGhfc2VydmVyX3B1Yik7Ci0JREhfZnJlZShkaCk7Ci0KLQlpZiAoa2V5X3ZlcmlmeShzZXJ2ZXJfaG9zdF9rZXksIHNpZ25hdHVyZSwgc2xlbiwgaGFzaCwgaGFzaGxlbikgIT0gMSkKLQkJZmF0YWwoImtleV92ZXJpZnkgZmFpbGVkIGZvciBzZXJ2ZXJfaG9zdF9rZXkiKTsKLQlrZXlfZnJlZShzZXJ2ZXJfaG9zdF9rZXkpOwotCXhmcmVlKHNpZ25hdHVyZSk7Ci0KLQkvKiBzYXZlIHNlc3Npb24gaWQgKi8KLQlpZiAoa2V4LT5zZXNzaW9uX2lkID09IE5VTEwpIHsKLQkJa2V4LT5zZXNzaW9uX2lkX2xlbiA9IGhhc2hsZW47Ci0JCWtleC0+c2Vzc2lvbl9pZCA9IHhtYWxsb2Moa2V4LT5zZXNzaW9uX2lkX2xlbik7Ci0JCW1lbWNweShrZXgtPnNlc3Npb25faWQsIGhhc2gsIGtleC0+c2Vzc2lvbl9pZF9sZW4pOwotCX0KLQotCWtleF9kZXJpdmVfa2V5cyhrZXgsIGhhc2gsIGhhc2hsZW4sIHNoYXJlZF9zZWNyZXQpOwotCUJOX2NsZWFyX2ZyZWUoc2hhcmVkX3NlY3JldCk7Ci0Ja2V4X2ZpbmlzaChrZXgpOwotfQpkaWZmIC0tZ2l0IGEva2V4ZGhzLmMgYi9rZXhkaHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2ZTg4Ny4uMDAwMDAwMAotLS0gYS9rZXhkaHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKiAkT3BlbkJTRDoga2V4ZGhzLmMsdiAxLjEyIDIwMTAvMTEvMTAgMDE6MzM6MDcgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiY2lwaGVyLmgiCi0jaW5jbHVkZSAia2V4LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAiZGguaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0jaWZkZWYgR1NTQVBJCi0jaW5jbHVkZSAic3NoLWdzcy5oIgotI2VuZGlmCi0jaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCi0KLXZvaWQKLWtleGRoX3NlcnZlcihLZXggKmtleCkKLXsKLQlCSUdOVU0gKnNoYXJlZF9zZWNyZXQgPSBOVUxMLCAqZGhfY2xpZW50X3B1YiA9IE5VTEw7Ci0JREggKmRoOwotCUtleSAqc2VydmVyX2hvc3RfcHVibGljLCAqc2VydmVyX2hvc3RfcHJpdmF0ZTsKLQl1X2NoYXIgKmtidWYsICpoYXNoLCAqc2lnbmF0dXJlID0gTlVMTCwgKnNlcnZlcl9ob3N0X2tleV9ibG9iID0gTlVMTDsKLQl1X2ludCBzYmxvYmxlbiwga2xlbiwgaGFzaGxlbiwgc2xlbjsKLQlpbnQga291dDsKLQotCS8qIGdlbmVyYXRlIHNlcnZlciBESCBwdWJsaWMga2V5ICovCi0Jc3dpdGNoIChrZXgtPmtleF90eXBlKSB7Ci0JY2FzZSBLRVhfREhfR1JQMV9TSEExOgotCQlkaCA9IGRoX25ld19ncm91cDEoKTsKLQkJYnJlYWs7Ci0JY2FzZSBLRVhfREhfR1JQMTRfU0hBMToKLQkJZGggPSBkaF9uZXdfZ3JvdXAxNCgpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlmYXRhbCgiJXM6IFVuZXhwZWN0ZWQgS0VYIHR5cGUgJWQiLCBfX2Z1bmNfXywga2V4LT5rZXhfdHlwZSk7Ci0JfQotCWRoX2dlbl9rZXkoZGgsIGtleC0+d2VfbmVlZCAqIDgpOwotCi0JZGVidWcoImV4cGVjdGluZyBTU0gyX01TR19LRVhESF9JTklUIik7Ci0JcGFja2V0X3JlYWRfZXhwZWN0KFNTSDJfTVNHX0tFWERIX0lOSVQpOwotCi0JaWYgKGtleC0+bG9hZF9ob3N0X3B1YmxpY19rZXkgPT0gTlVMTCB8fAotCSAgICBrZXgtPmxvYWRfaG9zdF9wcml2YXRlX2tleSA9PSBOVUxMKQotCQlmYXRhbCgiQ2Fubm90IGxvYWQgaG9zdGtleSIpOwotCXNlcnZlcl9ob3N0X3B1YmxpYyA9IGtleC0+bG9hZF9ob3N0X3B1YmxpY19rZXkoa2V4LT5ob3N0a2V5X3R5cGUpOwotCWlmIChzZXJ2ZXJfaG9zdF9wdWJsaWMgPT0gTlVMTCkKLQkJZmF0YWwoIlVuc3VwcG9ydGVkIGhvc3RrZXkgdHlwZSAlZCIsIGtleC0+aG9zdGtleV90eXBlKTsKLQlzZXJ2ZXJfaG9zdF9wcml2YXRlID0ga2V4LT5sb2FkX2hvc3RfcHJpdmF0ZV9rZXkoa2V4LT5ob3N0a2V5X3R5cGUpOwotCWlmIChzZXJ2ZXJfaG9zdF9wcml2YXRlID09IE5VTEwpCi0JCWZhdGFsKCJNaXNzaW5nIHByaXZhdGUga2V5IGZvciBob3N0a2V5IHR5cGUgJWQiLAotCQkgICAga2V4LT5ob3N0a2V5X3R5cGUpOwotCi0JLyoga2V5LCBjZXJ0ICovCi0JaWYgKChkaF9jbGllbnRfcHViID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJkaF9jbGllbnRfcHViID09IE5VTEwiKTsKLQlwYWNrZXRfZ2V0X2JpZ251bTIoZGhfY2xpZW50X3B1Yik7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0jaWZkZWYgREVCVUdfS0VYREgKLQlmcHJpbnRmKHN0ZGVyciwgImRoX2NsaWVudF9wdWI9ICIpOwotCUJOX3ByaW50X2ZwKHN0ZGVyciwgZGhfY2xpZW50X3B1Yik7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCWRlYnVnKCJiaXRzICVkIiwgQk5fbnVtX2JpdHMoZGhfY2xpZW50X3B1YikpOwotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19LRVhESAotCURIcGFyYW1zX3ByaW50X2ZwKHN0ZGVyciwgZGgpOwotCWZwcmludGYoc3RkZXJyLCAicHViPSAiKTsKLQlCTl9wcmludF9mcChzdGRlcnIsIGRoLT5wdWJfa2V5KTsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQlpZiAoIWRoX3B1Yl9pc192YWxpZChkaCwgZGhfY2xpZW50X3B1YikpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJiYWQgY2xpZW50IHB1YmxpYyBESCB2YWx1ZSIpOwotCi0Ja2xlbiA9IERIX3NpemUoZGgpOwotCWtidWYgPSB4bWFsbG9jKGtsZW4pOwotCWlmICgoa291dCA9IERIX2NvbXB1dGVfa2V5KGtidWYsIGRoX2NsaWVudF9wdWIsIGRoKSkgPCAwKQotCQlmYXRhbCgiREhfY29tcHV0ZV9rZXk6IGZhaWxlZCIpOwotI2lmZGVmIERFQlVHX0tFWERICi0JZHVtcF9kaWdlc3QoInNoYXJlZCBzZWNyZXQiLCBrYnVmLCBrb3V0KTsKLSNlbmRpZgotCWlmICgoc2hhcmVkX3NlY3JldCA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgia2V4ZGhfc2VydmVyOiBCTl9uZXcgZmFpbGVkIik7Ci0JaWYgKEJOX2JpbjJibihrYnVmLCBrb3V0LCBzaGFyZWRfc2VjcmV0KSA9PSBOVUxMKQotCQlmYXRhbCgia2V4ZGhfc2VydmVyOiBCTl9iaW4yYm4gZmFpbGVkIik7Ci0JbWVtc2V0KGtidWYsIDAsIGtsZW4pOwotCXhmcmVlKGtidWYpOwotCi0Ja2V5X3RvX2Jsb2Ioc2VydmVyX2hvc3RfcHVibGljLCAmc2VydmVyX2hvc3Rfa2V5X2Jsb2IsICZzYmxvYmxlbik7Ci0KLQkvKiBjYWxjIEggKi8KLQlrZXhfZGhfaGFzaCgKLQkgICAga2V4LT5jbGllbnRfdmVyc2lvbl9zdHJpbmcsCi0JICAgIGtleC0+c2VydmVyX3ZlcnNpb25fc3RyaW5nLAotCSAgICBidWZmZXJfcHRyKCZrZXgtPnBlZXIpLCBidWZmZXJfbGVuKCZrZXgtPnBlZXIpLAotCSAgICBidWZmZXJfcHRyKCZrZXgtPm15KSwgYnVmZmVyX2xlbigma2V4LT5teSksCi0JICAgIHNlcnZlcl9ob3N0X2tleV9ibG9iLCBzYmxvYmxlbiwKLQkgICAgZGhfY2xpZW50X3B1YiwKLQkgICAgZGgtPnB1Yl9rZXksCi0JICAgIHNoYXJlZF9zZWNyZXQsCi0JICAgICZoYXNoLCAmaGFzaGxlbgotCSk7Ci0JQk5fY2xlYXJfZnJlZShkaF9jbGllbnRfcHViKTsKLQotCS8qIHNhdmUgc2Vzc2lvbiBpZCA6PSBIICovCi0JaWYgKGtleC0+c2Vzc2lvbl9pZCA9PSBOVUxMKSB7Ci0JCWtleC0+c2Vzc2lvbl9pZF9sZW4gPSBoYXNobGVuOwotCQlrZXgtPnNlc3Npb25faWQgPSB4bWFsbG9jKGtleC0+c2Vzc2lvbl9pZF9sZW4pOwotCQltZW1jcHkoa2V4LT5zZXNzaW9uX2lkLCBoYXNoLCBrZXgtPnNlc3Npb25faWRfbGVuKTsKLQl9Ci0KLQkvKiBzaWduIEggKi8KLQlpZiAoUFJJVlNFUChrZXlfc2lnbihzZXJ2ZXJfaG9zdF9wcml2YXRlLCAmc2lnbmF0dXJlLCAmc2xlbiwgaGFzaCwKLQkgICAgaGFzaGxlbikpIDwgMCkKLQkJZmF0YWwoImtleGRoX3NlcnZlcjoga2V5X3NpZ24gZmFpbGVkIik7Ci0KLQkvKiBkZXN0cm95X3NlbnNpdGl2ZV9kYXRhKCk7ICovCi0KLQkvKiBzZW5kIHNlcnZlciBob3N0a2V5LCBESCBwdWJrZXkgJ2YnIGFuZCBzaW5nZWQgSCAqLwotCXBhY2tldF9zdGFydChTU0gyX01TR19LRVhESF9SRVBMWSk7Ci0JcGFja2V0X3B1dF9zdHJpbmcoc2VydmVyX2hvc3Rfa2V5X2Jsb2IsIHNibG9ibGVuKTsKLQlwYWNrZXRfcHV0X2JpZ251bTIoZGgtPnB1Yl9rZXkpOwkvKiBmICovCi0JcGFja2V0X3B1dF9zdHJpbmcoc2lnbmF0dXJlLCBzbGVuKTsKLQlwYWNrZXRfc2VuZCgpOwotCi0JeGZyZWUoc2lnbmF0dXJlKTsKLQl4ZnJlZShzZXJ2ZXJfaG9zdF9rZXlfYmxvYik7Ci0JLyogaGF2ZSBrZXlzLCBmcmVlIERIICovCi0JREhfZnJlZShkaCk7Ci0KLQlrZXhfZGVyaXZlX2tleXMoa2V4LCBoYXNoLCBoYXNobGVuLCBzaGFyZWRfc2VjcmV0KTsKLQlCTl9jbGVhcl9mcmVlKHNoYXJlZF9zZWNyZXQpOwotCWtleF9maW5pc2goa2V4KTsKLX0KZGlmZiAtLWdpdCBhL2tleGVjZGguYyBiL2tleGVjZGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzZjY5ZC4uMDAwMDAwMAotLS0gYS9rZXhlY2RoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGtleGVjZGguYyx2IDEuMyAyMDEwLzA5LzIyIDA1OjAxOjI5IGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAxMCBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9lY2RoLmg+Ci0KLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiY2lwaGVyLmgiCi0jaW5jbHVkZSAia2V4LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0KLWludAota2V4X2VjZGhfbmFtZV90b19uaWQoY29uc3QgY2hhciAqa2V4bmFtZSkKLXsKLQlpZiAoc3RybGVuKGtleG5hbWUpIDwgc2l6ZW9mKEtFWF9FQ0RIX1NIQTJfU1RFTSkgLSAxKQotCQlmYXRhbCgiJXM6IGtleG5hbWUgdG9vIHNob3J0IFwiJXNcIiIsIF9fZnVuY19fLCBrZXhuYW1lKTsKLQlyZXR1cm4ga2V5X2N1cnZlX25hbWVfdG9fbmlkKGtleG5hbWUgKyBzaXplb2YoS0VYX0VDREhfU0hBMl9TVEVNKSAtIDEpOwotfQotCi1jb25zdCBFVlBfTUQgKgota2V4X2VjZGhfbmFtZV90b19ldnBtZChjb25zdCBjaGFyICprZXhuYW1lKQotewotCWludCBuaWQgPSBrZXhfZWNkaF9uYW1lX3RvX25pZChrZXhuYW1lKTsKLQotCWlmIChuaWQgPT0gLTEpCi0JCWZhdGFsKCIlczogdW5zdXBwb3J0ZWQgRUNESCBjdXJ2ZSBcIiVzXCIiLCBfX2Z1bmNfXywga2V4bmFtZSk7Ci0JcmV0dXJuIGtleV9lY19uaWRfdG9fZXZwbWQobmlkKTsKLX0KLQotdm9pZAota2V4X2VjZGhfaGFzaCgKLSAgICBjb25zdCBFVlBfTUQgKmV2cF9tZCwKLSAgICBjb25zdCBFQ19HUk9VUCAqZWNfZ3JvdXAsCi0gICAgY2hhciAqY2xpZW50X3ZlcnNpb25fc3RyaW5nLAotICAgIGNoYXIgKnNlcnZlcl92ZXJzaW9uX3N0cmluZywKLSAgICBjaGFyICpja2V4aW5pdCwgaW50IGNrZXhpbml0bGVuLAotICAgIGNoYXIgKnNrZXhpbml0LCBpbnQgc2tleGluaXRsZW4sCi0gICAgdV9jaGFyICpzZXJ2ZXJob3N0a2V5YmxvYiwgaW50IHNibG9ibGVuLAotICAgIGNvbnN0IEVDX1BPSU5UICpjbGllbnRfZGhfcHViLAotICAgIGNvbnN0IEVDX1BPSU5UICpzZXJ2ZXJfZGhfcHViLAotICAgIGNvbnN0IEJJR05VTSAqc2hhcmVkX3NlY3JldCwKLSAgICB1X2NoYXIgKipoYXNoLCB1X2ludCAqaGFzaGxlbikKLXsKLQlCdWZmZXIgYjsKLQlFVlBfTURfQ1RYIG1kOwotCXN0YXRpYyB1X2NoYXIgZGlnZXN0W0VWUF9NQVhfTURfU0laRV07Ci0KLQlidWZmZXJfaW5pdCgmYik7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBjbGllbnRfdmVyc2lvbl9zdHJpbmcpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgc2VydmVyX3ZlcnNpb25fc3RyaW5nKTsKLQotCS8qIGtleGluaXQgbWVzc2FnZXM6IGZha2UgaGVhZGVyOiBsZW4rU1NIMl9NU0dfS0VYSU5JVCAqLwotCWJ1ZmZlcl9wdXRfaW50KCZiLCBja2V4aW5pdGxlbisxKTsKLQlidWZmZXJfcHV0X2NoYXIoJmIsIFNTSDJfTVNHX0tFWElOSVQpOwotCWJ1ZmZlcl9hcHBlbmQoJmIsIGNrZXhpbml0LCBja2V4aW5pdGxlbik7Ci0JYnVmZmVyX3B1dF9pbnQoJmIsIHNrZXhpbml0bGVuKzEpOwotCWJ1ZmZlcl9wdXRfY2hhcigmYiwgU1NIMl9NU0dfS0VYSU5JVCk7Ci0JYnVmZmVyX2FwcGVuZCgmYiwgc2tleGluaXQsIHNrZXhpbml0bGVuKTsKLQotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBzZXJ2ZXJob3N0a2V5YmxvYiwgc2Jsb2JsZW4pOwotCWJ1ZmZlcl9wdXRfZWNwb2ludCgmYiwgZWNfZ3JvdXAsIGNsaWVudF9kaF9wdWIpOwotCWJ1ZmZlcl9wdXRfZWNwb2ludCgmYiwgZWNfZ3JvdXAsIHNlcnZlcl9kaF9wdWIpOwotCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgc2hhcmVkX3NlY3JldCk7Ci0KLSNpZmRlZiBERUJVR19LRVgKLQlidWZmZXJfZHVtcCgmYik7Ci0jZW5kaWYKLQlFVlBfRGlnZXN0SW5pdCgmbWQsIGV2cF9tZCk7Ci0JRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7Ci0JRVZQX0RpZ2VzdEZpbmFsKCZtZCwgZGlnZXN0LCBOVUxMKTsKLQotCWJ1ZmZlcl9mcmVlKCZiKTsKLQotI2lmZGVmIERFQlVHX0tFWAotCWR1bXBfZGlnZXN0KCJoYXNoIiwgZGlnZXN0LCBFVlBfTURfc2l6ZShldnBfbWQpKTsKLSNlbmRpZgotCSpoYXNoID0gZGlnZXN0OwotCSpoYXNobGVuID0gRVZQX01EX3NpemUoZXZwX21kKTsKLX0KLQotI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLwpkaWZmIC0tZ2l0IGEva2V4ZWNkaGMuYyBiL2tleGVjZGhjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWQ0YmYuLjAwMDAwMDAKLS0tIGEva2V4ZWNkaGMuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKiAkT3BlbkJTRDoga2V4ZWNkaGMuYyx2IDEuMiAyMDEwLzA5LzIyIDA1OjAxOjI5IGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAxMCBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiY2lwaGVyLmgiCi0jaW5jbHVkZSAia2V4LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAiZGguaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0KLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQotI2luY2x1ZGUgPG9wZW5zc2wvZWNkaC5oPgotCi12b2lkCi1rZXhlY2RoX2NsaWVudChLZXggKmtleCkKLXsKLQlFQ19LRVkgKmNsaWVudF9rZXk7Ci0JRUNfUE9JTlQgKnNlcnZlcl9wdWJsaWM7Ci0JY29uc3QgRUNfR1JPVVAgKmdyb3VwOwotCUJJR05VTSAqc2hhcmVkX3NlY3JldDsKLQlLZXkgKnNlcnZlcl9ob3N0X2tleTsKLQl1X2NoYXIgKnNlcnZlcl9ob3N0X2tleV9ibG9iID0gTlVMTCwgKnNpZ25hdHVyZSA9IE5VTEw7Ci0JdV9jaGFyICprYnVmLCAqaGFzaDsKLQl1X2ludCBrbGVuLCBzbGVuLCBzYmxvYmxlbiwgaGFzaGxlbjsKLQlpbnQgY3VydmVfbmlkOwotCi0JaWYgKChjdXJ2ZV9uaWQgPSBrZXhfZWNkaF9uYW1lX3RvX25pZChrZXgtPm5hbWUpKSA9PSAtMSkKLQkJZmF0YWwoIiVzOiB1bnN1cHBvcnRlZCBFQ0RIIGN1cnZlIFwiJXNcIiIsIF9fZnVuY19fLCBrZXgtPm5hbWUpOwotCWlmICgoY2xpZW50X2tleSA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZShjdXJ2ZV9uaWQpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZSBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JaWYgKEVDX0tFWV9nZW5lcmF0ZV9rZXkoY2xpZW50X2tleSkgIT0gMSkKLQkJZmF0YWwoIiVzOiBFQ19LRVlfZ2VuZXJhdGVfa2V5IGZhaWxlZCIsIF9fZnVuY19fKTsKLQlncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGNsaWVudF9rZXkpOwotCi0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0tFWF9FQ0RIX0lOSVQpOwotCXBhY2tldF9wdXRfZWNwb2ludChncm91cCwgRUNfS0VZX2dldDBfcHVibGljX2tleShjbGllbnRfa2V5KSk7Ci0JcGFja2V0X3NlbmQoKTsKLQlkZWJ1Zygic2VuZGluZyBTU0gyX01TR19LRVhfRUNESF9JTklUIik7Ci0KLSNpZmRlZiBERUJVR19LRVhFQ0RICi0JZnB1dHMoImNsaWVudCBwcml2YXRlIGtleTpcbiIsIHN0ZGVycik7Ci0Ja2V5X2R1bXBfZWNfa2V5KGNsaWVudF9rZXkpOwotI2VuZGlmCi0KLQlkZWJ1ZygiZXhwZWN0aW5nIFNTSDJfTVNHX0tFWF9FQ0RIX1JFUExZIik7Ci0JcGFja2V0X3JlYWRfZXhwZWN0KFNTSDJfTVNHX0tFWF9FQ0RIX1JFUExZKTsKLQotCS8qIGhvc3RrZXkgKi8KLQlzZXJ2ZXJfaG9zdF9rZXlfYmxvYiA9IHBhY2tldF9nZXRfc3RyaW5nKCZzYmxvYmxlbik7Ci0Jc2VydmVyX2hvc3Rfa2V5ID0ga2V5X2Zyb21fYmxvYihzZXJ2ZXJfaG9zdF9rZXlfYmxvYiwgc2Jsb2JsZW4pOwotCWlmIChzZXJ2ZXJfaG9zdF9rZXkgPT0gTlVMTCkKLQkJZmF0YWwoImNhbm5vdCBkZWNvZGUgc2VydmVyX2hvc3Rfa2V5X2Jsb2IiKTsKLQlpZiAoc2VydmVyX2hvc3Rfa2V5LT50eXBlICE9IGtleC0+aG9zdGtleV90eXBlKQotCQlmYXRhbCgidHlwZSBtaXNtYXRjaCBmb3IgZGVjb2RlZCBzZXJ2ZXJfaG9zdF9rZXlfYmxvYiIpOwotCWlmIChrZXgtPnZlcmlmeV9ob3N0X2tleSA9PSBOVUxMKQotCQlmYXRhbCgiY2Fubm90IHZlcmlmeSBzZXJ2ZXJfaG9zdF9rZXkiKTsKLQlpZiAoa2V4LT52ZXJpZnlfaG9zdF9rZXkoc2VydmVyX2hvc3Rfa2V5KSA9PSAtMSkKLQkJZmF0YWwoInNlcnZlcl9ob3N0X2tleSB2ZXJpZmljYXRpb24gZmFpbGVkIik7Ci0KLQkvKiBRX1MsIHNlcnZlciBwdWJsaWMga2V5ICovCi0JaWYgKChzZXJ2ZXJfcHVibGljID0gRUNfUE9JTlRfbmV3KGdyb3VwKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBFQ19QT0lOVF9uZXcgZmFpbGVkIiwgX19mdW5jX18pOwotCXBhY2tldF9nZXRfZWNwb2ludChncm91cCwgc2VydmVyX3B1YmxpYyk7Ci0KLQlpZiAoa2V5X2VjX3ZhbGlkYXRlX3B1YmxpYyhncm91cCwgc2VydmVyX3B1YmxpYykgIT0gMCkKLQkJZmF0YWwoIiVzOiBpbnZhbGlkIHNlcnZlciBwdWJsaWMga2V5IiwgX19mdW5jX18pOwotCi0jaWZkZWYgREVCVUdfS0VYRUNESAotCWZwdXRzKCJzZXJ2ZXIgcHVibGljIGtleTpcbiIsIHN0ZGVycik7Ci0Ja2V5X2R1bXBfZWNfcG9pbnQoZ3JvdXAsIHNlcnZlcl9wdWJsaWMpOwotI2VuZGlmCi0KLQkvKiBzaWduZWQgSCAqLwotCXNpZ25hdHVyZSA9IHBhY2tldF9nZXRfc3RyaW5nKCZzbGVuKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlrbGVuID0gKEVDX0dST1VQX2dldF9kZWdyZWUoZ3JvdXApICsgNykgLyA4OwotCWtidWYgPSB4bWFsbG9jKGtsZW4pOwotCWlmIChFQ0RIX2NvbXB1dGVfa2V5KGtidWYsIGtsZW4sIHNlcnZlcl9wdWJsaWMsCi0JICAgIGNsaWVudF9rZXksIE5VTEwpICE9IChpbnQpa2xlbikKLQkJZmF0YWwoIiVzOiBFQ0RIX2NvbXB1dGVfa2V5IGZhaWxlZCIsIF9fZnVuY19fKTsKLQotI2lmZGVmIERFQlVHX0tFWEVDREgKLQlkdW1wX2RpZ2VzdCgic2hhcmVkIHNlY3JldCIsIGtidWYsIGtsZW4pOwotI2VuZGlmCi0JaWYgKChzaGFyZWRfc2VjcmV0ID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKLQlpZiAoQk5fYmluMmJuKGtidWYsIGtsZW4sIHNoYXJlZF9zZWNyZXQpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fYmluMmJuIGZhaWxlZCIsIF9fZnVuY19fKTsKLQltZW1zZXQoa2J1ZiwgMCwga2xlbik7Ci0JeGZyZWUoa2J1Zik7Ci0KLQkvKiBjYWxjIGFuZCB2ZXJpZnkgSCAqLwotCWtleF9lY2RoX2hhc2goCi0JICAgIGtleC0+ZXZwX21kLAotCSAgICBncm91cCwKLQkgICAga2V4LT5jbGllbnRfdmVyc2lvbl9zdHJpbmcsCi0JICAgIGtleC0+c2VydmVyX3ZlcnNpb25fc3RyaW5nLAotCSAgICBidWZmZXJfcHRyKCZrZXgtPm15KSwgYnVmZmVyX2xlbigma2V4LT5teSksCi0JICAgIGJ1ZmZlcl9wdHIoJmtleC0+cGVlciksIGJ1ZmZlcl9sZW4oJmtleC0+cGVlciksCi0JICAgIHNlcnZlcl9ob3N0X2tleV9ibG9iLCBzYmxvYmxlbiwKLQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShjbGllbnRfa2V5KSwKLQkgICAgc2VydmVyX3B1YmxpYywKLQkgICAgc2hhcmVkX3NlY3JldCwKLQkgICAgJmhhc2gsICZoYXNobGVuCi0JKTsKLQl4ZnJlZShzZXJ2ZXJfaG9zdF9rZXlfYmxvYik7Ci0JRUNfUE9JTlRfY2xlYXJfZnJlZShzZXJ2ZXJfcHVibGljKTsKLQlFQ19LRVlfZnJlZShjbGllbnRfa2V5KTsKLQotCWlmIChrZXlfdmVyaWZ5KHNlcnZlcl9ob3N0X2tleSwgc2lnbmF0dXJlLCBzbGVuLCBoYXNoLCBoYXNobGVuKSAhPSAxKQotCQlmYXRhbCgia2V5X3ZlcmlmeSBmYWlsZWQgZm9yIHNlcnZlcl9ob3N0X2tleSIpOwotCWtleV9mcmVlKHNlcnZlcl9ob3N0X2tleSk7Ci0JeGZyZWUoc2lnbmF0dXJlKTsKLQotCS8qIHNhdmUgc2Vzc2lvbiBpZCAqLwotCWlmIChrZXgtPnNlc3Npb25faWQgPT0gTlVMTCkgewotCQlrZXgtPnNlc3Npb25faWRfbGVuID0gaGFzaGxlbjsKLQkJa2V4LT5zZXNzaW9uX2lkID0geG1hbGxvYyhrZXgtPnNlc3Npb25faWRfbGVuKTsKLQkJbWVtY3B5KGtleC0+c2Vzc2lvbl9pZCwgaGFzaCwga2V4LT5zZXNzaW9uX2lkX2xlbik7Ci0JfQotCi0Ja2V4X2Rlcml2ZV9rZXlzKGtleCwgaGFzaCwgaGFzaGxlbiwgc2hhcmVkX3NlY3JldCk7Ci0JQk5fY2xlYXJfZnJlZShzaGFyZWRfc2VjcmV0KTsKLQlrZXhfZmluaXNoKGtleCk7Ci19Ci0jZWxzZSAvKiBPUEVOU1NMX0hBU19FQ0MgKi8KLXZvaWQKLWtleGVjZGhfY2xpZW50KEtleCAqa2V4KQotewotCWZhdGFsKCJFQ0Mgc3VwcG9ydCBpcyBub3QgZW5hYmxlZCIpOwotfQotI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLwpkaWZmIC0tZ2l0IGEva2V4ZWNkaHMuYyBiL2tleGVjZGhzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTE1ZGYuLjAwMDAwMDAKLS0tIGEva2V4ZWNkaHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKiAkT3BlbkJTRDoga2V4ZWNkaHMuYyx2IDEuMiAyMDEwLzA5LzIyIDA1OjAxOjI5IGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAxMCBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJjaXBoZXIuaCIKLSNpbmNsdWRlICJrZXguaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJkaC5oIgotI2luY2x1ZGUgInNzaDIuaCIKLSNpZmRlZiBHU1NBUEkKLSNpbmNsdWRlICJzc2gtZ3NzLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJtb25pdG9yX3dyYXAuaCIKLQotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCi0jaW5jbHVkZSA8b3BlbnNzbC9lY2RoLmg+Ci0KLXZvaWQKLWtleGVjZGhfc2VydmVyKEtleCAqa2V4KQotewotCUVDX1BPSU5UICpjbGllbnRfcHVibGljOwotCUVDX0tFWSAqc2VydmVyX2tleTsKLQljb25zdCBFQ19HUk9VUCAqZ3JvdXA7Ci0JQklHTlVNICpzaGFyZWRfc2VjcmV0OwotCUtleSAqc2VydmVyX2hvc3RfcHJpdmF0ZSwgKnNlcnZlcl9ob3N0X3B1YmxpYzsKLQl1X2NoYXIgKnNlcnZlcl9ob3N0X2tleV9ibG9iID0gTlVMTCwgKnNpZ25hdHVyZSA9IE5VTEw7Ci0JdV9jaGFyICprYnVmLCAqaGFzaDsKLQl1X2ludCBrbGVuLCBzbGVuLCBzYmxvYmxlbiwgaGFzaGxlbjsKLQlpbnQgY3VydmVfbmlkOwotCi0JaWYgKChjdXJ2ZV9uaWQgPSBrZXhfZWNkaF9uYW1lX3RvX25pZChrZXgtPm5hbWUpKSA9PSAtMSkKLQkJZmF0YWwoIiVzOiB1bnN1cHBvcnRlZCBFQ0RIIGN1cnZlIFwiJXNcIiIsIF9fZnVuY19fLCBrZXgtPm5hbWUpOwotCWlmICgoc2VydmVyX2tleSA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZShjdXJ2ZV9uaWQpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZSBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JaWYgKEVDX0tFWV9nZW5lcmF0ZV9rZXkoc2VydmVyX2tleSkgIT0gMSkKLQkJZmF0YWwoIiVzOiBFQ19LRVlfZ2VuZXJhdGVfa2V5IGZhaWxlZCIsIF9fZnVuY19fKTsKLQlncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKHNlcnZlcl9rZXkpOwotCi0jaWZkZWYgREVCVUdfS0VYRUNESAotCWZwdXRzKCJzZXJ2ZXIgcHJpdmF0ZSBrZXk6XG4iLCBzdGRlcnIpOwotCWtleV9kdW1wX2VjX2tleShzZXJ2ZXJfa2V5KTsKLSNlbmRpZgotCi0JaWYgKGtleC0+bG9hZF9ob3N0X3B1YmxpY19rZXkgPT0gTlVMTCB8fAotCSAgICBrZXgtPmxvYWRfaG9zdF9wcml2YXRlX2tleSA9PSBOVUxMKQotCQlmYXRhbCgiQ2Fubm90IGxvYWQgaG9zdGtleSIpOwotCXNlcnZlcl9ob3N0X3B1YmxpYyA9IGtleC0+bG9hZF9ob3N0X3B1YmxpY19rZXkoa2V4LT5ob3N0a2V5X3R5cGUpOwotCWlmIChzZXJ2ZXJfaG9zdF9wdWJsaWMgPT0gTlVMTCkKLQkJZmF0YWwoIlVuc3VwcG9ydGVkIGhvc3RrZXkgdHlwZSAlZCIsIGtleC0+aG9zdGtleV90eXBlKTsKLQlzZXJ2ZXJfaG9zdF9wcml2YXRlID0ga2V4LT5sb2FkX2hvc3RfcHJpdmF0ZV9rZXkoa2V4LT5ob3N0a2V5X3R5cGUpOwotCWlmIChzZXJ2ZXJfaG9zdF9wcml2YXRlID09IE5VTEwpCi0JCWZhdGFsKCJNaXNzaW5nIHByaXZhdGUga2V5IGZvciBob3N0a2V5IHR5cGUgJWQiLAotCQkgICAga2V4LT5ob3N0a2V5X3R5cGUpOwotCi0JZGVidWcoImV4cGVjdGluZyBTU0gyX01TR19LRVhfRUNESF9JTklUIik7Ci0JcGFja2V0X3JlYWRfZXhwZWN0KFNTSDJfTVNHX0tFWF9FQ0RIX0lOSVQpOwotCWlmICgoY2xpZW50X3B1YmxpYyA9IEVDX1BPSU5UX25ldyhncm91cCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogRUNfUE9JTlRfbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKLQlwYWNrZXRfZ2V0X2VjcG9pbnQoZ3JvdXAsIGNsaWVudF9wdWJsaWMpOwotCXBhY2tldF9jaGVja19lb20oKTsKLQotCWlmIChrZXlfZWNfdmFsaWRhdGVfcHVibGljKGdyb3VwLCBjbGllbnRfcHVibGljKSAhPSAwKQotCQlmYXRhbCgiJXM6IGludmFsaWQgY2xpZW50IHB1YmxpYyBrZXkiLCBfX2Z1bmNfXyk7Ci0KLSNpZmRlZiBERUJVR19LRVhFQ0RICi0JZnB1dHMoImNsaWVudCBwdWJsaWMga2V5OlxuIiwgc3RkZXJyKTsKLQlrZXlfZHVtcF9lY19wb2ludChncm91cCwgY2xpZW50X3B1YmxpYyk7Ci0jZW5kaWYKLQotCS8qIENhbGN1bGF0ZSBzaGFyZWRfc2VjcmV0ICovCi0Ja2xlbiA9IChFQ19HUk9VUF9nZXRfZGVncmVlKGdyb3VwKSArIDcpIC8gODsKLQlrYnVmID0geG1hbGxvYyhrbGVuKTsKLQlpZiAoRUNESF9jb21wdXRlX2tleShrYnVmLCBrbGVuLCBjbGllbnRfcHVibGljLAotCSAgICBzZXJ2ZXJfa2V5LCBOVUxMKSAhPSAoaW50KWtsZW4pCi0JCWZhdGFsKCIlczogRUNESF9jb21wdXRlX2tleSBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0KLSNpZmRlZiBERUJVR19LRVhESAotCWR1bXBfZGlnZXN0KCJzaGFyZWQgc2VjcmV0Iiwga2J1Ziwga2xlbik7Ci0jZW5kaWYKLQlpZiAoKHNoYXJlZF9zZWNyZXQgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBCTl9uZXcgZmFpbGVkIiwgX19mdW5jX18pOwotCWlmIChCTl9iaW4yYm4oa2J1Ziwga2xlbiwgc2hhcmVkX3NlY3JldCkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBCTl9iaW4yYm4gZmFpbGVkIiwgX19mdW5jX18pOwotCW1lbXNldChrYnVmLCAwLCBrbGVuKTsKLQl4ZnJlZShrYnVmKTsKLQotCS8qIGNhbGMgSCAqLwotCWtleV90b19ibG9iKHNlcnZlcl9ob3N0X3B1YmxpYywgJnNlcnZlcl9ob3N0X2tleV9ibG9iLCAmc2Jsb2JsZW4pOwotCWtleF9lY2RoX2hhc2goCi0JICAgIGtleC0+ZXZwX21kLAotCSAgICBncm91cCwKLQkgICAga2V4LT5jbGllbnRfdmVyc2lvbl9zdHJpbmcsCi0JICAgIGtleC0+c2VydmVyX3ZlcnNpb25fc3RyaW5nLAotCSAgICBidWZmZXJfcHRyKCZrZXgtPnBlZXIpLCBidWZmZXJfbGVuKCZrZXgtPnBlZXIpLAotCSAgICBidWZmZXJfcHRyKCZrZXgtPm15KSwgYnVmZmVyX2xlbigma2V4LT5teSksCi0JICAgIHNlcnZlcl9ob3N0X2tleV9ibG9iLCBzYmxvYmxlbiwKLQkgICAgY2xpZW50X3B1YmxpYywKLQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShzZXJ2ZXJfa2V5KSwKLQkgICAgc2hhcmVkX3NlY3JldCwKLQkgICAgJmhhc2gsICZoYXNobGVuCi0JKTsKLQlFQ19QT0lOVF9jbGVhcl9mcmVlKGNsaWVudF9wdWJsaWMpOwotCi0JLyogc2F2ZSBzZXNzaW9uIGlkIDo9IEggKi8KLQlpZiAoa2V4LT5zZXNzaW9uX2lkID09IE5VTEwpIHsKLQkJa2V4LT5zZXNzaW9uX2lkX2xlbiA9IGhhc2hsZW47Ci0JCWtleC0+c2Vzc2lvbl9pZCA9IHhtYWxsb2Moa2V4LT5zZXNzaW9uX2lkX2xlbik7Ci0JCW1lbWNweShrZXgtPnNlc3Npb25faWQsIGhhc2gsIGtleC0+c2Vzc2lvbl9pZF9sZW4pOwotCX0KLQotCS8qIHNpZ24gSCAqLwotCWlmIChQUklWU0VQKGtleV9zaWduKHNlcnZlcl9ob3N0X3ByaXZhdGUsICZzaWduYXR1cmUsICZzbGVuLAotCSAgICBoYXNoLCBoYXNobGVuKSkgPCAwKQotCQlmYXRhbCgia2V4ZGhfc2VydmVyOiBrZXlfc2lnbiBmYWlsZWQiKTsKLQotCS8qIGRlc3Ryb3lfc2Vuc2l0aXZlX2RhdGEoKTsgKi8KLQotCS8qIHNlbmQgc2VydmVyIGhvc3RrZXksIEVDREggcHVia2V5ICdRX1MnIGFuZCBzaWduZWQgSCAqLwotCXBhY2tldF9zdGFydChTU0gyX01TR19LRVhfRUNESF9SRVBMWSk7Ci0JcGFja2V0X3B1dF9zdHJpbmcoc2VydmVyX2hvc3Rfa2V5X2Jsb2IsIHNibG9ibGVuKTsKLQlwYWNrZXRfcHV0X2VjcG9pbnQoZ3JvdXAsIEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoc2VydmVyX2tleSkpOwotCXBhY2tldF9wdXRfc3RyaW5nKHNpZ25hdHVyZSwgc2xlbik7Ci0JcGFja2V0X3NlbmQoKTsKLQotCXhmcmVlKHNpZ25hdHVyZSk7Ci0JeGZyZWUoc2VydmVyX2hvc3Rfa2V5X2Jsb2IpOwotCS8qIGhhdmUga2V5cywgZnJlZSBzZXJ2ZXIga2V5ICovCi0JRUNfS0VZX2ZyZWUoc2VydmVyX2tleSk7Ci0KLQlrZXhfZGVyaXZlX2tleXMoa2V4LCBoYXNoLCBoYXNobGVuLCBzaGFyZWRfc2VjcmV0KTsKLQlCTl9jbGVhcl9mcmVlKHNoYXJlZF9zZWNyZXQpOwotCWtleF9maW5pc2goa2V4KTsKLX0KLSNlbHNlIC8qIE9QRU5TU0xfSEFTX0VDQyAqLwotdm9pZAota2V4ZWNkaF9zZXJ2ZXIoS2V4ICprZXgpCi17Ci0JZmF0YWwoIkVDQyBzdXBwb3J0IGlzIG5vdCBlbmFibGVkIik7Ci19Ci0jZW5kaWYgLyogT1BFTlNTTF9IQVNfRUNDICovCmRpZmYgLS1naXQgYS9rZXhnZXguYyBiL2tleGdleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjBhYjVjLi4wMDAwMDAwCi0tLSBhL2tleGdleC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyogJE9wZW5CU0Q6IGtleGdleC5jLHYgMS4yNyAyMDA2LzA4LzAzIDAzOjM0OjQyIGRlcmFhZHQgRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgTmllbHMgUHJvdm9zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJjaXBoZXIuaCIKLSNpbmNsdWRlICJrZXguaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0KLXZvaWQKLWtleGdleF9oYXNoKAotICAgIGNvbnN0IEVWUF9NRCAqZXZwX21kLAotICAgIGNoYXIgKmNsaWVudF92ZXJzaW9uX3N0cmluZywKLSAgICBjaGFyICpzZXJ2ZXJfdmVyc2lvbl9zdHJpbmcsCi0gICAgY2hhciAqY2tleGluaXQsIGludCBja2V4aW5pdGxlbiwKLSAgICBjaGFyICpza2V4aW5pdCwgaW50IHNrZXhpbml0bGVuLAotICAgIHVfY2hhciAqc2VydmVyaG9zdGtleWJsb2IsIGludCBzYmxvYmxlbiwKLSAgICBpbnQgbWluLCBpbnQgd2FudGJpdHMsIGludCBtYXgsIEJJR05VTSAqcHJpbWUsIEJJR05VTSAqZ2VuLAotICAgIEJJR05VTSAqY2xpZW50X2RoX3B1YiwKLSAgICBCSUdOVU0gKnNlcnZlcl9kaF9wdWIsCi0gICAgQklHTlVNICpzaGFyZWRfc2VjcmV0LAotICAgIHVfY2hhciAqKmhhc2gsIHVfaW50ICpoYXNobGVuKQotewotCUJ1ZmZlciBiOwotCXN0YXRpYyB1X2NoYXIgZGlnZXN0W0VWUF9NQVhfTURfU0laRV07Ci0JRVZQX01EX0NUWCBtZDsKLQotCWJ1ZmZlcl9pbml0KCZiKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGNsaWVudF92ZXJzaW9uX3N0cmluZyk7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBzZXJ2ZXJfdmVyc2lvbl9zdHJpbmcpOwotCi0JLyoga2V4aW5pdCBtZXNzYWdlczogZmFrZSBoZWFkZXI6IGxlbitTU0gyX01TR19LRVhJTklUICovCi0JYnVmZmVyX3B1dF9pbnQoJmIsIGNrZXhpbml0bGVuKzEpOwotCWJ1ZmZlcl9wdXRfY2hhcigmYiwgU1NIMl9NU0dfS0VYSU5JVCk7Ci0JYnVmZmVyX2FwcGVuZCgmYiwgY2tleGluaXQsIGNrZXhpbml0bGVuKTsKLQlidWZmZXJfcHV0X2ludCgmYiwgc2tleGluaXRsZW4rMSk7Ci0JYnVmZmVyX3B1dF9jaGFyKCZiLCBTU0gyX01TR19LRVhJTklUKTsKLQlidWZmZXJfYXBwZW5kKCZiLCBza2V4aW5pdCwgc2tleGluaXRsZW4pOwotCi0JYnVmZmVyX3B1dF9zdHJpbmcoJmIsIHNlcnZlcmhvc3RrZXlibG9iLCBzYmxvYmxlbik7Ci0JaWYgKG1pbiA9PSAtMSB8fCBtYXggPT0gLTEpCi0JCWJ1ZmZlcl9wdXRfaW50KCZiLCB3YW50Yml0cyk7Ci0JZWxzZSB7Ci0JCWJ1ZmZlcl9wdXRfaW50KCZiLCBtaW4pOwotCQlidWZmZXJfcHV0X2ludCgmYiwgd2FudGJpdHMpOwotCQlidWZmZXJfcHV0X2ludCgmYiwgbWF4KTsKLQl9Ci0JYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBwcmltZSk7Ci0JYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBnZW4pOwotCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgY2xpZW50X2RoX3B1Yik7Ci0JYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBzZXJ2ZXJfZGhfcHViKTsKLQlidWZmZXJfcHV0X2JpZ251bTIoJmIsIHNoYXJlZF9zZWNyZXQpOwotCi0jaWZkZWYgREVCVUdfS0VYREgKLQlidWZmZXJfZHVtcCgmYik7Ci0jZW5kaWYKLQotCUVWUF9EaWdlc3RJbml0KCZtZCwgZXZwX21kKTsKLQlFVlBfRGlnZXN0VXBkYXRlKCZtZCwgYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpKTsKLQlFVlBfRGlnZXN0RmluYWwoJm1kLCBkaWdlc3QsIE5VTEwpOwotCi0JYnVmZmVyX2ZyZWUoJmIpOwotCSpoYXNoID0gZGlnZXN0OwotCSpoYXNobGVuID0gRVZQX01EX3NpemUoZXZwX21kKTsKLSNpZmRlZiBERUJVR19LRVhESAotCWR1bXBfZGlnZXN0KCJoYXNoIiwgZGlnZXN0LCAqaGFzaGxlbik7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2tleGdleGMuYyBiL2tleGdleGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1NTJkNy4uMDAwMDAwMAotLS0gYS9rZXhnZXhjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGtleGdleGMuYyx2IDEuMTIgMjAxMC8xMS8xMCAwMTozMzowNyBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgTmllbHMgUHJvdm9zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiY2lwaGVyLmgiCi0jaW5jbHVkZSAia2V4LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAiZGguaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0KLXZvaWQKLWtleGdleF9jbGllbnQoS2V4ICprZXgpCi17Ci0JQklHTlVNICpkaF9zZXJ2ZXJfcHViID0gTlVMTCwgKnNoYXJlZF9zZWNyZXQgPSBOVUxMOwotCUJJR05VTSAqcCA9IE5VTEwsICpnID0gTlVMTDsKLQlLZXkgKnNlcnZlcl9ob3N0X2tleTsKLQl1X2NoYXIgKmtidWYsICpoYXNoLCAqc2lnbmF0dXJlID0gTlVMTCwgKnNlcnZlcl9ob3N0X2tleV9ibG9iID0gTlVMTDsKLQl1X2ludCBrbGVuLCBzbGVuLCBzYmxvYmxlbiwgaGFzaGxlbjsKLQlpbnQga291dDsKLQlpbnQgbWluLCBtYXgsIG5iaXRzOwotCURIICpkaDsKLQotCW5iaXRzID0gZGhfZXN0aW1hdGUoa2V4LT53ZV9uZWVkICogOCk7Ci0KLQlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfT0xEX0RIR0VYKSB7Ci0JCS8qIE9sZCBHRVggcmVxdWVzdCAqLwotCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVFVRVNUX09MRCk7Ci0JCXBhY2tldF9wdXRfaW50KG5iaXRzKTsKLQkJbWluID0gREhfR1JQX01JTjsKLQkJbWF4ID0gREhfR1JQX01BWDsKLQotCQlkZWJ1ZygiU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVFVRVNUX09MRCgldSkgc2VudCIsIG5iaXRzKTsKLQl9IGVsc2UgewotCQkvKiBOZXcgR0VYIHJlcXVlc3QgKi8KLQkJbWluID0gREhfR1JQX01JTjsKLQkJbWF4ID0gREhfR1JQX01BWDsKLQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0tFWF9ESF9HRVhfUkVRVUVTVCk7Ci0JCXBhY2tldF9wdXRfaW50KG1pbik7Ci0JCXBhY2tldF9wdXRfaW50KG5iaXRzKTsKLQkJcGFja2V0X3B1dF9pbnQobWF4KTsKLQotCQlkZWJ1ZygiU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVFVRVNUKCV1PCV1PCV1KSBzZW50IiwKLQkJICAgIG1pbiwgbmJpdHMsIG1heCk7Ci0JfQotI2lmZGVmIERFQlVHX0tFWERICi0JZnByaW50ZihzdGRlcnIsICJcbm1pbiA9ICVkLCBuYml0cyA9ICVkLCBtYXggPSAlZFxuIiwKLQkgICAgbWluLCBuYml0cywgbWF4KTsKLSNlbmRpZgotCXBhY2tldF9zZW5kKCk7Ci0KLQlkZWJ1ZygiZXhwZWN0aW5nIFNTSDJfTVNHX0tFWF9ESF9HRVhfR1JPVVAiKTsKLQlwYWNrZXRfcmVhZF9leHBlY3QoU1NIMl9NU0dfS0VYX0RIX0dFWF9HUk9VUCk7Ci0KLQlpZiAoKHAgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoIkJOX25ldyIpOwotCXBhY2tldF9nZXRfYmlnbnVtMihwKTsKLQlpZiAoKGcgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoIkJOX25ldyIpOwotCXBhY2tldF9nZXRfYmlnbnVtMihnKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlpZiAoQk5fbnVtX2JpdHMocCkgPCBtaW4gfHwgQk5fbnVtX2JpdHMocCkgPiBtYXgpCi0JCWZhdGFsKCJESF9HRVggZ3JvdXAgb3V0IG9mIHJhbmdlOiAlZCAhPCAlZCAhPCAlZCIsCi0JCSAgICBtaW4sIEJOX251bV9iaXRzKHApLCBtYXgpOwotCi0JZGggPSBkaF9uZXdfZ3JvdXAoZywgcCk7Ci0JZGhfZ2VuX2tleShkaCwga2V4LT53ZV9uZWVkICogOCk7Ci0KLSNpZmRlZiBERUJVR19LRVhESAotCURIcGFyYW1zX3ByaW50X2ZwKHN0ZGVyciwgZGgpOwotCWZwcmludGYoc3RkZXJyLCAicHViPSAiKTsKLQlCTl9wcmludF9mcChzdGRlcnIsIGRoLT5wdWJfa2V5KTsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQotCWRlYnVnKCJTU0gyX01TR19LRVhfREhfR0VYX0lOSVQgc2VudCIpOwotCS8qIGdlbmVyYXRlIGFuZCBzZW5kICdlJywgY2xpZW50IERIIHB1YmxpYyBrZXkgKi8KLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfS0VYX0RIX0dFWF9JTklUKTsKLQlwYWNrZXRfcHV0X2JpZ251bTIoZGgtPnB1Yl9rZXkpOwotCXBhY2tldF9zZW5kKCk7Ci0KLQlkZWJ1ZygiZXhwZWN0aW5nIFNTSDJfTVNHX0tFWF9ESF9HRVhfUkVQTFkiKTsKLQlwYWNrZXRfcmVhZF9leHBlY3QoU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVBMWSk7Ci0KLQkvKiBrZXksIGNlcnQgKi8KLQlzZXJ2ZXJfaG9zdF9rZXlfYmxvYiA9IHBhY2tldF9nZXRfc3RyaW5nKCZzYmxvYmxlbik7Ci0Jc2VydmVyX2hvc3Rfa2V5ID0ga2V5X2Zyb21fYmxvYihzZXJ2ZXJfaG9zdF9rZXlfYmxvYiwgc2Jsb2JsZW4pOwotCWlmIChzZXJ2ZXJfaG9zdF9rZXkgPT0gTlVMTCkKLQkJZmF0YWwoImNhbm5vdCBkZWNvZGUgc2VydmVyX2hvc3Rfa2V5X2Jsb2IiKTsKLQlpZiAoc2VydmVyX2hvc3Rfa2V5LT50eXBlICE9IGtleC0+aG9zdGtleV90eXBlKQotCQlmYXRhbCgidHlwZSBtaXNtYXRjaCBmb3IgZGVjb2RlZCBzZXJ2ZXJfaG9zdF9rZXlfYmxvYiIpOwotCWlmIChrZXgtPnZlcmlmeV9ob3N0X2tleSA9PSBOVUxMKQotCQlmYXRhbCgiY2Fubm90IHZlcmlmeSBzZXJ2ZXJfaG9zdF9rZXkiKTsKLQlpZiAoa2V4LT52ZXJpZnlfaG9zdF9rZXkoc2VydmVyX2hvc3Rfa2V5KSA9PSAtMSkKLQkJZmF0YWwoInNlcnZlcl9ob3N0X2tleSB2ZXJpZmljYXRpb24gZmFpbGVkIik7Ci0KLQkvKiBESCBwYXJhbWV0ZXIgZiwgc2VydmVyIHB1YmxpYyBESCBrZXkgKi8KLQlpZiAoKGRoX3NlcnZlcl9wdWIgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoImRoX3NlcnZlcl9wdWIgPT0gTlVMTCIpOwotCXBhY2tldF9nZXRfYmlnbnVtMihkaF9zZXJ2ZXJfcHViKTsKLQotI2lmZGVmIERFQlVHX0tFWERICi0JZnByaW50ZihzdGRlcnIsICJkaF9zZXJ2ZXJfcHViPSAiKTsKLQlCTl9wcmludF9mcChzdGRlcnIsIGRoX3NlcnZlcl9wdWIpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQlkZWJ1ZygiYml0cyAlZCIsIEJOX251bV9iaXRzKGRoX3NlcnZlcl9wdWIpKTsKLSNlbmRpZgotCi0JLyogc2lnbmVkIEggKi8KLQlzaWduYXR1cmUgPSBwYWNrZXRfZ2V0X3N0cmluZygmc2xlbik7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JaWYgKCFkaF9wdWJfaXNfdmFsaWQoZGgsIGRoX3NlcnZlcl9wdWIpKQotCQlwYWNrZXRfZGlzY29ubmVjdCgiYmFkIHNlcnZlciBwdWJsaWMgREggdmFsdWUiKTsKLQotCWtsZW4gPSBESF9zaXplKGRoKTsKLQlrYnVmID0geG1hbGxvYyhrbGVuKTsKLQlpZiAoKGtvdXQgPSBESF9jb21wdXRlX2tleShrYnVmLCBkaF9zZXJ2ZXJfcHViLCBkaCkpIDwgMCkKLQkJZmF0YWwoIkRIX2NvbXB1dGVfa2V5OiBmYWlsZWQiKTsKLSNpZmRlZiBERUJVR19LRVhESAotCWR1bXBfZGlnZXN0KCJzaGFyZWQgc2VjcmV0Iiwga2J1Ziwga291dCk7Ci0jZW5kaWYKLQlpZiAoKHNoYXJlZF9zZWNyZXQgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoImtleGdleF9jbGllbnQ6IEJOX25ldyBmYWlsZWQiKTsKLQlpZiAoQk5fYmluMmJuKGtidWYsIGtvdXQsIHNoYXJlZF9zZWNyZXQpID09IE5VTEwpCi0JCWZhdGFsKCJrZXhnZXhfY2xpZW50OiBCTl9iaW4yYm4gZmFpbGVkIik7Ci0JbWVtc2V0KGtidWYsIDAsIGtsZW4pOwotCXhmcmVlKGtidWYpOwotCi0JaWYgKGRhdGFmZWxsb3dzICYgU1NIX09MRF9ESEdFWCkKLQkJbWluID0gbWF4ID0gLTE7Ci0KLQkvKiBjYWxjIGFuZCB2ZXJpZnkgSCAqLwotCWtleGdleF9oYXNoKAotCSAgICBrZXgtPmV2cF9tZCwKLQkgICAga2V4LT5jbGllbnRfdmVyc2lvbl9zdHJpbmcsCi0JICAgIGtleC0+c2VydmVyX3ZlcnNpb25fc3RyaW5nLAotCSAgICBidWZmZXJfcHRyKCZrZXgtPm15KSwgYnVmZmVyX2xlbigma2V4LT5teSksCi0JICAgIGJ1ZmZlcl9wdHIoJmtleC0+cGVlciksIGJ1ZmZlcl9sZW4oJmtleC0+cGVlciksCi0JICAgIHNlcnZlcl9ob3N0X2tleV9ibG9iLCBzYmxvYmxlbiwKLQkgICAgbWluLCBuYml0cywgbWF4LAotCSAgICBkaC0+cCwgZGgtPmcsCi0JICAgIGRoLT5wdWJfa2V5LAotCSAgICBkaF9zZXJ2ZXJfcHViLAotCSAgICBzaGFyZWRfc2VjcmV0LAotCSAgICAmaGFzaCwgJmhhc2hsZW4KLQkpOwotCi0JLyogaGF2ZSBrZXlzLCBmcmVlIERIICovCi0JREhfZnJlZShkaCk7Ci0JeGZyZWUoc2VydmVyX2hvc3Rfa2V5X2Jsb2IpOwotCUJOX2NsZWFyX2ZyZWUoZGhfc2VydmVyX3B1Yik7Ci0KLQlpZiAoa2V5X3ZlcmlmeShzZXJ2ZXJfaG9zdF9rZXksIHNpZ25hdHVyZSwgc2xlbiwgaGFzaCwgaGFzaGxlbikgIT0gMSkKLQkJZmF0YWwoImtleV92ZXJpZnkgZmFpbGVkIGZvciBzZXJ2ZXJfaG9zdF9rZXkiKTsKLQlrZXlfZnJlZShzZXJ2ZXJfaG9zdF9rZXkpOwotCXhmcmVlKHNpZ25hdHVyZSk7Ci0KLQkvKiBzYXZlIHNlc3Npb24gaWQgKi8KLQlpZiAoa2V4LT5zZXNzaW9uX2lkID09IE5VTEwpIHsKLQkJa2V4LT5zZXNzaW9uX2lkX2xlbiA9IGhhc2hsZW47Ci0JCWtleC0+c2Vzc2lvbl9pZCA9IHhtYWxsb2Moa2V4LT5zZXNzaW9uX2lkX2xlbik7Ci0JCW1lbWNweShrZXgtPnNlc3Npb25faWQsIGhhc2gsIGtleC0+c2Vzc2lvbl9pZF9sZW4pOwotCX0KLQlrZXhfZGVyaXZlX2tleXMoa2V4LCBoYXNoLCBoYXNobGVuLCBzaGFyZWRfc2VjcmV0KTsKLQlCTl9jbGVhcl9mcmVlKHNoYXJlZF9zZWNyZXQpOwotCi0Ja2V4X2ZpbmlzaChrZXgpOwotfQpkaWZmIC0tZ2l0IGEva2V4Z2V4cy5jIGIva2V4Z2V4cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWUzZGY3Li4wMDAwMDAwCi0tLSBhL2tleGdleHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKiAkT3BlbkJTRDoga2V4Z2V4cy5jLHYgMS4xNCAyMDEwLzExLzEwIDAxOjMzOjA3IGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBOaWVscyBQcm92b3MuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJjaXBoZXIuaCIKLSNpbmNsdWRlICJrZXguaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJkaC5oIgotI2luY2x1ZGUgInNzaDIuaCIKLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpZmRlZiBHU1NBUEkKLSNpbmNsdWRlICJzc2gtZ3NzLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJtb25pdG9yX3dyYXAuaCIKLQotdm9pZAota2V4Z2V4X3NlcnZlcihLZXggKmtleCkKLXsKLQlCSUdOVU0gKnNoYXJlZF9zZWNyZXQgPSBOVUxMLCAqZGhfY2xpZW50X3B1YiA9IE5VTEw7Ci0JS2V5ICpzZXJ2ZXJfaG9zdF9wdWJsaWMsICpzZXJ2ZXJfaG9zdF9wcml2YXRlOwotCURIICpkaDsKLQl1X2NoYXIgKmtidWYsICpoYXNoLCAqc2lnbmF0dXJlID0gTlVMTCwgKnNlcnZlcl9ob3N0X2tleV9ibG9iID0gTlVMTDsKLQl1X2ludCBzYmxvYmxlbiwga2xlbiwgc2xlbiwgaGFzaGxlbjsKLQlpbnQgb21pbiA9IC0xLCBtaW4gPSAtMSwgb21heCA9IC0xLCBtYXggPSAtMSwgb25iaXRzID0gLTEsIG5iaXRzID0gLTE7Ci0JaW50IHR5cGUsIGtvdXQ7Ci0KLQlpZiAoa2V4LT5sb2FkX2hvc3RfcHVibGljX2tleSA9PSBOVUxMIHx8Ci0JICAgIGtleC0+bG9hZF9ob3N0X3ByaXZhdGVfa2V5ID09IE5VTEwpCi0JCWZhdGFsKCJDYW5ub3QgbG9hZCBob3N0a2V5Iik7Ci0Jc2VydmVyX2hvc3RfcHVibGljID0ga2V4LT5sb2FkX2hvc3RfcHVibGljX2tleShrZXgtPmhvc3RrZXlfdHlwZSk7Ci0JaWYgKHNlcnZlcl9ob3N0X3B1YmxpYyA9PSBOVUxMKQotCQlmYXRhbCgiVW5zdXBwb3J0ZWQgaG9zdGtleSB0eXBlICVkIiwga2V4LT5ob3N0a2V5X3R5cGUpOwotCXNlcnZlcl9ob3N0X3ByaXZhdGUgPSBrZXgtPmxvYWRfaG9zdF9wcml2YXRlX2tleShrZXgtPmhvc3RrZXlfdHlwZSk7Ci0JaWYgKHNlcnZlcl9ob3N0X3ByaXZhdGUgPT0gTlVMTCkKLQkJZmF0YWwoIk1pc3NpbmcgcHJpdmF0ZSBrZXkgZm9yIGhvc3RrZXkgdHlwZSAlZCIsCi0JCSAgICBrZXgtPmhvc3RrZXlfdHlwZSk7Ci0KLQotCXR5cGUgPSBwYWNrZXRfcmVhZCgpOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVFVRVNUOgotCQlkZWJ1ZygiU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVFVRVNUIHJlY2VpdmVkIik7Ci0JCW9taW4gPSBtaW4gPSBwYWNrZXRfZ2V0X2ludCgpOwotCQlvbmJpdHMgPSBuYml0cyA9IHBhY2tldF9nZXRfaW50KCk7Ci0JCW9tYXggPSBtYXggPSBwYWNrZXRfZ2V0X2ludCgpOwotCQltaW4gPSBNQVgoREhfR1JQX01JTiwgbWluKTsKLQkJbWF4ID0gTUlOKERIX0dSUF9NQVgsIG1heCk7Ci0JCW5iaXRzID0gTUFYKERIX0dSUF9NSU4sIG5iaXRzKTsKLQkJbmJpdHMgPSBNSU4oREhfR1JQX01BWCwgbmJpdHMpOwotCQlicmVhazsKLQljYXNlIFNTSDJfTVNHX0tFWF9ESF9HRVhfUkVRVUVTVF9PTEQ6Ci0JCWRlYnVnKCJTU0gyX01TR19LRVhfREhfR0VYX1JFUVVFU1RfT0xEIHJlY2VpdmVkIik7Ci0JCW9uYml0cyA9IG5iaXRzID0gcGFja2V0X2dldF9pbnQoKTsKLQkJLyogdW51c2VkIGZvciBvbGQgR0VYICovCi0JCW9taW4gPSBtaW4gPSBESF9HUlBfTUlOOwotCQlvbWF4ID0gbWF4ID0gREhfR1JQX01BWDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmF0YWwoInByb3RvY29sIGVycm9yIGR1cmluZyBrZXgsIG5vIERIX0dFWF9SRVFVRVNUOiAlZCIsIHR5cGUpOwotCX0KLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlpZiAob21heCA8IG9taW4gfHwgb25iaXRzIDwgb21pbiB8fCBvbWF4IDwgb25iaXRzKQotCQlmYXRhbCgiREhfR0VYX1JFUVVFU1QsIGJhZCBwYXJhbWV0ZXJzOiAlZCAhPCAlZCAhPCAlZCIsCi0JCSAgICBvbWluLCBvbmJpdHMsIG9tYXgpOwotCi0JLyogQ29udGFjdCBwcml2aWxlZ2VkIHBhcmVudCAqLwotCWRoID0gUFJJVlNFUChjaG9vc2VfZGgobWluLCBuYml0cywgbWF4KSk7Ci0JaWYgKGRoID09IE5VTEwpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJQcm90b2NvbCBlcnJvcjogbm8gbWF0Y2hpbmcgREggZ3JwIGZvdW5kIik7Ci0KLQlkZWJ1ZygiU1NIMl9NU0dfS0VYX0RIX0dFWF9HUk9VUCBzZW50Iik7Ci0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0tFWF9ESF9HRVhfR1JPVVApOwotCXBhY2tldF9wdXRfYmlnbnVtMihkaC0+cCk7Ci0JcGFja2V0X3B1dF9iaWdudW0yKGRoLT5nKTsKLQlwYWNrZXRfc2VuZCgpOwotCi0JLyogZmx1c2ggKi8KLQlwYWNrZXRfd3JpdGVfd2FpdCgpOwotCi0JLyogQ29tcHV0ZSBvdXIgZXhjaGFuZ2UgdmFsdWUgaW4gcGFyYWxsZWwgd2l0aCB0aGUgY2xpZW50ICovCi0JZGhfZ2VuX2tleShkaCwga2V4LT53ZV9uZWVkICogOCk7Ci0KLQlkZWJ1ZygiZXhwZWN0aW5nIFNTSDJfTVNHX0tFWF9ESF9HRVhfSU5JVCIpOwotCXBhY2tldF9yZWFkX2V4cGVjdChTU0gyX01TR19LRVhfREhfR0VYX0lOSVQpOwotCi0JLyoga2V5LCBjZXJ0ICovCi0JaWYgKChkaF9jbGllbnRfcHViID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJkaF9jbGllbnRfcHViID09IE5VTEwiKTsKLQlwYWNrZXRfZ2V0X2JpZ251bTIoZGhfY2xpZW50X3B1Yik7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0jaWZkZWYgREVCVUdfS0VYREgKLQlmcHJpbnRmKHN0ZGVyciwgImRoX2NsaWVudF9wdWI9ICIpOwotCUJOX3ByaW50X2ZwKHN0ZGVyciwgZGhfY2xpZW50X3B1Yik7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotCWRlYnVnKCJiaXRzICVkIiwgQk5fbnVtX2JpdHMoZGhfY2xpZW50X3B1YikpOwotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19LRVhESAotCURIcGFyYW1zX3ByaW50X2ZwKHN0ZGVyciwgZGgpOwotCWZwcmludGYoc3RkZXJyLCAicHViPSAiKTsKLQlCTl9wcmludF9mcChzdGRlcnIsIGRoLT5wdWJfa2V5KTsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQlpZiAoIWRoX3B1Yl9pc192YWxpZChkaCwgZGhfY2xpZW50X3B1YikpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJiYWQgY2xpZW50IHB1YmxpYyBESCB2YWx1ZSIpOwotCi0Ja2xlbiA9IERIX3NpemUoZGgpOwotCWtidWYgPSB4bWFsbG9jKGtsZW4pOwotCWlmICgoa291dCA9IERIX2NvbXB1dGVfa2V5KGtidWYsIGRoX2NsaWVudF9wdWIsIGRoKSkgPCAwKQotCQlmYXRhbCgiREhfY29tcHV0ZV9rZXk6IGZhaWxlZCIpOwotI2lmZGVmIERFQlVHX0tFWERICi0JZHVtcF9kaWdlc3QoInNoYXJlZCBzZWNyZXQiLCBrYnVmLCBrb3V0KTsKLSNlbmRpZgotCWlmICgoc2hhcmVkX3NlY3JldCA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgia2V4Z2V4X3NlcnZlcjogQk5fbmV3IGZhaWxlZCIpOwotCWlmIChCTl9iaW4yYm4oa2J1Ziwga291dCwgc2hhcmVkX3NlY3JldCkgPT0gTlVMTCkKLQkJZmF0YWwoImtleGdleF9zZXJ2ZXI6IEJOX2JpbjJibiBmYWlsZWQiKTsKLQltZW1zZXQoa2J1ZiwgMCwga2xlbik7Ci0JeGZyZWUoa2J1Zik7Ci0KLQlrZXlfdG9fYmxvYihzZXJ2ZXJfaG9zdF9wdWJsaWMsICZzZXJ2ZXJfaG9zdF9rZXlfYmxvYiwgJnNibG9ibGVuKTsKLQotCWlmICh0eXBlID09IFNTSDJfTVNHX0tFWF9ESF9HRVhfUkVRVUVTVF9PTEQpCi0JCW9taW4gPSBtaW4gPSBvbWF4ID0gbWF4ID0gLTE7Ci0KLQkvKiBjYWxjIEggKi8KLQlrZXhnZXhfaGFzaCgKLQkgICAga2V4LT5ldnBfbWQsCi0JICAgIGtleC0+Y2xpZW50X3ZlcnNpb25fc3RyaW5nLAotCSAgICBrZXgtPnNlcnZlcl92ZXJzaW9uX3N0cmluZywKLQkgICAgYnVmZmVyX3B0cigma2V4LT5wZWVyKSwgYnVmZmVyX2xlbigma2V4LT5wZWVyKSwKLQkgICAgYnVmZmVyX3B0cigma2V4LT5teSksIGJ1ZmZlcl9sZW4oJmtleC0+bXkpLAotCSAgICBzZXJ2ZXJfaG9zdF9rZXlfYmxvYiwgc2Jsb2JsZW4sCi0JICAgIG9taW4sIG9uYml0cywgb21heCwKLQkgICAgZGgtPnAsIGRoLT5nLAotCSAgICBkaF9jbGllbnRfcHViLAotCSAgICBkaC0+cHViX2tleSwKLQkgICAgc2hhcmVkX3NlY3JldCwKLQkgICAgJmhhc2gsICZoYXNobGVuCi0JKTsKLQlCTl9jbGVhcl9mcmVlKGRoX2NsaWVudF9wdWIpOwotCi0JLyogc2F2ZSBzZXNzaW9uIGlkIDo9IEggKi8KLQlpZiAoa2V4LT5zZXNzaW9uX2lkID09IE5VTEwpIHsKLQkJa2V4LT5zZXNzaW9uX2lkX2xlbiA9IGhhc2hsZW47Ci0JCWtleC0+c2Vzc2lvbl9pZCA9IHhtYWxsb2Moa2V4LT5zZXNzaW9uX2lkX2xlbik7Ci0JCW1lbWNweShrZXgtPnNlc3Npb25faWQsIGhhc2gsIGtleC0+c2Vzc2lvbl9pZF9sZW4pOwotCX0KLQotCS8qIHNpZ24gSCAqLwotCWlmIChQUklWU0VQKGtleV9zaWduKHNlcnZlcl9ob3N0X3ByaXZhdGUsICZzaWduYXR1cmUsICZzbGVuLCBoYXNoLAotCSAgICBoYXNobGVuKSkgPCAwKQotCQlmYXRhbCgia2V4Z2V4X3NlcnZlcjoga2V5X3NpZ24gZmFpbGVkIik7Ci0KLQkvKiBkZXN0cm95X3NlbnNpdGl2ZV9kYXRhKCk7ICovCi0KLQkvKiBzZW5kIHNlcnZlciBob3N0a2V5LCBESCBwdWJrZXkgJ2YnIGFuZCBzaW5nZWQgSCAqLwotCWRlYnVnKCJTU0gyX01TR19LRVhfREhfR0VYX1JFUExZIHNlbnQiKTsKLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVBMWSk7Ci0JcGFja2V0X3B1dF9zdHJpbmcoc2VydmVyX2hvc3Rfa2V5X2Jsb2IsIHNibG9ibGVuKTsKLQlwYWNrZXRfcHV0X2JpZ251bTIoZGgtPnB1Yl9rZXkpOwkvKiBmICovCi0JcGFja2V0X3B1dF9zdHJpbmcoc2lnbmF0dXJlLCBzbGVuKTsKLQlwYWNrZXRfc2VuZCgpOwotCi0JeGZyZWUoc2lnbmF0dXJlKTsKLQl4ZnJlZShzZXJ2ZXJfaG9zdF9rZXlfYmxvYik7Ci0JLyogaGF2ZSBrZXlzLCBmcmVlIERIICovCi0JREhfZnJlZShkaCk7Ci0KLQlrZXhfZGVyaXZlX2tleXMoa2V4LCBoYXNoLCBoYXNobGVuLCBzaGFyZWRfc2VjcmV0KTsKLQlCTl9jbGVhcl9mcmVlKHNoYXJlZF9zZWNyZXQpOwotCi0Ja2V4X2ZpbmlzaChrZXgpOwotfQpkaWZmIC0tZ2l0IGEva2V5LmMgYi9rZXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4Y2Y1YS4uMDAwMDAwMAotLS0gYS9rZXkuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNzMgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGtleS5jLHYgMS45NyAyMDExLzA1LzE3IDA3OjEzOjMxIGRqbSBFeHAgJCAqLwotLyoKLSAqIHJlYWRfYmlnbnVtKCk6Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwOCBBbGV4YW5kZXIgdm9uIEdlcm5sZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLSNpbmNsdWRlIDxvcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJyc2EuaCIKLSNpbmNsdWRlICJ1dWVuY29kZS5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgS2V5Q2VydCAqCi1jZXJ0X25ldyh2b2lkKQotewotCXN0cnVjdCBLZXlDZXJ0ICpjZXJ0OwotCi0JY2VydCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpjZXJ0KSk7Ci0JYnVmZmVyX2luaXQoJmNlcnQtPmNlcnRibG9iKTsKLQlidWZmZXJfaW5pdCgmY2VydC0+Y3JpdGljYWwpOwotCWJ1ZmZlcl9pbml0KCZjZXJ0LT5leHRlbnNpb25zKTsKLQljZXJ0LT5rZXlfaWQgPSBOVUxMOwotCWNlcnQtPnByaW5jaXBhbHMgPSBOVUxMOwotCWNlcnQtPnNpZ25hdHVyZV9rZXkgPSBOVUxMOwotCXJldHVybiBjZXJ0OwotfQotCi1LZXkgKgota2V5X25ldyhpbnQgdHlwZSkKLXsKLQlLZXkgKms7Ci0JUlNBICpyc2E7Ci0JRFNBICpkc2E7Ci0JayA9IHhjYWxsb2MoMSwgc2l6ZW9mKCprKSk7Ci0Jay0+dHlwZSA9IHR5cGU7Ci0Jay0+ZWNkc2EgPSBOVUxMOwotCWstPmVjZHNhX25pZCA9IC0xOwotCWstPmRzYSA9IE5VTEw7Ci0Jay0+cnNhID0gTlVMTDsKLQlrLT5jZXJ0ID0gTlVMTDsKLQlzd2l0Y2ggKGstPnR5cGUpIHsKLQljYXNlIEtFWV9SU0ExOgotCWNhc2UgS0VZX1JTQToKLQljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6Ci0JY2FzZSBLRVlfUlNBX0NFUlQ6Ci0JCWlmICgocnNhID0gUlNBX25ldygpKSA9PSBOVUxMKQotCQkJZmF0YWwoImtleV9uZXc6IFJTQV9uZXcgZmFpbGVkIik7Ci0JCWlmICgocnNhLT5uID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCQlmYXRhbCgia2V5X25ldzogQk5fbmV3IGZhaWxlZCIpOwotCQlpZiAoKHJzYS0+ZSA9IEJOX25ldygpKSA9PSBOVUxMKQotCQkJZmF0YWwoImtleV9uZXc6IEJOX25ldyBmYWlsZWQiKTsKLQkJay0+cnNhID0gcnNhOwotCQlicmVhazsKLQljYXNlIEtFWV9EU0E6Ci0JY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX0RTQV9DRVJUOgotCQlpZiAoKGRzYSA9IERTQV9uZXcoKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCJrZXlfbmV3OiBEU0FfbmV3IGZhaWxlZCIpOwotCQlpZiAoKGRzYS0+cCA9IEJOX25ldygpKSA9PSBOVUxMKQotCQkJZmF0YWwoImtleV9uZXc6IEJOX25ldyBmYWlsZWQiKTsKLQkJaWYgKChkc2EtPnEgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCJrZXlfbmV3OiBCTl9uZXcgZmFpbGVkIik7Ci0JCWlmICgoZHNhLT5nID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCQlmYXRhbCgia2V5X25ldzogQk5fbmV3IGZhaWxlZCIpOwotCQlpZiAoKGRzYS0+cHViX2tleSA9IEJOX25ldygpKSA9PSBOVUxMKQotCQkJZmF0YWwoImtleV9uZXc6IEJOX25ldyBmYWlsZWQiKTsKLQkJay0+ZHNhID0gZHNhOwotCQlicmVhazsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQljYXNlIEtFWV9FQ0RTQToKLQljYXNlIEtFWV9FQ0RTQV9DRVJUOgotCQkvKiBDYW5ub3QgZG8gYW55dGhpbmcgdW50aWwgd2Uga25vdyB0aGUgZ3JvdXAgKi8KLQkJYnJlYWs7Ci0jZW5kaWYKLQljYXNlIEtFWV9VTlNQRUM6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZhdGFsKCJrZXlfbmV3OiBiYWQga2V5IHR5cGUgJWQiLCBrLT50eXBlKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGtleV9pc19jZXJ0KGspKQotCQlrLT5jZXJ0ID0gY2VydF9uZXcoKTsKLQotCXJldHVybiBrOwotfQotCi12b2lkCi1rZXlfYWRkX3ByaXZhdGUoS2V5ICprKQotewotCXN3aXRjaCAoay0+dHlwZSkgewotCWNhc2UgS0VZX1JTQTE6Ci0JY2FzZSBLRVlfUlNBOgotCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9SU0FfQ0VSVDoKLQkJaWYgKChrLT5yc2EtPmQgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCJrZXlfbmV3X3ByaXZhdGU6IEJOX25ldyBmYWlsZWQiKTsKLQkJaWYgKChrLT5yc2EtPmlxbXAgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCJrZXlfbmV3X3ByaXZhdGU6IEJOX25ldyBmYWlsZWQiKTsKLQkJaWYgKChrLT5yc2EtPnEgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCJrZXlfbmV3X3ByaXZhdGU6IEJOX25ldyBmYWlsZWQiKTsKLQkJaWYgKChrLT5yc2EtPnAgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCJrZXlfbmV3X3ByaXZhdGU6IEJOX25ldyBmYWlsZWQiKTsKLQkJaWYgKChrLT5yc2EtPmRtcTEgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCJrZXlfbmV3X3ByaXZhdGU6IEJOX25ldyBmYWlsZWQiKTsKLQkJaWYgKChrLT5yc2EtPmRtcDEgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCJrZXlfbmV3X3ByaXZhdGU6IEJOX25ldyBmYWlsZWQiKTsKLQkJYnJlYWs7Ci0JY2FzZSBLRVlfRFNBOgotCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9EU0FfQ0VSVDoKLQkJaWYgKChrLT5kc2EtPnByaXZfa2V5ID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCQlmYXRhbCgia2V5X25ld19wcml2YXRlOiBCTl9uZXcgZmFpbGVkIik7Ci0JCWJyZWFrOwotCWNhc2UgS0VZX0VDRFNBOgotCWNhc2UgS0VZX0VDRFNBX0NFUlQ6Ci0JCS8qIENhbm5vdCBkbyBhbnl0aGluZyB1bnRpbCB3ZSBrbm93IHRoZSBncm91cCAqLwotCQlicmVhazsKLQljYXNlIEtFWV9VTlNQRUM6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLX0KLQotS2V5ICoKLWtleV9uZXdfcHJpdmF0ZShpbnQgdHlwZSkKLXsKLQlLZXkgKmsgPSBrZXlfbmV3KHR5cGUpOwotCi0Ja2V5X2FkZF9wcml2YXRlKGspOwotCXJldHVybiBrOwotfQotCi1zdGF0aWMgdm9pZAotY2VydF9mcmVlKHN0cnVjdCBLZXlDZXJ0ICpjZXJ0KQotewotCXVfaW50IGk7Ci0KLQlidWZmZXJfZnJlZSgmY2VydC0+Y2VydGJsb2IpOwotCWJ1ZmZlcl9mcmVlKCZjZXJ0LT5jcml0aWNhbCk7Ci0JYnVmZmVyX2ZyZWUoJmNlcnQtPmV4dGVuc2lvbnMpOwotCWlmIChjZXJ0LT5rZXlfaWQgIT0gTlVMTCkKLQkJeGZyZWUoY2VydC0+a2V5X2lkKTsKLQlmb3IgKGkgPSAwOyBpIDwgY2VydC0+bnByaW5jaXBhbHM7IGkrKykKLQkJeGZyZWUoY2VydC0+cHJpbmNpcGFsc1tpXSk7Ci0JaWYgKGNlcnQtPnByaW5jaXBhbHMgIT0gTlVMTCkKLQkJeGZyZWUoY2VydC0+cHJpbmNpcGFscyk7Ci0JaWYgKGNlcnQtPnNpZ25hdHVyZV9rZXkgIT0gTlVMTCkKLQkJa2V5X2ZyZWUoY2VydC0+c2lnbmF0dXJlX2tleSk7Ci19Ci0KLXZvaWQKLWtleV9mcmVlKEtleSAqaykKLXsKLQlpZiAoayA9PSBOVUxMKQotCQlmYXRhbCgia2V5X2ZyZWU6IGtleSBpcyBOVUxMIik7Ci0Jc3dpdGNoIChrLT50eXBlKSB7Ci0JY2FzZSBLRVlfUlNBMToKLQljYXNlIEtFWV9SU0E6Ci0JY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX1JTQV9DRVJUOgotCQlpZiAoay0+cnNhICE9IE5VTEwpCi0JCQlSU0FfZnJlZShrLT5yc2EpOwotCQlrLT5yc2EgPSBOVUxMOwotCQlicmVhazsKLQljYXNlIEtFWV9EU0E6Ci0JY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX0RTQV9DRVJUOgotCQlpZiAoay0+ZHNhICE9IE5VTEwpCi0JCQlEU0FfZnJlZShrLT5kc2EpOwotCQlrLT5kc2EgPSBOVUxMOwotCQlicmVhazsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQljYXNlIEtFWV9FQ0RTQToKLQljYXNlIEtFWV9FQ0RTQV9DRVJUOgotCQlpZiAoay0+ZWNkc2EgIT0gTlVMTCkKLQkJCUVDX0tFWV9mcmVlKGstPmVjZHNhKTsKLQkJay0+ZWNkc2EgPSBOVUxMOwotCQlicmVhazsKLSNlbmRpZgotCWNhc2UgS0VZX1VOU1BFQzoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmF0YWwoImtleV9mcmVlOiBiYWQga2V5IHR5cGUgJWQiLCBrLT50eXBlKTsKLQkJYnJlYWs7Ci0JfQotCWlmIChrZXlfaXNfY2VydChrKSkgewotCQlpZiAoay0+Y2VydCAhPSBOVUxMKQotCQkJY2VydF9mcmVlKGstPmNlcnQpOwotCQlrLT5jZXJ0ID0gTlVMTDsKLQl9Ci0KLQl4ZnJlZShrKTsKLX0KLQotc3RhdGljIGludAotY2VydF9jb21wYXJlKHN0cnVjdCBLZXlDZXJ0ICphLCBzdHJ1Y3QgS2V5Q2VydCAqYikKLXsKLQlpZiAoYSA9PSBOVUxMICYmIGIgPT0gTlVMTCkKLQkJcmV0dXJuIDE7Ci0JaWYgKGEgPT0gTlVMTCB8fCBiID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmIChidWZmZXJfbGVuKCZhLT5jZXJ0YmxvYikgIT0gYnVmZmVyX2xlbigmYi0+Y2VydGJsb2IpKQotCQlyZXR1cm4gMDsKLQlpZiAodGltaW5nc2FmZV9iY21wKGJ1ZmZlcl9wdHIoJmEtPmNlcnRibG9iKSwgYnVmZmVyX3B0cigmYi0+Y2VydGJsb2IpLAotCSAgICBidWZmZXJfbGVuKCZhLT5jZXJ0YmxvYikpICE9IDApCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCi0vKgotICogQ29tcGFyZSBwdWJsaWMgcG9ydGlvbnMgb2Yga2V5IG9ubHksIGFsbG93aW5nIGNvbXBhcmlzb25zIGJldHdlZW4KLSAqIGNlcnRpZmljYXRlcyBhbmQgcGxhaW4ga2V5cyB0b28uCi0gKi8KLWludAota2V5X2VxdWFsX3B1YmxpYyhjb25zdCBLZXkgKmEsIGNvbnN0IEtleSAqYikKLXsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQlCTl9DVFggKmJuY3R4OwotI2VuZGlmCi0KLQlpZiAoYSA9PSBOVUxMIHx8IGIgPT0gTlVMTCB8fAotCSAgICBrZXlfdHlwZV9wbGFpbihhLT50eXBlKSAhPSBrZXlfdHlwZV9wbGFpbihiLT50eXBlKSkKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2ggKGEtPnR5cGUpIHsKLQljYXNlIEtFWV9SU0ExOgotCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9SU0FfQ0VSVDoKLQljYXNlIEtFWV9SU0E6Ci0JCXJldHVybiBhLT5yc2EgIT0gTlVMTCAmJiBiLT5yc2EgIT0gTlVMTCAmJgotCQkgICAgQk5fY21wKGEtPnJzYS0+ZSwgYi0+cnNhLT5lKSA9PSAwICYmCi0JCSAgICBCTl9jbXAoYS0+cnNhLT5uLCBiLT5yc2EtPm4pID09IDA7Ci0JY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX0RTQV9DRVJUOgotCWNhc2UgS0VZX0RTQToKLQkJcmV0dXJuIGEtPmRzYSAhPSBOVUxMICYmIGItPmRzYSAhPSBOVUxMICYmCi0JCSAgICBCTl9jbXAoYS0+ZHNhLT5wLCBiLT5kc2EtPnApID09IDAgJiYKLQkJICAgIEJOX2NtcChhLT5kc2EtPnEsIGItPmRzYS0+cSkgPT0gMCAmJgotCQkgICAgQk5fY21wKGEtPmRzYS0+ZywgYi0+ZHNhLT5nKSA9PSAwICYmCi0JCSAgICBCTl9jbXAoYS0+ZHNhLT5wdWJfa2V5LCBiLT5kc2EtPnB1Yl9rZXkpID09IDA7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JY2FzZSBLRVlfRUNEU0FfQ0VSVDoKLQljYXNlIEtFWV9FQ0RTQToKLQkJaWYgKGEtPmVjZHNhID09IE5VTEwgfHwgYi0+ZWNkc2EgPT0gTlVMTCB8fAotCQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShhLT5lY2RzYSkgPT0gTlVMTCB8fAotCQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShiLT5lY2RzYSkgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCQlpZiAoKGJuY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKQotCQkJZmF0YWwoIiVzOiBCTl9DVFhfbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJaWYgKEVDX0dST1VQX2NtcChFQ19LRVlfZ2V0MF9ncm91cChhLT5lY2RzYSksCi0JCSAgICBFQ19LRVlfZ2V0MF9ncm91cChiLT5lY2RzYSksIGJuY3R4KSAhPSAwIHx8Ci0JCSAgICBFQ19QT0lOVF9jbXAoRUNfS0VZX2dldDBfZ3JvdXAoYS0+ZWNkc2EpLAotCQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShhLT5lY2RzYSksCi0JCSAgICBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGItPmVjZHNhKSwgYm5jdHgpICE9IDApIHsKLQkJCUJOX0NUWF9mcmVlKGJuY3R4KTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCUJOX0NUWF9mcmVlKGJuY3R4KTsKLQkJcmV0dXJuIDE7Ci0jZW5kaWYgLyogT1BFTlNTTF9IQVNfRUNDICovCi0JZGVmYXVsdDoKLQkJZmF0YWwoImtleV9lcXVhbDogYmFkIGtleSB0eXBlICVkIiwgYS0+dHlwZSk7Ci0JfQotCS8qIE5PVFJFQUNIRUQgKi8KLX0KLQotaW50Ci1rZXlfZXF1YWwoY29uc3QgS2V5ICphLCBjb25zdCBLZXkgKmIpCi17Ci0JaWYgKGEgPT0gTlVMTCB8fCBiID09IE5VTEwgfHwgYS0+dHlwZSAhPSBiLT50eXBlKQotCQlyZXR1cm4gMDsKLQlpZiAoa2V5X2lzX2NlcnQoYSkpIHsKLQkJaWYgKCFjZXJ0X2NvbXBhcmUoYS0+Y2VydCwgYi0+Y2VydCkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIGtleV9lcXVhbF9wdWJsaWMoYSwgYik7Ci19Ci0KLXVfY2hhcioKLWtleV9maW5nZXJwcmludF9yYXcoS2V5ICprLCBlbnVtIGZwX3R5cGUgZGdzdF90eXBlLCB1X2ludCAqZGdzdF9yYXdfbGVuZ3RoKQotewotCWNvbnN0IEVWUF9NRCAqbWQgPSBOVUxMOwotCUVWUF9NRF9DVFggY3R4OwotCXVfY2hhciAqYmxvYiA9IE5VTEw7Ci0JdV9jaGFyICpyZXR2YWwgPSBOVUxMOwotCXVfaW50IGxlbiA9IDA7Ci0JaW50IG5sZW4sIGVsZW4sIG90eXBlOwotCi0JKmRnc3RfcmF3X2xlbmd0aCA9IDA7Ci0KLQlzd2l0Y2ggKGRnc3RfdHlwZSkgewotCWNhc2UgU1NIX0ZQX01ENToKLQkJbWQgPSBFVlBfbWQ1KCk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIX0ZQX1NIQTE6Ci0JCW1kID0gRVZQX3NoYTEoKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmF0YWwoImtleV9maW5nZXJwcmludF9yYXc6IGJhZCBkaWdlc3QgdHlwZSAlZCIsCi0JCSAgICBkZ3N0X3R5cGUpOwotCX0KLQlzd2l0Y2ggKGstPnR5cGUpIHsKLQljYXNlIEtFWV9SU0ExOgotCQlubGVuID0gQk5fbnVtX2J5dGVzKGstPnJzYS0+bik7Ci0JCWVsZW4gPSBCTl9udW1fYnl0ZXMoay0+cnNhLT5lKTsKLQkJbGVuID0gbmxlbiArIGVsZW47Ci0JCWJsb2IgPSB4bWFsbG9jKGxlbik7Ci0JCUJOX2JuMmJpbihrLT5yc2EtPm4sIGJsb2IpOwotCQlCTl9ibjJiaW4oay0+cnNhLT5lLCBibG9iICsgbmxlbik7Ci0JCWJyZWFrOwotCWNhc2UgS0VZX0RTQToKLQljYXNlIEtFWV9FQ0RTQToKLQljYXNlIEtFWV9SU0E6Ci0JCWtleV90b19ibG9iKGssICZibG9iLCAmbGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9EU0FfQ0VSVDoKLQljYXNlIEtFWV9FQ0RTQV9DRVJUOgotCWNhc2UgS0VZX1JTQV9DRVJUOgotCQkvKiBXZSB3YW50IGEgZmluZ2VycHJpbnQgb2YgdGhlIF9rZXlfIG5vdCBvZiB0aGUgY2VydCAqLwotCQlvdHlwZSA9IGstPnR5cGU7Ci0JCWstPnR5cGUgPSBrZXlfdHlwZV9wbGFpbihrLT50eXBlKTsKLQkJa2V5X3RvX2Jsb2IoaywgJmJsb2IsICZsZW4pOwotCQlrLT50eXBlID0gb3R5cGU7Ci0JCWJyZWFrOwotCWNhc2UgS0VZX1VOU1BFQzoKLQkJcmV0dXJuIHJldHZhbDsKLQlkZWZhdWx0OgotCQlmYXRhbCgia2V5X2ZpbmdlcnByaW50X3JhdzogYmFkIGtleSB0eXBlICVkIiwgay0+dHlwZSk7Ci0JCWJyZWFrOwotCX0KLQlpZiAoYmxvYiAhPSBOVUxMKSB7Ci0JCXJldHZhbCA9IHhtYWxsb2MoRVZQX01BWF9NRF9TSVpFKTsKLQkJRVZQX0RpZ2VzdEluaXQoJmN0eCwgbWQpOwotCQlFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIGJsb2IsIGxlbik7Ci0JCUVWUF9EaWdlc3RGaW5hbCgmY3R4LCByZXR2YWwsIGRnc3RfcmF3X2xlbmd0aCk7Ci0JCW1lbXNldChibG9iLCAwLCBsZW4pOwotCQl4ZnJlZShibG9iKTsKLQl9IGVsc2UgewotCQlmYXRhbCgia2V5X2ZpbmdlcnByaW50X3JhdzogYmxvYiBpcyBudWxsIik7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWtleV9maW5nZXJwcmludF9oZXgodV9jaGFyICpkZ3N0X3JhdywgdV9pbnQgZGdzdF9yYXdfbGVuKQotewotCWNoYXIgKnJldHZhbDsKLQl1X2ludCBpOwotCi0JcmV0dmFsID0geGNhbGxvYygxLCBkZ3N0X3Jhd19sZW4gKiAzICsgMSk7Ci0JZm9yIChpID0gMDsgaSA8IGRnc3RfcmF3X2xlbjsgaSsrKSB7Ci0JCWNoYXIgaGV4WzRdOwotCQlzbnByaW50ZihoZXgsIHNpemVvZihoZXgpLCAiJTAyeDoiLCBkZ3N0X3Jhd1tpXSk7Ci0JCXN0cmxjYXQocmV0dmFsLCBoZXgsIGRnc3RfcmF3X2xlbiAqIDMgKyAxKTsKLQl9Ci0KLQkvKiBSZW1vdmUgdGhlIHRyYWlsaW5nICc6JyBjaGFyYWN0ZXIgKi8KLQlyZXR2YWxbKGRnc3RfcmF3X2xlbiAqIDMpIC0gMV0gPSAnXDAnOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWtleV9maW5nZXJwcmludF9idWJibGViYWJibGUodV9jaGFyICpkZ3N0X3JhdywgdV9pbnQgZGdzdF9yYXdfbGVuKQotewotCWNoYXIgdm93ZWxzW10gPSB7ICdhJywgJ2UnLCAnaScsICdvJywgJ3UnLCAneScgfTsKLQljaGFyIGNvbnNvbmFudHNbXSA9IHsgJ2InLCAnYycsICdkJywgJ2YnLCAnZycsICdoJywgJ2snLCAnbCcsICdtJywKLQkgICAgJ24nLCAncCcsICdyJywgJ3MnLCAndCcsICd2JywgJ3onLCAneCcgfTsKLQl1X2ludCBpLCBqID0gMCwgcm91bmRzLCBzZWVkID0gMTsKLQljaGFyICpyZXR2YWw7Ci0KLQlyb3VuZHMgPSAoZGdzdF9yYXdfbGVuIC8gMikgKyAxOwotCXJldHZhbCA9IHhjYWxsb2MoKHJvdW5kcyAqIDYpLCBzaXplb2YoY2hhcikpOwotCXJldHZhbFtqKytdID0gJ3gnOwotCWZvciAoaSA9IDA7IGkgPCByb3VuZHM7IGkrKykgewotCQl1X2ludCBpZHgwLCBpZHgxLCBpZHgyLCBpZHgzLCBpZHg0OwotCQlpZiAoKGkgKyAxIDwgcm91bmRzKSB8fCAoZGdzdF9yYXdfbGVuICUgMiAhPSAwKSkgewotCQkJaWR4MCA9ICgoKCgodV9pbnQpKGRnc3RfcmF3WzIgKiBpXSkpID4+IDYpICYgMykgKwotCQkJICAgIHNlZWQpICUgNjsKLQkJCWlkeDEgPSAoKCh1X2ludCkoZGdzdF9yYXdbMiAqIGldKSkgPj4gMikgJiAxNTsKLQkJCWlkeDIgPSAoKCgodV9pbnQpKGRnc3RfcmF3WzIgKiBpXSkpICYgMykgKwotCQkJICAgIChzZWVkIC8gNikpICUgNjsKLQkJCXJldHZhbFtqKytdID0gdm93ZWxzW2lkeDBdOwotCQkJcmV0dmFsW2orK10gPSBjb25zb25hbnRzW2lkeDFdOwotCQkJcmV0dmFsW2orK10gPSB2b3dlbHNbaWR4Ml07Ci0JCQlpZiAoKGkgKyAxKSA8IHJvdW5kcykgewotCQkJCWlkeDMgPSAoKCh1X2ludCkoZGdzdF9yYXdbKDIgKiBpKSArIDFdKSkgPj4gNCkgJiAxNTsKLQkJCQlpZHg0ID0gKCgodV9pbnQpKGRnc3RfcmF3WygyICogaSkgKyAxXSkpKSAmIDE1OwotCQkJCXJldHZhbFtqKytdID0gY29uc29uYW50c1tpZHgzXTsKLQkJCQlyZXR2YWxbaisrXSA9ICctJzsKLQkJCQlyZXR2YWxbaisrXSA9IGNvbnNvbmFudHNbaWR4NF07Ci0JCQkJc2VlZCA9ICgoc2VlZCAqIDUpICsKLQkJCQkgICAgKCgoKHVfaW50KShkZ3N0X3Jhd1syICogaV0pKSAqIDcpICsKLQkJCQkgICAgKCh1X2ludCkoZGdzdF9yYXdbKDIgKiBpKSArIDFdKSkpKSAlIDM2OwotCQkJfQotCQl9IGVsc2UgewotCQkJaWR4MCA9IHNlZWQgJSA2OwotCQkJaWR4MSA9IDE2OwotCQkJaWR4MiA9IHNlZWQgLyA2OwotCQkJcmV0dmFsW2orK10gPSB2b3dlbHNbaWR4MF07Ci0JCQlyZXR2YWxbaisrXSA9IGNvbnNvbmFudHNbaWR4MV07Ci0JCQlyZXR2YWxbaisrXSA9IHZvd2Vsc1tpZHgyXTsKLQkJfQotCX0KLQlyZXR2YWxbaisrXSA9ICd4JzsKLQlyZXR2YWxbaisrXSA9ICdcMCc7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoKLSAqIERyYXcgYW4gQVNDSUktQXJ0IHJlcHJlc2VudGluZyB0aGUgZmluZ2VycHJpbnQgc28gaHVtYW4gYnJhaW4gY2FuCi0gKiBwcm9maXQgZnJvbSBpdHMgYnVpbHQtaW4gcGF0dGVybiByZWNvZ25pdGlvbiBhYmlsaXR5LgotICogVGhpcyB0ZWNobmlxdWUgaXMgY2FsbGVkICJyYW5kb20gYXJ0IiBhbmQgY2FuIGJlIGZvdW5kIGluIHNvbWUKLSAqIHNjaWVudGlmaWMgcHVibGljYXRpb25zIGxpa2UgdGhpcyBvcmlnaW5hbCBwYXBlcjoKLSAqCi0gKiAiSGFzaCBWaXN1YWxpemF0aW9uOiBhIE5ldyBUZWNobmlxdWUgdG8gaW1wcm92ZSBSZWFsLVdvcmxkIFNlY3VyaXR5IiwKLSAqIFBlcnJpZyBBLiBhbmQgU29uZyBELiwgMTk5OSwgSW50ZXJuYXRpb25hbCBXb3Jrc2hvcCBvbiBDcnlwdG9ncmFwaGljCi0gKiBUZWNobmlxdWVzIGFuZCBFLUNvbW1lcmNlIChDcnlwVEVDICc5OSkKLSAqIHNwYXJyb3cuZWNlLmNtdS5lZHUvfmFkcmlhbi9wcm9qZWN0cy92YWxpZGF0aW9uL3ZhbGlkYXRpb24ucGRmCi0gKgotICogVGhlIHN1YmplY3QgY2FtZSB1cCBpbiBhIHRhbGsgYnkgRGFuIEthbWluc2t5LCB0b28uCi0gKgotICogSWYgeW91IHNlZSB0aGUgcGljdHVyZSBpcyBkaWZmZXJlbnQsIHRoZSBrZXkgaXMgZGlmZmVyZW50LgotICogSWYgdGhlIHBpY3R1cmUgbG9va3MgdGhlIHNhbWUsIHlvdSBzdGlsbCBrbm93IG5vdGhpbmcuCi0gKgotICogVGhlIGFsZ29yaXRobSB1c2VkIGhlcmUgaXMgYSB3b3JtIGNyYXdsaW5nIG92ZXIgYSBkaXNjcmV0ZSBwbGFuZSwKLSAqIGxlYXZpbmcgYSB0cmFjZSAoYXVnbWVudGluZyB0aGUgZmllbGQpIGV2ZXJ5d2hlcmUgaXQgZ29lcy4KLSAqIE1vdmVtZW50IGlzIHRha2VuIGZyb20gZGdzdF9yYXcgMmJpdC13aXNlLiAgQnVtcGluZyBpbnRvIHdhbGxzCi0gKiBtYWtlcyB0aGUgcmVzcGVjdGl2ZSBtb3ZlbWVudCB2ZWN0b3IgYmUgaWdub3JlZCBmb3IgdGhpcyB0dXJuLgotICogR3JhcGhzIGFyZSBub3QgdW5hbWJpZ3VvdXMsIGJlY2F1c2UgY2lyY2xlcyBpbiBncmFwaHMgY2FuIGJlCi0gKiB3YWxrZWQgaW4gZWl0aGVyIGRpcmVjdGlvbi4KLSAqLwotCi0vKgotICogRmllbGQgc2l6ZXMgZm9yIHRoZSByYW5kb20gYXJ0LiAgSGF2ZSB0byBiZSBvZGQsIHNvIHRoZSBzdGFydGluZyBwb2ludAotICogY2FuIGJlIGluIHRoZSBleGFjdCBtaWRkbGUgb2YgdGhlIHBpY3R1cmUsIGFuZCBGTERCQVNFIHNob3VsZCBiZSA+PTggLgotICogRWxzZSBwaWN0dXJlcyB3b3VsZCBiZSB0b28gZGVuc2UsIGFuZCBkcmF3aW5nIHRoZSBmcmFtZSB3b3VsZAotICogZmFpbCwgdG9vLCBiZWNhdXNlIHRoZSBrZXkgdHlwZSB3b3VsZCBub3QgZml0IGluIGFueW1vcmUuCi0gKi8KLSNkZWZpbmUJRkxEQkFTRQkJOAotI2RlZmluZQlGTERTSVpFX1kJKEZMREJBU0UgKyAxKQotI2RlZmluZQlGTERTSVpFX1gJKEZMREJBU0UgKiAyICsgMSkKLXN0YXRpYyBjaGFyICoKLWtleV9maW5nZXJwcmludF9yYW5kb21hcnQodV9jaGFyICpkZ3N0X3JhdywgdV9pbnQgZGdzdF9yYXdfbGVuLCBjb25zdCBLZXkgKmspCi17Ci0JLyoKLQkgKiBDaGFycyB0byBiZSB1c2VkIGFmdGVyIGVhY2ggb3RoZXIgZXZlcnkgdGltZSB0aGUgd29ybQotCSAqIGludGVyc2VjdHMgd2l0aCBpdHNlbGYuICBNYXR0ZXIgb2YgdGFzdGUuCi0JICovCi0JY2hhcgkqYXVnbWVudGF0aW9uX3N0cmluZyA9ICIgLm8rPSpCT1hAJSYjL15TRSI7Ci0JY2hhcgkqcmV0dmFsLCAqcDsKLQl1X2NoYXIJIGZpZWxkW0ZMRFNJWkVfWF1bRkxEU0laRV9ZXTsKLQl1X2ludAkgaSwgYjsKLQlpbnQJIHgsIHk7Ci0Jc2l6ZV90CSBsZW4gPSBzdHJsZW4oYXVnbWVudGF0aW9uX3N0cmluZykgLSAxOwotCi0JcmV0dmFsID0geGNhbGxvYygxLCAoRkxEU0laRV9YICsgMykgKiAoRkxEU0laRV9ZICsgMikpOwotCi0JLyogaW5pdGlhbGl6ZSBmaWVsZCAqLwotCW1lbXNldChmaWVsZCwgMCwgRkxEU0laRV9YICogRkxEU0laRV9ZICogc2l6ZW9mKGNoYXIpKTsKLQl4ID0gRkxEU0laRV9YIC8gMjsKLQl5ID0gRkxEU0laRV9ZIC8gMjsKLQotCS8qIHByb2Nlc3MgcmF3IGtleSAqLwotCWZvciAoaSA9IDA7IGkgPCBkZ3N0X3Jhd19sZW47IGkrKykgewotCQlpbnQgaW5wdXQ7Ci0JCS8qIGVhY2ggYnl0ZSBjb252ZXlzIGZvdXIgMi1iaXQgbW92ZSBjb21tYW5kcyAqLwotCQlpbnB1dCA9IGRnc3RfcmF3W2ldOwotCQlmb3IgKGIgPSAwOyBiIDwgNDsgYisrKSB7Ci0JCQkvKiBldmFsdWF0ZSAyIGJpdCwgcmVzdCBpcyBzaGlmdGVkIGxhdGVyICovCi0JCQl4ICs9IChpbnB1dCAmIDB4MSkgPyAxIDogLTE7Ci0JCQl5ICs9IChpbnB1dCAmIDB4MikgPyAxIDogLTE7Ci0KLQkJCS8qIGFzc3VyZSB3ZSBhcmUgc3RpbGwgaW4gYm91bmRzICovCi0JCQl4ID0gTUFYKHgsIDApOwotCQkJeSA9IE1BWCh5LCAwKTsKLQkJCXggPSBNSU4oeCwgRkxEU0laRV9YIC0gMSk7Ci0JCQl5ID0gTUlOKHksIEZMRFNJWkVfWSAtIDEpOwotCi0JCQkvKiBhdWdtZW50IHRoZSBmaWVsZCAqLwotCQkJaWYgKGZpZWxkW3hdW3ldIDwgbGVuIC0gMikKLQkJCQlmaWVsZFt4XVt5XSsrOwotCQkJaW5wdXQgPSBpbnB1dCA+PiAyOwotCQl9Ci0JfQotCi0JLyogbWFyayBzdGFydGluZyBwb2ludCBhbmQgZW5kIHBvaW50Ki8KLQlmaWVsZFtGTERTSVpFX1ggLyAyXVtGTERTSVpFX1kgLyAyXSA9IGxlbiAtIDE7Ci0JZmllbGRbeF1beV0gPSBsZW47Ci0KLQkvKiBmaWxsIGluIHJldHZhbCAqLwotCXNucHJpbnRmKHJldHZhbCwgRkxEU0laRV9YLCAiKy0tWyU0cyAlNHVdIiwga2V5X3R5cGUoayksIGtleV9zaXplKGspKTsKLQlwID0gc3RyY2hyKHJldHZhbCwgJ1wwJyk7Ci0KLQkvKiBvdXRwdXQgdXBwZXIgYm9yZGVyICovCi0JZm9yIChpID0gcCAtIHJldHZhbCAtIDE7IGkgPCBGTERTSVpFX1g7IGkrKykKLQkJKnArKyA9ICctJzsKLQkqcCsrID0gJysnOwotCSpwKysgPSAnXG4nOwotCi0JLyogb3V0cHV0IGNvbnRlbnQgKi8KLQlmb3IgKHkgPSAwOyB5IDwgRkxEU0laRV9ZOyB5KyspIHsKLQkJKnArKyA9ICd8JzsKLQkJZm9yICh4ID0gMDsgeCA8IEZMRFNJWkVfWDsgeCsrKQotCQkJKnArKyA9IGF1Z21lbnRhdGlvbl9zdHJpbmdbTUlOKGZpZWxkW3hdW3ldLCBsZW4pXTsKLQkJKnArKyA9ICd8JzsKLQkJKnArKyA9ICdcbic7Ci0JfQotCi0JLyogb3V0cHV0IGxvd2VyIGJvcmRlciAqLwotCSpwKysgPSAnKyc7Ci0JZm9yIChpID0gMDsgaSA8IEZMRFNJWkVfWDsgaSsrKQotCQkqcCsrID0gJy0nOwotCSpwKysgPSAnKyc7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1jaGFyICoKLWtleV9maW5nZXJwcmludChLZXkgKmssIGVudW0gZnBfdHlwZSBkZ3N0X3R5cGUsIGVudW0gZnBfcmVwIGRnc3RfcmVwKQotewotCWNoYXIgKnJldHZhbCA9IE5VTEw7Ci0JdV9jaGFyICpkZ3N0X3JhdzsKLQl1X2ludCBkZ3N0X3Jhd19sZW47Ci0KLQlkZ3N0X3JhdyA9IGtleV9maW5nZXJwcmludF9yYXcoaywgZGdzdF90eXBlLCAmZGdzdF9yYXdfbGVuKTsKLQlpZiAoIWRnc3RfcmF3KQotCQlmYXRhbCgia2V5X2ZpbmdlcnByaW50OiBudWxsIGZyb20ga2V5X2ZpbmdlcnByaW50X3JhdygpIik7Ci0Jc3dpdGNoIChkZ3N0X3JlcCkgewotCWNhc2UgU1NIX0ZQX0hFWDoKLQkJcmV0dmFsID0ga2V5X2ZpbmdlcnByaW50X2hleChkZ3N0X3JhdywgZGdzdF9yYXdfbGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBTU0hfRlBfQlVCQkxFQkFCQkxFOgotCQlyZXR2YWwgPSBrZXlfZmluZ2VycHJpbnRfYnViYmxlYmFiYmxlKGRnc3RfcmF3LCBkZ3N0X3Jhd19sZW4pOwotCQlicmVhazsKLQljYXNlIFNTSF9GUF9SQU5ET01BUlQ6Ci0JCXJldHZhbCA9IGtleV9maW5nZXJwcmludF9yYW5kb21hcnQoZGdzdF9yYXcsIGRnc3RfcmF3X2xlbiwgayk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZhdGFsKCJrZXlfZmluZ2VycHJpbnQ6IGJhZCBkaWdlc3QgcmVwcmVzZW50YXRpb24gJWQiLAotCQkgICAgZGdzdF9yZXApOwotCQlicmVhazsKLQl9Ci0JbWVtc2V0KGRnc3RfcmF3LCAwLCBkZ3N0X3Jhd19sZW4pOwotCXhmcmVlKGRnc3RfcmF3KTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKgotICogUmVhZHMgYSBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBpbiBkZWNpbWFsIGZyb20gdGhlIGJ1ZmZlciwgYW5kIGFkdmFuY2VzCi0gKiB0aGUgcG9pbnRlci4gIFRoZSBpbnRlZ2VyIG11c3QgYWxyZWFkeSBiZSBpbml0aWFsaXplZC4gIFRoaXMgZnVuY3Rpb24gaXMKLSAqIHBlcm1pdHRlZCB0byBtb2RpZnkgdGhlIGJ1ZmZlci4gIFRoaXMgbGVhdmVzICpjcHAgdG8gcG9pbnQganVzdCBiZXlvbmQgdGhlCi0gKiBsYXN0IHByb2Nlc3NlZCAoYW5kIG1heWJlIG1vZGlmaWVkKSBjaGFyYWN0ZXIuICBOb3RlIHRoYXQgdGhpcyBtYXkgbW9kaWZ5Ci0gKiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG51bWJlci4KLSAqLwotc3RhdGljIGludAotcmVhZF9iaWdudW0oY2hhciAqKmNwcCwgQklHTlVNICogdmFsdWUpCi17Ci0JY2hhciAqY3AgPSAqY3BwOwotCWludCBvbGQ7Ci0KLQkvKiBTa2lwIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UuICovCi0JZm9yICg7ICpjcCA9PSAnICcgfHwgKmNwID09ICdcdCc7IGNwKyspCi0JCTsKLQotCS8qIENoZWNrIHRoYXQgaXQgYmVnaW5zIHdpdGggYSBkZWNpbWFsIGRpZ2l0LiAqLwotCWlmICgqY3AgPCAnMCcgfHwgKmNwID4gJzknKQotCQlyZXR1cm4gMDsKLQotCS8qIFNhdmUgc3RhcnRpbmcgcG9zaXRpb24uICovCi0JKmNwcCA9IGNwOwotCi0JLyogTW92ZSBmb3J3YXJkIHVudGlsIGFsbCBkZWNpbWFsIGRpZ2l0cyBza2lwcGVkLiAqLwotCWZvciAoOyAqY3AgPj0gJzAnICYmICpjcCA8PSAnOSc7IGNwKyspCi0JCTsKLQotCS8qIFNhdmUgdGhlIG9sZCB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIsIGFuZCByZXBsYWNlIGl0IGJ5IFwwLiAqLwotCW9sZCA9ICpjcDsKLQkqY3AgPSAwOwotCi0JLyogUGFyc2UgdGhlIG51bWJlci4gKi8KLQlpZiAoQk5fZGVjMmJuKCZ2YWx1ZSwgKmNwcCkgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBSZXN0b3JlIG9sZCB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIuICovCi0JKmNwID0gb2xkOwotCi0JLyogTW92ZSBiZXlvbmQgdGhlIG51bWJlciBhbmQgcmV0dXJuIHN1Y2Nlc3MuICovCi0JKmNwcCA9IGNwOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci13cml0ZV9iaWdudW0oRklMRSAqZiwgQklHTlVNICpudW0pCi17Ci0JY2hhciAqYnVmID0gQk5fYm4yZGVjKG51bSk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCWVycm9yKCJ3cml0ZV9iaWdudW06IEJOX2JuMmRlYygpIGZhaWxlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZnByaW50ZihmLCAiICVzIiwgYnVmKTsKLQlPUEVOU1NMX2ZyZWUoYnVmKTsKLQlyZXR1cm4gMTsKLX0KLQotLyogcmV0dXJucyAxIG9rLCAtMSBlcnJvciAqLwotaW50Ci1rZXlfcmVhZChLZXkgKnJldCwgY2hhciAqKmNwcCkKLXsKLQlLZXkgKms7Ci0JaW50IHN1Y2Nlc3MgPSAtMTsKLQljaGFyICpjcCwgKnNwYWNlOwotCWludCBsZW4sIG4sIHR5cGU7Ci0JdV9pbnQgYml0czsKLQl1X2NoYXIgKmJsb2I7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JaW50IGN1cnZlX25pZCA9IC0xOwotI2VuZGlmCi0KLQljcCA9ICpjcHA7Ci0KLQlzd2l0Y2ggKHJldC0+dHlwZSkgewotCWNhc2UgS0VZX1JTQTE6Ci0JCS8qIEdldCBudW1iZXIgb2YgYml0cy4gKi8KLQkJaWYgKCpjcCA8ICcwJyB8fCAqY3AgPiAnOScpCi0JCQlyZXR1cm4gLTE7CS8qIEJhZCBiaXQgY291bnQuLi4gKi8KLQkJZm9yIChiaXRzID0gMDsgKmNwID49ICcwJyAmJiAqY3AgPD0gJzknOyBjcCsrKQotCQkJYml0cyA9IDEwICogYml0cyArICpjcCAtICcwJzsKLQkJaWYgKGJpdHMgPT0gMCkKLQkJCXJldHVybiAtMTsKLQkJKmNwcCA9IGNwOwotCQkvKiBHZXQgcHVibGljIGV4cG9uZW50LCBwdWJsaWMgbW9kdWx1cy4gKi8KLQkJaWYgKCFyZWFkX2JpZ251bShjcHAsIHJldC0+cnNhLT5lKSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKCFyZWFkX2JpZ251bShjcHAsIHJldC0+cnNhLT5uKSkKLQkJCXJldHVybiAtMTsKLQkJLyogdmFsaWRhdGUgdGhlIGNsYWltZWQgbnVtYmVyIG9mIGJpdHMgKi8KLQkJaWYgKCh1X2ludClCTl9udW1fYml0cyhyZXQtPnJzYS0+bikgIT0gYml0cykgewotCQkJdmVyYm9zZSgia2V5X3JlYWQ6IGNsYWltZWQga2V5IHNpemUgJWQgZG9lcyBub3QgbWF0Y2ggIgotCQkJICAgImFjdHVhbCAlZCIsIGJpdHMsIEJOX251bV9iaXRzKHJldC0+cnNhLT5uKSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc3VjY2VzcyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgS0VZX1VOU1BFQzoKLQljYXNlIEtFWV9SU0E6Ci0JY2FzZSBLRVlfRFNBOgotCWNhc2UgS0VZX0VDRFNBOgotCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6Ci0JY2FzZSBLRVlfRFNBX0NFUlQ6Ci0JY2FzZSBLRVlfRUNEU0FfQ0VSVDoKLQljYXNlIEtFWV9SU0FfQ0VSVDoKLQkJc3BhY2UgPSBzdHJjaHIoY3AsICcgJyk7Ci0JCWlmIChzcGFjZSA9PSBOVUxMKSB7Ci0JCQlkZWJ1ZzMoImtleV9yZWFkOiBtaXNzaW5nIHdoaXRlc3BhY2UiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkqc3BhY2UgPSAnXDAnOwotCQl0eXBlID0ga2V5X3R5cGVfZnJvbV9uYW1lKGNwKTsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQkJaWYgKGtleV90eXBlX3BsYWluKHR5cGUpID09IEtFWV9FQ0RTQSAmJgotCQkgICAgKGN1cnZlX25pZCA9IGtleV9lY2RzYV9uaWRfZnJvbV9uYW1lKGNwKSkgPT0gLTEpIHsKLQkJCWRlYnVnKCJrZXlfcmVhZDogaW52YWxpZCBjdXJ2ZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0jZW5kaWYKLQkJKnNwYWNlID0gJyAnOwotCQlpZiAodHlwZSA9PSBLRVlfVU5TUEVDKSB7Ci0JCQlkZWJ1ZzMoImtleV9yZWFkOiBtaXNzaW5nIGtleXR5cGUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQljcCA9IHNwYWNlKzE7Ci0JCWlmICgqY3AgPT0gJ1wwJykgewotCQkJZGVidWczKCJrZXlfcmVhZDogc2hvcnQgc3RyaW5nIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKHJldC0+dHlwZSA9PSBLRVlfVU5TUEVDKSB7Ci0JCQlyZXQtPnR5cGUgPSB0eXBlOwotCQl9IGVsc2UgaWYgKHJldC0+dHlwZSAhPSB0eXBlKSB7Ci0JCQkvKiBpcyBhIGtleSwgYnV0IGRpZmZlcmVudCB0eXBlICovCi0JCQlkZWJ1ZzMoImtleV9yZWFkOiB0eXBlIG1pc21hdGNoIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbGVuID0gMipzdHJsZW4oY3ApOwotCQlibG9iID0geG1hbGxvYyhsZW4pOwotCQluID0gdXVkZWNvZGUoY3AsIGJsb2IsIGxlbik7Ci0JCWlmIChuIDwgMCkgewotCQkJZXJyb3IoImtleV9yZWFkOiB1dWRlY29kZSAlcyBmYWlsZWQiLCBjcCk7Ci0JCQl4ZnJlZShibG9iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlrID0ga2V5X2Zyb21fYmxvYihibG9iLCAodV9pbnQpbik7Ci0JCXhmcmVlKGJsb2IpOwotCQlpZiAoayA9PSBOVUxMKSB7Ci0JCQllcnJvcigia2V5X3JlYWQ6IGtleV9mcm9tX2Jsb2IgJXMgZmFpbGVkIiwgY3ApOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChrLT50eXBlICE9IHR5cGUpIHsKLQkJCWVycm9yKCJrZXlfcmVhZDogdHlwZSBtaXNtYXRjaDogZW5jb2RpbmcgZXJyb3IiKTsKLQkJCWtleV9mcmVlKGspOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JCWlmIChrZXlfdHlwZV9wbGFpbih0eXBlKSA9PSBLRVlfRUNEU0EgJiYKLQkJICAgIGN1cnZlX25pZCAhPSBrLT5lY2RzYV9uaWQpIHsKLQkJCWVycm9yKCJrZXlfcmVhZDogdHlwZSBtaXNtYXRjaDogRUMgY3VydmUgbWlzbWF0Y2giKTsKLQkJCWtleV9mcmVlKGspOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0jZW5kaWYKLS8qWFhYWCovCi0JCWlmIChrZXlfaXNfY2VydChyZXQpKSB7Ci0JCQlpZiAoIWtleV9pc19jZXJ0KGspKSB7Ci0JCQkJZXJyb3IoImtleV9yZWFkOiBsb2FkZWQga2V5IGlzIG5vdCBhIGNlcnQiKTsKLQkJCQlrZXlfZnJlZShrKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlpZiAocmV0LT5jZXJ0ICE9IE5VTEwpCi0JCQkJY2VydF9mcmVlKHJldC0+Y2VydCk7Ci0JCQlyZXQtPmNlcnQgPSBrLT5jZXJ0OwotCQkJay0+Y2VydCA9IE5VTEw7Ci0JCX0KLQkJaWYgKGtleV90eXBlX3BsYWluKHJldC0+dHlwZSkgPT0gS0VZX1JTQSkgewotCQkJaWYgKHJldC0+cnNhICE9IE5VTEwpCi0JCQkJUlNBX2ZyZWUocmV0LT5yc2EpOwotCQkJcmV0LT5yc2EgPSBrLT5yc2E7Ci0JCQlrLT5yc2EgPSBOVUxMOwotI2lmZGVmIERFQlVHX1BLCi0JCQlSU0FfcHJpbnRfZnAoc3RkZXJyLCByZXQtPnJzYSwgOCk7Ci0jZW5kaWYKLQkJfQotCQlpZiAoa2V5X3R5cGVfcGxhaW4ocmV0LT50eXBlKSA9PSBLRVlfRFNBKSB7Ci0JCQlpZiAocmV0LT5kc2EgIT0gTlVMTCkKLQkJCQlEU0FfZnJlZShyZXQtPmRzYSk7Ci0JCQlyZXQtPmRzYSA9IGstPmRzYTsKLQkJCWstPmRzYSA9IE5VTEw7Ci0jaWZkZWYgREVCVUdfUEsKLQkJCURTQV9wcmludF9mcChzdGRlcnIsIHJldC0+ZHNhLCA4KTsKLSNlbmRpZgotCQl9Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JCWlmIChrZXlfdHlwZV9wbGFpbihyZXQtPnR5cGUpID09IEtFWV9FQ0RTQSkgewotCQkJaWYgKHJldC0+ZWNkc2EgIT0gTlVMTCkKLQkJCQlFQ19LRVlfZnJlZShyZXQtPmVjZHNhKTsKLQkJCXJldC0+ZWNkc2EgPSBrLT5lY2RzYTsKLQkJCXJldC0+ZWNkc2FfbmlkID0gay0+ZWNkc2FfbmlkOwotCQkJay0+ZWNkc2EgPSBOVUxMOwotCQkJay0+ZWNkc2FfbmlkID0gLTE7Ci0jaWZkZWYgREVCVUdfUEsKLQkJCWtleV9kdW1wX2VjX2tleShyZXQtPmVjZHNhKTsKLSNlbmRpZgotCQl9Ci0jZW5kaWYKLQkJc3VjY2VzcyA9IDE7Ci0vKlhYWFgqLwotCQlrZXlfZnJlZShrKTsKLQkJaWYgKHN1Y2Nlc3MgIT0gMSkKLQkJCWJyZWFrOwotCQkvKiBhZHZhbmNlIGNwOiBza2lwIHdoaXRlc3BhY2UgYW5kIGRhdGEgKi8KLQkJd2hpbGUgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpCi0JCQljcCsrOwotCQl3aGlsZSAoKmNwICE9ICdcMCcgJiYgKmNwICE9ICcgJyAmJiAqY3AgIT0gJ1x0JykKLQkJCWNwKys7Ci0JCSpjcHAgPSBjcDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmF0YWwoImtleV9yZWFkOiBiYWQga2V5IHR5cGU6ICVkIiwgcmV0LT50eXBlKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzdWNjZXNzOwotfQotCi1pbnQKLWtleV93cml0ZShjb25zdCBLZXkgKmtleSwgRklMRSAqZikKLXsKLQlpbnQgbiwgc3VjY2VzcyA9IDA7Ci0JdV9pbnQgbGVuLCBiaXRzID0gMDsKLQl1X2NoYXIgKmJsb2I7Ci0JY2hhciAqdXU7Ci0KLQlpZiAoa2V5X2lzX2NlcnQoa2V5KSkgewotCQlpZiAoa2V5LT5jZXJ0ID09IE5VTEwpIHsKLQkJCWVycm9yKCIlczogbm8gY2VydCBkYXRhIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKGJ1ZmZlcl9sZW4oJmtleS0+Y2VydC0+Y2VydGJsb2IpID09IDApIHsKLQkJCWVycm9yKCIlczogbm8gc2lnbmVkIGNlcnRpZmljYXRlIGJsb2IiLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXN3aXRjaCAoa2V5LT50eXBlKSB7Ci0JY2FzZSBLRVlfUlNBMToKLQkJaWYgKGtleS0+cnNhID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQkJLyogc2l6ZSBvZiBtb2R1bHVzICduJyAqLwotCQliaXRzID0gQk5fbnVtX2JpdHMoa2V5LT5yc2EtPm4pOwotCQlmcHJpbnRmKGYsICIldSIsIGJpdHMpOwotCQlpZiAod3JpdGVfYmlnbnVtKGYsIGtleS0+cnNhLT5lKSAmJgotCQkgICAgd3JpdGVfYmlnbnVtKGYsIGtleS0+cnNhLT5uKSkKLQkJCXJldHVybiAxOwotCQllcnJvcigia2V5X3dyaXRlOiBmYWlsZWQgZm9yIFJTQSBrZXkiKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBLRVlfRFNBOgotCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9EU0FfQ0VSVDoKLQkJaWYgKGtleS0+ZHNhID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQkJYnJlYWs7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JY2FzZSBLRVlfRUNEU0E6Ci0JY2FzZSBLRVlfRUNEU0FfQ0VSVDoKLQkJaWYgKGtleS0+ZWNkc2EgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCQlicmVhazsKLSNlbmRpZgotCWNhc2UgS0VZX1JTQToKLQljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6Ci0JY2FzZSBLRVlfUlNBX0NFUlQ6Ci0JCWlmIChrZXktPnJzYSA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLQotCWtleV90b19ibG9iKGtleSwgJmJsb2IsICZsZW4pOwotCXV1ID0geG1hbGxvYygyKmxlbik7Ci0JbiA9IHV1ZW5jb2RlKGJsb2IsIGxlbiwgdXUsIDIqbGVuKTsKLQlpZiAobiA+IDApIHsKLQkJZnByaW50ZihmLCAiJXMgJXMiLCBrZXlfc3NoX25hbWUoa2V5KSwgdXUpOwotCQlzdWNjZXNzID0gMTsKLQl9Ci0JeGZyZWUoYmxvYik7Ci0JeGZyZWUodXUpOwotCi0JcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLWNvbnN0IGNoYXIgKgota2V5X3R5cGUoY29uc3QgS2V5ICprKQotewotCXN3aXRjaCAoay0+dHlwZSkgewotCWNhc2UgS0VZX1JTQTE6Ci0JCXJldHVybiAiUlNBMSI7Ci0JY2FzZSBLRVlfUlNBOgotCQlyZXR1cm4gIlJTQSI7Ci0JY2FzZSBLRVlfRFNBOgotCQlyZXR1cm4gIkRTQSI7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JY2FzZSBLRVlfRUNEU0E6Ci0JCXJldHVybiAiRUNEU0EiOwotI2VuZGlmCi0JY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgotCQlyZXR1cm4gIlJTQS1DRVJULVYwMCI7Ci0JY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgotCQlyZXR1cm4gIkRTQS1DRVJULVYwMCI7Ci0JY2FzZSBLRVlfUlNBX0NFUlQ6Ci0JCXJldHVybiAiUlNBLUNFUlQiOwotCWNhc2UgS0VZX0RTQV9DRVJUOgotCQlyZXR1cm4gIkRTQS1DRVJUIjsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQljYXNlIEtFWV9FQ0RTQV9DRVJUOgotCQlyZXR1cm4gIkVDRFNBLUNFUlQiOwotI2VuZGlmCi0JfQotCXJldHVybiAidW5rbm93biI7Ci19Ci0KLWNvbnN0IGNoYXIgKgota2V5X2NlcnRfdHlwZShjb25zdCBLZXkgKmspCi17Ci0Jc3dpdGNoIChrLT5jZXJ0LT50eXBlKSB7Ci0JY2FzZSBTU0gyX0NFUlRfVFlQRV9VU0VSOgotCQlyZXR1cm4gInVzZXIiOwotCWNhc2UgU1NIMl9DRVJUX1RZUEVfSE9TVDoKLQkJcmV0dXJuICJob3N0IjsKLQlkZWZhdWx0OgotCQlyZXR1cm4gInVua25vd24iOwotCX0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgota2V5X3NzaF9uYW1lX2Zyb21fdHlwZV9uaWQoaW50IHR5cGUsIGludCBuaWQpCi17Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBLRVlfUlNBOgotCQlyZXR1cm4gInNzaC1yc2EiOwotCWNhc2UgS0VZX0RTQToKLQkJcmV0dXJuICJzc2gtZHNzIjsKLQljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6Ci0JCXJldHVybiAic3NoLXJzYS1jZXJ0LXYwMEBvcGVuc3NoLmNvbSI7Ci0JY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgotCQlyZXR1cm4gInNzaC1kc3MtY2VydC12MDBAb3BlbnNzaC5jb20iOwotCWNhc2UgS0VZX1JTQV9DRVJUOgotCQlyZXR1cm4gInNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20iOwotCWNhc2UgS0VZX0RTQV9DRVJUOgotCQlyZXR1cm4gInNzaC1kc3MtY2VydC12MDFAb3BlbnNzaC5jb20iOwotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCWNhc2UgS0VZX0VDRFNBOgotCQlzd2l0Y2ggKG5pZCkgewotCQljYXNlIE5JRF9YOV82Ml9wcmltZTI1NnYxOgotCQkJcmV0dXJuICJlY2RzYS1zaGEyLW5pc3RwMjU2IjsKLQkJY2FzZSBOSURfc2VjcDM4NHIxOgotCQkJcmV0dXJuICJlY2RzYS1zaGEyLW5pc3RwMzg0IjsKLQkJY2FzZSBOSURfc2VjcDUyMXIxOgotCQkJcmV0dXJuICJlY2RzYS1zaGEyLW5pc3RwNTIxIjsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgS0VZX0VDRFNBX0NFUlQ6Ci0JCXN3aXRjaCAobmlkKSB7Ci0JCWNhc2UgTklEX1g5XzYyX3ByaW1lMjU2djE6Ci0JCQlyZXR1cm4gImVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20iOwotCQljYXNlIE5JRF9zZWNwMzg0cjE6Ci0JCQlyZXR1cm4gImVjZHNhLXNoYTItbmlzdHAzODQtY2VydC12MDFAb3BlbnNzaC5jb20iOwotCQljYXNlIE5JRF9zZWNwNTIxcjE6Ci0JCQlyZXR1cm4gImVjZHNhLXNoYTItbmlzdHA1MjEtY2VydC12MDFAb3BlbnNzaC5jb20iOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0jZW5kaWYgLyogT1BFTlNTTF9IQVNfRUNDICovCi0JfQotCXJldHVybiAic3NoLXVua25vd24iOwotfQotCi1jb25zdCBjaGFyICoKLWtleV9zc2hfbmFtZShjb25zdCBLZXkgKmspCi17Ci0JcmV0dXJuIGtleV9zc2hfbmFtZV9mcm9tX3R5cGVfbmlkKGstPnR5cGUsIGstPmVjZHNhX25pZCk7Ci19Ci0KLWNvbnN0IGNoYXIgKgota2V5X3NzaF9uYW1lX3BsYWluKGNvbnN0IEtleSAqaykKLXsKLQlyZXR1cm4ga2V5X3NzaF9uYW1lX2Zyb21fdHlwZV9uaWQoa2V5X3R5cGVfcGxhaW4oay0+dHlwZSksCi0JICAgIGstPmVjZHNhX25pZCk7Ci19Ci0KLXVfaW50Ci1rZXlfc2l6ZShjb25zdCBLZXkgKmspCi17Ci0Jc3dpdGNoIChrLT50eXBlKSB7Ci0JY2FzZSBLRVlfUlNBMToKLQljYXNlIEtFWV9SU0E6Ci0JY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX1JTQV9DRVJUOgotCQlyZXR1cm4gQk5fbnVtX2JpdHMoay0+cnNhLT5uKTsKLQljYXNlIEtFWV9EU0E6Ci0JY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX0RTQV9DRVJUOgotCQlyZXR1cm4gQk5fbnVtX2JpdHMoay0+ZHNhLT5wKTsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQljYXNlIEtFWV9FQ0RTQToKLQljYXNlIEtFWV9FQ0RTQV9DRVJUOgotCQlyZXR1cm4ga2V5X2N1cnZlX25pZF90b19iaXRzKGstPmVjZHNhX25pZCk7Ci0jZW5kaWYKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBSU0EgKgotcnNhX2dlbmVyYXRlX3ByaXZhdGVfa2V5KHVfaW50IGJpdHMpCi17Ci0JUlNBICpwcml2YXRlID0gUlNBX25ldygpOwotCUJJR05VTSAqZjQgPSBCTl9uZXcoKTsKLQotCWlmIChwcml2YXRlID09IE5VTEwpCi0JCWZhdGFsKCIlczogUlNBX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JaWYgKGY0ID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKLQlpZiAoIUJOX3NldF93b3JkKGY0LCBSU0FfRjQpKQotCQlmYXRhbCgiJXM6IEJOX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JaWYgKCFSU0FfZ2VuZXJhdGVfa2V5X2V4KHByaXZhdGUsIGJpdHMsIGY0LCBOVUxMKSkKLQkJZmF0YWwoIiVzOiBrZXkgZ2VuZXJhdGlvbiBmYWlsZWQuIiwgX19mdW5jX18pOwotCUJOX2ZyZWUoZjQpOwotCXJldHVybiBwcml2YXRlOwotfQotCi1zdGF0aWMgRFNBKgotZHNhX2dlbmVyYXRlX3ByaXZhdGVfa2V5KHVfaW50IGJpdHMpCi17Ci0JRFNBICpwcml2YXRlID0gRFNBX25ldygpOwotCi0JaWYgKHByaXZhdGUgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBEU0FfbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKLQlpZiAoIURTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzX2V4KHByaXZhdGUsIGJpdHMsIE5VTEwsIDAsIE5VTEwsCi0JICAgIE5VTEwsIE5VTEwpKQotCQlmYXRhbCgiJXM6IERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIGZhaWxlZCIsIF9fZnVuY19fKTsKLQlpZiAoIURTQV9nZW5lcmF0ZV9rZXkocHJpdmF0ZSkpCi0JCWZhdGFsKCIlczogRFNBX2dlbmVyYXRlX2tleSBmYWlsZWQuIiwgX19mdW5jX18pOwotCXJldHVybiBwcml2YXRlOwotfQotCi1pbnQKLWtleV9lY2RzYV9iaXRzX3RvX25pZChpbnQgYml0cykKLXsKLQlzd2l0Y2ggKGJpdHMpIHsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQljYXNlIDI1NjoKLQkJcmV0dXJuIE5JRF9YOV82Ml9wcmltZTI1NnYxOwotCWNhc2UgMzg0OgotCQlyZXR1cm4gTklEX3NlY3AzODRyMTsKLQljYXNlIDUyMToKLQkJcmV0dXJuIE5JRF9zZWNwNTIxcjE7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQlyZXR1cm4gLTE7Ci0JfQotfQotCi0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi1pbnQKLWtleV9lY2RzYV9rZXlfdG9fbmlkKEVDX0tFWSAqaykKLXsKLQlFQ19HUk9VUCAqZWc7Ci0JaW50IG5pZHNbXSA9IHsKLQkJTklEX1g5XzYyX3ByaW1lMjU2djEsCi0JCU5JRF9zZWNwMzg0cjEsCi0JCU5JRF9zZWNwNTIxcjEsCi0JCS0xCi0JfTsKLQlpbnQgbmlkOwotCXVfaW50IGk7Ci0JQk5fQ1RYICpibmN0eDsKLQljb25zdCBFQ19HUk9VUCAqZyA9IEVDX0tFWV9nZXQwX2dyb3VwKGspOwotCi0JLyoKLQkgKiBUaGUgZ3JvdXAgbWF5IGJlIHN0b3JlZCBpbiBhIEFTTi4xIGVuY29kZWQgcHJpdmF0ZSBrZXkgaW4gb25lIG9mIHR3bwotCSAqIHdheXM6IGFzIGEgIm5hbWVkIGdyb3VwIiwgd2hpY2ggaXMgcmVjb25zdGl0dXRlZCBieSBBU04uMSBvYmplY3QgSUQKLQkgKiBvciBleHBsaWNpdCBncm91cCBwYXJhbWV0ZXJzIGVuY29kZWQgaW50byB0aGUga2V5IGJsb2IuIE9ubHkgdGhlCi0JICogIm5hbWVkIGdyb3VwIiBjYXNlIHNldHMgdGhlIGdyb3VwIE5JRCBmb3IgdXMsIGJ1dCB3ZSBjYW4gZmlndXJlCi0JICogaXQgb3V0IGZvciB0aGUgb3RoZXIgY2FzZSBieSBjb21wYXJpbmcgYWdhaW5zdCBhbGwgdGhlIGdyb3VwcyB0aGF0Ci0JICogYXJlIHN1cHBvcnRlZC4KLQkgKi8KLQlpZiAoKG5pZCA9IEVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKGcpKSA+IDApCi0JCXJldHVybiBuaWQ7Ci0JaWYgKChibmN0eCA9IEJOX0NUWF9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBCTl9DVFhfbmV3KCkgZmFpbGVkIiwgX19mdW5jX18pOwotCWZvciAoaSA9IDA7IG5pZHNbaV0gIT0gLTE7IGkrKykgewotCQlpZiAoKGVnID0gRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUobmlkc1tpXSkpID09IE5VTEwpCi0JCQlmYXRhbCgiJXM6IEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lIGZhaWxlZCIsCi0JCQkgICAgX19mdW5jX18pOwotCQlpZiAoRUNfR1JPVVBfY21wKGcsIGVnLCBibmN0eCkgPT0gMCkKLQkJCWJyZWFrOwotCQlFQ19HUk9VUF9mcmVlKGVnKTsKLQl9Ci0JQk5fQ1RYX2ZyZWUoYm5jdHgpOwotCWRlYnVnMygiJXM6IG5pZCA9ICVkIiwgX19mdW5jX18sIG5pZHNbaV0pOwotCWlmIChuaWRzW2ldICE9IC0xKSB7Ci0JCS8qIFVzZSB0aGUgZ3JvdXAgd2l0aCB0aGUgTklEIGF0dGFjaGVkICovCi0JCUVDX0dST1VQX3NldF9hc24xX2ZsYWcoZWcsIE9QRU5TU0xfRUNfTkFNRURfQ1VSVkUpOwotCQlpZiAoRUNfS0VZX3NldF9ncm91cChrLCBlZykgIT0gMSkKLQkJCWZhdGFsKCIlczogRUNfS0VZX3NldF9ncm91cCIsIF9fZnVuY19fKTsKLQl9Ci0JcmV0dXJuIG5pZHNbaV07Ci19Ci0KLXN0YXRpYyBFQ19LRVkqCi1lY2RzYV9nZW5lcmF0ZV9wcml2YXRlX2tleSh1X2ludCBiaXRzLCBpbnQgKm5pZCkKLXsKLQlFQ19LRVkgKnByaXZhdGU7Ci0KLQlpZiAoKCpuaWQgPSBrZXlfZWNkc2FfYml0c190b19uaWQoYml0cykpID09IC0xKQotCQlmYXRhbCgiJXM6IGludmFsaWQga2V5IGxlbmd0aCIsIF9fZnVuY19fKTsKLQlpZiAoKHByaXZhdGUgPSBFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUoKm5pZCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lIGZhaWxlZCIsIF9fZnVuY19fKTsKLQlpZiAoRUNfS0VZX2dlbmVyYXRlX2tleShwcml2YXRlKSAhPSAxKQotCQlmYXRhbCgiJXM6IEVDX0tFWV9nZW5lcmF0ZV9rZXkgZmFpbGVkIiwgX19mdW5jX18pOwotCUVDX0tFWV9zZXRfYXNuMV9mbGFnKHByaXZhdGUsIE9QRU5TU0xfRUNfTkFNRURfQ1VSVkUpOwotCXJldHVybiBwcml2YXRlOwotfQotI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLwotCi1LZXkgKgota2V5X2dlbmVyYXRlKGludCB0eXBlLCB1X2ludCBiaXRzKQotewotCUtleSAqayA9IGtleV9uZXcoS0VZX1VOU1BFQyk7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBLRVlfRFNBOgotCQlrLT5kc2EgPSBkc2FfZ2VuZXJhdGVfcHJpdmF0ZV9rZXkoYml0cyk7Ci0JCWJyZWFrOwotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCWNhc2UgS0VZX0VDRFNBOgotCQlrLT5lY2RzYSA9IGVjZHNhX2dlbmVyYXRlX3ByaXZhdGVfa2V5KGJpdHMsICZrLT5lY2RzYV9uaWQpOwotCQlicmVhazsKLSNlbmRpZgotCWNhc2UgS0VZX1JTQToKLQljYXNlIEtFWV9SU0ExOgotCQlrLT5yc2EgPSByc2FfZ2VuZXJhdGVfcHJpdmF0ZV9rZXkoYml0cyk7Ci0JCWJyZWFrOwotCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6Ci0JY2FzZSBLRVlfUlNBX0NFUlQ6Ci0JY2FzZSBLRVlfRFNBX0NFUlQ6Ci0JCWZhdGFsKCJrZXlfZ2VuZXJhdGU6IGNlcnQga2V5cyBjYW5ub3QgYmUgZ2VuZXJhdGVkIGRpcmVjdGx5Iik7Ci0JZGVmYXVsdDoKLQkJZmF0YWwoImtleV9nZW5lcmF0ZTogdW5rbm93biB0eXBlICVkIiwgdHlwZSk7Ci0JfQotCWstPnR5cGUgPSB0eXBlOwotCXJldHVybiBrOwotfQotCi12b2lkCi1rZXlfY2VydF9jb3B5KGNvbnN0IEtleSAqZnJvbV9rZXksIHN0cnVjdCBLZXkgKnRvX2tleSkKLXsKLQl1X2ludCBpOwotCWNvbnN0IHN0cnVjdCBLZXlDZXJ0ICpmcm9tOwotCXN0cnVjdCBLZXlDZXJ0ICp0bzsKLQotCWlmICh0b19rZXktPmNlcnQgIT0gTlVMTCkgewotCQljZXJ0X2ZyZWUodG9fa2V5LT5jZXJ0KTsKLQkJdG9fa2V5LT5jZXJ0ID0gTlVMTDsKLQl9Ci0KLQlpZiAoKGZyb20gPSBmcm9tX2tleS0+Y2VydCkgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JdG8gPSB0b19rZXktPmNlcnQgPSBjZXJ0X25ldygpOwotCi0JYnVmZmVyX2FwcGVuZCgmdG8tPmNlcnRibG9iLCBidWZmZXJfcHRyKCZmcm9tLT5jZXJ0YmxvYiksCi0JICAgIGJ1ZmZlcl9sZW4oJmZyb20tPmNlcnRibG9iKSk7Ci0KLQlidWZmZXJfYXBwZW5kKCZ0by0+Y3JpdGljYWwsCi0JICAgIGJ1ZmZlcl9wdHIoJmZyb20tPmNyaXRpY2FsKSwgYnVmZmVyX2xlbigmZnJvbS0+Y3JpdGljYWwpKTsKLQlidWZmZXJfYXBwZW5kKCZ0by0+ZXh0ZW5zaW9ucywKLQkgICAgYnVmZmVyX3B0cigmZnJvbS0+ZXh0ZW5zaW9ucyksIGJ1ZmZlcl9sZW4oJmZyb20tPmV4dGVuc2lvbnMpKTsKLQotCXRvLT5zZXJpYWwgPSBmcm9tLT5zZXJpYWw7Ci0JdG8tPnR5cGUgPSBmcm9tLT50eXBlOwotCXRvLT5rZXlfaWQgPSBmcm9tLT5rZXlfaWQgPT0gTlVMTCA/IE5VTEwgOiB4c3RyZHVwKGZyb20tPmtleV9pZCk7Ci0JdG8tPnZhbGlkX2FmdGVyID0gZnJvbS0+dmFsaWRfYWZ0ZXI7Ci0JdG8tPnZhbGlkX2JlZm9yZSA9IGZyb20tPnZhbGlkX2JlZm9yZTsKLQl0by0+c2lnbmF0dXJlX2tleSA9IGZyb20tPnNpZ25hdHVyZV9rZXkgPT0gTlVMTCA/Ci0JICAgIE5VTEwgOiBrZXlfZnJvbV9wcml2YXRlKGZyb20tPnNpZ25hdHVyZV9rZXkpOwotCi0JdG8tPm5wcmluY2lwYWxzID0gZnJvbS0+bnByaW5jaXBhbHM7Ci0JaWYgKHRvLT5ucHJpbmNpcGFscyA+IENFUlRfTUFYX1BSSU5DSVBBTFMpCi0JCWZhdGFsKCIlczogbnByaW5jaXBhbHMgKCV1KSA+IENFUlRfTUFYX1BSSU5DSVBBTFMgKCV1KSIsCi0JCSAgICBfX2Z1bmNfXywgdG8tPm5wcmluY2lwYWxzLCBDRVJUX01BWF9QUklOQ0lQQUxTKTsKLQlpZiAodG8tPm5wcmluY2lwYWxzID4gMCkgewotCQl0by0+cHJpbmNpcGFscyA9IHhjYWxsb2MoZnJvbS0+bnByaW5jaXBhbHMsCi0JCSAgICBzaXplb2YoKnRvLT5wcmluY2lwYWxzKSk7Ci0JCWZvciAoaSA9IDA7IGkgPCB0by0+bnByaW5jaXBhbHM7IGkrKykKLQkJCXRvLT5wcmluY2lwYWxzW2ldID0geHN0cmR1cChmcm9tLT5wcmluY2lwYWxzW2ldKTsKLQl9Ci19Ci0KLUtleSAqCi1rZXlfZnJvbV9wcml2YXRlKGNvbnN0IEtleSAqaykKLXsKLQlLZXkgKm4gPSBOVUxMOwotCXN3aXRjaCAoay0+dHlwZSkgewotCWNhc2UgS0VZX0RTQToKLQljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6Ci0JY2FzZSBLRVlfRFNBX0NFUlQ6Ci0JCW4gPSBrZXlfbmV3KGstPnR5cGUpOwotCQlpZiAoKEJOX2NvcHkobi0+ZHNhLT5wLCBrLT5kc2EtPnApID09IE5VTEwpIHx8Ci0JCSAgICAoQk5fY29weShuLT5kc2EtPnEsIGstPmRzYS0+cSkgPT0gTlVMTCkgfHwKLQkJICAgIChCTl9jb3B5KG4tPmRzYS0+Zywgay0+ZHNhLT5nKSA9PSBOVUxMKSB8fAotCQkgICAgKEJOX2NvcHkobi0+ZHNhLT5wdWJfa2V5LCBrLT5kc2EtPnB1Yl9rZXkpID09IE5VTEwpKQotCQkJZmF0YWwoImtleV9mcm9tX3ByaXZhdGU6IEJOX2NvcHkgZmFpbGVkIik7Ci0JCWJyZWFrOwotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCWNhc2UgS0VZX0VDRFNBOgotCWNhc2UgS0VZX0VDRFNBX0NFUlQ6Ci0JCW4gPSBrZXlfbmV3KGstPnR5cGUpOwotCQluLT5lY2RzYV9uaWQgPSBrLT5lY2RzYV9uaWQ7Ci0JCWlmICgobi0+ZWNkc2EgPSBFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUoay0+ZWNkc2FfbmlkKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCIlczogRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lIGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJaWYgKEVDX0tFWV9zZXRfcHVibGljX2tleShuLT5lY2RzYSwKLQkJICAgIEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoay0+ZWNkc2EpKSAhPSAxKQotCQkJZmF0YWwoIiVzOiBFQ19LRVlfc2V0X3B1YmxpY19rZXkgZmFpbGVkIiwgX19mdW5jX18pOwotCQlicmVhazsKLSNlbmRpZgotCWNhc2UgS0VZX1JTQToKLQljYXNlIEtFWV9SU0ExOgotCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9SU0FfQ0VSVDoKLQkJbiA9IGtleV9uZXcoay0+dHlwZSk7Ci0JCWlmICgoQk5fY29weShuLT5yc2EtPm4sIGstPnJzYS0+bikgPT0gTlVMTCkgfHwKLQkJICAgIChCTl9jb3B5KG4tPnJzYS0+ZSwgay0+cnNhLT5lKSA9PSBOVUxMKSkKLQkJCWZhdGFsKCJrZXlfZnJvbV9wcml2YXRlOiBCTl9jb3B5IGZhaWxlZCIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlmYXRhbCgia2V5X2Zyb21fcHJpdmF0ZTogdW5rbm93biB0eXBlICVkIiwgay0+dHlwZSk7Ci0JCWJyZWFrOwotCX0KLQlpZiAoa2V5X2lzX2NlcnQoaykpCi0JCWtleV9jZXJ0X2NvcHkoaywgbik7Ci0JcmV0dXJuIG47Ci19Ci0KLWludAota2V5X3R5cGVfZnJvbV9uYW1lKGNoYXIgKm5hbWUpCi17Ci0JaWYgKHN0cmNtcChuYW1lLCAicnNhMSIpID09IDApIHsKLQkJcmV0dXJuIEtFWV9SU0ExOwotCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJyc2EiKSA9PSAwKSB7Ci0JCXJldHVybiBLRVlfUlNBOwotCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJkc2EiKSA9PSAwKSB7Ci0JCXJldHVybiBLRVlfRFNBOwotCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJzc2gtcnNhIikgPT0gMCkgewotCQlyZXR1cm4gS0VZX1JTQTsKLQl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAic3NoLWRzcyIpID09IDApIHsKLQkJcmV0dXJuIEtFWV9EU0E7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgImVjZHNhIikgPT0gMCB8fAotCSAgICBzdHJjbXAobmFtZSwgImVjZHNhLXNoYTItbmlzdHAyNTYiKSA9PSAwIHx8Ci0JICAgIHN0cmNtcChuYW1lLCAiZWNkc2Etc2hhMi1uaXN0cDM4NCIpID09IDAgfHwKLQkgICAgc3RyY21wKG5hbWUsICJlY2RzYS1zaGEyLW5pc3RwNTIxIikgPT0gMCkgewotCQlyZXR1cm4gS0VZX0VDRFNBOwotI2VuZGlmCi0JfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInNzaC1yc2EtY2VydC12MDBAb3BlbnNzaC5jb20iKSA9PSAwKSB7Ci0JCXJldHVybiBLRVlfUlNBX0NFUlRfVjAwOwotCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJzc2gtZHNzLWNlcnQtdjAwQG9wZW5zc2guY29tIikgPT0gMCkgewotCQlyZXR1cm4gS0VZX0RTQV9DRVJUX1YwMDsKLQl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAic3NoLXJzYS1jZXJ0LXYwMUBvcGVuc3NoLmNvbSIpID09IDApIHsKLQkJcmV0dXJuIEtFWV9SU0FfQ0VSVDsKLQl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAic3NoLWRzcy1jZXJ0LXYwMUBvcGVuc3NoLmNvbSIpID09IDApIHsKLQkJcmV0dXJuIEtFWV9EU0FfQ0VSVDsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiZWNkc2Etc2hhMi1uaXN0cDI1Ni1jZXJ0LXYwMUBvcGVuc3NoLmNvbSIpID09IDAgfHwKLQkgICAgc3RyY21wKG5hbWUsICJlY2RzYS1zaGEyLW5pc3RwMzg0LWNlcnQtdjAxQG9wZW5zc2guY29tIikgPT0gMCB8fAotCSAgICBzdHJjbXAobmFtZSwgImVjZHNhLXNoYTItbmlzdHA1MjEtY2VydC12MDFAb3BlbnNzaC5jb20iKSA9PSAwKSB7Ci0JCXJldHVybiBLRVlfRUNEU0FfQ0VSVDsKLSNlbmRpZgotCX0KLQotCWRlYnVnMigia2V5X3R5cGVfZnJvbV9uYW1lOiB1bmtub3duIGtleSB0eXBlICclcyciLCBuYW1lKTsKLQlyZXR1cm4gS0VZX1VOU1BFQzsKLX0KLQotaW50Ci1rZXlfZWNkc2FfbmlkX2Zyb21fbmFtZShjb25zdCBjaGFyICpuYW1lKQotewotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCWlmIChzdHJjbXAobmFtZSwgImVjZHNhLXNoYTItbmlzdHAyNTYiKSA9PSAwIHx8Ci0JICAgIHN0cmNtcChuYW1lLCAiZWNkc2Etc2hhMi1uaXN0cDI1Ni1jZXJ0LXYwMUBvcGVuc3NoLmNvbSIpID09IDApCi0JCXJldHVybiBOSURfWDlfNjJfcHJpbWUyNTZ2MTsKLQlpZiAoc3RyY21wKG5hbWUsICJlY2RzYS1zaGEyLW5pc3RwMzg0IikgPT0gMCB8fAotCSAgICBzdHJjbXAobmFtZSwgImVjZHNhLXNoYTItbmlzdHAzODQtY2VydC12MDFAb3BlbnNzaC5jb20iKSA9PSAwKQotCQlyZXR1cm4gTklEX3NlY3AzODRyMTsKLQlpZiAoc3RyY21wKG5hbWUsICJlY2RzYS1zaGEyLW5pc3RwNTIxIikgPT0gMCB8fAotCSAgICBzdHJjbXAobmFtZSwgImVjZHNhLXNoYTItbmlzdHA1MjEtY2VydC12MDFAb3BlbnNzaC5jb20iKSA9PSAwKQotCQlyZXR1cm4gTklEX3NlY3A1MjFyMTsKLSNlbmRpZiAvKiBPUEVOU1NMX0hBU19FQ0MgKi8KLQotCWRlYnVnMigiJXM6IHVua25vd24vbm9uLUVDRFNBIGtleSB0eXBlICclcyciLCBfX2Z1bmNfXywgbmFtZSk7Ci0JcmV0dXJuIC0xOwotfQotCi1pbnQKLWtleV9uYW1lc192YWxpZDIoY29uc3QgY2hhciAqbmFtZXMpCi17Ci0JY2hhciAqcywgKmNwLCAqcDsKLQotCWlmIChuYW1lcyA9PSBOVUxMIHx8IHN0cmNtcChuYW1lcywgIiIpID09IDApCi0JCXJldHVybiAwOwotCXMgPSBjcCA9IHhzdHJkdXAobmFtZXMpOwotCWZvciAoKHAgPSBzdHJzZXAoJmNwLCAiLCIpKTsgcCAmJiAqcCAhPSAnXDAnOwotCSAgICAocCA9IHN0cnNlcCgmY3AsICIsIikpKSB7Ci0JCXN3aXRjaCAoa2V5X3R5cGVfZnJvbV9uYW1lKHApKSB7Ci0JCWNhc2UgS0VZX1JTQTE6Ci0JCWNhc2UgS0VZX1VOU1BFQzoKLQkJCXhmcmVlKHMpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JZGVidWczKCJrZXkgbmFtZXMgb2s6IFslc10iLCBuYW1lcyk7Ci0JeGZyZWUocyk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWNlcnRfcGFyc2UoQnVmZmVyICpiLCBLZXkgKmtleSwgY29uc3QgdV9jaGFyICpibG9iLCB1X2ludCBibGVuKQotewotCXVfY2hhciAqcHJpbmNpcGFscywgKmNyaXRpY2FsLCAqZXh0cywgKnNpZ19rZXksICpzaWc7Ci0JdV9pbnQgc2lnbmVkX2xlbiwgcGxlbiwgY2xlbiwgc2tsZW4sIHNsZW4sIGtpZGxlbiwgZWxlbjsKLQlCdWZmZXIgdG1wOwotCWNoYXIgKnByaW5jaXBhbDsKLQlpbnQgcmV0ID0gLTE7Ci0JaW50IHYwMCA9IGtleS0+dHlwZSA9PSBLRVlfRFNBX0NFUlRfVjAwIHx8Ci0JICAgIGtleS0+dHlwZSA9PSBLRVlfUlNBX0NFUlRfVjAwOwotCi0JYnVmZmVyX2luaXQoJnRtcCk7Ci0KLQkvKiBDb3B5IHRoZSBlbnRpcmUga2V5IGJsb2IgZm9yIHZlcmlmaWNhdGlvbiBhbmQgbGF0ZXIgc2VyaWFsaXNhdGlvbiAqLwotCWJ1ZmZlcl9hcHBlbmQoJmtleS0+Y2VydC0+Y2VydGJsb2IsIGJsb2IsIGJsZW4pOwotCi0JZWxlbiA9IDA7IC8qIE5vdCB0b3VjaGVkIGZvciB2MDAgY2VydHMgKi8KLQlwcmluY2lwYWxzID0gZXh0cyA9IGNyaXRpY2FsID0gc2lnX2tleSA9IHNpZyA9IE5VTEw7Ci0JaWYgKCghdjAwICYmIGJ1ZmZlcl9nZXRfaW50NjRfcmV0KCZrZXktPmNlcnQtPnNlcmlhbCwgYikgIT0gMCkgfHwKLQkgICAgYnVmZmVyX2dldF9pbnRfcmV0KCZrZXktPmNlcnQtPnR5cGUsIGIpICE9IDAgfHwKLQkgICAgKGtleS0+Y2VydC0+a2V5X2lkID0gYnVmZmVyX2dldF9jc3RyaW5nX3JldChiLCAma2lkbGVuKSkgPT0gTlVMTCB8fAotCSAgICAocHJpbmNpcGFscyA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChiLCAmcGxlbikpID09IE5VTEwgfHwKLQkgICAgYnVmZmVyX2dldF9pbnQ2NF9yZXQoJmtleS0+Y2VydC0+dmFsaWRfYWZ0ZXIsIGIpICE9IDAgfHwKLQkgICAgYnVmZmVyX2dldF9pbnQ2NF9yZXQoJmtleS0+Y2VydC0+dmFsaWRfYmVmb3JlLCBiKSAhPSAwIHx8Ci0JICAgIChjcml0aWNhbCA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChiLCAmY2xlbikpID09IE5VTEwgfHwKLQkgICAgKCF2MDAgJiYgKGV4dHMgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQoYiwgJmVsZW4pKSA9PSBOVUxMKSB8fAotCSAgICAodjAwICYmIGJ1ZmZlcl9nZXRfc3RyaW5nX3B0cl9yZXQoYiwgTlVMTCkgPT0gTlVMTCkgfHwgLyogbm9uY2UgKi8KLQkgICAgYnVmZmVyX2dldF9zdHJpbmdfcHRyX3JldChiLCBOVUxMKSA9PSBOVUxMIHx8IC8qIHJlc2VydmVkICovCi0JICAgIChzaWdfa2V5ID0gYnVmZmVyX2dldF9zdHJpbmdfcmV0KGIsICZza2xlbikpID09IE5VTEwpIHsKLQkJZXJyb3IoIiVzOiBwYXJzZSBlcnJvciIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGtpZGxlbiAhPSBzdHJsZW4oa2V5LT5jZXJ0LT5rZXlfaWQpKSB7Ci0JCWVycm9yKCIlczoga2V5IElEIGNvbnRhaW5zIFxcMCBjaGFyYWN0ZXIiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIFNpZ25hdHVyZSBpcyBsZWZ0IGluIHRoZSBidWZmZXIgc28gd2UgY2FuIGNhbGN1bGF0ZSB0aGlzIGxlbmd0aCAqLwotCXNpZ25lZF9sZW4gPSBidWZmZXJfbGVuKCZrZXktPmNlcnQtPmNlcnRibG9iKSAtIGJ1ZmZlcl9sZW4oYik7Ci0KLQlpZiAoKHNpZyA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChiLCAmc2xlbikpID09IE5VTEwpIHsKLQkJZXJyb3IoIiVzOiBwYXJzZSBlcnJvciIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGtleS0+Y2VydC0+dHlwZSAhPSBTU0gyX0NFUlRfVFlQRV9VU0VSICYmCi0JICAgIGtleS0+Y2VydC0+dHlwZSAhPSBTU0gyX0NFUlRfVFlQRV9IT1NUKSB7Ci0JCWVycm9yKCJVbmtub3duIGNlcnRpZmljYXRlIHR5cGUgJXUiLCBrZXktPmNlcnQtPnR5cGUpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlidWZmZXJfYXBwZW5kKCZ0bXAsIHByaW5jaXBhbHMsIHBsZW4pOwotCXdoaWxlIChidWZmZXJfbGVuKCZ0bXApID4gMCkgewotCQlpZiAoa2V5LT5jZXJ0LT5ucHJpbmNpcGFscyA+PSBDRVJUX01BWF9QUklOQ0lQQUxTKSB7Ci0JCQllcnJvcigiJXM6IFRvbyBtYW55IHByaW5jaXBhbHMiLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlpZiAoKHByaW5jaXBhbCA9IGJ1ZmZlcl9nZXRfY3N0cmluZ19yZXQoJnRtcCwgJnBsZW4pKSA9PSBOVUxMKSB7Ci0JCQllcnJvcigiJXM6IFByaW5jaXBhbHMgZGF0YSBpbnZhbGlkIiwgX19mdW5jX18pOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJa2V5LT5jZXJ0LT5wcmluY2lwYWxzID0geHJlYWxsb2Moa2V5LT5jZXJ0LT5wcmluY2lwYWxzLAotCQkgICAga2V5LT5jZXJ0LT5ucHJpbmNpcGFscyArIDEsIHNpemVvZigqa2V5LT5jZXJ0LT5wcmluY2lwYWxzKSk7Ci0JCWtleS0+Y2VydC0+cHJpbmNpcGFsc1trZXktPmNlcnQtPm5wcmluY2lwYWxzKytdID0gcHJpbmNpcGFsOwotCX0KLQotCWJ1ZmZlcl9jbGVhcigmdG1wKTsKLQotCWJ1ZmZlcl9hcHBlbmQoJmtleS0+Y2VydC0+Y3JpdGljYWwsIGNyaXRpY2FsLCBjbGVuKTsKLQlidWZmZXJfYXBwZW5kKCZ0bXAsIGNyaXRpY2FsLCBjbGVuKTsKLQkvKiB2YWxpZGF0ZSBzdHJ1Y3R1cmUgKi8KLQl3aGlsZSAoYnVmZmVyX2xlbigmdG1wKSAhPSAwKSB7Ci0JCWlmIChidWZmZXJfZ2V0X3N0cmluZ19wdHJfcmV0KCZ0bXAsIE5VTEwpID09IE5VTEwgfHwKLQkJICAgIGJ1ZmZlcl9nZXRfc3RyaW5nX3B0cl9yZXQoJnRtcCwgTlVMTCkgPT0gTlVMTCkgewotCQkJZXJyb3IoIiVzOiBjcml0aWNhbCBvcHRpb24gZGF0YSBpbnZhbGlkIiwgX19mdW5jX18pOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0JYnVmZmVyX2NsZWFyKCZ0bXApOwotCi0JYnVmZmVyX2FwcGVuZCgma2V5LT5jZXJ0LT5leHRlbnNpb25zLCBleHRzLCBlbGVuKTsKLQlidWZmZXJfYXBwZW5kKCZ0bXAsIGV4dHMsIGVsZW4pOwotCS8qIHZhbGlkYXRlIHN0cnVjdHVyZSAqLwotCXdoaWxlIChidWZmZXJfbGVuKCZ0bXApICE9IDApIHsKLQkJaWYgKGJ1ZmZlcl9nZXRfc3RyaW5nX3B0cl9yZXQoJnRtcCwgTlVMTCkgPT0gTlVMTCB8fAotCQkgICAgYnVmZmVyX2dldF9zdHJpbmdfcHRyX3JldCgmdG1wLCBOVUxMKSA9PSBOVUxMKSB7Ci0JCQllcnJvcigiJXM6IGV4dGVuc2lvbiBkYXRhIGludmFsaWQiLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQlidWZmZXJfY2xlYXIoJnRtcCk7Ci0KLQlpZiAoKGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleSA9IGtleV9mcm9tX2Jsb2Ioc2lnX2tleSwKLQkgICAgc2tsZW4pKSA9PSBOVUxMKSB7Ci0JCWVycm9yKCIlczogU2lnbmF0dXJlIGtleSBpbnZhbGlkIiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleS0+dHlwZSAhPSBLRVlfUlNBICYmCi0JICAgIGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleS0+dHlwZSAhPSBLRVlfRFNBICYmCi0JICAgIGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleS0+dHlwZSAhPSBLRVlfRUNEU0EpIHsKLQkJZXJyb3IoIiVzOiBJbnZhbGlkIHNpZ25hdHVyZSBrZXkgdHlwZSAlcyAoJWQpIiwgX19mdW5jX18sCi0JCSAgICBrZXlfdHlwZShrZXktPmNlcnQtPnNpZ25hdHVyZV9rZXkpLAotCQkgICAga2V5LT5jZXJ0LT5zaWduYXR1cmVfa2V5LT50eXBlKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3dpdGNoIChrZXlfdmVyaWZ5KGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleSwgc2lnLCBzbGVuLCAKLQkgICAgYnVmZmVyX3B0cigma2V5LT5jZXJ0LT5jZXJ0YmxvYiksIHNpZ25lZF9sZW4pKSB7Ci0JY2FzZSAxOgotCQlyZXQgPSAwOwotCQlicmVhazsgLyogR29vZCBzaWduYXR1cmUgKi8KLQljYXNlIDA6Ci0JCWVycm9yKCIlczogSW52YWxpZCBzaWduYXR1cmUgb24gY2VydGlmaWNhdGUiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCWNhc2UgLTE6Ci0JCWVycm9yKCIlczogQ2VydGlmaWNhdGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQiLAotCQkgICAgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0KLSBvdXQ6Ci0JYnVmZmVyX2ZyZWUoJnRtcCk7Ci0JaWYgKHByaW5jaXBhbHMgIT0gTlVMTCkKLQkJeGZyZWUocHJpbmNpcGFscyk7Ci0JaWYgKGNyaXRpY2FsICE9IE5VTEwpCi0JCXhmcmVlKGNyaXRpY2FsKTsKLQlpZiAoZXh0cyAhPSBOVUxMKQotCQl4ZnJlZShleHRzKTsKLQlpZiAoc2lnX2tleSAhPSBOVUxMKQotCQl4ZnJlZShzaWdfa2V5KTsKLQlpZiAoc2lnICE9IE5VTEwpCi0JCXhmcmVlKHNpZyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotS2V5ICoKLWtleV9mcm9tX2Jsb2IoY29uc3QgdV9jaGFyICpibG9iLCB1X2ludCBibGVuKQotewotCUJ1ZmZlciBiOwotCWludCBybGVuLCB0eXBlOwotCWNoYXIgKmt0eXBlID0gTlVMTCwgKmN1cnZlID0gTlVMTDsKLQlLZXkgKmtleSA9IE5VTEw7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JRUNfUE9JTlQgKnEgPSBOVUxMOwotCWludCBuaWQgPSAtMTsKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUEsKLQlkdW1wX2Jhc2U2NChzdGRlcnIsIGJsb2IsIGJsZW4pOwotI2VuZGlmCi0JYnVmZmVyX2luaXQoJmIpOwotCWJ1ZmZlcl9hcHBlbmQoJmIsIGJsb2IsIGJsZW4pOwotCWlmICgoa3R5cGUgPSBidWZmZXJfZ2V0X2NzdHJpbmdfcmV0KCZiLCBOVUxMKSkgPT0gTlVMTCkgewotCQllcnJvcigia2V5X2Zyb21fYmxvYjogY2FuJ3QgcmVhZCBrZXkgdHlwZSIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl0eXBlID0ga2V5X3R5cGVfZnJvbV9uYW1lKGt0eXBlKTsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQlpZiAoa2V5X3R5cGVfcGxhaW4odHlwZSkgPT0gS0VZX0VDRFNBKQotCQluaWQgPSBrZXlfZWNkc2FfbmlkX2Zyb21fbmFtZShrdHlwZSk7Ci0jZW5kaWYKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgS0VZX1JTQV9DRVJUOgotCQkodm9pZClidWZmZXJfZ2V0X3N0cmluZ19wdHJfcmV0KCZiLCBOVUxMKTsgLyogU2tpcCBub25jZSAqLwotCQkvKiBGQUxMVEhST1VHSCAqLwotCWNhc2UgS0VZX1JTQToKLQljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6Ci0JCWtleSA9IGtleV9uZXcodHlwZSk7Ci0JCWlmIChidWZmZXJfZ2V0X2JpZ251bTJfcmV0KCZiLCBrZXktPnJzYS0+ZSkgPT0gLTEgfHwKLQkJICAgIGJ1ZmZlcl9nZXRfYmlnbnVtMl9yZXQoJmIsIGtleS0+cnNhLT5uKSA9PSAtMSkgewotCQkJZXJyb3IoImtleV9mcm9tX2Jsb2I6IGNhbid0IHJlYWQgcnNhIGtleSIpOwotIGJhZGtleToKLQkJCWtleV9mcmVlKGtleSk7Ci0JCQlrZXkgPSBOVUxMOwotCQkJZ290byBvdXQ7Ci0JCX0KLSNpZmRlZiBERUJVR19QSwotCQlSU0FfcHJpbnRfZnAoc3RkZXJyLCBrZXktPnJzYSwgOCk7Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JY2FzZSBLRVlfRFNBX0NFUlQ6Ci0JCSh2b2lkKWJ1ZmZlcl9nZXRfc3RyaW5nX3B0cl9yZXQoJmIsIE5VTEwpOyAvKiBTa2lwIG5vbmNlICovCi0JCS8qIEZBTExUSFJPVUdIICovCi0JY2FzZSBLRVlfRFNBOgotCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKLQkJa2V5ID0ga2V5X25ldyh0eXBlKTsKLQkJaWYgKGJ1ZmZlcl9nZXRfYmlnbnVtMl9yZXQoJmIsIGtleS0+ZHNhLT5wKSA9PSAtMSB8fAotCQkgICAgYnVmZmVyX2dldF9iaWdudW0yX3JldCgmYiwga2V5LT5kc2EtPnEpID09IC0xIHx8Ci0JCSAgICBidWZmZXJfZ2V0X2JpZ251bTJfcmV0KCZiLCBrZXktPmRzYS0+ZykgPT0gLTEgfHwKLQkJICAgIGJ1ZmZlcl9nZXRfYmlnbnVtMl9yZXQoJmIsIGtleS0+ZHNhLT5wdWJfa2V5KSA9PSAtMSkgewotCQkJZXJyb3IoImtleV9mcm9tX2Jsb2I6IGNhbid0IHJlYWQgZHNhIGtleSIpOwotCQkJZ290byBiYWRrZXk7Ci0JCX0KLSNpZmRlZiBERUJVR19QSwotCQlEU0FfcHJpbnRfZnAoc3RkZXJyLCBrZXktPmRzYSwgOCk7Ci0jZW5kaWYKLQkJYnJlYWs7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JY2FzZSBLRVlfRUNEU0FfQ0VSVDoKLQkJKHZvaWQpYnVmZmVyX2dldF9zdHJpbmdfcHRyX3JldCgmYiwgTlVMTCk7IC8qIFNraXAgbm9uY2UgKi8KLQkJLyogRkFMTFRIUk9VR0ggKi8KLQljYXNlIEtFWV9FQ0RTQToKLQkJa2V5ID0ga2V5X25ldyh0eXBlKTsKLQkJa2V5LT5lY2RzYV9uaWQgPSBuaWQ7Ci0JCWlmICgoY3VydmUgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQoJmIsIE5VTEwpKSA9PSBOVUxMKSB7Ci0JCQllcnJvcigia2V5X2Zyb21fYmxvYjogY2FuJ3QgcmVhZCBlY2RzYSBjdXJ2ZSIpOwotCQkJZ290byBiYWRrZXk7Ci0JCX0KLQkJaWYgKGtleS0+ZWNkc2FfbmlkICE9IGtleV9jdXJ2ZV9uYW1lX3RvX25pZChjdXJ2ZSkpIHsKLQkJCWVycm9yKCJrZXlfZnJvbV9ibG9iOiBlY2RzYSBjdXJ2ZSBkb2Vzbid0IG1hdGNoIHR5cGUiKTsKLQkJCWdvdG8gYmFka2V5OwotCQl9Ci0JCWlmIChrZXktPmVjZHNhICE9IE5VTEwpCi0JCQlFQ19LRVlfZnJlZShrZXktPmVjZHNhKTsKLQkJaWYgKChrZXktPmVjZHNhID0gRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKGtleS0+ZWNkc2FfbmlkKSkKLQkJICAgID09IE5VTEwpCi0JCQlmYXRhbCgia2V5X2Zyb21fYmxvYjogRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lIGZhaWxlZCIpOwotCQlpZiAoKHEgPSBFQ19QT0lOVF9uZXcoRUNfS0VZX2dldDBfZ3JvdXAoa2V5LT5lY2RzYSkpKSA9PSBOVUxMKQotCQkJZmF0YWwoImtleV9mcm9tX2Jsb2I6IEVDX1BPSU5UX25ldyBmYWlsZWQiKTsKLQkJaWYgKGJ1ZmZlcl9nZXRfZWNwb2ludF9yZXQoJmIsIEVDX0tFWV9nZXQwX2dyb3VwKGtleS0+ZWNkc2EpLAotCQkgICAgcSkgPT0gLTEpIHsKLQkJCWVycm9yKCJrZXlfZnJvbV9ibG9iOiBjYW4ndCByZWFkIGVjZHNhIGtleSBwb2ludCIpOwotCQkJZ290byBiYWRrZXk7Ci0JCX0KLQkJaWYgKGtleV9lY192YWxpZGF0ZV9wdWJsaWMoRUNfS0VZX2dldDBfZ3JvdXAoa2V5LT5lY2RzYSksCi0JCSAgICBxKSAhPSAwKQotCQkJZ290byBiYWRrZXk7Ci0JCWlmIChFQ19LRVlfc2V0X3B1YmxpY19rZXkoa2V5LT5lY2RzYSwgcSkgIT0gMSkKLQkJCWZhdGFsKCJrZXlfZnJvbV9ibG9iOiBFQ19LRVlfc2V0X3B1YmxpY19rZXkgZmFpbGVkIik7Ci0jaWZkZWYgREVCVUdfUEsKLQkJa2V5X2R1bXBfZWNfcG9pbnQoRUNfS0VZX2dldDBfZ3JvdXAoa2V5LT5lY2RzYSksIHEpOwotI2VuZGlmCi0JCWJyZWFrOwotI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLwotCWNhc2UgS0VZX1VOU1BFQzoKLQkJa2V5ID0ga2V5X25ldyh0eXBlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyb3IoImtleV9mcm9tX2Jsb2I6IGNhbm5vdCBoYW5kbGUgdHlwZSAlcyIsIGt0eXBlKTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChrZXlfaXNfY2VydChrZXkpICYmIGNlcnRfcGFyc2UoJmIsIGtleSwgYmxvYiwgYmxlbikgPT0gLTEpIHsKLQkJZXJyb3IoImtleV9mcm9tX2Jsb2I6IGNhbid0IHBhcnNlIGNlcnQgZGF0YSIpOwotCQlnb3RvIGJhZGtleTsKLQl9Ci0JcmxlbiA9IGJ1ZmZlcl9sZW4oJmIpOwotCWlmIChrZXkgIT0gTlVMTCAmJiBybGVuICE9IDApCi0JCWVycm9yKCJrZXlfZnJvbV9ibG9iOiByZW1haW5pbmcgYnl0ZXMgaW4ga2V5IGJsb2IgJWQiLCBybGVuKTsKLSBvdXQ6Ci0JaWYgKGt0eXBlICE9IE5VTEwpCi0JCXhmcmVlKGt0eXBlKTsKLQlpZiAoY3VydmUgIT0gTlVMTCkKLQkJeGZyZWUoY3VydmUpOwotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCWlmIChxICE9IE5VTEwpCi0JCUVDX1BPSU5UX2ZyZWUocSk7Ci0jZW5kaWYKLQlidWZmZXJfZnJlZSgmYik7Ci0JcmV0dXJuIGtleTsKLX0KLQotaW50Ci1rZXlfdG9fYmxvYihjb25zdCBLZXkgKmtleSwgdV9jaGFyICoqYmxvYnAsIHVfaW50ICpsZW5wKQotewotCUJ1ZmZlciBiOwotCWludCBsZW47Ci0KLQlpZiAoa2V5ID09IE5VTEwpIHsKLQkJZXJyb3IoImtleV90b19ibG9iOiBrZXkgPT0gTlVMTCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JYnVmZmVyX2luaXQoJmIpOwotCXN3aXRjaCAoa2V5LT50eXBlKSB7Ci0JY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9EU0FfQ0VSVDoKLQljYXNlIEtFWV9FQ0RTQV9DRVJUOgotCWNhc2UgS0VZX1JTQV9DRVJUOgotCQkvKiBVc2UgdGhlIGV4aXN0aW5nIGJsb2IgKi8KLQkJYnVmZmVyX2FwcGVuZCgmYiwgYnVmZmVyX3B0cigma2V5LT5jZXJ0LT5jZXJ0YmxvYiksCi0JCSAgICBidWZmZXJfbGVuKCZrZXktPmNlcnQtPmNlcnRibG9iKSk7Ci0JCWJyZWFrOwotCWNhc2UgS0VZX0RTQToKLQkJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBrZXlfc3NoX25hbWUoa2V5KSk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwga2V5LT5kc2EtPnApOwotCQlidWZmZXJfcHV0X2JpZ251bTIoJmIsIGtleS0+ZHNhLT5xKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBrZXktPmRzYS0+Zyk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwga2V5LT5kc2EtPnB1Yl9rZXkpOwotCQlicmVhazsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQljYXNlIEtFWV9FQ0RTQToKLQkJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBrZXlfc3NoX25hbWUoa2V5KSk7Ci0JCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwga2V5X2N1cnZlX25pZF90b19uYW1lKGtleS0+ZWNkc2FfbmlkKSk7Ci0JCWJ1ZmZlcl9wdXRfZWNwb2ludCgmYiwgRUNfS0VZX2dldDBfZ3JvdXAoa2V5LT5lY2RzYSksCi0JCSAgICBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGtleS0+ZWNkc2EpKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQljYXNlIEtFWV9SU0E6Ci0JCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwga2V5X3NzaF9uYW1lKGtleSkpOwotCQlidWZmZXJfcHV0X2JpZ251bTIoJmIsIGtleS0+cnNhLT5lKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBrZXktPnJzYS0+bik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycm9yKCJrZXlfdG9fYmxvYjogdW5zdXBwb3J0ZWQga2V5IHR5cGUgJWQiLCBrZXktPnR5cGUpOwotCQlidWZmZXJfZnJlZSgmYik7Ci0JCXJldHVybiAwOwotCX0KLQlsZW4gPSBidWZmZXJfbGVuKCZiKTsKLQlpZiAobGVucCAhPSBOVUxMKQotCQkqbGVucCA9IGxlbjsKLQlpZiAoYmxvYnAgIT0gTlVMTCkgewotCQkqYmxvYnAgPSB4bWFsbG9jKGxlbik7Ci0JCW1lbWNweSgqYmxvYnAsIGJ1ZmZlcl9wdHIoJmIpLCBsZW4pOwotCX0KLQltZW1zZXQoYnVmZmVyX3B0cigmYiksIDAsIGxlbik7Ci0JYnVmZmVyX2ZyZWUoJmIpOwotCXJldHVybiBsZW47Ci19Ci0KLWludAota2V5X3NpZ24oCi0gICAgY29uc3QgS2V5ICprZXksCi0gICAgdV9jaGFyICoqc2lncCwgdV9pbnQgKmxlbnAsCi0gICAgY29uc3QgdV9jaGFyICpkYXRhLCB1X2ludCBkYXRhbGVuKQotewotCXN3aXRjaCAoa2V5LT50eXBlKSB7Ci0JY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX0RTQV9DRVJUOgotCWNhc2UgS0VZX0RTQToKLQkJcmV0dXJuIHNzaF9kc3Nfc2lnbihrZXksIHNpZ3AsIGxlbnAsIGRhdGEsIGRhdGFsZW4pOwotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCWNhc2UgS0VZX0VDRFNBX0NFUlQ6Ci0JY2FzZSBLRVlfRUNEU0E6Ci0JCXJldHVybiBzc2hfZWNkc2Ffc2lnbihrZXksIHNpZ3AsIGxlbnAsIGRhdGEsIGRhdGFsZW4pOwotI2VuZGlmCi0JY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX1JTQV9DRVJUOgotCWNhc2UgS0VZX1JTQToKLQkJcmV0dXJuIHNzaF9yc2Ffc2lnbihrZXksIHNpZ3AsIGxlbnAsIGRhdGEsIGRhdGFsZW4pOwotCWRlZmF1bHQ6Ci0JCWVycm9yKCJrZXlfc2lnbjogaW52YWxpZCBrZXkgdHlwZSAlZCIsIGtleS0+dHlwZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLS8qCi0gKiBrZXlfdmVyaWZ5IHJldHVybnMgMSBmb3IgYSBjb3JyZWN0IHNpZ25hdHVyZSwgMCBmb3IgYW4gaW5jb3JyZWN0IHNpZ25hdHVyZQotICogYW5kIC0xIG9uIGVycm9yLgotICovCi1pbnQKLWtleV92ZXJpZnkoCi0gICAgY29uc3QgS2V5ICprZXksCi0gICAgY29uc3QgdV9jaGFyICpzaWduYXR1cmUsIHVfaW50IHNpZ25hdHVyZWxlbiwKLSAgICBjb25zdCB1X2NoYXIgKmRhdGEsIHVfaW50IGRhdGFsZW4pCi17Ci0JaWYgKHNpZ25hdHVyZWxlbiA9PSAwKQotCQlyZXR1cm4gLTE7Ci0KLQlzd2l0Y2ggKGtleS0+dHlwZSkgewotCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9EU0FfQ0VSVDoKLQljYXNlIEtFWV9EU0E6Ci0JCXJldHVybiBzc2hfZHNzX3ZlcmlmeShrZXksIHNpZ25hdHVyZSwgc2lnbmF0dXJlbGVuLCBkYXRhLCBkYXRhbGVuKTsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQljYXNlIEtFWV9FQ0RTQV9DRVJUOgotCWNhc2UgS0VZX0VDRFNBOgotCQlyZXR1cm4gc3NoX2VjZHNhX3ZlcmlmeShrZXksIHNpZ25hdHVyZSwgc2lnbmF0dXJlbGVuLCBkYXRhLCBkYXRhbGVuKTsKLSNlbmRpZgotCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9SU0FfQ0VSVDoKLQljYXNlIEtFWV9SU0E6Ci0JCXJldHVybiBzc2hfcnNhX3ZlcmlmeShrZXksIHNpZ25hdHVyZSwgc2lnbmF0dXJlbGVuLCBkYXRhLCBkYXRhbGVuKTsKLQlkZWZhdWx0OgotCQllcnJvcigia2V5X3ZlcmlmeTogaW52YWxpZCBrZXkgdHlwZSAlZCIsIGtleS0+dHlwZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLS8qIENvbnZlcnRzIGEgcHJpdmF0ZSB0byBhIHB1YmxpYyBrZXkgKi8KLUtleSAqCi1rZXlfZGVtb3RlKGNvbnN0IEtleSAqaykKLXsKLQlLZXkgKnBrOwotCi0JcGsgPSB4Y2FsbG9jKDEsIHNpemVvZigqcGspKTsKLQlway0+dHlwZSA9IGstPnR5cGU7Ci0JcGstPmZsYWdzID0gay0+ZmxhZ3M7Ci0JcGstPmVjZHNhX25pZCA9IGstPmVjZHNhX25pZDsKLQlway0+ZHNhID0gTlVMTDsKLQlway0+ZWNkc2EgPSBOVUxMOwotCXBrLT5yc2EgPSBOVUxMOwotCi0Jc3dpdGNoIChrLT50eXBlKSB7Ci0JY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX1JTQV9DRVJUOgotCQlrZXlfY2VydF9jb3B5KGssIHBrKTsKLQkJLyogRkFMTFRIUk9VR0ggKi8KLQljYXNlIEtFWV9SU0ExOgotCWNhc2UgS0VZX1JTQToKLQkJaWYgKChway0+cnNhID0gUlNBX25ldygpKSA9PSBOVUxMKQotCQkJZmF0YWwoImtleV9kZW1vdGU6IFJTQV9uZXcgZmFpbGVkIik7Ci0JCWlmICgocGstPnJzYS0+ZSA9IEJOX2R1cChrLT5yc2EtPmUpKSA9PSBOVUxMKQotCQkJZmF0YWwoImtleV9kZW1vdGU6IEJOX2R1cCBmYWlsZWQiKTsKLQkJaWYgKChway0+cnNhLT5uID0gQk5fZHVwKGstPnJzYS0+bikpID09IE5VTEwpCi0JCQlmYXRhbCgia2V5X2RlbW90ZTogQk5fZHVwIGZhaWxlZCIpOwotCQlicmVhazsKLQljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6Ci0JY2FzZSBLRVlfRFNBX0NFUlQ6Ci0JCWtleV9jZXJ0X2NvcHkoaywgcGspOwotCQkvKiBGQUxMVEhST1VHSCAqLwotCWNhc2UgS0VZX0RTQToKLQkJaWYgKChway0+ZHNhID0gRFNBX25ldygpKSA9PSBOVUxMKQotCQkJZmF0YWwoImtleV9kZW1vdGU6IERTQV9uZXcgZmFpbGVkIik7Ci0JCWlmICgocGstPmRzYS0+cCA9IEJOX2R1cChrLT5kc2EtPnApKSA9PSBOVUxMKQotCQkJZmF0YWwoImtleV9kZW1vdGU6IEJOX2R1cCBmYWlsZWQiKTsKLQkJaWYgKChway0+ZHNhLT5xID0gQk5fZHVwKGstPmRzYS0+cSkpID09IE5VTEwpCi0JCQlmYXRhbCgia2V5X2RlbW90ZTogQk5fZHVwIGZhaWxlZCIpOwotCQlpZiAoKHBrLT5kc2EtPmcgPSBCTl9kdXAoay0+ZHNhLT5nKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCJrZXlfZGVtb3RlOiBCTl9kdXAgZmFpbGVkIik7Ci0JCWlmICgocGstPmRzYS0+cHViX2tleSA9IEJOX2R1cChrLT5kc2EtPnB1Yl9rZXkpKSA9PSBOVUxMKQotCQkJZmF0YWwoImtleV9kZW1vdGU6IEJOX2R1cCBmYWlsZWQiKTsKLQkJYnJlYWs7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JY2FzZSBLRVlfRUNEU0FfQ0VSVDoKLQkJa2V5X2NlcnRfY29weShrLCBwayk7Ci0JCS8qIEZBTExUSFJPVUdIICovCi0JY2FzZSBLRVlfRUNEU0E6Ci0JCWlmICgocGstPmVjZHNhID0gRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKHBrLT5lY2RzYV9uaWQpKSA9PSBOVUxMKQotCQkJZmF0YWwoImtleV9kZW1vdGU6IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZSBmYWlsZWQiKTsKLQkJaWYgKEVDX0tFWV9zZXRfcHVibGljX2tleShway0+ZWNkc2EsCi0JCSAgICBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGstPmVjZHNhKSkgIT0gMSkKLQkJCWZhdGFsKCJrZXlfZGVtb3RlOiBFQ19LRVlfc2V0X3B1YmxpY19rZXkgZmFpbGVkIik7Ci0JCWJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkJZmF0YWwoImtleV9mcmVlOiBiYWQga2V5IHR5cGUgJWQiLCBrLT50eXBlKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIChwayk7Ci19Ci0KLWludAota2V5X2lzX2NlcnQoY29uc3QgS2V5ICprKQotewotCWlmIChrID09IE5VTEwpCi0JCXJldHVybiAwOwotCXN3aXRjaCAoay0+dHlwZSkgewotCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6Ci0JY2FzZSBLRVlfUlNBX0NFUlQ6Ci0JY2FzZSBLRVlfRFNBX0NFUlQ6Ci0JY2FzZSBLRVlfRUNEU0FfQ0VSVDoKLQkJcmV0dXJuIDE7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKiBSZXR1cm4gdGhlIGNlcnQtbGVzcyBlcXVpdmFsZW50IHRvIGEgY2VydGlmaWVkIGtleSB0eXBlICovCi1pbnQKLWtleV90eXBlX3BsYWluKGludCB0eXBlKQotewotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9SU0FfQ0VSVDoKLQkJcmV0dXJuIEtFWV9SU0E7Ci0JY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX0RTQV9DRVJUOgotCQlyZXR1cm4gS0VZX0RTQTsKLQljYXNlIEtFWV9FQ0RTQV9DRVJUOgotCQlyZXR1cm4gS0VZX0VDRFNBOwotCWRlZmF1bHQ6Ci0JCXJldHVybiB0eXBlOwotCX0KLX0KLQotLyogQ29udmVydCBhIEtFWV9SU0Egb3IgS0VZX0RTQSB0byB0aGVpciBfQ0VSVCBlcXVpdmFsZW50ICovCi1pbnQKLWtleV90b19jZXJ0aWZpZWQoS2V5ICprLCBpbnQgbGVnYWN5KQotewotCXN3aXRjaCAoay0+dHlwZSkgewotCWNhc2UgS0VZX1JTQToKLQkJay0+Y2VydCA9IGNlcnRfbmV3KCk7Ci0JCWstPnR5cGUgPSBsZWdhY3kgPyBLRVlfUlNBX0NFUlRfVjAwIDogS0VZX1JTQV9DRVJUOwotCQlyZXR1cm4gMDsKLQljYXNlIEtFWV9EU0E6Ci0JCWstPmNlcnQgPSBjZXJ0X25ldygpOwotCQlrLT50eXBlID0gbGVnYWN5ID8gS0VZX0RTQV9DRVJUX1YwMCA6IEtFWV9EU0FfQ0VSVDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBLRVlfRUNEU0E6Ci0JCWlmIChsZWdhY3kpCi0JCQlmYXRhbCgiJXM6IGxlZ2FjeSBFQ0RTQSBjZXJ0aWZpY2F0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQiLAotCQkJICAgIF9fZnVuY19fKTsKLQkJay0+Y2VydCA9IGNlcnRfbmV3KCk7Ci0JCWstPnR5cGUgPSBLRVlfRUNEU0FfQ0VSVDsKLQkJcmV0dXJuIDA7Ci0JZGVmYXVsdDoKLQkJZXJyb3IoIiVzOiBrZXkgaGFzIGluY29ycmVjdCB0eXBlICVzIiwgX19mdW5jX18sIGtleV90eXBlKGspKTsKLQkJcmV0dXJuIC0xOwotCX0KLX0KLQotLyogQ29udmVydCBhIEtFWV9SU0FfQ0VSVCBvciBLRVlfRFNBX0NFUlQgdG8gdGhlaXIgcmF3IGtleSBlcXVpdmFsZW50ICovCi1pbnQKLWtleV9kcm9wX2NlcnQoS2V5ICprKQotewotCXN3aXRjaCAoay0+dHlwZSkgewotCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKLQljYXNlIEtFWV9SU0FfQ0VSVDoKLQkJY2VydF9mcmVlKGstPmNlcnQpOwotCQlrLT50eXBlID0gS0VZX1JTQTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX0RTQV9DRVJUOgotCQljZXJ0X2ZyZWUoay0+Y2VydCk7Ci0JCWstPnR5cGUgPSBLRVlfRFNBOwotCQlyZXR1cm4gMDsKLQljYXNlIEtFWV9FQ0RTQV9DRVJUOgotCQljZXJ0X2ZyZWUoay0+Y2VydCk7Ci0JCWstPnR5cGUgPSBLRVlfRUNEU0E7Ci0JCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCWVycm9yKCIlczoga2V5IGhhcyBpbmNvcnJlY3QgdHlwZSAlcyIsIF9fZnVuY19fLCBrZXlfdHlwZShrKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLS8qCi0gKiBTaWduIGEgS0VZX1JTQV9DRVJULCBLRVlfRFNBX0NFUlQgb3IgS0VZX0VDRFNBX0NFUlQsIChyZS0pZ2VuZXJhdGluZwotICogdGhlIHNpZ25lZCBjZXJ0YmxvYgotICovCi1pbnQKLWtleV9jZXJ0aWZ5KEtleSAqaywgS2V5ICpjYSkKLXsKLQlCdWZmZXIgcHJpbmNpcGFsczsKLQl1X2NoYXIgKmNhX2Jsb2IsICpzaWdfYmxvYiwgbm9uY2VbMzJdOwotCXVfaW50IGksIGNhX2xlbiwgc2lnX2xlbjsKLQotCWlmIChrLT5jZXJ0ID09IE5VTEwpIHsKLQkJZXJyb3IoIiVzOiBrZXkgbGFja3MgY2VydCBpbmZvIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCFrZXlfaXNfY2VydChrKSkgewotCQllcnJvcigiJXM6IGNlcnRpZmljYXRlIGhhcyB1bmtub3duIHR5cGUgJWQiLCBfX2Z1bmNfXywKLQkJICAgIGstPmNlcnQtPnR5cGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGNhLT50eXBlICE9IEtFWV9SU0EgJiYgY2EtPnR5cGUgIT0gS0VZX0RTQSAmJgotCSAgICBjYS0+dHlwZSAhPSBLRVlfRUNEU0EpIHsKLQkJZXJyb3IoIiVzOiBDQSBrZXkgaGFzIHVuc3VwcG9ydGVkIHR5cGUgJXMiLCBfX2Z1bmNfXywKLQkJICAgIGtleV90eXBlKGNhKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlrZXlfdG9fYmxvYihjYSwgJmNhX2Jsb2IsICZjYV9sZW4pOwotCi0JYnVmZmVyX2NsZWFyKCZrLT5jZXJ0LT5jZXJ0YmxvYik7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZrLT5jZXJ0LT5jZXJ0YmxvYiwga2V5X3NzaF9uYW1lKGspKTsKLQotCS8qIC12MDEgY2VydHMgcHV0IG5vbmNlIGZpcnN0ICovCi0JYXJjNHJhbmRvbV9idWYoJm5vbmNlLCBzaXplb2Yobm9uY2UpKTsKLQlpZiAoIWtleV9jZXJ0X2lzX2xlZ2FjeShrKSkKLQkJYnVmZmVyX3B1dF9zdHJpbmcoJmstPmNlcnQtPmNlcnRibG9iLCBub25jZSwgc2l6ZW9mKG5vbmNlKSk7Ci0KLQlzd2l0Y2ggKGstPnR5cGUpIHsKLQljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6Ci0JY2FzZSBLRVlfRFNBX0NFUlQ6Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtMigmay0+Y2VydC0+Y2VydGJsb2IsIGstPmRzYS0+cCk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtMigmay0+Y2VydC0+Y2VydGJsb2IsIGstPmRzYS0+cSk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtMigmay0+Y2VydC0+Y2VydGJsb2IsIGstPmRzYS0+Zyk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtMigmay0+Y2VydC0+Y2VydGJsb2IsIGstPmRzYS0+cHViX2tleSk7Ci0JCWJyZWFrOwotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCWNhc2UgS0VZX0VDRFNBX0NFUlQ6Ci0JCWJ1ZmZlcl9wdXRfY3N0cmluZygmay0+Y2VydC0+Y2VydGJsb2IsCi0JCSAgICBrZXlfY3VydmVfbmlkX3RvX25hbWUoay0+ZWNkc2FfbmlkKSk7Ci0JCWJ1ZmZlcl9wdXRfZWNwb2ludCgmay0+Y2VydC0+Y2VydGJsb2IsCi0JCSAgICBFQ19LRVlfZ2V0MF9ncm91cChrLT5lY2RzYSksCi0JCSAgICBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGstPmVjZHNhKSk7Ci0JCWJyZWFrOwotI2VuZGlmCi0JY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX1JTQV9DRVJUOgotCQlidWZmZXJfcHV0X2JpZ251bTIoJmstPmNlcnQtPmNlcnRibG9iLCBrLT5yc2EtPmUpOwotCQlidWZmZXJfcHV0X2JpZ251bTIoJmstPmNlcnQtPmNlcnRibG9iLCBrLT5yc2EtPm4pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQllcnJvcigiJXM6IGtleSBoYXMgaW5jb3JyZWN0IHR5cGUgJXMiLCBfX2Z1bmNfXywga2V5X3R5cGUoaykpOwotCQlidWZmZXJfY2xlYXIoJmstPmNlcnQtPmNlcnRibG9iKTsKLQkJeGZyZWUoY2FfYmxvYik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiAtdjAxIGNlcnRzIGhhdmUgYSBzZXJpYWwgbnVtYmVyIG5leHQgKi8KLQlpZiAoIWtleV9jZXJ0X2lzX2xlZ2FjeShrKSkKLQkJYnVmZmVyX3B1dF9pbnQ2NCgmay0+Y2VydC0+Y2VydGJsb2IsIGstPmNlcnQtPnNlcmlhbCk7Ci0KLQlidWZmZXJfcHV0X2ludCgmay0+Y2VydC0+Y2VydGJsb2IsIGstPmNlcnQtPnR5cGUpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmay0+Y2VydC0+Y2VydGJsb2IsIGstPmNlcnQtPmtleV9pZCk7Ci0KLQlidWZmZXJfaW5pdCgmcHJpbmNpcGFscyk7Ci0JZm9yIChpID0gMDsgaSA8IGstPmNlcnQtPm5wcmluY2lwYWxzOyBpKyspCi0JCWJ1ZmZlcl9wdXRfY3N0cmluZygmcHJpbmNpcGFscywgay0+Y2VydC0+cHJpbmNpcGFsc1tpXSk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJmstPmNlcnQtPmNlcnRibG9iLCBidWZmZXJfcHRyKCZwcmluY2lwYWxzKSwKLQkgICAgYnVmZmVyX2xlbigmcHJpbmNpcGFscykpOwotCWJ1ZmZlcl9mcmVlKCZwcmluY2lwYWxzKTsKLQotCWJ1ZmZlcl9wdXRfaW50NjQoJmstPmNlcnQtPmNlcnRibG9iLCBrLT5jZXJ0LT52YWxpZF9hZnRlcik7Ci0JYnVmZmVyX3B1dF9pbnQ2NCgmay0+Y2VydC0+Y2VydGJsb2IsIGstPmNlcnQtPnZhbGlkX2JlZm9yZSk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJmstPmNlcnQtPmNlcnRibG9iLAotCSAgICBidWZmZXJfcHRyKCZrLT5jZXJ0LT5jcml0aWNhbCksIGJ1ZmZlcl9sZW4oJmstPmNlcnQtPmNyaXRpY2FsKSk7Ci0KLQkvKiAtdjAxIGNlcnRzIGhhdmUgbm9uLWNyaXRpY2FsIG9wdGlvbnMgaGVyZSAqLwotCWlmICgha2V5X2NlcnRfaXNfbGVnYWN5KGspKSB7Ci0JCWJ1ZmZlcl9wdXRfc3RyaW5nKCZrLT5jZXJ0LT5jZXJ0YmxvYiwKLQkJICAgIGJ1ZmZlcl9wdHIoJmstPmNlcnQtPmV4dGVuc2lvbnMpLAotCQkgICAgYnVmZmVyX2xlbigmay0+Y2VydC0+ZXh0ZW5zaW9ucykpOwotCX0KLQotCS8qIC12MDAgY2VydHMgcHV0IHRoZSBub25jZSBhdCB0aGUgZW5kICovCi0JaWYgKGtleV9jZXJ0X2lzX2xlZ2FjeShrKSkKLQkJYnVmZmVyX3B1dF9zdHJpbmcoJmstPmNlcnQtPmNlcnRibG9iLCBub25jZSwgc2l6ZW9mKG5vbmNlKSk7Ci0KLQlidWZmZXJfcHV0X3N0cmluZygmay0+Y2VydC0+Y2VydGJsb2IsIE5VTEwsIDApOyAvKiByZXNlcnZlZCAqLwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZrLT5jZXJ0LT5jZXJ0YmxvYiwgY2FfYmxvYiwgY2FfbGVuKTsKLQl4ZnJlZShjYV9ibG9iKTsKLQotCS8qIFNpZ24gdGhlIHdob2xlIG1lc3MgKi8KLQlpZiAoa2V5X3NpZ24oY2EsICZzaWdfYmxvYiwgJnNpZ19sZW4sIGJ1ZmZlcl9wdHIoJmstPmNlcnQtPmNlcnRibG9iKSwKLQkgICAgYnVmZmVyX2xlbigmay0+Y2VydC0+Y2VydGJsb2IpKSAhPSAwKSB7Ci0JCWVycm9yKCIlczogc2lnbmF0dXJlIG9wZXJhdGlvbiBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCWJ1ZmZlcl9jbGVhcigmay0+Y2VydC0+Y2VydGJsb2IpOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qIEFwcGVuZCBzaWduYXR1cmUgYW5kIHdlIGFyZSBkb25lICovCi0JYnVmZmVyX3B1dF9zdHJpbmcoJmstPmNlcnQtPmNlcnRibG9iLCBzaWdfYmxvYiwgc2lnX2xlbik7Ci0JeGZyZWUoc2lnX2Jsb2IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAota2V5X2NlcnRfY2hlY2tfYXV0aG9yaXR5KGNvbnN0IEtleSAqaywgaW50IHdhbnRfaG9zdCwgaW50IHJlcXVpcmVfcHJpbmNpcGFsLAotICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipyZWFzb24pCi17Ci0JdV9pbnQgaSwgcHJpbmNpcGFsX21hdGNoZXM7Ci0JdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0KLQlpZiAod2FudF9ob3N0KSB7Ci0JCWlmIChrLT5jZXJ0LT50eXBlICE9IFNTSDJfQ0VSVF9UWVBFX0hPU1QpIHsKLQkJCSpyZWFzb24gPSAiQ2VydGlmaWNhdGUgaW52YWxpZDogbm90IGEgaG9zdCBjZXJ0aWZpY2F0ZSI7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoay0+Y2VydC0+dHlwZSAhPSBTU0gyX0NFUlRfVFlQRV9VU0VSKSB7Ci0JCQkqcmVhc29uID0gIkNlcnRpZmljYXRlIGludmFsaWQ6IG5vdCBhIHVzZXIgY2VydGlmaWNhdGUiOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWlmIChub3cgPCAwKSB7Ci0JCWVycm9yKCIlczogc3lzdGVtIGNsb2NrIGxpZXMgYmVmb3JlIGVwb2NoIiwgX19mdW5jX18pOwotCQkqcmVhc29uID0gIkNlcnRpZmljYXRlIGludmFsaWQ6IG5vdCB5ZXQgdmFsaWQiOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgodV9pbnQ2NF90KW5vdyA8IGstPmNlcnQtPnZhbGlkX2FmdGVyKSB7Ci0JCSpyZWFzb24gPSAiQ2VydGlmaWNhdGUgaW52YWxpZDogbm90IHlldCB2YWxpZCI7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCh1X2ludDY0X3Qpbm93ID49IGstPmNlcnQtPnZhbGlkX2JlZm9yZSkgewotCQkqcmVhc29uID0gIkNlcnRpZmljYXRlIGludmFsaWQ6IGV4cGlyZWQiOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChrLT5jZXJ0LT5ucHJpbmNpcGFscyA9PSAwKSB7Ci0JCWlmIChyZXF1aXJlX3ByaW5jaXBhbCkgewotCQkJKnJlYXNvbiA9ICJDZXJ0aWZpY2F0ZSBsYWNrcyBwcmluY2lwYWwgbGlzdCI7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9IGVsc2UgaWYgKG5hbWUgIT0gTlVMTCkgewotCQlwcmluY2lwYWxfbWF0Y2hlcyA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBrLT5jZXJ0LT5ucHJpbmNpcGFsczsgaSsrKSB7Ci0JCQlpZiAoc3RyY21wKG5hbWUsIGstPmNlcnQtPnByaW5jaXBhbHNbaV0pID09IDApIHsKLQkJCQlwcmluY2lwYWxfbWF0Y2hlcyA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFwcmluY2lwYWxfbWF0Y2hlcykgewotCQkJKnJlYXNvbiA9ICJDZXJ0aWZpY2F0ZSBpbnZhbGlkOiBuYW1lIGlzIG5vdCBhIGxpc3RlZCAiCi0JCQkgICAgInByaW5jaXBhbCI7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAota2V5X2NlcnRfaXNfbGVnYWN5KEtleSAqaykKLXsKLQlzd2l0Y2ggKGstPnR5cGUpIHsKLQljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6Ci0JY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgotCQlyZXR1cm4gMTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLS8qIFhYWDogdGhlc2UgYXJlIHJlYWxseSBiZWdnaW5nIGZvciBhIHRhYmxlLWRyaXZlbiBhcHByb2FjaCAqLwotaW50Ci1rZXlfY3VydmVfbmFtZV90b19uaWQoY29uc3QgY2hhciAqbmFtZSkKLXsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQlpZiAoc3RyY21wKG5hbWUsICJuaXN0cDI1NiIpID09IDApCi0JCXJldHVybiBOSURfWDlfNjJfcHJpbWUyNTZ2MTsKLQllbHNlIGlmIChzdHJjbXAobmFtZSwgIm5pc3RwMzg0IikgPT0gMCkKLQkJcmV0dXJuIE5JRF9zZWNwMzg0cjE7Ci0JZWxzZSBpZiAoc3RyY21wKG5hbWUsICJuaXN0cDUyMSIpID09IDApCi0JCXJldHVybiBOSURfc2VjcDUyMXIxOwotI2VuZGlmCi0KLQlkZWJ1ZygiJXM6IHVuc3VwcG9ydGVkIEVDIGN1cnZlIG5hbWUgXCIlLjEwMHNcIiIsIF9fZnVuY19fLCBuYW1lKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLXVfaW50Ci1rZXlfY3VydmVfbmlkX3RvX2JpdHMoaW50IG5pZCkKLXsKLQlzd2l0Y2ggKG5pZCkgewotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCWNhc2UgTklEX1g5XzYyX3ByaW1lMjU2djE6Ci0JCXJldHVybiAyNTY7Ci0JY2FzZSBOSURfc2VjcDM4NHIxOgotCQlyZXR1cm4gMzg0OwotCWNhc2UgTklEX3NlY3A1MjFyMToKLQkJcmV0dXJuIDUyMTsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCWVycm9yKCIlczogdW5zdXBwb3J0ZWQgRUMgY3VydmUgbmlkICVkIiwgX19mdW5jX18sIG5pZCk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotY29uc3QgY2hhciAqCi1rZXlfY3VydmVfbmlkX3RvX25hbWUoaW50IG5pZCkKLXsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQlpZiAobmlkID09IE5JRF9YOV82Ml9wcmltZTI1NnYxKQotCQlyZXR1cm4gIm5pc3RwMjU2IjsKLQllbHNlIGlmIChuaWQgPT0gTklEX3NlY3AzODRyMSkKLQkJcmV0dXJuICJuaXN0cDM4NCI7Ci0JZWxzZSBpZiAobmlkID09IE5JRF9zZWNwNTIxcjEpCi0JCXJldHVybiAibmlzdHA1MjEiOwotI2VuZGlmCi0JZXJyb3IoIiVzOiB1bnN1cHBvcnRlZCBFQyBjdXJ2ZSBuaWQgJWQiLCBfX2Z1bmNfXywgbmlkKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotY29uc3QgRVZQX01EICoKLWtleV9lY19uaWRfdG9fZXZwbWQoaW50IG5pZCkKLXsKLQlpbnQga2JpdHMgPSBrZXlfY3VydmVfbmlkX3RvX2JpdHMobmlkKTsKLQotCWlmIChrYml0cyA9PSAwKQotCQlmYXRhbCgiJXM6IGludmFsaWQgbmlkICVkIiwgX19mdW5jX18sIG5pZCk7Ci0JLyogUkZDNTY1NiBzZWN0aW9uIDYuMi4xICovCi0JaWYgKGtiaXRzIDw9IDI1NikKLQkJcmV0dXJuIEVWUF9zaGEyNTYoKTsKLQllbHNlIGlmIChrYml0cyA8PSAzODQpCi0JCXJldHVybiBFVlBfc2hhMzg0KCk7Ci0JZWxzZQotCQlyZXR1cm4gRVZQX3NoYTUxMigpOwotfQotCi1pbnQKLWtleV9lY192YWxpZGF0ZV9wdWJsaWMoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqcHVibGljKQotewotCUJOX0NUWCAqYm5jdHg7Ci0JRUNfUE9JTlQgKm5xID0gTlVMTDsKLQlCSUdOVU0gKm9yZGVyLCAqeCwgKnksICp0bXA7Ci0JaW50IHJldCA9IC0xOwotCi0JaWYgKChibmN0eCA9IEJOX0NUWF9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBCTl9DVFhfbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKLQlCTl9DVFhfc3RhcnQoYm5jdHgpOwotCi0JLyoKLQkgKiBXZSBzaG91bGRuJ3QgZXZlciBoaXQgdGhpcyBjYXNlIGJlY2F1c2UgYmlnbnVtX2dldF9lY3BvaW50KCkKLQkgKiByZWZ1c2VzIHRvIGxvYWQgR0YybSBwb2ludHMuCi0JICovCi0JaWYgKEVDX01FVEhPRF9nZXRfZmllbGRfdHlwZShFQ19HUk9VUF9tZXRob2Rfb2YoZ3JvdXApKSAhPQotCSAgICBOSURfWDlfNjJfcHJpbWVfZmllbGQpIHsKLQkJZXJyb3IoIiVzOiBncm91cCBpcyBub3QgYSBwcmltZSBmaWVsZCIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogUSAhPSBpbmZpbml0eSAqLwotCWlmIChFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgcHVibGljKSkgewotCQllcnJvcigiJXM6IHJlY2VpdmVkIGRlZ2VuZXJhdGUgcHVibGljIGtleSAoaW5maW5pdHkpIiwKLQkJICAgIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKCh4ID0gQk5fQ1RYX2dldChibmN0eCkpID09IE5VTEwgfHwKLQkgICAgKHkgPSBCTl9DVFhfZ2V0KGJuY3R4KSkgPT0gTlVMTCB8fAotCSAgICAob3JkZXIgPSBCTl9DVFhfZ2V0KGJuY3R4KSkgPT0gTlVMTCB8fAotCSAgICAodG1wID0gQk5fQ1RYX2dldChibmN0eCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fQ1RYX2dldCBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0KLQkvKiBsb2cyKHgpID4gbG9nMihvcmRlcikvMiwgbG9nMih5KSA+IGxvZzIob3JkZXIpLzIgKi8KLQlpZiAoRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLCBvcmRlciwgYm5jdHgpICE9IDEpCi0JCWZhdGFsKCIlczogRUNfR1JPVVBfZ2V0X29yZGVyIGZhaWxlZCIsIF9fZnVuY19fKTsKLQlpZiAoRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHB1YmxpYywKLQkgICAgeCwgeSwgYm5jdHgpICE9IDEpCi0JCWZhdGFsKCIlczogRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAiLCBfX2Z1bmNfXyk7Ci0JaWYgKEJOX251bV9iaXRzKHgpIDw9IEJOX251bV9iaXRzKG9yZGVyKSAvIDIpIHsKLQkJZXJyb3IoIiVzOiBwdWJsaWMga2V5IHggY29vcmRpbmF0ZSB0b28gc21hbGw6ICIKLQkJICAgICJiaXRzKHgpID0gJWQsIGJpdHMob3JkZXIpLzIgPSAlZCIsIF9fZnVuY19fLAotCQkgICAgQk5fbnVtX2JpdHMoeCksIEJOX251bV9iaXRzKG9yZGVyKSAvIDIpOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKEJOX251bV9iaXRzKHkpIDw9IEJOX251bV9iaXRzKG9yZGVyKSAvIDIpIHsKLQkJZXJyb3IoIiVzOiBwdWJsaWMga2V5IHkgY29vcmRpbmF0ZSB0b28gc21hbGw6ICIKLQkJICAgICJiaXRzKHkpID0gJWQsIGJpdHMob3JkZXIpLzIgPSAlZCIsIF9fZnVuY19fLAotCQkgICAgQk5fbnVtX2JpdHMoeCksIEJOX251bV9iaXRzKG9yZGVyKSAvIDIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBuUSA9PSBpbmZpbml0eSAobiA9PSBvcmRlciBvZiBzdWJncm91cCkgKi8KLQlpZiAoKG5xID0gRUNfUE9JTlRfbmV3KGdyb3VwKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBCTl9DVFhfdG1wIGZhaWxlZCIsIF9fZnVuY19fKTsKLQlpZiAoRUNfUE9JTlRfbXVsKGdyb3VwLCBucSwgTlVMTCwgcHVibGljLCBvcmRlciwgYm5jdHgpICE9IDEpCi0JCWZhdGFsKCIlczogRUNfR1JPVVBfbXVsIGZhaWxlZCIsIF9fZnVuY19fKTsKLQlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIG5xKSAhPSAxKSB7Ci0JCWVycm9yKCIlczogcmVjZWl2ZWQgZGVnZW5lcmF0ZSBwdWJsaWMga2V5IChuUSAhPSBpbmZpbml0eSkiLAotCQkgICAgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiB4IDwgb3JkZXIgLSAxLCB5IDwgb3JkZXIgLSAxICovCi0JaWYgKCFCTl9zdWIodG1wLCBvcmRlciwgQk5fdmFsdWVfb25lKCkpKQotCQlmYXRhbCgiJXM6IEJOX3N1YiBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JaWYgKEJOX2NtcCh4LCB0bXApID49IDApIHsKLQkJZXJyb3IoIiVzOiBwdWJsaWMga2V5IHggY29vcmRpbmF0ZSA+PSBncm91cCBvcmRlciAtIDEiLAotCQkgICAgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKEJOX2NtcCh5LCB0bXApID49IDApIHsKLQkJZXJyb3IoIiVzOiBwdWJsaWMga2V5IHkgY29vcmRpbmF0ZSA+PSBncm91cCBvcmRlciAtIDEiLAotCQkgICAgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0JcmV0ID0gMDsKLSBvdXQ6Ci0JQk5fQ1RYX2ZyZWUoYm5jdHgpOwotCUVDX1BPSU5UX2ZyZWUobnEpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludAota2V5X2VjX3ZhbGlkYXRlX3ByaXZhdGUoY29uc3QgRUNfS0VZICprZXkpCi17Ci0JQk5fQ1RYICpibmN0eDsKLQlCSUdOVU0gKm9yZGVyLCAqdG1wOwotCWludCByZXQgPSAtMTsKLQotCWlmICgoYm5jdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fQ1RYX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JQk5fQ1RYX3N0YXJ0KGJuY3R4KTsKLQotCWlmICgob3JkZXIgPSBCTl9DVFhfZ2V0KGJuY3R4KSkgPT0gTlVMTCB8fAotCSAgICAodG1wID0gQk5fQ1RYX2dldChibmN0eCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fQ1RYX2dldCBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0KLQkvKiBsb2cyKHByaXZhdGUpID4gbG9nMihvcmRlcikvMiAqLwotCWlmIChFQ19HUk9VUF9nZXRfb3JkZXIoRUNfS0VZX2dldDBfZ3JvdXAoa2V5KSwgb3JkZXIsIGJuY3R4KSAhPSAxKQotCQlmYXRhbCgiJXM6IEVDX0dST1VQX2dldF9vcmRlciBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JaWYgKEJOX251bV9iaXRzKEVDX0tFWV9nZXQwX3ByaXZhdGVfa2V5KGtleSkpIDw9Ci0JICAgIEJOX251bV9iaXRzKG9yZGVyKSAvIDIpIHsKLQkJZXJyb3IoIiVzOiBwcml2YXRlIGtleSB0b28gc21hbGw6ICIKLQkJICAgICJiaXRzKHkpID0gJWQsIGJpdHMob3JkZXIpLzIgPSAlZCIsIF9fZnVuY19fLAotCQkgICAgQk5fbnVtX2JpdHMoRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkoa2V5KSksCi0JCSAgICBCTl9udW1fYml0cyhvcmRlcikgLyAyKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogcHJpdmF0ZSA8IG9yZGVyIC0gMSAqLwotCWlmICghQk5fc3ViKHRtcCwgb3JkZXIsIEJOX3ZhbHVlX29uZSgpKSkKLQkJZmF0YWwoIiVzOiBCTl9zdWIgZmFpbGVkIiwgX19mdW5jX18pOwotCWlmIChCTl9jbXAoRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkoa2V5KSwgdG1wKSA+PSAwKSB7Ci0JCWVycm9yKCIlczogcHJpdmF0ZSBrZXkgPj0gZ3JvdXAgb3JkZXIgLSAxIiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0JcmV0ID0gMDsKLSBvdXQ6Ci0JQk5fQ1RYX2ZyZWUoYm5jdHgpOwotCXJldHVybiByZXQ7Ci19Ci0KLSNpZiBkZWZpbmVkKERFQlVHX0tFWEVDREgpIHx8IGRlZmluZWQoREVCVUdfUEspCi12b2lkCi1rZXlfZHVtcF9lY19wb2ludChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCkKLXsKLQlCSUdOVU0gKngsICp5OwotCUJOX0NUWCAqYm5jdHg7Ci0KLQlpZiAocG9pbnQgPT0gTlVMTCkgewotCQlmcHV0cygicG9pbnQ9KE5VTEwpXG4iLCBzdGRlcnIpOwotCQlyZXR1cm47Ci0JfQotCWlmICgoYm5jdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fQ1RYX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JQk5fQ1RYX3N0YXJ0KGJuY3R4KTsKLQlpZiAoKHggPSBCTl9DVFhfZ2V0KGJuY3R4KSkgPT0gTlVMTCB8fCAoeSA9IEJOX0NUWF9nZXQoYm5jdHgpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEJOX0NUWF9nZXQgZmFpbGVkIiwgX19mdW5jX18pOwotCWlmIChFQ19NRVRIT0RfZ2V0X2ZpZWxkX3R5cGUoRUNfR1JPVVBfbWV0aG9kX29mKGdyb3VwKSkgIT0KLQkgICAgTklEX1g5XzYyX3ByaW1lX2ZpZWxkKQotCQlmYXRhbCgiJXM6IGdyb3VwIGlzIG5vdCBhIHByaW1lIGZpZWxkIiwgX19mdW5jX18pOwotCWlmIChFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgcG9pbnQsIHgsIHksIGJuY3R4KSAhPSAxKQotCQlmYXRhbCgiJXM6IEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwIiwgX19mdW5jX18pOwotCWZwdXRzKCJ4PSIsIHN0ZGVycik7Ci0JQk5fcHJpbnRfZnAoc3RkZXJyLCB4KTsKLQlmcHV0cygiXG55PSIsIHN0ZGVycik7Ci0JQk5fcHJpbnRfZnAoc3RkZXJyLCB5KTsKLQlmcHV0cygiXG4iLCBzdGRlcnIpOwotCUJOX0NUWF9mcmVlKGJuY3R4KTsKLX0KLQotdm9pZAota2V5X2R1bXBfZWNfa2V5KGNvbnN0IEVDX0tFWSAqa2V5KQotewotCWNvbnN0IEJJR05VTSAqZXhwb25lbnQ7Ci0KLQlrZXlfZHVtcF9lY19wb2ludChFQ19LRVlfZ2V0MF9ncm91cChrZXkpLCBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGtleSkpOwotCWZwdXRzKCJleHBvbmVudD0iLCBzdGRlcnIpOwotCWlmICgoZXhwb25lbnQgPSBFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShrZXkpKSA9PSBOVUxMKQotCQlmcHV0cygiKE5VTEwpIiwgc3RkZXJyKTsKLQllbHNlCi0JCUJOX3ByaW50X2ZwKHN0ZGVyciwgRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkoa2V5KSk7Ci0JZnB1dHMoIlxuIiwgc3RkZXJyKTsKLX0KLSNlbmRpZiAvKiBkZWZpbmVkKERFQlVHX0tFWEVDREgpIHx8IGRlZmluZWQoREVCVUdfUEspICovCi0jZW5kaWYgLyogT1BFTlNTTF9IQVNfRUNDICovCmRpZmYgLS1naXQgYS9rZXkuaCBiL2tleS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzVhYzVlLi4wMDAwMDAwCi0tLSBhL2tleS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qICRPcGVuQlNEOiBrZXkuaCx2IDEuMzMgMjAxMC8xMC8yOCAxMToyMjowOSBkam0gRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLSNpZm5kZWYgS0VZX0gKLSNkZWZpbmUgS0VZX0gKLQotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9kc2EuaD4KLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLSNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgS2V5IEtleTsKLWVudW0gdHlwZXMgewotCUtFWV9SU0ExLAotCUtFWV9SU0EsCi0JS0VZX0RTQSwKLQlLRVlfRUNEU0EsCi0JS0VZX1JTQV9DRVJULAotCUtFWV9EU0FfQ0VSVCwKLQlLRVlfRUNEU0FfQ0VSVCwKLQlLRVlfUlNBX0NFUlRfVjAwLAotCUtFWV9EU0FfQ0VSVF9WMDAsCi0JS0VZX1VOU1BFQwotfTsKLWVudW0gZnBfdHlwZSB7Ci0JU1NIX0ZQX1NIQTEsCi0JU1NIX0ZQX01ENQotfTsKLWVudW0gZnBfcmVwIHsKLQlTU0hfRlBfSEVYLAotCVNTSF9GUF9CVUJCTEVCQUJCTEUsCi0JU1NIX0ZQX1JBTkRPTUFSVAotfTsKLQotLyoga2V5IGlzIHN0b3JlZCBpbiBleHRlcm5hbCBoYXJkd2FyZSAqLwotI2RlZmluZSBLRVlfRkxBR19FWFQJCTB4MDAwMQotCi0jZGVmaW5lIENFUlRfTUFYX1BSSU5DSVBBTFMJMjU2Ci1zdHJ1Y3QgS2V5Q2VydCB7Ci0JQnVmZmVyCQkgY2VydGJsb2I7IC8qIEtlcHQgYXJvdW5kIGZvciB1c2Ugb24gd2lyZSAqLwotCXVfaW50CQkgdHlwZTsgLyogU1NIMl9DRVJUX1RZUEVfVVNFUiBvciBTU0gyX0NFUlRfVFlQRV9IT1NUICovCi0JdV9pbnQ2NF90CSBzZXJpYWw7Ci0JY2hhcgkJKmtleV9pZDsKLQl1X2ludAkJIG5wcmluY2lwYWxzOwotCWNoYXIJCSoqcHJpbmNpcGFsczsKLQl1X2ludDY0X3QJIHZhbGlkX2FmdGVyLCB2YWxpZF9iZWZvcmU7Ci0JQnVmZmVyCQkgY3JpdGljYWw7Ci0JQnVmZmVyCQkgZXh0ZW5zaW9uczsKLQlLZXkJCSpzaWduYXR1cmVfa2V5OwotfTsKLQotc3RydWN0IEtleSB7Ci0JaW50CSB0eXBlOwotCWludAkgZmxhZ3M7Ci0JUlNBCSpyc2E7Ci0JRFNBCSpkc2E7Ci0JaW50CSBlY2RzYV9uaWQ7CS8qIE5JRCBvZiBjdXJ2ZSAqLwotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCUVDX0tFWQkqZWNkc2E7Ci0jZWxzZQotCXZvaWQJKmVjZHNhOwotI2VuZGlmCi0Jc3RydWN0IEtleUNlcnQgKmNlcnQ7Ci19OwotCi1LZXkJCSprZXlfbmV3KGludCk7Ci12b2lkCQkga2V5X2FkZF9wcml2YXRlKEtleSAqKTsKLUtleQkJKmtleV9uZXdfcHJpdmF0ZShpbnQpOwotdm9pZAkJIGtleV9mcmVlKEtleSAqKTsKLUtleQkJKmtleV9kZW1vdGUoY29uc3QgS2V5ICopOwotaW50CQkga2V5X2VxdWFsX3B1YmxpYyhjb25zdCBLZXkgKiwgY29uc3QgS2V5ICopOwotaW50CQkga2V5X2VxdWFsKGNvbnN0IEtleSAqLCBjb25zdCBLZXkgKik7Ci1jaGFyCQkqa2V5X2ZpbmdlcnByaW50KEtleSAqLCBlbnVtIGZwX3R5cGUsIGVudW0gZnBfcmVwKTsKLXVfY2hhcgkJKmtleV9maW5nZXJwcmludF9yYXcoS2V5ICosIGVudW0gZnBfdHlwZSwgdV9pbnQgKik7Ci1jb25zdCBjaGFyCSprZXlfdHlwZShjb25zdCBLZXkgKik7Ci1jb25zdCBjaGFyCSprZXlfY2VydF90eXBlKGNvbnN0IEtleSAqKTsKLWludAkJIGtleV93cml0ZShjb25zdCBLZXkgKiwgRklMRSAqKTsKLWludAkJIGtleV9yZWFkKEtleSAqLCBjaGFyICoqKTsKLXVfaW50CQkga2V5X3NpemUoY29uc3QgS2V5ICopOwotCi1LZXkJKmtleV9nZW5lcmF0ZShpbnQsIHVfaW50KTsKLUtleQkqa2V5X2Zyb21fcHJpdmF0ZShjb25zdCBLZXkgKik7Ci1pbnQJIGtleV90eXBlX2Zyb21fbmFtZShjaGFyICopOwotaW50CSBrZXlfaXNfY2VydChjb25zdCBLZXkgKik7Ci1pbnQJIGtleV90eXBlX3BsYWluKGludCk7Ci1pbnQJIGtleV90b19jZXJ0aWZpZWQoS2V5ICosIGludCk7Ci1pbnQJIGtleV9kcm9wX2NlcnQoS2V5ICopOwotaW50CSBrZXlfY2VydGlmeShLZXkgKiwgS2V5ICopOwotdm9pZAkga2V5X2NlcnRfY29weShjb25zdCBLZXkgKiwgc3RydWN0IEtleSAqKTsKLWludAkga2V5X2NlcnRfY2hlY2tfYXV0aG9yaXR5KGNvbnN0IEtleSAqLCBpbnQsIGludCwgY29uc3QgY2hhciAqLAotCSAgICBjb25zdCBjaGFyICoqKTsKLWludAkga2V5X2NlcnRfaXNfbGVnYWN5KEtleSAqKTsKLQotaW50CQkga2V5X2VjZHNhX25pZF9mcm9tX25hbWUoY29uc3QgY2hhciAqKTsKLWludAkJIGtleV9jdXJ2ZV9uYW1lX3RvX25pZChjb25zdCBjaGFyICopOwotY29uc3QgY2hhciAqCSBrZXlfY3VydmVfbmlkX3RvX25hbWUoaW50KTsKLXVfaW50CQkga2V5X2N1cnZlX25pZF90b19iaXRzKGludCk7Ci1pbnQJCSBrZXlfZWNkc2FfYml0c190b19uaWQoaW50KTsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLWludAkJIGtleV9lY2RzYV9rZXlfdG9fbmlkKEVDX0tFWSAqKTsKLWNvbnN0IEVWUF9NRCAqCSBrZXlfZWNfbmlkX3RvX2V2cG1kKGludCBuaWQpOwotaW50CQkga2V5X2VjX3ZhbGlkYXRlX3B1YmxpYyhjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqKTsKLWludAkJIGtleV9lY192YWxpZGF0ZV9wcml2YXRlKGNvbnN0IEVDX0tFWSAqKTsKLSNlbmRpZgotCi1LZXkJCSprZXlfZnJvbV9ibG9iKGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1pbnQJCSBrZXlfdG9fYmxvYihjb25zdCBLZXkgKiwgdV9jaGFyICoqLCB1X2ludCAqKTsKLWNvbnN0IGNoYXIJKmtleV9zc2hfbmFtZShjb25zdCBLZXkgKik7Ci1jb25zdCBjaGFyCSprZXlfc3NoX25hbWVfcGxhaW4oY29uc3QgS2V5ICopOwotaW50CQkga2V5X25hbWVzX3ZhbGlkMihjb25zdCBjaGFyICopOwotCi1pbnQJIGtleV9zaWduKGNvbnN0IEtleSAqLCB1X2NoYXIgKiosIHVfaW50ICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1pbnQJIGtleV92ZXJpZnkoY29uc3QgS2V5ICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLQotaW50CSBzc2hfZHNzX3NpZ24oY29uc3QgS2V5ICosIHVfY2hhciAqKiwgdV9pbnQgKiwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWludAkgc3NoX2Rzc192ZXJpZnkoY29uc3QgS2V5ICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWludAkgc3NoX2VjZHNhX3NpZ24oY29uc3QgS2V5ICosIHVfY2hhciAqKiwgdV9pbnQgKiwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWludAkgc3NoX2VjZHNhX3ZlcmlmeShjb25zdCBLZXkgKiwgY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotaW50CSBzc2hfcnNhX3NpZ24oY29uc3QgS2V5ICosIHVfY2hhciAqKiwgdV9pbnQgKiwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWludAkgc3NoX3JzYV92ZXJpZnkoY29uc3QgS2V5ICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLQotI2lmIGRlZmluZWQoT1BFTlNTTF9IQVNfRUNDKSAmJiAoZGVmaW5lZChERUJVR19LRVhFQ0RIKSB8fCBkZWZpbmVkKERFQlVHX1BLKSkKLXZvaWQJa2V5X2R1bXBfZWNfcG9pbnQoY29uc3QgRUNfR1JPVVAgKiwgY29uc3QgRUNfUE9JTlQgKik7Ci12b2lkCWtleV9kdW1wX2VjX2tleShjb25zdCBFQ19LRVkgKik7Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sb2cuYyBiL2xvZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDVhMTBiLi4wMDAwMDAwCi0tLSBhL2xvZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qICRPcGVuQlNEOiBsb2cuYyx2IDEuNDIgMjAxMS8wNi8xNyAyMTo0NDozMCBkam0gRXhwICQgKi8KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzbG9nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiBkZWZpbmVkKEhBVkVfU1RSTlZJUykgJiYgZGVmaW5lZChIQVZFX1ZJU19IKQotIyBpbmNsdWRlIDx2aXMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImxvZy5oIgotCi1zdGF0aWMgTG9nTGV2ZWwgbG9nX2xldmVsID0gU1lTTE9HX0xFVkVMX0lORk87Ci1zdGF0aWMgaW50IGxvZ19vbl9zdGRlcnIgPSAxOwotc3RhdGljIGludCBsb2dfZmFjaWxpdHkgPSBMT0dfQVVUSDsKLXN0YXRpYyBjaGFyICphcmd2MDsKLXN0YXRpYyBsb2dfaGFuZGxlcl9mbiAqbG9nX2hhbmRsZXI7Ci1zdGF0aWMgdm9pZCAqbG9nX2hhbmRsZXJfY3R4OwotCi1leHRlcm4gY2hhciAqX19wcm9nbmFtZTsKLQotI2RlZmluZSBMT0dfU1lTTE9HX1ZJUwkoVklTX0NTVFlMRXxWSVNfTkx8VklTX1RBQnxWSVNfT0NUQUwpCi0jZGVmaW5lIExPR19TVERFUlJfVklTCShWSVNfU0FGRXxWSVNfT0NUQUwpCi0KLS8qIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgbG9nLWZhY2lsaXRpZXMvbGV2ZWxzICovCi0KLXN0YXRpYyBzdHJ1Y3QgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JU3lzbG9nRmFjaWxpdHkgdmFsOwotfSBsb2dfZmFjaWxpdGllc1tdID0gewotCXsgIkRBRU1PTiIsCVNZU0xPR19GQUNJTElUWV9EQUVNT04gfSwKLQl7ICJVU0VSIiwJU1lTTE9HX0ZBQ0lMSVRZX1VTRVIgfSwKLQl7ICJBVVRIIiwJU1lTTE9HX0ZBQ0lMSVRZX0FVVEggfSwKLSNpZmRlZiBMT0dfQVVUSFBSSVYKLQl7ICJBVVRIUFJJViIsCVNZU0xPR19GQUNJTElUWV9BVVRIUFJJViB9LAotI2VuZGlmCi0JeyAiTE9DQUwwIiwJU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMMCB9LAotCXsgIkxPQ0FMMSIsCVNZU0xPR19GQUNJTElUWV9MT0NBTDEgfSwKLQl7ICJMT0NBTDIiLAlTWVNMT0dfRkFDSUxJVFlfTE9DQUwyIH0sCi0JeyAiTE9DQUwzIiwJU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMMyB9LAotCXsgIkxPQ0FMNCIsCVNZU0xPR19GQUNJTElUWV9MT0NBTDQgfSwKLQl7ICJMT0NBTDUiLAlTWVNMT0dfRkFDSUxJVFlfTE9DQUw1IH0sCi0JeyAiTE9DQUw2IiwJU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMNiB9LAotCXsgIkxPQ0FMNyIsCVNZU0xPR19GQUNJTElUWV9MT0NBTDcgfSwKLQl7IE5VTEwsCQlTWVNMT0dfRkFDSUxJVFlfTk9UX1NFVCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHsKLQljb25zdCBjaGFyICpuYW1lOwotCUxvZ0xldmVsIHZhbDsKLX0gbG9nX2xldmVsc1tdID0KLXsKLQl7ICJRVUlFVCIsCVNZU0xPR19MRVZFTF9RVUlFVCB9LAotCXsgIkZBVEFMIiwJU1lTTE9HX0xFVkVMX0ZBVEFMIH0sCi0JeyAiRVJST1IiLAlTWVNMT0dfTEVWRUxfRVJST1IgfSwKLQl7ICJJTkZPIiwJU1lTTE9HX0xFVkVMX0lORk8gfSwKLQl7ICJWRVJCT1NFIiwJU1lTTE9HX0xFVkVMX1ZFUkJPU0UgfSwKLQl7ICJERUJVRyIsCVNZU0xPR19MRVZFTF9ERUJVRzEgfSwKLQl7ICJERUJVRzEiLAlTWVNMT0dfTEVWRUxfREVCVUcxIH0sCi0JeyAiREVCVUcyIiwJU1lTTE9HX0xFVkVMX0RFQlVHMiB9LAotCXsgIkRFQlVHMyIsCVNZU0xPR19MRVZFTF9ERUJVRzMgfSwKLQl7IE5VTEwsCQlTWVNMT0dfTEVWRUxfTk9UX1NFVCB9Ci19OwotCi1TeXNsb2dGYWNpbGl0eQotbG9nX2ZhY2lsaXR5X251bWJlcihjaGFyICpuYW1lKQotewotCWludCBpOwotCi0JaWYgKG5hbWUgIT0gTlVMTCkKLQkJZm9yIChpID0gMDsgbG9nX2ZhY2lsaXRpZXNbaV0ubmFtZTsgaSsrKQotCQkJaWYgKHN0cmNhc2VjbXAobG9nX2ZhY2lsaXRpZXNbaV0ubmFtZSwgbmFtZSkgPT0gMCkKLQkJCQlyZXR1cm4gbG9nX2ZhY2lsaXRpZXNbaV0udmFsOwotCXJldHVybiBTWVNMT0dfRkFDSUxJVFlfTk9UX1NFVDsKLX0KLQotY29uc3QgY2hhciAqCi1sb2dfZmFjaWxpdHlfbmFtZShTeXNsb2dGYWNpbGl0eSBmYWNpbGl0eSkKLXsKLQl1X2ludCBpOwotCi0JZm9yIChpID0gMDsgIGxvZ19mYWNpbGl0aWVzW2ldLm5hbWU7IGkrKykKLQkJaWYgKGxvZ19mYWNpbGl0aWVzW2ldLnZhbCA9PSBmYWNpbGl0eSkKLQkJCXJldHVybiBsb2dfZmFjaWxpdGllc1tpXS5uYW1lOwotCXJldHVybiBOVUxMOwotfQotCi1Mb2dMZXZlbAotbG9nX2xldmVsX251bWJlcihjaGFyICpuYW1lKQotewotCWludCBpOwotCi0JaWYgKG5hbWUgIT0gTlVMTCkKLQkJZm9yIChpID0gMDsgbG9nX2xldmVsc1tpXS5uYW1lOyBpKyspCi0JCQlpZiAoc3RyY2FzZWNtcChsb2dfbGV2ZWxzW2ldLm5hbWUsIG5hbWUpID09IDApCi0JCQkJcmV0dXJuIGxvZ19sZXZlbHNbaV0udmFsOwotCXJldHVybiBTWVNMT0dfTEVWRUxfTk9UX1NFVDsKLX0KLQotY29uc3QgY2hhciAqCi1sb2dfbGV2ZWxfbmFtZShMb2dMZXZlbCBsZXZlbCkKLXsKLQl1X2ludCBpOwotCi0JZm9yIChpID0gMDsgbG9nX2xldmVsc1tpXS5uYW1lICE9IE5VTEw7IGkrKykKLQkJaWYgKGxvZ19sZXZlbHNbaV0udmFsID09IGxldmVsKQotCQkJcmV0dXJuIGxvZ19sZXZlbHNbaV0ubmFtZTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogRXJyb3IgbWVzc2FnZXMgdGhhdCBzaG91bGQgYmUgbG9nZ2VkLiAqLwotCi12b2lkCi1lcnJvcihjb25zdCBjaGFyICpmbXQsLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JZG9fbG9nKFNZU0xPR19MRVZFTF9FUlJPUiwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci19Ci0KLXZvaWQKLXNpZ2RpZShjb25zdCBjaGFyICpmbXQsLi4uKQotewotI2lmZGVmIERPX0xPR19TQUZFX0lOX1NJR0hBTkQKLQl2YV9saXN0IGFyZ3M7Ci0KLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCWRvX2xvZyhTWVNMT0dfTEVWRUxfRkFUQUwsIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotI2VuZGlmCi0JX2V4aXQoMSk7Ci19Ci0KLQotLyogTG9nIHRoaXMgbWVzc2FnZSAoaW5mb3JtYXRpb24gdGhhdCB1c3VhbGx5IHNob3VsZCBnbyB0byB0aGUgbG9nKS4gKi8KLQotdm9pZAotbG9naXQoY29uc3QgY2hhciAqZm10LC4uLikKLXsKLQl2YV9saXN0IGFyZ3M7Ci0KLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCWRvX2xvZyhTWVNMT0dfTEVWRUxfSU5GTywgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci19Ci0KLS8qIE1vcmUgZGV0YWlsZWQgbWVzc2FnZXMgKGluZm9ybWF0aW9uIHRoYXQgZG9lcyBub3QgbmVlZCB0byBnbyB0byB0aGUgbG9nKS4gKi8KLQotdm9pZAotdmVyYm9zZShjb25zdCBjaGFyICpmbXQsLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JZG9fbG9nKFNZU0xPR19MRVZFTF9WRVJCT1NFLCBmbXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKLX0KLQotLyogRGVidWdnaW5nIG1lc3NhZ2VzIHRoYXQgc2hvdWxkIG5vdCBiZSBsb2dnZWQgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24uICovCi0KLXZvaWQKLWRlYnVnKGNvbnN0IGNoYXIgKmZtdCwuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCi0JdmFfc3RhcnQoYXJncywgZm10KTsKLQlkb19sb2coU1lTTE9HX0xFVkVMX0RFQlVHMSwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci19Ci0KLXZvaWQKLWRlYnVnMihjb25zdCBjaGFyICpmbXQsLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JZG9fbG9nKFNZU0xPR19MRVZFTF9ERUJVRzIsIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotfQotCi12b2lkCi1kZWJ1ZzMoY29uc3QgY2hhciAqZm10LC4uLikKLXsKLQl2YV9saXN0IGFyZ3M7Ci0KLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCWRvX2xvZyhTWVNMT0dfTEVWRUxfREVCVUczLCBmbXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGxvZy4KLSAqLwotCi12b2lkCi1sb2dfaW5pdChjaGFyICphdjAsIExvZ0xldmVsIGxldmVsLCBTeXNsb2dGYWNpbGl0eSBmYWNpbGl0eSwgaW50IG9uX3N0ZGVycikKLXsKLSNpZiBkZWZpbmVkKEhBVkVfT1BFTkxPR19SKSAmJiBkZWZpbmVkKFNZU0xPR19EQVRBX0lOSVQpCi0Jc3RydWN0IHN5c2xvZ19kYXRhIHNkYXRhID0gU1lTTE9HX0RBVEFfSU5JVDsKLSNlbmRpZgotCi0JYXJndjAgPSBhdjA7Ci0KLQlzd2l0Y2ggKGxldmVsKSB7Ci0JY2FzZSBTWVNMT0dfTEVWRUxfUVVJRVQ6Ci0JY2FzZSBTWVNMT0dfTEVWRUxfRkFUQUw6Ci0JY2FzZSBTWVNMT0dfTEVWRUxfRVJST1I6Ci0JY2FzZSBTWVNMT0dfTEVWRUxfSU5GTzoKLQljYXNlIFNZU0xPR19MRVZFTF9WRVJCT1NFOgotCWNhc2UgU1lTTE9HX0xFVkVMX0RFQlVHMToKLQljYXNlIFNZU0xPR19MRVZFTF9ERUJVRzI6Ci0JY2FzZSBTWVNMT0dfTEVWRUxfREVCVUczOgotCQlsb2dfbGV2ZWwgPSBsZXZlbDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsICJVbnJlY29nbml6ZWQgaW50ZXJuYWwgc3lzbG9nIGxldmVsIGNvZGUgJWRcbiIsCi0JCSAgICAoaW50KSBsZXZlbCk7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JbG9nX2hhbmRsZXIgPSBOVUxMOwotCWxvZ19oYW5kbGVyX2N0eCA9IE5VTEw7Ci0KLQlsb2dfb25fc3RkZXJyID0gb25fc3RkZXJyOwotCWlmIChvbl9zdGRlcnIpCi0JCXJldHVybjsKLQotCXN3aXRjaCAoZmFjaWxpdHkpIHsKLQljYXNlIFNZU0xPR19GQUNJTElUWV9EQUVNT046Ci0JCWxvZ19mYWNpbGl0eSA9IExPR19EQUVNT047Ci0JCWJyZWFrOwotCWNhc2UgU1lTTE9HX0ZBQ0lMSVRZX1VTRVI6Ci0JCWxvZ19mYWNpbGl0eSA9IExPR19VU0VSOwotCQlicmVhazsKLQljYXNlIFNZU0xPR19GQUNJTElUWV9BVVRIOgotCQlsb2dfZmFjaWxpdHkgPSBMT0dfQVVUSDsKLQkJYnJlYWs7Ci0jaWZkZWYgTE9HX0FVVEhQUklWCi0JY2FzZSBTWVNMT0dfRkFDSUxJVFlfQVVUSFBSSVY6Ci0JCWxvZ19mYWNpbGl0eSA9IExPR19BVVRIUFJJVjsKLQkJYnJlYWs7Ci0jZW5kaWYKLQljYXNlIFNZU0xPR19GQUNJTElUWV9MT0NBTDA6Ci0JCWxvZ19mYWNpbGl0eSA9IExPR19MT0NBTDA7Ci0JCWJyZWFrOwotCWNhc2UgU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMMToKLQkJbG9nX2ZhY2lsaXR5ID0gTE9HX0xPQ0FMMTsKLQkJYnJlYWs7Ci0JY2FzZSBTWVNMT0dfRkFDSUxJVFlfTE9DQUwyOgotCQlsb2dfZmFjaWxpdHkgPSBMT0dfTE9DQUwyOwotCQlicmVhazsKLQljYXNlIFNZU0xPR19GQUNJTElUWV9MT0NBTDM6Ci0JCWxvZ19mYWNpbGl0eSA9IExPR19MT0NBTDM7Ci0JCWJyZWFrOwotCWNhc2UgU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMNDoKLQkJbG9nX2ZhY2lsaXR5ID0gTE9HX0xPQ0FMNDsKLQkJYnJlYWs7Ci0JY2FzZSBTWVNMT0dfRkFDSUxJVFlfTE9DQUw1OgotCQlsb2dfZmFjaWxpdHkgPSBMT0dfTE9DQUw1OwotCQlicmVhazsKLQljYXNlIFNZU0xPR19GQUNJTElUWV9MT0NBTDY6Ci0JCWxvZ19mYWNpbGl0eSA9IExPR19MT0NBTDY7Ci0JCWJyZWFrOwotCWNhc2UgU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMNzoKLQkJbG9nX2ZhY2lsaXR5ID0gTE9HX0xPQ0FMNzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsCi0JCSAgICAiVW5yZWNvZ25pemVkIGludGVybmFsIHN5c2xvZyBmYWNpbGl0eSBjb2RlICVkXG4iLAotCQkgICAgKGludCkgZmFjaWxpdHkpOwotCQlleGl0KDEpOwotCX0KLQotCS8qCi0JICogSWYgYW4gZXh0ZXJuYWwgbGlicmFyeSAoZWcgbGlid3JhcCkgYXR0ZW1wdHMgdG8gdXNlIHN5c2xvZwotCSAqIGltbWVkaWF0ZWx5IGFmdGVyIHJlZXhlYywgc3lzbG9nIG1heSBiZSBwb2ludGluZyB0byB0aGUgd3JvbmcKLQkgKiBmYWNpbGl0eSwgc28gd2UgZm9yY2UgYW4gb3Blbi9jbG9zZSBvZiBzeXNsb2cgaGVyZS4KLQkgKi8KLSNpZiBkZWZpbmVkKEhBVkVfT1BFTkxPR19SKSAmJiBkZWZpbmVkKFNZU0xPR19EQVRBX0lOSVQpCi0Jb3BlbmxvZ19yKGFyZ3YwID8gYXJndjAgOiBfX3Byb2duYW1lLCBMT0dfUElELCBsb2dfZmFjaWxpdHksICZzZGF0YSk7Ci0JY2xvc2Vsb2dfcigmc2RhdGEpOwotI2Vsc2UKLQlvcGVubG9nKGFyZ3YwID8gYXJndjAgOiBfX3Byb2duYW1lLCBMT0dfUElELCBsb2dfZmFjaWxpdHkpOwotCWNsb3NlbG9nKCk7Ci0jZW5kaWYKLX0KLQotI2RlZmluZSBNU0dCVUZTSVogMTAyNAotCi12b2lkCi1zZXRfbG9nX2hhbmRsZXIobG9nX2hhbmRsZXJfZm4gKmhhbmRsZXIsIHZvaWQgKmN0eCkKLXsKLQlsb2dfaGFuZGxlciA9IGhhbmRsZXI7Ci0JbG9nX2hhbmRsZXJfY3R4ID0gY3R4OwotfQotCi12b2lkCi1kb19sb2cyKExvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmbXQsLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JZG9fbG9nKGxldmVsLCBmbXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKLX0KLQotdm9pZAotZG9fbG9nKExvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKLXsKLSNpZiBkZWZpbmVkKEhBVkVfT1BFTkxPR19SKSAmJiBkZWZpbmVkKFNZU0xPR19EQVRBX0lOSVQpCi0Jc3RydWN0IHN5c2xvZ19kYXRhIHNkYXRhID0gU1lTTE9HX0RBVEFfSU5JVDsKLSNlbmRpZgotCWNoYXIgbXNnYnVmW01TR0JVRlNJWl07Ci0JY2hhciBmbXRidWZbTVNHQlVGU0laXTsKLQljaGFyICp0eHQgPSBOVUxMOwotCWludCBwcmkgPSBMT0dfSU5GTzsKLQlpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKLQlsb2dfaGFuZGxlcl9mbiAqdG1wX2hhbmRsZXI7Ci0KLQlpZiAobGV2ZWwgPiBsb2dfbGV2ZWwpCi0JCXJldHVybjsKLQotCXN3aXRjaCAobGV2ZWwpIHsKLQljYXNlIFNZU0xPR19MRVZFTF9GQVRBTDoKLQkJaWYgKCFsb2dfb25fc3RkZXJyKQotCQkJdHh0ID0gImZhdGFsIjsKLQkJcHJpID0gTE9HX0NSSVQ7Ci0JCWJyZWFrOwotCWNhc2UgU1lTTE9HX0xFVkVMX0VSUk9SOgotCQlpZiAoIWxvZ19vbl9zdGRlcnIpCi0JCQl0eHQgPSAiZXJyb3IiOwotCQlwcmkgPSBMT0dfRVJSOwotCQlicmVhazsKLQljYXNlIFNZU0xPR19MRVZFTF9JTkZPOgotCQlwcmkgPSBMT0dfSU5GTzsKLQkJYnJlYWs7Ci0JY2FzZSBTWVNMT0dfTEVWRUxfVkVSQk9TRToKLQkJcHJpID0gTE9HX0lORk87Ci0JCWJyZWFrOwotCWNhc2UgU1lTTE9HX0xFVkVMX0RFQlVHMToKLQkJdHh0ID0gImRlYnVnMSI7Ci0JCXByaSA9IExPR19ERUJVRzsKLQkJYnJlYWs7Ci0JY2FzZSBTWVNMT0dfTEVWRUxfREVCVUcyOgotCQl0eHQgPSAiZGVidWcyIjsKLQkJcHJpID0gTE9HX0RFQlVHOwotCQlicmVhazsKLQljYXNlIFNZU0xPR19MRVZFTF9ERUJVRzM6Ci0JCXR4dCA9ICJkZWJ1ZzMiOwotCQlwcmkgPSBMT0dfREVCVUc7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXR4dCA9ICJpbnRlcm5hbCBlcnJvciI7Ci0JCXByaSA9IExPR19FUlI7Ci0JCWJyZWFrOwotCX0KLQlpZiAodHh0ICE9IE5VTEwgJiYgbG9nX2hhbmRsZXIgPT0gTlVMTCkgewotCQlzbnByaW50ZihmbXRidWYsIHNpemVvZihmbXRidWYpLCAiJXM6ICVzIiwgdHh0LCBmbXQpOwotCQl2c25wcmludGYobXNnYnVmLCBzaXplb2YobXNnYnVmKSwgZm10YnVmLCBhcmdzKTsKLQl9IGVsc2UgewotCQl2c25wcmludGYobXNnYnVmLCBzaXplb2YobXNnYnVmKSwgZm10LCBhcmdzKTsKLQl9Ci0Jc3RybnZpcyhmbXRidWYsIG1zZ2J1Ziwgc2l6ZW9mKGZtdGJ1ZiksCi0JICAgIGxvZ19vbl9zdGRlcnIgPyBMT0dfU1RERVJSX1ZJUyA6IExPR19TWVNMT0dfVklTKTsKLQlpZiAobG9nX2hhbmRsZXIgIT0gTlVMTCkgewotCQkvKiBBdm9pZCByZWN1cnNpb24gKi8KLQkJdG1wX2hhbmRsZXIgPSBsb2dfaGFuZGxlcjsKLQkJbG9nX2hhbmRsZXIgPSBOVUxMOwotCQl0bXBfaGFuZGxlcihsZXZlbCwgZm10YnVmLCBsb2dfaGFuZGxlcl9jdHgpOwotCQlsb2dfaGFuZGxlciA9IHRtcF9oYW5kbGVyOwotCX0gZWxzZSBpZiAobG9nX29uX3N0ZGVycikgewotCQlzbnByaW50Zihtc2didWYsIHNpemVvZiBtc2didWYsICIlc1xyXG4iLCBmbXRidWYpOwotCQl3cml0ZShTVERFUlJfRklMRU5PLCBtc2didWYsIHN0cmxlbihtc2didWYpKTsKLQl9IGVsc2UgewotI2lmIGRlZmluZWQoSEFWRV9PUEVOTE9HX1IpICYmIGRlZmluZWQoU1lTTE9HX0RBVEFfSU5JVCkKLQkJb3BlbmxvZ19yKGFyZ3YwID8gYXJndjAgOiBfX3Byb2duYW1lLCBMT0dfUElELCBsb2dfZmFjaWxpdHksICZzZGF0YSk7Ci0JCXN5c2xvZ19yKHByaSwgJnNkYXRhLCAiJS41MDBzIiwgZm10YnVmKTsKLQkJY2xvc2Vsb2dfcigmc2RhdGEpOwotI2Vsc2UKLQkJb3BlbmxvZyhhcmd2MCA/IGFyZ3YwIDogX19wcm9nbmFtZSwgTE9HX1BJRCwgbG9nX2ZhY2lsaXR5KTsKLQkJc3lzbG9nKHByaSwgIiUuNTAwcyIsIGZtdGJ1Zik7Ci0JCWNsb3NlbG9nKCk7Ci0jZW5kaWYKLQl9Ci0JZXJybm8gPSBzYXZlZF9lcnJubzsKLX0KZGlmZiAtLWdpdCBhL2xvZy5oIGIvbG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOGQyMTQuLjAwMDAwMDAKLS0tIGEvbG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiAkT3BlbkJTRDogbG9nLmgsdiAxLjE4IDIwMTEvMDYvMTcgMjE6NDQ6MzAgZGptIEV4cCAkICovCi0KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotCi0jaWZuZGVmIFNTSF9MT0dfSAotI2RlZmluZSBTU0hfTE9HX0gKLQotLyogU3VwcG9ydGVkIHN5c2xvZyBmYWNpbGl0aWVzIGFuZCBsZXZlbHMuICovCi10eXBlZGVmIGVudW0gewotCVNZU0xPR19GQUNJTElUWV9EQUVNT04sCi0JU1lTTE9HX0ZBQ0lMSVRZX1VTRVIsCi0JU1lTTE9HX0ZBQ0lMSVRZX0FVVEgsCi0jaWZkZWYgTE9HX0FVVEhQUklWCi0JU1lTTE9HX0ZBQ0lMSVRZX0FVVEhQUklWLAotI2VuZGlmCi0JU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMMCwKLQlTWVNMT0dfRkFDSUxJVFlfTE9DQUwxLAotCVNZU0xPR19GQUNJTElUWV9MT0NBTDIsCi0JU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMMywKLQlTWVNMT0dfRkFDSUxJVFlfTE9DQUw0LAotCVNZU0xPR19GQUNJTElUWV9MT0NBTDUsCi0JU1lTTE9HX0ZBQ0lMSVRZX0xPQ0FMNiwKLQlTWVNMT0dfRkFDSUxJVFlfTE9DQUw3LAotCVNZU0xPR19GQUNJTElUWV9OT1RfU0VUID0gLTEKLX0gICAgICAgU3lzbG9nRmFjaWxpdHk7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JU1lTTE9HX0xFVkVMX1FVSUVULAotCVNZU0xPR19MRVZFTF9GQVRBTCwKLQlTWVNMT0dfTEVWRUxfRVJST1IsCi0JU1lTTE9HX0xFVkVMX0lORk8sCi0JU1lTTE9HX0xFVkVMX1ZFUkJPU0UsCi0JU1lTTE9HX0xFVkVMX0RFQlVHMSwKLQlTWVNMT0dfTEVWRUxfREVCVUcyLAotCVNZU0xPR19MRVZFTF9ERUJVRzMsCi0JU1lTTE9HX0xFVkVMX05PVF9TRVQgPSAtMQotfSAgICAgICBMb2dMZXZlbDsKLQotdHlwZWRlZiB2b2lkIChsb2dfaGFuZGxlcl9mbikoTG9nTGV2ZWwsIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKLQotdm9pZCAgICAgbG9nX2luaXQoY2hhciAqLCBMb2dMZXZlbCwgU3lzbG9nRmFjaWxpdHksIGludCk7Ci0KLVN5c2xvZ0ZhY2lsaXR5CWxvZ19mYWNpbGl0eV9udW1iZXIoY2hhciAqKTsKLWNvbnN0IGNoYXIgKiAJbG9nX2ZhY2lsaXR5X25hbWUoU3lzbG9nRmFjaWxpdHkpOwotTG9nTGV2ZWwJbG9nX2xldmVsX251bWJlcihjaGFyICopOwotY29uc3QgY2hhciAqCWxvZ19sZXZlbF9uYW1lKExvZ0xldmVsKTsKLQotdm9pZCAgICAgZmF0YWwoY29uc3QgY2hhciAqLCAuLi4pIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKLSAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOwotdm9pZCAgICAgZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSk7Ci12b2lkICAgICBzaWdkaWUoY29uc3QgY2hhciAqLCAuLi4pICBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCi0gICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKLXZvaWQgICAgIGxvZ2l0KGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOwotdm9pZCAgICAgdmVyYm9zZShjb25zdCBjaGFyICosIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKLXZvaWQgICAgIGRlYnVnKGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOwotdm9pZCAgICAgZGVidWcyKGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOwotdm9pZCAgICAgZGVidWczKGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOwotCi0KLXZvaWQJIHNldF9sb2dfaGFuZGxlcihsb2dfaGFuZGxlcl9mbiAqLCB2b2lkICopOwotdm9pZAkgZG9fbG9nMihMb2dMZXZlbCwgY29uc3QgY2hhciAqLCAuLi4pCi0gICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKLXZvaWQJIGRvX2xvZyhMb2dMZXZlbCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKLXZvaWQJIGNsZWFudXBfZXhpdChpbnQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xvZ2lucmVjLmMgYi9sb2dpbnJlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjk0MWM5Li4wMDAwMDAwCi0tLSBhL2xvZ2lucmVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgQW5kcmUgTHVjYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogUG9ydGlvbnMgY29weXJpZ2h0IChjKSAxOTk4IFRvZGQgQy4gTWlsbGVyCi0gKiBQb3J0aW9ucyBjb3B5cmlnaHQgKGMpIDE5OTYgSmFzb24gRG93bnMKLSAqIFBvcnRpb25zIGNvcHlyaWdodCAoYykgMTk5NiBUaGVvIGRlIFJhYWR0Ci0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS8qCi0gKiBUaGUgYnRtcCBsb2dnaW5nIGNvZGUgaXMgZGVyaXZlZCBmcm9tIGxvZ2luLmMgZnJvbSB1dGlsLWxpbnV4IGFuZCBpcyB1bmRlcgotICogdGhlIHRoZSBmb2xsb3dpbmcgbGljZW5zZToKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODAsIDE5ODcsIDE5ODggVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKLSAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCi0gKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCi0gKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCi0gKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQotICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLQotLyoqCi0gKiogbG9naW5yZWMuYzogIHBsYXRmb3JtLWluZGVwZW5kZW50IGxvZ2luIHJlY29yZGluZyBhbmQgbGFzdGxvZyByZXRyaWV2YWwKLSAqKi8KLQotLyoKLSAqICBUaGUgbmV3IGxvZ2luIGNvZGUgZXhwbGFpbmVkCi0gKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICBUaGlzIGNvZGUgYXR0ZW1wdHMgdG8gcHJvdmlkZSBhIGNvbW1vbiBpbnRlcmZhY2UgdG8gbG9naW4gcmVjb3JkaW5nCi0gKiAgKHV0bXAgYW5kIGZyaWVuZHMpIGFuZCBsYXN0IGxvZ2luIHRpbWUgcmV0cmlldmFsLgotICoKLSAqICBJdHMgcHJpbWFyeSBtZWFucyBvZiBhY2hpZXZpbmcgdGhpcyBpcyB0byB1c2UgJ3N0cnVjdCBsb2dpbmluZm8nLCBhCi0gKiAgdW5pb24gb2YgYWxsIHRoZSB1c2VmdWwgZmllbGRzIGluIHRoZSB2YXJpb3VzIGRpZmZlcmVudCB0eXBlcyBvZgotICogIHN5c3RlbSBsb2dpbiByZWNvcmQgc3RydWN0dXJlcyBvbmUgZmluZHMgb24gVU5JWCB2YXJpYW50cy4KLSAqCi0gKiAgV2UgZGVwZW5kIG9uIGF1dG9jb25mIHRvIGRlZmluZSB3aGljaCByZWNvcmRpbmcgbWV0aG9kcyBhcmUgdG8gYmUKLSAqICB1c2VkLCBhbmQgd2hpY2ggZmllbGRzIGFyZSBjb250YWluZWQgaW4gdGhlIHJlbGV2YW50IGRhdGEgc3RydWN0dXJlcwotICogIG9uIHRoZSBsb2NhbCBzeXN0ZW0uIE1hbnkgQyBwcmVwcm9jZXNzb3Igc3ltYm9scyBhZmZlY3Qgd2hpY2ggY29kZQotICogIGdldHMgY29tcGlsZWQgaGVyZS4KLSAqCi0gKiAgVGhlIGNvZGUgaXMgZGVzaWduZWQgdG8gbWFrZSBpdCBlYXN5IHRvIG1vZGlmeSBhIHBhcnRpY3VsYXIKLSAqICByZWNvcmRpbmcgbWV0aG9kLCB3aXRob3V0IGFmZmVjdGluZyBvdGhlciBtZXRob2RzIG5vciByZXF1aXJpbmcgc28KLSAqICBtYW55IG5lc3RlZCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBibG9ja3MgYXMgd2VyZSBjb21tb25wbGFjZSBpbgotICogIHRoZSBvbGQgY29kZS4KLSAqCi0gKiAgRm9yIGxvZ2luIHJlY29yZGluZywgd2UgdHJ5IHRvIHVzZSB0aGUgbG9jYWwgc3lzdGVtJ3MgbGlicmFyaWVzIGFzCi0gKiAgdGhlc2UgYXJlIGNsZWFybHkgbW9zdCBsaWtlbHkgdG8gd29yayBjb3JyZWN0bHkuIEZvciB1dG1wIHN5c3RlbXMKLSAqICB0aGlzIHVzdWFsbHkgbWVhbnMgbG9naW4oKSBhbmQgbG9nb3V0KCkgb3Igc2V0dXRlbnQoKSBldGMuLCBwcm9iYWJseQotICogIGluIGxpYnV0aWwsIGFsb25nIHdpdGggbG9nd3RtcCgpIGV0Yy4gT24gdGhlc2Ugc3lzdGVtcywgd2UgZmFsbCBiYWNrCi0gKiAgdG8gd3JpdGluZyB0aGUgZmlsZXMgZGlyZWN0bHkgaWYgd2UgaGF2ZSB0bywgdGhvdWdoIHRoaXMgbWV0aG9kCi0gKiAgcmVxdWlyZXMgdmVyeSB0aG9yb3VnaCB0ZXN0aW5nIHNvIHdlIGRvIG5vdCBjb3JydXB0IGxvY2FsIGF1ZGl0aW5nCi0gKiAgaW5mb3JtYXRpb24uIFRoZXNlIGZpbGVzIGFuZCB0aGVpciBhY2Nlc3MgbWV0aG9kcyBhcmUgdmVyeSBzeXN0ZW0KLSAqICBzcGVjaWZpYyBpbmRlZWQuCi0gKgotICogIEZvciB1dG1weCBzeXN0ZW1zLCB0aGUgY29ycmVzcG9uZGluZyBsaWJyYXJ5IGZ1bmN0aW9ucyBhcmUKLSAqICBzZXR1dHhlbnQoKSBldGMuIFRvIHRoZSBhdXRob3IncyBrbm93bGVkZ2UsIGFsbCB1dG1weCBzeXN0ZW1zIGhhdmUKLSAqICB0aGVzZSBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgc28gbm8gZGlyZWN0IHdyaXRlIGlzIGF0dGVtcHRlZC4gSWYgc3VjaAotICogIGEgc3lzdGVtIGV4aXN0cyBhbmQgbmVlZHMgc3VwcG9ydCwgZGlyZWN0IGFuYWxvZ3VlcyBvZiB0aGUgW3V3XXRtcAotICogIGNvZGUgc2hvdWxkIHN1ZmZpY2UuCi0gKgotICogIFJldHJpZXZpbmcgdGhlIHRpbWUgb2YgbGFzdCBsb2dpbiAoJ2xhc3Rsb2cnKSBpcyBpbiBzb21lIHdheXMgZXZlbgotICogIG1vcmUgcHJvYmxlbW1hdGljIHRoYW4gbG9naW4gcmVjb3JkaW5nLiBTb21lIHN5c3RlbXMgcHJvdmlkZSBhCi0gKiAgc2ltcGxlIHRhYmxlIG9mIGFsbCB1c2VycyB3aGljaCB3ZSBzZWVrIGJhc2VkIG9uIHVpZCBhbmQgcmV0cmlldmUgYQotICogIHJlbGF0aXZlbHkgc3RhbmRhcmQgc3RydWN0dXJlLiBPdGhlcnMgcmVjb3JkIHRoZSBzYW1lIGluZm9ybWF0aW9uIGluCi0gKiAgYSBkaXJlY3Rvcnkgd2l0aCBhIHNlcGFyYXRlIGZpbGUsIGFuZCBvdGhlcnMgZG9uJ3QgcmVjb3JkIHRoZQotICogIGluZm9ybWF0aW9uIHNlcGFyYXRlbHkgYXQgYWxsLiBGb3Igc3lzdGVtcyBpbiB0aGUgbGF0dGVyIGNhdGVnb3J5LAotICogIHdlIGxvb2sgYmFja3dhcmRzIGluIHRoZSB3dG1wIG9yIHd0bXB4IGZpbGUgZm9yIHRoZSBsYXN0IGxvZ2luIGVudHJ5Ci0gKiAgZm9yIG91ciB1c2VyLiBOYXR1cmFsbHkgdGhpcyBpcyBzbG93ZXIgYW5kIG9uIGJ1c3kgc3lzdGVtcyBjb3VsZAotICogIGluY3VyIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgcGVuYWx0eS4KLSAqCi0gKiAgQ2FsbGluZyB0aGUgbmV3IGNvZGUKLSAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqICBJbiBPcGVuU1NIIGFsbCBsb2dpbiByZWNvcmRpbmcgYW5kIHJldHJpZXZhbCBpcyBwZXJmb3JtZWQgaW4KLSAqICBsb2dpbi5jLiBIZXJlIHlvdSdsbCBmaW5kIHdvcmtpbmcgZXhhbXBsZXMuIEFsc28sIGluIHRoZSBsb2dpbnRlc3QuYwotICogIHByb2dyYW0gdGhlcmUgYXJlIG1vcmUgZXhhbXBsZXMuCi0gKgotICogIEludGVybmFsIGhhbmRsZXIgY2FsbGluZyBtZXRob2QKLSAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogIFdoZW4gYSBjYWxsIGlzIG1hZGUgdG8gbG9naW5fbG9naW4oKSBvciBsb2dpbl9sb2dvdXQoKSwgYm90aAotICogIHJvdXRpbmVzIHNldCBhIHN0cnVjdCBsb2dpbmluZm8gZmxhZyBkZWZpbmluZyB3aGljaCBhY3Rpb24gKGxvZyBpbiwKLSAqICBvciBsb2cgb3V0KSBpcyB0byBiZSB0YWtlbi4gVGhleSBib3RoIHRoZW4gY2FsbCBsb2dpbl93cml0ZSgpLCB3aGljaAotICogIGNhbGxzIHdoaWNoZXZlciBvZiB0aGUgbWFueSBzdHJ1Y3R1cmUtc3BlY2lmaWMgaGFuZGxlcnMgYXV0b2NvbmYKLSAqICBzZWxlY3RzIGZvciB0aGUgbG9jYWwgc3lzdGVtLgotICoKLSAqICBUaGUgaGFuZGxlcnMgdGhlbXNlbHZlcyBoYW5kbGUgc3lzdGVtIGRhdGEgc3RydWN0dXJlIHNwZWNpZmljcy4gQm90aAotICogIHN0cnVjdCB1dG1wIGFuZCBzdHJ1Y3QgdXRtcHggaGF2ZSB1dGlsaXR5IGZ1bmN0aW9ucyAoc2VlCi0gKiAgY29uc3RydWN0X3V0bXAqKCkpIHRvIHRyeSB0byBtYWtlIGl0IHNpbXBsZXIgdG8gYWRkIGV4dHJhIHN5c3RlbXMKLSAqICB0aGF0IGludHJvZHVjZSBuZXcgZmVhdHVyZXMgdG8gZWl0aGVyIHN0cnVjdHVyZS4KLSAqCi0gKiAgV2hpbGUgaXQgbWF5IHNlZW0gdGVycmlibHkgd2FzdGVmdWwgdG8gcmVwbGljYXRlIHNvIG11Y2ggc2ltaWxhcgotICogIGNvZGUgZm9yIGVhY2ggbWV0aG9kLCBleHBlcmllbmNlIGhhcyBzaG93biB0aGF0IG1haW50YWluaW5nIGNvZGUgdG8KLSAqICB3cml0ZSBib3RoIHN0cnVjdCB1dG1wIGFuZCB1dG1weCBpbiBvbmUgZnVuY3Rpb24sIHdoaWxzdCBtYWludGFpbmluZwotICogIHN1cHBvcnQgZm9yIGFsbCBzeXN0ZW1zIHdoZXRoZXIgdGhleSBoYXZlIGxpYnJhcnkgc3VwcG9ydCBvciBub3QsIGlzCi0gKiAgYSBkaWZmaWN1bHQgYW5kIHRpbWUtY29uc3VtaW5nIHRhc2suCi0gKgotICogIExhc3Rsb2cgc3VwcG9ydCBwcm9jZWVkcyBzaW1pbGFybHkuIEZ1bmN0aW9ucyBsb2dpbl9nZXRfbGFzdGxvZygpCi0gKiAgKGFuZCBpdHMgT3BlblNTSC10dW5lZCBmcmllbmQgbG9naW5fZ2V0X2xhc3Rsb2dfdGltZSgpKSBjYWxsCi0gKiAgZ2V0bGFzdF9lbnRyeSgpLCB3aGljaCB0cmllcyBvbmUgb2YgdGhyZWUgbWV0aG9kcyB0byBmaW5kIHRoZSBsYXN0Ci0gKiAgbG9naW4gdGltZS4gSXQgdXNlcyBsb2NhbCBzeXN0ZW0gbGFzdGxvZyBzdXBwb3J0IGlmIGl0IGNhbiwKLSAqICBvdGhlcndpc2UgaXQgdHJpZXMgd3RtcCBvciB3dG1weCBiZWZvcmUgZ2l2aW5nIHVwIGFuZCByZXR1cm5pbmcgMCwKLSAqICBtZWFuaW5nICJ0aWx0Ii4KLSAqCi0gKiAgTWFpbnRlbmFuY2UKLSAqICAtLS0tLS0tLS0tLQotICoKLSAqICBJbiBtYW55IGNhc2VzIGl0J3MgcG9zc2libGUgdG8gdHdlYWsgYXV0b2NvbmYgdG8gc2VsZWN0IHRoZSBjb3JyZWN0Ci0gKiAgbWV0aG9kcyBmb3IgYSBwYXJ0aWN1bGFyIHBsYXRmb3JtLCBlaXRoZXIgYnkgaW1wcm92aW5nIHRoZSBkZXRlY3Rpb24KLSAqICBjb2RlIChiZXN0KSwgb3IgYnkgcHJlc2V0dGluZyBESVNBQkxFXzxtZXRob2Q+IG9yIENPTkZfPG1ldGhvZD5fRklMRQotICogIHN5bWJvbHMgZm9yIHRoZSBwbGF0Zm9ybS4KLSAqCi0gKiAgVXNlIGxvZ2ludGVzdCB0byBjaGVjayB3aGljaCBzeW1ib2xzIGFyZSBkZWZpbmVkIGJlZm9yZSBtb2RpZnlpbmcKLSAqICBjb25maWd1cmUuYWMgYW5kIGxvZ2lucmVjLmMuIChZb3UgaGF2ZSB0byBidWlsZCBsb2dpbnRlc3QgeW91cnNlbGYKLSAqICB3aXRoICdtYWtlIGxvZ2ludGVzdCcgYXMgaXQncyBub3QgYnVpbHQgYnkgZGVmYXVsdC4pCi0gKgotICogIE90aGVyd2lzZSwgcGF0Y2hlcyB0byB0aGUgc3BlY2lmaWMgbWV0aG9kKHMpIGFyZSB2ZXJ5IGhlbHBmdWwhCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZmRlZiBIQVZFX1BBVEhTX0gKLSMgaW5jbHVkZSA8cGF0aHMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgImxvZ2lucmVjLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAiYXRvbWljaW8uaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJjYW5vaG9zdC5oIgotI2luY2x1ZGUgImF1dGguaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLQotI2lmZGVmIEhBVkVfVVRJTF9ICi0jIGluY2x1ZGUgPHV0aWwuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9MSUJVVElMX0gKLSMgaW5jbHVkZSA8bGlidXRpbC5oPgotI2VuZGlmCi0KLS8qKgotICoqIHByb3RvdHlwZXMgZm9yIGhlbHBlciBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlCi0gKiovCi0KLSNpZiBIQVZFX1VUTVBfSAotdm9pZCBzZXRfdXRtcF90aW1lKHN0cnVjdCBsb2dpbmluZm8gKmxpLCBzdHJ1Y3QgdXRtcCAqdXQpOwotdm9pZCBjb25zdHJ1Y3RfdXRtcChzdHJ1Y3QgbG9naW5pbmZvICpsaSwgc3RydWN0IHV0bXAgKnV0KTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VVE1QWF9ICi12b2lkIHNldF91dG1weF90aW1lKHN0cnVjdCBsb2dpbmluZm8gKmxpLCBzdHJ1Y3QgdXRtcHggKnV0KTsKLXZvaWQgY29uc3RydWN0X3V0bXB4KHN0cnVjdCBsb2dpbmluZm8gKmxpLCBzdHJ1Y3QgdXRtcHggKnV0KTsKLSNlbmRpZgotCi1pbnQgdXRtcF93cml0ZV9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSk7Ci1pbnQgdXRtcHhfd3JpdGVfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpOwotaW50IHd0bXBfd3JpdGVfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpOwotaW50IHd0bXB4X3dyaXRlX2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKLWludCBsYXN0bG9nX3dyaXRlX2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKLWludCBzeXNsb2dpbl93cml0ZV9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSk7Ci0KLWludCBnZXRsYXN0X2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKLWludCBsYXN0bG9nX2dldF9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSk7Ci1pbnQgdXRtcHhfZ2V0X2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKLWludCB3dG1wX2dldF9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSk7Ci1pbnQgd3RtcHhfZ2V0X2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKLQotZXh0ZXJuIEJ1ZmZlciBsb2dpbm1zZzsKLQotLyogcGljayB0aGUgc2hvcnRlc3Qgc3RyaW5nICovCi0jZGVmaW5lIE1JTl9TSVpFT0YoczEsczIpIChzaXplb2YoczEpIDwgc2l6ZW9mKHMyKSA/IHNpemVvZihzMSkgOiBzaXplb2YoczIpKQotCi0vKioKLSAqKiBwbGF0Zm9ybS1pbmRlcGVuZGVudCBsb2dpbiBmdW5jdGlvbnMKLSAqKi8KLQotLyoKLSAqIGxvZ2luX2xvZ2luKHN0cnVjdCBsb2dpbmluZm8gKikgLSBSZWNvcmQgYSBsb2dpbgotICoKLSAqIENhbGwgd2l0aCBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgbG9naW5pbmZvIGluaXRpYWxpc2VkIHdpdGgKLSAqIGxvZ2luX2luaXRfZW50cnkoKSBvciBsb2dpbl9hbGxvY19lbnRyeSgpCi0gKgotICogUmV0dXJuczoKLSAqICA+MCBpZiBzdWNjZXNzZnVsCi0gKiAgMCAgb24gZmFpbHVyZSAod2lsbCB1c2UgT3BlblNTSCdzIGxvZ2dpbmcgZmFjaWxpdGllcyBmb3IgZGlhZ25vc3RpY3MpCi0gKi8KLWludAotbG9naW5fbG9naW4oc3RydWN0IGxvZ2luaW5mbyAqbGkpCi17Ci0JbGktPnR5cGUgPSBMVFlQRV9MT0dJTjsKLQlyZXR1cm4gKGxvZ2luX3dyaXRlKGxpKSk7Ci19Ci0KLQotLyoKLSAqIGxvZ2luX2xvZ291dChzdHJ1Y3QgbG9naW5pbmZvICopIC0gUmVjb3JkIGEgbG9nb3V0Ci0gKgotICogQ2FsbCBhcyB3aXRoIGxvZ2luX2xvZ2luKCkKLSAqCi0gKiBSZXR1cm5zOgotICogID4wIGlmIHN1Y2Nlc3NmdWwKLSAqICAwICBvbiBmYWlsdXJlICh3aWxsIHVzZSBPcGVuU1NIJ3MgbG9nZ2luZyBmYWNpbGl0aWVzIGZvciBkaWFnbm9zdGljcykKLSAqLwotaW50Ci1sb2dpbl9sb2dvdXQoc3RydWN0IGxvZ2luaW5mbyAqbGkpCi17Ci0JbGktPnR5cGUgPSBMVFlQRV9MT0dPVVQ7Ci0JcmV0dXJuIChsb2dpbl93cml0ZShsaSkpOwotfQotCi0vKgotICogbG9naW5fZ2V0X2xhc3Rsb2dfdGltZShpbnQpIC0gUmV0cmlldmUgdGhlIGxhc3QgbG9naW4gdGltZQotICoKLSAqIFJldHJpZXZlIHRoZSBsYXN0IGxvZ2luIHRpbWUgZm9yIHRoZSBnaXZlbiB1aWQuIFdpbGwgdHJ5IHRvIHVzZSB0aGUKLSAqIHN5c3RlbSBsYXN0bG9nIGZhY2lsaXRpZXMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLCBidXQgd2lsbCBmYWxsIGJhY2sKLSAqIHRvIGxvb2tpbmcgaW4gd3RtcC93dG1weCBpZiBuZWNlc3NhcnkKLSAqCi0gKiBSZXR1cm5zOgotICogICAwIG9uIGZhaWx1cmUsIG9yIGlmIHVzZXIgaGFzIG5ldmVyIGxvZ2dlZCBpbgotICogICBUaW1lIGluIHNlY29uZHMgZnJvbSB0aGUgZXBvY2ggaWYgc3VjY2Vzc2Z1bAotICoKLSAqIFVzZWZ1bCBwcmVwcm9jZXNzb3Igc3ltYm9sczoKLSAqICAgRElTQUJMRV9MQVNUTE9HOiBJZiBzZXQsICpuZXZlciogZXZlbiB0cnkgdG8gcmV0cmlldmUgbGFzdGxvZwotICogICAgICAgICAgICAgICAgICAgIGluZm8KLSAqICAgVVNFX0xBU1RMT0c6IElmIHNldCwgaW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBvZiBzeXN0ZW0gbGFzdGxvZwotICogICAgICAgICAgICAgICAgZmFjaWxpdGllcy4gSWYgdGhpcyBhbmQgRElTQUJMRV9MQVNUTE9HIGFyZSBub3Qgc2V0LAotICogICAgICAgICAgICAgICAgdHJ5IHRvIHJldHJpZXZlIGxhc3Rsb2cgaW5mb3JtYXRpb24gZnJvbSB3dG1wL3d0bXB4LgotICovCi11bnNpZ25lZCBpbnQKLWxvZ2luX2dldF9sYXN0bG9nX3RpbWUoY29uc3QgdWlkX3QgdWlkKQotewotCXN0cnVjdCBsb2dpbmluZm8gbGk7Ci0KLQlpZiAobG9naW5fZ2V0X2xhc3Rsb2coJmxpLCB1aWQpKQotCQlyZXR1cm4gKGxpLnR2X3NlYyk7Ci0JZWxzZQotCQlyZXR1cm4gKDApOwotfQotCi0vKgotICogbG9naW5fZ2V0X2xhc3Rsb2coc3RydWN0IGxvZ2luaW5mbyAqLCBpbnQpICAgLSBSZXRyaWV2ZSBhIGxhc3Rsb2cgZW50cnkKLSAqCi0gKiBSZXRyaWV2ZSBhIGxvZ2luaW5mbyBzdHJ1Y3R1cmUgcG9wdWxhdGVkIChvbmx5IHBhcnRpYWxseSkgd2l0aAotICogaW5mb3JtYXRpb24gZnJvbSB0aGUgc3lzdGVtIGxhc3Rsb2cgZGF0YSwgb3IgZnJvbSB3dG1wL3d0bXB4IGlmIG5vCi0gKiBzeXN0ZW0gbGFzdGxvZyBpbmZvcm1hdGlvbiBleGlzdHMuCi0gKgotICogTm90ZSB0aGlzIHJvdXRpbmUgbXVzdCBiZSBnaXZlbiBhIHByZS1hbGxvY2F0ZWQgbG9naW5pbmZvLgotICoKLSAqIFJldHVybnM6Ci0gKiAgPjA6IEEgcG9pbnRlciB0byB5b3VyIHN0cnVjdCBsb2dpbmluZm8gaWYgc3VjY2Vzc2Z1bAotICogIDAgIG9uIGZhaWx1cmUgKHdpbGwgdXNlIE9wZW5TU0gncyBsb2dnaW5nIGZhY2lsaXRpZXMgZm9yIGRpYWdub3N0aWNzKQotICovCi1zdHJ1Y3QgbG9naW5pbmZvICoKLWxvZ2luX2dldF9sYXN0bG9nKHN0cnVjdCBsb2dpbmluZm8gKmxpLCBjb25zdCB1aWRfdCB1aWQpCi17Ci0Jc3RydWN0IHBhc3N3ZCAqcHc7Ci0KLQltZW1zZXQobGksICdcMCcsIHNpemVvZigqbGkpKTsKLQlsaS0+dWlkID0gdWlkOwotCi0JLyoKLQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgJ3JlYWwnIGxhc3Rsb2csIHdlIG5lZWQgdGhlIHVzZXJuYW1lIHRvCi0JICogcmVsaWFibHkgc2VhcmNoIHd0bXAoeCkgZm9yIHRoZSBsYXN0IGxvZ2luIChzZWUKLQkgKiB3dG1wX2dldF9lbnRyeSgpLikKLQkgKi8KLQlwdyA9IGdldHB3dWlkKHVpZCk7Ci0JaWYgKHB3ID09IE5VTEwpCi0JCWZhdGFsKCIlczogQ2Fubm90IGZpbmQgYWNjb3VudCBmb3IgdWlkICVsZCIsIF9fZnVuY19fLAotCQkgICAgKGxvbmcpdWlkKTsKLQotCS8qIE5vIE1JTl9TSVpFT0YgaGVyZSAtIHdlIGFic29sdXRlbHkgKm11c3Qgbm90KiB0cnVuY2F0ZSB0aGUKLQkgKiB1c2VybmFtZSAoWFhYIC0gc28gY2hlY2sgZm9yIHRydW5jISkgKi8KLQlzdHJsY3B5KGxpLT51c2VybmFtZSwgcHctPnB3X25hbWUsIHNpemVvZihsaS0+dXNlcm5hbWUpKTsKLQotCWlmIChnZXRsYXN0X2VudHJ5KGxpKSkKLQkJcmV0dXJuIChsaSk7Ci0JZWxzZQotCQlyZXR1cm4gKE5VTEwpOwotfQotCi0KLS8qCi0gKiBsb2dpbl9hbGxvY19lbnRyeShpbnQsIGNoYXIqLCBjaGFyKiwgY2hhciopICAgIC0gQWxsb2NhdGUgYW5kIGluaXRpYWxpc2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGxvZ2luaW5mbyBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgc3RydWN0IGxvZ2luaW5mbywgYSBkYXRhIHN0cnVjdHVyZQotICogbWVhbnQgdG8gY2FycnkgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHBvcnRhYmx5IHJlY29yZCBsb2dpbiBpbmZvLgotICoKLSAqIFJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3bHkgY3JlYXRlZCBzdHJ1Y3QgbG9naW5pbmZvLiBJZiBtZW1vcnkKLSAqIGFsbG9jYXRpb24gZmFpbHMsIHRoZSBwcm9ncmFtIGhhbHRzLgotICovCi1zdHJ1Y3QKLWxvZ2luaW5mbyAqbG9naW5fYWxsb2NfZW50cnkocGlkX3QgcGlkLCBjb25zdCBjaGFyICp1c2VybmFtZSwKLSAgICBjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3QgY2hhciAqbGluZSkKLXsKLQlzdHJ1Y3QgbG9naW5pbmZvICpuZXdsaTsKLQotCW5ld2xpID0geG1hbGxvYyhzaXplb2YoKm5ld2xpKSk7Ci0JbG9naW5faW5pdF9lbnRyeShuZXdsaSwgcGlkLCB1c2VybmFtZSwgaG9zdG5hbWUsIGxpbmUpOwotCXJldHVybiAobmV3bGkpOwotfQotCi0KLS8qIGxvZ2luX2ZyZWVfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqKSAgICAtIGZyZWUgc3RydWN0IG1lbW9yeSAqLwotdm9pZAotbG9naW5fZnJlZV9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSkKLXsKLQl4ZnJlZShsaSk7Ci19Ci0KLQotLyogbG9naW5faW5pdF9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICosIGludCwgY2hhciosIGNoYXIqLCBjaGFyKikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gaW5pdGlhbGlzZSBhIHN0cnVjdCBsb2dpbmluZm8KLSAqCi0gKiBQb3B1bGF0ZXMgYSBuZXcgc3RydWN0IGxvZ2luaW5mbywgYSBkYXRhIHN0cnVjdHVyZSBtZWFudCB0byBjYXJyeQotICogdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHBvcnRhYmx5IHJlY29yZCBsb2dpbiBpbmZvLgotICoKLSAqIFJldHVybnM6IDEKLSAqLwotaW50Ci1sb2dpbl9pbml0X2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpLCBwaWRfdCBwaWQsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLAotICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25zdCBjaGFyICpsaW5lKQotewotCXN0cnVjdCBwYXNzd2QgKnB3OwotCi0JbWVtc2V0KGxpLCAwLCBzaXplb2YoKmxpKSk7Ci0KLQlsaS0+cGlkID0gcGlkOwotCi0JLyogc2V0IHRoZSBsaW5lIGluZm9ybWF0aW9uICovCi0JaWYgKGxpbmUpCi0JCWxpbmVfZnVsbG5hbWUobGktPmxpbmUsIGxpbmUsIHNpemVvZihsaS0+bGluZSkpOwotCi0JaWYgKHVzZXJuYW1lKSB7Ci0JCXN0cmxjcHkobGktPnVzZXJuYW1lLCB1c2VybmFtZSwgc2l6ZW9mKGxpLT51c2VybmFtZSkpOwotCQlwdyA9IGdldHB3bmFtKGxpLT51c2VybmFtZSk7Ci0JCWlmIChwdyA9PSBOVUxMKSB7Ci0JCQlmYXRhbCgiJXM6IENhbm5vdCBmaW5kIHVzZXIgXCIlc1wiIiwgX19mdW5jX18sCi0JCQkgICAgbGktPnVzZXJuYW1lKTsKLQkJfQotCQlsaS0+dWlkID0gcHctPnB3X3VpZDsKLQl9Ci0KLQlpZiAoaG9zdG5hbWUpCi0JCXN0cmxjcHkobGktPmhvc3RuYW1lLCBob3N0bmFtZSwgc2l6ZW9mKGxpLT5ob3N0bmFtZSkpOwotCi0JcmV0dXJuICgxKTsKLX0KLQotLyoKLSAqIGxvZ2luX3NldF9jdXJyZW50X3RpbWUoc3RydWN0IGxvZ2luaW5mbyAqKSAgICAtIHNldCB0aGUgY3VycmVudCB0aW1lCi0gKgotICogU2V0IHRoZSBjdXJyZW50IHRpbWUgaW4gYSBsb2dpbmluZm8gc3RydWN0dXJlLiBUaGlzIGZ1bmN0aW9uIGlzCi0gKiBtZWFudCB0byBlbGltaW5hdGUgdGhlIG5lZWQgdG8gZGVhbCB3aXRoIHN5c3RlbSBkZXBlbmRlbmNpZXMgZm9yCi0gKiB0aW1lIGhhbmRsaW5nLgotICovCi12b2lkCi1sb2dpbl9zZXRfY3VycmVudF90aW1lKHN0cnVjdCBsb2dpbmluZm8gKmxpKQotewotCXN0cnVjdCB0aW1ldmFsIHR2OwotCi0JZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7Ci0KLQlsaS0+dHZfc2VjID0gdHYudHZfc2VjOwotCWxpLT50dl91c2VjID0gdHYudHZfdXNlYzsKLX0KLQotLyogY29weSBhIHNvY2thZGRyXyogaW50byBvdXIgbG9naW5pbmZvICovCi12b2lkCi1sb2dpbl9zZXRfYWRkcihzdHJ1Y3QgbG9naW5pbmZvICpsaSwgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSwKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgc2Ffc2l6ZSkKLXsKLQl1bnNpZ25lZCBpbnQgYnVmc2l6ZSA9IHNhX3NpemU7Ci0KLQkvKiBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcnJ1biBvdXIgdW5pb24gKi8KLQlpZiAoc2l6ZW9mKGxpLT5ob3N0YWRkcikgPCBzYV9zaXplKQotCQlidWZzaXplID0gc2l6ZW9mKGxpLT5ob3N0YWRkcik7Ci0KLQltZW1jcHkoJmxpLT5ob3N0YWRkci5zYSwgc2EsIGJ1ZnNpemUpOwotfQotCi0KLS8qKgotICoqIGxvZ2luX3dyaXRlOiBDYWxsIGxvdy1sZXZlbCByZWNvcmRpbmcgZnVuY3Rpb25zIGJhc2VkIG9uIGF1dG9jb25mCi0gKiogcmVzdWx0cwotICoqLwotaW50Ci1sb2dpbl93cml0ZShzdHJ1Y3QgbG9naW5pbmZvICpsaSkKLXsKLSNpZm5kZWYgSEFWRV9DWUdXSU4KLQlpZiAoZ2V0ZXVpZCgpICE9IDApIHsKLQkJbG9naXQoIkF0dGVtcHQgdG8gd3JpdGUgbG9naW4gcmVjb3JkcyBieSBub24tcm9vdCB1c2VyIChhYm9ydGluZykiKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0jZW5kaWYKLQotCS8qIHNldCB0aGUgdGltZXN0YW1wICovCi0JbG9naW5fc2V0X2N1cnJlbnRfdGltZShsaSk7Ci0jaWZkZWYgVVNFX0xPR0lOCi0Jc3lzbG9naW5fd3JpdGVfZW50cnkobGkpOwotI2VuZGlmCi0jaWZkZWYgVVNFX0xBU1RMT0cKLQlpZiAobGktPnR5cGUgPT0gTFRZUEVfTE9HSU4pCi0JCWxhc3Rsb2dfd3JpdGVfZW50cnkobGkpOwotI2VuZGlmCi0jaWZkZWYgVVNFX1VUTVAKLQl1dG1wX3dyaXRlX2VudHJ5KGxpKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9XVE1QCi0Jd3RtcF93cml0ZV9lbnRyeShsaSk7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfVVRNUFgKLQl1dG1weF93cml0ZV9lbnRyeShsaSk7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfV1RNUFgKLQl3dG1weF93cml0ZV9lbnRyeShsaSk7Ci0jZW5kaWYKLSNpZmRlZiBDVVNUT01fU1lTX0FVVEhfUkVDT1JEX0xPR0lOCi0JaWYgKGxpLT50eXBlID09IExUWVBFX0xPR0lOICYmCi0JICAgICFzeXNfYXV0aF9yZWNvcmRfbG9naW4obGktPnVzZXJuYW1lLGxpLT5ob3N0bmFtZSxsaS0+bGluZSwKLQkgICAgJmxvZ2lubXNnKSkKLQkJbG9naXQoIldyaXRpbmcgbG9naW4gcmVjb3JkIGZhaWxlZCBmb3IgJXMiLCBsaS0+dXNlcm5hbWUpOwotI2VuZGlmCi0jaWZkZWYgU1NIX0FVRElUX0VWRU5UUwotCWlmIChsaS0+dHlwZSA9PSBMVFlQRV9MT0dJTikKLQkJYXVkaXRfc2Vzc2lvbl9vcGVuKGxpKTsKLQllbHNlIGlmIChsaS0+dHlwZSA9PSBMVFlQRV9MT0dPVVQpCi0JCWF1ZGl0X3Nlc3Npb25fY2xvc2UobGkpOwotI2VuZGlmCi0JcmV0dXJuICgwKTsKLX0KLQotI2lmZGVmIExPR0lOX05FRURTX1VUTVBYCi1pbnQKLWxvZ2luX3V0bXBfb25seShzdHJ1Y3QgbG9naW5pbmZvICpsaSkKLXsKLQlsaS0+dHlwZSA9IExUWVBFX0xPR0lOOwotCWxvZ2luX3NldF9jdXJyZW50X3RpbWUobGkpOwotIyBpZmRlZiBVU0VfVVRNUAotCXV0bXBfd3JpdGVfZW50cnkobGkpOwotIyBlbmRpZgotIyBpZmRlZiBVU0VfV1RNUAotCXd0bXBfd3JpdGVfZW50cnkobGkpOwotIyBlbmRpZgotIyBpZmRlZiBVU0VfVVRNUFgKLQl1dG1weF93cml0ZV9lbnRyeShsaSk7Ci0jIGVuZGlmCi0jIGlmZGVmIFVTRV9XVE1QWAotCXd0bXB4X3dyaXRlX2VudHJ5KGxpKTsKLSMgZW5kaWYKLQlyZXR1cm4gKDApOwotfQotI2VuZGlmCi0KLS8qKgotICoqIGdldGxhc3RfZW50cnk6IENhbGwgbG93LWxldmVsIGZ1bmN0aW9ucyB0byByZXRyaWV2ZSB0aGUgbGFzdCBsb2dpbgotICoqICAgICAgICAgICAgICAgIHRpbWUuCi0gKiovCi0KLS8qIHRha2UgdGhlIHVpZCBpbiBsaSBhbmQgcmV0dXJuIHRoZSBsYXN0IGxvZ2luIHRpbWUgKi8KLWludAotZ2V0bGFzdF9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSkKLXsKLSNpZmRlZiBVU0VfTEFTVExPRwotCXJldHVybihsYXN0bG9nX2dldF9lbnRyeShsaSkpOwotI2Vsc2UgLyogIVVTRV9MQVNUTE9HICovCi0jaWYgZGVmaW5lZChVU0VfVVRNUFgpICYmIGRlZmluZWQoSEFWRV9TRVRVVFhEQikgJiYgXAotICAgIGRlZmluZWQoVVRYREJfTEFTVExPR0lOKSAmJiBkZWZpbmVkKEhBVkVfR0VUVVRYVVNFUikKLQlyZXR1cm4gKHV0bXB4X2dldF9lbnRyeShsaSkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKERJU0FCTEVfTEFTVExPRykKLQkvKiBPbiBzb21lIHN5c3RlbXMgd2Ugc2hvdWxkbid0IGV2ZW4gdHJ5IHRvIG9idGFpbiBsYXN0IGxvZ2luCi0JICogdGltZSwgZS5nLiBBSVggKi8KLQlyZXR1cm4gKDApOwotIyBlbGlmIGRlZmluZWQoVVNFX1dUTVApICYmIFwKLSAgICAoZGVmaW5lZChIQVZFX1RJTUVfSU5fVVRNUCkgfHwgZGVmaW5lZChIQVZFX1RWX0lOX1VUTVApKQotCS8qIHJldHJpZXZlIGxhc3QgbG9naW4gdGltZSBmcm9tIHV0bXAgKi8KLQlyZXR1cm4gKHd0bXBfZ2V0X2VudHJ5KGxpKSk7Ci0jIGVsaWYgZGVmaW5lZChVU0VfV1RNUFgpICYmIFwKLSAgICAoZGVmaW5lZChIQVZFX1RJTUVfSU5fVVRNUFgpIHx8IGRlZmluZWQoSEFWRV9UVl9JTl9VVE1QWCkpCi0JLyogSWYgd3RtcCBpc24ndCBhdmFpbGFibGUsIHRyeSB3dG1weCAqLwotCXJldHVybiAod3RtcHhfZ2V0X2VudHJ5KGxpKSk7Ci0jIGVsc2UKLQkvKiBHaXZlIHVwOiBObyBtZWFucyBvZiByZXRyaWV2aW5nIGxhc3QgbG9naW4gdGltZSAqLwotCXJldHVybiAoMCk7Ci0jIGVuZGlmIC8qIERJU0FCTEVfTEFTVExPRyAqLwotI2VuZGlmIC8qIFVTRV9MQVNUTE9HICovCi19Ci0KLQotCi0vKgotICogJ2xpbmUnIHN0cmluZyB1dGlsaXR5IGZ1bmN0aW9ucwotICoKLSAqIFRoZXNlIGZ1bmN0aW9ucyBwcm9jZXNzIHRoZSAnbGluZScgc3RyaW5nIGludG8gb25lIG9mIHRocmVlIGZvcm1zOgotICoKLSAqIDEuIFRoZSBmdWxsIGZpbGVuYW1lIChpbmNsdWRpbmcgJy9kZXYnKQotICogMi4gVGhlIHN0cmlwcGVkIG5hbWUgKGV4Y2x1ZGluZyAnL2RldicpCi0gKiAzLiBUaGUgYWJicmV2aWF0ZWQgbmFtZSAoZS5nLiAvZGV2L3R0eXAwMCAtPiB5cDAwCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvZGV2L3B0cy8xICAtPiB0cy8xICkKLSAqCi0gKiBGb3JtIDMgaXMgdXNlZCBvbiBzb21lIHN5c3RlbXMgdG8gaWRlbnRpZnkgYSAudG1wLj8gZW50cnkgd2hlbgotICogYXR0ZW1wdGluZyB0byByZW1vdmUgaXQuIFR5cGljYWxseSBib3RoIGFkZGl0aW9uIGFuZCByZW1vdmFsIGlzCi0gKiBwZXJmb3JtZWQgYnkgb25lIGFwcGxpY2F0aW9uIC0gc2F5LCBzc2hkIC0gc28gYXMgbG9uZyBhcyB0aGUgY2hvaWNlCi0gKiB1bmlxdWVseSBpZGVudGlmaWVzIGEgdGVybWluYWwgaXQncyBvay4KLSAqLwotCi0KLS8qCi0gKiBsaW5lX2Z1bGxuYW1lKCk6IGFkZCB0aGUgbGVhZGluZyAnL2Rldi8nIGlmIGl0IGRvZXNuJ3QgZXhpc3QgbWFrZQotICogc3VyZSBkc3QgaGFzIGVub3VnaCBzcGFjZSwgaWYgbm90IGp1c3QgY29weSBzcmMgKHVnaCkKLSAqLwotY2hhciAqCi1saW5lX2Z1bGxuYW1lKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCB1X2ludCBkc3RzaXplKQotewotCW1lbXNldChkc3QsICdcMCcsIGRzdHNpemUpOwotCWlmICgoc3RybmNtcChzcmMsICIvZGV2LyIsIDUpID09IDApIHx8IChkc3RzaXplIDwgKHN0cmxlbihzcmMpICsgNSkpKQotCQlzdHJsY3B5KGRzdCwgc3JjLCBkc3RzaXplKTsKLQllbHNlIHsKLQkJc3RybGNweShkc3QsICIvZGV2LyIsIGRzdHNpemUpOwotCQlzdHJsY2F0KGRzdCwgc3JjLCBkc3RzaXplKTsKLQl9Ci0JcmV0dXJuIChkc3QpOwotfQotCi0vKiBsaW5lX3N0cmlwbmFtZSgpOiBzdHJpcCB0aGUgbGVhZGluZyAnL2RldicgaWYgaXQgZXhpc3RzLCByZXR1cm4gZHN0ICovCi1jaGFyICoKLWxpbmVfc3RyaXBuYW1lKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBpbnQgZHN0c2l6ZSkKLXsKLQltZW1zZXQoZHN0LCAnXDAnLCBkc3RzaXplKTsKLQlpZiAoc3RybmNtcChzcmMsICIvZGV2LyIsIDUpID09IDApCi0JCXN0cmxjcHkoZHN0LCBzcmMgKyA1LCBkc3RzaXplKTsKLQllbHNlCi0JCXN0cmxjcHkoZHN0LCBzcmMsIGRzdHNpemUpOwotCXJldHVybiAoZHN0KTsKLX0KLQotLyoKLSAqIGxpbmVfYWJicmV2bmFtZSgpOiBSZXR1cm4gdGhlIGFiYnJldmlhdGVkICh1c3VhbGx5IGZvdXItY2hhcmFjdGVyKQotICogZm9ybSBvZiB0aGUgbGluZSAoSnVzdCB1c2UgdGhlIGxhc3QgPGRzdHNpemU+IGNoYXJhY3RlcnMgb2YgdGhlCi0gKiBmdWxsIG5hbWUuKQotICoKLSAqIE5PVEU6IHVzZSBzdHJuY3B5IGJlY2F1c2Ugd2UgZG8gTk9UIG5lY2Vzc2FyaWx5IHdhbnQgemVybwotICogdGVybWluYXRpb24KLSAqLwotY2hhciAqCi1saW5lX2FiYnJldm5hbWUoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGludCBkc3RzaXplKQotewotCXNpemVfdCBsZW47Ci0KLQltZW1zZXQoZHN0LCAnXDAnLCBkc3RzaXplKTsKLQotCS8qIEFsd2F5cyBza2lwIHByZWZpeCBpZiBwcmVzZW50ICovCi0JaWYgKHN0cm5jbXAoc3JjLCAiL2Rldi8iLCA1KSA9PSAwKQotCQlzcmMgKz0gNTsKLQotI2lmZGVmIFdJVEhfQUJCUkVWX05PX1RUWQotCWlmIChzdHJuY21wKHNyYywgInR0eSIsIDMpID09IDApCi0JCXNyYyArPSAzOwotI2VuZGlmCi0KLQlsZW4gPSBzdHJsZW4oc3JjKTsKLQotCWlmIChsZW4gPiAwKSB7Ci0JCWlmICgoKGludClsZW4gLSBkc3RzaXplKSA+IDApCi0JCQlzcmMgKz0gICgoaW50KWxlbiAtIGRzdHNpemUpOwotCi0JCS8qIG5vdGU6IF9kb24ndF8gY2hhbmdlIHRoaXMgdG8gc3RybGNweSAqLwotCQlzdHJuY3B5KGRzdCwgc3JjLCAoc2l6ZV90KWRzdHNpemUpOwotCX0KLQotCXJldHVybiAoZHN0KTsKLX0KLQotLyoqCi0gKiogdXRtcCB1dGlsaXR5IGZ1bmN0aW9ucwotICoqCi0gKiogVGhlc2UgZnVuY3Rpb25zIG1hbmlwdWxhdGUgc3RydWN0IHV0bXAsIHRha2luZyBzeXN0ZW0gZGlmZmVyZW5jZXMKLSAqKiBpbnRvIGFjY291bnQuCi0gKiovCi0KLSNpZiBkZWZpbmVkKFVTRV9VVE1QKSB8fCBkZWZpbmVkIChVU0VfV1RNUCkgfHwgZGVmaW5lZCAoVVNFX0xPR0lOKQotCi0vKiBidWlsZCB0aGUgdXRtcCBzdHJ1Y3R1cmUgKi8KLXZvaWQKLXNldF91dG1wX3RpbWUoc3RydWN0IGxvZ2luaW5mbyAqbGksIHN0cnVjdCB1dG1wICp1dCkKLXsKLSMgaWYgZGVmaW5lZChIQVZFX1RWX0lOX1VUTVApCi0JdXQtPnV0X3R2LnR2X3NlYyA9IGxpLT50dl9zZWM7Ci0JdXQtPnV0X3R2LnR2X3VzZWMgPSBsaS0+dHZfdXNlYzsKLSMgZWxpZiBkZWZpbmVkKEhBVkVfVElNRV9JTl9VVE1QKQotCXV0LT51dF90aW1lID0gbGktPnR2X3NlYzsKLSMgZW5kaWYKLX0KLQotdm9pZAotY29uc3RydWN0X3V0bXAoc3RydWN0IGxvZ2luaW5mbyAqbGksCi0JCSAgICBzdHJ1Y3QgdXRtcCAqdXQpCi17Ci0jIGlmZGVmIEhBVkVfQUREUl9WNl9JTl9VVE1QCi0Jc3RydWN0IHNvY2thZGRyX2luNiAqc2E2OwotIyBlbmRpZgotCi0JbWVtc2V0KHV0LCAnXDAnLCBzaXplb2YoKnV0KSk7Ci0KLQkvKiBGaXJzdCBmaWxsIG91dCBmaWVsZHMgdXNlZCBmb3IgYm90aCBsb2dpbnMgYW5kIGxvZ291dHMgKi8KLQotIyBpZmRlZiBIQVZFX0lEX0lOX1VUTVAKLQlsaW5lX2FiYnJldm5hbWUodXQtPnV0X2lkLCBsaS0+bGluZSwgc2l6ZW9mKHV0LT51dF9pZCkpOwotIyBlbmRpZgotCi0jIGlmZGVmIEhBVkVfVFlQRV9JTl9VVE1QCi0JLyogVGhpcyBpcyBkb25lIGhlcmUgdG8ga2VlcCB1dG1wIGNvbnN0YW50cyBvdXQgb2Ygc3RydWN0IGxvZ2luaW5mbyAqLwotCXN3aXRjaCAobGktPnR5cGUpIHsKLQljYXNlIExUWVBFX0xPR0lOOgotCQl1dC0+dXRfdHlwZSA9IFVTRVJfUFJPQ0VTUzsKLSNpZmRlZiBfVU5JQ09TCi0JCWNyYXlfc2V0X3RtcGRpcih1dCk7Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JY2FzZSBMVFlQRV9MT0dPVVQ6Ci0JCXV0LT51dF90eXBlID0gREVBRF9QUk9DRVNTOwotI2lmZGVmIF9VTklDT1MKLQkJY3JheV9yZXRhaW5fdXRtcCh1dCwgbGktPnBpZCk7Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JfQotIyBlbmRpZgotCXNldF91dG1wX3RpbWUobGksIHV0KTsKLQotCWxpbmVfc3RyaXBuYW1lKHV0LT51dF9saW5lLCBsaS0+bGluZSwgc2l6ZW9mKHV0LT51dF9saW5lKSk7Ci0KLSMgaWZkZWYgSEFWRV9QSURfSU5fVVRNUAotCXV0LT51dF9waWQgPSBsaS0+cGlkOwotIyBlbmRpZgotCi0JLyogSWYgd2UncmUgbG9nZ2luZyBvdXQsIGxlYXZlIGFsbCBvdGhlciBmaWVsZHMgYmxhbmsgKi8KLQlpZiAobGktPnR5cGUgPT0gTFRZUEVfTE9HT1VUKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIFRoZXNlIGZpZWxkcyBhcmUgb25seSB1c2VkIHdoZW4gbG9nZ2luZyBpbiwgYW5kIGFyZSBibGFuawotCSAqIGZvciBsb2dvdXRzLgotCSAqLwotCi0JLyogVXNlIHN0cm5jcHkgYmVjYXVzZSB3ZSBkb24ndCBuZWNlc3NhcmlseSB3YW50IG51bGwgdGVybWluYXRpb24gKi8KLQlzdHJuY3B5KHV0LT51dF9uYW1lLCBsaS0+dXNlcm5hbWUsCi0JICAgIE1JTl9TSVpFT0YodXQtPnV0X25hbWUsIGxpLT51c2VybmFtZSkpOwotIyBpZmRlZiBIQVZFX0hPU1RfSU5fVVRNUAotCXN0cm5jcHkodXQtPnV0X2hvc3QsIGxpLT5ob3N0bmFtZSwKLQkgICAgTUlOX1NJWkVPRih1dC0+dXRfaG9zdCwgbGktPmhvc3RuYW1lKSk7Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfQUREUl9JTl9VVE1QCi0JLyogdGhpcyBpcyBqdXN0IGEgMzItYml0IElQIGFkZHJlc3MgKi8KLQlpZiAobGktPmhvc3RhZGRyLnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKQotCQl1dC0+dXRfYWRkciA9IGxpLT5ob3N0YWRkci5zYV9pbi5zaW5fYWRkci5zX2FkZHI7Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfQUREUl9WNl9JTl9VVE1QCi0JLyogdGhpcyBpcyBqdXN0IGEgMTI4LWJpdCBJUHY2IGFkZHJlc3MgKi8KLQlpZiAobGktPmhvc3RhZGRyLnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgewotCQlzYTYgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmbGktPmhvc3RhZGRyLnNhKTsKLQkJbWVtY3B5KHV0LT51dF9hZGRyX3Y2LCBzYTYtPnNpbjZfYWRkci5zNl9hZGRyLCAxNik7Ci0JCWlmIChJTjZfSVNfQUREUl9WNE1BUFBFRCgmc2E2LT5zaW42X2FkZHIpKSB7Ci0JCQl1dC0+dXRfYWRkcl92NlswXSA9IHV0LT51dF9hZGRyX3Y2WzNdOwotCQkJdXQtPnV0X2FkZHJfdjZbMV0gPSAwOwotCQkJdXQtPnV0X2FkZHJfdjZbMl0gPSAwOwotCQkJdXQtPnV0X2FkZHJfdjZbM10gPSAwOwotCQl9Ci0JfQotIyBlbmRpZgotfQotI2VuZGlmIC8qIFVTRV9VVE1QIHx8IFVTRV9XVE1QIHx8IFVTRV9MT0dJTiAqLwotCi0vKioKLSAqKiB1dG1weCB1dGlsaXR5IGZ1bmN0aW9ucwotICoqCi0gKiogVGhlc2UgZnVuY3Rpb25zIG1hbmlwdWxhdGUgc3RydWN0IHV0bXB4LCBhY2NvdW50aW5nIGZvciBzeXN0ZW0KLSAqKiB2YXJpYXRpb25zLgotICoqLwotCi0jaWYgZGVmaW5lZChVU0VfVVRNUFgpIHx8IGRlZmluZWQgKFVTRV9XVE1QWCkKLS8qIGJ1aWxkIHRoZSB1dG1weCBzdHJ1Y3R1cmUgKi8KLXZvaWQKLXNldF91dG1weF90aW1lKHN0cnVjdCBsb2dpbmluZm8gKmxpLCBzdHJ1Y3QgdXRtcHggKnV0eCkKLXsKLSMgaWYgZGVmaW5lZChIQVZFX1RWX0lOX1VUTVBYKQotCXV0eC0+dXRfdHYudHZfc2VjID0gbGktPnR2X3NlYzsKLQl1dHgtPnV0X3R2LnR2X3VzZWMgPSBsaS0+dHZfdXNlYzsKLSMgZWxpZiBkZWZpbmVkKEhBVkVfVElNRV9JTl9VVE1QWCkKLQl1dHgtPnV0X3RpbWUgPSBsaS0+dHZfc2VjOwotIyBlbmRpZgotfQotCi12b2lkCi1jb25zdHJ1Y3RfdXRtcHgoc3RydWN0IGxvZ2luaW5mbyAqbGksIHN0cnVjdCB1dG1weCAqdXR4KQotewotIyBpZmRlZiBIQVZFX0FERFJfVjZfSU5fVVRNUAotCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNhNjsKLSMgIGVuZGlmCi0JbWVtc2V0KHV0eCwgJ1wwJywgc2l6ZW9mKCp1dHgpKTsKLQotIyBpZmRlZiBIQVZFX0lEX0lOX1VUTVBYCi0JbGluZV9hYmJyZXZuYW1lKHV0eC0+dXRfaWQsIGxpLT5saW5lLCBzaXplb2YodXR4LT51dF9pZCkpOwotIyBlbmRpZgotCi0JLyogdGhpcyBpcyBkb25lIGhlcmUgdG8ga2VlcCB1dG1wIGNvbnN0YW50cyBvdXQgb2YgbG9naW5yZWMuaCAqLwotCXN3aXRjaCAobGktPnR5cGUpIHsKLQljYXNlIExUWVBFX0xPR0lOOgotCQl1dHgtPnV0X3R5cGUgPSBVU0VSX1BST0NFU1M7Ci0JCWJyZWFrOwotCWNhc2UgTFRZUEVfTE9HT1VUOgotCQl1dHgtPnV0X3R5cGUgPSBERUFEX1BST0NFU1M7Ci0JCWJyZWFrOwotCX0KLQlsaW5lX3N0cmlwbmFtZSh1dHgtPnV0X2xpbmUsIGxpLT5saW5lLCBzaXplb2YodXR4LT51dF9saW5lKSk7Ci0Jc2V0X3V0bXB4X3RpbWUobGksIHV0eCk7Ci0JdXR4LT51dF9waWQgPSBsaS0+cGlkOwotCi0JLyogc3RybmNweSgpOiBEb24ndCBuZWNlc3NhcmlseSB3YW50IG51bGwgdGVybWluYXRpb24gKi8KLQlzdHJuY3B5KHV0eC0+dXRfdXNlciwgbGktPnVzZXJuYW1lLAotCSAgICBNSU5fU0laRU9GKHV0eC0+dXRfdXNlciwgbGktPnVzZXJuYW1lKSk7Ci0KLQlpZiAobGktPnR5cGUgPT0gTFRZUEVfTE9HT1VUKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIFRoZXNlIGZpZWxkcyBhcmUgb25seSB1c2VkIHdoZW4gbG9nZ2luZyBpbiwgYW5kIGFyZSBibGFuawotCSAqIGZvciBsb2dvdXRzLgotCSAqLwotCi0jIGlmZGVmIEhBVkVfSE9TVF9JTl9VVE1QWAotCXN0cm5jcHkodXR4LT51dF9ob3N0LCBsaS0+aG9zdG5hbWUsCi0JICAgIE1JTl9TSVpFT0YodXR4LT51dF9ob3N0LCBsaS0+aG9zdG5hbWUpKTsKLSMgZW5kaWYKLSMgaWZkZWYgSEFWRV9BRERSX0lOX1VUTVBYCi0JLyogdGhpcyBpcyBqdXN0IGEgMzItYml0IElQIGFkZHJlc3MgKi8KLQlpZiAobGktPmhvc3RhZGRyLnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKQotCQl1dHgtPnV0X2FkZHIgPSBsaS0+aG9zdGFkZHIuc2FfaW4uc2luX2FkZHIuc19hZGRyOwotIyBlbmRpZgotIyBpZmRlZiBIQVZFX0FERFJfVjZfSU5fVVRNUAotCS8qIHRoaXMgaXMganVzdCBhIDEyOC1iaXQgSVB2NiBhZGRyZXNzICovCi0JaWYgKGxpLT5ob3N0YWRkci5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKLQkJc2E2ID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmxpLT5ob3N0YWRkci5zYSk7Ci0JCW1lbWNweSh1dC0+dXRfYWRkcl92Niwgc2E2LT5zaW42X2FkZHIuczZfYWRkciwgMTYpOwotCQlpZiAoSU42X0lTX0FERFJfVjRNQVBQRUQoJnNhNi0+c2luNl9hZGRyKSkgewotCQkJdXQtPnV0X2FkZHJfdjZbMF0gPSB1dC0+dXRfYWRkcl92NlszXTsKLQkJCXV0LT51dF9hZGRyX3Y2WzFdID0gMDsKLQkJCXV0LT51dF9hZGRyX3Y2WzJdID0gMDsKLQkJCXV0LT51dF9hZGRyX3Y2WzNdID0gMDsKLQkJfQotCX0KLSMgZW5kaWYKLSMgaWZkZWYgSEFWRV9TWVNMRU5fSU5fVVRNUFgKLQkvKiB1dF9zeXNsZW4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgdXR4X2hvc3Qgc3RyaW5nICovCi0JdXR4LT51dF9zeXNsZW4gPSBNSU4oc3RybGVuKGxpLT5ob3N0bmFtZSksIHNpemVvZih1dHgtPnV0X2hvc3QpKTsKLSMgZW5kaWYKLX0KLSNlbmRpZiAvKiBVU0VfVVRNUFggfHwgVVNFX1dUTVBYICovCi0KLS8qKgotICoqIExvdy1sZXZlbCB1dG1wIGZ1bmN0aW9ucwotICoqLwotCi0vKiBGSVhNRTogKEFUTCkgdXRtcF93cml0ZV9kaXJlY3QgbmVlZHMgdGVzdGluZyAqLwotI2lmZGVmIFVTRV9VVE1QCi0KLS8qIGlmIHdlIGNhbiwgdXNlIHB1dHV0bGluZSgpIGV0Yy4gKi8KLSMgaWYgIWRlZmluZWQoRElTQUJMRV9QVVRVVExJTkUpICYmIGRlZmluZWQoSEFWRV9TRVRVVEVOVCkgJiYgXAotCWRlZmluZWQoSEFWRV9QVVRVVExJTkUpCi0jICBkZWZpbmUgVVRNUF9VU0VfTElCUkFSWQotIyBlbmRpZgotCi0KLS8qIHdyaXRlIGEgdXRtcCBlbnRyeSB3aXRoIHRoZSBzeXN0ZW0ncyBoZWxwIChwdXR1dGxpbmUoKSBhbmQgcGFscykgKi8KLSMgaWZkZWYgVVRNUF9VU0VfTElCUkFSWQotc3RhdGljIGludAotdXRtcF93cml0ZV9saWJyYXJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpLCBzdHJ1Y3QgdXRtcCAqdXQpCi17Ci0Jc2V0dXRlbnQoKTsKLQlwdXR1dGxpbmUodXQpOwotIyAgaWZkZWYgSEFWRV9FTkRVVEVOVAotCWVuZHV0ZW50KCk7Ci0jICBlbmRpZgotCXJldHVybiAoMSk7Ci19Ci0jIGVsc2UgLyogVVRNUF9VU0VfTElCUkFSWSAqLwotCi0vKgotICogV3JpdGUgYSB1dG1wIGVudHJ5IGRpcmVjdCB0byB0aGUgZmlsZQotICogVGhpcyBpcyBhIHNsaWdodGx5IG1vZGlmaWNhdGlvbiBvZiBjb2RlIGluIE9wZW5CU0QncyBsb2dpbi5jCi0gKi8KLXN0YXRpYyBpbnQKLXV0bXBfd3JpdGVfZGlyZWN0KHN0cnVjdCBsb2dpbmluZm8gKmxpLCBzdHJ1Y3QgdXRtcCAqdXQpCi17Ci0Jc3RydWN0IHV0bXAgb2xkX3V0OwotCXJlZ2lzdGVyIGludCBmZDsKLQlpbnQgdHR5OwotCi0JLyogRklYTUU6IChBVEwpIHR0eXNsb3QoKSBuZWVkcyBsb2NhbCBpbXBsZW1lbnRhdGlvbiAqLwotCi0jaWYgZGVmaW5lZChIQVZFX0dFVFRUWUVOVCkKLQlzdHJ1Y3QgdHR5ZW50ICp0eTsKLQotCXR0eT0wOwotCXNldHR0eWVudCgpOwotCXdoaWxlIChOVUxMICE9ICh0eSA9IGdldHR0eWVudCgpKSkgewotCQl0dHkrKzsKLQkJaWYgKCFzdHJuY21wKHR5LT50eV9uYW1lLCB1dC0+dXRfbGluZSwgc2l6ZW9mKHV0LT51dF9saW5lKSkpCi0JCQlicmVhazsKLQl9Ci0JZW5kdHR5ZW50KCk7Ci0KLQlpZiAoTlVMTCA9PSB0eSkgewotCQlsb2dpdCgiJXM6IHR0eSBub3QgZm91bmQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAoMCk7Ci0JfQotI2Vsc2UgLyogRklYTUUgKi8KLQotCXR0eSA9IHR0eXNsb3QoKTsgLyogc2VlbXMgb25seSB0byB3b3JrIGZvciAvZGV2L3R0eXA/IHN0eWxlIG5hbWVzICovCi0KLSNlbmRpZiAvKiBIQVZFX0dFVFRUWUVOVCAqLwotCi0JaWYgKHR0eSA+IDAgJiYgKGZkID0gb3BlbihVVE1QX0ZJTEUsIE9fUkRXUnxPX0NSRUFULCAwNjQ0KSkgPj0gMCkgewotCQlvZmZfdCBwb3MsIHJldDsKLQotCQlwb3MgPSAob2ZmX3QpdHR5ICogc2l6ZW9mKHN0cnVjdCB1dG1wKTsKLQkJaWYgKChyZXQgPSBsc2VlayhmZCwgcG9zLCBTRUVLX1NFVCkpID09IC0xKSB7Ci0JCQlsb2dpdCgiJXM6IGxzZWVrOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCQkJY2xvc2UoZmQpOwotCQkJcmV0dXJuICgwKTsKLQkJfQotCQlpZiAocmV0ICE9IHBvcykgewotCQkJbG9naXQoIiVzOiBDb3VsZG4ndCBzZWVrIHRvIHR0eSAlZCBzbG90IGluICVzIiwKLQkJCSAgICBfX2Z1bmNfXywgdHR5LCBVVE1QX0ZJTEUpOwotCQkJY2xvc2UoZmQpOwotCQkJcmV0dXJuICgwKTsKLQkJfQotCQkvKgotCQkgKiBQcmV2ZW50IGx1c2VyIGZyb20gemVybydpbmcgb3V0IHV0X2hvc3QuCi0JCSAqIElmIHRoZSBuZXcgdXRfbGluZSBpcyBlbXB0eSBidXQgdGhlIG9sZCBvbmUgaXMgbm90Ci0JCSAqIGFuZCB1dF9saW5lIGFuZCB1dF9uYW1lIG1hdGNoLCBwcmVzZXJ2ZSB0aGUgb2xkIHV0X2xpbmUuCi0JCSAqLwotCQlpZiAoYXRvbWljaW8ocmVhZCwgZmQsICZvbGRfdXQsIHNpemVvZihvbGRfdXQpKSA9PSBzaXplb2Yob2xkX3V0KSAmJgotCQkgICAgKHV0LT51dF9ob3N0WzBdID09ICdcMCcpICYmIChvbGRfdXQudXRfaG9zdFswXSAhPSAnXDAnKSAmJgotCQkgICAgKHN0cm5jbXAob2xkX3V0LnV0X2xpbmUsIHV0LT51dF9saW5lLCBzaXplb2YodXQtPnV0X2xpbmUpKSA9PSAwKSAmJgotCQkgICAgKHN0cm5jbXAob2xkX3V0LnV0X25hbWUsIHV0LT51dF9uYW1lLCBzaXplb2YodXQtPnV0X25hbWUpKSA9PSAwKSkKLQkJCW1lbWNweSh1dC0+dXRfaG9zdCwgb2xkX3V0LnV0X2hvc3QsIHNpemVvZih1dC0+dXRfaG9zdCkpOwotCi0JCWlmICgocmV0ID0gbHNlZWsoZmQsIHBvcywgU0VFS19TRVQpKSA9PSAtMSkgewotCQkJbG9naXQoIiVzOiBsc2VlazogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQkJCWNsb3NlKGZkKTsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQkJaWYgKHJldCAhPSBwb3MpIHsKLQkJCWxvZ2l0KCIlczogQ291bGRuJ3Qgc2VlayB0byB0dHkgJWQgc2xvdCBpbiAlcyIsCi0JCQkgICAgX19mdW5jX18sIHR0eSwgVVRNUF9GSUxFKTsKLQkJCWNsb3NlKGZkKTsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQkJaWYgKGF0b21pY2lvKHZ3cml0ZSwgZmQsIHV0LCBzaXplb2YoKnV0KSkgIT0gc2l6ZW9mKCp1dCkpIHsKLQkJCWxvZ2l0KCIlczogZXJyb3Igd3JpdGluZyAlczogJXMiLCBfX2Z1bmNfXywKLQkJCSAgICBVVE1QX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQljbG9zZShmZCk7Ci0JCQlyZXR1cm4gKDApOwotCQl9Ci0KLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gKDEpOwotCX0gZWxzZSB7Ci0JCXJldHVybiAoMCk7Ci0JfQotfQotIyBlbmRpZiAvKiBVVE1QX1VTRV9MSUJSQVJZICovCi0KLXN0YXRpYyBpbnQKLXV0bXBfcGVyZm9ybV9sb2dpbihzdHJ1Y3QgbG9naW5pbmZvICpsaSkKLXsKLQlzdHJ1Y3QgdXRtcCB1dDsKLQotCWNvbnN0cnVjdF91dG1wKGxpLCAmdXQpOwotIyBpZmRlZiBVVE1QX1VTRV9MSUJSQVJZCi0JaWYgKCF1dG1wX3dyaXRlX2xpYnJhcnkobGksICZ1dCkpIHsKLQkJbG9naXQoIiVzOiB1dG1wX3dyaXRlX2xpYnJhcnkoKSBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAoMCk7Ci0JfQotIyBlbHNlCi0JaWYgKCF1dG1wX3dyaXRlX2RpcmVjdChsaSwgJnV0KSkgewotCQlsb2dpdCgiJXM6IHV0bXBfd3JpdGVfZGlyZWN0KCkgZmFpbGVkIiwgX19mdW5jX18pOwotCQlyZXR1cm4gKDApOwotCX0KLSMgZW5kaWYKLQlyZXR1cm4gKDEpOwotfQotCi0KLXN0YXRpYyBpbnQKLXV0bXBfcGVyZm9ybV9sb2dvdXQoc3RydWN0IGxvZ2luaW5mbyAqbGkpCi17Ci0Jc3RydWN0IHV0bXAgdXQ7Ci0KLQljb25zdHJ1Y3RfdXRtcChsaSwgJnV0KTsKLSMgaWZkZWYgVVRNUF9VU0VfTElCUkFSWQotCWlmICghdXRtcF93cml0ZV9saWJyYXJ5KGxpLCAmdXQpKSB7Ci0JCWxvZ2l0KCIlczogdXRtcF93cml0ZV9saWJyYXJ5KCkgZmFpbGVkIiwgX19mdW5jX18pOwotCQlyZXR1cm4gKDApOwotCX0KLSMgZWxzZQotCWlmICghdXRtcF93cml0ZV9kaXJlY3QobGksICZ1dCkpIHsKLQkJbG9naXQoIiVzOiB1dG1wX3dyaXRlX2RpcmVjdCgpIGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0jIGVuZGlmCi0JcmV0dXJuICgxKTsKLX0KLQotCi1pbnQKLXV0bXBfd3JpdGVfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpCi17Ci0Jc3dpdGNoKGxpLT50eXBlKSB7Ci0JY2FzZSBMVFlQRV9MT0dJTjoKLQkJcmV0dXJuICh1dG1wX3BlcmZvcm1fbG9naW4obGkpKTsKLQotCWNhc2UgTFRZUEVfTE9HT1VUOgotCQlyZXR1cm4gKHV0bXBfcGVyZm9ybV9sb2dvdXQobGkpKTsKLQotCWRlZmF1bHQ6Ci0JCWxvZ2l0KCIlczogaW52YWxpZCB0eXBlIGZpZWxkIiwgX19mdW5jX18pOwotCQlyZXR1cm4gKDApOwotCX0KLX0KLSNlbmRpZiAvKiBVU0VfVVRNUCAqLwotCi0KLS8qKgotICoqIExvdy1sZXZlbCB1dG1weCBmdW5jdGlvbnMKLSAqKi8KLQotLyogbm90IG11Y2ggcG9pbnQgaWYgd2UgZG9uJ3Qgd2FudCB1dG1weCBlbnRyaWVzICovCi0jaWZkZWYgVVNFX1VUTVBYCi0KLS8qIGlmIHdlIGhhdmUgdGhlIHdoZXJld2l0aGFsbCwgdXNlIHB1dHV0eGxpbmUgZXRjLiAqLwotIyBpZiAhZGVmaW5lZChESVNBQkxFX1BVVFVUWExJTkUpICYmIGRlZmluZWQoSEFWRV9TRVRVVFhFTlQpICYmIFwKLQlkZWZpbmVkKEhBVkVfUFVUVVRYTElORSkKLSMgIGRlZmluZSBVVE1QWF9VU0VfTElCUkFSWQotIyBlbmRpZgotCi0KLS8qIHdyaXRlIGEgdXRtcHggZW50cnkgd2l0aCB0aGUgc3lzdGVtJ3MgaGVscCAocHV0dXR4bGluZSgpIGFuZCBwYWxzKSAqLwotIyBpZmRlZiBVVE1QWF9VU0VfTElCUkFSWQotc3RhdGljIGludAotdXRtcHhfd3JpdGVfbGlicmFyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSwgc3RydWN0IHV0bXB4ICp1dHgpCi17Ci0Jc2V0dXR4ZW50KCk7Ci0JcHV0dXR4bGluZSh1dHgpOwotCi0jICBpZmRlZiBIQVZFX0VORFVUWEVOVAotCWVuZHV0eGVudCgpOwotIyAgZW5kaWYKLQlyZXR1cm4gKDEpOwotfQotCi0jIGVsc2UgLyogVVRNUFhfVVNFX0xJQlJBUlkgKi8KLQotLyogd3JpdGUgYSB1dG1wIGVudHJ5IGRpcmVjdCB0byB0aGUgZmlsZSAqLwotc3RhdGljIGludAotdXRtcHhfd3JpdGVfZGlyZWN0KHN0cnVjdCBsb2dpbmluZm8gKmxpLCBzdHJ1Y3QgdXRtcHggKnV0eCkKLXsKLQlsb2dpdCgiJXM6IG5vdCBpbXBsZW1lbnRlZCEiLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuICgwKTsKLX0KLSMgZW5kaWYgLyogVVRNUFhfVVNFX0xJQlJBUlkgKi8KLQotc3RhdGljIGludAotdXRtcHhfcGVyZm9ybV9sb2dpbihzdHJ1Y3QgbG9naW5pbmZvICpsaSkKLXsKLQlzdHJ1Y3QgdXRtcHggdXR4OwotCi0JY29uc3RydWN0X3V0bXB4KGxpLCAmdXR4KTsKLSMgaWZkZWYgVVRNUFhfVVNFX0xJQlJBUlkKLQlpZiAoIXV0bXB4X3dyaXRlX2xpYnJhcnkobGksICZ1dHgpKSB7Ci0JCWxvZ2l0KCIlczogdXRtcF93cml0ZV9saWJyYXJ5KCkgZmFpbGVkIiwgX19mdW5jX18pOwotCQlyZXR1cm4gKDApOwotCX0KLSMgZWxzZQotCWlmICghdXRtcHhfd3JpdGVfZGlyZWN0KGxpLCAmdXQpKSB7Ci0JCWxvZ2l0KCIlczogdXRtcF93cml0ZV9kaXJlY3QoKSBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAoMCk7Ci0JfQotIyBlbmRpZgotCXJldHVybiAoMSk7Ci19Ci0KLQotc3RhdGljIGludAotdXRtcHhfcGVyZm9ybV9sb2dvdXQoc3RydWN0IGxvZ2luaW5mbyAqbGkpCi17Ci0Jc3RydWN0IHV0bXB4IHV0eDsKLQotCWNvbnN0cnVjdF91dG1weChsaSwgJnV0eCk7Ci0jIGlmZGVmIEhBVkVfSURfSU5fVVRNUFgKLQlsaW5lX2FiYnJldm5hbWUodXR4LnV0X2lkLCBsaS0+bGluZSwgc2l6ZW9mKHV0eC51dF9pZCkpOwotIyBlbmRpZgotIyBpZmRlZiBIQVZFX1RZUEVfSU5fVVRNUFgKLQl1dHgudXRfdHlwZSA9IERFQURfUFJPQ0VTUzsKLSMgZW5kaWYKLQotIyBpZmRlZiBVVE1QWF9VU0VfTElCUkFSWQotCXV0bXB4X3dyaXRlX2xpYnJhcnkobGksICZ1dHgpOwotIyBlbHNlCi0JdXRtcHhfd3JpdGVfZGlyZWN0KGxpLCAmdXR4KTsKLSMgZW5kaWYKLQlyZXR1cm4gKDEpOwotfQotCi1pbnQKLXV0bXB4X3dyaXRlX2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKQotewotCXN3aXRjaChsaS0+dHlwZSkgewotCWNhc2UgTFRZUEVfTE9HSU46Ci0JCXJldHVybiAodXRtcHhfcGVyZm9ybV9sb2dpbihsaSkpOwotCWNhc2UgTFRZUEVfTE9HT1VUOgotCQlyZXR1cm4gKHV0bXB4X3BlcmZvcm1fbG9nb3V0KGxpKSk7Ci0JZGVmYXVsdDoKLQkJbG9naXQoIiVzOiBpbnZhbGlkIHR5cGUgZmllbGQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAoMCk7Ci0JfQotfQotI2VuZGlmIC8qIFVTRV9VVE1QWCAqLwotCi0KLS8qKgotICoqIExvdy1sZXZlbCB3dG1wIGZ1bmN0aW9ucwotICoqLwotCi0jaWZkZWYgVVNFX1dUTVAKLQotLyoKLSAqIFdyaXRlIGEgd3RtcCBlbnRyeSBkaXJlY3QgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZQotICogVGhpcyBpcyBhIHNsaWdodCBtb2RpZmljYXRpb24gb2YgY29kZSBpbiBPcGVuQlNEJ3MgbG9nd3RtcC5jCi0gKi8KLXN0YXRpYyBpbnQKLXd0bXBfd3JpdGUoc3RydWN0IGxvZ2luaW5mbyAqbGksIHN0cnVjdCB1dG1wICp1dCkKLXsKLQlzdHJ1Y3Qgc3RhdCBidWY7Ci0JaW50IGZkLCByZXQgPSAxOwotCi0JaWYgKChmZCA9IG9wZW4oV1RNUF9GSUxFLCBPX1dST05MWXxPX0FQUEVORCwgMCkpIDwgMCkgewotCQlsb2dpdCgiJXM6IHByb2JsZW0gd3JpdGluZyAlczogJXMiLCBfX2Z1bmNfXywKLQkJICAgIFdUTVBfRklMRSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JaWYgKGZzdGF0KGZkLCAmYnVmKSA9PSAwKQotCQlpZiAoYXRvbWljaW8odndyaXRlLCBmZCwgdXQsIHNpemVvZigqdXQpKSAhPSBzaXplb2YoKnV0KSkgewotCQkJZnRydW5jYXRlKGZkLCBidWYuc3Rfc2l6ZSk7Ci0JCQlsb2dpdCgiJXM6IHByb2JsZW0gd3JpdGluZyAlczogJXMiLCBfX2Z1bmNfXywKLQkJCSAgICBXVE1QX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlyZXQgPSAwOwotCQl9Ci0JY2xvc2UoZmQpOwotCXJldHVybiAocmV0KTsKLX0KLQotc3RhdGljIGludAotd3RtcF9wZXJmb3JtX2xvZ2luKHN0cnVjdCBsb2dpbmluZm8gKmxpKQotewotCXN0cnVjdCB1dG1wIHV0OwotCi0JY29uc3RydWN0X3V0bXAobGksICZ1dCk7Ci0JcmV0dXJuICh3dG1wX3dyaXRlKGxpLCAmdXQpKTsKLX0KLQotCi1zdGF0aWMgaW50Ci13dG1wX3BlcmZvcm1fbG9nb3V0KHN0cnVjdCBsb2dpbmluZm8gKmxpKQotewotCXN0cnVjdCB1dG1wIHV0OwotCi0JY29uc3RydWN0X3V0bXAobGksICZ1dCk7Ci0JcmV0dXJuICh3dG1wX3dyaXRlKGxpLCAmdXQpKTsKLX0KLQotCi1pbnQKLXd0bXBfd3JpdGVfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpCi17Ci0Jc3dpdGNoKGxpLT50eXBlKSB7Ci0JY2FzZSBMVFlQRV9MT0dJTjoKLQkJcmV0dXJuICh3dG1wX3BlcmZvcm1fbG9naW4obGkpKTsKLQljYXNlIExUWVBFX0xPR09VVDoKLQkJcmV0dXJuICh3dG1wX3BlcmZvcm1fbG9nb3V0KGxpKSk7Ci0JZGVmYXVsdDoKLQkJbG9naXQoIiVzOiBpbnZhbGlkIHR5cGUgZmllbGQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAoMCk7Ci0JfQotfQotCi0KLS8qCi0gKiBOb3RlcyBvbiBmZXRjaGluZyBsb2dpbiBkYXRhIGZyb20gd3RtcC93dG1weAotICoKLSAqIExvZ291dHMgYXJlIHVzdWFsbHkgcmVjb3JkZWQgd2l0aCAoYW1vbmdzdCBvdGhlciB0aGluZ3MpIGEgYmxhbmsKLSAqIHVzZXJuYW1lIG9uIGEgZ2l2ZW4gdHR5IGxpbmUuICBIb3dldmVyLCBzb21lIHN5c3RlbXMgKEhQLVVYIGlzIG9uZSkKLSAqIGxlYXZlIGFsbCBmaWVsZHMgc2V0LCBidXQgY2hhbmdlIHRoZSB1dF90eXBlIGZpZWxkIHRvIERFQURfUFJPQ0VTUy4KLSAqCi0gKiBTaW5jZSB3ZSdyZSBvbmx5IGxvb2tpbmcgZm9yIGxvZ2lucyBoZXJlLCB3ZSBrbm93IHRoYXQgdGhlIHVzZXJuYW1lCi0gKiBtdXN0IGJlIHNldCBjb3JyZWN0bHkuIE9uIHN5c3RlbXMgdGhhdCBsZWF2ZSBpdCBpbiwgd2UgY2hlY2sgZm9yCi0gKiB1dF90eXBlPT1VU0VSX1BST0NFU1MgKGluZGljYXRpbmcgYSBsb2dpbi4pCi0gKgotICogUG9ydGFiaWxpdHk6IFNvbWUgc3lzdGVtcyBtYXkgc2V0IHNvbWV0aGluZyBvdGhlciB0aGFuIFVTRVJfUFJPQ0VTUwotICogdG8gaW5kaWNhdGUgYSBsb2dpbiBwcm9jZXNzLiBJIGRvbid0IGtub3cgb2YgYW55IGFzIEkgd3JpdGUuIEFsc28sCi0gKiBpdCdzIHBvc3NpYmxlIHRoYXQgc29tZSBzeXN0ZW1zIG1heSBib3RoIGxlYXZlIHRoZSB1c2VybmFtZSBpbgotICogcGxhY2UgYW5kIG5vdCBoYXZlIHV0X3R5cGUuCi0gKi8KLQotLyogcmV0dXJuIHRydWUgaWYgdGhpcyB3dG1wIGVudHJ5IGluZGljYXRlcyBhIGxvZ2luICovCi1zdGF0aWMgaW50Ci13dG1wX2lzbG9naW4oc3RydWN0IGxvZ2luaW5mbyAqbGksIHN0cnVjdCB1dG1wICp1dCkKLXsKLQlpZiAoc3RybmNtcChsaS0+dXNlcm5hbWUsIHV0LT51dF9uYW1lLAotCSAgICBNSU5fU0laRU9GKGxpLT51c2VybmFtZSwgdXQtPnV0X25hbWUpKSA9PSAwKSB7Ci0jIGlmZGVmIEhBVkVfVFlQRV9JTl9VVE1QCi0JCWlmICh1dC0+dXRfdHlwZSAmIFVTRVJfUFJPQ0VTUykKLQkJCXJldHVybiAoMSk7Ci0jIGVsc2UKLQkJcmV0dXJuICgxKTsKLSMgZW5kaWYKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci13dG1wX2dldF9lbnRyeShzdHJ1Y3QgbG9naW5pbmZvICpsaSkKLXsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQlzdHJ1Y3QgdXRtcCB1dDsKLQlpbnQgZmQsIGZvdW5kID0gMDsKLQotCS8qIENsZWFyIHRoZSB0aW1lIGVudHJpZXMgaW4gb3VyIGxvZ2luaW5mbyAqLwotCWxpLT50dl9zZWMgPSBsaS0+dHZfdXNlYyA9IDA7Ci0KLQlpZiAoKGZkID0gb3BlbihXVE1QX0ZJTEUsIE9fUkRPTkxZKSkgPCAwKSB7Ci0JCWxvZ2l0KCIlczogcHJvYmxlbSBvcGVuaW5nICVzOiAlcyIsIF9fZnVuY19fLAotCQkgICAgV1RNUF9GSUxFLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKDApOwotCX0KLQlpZiAoZnN0YXQoZmQsICZzdCkgIT0gMCkgewotCQlsb2dpdCgiJXM6IGNvdWxkbid0IHN0YXQgJXM6ICVzIiwgX19mdW5jX18sCi0JCSAgICBXVE1QX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0KLQkvKiBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgbGFzdCBzdHJ1Y3QgdXRtcCAqLwotCWlmIChsc2VlayhmZCwgLShvZmZfdClzaXplb2Yoc3RydWN0IHV0bXApLCBTRUVLX0VORCkgPT0gLTEpIHsKLQkJLyogTG9va3MgbGlrZSB3ZSd2ZSBnb3QgYSBmcmVzaCB3dG1wIGZpbGUgKi8KLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCXdoaWxlICghZm91bmQpIHsKLQkJaWYgKGF0b21pY2lvKHJlYWQsIGZkLCAmdXQsIHNpemVvZih1dCkpICE9IHNpemVvZih1dCkpIHsKLQkJCWxvZ2l0KCIlczogcmVhZCBvZiAlcyBmYWlsZWQ6ICVzIiwgX19mdW5jX18sCi0JCQkgICAgV1RNUF9GSUxFLCBzdHJlcnJvcihlcnJubykpOwotCQkJY2xvc2UgKGZkKTsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQkJaWYgKHd0bXBfaXNsb2dpbihsaSwgJnV0KSApIHsKLQkJCWZvdW5kID0gMTsKLQkJCS8qCi0JCQkgKiBXZSd2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIGEgdGltZSBpbiBzdHJ1Y3QKLQkJCSAqIHV0bXAsIGluIGxvZ2luX2dldGxhc3QoKQotCQkJICovCi0jIGlmZGVmIEhBVkVfVElNRV9JTl9VVE1QCi0JCQlsaS0+dHZfc2VjID0gdXQudXRfdGltZTsKLSMgZWxzZQotIyAgaWYgSEFWRV9UVl9JTl9VVE1QCi0JCQlsaS0+dHZfc2VjID0gdXQudXRfdHYudHZfc2VjOwotIyAgZW5kaWYKLSMgZW5kaWYKLQkJCWxpbmVfZnVsbG5hbWUobGktPmxpbmUsIHV0LnV0X2xpbmUsCi0JCQkgICAgTUlOX1NJWkVPRihsaS0+bGluZSwgdXQudXRfbGluZSkpOwotIyBpZmRlZiBIQVZFX0hPU1RfSU5fVVRNUAotCQkJc3RybGNweShsaS0+aG9zdG5hbWUsIHV0LnV0X2hvc3QsCi0JCQkgICAgTUlOX1NJWkVPRihsaS0+aG9zdG5hbWUsIHV0LnV0X2hvc3QpKTsKLSMgZW5kaWYKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIFNlZWsgYmFjayAyIHggc3RydWN0IHV0bXAgKi8KLQkJaWYgKGxzZWVrKGZkLCAtKG9mZl90KSgyICogc2l6ZW9mKHN0cnVjdCB1dG1wKSksIFNFRUtfQ1VSKSA9PSAtMSkgewotCQkJLyogV2UndmUgZm91bmQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLCBzbyBxdWl0ICovCi0JCQljbG9zZShmZCk7Ci0JCQlyZXR1cm4gKDApOwotCQl9Ci0JfQotCi0JLyogV2UgZm91bmQgYW4gZW50cnkuIFRpZHkgdXAgYW5kIHJldHVybiAqLwotCWNsb3NlKGZkKTsKLQlyZXR1cm4gKDEpOwotfQotIyBlbmRpZiAvKiBVU0VfV1RNUCAqLwotCi0KLS8qKgotICoqIExvdy1sZXZlbCB3dG1weCBmdW5jdGlvbnMKLSAqKi8KLQotI2lmZGVmIFVTRV9XVE1QWAotLyoKLSAqIFdyaXRlIGEgd3RtcHggZW50cnkgZGlyZWN0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUKLSAqIFRoaXMgaXMgYSBzbGlnaHQgbW9kaWZpY2F0aW9uIG9mIGNvZGUgaW4gT3BlbkJTRCdzIGxvZ3d0bXAuYwotICovCi1zdGF0aWMgaW50Ci13dG1weF93cml0ZShzdHJ1Y3QgbG9naW5pbmZvICpsaSwgc3RydWN0IHV0bXB4ICp1dHgpCi17Ci0jaWZuZGVmIEhBVkVfVVBEV1RNUFgKLQlzdHJ1Y3Qgc3RhdCBidWY7Ci0JaW50IGZkLCByZXQgPSAxOwotCi0JaWYgKChmZCA9IG9wZW4oV1RNUFhfRklMRSwgT19XUk9OTFl8T19BUFBFTkQsIDApKSA8IDApIHsKLQkJbG9naXQoIiVzOiBwcm9ibGVtIG9wZW5pbmcgJXM6ICVzIiwgX19mdW5jX18sCi0JCSAgICBXVE1QWF9GSUxFLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCWlmIChmc3RhdChmZCwgJmJ1ZikgPT0gMCkKLQkJaWYgKGF0b21pY2lvKHZ3cml0ZSwgZmQsIHV0eCwgc2l6ZW9mKCp1dHgpKSAhPSBzaXplb2YoKnV0eCkpIHsKLQkJCWZ0cnVuY2F0ZShmZCwgYnVmLnN0X3NpemUpOwotCQkJbG9naXQoIiVzOiBwcm9ibGVtIHdyaXRpbmcgJXM6ICVzIiwgX19mdW5jX18sCi0JCQkgICAgV1RNUFhfRklMRSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCXJldCA9IDA7Ci0JCX0KLQljbG9zZShmZCk7Ci0KLQlyZXR1cm4gKHJldCk7Ci0jZWxzZQotCXVwZHd0bXB4KFdUTVBYX0ZJTEUsIHV0eCk7Ci0JcmV0dXJuICgxKTsKLSNlbmRpZgotfQotCi0KLXN0YXRpYyBpbnQKLXd0bXB4X3BlcmZvcm1fbG9naW4oc3RydWN0IGxvZ2luaW5mbyAqbGkpCi17Ci0Jc3RydWN0IHV0bXB4IHV0eDsKLQotCWNvbnN0cnVjdF91dG1weChsaSwgJnV0eCk7Ci0JcmV0dXJuICh3dG1weF93cml0ZShsaSwgJnV0eCkpOwotfQotCi0KLXN0YXRpYyBpbnQKLXd0bXB4X3BlcmZvcm1fbG9nb3V0KHN0cnVjdCBsb2dpbmluZm8gKmxpKQotewotCXN0cnVjdCB1dG1weCB1dHg7Ci0KLQljb25zdHJ1Y3RfdXRtcHgobGksICZ1dHgpOwotCXJldHVybiAod3RtcHhfd3JpdGUobGksICZ1dHgpKTsKLX0KLQotCi1pbnQKLXd0bXB4X3dyaXRlX2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKQotewotCXN3aXRjaChsaS0+dHlwZSkgewotCWNhc2UgTFRZUEVfTE9HSU46Ci0JCXJldHVybiAod3RtcHhfcGVyZm9ybV9sb2dpbihsaSkpOwotCWNhc2UgTFRZUEVfTE9HT1VUOgotCQlyZXR1cm4gKHd0bXB4X3BlcmZvcm1fbG9nb3V0KGxpKSk7Ci0JZGVmYXVsdDoKLQkJbG9naXQoIiVzOiBpbnZhbGlkIHR5cGUgZmllbGQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAoMCk7Ci0JfQotfQotCi0vKiBQbGVhc2Ugc2VlIHRoZSBub3RlcyBhYm92ZSB3dG1wX2lzbG9naW4oKSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gICBuZXh0IHR3byBmdW5jdGlvbnMgKi8KLQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyB3dG1weCBlbnRyeSBpbmRpY2F0ZXMgYSBsb2dpbiAqLwotc3RhdGljIGludAotd3RtcHhfaXNsb2dpbihzdHJ1Y3QgbG9naW5pbmZvICpsaSwgc3RydWN0IHV0bXB4ICp1dHgpCi17Ci0JaWYgKHN0cm5jbXAobGktPnVzZXJuYW1lLCB1dHgtPnV0X3VzZXIsCi0JICAgIE1JTl9TSVpFT0YobGktPnVzZXJuYW1lLCB1dHgtPnV0X3VzZXIpKSA9PSAwICkgewotIyBpZmRlZiBIQVZFX1RZUEVfSU5fVVRNUFgKLQkJaWYgKHV0eC0+dXRfdHlwZSA9PSBVU0VSX1BST0NFU1MpCi0JCQlyZXR1cm4gKDEpOwotIyBlbHNlCi0JCXJldHVybiAoMSk7Ci0jIGVuZGlmCi0JfQotCXJldHVybiAoMCk7Ci19Ci0KLQotaW50Ci13dG1weF9nZXRfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpCi17Ci0Jc3RydWN0IHN0YXQgc3Q7Ci0Jc3RydWN0IHV0bXB4IHV0eDsKLQlpbnQgZmQsIGZvdW5kPTA7Ci0KLQkvKiBDbGVhciB0aGUgdGltZSBlbnRyaWVzICovCi0JbGktPnR2X3NlYyA9IGxpLT50dl91c2VjID0gMDsKLQotCWlmICgoZmQgPSBvcGVuKFdUTVBYX0ZJTEUsIE9fUkRPTkxZKSkgPCAwKSB7Ci0JCWxvZ2l0KCIlczogcHJvYmxlbSBvcGVuaW5nICVzOiAlcyIsIF9fZnVuY19fLAotCQkgICAgV1RNUFhfRklMRSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JaWYgKGZzdGF0KGZkLCAmc3QpICE9IDApIHsKLQkJbG9naXQoIiVzOiBjb3VsZG4ndCBzdGF0ICVzOiAlcyIsIF9fZnVuY19fLAotCQkgICAgV1RNUFhfRklMRSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCS8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsYXN0IHN0cnVjdCB1dG1weCAqLwotCWlmIChsc2VlayhmZCwgLShvZmZfdClzaXplb2Yoc3RydWN0IHV0bXB4KSwgU0VFS19FTkQpID09IC0xICkgewotCQkvKiBwcm9iYWJseSBhIG5ld2x5IHJvdGF0ZWQgd3RtcHggZmlsZSAqLwotCQljbG9zZShmZCk7Ci0JCXJldHVybiAoMCk7Ci0JfQotCi0Jd2hpbGUgKCFmb3VuZCkgewotCQlpZiAoYXRvbWljaW8ocmVhZCwgZmQsICZ1dHgsIHNpemVvZih1dHgpKSAhPSBzaXplb2YodXR4KSkgewotCQkJbG9naXQoIiVzOiByZWFkIG9mICVzIGZhaWxlZDogJXMiLCBfX2Z1bmNfXywKLQkJCSAgICBXVE1QWF9GSUxFLCBzdHJlcnJvcihlcnJubykpOwotCQkJY2xvc2UgKGZkKTsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQkJLyoKLQkJICogTG9nb3V0cyBhcmUgcmVjb3JkZWQgYXMgYSBibGFuayB1c2VybmFtZSBvbiBhIHBhcnRpY3VsYXIKLQkJICogbGluZS4gU28sIHdlIGp1c3QgbmVlZCB0byBmaW5kIHRoZSB1c2VybmFtZSBpbiBzdHJ1Y3QgdXRtcHgKLQkJICovCi0JCWlmICh3dG1weF9pc2xvZ2luKGxpLCAmdXR4KSkgewotCQkJZm91bmQgPSAxOwotIyBpZiBkZWZpbmVkKEhBVkVfVFZfSU5fVVRNUFgpCi0JCQlsaS0+dHZfc2VjID0gdXR4LnV0X3R2LnR2X3NlYzsKLSMgZWxpZiBkZWZpbmVkKEhBVkVfVElNRV9JTl9VVE1QWCkKLQkJCWxpLT50dl9zZWMgPSB1dHgudXRfdGltZTsKLSMgZW5kaWYKLQkJCWxpbmVfZnVsbG5hbWUobGktPmxpbmUsIHV0eC51dF9saW5lLCBzaXplb2YobGktPmxpbmUpKTsKLSMgaWYgZGVmaW5lZChIQVZFX0hPU1RfSU5fVVRNUFgpCi0JCQlzdHJsY3B5KGxpLT5ob3N0bmFtZSwgdXR4LnV0X2hvc3QsCi0JCQkgICAgTUlOX1NJWkVPRihsaS0+aG9zdG5hbWUsIHV0eC51dF9ob3N0KSk7Ci0jIGVuZGlmCi0JCQljb250aW51ZTsKLQkJfQotCQlpZiAobHNlZWsoZmQsIC0ob2ZmX3QpKDIgKiBzaXplb2Yoc3RydWN0IHV0bXB4KSksIFNFRUtfQ1VSKSA9PSAtMSkgewotCQkJY2xvc2UoZmQpOwotCQkJcmV0dXJuICgwKTsKLQkJfQotCX0KLQotCWNsb3NlKGZkKTsKLQlyZXR1cm4gKDEpOwotfQotI2VuZGlmIC8qIFVTRV9XVE1QWCAqLwotCi0vKioKLSAqKiBMb3ctbGV2ZWwgbGlidXRpbCBsb2dpbigpIGZ1bmN0aW9ucwotICoqLwotCi0jaWZkZWYgVVNFX0xPR0lOCi1zdGF0aWMgaW50Ci1zeXNsb2dpbl9wZXJmb3JtX2xvZ2luKHN0cnVjdCBsb2dpbmluZm8gKmxpKQotewotCXN0cnVjdCB1dG1wICp1dDsKLQotCXV0ID0geG1hbGxvYyhzaXplb2YoKnV0KSk7Ci0JY29uc3RydWN0X3V0bXAobGksIHV0KTsKLQlsb2dpbih1dCk7Ci0JZnJlZSh1dCk7Ci0KLQlyZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgaW50Ci1zeXNsb2dpbl9wZXJmb3JtX2xvZ291dChzdHJ1Y3QgbG9naW5pbmZvICpsaSkKLXsKLSMgaWZkZWYgSEFWRV9MT0dPVVQKLQljaGFyIGxpbmVbVVRfTElORVNJWkVdOwotCi0JKHZvaWQpbGluZV9zdHJpcG5hbWUobGluZSwgbGktPmxpbmUsIHNpemVvZihsaW5lKSk7Ci0KLQlpZiAoIWxvZ291dChsaW5lKSkKLQkJbG9naXQoIiVzOiBsb2dvdXQoKSByZXR1cm5lZCBhbiBlcnJvciIsIF9fZnVuY19fKTsKLSMgIGlmZGVmIEhBVkVfTE9HV1RNUAotCWVsc2UKLQkJbG9nd3RtcChsaW5lLCAiIiwgIiIpOwotIyAgZW5kaWYKLQkvKiBGSVhNRTogKEFUTCAtIGlmIHRoZSBuZWVkIGFyaXNlcykgV2hhdCB0byBkbyBpZiB3ZSBoYXZlCi0JICogbG9naW4sIGJ1dCBubyBsb2dvdXQ/ICB3aGF0IGlmIGxvZ291dCBidXQgbm8gbG9nd3RtcD8gQWxsCi0JICogcm91dGluZXMgYXJlIGluIGxpYnV0aWwgc28gdGhleSBzaG91bGQgYWxsIGJlIHRoZXJlLAotCSAqIGJ1dC4uLiAqLwotIyBlbmRpZgotCXJldHVybiAoMSk7Ci19Ci0KLWludAotc3lzbG9naW5fd3JpdGVfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpCi17Ci0Jc3dpdGNoIChsaS0+dHlwZSkgewotCWNhc2UgTFRZUEVfTE9HSU46Ci0JCXJldHVybiAoc3lzbG9naW5fcGVyZm9ybV9sb2dpbihsaSkpOwotCWNhc2UgTFRZUEVfTE9HT1VUOgotCQlyZXR1cm4gKHN5c2xvZ2luX3BlcmZvcm1fbG9nb3V0KGxpKSk7Ci0JZGVmYXVsdDoKLQkJbG9naXQoIiVzOiBJbnZhbGlkIHR5cGUgZmllbGQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAoMCk7Ci0JfQotfQotI2VuZGlmIC8qIFVTRV9MT0dJTiAqLwotCi0vKiBlbmQgb2YgZmlsZSBsb2ctc3lzbG9naW4uYyAqLwotCi0vKioKLSAqKiBMb3ctbGV2ZWwgbGFzdGxvZyBmdW5jdGlvbnMKLSAqKi8KLQotI2lmZGVmIFVTRV9MQVNUTE9HCi0KLSNpZiAhZGVmaW5lZChMQVNUTE9HX1dSSVRFX1BVVFVUWExJTkUpIHx8ICFkZWZpbmVkKEhBVkVfR0VUTEFTVExPR1hCWU5BTUUpCi0vKiBvcGVuIHRoZSBmaWxlICh1c2luZyBmaWxlbW9kZSkgYW5kIHNlZWsgdG8gdGhlIGxvZ2luIGVudHJ5ICovCi1zdGF0aWMgaW50Ci1sYXN0bG9nX29wZW5zZWVrKHN0cnVjdCBsb2dpbmluZm8gKmxpLCBpbnQgKmZkLCBpbnQgZmlsZW1vZGUpCi17Ci0Jb2ZmX3Qgb2Zmc2V0OwotCWNoYXIgbGFzdGxvZ19maWxlWzEwMjRdOwotCXN0cnVjdCBzdGF0IHN0OwotCi0JaWYgKHN0YXQoTEFTVExPR19GSUxFLCAmc3QpICE9IDApIHsKLQkJbG9naXQoIiVzOiBDb3VsZG4ndCBzdGF0ICVzOiAlcyIsIF9fZnVuY19fLAotCQkgICAgTEFTVExPR19GSUxFLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKDApOwotCX0KLQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgewotCQlzbnByaW50ZihsYXN0bG9nX2ZpbGUsIHNpemVvZihsYXN0bG9nX2ZpbGUpLCAiJXMvJXMiLAotCQkgICAgTEFTVExPR19GSUxFLCBsaS0+dXNlcm5hbWUpOwotCX0gZWxzZSBpZiAoU19JU1JFRyhzdC5zdF9tb2RlKSkgewotCQlzdHJsY3B5KGxhc3Rsb2dfZmlsZSwgTEFTVExPR19GSUxFLCBzaXplb2YobGFzdGxvZ19maWxlKSk7Ci0JfSBlbHNlIHsKLQkJbG9naXQoIiVzOiAlLjEwMHMgaXMgbm90IGEgZmlsZSBvciBkaXJlY3RvcnkhIiwgX19mdW5jX18sCi0JCSAgICBMQVNUTE9HX0ZJTEUpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCSpmZCA9IG9wZW4obGFzdGxvZ19maWxlLCBmaWxlbW9kZSwgMDYwMCk7Ci0JaWYgKCpmZCA8IDApIHsKLQkJZGVidWcoIiVzOiBDb3VsZG4ndCBvcGVuICVzOiAlcyIsIF9fZnVuY19fLAotCQkgICAgbGFzdGxvZ19maWxlLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCWlmIChTX0lTUkVHKHN0LnN0X21vZGUpKSB7Ci0JCS8qIGZpbmQgdGhpcyB1aWQncyBvZmZzZXQgaW4gdGhlIGxhc3Rsb2cgZmlsZSAqLwotCQlvZmZzZXQgPSAob2ZmX3QpICgodV9sb25nKWxpLT51aWQgKiBzaXplb2Yoc3RydWN0IGxhc3Rsb2cpKTsKLQotCQlpZiAobHNlZWsoKmZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSBvZmZzZXQpIHsKLQkJCWxvZ2l0KCIlczogJXMtPmxzZWVrKCk6ICVzIiwgX19mdW5jX18sCi0JCQkgICAgbGFzdGxvZ19maWxlLCBzdHJlcnJvcihlcnJubykpOwotCQkJY2xvc2UoKmZkKTsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKDEpOwotfQotI2VuZGlmIC8qICFMQVNUTE9HX1dSSVRFX1BVVFVUWExJTkUgfHwgIUhBVkVfR0VUTEFTVExPR1hCWU5BTUUgKi8KLQotI2lmZGVmIExBU1RMT0dfV1JJVEVfUFVUVVRYTElORQotaW50Ci1sYXN0bG9nX3dyaXRlX2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKQotewotCXN3aXRjaChsaS0+dHlwZSkgewotCWNhc2UgTFRZUEVfTE9HSU46Ci0JCXJldHVybiAxOyAvKiBsYXN0bG9nIHdyaXR0ZW4gYnkgcHV0dXR4bGluZSAqLwotCWRlZmF1bHQ6Ci0JCWxvZ2l0KCJsYXN0bG9nX3dyaXRlX2VudHJ5OiBJbnZhbGlkIHR5cGUgZmllbGQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotI2Vsc2UgLyogTEFTVExPR19XUklURV9QVVRVVFhMSU5FICovCi1pbnQKLWxhc3Rsb2dfd3JpdGVfZW50cnkoc3RydWN0IGxvZ2luaW5mbyAqbGkpCi17Ci0Jc3RydWN0IGxhc3Rsb2cgbGFzdDsKLQlpbnQgZmQ7Ci0KLQlzd2l0Y2gobGktPnR5cGUpIHsKLQljYXNlIExUWVBFX0xPR0lOOgotCQkvKiBjcmVhdGUgb3VyIHN0cnVjdCBsYXN0bG9nICovCi0JCW1lbXNldCgmbGFzdCwgJ1wwJywgc2l6ZW9mKGxhc3QpKTsKLQkJbGluZV9zdHJpcG5hbWUobGFzdC5sbF9saW5lLCBsaS0+bGluZSwgc2l6ZW9mKGxhc3QubGxfbGluZSkpOwotCQlzdHJsY3B5KGxhc3QubGxfaG9zdCwgbGktPmhvc3RuYW1lLAotCQkgICAgTUlOX1NJWkVPRihsYXN0LmxsX2hvc3QsIGxpLT5ob3N0bmFtZSkpOwotCQlsYXN0LmxsX3RpbWUgPSBsaS0+dHZfc2VjOwotCQotCQlpZiAoIWxhc3Rsb2dfb3BlbnNlZWsobGksICZmZCwgT19SRFdSfE9fQ1JFQVQpKQotCQkJcmV0dXJuICgwKTsKLQkKLQkJLyogd3JpdGUgdGhlIGVudHJ5ICovCi0JCWlmIChhdG9taWNpbyh2d3JpdGUsIGZkLCAmbGFzdCwgc2l6ZW9mKGxhc3QpKSAhPSBzaXplb2YobGFzdCkpIHsKLQkJCWNsb3NlKGZkKTsKLQkJCWxvZ2l0KCIlczogRXJyb3Igd3JpdGluZyB0byAlczogJXMiLCBfX2Z1bmNfXywKLQkJCSAgICBMQVNUTE9HX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlyZXR1cm4gKDApOwotCQl9Ci0JCi0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuICgxKTsKLQlkZWZhdWx0OgotCQlsb2dpdCgiJXM6IEludmFsaWQgdHlwZSBmaWVsZCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci19Ci0jZW5kaWYgLyogTEFTVExPR19XUklURV9QVVRVVFhMSU5FICovCi0KLSNpZmRlZiBIQVZFX0dFVExBU1RMT0dYQllOQU1FCi1pbnQKLWxhc3Rsb2dfZ2V0X2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKQotewotCXN0cnVjdCBsYXN0bG9neCBsLCAqbGw7Ci0KLQlpZiAoKGxsID0gZ2V0bGFzdGxvZ3hieW5hbWUobGktPnVzZXJuYW1lLCAmbCkpID09IE5VTEwpIHsKLQkJbWVtc2V0KCZsLCAnXDAnLCBzaXplb2YobCkpOwotCQlsbCA9ICZsOwotCX0KLQlsaW5lX2Z1bGxuYW1lKGxpLT5saW5lLCBsbC0+bGxfbGluZSwgc2l6ZW9mKGxpLT5saW5lKSk7Ci0Jc3RybGNweShsaS0+aG9zdG5hbWUsIGxsLT5sbF9ob3N0LAotCQlNSU5fU0laRU9GKGxpLT5ob3N0bmFtZSwgbGwtPmxsX2hvc3QpKTsKLQlsaS0+dHZfc2VjID0gbGwtPmxsX3R2LnR2X3NlYzsKLQlsaS0+dHZfdXNlYyA9IGxsLT5sbF90di50dl91c2VjOwotCXJldHVybiAoMSk7Ci19Ci0jZWxzZSAvKiBIQVZFX0dFVExBU1RMT0dYQllOQU1FICovCi1pbnQKLWxhc3Rsb2dfZ2V0X2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKQotewotCXN0cnVjdCBsYXN0bG9nIGxhc3Q7Ci0JaW50IGZkLCByZXQ7Ci0KLQlpZiAoIWxhc3Rsb2dfb3BlbnNlZWsobGksICZmZCwgT19SRE9OTFkpKQotCQlyZXR1cm4gKDApOwotCi0JcmV0ID0gYXRvbWljaW8ocmVhZCwgZmQsICZsYXN0LCBzaXplb2YobGFzdCkpOwotCWNsb3NlKGZkKTsKLQotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAwOgotCQltZW1zZXQoJmxhc3QsICdcMCcsIHNpemVvZihsYXN0KSk7Ci0JCS8qIEZBTExUSFJVICovCi0JY2FzZSBzaXplb2YobGFzdCk6Ci0JCWxpbmVfZnVsbG5hbWUobGktPmxpbmUsIGxhc3QubGxfbGluZSwgc2l6ZW9mKGxpLT5saW5lKSk7Ci0JCXN0cmxjcHkobGktPmhvc3RuYW1lLCBsYXN0LmxsX2hvc3QsCi0JCSAgICBNSU5fU0laRU9GKGxpLT5ob3N0bmFtZSwgbGFzdC5sbF9ob3N0KSk7Ci0JCWxpLT50dl9zZWMgPSBsYXN0LmxsX3RpbWU7Ci0JCXJldHVybiAoMSk7Ci0JY2FzZSAtMToKLQkJZXJyb3IoIiVzOiBFcnJvciByZWFkaW5nIGZyb20gJXM6ICVzIiwgX19mdW5jX18sCi0JCSAgICBMQVNUTE9HX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoMCk7Ci0JZGVmYXVsdDoKLQkJZXJyb3IoIiVzOiBFcnJvciByZWFkaW5nIGZyb20gJXM6IEV4cGVjdGluZyAlZCwgZ290ICVkIiwKLQkJICAgIF9fZnVuY19fLCBMQVNUTE9HX0ZJTEUsIChpbnQpc2l6ZW9mKGxhc3QpLCByZXQpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCS8qIE5PVFJFQUNIRUQgKi8KLQlyZXR1cm4gKDApOwotfQotI2VuZGlmIC8qIEhBVkVfR0VUTEFTVExPR1hCWU5BTUUgKi8KLSNlbmRpZiAvKiBVU0VfTEFTVExPRyAqLwotCi0jaWYgZGVmaW5lZChVU0VfVVRNUFgpICYmIGRlZmluZWQoSEFWRV9TRVRVVFhEQikgJiYgXAotICAgIGRlZmluZWQoVVRYREJfTEFTVExPR0lOKSAmJiBkZWZpbmVkKEhBVkVfR0VUVVRYVVNFUikKLWludAotdXRtcHhfZ2V0X2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKQotewotCXN0cnVjdCB1dG1weCAqdXR4OwotCi0JaWYgKHNldHV0eGRiKFVUWERCX0xBU1RMT0dJTiwgTlVMTCkgIT0gMCkKLQkJcmV0dXJuICgwKTsKLQl1dHggPSBnZXR1dHh1c2VyKGxpLT51c2VybmFtZSk7Ci0JaWYgKHV0eCA9PSBOVUxMKSB7Ci0JCWVuZHV0eGVudCgpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCWxpbmVfZnVsbG5hbWUobGktPmxpbmUsIHV0eC0+dXRfbGluZSwKLQkgICAgTUlOX1NJWkVPRihsaS0+bGluZSwgdXR4LT51dF9saW5lKSk7Ci0Jc3RybGNweShsaS0+aG9zdG5hbWUsIHV0eC0+dXRfaG9zdCwKLQkgICAgTUlOX1NJWkVPRihsaS0+aG9zdG5hbWUsIHV0eC0+dXRfaG9zdCkpOwotCWxpLT50dl9zZWMgPSB1dHgtPnV0X3R2LnR2X3NlYzsKLQlsaS0+dHZfdXNlYyA9IHV0eC0+dXRfdHYudHZfdXNlYzsKLQllbmR1dHhlbnQoKTsKLQlyZXR1cm4gKDEpOwotfQotI2VuZGlmIC8qIFVTRV9VVE1QWCAmJiBIQVZFX1NFVFVUWERCICYmIFVUWERCX0xBU1RMT0dJTiAmJiBIQVZFX0dFVFVUWFVTRVIgKi8KLQotI2lmZGVmIFVTRV9CVE1QCi0gIC8qCi0gICAqIExvZ3MgZmFpbGVkIGxvZ2luIGF0dGVtcHRzIGluIF9QQVRIX0JUTVAgaWYgdGhhdCBleGlzdHMuCi0gICAqIFRoZSBtb3N0IGNvbW1vbiBsb2dpbiBmYWlsdXJlIGlzIHRvIGdpdmUgcGFzc3dvcmQgaW5zdGVhZCBvZiB1c2VybmFtZS4KLSAgICogU28gdGhlIF9QQVRIX0JUTVAgZmlsZSBjaGVja2VkIGZvciB0aGUgY29ycmVjdCBwZXJtaXNzaW9uLCBzbyB0aGF0Ci0gICAqIG9ubHkgcm9vdCBjYW4gcmVhZCBpdC4KLSAgICovCi0KLXZvaWQKLXJlY29yZF9mYWlsZWRfbG9naW4oY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAotICAgIGNvbnN0IGNoYXIgKnR0eW4pCi17Ci0JaW50IGZkOwotCXN0cnVjdCB1dG1wIHV0OwotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGZyb207Ci0Jc29ja2xlbl90IGZyb21sZW4gPSBzaXplb2YoZnJvbSk7Ci0Jc3RydWN0IHNvY2thZGRyX2luICphNDsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphNjsKLQl0aW1lX3QgdDsKLQlzdHJ1Y3Qgc3RhdCBmc3Q7Ci0KLQlpZiAoZ2V0ZXVpZCgpICE9IDApCi0JCXJldHVybjsKLQlpZiAoKGZkID0gb3BlbihfUEFUSF9CVE1QLCBPX1dST05MWSB8IE9fQVBQRU5EKSkgPCAwKSB7Ci0JCWRlYnVnKCJVbmFibGUgdG8gb3BlbiB0aGUgYnRtcCBmaWxlICVzOiAlcyIsIF9QQVRIX0JUTVAsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm47Ci0JfQotCWlmIChmc3RhdChmZCwgJmZzdCkgPCAwKSB7Ci0JCWxvZ2l0KCIlczogZnN0YXQgb2YgJXMgZmFpbGVkOiAlcyIsIF9fZnVuY19fLCBfUEFUSF9CVE1QLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmKChmc3Quc3RfbW9kZSAmIChTX0lYR1JQIHwgU19JUldYTykpIHx8IChmc3Quc3RfdWlkICE9IDApKXsKLQkJbG9naXQoIkV4Y2VzcyBwZXJtaXNzaW9uIG9yIGJhZCBvd25lcnNoaXAgb24gZmlsZSAlcyIsCi0JCSAgICBfUEFUSF9CVE1QKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbWVtc2V0KCZ1dCwgMCwgc2l6ZW9mKHV0KSk7Ci0JLyogc3RybmNweSBiZWNhdXNlIHdlIGRvbid0IG5lY2Vzc2FyaWx5IHdhbnQgbnVsIHRlcm1pbmF0aW9uICovCi0Jc3RybmNweSh1dC51dF91c2VyLCB1c2VybmFtZSwgc2l6ZW9mKHV0LnV0X3VzZXIpKTsKLQlzdHJsY3B5KHV0LnV0X2xpbmUsICJzc2g6bm90dHkiLCBzaXplb2YodXQudXRfbGluZSkpOwotCi0JdGltZSgmdCk7Ci0JdXQudXRfdGltZSA9IHQ7ICAgICAvKiB1dF90aW1lIGlzIG5vdCBhbHdheXMgYSB0aW1lX3QgKi8KLQl1dC51dF90eXBlID0gTE9HSU5fUFJPQ0VTUzsKLQl1dC51dF9waWQgPSBnZXRwaWQoKTsKLQotCS8qIHN0cm5jcHkgYmVjYXVzZSB3ZSBkb24ndCBuZWNlc3NhcmlseSB3YW50IG51bCB0ZXJtaW5hdGlvbiAqLwotCXN0cm5jcHkodXQudXRfaG9zdCwgaG9zdG5hbWUsIHNpemVvZih1dC51dF9ob3N0KSk7Ci0KLQlpZiAocGFja2V0X2Nvbm5lY3Rpb25faXNfb25fc29ja2V0KCkgJiYKLQkgICAgZ2V0cGVlcm5hbWUocGFja2V0X2dldF9jb25uZWN0aW9uX2luKCksCi0JICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbSwgJmZyb21sZW4pID09IDApIHsKLQkJaXB2NjRfbm9ybWFsaXNlX21hcHBlZCgmZnJvbSwgJmZyb21sZW4pOwotCQlpZiAoZnJvbS5zc19mYW1pbHkgPT0gQUZfSU5FVCkgewotCQkJYTQgPSAoc3RydWN0IHNvY2thZGRyX2luICopJmZyb207Ci0JCQltZW1jcHkoJnV0LnV0X2FkZHIsICYoYTQtPnNpbl9hZGRyKSwKLQkJCSAgICBNSU5fU0laRU9GKHV0LnV0X2FkZHIsIGE0LT5zaW5fYWRkcikpOwotCQl9Ci0jaWZkZWYgSEFWRV9BRERSX1Y2X0lOX1VUTVAKLQkJaWYgKGZyb20uc3NfZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0JCQlhNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmZyb207Ci0JCQltZW1jcHkoJnV0LnV0X2FkZHJfdjYsICYoYTYtPnNpbjZfYWRkciksCi0JCQkgICAgTUlOX1NJWkVPRih1dC51dF9hZGRyX3Y2LCBhNi0+c2luNl9hZGRyKSk7Ci0JCX0KLSNlbmRpZgotCX0KLQotCWlmIChhdG9taWNpbyh2d3JpdGUsIGZkLCAmdXQsIHNpemVvZih1dCkpICE9IHNpemVvZih1dCkpCi0JCWVycm9yKCJGYWlsZWQgdG8gd3JpdGUgdG8gJXM6ICVzIiwgX1BBVEhfQlRNUCwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0KLW91dDoKLQljbG9zZShmZCk7Ci19Ci0jZW5kaWYJLyogVVNFX0JUTVAgKi8KZGlmZiAtLWdpdCBhL2xvZ2lucmVjLmggYi9sb2dpbnJlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODkyM2U3Li4wMDAwMDAwCi0tLSBhL2xvZ2lucmVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotI2lmbmRlZiBfSEFWRV9MT0dJTlJFQ19IXwotI2RlZmluZSBfSEFWRV9MT0dJTlJFQ19IXwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIEFuZHJlIEx1Y2FzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotLyoqCi0gKiogbG9naW5yZWMuaDogIHBsYXRmb3JtLWluZGVwZW5kZW50IGxvZ2luIHJlY29yZGluZyBhbmQgbGFzdGxvZyByZXRyaWV2YWwKLSAqKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLS8qKgotICoqIHlvdSBzaG91bGQgdXNlIHRoZSBsb2dpbl8qIGNhbGxzIHRvIHdvcmsgYXJvdW5kIHBsYXRmb3JtIGRlcGVuZGVuY2llcwotICoqLwotCi0vKgotICogbG9naW5fbmV0aW5mbyBzdHJ1Y3R1cmUKLSAqLwotCi11bmlvbiBsb2dpbl9uZXRpbmZvIHsKLQlzdHJ1Y3Qgc29ja2FkZHIgc2E7Ci0Jc3RydWN0IHNvY2thZGRyX2luIHNhX2luOwotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhX3N0b3JhZ2U7Ci19OwotCi0vKgotICogICAqIGxvZ2luaW5mbyBzdHJ1Y3R1cmUgICoKLSAqLwotLyogdHlwZXMgLSBkaWZmZXJlbnQgdG8gdXRtcC5oICd0eXBlJyBtYWNyb3MgKi8KLS8qICh0aG91Z2ggc2V0IHRvIHRoZSBzYW1lIHZhbHVlIGFzIGxpbnV4LCBvcGVuYnNkIGFuZCBvdGhlcnMuLi4pICovCi0jZGVmaW5lIExUWVBFX0xPR0lOICAgIDcKLSNkZWZpbmUgTFRZUEVfTE9HT1VUICAgOAotCi0vKiBzdHJpbmcgbGVuZ3RocyAtIHNldCB2ZXJ5IGxvbmcgKi8KLSNkZWZpbmUgTElORk9fUFJPR1NJWkUgNjQKLSNkZWZpbmUgTElORk9fTElORVNJWkUgNjQKLSNkZWZpbmUgTElORk9fTkFNRVNJWkUgNTEyCi0jZGVmaW5lIExJTkZPX0hPU1RTSVpFIDI1NgotCi1zdHJ1Y3QgbG9naW5pbmZvIHsKLQljaGFyICAgICAgIHByb2duYW1lW0xJTkZPX1BST0dTSVpFXTsgICAgIC8qIG5hbWUgb2YgcHJvZ3JhbSAoZm9yIFBBTSkgKi8KLQlpbnQgICAgICAgIHByb2duYW1lX251bGw7Ci0Jc2hvcnQgaW50ICB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0eXBlIG9mIGxvZ2luIChMVFlQRV8qKSAqLwotCXBpZF90ICAgICAgcGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUElEIG9mIGxvZ2luIHByb2Nlc3MgKi8KLQl1aWRfdCAgICAgIHVpZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVJRCBvZiB0aGlzIHVzZXIgKi8KLQljaGFyICAgICAgIGxpbmVbTElORk9fTElORVNJWkVdOyAgICAgICAgIC8qIHR0eS9wdHkgbmFtZSAqLwotCWNoYXIgICAgICAgdXNlcm5hbWVbTElORk9fTkFNRVNJWkVdOyAgICAgLyogbG9naW4gdXNlcm5hbWUgKi8KLQljaGFyICAgICAgIGhvc3RuYW1lW0xJTkZPX0hPU1RTSVpFXTsgICAgIC8qIHJlbW90ZSBob3N0bmFtZSAqLwotCS8qICdleGl0X3N0YXR1cycgc3RydWN0dXJlIGNvbXBvbmVudHMgKi8KLQlpbnQgICAgICAgIGV4aXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvY2VzcyBleGl0IHN0YXR1cyAqLwotCWludCAgICAgICAgdGVybWluYXRpb247ICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzIHRlcm1pbmF0aW9uIHN0YXR1cyAqLwotCS8qIHN0cnVjdCB0aW1ldmFsIChzeXMvdGltZS5oKSBpc24ndCBhbHdheXMgYXZhaWxhYmxlLCBpZiBpdCBpc24ndCB3ZSdsbAotCSAqIHVzZSB0aW1lX3QncyB2YWx1ZSBhcyB0dl9zZWMgYW5kIHNldCB0dl91c2VjIHRvIDAKLQkgKi8KLQl1bnNpZ25lZCBpbnQgdHZfc2VjOwotCXVuc2lnbmVkIGludCB0dl91c2VjOwotCXVuaW9uIGxvZ2luX25ldGluZm8gaG9zdGFkZHI7ICAgICAgIC8qIGNhbGxlcidzIGhvc3QgYWRkcmVzcyhlcykgKi8KLX07IC8qIHN0cnVjdCBsb2dpbmluZm8gKi8KLQotLyoKLSAqIGxvZ2luIHJlY29yZGluZyBmdW5jdGlvbnMKLSAqLwotCi0vKiogJ3B1YmxpYycgZnVuY3Rpb25zICovCi0KLS8qIGNvbnN0cnVjdCBhIG5ldyBsb2dpbiBlbnRyeSAqLwotc3RydWN0IGxvZ2luaW5mbyAqbG9naW5fYWxsb2NfZW50cnkocGlkX3QgcGlkLCBjb25zdCBjaGFyICp1c2VybmFtZSwKLQkJCQkgICAgY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKmxpbmUpOwotLyogZnJlZSBhIHN0cnVjdHVyZSAqLwotdm9pZCBsb2dpbl9mcmVlX2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKLS8qIGZpbGwgb3V0IGEgcHJlLWFsbG9jYXRlZCBzdHJ1Y3R1cmUgd2l0aCB1c2VmdWwgaW5mb3JtYXRpb24gKi8KLWludCBsb2dpbl9pbml0X2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpLCBwaWRfdCBwaWQsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLAotCQkgICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25zdCBjaGFyICpsaW5lKTsKLS8qIHBsYWNlIHRoZSBjdXJyZW50IHRpbWUgaW4gYSBsb2dpbmluZm8gc3RydWN0ICovCi12b2lkIGxvZ2luX3NldF9jdXJyZW50X3RpbWUoc3RydWN0IGxvZ2luaW5mbyAqbGkpOwotCi0vKiByZWNvcmQgdGhlIGVudHJ5ICovCi1pbnQgbG9naW5fbG9naW4gKHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKLWludCBsb2dpbl9sb2dvdXQoc3RydWN0IGxvZ2luaW5mbyAqbGkpOwotI2lmZGVmIExPR0lOX05FRURTX1VUTVBYCi1pbnQgbG9naW5fdXRtcF9vbmx5KHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKLSNlbmRpZgotCi0vKiogRW5kIG9mIHB1YmxpYyBmdW5jdGlvbnMgKi8KLQotLyogcmVjb3JkIHRoZSBlbnRyeSAqLwotaW50IGxvZ2luX3dyaXRlIChzdHJ1Y3QgbG9naW5pbmZvICpsaSk7Ci1pbnQgbG9naW5fbG9nX2VudHJ5KHN0cnVjdCBsb2dpbmluZm8gKmxpKTsKLQotLyogc2V0IHRoZSBuZXR3b3JrIGFkZHJlc3MgYmFzZWQgb24gbmV0d29yayBhZGRyZXNzIHR5cGUgKi8KLXZvaWQgbG9naW5fc2V0X2FkZHIoc3RydWN0IGxvZ2luaW5mbyAqbGksIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EsCi0JCSAgICBjb25zdCB1bnNpZ25lZCBpbnQgc2Ffc2l6ZSk7Ci0KLS8qCi0gKiBsYXN0bG9nIHJldHJpZXZhbCBmdW5jdGlvbnMKLSAqLwotLyogbGFzdGxvZyAqZW50cnkqIGZ1bmN0aW9ucyBmaWxsIG91dCBhIGxvZ2luaW5mbyAqLwotc3RydWN0IGxvZ2luaW5mbyAqbG9naW5fZ2V0X2xhc3Rsb2coc3RydWN0IGxvZ2luaW5mbyAqbGksIGNvbnN0IHVpZF90IHVpZCk7Ci0vKiBsYXN0bG9nICp0aW1lKiBmdW5jdGlvbnMgcmV0dXJuIHRpbWVfdCBlcXVpdmFsZW50ICh1aW50KSAqLwotdW5zaWduZWQgaW50IGxvZ2luX2dldF9sYXN0bG9nX3RpbWUoY29uc3QgdWlkX3QgdWlkKTsKLQotLyogcHJvZHVjZSB2YXJpb3VzIGZvcm1zIG9mIHRoZSBsaW5lIGZpbGVuYW1lICovCi1jaGFyICpsaW5lX2Z1bGxuYW1lKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCB1X2ludCBkc3RzaXplKTsKLWNoYXIgKmxpbmVfc3RyaXBuYW1lKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBpbnQgZHN0c2l6ZSk7Ci1jaGFyICpsaW5lX2FiYnJldm5hbWUoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGludCBkc3RzaXplKTsKLQotdm9pZCByZWNvcmRfZmFpbGVkX2xvZ2luKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotCi0jZW5kaWYgLyogX0hBVkVfTE9HSU5SRUNfSF8gKi8KZGlmZiAtLWdpdCBhL2xvZ2ludGVzdC5jIGIvbG9naW50ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTdhZTAuLjAwMDAwMDAKLS0tIGEvbG9naW50ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBBbmRyZSBMdWNhcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS8qKgotICoqIGxvZ2ludGVzdC5jOiAgc2ltcGxlIHRlc3QgZHJpdmVyIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBsb2dpbiByZWNvcmRpbmcKLSAqKiAgICAgICAgICAgICAgIGFuZCBsYXN0bG9nIHJldHJpZXZhbAotICoqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2lmZGVmIEhBVkVfVElNRV9ICi0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsb2dpbnJlYy5oIgotCi1leHRlcm4gY2hhciAqX19wcm9nbmFtZTsKLQotI2RlZmluZSBQQVVTRV9CRUZPUkVfTE9HT1VUIDMKLQotaW50IG5vbG9ndGVzdCA9IDA7Ci1pbnQgY29tcGlsZV9vcHRzX29ubHkgPSAwOwotaW50IGJlX3ZlcmJvc2UgPSAwOwotCi0KLS8qIER1bXAgYSBsb2dpbmluZm8gdG8gc3Rkb3V0LiBBc3N1bWVzIGEgdGFiIHNpemUgb2YgOCBjaGFycy4gKi8KLXZvaWQKLWR1bXBfbG9naW5pbmZvKHN0cnVjdCBsb2dpbmluZm8gKmxpLCBjaGFyICpkZXNjbmFtZSkKLXsKLQkvKiB5ZXMgSSBrbm93IGhvdyBuYXN0eSB0aGlzIGlzICovCi0JcHJpbnRmKCJzdHJ1Y3QgbG9naW5pbmZvICVzID0ge1xuXHQiCi0JICAgICAgICJwcm9nbmFtZVx0JyVzJ1xuXHR0eXBlXHRcdCVkXG5cdCIKLQkgICAgICAgInBpZFx0XHQlZFxuXHR1aWRcdFx0JWRcblx0IgotCSAgICAgICAibGluZVx0XHQnJXMnXG5cdHVzZXJuYW1lXHQnJXMnXG5cdCIKLQkgICAgICAgImhvc3RuYW1lXHQnJXMnXG5cdGV4aXRcdFx0JWRcblx0dGVybWluYXRpb25cdCVkXG5cdCIKLQkgICAgICAgInR2X3NlY1x0JWRcblx0dHZfdXNlY1x0JWRcblx0IgotCSAgICAgICAic3RydWN0IGxvZ2luX25ldGluZm8gaG9zdGFkZHIge1xuXHRcdCIKLQkgICAgICAgInN0cnVjdCBzb2NrYWRkciBzYSB7XG4iCi0JICAgICAgICJcdFx0XHRmYW1pbHlcdCVkXG5cdFx0fVxuIgotCSAgICAgICAiXHR9XG4iCi0JICAgICAgICJ9XG4iLAotCSAgICAgICBkZXNjbmFtZSwgbGktPnByb2duYW1lLCBsaS0+dHlwZSwKLQkgICAgICAgbGktPnBpZCwgbGktPnVpZCwgbGktPmxpbmUsCi0JICAgICAgIGxpLT51c2VybmFtZSwgbGktPmhvc3RuYW1lLCBsaS0+ZXhpdCwKLQkgICAgICAgbGktPnRlcm1pbmF0aW9uLCBsaS0+dHZfc2VjLCBsaS0+dHZfdXNlYywKLQkgICAgICAgbGktPmhvc3RhZGRyLnNhLnNhX2ZhbWlseSk7Ci19Ci0KLQotaW50Ci10ZXN0QVBJKCkKLXsKLQlzdHJ1Y3QgbG9naW5pbmZvICpsaTE7Ci0Jc3RydWN0IHBhc3N3ZCAqcHc7Ci0Jc3RydWN0IGhvc3RlbnQgKmhlOwotCXN0cnVjdCBzb2NrYWRkcl9pbiBzYV9pbjQ7Ci0JY2hhciBjbWRzdHJpbmdbMjU2XSwgc3RyaXBsaW5lWzhdOwotCWNoYXIgdXNlcm5hbWVbMzJdOwotI2lmZGVmIEhBVkVfVElNRV9ICi0JdGltZV90IHQwLCB0MSwgdDIsIGxvZ2ludGltZSwgbG9nb3V0dGltZTsKLQljaGFyIHNfdDBbNjRdLHNfdDFbNjRdLHNfdDJbNjRdOwotCWNoYXIgc19sb2dpbnRpbWVbNjRdLCBzX2xvZ291dHRpbWVbNjRdOyAvKiBjdGltZSgpIHN0cmluZ3MgKi8KLSNlbmRpZgotCi0JcHJpbnRmKCIqKlxuKiogVGVzdGluZyB0aGUgQVBJLi4uXG4qKlxuIik7Ci0KLQlwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKLQlzdHJsY3B5KHVzZXJuYW1lLCBwdy0+cHdfbmFtZSwgc2l6ZW9mKHVzZXJuYW1lKSk7Ci0KLQkvKiBnZXRob3N0bmFtZShob3N0bmFtZSwgc2l6ZW9mKGhvc3RuYW1lKSk7ICovCi0KLQlwcmludGYoImxvZ2luX2FsbG9jX2VudHJ5IHRlc3QgKG5vIGhvc3QgaW5mbyk6XG4iKTsKLQotCS8qIEZJWE1FIGZha2UgdHR5IG1vcmUgZWZmZWN0aXZlbHkgLSB0aGlzIGNvdWxkIHVwc2V0IHNvbWUgcGxhdGZvcm1zICovCi0JbGkxID0gbG9naW5fYWxsb2NfZW50cnkoKGludClnZXRwaWQoKSwgdXNlcm5hbWUsIE5VTEwsIHR0eW5hbWUoMCkpOwotCXN0cmxjcHkobGkxLT5wcm9nbmFtZSwgIk9wZW5TU0gtbG9naW50ZXN0Iiwgc2l6ZW9mKGxpMS0+cHJvZ25hbWUpKTsKLQotCWlmIChiZV92ZXJib3NlKQotCQlkdW1wX2xvZ2luaW5mbyhsaTEsICJsaTEiKTsKLQotCXByaW50ZigiU2V0dGluZyBob3N0IGFkZHJlc3MgaW5mbyBmb3IgJ2xvY2FsaG9zdCcgKG1heSBjYWxsIG91dCk6XG4iKTsKLQlpZiAoISAoaGUgPSBnZXRob3N0YnluYW1lKCJsb2NhbGhvc3QiKSkpIHsKLQkJcHJpbnRmKCJDb3VsZG4ndCBzZXQgaG9zdG5hbWUobG9va3VwIGZhaWxlZClcbiIpOwotCX0gZWxzZSB7Ci0JCS8qIE5PVEU6IHRoaXMgaXMgbWVzc3ksIGJ1dCB0eXBpY2FsbHkgYSBwcm9ncmFtIHdvdWxkbid0IGhhdmUgdG8gc2V0Ci0JCSAqICBhbnkgb2YgdGhpcywgYSBzb2NrYWRkcl9pbiogd291bGQgYmUgYWxyZWFkeSBwcmVwYXJlZCAqLwotCQltZW1jcHkoKHZvaWQgKikmKHNhX2luNC5zaW5fYWRkciksICh2b2lkICopJihoZS0+aF9hZGRyX2xpc3RbMF1bMF0pLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0JCWxvZ2luX3NldF9hZGRyKGxpMSwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FfaW40LCBzaXplb2Yoc2FfaW40KSk7Ci0JCXN0cmxjcHkobGkxLT5ob3N0bmFtZSwgImxvY2FsaG9zdCIsIHNpemVvZihsaTEtPmhvc3RuYW1lKSk7Ci0JfQotCWlmIChiZV92ZXJib3NlKQotCQlkdW1wX2xvZ2luaW5mbyhsaTEsICJsaTEiKTsKLQotCWlmICgoaW50KWdldGV1aWQoKSAhPSAwKSB7Ci0JCXByaW50ZigiTk9UIFJVTk5JTkcgTE9HSU4gVEVTVFMgLSB5b3UgYXJlIG5vdCByb290IVxuIik7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmIChub2xvZ3Rlc3QpCi0JCXJldHVybiAxOwotCi0JbGluZV9zdHJpcG5hbWUoc3RyaXBsaW5lLCBsaTEtPmxpbmUsIHNpemVvZihzdHJpcGxpbmUpKTsKLQotCXByaW50ZigiUGVyZm9ybWluZyBhbiBpbnZhbGlkIGxvZ2luIGF0dGVtcHQgKG5vIHR5cGUgZmllbGQpXG4tLVxuIik7Ci0JbG9naW5fd3JpdGUobGkxKTsKLQlwcmludGYoIi0tXG4oU2hvdWxkIGhhdmUgd3JpdHRlbiBlcnJvcnMgdG8gc3RkZXJyKVxuIik7Ci0KLSNpZmRlZiBIQVZFX1RJTUVfSAotCSh2b2lkKXRpbWUoJnQwKTsKLQlzdHJsY3B5KHNfdDAsIGN0aW1lKCZ0MCksIHNpemVvZihzX3QwKSk7Ci0JdDEgPSBsb2dpbl9nZXRfbGFzdGxvZ190aW1lKGdldHVpZCgpKTsKLQlzdHJsY3B5KHNfdDEsIGN0aW1lKCZ0MSksIHNpemVvZihzX3QxKSk7Ci0JcHJpbnRmKCJCZWZvcmUgbG9nZ2luZyBpbjpcblx0Y3VycmVudCB0aW1lIGlzICVkIC0gJXNcdCIKLQkgICAgICAgImxhc3Rsb2cgdGltZSBpcyAlZCAtICVzXG4iLAotCSAgICAgICAoaW50KXQwLCBzX3QwLCAoaW50KXQxLCBzX3QxKTsKLSNlbmRpZgotCi0JcHJpbnRmKCJQZXJmb3JtaW5nIGEgbG9naW4gb24gbGluZSAlcyAiLCBzdHJpcGxpbmUpOwotI2lmZGVmIEhBVkVfVElNRV9ICi0JKHZvaWQpdGltZSgmbG9naW50aW1lKTsKLQlzdHJsY3B5KHNfbG9naW50aW1lLCBjdGltZSgmbG9naW50aW1lKSwgc2l6ZW9mKHNfbG9naW50aW1lKSk7Ci0JcHJpbnRmKCJhdCAlZCAtICVzIiwgKGludClsb2dpbnRpbWUsIHNfbG9naW50aW1lKTsKLSNlbmRpZgotCXByaW50ZigiLS1cbiIpOwotCWxvZ2luX2xvZ2luKGxpMSk7Ci0KLQlzbnByaW50ZihjbWRzdHJpbmcsIHNpemVvZihjbWRzdHJpbmcpLCAid2hvIHwgZ3JlcCAnJXMgJyIsCi0JCSBzdHJpcGxpbmUpOwotCXN5c3RlbShjbWRzdHJpbmcpOwotCi0JcHJpbnRmKCItLVxuUGF1c2luZyBmb3IgJWQgc2Vjb25kKHMpLi4uXG4iLCBQQVVTRV9CRUZPUkVfTE9HT1VUKTsKLQlzbGVlcChQQVVTRV9CRUZPUkVfTE9HT1VUKTsKLQotCXByaW50ZigiUGVyZm9ybWluZyBhIGxvZ291dCAiKTsKLSNpZmRlZiBIQVZFX1RJTUVfSAotCSh2b2lkKXRpbWUoJmxvZ291dHRpbWUpOwotCXN0cmxjcHkoc19sb2dvdXR0aW1lLCBjdGltZSgmbG9nb3V0dGltZSksIHNpemVvZihzX2xvZ291dHRpbWUpKTsKLQlwcmludGYoImF0ICVkIC0gJXMiLCAoaW50KWxvZ291dHRpbWUsIHNfbG9nb3V0dGltZSk7Ci0jZW5kaWYKLQlwcmludGYoIlxuVGhlIHJvb3QgbG9naW4gc2hvd24gYWJvdmUgc2hvdWxkIGJlIGdvbmUuXG4iCi0JICAgICAgICJJZiB0aGUgcm9vdCBsb2dpbiBoYXNuJ3QgZ29uZSwgYnV0IGFub3RoZXIgdXNlciBvbiB0aGUgc2FtZVxuIgotCSAgICAgICAicHR5IGhhcywgdGhpcyBpcyBPSyAtIHdlJ3JlIGhhY2tpbmcgaXQgaGVyZSwgYW5kIHRoZXJlXG4iCi0JICAgICAgICJzaG91bGRuJ3QgYmUgdHdvIHVzZXJzIG9uIG9uZSBwdHkgaW4gcmVhbGl0eS4uLlxuIgotCSAgICAgICAiLS0gKCd3aG8nIG91dHB1dCBmb2xsb3dzKVxuIik7Ci0JbG9naW5fbG9nb3V0KGxpMSk7Ci0KLQlzeXN0ZW0oY21kc3RyaW5nKTsKLQlwcmludGYoIi0tICgnd2hvJyBvdXRwdXQgZW5kcylcbiIpOwotCi0jaWZkZWYgSEFWRV9USU1FX0gKLQl0MiA9IGxvZ2luX2dldF9sYXN0bG9nX3RpbWUoZ2V0dWlkKCkpOwotCXN0cmxjcHkoc190MiwgY3RpbWUoJnQyKSwgc2l6ZW9mKHNfdDIpKTsKLQlwcmludGYoIkFmdGVyIGxvZ2dpbmcgaW4sIGxhc3Rsb2cgdGltZSBpcyAlZCAtICVzXG4iLCAoaW50KXQyLCBzX3QyKTsKLQlpZiAodDEgPT0gdDIpCi0JCXByaW50ZigiVGhlIGxhc3Rsb2cgdGltZXMgYmVmb3JlIGFuZCBhZnRlciBsb2dnaW5nIGluIGFyZSB0aGUgIgotCQkgICAgICAgInNhbWUuXG5UaGlzIGluZGljYXRlcyB0aGF0IGxhc3Rsb2cgaXMgKiogTk9UIFdPUktJTkcgIgotCQkgICAgICAgIkNPUlJFQ1RMWSAqKlxuIik7Ci0JZWxzZSBpZiAodDAgIT0gdDIpCi0JCS8qIFdlIGNhbiBiZSBvZmYgYnkgYSBzZWNvbmQgb3Igc28sIGV2ZW4gd2hlbiByZWNvcmRpbmcgd29ya3MgZmluZS4KLQkJICogSSdtIG5vdCAxMDAlIHN1cmUgd2h5LCBidXQgaXQncyB0cnVlLiAqLwotCQlwcmludGYoIioqIFRoZSBsb2dpbiB0aW1lIGFuZCB0aGUgbGFzdGxvZyB0aW1lIGRpZmZlci5cbiIKLQkJICAgICAgICIqKiBUaGlzIGluZGljYXRlcyB0aGF0IGxhc3Rsb2cgaXMgZWl0aGVyIHJlY29yZGluZyB0aGUgIgotCQkgICAgICAgIndyb25nIHRpbWUsXG4qKiBvciByZXRyaWV2aW5nIHRoZSB3cm9uZyBlbnRyeS5cbiIKLQkJICAgICAgICJJZiBpdCdzIG9mZiBieSBsZXNzIHRoYW4gJWQgc2Vjb25kKHMpICIKLQkJICAgICAgICJydW4gdGhlIHRlc3QgYWdhaW4uXG4iLCBQQVVTRV9CRUZPUkVfTE9HT1VUKTsKLQllbHNlCi0JCXByaW50ZigibGFzdGxvZyBhZ3JlZXMgd2l0aCB0aGUgbG9naW4gdGltZS4gVGhpcyBpcyBhIGdvb2QgdGhpbmcuXG4iKTsKLQotI2VuZGlmCi0KLQlwcmludGYoIi0tXG5UaGUgb3V0cHV0IG9mICdsYXN0JyBzaG93biBuZXh0IHNob3VsZCBoYXZlICIKLQkgICAgICAgImFuIGVudHJ5IGZvciByb290IFxuICBvbiAlcyBmb3IgdGhlIHRpbWUgc2hvd24gYWJvdmU6XG4tLVxuIiwKLQkgICAgICAgc3RyaXBsaW5lKTsKLQlzbnByaW50ZihjbWRzdHJpbmcsIHNpemVvZihjbWRzdHJpbmcpLCAibGFzdCB8IGdyZXAgJyVzICcgfCBoZWFkIC0zIiwKLQkJIHN0cmlwbGluZSk7Ci0Jc3lzdGVtKGNtZHN0cmluZyk7Ci0KLQlwcmludGYoIi0tXG5FbmQgb2YgbG9naW4gdGVzdC5cbiIpOwotCi0JbG9naW5fZnJlZV9lbnRyeShsaTEpOwotCi0JcmV0dXJuIDE7Ci19IC8qIHRlc3RBUEkoKSAqLwotCi0KLXZvaWQKLXRlc3RMaW5lTmFtZShjaGFyICpsaW5lKQotewotCS8qIGhhdmUgdG8gbnVsbC10ZXJtaW5hdGUgLSB0aGVzZSBmdW5jdGlvbnMgYXJlIGRlc2lnbmVkIGZvcgotCSAqIHN0cnVjdHVyZXMgd2l0aCBmaXhlZC1sZW5ndGggY2hhciBhcnJheXMsIGFuZCBkb24ndCBudWxsLXRlcm0uKi8KLQljaGFyIGZ1bGxbMTddLCBzdHJpcFs5XSwgYWJicmV2WzVdOwotCi0JbWVtc2V0KGZ1bGwsICdcMCcsIHNpemVvZihmdWxsKSk7Ci0JbWVtc2V0KHN0cmlwLCAnXDAnLCBzaXplb2Yoc3RyaXApKTsKLQltZW1zZXQoYWJicmV2LCAnXDAnLCBzaXplb2YoYWJicmV2KSk7Ci0KLQlsaW5lX2Z1bGxuYW1lKGZ1bGwsIGxpbmUsIHNpemVvZihmdWxsKS0xKTsKLQlsaW5lX3N0cmlwbmFtZShzdHJpcCwgZnVsbCwgc2l6ZW9mKHN0cmlwKS0xKTsKLQlsaW5lX2FiYnJldm5hbWUoYWJicmV2LCBmdWxsLCBzaXplb2YoYWJicmV2KS0xKTsKLQlwcmludGYoIiVzOiAlcywgJXMsICVzXG4iLCBsaW5lLCBmdWxsLCBzdHJpcCwgYWJicmV2KTsKLQotfSAvKiB0ZXN0TGluZU5hbWUoKSAqLwotCi0KLWludAotdGVzdE91dHB1dCgpCi17Ci0JcHJpbnRmKCIqKlxuKiogVGVzdGluZyBsaW5lbmFtZSBmdW5jdGlvbnNcbioqXG4iKTsKLQl0ZXN0TGluZU5hbWUoIi9kZXYvcHRzLzEiKTsKLQl0ZXN0TGluZU5hbWUoInB0cy8xIik7Ci0JdGVzdExpbmVOYW1lKCJwdHMvOTk5Iik7Ci0JdGVzdExpbmVOYW1lKCIvZGV2L3R0eXAwMCIpOwotCXRlc3RMaW5lTmFtZSgidHR5cDAwIik7Ci0KLQlyZXR1cm4gMTsKLX0gLyogdGVzdE91dHB1dCgpICovCi0KLQotLyogc2hvdyB3aGljaCBvcHRpb25zIGdvdCBjb21waWxlZCBpbiAqLwotdm9pZAotc2hvd09wdGlvbnModm9pZCkKLXsKLQlwcmludGYoIioqXG4qKiBDb21waWxlLXRpbWUgb3B0aW9uc1xuKipcbiIpOwotCi0JcHJpbnRmKCJsb2dpbiByZWNvcmRpbmcgbWV0aG9kcyBzZWxlY3RlZDpcbiIpOwotI2lmZGVmIFVTRV9MT0dJTgotCXByaW50ZigiXHRVU0VfTE9HSU5cbiIpOwotI2VuZGlmCi0jaWZkZWYgVVNFX1VUTVAKLQlwcmludGYoIlx0VVNFX1VUTVAgKFVUTVBfRklMRT0lcylcbiIsIFVUTVBfRklMRSk7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfVVRNUFgKLQlwcmludGYoIlx0VVNFX1VUTVBYXG4iKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9XVE1QCi0JcHJpbnRmKCJcdFVTRV9XVE1QIChXVE1QX0ZJTEU9JXMpXG4iLCBXVE1QX0ZJTEUpOwotI2VuZGlmCi0jaWZkZWYgVVNFX1dUTVBYCi0JcHJpbnRmKCJcdFVTRV9XVE1QWCAoV1RNUFhfRklMRT0lcylcbiIsIFdUTVBYX0ZJTEUpOwotI2VuZGlmCi0jaWZkZWYgVVNFX0xBU1RMT0cKLQlwcmludGYoIlx0VVNFX0xBU1RMT0cgKExBU1RMT0dfRklMRT0lcylcbiIsIExBU1RMT0dfRklMRSk7Ci0jZW5kaWYKLQlwcmludGYoIlxuIik7Ci0KLX0gLyogc2hvd09wdGlvbnMoKSAqLwotCi0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCXByaW50ZigiUGxhdGZvcm0taW5kZXBlbmRlbnQgbG9naW4gcmVjb3JkaW5nIHRlc3QgZHJpdmVyXG4iKTsKLQotCV9fcHJvZ25hbWUgPSBzc2hfZ2V0X3Byb2duYW1lKGFyZ3ZbMF0pOwotCWlmIChhcmdjID09IDIpIHsKLQkJaWYgKHN0cm5jbXAoYXJndlsxXSwgIi1pIiwgMykgPT0gMCkKLQkJCWNvbXBpbGVfb3B0c19vbmx5ID0gMTsKLQkJZWxzZSBpZiAoc3RybmNtcChhcmd2WzFdLCAiLXYiLCAzKSA9PSAwKQotCQkJYmVfdmVyYm9zZT0xOwotCX0KLQotCWlmICghY29tcGlsZV9vcHRzX29ubHkpIHsKLQkJaWYgKGJlX3ZlcmJvc2UgJiYgIXRlc3RPdXRwdXQoKSkKLQkJCXJldHVybiAxOwotCi0JCWlmICghdGVzdEFQSSgpKQotCQkJcmV0dXJuIDE7Ci0JfQotCi0Jc2hvd09wdGlvbnMoKTsKLQotCXJldHVybiAwOwotfSAvKiBtYWluKCkgKi8KLQpkaWZmIC0tZ2l0IGEvbWFjLmMgYi9tYWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjOWRkOC4uMDAwMDAwMAotLS0gYS9tYWMuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKiAkT3BlbkJTRDogbWFjLmMsdiAxLjE2IDIwMTEvMDgvMDIgMDE6MjI6MTEgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+Ci0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJjaXBoZXIuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJrZXguaCIKLSNpbmNsdWRlICJtYWMuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLSNpbmNsdWRlICJ1bWFjLmgiCi0KLSNkZWZpbmUgU1NIX0VWUAkJMQkvKiBPcGVuU1NMIEVWUC1iYXNlZCBNQUMgKi8KLSNkZWZpbmUgU1NIX1VNQUMJMgkvKiBVTUFDIChub3QgaW50ZWdyYXRlZCB3aXRoIE9wZW5TU0wpICovCi0KLXN0cnVjdCB7Ci0JY2hhcgkJKm5hbWU7Ci0JaW50CQl0eXBlOwotCWNvbnN0IEVWUF9NRCAqCSgqbWRmdW5jKSh2b2lkKTsKLQlpbnQJCXRydW5jYXRlYml0czsJLyogdHJ1bmNhdGUgZGlnZXN0IGlmICE9IDAgKi8KLQlpbnQJCWtleV9sZW47CS8qIGp1c3QgZm9yIFVNQUMgKi8KLQlpbnQJCWxlbjsJCS8qIGp1c3QgZm9yIFVNQUMgKi8KLX0gbWFjc1tdID0gewotCXsgImhtYWMtc2hhMSIsCQkJU1NIX0VWUCwgRVZQX3NoYTEsIDAsIC0xLCAtMSB9LAotCXsgImhtYWMtc2hhMS05NiIsCQlTU0hfRVZQLCBFVlBfc2hhMSwgOTYsIC0xLCAtMSB9LAotI2lmZGVmIEhBVkVfRVZQX1NIQTI1NgotCXsgImhtYWMtc2hhMi0yNTYiLAkJU1NIX0VWUCwgRVZQX3NoYTI1NiwgMCwgLTEsIC0xIH0sCi0JeyAiaG1hYy1zaGEyLTI1Ni05NiIsCQlTU0hfRVZQLCBFVlBfc2hhMjU2LCA5NiwgLTEsIC0xIH0sCi0JeyAiaG1hYy1zaGEyLTUxMiIsCQlTU0hfRVZQLCBFVlBfc2hhNTEyLCAwLCAtMSwgLTEgfSwKLQl7ICJobWFjLXNoYTItNTEyLTk2IiwJCVNTSF9FVlAsIEVWUF9zaGE1MTIsIDk2LCAtMSwgLTEgfSwKLSNlbmRpZgotCXsgImhtYWMtbWQ1IiwJCQlTU0hfRVZQLCBFVlBfbWQ1LCAwLCAtMSwgLTEgfSwKLQl7ICJobWFjLW1kNS05NiIsCQlTU0hfRVZQLCBFVlBfbWQ1LCA5NiwgLTEsIC0xIH0sCi0jaWZkZWYgSEFWRV9FVlBfUklQRU1ECi0JeyAiaG1hYy1yaXBlbWQxNjAiLAkJU1NIX0VWUCwgRVZQX3JpcGVtZDE2MCwgMCwgLTEsIC0xIH0sCi0JeyAiaG1hYy1yaXBlbWQxNjBAb3BlbnNzaC5jb20iLAlTU0hfRVZQLCBFVlBfcmlwZW1kMTYwLCAwLCAtMSwgLTEgfSwKLSNlbmRpZgotCXsgInVtYWMtNjRAb3BlbnNzaC5jb20iLAlTU0hfVU1BQywgTlVMTCwgMCwgMTI4LCA2NCB9LAotCXsgTlVMTCwJCQkJMCwgTlVMTCwgMCwgLTEsIC0xIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1tYWNfc2V0dXBfYnlfaWQoTWFjICptYWMsIGludCB3aGljaCkKLXsKLQlpbnQgZXZwX2xlbjsKLQltYWMtPnR5cGUgPSBtYWNzW3doaWNoXS50eXBlOwotCWlmIChtYWMtPnR5cGUgPT0gU1NIX0VWUCkgewotCQltYWMtPmV2cF9tZCA9ICgqbWFjc1t3aGljaF0ubWRmdW5jKSgpOwotCQlpZiAoKGV2cF9sZW4gPSBFVlBfTURfc2l6ZShtYWMtPmV2cF9tZCkpIDw9IDApCi0JCQlmYXRhbCgibWFjICVzIGxlbiAlZCIsIG1hYy0+bmFtZSwgZXZwX2xlbik7Ci0JCW1hYy0+a2V5X2xlbiA9IG1hYy0+bWFjX2xlbiA9ICh1X2ludClldnBfbGVuOwotCX0gZWxzZSB7Ci0JCW1hYy0+bWFjX2xlbiA9IG1hY3Nbd2hpY2hdLmxlbiAvIDg7Ci0JCW1hYy0+a2V5X2xlbiA9IG1hY3Nbd2hpY2hdLmtleV9sZW4gLyA4OwotCQltYWMtPnVtYWNfY3R4ID0gTlVMTDsKLQl9Ci0JaWYgKG1hY3Nbd2hpY2hdLnRydW5jYXRlYml0cyAhPSAwKQotCQltYWMtPm1hY19sZW4gPSBtYWNzW3doaWNoXS50cnVuY2F0ZWJpdHMgLyA4OwotfQotCi1pbnQKLW1hY19zZXR1cChNYWMgKm1hYywgY2hhciAqbmFtZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IG1hY3NbaV0ubmFtZTsgaSsrKSB7Ci0JCWlmIChzdHJjbXAobmFtZSwgbWFjc1tpXS5uYW1lKSA9PSAwKSB7Ci0JCQlpZiAobWFjICE9IE5VTEwpCi0JCQkJbWFjX3NldHVwX2J5X2lkKG1hYywgaSk7Ci0JCQlkZWJ1ZzIoIm1hY19zZXR1cDogZm91bmQgJXMiLCBuYW1lKTsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQl9Ci0JZGVidWcyKCJtYWNfc2V0dXA6IHVua25vd24gJXMiLCBuYW1lKTsKLQlyZXR1cm4gKC0xKTsKLX0KLQotaW50Ci1tYWNfaW5pdChNYWMgKm1hYykKLXsKLQlpZiAobWFjLT5rZXkgPT0gTlVMTCkKLQkJZmF0YWwoIm1hY19pbml0OiBubyBrZXkiKTsKLQlzd2l0Y2ggKG1hYy0+dHlwZSkgewotCWNhc2UgU1NIX0VWUDoKLQkJaWYgKG1hYy0+ZXZwX21kID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCUhNQUNfSW5pdCgmbWFjLT5ldnBfY3R4LCBtYWMtPmtleSwgbWFjLT5rZXlfbGVuLCBtYWMtPmV2cF9tZCk7Ci0JCXJldHVybiAwOwotCWNhc2UgU1NIX1VNQUM6Ci0JCW1hYy0+dW1hY19jdHggPSB1bWFjX25ldyhtYWMtPmtleSk7Ci0JCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLXVfY2hhciAqCi1tYWNfY29tcHV0ZShNYWMgKm1hYywgdV9pbnQzMl90IHNlcW5vLCB1X2NoYXIgKmRhdGEsIGludCBkYXRhbGVuKQotewotCXN0YXRpYyB1X2NoYXIgbVtFVlBfTUFYX01EX1NJWkVdOwotCXVfY2hhciBiWzRdLCBub25jZVs4XTsKLQotCWlmIChtYWMtPm1hY19sZW4gPiBzaXplb2YobSkpCi0JCWZhdGFsKCJtYWNfY29tcHV0ZTogbWFjIHRvbyBsb25nICV1ICVsdSIsCi0JCSAgICBtYWMtPm1hY19sZW4sICh1X2xvbmcpc2l6ZW9mKG0pKTsKLQotCXN3aXRjaCAobWFjLT50eXBlKSB7Ci0JY2FzZSBTU0hfRVZQOgotCQlwdXRfdTMyKGIsIHNlcW5vKTsKLQkJLyogcmVzZXQgSE1BQyBjb250ZXh0ICovCi0JCUhNQUNfSW5pdCgmbWFjLT5ldnBfY3R4LCBOVUxMLCAwLCBOVUxMKTsKLQkJSE1BQ19VcGRhdGUoJm1hYy0+ZXZwX2N0eCwgYiwgc2l6ZW9mKGIpKTsKLQkJSE1BQ19VcGRhdGUoJm1hYy0+ZXZwX2N0eCwgZGF0YSwgZGF0YWxlbik7Ci0JCUhNQUNfRmluYWwoJm1hYy0+ZXZwX2N0eCwgbSwgTlVMTCk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIX1VNQUM6Ci0JCXB1dF91NjQobm9uY2UsIHNlcW5vKTsKLQkJdW1hY191cGRhdGUobWFjLT51bWFjX2N0eCwgZGF0YSwgZGF0YWxlbik7Ci0JCXVtYWNfZmluYWwobWFjLT51bWFjX2N0eCwgbSwgbm9uY2UpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlmYXRhbCgibWFjX2NvbXB1dGU6IHVua25vd24gTUFDIHR5cGUiKTsKLQl9Ci0JcmV0dXJuIChtKTsKLX0KLQotdm9pZAotbWFjX2NsZWFyKE1hYyAqbWFjKQotewotCWlmIChtYWMtPnR5cGUgPT0gU1NIX1VNQUMpIHsKLQkJaWYgKG1hYy0+dW1hY19jdHggIT0gTlVMTCkKLQkJCXVtYWNfZGVsZXRlKG1hYy0+dW1hY19jdHgpOwotCX0gZWxzZSBpZiAobWFjLT5ldnBfbWQgIT0gTlVMTCkKLQkJSE1BQ19jbGVhbnVwKCZtYWMtPmV2cF9jdHgpOwotCW1hYy0+ZXZwX21kID0gTlVMTDsKLQltYWMtPnVtYWNfY3R4ID0gTlVMTDsKLX0KLQotLyogWFhYIGNvcGllZCBmcm9tIGNpcGhlcnNfdmFsaWQgKi8KLSNkZWZpbmUJTUFDX1NFUAkiLCIKLWludAotbWFjX3ZhbGlkKGNvbnN0IGNoYXIgKm5hbWVzKQotewotCWNoYXIgKm1hY2xpc3QsICpjcCwgKnA7Ci0KLQlpZiAobmFtZXMgPT0gTlVMTCB8fCBzdHJjbXAobmFtZXMsICIiKSA9PSAwKQotCQlyZXR1cm4gKDApOwotCW1hY2xpc3QgPSBjcCA9IHhzdHJkdXAobmFtZXMpOwotCWZvciAoKHAgPSBzdHJzZXAoJmNwLCBNQUNfU0VQKSk7IHAgJiYgKnAgIT0gJ1wwJzsKLQkgICAgKHAgPSBzdHJzZXAoJmNwLCBNQUNfU0VQKSkpIHsKLQkJaWYgKG1hY19zZXR1cChOVUxMLCBwKSA8IDApIHsKLQkJCWRlYnVnKCJiYWQgbWFjICVzIFslc10iLCBwLCBuYW1lcyk7Ci0JCQl4ZnJlZShtYWNsaXN0KTsKLQkJCXJldHVybiAoMCk7Ci0JCX0gZWxzZSB7Ci0JCQlkZWJ1ZzMoIm1hYyBvazogJXMgWyVzXSIsIHAsIG5hbWVzKTsKLQkJfQotCX0KLQlkZWJ1ZzMoIm1hY3Mgb2s6IFslc10iLCBuYW1lcyk7Ci0JeGZyZWUobWFjbGlzdCk7Ci0JcmV0dXJuICgxKTsKLX0KZGlmZiAtLWdpdCBhL21hYy5oIGIvbWFjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZjU2NGQuLjAwMDAwMDAKLS0tIGEvbWFjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiAkT3BlbkJTRDogbWFjLmgsdiAxLjYgMjAwNy8wNi8wNyAxOTozNzozNCBwdmFsY2hldiBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotaW50CSBtYWNfdmFsaWQoY29uc3QgY2hhciAqKTsKLWludAkgbWFjX3NldHVwKE1hYyAqLCBjaGFyICopOwotaW50CSBtYWNfaW5pdChNYWMgKik7Ci11X2NoYXIJKm1hY19jb21wdXRlKE1hYyAqLCB1X2ludDMyX3QsIHVfY2hhciAqLCBpbnQpOwotdm9pZAkgbWFjX2NsZWFyKE1hYyAqKTsKZGlmZiAtLWdpdCBhL21hdGNoLmMgYi9tYXRjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzg5NDc3Li4wMDAwMDAwCi0tLSBhL21hdGNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyogJE9wZW5CU0Q6IG1hdGNoLmMsdiAxLjI3IDIwMDgvMDYvMTAgMjM6MDY6MTkgZGptIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogU2ltcGxlIHBhdHRlcm4gbWF0Y2hpbmcsIHdpdGggJyonIGFuZCAnPycgYXMgd2lsZGNhcmRzLgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgIm1hdGNoLmgiCi0KLS8qCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBtYXRjaGVzIHRoZSBwYXR0ZXJuICh3aGljaCBtYXkgY29udGFpbiA/Ci0gKiBhbmQgKiBhcyB3aWxkY2FyZHMpLCBhbmQgemVybyBpZiBpdCBkb2VzIG5vdCBtYXRjaC4KLSAqLwotCi1pbnQKLW1hdGNoX3BhdHRlcm4oY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcGF0dGVybikKLXsKLQlmb3IgKDs7KSB7Ci0JCS8qIElmIGF0IGVuZCBvZiBwYXR0ZXJuLCBhY2NlcHQgaWYgYWxzbyBhdCBlbmQgb2Ygc3RyaW5nLiAqLwotCQlpZiAoISpwYXR0ZXJuKQotCQkJcmV0dXJuICEqczsKLQotCQlpZiAoKnBhdHRlcm4gPT0gJyonKSB7Ci0JCQkvKiBTa2lwIHRoZSBhc3Rlcmlzay4gKi8KLQkJCXBhdHRlcm4rKzsKLQotCQkJLyogSWYgYXQgZW5kIG9mIHBhdHRlcm4sIGFjY2VwdCBpbW1lZGlhdGVseS4gKi8KLQkJCWlmICghKnBhdHRlcm4pCi0JCQkJcmV0dXJuIDE7Ci0KLQkJCS8qIElmIG5leHQgY2hhcmFjdGVyIGluIHBhdHRlcm4gaXMga25vd24sIG9wdGltaXplLiAqLwotCQkJaWYgKCpwYXR0ZXJuICE9ICc/JyAmJiAqcGF0dGVybiAhPSAnKicpIHsKLQkJCQkvKgotCQkJCSAqIExvb2sgaW5zdGFuY2VzIG9mIHRoZSBuZXh0IGNoYXJhY3RlciBpbgotCQkJCSAqIHBhdHRlcm4sIGFuZCB0cnkgdG8gbWF0Y2ggc3RhcnRpbmcgZnJvbQotCQkJCSAqIHRob3NlLgotCQkJCSAqLwotCQkJCWZvciAoOyAqczsgcysrKQotCQkJCQlpZiAoKnMgPT0gKnBhdHRlcm4gJiYKLQkJCQkJICAgIG1hdGNoX3BhdHRlcm4ocyArIDEsIHBhdHRlcm4gKyAxKSkKLQkJCQkJCXJldHVybiAxOwotCQkJCS8qIEZhaWxlZC4gKi8KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCS8qCi0JCQkgKiBNb3ZlIGFoZWFkIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lIGFuZCB0cnkgdG8KLQkJCSAqIG1hdGNoIGF0IGVhY2ggcG9zaXRpb24uCi0JCQkgKi8KLQkJCWZvciAoOyAqczsgcysrKQotCQkJCWlmIChtYXRjaF9wYXR0ZXJuKHMsIHBhdHRlcm4pKQotCQkJCQlyZXR1cm4gMTsKLQkJCS8qIEZhaWxlZC4gKi8KLQkJCXJldHVybiAwOwotCQl9Ci0JCS8qCi0JCSAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIG1vcmUgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuCi0JCSAqIElmIHdlIGFyZSBhdCB0aGUgZW5kLCBmYWlsLgotCQkgKi8KLQkJaWYgKCEqcykKLQkJCXJldHVybiAwOwotCi0JCS8qIENoZWNrIGlmIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGlzIGFjY2VwdGFibGUuICovCi0JCWlmICgqcGF0dGVybiAhPSAnPycgJiYgKnBhdHRlcm4gIT0gKnMpCi0JCQlyZXR1cm4gMDsKLQotCQkvKiBNb3ZlIHRvIHRoZSBuZXh0IGNoYXJhY3RlciwgYm90aCBpbiBzdHJpbmcgYW5kIGluIHBhdHRlcm4uICovCi0JCXMrKzsKLQkJcGF0dGVybisrOwotCX0KLQkvKiBOT1RSRUFDSEVEICovCi19Ci0KLS8qCi0gKiBUcmllcyB0byBtYXRjaCB0aGUgc3RyaW5nIGFnYWluc3QgdGhlCi0gKiBjb21tYS1zZXBhcmF0ZWQgc2VxdWVuY2Ugb2Ygc3VicGF0dGVybnMgKGVhY2ggcG9zc2libHkgcHJlY2VkZWQgYnkgISB0bwotICogaW5kaWNhdGUgbmVnYXRpb24pLiAgUmV0dXJucyAtMSBpZiBuZWdhdGlvbiBtYXRjaGVzLCAxIGlmIHRoZXJlIGlzCi0gKiBhIHBvc2l0aXZlIG1hdGNoLCAwIGlmIHRoZXJlIGlzIG5vIG1hdGNoIGF0IGFsbC4KLSAqLwotCi1pbnQKLW1hdGNoX3BhdHRlcm5fbGlzdChjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKnBhdHRlcm4sIHVfaW50IGxlbiwKLSAgICBpbnQgZG9sb3dlcikKLXsKLQljaGFyIHN1YlsxMDI0XTsKLQlpbnQgbmVnYXRlZDsKLQlpbnQgZ290X3Bvc2l0aXZlOwotCXVfaW50IGksIHN1Ymk7Ci0KLQlnb3RfcG9zaXRpdmUgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBsZW47KSB7Ci0JCS8qIENoZWNrIGlmIHRoZSBzdWJwYXR0ZXJuIGlzIG5lZ2F0ZWQuICovCi0JCWlmIChwYXR0ZXJuW2ldID09ICchJykgewotCQkJbmVnYXRlZCA9IDE7Ci0JCQlpKys7Ci0JCX0gZWxzZQotCQkJbmVnYXRlZCA9IDA7Ci0KLQkJLyoKLQkJICogRXh0cmFjdCB0aGUgc3VicGF0dGVybiB1cCB0byBhIGNvbW1hIG9yIGVuZC4gIENvbnZlcnQgdGhlCi0JCSAqIHN1YnBhdHRlcm4gdG8gbG93ZXJjYXNlLgotCQkgKi8KLQkJZm9yIChzdWJpID0gMDsKLQkJICAgIGkgPCBsZW4gJiYgc3ViaSA8IHNpemVvZihzdWIpIC0gMSAmJiBwYXR0ZXJuW2ldICE9ICcsJzsKLQkJICAgIHN1YmkrKywgaSsrKQotCQkJc3ViW3N1YmldID0gZG9sb3dlciAmJiBpc3VwcGVyKHBhdHRlcm5baV0pID8KLQkJCSAgICAoY2hhcil0b2xvd2VyKHBhdHRlcm5baV0pIDogcGF0dGVybltpXTsKLQkJLyogSWYgc3VicGF0dGVybiB0b28gbG9uZywgcmV0dXJuIGZhaWx1cmUgKG5vIG1hdGNoKS4gKi8KLQkJaWYgKHN1YmkgPj0gc2l6ZW9mKHN1YikgLSAxKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyogSWYgdGhlIHN1YnBhdHRlcm4gd2FzIHRlcm1pbmF0ZWQgYnkgYSBjb21tYSwgc2tpcCB0aGUgY29tbWEuICovCi0JCWlmIChpIDwgbGVuICYmIHBhdHRlcm5baV0gPT0gJywnKQotCQkJaSsrOwotCi0JCS8qIE51bGwtdGVybWluYXRlIHRoZSBzdWJwYXR0ZXJuLiAqLwotCQlzdWJbc3ViaV0gPSAnXDAnOwotCi0JCS8qIFRyeSB0byBtYXRjaCB0aGUgc3VicGF0dGVybiBhZ2FpbnN0IHRoZSBzdHJpbmcuICovCi0JCWlmIChtYXRjaF9wYXR0ZXJuKHN0cmluZywgc3ViKSkgewotCQkJaWYgKG5lZ2F0ZWQpCi0JCQkJcmV0dXJuIC0xOwkJLyogTmVnYXRpdmUgKi8KLQkJCWVsc2UKLQkJCQlnb3RfcG9zaXRpdmUgPSAxOwkvKiBQb3NpdGl2ZSAqLwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gc3VjY2VzcyBpZiBnb3QgYSBwb3NpdGl2ZSBtYXRjaC4gIElmIHRoZXJlIHdhcyBhIG5lZ2F0aXZlCi0JICogbWF0Y2gsIHdlIGhhdmUgYWxyZWFkeSByZXR1cm5lZCAtMSBhbmQgbmV2ZXIgZ2V0IGhlcmUuCi0JICovCi0JcmV0dXJuIGdvdF9wb3NpdGl2ZTsKLX0KLQotLyoKLSAqIFRyaWVzIHRvIG1hdGNoIHRoZSBob3N0IG5hbWUgKHdoaWNoIG11c3QgYmUgaW4gYWxsIGxvd2VyY2FzZSkgYWdhaW5zdCB0aGUKLSAqIGNvbW1hLXNlcGFyYXRlZCBzZXF1ZW5jZSBvZiBzdWJwYXR0ZXJucyAoZWFjaCBwb3NzaWJseSBwcmVjZWRlZCBieSAhIHRvCi0gKiBpbmRpY2F0ZSBuZWdhdGlvbikuICBSZXR1cm5zIC0xIGlmIG5lZ2F0aW9uIG1hdGNoZXMsIDEgaWYgdGhlcmUgaXMKLSAqIGEgcG9zaXRpdmUgbWF0Y2gsIDAgaWYgdGhlcmUgaXMgbm8gbWF0Y2ggYXQgYWxsLgotICovCi1pbnQKLW1hdGNoX2hvc3RuYW1lKGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKnBhdHRlcm4sIHVfaW50IGxlbikKLXsKLQlyZXR1cm4gbWF0Y2hfcGF0dGVybl9saXN0KGhvc3QsIHBhdHRlcm4sIGxlbiwgMSk7Ci19Ci0KLS8qCi0gKiByZXR1cm5zIDAgaWYgd2UgZ2V0IGEgbmVnYXRpdmUgbWF0Y2ggZm9yIHRoZSBob3N0bmFtZSBvciB0aGUgaXAKLSAqIG9yIGlmIHdlIGdldCBubyBtYXRjaCBhdCBhbGwuICByZXR1cm5zIC0xIG9uIGVycm9yLCBvciAxIG9uCi0gKiBzdWNjZXNzZnVsIG1hdGNoLgotICovCi1pbnQKLW1hdGNoX2hvc3RfYW5kX2lwKGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKmlwYWRkciwKLSAgICBjb25zdCBjaGFyICpwYXR0ZXJucykKLXsKLQlpbnQgbWhvc3QsIG1pcDsKLQotCS8qIGVycm9yIGluIGlwYWRkciBtYXRjaCAqLwotCWlmICgobWlwID0gYWRkcl9tYXRjaF9saXN0KGlwYWRkciwgcGF0dGVybnMpKSA9PSAtMikKLQkJcmV0dXJuIC0xOwotCWVsc2UgaWYgKG1pcCA9PSAtMSkgLyogbmVnYXRpdmUgaXAgYWRkcmVzcyBtYXRjaCAqLwotCQlyZXR1cm4gMDsKLQotCS8qIG5lZ2F0aXZlIGhvc3RuYW1lIG1hdGNoICovCi0JaWYgKChtaG9zdCA9IG1hdGNoX2hvc3RuYW1lKGhvc3QsIHBhdHRlcm5zLCBzdHJsZW4ocGF0dGVybnMpKSkgPT0gLTEpCi0JCXJldHVybiAwOwotCS8qIG5vIG1hdGNoIGF0IGFsbCAqLwotCWlmIChtaG9zdCA9PSAwICYmIG1pcCA9PSAwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotLyoKLSAqIG1hdGNoIHVzZXIsIHVzZXJAaG9zdF9vcl9pcCwgdXNlckBob3N0X29yX2lwX2xpc3QgYWdhaW5zdCBwYXR0ZXJuCi0gKi8KLWludAotbWF0Y2hfdXNlcihjb25zdCBjaGFyICp1c2VyLCBjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICppcGFkZHIsCi0gICAgY29uc3QgY2hhciAqcGF0dGVybikKLXsKLQljaGFyICpwLCAqcGF0OwotCWludCByZXQ7Ci0KLQlpZiAoKHAgPSBzdHJjaHIocGF0dGVybiwnQCcpKSA9PSBOVUxMKQotCQlyZXR1cm4gbWF0Y2hfcGF0dGVybih1c2VyLCBwYXR0ZXJuKTsKLQotCXBhdCA9IHhzdHJkdXAocGF0dGVybik7Ci0JcCA9IHN0cmNocihwYXQsICdAJyk7Ci0JKnArKyA9ICdcMCc7Ci0KLQlpZiAoKHJldCA9IG1hdGNoX3BhdHRlcm4odXNlciwgcGF0KSkgPT0gMSkKLQkJcmV0ID0gbWF0Y2hfaG9zdF9hbmRfaXAoaG9zdCwgaXBhZGRyLCBwKTsKLQl4ZnJlZShwYXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIFJldHVybnMgZmlyc3QgaXRlbSBmcm9tIGNsaWVudC1saXN0IHRoYXQgaXMgYWxzbyBzdXBwb3J0ZWQgYnkgc2VydmVyLWxpc3QsCi0gKiBjYWxsZXIgbXVzdCB4ZnJlZSgpIHJldHVybmVkIHN0cmluZy4KLSAqLwotI2RlZmluZQlNQVhfUFJPUAk0MAotI2RlZmluZQlTRVAJIiwiCi1jaGFyICoKLW1hdGNoX2xpc3QoY29uc3QgY2hhciAqY2xpZW50LCBjb25zdCBjaGFyICpzZXJ2ZXIsIHVfaW50ICpuZXh0KQotewotCWNoYXIgKnNwcm9wb3NhbHNbTUFYX1BST1BdOwotCWNoYXIgKmMsICpzLCAqcCwgKnJldCwgKmNwLCAqc3A7Ci0JaW50IGksIGosIG5wcm9wb3NhbHM7Ci0KLQljID0gY3AgPSB4c3RyZHVwKGNsaWVudCk7Ci0JcyA9IHNwID0geHN0cmR1cChzZXJ2ZXIpOwotCi0JZm9yICgocCA9IHN0cnNlcCgmc3AsIFNFUCkpLCBpPTA7IHAgJiYgKnAgIT0gJ1wwJzsKLQkgICAgKHAgPSBzdHJzZXAoJnNwLCBTRVApKSwgaSsrKSB7Ci0JCWlmIChpIDwgTUFYX1BST1ApCi0JCQlzcHJvcG9zYWxzW2ldID0gcDsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCW5wcm9wb3NhbHMgPSBpOwotCi0JZm9yICgocCA9IHN0cnNlcCgmY3AsIFNFUCkpLCBpPTA7IHAgJiYgKnAgIT0gJ1wwJzsKLQkgICAgKHAgPSBzdHJzZXAoJmNwLCBTRVApKSwgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBucHJvcG9zYWxzOyBqKyspIHsKLQkJCWlmIChzdHJjbXAocCwgc3Byb3Bvc2Fsc1tqXSkgPT0gMCkgewotCQkJCXJldCA9IHhzdHJkdXAocCk7Ci0JCQkJaWYgKG5leHQgIT0gTlVMTCkKLQkJCQkJKm5leHQgPSAoY3AgPT0gTlVMTCkgPwotCQkJCQkgICAgc3RybGVuKGMpIDogKHVfaW50KShjcCAtIGMpOwotCQkJCXhmcmVlKGMpOwotCQkJCXhmcmVlKHMpOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKG5leHQgIT0gTlVMTCkKLQkJKm5leHQgPSBzdHJsZW4oYyk7Ci0JeGZyZWUoYyk7Ci0JeGZyZWUocyk7Ci0JcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9tYXRjaC5oIGIvbWF0Y2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3ZjcwZi4uMDAwMDAwMAotLS0gYS9tYXRjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogJE9wZW5CU0Q6IG1hdGNoLmgsdiAxLjE1IDIwMTAvMDIvMjYgMjA6Mjk6NTQgZGptIEV4cCAkICovCi0KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotI2lmbmRlZiBNQVRDSF9ICi0jZGVmaW5lIE1BVENIX0gKLQotaW50CSBtYXRjaF9wYXR0ZXJuKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLWludAkgbWF0Y2hfcGF0dGVybl9saXN0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB1X2ludCwgaW50KTsKLWludAkgbWF0Y2hfaG9zdG5hbWUoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVfaW50KTsKLWludAkgbWF0Y2hfaG9zdF9hbmRfaXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci1pbnQJIG1hdGNoX3VzZXIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLWNoYXIJKm1hdGNoX2xpc3QoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVfaW50ICopOwotCi0vKiBhZGRybWF0Y2guYyAqLwotaW50CSBhZGRyX21hdGNoX2xpc3QoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotaW50CSBhZGRyX21hdGNoX2NpZHJfbGlzdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21kLXNoYTI1Ni5jIGIvbWQtc2hhMjU2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMWIzYjkuLjAwMDAwMDAKLS0tIGEvbWQtc2hhMjU2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKiAkT3BlbkJTRDogbWQtc2hhMjU2LmMsdiAxLjUgMjAwNi8wOC8wMyAwMzozNDo0MiBkZXJhYWR0IEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1IERhbWllbiBNaWxsZXIgPGRqbUBvcGVuYnNkLm9yZz4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0vKiBFVlAgd3JhcHBlciBmb3IgU0hBMjU2ICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgotCi0jaWYgIWRlZmluZWQoSEFWRV9FVlBfU0hBMjU2KSAmJiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA3MDAwTCkKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0jaWZkZWYgSEFWRV9TSEEyNTZfVVBEQVRFCi0jIGlmZGVmIEhBVkVfU0hBMl9ICi0jICBpbmNsdWRlIDxzaGEyLmg+Ci0jIGVsaWYgZGVmaW5lZChIQVZFX0NSWVBUT19TSEEyX0gpCi0jICBpbmNsdWRlIDxjcnlwdG8vc2hhMi5oPgotIyBlbmRpZgotI2VuZGlmCi0KLWNvbnN0IEVWUF9NRCAqZXZwX3NzaF9zaGEyNTYodm9pZCk7Ci0KLXN0YXRpYyBpbnQKLXNzaF9zaGEyNTZfaW5pdChFVlBfTURfQ1RYICpjdHh0KQotewotCVNIQTI1Nl9Jbml0KGN0eHQtPm1kX2RhdGEpOwotCXJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNzaF9zaGEyNTZfdXBkYXRlKEVWUF9NRF9DVFggKmN0eHQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbGVuKQotewotCVNIQTI1Nl9VcGRhdGUoY3R4dC0+bWRfZGF0YSwgZGF0YSwgbGVuKTsKLQlyZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgaW50Ci1zc2hfc2hhMjU2X2ZpbmFsKEVWUF9NRF9DVFggKmN0eHQsIHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCkKLXsKLQlTSEEyNTZfRmluYWwoZGlnZXN0LCBjdHh0LT5tZF9kYXRhKTsKLQlyZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgaW50Ci1zc2hfc2hhMjU2X2NsZWFudXAoRVZQX01EX0NUWCAqY3R4dCkKLXsKLQltZW1zZXQoY3R4dC0+bWRfZGF0YSwgMCwgc2l6ZW9mKFNIQTI1Nl9DVFgpKTsKLQlyZXR1cm4gKDEpOwotfQotCi1jb25zdCBFVlBfTUQgKgotZXZwX3NzaF9zaGEyNTYodm9pZCkKLXsKLQlzdGF0aWMgRVZQX01EIHNzaF9zaGEyNTY7Ci0KLQltZW1zZXQoJnNzaF9zaGEyNTYsIDAsIHNpemVvZihzc2hfc2hhMjU2KSk7Ci0Jc3NoX3NoYTI1Ni50eXBlID0gTklEX3VuZGVmOwotCXNzaF9zaGEyNTYubWRfc2l6ZSA9IFNIQTI1Nl9ESUdFU1RfTEVOR1RIOwotCXNzaF9zaGEyNTYuaW5pdCA9IHNzaF9zaGEyNTZfaW5pdDsKLQlzc2hfc2hhMjU2LnVwZGF0ZSA9IHNzaF9zaGEyNTZfdXBkYXRlOwotCXNzaF9zaGEyNTYuZmluYWwgPSBzc2hfc2hhMjU2X2ZpbmFsOwotCXNzaF9zaGEyNTYuY2xlYW51cCA9IHNzaF9zaGEyNTZfY2xlYW51cDsKLQlzc2hfc2hhMjU2LmJsb2NrX3NpemUgPSBTSEEyNTZfQkxPQ0tfTEVOR1RIOwotCXNzaF9zaGEyNTYuY3R4X3NpemUgPSBzaXplb2YoU0hBMjU2X0NUWCk7Ci0KLQlyZXR1cm4gKCZzc2hfc2hhMjU2KTsKLX0KLQotI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfRVZQX1NIQTI1NikgJiYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMEwpICovCi0KZGlmZiAtLWdpdCBhL21kNWNyeXB0LmMgYi9tZDVjcnlwdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmVmOTg5Li4wMDAwMDAwCi0tLSBhL21kNWNyeXB0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICJUSEUgQkVFUi1XQVJFIExJQ0VOU0UiIChSZXZpc2lvbiA0Mik6Ci0gKiA8cGhrQGxvZ2luLmRrbmV0LmRrPiB3cm90ZSB0aGlzIGZpbGUuICBBcyBsb25nIGFzIHlvdSByZXRhaW4gdGhpcwotICogbm90aWNlIHlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIHN0dWZmLiBJZiB3ZSBtZWV0IHNvbWUKLSAqIGRheSwgYW5kIHlvdSB0aGluayB0aGlzIHN0dWZmIGlzIHdvcnRoIGl0LCB5b3UgY2FuIGJ1eSBtZSBhIGJlZXIgaW4KLSAqIHJldHVybi4gICBQb3VsLUhlbm5pbmcgS2FtcAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWYgZGVmaW5lZChIQVZFX01ENV9QQVNTV09SRFMpICYmICFkZWZpbmVkKEhBVkVfTUQ1X0NSWVBUKQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgotCi0vKiAwIC4uLiA2MyA9PiBhc2NpaSAtIDY0ICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBpdG9hNjRbXSA9Ci0gICAgIi4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOwotCi1zdGF0aWMgY2hhciAqbWFnaWMgPSAiJDEkIjsKLQotc3RhdGljIGNoYXIgKgotdG82NCh1bnNpZ25lZCBsb25nIHYsIGludCBuKQotewotCXN0YXRpYyBjaGFyIGJ1Zls1XTsKLQljaGFyICpzID0gYnVmOwotCi0JaWYgKG4gPiA0KQotCQlyZXR1cm4gKE5VTEwpOwotCi0JbWVtc2V0KGJ1ZiwgJ1wwJywgc2l6ZW9mKGJ1ZikpOwotCXdoaWxlICgtLW4gPj0gMCkgewotCQkqcysrID0gaXRvYTY0W3YmMHgzZl07Ci0JCXYgPj49IDY7Ci0JfQotCi0JcmV0dXJuIChidWYpOwotfQotCi1pbnQKLWlzX21kNV9zYWx0KGNvbnN0IGNoYXIgKnNhbHQpCi17Ci0JcmV0dXJuIChzdHJuY21wKHNhbHQsIG1hZ2ljLCBzdHJsZW4obWFnaWMpKSA9PSAwKTsKLX0KLQotY2hhciAqCi1tZDVfY3J5cHQoY29uc3QgY2hhciAqcHcsIGNvbnN0IGNoYXIgKnNhbHQpCi17Ci0Jc3RhdGljIGNoYXIgcGFzc3dkWzEyMF0sIHNhbHRfY29weVs5XSwgKnA7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKnNwLCAqZXA7Ci0JdW5zaWduZWQgY2hhciBmaW5hbFsxNl07Ci0JaW50IHNsLCBwbCwgaSwgajsKLQlNRDVfQ1RYCWN0eCwgY3R4MTsKLQl1bnNpZ25lZCBsb25nIGw7Ci0KLQkvKiBSZWZpbmUgdGhlIFNhbHQgZmlyc3QgKi8KLQlzcCA9IHNhbHQ7Ci0KLQkvKiBJZiBpdCBzdGFydHMgd2l0aCB0aGUgbWFnaWMgc3RyaW5nLCB0aGVuIHNraXAgdGhhdCAqLwotCWlmKHN0cm5jbXAoc3AsIG1hZ2ljLCBzdHJsZW4obWFnaWMpKSA9PSAwKQotCQlzcCArPSBzdHJsZW4obWFnaWMpOwotCi0JLyogSXQgc3RvcHMgYXQgdGhlIGZpcnN0ICckJywgbWF4IDggY2hhcnMgKi8KLQlmb3IgKGVwID0gc3A7ICplcCAhPSAnJCc7IGVwKyspIHsKLQkJaWYgKCplcCA9PSAnXDAnIHx8IGVwID49IChzcCArIDgpKQotCQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0KLQkvKiBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgdHJ1ZSBzYWx0ICovCi0Jc2wgPSBlcCAtIHNwOwotCi0JLyogU3Rhc2ggdGhlIHNhbHQgKi8KLQltZW1jcHkoc2FsdF9jb3B5LCBzcCwgc2wpOwotCXNhbHRfY29weVtzbF0gPSAnXDAnOwotCi0JTUQ1X0luaXQoJmN0eCk7Ci0KLQkvKiBUaGUgcGFzc3dvcmQgZmlyc3QsIHNpbmNlIHRoYXQgaXMgd2hhdCBpcyBtb3N0IHVua25vd24gKi8KLQlNRDVfVXBkYXRlKCZjdHgsIHB3LCBzdHJsZW4ocHcpKTsKLQotCS8qIFRoZW4gb3VyIG1hZ2ljIHN0cmluZyAqLwotCU1ENV9VcGRhdGUoJmN0eCwgbWFnaWMsIHN0cmxlbihtYWdpYykpOwotCi0JLyogVGhlbiB0aGUgcmF3IHNhbHQgKi8KLQlNRDVfVXBkYXRlKCZjdHgsIHNwLCBzbCk7Ci0KLQkvKiBUaGVuIGp1c3QgYXMgbWFueSBjaGFyYWN0ZXJzIG9mIHRoZSBNRDUocHcsIHNhbHQsIHB3KSAqLwotCU1ENV9Jbml0KCZjdHgxKTsKLQlNRDVfVXBkYXRlKCZjdHgxLCBwdywgc3RybGVuKHB3KSk7Ci0JTUQ1X1VwZGF0ZSgmY3R4MSwgc3AsIHNsKTsKLQlNRDVfVXBkYXRlKCZjdHgxLCBwdywgc3RybGVuKHB3KSk7Ci0JTUQ1X0ZpbmFsKGZpbmFsLCAmY3R4MSk7Ci0KLQlmb3IocGwgPSBzdHJsZW4ocHcpOyBwbCA+IDA7IHBsIC09IDE2KQotCQlNRDVfVXBkYXRlKCZjdHgsIGZpbmFsLCBwbCA+IDE2ID8gMTYgOiBwbCk7Ci0KLQkvKiBEb24ndCBsZWF2ZSBhbnl0aGluZyBhcm91bmQgaW4gdm0gdGhleSBjb3VsZCB1c2UuICovCi0JbWVtc2V0KGZpbmFsLCAnXDAnLCBzaXplb2YgZmluYWwpOwotCi0JLyogVGhlbiBzb21ldGhpbmcgcmVhbGx5IHdlaXJkLi4uICovCi0JZm9yIChqID0gMCwgaSA9IHN0cmxlbihwdyk7IGkgIT0gMDsgaSA+Pj0gMSkKLQkJaWYgKGkgJiAxKQotCQkJTUQ1X1VwZGF0ZSgmY3R4LCBmaW5hbCArIGosIDEpOwotCQllbHNlCi0JCQlNRDVfVXBkYXRlKCZjdHgsIHB3ICsgaiwgMSk7Ci0KLQkvKiBOb3cgbWFrZSB0aGUgb3V0cHV0IHN0cmluZyAqLwotCXNucHJpbnRmKHBhc3N3ZCwgc2l6ZW9mKHBhc3N3ZCksICIlcyVzJCIsIG1hZ2ljLCBzYWx0X2NvcHkpOwotCi0JTUQ1X0ZpbmFsKGZpbmFsLCAmY3R4KTsKLQotCS8qCi0JICogYW5kIG5vdywganVzdCB0byBtYWtlIHN1cmUgdGhpbmdzIGRvbid0IHJ1biB0b28gZmFzdAotCSAqIE9uIGEgNjAgTWh6IFBlbnRpdW0gdGhpcyB0YWtlcyAzNCBtc2VjLCBzbyB5b3Ugd291bGQKLQkgKiBuZWVkIDMwIHNlY29uZHMgdG8gYnVpbGQgYSAxMDAwIGVudHJ5IGRpY3Rpb25hcnkuLi4KLQkgKi8KLQlmb3IoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKLQkJTUQ1X0luaXQoJmN0eDEpOwotCQlpZiAoaSAmIDEpCi0JCQlNRDVfVXBkYXRlKCZjdHgxLCBwdywgc3RybGVuKHB3KSk7Ci0JCWVsc2UKLQkJCU1ENV9VcGRhdGUoJmN0eDEsIGZpbmFsLCAxNik7Ci0KLQkJaWYgKGkgJSAzKQotCQkJTUQ1X1VwZGF0ZSgmY3R4MSwgc3AsIHNsKTsKLQotCQlpZiAoaSAlIDcpCi0JCQlNRDVfVXBkYXRlKCZjdHgxLCBwdywgc3RybGVuKHB3KSk7Ci0KLQkJaWYgKGkgJiAxKQotCQkJTUQ1X1VwZGF0ZSgmY3R4MSwgZmluYWwsIDE2KTsKLQkJZWxzZQotCQkJTUQ1X1VwZGF0ZSgmY3R4MSwgcHcsIHN0cmxlbihwdykpOwotCi0JCU1ENV9GaW5hbChmaW5hbCwgJmN0eDEpOwotCX0KLQotCXAgPSBwYXNzd2QgKyBzdHJsZW4ocGFzc3dkKTsKLQotCWwgPSAoZmluYWxbIDBdPDwxNikgfCAoZmluYWxbIDZdPDw4KSB8IGZpbmFsWzEyXTsKLQlzdHJsY2F0KHBhc3N3ZCwgdG82NChsLCA0KSwgc2l6ZW9mKHBhc3N3ZCkpOwotCWwgPSAoZmluYWxbIDFdPDwxNikgfCAoZmluYWxbIDddPDw4KSB8IGZpbmFsWzEzXTsKLQlzdHJsY2F0KHBhc3N3ZCwgdG82NChsLCA0KSwgc2l6ZW9mKHBhc3N3ZCkpOwotCWwgPSAoZmluYWxbIDJdPDwxNikgfCAoZmluYWxbIDhdPDw4KSB8IGZpbmFsWzE0XTsKLQlzdHJsY2F0KHBhc3N3ZCwgdG82NChsLCA0KSwgc2l6ZW9mKHBhc3N3ZCkpOwotCWwgPSAoZmluYWxbIDNdPDwxNikgfCAoZmluYWxbIDldPDw4KSB8IGZpbmFsWzE1XTsKLQlzdHJsY2F0KHBhc3N3ZCwgdG82NChsLCA0KSwgc2l6ZW9mKHBhc3N3ZCkpOwotCWwgPSAoZmluYWxbIDRdPDwxNikgfCAoZmluYWxbMTBdPDw4KSB8IGZpbmFsWyA1XTsKLQlzdHJsY2F0KHBhc3N3ZCwgdG82NChsLCA0KSwgc2l6ZW9mKHBhc3N3ZCkpOwotCWwgPSAgICAgICAgICAgICAgICAgICAgZmluYWxbMTFdICAgICAgICAgICAgICAgIDsKLQlzdHJsY2F0KHBhc3N3ZCwgdG82NChsLCAyKSwgc2l6ZW9mKHBhc3N3ZCkpOwotCi0JLyogRG9uJ3QgbGVhdmUgYW55dGhpbmcgYXJvdW5kIGluIHZtIHRoZXkgY291bGQgdXNlLiAqLwotCW1lbXNldChmaW5hbCwgMCwgc2l6ZW9mKGZpbmFsKSk7Ci0JbWVtc2V0KHNhbHRfY29weSwgMCwgc2l6ZW9mKHNhbHRfY29weSkpOwotCW1lbXNldCgmY3R4LCAwLCBzaXplb2YoY3R4KSk7Ci0JbWVtc2V0KCZjdHgxLCAwLCBzaXplb2YoY3R4MSkpOwotCSh2b2lkKXRvNjQoMCwgNCk7Ci0KLQlyZXR1cm4gKHBhc3N3ZCk7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfTUQ1X1BBU1NXT1JEUykgJiYgIWRlZmluZWQoSEFWRV9NRDVfQ1JZUFQpICovCmRpZmYgLS1naXQgYS9tZDVjcnlwdC5oIGIvbWQ1Y3J5cHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0MWUyYy4uMDAwMDAwMAotLS0gYS9tZDVjcnlwdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICJUSEUgQkVFUi1XQVJFIExJQ0VOU0UiIChSZXZpc2lvbiA0Mik6Ci0gKiA8cGhrQGxvZ2luLmRrbmV0LmRrPiB3cm90ZSB0aGlzIGZpbGUuICBBcyBsb25nIGFzIHlvdSByZXRhaW4gdGhpcyBub3RpY2UgeW91Ci0gKiBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIHN0dWZmLiBJZiB3ZSBtZWV0IHNvbWUgZGF5LCBhbmQgeW91IHRoaW5rCi0gKiB0aGlzIHN0dWZmIGlzIHdvcnRoIGl0LCB5b3UgY2FuIGJ1eSBtZSBhIGJlZXIgaW4gcmV0dXJuLiAgIFBvdWwtSGVubmluZyBLYW1wCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotLyogJElkOiBtZDVjcnlwdC5oLHYgMS40IDIwMDMvMDUvMTggMTQ6NDY6NDYgZGptIEV4cCAkICovCi0KLSNpZm5kZWYgX01ENUNSWVBUX0gKLSNkZWZpbmUgX01ENUNSWVBUX0gKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChIQVZFX01ENV9QQVNTV09SRFMpICYmICFkZWZpbmVkKEhBVkVfTUQ1X0NSWVBUKQotCi1pbnQgaXNfbWQ1X3NhbHQoY29uc3QgY2hhciAqKTsKLWNoYXIgKm1kNV9jcnlwdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci0KLSNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfTUQ1X1BBU1NXT1JEUykgJiYgIWRlZmluZWQoSEFWRV9NRDVfQ1JZUFQpICovCi0KLSNlbmRpZiAvKiBNRDVDUllQVF9IICovCmRpZmYgLS1naXQgYS9tZG9jMm1hbi5hd2sgYi9tZG9jMm1hbi5hd2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZThkNWYuLjAwMDAwMDAKLS0tIGEvbWRvYzJtYW4uYXdrCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLSMhL3Vzci9iaW4vYXdrCi0jCi0jICRJZDogbWRvYzJtYW4uYXdrLHYgMS45IDIwMDkvMTAvMjQgMDA6NTI6NDIgZHR1Y2tlciBFeHAgJAotIwotIyBWZXJzaW9uIGhpc3Rvcnk6Ci0jICB2NCsgQWRhcHRlZCBmb3IgT3BlblNTSCBQb3J0YWJsZSAoc2VlIGN2cyBJZCBhbmQgaGlzdG9yeSkKLSMgIHYzLCBJIHB1dCB0aGUgcHJvZ3JhbSB1bmRlciBhIHByb3BlciBsaWNlbnNlCi0jICAgICAgRGFuIE5lbHNvbiA8ZG5lbHNvbkBhbGxhbnRncm91cC5jb20+IGFkZGVkIC5BbiwgLkFxIGFuZCBmaXhlZCBhIHR5cG8KLSMgIHYyLCBmaXhlZCB0byB3b3JrIG9uIEdOVSBhd2sgLS1wb3NpeCBhbmQgTWFjT1MgWAotIyAgdjEsIGZpcnN0IGF0dGVtcHQsIGRpZG4ndCB3b3JrIG9uIE1hY09TIFgKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDAzIFBldGVyIFN0dWdlIDxzdHVnZS1tZG9jMm1hbkBjZHkub3JnPgotIwotIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotIwotIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotIyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0jIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotIyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0KLUJFR0lOIHsKLSAgb3B0bGlzdD0wCi0gIG9sZG9wdGxpc3Q9MAotICBub3NwYWNlPTAKLSAgc3lub3BzaXM9MAotICByZWZlcmVuY2U9MAotICBibG9jaz0wCi0gIGV4dD0wCi0gIGV4dG9wdD0wCi0gIGxpdGVyYWw9MAotICBwcmVubD0wCi0gIGJyZWFrdz0wCi0gIGxpbmU9IiIKLX0KLQotZnVuY3Rpb24gd3RhaWwoKSB7Ci0gIHJldHZhbD0iIgotICB3aGlsZSh3PG53b3JkcykgewotICAgIGlmKGxlbmd0aChyZXR2YWwpKQotICAgICAgcmV0dmFsPXJldHZhbCBPRlMKLSAgICByZXR2YWw9cmV0dmFsIHdvcmRzWysrd10KLSAgfQotICByZXR1cm4gcmV0dmFsCi19Ci0KLWZ1bmN0aW9uIGFkZChzdHIpIHsKLSAgZm9yKDtwcmVubDtwcmVubC0tKQotICAgIGxpbmU9bGluZSAiXG4iCi0gIGxpbmU9bGluZSBzdHIKLX0KLQotISAvXlwuLyB7Ci0gIGZvcig7cHJlbmw7cHJlbmwtLSkKLSAgICBwcmludCAiIgotICBwcmludAotICBpZihsaXRlcmFsKQotICAgIHByaW50ICIuYnIiCi0gIG5leHQKLX0KLQotL15cLlxcIi8geyBuZXh0IH0KLQotewotICBvcHRpb249MAotICBwYXJlbnM9MAotICBhbmdsZXM9MAotICBzdWIoIl5cXC4iLCIiKQotICBud29yZHM9c3BsaXQoJDAsd29yZHMpCi0gIGZvcih3PTE7dzw9bndvcmRzO3crKykgewotICAgIHNraXA9MAotICAgIGlmKG1hdGNoKHdvcmRzW3ddLCJeTGl8UGYkIikpIHsKLSAgICAgIHNraXA9MQotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlhvJCIpKSB7Ci0gICAgICBza2lwPTEKLSAgICAgIGV4dD0xCi0gICAgICBpZihsZW5ndGgobGluZSkmJiEobWF0Y2gobGluZSwiICQiKXx8cHJlbmwpKQotCWFkZChPRlMpCi0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeWGMkIikpIHsKLSAgICAgIHNraXA9MQotICAgICAgZXh0PTAKLSAgICAgIGlmKCFleHRvcHQpCi0JcHJlbmwrKwotICAgICAgdz1ud29yZHMKLSAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5CZCQiKSkgewotICAgICAgc2tpcD0xCi0gICAgICBpZihtYXRjaCh3b3Jkc1t3KzFdLCItbGl0ZXJhbCIpKSB7Ci0JbGl0ZXJhbD0xCi0JcHJlbmwrKwotCXc9bndvcmRzCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeRWQkIikpIHsKLSAgICAgIHNraXA9MQotICAgICAgbGl0ZXJhbD0wCi0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeTnMkIikpIHsKLSAgICAgIHNraXA9MQotICAgICAgaWYoIW5vc3BhY2UpCi0Jbm9zcGFjZT0xCi0gICAgICBzdWIoIiAkIiwiIixsaW5lKQotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXk5vJCIpKSB7Ci0gICAgICBza2lwPTEKLSAgICAgIHN1YigiICQiLCIiLGxpbmUpCi0gICAgICBhZGQod29yZHNbKyt3XSkKLSAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5EcSQiKSkgewotICAgICAgc2tpcD0xCi0gICAgICBhZGQoImBgIikKLSAgICAgIGFkZCh3b3Jkc1srK3ddKQotICAgICAgd2hpbGUodzxud29yZHMmJiFtYXRjaCh3b3Jkc1t3KzFdLCJeW1xcLixdIikpCi0JYWRkKE9GUyB3b3Jkc1srK3ddKQotICAgICAgYWRkKCInJyIpCi0gICAgICBpZighbm9zcGFjZSYmbWF0Y2god29yZHNbdysxXSwiXltcXC4sXSIpKQotCW5vc3BhY2U9MQotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlNxfFFsJCIpKSB7Ci0gICAgICBza2lwPTEKLSAgICAgIGFkZCgiYCIgd29yZHNbKyt3XSAiJyIpCi0gICAgICBpZighbm9zcGFjZSYmbWF0Y2god29yZHNbdysxXSwiXltcXC4sXSIpKQotCW5vc3BhY2U9MQotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXk9vJCIpKSB7Ci0gICAgICBza2lwPTEKLSAgICAgIGV4dG9wdD0xCi0gICAgICBpZighbm9zcGFjZSkKLQlub3NwYWNlPTEKLSAgICAgIGFkZCgiWyIpCi0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeT2MkIikpIHsKLSAgICAgIHNraXA9MQotICAgICAgZXh0b3B0PTAKLSAgICAgIGFkZCgiXSIpCi0gICAgfQotICAgIGlmKCFza2lwKSB7Ci0gICAgICBpZighbm9zcGFjZSYmbGVuZ3RoKGxpbmUpJiYhKG1hdGNoKGxpbmUsIiAkIil8fHByZW5sKSkKLQlhZGQoT0ZTKQotICAgICAgaWYobm9zcGFjZT09MSkKLQlub3NwYWNlPTAKLSAgICB9Ci0gICAgaWYobWF0Y2god29yZHNbd10sIl5EZCQiKSkgewotICAgICAgaWYobWF0Y2god29yZHNbdysxXSwiXlxcJE1kb2NkYXRlOiIpKSB7Ci0gICAgICAgIHcrKzsKLSAgICAgICAgaWYobWF0Y2god29yZHNbdys0XSwiXlxcJCQiKSkgewotICAgICAgICAgIHdvcmRzW3crNF0gPSAiIgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBkYXRlPXd0YWlsKCkKLSAgICAgIG5leHQKLSAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5EdCQiKSkgewotICAgICAgaWQ9d3RhaWwoKQotICAgICAgbmV4dAotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlV4JCIpKSB7Ci0gICAgICBhZGQoIlVOSVgiKQotICAgICAgc2tpcD0xCi0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeT3gkIikpIHsKLSAgICAgIGFkZCgiT3BlbkJTRCIpCi0gICAgICBza2lwPTEKLSAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5PcyQiKSkgewotICAgICAgYWRkKCIuVEggIiBpZCAiIFwiIiBkYXRlICJcIiBcIiIgd3RhaWwoKSAiXCIiKQotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlNoJCIpKSB7Ci0gICAgICBhZGQoIi5TSCIpCi0gICAgICBzeW5vcHNpcz1tYXRjaCh3b3Jkc1t3KzFdLCJTWU5PUFNJUyIpCi0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeWHIkIikpIHsKLSAgICAgIGFkZCgiXFxmQiIgd29yZHNbKyt3XSAiXFxmUCgiIHdvcmRzWysrd10gIikiIHdvcmRzWysrd10pCi0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeUnMkIikpIHsKLSAgICAgIHNwbGl0KCIiLHJlZmF1dGhvcnMpCi0gICAgICBucmVmYXV0aG9ycz0wCi0gICAgICByZWZ0aXRsZT0iIgotICAgICAgcmVmaXNzdWU9IiIKLSAgICAgIHJlZmRhdGU9IiIKLSAgICAgIHJlZm9wdD0iIgotICAgICAgcmVmcmVwb3J0PSIiCi0gICAgICByZWZlcmVuY2U9MQotICAgICAgbmV4dAotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlJlJCIpKSB7Ci0gICAgICBwcmVubCsrCi0gICAgICBmb3IoaT1ucmVmYXV0aG9ycy0xO2k+MDtpLS0pIHsKLQlhZGQocmVmYXV0aG9yc1tpXSkKLQlpZihpPjEpCi0JICBhZGQoIiwgIikKLSAgICAgIH0KLSAgICAgIGlmKG5yZWZhdXRob3JzPjEpCi0JYWRkKCIgYW5kICIpCi0gICAgICBpZihucmVmYXV0aG9ycz4wKQotICAgICAgICBhZGQocmVmYXV0aG9yc1swXSAiLCAiKQotICAgICAgYWRkKCJcXGZJIiByZWZ0aXRsZSAiXFxmUCIpCi0gICAgICBpZihsZW5ndGgocmVmaXNzdWUpKQotCWFkZCgiLCAiIHJlZmlzc3VlKQotICAgICAgaWYobGVuZ3RoKHJlZnJlcG9ydCkpIHsKLQlhZGQoIiwgIiByZWZyZXBvcnQpCi0gICAgICB9Ci0gICAgICBpZihsZW5ndGgocmVmZGF0ZSkpCi0JYWRkKCIsICIgcmVmZGF0ZSkKLSAgICAgIGlmKGxlbmd0aChyZWZvcHQpKQotCWFkZCgiLCAiIHJlZm9wdCkKLSAgICAgIGFkZCgiLiIpCi0gICAgICByZWZlcmVuY2U9MAotICAgIH0gZWxzZSBpZihyZWZlcmVuY2UpIHsKLSAgICAgIGlmKG1hdGNoKHdvcmRzW3ddLCJeJUEkIikpIHsgcmVmYXV0aG9yc1tucmVmYXV0aG9ycysrXT13dGFpbCgpIH0KLSAgICAgIGlmKG1hdGNoKHdvcmRzW3ddLCJeJVQkIikpIHsKLQlyZWZ0aXRsZT13dGFpbCgpCi0Jc3ViKCJeXCIiLCIiLHJlZnRpdGxlKQotCXN1YigiXCIkIiwiIixyZWZ0aXRsZSkKLSAgICAgIH0KLSAgICAgIGlmKG1hdGNoKHdvcmRzW3ddLCJeJU4kIikpIHsgcmVmaXNzdWU9d3RhaWwoKSB9Ci0gICAgICBpZihtYXRjaCh3b3Jkc1t3XSwiXiVEJCIpKSB7IHJlZmRhdGU9d3RhaWwoKSB9Ci0gICAgICBpZihtYXRjaCh3b3Jkc1t3XSwiXiVPJCIpKSB7IHJlZm9wdD13dGFpbCgpIH0KLSAgICAgIGlmKG1hdGNoKHdvcmRzW3ddLCJeJVIkIikpIHsgcmVmcmVwb3J0PXd0YWlsKCkgfQotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXk5tJCIpKSB7Ci0gICAgICBpZihzeW5vcHNpcykgewotCWFkZCgiLmJyIikKLQlwcmVubCsrCi0gICAgICB9Ci0gICAgICBuPXdvcmRzWysrd10KLSAgICAgIGlmKCFsZW5ndGgobmFtZSkpCi0JbmFtZT1uCi0gICAgICBpZighbGVuZ3RoKG4pKQotCW49bmFtZQotICAgICAgYWRkKCJcXGZCIiBuICJcXGZQIikKLSAgICAgIGlmKCFub3NwYWNlJiZtYXRjaCh3b3Jkc1t3KzFdLCJeW1xcLixdIikpCi0Jbm9zcGFjZT0xCi0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeTmQkIikpIHsKLSAgICAgIGFkZCgiXFwtICIgd3RhaWwoKSkKLSAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5GbCQiKSkgewotICAgICAgYWRkKCJcXGZCXFwtIiB3b3Jkc1srK3ddICJcXGZQIikKLSAgICAgIGlmKCFub3NwYWNlJiZtYXRjaCh3b3Jkc1t3KzFdLCJeW1xcLixdIikpCi0Jbm9zcGFjZT0xCi0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeQXIkIikpIHsKLSAgICAgIGFkZCgiXFxmSSIpCi0gICAgICBpZih3PT1ud29yZHMpCi0JYWRkKCJmaWxlIC4uLlxcZlAiKQotICAgICAgZWxzZSB7Ci0JYWRkKHdvcmRzWysrd10gIlxcZlAiKQotCXdoaWxlKG1hdGNoKHdvcmRzW3crMV0sIl5cXHwkIikpCi0JICBhZGQoT0ZTIHdvcmRzWysrd10gIiBcXGZJIiB3b3Jkc1srK3ddICJcXGZQIikKLSAgICAgIH0KLSAgICAgIGlmKCFub3NwYWNlJiZtYXRjaCh3b3Jkc1t3KzFdLCJeW1xcLixdIikpCi0Jbm9zcGFjZT0xCi0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeQ20kIikpIHsKLSAgICAgIGFkZCgiXFxmQiIgd29yZHNbKyt3XSAiXFxmUCIpCi0gICAgICB3aGlsZSh3PG53b3JkcyYmbWF0Y2god29yZHNbdysxXSwiXltcXC4sOjspXSIpKQotCWFkZCh3b3Jkc1srK3ddKQotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXk9wJCIpKSB7Ci0gICAgICBvcHRpb249MQotICAgICAgaWYoIW5vc3BhY2UpCi0Jbm9zcGFjZT0xCi0gICAgICBhZGQoIlsiKQotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlBwJCIpKSB7Ci0gICAgICBwcmVubCsrCi0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeQW4kIikpIHsKLSAgICAgIHByZW5sKysKLSAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5TcyQiKSkgewotICAgICAgYWRkKCIuU1MiKQotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXlBhJCIpJiYhb3B0aW9uKSB7Ci0gICAgICBhZGQoIlxcZkkiKQotICAgICAgdysrCi0gICAgICBpZihtYXRjaCh3b3Jkc1t3XSwiXlxcLiIpKQotCWFkZCgiXFwmIikKLSAgICAgIGFkZCh3b3Jkc1t3XSAiXFxmUCIpCi0gICAgICB3aGlsZSh3PG53b3JkcyYmbWF0Y2god29yZHNbdysxXSwiXltcXC4sOjspXSIpKQotCWFkZCh3b3Jkc1srK3ddKQotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXkR2JCIpKSB7Ci0gICAgICBhZGQoIi5CUiIpCi0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeRW18RXYkIikpIHsKLSAgICAgIGFkZCgiLklSIikKLSAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5QcSQiKSkgewotICAgICAgYWRkKCIoIikKLSAgICAgIG5vc3BhY2U9MQotICAgICAgcGFyZW5zPTEKLSAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5BcSQiKSkgewotICAgICAgYWRkKCI8IikKLSAgICAgIG5vc3BhY2U9MQotICAgICAgYW5nbGVzPTEKLSAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5TW3h5XSQiKSkgewotICAgICAgYWRkKCIuQiAiIHd0YWlsKCkpCi0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeSWMkIikpIHsKLSAgICAgIHBsYWluPTEKLSAgICAgIGFkZCgiXFxmQiIpCi0gICAgICB3aGlsZSh3PG53b3JkcykgewotCXcrKwotCWlmKG1hdGNoKHdvcmRzW3ddLCJeT3AkIikpIHsKLQkgIHcrKwotCSAgYWRkKCJbIikKLQkgIHdvcmRzW253b3Jkc109d29yZHNbbndvcmRzXSAiXSIKLQl9Ci0JaWYobWF0Y2god29yZHNbd10sIl5BciQiKSkgewotCSAgYWRkKCJcXGZJIiB3b3Jkc1srK3ddICJcXGZQIikKLQl9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5bXFwuLF0iKSkgewotCSAgc3ViKCIgJCIsIiIsbGluZSkKLQkgIGlmKHBsYWluKSB7Ci0JICAgIGFkZCgiXFxmUCIpCi0JICAgIHBsYWluPTAKLQkgIH0KLQkgIGFkZCh3b3Jkc1t3XSkKLQl9IGVsc2UgewotCSAgaWYoIXBsYWluKSB7Ci0JICAgIGFkZCgiXFxmQiIpCi0JICAgIHBsYWluPTEKLQkgIH0KLQkgIGFkZCh3b3Jkc1t3XSkKLQl9Ci0JaWYoIW5vc3BhY2UpCi0JICBhZGQoT0ZTKQotICAgICAgfQotICAgICAgc3ViKCIgJCIsIiIsbGluZSkKLSAgICAgIGlmKHBsYWluKQotCWFkZCgiXFxmUCIpCi0gICAgfSBlbHNlIGlmKG1hdGNoKHdvcmRzW3ddLCJeQmwkIikpIHsKLSAgICAgIG9sZG9wdGxpc3Q9b3B0bGlzdAotICAgICAgaWYobWF0Y2god29yZHNbdysxXSwiLWJ1bGxldCIpKQotCW9wdGxpc3Q9MQotICAgICAgZWxzZSBpZihtYXRjaCh3b3Jkc1t3KzFdLCItZW51bSIpKSB7Ci0Jb3B0bGlzdD0yCi0JZW51bT0wCi0gICAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbdysxXSwiLXRhZyIpKQotCW9wdGxpc3Q9MwotICAgICAgZWxzZSBpZihtYXRjaCh3b3Jkc1t3KzFdLCItaXRlbSIpKQotCW9wdGxpc3Q9NAotICAgICAgZWxzZSBpZihtYXRjaCh3b3Jkc1t3KzFdLCItYnVsbGV0IikpCi0Jb3B0bGlzdD0xCi0gICAgICB3PW53b3JkcwotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXkVsJCIpKSB7Ci0gICAgICBvcHRsaXN0PW9sZG9wdGxpc3QKLSAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5CayQiKSkgewotICAgICAgaWYobWF0Y2god29yZHNbdysxXSwiLXdvcmRzIikpIHsKLQl3KysKLQlicmVha3c9MQotICAgICAgfQotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXkVrJCIpKSB7Ci0gICAgICBicmVha3c9MAotICAgIH0gZWxzZSBpZihtYXRjaCh3b3Jkc1t3XSwiXkl0JCIpJiZvcHRsaXN0KSB7Ci0gICAgICBpZihvcHRsaXN0PT0xKQotCWFkZCgiLklQIFxcKGJ1IikKLSAgICAgIGVsc2UgaWYob3B0bGlzdD09MikKLQlhZGQoIi5JUCAiICsrZW51bSAiLiIpCi0gICAgICBlbHNlIGlmKG9wdGxpc3Q9PTMpIHsKLQlhZGQoIi5UUCIpCi0JcHJlbmwrKwotCWlmKG1hdGNoKHdvcmRzW3crMV0sIl5QYSR8XkV2JCIpKSB7Ci0JICBhZGQoIi5CIikKLQkgIHcrKwotCX0KLSAgICAgIH0gZWxzZSBpZihvcHRsaXN0PT00KQotCWFkZCgiLklQIikKLSAgICB9IGVsc2UgaWYobWF0Y2god29yZHNbd10sIl5TbSQiKSkgewotICAgICAgaWYobWF0Y2god29yZHNbdysxXSwib2ZmIikpCi0Jbm9zcGFjZT0yCi0gICAgICBlbHNlIGlmKG1hdGNoKHdvcmRzW3crMV0sIm9uIikpCi0Jbm9zcGFjZT0wCi0gICAgICB3KysKLSAgICB9IGVsc2UgaWYoIXNraXApIHsKLSAgICAgIGFkZCh3b3Jkc1t3XSkKLSAgICB9Ci0gIH0KLSAgaWYobWF0Y2gobGluZSwiXlxcLlteYS16QS1aXSIpKQotICAgIHN1YigiXlxcLiIsIiIsbGluZSkKLSAgaWYocGFyZW5zKQotICAgIGFkZCgiKSIpCi0gIGlmKGFuZ2xlcykKLSAgICBhZGQoIj4iKQotICBpZihvcHRpb24pCi0gICAgYWRkKCJdIikKLSAgaWYoZXh0JiYhZXh0b3B0JiYhbWF0Y2gobGluZSwiICQiKSkKLSAgICBhZGQoT0ZTKQotICBpZighZXh0JiYhZXh0b3B0JiZsZW5ndGgobGluZSkpIHsKLSAgICBwcmludCBsaW5lCi0gICAgcHJlbmw9MAotICAgIGxpbmU9IiIKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWlzYy5jIGIvbWlzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmIzYmFlLi4wMDAwMDAwCi0tLSBhL21pc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMTMgKzAsMCBAQAotLyogJE9wZW5CU0Q6IG1pc2MuYyx2IDEuODUgMjAxMS8wMy8yOSAxODo1NDoxNyBzdGV2ZXNrIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDYgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgotI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaWZkZWYgSEFWRV9QQVRIU19ICi0jIGluY2x1ZGUgPHBhdGhzLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jZW5kaWYKLSNpZmRlZiBTU0hfVFVOX09QRU5CU0QKLSNpbmNsdWRlIDxuZXQvaWYuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJzc2guaCIKLQotLyogcmVtb3ZlIG5ld2xpbmUgYXQgZW5kIG9mIHN0cmluZyAqLwotY2hhciAqCi1jaG9wKGNoYXIgKnMpCi17Ci0JY2hhciAqdCA9IHM7Ci0Jd2hpbGUgKCp0KSB7Ci0JCWlmICgqdCA9PSAnXG4nIHx8ICp0ID09ICdccicpIHsKLQkJCSp0ID0gJ1wwJzsKLQkJCXJldHVybiBzOwotCQl9Ci0JCXQrKzsKLQl9Ci0JcmV0dXJuIHM7Ci0KLX0KLQotLyogc2V0L3Vuc2V0IGZpbGVkZXNjcmlwdG9yIHRvIG5vbi1ibG9ja2luZyAqLwotaW50Ci1zZXRfbm9uYmxvY2soaW50IGZkKQotewotCWludCB2YWw7Ci0KLQl2YWwgPSBmY250bChmZCwgRl9HRVRGTCwgMCk7Ci0JaWYgKHZhbCA8IDApIHsKLQkJZXJyb3IoImZjbnRsKCVkLCBGX0dFVEZMLCAwKTogJXMiLCBmZCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWlmICh2YWwgJiBPX05PTkJMT0NLKSB7Ci0JCWRlYnVnMygiZmQgJWQgaXMgT19OT05CTE9DSyIsIGZkKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JZGVidWcyKCJmZCAlZCBzZXR0aW5nIE9fTk9OQkxPQ0siLCBmZCk7Ci0JdmFsIHw9IE9fTk9OQkxPQ0s7Ci0JaWYgKGZjbnRsKGZkLCBGX1NFVEZMLCB2YWwpID09IC0xKSB7Ci0JCWRlYnVnKCJmY250bCglZCwgRl9TRVRGTCwgT19OT05CTE9DSyk6ICVzIiwgZmQsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci11bnNldF9ub25ibG9jayhpbnQgZmQpCi17Ci0JaW50IHZhbDsKLQotCXZhbCA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKTsKLQlpZiAodmFsIDwgMCkgewotCQllcnJvcigiZmNudGwoJWQsIEZfR0VURkwsIDApOiAlcyIsIGZkLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JaWYgKCEodmFsICYgT19OT05CTE9DSykpIHsKLQkJZGVidWczKCJmZCAlZCBpcyBub3QgT19OT05CTE9DSyIsIGZkKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JZGVidWcoImZkICVkIGNsZWFyaW5nIE9fTk9OQkxPQ0siLCBmZCk7Ci0JdmFsICY9IH5PX05PTkJMT0NLOwotCWlmIChmY250bChmZCwgRl9TRVRGTCwgdmFsKSA9PSAtMSkgewotCQlkZWJ1ZygiZmNudGwoJWQsIEZfU0VURkwsIH5PX05PTkJMT0NLKTogJXMiLAotCQkgICAgZmQsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlyZXR1cm4gKDApOwotfQotCi1jb25zdCBjaGFyICoKLXNzaF9nYWlfc3RyZXJyb3IoaW50IGdhaWVycikKLXsKLQlpZiAoZ2FpZXJyID09IEVBSV9TWVNURU0pCi0JCXJldHVybiBzdHJlcnJvcihlcnJubyk7Ci0JcmV0dXJuIGdhaV9zdHJlcnJvcihnYWllcnIpOwotfQotCi0vKiBkaXNhYmxlIG5hZ2xlIG9uIHNvY2tldCAqLwotdm9pZAotc2V0X25vZGVsYXkoaW50IGZkKQotewotCWludCBvcHQ7Ci0Jc29ja2xlbl90IG9wdGxlbjsKLQotCW9wdGxlbiA9IHNpemVvZiBvcHQ7Ci0JaWYgKGdldHNvY2tvcHQoZmQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJm9wdCwgJm9wdGxlbikgPT0gLTEpIHsKLQkJZGVidWcoImdldHNvY2tvcHQgVENQX05PREVMQVk6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKG9wdCA9PSAxKSB7Ci0JCWRlYnVnMigiZmQgJWQgaXMgVENQX05PREVMQVkiLCBmZCk7Ci0JCXJldHVybjsKLQl9Ci0Jb3B0ID0gMTsKLQlkZWJ1ZzIoImZkICVkIHNldHRpbmcgVENQX05PREVMQVkiLCBmZCk7Ci0JaWYgKHNldHNvY2tvcHQoZmQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJm9wdCwgc2l6ZW9mIG9wdCkgPT0gLTEpCi0JCWVycm9yKCJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotfQotCi0vKiBDaGFyYWN0ZXJzIGNvbnNpZGVyZWQgd2hpdGVzcGFjZSBpbiBzdHJzZXAgY2FsbHMuICovCi0jZGVmaW5lIFdISVRFU1BBQ0UgIiBcdFxyXG4iCi0jZGVmaW5lIFFVT1RFCSJcIiIKLQotLyogcmV0dXJuIG5leHQgdG9rZW4gaW4gY29uZmlndXJhdGlvbiBsaW5lICovCi1jaGFyICoKLXN0cmRlbGltKGNoYXIgKipzKQotewotCWNoYXIgKm9sZDsKLQlpbnQgd3NwYWNlID0gMDsKLQotCWlmICgqcyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCW9sZCA9ICpzOwotCi0JKnMgPSBzdHJwYnJrKCpzLCBXSElURVNQQUNFIFFVT1RFICI9Iik7Ci0JaWYgKCpzID09IE5VTEwpCi0JCXJldHVybiAob2xkKTsKLQotCWlmICgqc1swXSA9PSAnXCInKSB7Ci0JCW1lbW1vdmUoKnMsICpzICsgMSwgc3RybGVuKCpzKSk7IC8qIG1vdmUgbnVsIHRvbyAqLwotCQkvKiBGaW5kIG1hdGNoaW5nIHF1b3RlICovCi0JCWlmICgoKnMgPSBzdHJwYnJrKCpzLCBRVU9URSkpID09IE5VTEwpIHsKLQkJCXJldHVybiAoTlVMTCk7CQkvKiBubyBtYXRjaGluZyBxdW90ZSAqLwotCQl9IGVsc2UgewotCQkJKnNbMF0gPSAnXDAnOwotCQkJKnMgKz0gc3Ryc3BuKCpzICsgMSwgV0hJVEVTUEFDRSkgKyAxOwotCQkJcmV0dXJuIChvbGQpOwotCQl9Ci0JfQotCi0JLyogQWxsb3cgb25seSBvbmUgJz0nIHRvIGJlIHNraXBwZWQgKi8KLQlpZiAoKnNbMF0gPT0gJz0nKQotCQl3c3BhY2UgPSAxOwotCSpzWzBdID0gJ1wwJzsKLQotCS8qIFNraXAgYW55IGV4dHJhIHdoaXRlc3BhY2UgYWZ0ZXIgZmlyc3QgdG9rZW4gKi8KLQkqcyArPSBzdHJzcG4oKnMgKyAxLCBXSElURVNQQUNFKSArIDE7Ci0JaWYgKCpzWzBdID09ICc9JyAmJiAhd3NwYWNlKQotCQkqcyArPSBzdHJzcG4oKnMgKyAxLCBXSElURVNQQUNFKSArIDE7Ci0KLQlyZXR1cm4gKG9sZCk7Ci19Ci0KLXN0cnVjdCBwYXNzd2QgKgotcHdjb3B5KHN0cnVjdCBwYXNzd2QgKnB3KQotewotCXN0cnVjdCBwYXNzd2QgKmNvcHkgPSB4Y2FsbG9jKDEsIHNpemVvZigqY29weSkpOwotCi0JY29weS0+cHdfbmFtZSA9IHhzdHJkdXAocHctPnB3X25hbWUpOwotCWNvcHktPnB3X3Bhc3N3ZCA9IHB3LT5wd19wYXNzd2QgPyB4c3RyZHVwKHB3LT5wd19wYXNzd2QpIDogTlVMTDsKLSNpZmRlZiBIQVZFX1BXX0dFQ09TX0lOX1BBU1NXRAotCWNvcHktPnB3X2dlY29zID0geHN0cmR1cChwdy0+cHdfZ2Vjb3MpOwotI2VuZGlmCi0JY29weS0+cHdfdWlkID0gcHctPnB3X3VpZDsKLQljb3B5LT5wd19naWQgPSBwdy0+cHdfZ2lkOwotI2lmZGVmIEhBVkVfUFdfRVhQSVJFX0lOX1BBU1NXRAotCWNvcHktPnB3X2V4cGlyZSA9IHB3LT5wd19leHBpcmU7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1BXX0NIQU5HRV9JTl9QQVNTV0QKLQljb3B5LT5wd19jaGFuZ2UgPSBwdy0+cHdfY2hhbmdlOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9QV19DTEFTU19JTl9QQVNTV0QKLQljb3B5LT5wd19jbGFzcyA9IHhzdHJkdXAocHctPnB3X2NsYXNzKTsKLSNlbmRpZgotCWNvcHktPnB3X2RpciA9IHhzdHJkdXAocHctPnB3X2Rpcik7Ci0JY29weS0+cHdfc2hlbGwgPSB4c3RyZHVwKHB3LT5wd19zaGVsbCk7Ci0JcmV0dXJuIGNvcHk7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IEFTQ0lJIHN0cmluZyB0byBUQ1AvSVAgcG9ydCBudW1iZXIuCi0gKiBQb3J0IG11c3QgYmUgPj0wIGFuZCA8PTY1NTM1LgotICogUmV0dXJuIC0xIGlmIGludmFsaWQuCi0gKi8KLWludAotYTJwb3J0KGNvbnN0IGNoYXIgKnMpCi17Ci0JbG9uZyBsb25nIHBvcnQ7Ci0JY29uc3QgY2hhciAqZXJyc3RyOwotCi0JcG9ydCA9IHN0cnRvbnVtKHMsIDAsIDY1NTM1LCAmZXJyc3RyKTsKLQlpZiAoZXJyc3RyICE9IE5VTEwpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gKGludClwb3J0OwotfQotCi1pbnQKLWEydHVuKGNvbnN0IGNoYXIgKnMsIGludCAqcmVtb3RlKQotewotCWNvbnN0IGNoYXIgKmVycnN0ciA9IE5VTEw7Ci0JY2hhciAqc3AsICplcDsKLQlpbnQgdHVuOwotCi0JaWYgKHJlbW90ZSAhPSBOVUxMKSB7Ci0JCSpyZW1vdGUgPSBTU0hfVFVOSURfQU5ZOwotCQlzcCA9IHhzdHJkdXAocyk7Ci0JCWlmICgoZXAgPSBzdHJjaHIoc3AsICc6JykpID09IE5VTEwpIHsKLQkJCXhmcmVlKHNwKTsKLQkJCXJldHVybiAoYTJ0dW4ocywgTlVMTCkpOwotCQl9Ci0JCWVwWzBdID0gJ1wwJzsgZXArKzsKLQkJKnJlbW90ZSA9IGEydHVuKGVwLCBOVUxMKTsKLQkJdHVuID0gYTJ0dW4oc3AsIE5VTEwpOwotCQl4ZnJlZShzcCk7Ci0JCXJldHVybiAoKnJlbW90ZSA9PSBTU0hfVFVOSURfRVJSID8gKnJlbW90ZSA6IHR1bik7Ci0JfQotCi0JaWYgKHN0cmNhc2VjbXAocywgImFueSIpID09IDApCi0JCXJldHVybiAoU1NIX1RVTklEX0FOWSk7Ci0KLQl0dW4gPSBzdHJ0b251bShzLCAwLCBTU0hfVFVOSURfTUFYLCAmZXJyc3RyKTsKLQlpZiAoZXJyc3RyICE9IE5VTEwpCi0JCXJldHVybiAoU1NIX1RVTklEX0VSUik7Ci0KLQlyZXR1cm4gKHR1bik7Ci19Ci0KLSNkZWZpbmUgU0VDT05EUwkJMQotI2RlZmluZSBNSU5VVEVTCQkoU0VDT05EUyAqIDYwKQotI2RlZmluZSBIT1VSUwkJKE1JTlVURVMgKiA2MCkKLSNkZWZpbmUgREFZUwkJKEhPVVJTICogMjQpCi0jZGVmaW5lIFdFRUtTCQkoREFZUyAqIDcpCi0KLS8qCi0gKiBDb252ZXJ0IGEgdGltZSBzdHJpbmcgaW50byBzZWNvbmRzOyBmb3JtYXQgaXMKLSAqIGEgc2VxdWVuY2Ugb2Y6Ci0gKiAgICAgIHRpbWVbcXVhbGlmaWVyXQotICoKLSAqIFZhbGlkIHRpbWUgcXVhbGlmaWVycyBhcmU6Ci0gKiAgICAgIDxub25lPiAgc2Vjb25kcwotICogICAgICBzfFMgICAgIHNlY29uZHMKLSAqICAgICAgbXxNICAgICBtaW51dGVzCi0gKiAgICAgIGh8SCAgICAgaG91cnMKLSAqICAgICAgZHxEICAgICBkYXlzCi0gKiAgICAgIHd8VyAgICAgd2Vla3MKLSAqCi0gKiBFeGFtcGxlczoKLSAqICAgICAgOTBtICAgICA5MCBtaW51dGVzCi0gKiAgICAgIDFoMzBtICAgOTAgbWludXRlcwotICogICAgICAyZCAgICAgIDIgZGF5cwotICogICAgICAxdyAgICAgIDEgd2VlawotICoKLSAqIFJldHVybiAtMSBpZiB0aW1lIHN0cmluZyBpcyBpbnZhbGlkLgotICovCi1sb25nCi1jb252dGltZShjb25zdCBjaGFyICpzKQotewotCWxvbmcgdG90YWwsIHNlY3M7Ci0JY29uc3QgY2hhciAqcDsKLQljaGFyICplbmRwOwotCi0JZXJybm8gPSAwOwotCXRvdGFsID0gMDsKLQlwID0gczsKLQotCWlmIChwID09IE5VTEwgfHwgKnAgPT0gJ1wwJykKLQkJcmV0dXJuIC0xOwotCi0Jd2hpbGUgKCpwKSB7Ci0JCXNlY3MgPSBzdHJ0b2wocCwgJmVuZHAsIDEwKTsKLQkJaWYgKHAgPT0gZW5kcCB8fAotCQkgICAgKGVycm5vID09IEVSQU5HRSAmJiAoc2VjcyA9PSBMT05HX01JTiB8fCBzZWNzID09IExPTkdfTUFYKSkgfHwKLQkJICAgIHNlY3MgPCAwKQotCQkJcmV0dXJuIC0xOwotCi0JCXN3aXRjaCAoKmVuZHArKykgewotCQljYXNlICdcMCc6Ci0JCQllbmRwLS07Ci0JCQlicmVhazsKLQkJY2FzZSAncyc6Ci0JCWNhc2UgJ1MnOgotCQkJYnJlYWs7Ci0JCWNhc2UgJ20nOgotCQljYXNlICdNJzoKLQkJCXNlY3MgKj0gTUlOVVRFUzsKLQkJCWJyZWFrOwotCQljYXNlICdoJzoKLQkJY2FzZSAnSCc6Ci0JCQlzZWNzICo9IEhPVVJTOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2QnOgotCQljYXNlICdEJzoKLQkJCXNlY3MgKj0gREFZUzsKLQkJCWJyZWFrOwotCQljYXNlICd3JzoKLQkJY2FzZSAnVyc6Ci0JCQlzZWNzICo9IFdFRUtTOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJdG90YWwgKz0gc2VjczsKLQkJaWYgKHRvdGFsIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJcCA9IGVuZHA7Ci0JfQotCi0JcmV0dXJuIHRvdGFsOwotfQotCi0vKgotICogUmV0dXJucyBhIHN0YW5kYXJkaXplZCBob3N0K3BvcnQgaWRlbnRpZmllciBzdHJpbmcuCi0gKiBDYWxsZXIgbXVzdCBmcmVlIHJldHVybmVkIHN0cmluZy4KLSAqLwotY2hhciAqCi1wdXRfaG9zdF9wb3J0KGNvbnN0IGNoYXIgKmhvc3QsIHVfc2hvcnQgcG9ydCkKLXsKLQljaGFyICpob3N0c3RyOwotCi0JaWYgKHBvcnQgPT0gMCB8fCBwb3J0ID09IFNTSF9ERUZBVUxUX1BPUlQpCi0JCXJldHVybih4c3RyZHVwKGhvc3QpKTsKLQlpZiAoYXNwcmludGYoJmhvc3RzdHIsICJbJXNdOiVkIiwgaG9zdCwgKGludClwb3J0KSA8IDApCi0JCWZhdGFsKCJwdXRfaG9zdF9wb3J0OiBhc3ByaW50ZjogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCWRlYnVnMygicHV0X2hvc3RfcG9ydDogJXMiLCBob3N0c3RyKTsKLQlyZXR1cm4gaG9zdHN0cjsKLX0KLQotLyoKLSAqIFNlYXJjaCBmb3IgbmV4dCBkZWxpbWl0ZXIgYmV0d2VlbiBob3N0bmFtZXMvYWRkcmVzc2VzIGFuZCBwb3J0cy4KLSAqIEFyZ3VtZW50IG1heSBiZSBtb2RpZmllZCAoZm9yIHRlcm1pbmF0aW9uKS4KLSAqIFJldHVybnMgKmNwIGlmIHBhcnNpbmcgc3VjY2VlZHMuCi0gKiAqY3AgaXMgc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBkZWxpbWl0ZXIsIGlmIG9uZSB3YXMgZm91bmQuCi0gKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGZpZWxkLCAqY3AgaXMgc2V0IHRvIE5VTEwuCi0gKi8KLWNoYXIgKgotaHBkZWxpbShjaGFyICoqY3ApCi17Ci0JY2hhciAqcywgKm9sZDsKLQotCWlmIChjcCA9PSBOVUxMIHx8ICpjcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCW9sZCA9IHMgPSAqY3A7Ci0JaWYgKCpzID09ICdbJykgewotCQlpZiAoKHMgPSBzdHJjaHIocywgJ10nKSkgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQllbHNlCi0JCQlzKys7Ci0JfSBlbHNlIGlmICgocyA9IHN0cnBicmsocywgIjovIikpID09IE5VTEwpCi0JCXMgPSAqY3AgKyBzdHJsZW4oKmNwKTsgLyogc2tpcCB0byBlbmQgKHNlZSBmaXJzdCBjYXNlIGJlbG93KSAqLwotCi0Jc3dpdGNoICgqcykgewotCWNhc2UgJ1wwJzoKLQkJKmNwID0gTlVMTDsJLyogbm8gbW9yZSBmaWVsZHMqLwotCQlicmVhazsKLQotCWNhc2UgJzonOgotCWNhc2UgJy8nOgotCQkqcyA9ICdcMCc7CS8qIHRlcm1pbmF0ZSAqLwotCQkqY3AgPSBzICsgMTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gb2xkOwotfQotCi1jaGFyICoKLWNsZWFuaG9zdG5hbWUoY2hhciAqaG9zdCkKLXsKLQlpZiAoKmhvc3QgPT0gJ1snICYmIGhvc3Rbc3RybGVuKGhvc3QpIC0gMV0gPT0gJ10nKSB7Ci0JCWhvc3Rbc3RybGVuKGhvc3QpIC0gMV0gPSAnXDAnOwotCQlyZXR1cm4gKGhvc3QgKyAxKTsKLQl9IGVsc2UKLQkJcmV0dXJuIGhvc3Q7Ci19Ci0KLWNoYXIgKgotY29sb24oY2hhciAqY3ApCi17Ci0JaW50IGZsYWcgPSAwOwotCi0JaWYgKCpjcCA9PSAnOicpCQkvKiBMZWFkaW5nIGNvbG9uIGlzIHBhcnQgb2YgZmlsZSBuYW1lLiAqLwotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKmNwID09ICdbJykKLQkJZmxhZyA9IDE7Ci0KLQlmb3IgKDsgKmNwOyArK2NwKSB7Ci0JCWlmICgqY3AgPT0gJ0AnICYmICooY3ArMSkgPT0gJ1snKQotCQkJZmxhZyA9IDE7Ci0JCWlmICgqY3AgPT0gJ10nICYmICooY3ArMSkgPT0gJzonICYmIGZsYWcpCi0JCQlyZXR1cm4gKGNwKzEpOwotCQlpZiAoKmNwID09ICc6JyAmJiAhZmxhZykKLQkJCXJldHVybiAoY3ApOwotCQlpZiAoKmNwID09ICcvJykKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogZnVuY3Rpb24gdG8gYXNzaXN0IGJ1aWxkaW5nIGV4ZWN2KCkgYXJndW1lbnRzICovCi12b2lkCi1hZGRhcmdzKGFyZ2xpc3QgKmFyZ3MsIGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXA7Ci0JY2hhciAqY3A7Ci0JdV9pbnQgbmFsbG9jOwotCWludCByOwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JciA9IHZhc3ByaW50ZigmY3AsIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0JaWYgKHIgPT0gLTEpCi0JCWZhdGFsKCJhZGRhcmdzOiBhcmd1bWVudCB0b28gbG9uZyIpOwotCi0JbmFsbG9jID0gYXJncy0+bmFsbG9jOwotCWlmIChhcmdzLT5saXN0ID09IE5VTEwpIHsKLQkJbmFsbG9jID0gMzI7Ci0JCWFyZ3MtPm51bSA9IDA7Ci0JfSBlbHNlIGlmIChhcmdzLT5udW0rMiA+PSBuYWxsb2MpCi0JCW5hbGxvYyAqPSAyOwotCi0JYXJncy0+bGlzdCA9IHhyZWFsbG9jKGFyZ3MtPmxpc3QsIG5hbGxvYywgc2l6ZW9mKGNoYXIgKikpOwotCWFyZ3MtPm5hbGxvYyA9IG5hbGxvYzsKLQlhcmdzLT5saXN0W2FyZ3MtPm51bSsrXSA9IGNwOwotCWFyZ3MtPmxpc3RbYXJncy0+bnVtXSA9IE5VTEw7Ci19Ci0KLXZvaWQKLXJlcGxhY2VhcmcoYXJnbGlzdCAqYXJncywgdV9pbnQgd2hpY2gsIGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXA7Ci0JY2hhciAqY3A7Ci0JaW50IHI7Ci0KLQl2YV9zdGFydChhcCwgZm10KTsKLQlyID0gdmFzcHJpbnRmKCZjcCwgZm10LCBhcCk7Ci0JdmFfZW5kKGFwKTsKLQlpZiAociA9PSAtMSkKLQkJZmF0YWwoInJlcGxhY2Vhcmc6IGFyZ3VtZW50IHRvbyBsb25nIik7Ci0KLQlpZiAod2hpY2ggPj0gYXJncy0+bnVtKQotCQlmYXRhbCgicmVwbGFjZWFyZzogdHJpZWQgdG8gcmVwbGFjZSBpbnZhbGlkIGFyZyAlZCA+PSAlZCIsCi0JCSAgICB3aGljaCwgYXJncy0+bnVtKTsKLQl4ZnJlZShhcmdzLT5saXN0W3doaWNoXSk7Ci0JYXJncy0+bGlzdFt3aGljaF0gPSBjcDsKLX0KLQotdm9pZAotZnJlZWFyZ3MoYXJnbGlzdCAqYXJncykKLXsKLQl1X2ludCBpOwotCi0JaWYgKGFyZ3MtPmxpc3QgIT0gTlVMTCkgewotCQlmb3IgKGkgPSAwOyBpIDwgYXJncy0+bnVtOyBpKyspCi0JCQl4ZnJlZShhcmdzLT5saXN0W2ldKTsKLQkJeGZyZWUoYXJncy0+bGlzdCk7Ci0JCWFyZ3MtPm5hbGxvYyA9IGFyZ3MtPm51bSA9IDA7Ci0JCWFyZ3MtPmxpc3QgPSBOVUxMOwotCX0KLX0KLQotLyoKLSAqIEV4cGFuZHMgdGlsZGVzIGluIHRoZSBmaWxlIG5hbWUuICBSZXR1cm5zIGRhdGEgYWxsb2NhdGVkIGJ5IHhtYWxsb2MuCi0gKiBXYXJuaW5nOiB0aGlzIGNhbGxzIGdldHB3Ki4KLSAqLwotY2hhciAqCi10aWxkZV9leHBhbmRfZmlsZW5hbWUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHVpZF90IHVpZCkKLXsKLQljb25zdCBjaGFyICpwYXRoOwotCWNoYXIgdXNlclsxMjhdLCByZXRbTUFYUEFUSExFTl07Ci0Jc3RydWN0IHBhc3N3ZCAqcHc7Ci0JdV9pbnQgbGVuLCBzbGFzaDsKLQotCWlmICgqZmlsZW5hbWUgIT0gJ34nKQotCQlyZXR1cm4gKHhzdHJkdXAoZmlsZW5hbWUpKTsKLQlmaWxlbmFtZSsrOwotCi0JcGF0aCA9IHN0cmNocihmaWxlbmFtZSwgJy8nKTsKLQlpZiAocGF0aCAhPSBOVUxMICYmIHBhdGggPiBmaWxlbmFtZSkgewkJLyogfnVzZXIvcGF0aCAqLwotCQlzbGFzaCA9IHBhdGggLSBmaWxlbmFtZTsKLQkJaWYgKHNsYXNoID4gc2l6ZW9mKHVzZXIpIC0gMSkKLQkJCWZhdGFsKCJ0aWxkZV9leHBhbmRfZmlsZW5hbWU6IH51c2VybmFtZSB0b28gbG9uZyIpOwotCQltZW1jcHkodXNlciwgZmlsZW5hbWUsIHNsYXNoKTsKLQkJdXNlcltzbGFzaF0gPSAnXDAnOwotCQlpZiAoKHB3ID0gZ2V0cHduYW0odXNlcikpID09IE5VTEwpCi0JCQlmYXRhbCgidGlsZGVfZXhwYW5kX2ZpbGVuYW1lOiBObyBzdWNoIHVzZXIgJXMiLCB1c2VyKTsKLQl9IGVsc2UgaWYgKChwdyA9IGdldHB3dWlkKHVpZCkpID09IE5VTEwpCS8qIH4vcGF0aCAqLwotCQlmYXRhbCgidGlsZGVfZXhwYW5kX2ZpbGVuYW1lOiBObyBzdWNoIHVpZCAlbGQiLCAobG9uZyl1aWQpOwotCi0JaWYgKHN0cmxjcHkocmV0LCBwdy0+cHdfZGlyLCBzaXplb2YocmV0KSkgPj0gc2l6ZW9mKHJldCkpCi0JCWZhdGFsKCJ0aWxkZV9leHBhbmRfZmlsZW5hbWU6IFBhdGggdG9vIGxvbmciKTsKLQotCS8qIE1ha2Ugc3VyZSBkaXJlY3RvcnkgaGFzIGEgdHJhaWxpbmcgJy8nICovCi0JbGVuID0gc3RybGVuKHB3LT5wd19kaXIpOwotCWlmICgobGVuID09IDAgfHwgcHctPnB3X2RpcltsZW4gLSAxXSAhPSAnLycpICYmCi0JICAgIHN0cmxjYXQocmV0LCAiLyIsIHNpemVvZihyZXQpKSA+PSBzaXplb2YocmV0KSkKLQkJZmF0YWwoInRpbGRlX2V4cGFuZF9maWxlbmFtZTogUGF0aCB0b28gbG9uZyIpOwotCi0JLyogU2tpcCBsZWFkaW5nICcvJyBmcm9tIHNwZWNpZmllZCBwYXRoICovCi0JaWYgKHBhdGggIT0gTlVMTCkKLQkJZmlsZW5hbWUgPSBwYXRoICsgMTsKLQlpZiAoc3RybGNhdChyZXQsIGZpbGVuYW1lLCBzaXplb2YocmV0KSkgPj0gc2l6ZW9mKHJldCkpCi0JCWZhdGFsKCJ0aWxkZV9leHBhbmRfZmlsZW5hbWU6IFBhdGggdG9vIGxvbmciKTsKLQotCXJldHVybiAoeHN0cmR1cChyZXQpKTsKLX0KLQotLyoKLSAqIEV4cGFuZCBhIHN0cmluZyB3aXRoIGEgc2V0IG9mICVbY2hhcl0gZXNjYXBlcy4gQSBudW1iZXIgb2YgZXNjYXBlcyBtYXkgYmUKLSAqIHNwZWNpZmllZCBhcyAoY2hhciAqZXNjYXBlX2NoYXJzLCBjaGFyICpyZXBsYWNlbWVudCkgcGFpcnMuIFRoZSBsaXN0IG11c3QKLSAqIGJlIHRlcm1pbmF0ZWQgYnkgYSBOVUxMIGVzY2FwZV9jaGFyLiBSZXR1cm5zIHJlcGxhY2VkIHN0cmluZyBpbiBtZW1vcnkKLSAqIGFsbG9jYXRlZCBieSB4bWFsbG9jLgotICovCi1jaGFyICoKLXBlcmNlbnRfZXhwYW5kKGNvbnN0IGNoYXIgKnN0cmluZywgLi4uKQotewotI2RlZmluZSBFWFBBTkRfTUFYX0tFWVMJMTYKLQl1X2ludCBudW1fa2V5cywgaSwgajsKLQlzdHJ1Y3QgewotCQljb25zdCBjaGFyICprZXk7Ci0JCWNvbnN0IGNoYXIgKnJlcGw7Ci0JfSBrZXlzW0VYUEFORF9NQVhfS0VZU107Ci0JY2hhciBidWZbNDA5Nl07Ci0JdmFfbGlzdCBhcDsKLQotCS8qIEdhdGhlciBrZXlzICovCi0JdmFfc3RhcnQoYXAsIHN0cmluZyk7Ci0JZm9yIChudW1fa2V5cyA9IDA7IG51bV9rZXlzIDwgRVhQQU5EX01BWF9LRVlTOyBudW1fa2V5cysrKSB7Ci0JCWtleXNbbnVtX2tleXNdLmtleSA9IHZhX2FyZyhhcCwgY2hhciAqKTsKLQkJaWYgKGtleXNbbnVtX2tleXNdLmtleSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCWtleXNbbnVtX2tleXNdLnJlcGwgPSB2YV9hcmcoYXAsIGNoYXIgKik7Ci0JCWlmIChrZXlzW251bV9rZXlzXS5yZXBsID09IE5VTEwpCi0JCQlmYXRhbCgiJXM6IE5VTEwgcmVwbGFjZW1lbnQiLCBfX2Z1bmNfXyk7Ci0JfQotCWlmIChudW1fa2V5cyA9PSBFWFBBTkRfTUFYX0tFWVMgJiYgdmFfYXJnKGFwLCBjaGFyICopICE9IE5VTEwpCi0JCWZhdGFsKCIlczogdG9vIG1hbnkga2V5cyIsIF9fZnVuY19fKTsKLQl2YV9lbmQoYXApOwotCi0JLyogRXhwYW5kIHN0cmluZyAqLwotCSpidWYgPSAnXDAnOwotCWZvciAoaSA9IDA7ICpzdHJpbmcgIT0gJ1wwJzsgc3RyaW5nKyspIHsKLQkJaWYgKCpzdHJpbmcgIT0gJyUnKSB7Ci0gYXBwZW5kOgotCQkJYnVmW2krK10gPSAqc3RyaW5nOwotCQkJaWYgKGkgPj0gc2l6ZW9mKGJ1ZikpCi0JCQkJZmF0YWwoIiVzOiBzdHJpbmcgdG9vIGxvbmciLCBfX2Z1bmNfXyk7Ci0JCQlidWZbaV0gPSAnXDAnOwotCQkJY29udGludWU7Ci0JCX0KLQkJc3RyaW5nKys7Ci0JCS8qICUlIGNhc2UgKi8KLQkJaWYgKCpzdHJpbmcgPT0gJyUnKQotCQkJZ290byBhcHBlbmQ7Ci0JCWZvciAoaiA9IDA7IGogPCBudW1fa2V5czsgaisrKSB7Ci0JCQlpZiAoc3RyY2hyKGtleXNbal0ua2V5LCAqc3RyaW5nKSAhPSBOVUxMKSB7Ci0JCQkJaSA9IHN0cmxjYXQoYnVmLCBrZXlzW2pdLnJlcGwsIHNpemVvZihidWYpKTsKLQkJCQlpZiAoaSA+PSBzaXplb2YoYnVmKSkKLQkJCQkJZmF0YWwoIiVzOiBzdHJpbmcgdG9vIGxvbmciLCBfX2Z1bmNfXyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPj0gbnVtX2tleXMpCi0JCQlmYXRhbCgiJXM6IHVua25vd24ga2V5ICUlJWMiLCBfX2Z1bmNfXywgKnN0cmluZyk7Ci0JfQotCXJldHVybiAoeHN0cmR1cChidWYpKTsKLSN1bmRlZiBFWFBBTkRfTUFYX0tFWVMKLX0KLQotLyoKLSAqIFJlYWQgYW4gZW50aXJlIGxpbmUgZnJvbSBhIHB1YmxpYyBrZXkgZmlsZSBpbnRvIGEgc3RhdGljIGJ1ZmZlciwgZGlzY2FyZGluZwotICogbGluZXMgdGhhdCBleGNlZWQgdGhlIGJ1ZmZlciBzaXplLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCi0gKi8KLWludAotcmVhZF9rZXlmaWxlX2xpbmUoRklMRSAqZiwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnN6LAotICAgdV9sb25nICpsaW5lbm8pCi17Ci0Jd2hpbGUgKGZnZXRzKGJ1ZiwgYnVmc3osIGYpICE9IE5VTEwpIHsKLQkJaWYgKGJ1ZlswXSA9PSAnXDAnKQotCQkJY29udGludWU7Ci0JCSgqbGluZW5vKSsrOwotCQlpZiAoYnVmW3N0cmxlbihidWYpIC0gMV0gPT0gJ1xuJyB8fCBmZW9mKGYpKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIHsKLQkJCWRlYnVnKCIlczogJXMgbGluZSAlbHUgZXhjZWVkcyBzaXplIGxpbWl0IiwgX19mdW5jX18sCi0JCQkgICAgZmlsZW5hbWUsICpsaW5lbm8pOwotCQkJLyogZGlzY2FyZCByZW1haW5kZXIgb2YgbGluZSAqLwotCQkJd2hpbGUgKGZnZXRjKGYpICE9ICdcbicgJiYgIWZlb2YoZikpCi0JCQkJOwkvKiBub3RoaW5nICovCi0JCX0KLQl9Ci0JcmV0dXJuIC0xOwotfQotCi1pbnQKLXR1bl9vcGVuKGludCB0dW4sIGludCBtb2RlKQotewotI2lmIGRlZmluZWQoQ1VTVE9NX1NZU19UVU5fT1BFTikKLQlyZXR1cm4gKHN5c190dW5fb3Blbih0dW4sIG1vZGUpKTsKLSNlbGlmIGRlZmluZWQoU1NIX1RVTl9PUEVOQlNEKQotCXN0cnVjdCBpZnJlcSBpZnI7Ci0JY2hhciBuYW1lWzEwMF07Ci0JaW50IGZkID0gLTEsIHNvY2s7Ci0KLQkvKiBPcGVuIHRoZSB0dW5uZWwgZGV2aWNlICovCi0JaWYgKHR1biA8PSBTU0hfVFVOSURfTUFYKSB7Ci0JCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIi9kZXYvdHVuJWQiLCB0dW4pOwotCQlmZCA9IG9wZW4obmFtZSwgT19SRFdSKTsKLQl9IGVsc2UgaWYgKHR1biA9PSBTU0hfVFVOSURfQU5ZKSB7Ci0JCWZvciAodHVuID0gMTAwOyB0dW4gPj0gMDsgdHVuLS0pIHsKLQkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIi9kZXYvdHVuJWQiLCB0dW4pOwotCQkJaWYgKChmZCA9IG9wZW4obmFtZSwgT19SRFdSKSkgPj0gMCkKLQkJCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCWRlYnVnKCIlczogaW52YWxpZCB0dW5uZWwgJXUiLCBfX2Z1bmNfXywgdHVuKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCi0JaWYgKGZkIDwgMCkgewotCQlkZWJ1ZygiJXM6ICVzIG9wZW4gZmFpbGVkOiAlcyIsIF9fZnVuY19fLCBuYW1lLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQlkZWJ1ZygiJXM6ICVzIG1vZGUgJWQgZmQgJWQiLCBfX2Z1bmNfXywgbmFtZSwgbW9kZSwgZmQpOwotCi0JLyogU2V0IHRoZSB0dW5uZWwgZGV2aWNlIG9wZXJhdGlvbiBtb2RlICovCi0Jc25wcmludGYoaWZyLmlmcl9uYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSwgInR1biVkIiwgdHVuKTsKLQlpZiAoKHNvY2sgPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIDApKSA9PSAtMSkKLQkJZ290byBmYWlsZWQ7Ci0KLQlpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkZMQUdTLCAmaWZyKSA9PSAtMSkKLQkJZ290byBmYWlsZWQ7Ci0KLQkvKiBTZXQgaW50ZXJmYWNlIG1vZGUgKi8KLQlpZnIuaWZyX2ZsYWdzICY9IH5JRkZfVVA7Ci0JaWYgKG1vZGUgPT0gU1NIX1RVTk1PREVfRVRIRVJORVQpCi0JCWlmci5pZnJfZmxhZ3MgfD0gSUZGX0xJTkswOwotCWVsc2UKLQkJaWZyLmlmcl9mbGFncyAmPSB+SUZGX0xJTkswOwotCWlmIChpb2N0bChzb2NrLCBTSU9DU0lGRkxBR1MsICZpZnIpID09IC0xKQotCQlnb3RvIGZhaWxlZDsKLQotCS8qIEJyaW5nIGludGVyZmFjZSB1cCAqLwotCWlmci5pZnJfZmxhZ3MgfD0gSUZGX1VQOwotCWlmIChpb2N0bChzb2NrLCBTSU9DU0lGRkxBR1MsICZpZnIpID09IC0xKQotCQlnb3RvIGZhaWxlZDsKLQotCWNsb3NlKHNvY2spOwotCXJldHVybiAoZmQpOwotCi0gZmFpbGVkOgotCWlmIChmZCA+PSAwKQotCQljbG9zZShmZCk7Ci0JaWYgKHNvY2sgPj0gMCkKLQkJY2xvc2Uoc29jayk7Ci0JZGVidWcoIiVzOiBmYWlsZWQgdG8gc2V0ICVzIG1vZGUgJWQ6ICVzIiwgX19mdW5jX18sIG5hbWUsCi0JICAgIG1vZGUsIHN0cmVycm9yKGVycm5vKSk7Ci0JcmV0dXJuICgtMSk7Ci0jZWxzZQotCWVycm9yKCJUdW5uZWwgaW50ZXJmYWNlcyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7Ci0JcmV0dXJuICgtMSk7Ci0jZW5kaWYKLX0KLQotdm9pZAotc2FuaXRpc2Vfc3RkZmQodm9pZCkKLXsKLQlpbnQgbnVsbGZkLCBkdXBmZDsKLQotCWlmICgobnVsbGZkID0gZHVwZmQgPSBvcGVuKF9QQVRIX0RFVk5VTEwsIE9fUkRXUikpID09IC0xKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgb3BlbiAvZGV2L251bGw6ICVzXG4iLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJZXhpdCgxKTsKLQl9Ci0Jd2hpbGUgKCsrZHVwZmQgPD0gMikgewotCQkvKiBPbmx5IGNsb2JiZXIgY2xvc2VkIGZkcyAqLwotCQlpZiAoZmNudGwoZHVwZmQsIEZfR0VURkwsIDApID49IDApCi0JCQljb250aW51ZTsKLQkJaWYgKGR1cDIobnVsbGZkLCBkdXBmZCkgPT0gLTEpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiZHVwMjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlleGl0KDEpOwotCQl9Ci0JfQotCWlmIChudWxsZmQgPiAyKQotCQljbG9zZShudWxsZmQpOwotfQotCi1jaGFyICoKLXRvaGV4KGNvbnN0IHZvaWQgKnZwLCBzaXplX3QgbCkKLXsKLQljb25zdCB1X2NoYXIgKnAgPSAoY29uc3QgdV9jaGFyICopdnA7Ci0JY2hhciBiWzNdLCAqcjsKLQlzaXplX3QgaSwgaGw7Ci0KLQlpZiAobCA+IDY1NTM2KQotCQlyZXR1cm4geHN0cmR1cCgidG9oZXg6IGxlbmd0aCA+IDY1NTM2Iik7Ci0KLQlobCA9IGwgKiAyICsgMTsKLQlyID0geGNhbGxvYygxLCBobCk7Ci0JZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewotCQlzbnByaW50ZihiLCBzaXplb2YoYiksICIlMDJ4IiwgcFtpXSk7Ci0JCXN0cmxjYXQociwgYiwgaGwpOwotCX0KLQlyZXR1cm4gKHIpOwotfQotCi11X2ludDY0X3QKLWdldF91NjQoY29uc3Qgdm9pZCAqdnApCi17Ci0JY29uc3QgdV9jaGFyICpwID0gKGNvbnN0IHVfY2hhciAqKXZwOwotCXVfaW50NjRfdCB2OwotCi0JdiAgPSAodV9pbnQ2NF90KXBbMF0gPDwgNTY7Ci0JdiB8PSAodV9pbnQ2NF90KXBbMV0gPDwgNDg7Ci0JdiB8PSAodV9pbnQ2NF90KXBbMl0gPDwgNDA7Ci0JdiB8PSAodV9pbnQ2NF90KXBbM10gPDwgMzI7Ci0JdiB8PSAodV9pbnQ2NF90KXBbNF0gPDwgMjQ7Ci0JdiB8PSAodV9pbnQ2NF90KXBbNV0gPDwgMTY7Ci0JdiB8PSAodV9pbnQ2NF90KXBbNl0gPDwgODsKLQl2IHw9ICh1X2ludDY0X3QpcFs3XTsKLQotCXJldHVybiAodik7Ci19Ci0KLXVfaW50MzJfdAotZ2V0X3UzMihjb25zdCB2b2lkICp2cCkKLXsKLQljb25zdCB1X2NoYXIgKnAgPSAoY29uc3QgdV9jaGFyICopdnA7Ci0JdV9pbnQzMl90IHY7Ci0KLQl2ICA9ICh1X2ludDMyX3QpcFswXSA8PCAyNDsKLQl2IHw9ICh1X2ludDMyX3QpcFsxXSA8PCAxNjsKLQl2IHw9ICh1X2ludDMyX3QpcFsyXSA8PCA4OwotCXYgfD0gKHVfaW50MzJfdClwWzNdOwotCi0JcmV0dXJuICh2KTsKLX0KLQotdV9pbnQxNl90Ci1nZXRfdTE2KGNvbnN0IHZvaWQgKnZwKQotewotCWNvbnN0IHVfY2hhciAqcCA9IChjb25zdCB1X2NoYXIgKil2cDsKLQl1X2ludDE2X3QgdjsKLQotCXYgID0gKHVfaW50MTZfdClwWzBdIDw8IDg7Ci0JdiB8PSAodV9pbnQxNl90KXBbMV07Ci0KLQlyZXR1cm4gKHYpOwotfQotCi12b2lkCi1wdXRfdTY0KHZvaWQgKnZwLCB1X2ludDY0X3QgdikKLXsKLQl1X2NoYXIgKnAgPSAodV9jaGFyICopdnA7Ci0KLQlwWzBdID0gKHVfY2hhcikodiA+PiA1NikgJiAweGZmOwotCXBbMV0gPSAodV9jaGFyKSh2ID4+IDQ4KSAmIDB4ZmY7Ci0JcFsyXSA9ICh1X2NoYXIpKHYgPj4gNDApICYgMHhmZjsKLQlwWzNdID0gKHVfY2hhcikodiA+PiAzMikgJiAweGZmOwotCXBbNF0gPSAodV9jaGFyKSh2ID4+IDI0KSAmIDB4ZmY7Ci0JcFs1XSA9ICh1X2NoYXIpKHYgPj4gMTYpICYgMHhmZjsKLQlwWzZdID0gKHVfY2hhcikodiA+PiA4KSAmIDB4ZmY7Ci0JcFs3XSA9ICh1X2NoYXIpdiAmIDB4ZmY7Ci19Ci0KLXZvaWQKLXB1dF91MzIodm9pZCAqdnAsIHVfaW50MzJfdCB2KQotewotCXVfY2hhciAqcCA9ICh1X2NoYXIgKil2cDsKLQotCXBbMF0gPSAodV9jaGFyKSh2ID4+IDI0KSAmIDB4ZmY7Ci0JcFsxXSA9ICh1X2NoYXIpKHYgPj4gMTYpICYgMHhmZjsKLQlwWzJdID0gKHVfY2hhcikodiA+PiA4KSAmIDB4ZmY7Ci0JcFszXSA9ICh1X2NoYXIpdiAmIDB4ZmY7Ci19Ci0KLQotdm9pZAotcHV0X3UxNih2b2lkICp2cCwgdV9pbnQxNl90IHYpCi17Ci0JdV9jaGFyICpwID0gKHVfY2hhciAqKXZwOwotCi0JcFswXSA9ICh1X2NoYXIpKHYgPj4gOCkgJiAweGZmOwotCXBbMV0gPSAodV9jaGFyKXYgJiAweGZmOwotfQotCi12b2lkCi1tc19zdWJ0cmFjdF9kaWZmKHN0cnVjdCB0aW1ldmFsICpzdGFydCwgaW50ICptcykKLXsKLQlzdHJ1Y3QgdGltZXZhbCBkaWZmLCBmaW5pc2g7Ci0KLQlnZXR0aW1lb2ZkYXkoJmZpbmlzaCwgTlVMTCk7Ci0JdGltZXJzdWIoJmZpbmlzaCwgc3RhcnQsICZkaWZmKTsJCi0JKm1zIC09IChkaWZmLnR2X3NlYyAqIDEwMDApICsgKGRpZmYudHZfdXNlYyAvIDEwMDApOwotfQotCi12b2lkCi1tc190b190aW1ldmFsKHN0cnVjdCB0aW1ldmFsICp0diwgaW50IG1zKQotewotCWlmIChtcyA8IDApCi0JCW1zID0gMDsKLQl0di0+dHZfc2VjID0gbXMgLyAxMDAwOwotCXR2LT50dl91c2VjID0gKG1zICUgMTAwMCkgKiAxMDAwOwotfQotCi12b2lkCi1iYW5kd2lkdGhfbGltaXRfaW5pdChzdHJ1Y3QgYndsaW1pdCAqYncsIHVfaW50NjRfdCBrYnBzLCBzaXplX3QgYnVmbGVuKQotewotCWJ3LT5idWZsZW4gPSBidWZsZW47Ci0JYnctPnJhdGUgPSBrYnBzOwotCWJ3LT50aHJlc2ggPSBidy0+cmF0ZTsKLQlidy0+bGFtdCA9IDA7Ci0JdGltZXJjbGVhcigmYnctPmJ3c3RhcnQpOwotCXRpbWVyY2xlYXIoJmJ3LT5id2VuZCk7Ci19CQotCi0vKiBDYWxsYmFjayBmcm9tIHJlYWQvd3JpdGUgbG9vcCB0byBpbnNlcnQgYmFuZHdpZHRoLWxpbWl0aW5nIGRlbGF5cyAqLwotdm9pZAotYmFuZHdpZHRoX2xpbWl0KHN0cnVjdCBid2xpbWl0ICpidywgc2l6ZV90IHJlYWRfbGVuKQotewotCXVfaW50NjRfdCB3YWl0bGVuOwotCXN0cnVjdCB0aW1lc3BlYyB0cywgcm07Ci0KLQlpZiAoIXRpbWVyaXNzZXQoJmJ3LT5id3N0YXJ0KSkgewotCQlnZXR0aW1lb2ZkYXkoJmJ3LT5id3N0YXJ0LCBOVUxMKTsKLQkJcmV0dXJuOwotCX0KLQotCWJ3LT5sYW10ICs9IHJlYWRfbGVuOwotCWlmIChidy0+bGFtdCA8IGJ3LT50aHJlc2gpCi0JCXJldHVybjsKLQotCWdldHRpbWVvZmRheSgmYnctPmJ3ZW5kLCBOVUxMKTsKLQl0aW1lcnN1YigmYnctPmJ3ZW5kLCAmYnctPmJ3c3RhcnQsICZidy0+YndlbmQpOwotCWlmICghdGltZXJpc3NldCgmYnctPmJ3ZW5kKSkKLQkJcmV0dXJuOwotCi0JYnctPmxhbXQgKj0gODsKLQl3YWl0bGVuID0gKGRvdWJsZSkxMDAwMDAwTCAqIGJ3LT5sYW10IC8gYnctPnJhdGU7Ci0KLQlidy0+YndzdGFydC50dl9zZWMgPSB3YWl0bGVuIC8gMTAwMDAwMEw7Ci0JYnctPmJ3c3RhcnQudHZfdXNlYyA9IHdhaXRsZW4gJSAxMDAwMDAwTDsKLQotCWlmICh0aW1lcmNtcCgmYnctPmJ3c3RhcnQsICZidy0+YndlbmQsID4pKSB7Ci0JCXRpbWVyc3ViKCZidy0+YndzdGFydCwgJmJ3LT5id2VuZCwgJmJ3LT5id2VuZCk7Ci0KLQkJLyogQWRqdXN0IHRoZSB3YWl0IHRpbWUgKi8KLQkJaWYgKGJ3LT5id2VuZC50dl9zZWMpIHsKLQkJCWJ3LT50aHJlc2ggLz0gMjsKLQkJCWlmIChidy0+dGhyZXNoIDwgYnctPmJ1ZmxlbiAvIDQpCi0JCQkJYnctPnRocmVzaCA9IGJ3LT5idWZsZW4gLyA0OwotCQl9IGVsc2UgaWYgKGJ3LT5id2VuZC50dl91c2VjIDwgMTAwMDApIHsKLQkJCWJ3LT50aHJlc2ggKj0gMjsKLQkJCWlmIChidy0+dGhyZXNoID4gYnctPmJ1ZmxlbiAqIDgpCi0JCQkJYnctPnRocmVzaCA9IGJ3LT5idWZsZW4gKiA4OwotCQl9Ci0KLQkJVElNRVZBTF9UT19USU1FU1BFQygmYnctPmJ3ZW5kLCAmdHMpOwotCQl3aGlsZSAobmFub3NsZWVwKCZ0cywgJnJtKSA9PSAtMSkgewotCQkJaWYgKGVycm5vICE9IEVJTlRSKQotCQkJCWJyZWFrOwotCQkJdHMgPSBybTsKLQkJfQotCX0KLQotCWJ3LT5sYW10ID0gMDsKLQlnZXR0aW1lb2ZkYXkoJmJ3LT5id3N0YXJ0LCBOVUxMKTsKLX0KLQotLyogTWFrZSBhIHRlbXBsYXRlIGZpbGVuYW1lIGZvciBta1tzZF10ZW1wKCkgKi8KLXZvaWQKLW1rdGVtcF9wcm90byhjaGFyICpzLCBzaXplX3QgbGVuKQotewotCWNvbnN0IGNoYXIgKnRtcGRpcjsKLQlpbnQgcjsKLQotCWlmICgodG1wZGlyID0gZ2V0ZW52KCJUTVBESVIiKSkgIT0gTlVMTCkgewotCQlyID0gc25wcmludGYocywgbGVuLCAiJXMvc3NoLVhYWFhYWFhYWFhYWCIsIHRtcGRpcik7Ci0JCWlmIChyID4gMCAmJiAoc2l6ZV90KXIgPCBsZW4pCi0JCQlyZXR1cm47Ci0JfQotCXIgPSBzbnByaW50ZihzLCBsZW4sICIvdG1wL3NzaC1YWFhYWFhYWFhYWFgiKTsKLQlpZiAociA8IDAgfHwgKHNpemVfdClyID49IGxlbikKLQkJZmF0YWwoIiVzOiB0ZW1wbGF0ZSBzdHJpbmcgdG9vIHNob3J0IiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHsKLQljb25zdCBjaGFyICpuYW1lOwotCWludCB2YWx1ZTsKLX0gaXBxb3NbXSA9IHsKLQl7ICJhZjExIiwgSVBUT1NfRFNDUF9BRjExIH0sCi0JeyAiYWYxMiIsIElQVE9TX0RTQ1BfQUYxMiB9LAotCXsgImFmMTMiLCBJUFRPU19EU0NQX0FGMTMgfSwKLQl7ICJhZjE0IiwgSVBUT1NfRFNDUF9BRjIxIH0sCi0JeyAiYWYyMiIsIElQVE9TX0RTQ1BfQUYyMiB9LAotCXsgImFmMjMiLCBJUFRPU19EU0NQX0FGMjMgfSwKLQl7ICJhZjMxIiwgSVBUT1NfRFNDUF9BRjMxIH0sCi0JeyAiYWYzMiIsIElQVE9TX0RTQ1BfQUYzMiB9LAotCXsgImFmMzMiLCBJUFRPU19EU0NQX0FGMzMgfSwKLQl7ICJhZjQxIiwgSVBUT1NfRFNDUF9BRjQxIH0sCi0JeyAiYWY0MiIsIElQVE9TX0RTQ1BfQUY0MiB9LAotCXsgImFmNDMiLCBJUFRPU19EU0NQX0FGNDMgfSwKLQl7ICJjczAiLCBJUFRPU19EU0NQX0NTMCB9LAotCXsgImNzMSIsIElQVE9TX0RTQ1BfQ1MxIH0sCi0JeyAiY3MyIiwgSVBUT1NfRFNDUF9DUzIgfSwKLQl7ICJjczMiLCBJUFRPU19EU0NQX0NTMyB9LAotCXsgImNzNCIsIElQVE9TX0RTQ1BfQ1M0IH0sCi0JeyAiY3M1IiwgSVBUT1NfRFNDUF9DUzUgfSwKLQl7ICJjczYiLCBJUFRPU19EU0NQX0NTNiB9LAotCXsgImNzNyIsIElQVE9TX0RTQ1BfQ1M3IH0sCi0JeyAiZWYiLCBJUFRPU19EU0NQX0VGIH0sCi0JeyAibG93ZGVsYXkiLCBJUFRPU19MT1dERUxBWSB9LAotCXsgInRocm91Z2hwdXQiLCBJUFRPU19USFJPVUdIUFVUIH0sCi0JeyAicmVsaWFiaWxpdHkiLCBJUFRPU19SRUxJQUJJTElUWSB9LAotCXsgTlVMTCwgLTEgfQotfTsKLQotaW50Ci1wYXJzZV9pcHFvcyhjb25zdCBjaGFyICpjcCkKLXsKLQl1X2ludCBpOwotCWNoYXIgKmVwOwotCWxvbmcgdmFsOwotCi0JaWYgKGNwID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlmb3IgKGkgPSAwOyBpcHFvc1tpXS5uYW1lICE9IE5VTEw7IGkrKykgewotCQlpZiAoc3RyY2FzZWNtcChjcCwgaXBxb3NbaV0ubmFtZSkgPT0gMCkKLQkJCXJldHVybiBpcHFvc1tpXS52YWx1ZTsKLQl9Ci0JLyogVHJ5IHBhcnNpbmcgYXMgYW4gaW50ZWdlciAqLwotCXZhbCA9IHN0cnRvbChjcCwgJmVwLCAwKTsKLQlpZiAoKmNwID09ICdcMCcgfHwgKmVwICE9ICdcMCcgfHwgdmFsIDwgMCB8fCB2YWwgPiAyNTUpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gdmFsOwotfQotCi1jb25zdCBjaGFyICoKLWlwdG9zMnN0cihpbnQgaXB0b3MpCi17Ci0JaW50IGk7Ci0Jc3RhdGljIGNoYXIgaXB0b3Nfc3RyW3NpemVvZiAiMHhmZiJdOwotCi0JZm9yIChpID0gMDsgaXBxb3NbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKLQkJaWYgKGlwcW9zW2ldLnZhbHVlID09IGlwdG9zKQotCQkJcmV0dXJuIGlwcW9zW2ldLm5hbWU7Ci0JfQotCXNucHJpbnRmKGlwdG9zX3N0ciwgc2l6ZW9mIGlwdG9zX3N0ciwgIjB4JTAyeCIsIGlwdG9zKTsKLQlyZXR1cm4gaXB0b3Nfc3RyOwotfQotdm9pZAotc29ja19zZXRfdjZvbmx5KGludCBzKQotewotI2lmZGVmIElQVjZfVjZPTkxZCi0JaW50IG9uID0gMTsKLQotCWRlYnVnMygiJXM6IHNldCBzb2NrZXQgJWQgSVBWNl9WNk9OTFkiLCBfX2Z1bmNfXywgcyk7Ci0JaWYgKHNldHNvY2tvcHQocywgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwgJm9uLCBzaXplb2Yob24pKSA9PSAtMSkKLQkJZXJyb3IoInNldHNvY2tvcHQgSVBWNl9WNk9OTFk6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvbWlzYy5oIGIvbWlzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzE0MmE5Li4wMDAwMDAwCi0tLSBhL21pc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiAkT3BlbkJTRDogbWlzYy5oLHYgMS40OCAyMDExLzAzLzI5IDE4OjU0OjE3IHN0ZXZlc2sgRXhwICQgKi8KLQotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpZm5kZWYgX01JU0NfSAotI2RlZmluZSBfTUlTQ19ICi0KLS8qIG1pc2MuYyAqLwotCi1jaGFyCSpjaG9wKGNoYXIgKik7Ci1jaGFyCSpzdHJkZWxpbShjaGFyICoqKTsKLWludAkgc2V0X25vbmJsb2NrKGludCk7Ci1pbnQJIHVuc2V0X25vbmJsb2NrKGludCk7Ci12b2lkCSBzZXRfbm9kZWxheShpbnQpOwotaW50CSBhMnBvcnQoY29uc3QgY2hhciAqKTsKLWludAkgYTJ0dW4oY29uc3QgY2hhciAqLCBpbnQgKik7Ci1jaGFyCSpwdXRfaG9zdF9wb3J0KGNvbnN0IGNoYXIgKiwgdV9zaG9ydCk7Ci1jaGFyCSpocGRlbGltKGNoYXIgKiopOwotY2hhcgkqY2xlYW5ob3N0bmFtZShjaGFyICopOwotY2hhcgkqY29sb24oY2hhciAqKTsKLWxvbmcJIGNvbnZ0aW1lKGNvbnN0IGNoYXIgKik7Ci1jaGFyCSp0aWxkZV9leHBhbmRfZmlsZW5hbWUoY29uc3QgY2hhciAqLCB1aWRfdCk7Ci1jaGFyCSpwZXJjZW50X2V4cGFuZChjb25zdCBjaGFyICosIC4uLikgX19hdHRyaWJ1dGVfXygoX19zZW50aW5lbF9fKSk7Ci1jaGFyCSp0b2hleChjb25zdCB2b2lkICosIHNpemVfdCk7Ci12b2lkCSBzYW5pdGlzZV9zdGRmZCh2b2lkKTsKLXZvaWQJIG1zX3N1YnRyYWN0X2RpZmYoc3RydWN0IHRpbWV2YWwgKiwgaW50ICopOwotdm9pZAkgbXNfdG9fdGltZXZhbChzdHJ1Y3QgdGltZXZhbCAqLCBpbnQpOwotdm9pZAkgc29ja19zZXRfdjZvbmx5KGludCk7Ci0KLXN0cnVjdCBwYXNzd2QgKnB3Y29weShzdHJ1Y3QgcGFzc3dkICopOwotY29uc3QgY2hhciAqc3NoX2dhaV9zdHJlcnJvcihpbnQpOwotCi10eXBlZGVmIHN0cnVjdCBhcmdsaXN0IGFyZ2xpc3Q7Ci1zdHJ1Y3QgYXJnbGlzdCB7Ci0JY2hhciAgICAqKmxpc3Q7Ci0JdV9pbnQgICBudW07Ci0JdV9pbnQgICBuYWxsb2M7Ci19Owotdm9pZAkgYWRkYXJncyhhcmdsaXN0ICosIGNoYXIgKiwgLi4uKQotCSAgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKLXZvaWQJIHJlcGxhY2VhcmcoYXJnbGlzdCAqLCB1X2ludCwgY2hhciAqLCAuLi4pCi0JICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOwotdm9pZAkgZnJlZWFyZ3MoYXJnbGlzdCAqKTsKLQotaW50CSB0dW5fb3BlbihpbnQsIGludCk7Ci0KLS8qIENvbW1vbiBkZWZpbml0aW9ucyBmb3Igc3NoIHR1bm5lbCBkZXZpY2UgZm9yd2FyZGluZyAqLwotI2RlZmluZSBTU0hfVFVOTU9ERV9OTwkJMHgwMAotI2RlZmluZSBTU0hfVFVOTU9ERV9QT0lOVE9QT0lOVAkweDAxCi0jZGVmaW5lIFNTSF9UVU5NT0RFX0VUSEVSTkVUCTB4MDIKLSNkZWZpbmUgU1NIX1RVTk1PREVfREVGQVVMVAlTU0hfVFVOTU9ERV9QT0lOVE9QT0lOVAotI2RlZmluZSBTU0hfVFVOTU9ERV9ZRVMJCShTU0hfVFVOTU9ERV9QT0lOVE9QT0lOVHxTU0hfVFVOTU9ERV9FVEhFUk5FVCkKLQotI2RlZmluZSBTU0hfVFVOSURfQU5ZCQkweDdmZmZmZmZmCi0jZGVmaW5lIFNTSF9UVU5JRF9FUlIJCShTU0hfVFVOSURfQU5ZIC0gMSkKLSNkZWZpbmUgU1NIX1RVTklEX01BWAkJKFNTSF9UVU5JRF9BTlkgLSAyKQotCi0vKiBGdW5jdGlvbnMgdG8gZXh0cmFjdCBvciBzdG9yZSBiaWctZW5kaWFuIHdvcmRzIG9mIHZhcmlvdXMgc2l6ZXMgKi8KLXVfaW50NjRfdAlnZXRfdTY0KGNvbnN0IHZvaWQgKikKLSAgICBfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyggX19taW5ieXRlc19fLCAxLCA4KSkpOwotdV9pbnQzMl90CWdldF91MzIoY29uc3Qgdm9pZCAqKQotICAgIF9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKCBfX21pbmJ5dGVzX18sIDEsIDQpKSk7Ci11X2ludDE2X3QJZ2V0X3UxNihjb25zdCB2b2lkICopCi0gICAgX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oIF9fbWluYnl0ZXNfXywgMSwgMikpKTsKLXZvaWQJCXB1dF91NjQodm9pZCAqLCB1X2ludDY0X3QpCi0gICAgX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oIF9fbWluYnl0ZXNfXywgMSwgOCkpKTsKLXZvaWQJCXB1dF91MzIodm9pZCAqLCB1X2ludDMyX3QpCi0gICAgX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oIF9fbWluYnl0ZXNfXywgMSwgNCkpKTsKLXZvaWQJCXB1dF91MTYodm9pZCAqLCB1X2ludDE2X3QpCi0gICAgX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oIF9fbWluYnl0ZXNfXywgMSwgMikpKTsKLQotc3RydWN0IGJ3bGltaXQgewotCXNpemVfdCBidWZsZW47Ci0JdV9pbnQ2NF90IHJhdGUsIHRocmVzaCwgbGFtdDsKLQlzdHJ1Y3QgdGltZXZhbCBid3N0YXJ0LCBid2VuZDsKLX07Ci0KLXZvaWQgYmFuZHdpZHRoX2xpbWl0X2luaXQoc3RydWN0IGJ3bGltaXQgKiwgdV9pbnQ2NF90LCBzaXplX3QpOwotdm9pZCBiYW5kd2lkdGhfbGltaXQoc3RydWN0IGJ3bGltaXQgKiwgc2l6ZV90KTsKLQotaW50IHBhcnNlX2lwcW9zKGNvbnN0IGNoYXIgKik7Ci1jb25zdCBjaGFyICppcHRvczJzdHIoaW50KTsKLXZvaWQgbWt0ZW1wX3Byb3RvKGNoYXIgKiwgc2l6ZV90KTsKLQotLyogcmVhZHBhc3MuYyAqLwotCi0jZGVmaW5lIFJQX0VDSE8JCQkweDAwMDEKLSNkZWZpbmUgUlBfQUxMT1dfU1RESU4JCTB4MDAwMgotI2RlZmluZSBSUF9BTExPV19FT0YJCTB4MDAwNAotI2RlZmluZSBSUF9VU0VfQVNLUEFTUwkJMHgwMDA4Ci0KLWNoYXIJKnJlYWRfcGFzc3BocmFzZShjb25zdCBjaGFyICosIGludCk7Ci1pbnQJIGFza19wZXJtaXNzaW9uKGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOwotaW50CSByZWFkX2tleWZpbGVfbGluZShGSUxFICosIGNvbnN0IGNoYXIgKiwgY2hhciAqLCBzaXplX3QsIHVfbG9uZyAqKTsKLQotI2VuZGlmIC8qIF9NSVNDX0ggKi8KZGlmZiAtLWdpdCBhL21raW5zdGFsbGRpcnMgYi9ta2luc3RhbGxkaXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0N2Q1ZjQzLi4wMDAwMDAwCi0tLSBhL21raW5zdGFsbGRpcnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jISAvYmluL3NoCi0jIG1raW5zdGFsbGRpcnMgLS0tIG1ha2UgZGlyZWN0b3J5IGhpZXJhcmNoeQotIyBBdXRob3I6IE5vYWggRnJpZWRtYW4gPGZyaWVkbWFuQHByZXAuYWkubWl0LmVkdT4KLSMgQ3JlYXRlZDogMTk5My0wNS0xNgotIyBQdWJsaWMgZG9tYWluCi0KLSMgJElkOiBta2luc3RhbGxkaXJzLHYgMS4yIDIwMDMvMTEvMjEgMTI6NDg6NTUgZGptIEV4cCAkCi0KLWVycnN0YXR1cz0wCi0KLWZvciBmaWxlCi1kbwotICAgc2V0IGZub3JkIGBlY2hvICI6JGZpbGUiIHwgc2VkIC1uZSAncy9eOlwvLyMvO3MvXjovLztzL1wvLyAvZztzL14jL1wvLztwJ2AKLSAgIHNoaWZ0Ci0KLSAgIHBhdGhjb21wPQotICAgZm9yIGQKLSAgIGRvCi0gICAgIHBhdGhjb21wPSIkcGF0aGNvbXAkZCIKLSAgICAgY2FzZSAiJHBhdGhjb21wIiBpbgotICAgICAgIC0qICkgcGF0aGNvbXA9Li8kcGF0aGNvbXAgOzsKLSAgICAgZXNhYwotCi0gICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgotCWVjaG8gIm1rZGlyICRwYXRoY29tcCIKLQotCW1rZGlyICIkcGF0aGNvbXAiIHx8IGxhc3RlcnI9JD8KLQotCWlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgotCSAgZXJyc3RhdHVzPSRsYXN0ZXJyCi0JZmkKLSAgICAgZmkKLQotICAgICBwYXRoY29tcD0iJHBhdGhjb21wLyIKLSAgIGRvbmUKLWRvbmUKLQotZXhpdCAkZXJyc3RhdHVzCi0KLSMgbWtpbnN0YWxsZGlycyBlbmRzIGhlcmUKZGlmZiAtLWdpdCBhL21vZHVsaSBiL21vZHVsaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkMjgxNC4uMDAwMDAwMAotLS0gYS9tb2R1bGkKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotIyAgICAkT3BlbkJTRDogbW9kdWxpLHYgMS40IDIwMDgvMDEvMDEgMDg6NTE6MjAgZHR1Y2tlciBFeHAgJAotIyBUaW1lIFR5cGUgVGVzdHMgVHJpZXMgU2l6ZSBHZW5lcmF0b3IgTW9kdWx1cwotMjAwNjA4MjcwMTM4NDkgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNjE3NzhGMwotMjAwNjA4MjcwMTM5MDYgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNjFDQzQ3QgotMjAwNjA4MjcwMTM5MjQgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNjIxQUZBMwotMjAwNjA4MjcwMTQwNDUgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNjU1MUI4QgotMjAwNjA4MjcwMTQwNTYgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNjU1NkEyNwotMjAwNjA4MjcwMTQxMTUgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNjVCNzI3MwotMjAwNjA4MjcwMTQxMzcgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNjY0NEQ3NwotMjAwNjA4MjcwMTQyMDMgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNjcxNzc3MwotMjAwNjA4MjcwMTQyMTQgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNjcyMkVCQgotMjAwNjA4MjcwMTQzMTIgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNjk2MUM4QgotMjAwNjA4MjcwMTQ0MDcgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNkJBN0JCRgotMjAwNjA4MjcwMTQ0MTggMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNkJBQzEwNwotMjAwNjA4MjcwMTQ0MzYgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNkMwNTIwNwotMjAwNjA4MjcwMTQ1MTUgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNkQ0OEM3MwotMjAwNjA4MjcwMTQ1MjcgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNkQ2NUNENwotMjAwNjA4MjcwMTQ1MzggMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNkQ3MDk2RgotMjAwNjA4MjcwMTQ2MDcgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNkUzNzYwQgotMjAwNjA4MjcwMTQ2MjYgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNkVBRjI5RgotMjAwNjA4MjcwMTQ2MzcgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNkVCQ0Y0RgotMjAwNjA4MjcwMTQ2NTMgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNkYwRDZCQgotMjAwNjA4MjcwMTQ3MzIgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzA4ODk2MwotMjAwNjA4MjcwMTQ4MzUgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzMyMEE3MwotMjAwNjA4MjcwMTQ5MTUgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzQ4NkZBMwotMjAwNjA4MjcwMTQ5MjYgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzQ4RkQ5RgotMjAwNjA4MjcwMTQ5NDAgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzRCQjMyMwotMjAwNjA4MjcwMTQ5NTYgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzRGOEY3RgotMjAwNjA4MjcwMTUwMjggMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzVDMDA4RgotMjAwNjA4MjcwMTUxMTIgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzc2RDlFRgotMjAwNjA4MjcwMTUxMzQgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzgwOUFBMwotMjAwNjA4MjcwMTUxNDYgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzgyNkRGQgotMjAwNjA4MjcwMTUyMDAgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzg1MzYzRgotMjAwNjA4MjcwMTUyMzEgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzk1MUY0RgotMjAwNjA4MjcwMTUyNDYgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzk5MTkwMwotMjAwNjA4MjcwMTUzMDAgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyNzlDN0IzNwotMjAwNjA4MjcwMTUzMjkgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyN0FCNDg0MwotMjAwNjA4MjcwMTUzNDcgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyN0IwRjlENwotMjAwNjA4MjcwMTUzNTkgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyN0IyNEQ1QgotMjAwNjA4MjcwMTU0MzAgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyN0MyQ0UyNwotMjAwNjA4MjcwMTU0NDkgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyN0NBM0JBMwotMjAwNjA4MjcwMTU1NDYgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyN0U5MEEwNwotMjAwNjA4MjcwMTU2MDcgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyN0YxMTZCRgotMjAwNjA4MjcwMTU2MzAgMiA2IDEwMCAxMDIzIDUgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyN0ZCQjY2RgotMjAwNjA4MjcwMTU2NDkgMiA2IDEwMCAxMDIzIDIgREU0OUZDOTA2OTk5NEMzNzlEMkI2NTYzRUZEMzdFRkFFNjc4NUVFQjFERDBBMTJCMDkwQUFDMjcyQjIyREY4QzY0QTRBMkFCN0I5OUNFMEI3N0E5QTUyRTA4MzNENTJENTNCMjU4Q0VERkZEMTc1REM4QTM3NjZBOUI5ODA3MzYyNjQ2REM5MjE1NjI4QzNGNEFGMEUwOEQwMEFCNjBBM0I5RTU1QkFFNDdFODI2NTFEQTBDMTVBMjczNTVEREIwNjM2NUNBRTFERERFNEMwQzk3REM5OTQyRkQ2NUU5ODY3RkE1MEU3MkUxQzc4NTQxMUVERDI4REUyODAzRTMxMwotMjAwNjA4MjcwMjQzMDIgMiA2IDEwMCAxNTM1IDIgREYwOTkzNkQ2NTY3MzI1Q0Q0RURFOTc1Q0IzQjlCRkZCMjZDNUVDMzFBNzFBQkEwOTMxQkU4OUFFRUI4MUE1MzE3MDg1NDBCN0VBMDM4NzVFNURGNDkzNUVEMDIxRjM5NTVENUM5NDFCQjY4MkRCREE1NDI1RjRFRjg0REQxRjQyQzZEQ0M1RTMxM0Q2NERFNUI2NTg2ODJBNTE3ODUxMDIzNTg3NzFEREI2QzJCODYwNzlDM0QwQTRFQjBEQTE0OUU3QjJDQUMwQUMyNTRGRkJDRDgyREYxMUQ3NEE0RTBCQkUzRkEwQUQwNjc1QjhBM0M2RTc5NEU5NDNCN0YzNzk5QkE4QzBGODBENjAyRjg1RDMwMzJEMjA2QTk2RUIxNkRBRkQyQzAzNkY4RDRGM0RBMUNDREIyMTc4RjA4QkQ4NTFEN0JCMUMyRTk2NEY0OEY5MUIyNTQ2OTE2RTc2QTgwRDhFMTZGNzAwRTFGQzE5NDMwOERENkFENkMzNjFCCi0yMDA2MDgyNzAyNDM1MCAyIDYgMTAwIDE1MzUgMiBERjA5OTM2RDY1NjczMjVDRDRFREU5NzVDQjNCOUJGRkIyNkM1RUMzMUE3MUFCQTA5MzFCRTg5QUVFQjgxQTUzMTcwODU0MEI3RUEwMzg3NUU1REY0OTM1RUQwMjFGMzk1NUQ1Qzk0MUJCNjgyREJEQTU0MjVGNEVGODRERDFGNDJDNkRDQzVFMzEzRDY0REU1QjY1ODY4MkE1MTc4NTEwMjM1ODc3MUREQjZDMkI4NjA3OUMzRDBBNEVCMERBMTQ5RTdCMkNBQzBBQzI1NEZGQkNEODJERjExRDc0QTRFMEJCRTNGQTBBRDA2NzVCOEEzQzZFNzk0RTk0M0I3RjM3OTlCQThDMEY4MEQ2MDJGODVEMzAzMkQyMDZBOTZFQjE2REFGRDJDMDM2RjhENEYzREExQ0NEQjIxNzhGMDhCRDg1MUQ3QkIxQzJFOTY0RjQ4RjkxQjI1NDY5MTZFNzZBODBEOEUxNkY3MDBFMUZDMTk0MzA4REQ2QUQ2RjdFOTMKLTIwMDYwODI3MDI0NTM3IDIgNiAxMDAgMTUzNSAyIERGMDk5MzZENjU2NzMyNUNENEVERTk3NUNCM0I5QkZGQjI2QzVFQzMxQTcxQUJBMDkzMUJFODlBRUVCODFBNTMxNzA4NTQwQjdFQTAzODc1RTVERjQ5MzVFRDAyMUYzOTU1RDVDOTQxQkI2ODJEQkRBNTQyNUY0RUY4NEREMUY0MkM2RENDNUUzMTNENjRERTVCNjU4NjgyQTUxNzg1MTAyMzU4NzcxRERCNkMyQjg2MDc5QzNEMEE0RUIwREExNDlFN0IyQ0FDMEFDMjU0RkZCQ0Q4MkRGMTFENzRBNEUwQkJFM0ZBMEFEMDY3NUI4QTNDNkU3OTRFOTQzQjdGMzc5OUJBOEMwRjgwRDYwMkY4NUQzMDMyRDIwNkE5NkVCMTZEQUZEMkMwMzZGOEQ0RjNEQTFDQ0RCMjE3OEYwOEJEODUxRDdCQjFDMkU5NjRGNDhGOTFCMjU0NjkxNkU3NkE4MEQ4RTE2RjcwMEUxRkMxOTQzMDhERDZBRDdERTRCQgotMjAwNjA4MjcwMjUwMDAgMiA2IDEwMCAxNTM1IDUgREYwOTkzNkQ2NTY3MzI1Q0Q0RURFOTc1Q0IzQjlCRkZCMjZDNUVDMzFBNzFBQkEwOTMxQkU4OUFFRUI4MUE1MzE3MDg1NDBCN0VBMDM4NzVFNURGNDkzNUVEMDIxRjM5NTVENUM5NDFCQjY4MkRCREE1NDI1RjRFRjg0REQxRjQyQzZEQ0M1RTMxM0Q2NERFNUI2NTg2ODJBNTE3ODUxMDIzNTg3NzFEREI2QzJCODYwNzlDM0QwQTRFQjBEQTE0OUU3QjJDQUMwQUMyNTRGRkJDRDgyREYxMUQ3NEE0RTBCQkUzRkEwQUQwNjc1QjhBM0M2RTc5NEU5NDNCN0YzNzk5QkE4QzBGODBENjAyRjg1RDMwMzJEMjA2QTk2RUIxNkRBRkQyQzAzNkY4RDRGM0RBMUNDREIyMTc4RjA4QkQ4NTFEN0JCMUMyRTk2NEY0OEY5MUIyNTQ2OTE2RTc2QTgwRDhFMTZGNzAwRTFGQzE5NDMwOERENkFEQjZENEQ3Ci0yMDA2MDgyNzAyNTQyOSAyIDYgMTAwIDE1MzUgMiBERjA5OTM2RDY1NjczMjVDRDRFREU5NzVDQjNCOUJGRkIyNkM1RUMzMUE3MUFCQTA5MzFCRTg5QUVFQjgxQTUzMTcwODU0MEI3RUEwMzg3NUU1REY0OTM1RUQwMjFGMzk1NUQ1Qzk0MUJCNjgyREJEQTU0MjVGNEVGODRERDFGNDJDNkRDQzVFMzEzRDY0REU1QjY1ODY4MkE1MTc4NTEwMjM1ODc3MUREQjZDMkI4NjA3OUMzRDBBNEVCMERBMTQ5RTdCMkNBQzBBQzI1NEZGQkNEODJERjExRDc0QTRFMEJCRTNGQTBBRDA2NzVCOEEzQzZFNzk0RTk0M0I3RjM3OTlCQThDMEY4MEQ2MDJGODVEMzAzMkQyMDZBOTZFQjE2REFGRDJDMDM2RjhENEYzREExQ0NEQjIxNzhGMDhCRDg1MUQ3QkIxQzJFOTY0RjQ4RjkxQjI1NDY5MTZFNzZBODBEOEUxNkY3MDBFMUZDMTk0MzA4REQ2QURFRjJEOEIKLTIwMDYwODI3MDI1NjEyIDIgNiAxMDAgMTUzNSAyIERGMDk5MzZENjU2NzMyNUNENEVERTk3NUNCM0I5QkZGQjI2QzVFQzMxQTcxQUJBMDkzMUJFODlBRUVCODFBNTMxNzA4NTQwQjdFQTAzODc1RTVERjQ5MzVFRDAyMUYzOTU1RDVDOTQxQkI2ODJEQkRBNTQyNUY0RUY4NEREMUY0MkM2RENDNUUzMTNENjRERTVCNjU4NjgyQTUxNzg1MTAyMzU4NzcxRERCNkMyQjg2MDc5QzNEMEE0RUIwREExNDlFN0IyQ0FDMEFDMjU0RkZCQ0Q4MkRGMTFENzRBNEUwQkJFM0ZBMEFEMDY3NUI4QTNDNkU3OTRFOTQzQjdGMzc5OUJBOEMwRjgwRDYwMkY4NUQzMDMyRDIwNkE5NkVCMTZEQUZEMkMwMzZGOEQ0RjNEQTFDQ0RCMjE3OEYwOEJEODUxRDdCQjFDMkU5NjRGNDhGOTFCMjU0NjkxNkU3NkE4MEQ4RTE2RjcwMEUxRkMxOTQzMDhERDZBREZDQ0IxMwotMjAwNjA4MjcwMzAxMzggMiA2IDEwMCAxNTM1IDIgREYwOTkzNkQ2NTY3MzI1Q0Q0RURFOTc1Q0IzQjlCRkZCMjZDNUVDMzFBNzFBQkEwOTMxQkU4OUFFRUI4MUE1MzE3MDg1NDBCN0VBMDM4NzVFNURGNDkzNUVEMDIxRjM5NTVENUM5NDFCQjY4MkRCREE1NDI1RjRFRjg0REQxRjQyQzZEQ0M1RTMxM0Q2NERFNUI2NTg2ODJBNTE3ODUxMDIzNTg3NzFEREI2QzJCODYwNzlDM0QwQTRFQjBEQTE0OUU3QjJDQUMwQUMyNTRGRkJDRDgyREYxMUQ3NEE0RTBCQkUzRkEwQUQwNjc1QjhBM0M2RTc5NEU5NDNCN0YzNzk5QkE4QzBGODBENjAyRjg1RDMwMzJEMjA2QTk2RUIxNkRBRkQyQzAzNkY4RDRGM0RBMUNDREIyMTc4RjA4QkQ4NTFEN0JCMUMyRTk2NEY0OEY5MUIyNTQ2OTE2RTc2QTgwRDhFMTZGNzAwRTFGQzE5NDMwOERENkFFNDFFODlCCi0yMDA2MDgyNzAzMDIyMyAyIDYgMTAwIDE1MzUgMiBERjA5OTM2RDY1NjczMjVDRDRFREU5NzVDQjNCOUJGRkIyNkM1RUMzMUE3MUFCQTA5MzFCRTg5QUVFQjgxQTUzMTcwODU0MEI3RUEwMzg3NUU1REY0OTM1RUQwMjFGMzk1NUQ1Qzk0MUJCNjgyREJEQTU0MjVGNEVGODRERDFGNDJDNkRDQzVFMzEzRDY0REU1QjY1ODY4MkE1MTc4NTEwMjM1ODc3MUREQjZDMkI4NjA3OUMzRDBBNEVCMERBMTQ5RTdCMkNBQzBBQzI1NEZGQkNEODJERjExRDc0QTRFMEJCRTNGQTBBRDA2NzVCOEEzQzZFNzk0RTk0M0I3RjM3OTlCQThDMEY4MEQ2MDJGODVEMzAzMkQyMDZBOTZFQjE2REFGRDJDMDM2RjhENEYzREExQ0NEQjIxNzhGMDhCRDg1MUQ3QkIxQzJFOTY0RjQ4RjkxQjI1NDY5MTZFNzZBODBEOEUxNkY3MDBFMUZDMTk0MzA4REQ2QUU0NEEyNjMKLTIwMDYwODI3MDMwNTU1IDIgNiAxMDAgMTUzNSA1IERGMDk5MzZENjU2NzMyNUNENEVERTk3NUNCM0I5QkZGQjI2QzVFQzMxQTcxQUJBMDkzMUJFODlBRUVCODFBNTMxNzA4NTQwQjdFQTAzODc1RTVERjQ5MzVFRDAyMUYzOTU1RDVDOTQxQkI2ODJEQkRBNTQyNUY0RUY4NEREMUY0MkM2RENDNUUzMTNENjRERTVCNjU4NjgyQTUxNzg1MTAyMzU4NzcxRERCNkMyQjg2MDc5QzNEMEE0RUIwREExNDlFN0IyQ0FDMEFDMjU0RkZCQ0Q4MkRGMTFENzRBNEUwQkJFM0ZBMEFEMDY3NUI4QTNDNkU3OTRFOTQzQjdGMzc5OUJBOEMwRjgwRDYwMkY4NUQzMDMyRDIwNkE5NkVCMTZEQUZEMkMwMzZGOEQ0RjNEQTFDQ0RCMjE3OEYwOEJEODUxRDdCQjFDMkU5NjRGNDhGOTFCMjU0NjkxNkU3NkE4MEQ4RTE2RjcwMEUxRkMxOTQzMDhERDZBRTZGRDJBNwotMjAwNjA4MjcwMzEyNDQgMiA2IDEwMCAxNTM1IDIgREYwOTkzNkQ2NTY3MzI1Q0Q0RURFOTc1Q0IzQjlCRkZCMjZDNUVDMzFBNzFBQkEwOTMxQkU4OUFFRUI4MUE1MzE3MDg1NDBCN0VBMDM4NzVFNURGNDkzNUVEMDIxRjM5NTVENUM5NDFCQjY4MkRCREE1NDI1RjRFRjg0REQxRjQyQzZEQ0M1RTMxM0Q2NERFNUI2NTg2ODJBNTE3ODUxMDIzNTg3NzFEREI2QzJCODYwNzlDM0QwQTRFQjBEQTE0OUU3QjJDQUMwQUMyNTRGRkJDRDgyREYxMUQ3NEE0RTBCQkUzRkEwQUQwNjc1QjhBM0M2RTc5NEU5NDNCN0YzNzk5QkE4QzBGODBENjAyRjg1RDMwMzJEMjA2QTk2RUIxNkRBRkQyQzAzNkY4RDRGM0RBMUNDREIyMTc4RjA4QkQ4NTFEN0JCMUMyRTk2NEY0OEY5MUIyNTQ2OTE2RTc2QTgwRDhFMTZGNzAwRTFGQzE5NDMwOERENkFFQ0M2OEMzCi0yMDA2MDgyNzAzMTQzNyAyIDYgMTAwIDE1MzUgMiBERjA5OTM2RDY1NjczMjVDRDRFREU5NzVDQjNCOUJGRkIyNkM1RUMzMUE3MUFCQTA5MzFCRTg5QUVFQjgxQTUzMTcwODU0MEI3RUEwMzg3NUU1REY0OTM1RUQwMjFGMzk1NUQ1Qzk0MUJCNjgyREJEQTU0MjVGNEVGODRERDFGNDJDNkRDQzVFMzEzRDY0REU1QjY1ODY4MkE1MTc4NTEwMjM1ODc3MUREQjZDMkI4NjA3OUMzRDBBNEVCMERBMTQ5RTdCMkNBQzBBQzI1NEZGQkNEODJERjExRDc0QTRFMEJCRTNGQTBBRDA2NzVCOEEzQzZFNzk0RTk0M0I3RjM3OTlCQThDMEY4MEQ2MDJGODVEMzAzMkQyMDZBOTZFQjE2REFGRDJDMDM2RjhENEYzREExQ0NEQjIxNzhGMDhCRDg1MUQ3QkIxQzJFOTY0RjQ4RjkxQjI1NDY5MTZFNzZBODBEOEUxNkY3MDBFMUZDMTk0MzA4REQ2QUVERkI0RUIKLTIwMDYwODI3MDMxNjAyIDIgNiAxMDAgMTUzNSA1IERGMDk5MzZENjU2NzMyNUNENEVERTk3NUNCM0I5QkZGQjI2QzVFQzMxQTcxQUJBMDkzMUJFODlBRUVCODFBNTMxNzA4NTQwQjdFQTAzODc1RTVERjQ5MzVFRDAyMUYzOTU1RDVDOTQxQkI2ODJEQkRBNTQyNUY0RUY4NEREMUY0MkM2RENDNUUzMTNENjRERTVCNjU4NjgyQTUxNzg1MTAyMzU4NzcxRERCNkMyQjg2MDc5QzNEMEE0RUIwREExNDlFN0IyQ0FDMEFDMjU0RkZCQ0Q4MkRGMTFENzRBNEUwQkJFM0ZBMEFEMDY3NUI4QTNDNkU3OTRFOTQzQjdGMzc5OUJBOEMwRjgwRDYwMkY4NUQzMDMyRDIwNkE5NkVCMTZEQUZEMkMwMzZGOEQ0RjNEQTFDQ0RCMjE3OEYwOEJEODUxRDdCQjFDMkU5NjRGNDhGOTFCMjU0NjkxNkU3NkE4MEQ4RTE2RjcwMEUxRkMxOTQzMDhERDZBRUVCMDdFNwotMjAwNjA4MjcwMzI0MzQgMiA2IDEwMCAxNTM1IDIgREYwOTkzNkQ2NTY3MzI1Q0Q0RURFOTc1Q0IzQjlCRkZCMjZDNUVDMzFBNzFBQkEwOTMxQkU4OUFFRUI4MUE1MzE3MDg1NDBCN0VBMDM4NzVFNURGNDkzNUVEMDIxRjM5NTVENUM5NDFCQjY4MkRCREE1NDI1RjRFRjg0REQxRjQyQzZEQ0M1RTMxM0Q2NERFNUI2NTg2ODJBNTE3ODUxMDIzNTg3NzFEREI2QzJCODYwNzlDM0QwQTRFQjBEQTE0OUU3QjJDQUMwQUMyNTRGRkJDRDgyREYxMUQ3NEE0RTBCQkUzRkEwQUQwNjc1QjhBM0M2RTc5NEU5NDNCN0YzNzk5QkE4QzBGODBENjAyRjg1RDMwMzJEMjA2QTk2RUIxNkRBRkQyQzAzNkY4RDRGM0RBMUNDREIyMTc4RjA4QkQ4NTFEN0JCMUMyRTk2NEY0OEY5MUIyNTQ2OTE2RTc2QTgwRDhFMTZGNzAwRTFGQzE5NDMwOERENkFGNUIxNTMzCi0yMDA2MDgyNzAzMjkzMyAyIDYgMTAwIDE1MzUgMiBERjA5OTM2RDY1NjczMjVDRDRFREU5NzVDQjNCOUJGRkIyNkM1RUMzMUE3MUFCQTA5MzFCRTg5QUVFQjgxQTUzMTcwODU0MEI3RUEwMzg3NUU1REY0OTM1RUQwMjFGMzk1NUQ1Qzk0MUJCNjgyREJEQTU0MjVGNEVGODRERDFGNDJDNkRDQzVFMzEzRDY0REU1QjY1ODY4MkE1MTc4NTEwMjM1ODc3MUREQjZDMkI4NjA3OUMzRDBBNEVCMERBMTQ5RTdCMkNBQzBBQzI1NEZGQkNEODJERjExRDc0QTRFMEJCRTNGQTBBRDA2NzVCOEEzQzZFNzk0RTk0M0I3RjM3OTlCQThDMEY4MEQ2MDJGODVEMzAzMkQyMDZBOTZFQjE2REFGRDJDMDM2RjhENEYzREExQ0NEQjIxNzhGMDhCRDg1MUQ3QkIxQzJFOTY0RjQ4RjkxQjI1NDY5MTZFNzZBODBEOEUxNkY3MDBFMUZDMTk0MzA4REQ2QUY5OUQ1RDMKLTIwMDYwODI3MDMzMDI4IDIgNiAxMDAgMTUzNSA1IERGMDk5MzZENjU2NzMyNUNENEVERTk3NUNCM0I5QkZGQjI2QzVFQzMxQTcxQUJBMDkzMUJFODlBRUVCODFBNTMxNzA4NTQwQjdFQTAzODc1RTVERjQ5MzVFRDAyMUYzOTU1RDVDOTQxQkI2ODJEQkRBNTQyNUY0RUY4NEREMUY0MkM2RENDNUUzMTNENjRERTVCNjU4NjgyQTUxNzg1MTAyMzU4NzcxRERCNkMyQjg2MDc5QzNEMEE0RUIwREExNDlFN0IyQ0FDMEFDMjU0RkZCQ0Q4MkRGMTFENzRBNEUwQkJFM0ZBMEFEMDY3NUI4QTNDNkU3OTRFOTQzQjdGMzc5OUJBOEMwRjgwRDYwMkY4NUQzMDMyRDIwNkE5NkVCMTZEQUZEMkMwMzZGOEQ0RjNEQTFDQ0RCMjE3OEYwOEJEODUxRDdCQjFDMkU5NjRGNDhGOTFCMjU0NjkxNkU3NkE4MEQ4RTE2RjcwMEUxRkMxOTQzMDhERDZBRjlDRjAzNwotMjAwNjA4MjcwMzMxMjAgMiA2IDEwMCAxNTM1IDUgREYwOTkzNkQ2NTY3MzI1Q0Q0RURFOTc1Q0IzQjlCRkZCMjZDNUVDMzFBNzFBQkEwOTMxQkU4OUFFRUI4MUE1MzE3MDg1NDBCN0VBMDM4NzVFNURGNDkzNUVEMDIxRjM5NTVENUM5NDFCQjY4MkRCREE1NDI1RjRFRjg0REQxRjQyQzZEQ0M1RTMxM0Q2NERFNUI2NTg2ODJBNTE3ODUxMDIzNTg3NzFEREI2QzJCODYwNzlDM0QwQTRFQjBEQTE0OUU3QjJDQUMwQUMyNTRGRkJDRDgyREYxMUQ3NEE0RTBCQkUzRkEwQUQwNjc1QjhBM0M2RTc5NEU5NDNCN0YzNzk5QkE4QzBGODBENjAyRjg1RDMwMzJEMjA2QTk2RUIxNkRBRkQyQzAzNkY4RDRGM0RBMUNDREIyMTc4RjA4QkQ4NTFEN0JCMUMyRTk2NEY0OEY5MUIyNTQ2OTE2RTc2QTgwRDhFMTZGNzAwRTFGQzE5NDMwOERENkFGQTE0QkJGCi0yMDA2MDgyNzAzMzMzMSAyIDYgMTAwIDE1MzUgMiBERjA5OTM2RDY1NjczMjVDRDRFREU5NzVDQjNCOUJGRkIyNkM1RUMzMUE3MUFCQTA5MzFCRTg5QUVFQjgxQTUzMTcwODU0MEI3RUEwMzg3NUU1REY0OTM1RUQwMjFGMzk1NUQ1Qzk0MUJCNjgyREJEQTU0MjVGNEVGODRERDFGNDJDNkRDQzVFMzEzRDY0REU1QjY1ODY4MkE1MTc4NTEwMjM1ODc3MUREQjZDMkI4NjA3OUMzRDBBNEVCMERBMTQ5RTdCMkNBQzBBQzI1NEZGQkNEODJERjExRDc0QTRFMEJCRTNGQTBBRDA2NzVCOEEzQzZFNzk0RTk0M0I3RjM3OTlCQThDMEY4MEQ2MDJGODVEMzAzMkQyMDZBOTZFQjE2REFGRDJDMDM2RjhENEYzREExQ0NEQjIxNzhGMDhCRDg1MUQ3QkIxQzJFOTY0RjQ4RjkxQjI1NDY5MTZFNzZBODBEOEUxNkY3MDBFMUZDMTk0MzA4REQ2QUZCOUZEMkIKLTIwMDYwODI3MDMzNTU1IDIgNiAxMDAgMTUzNSAyIERGMDk5MzZENjU2NzMyNUNENEVERTk3NUNCM0I5QkZGQjI2QzVFQzMxQTcxQUJBMDkzMUJFODlBRUVCODFBNTMxNzA4NTQwQjdFQTAzODc1RTVERjQ5MzVFRDAyMUYzOTU1RDVDOTQxQkI2ODJEQkRBNTQyNUY0RUY4NEREMUY0MkM2RENDNUUzMTNENjRERTVCNjU4NjgyQTUxNzg1MTAyMzU4NzcxRERCNkMyQjg2MDc5QzNEMEE0RUIwREExNDlFN0IyQ0FDMEFDMjU0RkZCQ0Q4MkRGMTFENzRBNEUwQkJFM0ZBMEFEMDY3NUI4QTNDNkU3OTRFOTQzQjdGMzc5OUJBOEMwRjgwRDYwMkY4NUQzMDMyRDIwNkE5NkVCMTZEQUZEMkMwMzZGOEQ0RjNEQTFDQ0RCMjE3OEYwOEJEODUxRDdCQjFDMkU5NjRGNDhGOTFCMjU0NjkxNkU3NkE4MEQ4RTE2RjcwMEUxRkMxOTQzMDhERDZBRkQzMkY4QgotMjAwNjA4MjcwMzM4MDYgMiA2IDEwMCAxNTM1IDIgREYwOTkzNkQ2NTY3MzI1Q0Q0RURFOTc1Q0IzQjlCRkZCMjZDNUVDMzFBNzFBQkEwOTMxQkU4OUFFRUI4MUE1MzE3MDg1NDBCN0VBMDM4NzVFNURGNDkzNUVEMDIxRjM5NTVENUM5NDFCQjY4MkRCREE1NDI1RjRFRjg0REQxRjQyQzZEQ0M1RTMxM0Q2NERFNUI2NTg2ODJBNTE3ODUxMDIzNTg3NzFEREI2QzJCODYwNzlDM0QwQTRFQjBEQTE0OUU3QjJDQUMwQUMyNTRGRkJDRDgyREYxMUQ3NEE0RTBCQkUzRkEwQUQwNjc1QjhBM0M2RTc5NEU5NDNCN0YzNzk5QkE4QzBGODBENjAyRjg1RDMwMzJEMjA2QTk2RUIxNkRBRkQyQzAzNkY4RDRGM0RBMUNDREIyMTc4RjA4QkQ4NTFEN0JCMUMyRTk2NEY0OEY5MUIyNTQ2OTE2RTc2QTgwRDhFMTZGNzAwRTFGQzE5NDMwOERENkFGRUJCN0RCCi0yMDA2MDgyNzAzNDA0NSAyIDYgMTAwIDE1MzUgMiBERjA5OTM2RDY1NjczMjVDRDRFREU5NzVDQjNCOUJGRkIyNkM1RUMzMUE3MUFCQTA5MzFCRTg5QUVFQjgxQTUzMTcwODU0MEI3RUEwMzg3NUU1REY0OTM1RUQwMjFGMzk1NUQ1Qzk0MUJCNjgyREJEQTU0MjVGNEVGODRERDFGNDJDNkRDQzVFMzEzRDY0REU1QjY1ODY4MkE1MTc4NTEwMjM1ODc3MUREQjZDMkI4NjA3OUMzRDBBNEVCMERBMTQ5RTdCMkNBQzBBQzI1NEZGQkNEODJERjExRDc0QTRFMEJCRTNGQTBBRDA2NzVCOEEzQzZFNzk0RTk0M0I3RjM3OTlCQThDMEY4MEQ2MDJGODVEMzAzMkQyMDZBOTZFQjE2REFGRDJDMDM2RjhENEYzREExQ0NEQjIxNzhGMDhCRDg1MUQ3QkIxQzJFOTY0RjQ4RjkxQjI1NDY5MTZFNzZBODBEOEUxNkY3MDBFMUZDMTk0MzA4REQ2QjAwOUM4RDMKLTIwMDYwODI3MDM0MjE0IDIgNiAxMDAgMTUzNSA1IERGMDk5MzZENjU2NzMyNUNENEVERTk3NUNCM0I5QkZGQjI2QzVFQzMxQTcxQUJBMDkzMUJFODlBRUVCODFBNTMxNzA4NTQwQjdFQTAzODc1RTVERjQ5MzVFRDAyMUYzOTU1RDVDOTQxQkI2ODJEQkRBNTQyNUY0RUY4NEREMUY0MkM2RENDNUUzMTNENjRERTVCNjU4NjgyQTUxNzg1MTAyMzU4NzcxRERCNkMyQjg2MDc5QzNEMEE0RUIwREExNDlFN0IyQ0FDMEFDMjU0RkZCQ0Q4MkRGMTFENzRBNEUwQkJFM0ZBMEFEMDY3NUI4QTNDNkU3OTRFOTQzQjdGMzc5OUJBOEMwRjgwRDYwMkY4NUQzMDMyRDIwNkE5NkVCMTZEQUZEMkMwMzZGOEQ0RjNEQTFDQ0RCMjE3OEYwOEJEODUxRDdCQjFDMkU5NjRGNDhGOTFCMjU0NjkxNkU3NkE4MEQ4RTE2RjcwMEUxRkMxOTQzMDhERDZCMDE3NzQ0NwotMjAwNjA4MjcwMzQzMTYgMiA2IDEwMCAxNTM1IDUgREYwOTkzNkQ2NTY3MzI1Q0Q0RURFOTc1Q0IzQjlCRkZCMjZDNUVDMzFBNzFBQkEwOTMxQkU4OUFFRUI4MUE1MzE3MDg1NDBCN0VBMDM4NzVFNURGNDkzNUVEMDIxRjM5NTVENUM5NDFCQjY4MkRCREE1NDI1RjRFRjg0REQxRjQyQzZEQ0M1RTMxM0Q2NERFNUI2NTg2ODJBNTE3ODUxMDIzNTg3NzFEREI2QzJCODYwNzlDM0QwQTRFQjBEQTE0OUU3QjJDQUMwQUMyNTRGRkJDRDgyREYxMUQ3NEE0RTBCQkUzRkEwQUQwNjc1QjhBM0M2RTc5NEU5NDNCN0YzNzk5QkE4QzBGODBENjAyRjg1RDMwMzJEMjA2QTk2RUIxNkRBRkQyQzAzNkY4RDRGM0RBMUNDREIyMTc4RjA4QkQ4NTFEN0JCMUMyRTk2NEY0OEY5MUIyNTQ2OTE2RTc2QTgwRDhFMTZGNzAwRTFGQzE5NDMwOERENkIwMUVGQzI3Ci0yMDA2MDgyNzAzNDUxNCAyIDYgMTAwIDE1MzUgMiBERjA5OTM2RDY1NjczMjVDRDRFREU5NzVDQjNCOUJGRkIyNkM1RUMzMUE3MUFCQTA5MzFCRTg5QUVFQjgxQTUzMTcwODU0MEI3RUEwMzg3NUU1REY0OTM1RUQwMjFGMzk1NUQ1Qzk0MUJCNjgyREJEQTU0MjVGNEVGODRERDFGNDJDNkRDQzVFMzEzRDY0REU1QjY1ODY4MkE1MTc4NTEwMjM1ODc3MUREQjZDMkI4NjA3OUMzRDBBNEVCMERBMTQ5RTdCMkNBQzBBQzI1NEZGQkNEODJERjExRDc0QTRFMEJCRTNGQTBBRDA2NzVCOEEzQzZFNzk0RTk0M0I3RjM3OTlCQThDMEY4MEQ2MDJGODVEMzAzMkQyMDZBOTZFQjE2REFGRDJDMDM2RjhENEYzREExQ0NEQjIxNzhGMDhCRDg1MUQ3QkIxQzJFOTY0RjQ4RjkxQjI1NDY5MTZFNzZBODBEOEUxNkY3MDBFMUZDMTk0MzA4REQ2QjAzMTNGOUIKLTIwMDYwODI3MDM1MTA5IDIgNiAxMDAgMTUzNSAyIERGMDk5MzZENjU2NzMyNUNENEVERTk3NUNCM0I5QkZGQjI2QzVFQzMxQTcxQUJBMDkzMUJFODlBRUVCODFBNTMxNzA4NTQwQjdFQTAzODc1RTVERjQ5MzVFRDAyMUYzOTU1RDVDOTQxQkI2ODJEQkRBNTQyNUY0RUY4NEREMUY0MkM2RENDNUUzMTNENjRERTVCNjU4NjgyQTUxNzg1MTAyMzU4NzcxRERCNkMyQjg2MDc5QzNEMEE0RUIwREExNDlFN0IyQ0FDMEFDMjU0RkZCQ0Q4MkRGMTFENzRBNEUwQkJFM0ZBMEFEMDY3NUI4QTNDNkU3OTRFOTQzQjdGMzc5OUJBOEMwRjgwRDYwMkY4NUQzMDMyRDIwNkE5NkVCMTZEQUZEMkMwMzZGOEQ0RjNEQTFDQ0RCMjE3OEYwOEJEODUxRDdCQjFDMkU5NjRGNDhGOTFCMjU0NjkxNkU3NkE4MEQ4RTE2RjcwMEUxRkMxOTQzMDhERDZCMDdENTQyQgotMjAwNjA4MjcwMzU0MTIgMiA2IDEwMCAxNTM1IDUgREYwOTkzNkQ2NTY3MzI1Q0Q0RURFOTc1Q0IzQjlCRkZCMjZDNUVDMzFBNzFBQkEwOTMxQkU4OUFFRUI4MUE1MzE3MDg1NDBCN0VBMDM4NzVFNURGNDkzNUVEMDIxRjM5NTVENUM5NDFCQjY4MkRCREE1NDI1RjRFRjg0REQxRjQyQzZEQ0M1RTMxM0Q2NERFNUI2NTg2ODJBNTE3ODUxMDIzNTg3NzFEREI2QzJCODYwNzlDM0QwQTRFQjBEQTE0OUU3QjJDQUMwQUMyNTRGRkJDRDgyREYxMUQ3NEE0RTBCQkUzRkEwQUQwNjc1QjhBM0M2RTc5NEU5NDNCN0YzNzk5QkE4QzBGODBENjAyRjg1RDMwMzJEMjA2QTk2RUIxNkRBRkQyQzAzNkY4RDRGM0RBMUNDREIyMTc4RjA4QkQ4NTFEN0JCMUMyRTk2NEY0OEY5MUIyNTQ2OTE2RTc2QTgwRDhFMTZGNzAwRTFGQzE5NDMwOERENkIwQTM0ODVGCi0yMDA2MDgyNzAzNTUyNSAyIDYgMTAwIDE1MzUgMiBERjA5OTM2RDY1NjczMjVDRDRFREU5NzVDQjNCOUJGRkIyNkM1RUMzMUE3MUFCQTA5MzFCRTg5QUVFQjgxQTUzMTcwODU0MEI3RUEwMzg3NUU1REY0OTM1RUQwMjFGMzk1NUQ1Qzk0MUJCNjgyREJEQTU0MjVGNEVGODRERDFGNDJDNkRDQzVFMzEzRDY0REU1QjY1ODY4MkE1MTc4NTEwMjM1ODc3MUREQjZDMkI4NjA3OUMzRDBBNEVCMERBMTQ5RTdCMkNBQzBBQzI1NEZGQkNEODJERjExRDc0QTRFMEJCRTNGQTBBRDA2NzVCOEEzQzZFNzk0RTk0M0I3RjM3OTlCQThDMEY4MEQ2MDJGODVEMzAzMkQyMDZBOTZFQjE2REFGRDJDMDM2RjhENEYzREExQ0NEQjIxNzhGMDhCRDg1MUQ3QkIxQzJFOTY0RjQ4RjkxQjI1NDY5MTZFNzZBODBEOEUxNkY3MDBFMUZDMTk0MzA4REQ2QjBBQUYzQkIKLTIwMDYwODI3MDM1ODI5IDIgNiAxMDAgMTUzNSA1IERGMDk5MzZENjU2NzMyNUNENEVERTk3NUNCM0I5QkZGQjI2QzVFQzMxQTcxQUJBMDkzMUJFODlBRUVCODFBNTMxNzA4NTQwQjdFQTAzODc1RTVERjQ5MzVFRDAyMUYzOTU1RDVDOTQxQkI2ODJEQkRBNTQyNUY0RUY4NEREMUY0MkM2RENDNUUzMTNENjRERTVCNjU4NjgyQTUxNzg1MTAyMzU4NzcxRERCNkMyQjg2MDc5QzNEMEE0RUIwREExNDlFN0IyQ0FDMEFDMjU0RkZCQ0Q4MkRGMTFENzRBNEUwQkJFM0ZBMEFEMDY3NUI4QTNDNkU3OTRFOTQzQjdGMzc5OUJBOEMwRjgwRDYwMkY4NUQzMDMyRDIwNkE5NkVCMTZEQUZEMkMwMzZGOEQ0RjNEQTFDQ0RCMjE3OEYwOEJEODUxRDdCQjFDMkU5NjRGNDhGOTFCMjU0NjkxNkU3NkE4MEQ4RTE2RjcwMEUxRkMxOTQzMDhERDZCMENGRTA0RgotMjAwNjA4MjcwNDAxMDEgMiA2IDEwMCAxNTM1IDUgREYwOTkzNkQ2NTY3MzI1Q0Q0RURFOTc1Q0IzQjlCRkZCMjZDNUVDMzFBNzFBQkEwOTMxQkU4OUFFRUI4MUE1MzE3MDg1NDBCN0VBMDM4NzVFNURGNDkzNUVEMDIxRjM5NTVENUM5NDFCQjY4MkRCREE1NDI1RjRFRjg0REQxRjQyQzZEQ0M1RTMxM0Q2NERFNUI2NTg2ODJBNTE3ODUxMDIzNTg3NzFEREI2QzJCODYwNzlDM0QwQTRFQjBEQTE0OUU3QjJDQUMwQUMyNTRGRkJDRDgyREYxMUQ3NEE0RTBCQkUzRkEwQUQwNjc1QjhBM0M2RTc5NEU5NDNCN0YzNzk5QkE4QzBGODBENjAyRjg1RDMwMzJEMjA2QTk2RUIxNkRBRkQyQzAzNkY4RDRGM0RBMUNDREIyMTc4RjA4QkQ4NTFEN0JCMUMyRTk2NEY0OEY5MUIyNTQ2OTE2RTc2QTgwRDhFMTZGNzAwRTFGQzE5NDMwOERENkIwRTk4OEU3Ci0yMDA2MDgyNzA0MDUwNCAyIDYgMTAwIDE1MzUgMiBERjA5OTM2RDY1NjczMjVDRDRFREU5NzVDQjNCOUJGRkIyNkM1RUMzMUE3MUFCQTA5MzFCRTg5QUVFQjgxQTUzMTcwODU0MEI3RUEwMzg3NUU1REY0OTM1RUQwMjFGMzk1NUQ1Qzk0MUJCNjgyREJEQTU0MjVGNEVGODRERDFGNDJDNkRDQzVFMzEzRDY0REU1QjY1ODY4MkE1MTc4NTEwMjM1ODc3MUREQjZDMkI4NjA3OUMzRDBBNEVCMERBMTQ5RTdCMkNBQzBBQzI1NEZGQkNEODJERjExRDc0QTRFMEJCRTNGQTBBRDA2NzVCOEEzQzZFNzk0RTk0M0I3RjM3OTlCQThDMEY4MEQ2MDJGODVEMzAzMkQyMDZBOTZFQjE2REFGRDJDMDM2RjhENEYzREExQ0NEQjIxNzhGMDhCRDg1MUQ3QkIxQzJFOTY0RjQ4RjkxQjI1NDY5MTZFNzZBODBEOEUxNkY3MDBFMUZDMTk0MzA4REQ2QjExRDAwMUIKLTIwMDYwODI3MDQwNzQ2IDIgNiAxMDAgMTUzNSA1IERGMDk5MzZENjU2NzMyNUNENEVERTk3NUNCM0I5QkZGQjI2QzVFQzMxQTcxQUJBMDkzMUJFODlBRUVCODFBNTMxNzA4NTQwQjdFQTAzODc1RTVERjQ5MzVFRDAyMUYzOTU1RDVDOTQxQkI2ODJEQkRBNTQyNUY0RUY4NEREMUY0MkM2RENDNUUzMTNENjRERTVCNjU4NjgyQTUxNzg1MTAyMzU4NzcxRERCNkMyQjg2MDc5QzNEMEE0RUIwREExNDlFN0IyQ0FDMEFDMjU0RkZCQ0Q4MkRGMTFENzRBNEUwQkJFM0ZBMEFEMDY3NUI4QTNDNkU3OTRFOTQzQjdGMzc5OUJBOEMwRjgwRDYwMkY4NUQzMDMyRDIwNkE5NkVCMTZEQUZEMkMwMzZGOEQ0RjNEQTFDQ0RCMjE3OEYwOEJEODUxRDdCQjFDMkU5NjRGNDhGOTFCMjU0NjkxNkU3NkE4MEQ4RTE2RjcwMEUxRkMxOTQzMDhERDZCMTNBNDVERgotMjAwNjA4MjcwNDEzNTAgMiA2IDEwMCAxNTM1IDUgREYwOTkzNkQ2NTY3MzI1Q0Q0RURFOTc1Q0IzQjlCRkZCMjZDNUVDMzFBNzFBQkEwOTMxQkU4OUFFRUI4MUE1MzE3MDg1NDBCN0VBMDM4NzVFNURGNDkzNUVEMDIxRjM5NTVENUM5NDFCQjY4MkRCREE1NDI1RjRFRjg0REQxRjQyQzZEQ0M1RTMxM0Q2NERFNUI2NTg2ODJBNTE3ODUxMDIzNTg3NzFEREI2QzJCODYwNzlDM0QwQTRFQjBEQTE0OUU3QjJDQUMwQUMyNTRGRkJDRDgyREYxMUQ3NEE0RTBCQkUzRkEwQUQwNjc1QjhBM0M2RTc5NEU5NDNCN0YzNzk5QkE4QzBGODBENjAyRjg1RDMwMzJEMjA2QTk2RUIxNkRBRkQyQzAzNkY4RDRGM0RBMUNDREIyMTc4RjA4QkQ4NTFEN0JCMUMyRTk2NEY0OEY5MUIyNTQ2OTE2RTc2QTgwRDhFMTZGNzAwRTFGQzE5NDMwOERENkIxODhCODlGCi0yMDA2MDgyNzA0MTUxMyAyIDYgMTAwIDE1MzUgMiBERjA5OTM2RDY1NjczMjVDRDRFREU5NzVDQjNCOUJGRkIyNkM1RUMzMUE3MUFCQTA5MzFCRTg5QUVFQjgxQTUzMTcwODU0MEI3RUEwMzg3NUU1REY0OTM1RUQwMjFGMzk1NUQ1Qzk0MUJCNjgyREJEQTU0MjVGNEVGODRERDFGNDJDNkRDQzVFMzEzRDY0REU1QjY1ODY4MkE1MTc4NTEwMjM1ODc3MUREQjZDMkI4NjA3OUMzRDBBNEVCMERBMTQ5RTdCMkNBQzBBQzI1NEZGQkNEODJERjExRDc0QTRFMEJCRTNGQTBBRDA2NzVCOEEzQzZFNzk0RTk0M0I3RjM3OTlCQThDMEY4MEQ2MDJGODVEMzAzMkQyMDZBOTZFQjE2REFGRDJDMDM2RjhENEYzREExQ0NEQjIxNzhGMDhCRDg1MUQ3QkIxQzJFOTY0RjQ4RjkxQjI1NDY5MTZFNzZBODBEOEUxNkY3MDBFMUZDMTk0MzA4REQ2QjE5M0IyRUIKLTIwMDYwODI3MDQxNjIxIDIgNiAxMDAgMTUzNSA1IERGMDk5MzZENjU2NzMyNUNENEVERTk3NUNCM0I5QkZGQjI2QzVFQzMxQTcxQUJBMDkzMUJFODlBRUVCODFBNTMxNzA4NTQwQjdFQTAzODc1RTVERjQ5MzVFRDAyMUYzOTU1RDVDOTQxQkI2ODJEQkRBNTQyNUY0RUY4NEREMUY0MkM2RENDNUUzMTNENjRERTVCNjU4NjgyQTUxNzg1MTAyMzU4NzcxRERCNkMyQjg2MDc5QzNEMEE0RUIwREExNDlFN0IyQ0FDMEFDMjU0RkZCQ0Q4MkRGMTFENzRBNEUwQkJFM0ZBMEFEMDY3NUI4QTNDNkU3OTRFOTQzQjdGMzc5OUJBOEMwRjgwRDYwMkY4NUQzMDMyRDIwNkE5NkVCMTZEQUZEMkMwMzZGOEQ0RjNEQTFDQ0RCMjE3OEYwOEJEODUxRDdCQjFDMkU5NjRGNDhGOTFCMjU0NjkxNkU3NkE4MEQ4RTE2RjcwMEUxRkMxOTQzMDhERDZCMTlCOTgwNwotMjAwNjA4MjcwNDE2NTcgMiA2IDEwMCAxNTM1IDUgREYwOTkzNkQ2NTY3MzI1Q0Q0RURFOTc1Q0IzQjlCRkZCMjZDNUVDMzFBNzFBQkEwOTMxQkU4OUFFRUI4MUE1MzE3MDg1NDBCN0VBMDM4NzVFNURGNDkzNUVEMDIxRjM5NTVENUM5NDFCQjY4MkRCREE1NDI1RjRFRjg0REQxRjQyQzZEQ0M1RTMxM0Q2NERFNUI2NTg2ODJBNTE3ODUxMDIzNTg3NzFEREI2QzJCODYwNzlDM0QwQTRFQjBEQTE0OUU3QjJDQUMwQUMyNTRGRkJDRDgyREYxMUQ3NEE0RTBCQkUzRkEwQUQwNjc1QjhBM0M2RTc5NEU5NDNCN0YzNzk5QkE4QzBGODBENjAyRjg1RDMwMzJEMjA2QTk2RUIxNkRBRkQyQzAzNkY4RDRGM0RBMUNDREIyMTc4RjA4QkQ4NTFEN0JCMUMyRTk2NEY0OEY5MUIyNTQ2OTE2RTc2QTgwRDhFMTZGNzAwRTFGQzE5NDMwOERENkIxOUMwMTA3Ci0yMDA2MDgyNzA0MTgxNyAyIDYgMTAwIDE1MzUgMiBERjA5OTM2RDY1NjczMjVDRDRFREU5NzVDQjNCOUJGRkIyNkM1RUMzMUE3MUFCQTA5MzFCRTg5QUVFQjgxQTUzMTcwODU0MEI3RUEwMzg3NUU1REY0OTM1RUQwMjFGMzk1NUQ1Qzk0MUJCNjgyREJEQTU0MjVGNEVGODRERDFGNDJDNkRDQzVFMzEzRDY0REU1QjY1ODY4MkE1MTc4NTEwMjM1ODc3MUREQjZDMkI4NjA3OUMzRDBBNEVCMERBMTQ5RTdCMkNBQzBBQzI1NEZGQkNEODJERjExRDc0QTRFMEJCRTNGQTBBRDA2NzVCOEEzQzZFNzk0RTk0M0I3RjM3OTlCQThDMEY4MEQ2MDJGODVEMzAzMkQyMDZBOTZFQjE2REFGRDJDMDM2RjhENEYzREExQ0NEQjIxNzhGMDhCRDg1MUQ3QkIxQzJFOTY0RjQ4RjkxQjI1NDY5MTZFNzZBODBEOEUxNkY3MDBFMUZDMTk0MzA4REQ2QjFBNkJFNEIKLTIwMDYwODI3MDUyMTIyIDIgNiAxMDAgMjA0NyAyIEMwMzgyODJERTA2MUJFMUFEMzRGMzEzMjVFRkU5QjFEODUyMERCMTQyNzZDRUI2MUZFM0EyQ0I4RDc3RkZFM0I5QTA2NzUwNTIwNUJCQTgzNTM4NDdGRDJFQTFFMjQ3MUU0Mjk0ODYyQTVENEM0RjlBMkI4MEY5REEwNjE5MzI3Q0RCRjJFQjYwOEIwQjU1NDkyOTRBOTU1OTcyQUEzNTEyODIxQjI0NzgyREQ4QUI5N0I1M0FBQjA0QjQ4MTgwMzk0QUJGQkM0RENGOUI4MTlGQzBDQjVBQzEyNzVBQzVGMTZFQzM3ODE2MzUwMUU0QjI3RDQ5QzY3RjY2MDMzMzg4OEYxRDUwM0I5NkZBOUM2Qzg4MDU0M0Q4QjVGMDRENzBGRTUwOEZGQ0ExNjE3OThBRDMyMDE1MTQ1QjhFOUFENDNBQUI0OEFEQTgxRkQxRTVBOEVBNzcxMUE4RkY1N0VDN0M0QzA4MUI0N0ZBQjBDMkU5RkE0NjhFNzBERDY3MDBGMzQxMjIyNDg5MEQ1RTk5NTI3QTU5NkNFNjM1MTk1RjNBNkQzNUU1NjNCRjQ4OTJERjJDNzlDODA5NzA0NDExMDE4RDkxOTEwMkQxMkNCMTEyQ0UxRTY2RUJGNURCOUY0MDlGNkM4MkE2QTZFMUUyMUUyMzUzMkM3N0U4RUQzCi0yMDA2MDgyNzA1NTI0OCAyIDYgMTAwIDIwNDcgNSBDMDM4MjgyREUwNjFCRTFBRDM0RjMxMzI1RUZFOUIxRDg1MjBEQjE0Mjc2Q0VCNjFGRTNBMkNCOEQ3N0ZGRTNCOUEwNjc1MDUyMDVCQkE4MzUzODQ3RkQyRUExRTI0NzFFNDI5NDg2MkE1RDRDNEY5QTJCODBGOURBMDYxOTMyN0NEQkYyRUI2MDhCMEI1NTQ5Mjk0QTk1NTk3MkFBMzUxMjgyMUIyNDc4MkREOEFCOTdCNTNBQUIwNEI0ODE4MDM5NEFCRkJDNERDRjlCODE5RkMwQ0I1QUMxMjc1QUM1RjE2RUMzNzgxNjM1MDFFNEIyN0Q0OUM2N0Y2NjAzMzM4ODhGMUQ1MDNCOTZGQTlDNkM4ODA1NDNEOEI1RjA0RDcwRkU1MDhGRkNBMTYxNzk4QUQzMjAxNTE0NUI4RTlBRDQzQUFCNDhBREE4MUZEMUU1QThFQTc3MTFBOEZGNTdFQzdDNEMwODFCNDdGQUIwQzJFOUZBNDY4RTcwREQ2NzAwRjM0MTIyMjQ4OTBENUU5OTUyN0E1OTZDRTYzNTE5NUYzQTZEMzVFNTYzQkY0ODkyREYyQzc5QzgwOTcwNDQxMTAxOEQ5MTkxMDJEMTJDQjExMkNFMUU2NkVCRjVEQjlGNDA5RjZDODJBNkE2RTFFMjFFMjM1MzJDODU0OUMwNwotMjAwNjA4MjcwNTU0NTMgMiA2IDEwMCAyMDQ3IDUgQzAzODI4MkRFMDYxQkUxQUQzNEYzMTMyNUVGRTlCMUQ4NTIwREIxNDI3NkNFQjYxRkUzQTJDQjhENzdGRkUzQjlBMDY3NTA1MjA1QkJBODM1Mzg0N0ZEMkVBMUUyNDcxRTQyOTQ4NjJBNUQ0QzRGOUEyQjgwRjlEQTA2MTkzMjdDREJGMkVCNjA4QjBCNTU0OTI5NEE5NTU5NzJBQTM1MTI4MjFCMjQ3ODJERDhBQjk3QjUzQUFCMDRCNDgxODAzOTRBQkZCQzREQ0Y5QjgxOUZDMENCNUFDMTI3NUFDNUYxNkVDMzc4MTYzNTAxRTRCMjdENDlDNjdGNjYwMzMzODg4RjFENTAzQjk2RkE5QzZDODgwNTQzRDhCNUYwNEQ3MEZFNTA4RkZDQTE2MTc5OEFEMzIwMTUxNDVCOEU5QUQ0M0FBQjQ4QURBODFGRDFFNUE4RUE3NzExQThGRjU3RUM3QzRDMDgxQjQ3RkFCMEMyRTlGQTQ2OEU3MERENjcwMEYzNDEyMjI0ODkwRDVFOTk1MjdBNTk2Q0U2MzUxOTVGM0E2RDM1RTU2M0JGNDg5MkRGMkM3OUM4MDk3MDQ0MTEwMThEOTE5MTAyRDEyQ0IxMTJDRTFFNjZFQkY1REI5RjQwOUY2QzgyQTZBNkUxRTIxRTIzNTMyQzg1QjE3REYKLTIwMDYwODI3MDYwNDU2IDIgNiAxMDAgMjA0NyA1IEMwMzgyODJERTA2MUJFMUFEMzRGMzEzMjVFRkU5QjFEODUyMERCMTQyNzZDRUI2MUZFM0EyQ0I4RDc3RkZFM0I5QTA2NzUwNTIwNUJCQTgzNTM4NDdGRDJFQTFFMjQ3MUU0Mjk0ODYyQTVENEM0RjlBMkI4MEY5REEwNjE5MzI3Q0RCRjJFQjYwOEIwQjU1NDkyOTRBOTU1OTcyQUEzNTEyODIxQjI0NzgyREQ4QUI5N0I1M0FBQjA0QjQ4MTgwMzk0QUJGQkM0RENGOUI4MTlGQzBDQjVBQzEyNzVBQzVGMTZFQzM3ODE2MzUwMUU0QjI3RDQ5QzY3RjY2MDMzMzg4OEYxRDUwM0I5NkZBOUM2Qzg4MDU0M0Q4QjVGMDRENzBGRTUwOEZGQ0ExNjE3OThBRDMyMDE1MTQ1QjhFOUFENDNBQUI0OEFEQTgxRkQxRTVBOEVBNzcxMUE4RkY1N0VDN0M0QzA4MUI0N0ZBQjBDMkU5RkE0NjhFNzBERDY3MDBGMzQxMjIyNDg5MEQ1RTk5NTI3QTU5NkNFNjM1MTk1RjNBNkQzNUU1NjNCRjQ4OTJERjJDNzlDODA5NzA0NDExMDE4RDkxOTEwMkQxMkNCMTEyQ0UxRTY2RUJGNURCOUY0MDlGNkM4MkE2QTZFMUUyMUUyMzUzMkM4OTlCQkU3Ci0yMDA2MDgyNzA2MTIwMyAyIDYgMTAwIDIwNDcgMiBDMDM4MjgyREUwNjFCRTFBRDM0RjMxMzI1RUZFOUIxRDg1MjBEQjE0Mjc2Q0VCNjFGRTNBMkNCOEQ3N0ZGRTNCOUEwNjc1MDUyMDVCQkE4MzUzODQ3RkQyRUExRTI0NzFFNDI5NDg2MkE1RDRDNEY5QTJCODBGOURBMDYxOTMyN0NEQkYyRUI2MDhCMEI1NTQ5Mjk0QTk1NTk3MkFBMzUxMjgyMUIyNDc4MkREOEFCOTdCNTNBQUIwNEI0ODE4MDM5NEFCRkJDNERDRjlCODE5RkMwQ0I1QUMxMjc1QUM1RjE2RUMzNzgxNjM1MDFFNEIyN0Q0OUM2N0Y2NjAzMzM4ODhGMUQ1MDNCOTZGQTlDNkM4ODA1NDNEOEI1RjA0RDcwRkU1MDhGRkNBMTYxNzk4QUQzMjAxNTE0NUI4RTlBRDQzQUFCNDhBREE4MUZEMUU1QThFQTc3MTFBOEZGNTdFQzdDNEMwODFCNDdGQUIwQzJFOUZBNDY4RTcwREQ2NzAwRjM0MTIyMjQ4OTBENUU5OTUyN0E1OTZDRTYzNTE5NUYzQTZEMzVFNTYzQkY0ODkyREYyQzc5QzgwOTcwNDQxMTAxOEQ5MTkxMDJEMTJDQjExMkNFMUU2NkVCRjVEQjlGNDA5RjZDODJBNkE2RTFFMjFFMjM1MzJDOEMzNjJCMwotMjAwNjA4MjcwNjE0MzMgMiA2IDEwMCAyMDQ3IDUgQzAzODI4MkRFMDYxQkUxQUQzNEYzMTMyNUVGRTlCMUQ4NTIwREIxNDI3NkNFQjYxRkUzQTJDQjhENzdGRkUzQjlBMDY3NTA1MjA1QkJBODM1Mzg0N0ZEMkVBMUUyNDcxRTQyOTQ4NjJBNUQ0QzRGOUEyQjgwRjlEQTA2MTkzMjdDREJGMkVCNjA4QjBCNTU0OTI5NEE5NTU5NzJBQTM1MTI4MjFCMjQ3ODJERDhBQjk3QjUzQUFCMDRCNDgxODAzOTRBQkZCQzREQ0Y5QjgxOUZDMENCNUFDMTI3NUFDNUYxNkVDMzc4MTYzNTAxRTRCMjdENDlDNjdGNjYwMzMzODg4RjFENTAzQjk2RkE5QzZDODgwNTQzRDhCNUYwNEQ3MEZFNTA4RkZDQTE2MTc5OEFEMzIwMTUxNDVCOEU5QUQ0M0FBQjQ4QURBODFGRDFFNUE4RUE3NzExQThGRjU3RUM3QzRDMDgxQjQ3RkFCMEMyRTlGQTQ2OEU3MERENjcwMEYzNDEyMjI0ODkwRDVFOTk1MjdBNTk2Q0U2MzUxOTVGM0E2RDM1RTU2M0JGNDg5MkRGMkM3OUM4MDk3MDQ0MTEwMThEOTE5MTAyRDEyQ0IxMTJDRTFFNjZFQkY1REI5RjQwOUY2QzgyQTZBNkUxRTIxRTIzNTMyQzhDQzY5RjcKLTIwMDYwODI3MDYxOTA0IDIgNiAxMDAgMjA0NyA1IEMwMzgyODJERTA2MUJFMUFEMzRGMzEzMjVFRkU5QjFEODUyMERCMTQyNzZDRUI2MUZFM0EyQ0I4RDc3RkZFM0I5QTA2NzUwNTIwNUJCQTgzNTM4NDdGRDJFQTFFMjQ3MUU0Mjk0ODYyQTVENEM0RjlBMkI4MEY5REEwNjE5MzI3Q0RCRjJFQjYwOEIwQjU1NDkyOTRBOTU1OTcyQUEzNTEyODIxQjI0NzgyREQ4QUI5N0I1M0FBQjA0QjQ4MTgwMzk0QUJGQkM0RENGOUI4MTlGQzBDQjVBQzEyNzVBQzVGMTZFQzM3ODE2MzUwMUU0QjI3RDQ5QzY3RjY2MDMzMzg4OEYxRDUwM0I5NkZBOUM2Qzg4MDU0M0Q4QjVGMDRENzBGRTUwOEZGQ0ExNjE3OThBRDMyMDE1MTQ1QjhFOUFENDNBQUI0OEFEQTgxRkQxRTVBOEVBNzcxMUE4RkY1N0VDN0M0QzA4MUI0N0ZBQjBDMkU5RkE0NjhFNzBERDY3MDBGMzQxMjIyNDg5MEQ1RTk5NTI3QTU5NkNFNjM1MTk1RjNBNkQzNUU1NjNCRjQ4OTJERjJDNzlDODA5NzA0NDExMDE4RDkxOTEwMkQxMkNCMTEyQ0UxRTY2RUJGNURCOUY0MDlGNkM4MkE2QTZFMUUyMUUyMzUzMkM4RTQ0QkM3Ci0yMDA2MDgyNzA2MjI1NSAyIDYgMTAwIDIwNDcgNSBDMDM4MjgyREUwNjFCRTFBRDM0RjMxMzI1RUZFOUIxRDg1MjBEQjE0Mjc2Q0VCNjFGRTNBMkNCOEQ3N0ZGRTNCOUEwNjc1MDUyMDVCQkE4MzUzODQ3RkQyRUExRTI0NzFFNDI5NDg2MkE1RDRDNEY5QTJCODBGOURBMDYxOTMyN0NEQkYyRUI2MDhCMEI1NTQ5Mjk0QTk1NTk3MkFBMzUxMjgyMUIyNDc4MkREOEFCOTdCNTNBQUIwNEI0ODE4MDM5NEFCRkJDNERDRjlCODE5RkMwQ0I1QUMxMjc1QUM1RjE2RUMzNzgxNjM1MDFFNEIyN0Q0OUM2N0Y2NjAzMzM4ODhGMUQ1MDNCOTZGQTlDNkM4ODA1NDNEOEI1RjA0RDcwRkU1MDhGRkNBMTYxNzk4QUQzMjAxNTE0NUI4RTlBRDQzQUFCNDhBREE4MUZEMUU1QThFQTc3MTFBOEZGNTdFQzdDNEMwODFCNDdGQUIwQzJFOUZBNDY4RTcwREQ2NzAwRjM0MTIyMjQ4OTBENUU5OTUyN0E1OTZDRTYzNTE5NUYzQTZEMzVFNTYzQkY0ODkyREYyQzc5QzgwOTcwNDQxMTAxOEQ5MTkxMDJEMTJDQjExMkNFMUU2NkVCRjVEQjlGNDA5RjZDODJBNkE2RTFFMjFFMjM1MzJDOEY2QjIzRgotMjAwNjA4MjcwNjMwNTIgMiA2IDEwMCAyMDQ3IDUgQzAzODI4MkRFMDYxQkUxQUQzNEYzMTMyNUVGRTlCMUQ4NTIwREIxNDI3NkNFQjYxRkUzQTJDQjhENzdGRkUzQjlBMDY3NTA1MjA1QkJBODM1Mzg0N0ZEMkVBMUUyNDcxRTQyOTQ4NjJBNUQ0QzRGOUEyQjgwRjlEQTA2MTkzMjdDREJGMkVCNjA4QjBCNTU0OTI5NEE5NTU5NzJBQTM1MTI4MjFCMjQ3ODJERDhBQjk3QjUzQUFCMDRCNDgxODAzOTRBQkZCQzREQ0Y5QjgxOUZDMENCNUFDMTI3NUFDNUYxNkVDMzc4MTYzNTAxRTRCMjdENDlDNjdGNjYwMzMzODg4RjFENTAzQjk2RkE5QzZDODgwNTQzRDhCNUYwNEQ3MEZFNTA4RkZDQTE2MTc5OEFEMzIwMTUxNDVCOEU5QUQ0M0FBQjQ4QURBODFGRDFFNUE4RUE3NzExQThGRjU3RUM3QzRDMDgxQjQ3RkFCMEMyRTlGQTQ2OEU3MERENjcwMEYzNDEyMjI0ODkwRDVFOTk1MjdBNTk2Q0U2MzUxOTVGM0E2RDM1RTU2M0JGNDg5MkRGMkM3OUM4MDk3MDQ0MTEwMThEOTE5MTAyRDEyQ0IxMTJDRTFFNjZFQkY1REI5RjQwOUY2QzgyQTZBNkUxRTIxRTIzNTMyQzkyNkM4MTcKLTIwMDYwODI3MDYzMzU0IDIgNiAxMDAgMjA0NyA1IEMwMzgyODJERTA2MUJFMUFEMzRGMzEzMjVFRkU5QjFEODUyMERCMTQyNzZDRUI2MUZFM0EyQ0I4RDc3RkZFM0I5QTA2NzUwNTIwNUJCQTgzNTM4NDdGRDJFQTFFMjQ3MUU0Mjk0ODYyQTVENEM0RjlBMkI4MEY5REEwNjE5MzI3Q0RCRjJFQjYwOEIwQjU1NDkyOTRBOTU1OTcyQUEzNTEyODIxQjI0NzgyREQ4QUI5N0I1M0FBQjA0QjQ4MTgwMzk0QUJGQkM0RENGOUI4MTlGQzBDQjVBQzEyNzVBQzVGMTZFQzM3ODE2MzUwMUU0QjI3RDQ5QzY3RjY2MDMzMzg4OEYxRDUwM0I5NkZBOUM2Qzg4MDU0M0Q4QjVGMDRENzBGRTUwOEZGQ0ExNjE3OThBRDMyMDE1MTQ1QjhFOUFENDNBQUI0OEFEQTgxRkQxRTVBOEVBNzcxMUE4RkY1N0VDN0M0QzA4MUI0N0ZBQjBDMkU5RkE0NjhFNzBERDY3MDBGMzQxMjIyNDg5MEQ1RTk5NTI3QTU5NkNFNjM1MTk1RjNBNkQzNUU1NjNCRjQ4OTJERjJDNzlDODA5NzA0NDExMDE4RDkxOTEwMkQxMkNCMTEyQ0UxRTY2RUJGNURCOUY0MDlGNkM4MkE2QTZFMUUyMUUyMzUzMkM5MzUxQUJGCi0yMDA2MDgyNzA2MzkyNSAyIDYgMTAwIDIwNDcgMiBDMDM4MjgyREUwNjFCRTFBRDM0RjMxMzI1RUZFOUIxRDg1MjBEQjE0Mjc2Q0VCNjFGRTNBMkNCOEQ3N0ZGRTNCOUEwNjc1MDUyMDVCQkE4MzUzODQ3RkQyRUExRTI0NzFFNDI5NDg2MkE1RDRDNEY5QTJCODBGOURBMDYxOTMyN0NEQkYyRUI2MDhCMEI1NTQ5Mjk0QTk1NTk3MkFBMzUxMjgyMUIyNDc4MkREOEFCOTdCNTNBQUIwNEI0ODE4MDM5NEFCRkJDNERDRjlCODE5RkMwQ0I1QUMxMjc1QUM1RjE2RUMzNzgxNjM1MDFFNEIyN0Q0OUM2N0Y2NjAzMzM4ODhGMUQ1MDNCOTZGQTlDNkM4ODA1NDNEOEI1RjA0RDcwRkU1MDhGRkNBMTYxNzk4QUQzMjAxNTE0NUI4RTlBRDQzQUFCNDhBREE4MUZEMUU1QThFQTc3MTFBOEZGNTdFQzdDNEMwODFCNDdGQUIwQzJFOUZBNDY4RTcwREQ2NzAwRjM0MTIyMjQ4OTBENUU5OTUyN0E1OTZDRTYzNTE5NUYzQTZEMzVFNTYzQkY0ODkyREYyQzc5QzgwOTcwNDQxMTAxOEQ5MTkxMDJEMTJDQjExMkNFMUU2NkVCRjVEQjlGNDA5RjZDODJBNkE2RTFFMjFFMjM1MzJDOTU0MUE0MwotMjAwNjA4MjcwNjQ5MDQgMiA2IDEwMCAyMDQ3IDUgQzAzODI4MkRFMDYxQkUxQUQzNEYzMTMyNUVGRTlCMUQ4NTIwREIxNDI3NkNFQjYxRkUzQTJDQjhENzdGRkUzQjlBMDY3NTA1MjA1QkJBODM1Mzg0N0ZEMkVBMUUyNDcxRTQyOTQ4NjJBNUQ0QzRGOUEyQjgwRjlEQTA2MTkzMjdDREJGMkVCNjA4QjBCNTU0OTI5NEE5NTU5NzJBQTM1MTI4MjFCMjQ3ODJERDhBQjk3QjUzQUFCMDRCNDgxODAzOTRBQkZCQzREQ0Y5QjgxOUZDMENCNUFDMTI3NUFDNUYxNkVDMzc4MTYzNTAxRTRCMjdENDlDNjdGNjYwMzMzODg4RjFENTAzQjk2RkE5QzZDODgwNTQzRDhCNUYwNEQ3MEZFNTA4RkZDQTE2MTc5OEFEMzIwMTUxNDVCOEU5QUQ0M0FBQjQ4QURBODFGRDFFNUE4RUE3NzExQThGRjU3RUM3QzRDMDgxQjQ3RkFCMEMyRTlGQTQ2OEU3MERENjcwMEYzNDEyMjI0ODkwRDVFOTk1MjdBNTk2Q0U2MzUxOTVGM0E2RDM1RTU2M0JGNDg5MkRGMkM3OUM4MDk3MDQ0MTEwMThEOTE5MTAyRDEyQ0IxMTJDRTFFNjZFQkY1REI5RjQwOUY2QzgyQTZBNkUxRTIxRTIzNTMyQzk4Q0ZBRTcKLTIwMDYwODI3MDcwMzE0IDIgNiAxMDAgMjA0NyAyIEMwMzgyODJERTA2MUJFMUFEMzRGMzEzMjVFRkU5QjFEODUyMERCMTQyNzZDRUI2MUZFM0EyQ0I4RDc3RkZFM0I5QTA2NzUwNTIwNUJCQTgzNTM4NDdGRDJFQTFFMjQ3MUU0Mjk0ODYyQTVENEM0RjlBMkI4MEY5REEwNjE5MzI3Q0RCRjJFQjYwOEIwQjU1NDkyOTRBOTU1OTcyQUEzNTEyODIxQjI0NzgyREQ4QUI5N0I1M0FBQjA0QjQ4MTgwMzk0QUJGQkM0RENGOUI4MTlGQzBDQjVBQzEyNzVBQzVGMTZFQzM3ODE2MzUwMUU0QjI3RDQ5QzY3RjY2MDMzMzg4OEYxRDUwM0I5NkZBOUM2Qzg4MDU0M0Q4QjVGMDRENzBGRTUwOEZGQ0ExNjE3OThBRDMyMDE1MTQ1QjhFOUFENDNBQUI0OEFEQTgxRkQxRTVBOEVBNzcxMUE4RkY1N0VDN0M0QzA4MUI0N0ZBQjBDMkU5RkE0NjhFNzBERDY3MDBGMzQxMjIyNDg5MEQ1RTk5NTI3QTU5NkNFNjM1MTk1RjNBNkQzNUU1NjNCRjQ4OTJERjJDNzlDODA5NzA0NDExMDE4RDkxOTEwMkQxMkNCMTEyQ0UxRTY2RUJGNURCOUY0MDlGNkM4MkE2QTZFMUUyMUUyMzUzMkM5RTMwODIzCi0yMDA2MDgyNzA3MDgwNiAyIDYgMTAwIDIwNDcgMiBDMDM4MjgyREUwNjFCRTFBRDM0RjMxMzI1RUZFOUIxRDg1MjBEQjE0Mjc2Q0VCNjFGRTNBMkNCOEQ3N0ZGRTNCOUEwNjc1MDUyMDVCQkE4MzUzODQ3RkQyRUExRTI0NzFFNDI5NDg2MkE1RDRDNEY5QTJCODBGOURBMDYxOTMyN0NEQkYyRUI2MDhCMEI1NTQ5Mjk0QTk1NTk3MkFBMzUxMjgyMUIyNDc4MkREOEFCOTdCNTNBQUIwNEI0ODE4MDM5NEFCRkJDNERDRjlCODE5RkMwQ0I1QUMxMjc1QUM1RjE2RUMzNzgxNjM1MDFFNEIyN0Q0OUM2N0Y2NjAzMzM4ODhGMUQ1MDNCOTZGQTlDNkM4ODA1NDNEOEI1RjA0RDcwRkU1MDhGRkNBMTYxNzk4QUQzMjAxNTE0NUI4RTlBRDQzQUFCNDhBREE4MUZEMUU1QThFQTc3MTFBOEZGNTdFQzdDNEMwODFCNDdGQUIwQzJFOUZBNDY4RTcwREQ2NzAwRjM0MTIyMjQ4OTBENUU5OTUyN0E1OTZDRTYzNTE5NUYzQTZEMzVFNTYzQkY0ODkyREYyQzc5QzgwOTcwNDQxMTAxOEQ5MTkxMDJEMTJDQjExMkNFMUU2NkVCRjVEQjlGNDA5RjZDODJBNkE2RTFFMjFFMjM1MzJDOUY5MEMzMwotMjAwNjA4MjcwNzExMTkgMiA2IDEwMCAyMDQ3IDUgQzAzODI4MkRFMDYxQkUxQUQzNEYzMTMyNUVGRTlCMUQ4NTIwREIxNDI3NkNFQjYxRkUzQTJDQjhENzdGRkUzQjlBMDY3NTA1MjA1QkJBODM1Mzg0N0ZEMkVBMUUyNDcxRTQyOTQ4NjJBNUQ0QzRGOUEyQjgwRjlEQTA2MTkzMjdDREJGMkVCNjA4QjBCNTU0OTI5NEE5NTU5NzJBQTM1MTI4MjFCMjQ3ODJERDhBQjk3QjUzQUFCMDRCNDgxODAzOTRBQkZCQzREQ0Y5QjgxOUZDMENCNUFDMTI3NUFDNUYxNkVDMzc4MTYzNTAxRTRCMjdENDlDNjdGNjYwMzMzODg4RjFENTAzQjk2RkE5QzZDODgwNTQzRDhCNUYwNEQ3MEZFNTA4RkZDQTE2MTc5OEFEMzIwMTUxNDVCOEU5QUQ0M0FBQjQ4QURBODFGRDFFNUE4RUE3NzExQThGRjU3RUM3QzRDMDgxQjQ3RkFCMEMyRTlGQTQ2OEU3MERENjcwMEYzNDEyMjI0ODkwRDVFOTk1MjdBNTk2Q0U2MzUxOTVGM0E2RDM1RTU2M0JGNDg5MkRGMkM3OUM4MDk3MDQ0MTEwMThEOTE5MTAyRDEyQ0IxMTJDRTFFNjZFQkY1REI5RjQwOUY2QzgyQTZBNkUxRTIxRTIzNTMyQ0EwNEQ0NzcKLTIwMDYwODI3MDcyNTM0IDIgNiAxMDAgMjA0NyAyIEMwMzgyODJERTA2MUJFMUFEMzRGMzEzMjVFRkU5QjFEODUyMERCMTQyNzZDRUI2MUZFM0EyQ0I4RDc3RkZFM0I5QTA2NzUwNTIwNUJCQTgzNTM4NDdGRDJFQTFFMjQ3MUU0Mjk0ODYyQTVENEM0RjlBMkI4MEY5REEwNjE5MzI3Q0RCRjJFQjYwOEIwQjU1NDkyOTRBOTU1OTcyQUEzNTEyODIxQjI0NzgyREQ4QUI5N0I1M0FBQjA0QjQ4MTgwMzk0QUJGQkM0RENGOUI4MTlGQzBDQjVBQzEyNzVBQzVGMTZFQzM3ODE2MzUwMUU0QjI3RDQ5QzY3RjY2MDMzMzg4OEYxRDUwM0I5NkZBOUM2Qzg4MDU0M0Q4QjVGMDRENzBGRTUwOEZGQ0ExNjE3OThBRDMyMDE1MTQ1QjhFOUFENDNBQUI0OEFEQTgxRkQxRTVBOEVBNzcxMUE4RkY1N0VDN0M0QzA4MUI0N0ZBQjBDMkU5RkE0NjhFNzBERDY3MDBGMzQxMjIyNDg5MEQ1RTk5NTI3QTU5NkNFNjM1MTk1RjNBNkQzNUU1NjNCRjQ4OTJERjJDNzlDODA5NzA0NDExMDE4RDkxOTEwMkQxMkNCMTEyQ0UxRTY2RUJGNURCOUY0MDlGNkM4MkE2QTZFMUUyMUUyMzUzMkNBNUExQURCCi0yMDA2MDgyNzA3MzIxMiAyIDYgMTAwIDIwNDcgMiBDMDM4MjgyREUwNjFCRTFBRDM0RjMxMzI1RUZFOUIxRDg1MjBEQjE0Mjc2Q0VCNjFGRTNBMkNCOEQ3N0ZGRTNCOUEwNjc1MDUyMDVCQkE4MzUzODQ3RkQyRUExRTI0NzFFNDI5NDg2MkE1RDRDNEY5QTJCODBGOURBMDYxOTMyN0NEQkYyRUI2MDhCMEI1NTQ5Mjk0QTk1NTk3MkFBMzUxMjgyMUIyNDc4MkREOEFCOTdCNTNBQUIwNEI0ODE4MDM5NEFCRkJDNERDRjlCODE5RkMwQ0I1QUMxMjc1QUM1RjE2RUMzNzgxNjM1MDFFNEIyN0Q0OUM2N0Y2NjAzMzM4ODhGMUQ1MDNCOTZGQTlDNkM4ODA1NDNEOEI1RjA0RDcwRkU1MDhGRkNBMTYxNzk4QUQzMjAxNTE0NUI4RTlBRDQzQUFCNDhBREE4MUZEMUU1QThFQTc3MTFBOEZGNTdFQzdDNEMwODFCNDdGQUIwQzJFOUZBNDY4RTcwREQ2NzAwRjM0MTIyMjQ4OTBENUU5OTUyN0E1OTZDRTYzNTE5NUYzQTZEMzVFNTYzQkY0ODkyREYyQzc5QzgwOTcwNDQxMTAxOEQ5MTkxMDJEMTJDQjExMkNFMUU2NkVCRjVEQjlGNDA5RjZDODJBNkE2RTFFMjFFMjM1MzJDQTdFODhBMwotMjAwNjA4MjcwNzM2NDEgMiA2IDEwMCAyMDQ3IDIgQzAzODI4MkRFMDYxQkUxQUQzNEYzMTMyNUVGRTlCMUQ4NTIwREIxNDI3NkNFQjYxRkUzQTJDQjhENzdGRkUzQjlBMDY3NTA1MjA1QkJBODM1Mzg0N0ZEMkVBMUUyNDcxRTQyOTQ4NjJBNUQ0QzRGOUEyQjgwRjlEQTA2MTkzMjdDREJGMkVCNjA4QjBCNTU0OTI5NEE5NTU5NzJBQTM1MTI4MjFCMjQ3ODJERDhBQjk3QjUzQUFCMDRCNDgxODAzOTRBQkZCQzREQ0Y5QjgxOUZDMENCNUFDMTI3NUFDNUYxNkVDMzc4MTYzNTAxRTRCMjdENDlDNjdGNjYwMzMzODg4RjFENTAzQjk2RkE5QzZDODgwNTQzRDhCNUYwNEQ3MEZFNTA4RkZDQTE2MTc5OEFEMzIwMTUxNDVCOEU5QUQ0M0FBQjQ4QURBODFGRDFFNUE4RUE3NzExQThGRjU3RUM3QzRDMDgxQjQ3RkFCMEMyRTlGQTQ2OEU3MERENjcwMEYzNDEyMjI0ODkwRDVFOTk1MjdBNTk2Q0U2MzUxOTVGM0E2RDM1RTU2M0JGNDg5MkRGMkM3OUM4MDk3MDQ0MTEwMThEOTE5MTAyRDEyQ0IxMTJDRTFFNjZFQkY1REI5RjQwOUY2QzgyQTZBNkUxRTIxRTIzNTMyQ0E5M0ExOTMKLTIwMDYwODI3MDczODUwIDIgNiAxMDAgMjA0NyA1IEMwMzgyODJERTA2MUJFMUFEMzRGMzEzMjVFRkU5QjFEODUyMERCMTQyNzZDRUI2MUZFM0EyQ0I4RDc3RkZFM0I5QTA2NzUwNTIwNUJCQTgzNTM4NDdGRDJFQTFFMjQ3MUU0Mjk0ODYyQTVENEM0RjlBMkI4MEY5REEwNjE5MzI3Q0RCRjJFQjYwOEIwQjU1NDkyOTRBOTU1OTcyQUEzNTEyODIxQjI0NzgyREQ4QUI5N0I1M0FBQjA0QjQ4MTgwMzk0QUJGQkM0RENGOUI4MTlGQzBDQjVBQzEyNzVBQzVGMTZFQzM3ODE2MzUwMUU0QjI3RDQ5QzY3RjY2MDMzMzg4OEYxRDUwM0I5NkZBOUM2Qzg4MDU0M0Q4QjVGMDRENzBGRTUwOEZGQ0ExNjE3OThBRDMyMDE1MTQ1QjhFOUFENDNBQUI0OEFEQTgxRkQxRTVBOEVBNzcxMUE4RkY1N0VDN0M0QzA4MUI0N0ZBQjBDMkU5RkE0NjhFNzBERDY3MDBGMzQxMjIyNDg5MEQ1RTk5NTI3QTU5NkNFNjM1MTk1RjNBNkQzNUU1NjNCRjQ4OTJERjJDNzlDODA5NzA0NDExMDE4RDkxOTEwMkQxMkNCMTEyQ0UxRTY2RUJGNURCOUY0MDlGNkM4MkE2QTZFMUUyMUUyMzUzMkNBOTk5QjU3Ci0yMDA2MDgyNzA4MDA0MCAyIDYgMTAwIDIwNDcgNSBDMDM4MjgyREUwNjFCRTFBRDM0RjMxMzI1RUZFOUIxRDg1MjBEQjE0Mjc2Q0VCNjFGRTNBMkNCOEQ3N0ZGRTNCOUEwNjc1MDUyMDVCQkE4MzUzODQ3RkQyRUExRTI0NzFFNDI5NDg2MkE1RDRDNEY5QTJCODBGOURBMDYxOTMyN0NEQkYyRUI2MDhCMEI1NTQ5Mjk0QTk1NTk3MkFBMzUxMjgyMUIyNDc4MkREOEFCOTdCNTNBQUIwNEI0ODE4MDM5NEFCRkJDNERDRjlCODE5RkMwQ0I1QUMxMjc1QUM1RjE2RUMzNzgxNjM1MDFFNEIyN0Q0OUM2N0Y2NjAzMzM4ODhGMUQ1MDNCOTZGQTlDNkM4ODA1NDNEOEI1RjA0RDcwRkU1MDhGRkNBMTYxNzk4QUQzMjAxNTE0NUI4RTlBRDQzQUFCNDhBREE4MUZEMUU1QThFQTc3MTFBOEZGNTdFQzdDNEMwODFCNDdGQUIwQzJFOUZBNDY4RTcwREQ2NzAwRjM0MTIyMjQ4OTBENUU5OTUyN0E1OTZDRTYzNTE5NUYzQTZEMzVFNTYzQkY0ODkyREYyQzc5QzgwOTcwNDQxMTAxOEQ5MTkxMDJEMTJDQjExMkNFMUU2NkVCRjVEQjlGNDA5RjZDODJBNkE2RTFFMjFFMjM1MzJDQjIxNTA1RgotMjAwNjA4MjcwODA4MTcgMiA2IDEwMCAyMDQ3IDUgQzAzODI4MkRFMDYxQkUxQUQzNEYzMTMyNUVGRTlCMUQ4NTIwREIxNDI3NkNFQjYxRkUzQTJDQjhENzdGRkUzQjlBMDY3NTA1MjA1QkJBODM1Mzg0N0ZEMkVBMUUyNDcxRTQyOTQ4NjJBNUQ0QzRGOUEyQjgwRjlEQTA2MTkzMjdDREJGMkVCNjA4QjBCNTU0OTI5NEE5NTU5NzJBQTM1MTI4MjFCMjQ3ODJERDhBQjk3QjUzQUFCMDRCNDgxODAzOTRBQkZCQzREQ0Y5QjgxOUZDMENCNUFDMTI3NUFDNUYxNkVDMzc4MTYzNTAxRTRCMjdENDlDNjdGNjYwMzMzODg4RjFENTAzQjk2RkE5QzZDODgwNTQzRDhCNUYwNEQ3MEZFNTA4RkZDQTE2MTc5OEFEMzIwMTUxNDVCOEU5QUQ0M0FBQjQ4QURBODFGRDFFNUE4RUE3NzExQThGRjU3RUM3QzRDMDgxQjQ3RkFCMEMyRTlGQTQ2OEU3MERENjcwMEYzNDEyMjI0ODkwRDVFOTk1MjdBNTk2Q0U2MzUxOTVGM0E2RDM1RTU2M0JGNDg5MkRGMkM3OUM4MDk3MDQ0MTEwMThEOTE5MTAyRDEyQ0IxMTJDRTFFNjZFQkY1REI5RjQwOUY2QzgyQTZBNkUxRTIxRTIzNTMyQ0I0QzJGOTcKLTIwMDYwODI3MDgzNzExIDIgNiAxMDAgMjA0NyA1IEMwMzgyODJERTA2MUJFMUFEMzRGMzEzMjVFRkU5QjFEODUyMERCMTQyNzZDRUI2MUZFM0EyQ0I4RDc3RkZFM0I5QTA2NzUwNTIwNUJCQTgzNTM4NDdGRDJFQTFFMjQ3MUU0Mjk0ODYyQTVENEM0RjlBMkI4MEY5REEwNjE5MzI3Q0RCRjJFQjYwOEIwQjU1NDkyOTRBOTU1OTcyQUEzNTEyODIxQjI0NzgyREQ4QUI5N0I1M0FBQjA0QjQ4MTgwMzk0QUJGQkM0RENGOUI4MTlGQzBDQjVBQzEyNzVBQzVGMTZFQzM3ODE2MzUwMUU0QjI3RDQ5QzY3RjY2MDMzMzg4OEYxRDUwM0I5NkZBOUM2Qzg4MDU0M0Q4QjVGMDRENzBGRTUwOEZGQ0ExNjE3OThBRDMyMDE1MTQ1QjhFOUFENDNBQUI0OEFEQTgxRkQxRTVBOEVBNzcxMUE4RkY1N0VDN0M0QzA4MUI0N0ZBQjBDMkU5RkE0NjhFNzBERDY3MDBGMzQxMjIyNDg5MEQ1RTk5NTI3QTU5NkNFNjM1MTk1RjNBNkQzNUU1NjNCRjQ4OTJERjJDNzlDODA5NzA0NDExMDE4RDkxOTEwMkQxMkNCMTEyQ0UxRTY2RUJGNURCOUY0MDlGNkM4MkE2QTZFMUUyMUUyMzUzMkNDMEZBQTdGCi0yMDA2MDgyNzA4NDMwOCAyIDYgMTAwIDIwNDcgMiBDMDM4MjgyREUwNjFCRTFBRDM0RjMxMzI1RUZFOUIxRDg1MjBEQjE0Mjc2Q0VCNjFGRTNBMkNCOEQ3N0ZGRTNCOUEwNjc1MDUyMDVCQkE4MzUzODQ3RkQyRUExRTI0NzFFNDI5NDg2MkE1RDRDNEY5QTJCODBGOURBMDYxOTMyN0NEQkYyRUI2MDhCMEI1NTQ5Mjk0QTk1NTk3MkFBMzUxMjgyMUIyNDc4MkREOEFCOTdCNTNBQUIwNEI0ODE4MDM5NEFCRkJDNERDRjlCODE5RkMwQ0I1QUMxMjc1QUM1RjE2RUMzNzgxNjM1MDFFNEIyN0Q0OUM2N0Y2NjAzMzM4ODhGMUQ1MDNCOTZGQTlDNkM4ODA1NDNEOEI1RjA0RDcwRkU1MDhGRkNBMTYxNzk4QUQzMjAxNTE0NUI4RTlBRDQzQUFCNDhBREE4MUZEMUU1QThFQTc3MTFBOEZGNTdFQzdDNEMwODFCNDdGQUIwQzJFOUZBNDY4RTcwREQ2NzAwRjM0MTIyMjQ4OTBENUU5OTUyN0E1OTZDRTYzNTE5NUYzQTZEMzVFNTYzQkY0ODkyREYyQzc5QzgwOTcwNDQxMTAxOEQ5MTkxMDJEMTJDQjExMkNFMUU2NkVCRjVEQjlGNDA5RjZDODJBNkE2RTFFMjFFMjM1MzJDQzMwRkQ4MwotMjAwNjA4MjcwODQ4MzAgMiA2IDEwMCAyMDQ3IDUgQzAzODI4MkRFMDYxQkUxQUQzNEYzMTMyNUVGRTlCMUQ4NTIwREIxNDI3NkNFQjYxRkUzQTJDQjhENzdGRkUzQjlBMDY3NTA1MjA1QkJBODM1Mzg0N0ZEMkVBMUUyNDcxRTQyOTQ4NjJBNUQ0QzRGOUEyQjgwRjlEQTA2MTkzMjdDREJGMkVCNjA4QjBCNTU0OTI5NEE5NTU5NzJBQTM1MTI4MjFCMjQ3ODJERDhBQjk3QjUzQUFCMDRCNDgxODAzOTRBQkZCQzREQ0Y5QjgxOUZDMENCNUFDMTI3NUFDNUYxNkVDMzc4MTYzNTAxRTRCMjdENDlDNjdGNjYwMzMzODg4RjFENTAzQjk2RkE5QzZDODgwNTQzRDhCNUYwNEQ3MEZFNTA4RkZDQTE2MTc5OEFEMzIwMTUxNDVCOEU5QUQ0M0FBQjQ4QURBODFGRDFFNUE4RUE3NzExQThGRjU3RUM3QzRDMDgxQjQ3RkFCMEMyRTlGQTQ2OEU3MERENjcwMEYzNDEyMjI0ODkwRDVFOTk1MjdBNTk2Q0U2MzUxOTVGM0E2RDM1RTU2M0JGNDg5MkRGMkM3OUM4MDk3MDQ0MTEwMThEOTE5MTAyRDEyQ0IxMTJDRTFFNjZFQkY1REI5RjQwOUY2QzgyQTZBNkUxRTIxRTIzNTMyQ0M0RUZCNjcKLTIwMDYwODI3MDg1NjUzIDIgNiAxMDAgMjA0NyAyIEMwMzgyODJERTA2MUJFMUFEMzRGMzEzMjVFRkU5QjFEODUyMERCMTQyNzZDRUI2MUZFM0EyQ0I4RDc3RkZFM0I5QTA2NzUwNTIwNUJCQTgzNTM4NDdGRDJFQTFFMjQ3MUU0Mjk0ODYyQTVENEM0RjlBMkI4MEY5REEwNjE5MzI3Q0RCRjJFQjYwOEIwQjU1NDkyOTRBOTU1OTcyQUEzNTEyODIxQjI0NzgyREQ4QUI5N0I1M0FBQjA0QjQ4MTgwMzk0QUJGQkM0RENGOUI4MTlGQzBDQjVBQzEyNzVBQzVGMTZFQzM3ODE2MzUwMUU0QjI3RDQ5QzY3RjY2MDMzMzg4OEYxRDUwM0I5NkZBOUM2Qzg4MDU0M0Q4QjVGMDRENzBGRTUwOEZGQ0ExNjE3OThBRDMyMDE1MTQ1QjhFOUFENDNBQUI0OEFEQTgxRkQxRTVBOEVBNzcxMUE4RkY1N0VDN0M0QzA4MUI0N0ZBQjBDMkU5RkE0NjhFNzBERDY3MDBGMzQxMjIyNDg5MEQ1RTk5NTI3QTU5NkNFNjM1MTk1RjNBNkQzNUU1NjNCRjQ4OTJERjJDNzlDODA5NzA0NDExMDE4RDkxOTEwMkQxMkNCMTEyQ0UxRTY2RUJGNURCOUY0MDlGNkM4MkE2QTZFMUUyMUUyMzUzMkNDODE1MkZCCi0yMDA2MDgyNzA5MDUyMiAyIDYgMTAwIDIwNDcgMiBDMDM4MjgyREUwNjFCRTFBRDM0RjMxMzI1RUZFOUIxRDg1MjBEQjE0Mjc2Q0VCNjFGRTNBMkNCOEQ3N0ZGRTNCOUEwNjc1MDUyMDVCQkE4MzUzODQ3RkQyRUExRTI0NzFFNDI5NDg2MkE1RDRDNEY5QTJCODBGOURBMDYxOTMyN0NEQkYyRUI2MDhCMEI1NTQ5Mjk0QTk1NTk3MkFBMzUxMjgyMUIyNDc4MkREOEFCOTdCNTNBQUIwNEI0ODE4MDM5NEFCRkJDNERDRjlCODE5RkMwQ0I1QUMxMjc1QUM1RjE2RUMzNzgxNjM1MDFFNEIyN0Q0OUM2N0Y2NjAzMzM4ODhGMUQ1MDNCOTZGQTlDNkM4ODA1NDNEOEI1RjA0RDcwRkU1MDhGRkNBMTYxNzk4QUQzMjAxNTE0NUI4RTlBRDQzQUFCNDhBREE4MUZEMUU1QThFQTc3MTFBOEZGNTdFQzdDNEMwODFCNDdGQUIwQzJFOUZBNDY4RTcwREQ2NzAwRjM0MTIyMjQ4OTBENUU5OTUyN0E1OTZDRTYzNTE5NUYzQTZEMzVFNTYzQkY0ODkyREYyQzc5QzgwOTcwNDQxMTAxOEQ5MTkxMDJEMTJDQjExMkNFMUU2NkVCRjVEQjlGNDA5RjZDODJBNkE2RTFFMjFFMjM1MzJDQ0I1QUU2QgotMjAwNjA4MjcwOTIyNTMgMiA2IDEwMCAyMDQ3IDIgQzAzODI4MkRFMDYxQkUxQUQzNEYzMTMyNUVGRTlCMUQ4NTIwREIxNDI3NkNFQjYxRkUzQTJDQjhENzdGRkUzQjlBMDY3NTA1MjA1QkJBODM1Mzg0N0ZEMkVBMUUyNDcxRTQyOTQ4NjJBNUQ0QzRGOUEyQjgwRjlEQTA2MTkzMjdDREJGMkVCNjA4QjBCNTU0OTI5NEE5NTU5NzJBQTM1MTI4MjFCMjQ3ODJERDhBQjk3QjUzQUFCMDRCNDgxODAzOTRBQkZCQzREQ0Y5QjgxOUZDMENCNUFDMTI3NUFDNUYxNkVDMzc4MTYzNTAxRTRCMjdENDlDNjdGNjYwMzMzODg4RjFENTAzQjk2RkE5QzZDODgwNTQzRDhCNUYwNEQ3MEZFNTA4RkZDQTE2MTc5OEFEMzIwMTUxNDVCOEU5QUQ0M0FBQjQ4QURBODFGRDFFNUE4RUE3NzExQThGRjU3RUM3QzRDMDgxQjQ3RkFCMEMyRTlGQTQ2OEU3MERENjcwMEYzNDEyMjI0ODkwRDVFOTk1MjdBNTk2Q0U2MzUxOTVGM0E2RDM1RTU2M0JGNDg5MkRGMkM3OUM4MDk3MDQ0MTEwMThEOTE5MTAyRDEyQ0IxMTJDRTFFNjZFQkY1REI5RjQwOUY2QzgyQTZBNkUxRTIxRTIzNTMyQ0QyNTJGQ0IKLTIwMDYwODI3MDk1OTE2IDIgNiAxMDAgMjA0NyA1IEMwMzgyODJERTA2MUJFMUFEMzRGMzEzMjVFRkU5QjFEODUyMERCMTQyNzZDRUI2MUZFM0EyQ0I4RDc3RkZFM0I5QTA2NzUwNTIwNUJCQTgzNTM4NDdGRDJFQTFFMjQ3MUU0Mjk0ODYyQTVENEM0RjlBMkI4MEY5REEwNjE5MzI3Q0RCRjJFQjYwOEIwQjU1NDkyOTRBOTU1OTcyQUEzNTEyODIxQjI0NzgyREQ4QUI5N0I1M0FBQjA0QjQ4MTgwMzk0QUJGQkM0RENGOUI4MTlGQzBDQjVBQzEyNzVBQzVGMTZFQzM3ODE2MzUwMUU0QjI3RDQ5QzY3RjY2MDMzMzg4OEYxRDUwM0I5NkZBOUM2Qzg4MDU0M0Q4QjVGMDRENzBGRTUwOEZGQ0ExNjE3OThBRDMyMDE1MTQ1QjhFOUFENDNBQUI0OEFEQTgxRkQxRTVBOEVBNzcxMUE4RkY1N0VDN0M0QzA4MUI0N0ZBQjBDMkU5RkE0NjhFNzBERDY3MDBGMzQxMjIyNDg5MEQ1RTk5NTI3QTU5NkNFNjM1MTk1RjNBNkQzNUU1NjNCRjQ4OTJERjJDNzlDODA5NzA0NDExMDE4RDkxOTEwMkQxMkNCMTEyQ0UxRTY2RUJGNURCOUY0MDlGNkM4MkE2QTZFMUUyMUUyMzUzMkNFMTE3RTJGCi0yMDA2MDgyNzEwMDI0NiAyIDYgMTAwIDIwNDcgMiBDMDM4MjgyREUwNjFCRTFBRDM0RjMxMzI1RUZFOUIxRDg1MjBEQjE0Mjc2Q0VCNjFGRTNBMkNCOEQ3N0ZGRTNCOUEwNjc1MDUyMDVCQkE4MzUzODQ3RkQyRUExRTI0NzFFNDI5NDg2MkE1RDRDNEY5QTJCODBGOURBMDYxOTMyN0NEQkYyRUI2MDhCMEI1NTQ5Mjk0QTk1NTk3MkFBMzUxMjgyMUIyNDc4MkREOEFCOTdCNTNBQUIwNEI0ODE4MDM5NEFCRkJDNERDRjlCODE5RkMwQ0I1QUMxMjc1QUM1RjE2RUMzNzgxNjM1MDFFNEIyN0Q0OUM2N0Y2NjAzMzM4ODhGMUQ1MDNCOTZGQTlDNkM4ODA1NDNEOEI1RjA0RDcwRkU1MDhGRkNBMTYxNzk4QUQzMjAxNTE0NUI4RTlBRDQzQUFCNDhBREE4MUZEMUU1QThFQTc3MTFBOEZGNTdFQzdDNEMwODFCNDdGQUIwQzJFOUZBNDY4RTcwREQ2NzAwRjM0MTIyMjQ4OTBENUU5OTUyN0E1OTZDRTYzNTE5NUYzQTZEMzVFNTYzQkY0ODkyREYyQzc5QzgwOTcwNDQxMTAxOEQ5MTkxMDJEMTJDQjExMkNFMUU2NkVCRjVEQjlGNDA5RjZDODJBNkE2RTFFMjFFMjM1MzJDRTIwODdDQgotMjAwNjA4MjcxMDIwNDEgMiA2IDEwMCAyMDQ3IDUgQzAzODI4MkRFMDYxQkUxQUQzNEYzMTMyNUVGRTlCMUQ4NTIwREIxNDI3NkNFQjYxRkUzQTJDQjhENzdGRkUzQjlBMDY3NTA1MjA1QkJBODM1Mzg0N0ZEMkVBMUUyNDcxRTQyOTQ4NjJBNUQ0QzRGOUEyQjgwRjlEQTA2MTkzMjdDREJGMkVCNjA4QjBCNTU0OTI5NEE5NTU5NzJBQTM1MTI4MjFCMjQ3ODJERDhBQjk3QjUzQUFCMDRCNDgxODAzOTRBQkZCQzREQ0Y5QjgxOUZDMENCNUFDMTI3NUFDNUYxNkVDMzc4MTYzNTAxRTRCMjdENDlDNjdGNjYwMzMzODg4RjFENTAzQjk2RkE5QzZDODgwNTQzRDhCNUYwNEQ3MEZFNTA4RkZDQTE2MTc5OEFEMzIwMTUxNDVCOEU5QUQ0M0FBQjQ4QURBODFGRDFFNUE4RUE3NzExQThGRjU3RUM3QzRDMDgxQjQ3RkFCMEMyRTlGQTQ2OEU3MERENjcwMEYzNDEyMjI0ODkwRDVFOTk1MjdBNTk2Q0U2MzUxOTVGM0E2RDM1RTU2M0JGNDg5MkRGMkM3OUM4MDk3MDQ0MTEwMThEOTE5MTAyRDEyQ0IxMTJDRTFFNjZFQkY1REI5RjQwOUY2QzgyQTZBNkUxRTIxRTIzNTMyQ0U5MjU1MzcKLTIwMDYwODI3MTAyNTU2IDIgNiAxMDAgMjA0NyA1IEMwMzgyODJERTA2MUJFMUFEMzRGMzEzMjVFRkU5QjFEODUyMERCMTQyNzZDRUI2MUZFM0EyQ0I4RDc3RkZFM0I5QTA2NzUwNTIwNUJCQTgzNTM4NDdGRDJFQTFFMjQ3MUU0Mjk0ODYyQTVENEM0RjlBMkI4MEY5REEwNjE5MzI3Q0RCRjJFQjYwOEIwQjU1NDkyOTRBOTU1OTcyQUEzNTEyODIxQjI0NzgyREQ4QUI5N0I1M0FBQjA0QjQ4MTgwMzk0QUJGQkM0RENGOUI4MTlGQzBDQjVBQzEyNzVBQzVGMTZFQzM3ODE2MzUwMUU0QjI3RDQ5QzY3RjY2MDMzMzg4OEYxRDUwM0I5NkZBOUM2Qzg4MDU0M0Q4QjVGMDRENzBGRTUwOEZGQ0ExNjE3OThBRDMyMDE1MTQ1QjhFOUFENDNBQUI0OEFEQTgxRkQxRTVBOEVBNzcxMUE4RkY1N0VDN0M0QzA4MUI0N0ZBQjBDMkU5RkE0NjhFNzBERDY3MDBGMzQxMjIyNDg5MEQ1RTk5NTI3QTU5NkNFNjM1MTk1RjNBNkQzNUU1NjNCRjQ4OTJERjJDNzlDODA5NzA0NDExMDE4RDkxOTEwMkQxMkNCMTEyQ0UxRTY2RUJGNURCOUY0MDlGNkM4MkE2QTZFMUUyMUUyMzUzMkNFQUYyQTI3Ci0yMDA2MDgyNzEwMzc0OSAyIDYgMTAwIDIwNDcgNSBDMDM4MjgyREUwNjFCRTFBRDM0RjMxMzI1RUZFOUIxRDg1MjBEQjE0Mjc2Q0VCNjFGRTNBMkNCOEQ3N0ZGRTNCOUEwNjc1MDUyMDVCQkE4MzUzODQ3RkQyRUExRTI0NzFFNDI5NDg2MkE1RDRDNEY5QTJCODBGOURBMDYxOTMyN0NEQkYyRUI2MDhCMEI1NTQ5Mjk0QTk1NTk3MkFBMzUxMjgyMUIyNDc4MkREOEFCOTdCNTNBQUIwNEI0ODE4MDM5NEFCRkJDNERDRjlCODE5RkMwQ0I1QUMxMjc1QUM1RjE2RUMzNzgxNjM1MDFFNEIyN0Q0OUM2N0Y2NjAzMzM4ODhGMUQ1MDNCOTZGQTlDNkM4ODA1NDNEOEI1RjA0RDcwRkU1MDhGRkNBMTYxNzk4QUQzMjAxNTE0NUI4RTlBRDQzQUFCNDhBREE4MUZEMUU1QThFQTc3MTFBOEZGNTdFQzdDNEMwODFCNDdGQUIwQzJFOUZBNDY4RTcwREQ2NzAwRjM0MTIyMjQ4OTBENUU5OTUyN0E1OTZDRTYzNTE5NUYzQTZEMzVFNTYzQkY0ODkyREYyQzc5QzgwOTcwNDQxMTAxOEQ5MTkxMDJEMTJDQjExMkNFMUU2NkVCRjVEQjlGNDA5RjZDODJBNkE2RTFFMjFFMjM1MzJDRUY5ODI2RgotMjAwNjA4MjcxMDM5MTcgMiA2IDEwMCAyMDQ3IDUgQzAzODI4MkRFMDYxQkUxQUQzNEYzMTMyNUVGRTlCMUQ4NTIwREIxNDI3NkNFQjYxRkUzQTJDQjhENzdGRkUzQjlBMDY3NTA1MjA1QkJBODM1Mzg0N0ZEMkVBMUUyNDcxRTQyOTQ4NjJBNUQ0QzRGOUEyQjgwRjlEQTA2MTkzMjdDREJGMkVCNjA4QjBCNTU0OTI5NEE5NTU5NzJBQTM1MTI4MjFCMjQ3ODJERDhBQjk3QjUzQUFCMDRCNDgxODAzOTRBQkZCQzREQ0Y5QjgxOUZDMENCNUFDMTI3NUFDNUYxNkVDMzc4MTYzNTAxRTRCMjdENDlDNjdGNjYwMzMzODg4RjFENTAzQjk2RkE5QzZDODgwNTQzRDhCNUYwNEQ3MEZFNTA4RkZDQTE2MTc5OEFEMzIwMTUxNDVCOEU5QUQ0M0FBQjQ4QURBODFGRDFFNUE4RUE3NzExQThGRjU3RUM3QzRDMDgxQjQ3RkFCMEMyRTlGQTQ2OEU3MERENjcwMEYzNDEyMjI0ODkwRDVFOTk1MjdBNTk2Q0U2MzUxOTVGM0E2RDM1RTU2M0JGNDg5MkRGMkM3OUM4MDk3MDQ0MTEwMThEOTE5MTAyRDEyQ0IxMTJDRTFFNjZFQkY1REI5RjQwOUY2QzgyQTZBNkUxRTIxRTIzNTMyQ0VGQkM0NjcKLTIwMDYwODI3MTA0NjExIDIgNiAxMDAgMjA0NyAyIEMwMzgyODJERTA2MUJFMUFEMzRGMzEzMjVFRkU5QjFEODUyMERCMTQyNzZDRUI2MUZFM0EyQ0I4RDc3RkZFM0I5QTA2NzUwNTIwNUJCQTgzNTM4NDdGRDJFQTFFMjQ3MUU0Mjk0ODYyQTVENEM0RjlBMkI4MEY5REEwNjE5MzI3Q0RCRjJFQjYwOEIwQjU1NDkyOTRBOTU1OTcyQUEzNTEyODIxQjI0NzgyREQ4QUI5N0I1M0FBQjA0QjQ4MTgwMzk0QUJGQkM0RENGOUI4MTlGQzBDQjVBQzEyNzVBQzVGMTZFQzM3ODE2MzUwMUU0QjI3RDQ5QzY3RjY2MDMzMzg4OEYxRDUwM0I5NkZBOUM2Qzg4MDU0M0Q4QjVGMDRENzBGRTUwOEZGQ0ExNjE3OThBRDMyMDE1MTQ1QjhFOUFENDNBQUI0OEFEQTgxRkQxRTVBOEVBNzcxMUE4RkY1N0VDN0M0QzA4MUI0N0ZBQjBDMkU5RkE0NjhFNzBERDY3MDBGMzQxMjIyNDg5MEQ1RTk5NTI3QTU5NkNFNjM1MTk1RjNBNkQzNUU1NjNCRjQ4OTJERjJDNzlDODA5NzA0NDExMDE4RDkxOTEwMkQxMkNCMTEyQ0UxRTY2RUJGNURCOUY0MDlGNkM4MkE2QTZFMUUyMUUyMzUzMkNGMjRBNkUzCi0yMDA2MDgyNzEzMDMyMCAyIDYgMTAwIDMwNzEgNSBEMzIzMEQyMzc1NzJFQ0U5RjkyMzU4NzE1RUJBQzNBNEQ4OUYyRDZCNERDMzlGMDU2NDUwMjYzQkVGMTY2NUZCRDdCOTM5MTZBQkM4NjdCNzA2NDgwMjE1OUQyNzNDN0VCMDFDNUY5MjgxQTNENkRDQ0I3Q0Y5OTdEMzg1OTk4RUMwRTFGQTMzMTlBRkU3NzFBOTBBREJBQ0VCNDE0QTAyMDYzMEQ3QzdGMTYxRkFGRUM2QzlGQzA2RDMyMDVDNzEyQUFFODg0OEExQjJDMjFERkYzMDFDN0ZGQzBCNzVEMTNGMDYwQTMxM0MzMkFGRUVBRjE0OTNGNjQxNzYwRUJFRjM4ODI5QjMzNzE2OTlEMkEzMjY0RDBFQ0VCNEU1QzE5NTgxRUQ4QzU3Njk5RjU1OUI5ODI4QkJGRTE0Nzk1MkUyODlGMEUxNzFDOUM2MDMzNUREMkY0OTJDQjQwOUE0REI5N0JERjg2RTJEQkE2MDUwNjREQjA0MEEzREY1Njc4RTI0RjY2NzE4Q0ExMTVDOTVDODkyRkY3QUVERkFBQkMyRTY0MTQ3MTYyOThDRUMxQTYwNDI3MEZFQURGMTkxQjdDOEE1OUMyMzhDMzk1QTY1NDQyQzBCOTYzQkY4MzAyNUJFRDM5NTFBMjcxQjc0NDBFQzc2ODdDMzFERTYzMzU1REE3RkVBQzE1REM5NjJDN0JGNzYxNEVCNTlCMDc3Qjk4ODlBRDg3MDNERkU5OEFDOTk2MTVCNzIyQTBBQkU4OTk1NkQxMDU4RTAyNUM3NzMzNDIwQ0I1MUQ3RTE2MDhFRkYyQzBBMzBDOUE1RUI3N0NDQTAyQzZCMDBDRTc4MUIxNzIwMDFDNkM0NTg2MzA4OTAwNjJFMjdDRTMwN0Q1MTNBNzY4NkE2OUQxRDU0OERFODMzNEIxMzEzNkQ5RTg0MkE1RTE3RkQ2NzUyMkM5MzgyM0UwM0YwOEFFRTgwMjRBRjVEODhCMkVFMDFENEQ5OTgwMDg0RUZBODBCM0YKLTIwMDYwODI3MTMyMDAxIDIgNiAxMDAgMzA3MSAyIEQzMjMwRDIzNzU3MkVDRTlGOTIzNTg3MTVFQkFDM0E0RDg5RjJENkI0REMzOUYwNTY0NTAyNjNCRUYxNjY1RkJEN0I5MzkxNkFCQzg2N0I3MDY0ODAyMTU5RDI3M0M3RUIwMUM1RjkyODFBM0Q2RENDQjdDRjk5N0QzODU5OThFQzBFMUZBMzMxOUFGRTc3MUE5MEFEQkFDRUI0MTRBMDIwNjMwRDdDN0YxNjFGQUZFQzZDOUZDMDZEMzIwNUM3MTJBQUU4ODQ4QTFCMkMyMURGRjMwMUM3RkZDMEI3NUQxM0YwNjBBMzEzQzMyQUZFRUFGMTQ5M0Y2NDE3NjBFQkVGMzg4MjlCMzM3MTY5OUQyQTMyNjREMEVDRUI0RTVDMTk1ODFFRDhDNTc2OTlGNTU5Qjk4MjhCQkZFMTQ3OTUyRTI4OUYwRTE3MUM5QzYwMzM1REQyRjQ5MkNCNDA5QTREQjk3QkRGODZFMkRCQTYwNTA2NERCMDQwQTNERjU2NzhFMjRGNjY3MThDQTExNUM5NUM4OTJGRjdBRURGQUFCQzJFNjQxNDcxNjI5OENFQzFBNjA0MjcwRkVBREYxOTFCN0M4QTU5QzIzOEMzOTVBNjU0NDJDMEI5NjNCRjgzMDI1QkVEMzk1MUEyNzFCNzQ0MEVDNzY4N0MzMURFNjMzNTVEQTdGRUFDMTVEQzk2MkM3QkY3NjE0RUI1OUIwNzdCOTg4OUFEODcwM0RGRTk4QUM5OTYxNUI3MjJBMEFCRTg5OTU2RDEwNThFMDI1Qzc3MzM0MjBDQjUxRDdFMTYwOEVGRjJDMEEzMEM5QTVFQjc3Q0NBMDJDNkIwMENFNzgxQjE3MjAwMUM2QzQ1ODYzMDg5MDA2MkUyN0NFMzA3RDUxM0E3Njg2QTY5RDFENTQ4REU4MzM0QjEzMTM2RDlFODQyQTVFMTdGRDY3NTIyQzkzODIzRTAzRjA4QUVFODAyNEFGNUQ4OEIyRUUwMUQ0RDk5ODAwODRFRkMyRjJBMwotMjAwNjA4MjcxMzI2NTkgMiA2IDEwMCAzMDcxIDIgRDMyMzBEMjM3NTcyRUNFOUY5MjM1ODcxNUVCQUMzQTREODlGMkQ2QjREQzM5RjA1NjQ1MDI2M0JFRjE2NjVGQkQ3QjkzOTE2QUJDODY3QjcwNjQ4MDIxNTlEMjczQzdFQjAxQzVGOTI4MUEzRDZEQ0NCN0NGOTk3RDM4NTk5OEVDMEUxRkEzMzE5QUZFNzcxQTkwQURCQUNFQjQxNEEwMjA2MzBEN0M3RjE2MUZBRkVDNkM5RkMwNkQzMjA1QzcxMkFBRTg4NDhBMUIyQzIxREZGMzAxQzdGRkMwQjc1RDEzRjA2MEEzMTNDMzJBRkVFQUYxNDkzRjY0MTc2MEVCRUYzODgyOUIzMzcxNjk5RDJBMzI2NEQwRUNFQjRFNUMxOTU4MUVEOEM1NzY5OUY1NTlCOTgyOEJCRkUxNDc5NTJFMjg5RjBFMTcxQzlDNjAzMzVERDJGNDkyQ0I0MDlBNERCOTdCREY4NkUyREJBNjA1MDY0REIwNDBBM0RGNTY3OEUyNEY2NjcxOENBMTE1Qzk1Qzg5MkZGN0FFREZBQUJDMkU2NDE0NzE2Mjk4Q0VDMUE2MDQyNzBGRUFERjE5MUI3QzhBNTlDMjM4QzM5NUE2NTQ0MkMwQjk2M0JGODMwMjVCRUQzOTUxQTI3MUI3NDQwRUM3Njg3QzMxREU2MzM1NURBN0ZFQUMxNURDOTYyQzdCRjc2MTRFQjU5QjA3N0I5ODg5QUQ4NzAzREZFOThBQzk5NjE1QjcyMkEwQUJFODk5NTZEMTA1OEUwMjVDNzczMzQyMENCNTFEN0UxNjA4RUZGMkMwQTMwQzlBNUVCNzdDQ0EwMkM2QjAwQ0U3ODFCMTcyMDAxQzZDNDU4NjMwODkwMDYyRTI3Q0UzMDdENTEzQTc2ODZBNjlEMUQ1NDhERTgzMzRCMTMxMzZEOUU4NDJBNUUxN0ZENjc1MjJDOTM4MjNFMDNGMDhBRUU4MDI0QUY1RDg4QjJFRTAxRDREOTk4MDA4NEVGQzgzREUzCi0yMDA2MDgyNzEzMzIzMSAyIDYgMTAwIDMwNzEgMiBEMzIzMEQyMzc1NzJFQ0U5RjkyMzU4NzE1RUJBQzNBNEQ4OUYyRDZCNERDMzlGMDU2NDUwMjYzQkVGMTY2NUZCRDdCOTM5MTZBQkM4NjdCNzA2NDgwMjE1OUQyNzNDN0VCMDFDNUY5MjgxQTNENkRDQ0I3Q0Y5OTdEMzg1OTk4RUMwRTFGQTMzMTlBRkU3NzFBOTBBREJBQ0VCNDE0QTAyMDYzMEQ3QzdGMTYxRkFGRUM2QzlGQzA2RDMyMDVDNzEyQUFFODg0OEExQjJDMjFERkYzMDFDN0ZGQzBCNzVEMTNGMDYwQTMxM0MzMkFGRUVBRjE0OTNGNjQxNzYwRUJFRjM4ODI5QjMzNzE2OTlEMkEzMjY0RDBFQ0VCNEU1QzE5NTgxRUQ4QzU3Njk5RjU1OUI5ODI4QkJGRTE0Nzk1MkUyODlGMEUxNzFDOUM2MDMzNUREMkY0OTJDQjQwOUE0REI5N0JERjg2RTJEQkE2MDUwNjREQjA0MEEzREY1Njc4RTI0RjY2NzE4Q0ExMTVDOTVDODkyRkY3QUVERkFBQkMyRTY0MTQ3MTYyOThDRUMxQTYwNDI3MEZFQURGMTkxQjdDOEE1OUMyMzhDMzk1QTY1NDQyQzBCOTYzQkY4MzAyNUJFRDM5NTFBMjcxQjc0NDBFQzc2ODdDMzFERTYzMzU1REE3RkVBQzE1REM5NjJDN0JGNzYxNEVCNTlCMDc3Qjk4ODlBRDg3MDNERkU5OEFDOTk2MTVCNzIyQTBBQkU4OTk1NkQxMDU4RTAyNUM3NzMzNDIwQ0I1MUQ3RTE2MDhFRkYyQzBBMzBDOUE1RUI3N0NDQTAyQzZCMDBDRTc4MUIxNzIwMDFDNkM0NTg2MzA4OTAwNjJFMjdDRTMwN0Q1MTNBNzY4NkE2OUQxRDU0OERFODMzNEIxMzEzNkQ5RTg0MkE1RTE3RkQ2NzUyMkM5MzgyM0UwM0YwOEFFRTgwMjRBRjVEODhCMkVFMDFENEQ5OTgwMDg0RUZDQUUyNjMKLTIwMDYwODI3MTM0MjEyIDIgNiAxMDAgMzA3MSAyIEQzMjMwRDIzNzU3MkVDRTlGOTIzNTg3MTVFQkFDM0E0RDg5RjJENkI0REMzOUYwNTY0NTAyNjNCRUYxNjY1RkJEN0I5MzkxNkFCQzg2N0I3MDY0ODAyMTU5RDI3M0M3RUIwMUM1RjkyODFBM0Q2RENDQjdDRjk5N0QzODU5OThFQzBFMUZBMzMxOUFGRTc3MUE5MEFEQkFDRUI0MTRBMDIwNjMwRDdDN0YxNjFGQUZFQzZDOUZDMDZEMzIwNUM3MTJBQUU4ODQ4QTFCMkMyMURGRjMwMUM3RkZDMEI3NUQxM0YwNjBBMzEzQzMyQUZFRUFGMTQ5M0Y2NDE3NjBFQkVGMzg4MjlCMzM3MTY5OUQyQTMyNjREMEVDRUI0RTVDMTk1ODFFRDhDNTc2OTlGNTU5Qjk4MjhCQkZFMTQ3OTUyRTI4OUYwRTE3MUM5QzYwMzM1REQyRjQ5MkNCNDA5QTREQjk3QkRGODZFMkRCQTYwNTA2NERCMDQwQTNERjU2NzhFMjRGNjY3MThDQTExNUM5NUM4OTJGRjdBRURGQUFCQzJFNjQxNDcxNjI5OENFQzFBNjA0MjcwRkVBREYxOTFCN0M4QTU5QzIzOEMzOTVBNjU0NDJDMEI5NjNCRjgzMDI1QkVEMzk1MUEyNzFCNzQ0MEVDNzY4N0MzMURFNjMzNTVEQTdGRUFDMTVEQzk2MkM3QkY3NjE0RUI1OUIwNzdCOTg4OUFEODcwM0RGRTk4QUM5OTYxNUI3MjJBMEFCRTg5OTU2RDEwNThFMDI1Qzc3MzM0MjBDQjUxRDdFMTYwOEVGRjJDMEEzMEM5QTVFQjc3Q0NBMDJDNkIwMENFNzgxQjE3MjAwMUM2QzQ1ODYzMDg5MDA2MkUyN0NFMzA3RDUxM0E3Njg2QTY5RDFENTQ4REU4MzM0QjEzMTM2RDlFODQyQTVFMTdGRDY3NTIyQzkzODIzRTAzRjA4QUVFODAyNEFGNUQ4OEIyRUUwMUQ0RDk5ODAwODRFRkQ1RDk0MwotMjAwNjA4MjcxMzU2MDYgMiA2IDEwMCAzMDcxIDIgRDMyMzBEMjM3NTcyRUNFOUY5MjM1ODcxNUVCQUMzQTREODlGMkQ2QjREQzM5RjA1NjQ1MDI2M0JFRjE2NjVGQkQ3QjkzOTE2QUJDODY3QjcwNjQ4MDIxNTlEMjczQzdFQjAxQzVGOTI4MUEzRDZEQ0NCN0NGOTk3RDM4NTk5OEVDMEUxRkEzMzE5QUZFNzcxQTkwQURCQUNFQjQxNEEwMjA2MzBEN0M3RjE2MUZBRkVDNkM5RkMwNkQzMjA1QzcxMkFBRTg4NDhBMUIyQzIxREZGMzAxQzdGRkMwQjc1RDEzRjA2MEEzMTNDMzJBRkVFQUYxNDkzRjY0MTc2MEVCRUYzODgyOUIzMzcxNjk5RDJBMzI2NEQwRUNFQjRFNUMxOTU4MUVEOEM1NzY5OUY1NTlCOTgyOEJCRkUxNDc5NTJFMjg5RjBFMTcxQzlDNjAzMzVERDJGNDkyQ0I0MDlBNERCOTdCREY4NkUyREJBNjA1MDY0REIwNDBBM0RGNTY3OEUyNEY2NjcxOENBMTE1Qzk1Qzg5MkZGN0FFREZBQUJDMkU2NDE0NzE2Mjk4Q0VDMUE2MDQyNzBGRUFERjE5MUI3QzhBNTlDMjM4QzM5NUE2NTQ0MkMwQjk2M0JGODMwMjVCRUQzOTUxQTI3MUI3NDQwRUM3Njg3QzMxREU2MzM1NURBN0ZFQUMxNURDOTYyQzdCRjc2MTRFQjU5QjA3N0I5ODg5QUQ4NzAzREZFOThBQzk5NjE1QjcyMkEwQUJFODk5NTZEMTA1OEUwMjVDNzczMzQyMENCNTFEN0UxNjA4RUZGMkMwQTMwQzlBNUVCNzdDQ0EwMkM2QjAwQ0U3ODFCMTcyMDAxQzZDNDU4NjMwODkwMDYyRTI3Q0UzMDdENTEzQTc2ODZBNjlEMUQ1NDhERTgzMzRCMTMxMzZEOUU4NDJBNUUxN0ZENjc1MjJDOTM4MjNFMDNGMDhBRUU4MDI0QUY1RDg4QjJFRTAxRDREOTk4MDA4NEVGRUFENEFCCi0yMDA2MDgyNzE0MjQ1MiAyIDYgMTAwIDMwNzEgMiBEMzIzMEQyMzc1NzJFQ0U5RjkyMzU4NzE1RUJBQzNBNEQ4OUYyRDZCNERDMzlGMDU2NDUwMjYzQkVGMTY2NUZCRDdCOTM5MTZBQkM4NjdCNzA2NDgwMjE1OUQyNzNDN0VCMDFDNUY5MjgxQTNENkRDQ0I3Q0Y5OTdEMzg1OTk4RUMwRTFGQTMzMTlBRkU3NzFBOTBBREJBQ0VCNDE0QTAyMDYzMEQ3QzdGMTYxRkFGRUM2QzlGQzA2RDMyMDVDNzEyQUFFODg0OEExQjJDMjFERkYzMDFDN0ZGQzBCNzVEMTNGMDYwQTMxM0MzMkFGRUVBRjE0OTNGNjQxNzYwRUJFRjM4ODI5QjMzNzE2OTlEMkEzMjY0RDBFQ0VCNEU1QzE5NTgxRUQ4QzU3Njk5RjU1OUI5ODI4QkJGRTE0Nzk1MkUyODlGMEUxNzFDOUM2MDMzNUREMkY0OTJDQjQwOUE0REI5N0JERjg2RTJEQkE2MDUwNjREQjA0MEEzREY1Njc4RTI0RjY2NzE4Q0ExMTVDOTVDODkyRkY3QUVERkFBQkMyRTY0MTQ3MTYyOThDRUMxQTYwNDI3MEZFQURGMTkxQjdDOEE1OUMyMzhDMzk1QTY1NDQyQzBCOTYzQkY4MzAyNUJFRDM5NTFBMjcxQjc0NDBFQzc2ODdDMzFERTYzMzU1REE3RkVBQzE1REM5NjJDN0JGNzYxNEVCNTlCMDc3Qjk4ODlBRDg3MDNERkU5OEFDOTk2MTVCNzIyQTBBQkU4OTk1NkQxMDU4RTAyNUM3NzMzNDIwQ0I1MUQ3RTE2MDhFRkYyQzBBMzBDOUE1RUI3N0NDQTAyQzZCMDBDRTc4MUIxNzIwMDFDNkM0NTg2MzA4OTAwNjJFMjdDRTMwN0Q1MTNBNzY4NkE2OUQxRDU0OERFODMzNEIxMzEzNkQ5RTg0MkE1RTE3RkQ2NzUyMkM5MzgyM0UwM0YwOEFFRTgwMjRBRjVEODhCMkVFMDFENEQ5OTgwMDg0RjAxQ0JGQkIKLTIwMDYwODI3MTg1MjEyIDIgNiAxMDAgMzA3MSA1IEQzMjMwRDIzNzU3MkVDRTlGOTIzNTg3MTVFQkFDM0E0RDg5RjJENkI0REMzOUYwNTY0NTAyNjNCRUYxNjY1RkJEN0I5MzkxNkFCQzg2N0I3MDY0ODAyMTU5RDI3M0M3RUIwMUM1RjkyODFBM0Q2RENDQjdDRjk5N0QzODU5OThFQzBFMUZBMzMxOUFGRTc3MUE5MEFEQkFDRUI0MTRBMDIwNjMwRDdDN0YxNjFGQUZFQzZDOUZDMDZEMzIwNUM3MTJBQUU4ODQ4QTFCMkMyMURGRjMwMUM3RkZDMEI3NUQxM0YwNjBBMzEzQzMyQUZFRUFGMTQ5M0Y2NDE3NjBFQkVGMzg4MjlCMzM3MTY5OUQyQTMyNjREMEVDRUI0RTVDMTk1ODFFRDhDNTc2OTlGNTU5Qjk4MjhCQkZFMTQ3OTUyRTI4OUYwRTE3MUM5QzYwMzM1REQyRjQ5MkNCNDA5QTREQjk3QkRGODZFMkRCQTYwNTA2NERCMDQwQTNERjU2NzhFMjRGNjY3MThDQTExNUM5NUM4OTJGRjdBRURGQUFCQzJFNjQxNDcxNjI5OENFQzFBNjA0MjcwRkVBREYxOTFCN0M4QTU5QzIzOEMzOTVBNjU0NDJDMEI5NjNCRjgzMDI1QkVEMzk1MUEyNzFCNzQ0MEVDNzY4N0MzMURFNjMzNTVEQTdGRUFDMTVEQzk2MkM3QkY3NjE0RUI1OUIwNzdCOTg4OUFEODcwM0RGRTk4QUM5OTYxNUI3MjJBMEFCRTg5OTU2RDEwNThFMDI1Qzc3MzM0MjBDQjUxRDdFMTYwOEVGRjJDMEEzMEM5QTVFQjc3Q0NBMDJDNkIwMENFNzgxQjE3MjAwMUM2QzQ1ODYzMDg5MDA2MkUyN0NFMzA3RDUxM0E3Njg2QTY5RDFENTQ4REU4MzM0QjEzMTM2RDlFODQyQTVFMTdGRDY3NTIyQzkzODIzRTAzRjA4QUVFODAyNEFGNUQ4OEIyRUUwMUQ0RDk5ODAwODRGMjRDRkY2NwotMjAwNjA4MjcxOTAxNTggMiA2IDEwMCAzMDcxIDUgRDMyMzBEMjM3NTcyRUNFOUY5MjM1ODcxNUVCQUMzQTREODlGMkQ2QjREQzM5RjA1NjQ1MDI2M0JFRjE2NjVGQkQ3QjkzOTE2QUJDODY3QjcwNjQ4MDIxNTlEMjczQzdFQjAxQzVGOTI4MUEzRDZEQ0NCN0NGOTk3RDM4NTk5OEVDMEUxRkEzMzE5QUZFNzcxQTkwQURCQUNFQjQxNEEwMjA2MzBEN0M3RjE2MUZBRkVDNkM5RkMwNkQzMjA1QzcxMkFBRTg4NDhBMUIyQzIxREZGMzAxQzdGRkMwQjc1RDEzRjA2MEEzMTNDMzJBRkVFQUYxNDkzRjY0MTc2MEVCRUYzODgyOUIzMzcxNjk5RDJBMzI2NEQwRUNFQjRFNUMxOTU4MUVEOEM1NzY5OUY1NTlCOTgyOEJCRkUxNDc5NTJFMjg5RjBFMTcxQzlDNjAzMzVERDJGNDkyQ0I0MDlBNERCOTdCREY4NkUyREJBNjA1MDY0REIwNDBBM0RGNTY3OEUyNEY2NjcxOENBMTE1Qzk1Qzg5MkZGN0FFREZBQUJDMkU2NDE0NzE2Mjk4Q0VDMUE2MDQyNzBGRUFERjE5MUI3QzhBNTlDMjM4QzM5NUE2NTQ0MkMwQjk2M0JGODMwMjVCRUQzOTUxQTI3MUI3NDQwRUM3Njg3QzMxREU2MzM1NURBN0ZFQUMxNURDOTYyQzdCRjc2MTRFQjU5QjA3N0I5ODg5QUQ4NzAzREZFOThBQzk5NjE1QjcyMkEwQUJFODk5NTZEMTA1OEUwMjVDNzczMzQyMENCNTFEN0UxNjA4RUZGMkMwQTMwQzlBNUVCNzdDQ0EwMkM2QjAwQ0U3ODFCMTcyMDAxQzZDNDU4NjMwODkwMDYyRTI3Q0UzMDdENTEzQTc2ODZBNjlEMUQ1NDhERTgzMzRCMTMxMzZEOUU4NDJBNUUxN0ZENjc1MjJDOTM4MjNFMDNGMDhBRUU4MDI0QUY1RDg4QjJFRTAxRDREOTk4MDA4NEYyNTk5NTA3Ci0yMDA2MDgyNzIwMjczMCAyIDYgMTAwIDMwNzEgMiBEMzIzMEQyMzc1NzJFQ0U5RjkyMzU4NzE1RUJBQzNBNEQ4OUYyRDZCNERDMzlGMDU2NDUwMjYzQkVGMTY2NUZCRDdCOTM5MTZBQkM4NjdCNzA2NDgwMjE1OUQyNzNDN0VCMDFDNUY5MjgxQTNENkRDQ0I3Q0Y5OTdEMzg1OTk4RUMwRTFGQTMzMTlBRkU3NzFBOTBBREJBQ0VCNDE0QTAyMDYzMEQ3QzdGMTYxRkFGRUM2QzlGQzA2RDMyMDVDNzEyQUFFODg0OEExQjJDMjFERkYzMDFDN0ZGQzBCNzVEMTNGMDYwQTMxM0MzMkFGRUVBRjE0OTNGNjQxNzYwRUJFRjM4ODI5QjMzNzE2OTlEMkEzMjY0RDBFQ0VCNEU1QzE5NTgxRUQ4QzU3Njk5RjU1OUI5ODI4QkJGRTE0Nzk1MkUyODlGMEUxNzFDOUM2MDMzNUREMkY0OTJDQjQwOUE0REI5N0JERjg2RTJEQkE2MDUwNjREQjA0MEEzREY1Njc4RTI0RjY2NzE4Q0ExMTVDOTVDODkyRkY3QUVERkFBQkMyRTY0MTQ3MTYyOThDRUMxQTYwNDI3MEZFQURGMTkxQjdDOEE1OUMyMzhDMzk1QTY1NDQyQzBCOTYzQkY4MzAyNUJFRDM5NTFBMjcxQjc0NDBFQzc2ODdDMzFERTYzMzU1REE3RkVBQzE1REM5NjJDN0JGNzYxNEVCNTlCMDc3Qjk4ODlBRDg3MDNERkU5OEFDOTk2MTVCNzIyQTBBQkU4OTk1NkQxMDU4RTAyNUM3NzMzNDIwQ0I1MUQ3RTE2MDhFRkYyQzBBMzBDOUE1RUI3N0NDQTAyQzZCMDBDRTc4MUIxNzIwMDFDNkM0NTg2MzA4OTAwNjJFMjdDRTMwN0Q1MTNBNzY4NkE2OUQxRDU0OERFODMzNEIxMzEzNkQ5RTg0MkE1RTE3RkQ2NzUyMkM5MzgyM0UwM0YwOEFFRTgwMjRBRjVEODhCMkVFMDFENEQ5OTgwMDg0RjMwNTMxNUIKLTIwMDYwODI3MjEzMjUyIDIgNiAxMDAgMzA3MSAyIEQzMjMwRDIzNzU3MkVDRTlGOTIzNTg3MTVFQkFDM0E0RDg5RjJENkI0REMzOUYwNTY0NTAyNjNCRUYxNjY1RkJEN0I5MzkxNkFCQzg2N0I3MDY0ODAyMTU5RDI3M0M3RUIwMUM1RjkyODFBM0Q2RENDQjdDRjk5N0QzODU5OThFQzBFMUZBMzMxOUFGRTc3MUE5MEFEQkFDRUI0MTRBMDIwNjMwRDdDN0YxNjFGQUZFQzZDOUZDMDZEMzIwNUM3MTJBQUU4ODQ4QTFCMkMyMURGRjMwMUM3RkZDMEI3NUQxM0YwNjBBMzEzQzMyQUZFRUFGMTQ5M0Y2NDE3NjBFQkVGMzg4MjlCMzM3MTY5OUQyQTMyNjREMEVDRUI0RTVDMTk1ODFFRDhDNTc2OTlGNTU5Qjk4MjhCQkZFMTQ3OTUyRTI4OUYwRTE3MUM5QzYwMzM1REQyRjQ5MkNCNDA5QTREQjk3QkRGODZFMkRCQTYwNTA2NERCMDQwQTNERjU2NzhFMjRGNjY3MThDQTExNUM5NUM4OTJGRjdBRURGQUFCQzJFNjQxNDcxNjI5OENFQzFBNjA0MjcwRkVBREYxOTFCN0M4QTU5QzIzOEMzOTVBNjU0NDJDMEI5NjNCRjgzMDI1QkVEMzk1MUEyNzFCNzQ0MEVDNzY4N0MzMURFNjMzNTVEQTdGRUFDMTVEQzk2MkM3QkY3NjE0RUI1OUIwNzdCOTg4OUFEODcwM0RGRTk4QUM5OTYxNUI3MjJBMEFCRTg5OTU2RDEwNThFMDI1Qzc3MzM0MjBDQjUxRDdFMTYwOEVGRjJDMEEzMEM5QTVFQjc3Q0NBMDJDNkIwMENFNzgxQjE3MjAwMUM2QzQ1ODYzMDg5MDA2MkUyN0NFMzA3RDUxM0E3Njg2QTY5RDFENTQ4REU4MzM0QjEzMTM2RDlFODQyQTVFMTdGRDY3NTIyQzkzODIzRTAzRjA4QUVFODAyNEFGNUQ4OEIyRUUwMUQ0RDk5ODAwODRGMzhBNUI2MwotMjAwNjA4MjcyMTQzMjIgMiA2IDEwMCAzMDcxIDUgRDMyMzBEMjM3NTcyRUNFOUY5MjM1ODcxNUVCQUMzQTREODlGMkQ2QjREQzM5RjA1NjQ1MDI2M0JFRjE2NjVGQkQ3QjkzOTE2QUJDODY3QjcwNjQ4MDIxNTlEMjczQzdFQjAxQzVGOTI4MUEzRDZEQ0NCN0NGOTk3RDM4NTk5OEVDMEUxRkEzMzE5QUZFNzcxQTkwQURCQUNFQjQxNEEwMjA2MzBEN0M3RjE2MUZBRkVDNkM5RkMwNkQzMjA1QzcxMkFBRTg4NDhBMUIyQzIxREZGMzAxQzdGRkMwQjc1RDEzRjA2MEEzMTNDMzJBRkVFQUYxNDkzRjY0MTc2MEVCRUYzODgyOUIzMzcxNjk5RDJBMzI2NEQwRUNFQjRFNUMxOTU4MUVEOEM1NzY5OUY1NTlCOTgyOEJCRkUxNDc5NTJFMjg5RjBFMTcxQzlDNjAzMzVERDJGNDkyQ0I0MDlBNERCOTdCREY4NkUyREJBNjA1MDY0REIwNDBBM0RGNTY3OEUyNEY2NjcxOENBMTE1Qzk1Qzg5MkZGN0FFREZBQUJDMkU2NDE0NzE2Mjk4Q0VDMUE2MDQyNzBGRUFERjE5MUI3QzhBNTlDMjM4QzM5NUE2NTQ0MkMwQjk2M0JGODMwMjVCRUQzOTUxQTI3MUI3NDQwRUM3Njg3QzMxREU2MzM1NURBN0ZFQUMxNURDOTYyQzdCRjc2MTRFQjU5QjA3N0I5ODg5QUQ4NzAzREZFOThBQzk5NjE1QjcyMkEwQUJFODk5NTZEMTA1OEUwMjVDNzczMzQyMENCNTFEN0UxNjA4RUZGMkMwQTMwQzlBNUVCNzdDQ0EwMkM2QjAwQ0U3ODFCMTcyMDAxQzZDNDU4NjMwODkwMDYyRTI3Q0UzMDdENTEzQTc2ODZBNjlEMUQ1NDhERTgzMzRCMTMxMzZEOUU4NDJBNUUxN0ZENjc1MjJDOTM4MjNFMDNGMDhBRUU4MDI0QUY1RDg4QjJFRTAxRDREOTk4MDA4NEYzOTg3RkM3Ci0yMDA2MDgyNzIxNDgyNSAyIDYgMTAwIDMwNzEgMiBEMzIzMEQyMzc1NzJFQ0U5RjkyMzU4NzE1RUJBQzNBNEQ4OUYyRDZCNERDMzlGMDU2NDUwMjYzQkVGMTY2NUZCRDdCOTM5MTZBQkM4NjdCNzA2NDgwMjE1OUQyNzNDN0VCMDFDNUY5MjgxQTNENkRDQ0I3Q0Y5OTdEMzg1OTk4RUMwRTFGQTMzMTlBRkU3NzFBOTBBREJBQ0VCNDE0QTAyMDYzMEQ3QzdGMTYxRkFGRUM2QzlGQzA2RDMyMDVDNzEyQUFFODg0OEExQjJDMjFERkYzMDFDN0ZGQzBCNzVEMTNGMDYwQTMxM0MzMkFGRUVBRjE0OTNGNjQxNzYwRUJFRjM4ODI5QjMzNzE2OTlEMkEzMjY0RDBFQ0VCNEU1QzE5NTgxRUQ4QzU3Njk5RjU1OUI5ODI4QkJGRTE0Nzk1MkUyODlGMEUxNzFDOUM2MDMzNUREMkY0OTJDQjQwOUE0REI5N0JERjg2RTJEQkE2MDUwNjREQjA0MEEzREY1Njc4RTI0RjY2NzE4Q0ExMTVDOTVDODkyRkY3QUVERkFBQkMyRTY0MTQ3MTYyOThDRUMxQTYwNDI3MEZFQURGMTkxQjdDOEE1OUMyMzhDMzk1QTY1NDQyQzBCOTYzQkY4MzAyNUJFRDM5NTFBMjcxQjc0NDBFQzc2ODdDMzFERTYzMzU1REE3RkVBQzE1REM5NjJDN0JGNzYxNEVCNTlCMDc3Qjk4ODlBRDg3MDNERkU5OEFDOTk2MTVCNzIyQTBBQkU4OTk1NkQxMDU4RTAyNUM3NzMzNDIwQ0I1MUQ3RTE2MDhFRkYyQzBBMzBDOUE1RUI3N0NDQTAyQzZCMDBDRTc4MUIxNzIwMDFDNkM0NTg2MzA4OTAwNjJFMjdDRTMwN0Q1MTNBNzY4NkE2OUQxRDU0OERFODMzNEIxMzEzNkQ5RTg0MkE1RTE3RkQ2NzUyMkM5MzgyM0UwM0YwOEFFRTgwMjRBRjVEODhCMkVFMDFENEQ5OTgwMDg0RjM5QTNDREIKLTIwMDYwODI3MjMyNTIwIDIgNiAxMDAgMzA3MSAyIEQzMjMwRDIzNzU3MkVDRTlGOTIzNTg3MTVFQkFDM0E0RDg5RjJENkI0REMzOUYwNTY0NTAyNjNCRUYxNjY1RkJEN0I5MzkxNkFCQzg2N0I3MDY0ODAyMTU5RDI3M0M3RUIwMUM1RjkyODFBM0Q2RENDQjdDRjk5N0QzODU5OThFQzBFMUZBMzMxOUFGRTc3MUE5MEFEQkFDRUI0MTRBMDIwNjMwRDdDN0YxNjFGQUZFQzZDOUZDMDZEMzIwNUM3MTJBQUU4ODQ4QTFCMkMyMURGRjMwMUM3RkZDMEI3NUQxM0YwNjBBMzEzQzMyQUZFRUFGMTQ5M0Y2NDE3NjBFQkVGMzg4MjlCMzM3MTY5OUQyQTMyNjREMEVDRUI0RTVDMTk1ODFFRDhDNTc2OTlGNTU5Qjk4MjhCQkZFMTQ3OTUyRTI4OUYwRTE3MUM5QzYwMzM1REQyRjQ5MkNCNDA5QTREQjk3QkRGODZFMkRCQTYwNTA2NERCMDQwQTNERjU2NzhFMjRGNjY3MThDQTExNUM5NUM4OTJGRjdBRURGQUFCQzJFNjQxNDcxNjI5OENFQzFBNjA0MjcwRkVBREYxOTFCN0M4QTU5QzIzOEMzOTVBNjU0NDJDMEI5NjNCRjgzMDI1QkVEMzk1MUEyNzFCNzQ0MEVDNzY4N0MzMURFNjMzNTVEQTdGRUFDMTVEQzk2MkM3QkY3NjE0RUI1OUIwNzdCOTg4OUFEODcwM0RGRTk4QUM5OTYxNUI3MjJBMEFCRTg5OTU2RDEwNThFMDI1Qzc3MzM0MjBDQjUxRDdFMTYwOEVGRjJDMEEzMEM5QTVFQjc3Q0NBMDJDNkIwMENFNzgxQjE3MjAwMUM2QzQ1ODYzMDg5MDA2MkUyN0NFMzA3RDUxM0E3Njg2QTY5RDFENTQ4REU4MzM0QjEzMTM2RDlFODQyQTVFMTdGRDY3NTIyQzkzODIzRTAzRjA4QUVFODAyNEFGNUQ4OEIyRUUwMUQ0RDk5ODAwODRGNDYzNzVBQgotMjAwNjA4MjgwMzA0MDUgMiA2IDEwMCAzMDcxIDIgRDMyMzBEMjM3NTcyRUNFOUY5MjM1ODcxNUVCQUMzQTREODlGMkQ2QjREQzM5RjA1NjQ1MDI2M0JFRjE2NjVGQkQ3QjkzOTE2QUJDODY3QjcwNjQ4MDIxNTlEMjczQzdFQjAxQzVGOTI4MUEzRDZEQ0NCN0NGOTk3RDM4NTk5OEVDMEUxRkEzMzE5QUZFNzcxQTkwQURCQUNFQjQxNEEwMjA2MzBEN0M3RjE2MUZBRkVDNkM5RkMwNkQzMjA1QzcxMkFBRTg4NDhBMUIyQzIxREZGMzAxQzdGRkMwQjc1RDEzRjA2MEEzMTNDMzJBRkVFQUYxNDkzRjY0MTc2MEVCRUYzODgyOUIzMzcxNjk5RDJBMzI2NEQwRUNFQjRFNUMxOTU4MUVEOEM1NzY5OUY1NTlCOTgyOEJCRkUxNDc5NTJFMjg5RjBFMTcxQzlDNjAzMzVERDJGNDkyQ0I0MDlBNERCOTdCREY4NkUyREJBNjA1MDY0REIwNDBBM0RGNTY3OEUyNEY2NjcxOENBMTE1Qzk1Qzg5MkZGN0FFREZBQUJDMkU2NDE0NzE2Mjk4Q0VDMUE2MDQyNzBGRUFERjE5MUI3QzhBNTlDMjM4QzM5NUE2NTQ0MkMwQjk2M0JGODMwMjVCRUQzOTUxQTI3MUI3NDQwRUM3Njg3QzMxREU2MzM1NURBN0ZFQUMxNURDOTYyQzdCRjc2MTRFQjU5QjA3N0I5ODg5QUQ4NzAzREZFOThBQzk5NjE1QjcyMkEwQUJFODk5NTZEMTA1OEUwMjVDNzczMzQyMENCNTFEN0UxNjA4RUZGMkMwQTMwQzlBNUVCNzdDQ0EwMkM2QjAwQ0U3ODFCMTcyMDAxQzZDNDU4NjMwODkwMDYyRTI3Q0UzMDdENTEzQTc2ODZBNjlEMUQ1NDhERTgzMzRCMTMxMzZEOUU4NDJBNUUxN0ZENjc1MjJDOTM4MjNFMDNGMDhBRUU4MDI0QUY1RDg4QjJFRTAxRDREOTk4MDA4NEY2MkIxN0VCCi0yMDA2MDgyODA0MzIzMCAyIDYgMTAwIDMwNzEgNSBEMzIzMEQyMzc1NzJFQ0U5RjkyMzU4NzE1RUJBQzNBNEQ4OUYyRDZCNERDMzlGMDU2NDUwMjYzQkVGMTY2NUZCRDdCOTM5MTZBQkM4NjdCNzA2NDgwMjE1OUQyNzNDN0VCMDFDNUY5MjgxQTNENkRDQ0I3Q0Y5OTdEMzg1OTk4RUMwRTFGQTMzMTlBRkU3NzFBOTBBREJBQ0VCNDE0QTAyMDYzMEQ3QzdGMTYxRkFGRUM2QzlGQzA2RDMyMDVDNzEyQUFFODg0OEExQjJDMjFERkYzMDFDN0ZGQzBCNzVEMTNGMDYwQTMxM0MzMkFGRUVBRjE0OTNGNjQxNzYwRUJFRjM4ODI5QjMzNzE2OTlEMkEzMjY0RDBFQ0VCNEU1QzE5NTgxRUQ4QzU3Njk5RjU1OUI5ODI4QkJGRTE0Nzk1MkUyODlGMEUxNzFDOUM2MDMzNUREMkY0OTJDQjQwOUE0REI5N0JERjg2RTJEQkE2MDUwNjREQjA0MEEzREY1Njc4RTI0RjY2NzE4Q0ExMTVDOTVDODkyRkY3QUVERkFBQkMyRTY0MTQ3MTYyOThDRUMxQTYwNDI3MEZFQURGMTkxQjdDOEE1OUMyMzhDMzk1QTY1NDQyQzBCOTYzQkY4MzAyNUJFRDM5NTFBMjcxQjc0NDBFQzc2ODdDMzFERTYzMzU1REE3RkVBQzE1REM5NjJDN0JGNzYxNEVCNTlCMDc3Qjk4ODlBRDg3MDNERkU5OEFDOTk2MTVCNzIyQTBBQkU4OTk1NkQxMDU4RTAyNUM3NzMzNDIwQ0I1MUQ3RTE2MDhFRkYyQzBBMzBDOUE1RUI3N0NDQTAyQzZCMDBDRTc4MUIxNzIwMDFDNkM0NTg2MzA4OTAwNjJFMjdDRTMwN0Q1MTNBNzY4NkE2OUQxRDU0OERFODMzNEIxMzEzNkQ5RTg0MkE1RTE3RkQ2NzUyMkM5MzgyM0UwM0YwOEFFRTgwMjRBRjVEODhCMkVFMDFENEQ5OTgwMDg0RjZFMEJCNEYKLTIwMDYwODI4MDgxMzM4IDIgNiAxMDAgMzA3MSA1IEQzMjMwRDIzNzU3MkVDRTlGOTIzNTg3MTVFQkFDM0E0RDg5RjJENkI0REMzOUYwNTY0NTAyNjNCRUYxNjY1RkJEN0I5MzkxNkFCQzg2N0I3MDY0ODAyMTU5RDI3M0M3RUIwMUM1RjkyODFBM0Q2RENDQjdDRjk5N0QzODU5OThFQzBFMUZBMzMxOUFGRTc3MUE5MEFEQkFDRUI0MTRBMDIwNjMwRDdDN0YxNjFGQUZFQzZDOUZDMDZEMzIwNUM3MTJBQUU4ODQ4QTFCMkMyMURGRjMwMUM3RkZDMEI3NUQxM0YwNjBBMzEzQzMyQUZFRUFGMTQ5M0Y2NDE3NjBFQkVGMzg4MjlCMzM3MTY5OUQyQTMyNjREMEVDRUI0RTVDMTk1ODFFRDhDNTc2OTlGNTU5Qjk4MjhCQkZFMTQ3OTUyRTI4OUYwRTE3MUM5QzYwMzM1REQyRjQ5MkNCNDA5QTREQjk3QkRGODZFMkRCQTYwNTA2NERCMDQwQTNERjU2NzhFMjRGNjY3MThDQTExNUM5NUM4OTJGRjdBRURGQUFCQzJFNjQxNDcxNjI5OENFQzFBNjA0MjcwRkVBREYxOTFCN0M4QTU5QzIzOEMzOTVBNjU0NDJDMEI5NjNCRjgzMDI1QkVEMzk1MUEyNzFCNzQ0MEVDNzY4N0MzMURFNjMzNTVEQTdGRUFDMTVEQzk2MkM3QkY3NjE0RUI1OUIwNzdCOTg4OUFEODcwM0RGRTk4QUM5OTYxNUI3MjJBMEFCRTg5OTU2RDEwNThFMDI1Qzc3MzM0MjBDQjUxRDdFMTYwOEVGRjJDMEEzMEM5QTVFQjc3Q0NBMDJDNkIwMENFNzgxQjE3MjAwMUM2QzQ1ODYzMDg5MDA2MkUyN0NFMzA3RDUxM0E3Njg2QTY5RDFENTQ4REU4MzM0QjEzMTM2RDlFODQyQTVFMTdGRDY3NTIyQzkzODIzRTAzRjA4QUVFODAyNEFGNUQ4OEIyRUUwMUQ0RDk5ODAwODRGOEE5QjBFRgotMjAwNjA4MjgwODM2MTMgMiA2IDEwMCAzMDcxIDUgRDMyMzBEMjM3NTcyRUNFOUY5MjM1ODcxNUVCQUMzQTREODlGMkQ2QjREQzM5RjA1NjQ1MDI2M0JFRjE2NjVGQkQ3QjkzOTE2QUJDODY3QjcwNjQ4MDIxNTlEMjczQzdFQjAxQzVGOTI4MUEzRDZEQ0NCN0NGOTk3RDM4NTk5OEVDMEUxRkEzMzE5QUZFNzcxQTkwQURCQUNFQjQxNEEwMjA2MzBEN0M3RjE2MUZBRkVDNkM5RkMwNkQzMjA1QzcxMkFBRTg4NDhBMUIyQzIxREZGMzAxQzdGRkMwQjc1RDEzRjA2MEEzMTNDMzJBRkVFQUYxNDkzRjY0MTc2MEVCRUYzODgyOUIzMzcxNjk5RDJBMzI2NEQwRUNFQjRFNUMxOTU4MUVEOEM1NzY5OUY1NTlCOTgyOEJCRkUxNDc5NTJFMjg5RjBFMTcxQzlDNjAzMzVERDJGNDkyQ0I0MDlBNERCOTdCREY4NkUyREJBNjA1MDY0REIwNDBBM0RGNTY3OEUyNEY2NjcxOENBMTE1Qzk1Qzg5MkZGN0FFREZBQUJDMkU2NDE0NzE2Mjk4Q0VDMUE2MDQyNzBGRUFERjE5MUI3QzhBNTlDMjM4QzM5NUE2NTQ0MkMwQjk2M0JGODMwMjVCRUQzOTUxQTI3MUI3NDQwRUM3Njg3QzMxREU2MzM1NURBN0ZFQUMxNURDOTYyQzdCRjc2MTRFQjU5QjA3N0I5ODg5QUQ4NzAzREZFOThBQzk5NjE1QjcyMkEwQUJFODk5NTZEMTA1OEUwMjVDNzczMzQyMENCNTFEN0UxNjA4RUZGMkMwQTMwQzlBNUVCNzdDQ0EwMkM2QjAwQ0U3ODFCMTcyMDAxQzZDNDU4NjMwODkwMDYyRTI3Q0UzMDdENTEzQTc2ODZBNjlEMUQ1NDhERTgzMzRCMTMxMzZEOUU4NDJBNUUxN0ZENjc1MjJDOTM4MjNFMDNGMDhBRUU4MDI0QUY1RDg4QjJFRTAxRDREOTk4MDA4NEY4RDE2NEVGCi0yMDA2MDgyODA5MDUyOSAyIDYgMTAwIDMwNzEgMiBEMzIzMEQyMzc1NzJFQ0U5RjkyMzU4NzE1RUJBQzNBNEQ4OUYyRDZCNERDMzlGMDU2NDUwMjYzQkVGMTY2NUZCRDdCOTM5MTZBQkM4NjdCNzA2NDgwMjE1OUQyNzNDN0VCMDFDNUY5MjgxQTNENkRDQ0I3Q0Y5OTdEMzg1OTk4RUMwRTFGQTMzMTlBRkU3NzFBOTBBREJBQ0VCNDE0QTAyMDYzMEQ3QzdGMTYxRkFGRUM2QzlGQzA2RDMyMDVDNzEyQUFFODg0OEExQjJDMjFERkYzMDFDN0ZGQzBCNzVEMTNGMDYwQTMxM0MzMkFGRUVBRjE0OTNGNjQxNzYwRUJFRjM4ODI5QjMzNzE2OTlEMkEzMjY0RDBFQ0VCNEU1QzE5NTgxRUQ4QzU3Njk5RjU1OUI5ODI4QkJGRTE0Nzk1MkUyODlGMEUxNzFDOUM2MDMzNUREMkY0OTJDQjQwOUE0REI5N0JERjg2RTJEQkE2MDUwNjREQjA0MEEzREY1Njc4RTI0RjY2NzE4Q0ExMTVDOTVDODkyRkY3QUVERkFBQkMyRTY0MTQ3MTYyOThDRUMxQTYwNDI3MEZFQURGMTkxQjdDOEE1OUMyMzhDMzk1QTY1NDQyQzBCOTYzQkY4MzAyNUJFRDM5NTFBMjcxQjc0NDBFQzc2ODdDMzFERTYzMzU1REE3RkVBQzE1REM5NjJDN0JGNzYxNEVCNTlCMDc3Qjk4ODlBRDg3MDNERkU5OEFDOTk2MTVCNzIyQTBBQkU4OTk1NkQxMDU4RTAyNUM3NzMzNDIwQ0I1MUQ3RTE2MDhFRkYyQzBBMzBDOUE1RUI3N0NDQTAyQzZCMDBDRTc4MUIxNzIwMDFDNkM0NTg2MzA4OTAwNjJFMjdDRTMwN0Q1MTNBNzY4NkE2OUQxRDU0OERFODMzNEIxMzEzNkQ5RTg0MkE1RTE3RkQ2NzUyMkM5MzgyM0UwM0YwOEFFRTgwMjRBRjVEODhCMkVFMDFENEQ5OTgwMDg0RjkwNjQ4OEIKLTIwMDYwODI4MTAwNjIxIDIgNiAxMDAgMzA3MSAyIEQzMjMwRDIzNzU3MkVDRTlGOTIzNTg3MTVFQkFDM0E0RDg5RjJENkI0REMzOUYwNTY0NTAyNjNCRUYxNjY1RkJEN0I5MzkxNkFCQzg2N0I3MDY0ODAyMTU5RDI3M0M3RUIwMUM1RjkyODFBM0Q2RENDQjdDRjk5N0QzODU5OThFQzBFMUZBMzMxOUFGRTc3MUE5MEFEQkFDRUI0MTRBMDIwNjMwRDdDN0YxNjFGQUZFQzZDOUZDMDZEMzIwNUM3MTJBQUU4ODQ4QTFCMkMyMURGRjMwMUM3RkZDMEI3NUQxM0YwNjBBMzEzQzMyQUZFRUFGMTQ5M0Y2NDE3NjBFQkVGMzg4MjlCMzM3MTY5OUQyQTMyNjREMEVDRUI0RTVDMTk1ODFFRDhDNTc2OTlGNTU5Qjk4MjhCQkZFMTQ3OTUyRTI4OUYwRTE3MUM5QzYwMzM1REQyRjQ5MkNCNDA5QTREQjk3QkRGODZFMkRCQTYwNTA2NERCMDQwQTNERjU2NzhFMjRGNjY3MThDQTExNUM5NUM4OTJGRjdBRURGQUFCQzJFNjQxNDcxNjI5OENFQzFBNjA0MjcwRkVBREYxOTFCN0M4QTU5QzIzOEMzOTVBNjU0NDJDMEI5NjNCRjgzMDI1QkVEMzk1MUEyNzFCNzQ0MEVDNzY4N0MzMURFNjMzNTVEQTdGRUFDMTVEQzk2MkM3QkY3NjE0RUI1OUIwNzdCOTg4OUFEODcwM0RGRTk4QUM5OTYxNUI3MjJBMEFCRTg5OTU2RDEwNThFMDI1Qzc3MzM0MjBDQjUxRDdFMTYwOEVGRjJDMEEzMEM5QTVFQjc3Q0NBMDJDNkIwMENFNzgxQjE3MjAwMUM2QzQ1ODYzMDg5MDA2MkUyN0NFMzA3RDUxM0E3Njg2QTY5RDFENTQ4REU4MzM0QjEzMTM2RDlFODQyQTVFMTdGRDY3NTIyQzkzODIzRTAzRjA4QUVFODAyNEFGNUQ4OEIyRUUwMUQ0RDk5ODAwODRGOTdGRjRDQgotMjAwNjA4MjgxMjE0MjEgMiA2IDEwMCAzMDcxIDIgRDMyMzBEMjM3NTcyRUNFOUY5MjM1ODcxNUVCQUMzQTREODlGMkQ2QjREQzM5RjA1NjQ1MDI2M0JFRjE2NjVGQkQ3QjkzOTE2QUJDODY3QjcwNjQ4MDIxNTlEMjczQzdFQjAxQzVGOTI4MUEzRDZEQ0NCN0NGOTk3RDM4NTk5OEVDMEUxRkEzMzE5QUZFNzcxQTkwQURCQUNFQjQxNEEwMjA2MzBEN0M3RjE2MUZBRkVDNkM5RkMwNkQzMjA1QzcxMkFBRTg4NDhBMUIyQzIxREZGMzAxQzdGRkMwQjc1RDEzRjA2MEEzMTNDMzJBRkVFQUYxNDkzRjY0MTc2MEVCRUYzODgyOUIzMzcxNjk5RDJBMzI2NEQwRUNFQjRFNUMxOTU4MUVEOEM1NzY5OUY1NTlCOTgyOEJCRkUxNDc5NTJFMjg5RjBFMTcxQzlDNjAzMzVERDJGNDkyQ0I0MDlBNERCOTdCREY4NkUyREJBNjA1MDY0REIwNDBBM0RGNTY3OEUyNEY2NjcxOENBMTE1Qzk1Qzg5MkZGN0FFREZBQUJDMkU2NDE0NzE2Mjk4Q0VDMUE2MDQyNzBGRUFERjE5MUI3QzhBNTlDMjM4QzM5NUE2NTQ0MkMwQjk2M0JGODMwMjVCRUQzOTUxQTI3MUI3NDQwRUM3Njg3QzMxREU2MzM1NURBN0ZFQUMxNURDOTYyQzdCRjc2MTRFQjU5QjA3N0I5ODg5QUQ4NzAzREZFOThBQzk5NjE1QjcyMkEwQUJFODk5NTZEMTA1OEUwMjVDNzczMzQyMENCNTFEN0UxNjA4RUZGMkMwQTMwQzlBNUVCNzdDQ0EwMkM2QjAwQ0U3ODFCMTcyMDAxQzZDNDU4NjMwODkwMDYyRTI3Q0UzMDdENTEzQTc2ODZBNjlEMUQ1NDhERTgzMzRCMTMxMzZEOUU4NDJBNUUxN0ZENjc1MjJDOTM4MjNFMDNGMDhBRUU4MDI0QUY1RDg4QjJFRTAxRDREOTk4MDA4NEZBODA4MjRCCi0yMDA2MDgyODE0MTAyNCAyIDYgMTAwIDMwNzEgNSBEMzIzMEQyMzc1NzJFQ0U5RjkyMzU4NzE1RUJBQzNBNEQ4OUYyRDZCNERDMzlGMDU2NDUwMjYzQkVGMTY2NUZCRDdCOTM5MTZBQkM4NjdCNzA2NDgwMjE1OUQyNzNDN0VCMDFDNUY5MjgxQTNENkRDQ0I3Q0Y5OTdEMzg1OTk4RUMwRTFGQTMzMTlBRkU3NzFBOTBBREJBQ0VCNDE0QTAyMDYzMEQ3QzdGMTYxRkFGRUM2QzlGQzA2RDMyMDVDNzEyQUFFODg0OEExQjJDMjFERkYzMDFDN0ZGQzBCNzVEMTNGMDYwQTMxM0MzMkFGRUVBRjE0OTNGNjQxNzYwRUJFRjM4ODI5QjMzNzE2OTlEMkEzMjY0RDBFQ0VCNEU1QzE5NTgxRUQ4QzU3Njk5RjU1OUI5ODI4QkJGRTE0Nzk1MkUyODlGMEUxNzFDOUM2MDMzNUREMkY0OTJDQjQwOUE0REI5N0JERjg2RTJEQkE2MDUwNjREQjA0MEEzREY1Njc4RTI0RjY2NzE4Q0ExMTVDOTVDODkyRkY3QUVERkFBQkMyRTY0MTQ3MTYyOThDRUMxQTYwNDI3MEZFQURGMTkxQjdDOEE1OUMyMzhDMzk1QTY1NDQyQzBCOTYzQkY4MzAyNUJFRDM5NTFBMjcxQjc0NDBFQzc2ODdDMzFERTYzMzU1REE3RkVBQzE1REM5NjJDN0JGNzYxNEVCNTlCMDc3Qjk4ODlBRDg3MDNERkU5OEFDOTk2MTVCNzIyQTBBQkU4OTk1NkQxMDU4RTAyNUM3NzMzNDIwQ0I1MUQ3RTE2MDhFRkYyQzBBMzBDOUE1RUI3N0NDQTAyQzZCMDBDRTc4MUIxNzIwMDFDNkM0NTg2MzA4OTAwNjJFMjdDRTMwN0Q1MTNBNzY4NkE2OUQxRDU0OERFODMzNEIxMzEzNkQ5RTg0MkE1RTE3RkQ2NzUyMkM5MzgyM0UwM0YwOEFFRTgwMjRBRjVEODhCMkVFMDFENEQ5OTgwMDg0RkI2NTkwODcKLTIwMDYwODI4MTQyMDU5IDIgNiAxMDAgMzA3MSA1IEQzMjMwRDIzNzU3MkVDRTlGOTIzNTg3MTVFQkFDM0E0RDg5RjJENkI0REMzOUYwNTY0NTAyNjNCRUYxNjY1RkJEN0I5MzkxNkFCQzg2N0I3MDY0ODAyMTU5RDI3M0M3RUIwMUM1RjkyODFBM0Q2RENDQjdDRjk5N0QzODU5OThFQzBFMUZBMzMxOUFGRTc3MUE5MEFEQkFDRUI0MTRBMDIwNjMwRDdDN0YxNjFGQUZFQzZDOUZDMDZEMzIwNUM3MTJBQUU4ODQ4QTFCMkMyMURGRjMwMUM3RkZDMEI3NUQxM0YwNjBBMzEzQzMyQUZFRUFGMTQ5M0Y2NDE3NjBFQkVGMzg4MjlCMzM3MTY5OUQyQTMyNjREMEVDRUI0RTVDMTk1ODFFRDhDNTc2OTlGNTU5Qjk4MjhCQkZFMTQ3OTUyRTI4OUYwRTE3MUM5QzYwMzM1REQyRjQ5MkNCNDA5QTREQjk3QkRGODZFMkRCQTYwNTA2NERCMDQwQTNERjU2NzhFMjRGNjY3MThDQTExNUM5NUM4OTJGRjdBRURGQUFCQzJFNjQxNDcxNjI5OENFQzFBNjA0MjcwRkVBREYxOTFCN0M4QTU5QzIzOEMzOTVBNjU0NDJDMEI5NjNCRjgzMDI1QkVEMzk1MUEyNzFCNzQ0MEVDNzY4N0MzMURFNjMzNTVEQTdGRUFDMTVEQzk2MkM3QkY3NjE0RUI1OUIwNzdCOTg4OUFEODcwM0RGRTk4QUM5OTYxNUI3MjJBMEFCRTg5OTU2RDEwNThFMDI1Qzc3MzM0MjBDQjUxRDdFMTYwOEVGRjJDMEEzMEM5QTVFQjc3Q0NBMDJDNkIwMENFNzgxQjE3MjAwMUM2QzQ1ODYzMDg5MDA2MkUyN0NFMzA3RDUxM0E3Njg2QTY5RDFENTQ4REU4MzM0QjEzMTM2RDlFODQyQTVFMTdGRDY3NTIyQzkzODIzRTAzRjA4QUVFODAyNEFGNUQ4OEIyRUUwMUQ0RDk5ODAwODRGQjczOUU4RgotMjAwNjA4MjgxNzA1NTIgMiA2IDEwMCAzMDcxIDUgRDMyMzBEMjM3NTcyRUNFOUY5MjM1ODcxNUVCQUMzQTREODlGMkQ2QjREQzM5RjA1NjQ1MDI2M0JFRjE2NjVGQkQ3QjkzOTE2QUJDODY3QjcwNjQ4MDIxNTlEMjczQzdFQjAxQzVGOTI4MUEzRDZEQ0NCN0NGOTk3RDM4NTk5OEVDMEUxRkEzMzE5QUZFNzcxQTkwQURCQUNFQjQxNEEwMjA2MzBEN0M3RjE2MUZBRkVDNkM5RkMwNkQzMjA1QzcxMkFBRTg4NDhBMUIyQzIxREZGMzAxQzdGRkMwQjc1RDEzRjA2MEEzMTNDMzJBRkVFQUYxNDkzRjY0MTc2MEVCRUYzODgyOUIzMzcxNjk5RDJBMzI2NEQwRUNFQjRFNUMxOTU4MUVEOEM1NzY5OUY1NTlCOTgyOEJCRkUxNDc5NTJFMjg5RjBFMTcxQzlDNjAzMzVERDJGNDkyQ0I0MDlBNERCOTdCREY4NkUyREJBNjA1MDY0REIwNDBBM0RGNTY3OEUyNEY2NjcxOENBMTE1Qzk1Qzg5MkZGN0FFREZBQUJDMkU2NDE0NzE2Mjk4Q0VDMUE2MDQyNzBGRUFERjE5MUI3QzhBNTlDMjM4QzM5NUE2NTQ0MkMwQjk2M0JGODMwMjVCRUQzOTUxQTI3MUI3NDQwRUM3Njg3QzMxREU2MzM1NURBN0ZFQUMxNURDOTYyQzdCRjc2MTRFQjU5QjA3N0I5ODg5QUQ4NzAzREZFOThBQzk5NjE1QjcyMkEwQUJFODk5NTZEMTA1OEUwMjVDNzczMzQyMENCNTFEN0UxNjA4RUZGMkMwQTMwQzlBNUVCNzdDQ0EwMkM2QjAwQ0U3ODFCMTcyMDAxQzZDNDU4NjMwODkwMDYyRTI3Q0UzMDdENTEzQTc2ODZBNjlEMUQ1NDhERTgzMzRCMTMxMzZEOUU4NDJBNUUxN0ZENjc1MjJDOTM4MjNFMDNGMDhBRUU4MDI0QUY1RDg4QjJFRTAxRDREOTk4MDA4NEZDQzVDRTU3Ci0yMDA2MDgyODE3MTMyNyAyIDYgMTAwIDMwNzEgMiBEMzIzMEQyMzc1NzJFQ0U5RjkyMzU4NzE1RUJBQzNBNEQ4OUYyRDZCNERDMzlGMDU2NDUwMjYzQkVGMTY2NUZCRDdCOTM5MTZBQkM4NjdCNzA2NDgwMjE1OUQyNzNDN0VCMDFDNUY5MjgxQTNENkRDQ0I3Q0Y5OTdEMzg1OTk4RUMwRTFGQTMzMTlBRkU3NzFBOTBBREJBQ0VCNDE0QTAyMDYzMEQ3QzdGMTYxRkFGRUM2QzlGQzA2RDMyMDVDNzEyQUFFODg0OEExQjJDMjFERkYzMDFDN0ZGQzBCNzVEMTNGMDYwQTMxM0MzMkFGRUVBRjE0OTNGNjQxNzYwRUJFRjM4ODI5QjMzNzE2OTlEMkEzMjY0RDBFQ0VCNEU1QzE5NTgxRUQ4QzU3Njk5RjU1OUI5ODI4QkJGRTE0Nzk1MkUyODlGMEUxNzFDOUM2MDMzNUREMkY0OTJDQjQwOUE0REI5N0JERjg2RTJEQkE2MDUwNjREQjA0MEEzREY1Njc4RTI0RjY2NzE4Q0ExMTVDOTVDODkyRkY3QUVERkFBQkMyRTY0MTQ3MTYyOThDRUMxQTYwNDI3MEZFQURGMTkxQjdDOEE1OUMyMzhDMzk1QTY1NDQyQzBCOTYzQkY4MzAyNUJFRDM5NTFBMjcxQjc0NDBFQzc2ODdDMzFERTYzMzU1REE3RkVBQzE1REM5NjJDN0JGNzYxNEVCNTlCMDc3Qjk4ODlBRDg3MDNERkU5OEFDOTk2MTVCNzIyQTBBQkU4OTk1NkQxMDU4RTAyNUM3NzMzNDIwQ0I1MUQ3RTE2MDhFRkYyQzBBMzBDOUE1RUI3N0NDQTAyQzZCMDBDRTc4MUIxNzIwMDFDNkM0NTg2MzA4OTAwNjJFMjdDRTMwN0Q1MTNBNzY4NkE2OUQxRDU0OERFODMzNEIxMzEzNkQ5RTg0MkE1RTE3RkQ2NzUyMkM5MzgyM0UwM0YwOEFFRTgwMjRBRjVEODhCMkVFMDFENEQ5OTgwMDg0RkNDQ0Y5RDMKLTIwMDYwODI4MTg1OTQzIDIgNiAxMDAgMzA3MSA1IEQzMjMwRDIzNzU3MkVDRTlGOTIzNTg3MTVFQkFDM0E0RDg5RjJENkI0REMzOUYwNTY0NTAyNjNCRUYxNjY1RkJEN0I5MzkxNkFCQzg2N0I3MDY0ODAyMTU5RDI3M0M3RUIwMUM1RjkyODFBM0Q2RENDQjdDRjk5N0QzODU5OThFQzBFMUZBMzMxOUFGRTc3MUE5MEFEQkFDRUI0MTRBMDIwNjMwRDdDN0YxNjFGQUZFQzZDOUZDMDZEMzIwNUM3MTJBQUU4ODQ4QTFCMkMyMURGRjMwMUM3RkZDMEI3NUQxM0YwNjBBMzEzQzMyQUZFRUFGMTQ5M0Y2NDE3NjBFQkVGMzg4MjlCMzM3MTY5OUQyQTMyNjREMEVDRUI0RTVDMTk1ODFFRDhDNTc2OTlGNTU5Qjk4MjhCQkZFMTQ3OTUyRTI4OUYwRTE3MUM5QzYwMzM1REQyRjQ5MkNCNDA5QTREQjk3QkRGODZFMkRCQTYwNTA2NERCMDQwQTNERjU2NzhFMjRGNjY3MThDQTExNUM5NUM4OTJGRjdBRURGQUFCQzJFNjQxNDcxNjI5OENFQzFBNjA0MjcwRkVBREYxOTFCN0M4QTU5QzIzOEMzOTVBNjU0NDJDMEI5NjNCRjgzMDI1QkVEMzk1MUEyNzFCNzQ0MEVDNzY4N0MzMURFNjMzNTVEQTdGRUFDMTVEQzk2MkM3QkY3NjE0RUI1OUIwNzdCOTg4OUFEODcwM0RGRTk4QUM5OTYxNUI3MjJBMEFCRTg5OTU2RDEwNThFMDI1Qzc3MzM0MjBDQjUxRDdFMTYwOEVGRjJDMEEzMEM5QTVFQjc3Q0NBMDJDNkIwMENFNzgxQjE3MjAwMUM2QzQ1ODYzMDg5MDA2MkUyN0NFMzA3RDUxM0E3Njg2QTY5RDFENTQ4REU4MzM0QjEzMTM2RDlFODQyQTVFMTdGRDY3NTIyQzkzODIzRTAzRjA4QUVFODAyNEFGNUQ4OEIyRUUwMUQ0RDk5ODAwODRGREE2NzcyNwotMjAwNjA4MjgxOTA1MzcgMiA2IDEwMCAzMDcxIDIgRDMyMzBEMjM3NTcyRUNFOUY5MjM1ODcxNUVCQUMzQTREODlGMkQ2QjREQzM5RjA1NjQ1MDI2M0JFRjE2NjVGQkQ3QjkzOTE2QUJDODY3QjcwNjQ4MDIxNTlEMjczQzdFQjAxQzVGOTI4MUEzRDZEQ0NCN0NGOTk3RDM4NTk5OEVDMEUxRkEzMzE5QUZFNzcxQTkwQURCQUNFQjQxNEEwMjA2MzBEN0M3RjE2MUZBRkVDNkM5RkMwNkQzMjA1QzcxMkFBRTg4NDhBMUIyQzIxREZGMzAxQzdGRkMwQjc1RDEzRjA2MEEzMTNDMzJBRkVFQUYxNDkzRjY0MTc2MEVCRUYzODgyOUIzMzcxNjk5RDJBMzI2NEQwRUNFQjRFNUMxOTU4MUVEOEM1NzY5OUY1NTlCOTgyOEJCRkUxNDc5NTJFMjg5RjBFMTcxQzlDNjAzMzVERDJGNDkyQ0I0MDlBNERCOTdCREY4NkUyREJBNjA1MDY0REIwNDBBM0RGNTY3OEUyNEY2NjcxOENBMTE1Qzk1Qzg5MkZGN0FFREZBQUJDMkU2NDE0NzE2Mjk4Q0VDMUE2MDQyNzBGRUFERjE5MUI3QzhBNTlDMjM4QzM5NUE2NTQ0MkMwQjk2M0JGODMwMjVCRUQzOTUxQTI3MUI3NDQwRUM3Njg3QzMxREU2MzM1NURBN0ZFQUMxNURDOTYyQzdCRjc2MTRFQjU5QjA3N0I5ODg5QUQ4NzAzREZFOThBQzk5NjE1QjcyMkEwQUJFODk5NTZEMTA1OEUwMjVDNzczMzQyMENCNTFEN0UxNjA4RUZGMkMwQTMwQzlBNUVCNzdDQ0EwMkM2QjAwQ0U3ODFCMTcyMDAxQzZDNDU4NjMwODkwMDYyRTI3Q0UzMDdENTEzQTc2ODZBNjlEMUQ1NDhERTgzMzRCMTMxMzZEOUU4NDJBNUUxN0ZENjc1MjJDOTM4MjNFMDNGMDhBRUU4MDI0QUY1RDg4QjJFRTAxRDREOTk4MDA4NEZEQUFDNjczCi0yMDA2MDgyODE5MTIwMiAyIDYgMTAwIDMwNzEgNSBEMzIzMEQyMzc1NzJFQ0U5RjkyMzU4NzE1RUJBQzNBNEQ4OUYyRDZCNERDMzlGMDU2NDUwMjYzQkVGMTY2NUZCRDdCOTM5MTZBQkM4NjdCNzA2NDgwMjE1OUQyNzNDN0VCMDFDNUY5MjgxQTNENkRDQ0I3Q0Y5OTdEMzg1OTk4RUMwRTFGQTMzMTlBRkU3NzFBOTBBREJBQ0VCNDE0QTAyMDYzMEQ3QzdGMTYxRkFGRUM2QzlGQzA2RDMyMDVDNzEyQUFFODg0OEExQjJDMjFERkYzMDFDN0ZGQzBCNzVEMTNGMDYwQTMxM0MzMkFGRUVBRjE0OTNGNjQxNzYwRUJFRjM4ODI5QjMzNzE2OTlEMkEzMjY0RDBFQ0VCNEU1QzE5NTgxRUQ4QzU3Njk5RjU1OUI5ODI4QkJGRTE0Nzk1MkUyODlGMEUxNzFDOUM2MDMzNUREMkY0OTJDQjQwOUE0REI5N0JERjg2RTJEQkE2MDUwNjREQjA0MEEzREY1Njc4RTI0RjY2NzE4Q0ExMTVDOTVDODkyRkY3QUVERkFBQkMyRTY0MTQ3MTYyOThDRUMxQTYwNDI3MEZFQURGMTkxQjdDOEE1OUMyMzhDMzk1QTY1NDQyQzBCOTYzQkY4MzAyNUJFRDM5NTFBMjcxQjc0NDBFQzc2ODdDMzFERTYzMzU1REE3RkVBQzE1REM5NjJDN0JGNzYxNEVCNTlCMDc3Qjk4ODlBRDg3MDNERkU5OEFDOTk2MTVCNzIyQTBBQkU4OTk1NkQxMDU4RTAyNUM3NzMzNDIwQ0I1MUQ3RTE2MDhFRkYyQzBBMzBDOUE1RUI3N0NDQTAyQzZCMDBDRTc4MUIxNzIwMDFDNkM0NTg2MzA4OTAwNjJFMjdDRTMwN0Q1MTNBNzY4NkE2OUQxRDU0OERFODMzNEIxMzEzNkQ5RTg0MkE1RTE3RkQ2NzUyMkM5MzgyM0UwM0YwOEFFRTgwMjRBRjVEODhCMkVFMDFENEQ5OTgwMDg0RkRBRkM3MzcKLTIwMDYwODI4MTkyNjEzIDIgNiAxMDAgMzA3MSAyIEQzMjMwRDIzNzU3MkVDRTlGOTIzNTg3MTVFQkFDM0E0RDg5RjJENkI0REMzOUYwNTY0NTAyNjNCRUYxNjY1RkJEN0I5MzkxNkFCQzg2N0I3MDY0ODAyMTU5RDI3M0M3RUIwMUM1RjkyODFBM0Q2RENDQjdDRjk5N0QzODU5OThFQzBFMUZBMzMxOUFGRTc3MUE5MEFEQkFDRUI0MTRBMDIwNjMwRDdDN0YxNjFGQUZFQzZDOUZDMDZEMzIwNUM3MTJBQUU4ODQ4QTFCMkMyMURGRjMwMUM3RkZDMEI3NUQxM0YwNjBBMzEzQzMyQUZFRUFGMTQ5M0Y2NDE3NjBFQkVGMzg4MjlCMzM3MTY5OUQyQTMyNjREMEVDRUI0RTVDMTk1ODFFRDhDNTc2OTlGNTU5Qjk4MjhCQkZFMTQ3OTUyRTI4OUYwRTE3MUM5QzYwMzM1REQyRjQ5MkNCNDA5QTREQjk3QkRGODZFMkRCQTYwNTA2NERCMDQwQTNERjU2NzhFMjRGNjY3MThDQTExNUM5NUM4OTJGRjdBRURGQUFCQzJFNjQxNDcxNjI5OENFQzFBNjA0MjcwRkVBREYxOTFCN0M4QTU5QzIzOEMzOTVBNjU0NDJDMEI5NjNCRjgzMDI1QkVEMzk1MUEyNzFCNzQ0MEVDNzY4N0MzMURFNjMzNTVEQTdGRUFDMTVEQzk2MkM3QkY3NjE0RUI1OUIwNzdCOTg4OUFEODcwM0RGRTk4QUM5OTYxNUI3MjJBMEFCRTg5OTU2RDEwNThFMDI1Qzc3MzM0MjBDQjUxRDdFMTYwOEVGRjJDMEEzMEM5QTVFQjc3Q0NBMDJDNkIwMENFNzgxQjE3MjAwMUM2QzQ1ODYzMDg5MDA2MkUyN0NFMzA3RDUxM0E3Njg2QTY5RDFENTQ4REU4MzM0QjEzMTM2RDlFODQyQTVFMTdGRDY3NTIyQzkzODIzRTAzRjA4QUVFODAyNEFGNUQ4OEIyRUUwMUQ0RDk5ODAwODRGREM1MEZCQgotMjAwNjA4MjgxOTM3MzggMiA2IDEwMCAzMDcxIDUgRDMyMzBEMjM3NTcyRUNFOUY5MjM1ODcxNUVCQUMzQTREODlGMkQ2QjREQzM5RjA1NjQ1MDI2M0JFRjE2NjVGQkQ3QjkzOTE2QUJDODY3QjcwNjQ4MDIxNTlEMjczQzdFQjAxQzVGOTI4MUEzRDZEQ0NCN0NGOTk3RDM4NTk5OEVDMEUxRkEzMzE5QUZFNzcxQTkwQURCQUNFQjQxNEEwMjA2MzBEN0M3RjE2MUZBRkVDNkM5RkMwNkQzMjA1QzcxMkFBRTg4NDhBMUIyQzIxREZGMzAxQzdGRkMwQjc1RDEzRjA2MEEzMTNDMzJBRkVFQUYxNDkzRjY0MTc2MEVCRUYzODgyOUIzMzcxNjk5RDJBMzI2NEQwRUNFQjRFNUMxOTU4MUVEOEM1NzY5OUY1NTlCOTgyOEJCRkUxNDc5NTJFMjg5RjBFMTcxQzlDNjAzMzVERDJGNDkyQ0I0MDlBNERCOTdCREY4NkUyREJBNjA1MDY0REIwNDBBM0RGNTY3OEUyNEY2NjcxOENBMTE1Qzk1Qzg5MkZGN0FFREZBQUJDMkU2NDE0NzE2Mjk4Q0VDMUE2MDQyNzBGRUFERjE5MUI3QzhBNTlDMjM4QzM5NUE2NTQ0MkMwQjk2M0JGODMwMjVCRUQzOTUxQTI3MUI3NDQwRUM3Njg3QzMxREU2MzM1NURBN0ZFQUMxNURDOTYyQzdCRjc2MTRFQjU5QjA3N0I5ODg5QUQ4NzAzREZFOThBQzk5NjE1QjcyMkEwQUJFODk5NTZEMTA1OEUwMjVDNzczMzQyMENCNTFEN0UxNjA4RUZGMkMwQTMwQzlBNUVCNzdDQ0EwMkM2QjAwQ0U3ODFCMTcyMDAxQzZDNDU4NjMwODkwMDYyRTI3Q0UzMDdENTEzQTc2ODZBNjlEMUQ1NDhERTgzMzRCMTMxMzZEOUU4NDJBNUUxN0ZENjc1MjJDOTM4MjNFMDNGMDhBRUU4MDI0QUY1RDg4QjJFRTAxRDREOTk4MDA4NEZERDYwMjNGCi0yMDA2MDgyODIwNDkzNiAyIDYgMTAwIDMwNzEgNSBEMzIzMEQyMzc1NzJFQ0U5RjkyMzU4NzE1RUJBQzNBNEQ4OUYyRDZCNERDMzlGMDU2NDUwMjYzQkVGMTY2NUZCRDdCOTM5MTZBQkM4NjdCNzA2NDgwMjE1OUQyNzNDN0VCMDFDNUY5MjgxQTNENkRDQ0I3Q0Y5OTdEMzg1OTk4RUMwRTFGQTMzMTlBRkU3NzFBOTBBREJBQ0VCNDE0QTAyMDYzMEQ3QzdGMTYxRkFGRUM2QzlGQzA2RDMyMDVDNzEyQUFFODg0OEExQjJDMjFERkYzMDFDN0ZGQzBCNzVEMTNGMDYwQTMxM0MzMkFGRUVBRjE0OTNGNjQxNzYwRUJFRjM4ODI5QjMzNzE2OTlEMkEzMjY0RDBFQ0VCNEU1QzE5NTgxRUQ4QzU3Njk5RjU1OUI5ODI4QkJGRTE0Nzk1MkUyODlGMEUxNzFDOUM2MDMzNUREMkY0OTJDQjQwOUE0REI5N0JERjg2RTJEQkE2MDUwNjREQjA0MEEzREY1Njc4RTI0RjY2NzE4Q0ExMTVDOTVDODkyRkY3QUVERkFBQkMyRTY0MTQ3MTYyOThDRUMxQTYwNDI3MEZFQURGMTkxQjdDOEE1OUMyMzhDMzk1QTY1NDQyQzBCOTYzQkY4MzAyNUJFRDM5NTFBMjcxQjc0NDBFQzc2ODdDMzFERTYzMzU1REE3RkVBQzE1REM5NjJDN0JGNzYxNEVCNTlCMDc3Qjk4ODlBRDg3MDNERkU5OEFDOTk2MTVCNzIyQTBBQkU4OTk1NkQxMDU4RTAyNUM3NzMzNDIwQ0I1MUQ3RTE2MDhFRkYyQzBBMzBDOUE1RUI3N0NDQTAyQzZCMDBDRTc4MUIxNzIwMDFDNkM0NTg2MzA4OTAwNjJFMjdDRTMwN0Q1MTNBNzY4NkE2OUQxRDU0OERFODMzNEIxMzEzNkQ5RTg0MkE1RTE3RkQ2NzUyMkM5MzgyM0UwM0YwOEFFRTgwMjRBRjVEODhCMkVFMDFENEQ5OTgwMDg0RkU2ODQwNUYKLTIwMDYwODI5MDYzNDE2IDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1N0RFOTIyMkIKLTIwMDYwODI5MDgyMzI3IDIgNiAxMDAgNDA5NSA1IERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1N0U1Mzg1RTcKLTIwMDYwODI5MDkyMDEwIDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1N0U4NTAxQTMKLTIwMDYwODMwMDA0MjA0IDIgNiAxMDAgNDA5NSA1IERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1ODI1RjE4MEYKLTIwMDYwODMwMDEzNTIyIDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1ODI4REZBMkIKLTIwMDYwODMwMTI0NzA3IDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1ODU1NUM5RUIKLTIwMDYwODMwMTgwMzEyIDIgNiAxMDAgNDA5NSA1IERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1ODY5ODk0MzcKLTIwMDYwODMxMDQxMjA1IDIgNiAxMDAgNDA5NSA1IERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1ODkxMzM0QkYKLTIwMDYwODMxMTAyMzQxIDIgNiAxMDAgNDA5NSA1IERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OEE4RjhCMjcKLTIwMDYwODMxMjM0MDAxIDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OERENzI3OEIKLTIwMDYwOTAxMDMyMzUyIDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OEVCRTkzRUIKLTIwMDYwOTAxMDYxMzQ1IDIgNiAxMDAgNDA5NSA1IERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OEY2OTNBM0YKLTIwMDYwOTAxMTIzMDU1IDIgNiAxMDAgNDA5NSA1IERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OTBGODBBRTcKLTIwMDYwOTAxMTkxOTIyIDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OTI5OTRDNjMKLTIwMDYwOTAxMjAzOTU3IDIgNiAxMDAgNDA5NSA1IERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OTJFNUQ5MkYKLTIwMDYwOTAxMjEwMjUwIDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OTJGNEE1RjMKLTIwMDYwOTAxMjI1MDQ3IDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OTM1RDEyNEIKLTIwMDYwOTAyMDIwNjU3IDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OTQyNTIwQ0IKLTIwMDYwOTAyMDcwNjI0IDIgNiAxMDAgNDA5NSA1IERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OTU1M0UwM0YKLTIwMDYwOTAyMDk1MzAwIDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OTVGNkVDNkIKLTIwMDYwOTAyMTEzMzA2IDIgNiAxMDAgNDA5NSA1IERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OTY1OTlCRUYKLTIwMDYwOTAyMTQyMzAyIDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OTcwMzU4MkIKLTIwMDYwOTAyMjEwODM5IDIgNiAxMDAgNDA5NSA1IERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OThBNjk1RjcKLTIwMDYwOTAzMDczMzI1IDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OUIzMTVFOUIKLTIwMDYwOTAzMDk1NjI2IDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OUJCRDcxNTMKLTIwMDYwOTAzMTYyNjAxIDIgNiAxMDAgNDA5NSAyIERBMTEwODQ3MzE0QjUzNzUzOUYyQTIwNjgxMjEyQTBCMkVEMjY0QkYxRjI1OTVCODE3Q0M1MTZENUFBNDIxMTU4NTk0OEIyNDhGNzcyNzdCMTFBQjIwNjczOEM3MUI1RkIyRkNDNDA0MTkyN0I0MEI5ODUyODI3OTVBODlFRjY2QkRCMTExRTFEMDdENzkwQUM0ODdEQTU4NDFCNjZGQzQwN0VENUREODYxMjcwMzEzNjQyMkM0NDIxMzlDMTIwNDBDRTc3NkZFQjZDOEI1OUI5NTQwOEYzMUZCNTAwNzNBRDU0QjAzRjk3MTEzRTYxQkU1NzdFNzZEMTNBQTk3MUJBODJDRUU2MjFDMzFDNDc3MEE3RTA3NjI0NUExNjY4OUE5RkUzRTkxOTBGQjYxN0ZCMzMwQUE3MEFBQzYyM0I0NDdEMTg1OEMyNDk5M0Q0ODZDMkI5QTNDNjNGRkNCM0YyMzBFNzE4NUYxNjNDMUVFRDQzNEMyNEVFMTFFQUM1QjIzNjlGRUFGNzkwNTIzQkQ4QkY3RThGOUM4NzQ2N0VENkM4OUU1NTk2OTc0RENBNjk2MEU1MzcyNTlFQTNBQTU4N0JGNTE5OEIyNkNFMzc2MzhCQzU3MDEyODUxOTAzQkI0Q0MwRTJBMjhFQzc0MUVFQ0I2MjIwNTU2RUM1QzExOEFFMDE0MkU1Mzc0QUUyQTNEMUNFRjE2NUMwOUMwOTg4QTM3ODc3QkNBNkJCQ0FFMjhENTJEQTY3MDFCRjA3NzMwNzE5NUMzNjE4RDRDQUM1OERERjY0QjZBOEMyQkY4RTJGRENDMDg0MDk3M0E4RUQxRjg0MTM2ODlCRTA1RUE1NEFCNkNEMzA0NjRGOTRERDkyNkQ4Q0VDNkI1NjcwNEY1MzRDNkQ4MzI5QTI3RUNBRDk4MzY3MjFCQzBDMjgzRTYzQ0RBNTRGQ0VBODUxQzAyMDNFNzQ3QkIwMkI3NUM5MjAzNjkyOEVGQzIwMUZGQ0JCNzQ3QTJFMDkzQ0NFRDE1N0MzQzNGNzQyNThENTYwN0I2QjhBQTMzMERFQ0NGNDJBNzNBNkY4MUQzMDBCQUZDQTkyMUJBRkY2MzVERkM5MDgyNDkzOEY3NDU0QjI1OEMxOTY3RkY5MEMxRDgyOEUwMjhGOUZBODZBQTdCMjg3QTg3RUM3NTBFRENFQ0VFRUMyMjNFQUVBNzg1MTFDQjNDMDEzMDA0Mzk1MDQ3ODczN0ZERjZENTZFQTJCNzA1RDVFNEM1NzcwMUU5NTVBOUM4NjJEQkNBRjM2RDA2MjREMkYyQzIwNjE2QUEzRTA0NzhBNEE3MjJCQkE1NzdCQzAyNTc4RUU1OUQ0OEFFRTMKLTIwMDQwMzA1MDExNTE4IDIgNiAxMDAgNjE0MyAyIEU5NUE0MTMxRjg2MjM0RDI3RUUxRTUxNzkxNTk5NTU5RUVEQjYxODkxMkU0RkUzNkI4MUI4MENEQTRENDk3OTU5REJGQUVFOTI5MzE3QTY2QkU2NEEzMjhCQUI2MTgzRUE1QTVDQkIzNTgxNDkwQjRCNjEzQjIyNUFERDAwRUZEMzg1NDAzNTZFMEY0NzE2MjI5Q0REQjI2MDI4M0FGMDQ0RkRBRjFFRjkyNDhCQjBDRTkwMzFDMTE3Q0YxNUQzMjU5QjNFN0IwMzAxQ0ExQUFDOTFBRkE3QTU3Q0NERUVEMkRBNEVGQzJEQkM3QTlGQzUzQkI0RDNDQjJENTdEMjA5RDVEREVGMjVERTE0RjgyMjY0MDQyOTZCRDUwNEVDMTRGNjM0MEYwQUEyQTFBOTQzQjk1NTJDNEI5MUQzRUI0OEMwOEExMzY3MUMzNkVFNTA0Mjg1NzYyNUREMkNCNTg5NjVDMDk3NUVCNzc1MDU3RkY4MkJDMkI4QjY5RDBCRjI2RTJGODAxMTVCM0UxQTk4NEQxRDczRDlEMDJBRDY5QzNBMUFGOTBFQzkxNURFNkZDOUY1NzRCRDc1NUIyRUY2QkJFNjJGMzcxN0UxMjhEQzc5N0EwNkZFMzVDMUMyOENFRDU3QTBGNjRGNjFBNDQzOUFDRkU3QTdCOTVBMUE5NDg0MTdBNUI4QjY5OTE2QTMyOTg5QjAwRTJDM0ZCN0M3NDEzOUE0REE5RTUzM0M0MzlFNTlGQzdDNEY5MDc4MEQyQkJDREYwMTJDNDk5QzE1QTFFMEI1QzMxOEY4NEZCMTdERjk3QUIzRUMzNTZGRDAwNzJDRkEzODg0RUZCRUQzMTkwMDlERTZEQkYyQTVDN0M4N0E5M0RFQjA0Q0NEOTE0N0VGOEM5QkVDMkZENzEzNzkzRTRGMEJGOEM0RUZDRUJGQkY5NUQ1NTVFNTIzQUI1RDc0MjgwOEM0RTQyNTk3OUExQzIxNkM4Q0IyQjQyQzc3MTVCOENBNTkwN0U4NEU2RkJDMzVEQTdCRkJGQzg5Mjg3MEI2NTlDODgyQzZFMzY5N0UwRENDNkMyNDc3MUYyNkQ1MUE4OTA3ODZEQTUxNkRCQzJEMTYxNjgwQjEzNEYxNzE1QjMyRjczNEU2Njc2NTAzOThFQzIyNDFBRjc4ODc3QkIzRDYxRDgzRDAxNThEREU4OTQ4NjJFRTZFMUJFRTI3ODcyNEVBN0IzNEM3NEYwQTVENkI3Rjc5RjEzMjJFMjBBRDU3NTdFMTFEOUFDMzFCRkUyN0M1NkFCQjIzQTI3NTEzMDUzMzQzM0RDNDFEREJBMTA4MUUzQTAxOEUwRDBCNTVERjMzRUNBRTEwNDkwOURDNzRGMUNBMjI1NkNGRDQyM0E4NTlCMEFDMjExMkEwQUU2ODQzOTZDMDAyOUFEMDdEMEQzMEFDODRGRkQyQzJFODBCNzRERTI5MzEwRkNBRkU3RDBDQjg4NjQ3MjlCNkZEMUY4NjA1MkQ3REQ5QTlDQjA4NUExODYyNTlBNjdDMTc1QjNGODFDNURBMTlBRkVEMUJGOUM1QzA3RjQwQTI5RUQ0N0VENEYxQzdERTg3OEI4NDExRTMyMzlFRDE1QUMwRTRDQ0MxRDdGODg0MkU5RkQ5Qzk4OUYzMDFFMjY4OUY4MDBDM0QxNEEzODgxMDkwNkEzNkVFQTM0MjA3MDE0RTk5Qzg0M0M1OTlENTZGQ0ZCQzE0Mjc4QTJBMDA5QzEzQjZFNEFDNzQ2MEI1NEQyQzdFRjM4RDcyQUM0NTA1NDAwOTdEMkFGNjA5RDNGRkY4NzREMTQ1ODJGQThGRjIxMDI3REVDOTI4NDRCRDIyQTlBN0VDMTRDNjZCQ0M4REIxRTA1OEI5NUFGODdBQ0I2MEE1NzI1NzY3QTc2QzkxODU3NDRFNDgzQkNDRDkyNzhFRDlGRjE1QTA0MDYxRDBGNkUzMkQ5OEI2ODUzQTM5QUE0OTg2NzNDN0REMDEyOTgyQjE5MTNCM0MzQ0UyQzcwODBFNENFOTc0QgotMjAwNDAzMDUwNDMxMjQgMiA2IDEwMCA2MTQzIDIgRTk1QTQxMzFGODYyMzREMjdFRTFFNTE3OTE1OTk1NTlFRURCNjE4OTEyRTRGRTM2QjgxQjgwQ0RBNEQ0OTc5NTlEQkZBRUU5MjkzMTdBNjZCRTY0QTMyOEJBQjYxODNFQTVBNUNCQjM1ODE0OTBCNEI2MTNCMjI1QUREMDBFRkQzODU0MDM1NkUwRjQ3MTYyMjlDRERCMjYwMjgzQUYwNDRGREFGMUVGOTI0OEJCMENFOTAzMUMxMTdDRjE1RDMyNTlCM0U3QjAzMDFDQTFBQUM5MUFGQTdBNTdDQ0RFRUQyREE0RUZDMkRCQzdBOUZDNTNCQjREM0NCMkQ1N0QyMDlENURERUYyNURFMTRGODIyNjQwNDI5NkJENTA0RUMxNEY2MzQwRjBBQTJBMUE5NDNCOTU1MkM0QjkxRDNFQjQ4QzA4QTEzNjcxQzM2RUU1MDQyODU3NjI1REQyQ0I1ODk2NUMwOTc1RUI3NzUwNTdGRjgyQkMyQjhCNjlEMEJGMjZFMkY4MDExNUIzRTFBOTg0RDFENzNEOUQwMkFENjlDM0ExQUY5MEVDOTE1REU2RkM5RjU3NEJENzU1QjJFRjZCQkU2MkYzNzE3RTEyOERDNzk3QTA2RkUzNUMxQzI4Q0VENTdBMEY2NEY2MUE0NDM5QUNGRTdBN0I5NUExQTk0ODQxN0E1QjhCNjk5MTZBMzI5ODlCMDBFMkMzRkI3Qzc0MTM5QTREQTlFNTMzQzQzOUU1OUZDN0M0RjkwNzgwRDJCQkNERjAxMkM0OTlDMTVBMUUwQjVDMzE4Rjg0RkIxN0RGOTdBQjNFQzM1NkZEMDA3MkNGQTM4ODRFRkJFRDMxOTAwOURFNkRCRjJBNUM3Qzg3QTkzREVCMDRDQ0Q5MTQ3RUY4QzlCRUMyRkQ3MTM3OTNFNEYwQkY4QzRFRkNFQkZCRjk1RDU1NUU1MjNBQjVENzQyODA4QzRFNDI1OTc5QTFDMjE2QzhDQjJCNDJDNzcxNUI4Q0E1OTA3RTg0RTZGQkMzNURBN0JGQkZDODkyODcwQjY1OUM4ODJDNkUzNjk3RTBEQ0M2QzI0NzcxRjI2RDUxQTg5MDc4NkRBNTE2REJDMkQxNjE2ODBCMTM0RjE3MTVCMzJGNzM0RTY2NzY1MDM5OEVDMjI0MUFGNzg4NzdCQjNENjFEODNEMDE1OERERTg5NDg2MkVFNkUxQkVFMjc4NzI0RUE3QjM0Qzc0RjBBNUQ2QjdGNzlGMTMyMkUyMEFENTc1N0UxMUQ5QUMzMUJGRTI3QzU2QUJCMjNBMjc1MTMwNTMzNDMzREM0MUREQkExMDgxRTNBMDE4RTBEMEI1NURGMzNFQ0FFMTA0OTA5REM3NEYxQ0EyMjU2Q0ZENDIzQTg1OUIwQUMyMTEyQTBBRTY4NDM5NkMwMDI5QUQwN0QwRDMwQUM4NEZGRDJDMkU4MEI3NERFMjkzMTBGQ0FGRTdEMENCODg2NDcyOUI2RkQxRjg2MDUyRDdERDlBOUNCMDg1QTE4NjI1OUE2N0MxNzVCM0Y4MUM1REExOUFGRUQxQkY5QzVDMDdGNDBBMjlFRDQ3RUQ0RjFDN0RFODc4Qjg0MTFFMzIzOUVEMTVBQzBFNENDQzFEN0Y4ODQyRTlGRDlDOTg5RjMwMUUyNjg5RjgwMEMzRDE0QTM4ODEwOTA2QTM2RUVBMzQyMDcwMTRFOTlDODQzQzU5OUQ1NkZDRkJDMTQyNzhBMkEwMDlDMTNCNkU0QUM3NDYwQjU0RDJDN0VGMzhENzJBQzQ1MDU0MDA5N0QyQUY2MDlEM0ZGRjg3NEQxNDU4MkZBOEZGMjEwMjdERUM5Mjg0NEJEMjJBOUE3RUMxNEM2NkJDQzhEQjFFMDU4Qjk1QUY4N0FDQjYwQTU3MjU3NjdBNzZDOTE4NTc0NEU0ODNCQ0NEOTI3OEVEOUZGMTVBMDQwNjFEMEY2RTMyRDk4QjY4NTNBMzlBQTQ5ODY3M0M3REQwMTI5ODJCMTkxM0IzQzNDRTJDNzA4MEU1MDUwOTMzCi0yMDA0MDMwNTA4NDcyOCAyIDYgMTAwIDYxNDMgMiBFOTVBNDEzMUY4NjIzNEQyN0VFMUU1MTc5MTU5OTU1OUVFREI2MTg5MTJFNEZFMzZCODFCODBDREE0RDQ5Nzk1OURCRkFFRTkyOTMxN0E2NkJFNjRBMzI4QkFCNjE4M0VBNUE1Q0JCMzU4MTQ5MEI0QjYxM0IyMjVBREQwMEVGRDM4NTQwMzU2RTBGNDcxNjIyOUNEREIyNjAyODNBRjA0NEZEQUYxRUY5MjQ4QkIwQ0U5MDMxQzExN0NGMTVEMzI1OUIzRTdCMDMwMUNBMUFBQzkxQUZBN0E1N0NDREVFRDJEQTRFRkMyREJDN0E5RkM1M0JCNEQzQ0IyRDU3RDIwOUQ1RERFRjI1REUxNEY4MjI2NDA0Mjk2QkQ1MDRFQzE0RjYzNDBGMEFBMkExQTk0M0I5NTUyQzRCOTFEM0VCNDhDMDhBMTM2NzFDMzZFRTUwNDI4NTc2MjVERDJDQjU4OTY1QzA5NzVFQjc3NTA1N0ZGODJCQzJCOEI2OUQwQkYyNkUyRjgwMTE1QjNFMUE5ODREMUQ3M0Q5RDAyQUQ2OUMzQTFBRjkwRUM5MTVERTZGQzlGNTc0QkQ3NTVCMkVGNkJCRTYyRjM3MTdFMTI4REM3OTdBMDZGRTM1QzFDMjhDRUQ1N0EwRjY0RjYxQTQ0MzlBQ0ZFN0E3Qjk1QTFBOTQ4NDE3QTVCOEI2OTkxNkEzMjk4OUIwMEUyQzNGQjdDNzQxMzlBNERBOUU1MzNDNDM5RTU5RkM3QzRGOTA3ODBEMkJCQ0RGMDEyQzQ5OUMxNUExRTBCNUMzMThGODRGQjE3REY5N0FCM0VDMzU2RkQwMDcyQ0ZBMzg4NEVGQkVEMzE5MDA5REU2REJGMkE1QzdDODdBOTNERUIwNENDRDkxNDdFRjhDOUJFQzJGRDcxMzc5M0U0RjBCRjhDNEVGQ0VCRkJGOTVENTU1RTUyM0FCNUQ3NDI4MDhDNEU0MjU5NzlBMUMyMTZDOENCMkI0MkM3NzE1QjhDQTU5MDdFODRFNkZCQzM1REE3QkZCRkM4OTI4NzBCNjU5Qzg4MkM2RTM2OTdFMERDQzZDMjQ3NzFGMjZENTFBODkwNzg2REE1MTZEQkMyRDE2MTY4MEIxMzRGMTcxNUIzMkY3MzRFNjY3NjUwMzk4RUMyMjQxQUY3ODg3N0JCM0Q2MUQ4M0QwMTU4RERFODk0ODYyRUU2RTFCRUUyNzg3MjRFQTdCMzRDNzRGMEE1RDZCN0Y3OUYxMzIyRTIwQUQ1NzU3RTExRDlBQzMxQkZFMjdDNTZBQkIyM0EyNzUxMzA1MzM0MzNEQzQxRERCQTEwODFFM0EwMThFMEQwQjU1REYzM0VDQUUxMDQ5MDlEQzc0RjFDQTIyNTZDRkQ0MjNBODU5QjBBQzIxMTJBMEFFNjg0Mzk2QzAwMjlBRDA3RDBEMzBBQzg0RkZEMkMyRTgwQjc0REUyOTMxMEZDQUZFN0QwQ0I4ODY0NzI5QjZGRDFGODYwNTJEN0REOUE5Q0IwODVBMTg2MjU5QTY3QzE3NUIzRjgxQzVEQTE5QUZFRDFCRjlDNUMwN0Y0MEEyOUVENDdFRDRGMUM3REU4NzhCODQxMUUzMjM5RUQxNUFDMEU0Q0NDMUQ3Rjg4NDJFOUZEOUM5ODlGMzAxRTI2ODlGODAwQzNEMTRBMzg4MTA5MDZBMzZFRUEzNDIwNzAxNEU5OUM4NDNDNTk5RDU2RkNGQkMxNDI3OEEyQTAwOUMxM0I2RTRBQzc0NjBCNTREMkM3RUYzOEQ3MkFDNDUwNTQwMDk3RDJBRjYwOUQzRkZGODc0RDE0NTgyRkE4RkYyMTAyN0RFQzkyODQ0QkQyMkE5QTdFQzE0QzY2QkNDOERCMUUwNThCOTVBRjg3QUNCNjBBNTcyNTc2N0E3NkM5MTg1NzQ0RTQ4M0JDQ0Q5Mjc4RUQ5RkYxNUEwNDA2MUQwRjZFMzJEOThCNjg1M0EzOUFBNDk4NjczQzdERDAxMjk4MkIxOTEzQjNDM0NFMkM3MDgwRTU0Qzc3ODMKLTIwMDQwMzA2MjA1MzUwIDIgNiAxMDAgNjE0MyAyIEU5NUE0MTMxRjg2MjM0RDI3RUUxRTUxNzkxNTk5NTU5RUVEQjYxODkxMkU0RkUzNkI4MUI4MENEQTRENDk3OTU5REJGQUVFOTI5MzE3QTY2QkU2NEEzMjhCQUI2MTgzRUE1QTVDQkIzNTgxNDkwQjRCNjEzQjIyNUFERDAwRUZEMzg1NDAzNTZFMEY0NzE2MjI5Q0REQjI2MDI4M0FGMDQ0RkRBRjFFRjkyNDhCQjBDRTkwMzFDMTE3Q0YxNUQzMjU5QjNFN0IwMzAxQ0ExQUFDOTFBRkE3QTU3Q0NERUVEMkRBNEVGQzJEQkM3QTlGQzUzQkI0RDNDQjJENTdEMjA5RDVEREVGMjVERTE0RjgyMjY0MDQyOTZCRDUwNEVDMTRGNjM0MEYwQUEyQTFBOTQzQjk1NTJDNEI5MUQzRUI0OEMwOEExMzY3MUMzNkVFNTA0Mjg1NzYyNUREMkNCNTg5NjVDMDk3NUVCNzc1MDU3RkY4MkJDMkI4QjY5RDBCRjI2RTJGODAxMTVCM0UxQTk4NEQxRDczRDlEMDJBRDY5QzNBMUFGOTBFQzkxNURFNkZDOUY1NzRCRDc1NUIyRUY2QkJFNjJGMzcxN0UxMjhEQzc5N0EwNkZFMzVDMUMyOENFRDU3QTBGNjRGNjFBNDQzOUFDRkU3QTdCOTVBMUE5NDg0MTdBNUI4QjY5OTE2QTMyOTg5QjAwRTJDM0ZCN0M3NDEzOUE0REE5RTUzM0M0MzlFNTlGQzdDNEY5MDc4MEQyQkJDREYwMTJDNDk5QzE1QTFFMEI1QzMxOEY4NEZCMTdERjk3QUIzRUMzNTZGRDAwNzJDRkEzODg0RUZCRUQzMTkwMDlERTZEQkYyQTVDN0M4N0E5M0RFQjA0Q0NEOTE0N0VGOEM5QkVDMkZENzEzNzkzRTRGMEJGOEM0RUZDRUJGQkY5NUQ1NTVFNTIzQUI1RDc0MjgwOEM0RTQyNTk3OUExQzIxNkM4Q0IyQjQyQzc3MTVCOENBNTkwN0U4NEU2RkJDMzVEQTdCRkJGQzg5Mjg3MEI2NTlDODgyQzZFMzY5N0UwRENDNkMyNDc3MUYyNkQ1MUE4OTA3ODZEQTUxNkRCQzJEMTYxNjgwQjEzNEYxNzE1QjMyRjczNEU2Njc2NTAzOThFQzIyNDFBRjc4ODc3QkIzRDYxRDgzRDAxNThEREU4OTQ4NjJFRTZFMUJFRTI3ODcyNEVBN0IzNEM3NEYwQTVENkI3Rjc5RjEzMjJFMjBBRDU3NTdFMTFEOUFDMzFCRkUyN0M1NkFCQjIzQTI3NTEzMDUzMzQzM0RDNDFEREJBMTA4MUUzQTAxOEUwRDBCNTVERjMzRUNBRTEwNDkwOURDNzRGMUNBMjI1NkNGRDQyM0E4NTlCMEFDMjExMkEwQUU2ODQzOTZDMDAyOUFEMDdEMEQzMEFDODRGRkQyQzJFODBCNzRERTI5MzEwRkNBRkU3RDBDQjg4NjQ3MjlCNkZEMUY4NjA1MkQ3REQ5QTlDQjA4NUExODYyNTlBNjdDMTc1QjNGODFDNURBMTlBRkVEMUJGOUM1QzA3RjQwQTI5RUQ0N0VENEYxQzdERTg3OEI4NDExRTMyMzlFRDE1QUMwRTRDQ0MxRDdGODg0MkU5RkQ5Qzk4OUYzMDFFMjY4OUY4MDBDM0QxNEEzODgxMDkwNkEzNkVFQTM0MjA3MDE0RTk5Qzg0M0M1OTlENTZGQ0ZCQzE0Mjc4QTJBMDA5QzEzQjZFNEFDNzQ2MEI1NEQyQzdFRjM4RDcyQUM0NTA1NDAwOTdEMkFGNjA5RDNGRkY4NzREMTQ1ODJGQThGRjIxMDI3REVDOTI4NDRCRDIyQTlBN0VDMTRDNjZCQ0M4REIxRTA1OEI5NUFGODdBQ0I2MEE1NzI1NzY3QTc2QzkxODU3NDRFNDgzQkNDRDkyNzhFRDlGRjE1QTA0MDYxRDBGNkUzMkQ5OEI2ODUzQTM5QUE0OTg2NzNDN0REMDEyOTgyQjE5MTNCM0MzQ0UyQzcwODBFODA5QzQxMwotMjAwNDAzMDkyMjEzMzMgMiA2IDEwMCA2MTQzIDIgRTk1QTQxMzFGODYyMzREMjdFRTFFNTE3OTE1OTk1NTlFRURCNjE4OTEyRTRGRTM2QjgxQjgwQ0RBNEQ0OTc5NTlEQkZBRUU5MjkzMTdBNjZCRTY0QTMyOEJBQjYxODNFQTVBNUNCQjM1ODE0OTBCNEI2MTNCMjI1QUREMDBFRkQzODU0MDM1NkUwRjQ3MTYyMjlDRERCMjYwMjgzQUYwNDRGREFGMUVGOTI0OEJCMENFOTAzMUMxMTdDRjE1RDMyNTlCM0U3QjAzMDFDQTFBQUM5MUFGQTdBNTdDQ0RFRUQyREE0RUZDMkRCQzdBOUZDNTNCQjREM0NCMkQ1N0QyMDlENURERUYyNURFMTRGODIyNjQwNDI5NkJENTA0RUMxNEY2MzQwRjBBQTJBMUE5NDNCOTU1MkM0QjkxRDNFQjQ4QzA4QTEzNjcxQzM2RUU1MDQyODU3NjI1REQyQ0I1ODk2NUMwOTc1RUI3NzUwNTdGRjgyQkMyQjhCNjlEMEJGMjZFMkY4MDExNUIzRTFBOTg0RDFENzNEOUQwMkFENjlDM0ExQUY5MEVDOTE1REU2RkM5RjU3NEJENzU1QjJFRjZCQkU2MkYzNzE3RTEyOERDNzk3QTA2RkUzNUMxQzI4Q0VENTdBMEY2NEY2MUE0NDM5QUNGRTdBN0I5NUExQTk0ODQxN0E1QjhCNjk5MTZBMzI5ODlCMDBFMkMzRkI3Qzc0MTM5QTREQTlFNTMzQzQzOUU1OUZDN0M0RjkwNzgwRDJCQkNERjAxMkM0OTlDMTVBMUUwQjVDMzE4Rjg0RkIxN0RGOTdBQjNFQzM1NkZEMDA3MkNGQTM4ODRFRkJFRDMxOTAwOURFNkRCRjJBNUM3Qzg3QTkzREVCMDRDQ0Q5MTQ3RUY4QzlCRUMyRkQ3MTM3OTNFNEYwQkY4QzRFRkNFQkZCRjk1RDU1NUU1MjNBQjVENzQyODA4QzRFNDI1OTc5QTFDMjE2QzhDQjJCNDJDNzcxNUI4Q0E1OTA3RTg0RTZGQkMzNURBN0JGQkZDODkyODcwQjY1OUM4ODJDNkUzNjk3RTBEQ0M2QzI0NzcxRjI2RDUxQTg5MDc4NkRBNTE2REJDMkQxNjE2ODBCMTM0RjE3MTVCMzJGNzM0RTY2NzY1MDM5OEVDMjI0MUFGNzg4NzdCQjNENjFEODNEMDE1OERERTg5NDg2MkVFNkUxQkVFMjc4NzI0RUE3QjM0Qzc0RjBBNUQ2QjdGNzlGMTMyMkUyMEFENTc1N0UxMUQ5QUMzMUJGRTI3QzU2QUJCMjNBMjc1MTMwNTMzNDMzREM0MUREQkExMDgxRTNBMDE4RTBEMEI1NURGMzNFQ0FFMTA0OTA5REM3NEYxQ0EyMjU2Q0ZENDIzQTg1OUIwQUMyMTEyQTBBRTY4NDM5NkMwMDI5QUQwN0QwRDMwQUM4NEZGRDJDMkU4MEI3NERFMjkzMTBGQ0FGRTdEMENCODg2NDcyOUI2RkQxRjg2MDUyRDdERDlBOUNCMDg1QTE4NjI1OUE2N0MxNzVCM0Y4MUM1REExOUFGRUQxQkY5QzVDMDdGNDBBMjlFRDQ3RUQ0RjFDN0RFODc4Qjg0MTFFMzIzOUVEMTVBQzBFNENDQzFEN0Y4ODQyRTlGRDlDOTg5RjMwMUUyNjg5RjgwMEMzRDE0QTM4ODEwOTA2QTM2RUVBMzQyMDcwMTRFOTlDODQzQzU5OUQ1NkZDRkJDMTQyNzhBMkEwMDlDMTNCNkU0QUM3NDYwQjU0RDJDN0VGMzhENzJBQzQ1MDU0MDA5N0QyQUY2MDlEM0ZGRjg3NEQxNDU4MkZBOEZGMjEwMjdERUM5Mjg0NEJEMjJBOUE3RUMxNEM2NkJDQzhEQjFFMDU4Qjk1QUY4N0FDQjYwQTU3MjU3NjdBNzZDOTE4NTc0NEU0ODNCQ0NEOTI3OEVEOUZGMTVBMDQwNjFEMEY2RTMyRDk4QjY4NTNBMzlBQTQ5ODY3M0M3REQwMTI5ODJCMTkxM0IzQzNDRTJDNzA4MEVEN0Y5Q0ZCCi0yMDA0MDMxMTIyMjA1OSAyIDYgMTAwIDYxNDMgNSBFOTVBNDEzMUY4NjIzNEQyN0VFMUU1MTc5MTU5OTU1OUVFREI2MTg5MTJFNEZFMzZCODFCODBDREE0RDQ5Nzk1OURCRkFFRTkyOTMxN0E2NkJFNjRBMzI4QkFCNjE4M0VBNUE1Q0JCMzU4MTQ5MEI0QjYxM0IyMjVBREQwMEVGRDM4NTQwMzU2RTBGNDcxNjIyOUNEREIyNjAyODNBRjA0NEZEQUYxRUY5MjQ4QkIwQ0U5MDMxQzExN0NGMTVEMzI1OUIzRTdCMDMwMUNBMUFBQzkxQUZBN0E1N0NDREVFRDJEQTRFRkMyREJDN0E5RkM1M0JCNEQzQ0IyRDU3RDIwOUQ1RERFRjI1REUxNEY4MjI2NDA0Mjk2QkQ1MDRFQzE0RjYzNDBGMEFBMkExQTk0M0I5NTUyQzRCOTFEM0VCNDhDMDhBMTM2NzFDMzZFRTUwNDI4NTc2MjVERDJDQjU4OTY1QzA5NzVFQjc3NTA1N0ZGODJCQzJCOEI2OUQwQkYyNkUyRjgwMTE1QjNFMUE5ODREMUQ3M0Q5RDAyQUQ2OUMzQTFBRjkwRUM5MTVERTZGQzlGNTc0QkQ3NTVCMkVGNkJCRTYyRjM3MTdFMTI4REM3OTdBMDZGRTM1QzFDMjhDRUQ1N0EwRjY0RjYxQTQ0MzlBQ0ZFN0E3Qjk1QTFBOTQ4NDE3QTVCOEI2OTkxNkEzMjk4OUIwMEUyQzNGQjdDNzQxMzlBNERBOUU1MzNDNDM5RTU5RkM3QzRGOTA3ODBEMkJCQ0RGMDEyQzQ5OUMxNUExRTBCNUMzMThGODRGQjE3REY5N0FCM0VDMzU2RkQwMDcyQ0ZBMzg4NEVGQkVEMzE5MDA5REU2REJGMkE1QzdDODdBOTNERUIwNENDRDkxNDdFRjhDOUJFQzJGRDcxMzc5M0U0RjBCRjhDNEVGQ0VCRkJGOTVENTU1RTUyM0FCNUQ3NDI4MDhDNEU0MjU5NzlBMUMyMTZDOENCMkI0MkM3NzE1QjhDQTU5MDdFODRFNkZCQzM1REE3QkZCRkM4OTI4NzBCNjU5Qzg4MkM2RTM2OTdFMERDQzZDMjQ3NzFGMjZENTFBODkwNzg2REE1MTZEQkMyRDE2MTY4MEIxMzRGMTcxNUIzMkY3MzRFNjY3NjUwMzk4RUMyMjQxQUY3ODg3N0JCM0Q2MUQ4M0QwMTU4RERFODk0ODYyRUU2RTFCRUUyNzg3MjRFQTdCMzRDNzRGMEE1RDZCN0Y3OUYxMzIyRTIwQUQ1NzU3RTExRDlBQzMxQkZFMjdDNTZBQkIyM0EyNzUxMzA1MzM0MzNEQzQxRERCQTEwODFFM0EwMThFMEQwQjU1REYzM0VDQUUxMDQ5MDlEQzc0RjFDQTIyNTZDRkQ0MjNBODU5QjBBQzIxMTJBMEFFNjg0Mzk2QzAwMjlBRDA3RDBEMzBBQzg0RkZEMkMyRTgwQjc0REUyOTMxMEZDQUZFN0QwQ0I4ODY0NzI5QjZGRDFGODYwNTJEN0REOUE5Q0IwODVBMTg2MjU5QTY3QzE3NUIzRjgxQzVEQTE5QUZFRDFCRjlDNUMwN0Y0MEEyOUVENDdFRDRGMUM3REU4NzhCODQxMUUzMjM5RUQxNUFDMEU0Q0NDMUQ3Rjg4NDJFOUZEOUM5ODlGMzAxRTI2ODlGODAwQzNEMTRBMzg4MTA5MDZBMzZFRUEzNDIwNzAxNEU5OUM4NDNDNTk5RDU2RkNGQkMxNDI3OEEyQTAwOUMxM0I2RTRBQzc0NjBCNTREMkM3RUYzOEQ3MkFDNDUwNTQwMDk3RDJBRjYwOUQzRkZGODc0RDE0NTgyRkE4RkYyMTAyN0RFQzkyODQ0QkQyMkE5QTdFQzE0QzY2QkNDOERCMUUwNThCOTVBRjg3QUNCNjBBNTcyNTc2N0E3NkM5MTg1NzQ0RTQ4M0JDQ0Q5Mjc4RUQ5RkYxNUEwNDA2MUQwRjZFMzJEOThCNjg1M0EzOUFBNDk4NjczQzdERDAxMjk4MkIxOTEzQjNDM0NFMkM3MDgwRjEwMzIwOUYKLTIwMDQwMzEyMTYwMzA0IDIgNiAxMDAgNjE0MyAyIEU5NUE0MTMxRjg2MjM0RDI3RUUxRTUxNzkxNTk5NTU5RUVEQjYxODkxMkU0RkUzNkI4MUI4MENEQTRENDk3OTU5REJGQUVFOTI5MzE3QTY2QkU2NEEzMjhCQUI2MTgzRUE1QTVDQkIzNTgxNDkwQjRCNjEzQjIyNUFERDAwRUZEMzg1NDAzNTZFMEY0NzE2MjI5Q0REQjI2MDI4M0FGMDQ0RkRBRjFFRjkyNDhCQjBDRTkwMzFDMTE3Q0YxNUQzMjU5QjNFN0IwMzAxQ0ExQUFDOTFBRkE3QTU3Q0NERUVEMkRBNEVGQzJEQkM3QTlGQzUzQkI0RDNDQjJENTdEMjA5RDVEREVGMjVERTE0RjgyMjY0MDQyOTZCRDUwNEVDMTRGNjM0MEYwQUEyQTFBOTQzQjk1NTJDNEI5MUQzRUI0OEMwOEExMzY3MUMzNkVFNTA0Mjg1NzYyNUREMkNCNTg5NjVDMDk3NUVCNzc1MDU3RkY4MkJDMkI4QjY5RDBCRjI2RTJGODAxMTVCM0UxQTk4NEQxRDczRDlEMDJBRDY5QzNBMUFGOTBFQzkxNURFNkZDOUY1NzRCRDc1NUIyRUY2QkJFNjJGMzcxN0UxMjhEQzc5N0EwNkZFMzVDMUMyOENFRDU3QTBGNjRGNjFBNDQzOUFDRkU3QTdCOTVBMUE5NDg0MTdBNUI4QjY5OTE2QTMyOTg5QjAwRTJDM0ZCN0M3NDEzOUE0REE5RTUzM0M0MzlFNTlGQzdDNEY5MDc4MEQyQkJDREYwMTJDNDk5QzE1QTFFMEI1QzMxOEY4NEZCMTdERjk3QUIzRUMzNTZGRDAwNzJDRkEzODg0RUZCRUQzMTkwMDlERTZEQkYyQTVDN0M4N0E5M0RFQjA0Q0NEOTE0N0VGOEM5QkVDMkZENzEzNzkzRTRGMEJGOEM0RUZDRUJGQkY5NUQ1NTVFNTIzQUI1RDc0MjgwOEM0RTQyNTk3OUExQzIxNkM4Q0IyQjQyQzc3MTVCOENBNTkwN0U4NEU2RkJDMzVEQTdCRkJGQzg5Mjg3MEI2NTlDODgyQzZFMzY5N0UwRENDNkMyNDc3MUYyNkQ1MUE4OTA3ODZEQTUxNkRCQzJEMTYxNjgwQjEzNEYxNzE1QjMyRjczNEU2Njc2NTAzOThFQzIyNDFBRjc4ODc3QkIzRDYxRDgzRDAxNThEREU4OTQ4NjJFRTZFMUJFRTI3ODcyNEVBN0IzNEM3NEYwQTVENkI3Rjc5RjEzMjJFMjBBRDU3NTdFMTFEOUFDMzFCRkUyN0M1NkFCQjIzQTI3NTEzMDUzMzQzM0RDNDFEREJBMTA4MUUzQTAxOEUwRDBCNTVERjMzRUNBRTEwNDkwOURDNzRGMUNBMjI1NkNGRDQyM0E4NTlCMEFDMjExMkEwQUU2ODQzOTZDMDAyOUFEMDdEMEQzMEFDODRGRkQyQzJFODBCNzRERTI5MzEwRkNBRkU3RDBDQjg4NjQ3MjlCNkZEMUY4NjA1MkQ3REQ5QTlDQjA4NUExODYyNTlBNjdDMTc1QjNGODFDNURBMTlBRkVEMUJGOUM1QzA3RjQwQTI5RUQ0N0VENEYxQzdERTg3OEI4NDExRTMyMzlFRDE1QUMwRTRDQ0MxRDdGODg0MkU5RkQ5Qzk4OUYzMDFFMjY4OUY4MDBDM0QxNEEzODgxMDkwNkEzNkVFQTM0MjA3MDE0RTk5Qzg0M0M1OTlENTZGQ0ZCQzE0Mjc4QTJBMDA5QzEzQjZFNEFDNzQ2MEI1NEQyQzdFRjM4RDcyQUM0NTA1NDAwOTdEMkFGNjA5RDNGRkY4NzREMTQ1ODJGQThGRjIxMDI3REVDOTI4NDRCRDIyQTlBN0VDMTRDNjZCQ0M4REIxRTA1OEI5NUFGODdBQ0I2MEE1NzI1NzY3QTc2QzkxODU3NDRFNDgzQkNDRDkyNzhFRDlGRjE1QTA0MDYxRDBGNkUzMkQ5OEI2ODUzQTM5QUE0OTg2NzNDN0REMDEyOTgyQjE5MTNCM0MzQ0UyQzcwODBGMjQ3ODYxQgotMjAwNDAzMTIyMTA5MDQgMiA2IDEwMCA2MTQzIDUgRTk1QTQxMzFGODYyMzREMjdFRTFFNTE3OTE1OTk1NTlFRURCNjE4OTEyRTRGRTM2QjgxQjgwQ0RBNEQ0OTc5NTlEQkZBRUU5MjkzMTdBNjZCRTY0QTMyOEJBQjYxODNFQTVBNUNCQjM1ODE0OTBCNEI2MTNCMjI1QUREMDBFRkQzODU0MDM1NkUwRjQ3MTYyMjlDRERCMjYwMjgzQUYwNDRGREFGMUVGOTI0OEJCMENFOTAzMUMxMTdDRjE1RDMyNTlCM0U3QjAzMDFDQTFBQUM5MUFGQTdBNTdDQ0RFRUQyREE0RUZDMkRCQzdBOUZDNTNCQjREM0NCMkQ1N0QyMDlENURERUYyNURFMTRGODIyNjQwNDI5NkJENTA0RUMxNEY2MzQwRjBBQTJBMUE5NDNCOTU1MkM0QjkxRDNFQjQ4QzA4QTEzNjcxQzM2RUU1MDQyODU3NjI1REQyQ0I1ODk2NUMwOTc1RUI3NzUwNTdGRjgyQkMyQjhCNjlEMEJGMjZFMkY4MDExNUIzRTFBOTg0RDFENzNEOUQwMkFENjlDM0ExQUY5MEVDOTE1REU2RkM5RjU3NEJENzU1QjJFRjZCQkU2MkYzNzE3RTEyOERDNzk3QTA2RkUzNUMxQzI4Q0VENTdBMEY2NEY2MUE0NDM5QUNGRTdBN0I5NUExQTk0ODQxN0E1QjhCNjk5MTZBMzI5ODlCMDBFMkMzRkI3Qzc0MTM5QTREQTlFNTMzQzQzOUU1OUZDN0M0RjkwNzgwRDJCQkNERjAxMkM0OTlDMTVBMUUwQjVDMzE4Rjg0RkIxN0RGOTdBQjNFQzM1NkZEMDA3MkNGQTM4ODRFRkJFRDMxOTAwOURFNkRCRjJBNUM3Qzg3QTkzREVCMDRDQ0Q5MTQ3RUY4QzlCRUMyRkQ3MTM3OTNFNEYwQkY4QzRFRkNFQkZCRjk1RDU1NUU1MjNBQjVENzQyODA4QzRFNDI1OTc5QTFDMjE2QzhDQjJCNDJDNzcxNUI4Q0E1OTA3RTg0RTZGQkMzNURBN0JGQkZDODkyODcwQjY1OUM4ODJDNkUzNjk3RTBEQ0M2QzI0NzcxRjI2RDUxQTg5MDc4NkRBNTE2REJDMkQxNjE2ODBCMTM0RjE3MTVCMzJGNzM0RTY2NzY1MDM5OEVDMjI0MUFGNzg4NzdCQjNENjFEODNEMDE1OERERTg5NDg2MkVFNkUxQkVFMjc4NzI0RUE3QjM0Qzc0RjBBNUQ2QjdGNzlGMTMyMkUyMEFENTc1N0UxMUQ5QUMzMUJGRTI3QzU2QUJCMjNBMjc1MTMwNTMzNDMzREM0MUREQkExMDgxRTNBMDE4RTBEMEI1NURGMzNFQ0FFMTA0OTA5REM3NEYxQ0EyMjU2Q0ZENDIzQTg1OUIwQUMyMTEyQTBBRTY4NDM5NkMwMDI5QUQwN0QwRDMwQUM4NEZGRDJDMkU4MEI3NERFMjkzMTBGQ0FGRTdEMENCODg2NDcyOUI2RkQxRjg2MDUyRDdERDlBOUNCMDg1QTE4NjI1OUE2N0MxNzVCM0Y4MUM1REExOUFGRUQxQkY5QzVDMDdGNDBBMjlFRDQ3RUQ0RjFDN0RFODc4Qjg0MTFFMzIzOUVEMTVBQzBFNENDQzFEN0Y4ODQyRTlGRDlDOTg5RjMwMUUyNjg5RjgwMEMzRDE0QTM4ODEwOTA2QTM2RUVBMzQyMDcwMTRFOTlDODQzQzU5OUQ1NkZDRkJDMTQyNzhBMkEwMDlDMTNCNkU0QUM3NDYwQjU0RDJDN0VGMzhENzJBQzQ1MDU0MDA5N0QyQUY2MDlEM0ZGRjg3NEQxNDU4MkZBOEZGMjEwMjdERUM5Mjg0NEJEMjJBOUE3RUMxNEM2NkJDQzhEQjFFMDU4Qjk1QUY4N0FDQjYwQTU3MjU3NjdBNzZDOTE4NTc0NEU0ODNCQ0NEOTI3OEVEOUZGMTVBMDQwNjFEMEY2RTMyRDk4QjY4NTNBMzlBQTQ5ODY3M0M3REQwMTI5ODJCMTkxM0IzQzNDRTJDNzA4MEYyOUQ5MzlGCi0yMDA0MDMxNjA3NDAwNSAyIDYgMTAwIDYxNDMgMiBFOTVBNDEzMUY4NjIzNEQyN0VFMUU1MTc5MTU5OTU1OUVFREI2MTg5MTJFNEZFMzZCODFCODBDREE0RDQ5Nzk1OURCRkFFRTkyOTMxN0E2NkJFNjRBMzI4QkFCNjE4M0VBNUE1Q0JCMzU4MTQ5MEI0QjYxM0IyMjVBREQwMEVGRDM4NTQwMzU2RTBGNDcxNjIyOUNEREIyNjAyODNBRjA0NEZEQUYxRUY5MjQ4QkIwQ0U5MDMxQzExN0NGMTVEMzI1OUIzRTdCMDMwMUNBMUFBQzkxQUZBN0E1N0NDREVFRDJEQTRFRkMyREJDN0E5RkM1M0JCNEQzQ0IyRDU3RDIwOUQ1RERFRjI1REUxNEY4MjI2NDA0Mjk2QkQ1MDRFQzE0RjYzNDBGMEFBMkExQTk0M0I5NTUyQzRCOTFEM0VCNDhDMDhBMTM2NzFDMzZFRTUwNDI4NTc2MjVERDJDQjU4OTY1QzA5NzVFQjc3NTA1N0ZGODJCQzJCOEI2OUQwQkYyNkUyRjgwMTE1QjNFMUE5ODREMUQ3M0Q5RDAyQUQ2OUMzQTFBRjkwRUM5MTVERTZGQzlGNTc0QkQ3NTVCMkVGNkJCRTYyRjM3MTdFMTI4REM3OTdBMDZGRTM1QzFDMjhDRUQ1N0EwRjY0RjYxQTQ0MzlBQ0ZFN0E3Qjk1QTFBOTQ4NDE3QTVCOEI2OTkxNkEzMjk4OUIwMEUyQzNGQjdDNzQxMzlBNERBOUU1MzNDNDM5RTU5RkM3QzRGOTA3ODBEMkJCQ0RGMDEyQzQ5OUMxNUExRTBCNUMzMThGODRGQjE3REY5N0FCM0VDMzU2RkQwMDcyQ0ZBMzg4NEVGQkVEMzE5MDA5REU2REJGMkE1QzdDODdBOTNERUIwNENDRDkxNDdFRjhDOUJFQzJGRDcxMzc5M0U0RjBCRjhDNEVGQ0VCRkJGOTVENTU1RTUyM0FCNUQ3NDI4MDhDNEU0MjU5NzlBMUMyMTZDOENCMkI0MkM3NzE1QjhDQTU5MDdFODRFNkZCQzM1REE3QkZCRkM4OTI4NzBCNjU5Qzg4MkM2RTM2OTdFMERDQzZDMjQ3NzFGMjZENTFBODkwNzg2REE1MTZEQkMyRDE2MTY4MEIxMzRGMTcxNUIzMkY3MzRFNjY3NjUwMzk4RUMyMjQxQUY3ODg3N0JCM0Q2MUQ4M0QwMTU4RERFODk0ODYyRUU2RTFCRUUyNzg3MjRFQTdCMzRDNzRGMEE1RDZCN0Y3OUYxMzIyRTIwQUQ1NzU3RTExRDlBQzMxQkZFMjdDNTZBQkIyM0EyNzUxMzA1MzM0MzNEQzQxRERCQTEwODFFM0EwMThFMEQwQjU1REYzM0VDQUUxMDQ5MDlEQzc0RjFDQTIyNTZDRkQ0MjNBODU5QjBBQzIxMTJBMEFFNjg0Mzk2QzAwMjlBRDA3RDBEMzBBQzg0RkZEMkMyRTgwQjc0REUyOTMxMEZDQUZFN0QwQ0I4ODY0NzI5QjZGRDFGODYwNTJEN0REOUE5Q0IwODVBMTg2MjU5QTY3QzE3NUIzRjgxQzVEQTE5QUZFRDFCRjlDNUMwN0Y0MEEyOUVENDdFRDRGMUM3REU4NzhCODQxMUUzMjM5RUQxNUFDMEU0Q0NDMUQ3Rjg4NDJFOUZEOUM5ODlGMzAxRTI2ODlGODAwQzNEMTRBMzg4MTA5MDZBMzZFRUEzNDIwNzAxNEU5OUM4NDNDNTk5RDU2RkNGQkMxNDI3OEEyQTAwOUMxM0I2RTRBQzc0NjBCNTREMkM3RUYzOEQ3MkFDNDUwNTQwMDk3RDJBRjYwOUQzRkZGODc0RDE0NTgyRkE4RkYyMTAyN0RFQzkyODQ0QkQyMkE5QTdFQzE0QzY2QkNDOERCMUUwNThCOTVBRjg3QUNCNjBBNTcyNTc2N0E3NkM5MTg1NzQ0RTQ4M0JDQ0Q5Mjc4RUQ5RkYxNUEwNDA2MUQwRjZFMzJEOThCNjg1M0EzOUFBNDk4NjczQzdERDAxMjk4MkIxOTEzQjNDM0NFMkM3MDgwRjhCMUY3REIKLTIwMDQwMzE3MTEzMzA5IDIgNiAxMDAgNjE0MyAyIEU5NUE0MTMxRjg2MjM0RDI3RUUxRTUxNzkxNTk5NTU5RUVEQjYxODkxMkU0RkUzNkI4MUI4MENEQTRENDk3OTU5REJGQUVFOTI5MzE3QTY2QkU2NEEzMjhCQUI2MTgzRUE1QTVDQkIzNTgxNDkwQjRCNjEzQjIyNUFERDAwRUZEMzg1NDAzNTZFMEY0NzE2MjI5Q0REQjI2MDI4M0FGMDQ0RkRBRjFFRjkyNDhCQjBDRTkwMzFDMTE3Q0YxNUQzMjU5QjNFN0IwMzAxQ0ExQUFDOTFBRkE3QTU3Q0NERUVEMkRBNEVGQzJEQkM3QTlGQzUzQkI0RDNDQjJENTdEMjA5RDVEREVGMjVERTE0RjgyMjY0MDQyOTZCRDUwNEVDMTRGNjM0MEYwQUEyQTFBOTQzQjk1NTJDNEI5MUQzRUI0OEMwOEExMzY3MUMzNkVFNTA0Mjg1NzYyNUREMkNCNTg5NjVDMDk3NUVCNzc1MDU3RkY4MkJDMkI4QjY5RDBCRjI2RTJGODAxMTVCM0UxQTk4NEQxRDczRDlEMDJBRDY5QzNBMUFGOTBFQzkxNURFNkZDOUY1NzRCRDc1NUIyRUY2QkJFNjJGMzcxN0UxMjhEQzc5N0EwNkZFMzVDMUMyOENFRDU3QTBGNjRGNjFBNDQzOUFDRkU3QTdCOTVBMUE5NDg0MTdBNUI4QjY5OTE2QTMyOTg5QjAwRTJDM0ZCN0M3NDEzOUE0REE5RTUzM0M0MzlFNTlGQzdDNEY5MDc4MEQyQkJDREYwMTJDNDk5QzE1QTFFMEI1QzMxOEY4NEZCMTdERjk3QUIzRUMzNTZGRDAwNzJDRkEzODg0RUZCRUQzMTkwMDlERTZEQkYyQTVDN0M4N0E5M0RFQjA0Q0NEOTE0N0VGOEM5QkVDMkZENzEzNzkzRTRGMEJGOEM0RUZDRUJGQkY5NUQ1NTVFNTIzQUI1RDc0MjgwOEM0RTQyNTk3OUExQzIxNkM4Q0IyQjQyQzc3MTVCOENBNTkwN0U4NEU2RkJDMzVEQTdCRkJGQzg5Mjg3MEI2NTlDODgyQzZFMzY5N0UwRENDNkMyNDc3MUYyNkQ1MUE4OTA3ODZEQTUxNkRCQzJEMTYxNjgwQjEzNEYxNzE1QjMyRjczNEU2Njc2NTAzOThFQzIyNDFBRjc4ODc3QkIzRDYxRDgzRDAxNThEREU4OTQ4NjJFRTZFMUJFRTI3ODcyNEVBN0IzNEM3NEYwQTVENkI3Rjc5RjEzMjJFMjBBRDU3NTdFMTFEOUFDMzFCRkUyN0M1NkFCQjIzQTI3NTEzMDUzMzQzM0RDNDFEREJBMTA4MUUzQTAxOEUwRDBCNTVERjMzRUNBRTEwNDkwOURDNzRGMUNBMjI1NkNGRDQyM0E4NTlCMEFDMjExMkEwQUU2ODQzOTZDMDAyOUFEMDdEMEQzMEFDODRGRkQyQzJFODBCNzRERTI5MzEwRkNBRkU3RDBDQjg4NjQ3MjlCNkZEMUY4NjA1MkQ3REQ5QTlDQjA4NUExODYyNTlBNjdDMTc1QjNGODFDNURBMTlBRkVEMUJGOUM1QzA3RjQwQTI5RUQ0N0VENEYxQzdERTg3OEI4NDExRTMyMzlFRDE1QUMwRTRDQ0MxRDdGODg0MkU5RkQ5Qzk4OUYzMDFFMjY4OUY4MDBDM0QxNEEzODgxMDkwNkEzNkVFQTM0MjA3MDE0RTk5Qzg0M0M1OTlENTZGQ0ZCQzE0Mjc4QTJBMDA5QzEzQjZFNEFDNzQ2MEI1NEQyQzdFRjM4RDcyQUM0NTA1NDAwOTdEMkFGNjA5RDNGRkY4NzREMTQ1ODJGQThGRjIxMDI3REVDOTI4NDRCRDIyQTlBN0VDMTRDNjZCQ0M4REIxRTA1OEI5NUFGODdBQ0I2MEE1NzI1NzY3QTc2QzkxODU3NDRFNDgzQkNDRDkyNzhFRDlGRjE1QTA0MDYxRDBGNkUzMkQ5OEI2ODUzQTM5QUE0OTg2NzNDN0REMDEyOTgyQjE5MTNCM0MzQ0UyQzcwODBGQUFFMUY3MwotMjAwNDAzMTcxOTUyNDYgMiA2IDEwMCA2MTQzIDIgRTk1QTQxMzFGODYyMzREMjdFRTFFNTE3OTE1OTk1NTlFRURCNjE4OTEyRTRGRTM2QjgxQjgwQ0RBNEQ0OTc5NTlEQkZBRUU5MjkzMTdBNjZCRTY0QTMyOEJBQjYxODNFQTVBNUNCQjM1ODE0OTBCNEI2MTNCMjI1QUREMDBFRkQzODU0MDM1NkUwRjQ3MTYyMjlDRERCMjYwMjgzQUYwNDRGREFGMUVGOTI0OEJCMENFOTAzMUMxMTdDRjE1RDMyNTlCM0U3QjAzMDFDQTFBQUM5MUFGQTdBNTdDQ0RFRUQyREE0RUZDMkRCQzdBOUZDNTNCQjREM0NCMkQ1N0QyMDlENURERUYyNURFMTRGODIyNjQwNDI5NkJENTA0RUMxNEY2MzQwRjBBQTJBMUE5NDNCOTU1MkM0QjkxRDNFQjQ4QzA4QTEzNjcxQzM2RUU1MDQyODU3NjI1REQyQ0I1ODk2NUMwOTc1RUI3NzUwNTdGRjgyQkMyQjhCNjlEMEJGMjZFMkY4MDExNUIzRTFBOTg0RDFENzNEOUQwMkFENjlDM0ExQUY5MEVDOTE1REU2RkM5RjU3NEJENzU1QjJFRjZCQkU2MkYzNzE3RTEyOERDNzk3QTA2RkUzNUMxQzI4Q0VENTdBMEY2NEY2MUE0NDM5QUNGRTdBN0I5NUExQTk0ODQxN0E1QjhCNjk5MTZBMzI5ODlCMDBFMkMzRkI3Qzc0MTM5QTREQTlFNTMzQzQzOUU1OUZDN0M0RjkwNzgwRDJCQkNERjAxMkM0OTlDMTVBMUUwQjVDMzE4Rjg0RkIxN0RGOTdBQjNFQzM1NkZEMDA3MkNGQTM4ODRFRkJFRDMxOTAwOURFNkRCRjJBNUM3Qzg3QTkzREVCMDRDQ0Q5MTQ3RUY4QzlCRUMyRkQ3MTM3OTNFNEYwQkY4QzRFRkNFQkZCRjk1RDU1NUU1MjNBQjVENzQyODA4QzRFNDI1OTc5QTFDMjE2QzhDQjJCNDJDNzcxNUI4Q0E1OTA3RTg0RTZGQkMzNURBN0JGQkZDODkyODcwQjY1OUM4ODJDNkUzNjk3RTBEQ0M2QzI0NzcxRjI2RDUxQTg5MDc4NkRBNTE2REJDMkQxNjE2ODBCMTM0RjE3MTVCMzJGNzM0RTY2NzY1MDM5OEVDMjI0MUFGNzg4NzdCQjNENjFEODNEMDE1OERERTg5NDg2MkVFNkUxQkVFMjc4NzI0RUE3QjM0Qzc0RjBBNUQ2QjdGNzlGMTMyMkUyMEFENTc1N0UxMUQ5QUMzMUJGRTI3QzU2QUJCMjNBMjc1MTMwNTMzNDMzREM0MUREQkExMDgxRTNBMDE4RTBEMEI1NURGMzNFQ0FFMTA0OTA5REM3NEYxQ0EyMjU2Q0ZENDIzQTg1OUIwQUMyMTEyQTBBRTY4NDM5NkMwMDI5QUQwN0QwRDMwQUM4NEZGRDJDMkU4MEI3NERFMjkzMTBGQ0FGRTdEMENCODg2NDcyOUI2RkQxRjg2MDUyRDdERDlBOUNCMDg1QTE4NjI1OUE2N0MxNzVCM0Y4MUM1REExOUFGRUQxQkY5QzVDMDdGNDBBMjlFRDQ3RUQ0RjFDN0RFODc4Qjg0MTFFMzIzOUVEMTVBQzBFNENDQzFEN0Y4ODQyRTlGRDlDOTg5RjMwMUUyNjg5RjgwMEMzRDE0QTM4ODEwOTA2QTM2RUVBMzQyMDcwMTRFOTlDODQzQzU5OUQ1NkZDRkJDMTQyNzhBMkEwMDlDMTNCNkU0QUM3NDYwQjU0RDJDN0VGMzhENzJBQzQ1MDU0MDA5N0QyQUY2MDlEM0ZGRjg3NEQxNDU4MkZBOEZGMjEwMjdERUM5Mjg0NEJEMjJBOUE3RUMxNEM2NkJDQzhEQjFFMDU4Qjk1QUY4N0FDQjYwQTU3MjU3NjdBNzZDOTE4NTc0NEU0ODNCQ0NEOTI3OEVEOUZGMTVBMDQwNjFEMEY2RTMyRDk4QjY4NTNBMzlBQTQ5ODY3M0M3REQwMTI5ODJCMTkxM0IzQzNDRTJDNzA4MEZCM0YyQjkzCi0yMDA0MDMxOTAyNTg0OCAyIDYgMTAwIDYxNDMgMiBFOTVBNDEzMUY4NjIzNEQyN0VFMUU1MTc5MTU5OTU1OUVFREI2MTg5MTJFNEZFMzZCODFCODBDREE0RDQ5Nzk1OURCRkFFRTkyOTMxN0E2NkJFNjRBMzI4QkFCNjE4M0VBNUE1Q0JCMzU4MTQ5MEI0QjYxM0IyMjVBREQwMEVGRDM4NTQwMzU2RTBGNDcxNjIyOUNEREIyNjAyODNBRjA0NEZEQUYxRUY5MjQ4QkIwQ0U5MDMxQzExN0NGMTVEMzI1OUIzRTdCMDMwMUNBMUFBQzkxQUZBN0E1N0NDREVFRDJEQTRFRkMyREJDN0E5RkM1M0JCNEQzQ0IyRDU3RDIwOUQ1RERFRjI1REUxNEY4MjI2NDA0Mjk2QkQ1MDRFQzE0RjYzNDBGMEFBMkExQTk0M0I5NTUyQzRCOTFEM0VCNDhDMDhBMTM2NzFDMzZFRTUwNDI4NTc2MjVERDJDQjU4OTY1QzA5NzVFQjc3NTA1N0ZGODJCQzJCOEI2OUQwQkYyNkUyRjgwMTE1QjNFMUE5ODREMUQ3M0Q5RDAyQUQ2OUMzQTFBRjkwRUM5MTVERTZGQzlGNTc0QkQ3NTVCMkVGNkJCRTYyRjM3MTdFMTI4REM3OTdBMDZGRTM1QzFDMjhDRUQ1N0EwRjY0RjYxQTQ0MzlBQ0ZFN0E3Qjk1QTFBOTQ4NDE3QTVCOEI2OTkxNkEzMjk4OUIwMEUyQzNGQjdDNzQxMzlBNERBOUU1MzNDNDM5RTU5RkM3QzRGOTA3ODBEMkJCQ0RGMDEyQzQ5OUMxNUExRTBCNUMzMThGODRGQjE3REY5N0FCM0VDMzU2RkQwMDcyQ0ZBMzg4NEVGQkVEMzE5MDA5REU2REJGMkE1QzdDODdBOTNERUIwNENDRDkxNDdFRjhDOUJFQzJGRDcxMzc5M0U0RjBCRjhDNEVGQ0VCRkJGOTVENTU1RTUyM0FCNUQ3NDI4MDhDNEU0MjU5NzlBMUMyMTZDOENCMkI0MkM3NzE1QjhDQTU5MDdFODRFNkZCQzM1REE3QkZCRkM4OTI4NzBCNjU5Qzg4MkM2RTM2OTdFMERDQzZDMjQ3NzFGMjZENTFBODkwNzg2REE1MTZEQkMyRDE2MTY4MEIxMzRGMTcxNUIzMkY3MzRFNjY3NjUwMzk4RUMyMjQxQUY3ODg3N0JCM0Q2MUQ4M0QwMTU4RERFODk0ODYyRUU2RTFCRUUyNzg3MjRFQTdCMzRDNzRGMEE1RDZCN0Y3OUYxMzIyRTIwQUQ1NzU3RTExRDlBQzMxQkZFMjdDNTZBQkIyM0EyNzUxMzA1MzM0MzNEQzQxRERCQTEwODFFM0EwMThFMEQwQjU1REYzM0VDQUUxMDQ5MDlEQzc0RjFDQTIyNTZDRkQ0MjNBODU5QjBBQzIxMTJBMEFFNjg0Mzk2QzAwMjlBRDA3RDBEMzBBQzg0RkZEMkMyRTgwQjc0REUyOTMxMEZDQUZFN0QwQ0I4ODY0NzI5QjZGRDFGODYwNTJEN0REOUE5Q0IwODVBMTg2MjU5QTY3QzE3NUIzRjgxQzVEQTE5QUZFRDFCRjlDNUMwN0Y0MEEyOUVENDdFRDRGMUM3REU4NzhCODQxMUUzMjM5RUQxNUFDMEU0Q0NDMUQ3Rjg4NDJFOUZEOUM5ODlGMzAxRTI2ODlGODAwQzNEMTRBMzg4MTA5MDZBMzZFRUEzNDIwNzAxNEU5OUM4NDNDNTk5RDU2RkNGQkMxNDI3OEEyQTAwOUMxM0I2RTRBQzc0NjBCNTREMkM3RUYzOEQ3MkFDNDUwNTQwMDk3RDJBRjYwOUQzRkZGODc0RDE0NTgyRkE4RkYyMTAyN0RFQzkyODQ0QkQyMkE5QTdFQzE0QzY2QkNDOERCMUUwNThCOTVBRjg3QUNCNjBBNTcyNTc2N0E3NkM5MTg1NzQ0RTQ4M0JDQ0Q5Mjc4RUQ5RkYxNUEwNDA2MUQwRjZFMzJEOThCNjg1M0EzOUFBNDk4NjczQzdERDAxMjk4MkIxOTEzQjNDM0NFMkM3MDgwRkQ4MTc0MUIKLTIwMDQwMzIzMTk0NjU4IDIgNiAxMDAgNjE0MyA1IEU5NUE0MTMxRjg2MjM0RDI3RUUxRTUxNzkxNTk5NTU5RUVEQjYxODkxMkU0RkUzNkI4MUI4MENEQTRENDk3OTU5REJGQUVFOTI5MzE3QTY2QkU2NEEzMjhCQUI2MTgzRUE1QTVDQkIzNTgxNDkwQjRCNjEzQjIyNUFERDAwRUZEMzg1NDAzNTZFMEY0NzE2MjI5Q0REQjI2MDI4M0FGMDQ0RkRBRjFFRjkyNDhCQjBDRTkwMzFDMTE3Q0YxNUQzMjU5QjNFN0IwMzAxQ0ExQUFDOTFBRkE3QTU3Q0NERUVEMkRBNEVGQzJEQkM3QTlGQzUzQkI0RDNDQjJENTdEMjA5RDVEREVGMjVERTE0RjgyMjY0MDQyOTZCRDUwNEVDMTRGNjM0MEYwQUEyQTFBOTQzQjk1NTJDNEI5MUQzRUI0OEMwOEExMzY3MUMzNkVFNTA0Mjg1NzYyNUREMkNCNTg5NjVDMDk3NUVCNzc1MDU3RkY4MkJDMkI4QjY5RDBCRjI2RTJGODAxMTVCM0UxQTk4NEQxRDczRDlEMDJBRDY5QzNBMUFGOTBFQzkxNURFNkZDOUY1NzRCRDc1NUIyRUY2QkJFNjJGMzcxN0UxMjhEQzc5N0EwNkZFMzVDMUMyOENFRDU3QTBGNjRGNjFBNDQzOUFDRkU3QTdCOTVBMUE5NDg0MTdBNUI4QjY5OTE2QTMyOTg5QjAwRTJDM0ZCN0M3NDEzOUE0REE5RTUzM0M0MzlFNTlGQzdDNEY5MDc4MEQyQkJDREYwMTJDNDk5QzE1QTFFMEI1QzMxOEY4NEZCMTdERjk3QUIzRUMzNTZGRDAwNzJDRkEzODg0RUZCRUQzMTkwMDlERTZEQkYyQTVDN0M4N0E5M0RFQjA0Q0NEOTE0N0VGOEM5QkVDMkZENzEzNzkzRTRGMEJGOEM0RUZDRUJGQkY5NUQ1NTVFNTIzQUI1RDc0MjgwOEM0RTQyNTk3OUExQzIxNkM4Q0IyQjQyQzc3MTVCOENBNTkwN0U4NEU2RkJDMzVEQTdCRkJGQzg5Mjg3MEI2NTlDODgyQzZFMzY5N0UwRENDNkMyNDc3MUYyNkQ1MUE4OTA3ODZEQTUxNkRCQzJEMTYxNjgwQjEzNEYxNzE1QjMyRjczNEU2Njc2NTAzOThFQzIyNDFBRjc4ODc3QkIzRDYxRDgzRDAxNThEREU4OTQ4NjJFRTZFMUJFRTI3ODcyNEVBN0IzNEM3NEYwQTVENkI3Rjc5RjEzMjJFMjBBRDU3NTdFMTFEOUFDMzFCRkUyN0M1NkFCQjIzQTI3NTEzMDUzMzQzM0RDNDFEREJBMTA4MUUzQTAxOEUwRDBCNTVERjMzRUNBRTEwNDkwOURDNzRGMUNBMjI1NkNGRDQyM0E4NTlCMEFDMjExMkEwQUU2ODQzOTZDMDAyOUFEMDdEMEQzMEFDODRGRkQyQzJFODBCNzRERTI5MzEwRkNBRkU3RDBDQjg4NjQ3MjlCNkZEMUY4NjA1MkQ3REQ5QTlDQjA4NUExODYyNTlBNjdDMTc1QjNGODFDNURBMTlBRkVEMUJGOUM1QzA3RjQwQTI5RUQ0N0VENEYxQzdERTg3OEI4NDExRTMyMzlFRDE1QUMwRTRDQ0MxRDdGODg0MkU5RkQ5Qzk4OUYzMDFFMjY4OUY4MDBDM0QxNEEzODgxMDkwNkEzNkVFQTM0MjA3MDE0RTk5Qzg0M0M1OTlENTZGQ0ZCQzE0Mjc4QTJBMDA5QzEzQjZFNEFDNzQ2MEI1NEQyQzdFRjM4RDcyQUM0NTA1NDAwOTdEMkFGNjA5RDNGRkY4NzREMTQ1ODJGQThGRjIxMDI3REVDOTI4NDRCRDIyQTlBN0VDMTRDNjZCQ0M4REIxRTA1OEI5NUFGODdBQ0I2MEE1NzI1NzY3QTc2QzkxODU3NDRFNDgzQkNDRDkyNzhFRDlGRjE1QTA0MDYxRDBGNkUzMkQ5OEI2ODUzQTM5QUE0OTg2NzNDN0REMDEyOTgyQjE5MTNCM0MzQ0UyQzcwODEwNUFGMDRBRgotMjAwNDAzMjQwNDE1MzUgMiA2IDEwMCA2MTQzIDUgRTk1QTQxMzFGODYyMzREMjdFRTFFNTE3OTE1OTk1NTlFRURCNjE4OTEyRTRGRTM2QjgxQjgwQ0RBNEQ0OTc5NTlEQkZBRUU5MjkzMTdBNjZCRTY0QTMyOEJBQjYxODNFQTVBNUNCQjM1ODE0OTBCNEI2MTNCMjI1QUREMDBFRkQzODU0MDM1NkUwRjQ3MTYyMjlDRERCMjYwMjgzQUYwNDRGREFGMUVGOTI0OEJCMENFOTAzMUMxMTdDRjE1RDMyNTlCM0U3QjAzMDFDQTFBQUM5MUFGQTdBNTdDQ0RFRUQyREE0RUZDMkRCQzdBOUZDNTNCQjREM0NCMkQ1N0QyMDlENURERUYyNURFMTRGODIyNjQwNDI5NkJENTA0RUMxNEY2MzQwRjBBQTJBMUE5NDNCOTU1MkM0QjkxRDNFQjQ4QzA4QTEzNjcxQzM2RUU1MDQyODU3NjI1REQyQ0I1ODk2NUMwOTc1RUI3NzUwNTdGRjgyQkMyQjhCNjlEMEJGMjZFMkY4MDExNUIzRTFBOTg0RDFENzNEOUQwMkFENjlDM0ExQUY5MEVDOTE1REU2RkM5RjU3NEJENzU1QjJFRjZCQkU2MkYzNzE3RTEyOERDNzk3QTA2RkUzNUMxQzI4Q0VENTdBMEY2NEY2MUE0NDM5QUNGRTdBN0I5NUExQTk0ODQxN0E1QjhCNjk5MTZBMzI5ODlCMDBFMkMzRkI3Qzc0MTM5QTREQTlFNTMzQzQzOUU1OUZDN0M0RjkwNzgwRDJCQkNERjAxMkM0OTlDMTVBMUUwQjVDMzE4Rjg0RkIxN0RGOTdBQjNFQzM1NkZEMDA3MkNGQTM4ODRFRkJFRDMxOTAwOURFNkRCRjJBNUM3Qzg3QTkzREVCMDRDQ0Q5MTQ3RUY4QzlCRUMyRkQ3MTM3OTNFNEYwQkY4QzRFRkNFQkZCRjk1RDU1NUU1MjNBQjVENzQyODA4QzRFNDI1OTc5QTFDMjE2QzhDQjJCNDJDNzcxNUI4Q0E1OTA3RTg0RTZGQkMzNURBN0JGQkZDODkyODcwQjY1OUM4ODJDNkUzNjk3RTBEQ0M2QzI0NzcxRjI2RDUxQTg5MDc4NkRBNTE2REJDMkQxNjE2ODBCMTM0RjE3MTVCMzJGNzM0RTY2NzY1MDM5OEVDMjI0MUFGNzg4NzdCQjNENjFEODNEMDE1OERERTg5NDg2MkVFNkUxQkVFMjc4NzI0RUE3QjM0Qzc0RjBBNUQ2QjdGNzlGMTMyMkUyMEFENTc1N0UxMUQ5QUMzMUJGRTI3QzU2QUJCMjNBMjc1MTMwNTMzNDMzREM0MUREQkExMDgxRTNBMDE4RTBEMEI1NURGMzNFQ0FFMTA0OTA5REM3NEYxQ0EyMjU2Q0ZENDIzQTg1OUIwQUMyMTEyQTBBRTY4NDM5NkMwMDI5QUQwN0QwRDMwQUM4NEZGRDJDMkU4MEI3NERFMjkzMTBGQ0FGRTdEMENCODg2NDcyOUI2RkQxRjg2MDUyRDdERDlBOUNCMDg1QTE4NjI1OUE2N0MxNzVCM0Y4MUM1REExOUFGRUQxQkY5QzVDMDdGNDBBMjlFRDQ3RUQ0RjFDN0RFODc4Qjg0MTFFMzIzOUVEMTVBQzBFNENDQzFEN0Y4ODQyRTlGRDlDOTg5RjMwMUUyNjg5RjgwMEMzRDE0QTM4ODEwOTA2QTM2RUVBMzQyMDcwMTRFOTlDODQzQzU5OUQ1NkZDRkJDMTQyNzhBMkEwMDlDMTNCNkU0QUM3NDYwQjU0RDJDN0VGMzhENzJBQzQ1MDU0MDA5N0QyQUY2MDlEM0ZGRjg3NEQxNDU4MkZBOEZGMjEwMjdERUM5Mjg0NEJEMjJBOUE3RUMxNEM2NkJDQzhEQjFFMDU4Qjk1QUY4N0FDQjYwQTU3MjU3NjdBNzZDOTE4NTc0NEU0ODNCQ0NEOTI3OEVEOUZGMTVBMDQwNjFEMEY2RTMyRDk4QjY4NTNBMzlBQTQ5ODY3M0M3REQwMTI5ODJCMTkxM0IzQzNDRTJDNzA4MTA2NDNFNzM3Ci0yMDA2MTAwMjE3MTQyNiAyIDYgMTAwIDgxOTEgMiBEMkQ2NEQ4Q0M2RkRGQTk4OTdDOEFFODA1RUE3Q0I5NzJEN0ExMEY1QTI2OEVCNUIzM0IwQ0NFMkM3NUU0ODAzNjVBNDkwNzAxODVEOEIzMTY4NzJCQUYwRjNBQUY5NDQ5OEE4RTAwMDdBMTNENTc0QzkwNTQ0MUYxOUQ0QjBENTVBODNFMkE3MEMwOUY3QjNFMzUzREVBNzZGNUZFQjQxOTFFMzFGNEE1MkQwQkM2NDNCOUZEMTk1OUJERjhCOTlDMTNGMjQ1QjVEOUU4NTg5RDZDMThBODQ0ODE0NDg2RjI1QThFMTg5Qjk2NEE5RTcyNjc1RERFNEQ3NTlDOTAxQzA5RjdDMjRDQjNFOTM5QjU0RDIwMDlBRTkzMzE0NDZDMUVERTVGQTlEMEEzM0IzNkY2QTZDOUI1NUU5NTZBOTQxNjlGQkU5QzFBMjRFQzlBM0U0OTczNzFGNDEzMUYyQjFFNEZCMjVBMUJCMjdCMjNBNjY2MTE1NUYzN0M2RUM5MTNFNUNCMjA3QUQ4OTRDMjMxOTg1MkM1NTZDQTA0MEM2QjcyREU2RTkxM0JDRjQxOUU1OTE0NTA3MTE5Rjc3MTIwNkZBQjI1QjFENkJBRDU3QUZFQUY3NEQ4MDdDQzU3NjU0OUNEOTc5QjBBQUMxM0Y1RDJCNjM3Q0NGNEE1NEQyRDkwM0E0QjI5QzE2QjlFOEJFRThBRDYyMDBEMjRFNEUzRTk3RUIyNUIyREQxM0MzMUFFMkE0RjI3RDZFRkJGQTExM0Y5MzM0RjkyMjA0RkNGRkNBQTVFQkRDQ0JBOTg2QzVCNkU2NjVGRTcxRDY2NTRBQ0EzQzgwNTE0MjQxMzM1OTdGRDY1QTE4QkIyQUEyNEZGREQ4QjA5QTg3NThEOTg0RTA5QkUxRjU1QjE2QTM3QjM2QjA1ODI5NUIxRTk5NDJBODlEMzg2RDRCNERCNThDNTE2NDI5MjQ4MDUyRDk3REU0MkJGQzMyQUIxNEYxM0Q3Rjk2M0U4Njg2N0I4QjcyNDUwNjIwNjFDOUYzMTVFQTk0QzM4RkNDMEUxMTgzNzNCRUZDNDFEMTAwNENGMEZBNkQ5NTFFMjBCQUM1RDJDMTVGNTc5NjE2MzQ2OUI4OEE3NUZFNUY1RDJDNjlDOTQ5REE0N0RBQzc1RDIyODY5RjM3RkFCMjQ5MDc5MUZBNUE1ODU0MzYwRUFBMTM3MDFDRUU0MEVDMzcxNzk3MjcyQTEyNzQ2QUJBOUNCMzAzMjI0QjgyRjhDQ0UzRjYyQzBEM0VBMEQ2MkJGM0IyQzM4N0UwMTVCMUE5NkE0QzRBMkE3M0FEQTUyMUIwNTM2QjgxQTUzNkE1MTE5RUM1NTlENTI0QkE3RjJCMjVBMDk0QTE2NEE0RUVCQjhBREE4ODZEQ0JBOTY0N0ZDNEQyRDRBOTFCQTBEQjMyODA1RURBNzVCNjFFMDlGNDRCQzQ5ODYyRDcwQjhGMjhDOEU2MzBDRDZGMERGMjQ1NTM1RDc5RENENzVFQ0JERTUxQjI5QUE2REQzRjU5NzM2RTUwMjhFM0FCMUU3NUNGQ0RBMUZGOUU2RjhENTIwMjdBNEJDMjE4RkM5QTlFNjYwQkY3RUIxNEQzMDBGNDE5OUMwNEIyNDcyNTQwNUFGQTY1MzVERjA4MzdGRUYzM0MwRjhCNTdCOUJERkZCMUQ5NTZFN0I0MEU4MjJGRjQwNjAzRkI1NDE3NTIzQjExNUZFNTg2NDA5NDAwMUNFRjI1MjYzOTVDMTk1MzJGMTUzQzQ2MzBCOTVFOTgzNUZBQzk4NUUxQzlERjYyMTg4REJBMTJENUI4QkVFQjQxNEZGRDkwQUZFREY4Rjk4NkRGMzNFRjVCQzdGN0MxNkFDREM0RDQwQTAwODIyQ0UxN0E5NzI0MDY2RUVEODkxMjcxOTVCQjlEMDM3Q0I3RkI3NEFBNzE3OEExQTRDQkVDQzVEOUY2Nzc0N0FBNzQxNTZDNzBFNTRCQUJBODY0MUE1NUI5MzYzNzM4NUEwRDFENTZFNTIyMDg2N0I1QTExRUQ0NENGQzQwNUFDMjM4REMzOTY5MEE5NjZBMkRFMjM4RkZBMUUzQjNDODU5RDk4OERFMTQ5MTZDMzJBQjJBMkNCMzVDNTdGMzYwOUMzNEYxRThFNEI1RkFDMkY0NDZFMEVCNzhDRkQ2NEREN0EzNTcwNjc3RDM3M0U4RkVDNkZGNDdENTQ3MTU3N0Q5MkYyMkIxMTVEMDNGMzAyQzhDRDFBNDNGQ0RDRUJCQTgyM0VFOTQyRDc3MzNGRjdGNzg2NzJCRUFBQ0NFQTI3OTc0NENDMTRENjBFMzkxMkU4MUExNDQyMTk4OUNGNUIyQzEwRkQxQ0RCNkNBOTVFMkNBOEM1NzRBQTZDNEYzODU2NjAyQTBEMzJBOTk3ODY5Nzc1Mjg3OEMwRENCNTBFRjU0NjNFRTYxQzgzRjc3NkFCOUQ4MDk4NzU1QUYwMEQyOTcyRDNFNUU1MDJDMzlBOUNFNTJDODU4ODQ3MkMxRDMyNDJDQTY1ODI5MEY0NzJENDhDQjA4NzY3NTI2NDNDMkY2M0NGRUI2NkRGNkU5M0M4QkUyNDA0REZBMTBBQjNEOEVFRjIxNEMzNzFEQzBFQzI5NzU1QzA4NjU3NEIxQUE5MkE4OTJCNTE3RjZFMDEwNTZERDVFRkVCMjQzN0UyMzEwMEU0ODdFM0Q0QgotMjAwNjEwMDUwOTA0MDMgMiA2IDEwMCA4MTkxIDUgRDJENjREOENDNkZERkE5ODk3QzhBRTgwNUVBN0NCOTcyRDdBMTBGNUEyNjhFQjVCMzNCMENDRTJDNzVFNDgwMzY1QTQ5MDcwMTg1RDhCMzE2ODcyQkFGMEYzQUFGOTQ0OThBOEUwMDA3QTEzRDU3NEM5MDU0NDFGMTlENEIwRDU1QTgzRTJBNzBDMDlGN0IzRTM1M0RFQTc2RjVGRUI0MTkxRTMxRjRBNTJEMEJDNjQzQjlGRDE5NTlCREY4Qjk5QzEzRjI0NUI1RDlFODU4OUQ2QzE4QTg0NDgxNDQ4NkYyNUE4RTE4OUI5NjRBOUU3MjY3NURERTRENzU5QzkwMUMwOUY3QzI0Q0IzRTkzOUI1NEQyMDA5QUU5MzMxNDQ2QzFFREU1RkE5RDBBMzNCMzZGNkE2QzlCNTVFOTU2QTk0MTY5RkJFOUMxQTI0RUM5QTNFNDk3MzcxRjQxMzFGMkIxRTRGQjI1QTFCQjI3QjIzQTY2NjExNTVGMzdDNkVDOTEzRTVDQjIwN0FEODk0QzIzMTk4NTJDNTU2Q0EwNDBDNkI3MkRFNkU5MTNCQ0Y0MTlFNTkxNDUwNzExOUY3NzEyMDZGQUIyNUIxRDZCQUQ1N0FGRUFGNzREODA3Q0M1NzY1NDlDRDk3OUIwQUFDMTNGNUQyQjYzN0NDRjRBNTREMkQ5MDNBNEIyOUMxNkI5RThCRUU4QUQ2MjAwRDI0RTRFM0U5N0VCMjVCMkREMTNDMzFBRTJBNEYyN0Q2RUZCRkExMTNGOTMzNEY5MjIwNEZDRkZDQUE1RUJEQ0NCQTk4NkM1QjZFNjY1RkU3MUQ2NjU0QUNBM0M4MDUxNDI0MTMzNTk3RkQ2NUExOEJCMkFBMjRGRkREOEIwOUE4NzU4RDk4NEUwOUJFMUY1NUIxNkEzN0IzNkIwNTgyOTVCMUU5OTQyQTg5RDM4NkQ0QjREQjU4QzUxNjQyOTI0ODA1MkQ5N0RFNDJCRkMzMkFCMTRGMTNEN0Y5NjNFODY4NjdCOEI3MjQ1MDYyMDYxQzlGMzE1RUE5NEMzOEZDQzBFMTE4MzczQkVGQzQxRDEwMDRDRjBGQTZEOTUxRTIwQkFDNUQyQzE1RjU3OTYxNjM0NjlCODhBNzVGRTVGNUQyQzY5Qzk0OURBNDdEQUM3NUQyMjg2OUYzN0ZBQjI0OTA3OTFGQTVBNTg1NDM2MEVBQTEzNzAxQ0VFNDBFQzM3MTc5NzI3MkExMjc0NkFCQTlDQjMwMzIyNEI4MkY4Q0NFM0Y2MkMwRDNFQTBENjJCRjNCMkMzODdFMDE1QjFBOTZBNEM0QTJBNzNBREE1MjFCMDUzNkI4MUE1MzZBNTExOUVDNTU5RDUyNEJBN0YyQjI1QTA5NEExNjRBNEVFQkI4QURBODg2RENCQTk2NDdGQzREMkQ0QTkxQkEwREIzMjgwNUVEQTc1QjYxRTA5RjQ0QkM0OTg2MkQ3MEI4RjI4QzhFNjMwQ0Q2RjBERjI0NTUzNUQ3OURDRDc1RUNCREU1MUIyOUFBNkREM0Y1OTczNkU1MDI4RTNBQjFFNzVDRkNEQTFGRjlFNkY4RDUyMDI3QTRCQzIxOEZDOUE5RTY2MEJGN0VCMTREMzAwRjQxOTlDMDRCMjQ3MjU0MDVBRkE2NTM1REYwODM3RkVGMzNDMEY4QjU3QjlCREZGQjFEOTU2RTdCNDBFODIyRkY0MDYwM0ZCNTQxNzUyM0IxMTVGRTU4NjQwOTQwMDFDRUYyNTI2Mzk1QzE5NTMyRjE1M0M0NjMwQjk1RTk4MzVGQUM5ODVFMUM5REY2MjE4OERCQTEyRDVCOEJFRUI0MTRGRkQ5MEFGRURGOEY5ODZERjMzRUY1QkM3RjdDMTZBQ0RDNEQ0MEEwMDgyMkNFMTdBOTcyNDA2NkVFRDg5MTI3MTk1QkI5RDAzN0NCN0ZCNzRBQTcxNzhBMUE0Q0JFQ0M1RDlGNjc3NDdBQTc0MTU2QzcwRTU0QkFCQTg2NDFBNTVCOTM2MzczODVBMEQxRDU2RTUyMjA4NjdCNUExMUVENDRDRkM0MDVBQzIzOERDMzk2OTBBOTY2QTJERTIzOEZGQTFFM0IzQzg1OUQ5ODhERTE0OTE2QzMyQUIyQTJDQjM1QzU3RjM2MDlDMzRGMUU4RTRCNUZBQzJGNDQ2RTBFQjc4Q0ZENjRERDdBMzU3MDY3N0QzNzNFOEZFQzZGRjQ3RDU0NzE1NzdEOTJGMjJCMTE1RDAzRjMwMkM4Q0QxQTQzRkNEQ0VCQkE4MjNFRTk0MkQ3NzMzRkY3Rjc4NjcyQkVBQUNDRUEyNzk3NDRDQzE0RDYwRTM5MTJFODFBMTQ0MjE5ODlDRjVCMkMxMEZEMUNEQjZDQTk1RTJDQThDNTc0QUE2QzRGMzg1NjYwMkEwRDMyQTk5Nzg2OTc3NTI4NzhDMERDQjUwRUY1NDYzRUU2MUM4M0Y3NzZBQjlEODA5ODc1NUFGMDBEMjk3MkQzRTVFNTAyQzM5QTlDRTUyQzg1ODg0NzJDMUQzMjQyQ0E2NTgyOTBGNDcyRDQ4Q0IwODc2NzUyNjQzQzJGNjNDRkVCNjZERjZFOTNDOEJFMjQwNERGQTEwQUIzRDhFRUYyMTRDMzcxREMwRUMyOTc1NUMwODY1NzRCMUFBOTJBODkyQjUxN0Y2RTAxMDU2REQ1RUZFQjI0MzdFMjMxMDBFNEEyNDJBMkYKLTIwMDYxMDA1MTUyMjI4IDIgNiAxMDAgODE5MSAyIEQyRDY0RDhDQzZGREZBOTg5N0M4QUU4MDVFQTdDQjk3MkQ3QTEwRjVBMjY4RUI1QjMzQjBDQ0UyQzc1RTQ4MDM2NUE0OTA3MDE4NUQ4QjMxNjg3MkJBRjBGM0FBRjk0NDk4QThFMDAwN0ExM0Q1NzRDOTA1NDQxRjE5RDRCMEQ1NUE4M0UyQTcwQzA5RjdCM0UzNTNERUE3NkY1RkVCNDE5MUUzMUY0QTUyRDBCQzY0M0I5RkQxOTU5QkRGOEI5OUMxM0YyNDVCNUQ5RTg1ODlENkMxOEE4NDQ4MTQ0ODZGMjVBOEUxODlCOTY0QTlFNzI2NzVEREU0RDc1OUM5MDFDMDlGN0MyNENCM0U5MzlCNTREMjAwOUFFOTMzMTQ0NkMxRURFNUZBOUQwQTMzQjM2RjZBNkM5QjU1RTk1NkE5NDE2OUZCRTlDMUEyNEVDOUEzRTQ5NzM3MUY0MTMxRjJCMUU0RkIyNUExQkIyN0IyM0E2NjYxMTU1RjM3QzZFQzkxM0U1Q0IyMDdBRDg5NEMyMzE5ODUyQzU1NkNBMDQwQzZCNzJERTZFOTEzQkNGNDE5RTU5MTQ1MDcxMTlGNzcxMjA2RkFCMjVCMUQ2QkFENTdBRkVBRjc0RDgwN0NDNTc2NTQ5Q0Q5NzlCMEFBQzEzRjVEMkI2MzdDQ0Y0QTU0RDJEOTAzQTRCMjlDMTZCOUU4QkVFOEFENjIwMEQyNEU0RTNFOTdFQjI1QjJERDEzQzMxQUUyQTRGMjdENkVGQkZBMTEzRjkzMzRGOTIyMDRGQ0ZGQ0FBNUVCRENDQkE5ODZDNUI2RTY2NUZFNzFENjY1NEFDQTNDODA1MTQyNDEzMzU5N0ZENjVBMThCQjJBQTI0RkZERDhCMDlBODc1OEQ5ODRFMDlCRTFGNTVCMTZBMzdCMzZCMDU4Mjk1QjFFOTk0MkE4OUQzODZENEI0REI1OEM1MTY0MjkyNDgwNTJEOTdERTQyQkZDMzJBQjE0RjEzRDdGOTYzRTg2ODY3QjhCNzI0NTA2MjA2MUM5RjMxNUVBOTRDMzhGQ0MwRTExODM3M0JFRkM0MUQxMDA0Q0YwRkE2RDk1MUUyMEJBQzVEMkMxNUY1Nzk2MTYzNDY5Qjg4QTc1RkU1RjVEMkM2OUM5NDlEQTQ3REFDNzVEMjI4NjlGMzdGQUIyNDkwNzkxRkE1QTU4NTQzNjBFQUExMzcwMUNFRTQwRUMzNzE3OTcyNzJBMTI3NDZBQkE5Q0IzMDMyMjRCODJGOENDRTNGNjJDMEQzRUEwRDYyQkYzQjJDMzg3RTAxNUIxQTk2QTRDNEEyQTczQURBNTIxQjA1MzZCODFBNTM2QTUxMTlFQzU1OUQ1MjRCQTdGMkIyNUEwOTRBMTY0QTRFRUJCOEFEQTg4NkRDQkE5NjQ3RkM0RDJENEE5MUJBMERCMzI4MDVFREE3NUI2MUUwOUY0NEJDNDk4NjJENzBCOEYyOEM4RTYzMENENkYwREYyNDU1MzVENzlEQ0Q3NUVDQkRFNTFCMjlBQTZERDNGNTk3MzZFNTAyOEUzQUIxRTc1Q0ZDREExRkY5RTZGOEQ1MjAyN0E0QkMyMThGQzlBOUU2NjBCRjdFQjE0RDMwMEY0MTk5QzA0QjI0NzI1NDA1QUZBNjUzNURGMDgzN0ZFRjMzQzBGOEI1N0I5QkRGRkIxRDk1NkU3QjQwRTgyMkZGNDA2MDNGQjU0MTc1MjNCMTE1RkU1ODY0MDk0MDAxQ0VGMjUyNjM5NUMxOTUzMkYxNTNDNDYzMEI5NUU5ODM1RkFDOTg1RTFDOURGNjIxODhEQkExMkQ1QjhCRUVCNDE0RkZEOTBBRkVERjhGOTg2REYzM0VGNUJDN0Y3QzE2QUNEQzRENDBBMDA4MjJDRTE3QTk3MjQwNjZFRUQ4OTEyNzE5NUJCOUQwMzdDQjdGQjc0QUE3MTc4QTFBNENCRUNDNUQ5RjY3NzQ3QUE3NDE1NkM3MEU1NEJBQkE4NjQxQTU1QjkzNjM3Mzg1QTBEMUQ1NkU1MjIwODY3QjVBMTFFRDQ0Q0ZDNDA1QUMyMzhEQzM5NjkwQTk2NkEyREUyMzhGRkExRTNCM0M4NTlEOTg4REUxNDkxNkMzMkFCMkEyQ0IzNUM1N0YzNjA5QzM0RjFFOEU0QjVGQUMyRjQ0NkUwRUI3OENGRDY0REQ3QTM1NzA2NzdEMzczRThGRUM2RkY0N0Q1NDcxNTc3RDkyRjIyQjExNUQwM0YzMDJDOENEMUE0M0ZDRENFQkJBODIzRUU5NDJENzczM0ZGN0Y3ODY3MkJFQUFDQ0VBMjc5NzQ0Q0MxNEQ2MEUzOTEyRTgxQTE0NDIxOTg5Q0Y1QjJDMTBGRDFDREI2Q0E5NUUyQ0E4QzU3NEFBNkM0RjM4NTY2MDJBMEQzMkE5OTc4Njk3NzUyODc4QzBEQ0I1MEVGNTQ2M0VFNjFDODNGNzc2QUI5RDgwOTg3NTVBRjAwRDI5NzJEM0U1RTUwMkMzOUE5Q0U1MkM4NTg4NDcyQzFEMzI0MkNBNjU4MjkwRjQ3MkQ0OENCMDg3Njc1MjY0M0MyRjYzQ0ZFQjY2REY2RTkzQzhCRTI0MDRERkExMEFCM0Q4RUVGMjE0QzM3MURDMEVDMjk3NTVDMDg2NTc0QjFBQTkyQTg5MkI1MTdGNkUwMTA1NkRENUVGRUIyNDM3RTIzMTAwRTRBNEMzQjBCCmRpZmYgLS1naXQgYS9tb2R1bGkuMCBiL21vZHVsaS4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTI5NDg4Li4wMDAwMDAwCi0tLSBhL21vZHVsaS4wCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotTU9EVUxJKDUpICAgICAgICAgICAgICAgICBPcGVuQlNEIFByb2dyYW1tZXIncyBNYW51YWwgICAgICAgICAgICAgICAgTU9EVUxJKDUpCi0KLU5BTUUKLSAgICAgbW9kdWxpIC0gRGlmZmllLUhlbGxtYW4gbW9kdWxpCi0KLURFU0NSSVBUSU9OCi0gICAgIFRoZSAvZXRjL21vZHVsaSBmaWxlIGNvbnRhaW5zIHByaW1lIG51bWJlcnMgYW5kIGdlbmVyYXRvcnMgZm9yIHVzZSBieQotICAgICBzc2hkKDgpIGluIHRoZSBEaWZmaWUtSGVsbG1hbiBHcm91cCBFeGNoYW5nZSBrZXkgZXhjaGFuZ2UgbWV0aG9kLgotCi0gICAgIE5ldyBtb2R1bGkgbWF5IGJlIGdlbmVyYXRlZCB3aXRoIHNzaC1rZXlnZW4oMSkgdXNpbmcgYSB0d28tc3RlcCBwcm9jZXNzLgotICAgICBBbiBpbml0aWFsIGNhbmRpZGF0ZSBnZW5lcmF0aW9uIHBhc3MsIHVzaW5nIHNzaC1rZXlnZW4gLUcsIGNhbGN1bGF0ZXMKLSAgICAgbnVtYmVycyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgdXNlZnVsLiAgQSBzZWNvbmQgcHJpbWFsaXR5IHRlc3RpbmcgcGFzcywKLSAgICAgdXNpbmcgc3NoLWtleWdlbiAtVCwgcHJvdmlkZXMgYSBoaWdoIGRlZ3JlZSBvZiBhc3N1cmFuY2UgdGhhdCB0aGUgbnVtYmVycwotICAgICBhcmUgcHJpbWUgYW5kIGFyZSBzYWZlIGZvciB1c2UgaW4gRGlmZmllLUhlbGxtYW4gb3BlcmF0aW9ucyBieSBzc2hkKDgpLgotICAgICBUaGlzIG1vZHVsaSBmb3JtYXQgaXMgdXNlZCBhcyB0aGUgb3V0cHV0IGZyb20gZWFjaCBwYXNzLgotCi0gICAgIFRoZSBmaWxlIGNvbnNpc3RzIG9mIG5ld2xpbmUtc2VwYXJhdGVkIHJlY29yZHMsIG9uZSBwZXIgbW9kdWx1cywKLSAgICAgY29udGFpbmluZyBzZXZlbiBzcGFjZS1zZXBhcmF0ZWQgZmllbGRzLiAgVGhlc2UgZmllbGRzIGFyZSBhcyBmb2xsb3dzOgotCi0gICAgICAgICAgIHRpbWVzdGFtcCAgICBUaGUgdGltZSB0aGF0IHRoZSBtb2R1bHVzIHdhcyBsYXN0IHByb2Nlc3NlZCBhcwotICAgICAgICAgICAgICAgICAgICAgICAgWVlZWU1NRERISE1NU1MuCi0KLSAgICAgICAgICAgdHlwZSAgICAgICAgIERlY2ltYWwgbnVtYmVyIHNwZWNpZnlpbmcgdGhlIGludGVybmFsIHN0cnVjdHVyZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByaW1lIG1vZHVsdXMuICBTdXBwb3J0ZWQgdHlwZXMgYXJlOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAwICAgICBVbmtub3duLCBub3QgdGVzdGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgIlNhZmUiIHByaW1lOyAocC0xKS8yIGlzIGFsc28gcHJpbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICA0ICAgICBTb3BoaWUgR2VybWFpbjsgKHArMSkqMiBpcyBhbHNvIHByaW1lLgotCi0gICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGkgY2FuZGlkYXRlcyBpbml0aWFsbHkgcHJvZHVjZWQgYnkgc3NoLWtleWdlbigxKQotICAgICAgICAgICAgICAgICAgICAgICAgYXJlIFNvcGhpZSBHZXJtYWluIHByaW1lcyAodHlwZSA0KS4gIEZ1cnRoZXIgcHJpbWFsaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nIHdpdGggc3NoLWtleWdlbigxKSBwcm9kdWNlcyBzYWZlIHByaW1lIG1vZHVsaQotICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgMikgdGhhdCBhcmUgcmVhZHkgZm9yIHVzZSBpbiBzc2hkKDgpLiAgT3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzIGFyZSBub3QgdXNlZCBieSBPcGVuU1NILgotCi0gICAgICAgICAgIHRlc3RzICAgICAgICBEZWNpbWFsIG51bWJlciBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIHByaW1hbGl0eSB0ZXN0cwotICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgbnVtYmVyIGhhcyBiZWVuIHN1YmplY3RlZCB0byByZXByZXNlbnRlZCBhcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXNrIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAweDAwICBOb3QgdGVzdGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSAgQ29tcG9zaXRlIG51bWJlciAtIG5vdCBwcmltZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIgIFNpZXZlIG9mIEVyYXRvc3RoZW5lcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgIFByb2JhYmlsaXN0aWMgTWlsbGVyLVJhYmluIHByaW1hbGl0eSB0ZXN0cy4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNzaC1rZXlnZW4oMSkgbW9kdWxpIGNhbmRpZGF0ZSBnZW5lcmF0aW9uIHVzZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBTaWV2ZSBvZiBFcmF0b3N0aGVuZXMgKGZsYWcgMHgwMikuICBTdWJzZXF1ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBzc2gta2V5Z2VuKDEpIHByaW1hbGl0eSB0ZXN0cyBhcmUgTWlsbGVyLVJhYmluIHRlc3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxhZyAweDA0KS4KLQotICAgICAgICAgICB0cmlhbHMgICAgICAgRGVjaW1hbCBudW1iZXIgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHByaW1hbGl0eQotICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxzIHRoYXQgaGF2ZSBiZWVuIHBlcmZvcm1lZCBvbiB0aGUgbW9kdWx1cy4KLQotICAgICAgICAgICBzaXplICAgICAgICAgRGVjaW1hbCBudW1iZXIgaW5kaWNhdGluZyB0aGUgc2l6ZSBvZiB0aGUgcHJpbWUgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMuCi0KLSAgICAgICAgICAgZ2VuZXJhdG9yICAgIFRoZSByZWNvbW1lbmRlZCBnZW5lcmF0b3IgZm9yIHVzZSB3aXRoIHRoaXMgbW9kdWx1cwotICAgICAgICAgICAgICAgICAgICAgICAgKGhleGFkZWNpbWFsKS4KLQotICAgICAgICAgICBtb2R1bHVzICAgICAgVGhlIG1vZHVsdXMgaXRzZWxmIGluIGhleGFkZWNpbWFsLgotCi0gICAgIFdoZW4gcGVyZm9ybWluZyBEaWZmaWUtSGVsbG1hbiBHcm91cCBFeGNoYW5nZSwgc3NoZCg4KSBmaXJzdCBlc3RpbWF0ZXMKLSAgICAgdGhlIHNpemUgb2YgdGhlIG1vZHVsdXMgcmVxdWlyZWQgdG8gcHJvZHVjZSBlbm91Z2ggRGlmZmllLUhlbGxtYW4gb3V0cHV0Ci0gICAgIHRvIHN1ZmZpY2llbnRseSBrZXkgdGhlIHNlbGVjdGVkIHN5bW1ldHJpYyBjaXBoZXIuICBzc2hkKDgpIHRoZW4gcmFuZG9tbHkKLSAgICAgc2VsZWN0cyBhIG1vZHVsdXMgZnJvbSAvZXRjL21vZHVsaSB0aGF0IGJlc3QgbWVldHMgdGhlIHNpemUgcmVxdWlyZW1lbnQuCi0KLVNFRSBBTFNPCi0gICAgIHNzaC1rZXlnZW4oMSksIHNzaGQoOCkKLQotICAgICBEaWZmaWUtSGVsbG1hbiBHcm91cCBFeGNoYW5nZSBmb3IgdGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBUcmFuc3BvcnQgTGF5ZXIKLSAgICAgUHJvdG9jb2wsIFJGQyA0NDE5LCAyMDA2LgotCi1PcGVuQlNEIDUuMCAgICAgICAgICAgICAgICAgICAgT2N0b2JlciAxNCwgMjAxMCAgICAgICAgICAgICAgICAgICAgT3BlbkJTRCA1LjAKZGlmZiAtLWdpdCBhL21vZHVsaS41IGIvbW9kdWxpLjUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMDFiOTQuLjAwMDAwMDAKLS0tIGEvbW9kdWxpLjUKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLlwiCSRPcGVuQlNEOiBtb2R1bGkuNSx2IDEuMTUgMjAxMC8xMC8xNCAyMDo0MToyOCBqbWMgRXhwICQKLS5cIgotLlwiIENvcHlyaWdodCAoYykgMjAwOCBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0uXCIKLS5cIiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLS5cIiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0uXCIgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLS5cIgotLlwiIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotLlwiIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLS5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotLlwiIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLS5cIiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLS5cIiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotLlwiIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0uRGQgJE1kb2NkYXRlOiBPY3RvYmVyIDE0IDIwMTAgJAotLkR0IE1PRFVMSSA1Ci0uT3MKLS5TaCBOQU1FCi0uTm0gbW9kdWxpCi0uTmQgRGlmZmllLUhlbGxtYW4gbW9kdWxpCi0uU2ggREVTQ1JJUFRJT04KLVRoZQotLlBhIC9ldGMvbW9kdWxpCi1maWxlIGNvbnRhaW5zIHByaW1lIG51bWJlcnMgYW5kIGdlbmVyYXRvcnMgZm9yIHVzZSBieQotLlhyIHNzaGQgOAotaW4gdGhlIERpZmZpZS1IZWxsbWFuIEdyb3VwIEV4Y2hhbmdlIGtleSBleGNoYW5nZSBtZXRob2QuCi0uUHAKLU5ldyBtb2R1bGkgbWF5IGJlIGdlbmVyYXRlZCB3aXRoCi0uWHIgc3NoLWtleWdlbiAxCi11c2luZyBhIHR3by1zdGVwIHByb2Nlc3MuCi1BbiBpbml0aWFsCi0uRW0gY2FuZGlkYXRlIGdlbmVyYXRpb24KLXBhc3MsIHVzaW5nCi0uSWMgc3NoLWtleWdlbiAtRyAsCi1jYWxjdWxhdGVzIG51bWJlcnMgdGhhdCBhcmUgbGlrZWx5IHRvIGJlIHVzZWZ1bC4KLUEgc2Vjb25kCi0uRW0gcHJpbWFsaXR5IHRlc3RpbmcKLXBhc3MsIHVzaW5nCi0uSWMgc3NoLWtleWdlbiAtVCAsCi1wcm92aWRlcyBhIGhpZ2ggZGVncmVlIG9mIGFzc3VyYW5jZSB0aGF0IHRoZSBudW1iZXJzIGFyZSBwcmltZSBhbmQgYXJlCi1zYWZlIGZvciB1c2UgaW4gRGlmZmllLUhlbGxtYW4gb3BlcmF0aW9ucyBieQotLlhyIHNzaGQgOCAuCi1UaGlzCi0uTm0KLWZvcm1hdCBpcyB1c2VkIGFzIHRoZSBvdXRwdXQgZnJvbSBlYWNoIHBhc3MuCi0uUHAKLVRoZSBmaWxlIGNvbnNpc3RzIG9mIG5ld2xpbmUtc2VwYXJhdGVkIHJlY29yZHMsIG9uZSBwZXIgbW9kdWx1cywKLWNvbnRhaW5pbmcgc2V2ZW4gc3BhY2Utc2VwYXJhdGVkIGZpZWxkcy4KLVRoZXNlIGZpZWxkcyBhcmUgYXMgZm9sbG93czoKLS5CbCAtdGFnIC13aWR0aCBEZXNjcmlwdGlvbiAtb2Zmc2V0IGluZGVudAotLkl0IHRpbWVzdGFtcAotVGhlIHRpbWUgdGhhdCB0aGUgbW9kdWx1cyB3YXMgbGFzdCBwcm9jZXNzZWQgYXMgWVlZWU1NRERISE1NU1MuCi0uSXQgdHlwZQotRGVjaW1hbCBudW1iZXIgc3BlY2lmeWluZyB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIHRoZSBwcmltZSBtb2R1bHVzLgotU3VwcG9ydGVkIHR5cGVzIGFyZToKLS5QcAotLkJsIC10YWcgLXdpZHRoIDB4MDAgLWNvbXBhY3QKLS5JdCAwCi1Vbmtub3duLCBub3QgdGVzdGVkLgotLkl0IDIKLSJTYWZlIiBwcmltZTsgKHAtMSkvMiBpcyBhbHNvIHByaW1lLgotLkl0IDQKLVNvcGhpZSBHZXJtYWluOyAocCsxKSoyIGlzIGFsc28gcHJpbWUuCi0uRWwKLS5QcAotTW9kdWxpIGNhbmRpZGF0ZXMgaW5pdGlhbGx5IHByb2R1Y2VkIGJ5Ci0uWHIgc3NoLWtleWdlbiAxCi1hcmUgU29waGllIEdlcm1haW4gcHJpbWVzICh0eXBlIDQpLgotRnVydGhlciBwcmltYWxpdHkgdGVzdGluZyB3aXRoCi0uWHIgc3NoLWtleWdlbiAxCi1wcm9kdWNlcyBzYWZlIHByaW1lIG1vZHVsaSAodHlwZSAyKSB0aGF0IGFyZSByZWFkeSBmb3IgdXNlIGluCi0uWHIgc3NoZCA4IC4KLU90aGVyIHR5cGVzIGFyZSBub3QgdXNlZCBieSBPcGVuU1NILgotLkl0IHRlc3RzCi1EZWNpbWFsIG51bWJlciBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIHByaW1hbGl0eSB0ZXN0cyB0aGF0IHRoZSBudW1iZXIKLWhhcyBiZWVuIHN1YmplY3RlZCB0byByZXByZXNlbnRlZCBhcyBhIGJpdG1hc2sgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0uUHAKLS5CbCAtdGFnIC13aWR0aCAweDAwIC1jb21wYWN0Ci0uSXQgMHgwMAotTm90IHRlc3RlZC4KLS5JdCAweDAxCi1Db21wb3NpdGUgbnVtYmVyIFwoZW4gbm90IHByaW1lLgotLkl0IDB4MDIKLVNpZXZlIG9mIEVyYXRvc3RoZW5lcy4KLS5JdCAweDA0Ci1Qcm9iYWJpbGlzdGljIE1pbGxlci1SYWJpbiBwcmltYWxpdHkgdGVzdHMuCi0uRWwKLS5QcAotVGhlCi0uWHIgc3NoLWtleWdlbiAxCi1tb2R1bGkgY2FuZGlkYXRlIGdlbmVyYXRpb24gdXNlcyB0aGUgU2lldmUgb2YgRXJhdG9zdGhlbmVzIChmbGFnIDB4MDIpLgotU3Vic2VxdWVudAotLlhyIHNzaC1rZXlnZW4gMQotcHJpbWFsaXR5IHRlc3RzIGFyZSBNaWxsZXItUmFiaW4gdGVzdHMgKGZsYWcgMHgwNCkuCi0uSXQgdHJpYWxzCi1EZWNpbWFsIG51bWJlciBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgcHJpbWFsaXR5IHRyaWFscwotdGhhdCBoYXZlIGJlZW4gcGVyZm9ybWVkIG9uIHRoZSBtb2R1bHVzLgotLkl0IHNpemUKLURlY2ltYWwgbnVtYmVyIGluZGljYXRpbmcgdGhlIHNpemUgb2YgdGhlIHByaW1lIGluIGJpdHMuCi0uSXQgZ2VuZXJhdG9yCi1UaGUgcmVjb21tZW5kZWQgZ2VuZXJhdG9yIGZvciB1c2Ugd2l0aCB0aGlzIG1vZHVsdXMgKGhleGFkZWNpbWFsKS4KLS5JdCBtb2R1bHVzCi1UaGUgbW9kdWx1cyBpdHNlbGYgaW4gaGV4YWRlY2ltYWwuCi0uRWwKLS5QcAotV2hlbiBwZXJmb3JtaW5nIERpZmZpZS1IZWxsbWFuIEdyb3VwIEV4Y2hhbmdlLAotLlhyIHNzaGQgOAotZmlyc3QgZXN0aW1hdGVzIHRoZSBzaXplIG9mIHRoZSBtb2R1bHVzIHJlcXVpcmVkIHRvIHByb2R1Y2UgZW5vdWdoCi1EaWZmaWUtSGVsbG1hbiBvdXRwdXQgdG8gc3VmZmljaWVudGx5IGtleSB0aGUgc2VsZWN0ZWQgc3ltbWV0cmljIGNpcGhlci4KLS5YciBzc2hkIDgKLXRoZW4gcmFuZG9tbHkgc2VsZWN0cyBhIG1vZHVsdXMgZnJvbQotLkZhIC9ldGMvbW9kdWxpCi10aGF0IGJlc3QgbWVldHMgdGhlIHNpemUgcmVxdWlyZW1lbnQuCi0uU2ggU0VFIEFMU08KLS5YciBzc2gta2V5Z2VuIDEgLAotLlhyIHNzaGQgOAotLlJzCi0uJVIgUkZDIDQ0MTkKLS4lVCAiRGlmZmllLUhlbGxtYW4gR3JvdXAgRXhjaGFuZ2UgZm9yIHRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgVHJhbnNwb3J0IExheWVyIFByb3RvY29sIgotLiVEIDIwMDYKLS5SZQpkaWZmIC0tZ2l0IGEvbW9kdWxpLmMgYi9tb2R1bGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2NGE4Yi4uMDAwMDAwMAotLS0gYS9tb2R1bGkuYworKysgL2Rldi9udWxsCkBAIC0xLDY1MiArMCwwIEBACi0vKiAkT3BlbkJTRDogbW9kdWxpLmMsdiAxLjIyIDIwMTAvMTEvMTAgMDE6MzM6MDcgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IDE5OTQgUGhpbCBLYXJuIDxrYXJuQHF1YWxjb21tLmNvbT4KLSAqIENvcHlyaWdodCAxOTk2LTE5OTgsIDIwMDMgV2lsbGlhbSBBbGxlbiBTaW1wc29uIDx3c2ltcHNvbkBncmVlbmRyYWdvbi5jb20+Ci0gKiBDb3B5cmlnaHQgMjAwMCBOaWVscyBQcm92b3MgPHByb3Zvc0BjaXRpLnVtaWNoLmVkdT4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS8qCi0gKiBUd28tc3RlcCBwcm9jZXNzIHRvIGdlbmVyYXRlIHNhZmUgcHJpbWVzIGZvciBESEdFWAotICoKLSAqICBTaWV2ZSBjYW5kaWRhdGVzIGZvciAic2FmZSIgcHJpbWVzLAotICogIHN1aXRhYmxlIGZvciB1c2UgYXMgRGlmZmllLUhlbGxtYW4gbW9kdWxpOwotICogIHRoYXQgaXMsIHdoZXJlIHEgPSAocC0xKS8yIGlzIGFsc28gcHJpbWUuCi0gKgotICogRmlyc3Qgc3RlcDogZ2VuZXJhdGUgY2FuZGlkYXRlIHByaW1lcyAobWVtb3J5IGludGVuc2l2ZSkKLSAqIFNlY29uZCBzdGVwOiB0ZXN0IHByaW1lcycgc2FmZXR5IChwcm9jZXNzb3IgaW50ZW5zaXZlKQotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAiZGguaCIKLSNpbmNsdWRlICJsb2cuaCIKLQotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmgiCi0KLS8qCi0gKiBGaWxlIG91dHB1dCBkZWZpbmVzCi0gKi8KLQotLyogbmVlZCBsaW5lIGxvbmcgZW5vdWdoIGZvciBsYXJnZXN0IG1vZHVsaSBwbHVzIGhlYWRlcnMgKi8KLSNkZWZpbmUgUUxJTkVTSVpFCQkoMTAwKzgxOTIpCi0KLS8qCi0gKiBTaXplOiBkZWNpbWFsLgotICogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0ICgwIHRvIE0pLgotICogV0FSTklORzogaW50ZXJuYWxseSwgdXN1YWxseSAxIHRvIE4uCi0gKi8KLSNkZWZpbmUgUVNJWkVfTUlOSU1VTQkJKDUxMSkKLQotLyoKLSAqIFByaW1lIHNpZXZpbmcgZGVmaW5lcwotICovCi0KLS8qIENvbnN0YW50OiBhc3N1bWluZyA4IGJpdCBieXRlcyBhbmQgMzIgYml0IHdvcmRzICovCi0jZGVmaW5lIFNISUZUX0JJVAkoMykKLSNkZWZpbmUgU0hJRlRfQllURQkoMikKLSNkZWZpbmUgU0hJRlRfV09SRAkoU0hJRlRfQklUK1NISUZUX0JZVEUpCi0jZGVmaW5lIFNISUZUX01FR0FCWVRFCSgyMCkKLSNkZWZpbmUgU0hJRlRfTUVHQVdPUkQJKFNISUZUX01FR0FCWVRFLVNISUZUX0JZVEUpCi0KLS8qCi0gKiBVc2luZyB2aXJ0dWFsIG1lbW9yeSBjYW4gY2F1c2UgdGhyYXNoaW5nLiAgVGhpcyBzaG91bGQgYmUgdGhlIGxhcmdlc3QKLSAqIG51bWJlciB0aGF0IGlzIHN1cHBvcnRlZCB3aXRob3V0IGEgbGFyZ2UgYW1vdW50IG9mIGRpc2sgYWN0aXZpdHkgLS0KLSAqIHRoYXQgd291bGQgaW5jcmVhc2UgdGhlIHJ1biB0aW1lIGZyb20gaG91cnMgdG8gZGF5cyBvciB3ZWVrcyEKLSAqLwotI2RlZmluZSBMQVJHRV9NSU5JTVVNCSg4VUwpCS8qIG1lZ2FieXRlcyAqLwotCi0vKgotICogRG8gbm90IGluY3JlYXNlIHRoaXMgbnVtYmVyIGJleW9uZCB0aGUgdW5zaWduZWQgaW50ZWdlciBiaXQgc2l6ZS4KLSAqIER1ZSB0byBhIG11bHRpcGxlIG9mIDQsIGl0IG11c3QgYmUgTEVTUyB0aGFuIDEyOCAoeWllbGRpbmcgMioqMzAgYml0cykuCi0gKi8KLSNkZWZpbmUgTEFSR0VfTUFYSU1VTQkoMTI3VUwpCS8qIG1lZ2FieXRlcyAqLwotCi0vKgotICogQ29uc3RhbnQ6IHdoZW4gdXNlZCB3aXRoIDMyLWJpdCBpbnRlZ2VycywgdGhlIGxhcmdlc3Qgc2lldmUgcHJpbWUKLSAqIGhhcyB0byBiZSBsZXNzIHRoYW4gMioqMzIuCi0gKi8KLSNkZWZpbmUgU01BTExfTUFYSU1VTQkoMHhmZmZmZmZmZlVMKQotCi0vKiBDb25zdGFudDogY2FuIHNpZXZlIGFsbCBwcmltZXMgbGVzcyB0aGFuIDIqKjMyLCBhcyA2NTUzNyoqMiA+IDIqKjMyLTEuICovCi0jZGVmaW5lIFRJTllfTlVNQkVSCSgxVUw8PDE2KQotCi0vKiBFbnN1cmUgZW5vdWdoIGJpdCBzcGFjZSBmb3IgdGVzdGluZyAyKnEuICovCi0jZGVmaW5lIFRFU1RfTUFYSU1VTQkoMVVMPDwxNikKLSNkZWZpbmUgVEVTVF9NSU5JTVVNCShRU0laRV9NSU5JTVVNICsgMSkKLS8qIHJlYWwgVEVTVF9NSU5JTVVNCSgxVUwgPDwgKFNISUZUX1dPUkQgLSBURVNUX1BPV0VSKSkgKi8KLSNkZWZpbmUgVEVTVF9QT1dFUgkoMykJLyogMioqbiwgbiA8IFNISUZUX1dPUkQgKi8KLQotLyogYml0IG9wZXJhdGlvbnMgb24gMzItYml0IHdvcmRzICovCi0jZGVmaW5lIEJJVF9DTEVBUihhLG4pCSgoYSlbKG4pPj5TSElGVF9XT1JEXSAmPSB+KDFMIDw8ICgobikgJiAzMSkpKQotI2RlZmluZSBCSVRfU0VUKGEsbikJKChhKVsobik+PlNISUZUX1dPUkRdIHw9ICgxTCA8PCAoKG4pICYgMzEpKSkKLSNkZWZpbmUgQklUX1RFU1QoYSxuKQkoKGEpWyhuKT4+U0hJRlRfV09SRF0gJiAoMUwgPDwgKChuKSAmIDMxKSkpCi0KLS8qCi0gKiBQcmltZSB0ZXN0aW5nIGRlZmluZXMKLSAqLwotCi0vKiBNaW5pbXVtIG51bWJlciBvZiBwcmltYWxpdHkgdGVzdHMgdG8gcGVyZm9ybSAqLwotI2RlZmluZSBUUklBTF9NSU5JTVVNCSg0KQotCi0vKgotICogU2lldmluZyBkYXRhIChYWFggLSBtb3ZlIHRvIHN0cnVjdCkKLSAqLwotCi0vKiBzaWV2ZSAyKioxNiAqLwotc3RhdGljIHVfaW50MzJfdCAqVGlueVNpZXZlLCB0aW55Yml0czsKLQotLyogc2lldmUgMioqMzAgaW4gMioqMTYgcGFydHMgKi8KLXN0YXRpYyB1X2ludDMyX3QgKlNtYWxsU2lldmUsIHNtYWxsYml0cywgc21hbGxiYXNlOwotCi0vKiBzaWV2ZSByZWxhdGl2ZSB0byB0aGUgaW5pdGlhbCB2YWx1ZSAqLwotc3RhdGljIHVfaW50MzJfdCAqTGFyZ2VTaWV2ZSwgbGFyZ2V3b3JkcywgbGFyZ2V0cmllcywgbGFyZ2VudW1iZXJzOwotc3RhdGljIHVfaW50MzJfdCBsYXJnZWJpdHMsIGxhcmdlbWVtb3J5OwkvKiBtZWdhYnl0ZXMgKi8KLXN0YXRpYyBCSUdOVU0gKmxhcmdlYmFzZTsKLQotaW50IGdlbl9jYW5kaWRhdGVzKEZJTEUgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIEJJR05VTSAqKTsKLWludCBwcmltZV90ZXN0KEZJTEUgKiwgRklMRSAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCk7Ci0KLS8qCi0gKiBwcmludCBtb2R1bGkgb3V0IGluIGNvbnNpc3RlbnQgZm9ybSwKLSAqLwotc3RhdGljIGludAotcWZpbGVvdXQoRklMRSAqIG9maWxlLCB1X2ludDMyX3Qgb3R5cGUsIHVfaW50MzJfdCBvdGVzdHMsIHVfaW50MzJfdCBvdHJpZXMsCi0gICAgdV9pbnQzMl90IG9zaXplLCB1X2ludDMyX3Qgb2dlbmVyYXRvciwgQklHTlVNICogb21vZHVsdXMpCi17Ci0Jc3RydWN0IHRtICpndG07Ci0JdGltZV90IHRpbWVfbm93OwotCWludCByZXM7Ci0KLQl0aW1lKCZ0aW1lX25vdyk7Ci0JZ3RtID0gZ210aW1lKCZ0aW1lX25vdyk7Ci0KLQlyZXMgPSBmcHJpbnRmKG9maWxlLCAiJTA0ZCUwMmQlMDJkJTAyZCUwMmQlMDJkICV1ICV1ICV1ICV1ICV4ICIsCi0JICAgIGd0bS0+dG1feWVhciArIDE5MDAsIGd0bS0+dG1fbW9uICsgMSwgZ3RtLT50bV9tZGF5LAotCSAgICBndG0tPnRtX2hvdXIsIGd0bS0+dG1fbWluLCBndG0tPnRtX3NlYywKLQkgICAgb3R5cGUsIG90ZXN0cywgb3RyaWVzLCBvc2l6ZSwgb2dlbmVyYXRvcik7Ci0KLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuICgtMSk7Ci0KLQlpZiAoQk5fcHJpbnRfZnAob2ZpbGUsIG9tb2R1bHVzKSA8IDEpCi0JCXJldHVybiAoLTEpOwotCi0JcmVzID0gZnByaW50ZihvZmlsZSwgIlxuIik7Ci0JZmZsdXNoKG9maWxlKTsKLQotCXJldHVybiAocmVzID4gMCA/IDAgOiAtMSk7Ci19Ci0KLQotLyoKLSAqKiBTaWV2ZSBwJ3MgYW5kIHEncyB3aXRoIHNtYWxsIGZhY3RvcnMKLSAqLwotc3RhdGljIHZvaWQKLXNpZXZlX2xhcmdlKHVfaW50MzJfdCBzKQotewotCXVfaW50MzJfdCByLCB1OwotCi0JZGVidWczKCJzaWV2ZV9sYXJnZSAldSIsIHMpOwotCWxhcmdldHJpZXMrKzsKLQkvKiByID0gbGFyZ2ViYXNlIG1vZCBzICovCi0JciA9IEJOX21vZF93b3JkKGxhcmdlYmFzZSwgcyk7Ci0JaWYgKHIgPT0gMCkKLQkJdSA9IDA7IC8qIHMgZGl2aWRlcyBpbnRvIGxhcmdlYmFzZSBleGFjdGx5ICovCi0JZWxzZQotCQl1ID0gcyAtIHI7IC8qIGxhcmdlYmFzZSt1IGlzIGZpcnN0IGVudHJ5IGRpdmlzaWJsZSBieSBzICovCi0KLQlpZiAodSA8IGxhcmdlYml0cyAqIDIpIHsKLQkJLyoKLQkJICogVGhlIHNpZXZlIG9taXRzIHAncyBhbmQgcSdzIGRpdmlzaWJsZSBieSAyLCBzbyBlbnN1cmUgdGhhdAotCQkgKiBsYXJnZWJhc2UrdSBpcyBvZGQuIFRoZW4sIHN0ZXAgdGhyb3VnaCB0aGUgc2lldmUgaW4KLQkJICogaW5jcmVtZW50cyBvZiAyKnMKLQkJICovCi0JCWlmICh1ICYgMHgxKQotCQkJdSArPSBzOyAvKiBNYWtlIGxhcmdlYmFzZSt1IG9kZCwgYW5kIHUgZXZlbiAqLwotCi0JCS8qIE1hcmsgYWxsIG11bHRpcGxlcyBvZiAyKnMgKi8KLQkJZm9yICh1IC89IDI7IHUgPCBsYXJnZWJpdHM7IHUgKz0gcykKLQkJCUJJVF9TRVQoTGFyZ2VTaWV2ZSwgdSk7Ci0JfQotCi0JLyogciA9IHAgbW9kIHMgKi8KLQlyID0gKDIgKiByICsgMSkgJSBzOwotCWlmIChyID09IDApCi0JCXUgPSAwOyAvKiBzIGRpdmlkZXMgcCBleGFjdGx5ICovCi0JZWxzZQotCQl1ID0gcyAtIHI7IC8qIHArdSBpcyBmaXJzdCBlbnRyeSBkaXZpc2libGUgYnkgcyAqLwotCi0JaWYgKHUgPCBsYXJnZWJpdHMgKiA0KSB7Ci0JCS8qCi0JCSAqIFRoZSBzaWV2ZSBvbWl0cyBwJ3MgZGl2aXNpYmxlIGJ5IDQsIHNvIGVuc3VyZSB0aGF0Ci0JCSAqIGxhcmdlYmFzZSt1IGlzIG5vdC4gVGhlbiwgc3RlcCB0aHJvdWdoIHRoZSBzaWV2ZSBpbgotCQkgKiBpbmNyZW1lbnRzIG9mIDQqcwotCQkgKi8KLQkJd2hpbGUgKHUgJiAweDMpIHsKLQkJCWlmIChTTUFMTF9NQVhJTVVNIC0gdSA8IHMpCi0JCQkJcmV0dXJuOwotCQkJdSArPSBzOwotCQl9Ci0KLQkJLyogTWFyayBhbGwgbXVsdGlwbGVzIG9mIDQqcyAqLwotCQlmb3IgKHUgLz0gNDsgdSA8IGxhcmdlYml0czsgdSArPSBzKQotCQkJQklUX1NFVChMYXJnZVNpZXZlLCB1KTsKLQl9Ci19Ci0KLS8qCi0gKiBsaXN0IGNhbmRpZGF0ZXMgZm9yIFNvcGhpZS1HZXJtYWluIHByaW1lcyAod2hlcmUgcSA9IChwLTEpLzIpCi0gKiB0byBzdGFuZGFyZCBvdXRwdXQuCi0gKiBUaGUgbGlzdCBpcyBjaGVja2VkIGFnYWluc3Qgc21hbGwga25vd24gcHJpbWVzIChsZXNzIHRoYW4gMioqMzApLgotICovCi1pbnQKLWdlbl9jYW5kaWRhdGVzKEZJTEUgKm91dCwgdV9pbnQzMl90IG1lbW9yeSwgdV9pbnQzMl90IHBvd2VyLCBCSUdOVU0gKnN0YXJ0KQotewotCUJJR05VTSAqcTsKLQl1X2ludDMyX3QgaiwgciwgcywgdDsKLQl1X2ludDMyX3Qgc21hbGx3b3JkcyA9IFRJTllfTlVNQkVSID4+IDY7Ci0JdV9pbnQzMl90IHRpbnl3b3JkcyA9IFRJTllfTlVNQkVSID4+IDY7Ci0JdGltZV90IHRpbWVfc3RhcnQsIHRpbWVfc3RvcDsKLQl1X2ludDMyX3QgaTsKLQlpbnQgcmV0ID0gMDsKLQotCWxhcmdlbWVtb3J5ID0gbWVtb3J5OwotCi0JaWYgKG1lbW9yeSAhPSAwICYmCi0JICAgIChtZW1vcnkgPCBMQVJHRV9NSU5JTVVNIHx8IG1lbW9yeSA+IExBUkdFX01BWElNVU0pKSB7Ci0JCWVycm9yKCJJbnZhbGlkIG1lbW9yeSBhbW91bnQgKG1pbiAlbGQsIG1heCAlbGQpIiwKLQkJICAgIExBUkdFX01JTklNVU0sIExBUkdFX01BWElNVU0pOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQkvKgotCSAqIFNldCBwb3dlciB0byB0aGUgbGVuZ3RoIGluIGJpdHMgb2YgdGhlIHByaW1lIHRvIGJlIGdlbmVyYXRlZC4KLQkgKiBUaGlzIGlzIGNoYW5nZWQgdG8gMSBsZXNzIHRoYW4gdGhlIGRlc2lyZWQgc2FmZSBwcmltZSBtb2R1bGkgcC4KLQkgKi8KLQlpZiAocG93ZXIgPiBURVNUX01BWElNVU0pIHsKLQkJZXJyb3IoIlRvbyBtYW55IGJpdHM6ICV1ID4gJWx1IiwgcG93ZXIsIFRFU1RfTUFYSU1VTSk7Ci0JCXJldHVybiAoLTEpOwotCX0gZWxzZSBpZiAocG93ZXIgPCBURVNUX01JTklNVU0pIHsKLQkJZXJyb3IoIlRvbyBmZXcgYml0czogJXUgPCAldSIsIHBvd2VyLCBURVNUX01JTklNVU0pOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JcG93ZXItLTsgLyogZGVjcmVtZW50IGJlZm9yZSBzcXVhcmluZyAqLwotCi0JLyoKLQkgKiBUaGUgZGVuc2l0eSBvZiBvcmRpbmFyeSBwcmltZXMgaXMgb24gdGhlIG9yZGVyIG9mIDEvYml0cywgc28gdGhlCi0JICogZGVuc2l0eSBvZiBzYWZlIHByaW1lcyBzaG91bGQgYmUgYWJvdXQgKDEvYml0cykqKjIuIFNldCB0ZXN0IHJhbmdlCi0JICogdG8gc29tZXRoaW5nIHdlbGwgYWJvdmUgYml0cyoqMiB0byBiZSByZWFzb25hYmx5IHN1cmUgKGJ1dCBub3QKLQkgKiBndWFyYW50ZWVkKSBvZiBjYXRjaGluZyBhdCBsZWFzdCBvbmUgc2FmZSBwcmltZS4KLQkgKi8KLQlsYXJnZXdvcmRzID0gKChwb3dlciAqIHBvd2VyKSA+PiAoU0hJRlRfV09SRCAtIFRFU1RfUE9XRVIpKTsKLQotCS8qCi0JICogTmVlZCBpZGVhIG9mIGhvdyBtdWNoIG1lbW9yeSBpcyBhdmFpbGFibGUuIFdlIGRvbid0IGhhdmUgdG8gdXNlIGFsbAotCSAqIG9mIGl0LgotCSAqLwotCWlmIChsYXJnZW1lbW9yeSA+IExBUkdFX01BWElNVU0pIHsKLQkJbG9naXQoIkxpbWl0ZWQgbWVtb3J5OiAldSBNQjsgbGltaXQgJWx1IE1CIiwKLQkJICAgIGxhcmdlbWVtb3J5LCBMQVJHRV9NQVhJTVVNKTsKLQkJbGFyZ2VtZW1vcnkgPSBMQVJHRV9NQVhJTVVNOwotCX0KLQotCWlmIChsYXJnZXdvcmRzIDw9IChsYXJnZW1lbW9yeSA8PCBTSElGVF9NRUdBV09SRCkpIHsKLQkJbG9naXQoIkluY3JlYXNlZCBtZW1vcnk6ICV1IE1COyBuZWVkICV1IGJ5dGVzIiwKLQkJICAgIGxhcmdlbWVtb3J5LCAobGFyZ2V3b3JkcyA8PCBTSElGVF9CWVRFKSk7Ci0JCWxhcmdld29yZHMgPSAobGFyZ2VtZW1vcnkgPDwgU0hJRlRfTUVHQVdPUkQpOwotCX0gZWxzZSBpZiAobGFyZ2VtZW1vcnkgPiAwKSB7Ci0JCWxvZ2l0KCJEZWNyZWFzZWQgbWVtb3J5OiAldSBNQjsgd2FudCAldSBieXRlcyIsCi0JCSAgICBsYXJnZW1lbW9yeSwgKGxhcmdld29yZHMgPDwgU0hJRlRfQllURSkpOwotCQlsYXJnZXdvcmRzID0gKGxhcmdlbWVtb3J5IDw8IFNISUZUX01FR0FXT1JEKTsKLQl9Ci0KLQlUaW55U2lldmUgPSB4Y2FsbG9jKHRpbnl3b3Jkcywgc2l6ZW9mKHVfaW50MzJfdCkpOwotCXRpbnliaXRzID0gdGlueXdvcmRzIDw8IFNISUZUX1dPUkQ7Ci0KLQlTbWFsbFNpZXZlID0geGNhbGxvYyhzbWFsbHdvcmRzLCBzaXplb2YodV9pbnQzMl90KSk7Ci0Jc21hbGxiaXRzID0gc21hbGx3b3JkcyA8PCBTSElGVF9XT1JEOwotCi0JLyoKLQkgKiBkeW5hbWljYWxseSBkZXRlcm1pbmUgYXZhaWxhYmxlIG1lbW9yeQotCSAqLwotCXdoaWxlICgoTGFyZ2VTaWV2ZSA9IGNhbGxvYyhsYXJnZXdvcmRzLCBzaXplb2YodV9pbnQzMl90KSkpID09IE5VTEwpCi0JCWxhcmdld29yZHMgLT0gKDFMIDw8IChTSElGVF9NRUdBV09SRCAtIDIpKTsgLyogMS80IE1CIGNodW5rcyAqLwotCi0JbGFyZ2ViaXRzID0gbGFyZ2V3b3JkcyA8PCBTSElGVF9XT1JEOwotCWxhcmdlbnVtYmVycyA9IGxhcmdlYml0cyAqIDI7CS8qIGV2ZW4gbnVtYmVycyBleGNsdWRlZCAqLwotCi0JLyogdmFsaWRhdGlvbiBjaGVjazogY291bnQgdGhlIG51bWJlciBvZiBwcmltZXMgdHJpZWQgKi8KLQlsYXJnZXRyaWVzID0gMDsKLQlpZiAoKHEgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoIkJOX25ldyBmYWlsZWQiKTsKLQotCS8qCi0JICogR2VuZXJhdGUgcmFuZG9tIHN0YXJ0aW5nIHBvaW50IGZvciBzdWJwcmltZSBzZWFyY2gsIG9yIHVzZQotCSAqIHNwZWNpZmllZCBwYXJhbWV0ZXIuCi0JICovCi0JaWYgKChsYXJnZWJhc2UgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoIkJOX25ldyBmYWlsZWQiKTsKLQlpZiAoc3RhcnQgPT0gTlVMTCkgewotCQlpZiAoQk5fcmFuZChsYXJnZWJhc2UsIHBvd2VyLCAxLCAxKSA9PSAwKQotCQkJZmF0YWwoIkJOX3JhbmQgZmFpbGVkIik7Ci0JfSBlbHNlIHsKLQkJaWYgKEJOX2NvcHkobGFyZ2ViYXNlLCBzdGFydCkgPT0gTlVMTCkKLQkJCWZhdGFsKCJCTl9jb3B5OiBmYWlsZWQiKTsKLQl9Ci0KLQkvKiBlbnN1cmUgb2RkICovCi0JaWYgKEJOX3NldF9iaXQobGFyZ2ViYXNlLCAwKSA9PSAwKQotCQlmYXRhbCgiQk5fc2V0X2JpdDogZmFpbGVkIik7Ci0KLQl0aW1lKCZ0aW1lX3N0YXJ0KTsKLQotCWxvZ2l0KCIlLjI0cyBTaWV2ZSBuZXh0ICV1IHBsdXMgJXUtYml0IiwgY3RpbWUoJnRpbWVfc3RhcnQpLAotCSAgICBsYXJnZW51bWJlcnMsIHBvd2VyKTsKLQlkZWJ1ZzIoInN0YXJ0IHBvaW50OiAweCVzIiwgQk5fYm4yaGV4KGxhcmdlYmFzZSkpOwotCi0JLyoKLQkgKiBUaW55U2lldmUKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgdGlueWJpdHM7IGkrKykgewotCQlpZiAoQklUX1RFU1QoVGlueVNpZXZlLCBpKSkKLQkJCWNvbnRpbnVlOyAvKiAyKmkrMyBpcyBjb21wb3NpdGUgKi8KLQotCQkvKiBUaGUgbmV4dCB0aW55IHByaW1lICovCi0JCXQgPSAyICogaSArIDM7Ci0KLQkJLyogTWFyayBhbGwgbXVsdGlwbGVzIG9mIHQgKi8KLQkJZm9yIChqID0gaSArIHQ7IGogPCB0aW55Yml0czsgaiArPSB0KQotCQkJQklUX1NFVChUaW55U2lldmUsIGopOwotCi0JCXNpZXZlX2xhcmdlKHQpOwotCX0KLQotCS8qCi0JICogU3RhcnQgdGhlIHNtYWxsIGJsb2NrIHNlYXJjaCBhdCB0aGUgbmV4dCBwb3NzaWJsZSBwcmltZS4gVG8gYXZvaWQKLQkgKiBmZW5jZXBvc3QgZXJyb3JzLCB0aGUgbGFzdCBwYXNzIGlzIHNraXBwZWQuCi0JICovCi0JZm9yIChzbWFsbGJhc2UgPSBUSU5ZX05VTUJFUiArIDM7Ci0JICAgIHNtYWxsYmFzZSA8IChTTUFMTF9NQVhJTVVNIC0gVElOWV9OVU1CRVIpOwotCSAgICBzbWFsbGJhc2UgKz0gVElOWV9OVU1CRVIpIHsKLQkJZm9yIChpID0gMDsgaSA8IHRpbnliaXRzOyBpKyspIHsKLQkJCWlmIChCSVRfVEVTVChUaW55U2lldmUsIGkpKQotCQkJCWNvbnRpbnVlOyAvKiAyKmkrMyBpcyBjb21wb3NpdGUgKi8KLQotCQkJLyogVGhlIG5leHQgdGlueSBwcmltZSAqLwotCQkJdCA9IDIgKiBpICsgMzsKLQkJCXIgPSBzbWFsbGJhc2UgJSB0OwotCi0JCQlpZiAociA9PSAwKSB7Ci0JCQkJcyA9IDA7IC8qIHQgZGl2aWRlcyBpbnRvIHNtYWxsYmFzZSBleGFjdGx5ICovCi0JCQl9IGVsc2UgewotCQkJCS8qIHNtYWxsYmFzZStzIGlzIGZpcnN0IGVudHJ5IGRpdmlzaWJsZSBieSB0ICovCi0JCQkJcyA9IHQgLSByOwotCQkJfQotCi0JCQkvKgotCQkJICogVGhlIHNpZXZlIG9taXRzIGV2ZW4gbnVtYmVycywgc28gZW5zdXJlIHRoYXQKLQkJCSAqIHNtYWxsYmFzZStzIGlzIG9kZC4gVGhlbiwgc3RlcCB0aHJvdWdoIHRoZSBzaWV2ZQotCQkJICogaW4gaW5jcmVtZW50cyBvZiAyKnQKLQkJCSAqLwotCQkJaWYgKHMgJiAxKQotCQkJCXMgKz0gdDsgLyogTWFrZSBzbWFsbGJhc2UrcyBvZGQsIGFuZCBzIGV2ZW4gKi8KLQotCQkJLyogTWFyayBhbGwgbXVsdGlwbGVzIG9mIDIqdCAqLwotCQkJZm9yIChzIC89IDI7IHMgPCBzbWFsbGJpdHM7IHMgKz0gdCkKLQkJCQlCSVRfU0VUKFNtYWxsU2lldmUsIHMpOwotCQl9Ci0KLQkJLyoKLQkJICogU21hbGxTaWV2ZQotCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8IHNtYWxsYml0czsgaSsrKSB7Ci0JCQlpZiAoQklUX1RFU1QoU21hbGxTaWV2ZSwgaSkpCi0JCQkJY29udGludWU7IC8qIDIqaStzbWFsbGJhc2UgaXMgY29tcG9zaXRlICovCi0KLQkJCS8qIFRoZSBuZXh0IHNtYWxsIHByaW1lICovCi0JCQlzaWV2ZV9sYXJnZSgoMiAqIGkpICsgc21hbGxiYXNlKTsKLQkJfQotCi0JCW1lbXNldChTbWFsbFNpZXZlLCAwLCBzbWFsbHdvcmRzIDw8IFNISUZUX0JZVEUpOwotCX0KLQotCXRpbWUoJnRpbWVfc3RvcCk7Ci0KLQlsb2dpdCgiJS4yNHMgU2lldmVkIHdpdGggJXUgc21hbGwgcHJpbWVzIGluICVsZCBzZWNvbmRzIiwKLQkgICAgY3RpbWUoJnRpbWVfc3RvcCksIGxhcmdldHJpZXMsIChsb25nKSAodGltZV9zdG9wIC0gdGltZV9zdGFydCkpOwotCi0JZm9yIChqID0gciA9IDA7IGogPCBsYXJnZWJpdHM7IGorKykgewotCQlpZiAoQklUX1RFU1QoTGFyZ2VTaWV2ZSwgaikpCi0JCQljb250aW51ZTsgLyogRGVmaW5pdGVseSBjb21wb3NpdGUsIHNraXAgKi8KLQotCQlkZWJ1ZzIoInRlc3QgcSA9IGxhcmdlYmFzZSsldSIsIDIgKiBqKTsKLQkJaWYgKEJOX3NldF93b3JkKHEsIDIgKiBqKSA9PSAwKQotCQkJZmF0YWwoIkJOX3NldF93b3JkIGZhaWxlZCIpOwotCQlpZiAoQk5fYWRkKHEsIHEsIGxhcmdlYmFzZSkgPT0gMCkKLQkJCWZhdGFsKCJCTl9hZGQgZmFpbGVkIik7Ci0JCWlmIChxZmlsZW91dChvdXQsIE1PRFVMSV9UWVBFX1NPUEhJRV9HRVJNQUlOLAotCQkgICAgTU9EVUxJX1RFU1RTX1NJRVZFLCBsYXJnZXRyaWVzLAotCQkgICAgKHBvd2VyIC0gMSkgLyogTVNCICovLCAoMCksIHEpID09IC0xKSB7Ci0JCQlyZXQgPSAtMTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcisrOyAvKiBjb3VudCBxICovCi0JfQotCi0JdGltZSgmdGltZV9zdG9wKTsKLQotCXhmcmVlKExhcmdlU2lldmUpOwotCXhmcmVlKFNtYWxsU2lldmUpOwotCXhmcmVlKFRpbnlTaWV2ZSk7Ci0KLQlsb2dpdCgiJS4yNHMgRm91bmQgJXUgY2FuZGlkYXRlcyIsIGN0aW1lKCZ0aW1lX3N0b3ApLCByKTsKLQotCXJldHVybiAocmV0KTsKLX0KLQotLyoKLSAqIHBlcmZvcm0gYSBNaWxsZXItUmFiaW4gcHJpbWFsaXR5IHRlc3QKLSAqIG9uIHRoZSBsaXN0IG9mIGNhbmRpZGF0ZXMKLSAqIChjaGVja2luZyBib3RoIHEgYW5kIHApCi0gKiBUaGUgcmVzdWx0IGlzIGEgbGlzdCBvZiBzby1jYWxsICJzYWZlIiBwcmltZXMKLSAqLwotaW50Ci1wcmltZV90ZXN0KEZJTEUgKmluLCBGSUxFICpvdXQsIHVfaW50MzJfdCB0cmlhbHMsIHVfaW50MzJfdCBnZW5lcmF0b3Jfd2FudGVkKQotewotCUJJR05VTSAqcSwgKnAsICphOwotCUJOX0NUWCAqY3R4OwotCWNoYXIgKmNwLCAqbHA7Ci0JdV9pbnQzMl90IGNvdW50X2luID0gMCwgY291bnRfb3V0ID0gMCwgY291bnRfcG9zc2libGUgPSAwOwotCXVfaW50MzJfdCBnZW5lcmF0b3Jfa25vd24sIGluX3Rlc3RzLCBpbl90cmllcywgaW5fdHlwZSwgaW5fc2l6ZTsKLQl0aW1lX3QgdGltZV9zdGFydCwgdGltZV9zdG9wOwotCWludCByZXM7Ci0KLQlpZiAodHJpYWxzIDwgVFJJQUxfTUlOSU1VTSkgewotCQllcnJvcigiTWluaW11bSBwcmltYWxpdHkgdHJpYWxzIGlzICVkIiwgVFJJQUxfTUlOSU1VTSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCXRpbWUoJnRpbWVfc3RhcnQpOwotCi0JaWYgKChwID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJCTl9uZXcgZmFpbGVkIik7Ci0JaWYgKChxID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJCTl9uZXcgZmFpbGVkIik7Ci0JaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJCTl9DVFhfbmV3IGZhaWxlZCIpOwotCi0JZGVidWcyKCIlLjI0cyBGaW5hbCAldSBNaWxsZXItUmFiaW4gdHJpYWxzICgleCBnZW5lcmF0b3IpIiwKLQkgICAgY3RpbWUoJnRpbWVfc3RhcnQpLCB0cmlhbHMsIGdlbmVyYXRvcl93YW50ZWQpOwotCi0JcmVzID0gMDsKLQlscCA9IHhtYWxsb2MoUUxJTkVTSVpFICsgMSk7Ci0Jd2hpbGUgKGZnZXRzKGxwLCBRTElORVNJWkUgKyAxLCBpbikgIT0gTlVMTCkgewotCQljb3VudF9pbisrOwotCQlpZiAoc3RybGVuKGxwKSA8IDE0IHx8ICpscCA9PSAnIScgfHwgKmxwID09ICcjJykgewotCQkJZGVidWcyKCIlMTB1OiBjb21tZW50IG9yIHNob3J0IGxpbmUiLCBjb3VudF9pbik7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIFhYWCAtIGZyYWdpbGUgcGFyc2VyICovCi0JCS8qIHRpbWUgKi8KLQkJY3AgPSAmbHBbMTRdOwkvKiAoc2tpcCkgKi8KLQotCQkvKiB0eXBlICovCi0JCWluX3R5cGUgPSBzdHJ0b3VsKGNwLCAmY3AsIDEwKTsKLQotCQkvKiB0ZXN0cyAqLwotCQlpbl90ZXN0cyA9IHN0cnRvdWwoY3AsICZjcCwgMTApOwotCi0JCWlmIChpbl90ZXN0cyAmIE1PRFVMSV9URVNUU19DT01QT1NJVEUpIHsKLQkJCWRlYnVnMigiJTEwdToga25vd24gY29tcG9zaXRlIiwgY291bnRfaW4pOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiB0cmllcyAqLwotCQlpbl90cmllcyA9IHN0cnRvdWwoY3AsICZjcCwgMTApOwotCi0JCS8qIHNpemUgKG1vc3Qgc2lnbmlmaWNhbnQgYml0KSAqLwotCQlpbl9zaXplID0gc3RydG91bChjcCwgJmNwLCAxMCk7Ci0KLQkJLyogZ2VuZXJhdG9yIChoZXgpICovCi0JCWdlbmVyYXRvcl9rbm93biA9IHN0cnRvdWwoY3AsICZjcCwgMTYpOwotCi0JCS8qIFNraXAgd2hpdGUgc3BhY2UgKi8KLQkJY3AgKz0gc3Ryc3BuKGNwLCAiICIpOwotCi0JCS8qIG1vZHVsdXMgKGhleCkgKi8KLQkJc3dpdGNoIChpbl90eXBlKSB7Ci0JCWNhc2UgTU9EVUxJX1RZUEVfU09QSElFX0dFUk1BSU46Ci0JCQlkZWJ1ZzIoIiUxMHU6ICgldSkgU29waGllLUdlcm1haW4iLCBjb3VudF9pbiwgaW5fdHlwZSk7Ci0JCQlhID0gcTsKLQkJCWlmIChCTl9oZXgyYm4oJmEsIGNwKSA9PSAwKQotCQkJCWZhdGFsKCJCTl9oZXgyYm4gZmFpbGVkIik7Ci0JCQkvKiBwID0gMipxICsgMSAqLwotCQkJaWYgKEJOX2xzaGlmdChwLCBxLCAxKSA9PSAwKQotCQkJCWZhdGFsKCJCTl9sc2hpZnQgZmFpbGVkIik7Ci0JCQlpZiAoQk5fYWRkX3dvcmQocCwgMSkgPT0gMCkKLQkJCQlmYXRhbCgiQk5fYWRkX3dvcmQgZmFpbGVkIik7Ci0JCQlpbl9zaXplICs9IDE7Ci0JCQlnZW5lcmF0b3Jfa25vd24gPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgTU9EVUxJX1RZUEVfVU5TVFJVQ1RVUkVEOgotCQljYXNlIE1PRFVMSV9UWVBFX1NBRkU6Ci0JCWNhc2UgTU9EVUxJX1RZUEVfU0NITk9SUjoKLQkJY2FzZSBNT0RVTElfVFlQRV9TVFJPTkc6Ci0JCWNhc2UgTU9EVUxJX1RZUEVfVU5LTk9XTjoKLQkJCWRlYnVnMigiJTEwdTogKCV1KSIsIGNvdW50X2luLCBpbl90eXBlKTsKLQkJCWEgPSBwOwotCQkJaWYgKEJOX2hleDJibigmYSwgY3ApID09IDApCi0JCQkJZmF0YWwoIkJOX2hleDJibiBmYWlsZWQiKTsKLQkJCS8qIHEgPSAocC0xKSAvIDIgKi8KLQkJCWlmIChCTl9yc2hpZnQocSwgcCwgMSkgPT0gMCkKLQkJCQlmYXRhbCgiQk5fcnNoaWZ0IGZhaWxlZCIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkZWJ1ZzIoIlVua25vd24gcHJpbWUgdHlwZSIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgotCQkgKiBkdWUgdG8gZWFybGllciBpbmNvbnNpc3RlbmNpZXMgaW4gaW50ZXJwcmV0YXRpb24sIGNoZWNrCi0JCSAqIHRoZSBwcm9wb3NlZCBiaXQgc2l6ZS4KLQkJICovCi0JCWlmICgodV9pbnQzMl90KUJOX251bV9iaXRzKHApICE9IChpbl9zaXplICsgMSkpIHsKLQkJCWRlYnVnMigiJTEwdTogYml0IHNpemUgJXUgbWlzbWF0Y2giLCBjb3VudF9pbiwgaW5fc2l6ZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoaW5fc2l6ZSA8IFFTSVpFX01JTklNVU0pIHsKLQkJCWRlYnVnMigiJTEwdTogYml0IHNpemUgJXUgdG9vIHNob3J0IiwgY291bnRfaW4sIGluX3NpemUpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoaW5fdGVzdHMgJiBNT0RVTElfVEVTVFNfTUlMTEVSX1JBQklOKQotCQkJaW5fdHJpZXMgKz0gdHJpYWxzOwotCQllbHNlCi0JCQlpbl90cmllcyA9IHRyaWFsczsKLQotCQkvKgotCQkgKiBndWVzcyB1bmtub3duIGdlbmVyYXRvcgotCQkgKi8KLQkJaWYgKGdlbmVyYXRvcl9rbm93biA9PSAwKSB7Ci0JCQlpZiAoQk5fbW9kX3dvcmQocCwgMjQpID09IDExKQotCQkJCWdlbmVyYXRvcl9rbm93biA9IDI7Ci0JCQllbHNlIGlmIChCTl9tb2Rfd29yZChwLCAxMikgPT0gNSkKLQkJCQlnZW5lcmF0b3Jfa25vd24gPSAzOwotCQkJZWxzZSB7Ci0JCQkJdV9pbnQzMl90IHIgPSBCTl9tb2Rfd29yZChwLCAxMCk7Ci0KLQkJCQlpZiAociA9PSAzIHx8IHIgPT0gNykKLQkJCQkJZ2VuZXJhdG9yX2tub3duID0gNTsKLQkJCX0KLQkJfQotCQkvKgotCQkgKiBza2lwIHRlc3RzIHdoZW4gZGVzaXJlZCBnZW5lcmF0b3IgZG9lc24ndCBtYXRjaAotCQkgKi8KLQkJaWYgKGdlbmVyYXRvcl93YW50ZWQgPiAwICYmCi0JCSAgICBnZW5lcmF0b3Jfd2FudGVkICE9IGdlbmVyYXRvcl9rbm93bikgewotCQkJZGVidWcyKCIlMTB1OiBnZW5lcmF0b3IgJWQgIT0gJWQiLAotCQkJICAgIGNvdW50X2luLCBnZW5lcmF0b3Jfa25vd24sIGdlbmVyYXRvcl93YW50ZWQpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKgotCQkgKiBQcmltZXMgd2l0aCBubyBrbm93biBnZW5lcmF0b3IgYXJlIHVzZWxlc3MgZm9yIERILCBzbwotCQkgKiBza2lwIHRob3NlLgotCQkgKi8KLQkJaWYgKGdlbmVyYXRvcl9rbm93biA9PSAwKSB7Ci0JCQlkZWJ1ZzIoIiUxMHU6IG5vIGtub3duIGdlbmVyYXRvciIsIGNvdW50X2luKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJY291bnRfcG9zc2libGUrKzsKLQotCQkvKgotCQkgKiBUaGUgKDEvNCleTiBwZXJmb3JtYW5jZSBib3VuZCBvbiBNaWxsZXItUmFiaW4gaXMKLQkJICogZXh0cmVtZWx5IHBlc3NpbWlzdGljLCBzbyBkb24ndCBzcGVuZCBhIGxvdCBvZiB0aW1lCi0JCSAqIHJlYWxseSB2ZXJpZnlpbmcgdGhhdCBxIGlzIHByaW1lIHVudGlsIGFmdGVyIHdlIGtub3cKLQkJICogdGhhdCBwIGlzIGFsc28gcHJpbWUuIEEgc2luZ2xlIHBhc3Mgd2lsbCB3ZWVkIG91dCB0aGUKLQkJICogdmFzdCBtYWpvcml0eSBvZiBjb21wb3NpdGUgcSdzLgotCQkgKi8KLQkJaWYgKEJOX2lzX3ByaW1lX2V4KHEsIDEsIGN0eCwgTlVMTCkgPD0gMCkgewotCQkJZGVidWcoIiUxMHU6IHEgZmFpbGVkIGZpcnN0IHBvc3NpYmxlIHByaW1lIHRlc3QiLAotCQkJICAgIGNvdW50X2luKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyoKLQkJICogcSBpcyBwb3NzaWJseSBwcmltZSwgc28gZ28gYWhlYWQgYW5kIHJlYWxseSBtYWtlIHN1cmUKLQkJICogdGhhdCBwIGlzIHByaW1lLiBJZiBpdCBpcywgdGhlbiB3ZSBjYW4gZ28gYmFjayBhbmQgZG8KLQkJICogdGhlIHNhbWUgZm9yIHEuIElmIHAgaXMgY29tcG9zaXRlLCBjaGFuY2VzIGFyZSB0aGF0Ci0JCSAqIHdpbGwgc2hvdyB1cCBvbiB0aGUgZmlyc3QgUmFiaW4tTWlsbGVyIGl0ZXJhdGlvbiBzbyBpdAotCQkgKiBkb2Vzbid0IGh1cnQgdG8gc3BlY2lmeSBhIGhpZ2ggaXRlcmF0aW9uIGNvdW50LgotCQkgKi8KLQkJaWYgKCFCTl9pc19wcmltZV9leChwLCB0cmlhbHMsIGN0eCwgTlVMTCkpIHsKLQkJCWRlYnVnKCIlMTB1OiBwIGlzIG5vdCBwcmltZSIsIGNvdW50X2luKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWRlYnVnKCIlMTB1OiBwIGlzIGFsbW9zdCBjZXJ0YWlubHkgcHJpbWUiLCBjb3VudF9pbik7Ci0KLQkJLyogcmVjaGVjayBxIG1vcmUgcmlnb3JvdXNseSAqLwotCQlpZiAoIUJOX2lzX3ByaW1lX2V4KHEsIHRyaWFscyAtIDEsIGN0eCwgTlVMTCkpIHsKLQkJCWRlYnVnKCIlMTB1OiBxIGlzIG5vdCBwcmltZSIsIGNvdW50X2luKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWRlYnVnKCIlMTB1OiBxIGlzIGFsbW9zdCBjZXJ0YWlubHkgcHJpbWUiLCBjb3VudF9pbik7Ci0KLQkJaWYgKHFmaWxlb3V0KG91dCwgTU9EVUxJX1RZUEVfU0FGRSwKLQkJICAgIGluX3Rlc3RzIHwgTU9EVUxJX1RFU1RTX01JTExFUl9SQUJJTiwKLQkJICAgIGluX3RyaWVzLCBpbl9zaXplLCBnZW5lcmF0b3Jfa25vd24sIHApKSB7Ci0JCQlyZXMgPSAtMTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY291bnRfb3V0Kys7Ci0JfQotCi0JdGltZSgmdGltZV9zdG9wKTsKLQl4ZnJlZShscCk7Ci0JQk5fZnJlZShwKTsKLQlCTl9mcmVlKHEpOwotCUJOX0NUWF9mcmVlKGN0eCk7Ci0KLQlsb2dpdCgiJS4yNHMgRm91bmQgJXUgc2FmZSBwcmltZXMgb2YgJXUgY2FuZGlkYXRlcyBpbiAlbGQgc2Vjb25kcyIsCi0JICAgIGN0aW1lKCZ0aW1lX3N0b3ApLCBjb3VudF9vdXQsIGNvdW50X3Bvc3NpYmxlLAotCSAgICAobG9uZykgKHRpbWVfc3RvcCAtIHRpbWVfc3RhcnQpKTsKLQotCXJldHVybiAocmVzKTsKLX0KZGlmZiAtLWdpdCBhL21vbml0b3IuYyBiL21vbml0b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1NzdhMC4uMDAwMDAwMAotLS0gYS9tb25pdG9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzE1ICswLDAgQEAKLS8qICRPcGVuQlNEOiBtb25pdG9yLmMsdiAxLjExNSAyMDExLzA2LzIzIDIzOjM1OjQyIGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAyMDAyIE5pZWxzIFByb3ZvcyA8cHJvdm9zQGNpdGkudW1pY2guZWR1PgotICogQ29weXJpZ2h0IDIwMDIgTWFya3VzIEZyaWVkbCA8bWFya3VzQG9wZW5ic2Qub3JnPgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXRyZWUuaCIKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2lmZGVmIEhBVkVfUEFUSFNfSAotI2luY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpZmRlZiBIQVZFX1BPTExfSAotI2luY2x1ZGUgPHBvbGwuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfU1lTX1BPTExfSAotIyAgaW5jbHVkZSA8c3lzL3BvbGwuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgU0tFWQotI2luY2x1ZGUgPHNrZXkuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgotCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgiCi0jaW5jbHVkZSAiYXRvbWljaW8uaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAic3NoLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJhdXRoLmgiCi0jaW5jbHVkZSAiY2lwaGVyLmgiCi0jaW5jbHVkZSAia2V4LmgiCi0jaW5jbHVkZSAiZGguaCIKLSNpZmRlZiBUQVJHRVRfT1NfTUFDCS8qIFhYWCBCcm9rZW4ga3JiNSBoZWFkZXJzIG9uIE1hYyAqLwotI3VuZGVmIFRBUkdFVF9PU19NQUMKLSNpbmNsdWRlICJ6bGliLmgiCi0jZGVmaW5lIFRBUkdFVF9PU19NQUMgMQotI2Vsc2UKLSNpbmNsdWRlICJ6bGliLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJhdXRoLW9wdGlvbnMuaCIKLSNpbmNsdWRlICJzc2hwdHkuaCIKLSNpbmNsdWRlICJjaGFubmVscy5oIgotI2luY2x1ZGUgInNlc3Npb24uaCIKLSNpbmNsdWRlICJzc2hsb2dpbi5oIgotI2luY2x1ZGUgImNhbm9ob3N0LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAic2VydmNvbmYuaCIKLSNpbmNsdWRlICJtb25pdG9yLmgiCi0jaW5jbHVkZSAibW9uaXRvcl9tbS5oIgotI2lmZGVmIEdTU0FQSQotI2luY2x1ZGUgInNzaC1nc3MuaCIKLSNlbmRpZgotI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgotI2luY2x1ZGUgIm1vbml0b3JfZmRwYXNzLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImNvbXBhdC5oIgotI2luY2x1ZGUgInNzaDIuaCIKLSNpbmNsdWRlICJqcGFrZS5oIgotI2luY2x1ZGUgInJvYW1pbmcuaCIKLQotI2lmZGVmIEdTU0FQSQotc3RhdGljIEdzc2N0eHQgKmdzc2NvbnRleHQgPSBOVUxMOwotI2VuZGlmCi0KLS8qIEltcG9ydHMgKi8KLWV4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7Ci1leHRlcm4gdV9pbnQgdXRtcF9sZW47Ci1leHRlcm4gTmV3a2V5cyAqY3VycmVudF9rZXlzW107Ci1leHRlcm4gel9zdHJlYW0gaW5jb21pbmdfc3RyZWFtOwotZXh0ZXJuIHpfc3RyZWFtIG91dGdvaW5nX3N0cmVhbTsKLWV4dGVybiB1X2NoYXIgc2Vzc2lvbl9pZFtdOwotZXh0ZXJuIEJ1ZmZlciBhdXRoX2RlYnVnOwotZXh0ZXJuIGludCBhdXRoX2RlYnVnX2luaXQ7Ci1leHRlcm4gQnVmZmVyIGxvZ2lubXNnOwotCi0vKiBTdGF0ZSBleHBvcnRlZCBmcm9tIHRoZSBjaGlsZCAqLwotCi1zdHJ1Y3QgewotCXpfc3RyZWFtIGluY29taW5nOwotCXpfc3RyZWFtIG91dGdvaW5nOwotCXVfY2hhciAqa2V5aW47Ci0JdV9pbnQga2V5aW5sZW47Ci0JdV9jaGFyICprZXlvdXQ7Ci0JdV9pbnQga2V5b3V0bGVuOwotCXVfY2hhciAqaXZpbjsKLQl1X2ludCBpdmlubGVuOwotCXVfY2hhciAqaXZvdXQ7Ci0JdV9pbnQgaXZvdXRsZW47Ci0JdV9jaGFyICpzc2gxa2V5OwotCXVfaW50IHNzaDFrZXlsZW47Ci0JaW50IHNzaDFjaXBoZXI7Ci0JaW50IHNzaDFwcm90b2ZsYWdzOwotCXVfY2hhciAqaW5wdXQ7Ci0JdV9pbnQgaWxlbjsKLQl1X2NoYXIgKm91dHB1dDsKLQl1X2ludCBvbGVuOwotCXVfaW50NjRfdCBzZW50X2J5dGVzOwotCXVfaW50NjRfdCByZWN2X2J5dGVzOwotfSBjaGlsZF9zdGF0ZTsKLQotLyogRnVuY3Rpb25zIG9uIHRoZSBtb25pdG9yIHRoYXQgYW5zd2VyIHVucHJpdmlsZWdlZCByZXF1ZXN0cyAqLwotCi1pbnQgbW1fYW5zd2VyX21vZHVsaShpbnQsIEJ1ZmZlciAqKTsKLWludCBtbV9hbnN3ZXJfc2lnbihpbnQsIEJ1ZmZlciAqKTsKLWludCBtbV9hbnN3ZXJfcHduYW1hbGxvdyhpbnQsIEJ1ZmZlciAqKTsKLWludCBtbV9hbnN3ZXJfYXV0aDJfcmVhZF9iYW5uZXIoaW50LCBCdWZmZXIgKik7Ci1pbnQgbW1fYW5zd2VyX2F1dGhzZXJ2KGludCwgQnVmZmVyICopOwotaW50IG1tX2Fuc3dlcl9hdXRocGFzc3dvcmQoaW50LCBCdWZmZXIgKik7Ci1pbnQgbW1fYW5zd2VyX2JzZGF1dGhxdWVyeShpbnQsIEJ1ZmZlciAqKTsKLWludCBtbV9hbnN3ZXJfYnNkYXV0aHJlc3BvbmQoaW50LCBCdWZmZXIgKik7Ci1pbnQgbW1fYW5zd2VyX3NrZXlxdWVyeShpbnQsIEJ1ZmZlciAqKTsKLWludCBtbV9hbnN3ZXJfc2tleXJlc3BvbmQoaW50LCBCdWZmZXIgKik7Ci1pbnQgbW1fYW5zd2VyX2tleWFsbG93ZWQoaW50LCBCdWZmZXIgKik7Ci1pbnQgbW1fYW5zd2VyX2tleXZlcmlmeShpbnQsIEJ1ZmZlciAqKTsKLWludCBtbV9hbnN3ZXJfcHR5KGludCwgQnVmZmVyICopOwotaW50IG1tX2Fuc3dlcl9wdHlfY2xlYW51cChpbnQsIEJ1ZmZlciAqKTsKLWludCBtbV9hbnN3ZXJfdGVybShpbnQsIEJ1ZmZlciAqKTsKLWludCBtbV9hbnN3ZXJfcnNhX2tleWFsbG93ZWQoaW50LCBCdWZmZXIgKik7Ci1pbnQgbW1fYW5zd2VyX3JzYV9jaGFsbGVuZ2UoaW50LCBCdWZmZXIgKik7Ci1pbnQgbW1fYW5zd2VyX3JzYV9yZXNwb25zZShpbnQsIEJ1ZmZlciAqKTsKLWludCBtbV9hbnN3ZXJfc2Vzc2tleShpbnQsIEJ1ZmZlciAqKTsKLWludCBtbV9hbnN3ZXJfc2Vzc2lkKGludCwgQnVmZmVyICopOwotaW50IG1tX2Fuc3dlcl9qcGFrZV9nZXRfcHdkYXRhKGludCwgQnVmZmVyICopOwotaW50IG1tX2Fuc3dlcl9qcGFrZV9zdGVwMShpbnQsIEJ1ZmZlciAqKTsKLWludCBtbV9hbnN3ZXJfanBha2Vfc3RlcDIoaW50LCBCdWZmZXIgKik7Ci1pbnQgbW1fYW5zd2VyX2pwYWtlX2tleV9jb25maXJtKGludCwgQnVmZmVyICopOwotaW50IG1tX2Fuc3dlcl9qcGFrZV9jaGVja19jb25maXJtKGludCwgQnVmZmVyICopOwotCi0jaWZkZWYgVVNFX1BBTQotaW50IG1tX2Fuc3dlcl9wYW1fc3RhcnQoaW50LCBCdWZmZXIgKik7Ci1pbnQgbW1fYW5zd2VyX3BhbV9hY2NvdW50KGludCwgQnVmZmVyICopOwotaW50IG1tX2Fuc3dlcl9wYW1faW5pdF9jdHgoaW50LCBCdWZmZXIgKik7Ci1pbnQgbW1fYW5zd2VyX3BhbV9xdWVyeShpbnQsIEJ1ZmZlciAqKTsKLWludCBtbV9hbnN3ZXJfcGFtX3Jlc3BvbmQoaW50LCBCdWZmZXIgKik7Ci1pbnQgbW1fYW5zd2VyX3BhbV9mcmVlX2N0eChpbnQsIEJ1ZmZlciAqKTsKLSNlbmRpZgotCi0jaWZkZWYgR1NTQVBJCi1pbnQgbW1fYW5zd2VyX2dzc19zZXR1cF9jdHgoaW50LCBCdWZmZXIgKik7Ci1pbnQgbW1fYW5zd2VyX2dzc19hY2NlcHRfY3R4KGludCwgQnVmZmVyICopOwotaW50IG1tX2Fuc3dlcl9nc3NfdXNlcm9rKGludCwgQnVmZmVyICopOwotaW50IG1tX2Fuc3dlcl9nc3NfY2hlY2ttaWMoaW50LCBCdWZmZXIgKik7Ci0jZW5kaWYKLQotI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKLWludCBtbV9hbnN3ZXJfYXVkaXRfZXZlbnQoaW50LCBCdWZmZXIgKik7Ci1pbnQgbW1fYW5zd2VyX2F1ZGl0X2NvbW1hbmQoaW50LCBCdWZmZXIgKik7Ci0jZW5kaWYKLQotc3RhdGljIGludCBtb25pdG9yX3JlYWRfbG9nKHN0cnVjdCBtb25pdG9yICopOwotCi1zdGF0aWMgQXV0aGN0eHQgKmF1dGhjdHh0Owotc3RhdGljIEJJR05VTSAqc3NoMV9jaGFsbGVuZ2UgPSBOVUxMOwkvKiB1c2VkIGZvciBzc2gxIHJzYSBhdXRoICovCi0KLS8qIGxvY2FsIHN0YXRlIGZvciBrZXkgdmVyaWZ5ICovCi1zdGF0aWMgdV9jaGFyICprZXlfYmxvYiA9IE5VTEw7Ci1zdGF0aWMgdV9pbnQga2V5X2Jsb2JsZW4gPSAwOwotc3RhdGljIGludCBrZXlfYmxvYnR5cGUgPSBNTV9OT0tFWTsKLXN0YXRpYyBjaGFyICpob3N0YmFzZWRfY3VzZXIgPSBOVUxMOwotc3RhdGljIGNoYXIgKmhvc3RiYXNlZF9jaG9zdCA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqYXV0aF9tZXRob2QgPSAidW5rbm93biI7Ci1zdGF0aWMgdV9pbnQgc2Vzc2lvbl9pZDJfbGVuID0gMDsKLXN0YXRpYyB1X2NoYXIgKnNlc3Npb25faWQyID0gTlVMTDsKLXN0YXRpYyBwaWRfdCBtb25pdG9yX2NoaWxkX3BpZDsKLQotc3RydWN0IG1vbl90YWJsZSB7Ci0JZW51bSBtb25pdG9yX3JlcXR5cGUgdHlwZTsKLQlpbnQgZmxhZ3M7Ci0JaW50ICgqZikoaW50LCBCdWZmZXIgKik7Ci19OwotCi0jZGVmaW5lIE1PTl9JU0FVVEgJMHgwMDA0CS8qIFJlcXVpcmVkIGZvciBBdXRoZW50aWNhdGlvbiAqLwotI2RlZmluZSBNT05fQVVUSERFQ0lERQkweDAwMDgJLyogRGVjaWRlcyBBdXRoZW50aWNhdGlvbiAqLwotI2RlZmluZSBNT05fT05DRQkweDAwMTAJLyogRGlzYWJsZSBhZnRlciBjYWxsaW5nICovCi0jZGVmaW5lIE1PTl9BTE9HCTB4MDAyMAkvKiBMb2cgYXV0aCBhdHRlbXB0IHdpdGhvdXQgYXV0aGVudGljYXRpbmcgKi8KLQotI2RlZmluZSBNT05fQVVUSAkoTU9OX0lTQVVUSHxNT05fQVVUSERFQ0lERSkKLQotI2RlZmluZSBNT05fUEVSTUlUCTB4MTAwMAkvKiBSZXF1ZXN0IGlzIHBlcm1pdHRlZCAqLwotCi1zdHJ1Y3QgbW9uX3RhYmxlIG1vbl9kaXNwYXRjaF9wcm90bzIwW10gPSB7Ci0gICAge01PTklUT1JfUkVRX01PRFVMSSwgTU9OX09OQ0UsIG1tX2Fuc3dlcl9tb2R1bGl9LAotICAgIHtNT05JVE9SX1JFUV9TSUdOLCBNT05fT05DRSwgbW1fYW5zd2VyX3NpZ259LAotICAgIHtNT05JVE9SX1JFUV9QV05BTSwgTU9OX09OQ0UsIG1tX2Fuc3dlcl9wd25hbWFsbG93fSwKLSAgICB7TU9OSVRPUl9SRVFfQVVUSFNFUlYsIE1PTl9PTkNFLCBtbV9hbnN3ZXJfYXV0aHNlcnZ9LAotICAgIHtNT05JVE9SX1JFUV9BVVRIMl9SRUFEX0JBTk5FUiwgTU9OX09OQ0UsIG1tX2Fuc3dlcl9hdXRoMl9yZWFkX2Jhbm5lcn0sCi0gICAge01PTklUT1JfUkVRX0FVVEhQQVNTV09SRCwgTU9OX0FVVEgsIG1tX2Fuc3dlcl9hdXRocGFzc3dvcmR9LAotI2lmZGVmIFVTRV9QQU0KLSAgICB7TU9OSVRPUl9SRVFfUEFNX1NUQVJULCBNT05fT05DRSwgbW1fYW5zd2VyX3BhbV9zdGFydH0sCi0gICAge01PTklUT1JfUkVRX1BBTV9BQ0NPVU5ULCAwLCBtbV9hbnN3ZXJfcGFtX2FjY291bnR9LAotICAgIHtNT05JVE9SX1JFUV9QQU1fSU5JVF9DVFgsIE1PTl9JU0FVVEgsIG1tX2Fuc3dlcl9wYW1faW5pdF9jdHh9LAotICAgIHtNT05JVE9SX1JFUV9QQU1fUVVFUlksIE1PTl9JU0FVVEgsIG1tX2Fuc3dlcl9wYW1fcXVlcnl9LAotICAgIHtNT05JVE9SX1JFUV9QQU1fUkVTUE9ORCwgTU9OX0lTQVVUSCwgbW1fYW5zd2VyX3BhbV9yZXNwb25kfSwKLSAgICB7TU9OSVRPUl9SRVFfUEFNX0ZSRUVfQ1RYLCBNT05fT05DRXxNT05fQVVUSERFQ0lERSwgbW1fYW5zd2VyX3BhbV9mcmVlX2N0eH0sCi0jZW5kaWYKLSNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCi0gICAge01PTklUT1JfUkVRX0FVRElUX0VWRU5ULCBNT05fUEVSTUlULCBtbV9hbnN3ZXJfYXVkaXRfZXZlbnR9LAotI2VuZGlmCi0jaWZkZWYgQlNEX0FVVEgKLSAgICB7TU9OSVRPUl9SRVFfQlNEQVVUSFFVRVJZLCBNT05fSVNBVVRILCBtbV9hbnN3ZXJfYnNkYXV0aHF1ZXJ5fSwKLSAgICB7TU9OSVRPUl9SRVFfQlNEQVVUSFJFU1BPTkQsIE1PTl9BVVRILCBtbV9hbnN3ZXJfYnNkYXV0aHJlc3BvbmR9LAotI2VuZGlmCi0jaWZkZWYgU0tFWQotICAgIHtNT05JVE9SX1JFUV9TS0VZUVVFUlksIE1PTl9JU0FVVEgsIG1tX2Fuc3dlcl9za2V5cXVlcnl9LAotICAgIHtNT05JVE9SX1JFUV9TS0VZUkVTUE9ORCwgTU9OX0FVVEgsIG1tX2Fuc3dlcl9za2V5cmVzcG9uZH0sCi0jZW5kaWYKLSAgICB7TU9OSVRPUl9SRVFfS0VZQUxMT1dFRCwgTU9OX0lTQVVUSCwgbW1fYW5zd2VyX2tleWFsbG93ZWR9LAotICAgIHtNT05JVE9SX1JFUV9LRVlWRVJJRlksIE1PTl9BVVRILCBtbV9hbnN3ZXJfa2V5dmVyaWZ5fSwKLSNpZmRlZiBHU1NBUEkKLSAgICB7TU9OSVRPUl9SRVFfR1NTU0VUVVAsIE1PTl9JU0FVVEgsIG1tX2Fuc3dlcl9nc3Nfc2V0dXBfY3R4fSwKLSAgICB7TU9OSVRPUl9SRVFfR1NTU1RFUCwgTU9OX0lTQVVUSCwgbW1fYW5zd2VyX2dzc19hY2NlcHRfY3R4fSwKLSAgICB7TU9OSVRPUl9SRVFfR1NTVVNFUk9LLCBNT05fQVVUSCwgbW1fYW5zd2VyX2dzc191c2Vyb2t9LAotICAgIHtNT05JVE9SX1JFUV9HU1NDSEVDS01JQywgTU9OX0lTQVVUSCwgbW1fYW5zd2VyX2dzc19jaGVja21pY30sCi0jZW5kaWYKLSNpZmRlZiBKUEFLRQotICAgIHtNT05JVE9SX1JFUV9KUEFLRV9HRVRfUFdEQVRBLCBNT05fT05DRSwgbW1fYW5zd2VyX2pwYWtlX2dldF9wd2RhdGF9LAotICAgIHtNT05JVE9SX1JFUV9KUEFLRV9TVEVQMSwgTU9OX0lTQVVUSCwgbW1fYW5zd2VyX2pwYWtlX3N0ZXAxfSwKLSAgICB7TU9OSVRPUl9SRVFfSlBBS0VfU1RFUDIsIE1PTl9PTkNFLCBtbV9hbnN3ZXJfanBha2Vfc3RlcDJ9LAotICAgIHtNT05JVE9SX1JFUV9KUEFLRV9LRVlfQ09ORklSTSwgTU9OX09OQ0UsIG1tX2Fuc3dlcl9qcGFrZV9rZXlfY29uZmlybX0sCi0gICAge01PTklUT1JfUkVRX0pQQUtFX0NIRUNLX0NPTkZJUk0sIE1PTl9BVVRILCBtbV9hbnN3ZXJfanBha2VfY2hlY2tfY29uZmlybX0sCi0jZW5kaWYKLSAgICB7MCwgMCwgTlVMTH0KLX07Ci0KLXN0cnVjdCBtb25fdGFibGUgbW9uX2Rpc3BhdGNoX3Bvc3RhdXRoMjBbXSA9IHsKLSAgICB7TU9OSVRPUl9SRVFfTU9EVUxJLCAwLCBtbV9hbnN3ZXJfbW9kdWxpfSwKLSAgICB7TU9OSVRPUl9SRVFfU0lHTiwgMCwgbW1fYW5zd2VyX3NpZ259LAotICAgIHtNT05JVE9SX1JFUV9QVFksIDAsIG1tX2Fuc3dlcl9wdHl9LAotICAgIHtNT05JVE9SX1JFUV9QVFlDTEVBTlVQLCAwLCBtbV9hbnN3ZXJfcHR5X2NsZWFudXB9LAotICAgIHtNT05JVE9SX1JFUV9URVJNLCAwLCBtbV9hbnN3ZXJfdGVybX0sCi0jaWZkZWYgU1NIX0FVRElUX0VWRU5UUwotICAgIHtNT05JVE9SX1JFUV9BVURJVF9FVkVOVCwgTU9OX1BFUk1JVCwgbW1fYW5zd2VyX2F1ZGl0X2V2ZW50fSwKLSAgICB7TU9OSVRPUl9SRVFfQVVESVRfQ09NTUFORCwgTU9OX1BFUk1JVCwgbW1fYW5zd2VyX2F1ZGl0X2NvbW1hbmR9LAotI2VuZGlmCi0gICAgezAsIDAsIE5VTEx9Ci19OwotCi1zdHJ1Y3QgbW9uX3RhYmxlIG1vbl9kaXNwYXRjaF9wcm90bzE1W10gPSB7Ci0gICAge01PTklUT1JfUkVRX1BXTkFNLCBNT05fT05DRSwgbW1fYW5zd2VyX3B3bmFtYWxsb3d9LAotICAgIHtNT05JVE9SX1JFUV9TRVNTS0VZLCBNT05fT05DRSwgbW1fYW5zd2VyX3Nlc3NrZXl9LAotICAgIHtNT05JVE9SX1JFUV9TRVNTSUQsIE1PTl9PTkNFLCBtbV9hbnN3ZXJfc2Vzc2lkfSwKLSAgICB7TU9OSVRPUl9SRVFfQVVUSFBBU1NXT1JELCBNT05fQVVUSCwgbW1fYW5zd2VyX2F1dGhwYXNzd29yZH0sCi0gICAge01PTklUT1JfUkVRX1JTQUtFWUFMTE9XRUQsIE1PTl9JU0FVVEh8TU9OX0FMT0csIG1tX2Fuc3dlcl9yc2Ffa2V5YWxsb3dlZH0sCi0gICAge01PTklUT1JfUkVRX0tFWUFMTE9XRUQsIE1PTl9JU0FVVEh8TU9OX0FMT0csIG1tX2Fuc3dlcl9rZXlhbGxvd2VkfSwKLSAgICB7TU9OSVRPUl9SRVFfUlNBQ0hBTExFTkdFLCBNT05fT05DRSwgbW1fYW5zd2VyX3JzYV9jaGFsbGVuZ2V9LAotICAgIHtNT05JVE9SX1JFUV9SU0FSRVNQT05TRSwgTU9OX09OQ0V8TU9OX0FVVEhERUNJREUsIG1tX2Fuc3dlcl9yc2FfcmVzcG9uc2V9LAotI2lmZGVmIEJTRF9BVVRICi0gICAge01PTklUT1JfUkVRX0JTREFVVEhRVUVSWSwgTU9OX0lTQVVUSCwgbW1fYW5zd2VyX2JzZGF1dGhxdWVyeX0sCi0gICAge01PTklUT1JfUkVRX0JTREFVVEhSRVNQT05ELCBNT05fQVVUSCwgbW1fYW5zd2VyX2JzZGF1dGhyZXNwb25kfSwKLSNlbmRpZgotI2lmZGVmIFNLRVkKLSAgICB7TU9OSVRPUl9SRVFfU0tFWVFVRVJZLCBNT05fSVNBVVRILCBtbV9hbnN3ZXJfc2tleXF1ZXJ5fSwKLSAgICB7TU9OSVRPUl9SRVFfU0tFWVJFU1BPTkQsIE1PTl9BVVRILCBtbV9hbnN3ZXJfc2tleXJlc3BvbmR9LAotI2VuZGlmCi0jaWZkZWYgVVNFX1BBTQotICAgIHtNT05JVE9SX1JFUV9QQU1fU1RBUlQsIE1PTl9PTkNFLCBtbV9hbnN3ZXJfcGFtX3N0YXJ0fSwKLSAgICB7TU9OSVRPUl9SRVFfUEFNX0FDQ09VTlQsIDAsIG1tX2Fuc3dlcl9wYW1fYWNjb3VudH0sCi0gICAge01PTklUT1JfUkVRX1BBTV9JTklUX0NUWCwgTU9OX0lTQVVUSCwgbW1fYW5zd2VyX3BhbV9pbml0X2N0eH0sCi0gICAge01PTklUT1JfUkVRX1BBTV9RVUVSWSwgTU9OX0lTQVVUSCwgbW1fYW5zd2VyX3BhbV9xdWVyeX0sCi0gICAge01PTklUT1JfUkVRX1BBTV9SRVNQT05ELCBNT05fSVNBVVRILCBtbV9hbnN3ZXJfcGFtX3Jlc3BvbmR9LAotICAgIHtNT05JVE9SX1JFUV9QQU1fRlJFRV9DVFgsIE1PTl9PTkNFfE1PTl9BVVRIREVDSURFLCBtbV9hbnN3ZXJfcGFtX2ZyZWVfY3R4fSwKLSNlbmRpZgotI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKLSAgICB7TU9OSVRPUl9SRVFfQVVESVRfRVZFTlQsIE1PTl9QRVJNSVQsIG1tX2Fuc3dlcl9hdWRpdF9ldmVudH0sCi0jZW5kaWYKLSAgICB7MCwgMCwgTlVMTH0KLX07Ci0KLXN0cnVjdCBtb25fdGFibGUgbW9uX2Rpc3BhdGNoX3Bvc3RhdXRoMTVbXSA9IHsKLSAgICB7TU9OSVRPUl9SRVFfUFRZLCBNT05fT05DRSwgbW1fYW5zd2VyX3B0eX0sCi0gICAge01PTklUT1JfUkVRX1BUWUNMRUFOVVAsIE1PTl9PTkNFLCBtbV9hbnN3ZXJfcHR5X2NsZWFudXB9LAotICAgIHtNT05JVE9SX1JFUV9URVJNLCAwLCBtbV9hbnN3ZXJfdGVybX0sCi0jaWZkZWYgU1NIX0FVRElUX0VWRU5UUwotICAgIHtNT05JVE9SX1JFUV9BVURJVF9FVkVOVCwgTU9OX1BFUk1JVCwgbW1fYW5zd2VyX2F1ZGl0X2V2ZW50fSwKLSAgICB7TU9OSVRPUl9SRVFfQVVESVRfQ09NTUFORCwgTU9OX1BFUk1JVHxNT05fT05DRSwgbW1fYW5zd2VyX2F1ZGl0X2NvbW1hbmR9LAotI2VuZGlmCi0gICAgezAsIDAsIE5VTEx9Ci19OwotCi1zdHJ1Y3QgbW9uX3RhYmxlICptb25fZGlzcGF0Y2g7Ci0KLS8qIFNwZWNpZmllcyBpZiBhIGNlcnRhaW4gbWVzc2FnZSBpcyBhbGxvd2VkIGF0IHRoZSBtb21lbnQgKi8KLQotc3RhdGljIHZvaWQKLW1vbml0b3JfcGVybWl0KHN0cnVjdCBtb25fdGFibGUgKmVudCwgZW51bSBtb25pdG9yX3JlcXR5cGUgdHlwZSwgaW50IHBlcm1pdCkKLXsKLQl3aGlsZSAoZW50LT5mICE9IE5VTEwpIHsKLQkJaWYgKGVudC0+dHlwZSA9PSB0eXBlKSB7Ci0JCQllbnQtPmZsYWdzICY9IH5NT05fUEVSTUlUOwotCQkJZW50LT5mbGFncyB8PSBwZXJtaXQgPyBNT05fUEVSTUlUIDogMDsKLQkJCXJldHVybjsKLQkJfQotCQllbnQrKzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1tb25pdG9yX3Blcm1pdF9hdXRoZW50aWNhdGlvbnMoaW50IHBlcm1pdCkKLXsKLQlzdHJ1Y3QgbW9uX3RhYmxlICplbnQgPSBtb25fZGlzcGF0Y2g7Ci0KLQl3aGlsZSAoZW50LT5mICE9IE5VTEwpIHsKLQkJaWYgKGVudC0+ZmxhZ3MgJiBNT05fQVVUSCkgewotCQkJZW50LT5mbGFncyAmPSB+TU9OX1BFUk1JVDsKLQkJCWVudC0+ZmxhZ3MgfD0gcGVybWl0ID8gTU9OX1BFUk1JVCA6IDA7Ci0JCX0KLQkJZW50Kys7Ci0JfQotfQotCi12b2lkCi1tb25pdG9yX2NoaWxkX3ByZWF1dGgoQXV0aGN0eHQgKl9hdXRoY3R4dCwgc3RydWN0IG1vbml0b3IgKnBtb25pdG9yKQotewotCXN0cnVjdCBtb25fdGFibGUgKmVudDsKLQlpbnQgYXV0aGVudGljYXRlZCA9IDA7Ci0KLQlkZWJ1ZzMoInByZWF1dGggY2hpbGQgbW9uaXRvciBzdGFydGVkIik7Ci0KLQljbG9zZShwbW9uaXRvci0+bV9yZWN2ZmQpOwotCWNsb3NlKHBtb25pdG9yLT5tX2xvZ19zZW5kZmQpOwotCXBtb25pdG9yLT5tX2xvZ19zZW5kZmQgPSBwbW9uaXRvci0+bV9yZWN2ZmQgPSAtMTsKLQotCWF1dGhjdHh0ID0gX2F1dGhjdHh0OwotCW1lbXNldChhdXRoY3R4dCwgMCwgc2l6ZW9mKCphdXRoY3R4dCkpOwotCi0JYXV0aGN0eHQtPmxvZ2lubXNnID0gJmxvZ2lubXNnOwotCi0JaWYgKGNvbXBhdDIwKSB7Ci0JCW1vbl9kaXNwYXRjaCA9IG1vbl9kaXNwYXRjaF9wcm90bzIwOwotCi0JCS8qIFBlcm1pdCByZXF1ZXN0cyBmb3IgbW9kdWxpIGFuZCBzaWduYXR1cmVzICovCi0JCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfTU9EVUxJLCAxKTsKLQkJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9TSUdOLCAxKTsKLQl9IGVsc2UgewotCQltb25fZGlzcGF0Y2ggPSBtb25fZGlzcGF0Y2hfcHJvdG8xNTsKLQotCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX1NFU1NLRVksIDEpOwotCX0KLQotCS8qIFRoZSBmaXJzdCBmZXcgcmVxdWVzdHMgZG8gbm90IHJlcXVpcmUgYXN5bmNocm9ub3VzIGFjY2VzcyAqLwotCXdoaWxlICghYXV0aGVudGljYXRlZCkgewotCQlhdXRoX21ldGhvZCA9ICJ1bmtub3duIjsKLQkJYXV0aGVudGljYXRlZCA9IChtb25pdG9yX3JlYWQocG1vbml0b3IsIG1vbl9kaXNwYXRjaCwgJmVudCkgPT0gMSk7Ci0JCWlmIChhdXRoZW50aWNhdGVkKSB7Ci0JCQlpZiAoIShlbnQtPmZsYWdzICYgTU9OX0FVVEhERUNJREUpKQotCQkJCWZhdGFsKCIlczogdW5leHBlY3RlZCBhdXRoZW50aWNhdGlvbiBmcm9tICVkIiwKLQkJCQkgICAgX19mdW5jX18sIGVudC0+dHlwZSk7Ci0JCQlpZiAoYXV0aGN0eHQtPnB3LT5wd191aWQgPT0gMCAmJgotCQkJICAgICFhdXRoX3Jvb3RfYWxsb3dlZChhdXRoX21ldGhvZCkpCi0JCQkJYXV0aGVudGljYXRlZCA9IDA7Ci0jaWZkZWYgVVNFX1BBTQotCQkJLyogUEFNIG5lZWRzIHRvIHBlcmZvcm0gYWNjb3VudCBjaGVja3MgYWZ0ZXIgYXV0aCAqLwotCQkJaWYgKG9wdGlvbnMudXNlX3BhbSAmJiBhdXRoZW50aWNhdGVkKSB7Ci0JCQkJQnVmZmVyIG07Ci0KLQkJCQlidWZmZXJfaW5pdCgmbSk7Ci0JCQkJbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9zZW5kZmQsCi0JCQkJICAgIE1PTklUT1JfUkVRX1BBTV9BQ0NPVU5ULCAmbSk7Ci0JCQkJYXV0aGVudGljYXRlZCA9IG1tX2Fuc3dlcl9wYW1fYWNjb3VudChwbW9uaXRvci0+bV9zZW5kZmQsICZtKTsKLQkJCQlidWZmZXJfZnJlZSgmbSk7Ci0JCQl9Ci0jZW5kaWYKLQkJfQotCi0JCWlmIChlbnQtPmZsYWdzICYgKE1PTl9BVVRIREVDSURFfE1PTl9BTE9HKSkgewotCQkJYXV0aF9sb2coYXV0aGN0eHQsIGF1dGhlbnRpY2F0ZWQsIGF1dGhfbWV0aG9kLAotCQkJICAgIGNvbXBhdDIwID8gIiBzc2gyIiA6ICIiKTsKLQkJCWlmICghYXV0aGVudGljYXRlZCkKLQkJCQlhdXRoY3R4dC0+ZmFpbHVyZXMrKzsKLQkJfQotI2lmZGVmIEpQQUtFCi0JCS8qIENsZWFudXAgSlBBS0UgY29udGV4dCBhZnRlciBhdXRoZW50aWNhdGlvbiAqLwotCQlpZiAoZW50LT5mbGFncyAmIE1PTl9BVVRIREVDSURFKSB7Ci0JCQlpZiAoYXV0aGN0eHQtPmpwYWtlX2N0eCAhPSBOVUxMKSB7Ci0JCQkJanBha2VfZnJlZShhdXRoY3R4dC0+anBha2VfY3R4KTsKLQkJCQlhdXRoY3R4dC0+anBha2VfY3R4ID0gTlVMTDsKLQkJCX0KLQkJfQotI2VuZGlmCi0JfQotCi0JLyogRHJhaW4gYW55IGJ1ZmZlcmVkIG1lc3NhZ2VzIGZyb20gdGhlIGNoaWxkICovCi0Jd2hpbGUgKHBtb25pdG9yLT5tX2xvZ19yZWN2ZmQgIT0gLTEgJiYgbW9uaXRvcl9yZWFkX2xvZyhwbW9uaXRvcikgPT0gMCkKLQkJOwotCi0JaWYgKCFhdXRoY3R4dC0+dmFsaWQpCi0JCWZhdGFsKCIlczogYXV0aGVudGljYXRlZCBpbnZhbGlkIHVzZXIiLCBfX2Z1bmNfXyk7Ci0JaWYgKHN0cmNtcChhdXRoX21ldGhvZCwgInVua25vd24iKSA9PSAwKQotCQlmYXRhbCgiJXM6IGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBuYW1lIHVua25vd24iLCBfX2Z1bmNfXyk7Ci0KLQlkZWJ1ZygiJXM6ICVzIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgYnkgcHJpdmlsZWdlZCBwcm9jZXNzIiwKLQkgICAgX19mdW5jX18sIGF1dGhjdHh0LT51c2VyKTsKLQotCW1tX2dldF9rZXlzdGF0ZShwbW9uaXRvcik7Ci0KLQljbG9zZShwbW9uaXRvci0+bV9zZW5kZmQpOwotCWNsb3NlKHBtb25pdG9yLT5tX2xvZ19yZWN2ZmQpOwotCXBtb25pdG9yLT5tX3NlbmRmZCA9IHBtb25pdG9yLT5tX2xvZ19yZWN2ZmQgPSAtMTsKLX0KLQotc3RhdGljIHZvaWQKLW1vbml0b3Jfc2V0X2NoaWxkX2hhbmRsZXIocGlkX3QgcGlkKQotewotCW1vbml0b3JfY2hpbGRfcGlkID0gcGlkOwotfQotCi1zdGF0aWMgdm9pZAotbW9uaXRvcl9jaGlsZF9oYW5kbGVyKGludCBzaWcpCi17Ci0Ja2lsbChtb25pdG9yX2NoaWxkX3BpZCwgc2lnKTsKLX0KLQotdm9pZAotbW9uaXRvcl9jaGlsZF9wb3N0YXV0aChzdHJ1Y3QgbW9uaXRvciAqcG1vbml0b3IpCi17Ci0JY2xvc2UocG1vbml0b3ItPm1fcmVjdmZkKTsKLQlwbW9uaXRvci0+bV9yZWN2ZmQgPSAtMTsKLQotCW1vbml0b3Jfc2V0X2NoaWxkX2hhbmRsZXIocG1vbml0b3ItPm1fcGlkKTsKLQlzaWduYWwoU0lHSFVQLCAmbW9uaXRvcl9jaGlsZF9oYW5kbGVyKTsKLQlzaWduYWwoU0lHVEVSTSwgJm1vbml0b3JfY2hpbGRfaGFuZGxlcik7Ci0Jc2lnbmFsKFNJR0lOVCwgJm1vbml0b3JfY2hpbGRfaGFuZGxlcik7Ci0KLQlpZiAoY29tcGF0MjApIHsKLQkJbW9uX2Rpc3BhdGNoID0gbW9uX2Rpc3BhdGNoX3Bvc3RhdXRoMjA7Ci0KLQkJLyogUGVybWl0IHJlcXVlc3RzIGZvciBtb2R1bGkgYW5kIHNpZ25hdHVyZXMgKi8KLQkJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9NT0RVTEksIDEpOwotCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX1NJR04sIDEpOwotCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX1RFUk0sIDEpOwotCX0gZWxzZSB7Ci0JCW1vbl9kaXNwYXRjaCA9IG1vbl9kaXNwYXRjaF9wb3N0YXV0aDE1OwotCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX1RFUk0sIDEpOwotCX0KLQlpZiAoIW5vX3B0eV9mbGFnKSB7Ci0JCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfUFRZLCAxKTsKLQkJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9QVFlDTEVBTlVQLCAxKTsKLQl9Ci0KLQlmb3IgKDs7KQotCQltb25pdG9yX3JlYWQocG1vbml0b3IsIG1vbl9kaXNwYXRjaCwgTlVMTCk7Ci0KLQljbG9zZShwbW9uaXRvci0+bV9zZW5kZmQpOwotCXBtb25pdG9yLT5tX3NlbmRmZCA9IC0xOwotfQotCi12b2lkCi1tb25pdG9yX3N5bmMoc3RydWN0IG1vbml0b3IgKnBtb25pdG9yKQotewotCWlmIChvcHRpb25zLmNvbXByZXNzaW9uKSB7Ci0JCS8qIFRoZSBtZW1iZXIgYWxsb2NhdGlvbiBpcyBub3QgdmlzaWJsZSwgc28gc3luYyBpdCAqLwotCQltbV9zaGFyZV9zeW5jKCZwbW9uaXRvci0+bV96bGliLCAmcG1vbml0b3ItPm1femJhY2spOwotCX0KLX0KLQotc3RhdGljIGludAotbW9uaXRvcl9yZWFkX2xvZyhzdHJ1Y3QgbW9uaXRvciAqcG1vbml0b3IpCi17Ci0JQnVmZmVyIGxvZ21zZzsKLQl1X2ludCBsZW4sIGxldmVsOwotCWNoYXIgKm1zZzsKLQotCWJ1ZmZlcl9pbml0KCZsb2dtc2cpOwotCi0JLyogUmVhZCBsZW5ndGggKi8KLQlidWZmZXJfYXBwZW5kX3NwYWNlKCZsb2dtc2csIDQpOwotCWlmIChhdG9taWNpbyhyZWFkLCBwbW9uaXRvci0+bV9sb2dfcmVjdmZkLAotCSAgICBidWZmZXJfcHRyKCZsb2dtc2cpLCBidWZmZXJfbGVuKCZsb2dtc2cpKSAhPSBidWZmZXJfbGVuKCZsb2dtc2cpKSB7Ci0JCWlmIChlcnJubyA9PSBFUElQRSkgewotCQkJZGVidWcoIiVzOiBjaGlsZCBsb2cgZmQgY2xvc2VkIiwgX19mdW5jX18pOwotCQkJY2xvc2UocG1vbml0b3ItPm1fbG9nX3JlY3ZmZCk7Ci0JCQlwbW9uaXRvci0+bV9sb2dfcmVjdmZkID0gLTE7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZmF0YWwoIiVzOiBsb2cgZmQgcmVhZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci0JbGVuID0gYnVmZmVyX2dldF9pbnQoJmxvZ21zZyk7Ci0JaWYgKGxlbiA8PSA0IHx8IGxlbiA+IDgxOTIpCi0JCWZhdGFsKCIlczogaW52YWxpZCBsb2cgbWVzc2FnZSBsZW5ndGggJXUiLCBfX2Z1bmNfXywgbGVuKTsKLQotCS8qIFJlYWQgc2V2ZXJpdHksIG1lc3NhZ2UgKi8KLQlidWZmZXJfY2xlYXIoJmxvZ21zZyk7Ci0JYnVmZmVyX2FwcGVuZF9zcGFjZSgmbG9nbXNnLCBsZW4pOwotCWlmIChhdG9taWNpbyhyZWFkLCBwbW9uaXRvci0+bV9sb2dfcmVjdmZkLAotCSAgICBidWZmZXJfcHRyKCZsb2dtc2cpLCBidWZmZXJfbGVuKCZsb2dtc2cpKSAhPSBidWZmZXJfbGVuKCZsb2dtc2cpKQotCQlmYXRhbCgiJXM6IGxvZyBmZCByZWFkOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCi0JLyogTG9nIGl0ICovCi0JbGV2ZWwgPSBidWZmZXJfZ2V0X2ludCgmbG9nbXNnKTsKLQltc2cgPSBidWZmZXJfZ2V0X3N0cmluZygmbG9nbXNnLCBOVUxMKTsKLQlpZiAobG9nX2xldmVsX25hbWUobGV2ZWwpID09IE5VTEwpCi0JCWZhdGFsKCIlczogaW52YWxpZCBsb2cgbGV2ZWwgJXUgKGNvcnJ1cHRlZCBtZXNzYWdlPykiLAotCQkgICAgX19mdW5jX18sIGxldmVsKTsKLQlkb19sb2cyKGxldmVsLCAiJXMgW3ByZWF1dGhdIiwgbXNnKTsKLQotCWJ1ZmZlcl9mcmVlKCZsb2dtc2cpOwotCXhmcmVlKG1zZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1tb25pdG9yX3JlYWQoc3RydWN0IG1vbml0b3IgKnBtb25pdG9yLCBzdHJ1Y3QgbW9uX3RhYmxlICplbnQsCi0gICAgc3RydWN0IG1vbl90YWJsZSAqKnBlbnQpCi17Ci0JQnVmZmVyIG07Ci0JaW50IHJldDsKLQl1X2NoYXIgdHlwZTsKLQlzdHJ1Y3QgcG9sbGZkIHBmZFsyXTsKLQotCWZvciAoOzspIHsKLQkJYnplcm8oJnBmZCwgc2l6ZW9mKHBmZCkpOwotCQlwZmRbMF0uZmQgPSBwbW9uaXRvci0+bV9zZW5kZmQ7Ci0JCXBmZFswXS5ldmVudHMgPSBQT0xMSU47Ci0JCXBmZFsxXS5mZCA9IHBtb25pdG9yLT5tX2xvZ19yZWN2ZmQ7Ci0JCXBmZFsxXS5ldmVudHMgPSBwZmRbMV0uZmQgPT0gLTEgPyAwIDogUE9MTElOOwotCQlpZiAocG9sbChwZmQsIHBmZFsxXS5mZCA9PSAtMSA/IDEgOiAyLCAtMSkgPT0gLTEpIHsKLQkJCWlmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pCi0JCQkJY29udGludWU7Ci0JCQlmYXRhbCgiJXM6IHBvbGw6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JCX0KLQkJaWYgKHBmZFsxXS5yZXZlbnRzKSB7Ci0JCQkvKgotCQkJICogRHJhaW4gYWxsIGxvZyBtZXNzYWdlcyBiZWZvcmUgcHJvY2Vzc2luZyBuZXh0Ci0JCQkgKiBtb25pdG9yIHJlcXVlc3QuCi0JCQkgKi8KLQkJCW1vbml0b3JfcmVhZF9sb2cocG1vbml0b3IpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHBmZFswXS5yZXZlbnRzKQotCQkJYnJlYWs7ICAvKiBDb250aW51ZXMgYmVsb3cgKi8KLQl9Ci0KLQlidWZmZXJfaW5pdCgmbSk7Ci0KLQltbV9yZXF1ZXN0X3JlY2VpdmUocG1vbml0b3ItPm1fc2VuZGZkLCAmbSk7Ci0JdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbSk7Ci0KLQlkZWJ1ZzMoIiVzOiBjaGVja2luZyByZXF1ZXN0ICVkIiwgX19mdW5jX18sIHR5cGUpOwotCi0Jd2hpbGUgKGVudC0+ZiAhPSBOVUxMKSB7Ci0JCWlmIChlbnQtPnR5cGUgPT0gdHlwZSkKLQkJCWJyZWFrOwotCQllbnQrKzsKLQl9Ci0KLQlpZiAoZW50LT5mICE9IE5VTEwpIHsKLQkJaWYgKCEoZW50LT5mbGFncyAmIE1PTl9QRVJNSVQpKQotCQkJZmF0YWwoIiVzOiB1bnBlcm1pdHRlZCByZXF1ZXN0ICVkIiwgX19mdW5jX18sCi0JCQkgICAgdHlwZSk7Ci0JCXJldCA9ICgqZW50LT5mKShwbW9uaXRvci0+bV9zZW5kZmQsICZtKTsKLQkJYnVmZmVyX2ZyZWUoJm0pOwotCi0JCS8qIFRoZSBjaGlsZCBtYXkgdXNlIHRoaXMgcmVxdWVzdCBvbmx5IG9uY2UsIGRpc2FibGUgaXQgKi8KLQkJaWYgKGVudC0+ZmxhZ3MgJiBNT05fT05DRSkgewotCQkJZGVidWcyKCIlczogJWQgdXNlZCBvbmNlLCBkaXNhYmxpbmcgbm93IiwgX19mdW5jX18sCi0JCQkgICAgdHlwZSk7Ci0JCQllbnQtPmZsYWdzICY9IH5NT05fUEVSTUlUOwotCQl9Ci0KLQkJaWYgKHBlbnQgIT0gTlVMTCkKLQkJCSpwZW50ID0gZW50OwotCi0JCXJldHVybiByZXQ7Ci0JfQotCi0JZmF0YWwoIiVzOiB1bnN1cHBvcnRlZCByZXF1ZXN0OiAlZCIsIF9fZnVuY19fLCB0eXBlKTsKLQotCS8qIE5PVFJFQUNIRUQgKi8KLQlyZXR1cm4gKC0xKTsKLX0KLQotLyogYWxsb3dlZCBrZXkgc3RhdGUgKi8KLXN0YXRpYyBpbnQKLW1vbml0b3JfYWxsb3dlZF9rZXkodV9jaGFyICpibG9iLCB1X2ludCBibG9ibGVuKQotewotCS8qIG1ha2Ugc3VyZSBrZXkgaXMgYWxsb3dlZCAqLwotCWlmIChrZXlfYmxvYiA9PSBOVUxMIHx8IGtleV9ibG9ibGVuICE9IGJsb2JsZW4gfHwKLQkgICAgdGltaW5nc2FmZV9iY21wKGtleV9ibG9iLCBibG9iLCBrZXlfYmxvYmxlbikpCi0JCXJldHVybiAoMCk7Ci0JcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLW1vbml0b3JfcmVzZXRfa2V5X3N0YXRlKHZvaWQpCi17Ci0JLyogcmVzZXQgc3RhdGUgKi8KLQlpZiAoa2V5X2Jsb2IgIT0gTlVMTCkKLQkJeGZyZWUoa2V5X2Jsb2IpOwotCWlmIChob3N0YmFzZWRfY3VzZXIgIT0gTlVMTCkKLQkJeGZyZWUoaG9zdGJhc2VkX2N1c2VyKTsKLQlpZiAoaG9zdGJhc2VkX2Nob3N0ICE9IE5VTEwpCi0JCXhmcmVlKGhvc3RiYXNlZF9jaG9zdCk7Ci0Ja2V5X2Jsb2IgPSBOVUxMOwotCWtleV9ibG9ibGVuID0gMDsKLQlrZXlfYmxvYnR5cGUgPSBNTV9OT0tFWTsKLQlob3N0YmFzZWRfY3VzZXIgPSBOVUxMOwotCWhvc3RiYXNlZF9jaG9zdCA9IE5VTEw7Ci19Ci0KLWludAotbW1fYW5zd2VyX21vZHVsaShpbnQgc29jaywgQnVmZmVyICptKQotewotCURIICpkaDsKLQlpbnQgbWluLCB3YW50LCBtYXg7Ci0KLQltaW4gPSBidWZmZXJfZ2V0X2ludChtKTsKLQl3YW50ID0gYnVmZmVyX2dldF9pbnQobSk7Ci0JbWF4ID0gYnVmZmVyX2dldF9pbnQobSk7Ci0KLQlkZWJ1ZzMoIiVzOiBnb3QgcGFyYW1ldGVyczogJWQgJWQgJWQiLAotCSAgICBfX2Z1bmNfXywgbWluLCB3YW50LCBtYXgpOwotCS8qIFdlIG5lZWQgdG8gY2hlY2sgaGVyZSwgdG9vLCBpbiBjYXNlIHRoZSBjaGlsZCBnb3QgY29ycnVwdGVkICovCi0JaWYgKG1heCA8IG1pbiB8fCB3YW50IDwgbWluIHx8IG1heCA8IHdhbnQpCi0JCWZhdGFsKCIlczogYmFkIHBhcmFtZXRlcnM6ICVkICVkICVkIiwKLQkJICAgIF9fZnVuY19fLCBtaW4sIHdhbnQsIG1heCk7Ci0KLQlidWZmZXJfY2xlYXIobSk7Ci0KLQlkaCA9IGNob29zZV9kaChtaW4sIHdhbnQsIG1heCk7Ci0JaWYgKGRoID09IE5VTEwpIHsKLQkJYnVmZmVyX3B1dF9jaGFyKG0sIDApOwotCQlyZXR1cm4gKDApOwotCX0gZWxzZSB7Ci0JCS8qIFNlbmQgZmlyc3QgYmlnbnVtICovCi0JCWJ1ZmZlcl9wdXRfY2hhcihtLCAxKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKG0sIGRoLT5wKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0yKG0sIGRoLT5nKTsKLQotCQlESF9mcmVlKGRoKTsKLQl9Ci0JbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX01PRFVMSSwgbSk7Ci0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci1tbV9hbnN3ZXJfc2lnbihpbnQgc29jaywgQnVmZmVyICptKQotewotCUtleSAqa2V5OwotCXVfY2hhciAqcDsKLQl1X2NoYXIgKnNpZ25hdHVyZTsKLQl1X2ludCBzaWdsZW4sIGRhdGxlbjsKLQlpbnQga2V5aWQ7Ci0KLQlkZWJ1ZzMoIiVzIiwgX19mdW5jX18pOwotCi0Ja2V5aWQgPSBidWZmZXJfZ2V0X2ludChtKTsKLQlwID0gYnVmZmVyX2dldF9zdHJpbmcobSwgJmRhdGxlbik7Ci0KLQkvKgotCSAqIFN1cHBvcnRlZCBLRVggdHlwZXMgdXNlIFNIQTEgKDIwIGJ5dGVzKSwgU0hBMjU2ICgzMiBieXRlcyksCi0JICogU0hBMzg0ICg0OCBieXRlcykgYW5kIFNIQTUxMiAoNjQgYnl0ZXMpLgotCSAqLwotCWlmIChkYXRsZW4gIT0gMjAgJiYgZGF0bGVuICE9IDMyICYmIGRhdGxlbiAhPSA0OCAmJiBkYXRsZW4gIT0gNjQpCi0JCWZhdGFsKCIlczogZGF0YSBsZW5ndGggaW5jb3JyZWN0OiAldSIsIF9fZnVuY19fLCBkYXRsZW4pOwotCi0JLyogc2F2ZSBzZXNzaW9uIGlkLCBpdCB3aWxsIGJlIHBhc3NlZCBvbiB0aGUgZmlyc3QgY2FsbCAqLwotCWlmIChzZXNzaW9uX2lkMl9sZW4gPT0gMCkgewotCQlzZXNzaW9uX2lkMl9sZW4gPSBkYXRsZW47Ci0JCXNlc3Npb25faWQyID0geG1hbGxvYyhzZXNzaW9uX2lkMl9sZW4pOwotCQltZW1jcHkoc2Vzc2lvbl9pZDIsIHAsIHNlc3Npb25faWQyX2xlbik7Ci0JfQotCi0JaWYgKChrZXkgPSBnZXRfaG9zdGtleV9ieV9pbmRleChrZXlpZCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogbm8gaG9zdGtleSBmcm9tIGluZGV4ICVkIiwgX19mdW5jX18sIGtleWlkKTsKLQlpZiAoa2V5X3NpZ24oa2V5LCAmc2lnbmF0dXJlLCAmc2lnbGVuLCBwLCBkYXRsZW4pIDwgMCkKLQkJZmF0YWwoIiVzOiBrZXlfc2lnbiBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0KLQlkZWJ1ZzMoIiVzOiBzaWduYXR1cmUgJXAoJXUpIiwgX19mdW5jX18sIHNpZ25hdHVyZSwgc2lnbGVuKTsKLQotCWJ1ZmZlcl9jbGVhcihtKTsKLQlidWZmZXJfcHV0X3N0cmluZyhtLCBzaWduYXR1cmUsIHNpZ2xlbik7Ci0KLQl4ZnJlZShwKTsKLQl4ZnJlZShzaWduYXR1cmUpOwotCi0JbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX1NJR04sIG0pOwotCi0JLyogVHVybiBvbiBwZXJtaXNzaW9ucyBmb3IgZ2V0cHduYW0gKi8KLQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX1BXTkFNLCAxKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLS8qIFJldHJpZXZlcyB0aGUgcGFzc3dvcmQgZW50cnkgYW5kIGFsc28gY2hlY2tzIGlmIHRoZSB1c2VyIGlzIHBlcm1pdHRlZCAqLwotCi1pbnQKLW1tX2Fuc3dlcl9wd25hbWFsbG93KGludCBzb2NrLCBCdWZmZXIgKm0pCi17Ci0JY2hhciAqdXNlcm5hbWU7Ci0Jc3RydWN0IHBhc3N3ZCAqcHdlbnQ7Ci0JaW50IGFsbG93ZWQgPSAwOwotCXVfaW50IGk7Ci0KLQlkZWJ1ZzMoIiVzIiwgX19mdW5jX18pOwotCi0JaWYgKGF1dGhjdHh0LT5hdHRlbXB0KysgIT0gMCkKLQkJZmF0YWwoIiVzOiBtdWx0aXBsZSBhdHRlbXB0cyBmb3IgZ2V0cHduYW0iLCBfX2Z1bmNfXyk7Ci0KLQl1c2VybmFtZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sIE5VTEwpOwotCi0JcHdlbnQgPSBnZXRwd25hbWFsbG93KHVzZXJuYW1lKTsKLQotCWF1dGhjdHh0LT51c2VyID0geHN0cmR1cCh1c2VybmFtZSk7Ci0Jc2V0cHJvY3RpdGxlKCIlcyBbcHJpdl0iLCBwd2VudCA/IHVzZXJuYW1lIDogInVua25vd24iKTsKLQl4ZnJlZSh1c2VybmFtZSk7Ci0KLQlidWZmZXJfY2xlYXIobSk7Ci0KLQlpZiAocHdlbnQgPT0gTlVMTCkgewotCQlidWZmZXJfcHV0X2NoYXIobSwgMCk7Ci0JCWF1dGhjdHh0LT5wdyA9IGZha2VwdygpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlhbGxvd2VkID0gMTsKLQlhdXRoY3R4dC0+cHcgPSBwd2VudDsKLQlhdXRoY3R4dC0+dmFsaWQgPSAxOwotCi0JYnVmZmVyX3B1dF9jaGFyKG0sIDEpOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKG0sIHB3ZW50LCBzaXplb2Yoc3RydWN0IHBhc3N3ZCkpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZyhtLCBwd2VudC0+cHdfbmFtZSk7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKG0sICIqIik7Ci0jaWZkZWYgSEFWRV9QV19HRUNPU19JTl9QQVNTV0QKLQlidWZmZXJfcHV0X2NzdHJpbmcobSwgcHdlbnQtPnB3X2dlY29zKTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfUFdfQ0xBU1NfSU5fUEFTU1dECi0JYnVmZmVyX3B1dF9jc3RyaW5nKG0sIHB3ZW50LT5wd19jbGFzcyk7Ci0jZW5kaWYKLQlidWZmZXJfcHV0X2NzdHJpbmcobSwgcHdlbnQtPnB3X2Rpcik7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKG0sIHB3ZW50LT5wd19zaGVsbCk7Ci0KLSBvdXQ6Ci0JYnVmZmVyX3B1dF9zdHJpbmcobSwgJm9wdGlvbnMsIHNpemVvZihvcHRpb25zKSk7Ci0KLSNkZWZpbmUgTV9DUF9TVFJPUFQoeCkgZG8geyBcCi0JCWlmIChvcHRpb25zLnggIT0gTlVMTCkgXAotCQkJYnVmZmVyX3B1dF9jc3RyaW5nKG0sIG9wdGlvbnMueCk7IFwKLQl9IHdoaWxlICgwKQotI2RlZmluZSBNX0NQX1NUUkFSUkFZT1BUKHgsIG54KSBkbyB7IFwKLQkJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubng7IGkrKykgXAotCQkJYnVmZmVyX3B1dF9jc3RyaW5nKG0sIG9wdGlvbnMueFtpXSk7IFwKLQl9IHdoaWxlICgwKQotCS8qIFNlZSBjb21tZW50IGluIHNlcnZjb25mLmggKi8KLQlDT1BZX01BVENIX1NUUklOR19PUFRTKCk7Ci0jdW5kZWYgTV9DUF9TVFJPUFQKLSN1bmRlZiBNX0NQX1NUUkFSUkFZT1BUCi0JCi0JZGVidWczKCIlczogc2VuZGluZyBNT05JVE9SX0FOU19QV05BTTogJWQiLCBfX2Z1bmNfXywgYWxsb3dlZCk7Ci0JbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX1BXTkFNLCBtKTsKLQotCS8qIEZvciBTU0h2MSBhbGxvdyBhdXRoZW50aWNhdGlvbiBub3cgKi8KLQlpZiAoIWNvbXBhdDIwKQotCQltb25pdG9yX3Blcm1pdF9hdXRoZW50aWNhdGlvbnMoMSk7Ci0JZWxzZSB7Ci0JCS8qIEFsbG93IHNlcnZpY2Uvc3R5bGUgaW5mb3JtYXRpb24gb24gdGhlIGF1dGggY29udGV4dCAqLwotCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX0FVVEhTRVJWLCAxKTsKLQkJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9BVVRIMl9SRUFEX0JBTk5FUiwgMSk7Ci0JfQotI2lmZGVmIFVTRV9QQU0KLQlpZiAob3B0aW9ucy51c2VfcGFtKQotCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX1BBTV9TVEFSVCwgMSk7Ci0jZW5kaWYKLQotCXJldHVybiAoMCk7Ci19Ci0KLWludCBtbV9hbnN3ZXJfYXV0aDJfcmVhZF9iYW5uZXIoaW50IHNvY2ssIEJ1ZmZlciAqbSkKLXsKLQljaGFyICpiYW5uZXI7Ci0KLQlidWZmZXJfY2xlYXIobSk7Ci0JYmFubmVyID0gYXV0aDJfcmVhZF9iYW5uZXIoKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcobSwgYmFubmVyICE9IE5VTEwgPyBiYW5uZXIgOiAiIik7Ci0JbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX0FVVEgyX1JFQURfQkFOTkVSLCBtKTsKLQotCWlmIChiYW5uZXIgIT0gTlVMTCkKLQkJeGZyZWUoYmFubmVyKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLWludAotbW1fYW5zd2VyX2F1dGhzZXJ2KGludCBzb2NrLCBCdWZmZXIgKm0pCi17Ci0JbW9uaXRvcl9wZXJtaXRfYXV0aGVudGljYXRpb25zKDEpOwotCi0JYXV0aGN0eHQtPnNlcnZpY2UgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCBOVUxMKTsKLQlhdXRoY3R4dC0+c3R5bGUgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCBOVUxMKTsKLQlkZWJ1ZzMoIiVzOiBzZXJ2aWNlPSVzLCBzdHlsZT0lcyIsCi0JICAgIF9fZnVuY19fLCBhdXRoY3R4dC0+c2VydmljZSwgYXV0aGN0eHQtPnN0eWxlKTsKLQotCWlmIChzdHJsZW4oYXV0aGN0eHQtPnN0eWxlKSA9PSAwKSB7Ci0JCXhmcmVlKGF1dGhjdHh0LT5zdHlsZSk7Ci0JCWF1dGhjdHh0LT5zdHlsZSA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci1tbV9hbnN3ZXJfYXV0aHBhc3N3b3JkKGludCBzb2NrLCBCdWZmZXIgKm0pCi17Ci0Jc3RhdGljIGludCBjYWxsX2NvdW50OwotCWNoYXIgKnBhc3N3ZDsKLQlpbnQgYXV0aGVudGljYXRlZDsKLQl1X2ludCBwbGVuOwotCi0JcGFzc3dkID0gYnVmZmVyX2dldF9zdHJpbmcobSwgJnBsZW4pOwotCS8qIE9ubHkgYXV0aGVudGljYXRlIGlmIHRoZSBjb250ZXh0IGlzIHZhbGlkICovCi0jaWZuZGVmIEFORFJPSUQKLQkvKiBubyBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBpbiBhbmRyb2lkICovCi0JYXV0aGVudGljYXRlZCA9IG9wdGlvbnMucGFzc3dvcmRfYXV0aGVudGljYXRpb24gJiYKLQkgICAgYXV0aF9wYXNzd29yZChhdXRoY3R4dCwgcGFzc3dkKTsKLSNlbHNlCi0JYXV0aGVudGljYXRlZCA9IDA7Ci0jZW5kaWYKLQltZW1zZXQocGFzc3dkLCAwLCBzdHJsZW4ocGFzc3dkKSk7Ci0JeGZyZWUocGFzc3dkKTsKLQotCWJ1ZmZlcl9jbGVhcihtKTsKLQlidWZmZXJfcHV0X2ludChtLCBhdXRoZW50aWNhdGVkKTsKLQotCWRlYnVnMygiJXM6IHNlbmRpbmcgcmVzdWx0ICVkIiwgX19mdW5jX18sIGF1dGhlbnRpY2F0ZWQpOwotCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19BVVRIUEFTU1dPUkQsIG0pOwotCi0JY2FsbF9jb3VudCsrOwotCWlmIChwbGVuID09IDAgJiYgY2FsbF9jb3VudCA9PSAxKQotCQlhdXRoX21ldGhvZCA9ICJub25lIjsKLQllbHNlCi0JCWF1dGhfbWV0aG9kID0gInBhc3N3b3JkIjsKLQotCS8qIENhdXNlcyBtb25pdG9yIGxvb3AgdG8gdGVybWluYXRlIGlmIGF1dGhlbnRpY2F0ZWQgKi8KLQlyZXR1cm4gKGF1dGhlbnRpY2F0ZWQpOwotfQotCi0jaWZkZWYgQlNEX0FVVEgKLWludAotbW1fYW5zd2VyX2JzZGF1dGhxdWVyeShpbnQgc29jaywgQnVmZmVyICptKQotewotCWNoYXIgKm5hbWUsICppbmZvdHh0OwotCXVfaW50IG51bXByb21wdHM7Ci0JdV9pbnQgKmVjaG9fb247Ci0JY2hhciAqKnByb21wdHM7Ci0JdV9pbnQgc3VjY2VzczsKLQotCXN1Y2Nlc3MgPSBic2RhdXRoX3F1ZXJ5KGF1dGhjdHh0LCAmbmFtZSwgJmluZm90eHQsICZudW1wcm9tcHRzLAotCSAgICAmcHJvbXB0cywgJmVjaG9fb24pIDwgMCA/IDAgOiAxOwotCi0JYnVmZmVyX2NsZWFyKG0pOwotCWJ1ZmZlcl9wdXRfaW50KG0sIHN1Y2Nlc3MpOwotCWlmIChzdWNjZXNzKQotCQlidWZmZXJfcHV0X2NzdHJpbmcobSwgcHJvbXB0c1swXSk7Ci0KLQlkZWJ1ZzMoIiVzOiBzZW5kaW5nIGNoYWxsZW5nZSBzdWNjZXNzOiAldSIsIF9fZnVuY19fLCBzdWNjZXNzKTsKLQltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfQlNEQVVUSFFVRVJZLCBtKTsKLQotCWlmIChzdWNjZXNzKSB7Ci0JCXhmcmVlKG5hbWUpOwotCQl4ZnJlZShpbmZvdHh0KTsKLQkJeGZyZWUocHJvbXB0cyk7Ci0JCXhmcmVlKGVjaG9fb24pOwotCX0KLQotCXJldHVybiAoMCk7Ci19Ci0KLWludAotbW1fYW5zd2VyX2JzZGF1dGhyZXNwb25kKGludCBzb2NrLCBCdWZmZXIgKm0pCi17Ci0JY2hhciAqcmVzcG9uc2U7Ci0JaW50IGF1dGhvazsKLQotCWlmIChhdXRoY3R4dC0+YXMgPT0gMCkKLQkJZmF0YWwoIiVzOiBubyBic2QgYXV0aCBzZXNzaW9uIiwgX19mdW5jX18pOwotCi0JcmVzcG9uc2UgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCBOVUxMKTsKLQlhdXRob2sgPSBvcHRpb25zLmNoYWxsZW5nZV9yZXNwb25zZV9hdXRoZW50aWNhdGlvbiAmJgotCSAgICBhdXRoX3VzZXJyZXNwb25zZShhdXRoY3R4dC0+YXMsIHJlc3BvbnNlLCAwKTsKLQlhdXRoY3R4dC0+YXMgPSBOVUxMOwotCWRlYnVnMygiJXM6IDwlcz4gPSA8JWQ+IiwgX19mdW5jX18sIHJlc3BvbnNlLCBhdXRob2spOwotCXhmcmVlKHJlc3BvbnNlKTsKLQotCWJ1ZmZlcl9jbGVhcihtKTsKLQlidWZmZXJfcHV0X2ludChtLCBhdXRob2spOwotCi0JZGVidWczKCIlczogc2VuZGluZyBhdXRoZW50aWNhdGVkOiAlZCIsIF9fZnVuY19fLCBhdXRob2spOwotCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19CU0RBVVRIUkVTUE9ORCwgbSk7Ci0KLQlhdXRoX21ldGhvZCA9ICJic2RhdXRoIjsKLQotCXJldHVybiAoYXV0aG9rICE9IDApOwotfQotI2VuZGlmCi0KLSNpZmRlZiBTS0VZCi1pbnQKLW1tX2Fuc3dlcl9za2V5cXVlcnkoaW50IHNvY2ssIEJ1ZmZlciAqbSkKLXsKLQlzdHJ1Y3Qgc2tleSBza2V5OwotCWNoYXIgY2hhbGxlbmdlWzEwMjRdOwotCXVfaW50IHN1Y2Nlc3M7Ci0KLQlzdWNjZXNzID0gX2NvbXBhdF9za2V5Y2hhbGxlbmdlKCZza2V5LCBhdXRoY3R4dC0+dXNlciwgY2hhbGxlbmdlLAotCSAgICBzaXplb2YoY2hhbGxlbmdlKSkgPCAwID8gMCA6IDE7Ci0KLQlidWZmZXJfY2xlYXIobSk7Ci0JYnVmZmVyX3B1dF9pbnQobSwgc3VjY2Vzcyk7Ci0JaWYgKHN1Y2Nlc3MpCi0JCWJ1ZmZlcl9wdXRfY3N0cmluZyhtLCBjaGFsbGVuZ2UpOwotCi0JZGVidWczKCIlczogc2VuZGluZyBjaGFsbGVuZ2Ugc3VjY2VzczogJXUiLCBfX2Z1bmNfXywgc3VjY2Vzcyk7Ci0JbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX1NLRVlRVUVSWSwgbSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi1pbnQKLW1tX2Fuc3dlcl9za2V5cmVzcG9uZChpbnQgc29jaywgQnVmZmVyICptKQotewotCWNoYXIgKnJlc3BvbnNlOwotCWludCBhdXRob2s7Ci0KLQlyZXNwb25zZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sIE5VTEwpOwotCi0JYXV0aG9rID0gKG9wdGlvbnMuY2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uICYmCi0JICAgIGF1dGhjdHh0LT52YWxpZCAmJgotCSAgICBza2V5X2hhc2tleShhdXRoY3R4dC0+cHctPnB3X25hbWUpID09IDAgJiYKLQkgICAgc2tleV9wYXNzY2hlY2soYXV0aGN0eHQtPnB3LT5wd19uYW1lLCByZXNwb25zZSkgIT0gLTEpOwotCi0JeGZyZWUocmVzcG9uc2UpOwotCi0JYnVmZmVyX2NsZWFyKG0pOwotCWJ1ZmZlcl9wdXRfaW50KG0sIGF1dGhvayk7Ci0KLQlkZWJ1ZzMoIiVzOiBzZW5kaW5nIGF1dGhlbnRpY2F0ZWQ6ICVkIiwgX19mdW5jX18sIGF1dGhvayk7Ci0JbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX1NLRVlSRVNQT05ELCBtKTsKLQotCWF1dGhfbWV0aG9kID0gInNrZXkiOwotCi0JcmV0dXJuIChhdXRob2sgIT0gMCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9QQU0KLWludAotbW1fYW5zd2VyX3BhbV9zdGFydChpbnQgc29jaywgQnVmZmVyICptKQotewotCWlmICghb3B0aW9ucy51c2VfcGFtKQotCQlmYXRhbCgiVXNlUEFNIG5vdCBzZXQsIGJ1dCBlbmRlZCB1cCBpbiAlcyBhbnl3YXkiLCBfX2Z1bmNfXyk7Ci0KLQlzdGFydF9wYW0oYXV0aGN0eHQpOwotCi0JbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9QQU1fQUNDT1VOVCwgMSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi1pbnQKLW1tX2Fuc3dlcl9wYW1fYWNjb3VudChpbnQgc29jaywgQnVmZmVyICptKQotewotCXVfaW50IHJldDsKLQotCWlmICghb3B0aW9ucy51c2VfcGFtKQotCQlmYXRhbCgiVXNlUEFNIG5vdCBzZXQsIGJ1dCBlbmRlZCB1cCBpbiAlcyBhbnl3YXkiLCBfX2Z1bmNfXyk7Ci0KLQlyZXQgPSBkb19wYW1fYWNjb3VudCgpOwotCi0JYnVmZmVyX3B1dF9pbnQobSwgcmV0KTsKLQlidWZmZXJfcHV0X3N0cmluZyhtLCBidWZmZXJfcHRyKCZsb2dpbm1zZyksIGJ1ZmZlcl9sZW4oJmxvZ2lubXNnKSk7Ci0KLQltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfUEFNX0FDQ09VTlQsIG0pOwotCi0JcmV0dXJuIChyZXQpOwotfQotCi1zdGF0aWMgdm9pZCAqc3NocGFtX2N0eHQsICpzc2hwYW1fYXV0aG9rOwotZXh0ZXJuIEtiZGludERldmljZSBzc2hwYW1fZGV2aWNlOwotCi1pbnQKLW1tX2Fuc3dlcl9wYW1faW5pdF9jdHgoaW50IHNvY2ssIEJ1ZmZlciAqbSkKLXsKLQotCWRlYnVnMygiJXMiLCBfX2Z1bmNfXyk7Ci0JYXV0aGN0eHQtPnVzZXIgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCBOVUxMKTsKLQlzc2hwYW1fY3R4dCA9IChzc2hwYW1fZGV2aWNlLmluaXRfY3R4KShhdXRoY3R4dCk7Ci0Jc3NocGFtX2F1dGhvayA9IE5VTEw7Ci0JYnVmZmVyX2NsZWFyKG0pOwotCWlmIChzc2hwYW1fY3R4dCAhPSBOVUxMKSB7Ci0JCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfUEFNX0ZSRUVfQ1RYLCAxKTsKLQkJYnVmZmVyX3B1dF9pbnQobSwgMSk7Ci0JfSBlbHNlIHsKLQkJYnVmZmVyX3B1dF9pbnQobSwgMCk7Ci0JfQotCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19QQU1fSU5JVF9DVFgsIG0pOwotCXJldHVybiAoMCk7Ci19Ci0KLWludAotbW1fYW5zd2VyX3BhbV9xdWVyeShpbnQgc29jaywgQnVmZmVyICptKQotewotCWNoYXIgKm5hbWUgPSBOVUxMLCAqaW5mbyA9IE5VTEwsICoqcHJvbXB0cyA9IE5VTEw7Ci0JdV9pbnQgaSwgbnVtID0gMCwgKmVjaG9fb24gPSAwOwotCWludCByZXQ7Ci0KLQlkZWJ1ZzMoIiVzIiwgX19mdW5jX18pOwotCXNzaHBhbV9hdXRob2sgPSBOVUxMOwotCXJldCA9IChzc2hwYW1fZGV2aWNlLnF1ZXJ5KShzc2hwYW1fY3R4dCwgJm5hbWUsICZpbmZvLCAmbnVtLCAmcHJvbXB0cywgJmVjaG9fb24pOwotCWlmIChyZXQgPT0gMCAmJiBudW0gPT0gMCkKLQkJc3NocGFtX2F1dGhvayA9IHNzaHBhbV9jdHh0OwotCWlmIChudW0gPiAxIHx8IG5hbWUgPT0gTlVMTCB8fCBpbmZvID09IE5VTEwpCi0JCXJldCA9IC0xOwotCWJ1ZmZlcl9jbGVhcihtKTsKLQlidWZmZXJfcHV0X2ludChtLCByZXQpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZyhtLCBuYW1lKTsKLQl4ZnJlZShuYW1lKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcobSwgaW5mbyk7Ci0JeGZyZWUoaW5mbyk7Ci0JYnVmZmVyX3B1dF9pbnQobSwgbnVtKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKLQkJYnVmZmVyX3B1dF9jc3RyaW5nKG0sIHByb21wdHNbaV0pOwotCQl4ZnJlZShwcm9tcHRzW2ldKTsKLQkJYnVmZmVyX3B1dF9pbnQobSwgZWNob19vbltpXSk7Ci0JfQotCWlmIChwcm9tcHRzICE9IE5VTEwpCi0JCXhmcmVlKHByb21wdHMpOwotCWlmIChlY2hvX29uICE9IE5VTEwpCi0JCXhmcmVlKGVjaG9fb24pOwotCWF1dGhfbWV0aG9kID0gImtleWJvYXJkLWludGVyYWN0aXZlL3BhbSI7Ci0JbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX1BBTV9RVUVSWSwgbSk7Ci0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci1tbV9hbnN3ZXJfcGFtX3Jlc3BvbmQoaW50IHNvY2ssIEJ1ZmZlciAqbSkKLXsKLQljaGFyICoqcmVzcDsKLQl1X2ludCBpLCBudW07Ci0JaW50IHJldDsKLQotCWRlYnVnMygiJXMiLCBfX2Z1bmNfXyk7Ci0Jc3NocGFtX2F1dGhvayA9IE5VTEw7Ci0JbnVtID0gYnVmZmVyX2dldF9pbnQobSk7Ci0JaWYgKG51bSA+IDApIHsKLQkJcmVzcCA9IHhjYWxsb2MobnVtLCBzaXplb2YoY2hhciAqKSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBudW07ICsraSkKLQkJCXJlc3BbaV0gPSBidWZmZXJfZ2V0X3N0cmluZyhtLCBOVUxMKTsKLQkJcmV0ID0gKHNzaHBhbV9kZXZpY2UucmVzcG9uZCkoc3NocGFtX2N0eHQsIG51bSwgcmVzcCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBudW07ICsraSkKLQkJCXhmcmVlKHJlc3BbaV0pOwotCQl4ZnJlZShyZXNwKTsKLQl9IGVsc2UgewotCQlyZXQgPSAoc3NocGFtX2RldmljZS5yZXNwb25kKShzc2hwYW1fY3R4dCwgbnVtLCBOVUxMKTsKLQl9Ci0JYnVmZmVyX2NsZWFyKG0pOwotCWJ1ZmZlcl9wdXRfaW50KG0sIHJldCk7Ci0JbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX1BBTV9SRVNQT05ELCBtKTsKLQlhdXRoX21ldGhvZCA9ICJrZXlib2FyZC1pbnRlcmFjdGl2ZS9wYW0iOwotCWlmIChyZXQgPT0gMCkKLQkJc3NocGFtX2F1dGhvayA9IHNzaHBhbV9jdHh0OwotCXJldHVybiAoMCk7Ci19Ci0KLWludAotbW1fYW5zd2VyX3BhbV9mcmVlX2N0eChpbnQgc29jaywgQnVmZmVyICptKQotewotCi0JZGVidWczKCIlcyIsIF9fZnVuY19fKTsKLQkoc3NocGFtX2RldmljZS5mcmVlX2N0eCkoc3NocGFtX2N0eHQpOwotCWJ1ZmZlcl9jbGVhcihtKTsKLQltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfUEFNX0ZSRUVfQ1RYLCBtKTsKLQlhdXRoX21ldGhvZCA9ICJrZXlib2FyZC1pbnRlcmFjdGl2ZS9wYW0iOwotCXJldHVybiAoc3NocGFtX2F1dGhvayA9PSBzc2hwYW1fY3R4dCk7Ci19Ci0jZW5kaWYKLQotaW50Ci1tbV9hbnN3ZXJfa2V5YWxsb3dlZChpbnQgc29jaywgQnVmZmVyICptKQotewotCUtleSAqa2V5OwotCWNoYXIgKmN1c2VyLCAqY2hvc3Q7Ci0JdV9jaGFyICpibG9iOwotCXVfaW50IGJsb2JsZW47Ci0JZW51bSBtbV9rZXl0eXBlIHR5cGUgPSAwOwotCWludCBhbGxvd2VkID0gMDsKLQotCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQl0eXBlID0gYnVmZmVyX2dldF9pbnQobSk7Ci0JY3VzZXIgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCBOVUxMKTsKLQljaG9zdCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sIE5VTEwpOwotCWJsb2IgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmYmxvYmxlbik7Ci0KLQlrZXkgPSBrZXlfZnJvbV9ibG9iKGJsb2IsIGJsb2JsZW4pOwotCi0JaWYgKChjb21wYXQyMCAmJiB0eXBlID09IE1NX1JTQUhPU1RLRVkpIHx8Ci0JICAgICghY29tcGF0MjAgJiYgdHlwZSAhPSBNTV9SU0FIT1NUS0VZKSkKLQkJZmF0YWwoIiVzOiBrZXkgdHlwZSBhbmQgcHJvdG9jb2wgbWlzbWF0Y2giLCBfX2Z1bmNfXyk7Ci0KLQlkZWJ1ZzMoIiVzOiBrZXlfZnJvbV9ibG9iOiAlcCIsIF9fZnVuY19fLCBrZXkpOwotCi0JaWYgKGtleSAhPSBOVUxMICYmIGF1dGhjdHh0LT52YWxpZCkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBNTV9VU0VSS0VZOgotCQkJYWxsb3dlZCA9IG9wdGlvbnMucHVia2V5X2F1dGhlbnRpY2F0aW9uICYmCi0JCQkgICAgdXNlcl9rZXlfYWxsb3dlZChhdXRoY3R4dC0+cHcsIGtleSk7Ci0JCQlhdXRoX21ldGhvZCA9ICJwdWJsaWNrZXkiOwotCQkJaWYgKG9wdGlvbnMucHVia2V5X2F1dGhlbnRpY2F0aW9uICYmIGFsbG93ZWQgIT0gMSkKLQkJCQlhdXRoX2NsZWFyX29wdGlvbnMoKTsKLQkJCWJyZWFrOwotCQljYXNlIE1NX0hPU1RLRVk6Ci0JCQlhbGxvd2VkID0gb3B0aW9ucy5ob3N0YmFzZWRfYXV0aGVudGljYXRpb24gJiYKLQkJCSAgICBob3N0YmFzZWRfa2V5X2FsbG93ZWQoYXV0aGN0eHQtPnB3LAotCQkJICAgIGN1c2VyLCBjaG9zdCwga2V5KTsKLQkJCWF1dGhfbWV0aG9kID0gImhvc3RiYXNlZCI7Ci0JCQlicmVhazsKLQkJY2FzZSBNTV9SU0FIT1NUS0VZOgotCQkJa2V5LT50eXBlID0gS0VZX1JTQTE7IC8qIFhYWCAqLwotCQkJYWxsb3dlZCA9IG9wdGlvbnMucmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbiAmJgotCQkJICAgIGF1dGhfcmhvc3RzX3JzYV9rZXlfYWxsb3dlZChhdXRoY3R4dC0+cHcsCi0JCQkgICAgY3VzZXIsIGNob3N0LCBrZXkpOwotCQkJaWYgKG9wdGlvbnMucmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbiAmJiBhbGxvd2VkICE9IDEpCi0JCQkJYXV0aF9jbGVhcl9vcHRpb25zKCk7Ci0JCQlhdXRoX21ldGhvZCA9ICJyc2EiOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlmYXRhbCgiJXM6IHVua25vd24ga2V5IHR5cGUgJWQiLCBfX2Z1bmNfXywgdHlwZSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoa2V5ICE9IE5VTEwpCi0JCWtleV9mcmVlKGtleSk7Ci0KLQkvKiBjbGVhciB0ZW1wb3JhcmlseSBzdG9yYWdlICh1c2VkIGJ5IHZlcmlmeSkgKi8KLQltb25pdG9yX3Jlc2V0X2tleV9zdGF0ZSgpOwotCi0JaWYgKGFsbG93ZWQpIHsKLQkJLyogU2F2ZSB0ZW1wb3JhcmlseSBmb3IgY29tcGFyaXNvbiBpbiB2ZXJpZnkgKi8KLQkJa2V5X2Jsb2IgPSBibG9iOwotCQlrZXlfYmxvYmxlbiA9IGJsb2JsZW47Ci0JCWtleV9ibG9idHlwZSA9IHR5cGU7Ci0JCWhvc3RiYXNlZF9jdXNlciA9IGN1c2VyOwotCQlob3N0YmFzZWRfY2hvc3QgPSBjaG9zdDsKLQl9IGVsc2UgewotCQkvKiBMb2cgZmFpbGVkIGF0dGVtcHQgKi8KLQkJYXV0aF9sb2coYXV0aGN0eHQsIDAsIGF1dGhfbWV0aG9kLCBjb21wYXQyMCA/ICIgc3NoMiIgOiAiIik7Ci0JCXhmcmVlKGJsb2IpOwotCQl4ZnJlZShjdXNlcik7Ci0JCXhmcmVlKGNob3N0KTsKLQl9Ci0KLQlkZWJ1ZzMoIiVzOiBrZXkgJXAgaXMgJXMiLAotCSAgICBfX2Z1bmNfXywga2V5LCBhbGxvd2VkID8gImFsbG93ZWQiIDogIm5vdCBhbGxvd2VkIik7Ci0KLQlidWZmZXJfY2xlYXIobSk7Ci0JYnVmZmVyX3B1dF9pbnQobSwgYWxsb3dlZCk7Ci0JYnVmZmVyX3B1dF9pbnQobSwgZm9yY2VkX2NvbW1hbmQgIT0gTlVMTCk7Ci0KLQltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfS0VZQUxMT1dFRCwgbSk7Ci0KLQlpZiAodHlwZSA9PSBNTV9SU0FIT1NUS0VZKQotCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX1JTQUNIQUxMRU5HRSwgYWxsb3dlZCk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50Ci1tb25pdG9yX3ZhbGlkX3VzZXJibG9iKHVfY2hhciAqZGF0YSwgdV9pbnQgZGF0YWxlbikKLXsKLQlCdWZmZXIgYjsKLQljaGFyICpwOwotCXVfaW50IGxlbjsKLQlpbnQgZmFpbCA9IDA7Ci0KLQlidWZmZXJfaW5pdCgmYik7Ci0JYnVmZmVyX2FwcGVuZCgmYiwgZGF0YSwgZGF0YWxlbik7Ci0KLQlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfT0xEX1NFU1NJT05JRCkgewotCQlwID0gYnVmZmVyX3B0cigmYik7Ci0JCWxlbiA9IGJ1ZmZlcl9sZW4oJmIpOwotCQlpZiAoKHNlc3Npb25faWQyID09IE5VTEwpIHx8Ci0JCSAgICAobGVuIDwgc2Vzc2lvbl9pZDJfbGVuKSB8fAotCQkgICAgKHRpbWluZ3NhZmVfYmNtcChwLCBzZXNzaW9uX2lkMiwgc2Vzc2lvbl9pZDJfbGVuKSAhPSAwKSkKLQkJCWZhaWwrKzsKLQkJYnVmZmVyX2NvbnN1bWUoJmIsIHNlc3Npb25faWQyX2xlbik7Ci0JfSBlbHNlIHsKLQkJcCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCAmbGVuKTsKLQkJaWYgKChzZXNzaW9uX2lkMiA9PSBOVUxMKSB8fAotCQkgICAgKGxlbiAhPSBzZXNzaW9uX2lkMl9sZW4pIHx8Ci0JCSAgICAodGltaW5nc2FmZV9iY21wKHAsIHNlc3Npb25faWQyLCBzZXNzaW9uX2lkMl9sZW4pICE9IDApKQotCQkJZmFpbCsrOwotCQl4ZnJlZShwKTsKLQl9Ci0JaWYgKGJ1ZmZlcl9nZXRfY2hhcigmYikgIT0gU1NIMl9NU0dfVVNFUkFVVEhfUkVRVUVTVCkKLQkJZmFpbCsrOwotCXAgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7Ci0JaWYgKHN0cmNtcChhdXRoY3R4dC0+dXNlciwgcCkgIT0gMCkgewotCQlsb2dpdCgid3JvbmcgdXNlciBuYW1lIHBhc3NlZCB0byBtb25pdG9yOiBleHBlY3RlZCAlcyAhPSAlLjEwMHMiLAotCQkgICAgYXV0aGN0eHQtPnVzZXIsIHApOwotCQlmYWlsKys7Ci0JfQotCXhmcmVlKHApOwotCWJ1ZmZlcl9za2lwX3N0cmluZygmYik7Ci0JaWYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19QS0FVVEgpIHsKLQkJaWYgKCFidWZmZXJfZ2V0X2NoYXIoJmIpKQotCQkJZmFpbCsrOwotCX0gZWxzZSB7Ci0JCXAgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7Ci0JCWlmIChzdHJjbXAoInB1YmxpY2tleSIsIHApICE9IDApCi0JCQlmYWlsKys7Ci0JCXhmcmVlKHApOwotCQlpZiAoIWJ1ZmZlcl9nZXRfY2hhcigmYikpCi0JCQlmYWlsKys7Ci0JCWJ1ZmZlcl9za2lwX3N0cmluZygmYik7Ci0JfQotCWJ1ZmZlcl9za2lwX3N0cmluZygmYik7Ci0JaWYgKGJ1ZmZlcl9sZW4oJmIpICE9IDApCi0JCWZhaWwrKzsKLQlidWZmZXJfZnJlZSgmYik7Ci0JcmV0dXJuIChmYWlsID09IDApOwotfQotCi1zdGF0aWMgaW50Ci1tb25pdG9yX3ZhbGlkX2hvc3RiYXNlZGJsb2IodV9jaGFyICpkYXRhLCB1X2ludCBkYXRhbGVuLCBjaGFyICpjdXNlciwKLSAgICBjaGFyICpjaG9zdCkKLXsKLQlCdWZmZXIgYjsKLQljaGFyICpwOwotCXVfaW50IGxlbjsKLQlpbnQgZmFpbCA9IDA7Ci0KLQlidWZmZXJfaW5pdCgmYik7Ci0JYnVmZmVyX2FwcGVuZCgmYiwgZGF0YSwgZGF0YWxlbik7Ci0KLQlwID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsICZsZW4pOwotCWlmICgoc2Vzc2lvbl9pZDIgPT0gTlVMTCkgfHwKLQkgICAgKGxlbiAhPSBzZXNzaW9uX2lkMl9sZW4pIHx8Ci0JICAgICh0aW1pbmdzYWZlX2JjbXAocCwgc2Vzc2lvbl9pZDIsIHNlc3Npb25faWQyX2xlbikgIT0gMCkpCi0JCWZhaWwrKzsKLQl4ZnJlZShwKTsKLQotCWlmIChidWZmZXJfZ2V0X2NoYXIoJmIpICE9IFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpCi0JCWZhaWwrKzsKLQlwID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsIE5VTEwpOwotCWlmIChzdHJjbXAoYXV0aGN0eHQtPnVzZXIsIHApICE9IDApIHsKLQkJbG9naXQoIndyb25nIHVzZXIgbmFtZSBwYXNzZWQgdG8gbW9uaXRvcjogZXhwZWN0ZWQgJXMgIT0gJS4xMDBzIiwKLQkJICAgIGF1dGhjdHh0LT51c2VyLCBwKTsKLQkJZmFpbCsrOwotCX0KLQl4ZnJlZShwKTsKLQlidWZmZXJfc2tpcF9zdHJpbmcoJmIpOwkvKiBzZXJ2aWNlICovCi0JcCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCBOVUxMKTsKLQlpZiAoc3RyY21wKHAsICJob3N0YmFzZWQiKSAhPSAwKQotCQlmYWlsKys7Ci0JeGZyZWUocCk7Ci0JYnVmZmVyX3NraXBfc3RyaW5nKCZiKTsJLyogcGthbGcgKi8KLQlidWZmZXJfc2tpcF9zdHJpbmcoJmIpOwkvKiBwa2Jsb2IgKi8KLQotCS8qIHZlcmlmeSBjbGllbnQgaG9zdCwgc3RyaXAgdHJhaWxpbmcgZG90IGlmIG5lY2Vzc2FyeSAqLwotCXAgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7Ci0JaWYgKCgobGVuID0gc3RybGVuKHApKSA+IDApICYmIHBbbGVuIC0gMV0gPT0gJy4nKQotCQlwW2xlbiAtIDFdID0gJ1wwJzsKLQlpZiAoc3RyY21wKHAsIGNob3N0KSAhPSAwKQotCQlmYWlsKys7Ci0JeGZyZWUocCk7Ci0KLQkvKiB2ZXJpZnkgY2xpZW50IHVzZXIgKi8KLQlwID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsIE5VTEwpOwotCWlmIChzdHJjbXAocCwgY3VzZXIpICE9IDApCi0JCWZhaWwrKzsKLQl4ZnJlZShwKTsKLQotCWlmIChidWZmZXJfbGVuKCZiKSAhPSAwKQotCQlmYWlsKys7Ci0JYnVmZmVyX2ZyZWUoJmIpOwotCXJldHVybiAoZmFpbCA9PSAwKTsKLX0KLQotaW50Ci1tbV9hbnN3ZXJfa2V5dmVyaWZ5KGludCBzb2NrLCBCdWZmZXIgKm0pCi17Ci0JS2V5ICprZXk7Ci0JdV9jaGFyICpzaWduYXR1cmUsICpkYXRhLCAqYmxvYjsKLQl1X2ludCBzaWduYXR1cmVsZW4sIGRhdGFsZW4sIGJsb2JsZW47Ci0JaW50IHZlcmlmaWVkID0gMDsKLQlpbnQgdmFsaWRfZGF0YSA9IDA7Ci0KLQlibG9iID0gYnVmZmVyX2dldF9zdHJpbmcobSwgJmJsb2JsZW4pOwotCXNpZ25hdHVyZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sICZzaWduYXR1cmVsZW4pOwotCWRhdGEgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmZGF0YWxlbik7Ci0KLQlpZiAoaG9zdGJhc2VkX2N1c2VyID09IE5VTEwgfHwgaG9zdGJhc2VkX2Nob3N0ID09IE5VTEwgfHwKLQkgICFtb25pdG9yX2FsbG93ZWRfa2V5KGJsb2IsIGJsb2JsZW4pKQotCQlmYXRhbCgiJXM6IGJhZCBrZXksIG5vdCBwcmV2aW91c2x5IGFsbG93ZWQiLCBfX2Z1bmNfXyk7Ci0KLQlrZXkgPSBrZXlfZnJvbV9ibG9iKGJsb2IsIGJsb2JsZW4pOwotCWlmIChrZXkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBiYWQgcHVibGljIGtleSBibG9iIiwgX19mdW5jX18pOwotCi0Jc3dpdGNoIChrZXlfYmxvYnR5cGUpIHsKLQljYXNlIE1NX1VTRVJLRVk6Ci0JCXZhbGlkX2RhdGEgPSBtb25pdG9yX3ZhbGlkX3VzZXJibG9iKGRhdGEsIGRhdGFsZW4pOwotCQlicmVhazsKLQljYXNlIE1NX0hPU1RLRVk6Ci0JCXZhbGlkX2RhdGEgPSBtb25pdG9yX3ZhbGlkX2hvc3RiYXNlZGJsb2IoZGF0YSwgZGF0YWxlbiwKLQkJICAgIGhvc3RiYXNlZF9jdXNlciwgaG9zdGJhc2VkX2Nob3N0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdmFsaWRfZGF0YSA9IDA7Ci0JCWJyZWFrOwotCX0KLQlpZiAoIXZhbGlkX2RhdGEpCi0JCWZhdGFsKCIlczogYmFkIHNpZ25hdHVyZSBkYXRhIGJsb2IiLCBfX2Z1bmNfXyk7Ci0KLQl2ZXJpZmllZCA9IGtleV92ZXJpZnkoa2V5LCBzaWduYXR1cmUsIHNpZ25hdHVyZWxlbiwgZGF0YSwgZGF0YWxlbik7Ci0JZGVidWczKCIlczoga2V5ICVwIHNpZ25hdHVyZSAlcyIsCi0JICAgIF9fZnVuY19fLCBrZXksICh2ZXJpZmllZCA9PSAxKSA/ICJ2ZXJpZmllZCIgOiAidW52ZXJpZmllZCIpOwotCi0Ja2V5X2ZyZWUoa2V5KTsKLQl4ZnJlZShibG9iKTsKLQl4ZnJlZShzaWduYXR1cmUpOwotCXhmcmVlKGRhdGEpOwotCi0JYXV0aF9tZXRob2QgPSBrZXlfYmxvYnR5cGUgPT0gTU1fVVNFUktFWSA/ICJwdWJsaWNrZXkiIDogImhvc3RiYXNlZCI7Ci0KLQltb25pdG9yX3Jlc2V0X2tleV9zdGF0ZSgpOwotCi0JYnVmZmVyX2NsZWFyKG0pOwotCWJ1ZmZlcl9wdXRfaW50KG0sIHZlcmlmaWVkKTsKLQltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfS0VZVkVSSUZZLCBtKTsKLQotCXJldHVybiAodmVyaWZpZWQgPT0gMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tbV9yZWNvcmRfbG9naW4oU2Vzc2lvbiAqcywgc3RydWN0IHBhc3N3ZCAqcHcpCi17Ci0Jc29ja2xlbl90IGZyb21sZW47Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZnJvbTsKLQotCS8qCi0JICogR2V0IElQIGFkZHJlc3Mgb2YgY2xpZW50LiBJZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgYSBzb2NrZXQsIGxldAotCSAqIHRoZSBhZGRyZXNzIGJlIDAuMC4wLjAuCi0JICovCi0JbWVtc2V0KCZmcm9tLCAwLCBzaXplb2YoZnJvbSkpOwotCWZyb21sZW4gPSBzaXplb2YoZnJvbSk7Ci0JaWYgKHBhY2tldF9jb25uZWN0aW9uX2lzX29uX3NvY2tldCgpKSB7Ci0JCWlmIChnZXRwZWVybmFtZShwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSwKLQkJICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbSwgJmZyb21sZW4pIDwgMCkgewotCQkJZGVidWcoImdldHBlZXJuYW1lOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJY2xlYW51cF9leGl0KDI1NSk7Ci0JCX0KLQl9Ci0JLyogUmVjb3JkIHRoYXQgdGhlcmUgd2FzIGEgbG9naW4gb24gdGhhdCB0dHkgZnJvbSB0aGUgcmVtb3RlIGhvc3QuICovCi0JcmVjb3JkX2xvZ2luKHMtPnBpZCwgcy0+dHR5LCBwdy0+cHdfbmFtZSwgcHctPnB3X3VpZCwKLQkgICAgZ2V0X3JlbW90ZV9uYW1lX29yX2lwKHV0bXBfbGVuLCBvcHRpb25zLnVzZV9kbnMpLAotCSAgICAoc3RydWN0IHNvY2thZGRyICopJmZyb20sIGZyb21sZW4pOwotfQotCi1zdGF0aWMgdm9pZAotbW1fc2Vzc2lvbl9jbG9zZShTZXNzaW9uICpzKQotewotCWRlYnVnMygiJXM6IHNlc3Npb24gJWQgcGlkICVsZCIsIF9fZnVuY19fLCBzLT5zZWxmLCAobG9uZylzLT5waWQpOwotCWlmIChzLT50dHlmZCAhPSAtMSkgewotCQlkZWJ1ZzMoIiVzOiB0dHkgJXMgcHR5ZmQgJWQiLCBfX2Z1bmNfXywgcy0+dHR5LCBzLT5wdHlmZCk7Ci0JCXNlc3Npb25fcHR5X2NsZWFudXAyKHMpOwotCX0KLQlzZXNzaW9uX3VudXNlZChzLT5zZWxmKTsKLX0KLQotaW50Ci1tbV9hbnN3ZXJfcHR5KGludCBzb2NrLCBCdWZmZXIgKm0pCi17Ci0JZXh0ZXJuIHN0cnVjdCBtb25pdG9yICpwbW9uaXRvcjsKLQlTZXNzaW9uICpzOwotCWludCByZXMsIGZkMDsKLQotCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQlidWZmZXJfY2xlYXIobSk7Ci0JcyA9IHNlc3Npb25fbmV3KCk7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKLQlzLT5hdXRoY3R4dCA9IGF1dGhjdHh0OwotCXMtPnB3ID0gYXV0aGN0eHQtPnB3OwotCXMtPnBpZCA9IHBtb25pdG9yLT5tX3BpZDsKLQlyZXMgPSBwdHlfYWxsb2NhdGUoJnMtPnB0eWZkLCAmcy0+dHR5ZmQsIHMtPnR0eSwgc2l6ZW9mKHMtPnR0eSkpOwotCWlmIChyZXMgPT0gMCkKLQkJZ290byBlcnJvcjsKLQlwdHlfc2V0b3duZXIoYXV0aGN0eHQtPnB3LCBzLT50dHkpOwotCi0JYnVmZmVyX3B1dF9pbnQobSwgMSk7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKG0sIHMtPnR0eSk7Ci0KLQkvKiBXZSBuZWVkIHRvIHRyaWNrIHR0eXNsb3QgKi8KLQlpZiAoZHVwMihzLT50dHlmZCwgMCkgPT0gLTEpCi0JCWZhdGFsKCIlczogZHVwMiIsIF9fZnVuY19fKTsKLQotCW1tX3JlY29yZF9sb2dpbihzLCBhdXRoY3R4dC0+cHcpOwotCi0JLyogTm93IHdlIGNhbiBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGFnYWluICovCi0JY2xvc2UoMCk7Ci0KLQkvKiBzZW5kIG1lc3NhZ2VzIGdlbmVyYXRlZCBieSByZWNvcmRfbG9naW4gKi8KLQlidWZmZXJfcHV0X3N0cmluZyhtLCBidWZmZXJfcHRyKCZsb2dpbm1zZyksIGJ1ZmZlcl9sZW4oJmxvZ2lubXNnKSk7Ci0JYnVmZmVyX2NsZWFyKCZsb2dpbm1zZyk7Ci0KLQltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfUFRZLCBtKTsKLQotCWlmIChtbV9zZW5kX2ZkKHNvY2ssIHMtPnB0eWZkKSA9PSAtMSB8fAotCSAgICBtbV9zZW5kX2ZkKHNvY2ssIHMtPnR0eWZkKSA9PSAtMSkKLQkJZmF0YWwoIiVzOiBzZW5kIGZkcyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0KLQkvKiBtYWtlIHN1cmUgbm90aGluZyB1c2VzIGZkIDAgKi8KLQlpZiAoKGZkMCA9IG9wZW4oX1BBVEhfREVWTlVMTCwgT19SRE9OTFkpKSA8IDApCi0JCWZhdGFsKCIlczogb3BlbigvZGV2L251bGwpOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCWlmIChmZDAgIT0gMCkKLQkJZXJyb3IoIiVzOiBmZDAgJWQgIT0gMCIsIF9fZnVuY19fLCBmZDApOwotCi0JLyogc2xhdmUgaXMgbm90IG5lZWRlZCAqLwotCWNsb3NlKHMtPnR0eWZkKTsKLQlzLT50dHlmZCA9IHMtPnB0eWZkOwotCS8qIG5vIG5lZWQgdG8gZHVwKCkgYmVjYXVzZSBub2JvZHkgY2xvc2VzIHB0eWZkICovCi0Jcy0+cHR5bWFzdGVyID0gcy0+cHR5ZmQ7Ci0KLQlkZWJ1ZzMoIiVzOiB0dHkgJXMgcHR5ZmQgJWQiLCBfX2Z1bmNfXywgcy0+dHR5LCBzLT50dHlmZCk7Ci0KLQlyZXR1cm4gKDApOwotCi0gZXJyb3I6Ci0JaWYgKHMgIT0gTlVMTCkKLQkJbW1fc2Vzc2lvbl9jbG9zZShzKTsKLQlidWZmZXJfcHV0X2ludChtLCAwKTsKLQltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfUFRZLCBtKTsKLQlyZXR1cm4gKDApOwotfQotCi1pbnQKLW1tX2Fuc3dlcl9wdHlfY2xlYW51cChpbnQgc29jaywgQnVmZmVyICptKQotewotCVNlc3Npb24gKnM7Ci0JY2hhciAqdHR5OwotCi0JZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQotCXR0eSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sIE5VTEwpOwotCWlmICgocyA9IHNlc3Npb25fYnlfdHR5KHR0eSkpICE9IE5VTEwpCi0JCW1tX3Nlc3Npb25fY2xvc2Uocyk7Ci0JYnVmZmVyX2NsZWFyKG0pOwotCXhmcmVlKHR0eSk7Ci0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci1tbV9hbnN3ZXJfc2Vzc2tleShpbnQgc29jaywgQnVmZmVyICptKQotewotCUJJR05VTSAqcDsKLQlpbnQgcnNhZmFpbDsKLQotCS8qIFR1cm4gb2ZmIHBlcm1pc3Npb25zICovCi0JbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9TRVNTS0VZLCAwKTsKLQotCWlmICgocCA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEJOX25ldyIsIF9fZnVuY19fKTsKLQotCWJ1ZmZlcl9nZXRfYmlnbnVtMihtLCBwKTsKLQotCXJzYWZhaWwgPSBzc2gxX3Nlc3Npb25fa2V5KHApOwotCi0JYnVmZmVyX2NsZWFyKG0pOwotCWJ1ZmZlcl9wdXRfaW50KG0sIHJzYWZhaWwpOwotCWJ1ZmZlcl9wdXRfYmlnbnVtMihtLCBwKTsKLQotCUJOX2NsZWFyX2ZyZWUocCk7Ci0KLQltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfU0VTU0tFWSwgbSk7Ci0KLQkvKiBUdXJuIG9uIHBlcm1pc3Npb25zIGZvciBzZXNzaWQgcGFzc2luZyAqLwotCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfU0VTU0lELCAxKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLWludAotbW1fYW5zd2VyX3Nlc3NpZChpbnQgc29jaywgQnVmZmVyICptKQotewotCWludCBpOwotCi0JZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQotCWlmIChidWZmZXJfbGVuKG0pICE9IDE2KQotCQlmYXRhbCgiJXM6IGJhZCBzc2gxIHNlc3Npb24gaWQiLCBfX2Z1bmNfXyk7Ci0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCXNlc3Npb25faWRbaV0gPSBidWZmZXJfZ2V0X2NoYXIobSk7Ci0KLQkvKiBUdXJuIG9uIHBlcm1pc3Npb25zIGZvciBnZXRwd25hbSAqLwotCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfUFdOQU0sIDEpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci1tbV9hbnN3ZXJfcnNhX2tleWFsbG93ZWQoaW50IHNvY2ssIEJ1ZmZlciAqbSkKLXsKLQlCSUdOVU0gKmNsaWVudF9uOwotCUtleSAqa2V5ID0gTlVMTDsKLQl1X2NoYXIgKmJsb2IgPSBOVUxMOwotCXVfaW50IGJsZW4gPSAwOwotCWludCBhbGxvd2VkID0gMDsKLQotCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQlhdXRoX21ldGhvZCA9ICJyc2EiOwotCWlmIChvcHRpb25zLnJzYV9hdXRoZW50aWNhdGlvbiAmJiBhdXRoY3R4dC0+dmFsaWQpIHsKLQkJaWYgKChjbGllbnRfbiA9IEJOX25ldygpKSA9PSBOVUxMKQotCQkJZmF0YWwoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7Ci0JCWJ1ZmZlcl9nZXRfYmlnbnVtMihtLCBjbGllbnRfbik7Ci0JCWFsbG93ZWQgPSBhdXRoX3JzYV9rZXlfYWxsb3dlZChhdXRoY3R4dC0+cHcsIGNsaWVudF9uLCAma2V5KTsKLQkJQk5fY2xlYXJfZnJlZShjbGllbnRfbik7Ci0JfQotCWJ1ZmZlcl9jbGVhcihtKTsKLQlidWZmZXJfcHV0X2ludChtLCBhbGxvd2VkKTsKLQlidWZmZXJfcHV0X2ludChtLCBmb3JjZWRfY29tbWFuZCAhPSBOVUxMKTsKLQotCS8qIGNsZWFyIHRlbXBvcmFyaWx5IHN0b3JhZ2UgKHVzZWQgYnkgZ2VuZXJhdGUgY2hhbGxlbmdlKSAqLwotCW1vbml0b3JfcmVzZXRfa2V5X3N0YXRlKCk7Ci0KLQlpZiAoYWxsb3dlZCAmJiBrZXkgIT0gTlVMTCkgewotCQlrZXktPnR5cGUgPSBLRVlfUlNBOwkvKiBjaGVhdCBmb3Iga2V5X3RvX2Jsb2IgKi8KLQkJaWYgKGtleV90b19ibG9iKGtleSwgJmJsb2IsICZibGVuKSA9PSAwKQotCQkJZmF0YWwoIiVzOiBrZXlfdG9fYmxvYiBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCWJ1ZmZlcl9wdXRfc3RyaW5nKG0sIGJsb2IsIGJsZW4pOwotCi0JCS8qIFNhdmUgdGVtcG9yYXJpbHkgZm9yIGNvbXBhcmlzb24gaW4gdmVyaWZ5ICovCi0JCWtleV9ibG9iID0gYmxvYjsKLQkJa2V5X2Jsb2JsZW4gPSBibGVuOwotCQlrZXlfYmxvYnR5cGUgPSBNTV9SU0FVU0VSS0VZOwotCX0KLQlpZiAoa2V5ICE9IE5VTEwpCi0JCWtleV9mcmVlKGtleSk7Ci0KLQltbV9yZXF1ZXN0X3NlbmQoc29jaywgTU9OSVRPUl9BTlNfUlNBS0VZQUxMT1dFRCwgbSk7Ci0KLQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX1JTQUNIQUxMRU5HRSwgYWxsb3dlZCk7Ci0JbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9SU0FSRVNQT05TRSwgMCk7Ci0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci1tbV9hbnN3ZXJfcnNhX2NoYWxsZW5nZShpbnQgc29jaywgQnVmZmVyICptKQotewotCUtleSAqa2V5ID0gTlVMTDsKLQl1X2NoYXIgKmJsb2I7Ci0JdV9pbnQgYmxlbjsKLQotCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIWF1dGhjdHh0LT52YWxpZCkKLQkJZmF0YWwoIiVzOiBhdXRoY3R4dCBub3QgdmFsaWQiLCBfX2Z1bmNfXyk7Ci0JYmxvYiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sICZibGVuKTsKLQlpZiAoIW1vbml0b3JfYWxsb3dlZF9rZXkoYmxvYiwgYmxlbikpCi0JCWZhdGFsKCIlczogYmFkIGtleSwgbm90IHByZXZpb3VzbHkgYWxsb3dlZCIsIF9fZnVuY19fKTsKLQlpZiAoa2V5X2Jsb2J0eXBlICE9IE1NX1JTQVVTRVJLRVkgJiYga2V5X2Jsb2J0eXBlICE9IE1NX1JTQUhPU1RLRVkpCi0JCWZhdGFsKCIlczoga2V5IHR5cGUgbWlzbWF0Y2giLCBfX2Z1bmNfXyk7Ci0JaWYgKChrZXkgPSBrZXlfZnJvbV9ibG9iKGJsb2IsIGJsZW4pKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IHJlY2VpdmVkIGJhZCBrZXkiLCBfX2Z1bmNfXyk7Ci0JaWYgKGtleS0+dHlwZSAhPSBLRVlfUlNBKQotCQlmYXRhbCgiJXM6IHJlY2VpdmVkIGJhZCBrZXkgdHlwZSAlZCIsIF9fZnVuY19fLCBrZXktPnR5cGUpOwotCWtleS0+dHlwZSA9IEtFWV9SU0ExOwotCWlmIChzc2gxX2NoYWxsZW5nZSkKLQkJQk5fY2xlYXJfZnJlZShzc2gxX2NoYWxsZW5nZSk7Ci0Jc3NoMV9jaGFsbGVuZ2UgPSBhdXRoX3JzYV9nZW5lcmF0ZV9jaGFsbGVuZ2Uoa2V5KTsKLQotCWJ1ZmZlcl9jbGVhcihtKTsKLQlidWZmZXJfcHV0X2JpZ251bTIobSwgc3NoMV9jaGFsbGVuZ2UpOwotCi0JZGVidWczKCIlcyBzZW5kaW5nIHJlcGx5IiwgX19mdW5jX18pOwotCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19SU0FDSEFMTEVOR0UsIG0pOwotCi0JbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9SU0FSRVNQT05TRSwgMSk7Ci0KLQl4ZnJlZShibG9iKTsKLQlrZXlfZnJlZShrZXkpOwotCXJldHVybiAoMCk7Ci19Ci0KLWludAotbW1fYW5zd2VyX3JzYV9yZXNwb25zZShpbnQgc29jaywgQnVmZmVyICptKQotewotCUtleSAqa2V5ID0gTlVMTDsKLQl1X2NoYXIgKmJsb2IsICpyZXNwb25zZTsKLQl1X2ludCBibGVuLCBsZW47Ci0JaW50IHN1Y2Nlc3M7Ci0KLQlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOwotCi0JaWYgKCFhdXRoY3R4dC0+dmFsaWQpCi0JCWZhdGFsKCIlczogYXV0aGN0eHQgbm90IHZhbGlkIiwgX19mdW5jX18pOwotCWlmIChzc2gxX2NoYWxsZW5nZSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IG5vIHNzaDFfY2hhbGxlbmdlIiwgX19mdW5jX18pOwotCi0JYmxvYiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sICZibGVuKTsKLQlpZiAoIW1vbml0b3JfYWxsb3dlZF9rZXkoYmxvYiwgYmxlbikpCi0JCWZhdGFsKCIlczogYmFkIGtleSwgbm90IHByZXZpb3VzbHkgYWxsb3dlZCIsIF9fZnVuY19fKTsKLQlpZiAoa2V5X2Jsb2J0eXBlICE9IE1NX1JTQVVTRVJLRVkgJiYga2V5X2Jsb2J0eXBlICE9IE1NX1JTQUhPU1RLRVkpCi0JCWZhdGFsKCIlczoga2V5IHR5cGUgbWlzbWF0Y2g6ICVkIiwgX19mdW5jX18sIGtleV9ibG9idHlwZSk7Ci0JaWYgKChrZXkgPSBrZXlfZnJvbV9ibG9iKGJsb2IsIGJsZW4pKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IHJlY2VpdmVkIGJhZCBrZXkiLCBfX2Z1bmNfXyk7Ci0JcmVzcG9uc2UgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmbGVuKTsKLQlpZiAobGVuICE9IDE2KQotCQlmYXRhbCgiJXM6IHJlY2VpdmVkIGJhZCByZXNwb25zZSB0byBjaGFsbGVuZ2UiLCBfX2Z1bmNfXyk7Ci0Jc3VjY2VzcyA9IGF1dGhfcnNhX3ZlcmlmeV9yZXNwb25zZShrZXksIHNzaDFfY2hhbGxlbmdlLCByZXNwb25zZSk7Ci0KLQl4ZnJlZShibG9iKTsKLQlrZXlfZnJlZShrZXkpOwotCXhmcmVlKHJlc3BvbnNlKTsKLQotCWF1dGhfbWV0aG9kID0ga2V5X2Jsb2J0eXBlID09IE1NX1JTQVVTRVJLRVkgPyAicnNhIiA6ICJyaG9zdHMtcnNhIjsKLQotCS8qIHJlc2V0IHN0YXRlICovCi0JQk5fY2xlYXJfZnJlZShzc2gxX2NoYWxsZW5nZSk7Ci0Jc3NoMV9jaGFsbGVuZ2UgPSBOVUxMOwotCW1vbml0b3JfcmVzZXRfa2V5X3N0YXRlKCk7Ci0KLQlidWZmZXJfY2xlYXIobSk7Ci0JYnVmZmVyX3B1dF9pbnQobSwgc3VjY2Vzcyk7Ci0JbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX1JTQVJFU1BPTlNFLCBtKTsKLQotCXJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLWludAotbW1fYW5zd2VyX3Rlcm0oaW50IHNvY2ssIEJ1ZmZlciAqcmVxKQotewotCWV4dGVybiBzdHJ1Y3QgbW9uaXRvciAqcG1vbml0b3I7Ci0JaW50IHJlcywgc3RhdHVzOwotCi0JZGVidWczKCIlczogdGVhcmluZyBkb3duIHNlc3Npb25zIiwgX19mdW5jX18pOwotCi0JLyogVGhlIGNoaWxkIGlzIHRlcm1pbmF0aW5nICovCi0Jc2Vzc2lvbl9kZXN0cm95X2FsbCgmbW1fc2Vzc2lvbl9jbG9zZSk7Ci0KLSNpZmRlZiBVU0VfUEFNCi0JaWYgKG9wdGlvbnMudXNlX3BhbSkKLQkJc3NocGFtX2NsZWFudXAoKTsKLSNlbmRpZgotCi0Jd2hpbGUgKHdhaXRwaWQocG1vbml0b3ItPm1fcGlkLCAmc3RhdHVzLCAwKSA9PSAtMSkKLQkJaWYgKGVycm5vICE9IEVJTlRSKQotCQkJZXhpdCgxKTsKLQotCXJlcyA9IFdJRkVYSVRFRChzdGF0dXMpID8gV0VYSVRTVEFUVVMoc3RhdHVzKSA6IDE7Ci0KLQkvKiBUZXJtaW5hdGUgcHJvY2VzcyAqLwotCWV4aXQocmVzKTsKLX0KLQotI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKLS8qIFJlcG9ydCB0aGF0IGFuIGF1ZGl0IGV2ZW50IG9jY3VycmVkICovCi1pbnQKLW1tX2Fuc3dlcl9hdWRpdF9ldmVudChpbnQgc29ja2V0LCBCdWZmZXIgKm0pCi17Ci0Jc3NoX2F1ZGl0X2V2ZW50X3QgZXZlbnQ7Ci0KLQlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOwotCi0JZXZlbnQgPSBidWZmZXJfZ2V0X2ludChtKTsKLQlzd2l0Y2goZXZlbnQpIHsKLQljYXNlIFNTSF9BVVRIX0ZBSUxfUFVCS0VZOgotCWNhc2UgU1NIX0FVVEhfRkFJTF9IT1NUQkFTRUQ6Ci0JY2FzZSBTU0hfQVVUSF9GQUlMX0dTU0FQSToKLQljYXNlIFNTSF9MT0dJTl9FWENFRURfTUFYVFJJRVM6Ci0JY2FzZSBTU0hfTE9HSU5fUk9PVF9ERU5JRUQ6Ci0JY2FzZSBTU0hfQ09OTkVDVElPTl9DTE9TRToKLQljYXNlIFNTSF9JTlZBTElEX1VTRVI6Ci0JCWF1ZGl0X2V2ZW50KGV2ZW50KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmF0YWwoIkF1ZGl0IGV2ZW50IHR5cGUgJWQgbm90IHBlcm1pdHRlZCIsIGV2ZW50KTsKLQl9Ci0KLQlyZXR1cm4gKDApOwotfQotCi1pbnQKLW1tX2Fuc3dlcl9hdWRpdF9jb21tYW5kKGludCBzb2NrZXQsIEJ1ZmZlciAqbSkKLXsKLQl1X2ludCBsZW47Ci0JY2hhciAqY21kOwotCi0JZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQljbWQgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmbGVuKTsKLQkvKiBzYW5pdHkgY2hlY2sgY29tbWFuZCwgaWYgc28gaG93PyAqLwotCWF1ZGl0X3J1bl9jb21tYW5kKGNtZCk7Ci0JeGZyZWUoY21kKTsKLQlyZXR1cm4gKDApOwotfQotI2VuZGlmIC8qIFNTSF9BVURJVF9FVkVOVFMgKi8KLQotdm9pZAotbW9uaXRvcl9hcHBseV9rZXlzdGF0ZShzdHJ1Y3QgbW9uaXRvciAqcG1vbml0b3IpCi17Ci0JaWYgKGNvbXBhdDIwKSB7Ci0JCXNldF9uZXdrZXlzKE1PREVfSU4pOwotCQlzZXRfbmV3a2V5cyhNT0RFX09VVCk7Ci0JfSBlbHNlIHsKLQkJcGFja2V0X3NldF9wcm90b2NvbF9mbGFncyhjaGlsZF9zdGF0ZS5zc2gxcHJvdG9mbGFncyk7Ci0JCXBhY2tldF9zZXRfZW5jcnlwdGlvbl9rZXkoY2hpbGRfc3RhdGUuc3NoMWtleSwKLQkJICAgIGNoaWxkX3N0YXRlLnNzaDFrZXlsZW4sIGNoaWxkX3N0YXRlLnNzaDFjaXBoZXIpOwotCQl4ZnJlZShjaGlsZF9zdGF0ZS5zc2gxa2V5KTsKLQl9Ci0KLQkvKiBmb3IgcmM0IGFuZCBvdGhlciBzdGF0ZWZ1bCBjaXBoZXJzICovCi0JcGFja2V0X3NldF9rZXljb250ZXh0KE1PREVfT1VULCBjaGlsZF9zdGF0ZS5rZXlvdXQpOwotCXhmcmVlKGNoaWxkX3N0YXRlLmtleW91dCk7Ci0JcGFja2V0X3NldF9rZXljb250ZXh0KE1PREVfSU4sIGNoaWxkX3N0YXRlLmtleWluKTsKLQl4ZnJlZShjaGlsZF9zdGF0ZS5rZXlpbik7Ci0KLQlpZiAoIWNvbXBhdDIwKSB7Ci0JCXBhY2tldF9zZXRfaXYoTU9ERV9PVVQsIGNoaWxkX3N0YXRlLml2b3V0KTsKLQkJeGZyZWUoY2hpbGRfc3RhdGUuaXZvdXQpOwotCQlwYWNrZXRfc2V0X2l2KE1PREVfSU4sIGNoaWxkX3N0YXRlLml2aW4pOwotCQl4ZnJlZShjaGlsZF9zdGF0ZS5pdmluKTsKLQl9Ci0KLQltZW1jcHkoJmluY29taW5nX3N0cmVhbSwgJmNoaWxkX3N0YXRlLmluY29taW5nLAotCSAgICBzaXplb2YoaW5jb21pbmdfc3RyZWFtKSk7Ci0JbWVtY3B5KCZvdXRnb2luZ19zdHJlYW0sICZjaGlsZF9zdGF0ZS5vdXRnb2luZywKLQkgICAgc2l6ZW9mKG91dGdvaW5nX3N0cmVhbSkpOwotCi0JLyogVXBkYXRlIHdpdGggbmV3IGFkZHJlc3MgKi8KLQlpZiAob3B0aW9ucy5jb21wcmVzc2lvbikKLQkJbW1faW5pdF9jb21wcmVzc2lvbihwbW9uaXRvci0+bV96bGliKTsKLQotCS8qIE5ldHdvcmsgSS9PIGJ1ZmZlcnMgKi8KLQkvKiBYWFggaW5lZmZpY2llbnQgZm9yIGxhcmdlIGJ1ZmZlcnMsIG5lZWQ6IGJ1ZmZlcl9pbml0X2Zyb21fc3RyaW5nICovCi0JYnVmZmVyX2NsZWFyKHBhY2tldF9nZXRfaW5wdXQoKSk7Ci0JYnVmZmVyX2FwcGVuZChwYWNrZXRfZ2V0X2lucHV0KCksIGNoaWxkX3N0YXRlLmlucHV0LCBjaGlsZF9zdGF0ZS5pbGVuKTsKLQltZW1zZXQoY2hpbGRfc3RhdGUuaW5wdXQsIDAsIGNoaWxkX3N0YXRlLmlsZW4pOwotCXhmcmVlKGNoaWxkX3N0YXRlLmlucHV0KTsKLQotCWJ1ZmZlcl9jbGVhcihwYWNrZXRfZ2V0X291dHB1dCgpKTsKLQlidWZmZXJfYXBwZW5kKHBhY2tldF9nZXRfb3V0cHV0KCksIGNoaWxkX3N0YXRlLm91dHB1dCwKLQkJICAgICAgY2hpbGRfc3RhdGUub2xlbik7Ci0JbWVtc2V0KGNoaWxkX3N0YXRlLm91dHB1dCwgMCwgY2hpbGRfc3RhdGUub2xlbik7Ci0JeGZyZWUoY2hpbGRfc3RhdGUub3V0cHV0KTsKLQotCS8qIFJvYW1pbmcgKi8KLQlpZiAoY29tcGF0MjApCi0JCXJvYW1fc2V0X2J5dGVzKGNoaWxkX3N0YXRlLnNlbnRfYnl0ZXMsIGNoaWxkX3N0YXRlLnJlY3ZfYnl0ZXMpOwotfQotCi1zdGF0aWMgS2V4ICoKLW1tX2dldF9rZXgoQnVmZmVyICptKQotewotCUtleCAqa2V4OwotCXZvaWQgKmJsb2I7Ci0JdV9pbnQgYmxvYmxlbjsKLQotCWtleCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCprZXgpKTsKLQlrZXgtPnNlc3Npb25faWQgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAma2V4LT5zZXNzaW9uX2lkX2xlbik7Ci0JaWYgKHNlc3Npb25faWQyID09IE5VTEwgfHwKLQkgICAga2V4LT5zZXNzaW9uX2lkX2xlbiAhPSBzZXNzaW9uX2lkMl9sZW4gfHwKLQkgICAgdGltaW5nc2FmZV9iY21wKGtleC0+c2Vzc2lvbl9pZCwgc2Vzc2lvbl9pZDIsIHNlc3Npb25faWQyX2xlbikgIT0gMCkKLQkJZmF0YWwoIm1tX2dldF9nZXQ6IGludGVybmFsIGVycm9yOiBiYWQgc2Vzc2lvbiBpZCIpOwotCWtleC0+d2VfbmVlZCA9IGJ1ZmZlcl9nZXRfaW50KG0pOwotCWtleC0+a2V4W0tFWF9ESF9HUlAxX1NIQTFdID0ga2V4ZGhfc2VydmVyOwotCWtleC0+a2V4W0tFWF9ESF9HUlAxNF9TSEExXSA9IGtleGRoX3NlcnZlcjsKLQlrZXgtPmtleFtLRVhfREhfR0VYX1NIQTFdID0ga2V4Z2V4X3NlcnZlcjsKLQlrZXgtPmtleFtLRVhfREhfR0VYX1NIQTI1Nl0gPSBrZXhnZXhfc2VydmVyOwotCWtleC0+a2V4W0tFWF9FQ0RIX1NIQTJdID0ga2V4ZWNkaF9zZXJ2ZXI7Ci0Ja2V4LT5zZXJ2ZXIgPSAxOwotCWtleC0+aG9zdGtleV90eXBlID0gYnVmZmVyX2dldF9pbnQobSk7Ci0Ja2V4LT5rZXhfdHlwZSA9IGJ1ZmZlcl9nZXRfaW50KG0pOwotCWJsb2IgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmYmxvYmxlbik7Ci0JYnVmZmVyX2luaXQoJmtleC0+bXkpOwotCWJ1ZmZlcl9hcHBlbmQoJmtleC0+bXksIGJsb2IsIGJsb2JsZW4pOwotCXhmcmVlKGJsb2IpOwotCWJsb2IgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmYmxvYmxlbik7Ci0JYnVmZmVyX2luaXQoJmtleC0+cGVlcik7Ci0JYnVmZmVyX2FwcGVuZCgma2V4LT5wZWVyLCBibG9iLCBibG9ibGVuKTsKLQl4ZnJlZShibG9iKTsKLQlrZXgtPmRvbmUgPSAxOwotCWtleC0+ZmxhZ3MgPSBidWZmZXJfZ2V0X2ludChtKTsKLQlrZXgtPmNsaWVudF92ZXJzaW9uX3N0cmluZyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sIE5VTEwpOwotCWtleC0+c2VydmVyX3ZlcnNpb25fc3RyaW5nID0gYnVmZmVyX2dldF9zdHJpbmcobSwgTlVMTCk7Ci0Ja2V4LT5sb2FkX2hvc3RfcHVibGljX2tleT0mZ2V0X2hvc3RrZXlfcHVibGljX2J5X3R5cGU7Ci0Ja2V4LT5sb2FkX2hvc3RfcHJpdmF0ZV9rZXk9JmdldF9ob3N0a2V5X3ByaXZhdGVfYnlfdHlwZTsKLQlrZXgtPmhvc3Rfa2V5X2luZGV4PSZnZXRfaG9zdGtleV9pbmRleDsKLQotCXJldHVybiAoa2V4KTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZXF1cmllcyBjYXJlZnVsIHNhbml0eSBjaGVja2luZyAqLwotCi12b2lkCi1tbV9nZXRfa2V5c3RhdGUoc3RydWN0IG1vbml0b3IgKnBtb25pdG9yKQotewotCUJ1ZmZlciBtOwotCXVfY2hhciAqYmxvYiwgKnA7Ci0JdV9pbnQgYmxvYmxlbiwgcGxlbjsKLQl1X2ludDMyX3Qgc2VxbnIsIHBhY2tldHM7Ci0JdV9pbnQ2NF90IGJsb2NrcywgYnl0ZXM7Ci0KLQlkZWJ1ZzMoIiVzOiBXYWl0aW5nIGZvciBuZXcga2V5cyIsIF9fZnVuY19fKTsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3NlbmRmZCwgTU9OSVRPUl9SRVFfS0VZRVhQT1JULCAmbSk7Ci0JaWYgKCFjb21wYXQyMCkgewotCQljaGlsZF9zdGF0ZS5zc2gxcHJvdG9mbGFncyA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQkJY2hpbGRfc3RhdGUuc3NoMWNpcGhlciA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQkJY2hpbGRfc3RhdGUuc3NoMWtleSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLAotCQkgICAgJmNoaWxkX3N0YXRlLnNzaDFrZXlsZW4pOwotCQljaGlsZF9zdGF0ZS5pdm91dCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLAotCQkgICAgJmNoaWxkX3N0YXRlLml2b3V0bGVuKTsKLQkJY2hpbGRfc3RhdGUuaXZpbiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCAmY2hpbGRfc3RhdGUuaXZpbmxlbik7Ci0JCWdvdG8gc2tpcDsKLQl9IGVsc2UgewotCQkvKiBHZXQgdGhlIEtleCBmb3IgcmVrZXlpbmcgKi8KLQkJKnBtb25pdG9yLT5tX3BrZXggPSBtbV9nZXRfa2V4KCZtKTsKLQl9Ci0KLQlibG9iID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sICZibG9ibGVuKTsKLQljdXJyZW50X2tleXNbTU9ERV9PVVRdID0gbW1fbmV3a2V5c19mcm9tX2Jsb2IoYmxvYiwgYmxvYmxlbik7Ci0JeGZyZWUoYmxvYik7Ci0KLQlkZWJ1ZzMoIiVzOiBXYWl0aW5nIGZvciBzZWNvbmQga2V5IiwgX19mdW5jX18pOwotCWJsb2IgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgJmJsb2JsZW4pOwotCWN1cnJlbnRfa2V5c1tNT0RFX0lOXSA9IG1tX25ld2tleXNfZnJvbV9ibG9iKGJsb2IsIGJsb2JsZW4pOwotCXhmcmVlKGJsb2IpOwotCi0JLyogTm93IGdldCBzZXF1ZW5jZSBudW1iZXJzIGZvciB0aGUgcGFja2V0cyAqLwotCXNlcW5yID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCWJsb2NrcyA9IGJ1ZmZlcl9nZXRfaW50NjQoJm0pOwotCXBhY2tldHMgPSBidWZmZXJfZ2V0X2ludCgmbSk7Ci0JYnl0ZXMgPSBidWZmZXJfZ2V0X2ludDY0KCZtKTsKLQlwYWNrZXRfc2V0X3N0YXRlKE1PREVfT1VULCBzZXFuciwgYmxvY2tzLCBwYWNrZXRzLCBieXRlcyk7Ci0Jc2VxbnIgPSBidWZmZXJfZ2V0X2ludCgmbSk7Ci0JYmxvY2tzID0gYnVmZmVyX2dldF9pbnQ2NCgmbSk7Ci0JcGFja2V0cyA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQlieXRlcyA9IGJ1ZmZlcl9nZXRfaW50NjQoJm0pOwotCXBhY2tldF9zZXRfc3RhdGUoTU9ERV9JTiwgc2VxbnIsIGJsb2NrcywgcGFja2V0cywgYnl0ZXMpOwotCi0gc2tpcDoKLQkvKiBHZXQgdGhlIGtleSBjb250ZXh0ICovCi0JY2hpbGRfc3RhdGUua2V5b3V0ID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sICZjaGlsZF9zdGF0ZS5rZXlvdXRsZW4pOwotCWNoaWxkX3N0YXRlLmtleWluICA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCAmY2hpbGRfc3RhdGUua2V5aW5sZW4pOwotCi0JZGVidWczKCIlczogR2V0dGluZyBjb21wcmVzc2lvbiBzdGF0ZSIsIF9fZnVuY19fKTsKLQkvKiBHZXQgY29tcHJlc3Npb24gc3RhdGUgKi8KLQlwID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sICZwbGVuKTsKLQlpZiAocGxlbiAhPSBzaXplb2YoY2hpbGRfc3RhdGUub3V0Z29pbmcpKQotCQlmYXRhbCgiJXM6IGJhZCByZXF1ZXN0IHNpemUiLCBfX2Z1bmNfXyk7Ci0JbWVtY3B5KCZjaGlsZF9zdGF0ZS5vdXRnb2luZywgcCwgc2l6ZW9mKGNoaWxkX3N0YXRlLm91dGdvaW5nKSk7Ci0JeGZyZWUocCk7Ci0KLQlwID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sICZwbGVuKTsKLQlpZiAocGxlbiAhPSBzaXplb2YoY2hpbGRfc3RhdGUuaW5jb21pbmcpKQotCQlmYXRhbCgiJXM6IGJhZCByZXF1ZXN0IHNpemUiLCBfX2Z1bmNfXyk7Ci0JbWVtY3B5KCZjaGlsZF9zdGF0ZS5pbmNvbWluZywgcCwgc2l6ZW9mKGNoaWxkX3N0YXRlLmluY29taW5nKSk7Ci0JeGZyZWUocCk7Ci0KLQkvKiBOZXR3b3JrIEkvTyBidWZmZXJzICovCi0JZGVidWczKCIlczogR2V0dGluZyBOZXR3b3JrIEkvTyBidWZmZXJzIiwgX19mdW5jX18pOwotCWNoaWxkX3N0YXRlLmlucHV0ID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sICZjaGlsZF9zdGF0ZS5pbGVuKTsKLQljaGlsZF9zdGF0ZS5vdXRwdXQgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgJmNoaWxkX3N0YXRlLm9sZW4pOwotCi0JLyogUm9hbWluZyAqLwotCWlmIChjb21wYXQyMCkgewotCQljaGlsZF9zdGF0ZS5zZW50X2J5dGVzID0gYnVmZmVyX2dldF9pbnQ2NCgmbSk7Ci0JCWNoaWxkX3N0YXRlLnJlY3ZfYnl0ZXMgPSBidWZmZXJfZ2V0X2ludDY0KCZtKTsKLQl9Ci0KLQlidWZmZXJfZnJlZSgmbSk7Ci19Ci0KLQotLyogQWxsb2NhdGlvbiBmdW5jdGlvbnMgZm9yIHpsaWIgKi8KLXZvaWQgKgotbW1femFsbG9jKHN0cnVjdCBtbV9tYXN0ZXIgKm1tLCB1X2ludCBuY291bnQsIHVfaW50IHNpemUpCi17Ci0Jc2l6ZV90IGxlbiA9IChzaXplX3QpIHNpemUgKiBuY291bnQ7Ci0Jdm9pZCAqYWRkcmVzczsKLQotCWlmIChsZW4gPT0gMCB8fCBuY291bnQgPiBTSVpFX1RfTUFYIC8gc2l6ZSkKLQkJZmF0YWwoIiVzOiBtbV96YWxsb2MoJXUsICV1KSIsIF9fZnVuY19fLCBuY291bnQsIHNpemUpOwotCi0JYWRkcmVzcyA9IG1tX21hbGxvYyhtbSwgbGVuKTsKLQotCXJldHVybiAoYWRkcmVzcyk7Ci19Ci0KLXZvaWQKLW1tX3pmcmVlKHN0cnVjdCBtbV9tYXN0ZXIgKm1tLCB2b2lkICphZGRyZXNzKQotewotCW1tX2ZyZWUobW0sIGFkZHJlc3MpOwotfQotCi12b2lkCi1tbV9pbml0X2NvbXByZXNzaW9uKHN0cnVjdCBtbV9tYXN0ZXIgKm1tKQotewotCW91dGdvaW5nX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYyltbV96YWxsb2M7Ci0Jb3V0Z29pbmdfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYyltbV96ZnJlZTsKLQlvdXRnb2luZ19zdHJlYW0ub3BhcXVlID0gbW07Ci0KLQlpbmNvbWluZ19zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpbW1femFsbG9jOwotCWluY29taW5nX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpbW1femZyZWU7Ci0JaW5jb21pbmdfc3RyZWFtLm9wYXF1ZSA9IG1tOwotfQotCi0vKiBYWFggKi8KLQotI2RlZmluZSBGRF9DTE9TRU9ORVhFQyh4KSBkbyB7IFwKLQlpZiAoZmNudGwoeCwgRl9TRVRGRCwgRkRfQ0xPRVhFQykgPT0gLTEpIFwKLQkJZmF0YWwoImZjbnRsKCVkLCBGX1NFVEZEKSIsIHgpOyBcCi19IHdoaWxlICgwKQotCi1zdGF0aWMgdm9pZAotbW9uaXRvcl9vcGVuZmRzKHN0cnVjdCBtb25pdG9yICptb24sIGludCBkb19sb2dmZHMpCi17Ci0JaW50IHBhaXJbMl07Ci0KLQlpZiAoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgcGFpcikgPT0gLTEpCi0JCWZhdGFsKCIlczogc29ja2V0cGFpcjogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQlGRF9DTE9TRU9ORVhFQyhwYWlyWzBdKTsKLQlGRF9DTE9TRU9ORVhFQyhwYWlyWzFdKTsKLQltb24tPm1fcmVjdmZkID0gcGFpclswXTsKLQltb24tPm1fc2VuZGZkID0gcGFpclsxXTsKLQotCWlmIChkb19sb2dmZHMpIHsKLQkJaWYgKHBpcGUocGFpcikgPT0gLTEpCi0JCQlmYXRhbCgiJXM6IHBpcGU6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JCUZEX0NMT1NFT05FWEVDKHBhaXJbMF0pOwotCQlGRF9DTE9TRU9ORVhFQyhwYWlyWzFdKTsKLQkJbW9uLT5tX2xvZ19yZWN2ZmQgPSBwYWlyWzBdOwotCQltb24tPm1fbG9nX3NlbmRmZCA9IHBhaXJbMV07Ci0JfSBlbHNlCi0JCW1vbi0+bV9sb2dfcmVjdmZkID0gbW9uLT5tX2xvZ19zZW5kZmQgPSAtMTsKLX0KLQotI2RlZmluZSBNTV9NRU1TSVpFCTY1NTM2Ci0KLXN0cnVjdCBtb25pdG9yICoKLW1vbml0b3JfaW5pdCh2b2lkKQotewotCXN0cnVjdCBtb25pdG9yICptb247Ci0KLQltb24gPSB4Y2FsbG9jKDEsIHNpemVvZigqbW9uKSk7Ci0KLQltb25pdG9yX29wZW5mZHMobW9uLCAxKTsKLQotCS8qIFVzZWQgdG8gc2hhcmUgemxpYiBzcGFjZSBhY3Jvc3MgcHJvY2Vzc2VzICovCi0JaWYgKG9wdGlvbnMuY29tcHJlc3Npb24pIHsKLQkJbW9uLT5tX3piYWNrID0gbW1fY3JlYXRlKE5VTEwsIE1NX01FTVNJWkUpOwotCQltb24tPm1femxpYiA9IG1tX2NyZWF0ZShtb24tPm1femJhY2ssIDIwICogTU1fTUVNU0laRSk7Ci0KLQkJLyogQ29tcHJlc3Npb24gbmVlZHMgdG8gc2hhcmUgc3RhdGUgYWNyb3NzIGJvcmRlcnMgKi8KLQkJbW1faW5pdF9jb21wcmVzc2lvbihtb24tPm1femxpYik7Ci0JfQotCi0JcmV0dXJuIG1vbjsKLX0KLQotdm9pZAotbW9uaXRvcl9yZWluaXQoc3RydWN0IG1vbml0b3IgKm1vbikKLXsKLQltb25pdG9yX29wZW5mZHMobW9uLCAwKTsKLX0KLQotI2lmZGVmIEdTU0FQSQotaW50Ci1tbV9hbnN3ZXJfZ3NzX3NldHVwX2N0eChpbnQgc29jaywgQnVmZmVyICptKQotewotCWdzc19PSURfZGVzYyBnb2lkOwotCU9NX3VpbnQzMiBtYWpvcjsKLQl1X2ludCBsZW47Ci0KLQlnb2lkLmVsZW1lbnRzID0gYnVmZmVyX2dldF9zdHJpbmcobSwgJmxlbik7Ci0JZ29pZC5sZW5ndGggPSBsZW47Ci0KLQltYWpvciA9IHNzaF9nc3NhcGlfc2VydmVyX2N0eCgmZ3NzY29udGV4dCwgJmdvaWQpOwotCi0JeGZyZWUoZ29pZC5lbGVtZW50cyk7Ci0KLQlidWZmZXJfY2xlYXIobSk7Ci0JYnVmZmVyX3B1dF9pbnQobSwgbWFqb3IpOwotCi0JbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX0dTU1NFVFVQLCBtKTsKLQotCS8qIE5vdyB3ZSBoYXZlIGEgY29udGV4dCwgZW5hYmxlIHRoZSBzdGVwICovCi0JbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9HU1NTVEVQLCAxKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLWludAotbW1fYW5zd2VyX2dzc19hY2NlcHRfY3R4KGludCBzb2NrLCBCdWZmZXIgKm0pCi17Ci0JZ3NzX2J1ZmZlcl9kZXNjIGluOwotCWdzc19idWZmZXJfZGVzYyBvdXQgPSBHU1NfQ19FTVBUWV9CVUZGRVI7Ci0JT01fdWludDMyIG1ham9yLCBtaW5vcjsKLQlPTV91aW50MzIgZmxhZ3MgPSAwOyAvKiBHU0kgbmVlZHMgdGhpcyAqLwotCXVfaW50IGxlbjsKLQotCWluLnZhbHVlID0gYnVmZmVyX2dldF9zdHJpbmcobSwgJmxlbik7Ci0JaW4ubGVuZ3RoID0gbGVuOwotCW1ham9yID0gc3NoX2dzc2FwaV9hY2NlcHRfY3R4KGdzc2NvbnRleHQsICZpbiwgJm91dCwgJmZsYWdzKTsKLQl4ZnJlZShpbi52YWx1ZSk7Ci0KLQlidWZmZXJfY2xlYXIobSk7Ci0JYnVmZmVyX3B1dF9pbnQobSwgbWFqb3IpOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKG0sIG91dC52YWx1ZSwgb3V0Lmxlbmd0aCk7Ci0JYnVmZmVyX3B1dF9pbnQobSwgZmxhZ3MpOwotCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19HU1NTVEVQLCBtKTsKLQotCWdzc19yZWxlYXNlX2J1ZmZlcigmbWlub3IsICZvdXQpOwotCi0JaWYgKG1ham9yID09IEdTU19TX0NPTVBMRVRFKSB7Ci0JCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfR1NTU1RFUCwgMCk7Ci0JCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfR1NTVVNFUk9LLCAxKTsKLQkJbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9HU1NDSEVDS01JQywgMSk7Ci0JfQotCXJldHVybiAoMCk7Ci19Ci0KLWludAotbW1fYW5zd2VyX2dzc19jaGVja21pYyhpbnQgc29jaywgQnVmZmVyICptKQotewotCWdzc19idWZmZXJfZGVzYyBnc3NidWYsIG1pYzsKLQlPTV91aW50MzIgcmV0OwotCXVfaW50IGxlbjsKLQotCWdzc2J1Zi52YWx1ZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sICZsZW4pOwotCWdzc2J1Zi5sZW5ndGggPSBsZW47Ci0JbWljLnZhbHVlID0gYnVmZmVyX2dldF9zdHJpbmcobSwgJmxlbik7Ci0JbWljLmxlbmd0aCA9IGxlbjsKLQotCXJldCA9IHNzaF9nc3NhcGlfY2hlY2ttaWMoZ3NzY29udGV4dCwgJmdzc2J1ZiwgJm1pYyk7Ci0KLQl4ZnJlZShnc3NidWYudmFsdWUpOwotCXhmcmVlKG1pYy52YWx1ZSk7Ci0KLQlidWZmZXJfY2xlYXIobSk7Ci0JYnVmZmVyX3B1dF9pbnQobSwgcmV0KTsKLQotCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19HU1NDSEVDS01JQywgbSk7Ci0KLQlpZiAoIUdTU19FUlJPUihyZXQpKQotCQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX0dTU1VTRVJPSywgMSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi1pbnQKLW1tX2Fuc3dlcl9nc3NfdXNlcm9rKGludCBzb2NrLCBCdWZmZXIgKm0pCi17Ci0JaW50IGF1dGhlbnRpY2F0ZWQ7Ci0KLQlhdXRoZW50aWNhdGVkID0gYXV0aGN0eHQtPnZhbGlkICYmIHNzaF9nc3NhcGlfdXNlcm9rKGF1dGhjdHh0LT51c2VyKTsKLQotCWJ1ZmZlcl9jbGVhcihtKTsKLQlidWZmZXJfcHV0X2ludChtLCBhdXRoZW50aWNhdGVkKTsKLQotCWRlYnVnMygiJXM6IHNlbmRpbmcgcmVzdWx0ICVkIiwgX19mdW5jX18sIGF1dGhlbnRpY2F0ZWQpOwotCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19HU1NVU0VST0ssIG0pOwotCi0JYXV0aF9tZXRob2QgPSAiZ3NzYXBpLXdpdGgtbWljIjsKLQotCS8qIE1vbml0b3IgbG9vcCB3aWxsIHRlcm1pbmF0ZSBpZiBhdXRoZW50aWNhdGVkICovCi0JcmV0dXJuIChhdXRoZW50aWNhdGVkKTsKLX0KLSNlbmRpZiAvKiBHU1NBUEkgKi8KLQotI2lmZGVmIEpQQUtFCi1pbnQKLW1tX2Fuc3dlcl9qcGFrZV9zdGVwMShpbnQgc29jaywgQnVmZmVyICptKQotewotCXN0cnVjdCBqcGFrZV9jdHggKnBjdHg7Ci0JdV9jaGFyICp4M19wcm9vZiwgKng0X3Byb29mOwotCXVfaW50IHgzX3Byb29mX2xlbiwgeDRfcHJvb2ZfbGVuOwotCi0JaWYgKCFvcHRpb25zLnplcm9fa25vd2xlZGdlX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uKQotCQlmYXRhbCgiemVyb19rbm93bGVkZ2VfcGFzc3dvcmRfYXV0aGVudGljYXRpb24gZGlzYWJsZWQiKTsKLQotCWlmIChhdXRoY3R4dC0+anBha2VfY3R4ICE9IE5VTEwpCi0JCWZhdGFsKCIlczogYXV0aGN0eHQtPmpwYWtlX2N0eCBhbHJlYWR5IHNldCAoJXApIiwKLQkJICAgIF9fZnVuY19fLCBhdXRoY3R4dC0+anBha2VfY3R4KTsKLQlhdXRoY3R4dC0+anBha2VfY3R4ID0gcGN0eCA9IGpwYWtlX25ldygpOwotCi0JanBha2Vfc3RlcDEocGN0eC0+Z3JwLAotCSAgICAmcGN0eC0+c2VydmVyX2lkLCAmcGN0eC0+c2VydmVyX2lkX2xlbiwKLQkgICAgJnBjdHgtPngzLCAmcGN0eC0+eDQsICZwY3R4LT5nX3gzLCAmcGN0eC0+Z194NCwKLQkgICAgJngzX3Byb29mLCAmeDNfcHJvb2ZfbGVuLAotCSAgICAmeDRfcHJvb2YsICZ4NF9wcm9vZl9sZW4pOwotCi0JSlBBS0VfREVCVUdfQ1RYKChwY3R4LCAic3RlcDEgZG9uZSBpbiAlcyIsIF9fZnVuY19fKSk7Ci0KLQlidWZmZXJfY2xlYXIobSk7Ci0KLQlidWZmZXJfcHV0X3N0cmluZyhtLCBwY3R4LT5zZXJ2ZXJfaWQsIHBjdHgtPnNlcnZlcl9pZF9sZW4pOwotCWJ1ZmZlcl9wdXRfYmlnbnVtMihtLCBwY3R4LT5nX3gzKTsKLQlidWZmZXJfcHV0X2JpZ251bTIobSwgcGN0eC0+Z194NCk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcobSwgeDNfcHJvb2YsIHgzX3Byb29mX2xlbik7Ci0JYnVmZmVyX3B1dF9zdHJpbmcobSwgeDRfcHJvb2YsIHg0X3Byb29mX2xlbik7Ci0KLQlkZWJ1ZzMoIiVzOiBzZW5kaW5nIHN0ZXAxIiwgX19mdW5jX18pOwotCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19KUEFLRV9TVEVQMSwgbSk7Ci0KLQliemVybyh4M19wcm9vZiwgeDNfcHJvb2ZfbGVuKTsKLQliemVybyh4NF9wcm9vZiwgeDRfcHJvb2ZfbGVuKTsKLQl4ZnJlZSh4M19wcm9vZik7Ci0JeGZyZWUoeDRfcHJvb2YpOwotCi0JbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9KUEFLRV9HRVRfUFdEQVRBLCAxKTsKLQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX0pQQUtFX1NURVAxLCAwKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLW1tX2Fuc3dlcl9qcGFrZV9nZXRfcHdkYXRhKGludCBzb2NrLCBCdWZmZXIgKm0pCi17Ci0Jc3RydWN0IGpwYWtlX2N0eCAqcGN0eCA9IGF1dGhjdHh0LT5qcGFrZV9jdHg7Ci0JY2hhciAqaGFzaF9zY2hlbWUsICpzYWx0OwotCi0JaWYgKHBjdHggPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBwY3R4ID09IE5VTEwiLCBfX2Z1bmNfXyk7Ci0KLQlhdXRoMl9qcGFrZV9nZXRfcHdkYXRhKGF1dGhjdHh0LCAmcGN0eC0+cywgJmhhc2hfc2NoZW1lLCAmc2FsdCk7Ci0KLQlidWZmZXJfY2xlYXIobSk7Ci0JLyogcGN0eC0+cyBpcyBzZW5zaXRpdmUsIG5vdCByZXR1cm5lZCB0byBzbGF2ZSAqLwotCWJ1ZmZlcl9wdXRfY3N0cmluZyhtLCBoYXNoX3NjaGVtZSk7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKG0sIHNhbHQpOwotCi0JZGVidWczKCIlczogc2VuZGluZyBwd2RhdGEiLCBfX2Z1bmNfXyk7Ci0JbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX0pQQUtFX0dFVF9QV0RBVEEsIG0pOwotCi0JYnplcm8oaGFzaF9zY2hlbWUsIHN0cmxlbihoYXNoX3NjaGVtZSkpOwotCWJ6ZXJvKHNhbHQsIHN0cmxlbihzYWx0KSk7Ci0JeGZyZWUoaGFzaF9zY2hlbWUpOwotCXhmcmVlKHNhbHQpOwotCi0JbW9uaXRvcl9wZXJtaXQobW9uX2Rpc3BhdGNoLCBNT05JVE9SX1JFUV9KUEFLRV9TVEVQMiwgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1tbV9hbnN3ZXJfanBha2Vfc3RlcDIoaW50IHNvY2ssIEJ1ZmZlciAqbSkKLXsKLQlzdHJ1Y3QganBha2VfY3R4ICpwY3R4ID0gYXV0aGN0eHQtPmpwYWtlX2N0eDsKLQl1X2NoYXIgKngxX3Byb29mLCAqeDJfcHJvb2YsICp4NF9zX3Byb29mOwotCXVfaW50IHgxX3Byb29mX2xlbiwgeDJfcHJvb2ZfbGVuLCB4NF9zX3Byb29mX2xlbjsKLQotCWlmIChwY3R4ID09IE5VTEwpCi0JCWZhdGFsKCIlczogcGN0eCA9PSBOVUxMIiwgX19mdW5jX18pOwotCi0JaWYgKChwY3R4LT5nX3gxID0gQk5fbmV3KCkpID09IE5VTEwgfHwKLQkgICAgKHBjdHgtPmdfeDIgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7Ci0JYnVmZmVyX2dldF9iaWdudW0yKG0sIHBjdHgtPmdfeDEpOwotCWJ1ZmZlcl9nZXRfYmlnbnVtMihtLCBwY3R4LT5nX3gyKTsKLQlwY3R4LT5jbGllbnRfaWQgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmcGN0eC0+Y2xpZW50X2lkX2xlbik7Ci0JeDFfcHJvb2YgPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmeDFfcHJvb2ZfbGVuKTsKLQl4Ml9wcm9vZiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKG0sICZ4Ml9wcm9vZl9sZW4pOwotCi0JanBha2Vfc3RlcDIocGN0eC0+Z3JwLCBwY3R4LT5zLCBwY3R4LT5nX3gzLAotCSAgICBwY3R4LT5nX3gxLCBwY3R4LT5nX3gyLCBwY3R4LT54NCwKLQkgICAgcGN0eC0+Y2xpZW50X2lkLCBwY3R4LT5jbGllbnRfaWRfbGVuLAotCSAgICBwY3R4LT5zZXJ2ZXJfaWQsIHBjdHgtPnNlcnZlcl9pZF9sZW4sCi0JICAgIHgxX3Byb29mLCB4MV9wcm9vZl9sZW4sCi0JICAgIHgyX3Byb29mLCB4Ml9wcm9vZl9sZW4sCi0JICAgICZwY3R4LT5iLAotCSAgICAmeDRfc19wcm9vZiwgJng0X3NfcHJvb2ZfbGVuKTsKLQotCUpQQUtFX0RFQlVHX0NUWCgocGN0eCwgInN0ZXAyIGRvbmUgaW4gJXMiLCBfX2Z1bmNfXykpOwotCi0JYnplcm8oeDFfcHJvb2YsIHgxX3Byb29mX2xlbik7Ci0JYnplcm8oeDJfcHJvb2YsIHgyX3Byb29mX2xlbik7Ci0JeGZyZWUoeDFfcHJvb2YpOwotCXhmcmVlKHgyX3Byb29mKTsKLQotCWJ1ZmZlcl9jbGVhcihtKTsKLQotCWJ1ZmZlcl9wdXRfYmlnbnVtMihtLCBwY3R4LT5iKTsKLQlidWZmZXJfcHV0X3N0cmluZyhtLCB4NF9zX3Byb29mLCB4NF9zX3Byb29mX2xlbik7Ci0KLQlkZWJ1ZzMoIiVzOiBzZW5kaW5nIHN0ZXAyIiwgX19mdW5jX18pOwotCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19KUEFLRV9TVEVQMiwgbSk7Ci0KLQliemVybyh4NF9zX3Byb29mLCB4NF9zX3Byb29mX2xlbik7Ci0JeGZyZWUoeDRfc19wcm9vZik7Ci0KLQltb25pdG9yX3Blcm1pdChtb25fZGlzcGF0Y2gsIE1PTklUT1JfUkVRX0pQQUtFX0tFWV9DT05GSVJNLCAxKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQKLW1tX2Fuc3dlcl9qcGFrZV9rZXlfY29uZmlybShpbnQgc29jaywgQnVmZmVyICptKQotewotCXN0cnVjdCBqcGFrZV9jdHggKnBjdHggPSBhdXRoY3R4dC0+anBha2VfY3R4OwotCXVfY2hhciAqeDJfc19wcm9vZjsKLQl1X2ludCB4Ml9zX3Byb29mX2xlbjsKLQotCWlmIChwY3R4ID09IE5VTEwpCi0JCWZhdGFsKCIlczogcGN0eCA9PSBOVUxMIiwgX19mdW5jX18pOwotCi0JaWYgKChwY3R4LT5hID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fbmV3IiwgX19mdW5jX18pOwotCWJ1ZmZlcl9nZXRfYmlnbnVtMihtLCBwY3R4LT5hKTsKLQl4Ml9zX3Byb29mID0gYnVmZmVyX2dldF9zdHJpbmcobSwgJngyX3NfcHJvb2ZfbGVuKTsKLQotCWpwYWtlX2tleV9jb25maXJtKHBjdHgtPmdycCwgcGN0eC0+cywgcGN0eC0+YSwKLQkgICAgcGN0eC0+eDQsIHBjdHgtPmdfeDMsIHBjdHgtPmdfeDQsIHBjdHgtPmdfeDEsIHBjdHgtPmdfeDIsCi0JICAgIHBjdHgtPnNlcnZlcl9pZCwgcGN0eC0+c2VydmVyX2lkX2xlbiwKLQkgICAgcGN0eC0+Y2xpZW50X2lkLCBwY3R4LT5jbGllbnRfaWRfbGVuLAotCSAgICBzZXNzaW9uX2lkMiwgc2Vzc2lvbl9pZDJfbGVuLAotCSAgICB4Ml9zX3Byb29mLCB4Ml9zX3Byb29mX2xlbiwKLQkgICAgJnBjdHgtPmssCi0JICAgICZwY3R4LT5oX2tfc2lkX3Nlc3NpZCwgJnBjdHgtPmhfa19zaWRfc2Vzc2lkX2xlbik7Ci0KLQlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJrZXlfY29uZmlybSBkb25lIGluICVzIiwgX19mdW5jX18pKTsKLQotCWJ6ZXJvKHgyX3NfcHJvb2YsIHgyX3NfcHJvb2ZfbGVuKTsKLQlidWZmZXJfY2xlYXIobSk7Ci0KLQkvKiBwY3R4LT5rIGlzIHNlbnNpdGl2ZSwgbm90IHNlbnQgKi8KLQlidWZmZXJfcHV0X3N0cmluZyhtLCBwY3R4LT5oX2tfc2lkX3Nlc3NpZCwgcGN0eC0+aF9rX3NpZF9zZXNzaWRfbGVuKTsKLQotCWRlYnVnMygiJXM6IHNlbmRpbmcgY29uZmlybWF0aW9uIGhhc2giLCBfX2Z1bmNfXyk7Ci0JbW1fcmVxdWVzdF9zZW5kKHNvY2ssIE1PTklUT1JfQU5TX0pQQUtFX0tFWV9DT05GSVJNLCBtKTsKLQotCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfSlBBS0VfQ0hFQ0tfQ09ORklSTSwgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1tbV9hbnN3ZXJfanBha2VfY2hlY2tfY29uZmlybShpbnQgc29jaywgQnVmZmVyICptKQotewotCWludCBhdXRoZW50aWNhdGVkID0gMDsKLQl1X2NoYXIgKnBlZXJfY29uZmlybV9oYXNoOwotCXVfaW50IHBlZXJfY29uZmlybV9oYXNoX2xlbjsKLQlzdHJ1Y3QganBha2VfY3R4ICpwY3R4ID0gYXV0aGN0eHQtPmpwYWtlX2N0eDsKLQotCWlmIChwY3R4ID09IE5VTEwpCi0JCWZhdGFsKCIlczogcGN0eCA9PSBOVUxMIiwgX19mdW5jX18pOwotCi0JcGVlcl9jb25maXJtX2hhc2ggPSBidWZmZXJfZ2V0X3N0cmluZyhtLCAmcGVlcl9jb25maXJtX2hhc2hfbGVuKTsKLQotCWF1dGhlbnRpY2F0ZWQgPSBqcGFrZV9jaGVja19jb25maXJtKHBjdHgtPmssCi0JICAgIHBjdHgtPmNsaWVudF9pZCwgcGN0eC0+Y2xpZW50X2lkX2xlbiwKLQkgICAgc2Vzc2lvbl9pZDIsIHNlc3Npb25faWQyX2xlbiwKLQkgICAgcGVlcl9jb25maXJtX2hhc2gsIHBlZXJfY29uZmlybV9oYXNoX2xlbikgJiYgYXV0aGN0eHQtPnZhbGlkOwotCi0JSlBBS0VfREVCVUdfQ1RYKChwY3R4LCAiY2hlY2tfY29uZmlybSBkb25lIGluICVzIiwgX19mdW5jX18pKTsKLQotCWJ6ZXJvKHBlZXJfY29uZmlybV9oYXNoLCBwZWVyX2NvbmZpcm1faGFzaF9sZW4pOwotCXhmcmVlKHBlZXJfY29uZmlybV9oYXNoKTsKLQotCWJ1ZmZlcl9jbGVhcihtKTsKLQlidWZmZXJfcHV0X2ludChtLCBhdXRoZW50aWNhdGVkKTsKLQotCWRlYnVnMygiJXM6IHNlbmRpbmcgcmVzdWx0ICVkIiwgX19mdW5jX18sIGF1dGhlbnRpY2F0ZWQpOwotCW1tX3JlcXVlc3Rfc2VuZChzb2NrLCBNT05JVE9SX0FOU19KUEFLRV9DSEVDS19DT05GSVJNLCBtKTsKLQotCW1vbml0b3JfcGVybWl0KG1vbl9kaXNwYXRjaCwgTU9OSVRPUl9SRVFfSlBBS0VfU1RFUDEsIDEpOwotCi0JYXV0aF9tZXRob2QgPSAianBha2UtMDFAb3BlbnNzaC5jb20iOwotCXJldHVybiBhdXRoZW50aWNhdGVkOwotfQotCi0jZW5kaWYgLyogSlBBS0UgKi8KZGlmZiAtLWdpdCBhL21vbml0b3IuaCBiL21vbml0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3ZDU1Mi4uMDAwMDAwMAotLS0gYS9tb25pdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKiAkT3BlbkJTRDogbW9uaXRvci5oLHYgMS4xNiAyMDExLzA2LzE3IDIxOjQ0OjMxIGRqbSBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDIgTmllbHMgUHJvdm9zIDxwcm92b3NAY2l0aS51bWljaC5lZHU+Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9NT05JVE9SX0hfCi0jZGVmaW5lIF9NT05JVE9SX0hfCi0KLWVudW0gbW9uaXRvcl9yZXF0eXBlIHsKLQlNT05JVE9SX1JFUV9NT0RVTEksIE1PTklUT1JfQU5TX01PRFVMSSwKLQlNT05JVE9SX1JFUV9GUkVFLCBNT05JVE9SX1JFUV9BVVRIU0VSViwKLQlNT05JVE9SX1JFUV9TSUdOLCBNT05JVE9SX0FOU19TSUdOLAotCU1PTklUT1JfUkVRX1BXTkFNLCBNT05JVE9SX0FOU19QV05BTSwKLQlNT05JVE9SX1JFUV9BVVRIMl9SRUFEX0JBTk5FUiwgTU9OSVRPUl9BTlNfQVVUSDJfUkVBRF9CQU5ORVIsCi0JTU9OSVRPUl9SRVFfQVVUSFBBU1NXT1JELCBNT05JVE9SX0FOU19BVVRIUEFTU1dPUkQsCi0JTU9OSVRPUl9SRVFfQlNEQVVUSFFVRVJZLCBNT05JVE9SX0FOU19CU0RBVVRIUVVFUlksCi0JTU9OSVRPUl9SRVFfQlNEQVVUSFJFU1BPTkQsIE1PTklUT1JfQU5TX0JTREFVVEhSRVNQT05ELAotCU1PTklUT1JfUkVRX1NLRVlRVUVSWSwgTU9OSVRPUl9BTlNfU0tFWVFVRVJZLAotCU1PTklUT1JfUkVRX1NLRVlSRVNQT05ELCBNT05JVE9SX0FOU19TS0VZUkVTUE9ORCwKLQlNT05JVE9SX1JFUV9LRVlBTExPV0VELCBNT05JVE9SX0FOU19LRVlBTExPV0VELAotCU1PTklUT1JfUkVRX0tFWVZFUklGWSwgTU9OSVRPUl9BTlNfS0VZVkVSSUZZLAotCU1PTklUT1JfUkVRX0tFWUVYUE9SVCwKLQlNT05JVE9SX1JFUV9QVFksIE1PTklUT1JfQU5TX1BUWSwKLQlNT05JVE9SX1JFUV9QVFlDTEVBTlVQLAotCU1PTklUT1JfUkVRX1NFU1NLRVksIE1PTklUT1JfQU5TX1NFU1NLRVksCi0JTU9OSVRPUl9SRVFfU0VTU0lELAotCU1PTklUT1JfUkVRX1JTQUtFWUFMTE9XRUQsIE1PTklUT1JfQU5TX1JTQUtFWUFMTE9XRUQsCi0JTU9OSVRPUl9SRVFfUlNBQ0hBTExFTkdFLCBNT05JVE9SX0FOU19SU0FDSEFMTEVOR0UsCi0JTU9OSVRPUl9SRVFfUlNBUkVTUE9OU0UsIE1PTklUT1JfQU5TX1JTQVJFU1BPTlNFLAotCU1PTklUT1JfUkVRX0dTU1NFVFVQLCBNT05JVE9SX0FOU19HU1NTRVRVUCwKLQlNT05JVE9SX1JFUV9HU1NTVEVQLCBNT05JVE9SX0FOU19HU1NTVEVQLAotCU1PTklUT1JfUkVRX0dTU1VTRVJPSywgTU9OSVRPUl9BTlNfR1NTVVNFUk9LLAotCU1PTklUT1JfUkVRX0dTU0NIRUNLTUlDLCBNT05JVE9SX0FOU19HU1NDSEVDS01JQywKLQlNT05JVE9SX1JFUV9QQU1fU1RBUlQsCi0JTU9OSVRPUl9SRVFfUEFNX0FDQ09VTlQsIE1PTklUT1JfQU5TX1BBTV9BQ0NPVU5ULAotCU1PTklUT1JfUkVRX1BBTV9JTklUX0NUWCwgTU9OSVRPUl9BTlNfUEFNX0lOSVRfQ1RYLAotCU1PTklUT1JfUkVRX1BBTV9RVUVSWSwgTU9OSVRPUl9BTlNfUEFNX1FVRVJZLAotCU1PTklUT1JfUkVRX1BBTV9SRVNQT05ELCBNT05JVE9SX0FOU19QQU1fUkVTUE9ORCwKLQlNT05JVE9SX1JFUV9QQU1fRlJFRV9DVFgsIE1PTklUT1JfQU5TX1BBTV9GUkVFX0NUWCwKLQlNT05JVE9SX1JFUV9BVURJVF9FVkVOVCwgTU9OSVRPUl9SRVFfQVVESVRfQ09NTUFORCwKLQlNT05JVE9SX1JFUV9URVJNLAotCU1PTklUT1JfUkVRX0pQQUtFX1NURVAxLCBNT05JVE9SX0FOU19KUEFLRV9TVEVQMSwKLQlNT05JVE9SX1JFUV9KUEFLRV9HRVRfUFdEQVRBLCBNT05JVE9SX0FOU19KUEFLRV9HRVRfUFdEQVRBLAotCU1PTklUT1JfUkVRX0pQQUtFX1NURVAyLCBNT05JVE9SX0FOU19KUEFLRV9TVEVQMiwKLQlNT05JVE9SX1JFUV9KUEFLRV9LRVlfQ09ORklSTSwgTU9OSVRPUl9BTlNfSlBBS0VfS0VZX0NPTkZJUk0sCi0JTU9OSVRPUl9SRVFfSlBBS0VfQ0hFQ0tfQ09ORklSTSwgTU9OSVRPUl9BTlNfSlBBS0VfQ0hFQ0tfQ09ORklSTSwKLX07Ci0KLXN0cnVjdCBtbV9tYXN0ZXI7Ci1zdHJ1Y3QgbW9uaXRvciB7Ci0JaW50CQkJIG1fcmVjdmZkOwotCWludAkJCSBtX3NlbmRmZDsKLQlpbnQJCQkgbV9sb2dfcmVjdmZkOwotCWludAkJCSBtX2xvZ19zZW5kZmQ7Ci0Jc3RydWN0IG1tX21hc3RlcgkqbV96YmFjazsKLQlzdHJ1Y3QgbW1fbWFzdGVyCSptX3psaWI7Ci0Jc3RydWN0IEtleAkJKiptX3BrZXg7Ci0JcGlkX3QJCQkgbV9waWQ7Ci19OwotCi1zdHJ1Y3QgbW9uaXRvciAqbW9uaXRvcl9pbml0KHZvaWQpOwotdm9pZCBtb25pdG9yX3JlaW5pdChzdHJ1Y3QgbW9uaXRvciAqKTsKLXZvaWQgbW9uaXRvcl9zeW5jKHN0cnVjdCBtb25pdG9yICopOwotCi1zdHJ1Y3QgQXV0aGN0eHQ7Ci12b2lkIG1vbml0b3JfY2hpbGRfcHJlYXV0aChzdHJ1Y3QgQXV0aGN0eHQgKiwgc3RydWN0IG1vbml0b3IgKik7Ci12b2lkIG1vbml0b3JfY2hpbGRfcG9zdGF1dGgoc3RydWN0IG1vbml0b3IgKik7Ci0KLXN0cnVjdCBtb25fdGFibGU7Ci1pbnQgbW9uaXRvcl9yZWFkKHN0cnVjdCBtb25pdG9yKiwgc3RydWN0IG1vbl90YWJsZSAqLCBzdHJ1Y3QgbW9uX3RhYmxlICoqKTsKLQotLyogUHJvdG90eXBlcyBmb3IgcmVxdWVzdCBzZW5kaW5nIGFuZCByZWNlaXZpbmcgKi8KLXZvaWQgbW1fcmVxdWVzdF9zZW5kKGludCwgZW51bSBtb25pdG9yX3JlcXR5cGUsIEJ1ZmZlciAqKTsKLXZvaWQgbW1fcmVxdWVzdF9yZWNlaXZlKGludCwgQnVmZmVyICopOwotdm9pZCBtbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KGludCwgZW51bSBtb25pdG9yX3JlcXR5cGUsIEJ1ZmZlciAqKTsKLQotI2VuZGlmIC8qIF9NT05JVE9SX0hfICovCmRpZmYgLS1naXQgYS9tb25pdG9yX2ZkcGFzcy5jIGIvbW9uaXRvcl9mZHBhc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViNmY1Yy4uMDAwMDAwMAotLS0gYS9tb25pdG9yX2ZkcGFzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qICRPcGVuQlNEOiBtb25pdG9yX2ZkcGFzcy5jLHYgMS4xOSAyMDEwLzAxLzEyIDAwOjU4OjI1IGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAyMDAxIE5pZWxzIFByb3ZvcyA8cHJvdm9zQGNpdGkudW1pY2guZWR1PgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotI2lmZGVmIEhBVkVfU1lTX1VOX0gKLSNpbmNsdWRlIDxzeXMvdW4uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZmRlZiBIQVZFX1BPTExfSAotI2luY2x1ZGUgPHBvbGwuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAibW9uaXRvcl9mZHBhc3MuaCIKLQotaW50Ci1tbV9zZW5kX2ZkKGludCBzb2NrLCBpbnQgZmQpCi17Ci0jaWYgZGVmaW5lZChIQVZFX1NFTkRNU0cpICYmIChkZWZpbmVkKEhBVkVfQUNDUklHSFRTX0lOX01TR0hEUikgfHwgZGVmaW5lZChIQVZFX0NPTlRST0xfSU5fTVNHSERSKSkKLQlzdHJ1Y3QgbXNnaGRyIG1zZzsKLSNpZm5kZWYgSEFWRV9BQ0NSSUdIVFNfSU5fTVNHSERSCi0JdW5pb24gewotCQlzdHJ1Y3QgY21zZ2hkciBoZHI7Ci0JCWNoYXIgYnVmW0NNU0dfU1BBQ0Uoc2l6ZW9mKGludCkpXTsKLQl9IGNtc2didWY7Ci0Jc3RydWN0IGNtc2doZHIgKmNtc2c7Ci0jZW5kaWYKLQlzdHJ1Y3QgaW92ZWMgdmVjOwotCWNoYXIgY2ggPSAnXDAnOwotCXNzaXplX3QgbjsKLQlzdHJ1Y3QgcG9sbGZkIHBmZDsKLQotCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7Ci0jaWZkZWYgSEFWRV9BQ0NSSUdIVFNfSU5fTVNHSERSCi0JbXNnLm1zZ19hY2NyaWdodHMgPSAoY2FkZHJfdCkmZmQ7Ci0JbXNnLm1zZ19hY2NyaWdodHNsZW4gPSBzaXplb2YoZmQpOwotI2Vsc2UKLQltc2cubXNnX2NvbnRyb2wgPSAoY2FkZHJfdCkmY21zZ2J1Zi5idWY7Ci0JbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGNtc2didWYuYnVmKTsKLQljbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsKLQljbXNnLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihpbnQpKTsKLQljbXNnLT5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKLQljbXNnLT5jbXNnX3R5cGUgPSBTQ01fUklHSFRTOwotCSooaW50ICopQ01TR19EQVRBKGNtc2cpID0gZmQ7Ci0jZW5kaWYKLQotCXZlYy5pb3ZfYmFzZSA9ICZjaDsKLQl2ZWMuaW92X2xlbiA9IDE7Ci0JbXNnLm1zZ19pb3YgPSAmdmVjOwotCW1zZy5tc2dfaW92bGVuID0gMTsKLQotCXBmZC5mZCA9IHNvY2s7Ci0JcGZkLmV2ZW50cyA9IFBPTExPVVQ7Ci0Jd2hpbGUgKChuID0gc2VuZG1zZyhzb2NrLCAmbXNnLCAwKSkgPT0gLTEgJiYKLQkgICAgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikpIHsKLQkJZGVidWczKCIlczogc2VuZG1zZyglZCk6ICVzIiwgX19mdW5jX18sIGZkLCBzdHJlcnJvcihlcnJubykpOwotCQkodm9pZClwb2xsKCZwZmQsIDEsIC0xKTsKLQl9Ci0JaWYgKG4gPT0gLTEpIHsKLQkJZXJyb3IoIiVzOiBzZW5kbXNnKCVkKTogJXMiLCBfX2Z1bmNfXywgZmQsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKG4gIT0gMSkgewotCQllcnJvcigiJXM6IHNlbmRtc2c6IGV4cGVjdGVkIHNlbnQgMSBnb3QgJWxkIiwKLQkJICAgIF9fZnVuY19fLCAobG9uZyluKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLSNlbHNlCi0JZXJyb3IoIiVzOiBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZyBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18pOwotCXJldHVybiAtMTsKLSNlbmRpZgotfQotCi1pbnQKLW1tX3JlY2VpdmVfZmQoaW50IHNvY2spCi17Ci0jaWYgZGVmaW5lZChIQVZFX1JFQ1ZNU0cpICYmIChkZWZpbmVkKEhBVkVfQUNDUklHSFRTX0lOX01TR0hEUikgfHwgZGVmaW5lZChIQVZFX0NPTlRST0xfSU5fTVNHSERSKSkKLQlzdHJ1Y3QgbXNnaGRyIG1zZzsKLSNpZm5kZWYgSEFWRV9BQ0NSSUdIVFNfSU5fTVNHSERSCi0JdW5pb24gewotCQlzdHJ1Y3QgY21zZ2hkciBoZHI7Ci0JCWNoYXIgYnVmW0NNU0dfU1BBQ0Uoc2l6ZW9mKGludCkpXTsKLQl9IGNtc2didWY7Ci0Jc3RydWN0IGNtc2doZHIgKmNtc2c7Ci0jZW5kaWYKLQlzdHJ1Y3QgaW92ZWMgdmVjOwotCXNzaXplX3QgbjsKLQljaGFyIGNoOwotCWludCBmZDsKLQlzdHJ1Y3QgcG9sbGZkIHBmZDsKLQotCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7Ci0JdmVjLmlvdl9iYXNlID0gJmNoOwotCXZlYy5pb3ZfbGVuID0gMTsKLQltc2cubXNnX2lvdiA9ICZ2ZWM7Ci0JbXNnLm1zZ19pb3ZsZW4gPSAxOwotI2lmZGVmIEhBVkVfQUNDUklHSFRTX0lOX01TR0hEUgotCW1zZy5tc2dfYWNjcmlnaHRzID0gKGNhZGRyX3QpJmZkOwotCW1zZy5tc2dfYWNjcmlnaHRzbGVuID0gc2l6ZW9mKGZkKTsKLSNlbHNlCi0JbXNnLm1zZ19jb250cm9sID0gJmNtc2didWYuYnVmOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihjbXNnYnVmLmJ1Zik7Ci0jZW5kaWYKLQotCXBmZC5mZCA9IHNvY2s7Ci0JcGZkLmV2ZW50cyA9IFBPTExJTjsKLQl3aGlsZSAoKG4gPSByZWN2bXNnKHNvY2ssICZtc2csIDApKSA9PSAtMSAmJgotCSAgICAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSKSkgewotCQlkZWJ1ZzMoIiVzOiByZWN2bXNnOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCQkodm9pZClwb2xsKCZwZmQsIDEsIC0xKTsKLQl9Ci0JaWYgKG4gPT0gLTEpIHsKLQkJZXJyb3IoIiVzOiByZWN2bXNnOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKG4gIT0gMSkgewotCQllcnJvcigiJXM6IHJlY3Ztc2c6IGV4cGVjdGVkIHJlY2VpdmVkIDEgZ290ICVsZCIsCi0JCSAgICBfX2Z1bmNfXywgKGxvbmcpbik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLSNpZmRlZiBIQVZFX0FDQ1JJR0hUU19JTl9NU0dIRFIKLQlpZiAobXNnLm1zZ19hY2NyaWdodHNsZW4gIT0gc2l6ZW9mKGZkKSkgewotCQllcnJvcigiJXM6IG5vIGZkIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLTE7Ci0JfQotI2Vsc2UKLQljbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsKLQlpZiAoY21zZyA9PSBOVUxMKSB7Ci0JCWVycm9yKCIlczogbm8gbWVzc2FnZSBoZWFkZXIiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLSNpZm5kZWYgQlJPS0VOX0NNU0dfVFlQRQotCWlmIChjbXNnLT5jbXNnX3R5cGUgIT0gU0NNX1JJR0hUUykgewotCQllcnJvcigiJXM6IGV4cGVjdGVkIHR5cGUgJWQgZ290ICVkIiwgX19mdW5jX18sCi0JCSAgICBTQ01fUklHSFRTLCBjbXNnLT5jbXNnX3R5cGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotI2VuZGlmCi0JZmQgPSAoKihpbnQgKilDTVNHX0RBVEEoY21zZykpOwotI2VuZGlmCi0JcmV0dXJuIGZkOwotI2Vsc2UKLQllcnJvcigiJXM6IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIC0xOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9tb25pdG9yX2ZkcGFzcy5oIGIvbW9uaXRvcl9mZHBhc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRiMWY2My4uMDAwMDAwMAotLS0gYS9tb25pdG9yX2ZkcGFzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogJE9wZW5CU0Q6IG1vbml0b3JfZmRwYXNzLmgsdiAxLjQgMjAwNy8wOS8wNCAwMzoyMTowMyBkam0gRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDAyIE5pZWxzIFByb3ZvcyA8cHJvdm9zQGNpdGkudW1pY2guZWR1PgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfTU1fRkRQQVNTX0hfCi0jZGVmaW5lIF9NTV9GRFBBU1NfSF8KLQotaW50IG1tX3NlbmRfZmQoaW50LCBpbnQpOwotaW50IG1tX3JlY2VpdmVfZmQoaW50KTsKLQotI2VuZGlmIC8qIF9NTV9GRFBBU1NfSF8gKi8KZGlmZiAtLWdpdCBhL21vbml0b3JfbW0uYyBiL21vbml0b3JfbW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmOWYzZC4uMDAwMDAwMAotLS0gYS9tb25pdG9yX21tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyogJE9wZW5CU0Q6IG1vbml0b3JfbW0uYyx2IDEuMTYgMjAwOS8wNi8yMiAwNTozOToyOCBkdHVja2VyIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IDIwMDIgTmllbHMgUHJvdm9zIDxwcm92b3NAY2l0aS51bWljaC5lZHU+Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfU1lTX01NQU5fSAotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtdHJlZS5oIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJzc2guaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJtb25pdG9yX21tLmgiCi0KLXN0YXRpYyBpbnQKLW1tX2NvbXBhcmUoc3RydWN0IG1tX3NoYXJlICphLCBzdHJ1Y3QgbW1fc2hhcmUgKmIpCi17Ci0JbG9uZyBkaWZmID0gKGNoYXIgKilhLT5hZGRyZXNzIC0gKGNoYXIgKiliLT5hZGRyZXNzOwotCi0JaWYgKGRpZmYgPT0gMCkKLQkJcmV0dXJuICgwKTsKLQllbHNlIGlmIChkaWZmIDwgMCkKLQkJcmV0dXJuICgtMSk7Ci0JZWxzZQotCQlyZXR1cm4gKDEpOwotfQotCi1SQl9HRU5FUkFURShtbXRyZWUsIG1tX3NoYXJlLCBuZXh0LCBtbV9jb21wYXJlKQotCi1zdGF0aWMgc3RydWN0IG1tX3NoYXJlICoKLW1tX21ha2VfZW50cnkoc3RydWN0IG1tX21hc3RlciAqbW0sIHN0cnVjdCBtbXRyZWUgKmhlYWQsCi0gICAgdm9pZCAqYWRkcmVzcywgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IG1tX3NoYXJlICp0bXAsICp0bXAyOwotCi0JaWYgKG1tLT5tbWFsbG9jID09IE5VTEwpCi0JCXRtcCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBtbV9zaGFyZSkpOwotCWVsc2UKLQkJdG1wID0gbW1feG1hbGxvYyhtbS0+bW1hbGxvYywgc2l6ZW9mKHN0cnVjdCBtbV9zaGFyZSkpOwotCXRtcC0+YWRkcmVzcyA9IGFkZHJlc3M7Ci0JdG1wLT5zaXplID0gc2l6ZTsKLQotCXRtcDIgPSBSQl9JTlNFUlQobW10cmVlLCBoZWFkLCB0bXApOwotCWlmICh0bXAyICE9IE5VTEwpCi0JCWZhdGFsKCJtbV9tYWtlX2VudHJ5KCVwKTogZG91YmxlIGFkZHJlc3MgJXAtPiVwKCVsdSkiLAotCQkgICAgbW0sIHRtcDIsIGFkZHJlc3MsICh1X2xvbmcpc2l6ZSk7Ci0KLQlyZXR1cm4gKHRtcCk7Ci19Ci0KLS8qIENyZWF0ZXMgYSBzaGFyZWQgbWVtb3J5IGFyZWEgb2YgYSBjZXJ0YWluIHNpemUgKi8KLQotc3RydWN0IG1tX21hc3RlciAqCi1tbV9jcmVhdGUoc3RydWN0IG1tX21hc3RlciAqbW1hbGxvYywgc2l6ZV90IHNpemUpCi17Ci0Jdm9pZCAqYWRkcmVzczsKLQlzdHJ1Y3QgbW1fbWFzdGVyICptbTsKLQotCWlmIChtbWFsbG9jID09IE5VTEwpCi0JCW1tID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG1tX21hc3RlcikpOwotCWVsc2UKLQkJbW0gPSBtbV94bWFsbG9jKG1tYWxsb2MsIHNpemVvZihzdHJ1Y3QgbW1fbWFzdGVyKSk7Ci0KLQkvKgotCSAqIElmIHRoZSBtZW1vcnkgbWFwIGhhcyBhIG1tX21hc3RlciBpdCBjYW4gYmUgY29tcGxldGVseQotCSAqIHNoYXJlZCBpbmNsdWRpbmcgYXV0aGVudGljYXRpb24gYmV0d2VlbiB0aGUgY2hpbGQKLQkgKiBhbmQgdGhlIGNsaWVudC4KLQkgKi8KLQltbS0+bW1hbGxvYyA9IG1tYWxsb2M7Ci0KLQlhZGRyZXNzID0geG1tYXAoc2l6ZSk7Ci0JaWYgKGFkZHJlc3MgPT0gKHZvaWQgKilNQVBfRkFJTEVEKQotCQlmYXRhbCgibW1hcCglbHUpOiAlcyIsICh1X2xvbmcpc2l6ZSwgc3RyZXJyb3IoZXJybm8pKTsKLQotCW1tLT5hZGRyZXNzID0gYWRkcmVzczsKLQltbS0+c2l6ZSA9IHNpemU7Ci0KLQlSQl9JTklUKCZtbS0+cmJfZnJlZSk7Ci0JUkJfSU5JVCgmbW0tPnJiX2FsbG9jYXRlZCk7Ci0KLQltbV9tYWtlX2VudHJ5KG1tLCAmbW0tPnJiX2ZyZWUsIGFkZHJlc3MsIHNpemUpOwotCi0JcmV0dXJuIChtbSk7Ci19Ci0KLS8qIEZyZWVzIGVpdGhlciB0aGUgYWxsb2NhdGVkIG9yIHRoZSBmcmVlIGxpc3QgKi8KLQotc3RhdGljIHZvaWQKLW1tX2ZyZWVsaXN0KHN0cnVjdCBtbV9tYXN0ZXIgKm1tYWxsb2MsIHN0cnVjdCBtbXRyZWUgKmhlYWQpCi17Ci0Jc3RydWN0IG1tX3NoYXJlICptbXMsICpuZXh0OwotCi0JZm9yIChtbXMgPSBSQl9ST09UKGhlYWQpOyBtbXM7IG1tcyA9IG5leHQpIHsKLQkJbmV4dCA9IFJCX05FWFQobW10cmVlLCBoZWFkLCBtbXMpOwotCQlSQl9SRU1PVkUobW10cmVlLCBoZWFkLCBtbXMpOwotCQlpZiAobW1hbGxvYyA9PSBOVUxMKQotCQkJeGZyZWUobW1zKTsKLQkJZWxzZQotCQkJbW1fZnJlZShtbWFsbG9jLCBtbXMpOwotCX0KLX0KLQotLyogRGVzdHJveXMgYSBtZW1vcnkgbWFwcGVkIGFyZWEgKi8KLQotdm9pZAotbW1fZGVzdHJveShzdHJ1Y3QgbW1fbWFzdGVyICptbSkKLXsKLQltbV9mcmVlbGlzdChtbS0+bW1hbGxvYywgJm1tLT5yYl9mcmVlKTsKLQltbV9mcmVlbGlzdChtbS0+bW1hbGxvYywgJm1tLT5yYl9hbGxvY2F0ZWQpOwotCi0jaWZkZWYgSEFWRV9NTUFQCi0JaWYgKG11bm1hcChtbS0+YWRkcmVzcywgbW0tPnNpemUpID09IC0xKQotCQlmYXRhbCgibXVubWFwKCVwLCAlbHUpOiAlcyIsIG1tLT5hZGRyZXNzLCAodV9sb25nKW1tLT5zaXplLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLSNlbHNlCi0JZmF0YWwoIiVzOiBVc2VQcml2aWxlZ2VTZXBhcmF0aW9uPXllcyBhbmQgQ29tcHJlc3Npb249eWVzIG5vdCBzdXBwb3J0ZWQiLAotCSAgICBfX2Z1bmNfXyk7Ci0jZW5kaWYKLQlpZiAobW0tPm1tYWxsb2MgPT0gTlVMTCkKLQkJeGZyZWUobW0pOwotCWVsc2UKLQkJbW1fZnJlZShtbS0+bW1hbGxvYywgbW0pOwotfQotCi12b2lkICoKLW1tX3htYWxsb2Moc3RydWN0IG1tX21hc3RlciAqbW0sIHNpemVfdCBzaXplKQotewotCXZvaWQgKmFkZHJlc3M7Ci0KLQlhZGRyZXNzID0gbW1fbWFsbG9jKG1tLCBzaXplKTsKLQlpZiAoYWRkcmVzcyA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IG1tX21hbGxvYyglbHUpIiwgX19mdW5jX18sICh1X2xvbmcpc2l6ZSk7Ci0JcmV0dXJuIChhZGRyZXNzKTsKLX0KLQotCi0vKiBBbGxvY2F0ZXMgZGF0YSBmcm9tIGEgbWVtb3J5IG1hcHBlZCBhcmVhICovCi0KLXZvaWQgKgotbW1fbWFsbG9jKHN0cnVjdCBtbV9tYXN0ZXIgKm1tLCBzaXplX3Qgc2l6ZSkKLXsKLQlzdHJ1Y3QgbW1fc2hhcmUgKm1tcywgKnRtcDsKLQotCWlmIChzaXplID09IDApCi0JCWZhdGFsKCJtbV9tYWxsb2M6IHRyeSB0byBhbGxvY2F0ZSAwIHNwYWNlIik7Ci0JaWYgKHNpemUgPiBTSVpFX1RfTUFYIC0gTU1fTUlOU0laRSArIDEpCi0JCWZhdGFsKCJtbV9tYWxsb2M6IHNpemUgdG9vIGJpZyIpOwotCi0Jc2l6ZSA9ICgoc2l6ZSArIChNTV9NSU5TSVpFIC0gMSkpIC8gTU1fTUlOU0laRSkgKiBNTV9NSU5TSVpFOwotCi0JUkJfRk9SRUFDSChtbXMsIG1tdHJlZSwgJm1tLT5yYl9mcmVlKSB7Ci0JCWlmIChtbXMtPnNpemUgPj0gc2l6ZSkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChtbXMgPT0gTlVMTCkKLQkJcmV0dXJuIChOVUxMKTsKLQotCS8qIERlYnVnICovCi0JbWVtc2V0KG1tcy0+YWRkcmVzcywgMHhkMCwgc2l6ZSk7Ci0KLQl0bXAgPSBtbV9tYWtlX2VudHJ5KG1tLCAmbW0tPnJiX2FsbG9jYXRlZCwgbW1zLT5hZGRyZXNzLCBzaXplKTsKLQotCS8qIERvZXMgbm90IGNoYW5nZSBvcmRlciBpbiBSQiB0cmVlICovCi0JbW1zLT5zaXplIC09IHNpemU7Ci0JbW1zLT5hZGRyZXNzID0gKHVfY2hhciAqKW1tcy0+YWRkcmVzcyArIHNpemU7Ci0KLQlpZiAobW1zLT5zaXplID09IDApIHsKLQkJUkJfUkVNT1ZFKG1tdHJlZSwgJm1tLT5yYl9mcmVlLCBtbXMpOwotCQlpZiAobW0tPm1tYWxsb2MgPT0gTlVMTCkKLQkJCXhmcmVlKG1tcyk7Ci0JCWVsc2UKLQkJCW1tX2ZyZWUobW0tPm1tYWxsb2MsIG1tcyk7Ci0JfQotCi0JcmV0dXJuICh0bXAtPmFkZHJlc3MpOwotfQotCi0vKiBGcmVlcyBtZW1vcnkgaW4gYSBtZW1vcnkgbWFwcGVkIGFyZWEgKi8KLQotdm9pZAotbW1fZnJlZShzdHJ1Y3QgbW1fbWFzdGVyICptbSwgdm9pZCAqYWRkcmVzcykKLXsKLQlzdHJ1Y3QgbW1fc2hhcmUgKm1tcywgKnByZXYsIHRtcDsKLQotCXRtcC5hZGRyZXNzID0gYWRkcmVzczsKLQltbXMgPSBSQl9GSU5EKG1tdHJlZSwgJm1tLT5yYl9hbGxvY2F0ZWQsICZ0bXApOwotCWlmIChtbXMgPT0gTlVMTCkKLQkJZmF0YWwoIm1tX2ZyZWUoJXApOiBjYW4gbm90IGZpbmQgJXAiLCBtbSwgYWRkcmVzcyk7Ci0KLQkvKiBEZWJ1ZyAqLwotCW1lbXNldChtbXMtPmFkZHJlc3MsIDB4ZDAsIG1tcy0+c2l6ZSk7Ci0KLQkvKiBSZW1vdmUgZnJvbSBhbGxvY2F0ZWQgbGlzdCBhbmQgaW5zZXJ0IGluIGZyZWUgbGlzdCAqLwotCVJCX1JFTU9WRShtbXRyZWUsICZtbS0+cmJfYWxsb2NhdGVkLCBtbXMpOwotCWlmIChSQl9JTlNFUlQobW10cmVlLCAmbW0tPnJiX2ZyZWUsIG1tcykgIT0gTlVMTCkKLQkJZmF0YWwoIm1tX2ZyZWUoJXApOiBkb3VibGUgYWRkcmVzcyAlcCIsIG1tLCBhZGRyZXNzKTsKLQotCS8qIEZpbmQgcHJldmlvdXMgZW50cnkgKi8KLQlwcmV2ID0gbW1zOwotCWlmIChSQl9MRUZUKHByZXYsIG5leHQpKSB7Ci0JCXByZXYgPSBSQl9MRUZUKHByZXYsIG5leHQpOwotCQl3aGlsZSAoUkJfUklHSFQocHJldiwgbmV4dCkpCi0JCQlwcmV2ID0gUkJfUklHSFQocHJldiwgbmV4dCk7Ci0JfSBlbHNlIHsKLQkJaWYgKFJCX1BBUkVOVChwcmV2LCBuZXh0KSAmJgotCQkgICAgKHByZXYgPT0gUkJfUklHSFQoUkJfUEFSRU5UKHByZXYsIG5leHQpLCBuZXh0KSkpCi0JCQlwcmV2ID0gUkJfUEFSRU5UKHByZXYsIG5leHQpOwotCQllbHNlIHsKLQkJCXdoaWxlIChSQl9QQVJFTlQocHJldiwgbmV4dCkgJiYKLQkJCSAgICAocHJldiA9PSBSQl9MRUZUKFJCX1BBUkVOVChwcmV2LCBuZXh0KSwgbmV4dCkpKQotCQkJCXByZXYgPSBSQl9QQVJFTlQocHJldiwgbmV4dCk7Ci0JCQlwcmV2ID0gUkJfUEFSRU5UKHByZXYsIG5leHQpOwotCQl9Ci0JfQotCi0JLyogQ2hlY2sgaWYgcmFuZ2UgZG9lcyBub3Qgb3ZlcmxhcCAqLwotCWlmIChwcmV2ICE9IE5VTEwgJiYgTU1fQUREUkVTU19FTkQocHJldikgPiBhZGRyZXNzKQotCQlmYXRhbCgibW1fZnJlZTogbWVtb3J5IGNvcnJ1cHRpb246ICVwKCVsdSkgPiAlcCIsCi0JCSAgICBwcmV2LT5hZGRyZXNzLCAodV9sb25nKXByZXYtPnNpemUsIGFkZHJlc3MpOwotCi0JLyogU2VlIGlmIHdlIGNhbiBtZXJnZSBiYWNrd2FyZHMgKi8KLQlpZiAocHJldiAhPSBOVUxMICYmIE1NX0FERFJFU1NfRU5EKHByZXYpID09IGFkZHJlc3MpIHsKLQkJcHJldi0+c2l6ZSArPSBtbXMtPnNpemU7Ci0JCVJCX1JFTU9WRShtbXRyZWUsICZtbS0+cmJfZnJlZSwgbW1zKTsKLQkJaWYgKG1tLT5tbWFsbG9jID09IE5VTEwpCi0JCQl4ZnJlZShtbXMpOwotCQllbHNlCi0JCQltbV9mcmVlKG1tLT5tbWFsbG9jLCBtbXMpOwotCX0gZWxzZQotCQlwcmV2ID0gbW1zOwotCi0JaWYgKHByZXYgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLyogQ2hlY2sgaWYgd2UgY2FuIG1lcmdlIGZvcndhcmRzICovCi0JbW1zID0gUkJfTkVYVChtbXRyZWUsICZtbS0+cmJfZnJlZSwgcHJldik7Ci0JaWYgKG1tcyA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAoTU1fQUREUkVTU19FTkQocHJldikgPiBtbXMtPmFkZHJlc3MpCi0JCWZhdGFsKCJtbV9mcmVlOiBtZW1vcnkgY29ycnVwdGlvbjogJXAgPCAlcCglbHUpIiwKLQkJICAgIG1tcy0+YWRkcmVzcywgcHJldi0+YWRkcmVzcywgKHVfbG9uZylwcmV2LT5zaXplKTsKLQlpZiAoTU1fQUREUkVTU19FTkQocHJldikgIT0gbW1zLT5hZGRyZXNzKQotCQlyZXR1cm47Ci0KLQlwcmV2LT5zaXplICs9IG1tcy0+c2l6ZTsKLQlSQl9SRU1PVkUobW10cmVlLCAmbW0tPnJiX2ZyZWUsIG1tcyk7Ci0KLQlpZiAobW0tPm1tYWxsb2MgPT0gTlVMTCkKLQkJeGZyZWUobW1zKTsKLQllbHNlCi0JCW1tX2ZyZWUobW0tPm1tYWxsb2MsIG1tcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tbV9zeW5jX2xpc3Qoc3RydWN0IG1tdHJlZSAqb2xkdHJlZSwgc3RydWN0IG1tdHJlZSAqbmV3dHJlZSwKLSAgICBzdHJ1Y3QgbW1fbWFzdGVyICptbSwgc3RydWN0IG1tX21hc3RlciAqbW1vbGQpCi17Ci0Jc3RydWN0IG1tX21hc3RlciAqbW1hbGxvYyA9IG1tLT5tbWFsbG9jOwotCXN0cnVjdCBtbV9zaGFyZSAqbW1zLCAqbmV3OwotCi0JLyogU3luYyBmcmVlIGxpc3QgKi8KLQlSQl9GT1JFQUNIKG1tcywgbW10cmVlLCBvbGR0cmVlKSB7Ci0JCS8qIENoZWNrIHRoZSB2YWx1ZXMgKi8KLQkJbW1fbWVtdmFsaWQobW1vbGQsIG1tcywgc2l6ZW9mKHN0cnVjdCBtbV9zaGFyZSkpOwotCQltbV9tZW12YWxpZChtbSwgbW1zLT5hZGRyZXNzLCBtbXMtPnNpemUpOwotCi0JCW5ldyA9IG1tX3htYWxsb2MobW1hbGxvYywgc2l6ZW9mKHN0cnVjdCBtbV9zaGFyZSkpOwotCQltZW1jcHkobmV3LCBtbXMsIHNpemVvZihzdHJ1Y3QgbW1fc2hhcmUpKTsKLQkJUkJfSU5TRVJUKG1tdHJlZSwgbmV3dHJlZSwgbmV3KTsKLQl9Ci19Ci0KLXZvaWQKLW1tX3NoYXJlX3N5bmMoc3RydWN0IG1tX21hc3RlciAqKnBtbSwgc3RydWN0IG1tX21hc3RlciAqKnBtbWFsbG9jKQotewotCXN0cnVjdCBtbV9tYXN0ZXIgKm1tOwotCXN0cnVjdCBtbV9tYXN0ZXIgKm1tYWxsb2M7Ci0Jc3RydWN0IG1tX21hc3RlciAqbW1vbGQ7Ci0Jc3RydWN0IG1tdHJlZSByYl9mcmVlLCByYl9hbGxvY2F0ZWQ7Ci0KLQlkZWJ1ZzMoIiVzOiBTaGFyZSBzeW5jIiwgX19mdW5jX18pOwotCi0JbW0gPSAqcG1tOwotCW1tb2xkID0gbW0tPm1tYWxsb2M7Ci0JbW1fbWVtdmFsaWQobW1vbGQsIG1tLCBzaXplb2YoKm1tKSk7Ci0KLQltbWFsbG9jID0gbW1fY3JlYXRlKE5VTEwsIG1tLT5zaXplKTsKLQltbSA9IG1tX3htYWxsb2MobW1hbGxvYywgc2l6ZW9mKHN0cnVjdCBtbV9tYXN0ZXIpKTsKLQltZW1jcHkobW0sICpwbW0sIHNpemVvZihzdHJ1Y3QgbW1fbWFzdGVyKSk7Ci0JbW0tPm1tYWxsb2MgPSBtbWFsbG9jOwotCi0JcmJfZnJlZSA9IG1tLT5yYl9mcmVlOwotCXJiX2FsbG9jYXRlZCA9IG1tLT5yYl9hbGxvY2F0ZWQ7Ci0KLQlSQl9JTklUKCZtbS0+cmJfZnJlZSk7Ci0JUkJfSU5JVCgmbW0tPnJiX2FsbG9jYXRlZCk7Ci0KLQltbV9zeW5jX2xpc3QoJnJiX2ZyZWUsICZtbS0+cmJfZnJlZSwgbW0sIG1tb2xkKTsKLQltbV9zeW5jX2xpc3QoJnJiX2FsbG9jYXRlZCwgJm1tLT5yYl9hbGxvY2F0ZWQsIG1tLCBtbW9sZCk7Ci0KLQltbV9kZXN0cm95KG1tb2xkKTsKLQotCSpwbW0gPSBtbTsKLQkqcG1tYWxsb2MgPSBtbWFsbG9jOwotCi0JZGVidWczKCIlczogU2hhcmUgc3luYyBlbmQiLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQKLW1tX21lbXZhbGlkKHN0cnVjdCBtbV9tYXN0ZXIgKm1tLCB2b2lkICphZGRyZXNzLCBzaXplX3Qgc2l6ZSkKLXsKLQl2b2lkICplbmQgPSAodV9jaGFyICopYWRkcmVzcyArIHNpemU7Ci0KLQlpZiAoYWRkcmVzcyA8IG1tLT5hZGRyZXNzKQotCQlmYXRhbCgibW1fbWVtdmFsaWQ6IGFkZHJlc3MgdG9vIHNtYWxsOiAlcCIsIGFkZHJlc3MpOwotCWlmIChlbmQgPCBhZGRyZXNzKQotCQlmYXRhbCgibW1fbWVtdmFsaWQ6IGVuZCA8IGFkZHJlc3M6ICVwIDwgJXAiLCBlbmQsIGFkZHJlc3MpOwotCWlmIChlbmQgPiAodm9pZCAqKSgodV9jaGFyICopbW0tPmFkZHJlc3MgKyBtbS0+c2l6ZSkpCi0JCWZhdGFsKCJtbV9tZW12YWxpZDogYWRkcmVzcyB0b28gbGFyZ2U6ICVwIiwgYWRkcmVzcyk7Ci19CmRpZmYgLS1naXQgYS9tb25pdG9yX21tLmggYi9tb25pdG9yX21tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTBmNzcuLjAwMDAwMDAKLS0tIGEvbW9uaXRvcl9tbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogJE9wZW5CU0Q6IG1vbml0b3JfbW0uaCx2IDEuNSAyMDA4LzA0LzI5IDExOjIwOjMxIG90dG8gRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDAyIE5pZWxzIFByb3ZvcyA8cHJvdm9zQGNpdGkudW1pY2guZWR1PgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfTU1fSF8KLSNkZWZpbmUgX01NX0hfCi0KLXN0cnVjdCBtbV9zaGFyZSB7Ci0JUkJfRU5UUlkobW1fc2hhcmUpIG5leHQ7Ci0Jdm9pZCAqYWRkcmVzczsKLQlzaXplX3Qgc2l6ZTsKLX07Ci0KLXN0cnVjdCBtbV9tYXN0ZXIgewotCVJCX0hFQUQobW10cmVlLCBtbV9zaGFyZSkgcmJfZnJlZTsKLQlzdHJ1Y3QgbW10cmVlIHJiX2FsbG9jYXRlZDsKLQl2b2lkICphZGRyZXNzOwotCXNpemVfdCBzaXplOwotCi0Jc3RydWN0IG1tX21hc3RlciAqbW1hbGxvYzsJLyogVXNlZCB0byBjb21wbGV0ZWx5IHNoYXJlICovCi19OwotCi1SQl9QUk9UT1RZUEUobW10cmVlLCBtbV9zaGFyZSwgbmV4dCwgbW1fY29tcGFyZSkKLQotI2RlZmluZSBNTV9NSU5TSVpFCQkxMjgKLQotI2RlZmluZSBNTV9BRERSRVNTX0VORCh4KQkodm9pZCAqKSgodV9jaGFyICopKHgpLT5hZGRyZXNzICsgKHgpLT5zaXplKQotCi1zdHJ1Y3QgbW1fbWFzdGVyICptbV9jcmVhdGUoc3RydWN0IG1tX21hc3RlciAqLCBzaXplX3QpOwotdm9pZCBtbV9kZXN0cm95KHN0cnVjdCBtbV9tYXN0ZXIgKik7Ci0KLXZvaWQgbW1fc2hhcmVfc3luYyhzdHJ1Y3QgbW1fbWFzdGVyICoqLCBzdHJ1Y3QgbW1fbWFzdGVyICoqKTsKLQotdm9pZCAqbW1fbWFsbG9jKHN0cnVjdCBtbV9tYXN0ZXIgKiwgc2l6ZV90KTsKLXZvaWQgKm1tX3htYWxsb2Moc3RydWN0IG1tX21hc3RlciAqLCBzaXplX3QpOwotdm9pZCBtbV9mcmVlKHN0cnVjdCBtbV9tYXN0ZXIgKiwgdm9pZCAqKTsKLQotdm9pZCBtbV9tZW12YWxpZChzdHJ1Y3QgbW1fbWFzdGVyICosIHZvaWQgKiwgc2l6ZV90KTsKLSNlbmRpZiAvKiBfTU1fSF8gKi8KZGlmZiAtLWdpdCBhL21vbml0b3Jfd3JhcC5jIGIvbW9uaXRvcl93cmFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMzg1NmEuLjAwMDAwMDAKLS0tIGEvbW9uaXRvcl93cmFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDU0ICswLDAgQEAKLS8qICRPcGVuQlNEOiBtb25pdG9yX3dyYXAuYyx2IDEuNzMgMjAxMS8wNi8xNyAyMTo0NDozMSBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiBOaWVscyBQcm92b3MgPHByb3Zvc0BjaXRpLnVtaWNoLmVkdT4KLSAqIENvcHlyaWdodCAyMDAyIE1hcmt1cyBGcmllZGwgPG1hcmt1c0BvcGVuYnNkLm9yZz4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgiCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgImRoLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiY2lwaGVyLmgiCi0jaW5jbHVkZSAia2V4LmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJhdXRoLmgiCi0jaW5jbHVkZSAiYXV0aC1vcHRpb25zLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAibWFjLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaWZkZWYgVEFSR0VUX09TX01BQyAgICAvKiBYWFggQnJva2VuIGtyYjUgaGVhZGVycyBvbiBNYWMgKi8KLSN1bmRlZiBUQVJHRVRfT1NfTUFDCi0jaW5jbHVkZSAiemxpYi5oIgotI2RlZmluZSBUQVJHRVRfT1NfTUFDIDEKLSNlbHNlCi0jaW5jbHVkZSAiemxpYi5oIgotI2VuZGlmCi0jaW5jbHVkZSAibW9uaXRvci5oIgotI2lmZGVmIEdTU0FQSQotI2luY2x1ZGUgInNzaC1nc3MuaCIKLSNlbmRpZgotI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgotI2luY2x1ZGUgImF0b21pY2lvLmgiCi0jaW5jbHVkZSAibW9uaXRvcl9mZHBhc3MuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAic2Nobm9yci5oIgotI2luY2x1ZGUgImpwYWtlLmgiCi0jaW5jbHVkZSAidXVlbmNvZGUuaCIKLQotI2luY2x1ZGUgImNoYW5uZWxzLmgiCi0jaW5jbHVkZSAic2Vzc2lvbi5oIgotI2luY2x1ZGUgInNlcnZjb25mLmgiCi0jaW5jbHVkZSAicm9hbWluZy5oIgotCi0vKiBJbXBvcnRzICovCi1leHRlcm4gaW50IGNvbXBhdDIwOwotZXh0ZXJuIHpfc3RyZWFtIGluY29taW5nX3N0cmVhbTsKLWV4dGVybiB6X3N0cmVhbSBvdXRnb2luZ19zdHJlYW07Ci1leHRlcm4gc3RydWN0IG1vbml0b3IgKnBtb25pdG9yOwotZXh0ZXJuIEJ1ZmZlciBsb2dpbm1zZzsKLWV4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7Ci0KLXZvaWQKLW1tX2xvZ19oYW5kbGVyKExvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyICptc2csIHZvaWQgKmN0eCkKLXsKLQlCdWZmZXIgbG9nX21zZzsKLQlzdHJ1Y3QgbW9uaXRvciAqbW9uID0gKHN0cnVjdCBtb25pdG9yICopY3R4OwotCi0JaWYgKG1vbi0+bV9sb2dfc2VuZGZkID09IC0xKQotCQlmYXRhbCgiJXM6IG5vIGxvZyBjaGFubmVsIiwgX19mdW5jX18pOwotCi0JYnVmZmVyX2luaXQoJmxvZ19tc2cpOwotCS8qCi0JICogUGxhY2Vob2xkZXIgZm9yIHBhY2tldCBsZW5ndGguIFdpbGwgYmUgZmlsbGVkIGluIHdpdGggdGhlIGFjdHVhbAotCSAqIHBhY2tldCBsZW5ndGggb25jZSB0aGUgcGFja2V0IGhhcyBiZWVuIGNvbnN0dWN0ZWQuIFRoaXMgc2F2ZXMKLQkgKiBmcmFnaWxlIG1hdGguCi0JICovCi0JYnVmZmVyX3B1dF9pbnQoJmxvZ19tc2csIDApOwotCi0JYnVmZmVyX3B1dF9pbnQoJmxvZ19tc2csIGxldmVsKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJmxvZ19tc2csIG1zZyk7Ci0JcHV0X3UzMihidWZmZXJfcHRyKCZsb2dfbXNnKSwgYnVmZmVyX2xlbigmbG9nX21zZykgLSA0KTsKLQlpZiAoYXRvbWljaW8odndyaXRlLCBtb24tPm1fbG9nX3NlbmRmZCwgYnVmZmVyX3B0cigmbG9nX21zZyksCi0JICAgIGJ1ZmZlcl9sZW4oJmxvZ19tc2cpKSAhPSBidWZmZXJfbGVuKCZsb2dfbXNnKSkKLQkJZmF0YWwoIiVzOiB3cml0ZTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQlidWZmZXJfZnJlZSgmbG9nX21zZyk7Ci19Ci0KLWludAotbW1faXNfbW9uaXRvcih2b2lkKQotewotCS8qCi0JICogbV9waWQgaXMgb25seSBzZXQgaW4gdGhlIHByaXZpbGVnZWQgcGFydCwgYW5kCi0JICogcG9pbnRzIHRvIHRoZSB1bnByaXZpbGVnZWQgY2hpbGQuCi0JICovCi0JcmV0dXJuIChwbW9uaXRvciAmJiBwbW9uaXRvci0+bV9waWQgPiAwKTsKLX0KLQotdm9pZAotbW1fcmVxdWVzdF9zZW5kKGludCBzb2NrLCBlbnVtIG1vbml0b3JfcmVxdHlwZSB0eXBlLCBCdWZmZXIgKm0pCi17Ci0JdV9pbnQgbWxlbiA9IGJ1ZmZlcl9sZW4obSk7Ci0JdV9jaGFyIGJ1Zls1XTsKLQotCWRlYnVnMygiJXMgZW50ZXJpbmc6IHR5cGUgJWQiLCBfX2Z1bmNfXywgdHlwZSk7Ci0KLQlwdXRfdTMyKGJ1ZiwgbWxlbiArIDEpOwotCWJ1Zls0XSA9ICh1X2NoYXIpIHR5cGU7CQkvKiAxc3QgYnl0ZSBvZiBwYXlsb2FkIGlzIG1lc2ctdHlwZSAqLwotCWlmIChhdG9taWNpbyh2d3JpdGUsIHNvY2ssIGJ1Ziwgc2l6ZW9mKGJ1ZikpICE9IHNpemVvZihidWYpKQotCQlmYXRhbCgiJXM6IHdyaXRlOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCWlmIChhdG9taWNpbyh2d3JpdGUsIHNvY2ssIGJ1ZmZlcl9wdHIobSksIG1sZW4pICE9IG1sZW4pCi0JCWZhdGFsKCIlczogd3JpdGU6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci19Ci0KLXZvaWQKLW1tX3JlcXVlc3RfcmVjZWl2ZShpbnQgc29jaywgQnVmZmVyICptKQotewotCXVfY2hhciBidWZbNF07Ci0JdV9pbnQgbXNnX2xlbjsKLQotCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoYXRvbWljaW8ocmVhZCwgc29jaywgYnVmLCBzaXplb2YoYnVmKSkgIT0gc2l6ZW9mKGJ1ZikpIHsKLQkJaWYgKGVycm5vID09IEVQSVBFKQotCQkJY2xlYW51cF9leGl0KDI1NSk7Ci0JCWZhdGFsKCIlczogcmVhZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci0JbXNnX2xlbiA9IGdldF91MzIoYnVmKTsKLQlpZiAobXNnX2xlbiA+IDI1NiAqIDEwMjQpCi0JCWZhdGFsKCIlczogcmVhZDogYmFkIG1zZ19sZW4gJWQiLCBfX2Z1bmNfXywgbXNnX2xlbik7Ci0JYnVmZmVyX2NsZWFyKG0pOwotCWJ1ZmZlcl9hcHBlbmRfc3BhY2UobSwgbXNnX2xlbik7Ci0JaWYgKGF0b21pY2lvKHJlYWQsIHNvY2ssIGJ1ZmZlcl9wdHIobSksIG1zZ19sZW4pICE9IG1zZ19sZW4pCi0JCWZhdGFsKCIlczogcmVhZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLX0KLQotdm9pZAotbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChpbnQgc29jaywgZW51bSBtb25pdG9yX3JlcXR5cGUgdHlwZSwgQnVmZmVyICptKQotewotCXVfY2hhciBydHlwZTsKLQotCWRlYnVnMygiJXMgZW50ZXJpbmc6IHR5cGUgJWQiLCBfX2Z1bmNfXywgdHlwZSk7Ci0KLQltbV9yZXF1ZXN0X3JlY2VpdmUoc29jaywgbSk7Ci0JcnR5cGUgPSBidWZmZXJfZ2V0X2NoYXIobSk7Ci0JaWYgKHJ0eXBlICE9IHR5cGUpCi0JCWZhdGFsKCIlczogcmVhZDogcnR5cGUgJWQgIT0gdHlwZSAlZCIsIF9fZnVuY19fLAotCQkgICAgcnR5cGUsIHR5cGUpOwotfQotCi1ESCAqCi1tbV9jaG9vc2VfZGgoaW50IG1pbiwgaW50IG5iaXRzLCBpbnQgbWF4KQotewotCUJJR05VTSAqcCwgKmc7Ci0JaW50IHN1Y2Nlc3MgPSAwOwotCUJ1ZmZlciBtOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCWJ1ZmZlcl9wdXRfaW50KCZtLCBtaW4pOwotCWJ1ZmZlcl9wdXRfaW50KCZtLCBuYml0cyk7Ci0JYnVmZmVyX3B1dF9pbnQoJm0sIG1heCk7Ci0KLQltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9NT0RVTEksICZtKTsKLQotCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX01PRFVMSSIsIF9fZnVuY19fKTsKLQltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfTU9EVUxJLCAmbSk7Ci0KLQlzdWNjZXNzID0gYnVmZmVyX2dldF9jaGFyKCZtKTsKLQlpZiAoc3VjY2VzcyA9PSAwKQotCQlmYXRhbCgiJXM6IE1PTklUT1JfQU5TX01PRFVMSSBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoKHAgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBCTl9uZXcgZmFpbGVkIiwgX19mdW5jX18pOwotCWlmICgoZyA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEJOX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JYnVmZmVyX2dldF9iaWdudW0yKCZtLCBwKTsKLQlidWZmZXJfZ2V0X2JpZ251bTIoJm0sIGcpOwotCi0JZGVidWczKCIlczogcmVtYWluaW5nICVkIiwgX19mdW5jX18sIGJ1ZmZlcl9sZW4oJm0pKTsKLQlidWZmZXJfZnJlZSgmbSk7Ci0KLQlyZXR1cm4gKGRoX25ld19ncm91cChnLCBwKSk7Ci19Ci0KLWludAotbW1fa2V5X3NpZ24oS2V5ICprZXksIHVfY2hhciAqKnNpZ3AsIHVfaW50ICpsZW5wLCB1X2NoYXIgKmRhdGEsIHVfaW50IGRhdGFsZW4pCi17Ci0JS2V4ICprZXggPSAqcG1vbml0b3ItPm1fcGtleDsKLQlCdWZmZXIgbTsKLQotCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQlidWZmZXJfaW5pdCgmbSk7Ci0JYnVmZmVyX3B1dF9pbnQoJm0sIGtleC0+aG9zdF9rZXlfaW5kZXgoa2V5KSk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJm0sIGRhdGEsIGRhdGFsZW4pOwotCi0JbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfU0lHTiwgJm0pOwotCi0JZGVidWczKCIlczogd2FpdGluZyBmb3IgTU9OSVRPUl9BTlNfU0lHTiIsIF9fZnVuY19fKTsKLQltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfU0lHTiwgJm0pOwotCSpzaWdwICA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBsZW5wKTsKLQlidWZmZXJfZnJlZSgmbSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi1zdHJ1Y3QgcGFzc3dkICoKLW1tX2dldHB3bmFtYWxsb3coY29uc3QgY2hhciAqdXNlcm5hbWUpCi17Ci0JQnVmZmVyIG07Ci0Jc3RydWN0IHBhc3N3ZCAqcHc7Ci0JdV9pbnQgbGVuLCBpOwotCVNlcnZlck9wdGlvbnMgKm5ld29wdHM7Ci0KLQlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgdXNlcm5hbWUpOwotCi0JbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfUFdOQU0sICZtKTsKLQotCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX1BXTkFNIiwgX19mdW5jX18pOwotCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19QV05BTSwgJm0pOwotCi0JaWYgKGJ1ZmZlcl9nZXRfY2hhcigmbSkgPT0gMCkgewotCQlwdyA9IE5VTEw7Ci0JCWdvdG8gb3V0OwotCX0KLQlwdyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCAmbGVuKTsKLQlpZiAobGVuICE9IHNpemVvZihzdHJ1Y3QgcGFzc3dkKSkKLQkJZmF0YWwoIiVzOiBzdHJ1Y3QgcGFzc3dkIHNpemUgbWlzbWF0Y2giLCBfX2Z1bmNfXyk7Ci0JcHctPnB3X25hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7Ci0JcHctPnB3X3Bhc3N3ZCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLSNpZmRlZiBIQVZFX1BXX0dFQ09TX0lOX1BBU1NXRAotCXB3LT5wd19nZWNvcyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfUFdfQ0xBU1NfSU5fUEFTU1dECi0JcHctPnB3X2NsYXNzID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOwotI2VuZGlmCi0JcHctPnB3X2RpciA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQlwdy0+cHdfc2hlbGwgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7Ci0KLW91dDoKLQkvKiBjb3B5IG9wdGlvbnMgYmxvY2sgYXMgYSBNYXRjaCBkaXJlY3RpdmUgbWF5IGhhdmUgY2hhbmdlZCBzb21lICovCi0JbmV3b3B0cyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCAmbGVuKTsKLQlpZiAobGVuICE9IHNpemVvZigqbmV3b3B0cykpCi0JCWZhdGFsKCIlczogb3B0aW9uIGJsb2NrIHNpemUgbWlzbWF0Y2giLCBfX2Z1bmNfXyk7Ci0KLSNkZWZpbmUgTV9DUF9TVFJPUFQoeCkgZG8geyBcCi0JCWlmIChuZXdvcHRzLT54ICE9IE5VTEwpIFwKLQkJCW5ld29wdHMtPnggPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7IFwKLQl9IHdoaWxlICgwKQotI2RlZmluZSBNX0NQX1NUUkFSUkFZT1BUKHgsIG54KSBkbyB7IFwKLQkJZm9yIChpID0gMDsgaSA8IG5ld29wdHMtPm54OyBpKyspIFwKLQkJCW5ld29wdHMtPnhbaV0gPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7IFwKLQl9IHdoaWxlICgwKQotCS8qIFNlZSBjb21tZW50IGluIHNlcnZjb25mLmggKi8KLQlDT1BZX01BVENIX1NUUklOR19PUFRTKCk7Ci0jdW5kZWYgTV9DUF9TVFJPUFQKLSN1bmRlZiBNX0NQX1NUUkFSUkFZT1BUCi0KLQljb3B5X3NldF9zZXJ2ZXJfb3B0aW9ucygmb3B0aW9ucywgbmV3b3B0cywgMSk7Ci0JeGZyZWUobmV3b3B0cyk7Ci0KLQlidWZmZXJfZnJlZSgmbSk7Ci0KLQlyZXR1cm4gKHB3KTsKLX0KLQotY2hhciAqCi1tbV9hdXRoMl9yZWFkX2Jhbm5lcih2b2lkKQotewotCUJ1ZmZlciBtOwotCWNoYXIgKmJhbm5lcjsKLQotCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQlidWZmZXJfaW5pdCgmbSk7Ci0JbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfQVVUSDJfUkVBRF9CQU5ORVIsICZtKTsKLQlidWZmZXJfY2xlYXIoJm0pOwotCi0JbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsCi0JICAgIE1PTklUT1JfQU5TX0FVVEgyX1JFQURfQkFOTkVSLCAmbSk7Ci0JYmFubmVyID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOwotCWJ1ZmZlcl9mcmVlKCZtKTsKLQotCS8qIHRyZWF0IGVtcHR5IGJhbm5lciBhcyBtaXNzaW5nIGJhbm5lciAqLwotCWlmIChzdHJsZW4oYmFubmVyKSA9PSAwKSB7Ci0JCXhmcmVlKGJhbm5lcik7Ci0JCWJhbm5lciA9IE5VTEw7Ci0JfQotCXJldHVybiAoYmFubmVyKTsKLX0KLQotLyogSW5mb3JtIHRoZSBwcml2aWxlZ2VkIHByb2Nlc3MgYWJvdXQgc2VydmljZSBhbmQgc3R5bGUgKi8KLQotdm9pZAotbW1faW5mb3JtX2F1dGhzZXJ2KGNoYXIgKnNlcnZpY2UsIGNoYXIgKnN0eWxlKQotewotCUJ1ZmZlciBtOwotCi0JZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm0sIHNlcnZpY2UpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgc3R5bGUgPyBzdHlsZSA6ICIiKTsKLQotCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX0FVVEhTRVJWLCAmbSk7Ci0KLQlidWZmZXJfZnJlZSgmbSk7Ci19Ci0KLS8qIERvIHRoZSBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiAqLwotaW50Ci1tbV9hdXRoX3Bhc3N3b3JkKEF1dGhjdHh0ICphdXRoY3R4dCwgY2hhciAqcGFzc3dvcmQpCi17Ci0JQnVmZmVyIG07Ci0JaW50IGF1dGhlbnRpY2F0ZWQgPSAwOwotCi0JZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm0sIHBhc3N3b3JkKTsKLQltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9BVVRIUEFTU1dPUkQsICZtKTsKLQotCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX0FVVEhQQVNTV09SRCIsIF9fZnVuY19fKTsKLQltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfQVVUSFBBU1NXT1JELCAmbSk7Ci0KLQlhdXRoZW50aWNhdGVkID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCi0JYnVmZmVyX2ZyZWUoJm0pOwotCi0JZGVidWczKCIlczogdXNlciAlc2F1dGhlbnRpY2F0ZWQiLAotCSAgICBfX2Z1bmNfXywgYXV0aGVudGljYXRlZCA/ICIiIDogIm5vdCAiKTsKLQlyZXR1cm4gKGF1dGhlbnRpY2F0ZWQpOwotfQotCi1pbnQKLW1tX3VzZXJfa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqcHcsIEtleSAqa2V5KQotewotCXJldHVybiAobW1fa2V5X2FsbG93ZWQoTU1fVVNFUktFWSwgTlVMTCwgTlVMTCwga2V5KSk7Ci19Ci0KLWludAotbW1faG9zdGJhc2VkX2tleV9hbGxvd2VkKHN0cnVjdCBwYXNzd2QgKnB3LCBjaGFyICp1c2VyLCBjaGFyICpob3N0LAotICAgIEtleSAqa2V5KQotewotCXJldHVybiAobW1fa2V5X2FsbG93ZWQoTU1fSE9TVEtFWSwgdXNlciwgaG9zdCwga2V5KSk7Ci19Ci0KLWludAotbW1fYXV0aF9yaG9zdHNfcnNhX2tleV9hbGxvd2VkKHN0cnVjdCBwYXNzd2QgKnB3LCBjaGFyICp1c2VyLAotICAgIGNoYXIgKmhvc3QsIEtleSAqa2V5KQotewotCWludCByZXQ7Ci0KLQlrZXktPnR5cGUgPSBLRVlfUlNBOyAvKiBYWFggaGFjayBmb3Iga2V5X3RvX2Jsb2IgKi8KLQlyZXQgPSBtbV9rZXlfYWxsb3dlZChNTV9SU0FIT1NUS0VZLCB1c2VyLCBob3N0LCBrZXkpOwotCWtleS0+dHlwZSA9IEtFWV9SU0ExOwotCXJldHVybiAocmV0KTsKLX0KLQotaW50Ci1tbV9rZXlfYWxsb3dlZChlbnVtIG1tX2tleXR5cGUgdHlwZSwgY2hhciAqdXNlciwgY2hhciAqaG9zdCwgS2V5ICprZXkpCi17Ci0JQnVmZmVyIG07Ci0JdV9jaGFyICpibG9iOwotCXVfaW50IGxlbjsKLQlpbnQgYWxsb3dlZCA9IDAsIGhhdmVfZm9yY2VkID0gMDsKLQotCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQkvKiBDb252ZXJ0IHRoZSBrZXkgdG8gYSBibG9iIGFuZCB0aGUgcGFzcyBpdCBvdmVyICovCi0JaWYgKCFrZXlfdG9fYmxvYihrZXksICZibG9iLCAmbGVuKSkKLQkJcmV0dXJuICgwKTsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQlidWZmZXJfcHV0X2ludCgmbSwgdHlwZSk7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtLCB1c2VyID8gdXNlciA6ICIiKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm0sIGhvc3QgPyBob3N0IDogIiIpOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBibG9iLCBsZW4pOwotCXhmcmVlKGJsb2IpOwotCi0JbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfS0VZQUxMT1dFRCwgJm0pOwotCi0JZGVidWczKCIlczogd2FpdGluZyBmb3IgTU9OSVRPUl9BTlNfS0VZQUxMT1dFRCIsIF9fZnVuY19fKTsKLQltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfS0VZQUxMT1dFRCwgJm0pOwotCi0JYWxsb3dlZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQotCS8qIGZha2UgZm9yY2VkIGNvbW1hbmQgKi8KLQlhdXRoX2NsZWFyX29wdGlvbnMoKTsKLQloYXZlX2ZvcmNlZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQlmb3JjZWRfY29tbWFuZCA9IGhhdmVfZm9yY2VkID8geHN0cmR1cCgidHJ1ZSIpIDogTlVMTDsKLQotCWJ1ZmZlcl9mcmVlKCZtKTsKLQotCXJldHVybiAoYWxsb3dlZCk7Ci19Ci0KLS8qCi0gKiBUaGlzIGtleSB2ZXJpZnkgbmVlZHMgdG8gc2VuZCB0aGUga2V5IHR5cGUgYWxvbmcsIGJlY2F1c2UgdGhlCi0gKiBwcml2aWxlZ2VkIHBhcmVudCBtYWtlcyB0aGUgZGVjaXNpb24gaWYgdGhlIGtleSBpcyBhbGxvd2VkCi0gKiBmb3IgYXV0aGVudGljYXRpb24uCi0gKi8KLQotaW50Ci1tbV9rZXlfdmVyaWZ5KEtleSAqa2V5LCB1X2NoYXIgKnNpZywgdV9pbnQgc2lnbGVuLCB1X2NoYXIgKmRhdGEsIHVfaW50IGRhdGFsZW4pCi17Ci0JQnVmZmVyIG07Ci0JdV9jaGFyICpibG9iOwotCXVfaW50IGxlbjsKLQlpbnQgdmVyaWZpZWQgPSAwOwotCi0JZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQotCS8qIENvbnZlcnQgdGhlIGtleSB0byBhIGJsb2IgYW5kIHRoZSBwYXNzIGl0IG92ZXIgKi8KLQlpZiAoIWtleV90b19ibG9iKGtleSwgJmJsb2IsICZsZW4pKQotCQlyZXR1cm4gKDApOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBibG9iLCBsZW4pOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBzaWcsIHNpZ2xlbik7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJm0sIGRhdGEsIGRhdGFsZW4pOwotCXhmcmVlKGJsb2IpOwotCi0JbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfS0VZVkVSSUZZLCAmbSk7Ci0KLQlkZWJ1ZzMoIiVzOiB3YWl0aW5nIGZvciBNT05JVE9SX0FOU19LRVlWRVJJRlkiLCBfX2Z1bmNfXyk7Ci0JbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfQU5TX0tFWVZFUklGWSwgJm0pOwotCi0JdmVyaWZpZWQgPSBidWZmZXJfZ2V0X2ludCgmbSk7Ci0KLQlidWZmZXJfZnJlZSgmbSk7Ci0KLQlyZXR1cm4gKHZlcmlmaWVkKTsKLX0KLQotLyogRXhwb3J0IGtleSBzdGF0ZSBhZnRlciBhdXRoZW50aWNhdGlvbiAqLwotTmV3a2V5cyAqCi1tbV9uZXdrZXlzX2Zyb21fYmxvYih1X2NoYXIgKmJsb2IsIGludCBibGVuKQotewotCUJ1ZmZlciBiOwotCXVfaW50IGxlbjsKLQlOZXdrZXlzICpuZXdrZXkgPSBOVUxMOwotCUVuYyAqZW5jOwotCU1hYyAqbWFjOwotCUNvbXAgKmNvbXA7Ci0KLQlkZWJ1ZzMoIiVzOiAlcCglZCkiLCBfX2Z1bmNfXywgYmxvYiwgYmxlbik7Ci0jaWZkZWYgREVCVUdfUEsKLQlkdW1wX2Jhc2U2NChzdGRlcnIsIGJsb2IsIGJsZW4pOwotI2VuZGlmCi0JYnVmZmVyX2luaXQoJmIpOwotCWJ1ZmZlcl9hcHBlbmQoJmIsIGJsb2IsIGJsZW4pOwotCi0JbmV3a2V5ID0geG1hbGxvYyhzaXplb2YoKm5ld2tleSkpOwotCWVuYyA9ICZuZXdrZXktPmVuYzsKLQltYWMgPSAmbmV3a2V5LT5tYWM7Ci0JY29tcCA9ICZuZXdrZXktPmNvbXA7Ci0KLQkvKiBFbmMgc3RydWN0dXJlICovCi0JZW5jLT5uYW1lID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsIE5VTEwpOwotCWJ1ZmZlcl9nZXQoJmIsICZlbmMtPmNpcGhlciwgc2l6ZW9mKGVuYy0+Y2lwaGVyKSk7Ci0JZW5jLT5lbmFibGVkID0gYnVmZmVyX2dldF9pbnQoJmIpOwotCWVuYy0+YmxvY2tfc2l6ZSA9IGJ1ZmZlcl9nZXRfaW50KCZiKTsKLQllbmMtPmtleSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCAmZW5jLT5rZXlfbGVuKTsKLQllbmMtPml2ID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsICZsZW4pOwotCWlmIChsZW4gIT0gZW5jLT5ibG9ja19zaXplKQotCQlmYXRhbCgiJXM6IGJhZCBpdmxlbjogZXhwZWN0ZWQgJXUgIT0gJXUiLCBfX2Z1bmNfXywKLQkJICAgIGVuYy0+YmxvY2tfc2l6ZSwgbGVuKTsKLQotCWlmIChlbmMtPm5hbWUgPT0gTlVMTCB8fCBjaXBoZXJfYnlfbmFtZShlbmMtPm5hbWUpICE9IGVuYy0+Y2lwaGVyKQotCQlmYXRhbCgiJXM6IGJhZCBjaXBoZXIgbmFtZSAlcyBvciBwb2ludGVyICVwIiwgX19mdW5jX18sCi0JCSAgICBlbmMtPm5hbWUsIGVuYy0+Y2lwaGVyKTsKLQotCS8qIE1hYyBzdHJ1Y3R1cmUgKi8KLQltYWMtPm5hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7Ci0JaWYgKG1hYy0+bmFtZSA9PSBOVUxMIHx8IG1hY19zZXR1cChtYWMsIG1hYy0+bmFtZSkgPT0gLTEpCi0JCWZhdGFsKCIlczogY2FuIG5vdCBzZXR1cCBtYWMgJXMiLCBfX2Z1bmNfXywgbWFjLT5uYW1lKTsKLQltYWMtPmVuYWJsZWQgPSBidWZmZXJfZ2V0X2ludCgmYik7Ci0JbWFjLT5rZXkgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgJmxlbik7Ci0JaWYgKGxlbiA+IG1hYy0+a2V5X2xlbikKLQkJZmF0YWwoIiVzOiBiYWQgbWFjIGtleSBsZW5ndGg6ICV1ID4gJWQiLCBfX2Z1bmNfXywgbGVuLAotCQkgICAgbWFjLT5rZXlfbGVuKTsKLQltYWMtPmtleV9sZW4gPSBsZW47Ci0KLQkvKiBDb21wIHN0cnVjdHVyZSAqLwotCWNvbXAtPnR5cGUgPSBidWZmZXJfZ2V0X2ludCgmYik7Ci0JY29tcC0+ZW5hYmxlZCA9IGJ1ZmZlcl9nZXRfaW50KCZiKTsKLQljb21wLT5uYW1lID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsIE5VTEwpOwotCi0JbGVuID0gYnVmZmVyX2xlbigmYik7Ci0JaWYgKGxlbiAhPSAwKQotCQllcnJvcigibmV3a2V5c19mcm9tX2Jsb2I6IHJlbWFpbmluZyBieXRlcyBpbiBibG9iICV1IiwgbGVuKTsKLQlidWZmZXJfZnJlZSgmYik7Ci0JcmV0dXJuIChuZXdrZXkpOwotfQotCi1pbnQKLW1tX25ld2tleXNfdG9fYmxvYihpbnQgbW9kZSwgdV9jaGFyICoqYmxvYnAsIHVfaW50ICpsZW5wKQotewotCUJ1ZmZlciBiOwotCWludCBsZW47Ci0JRW5jICplbmM7Ci0JTWFjICptYWM7Ci0JQ29tcCAqY29tcDsKLQlOZXdrZXlzICpuZXdrZXkgPSAoTmV3a2V5cyAqKXBhY2tldF9nZXRfbmV3a2V5cyhtb2RlKTsKLQotCWRlYnVnMygiJXM6IGNvbnZlcnRpbmcgJXAiLCBfX2Z1bmNfXywgbmV3a2V5KTsKLQotCWlmIChuZXdrZXkgPT0gTlVMTCkgewotCQllcnJvcigiJXM6IG5ld2tleSA9PSBOVUxMIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0JZW5jID0gJm5ld2tleS0+ZW5jOwotCW1hYyA9ICZuZXdrZXktPm1hYzsKLQljb21wID0gJm5ld2tleS0+Y29tcDsKLQotCWJ1ZmZlcl9pbml0KCZiKTsKLQkvKiBFbmMgc3RydWN0dXJlICovCi0JYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBlbmMtPm5hbWUpOwotCS8qIFRoZSBjaXBoZXIgc3RydWN0IGlzIGNvbnN0YW50IGFuZCBzaGFyZWQsIHlvdSBleHBvcnQgcG9pbnRlciAqLwotCWJ1ZmZlcl9hcHBlbmQoJmIsICZlbmMtPmNpcGhlciwgc2l6ZW9mKGVuYy0+Y2lwaGVyKSk7Ci0JYnVmZmVyX3B1dF9pbnQoJmIsIGVuYy0+ZW5hYmxlZCk7Ci0JYnVmZmVyX3B1dF9pbnQoJmIsIGVuYy0+YmxvY2tfc2l6ZSk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJmIsIGVuYy0+a2V5LCBlbmMtPmtleV9sZW4pOwotCXBhY2tldF9nZXRfa2V5aXYobW9kZSwgZW5jLT5pdiwgZW5jLT5ibG9ja19zaXplKTsKLQlidWZmZXJfcHV0X3N0cmluZygmYiwgZW5jLT5pdiwgZW5jLT5ibG9ja19zaXplKTsKLQotCS8qIE1hYyBzdHJ1Y3R1cmUgKi8KLQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIG1hYy0+bmFtZSk7Ci0JYnVmZmVyX3B1dF9pbnQoJmIsIG1hYy0+ZW5hYmxlZCk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJmIsIG1hYy0+a2V5LCBtYWMtPmtleV9sZW4pOwotCi0JLyogQ29tcCBzdHJ1Y3R1cmUgKi8KLQlidWZmZXJfcHV0X2ludCgmYiwgY29tcC0+dHlwZSk7Ci0JYnVmZmVyX3B1dF9pbnQoJmIsIGNvbXAtPmVuYWJsZWQpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgY29tcC0+bmFtZSk7Ci0KLQlsZW4gPSBidWZmZXJfbGVuKCZiKTsKLQlpZiAobGVucCAhPSBOVUxMKQotCQkqbGVucCA9IGxlbjsKLQlpZiAoYmxvYnAgIT0gTlVMTCkgewotCQkqYmxvYnAgPSB4bWFsbG9jKGxlbik7Ci0JCW1lbWNweSgqYmxvYnAsIGJ1ZmZlcl9wdHIoJmIpLCBsZW4pOwotCX0KLQltZW1zZXQoYnVmZmVyX3B0cigmYiksIDAsIGxlbik7Ci0JYnVmZmVyX2ZyZWUoJmIpOwotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyB2b2lkCi1tbV9zZW5kX2tleChCdWZmZXIgKm0sIEtleCAqa2V4KQotewotCWJ1ZmZlcl9wdXRfc3RyaW5nKG0sIGtleC0+c2Vzc2lvbl9pZCwga2V4LT5zZXNzaW9uX2lkX2xlbik7Ci0JYnVmZmVyX3B1dF9pbnQobSwga2V4LT53ZV9uZWVkKTsKLQlidWZmZXJfcHV0X2ludChtLCBrZXgtPmhvc3RrZXlfdHlwZSk7Ci0JYnVmZmVyX3B1dF9pbnQobSwga2V4LT5rZXhfdHlwZSk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcobSwgYnVmZmVyX3B0cigma2V4LT5teSksIGJ1ZmZlcl9sZW4oJmtleC0+bXkpKTsKLQlidWZmZXJfcHV0X3N0cmluZyhtLCBidWZmZXJfcHRyKCZrZXgtPnBlZXIpLCBidWZmZXJfbGVuKCZrZXgtPnBlZXIpKTsKLQlidWZmZXJfcHV0X2ludChtLCBrZXgtPmZsYWdzKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcobSwga2V4LT5jbGllbnRfdmVyc2lvbl9zdHJpbmcpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZyhtLCBrZXgtPnNlcnZlcl92ZXJzaW9uX3N0cmluZyk7Ci19Ci0KLXZvaWQKLW1tX3NlbmRfa2V5c3RhdGUoc3RydWN0IG1vbml0b3IgKm1vbml0b3IpCi17Ci0JQnVmZmVyIG0sICppbnB1dCwgKm91dHB1dDsKLQl1X2NoYXIgKmJsb2IsICpwOwotCXVfaW50IGJsb2JsZW4sIHBsZW47Ci0JdV9pbnQzMl90IHNlcW5yLCBwYWNrZXRzOwotCXVfaW50NjRfdCBibG9ja3MsIGJ5dGVzOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCi0JaWYgKCFjb21wYXQyMCkgewotCQl1X2NoYXIgaXZbMjRdOwotCQl1X2NoYXIgKmtleTsKLQkJdV9pbnQgaXZsZW4sIGtleWxlbjsKLQotCQlidWZmZXJfcHV0X2ludCgmbSwgcGFja2V0X2dldF9wcm90b2NvbF9mbGFncygpKTsKLQotCQlidWZmZXJfcHV0X2ludCgmbSwgcGFja2V0X2dldF9zc2gxX2NpcGhlcigpKTsKLQotCQlkZWJ1ZzMoIiVzOiBTZW5kaW5nIHNzaDEgS0VZK0lWIiwgX19mdW5jX18pOwotCQlrZXlsZW4gPSBwYWNrZXRfZ2V0X2VuY3J5cHRpb25fa2V5KE5VTEwpOwotCQlrZXkgPSB4bWFsbG9jKGtleWxlbisxKTsJLyogYWRkIDEgaWYga2V5bGVuID09IDAgKi8KLQkJa2V5bGVuID0gcGFja2V0X2dldF9lbmNyeXB0aW9uX2tleShrZXkpOwotCQlidWZmZXJfcHV0X3N0cmluZygmbSwga2V5LCBrZXlsZW4pOwotCQltZW1zZXQoa2V5LCAwLCBrZXlsZW4pOwotCQl4ZnJlZShrZXkpOwotCi0JCWl2bGVuID0gcGFja2V0X2dldF9rZXlpdl9sZW4oTU9ERV9PVVQpOwotCQlwYWNrZXRfZ2V0X2tleWl2KE1PREVfT1VULCBpdiwgaXZsZW4pOwotCQlidWZmZXJfcHV0X3N0cmluZygmbSwgaXYsIGl2bGVuKTsKLQkJaXZsZW4gPSBwYWNrZXRfZ2V0X2tleWl2X2xlbihNT0RFX09VVCk7Ci0JCXBhY2tldF9nZXRfa2V5aXYoTU9ERV9JTiwgaXYsIGl2bGVuKTsKLQkJYnVmZmVyX3B1dF9zdHJpbmcoJm0sIGl2LCBpdmxlbik7Ci0JCWdvdG8gc2tpcDsKLQl9IGVsc2UgewotCQkvKiBLZXggZm9yIHJla2V5aW5nICovCi0JCW1tX3NlbmRfa2V4KCZtLCAqbW9uaXRvci0+bV9wa2V4KTsKLQl9Ci0KLQlkZWJ1ZzMoIiVzOiBTZW5kaW5nIG5ldyBrZXlzOiAlcCAlcCIsCi0JICAgIF9fZnVuY19fLCBwYWNrZXRfZ2V0X25ld2tleXMoTU9ERV9PVVQpLAotCSAgICBwYWNrZXRfZ2V0X25ld2tleXMoTU9ERV9JTikpOwotCi0JLyogS2V5cyBmcm9tIEtleCAqLwotCWlmICghbW1fbmV3a2V5c190b19ibG9iKE1PREVfT1VULCAmYmxvYiwgJmJsb2JsZW4pKQotCQlmYXRhbCgiJXM6IGNvbnZlcnNpb24gb2YgbmV3a2V5cyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0KLQlidWZmZXJfcHV0X3N0cmluZygmbSwgYmxvYiwgYmxvYmxlbik7Ci0JeGZyZWUoYmxvYik7Ci0KLQlpZiAoIW1tX25ld2tleXNfdG9fYmxvYihNT0RFX0lOLCAmYmxvYiwgJmJsb2JsZW4pKQotCQlmYXRhbCgiJXM6IGNvbnZlcnNpb24gb2YgbmV3a2V5cyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0KLQlidWZmZXJfcHV0X3N0cmluZygmbSwgYmxvYiwgYmxvYmxlbik7Ci0JeGZyZWUoYmxvYik7Ci0KLQlwYWNrZXRfZ2V0X3N0YXRlKE1PREVfT1VULCAmc2VxbnIsICZibG9ja3MsICZwYWNrZXRzLCAmYnl0ZXMpOwotCWJ1ZmZlcl9wdXRfaW50KCZtLCBzZXFucik7Ci0JYnVmZmVyX3B1dF9pbnQ2NCgmbSwgYmxvY2tzKTsKLQlidWZmZXJfcHV0X2ludCgmbSwgcGFja2V0cyk7Ci0JYnVmZmVyX3B1dF9pbnQ2NCgmbSwgYnl0ZXMpOwotCXBhY2tldF9nZXRfc3RhdGUoTU9ERV9JTiwgJnNlcW5yLCAmYmxvY2tzLCAmcGFja2V0cywgJmJ5dGVzKTsKLQlidWZmZXJfcHV0X2ludCgmbSwgc2VxbnIpOwotCWJ1ZmZlcl9wdXRfaW50NjQoJm0sIGJsb2Nrcyk7Ci0JYnVmZmVyX3B1dF9pbnQoJm0sIHBhY2tldHMpOwotCWJ1ZmZlcl9wdXRfaW50NjQoJm0sIGJ5dGVzKTsKLQotCWRlYnVnMygiJXM6IE5ldyBrZXlzIGhhdmUgYmVlbiBzZW50IiwgX19mdW5jX18pOwotIHNraXA6Ci0JLyogTW9yZSBrZXkgY29udGV4dCAqLwotCXBsZW4gPSBwYWNrZXRfZ2V0X2tleWNvbnRleHQoTU9ERV9PVVQsIE5VTEwpOwotCXAgPSB4bWFsbG9jKHBsZW4rMSk7Ci0JcGFja2V0X2dldF9rZXljb250ZXh0KE1PREVfT1VULCBwKTsKLQlidWZmZXJfcHV0X3N0cmluZygmbSwgcCwgcGxlbik7Ci0JeGZyZWUocCk7Ci0KLQlwbGVuID0gcGFja2V0X2dldF9rZXljb250ZXh0KE1PREVfSU4sIE5VTEwpOwotCXAgPSB4bWFsbG9jKHBsZW4rMSk7Ci0JcGFja2V0X2dldF9rZXljb250ZXh0KE1PREVfSU4sIHApOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBwLCBwbGVuKTsKLQl4ZnJlZShwKTsKLQotCS8qIENvbXByZXNzaW9uIHN0YXRlICovCi0JZGVidWczKCIlczogU2VuZGluZyBjb21wcmVzc2lvbiBzdGF0ZSIsIF9fZnVuY19fKTsKLQlidWZmZXJfcHV0X3N0cmluZygmbSwgJm91dGdvaW5nX3N0cmVhbSwgc2l6ZW9mKG91dGdvaW5nX3N0cmVhbSkpOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCAmaW5jb21pbmdfc3RyZWFtLCBzaXplb2YoaW5jb21pbmdfc3RyZWFtKSk7Ci0KLQkvKiBOZXR3b3JrIEkvTyBidWZmZXJzICovCi0JaW5wdXQgPSAoQnVmZmVyICopcGFja2V0X2dldF9pbnB1dCgpOwotCW91dHB1dCA9IChCdWZmZXIgKilwYWNrZXRfZ2V0X291dHB1dCgpOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBidWZmZXJfcHRyKGlucHV0KSwgYnVmZmVyX2xlbihpbnB1dCkpOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBidWZmZXJfcHRyKG91dHB1dCksIGJ1ZmZlcl9sZW4ob3V0cHV0KSk7Ci0KLQkvKiBSb2FtaW5nICovCi0JaWYgKGNvbXBhdDIwKSB7Ci0JCWJ1ZmZlcl9wdXRfaW50NjQoJm0sIGdldF9zZW50X2J5dGVzKCkpOwotCQlidWZmZXJfcHV0X2ludDY0KCZtLCBnZXRfcmVjdl9ieXRlcygpKTsKLQl9Ci0KLQltbV9yZXF1ZXN0X3NlbmQobW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX0tFWUVYUE9SVCwgJm0pOwotCWRlYnVnMygiJXM6IEZpbmlzaGVkIHNlbmRpbmcgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0KLQlidWZmZXJfZnJlZSgmbSk7Ci19Ci0KLWludAotbW1fcHR5X2FsbG9jYXRlKGludCAqcHR5ZmQsIGludCAqdHR5ZmQsIGNoYXIgKm5hbWVidWYsIHNpemVfdCBuYW1lYnVmbGVuKQotewotCUJ1ZmZlciBtOwotCWNoYXIgKnAsICptc2c7Ci0JaW50IHN1Y2Nlc3MgPSAwLCB0bXAxID0gLTEsIHRtcDIgPSAtMTsKLQotCS8qIEtsdWRnZTogZW5zdXJlIHRoZXJlIGFyZSBmZHMgZnJlZSB0byByZWNlaXZlIHRoZSBwdHkvdHR5ICovCi0JaWYgKCh0bXAxID0gZHVwKHBtb25pdG9yLT5tX3JlY3ZmZCkpID09IC0xIHx8Ci0JICAgICh0bXAyID0gZHVwKHBtb25pdG9yLT5tX3JlY3ZmZCkpID09IC0xKSB7Ci0JCWVycm9yKCIlczogY2Fubm90IGFsbG9jYXRlIGZkcyBmb3IgcHR5IiwgX19mdW5jX18pOwotCQlpZiAodG1wMSA+IDApCi0JCQljbG9zZSh0bXAxKTsKLQkJaWYgKHRtcDIgPiAwKQotCQkJY2xvc2UodG1wMik7Ci0JCXJldHVybiAwOwotCX0KLQljbG9zZSh0bXAxKTsKLQljbG9zZSh0bXAyKTsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9QVFksICZtKTsKLQotCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX1BUWSIsIF9fZnVuY19fKTsKLQltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfUFRZLCAmbSk7Ci0KLQlzdWNjZXNzID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCWlmIChzdWNjZXNzID09IDApIHsKLQkJZGVidWczKCIlczogcHR5IGFsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJYnVmZmVyX2ZyZWUoJm0pOwotCQlyZXR1cm4gKDApOwotCX0KLQlwID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOwotCW1zZyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQlidWZmZXJfZnJlZSgmbSk7Ci0KLQlzdHJsY3B5KG5hbWVidWYsIHAsIG5hbWVidWZsZW4pOyAvKiBQb3NzaWJsZSB0cnVuY2F0aW9uICovCi0JeGZyZWUocCk7Ci0KLQlidWZmZXJfYXBwZW5kKCZsb2dpbm1zZywgbXNnLCBzdHJsZW4obXNnKSk7Ci0JeGZyZWUobXNnKTsKLQotCWlmICgoKnB0eWZkID0gbW1fcmVjZWl2ZV9mZChwbW9uaXRvci0+bV9yZWN2ZmQpKSA9PSAtMSB8fAotCSAgICAoKnR0eWZkID0gbW1fcmVjZWl2ZV9mZChwbW9uaXRvci0+bV9yZWN2ZmQpKSA9PSAtMSkKLQkJZmF0YWwoIiVzOiByZWNlaXZlIGZkcyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0KLQkvKiBTdWNjZXNzICovCi0JcmV0dXJuICgxKTsKLX0KLQotdm9pZAotbW1fc2Vzc2lvbl9wdHlfY2xlYW51cDIoU2Vzc2lvbiAqcykKLXsKLQlCdWZmZXIgbTsKLQotCWlmIChzLT50dHlmZCA9PSAtMSkKLQkJcmV0dXJuOwotCWJ1ZmZlcl9pbml0KCZtKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm0sIHMtPnR0eSk7Ci0JbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfUFRZQ0xFQU5VUCwgJm0pOwotCWJ1ZmZlcl9mcmVlKCZtKTsKLQotCS8qIGNsb3NlZCBkdXAnZWQgbWFzdGVyICovCi0JaWYgKHMtPnB0eW1hc3RlciAhPSAtMSAmJiBjbG9zZShzLT5wdHltYXN0ZXIpIDwgMCkKLQkJZXJyb3IoImNsb3NlKHMtPnB0eW1hc3Rlci8lZCk6ICVzIiwKLQkJICAgIHMtPnB0eW1hc3Rlciwgc3RyZXJyb3IoZXJybm8pKTsKLQotCS8qIHVubGluayBwdHkgZnJvbSBzZXNzaW9uICovCi0Jcy0+dHR5ZmQgPSAtMTsKLX0KLQotI2lmZGVmIFVTRV9QQU0KLXZvaWQKLW1tX3N0YXJ0X3BhbShBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0JQnVmZmVyIG07Ci0KLQlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOwotCWlmICghb3B0aW9ucy51c2VfcGFtKQotCQlmYXRhbCgiVXNlUEFNPW5vLCBidXQgZW5kZWQgdXAgaW4gJXMgYW55d2F5IiwgX19mdW5jX18pOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX1BBTV9TVEFSVCwgJm0pOwotCi0JYnVmZmVyX2ZyZWUoJm0pOwotfQotCi11X2ludAotbW1fZG9fcGFtX2FjY291bnQodm9pZCkKLXsKLQlCdWZmZXIgbTsKLQl1X2ludCByZXQ7Ci0JY2hhciAqbXNnOwotCi0JZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQlpZiAoIW9wdGlvbnMudXNlX3BhbSkKLQkJZmF0YWwoIlVzZVBBTT1ubywgYnV0IGVuZGVkIHVwIGluICVzIGFueXdheSIsIF9fZnVuY19fKTsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9QQU1fQUNDT1VOVCwgJm0pOwotCi0JbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsCi0JICAgIE1PTklUT1JfQU5TX1BBTV9BQ0NPVU5ULCAmbSk7Ci0JcmV0ID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCW1zZyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQlidWZmZXJfYXBwZW5kKCZsb2dpbm1zZywgbXNnLCBzdHJsZW4obXNnKSk7Ci0JeGZyZWUobXNnKTsKLQotCWJ1ZmZlcl9mcmVlKCZtKTsKLQotCWRlYnVnMygiJXMgcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gKHJldCk7Ci19Ci0KLXZvaWQgKgotbW1fc3NocGFtX2luaXRfY3R4KEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlCdWZmZXIgbTsKLQlpbnQgc3VjY2VzczsKLQotCWRlYnVnMygiJXMiLCBfX2Z1bmNfXyk7Ci0JYnVmZmVyX2luaXQoJm0pOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgYXV0aGN0eHQtPnVzZXIpOwotCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX1BBTV9JTklUX0NUWCwgJm0pOwotCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX1BBTV9JTklUX0NUWCIsIF9fZnVuY19fKTsKLQltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfUEFNX0lOSVRfQ1RYLCAmbSk7Ci0Jc3VjY2VzcyA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQlpZiAoc3VjY2VzcyA9PSAwKSB7Ci0JCWRlYnVnMygiJXM6IHBhbV9pbml0X2N0eCBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCWJ1ZmZlcl9mcmVlKCZtKTsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JYnVmZmVyX2ZyZWUoJm0pOwotCXJldHVybiAoYXV0aGN0eHQpOwotfQotCi1pbnQKLW1tX3NzaHBhbV9xdWVyeSh2b2lkICpjdHgsIGNoYXIgKipuYW1lLCBjaGFyICoqaW5mbywKLSAgICB1X2ludCAqbnVtLCBjaGFyICoqKnByb21wdHMsIHVfaW50ICoqZWNob19vbikKLXsKLQlCdWZmZXIgbTsKLQl1X2ludCBpOwotCWludCByZXQ7Ci0KLQlkZWJ1ZzMoIiVzIiwgX19mdW5jX18pOwotCWJ1ZmZlcl9pbml0KCZtKTsKLQltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9QQU1fUVVFUlksICZtKTsKLQlkZWJ1ZzMoIiVzOiB3YWl0aW5nIGZvciBNT05JVE9SX0FOU19QQU1fUVVFUlkiLCBfX2Z1bmNfXyk7Ci0JbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfQU5TX1BBTV9RVUVSWSwgJm0pOwotCXJldCA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQlkZWJ1ZzMoIiVzOiBwYW1fcXVlcnkgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgcmV0KTsKLQkqbmFtZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQkqaW5mbyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQkqbnVtID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCWlmICgqbnVtID4gUEFNX01BWF9OVU1fTVNHKQotCQlmYXRhbCgiJXM6IHJlY2lldmVkICV1IFBBTSBtZXNzYWdlcywgZXhwZWN0ZWQgPD0gJXUiLAotCQkgICAgX19mdW5jX18sICpudW0sIFBBTV9NQVhfTlVNX01TRyk7Ci0JKnByb21wdHMgPSB4Y2FsbG9jKCgqbnVtICsgMSksIHNpemVvZihjaGFyICopKTsKLQkqZWNob19vbiA9IHhjYWxsb2MoKCpudW0gKyAxKSwgc2l6ZW9mKHVfaW50KSk7Ci0JZm9yIChpID0gMDsgaSA8ICpudW07ICsraSkgewotCQkoKnByb21wdHMpW2ldID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOwotCQkoKmVjaG9fb24pW2ldID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCX0KLQlidWZmZXJfZnJlZSgmbSk7Ci0JcmV0dXJuIChyZXQpOwotfQotCi1pbnQKLW1tX3NzaHBhbV9yZXNwb25kKHZvaWQgKmN0eCwgdV9pbnQgbnVtLCBjaGFyICoqcmVzcCkKLXsKLQlCdWZmZXIgbTsKLQl1X2ludCBpOwotCWludCByZXQ7Ci0KLQlkZWJ1ZzMoIiVzIiwgX19mdW5jX18pOwotCWJ1ZmZlcl9pbml0KCZtKTsKLQlidWZmZXJfcHV0X2ludCgmbSwgbnVtKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpCi0JCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgcmVzcFtpXSk7Ci0JbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfUEFNX1JFU1BPTkQsICZtKTsKLQlkZWJ1ZzMoIiVzOiB3YWl0aW5nIGZvciBNT05JVE9SX0FOU19QQU1fUkVTUE9ORCIsIF9fZnVuY19fKTsKLQltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfUEFNX1JFU1BPTkQsICZtKTsKLQlyZXQgPSBidWZmZXJfZ2V0X2ludCgmbSk7Ci0JZGVidWczKCIlczogcGFtX3Jlc3BvbmQgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgcmV0KTsKLQlidWZmZXJfZnJlZSgmbSk7Ci0JcmV0dXJuIChyZXQpOwotfQotCi12b2lkCi1tbV9zc2hwYW1fZnJlZV9jdHgodm9pZCAqY3R4dHApCi17Ci0JQnVmZmVyIG07Ci0KLQlkZWJ1ZzMoIiVzIiwgX19mdW5jX18pOwotCWJ1ZmZlcl9pbml0KCZtKTsKLQltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9QQU1fRlJFRV9DVFgsICZtKTsKLQlkZWJ1ZzMoIiVzOiB3YWl0aW5nIGZvciBNT05JVE9SX0FOU19QQU1fRlJFRV9DVFgiLCBfX2Z1bmNfXyk7Ci0JbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfQU5TX1BBTV9GUkVFX0NUWCwgJm0pOwotCWJ1ZmZlcl9mcmVlKCZtKTsKLX0KLSNlbmRpZiAvKiBVU0VfUEFNICovCi0KLS8qIFJlcXVlc3QgcHJvY2VzcyB0ZXJtaW5hdGlvbiAqLwotCi12b2lkCi1tbV90ZXJtaW5hdGUodm9pZCkKLXsKLQlCdWZmZXIgbTsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9URVJNLCAmbSk7Ci0JYnVmZmVyX2ZyZWUoJm0pOwotfQotCi1pbnQKLW1tX3NzaDFfc2Vzc2lvbl9rZXkoQklHTlVNICpudW0pCi17Ci0JaW50IHJzYWZhaWw7Ci0JQnVmZmVyIG07Ci0KLQlidWZmZXJfaW5pdCgmbSk7Ci0JYnVmZmVyX3B1dF9iaWdudW0yKCZtLCBudW0pOwotCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX1NFU1NLRVksICZtKTsKLQotCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19TRVNTS0VZLCAmbSk7Ci0KLQlyc2FmYWlsID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCWJ1ZmZlcl9nZXRfYmlnbnVtMigmbSwgbnVtKTsKLQotCWJ1ZmZlcl9mcmVlKCZtKTsKLQotCXJldHVybiAocnNhZmFpbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tbV9jaGFsbF9zZXR1cChjaGFyICoqbmFtZSwgY2hhciAqKmluZm90eHQsIHVfaW50ICpudW1wcm9tcHRzLAotICAgIGNoYXIgKioqcHJvbXB0cywgdV9pbnQgKiplY2hvX29uKQotewotCSpuYW1lID0geHN0cmR1cCgiIik7Ci0JKmluZm90eHQgPSB4c3RyZHVwKCIiKTsKLQkqbnVtcHJvbXB0cyA9IDE7Ci0JKnByb21wdHMgPSB4Y2FsbG9jKCpudW1wcm9tcHRzLCBzaXplb2YoY2hhciAqKSk7Ci0JKmVjaG9fb24gPSB4Y2FsbG9jKCpudW1wcm9tcHRzLCBzaXplb2YodV9pbnQpKTsKLQkoKmVjaG9fb24pWzBdID0gMDsKLX0KLQotaW50Ci1tbV9ic2RhdXRoX3F1ZXJ5KHZvaWQgKmN0eCwgY2hhciAqKm5hbWUsIGNoYXIgKippbmZvdHh0LAotICAgdV9pbnQgKm51bXByb21wdHMsIGNoYXIgKioqcHJvbXB0cywgdV9pbnQgKiplY2hvX29uKQotewotCUJ1ZmZlciBtOwotCXVfaW50IHN1Y2Nlc3M7Ci0JY2hhciAqY2hhbGxlbmdlOwotCi0JZGVidWczKCIlczogZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQlidWZmZXJfaW5pdCgmbSk7Ci0JbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfQlNEQVVUSFFVRVJZLCAmbSk7Ci0KLQltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfQlNEQVVUSFFVRVJZLAotCSAgICAmbSk7Ci0Jc3VjY2VzcyA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQlpZiAoc3VjY2VzcyA9PSAwKSB7Ci0JCWRlYnVnMygiJXM6IG5vIGNoYWxsZW5nZSIsIF9fZnVuY19fKTsKLQkJYnVmZmVyX2ZyZWUoJm0pOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIGNoYWxsZW5nZSwgYW5kIGZvcm1hdCB0aGUgcmVzcG9uc2UgKi8KLQljaGFsbGVuZ2UgID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOwotCWJ1ZmZlcl9mcmVlKCZtKTsKLQotCW1tX2NoYWxsX3NldHVwKG5hbWUsIGluZm90eHQsIG51bXByb21wdHMsIHByb21wdHMsIGVjaG9fb24pOwotCSgqcHJvbXB0cylbMF0gPSBjaGFsbGVuZ2U7Ci0KLQlkZWJ1ZzMoIiVzOiByZWNlaXZlZCBjaGFsbGVuZ2U6ICVzIiwgX19mdW5jX18sIGNoYWxsZW5nZSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi1pbnQKLW1tX2JzZGF1dGhfcmVzcG9uZCh2b2lkICpjdHgsIHVfaW50IG51bXJlc3BvbnNlcywgY2hhciAqKnJlc3BvbnNlcykKLXsKLQlCdWZmZXIgbTsKLQlpbnQgYXV0aG9rOwotCi0JZGVidWczKCIlczogZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0JaWYgKG51bXJlc3BvbnNlcyAhPSAxKQotCQlyZXR1cm4gKC0xKTsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm0sIHJlc3BvbnNlc1swXSk7Ci0JbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfQlNEQVVUSFJFU1BPTkQsICZtKTsKLQotCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLAotCSAgICBNT05JVE9SX0FOU19CU0RBVVRIUkVTUE9ORCwgJm0pOwotCi0JYXV0aG9rID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCWJ1ZmZlcl9mcmVlKCZtKTsKLQotCXJldHVybiAoKGF1dGhvayA9PSAwKSA/IC0xIDogMCk7Ci19Ci0KLSNpZmRlZiBTS0VZCi1pbnQKLW1tX3NrZXlfcXVlcnkodm9pZCAqY3R4LCBjaGFyICoqbmFtZSwgY2hhciAqKmluZm90eHQsCi0gICB1X2ludCAqbnVtcHJvbXB0cywgY2hhciAqKipwcm9tcHRzLCB1X2ludCAqKmVjaG9fb24pCi17Ci0JQnVmZmVyIG07Ci0JdV9pbnQgc3VjY2VzczsKLQljaGFyICpjaGFsbGVuZ2U7Ci0KLQlkZWJ1ZzMoIiVzOiBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9TS0VZUVVFUlksICZtKTsKLQotCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19TS0VZUVVFUlksCi0JICAgICZtKTsKLQlzdWNjZXNzID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCWlmIChzdWNjZXNzID09IDApIHsKLQkJZGVidWczKCIlczogbm8gY2hhbGxlbmdlIiwgX19mdW5jX18pOwotCQlidWZmZXJfZnJlZSgmbSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCS8qIEdldCB0aGUgY2hhbGxlbmdlLCBhbmQgZm9ybWF0IHRoZSByZXNwb25zZSAqLwotCWNoYWxsZW5nZSAgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7Ci0JYnVmZmVyX2ZyZWUoJm0pOwotCi0JZGVidWczKCIlczogcmVjZWl2ZWQgY2hhbGxlbmdlOiAlcyIsIF9fZnVuY19fLCBjaGFsbGVuZ2UpOwotCi0JbW1fY2hhbGxfc2V0dXAobmFtZSwgaW5mb3R4dCwgbnVtcHJvbXB0cywgcHJvbXB0cywgZWNob19vbik7Ci0KLQl4YXNwcmludGYoKnByb21wdHMsICIlcyVzIiwgY2hhbGxlbmdlLCBTS0VZX1BST01QVCk7Ci0JeGZyZWUoY2hhbGxlbmdlKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLWludAotbW1fc2tleV9yZXNwb25kKHZvaWQgKmN0eCwgdV9pbnQgbnVtcmVzcG9uc2VzLCBjaGFyICoqcmVzcG9uc2VzKQotewotCUJ1ZmZlciBtOwotCWludCBhdXRob2s7Ci0KLQlkZWJ1ZzMoIiVzOiBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQlpZiAobnVtcmVzcG9uc2VzICE9IDEpCi0JCXJldHVybiAoLTEpOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgcmVzcG9uc2VzWzBdKTsKLQltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9TS0VZUkVTUE9ORCwgJm0pOwotCi0JbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsCi0JICAgIE1PTklUT1JfQU5TX1NLRVlSRVNQT05ELCAmbSk7Ci0KLQlhdXRob2sgPSBidWZmZXJfZ2V0X2ludCgmbSk7Ci0JYnVmZmVyX2ZyZWUoJm0pOwotCi0JcmV0dXJuICgoYXV0aG9rID09IDApID8gLTEgOiAwKTsKLX0KLSNlbmRpZiAvKiBTS0VZICovCi0KLXZvaWQKLW1tX3NzaDFfc2Vzc2lvbl9pZCh1X2NoYXIgc2Vzc2lvbl9pZFsxNl0pCi17Ci0JQnVmZmVyIG07Ci0JaW50IGk7Ci0KLQlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQlidWZmZXJfcHV0X2NoYXIoJm0sIHNlc3Npb25faWRbaV0pOwotCi0JbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfU0VTU0lELCAmbSk7Ci0JYnVmZmVyX2ZyZWUoJm0pOwotfQotCi1pbnQKLW1tX2F1dGhfcnNhX2tleV9hbGxvd2VkKHN0cnVjdCBwYXNzd2QgKnB3LCBCSUdOVU0gKmNsaWVudF9uLCBLZXkgKipya2V5KQotewotCUJ1ZmZlciBtOwotCUtleSAqa2V5OwotCXVfY2hhciAqYmxvYjsKLQl1X2ludCBibGVuOwotCWludCBhbGxvd2VkID0gMCwgaGF2ZV9mb3JjZWQgPSAwOwotCi0JZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQlidWZmZXJfcHV0X2JpZ251bTIoJm0sIGNsaWVudF9uKTsKLQotCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX1JTQUtFWUFMTE9XRUQsICZtKTsKLQltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9BTlNfUlNBS0VZQUxMT1dFRCwgJm0pOwotCi0JYWxsb3dlZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQotCS8qIGZha2UgZm9yY2VkIGNvbW1hbmQgKi8KLQlhdXRoX2NsZWFyX29wdGlvbnMoKTsKLQloYXZlX2ZvcmNlZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQlmb3JjZWRfY29tbWFuZCA9IGhhdmVfZm9yY2VkID8geHN0cmR1cCgidHJ1ZSIpIDogTlVMTDsKLQotCWlmIChhbGxvd2VkICYmIHJrZXkgIT0gTlVMTCkgewotCQlibG9iID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sICZibGVuKTsKLQkJaWYgKChrZXkgPSBrZXlfZnJvbV9ibG9iKGJsb2IsIGJsZW4pKSA9PSBOVUxMKQotCQkJZmF0YWwoIiVzOiBrZXlfZnJvbV9ibG9iIGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJKnJrZXkgPSBrZXk7Ci0JCXhmcmVlKGJsb2IpOwotCX0KLQlidWZmZXJfZnJlZSgmbSk7Ci0KLQlyZXR1cm4gKGFsbG93ZWQpOwotfQotCi1CSUdOVU0gKgotbW1fYXV0aF9yc2FfZ2VuZXJhdGVfY2hhbGxlbmdlKEtleSAqa2V5KQotewotCUJ1ZmZlciBtOwotCUJJR05VTSAqY2hhbGxlbmdlOwotCXVfY2hhciAqYmxvYjsKLQl1X2ludCBibGVuOwotCi0JZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQotCWlmICgoY2hhbGxlbmdlID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKLQotCWtleS0+dHlwZSA9IEtFWV9SU0E7ICAgIC8qIFhYWCBjaGVhdCBmb3Iga2V5X3RvX2Jsb2IgKi8KLQlpZiAoa2V5X3RvX2Jsb2Ioa2V5LCAmYmxvYiwgJmJsZW4pID09IDApCi0JCWZhdGFsKCIlczoga2V5X3RvX2Jsb2IgZmFpbGVkIiwgX19mdW5jX18pOwotCWtleS0+dHlwZSA9IEtFWV9SU0ExOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBibG9iLCBibGVuKTsKLQl4ZnJlZShibG9iKTsKLQotCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX1JTQUNIQUxMRU5HRSwgJm0pOwotCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19SU0FDSEFMTEVOR0UsICZtKTsKLQotCWJ1ZmZlcl9nZXRfYmlnbnVtMigmbSwgY2hhbGxlbmdlKTsKLQlidWZmZXJfZnJlZSgmbSk7Ci0KLQlyZXR1cm4gKGNoYWxsZW5nZSk7Ci19Ci0KLWludAotbW1fYXV0aF9yc2FfdmVyaWZ5X3Jlc3BvbnNlKEtleSAqa2V5LCBCSUdOVU0gKnAsIHVfY2hhciByZXNwb25zZVsxNl0pCi17Ci0JQnVmZmVyIG07Ci0JdV9jaGFyICpibG9iOwotCXVfaW50IGJsZW47Ci0JaW50IHN1Y2Nlc3MgPSAwOwotCi0JZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQotCWtleS0+dHlwZSA9IEtFWV9SU0E7ICAgIC8qIFhYWCBjaGVhdCBmb3Iga2V5X3RvX2Jsb2IgKi8KLQlpZiAoa2V5X3RvX2Jsb2Ioa2V5LCAmYmxvYiwgJmJsZW4pID09IDApCi0JCWZhdGFsKCIlczoga2V5X3RvX2Jsb2IgZmFpbGVkIiwgX19mdW5jX18pOwotCWtleS0+dHlwZSA9IEtFWV9SU0ExOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBibG9iLCBibGVuKTsKLQlidWZmZXJfcHV0X3N0cmluZygmbSwgcmVzcG9uc2UsIDE2KTsKLQl4ZnJlZShibG9iKTsKLQotCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX1JTQVJFU1BPTlNFLCAmbSk7Ci0JbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfQU5TX1JTQVJFU1BPTlNFLCAmbSk7Ci0KLQlzdWNjZXNzID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCWJ1ZmZlcl9mcmVlKCZtKTsKLQotCXJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLSNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCi12b2lkCi1tbV9hdWRpdF9ldmVudChzc2hfYXVkaXRfZXZlbnRfdCBldmVudCkKLXsKLQlCdWZmZXIgbTsKLQotCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQlidWZmZXJfaW5pdCgmbSk7Ci0JYnVmZmVyX3B1dF9pbnQoJm0sIGV2ZW50KTsKLQotCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX0FVRElUX0VWRU5ULCAmbSk7Ci0JYnVmZmVyX2ZyZWUoJm0pOwotfQotCi12b2lkCi1tbV9hdWRpdF9ydW5fY29tbWFuZChjb25zdCBjaGFyICpjb21tYW5kKQotewotCUJ1ZmZlciBtOwotCi0JZGVidWczKCIlcyBlbnRlcmluZyBjb21tYW5kICVzIiwgX19mdW5jX18sIGNvbW1hbmQpOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgY29tbWFuZCk7Ci0KLQltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9BVURJVF9DT01NQU5ELCAmbSk7Ci0JYnVmZmVyX2ZyZWUoJm0pOwotfQotI2VuZGlmIC8qIFNTSF9BVURJVF9FVkVOVFMgKi8KLQotI2lmZGVmIEdTU0FQSQotT01fdWludDMyCi1tbV9zc2hfZ3NzYXBpX3NlcnZlcl9jdHgoR3NzY3R4dCAqKmN0eCwgZ3NzX09JRCBnb2lkKQotewotCUJ1ZmZlciBtOwotCU9NX3VpbnQzMiBtYWpvcjsKLQotCS8qIENsaWVudCBkb2Vzbid0IGdldCB0byBzZWUgdGhlIGNvbnRleHQgKi8KLQkqY3R4ID0gTlVMTDsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQlidWZmZXJfcHV0X3N0cmluZygmbSwgZ29pZC0+ZWxlbWVudHMsIGdvaWQtPmxlbmd0aCk7Ci0KLQltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX1JFUV9HU1NTRVRVUCwgJm0pOwotCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19HU1NTRVRVUCwgJm0pOwotCi0JbWFqb3IgPSBidWZmZXJfZ2V0X2ludCgmbSk7Ci0KLQlidWZmZXJfZnJlZSgmbSk7Ci0JcmV0dXJuIChtYWpvcik7Ci19Ci0KLU9NX3VpbnQzMgotbW1fc3NoX2dzc2FwaV9hY2NlcHRfY3R4KEdzc2N0eHQgKmN0eCwgZ3NzX2J1ZmZlcl9kZXNjICppbiwKLSAgICBnc3NfYnVmZmVyX2Rlc2MgKm91dCwgT01fdWludDMyICpmbGFncykKLXsKLQlCdWZmZXIgbTsKLQlPTV91aW50MzIgbWFqb3I7Ci0JdV9pbnQgbGVuOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBpbi0+dmFsdWUsIGluLT5sZW5ndGgpOwotCi0JbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwgTU9OSVRPUl9SRVFfR1NTU1RFUCwgJm0pOwotCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19HU1NTVEVQLCAmbSk7Ci0KLQltYWpvciA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQlvdXQtPnZhbHVlID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sICZsZW4pOwotCW91dC0+bGVuZ3RoID0gbGVuOwotCWlmIChmbGFncykKLQkJKmZsYWdzID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCi0JYnVmZmVyX2ZyZWUoJm0pOwotCi0JcmV0dXJuIChtYWpvcik7Ci19Ci0KLU9NX3VpbnQzMgotbW1fc3NoX2dzc2FwaV9jaGVja21pYyhHc3NjdHh0ICpjdHgsIGdzc19idWZmZXJfdCBnc3NidWYsIGdzc19idWZmZXJfdCBnc3NtaWMpCi17Ci0JQnVmZmVyIG07Ci0JT01fdWludDMyIG1ham9yOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBnc3NidWYtPnZhbHVlLCBnc3NidWYtPmxlbmd0aCk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJm0sIGdzc21pYy0+dmFsdWUsIGdzc21pYy0+bGVuZ3RoKTsKLQotCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX0dTU0NIRUNLTUlDLCAmbSk7Ci0JbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfQU5TX0dTU0NIRUNLTUlDLAotCSAgICAmbSk7Ci0KLQltYWpvciA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQlidWZmZXJfZnJlZSgmbSk7Ci0JcmV0dXJuKG1ham9yKTsKLX0KLQotaW50Ci1tbV9zc2hfZ3NzYXBpX3VzZXJvayhjaGFyICp1c2VyKQotewotCUJ1ZmZlciBtOwotCWludCBhdXRoZW50aWNhdGVkID0gMDsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQotCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsIE1PTklUT1JfUkVRX0dTU1VTRVJPSywgJm0pOwotCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLCBNT05JVE9SX0FOU19HU1NVU0VST0ssCi0JCQkJICAmbSk7Ci0KLQlhdXRoZW50aWNhdGVkID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCi0JYnVmZmVyX2ZyZWUoJm0pOwotCWRlYnVnMygiJXM6IHVzZXIgJXNhdXRoZW50aWNhdGVkIixfX2Z1bmNfXywgYXV0aGVudGljYXRlZCA/ICIiIDogIm5vdCAiKTsKLQlyZXR1cm4gKGF1dGhlbnRpY2F0ZWQpOwotfQotI2VuZGlmIC8qIEdTU0FQSSAqLwotCi0jaWZkZWYgSlBBS0UKLXZvaWQKLW1tX2F1dGgyX2pwYWtlX2dldF9wd2RhdGEoQXV0aGN0eHQgKmF1dGhjdHh0LCBCSUdOVU0gKipzLAotICAgIGNoYXIgKipoYXNoX3NjaGVtZSwgY2hhciAqKnNhbHQpCi17Ci0JQnVmZmVyIG07Ci0KLQlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsCi0JICAgIE1PTklUT1JfUkVRX0pQQUtFX0dFVF9QV0RBVEEsICZtKTsKLQotCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX0pQQUtFX0dFVF9QV0RBVEEiLCBfX2Z1bmNfXyk7Ci0JbW1fcmVxdWVzdF9yZWNlaXZlX2V4cGVjdChwbW9uaXRvci0+bV9yZWN2ZmQsCi0JICAgIE1PTklUT1JfQU5TX0pQQUtFX0dFVF9QV0RBVEEsICZtKTsKLQotCSpoYXNoX3NjaGVtZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQkqc2FsdCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQotCWJ1ZmZlcl9mcmVlKCZtKTsKLX0KLQotdm9pZAotbW1fanBha2Vfc3RlcDEoc3RydWN0IG1vZHBfZ3JvdXAgKmdycCwKLSAgICB1X2NoYXIgKippZCwgdV9pbnQgKmlkX2xlbiwKLSAgICBCSUdOVU0gKipwcml2MSwgQklHTlVNICoqcHJpdjIsIEJJR05VTSAqKmdfcHJpdjEsIEJJR05VTSAqKmdfcHJpdjIsCi0gICAgdV9jaGFyICoqcHJpdjFfcHJvb2YsIHVfaW50ICpwcml2MV9wcm9vZl9sZW4sCi0gICAgdV9jaGFyICoqcHJpdjJfcHJvb2YsIHVfaW50ICpwcml2Ml9wcm9vZl9sZW4pCi17Ci0JQnVmZmVyIG07Ci0KLQlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsCi0JICAgIE1PTklUT1JfUkVRX0pQQUtFX1NURVAxLCAmbSk7Ci0KLQlkZWJ1ZzMoIiVzOiB3YWl0aW5nIGZvciBNT05JVE9SX0FOU19KUEFLRV9TVEVQMSIsIF9fZnVuY19fKTsKLQltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwKLQkgICAgTU9OSVRPUl9BTlNfSlBBS0VfU1RFUDEsICZtKTsKLQotCWlmICgoKnByaXYxID0gQk5fbmV3KCkpID09IE5VTEwgfHwKLQkgICAgKCpwcml2MiA9IEJOX25ldygpKSA9PSBOVUxMIHx8Ci0JICAgICgqZ19wcml2MSA9IEJOX25ldygpKSA9PSBOVUxMIHx8Ci0JICAgICgqZ19wcml2MiA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEJOX25ldyIsIF9fZnVuY19fKTsKLQotCSppZCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBpZF9sZW4pOwotCS8qIHByaXYxIGFuZCBwcml2MiBhcmUsIHdlbGwsIHByaXZhdGUgKi8KLQlidWZmZXJfZ2V0X2JpZ251bTIoJm0sICpnX3ByaXYxKTsKLQlidWZmZXJfZ2V0X2JpZ251bTIoJm0sICpnX3ByaXYyKTsKLQkqcHJpdjFfcHJvb2YgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgcHJpdjFfcHJvb2ZfbGVuKTsKLQkqcHJpdjJfcHJvb2YgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgcHJpdjJfcHJvb2ZfbGVuKTsKLQotCWJ1ZmZlcl9mcmVlKCZtKTsKLX0KLQotdm9pZAotbW1fanBha2Vfc3RlcDIoc3RydWN0IG1vZHBfZ3JvdXAgKmdycCwgQklHTlVNICpzLAotICAgIEJJR05VTSAqbXlwdWIxLCBCSUdOVU0gKnRoZWlycHViMSwgQklHTlVNICp0aGVpcnB1YjIsIEJJR05VTSAqbXlwcml2MiwKLSAgICBjb25zdCB1X2NoYXIgKnRoZWlyaWQsIHVfaW50IHRoZWlyaWRfbGVuLAotICAgIGNvbnN0IHVfY2hhciAqbXlpZCwgdV9pbnQgbXlpZF9sZW4sCi0gICAgY29uc3QgdV9jaGFyICp0aGVpcnB1YjFfcHJvb2YsIHVfaW50IHRoZWlycHViMV9wcm9vZl9sZW4sCi0gICAgY29uc3QgdV9jaGFyICp0aGVpcnB1YjJfcHJvb2YsIHVfaW50IHRoZWlycHViMl9wcm9vZl9sZW4sCi0gICAgQklHTlVNICoqbmV3cHViLAotICAgIHVfY2hhciAqKm5ld3B1Yl9leHBvbmVudF9wcm9vZiwgdV9pbnQgKm5ld3B1Yl9leHBvbmVudF9wcm9vZl9sZW4pCi17Ci0JQnVmZmVyIG07Ci0KLQlkZWJ1ZzMoIiVzIGVudGVyaW5nIiwgX19mdW5jX18pOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCS8qIG1vbml0b3IgYWxyZWFkeSBoYXMgYWxsIGJpZ251bXMgZXhjZXB0IHRoZWlycHViMSwgdGhlaXJwdWIyICovCi0JYnVmZmVyX3B1dF9iaWdudW0yKCZtLCB0aGVpcnB1YjEpOwotCWJ1ZmZlcl9wdXRfYmlnbnVtMigmbSwgdGhlaXJwdWIyKTsKLQkvKiBtb25pdG9yIGFscmVhZHkga25vd3Mgb3VyIGlkICovCi0JYnVmZmVyX3B1dF9zdHJpbmcoJm0sIHRoZWlyaWQsIHRoZWlyaWRfbGVuKTsKLQlidWZmZXJfcHV0X3N0cmluZygmbSwgdGhlaXJwdWIxX3Byb29mLCB0aGVpcnB1YjFfcHJvb2ZfbGVuKTsKLQlidWZmZXJfcHV0X3N0cmluZygmbSwgdGhlaXJwdWIyX3Byb29mLCB0aGVpcnB1YjJfcHJvb2ZfbGVuKTsKLQotCW1tX3JlcXVlc3Rfc2VuZChwbW9uaXRvci0+bV9yZWN2ZmQsCi0JICAgIE1PTklUT1JfUkVRX0pQQUtFX1NURVAyLCAmbSk7Ci0KLQlkZWJ1ZzMoIiVzOiB3YWl0aW5nIGZvciBNT05JVE9SX0FOU19KUEFLRV9TVEVQMiIsIF9fZnVuY19fKTsKLQltbV9yZXF1ZXN0X3JlY2VpdmVfZXhwZWN0KHBtb25pdG9yLT5tX3JlY3ZmZCwKLQkgICAgTU9OSVRPUl9BTlNfSlBBS0VfU1RFUDIsICZtKTsKLQotCWlmICgoKm5ld3B1YiA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEJOX25ldyIsIF9fZnVuY19fKTsKLQotCWJ1ZmZlcl9nZXRfYmlnbnVtMigmbSwgKm5ld3B1Yik7Ci0JKm5ld3B1Yl9leHBvbmVudF9wcm9vZiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLAotCSAgICBuZXdwdWJfZXhwb25lbnRfcHJvb2ZfbGVuKTsKLQotCWJ1ZmZlcl9mcmVlKCZtKTsKLX0KLQotdm9pZAotbW1fanBha2Vfa2V5X2NvbmZpcm0oc3RydWN0IG1vZHBfZ3JvdXAgKmdycCwgQklHTlVNICpzLCBCSUdOVU0gKnN0ZXAyX3ZhbCwKLSAgICBCSUdOVU0gKm15cHJpdjIsIEJJR05VTSAqbXlwdWIxLCBCSUdOVU0gKm15cHViMiwKLSAgICBCSUdOVU0gKnRoZWlycHViMSwgQklHTlVNICp0aGVpcnB1YjIsCi0gICAgY29uc3QgdV9jaGFyICpteV9pZCwgdV9pbnQgbXlfaWRfbGVuLAotICAgIGNvbnN0IHVfY2hhciAqdGhlaXJfaWQsIHVfaW50IHRoZWlyX2lkX2xlbiwKLSAgICBjb25zdCB1X2NoYXIgKnNlc3NfaWQsIHVfaW50IHNlc3NfaWRfbGVuLAotICAgIGNvbnN0IHVfY2hhciAqdGhlaXJwcml2Ml9zX3Byb29mLCB1X2ludCB0aGVpcnByaXYyX3NfcHJvb2ZfbGVuLAotICAgIEJJR05VTSAqKmssCi0gICAgdV9jaGFyICoqY29uZmlybV9oYXNoLCB1X2ludCAqY29uZmlybV9oYXNoX2xlbikKLXsKLQlCdWZmZXIgbTsKLQotCWRlYnVnMygiJXMgZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQlidWZmZXJfaW5pdCgmbSk7Ci0JLyogbW9uaXRvciBhbHJlYWR5IGhhcyBhbGwgYmlnbnVtcyBleGNlcHQgc3RlcDJfdmFsICovCi0JYnVmZmVyX3B1dF9iaWdudW0yKCZtLCBzdGVwMl92YWwpOwotCS8qIG1vbml0b3IgYWxyZWFkeSBrbm93cyBhbGwgdGhlIGlkcyAqLwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCB0aGVpcnByaXYyX3NfcHJvb2YsIHRoZWlycHJpdjJfc19wcm9vZl9sZW4pOwotCi0JbW1fcmVxdWVzdF9zZW5kKHBtb25pdG9yLT5tX3JlY3ZmZCwKLQkgICAgTU9OSVRPUl9SRVFfSlBBS0VfS0VZX0NPTkZJUk0sICZtKTsKLQotCWRlYnVnMygiJXM6IHdhaXRpbmcgZm9yIE1PTklUT1JfQU5TX0pQQUtFX0tFWV9DT05GSVJNIiwgX19mdW5jX18pOwotCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLAotCSAgICBNT05JVE9SX0FOU19KUEFLRV9LRVlfQ09ORklSTSwgJm0pOwotCi0JLyogJ2snIGlzIHNlbnNpdGl2ZSBhbmQgc3RheXMgaW4gdGhlIG1vbml0b3IgKi8KLQkqY29uZmlybV9oYXNoID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIGNvbmZpcm1faGFzaF9sZW4pOwotCi0JYnVmZmVyX2ZyZWUoJm0pOwotfQotCi1pbnQKLW1tX2pwYWtlX2NoZWNrX2NvbmZpcm0oY29uc3QgQklHTlVNICprLAotICAgIGNvbnN0IHVfY2hhciAqcGVlcl9pZCwgdV9pbnQgcGVlcl9pZF9sZW4sCi0gICAgY29uc3QgdV9jaGFyICpzZXNzX2lkLCB1X2ludCBzZXNzX2lkX2xlbiwKLSAgICBjb25zdCB1X2NoYXIgKnBlZXJfY29uZmlybV9oYXNoLCB1X2ludCBwZWVyX2NvbmZpcm1faGFzaF9sZW4pCi17Ci0JQnVmZmVyIG07Ci0JaW50IHN1Y2Nlc3MgPSAwOwotCi0JZGVidWczKCIlcyBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQkvKiBrIGlzIGR1bW15IGluIHNsYXZlLCBpZ25vcmVkICovCi0JLyogbW9uaXRvciBrbm93cyBhbGwgdGhlIGlkcyAqLwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBwZWVyX2NvbmZpcm1faGFzaCwgcGVlcl9jb25maXJtX2hhc2hfbGVuKTsKLQltbV9yZXF1ZXN0X3NlbmQocG1vbml0b3ItPm1fcmVjdmZkLAotCSAgICBNT05JVE9SX1JFUV9KUEFLRV9DSEVDS19DT05GSVJNLCAmbSk7Ci0KLQlkZWJ1ZzMoIiVzOiB3YWl0aW5nIGZvciBNT05JVE9SX0FOU19KUEFLRV9DSEVDS19DT05GSVJNIiwgX19mdW5jX18pOwotCW1tX3JlcXVlc3RfcmVjZWl2ZV9leHBlY3QocG1vbml0b3ItPm1fcmVjdmZkLAotCSAgICBNT05JVE9SX0FOU19KUEFLRV9DSEVDS19DT05GSVJNLCAmbSk7Ci0KLQlzdWNjZXNzID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCWJ1ZmZlcl9mcmVlKCZtKTsKLQotCWRlYnVnMygiJXM6IHN1Y2Nlc3MgPSAlZCIsIF9fZnVuY19fLCBzdWNjZXNzKTsKLQlyZXR1cm4gc3VjY2VzczsKLX0KLSNlbmRpZiAvKiBKUEFLRSAqLwpkaWZmIC0tZ2l0IGEvbW9uaXRvcl93cmFwLmggYi9tb25pdG9yX3dyYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3ZjJlMy4uMDAwMDAwMAotLS0gYS9tb25pdG9yX3dyYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKiAkT3BlbkJTRDogbW9uaXRvcl93cmFwLmgsdiAxLjIzIDIwMTEvMDYvMTcgMjE6NDQ6MzEgZGptIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiBOaWVscyBQcm92b3MgPHByb3Zvc0BjaXRpLnVtaWNoLmVkdT4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX01NX1dSQVBfSF8KLSNkZWZpbmUgX01NX1dSQVBfSF8KLQotZXh0ZXJuIGludCB1c2VfcHJpdnNlcDsKLSNkZWZpbmUgUFJJVlNFUCh4KQkodXNlX3ByaXZzZXAgPyBtbV8jI3ggOiB4KQotCi1lbnVtIG1tX2tleXR5cGUge01NX05PS0VZLCBNTV9IT1NUS0VZLCBNTV9VU0VSS0VZLCBNTV9SU0FIT1NUS0VZLCBNTV9SU0FVU0VSS0VZfTsKLQotc3RydWN0IG1vbml0b3I7Ci1zdHJ1Y3QgbW1fbWFzdGVyOwotc3RydWN0IEF1dGhjdHh0OwotCi12b2lkIG1tX2xvZ19oYW5kbGVyKExvZ0xldmVsLCBjb25zdCBjaGFyICosIHZvaWQgKik7Ci1pbnQgbW1faXNfbW9uaXRvcih2b2lkKTsKLURIICptbV9jaG9vc2VfZGgoaW50LCBpbnQsIGludCk7Ci1pbnQgbW1fa2V5X3NpZ24oS2V5ICosIHVfY2hhciAqKiwgdV9pbnQgKiwgdV9jaGFyICosIHVfaW50KTsKLXZvaWQgbW1faW5mb3JtX2F1dGhzZXJ2KGNoYXIgKiwgY2hhciAqKTsKLXN0cnVjdCBwYXNzd2QgKm1tX2dldHB3bmFtYWxsb3coY29uc3QgY2hhciAqKTsKLWNoYXIgKm1tX2F1dGgyX3JlYWRfYmFubmVyKHZvaWQpOwotaW50IG1tX2F1dGhfcGFzc3dvcmQoc3RydWN0IEF1dGhjdHh0ICosIGNoYXIgKik7Ci1pbnQgbW1fa2V5X2FsbG93ZWQoZW51bSBtbV9rZXl0eXBlLCBjaGFyICosIGNoYXIgKiwgS2V5ICopOwotaW50IG1tX3VzZXJfa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqLCBLZXkgKik7Ci1pbnQgbW1faG9zdGJhc2VkX2tleV9hbGxvd2VkKHN0cnVjdCBwYXNzd2QgKiwgY2hhciAqLCBjaGFyICosIEtleSAqKTsKLWludCBtbV9hdXRoX3Job3N0c19yc2Ffa2V5X2FsbG93ZWQoc3RydWN0IHBhc3N3ZCAqLCBjaGFyICosIGNoYXIgKiwgS2V5ICopOwotaW50IG1tX2tleV92ZXJpZnkoS2V5ICosIHVfY2hhciAqLCB1X2ludCwgdV9jaGFyICosIHVfaW50KTsKLWludCBtbV9hdXRoX3JzYV9rZXlfYWxsb3dlZChzdHJ1Y3QgcGFzc3dkICosIEJJR05VTSAqLCBLZXkgKiopOwotaW50IG1tX2F1dGhfcnNhX3ZlcmlmeV9yZXNwb25zZShLZXkgKiwgQklHTlVNICosIHVfY2hhciAqKTsKLUJJR05VTSAqbW1fYXV0aF9yc2FfZ2VuZXJhdGVfY2hhbGxlbmdlKEtleSAqKTsKLQotI2lmZGVmIEdTU0FQSQotT01fdWludDMyIG1tX3NzaF9nc3NhcGlfc2VydmVyX2N0eChHc3NjdHh0ICoqLCBnc3NfT0lEKTsKLU9NX3VpbnQzMiBtbV9zc2hfZ3NzYXBpX2FjY2VwdF9jdHgoR3NzY3R4dCAqLAotICAgZ3NzX2J1ZmZlcl9kZXNjICosIGdzc19idWZmZXJfZGVzYyAqLCBPTV91aW50MzIgKik7Ci1pbnQgbW1fc3NoX2dzc2FwaV91c2Vyb2soY2hhciAqdXNlcik7Ci1PTV91aW50MzIgbW1fc3NoX2dzc2FwaV9jaGVja21pYyhHc3NjdHh0ICosIGdzc19idWZmZXJfdCwgZ3NzX2J1ZmZlcl90KTsKLSNlbmRpZgotCi0jaWZkZWYgVVNFX1BBTQotdm9pZCBtbV9zdGFydF9wYW0oc3RydWN0IEF1dGhjdHh0ICopOwotdV9pbnQgbW1fZG9fcGFtX2FjY291bnQodm9pZCk7Ci12b2lkICptbV9zc2hwYW1faW5pdF9jdHgoc3RydWN0IEF1dGhjdHh0ICopOwotaW50IG1tX3NzaHBhbV9xdWVyeSh2b2lkICosIGNoYXIgKiosIGNoYXIgKiosIHVfaW50ICosIGNoYXIgKioqLCB1X2ludCAqKik7Ci1pbnQgbW1fc3NocGFtX3Jlc3BvbmQodm9pZCAqLCB1X2ludCwgY2hhciAqKik7Ci12b2lkIG1tX3NzaHBhbV9mcmVlX2N0eCh2b2lkICopOwotI2VuZGlmCi0KLSNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCi0jaW5jbHVkZSAiYXVkaXQuaCIKLXZvaWQgbW1fYXVkaXRfZXZlbnQoc3NoX2F1ZGl0X2V2ZW50X3QpOwotdm9pZCBtbV9hdWRpdF9ydW5fY29tbWFuZChjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLXN0cnVjdCBTZXNzaW9uOwotdm9pZCBtbV90ZXJtaW5hdGUodm9pZCk7Ci1pbnQgbW1fcHR5X2FsbG9jYXRlKGludCAqLCBpbnQgKiwgY2hhciAqLCBzaXplX3QpOwotdm9pZCBtbV9zZXNzaW9uX3B0eV9jbGVhbnVwMihzdHJ1Y3QgU2Vzc2lvbiAqKTsKLQotLyogU1NIdjEgaW50ZXJmYWNlcyAqLwotdm9pZCBtbV9zc2gxX3Nlc3Npb25faWQodV9jaGFyICopOwotaW50IG1tX3NzaDFfc2Vzc2lvbl9rZXkoQklHTlVNICopOwotCi0vKiBLZXkgZXhwb3J0IGZ1bmN0aW9ucyAqLwotc3RydWN0IE5ld2tleXMgKm1tX25ld2tleXNfZnJvbV9ibG9iKHVfY2hhciAqLCBpbnQpOwotaW50IG1tX25ld2tleXNfdG9fYmxvYihpbnQsIHVfY2hhciAqKiwgdV9pbnQgKik7Ci0KLXZvaWQgbW9uaXRvcl9hcHBseV9rZXlzdGF0ZShzdHJ1Y3QgbW9uaXRvciAqKTsKLXZvaWQgbW1fZ2V0X2tleXN0YXRlKHN0cnVjdCBtb25pdG9yICopOwotdm9pZCBtbV9zZW5kX2tleXN0YXRlKHN0cnVjdCBtb25pdG9yKik7Ci0KLS8qIGJzZGF1dGggKi8KLWludCBtbV9ic2RhdXRoX3F1ZXJ5KHZvaWQgKiwgY2hhciAqKiwgY2hhciAqKiwgdV9pbnQgKiwgY2hhciAqKiosIHVfaW50ICoqKTsKLWludCBtbV9ic2RhdXRoX3Jlc3BvbmQodm9pZCAqLCB1X2ludCwgY2hhciAqKik7Ci0KLS8qIHNrZXkgKi8KLWludCBtbV9za2V5X3F1ZXJ5KHZvaWQgKiwgY2hhciAqKiwgY2hhciAqKiwgdV9pbnQgKiwgY2hhciAqKiosIHVfaW50ICoqKTsKLWludCBtbV9za2V5X3Jlc3BvbmQodm9pZCAqLCB1X2ludCwgY2hhciAqKik7Ci0KLS8qIGpwYWtlICovCi1zdHJ1Y3QgbW9kcF9ncm91cDsKLXZvaWQgbW1fYXV0aDJfanBha2VfZ2V0X3B3ZGF0YShzdHJ1Y3QgQXV0aGN0eHQgKiwgQklHTlVNICoqLCBjaGFyICoqLCBjaGFyICoqKTsKLXZvaWQgbW1fanBha2Vfc3RlcDEoc3RydWN0IG1vZHBfZ3JvdXAgKiwgdV9jaGFyICoqLCB1X2ludCAqLAotICAgIEJJR05VTSAqKiwgQklHTlVNICoqLCBCSUdOVU0gKiosIEJJR05VTSAqKiwKLSAgICB1X2NoYXIgKiosIHVfaW50ICosIHVfY2hhciAqKiwgdV9pbnQgKik7Ci12b2lkIG1tX2pwYWtlX3N0ZXAyKHN0cnVjdCBtb2RwX2dyb3VwICosIEJJR05VTSAqLAotICAgIEJJR05VTSAqLCBCSUdOVU0gKiwgQklHTlVNICosIEJJR05VTSAqLAotICAgIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50LAotICAgIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50LAotICAgIEJJR05VTSAqKiwgdV9jaGFyICoqLCB1X2ludCAqKTsKLXZvaWQgbW1fanBha2Vfa2V5X2NvbmZpcm0oc3RydWN0IG1vZHBfZ3JvdXAgKiwgQklHTlVNICosIEJJR05VTSAqLAotICAgIEJJR05VTSAqLCBCSUdOVU0gKiwgQklHTlVNICosIEJJR05VTSAqLCBCSUdOVU0gKiwKLSAgICBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludCwKLSAgICBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludCwKLSAgICBCSUdOVU0gKiosIHVfY2hhciAqKiwgdV9pbnQgKik7Ci1pbnQgbW1fanBha2VfY2hlY2tfY29uZmlybShjb25zdCBCSUdOVU0gKiwKLSAgICBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLQotCi0vKiB6bGliIGFsbG9jYXRpb24gaG9va3MgKi8KLQotdm9pZCAqbW1femFsbG9jKHN0cnVjdCBtbV9tYXN0ZXIgKiwgdV9pbnQsIHVfaW50KTsKLXZvaWQgbW1femZyZWUoc3RydWN0IG1tX21hc3RlciAqLCB2b2lkICopOwotdm9pZCBtbV9pbml0X2NvbXByZXNzaW9uKHN0cnVjdCBtbV9tYXN0ZXIgKik7Ci0KLSNlbmRpZiAvKiBfTU1fV1JBUF9IXyAqLwpkaWZmIC0tZ2l0IGEvbXNnLmMgYi9tc2cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1Zjk4Yy4uMDAwMDAwMAotLS0gYS9tc2cuYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qICRPcGVuQlNEOiBtc2cuYyx2IDEuMTUgMjAwNi8wOC8wMyAwMzozNDo0MiBkZXJhYWR0IEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAyIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImF0b21pY2lvLmgiCi0jaW5jbHVkZSAibXNnLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotCi1pbnQKLXNzaF9tc2dfc2VuZChpbnQgZmQsIHVfY2hhciB0eXBlLCBCdWZmZXIgKm0pCi17Ci0JdV9jaGFyIGJ1Zls1XTsKLQl1X2ludCBtbGVuID0gYnVmZmVyX2xlbihtKTsKLQotCWRlYnVnMygic3NoX21zZ19zZW5kOiB0eXBlICV1IiwgKHVuc2lnbmVkIGludCl0eXBlICYgMHhmZik7Ci0KLQlwdXRfdTMyKGJ1ZiwgbWxlbiArIDEpOwotCWJ1Zls0XSA9IHR5cGU7CQkvKiAxc3QgYnl0ZSBvZiBwYXlsb2FkIGlzIG1lc2ctdHlwZSAqLwotCWlmIChhdG9taWNpbyh2d3JpdGUsIGZkLCBidWYsIHNpemVvZihidWYpKSAhPSBzaXplb2YoYnVmKSkgewotCQllcnJvcigic3NoX21zZ19zZW5kOiB3cml0ZSIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JaWYgKGF0b21pY2lvKHZ3cml0ZSwgZmQsIGJ1ZmZlcl9wdHIobSksIG1sZW4pICE9IG1sZW4pIHsKLQkJZXJyb3IoInNzaF9tc2dfc2VuZDogd3JpdGUiKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCXJldHVybiAoMCk7Ci19Ci0KLWludAotc3NoX21zZ19yZWN2KGludCBmZCwgQnVmZmVyICptKQotewotCXVfY2hhciBidWZbNF07Ci0JdV9pbnQgbXNnX2xlbjsKLQotCWRlYnVnMygic3NoX21zZ19yZWN2IGVudGVyaW5nIik7Ci0KLQlpZiAoYXRvbWljaW8ocmVhZCwgZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpICE9IHNpemVvZihidWYpKSB7Ci0JCWlmIChlcnJubyAhPSBFUElQRSkKLQkJCWVycm9yKCJzc2hfbXNnX3JlY3Y6IHJlYWQ6IGhlYWRlciIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JbXNnX2xlbiA9IGdldF91MzIoYnVmKTsKLQlpZiAobXNnX2xlbiA+IDI1NiAqIDEwMjQpIHsKLQkJZXJyb3IoInNzaF9tc2dfcmVjdjogcmVhZDogYmFkIG1zZ19sZW4gJXUiLCBtc2dfbGVuKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWJ1ZmZlcl9jbGVhcihtKTsKLQlidWZmZXJfYXBwZW5kX3NwYWNlKG0sIG1zZ19sZW4pOwotCWlmIChhdG9taWNpbyhyZWFkLCBmZCwgYnVmZmVyX3B0cihtKSwgbXNnX2xlbikgIT0gbXNnX2xlbikgewotCQllcnJvcigic3NoX21zZ19yZWN2OiByZWFkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlyZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvbXNnLmggYi9tc2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjYjliNS4uMDAwMDAwMAotLS0gYS9tc2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qICRPcGVuQlNEOiBtc2cuaCx2IDEuNCAyMDA2LzAzLzI1IDIyOjIyOjQzIGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLSNpZm5kZWYgU1NIX01TR19ICi0jZGVmaW5lIFNTSF9NU0dfSAotCi1pbnQJIHNzaF9tc2dfc2VuZChpbnQsIHVfY2hhciwgQnVmZmVyICopOwotaW50CSBzc2hfbXNnX3JlY3YoaW50LCBCdWZmZXIgKik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbXV4LmMgYi9tdXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRkMGUyNi4uMDAwMDAwMAotLS0gYS9tdXguYworKysgL2Rldi9udWxsCkBAIC0xLDIwMzcgKzAsMCBAQAotLyogJE9wZW5CU0Q6IG11eC5jLHYgMS4yOSAyMDExLzA2LzIyIDIyOjA4OjQyIGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA4IERhbWllbiBNaWxsZXIgPGRqbUBvcGVuYnNkLm9yZz4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0vKiBzc2ggc2Vzc2lvbiBtdWx0aXBsZXhpbmcgc3VwcG9ydCAqLwotCi0vKgotICogVE9ETzoKLSAqICAgLSBCZXR0ZXIgc2lnbmFsbGluZyBmcm9tIG1hc3RlciB0byBzbGF2ZSwgZXNwZWNpYWxseSBwYXNzaW5nIG9mCi0gKiAgICAgIGVycm9yIG1lc3NhZ2VzCi0gKiAgIC0gQmV0dGVyIGZhbGwtYmFjayBmcm9tIG11eCBzbGF2ZSBlcnJvciB0byBuZXcgY29ubmVjdGlvbi4KLSAqICAgLSBFeGl0T25Gb3J3YXJkaW5nRmFpbHVyZQotICogICAtIE1heWJlIGV4dGVuc2lvbiBtZWNoYW5pc21zIGZvciBtdWx0aS1YMTEvbXVsdGktYWdlbnQgZm9yd2FyZGluZwotICogICAtIFN1cHBvcnQgfl5aIGluIG11eCBzbGF2ZXMuCi0gKiAgIC0gSW5zcGVjdCBvciBjb250cm9sIHNlc3Npb25zIGluIG1hc3Rlci4KLSAqICAgLSBJZiB3ZSBldmVyIHN1cHBvcnQgdGhlICJzaWduYWwiIGNoYW5uZWwgcmVxdWVzdCwgc2VuZCBzaWduYWxzIG9uCi0gKiAgICAgc2Vzc2lvbnMgaW4gbWFzdGVyLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3VuLmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpZmRlZiBIQVZFX1BBVEhTX0gKLSNpbmNsdWRlIDxwYXRocy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1BPTExfSAotI2luY2x1ZGUgPHBvbGwuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfU1lTX1BPTExfSAotIyAgaW5jbHVkZSA8c3lzL3BvbGwuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VVElMX0gKLSMgaW5jbHVkZSA8dXRpbC5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0xJQlVUSUxfSAotIyBpbmNsdWRlIDxsaWJ1dGlsLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJzc2guaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0jaW5jbHVkZSAicGF0aG5hbWVzLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgIm1hdGNoLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAiY2hhbm5lbHMuaCIKLSNpbmNsdWRlICJtc2cuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJtb25pdG9yX2ZkcGFzcy5oIgotI2luY2x1ZGUgInNzaHB0eS5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgInJlYWRjb25mLmgiCi0jaW5jbHVkZSAiY2xpZW50bG9vcC5oIgotCi0vKiBmcm9tIHNzaC5jICovCi1leHRlcm4gaW50IHR0eV9mbGFnOwotZXh0ZXJuIE9wdGlvbnMgb3B0aW9uczsKLWV4dGVybiBpbnQgc3RkaW5fbnVsbF9mbGFnOwotZXh0ZXJuIGNoYXIgKmhvc3Q7Ci1leHRlcm4gaW50IHN1YnN5c3RlbV9mbGFnOwotZXh0ZXJuIEJ1ZmZlciBjb21tYW5kOwotZXh0ZXJuIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBxdWl0X3BlbmRpbmc7Ci1leHRlcm4gY2hhciAqc3RkaW9fZm9yd2FyZF9ob3N0OwotZXh0ZXJuIGludCBzdGRpb19mb3J3YXJkX3BvcnQ7Ci0KLS8qIENvbnRleHQgZm9yIHNlc3Npb24gb3BlbiBjb25maXJtYXRpb24gY2FsbGJhY2sgKi8KLXN0cnVjdCBtdXhfc2Vzc2lvbl9jb25maXJtX2N0eCB7Ci0JdV9pbnQgd2FudF90dHk7Ci0JdV9pbnQgd2FudF9zdWJzeXM7Ci0JdV9pbnQgd2FudF94X2Z3ZDsKLQl1X2ludCB3YW50X2FnZW50X2Z3ZDsKLQlCdWZmZXIgY21kOwotCWNoYXIgKnRlcm07Ci0Jc3RydWN0IHRlcm1pb3MgdGlvOwotCWNoYXIgKiplbnY7Ci0JdV9pbnQgcmlkOwotfTsKLQotLyogQ29udGV4dCBmb3IgZ2xvYmFsIGNoYW5uZWwgY2FsbGJhY2sgKi8KLXN0cnVjdCBtdXhfY2hhbm5lbF9jb25maXJtX2N0eCB7Ci0JdV9pbnQgY2lkOwkvKiBjaGFubmVsIGlkICovCi0JdV9pbnQgcmlkOwkvKiByZXF1ZXN0IGlkICovCi0JaW50IGZpZDsJLyogZm9yd2FyZCBpZCAqLwotfTsKLQotLyogZmQgdG8gY29udHJvbCBzb2NrZXQgKi8KLWludCBtdXhzZXJ2ZXJfc29jayA9IC0xOwotCi0vKiBjbGllbnQgcmVxdWVzdCBpZCAqLwotdV9pbnQgbXV4Y2xpZW50X3JlcXVlc3RfaWQgPSAwOwotCi0vKiBNdWx0aXBsZXhpbmcgY29udHJvbCBjb21tYW5kICovCi11X2ludCBtdXhjbGllbnRfY29tbWFuZCA9IDA7Ci0KLS8qIFNldCB3aGVuIHNpZ25hbGxlZC4gKi8KLXN0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgbXV4Y2xpZW50X3Rlcm1pbmF0ZSA9IDA7Ci0KLS8qIFBJRCBvZiBtdWx0aXBsZXggc2VydmVyICovCi1zdGF0aWMgdV9pbnQgbXV4c2VydmVyX3BpZCA9IDA7Ci0KLXN0YXRpYyBDaGFubmVsICptdXhfbGlzdGVuZXJfY2hhbm5lbCA9IE5VTEw7Ci0KLXN0cnVjdCBtdXhfbWFzdGVyX3N0YXRlIHsKLQlpbnQgaGVsbG9fcmN2ZDsKLX07Ci0KLS8qIG11eCBwcm90b2NvbCBtZXNzYWdlcyAqLwotI2RlZmluZSBNVVhfTVNHX0hFTExPCQkweDAwMDAwMDAxCi0jZGVmaW5lIE1VWF9DX05FV19TRVNTSU9OCTB4MTAwMDAwMDIKLSNkZWZpbmUgTVVYX0NfQUxJVkVfQ0hFQ0sJMHgxMDAwMDAwNAotI2RlZmluZSBNVVhfQ19URVJNSU5BVEUJCTB4MTAwMDAwMDUKLSNkZWZpbmUgTVVYX0NfT1BFTl9GV0QJCTB4MTAwMDAwMDYKLSNkZWZpbmUgTVVYX0NfQ0xPU0VfRldECQkweDEwMDAwMDA3Ci0jZGVmaW5lIE1VWF9DX05FV19TVERJT19GV0QJMHgxMDAwMDAwOAotI2RlZmluZSBNVVhfQ19TVE9QX0xJU1RFTklORwkweDEwMDAwMDA5Ci0jZGVmaW5lIE1VWF9TX09LCQkweDgwMDAwMDAxCi0jZGVmaW5lIE1VWF9TX1BFUk1JU1NJT05fREVOSUVECTB4ODAwMDAwMDIKLSNkZWZpbmUgTVVYX1NfRkFJTFVSRQkJMHg4MDAwMDAwMwotI2RlZmluZSBNVVhfU19FWElUX01FU1NBR0UJMHg4MDAwMDAwNAotI2RlZmluZSBNVVhfU19BTElWRQkJMHg4MDAwMDAwNQotI2RlZmluZSBNVVhfU19TRVNTSU9OX09QRU5FRAkweDgwMDAwMDA2Ci0jZGVmaW5lIE1VWF9TX1JFTU9URV9QT1JUCTB4ODAwMDAwMDcKLSNkZWZpbmUgTVVYX1NfVFRZX0FMTE9DX0ZBSUwJMHg4MDAwMDAwOAotCi0vKiB0eXBlIGNvZGVzIGZvciBNVVhfQ19PUEVOX0ZXRCBhbmQgTVVYX0NfQ0xPU0VfRldEICovCi0jZGVmaW5lIE1VWF9GV0RfTE9DQUwgICAxCi0jZGVmaW5lIE1VWF9GV0RfUkVNT1RFICAyCi0jZGVmaW5lIE1VWF9GV0RfRFlOQU1JQyAzCi0KLXN0YXRpYyB2b2lkIG11eF9zZXNzaW9uX2NvbmZpcm0oaW50LCBpbnQsIHZvaWQgKik7Ci0KLXN0YXRpYyBpbnQgcHJvY2Vzc19tdXhfbWFzdGVyX2hlbGxvKHVfaW50LCBDaGFubmVsICosIEJ1ZmZlciAqLCBCdWZmZXIgKik7Ci1zdGF0aWMgaW50IHByb2Nlc3NfbXV4X25ld19zZXNzaW9uKHVfaW50LCBDaGFubmVsICosIEJ1ZmZlciAqLCBCdWZmZXIgKik7Ci1zdGF0aWMgaW50IHByb2Nlc3NfbXV4X2FsaXZlX2NoZWNrKHVfaW50LCBDaGFubmVsICosIEJ1ZmZlciAqLCBCdWZmZXIgKik7Ci1zdGF0aWMgaW50IHByb2Nlc3NfbXV4X3Rlcm1pbmF0ZSh1X2ludCwgQ2hhbm5lbCAqLCBCdWZmZXIgKiwgQnVmZmVyICopOwotc3RhdGljIGludCBwcm9jZXNzX211eF9vcGVuX2Z3ZCh1X2ludCwgQ2hhbm5lbCAqLCBCdWZmZXIgKiwgQnVmZmVyICopOwotc3RhdGljIGludCBwcm9jZXNzX211eF9jbG9zZV9md2QodV9pbnQsIENoYW5uZWwgKiwgQnVmZmVyICosIEJ1ZmZlciAqKTsKLXN0YXRpYyBpbnQgcHJvY2Vzc19tdXhfc3RkaW9fZndkKHVfaW50LCBDaGFubmVsICosIEJ1ZmZlciAqLCBCdWZmZXIgKik7Ci1zdGF0aWMgaW50IHByb2Nlc3NfbXV4X3N0b3BfbGlzdGVuaW5nKHVfaW50LCBDaGFubmVsICosIEJ1ZmZlciAqLCBCdWZmZXIgKik7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCXVfaW50IHR5cGU7Ci0JaW50ICgqaGFuZGxlcikodV9pbnQsIENoYW5uZWwgKiwgQnVmZmVyICosIEJ1ZmZlciAqKTsKLX0gbXV4X21hc3Rlcl9oYW5kbGVyc1tdID0gewotCXsgTVVYX01TR19IRUxMTywgcHJvY2Vzc19tdXhfbWFzdGVyX2hlbGxvIH0sCi0JeyBNVVhfQ19ORVdfU0VTU0lPTiwgcHJvY2Vzc19tdXhfbmV3X3Nlc3Npb24gfSwKLQl7IE1VWF9DX0FMSVZFX0NIRUNLLCBwcm9jZXNzX211eF9hbGl2ZV9jaGVjayB9LAotCXsgTVVYX0NfVEVSTUlOQVRFLCBwcm9jZXNzX211eF90ZXJtaW5hdGUgfSwKLQl7IE1VWF9DX09QRU5fRldELCBwcm9jZXNzX211eF9vcGVuX2Z3ZCB9LAotCXsgTVVYX0NfQ0xPU0VfRldELCBwcm9jZXNzX211eF9jbG9zZV9md2QgfSwKLQl7IE1VWF9DX05FV19TVERJT19GV0QsIHByb2Nlc3NfbXV4X3N0ZGlvX2Z3ZCB9LAotCXsgTVVYX0NfU1RPUF9MSVNURU5JTkcsIHByb2Nlc3NfbXV4X3N0b3BfbGlzdGVuaW5nIH0sCi0JeyAwLCBOVUxMIH0KLX07Ci0KLS8qIENsZWFudXAgY2FsbGJhY2sgZmlyZWQgb24gY2xvc3VyZSBvZiBtdXggc2xhdmUgX3Nlc3Npb25fIGNoYW5uZWwgKi8KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotbXV4X21hc3Rlcl9zZXNzaW9uX2NsZWFudXBfY2IoaW50IGNpZCwgdm9pZCAqdW51c2VkKQotewotCUNoYW5uZWwgKmNjLCAqYyA9IGNoYW5uZWxfYnlfaWQoY2lkKTsKLQotCWRlYnVnMygiJXM6IGVudGVyaW5nIGZvciBjaGFubmVsICVkIiwgX19mdW5jX18sIGNpZCk7Ci0JaWYgKGMgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBjaGFubmVsX2J5X2lkKCVpKSA9PSBOVUxMIiwgX19mdW5jX18sIGNpZCk7Ci0JaWYgKGMtPmN0bF9jaGFuICE9IC0xKSB7Ci0JCWlmICgoY2MgPSBjaGFubmVsX2J5X2lkKGMtPmN0bF9jaGFuKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCIlczogY2hhbm5lbCAlZCBtaXNzaW5nIGNvbnRyb2wgY2hhbm5lbCAlZCIsCi0JCQkgICAgX19mdW5jX18sIGMtPnNlbGYsIGMtPmN0bF9jaGFuKTsKLQkJYy0+Y3RsX2NoYW4gPSAtMTsKLQkJY2MtPnJlbW90ZV9pZCA9IC0xOwotCQljaGFuX3JjdmRfb2Nsb3NlKGNjKTsKLQl9Ci0JY2hhbm5lbF9jYW5jZWxfY2xlYW51cChjLT5zZWxmKTsKLX0KLQotLyogQ2xlYW51cCBjYWxsYmFjayBmaXJlZCBvbiBjbG9zdXJlIG9mIG11eCBzbGF2ZSBfY29udHJvbF8gY2hhbm5lbCAqLwotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1tdXhfbWFzdGVyX2NvbnRyb2xfY2xlYW51cF9jYihpbnQgY2lkLCB2b2lkICp1bnVzZWQpCi17Ci0JQ2hhbm5lbCAqc2MsICpjID0gY2hhbm5lbF9ieV9pZChjaWQpOwotCi0JZGVidWczKCIlczogZW50ZXJpbmcgZm9yIGNoYW5uZWwgJWQiLCBfX2Z1bmNfXywgY2lkKTsKLQlpZiAoYyA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IGNoYW5uZWxfYnlfaWQoJWkpID09IE5VTEwiLCBfX2Z1bmNfXywgY2lkKTsKLQlpZiAoYy0+cmVtb3RlX2lkICE9IC0xKSB7Ci0JCWlmICgoc2MgPSBjaGFubmVsX2J5X2lkKGMtPnJlbW90ZV9pZCkpID09IE5VTEwpCi0JCQlmYXRhbCgiJXM6IGNoYW5uZWwgJWQgbWlzc2luZyBzZXNzaW9uIGNoYW5uZWwgJWQiLAotCQkJICAgIF9fZnVuY19fLCBjLT5zZWxmLCBjLT5yZW1vdGVfaWQpOwotCQljLT5yZW1vdGVfaWQgPSAtMTsKLQkJc2MtPmN0bF9jaGFuID0gLTE7Ci0JCWlmIChzYy0+dHlwZSAhPSBTU0hfQ0hBTk5FTF9PUEVOKSB7Ci0JCQlkZWJ1ZzIoIiVzOiBjaGFubmVsICVkOiBub3Qgb3BlbiIsIF9fZnVuY19fLCBzYy0+c2VsZik7Ci0JCQljaGFuX21hcmtfZGVhZChzYyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2MtPmlzdGF0ZSA9PSBDSEFOX0lOUFVUX09QRU4pCi0JCQkJY2hhbl9yZWFkX2ZhaWxlZChzYyk7Ci0JCQlpZiAoc2MtPm9zdGF0ZSA9PSBDSEFOX09VVFBVVF9PUEVOKQotCQkJCWNoYW5fd3JpdGVfZmFpbGVkKHNjKTsKLQkJfQotCX0KLQljaGFubmVsX2NhbmNlbF9jbGVhbnVwKGMtPnNlbGYpOwotfQotCi0vKiBDaGVjayBtdXggY2xpZW50IGVudmlyb25tZW50IHZhcmlhYmxlcyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIG11eCBtYXN0ZXIuICovCi1zdGF0aWMgaW50Ci1lbnZfcGVybWl0dGVkKGNoYXIgKmVudikKLXsKLQlpbnQgaSwgcmV0OwotCWNoYXIgbmFtZVsxMDI0XSwgKmNwOwotCi0JaWYgKChjcCA9IHN0cmNocihlbnYsICc9JykpID09IE5VTEwgfHwgY3AgPT0gZW52KQotCQlyZXR1cm4gMDsKLQlyZXQgPSBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlLipzIiwgKGludCkoY3AgLSBlbnYpLCBlbnYpOwotCWlmIChyZXQgPD0gMCB8fCAoc2l6ZV90KXJldCA+PSBzaXplb2YobmFtZSkpIHsKLQkJZXJyb3IoImVudl9wZXJtaXR0ZWQ6IG5hbWUgJyUuMTAwcy4uLicgdG9vIGxvbmciLCBlbnYpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1fc2VuZF9lbnY7IGkrKykKLQkJaWYgKG1hdGNoX3BhdHRlcm4obmFtZSwgb3B0aW9ucy5zZW5kX2VudltpXSkpCi0JCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi0vKiBNdXggbWFzdGVyIHByb3RvY29sIG1lc3NhZ2UgaGFuZGxlcnMgKi8KLQotc3RhdGljIGludAotcHJvY2Vzc19tdXhfbWFzdGVyX2hlbGxvKHVfaW50IHJpZCwgQ2hhbm5lbCAqYywgQnVmZmVyICptLCBCdWZmZXIgKnIpCi17Ci0JdV9pbnQgdmVyOwotCXN0cnVjdCBtdXhfbWFzdGVyX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgbXV4X21hc3Rlcl9zdGF0ZSAqKWMtPm11eF9jdHg7Ci0KLQlpZiAoc3RhdGUgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBjaGFubmVsICVkOiBjLT5tdXhfY3R4ID09IE5VTEwiLCBfX2Z1bmNfXywgYy0+c2VsZik7Ci0JaWYgKHN0YXRlLT5oZWxsb19yY3ZkKSB7Ci0JCWVycm9yKCIlczogSEVMTE8gcmVjZWl2ZWQgdHdpY2UiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGJ1ZmZlcl9nZXRfaW50X3JldCgmdmVyLCBtKSAhPSAwKSB7Ci0gbWFsZjoKLQkJZXJyb3IoIiVzOiBtYWxmb3JtZWQgbWVzc2FnZSIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodmVyICE9IFNTSE1VWF9WRVIpIHsKLQkJZXJyb3IoIlVuc3VwcG9ydGVkIG11bHRpcGxleGluZyBwcm90b2NvbCB2ZXJzaW9uICVkICIKLQkJICAgICIoZXhwZWN0ZWQgJWQpIiwgdmVyLCBTU0hNVVhfVkVSKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlkZWJ1ZzIoIiVzOiBjaGFubmVsICVkIHNsYXZlIHZlcnNpb24gJXUiLCBfX2Z1bmNfXywgYy0+c2VsZiwgdmVyKTsKLQotCS8qIE5vIGV4dGVuc2lvbnMgYXJlIHByZXNlbnRseSBkZWZpbmVkICovCi0Jd2hpbGUgKGJ1ZmZlcl9sZW4obSkgPiAwKSB7Ci0JCWNoYXIgKm5hbWUgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQobSwgTlVMTCk7Ci0JCWNoYXIgKnZhbHVlID0gYnVmZmVyX2dldF9zdHJpbmdfcmV0KG0sIE5VTEwpOwotCi0JCWlmIChuYW1lID09IE5VTEwgfHwgdmFsdWUgPT0gTlVMTCkgewotCQkJaWYgKG5hbWUgIT0gTlVMTCkKLQkJCQl4ZnJlZShuYW1lKTsKLQkJCWdvdG8gbWFsZjsKLQkJfQotCQlkZWJ1ZzIoIlVucmVjb2duaXNlZCBzbGF2ZSBleHRlbnNpb24gXCIlc1wiIiwgbmFtZSk7Ci0JCXhmcmVlKG5hbWUpOwotCQl4ZnJlZSh2YWx1ZSk7Ci0JfQotCXN0YXRlLT5oZWxsb19yY3ZkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19tdXhfbmV3X3Nlc3Npb24odV9pbnQgcmlkLCBDaGFubmVsICpjLCBCdWZmZXIgKm0sIEJ1ZmZlciAqcikKLXsKLQlDaGFubmVsICpuYzsKLQlzdHJ1Y3QgbXV4X3Nlc3Npb25fY29uZmlybV9jdHggKmNjdHg7Ci0JY2hhciAqcmVzZXJ2ZWQsICpjbWQsICpjcDsKLQl1X2ludCBpLCBqLCBsZW4sIGVudl9sZW4sIGVzY2FwZV9jaGFyLCB3aW5kb3csIHBhY2tldG1heDsKLQlpbnQgbmV3X2ZkWzNdOwotCi0JLyogUmVwbHkgZm9yIFNTSE1VWF9DT01NQU5EX09QRU4gKi8KLQljY3R4ID0geGNhbGxvYygxLCBzaXplb2YoKmNjdHgpKTsKLQljY3R4LT50ZXJtID0gTlVMTDsKLQljY3R4LT5yaWQgPSByaWQ7Ci0JY21kID0gcmVzZXJ2ZWQgPSBOVUxMOwotCWlmICgocmVzZXJ2ZWQgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQobSwgTlVMTCkpID09IE5VTEwgfHwKLQkgICAgYnVmZmVyX2dldF9pbnRfcmV0KCZjY3R4LT53YW50X3R0eSwgbSkgIT0gMCB8fAotCSAgICBidWZmZXJfZ2V0X2ludF9yZXQoJmNjdHgtPndhbnRfeF9md2QsIG0pICE9IDAgfHwKLQkgICAgYnVmZmVyX2dldF9pbnRfcmV0KCZjY3R4LT53YW50X2FnZW50X2Z3ZCwgbSkgIT0gMCB8fAotCSAgICBidWZmZXJfZ2V0X2ludF9yZXQoJmNjdHgtPndhbnRfc3Vic3lzLCBtKSAhPSAwIHx8Ci0JICAgIGJ1ZmZlcl9nZXRfaW50X3JldCgmZXNjYXBlX2NoYXIsIG0pICE9IDAgfHwKLQkgICAgKGNjdHgtPnRlcm0gPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQobSwgJmxlbikpID09IE5VTEwgfHwKLQkgICAgKGNtZCA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChtLCAmbGVuKSkgPT0gTlVMTCkgewotIG1hbGY6Ci0JCWlmIChjbWQgIT0gTlVMTCkKLQkJCXhmcmVlKGNtZCk7Ci0JCWlmIChyZXNlcnZlZCAhPSBOVUxMKQotCQkJeGZyZWUocmVzZXJ2ZWQpOwotCQlpZiAoY2N0eC0+dGVybSAhPSBOVUxMKQotCQkJeGZyZWUoY2N0eC0+dGVybSk7Ci0JCWVycm9yKCIlczogbWFsZm9ybWVkIG1lc3NhZ2UiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JeGZyZWUocmVzZXJ2ZWQpOwotCXJlc2VydmVkID0gTlVMTDsKLQotCWNjdHgtPmVudiA9IE5VTEw7Ci0JZW52X2xlbiA9IDA7Ci0Jd2hpbGUgKGJ1ZmZlcl9sZW4obSkgPiAwKSB7Ci0jZGVmaW5lIE1VWF9NQVhfRU5WX1ZBUlMJNDA5NgotCQlpZiAoKGNwID0gYnVmZmVyX2dldF9zdHJpbmdfcmV0KG0sICZsZW4pKSA9PSBOVUxMKSB7Ci0JCQl4ZnJlZShjbWQpOwotCQkJZ290byBtYWxmOwotCQl9Ci0JCWlmICghZW52X3Blcm1pdHRlZChjcCkpIHsKLQkJCXhmcmVlKGNwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWNjdHgtPmVudiA9IHhyZWFsbG9jKGNjdHgtPmVudiwgZW52X2xlbiArIDIsCi0JCSAgICBzaXplb2YoKmNjdHgtPmVudikpOwotCQljY3R4LT5lbnZbZW52X2xlbisrXSA9IGNwOwotCQljY3R4LT5lbnZbZW52X2xlbl0gPSBOVUxMOwotCQlpZiAoZW52X2xlbiA+IE1VWF9NQVhfRU5WX1ZBUlMpIHsKLQkJCWVycm9yKCI+JWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlY2VpdmVkLCBpZ25vcmluZyAiCi0JCQkgICAgImFkZGl0aW9uYWwiLCBNVVhfTUFYX0VOVl9WQVJTKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JZGVidWcyKCIlczogY2hhbm5lbCAlZDogcmVxdWVzdCB0dHkgJWQsIFggJWQsIGFnZW50ICVkLCBzdWJzeXMgJWQsICIKLQkgICAgInRlcm0gXCIlc1wiLCBjbWQgXCIlc1wiLCBlbnYgJXUiLCBfX2Z1bmNfXywgYy0+c2VsZiwKLQkgICAgY2N0eC0+d2FudF90dHksIGNjdHgtPndhbnRfeF9md2QsIGNjdHgtPndhbnRfYWdlbnRfZndkLAotCSAgICBjY3R4LT53YW50X3N1YnN5cywgY2N0eC0+dGVybSwgY21kLCBlbnZfbGVuKTsKLQotCWJ1ZmZlcl9pbml0KCZjY3R4LT5jbWQpOwotCWJ1ZmZlcl9hcHBlbmQoJmNjdHgtPmNtZCwgY21kLCBzdHJsZW4oY21kKSk7Ci0JeGZyZWUoY21kKTsKLQljbWQgPSBOVUxMOwotCi0JLyogR2F0aGVyIGZkcyBmcm9tIGNsaWVudCAqLwotCWZvcihpID0gMDsgaSA8IDM7IGkrKykgewotCQlpZiAoKG5ld19mZFtpXSA9IG1tX3JlY2VpdmVfZmQoYy0+c29jaykpID09IC0xKSB7Ci0JCQllcnJvcigiJXM6IGZhaWxlZCB0byByZWNlaXZlIGZkICVkIGZyb20gc2xhdmUiLAotCQkJICAgIF9fZnVuY19fLCBpKTsKLQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJY2xvc2UobmV3X2ZkW2pdKTsKLQkJCWZvciAoaiA9IDA7IGogPCBlbnZfbGVuOyBqKyspCi0JCQkJeGZyZWUoY2N0eC0+ZW52W2pdKTsKLQkJCWlmIChlbnZfbGVuID4gMCkKLQkJCQl4ZnJlZShjY3R4LT5lbnYpOwotCQkJeGZyZWUoY2N0eC0+dGVybSk7Ci0JCQlidWZmZXJfZnJlZSgmY2N0eC0+Y21kKTsKLQkJCXhmcmVlKGNjdHgpOwotCi0JCQkvKiBwcmVwYXJlIHJlcGx5ICovCi0JCQlidWZmZXJfcHV0X2ludChyLCBNVVhfU19GQUlMVVJFKTsKLQkJCWJ1ZmZlcl9wdXRfaW50KHIsIHJpZCk7Ci0JCQlidWZmZXJfcHV0X2NzdHJpbmcociwKLQkJCSAgICAiZGlkIG5vdCByZWNlaXZlIGZpbGUgZGVzY3JpcHRvcnMiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCWRlYnVnMygiJXM6IGdvdCBmZHMgc3RkaW4gJWQsIHN0ZG91dCAlZCwgc3RkZXJyICVkIiwgX19mdW5jX18sCi0JICAgIG5ld19mZFswXSwgbmV3X2ZkWzFdLCBuZXdfZmRbMl0pOwotCi0JLyogWFhYIHN1cHBvcnQgbXVsdGlwbGUgY2hpbGQgc2Vzc2lvbnMgaW4gZnV0dXJlICovCi0JaWYgKGMtPnJlbW90ZV9pZCAhPSAtMSkgewotCQlkZWJ1ZzIoIiVzOiBzZXNzaW9uIGFscmVhZHkgb3BlbiIsIF9fZnVuY19fKTsKLQkJLyogcHJlcGFyZSByZXBseSAqLwotCQlidWZmZXJfcHV0X2ludChyLCBNVVhfU19GQUlMVVJFKTsKLQkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKLQkJYnVmZmVyX3B1dF9jc3RyaW5nKHIsICJNdWx0aXBsZSBzZXNzaW9ucyBub3Qgc3VwcG9ydGVkIik7Ci0gY2xlYW51cDoKLQkJY2xvc2UobmV3X2ZkWzBdKTsKLQkJY2xvc2UobmV3X2ZkWzFdKTsKLQkJY2xvc2UobmV3X2ZkWzJdKTsKLQkJeGZyZWUoY2N0eC0+dGVybSk7Ci0JCWlmIChlbnZfbGVuICE9IDApIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBlbnZfbGVuOyBpKyspCi0JCQkJeGZyZWUoY2N0eC0+ZW52W2ldKTsKLQkJCXhmcmVlKGNjdHgtPmVudik7Ci0JCX0KLQkJYnVmZmVyX2ZyZWUoJmNjdHgtPmNtZCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChvcHRpb25zLmNvbnRyb2xfbWFzdGVyID09IFNTSENUTF9NQVNURVJfQVNLIHx8Ci0JICAgIG9wdGlvbnMuY29udHJvbF9tYXN0ZXIgPT0gU1NIQ1RMX01BU1RFUl9BVVRPX0FTSykgewotCQlpZiAoIWFza19wZXJtaXNzaW9uKCJBbGxvdyBzaGFyZWQgY29ubmVjdGlvbiB0byAlcz8gIiwgaG9zdCkpIHsKLQkJCWRlYnVnMigiJXM6IHNlc3Npb24gcmVmdXNlZCBieSB1c2VyIiwgX19mdW5jX18pOwotCQkJLyogcHJlcGFyZSByZXBseSAqLwotCQkJYnVmZmVyX3B1dF9pbnQociwgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQpOwotCQkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKLQkJCWJ1ZmZlcl9wdXRfY3N0cmluZyhyLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCX0KLQotCS8qIFRyeSB0byBwaWNrIHVwIHR0eW1vZGVzIGZyb20gY2xpZW50IGJlZm9yZSBpdCBnb2VzIHJhdyAqLwotCWlmIChjY3R4LT53YW50X3R0eSAmJiB0Y2dldGF0dHIobmV3X2ZkWzBdLCAmY2N0eC0+dGlvKSA9PSAtMSkKLQkJZXJyb3IoIiVzOiB0Y2dldGF0dHI6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0KLQkvKiBlbmFibGUgbm9uYmxvY2tpbmcgdW5sZXNzIHR0eSAqLwotCWlmICghaXNhdHR5KG5ld19mZFswXSkpCi0JCXNldF9ub25ibG9jayhuZXdfZmRbMF0pOwotCWlmICghaXNhdHR5KG5ld19mZFsxXSkpCi0JCXNldF9ub25ibG9jayhuZXdfZmRbMV0pOwotCWlmICghaXNhdHR5KG5ld19mZFsyXSkpCi0JCXNldF9ub25ibG9jayhuZXdfZmRbMl0pOwotCi0Jd2luZG93ID0gQ0hBTl9TRVNfV0lORE9XX0RFRkFVTFQ7Ci0JcGFja2V0bWF4ID0gQ0hBTl9TRVNfUEFDS0VUX0RFRkFVTFQ7Ci0JaWYgKGNjdHgtPndhbnRfdHR5KSB7Ci0JCXdpbmRvdyA+Pj0gMTsKLQkJcGFja2V0bWF4ID4+PSAxOwotCX0KLQotCW5jID0gY2hhbm5lbF9uZXcoInNlc3Npb24iLCBTU0hfQ0hBTk5FTF9PUEVOSU5HLAotCSAgICBuZXdfZmRbMF0sIG5ld19mZFsxXSwgbmV3X2ZkWzJdLCB3aW5kb3csIHBhY2tldG1heCwKLQkgICAgQ0hBTl9FWFRFTkRFRF9XUklURSwgImNsaWVudC1zZXNzaW9uIiwgLypub25ibG9jayovMCk7Ci0KLQluYy0+Y3RsX2NoYW4gPSBjLT5zZWxmOwkJLyogbGluayBzZXNzaW9uIC0+IGNvbnRyb2wgY2hhbm5lbCAqLwotCWMtPnJlbW90ZV9pZCA9IG5jLT5zZWxmOyAJLyogbGluayBjb250cm9sIC0+IHNlc3Npb24gY2hhbm5lbCAqLwotCi0JaWYgKGNjdHgtPndhbnRfdHR5ICYmIGVzY2FwZV9jaGFyICE9IDB4ZmZmZmZmZmYpIHsKLQkJY2hhbm5lbF9yZWdpc3Rlcl9maWx0ZXIobmMtPnNlbGYsCi0JCSAgICBjbGllbnRfc2ltcGxlX2VzY2FwZV9maWx0ZXIsIE5VTEwsCi0JCSAgICBjbGllbnRfZmlsdGVyX2NsZWFudXAsCi0JCSAgICBjbGllbnRfbmV3X2VzY2FwZV9maWx0ZXJfY3R4KChpbnQpZXNjYXBlX2NoYXIpKTsKLQl9Ci0KLQlkZWJ1ZzIoIiVzOiBjaGFubmVsX25ldzogJWQgbGlua2VkIHRvIGNvbnRyb2wgY2hhbm5lbCAlZCIsCi0JICAgIF9fZnVuY19fLCBuYy0+c2VsZiwgbmMtPmN0bF9jaGFuKTsKLQotCWNoYW5uZWxfc2VuZF9vcGVuKG5jLT5zZWxmKTsKLQljaGFubmVsX3JlZ2lzdGVyX29wZW5fY29uZmlybShuYy0+c2VsZiwgbXV4X3Nlc3Npb25fY29uZmlybSwgY2N0eCk7Ci0JYy0+bXV4X3BhdXNlID0gMTsgLyogc3RvcCBoYW5kbGluZyBtZXNzYWdlcyB1bnRpbCBvcGVuX2NvbmZpcm0gZG9uZSAqLwotCWNoYW5uZWxfcmVnaXN0ZXJfY2xlYW51cChuYy0+c2VsZiwgbXV4X21hc3Rlcl9zZXNzaW9uX2NsZWFudXBfY2IsIDEpOwotCi0JLyogcmVwbHkgaXMgZGVmZXJyZWQsIHNlbnQgYnkgbXV4X3Nlc3Npb25fY29uZmlybSAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX211eF9hbGl2ZV9jaGVjayh1X2ludCByaWQsIENoYW5uZWwgKmMsIEJ1ZmZlciAqbSwgQnVmZmVyICpyKQotewotCWRlYnVnMigiJXM6IGNoYW5uZWwgJWQ6IGFsaXZlIGNoZWNrIiwgX19mdW5jX18sIGMtPnNlbGYpOwotCi0JLyogcHJlcGFyZSByZXBseSAqLwotCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX0FMSVZFKTsKLQlidWZmZXJfcHV0X2ludChyLCByaWQpOwotCWJ1ZmZlcl9wdXRfaW50KHIsICh1X2ludClnZXRwaWQoKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19tdXhfdGVybWluYXRlKHVfaW50IHJpZCwgQ2hhbm5lbCAqYywgQnVmZmVyICptLCBCdWZmZXIgKnIpCi17Ci0JZGVidWcyKCIlczogY2hhbm5lbCAlZDogdGVybWluYXRlIHJlcXVlc3QiLCBfX2Z1bmNfXywgYy0+c2VsZik7Ci0KLQlpZiAob3B0aW9ucy5jb250cm9sX21hc3RlciA9PSBTU0hDVExfTUFTVEVSX0FTSyB8fAotCSAgICBvcHRpb25zLmNvbnRyb2xfbWFzdGVyID09IFNTSENUTF9NQVNURVJfQVVUT19BU0spIHsKLQkJaWYgKCFhc2tfcGVybWlzc2lvbigiVGVybWluYXRlIHNoYXJlZCBjb25uZWN0aW9uIHRvICVzPyAiLAotCQkgICAgaG9zdCkpIHsKLQkJCWRlYnVnMigiJXM6IHRlcm1pbmF0aW9uIHJlZnVzZWQgYnkgdXNlciIsIF9fZnVuY19fKTsKLQkJCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX1BFUk1JU1NJT05fREVOSUVEKTsKLQkJCWJ1ZmZlcl9wdXRfaW50KHIsIHJpZCk7Ci0JCQlidWZmZXJfcHV0X2NzdHJpbmcociwgIlBlcm1pc3Npb24gZGVuaWVkIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXF1aXRfcGVuZGluZyA9IDE7Ci0JYnVmZmVyX3B1dF9pbnQociwgTVVYX1NfT0spOwotCWJ1ZmZlcl9wdXRfaW50KHIsIHJpZCk7Ci0JLyogWFhYIGV4aXQgaGFwcGVucyB0b28gc29vbiAtIG1lc3NhZ2UgbmV2ZXIgbWFrZXMgaXQgdG8gY2xpZW50ICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWZvcm1hdF9mb3J3YXJkKHVfaW50IGZ0eXBlLCBGb3J3YXJkICpmd2QpCi17Ci0JY2hhciAqcmV0OwotCi0Jc3dpdGNoIChmdHlwZSkgewotCWNhc2UgTVVYX0ZXRF9MT0NBTDoKLQkJeGFzcHJpbnRmKCZyZXQsICJsb2NhbCBmb3J3YXJkICUuMjAwczolZCAtPiAlLjIwMHM6JWQiLAotCQkgICAgKGZ3ZC0+bGlzdGVuX2hvc3QgPT0gTlVMTCkgPwotCQkgICAgKG9wdGlvbnMuZ2F0ZXdheV9wb3J0cyA/ICIqIiA6ICJMT0NBTEhPU1QiKSA6Ci0JCSAgICBmd2QtPmxpc3Rlbl9ob3N0LCBmd2QtPmxpc3Rlbl9wb3J0LAotCQkgICAgZndkLT5jb25uZWN0X2hvc3QsIGZ3ZC0+Y29ubmVjdF9wb3J0KTsKLQkJYnJlYWs7Ci0JY2FzZSBNVVhfRldEX0RZTkFNSUM6Ci0JCXhhc3ByaW50ZigmcmV0LCAiZHluYW1pYyBmb3J3YXJkICUuMjAwczolZCAtPiAqIiwKLQkJICAgIChmd2QtPmxpc3Rlbl9ob3N0ID09IE5VTEwpID8KLQkJICAgIChvcHRpb25zLmdhdGV3YXlfcG9ydHMgPyAiKiIgOiAiTE9DQUxIT1NUIikgOgotCQkgICAgIGZ3ZC0+bGlzdGVuX2hvc3QsIGZ3ZC0+bGlzdGVuX3BvcnQpOwotCQlicmVhazsKLQljYXNlIE1VWF9GV0RfUkVNT1RFOgotCQl4YXNwcmludGYoJnJldCwgInJlbW90ZSBmb3J3YXJkICUuMjAwczolZCAtPiAlLjIwMHM6JWQiLAotCQkgICAgKGZ3ZC0+bGlzdGVuX2hvc3QgPT0gTlVMTCkgPwotCQkgICAgIkxPQ0FMSE9TVCIgOiBmd2QtPmxpc3Rlbl9ob3N0LAotCQkgICAgZndkLT5saXN0ZW5fcG9ydCwKLQkJICAgIGZ3ZC0+Y29ubmVjdF9ob3N0LCBmd2QtPmNvbm5lY3RfcG9ydCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZhdGFsKCIlczogdW5rbm93biBmb3J3YXJkIHR5cGUgJXUiLCBfX2Z1bmNfXywgZnR5cGUpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50Ci1jb21wYXJlX2hvc3QoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKLXsKLQlpZiAoYSA9PSBOVUxMICYmIGIgPT0gTlVMTCkKLQkJcmV0dXJuIDE7Ci0JaWYgKGEgPT0gTlVMTCB8fCBiID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiBzdHJjbXAoYSwgYikgPT0gMDsKLX0KLQotc3RhdGljIGludAotY29tcGFyZV9mb3J3YXJkKEZvcndhcmQgKmEsIEZvcndhcmQgKmIpCi17Ci0JaWYgKCFjb21wYXJlX2hvc3QoYS0+bGlzdGVuX2hvc3QsIGItPmxpc3Rlbl9ob3N0KSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGEtPmxpc3Rlbl9wb3J0ICE9IGItPmxpc3Rlbl9wb3J0KQotCQlyZXR1cm4gMDsKLQlpZiAoIWNvbXBhcmVfaG9zdChhLT5jb25uZWN0X2hvc3QsIGItPmNvbm5lY3RfaG9zdCkpCi0JCXJldHVybiAwOwotCWlmIChhLT5jb25uZWN0X3BvcnQgIT0gYi0+Y29ubmVjdF9wb3J0KQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotbXV4X2NvbmZpcm1fcmVtb3RlX2ZvcndhcmQoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0Jc3RydWN0IG11eF9jaGFubmVsX2NvbmZpcm1fY3R4ICpmY3R4ID0gY3R4dDsKLQljaGFyICpmYWlsbXNnID0gTlVMTDsKLQlGb3J3YXJkICpyZndkOwotCUNoYW5uZWwgKmM7Ci0JQnVmZmVyIG91dDsKLQotCWlmICgoYyA9IGNoYW5uZWxfYnlfaWQoZmN0eC0+Y2lkKSkgPT0gTlVMTCkgewotCQkvKiBubyBjaGFubmVsIGZvciByZXBseSAqLwotCQllcnJvcigiJXM6IHVua25vd24gY2hhbm5lbCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQlidWZmZXJfaW5pdCgmb3V0KTsKLQlpZiAoZmN0eC0+ZmlkID49IG9wdGlvbnMubnVtX3JlbW90ZV9mb3J3YXJkcykgewotCQl4YXNwcmludGYoJmZhaWxtc2csICJ1bmtub3duIGZvcndhcmRpbmcgaWQgJWQiLCBmY3R4LT5maWQpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXJmd2QgPSAmb3B0aW9ucy5yZW1vdGVfZm9yd2FyZHNbZmN0eC0+ZmlkXTsKLQlkZWJ1ZygiJXM6ICVzIGZvcjogbGlzdGVuICVkLCBjb25uZWN0ICVzOiVkIiwgX19mdW5jX18sCi0JICAgIHR5cGUgPT0gU1NIMl9NU0dfUkVRVUVTVF9TVUNDRVNTID8gInN1Y2Nlc3MiIDogImZhaWx1cmUiLAotCSAgICByZndkLT5saXN0ZW5fcG9ydCwgcmZ3ZC0+Y29ubmVjdF9ob3N0LCByZndkLT5jb25uZWN0X3BvcnQpOwotCWlmICh0eXBlID09IFNTSDJfTVNHX1JFUVVFU1RfU1VDQ0VTUykgewotCQlpZiAocmZ3ZC0+bGlzdGVuX3BvcnQgPT0gMCkgewotCQkJcmZ3ZC0+YWxsb2NhdGVkX3BvcnQgPSBwYWNrZXRfZ2V0X2ludCgpOwotCQkJbG9naXQoIkFsbG9jYXRlZCBwb3J0ICV1IGZvciBtdXggcmVtb3RlIGZvcndhcmQiCi0JCQkgICAgIiB0byAlczolZCIsIHJmd2QtPmFsbG9jYXRlZF9wb3J0LAotCQkJICAgIHJmd2QtPmNvbm5lY3RfaG9zdCwgcmZ3ZC0+Y29ubmVjdF9wb3J0KTsKLQkJCWJ1ZmZlcl9wdXRfaW50KCZvdXQsIE1VWF9TX1JFTU9URV9QT1JUKTsKLQkJCWJ1ZmZlcl9wdXRfaW50KCZvdXQsIGZjdHgtPnJpZCk7Ci0JCQlidWZmZXJfcHV0X2ludCgmb3V0LCByZndkLT5hbGxvY2F0ZWRfcG9ydCk7Ci0JCX0gZWxzZSB7Ci0JCQlidWZmZXJfcHV0X2ludCgmb3V0LCBNVVhfU19PSyk7Ci0JCQlidWZmZXJfcHV0X2ludCgmb3V0LCBmY3R4LT5yaWQpOwotCQl9Ci0JCWdvdG8gb3V0OwotCX0gZWxzZSB7Ci0JCXhhc3ByaW50ZigmZmFpbG1zZywgInJlbW90ZSBwb3J0IGZvcndhcmRpbmcgZmFpbGVkIGZvciAiCi0JCSAgICAibGlzdGVuIHBvcnQgJWQiLCByZndkLT5saXN0ZW5fcG9ydCk7Ci0JfQotIGZhaWw6Ci0JZXJyb3IoIiVzOiAlcyIsIF9fZnVuY19fLCBmYWlsbXNnKTsKLQlidWZmZXJfcHV0X2ludCgmb3V0LCBNVVhfU19GQUlMVVJFKTsKLQlidWZmZXJfcHV0X2ludCgmb3V0LCBmY3R4LT5yaWQpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmb3V0LCBmYWlsbXNnKTsKLQl4ZnJlZShmYWlsbXNnKTsKLSBvdXQ6Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJmMtPm91dHB1dCwgYnVmZmVyX3B0cigmb3V0KSwgYnVmZmVyX2xlbigmb3V0KSk7Ci0JYnVmZmVyX2ZyZWUoJm91dCk7Ci0JaWYgKGMtPm11eF9wYXVzZSA8PSAwKQotCQlmYXRhbCgiJXM6IG11eF9wYXVzZSAlZCIsIF9fZnVuY19fLCBjLT5tdXhfcGF1c2UpOwotCWMtPm11eF9wYXVzZSA9IDA7IC8qIHN0YXJ0IHByb2Nlc3NpbmcgbWVzc2FnZXMgYWdhaW4gKi8KLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19tdXhfb3Blbl9md2QodV9pbnQgcmlkLCBDaGFubmVsICpjLCBCdWZmZXIgKm0sIEJ1ZmZlciAqcikKLXsKLQlGb3J3YXJkIGZ3ZDsKLQljaGFyICpmd2RfZGVzYyA9IE5VTEw7Ci0JdV9pbnQgZnR5cGU7Ci0JaW50IGksIHJldCA9IDAsIGZyZWVmd2QgPSAxOwotCi0JZndkLmxpc3Rlbl9ob3N0ID0gZndkLmNvbm5lY3RfaG9zdCA9IE5VTEw7Ci0JaWYgKGJ1ZmZlcl9nZXRfaW50X3JldCgmZnR5cGUsIG0pICE9IDAgfHwKLQkgICAgKGZ3ZC5saXN0ZW5faG9zdCA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChtLCBOVUxMKSkgPT0gTlVMTCB8fAotCSAgICBidWZmZXJfZ2V0X2ludF9yZXQoJmZ3ZC5saXN0ZW5fcG9ydCwgbSkgIT0gMCB8fAotCSAgICAoZndkLmNvbm5lY3RfaG9zdCA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3JldChtLCBOVUxMKSkgPT0gTlVMTCB8fAotCSAgICBidWZmZXJfZ2V0X2ludF9yZXQoJmZ3ZC5jb25uZWN0X3BvcnQsIG0pICE9IDApIHsKLQkJZXJyb3IoIiVzOiBtYWxmb3JtZWQgbWVzc2FnZSIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICgqZndkLmxpc3Rlbl9ob3N0ID09ICdcMCcpIHsKLQkJeGZyZWUoZndkLmxpc3Rlbl9ob3N0KTsKLQkJZndkLmxpc3Rlbl9ob3N0ID0gTlVMTDsKLQl9Ci0JaWYgKCpmd2QuY29ubmVjdF9ob3N0ID09ICdcMCcpIHsKLQkJeGZyZWUoZndkLmNvbm5lY3RfaG9zdCk7Ci0JCWZ3ZC5jb25uZWN0X2hvc3QgPSBOVUxMOwotCX0KLQotCWRlYnVnMigiJXM6IGNoYW5uZWwgJWQ6IHJlcXVlc3QgJXMiLCBfX2Z1bmNfXywgYy0+c2VsZiwKLQkgICAgKGZ3ZF9kZXNjID0gZm9ybWF0X2ZvcndhcmQoZnR5cGUsICZmd2QpKSk7Ci0KLQlpZiAoZnR5cGUgIT0gTVVYX0ZXRF9MT0NBTCAmJiBmdHlwZSAhPSBNVVhfRldEX1JFTU9URSAmJgotCSAgICBmdHlwZSAhPSBNVVhfRldEX0RZTkFNSUMpIHsKLQkJbG9naXQoIiVzOiBpbnZhbGlkIGZvcndhcmRpbmcgdHlwZSAldSIsIF9fZnVuY19fLCBmdHlwZSk7Ci0gaW52YWxpZDoKLQkJaWYgKGZ3ZC5saXN0ZW5faG9zdCkKLQkJCXhmcmVlKGZ3ZC5saXN0ZW5faG9zdCk7Ci0JCWlmIChmd2QuY29ubmVjdF9ob3N0KQotCQkJeGZyZWUoZndkLmNvbm5lY3RfaG9zdCk7Ci0JCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX0ZBSUxVUkUpOwotCQlidWZmZXJfcHV0X2ludChyLCByaWQpOwotCQlidWZmZXJfcHV0X2NzdHJpbmcociwgIkludmFsaWQgZm9yd2FyZGluZyByZXF1ZXN0Iik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoZndkLmxpc3Rlbl9wb3J0ID49IDY1NTM2KSB7Ci0JCWxvZ2l0KCIlczogaW52YWxpZCBsaXN0ZW4gcG9ydCAldSIsIF9fZnVuY19fLAotCQkgICAgZndkLmxpc3Rlbl9wb3J0KTsKLQkJZ290byBpbnZhbGlkOwotCX0KLQlpZiAoZndkLmNvbm5lY3RfcG9ydCA+PSA2NTUzNiB8fCAoZnR5cGUgIT0gTVVYX0ZXRF9EWU5BTUlDICYmCi0JICAgIGZ0eXBlICE9IE1VWF9GV0RfUkVNT1RFICYmIGZ3ZC5jb25uZWN0X3BvcnQgPT0gMCkpIHsKLQkJbG9naXQoIiVzOiBpbnZhbGlkIGNvbm5lY3QgcG9ydCAldSIsIF9fZnVuY19fLAotCQkgICAgZndkLmNvbm5lY3RfcG9ydCk7Ci0JCWdvdG8gaW52YWxpZDsKLQl9Ci0JaWYgKGZ0eXBlICE9IE1VWF9GV0RfRFlOQU1JQyAmJiBmd2QuY29ubmVjdF9ob3N0ID09IE5VTEwpIHsKLQkJbG9naXQoIiVzOiBtaXNzaW5nIGNvbm5lY3QgaG9zdCIsIF9fZnVuY19fKTsKLQkJZ290byBpbnZhbGlkOwotCX0KLQotCS8qIFNraXAgZm9yd2FyZHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQgKi8KLQlzd2l0Y2ggKGZ0eXBlKSB7Ci0JY2FzZSBNVVhfRldEX0xPQ0FMOgotCWNhc2UgTVVYX0ZXRF9EWU5BTUlDOgotCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1fbG9jYWxfZm9yd2FyZHM7IGkrKykgewotCQkJaWYgKGNvbXBhcmVfZm9yd2FyZCgmZndkLAotCQkJICAgIG9wdGlvbnMubG9jYWxfZm9yd2FyZHMgKyBpKSkgewotIGV4aXN0czoKLQkJCQlkZWJ1ZzIoIiVzOiBmb3VuZCBleGlzdGluZyBmb3J3YXJkaW5nIiwKLQkJCQkgICAgX19mdW5jX18pOwotCQkJCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX09LKTsKLQkJCQlidWZmZXJfcHV0X2ludChyLCByaWQpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWNhc2UgTVVYX0ZXRF9SRU1PVEU6Ci0JCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9yZW1vdGVfZm9yd2FyZHM7IGkrKykgewotCQkJaWYgKGNvbXBhcmVfZm9yd2FyZCgmZndkLAotCQkJICAgIG9wdGlvbnMucmVtb3RlX2ZvcndhcmRzICsgaSkpIHsKLQkJCQlpZiAoZndkLmxpc3Rlbl9wb3J0ICE9IDApCi0JCQkJCWdvdG8gZXhpc3RzOwotCQkJCWRlYnVnMigiJXM6IGZvdW5kIGFsbG9jYXRlZCBwb3J0IiwKLQkJCQkgICAgX19mdW5jX18pOwotCQkJCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX1JFTU9URV9QT1JUKTsKLQkJCQlidWZmZXJfcHV0X2ludChyLCByaWQpOwotCQkJCWJ1ZmZlcl9wdXRfaW50KHIsCi0JCQkJICAgIG9wdGlvbnMucmVtb3RlX2ZvcndhcmRzW2ldLmFsbG9jYXRlZF9wb3J0KTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0KLQlpZiAob3B0aW9ucy5jb250cm9sX21hc3RlciA9PSBTU0hDVExfTUFTVEVSX0FTSyB8fAotCSAgICBvcHRpb25zLmNvbnRyb2xfbWFzdGVyID09IFNTSENUTF9NQVNURVJfQVVUT19BU0spIHsKLQkJaWYgKCFhc2tfcGVybWlzc2lvbigiT3BlbiAlcyBvbiAlcz8iLCBmd2RfZGVzYywgaG9zdCkpIHsKLQkJCWRlYnVnMigiJXM6IGZvcndhcmRpbmcgcmVmdXNlZCBieSB1c2VyIiwgX19mdW5jX18pOwotCQkJYnVmZmVyX3B1dF9pbnQociwgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQpOwotCQkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKLQkJCWJ1ZmZlcl9wdXRfY3N0cmluZyhyLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JaWYgKGZ0eXBlID09IE1VWF9GV0RfTE9DQUwgfHwgZnR5cGUgPT0gTVVYX0ZXRF9EWU5BTUlDKSB7Ci0JCWlmIChjaGFubmVsX3NldHVwX2xvY2FsX2Z3ZF9saXN0ZW5lcihmd2QubGlzdGVuX2hvc3QsCi0JCSAgICBmd2QubGlzdGVuX3BvcnQsIGZ3ZC5jb25uZWN0X2hvc3QsIGZ3ZC5jb25uZWN0X3BvcnQsCi0JCSAgICBvcHRpb25zLmdhdGV3YXlfcG9ydHMpIDwgMCkgewotIGZhaWw6Ci0JCQlsb2dpdCgic2xhdmUtcmVxdWVzdGVkICVzIGZhaWxlZCIsIGZ3ZF9kZXNjKTsKLQkJCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX0ZBSUxVUkUpOwotCQkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKLQkJCWJ1ZmZlcl9wdXRfY3N0cmluZyhyLCAiUG9ydCBmb3J3YXJkaW5nIGZhaWxlZCIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJYWRkX2xvY2FsX2ZvcndhcmQoJm9wdGlvbnMsICZmd2QpOwotCQlmcmVlZndkID0gMDsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgbXV4X2NoYW5uZWxfY29uZmlybV9jdHggKmZjdHg7Ci0KLQkJaWYgKGNoYW5uZWxfcmVxdWVzdF9yZW1vdGVfZm9yd2FyZGluZyhmd2QubGlzdGVuX2hvc3QsCi0JCSAgICBmd2QubGlzdGVuX3BvcnQsIGZ3ZC5jb25uZWN0X2hvc3QsIGZ3ZC5jb25uZWN0X3BvcnQpIDwgMCkKLQkJCWdvdG8gZmFpbDsKLQkJYWRkX3JlbW90ZV9mb3J3YXJkKCZvcHRpb25zLCAmZndkKTsKLQkJZmN0eCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpmY3R4KSk7Ci0JCWZjdHgtPmNpZCA9IGMtPnNlbGY7Ci0JCWZjdHgtPnJpZCA9IHJpZDsKLQkJZmN0eC0+ZmlkID0gb3B0aW9ucy5udW1fcmVtb3RlX2ZvcndhcmRzIC0gMTsKLQkJY2xpZW50X3JlZ2lzdGVyX2dsb2JhbF9jb25maXJtKG11eF9jb25maXJtX3JlbW90ZV9mb3J3YXJkLAotCQkgICAgZmN0eCk7Ci0JCWZyZWVmd2QgPSAwOwotCQljLT5tdXhfcGF1c2UgPSAxOyAvKiB3YWl0IGZvciBtdXhfY29uZmlybV9yZW1vdGVfZm9yd2FyZCAqLwotCQkvKiBkZWxheWVkIHJlcGx5IGluIG11eF9jb25maXJtX3JlbW90ZV9mb3J3YXJkICovCi0JCWdvdG8gb3V0OwotCX0KLQlidWZmZXJfcHV0X2ludChyLCBNVVhfU19PSyk7Ci0JYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKLSBvdXQ6Ci0JaWYgKGZ3ZF9kZXNjICE9IE5VTEwpCi0JCXhmcmVlKGZ3ZF9kZXNjKTsKLQlpZiAoZnJlZWZ3ZCkgewotCQlpZiAoZndkLmxpc3Rlbl9ob3N0ICE9IE5VTEwpCi0JCQl4ZnJlZShmd2QubGlzdGVuX2hvc3QpOwotCQlpZiAoZndkLmNvbm5lY3RfaG9zdCAhPSBOVUxMKQotCQkJeGZyZWUoZndkLmNvbm5lY3RfaG9zdCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfbXV4X2Nsb3NlX2Z3ZCh1X2ludCByaWQsIENoYW5uZWwgKmMsIEJ1ZmZlciAqbSwgQnVmZmVyICpyKQotewotCUZvcndhcmQgZndkOwotCWNoYXIgKmZ3ZF9kZXNjID0gTlVMTDsKLQl1X2ludCBmdHlwZTsKLQlpbnQgcmV0ID0gMDsKLQotCWZ3ZC5saXN0ZW5faG9zdCA9IGZ3ZC5jb25uZWN0X2hvc3QgPSBOVUxMOwotCWlmIChidWZmZXJfZ2V0X2ludF9yZXQoJmZ0eXBlLCBtKSAhPSAwIHx8Ci0JICAgIChmd2QubGlzdGVuX2hvc3QgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQobSwgTlVMTCkpID09IE5VTEwgfHwKLQkgICAgYnVmZmVyX2dldF9pbnRfcmV0KCZmd2QubGlzdGVuX3BvcnQsIG0pICE9IDAgfHwKLQkgICAgKGZ3ZC5jb25uZWN0X2hvc3QgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQobSwgTlVMTCkpID09IE5VTEwgfHwKLQkgICAgYnVmZmVyX2dldF9pbnRfcmV0KCZmd2QuY29ubmVjdF9wb3J0LCBtKSAhPSAwKSB7Ci0JCWVycm9yKCIlczogbWFsZm9ybWVkIG1lc3NhZ2UiLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC0xOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoKmZ3ZC5saXN0ZW5faG9zdCA9PSAnXDAnKSB7Ci0JCXhmcmVlKGZ3ZC5saXN0ZW5faG9zdCk7Ci0JCWZ3ZC5saXN0ZW5faG9zdCA9IE5VTEw7Ci0JfQotCWlmICgqZndkLmNvbm5lY3RfaG9zdCA9PSAnXDAnKSB7Ci0JCXhmcmVlKGZ3ZC5jb25uZWN0X2hvc3QpOwotCQlmd2QuY29ubmVjdF9ob3N0ID0gTlVMTDsKLQl9Ci0KLQlkZWJ1ZzIoIiVzOiBjaGFubmVsICVkOiByZXF1ZXN0ICVzIiwgX19mdW5jX18sIGMtPnNlbGYsCi0JICAgIChmd2RfZGVzYyA9IGZvcm1hdF9mb3J3YXJkKGZ0eXBlLCAmZndkKSkpOwotCi0JLyogWFhYIGltcGxlbWVudCB0aGlzICovCi0JYnVmZmVyX3B1dF9pbnQociwgTVVYX1NfRkFJTFVSRSk7Ci0JYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcociwgInVuaW1wbGVtZW50ZWQiKTsKLQotIG91dDoKLQlpZiAoZndkX2Rlc2MgIT0gTlVMTCkKLQkJeGZyZWUoZndkX2Rlc2MpOwotCWlmIChmd2QubGlzdGVuX2hvc3QgIT0gTlVMTCkKLQkJeGZyZWUoZndkLmxpc3Rlbl9ob3N0KTsKLQlpZiAoZndkLmNvbm5lY3RfaG9zdCAhPSBOVUxMKQotCQl4ZnJlZShmd2QuY29ubmVjdF9ob3N0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfbXV4X3N0ZGlvX2Z3ZCh1X2ludCByaWQsIENoYW5uZWwgKmMsIEJ1ZmZlciAqbSwgQnVmZmVyICpyKQotewotCUNoYW5uZWwgKm5jOwotCWNoYXIgKnJlc2VydmVkLCAqY2hvc3Q7Ci0JdV9pbnQgY3BvcnQsIGksIGo7Ci0JaW50IG5ld19mZFsyXTsKLQotCWNob3N0ID0gcmVzZXJ2ZWQgPSBOVUxMOwotCWlmICgocmVzZXJ2ZWQgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQobSwgTlVMTCkpID09IE5VTEwgfHwKLQkgICAoY2hvc3QgPSBidWZmZXJfZ2V0X3N0cmluZ19yZXQobSwgTlVMTCkpID09IE5VTEwgfHwKLQkgICAgYnVmZmVyX2dldF9pbnRfcmV0KCZjcG9ydCwgbSkgIT0gMCkgewotCQlpZiAocmVzZXJ2ZWQgIT0gTlVMTCkKLQkJCXhmcmVlKHJlc2VydmVkKTsKLQkJaWYgKGNob3N0ICE9IE5VTEwpCi0JCQl4ZnJlZShjaG9zdCk7Ci0JCWVycm9yKCIlczogbWFsZm9ybWVkIG1lc3NhZ2UiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JeGZyZWUocmVzZXJ2ZWQpOwotCi0JZGVidWcyKCIlczogY2hhbm5lbCAlZDogcmVxdWVzdCBzdGRpbyBmd2QgdG8gJXM6JXUiLAotCSAgICBfX2Z1bmNfXywgYy0+c2VsZiwgY2hvc3QsIGNwb3J0KTsKLQotCS8qIEdhdGhlciBmZHMgZnJvbSBjbGllbnQgKi8KLQlmb3IoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJaWYgKChuZXdfZmRbaV0gPSBtbV9yZWNlaXZlX2ZkKGMtPnNvY2spKSA9PSAtMSkgewotCQkJZXJyb3IoIiVzOiBmYWlsZWQgdG8gcmVjZWl2ZSBmZCAlZCBmcm9tIHNsYXZlIiwKLQkJCSAgICBfX2Z1bmNfXywgaSk7Ci0JCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQkJCWNsb3NlKG5ld19mZFtqXSk7Ci0JCQl4ZnJlZShjaG9zdCk7Ci0KLQkJCS8qIHByZXBhcmUgcmVwbHkgKi8KLQkJCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX0ZBSUxVUkUpOwotCQkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKLQkJCWJ1ZmZlcl9wdXRfY3N0cmluZyhyLAotCQkJICAgICJkaWQgbm90IHJlY2VpdmUgZmlsZSBkZXNjcmlwdG9ycyIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JZGVidWczKCIlczogZ290IGZkcyBzdGRpbiAlZCwgc3Rkb3V0ICVkIiwgX19mdW5jX18sCi0JICAgIG5ld19mZFswXSwgbmV3X2ZkWzFdKTsKLQotCS8qIFhYWCBzdXBwb3J0IG11bHRpcGxlIGNoaWxkIHNlc3Npb25zIGluIGZ1dHVyZSAqLwotCWlmIChjLT5yZW1vdGVfaWQgIT0gLTEpIHsKLQkJZGVidWcyKCIlczogc2Vzc2lvbiBhbHJlYWR5IG9wZW4iLCBfX2Z1bmNfXyk7Ci0JCS8qIHByZXBhcmUgcmVwbHkgKi8KLQkJYnVmZmVyX3B1dF9pbnQociwgTVVYX1NfRkFJTFVSRSk7Ci0JCWJ1ZmZlcl9wdXRfaW50KHIsIHJpZCk7Ci0JCWJ1ZmZlcl9wdXRfY3N0cmluZyhyLCAiTXVsdGlwbGUgc2Vzc2lvbnMgbm90IHN1cHBvcnRlZCIpOwotIGNsZWFudXA6Ci0JCWNsb3NlKG5ld19mZFswXSk7Ci0JCWNsb3NlKG5ld19mZFsxXSk7Ci0JCXhmcmVlKGNob3N0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKG9wdGlvbnMuY29udHJvbF9tYXN0ZXIgPT0gU1NIQ1RMX01BU1RFUl9BU0sgfHwKLQkgICAgb3B0aW9ucy5jb250cm9sX21hc3RlciA9PSBTU0hDVExfTUFTVEVSX0FVVE9fQVNLKSB7Ci0JCWlmICghYXNrX3Blcm1pc3Npb24oIkFsbG93IGZvcndhcmQgdG8gJXM6JXU/ICIsCi0JCSAgICBjaG9zdCwgY3BvcnQpKSB7Ci0JCQlkZWJ1ZzIoIiVzOiBzdGRpbyBmd2QgcmVmdXNlZCBieSB1c2VyIiwgX19mdW5jX18pOwotCQkJLyogcHJlcGFyZSByZXBseSAqLwotCQkJYnVmZmVyX3B1dF9pbnQociwgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQpOwotCQkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKLQkJCWJ1ZmZlcl9wdXRfY3N0cmluZyhyLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCX0KLQotCS8qIGVuYWJsZSBub25ibG9ja2luZyB1bmxlc3MgdHR5ICovCi0JaWYgKCFpc2F0dHkobmV3X2ZkWzBdKSkKLQkJc2V0X25vbmJsb2NrKG5ld19mZFswXSk7Ci0JaWYgKCFpc2F0dHkobmV3X2ZkWzFdKSkKLQkJc2V0X25vbmJsb2NrKG5ld19mZFsxXSk7Ci0KLQluYyA9IGNoYW5uZWxfY29ubmVjdF9zdGRpb19md2QoY2hvc3QsIGNwb3J0LCBuZXdfZmRbMF0sIG5ld19mZFsxXSk7Ci0KLQluYy0+Y3RsX2NoYW4gPSBjLT5zZWxmOwkJLyogbGluayBzZXNzaW9uIC0+IGNvbnRyb2wgY2hhbm5lbCAqLwotCWMtPnJlbW90ZV9pZCA9IG5jLT5zZWxmOyAJLyogbGluayBjb250cm9sIC0+IHNlc3Npb24gY2hhbm5lbCAqLwotCi0JZGVidWcyKCIlczogY2hhbm5lbF9uZXc6ICVkIGxpbmtlZCB0byBjb250cm9sIGNoYW5uZWwgJWQiLAotCSAgICBfX2Z1bmNfXywgbmMtPnNlbGYsIG5jLT5jdGxfY2hhbik7Ci0KLQljaGFubmVsX3JlZ2lzdGVyX2NsZWFudXAobmMtPnNlbGYsIG11eF9tYXN0ZXJfc2Vzc2lvbl9jbGVhbnVwX2NiLCAxKTsKLQotCS8qIHByZXBhcmUgcmVwbHkgKi8KLQkvKiBYWFggZGVmZXIgdW50aWwgY2hhbm5lbCBjb25maXJtZWQgKi8KLQlidWZmZXJfcHV0X2ludChyLCBNVVhfU19TRVNTSU9OX09QRU5FRCk7Ci0JYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKLQlidWZmZXJfcHV0X2ludChyLCBuYy0+c2VsZik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19tdXhfc3RvcF9saXN0ZW5pbmcodV9pbnQgcmlkLCBDaGFubmVsICpjLCBCdWZmZXIgKm0sIEJ1ZmZlciAqcikKLXsKLQlkZWJ1ZygiJXM6IGNoYW5uZWwgJWQ6IHN0b3AgbGlzdGVuaW5nIiwgX19mdW5jX18sIGMtPnNlbGYpOwotCi0JaWYgKG9wdGlvbnMuY29udHJvbF9tYXN0ZXIgPT0gU1NIQ1RMX01BU1RFUl9BU0sgfHwKLQkgICAgb3B0aW9ucy5jb250cm9sX21hc3RlciA9PSBTU0hDVExfTUFTVEVSX0FVVE9fQVNLKSB7Ci0JCWlmICghYXNrX3Blcm1pc3Npb24oIkRpc2FibGUgZnVydGhlciBtdWx0aXBsZXhpbmcgb24gc2hhcmVkICIKLQkJICAgICJjb25uZWN0aW9uIHRvICVzPyAiLCBob3N0KSkgewotCQkJZGVidWcyKCIlczogc3RvcCBsaXN0ZW4gcmVmdXNlZCBieSB1c2VyIiwgX19mdW5jX18pOwotCQkJYnVmZmVyX3B1dF9pbnQociwgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQpOwotCQkJYnVmZmVyX3B1dF9pbnQociwgcmlkKTsKLQkJCWJ1ZmZlcl9wdXRfY3N0cmluZyhyLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JaWYgKG11eF9saXN0ZW5lcl9jaGFubmVsICE9IE5VTEwpIHsKLQkJY2hhbm5lbF9mcmVlKG11eF9saXN0ZW5lcl9jaGFubmVsKTsKLQkJY2xpZW50X3N0b3BfbXV4KCk7Ci0JCXhmcmVlKG9wdGlvbnMuY29udHJvbF9wYXRoKTsKLQkJb3B0aW9ucy5jb250cm9sX3BhdGggPSBOVUxMOwotCQltdXhfbGlzdGVuZXJfY2hhbm5lbCA9IE5VTEw7Ci0JCW11eHNlcnZlcl9zb2NrID0gLTE7Ci0JfQotCi0JLyogcHJlcGFyZSByZXBseSAqLwotCWJ1ZmZlcl9wdXRfaW50KHIsIE1VWF9TX09LKTsKLQlidWZmZXJfcHV0X2ludChyLCByaWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIENoYW5uZWwgY2FsbGJhY2tzIGZpcmVkIG9uIHJlYWQvd3JpdGUgZnJvbSBtdXggc2xhdmUgZmQgKi8KLXN0YXRpYyBpbnQKLW11eF9tYXN0ZXJfcmVhZF9jYihDaGFubmVsICpjKQotewotCXN0cnVjdCBtdXhfbWFzdGVyX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgbXV4X21hc3Rlcl9zdGF0ZSAqKWMtPm11eF9jdHg7Ci0JQnVmZmVyIGluLCBvdXQ7Ci0Jdm9pZCAqcHRyOwotCXVfaW50IHR5cGUsIHJpZCwgaGF2ZSwgaTsKLQlpbnQgcmV0ID0gLTE7Ci0KLQkvKiBTZXR1cCBjdHggYW5kICAqLwotCWlmIChjLT5tdXhfY3R4ID09IE5VTEwpIHsKLQkJc3RhdGUgPSB4Y2FsbG9jKDEsIHNpemVvZigqc3RhdGUpKTsKLQkJYy0+bXV4X2N0eCA9IHN0YXRlOwotCQljaGFubmVsX3JlZ2lzdGVyX2NsZWFudXAoYy0+c2VsZiwKLQkJICAgIG11eF9tYXN0ZXJfY29udHJvbF9jbGVhbnVwX2NiLCAwKTsKLQotCQkvKiBTZW5kIGhlbGxvICovCi0JCWJ1ZmZlcl9pbml0KCZvdXQpOwotCQlidWZmZXJfcHV0X2ludCgmb3V0LCBNVVhfTVNHX0hFTExPKTsKLQkJYnVmZmVyX3B1dF9pbnQoJm91dCwgU1NITVVYX1ZFUik7Ci0JCS8qIG5vIGV4dGVuc2lvbnMgKi8KLQkJYnVmZmVyX3B1dF9zdHJpbmcoJmMtPm91dHB1dCwgYnVmZmVyX3B0cigmb3V0KSwKLQkJICAgIGJ1ZmZlcl9sZW4oJm91dCkpOwotCQlidWZmZXJfZnJlZSgmb3V0KTsKLQkJZGVidWczKCIlczogY2hhbm5lbCAlZDogaGVsbG8gc2VudCIsIF9fZnVuY19fLCBjLT5zZWxmKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYnVmZmVyX2luaXQoJmluKTsKLQlidWZmZXJfaW5pdCgmb3V0KTsKLQotCS8qIENoYW5uZWwgY29kZSBlbnN1cmVzIHRoYXQgd2UgcmVjZWl2ZSB3aG9sZSBwYWNrZXRzICovCi0JaWYgKChwdHIgPSBidWZmZXJfZ2V0X3N0cmluZ19wdHJfcmV0KCZjLT5pbnB1dCwgJmhhdmUpKSA9PSBOVUxMKSB7Ci0gbWFsZjoKLQkJZXJyb3IoIiVzOiBtYWxmb3JtZWQgbWVzc2FnZSIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCWJ1ZmZlcl9hcHBlbmQoJmluLCBwdHIsIGhhdmUpOwotCi0JaWYgKGJ1ZmZlcl9nZXRfaW50X3JldCgmdHlwZSwgJmluKSAhPSAwKQotCQlnb3RvIG1hbGY7Ci0JZGVidWczKCIlczogY2hhbm5lbCAlZCBwYWNrZXQgdHlwZSAweCUwOHggbGVuICV1IiwKLQkgICAgX19mdW5jX18sIGMtPnNlbGYsIHR5cGUsIGJ1ZmZlcl9sZW4oJmluKSk7Ci0KLQlpZiAodHlwZSA9PSBNVVhfTVNHX0hFTExPKQotCQlyaWQgPSAwOwotCWVsc2UgewotCQlpZiAoIXN0YXRlLT5oZWxsb19yY3ZkKSB7Ci0JCQllcnJvcigiJXM6IGV4cGVjdGVkIE1VWF9NU0dfSEVMTE8oMHglMDh4KSwgIgotCQkJICAgICJyZWNlaXZlZCAweCUwOHgiLCBfX2Z1bmNfXywgTVVYX01TR19IRUxMTywgdHlwZSk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlpZiAoYnVmZmVyX2dldF9pbnRfcmV0KCZyaWQsICZpbikgIT0gMCkKLQkJCWdvdG8gbWFsZjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBtdXhfbWFzdGVyX2hhbmRsZXJzW2ldLmhhbmRsZXIgIT0gTlVMTDsgaSsrKSB7Ci0JCWlmICh0eXBlID09IG11eF9tYXN0ZXJfaGFuZGxlcnNbaV0udHlwZSkgewotCQkJcmV0ID0gbXV4X21hc3Rlcl9oYW5kbGVyc1tpXS5oYW5kbGVyKHJpZCwgYywgJmluLCAmb3V0KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChtdXhfbWFzdGVyX2hhbmRsZXJzW2ldLmhhbmRsZXIgPT0gTlVMTCkgewotCQllcnJvcigiJXM6IHVuc3VwcG9ydGVkIG11eCBtZXNzYWdlIDB4JTA4eCIsIF9fZnVuY19fLCB0eXBlKTsKLQkJYnVmZmVyX3B1dF9pbnQoJm91dCwgTVVYX1NfRkFJTFVSRSk7Ci0JCWJ1ZmZlcl9wdXRfaW50KCZvdXQsIHJpZCk7Ci0JCWJ1ZmZlcl9wdXRfY3N0cmluZygmb3V0LCAidW5zdXBwb3J0ZWQgcmVxdWVzdCIpOwotCQlyZXQgPSAwOwotCX0KLQkvKiBFbnF1ZXVlIHJlcGx5IHBhY2tldCAqLwotCWlmIChidWZmZXJfbGVuKCZvdXQpICE9IDApIHsKLQkJYnVmZmVyX3B1dF9zdHJpbmcoJmMtPm91dHB1dCwgYnVmZmVyX3B0cigmb3V0KSwKLQkJICAgIGJ1ZmZlcl9sZW4oJm91dCkpOwotCX0KLSBvdXQ6Ci0JYnVmZmVyX2ZyZWUoJmluKTsKLQlidWZmZXJfZnJlZSgmb3V0KTsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkCi1tdXhfZXhpdF9tZXNzYWdlKENoYW5uZWwgKmMsIGludCBleGl0dmFsKQotewotCUJ1ZmZlciBtOwotCUNoYW5uZWwgKm11eF9jaGFuOwotCi0JZGVidWczKCIlczogY2hhbm5lbCAlZDogZXhpdCBtZXNzYWdlLCBldml0dmFsICVkIiwgX19mdW5jX18sIGMtPnNlbGYsCi0JICAgIGV4aXR2YWwpOwotCi0JaWYgKChtdXhfY2hhbiA9IGNoYW5uZWxfYnlfaWQoYy0+Y3RsX2NoYW4pKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IGNoYW5uZWwgJWQgbWlzc2luZyBtdXggY2hhbm5lbCAlZCIsCi0JCSAgICBfX2Z1bmNfXywgYy0+c2VsZiwgYy0+Y3RsX2NoYW4pOwotCi0JLyogQXBwZW5kIGV4aXQgbWVzc2FnZSBwYWNrZXQgdG8gY29udHJvbCBzb2NrZXQgb3V0cHV0IHF1ZXVlICovCi0JYnVmZmVyX2luaXQoJm0pOwotCWJ1ZmZlcl9wdXRfaW50KCZtLCBNVVhfU19FWElUX01FU1NBR0UpOwotCWJ1ZmZlcl9wdXRfaW50KCZtLCBjLT5zZWxmKTsKLQlidWZmZXJfcHV0X2ludCgmbSwgZXhpdHZhbCk7Ci0KLQlidWZmZXJfcHV0X3N0cmluZygmbXV4X2NoYW4tPm91dHB1dCwgYnVmZmVyX3B0cigmbSksIGJ1ZmZlcl9sZW4oJm0pKTsKLQlidWZmZXJfZnJlZSgmbSk7Ci19Ci0KLXZvaWQKLW11eF90dHlfYWxsb2NfZmFpbGVkKENoYW5uZWwgKmMpCi17Ci0JQnVmZmVyIG07Ci0JQ2hhbm5lbCAqbXV4X2NoYW47Ci0KLQlkZWJ1ZzMoIiVzOiBjaGFubmVsICVkOiBUVFkgYWxsb2MgZmFpbGVkIiwgX19mdW5jX18sIGMtPnNlbGYpOwotCi0JaWYgKChtdXhfY2hhbiA9IGNoYW5uZWxfYnlfaWQoYy0+Y3RsX2NoYW4pKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IGNoYW5uZWwgJWQgbWlzc2luZyBtdXggY2hhbm5lbCAlZCIsCi0JCSAgICBfX2Z1bmNfXywgYy0+c2VsZiwgYy0+Y3RsX2NoYW4pOwotCi0JLyogQXBwZW5kIGV4aXQgbWVzc2FnZSBwYWNrZXQgdG8gY29udHJvbCBzb2NrZXQgb3V0cHV0IHF1ZXVlICovCi0JYnVmZmVyX2luaXQoJm0pOwotCWJ1ZmZlcl9wdXRfaW50KCZtLCBNVVhfU19UVFlfQUxMT0NfRkFJTCk7Ci0JYnVmZmVyX3B1dF9pbnQoJm0sIGMtPnNlbGYpOwotCi0JYnVmZmVyX3B1dF9zdHJpbmcoJm11eF9jaGFuLT5vdXRwdXQsIGJ1ZmZlcl9wdHIoJm0pLCBidWZmZXJfbGVuKCZtKSk7Ci0JYnVmZmVyX2ZyZWUoJm0pOwotfQotCi0vKiBQcmVwYXJlIGEgbXV4IG1hc3RlciB0byBsaXN0ZW4gb24gYSBVbml4IGRvbWFpbiBzb2NrZXQuICovCi12b2lkCi1tdXhzZXJ2ZXJfbGlzdGVuKHZvaWQpCi17Ci0Jc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7Ci0Jc29ja2xlbl90IHN1bl9sZW47Ci0JbW9kZV90IG9sZF91bWFzazsKLQljaGFyICpvcmlnX2NvbnRyb2xfcGF0aCA9IG9wdGlvbnMuY29udHJvbF9wYXRoOwotCWNoYXIgcmJ1ZlsxNisxXTsKLQl1X2ludCBpLCByOwotCi0JaWYgKG9wdGlvbnMuY29udHJvbF9wYXRoID09IE5VTEwgfHwKLQkgICAgb3B0aW9ucy5jb250cm9sX21hc3RlciA9PSBTU0hDVExfTUFTVEVSX05PKQotCQlyZXR1cm47Ci0KLQlkZWJ1Zygic2V0dGluZyB1cCBtdWx0aXBsZXggbWFzdGVyIHNvY2tldCIpOwotCi0JLyoKLQkgKiBVc2UgYSB0ZW1wb3JhcnkgcGF0aCBiZWZvcmUgbGlzdGVuIHNvIHdlIGNhbiBwc2V1ZG8tYXRvbWljYWxseQotCSAqIGVzdGFibGlzaCB0aGUgbGlzdGVuaW5nIHNvY2tldCBpbiBpdHMgZmluYWwgbG9jYXRpb24gdG8gYXZvaWQKLQkgKiBvdGhlciBwcm9jZXNzZXMgcmFjaW5nIGluIGJldHdlZW4gYmluZCgpIGFuZCBsaXN0ZW4oKSBhbmQgaGl0dGluZwotCSAqIGFuIHVucmVhZHkgc29ja2V0LgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocmJ1ZikgLSAxOyBpKyspIHsKLQkJciA9IGFyYzRyYW5kb21fdW5pZm9ybSgyNisyNisxMCk7Ci0JCXJidWZbaV0gPSAociA8IDI2KSA/ICdhJyArIHIgOgotCQkgICAgKHIgPCAyNioyKSA/ICdBJyArIHIgLSAyNiA6Ci0JCSAgICAnMCcgKyByIC0gMjYgLSAyNjsKLQl9Ci0JcmJ1ZltzaXplb2YocmJ1ZikgLSAxXSA9ICdcMCc7Ci0Jb3B0aW9ucy5jb250cm9sX3BhdGggPSBOVUxMOwotCXhhc3ByaW50Zigmb3B0aW9ucy5jb250cm9sX3BhdGgsICIlcy4lcyIsIG9yaWdfY29udHJvbF9wYXRoLCByYnVmKTsKLQlkZWJ1ZzMoIiVzOiB0ZW1wb3JhcnkgY29udHJvbCBwYXRoICVzIiwgX19mdW5jX18sIG9wdGlvbnMuY29udHJvbF9wYXRoKTsKLQotCW1lbXNldCgmYWRkciwgJ1wwJywgc2l6ZW9mKGFkZHIpKTsKLQlhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOwotCXN1bl9sZW4gPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKSArCi0JICAgIHN0cmxlbihvcHRpb25zLmNvbnRyb2xfcGF0aCkgKyAxOwotCi0JaWYgKHN0cmxjcHkoYWRkci5zdW5fcGF0aCwgb3B0aW9ucy5jb250cm9sX3BhdGgsCi0JICAgIHNpemVvZihhZGRyLnN1bl9wYXRoKSkgPj0gc2l6ZW9mKGFkZHIuc3VuX3BhdGgpKSB7Ci0JCWVycm9yKCJDb250cm9sUGF0aCBcIiVzXCIgdG9vIGxvbmcgZm9yIFVuaXggZG9tYWluIHNvY2tldCIsCi0JCSAgICBvcHRpb25zLmNvbnRyb2xfcGF0aCk7Ci0JCWdvdG8gZGlzYWJsZV9tdXhfbWFzdGVyOwotCX0KLQotCWlmICgobXV4c2VydmVyX3NvY2sgPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIDApKSA8IDApCi0JCWZhdGFsKCIlcyBzb2NrZXQoKTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQotCW9sZF91bWFzayA9IHVtYXNrKDAxNzcpOwotCWlmIChiaW5kKG11eHNlcnZlcl9zb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHN1bl9sZW4pID09IC0xKSB7Ci0JCWlmIChlcnJubyA9PSBFSU5WQUwgfHwgZXJybm8gPT0gRUFERFJJTlVTRSkgewotCQkJZXJyb3IoIkNvbnRyb2xTb2NrZXQgJXMgYWxyZWFkeSBleGlzdHMsICIKLQkJCSAgICAiZGlzYWJsaW5nIG11bHRpcGxleGluZyIsIG9wdGlvbnMuY29udHJvbF9wYXRoKTsKLSBkaXNhYmxlX211eF9tYXN0ZXI6Ci0JCQlpZiAobXV4c2VydmVyX3NvY2sgIT0gLTEpIHsKLQkJCQljbG9zZShtdXhzZXJ2ZXJfc29jayk7Ci0JCQkJbXV4c2VydmVyX3NvY2sgPSAtMTsKLQkJCX0KLQkJCXhmcmVlKG9wdGlvbnMuY29udHJvbF9wYXRoKTsKLQkJCW9wdGlvbnMuY29udHJvbF9wYXRoID0gTlVMTDsKLQkJCW9wdGlvbnMuY29udHJvbF9tYXN0ZXIgPSBTU0hDVExfTUFTVEVSX05POwotCQkJcmV0dXJuOwotCQl9IGVsc2UKLQkJCWZhdGFsKCIlcyBiaW5kKCk6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JfQotCXVtYXNrKG9sZF91bWFzayk7Ci0KLQlpZiAobGlzdGVuKG11eHNlcnZlcl9zb2NrLCA2NCkgPT0gLTEpCi0JCWZhdGFsKCIlcyBsaXN0ZW4oKTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQotCS8qIE5vdyBhdG9taWNhbGx5ICJtb3ZlIiB0aGUgbXV4IHNvY2tldCBpbnRvIHBvc2l0aW9uICovCi0JaWYgKGxpbmsob3B0aW9ucy5jb250cm9sX3BhdGgsIG9yaWdfY29udHJvbF9wYXRoKSAhPSAwKSB7Ci0JCWlmIChlcnJubyAhPSBFRVhJU1QpIHsKLQkJCWZhdGFsKCIlczogbGluayBtdXggbGlzdGVuZXIgJXMgPT4gJXM6ICVzIiwgX19mdW5jX18sIAotCQkJICAgIG9wdGlvbnMuY29udHJvbF9wYXRoLCBvcmlnX2NvbnRyb2xfcGF0aCwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQl9Ci0JCWVycm9yKCJDb250cm9sU29ja2V0ICVzIGFscmVhZHkgZXhpc3RzLCBkaXNhYmxpbmcgbXVsdGlwbGV4aW5nIiwKLQkJICAgIG9yaWdfY29udHJvbF9wYXRoKTsKLQkJeGZyZWUob3JpZ19jb250cm9sX3BhdGgpOwotCQl1bmxpbmsob3B0aW9ucy5jb250cm9sX3BhdGgpOwotCQlnb3RvIGRpc2FibGVfbXV4X21hc3RlcjsKLQl9Ci0JdW5saW5rKG9wdGlvbnMuY29udHJvbF9wYXRoKTsKLQl4ZnJlZShvcHRpb25zLmNvbnRyb2xfcGF0aCk7Ci0Jb3B0aW9ucy5jb250cm9sX3BhdGggPSBvcmlnX2NvbnRyb2xfcGF0aDsKLQotCXNldF9ub25ibG9jayhtdXhzZXJ2ZXJfc29jayk7Ci0KLQltdXhfbGlzdGVuZXJfY2hhbm5lbCA9IGNoYW5uZWxfbmV3KCJtdXggbGlzdGVuZXIiLAotCSAgICBTU0hfQ0hBTk5FTF9NVVhfTElTVEVORVIsIG11eHNlcnZlcl9zb2NrLCBtdXhzZXJ2ZXJfc29jaywgLTEsCi0JICAgIENIQU5fVENQX1dJTkRPV19ERUZBVUxULCBDSEFOX1RDUF9QQUNLRVRfREVGQVVMVCwKLQkgICAgMCwgb3B0aW9ucy5jb250cm9sX3BhdGgsIDEpOwotCW11eF9saXN0ZW5lcl9jaGFubmVsLT5tdXhfcmNiID0gbXV4X21hc3Rlcl9yZWFkX2NiOwotCWRlYnVnMygiJXM6IG11eCBsaXN0ZW5lciBjaGFubmVsICVkIGZkICVkIiwgX19mdW5jX18sCi0JICAgIG11eF9saXN0ZW5lcl9jaGFubmVsLT5zZWxmLCBtdXhfbGlzdGVuZXJfY2hhbm5lbC0+c29jayk7Ci19Ci0KLS8qIENhbGxiYWNrIG9uIG9wZW4gY29uZmlybWF0aW9uIGluIG11eCBtYXN0ZXIgZm9yIGEgbXV4IGNsaWVudCBzZXNzaW9uLiAqLwotc3RhdGljIHZvaWQKLW11eF9zZXNzaW9uX2NvbmZpcm0oaW50IGlkLCBpbnQgc3VjY2Vzcywgdm9pZCAqYXJnKQotewotCXN0cnVjdCBtdXhfc2Vzc2lvbl9jb25maXJtX2N0eCAqY2N0eCA9IGFyZzsKLQljb25zdCBjaGFyICpkaXNwbGF5OwotCUNoYW5uZWwgKmMsICpjYzsKLQlpbnQgaTsKLQlCdWZmZXIgcmVwbHk7Ci0KLQlpZiAoY2N0eCA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IGNjdHggPT0gTlVMTCIsIF9fZnVuY19fKTsKLQlpZiAoKGMgPSBjaGFubmVsX2J5X2lkKGlkKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBubyBjaGFubmVsIGZvciBpZCAlZCIsIF9fZnVuY19fLCBpZCk7Ci0JaWYgKChjYyA9IGNoYW5uZWxfYnlfaWQoYy0+Y3RsX2NoYW4pKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IGNoYW5uZWwgJWQgbGFja3MgY29udHJvbCBjaGFubmVsICVkIiwgX19mdW5jX18sCi0JCSAgICBpZCwgYy0+Y3RsX2NoYW4pOwotCi0JaWYgKCFzdWNjZXNzKSB7Ci0JCWRlYnVnMygiJXM6IHNlbmRpbmcgZmFpbHVyZSByZXBseSIsIF9fZnVuY19fKTsKLQkJLyogcHJlcGFyZSByZXBseSAqLwotCQlidWZmZXJfaW5pdCgmcmVwbHkpOwotCQlidWZmZXJfcHV0X2ludCgmcmVwbHksIE1VWF9TX0ZBSUxVUkUpOwotCQlidWZmZXJfcHV0X2ludCgmcmVwbHksIGNjdHgtPnJpZCk7Ci0JCWJ1ZmZlcl9wdXRfY3N0cmluZygmcmVwbHksICJTZXNzaW9uIG9wZW4gcmVmdXNlZCBieSBwZWVyIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlkaXNwbGF5ID0gZ2V0ZW52KCJESVNQTEFZIik7Ci0JaWYgKGNjdHgtPndhbnRfeF9md2QgJiYgb3B0aW9ucy5mb3J3YXJkX3gxMSAmJiBkaXNwbGF5ICE9IE5VTEwpIHsKLQkJY2hhciAqcHJvdG8sICpkYXRhOwotCi0JCS8qIEdldCByZWFzb25hYmxlIGxvY2FsIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLiAqLwotCQljbGllbnRfeDExX2dldF9wcm90byhkaXNwbGF5LCBvcHRpb25zLnhhdXRoX2xvY2F0aW9uLAotCQkgICAgb3B0aW9ucy5mb3J3YXJkX3gxMV90cnVzdGVkLCBvcHRpb25zLmZvcndhcmRfeDExX3RpbWVvdXQsCi0JCSAgICAmcHJvdG8sICZkYXRhKTsKLQkJLyogUmVxdWVzdCBmb3J3YXJkaW5nIHdpdGggYXV0aGVudGljYXRpb24gc3Bvb2ZpbmcuICovCi0JCWRlYnVnKCJSZXF1ZXN0aW5nIFgxMSBmb3J3YXJkaW5nIHdpdGggYXV0aGVudGljYXRpb24gIgotCQkgICAgInNwb29maW5nLiIpOwotCQl4MTFfcmVxdWVzdF9mb3J3YXJkaW5nX3dpdGhfc3Bvb2ZpbmcoaWQsIGRpc3BsYXksIHByb3RvLAotCQkgICAgZGF0YSwgMSk7Ci0JCWNsaWVudF9leHBlY3RfY29uZmlybShpZCwgIlgxMSBmb3J3YXJkaW5nIiwgQ09ORklSTV9XQVJOKTsKLQkJLyogWFhYIGV4aXRfb25fZm9yd2FyZF9mYWlsdXJlICovCi0JfQotCi0JaWYgKGNjdHgtPndhbnRfYWdlbnRfZndkICYmIG9wdGlvbnMuZm9yd2FyZF9hZ2VudCkgewotCQlkZWJ1ZygiUmVxdWVzdGluZyBhdXRoZW50aWNhdGlvbiBhZ2VudCBmb3J3YXJkaW5nLiIpOwotCQljaGFubmVsX3JlcXVlc3Rfc3RhcnQoaWQsICJhdXRoLWFnZW50LXJlcUBvcGVuc3NoLmNvbSIsIDApOwotCQlwYWNrZXRfc2VuZCgpOwotCX0KLQotCWNsaWVudF9zZXNzaW9uMl9zZXR1cChpZCwgY2N0eC0+d2FudF90dHksIGNjdHgtPndhbnRfc3Vic3lzLAotCSAgICBjY3R4LT50ZXJtLCAmY2N0eC0+dGlvLCBjLT5yZmQsICZjY3R4LT5jbWQsIGNjdHgtPmVudik7Ci0KLQlkZWJ1ZzMoIiVzOiBzZW5kaW5nIHN1Y2Nlc3MgcmVwbHkiLCBfX2Z1bmNfXyk7Ci0JLyogcHJlcGFyZSByZXBseSAqLwotCWJ1ZmZlcl9pbml0KCZyZXBseSk7Ci0JYnVmZmVyX3B1dF9pbnQoJnJlcGx5LCBNVVhfU19TRVNTSU9OX09QRU5FRCk7Ci0JYnVmZmVyX3B1dF9pbnQoJnJlcGx5LCBjY3R4LT5yaWQpOwotCWJ1ZmZlcl9wdXRfaW50KCZyZXBseSwgYy0+c2VsZik7Ci0KLSBkb25lOgotCS8qIFNlbmQgcmVwbHkgKi8KLQlidWZmZXJfcHV0X3N0cmluZygmY2MtPm91dHB1dCwgYnVmZmVyX3B0cigmcmVwbHkpLCBidWZmZXJfbGVuKCZyZXBseSkpOwotCWJ1ZmZlcl9mcmVlKCZyZXBseSk7Ci0KLQlpZiAoY2MtPm11eF9wYXVzZSA8PSAwKQotCQlmYXRhbCgiJXM6IG11eF9wYXVzZSAlZCIsIF9fZnVuY19fLCBjYy0+bXV4X3BhdXNlKTsKLQljYy0+bXV4X3BhdXNlID0gMDsgLyogc3RhcnQgcHJvY2Vzc2luZyBtZXNzYWdlcyBhZ2FpbiAqLwotCWMtPm9wZW5fY29uZmlybV9jdHggPSBOVUxMOwotCWJ1ZmZlcl9mcmVlKCZjY3R4LT5jbWQpOwotCXhmcmVlKGNjdHgtPnRlcm0pOwotCWlmIChjY3R4LT5lbnYgIT0gTlVMTCkgewotCQlmb3IgKGkgPSAwOyBjY3R4LT5lbnZbaV0gIT0gTlVMTDsgaSsrKQotCQkJeGZyZWUoY2N0eC0+ZW52W2ldKTsKLQkJeGZyZWUoY2N0eC0+ZW52KTsKLQl9Ci0JeGZyZWUoY2N0eCk7Ci19Ci0KLS8qICoqIE11bHRpcGxleGluZyBjbGllbnQgc3VwcG9ydCAqLwotCi0vKiBFeGl0IHNpZ25hbCBoYW5kbGVyICovCi1zdGF0aWMgdm9pZAotY29udHJvbF9jbGllbnRfc2lnaGFuZGxlcihpbnQgc2lnbm8pCi17Ci0JbXV4Y2xpZW50X3Rlcm1pbmF0ZSA9IHNpZ25vOwotfQotCi0vKgotICogUmVsYXkgc2lnbmFsIGhhbmRsZXIgLSB1c2VkIHRvIHBhc3Mgc29tZSBzaWduYWxzIGZyb20gbXV4IGNsaWVudCB0bwotICogbXV4IG1hc3Rlci4KLSAqLwotc3RhdGljIHZvaWQKLWNvbnRyb2xfY2xpZW50X3NpZ3JlbGF5KGludCBzaWdubykKLXsKLQlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwotCi0JaWYgKG11eHNlcnZlcl9waWQgPiAxKQotCQlraWxsKG11eHNlcnZlcl9waWQsIHNpZ25vKTsKLQotCWVycm5vID0gc2F2ZV9lcnJubzsKLX0KLQotc3RhdGljIGludAotbXV4X2NsaWVudF9yZWFkKGludCBmZCwgQnVmZmVyICpiLCB1X2ludCBuZWVkKQotewotCXVfaW50IGhhdmU7Ci0Jc3NpemVfdCBsZW47Ci0JdV9jaGFyICpwOwotCXN0cnVjdCBwb2xsZmQgcGZkOwotCi0JcGZkLmZkID0gZmQ7Ci0JcGZkLmV2ZW50cyA9IFBPTExJTjsKLQlwID0gYnVmZmVyX2FwcGVuZF9zcGFjZShiLCBuZWVkKTsKLQlmb3IgKGhhdmUgPSAwOyBoYXZlIDwgbmVlZDsgKSB7Ci0JCWlmIChtdXhjbGllbnRfdGVybWluYXRlKSB7Ci0JCQllcnJubyA9IEVJTlRSOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWxlbiA9IHJlYWQoZmQsIHAgKyBoYXZlLCBuZWVkIC0gaGF2ZSk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQlzd2l0Y2ggKGVycm5vKSB7Ci0jaWYgZGVmaW5lZChFV09VTERCTE9DSykgJiYgKEVXT1VMREJMT0NLICE9IEVBR0FJTikKLQkJCWNhc2UgRVdPVUxEQkxPQ0s6Ci0jZW5kaWYKLQkJCWNhc2UgRUFHQUlOOgotCQkJCSh2b2lkKXBvbGwoJnBmZCwgMSwgLTEpOwotCQkJCS8qIEZBTExUSFJPVUdIICovCi0JCQljYXNlIEVJTlRSOgotCQkJCWNvbnRpbnVlOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQllcnJubyA9IEVQSVBFOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWhhdmUgKz0gKHVfaW50KWxlbjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW11eF9jbGllbnRfd3JpdGVfcGFja2V0KGludCBmZCwgQnVmZmVyICptKQotewotCUJ1ZmZlciBxdWV1ZTsKLQl1X2ludCBoYXZlLCBuZWVkOwotCWludCBvZXJybm8sIGxlbjsKLQl1X2NoYXIgKnB0cjsKLQlzdHJ1Y3QgcG9sbGZkIHBmZDsKLQotCXBmZC5mZCA9IGZkOwotCXBmZC5ldmVudHMgPSBQT0xMT1VUOwotCWJ1ZmZlcl9pbml0KCZxdWV1ZSk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJnF1ZXVlLCBidWZmZXJfcHRyKG0pLCBidWZmZXJfbGVuKG0pKTsKLQotCW5lZWQgPSBidWZmZXJfbGVuKCZxdWV1ZSk7Ci0JcHRyID0gYnVmZmVyX3B0cigmcXVldWUpOwotCi0JZm9yIChoYXZlID0gMDsgaGF2ZSA8IG5lZWQ7ICkgewotCQlpZiAobXV4Y2xpZW50X3Rlcm1pbmF0ZSkgewotCQkJYnVmZmVyX2ZyZWUoJnF1ZXVlKTsKLQkJCWVycm5vID0gRUlOVFI7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbGVuID0gd3JpdGUoZmQsIHB0ciArIGhhdmUsIG5lZWQgLSBoYXZlKTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXN3aXRjaCAoZXJybm8pIHsKLSNpZiBkZWZpbmVkKEVXT1VMREJMT0NLKSAmJiAoRVdPVUxEQkxPQ0sgIT0gRUFHQUlOKQotCQkJY2FzZSBFV09VTERCTE9DSzoKLSNlbmRpZgotCQkJY2FzZSBFQUdBSU46Ci0JCQkJKHZvaWQpcG9sbCgmcGZkLCAxLCAtMSk7Ci0JCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJCWNhc2UgRUlOVFI6Ci0JCQkJY29udGludWU7Ci0JCQlkZWZhdWx0OgotCQkJCW9lcnJubyA9IGVycm5vOwotCQkJCWJ1ZmZlcl9mcmVlKCZxdWV1ZSk7Ci0JCQkJZXJybm8gPSBvZXJybm87Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJYnVmZmVyX2ZyZWUoJnF1ZXVlKTsKLQkJCWVycm5vID0gRVBJUEU7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaGF2ZSArPSAodV9pbnQpbGVuOwotCX0KLQlidWZmZXJfZnJlZSgmcXVldWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1tdXhfY2xpZW50X3JlYWRfcGFja2V0KGludCBmZCwgQnVmZmVyICptKQotewotCUJ1ZmZlciBxdWV1ZTsKLQl1X2ludCBuZWVkLCBoYXZlOwotCXZvaWQgKnB0cjsKLQlpbnQgb2Vycm5vOwotCi0JYnVmZmVyX2luaXQoJnF1ZXVlKTsKLQlpZiAobXV4X2NsaWVudF9yZWFkKGZkLCAmcXVldWUsIDQpICE9IDApIHsKLQkJaWYgKChvZXJybm8gPSBlcnJubykgPT0gRVBJUEUpCi0JCWRlYnVnMygiJXM6IHJlYWQgaGVhZGVyIGZhaWxlZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQkJZXJybm8gPSBvZXJybm87Ci0JCXJldHVybiAtMTsKLQl9Ci0JbmVlZCA9IGdldF91MzIoYnVmZmVyX3B0cigmcXVldWUpKTsKLQlpZiAobXV4X2NsaWVudF9yZWFkKGZkLCAmcXVldWUsIG5lZWQpICE9IDApIHsKLQkJb2Vycm5vID0gZXJybm87Ci0JCWRlYnVnMygiJXM6IHJlYWQgYm9keSBmYWlsZWQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JCWVycm5vID0gb2Vycm5vOwotCQlyZXR1cm4gLTE7Ci0JfQotCXB0ciA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3B0cigmcXVldWUsICZoYXZlKTsKLQlidWZmZXJfYXBwZW5kKG0sIHB0ciwgaGF2ZSk7Ci0JYnVmZmVyX2ZyZWUoJnF1ZXVlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbXV4X2NsaWVudF9oZWxsb19leGNoYW5nZShpbnQgZmQpCi17Ci0JQnVmZmVyIG07Ci0JdV9pbnQgdHlwZSwgdmVyOwotCi0JYnVmZmVyX2luaXQoJm0pOwotCWJ1ZmZlcl9wdXRfaW50KCZtLCBNVVhfTVNHX0hFTExPKTsKLQlidWZmZXJfcHV0X2ludCgmbSwgU1NITVVYX1ZFUik7Ci0JLyogbm8gZXh0ZW5zaW9ucyAqLwotCi0JaWYgKG11eF9jbGllbnRfd3JpdGVfcGFja2V0KGZkLCAmbSkgIT0gMCkKLQkJZmF0YWwoIiVzOiB3cml0ZSBwYWNrZXQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0KLQlidWZmZXJfY2xlYXIoJm0pOwotCi0JLyogUmVhZCB0aGVpciBIRUxMTyAqLwotCWlmIChtdXhfY2xpZW50X3JlYWRfcGFja2V0KGZkLCAmbSkgIT0gMCkgewotCQlidWZmZXJfZnJlZSgmbSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQl0eXBlID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCWlmICh0eXBlICE9IE1VWF9NU0dfSEVMTE8pCi0JCWZhdGFsKCIlczogZXhwZWN0ZWQgSEVMTE8gKCV1KSByZWNlaXZlZCAldSIsCi0JCSAgICBfX2Z1bmNfXywgTVVYX01TR19IRUxMTywgdHlwZSk7Ci0JdmVyID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCWlmICh2ZXIgIT0gU1NITVVYX1ZFUikKLQkJZmF0YWwoIlVuc3VwcG9ydGVkIG11bHRpcGxleGluZyBwcm90b2NvbCB2ZXJzaW9uICVkICIKLQkJICAgICIoZXhwZWN0ZWQgJWQpIiwgdmVyLCBTU0hNVVhfVkVSKTsKLQlkZWJ1ZzIoIiVzOiBtYXN0ZXIgdmVyc2lvbiAldSIsIF9fZnVuY19fLCB2ZXIpOwotCS8qIE5vIGV4dGVuc2lvbnMgYXJlIHByZXNlbnRseSBkZWZpbmVkICovCi0Jd2hpbGUgKGJ1ZmZlcl9sZW4oJm0pID4gMCkgewotCQljaGFyICpuYW1lID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOwotCQljaGFyICp2YWx1ZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQotCQlkZWJ1ZzIoIlVucmVjb2duaXNlZCBtYXN0ZXIgZXh0ZW5zaW9uIFwiJXNcIiIsIG5hbWUpOwotCQl4ZnJlZShuYW1lKTsKLQkJeGZyZWUodmFsdWUpOwotCX0KLQlidWZmZXJfZnJlZSgmbSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1X2ludAotbXV4X2NsaWVudF9yZXF1ZXN0X2FsaXZlKGludCBmZCkKLXsKLQlCdWZmZXIgbTsKLQljaGFyICplOwotCXVfaW50IHBpZCwgdHlwZSwgcmlkOwotCi0JZGVidWczKCIlczogZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQlidWZmZXJfaW5pdCgmbSk7Ci0JYnVmZmVyX3B1dF9pbnQoJm0sIE1VWF9DX0FMSVZFX0NIRUNLKTsKLQlidWZmZXJfcHV0X2ludCgmbSwgbXV4Y2xpZW50X3JlcXVlc3RfaWQpOwotCi0JaWYgKG11eF9jbGllbnRfd3JpdGVfcGFja2V0KGZkLCAmbSkgIT0gMCkKLQkJZmF0YWwoIiVzOiB3cml0ZSBwYWNrZXQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0KLQlidWZmZXJfY2xlYXIoJm0pOwotCi0JLyogUmVhZCB0aGVpciByZXBseSAqLwotCWlmIChtdXhfY2xpZW50X3JlYWRfcGFja2V0KGZkLCAmbSkgIT0gMCkgewotCQlidWZmZXJfZnJlZSgmbSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXR5cGUgPSBidWZmZXJfZ2V0X2ludCgmbSk7Ci0JaWYgKHR5cGUgIT0gTVVYX1NfQUxJVkUpIHsKLQkJZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQkJZmF0YWwoIiVzOiBtYXN0ZXIgcmV0dXJuZWQgZXJyb3I6ICVzIiwgX19mdW5jX18sIGUpOwotCX0KLQotCWlmICgocmlkID0gYnVmZmVyX2dldF9pbnQoJm0pKSAhPSBtdXhjbGllbnRfcmVxdWVzdF9pZCkKLQkJZmF0YWwoIiVzOiBvdXQgb2Ygc2VxdWVuY2UgcmVwbHk6IG15IGlkICV1IHRoZWlycyAldSIsCi0JCSAgICBfX2Z1bmNfXywgbXV4Y2xpZW50X3JlcXVlc3RfaWQsIHJpZCk7Ci0JcGlkID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCWJ1ZmZlcl9mcmVlKCZtKTsKLQotCWRlYnVnMygiJXM6IGRvbmUgcGlkID0gJXUiLCBfX2Z1bmNfXywgcGlkKTsKLQotCW11eGNsaWVudF9yZXF1ZXN0X2lkKys7Ci0KLQlyZXR1cm4gcGlkOwotfQotCi1zdGF0aWMgdm9pZAotbXV4X2NsaWVudF9yZXF1ZXN0X3Rlcm1pbmF0ZShpbnQgZmQpCi17Ci0JQnVmZmVyIG07Ci0JY2hhciAqZTsKLQl1X2ludCB0eXBlLCByaWQ7Ci0KLQlkZWJ1ZzMoIiVzOiBlbnRlcmluZyIsIF9fZnVuY19fKTsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQlidWZmZXJfcHV0X2ludCgmbSwgTVVYX0NfVEVSTUlOQVRFKTsKLQlidWZmZXJfcHV0X2ludCgmbSwgbXV4Y2xpZW50X3JlcXVlc3RfaWQpOwotCi0JaWYgKG11eF9jbGllbnRfd3JpdGVfcGFja2V0KGZkLCAmbSkgIT0gMCkKLQkJZmF0YWwoIiVzOiB3cml0ZSBwYWNrZXQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0KLQlidWZmZXJfY2xlYXIoJm0pOwotCi0JLyogUmVhZCB0aGVpciByZXBseSAqLwotCWlmIChtdXhfY2xpZW50X3JlYWRfcGFja2V0KGZkLCAmbSkgIT0gMCkgewotCQkvKiBSZW1vdGUgZW5kIGV4aXRlZCBhbHJlYWR5ICovCi0JCWlmIChlcnJubyA9PSBFUElQRSkgewotCQkJYnVmZmVyX2ZyZWUoJm0pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZhdGFsKCIlczogcmVhZCBmcm9tIG1hc3RlciBmYWlsZWQ6ICVzIiwKLQkJICAgIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCX0KLQotCXR5cGUgPSBidWZmZXJfZ2V0X2ludCgmbSk7Ci0JaWYgKChyaWQgPSBidWZmZXJfZ2V0X2ludCgmbSkpICE9IG11eGNsaWVudF9yZXF1ZXN0X2lkKQotCQlmYXRhbCgiJXM6IG91dCBvZiBzZXF1ZW5jZSByZXBseTogbXkgaWQgJXUgdGhlaXJzICV1IiwKLQkJICAgIF9fZnVuY19fLCBtdXhjbGllbnRfcmVxdWVzdF9pZCwgcmlkKTsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIE1VWF9TX09LOgotCQlicmVhazsKLQljYXNlIE1VWF9TX1BFUk1JU1NJT05fREVOSUVEOgotCQllID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOwotCQlmYXRhbCgiTWFzdGVyIHJlZnVzZWQgdGVybWluYXRpb24gcmVxdWVzdDogJXMiLCBlKTsKLQljYXNlIE1VWF9TX0ZBSUxVUkU6Ci0JCWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7Ci0JCWZhdGFsKCIlczogdGVybWluYXRpb24gcmVxdWVzdCBmYWlsZWQ6ICVzIiwgX19mdW5jX18sIGUpOwotCWRlZmF1bHQ6Ci0JCWZhdGFsKCIlczogdW5leHBlY3RlZCByZXNwb25zZSBmcm9tIG1hc3RlciAweCUwOHgiLAotCQkgICAgX19mdW5jX18sIHR5cGUpOwotCX0KLQlidWZmZXJfZnJlZSgmbSk7Ci0JbXV4Y2xpZW50X3JlcXVlc3RfaWQrKzsKLX0KLQotc3RhdGljIGludAotbXV4X2NsaWVudF9yZXF1ZXN0X2ZvcndhcmQoaW50IGZkLCB1X2ludCBmdHlwZSwgRm9yd2FyZCAqZndkKQotewotCUJ1ZmZlciBtOwotCWNoYXIgKmUsICpmd2RfZGVzYzsKLQl1X2ludCB0eXBlLCByaWQ7Ci0KLQlmd2RfZGVzYyA9IGZvcm1hdF9mb3J3YXJkKGZ0eXBlLCBmd2QpOwotCWRlYnVnKCJSZXF1ZXN0aW5nICVzIiwgZndkX2Rlc2MpOwotCXhmcmVlKGZ3ZF9kZXNjKTsKLQotCWJ1ZmZlcl9pbml0KCZtKTsKLQlidWZmZXJfcHV0X2ludCgmbSwgTVVYX0NfT1BFTl9GV0QpOwotCWJ1ZmZlcl9wdXRfaW50KCZtLCBtdXhjbGllbnRfcmVxdWVzdF9pZCk7Ci0JYnVmZmVyX3B1dF9pbnQoJm0sIGZ0eXBlKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm0sCi0JICAgIGZ3ZC0+bGlzdGVuX2hvc3QgPT0gTlVMTCA/ICIiIDogZndkLT5saXN0ZW5faG9zdCk7Ci0JYnVmZmVyX3B1dF9pbnQoJm0sIGZ3ZC0+bGlzdGVuX3BvcnQpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwKLQkgICAgZndkLT5jb25uZWN0X2hvc3QgPT0gTlVMTCA/ICIiIDogZndkLT5jb25uZWN0X2hvc3QpOwotCWJ1ZmZlcl9wdXRfaW50KCZtLCBmd2QtPmNvbm5lY3RfcG9ydCk7Ci0KLQlpZiAobXV4X2NsaWVudF93cml0ZV9wYWNrZXQoZmQsICZtKSAhPSAwKQotCQlmYXRhbCgiJXM6IHdyaXRlIHBhY2tldDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQotCWJ1ZmZlcl9jbGVhcigmbSk7Ci0KLQkvKiBSZWFkIHRoZWlyIHJlcGx5ICovCi0JaWYgKG11eF9jbGllbnRfcmVhZF9wYWNrZXQoZmQsICZtKSAhPSAwKSB7Ci0JCWJ1ZmZlcl9mcmVlKCZtKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXR5cGUgPSBidWZmZXJfZ2V0X2ludCgmbSk7Ci0JaWYgKChyaWQgPSBidWZmZXJfZ2V0X2ludCgmbSkpICE9IG11eGNsaWVudF9yZXF1ZXN0X2lkKQotCQlmYXRhbCgiJXM6IG91dCBvZiBzZXF1ZW5jZSByZXBseTogbXkgaWQgJXUgdGhlaXJzICV1IiwKLQkJICAgIF9fZnVuY19fLCBtdXhjbGllbnRfcmVxdWVzdF9pZCwgcmlkKTsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIE1VWF9TX09LOgotCQlicmVhazsKLQljYXNlIE1VWF9TX1JFTU9URV9QT1JUOgotCQlmd2QtPmFsbG9jYXRlZF9wb3J0ID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCQlsb2dpdCgiQWxsb2NhdGVkIHBvcnQgJXUgZm9yIHJlbW90ZSBmb3J3YXJkIHRvICVzOiVkIiwKLQkJICAgIGZ3ZC0+YWxsb2NhdGVkX3BvcnQsCi0JCSAgICBmd2QtPmNvbm5lY3RfaG9zdCA/IGZ3ZC0+Y29ubmVjdF9ob3N0IDogIiIsCi0JCSAgICBmd2QtPmNvbm5lY3RfcG9ydCk7Ci0JCWlmIChtdXhjbGllbnRfY29tbWFuZCA9PSBTU0hNVVhfQ09NTUFORF9GT1JXQVJEKQotCQkJZnByaW50ZihzdGRvdXQsICIldVxuIiwgZndkLT5hbGxvY2F0ZWRfcG9ydCk7Ci0JCWJyZWFrOwotCWNhc2UgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQ6Ci0JCWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7Ci0JCWJ1ZmZlcl9mcmVlKCZtKTsKLQkJZXJyb3IoIk1hc3RlciByZWZ1c2VkIGZvcndhcmRpbmcgcmVxdWVzdDogJXMiLCBlKTsKLQkJcmV0dXJuIC0xOwotCWNhc2UgTVVYX1NfRkFJTFVSRToKLQkJZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQkJYnVmZmVyX2ZyZWUoJm0pOwotCQllcnJvcigiJXM6IGZvcndhcmRpbmcgcmVxdWVzdCBmYWlsZWQ6ICVzIiwgX19mdW5jX18sIGUpOwotCQlyZXR1cm4gLTE7Ci0JZGVmYXVsdDoKLQkJZmF0YWwoIiVzOiB1bmV4cGVjdGVkIHJlc3BvbnNlIGZyb20gbWFzdGVyIDB4JTA4eCIsCi0JCSAgICBfX2Z1bmNfXywgdHlwZSk7Ci0JfQotCWJ1ZmZlcl9mcmVlKCZtKTsKLQotCW11eGNsaWVudF9yZXF1ZXN0X2lkKys7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW11eF9jbGllbnRfcmVxdWVzdF9mb3J3YXJkcyhpbnQgZmQpCi17Ci0JaW50IGk7Ci0KLQlkZWJ1ZzMoIiVzOiByZXF1ZXN0aW5nIGZvcndhcmRpbmdzOiAlZCBsb2NhbCwgJWQgcmVtb3RlIiwgX19mdW5jX18sCi0JICAgIG9wdGlvbnMubnVtX2xvY2FsX2ZvcndhcmRzLCBvcHRpb25zLm51bV9yZW1vdGVfZm9yd2FyZHMpOwotCi0JLyogWFhYIEV4aXRPbkZvcndhcmRpbmdGYWlsdXJlICovCi0JZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2xvY2FsX2ZvcndhcmRzOyBpKyspIHsKLQkJaWYgKG11eF9jbGllbnRfcmVxdWVzdF9mb3J3YXJkKGZkLAotCQkgICAgb3B0aW9ucy5sb2NhbF9mb3J3YXJkc1tpXS5jb25uZWN0X3BvcnQgPT0gMCA/Ci0JCSAgICBNVVhfRldEX0RZTkFNSUMgOiBNVVhfRldEX0xPQ0FMLAotCQkgICAgb3B0aW9ucy5sb2NhbF9mb3J3YXJkcyArIGkpICE9IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9yZW1vdGVfZm9yd2FyZHM7IGkrKykgewotCQlpZiAobXV4X2NsaWVudF9yZXF1ZXN0X2ZvcndhcmQoZmQsIE1VWF9GV0RfUkVNT1RFLAotCQkgICAgb3B0aW9ucy5yZW1vdGVfZm9yd2FyZHMgKyBpKSAhPSAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbXV4X2NsaWVudF9yZXF1ZXN0X3Nlc3Npb24oaW50IGZkKQotewotCUJ1ZmZlciBtOwotCWNoYXIgKmUsICp0ZXJtOwotCXVfaW50IGksIHJpZCwgc2lkLCBlc2lkLCBleGl0dmFsLCB0eXBlLCBleGl0dmFsX3NlZW47Ci0JZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotCWludCBkZXZudWxsLCByYXdtb2RlOwotCi0JZGVidWczKCIlczogZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoKG11eHNlcnZlcl9waWQgPSBtdXhfY2xpZW50X3JlcXVlc3RfYWxpdmUoZmQpKSA9PSAwKSB7Ci0JCWVycm9yKCIlczogbWFzdGVyIGFsaXZlIHJlcXVlc3QgZmFpbGVkIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwotCi0JaWYgKHN0ZGluX251bGxfZmxhZykgewotCQlpZiAoKGRldm51bGwgPSBvcGVuKF9QQVRIX0RFVk5VTEwsIE9fUkRPTkxZKSkgPT0gLTEpCi0JCQlmYXRhbCgib3BlbigvZGV2L251bGwpOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWlmIChkdXAyKGRldm51bGwsIFNURElOX0ZJTEVOTykgPT0gLTEpCi0JCQlmYXRhbCgiZHVwMjogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlpZiAoZGV2bnVsbCA+IFNUREVSUl9GSUxFTk8pCi0JCQljbG9zZShkZXZudWxsKTsKLQl9Ci0KLQl0ZXJtID0gZ2V0ZW52KCJURVJNIik7Ci0KLQlidWZmZXJfaW5pdCgmbSk7Ci0JYnVmZmVyX3B1dF9pbnQoJm0sIE1VWF9DX05FV19TRVNTSU9OKTsKLQlidWZmZXJfcHV0X2ludCgmbSwgbXV4Y2xpZW50X3JlcXVlc3RfaWQpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbSwgIiIpOyAvKiByZXNlcnZlZCAqLwotCWJ1ZmZlcl9wdXRfaW50KCZtLCB0dHlfZmxhZyk7Ci0JYnVmZmVyX3B1dF9pbnQoJm0sIG9wdGlvbnMuZm9yd2FyZF94MTEpOwotCWJ1ZmZlcl9wdXRfaW50KCZtLCBvcHRpb25zLmZvcndhcmRfYWdlbnQpOwotCWJ1ZmZlcl9wdXRfaW50KCZtLCBzdWJzeXN0ZW1fZmxhZyk7Ci0JYnVmZmVyX3B1dF9pbnQoJm0sIG9wdGlvbnMuZXNjYXBlX2NoYXIgPT0gU1NIX0VTQ0FQRUNIQVJfTk9ORSA/Ci0JICAgIDB4ZmZmZmZmZmYgOiAodV9pbnQpb3B0aW9ucy5lc2NhcGVfY2hhcik7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtLCB0ZXJtID09IE5VTEwgPyAiIiA6IHRlcm0pOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtLCBidWZmZXJfcHRyKCZjb21tYW5kKSwgYnVmZmVyX2xlbigmY29tbWFuZCkpOwotCi0JaWYgKG9wdGlvbnMubnVtX3NlbmRfZW52ID4gMCAmJiBlbnZpcm9uICE9IE5VTEwpIHsKLQkJLyogUGFzcyBlbnZpcm9ubWVudCAqLwotCQlmb3IgKGkgPSAwOyBlbnZpcm9uW2ldICE9IE5VTEw7IGkrKykgewotCQkJaWYgKGVudl9wZXJtaXR0ZWQoZW52aXJvbltpXSkpIHsKLQkJCQlidWZmZXJfcHV0X2NzdHJpbmcoJm0sIGVudmlyb25baV0pOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKG11eF9jbGllbnRfd3JpdGVfcGFja2V0KGZkLCAmbSkgIT0gMCkKLQkJZmF0YWwoIiVzOiB3cml0ZSBwYWNrZXQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0KLQkvKiBTZW5kIHRoZSBzdGRpbyBmaWxlIGRlc2NyaXB0b3JzICovCi0JaWYgKG1tX3NlbmRfZmQoZmQsIFNURElOX0ZJTEVOTykgPT0gLTEgfHwKLQkgICAgbW1fc2VuZF9mZChmZCwgU1RET1VUX0ZJTEVOTykgPT0gLTEgfHwKLQkgICAgbW1fc2VuZF9mZChmZCwgU1RERVJSX0ZJTEVOTykgPT0gLTEpCi0JCWZhdGFsKCIlczogc2VuZCBmZHMgZmFpbGVkIiwgX19mdW5jX18pOwotCi0JZGVidWczKCIlczogc2Vzc2lvbiByZXF1ZXN0IHNlbnQiLCBfX2Z1bmNfXyk7Ci0KLQkvKiBSZWFkIHRoZWlyIHJlcGx5ICovCi0JYnVmZmVyX2NsZWFyKCZtKTsKLQlpZiAobXV4X2NsaWVudF9yZWFkX3BhY2tldChmZCwgJm0pICE9IDApIHsKLQkJZXJyb3IoIiVzOiByZWFkIGZyb20gbWFzdGVyIGZhaWxlZDogJXMiLAotCQkgICAgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JCWJ1ZmZlcl9mcmVlKCZtKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXR5cGUgPSBidWZmZXJfZ2V0X2ludCgmbSk7Ci0JaWYgKChyaWQgPSBidWZmZXJfZ2V0X2ludCgmbSkpICE9IG11eGNsaWVudF9yZXF1ZXN0X2lkKQotCQlmYXRhbCgiJXM6IG91dCBvZiBzZXF1ZW5jZSByZXBseTogbXkgaWQgJXUgdGhlaXJzICV1IiwKLQkJICAgIF9fZnVuY19fLCBtdXhjbGllbnRfcmVxdWVzdF9pZCwgcmlkKTsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIE1VWF9TX1NFU1NJT05fT1BFTkVEOgotCQlzaWQgPSBidWZmZXJfZ2V0X2ludCgmbSk7Ci0JCWRlYnVnKCIlczogbWFzdGVyIHNlc3Npb24gaWQ6ICV1IiwgX19mdW5jX18sIHNpZCk7Ci0JCWJyZWFrOwotCWNhc2UgTVVYX1NfUEVSTUlTU0lPTl9ERU5JRUQ6Ci0JCWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbSwgTlVMTCk7Ci0JCWJ1ZmZlcl9mcmVlKCZtKTsKLQkJZXJyb3IoIk1hc3RlciByZWZ1c2VkIHNlc3Npb24gcmVxdWVzdDogJXMiLCBlKTsKLQkJcmV0dXJuIC0xOwotCWNhc2UgTVVYX1NfRkFJTFVSRToKLQkJZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQkJYnVmZmVyX2ZyZWUoJm0pOwotCQllcnJvcigiJXM6IHNlc3Npb24gcmVxdWVzdCBmYWlsZWQ6ICVzIiwgX19mdW5jX18sIGUpOwotCQlyZXR1cm4gLTE7Ci0JZGVmYXVsdDoKLQkJYnVmZmVyX2ZyZWUoJm0pOwotCQllcnJvcigiJXM6IHVuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSBtYXN0ZXIgMHglMDh4IiwKLQkJICAgIF9fZnVuY19fLCB0eXBlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltdXhjbGllbnRfcmVxdWVzdF9pZCsrOwotCi0Jc2lnbmFsKFNJR0hVUCwgY29udHJvbF9jbGllbnRfc2lnaGFuZGxlcik7Ci0Jc2lnbmFsKFNJR0lOVCwgY29udHJvbF9jbGllbnRfc2lnaGFuZGxlcik7Ci0Jc2lnbmFsKFNJR1RFUk0sIGNvbnRyb2xfY2xpZW50X3NpZ2hhbmRsZXIpOwotCXNpZ25hbChTSUdXSU5DSCwgY29udHJvbF9jbGllbnRfc2lncmVsYXkpOwotCi0JcmF3bW9kZSA9IHR0eV9mbGFnOwotCWlmICh0dHlfZmxhZykKLQkJZW50ZXJfcmF3X21vZGUob3B0aW9ucy5yZXF1ZXN0X3R0eSA9PSBSRVFVRVNUX1RUWV9GT1JDRSk7Ci0KLQkvKgotCSAqIFN0aWNrIGFyb3VuZCB1bnRpbCB0aGUgY29udHJvbGVlIGNsb3NlcyB0aGUgY2xpZW50X2ZkLgotCSAqIEJlZm9yZSBpdCBkb2VzLCBpdCBpcyBleHBlY3RlZCB0byB3cml0ZSBhbiBleGl0IG1lc3NhZ2UuCi0JICogVGhpcyBwcm9jZXNzIG11c3QgcmVhZCB0aGUgdmFsdWUgYW5kIHdhaXQgZm9yIHRoZSBjbG9zdXJlIG9mCi0JICogdGhlIGNsaWVudF9mZDsgaWYgdGhpcyBvbmUgY2xvc2VzIGVhcmx5LCB0aGUgbXVsdGlwbGV4IG1hc3RlciB3aWxsCi0JICogdGVybWluYXRlIGVhcmx5IHRvbyAocG9zc2libHkgbG9zaW5nIGRhdGEpLgotCSAqLwotCWZvciAoZXhpdHZhbCA9IDI1NSwgZXhpdHZhbF9zZWVuID0gMDs7KSB7Ci0JCWJ1ZmZlcl9jbGVhcigmbSk7Ci0JCWlmIChtdXhfY2xpZW50X3JlYWRfcGFja2V0KGZkLCAmbSkgIT0gMCkKLQkJCWJyZWFrOwotCQl0eXBlID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBNVVhfU19UVFlfQUxMT0NfRkFJTDoKLQkJCWlmICgoZXNpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKSkgIT0gc2lkKQotCQkJCWZhdGFsKCIlczogdHR5IGFsbG9jIGZhaWwgb24gdW5rbm93biBzZXNzaW9uOiAiCi0JCQkJICAgICJteSBpZCAldSB0aGVpcnMgJXUiLAotCQkJCSAgICBfX2Z1bmNfXywgc2lkLCBlc2lkKTsKLQkJCWxlYXZlX3Jhd19tb2RlKG9wdGlvbnMucmVxdWVzdF90dHkgPT0KLQkJCSAgICBSRVFVRVNUX1RUWV9GT1JDRSk7Ci0JCQlyYXdtb2RlID0gMDsKLQkJCWNvbnRpbnVlOwotCQljYXNlIE1VWF9TX0VYSVRfTUVTU0FHRToKLQkJCWlmICgoZXNpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKSkgIT0gc2lkKQotCQkJCWZhdGFsKCIlczogZXhpdCBvbiB1bmtub3duIHNlc3Npb246ICIKLQkJCQkgICAgIm15IGlkICV1IHRoZWlycyAldSIsCi0JCQkJICAgIF9fZnVuY19fLCBzaWQsIGVzaWQpOwotCQkJaWYgKGV4aXR2YWxfc2VlbikKLQkJCQlmYXRhbCgiJXM6IGV4aXR2YWwgc2VudCB0d2ljZSIsIF9fZnVuY19fKTsKLQkJCWV4aXR2YWwgPSBidWZmZXJfZ2V0X2ludCgmbSk7Ci0JCQlleGl0dmFsX3NlZW4gPSAxOwotCQkJY29udGludWU7Ci0JCWRlZmF1bHQ6Ci0JCQllID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOwotCQkJZmF0YWwoIiVzOiBtYXN0ZXIgcmV0dXJuZWQgZXJyb3I6ICVzIiwgX19mdW5jX18sIGUpOwotCQl9Ci0JfQotCi0JY2xvc2UoZmQpOwotCWlmIChyYXdtb2RlKQotCQlsZWF2ZV9yYXdfbW9kZShvcHRpb25zLnJlcXVlc3RfdHR5ID09IFJFUVVFU1RfVFRZX0ZPUkNFKTsKLQotCWlmIChtdXhjbGllbnRfdGVybWluYXRlKSB7Ci0JCWRlYnVnMigiRXhpdGluZyBvbiBzaWduYWwgJWQiLCBtdXhjbGllbnRfdGVybWluYXRlKTsKLQkJZXhpdHZhbCA9IDI1NTsKLQl9IGVsc2UgaWYgKCFleGl0dmFsX3NlZW4pIHsKLQkJZGVidWcyKCJDb250cm9sIG1hc3RlciB0ZXJtaW5hdGVkIHVuZXhwZWN0ZWRseSIpOwotCQlleGl0dmFsID0gMjU1OwotCX0gZWxzZQotCQlkZWJ1ZzIoIlJlY2VpdmVkIGV4aXQgc3RhdHVzIGZyb20gbWFzdGVyICVkIiwgZXhpdHZhbCk7Ci0KLQlpZiAodHR5X2ZsYWcgJiYgb3B0aW9ucy5sb2dfbGV2ZWwgIT0gU1lTTE9HX0xFVkVMX1FVSUVUKQotCQlmcHJpbnRmKHN0ZGVyciwgIlNoYXJlZCBjb25uZWN0aW9uIHRvICVzIGNsb3NlZC5cclxuIiwgaG9zdCk7Ci0KLQlleGl0KGV4aXR2YWwpOwotfQotCi1zdGF0aWMgaW50Ci1tdXhfY2xpZW50X3JlcXVlc3Rfc3RkaW9fZndkKGludCBmZCkKLXsKLQlCdWZmZXIgbTsKLQljaGFyICplOwotCXVfaW50IHR5cGUsIHJpZCwgc2lkOwotCWludCBkZXZudWxsOwotCi0JZGVidWczKCIlczogZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoKG11eHNlcnZlcl9waWQgPSBtdXhfY2xpZW50X3JlcXVlc3RfYWxpdmUoZmQpKSA9PSAwKSB7Ci0JCWVycm9yKCIlczogbWFzdGVyIGFsaXZlIHJlcXVlc3QgZmFpbGVkIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwotCi0JaWYgKHN0ZGluX251bGxfZmxhZykgewotCQlpZiAoKGRldm51bGwgPSBvcGVuKF9QQVRIX0RFVk5VTEwsIE9fUkRPTkxZKSkgPT0gLTEpCi0JCQlmYXRhbCgib3BlbigvZGV2L251bGwpOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWlmIChkdXAyKGRldm51bGwsIFNURElOX0ZJTEVOTykgPT0gLTEpCi0JCQlmYXRhbCgiZHVwMjogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlpZiAoZGV2bnVsbCA+IFNUREVSUl9GSUxFTk8pCi0JCQljbG9zZShkZXZudWxsKTsKLQl9Ci0KLQlidWZmZXJfaW5pdCgmbSk7Ci0JYnVmZmVyX3B1dF9pbnQoJm0sIE1VWF9DX05FV19TVERJT19GV0QpOwotCWJ1ZmZlcl9wdXRfaW50KCZtLCBtdXhjbGllbnRfcmVxdWVzdF9pZCk7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtLCAiIik7IC8qIHJlc2VydmVkICovCi0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtLCBzdGRpb19mb3J3YXJkX2hvc3QpOwotCWJ1ZmZlcl9wdXRfaW50KCZtLCBzdGRpb19mb3J3YXJkX3BvcnQpOwotCi0JaWYgKG11eF9jbGllbnRfd3JpdGVfcGFja2V0KGZkLCAmbSkgIT0gMCkKLQkJZmF0YWwoIiVzOiB3cml0ZSBwYWNrZXQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0KLQkvKiBTZW5kIHRoZSBzdGRpbyBmaWxlIGRlc2NyaXB0b3JzICovCi0JaWYgKG1tX3NlbmRfZmQoZmQsIFNURElOX0ZJTEVOTykgPT0gLTEgfHwKLQkgICAgbW1fc2VuZF9mZChmZCwgU1RET1VUX0ZJTEVOTykgPT0gLTEpCi0JCWZhdGFsKCIlczogc2VuZCBmZHMgZmFpbGVkIiwgX19mdW5jX18pOwotCi0JZGVidWczKCIlczogc3RkaW8gZm9yd2FyZCByZXF1ZXN0IHNlbnQiLCBfX2Z1bmNfXyk7Ci0KLQkvKiBSZWFkIHRoZWlyIHJlcGx5ICovCi0JYnVmZmVyX2NsZWFyKCZtKTsKLQotCWlmIChtdXhfY2xpZW50X3JlYWRfcGFja2V0KGZkLCAmbSkgIT0gMCkgewotCQllcnJvcigiJXM6IHJlYWQgZnJvbSBtYXN0ZXIgZmFpbGVkOiAlcyIsCi0JCSAgICBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQkJYnVmZmVyX2ZyZWUoJm0pOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JdHlwZSA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQlpZiAoKHJpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKSkgIT0gbXV4Y2xpZW50X3JlcXVlc3RfaWQpCi0JCWZhdGFsKCIlczogb3V0IG9mIHNlcXVlbmNlIHJlcGx5OiBteSBpZCAldSB0aGVpcnMgJXUiLAotCQkgICAgX19mdW5jX18sIG11eGNsaWVudF9yZXF1ZXN0X2lkLCByaWQpOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgTVVYX1NfU0VTU0lPTl9PUEVORUQ6Ci0JCXNpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtKTsKLQkJZGVidWcoIiVzOiBtYXN0ZXIgc2Vzc2lvbiBpZDogJXUiLCBfX2Z1bmNfXywgc2lkKTsKLQkJYnJlYWs7Ci0JY2FzZSBNVVhfU19QRVJNSVNTSU9OX0RFTklFRDoKLQkJZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQkJYnVmZmVyX2ZyZWUoJm0pOwotCQlmYXRhbCgiTWFzdGVyIHJlZnVzZWQgc3RkaW8gZm9yd2FyZGluZyByZXF1ZXN0OiAlcyIsIGUpOwotCWNhc2UgTVVYX1NfRkFJTFVSRToKLQkJZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQkJYnVmZmVyX2ZyZWUoJm0pOwotCQlmYXRhbCgiJXM6IHN0ZGlvIGZvcndhcmRpbmcgcmVxdWVzdCBmYWlsZWQ6ICVzIiwgX19mdW5jX18sIGUpOwotCWRlZmF1bHQ6Ci0JCWJ1ZmZlcl9mcmVlKCZtKTsKLQkJZXJyb3IoIiVzOiB1bmV4cGVjdGVkIHJlc3BvbnNlIGZyb20gbWFzdGVyIDB4JTA4eCIsCi0JCSAgICBfX2Z1bmNfXywgdHlwZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbXV4Y2xpZW50X3JlcXVlc3RfaWQrKzsKLQotCXNpZ25hbChTSUdIVVAsIGNvbnRyb2xfY2xpZW50X3NpZ2hhbmRsZXIpOwotCXNpZ25hbChTSUdJTlQsIGNvbnRyb2xfY2xpZW50X3NpZ2hhbmRsZXIpOwotCXNpZ25hbChTSUdURVJNLCBjb250cm9sX2NsaWVudF9zaWdoYW5kbGVyKTsKLQlzaWduYWwoU0lHV0lOQ0gsIGNvbnRyb2xfY2xpZW50X3NpZ3JlbGF5KTsKLQotCS8qCi0JICogU3RpY2sgYXJvdW5kIHVudGlsIHRoZSBjb250cm9sZWUgY2xvc2VzIHRoZSBjbGllbnRfZmQuCi0JICovCi0JYnVmZmVyX2NsZWFyKCZtKTsKLQlpZiAobXV4X2NsaWVudF9yZWFkX3BhY2tldChmZCwgJm0pICE9IDApIHsKLQkJaWYgKGVycm5vID09IEVQSVBFIHx8Ci0JCSAgICAoZXJybm8gPT0gRUlOVFIgJiYgbXV4Y2xpZW50X3Rlcm1pbmF0ZSAhPSAwKSkKLQkJCXJldHVybiAwOwotCQlmYXRhbCgiJXM6IG11eF9jbGllbnRfcmVhZF9wYWNrZXQ6ICVzIiwKLQkJICAgIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCX0KLQlmYXRhbCgiJXM6IG1hc3RlciByZXR1cm5lZCB1bmV4cGVjdGVkIG1lc3NhZ2UgJXUiLCBfX2Z1bmNfXywgdHlwZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tdXhfY2xpZW50X3JlcXVlc3Rfc3RvcF9saXN0ZW5pbmcoaW50IGZkKQotewotCUJ1ZmZlciBtOwotCWNoYXIgKmU7Ci0JdV9pbnQgdHlwZSwgcmlkOwotCi0JZGVidWczKCIlczogZW50ZXJpbmciLCBfX2Z1bmNfXyk7Ci0KLQlidWZmZXJfaW5pdCgmbSk7Ci0JYnVmZmVyX3B1dF9pbnQoJm0sIE1VWF9DX1NUT1BfTElTVEVOSU5HKTsKLQlidWZmZXJfcHV0X2ludCgmbSwgbXV4Y2xpZW50X3JlcXVlc3RfaWQpOwotCi0JaWYgKG11eF9jbGllbnRfd3JpdGVfcGFja2V0KGZkLCAmbSkgIT0gMCkKLQkJZmF0YWwoIiVzOiB3cml0ZSBwYWNrZXQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0KLQlidWZmZXJfY2xlYXIoJm0pOwotCi0JLyogUmVhZCB0aGVpciByZXBseSAqLwotCWlmIChtdXhfY2xpZW50X3JlYWRfcGFja2V0KGZkLCAmbSkgIT0gMCkKLQkJZmF0YWwoIiVzOiByZWFkIGZyb20gbWFzdGVyIGZhaWxlZDogJXMiLAotCQkgICAgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0KLQl0eXBlID0gYnVmZmVyX2dldF9pbnQoJm0pOwotCWlmICgocmlkID0gYnVmZmVyX2dldF9pbnQoJm0pKSAhPSBtdXhjbGllbnRfcmVxdWVzdF9pZCkKLQkJZmF0YWwoIiVzOiBvdXQgb2Ygc2VxdWVuY2UgcmVwbHk6IG15IGlkICV1IHRoZWlycyAldSIsCi0JCSAgICBfX2Z1bmNfXywgbXV4Y2xpZW50X3JlcXVlc3RfaWQsIHJpZCk7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBNVVhfU19PSzoKLQkJYnJlYWs7Ci0JY2FzZSBNVVhfU19QRVJNSVNTSU9OX0RFTklFRDoKLQkJZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCBOVUxMKTsKLQkJZmF0YWwoIk1hc3RlciByZWZ1c2VkIHN0b3AgbGlzdGVuaW5nIHJlcXVlc3Q6ICVzIiwgZSk7Ci0JY2FzZSBNVVhfU19GQUlMVVJFOgotCQllID0gYnVmZmVyX2dldF9zdHJpbmcoJm0sIE5VTEwpOwotCQlmYXRhbCgiJXM6IHN0b3AgbGlzdGVuaW5nIHJlcXVlc3QgZmFpbGVkOiAlcyIsIF9fZnVuY19fLCBlKTsKLQlkZWZhdWx0OgotCQlmYXRhbCgiJXM6IHVuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSBtYXN0ZXIgMHglMDh4IiwKLQkJICAgIF9fZnVuY19fLCB0eXBlKTsKLQl9Ci0JYnVmZmVyX2ZyZWUoJm0pOwotCW11eGNsaWVudF9yZXF1ZXN0X2lkKys7Ci19Ci0KLS8qIE11bHRpcGxleCBjbGllbnQgbWFpbiBsb29wLiAqLwotdm9pZAotbXV4Y2xpZW50KGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0Jc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7Ci0Jc29ja2xlbl90IHN1bl9sZW47Ci0JaW50IHNvY2s7Ci0JdV9pbnQgcGlkOwotCi0JaWYgKG11eGNsaWVudF9jb21tYW5kID09IDApIHsKLQkJaWYgKHN0ZGlvX2ZvcndhcmRfaG9zdCAhPSBOVUxMKQotCQkJbXV4Y2xpZW50X2NvbW1hbmQgPSBTU0hNVVhfQ09NTUFORF9TVERJT19GV0Q7Ci0JCWVsc2UKLQkJCW11eGNsaWVudF9jb21tYW5kID0gU1NITVVYX0NPTU1BTkRfT1BFTjsKLQl9Ci0KLQlzd2l0Y2ggKG9wdGlvbnMuY29udHJvbF9tYXN0ZXIpIHsKLQljYXNlIFNTSENUTF9NQVNURVJfQVVUTzoKLQljYXNlIFNTSENUTF9NQVNURVJfQVVUT19BU0s6Ci0JCWRlYnVnKCJhdXRvLW11eDogVHJ5aW5nIGV4aXN0aW5nIG1hc3RlciIpOwotCQkvKiBGQUxMVEhST1VHSCAqLwotCWNhc2UgU1NIQ1RMX01BU1RFUl9OTzoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuOwotCX0KLQotCW1lbXNldCgmYWRkciwgJ1wwJywgc2l6ZW9mKGFkZHIpKTsKLQlhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOwotCXN1bl9sZW4gPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKSArCi0JICAgIHN0cmxlbihwYXRoKSArIDE7Ci0KLQlpZiAoc3RybGNweShhZGRyLnN1bl9wYXRoLCBwYXRoLAotCSAgICBzaXplb2YoYWRkci5zdW5fcGF0aCkpID49IHNpemVvZihhZGRyLnN1bl9wYXRoKSkKLQkJZmF0YWwoIkNvbnRyb2xQYXRoIHRvbyBsb25nIik7Ci0KLQlpZiAoKHNvY2sgPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIDApKSA8IDApCi0JCWZhdGFsKCIlcyBzb2NrZXQoKTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQotCWlmIChjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc3VuX2xlbikgPT0gLTEpIHsKLQkJc3dpdGNoIChtdXhjbGllbnRfY29tbWFuZCkgewotCQljYXNlIFNTSE1VWF9DT01NQU5EX09QRU46Ci0JCWNhc2UgU1NITVVYX0NPTU1BTkRfU1RESU9fRldEOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlmYXRhbCgiQ29udHJvbCBzb2NrZXQgY29ubmVjdCglLjEwMHMpOiAlcyIsIHBhdGgsCi0JCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJfQotCQlpZiAoZXJybm8gPT0gRUNPTk5SRUZVU0VEICYmCi0JCSAgICBvcHRpb25zLmNvbnRyb2xfbWFzdGVyICE9IFNTSENUTF9NQVNURVJfTk8pIHsKLQkJCWRlYnVnKCJTdGFsZSBjb250cm9sIHNvY2tldCAlLjEwMHMsIHVubGlua2luZyIsIHBhdGgpOwotCQkJdW5saW5rKHBhdGgpOwotCQl9IGVsc2UgaWYgKGVycm5vID09IEVOT0VOVCkgewotCQkJZGVidWcoIkNvbnRyb2wgc29ja2V0IFwiJS4xMDBzXCIgZG9lcyBub3QgZXhpc3QiLCBwYXRoKTsKLQkJfSBlbHNlIHsKLQkJCWVycm9yKCJDb250cm9sIHNvY2tldCBjb25uZWN0KCUuMTAwcyk6ICVzIiwgcGF0aCwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQl9Ci0JCWNsb3NlKHNvY2spOwotCQlyZXR1cm47Ci0JfQotCXNldF9ub25ibG9jayhzb2NrKTsKLQotCWlmIChtdXhfY2xpZW50X2hlbGxvX2V4Y2hhbmdlKHNvY2spICE9IDApIHsKLQkJZXJyb3IoIiVzOiBtYXN0ZXIgaGVsbG8gZXhjaGFuZ2UgZmFpbGVkIiwgX19mdW5jX18pOwotCQljbG9zZShzb2NrKTsKLQkJcmV0dXJuOwotCX0KLQotCXN3aXRjaCAobXV4Y2xpZW50X2NvbW1hbmQpIHsKLQljYXNlIFNTSE1VWF9DT01NQU5EX0FMSVZFX0NIRUNLOgotCQlpZiAoKHBpZCA9IG11eF9jbGllbnRfcmVxdWVzdF9hbGl2ZShzb2NrKSkgPT0gMCkKLQkJCWZhdGFsKCIlczogbWFzdGVyIGFsaXZlIGNoZWNrIGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJZnByaW50ZihzdGRlcnIsICJNYXN0ZXIgcnVubmluZyAocGlkPSVkKVxyXG4iLCBwaWQpOwotCQlleGl0KDApOwotCWNhc2UgU1NITVVYX0NPTU1BTkRfVEVSTUlOQVRFOgotCQltdXhfY2xpZW50X3JlcXVlc3RfdGVybWluYXRlKHNvY2spOwotCQlmcHJpbnRmKHN0ZGVyciwgIkV4aXQgcmVxdWVzdCBzZW50LlxyXG4iKTsKLQkJZXhpdCgwKTsKLQljYXNlIFNTSE1VWF9DT01NQU5EX0ZPUldBUkQ6Ci0JCWlmIChtdXhfY2xpZW50X3JlcXVlc3RfZm9yd2FyZHMoc29jaykgIT0gMCkKLQkJCWZhdGFsKCIlczogbWFzdGVyIGZvcndhcmQgcmVxdWVzdCBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCWV4aXQoMCk7Ci0JY2FzZSBTU0hNVVhfQ09NTUFORF9PUEVOOgotCQlpZiAobXV4X2NsaWVudF9yZXF1ZXN0X2ZvcndhcmRzKHNvY2spICE9IDApIHsKLQkJCWVycm9yKCIlczogbWFzdGVyIGZvcndhcmQgcmVxdWVzdCBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbXV4X2NsaWVudF9yZXF1ZXN0X3Nlc3Npb24oc29jayk7Ci0JCXJldHVybjsKLQljYXNlIFNTSE1VWF9DT01NQU5EX1NURElPX0ZXRDoKLQkJbXV4X2NsaWVudF9yZXF1ZXN0X3N0ZGlvX2Z3ZChzb2NrKTsKLQkJZXhpdCgwKTsKLQljYXNlIFNTSE1VWF9DT01NQU5EX1NUT1A6Ci0JCW11eF9jbGllbnRfcmVxdWVzdF9zdG9wX2xpc3RlbmluZyhzb2NrKTsKLQkJZnByaW50ZihzdGRlcnIsICJTdG9wIGxpc3RlbmluZyByZXF1ZXN0IHNlbnQuXHJcbiIpOwotCQlleGl0KDApOwotCWRlZmF1bHQ6Ci0JCWZhdGFsKCJ1bnJlY29nbmlzZWQgbXV4Y2xpZW50X2NvbW1hbmQgJWQiLCBtdXhjbGllbnRfY29tbWFuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvbXlwcm9wb3NhbC5oIGIvbXlwcm9wb3NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDUxNjkwLi4wMDAwMDAwCi0tLSBhL215cHJvcG9zYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKiAkT3BlbkJTRDogbXlwcm9wb3NhbC5oLHYgMS4yOCAyMDExLzA4LzAyIDAxOjIyOjExIGRqbSBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgotCi0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0jIGRlZmluZSBLRVhfRUNESF9NRVRIT0RTIFwKLQkiZWNkaC1zaGEyLW5pc3RwMjU2LCIgXAotCSJlY2RoLXNoYTItbmlzdHAzODQsIiBcCi0JImVjZGgtc2hhMi1uaXN0cDUyMSwiCi0jIGRlZmluZSBIT1NUS0VZX0VDRFNBX0NFUlRfTUVUSE9EUyBcCi0JImVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20sIiBcCi0JImVjZHNhLXNoYTItbmlzdHAzODQtY2VydC12MDFAb3BlbnNzaC5jb20sIiBcCi0JImVjZHNhLXNoYTItbmlzdHA1MjEtY2VydC12MDFAb3BlbnNzaC5jb20sIgotIyBkZWZpbmUgSE9TVEtFWV9FQ0RTQV9NRVRIT0RTIFwKLQkiZWNkc2Etc2hhMi1uaXN0cDI1NiwiIFwKLQkiZWNkc2Etc2hhMi1uaXN0cDM4NCwiIFwKLQkiZWNkc2Etc2hhMi1uaXN0cDUyMSwiCi0jZWxzZQotIyBkZWZpbmUgS0VYX0VDREhfTUVUSE9EUwotIyBkZWZpbmUgSE9TVEtFWV9FQ0RTQV9DRVJUX01FVEhPRFMKLSMgZGVmaW5lIEhPU1RLRVlfRUNEU0FfTUVUSE9EUwotI2VuZGlmCi0KLS8qIE9sZCBPcGVuU1NMIGRvZXNuJ3Qgc3VwcG9ydCB3aGF0IHdlIG5lZWQgZm9yIERIR0VYLXNoYTI1NiAqLwotI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMEwKLSMgZGVmaW5lIEtFWF9TSEEyNTZfTUVUSE9EUyBcCi0JImRpZmZpZS1oZWxsbWFuLWdyb3VwLWV4Y2hhbmdlLXNoYTI1NiwiCi0jZWxzZQotIyBkZWZpbmUgS0VYX1NIQTI1Nl9NRVRIT0RTCi0jZW5kaWYKLQotIyBkZWZpbmUgS0VYX0RFRkFVTFRfS0VYIFwKLQlLRVhfRUNESF9NRVRIT0RTIFwKLQlLRVhfU0hBMjU2X01FVEhPRFMgXAotCSJkaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGExLCIgXAotCSJkaWZmaWUtaGVsbG1hbi1ncm91cDE0LXNoYTEsIiBcCi0JImRpZmZpZS1oZWxsbWFuLWdyb3VwMS1zaGExIgotCi0jZGVmaW5lCUtFWF9ERUZBVUxUX1BLX0FMRwlcCi0JSE9TVEtFWV9FQ0RTQV9DRVJUX01FVEhPRFMgXAotCSJzc2gtcnNhLWNlcnQtdjAxQG9wZW5zc2guY29tLCIgXAotCSJzc2gtZHNzLWNlcnQtdjAxQG9wZW5zc2guY29tLCIgXAotCSJzc2gtcnNhLWNlcnQtdjAwQG9wZW5zc2guY29tLCIgXAotCSJzc2gtZHNzLWNlcnQtdjAwQG9wZW5zc2guY29tLCIgXAotCUhPU1RLRVlfRUNEU0FfTUVUSE9EUyBcCi0JInNzaC1yc2EsIiBcCi0JInNzaC1kc3MiCi0KLSNkZWZpbmUJS0VYX0RFRkFVTFRfRU5DUllQVCBcCi0JImFlczEyOC1jdHIsYWVzMTkyLWN0cixhZXMyNTYtY3RyLCIgXAotCSJhcmNmb3VyMjU2LGFyY2ZvdXIxMjgsIiBcCi0JImFlczEyOC1jYmMsM2Rlcy1jYmMsYmxvd2Zpc2gtY2JjLGNhc3QxMjgtY2JjLCIgXAotCSJhZXMxOTItY2JjLGFlczI1Ni1jYmMsYXJjZm91cixyaWpuZGFlbC1jYmNAbHlzYXRvci5saXUuc2UiCi0jaWZkZWYgSEFWRV9FVlBfU0hBMjU2Ci0jZGVmaW5lCVNIQTJfSE1BQ19NT0RFUyBcCi0JImhtYWMtc2hhMi0yNTYsIiBcCi0JImhtYWMtc2hhMi0yNTYtOTYsIiBcCi0JImhtYWMtc2hhMi01MTIsIiBcCi0JImhtYWMtc2hhMi01MTItOTYsIgotI2Vsc2UKLSMgZGVmaW5lIFNIQTJfSE1BQ19NT0RFUwotI2VuZGlmCi0jaWZkZWYgSEFWRV9FVlBfUklQRU1ECi0jZGVmaW5lCVJJUEVNRF9NQUNfTU9ERVMgXAotCSJobWFjLXJpcGVtZDE2MCwiIFwKLQkiaG1hYy1yaXBlbWQxNjBAb3BlbnNzaC5jb20sIgotI2Vsc2UKLSMgZGVmaW5lIFJJUEVNRF9NQUNfTU9ERVMKLSNlbmRpZgotI2RlZmluZQlLRVhfREVGQVVMVF9NQUMgXAotCSJobWFjLW1kNSwiIFwKLQkiaG1hYy1zaGExLCIgXAotCSJ1bWFjLTY0QG9wZW5zc2guY29tLCIgXAotCVNIQTJfSE1BQ19NT0RFUyBcCi0JUklQRU1EX01BQ19NT0RFUyBcCi0JImhtYWMtc2hhMS05NiwiIFwKLQkiaG1hYy1tZDUtOTYiCi0KLSNkZWZpbmUJS0VYX0RFRkFVTFRfQ09NUAkibm9uZSx6bGliQG9wZW5zc2guY29tLHpsaWIiCi0jZGVmaW5lCUtFWF9ERUZBVUxUX0xBTkcJIiIKLQotCi1zdGF0aWMgY2hhciAqbXlwcm9wb3NhbFtQUk9QT1NBTF9NQVhdID0gewotCUtFWF9ERUZBVUxUX0tFWCwKLQlLRVhfREVGQVVMVF9QS19BTEcsCi0JS0VYX0RFRkFVTFRfRU5DUllQVCwKLQlLRVhfREVGQVVMVF9FTkNSWVBULAotCUtFWF9ERUZBVUxUX01BQywKLQlLRVhfREVGQVVMVF9NQUMsCi0JS0VYX0RFRkFVTFRfQ09NUCwKLQlLRVhfREVGQVVMVF9DT01QLAotCUtFWF9ERUZBVUxUX0xBTkcsCi0JS0VYX0RFRkFVTFRfTEFORwotfTsKZGlmZiAtLWdpdCBhL25jaGFuLmMgYi9uY2hhbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGY2YTJmLi4wMDAwMDAwCi0tLSBhL25jaGFuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzEgKzAsMCBAQAotLyogJE9wZW5CU0Q6IG5jaGFuLmMsdiAxLjYzIDIwMTAvMDEvMjYgMDE6Mjg6MzUgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKLSNpbmNsdWRlICJzc2gxLmgiCi0jaW5jbHVkZSAic3NoMi5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgInBhY2tldC5oIgotI2luY2x1ZGUgImNoYW5uZWxzLmgiCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0KLS8qCi0gKiBTU0ggUHJvdG9jb2wgMS41IGFrYSBOZXcgQ2hhbm5lbCBQcm90b2NvbAotICogVGhhbmtzIHRvIE1hcnRpbmEsIEF4ZWwgYW5kIGV2ZXJ5b25lIHdobyBsZWZ0IEVybGFuZ2VuLCBsZWF2aW5nIG1lIGJvcmVkLgotICogV3JpdHRlbiBieSBNYXJrdXMgRnJpZWRsIGluIE9jdG9iZXIgMTk5OQotICoKLSAqIFByb3RvY29sIHZlcnNpb25zIDEuMyBhbmQgMS41IGRpZmZlciBpbiB0aGUgaGFuZHNoYWtlIHByb3RvY29sIHVzZWQgZm9yIHRoZQotICogdGVhciBkb3duIG9mIGNoYW5uZWxzOgotICoKLSAqIDEuMzoJc3RyaWN0IHJlcXVlc3QtYWNrLXByb3RvY29sOgotICoJQ0xPU0UJLT4KLSAqCQk8LSAgQ0xPU0VfQ09ORklSTQotICoKLSAqIDEuNToJdXNlcyB2YXJpYXRpb25zIG9mOgotICoJSUVPRgktPgotICoJCTwtICBPQ0xPU0UKLSAqCQk8LSAgSUVPRgotICoJT0NMT1NFCS0+Ci0gKglpLmUuIGJvdGggc2lkZXMgaGF2ZSB0byBjbG9zZSB0aGUgY2hhbm5lbAotICoKLSAqIDIuMDogdGhlIEVPRiBtZXNzYWdlcyBhcmUgb3B0aW9uYWwKLSAqCi0gKiBTZWUgdGhlIGRlYnVnZ2luZyBvdXRwdXQgZnJvbSAnc3NoIC12JyBhbmQgJ3NzaGQgLWQnIG9mCi0gKiBzc2gtMS4yLjI3IGFzIGFuIGV4YW1wbGUuCi0gKgotICovCi0KLS8qIGZ1bmN0aW9ucyBtYW5pcHVsYXRpbmcgY2hhbm5lbCBzdGF0ZXMgKi8KLS8qCi0gKiBFVkVOVFMgdXBkYXRlIGNoYW5uZWwgaW5wdXQvb3V0cHV0IHN0YXRlcyBleGVjdXRlIEFDVElPTlMKLSAqLwotLyoKLSAqIEFDVElPTlM6IHNob3VsZCBuZXZlciB1cGRhdGUgdGhlIGNoYW5uZWwgc3RhdGVzCi0gKi8KLXN0YXRpYyB2b2lkCWNoYW5fc2VuZF9pZW9mMShDaGFubmVsICopOwotc3RhdGljIHZvaWQJY2hhbl9zZW5kX29jbG9zZTEoQ2hhbm5lbCAqKTsKLXN0YXRpYyB2b2lkCWNoYW5fc2VuZF9jbG9zZTIoQ2hhbm5lbCAqKTsKLXN0YXRpYyB2b2lkCWNoYW5fc2VuZF9lb2YyKENoYW5uZWwgKik7Ci1zdGF0aWMgdm9pZAljaGFuX3NlbmRfZW93MihDaGFubmVsICopOwotCi0vKiBoZWxwZXIgKi8KLXN0YXRpYyB2b2lkCWNoYW5fc2h1dGRvd25fd3JpdGUoQ2hhbm5lbCAqKTsKLXN0YXRpYyB2b2lkCWNoYW5fc2h1dGRvd25fcmVhZChDaGFubmVsICopOwotCi1zdGF0aWMgY2hhciAqb3N0YXRlc1tdID0geyAib3BlbiIsICJkcmFpbiIsICJ3YWl0X2llb2YiLCAiY2xvc2VkIiB9Owotc3RhdGljIGNoYXIgKmlzdGF0ZXNbXSA9IHsgIm9wZW4iLCAiZHJhaW4iLCAid2FpdF9vY2xvc2UiLCAiY2xvc2VkIiB9OwotCi1zdGF0aWMgdm9pZAotY2hhbl9zZXRfaXN0YXRlKENoYW5uZWwgKmMsIHVfaW50IG5leHQpCi17Ci0JaWYgKGMtPmlzdGF0ZSA+IENIQU5fSU5QVVRfQ0xPU0VEIHx8IG5leHQgPiBDSEFOX0lOUFVUX0NMT1NFRCkKLQkJZmF0YWwoImNoYW5fc2V0X2lzdGF0ZTogYmFkIHN0YXRlICVkIC0+ICVkIiwgYy0+aXN0YXRlLCBuZXh0KTsKLQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGlucHV0ICVzIC0+ICVzIiwgYy0+c2VsZiwgaXN0YXRlc1tjLT5pc3RhdGVdLAotCSAgICBpc3RhdGVzW25leHRdKTsKLQljLT5pc3RhdGUgPSBuZXh0OwotfQotc3RhdGljIHZvaWQKLWNoYW5fc2V0X29zdGF0ZShDaGFubmVsICpjLCB1X2ludCBuZXh0KQotewotCWlmIChjLT5vc3RhdGUgPiBDSEFOX09VVFBVVF9DTE9TRUQgfHwgbmV4dCA+IENIQU5fT1VUUFVUX0NMT1NFRCkKLQkJZmF0YWwoImNoYW5fc2V0X29zdGF0ZTogYmFkIHN0YXRlICVkIC0+ICVkIiwgYy0+b3N0YXRlLCBuZXh0KTsKLQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IG91dHB1dCAlcyAtPiAlcyIsIGMtPnNlbGYsIG9zdGF0ZXNbYy0+b3N0YXRlXSwKLQkgICAgb3N0YXRlc1tuZXh0XSk7Ci0JYy0+b3N0YXRlID0gbmV4dDsKLX0KLQotLyoKLSAqIFNTSDEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgZXZlbnQgZnVuY3Rpb25zCi0gKi8KLQotc3RhdGljIHZvaWQKLWNoYW5fcmN2ZF9vY2xvc2UxKENoYW5uZWwgKmMpCi17Ci0JZGVidWcyKCJjaGFubmVsICVkOiByY3ZkIG9jbG9zZSIsIGMtPnNlbGYpOwotCXN3aXRjaCAoYy0+aXN0YXRlKSB7Ci0JY2FzZSBDSEFOX0lOUFVUX1dBSVRfT0NMT1NFOgotCQljaGFuX3NldF9pc3RhdGUoYywgQ0hBTl9JTlBVVF9DTE9TRUQpOwotCQlicmVhazsKLQljYXNlIENIQU5fSU5QVVRfT1BFTjoKLQkJY2hhbl9zaHV0ZG93bl9yZWFkKGMpOwotCQljaGFuX3NlbmRfaWVvZjEoYyk7Ci0JCWNoYW5fc2V0X2lzdGF0ZShjLCBDSEFOX0lOUFVUX0NMT1NFRCk7Ci0JCWJyZWFrOwotCWNhc2UgQ0hBTl9JTlBVVF9XQUlUX0RSQUlOOgotCQkvKiBib3RoIGxvY2FsIHJlYWRfZmFpbGVkIGFuZCByZW1vdGUgd3JpdGVfZmFpbGVkICAqLwotCQljaGFuX3NlbmRfaWVvZjEoYyk7Ci0JCWNoYW5fc2V0X2lzdGF0ZShjLCBDSEFOX0lOUFVUX0NMT1NFRCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycm9yKCJjaGFubmVsICVkOiBwcm90b2NvbCBlcnJvcjogcmN2ZF9vY2xvc2UgZm9yIGlzdGF0ZSAlZCIsCi0JCSAgICBjLT5zZWxmLCBjLT5pc3RhdGUpOwotCQlyZXR1cm47Ci0JfQotfQotdm9pZAotY2hhbl9yZWFkX2ZhaWxlZChDaGFubmVsICpjKQotewotCWRlYnVnMigiY2hhbm5lbCAlZDogcmVhZCBmYWlsZWQiLCBjLT5zZWxmKTsKLQlzd2l0Y2ggKGMtPmlzdGF0ZSkgewotCWNhc2UgQ0hBTl9JTlBVVF9PUEVOOgotCQljaGFuX3NodXRkb3duX3JlYWQoYyk7Ci0JCWNoYW5fc2V0X2lzdGF0ZShjLCBDSEFOX0lOUFVUX1dBSVRfRFJBSU4pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQllcnJvcigiY2hhbm5lbCAlZDogY2hhbl9yZWFkX2ZhaWxlZCBmb3IgaXN0YXRlICVkIiwKLQkJICAgIGMtPnNlbGYsIGMtPmlzdGF0ZSk7Ci0JCWJyZWFrOwotCX0KLX0KLXZvaWQKLWNoYW5faWJ1Zl9lbXB0eShDaGFubmVsICpjKQotewotCWRlYnVnMigiY2hhbm5lbCAlZDogaWJ1ZiBlbXB0eSIsIGMtPnNlbGYpOwotCWlmIChidWZmZXJfbGVuKCZjLT5pbnB1dCkpIHsKLQkJZXJyb3IoImNoYW5uZWwgJWQ6IGNoYW5faWJ1Zl9lbXB0eSBmb3Igbm9uIGVtcHR5IGJ1ZmZlciIsCi0JCSAgICBjLT5zZWxmKTsKLQkJcmV0dXJuOwotCX0KLQlzd2l0Y2ggKGMtPmlzdGF0ZSkgewotCWNhc2UgQ0hBTl9JTlBVVF9XQUlUX0RSQUlOOgotCQlpZiAoY29tcGF0MjApIHsKLQkJCWlmICghKGMtPmZsYWdzICYgKENIQU5fQ0xPU0VfU0VOVHxDSEFOX0xPQ0FMKSkpCi0JCQkJY2hhbl9zZW5kX2VvZjIoYyk7Ci0JCQljaGFuX3NldF9pc3RhdGUoYywgQ0hBTl9JTlBVVF9DTE9TRUQpOwotCQl9IGVsc2UgewotCQkJY2hhbl9zZW5kX2llb2YxKGMpOwotCQkJY2hhbl9zZXRfaXN0YXRlKGMsIENIQU5fSU5QVVRfV0FJVF9PQ0xPU0UpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycm9yKCJjaGFubmVsICVkOiBjaGFuX2lidWZfZW1wdHkgZm9yIGlzdGF0ZSAlZCIsCi0JCSAgICBjLT5zZWxmLCBjLT5pc3RhdGUpOwotCQlicmVhazsKLQl9Ci19Ci1zdGF0aWMgdm9pZAotY2hhbl9yY3ZkX2llb2YxKENoYW5uZWwgKmMpCi17Ci0JZGVidWcyKCJjaGFubmVsICVkOiByY3ZkIGllb2YiLCBjLT5zZWxmKTsKLQlzd2l0Y2ggKGMtPm9zdGF0ZSkgewotCWNhc2UgQ0hBTl9PVVRQVVRfT1BFTjoKLQkJY2hhbl9zZXRfb3N0YXRlKGMsIENIQU5fT1VUUFVUX1dBSVRfRFJBSU4pOwotCQlicmVhazsKLQljYXNlIENIQU5fT1VUUFVUX1dBSVRfSUVPRjoKLQkJY2hhbl9zZXRfb3N0YXRlKGMsIENIQU5fT1VUUFVUX0NMT1NFRCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycm9yKCJjaGFubmVsICVkOiBwcm90b2NvbCBlcnJvcjogcmN2ZF9pZW9mIGZvciBvc3RhdGUgJWQiLAotCQkgICAgYy0+c2VsZiwgYy0+b3N0YXRlKTsKLQkJYnJlYWs7Ci0JfQotfQotc3RhdGljIHZvaWQKLWNoYW5fd3JpdGVfZmFpbGVkMShDaGFubmVsICpjKQotewotCWRlYnVnMigiY2hhbm5lbCAlZDogd3JpdGUgZmFpbGVkIiwgYy0+c2VsZik7Ci0Jc3dpdGNoIChjLT5vc3RhdGUpIHsKLQljYXNlIENIQU5fT1VUUFVUX09QRU46Ci0JCWNoYW5fc2h1dGRvd25fd3JpdGUoYyk7Ci0JCWNoYW5fc2VuZF9vY2xvc2UxKGMpOwotCQljaGFuX3NldF9vc3RhdGUoYywgQ0hBTl9PVVRQVVRfV0FJVF9JRU9GKTsKLQkJYnJlYWs7Ci0JY2FzZSBDSEFOX09VVFBVVF9XQUlUX0RSQUlOOgotCQljaGFuX3NodXRkb3duX3dyaXRlKGMpOwotCQljaGFuX3NlbmRfb2Nsb3NlMShjKTsKLQkJY2hhbl9zZXRfb3N0YXRlKGMsIENIQU5fT1VUUFVUX0NMT1NFRCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycm9yKCJjaGFubmVsICVkOiBjaGFuX3dyaXRlX2ZhaWxlZCBmb3Igb3N0YXRlICVkIiwKLQkJICAgIGMtPnNlbGYsIGMtPm9zdGF0ZSk7Ci0JCWJyZWFrOwotCX0KLX0KLXZvaWQKLWNoYW5fb2J1Zl9lbXB0eShDaGFubmVsICpjKQotewotCWRlYnVnMigiY2hhbm5lbCAlZDogb2J1ZiBlbXB0eSIsIGMtPnNlbGYpOwotCWlmIChidWZmZXJfbGVuKCZjLT5vdXRwdXQpKSB7Ci0JCWVycm9yKCJjaGFubmVsICVkOiBjaGFuX29idWZfZW1wdHkgZm9yIG5vbiBlbXB0eSBidWZmZXIiLAotCQkgICAgYy0+c2VsZik7Ci0JCXJldHVybjsKLQl9Ci0Jc3dpdGNoIChjLT5vc3RhdGUpIHsKLQljYXNlIENIQU5fT1VUUFVUX1dBSVRfRFJBSU46Ci0JCWNoYW5fc2h1dGRvd25fd3JpdGUoYyk7Ci0JCWlmICghY29tcGF0MjApCi0JCQljaGFuX3NlbmRfb2Nsb3NlMShjKTsKLQkJY2hhbl9zZXRfb3N0YXRlKGMsIENIQU5fT1VUUFVUX0NMT1NFRCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycm9yKCJjaGFubmVsICVkOiBpbnRlcm5hbCBlcnJvcjogb2J1Zl9lbXB0eSBmb3Igb3N0YXRlICVkIiwKLQkJICAgIGMtPnNlbGYsIGMtPm9zdGF0ZSk7Ci0JCWJyZWFrOwotCX0KLX0KLXN0YXRpYyB2b2lkCi1jaGFuX3NlbmRfaWVvZjEoQ2hhbm5lbCAqYykKLXsKLQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHNlbmQgaWVvZiIsIGMtPnNlbGYpOwotCXN3aXRjaCAoYy0+aXN0YXRlKSB7Ci0JY2FzZSBDSEFOX0lOUFVUX09QRU46Ci0JY2FzZSBDSEFOX0lOUFVUX1dBSVRfRFJBSU46Ci0JCXBhY2tldF9zdGFydChTU0hfTVNHX0NIQU5ORUxfSU5QVVRfRU9GKTsKLQkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKLQkJcGFja2V0X3NlbmQoKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyb3IoImNoYW5uZWwgJWQ6IGNhbm5vdCBzZW5kIGllb2YgZm9yIGlzdGF0ZSAlZCIsCi0JCSAgICBjLT5zZWxmLCBjLT5pc3RhdGUpOwotCQlicmVhazsKLQl9Ci19Ci1zdGF0aWMgdm9pZAotY2hhbl9zZW5kX29jbG9zZTEoQ2hhbm5lbCAqYykKLXsKLQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IHNlbmQgb2Nsb3NlIiwgYy0+c2VsZik7Ci0Jc3dpdGNoIChjLT5vc3RhdGUpIHsKLQljYXNlIENIQU5fT1VUUFVUX09QRU46Ci0JY2FzZSBDSEFOX09VVFBVVF9XQUlUX0RSQUlOOgotCQlidWZmZXJfY2xlYXIoJmMtPm91dHB1dCk7Ci0JCXBhY2tldF9zdGFydChTU0hfTVNHX0NIQU5ORUxfT1VUUFVUX0NMT1NFKTsKLQkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKLQkJcGFja2V0X3NlbmQoKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyb3IoImNoYW5uZWwgJWQ6IGNhbm5vdCBzZW5kIG9jbG9zZSBmb3Igb3N0YXRlICVkIiwKLQkJICAgIGMtPnNlbGYsIGMtPm9zdGF0ZSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqIHRoZSBzYW1lIGZvciBTU0gyCi0gKi8KLXN0YXRpYyB2b2lkCi1jaGFuX3JjdmRfY2xvc2UyKENoYW5uZWwgKmMpCi17Ci0JZGVidWcyKCJjaGFubmVsICVkOiByY3ZkIGNsb3NlIiwgYy0+c2VsZik7Ci0JaWYgKCEoYy0+ZmxhZ3MgJiBDSEFOX0xPQ0FMKSkgewotCQlpZiAoYy0+ZmxhZ3MgJiBDSEFOX0NMT1NFX1JDVkQpCi0JCQllcnJvcigiY2hhbm5lbCAlZDogcHJvdG9jb2wgZXJyb3I6IGNsb3NlIHJjdmQgdHdpY2UiLAotCQkJICAgIGMtPnNlbGYpOwotCQljLT5mbGFncyB8PSBDSEFOX0NMT1NFX1JDVkQ7Ci0JfQotCWlmIChjLT50eXBlID09IFNTSF9DSEFOTkVMX0xBUlZBTCkgewotCQkvKiB0ZWFyIGRvd24gbGFydmFsIGNoYW5uZWxzIGltbWVkaWF0ZWx5ICovCi0JCWNoYW5fc2V0X29zdGF0ZShjLCBDSEFOX09VVFBVVF9DTE9TRUQpOwotCQljaGFuX3NldF9pc3RhdGUoYywgQ0hBTl9JTlBVVF9DTE9TRUQpOwotCQlyZXR1cm47Ci0JfQotCXN3aXRjaCAoYy0+b3N0YXRlKSB7Ci0JY2FzZSBDSEFOX09VVFBVVF9PUEVOOgotCQkvKgotCQkgKiB3YWl0IHVudGlsIGEgZGF0YSBmcm9tIHRoZSBjaGFubmVsIGlzIGNvbnN1bWVkIGlmIGEgQ0xPU0UKLQkJICogaXMgcmVjZWl2ZWQKLQkJICovCi0JCWNoYW5fc2V0X29zdGF0ZShjLCBDSEFOX09VVFBVVF9XQUlUX0RSQUlOKTsKLQkJYnJlYWs7Ci0JfQotCXN3aXRjaCAoYy0+aXN0YXRlKSB7Ci0JY2FzZSBDSEFOX0lOUFVUX09QRU46Ci0JCWNoYW5fc2h1dGRvd25fcmVhZChjKTsKLQkJY2hhbl9zZXRfaXN0YXRlKGMsIENIQU5fSU5QVVRfQ0xPU0VEKTsKLQkJYnJlYWs7Ci0JY2FzZSBDSEFOX0lOUFVUX1dBSVRfRFJBSU46Ci0JCWlmICghKGMtPmZsYWdzICYgQ0hBTl9MT0NBTCkpCi0JCQljaGFuX3NlbmRfZW9mMihjKTsKLQkJY2hhbl9zZXRfaXN0YXRlKGMsIENIQU5fSU5QVVRfQ0xPU0VEKTsKLQkJYnJlYWs7Ci0JfQotfQotCi12b2lkCi1jaGFuX3JjdmRfZW93KENoYW5uZWwgKmMpCi17Ci0JZGVidWcyKCJjaGFubmVsICVkOiByY3ZkIGVvdyIsIGMtPnNlbGYpOwotCXN3aXRjaCAoYy0+aXN0YXRlKSB7Ci0JY2FzZSBDSEFOX0lOUFVUX09QRU46Ci0JCWNoYW5fc2h1dGRvd25fcmVhZChjKTsKLQkJY2hhbl9zZXRfaXN0YXRlKGMsIENIQU5fSU5QVVRfQ0xPU0VEKTsKLQkJYnJlYWs7Ci0JfQotfQotc3RhdGljIHZvaWQKLWNoYW5fcmN2ZF9lb2YyKENoYW5uZWwgKmMpCi17Ci0JZGVidWcyKCJjaGFubmVsICVkOiByY3ZkIGVvZiIsIGMtPnNlbGYpOwotCWMtPmZsYWdzIHw9IENIQU5fRU9GX1JDVkQ7Ci0JaWYgKGMtPm9zdGF0ZSA9PSBDSEFOX09VVFBVVF9PUEVOKQotCQljaGFuX3NldF9vc3RhdGUoYywgQ0hBTl9PVVRQVVRfV0FJVF9EUkFJTik7Ci19Ci1zdGF0aWMgdm9pZAotY2hhbl93cml0ZV9mYWlsZWQyKENoYW5uZWwgKmMpCi17Ci0JZGVidWcyKCJjaGFubmVsICVkOiB3cml0ZSBmYWlsZWQiLCBjLT5zZWxmKTsKLQlzd2l0Y2ggKGMtPm9zdGF0ZSkgewotCWNhc2UgQ0hBTl9PVVRQVVRfT1BFTjoKLQljYXNlIENIQU5fT1VUUFVUX1dBSVRfRFJBSU46Ci0JCWNoYW5fc2h1dGRvd25fd3JpdGUoYyk7Ci0JCWlmIChzdHJjbXAoYy0+Y3R5cGUsICJzZXNzaW9uIikgPT0gMCkKLQkJCWNoYW5fc2VuZF9lb3cyKGMpOwotCQljaGFuX3NldF9vc3RhdGUoYywgQ0hBTl9PVVRQVVRfQ0xPU0VEKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyb3IoImNoYW5uZWwgJWQ6IGNoYW5fd3JpdGVfZmFpbGVkIGZvciBvc3RhdGUgJWQiLAotCQkgICAgYy0+c2VsZiwgYy0+b3N0YXRlKTsKLQkJYnJlYWs7Ci0JfQotfQotc3RhdGljIHZvaWQKLWNoYW5fc2VuZF9lb2YyKENoYW5uZWwgKmMpCi17Ci0JZGVidWcyKCJjaGFubmVsICVkOiBzZW5kIGVvZiIsIGMtPnNlbGYpOwotCXN3aXRjaCAoYy0+aXN0YXRlKSB7Ci0JY2FzZSBDSEFOX0lOUFVUX1dBSVRfRFJBSU46Ci0JCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX0VPRik7Ci0JCXBhY2tldF9wdXRfaW50KGMtPnJlbW90ZV9pZCk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JCWMtPmZsYWdzIHw9IENIQU5fRU9GX1NFTlQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycm9yKCJjaGFubmVsICVkOiBjYW5ub3Qgc2VuZCBlb2YgZm9yIGlzdGF0ZSAlZCIsCi0JCSAgICBjLT5zZWxmLCBjLT5pc3RhdGUpOwotCQlicmVhazsKLQl9Ci19Ci1zdGF0aWMgdm9pZAotY2hhbl9zZW5kX2Nsb3NlMihDaGFubmVsICpjKQotewotCWRlYnVnMigiY2hhbm5lbCAlZDogc2VuZCBjbG9zZSIsIGMtPnNlbGYpOwotCWlmIChjLT5vc3RhdGUgIT0gQ0hBTl9PVVRQVVRfQ0xPU0VEIHx8Ci0JICAgIGMtPmlzdGF0ZSAhPSBDSEFOX0lOUFVUX0NMT1NFRCkgewotCQllcnJvcigiY2hhbm5lbCAlZDogY2Fubm90IHNlbmQgY2xvc2UgZm9yIGlzdGF0ZS9vc3RhdGUgJWQvJWQiLAotCQkgICAgYy0+c2VsZiwgYy0+aXN0YXRlLCBjLT5vc3RhdGUpOwotCX0gZWxzZSBpZiAoYy0+ZmxhZ3MgJiBDSEFOX0NMT1NFX1NFTlQpIHsKLQkJZXJyb3IoImNoYW5uZWwgJWQ6IGFscmVhZHkgc2VudCBjbG9zZSIsIGMtPnNlbGYpOwotCX0gZWxzZSB7Ci0JCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX0NMT1NFKTsKLQkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKLQkJcGFja2V0X3NlbmQoKTsKLQkJYy0+ZmxhZ3MgfD0gQ0hBTl9DTE9TRV9TRU5UOwotCX0KLX0KLXN0YXRpYyB2b2lkCi1jaGFuX3NlbmRfZW93MihDaGFubmVsICpjKQotewotCWRlYnVnMigiY2hhbm5lbCAlZDogc2VuZCBlb3ciLCBjLT5zZWxmKTsKLQlpZiAoYy0+b3N0YXRlID09IENIQU5fT1VUUFVUX0NMT1NFRCkgewotCQllcnJvcigiY2hhbm5lbCAlZDogbXVzdCBub3Qgc2VudCBlb3cgb24gY2xvc2VkIG91dHB1dCIsCi0JCSAgICBjLT5zZWxmKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoIShkYXRhZmVsbG93cyAmIFNTSF9ORVdfT1BFTlNTSCkpCi0JCXJldHVybjsKLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfQ0hBTk5FTF9SRVFVRVNUKTsKLQlwYWNrZXRfcHV0X2ludChjLT5yZW1vdGVfaWQpOwotCXBhY2tldF9wdXRfY3N0cmluZygiZW93QG9wZW5zc2guY29tIik7Ci0JcGFja2V0X3B1dF9jaGFyKDApOwotCXBhY2tldF9zZW5kKCk7Ci19Ci0KLS8qIHNoYXJlZCAqLwotCi12b2lkCi1jaGFuX3JjdmRfaWVvZihDaGFubmVsICpjKQotewotCWlmIChjb21wYXQyMCkKLQkJY2hhbl9yY3ZkX2VvZjIoYyk7Ci0JZWxzZQotCQljaGFuX3JjdmRfaWVvZjEoYyk7Ci0JaWYgKGMtPm9zdGF0ZSA9PSBDSEFOX09VVFBVVF9XQUlUX0RSQUlOICYmCi0JICAgIGJ1ZmZlcl9sZW4oJmMtPm91dHB1dCkgPT0gMCAmJgotCSAgICAhQ0hBTk5FTF9FRkRfT1VUUFVUX0FDVElWRShjKSkKLQkJY2hhbl9vYnVmX2VtcHR5KGMpOwotfQotdm9pZAotY2hhbl9yY3ZkX29jbG9zZShDaGFubmVsICpjKQotewotCWlmIChjb21wYXQyMCkKLQkJY2hhbl9yY3ZkX2Nsb3NlMihjKTsKLQllbHNlCi0JCWNoYW5fcmN2ZF9vY2xvc2UxKGMpOwotfQotdm9pZAotY2hhbl93cml0ZV9mYWlsZWQoQ2hhbm5lbCAqYykKLXsKLQlpZiAoY29tcGF0MjApCi0JCWNoYW5fd3JpdGVfZmFpbGVkMihjKTsKLQllbHNlCi0JCWNoYW5fd3JpdGVfZmFpbGVkMShjKTsKLX0KLQotdm9pZAotY2hhbl9tYXJrX2RlYWQoQ2hhbm5lbCAqYykKLXsKLQljLT50eXBlID0gU1NIX0NIQU5ORUxfWk9NQklFOwotfQotCi1pbnQKLWNoYW5faXNfZGVhZChDaGFubmVsICpjLCBpbnQgZG9fc2VuZCkKLXsKLQlpZiAoYy0+dHlwZSA9PSBTU0hfQ0hBTk5FTF9aT01CSUUpIHsKLQkJZGVidWcyKCJjaGFubmVsICVkOiB6b21iaWUiLCBjLT5zZWxmKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChjLT5pc3RhdGUgIT0gQ0hBTl9JTlBVVF9DTE9TRUQgfHwgYy0+b3N0YXRlICE9IENIQU5fT1VUUFVUX0NMT1NFRCkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFjb21wYXQyMCkgewotCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGlzIGRlYWQiLCBjLT5zZWxmKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICgoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX0VYVEVPRikgJiYKLQkgICAgYy0+ZXh0ZW5kZWRfdXNhZ2UgPT0gQ0hBTl9FWFRFTkRFRF9XUklURSAmJgotCSAgICBjLT5lZmQgIT0gLTEgJiYKLQkgICAgYnVmZmVyX2xlbigmYy0+ZXh0ZW5kZWQpID4gMCkgewotCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGFjdGl2ZSBlZmQ6ICVkIGxlbiAlZCIsCi0JCSAgICBjLT5zZWxmLCBjLT5lZmQsIGJ1ZmZlcl9sZW4oJmMtPmV4dGVuZGVkKSk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoYy0+ZmxhZ3MgJiBDSEFOX0xPQ0FMKSB7Ci0JCWRlYnVnMigiY2hhbm5lbCAlZDogaXMgZGVhZCAobG9jYWwpIiwgYy0+c2VsZik7Ci0JCXJldHVybiAxOwotCX0JCQotCWlmICghKGMtPmZsYWdzICYgQ0hBTl9DTE9TRV9TRU5UKSkgewotCQlpZiAoZG9fc2VuZCkgewotCQkJY2hhbl9zZW5kX2Nsb3NlMihjKTsKLQkJfSBlbHNlIHsKLQkJCS8qIGNoYW5uZWwgd291bGQgYmUgZGVhZCBpZiB3ZSBzZW50IGEgY2xvc2UgKi8KLQkJCWlmIChjLT5mbGFncyAmIENIQU5fQ0xPU0VfUkNWRCkgewotCQkJCWRlYnVnMigiY2hhbm5lbCAlZDogYWxtb3N0IGRlYWQiLAotCQkJCSAgICBjLT5zZWxmKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoKGMtPmZsYWdzICYgQ0hBTl9DTE9TRV9TRU5UKSAmJgotCSAgICAoYy0+ZmxhZ3MgJiBDSEFOX0NMT1NFX1JDVkQpKSB7Ci0JCWRlYnVnMigiY2hhbm5lbCAlZDogaXMgZGVhZCIsIGMtPnNlbGYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGhlbHBlciAqLwotc3RhdGljIHZvaWQKLWNoYW5fc2h1dGRvd25fd3JpdGUoQ2hhbm5lbCAqYykKLXsKLQlidWZmZXJfY2xlYXIoJmMtPm91dHB1dCk7Ci0JaWYgKGNvbXBhdDIwICYmIGMtPnR5cGUgPT0gU1NIX0NIQU5ORUxfTEFSVkFMKQotCQlyZXR1cm47Ci0JLyogc2h1dGRvd24gZmFpbHVyZSBpcyBhbGxvd2VkIGlmIHdyaXRlIGZhaWxlZCBhbHJlYWR5ICovCi0JZGVidWcyKCJjaGFubmVsICVkOiBjbG9zZV93cml0ZSIsIGMtPnNlbGYpOwotCWlmIChjLT5zb2NrICE9IC0xKSB7Ci0JCWlmIChzaHV0ZG93bihjLT5zb2NrLCBTSFVUX1dSKSA8IDApCi0JCQlkZWJ1ZzIoImNoYW5uZWwgJWQ6IGNoYW5fc2h1dGRvd25fd3JpdGU6ICIKLQkJCSAgICAic2h1dGRvd24oKSBmYWlsZWQgZm9yIGZkICVkOiAlLjEwMHMiLAotCQkJICAgIGMtPnNlbGYsIGMtPnNvY2ssIHN0cmVycm9yKGVycm5vKSk7Ci0JfSBlbHNlIHsKLQkJaWYgKGNoYW5uZWxfY2xvc2VfZmQoJmMtPndmZCkgPCAwKQotCQkJbG9naXQoImNoYW5uZWwgJWQ6IGNoYW5fc2h1dGRvd25fd3JpdGU6ICIKLQkJCSAgICAiY2xvc2UoKSBmYWlsZWQgZm9yIGZkICVkOiAlLjEwMHMiLAotCQkJICAgIGMtPnNlbGYsIGMtPndmZCwgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci19Ci1zdGF0aWMgdm9pZAotY2hhbl9zaHV0ZG93bl9yZWFkKENoYW5uZWwgKmMpCi17Ci0JaWYgKGNvbXBhdDIwICYmIGMtPnR5cGUgPT0gU1NIX0NIQU5ORUxfTEFSVkFMKQotCQlyZXR1cm47Ci0JZGVidWcyKCJjaGFubmVsICVkOiBjbG9zZV9yZWFkIiwgYy0+c2VsZik7Ci0JaWYgKGMtPnNvY2sgIT0gLTEpIHsKLQkJLyoKLQkJICogc2h1dGRvd24oc29jaywgU0hVVF9SRUFEKSBtYXkgcmV0dXJuIEVOT1RDT05OIGlmIHRoZQotCQkgKiB3cml0ZSBzaWRlIGhhcyBiZWVuIGNsb3NlZCBhbHJlYWR5LiAoYnVnIG9uIExpbnV4KQotCQkgKiBIUC1VWCBtYXkgcmV0dXJuIEVOT1RDT05OIGFsc28uCi0JCSAqLwotCQlpZiAoc2h1dGRvd24oYy0+c29jaywgU0hVVF9SRCkgPCAwCi0JCSAgICAmJiBlcnJubyAhPSBFTk9UQ09OTikKLQkJCWVycm9yKCJjaGFubmVsICVkOiBjaGFuX3NodXRkb3duX3JlYWQ6ICIKLQkJCSAgICAic2h1dGRvd24oKSBmYWlsZWQgZm9yIGZkICVkIFtpJWQgbyVkXTogJS4xMDBzIiwKLQkJCSAgICBjLT5zZWxmLCBjLT5zb2NrLCBjLT5pc3RhdGUsIGMtPm9zdGF0ZSwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCX0gZWxzZSB7Ci0JCWlmIChjaGFubmVsX2Nsb3NlX2ZkKCZjLT5yZmQpIDwgMCkKLQkJCWxvZ2l0KCJjaGFubmVsICVkOiBjaGFuX3NodXRkb3duX3JlYWQ6ICIKLQkJCSAgICAiY2xvc2UoKSBmYWlsZWQgZm9yIGZkICVkOiAlLjEwMHMiLAotCQkJICAgIGMtPnNlbGYsIGMtPnJmZCwgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9uY2hhbi5tcyBiL25jaGFuLm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzU3NjAxLi4wMDAwMDAwCi0tLSBhL25jaGFuLm1zCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLlwiCSRPcGVuQlNEOiBuY2hhbi5tcyx2IDEuOCAyMDAzLzExLzIxIDExOjU3OjAzIGRqbSBFeHAgJAotLlwiCi0uXCIKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTkgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLS5cIiBhcmUgbWV0OgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotLlwiIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLS5cIiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotLlwiIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLS5cIiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLS5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0uXCIgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0uXCIgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLlwiIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotLlwiIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIKLS5UTAotT3BlblNTSCBDaGFubmVsIENsb3NlIFByb3RvY29sIDEuNSBJbXBsZW1lbnRhdGlvbgotLlNICi1DaGFubmVsIElucHV0IFN0YXRlIERpYWdyYW0KLS5QUwotcmVzZXQKLWw9MQotcz0xLjIKLWVsbGlwc2V3aWQ9cyplbGxpcHNld2lkCi1ib3h3aWQ9cypib3h3aWQKLWVsbGlwc2VodD1zKmVsbGlwc2VodAotUzE6IGVsbGlwc2UgIklOUFVUIiAiT1BFTiIKLW1vdmUgcmlnaHQgMipsIGZyb20gbGFzdCBlbGxpcHNlLmUKLVM0OiBlbGxpcHNlICJJTlBVVCIgIkNMT1NFRCIKLW1vdmUgZG93biBsIGZyb20gbGFzdCBlbGxpcHNlLnMKLVMzOiBlbGxpcHNlICJJTlBVVCIgIldBSVQiICJPQ0xPU0VEIgotbW92ZSBkb3duIGwgZnJvbSAxc3QgZWxsaXBzZS5zCi1TMjogZWxsaXBzZSAiSU5QVVQiICJXQUlUIiAiRFJBSU4iCi1hcnJvdyAiIiAicmN2ZCBPQ0xPU0UvIiAic2h1dGRvd25fcmVhZCIgInNlbmQgSUVPRiIgZnJvbSBTMS5lIHRvIFM0LncKLWFycm93ICJpYnVmX2VtcHR5LyIgInNlbmQgSUVPRiIgZnJvbSBTMi5lIHRvIFMzLncKLWFycm93IGZyb20gUzEucyB0byBTMi5uCi1ib3ggaW52aXMgInJlYWRfZmFpbGVkLyIgInNodXRkb3duX3JlYWQiIHdpdGggLmUgYXQgbGFzdCBhcnJvdy5jCi1hcnJvdyAgZnJvbSBTMy5uIHRvIFM0LnMKLWJveCBpbnZpcyAicmN2ZCBPQ0xPU0UvIiAiLSIgd2l0aCAudyBhdCBsYXN0IGFycm93LmMKLWVsbGlwc2Ugd2lkIC45KmVsbGlwc2V3aWQgaHQgLjkqZWxsaXBzZWh0IGF0IFM0Ci1hcnJvdyAic3RhcnQiICIiIGZyb20gUzEudysoLTAuNSwwKSB0byBTMS53Ci1hcnJvdyBmcm9tIFMyLm5lIHRvIFM0LnN3Ci1ib3ggaW52aXMgInJjdmQgT0NMT1NFLyAgICAgIiB3aXRoIC5lIGF0IGxhc3QgYXJyb3cuYwotYm94IGludmlzICIgc2VuZCBJRU9GIiB3aXRoIC53IGF0IGxhc3QgYXJyb3cuYwotLlBFCi0uU0gKLUNoYW5uZWwgT3V0cHV0IFN0YXRlIERpYWdyYW0KLS5QUwotUzE6IGVsbGlwc2UgIk9VVFBVVCIgIk9QRU4iCi1tb3ZlIHJpZ2h0IDIqbCBmcm9tIGxhc3QgZWxsaXBzZS5lCi1TMzogZWxsaXBzZSAiT1VUUFVUIiAiV0FJVCIgIklFT0YiCi1tb3ZlIGRvd24gbCBmcm9tIGxhc3QgZWxsaXBzZS5zCi1TNDogZWxsaXBzZSAiT1VUUFVUIiAiQ0xPU0VEIgotbW92ZSBkb3duIGwgZnJvbSAxc3QgZWxsaXBzZS5zCi1TMjogZWxsaXBzZSAiT1VUUFVUIiAiV0FJVCIgIkRSQUlOIgotYXJyb3cgIiIgIndyaXRlX2ZhaWxlZC8iICJzaHV0ZG93bl93cml0ZSIgInNlbmQgT0NMT1NFIiBmcm9tIFMxLmUgdG8gUzMudwotYXJyb3cgIm9idWZfZW1wdHkgfHwiICJ3cml0ZV9mYWlsZWQvIiAic2h1dGRvd25fd3JpdGUiICJzZW5kIE9DTE9TRSIgZnJvbSBTMi5lIHRvIFM0LncKLWFycm93IGZyb20gUzEucyB0byBTMi5uCi1ib3ggaW52aXMgInJjdmQgSUVPRi8iICItIiB3aXRoIC5lIGF0IGxhc3QgYXJyb3cuYwotYXJyb3cgZnJvbSBTMy5zIHRvIFM0Lm4KLWJveCBpbnZpcyAicmN2ZCBJRU9GLyIgIi0iIHdpdGggLncgYXQgbGFzdCBhcnJvdy5jCi1lbGxpcHNlIHdpZCAuOSplbGxpcHNld2lkIGh0IC45KmVsbGlwc2VodCBhdCBTNAotYXJyb3cgInN0YXJ0IiAiIiBmcm9tIFMxLncrKC0wLjUsMCkgdG8gUzEudwotLlBFCi0uU0gKLU5vdGVzCi0uUFAKLVRoZSBpbnB1dCBidWZmZXIgaXMgZmlsbGVkIHdpdGggZGF0YSBmcm9tIHRoZSBzb2NrZXQKLSh0aGUgc29ja2V0IHJlcHJlc2VudHMgdGhlIGxvY2FsIGNvbnN1bWVyL3Byb2R1Y2VyIG9mIHRoZQotZm9yd2FyZGVkIGNoYW5uZWwpLgotVGhlIGRhdGEgaXMgdGhlbiBzZW50IG92ZXIgdGhlIElOUFVULWVuZCAodHJhbnNtaXQtZW5kKSBvZiB0aGUgY2hhbm5lbCB0byB0aGUKLXJlbW90ZSBwZWVyLgotRGF0YSBzZW50IGJ5IHRoZSBwZWVyIGlzIHJlY2VpdmVkIG9uIHRoZSBPVVRQVVQtZW5kIChyZWNlaXZlLWVuZCksCi1zYXZlZCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgd3JpdHRlbiB0byB0aGUgc29ja2V0LgotLlBQCi1JZiB0aGUgbG9jYWwgcHJvdG9jb2wgaW5zdGFuY2UgaGFzIGZvcndhcmRlZCBhbGwgZGF0YSBvbiB0aGUKLUlOUFVULWVuZCBvZiB0aGUgY2hhbm5lbCwgaXQgc2VuZHMgYW4gSUVPRiBtZXNzYWdlIHRvIHRoZSBwZWVyLgotSWYgdGhlIHBlZXIgcmVjZWl2ZXMgdGhlIElFT0YgYW5kIGhhcyBjb25zdW1lZCBhbGwKLWRhdGEgaGUgcmVwbGllcyB3aXRoIGFuIE9DTE9TRS4KLVdoZW4gdGhlIGxvY2FsIGluc3RhbmNlIHJlY2VpdmVzIHRoZSBPQ0xPU0UKLWhlIGNvbnNpZGVycyB0aGUgSU5QVVQtaGFsZiBvZiB0aGUgY2hhbm5lbCBjbG9zZWQuCi1UaGUgcGVlciBoYXMgaGlzIE9VVE9VVC1oYWxmIGNsb3NlZC4KLS5QUAotQSBjaGFubmVsIGNhbiBiZSBkZWFsbG9jYXRlZCBieSBhIHByb3RvY29sIGluc3RhbmNlCi1pZiBib3RoIHRoZSBJTlBVVC0gYW5kIHRoZSBPVVRPVVQtaGFsZiBvbiBoaXMKLXNpZGUgb2YgdGhlIGNoYW5uZWwgYXJlIGNsb3NlZC4KLU5vdGUgdGhhdCB3aGVuIGFuIGluc3RhbmNlIGlzIHVuYWJsZSB0byBjb25zdW1lIHRoZQotcmVjZWl2ZWQgZGF0YSwgaGUgaXMgcGVybWl0dGVkIHRvIHNlbmQgYW4gT0NMT1NFCi1iZWZvcmUgdGhlIG1hdGNoaW5nIElFT0YgaXMgcmVjZWl2ZWQuCmRpZmYgLS1naXQgYS9uY2hhbjIubXMgYi9uY2hhbjIubXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMDE1MDQuLjAwMDAwMDAKLS0tIGEvbmNoYW4yLm1zCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLlwiCSRPcGVuQlNEOiBuY2hhbjIubXMsdiAxLjQgMjAwOC8wNS8xNSAyMzo1MjoyNCBkam0gRXhwICQKLS5cIgotLlwiIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIgotLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotLlwiIGFyZSBtZXQ6Ci0uXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0uXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0uXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0uXCIgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotLlwiIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0uXCIgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotLlwiIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS5cIiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS5cIiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0uXCIgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0uXCIgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS5cIgotLlRMCi1PcGVuU1NIIENoYW5uZWwgQ2xvc2UgUHJvdG9jb2wgMi4wIEltcGxlbWVudGF0aW9uCi0uU0gKLUNoYW5uZWwgSW5wdXQgU3RhdGUgRGlhZ3JhbQotLlBTCi1yZXNldAotbD0xCi1zPTEuMgotZWxsaXBzZXdpZD1zKmVsbGlwc2V3aWQKLWJveHdpZD1zKmJveHdpZAotZWxsaXBzZWh0PXMqZWxsaXBzZWh0Ci1TMTogZWxsaXBzZSAiSU5QVVQiICJPUEVOIgotbW92ZSByaWdodCAyKmwgZnJvbSBsYXN0IGVsbGlwc2UuZQotUzM6IGVsbGlwc2UgaW52aXMKLW1vdmUgZG93biBsIGZyb20gbGFzdCBlbGxpcHNlLnMKLVM0OiBlbGxpcHNlICJJTlBVVCIgIkNMT1NFRCIKLW1vdmUgZG93biBsIGZyb20gMXN0IGVsbGlwc2UucwotUzI6IGVsbGlwc2UgIklOUFVUIiAiV0FJVCIgIkRSQUlOIgotYXJyb3cgZnJvbSBTMS5lIHRvIFM0Lm4KLWJveCBpbnZpcyAicmN2ZCBDTE9TRS8iICJzaHV0ZG93bl9yZWFkIiB3aXRoIC5zdyBhdCBsYXN0IGFycm93LmMKLWFycm93ICJpYnVmX2VtcHR5IHx8IiAicmN2ZCBDTE9TRS8iICJzZW5kIEVPRiIgIiIgZnJvbSBTMi5lIHRvIFM0LncKLWFycm93IGZyb20gUzEucyB0byBTMi5uCi1ib3ggaW52aXMgInJlYWRfZmFpbGVkIHx8IiAicmN2ZCBFT1cvIiAic2h1dGRvd25fcmVhZCIgd2l0aCAuZSBhdCBsYXN0IGFycm93LmMKLWVsbGlwc2Ugd2lkIC45KmVsbGlwc2V3aWQgaHQgLjkqZWxsaXBzZWh0IGF0IFM0Ci1hcnJvdyAic3RhcnQiICIiIGZyb20gUzEudysoLTAuNSwwKSB0byBTMS53Ci0uUEUKLS5TSAotQ2hhbm5lbCBPdXRwdXQgU3RhdGUgRGlhZ3JhbQotLlBTCi1TMTogZWxsaXBzZSAiT1VUUFVUIiAiT1BFTiIKLW1vdmUgcmlnaHQgMipsIGZyb20gbGFzdCBlbGxpcHNlLmUKLVMzOiBlbGxpcHNlIGludmlzCi1tb3ZlIGRvd24gbCBmcm9tIGxhc3QgZWxsaXBzZS5zCi1TNDogZWxsaXBzZSAiT1VUUFVUIiAiQ0xPU0VEIgotbW92ZSBkb3duIGwgZnJvbSAxc3QgZWxsaXBzZS5zCi1TMjogZWxsaXBzZSAiT1VUUFVUIiAiV0FJVCIgIkRSQUlOIgotYXJyb3cgZnJvbSBTMS5lIHRvIFM0Lm4KLWJveCBpbnZpcyAid3JpdGVfZmFpbGVkLyIgInNodXRkb3duX3dyaXRlIiAic2VuZCBFT1ciIHdpdGggLnN3IGF0IGxhc3QgYXJyb3cuYwotYXJyb3cgIm9idWZfZW1wdHkgfHwiICJ3cml0ZV9mYWlsZWQvIiAic2h1dGRvd25fd3JpdGUiICIiIGZyb20gUzIuZSB0byBTNC53Ci1hcnJvdyBmcm9tIFMxLnMgdG8gUzIubgotYm94IGludmlzICJyY3ZkIEVPRiB8fCIgInJjdmQgQ0xPU0UvIiAiLSIgd2l0aCAuZSBhdCBsYXN0IGFycm93LmMKLWVsbGlwc2Ugd2lkIC45KmVsbGlwc2V3aWQgaHQgLjkqZWxsaXBzZWh0IGF0IFM0Ci1hcnJvdyAic3RhcnQiICIiIGZyb20gUzEudysoLTAuNSwwKSB0byBTMS53Ci0uUEUKLS5TSAotTm90ZXMKLS5QUAotVGhlIGlucHV0IGJ1ZmZlciBpcyBmaWxsZWQgd2l0aCBkYXRhIGZyb20gdGhlIHNvY2tldAotKHRoZSBzb2NrZXQgcmVwcmVzZW50cyB0aGUgbG9jYWwgY29uc3VtZXIvcHJvZHVjZXIgb2YgdGhlCi1mb3J3YXJkZWQgY2hhbm5lbCkuCi1UaGUgZGF0YSBpcyB0aGVuIHNlbnQgb3ZlciB0aGUgSU5QVVQtZW5kICh0cmFuc21pdC1lbmQpIG9mIHRoZSBjaGFubmVsIHRvIHRoZQotcmVtb3RlIHBlZXIuCi1EYXRhIHNlbnQgYnkgdGhlIHBlZXIgaXMgcmVjZWl2ZWQgb24gdGhlIE9VVFBVVC1lbmQgKHJlY2VpdmUtZW5kKSwKLXNhdmVkIGluIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCB3cml0dGVuIHRvIHRoZSBzb2NrZXQuCi0uUFAKLUlmIHRoZSBsb2NhbCBwcm90b2NvbCBpbnN0YW5jZSBoYXMgZm9yd2FyZGVkIGFsbCBkYXRhIG9uIHRoZQotSU5QVVQtZW5kIG9mIHRoZSBjaGFubmVsLCBpdCBzZW5kcyBhbiBFT0YgbWVzc2FnZSB0byB0aGUgcGVlci4KLS5QUAotQSBDTE9TRSBtZXNzYWdlIGlzIHNlbnQgdG8gdGhlIHBlZXIgaWYKLWJvdGggdGhlIElOUFVULSBhbmQgdGhlIE9VVE9VVC1oYWxmIG9mIHRoZSBsb2NhbAotZW5kIG9mIHRoZSBjaGFubmVsIGFyZSBjbG9zZWQuCi0uUFAKLVRoZSBjaGFubmVsIGNhbiBiZSBkZWFsbG9jYXRlZCBieSBhIHByb3RvY29sIGluc3RhbmNlCi1pZiBhIENMT1NFIG1lc3NhZ2UgaGUgYmVlbiBib3RoIHNlbnQgYW5kIHJlY2VpdmVkLgpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvTWFrZWZpbGUuaW4gYi9vcGVuYnNkLWNvbXBhdC9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiMjJkOC4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMgJElkOiBNYWtlZmlsZS5pbix2IDEuNDYgMjAxMC8xMC8wNyAxMToxOToyNCBkam0gRXhwICQKLQotc3lzY29uZmRpcj1Ac3lzY29uZmRpckAKLXBpZGRpcj1AcGlkZGlyQAotc3JjZGlyPUBzcmNkaXJACi10b3Bfc3JjZGlyPUB0b3Bfc3JjZGlyQAotCi1WUEFUSD1Ac3JjZGlyQAotQ0M9QENDQAotTEQ9QExEQAotQ0ZMQUdTPUBDRkxBR1NACi1DUFBGTEFHUz0tSS4gLUkuLiAtSSQoc3JjZGlyKSAtSSQoc3JjZGlyKS8uLiBAQ1BQRkxBR1NAIEBERUZTQAotTElCUz1ATElCU0AKLUFSPUBBUkAKLVJBTkxJQj1AUkFOTElCQAotSU5TVEFMTD1ASU5TVEFMTEAKLUxERkxBR1M9LUwuIEBMREZMQUdTQAotCi1PUEVOQlNEPWJhc2U2NC5vIGJhc2VuYW1lLm8gYmluZHJlc3Zwb3J0Lm8gZGFlbW9uLm8gZGlybmFtZS5vIGZtdF9zY2FsZWQubyBnZXRjd2QubyBnZXRncm91cGxpc3QubyBnZXRvcHQubyBnZXRycnNldGJ5bmFtZS5vIGdsb2IubyBpbmV0X2F0b24ubyBpbmV0X250b2EubyBpbmV0X250b3AubyBta3RlbXAubyBwd2NhY2hlLm8gcmVhZHBhc3NwaHJhc2UubyByZWFscGF0aC5vIHJyZXN2cG9ydC5vIHNldGVudi5vIHNldHByb2N0aXRsZS5vIHNoYTIubyBzaWdhY3QubyBzdHJsY2F0Lm8gc3RybGNweS5vIHN0cm1vZGUubyBzdHJwdGltZS5vIHN0cnNlcC5vIHN0cnRvbnVtLm8gc3RydG9sbC5vIHN0cnRvdWwubyB0aW1pbmdzYWZlX2JjbXAubyB2aXMubwotCi1DT01QQVQ9YnNkLWFyYzRyYW5kb20ubyBic2QtYXNwcmludGYubyBic2QtY2xvc2Vmcm9tLm8gYnNkLWNyYXkubyBic2QtY3lnd2luX3V0aWwubyBic2QtZ2V0cGVlcmVpZC5vIGJzZC1taXNjLm8gYnNkLW5leHRzdGVwLm8gYnNkLW9wZW5wdHkubyBic2QtcG9sbC5vIGJzZC1zbnByaW50Zi5vIGJzZC1zdGF0dmZzLm8gYnNkLXdhaXRwaWQubyBmYWtlLXJmYzI1NTMubyBvcGVuc3NsLWNvbXBhdC5vIHhtbWFwLm8geGNyeXB0Lm8KLQotUE9SVFM9cG9ydC1haXgubyBwb3J0LWlyaXgubyBwb3J0LWxpbnV4Lm8gcG9ydC1zb2xhcmlzLm8gcG9ydC10dW4ubyBwb3J0LXV3Lm8KLQotLmMubzoKLQkkKENDKSAkKENGTEFHUykgJChDUFBGTEFHUykgLWMgJDwKLQotYWxsOiBsaWJvcGVuYnNkLWNvbXBhdC5hCi0KLSQoQ09NUEFUKTogLi4vY29uZmlnLmgKLSQoT1BFTkJTRCk6IC4uL2NvbmZpZy5oCi0kKFBPUlRTKTogLi4vY29uZmlnLmgKLQotbGlib3BlbmJzZC1jb21wYXQuYTogICQoQ09NUEFUKSAkKE9QRU5CU0QpICQoUE9SVFMpCi0JJChBUikgcnYgJEAgJChDT01QQVQpICQoT1BFTkJTRCkgJChQT1JUUykKLQkkKFJBTkxJQikgJEAKLQotY2xlYW46Ci0Jcm0gLWYgKi5vICouYSBjb3JlIAotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgKn4KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L2Jhc2U2NC5jIGIvb3BlbmJzZC1jb21wYXQvYmFzZTY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzQ2NjcuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvYmFzZTY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IGJhc2U2NC5jLHYgMS41IDIwMDYvMTAvMjEgMDk6NTU6MDMgb3R0byBFeHAgJAkqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk2IGJ5IEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJTlRFUk5FVCBTT0ZUV0FSRSBDT05TT1JUSVVNIERJU0NMQUlNUwotICogQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBJTlRFUk5FVCBTT0ZUV0FSRQotICogQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKLSAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCi0gKiBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLgotICovCi0KLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTUgYnkgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgSW5jLgotICoKLSAqIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEluYy4gKGhlcmVpbmFmdGVyIGNhbGxlZCBJQk0pIGdyYW50cwotICogcGVybWlzc2lvbiB1bmRlciBpdHMgY29weXJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcwotICogU29mdHdhcmUgd2l0aCBvciB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIGFsbCBwYXJhZ3JhcGhzIG9mIHRoaXMgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBJQk0KLSAqIG5vdCBiZSB1c2VkIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgbWFya2V0aW5nIG9mIGFueSBwcm9kdWN0IGluY29ycG9yYXRpbmcKLSAqIHRoZSBTb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJlb2YsIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IKLSAqIHBlcm1pc3Npb24uCi0gKgotICogVG8gdGhlIGV4dGVudCBpdCBoYXMgYSByaWdodCB0byBkbyBzbywgSUJNIGdyYW50cyBhbiBpbW11bml0eSBmcm9tIHN1aXQKLSAqIHVuZGVyIGl0cyBwYXRlbnRzLCBpZiBhbnksIGZvciB0aGUgdXNlLCBzYWxlIG9yIG1hbnVmYWN0dXJlIG9mIHByb2R1Y3RzIHRvCi0gKiB0aGUgZXh0ZW50IHRoYXQgc3VjaCBwcm9kdWN0cyBhcmUgdXNlZCBmb3IgcGVyZm9ybWluZyBEb21haW4gTmFtZSBTeXN0ZW0KLSAqIGR5bmFtaWMgdXBkYXRlcyBpbiBUQ1AvSVAgbmV0d29ya3MgYnkgbWVhbnMgb2YgdGhlIFNvZnR3YXJlLiAgTm8gaW1tdW5pdHkgaXMKLSAqIGdyYW50ZWQgZm9yIGFueSBwcm9kdWN0IHBlciBzZSBvciBmb3IgYW55IG90aGVyIGZ1bmN0aW9uIG9mIGFueSBwcm9kdWN0LgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBBTkQgSUJNIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQotICogUEFSVElDVUxBUiBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsCi0gKiBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgSUJNIElTIEFQUFJJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvbmV0L2Jhc2U2NC5jICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWYgKCFkZWZpbmVkKEhBVkVfQjY0X05UT1ApICYmICFkZWZpbmVkKEhBVkVfX19CNjRfTlRPUCkpIHx8ICghZGVmaW5lZChIQVZFX0I2NF9QVE9OKSAmJiAhZGVmaW5lZChIQVZFX19fQjY0X1BUT04pKQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYmFzZTY0LmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyIEJhc2U2NFtdID0KLQkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7Ci1zdGF0aWMgY29uc3QgY2hhciBQYWQ2NCA9ICc9JzsKLQotLyogKEZyb20gUkZDMTUyMSBhbmQgZHJhZnQtaWV0Zi1kbnNzZWMtc2VjZXh0LTAzLnR4dCkKLSAgIFRoZSBmb2xsb3dpbmcgZW5jb2RpbmcgdGVjaG5pcXVlIGlzIHRha2VuIGZyb20gUkZDIDE1MjEgYnkgQm9yZW5zdGVpbgotICAgYW5kIEZyZWVkLiAgSXQgaXMgcmVwcm9kdWNlZCBoZXJlIGluIGEgc2xpZ2h0bHkgZWRpdGVkIGZvcm0gZm9yCi0gICBjb252ZW5pZW5jZS4KLQotICAgQSA2NS1jaGFyYWN0ZXIgc3Vic2V0IG9mIFVTLUFTQ0lJIGlzIHVzZWQsIGVuYWJsaW5nIDYgYml0cyB0byBiZQotICAgcmVwcmVzZW50ZWQgcGVyIHByaW50YWJsZSBjaGFyYWN0ZXIuIChUaGUgZXh0cmEgNjV0aCBjaGFyYWN0ZXIsICI9IiwKLSAgIGlzIHVzZWQgdG8gc2lnbmlmeSBhIHNwZWNpYWwgcHJvY2Vzc2luZyBmdW5jdGlvbi4pCi0KLSAgIFRoZSBlbmNvZGluZyBwcm9jZXNzIHJlcHJlc2VudHMgMjQtYml0IGdyb3VwcyBvZiBpbnB1dCBiaXRzIGFzIG91dHB1dAotICAgc3RyaW5ncyBvZiA0IGVuY29kZWQgY2hhcmFjdGVycy4gUHJvY2VlZGluZyBmcm9tIGxlZnQgdG8gcmlnaHQsIGEKLSAgIDI0LWJpdCBpbnB1dCBncm91cCBpcyBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyAzIDgtYml0IGlucHV0IGdyb3Vwcy4KLSAgIFRoZXNlIDI0IGJpdHMgYXJlIHRoZW4gdHJlYXRlZCBhcyA0IGNvbmNhdGVuYXRlZCA2LWJpdCBncm91cHMsIGVhY2gKLSAgIG9mIHdoaWNoIGlzIHRyYW5zbGF0ZWQgaW50byBhIHNpbmdsZSBkaWdpdCBpbiB0aGUgYmFzZTY0IGFscGhhYmV0LgotCi0gICBFYWNoIDYtYml0IGdyb3VwIGlzIHVzZWQgYXMgYW4gaW5kZXggaW50byBhbiBhcnJheSBvZiA2NCBwcmludGFibGUKLSAgIGNoYXJhY3RlcnMuIFRoZSBjaGFyYWN0ZXIgcmVmZXJlbmNlZCBieSB0aGUgaW5kZXggaXMgcGxhY2VkIGluIHRoZQotICAgb3V0cHV0IHN0cmluZy4KLQotICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIDE6IFRoZSBCYXNlNjQgQWxwaGFiZXQKLQotICAgICAgVmFsdWUgRW5jb2RpbmcgIFZhbHVlIEVuY29kaW5nICBWYWx1ZSBFbmNvZGluZyAgVmFsdWUgRW5jb2RpbmcKLSAgICAgICAgICAwIEEgICAgICAgICAgICAxNyBSICAgICAgICAgICAgMzQgaSAgICAgICAgICAgIDUxIHoKLSAgICAgICAgICAxIEIgICAgICAgICAgICAxOCBTICAgICAgICAgICAgMzUgaiAgICAgICAgICAgIDUyIDAKLSAgICAgICAgICAyIEMgICAgICAgICAgICAxOSBUICAgICAgICAgICAgMzYgayAgICAgICAgICAgIDUzIDEKLSAgICAgICAgICAzIEQgICAgICAgICAgICAyMCBVICAgICAgICAgICAgMzcgbCAgICAgICAgICAgIDU0IDIKLSAgICAgICAgICA0IEUgICAgICAgICAgICAyMSBWICAgICAgICAgICAgMzggbSAgICAgICAgICAgIDU1IDMKLSAgICAgICAgICA1IEYgICAgICAgICAgICAyMiBXICAgICAgICAgICAgMzkgbiAgICAgICAgICAgIDU2IDQKLSAgICAgICAgICA2IEcgICAgICAgICAgICAyMyBYICAgICAgICAgICAgNDAgbyAgICAgICAgICAgIDU3IDUKLSAgICAgICAgICA3IEggICAgICAgICAgICAyNCBZICAgICAgICAgICAgNDEgcCAgICAgICAgICAgIDU4IDYKLSAgICAgICAgICA4IEkgICAgICAgICAgICAyNSBaICAgICAgICAgICAgNDIgcSAgICAgICAgICAgIDU5IDcKLSAgICAgICAgICA5IEogICAgICAgICAgICAyNiBhICAgICAgICAgICAgNDMgciAgICAgICAgICAgIDYwIDgKLSAgICAgICAgIDEwIEsgICAgICAgICAgICAyNyBiICAgICAgICAgICAgNDQgcyAgICAgICAgICAgIDYxIDkKLSAgICAgICAgIDExIEwgICAgICAgICAgICAyOCBjICAgICAgICAgICAgNDUgdCAgICAgICAgICAgIDYyICsKLSAgICAgICAgIDEyIE0gICAgICAgICAgICAyOSBkICAgICAgICAgICAgNDYgdSAgICAgICAgICAgIDYzIC8KLSAgICAgICAgIDEzIE4gICAgICAgICAgICAzMCBlICAgICAgICAgICAgNDcgdgotICAgICAgICAgMTQgTyAgICAgICAgICAgIDMxIGYgICAgICAgICAgICA0OCB3ICAgICAgICAgKHBhZCkgPQotICAgICAgICAgMTUgUCAgICAgICAgICAgIDMyIGcgICAgICAgICAgICA0OSB4Ci0gICAgICAgICAxNiBRICAgICAgICAgICAgMzMgaCAgICAgICAgICAgIDUwIHkKLQotICAgU3BlY2lhbCBwcm9jZXNzaW5nIGlzIHBlcmZvcm1lZCBpZiBmZXdlciB0aGFuIDI0IGJpdHMgYXJlIGF2YWlsYWJsZQotICAgYXQgdGhlIGVuZCBvZiB0aGUgZGF0YSBiZWluZyBlbmNvZGVkLiAgQSBmdWxsIGVuY29kaW5nIHF1YW50dW0gaXMKLSAgIGFsd2F5cyBjb21wbGV0ZWQgYXQgdGhlIGVuZCBvZiBhIHF1YW50aXR5LiAgV2hlbiBmZXdlciB0aGFuIDI0IGlucHV0Ci0gICBiaXRzIGFyZSBhdmFpbGFibGUgaW4gYW4gaW5wdXQgZ3JvdXAsIHplcm8gYml0cyBhcmUgYWRkZWQgKG9uIHRoZQotICAgcmlnaHQpIHRvIGZvcm0gYW4gaW50ZWdyYWwgbnVtYmVyIG9mIDYtYml0IGdyb3Vwcy4gIFBhZGRpbmcgYXQgdGhlCi0gICBlbmQgb2YgdGhlIGRhdGEgaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSAnPScgY2hhcmFjdGVyLgotCi0gICBTaW5jZSBhbGwgYmFzZTY0IGlucHV0IGlzIGFuIGludGVncmFsIG51bWJlciBvZiBvY3RldHMsIG9ubHkgdGhlCi0gICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvbGxvd2luZyBjYXNlcyBjYW4gYXJpc2U6Ci0gICAKLSAgICAgICAoMSkgdGhlIGZpbmFsIHF1YW50dW0gb2YgZW5jb2RpbmcgaW5wdXQgaXMgYW4gaW50ZWdyYWwKLSAgICAgICAgICAgbXVsdGlwbGUgb2YgMjQgYml0czsgaGVyZSwgdGhlIGZpbmFsIHVuaXQgb2YgZW5jb2RlZAotCSAgIG91dHB1dCB3aWxsIGJlIGFuIGludGVncmFsIG11bHRpcGxlIG9mIDQgY2hhcmFjdGVycwotCSAgIHdpdGggbm8gIj0iIHBhZGRpbmcsCi0gICAgICAgKDIpIHRoZSBmaW5hbCBxdWFudHVtIG9mIGVuY29kaW5nIGlucHV0IGlzIGV4YWN0bHkgOCBiaXRzOwotICAgICAgICAgICBoZXJlLCB0aGUgZmluYWwgdW5pdCBvZiBlbmNvZGVkIG91dHB1dCB3aWxsIGJlIHR3bwotCSAgIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkgdHdvICI9IiBwYWRkaW5nIGNoYXJhY3RlcnMsIG9yCi0gICAgICAgKDMpIHRoZSBmaW5hbCBxdWFudHVtIG9mIGVuY29kaW5nIGlucHV0IGlzIGV4YWN0bHkgMTYgYml0czsKLSAgICAgICAgICAgaGVyZSwgdGhlIGZpbmFsIHVuaXQgb2YgZW5jb2RlZCBvdXRwdXQgd2lsbCBiZSB0aHJlZQotCSAgIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkgb25lICI9IiBwYWRkaW5nIGNoYXJhY3Rlci4KLSAgICovCi0KLSNpZiAhZGVmaW5lZChIQVZFX0I2NF9OVE9QKSAmJiAhZGVmaW5lZChIQVZFX19fQjY0X05UT1ApIAotaW50Ci1iNjRfbnRvcCh1X2NoYXIgY29uc3QgKnNyYywgc2l6ZV90IHNyY2xlbmd0aCwgY2hhciAqdGFyZ2V0LCBzaXplX3QgdGFyZ3NpemUpCi17Ci0Jc2l6ZV90IGRhdGFsZW5ndGggPSAwOwotCXVfY2hhciBpbnB1dFszXTsKLQl1X2NoYXIgb3V0cHV0WzRdOwotCXVfaW50IGk7Ci0KLQl3aGlsZSAoMiA8IHNyY2xlbmd0aCkgewotCQlpbnB1dFswXSA9ICpzcmMrKzsKLQkJaW5wdXRbMV0gPSAqc3JjKys7Ci0JCWlucHV0WzJdID0gKnNyYysrOwotCQlzcmNsZW5ndGggLT0gMzsKLQotCQlvdXRwdXRbMF0gPSBpbnB1dFswXSA+PiAyOwotCQlvdXRwdXRbMV0gPSAoKGlucHV0WzBdICYgMHgwMykgPDwgNCkgKyAoaW5wdXRbMV0gPj4gNCk7Ci0JCW91dHB1dFsyXSA9ICgoaW5wdXRbMV0gJiAweDBmKSA8PCAyKSArIChpbnB1dFsyXSA+PiA2KTsKLQkJb3V0cHV0WzNdID0gaW5wdXRbMl0gJiAweDNmOwotCi0JCWlmIChkYXRhbGVuZ3RoICsgNCA+IHRhcmdzaXplKQotCQkJcmV0dXJuICgtMSk7Ci0JCXRhcmdldFtkYXRhbGVuZ3RoKytdID0gQmFzZTY0W291dHB1dFswXV07Ci0JCXRhcmdldFtkYXRhbGVuZ3RoKytdID0gQmFzZTY0W291dHB1dFsxXV07Ci0JCXRhcmdldFtkYXRhbGVuZ3RoKytdID0gQmFzZTY0W291dHB1dFsyXV07Ci0JCXRhcmdldFtkYXRhbGVuZ3RoKytdID0gQmFzZTY0W291dHB1dFszXV07Ci0JfQotICAgIAotCS8qIE5vdyB3ZSB3b3JyeSBhYm91dCBwYWRkaW5nLiAqLwotCWlmICgwICE9IHNyY2xlbmd0aCkgewotCQkvKiBHZXQgd2hhdCdzIGxlZnQuICovCi0JCWlucHV0WzBdID0gaW5wdXRbMV0gPSBpbnB1dFsyXSA9ICdcMCc7Ci0JCWZvciAoaSA9IDA7IGkgPCBzcmNsZW5ndGg7IGkrKykKLQkJCWlucHV0W2ldID0gKnNyYysrOwotCQotCQlvdXRwdXRbMF0gPSBpbnB1dFswXSA+PiAyOwotCQlvdXRwdXRbMV0gPSAoKGlucHV0WzBdICYgMHgwMykgPDwgNCkgKyAoaW5wdXRbMV0gPj4gNCk7Ci0JCW91dHB1dFsyXSA9ICgoaW5wdXRbMV0gJiAweDBmKSA8PCAyKSArIChpbnB1dFsyXSA+PiA2KTsKLQotCQlpZiAoZGF0YWxlbmd0aCArIDQgPiB0YXJnc2l6ZSkKLQkJCXJldHVybiAoLTEpOwotCQl0YXJnZXRbZGF0YWxlbmd0aCsrXSA9IEJhc2U2NFtvdXRwdXRbMF1dOwotCQl0YXJnZXRbZGF0YWxlbmd0aCsrXSA9IEJhc2U2NFtvdXRwdXRbMV1dOwotCQlpZiAoc3JjbGVuZ3RoID09IDEpCi0JCQl0YXJnZXRbZGF0YWxlbmd0aCsrXSA9IFBhZDY0OwotCQllbHNlCi0JCQl0YXJnZXRbZGF0YWxlbmd0aCsrXSA9IEJhc2U2NFtvdXRwdXRbMl1dOwotCQl0YXJnZXRbZGF0YWxlbmd0aCsrXSA9IFBhZDY0OwotCX0KLQlpZiAoZGF0YWxlbmd0aCA+PSB0YXJnc2l6ZSkKLQkJcmV0dXJuICgtMSk7Ci0JdGFyZ2V0W2RhdGFsZW5ndGhdID0gJ1wwJzsJLyogUmV0dXJuZWQgdmFsdWUgZG9lc24ndCBjb3VudCBcMC4gKi8KLQlyZXR1cm4gKGRhdGFsZW5ndGgpOwotfQotI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfQjY0X05UT1ApICYmICFkZWZpbmVkKEhBVkVfX19CNjRfTlRPUCkgKi8KLQotI2lmICFkZWZpbmVkKEhBVkVfQjY0X1BUT04pICYmICFkZWZpbmVkKEhBVkVfX19CNjRfUFRPTikKLQotLyogc2tpcHMgYWxsIHdoaXRlc3BhY2UgYW55d2hlcmUuCi0gICBjb252ZXJ0cyBjaGFyYWN0ZXJzLCBmb3VyIGF0IGEgdGltZSwgc3RhcnRpbmcgYXQgKG9yIGFmdGVyKQotICAgc3JjIGZyb20gYmFzZSAtIDY0IG51bWJlcnMgaW50byB0aHJlZSA4IGJpdCBieXRlcyBpbiB0aGUgdGFyZ2V0IGFyZWEuCi0gICBpdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBzdG9yZWQgYXQgdGhlIHRhcmdldCwgb3IgLTEgb24gZXJyb3IuCi0gKi8KLQotaW50Ci1iNjRfcHRvbihjaGFyIGNvbnN0ICpzcmMsIHVfY2hhciAqdGFyZ2V0LCBzaXplX3QgdGFyZ3NpemUpCi17Ci0JdV9pbnQgdGFyaW5kZXgsIHN0YXRlOwotCWludCBjaDsKLQljaGFyICpwb3M7Ci0KLQlzdGF0ZSA9IDA7Ci0JdGFyaW5kZXggPSAwOwotCi0Jd2hpbGUgKChjaCA9ICpzcmMrKykgIT0gJ1wwJykgewotCQlpZiAoaXNzcGFjZShjaCkpCS8qIFNraXAgd2hpdGVzcGFjZSBhbnl3aGVyZS4gKi8KLQkJCWNvbnRpbnVlOwotCi0JCWlmIChjaCA9PSBQYWQ2NCkKLQkJCWJyZWFrOwotCi0JCXBvcyA9IHN0cmNocihCYXNlNjQsIGNoKTsKLQkJaWYgKHBvcyA9PSAwKSAJCS8qIEEgbm9uLWJhc2U2NCBjaGFyYWN0ZXIuICovCi0JCQlyZXR1cm4gKC0xKTsKLQotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCWNhc2UgMDoKLQkJCWlmICh0YXJnZXQpIHsKLQkJCQlpZiAodGFyaW5kZXggPj0gdGFyZ3NpemUpCi0JCQkJCXJldHVybiAoLTEpOwotCQkJCXRhcmdldFt0YXJpbmRleF0gPSAocG9zIC0gQmFzZTY0KSA8PCAyOwotCQkJfQotCQkJc3RhdGUgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWlmICh0YXJnZXQpIHsKLQkJCQlpZiAodGFyaW5kZXggKyAxID49IHRhcmdzaXplKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQl0YXJnZXRbdGFyaW5kZXhdICAgfD0gIChwb3MgLSBCYXNlNjQpID4+IDQ7Ci0JCQkJdGFyZ2V0W3RhcmluZGV4KzFdICA9ICgocG9zIC0gQmFzZTY0KSAmIDB4MGYpCi0JCQkJCQkJPDwgNCA7Ci0JCQl9Ci0JCQl0YXJpbmRleCsrOwotCQkJc3RhdGUgPSAyOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCWlmICh0YXJnZXQpIHsKLQkJCQlpZiAodGFyaW5kZXggKyAxID49IHRhcmdzaXplKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQl0YXJnZXRbdGFyaW5kZXhdICAgfD0gIChwb3MgLSBCYXNlNjQpID4+IDI7Ci0JCQkJdGFyZ2V0W3RhcmluZGV4KzFdICA9ICgocG9zIC0gQmFzZTY0KSAmIDB4MDMpCi0JCQkJCQkJPDwgNjsKLQkJCX0KLQkJCXRhcmluZGV4Kys7Ci0JCQlzdGF0ZSA9IDM7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJaWYgKHRhcmdldCkgewotCQkJCWlmICh0YXJpbmRleCA+PSB0YXJnc2l6ZSkKLQkJCQkJcmV0dXJuICgtMSk7Ci0JCQkJdGFyZ2V0W3RhcmluZGV4XSB8PSAocG9zIC0gQmFzZTY0KTsKLQkJCX0KLQkJCXRhcmluZGV4Kys7Ci0JCQlzdGF0ZSA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qCi0JICogV2UgYXJlIGRvbmUgZGVjb2RpbmcgQmFzZS02NCBjaGFycy4gIExldCdzIHNlZSBpZiB3ZSBlbmRlZAotCSAqIG9uIGEgYnl0ZSBib3VuZGFyeSwgYW5kL29yIHdpdGggZXJyb25lb3VzIHRyYWlsaW5nIGNoYXJhY3RlcnMuCi0JICovCi0KLQlpZiAoY2ggPT0gUGFkNjQpIHsJCS8qIFdlIGdvdCBhIHBhZCBjaGFyLiAqLwotCQljaCA9ICpzcmMrKzsJCS8qIFNraXAgaXQsIGdldCBuZXh0LiAqLwotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCWNhc2UgMDoJCS8qIEludmFsaWQgPSBpbiBmaXJzdCBwb3NpdGlvbiAqLwotCQljYXNlIDE6CQkvKiBJbnZhbGlkID0gaW4gc2Vjb25kIHBvc2l0aW9uICovCi0JCQlyZXR1cm4gKC0xKTsKLQotCQljYXNlIDI6CQkvKiBWYWxpZCwgbWVhbnMgb25lIGJ5dGUgb2YgaW5mbyAqLwotCQkJLyogU2tpcCBhbnkgbnVtYmVyIG9mIHNwYWNlcy4gKi8KLQkJCWZvciAoOyBjaCAhPSAnXDAnOyBjaCA9ICpzcmMrKykKLQkJCQlpZiAoIWlzc3BhY2UoY2gpKQotCQkJCQlicmVhazsKLQkJCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBhbm90aGVyIHRyYWlsaW5nID0gc2lnbi4gKi8KLQkJCWlmIChjaCAhPSBQYWQ2NCkKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCWNoID0gKnNyYysrOwkJLyogU2tpcCB0aGUgPSAqLwotCQkJLyogRmFsbCB0aHJvdWdoIHRvICJzaW5nbGUgdHJhaWxpbmcgPSIgY2FzZS4gKi8KLQkJCS8qIEZBTExUSFJPVUdIICovCi0KLQkJY2FzZSAzOgkJLyogVmFsaWQsIG1lYW5zIHR3byBieXRlcyBvZiBpbmZvICovCi0JCQkvKgotCQkJICogV2Uga25vdyB0aGlzIGNoYXIgaXMgYW4gPS4gIElzIHRoZXJlIGFueXRoaW5nIGJ1dAotCQkJICogd2hpdGVzcGFjZSBhZnRlciBpdD8KLQkJCSAqLwotCQkJZm9yICg7IGNoICE9ICdcMCc7IGNoID0gKnNyYysrKQotCQkJCWlmICghaXNzcGFjZShjaCkpCi0JCQkJCXJldHVybiAoLTEpOwotCi0JCQkvKgotCQkJICogTm93IG1ha2Ugc3VyZSBmb3IgY2FzZXMgMiBhbmQgMyB0aGF0IHRoZSAiZXh0cmEiCi0JCQkgKiBiaXRzIHRoYXQgc2xvcHBlZCBwYXN0IHRoZSBsYXN0IGZ1bGwgYnl0ZSB3ZXJlCi0JCQkgKiB6ZXJvcy4gIElmIHdlIGRvbid0IGNoZWNrIHRoZW0sIHRoZXkgYmVjb21lIGEKLQkJCSAqIHN1YmxpbWluYWwgY2hhbm5lbC4KLQkJCSAqLwotCQkJaWYgKHRhcmdldCAmJiB0YXJnZXRbdGFyaW5kZXhdICE9IDApCi0JCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKgotCQkgKiBXZSBlbmRlZCBieSBzZWVpbmcgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAgTWFrZSBzdXJlIHdlCi0JCSAqIGhhdmUgbm8gcGFydGlhbCBieXRlcyBseWluZyBhcm91bmQuCi0JCSAqLwotCQlpZiAoc3RhdGUgIT0gMCkKLQkJCXJldHVybiAoLTEpOwotCX0KLQotCXJldHVybiAodGFyaW5kZXgpOwotfQotCi0jZW5kaWYgLyogIWRlZmluZWQoSEFWRV9CNjRfUFRPTikgJiYgIWRlZmluZWQoSEFWRV9fX0I2NF9QVE9OKSAqLwotI2VuZGlmIApkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvYmFzZTY0LmggYi9vcGVuYnNkLWNvbXBhdC9iYXNlNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMyYzZiMy4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9iYXNlNjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qICRJZDogYmFzZTY0LmgsdiAxLjYgMjAwMy8wOC8yOSAxNjo1OTo1MiBtb3VyaW5nIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bS4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElOVEVSTkVUIFNPRlRXQVJFIENPTlNPUlRJVU0gRElTQ0xBSU1TCi0gKiBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIElOVEVSTkVUIFNPRlRXQVJFCi0gKiBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgotICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKLSAqIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwotICogU09GVFdBUkUuCi0gKi8KLQotLyoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5NSBieSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBJbmMuCi0gKgotICogSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgSW5jLiAoaGVyZWluYWZ0ZXIgY2FsbGVkIElCTSkgZ3JhbnRzCi0gKiBwZXJtaXNzaW9uIHVuZGVyIGl0cyBjb3B5cmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCi0gKiBTb2Z0d2FyZSB3aXRoIG9yIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogYWxsIHBhcmFncmFwaHMgb2YgdGhpcyBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IHRoZSBuYW1lIG9mIElCTQotICogbm90IGJlIHVzZWQgaW4gY29ubmVjdGlvbiB3aXRoIHRoZSBtYXJrZXRpbmcgb2YgYW55IHByb2R1Y3QgaW5jb3Jwb3JhdGluZwotICogdGhlIFNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmVvZiwgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvcgotICogcGVybWlzc2lvbi4KLSAqCi0gKiBUbyB0aGUgZXh0ZW50IGl0IGhhcyBhIHJpZ2h0IHRvIGRvIHNvLCBJQk0gZ3JhbnRzIGFuIGltbXVuaXR5IGZyb20gc3VpdAotICogdW5kZXIgaXRzIHBhdGVudHMsIGlmIGFueSwgZm9yIHRoZSB1c2UsIHNhbGUgb3IgbWFudWZhY3R1cmUgb2YgcHJvZHVjdHMgdG8KLSAqIHRoZSBleHRlbnQgdGhhdCBzdWNoIHByb2R1Y3RzIGFyZSB1c2VkIGZvciBwZXJmb3JtaW5nIERvbWFpbiBOYW1lIFN5c3RlbQotICogZHluYW1pYyB1cGRhdGVzIGluIFRDUC9JUCBuZXR3b3JrcyBieSBtZWFucyBvZiB0aGUgU29mdHdhcmUuICBObyBpbW11bml0eSBpcwotICogZ3JhbnRlZCBmb3IgYW55IHByb2R1Y3QgcGVyIHNlIG9yIGZvciBhbnkgb3RoZXIgZnVuY3Rpb24gb2YgYW55IHByb2R1Y3QuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIEFORCBJQk0gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCi0gKiBQQVJUSUNVTEFSIFBVUlBPU0UuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBJQk0gSVMgQVBQUklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaWZuZGVmIF9CU0RfQkFTRTY0X0gKLSNkZWZpbmUgX0JTRF9CQVNFNjRfSAotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmbmRlZiBIQVZFX19fQjY0X05UT1AKLSMgaWZuZGVmIEhBVkVfQjY0X05UT1AKLWludCBiNjRfbnRvcCh1X2NoYXIgY29uc3QgKnNyYywgc2l6ZV90IHNyY2xlbmd0aCwgY2hhciAqdGFyZ2V0LCAKLSAgICBzaXplX3QgdGFyZ3NpemUpOwotIyBlbmRpZiAvKiAhSEFWRV9CNjRfTlRPUCAqLwotIyBkZWZpbmUgX19iNjRfbnRvcChhLGIsYyxkKSBiNjRfbnRvcChhLGIsYyxkKQotI2VuZGlmIC8qIEhBVkVfX19CNjRfTlRPUCAqLwotCi0jaWZuZGVmIEhBVkVfX19CNjRfUFRPTgotIyBpZm5kZWYgSEFWRV9CNjRfUFRPTgotaW50IGI2NF9wdG9uKGNoYXIgY29uc3QgKnNyYywgdV9jaGFyICp0YXJnZXQsIHNpemVfdCB0YXJnc2l6ZSk7Ci0jIGVuZGlmIC8qICFIQVZFX0I2NF9QVE9OICovCi0jIGRlZmluZSBfX2I2NF9wdG9uKGEsYixjKSBiNjRfcHRvbihhLGIsYykKLSNlbmRpZiAvKiBIQVZFX19fQjY0X1BUT04gKi8KLQotI2VuZGlmIC8qIF9CU0RfQkFTRTY0X0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L2Jhc2VuYW1lLmMgYi9vcGVuYnNkLWNvbXBhdC9iYXNlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmE1Yzg5Li4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L2Jhc2VuYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgkkT3BlbkJTRDogYmFzZW5hbWUuYyx2IDEuMTQgMjAwNS8wOC8wOCAwODowNTozMyBlc3BpZSBFeHAgJAkqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDA0IFRvZGQgQy4gTWlsbGVyIDxUb2RkLk1pbGxlckBjb3VydGVzYW4uY29tPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLS8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL2dlbi9iYXNlbmFtZS5jICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2lmbmRlZiBIQVZFX0JBU0VOQU1FCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotY2hhciAqCi1iYXNlbmFtZShjb25zdCBjaGFyICpwYXRoKQotewotCXN0YXRpYyBjaGFyIGJuYW1lW01BWFBBVEhMRU5dOwotCXNpemVfdCBsZW47Ci0JY29uc3QgY2hhciAqZW5kcCwgKnN0YXJ0cDsKLQotCS8qIEVtcHR5IG9yIE5VTEwgc3RyaW5nIGdldHMgdHJlYXRlZCBhcyAiLiIgKi8KLQlpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpIHsKLQkJYm5hbWVbMF0gPSAnLic7Ci0JCWJuYW1lWzFdID0gJ1wwJzsKLQkJcmV0dXJuIChibmFtZSk7Ci0JfQotCi0JLyogU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoZXMgKi8KLQllbmRwID0gcGF0aCArIHN0cmxlbihwYXRoKSAtIDE7Ci0Jd2hpbGUgKGVuZHAgPiBwYXRoICYmICplbmRwID09ICcvJykKLQkJZW5kcC0tOwotCi0JLyogQWxsIHNsYXNoZXMgYmVjb21lcyAiLyIgKi8KLQlpZiAoZW5kcCA9PSBwYXRoICYmICplbmRwID09ICcvJykgewotCQlibmFtZVswXSA9ICcvJzsKLQkJYm5hbWVbMV0gPSAnXDAnOwotCQlyZXR1cm4gKGJuYW1lKTsKLQl9Ci0KLQkvKiBGaW5kIHRoZSBzdGFydCBvZiB0aGUgYmFzZSAqLwotCXN0YXJ0cCA9IGVuZHA7Ci0Jd2hpbGUgKHN0YXJ0cCA+IHBhdGggJiYgKihzdGFydHAgLSAxKSAhPSAnLycpCi0JCXN0YXJ0cC0tOwotCi0JbGVuID0gZW5kcCAtIHN0YXJ0cCArIDE7Ci0JaWYgKGxlbiA+PSBzaXplb2YoYm5hbWUpKSB7Ci0JCWVycm5vID0gRU5BTUVUT09MT05HOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQltZW1jcHkoYm5hbWUsIHN0YXJ0cCwgbGVuKTsKLQlibmFtZVtsZW5dID0gJ1wwJzsKLQlyZXR1cm4gKGJuYW1lKTsKLX0KLQotI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfQkFTRU5BTUUpICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9iaW5kcmVzdnBvcnQuYyBiL29wZW5ic2QtY29tcGF0L2JpbmRyZXN2cG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODlmMjE0Li4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L2JpbmRyZXN2cG9ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBoYXMgYmUgc3Vic3RhbnRpYWxseSBtb2RpZmllZCBmcm9tIHRoZSBvcmlnaW5hbCBPcGVuQlNEIHNvdXJjZSAqLwotCi0vKgkkT3BlbkJTRDogYmluZHJlc3Zwb3J0LmMsdiAxLjE3IDIwMDUvMTIvMjEgMDE6NDA6MjIgbWlsbGVydCBFeHAgJAkqLwotCi0vKgotICogQ29weXJpZ2h0IDE5OTYsIEphc29uIERvd25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAxOTk4LCBUaGVvIGRlIFJhYWR0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAyMDAwLCBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvcnBjL2JpbmRyZXN2cG9ydC5jICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZuZGVmIEhBVkVfQklORFJFU1ZQT1JUX1NBCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBTVEFSVFBPUlQgNjAwCi0jZGVmaW5lIEVORFBPUlQgKElQUE9SVF9SRVNFUlZFRCAtIDEpCi0jZGVmaW5lIE5QT1JUUwkoRU5EUE9SVCAtIFNUQVJUUE9SVCArIDEpCi0KLS8qCi0gKiBCaW5kIGEgc29ja2V0IHRvIGEgcHJpdmlsZWdlZCBJUCBwb3J0Ci0gKi8KLWludAotYmluZHJlc3Zwb3J0X3NhKGludCBzZCwgc3RydWN0IHNvY2thZGRyICpzYSkKLXsKLQlpbnQgZXJyb3IsIGFmOwotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIG15YWRkcjsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmluOwotCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmluNjsKLQl1X2ludDE2X3QgKnBvcnRwOwotCXVfaW50MTZfdCBwb3J0OwotCXNvY2tsZW5fdCBzYWxlbjsKLQlpbnQgaTsKLQotCWlmIChzYSA9PSBOVUxMKSB7Ci0JCW1lbXNldCgmbXlhZGRyLCAwLCBzaXplb2YobXlhZGRyKSk7Ci0JCXNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSZteWFkZHI7Ci0KLQkJaWYgKGdldHNvY2tuYW1lKHNkLCBzYSwgJnNhbGVuKSA9PSAtMSkKLQkJCXJldHVybiAtMTsJLyogZXJybm8gaXMgY29ycmVjdGx5IHNldCAqLwotCi0JCWFmID0gc2EtPnNhX2ZhbWlseTsKLQkJbWVtc2V0KCZteWFkZHIsIDAsIHNhbGVuKTsKLQl9IGVsc2UKLQkJYWYgPSBzYS0+c2FfZmFtaWx5OwotCi0JaWYgKGFmID09IEFGX0lORVQpIHsKLQkJaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopc2E7Ci0JCXNhbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7Ci0JCXBvcnRwID0gJmluLT5zaW5fcG9ydDsKLQl9IGVsc2UgaWYgKGFmID09IEFGX0lORVQ2KSB7Ci0JCWluNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2E7Ci0JCXNhbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOwotCQlwb3J0cCA9ICZpbjYtPnNpbjZfcG9ydDsKLQl9IGVsc2UgewotCQllcnJubyA9IEVQRk5PU1VQUE9SVDsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCXNhLT5zYV9mYW1pbHkgPSBhZjsKLQotCXBvcnQgPSBudG9ocygqcG9ydHApOwotCWlmIChwb3J0ID09IDApCi0JCXBvcnQgPSBhcmM0cmFuZG9tX3VuaWZvcm0oTlBPUlRTKSArIFNUQVJUUE9SVDsKLQotCS8qIEF2b2lkIHdhcm5pbmcgKi8KLQllcnJvciA9IC0xOwotCi0JZm9yKGkgPSAwOyBpIDwgTlBPUlRTOyBpKyspIHsKLQkJKnBvcnRwID0gaHRvbnMocG9ydCk7Ci0JCQotCQllcnJvciA9IGJpbmQoc2QsIHNhLCBzYWxlbik7Ci0KLQkJLyogVGVybWluYXRlIG9uIHN1Y2Nlc3MgKi8KLQkJaWYgKGVycm9yID09IDApCi0JCQlicmVhazsKLQkJCQotCQkvKiBUZXJtaW5hdGUgb24gZXJyb3JzLCBleGNlcHQgImFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiICovCi0JCWlmICgoZXJyb3IgPCAwKSAmJiAhKChlcnJubyA9PSBFQUREUklOVVNFKSB8fCAoZXJybm8gPT0gRUlOVkFMKSkpCi0JCQlicmVhazsKLQkJCQotCQlwb3J0Kys7Ci0JCWlmIChwb3J0ID4gRU5EUE9SVCkKLQkJCXBvcnQgPSBTVEFSVFBPUlQ7Ci0JfQotCi0JcmV0dXJuIChlcnJvcik7Ci19Ci0KLSNlbmRpZiAvKiBIQVZFX0JJTkRSRVNWUE9SVF9TQSAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvYnNkLWFyYzRyYW5kb20uYyBiL29wZW5ic2QtY29tcGF0L2JzZC1hcmM0cmFuZG9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YzU4NjIuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvYnNkLWFyYzRyYW5kb20uYworKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwNCBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAibG9nLmgiCi0KLSNpZm5kZWYgSEFWRV9BUkM0UkFORE9NCi0KLSNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3JjNC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+Ci0KLS8qIFNpemUgb2Yga2V5IHRvIHVzZSAqLwotI2RlZmluZSBTRUVEX1NJWkUgMjAKLQotLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHJlc2VlZCBhZnRlciAqLwotI2RlZmluZSBSRUtFWV9CWVRFUwkoMSA8PCAyNCkKLQotc3RhdGljIGludCByYzRfcmVhZHkgPSAwOwotc3RhdGljIFJDNF9LRVkgcmM0OwotCi11bnNpZ25lZCBpbnQKLWFyYzRyYW5kb20odm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgciA9IDA7Ci0Jc3RhdGljIGludCBmaXJzdF90aW1lID0gMTsKLQotCWlmIChyYzRfcmVhZHkgPD0gMCkgewotCQlpZiAoZmlyc3RfdGltZSkKLQkJCXNlZWRfcm5nKCk7Ci0JCWZpcnN0X3RpbWUgPSAwOwotCQlhcmM0cmFuZG9tX3N0aXIoKTsKLQl9Ci0KLQlSQzQoJnJjNCwgc2l6ZW9mKHIpLCAodW5zaWduZWQgY2hhciAqKSZyLCAodW5zaWduZWQgY2hhciAqKSZyKTsKLQotCXJjNF9yZWFkeSAtPSBzaXplb2Yocik7Ci0JCi0JcmV0dXJuKHIpOwotfQotCi12b2lkCi1hcmM0cmFuZG9tX3N0aXIodm9pZCkKLXsKLQl1bnNpZ25lZCBjaGFyIHJhbmRfYnVmW1NFRURfU0laRV07Ci0JaW50IGk7Ci0KLQltZW1zZXQoJnJjNCwgMCwgc2l6ZW9mKHJjNCkpOwotCWlmIChSQU5EX2J5dGVzKHJhbmRfYnVmLCBzaXplb2YocmFuZF9idWYpKSA8PSAwKQotCQlmYXRhbCgiQ291bGRuJ3Qgb2J0YWluIHJhbmRvbSBieXRlcyAoZXJyb3IgJWxkKSIsCi0JCSAgICBFUlJfZ2V0X2Vycm9yKCkpOwotCVJDNF9zZXRfa2V5KCZyYzQsIHNpemVvZihyYW5kX2J1ZiksIHJhbmRfYnVmKTsKLQotCS8qCi0JICogRGlzY2FyZCBlYXJseSBrZXlzdHJlYW0sIGFzIHBlciByZWNvbW1lbmRhdGlvbnMgaW46Ci0JICogaHR0cDovL3d3dy53aXNkb20ud2Vpem1hbm4uYWMuaWwvfml0c2lrL1JDNC9QYXBlcnMvUmM0X2tzYS5wcwotCSAqLwotCWZvcihpID0gMDsgaSA8PSAyNTY7IGkgKz0gc2l6ZW9mKHJhbmRfYnVmKSkKLQkJUkM0KCZyYzQsIHNpemVvZihyYW5kX2J1ZiksIHJhbmRfYnVmLCByYW5kX2J1Zik7Ci0KLQltZW1zZXQocmFuZF9idWYsIDAsIHNpemVvZihyYW5kX2J1ZikpOwotCi0JcmM0X3JlYWR5ID0gUkVLRVlfQllURVM7Ci19Ci0jZW5kaWYgLyogIUhBVkVfQVJDNFJBTkRPTSAqLwotCi0jaWZuZGVmIEhBVkVfQVJDNFJBTkRPTV9CVUYKLXZvaWQKLWFyYzRyYW5kb21fYnVmKHZvaWQgKl9idWYsIHNpemVfdCBuKQotewotCXNpemVfdCBpOwotCXVfaW50MzJfdCByID0gMDsKLQljaGFyICpidWYgPSAoY2hhciAqKV9idWY7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWlmIChpICUgNCA9PSAwKQotCQkJciA9IGFyYzRyYW5kb20oKTsKLQkJYnVmW2ldID0gciAmIDB4ZmY7Ci0JCXIgPj49IDg7Ci0JfQotCWkgPSByID0gMDsKLX0KLSNlbmRpZiAvKiAhSEFWRV9BUkM0UkFORE9NX0JVRiAqLwotCi0jaWZuZGVmIEhBVkVfQVJDNFJBTkRPTV9VTklGT1JNCi0vKgotICogQ2FsY3VsYXRlIGEgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIHJhbmRvbSBudW1iZXIgbGVzcyB0aGFuIHVwcGVyX2JvdW5kCi0gKiBhdm9pZGluZyAibW9kdWxvIGJpYXMiLgotICoKLSAqIFVuaWZvcm1pdHkgaXMgYWNoaWV2ZWQgYnkgZ2VuZXJhdGluZyBuZXcgcmFuZG9tIG51bWJlcnMgdW50aWwgdGhlIG9uZQotICogcmV0dXJuZWQgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsIDIqKjMyICUgdXBwZXJfYm91bmQpLiAgVGhpcwotICogZ3VhcmFudGVlcyB0aGUgc2VsZWN0ZWQgcmFuZG9tIG51bWJlciB3aWxsIGJlIGluc2lkZQotICogWzIqKjMyICUgdXBwZXJfYm91bmQsIDIqKjMyKSB3aGljaCBtYXBzIGJhY2sgdG8gWzAsIHVwcGVyX2JvdW5kKQotICogYWZ0ZXIgcmVkdWN0aW9uIG1vZHVsbyB1cHBlcl9ib3VuZC4KLSAqLwotdV9pbnQzMl90Ci1hcmM0cmFuZG9tX3VuaWZvcm0odV9pbnQzMl90IHVwcGVyX2JvdW5kKQotewotCXVfaW50MzJfdCByLCBtaW47Ci0KLQlpZiAodXBwZXJfYm91bmQgPCAyKQotCQlyZXR1cm4gMDsKLQotI2lmIChVTE9OR19NQVggPiAweGZmZmZmZmZmVUwpCi0JbWluID0gMHgxMDAwMDAwMDBVTCAlIHVwcGVyX2JvdW5kOwotI2Vsc2UKLQkvKiBDYWxjdWxhdGUgKDIqKjMyICUgdXBwZXJfYm91bmQpIGF2b2lkaW5nIDY0LWJpdCBtYXRoICovCi0JaWYgKHVwcGVyX2JvdW5kID4gMHg4MDAwMDAwMCkKLQkJbWluID0gMSArIH51cHBlcl9ib3VuZDsJCS8qIDIqKjMyIC0gdXBwZXJfYm91bmQgKi8KLQllbHNlIHsKLQkJLyogKDIqKjMyIC0gKHggKiAyKSkgJSB4ID09IDIqKjMyICUgeCB3aGVuIHggPD0gMioqMzEgKi8KLQkJbWluID0gKCgweGZmZmZmZmZmIC0gKHVwcGVyX2JvdW5kICogMikpICsgMSkgJSB1cHBlcl9ib3VuZDsKLQl9Ci0jZW5kaWYKLQotCS8qCi0JICogVGhpcyBjb3VsZCB0aGVvcmV0aWNhbGx5IGxvb3AgZm9yZXZlciBidXQgZWFjaCByZXRyeSBoYXMKLQkgKiBwID4gMC41ICh3b3JzdCBjYXNlLCB1c3VhbGx5IGZhciBiZXR0ZXIpIG9mIHNlbGVjdGluZyBhCi0JICogbnVtYmVyIGluc2lkZSB0aGUgcmFuZ2Ugd2UgbmVlZCwgc28gaXQgc2hvdWxkIHJhcmVseSBuZWVkCi0JICogdG8gcmUtcm9sbC4KLQkgKi8KLQlmb3IgKDs7KSB7Ci0JCXIgPSBhcmM0cmFuZG9tKCk7Ci0JCWlmIChyID49IG1pbikKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiByICUgdXBwZXJfYm91bmQ7Ci19Ci0jZW5kaWYgLyogIUhBVkVfQVJDNFJBTkRPTV9VTklGT1JNICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9ic2QtYXNwcmludGYuYyBiL29wZW5ic2QtY29tcGF0L2JzZC1hc3ByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY4MTk1Li4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L2JzZC1hc3ByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGFycmVuIFR1Y2tlci4KLSAqCi0gKiBCYXNlZCBvcmlnaW5hbGx5IG9uIGFzcHJpbnRmLmMgZnJvbSBPcGVuQlNEOgotICogQ29weXJpZ2h0IChjKSAxOTk3IFRvZGQgQy4gTWlsbGVyIDxUb2RkLk1pbGxlckBjb3VydGVzYW4uY29tPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZuZGVmIEhBVkVfVkFTUFJJTlRGCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaWZuZGVmIFZBX0NPUFkKLSMgaWZkZWYgSEFWRV9WQV9DT1BZCi0jICBkZWZpbmUgVkFfQ09QWShkZXN0LCBzcmMpIHZhX2NvcHkoZGVzdCwgc3JjKQotIyBlbHNlCi0jICBpZmRlZiBIQVZFX19fVkFfQ09QWQotIyAgIGRlZmluZSBWQV9DT1BZKGRlc3QsIHNyYykgX192YV9jb3B5KGRlc3QsIHNyYykKLSMgIGVsc2UKLSMgICBkZWZpbmUgVkFfQ09QWShkZXN0LCBzcmMpIChkZXN0KSA9IChzcmMpCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgSU5JVF9TWgkxMjgKLQotaW50Ci12YXNwcmludGYoY2hhciAqKnN0ciwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotCWludCByZXQgPSAtMTsKLQl2YV9saXN0IGFwMjsKLQljaGFyICpzdHJpbmcsICpuZXdzdHI7Ci0Jc2l6ZV90IGxlbjsKLQotCVZBX0NPUFkoYXAyLCBhcCk7Ci0JaWYgKChzdHJpbmcgPSBtYWxsb2MoSU5JVF9TWikpID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKLQotCXJldCA9IHZzbnByaW50ZihzdHJpbmcsIElOSVRfU1osIGZtdCwgYXAyKTsKLQlpZiAocmV0ID49IDAgJiYgcmV0IDwgSU5JVF9TWikgeyAvKiBzdWNjZWVkZWQgd2l0aCBpbml0aWFsIGFsbG9jICovCi0JCSpzdHIgPSBzdHJpbmc7Ci0JfSBlbHNlIGlmIChyZXQgPT0gSU5UX01BWCB8fCByZXQgPCAwKSB7IC8qIEJhZCBsZW5ndGggKi8KLQkJZnJlZShzdHJpbmcpOwotCQlnb3RvIGZhaWw7Ci0JfSBlbHNlIHsJLyogYmlnZ2VyIHRoYW4gaW5pdGlhbCwgcmVhbGxvYyBhbGxvd2luZyBmb3IgbnVsICovCi0JCWxlbiA9IChzaXplX3QpcmV0ICsgMTsKLQkJaWYgKChuZXdzdHIgPSByZWFsbG9jKHN0cmluZywgbGVuKSkgPT0gTlVMTCkgewotCQkJZnJlZShzdHJpbmcpOwotCQkJZ290byBmYWlsOwotCQl9IGVsc2UgewotCQkJdmFfZW5kKGFwMik7Ci0JCQlWQV9DT1BZKGFwMiwgYXApOwotCQkJcmV0ID0gdnNucHJpbnRmKG5ld3N0ciwgbGVuLCBmbXQsIGFwMik7Ci0JCQlpZiAocmV0ID49IDAgJiYgKHNpemVfdClyZXQgPCBsZW4pIHsKLQkJCQkqc3RyID0gbmV3c3RyOwotCQkJfSBlbHNlIHsgLyogZmFpbGVkIHdpdGggcmVhbGxvYydlZCBzdHJpbmcsIGdpdmUgdXAgKi8KLQkJCQlmcmVlKG5ld3N0cik7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQl9Ci0JfQotCXZhX2VuZChhcDIpOwotCXJldHVybiAocmV0KTsKLQotZmFpbDoKLQkqc3RyID0gTlVMTDsKLQllcnJubyA9IEVOT01FTTsKLQl2YV9lbmQoYXAyKTsKLQlyZXR1cm4gKC0xKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfQVNQUklOVEYKLWludCBhc3ByaW50ZihjaGFyICoqc3RyLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IGFwOwotCWludCByZXQ7Ci0JCi0JKnN0ciA9IE5VTEw7Ci0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JcmV0ID0gdmFzcHJpbnRmKHN0ciwgZm10LCBhcCk7Ci0JdmFfZW5kKGFwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L2JzZC1jbG9zZWZyb20uYyBiL29wZW5ic2QtY29tcGF0L2JzZC1jbG9zZWZyb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4MGIzMy4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9ic2QtY2xvc2Vmcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFRvZGQgQy4gTWlsbGVyIDxUb2RkLk1pbGxlckBjb3VydGVzYW4uY29tPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZuZGVmIEhBVkVfQ0xPU0VGUk9NCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfRkNOVExfSAotIyBpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaWZkZWYgSEFWRV9ESVJFTlRfSAotIyBpbmNsdWRlIDxkaXJlbnQuaD4KLSMgZGVmaW5lIE5BTUxFTihkaXJlbnQpIHN0cmxlbigoZGlyZW50KS0+ZF9uYW1lKQotI2Vsc2UKLSMgZGVmaW5lIGRpcmVudCBkaXJlY3QKLSMgZGVmaW5lIE5BTUxFTihkaXJlbnQpIChkaXJlbnQpLT5kX25hbWxlbgotIyBpZmRlZiBIQVZFX1NZU19ORElSX0gKLSMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfU1lTX0RJUl9ICi0jICBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfTkRJUl9ICi0jICBpbmNsdWRlIDxuZGlyLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBPUEVOX01BWAotIyBkZWZpbmUgT1BFTl9NQVgJMjU2Ci0jZW5kaWYKLQotI2lmIDAKLV9fdW51c2VkIHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPSAiJFN1ZG86IGNsb3NlZnJvbS5jLHYgMS4xMSAyMDA2LzA4LzE3IDE1OjI2OjU0IG1pbGxlcnQgRXhwICQiOwotI2VuZGlmIC8qIGxpbnQgKi8KLQotLyoKLSAqIENsb3NlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBsb3dmZC4KLSAqLwotI2lmZGVmIEhBVkVfRkNOVExfQ0xPU0VNCi12b2lkCi1jbG9zZWZyb20oaW50IGxvd2ZkKQotewotICAgICh2b2lkKSBmY250bChsb3dmZCwgRl9DTE9TRU0sIDApOwotfQotI2Vsc2UKLXZvaWQKLWNsb3NlZnJvbShpbnQgbG93ZmQpCi17Ci0gICAgbG9uZyBmZCwgbWF4ZmQ7Ci0jaWYgZGVmaW5lZChIQVZFX0RJUkZEKSAmJiBkZWZpbmVkKEhBVkVfUFJPQ19QSUQpCi0gICAgY2hhciBmZHBhdGhbUEFUSF9NQVhdLCAqZW5kcDsKLSAgICBzdHJ1Y3QgZGlyZW50ICpkZW50OwotICAgIERJUiAqZGlycDsKLSAgICBpbnQgbGVuOwotCi0gICAgLyogQ2hlY2sgZm9yIGEgL3Byb2MvJCQvZmQgZGlyZWN0b3J5LiAqLwotICAgIGxlbiA9IHNucHJpbnRmKGZkcGF0aCwgc2l6ZW9mKGZkcGF0aCksICIvcHJvYy8lbGQvZmQiLCAobG9uZylnZXRwaWQoKSk7Ci0gICAgaWYgKGxlbiA+IDAgJiYgKHNpemVfdClsZW4gPD0gc2l6ZW9mKGZkcGF0aCkgJiYgKGRpcnAgPSBvcGVuZGlyKGZkcGF0aCkpKSB7Ci0Jd2hpbGUgKChkZW50ID0gcmVhZGRpcihkaXJwKSkgIT0gTlVMTCkgewotCSAgICBmZCA9IHN0cnRvbChkZW50LT5kX25hbWUsICZlbmRwLCAxMCk7Ci0JICAgIGlmIChkZW50LT5kX25hbWUgIT0gZW5kcCAmJiAqZW5kcCA9PSAnXDAnICYmCi0JCWZkID49IDAgJiYgZmQgPCBJTlRfTUFYICYmIGZkID49IGxvd2ZkICYmIGZkICE9IGRpcmZkKGRpcnApKQotCQkodm9pZCkgY2xvc2UoKGludCkgZmQpOwotCX0KLQkodm9pZCkgY2xvc2VkaXIoZGlycCk7Ci0gICAgfSBlbHNlCi0jZW5kaWYKLSAgICB7Ci0JLyoKLQkgKiBGYWxsIGJhY2sgb24gc3lzY29uZigpIG9yIGdldGR0YWJsZXNpemUoKS4gIFdlIGF2b2lkIGNoZWNraW5nCi0JICogcmVzb3VyY2UgbGltaXRzIHNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvIG9wZW4gYSBmaWxlIGRlc2NyaXB0b3IKLQkgKiBhbmQgdGhlbiBkcm9wIHRoZSBybGltaXQgc3VjaCB0aGF0IGl0IGlzIGJlbG93IHRoZSBvcGVuIGZkLgotCSAqLwotI2lmZGVmIEhBVkVfU1lTQ09ORgotCW1heGZkID0gc3lzY29uZihfU0NfT1BFTl9NQVgpOwotI2Vsc2UKLQltYXhmZCA9IGdldGR0YWJsZXNpemUoKTsKLSNlbmRpZiAvKiBIQVZFX1NZU0NPTkYgKi8KLQlpZiAobWF4ZmQgPCAwKQotCSAgICBtYXhmZCA9IE9QRU5fTUFYOwotCi0JZm9yIChmZCA9IGxvd2ZkOyBmZCA8IG1heGZkOyBmZCsrKQotCSAgICAodm9pZCkgY2xvc2UoKGludCkgZmQpOwotICAgIH0KLX0KLSNlbmRpZiAvKiAhSEFWRV9GQ05UTF9DTE9TRU0gKi8KLSNlbmRpZiAvKiBIQVZFX0NMT1NFRlJPTSAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvYnNkLWNyYXkuYyBiL29wZW5ic2QtY29tcGF0L2JzZC1jcmF5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYmJkN2QuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvYnNkLWNyYXkuYworKysgL2Rldi9udWxsCkBAIC0xLDgxNyArMCwwIEBACi0vKiAKLSAqICRJZDogYnNkLWNyYXkuYyx2IDEuMTcgMjAwNy8wOC8xNSAwOToxNzo0MyBkdHVja2VyIEV4cCAkCi0gKgotICogYnNkLWNyYXkuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgQ3JheSBJbmMuICAoV2VuZHkgUGFsbSA8d2VuZHlwQGNyYXkuY29tPikKLSAqIFNpZ25pZmljYW50IHBvcnRpb25zIHByb3ZpZGVkIGJ5IAotICogICAgICAgICAgV2F5bmUgU2Nocm9lZGVyLCBTRFNDIDxzY2hyb2VkZXJAc2RzYy5lZHU+Ci0gKiAgICAgICAgICBXaWxsaWFtIEpvbmVzLCBVVGV4YXMgPGpvbmVzQHRhY2MudXRleGFzLmVkdT4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogQ3JlYXRlZDogQXByIDIyIDE2LjM0OjAwIDIwMDIgd3AKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBwcm9wZXIgZXhlY3V0aW9uCi0gKiBvbiBVTklDT1Mgc3lzdGVtcy4KLSAqCi0gKi8KLSNpZmRlZiBfVU5JQ09TCi0KLSNpbmNsdWRlIDx1ZGIuaD4KLSNpbmNsdWRlIDx0bXBkaXIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvY2F0ZWdvcnkuaD4KLSNpbmNsdWRlIDx1dG1wLmg+Ci0jaW5jbHVkZSA8c3lzL2p0YWIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvcHJpdi5oPgotI2luY2x1ZGUgPHN5cy9zZWNwYXJtLmg+Ci0jaW5jbHVkZSA8c3lzL3RmbS5oPgotI2luY2x1ZGUgPHN5cy91c3J2Lmg+Ci0jaW5jbHVkZSA8c3lzL3N5c3YuaD4KLSNpbmNsdWRlIDxzeXMvc2VjdGFiLmg+Ci0jaW5jbHVkZSA8c3lzL3NlY3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9zZXNzaW9uLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGlhLmg+Ci0jaW5jbHVkZSA8dXJtLmg+Ci0jaW5jbHVkZSAic3NoLmgiCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2luY2x1ZGUgInN5cy90eXBlcy5oIgotCi0jaWZuZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX1NUT1JBR0UKLSMgZGVmaW5lICAgICAgX1NTX01BWFNJWkUgICAgIDEyOCAgICAgLyogSW1wbGVtZW50YXRpb24gc3BlY2lmaWMgbWF4IHNpemUgKi8KLSMgZGVmaW5lICAgICAgIF9TU19QQURTSVpFICAgICAoX1NTX01BWFNJWkUgLSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcikpCi0KLSMgZGVmaW5lIHNzX2ZhbWlseSBzc19zYS5zYV9mYW1pbHkKLSNlbmRpZiAvKiAhSEFWRV9TVFJVQ1RfU09DS0FERFJfU1RPUkFHRSAqLwotCi0jaWZuZGVmIElONl9JU19BRERSX0xPT1BCQUNLCi0jIGRlZmluZSBJTjZfSVNfQUREUl9MT09QQkFDSyhhKSBcCi0JKCgodV9pbnQzMl90ICopIChhKSlbMF0gPT0gMCAmJiAoKHVfaW50MzJfdCAqKSAoYSkpWzFdID09IDAgJiYgXAotCSAoKHVfaW50MzJfdCAqKSAoYSkpWzJdID09IDAgJiYgKCh1X2ludDMyX3QgKikgKGEpKVszXSA9PSBodG9ubCAoMSkpCi0jZW5kaWYgLyogIUlONl9JU19BRERSX0xPT1BCQUNLICovCi0KLSNpZm5kZWYgQUZfSU5FVDYKLS8qIERlZmluZSBpdCB0byBzb21ldGhpbmcgdGhhdCBzaG91bGQgbmV2ZXIgYXBwZWFyICovCi0jZGVmaW5lIEFGX0lORVQ2IEFGX01BWAotI2VuZGlmCi0KLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJzZXJ2Y29uZi5oIgotI2luY2x1ZGUgImJzZC1jcmF5LmgiCi0KLSNkZWZpbmUgTUFYQUNJRCA4MAotCi1leHRlcm4gU2VydmVyT3B0aW9ucyBvcHRpb25zOwotCi1jaGFyIGNyYXlfdG1wZGlyW1RQQVRIU0laICsgMV07CQkgICAgLyogam9iIFRNUERJUiBwYXRoICovCi0KLXN0cnVjdCBzeXN2IHN5c3Y7CS8qIHN5c3RlbSBzZWN1cml0eSBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCB1c3J2IHVzcnY7CS8qIHVzZXIgc2VjdXJpdHkgc3RydWN0dXJlICovCi0KLS8qCi0gKiBGdW5jdGlvbnMuCi0gKi8KLXZvaWQgY3JheV9yZXRhaW5fdXRtcChzdHJ1Y3QgdXRtcCAqLCBpbnQpOwotdm9pZCBjcmF5X2RlbGV0ZV90bXBkaXIoY2hhciAqLCBpbnQsIHVpZF90KTsKLXZvaWQgY3JheV9pbml0X2pvYihzdHJ1Y3QgcGFzc3dkICopOwotdm9pZCBjcmF5X3NldF90bXBkaXIoc3RydWN0IHV0bXAgKik7Ci12b2lkIGNyYXlfbG9naW5fZmFpbHVyZShjaGFyICosIGludCk7Ci1pbnQgY3JheV9zZXR1cCh1aWRfdCwgY2hhciAqLCBjb25zdCBjaGFyICopOwotaW50IGNyYXlfYWNjZXNzX2RlbmllZChjaGFyICopOwotCi12b2lkCi1jcmF5X2xvZ2luX2ZhaWx1cmUoY2hhciAqdXNlcm5hbWUsIGludCBlcnJjb2RlKQotewotCXN0cnVjdCB1ZGIgKnVlcHRyOwkJLyogVURCIHBvaW50ZXIgZm9yIHVzZXJuYW1lICovCi0JaWFfZmFpbHVyZV90IGZzZW50OwkJLyogaWFfZmFpbHVyZSBzdHJ1Y3R1cmUgKi8KLQlpYV9mYWlsdXJlX3JldF90IGZyZXQ7CQkvKiBpYV9mYWlsdXJlIHJldHVybiBzdHVmZiAqLwotCXN0cnVjdCBqdGFiIGp0YWI7CQkvKiBqb2IgdGFibGUgc3RydWN0dXJlICovCi0JaW50IGppZCA9IDA7CQkJLyogam9iIGlkICovCi0KLQlpZiAoKGppZCA9IGdldGp0YWIoJmp0YWIpKSA8IDApCi0JCWRlYnVnKCJjcmF5X2xvZ2luX2ZhaWx1cmUoKTogZ2V0anRhYiBlcnJvciIpOwotCi0JZ2V0c3lzdWRiKCk7Ci0JaWYgKCh1ZXB0ciA9IGdldHVkYm5hbSh1c2VybmFtZSkpID09IFVEQl9OVUxMKQotCQlkZWJ1ZygiY3JheV9sb2dpbl9mYWlsdXJlKCk6IGdldHVkYm5hbWUoKSByZXR1cm5lZCBOVUxMIik7Ci0JZW5kdWRiKCk7Ci0KLQltZW1zZXQoJmZzZW50LCAnXDAnLCBzaXplb2YoZnNlbnQpKTsKLQlmc2VudC5yZXZpc2lvbiA9IDA7Ci0JZnNlbnQudW5hbWUgPSB1c2VybmFtZTsKLQlmc2VudC5ob3N0ID0gKGNoYXIgKilnZXRfY2Fub25pY2FsX2hvc3RuYW1lKG9wdGlvbnMudXNlX2Rucyk7Ci0JZnNlbnQudHR5biA9ICJzc2hkIjsKLQlmc2VudC5jYWxsZXIgPSBJQV9TU0hEOwotCWZzZW50LmZsYWdzID0gSUFfSU5URVJBQ1RJVkU7Ci0JZnNlbnQudWVwdHIgPSB1ZXB0cjsKLQlmc2VudC5qaWQgPSBqaWQ7Ci0JZnNlbnQuZXJyY29kZSA9IGVycmNvZGU7Ci0JZnNlbnQucHdkcCA9IE5VTEw7Ci0JZnNlbnQuZXhpdGNvZGUgPSAwOwkvKiBkb250IGV4aXQgaW4gaWFfZmFpbHVyZSgpICovCi0KLQlmcmV0LnJldmlzaW9uID0gMDsKLQlmcmV0Lm5vcm1hbCA9IDA7Ci0KLQkvKgotCSAqIENhbGwgaWFfZmFpbHVyZSBiZWNhdXNlIG9mIGFuIGxvZ2luIGZhaWx1cmUuCi0JICovCi0JaWFfZmFpbHVyZSgmZnNlbnQsICZmcmV0KTsKLX0KLQotLyoKLSAqICBDcmF5IGFjY2VzcyBkZW5pZWQKLSAqLwotaW50Ci1jcmF5X2FjY2Vzc19kZW5pZWQoY2hhciAqdXNlcm5hbWUpCi17Ci0Jc3RydWN0IHVkYiAqdWVwdHI7CQkvKiBVREIgcG9pbnRlciBmb3IgdXNlcm5hbWUgKi8KLQlpbnQgZXJyY29kZTsJCQkvKiBJQSBlcnJvcmNvZGUgKi8KLQotCWVycmNvZGUgPSAwOwotCWdldHN5c3VkYigpOwotCWlmICgodWVwdHIgPSBnZXR1ZGJuYW0odXNlcm5hbWUpKSA9PSBVREJfTlVMTCkKLQkJZGVidWcoImNyYXlfbG9naW5fZmFpbHVyZSgpOiBnZXR1ZGJuYW1lKCkgcmV0dXJuZWQgTlVMTCIpOwotCWVuZHVkYigpOwotCi0JaWYgKHVlcHRyICE9IE5VTEwgJiYgdWVwdHItPnVlX2Rpc2FibGVkKQotCQllcnJjb2RlID0gSUFfRElTQUJMRUQ7Ci0JaWYgKGVycmNvZGUpCi0JCWNyYXlfbG9naW5fZmFpbHVyZSh1c2VybmFtZSwgZXJyY29kZSk7Ci0KLQlyZXR1cm4gKGVycmNvZGUpOwotfQotCi0vKgotICogcmVjb3JkX2ZhaWxlZF9sb2dpbjogZ2VuZXJpYyAibG9naW4gZmFpbGVkIiBpbnRlcmZhY2UgZnVuY3Rpb24KLSAqLwotdm9pZAotcmVjb3JkX2ZhaWxlZF9sb2dpbihjb25zdCBjaGFyICp1c2VyLCBjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3QgY2hhciAqdHR5bmFtZSkKLXsKLQljcmF5X2xvZ2luX2ZhaWx1cmUoKGNoYXIgKil1c2VyLCBJQV9VREJFUlIpOwotfQotCi1pbnQKLWNyYXlfc2V0dXAgKHVpZF90IHVpZCwgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKmNvbW1hbmQpCi17Ci0JZXh0ZXJuIHN0cnVjdCB1ZGIgKmdldHVkYigpOwotCWV4dGVybiBjaGFyICpzZXRsaW1pdHMoKTsKLQotCWludCBlcnI7CQkJLyogZXJyb3IgcmV0dXJuICovCi0JdGltZV90IHN5c3RlbV90aW1lOwkJLyogY3VycmVudCBzeXN0ZW0gY2xvY2sgKi8KLQl0aW1lX3QgZXhwaXJhdGlvbl90aW1lOwkJLyogcGFzc3dvcmQgZXhwaXJhdGlvbiB0aW1lICovCi0JaW50IG1heGF0dGVtcHRzOwkJLyogbWF4aW11bSBuby4gb2YgZmFpbGVkIGxvZ2luIGF0dGVtcHRzICovCi0JaW50IFNlY3VyZVN5czsJCQkvKiB1bmljb3Mgc2VjdXJpdHkgZmxhZyAqLwotCWludCBtaW5zbGV2ZWwgPSAwOwkJLyogc3lzdGVtIG1pbmltdW0gc2VjdXJpdHkgbGV2ZWwgKi8KLQlpbnQgaSwgajsKLQlpbnQgdmFsaWRfYWNjdCA9IC0xOwkJLyogZmxhZyBmb3IgcmVhZGluZyB2YWxpZCBhY2N0ICovCi0JY2hhciBhY2N0X25hbWVbTUFYQUNJRF0gPSB7ICIiIH07IC8qIHVzZWQgdG8gcmVhZCBhY2N0IG5hbWUgKi8KLQlzdHJ1Y3QganRhYiBqdGFiOwkJLyogSm9iIHRhYmxlIHN0cnVjdCAqLwotCXN0cnVjdCB1ZGIgdWU7CQkJLyogdWRiIGVudHJ5IGZvciBsb2dnaW5nLWluIHVzZXIgKi8KLQlzdHJ1Y3QgdWRiICp1cDsJCQkvKiBwb2ludGVyIHRvIFVEQiBlbnRyeSAqLwotCXN0cnVjdCBzZWNzdGF0IHNlY2luZm87CQkvKiBmaWxlICBzZWN1cml0eSBhdHRyaWJ1dGVzICovCi0Jc3RydWN0IHNlcnZwcm92IGluaXRfaW5mbzsJLyogdXNlZCBmb3Igc2Vzc2NudGwoKSBjYWxsICovCi0JaW50IGppZDsJCQkvKiBqb2IgSUQgKi8KLQlpbnQgcGlkOwkJCS8qIHByb2Nlc3MgSUQgKi8KLQljaGFyICpzcjsJCQkvKiBzdGF0dXMgcmV0dXJuIGZyb20gc2V0bGltaXRzKCkgKi8KLQljaGFyICp0dHluID0gTlVMTDsJCS8qIHR0eW5hbWUgb3IgY29tbWFuZCBuYW1lKi8KLQljaGFyIGhvc3RuYW1lW01BWEhPU1ROQU1FTEVOXTsKLQkvKiBwYXNzd2Qgc3R1ZmYgZm9yIGlhX3VzZXIgKi8KLQlwYXNzd2RfdCBwd2RhY20sIHB3ZGRpYWx1cCwgcHdkdWRiLCBwd2R3YWwsIHB3ZGRjZTsKLQlpYV91c2VyX3JldF90IHVyZXQ7CQkvKiBzdHVmZiByZXR1cm5lZCBmcm9tIGlhX3VzZXIgKi8KLQlpYV91c2VyX3QgdXNlbnQ7CQkvKiBpYV91c2VyIG1haW4gc3RydWN0dXJlICovCi0JaW50IGlhX3Jjb2RlOwkJCS8qIGlhX3VzZXIgcmV0dXJuIGNvZGUgKi8KLQlpYV9mYWlsdXJlX3QgZnNlbnQ7CQkvKiBpYV9mYWlsdXJlIHN0cnVjdHVyZSAqLwotCWlhX2ZhaWx1cmVfcmV0X3QgZnJldDsJCS8qIGlhX2ZhaWx1cmUgcmV0dXJuIHN0dWZmICovCi0JaWFfc3VjY2Vzc190IHNzZW50OwkJLyogaWFfc3VjY2VzcyBzdHJ1Y3R1cmUgKi8KLQlpYV9zdWNjZXNzX3JldF90IHNyZXQ7CQkvKiBpYV9zdWNjZXNzIHJldHVybiBzdHVmZiAqLwotCWludCBpYV9tbHNyY29kZTsJCS8qIGlhX21sc3VzZXIgcmV0dXJuIGNvZGUgKi8KLQlpbnQgc2Vjc3RhdHJjOwkJCS8qIFtmXXNlY3N0YXQgcmV0dXJuIGNvZGUgKi8KLQotCWlmIChTZWN1cmVTeXMgPSAoaW50KXN5c2NvbmYoX1NDX0NSQVlfU0VDVVJFX1NZUykpIHsKLQkJZ2V0c3lzdigmc3lzdiwgc2l6ZW9mKHN0cnVjdCBzeXN2KSk7Ci0JCW1pbnNsZXZlbCA9IHN5c3Yuc3lfbWlubHZsOwotCQlpZiAoZ2V0dXNydigmdXNydikgPCAwKQotCQkJZmF0YWwoImdldHVzcnYoKSBmYWlsZWQsIGVycm5vID0gJWQiLCBlcnJubyk7Ci0JfQotCWhvc3RuYW1lWzBdID0gJ1wwJzsKLQlzdHJsY3B5KGhvc3RuYW1lLAotCSAgIChjaGFyICopZ2V0X2Nhbm9uaWNhbF9ob3N0bmFtZShvcHRpb25zLnVzZV9kbnMpLAotCSAgIE1BWEhPU1ROQU1FTEVOKTsKLQkvKgotCSAqICBGZXRjaCB1c2VyJ3MgVURCIGVudHJ5LgotCSAqLwotCWdldHN5c3VkYigpOwotCWlmICgodXAgPSBnZXR1ZGJuYW0odXNlcm5hbWUpKSA9PSBVREJfTlVMTCkKLQkJZmF0YWwoImNhbm5vdCBmZXRjaCB1c2VyJ3MgVURCIGVudHJ5Iik7Ci0KLQkvKgotCSAqICBQcmV2ZW50IGFueSBwb3NzaWJsZSBmdWRnaW5nIHNvIHBlcmZvcm0gYSBkYXRhCi0JICogIHNhZmV0eSBjaGVjayBhbmQgY29tcGFyZSB0aGUgc3VwcGxpZWQgdWlkIGFnYWluc3QKLQkgKiAgdGhlIHVkYidzIHVpZC4KLQkgKi8KLQlpZiAodXAtPnVlX3VpZCAhPSB1aWQpCi0JCWZhdGFsKCJJQSB1aWQgbWlzc21hdGNoIik7Ci0JZW5kdWRiKCk7Ci0KLQlpZiAoKGppZCA9IGdldGp0YWIoJmp0YWIpKSA8IDApIHsKLQkJZGVidWcoImdldGp0YWIiKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JcGlkID0gZ2V0cGlkKCk7Ci0JdHR5biA9IHR0eW5hbWUoMCk7Ci0JaWYgKFNlY3VyZVN5cykgewotCQlpZiAodHR5biAhPSBOVUxMKQotCQkJc2Vjc3RhdHJjID0gc2Vjc3RhdCh0dHluLCAmc2VjaW5mbyk7Ci0JCWVsc2UKLQkJCXNlY3N0YXRyYyA9IGZzZWNzdGF0KDEsICZzZWNpbmZvKTsKLQotCQlpZiAoc2Vjc3RhdHJjID09IDApCi0JCQlkZWJ1ZygiW2Zdc2Vjc3RhdCgpIHN1Y2Nlc3NmdWwiKTsKLQkJZWxzZQotCQkJZmF0YWwoIltmXXNlY3N0YXQoKSBlcnJvciwgcmMgPSAlZCIsIHNlY3N0YXRyYyk7Ci0JfQotCWlmICgodHR5biA9PSBOVUxMKSAmJiAoKGNoYXIgKiljb21tYW5kICE9IE5VTEwpKQotCQl0dHluID0gKGNoYXIgKiljb21tYW5kOwotCS8qCi0JICogIEluaXRpYWxpemUgYWxsIHN0cnVjdHVyZXMgdG8gY2FsbCBpYV91c2VyCi0JICovCi0JdXNlbnQucmV2aXNpb24gPSAwOwotCXVzZW50LnVuYW1lID0gdXNlcm5hbWU7Ci0JdXNlbnQuaG9zdCA9IGhvc3RuYW1lOwotCXVzZW50LnR0eW4gPSB0dHluOwotCXVzZW50LmNhbGxlciA9IElBX1NTSEQ7IAotCXVzZW50LnBzd2RsaXN0ID0gJnB3ZGFjbTsKLQl1c2VudC51ZXB0ciA9ICZ1ZTsKLQl1c2VudC5mbGFncyA9IElBX0lOVEVSQUNUSVZFIHwgSUFfRkZMQUc7Ci0JcHdkYWNtLmF0eXBlID0gSUFfU0VDVVJJRDsKLQlwd2RhY20ucHdkcCA9IE5VTEw7Ci0JcHdkYWNtLm5leHQgPSAmcHdkdWRiOwotCi0JcHdkdWRiLmF0eXBlID0gSUFfVURCOwotCXB3ZHVkYi5wd2RwID0gTlVMTDsKLQlwd2R1ZGIubmV4dCA9ICZwd2RkY2U7Ci0KLQlwd2RkY2UuYXR5cGUgPSBJQV9EQ0U7Ci0JcHdkZGNlLnB3ZHAgPSBOVUxMOwotCXB3ZGRjZS5uZXh0ID0gJnB3ZGRpYWx1cDsKLQotCXB3ZGRpYWx1cC5hdHlwZSA9IElBX0RJQUxVUDsKLQlwd2RkaWFsdXAucHdkcCA9IE5VTEw7Ci0JLyogcHdkZGlhbHVwLm5leHQgPSAmcHdkd2FsOyAqLwotCXB3ZGRpYWx1cC5uZXh0ID0gTlVMTDsKLQotCXB3ZHdhbC5hdHlwZSA9IElBX1dBTDsKLQlwd2R3YWwucHdkcCA9IE5VTEw7Ci0JcHdkd2FsLm5leHQgPSBOVUxMOwotCi0JdXJldC5yZXZpc2lvbiA9IDA7Ci0JdXJldC5wc3dkID0gTlVMTDsKLQl1cmV0Lm5vcm1hbCA9IDA7Ci0KLQlpYV9yY29kZSA9IGlhX3VzZXIoJnVzZW50LCAmdXJldCk7Ci0Jc3dpdGNoIChpYV9yY29kZSkgewotCS8qCi0JICogIFRoZXNlIGFyZSBhY2NlcHRhYmxlIHJldHVybiBjb2RlcyBmcm9tIGlhX3VzZXIoKQotCSAqLwotCWNhc2UgSUFfVURCV0VFSzogICAgICAgIC8qIFBhc3N3b3JkIEV4cGlyZXMgaW4gMSB3ZWVrICovCi0JCWV4cGlyYXRpb25fdGltZSA9IHVlLnVlX3B3YWdlLnRpbWUgKyB1ZS51ZV9wd2FnZS5tYXhhZ2U7Ci0JCXByaW50ZiAoIldBUk5JTkcgLSB5b3VyIGN1cnJlbnQgcGFzc3dvcmQgd2lsbCBleHBpcmUgJXNcbiIsCi0JCWN0aW1lKChjb25zdCB0aW1lX3QgKikmZXhwaXJhdGlvbl90aW1lKSk7Ci0JCWJyZWFrOwotCWNhc2UgSUFfVURCRVhQSVJFRDoKLQkJaWYgKHR0eW5hbWUoMCkgIT0gTlVMTCkgewotCQkJLyogRm9yY2UgYSBwYXNzd29yZCBjaGFuZ2UgKi8KLQkJCXByaW50ZigiWW91ciBwYXNzd29yZCBoYXMgZXhwaXJlZDsgQ2hvb3NlIGEgbmV3IG9uZS5cbiIpOwotCQkJZXhlY2woIi9iaW4vcGFzc3dkIiwgInBhc3N3ZCIsIHVzZXJuYW1lLCAwKTsKLQkJCWV4aXQoOSk7Ci0JCQl9Ci0JCWJyZWFrOwotCWNhc2UgSUFfTk9STUFMOiAgICAgICAgIC8qIE5vcm1hbCBSZXR1cm4gQ29kZSAqLwotCQlicmVhazsKLQljYXNlIElBX0JBQ0tET09SOgotCQkvKiBYWFg6IGNhbiB3ZSBtZW1zZXQgaXQgdG8gemVybyBoZXJlIHNvIHNhdmUgc29tZSBvZiB0aGlzICovCi0JCXN0cmxjcHkodWUudWVfbmFtZSwgInJvb3QiLCBzaXplb2YodWUudWVfbmFtZSkpOwotCQlzdHJsY3B5KHVlLnVlX2RpciwgIi8iLCBzaXplb2YodWUudWVfZGlyKSk7Ci0JCXN0cmxjcHkodWUudWVfc2hlbGwsICIvYmluL3NoIiwgc2l6ZW9mKHVlLnVlX3NoZWxsKSk7Ci0KLQkJdWUudWVfcGFzc3dkWzBdID0gJ1wwJzsKLQkJdWUudWVfYWdlWzBdID0gJ1wwJzsKLQkJdWUudWVfY29tbWVudFswXSA9ICdcMCc7Ci0JCXVlLnVlX2xvZ2hvc3RbMF0gPSAnXDAnOwotCQl1ZS51ZV9sb2dsaW5lWzBdID0gJ1wwJzsKLQotCQl1ZS51ZV91aWQgPSAtMTsKLQkJdWUudWVfbmljZVtVREJSQ19JTlRFUl0gPSAwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBNQVhWSURTOyBpKyspCi0JCQl1ZS51ZV9naWRzW2ldID0gMDsKLQotCQl1ZS51ZV9sb2dmYWlscyA9IDA7Ci0JCXVlLnVlX21pbmx2bCA9IHVlLnVlX21heGx2bCA9IHVlLnVlX2RlZmx2bCA9IG1pbnNsZXZlbDsKLQkJdWUudWVfZGVmY29tcHMgPSAwOwotCQl1ZS51ZV9jb21wYXJ0cyA9IDA7Ci0JCXVlLnVlX3Blcm1pdHMgPSAwOwotCQl1ZS51ZV90cmFwID0gMDsKLQkJdWUudWVfZGlzYWJsZWQgPSAwOwotCQl1ZS51ZV9sb2d0aW1lID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBJQV9DT05TT0xFOiAgICAgICAgLyogU3VwZXJ1c2VyIG5vdCBmcm9tIENvbnNvbGUgKi8KLQljYXNlIElBX1RSVVNURUQ6CS8qIFRydXN0ZWQgdXNlciAqLwotCQlpZiAob3B0aW9ucy5wZXJtaXRfcm9vdF9sb2dpbiA+IFBFUk1JVF9OTykKLQkJCWJyZWFrOwkvKiBBY2NlcHQgcm9vdCBsb2dpbiAqLwotCWRlZmF1bHQ6Ci0JLyoKLQkgKiAgVGhlc2UgYXJlIGZhaWxlZCByZXR1cm4gY29kZXMgZnJvbSBpYV91c2VyKCkKLQkgKi8KLQkJc3dpdGNoIChpYV9yY29kZSkgCi0JCXsKLQkJY2FzZSBJQV9CQURBVVRIOgotCQkJcHJpbnRmKCJCYWQgYXV0aG9yaXphdGlvbiwgYWNjZXNzIGRlbmllZC5cbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUFfRElTQUJMRUQ6Ci0JCQlwcmludGYoIllvdXIgbG9naW4gaGFzIGJlZW4gZGlzYWJsZWQuIENvbnRhY3QgdGhlIHN5c3RlbSAiKTsKLQkJCXByaW50ZigiYWRtaW5pc3RyYXRvciBmb3IgYXNzaXN0YW5jZS5cbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUFfR0VUU1lTVjoKLQkJCXByaW50ZigiZ2V0c3lzdigpIGZhaWxlZCAtIGVycm5vID0gJWRcbiIsIGVycm5vKTsKLQkJCWJyZWFrOwotCQljYXNlIElBX01BWExPR1M6Ci0JCQlwcmludGYoIk1heGltdW0gbnVtYmVyIG9mIGZhaWxlZCBsb2dpbiBhdHRlbXB0cyBleGNlZWRlZC5cbiIpOwotCQkJcHJpbnRmKCJBY2Nlc3MgZGVuaWVkLlxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBJQV9VREJQV0ROVUxMOgotCQkJaWYgKFNlY3VyZVN5cykKLQkJCQlwcmludGYoIk5VTEwgUGFzc3dvcmQgbm90IGFsbG93ZWQgb24gTUxTIHN5c3RlbXMuXG4iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgotCQkgKiAgQXV0aGVudGljYXRpb24gZmFpbGVkLgotCQkgKi8KLQkJcHJpbnRmKCJzc2hkOiBMb2dpbiBpbmNvcnJlY3QsICgwJW8pXG4iLAotCQkgICAgaWFfcmNvZGUtSUFfRVJST1JDT0RFKTsKLQotCQkvKgotCQkgKiAgSW5pdGlhbGl6ZSBzdHJ1Y3R1cmUgZm9yIGlhX2ZhaWx1cmUKLQkJICogIHdoaWNoIHdpbGwgZXhpdC4KLQkJICovCi0JCWZzZW50LnJldmlzaW9uID0gMDsKLQkJZnNlbnQudW5hbWUgPSB1c2VybmFtZTsKLQkJZnNlbnQuaG9zdCA9IGhvc3RuYW1lOwotCQlmc2VudC50dHluID0gdHR5bjsKLQkJZnNlbnQuY2FsbGVyID0gSUFfU1NIRDsKLQkJZnNlbnQuZmxhZ3MgPSBJQV9JTlRFUkFDVElWRTsKLQkJZnNlbnQudWVwdHIgPSAmdWU7Ci0JCWZzZW50LmppZCA9IGppZDsKLQkJZnNlbnQuZXJyY29kZSA9IGlhX3Jjb2RlOwotCQlmc2VudC5wd2RwID0gdXJldC5wc3dkOwotCQlmc2VudC5leGl0Y29kZSA9IDE7Ci0KLQkJZnJldC5yZXZpc2lvbiA9IDA7Ci0JCWZyZXQubm9ybWFsID0gMDsKLQotCQkvKgotCQkqICBDYWxsIGlhX2ZhaWx1cmUgYmVjYXVzZSBvZiBhbiBJQSBmYWlsdXJlLgotCQkqICBUaGVyZSBpcyBubyByZXR1cm4gYmVjYXVzZSBpYV9mYWlsdXJlIGV4aXRzLgotCQkqLwotCQlpYV9mYWlsdXJlKCZmc2VudCwgJmZyZXQpOwotCi0JCWV4aXQoMSk7IAotCX0KLQotCWlhX21sc3Jjb2RlID0gSUFfTk9STUFMOwotCWlmIChTZWN1cmVTeXMpIHsKLQkJZGVidWcoImNhbGxpbmcgaWFfbWxzdXNlcigpIik7Ci0JCWlhX21sc3Jjb2RlID0gaWFfbWxzdXNlcigmdWUsICZzZWNpbmZvLCAmdXNydiwgTlVMTCwgMCk7Ci0JfQotCWlmIChpYV9tbHNyY29kZSAhPSBJQV9OT1JNQUwpIHsKLQkJcHJpbnRmKCJzc2hkOiBMb2dpbiBpbmNvcnJlY3QsICgwJW8pXG4iLAotCQkgICAgaWFfbWxzcmNvZGUtSUFfRVJST1JDT0RFKTsKLQkJLyoKLQkJICogIEluaXRpYWxpemUgc3RydWN0dXJlIGZvciBpYV9mYWlsdXJlCi0JCSAqICB3aGljaCB3aWxsIGV4aXQuCi0JCSAqLwotCQlmc2VudC5yZXZpc2lvbiA9IDA7Ci0JCWZzZW50LnVuYW1lID0gdXNlcm5hbWU7Ci0JCWZzZW50Lmhvc3QgPSBob3N0bmFtZTsKLQkJZnNlbnQudHR5biA9IHR0eW47Ci0JCWZzZW50LmNhbGxlciA9IElBX1NTSEQ7Ci0JCWZzZW50LmZsYWdzID0gSUFfSU5URVJBQ1RJVkU7Ci0JCWZzZW50LnVlcHRyID0gJnVlOwotCQlmc2VudC5qaWQgID0gamlkOwotCQlmc2VudC5lcnJjb2RlID0gaWFfbWxzcmNvZGU7Ci0JCWZzZW50LnB3ZHAgPSB1cmV0LnBzd2Q7Ci0JCWZzZW50LmV4aXRjb2RlID0gMTsKLQkJZnJldC5yZXZpc2lvbiA9IDA7Ci0JCWZyZXQubm9ybWFsID0gMDsKLQotCQkvKgotCQkgKiAgQ2FsbCBpYV9mYWlsdXJlIGJlY2F1c2Ugb2YgYW4gSUEgZmFpbHVyZS4KLQkJICogIFRoZXJlIGlzIG5vIHJldHVybiBiZWNhdXNlIGlhX2ZhaWx1cmUgZXhpdHMuCi0JCSAqLwotCQlpYV9mYWlsdXJlKCZmc2VudCwmZnJldCk7Ci0JCWV4aXQoMSk7IAotCX0KLQotCS8qIFByb3ZpZGUgbG9naW4gc3RhdHVzIGluZm9ybWF0aW9uICovCi0JaWYgKG9wdGlvbnMucHJpbnRfbGFzdGxvZyAmJiB1ZS51ZV9sb2d0aW1lICE9IDApIHsKLQkJcHJpbnRmKCJMYXN0IHN1Y2Nlc3NmdWwgbG9naW4gd2FzIDogJS4qcyAiLCAxOSwKLQkJICAgIChjaGFyICopY3RpbWUoJnVlLnVlX2xvZ3RpbWUpKTsKLQotCQlpZiAoKnVlLnVlX2xvZ2hvc3QgIT0gJ1wwJykgewotCQkJcHJpbnRmKCJmcm9tICUuKnNcbiIsIHNpemVvZih1ZS51ZV9sb2dob3N0KSwKLQkJCSAgICB1ZS51ZV9sb2dob3N0KTsKLQkJfSBlbHNlIHsKLQkJCXByaW50Zigib24gJS4qc1xuIiwgc2l6ZW9mKHVlLnVlX2xvZ2xpbmUpLAotCQkJICAgIHVlLnVlX2xvZ2xpbmUpOwotCQl9Ci0KLQkJaWYgKFNlY3VyZVN5cyAmJiAodWUudWVfbG9nZmFpbHMgIT0gMCkpIHsKLQkJCXByaW50ZigiICBmb2xsb3dlZCBieSAlZCBmYWlsZWQgYXR0ZW1wdHNcbiIsCi0JCQkgICAgdWUudWVfbG9nZmFpbHMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDYWxsIGlhX3N1Y2Nlc3MgdG8gcHJvY2VzcyBzdWNjZXNzZnVsIEkvQS4KLQkgKi8KLQlzc2VudC5yZXZpc2lvbiA9IDA7Ci0Jc3NlbnQudW5hbWUgPSB1c2VybmFtZTsKLQlzc2VudC5ob3N0ID0gaG9zdG5hbWU7Ci0Jc3NlbnQudHR5biA9IHR0eW47Ci0Jc3NlbnQuY2FsbGVyID0gSUFfU1NIRDsKLQlzc2VudC5mbGFncyA9IElBX0lOVEVSQUNUSVZFOwotCXNzZW50LnVlcHRyID0gJnVlOwotCXNzZW50LmppZCA9IGppZDsKLQlzc2VudC5lcnJjb2RlID0gaWFfcmNvZGU7Ci0Jc3NlbnQudXMgPSBOVUxMOwotCXNzZW50LnRpbWUgPSAxOwkvKiBTZXQgdWVfbG9ndGltZSAqLwotCi0Jc3JldC5yZXZpc2lvbiA9IDA7Ci0Jc3JldC5ub3JtYWwgPSAwOwotCi0JaWFfc3VjY2Vzcygmc3NlbnQsICZzcmV0KTsKLQotCS8qCi0JICogUXVlcnkgZm9yIGFjY291bnQsIGlmZiA+IDEgdmFsaWQgYWNpZCAmIGFza2FjaWQgcGVybWJpdAotCSAqLwotCWlmICgoKHVlLnVlX3Blcm1iaXRzICYgUEVSTUJJVFNfQUNDVElEKSB8fAotCSAgICAodWUudWVfYWNpZHNbMF0gPj0gMCkgJiYgKHVlLnVlX2FjaWRzWzFdID49IDApKSAmJgotCSAgICB1ZS51ZV9wZXJtYml0cyAmIFBFUk1CSVRTX0FTS0FDSUQpIHsKLQkJaWYgKHR0eW5hbWUoMCkgIT0gTlVMTCkgewotCQkJZGVidWcoImNyYXlfc2V0dXA6IHR0eW5hbWUgdHJ1ZSBjYXNlLCAlLjEwMHMiLCB0dHluYW1lKTsKLQkJCXdoaWxlICh2YWxpZF9hY2N0ID09IC0xKSB7Ci0JCQkJcHJpbnRmKCJBY2NvdW50ICg/IGZvciBhdmFpbGFibGUgYWNjb3VudHMpIgotCQkJCSAgICAiIFslc106ICIsIGFjaWQybmFtKHVlLnVlX2FjaWRzWzBdKSk7Ci0JCQkJZmdldHMoYWNjdF9uYW1lLCBNQVhBQ0lELCBzdGRpbik7Ci0JCQkJc3dpdGNoIChhY2N0X25hbWVbMF0pIHsKLQkJCQljYXNlIEVPRjoKLQkJCQkJZXhpdCgwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXDAnOgotCQkJCQl2YWxpZF9hY2N0ID0gdWUudWVfYWNpZHNbMF07Ci0JCQkJCXN0cmxjcHkoYWNjdF9uYW1lLCBhY2lkMm5hbSh2YWxpZF9hY2N0KSwgTUFYQUNJRCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJz8nOgotCQkJCQkvKiBQcmludCB0aGUgbGlzdCAzIHdpZGUgKi8KLQkJCQkJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBNQVhWSURTOyBpKyspIHsKLQkJCQkJCWlmICh1ZS51ZV9hY2lkc1tpXSA9PSAtMSkgewotCQkJCQkJCXByaW50ZigiXG4iKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWlmICgrK2ogPT0gNCkgewotCQkJCQkJCWogPSAxOwotCQkJCQkJCXByaW50ZigiXG4iKTsKLQkJCQkJCX0KLQkJCQkJCXByaW50ZigiICVzIiwKLQkJCQkJCSAgICBhY2lkMm5hbSh1ZS51ZV9hY2lkc1tpXSkpOwotCQkJCQl9Ci0JCQkJCWlmICh1ZS51ZV9wZXJtYml0cyAmIFBFUk1CSVRTX0FDQ1RJRCkgewotCQkJCQkJcHJpbnRmKCJcImFjY3RpZFwiIHBlcm1iaXQgYWxzbyBhbGxvd3MiCi0JCQkJCQkgICAgIiB5b3UgdG8gc2VsZWN0IGFueSB2YWxpZCAiCi0JCQkJCQkgICAgImFjY291bnQgbmFtZS5cbiIpOwotCQkJCQl9Ci0JCQkJCXByaW50ZigiXG4iKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdmFsaWRfYWNjdCA9IG5hbTJhY2lkKGFjY3RfbmFtZSk7Ci0JCQkJCWlmICh2YWxpZF9hY2N0ID09IC0xKSAKLQkJCQkJCXByaW50ZigKLQkJCQkJCSAgICAiQWNjb3VudCBpZCBub3QgZm91bmQgZm9yIgotCQkJCQkJICAgICIgYWNjb3VudCBuYW1lIFwiJXNcIlxuXG4iLAotCQkJCQkJICAgIGFjY3RfbmFtZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKgotCQkJCSAqIElmIGFuIGFjY291bnQgd2FzIGdpdmVuLCBzZWFyY2ggdGhlIHVzZXIncwotCQkJCSAqIGFjaWRzIGFycmF5IHRvIHZlcmlmeSB0aGV5IGNhbiB1c2UgdGhpcyBhY2NvdW50LgotCQkJCSAqLwotCQkJCWlmICgodmFsaWRfYWNjdCAhPSAtMSkgJiYKLQkJCQkgICAgISh1ZS51ZV9wZXJtYml0cyAmIFBFUk1CSVRTX0FDQ1RJRCkpIHsKLQkJCQkJZm9yIChpID0gMDsgaSA8IE1BWFZJRFM7IGkrKykgewotCQkJCQkJaWYgKHVlLnVlX2FjaWRzW2ldID09IC0xKQotCQkJCQkJCWJyZWFrOwotCQkJCQkJaWYgKHZhbGlkX2FjY3QgPT0gdWUudWVfYWNpZHNbaV0pCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKGkgPT0gTUFYVklEUyB8fAotCQkJCQkgICAgdWUudWVfYWNpZHNbaV0gPT0gLTEpIHsKLQkJCQkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHNldCIKLQkJCQkJCSAgICAiIGFjY291bnQgbmFtZSB0byAiCi0JCQkJCQkgICAgIlwiJXNcIiwgcGVybWlzc2lvbiAiCi0JCQkJCQkgICAgImRlbmllZFxuXG4iLCBhY2N0X25hbWUpOwotCQkJCQkJdmFsaWRfYWNjdCA9IC0xOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIFRoZSBjbGllbnQgaXNuJ3QgY29ubmVjdGVkIHRvIGEgdGVybWluYWwgYW5kIGNhbid0Ci0JCQkgKiByZXNwb25kIHRvIGFuIGFjaWQgcHJvbXB0LiAgVXNlIGRlZmF1bHQgYWNpZC4KLQkJCSAqLwotCQkJZGVidWcoImNyYXlfc2V0dXA6IHR0eW5hbWUgZmFsc2UgY2FzZSwgJS4xMDBzIiwKLQkJCSAgICB0dHluYW1lKTsKLQkJCXZhbGlkX2FjY3QgPSB1ZS51ZV9hY2lkc1swXTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSB0aGUgYXNrYWNpZCBwZXJtYml0IHNldCBvcgotCQkgKiBvbmx5IGhhcyBvbmUgdmFsaWQgYWNjb3VudCB0byB1c2UuCi0JCSAqLwotCQl2YWxpZF9hY2N0ID0gdWUudWVfYWNpZHNbMF07Ci0JfQotCWlmIChhY2N0aWQoMCwgdmFsaWRfYWNjdCkgPCAwKSB7Ci0JCXByaW50ZiAoIkJhZCBhY2NvdW50IGlkOiAlZFxuIiwgdmFsaWRfYWNjdCk7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JLyogCi0JICogTm93IHNldCBzaGFyZXMsIHF1b3RhcywgbGltaXRzLCBpbmNsdWRpbmcgQ1BVIHRpbWUgZm9yIHRoZSAKLQkgKiAoaW50ZXJhY3RpdmUpIGpvYiBhbmQgcHJvY2VzcywgYW5kIHNldCB1cCBwZXJtaXNzaW9ucyAKLQkgKiAoZm9yIGNob3duIGV0YyksIGV0Yy4KLQkgKi8KLQlpZiAoc2V0c2hhcmVzKHVlLnVlX3VpZCwgdmFsaWRfYWNjdCwgcHJpbnRmLCAwLCAwKSkgewotCQlwcmludGYoIlVuYWJsZSB0byBnaXZlICVkIHNoYXJlcyB0byA8JXM+KCVkLyVkKVxuIiwKLQkJICAgIHVlLnVlX3NoYXJlcywgdWUudWVfbmFtZSwgdWUudWVfdWlkLCB2YWxpZF9hY2N0KTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlzciA9IHNldGxpbWl0cyh1c2VybmFtZSwgQ19QUk9DLCBwaWQsIFVEQlJDX0lOVEVSKTsKLQlpZiAoc3IgIT0gTlVMTCkgewotCQlkZWJ1ZygiJS4yMDBzIiwgc3IpOwotCQlleGl0KDEpOwotCX0KLQlzciA9IHNldGxpbWl0cyh1c2VybmFtZSwgQ19KT0IsIGppZCwgVURCUkNfSU5URVIpOwotCWlmIChzciAhPSBOVUxMKSB7Ci0JCWRlYnVnKCIlLjIwMHMiLCBzcik7Ci0JCWV4aXQoMSk7Ci0JfQotCS8qCi0JICogUGxhY2UgdGhlIHNlcnZpY2UgcHJvdmlkZXIgaW5mb3JtYXRpb24gaW50bwotCSAqIHRoZSBzZXNzaW9uIHRhYmxlIChVbmljb3MpIG9yIGpvYiB0YWJsZSAoVW5pY29zL21rKS4KLQkgKiBUaGVyZSBleGlzdCBkb3VibGUgZGVmaW5lcyBmb3IgdGhlIGpvYi9zZXNzaW9uIHRhYmxlIGluCi0JICogdW5pY29zL21rIChqdGFiLmgpIHNvIG5vIG5lZWQgZm9yIGEgY29tcGlsZSB0aW1lIHN3aXRjaC4KLQkgKi8KLQltZW1zZXQoJmluaXRfaW5mbywgJ1wwJywgc2l6ZW9mKGluaXRfaW5mbykpOwotCWluaXRfaW5mby5zX3Nlc3Npbml0LnNpX2lkID0gVVJNX1NQVF9MT0dJTjsKLQlpbml0X2luZm8uc19zZXNzaW5pdC5zaV9waWQgPSBnZXRwaWQoKTsKLQlpbml0X2luZm8uc19zZXNzaW5pdC5zaV9zaWQgPSBqaWQ7Ci0Jc2Vzc2NudGwoMCwgU19TRVRTRVJWUE8sIChpbnQpJmluaXRfaW5mbyk7Ci0KLQkvKgotCSAqIFNldCB1c2VyIGFuZCBjb250cm9sbGluZyB0dHkgc2VjdXJpdHkgYXR0cmlidXRlcy4KLQkgKi8KLQlpZiAoU2VjdXJlU3lzKSB7Ci0JCWlmIChzZXR1c3J2KCZ1c3J2KSA9PSAtMSkgewotCQkJZGVidWcoInNldHVzcnYoKSBmYWlsZWQsIGVycm5vID0gJWQiLGVycm5vKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKDApOwotfQotCi0vKgotICogVGhlIHJjLiogYW5kIC9ldGMvc2RhZW1vbiBtZXRob2RzIG9mIHN0YXJ0aW5nIGEgcHJvZ3JhbSBvbiB1bmljb3MvdW5pY29zbWsKLSAqIGNhbiBoYXZlIHBhbCBwcml2aWxlZ2VzIHRoYXQgc3NoZCBjYW4gaW5oZXJpdCB3aGljaAotICogY291bGQgYWxsb3cgYSB1c2VyIHRvIHN1IHRvIHJvb3Qgd2l0aCBvdXQgYSBwYXNzd29yZC4KLSAqIFRoaXMgc3Vicm91dGluZSBjbGVhcnMgYWxsIHByaXZpbGVnZXMuCi0gKi8KLXZvaWQKLWRyb3BfY3JheV9wcml2cygpCi17Ci0jaWYgZGVmaW5lZChfU0NfQ1JBWV9QUklWX1NVKQotCXByaXZfcHJvY190ICpwcml2c3RhdGU7Ci0JaW50IHJlc3VsdDsKLQlleHRlcm4gaW50IHByaXZfc2V0X3Byb2MoKTsKLQlleHRlcm4gcHJpdl9wcm9jX3QgKnByaXZfaW5pdF9wcm9jKCk7Ci0KLQkvKgotCSAqIElmIGV0aGVyIG9mIHRoZXNlcyB0d28gZmxhZ3MgYXJlIG5vdCBzZXQKLQkgKiB0aGVuIGRvbid0IGFsbG93IHRoaXMgdmVyc2lvbiBvZiBzc2ggdG8gcnVuLgotCSAqLwotCWlmICghc3lzY29uZihfU0NfQ1JBWV9QUklWX1NVKSkKLQkJZmF0YWwoIk5vdCBQUklWX1NVIHN5c3RlbS4iKTsKLQlpZiAoIXN5c2NvbmYoX1NDX0NSQVlfUE9TSVhfUFJJVikpCi0JCWZhdGFsKCJOb3QgUE9TSVhfUFJJVi4iKTsKLQotCWRlYnVnKCJTZXR0aW5nIE1MUyBsYWJlbHMuIik7OwotCi0JaWYgKHN5c2NvbmYoX1NDX0NSQVlfU0VDVVJFX01BQykpIHsKLQkJdXNydi5zdl9taW5sdmwgPSBTWVNMT1c7Ci0JCXVzcnYuc3ZfYWN0bHZsID0gU1lTSElHSDsKLQkJdXNydi5zdl9tYXhsdmwgPSBTWVNISUdIOwotCX0gZWxzZSB7Ci0JCXVzcnYuc3ZfbWlubHZsID0gc3lzdi5zeV9taW5sdmw7Ci0JCXVzcnYuc3ZfYWN0bHZsID0gc3lzdi5zeV9taW5sdmw7Ci0JCXVzcnYuc3ZfbWF4bHZsID0gc3lzdi5zeV9tYXhsdmw7Ci0JfSAgICAgICAKLQl1c3J2LnN2X2FjdGNtcCA9IDA7Ci0JdXNydi5zdl92YWxjbXAgPSBzeXN2LnN5X3ZhbGNtcDsKLQotCXVzcnYuc3ZfaW50Y2F0ID0gVEZNX1NZU1RFTTsKLQl1c3J2LnN2X3ZhbGNhdCB8PSAoVEZNX1NZU1RFTSB8IFRGTV9TWVNGSUxFKTsKLQotCWlmIChzZXR1c3J2KCZ1c3J2KSA8IDApIHsKLQkJZmF0YWwoIiVzKCVkKTogc2V0dXNydigpOiAlcyIsIF9fRklMRV9fLCBfX0xJTkVfXywKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JfQotCi0JaWYgKChwcml2c3RhdGUgPSBwcml2X2luaXRfcHJvYygpKSAhPSBOVUxMKSB7Ci0JCXJlc3VsdCA9IHByaXZfc2V0X3Byb2MocHJpdnN0YXRlKTsKLQkJaWYgKHJlc3VsdCAhPSAwICkgewotCQkJZmF0YWwoIiVzKCVkKTogcHJpdl9zZXRfcHJvYygpOiAlcyIsCi0JCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBzdHJlcnJvcihlcnJubykpOwotCQl9Ci0JCXByaXZfZnJlZV9wcm9jKHByaXZzdGF0ZSk7Ci0JfQotCWRlYnVnICgiUHJpdmlsZWdlcyBzaG91bGQgYmUgY2xlYXJlZC4uLiIpOwotI2Vsc2UKLQkvKiBYWFg6IGRvIHRoaXMgZGlmZmVyZW50bHkgKi8KLSMJZXJyb3IgQ3JheSBzeXN0ZW1zIG11c3QgYmUgcnVuIHdpdGggX1NDX0NSQVlfUFJJVl9TVSBvbiEKLSNlbmRpZgotfQotCi0KLS8qCi0gKiAgUmV0YWluIHV0bXAvd3RtcCBpbmZvcm1hdGlvbiAtIHVzZWQgYnkgY3JheSBhY2NvdW50aW5nLgotICovCi12b2lkCi1jcmF5X3JldGFpbl91dG1wKHN0cnVjdCB1dG1wICp1dCwgaW50IHBpZCkKLXsKLQlpbnQgZmQ7Ci0Jc3RydWN0IHV0bXAgdXRtcDsKLQotCWlmICgoZmQgPSBvcGVuKFVUTVBfRklMRSwgT19SRE9OTFkpKSAhPSAtMSkgewotCQkvKiBYWFggdXNlIGF0b21pY2lvICovCi0JCXdoaWxlIChyZWFkKGZkLCAoY2hhciAqKSZ1dG1wLCBzaXplb2YodXRtcCkpID09IHNpemVvZih1dG1wKSkgewotCQkJaWYgKHBpZCA9PSB1dG1wLnV0X3BpZCkgewotCQkJCXV0LT51dF9qaWQgPSB1dG1wLnV0X2ppZDsKLQkJCQlzdHJuY3B5KHV0LT51dF90cGF0aCwgdXRtcC51dF90cGF0aCwgc2l6ZW9mKHV0bXAudXRfdHBhdGgpKTsKLQkJCQlzdHJuY3B5KHV0LT51dF9ob3N0LCB1dG1wLnV0X2hvc3QsIHNpemVvZih1dG1wLnV0X2hvc3QpKTsKLQkJCQlzdHJuY3B5KHV0LT51dF9uYW1lLCB1dG1wLnV0X25hbWUsIHNpemVvZih1dG1wLnV0X25hbWUpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQljbG9zZShmZCk7Ci0JfSBlbHNlCi0JCWZhdGFsKCJVbmFibGUgdG8gb3BlbiB1dG1wIGZpbGUiKTsKLX0KLQotLyoKLSAqIHRtcGRpciBzdXBwb3J0LgotICovCi0KLS8qCi0gKiBmaW5kIGFuZCBkZWxldGUgam9icyB0bXBkaXIuCi0gKi8KLXZvaWQKLWNyYXlfZGVsZXRlX3RtcGRpcihjaGFyICpsb2dpbiwgaW50IGppZCwgdWlkX3QgdWlkKQotewotCXN0YXRpYyBjaGFyIGp0bXBbVFBBVEhTSVpdOwotCXN0cnVjdCBzdGF0IHN0YXRidWY7Ci0JaW50IGNoaWxkLCBjLCB3c3RhdDsKLQotCWZvciAoYyA9ICdhJzsgYyA8PSAneic7IGMrKykgewotCQlzbnByaW50ZihqdG1wLCBUUEFUSFNJWiwgIiVzL2p0bXAuJTA2ZCVjIiwgSlRNUERJUiwgamlkLCBjKTsKLQkJaWYgKHN0YXQoanRtcCwgJnN0YXRidWYpID09IDAgJiYgc3RhdGJ1Zi5zdF91aWQgPT0gdWlkKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGMgPiAneicpCi0JCXJldHVybjsKLQotCWlmICgoY2hpbGQgPSBmb3JrKCkpID09IDApIHsKLQkJZXhlY2woQ0xFQU5UTVBDTUQsIENMRUFOVE1QQ01ELCBsb2dpbiwganRtcCwgKGNoYXIgKilOVUxMKTsKLQkJZmF0YWwoImNyYXlfZGVsZXRlX3RtcGRpcjogZXhlY2wgb2YgQ0xFQU5UTVBDTUQgZmFpbGVkIik7Ci0JfQotCi0Jd2hpbGUgKHdhaXRwaWQoY2hpbGQsICZ3c3RhdCwgMCkgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCi0JCTsKLX0KLQotLyoKLSAqIFJlbW92ZSB0bXBkaXIgb24gam9iIHRlcm1pbmF0aW9uLgotICovCi12b2lkCi1jcmF5X2pvYl90ZXJtaW5hdGlvbl9oYW5kbGVyKGludCBzaWcpCi17Ci0JaW50IGppZDsKLQljaGFyICpsb2dpbiA9IE5VTEw7Ci0Jc3RydWN0IGp0YWIganRhYjsKLQotCWlmICgoamlkID0gd2FpdGpvYigmanRhYikpID09IC0xIHx8Ci0JICAgIChsb2dpbiA9IHVpZDJuYW0oanRhYi5qX3VpZCkpID09IE5VTEwpCi0JCXJldHVybjsKLQotCWNyYXlfZGVsZXRlX3RtcGRpcihsb2dpbiwgamlkLCBqdGFiLmpfdWlkKTsKLX0KLQotLyoKLSAqIFNldCBqb2IgaWQgYW5kIGNyZWF0ZSB0bXBkaXIgZGlyZWN0b3J5LgotICovCi12b2lkCi1jcmF5X2luaXRfam9iKHN0cnVjdCBwYXNzd2QgKnB3KQotewotCWludCBqaWQ7Ci0JaW50IGM7Ci0KLQlqaWQgPSBzZXRqb2IocHctPnB3X3VpZCwgV0pTSUdOQUwpOwotCWlmIChqaWQgPCAwKQotCQlmYXRhbCgiU3lzdGVtIGNhbGwgc2V0am9iIGZhaWx1cmUiKTsKLQotCWZvciAoYyA9ICdhJzsgYyA8PSAneic7IGMrKykgewotCQlzbnByaW50ZihjcmF5X3RtcGRpciwgVFBBVEhTSVosICIlcy9qdG1wLiUwNmQlYyIsIEpUTVBESVIsIGppZCwgYyk7Ci0JCWlmIChta2RpcihjcmF5X3RtcGRpciwgSlRNUE1PREUpICE9IDApCi0JCQljb250aW51ZTsKLQkJaWYgKGNob3duKGNyYXlfdG1wZGlyLAlwdy0+cHdfdWlkLCBwdy0+cHdfZ2lkKSAhPSAwKSB7Ci0JCQlybWRpcihjcmF5X3RtcGRpcik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlpZiAoYyA+ICd6JykKLQkJY3JheV90bXBkaXJbMF0gPSAnXDAnOwotfQotCi12b2lkCi1jcmF5X3NldF90bXBkaXIoc3RydWN0IHV0bXAgKnV0KQotewotCWludCBqaWQ7Ci0Jc3RydWN0IGp0YWIgamJ1ZjsKLQotCWlmICgoamlkID0gZ2V0anRhYigmamJ1ZikpIDwgMCkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBTZXQgamlkIGFuZCB0bXBkaXIgaW4gdXRtcCByZWNvcmQuCi0JICovCi0JdXQtPnV0X2ppZCA9IGppZDsKLQlzdHJuY3B5KHV0LT51dF90cGF0aCwgY3JheV90bXBkaXIsIFRQQVRIU0laKTsKLX0KLSNlbmRpZiAvKiBVTklDT1MgKi8KLQotI2lmZGVmIF9VTklDT1NNUAotI2luY2x1ZGUgPHB3ZC5oPgotLyoKLSAqIFNldCBqb2IgaWQgYW5kIGNyZWF0ZSB0bXBkaXIgZGlyZWN0b3J5LgotICovCi12b2lkCi1jcmF5X2luaXRfam9iKHN0cnVjdCBwYXNzd2QgKnB3KQotewotCWluaXRybV9zaWxlbnQocHctPnB3X3VpZCk7Ci0JcmV0dXJuOwotfQotI2VuZGlmIC8qIF9VTklDT1NNUCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvYnNkLWNyYXkuaCBiL29wZW5ic2QtY29tcGF0L2JzZC1jcmF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NGVjZWIuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvYnNkLWNyYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qICRJZDogYnNkLWNyYXkuaCx2IDEuMTIgMjAwNS8wMi8wMiAwNjoxMDoxMSBkdHVja2VyIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIENyYXkgSW5jLiAgKFdlbmR5IFBhbG0gPHdlbmR5cEBjcmF5LmNvbT4pCi0gKiBTaWduaWZpY2FudCBwb3J0aW9ucyBwcm92aWRlZCBieSAKLSAqICAgICAgICAgIFdheW5lIFNjaHJvZWRlciwgU0RTQyA8c2Nocm9lZGVyQHNkc2MuZWR1PgotICogICAgICAgICAgV2lsbGlhbSBKb25lcywgVVRleGFzIDxqb25lc0B0YWNjLnV0ZXhhcy5lZHU+Ci0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqIENyZWF0ZWQ6IEFwciAyMiAxNi4zNDowMCAyMDAyIHdwCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgcHJvcGVyIGV4ZWN1dGlvbgotICogb24gVU5JQ09TIHN5c3RlbXMuCi0gKgotICovCi0KLSNpZm5kZWYgX0JTRF9DUkFZX0gKLSNkZWZpbmUgX0JTRF9DUkFZX0gKLQotI2lmZGVmIF9VTklDT1MKLQotdm9pZCBjcmF5X2luaXRfam9iKHN0cnVjdCBwYXNzd2QgKik7Ci12b2lkIGNyYXlfam9iX3Rlcm1pbmF0aW9uX2hhbmRsZXIoaW50KTsKLXZvaWQgY3JheV9sb2dpbl9mYWlsdXJlKGNoYXIgKiwgaW50ICk7Ci1pbnQgY3JheV9hY2Nlc3NfZGVuaWVkKGNoYXIgKik7Ci1leHRlcm4gY2hhciBjcmF5X3RtcGRpcltdOwotCi0jZGVmaW5lIENVU1RPTV9GQUlMRURfTE9HSU4gMQotCi0jaWZuZGVmIElBX1NTSEQKLSMgZGVmaW5lIElBX1NTSEQgSUFfTE9HSU4KLSNlbmRpZgotI2lmbmRlZiBNQVhIT1NUTkFNRUxFTgotIyBkZWZpbmUgTUFYSE9TVE5BTUVMRU4gIDY0Ci0jZW5kaWYKLSNpZm5kZWYgX0NSQVlUM0UKLSMgZGVmaW5lIFRJT0NHUEdSUCAodElPQ3wyMCkKLSNlbmRpZgotCi0jZW5kaWYgLyogVU5JQ09TICovCi0KLSNlbmRpZiAvKiBfQlNEX0NSQVlfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvYnNkLWN5Z3dpbl91dGlsLmMgYi9vcGVuYnNkLWNvbXBhdC9ic2QtY3lnd2luX3V0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlZGM4OC4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9ic2QtY3lnd2luX3V0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDExIENvcmlubmEgVmluc2NoZW4gPHZpbnNjaGVuQHJlZGhhdC5jb20+Ci0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqIENyZWF0ZWQ6IFNhdCBTZXAgMDIgMTI6MTc6MDAgMjAwMCBjdgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIGZvcmNpbmcgb3BlbmVkIGZpbGUgZGVzY3JpcHRvcnMgdG8KLSAqIGJpbmFyeSBtb2RlIG9uIFdpbmRvd3Mgc3lzdGVtcy4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmZGVmIEhBVkVfQ1lHV0lOCi0KLSNpZiBkZWZpbmVkKG9wZW4pICYmIG9wZW4gPT0gYmluYXJ5X29wZW4KLSMgdW5kZWYgb3BlbgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotCi1pbnQgCi1iaW5hcnlfb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzLCAuLi4pCi17Ci0JdmFfbGlzdCBhcDsKLQltb2RlX3QgbW9kZTsKLQkKLQl2YV9zdGFydChhcCwgZmxhZ3MpOwotCW1vZGUgPSB2YV9hcmcoYXAsIG1vZGVfdCk7Ci0JdmFfZW5kKGFwKTsKLQlyZXR1cm4gKG9wZW4oZmlsZW5hbWUsIGZsYWdzIHwgT19CSU5BUlksIG1vZGUpKTsKLX0KLQotaW50Ci1jaGVja19udHNlYyhjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLQlyZXR1cm4gKHBhdGhjb25mKGZpbGVuYW1lLCBfUENfUE9TSVhfUEVSTUlTU0lPTlMpKTsKLX0KLQotI2RlZmluZSBOTCh4KSB4LCAoc2l6ZW9mICh4KSAtIDEpCi0jZGVmaW5lIFdFTlZfU0laIChzaXplb2YgKHdlbnZfYXJyKSAvIHNpemVvZiAod2Vudl9hcnJbMF0pKQotCi1zdGF0aWMgc3RydWN0IHdlbnYgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0Jc2l6ZV90IG5hbWVsZW47Ci19IHdlbnZfYXJyW10gPSB7Ci0JeyBOTCgiQUxMVVNFUlNQUk9GSUxFPSIpIH0sCi0JeyBOTCgiQ09NUFVURVJOQU1FPSIpIH0sCi0JeyBOTCgiQ09NU1BFQz0iKSB9LAotCXsgTkwoIkNZR1dJTj0iKSB9LAotCXsgTkwoIk9TPSIpIH0sCi0JeyBOTCgiUEFUSD0iKSB9LAotCXsgTkwoIlBBVEhFWFQ9IikgfSwKLQl7IE5MKCJTWVNURU1EUklWRT0iKSB9LAotCXsgTkwoIlNZU1RFTVJPT1Q9IikgfSwKLQl7IE5MKCJXSU5ESVI9IikgfQotfTsKLQotY2hhciAqKgotZmV0Y2hfd2luZG93c19lbnZpcm9ubWVudCh2b2lkKQotewotCWNoYXIgKiplLCAqKnA7Ci0JdW5zaWduZWQgaW50IGksIGlkeCA9IDA7Ci0KLQlwID0geGNhbGxvYyhXRU5WX1NJWiArIDEsIHNpemVvZihjaGFyICopKTsKLQlmb3IgKGUgPSBlbnZpcm9uOyAqZSAhPSBOVUxMOyArK2UpIHsKLQkJZm9yIChpID0gMDsgaSA8IFdFTlZfU0laOyArK2kpIHsKLQkJCWlmICghc3RybmNtcCgqZSwgd2Vudl9hcnJbaV0ubmFtZSwgd2Vudl9hcnJbaV0ubmFtZWxlbikpCi0JCQkJcFtpZHgrK10gPSAqZTsKLQkJfQotCX0KLQlwW2lkeF0gPSBOVUxMOwotCXJldHVybiBwOwotfQotCi12b2lkCi1mcmVlX3dpbmRvd3NfZW52aXJvbm1lbnQoY2hhciAqKnApCi17Ci0JeGZyZWUocCk7Ci19Ci0KLSNlbmRpZiAvKiBIQVZFX0NZR1dJTiAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvYnNkLWN5Z3dpbl91dGlsLmggYi9vcGVuYnNkLWNvbXBhdC9ic2QtY3lnd2luX3V0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmNjRiNy4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9ic2QtY3lnd2luX3V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qICRJZDogYnNkLWN5Z3dpbl91dGlsLmgsdiAxLjEzIDIwMTEvMDgvMTcgMDE6MzE6MDkgZGptIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMTEgQ29yaW5uYSBWaW5zY2hlbiA8dmluc2NoZW5AcmVkaGF0LmNvbT4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogQ3JlYXRlZDogU2F0IFNlcCAwMiAxMjoxNzowMCAyMDAwIGN2Ci0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgZm9yY2luZyBvcGVuZWQgZmlsZSBkZXNjcmlwdG9ycyB0bwotICogYmluYXJ5IG1vZGUgb24gV2luZG93cyBzeXN0ZW1zLgotICovCi0KLSNpZm5kZWYgX0JTRF9DWUdXSU5fVVRJTF9ICi0jZGVmaW5lIF9CU0RfQ1lHV0lOX1VUSUxfSAotCi0jaWZkZWYgSEFWRV9DWUdXSU4KLQotI3VuZGVmIEVSUk9SCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8c3lzL2N5Z3dpbi5oPgotI2luY2x1ZGUgPGlvLmg+Ci0KLWludCBiaW5hcnlfb3Blbihjb25zdCBjaGFyICosIGludCAsIC4uLik7Ci1pbnQgY2hlY2tfbnRzZWMoY29uc3QgY2hhciAqKTsKLWNoYXIgKipmZXRjaF93aW5kb3dzX2Vudmlyb25tZW50KHZvaWQpOwotdm9pZCBmcmVlX3dpbmRvd3NfZW52aXJvbm1lbnQoY2hhciAqKik7Ci0KLSNkZWZpbmUgb3BlbiBiaW5hcnlfb3BlbgotCi0jZW5kaWYgLyogSEFWRV9DWUdXSU4gKi8KLQotI2VuZGlmIC8qIF9CU0RfQ1lHV0lOX1VUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvYnNkLWdldHBlZXJlaWQuYyBiL29wZW5ic2QtY29tcGF0L2JzZC1nZXRwZWVyZWlkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmN2U2NzcuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvYnNkLWdldHBlZXJlaWQuYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsMjAwNCBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpZiAhZGVmaW5lZChIQVZFX0dFVFBFRVJFSUQpCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2lmIGRlZmluZWQoU09fUEVFUkNSRUQpCi1pbnQKLWdldHBlZXJlaWQoaW50IHMsIHVpZF90ICpldWlkLCBnaWRfdCAqZ2lkKQotewotCXN0cnVjdCB1Y3JlZCBjcmVkOwotCXNvY2tsZW5fdCBsZW4gPSBzaXplb2YoY3JlZCk7Ci0KLQlpZiAoZ2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19QRUVSQ1JFRCwgJmNyZWQsICZsZW4pIDwgMCkKLQkJcmV0dXJuICgtMSk7Ci0JKmV1aWQgPSBjcmVkLnVpZDsKLQkqZ2lkID0gY3JlZC5naWQ7Ci0KLQlyZXR1cm4gKDApOwotfQotI2VsaWYgZGVmaW5lZChIQVZFX0dFVFBFRVJVQ1JFRCkKLQotI2lmZGVmIEhBVkVfVUNSRURfSAotIyBpbmNsdWRlIDx1Y3JlZC5oPgotI2VuZGlmCi0KLWludAotZ2V0cGVlcmVpZChpbnQgcywgdWlkX3QgKmV1aWQsIGdpZF90ICpnaWQpCi17Ci0JdWNyZWRfdCAqdWNyZWQgPSBOVUxMOwotCi0JaWYgKGdldHBlZXJ1Y3JlZChzLCAmdWNyZWQpID09IC0xKQotCQlyZXR1cm4gKC0xKTsKLQlpZiAoKCpldWlkID0gdWNyZWRfZ2V0ZXVpZCh1Y3JlZCkpID09IC0xKQotCQlyZXR1cm4gKC0xKTsKLQlpZiAoKCpnaWQgPSB1Y3JlZF9nZXRyZ2lkKHVjcmVkKSkgPT0gLTEpCi0JCXJldHVybiAoLTEpOwotCi0JdWNyZWRfZnJlZSh1Y3JlZCk7Ci0KLQlyZXR1cm4gKDApOwotfQotI2Vsc2UKLWludAotZ2V0cGVlcmVpZChpbnQgcywgdWlkX3QgKmV1aWQsIGdpZF90ICpnaWQpCi17Ci0JKmV1aWQgPSBnZXRldWlkKCk7Ci0JKmdpZCA9IGdldGdpZCgpOwotCi0JcmV0dXJuICgwKTsKLX0KLSNlbmRpZiAvKiBkZWZpbmVkKFNPX1BFRVJDUkVEKSAqLwotCi0jZW5kaWYgLyogIWRlZmluZWQoSEFWRV9HRVRQRUVSRUlEKSAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvYnNkLW1pc2MuYyBiL29wZW5ic2QtY29tcGF0L2JzZC1taXNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZjM3M2YuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvYnNkLW1pc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1NZU19TRUxFQ1RfSAotIyBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19USU1FX0gKLSMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0KLSNpZm5kZWYgSEFWRV9fX1BST0dOQU1FCi1jaGFyICpfX3Byb2duYW1lOwotI2VuZGlmCi0KLS8qCi0gKiBOQi4gZHVwbGljYXRlIF9fcHJvZ25hbWUgaW4gY2FzZSBpdCBpcyBhbiBhbGlhcyBmb3IgYXJndlswXQotICogT3RoZXJ3aXNlIGl0IG1heSBnZXQgY2xvYmJlcmVkIGJ5IHNldHByb2N0aXRsZSgpCi0gKi8KLWNoYXIgKnNzaF9nZXRfcHJvZ25hbWUoY2hhciAqYXJndjApCi17Ci0jaWZkZWYgSEFWRV9fX1BST0dOQU1FCi0JZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7Ci0KLQlyZXR1cm4geHN0cmR1cChfX3Byb2duYW1lKTsKLSNlbHNlCi0JY2hhciAqcDsKLQotCWlmIChhcmd2MCA9PSBOVUxMKQotCQlyZXR1cm4gKCJ1bmtub3duIik7CS8qIFhYWCAqLwotCXAgPSBzdHJyY2hyKGFyZ3YwLCAnLycpOwotCWlmIChwID09IE5VTEwpCi0JCXAgPSBhcmd2MDsKLQllbHNlCi0JCXArKzsKLQotCXJldHVybiAoeHN0cmR1cChwKSk7Ci0jZW5kaWYKLX0KLQotI2lmbmRlZiBIQVZFX1NFVExPR0lOCi1pbnQgc2V0bG9naW4oY29uc3QgY2hhciAqbmFtZSkKLXsKLQlyZXR1cm4gKDApOwotfQotI2VuZGlmIC8qICFIQVZFX1NFVExPR0lOICovCi0KLSNpZm5kZWYgSEFWRV9JTk5FVEdSCi1pbnQgaW5uZXRncihjb25zdCBjaGFyICpuZXRncm91cCwgY29uc3QgY2hhciAqaG9zdCwgCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1c2VyLCBjb25zdCBjaGFyICpkb21haW4pCi17Ci0JcmV0dXJuICgwKTsKLX0KLSNlbmRpZiAvKiBIQVZFX0lOTkVUR1IgKi8KLQotI2lmICFkZWZpbmVkKEhBVkVfU0VURVVJRCkgJiYgZGVmaW5lZChIQVZFX1NFVFJFVUlEKQotaW50IHNldGV1aWQodWlkX3QgZXVpZCkKLXsKLQlyZXR1cm4gKHNldHJldWlkKC0xLCBldWlkKSk7Ci19Ci0jZW5kaWYgLyogIWRlZmluZWQoSEFWRV9TRVRFVUlEKSAmJiBkZWZpbmVkKEhBVkVfU0VUUkVVSUQpICovCi0KLSNpZiAhZGVmaW5lZChIQVZFX1NFVEVHSUQpICYmIGRlZmluZWQoSEFWRV9TRVRSRVNHSUQpCi1pbnQgc2V0ZWdpZCh1aWRfdCBlZ2lkKQotewotCXJldHVybihzZXRyZXNnaWQoLTEsIGVnaWQsIC0xKSk7Ci19Ci0jZW5kaWYgLyogIWRlZmluZWQoSEFWRV9TRVRFR0lEKSAmJiBkZWZpbmVkKEhBVkVfU0VUUkVTR0lEKSAqLwotCi0jaWYgIWRlZmluZWQoSEFWRV9TVFJFUlJPUikgJiYgZGVmaW5lZChIQVZFX1NZU19FUlJMSVNUKSAmJiBkZWZpbmVkKEhBVkVfU1lTX05FUlIpCi1jb25zdCBjaGFyICpzdHJlcnJvcihpbnQgZSkKLXsKLQlleHRlcm4gaW50IHN5c19uZXJyOwotCWV4dGVybiBjaGFyICpzeXNfZXJybGlzdFtdOwotCQotCWlmICgoZSA+PSAwKSAmJiAoZSA8IHN5c19uZXJyKSkKLQkJcmV0dXJuIChzeXNfZXJybGlzdFtlXSk7Ci0KLQlyZXR1cm4gKCJ1bmxpc3RlZCBlcnJvciIpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9VVElNRVMKLWludCB1dGltZXMoY2hhciAqZmlsZW5hbWUsIHN0cnVjdCB0aW1ldmFsICp0dnApCi17Ci0Jc3RydWN0IHV0aW1idWYgdWI7Ci0KLQl1Yi5hY3RpbWUgPSB0dnBbMF0udHZfc2VjOwotCXViLm1vZHRpbWUgPSB0dnBbMV0udHZfc2VjOwotCQotCXJldHVybiAodXRpbWUoZmlsZW5hbWUsICZ1YikpOwotfQotI2VuZGlmIAotCi0jaWZuZGVmIEhBVkVfVFJVTkNBVEUKLWludCB0cnVuY2F0ZShjb25zdCBjaGFyICpwYXRoLCBvZmZfdCBsZW5ndGgpCi17Ci0JaW50IGZkLCByZXQsIHNhdmVycm5vOwotCi0JZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZKTsKLQlpZiAoZmQgPCAwKQotCQlyZXR1cm4gKC0xKTsKLQotCXJldCA9IGZ0cnVuY2F0ZShmZCwgbGVuZ3RoKTsKLQlzYXZlcnJubyA9IGVycm5vOwotCWNsb3NlKGZkKTsKLQlpZiAocmV0ID09IC0xKQotCQllcnJubyA9IHNhdmVycm5vOwotCi0JcmV0dXJuKHJldCk7Ci19Ci0jZW5kaWYgLyogSEFWRV9UUlVOQ0FURSAqLwotCi0jaWYgIWRlZmluZWQoSEFWRV9OQU5PU0xFRVApICYmICFkZWZpbmVkKEhBVkVfTlNMRUVQKQotaW50IG5hbm9zbGVlcChjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnJlcSwgc3RydWN0IHRpbWVzcGVjICpyZW0pCi17Ci0JaW50IHJjLCBzYXZlcnJubzsKLQlleHRlcm4gaW50IGVycm5vOwotCXN0cnVjdCB0aW1ldmFsIHRzdGFydCwgdHN0b3AsIHRyZW1haW4sIHRpbWUyd2FpdDsKLQotCVRJTUVTUEVDX1RPX1RJTUVWQUwoJnRpbWUyd2FpdCwgcmVxKQotCSh2b2lkKSBnZXR0aW1lb2ZkYXkoJnRzdGFydCwgTlVMTCk7Ci0JcmMgPSBzZWxlY3QoMCwgTlVMTCwgTlVMTCwgTlVMTCwgJnRpbWUyd2FpdCk7Ci0JaWYgKHJjID09IC0xKSB7Ci0JCXNhdmVycm5vID0gZXJybm87Ci0JCSh2b2lkKSBnZXR0aW1lb2ZkYXkgKCZ0c3RvcCwgTlVMTCk7Ci0JCWVycm5vID0gc2F2ZXJybm87Ci0JCXRyZW1haW4udHZfc2VjID0gdGltZTJ3YWl0LnR2X3NlYyAtIAotCQkJKHRzdG9wLnR2X3NlYyAtIHRzdGFydC50dl9zZWMpOwotCQl0cmVtYWluLnR2X3VzZWMgPSB0aW1lMndhaXQudHZfdXNlYyAtIAotCQkJKHRzdG9wLnR2X3VzZWMgLSB0c3RhcnQudHZfdXNlYyk7Ci0JCXRyZW1haW4udHZfc2VjICs9IHRyZW1haW4udHZfdXNlYyAvIDEwMDAwMDBMOwotCQl0cmVtYWluLnR2X3VzZWMgJT0gMTAwMDAwMEw7Ci0JfSBlbHNlIHsKLQkJdHJlbWFpbi50dl9zZWMgPSAwOwotCQl0cmVtYWluLnR2X3VzZWMgPSAwOwotCX0KLQlpZiAocmVtICE9IE5VTEwpCi0JCVRJTUVWQUxfVE9fVElNRVNQRUMoJnRyZW1haW4sIHJlbSkKLQotCXJldHVybihyYyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1RDR0VUUEdSUAotcGlkX3QKLXRjZ2V0cGdycChpbnQgZmQpCi17Ci0JaW50IGN0dHlfcGdycDsKLQotCWlmIChpb2N0bChmZCwgVElPQ0dQR1JQLCAmY3R0eV9wZ3JwKSA9PSAtMSkKLQkJcmV0dXJuKC0xKTsKLQllbHNlCi0JCXJldHVybihjdHR5X3BncnApOwotfQotI2VuZGlmIC8qIEhBVkVfVENHRVRQR1JQICovCi0KLSNpZm5kZWYgSEFWRV9UQ1NFTkRCUkVBSwotaW50Ci10Y3NlbmRicmVhayhpbnQgZmQsIGludCBkdXJhdGlvbikKLXsKLSMgaWYgZGVmaW5lZChUSU9DU0JSSykgJiYgZGVmaW5lZChUSU9DQ0JSSykKLQlzdHJ1Y3QgdGltZXZhbCBzbGVlcHl0aW1lOwotCi0Jc2xlZXB5dGltZS50dl9zZWMgPSAwOwotCXNsZWVweXRpbWUudHZfdXNlYyA9IDQwMDAwMDsKLQlpZiAoaW9jdGwoZmQsIFRJT0NTQlJLLCAwKSA9PSAtMSkKLQkJcmV0dXJuICgtMSk7Ci0JKHZvaWQpc2VsZWN0KDAsIDAsIDAsIDAsICZzbGVlcHl0aW1lKTsKLQlpZiAoaW9jdGwoZmQsIFRJT0NDQlJLLCAwKSA9PSAtMSkKLQkJcmV0dXJuICgtMSk7Ci0JcmV0dXJuICgwKTsKLSMgZWxzZQotCXJldHVybiAtMTsKLSMgZW5kaWYKLX0KLSNlbmRpZiAvKiBIQVZFX1RDU0VOREJSRUFLICovCi0KLW15c2lnX3QKLW15c2lnbmFsKGludCBzaWcsIG15c2lnX3QgYWN0KQotewotI2lmZGVmIEhBVkVfU0lHQUNUSU9OCi0Jc3RydWN0IHNpZ2FjdGlvbiBzYSwgb3NhOwotCi0JaWYgKHNpZ2FjdGlvbihzaWcsIE5VTEwsICZvc2EpID09IC0xKQotCQlyZXR1cm4gKG15c2lnX3QpIC0xOwotCWlmIChvc2Euc2FfaGFuZGxlciAhPSBhY3QpIHsKLQkJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7Ci0JCXNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKLQkJc2Euc2FfZmxhZ3MgPSAwOwotI2lmZGVmIFNBX0lOVEVSUlVQVAotCQlpZiAoc2lnID09IFNJR0FMUk0pCi0JCQlzYS5zYV9mbGFncyB8PSBTQV9JTlRFUlJVUFQ7Ci0jZW5kaWYKLQkJc2Euc2FfaGFuZGxlciA9IGFjdDsKLQkJaWYgKHNpZ2FjdGlvbihzaWcsICZzYSwgTlVMTCkgPT0gLTEpCi0JCQlyZXR1cm4gKG15c2lnX3QpIC0xOwotCX0KLQlyZXR1cm4gKG9zYS5zYV9oYW5kbGVyKTsKLSNlbHNlCi0JI3VuZGVmIHNpZ25hbAotCXJldHVybiAoc2lnbmFsKHNpZywgYWN0KSk7Ci0jZW5kaWYKLX0KLQotI2lmbmRlZiBIQVZFX1NUUkRVUAotY2hhciAqCi1zdHJkdXAoY29uc3QgY2hhciAqc3RyKQotewotCXNpemVfdCBsZW47Ci0JY2hhciAqY3A7Ci0KLQlsZW4gPSBzdHJsZW4oc3RyKSArIDE7Ci0JY3AgPSBtYWxsb2MobGVuKTsKLQlpZiAoY3AgIT0gTlVMTCkKLQkJcmV0dXJuKG1lbWNweShjcCwgc3RyLCBsZW4pKTsKLQlyZXR1cm4gTlVMTDsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfSVNCTEFOSwotaW50IGlzYmxhbmsoaW50IGMpCi17Ci0JcmV0dXJuIChjID09ICcgJyB8fCBjID09ICdcdCcpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9ic2QtbWlzYy5oIGIvb3BlbmJzZC1jb21wYXQvYnNkLW1pc2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwYzNmOS4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9ic2QtbWlzYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qICRJZDogYnNkLW1pc2MuaCx2IDEuMTkgMjAxMC8xMS8wOCAyMjoyNjoyMyB0aW0gRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IERhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9CU0RfTUlTQ19ICi0jZGVmaW5lIF9CU0RfTUlTQ19ICi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi1jaGFyICpzc2hfZ2V0X3Byb2duYW1lKGNoYXIgKik7Ci0KLSNpZm5kZWYgSEFWRV9TRVRTSUQKLSNkZWZpbmUgc2V0c2lkKCkgc2V0cGdycCgwLCBnZXRwaWQoKSkKLSNlbmRpZiAvKiAhSEFWRV9TRVRTSUQgKi8KLQotI2lmbmRlZiBIQVZFX1NFVEVOVgotaW50IHNldGVudihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKLSNlbmRpZiAvKiAhSEFWRV9TRVRFTlYgKi8KLQotI2lmbmRlZiBIQVZFX1NFVExPR0lOCi1pbnQgc2V0bG9naW4oY29uc3QgY2hhciAqKTsKLSNlbmRpZiAvKiAhSEFWRV9TRVRMT0dJTiAqLwotCi0jaWZuZGVmIEhBVkVfSU5ORVRHUgotaW50IGlubmV0Z3IoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLSNlbmRpZiAvKiBIQVZFX0lOTkVUR1IgKi8KLQotI2lmICFkZWZpbmVkKEhBVkVfU0VURVVJRCkgJiYgZGVmaW5lZChIQVZFX1NFVFJFVUlEKQotaW50IHNldGV1aWQodWlkX3QpOwotI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfU0VURVVJRCkgJiYgZGVmaW5lZChIQVZFX1NFVFJFVUlEKSAqLwotCi0jaWYgIWRlZmluZWQoSEFWRV9TRVRFR0lEKSAmJiBkZWZpbmVkKEhBVkVfU0VUUkVTR0lEKQotaW50IHNldGVnaWQodWlkX3QpOwotI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfU0VURUdJRCkgJiYgZGVmaW5lZChIQVZFX1NFVFJFU0dJRCkgKi8KLQotI2lmICFkZWZpbmVkKEhBVkVfU1RSRVJST1IpICYmIGRlZmluZWQoSEFWRV9TWVNfRVJSTElTVCkgJiYgZGVmaW5lZChIQVZFX1NZU19ORVJSKQotY29uc3QgY2hhciAqc3RyZXJyb3IoaW50KTsKLSNlbmRpZiAKLQotCi0jaWZuZGVmIEhBVkVfVVRJTUVTCi0jaWZuZGVmIEhBVkVfU1RSVUNUX1RJTUVWQUwKLXN0cnVjdCB0aW1ldmFsIHsKLQlsb25nIHR2X3NlYzsKLQlsb25nIHR2X3VzZWM7Ci19Ci0jZW5kaWYgLyogSEFWRV9TVFJVQ1RfVElNRVZBTCAqLwotCi1pbnQgdXRpbWVzKGNoYXIgKiwgc3RydWN0IHRpbWV2YWwgKik7Ci0jZW5kaWYgLyogSEFWRV9VVElNRVMgKi8KLQotI2lmbmRlZiBIQVZFX1RSVU5DQVRFCi1pbnQgdHJ1bmNhdGUgKGNvbnN0IGNoYXIgKiwgb2ZmX3QpOwotI2VuZGlmIC8qIEhBVkVfVFJVTkNBVEUgKi8KLQotI2lmICFkZWZpbmVkKEhBVkVfTkFOT1NMRUVQKSAmJiAhZGVmaW5lZChIQVZFX05TTEVFUCkKLSNpZm5kZWYgSEFWRV9TVFJVQ1RfVElNRVNQRUMKLXN0cnVjdCB0aW1lc3BlYyB7Ci0JdGltZV90CXR2X3NlYzsKLQlsb25nCXR2X25zZWM7Ci19OwotI2VuZGlmCi1pbnQgbmFub3NsZWVwKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqLCBzdHJ1Y3QgdGltZXNwZWMgKik7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1RDR0VUUEdSUAotcGlkX3QgdGNnZXRwZ3JwKGludCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1RDU0VOREJSRUFLCi1pbnQgdGNzZW5kYnJlYWsoaW50LCBpbnQpOwotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9VTlNFVEVOVgotdm9pZCB1bnNldGVudihjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLS8qIHdyYXBwZXIgZm9yIHNpZ25hbCBpbnRlcmZhY2UgKi8KLXR5cGVkZWYgdm9pZCAoKm15c2lnX3QpKGludCk7Ci1teXNpZ190IG15c2lnbmFsKGludCBzaWcsIG15c2lnX3QgYWN0KTsKLQotI2RlZmluZSBzaWduYWwoYSxiKSBteXNpZ25hbChhLGIpCi0KLSNpZm5kZWYgSEFWRV9JU0JMQU5LCi1pbnQJaXNibGFuayhpbnQpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfQlNEX01JU0NfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvYnNkLW5leHRzdGVwLmMgYi9vcGVuYnNkLWNvbXBhdC9ic2QtbmV4dHN0ZXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5NWFmOC4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9ic2QtbmV4dHN0ZXAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDEgQmVuIExpbmRzdHJvbS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZkZWYgSEFWRV9ORVhUCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgImJzZC1uZXh0c3RlcC5oIgotCi1waWRfdCAKLXBvc2l4X3dhaXQoaW50ICpzdGF0dXMpCi17Ci0JdW5pb24gd2FpdCBzdGF0dXNwOwotCXBpZF90IHdhaXRfcGlkOwotCi0JI3VuZGVmIHdhaXQJCQkvKiBVc2UgTmVYVCdzIHdhaXQoKSBmdW5jdGlvbiAqLwotCXdhaXRfcGlkID0gd2FpdCgmc3RhdHVzcCk7Ci0JaWYgKHN0YXR1cykKLQkJKnN0YXR1cyA9IChpbnQpIHN0YXR1c3Aud19zdGF0dXM7Ci0KLQlyZXR1cm4gKHdhaXRfcGlkKTsKLX0KLQotaW50Ci10Y2dldGF0dHIoaW50IGZkLCBzdHJ1Y3QgdGVybWlvcyAqdCkKLXsKLQlyZXR1cm4gKGlvY3RsKGZkLCBUSU9DR0VUQSwgdCkpOwotfQotCi1pbnQKLXRjc2V0YXR0cihpbnQgZmQsIGludCBvcHQsIGNvbnN0IHN0cnVjdCB0ZXJtaW9zICp0KQotewotCXN0cnVjdCB0ZXJtaW9zIGxvY2FsdGVybTsKLQotCWlmIChvcHQgJiBUQ1NBU09GVCkgewotCQlsb2NhbHRlcm0gPSAqdDsKLQkJbG9jYWx0ZXJtLmNfY2ZsYWcgfD0gQ0lHTk9SRTsKLQkJdCA9ICZsb2NhbHRlcm07Ci0JfQotCXN3aXRjaCAob3B0ICYgflRDU0FTT0ZUKSB7Ci0JY2FzZSBUQ1NBTk9XOgotCQlyZXR1cm4gKGlvY3RsKGZkLCBUSU9DU0VUQSwgdCkpOwotCWNhc2UgVENTQURSQUlOOgotCQlyZXR1cm4gKGlvY3RsKGZkLCBUSU9DU0VUQVcsIHQpKTsKLQljYXNlIFRDU0FGTFVTSDoKLQkJcmV0dXJuIChpb2N0bChmZCwgVElPQ1NFVEFGLCB0KSk7Ci0JZGVmYXVsdDoKLQkJZXJybm8gPSBFSU5WQUw7Ci0JCXJldHVybiAoLTEpOwotCX0KLX0KLQotaW50IHRjc2V0cGdycChpbnQgZmQsIHBpZF90IHBncnApCi17Ci0JcmV0dXJuIChpb2N0bChmZCwgVElPQ1NQR1JQLCAmcGdycCkpOwotfQotCi1zcGVlZF90IGNmZ2V0b3NwZWVkKGNvbnN0IHN0cnVjdCB0ZXJtaW9zICp0KQotewotCXJldHVybiAodC0+Y19vc3BlZWQpOwotfQotCi1zcGVlZF90IGNmZ2V0aXNwZWVkKGNvbnN0IHN0cnVjdCB0ZXJtaW9zICp0KQotewotCXJldHVybiAodC0+Y19pc3BlZWQpOwotfQotCi1pbnQKLWNmc2V0b3NwZWVkKHN0cnVjdCB0ZXJtaW9zICp0LGludCBzcGVlZCkKLXsKLQl0LT5jX29zcGVlZCA9IHNwZWVkOwotCXJldHVybiAoMCk7Ci19Ci0KLWludAotY2ZzZXRpc3BlZWQoc3RydWN0IHRlcm1pb3MgKnQsIGludCBzcGVlZCkKLXsKLQl0LT5jX2lzcGVlZCA9IHNwZWVkOwotCXJldHVybiAoMCk7Ci19Ci0jZW5kaWYgLyogSEFWRV9ORVhUICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9ic2QtbmV4dHN0ZXAuaCBiL29wZW5ic2QtY29tcGF0L2JzZC1uZXh0c3RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTViNGI1Li4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L2JzZC1uZXh0c3RlcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogJElkOiBic2QtbmV4dHN0ZXAuaCx2IDEuOSAyMDAzLzA4LzI5IDE2OjU5OjUyIG1vdXJpbmcgRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEJlbiBMaW5kc3Ryb20uICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVYVF9QT1NJWF9ICi0jZGVmaW5lIF9ORVhUX1BPU0lYX0gKLQotI2lmZGVmIEhBVkVfTkVYVAotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLQotLyogTkdST1VQU19NQVggaXMgYmVoaW5kIC1scG9zaXguICBVc2UgdGhlIEJTRCB2ZXJzaW9uIHdoaWNoIGlzIE5HUk9VUFMgKi8KLSN1bmRlZiBOR1JPVVBTX01BWAotI2RlZmluZSBOR1JPVVBTX01BWCBOR1JPVVBTCi0KLS8qIE5lWFQncyByZWFkZGlyKCkgaXMgQlNEIChzdHJ1Y3QgZGlyZWN0KSBub3QgUE9TSVggKHN0cnVjdCBkaXJlbnQpICovCi0jZGVmaW5lIGRpcmVudCBkaXJlY3QKLQotLyogU3dhcCBvdXQgTmVYVCdzIEJTRCB3YWl0KCkgZm9yIGEgbW9yZSBQT1NJWCBjb21wbGllbnQgb25lICovCi1waWRfdCBwb3NpeF93YWl0KGludCAqKTsKLSNkZWZpbmUgd2FpdChhKSBwb3NpeF93YWl0KGEpCi0KLS8qICNpZmRlZiB3cmFwcGVkIGZ1bmN0aW9ucyB0aGF0IG5lZWQgZGVmaW5pbmcgZm9yIGNsZWFuIGNvbXBpbGluZyAqLwotcGlkX3QgZ2V0cHBpZCh2b2lkKTsKLXZvaWQgdmhhbmd1cCh2b2lkKTsKLWludCBpbm5ldGdyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci0KLS8qIFRFUk1DQVAgKi8KLWludCB0Y2dldGF0dHIoaW50LCBzdHJ1Y3QgdGVybWlvcyAqKTsKLWludCB0Y3NldGF0dHIoaW50LCBpbnQsIGNvbnN0IHN0cnVjdCB0ZXJtaW9zICopOwotaW50IHRjc2V0cGdycChpbnQsIHBpZF90KTsKLXNwZWVkX3QgY2ZnZXRvc3BlZWQoY29uc3Qgc3RydWN0IHRlcm1pb3MgKik7Ci1zcGVlZF90IGNmZ2V0aXNwZWVkKGNvbnN0IHN0cnVjdCB0ZXJtaW9zICopOwotaW50IGNmc2V0b3NwZWVkKHN0cnVjdCB0ZXJtaW9zICosIGludCk7Ci1pbnQgY2ZzZXRpc3BlZWQoc3RydWN0IHRlcm1pb3MgKiwgaW50KTsKLSNlbmRpZiAvKiBIQVZFX05FWFQgKi8KLSNlbmRpZiAvKiBfTkVYVF9QT1NJWF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9ic2Qtb3BlbnB0eS5jIGIvb3BlbmJzZC1jb21wYXQvYnNkLW9wZW5wdHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0MTcxMC4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9ic2Qtb3BlbnB0eS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qCi0gKiBQbGVhc2Ugbm90ZTogdGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBvcGVucHR5KCkgaXMgZmFyIGZyb20gY29tcGxldGUuCi0gKiBpdCBpcyBqdXN0IGVub3VnaCBmb3IgcG9ydGFibGUgT3BlblNTSCdzIG5lZWRzLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiBBbGxvY2F0aW5nIGEgcHNldWRvLXRlcm1pbmFsLCBhbmQgbWFraW5nIGl0IHRoZSBjb250cm9sbGluZyB0dHkuCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLSNpZiAhZGVmaW5lZChIQVZFX09QRU5QVFkpCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaWZkZWYgSEFWRV9TWVNfU1RBVF9ICi0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICi0jIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0ZDTlRMX0gKLSMgaW5jbHVkZSA8ZmNudGwuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VVElMX0gKLSMgaW5jbHVkZSA8dXRpbC5oPgotI2VuZGlmIC8qIEhBVkVfVVRJTF9IICovCi0KLSNpZmRlZiBIQVZFX1BUWV9ICi0jIGluY2x1ZGUgPHB0eS5oPgotI2VuZGlmCi0jaWYgZGVmaW5lZChIQVZFX0RFVl9QVE1YKSAmJiBkZWZpbmVkKEhBVkVfU1lTX1NUUk9QVFNfSCkKLSMgaW5jbHVkZSA8c3lzL3N0cm9wdHMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpZm5kZWYgT19OT0NUVFkKLSNkZWZpbmUgT19OT0NUVFkgMAotI2VuZGlmCi0KLWludAotb3BlbnB0eShpbnQgKmFtYXN0ZXIsIGludCAqYXNsYXZlLCBjaGFyICpuYW1lLCBzdHJ1Y3QgdGVybWlvcyAqdGVybXAsCi0gICBzdHJ1Y3Qgd2luc2l6ZSAqd2lucCkKLXsKLSNpZiBkZWZpbmVkKEhBVkVfX0dFVFBUWSkKLQkvKgotCSAqIF9nZXRwdHkoMykgZXhpc3RzIGluIFNHSSBJcml4IDQueCwgNS54ICYgNi54IC0tIGl0IGdlbmVyYXRlcyBtb3JlCi0JICogcHR5J3MgYXV0b21hZ2ljYWxseSB3aGVuIG5lZWRlZAotCSAqLwotCWNoYXIgKnNsYXZlOwotCi0JaWYgKChzbGF2ZSA9IF9nZXRwdHkoYW1hc3RlciwgT19SRFdSLCAwNjIyLCAwKSkgPT0gTlVMTCkKLQkJcmV0dXJuICgtMSk7Ci0KLQkvKiBPcGVuIHRoZSBzbGF2ZSBzaWRlLiAqLwotCWlmICgoKmFzbGF2ZSA9IG9wZW4oc2xhdmUsIE9fUkRXUiB8IE9fTk9DVFRZKSkgPT0gLTEpIHsKLQkJY2xvc2UoKmFtYXN0ZXIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JcmV0dXJuICgwKTsKLQotI2VsaWYgZGVmaW5lZChIQVZFX0RFVl9QVE1YKQotCS8qCi0JICogVGhpcyBjb2RlIGlzIHVzZWQgZS5nLiBvbiBTb2xhcmlzIDIueC4gIChOb3RlIHRoYXQgU29sYXJpcyAyLjMKLQkgKiBhbHNvIGhhcyBic2Qtc3R5bGUgcHR5cywgYnV0IHRoZXkgc2ltcGx5IGRvIG5vdCB3b3JrLikKLQkgKi8KLQlpbnQgcHRtOwotCWNoYXIgKnB0czsKLQlteXNpZ190IG9sZF9zaWduYWw7Ci0KLQlpZiAoKHB0bSA9IG9wZW4oIi9kZXYvcHRteCIsIE9fUkRXUiB8IE9fTk9DVFRZKSkgPT0gLTEpCi0JCXJldHVybiAoLTEpOwotCi0JLyogWFhYOiBuZWVkIHRvIGNsb3NlIHB0bSBvbiBlcnJvcj8gKi8KLQlvbGRfc2lnbmFsID0gc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOwotCWlmIChncmFudHB0KHB0bSkgPCAwKQotCQlyZXR1cm4gKC0xKTsKLQlzaWduYWwoU0lHQ0hMRCwgb2xkX3NpZ25hbCk7Ci0KLQlpZiAodW5sb2NrcHQocHRtKSA8IDApCi0JCXJldHVybiAoLTEpOwotCi0JaWYgKChwdHMgPSBwdHNuYW1lKHB0bSkpID09IE5VTEwpCi0JCXJldHVybiAoLTEpOwotCSphbWFzdGVyID0gcHRtOwotCi0JLyogT3BlbiB0aGUgc2xhdmUgc2lkZS4gKi8KLQlpZiAoKCphc2xhdmUgPSBvcGVuKHB0cywgT19SRFdSIHwgT19OT0NUVFkpKSA9PSAtMSkgewotCQljbG9zZSgqYW1hc3Rlcik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotI2lmbmRlZiBBTkRST0lECi0JLyoKLQkgKiBUcnkgdG8gcHVzaCB0aGUgYXBwcm9wcmlhdGUgc3RyZWFtcyBtb2R1bGVzLCBhcyBkZXNjcmliZWQgCi0JICogaW4gU29sYXJpcyBwdHMoNykuCi0JICovCi0JaW9jdGwoKmFzbGF2ZSwgSV9QVVNILCAicHRlbSIpOwotCWlvY3RsKCphc2xhdmUsIElfUFVTSCwgImxkdGVybSIpOwotIyBpZm5kZWYgX19ocHV4Ci0JaW9jdGwoKmFzbGF2ZSwgSV9QVVNILCAidHRjb21wYXQiKTsKLSMgZW5kaWYgLyogX19ocHV4ICovCi0jZW5kaWYgLyogQU5EUk9JRCAqLwotCi0JcmV0dXJuICgwKTsKLQotI2VsaWYgZGVmaW5lZChIQVZFX0RFVl9QVFNfQU5EX1BUQykKLQkvKiBBSVgtc3R5bGUgcHR5IGNvZGUuICovCi0JY29uc3QgY2hhciAqdHRuYW1lOwotCi0JaWYgKCgqYW1hc3RlciA9IG9wZW4oIi9kZXYvcHRjIiwgT19SRFdSIHwgT19OT0NUVFkpKSA9PSAtMSkKLQkJcmV0dXJuICgtMSk7Ci0JaWYgKCh0dG5hbWUgPSB0dHluYW1lKCphbWFzdGVyKSkgPT0gTlVMTCkKLQkJcmV0dXJuICgtMSk7Ci0JaWYgKCgqYXNsYXZlID0gb3Blbih0dG5hbWUsIE9fUkRXUiB8IE9fTk9DVFRZKSkgPT0gLTEpIHsKLQkJY2xvc2UoKmFtYXN0ZXIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JcmV0dXJuICgwKTsKLQotI2VsaWYgZGVmaW5lZChfVU5JQ09TKQotCWNoYXIgcHRidWZbNjRdLCB0dGJ1Zls2NF07Ci0JaW50IGk7Ci0JaW50IGhpZ2hwdHk7Ci0KLQloaWdocHR5ID0gMTI4OwotI2lmZGVmIF9TQ19DUkFZX05QVFkKLQlpZiAoKGhpZ2hwdHkgPSBzeXNjb25mKF9TQ19DUkFZX05QVFkpKSA9PSAtMSkKLQkJaGlnaHB0eSA9IDEyODsKLSNlbmRpZiAvKiBfU0NfQ1JBWV9OUFRZICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgaGlnaHB0eTsgaSsrKSB7Ci0JCXNucHJpbnRmKHB0YnVmLCBzaXplb2YocHRidWYpLCAiL2Rldi9wdHkvJTAzZCIsIGkpOwotCQlzbnByaW50Zih0dGJ1Ziwgc2l6ZW9mKHR0YnVmKSwgIi9kZXYvdHR5cCUwM2QiLCBpKTsKLQkJaWYgKCgqYW1hc3RlciA9IG9wZW4ocHRidWYsIE9fUkRXUnxPX05PQ1RUWSkpID09IC0xKQotCQkJY29udGludWU7Ci0JCS8qIE9wZW4gdGhlIHNsYXZlIHNpZGUuICovCi0JCWlmICgoKmFzbGF2ZSA9IG9wZW4odHRidWYsIE9fUkRXUnxPX05PQ1RUWSkpID09IC0xKSB7Ci0JCQljbG9zZSgqYW1hc3Rlcik7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCQlyZXR1cm4gKDApOwotCX0KLQlyZXR1cm4gKC0xKTsKLQotI2Vsc2UKLQkvKiBCU0Qtc3R5bGUgcHR5IGNvZGUuICovCi0JY2hhciBwdGJ1Zls2NF0sIHR0YnVmWzY0XTsKLQlpbnQgaTsKLQljb25zdCBjaGFyICpwdHltYWpvcnMgPSAicHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtbm8iCi0JICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7Ci0JY29uc3QgY2hhciAqcHR5bWlub3JzID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotCWludCBudW1fbWlub3JzID0gc3RybGVuKHB0eW1pbm9ycyk7Ci0JaW50IG51bV9wdHlzID0gc3RybGVuKHB0eW1ham9ycykgKiBudW1fbWlub3JzOwotCXN0cnVjdCB0ZXJtaW9zIHRpbzsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fcHR5czsgaSsrKSB7Ci0JCXNucHJpbnRmKHB0YnVmLCBzaXplb2YocHRidWYpLCAiL2Rldi9wdHklYyVjIiwgCi0JCSAgICBwdHltYWpvcnNbaSAvIG51bV9taW5vcnNdLCBwdHltaW5vcnNbaSAlIG51bV9taW5vcnNdKTsKLQkJc25wcmludGYodHRidWYsIHNpemVvZih0dGJ1ZiksICIvZGV2L3R0eSVjJWMiLAotCQkgICAgcHR5bWFqb3JzW2kgLyBudW1fbWlub3JzXSwgcHR5bWlub3JzW2kgJSBudW1fbWlub3JzXSk7Ci0KLQkJaWYgKCgqYW1hc3RlciA9IG9wZW4ocHRidWYsIE9fUkRXUiB8IE9fTk9DVFRZKSkgPT0gLTEpIHsKLQkJCS8qIFRyeSBTQ08gc3R5bGUgbmFtaW5nICovCi0JCQlzbnByaW50ZihwdGJ1Ziwgc2l6ZW9mKHB0YnVmKSwgIi9kZXYvcHR5cCVkIiwgaSk7Ci0JCQlzbnByaW50Zih0dGJ1Ziwgc2l6ZW9mKHR0YnVmKSwgIi9kZXYvdHR5cCVkIiwgaSk7Ci0JCQlpZiAoKCphbWFzdGVyID0gb3BlbihwdGJ1ZiwgT19SRFdSIHwgT19OT0NUVFkpKSA9PSAtMSkKLQkJCQljb250aW51ZTsKLQkJfQotCi0JCS8qIE9wZW4gdGhlIHNsYXZlIHNpZGUuICovCi0JCWlmICgoKmFzbGF2ZSA9IG9wZW4odHRidWYsIE9fUkRXUiB8IE9fTk9DVFRZKSkgPT0gLTEpIHsKLQkJCWNsb3NlKCphbWFzdGVyKTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JCS8qIHNldCB0dHkgbW9kZXMgdG8gYSBzYW5lIHN0YXRlIGZvciBicm9rZW4gY2xpZW50cyAqLwotCQlpZiAodGNnZXRhdHRyKCphbWFzdGVyLCAmdGlvKSAhPSAtMSkgewotCQkJdGlvLmNfbGZsYWcgfD0gKEVDSE8gfCBJU0lHIHwgSUNBTk9OKTsKLQkJCXRpby5jX29mbGFnIHw9IChPUE9TVCB8IE9OTENSKTsKLQkJCXRpby5jX2lmbGFnIHw9IElDUk5MOwotCQkJdGNzZXRhdHRyKCphbWFzdGVyLCBUQ1NBTk9XLCAmdGlvKTsKLQkJfQotCi0JCXJldHVybiAoMCk7Ci0JfQotCXJldHVybiAoLTEpOwotI2VuZGlmCi19Ci0KLSNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX09QRU5QVFkpICovCi0KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L2JzZC1wb2xsLmMgYi9vcGVuYnNkLWNvbXBhdC9ic2QtcG9sbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODk5ZDdhLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L2JzZC1wb2xsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyogJElkOiBic2QtcG9sbC5jLHYgMS40IDIwMDgvMDgvMjkgMjE6MzI6MzggZHR1Y2tlciBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1LCAyMDA3IERhcnJlbiBUdWNrZXIgKGR0dWNrZXIgYXQgemlwIGNvbSBhdSkuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0jaWYgIWRlZmluZWQoSEFWRV9QT0xMKQotCi0jaWZkZWYgSEFWRV9TWVNfU0VMRUNUX0gKLSMgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgImJzZC1wb2xsLmgiCi0KLS8qCi0gKiBBIG1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgcG9sbCgyKSwgYnVpbHQgb24gdG9wIG9mIHNlbGVjdCgyKS4KLSAqCi0gKiBPbmx5IHN1cHBvcnRzIFBPTExJTiBhbmQgUE9MTE9VVCBmbGFncyBpbiBwZmQuZXZlbnRzLCBhbmQgUE9MTElOLCBQT0xMT1VUCi0gKiBhbmQgUE9MTEVSUiBmbGFncyBpbiByZXZlbnRzLgotICoKLSAqIFN1cHBvcnRzIHBmZC5mZCA9IC0xIG1lYW5pbmcgInVudXNlZCIgYWx0aG91Z2ggaXQncyBub3Qgc3RhbmRhcmQuCi0gKi8KLQotaW50Ci1wb2xsKHN0cnVjdCBwb2xsZmQgKmZkcywgbmZkc190IG5mZHMsIGludCB0aW1lb3V0KQotewotCW5mZHNfdCBpOwotCWludCBzYXZlZF9lcnJubywgcmV0LCBmZCwgbWF4ZmQgPSAwOwotCWZkX3NldCAqcmVhZGZkcyA9IE5VTEwsICp3cml0ZWZkcyA9IE5VTEwsICpleGNlcHRmZHMgPSBOVUxMOwotCXNpemVfdCBubWVtYjsKLQlzdHJ1Y3QgdGltZXZhbCB0diwgKnR2cCA9IE5VTEw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmZkczsgaSsrKSB7Ci0JCWZkID0gZmRzW2ldLmZkOwotCQlpZiAoZmQgPj0gRkRfU0VUU0laRSkgewotCQkJZXJybm8gPSBFSU5WQUw7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbWF4ZmQgPSBNQVgobWF4ZmQsIGZkKTsKLQl9Ci0KLQlubWVtYiA9IGhvd21hbnkobWF4ZmQgKyAxICwgTkZEQklUUyk7Ci0JaWYgKChyZWFkZmRzID0gY2FsbG9jKG5tZW1iLCBzaXplb2YoZmRfbWFzaykpKSA9PSBOVUxMIHx8Ci0JICAgICh3cml0ZWZkcyA9IGNhbGxvYyhubWVtYiwgc2l6ZW9mKGZkX21hc2spKSkgPT0gTlVMTCB8fAotCSAgICAoZXhjZXB0ZmRzID0gY2FsbG9jKG5tZW1iLCBzaXplb2YoZmRfbWFzaykpKSA9PSBOVUxMKSB7Ci0JCXNhdmVkX2Vycm5vID0gRU5PTUVNOwotCQlyZXQgPSAtMTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogcG9wdWxhdGUgZXZlbnQgYml0IHZlY3RvcnMgZm9yIHRoZSBldmVudHMgd2UncmUgaW50ZXJlc3RlZCBpbiAqLwotCWZvciAoaSA9IDA7IGkgPCBuZmRzOyBpKyspIHsKLQkJZmQgPSBmZHNbaV0uZmQ7Ci0JCWlmIChmZCA9PSAtMSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoZmRzW2ldLmV2ZW50cyAmIFBPTExJTikgewotCQkJRkRfU0VUKGZkLCByZWFkZmRzKTsKLQkJCUZEX1NFVChmZCwgZXhjZXB0ZmRzKTsKLQkJfQotCQlpZiAoZmRzW2ldLmV2ZW50cyAmIFBPTExPVVQpIHsKLQkJCUZEX1NFVChmZCwgd3JpdGVmZHMpOwotCQkJRkRfU0VUKGZkLCBleGNlcHRmZHMpOwotCQl9Ci0JfQotCi0JLyogcG9sbCB0aW1lb3V0IGlzIG1zZWMsIHNlbGVjdCBpcyB0aW1ldmFsIChzZWMgKyB1c2VjKSAqLwotCWlmICh0aW1lb3V0ID49IDApIHsKLQkJdHYudHZfc2VjID0gdGltZW91dCAvIDEwMDA7Ci0JCXR2LnR2X3VzZWMgPSAodGltZW91dCAlIDEwMDApICogMTAwMDsKLQkJdHZwID0gJnR2OwotCX0KLQotCXJldCA9IHNlbGVjdChtYXhmZCArIDEsIHJlYWRmZHMsIHdyaXRlZmRzLCBleGNlcHRmZHMsIHR2cCk7Ci0Jc2F2ZWRfZXJybm8gPSBlcnJubzsKLQotCS8qIHNjYW4gdGhyb3VnaCBzZWxlY3QgcmVzdWx0cyBhbmQgc2V0IHBvbGwoKSBmbGFncyAqLwotCWZvciAoaSA9IDA7IGkgPCBuZmRzOyBpKyspIHsKLQkJZmQgPSBmZHNbaV0uZmQ7Ci0JCWZkc1tpXS5yZXZlbnRzID0gMDsKLQkJaWYgKGZkID09IC0xKQotCQkJY29udGludWU7Ci0JCWlmIChGRF9JU1NFVChmZCwgcmVhZGZkcykpIHsKLQkJCWZkc1tpXS5yZXZlbnRzIHw9IFBPTExJTjsKLQkJfQotCQlpZiAoRkRfSVNTRVQoZmQsIHdyaXRlZmRzKSkgewotCQkJZmRzW2ldLnJldmVudHMgfD0gUE9MTE9VVDsKLQkJfQotCQlpZiAoRkRfSVNTRVQoZmQsIGV4Y2VwdGZkcykpIHsKLQkJCWZkc1tpXS5yZXZlbnRzIHw9IFBPTExFUlI7Ci0JCX0KLQl9Ci0KLW91dDoKLQlpZiAocmVhZGZkcyAhPSBOVUxMKQotCQlmcmVlKHJlYWRmZHMpOwotCWlmICh3cml0ZWZkcyAhPSBOVUxMKQotCQlmcmVlKHdyaXRlZmRzKTsKLQlpZiAoZXhjZXB0ZmRzICE9IE5VTEwpCi0JCWZyZWUoZXhjZXB0ZmRzKTsKLQlpZiAocmV0ID09IC0xKQotCQllcnJubyA9IHNhdmVkX2Vycm5vOwotCXJldHVybiByZXQ7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L2JzZC1wb2xsLmggYi9vcGVuYnNkLWNvbXBhdC9ic2QtcG9sbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2JiOWNhLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L2JzZC1wb2xsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgkkT3BlbkJTRDogcG9sbC5oLHYgMS4xMSAyMDAzLzEyLzEwIDIzOjEwOjA4IG1pbGxlcnQgRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NiBUaGVvIGRlIFJhYWR0Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKiBPUEVOQlNEIE9SSUdJTkFMOiBzeXMvc3lzL3BvbGwuaCAqLwotCi0jaWYgIWRlZmluZWQoSEFWRV9QT0xMKSAmJiAhZGVmaW5lZChIQVZFX1BPTExfSCkKLSNpZm5kZWYJX0NPTVBBVF9QT0xMX0hfCi0jZGVmaW5lCV9DT01QQVRfUE9MTF9IXwotCi10eXBlZGVmIHN0cnVjdCBwb2xsZmQgewotCWludCAJZmQ7Ci0Jc2hvcnQJZXZlbnRzOwotCXNob3J0CXJldmVudHM7Ci19IHBvbGxmZF90OwotCi10eXBlZGVmIHVuc2lnbmVkIGludAluZmRzX3Q7Ci0KLSNkZWZpbmUJUE9MTElOCQkweDAwMDEKLSNkZWZpbmUJUE9MTE9VVAkJMHgwMDA0Ci0jZGVmaW5lCVBPTExFUlIJCTB4MDAwOAotI2lmIDAKLS8qIHRoZSBmb2xsb3dpbmcgYXJlIGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQgKi8KLSNkZWZpbmUJUE9MTFBSSQkJMHgwMDAyCi0jZGVmaW5lCVBPTExIVVAJCTB4MDAxMAotI2RlZmluZQlQT0xMTlZBTAkweDAwMjAKLSNkZWZpbmUJUE9MTFJETk9STQkweDAwNDAKLSNkZWZpbmUgUE9MTE5PUk0JUE9MTFJETk9STQotI2RlZmluZSBQT0xMV1JOT1JNICAgICAgUE9MTE9VVAotI2RlZmluZQlQT0xMUkRCQU5ECTB4MDA4MAotI2RlZmluZQlQT0xMV1JCQU5ECTB4MDEwMAotI2VuZGlmCi0KLSNkZWZpbmUgSU5GVElNCQkoLTEpCS8qIG5vdCBzdGFuZGFyZCAqLwotCi1pbnQgICBwb2xsKHN0cnVjdCBwb2xsZmQgKiwgbmZkc190LCBpbnQpOwotI2VuZGlmIC8qICFfQ09NUEFUX1BPTExfSF8gKi8KLSNlbmRpZiAvKiAhSEFWRV9QT0xMX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L2JzZC1zbnByaW50Zi5jIGIvb3BlbmJzZC1jb21wYXQvYnNkLXNucHJpbnRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDJiZTIuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvYnNkLXNucHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCBQYXRyaWNrIFBvd2VsbCAxOTk1Ci0gKiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gY29kZSB3cml0dGVuIGJ5IFBhdHJpY2sgUG93ZWxsIChwYXBvd2VsbEBhc3RhcnQuY29tKQotICogSXQgbWF5IGJlIHVzZWQgZm9yIGFueSBwdXJwb3NlIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgcmVtYWlucyBpbnRhY3QKLSAqIG9uIGFsbCBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBPcmlnaW5hbDoKLSAqIFBhdHJpY2sgUG93ZWxsIFR1ZSBBcHIgMTEgMDk6NDg6MjEgUERUIDE5OTUKLSAqIEEgYm9tYnByb29mIHZlcnNpb24gb2YgZG9wcm50IChkb3ByKSBpbmNsdWRlZC4KLSAqIFNpZ2guICBUaGlzIHNvcnQgb2YgdGhpbmcgaXMgYWx3YXlzIG5hc3R5IGRvIGRlYWwgd2l0aC4gIE5vdGUgdGhhdAotICogdGhlIHZlcnNpb24gaGVyZSBkb2VzIG5vdCBpbmNsdWRlIGZsb2F0aW5nIHBvaW50Li4uCi0gKgotICogc25wcmludGYoKSBpcyB1c2VkIGluc3RlYWQgb2Ygc3ByaW50ZigpIGFzIGl0IGRvZXMgbGltaXQgY2hlY2tzCi0gKiBmb3Igc3RyaW5nIGxlbmd0aC4gIFRoaXMgY292ZXJzIGEgbmFzdHkgbG9vcGhvbGUuCi0gKgotICogVGhlIG90aGVyIGZ1bmN0aW9ucyBhcmUgdGhlcmUgdG8gcHJldmVudCBOVUxMIHBvaW50ZXJzIGZyb20KLSAqIGNhdXNpbmcgbmFzdCBlZmZlY3RzLgotICoKLSAqIE1vcmUgUmVjZW50bHk6Ci0gKiAgQnJhbmRvbiBMb25nIDxibG9uZ0BmaWN0aW9uLm5ldD4gOS8xNS85NiBmb3IgbXV0dCAwLjQzCi0gKiAgVGhpcyB3YXMgdWdseS4gIEl0IGlzIHN0aWxsIHVnbHkuICBJIG9wdGVkIG91dCBvZiBmbG9hdGluZyBwb2ludAotICogIG51bWJlcnMsIGJ1dCB0aGUgZm9ybWF0dGVyIHVuZGVyc3RhbmRzIGp1c3QgYWJvdXQgZXZlcnl0aGluZwotICogIGZyb20gdGhlIG5vcm1hbCBDIHN0cmluZyBmb3JtYXQsIGF0IGxlYXN0IGFzIGZhciBhcyBJIGNhbiB0ZWxsIGZyb20KLSAqICB0aGUgU29sYXJpcyAyLjUgcHJpbnRmKDNTKSBtYW4gcGFnZS4KLSAqCi0gKiAgQnJhbmRvbiBMb25nIDxibG9uZ0BmaWN0aW9uLm5ldD4gMTAvMjIvOTcgZm9yIG11dHQgMC44Ny4xCi0gKiAgICBPaywgYWRkZWQgc29tZSBtaW5pbWFsIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQsIHdoaWNoIG1lYW5zIHRoaXMKLSAqICAgIHByb2JhYmx5IHJlcXVpcmVzIGxpYm0gb24gbW9zdCBvcGVyYXRpbmcgc3lzdGVtcy4gIERvbid0IHlldAotICogICAgc3VwcG9ydCB0aGUgZXhwb25lbnQgKGUsRSkgYW5kIHNpZ2ZpZyAoZyxHKS4gIEFsc28sIGZtdGludCgpCi0gKiAgICB3YXMgcHJldHR5IGJhZGx5IGJyb2tlbiwgaXQganVzdCB3YXNuJ3QgYmVpbmcgZXhlcmNpc2VkIGluIHdheXMKLSAqICAgIHdoaWNoIHNob3dlZCBpdCwgc28gdGhhdCdzIGJlZW4gZml4ZWQuICBBbHNvLCBmb3JtYXRlZCB0aGUgY29kZQotICogICAgdG8gbXV0dCBjb252ZW50aW9ucywgYW5kIHJlbW92ZWQgZGVhZCBjb2RlIGxlZnQgb3ZlciBmcm9tIHRoZQotICogICAgb3JpZ2luYWwuICBBbHNvLCB0aGVyZSBpcyBub3cgYSBidWlsdGluLXRlc3QsIGp1c3QgY29tcGlsZSB3aXRoOgotICogICAgICAgICAgIGdjYyAtRFRFU1RfU05QUklOVEYgLW8gc25wcmludGYgc25wcmludGYuYyAtbG0KLSAqICAgIGFuZCBydW4gc25wcmludGYgZm9yIHJlc3VsdHMuCi0gKiAKLSAqICBUaG9tYXMgUm9lc3NsZXIgPHJvZXNzbGVyQGd1dWcuZGU+IDAxLzI3Lzk4IGZvciBtdXR0IDAuODlpCi0gKiAgICBUaGUgUEdQIGNvZGUgd2FzIHVzaW5nIHVuc2lnbmVkIGhleGFkZWNpbWFsIGZvcm1hdHMuIAotICogICAgVW5mb3J0dW5hdGVseSwgdW5zaWduZWQgZm9ybWF0cyBzaW1wbHkgZGlkbid0IHdvcmsuCi0gKgotICogIE1pY2hhZWwgRWxraW5zIDxtZUBjcy5obWMuZWR1PiAwMy8wNS85OCBmb3IgbXV0dCAwLjkwLjgKLSAqICAgIFRoZSBvcmlnaW5hbCBjb2RlIGFzc3VtZWQgdGhhdCBib3RoIHNucHJpbnRmKCkgYW5kIHZzbnByaW50ZigpIHdlcmUKLSAqICAgIG1pc3NpbmcuICBTb21lIHN5c3RlbXMgb25seSBoYXZlIHNucHJpbnRmKCkgYnV0IG5vdCB2c25wcmludGYoKSwgc28KLSAqICAgIHRoZSBjb2RlIGlzIG5vdyBicm9rZW4gZG93biB1bmRlciBIQVZFX1NOUFJJTlRGIGFuZCBIQVZFX1ZTTlBSSU5URi4KLSAqCi0gKiAgQW5kcmV3IFRyaWRnZWxsICh0cmlkZ2VAc2FtYmEub3JnKSBPY3QgMTk5OAotICogICAgZml4ZWQgaGFuZGxpbmcgb2YgJS4wZgotICogICAgYWRkZWQgdGVzdCBmb3IgSEFWRV9MT05HX0RPVUJMRQotICoKLSAqIHRyaWRnZUBzYW1iYS5vcmcsIGlkcmFAc2FtYmEub3JnLCBBcHJpbCAyMDAxCi0gKiAgICBnb3QgcmlkIG9mIGZjdnQgY29kZSAodHdhcyBidWdneSBhbmQgbWFkZSB0ZXN0aW5nIGhhcmRlcikKLSAqICAgIGFkZGVkIEM5OSBzZW1hbnRpY3MKLSAqCi0gKiBkYXRlOiAyMDAyLzEyLzE5IDE5OjU2OjMxOyAgYXV0aG9yOiBoZXJiOyAgc3RhdGU6IEV4cDsgIGxpbmVzOiArMiAtMAotICogYWN0dWFsbHkgcHJpbnQgYXJncyBmb3IgJWcgYW5kICVlCi0gKiAKLSAqIGRhdGU6IDIwMDIvMDYvMDMgMTM6Mzc6NTI7ICBhdXRob3I6IGptY2Q7ICBzdGF0ZTogRXhwOyAgbGluZXM6ICs4IC0wCi0gKiBTaW5jZSBpbmNsdWRlcy5oIGlzbid0IGluY2x1ZGVkIGhlcmUsIFZBX0NPUFkgaGFzIHRvIGJlIGRlZmluZWQgaGVyZS4gIEkgZG9uJ3QKLSAqIHNlZSBhbnkgaW5jbHVkZSBmaWxlIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBoZXJlLCBzbyBJJ20gZGVmaW5pbmcgaXQKLSAqIGxvY2FsbHkuICBGaXhlcyBBSVggYW5kIFNvbGFyaXMgYnVpbGRzLgotICogCi0gKiBkYXRlOiAyMDAyLzA2LzAzIDAzOjA3OjI0OyAgYXV0aG9yOiB0cmlkZ2U7ICBzdGF0ZTogRXhwOyAgbGluZXM6ICs1IC0xMwotICogcHV0IHRoZSBpZmRlZiBmb3IgSEFWRV9WQV9DT1BZIGluIG9uZSBwbGFjZSByYXRoZXIgdGhhbiBpbiBsb3RzIG9mCi0gKiBmdW5jdGlvbnMKLSAqIAotICogZGF0ZTogMjAwMi8wNS8xNyAxNDo1MToyMjsgIGF1dGhvcjogam1jZDsgIHN0YXRlOiBFeHA7ICBsaW5lczogKzIxIC00Ci0gKiBGaXggdXNhZ2Ugb2YgdmFfbGlzdCBwYXNzZWQgYXMgYW4gYXJnLiAgVXNlIF9fdmFfY29weSBiZWZvcmUgdXNpbmcgaXQKLSAqIHdoZW4gaXQgZXhpc3RzLgotICogCi0gKiBkYXRlOiAyMDAyLzA0LzE2IDIyOjM4OjA0OyAgYXV0aG9yOiBpZHJhOyAgc3RhdGU6IEV4cDsgIGxpbmVzOiArMjAgLTE0Ci0gKiBGaXggaW5jb3JyZWN0IHpwYWRsZW4gaGFuZGxpbmcgaW4gZm10ZnAuCi0gKiBUaGFua3MgdG8gT2xsaWUgT2xkaGFtIDxvbGxpZS5vbGRoYW1AbWV0cm8tb3B0aXguY29tPiBmb3Igc3BvdHRpbmcgaXQuCi0gKiBmZXcgbW9kcyB0byBtYWtlIGl0IGVhc2llciB0byBjb21waWxlIHRoZSB0ZXN0cy4KLSAqIGFkZGVkZCB0aGUgIk9sbGllIiB0ZXN0IHRvIHRoZSBmbG9hdGluZyBwb2ludCBvbmVzLgotICoKLSAqIE1hcnRpbiBQb29sIChtYnBAc2FtYmEub3JnKSBBcHJpbCAyMDAzCi0gKiAgICBSZW1vdmUgTk9fQ09ORklHX0ggc28gdGhhdCB0aGUgdGVzdCBjYXNlIGNhbiBiZSBidWlsdCB3aXRoaW4gYSBzb3VyY2UKLSAqICAgIHRyZWUgd2l0aCBsZXNzIHRyb3VibGUuCi0gKiAgICBSZW1vdmUgdW5uZWNlc3NhcnkgU0FGRV9GUkVFKCkgZGVmaW5pdGlvbi4KLSAqCi0gKiBNYXJ0aW4gUG9vbCAobWJwQHNhbWJhLm9yZykgTWF5IDIwMDMKLSAqICAgIFB1dCBpbiBhIHByb3RvdHlwZSBmb3IgZHVtbXlfc25wcmludGYoKSB0byBxdWlldCBjb21waWxlciB3YXJuaW5ncy4KLSAqCi0gKiAgICBNb3ZlICNlbmRpZiB0byBtYWtlIHN1cmUgVkFfQ09QWSwgTERPVUJMRSwgZXRjIGFyZSBkZWZpbmVkIGV2ZW4KLSAqICAgIGlmIHRoZSBDIGxpYnJhcnkgaGFzIHNvbWUgc25wcmludGYgZnVuY3Rpb25zIGFscmVhZHkuCi0gKgotICogRGFtaWVuIE1pbGxlciAoZGptQG1pbmRyb3Qub3JnKSBKYW4gMjAwNwotICogICAgRml4IGludGVnZXIgb3ZlcmZsb3dzIGluIHJldHVybiB2YWx1ZS4KLSAqICAgIE1ha2UgZm9ybWF0dGluZyBxdWl0ZSBhIGJpdCBmYXN0ZXIgYnkgaW5saW5pbmcgZG9wcl9vdXRjaCgpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmIGRlZmluZWQoQlJPS0VOX1NOUFJJTlRGKQkJLyogRm9yIHRob3NlIHdpdGggYnJva2VuIHNucHJpbnRmKCkgKi8KLSMgdW5kZWYgSEFWRV9TTlBSSU5URgotIyB1bmRlZiBIQVZFX1ZTTlBSSU5URgotI2VuZGlmCi0KLSNpZm5kZWYgVkFfQ09QWQotIyBpZmRlZiBIQVZFX1ZBX0NPUFkKLSMgIGRlZmluZSBWQV9DT1BZKGRlc3QsIHNyYykgdmFfY29weShkZXN0LCBzcmMpCi0jIGVsc2UKLSMgIGlmZGVmIEhBVkVfX19WQV9DT1BZCi0jICAgZGVmaW5lIFZBX0NPUFkoZGVzdCwgc3JjKSBfX3ZhX2NvcHkoZGVzdCwgc3JjKQotIyAgZWxzZQotIyAgIGRlZmluZSBWQV9DT1BZKGRlc3QsIHNyYykgKGRlc3QpID0gKHNyYykKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEhBVkVfU05QUklOVEYpIHx8ICFkZWZpbmVkKEhBVkVfVlNOUFJJTlRGKQotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZkZWYgSEFWRV9MT05HX0RPVUJMRQotIyBkZWZpbmUgTERPVUJMRSBsb25nIGRvdWJsZQotI2Vsc2UKLSMgZGVmaW5lIExET1VCTEUgZG91YmxlCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0jIGRlZmluZSBMTE9ORyBsb25nIGxvbmcKLSNlbHNlCi0jIGRlZmluZSBMTE9ORyBsb25nCi0jZW5kaWYKLQotLyoKLSAqIGRvcHIoKTogcG9vciBtYW4ncyB2ZXJzaW9uIG9mIGRvcHJpbnRmCi0gKi8KLQotLyogZm9ybWF0IHJlYWQgc3RhdGVzICovCi0jZGVmaW5lIERQX1NfREVGQVVMVCAwCi0jZGVmaW5lIERQX1NfRkxBR1MgICAxCi0jZGVmaW5lIERQX1NfTUlOICAgICAyCi0jZGVmaW5lIERQX1NfRE9UICAgICAzCi0jZGVmaW5lIERQX1NfTUFYICAgICA0Ci0jZGVmaW5lIERQX1NfTU9EICAgICA1Ci0jZGVmaW5lIERQX1NfQ09OViAgICA2Ci0jZGVmaW5lIERQX1NfRE9ORSAgICA3Ci0KLS8qIGZvcm1hdCBmbGFncyAtIEJpdHMgKi8KLSNkZWZpbmUgRFBfRl9NSU5VUyAJKDEgPDwgMCkKLSNkZWZpbmUgRFBfRl9QTFVTICAJKDEgPDwgMSkKLSNkZWZpbmUgRFBfRl9TUEFDRSAJKDEgPDwgMikKLSNkZWZpbmUgRFBfRl9OVU0gICAJKDEgPDwgMykKLSNkZWZpbmUgRFBfRl9aRVJPICAJKDEgPDwgNCkKLSNkZWZpbmUgRFBfRl9VUCAgICAJKDEgPDwgNSkKLSNkZWZpbmUgRFBfRl9VTlNJR05FRCAJKDEgPDwgNikKLQotLyogQ29udmVyc2lvbiBGbGFncyAqLwotI2RlZmluZSBEUF9DX1NIT1JUICAgMQotI2RlZmluZSBEUF9DX0xPTkcgICAgMgotI2RlZmluZSBEUF9DX0xET1VCTEUgMwotI2RlZmluZSBEUF9DX0xMT05HICAgNAotCi0jZGVmaW5lIGNoYXJfdG9faW50KHApICgocCktICcwJykKLSNpZm5kZWYgTUFYCi0jIGRlZmluZSBNQVgocCxxKSAoKChwKSA+PSAocSkpID8gKHApIDogKHEpKQotI2VuZGlmCi0KLSNkZWZpbmUgRE9QUl9PVVRDSChidWYsIHBvcywgYnVmbGVuLCB0aGVjaGFyKSBcCi0JZG8geyBcCi0JCWlmIChwb3MgKyAxID49IElOVF9NQVgpIHsgXAotCQkJZXJybm8gPSBFUkFOR0U7IFwKLQkJCXJldHVybiAtMTsgXAotCQl9IFwKLQkJaWYgKHBvcyA8IGJ1ZmxlbikgXAotCQkJYnVmW3Bvc10gPSB0aGVjaGFyOyBcCi0JCShwb3MpKys7IFwKLQl9IHdoaWxlICgwKQotCi1zdGF0aWMgaW50IGRvcHIoY2hhciAqYnVmZmVyLCBzaXplX3QgbWF4bGVuLCBjb25zdCBjaGFyICpmb3JtYXQsIAotICAgIHZhX2xpc3QgYXJnc19pbik7Ci1zdGF0aWMgaW50IGZtdHN0cihjaGFyICpidWZmZXIsIHNpemVfdCAqY3Vycmxlbiwgc2l6ZV90IG1heGxlbiwKLSAgICBjaGFyICp2YWx1ZSwgaW50IGZsYWdzLCBpbnQgbWluLCBpbnQgbWF4KTsKLXN0YXRpYyBpbnQgZm10aW50KGNoYXIgKmJ1ZmZlciwgc2l6ZV90ICpjdXJybGVuLCBzaXplX3QgbWF4bGVuLAotICAgIExMT05HIHZhbHVlLCBpbnQgYmFzZSwgaW50IG1pbiwgaW50IG1heCwgaW50IGZsYWdzKTsKLXN0YXRpYyBpbnQgZm10ZnAoY2hhciAqYnVmZmVyLCBzaXplX3QgKmN1cnJsZW4sIHNpemVfdCBtYXhsZW4sCi0gICAgTERPVUJMRSBmdmFsdWUsIGludCBtaW4sIGludCBtYXgsIGludCBmbGFncyk7Ci0KLXN0YXRpYyBpbnQKLWRvcHIoY2hhciAqYnVmZmVyLCBzaXplX3QgbWF4bGVuLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJnc19pbikKLXsKLQljaGFyIGNoOwotCUxMT05HIHZhbHVlOwotCUxET1VCTEUgZnZhbHVlOwotCWNoYXIgKnN0cnZhbHVlOwotCWludCBtaW47Ci0JaW50IG1heDsKLQlpbnQgc3RhdGU7Ci0JaW50IGZsYWdzOwotCWludCBjZmxhZ3M7Ci0Jc2l6ZV90IGN1cnJsZW47Ci0JdmFfbGlzdCBhcmdzOwotCi0JVkFfQ09QWShhcmdzLCBhcmdzX2luKTsKLQkKLQlzdGF0ZSA9IERQX1NfREVGQVVMVDsKLQljdXJybGVuID0gZmxhZ3MgPSBjZmxhZ3MgPSBtaW4gPSAwOwotCW1heCA9IC0xOwotCWNoID0gKmZvcm1hdCsrOwotCQotCXdoaWxlIChzdGF0ZSAhPSBEUF9TX0RPTkUpIHsKLQkJaWYgKGNoID09ICdcMCcpIAotCQkJc3RhdGUgPSBEUF9TX0RPTkU7Ci0KLQkJc3dpdGNoKHN0YXRlKSB7Ci0JCWNhc2UgRFBfU19ERUZBVUxUOgotCQkJaWYgKGNoID09ICclJykgCi0JCQkJc3RhdGUgPSBEUF9TX0ZMQUdTOwotCQkJZWxzZQotCQkJCURPUFJfT1VUQ0goYnVmZmVyLCBjdXJybGVuLCBtYXhsZW4sIGNoKTsKLQkJCWNoID0gKmZvcm1hdCsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFBfU19GTEFHUzoKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJy0nOgotCQkJCWZsYWdzIHw9IERQX0ZfTUlOVVM7Ci0JCQkJY2ggPSAqZm9ybWF0Kys7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcrJzoKLQkJCQlmbGFncyB8PSBEUF9GX1BMVVM7Ci0JCQkJY2ggPSAqZm9ybWF0Kys7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcgJzoKLQkJCQlmbGFncyB8PSBEUF9GX1NQQUNFOwotCQkJCWNoID0gKmZvcm1hdCsrOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnIyc6Ci0JCQkJZmxhZ3MgfD0gRFBfRl9OVU07Ci0JCQkJY2ggPSAqZm9ybWF0Kys7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcwJzoKLQkJCQlmbGFncyB8PSBEUF9GX1pFUk87Ci0JCQkJY2ggPSAqZm9ybWF0Kys7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXN0YXRlID0gRFBfU19NSU47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBEUF9TX01JTjoKLQkJCWlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKWNoKSkgewotCQkJCW1pbiA9IDEwKm1pbiArIGNoYXJfdG9faW50IChjaCk7Ci0JCQkJY2ggPSAqZm9ybWF0Kys7Ci0JCQl9IGVsc2UgaWYgKGNoID09ICcqJykgewotCQkJCW1pbiA9IHZhX2FyZyAoYXJncywgaW50KTsKLQkJCQljaCA9ICpmb3JtYXQrKzsKLQkJCQlzdGF0ZSA9IERQX1NfRE9UOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0ZSA9IERQX1NfRE9UOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRFBfU19ET1Q6Ci0JCQlpZiAoY2ggPT0gJy4nKSB7Ci0JCQkJc3RhdGUgPSBEUF9TX01BWDsKLQkJCQljaCA9ICpmb3JtYXQrKzsKLQkJCX0gZWxzZSB7IAotCQkJCXN0YXRlID0gRFBfU19NT0Q7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBEUF9TX01BWDoKLQkJCWlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKWNoKSkgewotCQkJCWlmIChtYXggPCAwKQotCQkJCQltYXggPSAwOwotCQkJCW1heCA9IDEwKm1heCArIGNoYXJfdG9faW50IChjaCk7Ci0JCQkJY2ggPSAqZm9ybWF0Kys7Ci0JCQl9IGVsc2UgaWYgKGNoID09ICcqJykgewotCQkJCW1heCA9IHZhX2FyZyAoYXJncywgaW50KTsKLQkJCQljaCA9ICpmb3JtYXQrKzsKLQkJCQlzdGF0ZSA9IERQX1NfTU9EOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0ZSA9IERQX1NfTU9EOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRFBfU19NT0Q6Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICdoJzoKLQkJCQljZmxhZ3MgPSBEUF9DX1NIT1JUOwotCQkJCWNoID0gKmZvcm1hdCsrOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnbCc6Ci0JCQkJY2ZsYWdzID0gRFBfQ19MT05HOwotCQkJCWNoID0gKmZvcm1hdCsrOwotCQkJCWlmIChjaCA9PSAnbCcpIHsJLyogSXQncyBhIGxvbmcgbG9uZyAqLwotCQkJCQljZmxhZ3MgPSBEUF9DX0xMT05HOwotCQkJCQljaCA9ICpmb3JtYXQrKzsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdMJzoKLQkJCQljZmxhZ3MgPSBEUF9DX0xET1VCTEU7Ci0JCQkJY2ggPSAqZm9ybWF0Kys7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQkJc3RhdGUgPSBEUF9TX0NPTlY7Ci0JCQlicmVhazsKLQkJY2FzZSBEUF9TX0NPTlY6Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICdkJzoKLQkJCWNhc2UgJ2knOgotCQkJCWlmIChjZmxhZ3MgPT0gRFBfQ19TSE9SVCkgCi0JCQkJCXZhbHVlID0gdmFfYXJnIChhcmdzLCBpbnQpOwotCQkJCWVsc2UgaWYgKGNmbGFncyA9PSBEUF9DX0xPTkcpCi0JCQkJCXZhbHVlID0gdmFfYXJnIChhcmdzLCBsb25nIGludCk7Ci0JCQkJZWxzZSBpZiAoY2ZsYWdzID09IERQX0NfTExPTkcpCi0JCQkJCXZhbHVlID0gdmFfYXJnIChhcmdzLCBMTE9ORyk7Ci0JCQkJZWxzZQotCQkJCQl2YWx1ZSA9IHZhX2FyZyAoYXJncywgaW50KTsKLQkJCQlpZiAoZm10aW50KGJ1ZmZlciwgJmN1cnJsZW4sIG1heGxlbiwKLQkJCQkgICAgdmFsdWUsIDEwLCBtaW4sIG1heCwgZmxhZ3MpID09IC0xKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdvJzoKLQkJCQlmbGFncyB8PSBEUF9GX1VOU0lHTkVEOwotCQkJCWlmIChjZmxhZ3MgPT0gRFBfQ19TSE9SVCkKLQkJCQkJdmFsdWUgPSB2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGludCk7Ci0JCQkJZWxzZSBpZiAoY2ZsYWdzID09IERQX0NfTE9ORykKLQkJCQkJdmFsdWUgPSAobG9uZyl2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGxvbmcgaW50KTsKLQkJCQllbHNlIGlmIChjZmxhZ3MgPT0gRFBfQ19MTE9ORykKLQkJCQkJdmFsdWUgPSAobG9uZyl2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIExMT05HKTsKLQkJCQllbHNlCi0JCQkJCXZhbHVlID0gKGxvbmcpdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBpbnQpOwotCQkJCWlmIChmbXRpbnQoYnVmZmVyLCAmY3VycmxlbiwgbWF4bGVuLCB2YWx1ZSwKLQkJCQkgICAgOCwgbWluLCBtYXgsIGZsYWdzKSA9PSAtMSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWJyZWFrOwotCQkJY2FzZSAndSc6Ci0JCQkJZmxhZ3MgfD0gRFBfRl9VTlNJR05FRDsKLQkJCQlpZiAoY2ZsYWdzID09IERQX0NfU0hPUlQpCi0JCQkJCXZhbHVlID0gdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBpbnQpOwotCQkJCWVsc2UgaWYgKGNmbGFncyA9PSBEUF9DX0xPTkcpCi0JCQkJCXZhbHVlID0gKGxvbmcpdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBsb25nIGludCk7Ci0JCQkJZWxzZSBpZiAoY2ZsYWdzID09IERQX0NfTExPTkcpCi0JCQkJCXZhbHVlID0gKExMT05HKXZhX2FyZyAoYXJncywgdW5zaWduZWQgTExPTkcpOwotCQkJCWVsc2UKLQkJCQkJdmFsdWUgPSAobG9uZyl2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGludCk7Ci0JCQkJaWYgKGZtdGludChidWZmZXIsICZjdXJybGVuLCBtYXhsZW4sIHZhbHVlLAotCQkJCSAgICAxMCwgbWluLCBtYXgsIGZsYWdzKSA9PSAtMSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnWCc6Ci0JCQkJZmxhZ3MgfD0gRFBfRl9VUDsKLQkJCWNhc2UgJ3gnOgotCQkJCWZsYWdzIHw9IERQX0ZfVU5TSUdORUQ7Ci0JCQkJaWYgKGNmbGFncyA9PSBEUF9DX1NIT1JUKQotCQkJCQl2YWx1ZSA9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgaW50KTsKLQkJCQllbHNlIGlmIChjZmxhZ3MgPT0gRFBfQ19MT05HKQotCQkJCQl2YWx1ZSA9IChsb25nKXZhX2FyZyAoYXJncywgdW5zaWduZWQgbG9uZyBpbnQpOwotCQkJCWVsc2UgaWYgKGNmbGFncyA9PSBEUF9DX0xMT05HKQotCQkJCQl2YWx1ZSA9IChMTE9ORyl2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIExMT05HKTsKLQkJCQllbHNlCi0JCQkJCXZhbHVlID0gKGxvbmcpdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBpbnQpOwotCQkJCWlmIChmbXRpbnQoYnVmZmVyLCAmY3VycmxlbiwgbWF4bGVuLCB2YWx1ZSwKLQkJCQkgICAgMTYsIG1pbiwgbWF4LCBmbGFncykgPT0gLTEpCi0JCQkJCXJldHVybiAtMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ2YnOgotCQkJCWlmIChjZmxhZ3MgPT0gRFBfQ19MRE9VQkxFKQotCQkJCQlmdmFsdWUgPSB2YV9hcmcgKGFyZ3MsIExET1VCTEUpOwotCQkJCWVsc2UKLQkJCQkJZnZhbHVlID0gdmFfYXJnIChhcmdzLCBkb3VibGUpOwotCQkJCWlmIChmbXRmcChidWZmZXIsICZjdXJybGVuLCBtYXhsZW4sIGZ2YWx1ZSwKLQkJCQkgICAgbWluLCBtYXgsIGZsYWdzKSA9PSAtMSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnRSc6Ci0JCQkJZmxhZ3MgfD0gRFBfRl9VUDsKLQkJCWNhc2UgJ2UnOgotCQkJCWlmIChjZmxhZ3MgPT0gRFBfQ19MRE9VQkxFKQotCQkJCQlmdmFsdWUgPSB2YV9hcmcgKGFyZ3MsIExET1VCTEUpOwotCQkJCWVsc2UKLQkJCQkJZnZhbHVlID0gdmFfYXJnIChhcmdzLCBkb3VibGUpOwotCQkJCWlmIChmbXRmcChidWZmZXIsICZjdXJybGVuLCBtYXhsZW4sIGZ2YWx1ZSwKLQkJCQkgICAgbWluLCBtYXgsIGZsYWdzKSA9PSAtMSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnRyc6Ci0JCQkJZmxhZ3MgfD0gRFBfRl9VUDsKLQkJCWNhc2UgJ2cnOgotCQkJCWlmIChjZmxhZ3MgPT0gRFBfQ19MRE9VQkxFKQotCQkJCQlmdmFsdWUgPSB2YV9hcmcgKGFyZ3MsIExET1VCTEUpOwotCQkJCWVsc2UKLQkJCQkJZnZhbHVlID0gdmFfYXJnIChhcmdzLCBkb3VibGUpOwotCQkJCWlmIChmbXRmcChidWZmZXIsICZjdXJybGVuLCBtYXhsZW4sIGZ2YWx1ZSwKLQkJCQkgICAgbWluLCBtYXgsIGZsYWdzKSA9PSAtMSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnYyc6Ci0JCQkJRE9QUl9PVVRDSChidWZmZXIsIGN1cnJsZW4sIG1heGxlbiwKLQkJCQkgICAgdmFfYXJnIChhcmdzLCBpbnQpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3MnOgotCQkJCXN0cnZhbHVlID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotCQkJCWlmICghc3RydmFsdWUpIHN0cnZhbHVlID0gIihOVUxMKSI7Ci0JCQkJaWYgKG1heCA9PSAtMSkgewotCQkJCQltYXggPSBzdHJsZW4oc3RydmFsdWUpOwotCQkJCX0KLQkJCQlpZiAobWluID4gMCAmJiBtYXggPj0gMCAmJiBtaW4gPiBtYXgpIG1heCA9IG1pbjsKLQkJCQlpZiAoZm10c3RyKGJ1ZmZlciwgJmN1cnJsZW4sIG1heGxlbiwKLQkJCQkgICAgc3RydmFsdWUsIGZsYWdzLCBtaW4sIG1heCkgPT0gLTEpCi0JCQkJCXJldHVybiAtMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3AnOgotCQkJCXN0cnZhbHVlID0gdmFfYXJnIChhcmdzLCB2b2lkICopOwotCQkJCWlmIChmbXRpbnQoYnVmZmVyLCAmY3VycmxlbiwgbWF4bGVuLAotCQkJCSAgICAobG9uZykgc3RydmFsdWUsIDE2LCBtaW4sIG1heCwgZmxhZ3MpID09IC0xKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICduJzoKLQkJCQlpZiAoY2ZsYWdzID09IERQX0NfU0hPUlQpIHsKLQkJCQkJc2hvcnQgaW50ICpudW07Ci0JCQkJCW51bSA9IHZhX2FyZyAoYXJncywgc2hvcnQgaW50ICopOwotCQkJCQkqbnVtID0gY3VycmxlbjsKLQkJCQl9IGVsc2UgaWYgKGNmbGFncyA9PSBEUF9DX0xPTkcpIHsKLQkJCQkJbG9uZyBpbnQgKm51bTsKLQkJCQkJbnVtID0gdmFfYXJnIChhcmdzLCBsb25nIGludCAqKTsKLQkJCQkJKm51bSA9IChsb25nIGludCljdXJybGVuOwotCQkJCX0gZWxzZSBpZiAoY2ZsYWdzID09IERQX0NfTExPTkcpIHsKLQkJCQkJTExPTkcgKm51bTsKLQkJCQkJbnVtID0gdmFfYXJnIChhcmdzLCBMTE9ORyAqKTsKLQkJCQkJKm51bSA9IChMTE9ORyljdXJybGVuOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludCAqbnVtOwotCQkJCQludW0gPSB2YV9hcmcgKGFyZ3MsIGludCAqKTsKLQkJCQkJKm51bSA9IGN1cnJsZW47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAnJSc6Ci0JCQkJRE9QUl9PVVRDSChidWZmZXIsIGN1cnJsZW4sIG1heGxlbiwgY2gpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAndyc6Ci0JCQkJLyogbm90IHN1cHBvcnRlZCB5ZXQsIHRyZWF0IGFzIG5leHQgY2hhciAqLwotCQkJCWNoID0gKmZvcm1hdCsrOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvKiBVbmtub3duLCBza2lwICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljaCA9ICpmb3JtYXQrKzsKLQkJCXN0YXRlID0gRFBfU19ERUZBVUxUOwotCQkJZmxhZ3MgPSBjZmxhZ3MgPSBtaW4gPSAwOwotCQkJbWF4ID0gLTE7Ci0JCQlicmVhazsKLQkJY2FzZSBEUF9TX0RPTkU6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIGhtbT8gKi8KLQkJCWJyZWFrOyAvKiBzb21lIHBpY2t5IGNvbXBpbGVycyBuZWVkIHRoaXMgKi8KLQkJfQotCX0KLQlpZiAobWF4bGVuICE9IDApIHsKLQkJaWYgKGN1cnJsZW4gPCBtYXhsZW4gLSAxKSAKLQkJCWJ1ZmZlcltjdXJybGVuXSA9ICdcMCc7Ci0JCWVsc2UgaWYgKG1heGxlbiA+IDApIAotCQkJYnVmZmVyW21heGxlbiAtIDFdID0gJ1wwJzsKLQl9Ci0JCi0JcmV0dXJuIGN1cnJsZW4gPCBJTlRfTUFYID8gKGludCljdXJybGVuIDogLTE7Ci19Ci0KLXN0YXRpYyBpbnQKLWZtdHN0cihjaGFyICpidWZmZXIsIHNpemVfdCAqY3Vycmxlbiwgc2l6ZV90IG1heGxlbiwKLSAgICBjaGFyICp2YWx1ZSwgaW50IGZsYWdzLCBpbnQgbWluLCBpbnQgbWF4KQotewotCWludCBwYWRsZW4sIHN0cmxuOyAgICAgLyogYW1vdW50IHRvIHBhZCAqLwotCWludCBjbnQgPSAwOwotCi0jaWZkZWYgREVCVUdfU05QUklOVEYKLQlwcmludGYoImZtdHN0ciBtaW49JWQgbWF4PSVkIHM9WyVzXVxuIiwgbWluLCBtYXgsIHZhbHVlKTsKLSNlbmRpZgotCWlmICh2YWx1ZSA9PSAwKSB7Ci0JCXZhbHVlID0gIjxOVUxMPiI7Ci0JfQotCi0JZm9yIChzdHJsbiA9IDA7IHN0cmxuIDwgbWF4ICYmIHZhbHVlW3N0cmxuXTsgKytzdHJsbik7IC8qIHN0cmxlbiAqLwotCXBhZGxlbiA9IG1pbiAtIHN0cmxuOwotCWlmIChwYWRsZW4gPCAwKSAKLQkJcGFkbGVuID0gMDsKLQlpZiAoZmxhZ3MgJiBEUF9GX01JTlVTKSAKLQkJcGFkbGVuID0gLXBhZGxlbjsgLyogTGVmdCBKdXN0aWZ5ICovCi0JCi0Jd2hpbGUgKChwYWRsZW4gPiAwKSAmJiAoY250IDwgbWF4KSkgewotCQlET1BSX09VVENIKGJ1ZmZlciwgKmN1cnJsZW4sIG1heGxlbiwgJyAnKTsKLQkJLS1wYWRsZW47Ci0JCSsrY250OwotCX0KLQl3aGlsZSAoKnZhbHVlICYmIChjbnQgPCBtYXgpKSB7Ci0JCURPUFJfT1VUQ0goYnVmZmVyLCAqY3VycmxlbiwgbWF4bGVuLCAqdmFsdWUpOwotCQkqdmFsdWUrKzsKLQkJKytjbnQ7Ci0JfQotCXdoaWxlICgocGFkbGVuIDwgMCkgJiYgKGNudCA8IG1heCkpIHsKLQkJRE9QUl9PVVRDSChidWZmZXIsICpjdXJybGVuLCBtYXhsZW4sICcgJyk7Ci0JCSsrcGFkbGVuOwotCQkrK2NudDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIEhhdmUgdG8gaGFuZGxlIERQX0ZfTlVNIChpZSAweCBhbmQgMCBhbHRlcm5hdGVzKSAqLwotCi1zdGF0aWMgaW50Ci1mbXRpbnQoY2hhciAqYnVmZmVyLCBzaXplX3QgKmN1cnJsZW4sIHNpemVfdCBtYXhsZW4sCi0JCSAgICBMTE9ORyB2YWx1ZSwgaW50IGJhc2UsIGludCBtaW4sIGludCBtYXgsIGludCBmbGFncykKLXsKLQlpbnQgc2lnbnZhbHVlID0gMDsKLQl1bnNpZ25lZCBMTE9ORyB1dmFsdWU7Ci0JY2hhciBjb252ZXJ0WzIwXTsKLQlpbnQgcGxhY2UgPSAwOwotCWludCBzcGFkbGVuID0gMDsgLyogYW1vdW50IHRvIHNwYWNlIHBhZCAqLwotCWludCB6cGFkbGVuID0gMDsgLyogYW1vdW50IHRvIHplcm8gcGFkICovCi0JaW50IGNhcHMgPSAwOwotCQotCWlmIChtYXggPCAwKQotCQltYXggPSAwOwotCQotCXV2YWx1ZSA9IHZhbHVlOwotCQotCWlmKCEoZmxhZ3MgJiBEUF9GX1VOU0lHTkVEKSkgewotCQlpZiggdmFsdWUgPCAwICkgewotCQkJc2lnbnZhbHVlID0gJy0nOwotCQkJdXZhbHVlID0gLXZhbHVlOwotCQl9IGVsc2UgewotCQkJaWYgKGZsYWdzICYgRFBfRl9QTFVTKSAgLyogRG8gYSBzaWduICgrL2kpICovCi0JCQkJc2lnbnZhbHVlID0gJysnOwotCQkJZWxzZSBpZiAoZmxhZ3MgJiBEUF9GX1NQQUNFKQotCQkJCXNpZ252YWx1ZSA9ICcgJzsKLQkJfQotCX0KLSAgCi0JaWYgKGZsYWdzICYgRFBfRl9VUCkgY2FwcyA9IDE7IC8qIFNob3VsZCBjaGFyYWN0ZXJzIGJlIHVwcGVyIGNhc2U/ICovCi0KLQlkbyB7Ci0JCWNvbnZlcnRbcGxhY2UrK10gPQotCQkJKGNhcHM/ICIwMTIzNDU2Nzg5QUJDREVGIjoiMDEyMzQ1Njc4OWFiY2RlZiIpCi0JCQlbdXZhbHVlICUgKHVuc2lnbmVkKWJhc2UgIF07Ci0JCXV2YWx1ZSA9ICh1dmFsdWUgLyAodW5zaWduZWQpYmFzZSApOwotCX0gd2hpbGUodXZhbHVlICYmIChwbGFjZSA8IDIwKSk7Ci0JaWYgKHBsYWNlID09IDIwKSBwbGFjZS0tOwotCWNvbnZlcnRbcGxhY2VdID0gMDsKLQotCXpwYWRsZW4gPSBtYXggLSBwbGFjZTsKLQlzcGFkbGVuID0gbWluIC0gTUFYIChtYXgsIHBsYWNlKSAtIChzaWdudmFsdWUgPyAxIDogMCk7Ci0JaWYgKHpwYWRsZW4gPCAwKSB6cGFkbGVuID0gMDsKLQlpZiAoc3BhZGxlbiA8IDApIHNwYWRsZW4gPSAwOwotCWlmIChmbGFncyAmIERQX0ZfWkVSTykgewotCQl6cGFkbGVuID0gTUFYKHpwYWRsZW4sIHNwYWRsZW4pOwotCQlzcGFkbGVuID0gMDsKLQl9Ci0JaWYgKGZsYWdzICYgRFBfRl9NSU5VUykgCi0JCXNwYWRsZW4gPSAtc3BhZGxlbjsgLyogTGVmdCBKdXN0aWZ0eSAqLwotCi0jaWZkZWYgREVCVUdfU05QUklOVEYKLQlwcmludGYoInpwYWQ6ICVkLCBzcGFkOiAlZCwgbWluOiAlZCwgbWF4OiAlZCwgcGxhY2U6ICVkXG4iLAotCSAgICAgICB6cGFkbGVuLCBzcGFkbGVuLCBtaW4sIG1heCwgcGxhY2UpOwotI2VuZGlmCi0KLQkvKiBTcGFjZXMgKi8KLQl3aGlsZSAoc3BhZGxlbiA+IDApIHsKLQkJRE9QUl9PVVRDSChidWZmZXIsICpjdXJybGVuLCBtYXhsZW4sICcgJyk7Ci0JCS0tc3BhZGxlbjsKLQl9Ci0KLQkvKiBTaWduICovCi0JaWYgKHNpZ252YWx1ZSkgCi0JCURPUFJfT1VUQ0goYnVmZmVyLCAqY3VycmxlbiwgbWF4bGVuLCBzaWdudmFsdWUpOwotCi0JLyogWmVyb3MgKi8KLQlpZiAoenBhZGxlbiA+IDApIHsKLQkJd2hpbGUgKHpwYWRsZW4gPiAwKSB7Ci0JCQlET1BSX09VVENIKGJ1ZmZlciwgKmN1cnJsZW4sIG1heGxlbiwgJzAnKTsKLQkJCS0tenBhZGxlbjsKLQkJfQotCX0KLQotCS8qIERpZ2l0cyAqLwotCXdoaWxlIChwbGFjZSA+IDApIHsKLQkJLS1wbGFjZTsKLQkJRE9QUl9PVVRDSChidWZmZXIsICpjdXJybGVuLCBtYXhsZW4sIGNvbnZlcnRbcGxhY2VdKTsKLQl9Ci0gIAotCS8qIExlZnQgSnVzdGlmaWVkIHNwYWNlcyAqLwotCXdoaWxlIChzcGFkbGVuIDwgMCkgewotCQlET1BSX09VVENIKGJ1ZmZlciwgKmN1cnJsZW4sIG1heGxlbiwgJyAnKTsKLQkJKytzcGFkbGVuOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIExET1VCTEUgYWJzX3ZhbChMRE9VQkxFIHZhbHVlKQotewotCUxET1VCTEUgcmVzdWx0ID0gdmFsdWU7Ci0KLQlpZiAodmFsdWUgPCAwKQotCQlyZXN1bHQgPSAtdmFsdWU7Ci0JCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIExET1VCTEUgUE9XMTAoaW50IHZhbCkKLXsKLQlMRE9VQkxFIHJlc3VsdCA9IDE7Ci0JCi0Jd2hpbGUgKHZhbCkgewotCQlyZXN1bHQgKj0gMTA7Ci0JCXZhbC0tOwotCX0KLSAgCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIExMT05HIFJPVU5EKExET1VCTEUgdmFsdWUpCi17Ci0JTExPTkcgaW50cGFydDsKLQotCWludHBhcnQgPSAoTExPTkcpdmFsdWU7Ci0JdmFsdWUgPSB2YWx1ZSAtIGludHBhcnQ7Ci0JaWYgKHZhbHVlID49IDAuNSkgaW50cGFydCsrOwotCQotCXJldHVybiBpbnRwYXJ0OwotfQotCi0vKiBhIHJlcGxhY2VtZW50IGZvciBtb2RmIHRoYXQgZG9lc24ndCBuZWVkIHRoZSBtYXRoIGxpYnJhcnkuIFNob3VsZAotICAgYmUgcG9ydGFibGUsIGJ1dCBzbG93ICovCi1zdGF0aWMgZG91YmxlIG15X21vZGYoZG91YmxlIHgwLCBkb3VibGUgKmlwdHIpCi17Ci0JaW50IGk7Ci0JbG9uZyBsOwotCWRvdWJsZSB4ID0geDA7Ci0JZG91YmxlIGYgPSAxLjA7Ci0KLQlmb3IgKGk9MDtpPDEwMDtpKyspIHsKLQkJbCA9IChsb25nKXg7Ci0JCWlmIChsIDw9ICh4KzEpICYmIGwgPj0gKHgtMSkpIGJyZWFrOwotCQl4ICo9IDAuMTsKLQkJZiAqPSAxMC4wOwotCX0KLQotCWlmIChpID09IDEwMCkgewotCQkvKgotCQkgKiB5aWtlcyEgdGhlIG51bWJlciBpcyBiZXlvbmQgd2hhdCB3ZSBjYW4gaGFuZGxlLgotCQkgKiBXaGF0IGRvIHdlIGRvPwotCQkgKi8KLQkJKCppcHRyKSA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChpICE9IDApIHsKLQkJZG91YmxlIGkyOwotCQlkb3VibGUgcmV0OwotCi0JCXJldCA9IG15X21vZGYoeDAtbCpmLCAmaTIpOwotCQkoKmlwdHIpID0gbCpmICsgaTI7Ci0JCXJldHVybiByZXQ7Ci0JfSAKLQotCSgqaXB0cikgPSBsOwotCXJldHVybiB4IC0gKCppcHRyKTsKLX0KLQotCi1zdGF0aWMgaW50Ci1mbXRmcCAoY2hhciAqYnVmZmVyLCBzaXplX3QgKmN1cnJsZW4sIHNpemVfdCBtYXhsZW4sCi0gICAgTERPVUJMRSBmdmFsdWUsIGludCBtaW4sIGludCBtYXgsIGludCBmbGFncykKLXsKLQlpbnQgc2lnbnZhbHVlID0gMDsKLQlkb3VibGUgdWZ2YWx1ZTsKLQljaGFyIGljb252ZXJ0WzMxMV07Ci0JY2hhciBmY29udmVydFszMTFdOwotCWludCBpcGxhY2UgPSAwOwotCWludCBmcGxhY2UgPSAwOwotCWludCBwYWRsZW4gPSAwOyAvKiBhbW91bnQgdG8gcGFkICovCi0JaW50IHpwYWRsZW4gPSAwOyAKLQlpbnQgY2FwcyA9IDA7Ci0JaW50IGlkeDsKLQlkb3VibGUgaW50cGFydDsKLQlkb3VibGUgZnJhY3BhcnQ7Ci0JZG91YmxlIHRlbXA7Ci0gIAotCS8qIAotCSAqIEFJWCBtYW5wYWdlIHNheXMgdGhlIGRlZmF1bHQgaXMgMCwgYnV0IFNvbGFyaXMgc2F5cyB0aGUgZGVmYXVsdAotCSAqIGlzIDYsIGFuZCBzcHJpbnRmIG9uIEFJWCBkZWZhdWx0cyB0byA2Ci0JICovCi0JaWYgKG1heCA8IDApCi0JCW1heCA9IDY7Ci0KLQl1ZnZhbHVlID0gYWJzX3ZhbCAoZnZhbHVlKTsKLQotCWlmIChmdmFsdWUgPCAwKSB7Ci0JCXNpZ252YWx1ZSA9ICctJzsKLQl9IGVsc2UgewotCQlpZiAoZmxhZ3MgJiBEUF9GX1BMVVMpIHsgLyogRG8gYSBzaWduICgrL2kpICovCi0JCQlzaWdudmFsdWUgPSAnKyc7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmxhZ3MgJiBEUF9GX1NQQUNFKQotCQkJCXNpZ252YWx1ZSA9ICcgJzsKLQkJfQotCX0KLQotI2lmIDAKLQlpZiAoZmxhZ3MgJiBEUF9GX1VQKSBjYXBzID0gMTsgLyogU2hvdWxkIGNoYXJhY3RlcnMgYmUgdXBwZXIgY2FzZT8gKi8KLSNlbmRpZgotCi0jaWYgMAotCSBpZiAobWF4ID09IDApIHVmdmFsdWUgKz0gMC41OyAvKiBpZiBtYXggPSAwIHdlIG11c3Qgcm91bmQgKi8KLSNlbmRpZgotCi0JLyogCi0JICogU29ycnksIHdlIG9ubHkgc3VwcG9ydCAxNiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBiZWNhdXNlIG9mIG91ciAKLQkgKiBjb252ZXJzaW9uIG1ldGhvZAotCSAqLwotCWlmIChtYXggPiAxNikKLQkJbWF4ID0gMTY7Ci0KLQkvKiBXZSAiY2hlYXQiIGJ5IGNvbnZlcnRpbmcgdGhlIGZyYWN0aW9uYWwgcGFydCB0byBpbnRlZ2VyIGJ5Ci0JICogbXVsdGlwbHlpbmcgYnkgYSBmYWN0b3Igb2YgMTAKLQkgKi8KLQotCXRlbXAgPSB1ZnZhbHVlOwotCW15X21vZGYodGVtcCwgJmludHBhcnQpOwotCi0JZnJhY3BhcnQgPSBST1VORCgoUE9XMTAobWF4KSkgKiAodWZ2YWx1ZSAtIGludHBhcnQpKTsKLQkKLQlpZiAoZnJhY3BhcnQgPj0gUE9XMTAobWF4KSkgewotCQlpbnRwYXJ0Kys7Ci0JCWZyYWNwYXJ0IC09IFBPVzEwKG1heCk7Ci0JfQotCi0JLyogQ29udmVydCBpbnRlZ2VyIHBhcnQgKi8KLQlkbyB7Ci0JCXRlbXAgPSBpbnRwYXJ0KjAuMTsKLQkJbXlfbW9kZih0ZW1wLCAmaW50cGFydCk7Ci0JCWlkeCA9IChpbnQpICgodGVtcCAtaW50cGFydCArMC4wNSkqIDEwLjApOwotCQkvKiBpZHggPSAoaW50KSAoKChkb3VibGUpKHRlbXAqMC4xKSAtaW50cGFydCArMC4wNSkgKjEwLjApOyAqLwotCQkvKiBwcmludGYgKCIlbGxmLCAlZiwgJXhcbiIsIHRlbXAsIGludHBhcnQsIGlkeCk7ICovCi0JCWljb252ZXJ0W2lwbGFjZSsrXSA9Ci0JCQkoY2Fwcz8gIjAxMjM0NTY3ODlBQkNERUYiOiIwMTIzNDU2Nzg5YWJjZGVmIilbaWR4XTsKLQl9IHdoaWxlIChpbnRwYXJ0ICYmIChpcGxhY2UgPCAzMTEpKTsKLQlpZiAoaXBsYWNlID09IDMxMSkgaXBsYWNlLS07Ci0JaWNvbnZlcnRbaXBsYWNlXSA9IDA7Ci0KLQkvKiBDb252ZXJ0IGZyYWN0aW9uYWwgcGFydCAqLwotCWlmIChmcmFjcGFydCkKLQl7Ci0JCWRvIHsKLQkJCXRlbXAgPSBmcmFjcGFydCowLjE7Ci0JCQlteV9tb2RmKHRlbXAsICZmcmFjcGFydCk7Ci0JCQlpZHggPSAoaW50KSAoKHRlbXAgLWZyYWNwYXJ0ICswLjA1KSogMTAuMCk7Ci0JCQkvKiBpZHggPSAoaW50KSAoKCgodGVtcC8xMCkgLWZyYWNwYXJ0KSArMC4wNSkgKjEwKTsgKi8KLQkJCS8qIHByaW50ZiAoIiVsZiwgJWxmLCAlbGRcbiIsIHRlbXAsIGZyYWNwYXJ0LCBpZHggKTsgKi8KLQkJCWZjb252ZXJ0W2ZwbGFjZSsrXSA9Ci0JCQkoY2Fwcz8gIjAxMjM0NTY3ODlBQkNERUYiOiIwMTIzNDU2Nzg5YWJjZGVmIilbaWR4XTsKLQkJfSB3aGlsZShmcmFjcGFydCAmJiAoZnBsYWNlIDwgMzExKSk7Ci0JCWlmIChmcGxhY2UgPT0gMzExKSBmcGxhY2UtLTsKLQl9Ci0JZmNvbnZlcnRbZnBsYWNlXSA9IDA7Ci0gIAotCS8qIC0xIGZvciBkZWNpbWFsIHBvaW50LCBhbm90aGVyIC0xIGlmIHdlIGFyZSBwcmludGluZyBhIHNpZ24gKi8KLQlwYWRsZW4gPSBtaW4gLSBpcGxhY2UgLSBtYXggLSAxIC0gKChzaWdudmFsdWUpID8gMSA6IDApOyAKLQl6cGFkbGVuID0gbWF4IC0gZnBsYWNlOwotCWlmICh6cGFkbGVuIDwgMCkgenBhZGxlbiA9IDA7Ci0JaWYgKHBhZGxlbiA8IDApIAotCQlwYWRsZW4gPSAwOwotCWlmIChmbGFncyAmIERQX0ZfTUlOVVMpIAotCQlwYWRsZW4gPSAtcGFkbGVuOyAvKiBMZWZ0IEp1c3RpZnR5ICovCi0JCi0JaWYgKChmbGFncyAmIERQX0ZfWkVSTykgJiYgKHBhZGxlbiA+IDApKSB7Ci0JCWlmIChzaWdudmFsdWUpIHsKLQkJCURPUFJfT1VUQ0goYnVmZmVyLCAqY3VycmxlbiwgbWF4bGVuLCBzaWdudmFsdWUpOwotCQkJLS1wYWRsZW47Ci0JCQlzaWdudmFsdWUgPSAwOwotCQl9Ci0JCXdoaWxlIChwYWRsZW4gPiAwKSB7Ci0JCQlET1BSX09VVENIKGJ1ZmZlciwgKmN1cnJsZW4sIG1heGxlbiwgJzAnKTsKLQkJCS0tcGFkbGVuOwotCQl9Ci0JfQotCXdoaWxlIChwYWRsZW4gPiAwKSB7Ci0JCURPUFJfT1VUQ0goYnVmZmVyLCAqY3VycmxlbiwgbWF4bGVuLCAnICcpOwotCQktLXBhZGxlbjsKLQl9Ci0JaWYgKHNpZ252YWx1ZSkgCi0JCURPUFJfT1VUQ0goYnVmZmVyLCAqY3VycmxlbiwgbWF4bGVuLCBzaWdudmFsdWUpOwotCQotCXdoaWxlIChpcGxhY2UgPiAwKSB7Ci0JCS0taXBsYWNlOwotCQlET1BSX09VVENIKGJ1ZmZlciwgKmN1cnJsZW4sIG1heGxlbiwgaWNvbnZlcnRbaXBsYWNlXSk7Ci0JfQotCi0jaWZkZWYgREVCVUdfU05QUklOVEYKLQlwcmludGYoImZtdGZwOiBmcGxhY2U9JWQgenBhZGxlbj0lZFxuIiwgZnBsYWNlLCB6cGFkbGVuKTsKLSNlbmRpZgotCi0JLyoKLQkgKiBEZWNpbWFsIHBvaW50LiAgVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGxvY2FsZSB0byBmaW5kIHRoZSBjb3JyZWN0Ci0JICogY2hhciB0byBwcmludCBvdXQuCi0JICovCi0JaWYgKG1heCA+IDApIHsKLQkJRE9QUl9PVVRDSChidWZmZXIsICpjdXJybGVuLCBtYXhsZW4sICcuJyk7Ci0JCQotCQl3aGlsZSAoenBhZGxlbiA+IDApIHsKLQkJCURPUFJfT1VUQ0goYnVmZmVyLCAqY3VycmxlbiwgbWF4bGVuLCAnMCcpOwotCQkJLS16cGFkbGVuOwotCQl9Ci0KLQkJd2hpbGUgKGZwbGFjZSA+IDApIHsKLQkJCS0tZnBsYWNlOwotCQkJRE9QUl9PVVRDSChidWZmZXIsICpjdXJybGVuLCBtYXhsZW4sIGZjb252ZXJ0W2ZwbGFjZV0pOwotCQl9Ci0JfQotCi0Jd2hpbGUgKHBhZGxlbiA8IDApIHsKLQkJRE9QUl9PVVRDSChidWZmZXIsICpjdXJybGVuLCBtYXhsZW4sICcgJyk7Ci0JCSsrcGFkbGVuOwotCX0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX1NOUFJJTlRGKSB8fCAhZGVmaW5lZChIQVZFX1ZTTlBSSU5URikgKi8KLQotI2lmICFkZWZpbmVkKEhBVkVfVlNOUFJJTlRGKQotaW50Ci12c25wcmludGYgKGNoYXIgKnN0ciwgc2l6ZV90IGNvdW50LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKLXsKLQlyZXR1cm4gZG9wcihzdHIsIGNvdW50LCBmbXQsIGFyZ3MpOwotfQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChIQVZFX1NOUFJJTlRGKQotaW50Ci1zbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBjb3VudCwgU05QUklOVEZfQ09OU1QgY2hhciAqZm10LCAuLi4pCi17Ci0Jc2l6ZV90IHJldDsKLQl2YV9saXN0IGFwOwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JcmV0ID0gdnNucHJpbnRmKHN0ciwgY291bnQsIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0JcmV0dXJuIHJldDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvYnNkLXN0YXR2ZnMuYyBiL29wZW5ic2QtY29tcGF0L2JzZC1zdGF0dmZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NGQ1YjQuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvYnNkLXN0YXR2ZnMuYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qICRJZDogYnNkLXN0YXR2ZnMuYyx2IDEuMSAyMDA4LzA2LzA4IDE3OjMyOjI5IGR0dWNrZXIgRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBEYXJyZW4gVHVja2VyIDxkdHVja2VyQHppcC5jb20uYXU+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBNSU5ELCBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUgotICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZuZGVmIEhBVkVfU1RBVFZGUwotaW50IHN0YXR2ZnMoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXR2ZnMgKmJ1ZikKLXsKLQllcnJubyA9IEVOT1NZUzsKLQlyZXR1cm4gLTE7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0ZTVEFUVkZTCi1pbnQgZnN0YXR2ZnMoaW50IGZkLCBzdHJ1Y3Qgc3RhdHZmcyAqYnVmKQotewotCWVycm5vID0gRU5PU1lTOwotCXJldHVybiAtMTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvYnNkLXN0YXR2ZnMuaCBiL29wZW5ic2QtY29tcGF0L2JzZC1zdGF0dmZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjE1ZmYuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvYnNkLXN0YXR2ZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qICRJZDogYnNkLXN0YXR2ZnMuaCx2IDEuMSAyMDA4LzA2LzA4IDE3OjMyOjI5IGR0dWNrZXIgRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBEYXJyZW4gVHVja2VyIDxkdHVja2VyQHppcC5jb20uYXU+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBNSU5ELCBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUgotICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmZGVmIEhBVkVfU1lTX1NUQVRGU19ICi0jaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9TVEFUVkZTCi0KLSNpZm5kZWYgSEFWRV9GU0JMS0NOVF9UCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgZnNibGtjbnRfdDsKLSNlbmRpZgotI2lmbmRlZiBIQVZFX0ZTRklMQ05UX1QKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBmc2ZpbGNudF90OwotI2VuZGlmCi0KLSNpZm5kZWYgU1RfUkRPTkxZCi0jZGVmaW5lIFNUX1JET05MWQkxCi0jZW5kaWYKLSNpZm5kZWYgU1RfTk9TVUlECi0jZGVmaW5lIFNUX05PU1VJRAkyCi0jZW5kaWYKLQotCS8qIGFzIGRlZmluZWQgaW4gSUVFRSBTdGQgMTAwMy4xLCAyMDA0IEVkaXRpb24gKi8KLXN0cnVjdCBzdGF0dmZzIHsKLQl1bnNpZ25lZCBsb25nIGZfYnNpemU7CS8qIEZpbGUgc3lzdGVtIGJsb2NrIHNpemUuICovCi0JdW5zaWduZWQgbG9uZyBmX2Zyc2l6ZTsJLyogRnVuZGFtZW50YWwgZmlsZSBzeXN0ZW0gYmxvY2sgc2l6ZS4gKi8KLQlmc2Jsa2NudF90IGZfYmxvY2tzOwkvKiBUb3RhbCBudW1iZXIgb2YgYmxvY2tzIG9uIGZpbGUgc3lzdGVtIGluICovCi0JCQkJLyogdW5pdHMgb2YgZl9mcnNpemUuICovCi0JZnNibGtjbnRfdCAgICBmX2JmcmVlOwkvKiBUb3RhbCBudW1iZXIgb2YgZnJlZSBibG9ja3MuICovCi0JZnNibGtjbnRfdCAgICBmX2JhdmFpbDsJLyogTnVtYmVyIG9mIGZyZWUgYmxvY2tzIGF2YWlsYWJsZSB0byAgKi8KLQkJCQkvKiBub24tcHJpdmlsZWdlZCBwcm9jZXNzLiAgKi8KLQlmc2ZpbGNudF90ICAgIGZfZmlsZXM7CS8qIFRvdGFsIG51bWJlciBvZiBmaWxlIHNlcmlhbCBudW1iZXJzLiAqLwotCWZzZmlsY250X3QgICAgZl9mZnJlZTsJLyogVG90YWwgbnVtYmVyIG9mIGZyZWUgZmlsZSBzZXJpYWwgbnVtYmVycy4gKi8KLQlmc2ZpbGNudF90ICAgIGZfZmF2YWlsOwkvKiBOdW1iZXIgb2YgZmlsZSBzZXJpYWwgbnVtYmVycyBhdmFpbGFibGUgdG8gKi8KLQkJCQkvKiBub24tcHJpdmlsZWdlZCBwcm9jZXNzLiAqLwotCXVuc2lnbmVkIGxvbmcgZl9mc2lkOwkvKiBGaWxlIHN5c3RlbSBJRC4gKi8KLQl1bnNpZ25lZCBsb25nIGZfZmxhZzsJLyogQkJpdCBtYXNrIG9mIGZfZmxhZyB2YWx1ZXMuICovCi0JdW5zaWduZWQgbG9uZyBmX25hbWVtYXg7LyogIE1heGltdW0gZmlsZW5hbWUgbGVuZ3RoLiAqLwotfTsKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfU1RBVFZGUwotaW50IHN0YXR2ZnMoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdHZmcyAqKTsKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfRlNUQVRWRlMKLWludCBmc3RhdHZmcyhpbnQsIHN0cnVjdCBzdGF0dmZzICopOwotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9ic2Qtd2FpdHBpZC5jIGIvb3BlbmJzZC1jb21wYXQvYnNkLXdhaXRwaWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlNmZmYS4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9ic2Qtd2FpdHBpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBCZW4gTGluZHN0cm9tLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpZm5kZWYgSEFWRV9XQUlUUElEIAotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlICJic2Qtd2FpdHBpZC5oIgotCi1waWRfdAotd2FpdHBpZChpbnQgcGlkLCBpbnQgKnN0YXRfbG9jLCBpbnQgb3B0aW9ucykKLXsKLQl1bmlvbiB3YWl0IHN0YXR1c3A7Ci0JcGlkX3Qgd2FpdF9waWQ7Ci0KLQlpZiAocGlkIDw9IDApIHsKLQkJaWYgKHBpZCAhPSAtMSkgewotCQkJZXJybm8gPSBFSU5WQUw7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCQkvKiB3YWl0NCgpIHdhbnRzIHBpZD0wIGZvciBpbmRpc2NyaW1pbmF0ZSB3YWl0LiAqLwotCQlwaWQgPSAwOwotCX0KLSAgICAgICAgd2FpdF9waWQgPSB3YWl0NChwaWQsICZzdGF0dXNwLCBvcHRpb25zLCBOVUxMKTsKLQlpZiAoc3RhdF9sb2MpCi0gICAgICAgIAkqc3RhdF9sb2MgPSAoaW50KSBzdGF0dXNwLndfc3RhdHVzOyAgICAgICAgICAgIAotCi0gICAgICAgIHJldHVybiAod2FpdF9waWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLX0KLQotI2VuZGlmIC8qICFIQVZFX1dBSVRQSUQgKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L2JzZC13YWl0cGlkLmggYi9vcGVuYnNkLWNvbXBhdC9ic2Qtd2FpdHBpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDg1M2RiLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L2JzZC13YWl0cGlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiAkSWQ6IGJzZC13YWl0cGlkLmgsdiAxLjUgMjAwMy8wOC8yOSAxNjo1OTo1MiBtb3VyaW5nIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgQmVuIExpbmRzdHJvbS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIF9CU0RfV0FJVFBJRF9ICi0jZGVmaW5lIF9CU0RfV0FJVFBJRF9ICi0KLSNpZm5kZWYgSEFWRV9XQUlUUElECi0vKiBDbGVhbiBvdXQgYW55IHBvdGVudGFsIGlzc3VlcyAqLwotI3VuZGVmIFdJRkVYSVRFRAotI3VuZGVmIFdJRlNUT1BQRUQKLSN1bmRlZiBXSUZTSUdOQUxFRAotCi0vKiBEZWZpbmUgcmVxdWlyZWQgZnVuY3Rpb25zIHRvIG1pbWljIGEgUE9TSVggbG9vayBhbmQgZmVlbCAqLwotI2RlZmluZSBfV19JTlQodykJKCooaW50KikmKHcpKQkvKiBjb252ZXJ0IHVuaW9uIHdhaXQgdG8gaW50ICovCi0jZGVmaW5lIFdJRkVYSVRFRCh3KQkoISgoX1dfSU5UKHcpKSAmIDAzNzcpKQotI2RlZmluZSBXSUZTVE9QUEVEKHcpCSgoX1dfSU5UKHcpKSAmIDAxMDApCi0jZGVmaW5lIFdJRlNJR05BTEVEKHcpCSghV0lGRVhJVEVEKHcpICYmICFXSUZTVE9QUEVEKHcpKQotI2RlZmluZSBXRVhJVFNUQVRVUyh3KQkoaW50KShXSUZFWElURUQodykgPyAoKF9XX0lOVCh3KSA+PiA4KSAmIDAzNzcpIDogLTEpCi0jZGVmaW5lIFdURVJNU0lHKHcpCShpbnQpKFdJRlNJR05BTEVEKHcpID8gKF9XX0lOVCh3KSAmIDAxNzcpIDogLTEpCi0jZGVmaW5lIFdDT1JFRkxBRwkweDgwCi0jZGVmaW5lIFdDT1JFRFVNUCh3KSAJKChfV19JTlQodykpICYgV0NPUkVGTEFHKQotCi0vKiBQcm90b3R5cGUgKi8KLXBpZF90IHdhaXRwaWQoaW50LCBpbnQgKiwgaW50KTsKLQotI2VuZGlmIC8qICFIQVZFX1dBSVRQSUQgKi8KLSNlbmRpZiAvKiBfQlNEX1dBSVRQSURfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvY2hhcmNsYXNzLmggYi9vcGVuYnNkLWNvbXBhdC9jaGFyY2xhc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmNTE3NC4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9jaGFyY2xhc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBQdWJsaWMgZG9tYWluLCAyMDA4LCBUb2RkIEMuIE1pbGxlciA8VG9kZC5NaWxsZXJAY291cnRlc2FuLmNvbT4KLSAqCi0gKiAkT3BlbkJTRDogY2hhcmNsYXNzLmgsdiAxLjEgMjAwOC8xMC8wMSAyMzowNDoxMyBtaWxsZXJ0IEV4cCAkCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvZ2VuL2NoYXJjbGFzcy5oICovCi0KLS8qCi0gKiBQT1NJWCBjaGFyYWN0ZXIgY2xhc3Mgc3VwcG9ydCBmb3IgZm5tYXRjaCgpIGFuZCBnbG9iKCkuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2NsYXNzIHsKLQljb25zdCBjaGFyICpuYW1lOwotCWludCAoKmlzY3R5cGUpKGludCk7Ci19IGNjbGFzc2VzW10gPSB7Ci0JeyAiYWxudW0iLAlpc2FsbnVtIH0sCi0JeyAiYWxwaGEiLAlpc2FscGhhIH0sCi0JeyAiYmxhbmsiLAlpc2JsYW5rIH0sCi0JeyAiY250cmwiLAlpc2NudHJsIH0sCi0JeyAiZGlnaXQiLAlpc2RpZ2l0IH0sCi0JeyAiZ3JhcGgiLAlpc2dyYXBoIH0sCi0JeyAibG93ZXIiLAlpc2xvd2VyIH0sCi0JeyAicHJpbnQiLAlpc3ByaW50IH0sCi0JeyAicHVuY3QiLAlpc3B1bmN0IH0sCi0JeyAic3BhY2UiLAlpc3NwYWNlIH0sCi0JeyAidXBwZXIiLAlpc3VwcGVyIH0sCi0JeyAieGRpZ2l0IiwJaXN4ZGlnaXQgfSwKLQl7IE5VTEwsCQlOVUxMIH0KLX07Ci0KLSNkZWZpbmUgTkNDTEFTU0VTCShzaXplb2YoY2NsYXNzZXMpIC8gc2l6ZW9mKGNjbGFzc2VzWzBdKSAtIDEpCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9kYWVtb24uYyBiL29wZW5ic2QtY29tcGF0L2RhZW1vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWZlMTRjLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L2RhZW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IGRhZW1vbi5jLHYgMS42IDIwMDUvMDgvMDggMDg6MDU6MzMgZXNwaWUgRXhwICQgKi8KLS8qLQotICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkzCi0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvZ2VuL2RhZW1vbi5jICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZuZGVmIEhBVkVfREFFTU9OCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAotIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0ZDTlRMX0gKLSMgaW5jbHVkZSA8ZmNudGwuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi1pbnQKLWRhZW1vbihpbnQgbm9jaGRpciwgaW50IG5vY2xvc2UpCi17Ci0JaW50IGZkOwotCi0Jc3dpdGNoIChmb3JrKCkpIHsKLQljYXNlIC0xOgotCQlyZXR1cm4gKC0xKTsKLQljYXNlIDA6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCV9leGl0KDApOwotCX0KLQotCWlmIChzZXRzaWQoKSA9PSAtMSkKLQkJcmV0dXJuICgtMSk7Ci0KLQlpZiAoIW5vY2hkaXIpCi0JCSh2b2lkKWNoZGlyKCIvIik7Ci0KLQlpZiAoIW5vY2xvc2UgJiYgKGZkID0gb3BlbihfUEFUSF9ERVZOVUxMLCBPX1JEV1IsIDApKSAhPSAtMSkgewotCQkodm9pZClkdXAyKGZkLCBTVERJTl9GSUxFTk8pOwotCQkodm9pZClkdXAyKGZkLCBTVERPVVRfRklMRU5PKTsKLQkJKHZvaWQpZHVwMihmZCwgU1RERVJSX0ZJTEVOTyk7Ci0JCWlmIChmZCA+IDIpCi0JCQkodm9pZCljbG9zZSAoZmQpOwotCX0KLQlyZXR1cm4gKDApOwotfQotCi0jZW5kaWYgLyogIUhBVkVfREFFTU9OICovCi0KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L2Rpcm5hbWUuYyBiL29wZW5ic2QtY29tcGF0L2Rpcm5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmY2I0OS4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9kaXJuYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgkkT3BlbkJTRDogZGlybmFtZS5jLHYgMS4xMyAyMDA1LzA4LzA4IDA4OjA1OjMzIGVzcGllIEV4cCAkCSovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMDQgVG9kZCBDLiBNaWxsZXIgPFRvZGQuTWlsbGVyQGNvdXJ0ZXNhbi5jb20+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvZ2VuL2Rpcm5hbWUuYyAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLSNpZm5kZWYgSEFWRV9ESVJOQU1FCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi1jaGFyICoKLWRpcm5hbWUoY29uc3QgY2hhciAqcGF0aCkKLXsKLQlzdGF0aWMgY2hhciBkbmFtZVtNQVhQQVRITEVOXTsKLQlzaXplX3QgbGVuOwotCWNvbnN0IGNoYXIgKmVuZHA7Ci0KLQkvKiBFbXB0eSBvciBOVUxMIHN0cmluZyBnZXRzIHRyZWF0ZWQgYXMgIi4iICovCi0JaWYgKHBhdGggPT0gTlVMTCB8fCAqcGF0aCA9PSAnXDAnKSB7Ci0JCWRuYW1lWzBdID0gJy4nOwotCQlkbmFtZVsxXSA9ICdcMCc7Ci0JCXJldHVybiAoZG5hbWUpOwotCX0KLQotCS8qIFN0cmlwIGFueSB0cmFpbGluZyBzbGFzaGVzICovCi0JZW5kcCA9IHBhdGggKyBzdHJsZW4ocGF0aCkgLSAxOwotCXdoaWxlIChlbmRwID4gcGF0aCAmJiAqZW5kcCA9PSAnLycpCi0JCWVuZHAtLTsKLQotCS8qIEZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBkaXIgKi8KLQl3aGlsZSAoZW5kcCA+IHBhdGggJiYgKmVuZHAgIT0gJy8nKQotCQllbmRwLS07Ci0KLQkvKiBFaXRoZXIgdGhlIGRpciBpcyAiLyIgb3IgdGhlcmUgYXJlIG5vIHNsYXNoZXMgKi8KLQlpZiAoZW5kcCA9PSBwYXRoKSB7Ci0JCWRuYW1lWzBdID0gKmVuZHAgPT0gJy8nID8gJy8nIDogJy4nOwotCQlkbmFtZVsxXSA9ICdcMCc7Ci0JCXJldHVybiAoZG5hbWUpOwotCX0gZWxzZSB7Ci0JCS8qIE1vdmUgZm9yd2FyZCBwYXN0IHRoZSBzZXBhcmF0aW5nIHNsYXNoZXMgKi8KLQkJZG8gewotCQkJZW5kcC0tOwotCQl9IHdoaWxlIChlbmRwID4gcGF0aCAmJiAqZW5kcCA9PSAnLycpOwotCX0KLQotCWxlbiA9IGVuZHAgLSBwYXRoICsgMTsKLQlpZiAobGVuID49IHNpemVvZihkbmFtZSkpIHsKLQkJZXJybm8gPSBFTkFNRVRPT0xPTkc7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCW1lbWNweShkbmFtZSwgcGF0aCwgbGVuKTsKLQlkbmFtZVtsZW5dID0gJ1wwJzsKLQlyZXR1cm4gKGRuYW1lKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvZmFrZS1yZmMyNTUzLmMgYi9vcGVuYnNkLWNvbXBhdC9mYWtlLXJmYzI1NTMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2ZDllMC4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9mYWtlLXJmYzI1NTMuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgV0lERSBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKgotICogUHNldWRvLWltcGxlbWVudGF0aW9uIG9mIFJGQzI1NTMgbmFtZSAvIGFkZHJlc3MgcmVzb2x1dGlvbiBmdW5jdGlvbnMKLSAqCi0gKiBCdXQgdGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgaW1wbGVtZW50ZWQgY29ycmVjdGx5LiBUaGUgbWluaW11bSBzdWJzZXQKLSAqIGlzIGltcGxlbWVudGVkIGZvciBzc2ggdXNlIG9ubHkuIEZvciBleGFtcGxlLCB0aGlzIHJvdXRpbmUgYXNzdW1lcwotICogdGhhdCBhaV9mYW1pbHkgaXMgQUZfSU5FVC4gRG9uJ3QgdXNlIGl0IGZvciBhbm90aGVyIHB1cnBvc2UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2lmbmRlZiBIQVZFX0dFVE5BTUVJTkZPCi1pbnQgZ2V0bmFtZWluZm8oY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSwgc2l6ZV90IHNhbGVuLCBjaGFyICpob3N0LCAKLSAgICAgICAgICAgICAgICBzaXplX3QgaG9zdGxlbiwgY2hhciAqc2Vydiwgc2l6ZV90IHNlcnZsZW4sIGludCBmbGFncykKLXsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYTsKLQlzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0JY2hhciB0bXBzZXJ2WzE2XTsKLQotCWlmIChzYS0+c2FfZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiBzYS0+c2FfZmFtaWx5ICE9IEFGX0lORVQpCi0JCXJldHVybiAoRUFJX0ZBTUlMWSk7Ci0JaWYgKHNlcnYgIT0gTlVMTCkgewotCQlzbnByaW50Zih0bXBzZXJ2LCBzaXplb2YodG1wc2VydiksICIlZCIsIG50b2hzKHNpbi0+c2luX3BvcnQpKTsKLQkJaWYgKHN0cmxjcHkoc2VydiwgdG1wc2Vydiwgc2VydmxlbikgPj0gc2VydmxlbikKLQkJCXJldHVybiAoRUFJX01FTU9SWSk7Ci0JfQotCi0JaWYgKGhvc3QgIT0gTlVMTCkgewotCQlpZiAoZmxhZ3MgJiBOSV9OVU1FUklDSE9TVCkgewotCQkJaWYgKHN0cmxjcHkoaG9zdCwgaW5ldF9udG9hKHNpbi0+c2luX2FkZHIpLAotCQkJICAgIGhvc3RsZW4pID49IGhvc3RsZW4pCi0JCQkJcmV0dXJuIChFQUlfTUVNT1JZKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gKDApOwotCQl9IGVsc2UgewotCQkJaHAgPSBnZXRob3N0YnlhZGRyKChjaGFyICopJnNpbi0+c2luX2FkZHIsIAotCQkJICAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkciksIEFGX0lORVQpOwotCQkJaWYgKGhwID09IE5VTEwpCi0JCQkJcmV0dXJuIChFQUlfTk9EQVRBKTsKLQkJCQotCQkJaWYgKHN0cmxjcHkoaG9zdCwgaHAtPmhfbmFtZSwgaG9zdGxlbikgPj0gaG9zdGxlbikKLQkJCQlyZXR1cm4gKEVBSV9NRU1PUlkpOwotCQkJZWxzZQotCQkJCXJldHVybiAoMCk7Ci0JCX0KLQl9Ci0JcmV0dXJuICgwKTsKLX0KLSNlbmRpZiAvKiAhSEFWRV9HRVROQU1FSU5GTyAqLwotCi0jaWZuZGVmIEhBVkVfR0FJX1NUUkVSUk9SCi0jaWZkZWYgSEFWRV9DT05TVF9HQUlfU1RSRVJST1JfUFJPVE8KLWNvbnN0IGNoYXIgKgotI2Vsc2UKLWNoYXIgKgotI2VuZGlmCi1nYWlfc3RyZXJyb3IoaW50IGVycikKLXsKLQlzd2l0Y2ggKGVycikgewotCWNhc2UgRUFJX05PREFUQToKLQkJcmV0dXJuICgibm8gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggbmFtZSIpOwotCWNhc2UgRUFJX01FTU9SWToKLQkJcmV0dXJuICgibWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4iKTsKLQljYXNlIEVBSV9OT05BTUU6Ci0JCXJldHVybiAoIm5vZGVuYW1lIG5vciBzZXJ2bmFtZSBwcm92aWRlZCwgb3Igbm90IGtub3duIik7Ci0JY2FzZSBFQUlfRkFNSUxZOgotCQlyZXR1cm4gKCJhaV9mYW1pbHkgbm90IHN1cHBvcnRlZCIpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAoInVua25vd24vaW52YWxpZCBlcnJvci4iKTsKLQl9Ci19ICAgIAotI2VuZGlmIC8qICFIQVZFX0dBSV9TVFJFUlJPUiAqLwotCi0jaWZuZGVmIEhBVkVfRlJFRUFERFJJTkZPCi12b2lkCi1mcmVlYWRkcmluZm8oc3RydWN0IGFkZHJpbmZvICphaSkKLXsKLQlzdHJ1Y3QgYWRkcmluZm8gKm5leHQ7Ci0KLQlmb3IoOyBhaSAhPSBOVUxMOykgewotCQluZXh0ID0gYWktPmFpX25leHQ7Ci0JCWZyZWUoYWkpOwotCQlhaSA9IG5leHQ7Ci0JfQotfQotI2VuZGlmIC8qICFIQVZFX0ZSRUVBRERSSU5GTyAqLwotCi0jaWZuZGVmIEhBVkVfR0VUQUREUklORk8KLXN0YXRpYyBzdHJ1Y3QKLWFkZHJpbmZvICptYWxsb2NfYWkoaW50IHBvcnQsIHVfbG9uZyBhZGRyLCBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKmhpbnRzKQotewotCXN0cnVjdCBhZGRyaW5mbyAqYWk7Ci0KLQlhaSA9IG1hbGxvYyhzaXplb2YoKmFpKSArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKLQlpZiAoYWkgPT0gTlVMTCkKLQkJcmV0dXJuIChOVUxMKTsKLQkKLQltZW1zZXQoYWksICdcMCcsIHNpemVvZigqYWkpICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwotCQotCWFpLT5haV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKShhaSArIDEpOwotCS8qIFhYWCAtLSBzc2ggZG9lc24ndCB1c2Ugc2FfbGVuICovCi0JYWktPmFpX2FkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKLQlhaS0+YWlfYWRkci0+c2FfZmFtaWx5ID0gYWktPmFpX2ZhbWlseSA9IEFGX0lORVQ7Ci0KLQkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShhaSktPmFpX2FkZHIpLT5zaW5fcG9ydCA9IHBvcnQ7Ci0JKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoYWkpLT5haV9hZGRyKS0+c2luX2FkZHIuc19hZGRyID0gYWRkcjsKLQkKLQkvKiBYWFg6IHRoZSBmb2xsb3dpbmcgaXMgbm90IGdlbmVyYWxseSBjb3JyZWN0LCBidXQgZG9lcyB3aGF0IHdlIHdhbnQgKi8KLQlpZiAoaGludHMtPmFpX3NvY2t0eXBlKQotCQlhaS0+YWlfc29ja3R5cGUgPSBoaW50cy0+YWlfc29ja3R5cGU7Ci0JZWxzZQotCQlhaS0+YWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLQotCWlmIChoaW50cy0+YWlfcHJvdG9jb2wpCi0JCWFpLT5haV9wcm90b2NvbCA9IGhpbnRzLT5haV9wcm90b2NvbDsKLQotCXJldHVybiAoYWkpOwotfQotCi1pbnQKLWdldGFkZHJpbmZvKGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25zdCBjaGFyICpzZXJ2bmFtZSwgCi0gICAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpoaW50cywgc3RydWN0IGFkZHJpbmZvICoqcmVzKQotewotCXN0cnVjdCBob3N0ZW50ICpocDsKLQlzdHJ1Y3Qgc2VydmVudCAqc3A7Ci0Jc3RydWN0IGluX2FkZHIgaW47Ci0JaW50IGk7Ci0JbG9uZyBpbnQgcG9ydDsKLQl1X2xvbmcgYWRkcjsKLQotCXBvcnQgPSAwOwotCWlmIChoaW50cyAmJiBoaW50cy0+YWlfZmFtaWx5ICE9IEFGX1VOU1BFQyAmJgotCSAgICBoaW50cy0+YWlfZmFtaWx5ICE9IEFGX0lORVQpCi0JCXJldHVybiAoRUFJX0ZBTUlMWSk7Ci0JaWYgKHNlcnZuYW1lICE9IE5VTEwpIHsKLQkJY2hhciAqY3A7Ci0KLQkJcG9ydCA9IHN0cnRvbChzZXJ2bmFtZSwgJmNwLCAxMCk7Ci0JCWlmIChwb3J0ID4gMCAmJiBwb3J0IDw9IDY1NTM1ICYmICpjcCA9PSAnXDAnKQotCQkJcG9ydCA9IGh0b25zKHBvcnQpOwotCQllbHNlIGlmICgoc3AgPSBnZXRzZXJ2YnluYW1lKHNlcnZuYW1lLCBOVUxMKSkgIT0gTlVMTCkKLQkJCXBvcnQgPSBzcC0+c19wb3J0OwotCQllbHNlCi0JCQlwb3J0ID0gMDsKLQl9Ci0KLQlpZiAoaGludHMgJiYgaGludHMtPmFpX2ZsYWdzICYgQUlfUEFTU0lWRSkgewotCQlhZGRyID0gaHRvbmwoMHgwMDAwMDAwMCk7Ci0JCWlmIChob3N0bmFtZSAmJiBpbmV0X2F0b24oaG9zdG5hbWUsICZpbikgIT0gMCkKLQkJCWFkZHIgPSBpbi5zX2FkZHI7Ci0JCSpyZXMgPSBtYWxsb2NfYWkocG9ydCwgYWRkciwgaGludHMpOwotCQlpZiAoKnJlcyA9PSBOVUxMKSAKLQkJCXJldHVybiAoRUFJX01FTU9SWSk7Ci0JCXJldHVybiAoMCk7Ci0JfQotCQkKLQlpZiAoIWhvc3RuYW1lKSB7Ci0JCSpyZXMgPSBtYWxsb2NfYWkocG9ydCwgaHRvbmwoMHg3ZjAwMDAwMSksIGhpbnRzKTsKLQkJaWYgKCpyZXMgPT0gTlVMTCkgCi0JCQlyZXR1cm4gKEVBSV9NRU1PUlkpOwotCQlyZXR1cm4gKDApOwotCX0KLQkKLQlpZiAoaW5ldF9hdG9uKGhvc3RuYW1lLCAmaW4pKSB7Ci0JCSpyZXMgPSBtYWxsb2NfYWkocG9ydCwgaW4uc19hZGRyLCBoaW50cyk7Ci0JCWlmICgqcmVzID09IE5VTEwpIAotCQkJcmV0dXJuIChFQUlfTUVNT1JZKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JCi0JLyogRG9uJ3QgdHJ5IEROUyBpZiBBSV9OVU1FUklDSE9TVCBpcyBzZXQgKi8KLQlpZiAoaGludHMgJiYgaGludHMtPmFpX2ZsYWdzICYgQUlfTlVNRVJJQ0hPU1QpCi0JCXJldHVybiAoRUFJX05PTkFNRSk7Ci0JCi0JaHAgPSBnZXRob3N0YnluYW1lKGhvc3RuYW1lKTsKLQlpZiAoaHAgJiYgaHAtPmhfbmFtZSAmJiBocC0+aF9uYW1lWzBdICYmIGhwLT5oX2FkZHJfbGlzdFswXSkgewotCQlzdHJ1Y3QgYWRkcmluZm8gKmN1ciwgKnByZXY7Ci0KLQkJY3VyID0gcHJldiA9ICpyZXMgPSBOVUxMOwotCQlmb3IgKGkgPSAwOyBocC0+aF9hZGRyX2xpc3RbaV07IGkrKykgewotCQkJc3RydWN0IGluX2FkZHIgKmluID0gKHN0cnVjdCBpbl9hZGRyICopaHAtPmhfYWRkcl9saXN0W2ldOwotCi0JCQljdXIgPSBtYWxsb2NfYWkocG9ydCwgaW4tPnNfYWRkciwgaGludHMpOwotCQkJaWYgKGN1ciA9PSBOVUxMKSB7Ci0JCQkJaWYgKCpyZXMgIT0gTlVMTCkKLQkJCQkJZnJlZWFkZHJpbmZvKCpyZXMpOwotCQkJCXJldHVybiAoRUFJX01FTU9SWSk7Ci0JCQl9Ci0JCQlpZiAocHJldikKLQkJCQlwcmV2LT5haV9uZXh0ID0gY3VyOwotCQkJZWxzZQotCQkJCSpyZXMgPSBjdXI7Ci0KLQkJCXByZXYgPSBjdXI7Ci0JCX0KLQkJcmV0dXJuICgwKTsKLQl9Ci0JCi0JcmV0dXJuIChFQUlfTk9EQVRBKTsKLX0KLSNlbmRpZiAvKiAhSEFWRV9HRVRBRERSSU5GTyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvZmFrZS1yZmMyNTUzLmggYi9vcGVuYnNkLWNvbXBhdC9mYWtlLXJmYzI1NTMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5MDkwZi4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9mYWtlLXJmYzI1NTMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKiAkSWQ6IGZha2UtcmZjMjU1My5oLHYgMS4xNiAyMDA4LzA3LzE0IDExOjM3OjM3IGRqbSBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgV0lERSBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKgotICogUHNldWRvLWltcGxlbWVudGF0aW9uIG9mIFJGQzI1NTMgbmFtZSAvIGFkZHJlc3MgcmVzb2x1dGlvbiBmdW5jdGlvbnMKLSAqCi0gKiBCdXQgdGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgaW1wbGVtZW50ZWQgY29ycmVjdGx5LiBUaGUgbWluaW11bSBzdWJzZXQKLSAqIGlzIGltcGxlbWVudGVkIGZvciBzc2ggdXNlIG9ubHkuIEZvciBleGFtcGxlLCB0aGlzIHJvdXRpbmUgYXNzdW1lcwotICogdGhhdCBhaV9mYW1pbHkgaXMgQUZfSU5FVC4gRG9uJ3QgdXNlIGl0IGZvciBhbm90aGVyIHB1cnBvc2UuCi0gKi8KLQotI2lmbmRlZiBfRkFLRV9SRkMyNTUzX0gKLSNkZWZpbmUgX0ZBS0VfUkZDMjU1M19ICi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIGRlZmluZWQoSEFWRV9ORVREQl9IKQotIyBpbmNsdWRlIDxuZXRkYi5oPgotI2VuZGlmCi0KLS8qCi0gKiBGaXJzdCwgc29ja2V0IGFuZCBJTkVUNiByZWxhdGVkIGRlZmluaXRpb25zIAotICovCi0jaWZuZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX1NUT1JBR0UKLSMgZGVmaW5lCV9TU19NQVhTSVpFCTEyOAkvKiBJbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBtYXggc2l6ZSAqLwotIyBkZWZpbmUgICAgICAgX1NTX1BBRFNJWkUgICAgIChfU1NfTUFYU0laRSAtIHNpemVvZiAoc3RydWN0IHNvY2thZGRyKSkKLXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHsKLQlzdHJ1Y3Qgc29ja2FkZHIJc3Nfc2E7Ci0JY2hhcgkJX19zc19wYWQyW19TU19QQURTSVpFXTsKLX07Ci0jIGRlZmluZSBzc19mYW1pbHkgc3Nfc2Euc2FfZmFtaWx5Ci0jZW5kaWYgLyogIUhBVkVfU1RSVUNUX1NPQ0tBRERSX1NUT1JBR0UgKi8KLQotI2lmbmRlZiBJTjZfSVNfQUREUl9MT09QQkFDSwotIyBkZWZpbmUgSU42X0lTX0FERFJfTE9PUEJBQ0soYSkgXAotCSgoKHVfaW50MzJfdCAqKShhKSlbMF0gPT0gMCAmJiAoKHVfaW50MzJfdCAqKShhKSlbMV0gPT0gMCAmJiBcCi0JICgodV9pbnQzMl90ICopKGEpKVsyXSA9PSAwICYmICgodV9pbnQzMl90ICopKGEpKVszXSA9PSBodG9ubCgxKSkKLSNlbmRpZiAvKiAhSU42X0lTX0FERFJfTE9PUEJBQ0sgKi8KLQotI2lmbmRlZiBIQVZFX1NUUlVDVF9JTjZfQUREUgotc3RydWN0IGluNl9hZGRyIHsKLQl1X2ludDhfdAlzNl9hZGRyWzE2XTsKLX07Ci0jZW5kaWYgLyogIUhBVkVfU1RSVUNUX0lONl9BRERSICovCi0KLSNpZm5kZWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfSU42Ci1zdHJ1Y3Qgc29ja2FkZHJfaW42IHsKLQl1bnNpZ25lZCBzaG9ydAlzaW42X2ZhbWlseTsKLQl1X2ludDE2X3QJc2luNl9wb3J0OwotCXVfaW50MzJfdAlzaW42X2Zsb3dpbmZvOwotCXN0cnVjdCBpbjZfYWRkcglzaW42X2FkZHI7Ci0JdV9pbnQzMl90CXNpbjZfc2NvcGVfaWQ7Ci19OwotI2VuZGlmIC8qICFIQVZFX1NUUlVDVF9TT0NLQUREUl9JTjYgKi8KLQotI2lmbmRlZiBBRl9JTkVUNgotLyogRGVmaW5lIGl0IHRvIHNvbWV0aGluZyB0aGF0IHNob3VsZCBuZXZlciBhcHBlYXIgKi8KLSNkZWZpbmUgQUZfSU5FVDYgQUZfTUFYCi0jZW5kaWYKLQotLyoKLSAqIE5leHQsIFJGQzI1NTMgbmFtZSAvIGFkZHJlc3MgcmVzb2x1dGlvbiBBUEkKLSAqLwotCi0jaWZuZGVmIE5JX05VTUVSSUNIT1NUCi0jIGRlZmluZSBOSV9OVU1FUklDSE9TVCAgICAoMSkKLSNlbmRpZgotI2lmbmRlZiBOSV9OQU1FUkVRRAotIyBkZWZpbmUgTklfTkFNRVJFUUQgICAgICAgKDE8PDEpCi0jZW5kaWYKLSNpZm5kZWYgTklfTlVNRVJJQ1NFUlYKLSMgZGVmaW5lIE5JX05VTUVSSUNTRVJWICAgICgxPDwyKQotI2VuZGlmCi0KLSNpZm5kZWYgQUlfUEFTU0lWRQotIyBkZWZpbmUgQUlfUEFTU0lWRQkJKDEpCi0jZW5kaWYKLSNpZm5kZWYgQUlfQ0FOT05OQU1FCi0jIGRlZmluZSBBSV9DQU5PTk5BTUUJCSgxPDwxKQotI2VuZGlmCi0jaWZuZGVmIEFJX05VTUVSSUNIT1NUCi0jIGRlZmluZSBBSV9OVU1FUklDSE9TVAkJKDE8PDIpCi0jZW5kaWYKLQotI2lmbmRlZiBOSV9NQVhTRVJWCi0jIGRlZmluZSBOSV9NQVhTRVJWIDMyCi0jZW5kaWYgLyogIU5JX01BWFNFUlYgKi8KLSNpZm5kZWYgTklfTUFYSE9TVAotIyBkZWZpbmUgTklfTUFYSE9TVCAxMDI1Ci0jZW5kaWYgLyogIU5JX01BWEhPU1QgKi8KLQotI2lmbmRlZiBFQUlfTk9EQVRBCi0jIGRlZmluZSBFQUlfTk9EQVRBCShJTlRfTUFYIC0gMSkKLSNlbmRpZgotI2lmbmRlZiBFQUlfTUVNT1JZCi0jIGRlZmluZSBFQUlfTUVNT1JZCShJTlRfTUFYIC0gMikKLSNlbmRpZgotI2lmbmRlZiBFQUlfTk9OQU1FCi0jIGRlZmluZSBFQUlfTk9OQU1FCShJTlRfTUFYIC0gMykKLSNlbmRpZgotI2lmbmRlZiBFQUlfU1lTVEVNCi0jIGRlZmluZSBFQUlfU1lTVEVNCShJTlRfTUFYIC0gNCkKLSNlbmRpZgotI2lmbmRlZiBFQUlfRkFNSUxZCi0jIGRlZmluZSBFQUlfRkFNSUxZCShJTlRfTUFYIC0gNSkKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfU1RSVUNUX0FERFJJTkZPCi1zdHJ1Y3QgYWRkcmluZm8gewotCWludAlhaV9mbGFnczsJLyogQUlfUEFTU0lWRSwgQUlfQ0FOT05OQU1FICovCi0JaW50CWFpX2ZhbWlseTsJLyogUEZfeHh4ICovCi0JaW50CWFpX3NvY2t0eXBlOwkvKiBTT0NLX3h4eCAqLwotCWludAlhaV9wcm90b2NvbDsJLyogMCBvciBJUFBST1RPX3h4eCBmb3IgSVB2NCBhbmQgSVB2NiAqLwotCXNpemVfdAlhaV9hZGRybGVuOwkvKiBsZW5ndGggb2YgYWlfYWRkciAqLwotCWNoYXIJKmFpX2Nhbm9ubmFtZTsJLyogY2Fub25pY2FsIG5hbWUgZm9yIGhvc3RuYW1lICovCi0Jc3RydWN0IHNvY2thZGRyICphaV9hZGRyOwkvKiBiaW5hcnkgYWRkcmVzcyAqLwotCXN0cnVjdCBhZGRyaW5mbyAqYWlfbmV4dDsJLyogbmV4dCBzdHJ1Y3R1cmUgaW4gbGlua2VkIGxpc3QgKi8KLX07Ci0jZW5kaWYgLyogIUhBVkVfU1RSVUNUX0FERFJJTkZPICovCi0KLSNpZm5kZWYgSEFWRV9HRVRBRERSSU5GTwotI2lmZGVmIGdldGFkZHJpbmZvCi0jIHVuZGVmIGdldGFkZHJpbmZvCi0jZW5kaWYKLSNkZWZpbmUgZ2V0YWRkcmluZm8oYSxiLGMsZCkJKHNzaF9nZXRhZGRyaW5mbyhhLGIsYyxkKSkKLWludCBnZXRhZGRyaW5mbyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgCi0gICAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIHN0cnVjdCBhZGRyaW5mbyAqKik7Ci0jZW5kaWYgLyogIUhBVkVfR0VUQUREUklORk8gKi8KLQotI2lmICFkZWZpbmVkKEhBVkVfR0FJX1NUUkVSUk9SKSAmJiAhZGVmaW5lZChIQVZFX0NPTlNUX0dBSV9TVFJFUlJPUl9QUk9UTykKLSNkZWZpbmUgZ2FpX3N0cmVycm9yKGEpCQkoX3NzaF9jb21wYXRfZ2FpX3N0cmVycm9yKGEpKQotY2hhciAqZ2FpX3N0cmVycm9yKGludCk7Ci0jZW5kaWYgLyogIUhBVkVfR0FJX1NUUkVSUk9SICovCi0KLSNpZm5kZWYgSEFWRV9GUkVFQUREUklORk8KLSNkZWZpbmUgZnJlZWFkZHJpbmZvKGEpCQkoc3NoX2ZyZWVhZGRyaW5mbyhhKSkKLXZvaWQgZnJlZWFkZHJpbmZvKHN0cnVjdCBhZGRyaW5mbyAqKTsKLSNlbmRpZiAvKiAhSEFWRV9GUkVFQUREUklORk8gKi8KLQotI2lmbmRlZiBIQVZFX0dFVE5BTUVJTkZPCi0jZGVmaW5lIGdldG5hbWVpbmZvKGEsYixjLGQsZSxmLGcpIChzc2hfZ2V0bmFtZWluZm8oYSxiLGMsZCxlLGYsZykpCi1pbnQgZ2V0bmFtZWluZm8oY29uc3Qgc3RydWN0IHNvY2thZGRyICosIHNpemVfdCwgY2hhciAqLCBzaXplX3QsIAotICAgIGNoYXIgKiwgc2l6ZV90LCBpbnQpOwotI2VuZGlmIC8qICFIQVZFX0dFVE5BTUVJTkZPICovCi0KLSNlbmRpZiAvKiAhX0ZBS0VfUkZDMjU1M19IICovCi0KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L2ZtdF9zY2FsZWQuYyBiL29wZW5ic2QtY29tcGF0L2ZtdF9zY2FsZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkNjgyYS4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9mbXRfc2NhbGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IGZtdF9zY2FsZWQuYyx2IDEuOSAyMDA3LzAzLzIwIDAzOjQyOjUyIHRlZHUgRXhwICQJKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMyBJYW4gRi4gRGFyd2luLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJ1dGlsL2ZtdF9zY2FsZWQuYyAqLwotCi0vKgotICogZm10X3NjYWxlZDogRm9ybWF0IG51bWJlcnMgc2NhbGVkIGZvciBodW1hbiBjb21wcmVoZW5zaW9uCi0gKiBzY2FuX3NjYWxlZDogU2NhbiBudW1iZXJzIGluIHRoaXMgZm9ybWF0LgotICoKLSAqICJIdW1hbi1yZWFkYWJsZSIgb3V0cHV0IHVzZXMgNCBkaWdpdHMgbWF4LCBhbmQgcHV0cyBhIHVuaXQgc3VmZml4IGF0Ci0gKiB0aGUgZW5kLiAgTWFrZXMgb3V0cHV0IGNvbXBhY3QgYW5kIGVhc3ktdG8tcmVhZCBlc3AuIG9uIGh1Z2UgZGlza3MuCi0gKiBGb3JtYXR0aW5nIGNvZGUgd2FzIG9yaWdpbmFsbHkgaW4gT3BlbkJTRCAiZGYiLCBjb252ZXJ0ZWQgdG8gbGlicmFyeSByb3V0aW5lLgotICogU2Nhbm5pbmcgY29kZSB3cml0dGVuIGZvciBPcGVuQlNEIGxpYnV0aWwuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpZm5kZWYgSEFWRV9GTVRfU0NBTEVECi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotdHlwZWRlZiBlbnVtIHsKLQlOT05FID0gMCwgS0lMTyA9IDEsIE1FR0EgPSAyLCBHSUdBID0gMywgVEVSQSA9IDQsIFBFVEEgPSA1LCBFWEEgPSA2Ci19IHVuaXRfdHlwZTsKLQotLyogVGhlc2UgdGhyZWUgYXJyYXlzIE1VU1QgYmUgaW4gc3luYyEgIFhYWCBtYWtlIGEgc3RydWN0ICovCi1zdGF0aWMgdW5pdF90eXBlIHVuaXRzW10gPSB7IE5PTkUsIEtJTE8sIE1FR0EsIEdJR0EsIFRFUkEsIFBFVEEsIEVYQSB9Owotc3RhdGljIGNoYXIgc2NhbGVfY2hhcnNbXSA9ICJCS01HVFBFIjsKLXN0YXRpYyBsb25nIGxvbmcgc2NhbGVfZmFjdG9yc1tdID0gewotCTFMTCwKLQkxMDI0TEwsCi0JMTAyNExMKjEwMjQsCi0JMTAyNExMKjEwMjQqMTAyNCwKLQkxMDI0TEwqMTAyNCoxMDI0KjEwMjQsCi0JMTAyNExMKjEwMjQqMTAyNCoxMDI0KjEwMjQsCi0JMTAyNExMKjEwMjQqMTAyNCoxMDI0KjEwMjQqMTAyNCwKLX07Ci0jZGVmaW5lCVNDQUxFX0xFTkdUSCAoc2l6ZW9mKHVuaXRzKS9zaXplb2YodW5pdHNbMF0pKQotCi0jZGVmaW5lIE1BWF9ESUdJVFMgKFNDQUxFX0xFTkdUSCAqIDMpCS8qIFhYWCBzdHJsZW4oc3ByaW50ZigiJWxsZCIsIC0xKT8gKi8KLQotLyoqIENvbnZlcnQgdGhlIGdpdmVuIGlucHV0IHN0cmluZyAic2NhbGVkIiBpbnRvIG51bWVyaWMgaW4gInJlc3VsdCIuCi0gKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBhbmQgZXJybm8gc2V0IG9uIGVycm9yLgotICovCi1pbnQKLXNjYW5fc2NhbGVkKGNoYXIgKnNjYWxlZCwgbG9uZyBsb25nICpyZXN1bHQpCi17Ci0JY2hhciAqcCA9IHNjYWxlZDsKLQlpbnQgc2lnbiA9IDA7Ci0JdW5zaWduZWQgaW50IGksIG5kaWdpdHMgPSAwLCBmcmFjdF9kaWdpdHMgPSAwOwotCWxvbmcgbG9uZyBzY2FsZV9mYWN0ID0gMSwgd2hvbGUgPSAwLCBmcGFydCA9IDA7Ci0KLQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotCXdoaWxlIChpc2FzY2lpKCpwKSAmJiBpc3NwYWNlKCpwKSkKLQkJKytwOwotCi0JLyogVGhlbiBhdCBtb3N0IG9uZSBsZWFkaW5nICsgb3IgLSAqLwotCXdoaWxlICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKSB7Ci0JCWlmICgqcCA9PSAnLScpIHsKLQkJCWlmIChzaWduKSB7Ci0JCQkJZXJybm8gPSBFSU5WQUw7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJc2lnbiA9IC0xOwotCQkJKytwOwotCQl9IGVsc2UgaWYgKCpwID09ICcrJykgewotCQkJaWYgKHNpZ24pIHsKLQkJCQllcnJubyA9IEVJTlZBTDsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlzaWduID0gKzE7Ci0JCQkrK3A7Ci0JCX0KLQl9Ci0KLQkvKiBNYWluIGxvb3A6IFNjYW4gZGlnaXRzLCBmaW5kIGRlY2ltYWwgcG9pbnQsIGlmIHByZXNlbnQuCi0JICogV2UgZG9uJ3QgYWxsb3cgZXhwb25lbnRpYWxzLCBzbyBubyBzY2llbnRpZmljIG5vdGF0aW9uCi0JICogKGJ1dCBub3RlIHRoYXQgRSBmb3IgRXhhIG1pZ2h0IGxvb2sgbGlrZSBlIHRvIHNvbWUhKS4KLQkgKiBBZHZhbmNlICdwJyB0byBlbmQsIHRvIGdldCBzY2FsZSBmYWN0b3IuCi0JICovCi0JZm9yICg7IGlzYXNjaWkoKnApICYmIChpc2RpZ2l0KCpwKSB8fCAqcD09Jy4nKTsgKytwKSB7Ci0JCWlmICgqcCA9PSAnLicpIHsKLQkJCWlmIChmcmFjdF9kaWdpdHMgPiAwKSB7CS8qIG9vcHMsIG1vcmUgdGhhbiBvbmUgJy4nICovCi0JCQkJZXJybm8gPSBFSU5WQUw7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZnJhY3RfZGlnaXRzID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaSA9ICgqcCkgLSAnMCc7CQkJLyogd2hldyEgZmluYWxseSBhIGRpZ2l0IHdlIGNhbiB1c2UgKi8KLQkJaWYgKGZyYWN0X2RpZ2l0cyA+IDApIHsKLQkJCWlmIChmcmFjdF9kaWdpdHMgPj0gTUFYX0RJR0lUUy0xKQotCQkJCS8qIGlnbm9yZSBleHRyYSBmcmFjdGlvbmFsIGRpZ2l0cyAqLwotCQkJCWNvbnRpbnVlOwotCQkJZnJhY3RfZGlnaXRzKys7CQkvKiBmb3IgbGF0ZXIgc2NhbGluZyAqLwotCQkJZnBhcnQgKj0gMTA7Ci0JCQlmcGFydCArPSBpOwotCQl9IGVsc2UgewkJCQkvKiBub3JtYWwgZGlnaXQgKi8KLQkJCWlmICgrK25kaWdpdHMgPj0gTUFYX0RJR0lUUykgewotCQkJCWVycm5vID0gRVJBTkdFOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXdob2xlICo9IDEwOwotCQkJd2hvbGUgKz0gaTsKLQkJfQotCX0KLQotCWlmIChzaWduKSB7Ci0JCXdob2xlICo9IHNpZ247Ci0JCWZwYXJ0ICo9IHNpZ247Ci0JfQotCi0JLyogSWYgbm8gc2NhbGUgZmFjdG9yIGdpdmVuLCB3ZSdyZSBkb25lLiBmcmFjdGlvbiBpcyBkaXNjYXJkZWQuICovCi0JaWYgKCEqcCkgewotCQkqcmVzdWx0ID0gd2hvbGU7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIFZhbGlkYXRlIHNjYWxlIGZhY3RvciwgYW5kIHNjYWxlIHdob2xlIGFuZCBmcmFjdGlvbiBieSBpdC4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgU0NBTEVfTEVOR1RIOyBpKyspIHsKLQotCQkvKiogQXJlIHdlIHRoZXJlIHlldD8gKi8KLQkJaWYgKCpwID09IHNjYWxlX2NoYXJzW2ldIHx8Ci0JCQkqcCA9PSB0b2xvd2VyKHNjYWxlX2NoYXJzW2ldKSkgewotCi0JCQkvKiBJZiBpdCBlbmRzIHdpdGggYWxwaGFudW1lcmljcyBhZnRlciB0aGUgc2NhbGUgY2hhciwgYmFkLiAqLwotCQkJaWYgKGlzYWxudW0oKihwKzEpKSkgewotCQkJCWVycm5vID0gRUlOVkFMOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXNjYWxlX2ZhY3QgPSBzY2FsZV9mYWN0b3JzW2ldOwotCi0JCQkvKiBzY2FsZSB3aG9sZSBwYXJ0ICovCi0JCQl3aG9sZSAqPSBzY2FsZV9mYWN0OwotCi0JCQkvKiB0cnVuY2F0ZSBmcGFydCBzbyBpdCBkb2VzJ3Qgb3ZlcmZsb3cuCi0JCQkgKiB0aGVuIHNjYWxlIGZyYWN0aW9uYWwgcGFydC4KLQkJCSAqLwotCQkJd2hpbGUgKGZwYXJ0ID49IExMT05HX01BWCAvIHNjYWxlX2ZhY3QpIHsKLQkJCQlmcGFydCAvPSAxMDsKLQkJCQlmcmFjdF9kaWdpdHMtLTsKLQkJCX0KLQkJCWZwYXJ0ICo9IHNjYWxlX2ZhY3Q7Ci0JCQlpZiAoZnJhY3RfZGlnaXRzID4gMCkgewotCQkJCWZvciAoaSA9IDA7IGkgPCBmcmFjdF9kaWdpdHMgLTE7IGkrKykKLQkJCQkJZnBhcnQgLz0gMTA7Ci0JCQl9Ci0JCQl3aG9sZSArPSBmcGFydDsKLQkJCSpyZXN1bHQgPSB3aG9sZTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCWVycm5vID0gRVJBTkdFOwotCXJldHVybiAtMTsKLX0KLQotLyogRm9ybWF0IHRoZSBnaXZlbiAibnVtYmVyIiBpbnRvIGh1bWFuLXJlYWRhYmxlIGZvcm0gaW4gInJlc3VsdCIuCi0gKiBSZXN1bHQgbXVzdCBwb2ludCB0byBhbiBhbGxvY2F0ZWQgYnVmZmVyIG9mIGxlbmd0aCBGTVRfU0NBTEVEX1NUUlNJWkUuCi0gKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBhbmQgZXJybm8gc2V0IGlmIGVycm9yLgotICovCi1pbnQKLWZtdF9zY2FsZWQobG9uZyBsb25nIG51bWJlciwgY2hhciAqcmVzdWx0KQotewotCWxvbmcgbG9uZyBhYnZhbCwgZnJhY3QgPSAwOwotCXVuc2lnbmVkIGludCBpOwotCXVuaXRfdHlwZSB1bml0ID0gTk9ORTsKLQotCWFidmFsID0gKG51bWJlciA8IDBMTCkgPyAtbnVtYmVyIDogbnVtYmVyOwkvKiBubyBsb25nIGxvbmdfYWJzIHlldCAqLwotCi0JLyogTm90IGV2ZXJ5IG5lZ2F0aXZlIGxvbmcgbG9uZyBoYXMgYSBwb3NpdGl2ZSByZXByZXNlbnRhdGlvbi4KLQkgKiBBbHNvIGNoZWNrIGZvciBudW1iZXJzIHRoYXQgYXJlIGp1c3QgdG9vIGRhcm5lZCBiaWcgdG8gZm9ybWF0Ci0JICovCi0JaWYgKGFidmFsIDwgMCB8fCBhYnZhbCAvIDEwMjQgPj0gc2NhbGVfZmFjdG9yc1tTQ0FMRV9MRU5HVEgtMV0pIHsKLQkJZXJybm8gPSBFUkFOR0U7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBzY2FsZSB3aG9sZSBwYXJ0OyBnZXQgdW5zY2FsZWQgZnJhY3Rpb24gKi8KLQlmb3IgKGkgPSAwOyBpIDwgU0NBTEVfTEVOR1RIOyBpKyspIHsKLQkJaWYgKGFidmFsLzEwMjQgPCBzY2FsZV9mYWN0b3JzW2ldKSB7Ci0JCQl1bml0ID0gdW5pdHNbaV07Ci0JCQlmcmFjdCA9IChpID09IDApID8gMCA6IGFidmFsICUgc2NhbGVfZmFjdG9yc1tpXTsKLQkJCW51bWJlciAvPSBzY2FsZV9mYWN0b3JzW2ldOwotCQkJaWYgKGkgPiAwKQotCQkJCWZyYWN0IC89IHNjYWxlX2ZhY3RvcnNbaSAtIDFdOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlmcmFjdCA9ICgxMCAqIGZyYWN0ICsgNTEyKSAvIDEwMjQ7Ci0JLyogaWYgdGhlIHJlc3VsdCB3b3VsZCBiZSA+PSAxMCwgcm91bmQgbWFpbiBudW1iZXIgKi8KLQlpZiAoZnJhY3QgPT0gMTApIHsKLQkJaWYgKG51bWJlciA+PSAwKQotCQkJbnVtYmVyKys7Ci0JCWVsc2UKLQkJCW51bWJlci0tOwotCQlmcmFjdCA9IDA7Ci0JfQotCi0JaWYgKG51bWJlciA9PSAwKQotCQlzdHJsY3B5KHJlc3VsdCwgIjBCIiwgRk1UX1NDQUxFRF9TVFJTSVpFKTsKLQllbHNlIGlmICh1bml0ID09IE5PTkUgfHwgbnVtYmVyID49IDEwMCB8fCBudW1iZXIgPD0gLTEwMCkgewotCQlpZiAoZnJhY3QgPj0gNSkgewotCQkJaWYgKG51bWJlciA+PSAwKQotCQkJCW51bWJlcisrOwotCQkJZWxzZQotCQkJCW51bWJlci0tOwotCQl9Ci0JCSh2b2lkKXNucHJpbnRmKHJlc3VsdCwgRk1UX1NDQUxFRF9TVFJTSVpFLCAiJWxsZCVjIiwKLQkJCW51bWJlciwgc2NhbGVfY2hhcnNbdW5pdF0pOwotCX0gZWxzZQotCQkodm9pZClzbnByaW50ZihyZXN1bHQsIEZNVF9TQ0FMRURfU1RSU0laRSwgIiVsbGQuJTFsbGQlYyIsCi0JCQludW1iZXIsIGZyYWN0LCBzY2FsZV9jaGFyc1t1bml0XSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmCU1BSU4KLS8qCi0gKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtIGluIHRoZSBtYW4gcGFnZS4KLSAqIENvcHktYW5kLXBhc3RlIHdoYXRldmVyIHlvdSBuZWVkIGZyb20gaXQuCi0gKi8KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0JY2hhciAqY2lucHV0ID0gIjEuNUsiLCBidWZbRk1UX1NDQUxFRF9TVFJTSVpFXTsKLQlsb25nIGxvbmcgbmlucHV0ID0gMTA0ODM4OTIsIHJlc3VsdDsKLQotCWlmIChzY2FuX3NjYWxlZChjaW5wdXQsICZyZXN1bHQpID09IDApCi0JCXByaW50ZigiXCIlc1wiIC0+ICVsbGRcbiIsIGNpbnB1dCwgcmVzdWx0KTsKLQllbHNlCi0JCXBlcnJvcihjaW5wdXQpOwotCi0JaWYgKGZtdF9zY2FsZWQobmlucHV0LCBidWYpID09IDApCi0JCXByaW50ZigiJWxsZCAtPiBcIiVzXCJcbiIsIG5pbnB1dCwgYnVmKTsKLQllbHNlCi0JCWZwcmludGYoc3RkZXJyLCAiJWxsZCBpbnZhbGlkICglcylcbiIsIG5pbnB1dCwgc3RyZXJyb3IoZXJybm8pKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBIQVZFX0ZNVF9TQ0FMRUQgKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L2dldGN3ZC5jIGIvb3BlbmJzZC1jb21wYXQvZ2V0Y3dkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMWNiOWMuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvZ2V0Y3dkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IGdldGN3ZC5jLHYgMS4xNCAyMDA1LzA4LzA4IDA4OjA1OjM0IGVzcGllIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkxLCAxOTkzCi0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvZ2VuL2dldGN3ZC5jICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWYgIWRlZmluZWQoSEFWRV9HRVRDV0QpCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2RlZmluZQlJU0RPVChkcCkgXAotCShkcC0+ZF9uYW1lWzBdID09ICcuJyAmJiAoZHAtPmRfbmFtZVsxXSA9PSAnXDAnIHx8IFwKLQkgICAgKGRwLT5kX25hbWVbMV0gPT0gJy4nICYmIGRwLT5kX25hbWVbMl0gPT0gJ1wwJykpKQotCi1jaGFyICoKLWdldGN3ZChjaGFyICpwdCwgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IGRpcmVudCAqZHA7Ci0JRElSICpkaXIgPSBOVUxMOwotCWRldl90IGRldjsKLQlpbm9fdCBpbm87Ci0JaW50IGZpcnN0OwotCWNoYXIgKmJwdCwgKmJ1cDsKLQlzdHJ1Y3Qgc3RhdCBzOwotCWRldl90IHJvb3RfZGV2OwotCWlub190IHJvb3RfaW5vOwotCXNpemVfdCBwdHNpemUsIHVwc2l6ZTsKLQlpbnQgc2F2ZV9lcnJubzsKLQljaGFyICplcHQsICpldXAsICp1cDsKLQotCS8qCi0JICogSWYgbm8gYnVmZmVyIHNwZWNpZmllZCBieSB0aGUgdXNlciwgYWxsb2NhdGUgb25lIGFzIG5lY2Vzc2FyeS4KLQkgKiBJZiBhIGJ1ZmZlciBpcyBzcGVjaWZpZWQsIHRoZSBzaXplIGhhcyB0byBiZSBub24temVyby4gIFRoZSBwYXRoCi0JICogaXMgYnVpbHQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYmFja3dhcmRzLgotCSAqLwotCWlmIChwdCkgewotCQlwdHNpemUgPSAwOwotCQlpZiAoIXNpemUpIHsKLQkJCWVycm5vID0gRUlOVkFMOwotCQkJcmV0dXJuIChOVUxMKTsKLQkJfQotCQllcHQgPSBwdCArIHNpemU7Ci0JfSBlbHNlIHsKLQkJaWYgKChwdCA9IG1hbGxvYyhwdHNpemUgPSBNQVhQQVRITEVOKSkgPT0gTlVMTCkKLQkJCXJldHVybiAoTlVMTCk7Ci0JCWVwdCA9IHB0ICsgcHRzaXplOwotCX0KLQlicHQgPSBlcHQgLSAxOwotCSpicHQgPSAnXDAnOwotCi0JLyoKLQkgKiBBbGxvY2F0ZSBieXRlcyBmb3IgdGhlIHN0cmluZyBvZiAiLi4vIidzLgotCSAqIFNob3VsZCBhbHdheXMgYmUgZW5vdWdoIChpdCdzIDM0MCBsZXZlbHMpLiAgSWYgaXQncyBub3QsIGFsbG9jYXRlCi0JICogYXMgbmVjZXNzYXJ5LiAgU3BlY2lhbCAqIGNhc2UgdGhlIGZpcnN0IHN0YXQsIGl0J3MgIi4iLCBub3QgIi4uIi4KLQkgKi8KLQlpZiAoKHVwID0gbWFsbG9jKHVwc2l6ZSA9IE1BWFBBVEhMRU4pKSA9PSBOVUxMKQotCQlnb3RvIGVycjsKLQlldXAgPSB1cCArIHVwc2l6ZTsKLQlidXAgPSB1cDsKLQl1cFswXSA9ICcuJzsKLQl1cFsxXSA9ICdcMCc7Ci0KLQkvKiBTYXZlIHJvb3QgdmFsdWVzLCBzbyBrbm93IHdoZW4gdG8gc3RvcC4gKi8KLQlpZiAoc3RhdCgiLyIsICZzKSkKLQkJZ290byBlcnI7Ci0Jcm9vdF9kZXYgPSBzLnN0X2RldjsKLQlyb290X2lubyA9IHMuc3RfaW5vOwotCi0JZXJybm8gPSAwOwkJCS8qIFhYWCByZWFkZGlyIGhhcyBubyBlcnJvciByZXR1cm4uICovCi0KLQlmb3IgKGZpcnN0ID0gMTs7IGZpcnN0ID0gMCkgewotCQkvKiBTdGF0IHRoZSBjdXJyZW50IGxldmVsLiAqLwotCQlpZiAobHN0YXQodXAsICZzKSkKLQkJCWdvdG8gZXJyOwotCi0JCS8qIFNhdmUgY3VycmVudCBub2RlIHZhbHVlcy4gKi8KLQkJaW5vID0gcy5zdF9pbm87Ci0JCWRldiA9IHMuc3RfZGV2OwotCi0JCS8qIENoZWNrIGZvciByZWFjaGluZyByb290LiAqLwotCQlpZiAocm9vdF9kZXYgPT0gZGV2ICYmIHJvb3RfaW5vID09IGlubykgewotCQkJKi0tYnB0ID0gJy8nOwotCQkJLyoKLQkJCSAqIEl0J3MgdW5jbGVhciB0aGF0IGl0J3MgYSByZXF1aXJlbWVudCB0byBjb3B5IHRoZQotCQkJICogcGF0aCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIsIGJ1dCBpdCdzIGFsd2F5cwotCQkJICogYmVlbiB0aGF0IHdheSBhbmQgc3R1ZmYgd291bGQgcHJvYmFibHkgYnJlYWsuCi0JCQkgKi8KLQkJCW1lbW1vdmUocHQsIGJwdCwgZXB0IC0gYnB0KTsKLQkJCWZyZWUodXApOwotCQkJcmV0dXJuIChwdCk7Ci0JCX0KLQotCQkvKgotCQkgKiBCdWlsZCBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5LCBhbGxvY2F0aW5nIG1lbW9yeQotCQkgKiBhcyBuZWNlc3NhcnkuICBNYXggbGVuZ3RoIGlzIDMgZm9yICIuLi8iLCB0aGUgbGFyZ2VzdAotCQkgKiBwb3NzaWJsZSBjb21wb25lbnQgbmFtZSwgcGx1cyBhIHRyYWlsaW5nIE5VTC4KLQkJICovCi0JCWlmIChidXAgKyAzICArIE1BWE5BTUxFTiArIDEgPj0gZXVwKSB7Ci0JCQljaGFyICpudXA7Ci0KLQkJCWlmICgobnVwID0gcmVhbGxvYyh1cCwgdXBzaXplICo9IDIpKSA9PSBOVUxMKQotCQkJCWdvdG8gZXJyOwotCQkJYnVwID0gbnVwICsgKGJ1cCAtIHVwKTsKLQkJCXVwID0gbnVwOwotCQkJZXVwID0gdXAgKyB1cHNpemU7Ci0JCX0KLQkJKmJ1cCsrID0gJy4nOwotCQkqYnVwKysgPSAnLic7Ci0JCSpidXAgPSAnXDAnOwotCi0JCS8qIE9wZW4gYW5kIHN0YXQgcGFyZW50IGRpcmVjdG9yeS4gKi8KLQkJaWYgKCEoZGlyID0gb3BlbmRpcih1cCkpIHx8IGZzdGF0KGRpcmZkKGRpciksICZzKSkKLQkJCWdvdG8gZXJyOwotCi0JCS8qIEFkZCB0cmFpbGluZyBzbGFzaCBmb3IgbmV4dCBkaXJlY3RvcnkuICovCi0JCSpidXArKyA9ICcvJzsKLQotCQkvKgotCQkgKiBJZiBpdCdzIGEgbW91bnQgcG9pbnQsIGhhdmUgdG8gc3RhdCBlYWNoIGVsZW1lbnQgYmVjYXVzZQotCQkgKiB0aGUgaW5vZGUgbnVtYmVyIGluIHRoZSBkaXJlY3RvcnkgaXMgZm9yIHRoZSBlbnRyeSBpbiB0aGUKLQkJICogcGFyZW50IGRpcmVjdG9yeSwgbm90IHRoZSBpbm9kZSBudW1iZXIgb2YgdGhlIG1vdW50ZWQgZmlsZS4KLQkJICovCi0JCXNhdmVfZXJybm8gPSAwOwotCQlpZiAocy5zdF9kZXYgPT0gZGV2KSB7Ci0JCQlmb3IgKDs7KSB7Ci0JCQkJaWYgKCEoZHAgPSByZWFkZGlyKGRpcikpKQotCQkJCQlnb3RvIG5vdGZvdW5kOwotCQkJCWlmIChkcC0+ZF9maWxlbm8gPT0gaW5vKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlCi0JCQlmb3IgKDs7KSB7Ci0JCQkJaWYgKCEoZHAgPSByZWFkZGlyKGRpcikpKQotCQkJCQlnb3RvIG5vdGZvdW5kOwotCQkJCWlmIChJU0RPVChkcCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCW1lbWNweShidXAsIGRwLT5kX25hbWUsIGRwLT5kX25hbWxlbiArIDEpOwotCi0JCQkJLyogU2F2ZSB0aGUgZmlyc3QgZXJyb3IgZm9yIGxhdGVyLiAqLwotCQkJCWlmIChsc3RhdCh1cCwgJnMpKSB7Ci0JCQkJCWlmICghc2F2ZV9lcnJubykKLQkJCQkJCXNhdmVfZXJybm8gPSBlcnJubzsKLQkJCQkJZXJybm8gPSAwOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHMuc3RfZGV2ID09IGRldiAmJiBzLnN0X2lubyA9PSBpbm8pCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCS8qCi0JCSAqIENoZWNrIGZvciBsZW5ndGggb2YgdGhlIGN1cnJlbnQgbmFtZSwgcHJlY2VkaW5nIHNsYXNoLAotCQkgKiBsZWFkaW5nIHNsYXNoLgotCQkgKi8KLQkJaWYgKGJwdCAtIHB0IDwgZHAtPmRfbmFtbGVuICsgKGZpcnN0ID8gMSA6IDIpKSB7Ci0JCQlzaXplX3QgbGVuOwotCQkJY2hhciAqbnB0OwotCi0JCQlpZiAoIXB0c2l6ZSkgewotCQkJCWVycm5vID0gRVJBTkdFOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQkJbGVuID0gZXB0IC0gYnB0OwotCQkJaWYgKChucHQgPSByZWFsbG9jKHB0LCBwdHNpemUgKj0gMikpID09IE5VTEwpCi0JCQkJZ290byBlcnI7Ci0JCQlicHQgPSBucHQgKyAoYnB0IC0gcHQpOwotCQkJcHQgPSBucHQ7Ci0JCQllcHQgPSBwdCArIHB0c2l6ZTsKLQkJCW1lbW1vdmUoZXB0IC0gbGVuLCBicHQsIGxlbik7Ci0JCQlicHQgPSBlcHQgLSBsZW47Ci0JCX0KLQkJaWYgKCFmaXJzdCkKLQkJCSotLWJwdCA9ICcvJzsKLQkJYnB0IC09IGRwLT5kX25hbWxlbjsKLQkJbWVtY3B5KGJwdCwgZHAtPmRfbmFtZSwgZHAtPmRfbmFtbGVuKTsKLQkJKHZvaWQpY2xvc2VkaXIoZGlyKTsKLQotCQkvKiBUcnVuY2F0ZSBhbnkgZmlsZSBuYW1lLiAqLwotCQkqYnVwID0gJ1wwJzsKLQl9Ci0KLW5vdGZvdW5kOgotCS8qCi0JICogSWYgcmVhZGRpciBzZXQgZXJybm8sIHVzZSBpdCwgbm90IGFueSBzYXZlZCBlcnJvcjsgb3RoZXJ3aXNlLAotCSAqIGRpZG4ndCBmaW5kIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbiBpdHMgcGFyZW50IGRpcmVjdG9yeSwgc2V0Ci0JICogZXJybm8gdG8gRU5PRU5ULgotCSAqLwotCWlmICghZXJybm8pCi0JCWVycm5vID0gc2F2ZV9lcnJubyA/IHNhdmVfZXJybm8gOiBFTk9FTlQ7Ci0JLyogRkFMTFRIUk9VR0ggKi8KLWVycjoKLQlzYXZlX2Vycm5vID0gZXJybm87Ci0KLQlpZiAocHRzaXplKQotCQlmcmVlKHB0KTsKLQlmcmVlKHVwKTsKLQlpZiAoZGlyKQotCQkodm9pZCljbG9zZWRpcihkaXIpOwotCi0JZXJybm8gPSBzYXZlX2Vycm5vOwotCi0JcmV0dXJuIChOVUxMKTsKLX0KLQotI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfR0VUQ1dEKSAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvZ2V0Z3JvdXBsaXN0LmMgYi9vcGVuYnNkLWNvbXBhdC9nZXRncm91cGxpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3ZDdkMy4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9nZXRncm91cGxpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCSRPcGVuQlNEOiBnZXRncm91cGxpc3QuYyx2IDEuMTIgMjAwNS8wOC8wOCAwODowNTozNCBlc3BpZSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLS8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL2dlbi9nZXRncm91cGxpc3QuYyAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmbmRlZiBIQVZFX0dFVEdST1VQTElTVAotCi0vKgotICogZ2V0IGNyZWRlbnRpYWwKLSAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGdycC5oPgotCi1pbnQKLWdldGdyb3VwbGlzdChjb25zdCBjaGFyICp1bmFtZSwgZ2lkX3QgYWdyb3VwLCBnaWRfdCAqZ3JvdXBzLCBpbnQgKmdycGNudCkKLXsKLQlzdHJ1Y3QgZ3JvdXAgKmdycDsKLQlpbnQgaSwgbmdyb3VwczsKLQlpbnQgcmV0LCBtYXhncm91cHM7Ci0JaW50IGJhaWw7Ci0KLQlyZXQgPSAwOwotCW5ncm91cHMgPSAwOwotCW1heGdyb3VwcyA9ICpncnBjbnQ7Ci0KLQkvKgotCSAqIGluc3RhbGwgcHJpbWFyeSBncm91cAotCSAqLwotCWlmIChuZ3JvdXBzID49IG1heGdyb3VwcykgewotCQkqZ3JwY250ID0gbmdyb3VwczsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWdyb3Vwc1tuZ3JvdXBzKytdID0gYWdyb3VwOwotCi0JLyoKLQkgKiBTY2FuIHRoZSBncm91cCBmaWxlIHRvIGZpbmQgYWRkaXRpb25hbCBncm91cHMuCi0JICovCi0Jc2V0Z3JlbnQoKTsKLQl3aGlsZSAoKGdycCA9IGdldGdyZW50KCkpKSB7Ci0JCWlmIChncnAtPmdyX2dpZCA9PSBhZ3JvdXApCi0JCQljb250aW51ZTsKLQkJZm9yIChiYWlsID0gMCwgaSA9IDA7IGJhaWwgPT0gMCAmJiBpIDwgbmdyb3VwczsgaSsrKQotCQkJaWYgKGdyb3Vwc1tpXSA9PSBncnAtPmdyX2dpZCkKLQkJCQliYWlsID0gMTsKLQkJaWYgKGJhaWwpCi0JCQljb250aW51ZTsKLQkJZm9yIChpID0gMDsgZ3JwLT5ncl9tZW1baV07IGkrKykgewotCQkJaWYgKCFzdHJjbXAoZ3JwLT5ncl9tZW1baV0sIHVuYW1lKSkgewotCQkJCWlmIChuZ3JvdXBzID49IG1heGdyb3VwcykgewotCQkJCQlyZXQgPSAtMTsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJCWdyb3Vwc1tuZ3JvdXBzKytdID0gZ3JwLT5ncl9naWQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci1vdXQ6Ci0JZW5kZ3JlbnQoKTsKLQkqZ3JwY250ID0gbmdyb3VwczsKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLSNlbmRpZiAvKiBIQVZFX0dFVEdST1VQTElTVCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvZ2V0b3B0LmMgYi9vcGVuYnNkLWNvbXBhdC9nZXRvcHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1MGU0My4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9nZXRvcHQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg3LCAxOTkzLCAxOTk0Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvc3RkbGliL2dldG9wdC5jICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2lmICFkZWZpbmVkKEhBVkVfR0VUT1BUKSB8fCAhZGVmaW5lZChIQVZFX0dFVE9QVF9PUFRSRVNFVCkKLQotI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQotc3RhdGljIGNoYXIgKnJjc2lkID0gIiRPcGVuQlNEOiBnZXRvcHQuYyx2IDEuNSAyMDAzLzA2LzAyIDIwOjE4OjM3IG1pbGxlcnQgRXhwICQiOwotI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLWludAlCU0RvcHRlcnIgPSAxLAkJLyogaWYgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgcHJpbnRlZCAqLwotCUJTRG9wdGluZCA9IDEsCQkvKiBpbmRleCBpbnRvIHBhcmVudCBhcmd2IHZlY3RvciAqLwotCUJTRG9wdG9wdCwJCS8qIGNoYXJhY3RlciBjaGVja2VkIGZvciB2YWxpZGl0eSAqLwotCUJTRG9wdHJlc2V0OwkJLyogcmVzZXQgZ2V0b3B0ICovCi1jaGFyCSpCU0RvcHRhcmc7CQkvKiBhcmd1bWVudCBhc3NvY2lhdGVkIHdpdGggb3B0aW9uICovCi0KLSNkZWZpbmUJQkFEQ0gJKGludCknPycKLSNkZWZpbmUJQkFEQVJHCShpbnQpJzonCi0jZGVmaW5lCUVNU0cJIiIKLQotLyoKLSAqIGdldG9wdCAtLQotICoJUGFyc2UgYXJnYy9hcmd2IGFyZ3VtZW50IHZlY3Rvci4KLSAqLwotaW50Ci1CU0RnZXRvcHQobmFyZ2MsIG5hcmd2LCBvc3RyKQotCWludCBuYXJnYzsKLQljaGFyICogY29uc3QgKm5hcmd2OwotCWNvbnN0IGNoYXIgKm9zdHI7Ci17Ci0JZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7Ci0Jc3RhdGljIGNoYXIgKnBsYWNlID0gRU1TRzsJCS8qIG9wdGlvbiBsZXR0ZXIgcHJvY2Vzc2luZyAqLwotCWNoYXIgKm9saTsJCQkJLyogb3B0aW9uIGxldHRlciBsaXN0IGluZGV4ICovCi0KLQlpZiAob3N0ciA9PSBOVUxMKQotCQlyZXR1cm4gKC0xKTsKLQotCWlmIChCU0RvcHRyZXNldCB8fCAhKnBsYWNlKSB7CQkvKiB1cGRhdGUgc2Nhbm5pbmcgcG9pbnRlciAqLwotCQlCU0RvcHRyZXNldCA9IDA7Ci0JCWlmIChCU0RvcHRpbmQgPj0gbmFyZ2MgfHwgKihwbGFjZSA9IG5hcmd2W0JTRG9wdGluZF0pICE9ICctJykgewotCQkJcGxhY2UgPSBFTVNHOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQkJaWYgKHBsYWNlWzFdICYmICorK3BsYWNlID09ICctJykgewkvKiBmb3VuZCAiLS0iICovCi0JCQkrK0JTRG9wdGluZDsKLQkJCXBsYWNlID0gRU1TRzsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JfQkJCQkJLyogb3B0aW9uIGxldHRlciBva2F5PyAqLwotCWlmICgoQlNEb3B0b3B0ID0gKGludCkqcGxhY2UrKykgPT0gKGludCknOicgfHwKLQkgICAgIShvbGkgPSBzdHJjaHIob3N0ciwgQlNEb3B0b3B0KSkpIHsKLQkJLyoKLQkJICogaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgJy0nIGFzIGFuIG9wdGlvbiwKLQkJICogYXNzdW1lIGl0IG1lYW5zIC0xLgotCQkgKi8KLQkJaWYgKEJTRG9wdG9wdCA9PSAoaW50KSctJykKLQkJCXJldHVybiAoLTEpOwotCQlpZiAoISpwbGFjZSkKLQkJCSsrQlNEb3B0aW5kOwotCQlpZiAoQlNEb3B0ZXJyICYmICpvc3RyICE9ICc6JykKLQkJCSh2b2lkKWZwcmludGYoc3RkZXJyLAotCQkJICAgICIlczogaWxsZWdhbCBvcHRpb24gLS0gJWNcbiIsIF9fcHJvZ25hbWUsIEJTRG9wdG9wdCk7Ci0JCXJldHVybiAoQkFEQ0gpOwotCX0KLQlpZiAoKisrb2xpICE9ICc6JykgewkJCS8qIGRvbid0IG5lZWQgYXJndW1lbnQgKi8KLQkJQlNEb3B0YXJnID0gTlVMTDsKLQkJaWYgKCEqcGxhY2UpCi0JCQkrK0JTRG9wdGluZDsKLQl9Ci0JZWxzZSB7CQkJCQkvKiBuZWVkIGFuIGFyZ3VtZW50ICovCi0JCWlmICgqcGxhY2UpCQkJLyogbm8gd2hpdGUgc3BhY2UgKi8KLQkJCUJTRG9wdGFyZyA9IHBsYWNlOwotCQllbHNlIGlmIChuYXJnYyA8PSArK0JTRG9wdGluZCkgewkvKiBubyBhcmcgKi8KLQkJCXBsYWNlID0gRU1TRzsKLQkJCWlmICgqb3N0ciA9PSAnOicpCi0JCQkJcmV0dXJuIChCQURBUkcpOwotCQkJaWYgKEJTRG9wdGVycikKLQkJCQkodm9pZClmcHJpbnRmKHN0ZGVyciwKLQkJCQkgICAgIiVzOiBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQgLS0gJWNcbiIsCi0JCQkJICAgIF9fcHJvZ25hbWUsIEJTRG9wdG9wdCk7Ci0JCQlyZXR1cm4gKEJBRENIKTsKLQkJfQotCSAJZWxzZQkJCQkvKiB3aGl0ZSBzcGFjZSAqLwotCQkJQlNEb3B0YXJnID0gbmFyZ3ZbQlNEb3B0aW5kXTsKLQkJcGxhY2UgPSBFTVNHOwotCQkrK0JTRG9wdGluZDsKLQl9Ci0JcmV0dXJuIChCU0RvcHRvcHQpOwkJCS8qIGR1bXAgYmFjayBvcHRpb24gbGV0dGVyICovCi19Ci0KLSNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX0dFVE9QVCkgfHwgIWRlZmluZWQoSEFWRV9PUFRSRVNFVCkgKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L2dldHJyc2V0YnluYW1lLmMgYi9vcGVuYnNkLWNvbXBhdC9nZXRycnNldGJ5bmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjZjN2VjLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L2dldHJyc2V0YnluYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTIgKzAsMCBAQAotLyogJE9wZW5CU0Q6IGdldHJyc2V0YnluYW1lLmMsdiAxLjExIDIwMDcvMTAvMTEgMTg6MzY6NDEgamFrb2IgRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBKYWtvYiBTY2hseXRlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bS4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElOVEVSTkVUIFNPRlRXQVJFIENPTlNPUlRJVU0KLSAqIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBJTlRFUk5FVCBTT0ZUV0FSRSBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwKLSAqIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcKLSAqIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotICogV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvbmV0L2dldHJyc2V0YnluYW1lLmMgKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpZm5kZWYgSEFWRV9HRVRSUlNFVEJZTkFNRQotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0KLSNpbmNsdWRlICJnZXRycnNldGJ5bmFtZS5oIgotI2luY2x1ZGUgIm5hbWVzZXIuaCIKLSNpbmNsdWRlICJuYW1lc2VyX2NvbXBhdC5oIgotCi0jaWYgZGVmaW5lZChIQVZFX0RFQ0xfSF9FUlJOTykgJiYgIUhBVkVfREVDTF9IX0VSUk5PCi1leHRlcm4gaW50IGhfZXJybm87Ci0jZW5kaWYKLQotLyogV2UgZG9uJ3QgbmVlZCBtdWx0aXRocmVhZCBzdXBwb3J0IGhlcmUgKi8KLSNpZmRlZiBfVEhSRUFEX1BSSVZBVEUKLSMgdW5kZWYgX1RIUkVBRF9QUklWQVRFCi0jZW5kaWYKLSNkZWZpbmUgX1RIUkVBRF9QUklWQVRFKGEsYixjKSAoYykKLQotI2lmbmRlZiBIQVZFX19SRVNfRVhURVJOCi1zdHJ1Y3QgX19yZXNfc3RhdGUgX3JlczsKLSNlbmRpZgotCi0vKiBOZWNlc3NhcnkgZnVuY3Rpb25zIGFuZCBtYWNyb3MgKi8KLQotLyoKLSAqIElubGluZSB2ZXJzaW9ucyBvZiBnZXQvcHV0IHNob3J0L2xvbmcuICBQb2ludGVyIGlzIGFkdmFuY2VkLgotICoKLSAqIFRoZXNlIG1hY3JvcyBkZW1vbnN0cmF0ZSB0aGUgcHJvcGVydHkgb2YgQyB3aGVyZWJ5IGl0IGNhbiBiZQotICogcG9ydGFibGUgb3IgaXQgY2FuIGJlIGVsZWdhbnQgYnV0IHJhcmVseSBib3RoLgotICovCi0KLSNpZm5kZWYgSU5UMzJTWgotIyBkZWZpbmUgSU5UMzJTWgk0Ci0jZW5kaWYKLSNpZm5kZWYgSU5UMTZTWgotIyBkZWZpbmUgSU5UMTZTWgkyCi0jZW5kaWYKLQotI2lmbmRlZiBHRVRTSE9SVAotI2RlZmluZSBHRVRTSE9SVChzLCBjcCkgeyBcCi0JcmVnaXN0ZXIgdV9jaGFyICp0X2NwID0gKHVfY2hhciAqKShjcCk7IFwKLQkocykgPSAoKHVfaW50MTZfdCl0X2NwWzBdIDw8IDgpIFwKLQkgICAgfCAoKHVfaW50MTZfdCl0X2NwWzFdKSBcCi0JICAgIDsgXAotCShjcCkgKz0gSU5UMTZTWjsgXAotfQotI2VuZGlmCi0KLSNpZm5kZWYgR0VUTE9ORwotI2RlZmluZSBHRVRMT05HKGwsIGNwKSB7IFwKLQlyZWdpc3RlciB1X2NoYXIgKnRfY3AgPSAodV9jaGFyICopKGNwKTsgXAotCShsKSA9ICgodV9pbnQzMl90KXRfY3BbMF0gPDwgMjQpIFwKLQkgICAgfCAoKHVfaW50MzJfdCl0X2NwWzFdIDw8IDE2KSBcCi0JICAgIHwgKCh1X2ludDMyX3QpdF9jcFsyXSA8PCA4KSBcCi0JICAgIHwgKCh1X2ludDMyX3QpdF9jcFszXSkgXAotCSAgICA7IFwKLQkoY3ApICs9IElOVDMyU1o7IFwKLX0KLSNlbmRpZgotCi0vKgotICogUm91dGluZXMgdG8gaW5zZXJ0L2V4dHJhY3Qgc2hvcnQvbG9uZydzLgotICovCi0KLSNpZm5kZWYgSEFWRV9fR0VUU0hPUlQKLXN0YXRpYyB1X2ludDE2X3QKLV9nZXRzaG9ydChtc2dwKQotCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqbXNncDsKLXsKLQlyZWdpc3RlciB1X2ludDE2X3QgdTsKLQotCUdFVFNIT1JUKHUsIG1zZ3ApOwotCXJldHVybiAodSk7Ci19Ci0jZWxpZiBkZWZpbmVkKEhBVkVfREVDTF9fR0VUU0hPUlQpICYmIChIQVZFX0RFQ0xfX0dFVFNIT1JUID09IDApCi11X2ludDE2X3QgX2dldHNob3J0KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqKTsKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfX0dFVExPTkcKLXN0YXRpYyB1X2ludDMyX3QKLV9nZXRsb25nKG1zZ3ApCi0JcmVnaXN0ZXIgY29uc3QgdV9jaGFyICptc2dwOwotewotCXJlZ2lzdGVyIHVfaW50MzJfdCB1OwotCi0JR0VUTE9ORyh1LCBtc2dwKTsKLQlyZXR1cm4gKHUpOwotfQotI2VsaWYgZGVmaW5lZChIQVZFX0RFQ0xfX0dFVExPTkcpICYmIChIQVZFX0RFQ0xfX0dFVExPTkcgPT0gMCkKLXVfaW50MzJfdCBfZ2V0bG9uZyhyZWdpc3RlciBjb25zdCB1X2NoYXIgKik7Ci0jZW5kaWYKLQotLyogKioqKioqKioqKioqKiogKi8KLQotI2RlZmluZSBBTlNXRVJfQlVGRkVSX1NJWkUgMHhmZmZmCi0KLXN0cnVjdCBkbnNfcXVlcnkgewotCWNoYXIJCQkqbmFtZTsKLQl1X2ludDE2X3QJCXR5cGU7Ci0JdV9pbnQxNl90CQljbGFzczsKLQlzdHJ1Y3QgZG5zX3F1ZXJ5CSpuZXh0OwotfTsKLQotc3RydWN0IGRuc19yciB7Ci0JY2hhcgkJCSpuYW1lOwotCXVfaW50MTZfdAkJdHlwZTsKLQl1X2ludDE2X3QJCWNsYXNzOwotCXVfaW50MTZfdAkJdHRsOwotCXVfaW50MTZfdAkJc2l6ZTsKLQl2b2lkCQkJKnJkYXRhOwotCXN0cnVjdCBkbnNfcnIJCSpuZXh0OwotfTsKLQotc3RydWN0IGRuc19yZXNwb25zZSB7Ci0JSEVBREVSCQkJaGVhZGVyOwotCXN0cnVjdCBkbnNfcXVlcnkJKnF1ZXJ5OwotCXN0cnVjdCBkbnNfcnIJCSphbnN3ZXI7Ci0Jc3RydWN0IGRuc19ycgkJKmF1dGhvcml0eTsKLQlzdHJ1Y3QgZG5zX3JyCQkqYWRkaXRpb25hbDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZG5zX3Jlc3BvbnNlICpwYXJzZV9kbnNfcmVzcG9uc2UoY29uc3QgdV9jaGFyICosIGludCk7Ci1zdGF0aWMgc3RydWN0IGRuc19xdWVyeSAqcGFyc2VfZG5zX3FzZWN0aW9uKGNvbnN0IHVfY2hhciAqLCBpbnQsCi0gICAgY29uc3QgdV9jaGFyICoqLCBpbnQpOwotc3RhdGljIHN0cnVjdCBkbnNfcnIgKnBhcnNlX2Ruc19ycnNlY3Rpb24oY29uc3QgdV9jaGFyICosIGludCwgY29uc3QgdV9jaGFyICoqLAotICAgIGludCk7Ci0KLXN0YXRpYyB2b2lkIGZyZWVfZG5zX3F1ZXJ5KHN0cnVjdCBkbnNfcXVlcnkgKik7Ci1zdGF0aWMgdm9pZCBmcmVlX2Ruc19ycihzdHJ1Y3QgZG5zX3JyICopOwotc3RhdGljIHZvaWQgZnJlZV9kbnNfcmVzcG9uc2Uoc3RydWN0IGRuc19yZXNwb25zZSAqKTsKLQotc3RhdGljIGludCBjb3VudF9kbnNfcnIoc3RydWN0IGRuc19yciAqLCB1X2ludDE2X3QsIHVfaW50MTZfdCk7Ci0KLWludAotZ2V0cnJzZXRieW5hbWUoY29uc3QgY2hhciAqaG9zdG5hbWUsIHVuc2lnbmVkIGludCByZGNsYXNzLAotICAgIHVuc2lnbmVkIGludCByZHR5cGUsIHVuc2lnbmVkIGludCBmbGFncywKLSAgICBzdHJ1Y3QgcnJzZXRpbmZvICoqcmVzKQotewotCXN0cnVjdCBfX3Jlc19zdGF0ZSAqX3Jlc3AgPSBfVEhSRUFEX1BSSVZBVEUoX3JlcywgX3JlcywgJl9yZXMpOwotCWludCByZXN1bHQ7Ci0Jc3RydWN0IHJyc2V0aW5mbyAqcnJzZXQgPSBOVUxMOwotCXN0cnVjdCBkbnNfcmVzcG9uc2UgKnJlc3BvbnNlID0gTlVMTDsKLQlzdHJ1Y3QgZG5zX3JyICpycjsKLQlzdHJ1Y3QgcmRhdGFpbmZvICpyZGF0YTsKLQlpbnQgbGVuZ3RoOwotCXVuc2lnbmVkIGludCBpbmRleF9hbnMsIGluZGV4X3NpZzsKLQl1X2NoYXIgYW5zd2VyW0FOU1dFUl9CVUZGRVJfU0laRV07Ci0KLQkvKiBjaGVjayBmb3IgaW52YWxpZCBjbGFzcyBhbmQgdHlwZSAqLwotCWlmIChyZGNsYXNzID4gMHhmZmZmIHx8IHJkdHlwZSA+IDB4ZmZmZikgewotCQlyZXN1bHQgPSBFUlJTRVRfSU5WQUw7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBkb24ndCBhbGxvdyBxdWVyaWVzIG9mIGNsYXNzIG9yIHR5cGUgQU5ZICovCi0JaWYgKHJkY2xhc3MgPT0gMHhmZiB8fCByZHR5cGUgPT0gMHhmZikgewotCQlyZXN1bHQgPSBFUlJTRVRfSU5WQUw7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBkb24ndCBhbGxvdyBmbGFncyB5ZXQsIHVuaW1wbGVtZW50ZWQgKi8KLQlpZiAoZmxhZ3MpIHsKLQkJcmVzdWx0ID0gRVJSU0VUX0lOVkFMOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogaW5pdGlhbGl6ZSByZXNvbHZlciAqLwotCWlmICgoX3Jlc3AtPm9wdGlvbnMgJiBSRVNfSU5JVCkgPT0gMCAmJiByZXNfaW5pdCgpID09IC0xKSB7Ci0JCXJlc3VsdCA9IEVSUlNFVF9GQUlMOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0jaWZkZWYgREVCVUcKLQlfcmVzcC0+b3B0aW9ucyB8PSBSRVNfREVCVUc7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotI2lmZGVmIFJFU19VU0VfRE5TU0VDCi0JLyogdHVybiBvbiBETlNTRUMgaWYgRUROUzAgaXMgY29uZmlndXJlZCAqLwotCWlmIChfcmVzcC0+b3B0aW9ucyAmIFJFU19VU0VfRUROUzApCi0JCV9yZXNwLT5vcHRpb25zIHw9IFJFU19VU0VfRE5TU0VDOwotI2VuZGlmIC8qIFJFU19VU0VfRE5TRUMgKi8KLQotCS8qIG1ha2UgcXVlcnkgKi8KLQlsZW5ndGggPSByZXNfcXVlcnkoaG9zdG5hbWUsIChzaWduZWQgaW50KSByZGNsYXNzLCAoc2lnbmVkIGludCkgcmR0eXBlLAotCSAgICBhbnN3ZXIsIHNpemVvZihhbnN3ZXIpKTsKLQlpZiAobGVuZ3RoIDwgMCkgewotCQlzd2l0Y2goaF9lcnJubykgewotCQljYXNlIEhPU1RfTk9UX0ZPVU5EOgotCQkJcmVzdWx0ID0gRVJSU0VUX05PTkFNRTsKLQkJCWdvdG8gZmFpbDsKLQkJY2FzZSBOT19EQVRBOgotCQkJcmVzdWx0ID0gRVJSU0VUX05PREFUQTsKLQkJCWdvdG8gZmFpbDsKLQkJZGVmYXVsdDoKLQkJCXJlc3VsdCA9IEVSUlNFVF9GQUlMOwotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCi0JLyogcGFyc2UgcmVzdWx0ICovCi0JcmVzcG9uc2UgPSBwYXJzZV9kbnNfcmVzcG9uc2UoYW5zd2VyLCBsZW5ndGgpOwotCWlmIChyZXNwb25zZSA9PSBOVUxMKSB7Ci0JCXJlc3VsdCA9IEVSUlNFVF9GQUlMOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKHJlc3BvbnNlLT5oZWFkZXIucWRjb3VudCAhPSAxKSB7Ci0JCXJlc3VsdCA9IEVSUlNFVF9GQUlMOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogaW5pdGlhbGl6ZSBycnNldCAqLwotCXJyc2V0ID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcnJzZXRpbmZvKSk7Ci0JaWYgKHJyc2V0ID09IE5VTEwpIHsKLQkJcmVzdWx0ID0gRVJSU0VUX05PTUVNT1JZOwotCQlnb3RvIGZhaWw7Ci0JfQotCXJyc2V0LT5ycmlfcmRjbGFzcyA9IHJlc3BvbnNlLT5xdWVyeS0+Y2xhc3M7Ci0JcnJzZXQtPnJyaV9yZHR5cGUgPSByZXNwb25zZS0+cXVlcnktPnR5cGU7Ci0JcnJzZXQtPnJyaV90dGwgPSByZXNwb25zZS0+YW5zd2VyLT50dGw7Ci0JcnJzZXQtPnJyaV9ucmRhdGFzID0gcmVzcG9uc2UtPmhlYWRlci5hbmNvdW50OwotCi0jaWZkZWYgSEFWRV9IRUFERVJfQUQKLQkvKiBjaGVjayBmb3IgYXV0aGVudGljYXRlZCBkYXRhICovCi0JaWYgKHJlc3BvbnNlLT5oZWFkZXIuYWQgPT0gMSkKLQkJcnJzZXQtPnJyaV9mbGFncyB8PSBSUlNFVF9WQUxJREFURUQ7Ci0jZW5kaWYKLQotCS8qIGNvcHkgbmFtZSBmcm9tIGFuc3dlciBzZWN0aW9uICovCi0JcnJzZXQtPnJyaV9uYW1lID0gc3RyZHVwKHJlc3BvbnNlLT5hbnN3ZXItPm5hbWUpOwotCWlmIChycnNldC0+cnJpX25hbWUgPT0gTlVMTCkgewotCQlyZXN1bHQgPSBFUlJTRVRfTk9NRU1PUlk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBjb3VudCBhbnN3ZXJzICovCi0JcnJzZXQtPnJyaV9ucmRhdGFzID0gY291bnRfZG5zX3JyKHJlc3BvbnNlLT5hbnN3ZXIsIHJyc2V0LT5ycmlfcmRjbGFzcywKLQkgICAgcnJzZXQtPnJyaV9yZHR5cGUpOwotCXJyc2V0LT5ycmlfbnNpZ3MgPSBjb3VudF9kbnNfcnIocmVzcG9uc2UtPmFuc3dlciwgcnJzZXQtPnJyaV9yZGNsYXNzLAotCSAgICBUX1JSU0lHKTsKLQotCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgYW5zd2VycyAqLwotCXJyc2V0LT5ycmlfcmRhdGFzID0gY2FsbG9jKHJyc2V0LT5ycmlfbnJkYXRhcywKLQkgICAgc2l6ZW9mKHN0cnVjdCByZGF0YWluZm8pKTsKLQlpZiAocnJzZXQtPnJyaV9yZGF0YXMgPT0gTlVMTCkgewotCQlyZXN1bHQgPSBFUlJTRVRfTk9NRU1PUlk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNpZ25hdHVyZXMgKi8KLQlpZiAocnJzZXQtPnJyaV9uc2lncyA+IDApIHsKLQkJcnJzZXQtPnJyaV9zaWdzID0gY2FsbG9jKHJyc2V0LT5ycmlfbnNpZ3MsIHNpemVvZihzdHJ1Y3QgcmRhdGFpbmZvKSk7Ci0JCWlmIChycnNldC0+cnJpX3NpZ3MgPT0gTlVMTCkgewotCQkJcmVzdWx0ID0gRVJSU0VUX05PTUVNT1JZOwotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCi0JLyogY29weSBhbnN3ZXJzICYgc2lnbmF0dXJlcyAqLwotCWZvciAocnIgPSByZXNwb25zZS0+YW5zd2VyLCBpbmRleF9hbnMgPSAwLCBpbmRleF9zaWcgPSAwOwotCSAgICBycjsgcnIgPSByci0+bmV4dCkgewotCi0JCXJkYXRhID0gTlVMTDsKLQotCQlpZiAocnItPmNsYXNzID09IHJyc2V0LT5ycmlfcmRjbGFzcyAmJgotCQkgICAgcnItPnR5cGUgID09IHJyc2V0LT5ycmlfcmR0eXBlKQotCQkJcmRhdGEgPSAmcnJzZXQtPnJyaV9yZGF0YXNbaW5kZXhfYW5zKytdOwotCi0JCWlmIChyci0+Y2xhc3MgPT0gcnJzZXQtPnJyaV9yZGNsYXNzICYmCi0JCSAgICByci0+dHlwZSAgPT0gVF9SUlNJRykKLQkJCXJkYXRhID0gJnJyc2V0LT5ycmlfc2lnc1tpbmRleF9zaWcrK107Ci0KLQkJaWYgKHJkYXRhKSB7Ci0JCQlyZGF0YS0+cmRpX2xlbmd0aCA9IHJyLT5zaXplOwotCQkJcmRhdGEtPnJkaV9kYXRhICAgPSBtYWxsb2MocnItPnNpemUpOwotCi0JCQlpZiAocmRhdGEtPnJkaV9kYXRhID09IE5VTEwpIHsKLQkJCQlyZXN1bHQgPSBFUlJTRVRfTk9NRU1PUlk7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQkJbWVtY3B5KHJkYXRhLT5yZGlfZGF0YSwgcnItPnJkYXRhLCByci0+c2l6ZSk7Ci0JCX0KLQl9Ci0JZnJlZV9kbnNfcmVzcG9uc2UocmVzcG9uc2UpOwotCi0JKnJlcyA9IHJyc2V0OwotCXJldHVybiAoRVJSU0VUX1NVQ0NFU1MpOwotCi1mYWlsOgotCWlmIChycnNldCAhPSBOVUxMKQotCQlmcmVlcnJzZXQocnJzZXQpOwotCWlmIChyZXNwb25zZSAhPSBOVUxMKQotCQlmcmVlX2Ruc19yZXNwb25zZShyZXNwb25zZSk7Ci0JcmV0dXJuIChyZXN1bHQpOwotfQotCi12b2lkCi1mcmVlcnJzZXQoc3RydWN0IHJyc2V0aW5mbyAqcnJzZXQpCi17Ci0JdV9pbnQxNl90IGk7Ci0KLQlpZiAocnJzZXQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JaWYgKHJyc2V0LT5ycmlfcmRhdGFzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBycnNldC0+cnJpX25yZGF0YXM7IGkrKykgewotCQkJaWYgKHJyc2V0LT5ycmlfcmRhdGFzW2ldLnJkaV9kYXRhID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQlmcmVlKHJyc2V0LT5ycmlfcmRhdGFzW2ldLnJkaV9kYXRhKTsKLQkJfQotCQlmcmVlKHJyc2V0LT5ycmlfcmRhdGFzKTsKLQl9Ci0KLQlpZiAocnJzZXQtPnJyaV9zaWdzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBycnNldC0+cnJpX25zaWdzOyBpKyspIHsKLQkJCWlmIChycnNldC0+cnJpX3NpZ3NbaV0ucmRpX2RhdGEgPT0gTlVMTCkKLQkJCQlicmVhazsKLQkJCWZyZWUocnJzZXQtPnJyaV9zaWdzW2ldLnJkaV9kYXRhKTsKLQkJfQotCQlmcmVlKHJyc2V0LT5ycmlfc2lncyk7Ci0JfQotCi0JaWYgKHJyc2V0LT5ycmlfbmFtZSkKLQkJZnJlZShycnNldC0+cnJpX25hbWUpOwotCWZyZWUocnJzZXQpOwotfQotCi0vKgotICogRE5TIHJlc3BvbnNlIHBhcnNpbmcgcm91dGluZXMKLSAqLwotc3RhdGljIHN0cnVjdCBkbnNfcmVzcG9uc2UgKgotcGFyc2VfZG5zX3Jlc3BvbnNlKGNvbnN0IHVfY2hhciAqYW5zd2VyLCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgZG5zX3Jlc3BvbnNlICpyZXNwOwotCWNvbnN0IHVfY2hhciAqY3A7Ci0KLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSByZXNwb25zZSAqLwotCXJlc3AgPSBjYWxsb2MoMSwgc2l6ZW9mKCpyZXNwKSk7Ci0JaWYgKHJlc3AgPT0gTlVMTCkKLQkJcmV0dXJuIChOVUxMKTsKLQotCS8qIGluaXRpYWxpemUgY3VycmVudCBwb2ludGVyICovCi0JY3AgPSBhbnN3ZXI7Ci0KLQkvKiBjb3B5IGhlYWRlciAqLwotCW1lbWNweSgmcmVzcC0+aGVhZGVyLCBjcCwgSEZJWEVEU1opOwotCWNwICs9IEhGSVhFRFNaOwotCi0JLyogZml4IGhlYWRlciBieXRlIG9yZGVyICovCi0JcmVzcC0+aGVhZGVyLnFkY291bnQgPSBudG9ocyhyZXNwLT5oZWFkZXIucWRjb3VudCk7Ci0JcmVzcC0+aGVhZGVyLmFuY291bnQgPSBudG9ocyhyZXNwLT5oZWFkZXIuYW5jb3VudCk7Ci0JcmVzcC0+aGVhZGVyLm5zY291bnQgPSBudG9ocyhyZXNwLT5oZWFkZXIubnNjb3VudCk7Ci0JcmVzcC0+aGVhZGVyLmFyY291bnQgPSBudG9ocyhyZXNwLT5oZWFkZXIuYXJjb3VudCk7Ci0KLQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBxdWVyeSAqLwotCWlmIChyZXNwLT5oZWFkZXIucWRjb3VudCA8IDEpIHsKLQkJZnJlZV9kbnNfcmVzcG9uc2UocmVzcCk7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JLyogcGFyc2UgcXVlcnkgc2VjdGlvbiAqLwotCXJlc3AtPnF1ZXJ5ID0gcGFyc2VfZG5zX3FzZWN0aW9uKGFuc3dlciwgc2l6ZSwgJmNwLAotCSAgICByZXNwLT5oZWFkZXIucWRjb3VudCk7Ci0JaWYgKHJlc3AtPmhlYWRlci5xZGNvdW50ICYmIHJlc3AtPnF1ZXJ5ID09IE5VTEwpIHsKLQkJZnJlZV9kbnNfcmVzcG9uc2UocmVzcCk7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JLyogcGFyc2UgYW5zd2VyIHNlY3Rpb24gKi8KLQlyZXNwLT5hbnN3ZXIgPSBwYXJzZV9kbnNfcnJzZWN0aW9uKGFuc3dlciwgc2l6ZSwgJmNwLAotCSAgICByZXNwLT5oZWFkZXIuYW5jb3VudCk7Ci0JaWYgKHJlc3AtPmhlYWRlci5hbmNvdW50ICYmIHJlc3AtPmFuc3dlciA9PSBOVUxMKSB7Ci0JCWZyZWVfZG5zX3Jlc3BvbnNlKHJlc3ApOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCS8qIHBhcnNlIGF1dGhvcml0eSBzZWN0aW9uICovCi0JcmVzcC0+YXV0aG9yaXR5ID0gcGFyc2VfZG5zX3Jyc2VjdGlvbihhbnN3ZXIsIHNpemUsICZjcCwKLQkgICAgcmVzcC0+aGVhZGVyLm5zY291bnQpOwotCWlmIChyZXNwLT5oZWFkZXIubnNjb3VudCAmJiByZXNwLT5hdXRob3JpdHkgPT0gTlVMTCkgewotCQlmcmVlX2Ruc19yZXNwb25zZShyZXNwKTsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0KLQkvKiBwYXJzZSBhZGRpdGlvbmFsIHNlY3Rpb24gKi8KLQlyZXNwLT5hZGRpdGlvbmFsID0gcGFyc2VfZG5zX3Jyc2VjdGlvbihhbnN3ZXIsIHNpemUsICZjcCwKLQkgICAgcmVzcC0+aGVhZGVyLmFyY291bnQpOwotCWlmIChyZXNwLT5oZWFkZXIuYXJjb3VudCAmJiByZXNwLT5hZGRpdGlvbmFsID09IE5VTEwpIHsKLQkJZnJlZV9kbnNfcmVzcG9uc2UocmVzcCk7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JcmV0dXJuIChyZXNwKTsKLX0KLQotc3RhdGljIHN0cnVjdCBkbnNfcXVlcnkgKgotcGFyc2VfZG5zX3FzZWN0aW9uKGNvbnN0IHVfY2hhciAqYW5zd2VyLCBpbnQgc2l6ZSwgY29uc3QgdV9jaGFyICoqY3AsIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgZG5zX3F1ZXJ5ICpoZWFkLCAqY3VyciwgKnByZXY7Ci0JaW50IGksIGxlbmd0aDsKLQljaGFyIG5hbWVbTUFYRE5BTUVdOwotCi0JZm9yIChpID0gMSwgaGVhZCA9IE5VTEwsIHByZXYgPSBOVUxMOyBpIDw9IGNvdW50OyBpKyssIHByZXYgPSBjdXJyKSB7Ci0KLQkJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc3RydWN0ICovCi0JCWN1cnIgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBkbnNfcXVlcnkpKTsKLQkJaWYgKGN1cnIgPT0gTlVMTCkgewotCQkJZnJlZV9kbnNfcXVlcnkoaGVhZCk7Ci0JCQlyZXR1cm4gKE5VTEwpOwotCQl9Ci0JCWlmIChoZWFkID09IE5VTEwpCi0JCQloZWFkID0gY3VycjsKLQkJaWYgKHByZXYgIT0gTlVMTCkKLQkJCXByZXYtPm5leHQgPSBjdXJyOwotCi0JCS8qIG5hbWUgKi8KLQkJbGVuZ3RoID0gZG5fZXhwYW5kKGFuc3dlciwgYW5zd2VyICsgc2l6ZSwgKmNwLCBuYW1lLAotCQkgICAgc2l6ZW9mKG5hbWUpKTsKLQkJaWYgKGxlbmd0aCA8IDApIHsKLQkJCWZyZWVfZG5zX3F1ZXJ5KGhlYWQpOwotCQkJcmV0dXJuIChOVUxMKTsKLQkJfQotCQljdXJyLT5uYW1lID0gc3RyZHVwKG5hbWUpOwotCQlpZiAoY3Vyci0+bmFtZSA9PSBOVUxMKSB7Ci0JCQlmcmVlX2Ruc19xdWVyeShoZWFkKTsKLQkJCXJldHVybiAoTlVMTCk7Ci0JCX0KLQkJKmNwICs9IGxlbmd0aDsKLQotCQkvKiB0eXBlICovCi0JCWN1cnItPnR5cGUgPSBfZ2V0c2hvcnQoKmNwKTsKLQkJKmNwICs9IElOVDE2U1o7Ci0KLQkJLyogY2xhc3MgKi8KLQkJY3Vyci0+Y2xhc3MgPSBfZ2V0c2hvcnQoKmNwKTsKLQkJKmNwICs9IElOVDE2U1o7Ci0JfQotCi0JcmV0dXJuIChoZWFkKTsKLX0KLQotc3RhdGljIHN0cnVjdCBkbnNfcnIgKgotcGFyc2VfZG5zX3Jyc2VjdGlvbihjb25zdCB1X2NoYXIgKmFuc3dlciwgaW50IHNpemUsIGNvbnN0IHVfY2hhciAqKmNwLAotICAgIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgZG5zX3JyICpoZWFkLCAqY3VyciwgKnByZXY7Ci0JaW50IGksIGxlbmd0aDsKLQljaGFyIG5hbWVbTUFYRE5BTUVdOwotCi0JZm9yIChpID0gMSwgaGVhZCA9IE5VTEwsIHByZXYgPSBOVUxMOyBpIDw9IGNvdW50OyBpKyssIHByZXYgPSBjdXJyKSB7Ci0KLQkJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc3RydWN0ICovCi0JCWN1cnIgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBkbnNfcnIpKTsKLQkJaWYgKGN1cnIgPT0gTlVMTCkgewotCQkJZnJlZV9kbnNfcnIoaGVhZCk7Ci0JCQlyZXR1cm4gKE5VTEwpOwotCQl9Ci0JCWlmIChoZWFkID09IE5VTEwpCi0JCQloZWFkID0gY3VycjsKLQkJaWYgKHByZXYgIT0gTlVMTCkKLQkJCXByZXYtPm5leHQgPSBjdXJyOwotCi0JCS8qIG5hbWUgKi8KLQkJbGVuZ3RoID0gZG5fZXhwYW5kKGFuc3dlciwgYW5zd2VyICsgc2l6ZSwgKmNwLCBuYW1lLAotCQkgICAgc2l6ZW9mKG5hbWUpKTsKLQkJaWYgKGxlbmd0aCA8IDApIHsKLQkJCWZyZWVfZG5zX3JyKGhlYWQpOwotCQkJcmV0dXJuIChOVUxMKTsKLQkJfQotCQljdXJyLT5uYW1lID0gc3RyZHVwKG5hbWUpOwotCQlpZiAoY3Vyci0+bmFtZSA9PSBOVUxMKSB7Ci0JCQlmcmVlX2Ruc19ycihoZWFkKTsKLQkJCXJldHVybiAoTlVMTCk7Ci0JCX0KLQkJKmNwICs9IGxlbmd0aDsKLQotCQkvKiB0eXBlICovCi0JCWN1cnItPnR5cGUgPSBfZ2V0c2hvcnQoKmNwKTsKLQkJKmNwICs9IElOVDE2U1o7Ci0KLQkJLyogY2xhc3MgKi8KLQkJY3Vyci0+Y2xhc3MgPSBfZ2V0c2hvcnQoKmNwKTsKLQkJKmNwICs9IElOVDE2U1o7Ci0KLQkJLyogdHRsICovCi0JCWN1cnItPnR0bCA9IF9nZXRsb25nKCpjcCk7Ci0JCSpjcCArPSBJTlQzMlNaOwotCi0JCS8qIHJkYXRhIHNpemUgKi8KLQkJY3Vyci0+c2l6ZSA9IF9nZXRzaG9ydCgqY3ApOwotCQkqY3AgKz0gSU5UMTZTWjsKLQotCQkvKiByZGF0YSBpdHNlbGYgKi8KLQkJY3Vyci0+cmRhdGEgPSBtYWxsb2MoY3Vyci0+c2l6ZSk7Ci0JCWlmIChjdXJyLT5yZGF0YSA9PSBOVUxMKSB7Ci0JCQlmcmVlX2Ruc19ycihoZWFkKTsKLQkJCXJldHVybiAoTlVMTCk7Ci0JCX0KLQkJbWVtY3B5KGN1cnItPnJkYXRhLCAqY3AsIGN1cnItPnNpemUpOwotCQkqY3AgKz0gY3Vyci0+c2l6ZTsKLQl9Ci0KLQlyZXR1cm4gKGhlYWQpOwotfQotCi1zdGF0aWMgdm9pZAotZnJlZV9kbnNfcXVlcnkoc3RydWN0IGRuc19xdWVyeSAqcCkKLXsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAocC0+bmFtZSkKLQkJZnJlZShwLT5uYW1lKTsKLQlmcmVlX2Ruc19xdWVyeShwLT5uZXh0KTsKLQlmcmVlKHApOwotfQotCi1zdGF0aWMgdm9pZAotZnJlZV9kbnNfcnIoc3RydWN0IGRuc19yciAqcCkKLXsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAocC0+bmFtZSkKLQkJZnJlZShwLT5uYW1lKTsKLQlpZiAocC0+cmRhdGEpCi0JCWZyZWUocC0+cmRhdGEpOwotCWZyZWVfZG5zX3JyKHAtPm5leHQpOwotCWZyZWUocCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mcmVlX2Ruc19yZXNwb25zZShzdHJ1Y3QgZG5zX3Jlc3BvbnNlICpwKQotewotCWlmIChwID09IE5VTEwpCi0JCXJldHVybjsKLQotCWZyZWVfZG5zX3F1ZXJ5KHAtPnF1ZXJ5KTsKLQlmcmVlX2Ruc19ycihwLT5hbnN3ZXIpOwotCWZyZWVfZG5zX3JyKHAtPmF1dGhvcml0eSk7Ci0JZnJlZV9kbnNfcnIocC0+YWRkaXRpb25hbCk7Ci0JZnJlZShwKTsKLX0KLQotc3RhdGljIGludAotY291bnRfZG5zX3JyKHN0cnVjdCBkbnNfcnIgKnAsIHVfaW50MTZfdCBjbGFzcywgdV9pbnQxNl90IHR5cGUpCi17Ci0JaW50IG4gPSAwOwotCi0Jd2hpbGUocCkgewotCQlpZiAocC0+Y2xhc3MgPT0gY2xhc3MgJiYgcC0+dHlwZSA9PSB0eXBlKQotCQkJbisrOwotCQlwID0gcC0+bmV4dDsKLQl9Ci0KLQlyZXR1cm4gKG4pOwotfQotCi0jZW5kaWYgLyogIWRlZmluZWQoSEFWRV9HRVRSUlNFVEJZTkFNRSkgKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L2dldHJyc2V0YnluYW1lLmggYi9vcGVuYnNkLWNvbXBhdC9nZXRycnNldGJ5bmFtZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjgzZjU1Li4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L2dldHJyc2V0YnluYW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyogT1BFTkJTRCBCQVNFRCBPTiA6IGluY2x1ZGUvbmV0ZGIuaCAqLwotCi0vKiAkT3BlbkJTRDogZ2V0cnJzZXRieW5hbWUuYyx2IDEuNCAyMDAxLzA4LzE2IDE4OjE2OjQzIGhvIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSmFrb2IgU2NobHl0ZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCAKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS8qCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVtLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSU5URVJORVQgU09GVFdBUkUgQ09OU09SVElVTQotICogRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTAotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwKLSAqIElOVEVSTkVUIFNPRlRXQVJFIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAotICogSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORwotICogRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gKiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9HRVRSUlNFVEJZTkFNRV9ICi0jZGVmaW5lIF9HRVRSUlNFVEJZTkFNRV9ICi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZuZGVmIEhBVkVfR0VUUlJTRVRCWU5BTUUKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHJlc29sdi5oPgotCi0jaWZuZGVmIEhGSVhFRFNaCi0jZGVmaW5lIEhGSVhFRFNaIDEyCi0jZW5kaWYKLQotI2lmbmRlZiBUX1JSU0lHCi0jZGVmaW5lIFRfUlJTSUcgNDYKLSNlbmRpZgotCi0vKgotICogRmxhZ3MgZm9yIGdldHJyc2V0YnluYW1lKCkKLSAqLwotI2lmbmRlZiBSUlNFVF9WQUxJREFURUQKLSMgZGVmaW5lIFJSU0VUX1ZBTElEQVRFRAkxCi0jZW5kaWYKLQotLyoKLSAqIFJldHVybiBjb2RlcyBmb3IgZ2V0cnJzZXRieW5hbWUoKQotICovCi0jaWZuZGVmIEVSUlNFVF9TVUNDRVNTCi0jIGRlZmluZSBFUlJTRVRfU1VDQ0VTUwkJMAotIyBkZWZpbmUgRVJSU0VUX05PTUVNT1JZCTEKLSMgZGVmaW5lIEVSUlNFVF9GQUlMCQkyCi0jIGRlZmluZSBFUlJTRVRfSU5WQUwJCTMKLSMgZGVmaW5lIEVSUlNFVF9OT05BTUUJCTQKLSMgZGVmaW5lIEVSUlNFVF9OT0RBVEEJCTUKLSNlbmRpZgotCi1zdHJ1Y3QgcmRhdGFpbmZvIHsKLQl1bnNpZ25lZCBpbnQJCXJkaV9sZW5ndGg7CS8qIGxlbmd0aCBvZiBkYXRhICovCi0JdW5zaWduZWQgY2hhcgkJKnJkaV9kYXRhOwkvKiByZWNvcmQgZGF0YSAqLwotfTsKLQotc3RydWN0IHJyc2V0aW5mbyB7Ci0JdW5zaWduZWQgaW50CQlycmlfZmxhZ3M7CS8qIFJSU0VUX1ZBTElEQVRFRCAuLi4gKi8KLQl1bnNpZ25lZCBpbnQJCXJyaV9yZGNsYXNzOwkvKiBjbGFzcyBudW1iZXIgKi8KLQl1bnNpZ25lZCBpbnQJCXJyaV9yZHR5cGU7CS8qIFJSIHR5cGUgbnVtYmVyICovCi0JdW5zaWduZWQgaW50CQlycmlfdHRsOwkvKiB0aW1lIHRvIGxpdmUgKi8KLQl1bnNpZ25lZCBpbnQJCXJyaV9ucmRhdGFzOwkvKiBzaXplIG9mIHJkYXRhcyBhcnJheSAqLwotCXVuc2lnbmVkIGludAkJcnJpX25zaWdzOwkvKiBzaXplIG9mIHNpZ3MgYXJyYXkgKi8KLQljaGFyCQkJKnJyaV9uYW1lOwkvKiBjYW5vbmljYWwgbmFtZSAqLwotCXN0cnVjdCByZGF0YWluZm8JKnJyaV9yZGF0YXM7CS8qIGluZGl2aWR1YWwgcmVjb3JkcyAqLwotCXN0cnVjdCByZGF0YWluZm8JKnJyaV9zaWdzOwkvKiBpbmRpdmlkdWFsIHNpZ25hdHVyZXMgKi8KLX07Ci0KLWludAkJZ2V0cnJzZXRieW5hbWUoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgcnJzZXRpbmZvICoqKTsKLXZvaWQJCWZyZWVycnNldChzdHJ1Y3QgcnJzZXRpbmZvICopOwotCi0jZW5kaWYgLyogIWRlZmluZWQoSEFWRV9HRVRSUlNFVEJZTkFNRSkgKi8KLQotI2VuZGlmIC8qIF9HRVRSUlNFVEJZTkFNRV9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9nbG9iLmMgYi9vcGVuYnNkLWNvbXBhdC9nbG9iLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNDEyMjUuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvZ2xvYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxNCArMCwwIEBACi0vKgkkT3BlbkJTRDogZ2xvYi5jLHYgMS4zNSAyMDExLzAxLzEyIDAxOjUzOjE0IGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQotICogR3VpZG8gdmFuIFJvc3N1bS4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvZ2VuL2dsb2IuYyAqLwotCi0vKgotICogZ2xvYigzKSAtLSBhIHN1cGVyc2V0IG9mIHRoZSBvbmUgZGVmaW5lZCBpbiBQT1NJWCAxMDAzLjIuCi0gKgotICogVGhlIFshLi4uXSBjb252ZW50aW9uIHRvIG5lZ2F0ZSBhIHJhbmdlIGlzIHN1cHBvcnRlZCAoU3lzViwgUG9zaXgsIGtzaCkuCi0gKgotICogT3B0aW9uYWwgZXh0cmEgc2VydmljZXMsIGNvbnRyb2xsZWQgYnkgZmxhZ3Mgbm90IGRlZmluZWQgYnkgUE9TSVg6Ci0gKgotICogR0xPQl9RVU9URToKLSAqCUVzY2FwaW5nIGNvbnZlbnRpb246IFwgaW5oaWJpdHMgYW55IHNwZWNpYWwgbWVhbmluZyB0aGUgZm9sbG93aW5nCi0gKgljaGFyYWN0ZXIgbWlnaHQgaGF2ZSAoZXhjZXB0IFwgYXQgZW5kIG9mIHN0cmluZyBpcyByZXRhaW5lZCkuCi0gKiBHTE9CX01BR0NIQVI6Ci0gKglTZXQgaW4gZ2xfZmxhZ3MgaWYgcGF0dGVybiBjb250YWluZWQgYSBnbG9iYmluZyBjaGFyYWN0ZXIuCi0gKiBHTE9CX05PTUFHSUM6Ci0gKglTYW1lIGFzIEdMT0JfTk9DSEVDSywgYnV0IGl0IHdpbGwgb25seSBhcHBlbmQgcGF0dGVybiBpZiBpdCBkaWQKLSAqCW5vdCBjb250YWluIGFueSBtYWdpYyBjaGFyYWN0ZXJzLiAgW1VzZWQgaW4gY3NoIHN0eWxlIGdsb2JiaW5nXQotICogR0xPQl9BTFRESVJGVU5DOgotICoJVXNlIGFsdGVybmF0ZWx5IHNwZWNpZmllZCBkaXJlY3RvcnkgYWNjZXNzIGZ1bmN0aW9ucy4KLSAqIEdMT0JfVElMREU6Ci0gKglleHBhbmQgfnVzZXIvZm9vIHRvIHRoZSAvaG9tZS9kaXIvb2YvdXNlci9mb28KLSAqIEdMT0JfQlJBQ0U6Ci0gKglleHBhbmQgezEsMn17YSxifSB0byAxYSAxYiAyYSAyYgotICogZ2xfbWF0Y2hjOgotICoJTnVtYmVyIG9mIG1hdGNoZXMgaW4gdGhlIGN1cnJlbnQgaW52b2NhdGlvbiBvZiBnbG9iLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2lmICFkZWZpbmVkKEhBVkVfR0xPQikgfHwgIWRlZmluZWQoR0xPQl9IQVNfQUxURElSRlVOQykgfHwgXAotICAgICFkZWZpbmVkKEdMT0JfSEFTX0dMX01BVENIQykgfHwgIWRlZmluZWQoR0xPQl9IQVNfR0xfU1RBVFYpIHx8IFwKLSAgICAhZGVmaW5lZChIQVZFX0RFQ0xfR0xPQl9OT01BVENIKSB8fCBIQVZFX0RFQ0xfR0xPQl9OT01BVENIID09IDAgfHwgXAotICAgIGRlZmluZWQoQlJPS0VOX0dMT0IpCi0KLSNpbmNsdWRlICJjaGFyY2xhc3MuaCIKLQotI2RlZmluZQlET0xMQVIJCSckJwotI2RlZmluZQlET1QJCScuJwotI2RlZmluZQlFT1MJCSdcMCcKLSNkZWZpbmUJTEJSQUNLRVQJJ1snCi0jZGVmaW5lCU5PVAkJJyEnCi0jZGVmaW5lCVFVRVNUSU9OCSc/JwotI2RlZmluZQlRVU9URQkJJ1xcJwotI2RlZmluZQlSQU5HRQkJJy0nCi0jZGVmaW5lCVJCUkFDS0VUCSddJwotI2RlZmluZQlTRVAJCScvJwotI2RlZmluZQlTVEFSCQknKicKLSNkZWZpbmUJVElMREUJCSd+JwotI2RlZmluZQlVTkRFUlNDT1JFCSdfJwotI2RlZmluZQlMQlJBQ0UJCSd7JwotI2RlZmluZQlSQlJBQ0UJCSd9JwotI2RlZmluZQlTTEFTSAkJJy8nCi0jZGVmaW5lCUNPTU1BCQknLCcKLQotI2lmbmRlZiBERUJVRwotCi0jZGVmaW5lCU1fUVVPVEUJCTB4ODAwMAotI2RlZmluZQlNX1BST1RFQ1QJMHg0MDAwCi0jZGVmaW5lCU1fTUFTSwkJMHhmZmZmCi0jZGVmaW5lCU1fQVNDSUkJCTB4MDBmZgotCi10eXBlZGVmIHVfc2hvcnQgQ2hhcjsKLQotI2Vsc2UKLQotI2RlZmluZQlNX1FVT1RFCQkweDgwCi0jZGVmaW5lCU1fUFJPVEVDVAkweDQwCi0jZGVmaW5lCU1fTUFTSwkJMHhmZgotI2RlZmluZQlNX0FTQ0lJCQkweDdmCi0KLXR5cGVkZWYgY2hhciBDaGFyOwotCi0jZW5kaWYKLQotCi0jZGVmaW5lCUNIQVIoYykJCSgoQ2hhcikoKGMpJk1fQVNDSUkpKQotI2RlZmluZQlNRVRBKGMpCQkoKENoYXIpKChjKXxNX1FVT1RFKSkKLSNkZWZpbmUJTV9BTEwJCU1FVEEoJyonKQotI2RlZmluZQlNX0VORAkJTUVUQSgnXScpCi0jZGVmaW5lCU1fTk9UCQlNRVRBKCchJykKLSNkZWZpbmUJTV9PTkUJCU1FVEEoJz8nKQotI2RlZmluZQlNX1JORwkJTUVUQSgnLScpCi0jZGVmaW5lCU1fU0VUCQlNRVRBKCdbJykKLSNkZWZpbmUJTV9DTEFTUwkJTUVUQSgnOicpCi0jZGVmaW5lCWlzbWV0YShjKQkoKChjKSZNX1FVT1RFKSAhPSAwKQotCi0jZGVmaW5lCUdMT0JfTElNSVRfTUFMTE9DCTY1NTM2Ci0jZGVmaW5lCUdMT0JfTElNSVRfU1RBVAkJMTI4Ci0jZGVmaW5lCUdMT0JfTElNSVRfUkVBRERJUgkxNjM4NAotCi1zdHJ1Y3QgZ2xvYl9saW0gewotCXNpemVfdAlnbGltX21hbGxvYzsKLQlzaXplX3QJZ2xpbV9zdGF0OwotCXNpemVfdAlnbGltX3JlYWRkaXI7Ci19OwotCi1zdGF0aWMgaW50CSBjb21wYXJlKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKLXN0YXRpYyBpbnQJIGdfQ3RvYyhjb25zdCBDaGFyICosIGNoYXIgKiwgdV9pbnQpOwotc3RhdGljIGludAkgZ19sc3RhdChDaGFyICosIHN0cnVjdCBzdGF0ICosIGdsb2JfdCAqKTsKLXN0YXRpYyBESVIJKmdfb3BlbmRpcihDaGFyICosIGdsb2JfdCAqKTsKLXN0YXRpYyBDaGFyCSpnX3N0cmNocihjb25zdCBDaGFyICosIGludCk7Ci1zdGF0aWMgaW50CSBnX3N0cm5jbXAoY29uc3QgQ2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Ci1zdGF0aWMgaW50CSBnX3N0YXQoQ2hhciAqLCBzdHJ1Y3Qgc3RhdCAqLCBnbG9iX3QgKik7Ci1zdGF0aWMgaW50CSBnbG9iMChjb25zdCBDaGFyICosIGdsb2JfdCAqLCBzdHJ1Y3QgZ2xvYl9saW0gKik7Ci1zdGF0aWMgaW50CSBnbG9iMShDaGFyICosIENoYXIgKiwgZ2xvYl90ICosIHN0cnVjdCBnbG9iX2xpbSAqKTsKLXN0YXRpYyBpbnQJIGdsb2IyKENoYXIgKiwgQ2hhciAqLCBDaGFyICosIENoYXIgKiwgQ2hhciAqLCBDaGFyICosCi0JCSAgICBnbG9iX3QgKiwgc3RydWN0IGdsb2JfbGltICopOwotc3RhdGljIGludAkgZ2xvYjMoQ2hhciAqLCBDaGFyICosIENoYXIgKiwgQ2hhciAqLCBDaGFyICosCi0JCSAgICBDaGFyICosIENoYXIgKiwgZ2xvYl90ICosIHN0cnVjdCBnbG9iX2xpbSAqKTsKLXN0YXRpYyBpbnQJIGdsb2JleHRlbmQoY29uc3QgQ2hhciAqLCBnbG9iX3QgKiwgc3RydWN0IGdsb2JfbGltICosCi0JCSAgICBzdHJ1Y3Qgc3RhdCAqKTsKLXN0YXRpYyBjb25zdCBDaGFyICoKLQkJIGdsb2J0aWxkZShjb25zdCBDaGFyICosIENoYXIgKiwgc2l6ZV90LCBnbG9iX3QgKik7Ci1zdGF0aWMgaW50CSBnbG9iZXhwMShjb25zdCBDaGFyICosIGdsb2JfdCAqLCBzdHJ1Y3QgZ2xvYl9saW0gKik7Ci1zdGF0aWMgaW50CSBnbG9iZXhwMihjb25zdCBDaGFyICosIGNvbnN0IENoYXIgKiwgZ2xvYl90ICosCi0JCSAgICBzdHJ1Y3QgZ2xvYl9saW0gKik7Ci1zdGF0aWMgaW50CSBtYXRjaChDaGFyICosIENoYXIgKiwgQ2hhciAqKTsKLSNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQJIHFwcmludGYoY29uc3QgY2hhciAqLCBDaGFyICopOwotI2VuZGlmCi0KLWludAotZ2xvYihjb25zdCBjaGFyICpwYXR0ZXJuLCBpbnQgZmxhZ3MsIGludCAoKmVycmZ1bmMpKGNvbnN0IGNoYXIgKiwgaW50KSwKLSAgICBnbG9iX3QgKnBnbG9iKQotewotCWNvbnN0IHVfY2hhciAqcGF0bmV4dDsKLQlpbnQgYzsKLQlDaGFyICpidWZuZXh0LCAqYnVmZW5kLCBwYXRidWZbTUFYUEFUSExFTl07Ci0Jc3RydWN0IGdsb2JfbGltIGxpbWl0ID0geyAwLCAwLCAwIH07Ci0KLQlwYXRuZXh0ID0gKHVfY2hhciAqKSBwYXR0ZXJuOwotCWlmICghKGZsYWdzICYgR0xPQl9BUFBFTkQpKSB7Ci0JCXBnbG9iLT5nbF9wYXRoYyA9IDA7Ci0JCXBnbG9iLT5nbF9wYXRodiA9IE5VTEw7Ci0JCXBnbG9iLT5nbF9zdGF0diA9IE5VTEw7Ci0JCWlmICghKGZsYWdzICYgR0xPQl9ET09GRlMpKQotCQkJcGdsb2ItPmdsX29mZnMgPSAwOwotCX0KLQlwZ2xvYi0+Z2xfZmxhZ3MgPSBmbGFncyAmIH5HTE9CX01BR0NIQVI7Ci0JcGdsb2ItPmdsX2VycmZ1bmMgPSBlcnJmdW5jOwotCXBnbG9iLT5nbF9tYXRjaGMgPSAwOwotCi0JaWYgKHBnbG9iLT5nbF9vZmZzIDwgMCB8fCBwZ2xvYi0+Z2xfcGF0aGMgPCAwIHx8Ci0JICAgIHBnbG9iLT5nbF9vZmZzID49IElOVF9NQVggfHwgcGdsb2ItPmdsX3BhdGhjID49IElOVF9NQVggfHwKLQkgICAgcGdsb2ItPmdsX3BhdGhjID49IElOVF9NQVggLSBwZ2xvYi0+Z2xfb2ZmcyAtIDEpCi0JCXJldHVybiBHTE9CX05PU1BBQ0U7Ci0KLQlidWZuZXh0ID0gcGF0YnVmOwotCWJ1ZmVuZCA9IGJ1Zm5leHQgKyBNQVhQQVRITEVOIC0gMTsKLQlpZiAoZmxhZ3MgJiBHTE9CX05PRVNDQVBFKQotCQl3aGlsZSAoYnVmbmV4dCA8IGJ1ZmVuZCAmJiAoYyA9ICpwYXRuZXh0KyspICE9IEVPUykKLQkJCSpidWZuZXh0KysgPSBjOwotCWVsc2UgewotCQkvKiBQcm90ZWN0IHRoZSBxdW90ZWQgY2hhcmFjdGVycy4gKi8KLQkJd2hpbGUgKGJ1Zm5leHQgPCBidWZlbmQgJiYgKGMgPSAqcGF0bmV4dCsrKSAhPSBFT1MpCi0JCQlpZiAoYyA9PSBRVU9URSkgewotCQkJCWlmICgoYyA9ICpwYXRuZXh0KyspID09IEVPUykgewotCQkJCQljID0gUVVPVEU7Ci0JCQkJCS0tcGF0bmV4dDsKLQkJCQl9Ci0JCQkJKmJ1Zm5leHQrKyA9IGMgfCBNX1BST1RFQ1Q7Ci0JCQl9IGVsc2UKLQkJCQkqYnVmbmV4dCsrID0gYzsKLQl9Ci0JKmJ1Zm5leHQgPSBFT1M7Ci0KLQlpZiAoZmxhZ3MgJiBHTE9CX0JSQUNFKQotCQlyZXR1cm4gZ2xvYmV4cDEocGF0YnVmLCBwZ2xvYiwgJmxpbWl0KTsKLQllbHNlCi0JCXJldHVybiBnbG9iMChwYXRidWYsIHBnbG9iLCAmbGltaXQpOwotfQotCi0vKgotICogRXhwYW5kIHJlY3Vyc2l2ZWx5IGEgZ2xvYiB7fSBwYXR0ZXJuLiBXaGVuIHRoZXJlIGlzIG5vIG1vcmUgZXhwYW5zaW9uCi0gKiBpbnZva2UgdGhlIHN0YW5kYXJkIGdsb2JiaW5nIHJvdXRpbmUgdG8gZ2xvYiB0aGUgcmVzdCBvZiB0aGUgbWFnaWMKLSAqIGNoYXJhY3RlcnMKLSAqLwotc3RhdGljIGludAotZ2xvYmV4cDEoY29uc3QgQ2hhciAqcGF0dGVybiwgZ2xvYl90ICpwZ2xvYiwgc3RydWN0IGdsb2JfbGltICpsaW1pdHApCi17Ci0JY29uc3QgQ2hhciogcHRyID0gcGF0dGVybjsKLQotCS8qIFByb3RlY3QgYSBzaW5nbGUge30sIGZvciBmaW5kKDEpLCBsaWtlIGNzaCAqLwotCWlmIChwYXR0ZXJuWzBdID09IExCUkFDRSAmJiBwYXR0ZXJuWzFdID09IFJCUkFDRSAmJiBwYXR0ZXJuWzJdID09IEVPUykKLQkJcmV0dXJuIGdsb2IwKHBhdHRlcm4sIHBnbG9iLCBsaW1pdHApOwotCi0JaWYgKChwdHIgPSAoY29uc3QgQ2hhciAqKSBnX3N0cmNocihwdHIsIExCUkFDRSkpICE9IE5VTEwpCi0JCXJldHVybiBnbG9iZXhwMihwdHIsIHBhdHRlcm4sIHBnbG9iLCBsaW1pdHApOwotCi0JcmV0dXJuIGdsb2IwKHBhdHRlcm4sIHBnbG9iLCBsaW1pdHApOwotfQotCi0KLS8qCi0gKiBSZWN1cnNpdmUgYnJhY2UgZ2xvYmJpbmcgaGVscGVyLiBUcmllcyB0byBleHBhbmQgYSBzaW5nbGUgYnJhY2UuCi0gKiBJZiBpdCBzdWNjZWVkcyB0aGVuIGl0IGludm9rZXMgZ2xvYmV4cDEgd2l0aCB0aGUgbmV3IHBhdHRlcm4uCi0gKiBJZiBpdCBmYWlscyB0aGVuIGl0IHRyaWVzIHRvIGdsb2IgdGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4gYW5kIHJldHVybnMuCi0gKi8KLXN0YXRpYyBpbnQKLWdsb2JleHAyKGNvbnN0IENoYXIgKnB0ciwgY29uc3QgQ2hhciAqcGF0dGVybiwgZ2xvYl90ICpwZ2xvYiwKLSAgICBzdHJ1Y3QgZ2xvYl9saW0gKmxpbWl0cCkKLXsKLQlpbnQgICAgIGksIHJ2OwotCUNoYXIgICAqbG0sICpsczsKLQljb25zdCBDaGFyICpwZSwgKnBtLCAqcGw7Ci0JQ2hhciAgICBwYXRidWZbTUFYUEFUSExFTl07Ci0KLQkvKiBjb3B5IHBhcnQgdXAgdG8gdGhlIGJyYWNlICovCi0JZm9yIChsbSA9IHBhdGJ1ZiwgcG0gPSBwYXR0ZXJuOyBwbSAhPSBwdHI7ICpsbSsrID0gKnBtKyspCi0JCTsKLQkqbG0gPSBFT1M7Ci0JbHMgPSBsbTsKLQotCS8qIEZpbmQgdGhlIGJhbGFuY2VkIGJyYWNlICovCi0JZm9yIChpID0gMCwgcGUgPSArK3B0cjsgKnBlOyBwZSsrKQotCQlpZiAoKnBlID09IExCUkFDS0VUKSB7Ci0JCQkvKiBJZ25vcmUgZXZlcnl0aGluZyBiZXR3ZWVuIFtdICovCi0JCQlmb3IgKHBtID0gcGUrKzsgKnBlICE9IFJCUkFDS0VUICYmICpwZSAhPSBFT1M7IHBlKyspCi0JCQkJOwotCQkJaWYgKCpwZSA9PSBFT1MpIHsKLQkJCQkvKgotCQkJCSAqIFdlIGNvdWxkIG5vdCBmaW5kIGEgbWF0Y2hpbmcgUkJSQUNLRVQuCi0JCQkJICogSWdub3JlIGFuZCBqdXN0IGxvb2sgZm9yIFJCUkFDRQotCQkJCSAqLwotCQkJCXBlID0gcG07Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKnBlID09IExCUkFDRSkKLQkJCWkrKzsKLQkJZWxzZSBpZiAoKnBlID09IFJCUkFDRSkgewotCQkJaWYgKGkgPT0gMCkKLQkJCQlicmVhazsKLQkJCWktLTsKLQkJfQotCi0JLyogTm9uIG1hdGNoaW5nIGJyYWNlczsganVzdCBnbG9iIHRoZSBwYXR0ZXJuICovCi0JaWYgKGkgIT0gMCB8fCAqcGUgPT0gRU9TKQotCQlyZXR1cm4gZ2xvYjAocGF0YnVmLCBwZ2xvYiwgbGltaXRwKTsKLQotCWZvciAoaSA9IDAsIHBsID0gcG0gPSBwdHI7IHBtIDw9IHBlOyBwbSsrKSB7Ci0JCXN3aXRjaCAoKnBtKSB7Ci0JCWNhc2UgTEJSQUNLRVQ6Ci0JCQkvKiBJZ25vcmUgZXZlcnl0aGluZyBiZXR3ZWVuIFtdICovCi0JCQlmb3IgKHBsID0gcG0rKzsgKnBtICE9IFJCUkFDS0VUICYmICpwbSAhPSBFT1M7IHBtKyspCi0JCQkJOwotCQkJaWYgKCpwbSA9PSBFT1MpIHsKLQkJCQkvKgotCQkJCSAqIFdlIGNvdWxkIG5vdCBmaW5kIGEgbWF0Y2hpbmcgUkJSQUNLRVQuCi0JCQkJICogSWdub3JlIGFuZCBqdXN0IGxvb2sgZm9yIFJCUkFDRQotCQkJCSAqLwotCQkJCXBtID0gcGw7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIExCUkFDRToKLQkJCWkrKzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkJSQUNFOgotCQkJaWYgKGkpIHsKLQkJCQlpLS07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQljYXNlIENPTU1BOgotCQkJaWYgKGkgJiYgKnBtID09IENPTU1BKQotCQkJCWJyZWFrOwotCQkJZWxzZSB7Ci0JCQkJLyogQXBwZW5kIHRoZSBjdXJyZW50IHN0cmluZyAqLwotCQkJCWZvciAobG0gPSBsczsgKHBsIDwgcG0pOyAqbG0rKyA9ICpwbCsrKQotCQkJCQk7Ci0KLQkJCQkvKgotCQkJCSAqIEFwcGVuZCB0aGUgcmVzdCBvZiB0aGUgcGF0dGVybiBhZnRlciB0aGUKLQkJCQkgKiBjbG9zaW5nIGJyYWNlCi0JCQkJICovCi0JCQkJZm9yIChwbCA9IHBlICsgMTsgKCpsbSsrID0gKnBsKyspICE9IEVPUzsgKQotCQkJCQk7Ci0KLQkJCQkvKiBFeHBhbmQgdGhlIGN1cnJlbnQgcGF0dGVybiAqLwotI2lmZGVmIERFQlVHCi0JCQkJcXByaW50ZigiZ2xvYmV4cDI6IiwgcGF0YnVmKTsKLSNlbmRpZgotCQkJCXJ2ID0gZ2xvYmV4cDEocGF0YnVmLCBwZ2xvYiwgbGltaXRwKTsKLQkJCQlpZiAocnYgJiYgcnYgIT0gR0xPQl9OT01BVENIKQotCQkJCQlyZXR1cm4gcnY7Ci0KLQkJCQkvKiBtb3ZlIGFmdGVyIHRoZSBjb21tYSwgdG8gdGhlIG5leHQgc3RyaW5nICovCi0JCQkJcGwgPSBwbSArIDE7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotCi0vKgotICogZXhwYW5kIHRpbGRlIGZyb20gdGhlIHBhc3N3ZCBmaWxlLgotICovCi1zdGF0aWMgY29uc3QgQ2hhciAqCi1nbG9idGlsZGUoY29uc3QgQ2hhciAqcGF0dGVybiwgQ2hhciAqcGF0YnVmLCBzaXplX3QgcGF0YnVmX2xlbiwgZ2xvYl90ICpwZ2xvYikKLXsKLQlzdHJ1Y3QgcGFzc3dkICpwd2Q7Ci0JY2hhciAqaDsKLQljb25zdCBDaGFyICpwOwotCUNoYXIgKmIsICplYjsKLQotCWlmICgqcGF0dGVybiAhPSBUSUxERSB8fCAhKHBnbG9iLT5nbF9mbGFncyAmIEdMT0JfVElMREUpKQotCQlyZXR1cm4gcGF0dGVybjsKLQotCS8qIENvcHkgdXAgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIG9yIC8gKi8KLQllYiA9ICZwYXRidWZbcGF0YnVmX2xlbiAtIDFdOwotCWZvciAocCA9IHBhdHRlcm4gKyAxLCBoID0gKGNoYXIgKikgcGF0YnVmOwotCSAgICBoIDwgKGNoYXIgKillYiAmJiAqcCAmJiAqcCAhPSBTTEFTSDsgKmgrKyA9ICpwKyspCi0JCTsKLQotCSpoID0gRU9TOwotCi0jaWYgMAotCWlmIChoID09IChjaGFyICopZWIpCi0JCXJldHVybiB3aGF0OwotI2VuZGlmCi0KLQlpZiAoKChjaGFyICopIHBhdGJ1ZilbMF0gPT0gRU9TKSB7Ci0JCS8qCi0JCSAqIGhhbmRsZSBhIHBsYWluIH4gb3Igfi8gYnkgZXhwYW5kaW5nICRIT01FCi0JCSAqIGZpcnN0IGFuZCB0aGVuIHRyeWluZyB0aGUgcGFzc3dvcmQgZmlsZQotCQkgKi8KLSNpZiAwCi0JCWlmIChpc3NldHVnaWQoKSAhPSAwIHx8IChoID0gZ2V0ZW52KCJIT01FIikpID09IE5VTEwpIHsKLSNlbmRpZgotCQlpZiAoKGdldHVpZCgpICE9IGdldGV1aWQoKSkgfHwgKGggPSBnZXRlbnYoIkhPTUUiKSkgPT0gTlVMTCkgewotCQkJaWYgKChwd2QgPSBnZXRwd3VpZChnZXR1aWQoKSkpID09IE5VTEwpCi0JCQkJcmV0dXJuIHBhdHRlcm47Ci0JCQllbHNlCi0JCQkJaCA9IHB3ZC0+cHdfZGlyOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogRXhwYW5kIGEgfnVzZXIKLQkJICovCi0JCWlmICgocHdkID0gZ2V0cHduYW0oKGNoYXIqKSBwYXRidWYpKSA9PSBOVUxMKQotCQkJcmV0dXJuIHBhdHRlcm47Ci0JCWVsc2UKLQkJCWggPSBwd2QtPnB3X2RpcjsKLQl9Ci0KLQkvKiBDb3B5IHRoZSBob21lIGRpcmVjdG9yeSAqLwotCWZvciAoYiA9IHBhdGJ1ZjsgYiA8IGViICYmICpoOyAqYisrID0gKmgrKykKLQkJOwotCi0JLyogQXBwZW5kIHRoZSByZXN0IG9mIHRoZSBwYXR0ZXJuICovCi0Jd2hpbGUgKGIgPCBlYiAmJiAoKmIrKyA9ICpwKyspICE9IEVPUykKLQkJOwotCSpiID0gRU9TOwotCi0JcmV0dXJuIHBhdGJ1ZjsKLX0KLQotc3RhdGljIGludAotZ19zdHJuY21wKGNvbnN0IENoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pCi17Ci0JaW50IHJ2ID0gMDsKLQotCXdoaWxlIChuLS0pIHsKLQkJcnYgPSAqKENoYXIgKilzMSAtICooY29uc3QgdW5zaWduZWQgY2hhciAqKXMyKys7Ci0JCWlmIChydikKLQkJCWJyZWFrOwotCQlpZiAoKnMxKysgPT0gJ1wwJykKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gcnY7Ci19Ci0KLXN0YXRpYyBpbnQKLWdfY2hhcmNsYXNzKGNvbnN0IENoYXIgKipwYXR0ZXJucCwgQ2hhciAqKmJ1Zm5leHRwKQotewotCWNvbnN0IENoYXIgKnBhdHRlcm4gPSAqcGF0dGVybnAgKyAxOwotCUNoYXIgKmJ1Zm5leHQgPSAqYnVmbmV4dHA7Ci0JY29uc3QgQ2hhciAqY29sb247Ci0Jc3RydWN0IGNjbGFzcyAqY2M7Ci0Jc2l6ZV90IGxlbjsKLQotCWlmICgoY29sb24gPSBnX3N0cmNocihwYXR0ZXJuLCAnOicpKSA9PSBOVUxMIHx8IGNvbG9uWzFdICE9ICddJykKLQkJcmV0dXJuIDE7CS8qIG5vdCBhIGNoYXJhY3RlciBjbGFzcyAqLwotCi0JbGVuID0gKHNpemVfdCkoY29sb24gLSBwYXR0ZXJuKTsKLQlmb3IgKGNjID0gY2NsYXNzZXM7IGNjLT5uYW1lICE9IE5VTEw7IGNjKyspIHsKLQkJaWYgKCFnX3N0cm5jbXAocGF0dGVybiwgY2MtPm5hbWUsIGxlbikgJiYgY2MtPm5hbWVbbGVuXSA9PSAnXDAnKQotCQkJYnJlYWs7Ci0JfQotCWlmIChjYy0+bmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CS8qIGludmFsaWQgY2hhcmFjdGVyIGNsYXNzICovCi0JKmJ1Zm5leHQrKyA9IE1fQ0xBU1M7Ci0JKmJ1Zm5leHQrKyA9IChDaGFyKShjYyAtICZjY2xhc3Nlc1swXSk7Ci0JKmJ1Zm5leHRwID0gYnVmbmV4dDsKLQkqcGF0dGVybnAgKz0gbGVuICsgMzsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogVGhlIG1haW4gZ2xvYigpIHJvdXRpbmU6IGNvbXBpbGVzIHRoZSBwYXR0ZXJuIChvcHRpb25hbGx5IHByb2Nlc3NpbmcKLSAqIHF1b3RlcyksIGNhbGxzIGdsb2IxKCkgdG8gZG8gdGhlIHJlYWwgcGF0dGVybiBtYXRjaGluZywgYW5kIGZpbmFsbHkKLSAqIHNvcnRzIHRoZSBsaXN0ICh1bmxlc3MgdW5zb3J0ZWQgb3BlcmF0aW9uIGlzIHJlcXVlc3RlZCkuICBSZXR1cm5zIDAKLSAqIGlmIHRoaW5ncyB3ZW50IHdlbGwsIG5vbnplcm8gaWYgZXJyb3JzIG9jY3VycmVkLiAgSXQgaXMgbm90IGFuIGVycm9yCi0gKiB0byBmaW5kIG5vIG1hdGNoZXMuCi0gKi8KLXN0YXRpYyBpbnQKLWdsb2IwKGNvbnN0IENoYXIgKnBhdHRlcm4sIGdsb2JfdCAqcGdsb2IsIHN0cnVjdCBnbG9iX2xpbSAqbGltaXRwKQotewotCWNvbnN0IENoYXIgKnFwYXRuZXh0OwotCWludCBjLCBlcnIsIG9sZHBhdGhjOwotCUNoYXIgKmJ1Zm5leHQsIHBhdGJ1ZltNQVhQQVRITEVOXTsKLQotCXFwYXRuZXh0ID0gZ2xvYnRpbGRlKHBhdHRlcm4sIHBhdGJ1ZiwgTUFYUEFUSExFTiwgcGdsb2IpOwotCW9sZHBhdGhjID0gcGdsb2ItPmdsX3BhdGhjOwotCWJ1Zm5leHQgPSBwYXRidWY7Ci0KLQkvKiBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBidWZmZXIgb3ZlcmZsb3cgYW55IG1vcmUuICovCi0Jd2hpbGUgKChjID0gKnFwYXRuZXh0KyspICE9IEVPUykgewotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSBMQlJBQ0tFVDoKLQkJCWMgPSAqcXBhdG5leHQ7Ci0JCQlpZiAoYyA9PSBOT1QpCi0JCQkJKytxcGF0bmV4dDsKLQkJCWlmICgqcXBhdG5leHQgPT0gRU9TIHx8Ci0JCQkgICAgZ19zdHJjaHIocXBhdG5leHQrMSwgUkJSQUNLRVQpID09IE5VTEwpIHsKLQkJCQkqYnVmbmV4dCsrID0gTEJSQUNLRVQ7Ci0JCQkJaWYgKGMgPT0gTk9UKQotCQkJCQktLXFwYXRuZXh0OwotCQkJCWJyZWFrOwotCQkJfQotCQkJKmJ1Zm5leHQrKyA9IE1fU0VUOwotCQkJaWYgKGMgPT0gTk9UKQotCQkJCSpidWZuZXh0KysgPSBNX05PVDsKLQkJCWMgPSAqcXBhdG5leHQrKzsKLQkJCWRvIHsKLQkJCQlpZiAoYyA9PSBMQlJBQ0tFVCAmJiAqcXBhdG5leHQgPT0gJzonKSB7Ci0JCQkJCWRvIHsKLQkJCQkJCWVyciA9IGdfY2hhcmNsYXNzKCZxcGF0bmV4dCwKLQkJCQkJCSAgICAmYnVmbmV4dCk7Ci0JCQkJCQlpZiAoZXJyKQotCQkJCQkJCWJyZWFrOwotCQkJCQkJYyA9ICpxcGF0bmV4dCsrOwotCQkJCQl9IHdoaWxlIChjID09IExCUkFDS0VUICYmICpxcGF0bmV4dCA9PSAnOicpOwotCQkJCQlpZiAoZXJyID09IC0xICYmCi0JCQkJCSAgICAhKHBnbG9iLT5nbF9mbGFncyAmIEdMT0JfTk9DSEVDSykpCi0JCQkJCQlyZXR1cm4gR0xPQl9OT01BVENIOwotCQkJCQlpZiAoYyA9PSBSQlJBQ0tFVCkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkqYnVmbmV4dCsrID0gQ0hBUihjKTsKLQkJCQlpZiAoKnFwYXRuZXh0ID09IFJBTkdFICYmCi0JCQkJICAgIChjID0gcXBhdG5leHRbMV0pICE9IFJCUkFDS0VUKSB7Ci0JCQkJCSpidWZuZXh0KysgPSBNX1JORzsKLQkJCQkJKmJ1Zm5leHQrKyA9IENIQVIoYyk7Ci0JCQkJCXFwYXRuZXh0ICs9IDI7Ci0JCQkJfQotCQkJfSB3aGlsZSAoKGMgPSAqcXBhdG5leHQrKykgIT0gUkJSQUNLRVQpOwotCQkJcGdsb2ItPmdsX2ZsYWdzIHw9IEdMT0JfTUFHQ0hBUjsKLQkJCSpidWZuZXh0KysgPSBNX0VORDsKLQkJCWJyZWFrOwotCQljYXNlIFFVRVNUSU9OOgotCQkJcGdsb2ItPmdsX2ZsYWdzIHw9IEdMT0JfTUFHQ0hBUjsKLQkJCSpidWZuZXh0KysgPSBNX09ORTsKLQkJCWJyZWFrOwotCQljYXNlIFNUQVI6Ci0JCQlwZ2xvYi0+Z2xfZmxhZ3MgfD0gR0xPQl9NQUdDSEFSOwotCQkJLyogY29sbGFwc2UgYWRqYWNlbnQgc3RhcnMgdG8gb25lLAotCQkJICogdG8gYXZvaWQgZXhwb25lbnRpYWwgYmVoYXZpb3IKLQkJCSAqLwotCQkJaWYgKGJ1Zm5leHQgPT0gcGF0YnVmIHx8IGJ1Zm5leHRbLTFdICE9IE1fQUxMKQotCQkJCSpidWZuZXh0KysgPSBNX0FMTDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJKmJ1Zm5leHQrKyA9IENIQVIoYyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQkqYnVmbmV4dCA9IEVPUzsKLSNpZmRlZiBERUJVRwotCXFwcmludGYoImdsb2IwOiIsIHBhdGJ1Zik7Ci0jZW5kaWYKLQotCWlmICgoZXJyID0gZ2xvYjEocGF0YnVmLCBwYXRidWYrTUFYUEFUSExFTi0xLCBwZ2xvYiwgbGltaXRwKSkgIT0gMCkKLQkJcmV0dXJuKGVycik7Ci0KLQkvKgotCSAqIElmIHRoZXJlIHdhcyBubyBtYXRjaCB3ZSBhcmUgZ29pbmcgdG8gYXBwZW5kIHRoZSBwYXR0ZXJuCi0JICogaWYgR0xPQl9OT0NIRUNLIHdhcyBzcGVjaWZpZWQgb3IgaWYgR0xPQl9OT01BR0lDIHdhcyBzcGVjaWZpZWQKLQkgKiBhbmQgdGhlIHBhdHRlcm4gZGlkIG5vdCBjb250YWluIGFueSBtYWdpYyBjaGFyYWN0ZXJzCi0JICogR0xPQl9OT01BR0lDIGlzIHRoZXJlIGp1c3QgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBjc2guCi0JICovCi0JaWYgKHBnbG9iLT5nbF9wYXRoYyA9PSBvbGRwYXRoYykgewotCQlpZiAoKHBnbG9iLT5nbF9mbGFncyAmIEdMT0JfTk9DSEVDSykgfHwKLQkJICAgICgocGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9OT01BR0lDKSAmJgotCQkgICAgIShwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX01BR0NIQVIpKSkKLQkJCXJldHVybihnbG9iZXh0ZW5kKHBhdHRlcm4sIHBnbG9iLCBsaW1pdHAsIE5VTEwpKTsKLQkJZWxzZQotCQkJcmV0dXJuKEdMT0JfTk9NQVRDSCk7Ci0JfQotCWlmICghKHBnbG9iLT5nbF9mbGFncyAmIEdMT0JfTk9TT1JUKSkKLQkJcXNvcnQocGdsb2ItPmdsX3BhdGh2ICsgcGdsb2ItPmdsX29mZnMgKyBvbGRwYXRoYywKLQkJICAgIHBnbG9iLT5nbF9wYXRoYyAtIG9sZHBhdGhjLCBzaXplb2YoY2hhciAqKSwgY29tcGFyZSk7Ci0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50Ci1jb21wYXJlKGNvbnN0IHZvaWQgKnAsIGNvbnN0IHZvaWQgKnEpCi17Ci0JcmV0dXJuKHN0cmNtcCgqKGNoYXIgKiopcCwgKihjaGFyICoqKXEpKTsKLX0KLQotc3RhdGljIGludAotZ2xvYjEoQ2hhciAqcGF0dGVybiwgQ2hhciAqcGF0dGVybl9sYXN0LCBnbG9iX3QgKnBnbG9iLCBzdHJ1Y3QgZ2xvYl9saW0gKmxpbWl0cCkKLXsKLQlDaGFyIHBhdGhidWZbTUFYUEFUSExFTl07Ci0KLQkvKiBBIG51bGwgcGF0aG5hbWUgaXMgaW52YWxpZCAtLSBQT1NJWCAxMDAzLjEgc2VjdC4gMi40LiAqLwotCWlmICgqcGF0dGVybiA9PSBFT1MpCi0JCXJldHVybigwKTsKLQlyZXR1cm4oZ2xvYjIocGF0aGJ1ZiwgcGF0aGJ1ZitNQVhQQVRITEVOLTEsCi0JICAgIHBhdGhidWYsIHBhdGhidWYrTUFYUEFUSExFTi0xLAotCSAgICBwYXR0ZXJuLCBwYXR0ZXJuX2xhc3QsIHBnbG9iLCBsaW1pdHApKTsKLX0KLQotLyoKLSAqIFRoZSBmdW5jdGlvbnMgZ2xvYjIgYW5kIGdsb2IzIGFyZSBtdXR1YWxseSByZWN1cnNpdmU7IHRoZXJlIGlzIG9uZSBsZXZlbAotICogb2YgcmVjdXJzaW9uIGZvciBlYWNoIHNlZ21lbnQgaW4gdGhlIHBhdHRlcm4gdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZQotICogbWV0YSBjaGFyYWN0ZXJzLgotICovCi1zdGF0aWMgaW50Ci1nbG9iMihDaGFyICpwYXRoYnVmLCBDaGFyICpwYXRoYnVmX2xhc3QsIENoYXIgKnBhdGhlbmQsIENoYXIgKnBhdGhlbmRfbGFzdCwKLSAgICBDaGFyICpwYXR0ZXJuLCBDaGFyICpwYXR0ZXJuX2xhc3QsIGdsb2JfdCAqcGdsb2IsIHN0cnVjdCBnbG9iX2xpbSAqbGltaXRwKQotewotCXN0cnVjdCBzdGF0IHNiOwotCUNoYXIgKnAsICpxOwotCWludCBhbnltZXRhOwotCi0JLyoKLQkgKiBMb29wIG92ZXIgcGF0dGVybiBzZWdtZW50cyB1bnRpbCBlbmQgb2YgcGF0dGVybiBvciB1bnRpbAotCSAqIHNlZ21lbnQgd2l0aCBtZXRhIGNoYXJhY3RlciBmb3VuZC4KLQkgKi8KLQlmb3IgKGFueW1ldGEgPSAwOzspIHsKLQkJaWYgKCpwYXR0ZXJuID09IEVPUykgewkJLyogRW5kIG9mIHBhdHRlcm4/ICovCi0JCQkqcGF0aGVuZCA9IEVPUzsKLQkJCWlmIChnX2xzdGF0KHBhdGhidWYsICZzYiwgcGdsb2IpKQotCQkJCXJldHVybigwKTsKLQotCQkJaWYgKChwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX0xJTUlUKSAmJgotCQkJICAgIGxpbWl0cC0+Z2xpbV9zdGF0KysgPj0gR0xPQl9MSU1JVF9TVEFUKSB7Ci0JCQkJZXJybm8gPSAwOwotCQkJCSpwYXRoZW5kKysgPSBTRVA7Ci0JCQkJKnBhdGhlbmQgPSBFT1M7Ci0JCQkJcmV0dXJuKEdMT0JfTk9TUEFDRSk7Ci0JCQl9Ci0KLQkJCWlmICgoKHBnbG9iLT5nbF9mbGFncyAmIEdMT0JfTUFSSykgJiYKLQkJCSAgICBwYXRoZW5kWy0xXSAhPSBTRVApICYmIChTX0lTRElSKHNiLnN0X21vZGUpIHx8Ci0JCQkgICAgKFNfSVNMTksoc2Iuc3RfbW9kZSkgJiYKLQkJCSAgICAoZ19zdGF0KHBhdGhidWYsICZzYiwgcGdsb2IpID09IDApICYmCi0JCQkgICAgU19JU0RJUihzYi5zdF9tb2RlKSkpKSB7Ci0JCQkJaWYgKHBhdGhlbmQrMSA+IHBhdGhlbmRfbGFzdCkKLQkJCQkJcmV0dXJuICgxKTsKLQkJCQkqcGF0aGVuZCsrID0gU0VQOwotCQkJCSpwYXRoZW5kID0gRU9TOwotCQkJfQotCQkJKytwZ2xvYi0+Z2xfbWF0Y2hjOwotCQkJcmV0dXJuKGdsb2JleHRlbmQocGF0aGJ1ZiwgcGdsb2IsIGxpbWl0cCwgJnNiKSk7Ci0JCX0KLQotCQkvKiBGaW5kIGVuZCBvZiBuZXh0IHNlZ21lbnQsIGNvcHkgdGVudGF0aXZlbHkgdG8gcGF0aGVuZC4gKi8KLQkJcSA9IHBhdGhlbmQ7Ci0JCXAgPSBwYXR0ZXJuOwotCQl3aGlsZSAoKnAgIT0gRU9TICYmICpwICE9IFNFUCkgewotCQkJaWYgKGlzbWV0YSgqcCkpCi0JCQkJYW55bWV0YSA9IDE7Ci0JCQlpZiAocSsxID4gcGF0aGVuZF9sYXN0KQotCQkJCXJldHVybiAoMSk7Ci0JCQkqcSsrID0gKnArKzsKLQkJfQotCi0JCWlmICghYW55bWV0YSkgewkJLyogTm8gZXhwYW5zaW9uLCBkbyBuZXh0IHNlZ21lbnQuICovCi0JCQlwYXRoZW5kID0gcTsKLQkJCXBhdHRlcm4gPSBwOwotCQkJd2hpbGUgKCpwYXR0ZXJuID09IFNFUCkgewotCQkJCWlmIChwYXRoZW5kKzEgPiBwYXRoZW5kX2xhc3QpCi0JCQkJCXJldHVybiAoMSk7Ci0JCQkJKnBhdGhlbmQrKyA9ICpwYXR0ZXJuKys7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJLyogTmVlZCBleHBhbnNpb24sIHJlY3Vyc2UuICovCi0JCQlyZXR1cm4oZ2xvYjMocGF0aGJ1ZiwgcGF0aGJ1Zl9sYXN0LCBwYXRoZW5kLAotCQkJICAgIHBhdGhlbmRfbGFzdCwgcGF0dGVybiwgcCwgcGF0dGVybl9sYXN0LAotCQkJICAgIHBnbG9iLCBsaW1pdHApKTsKLQl9Ci0JLyogTk9UUkVBQ0hFRCAqLwotfQotCi1zdGF0aWMgaW50Ci1nbG9iMyhDaGFyICpwYXRoYnVmLCBDaGFyICpwYXRoYnVmX2xhc3QsIENoYXIgKnBhdGhlbmQsIENoYXIgKnBhdGhlbmRfbGFzdCwKLSAgICBDaGFyICpwYXR0ZXJuLCBDaGFyICpyZXN0cGF0dGVybiwgQ2hhciAqcmVzdHBhdHRlcm5fbGFzdCwgZ2xvYl90ICpwZ2xvYiwKLSAgICBzdHJ1Y3QgZ2xvYl9saW0gKmxpbWl0cCkKLXsKLQlzdHJ1Y3QgZGlyZW50ICpkcDsKLQlESVIgKmRpcnA7Ci0JaW50IGVycjsKLQljaGFyIGJ1ZltNQVhQQVRITEVOXTsKLQotCS8qCi0JICogVGhlIHJlYWRkaXJmdW5jIGRlY2xhcmF0aW9uIGNhbid0IGJlIHByb3RvdHlwZWQsIGJlY2F1c2UgaXQgaXMKLQkgKiBhc3NpZ25lZCwgYmVsb3csIHRvIHR3byBmdW5jdGlvbnMgd2hpY2ggYXJlIHByb3RvdHlwZWQgaW4gZ2xvYi5oCi0JICogYW5kIGRpcmVudC5oIGFzIHRha2luZyBwb2ludGVycyB0byBkaWZmZXJlbnRseSB0eXBlZCBvcGFxdWUKLQkgKiBzdHJ1Y3R1cmVzLgotCSAqLwotCXN0cnVjdCBkaXJlbnQgKigqcmVhZGRpcmZ1bmMpKHZvaWQgKik7Ci0KLQlpZiAocGF0aGVuZCA+IHBhdGhlbmRfbGFzdCkKLQkJcmV0dXJuICgxKTsKLQkqcGF0aGVuZCA9IEVPUzsKLQllcnJubyA9IDA7Ci0KLQlpZiAoKGRpcnAgPSBnX29wZW5kaXIocGF0aGJ1ZiwgcGdsb2IpKSA9PSBOVUxMKSB7Ci0JCS8qIFRPRE86IGRvbid0IGNhbGwgZm9yIEVOT0VOVCBvciBFTk9URElSPyAqLwotCQlpZiAocGdsb2ItPmdsX2VycmZ1bmMpIHsKLQkJCWlmIChnX0N0b2MocGF0aGJ1ZiwgYnVmLCBzaXplb2YoYnVmKSkpCi0JCQkJcmV0dXJuKEdMT0JfQUJPUlRFRCk7Ci0JCQlpZiAocGdsb2ItPmdsX2VycmZ1bmMoYnVmLCBlcnJubykgfHwKLQkJCSAgICBwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX0VSUikKLQkJCQlyZXR1cm4oR0xPQl9BQk9SVEVEKTsKLQkJfQotCQlyZXR1cm4oMCk7Ci0JfQotCi0JZXJyID0gMDsKLQotCS8qIFNlYXJjaCBkaXJlY3RvcnkgZm9yIG1hdGNoaW5nIG5hbWVzLiAqLwotCWlmIChwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX0FMVERJUkZVTkMpCi0JCXJlYWRkaXJmdW5jID0gcGdsb2ItPmdsX3JlYWRkaXI7Ci0JZWxzZQotCQlyZWFkZGlyZnVuYyA9IChzdHJ1Y3QgZGlyZW50ICooKikodm9pZCAqKSlyZWFkZGlyOwotCXdoaWxlICgoZHAgPSAoKnJlYWRkaXJmdW5jKShkaXJwKSkpIHsKLQkJdV9jaGFyICpzYzsKLQkJQ2hhciAqZGM7Ci0KLQkJaWYgKChwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX0xJTUlUKSAmJgotCQkgICAgbGltaXRwLT5nbGltX3JlYWRkaXIrKyA+PSBHTE9CX0xJTUlUX1JFQURESVIpIHsKLQkJCWVycm5vID0gMDsKLQkJCSpwYXRoZW5kKysgPSBTRVA7Ci0JCQkqcGF0aGVuZCA9IEVPUzsKLQkJCXJldHVybihHTE9CX05PU1BBQ0UpOwotCQl9Ci0KLQkJLyogSW5pdGlhbCBET1QgbXVzdCBiZSBtYXRjaGVkIGxpdGVyYWxseS4gKi8KLQkJaWYgKGRwLT5kX25hbWVbMF0gPT0gRE9UICYmICpwYXR0ZXJuICE9IERPVCkKLQkJCWNvbnRpbnVlOwotCQlkYyA9IHBhdGhlbmQ7Ci0JCXNjID0gKHVfY2hhciAqKSBkcC0+ZF9uYW1lOwotCQl3aGlsZSAoZGMgPCBwYXRoZW5kX2xhc3QgJiYgKCpkYysrID0gKnNjKyspICE9IEVPUykKLQkJCTsKLQkJaWYgKGRjID49IHBhdGhlbmRfbGFzdCkgewotCQkJKmRjID0gRU9TOwotCQkJZXJyID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKCFtYXRjaChwYXRoZW5kLCBwYXR0ZXJuLCByZXN0cGF0dGVybikpIHsKLQkJCSpwYXRoZW5kID0gRU9TOwotCQkJY29udGludWU7Ci0JCX0KLQkJZXJyID0gZ2xvYjIocGF0aGJ1ZiwgcGF0aGJ1Zl9sYXN0LCAtLWRjLCBwYXRoZW5kX2xhc3QsCi0JCSAgICByZXN0cGF0dGVybiwgcmVzdHBhdHRlcm5fbGFzdCwgcGdsb2IsIGxpbWl0cCk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAocGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9BTFRESVJGVU5DKQotCQkoKnBnbG9iLT5nbF9jbG9zZWRpcikoZGlycCk7Ci0JZWxzZQotCQljbG9zZWRpcihkaXJwKTsKLQlyZXR1cm4oZXJyKTsKLX0KLQotCi0vKgotICogRXh0ZW5kIHRoZSBnbF9wYXRodiBtZW1iZXIgb2YgYSBnbG9iX3Qgc3RydWN0dXJlIHRvIGFjY29tbW9kYXRlIGEgbmV3IGl0ZW0sCi0gKiBhZGQgdGhlIG5ldyBpdGVtLCBhbmQgdXBkYXRlIGdsX3BhdGhjLgotICoKLSAqIFRoaXMgYXNzdW1lcyB0aGUgQlNEIHJlYWxsb2MsIHdoaWNoIG9ubHkgY29waWVzIHRoZSBibG9jayB3aGVuIGl0cyBzaXplCi0gKiBjcm9zc2VzIGEgcG93ZXItb2YtdHdvIGJvdW5kYXJ5OyBmb3IgdjcgcmVhbGxvYywgdGhpcyB3b3VsZCBjYXVzZSBxdWFkcmF0aWMKLSAqIGJlaGF2aW9yLgotICoKLSAqIFJldHVybiAwIGlmIG5ldyBpdGVtIGFkZGVkLCBlcnJvciBjb2RlIGlmIG1lbW9yeSBjb3VsZG4ndCBiZSBhbGxvY2F0ZWQuCi0gKgotICogSW52YXJpYW50IG9mIHRoZSBnbG9iX3Qgc3RydWN0dXJlOgotICoJRWl0aGVyIGdsX3BhdGhjIGlzIHplcm8gYW5kIGdsX3BhdGh2IGlzIE5VTEw7IG9yIGdsX3BhdGhjID4gMCBhbmQKLSAqCWdsX3BhdGh2IHBvaW50cyB0byAoZ2xfb2ZmcyArIGdsX3BhdGhjICsgMSkgaXRlbXMuCi0gKi8KLXN0YXRpYyBpbnQKLWdsb2JleHRlbmQoY29uc3QgQ2hhciAqcGF0aCwgZ2xvYl90ICpwZ2xvYiwgc3RydWN0IGdsb2JfbGltICpsaW1pdHAsCi0gICAgc3RydWN0IHN0YXQgKnNiKQotewotCWNoYXIgKipwYXRodjsKLQlzc2l6ZV90IGk7Ci0Jc2l6ZV90IG5ld24sIGxlbjsKLQljaGFyICpjb3B5ID0gTlVMTDsKLQljb25zdCBDaGFyICpwOwotCXN0cnVjdCBzdGF0ICoqc3RhdHY7Ci0KLQluZXduID0gMiArIHBnbG9iLT5nbF9wYXRoYyArIHBnbG9iLT5nbF9vZmZzOwotCWlmIChwZ2xvYi0+Z2xfb2ZmcyA+PSBJTlRfTUFYIHx8Ci0JICAgIHBnbG9iLT5nbF9wYXRoYyA+PSBJTlRfTUFYIHx8Ci0JICAgIG5ld24gPj0gSU5UX01BWCB8fAotCSAgICBTSVpFX01BWCAvIHNpemVvZigqcGF0aHYpIDw9IG5ld24gfHwKLQkgICAgU0laRV9NQVggLyBzaXplb2YoKnN0YXR2KSA8PSBuZXduKSB7Ci0gbm9zcGFjZToKLQkJZm9yIChpID0gcGdsb2ItPmdsX29mZnM7IGkgPCAoc3NpemVfdCkobmV3biAtIDIpOyBpKyspIHsKLQkJCWlmIChwZ2xvYi0+Z2xfcGF0aHYgJiYgcGdsb2ItPmdsX3BhdGh2W2ldKQotCQkJCWZyZWUocGdsb2ItPmdsX3BhdGh2W2ldKTsKLQkJCWlmICgocGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9LRUVQU1RBVCkgIT0gMCAmJgotCQkJICAgIHBnbG9iLT5nbF9wYXRodiAmJiBwZ2xvYi0+Z2xfcGF0aHZbaV0pCi0JCQkJZnJlZShwZ2xvYi0+Z2xfc3RhdHZbaV0pOwotCQl9Ci0JCWlmIChwZ2xvYi0+Z2xfcGF0aHYpIHsKLQkJCWZyZWUocGdsb2ItPmdsX3BhdGh2KTsKLQkJCXBnbG9iLT5nbF9wYXRodiA9IE5VTEw7Ci0JCX0KLQkJaWYgKHBnbG9iLT5nbF9zdGF0dikgewotCQkJZnJlZShwZ2xvYi0+Z2xfc3RhdHYpOwotCQkJcGdsb2ItPmdsX3N0YXR2ID0gTlVMTDsKLQkJfQotCQlyZXR1cm4oR0xPQl9OT1NQQUNFKTsKLQl9Ci0KLQlwYXRodiA9IHJlYWxsb2MocGdsb2ItPmdsX3BhdGh2LCBuZXduICogc2l6ZW9mKCpwYXRodikpOwotCWlmIChwYXRodiA9PSBOVUxMKQotCQlnb3RvIG5vc3BhY2U7Ci0JaWYgKHBnbG9iLT5nbF9wYXRodiA9PSBOVUxMICYmIHBnbG9iLT5nbF9vZmZzID4gMCkgewotCQkvKiBmaXJzdCB0aW1lIGFyb3VuZCAtLSBjbGVhciBpbml0aWFsIGdsX29mZnMgaXRlbXMgKi8KLQkJcGF0aHYgKz0gcGdsb2ItPmdsX29mZnM7Ci0JCWZvciAoaSA9IHBnbG9iLT5nbF9vZmZzOyAtLWkgPj0gMDsgKQotCQkJKi0tcGF0aHYgPSBOVUxMOwotCX0KLQlwZ2xvYi0+Z2xfcGF0aHYgPSBwYXRodjsKLQotCWlmICgocGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9LRUVQU1RBVCkgIT0gMCkgewotCQlzdGF0diA9IHJlYWxsb2MocGdsb2ItPmdsX3N0YXR2LCBuZXduICogc2l6ZW9mKCpzdGF0dikpOwotCQlpZiAoc3RhdHYgPT0gTlVMTCkKLQkJCWdvdG8gbm9zcGFjZTsKLQkJaWYgKHBnbG9iLT5nbF9zdGF0diA9PSBOVUxMICYmIHBnbG9iLT5nbF9vZmZzID4gMCkgewotCQkJLyogZmlyc3QgdGltZSBhcm91bmQgLS0gY2xlYXIgaW5pdGlhbCBnbF9vZmZzIGl0ZW1zICovCi0JCQlzdGF0diArPSBwZ2xvYi0+Z2xfb2ZmczsKLQkJCWZvciAoaSA9IHBnbG9iLT5nbF9vZmZzOyAtLWkgPj0gMDsgKQotCQkJCSotLXN0YXR2ID0gTlVMTDsKLQkJfQotCQlwZ2xvYi0+Z2xfc3RhdHYgPSBzdGF0djsKLQkJaWYgKHNiID09IE5VTEwpCi0JCQlzdGF0dltwZ2xvYi0+Z2xfb2ZmcyArIHBnbG9iLT5nbF9wYXRoY10gPSBOVUxMOwotCQllbHNlIHsKLQkJCWxpbWl0cC0+Z2xpbV9tYWxsb2MgKz0gc2l6ZW9mKCoqc3RhdHYpOwotCQkJaWYgKChwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX0xJTUlUKSAmJgotCQkJICAgIGxpbWl0cC0+Z2xpbV9tYWxsb2MgPj0gR0xPQl9MSU1JVF9NQUxMT0MpIHsKLQkJCQllcnJubyA9IDA7Ci0JCQkJcmV0dXJuKEdMT0JfTk9TUEFDRSk7Ci0JCQl9Ci0JCQlpZiAoKHN0YXR2W3BnbG9iLT5nbF9vZmZzICsgcGdsb2ItPmdsX3BhdGhjXSA9Ci0JCQkgICAgbWFsbG9jKHNpemVvZigqKnN0YXR2KSkpID09IE5VTEwpCi0JCQkJZ290byBjb3B5X2Vycm9yOwotCQkJbWVtY3B5KHN0YXR2W3BnbG9iLT5nbF9vZmZzICsgcGdsb2ItPmdsX3BhdGhjXSwgc2IsCi0JCQkgICAgc2l6ZW9mKCpzYikpOwotCQl9Ci0JCXN0YXR2W3BnbG9iLT5nbF9vZmZzICsgcGdsb2ItPmdsX3BhdGhjICsgMV0gPSBOVUxMOwotCX0KLQotCWZvciAocCA9IHBhdGg7ICpwKys7KQotCQk7Ci0JbGVuID0gKHNpemVfdCkocCAtIHBhdGgpOwotCWxpbWl0cC0+Z2xpbV9tYWxsb2MgKz0gbGVuOwotCWlmICgoY29weSA9IG1hbGxvYyhsZW4pKSAhPSBOVUxMKSB7Ci0JCWlmIChnX0N0b2MocGF0aCwgY29weSwgbGVuKSkgewotCQkJZnJlZShjb3B5KTsKLQkJCXJldHVybihHTE9CX05PU1BBQ0UpOwotCQl9Ci0JCXBhdGh2W3BnbG9iLT5nbF9vZmZzICsgcGdsb2ItPmdsX3BhdGhjKytdID0gY29weTsKLQl9Ci0JcGF0aHZbcGdsb2ItPmdsX29mZnMgKyBwZ2xvYi0+Z2xfcGF0aGNdID0gTlVMTDsKLQotCWlmICgocGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9MSU1JVCkgJiYKLQkgICAgKG5ld24gKiBzaXplb2YoKnBhdGh2KSkgKyBsaW1pdHAtPmdsaW1fbWFsbG9jID4KLQkgICAgR0xPQl9MSU1JVF9NQUxMT0MpIHsKLQkJZXJybm8gPSAwOwotCQlyZXR1cm4oR0xPQl9OT1NQQUNFKTsKLQl9Ci0gY29weV9lcnJvcjoKLQlyZXR1cm4oY29weSA9PSBOVUxMID8gR0xPQl9OT1NQQUNFIDogMCk7Ci19Ci0KLQotLyoKLSAqIHBhdHRlcm4gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIGZpbGVuYW1lcy4gIEVhY2ggb2NjdXJyZW5jZSBvZiB0aGUgKgotICogcGF0dGVybiBjYXVzZXMgYSByZWN1cnNpb24gbGV2ZWwuCi0gKi8KLXN0YXRpYyBpbnQKLW1hdGNoKENoYXIgKm5hbWUsIENoYXIgKnBhdCwgQ2hhciAqcGF0ZW5kKQotewotCWludCBvaywgbmVnYXRlX3JhbmdlOwotCUNoYXIgYywgazsKLQotCXdoaWxlIChwYXQgPCBwYXRlbmQpIHsKLQkJYyA9ICpwYXQrKzsKLQkJc3dpdGNoIChjICYgTV9NQVNLKSB7Ci0JCWNhc2UgTV9BTEw6Ci0JCQlpZiAocGF0ID09IHBhdGVuZCkKLQkJCQlyZXR1cm4oMSk7Ci0JCQlkbyB7Ci0JCQkgICAgaWYgKG1hdGNoKG5hbWUsIHBhdCwgcGF0ZW5kKSkKLQkJCQkgICAgcmV0dXJuKDEpOwotCQkJfSB3aGlsZSAoKm5hbWUrKyAhPSBFT1MpOwotCQkJcmV0dXJuKDApOwotCQljYXNlIE1fT05FOgotCQkJaWYgKCpuYW1lKysgPT0gRU9TKQotCQkJCXJldHVybigwKTsKLQkJCWJyZWFrOwotCQljYXNlIE1fU0VUOgotCQkJb2sgPSAwOwotCQkJaWYgKChrID0gKm5hbWUrKykgPT0gRU9TKQotCQkJCXJldHVybigwKTsKLQkJCWlmICgobmVnYXRlX3JhbmdlID0gKCgqcGF0ICYgTV9NQVNLKSA9PSBNX05PVCkpICE9IEVPUykKLQkJCQkrK3BhdDsKLQkJCXdoaWxlICgoKGMgPSAqcGF0KyspICYgTV9NQVNLKSAhPSBNX0VORCkgewotCQkJCWlmICgoYyAmIE1fTUFTSykgPT0gTV9DTEFTUykgewotCQkJCQlDaGFyIGlkeCA9ICpwYXQgJiBNX01BU0s7Ci0JCQkJCWlmIChpZHggPCBOQ0NMQVNTRVMgJiYKLQkJCQkJICAgIGNjbGFzc2VzW2lkeF0uaXNjdHlwZShrKSkKLQkJCQkJCW9rID0gMTsKLQkJCQkJKytwYXQ7Ci0JCQkJfQotCQkJCWlmICgoKnBhdCAmIE1fTUFTSykgPT0gTV9STkcpIHsKLQkJCQkJaWYgKGMgPD0gayAmJiBrIDw9IHBhdFsxXSkKLQkJCQkJCW9rID0gMTsKLQkJCQkJcGF0ICs9IDI7Ci0JCQkJfSBlbHNlIGlmIChjID09IGspCi0JCQkJCW9rID0gMTsKLQkJCX0KLQkJCWlmIChvayA9PSBuZWdhdGVfcmFuZ2UpCi0JCQkJcmV0dXJuKDApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoKm5hbWUrKyAhPSBjKQotCQkJCXJldHVybigwKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybigqbmFtZSA9PSBFT1MpOwotfQotCi0vKiBGcmVlIGFsbG9jYXRlZCBkYXRhIGJlbG9uZ2luZyB0byBhIGdsb2JfdCBzdHJ1Y3R1cmUuICovCi12b2lkCi1nbG9iZnJlZShnbG9iX3QgKnBnbG9iKQotewotCWludCBpOwotCWNoYXIgKipwcDsKLQotCWlmIChwZ2xvYi0+Z2xfcGF0aHYgIT0gTlVMTCkgewotCQlwcCA9IHBnbG9iLT5nbF9wYXRodiArIHBnbG9iLT5nbF9vZmZzOwotCQlmb3IgKGkgPSBwZ2xvYi0+Z2xfcGF0aGM7IGktLTsgKytwcCkKLQkJCWlmICgqcHApCi0JCQkJZnJlZSgqcHApOwotCQlmcmVlKHBnbG9iLT5nbF9wYXRodik7Ci0JCXBnbG9iLT5nbF9wYXRodiA9IE5VTEw7Ci0JfQotCWlmIChwZ2xvYi0+Z2xfc3RhdHYgIT0gTlVMTCkgewotCQlmb3IgKGkgPSAwOyBpIDwgcGdsb2ItPmdsX3BhdGhjOyBpKyspIHsKLQkJCWlmIChwZ2xvYi0+Z2xfc3RhdHZbaV0gIT0gTlVMTCkKLQkJCQlmcmVlKHBnbG9iLT5nbF9zdGF0dltpXSk7Ci0JCX0KLQkJZnJlZShwZ2xvYi0+Z2xfc3RhdHYpOwotCQlwZ2xvYi0+Z2xfc3RhdHYgPSBOVUxMOwotCX0KLX0KLQotc3RhdGljIERJUiAqCi1nX29wZW5kaXIoQ2hhciAqc3RyLCBnbG9iX3QgKnBnbG9iKQotewotCWNoYXIgYnVmW01BWFBBVEhMRU5dOwotCi0JaWYgKCEqc3RyKQotCQlzdHJsY3B5KGJ1ZiwgIi4iLCBzaXplb2YgYnVmKTsKLQllbHNlIHsKLQkJaWYgKGdfQ3RvYyhzdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQotCQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCWlmIChwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX0FMVERJUkZVTkMpCi0JCXJldHVybigoKnBnbG9iLT5nbF9vcGVuZGlyKShidWYpKTsKLQotCXJldHVybihvcGVuZGlyKGJ1ZikpOwotfQotCi1zdGF0aWMgaW50Ci1nX2xzdGF0KENoYXIgKmZuLCBzdHJ1Y3Qgc3RhdCAqc2IsIGdsb2JfdCAqcGdsb2IpCi17Ci0JY2hhciBidWZbTUFYUEFUSExFTl07Ci0KLQlpZiAoZ19DdG9jKGZuLCBidWYsIHNpemVvZihidWYpKSkKLQkJcmV0dXJuKC0xKTsKLQlpZiAocGdsb2ItPmdsX2ZsYWdzICYgR0xPQl9BTFRESVJGVU5DKQotCQlyZXR1cm4oKCpwZ2xvYi0+Z2xfbHN0YXQpKGJ1Ziwgc2IpKTsKLQlyZXR1cm4obHN0YXQoYnVmLCBzYikpOwotfQotCi1zdGF0aWMgaW50Ci1nX3N0YXQoQ2hhciAqZm4sIHN0cnVjdCBzdGF0ICpzYiwgZ2xvYl90ICpwZ2xvYikKLXsKLQljaGFyIGJ1ZltNQVhQQVRITEVOXTsKLQotCWlmIChnX0N0b2MoZm4sIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQotCQlyZXR1cm4oLTEpOwotCWlmIChwZ2xvYi0+Z2xfZmxhZ3MgJiBHTE9CX0FMVERJUkZVTkMpCi0JCXJldHVybigoKnBnbG9iLT5nbF9zdGF0KShidWYsIHNiKSk7Ci0JcmV0dXJuKHN0YXQoYnVmLCBzYikpOwotfQotCi1zdGF0aWMgQ2hhciAqCi1nX3N0cmNocihjb25zdCBDaGFyICpzdHIsIGludCBjaCkKLXsKLQlkbyB7Ci0JCWlmICgqc3RyID09IGNoKQotCQkJcmV0dXJuICgoQ2hhciAqKXN0cik7Ci0JfSB3aGlsZSAoKnN0cisrKTsKLQlyZXR1cm4gKE5VTEwpOwotfQotCi1zdGF0aWMgaW50Ci1nX0N0b2MoY29uc3QgQ2hhciAqc3RyLCBjaGFyICpidWYsIHVfaW50IGxlbikKLXsKLQotCXdoaWxlIChsZW4tLSkgewotCQlpZiAoKCpidWYrKyA9ICpzdHIrKykgPT0gRU9TKQotCQkJcmV0dXJuICgwKTsKLQl9Ci0JcmV0dXJuICgxKTsKLX0KLQotI2lmZGVmIERFQlVHCi1zdGF0aWMgdm9pZAotcXByaW50Zihjb25zdCBjaGFyICpzdHIsIENoYXIgKnMpCi17Ci0JQ2hhciAqcDsKLQotCSh2b2lkKXByaW50ZigiJXM6XG4iLCBzdHIpOwotCWZvciAocCA9IHM7ICpwOyBwKyspCi0JCSh2b2lkKXByaW50ZigiJWMiLCBDSEFSKCpwKSk7Ci0JKHZvaWQpcHJpbnRmKCJcbiIpOwotCWZvciAocCA9IHM7ICpwOyBwKyspCi0JCSh2b2lkKXByaW50ZigiJWMiLCAqcCAmIE1fUFJPVEVDVCA/ICciJyA6ICcgJyk7Ci0JKHZvaWQpcHJpbnRmKCJcbiIpOwotCWZvciAocCA9IHM7ICpwOyBwKyspCi0JCSh2b2lkKXByaW50ZigiJWMiLCBpc21ldGEoKnApID8gJ18nIDogJyAnKTsKLQkodm9pZClwcmludGYoIlxuIik7Ci19Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfR0xPQikgfHwgIWRlZmluZWQoR0xPQl9IQVNfQUxURElSRlVOQykgfHwKLSAgICAgICAgICAhZGVmaW5lZChHTE9CX0hBU19HTF9NQVRDSEMpIHx8ICFkZWZpbmVkKEdMT0JfSEFTX0dMX1NUQVRWKSAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvZ2xvYi5oIGIvb3BlbmJzZC1jb21wYXQvZ2xvYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGE3ZmE1Li4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L2dsb2IuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgkkT3BlbkJTRDogZ2xvYi5oLHYgMS4xMSAyMDEwLzA5LzI0IDEzOjMyOjU1IGRqbSBFeHAgJAkqLwotLyoJJE5ldEJTRDogZ2xvYi5oLHYgMS41IDE5OTQvMTAvMjYgMDA6NTU6NTYgY2dkIEV4cCAkCSovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTMKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKLSAqIEd1aWRvIHZhbiBSb3NzdW0uCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqCUAoIylnbG9iLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogaW5jbHVkZS9nbG9iLmggKi8KLQotI2lmICFkZWZpbmVkKEhBVkVfR0xPQl9IKSB8fCAhZGVmaW5lZChHTE9CX0hBU19BTFRESVJGVU5DKSB8fCBcCi0gICAgIWRlZmluZWQoR0xPQl9IQVNfR0xfTUFUQ0hDKSB8fCAhZGVmaW5lZChHTE9CX0hBU19HTF9TVEFUVikgfHwgXAotICAgICFkZWZpbmVkKEhBVkVfREVDTF9HTE9CX05PTUFUQ0gpIHx8IEhBVkVfREVDTF9HTE9CX05PTUFUQ0ggPT0gMCB8fCBcCi0gICAgZGVmaW5lZChCUk9LRU5fR0xPQikKLQotI2lmbmRlZiBfR0xPQl9IXwotI2RlZmluZQlfR0xPQl9IXwotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotc3RydWN0IHN0YXQ7Ci10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IGdsX3BhdGhjOwkJLyogQ291bnQgb2YgdG90YWwgcGF0aHMgc28gZmFyLiAqLwotCWludCBnbF9tYXRjaGM7CQkvKiBDb3VudCBvZiBwYXRocyBtYXRjaGluZyBwYXR0ZXJuLiAqLwotCWludCBnbF9vZmZzOwkJLyogUmVzZXJ2ZWQgYXQgYmVnaW5uaW5nIG9mIGdsX3BhdGh2LiAqLwotCWludCBnbF9mbGFnczsJCS8qIENvcHkgb2YgZmxhZ3MgcGFyYW1ldGVyIHRvIGdsb2IuICovCi0JY2hhciAqKmdsX3BhdGh2OwkvKiBMaXN0IG9mIHBhdGhzIG1hdGNoaW5nIHBhdHRlcm4uICovCi0Jc3RydWN0IHN0YXQgKipnbF9zdGF0djsJLyogU3RhdCBlbnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gZ2xfcGF0aHYgKi8KLQkJCQkvKiBDb3B5IG9mIGVycmZ1bmMgcGFyYW1ldGVyIHRvIGdsb2IuICovCi0JaW50ICgqZ2xfZXJyZnVuYykoY29uc3QgY2hhciAqLCBpbnQpOwotCi0JLyoKLQkgKiBBbHRlcm5hdGUgZmlsZXN5c3RlbSBhY2Nlc3MgbWV0aG9kcyBmb3IgZ2xvYjsgcmVwbGFjZW1lbnQKLQkgKiB2ZXJzaW9ucyBvZiBjbG9zZWRpcigzKSwgcmVhZGRpcigzKSwgb3BlbmRpcigzKSwgc3RhdCgyKQotCSAqIGFuZCBsc3RhdCgyKS4KLQkgKi8KLQl2b2lkICgqZ2xfY2xvc2VkaXIpKHZvaWQgKik7Ci0Jc3RydWN0IGRpcmVudCAqKCpnbF9yZWFkZGlyKSh2b2lkICopOwkKLQl2b2lkICooKmdsX29wZW5kaXIpKGNvbnN0IGNoYXIgKik7Ci0JaW50ICgqZ2xfbHN0YXQpKGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKik7Ci0JaW50ICgqZ2xfc3RhdCkoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdCAqKTsKLX0gZ2xvYl90OwotCi0jZGVmaW5lCUdMT0JfQVBQRU5ECTB4MDAwMQkvKiBBcHBlbmQgdG8gb3V0cHV0IGZyb20gcHJldmlvdXMgY2FsbC4gKi8KLSNkZWZpbmUJR0xPQl9ET09GRlMJMHgwMDAyCS8qIFVzZSBnbF9vZmZzLiAqLwotI2RlZmluZQlHTE9CX0VSUgkweDAwMDQJLyogUmV0dXJuIG9uIGVycm9yLiAqLwotI2RlZmluZQlHTE9CX01BUksJMHgwMDA4CS8qIEFwcGVuZCAvIHRvIG1hdGNoaW5nIGRpcmVjdG9yaWVzLiAqLwotI2RlZmluZQlHTE9CX05PQ0hFQ0sJMHgwMDEwCS8qIFJldHVybiBwYXR0ZXJuIGl0c2VsZiBpZiBub3RoaW5nIG1hdGNoZXMuICovCi0jZGVmaW5lCUdMT0JfTk9TT1JUCTB4MDAyMAkvKiBEb24ndCBzb3J0LiAqLwotI2RlZmluZQlHTE9CX05PRVNDQVBFCTB4MTAwMAkvKiBEaXNhYmxlIGJhY2tzbGFzaCBlc2NhcGluZy4gKi8KLQotI2RlZmluZQlHTE9CX05PU1BBQ0UJKC0xKQkvKiBNYWxsb2MgY2FsbCBmYWlsZWQuICovCi0jZGVmaW5lCUdMT0JfQUJPUlRFRAkoLTIpCS8qIFVuaWdub3JlZCBlcnJvci4gKi8KLSNkZWZpbmUJR0xPQl9OT01BVENICSgtMykJLyogTm8gbWF0Y2ggYW5kIEdMT0JfTk9DSEVDSyBub3Qgc2V0LiAqLwotI2RlZmluZQlHTE9CX05PU1lTCSgtNCkJLyogRnVuY3Rpb24gbm90IHN1cHBvcnRlZC4gKi8KLQotI2RlZmluZQlHTE9CX0FMVERJUkZVTkMJMHgwMDQwCS8qIFVzZSBhbHRlcm5hdGVseSBzcGVjaWZpZWQgZGlyZWN0b3J5IGZ1bmNzLiAqLwotI2RlZmluZQlHTE9CX0JSQUNFCTB4MDA4MAkvKiBFeHBhbmQgYnJhY2VzIGFsYSBjc2guICovCi0jZGVmaW5lCUdMT0JfTUFHQ0hBUgkweDAxMDAJLyogUGF0dGVybiBoYWQgZ2xvYmJpbmcgY2hhcmFjdGVycy4gKi8KLSNkZWZpbmUJR0xPQl9OT01BR0lDCTB4MDIwMAkvKiBHTE9CX05PQ0hFQ0sgd2l0aG91dCBtYWdpYyBjaGFycyAoY3NoKS4gKi8KLSNkZWZpbmUJR0xPQl9RVU9URQkweDA0MDAJLyogUXVvdGUgc3BlY2lhbCBjaGFycyB3aXRoIFwuICovCi0jZGVmaW5lCUdMT0JfVElMREUJMHgwODAwCS8qIEV4cGFuZCB0aWxkZSBuYW1lcyBmcm9tIHRoZSBwYXNzd2QgZmlsZS4gKi8KLSNkZWZpbmUgR0xPQl9MSU1JVAkweDIwMDAJLyogTGltaXQgcGF0dGVybiBtYXRjaCBvdXRwdXQgdG8gQVJHX01BWCAqLwotI2RlZmluZQlHTE9CX0tFRVBTVEFUCTB4NDAwMAkvKiBSZXRhaW4gc3RhdCBkYXRhIGZvciBwYXRocyBpbiBnbF9zdGF0di4gKi8KLSNkZWZpbmUgR0xPQl9BQkVORAlHTE9CX0FCT1JURUQgLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotCi1pbnQJZ2xvYihjb25zdCBjaGFyICosIGludCwgaW50ICgqKShjb25zdCBjaGFyICosIGludCksIGdsb2JfdCAqKTsKLXZvaWQJZ2xvYmZyZWUoZ2xvYl90ICopOwotCi0jZW5kaWYgLyogIV9HTE9CX0hfICovCi0KLSNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX0dMT0JfSCkgfHwgIWRlZmluZWQoR0xPQl9IQVNfQUxURElSRlVOQykgIHx8Ci0JICAhZGVmaW5lZChHTE9CX0hBU19HTF9NQVRDSEMpIHx8ICFkZWZpbmVkKEdMT0hfSEFTX0dMX1NUQVRWKSAqLwotCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9pbmV0X2F0b24uYyBiL29wZW5ic2QtY29tcGF0L2luZXRfYXRvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzA1OTdlLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L2luZXRfYXRvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCSRPcGVuQlNEOiBpbmV0X2FkZHIuYyx2IDEuOSAyMDA1LzA4LzA2IDIwOjMwOjAzIGVzcGllIEV4cCAkCSovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTAsIDE5OTMKLSAqICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogLQotICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTkzIGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLgotICogCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0Ci0gKiB0aGUgbmFtZSBvZiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgotICogcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBkb2N1bWVudCBvciBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgRElHSVRBTCBFUVVJUE1FTlQgQ09SUC4gRElTQ0xBSU1TIEFMTAotICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiAgIElOIE5PIEVWRU5UIFNIQUxMIERJR0lUQUwgRVFVSVBNRU5UCi0gKiBDT1JQT1JBVElPTiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKLSAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCi0gKiBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLgotICogLQotICogLS1Db3B5cmlnaHQtLQotICovCi0KLS8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL25ldC9pbmV0X2FkZHIuYyAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmICFkZWZpbmVkKEhBVkVfSU5FVF9BVE9OKQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZiAwCi0vKgotICogQXNjaWkgaW50ZXJuZXQgYWRkcmVzcyBpbnRlcnByZXRhdGlvbiByb3V0aW5lLgotICogVGhlIHZhbHVlIHJldHVybmVkIGlzIGluIG5ldHdvcmsgb3JkZXIuCi0gKi8KLWluX2FkZHJfdAotaW5ldF9hZGRyKGNvbnN0IGNoYXIgKmNwKQotewotCXN0cnVjdCBpbl9hZGRyIHZhbDsKLQotCWlmIChpbmV0X2F0b24oY3AsICZ2YWwpKQotCQlyZXR1cm4gKHZhbC5zX2FkZHIpOwotCXJldHVybiAoSU5BRERSX05PTkUpOwotfQotI2VuZGlmCi0KLS8qIAotICogQ2hlY2sgd2hldGhlciAiY3AiIGlzIGEgdmFsaWQgYXNjaWkgcmVwcmVzZW50YXRpb24KLSAqIG9mIGFuIEludGVybmV0IGFkZHJlc3MgYW5kIGNvbnZlcnQgdG8gYSBiaW5hcnkgYWRkcmVzcy4KLSAqIFJldHVybnMgMSBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZCwgMCBpZiBub3QuCi0gKiBUaGlzIHJlcGxhY2VzIGluZXRfYWRkciwgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHdoaWNoCi0gKiBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBmYWlsdXJlIGFuZCBhIGxvY2FsIGJyb2FkY2FzdCBhZGRyZXNzLgotICovCi1pbnQKLWluZXRfYXRvbihjb25zdCBjaGFyICpjcCwgc3RydWN0IGluX2FkZHIgKmFkZHIpCi17Ci0JdV9pbnQzMl90IHZhbDsKLQlpbnQgYmFzZSwgbjsKLQljaGFyIGM7Ci0JdV9pbnQgcGFydHNbNF07Ci0JdV9pbnQgKnBwID0gcGFydHM7Ci0KLQljID0gKmNwOwotCWZvciAoOzspIHsKLQkJLyoKLQkJICogQ29sbGVjdCBudW1iZXIgdXAgdG8gYGAuJycuCi0JCSAqIFZhbHVlcyBhcmUgc3BlY2lmaWVkIGFzIGZvciBDOgotCQkgKiAweD1oZXgsIDA9b2N0YWwsIGlzZGlnaXQ9ZGVjaW1hbC4KLQkJICovCi0JCWlmICghaXNkaWdpdChjKSkKLQkJCXJldHVybiAoMCk7Ci0JCXZhbCA9IDA7IGJhc2UgPSAxMDsKLQkJaWYgKGMgPT0gJzAnKSB7Ci0JCQljID0gKisrY3A7Ci0JCQlpZiAoYyA9PSAneCcgfHwgYyA9PSAnWCcpCi0JCQkJYmFzZSA9IDE2LCBjID0gKisrY3A7Ci0JCQllbHNlCi0JCQkJYmFzZSA9IDg7Ci0JCX0KLQkJZm9yICg7OykgewotCQkJaWYgKGlzYXNjaWkoYykgJiYgaXNkaWdpdChjKSkgewotCQkJCXZhbCA9ICh2YWwgKiBiYXNlKSArIChjIC0gJzAnKTsKLQkJCQljID0gKisrY3A7Ci0JCQl9IGVsc2UgaWYgKGJhc2UgPT0gMTYgJiYgaXNhc2NpaShjKSAmJiBpc3hkaWdpdChjKSkgewotCQkJCXZhbCA9ICh2YWwgPDwgNCkgfAotCQkJCQkoYyArIDEwIC0gKGlzbG93ZXIoYykgPyAnYScgOiAnQScpKTsKLQkJCQljID0gKisrY3A7Ci0JCQl9IGVsc2UKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoYyA9PSAnLicpIHsKLQkJCS8qCi0JCQkgKiBJbnRlcm5ldCBmb3JtYXQ6Ci0JCQkgKglhLmIuYy5kCi0JCQkgKglhLmIuYwkod2l0aCBjIHRyZWF0ZWQgYXMgMTYgYml0cykKLQkJCSAqCWEuYgkod2l0aCBiIHRyZWF0ZWQgYXMgMjQgYml0cykKLQkJCSAqLwotCQkJaWYgKHBwID49IHBhcnRzICsgMykKLQkJCQlyZXR1cm4gKDApOwotCQkJKnBwKysgPSB2YWw7Ci0JCQljID0gKisrY3A7Ci0JCX0gZWxzZQotCQkJYnJlYWs7Ci0JfQotCS8qCi0JICogQ2hlY2sgZm9yIHRyYWlsaW5nIGNoYXJhY3RlcnMuCi0JICovCi0JaWYgKGMgIT0gJ1wwJyAmJiAoIWlzYXNjaWkoYykgfHwgIWlzc3BhY2UoYykpKQotCQlyZXR1cm4gKDApOwotCS8qCi0JICogQ29uY29jdCB0aGUgYWRkcmVzcyBhY2NvcmRpbmcgdG8KLQkgKiB0aGUgbnVtYmVyIG9mIHBhcnRzIHNwZWNpZmllZC4KLQkgKi8KLQluID0gcHAgLSBwYXJ0cyArIDE7Ci0Jc3dpdGNoIChuKSB7Ci0KLQljYXNlIDA6Ci0JCXJldHVybiAoMCk7CQkvKiBpbml0aWFsIG5vbmRpZ2l0ICovCi0KLQljYXNlIDE6CQkJCS8qIGEgLS0gMzIgYml0cyAqLwotCQlicmVhazsKLQotCWNhc2UgMjoJCQkJLyogYS5iIC0tIDguMjQgYml0cyAqLwotCQlpZiAoKHZhbCA+IDB4ZmZmZmZmKSB8fCAocGFydHNbMF0gPiAweGZmKSkKLQkJCXJldHVybiAoMCk7Ci0JCXZhbCB8PSBwYXJ0c1swXSA8PCAyNDsKLQkJYnJlYWs7Ci0KLQljYXNlIDM6CQkJCS8qIGEuYi5jIC0tIDguOC4xNiBiaXRzICovCi0JCWlmICgodmFsID4gMHhmZmZmKSB8fCAocGFydHNbMF0gPiAweGZmKSB8fCAocGFydHNbMV0gPiAweGZmKSkKLQkJCXJldHVybiAoMCk7Ci0JCXZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KTsKLQkJYnJlYWs7Ci0KLQljYXNlIDQ6CQkJCS8qIGEuYi5jLmQgLS0gOC44LjguOCBiaXRzICovCi0JCWlmICgodmFsID4gMHhmZikgfHwgKHBhcnRzWzBdID4gMHhmZikgfHwgKHBhcnRzWzFdID4gMHhmZikgfHwgKHBhcnRzWzJdID4gMHhmZikpCi0JCQlyZXR1cm4gKDApOwotCQl2YWwgfD0gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNikgfCAocGFydHNbMl0gPDwgOCk7Ci0JCWJyZWFrOwotCX0KLQlpZiAoYWRkcikKLQkJYWRkci0+c19hZGRyID0gaHRvbmwodmFsKTsKLQlyZXR1cm4gKDEpOwotfQotCi0jZW5kaWYgLyogIWRlZmluZWQoSEFWRV9JTkVUX0FUT04pICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9pbmV0X250b2EuYyBiL29wZW5ic2QtY29tcGF0L2luZXRfbnRvYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWI3YjNiLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L2luZXRfbnRvYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IGluZXRfbnRvYS5jLHYgMS42IDIwMDUvMDgvMDYgMjA6MzA6MDMgZXNwaWUgRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9uZXQvaW5ldF9udG9hLmMgKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpZiBkZWZpbmVkKEJST0tFTl9JTkVUX05UT0EpIHx8ICFkZWZpbmVkKEhBVkVfSU5FVF9OVE9BKQotCi0vKgotICogQ29udmVydCBuZXR3b3JrLWZvcm1hdCBpbnRlcm5ldCBhZGRyZXNzCi0gKiB0byBiYXNlIDI1NiBkLmQuZC5kIHJlcHJlc2VudGF0aW9uLgotICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWNoYXIgKgotaW5ldF9udG9hKHN0cnVjdCBpbl9hZGRyIGluKQotewotCXN0YXRpYyBjaGFyIGJbMThdOwotCWNoYXIgKnA7Ci0KLQlwID0gKGNoYXIgKikmaW47Ci0jZGVmaW5lCVVDKGIpCSgoKGludCliKSYweGZmKQotCSh2b2lkKXNucHJpbnRmKGIsIHNpemVvZihiKSwKLQkgICAgIiV1LiV1LiV1LiV1IiwgVUMocFswXSksIFVDKHBbMV0pLCBVQyhwWzJdKSwgVUMocFszXSkpOwotCXJldHVybiAoYik7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkKEJST0tFTl9JTkVUX05UT0EpIHx8ICFkZWZpbmVkKEhBVkVfSU5FVF9OVE9BKSAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvaW5ldF9udG9wLmMgYi9vcGVuYnNkLWNvbXBhdC9pbmV0X250b3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjYTRiNy4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9pbmV0X250b3AuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKgkkT3BlbkJTRDogaW5ldF9udG9wLmMsdiAxLjcgMjAwNS8wOC8wNiAyMDozMDowMyBlc3BpZSBFeHAgJAkqLwotCi0vKiBDb3B5cmlnaHQgKGMpIDE5OTYgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bS4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElOVEVSTkVUIFNPRlRXQVJFIENPTlNPUlRJVU0gRElTQ0xBSU1TCi0gKiBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIElOVEVSTkVUIFNPRlRXQVJFCi0gKiBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgotICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKLSAqIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwotICogU09GVFdBUkUuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvbmV0L2luZXRfbnRvcC5jICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZuZGVmIEhBVkVfSU5FVF9OVE9QCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPGFycGEvbmFtZXNlci5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmbmRlZiBJTjZBRERSU1oKLSNkZWZpbmUgSU42QUREUlNaICAgMTYgICAvKiBJUHY2IFRfQUFBQSAqLyAgICAgICAgICAgICAgICAgCi0jZW5kaWYKLQotI2lmbmRlZiBJTlQxNlNaCi0jZGVmaW5lIElOVDE2U1ogICAgIDIgICAgLyogZm9yIHN5c3RlbXMgd2l0aG91dCAxNi1iaXQgaW50cyAqLwotI2VuZGlmCi0KLS8qCi0gKiBXQVJOSU5HOiBEb24ndCBldmVuIGNvbnNpZGVyIHRyeWluZyB0byBjb21waWxlIHRoaXMgb24gYSBzeXN0ZW0gd2hlcmUKLSAqIHNpemVvZihpbnQpIDwgNC4gIHNpemVvZihpbnQpID4gNCBpcyBmaW5lOyBhbGwgdGhlIHdvcmxkJ3Mgbm90IGEgVkFYLgotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICppbmV0X250b3A0KGNvbnN0IHVfY2hhciAqc3JjLCBjaGFyICpkc3QsIHNpemVfdCBzaXplKTsKLXN0YXRpYyBjb25zdCBjaGFyICppbmV0X250b3A2KGNvbnN0IHVfY2hhciAqc3JjLCBjaGFyICpkc3QsIHNpemVfdCBzaXplKTsKLQotLyogY2hhciAqCi0gKiBpbmV0X250b3AoYWYsIHNyYywgZHN0LCBzaXplKQotICoJY29udmVydCBhIG5ldHdvcmsgZm9ybWF0IGFkZHJlc3MgdG8gcHJlc2VudGF0aW9uIGZvcm1hdC4KLSAqIHJldHVybjoKLSAqCXBvaW50ZXIgdG8gcHJlc2VudGF0aW9uIGZvcm1hdCBhZGRyZXNzIChgZHN0JyksIG9yIE5VTEwgKHNlZSBlcnJubykuCi0gKiBhdXRob3I6Ci0gKglQYXVsIFZpeGllLCAxOTk2LgotICovCi1jb25zdCBjaGFyICoKLWluZXRfbnRvcChpbnQgYWYsIGNvbnN0IHZvaWQgKnNyYywgY2hhciAqZHN0LCBzaXplX3Qgc2l6ZSkKLXsKLQlzd2l0Y2ggKGFmKSB7Ci0JY2FzZSBBRl9JTkVUOgotCQlyZXR1cm4gKGluZXRfbnRvcDQoc3JjLCBkc3QsIHNpemUpKTsKLQljYXNlIEFGX0lORVQ2OgotCQlyZXR1cm4gKGluZXRfbnRvcDYoc3JjLCBkc3QsIHNpemUpKTsKLQlkZWZhdWx0OgotCQllcnJubyA9IEVBRk5PU1VQUE9SVDsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JLyogTk9UUkVBQ0hFRCAqLwotfQotCi0vKiBjb25zdCBjaGFyICoKLSAqIGluZXRfbnRvcDQoc3JjLCBkc3QsIHNpemUpCi0gKglmb3JtYXQgYW4gSVB2NCBhZGRyZXNzLCBtb3JlIG9yIGxlc3MgbGlrZSBpbmV0X250b2EoKQotICogcmV0dXJuOgotICoJYGRzdCcgKGFzIGEgY29uc3QpCi0gKiBub3RlczoKLSAqCSgxKSB1c2VzIG5vIHN0YXRpY3MKLSAqCSgyKSB0YWtlcyBhIHVfY2hhciogbm90IGFuIGluX2FkZHIgYXMgaW5wdXQKLSAqIGF1dGhvcjoKLSAqCVBhdWwgVml4aWUsIDE5OTYuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLWluZXRfbnRvcDQoY29uc3QgdV9jaGFyICpzcmMsIGNoYXIgKmRzdCwgc2l6ZV90IHNpemUpCi17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgZm10W10gPSAiJXUuJXUuJXUuJXUiOwotCWNoYXIgdG1wW3NpemVvZiAiMjU1LjI1NS4yNTUuMjU1Il07Ci0JaW50IGw7Ci0KLQlsID0gc25wcmludGYodG1wLCBzaXplLCBmbXQsIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0sIHNyY1szXSk7Ci0JaWYgKGwgPD0gMCB8fCBsID49IHNpemUpIHsKLQkJZXJybm8gPSBFTk9TUEM7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCXN0cmxjcHkoZHN0LCB0bXAsIHNpemUpOwotCXJldHVybiAoZHN0KTsKLX0KLQotLyogY29uc3QgY2hhciAqCi0gKiBpbmV0X250b3A2KHNyYywgZHN0LCBzaXplKQotICoJY29udmVydCBJUHY2IGJpbmFyeSBhZGRyZXNzIGludG8gcHJlc2VudGF0aW9uIChwcmludGFibGUpIGZvcm1hdAotICogYXV0aG9yOgotICoJUGF1bCBWaXhpZSwgMTk5Ni4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotaW5ldF9udG9wNihjb25zdCB1X2NoYXIgKnNyYywgY2hhciAqZHN0LCBzaXplX3Qgc2l6ZSkKLXsKLQkvKgotCSAqIE5vdGUgdGhhdCBpbnQzMl90IGFuZCBpbnQxNl90IG5lZWQgb25seSBiZSAiYXQgbGVhc3QiIGxhcmdlIGVub3VnaAotCSAqIHRvIGNvbnRhaW4gYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHNpemUuICBPbiBzb21lIHN5c3RlbXMsIGxpa2UKLQkgKiBDcmF5cywgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBpbnRlZ2VyIHZhcmlhYmxlIHdpdGggMTYgYml0cy4KLQkgKiBLZWVwIHRoaXMgaW4gbWluZCBpZiB5b3UgdGhpbmsgdGhpcyBmdW5jdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGNvZGVkCi0JICogdG8gdXNlIHBvaW50ZXIgb3ZlcmxheXMuICBBbGwgdGhlIHdvcmxkJ3Mgbm90IGEgVkFYLgotCSAqLwotCWNoYXIgdG1wW3NpemVvZiAiZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6MjU1LjI1NS4yNTUuMjU1Il07Ci0JY2hhciAqdHAsICplcDsKLQlzdHJ1Y3QgeyBpbnQgYmFzZSwgbGVuOyB9IGJlc3QsIGN1cjsKLQl1X2ludCB3b3Jkc1tJTjZBRERSU1ogLyBJTlQxNlNaXTsKLQlpbnQgaTsKLQlpbnQgYWR2YW5jZTsKLQotCS8qCi0JICogUHJlcHJvY2VzczoKLQkgKglDb3B5IHRoZSBpbnB1dCAoYnl0ZXdpc2UpIGFycmF5IGludG8gYSB3b3Jkd2lzZSBhcnJheS4KLQkgKglGaW5kIHRoZSBsb25nZXN0IHJ1biBvZiAweDAwJ3MgaW4gc3JjW10gZm9yIDo6IHNob3J0aGFuZGluZy4KLQkgKi8KLQltZW1zZXQod29yZHMsICdcMCcsIHNpemVvZiB3b3Jkcyk7Ci0JZm9yIChpID0gMDsgaSA8IElONkFERFJTWjsgaSsrKQotCQl3b3Jkc1tpIC8gMl0gfD0gKHNyY1tpXSA8PCAoKDEgLSAoaSAlIDIpKSA8PCAzKSk7Ci0JYmVzdC5iYXNlID0gLTE7Ci0JY3VyLmJhc2UgPSAtMTsKLQlmb3IgKGkgPSAwOyBpIDwgKElONkFERFJTWiAvIElOVDE2U1opOyBpKyspIHsKLQkJaWYgKHdvcmRzW2ldID09IDApIHsKLQkJCWlmIChjdXIuYmFzZSA9PSAtMSkKLQkJCQljdXIuYmFzZSA9IGksIGN1ci5sZW4gPSAxOwotCQkJZWxzZQotCQkJCWN1ci5sZW4rKzsKLQkJfSBlbHNlIHsKLQkJCWlmIChjdXIuYmFzZSAhPSAtMSkgewotCQkJCWlmIChiZXN0LmJhc2UgPT0gLTEgfHwgY3VyLmxlbiA+IGJlc3QubGVuKQotCQkJCQliZXN0ID0gY3VyOwotCQkJCWN1ci5iYXNlID0gLTE7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGN1ci5iYXNlICE9IC0xKSB7Ci0JCWlmIChiZXN0LmJhc2UgPT0gLTEgfHwgY3VyLmxlbiA+IGJlc3QubGVuKQotCQkJYmVzdCA9IGN1cjsKLQl9Ci0JaWYgKGJlc3QuYmFzZSAhPSAtMSAmJiBiZXN0LmxlbiA8IDIpCi0JCWJlc3QuYmFzZSA9IC0xOwotCi0JLyoKLQkgKiBGb3JtYXQgdGhlIHJlc3VsdC4KLQkgKi8KLQl0cCA9IHRtcDsKLQllcCA9IHRtcCArIHNpemVvZih0bXApOwotCWZvciAoaSA9IDA7IGkgPCAoSU42QUREUlNaIC8gSU5UMTZTWikgJiYgdHAgPCBlcDsgaSsrKSB7Ci0JCS8qIEFyZSB3ZSBpbnNpZGUgdGhlIGJlc3QgcnVuIG9mIDB4MDAncz8gKi8KLQkJaWYgKGJlc3QuYmFzZSAhPSAtMSAmJiBpID49IGJlc3QuYmFzZSAmJgotCQkgICAgaSA8IChiZXN0LmJhc2UgKyBiZXN0LmxlbikpIHsKLQkJCWlmIChpID09IGJlc3QuYmFzZSkgewotCQkJCWlmICh0cCArIDEgPj0gZXApCi0JCQkJCXJldHVybiAoTlVMTCk7Ci0JCQkJKnRwKysgPSAnOic7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQkvKiBBcmUgd2UgZm9sbG93aW5nIGFuIGluaXRpYWwgcnVuIG9mIDB4MDBzIG9yIGFueSByZWFsIGhleD8gKi8KLQkJaWYgKGkgIT0gMCkgewotCQkJaWYgKHRwICsgMSA+PSBlcCkKLQkJCQlyZXR1cm4gKE5VTEwpOwotCQkJKnRwKysgPSAnOic7Ci0JCX0KLQkJLyogSXMgdGhpcyBhZGRyZXNzIGFuIGVuY2Fwc3VsYXRlZCBJUHY0PyAqLwotCQlpZiAoaSA9PSA2ICYmIGJlc3QuYmFzZSA9PSAwICYmCi0JCSAgICAoYmVzdC5sZW4gPT0gNiB8fCAoYmVzdC5sZW4gPT0gNSAmJiB3b3Jkc1s1XSA9PSAweGZmZmYpKSkgewotCQkJaWYgKCFpbmV0X250b3A0KHNyYysxMiwgdHAsIChzaXplX3QpKGVwIC0gdHApKSkKLQkJCQlyZXR1cm4gKE5VTEwpOwotCQkJdHAgKz0gc3RybGVuKHRwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWFkdmFuY2UgPSBzbnByaW50Zih0cCwgZXAgLSB0cCwgIiV4Iiwgd29yZHNbaV0pOwotCQlpZiAoYWR2YW5jZSA8PSAwIHx8IGFkdmFuY2UgPj0gZXAgLSB0cCkKLQkJCXJldHVybiAoTlVMTCk7Ci0JCXRwICs9IGFkdmFuY2U7Ci0JfQotCS8qIFdhcyBpdCBhIHRyYWlsaW5nIHJ1biBvZiAweDAwJ3M/ICovCi0JaWYgKGJlc3QuYmFzZSAhPSAtMSAmJiAoYmVzdC5iYXNlICsgYmVzdC5sZW4pID09IChJTjZBRERSU1ogLyBJTlQxNlNaKSkgewotCQlpZiAodHAgKyAxID49IGVwKQotCQkJcmV0dXJuIChOVUxMKTsKLQkJKnRwKysgPSAnOic7Ci0JfQotCWlmICh0cCArIDEgPj0gZXApCi0JCXJldHVybiAoTlVMTCk7Ci0JKnRwKysgPSAnXDAnOwotCi0JLyoKLQkgKiBDaGVjayBmb3Igb3ZlcmZsb3csIGNvcHksIGFuZCB3ZSdyZSBkb25lLgotCSAqLwotCWlmICgoc2l6ZV90KSh0cCAtIHRtcCkgPiBzaXplKSB7Ci0JCWVycm5vID0gRU5PU1BDOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQlzdHJsY3B5KGRzdCwgdG1wLCBzaXplKTsKLQlyZXR1cm4gKGRzdCk7Ci19Ci0KLSNlbmRpZiAvKiAhSEFWRV9JTkVUX05UT1AgKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L21rdGVtcC5jIGIvb3BlbmJzZC1jb21wYXQvbWt0ZW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyODVjODQuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvbWt0ZW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyogVEhJUyBGSUxFIEhBUyBCRUVOIE1PRElGSUVEIEZST00gVEhFIE9SSUdJTkFMIE9QRU5CU0QgU09VUkNFICovCi0vKiBDaGFuZ2VzOiBSZW1vdmVkIG1rdGVtcCAqLwotCi0vKgkkT3BlbkJTRDogbWt0ZW1wLmMsdiAxLjE5IDIwMDUvMDgvMDggMDg6MDU6MzYgZXNwaWUgRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODcsIDE5OTMKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9zdGRpby9ta3RlbXAuYyAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2lmICFkZWZpbmVkKEhBVkVfTUtEVEVNUCkgfHwgZGVmaW5lZChIQVZFX1NUUklDVF9NS1NURU1QKQotCi1zdGF0aWMgaW50IF9nZXR0ZW1wKGNoYXIgKiwgaW50ICosIGludCwgaW50KTsKLQotaW50Ci1ta3N0ZW1wcyhjaGFyICpwYXRoLCBpbnQgc2xlbikKLXsKLQlpbnQgZmQ7Ci0KLQlyZXR1cm4gKF9nZXR0ZW1wKHBhdGgsICZmZCwgMCwgc2xlbikgPyBmZCA6IC0xKTsKLX0KLQotaW50Ci1ta3N0ZW1wKGNoYXIgKnBhdGgpCi17Ci0JaW50IGZkOwotCi0JcmV0dXJuIChfZ2V0dGVtcChwYXRoLCAmZmQsIDAsIDApID8gZmQgOiAtMSk7Ci19Ci0KLWNoYXIgKgotbWtkdGVtcChjaGFyICpwYXRoKQotewotCXJldHVybihfZ2V0dGVtcChwYXRoLCAoaW50ICopTlVMTCwgMSwgMCkgPyBwYXRoIDogKGNoYXIgKilOVUxMKTsKLX0KLQotc3RhdGljIGludAotX2dldHRlbXAocGF0aCwgZG9vcGVuLCBkb21rZGlyLCBzbGVuKQotCWNoYXIgKnBhdGg7Ci0JcmVnaXN0ZXIgaW50ICpkb29wZW47Ci0JaW50IGRvbWtkaXI7Ci0JaW50IHNsZW47Ci17Ci0JcmVnaXN0ZXIgY2hhciAqc3RhcnQsICp0cnYsICpzdWZmcDsKLQlzdHJ1Y3Qgc3RhdCBzYnVmOwotCWludCBydmFsOwotCXBpZF90IHBpZDsKLQotCWlmIChkb29wZW4gJiYgZG9ta2RpcikgewotCQllcnJubyA9IEVJTlZBTDsKLQkJcmV0dXJuKDApOwotCX0KLQotCWZvciAodHJ2ID0gcGF0aDsgKnRydjsgKyt0cnYpCi0JCTsKLQl0cnYgLT0gc2xlbjsKLQlzdWZmcCA9IHRydjsKLQktLXRydjsKLQlpZiAodHJ2IDwgcGF0aCkgewotCQllcnJubyA9IEVJTlZBTDsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JcGlkID0gZ2V0cGlkKCk7Ci0Jd2hpbGUgKHRydiA+PSBwYXRoICYmICp0cnYgPT0gJ1gnICYmIHBpZCAhPSAwKSB7Ci0JCSp0cnYtLSA9IChwaWQgJSAxMCkgKyAnMCc7Ci0JCXBpZCAvPSAxMDsKLQl9Ci0Jd2hpbGUgKHRydiA+PSBwYXRoICYmICp0cnYgPT0gJ1gnKSB7Ci0JCWNoYXIgYzsKLQotCQlwaWQgPSAoYXJjNHJhbmRvbSgpICYgMHhmZmZmKSAlICgyNisyNik7Ci0JCWlmIChwaWQgPCAyNikKLQkJCWMgPSBwaWQgKyAnQSc7Ci0JCWVsc2UKLQkJCWMgPSAocGlkIC0gMjYpICsgJ2EnOwotCQkqdHJ2LS0gPSBjOwotCX0KLQlzdGFydCA9IHRydiArIDE7Ci0KLQkvKgotCSAqIGNoZWNrIHRoZSB0YXJnZXQgZGlyZWN0b3J5OyBpZiB5b3UgaGF2ZSBzaXggWCdzIGFuZCBpdAotCSAqIGRvZXNuJ3QgZXhpc3QgdGhpcyBydW5zIGZvciBhICp2ZXJ5KiBsb25nIHRpbWUuCi0JICovCi0JaWYgKGRvb3BlbiB8fCBkb21rZGlyKSB7Ci0JCWZvciAoOzsgLS10cnYpIHsKLQkJCWlmICh0cnYgPD0gcGF0aCkKLQkJCQlicmVhazsKLQkJCWlmICgqdHJ2ID09ICcvJykgewotCQkJCSp0cnYgPSAnXDAnOwotCQkJCXJ2YWwgPSBzdGF0KHBhdGgsICZzYnVmKTsKLQkJCQkqdHJ2ID0gJy8nOwotCQkJCWlmIChydmFsICE9IDApCi0JCQkJCXJldHVybigwKTsKLQkJCQlpZiAoIVNfSVNESVIoc2J1Zi5zdF9tb2RlKSkgewotCQkJCQllcnJubyA9IEVOT1RESVI7Ci0JCQkJCXJldHVybigwKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlmb3IgKDs7KSB7Ci0JCWlmIChkb29wZW4pIHsKLQkJCWlmICgoKmRvb3BlbiA9Ci0JCQkgICAgb3BlbihwYXRoLCBPX0NSRUFUfE9fRVhDTHxPX1JEV1IsIDA2MDApKSA+PSAwKQotCQkJCXJldHVybigxKTsKLQkJCWlmIChlcnJubyAhPSBFRVhJU1QpCi0JCQkJcmV0dXJuKDApOwotCQl9IGVsc2UgaWYgKGRvbWtkaXIpIHsKLQkJCWlmIChta2RpcihwYXRoLCAwNzAwKSA9PSAwKQotCQkJCXJldHVybigxKTsKLQkJCWlmIChlcnJubyAhPSBFRVhJU1QpCi0JCQkJcmV0dXJuKDApOwotCQl9IGVsc2UgaWYgKGxzdGF0KHBhdGgsICZzYnVmKSkKLQkJCXJldHVybihlcnJubyA9PSBFTk9FTlQgPyAxIDogMCk7Ci0KLQkJLyogdHJpY2t5IGxpdHRsZSBhbGdvcml0aG0gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KLQkJZm9yICh0cnYgPSBzdGFydDs7KSB7Ci0JCQlpZiAoISp0cnYpCi0JCQkJcmV0dXJuICgwKTsKLQkJCWlmICgqdHJ2ID09ICdaJykgewotCQkJCWlmICh0cnYgPT0gc3VmZnApCi0JCQkJCXJldHVybiAoMCk7Ci0JCQkJKnRydisrID0gJ2EnOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaXNkaWdpdCgqdHJ2KSkKLQkJCQkJKnRydiA9ICdhJzsKLQkJCQllbHNlIGlmICgqdHJ2ID09ICd6JykJLyogaW5jIGZyb20geiB0byBBICovCi0JCQkJCSp0cnYgPSAnQSc7Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICh0cnYgPT0gc3VmZnApCi0JCQkJCQlyZXR1cm4gKDApOwotCQkJCQkrKyp0cnY7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCS8qTk9UUkVBQ0hFRCovCi19Ci0KLSNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX01LRFRFTVApIHx8IGRlZmluZWQoSEFWRV9TVFJJQ1RfTUtTVEVNUCkgKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L29wZW5ic2QtY29tcGF0LmggYi9vcGVuYnNkLWNvbXBhdC9vcGVuYnNkLWNvbXBhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2M1ZWQyLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L29wZW5ic2QtY29tcGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyogJElkOiBvcGVuYnNkLWNvbXBhdC5oLHYgMS41MSAyMDEwLzEwLzA3IDEwOjI1OjI5IGRqbSBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDMgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgQmVuIExpbmRzdHJvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwMiBUaW0gUmljZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX09QRU5CU0RfQ09NUEFUX0gKLSNkZWZpbmUgX09QRU5CU0RfQ09NUEFUX0gKLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLQotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotLyogT3BlbkJTRCBmdW5jdGlvbiByZXBsYWNlbWVudHMgKi8KLSNpbmNsdWRlICJiYXNlNjQuaCIKLSNpbmNsdWRlICJzaWdhY3QuaCIKLSNpbmNsdWRlICJnbG9iLmgiCi0jaW5jbHVkZSAicmVhZHBhc3NwaHJhc2UuaCIKLSNpbmNsdWRlICJ2aXMuaCIKLSNpbmNsdWRlICJnZXRycnNldGJ5bmFtZS5oIgotI2luY2x1ZGUgInNoYTIuaCIKLQotI2lmbmRlZiBIQVZFX0JBU0VOQU1FCi1jaGFyICpiYXNlbmFtZShjb25zdCBjaGFyICpwYXRoKTsKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfQklORFJFU1ZQT1JUX1NBCi1pbnQgYmluZHJlc3Zwb3J0X3NhKGludCBzZCwgc3RydWN0IHNvY2thZGRyICpzYSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0NMT1NFRlJPTQotdm9pZCBjbG9zZWZyb20oaW50KTsKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfR0VUQ1dECi1jaGFyICpnZXRjd2QoY2hhciAqcHQsIHNpemVfdCBzaXplKTsKLSNlbmRpZiAKLQotI2lmICFkZWZpbmVkKEhBVkVfUkVBTFBBVEgpIHx8IGRlZmluZWQoQlJPS0VOX1JFQUxQQVRIKQotY2hhciAqcmVhbHBhdGgoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqcmVzb2x2ZWQpOwotI2VuZGlmIAotCi0jaWZuZGVmIEhBVkVfUlJFU1ZQT1JUX0FGCi1pbnQgcnJlc3Zwb3J0X2FmKGludCAqYWxwb3J0LCBzYV9mYW1pbHlfdCBhZik7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NUUkxDUFkKLS8qICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gWFhYIFN0aWxsIG5lZWRlZD8gKi8KLXNpemVfdCBzdHJsY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6KTsKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfU1RSTENBVAotLyogI2luY2x1ZGUgPHN5cy90eXBlcy5oPiBYWFggU3RpbGwgbmVlZGVkPyAqLwotc2l6ZV90IHN0cmxjYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXopOwotI2VuZGlmIAotCi0jaWZuZGVmIEhBVkVfU0VURU5WCi1pbnQgc2V0ZW52KHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm5hbWUsIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgcmV3cml0ZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NUUk1PREUKLXZvaWQgc3RybW9kZShpbnQgbW9kZSwgY2hhciAqcCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NUUlBUSU1FCi0jaW5jbHVkZSAgPHRpbWUuaD4KLWNoYXIgKnN0cnB0aW1lKGNvbnN0IGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCBzdHJ1Y3QgdG0gKnRtKTsKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSEFWRV9NS0RURU1QKSB8fCBkZWZpbmVkKEhBVkVfU1RSSUNUX01LU1RFTVApCi1pbnQgbWtzdGVtcHMoY2hhciAqcGF0aCwgaW50IHNsZW4pOwotaW50IG1rc3RlbXAoY2hhciAqcGF0aCk7Ci1jaGFyICpta2R0ZW1wKGNoYXIgKnBhdGgpOwotI2VuZGlmIAotCi0jaWZuZGVmIEhBVkVfREFFTU9OCi1pbnQgZGFlbW9uKGludCBub2NoZGlyLCBpbnQgbm9jbG9zZSk7Ci0jZW5kaWYgCi0KLSNpZm5kZWYgSEFWRV9ESVJOQU1FCi1jaGFyICpkaXJuYW1lKGNvbnN0IGNoYXIgKnBhdGgpOwotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9GTVRfU0NBTEVECi0jZGVmaW5lCUZNVF9TQ0FMRURfU1RSU0laRQk3Ci1pbnQJZm10X3NjYWxlZChsb25nIGxvbmcgbnVtYmVyLCBjaGFyICpyZXN1bHQpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEJST0tFTl9JTkVUX05UT0EpIHx8ICFkZWZpbmVkKEhBVkVfSU5FVF9OVE9BKQotY2hhciAqaW5ldF9udG9hKHN0cnVjdCBpbl9hZGRyIGluKTsKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfSU5FVF9OVE9QCi1jb25zdCBjaGFyICppbmV0X250b3AoaW50IGFmLCBjb25zdCB2b2lkICpzcmMsIGNoYXIgKmRzdCwgc2l6ZV90IHNpemUpOwotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9JTkVUX0FUT04KLWludCBpbmV0X2F0b24oY29uc3QgY2hhciAqY3AsIHN0cnVjdCBpbl9hZGRyICphZGRyKTsKLSNlbmRpZiAKLQotI2lmbmRlZiBIQVZFX1NUUlNFUAotY2hhciAqc3Ryc2VwKGNoYXIgKipzdHJpbmdwLCBjb25zdCBjaGFyICpkZWxpbSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NFVFBST0NUSVRMRQotdm9pZCBzZXRwcm9jdGl0bGUoY29uc3QgY2hhciAqZm10LCAuLi4pOwotdm9pZCBjb21wYXRfaW5pdF9zZXRwcm9jdGl0bGUoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0dFVEdST1VQTElTVAotLyogI2luY2x1ZGUgPGdycC5oPiBYWFhYIFN0aWxsIG5lZWRlZCA/ICovCi1pbnQgZ2V0Z3JvdXBsaXN0KGNvbnN0IGNoYXIgKiwgZ2lkX3QsIGdpZF90ICosIGludCAqKTsKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSEFWRV9HRVRPUFQpIHx8ICFkZWZpbmVkKEhBVkVfR0VUT1BUX09QVFJFU0VUKQotaW50IEJTRGdldG9wdChpbnQgYXJnYywgY2hhciAqIGNvbnN0ICphcmd2LCBjb25zdCBjaGFyICpvcHRzKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChIQVZFX0RFQ0xfV1JJVEVWKSAmJiBIQVZFX0RFQ0xfV1JJVEVWID09IDAKLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy91aW8uaD4KLWludCB3cml0ZXYoaW50LCBzdHJ1Y3QgaW92ZWMgKiwgaW50KTsKLSNlbmRpZgotCi0vKiBIb21lIGdyb3duIHJvdXRpbmVzICovCi0jaW5jbHVkZSAiYnNkLW1pc2MuaCIKLSNpbmNsdWRlICJic2Qtc3RhdHZmcy5oIgotI2luY2x1ZGUgImJzZC13YWl0cGlkLmgiCi0jaW5jbHVkZSAiYnNkLXBvbGwuaCIKLQotI2lmbmRlZiBIQVZFX0dFVFBFRVJFSUQKLWludCBnZXRwZWVyZWlkKGludCAsIHVpZF90ICosIGdpZF90ICopOwotI2VuZGlmIAotCi0jaWZuZGVmIEhBVkVfQVJDNFJBTkRPTQotdW5zaWduZWQgaW50IGFyYzRyYW5kb20odm9pZCk7Ci12b2lkIGFyYzRyYW5kb21fc3Rpcih2b2lkKTsKLSNlbmRpZiAvKiAhSEFWRV9BUkM0UkFORE9NICovCi0KLSNpZm5kZWYgSEFWRV9BUkM0UkFORE9NX0JVRgotdm9pZCBhcmM0cmFuZG9tX2J1Zih2b2lkICosIHNpemVfdCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0FSQzRSQU5ET01fVU5JRk9STQotdV9pbnQzMl90IGFyYzRyYW5kb21fdW5pZm9ybSh1X2ludDMyX3QpOwotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9BU1BSSU5URgotaW50IGFzcHJpbnRmKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgLi4uKTsKLSNlbmRpZiAKLQotI2lmbmRlZiBIQVZFX09QRU5QVFkKLSMgaW5jbHVkZSA8c3lzL2lvY3RsLmg+CS8qIGZvciBzdHJ1Y3Qgd2luc2l6ZSAqLwotaW50IG9wZW5wdHkoaW50ICosIGludCAqLCBjaGFyICosIHN0cnVjdCB0ZXJtaW9zICosIHN0cnVjdCB3aW5zaXplICopOwotI2VuZGlmIC8qIEhBVkVfT1BFTlBUWSAqLwotCi0vKiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IFhYWCBuZWVkZWQ/IEZvciBzaXplX3QgKi8KLQotI2lmbmRlZiBIQVZFX1NOUFJJTlRGCi1pbnQgc25wcmludGYoY2hhciAqLCBzaXplX3QsIFNOUFJJTlRGX0NPTlNUIGNoYXIgKiwgLi4uKTsKLSNlbmRpZiAKLQotI2lmbmRlZiBIQVZFX1NUUlRPTEwKLWxvbmcgbG9uZyBzdHJ0b2xsKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfU1RSVE9OVU0KLWxvbmcgbG9uZyBzdHJ0b251bShjb25zdCBjaGFyICosIGxvbmcgbG9uZywgbG9uZyBsb25nLCBjb25zdCBjaGFyICoqKTsKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSEFWRV9WQVNQUklOVEYpIHx8ICFkZWZpbmVkKEhBVkVfVlNOUFJJTlRGKQotIyBpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfVkFTUFJJTlRGCi1pbnQgdmFzcHJpbnRmKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1ZTTlBSSU5URgotaW50IHZzbnByaW50ZihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfVVNFUl9GUk9NX1VJRAotY2hhciAqdXNlcl9mcm9tX3VpZCh1aWRfdCwgaW50KTsKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfR1JPVVBfRlJPTV9HSUQKLWNoYXIgKmdyb3VwX2Zyb21fZ2lkKGdpZF90LCBpbnQpOwotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9USU1JTkdTQUZFX0JDTVAKLWludCB0aW1pbmdzYWZlX2JjbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7Ci0jZW5kaWYKLQotdm9pZCAqeG1tYXAoc2l6ZV90IHNpemUpOwotY2hhciAqeGNyeXB0KGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjb25zdCBjaGFyICpzYWx0KTsKLWNoYXIgKnNoYWRvd19wdyhzdHJ1Y3QgcGFzc3dkICpwdyk7Ci0KLS8qIHJmYzI1NTMgc29ja2V0IEFQSSByZXBsYWNlbWVudHMgKi8KLSNpbmNsdWRlICJmYWtlLXJmYzI1NTMuaCIKLQotLyogUm91dGluZXMgZm9yIGEgc2luZ2xlIE9TIHBsYXRmb3JtICovCi0jaW5jbHVkZSAiYnNkLWNyYXkuaCIKLSNpbmNsdWRlICJic2QtY3lnd2luX3V0aWwuaCIKLQotI2luY2x1ZGUgInBvcnQtYWl4LmgiCi0jaW5jbHVkZSAicG9ydC1pcml4LmgiCi0jaW5jbHVkZSAicG9ydC1saW51eC5oIgotI2luY2x1ZGUgInBvcnQtc29sYXJpcy5oIgotI2luY2x1ZGUgInBvcnQtdHVuLmgiCi0jaW5jbHVkZSAicG9ydC11dy5oIgotCi0jZW5kaWYgLyogX09QRU5CU0RfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmMgYi9vcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTg5Y2FiLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyogJElkOiBvcGVuc3NsLWNvbXBhdC5jLHYgMS4xNCAyMDExLzA1LzEwIDAxOjEzOjM4IGR0dWNrZXIgRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSBEYXJyZW4gVHVja2VyIDxkdHVja2VyQHppcC5jb20uYXU+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBNSU5ELCBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUgotICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIFVTRV9PUEVOU1NMX0VOR0lORQotIyBpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgotIyBpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfUlNBX0dFVF9ERUZBVUxUX01FVEhPRAotIyBpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsb2cuaCIKLQotI2RlZmluZSBTU0hfRE9OVF9PVkVSTE9BRF9PUEVOU1NMX0ZVTkNTCi0jaW5jbHVkZSAib3BlbnNzbC1jb21wYXQuaCIKLQotI2lmZGVmIFNTSF9PTERfRVZQCi1pbnQKLXNzaF9FVlBfQ2lwaGVySW5pdChFVlBfQ0lQSEVSX0NUWCAqZXZwLCBjb25zdCBFVlBfQ0lQSEVSICp0eXBlLAotICAgIHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpCi17Ci0JRVZQX0NpcGhlckluaXQoZXZwLCB0eXBlLCBrZXksIGl2LCBlbmMpOwotCXJldHVybiAxOwotfQotCi1pbnQKLXNzaF9FVlBfQ2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpldnAsIGNoYXIgKmRzdCwgY2hhciAqc3JjLCBpbnQgbGVuKQotewotCUVWUF9DaXBoZXIoZXZwLCBkc3QsIHNyYywgbGVuKTsKLQlyZXR1cm4gMTsKLX0KLQotaW50Ci1zc2hfRVZQX0NJUEhFUl9DVFhfY2xlYW51cChFVlBfQ0lQSEVSX0NUWCAqZXZwKQotewotCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoZXZwKTsKLQlyZXR1cm4gMTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgT1BFTlNTTF9FVlBfRElHRVNUVVBEQVRFX1ZPSUQKLWludAotc3NoX0VWUF9EaWdlc3RVcGRhdGUoRVZQX01EX0NUWCAqY3R4LCBjb25zdCB2b2lkICpkLCB1bnNpZ25lZCBpbnQgY250KQotewotCUVWUF9EaWdlc3RVcGRhdGUoY3R4LCBkLCBjbnQpOwotCXJldHVybiAxOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9CTl9JU19QUklNRV9FWAotaW50Ci1CTl9pc19wcmltZV9leChjb25zdCBCSUdOVU0gKnAsIGludCBuY2hlY2tzLCBCTl9DVFggKmN0eCwgdm9pZCAqY2IpCi17Ci0JaWYgKGNiICE9IE5VTEwpCi0JCWZhdGFsKCIlczogY2FsbGJhY2sgYXJncyBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18pOwotCXJldHVybiBCTl9pc19wcmltZShwLCBuY2hlY2tzLCBOVUxMLCBjdHgsIE5VTEwpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9SU0FfR0VORVJBVEVfS0VZX0VYCi1pbnQKLVJTQV9nZW5lcmF0ZV9rZXlfZXgoUlNBICpyc2EsIGludCBiaXRzLCBCSUdOVU0gKmJuX2UsIHZvaWQgKmNiKQotewotCVJTQSAqbmV3X3JzYSwgdG1wX3JzYTsKLQl1bnNpZ25lZCBsb25nIGU7Ci0KLQlpZiAoY2IgIT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBjYWxsYmFjayBhcmdzIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7Ci0JZSA9IEJOX2dldF93b3JkKGJuX2UpOwotCWlmIChlID09IDB4ZmZmZmZmZmZMKQotCQlmYXRhbCgiJXM6IHZhbHVlIG9mIGUgdG9vIGxhcmdlIiwgX19mdW5jX18pOwotCW5ld19yc2EgPSBSU0FfZ2VuZXJhdGVfa2V5KGJpdHMsIGUsIE5VTEwsIE5VTEwpOwotCWlmIChuZXdfcnNhID09IE5VTEwpCi0JCXJldHVybiAwOwotCS8qIHN3YXAgcnNhL25ld19yc2EgdGhlbiBmcmVlIG5ld19yc2EgKi8KLQl0bXBfcnNhID0gKnJzYTsKLQkqcnNhID0gKm5ld19yc2E7Ci0JKm5ld19yc2EgPSB0bXBfcnNhOwotCVJTQV9mcmVlKG5ld19yc2EpOwotCXJldHVybiAxOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9EU0FfR0VORVJBVEVfUEFSQU1FVEVSU19FWAotaW50Ci1EU0FfZ2VuZXJhdGVfcGFyYW1ldGVyc19leChEU0EgKmRzYSwgaW50IGJpdHMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlZWQsCi0gICAgaW50IHNlZWRfbGVuLCBpbnQgKmNvdW50ZXJfcmV0LCB1bnNpZ25lZCBsb25nICpoX3JldCwgdm9pZCAqY2IpCi17Ci0JRFNBICpuZXdfZHNhLCB0bXBfZHNhOwotCi0JaWYgKGNiICE9IE5VTEwpCi0JCWZhdGFsKCIlczogY2FsbGJhY2sgYXJncyBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18pOwotCW5ld19kc2EgPSBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyhiaXRzLCAodW5zaWduZWQgY2hhciAqKXNlZWQsIHNlZWRfbGVuLAotCSAgICBjb3VudGVyX3JldCwgaF9yZXQsIE5VTEwsIE5VTEwpOwotCWlmIChuZXdfZHNhID09IE5VTEwpCi0JCXJldHVybiAwOwotCS8qIHN3YXAgZHNhL25ld19kc2EgdGhlbiBmcmVlIG5ld19kc2EgKi8KLQl0bXBfZHNhID0gKmRzYTsKLQkqZHNhID0gKm5ld19kc2E7Ci0JKm5ld19kc2EgPSB0bXBfZHNhOwotCURTQV9mcmVlKG5ld19kc2EpOwotCXJldHVybiAxOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9SU0FfR0VUX0RFRkFVTFRfTUVUSE9ECi1SU0FfTUVUSE9EICoKLVJTQV9nZXRfZGVmYXVsdF9tZXRob2Qodm9pZCkKLXsKLQlyZXR1cm4gUlNBX1BLQ1MxX1NTTGVheSgpOwotfQotI2VuZGlmCi0KLSNpZmRlZglVU0VfT1BFTlNTTF9FTkdJTkUKLXZvaWQKLXNzaF9PcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcyh2b2lkKQotewotCU9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7Ci0KLQkvKiBFbmFibGUgdXNlIG9mIGNyeXB0byBoYXJkd2FyZSAqLwotCUVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpOwotCUVOR0lORV9yZWdpc3Rlcl9hbGxfY29tcGxldGUoKTsKLQlPUEVOU1NMX2NvbmZpZyhOVUxMKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCBiL29wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZmMyNGUuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKiAkSWQ6IG9wZW5zc2wtY29tcGF0LmgsdiAxLjE5IDIwMTEvMDUvMTAgMDE6MTM6MzggZHR1Y2tlciBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1IERhcnJlbiBUdWNrZXIgPGR0dWNrZXJAemlwLmNvbS5hdT4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIE1JTkQsIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSCi0gKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLSNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+Ci0KLS8qIE9ubHkgaW4gMC45LjggKi8KLSNpZm5kZWYgT1BFTlNTTF9EU0FfTUFYX01PRFVMVVNfQklUUwotIyBkZWZpbmUgT1BFTlNTTF9EU0FfTUFYX01PRFVMVVNfQklUUyAgICAgICAgMTAwMDAKLSNlbmRpZgotI2lmbmRlZiBPUEVOU1NMX1JTQV9NQVhfTU9EVUxVU19CSVRTCi0jIGRlZmluZSBPUEVOU1NMX1JTQV9NQVhfTU9EVUxVU19CSVRTICAgICAgICAxNjM4NAotI2VuZGlmCi0KLS8qIE9QRU5TU0xfZnJlZSgpIGlzIEZyZWUoKSBpbiB2ZXJzaW9ucyBiZWZvcmUgT3BlblNTTCAwLjkuNiAqLwotI2lmICFkZWZpbmVkKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIpIHx8IChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNjAwZikKLSMgZGVmaW5lIE9QRU5TU0xfZnJlZSh4KSBGcmVlKHgpCi0jZW5kaWYKLQotI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDAwOTA2MDAwTAotIyBkZWZpbmUgU1NIX09MRF9FVlAKLSMgZGVmaW5lIEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShlKQkJKChlKS0+YXBwX2RhdGEpCi0jZW5kaWYKLQotI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDEwMDAwMDBmTAotIyBkZWZpbmUgTElCQ1JZUFRPX0VWUF9JTkxfVFlQRSB1bnNpZ25lZCBpbnQKLSNlbHNlCi0jIGRlZmluZSBMSUJDUllQVE9fRVZQX0lOTF9UWVBFIHNpemVfdAotI2VuZGlmCi0KLSNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MDA5MDcwMDBMKSB8fCBkZWZpbmVkKE9QRU5TU0xfTE9CT1RPTUlTRURfQUVTKQotIyBkZWZpbmUgVVNFX0JVSUxUSU5fUklKTkRBRUwKLSNlbmRpZgotCi0jaWZkZWYgVVNFX0JVSUxUSU5fUklKTkRBRUwKLSMgaW5jbHVkZSAicmlqbmRhZWwuaCIKLSMgZGVmaW5lIEFFU19LRVkgcmlqbmRhZWxfY3R4Ci0jIGRlZmluZSBBRVNfQkxPQ0tfU0laRSAxNgotIyBkZWZpbmUgQUVTX2VuY3J5cHQoYSwgYiwgYykJCXJpam5kYWVsX2VuY3J5cHQoYywgYSwgYikKLSMgZGVmaW5lIEFFU19zZXRfZW5jcnlwdF9rZXkoYSwgYiwgYykJcmlqbmRhZWxfc2V0X2tleShjLCAoY2hhciAqKWEsIGIsIDEpCi0jIGRlZmluZSBFVlBfYWVzXzEyOF9jYmMgZXZwX3Jpam5kYWVsCi0jIGRlZmluZSBFVlBfYWVzXzE5Ml9jYmMgZXZwX3Jpam5kYWVsCi0jIGRlZmluZSBFVlBfYWVzXzI1Nl9jYmMgZXZwX3Jpam5kYWVsCi1leHRlcm4gY29uc3QgRVZQX0NJUEhFUiAqZXZwX3Jpam5kYWVsKHZvaWQpOwotZXh0ZXJuIHZvaWQgc3NoX3Jpam5kYWVsX2l2KEVWUF9DSVBIRVJfQ1RYICosIGludCwgdV9jaGFyICosIHVfaW50KTsKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoRVZQX0NUUkxfU0VUX0FDU1NfTU9ERSkKLSMgaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMEwpCi0jICBkZWZpbmUgVVNFX0NJUEhFUl9BQ1NTIDEKLWV4dGVybiBjb25zdCBFVlBfQ0lQSEVSICpldnBfYWNzcyh2b2lkKTsKLSMgIGRlZmluZSBFVlBfYWNzcyBldnBfYWNzcwotIyBlbHNlCi0jICBkZWZpbmUgRVZQX2Fjc3MgTlVMTAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIE9wZW5TU0wgMC45LjhlIHJldHVybnMgY2lwaGVyIGtleSBsZW4gbm90IGNvbnRleHQga2V5IGxlbiAqLwotI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID09IDB4MDA5MDgwNWZMKQotIyBkZWZpbmUgRVZQX0NJUEhFUl9DVFhfa2V5X2xlbmd0aChjKSAoKGMpLT5rZXlfbGVuKQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9SU0FfR0VUX0RFRkFVTFRfTUVUSE9ECi1SU0FfTUVUSE9EICpSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKHZvaWQpOwotI2VuZGlmCi0KLS8qCi0gKiBXZSBvdmVybG9hZCBzb21lIG9mIHRoZSBPcGVuU1NMIGNyeXB0byBmdW5jdGlvbnMgd2l0aCBzc2hfKiBlcXVpdmFsZW50cwotICogd2hpY2ggY2F0ZXIgZm9yIG9sZGVyIGFuZC9vciBsZXNzIGZlYXR1cmVmdWwgT3BlblNTTCB2ZXJzaW9uLgotICoKLSAqIEluIG9yZGVyIGZvciB0aGUgY29tcGF0IGxpYnJhcnkgdG8gY2FsbCB0aGUgcmVhbCBmdW5jdGlvbnMsIGl0IG11c3QKLSAqIGRlZmluZSBTU0hfRE9OVF9PVkVSTE9BRF9PUEVOU1NMX0ZVTkNTIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlIGFuZAotICogaW1wbGVtZW50IHRoZSBzc2hfKiBlcXVpdmFsZW50cy4KLSAqLwotI2lmbmRlZiBTU0hfRE9OVF9PVkVSTE9BRF9PUEVOU1NMX0ZVTkNTCi0KLSMgaWZkZWYgU1NIX09MRF9FVlAKLSMgIGlmZGVmIEVWUF9DaXBoZXIKLSMgICB1bmRlZiBFVlBfQ2lwaGVyCi0jICBlbmRpZgotIyAgZGVmaW5lIEVWUF9DaXBoZXJJbml0KGEsYixjLGQsZSkJc3NoX0VWUF9DaXBoZXJJbml0KChhKSwoYiksKGMpLChkKSwoZSkpCi0jICBkZWZpbmUgRVZQX0NpcGhlcihhLGIsYyxkKQkJc3NoX0VWUF9DaXBoZXIoKGEpLChiKSwoYyksKGQpKQotIyAgZGVmaW5lIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoYSkJc3NoX0VWUF9DSVBIRVJfQ1RYX2NsZWFudXAoKGEpKQotIyBlbmRpZiAvKiBTU0hfT0xEX0VWUCAqLwotCi0jIGlmZGVmIE9QRU5TU0xfRVZQX0RJR0VTVFVQREFURV9WT0lECi0jICBkZWZpbmUgRVZQX0RpZ2VzdFVwZGF0ZShhLGIsYykJc3NoX0VWUF9EaWdlc3RVcGRhdGUoKGEpLChiKSwoYykpCi0jICBlbmRpZgotCi0jIGlmZGVmIFVTRV9PUEVOU1NMX0VOR0lORQotIyAgaWZkZWYgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMKLSMgICB1bmRlZiBPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcwotIyAgZW5kaWYKLSMgIGRlZmluZSBPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpICBzc2hfT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKQotIyBlbmRpZgotCi0jIGlmbmRlZiBIQVZFX0JOX0lTX1BSSU1FX0VYCi1pbnQgQk5faXNfcHJpbWVfZXgoY29uc3QgQklHTlVNICosIGludCwgQk5fQ1RYICosIHZvaWQgKik7Ci0jIGVuZGlmCi0KLSMgaWZuZGVmIEhBVkVfRFNBX0dFTkVSQVRFX1BBUkFNRVRFUlNfRVgKLWludCBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVyc19leChEU0EgKiwgaW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCwgaW50ICosCi0gICAgdW5zaWduZWQgbG9uZyAqLCB2b2lkICopOwotIyBlbmRpZgotCi0jIGlmbmRlZiBIQVZFX1JTQV9HRU5FUkFURV9LRVlfRVgKLWludCBSU0FfZ2VuZXJhdGVfa2V5X2V4KFJTQSAqLCBpbnQsIEJJR05VTSAqLCB2b2lkICopOwotIyBlbmRpZgotCi1pbnQgc3NoX0VWUF9DaXBoZXJJbml0KEVWUF9DSVBIRVJfQ1RYICosIGNvbnN0IEVWUF9DSVBIRVIgKiwgdW5zaWduZWQgY2hhciAqLAotICAgIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKLWludCBzc2hfRVZQX0NpcGhlcihFVlBfQ0lQSEVSX0NUWCAqLCBjaGFyICosIGNoYXIgKiwgaW50KTsKLWludCBzc2hfRVZQX0NJUEhFUl9DVFhfY2xlYW51cChFVlBfQ0lQSEVSX0NUWCAqKTsKLXZvaWQgc3NoX09wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKHZvaWQpOwotI2VuZGlmCS8qIFNTSF9ET05UX09WRVJMT0FEX09QRU5TU0xfRlVOQ1MgKi8KLQpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvcG9ydC1haXguYyBiL29wZW5ic2QtY29tcGF0L3BvcnQtYWl4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZGVmYmYuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvcG9ydC1haXguYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBHZXJ0IERvZXJpbmcuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDAzLDIwMDQsMjAwNSwyMDA2IERhcnJlbiBUdWNrZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgImxvZy5oIgotCi0jaWZkZWYgX0FJWAotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiBkZWZpbmVkKEhBVkVfTkVUREJfSCkKLSMgaW5jbHVkZSA8bmV0ZGIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHVpbmZvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaWZkZWYgV0lUSF9BSVhBVVRIRU5USUNBVEUKLSMgaW5jbHVkZSA8bG9naW4uaD4KLSMgaW5jbHVkZSA8dXNlcnB3Lmg+Ci0jIGlmIGRlZmluZWQoSEFWRV9TWVNfQVVESVRfSCkgJiYgZGVmaW5lZChBSVhfTE9HSU5GQUlMRURfNEFSRykKLSMgIGluY2x1ZGUgPHN5cy9hdWRpdC5oPgotIyBlbmRpZgotIyBpbmNsdWRlIDx1c2Vyc2VjLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgInBvcnQtYWl4LmgiCi0KLXN0YXRpYyBjaGFyICpsYXN0bG9naW5fbXNnID0gTlVMTDsKLQotIyBpZmRlZiBIQVZFX1NFVEFVVEhEQgotc3RhdGljIGNoYXIgb2xkX3JlZ2lzdHJ5W1JFR0lTVFJZX1NJWkVdID0gIiI7Ci0jIGVuZGlmCi0KLS8qCi0gKiBBSVggaGFzIGEgInVzcmluZm8iIGFyZWEgd2hlcmUgbG9nbmFtZSBhbmQgb3RoZXIgc3R1ZmYgaXMgc3RvcmVkIC0KLSAqIGEgZmV3IGFwcGxpY2F0aW9ucyBhY3R1YWxseSB1c2UgdGhpcyBhbmQgZGllIGlmIGl0J3Mgbm90IHNldAotICoKLSAqIE5PVEU6IFRUWT0gc2hvdWxkIGJlIHNldCwgYnV0IHNpbmNlIG5vIG9uZSB1c2VzIGl0IGFuZCBpdCdzIGhhcmQgdG8KLSAqIGFjcXVpcmUgZHVlIHRvIHByaXZzZXAgY29kZS4gIFdlIHdpbGwganVzdCBkcm9wIHN1cHBvcnQuCi0gKi8KLXZvaWQKLWFpeF91c3JpbmZvKHN0cnVjdCBwYXNzd2QgKnB3KQotewotCXVfaW50IGk7Ci0Jc2l6ZV90IGxlbjsKLQljaGFyICpjcDsKLQotCWxlbiA9IHNpemVvZigiTE9HTkFNRT0gTkFNRT0gIikgKyAoMiAqIHN0cmxlbihwdy0+cHdfbmFtZSkpOwotCWNwID0geG1hbGxvYyhsZW4pOwotCi0JaSA9IHNucHJpbnRmKGNwLCBsZW4sICJMT0dOQU1FPSVzJWNOQU1FPSVzJWMiLCBwdy0+cHdfbmFtZSwgJ1wwJywKLQkgICAgcHctPnB3X25hbWUsICdcMCcpOwotCWlmICh1c3JpbmZvKFNFVFVJTkZPLCBjcCwgaSkgPT0gLTEpCi0JCWZhdGFsKCJDb3VsZG4ndCBzZXQgdXNyaW5mbzogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCWRlYnVnMygiQUlYL1VzckluZm86IHNldCBsZW4gJWQiLCBpKTsKLQotCXhmcmVlKGNwKTsKLX0KLQotIyBpZmRlZiBXSVRIX0FJWEFVVEhFTlRJQ0FURQotLyoKLSAqIFJlbW92ZSBlbWJlZGRlZCBuZXdsaW5lcyBpbiBzdHJpbmcgKGlmIGFueSkuCi0gKiBVc2VkIGJlZm9yZSBsb2dnaW5nIG1lc3NhZ2VzIHJldHVybmVkIGJ5IEFJWCBhdXRoZW50aWNhdGlvbiBmdW5jdGlvbnMKLSAqIHNvIHRoZSBtZXNzYWdlIGlzIGxvZ2dlZCBvbiBvbmUgbGluZS4KLSAqLwotdm9pZAotYWl4X3JlbW92ZV9lbWJlZGRlZF9uZXdsaW5lcyhjaGFyICpwKQotewotCWlmIChwID09IE5VTEwpCi0JCXJldHVybjsKLQotCWZvciAoOyAqcDsgcCsrKSB7Ci0JCWlmICgqcCA9PSAnXG4nKQotCQkJKnAgPSAnICc7Ci0JfQotCS8qIFJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlICovCi0JaWYgKCotLXAgPT0gJyAnKQotCQkqcCA9ICdcMCc7Ci19Ci0KLS8qCi0gKiBUZXN0IHNwZWNpZmljYWxseSBmb3IgdGhlIGNhc2Ugd2hlcmUgU1lTVEVNID09IE5PTkUgYW5kIEFVVEgxIGNvbnRhaW5zCi0gKiBhbnl0aGluZyBvdGhlciB0aGFuIE5PTkUgb3IgU1lTVEVNLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgYWRtaW4gaGFzCi0gKiBjb25maWd1cmVkIHRoZSBhY2NvdW50IGZvciBwdXJlbHkgQVVUSDEtdHlwZSBhdXRoZW50aWNhdGlvbi4KLSAqCi0gKiBTaW5jZSBhdXRoZW50aWNhdGUoKSBkb2Vzbid0IGNoZWNrIEFVVEgxLCBhbmQgc3NoZCBjYW4ndCBzYW5lbHkgc3VwcG9ydAotICogQVVUSDEgaXRzZWxmLCBpbiBzdWNoIGEgY2FzZSBhdXRoZW50aWNhdGUoKSB3aWxsIGFsbG93IGFjY2VzcyB3aXRob3V0Ci0gKiBhdXRoZW50YXRpb24sIHdoaWNoIGlzIGFsbW9zdCBjZXJ0YWlubHkgbm90IHdoYXQgdGhlIGFkbWluIGludGVuZHMuCi0gKgotICogKFRoZSBuYXRpdmUgdG9vbHMsIGVnIGxvZ2luLCB3aWxsIHByb2Nlc3MgdGhlIEFVVEgxIGxpc3QgaW4gYWRkaXRpb24gdG8KLSAqIHRoZSBTWVNURU0gbGlzdCBieSB1c2luZyBja3VzZXJJRCgpLCBob3dldmVyIGNrdXNlcklEKCkgYW5kIEFVVEgxIG1ldGhvZHMKLSAqIGhhdmUgYmVlbiBkZXByZWNhdGVkIHNpbmNlIEFJWCA0LjIueCBhbmQgd291bGQgYmUgdmVyeSBkaWZmaWN1bHQgZm9yIHNzaGQKLSAqIHRvIHN1cHBvcnQuCi0gKgotICogUmV0dXJucyAwIGlmIGFuIHVuc3VwcG9ydGFibGUgY29tYmluYXRpb24gaXMgZm91bmQsIDEgb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgaW50Ci1haXhfdmFsaWRfYXV0aGVudGljYXRpb25zKGNvbnN0IGNoYXIgKnVzZXIpCi17Ci0JY2hhciAqYXV0aDEsICpzeXMsICpwOwotCWludCB2YWxpZCA9IDE7Ci0KLQlpZiAoZ2V0dXNlcmF0dHIoKGNoYXIgKil1c2VyLCBTX0FVVEhTWVNURU0sICZzeXMsIFNFQ19DSEFSKSAhPSAwKSB7Ci0JCWxvZ2l0KCJDYW4ndCByZXRyaWV2ZSBhdHRyaWJ1dGUgU1lTVEVNIGZvciAlczogJS4xMDBzIiwKLQkJICAgIHVzZXIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWRlYnVnMygiQUlYIFNZU1RFTSBhdHRyaWJ1dGUgJXMiLCBzeXMpOwotCWlmIChzdHJjbXAoc3lzLCAiTk9ORSIpICE9IDApCi0JCXJldHVybiAxOwkvKiBub3QgIk5PTkUiLCBzbyBpcyBPSyAqLwotCi0JaWYgKGdldHVzZXJhdHRyKChjaGFyICopdXNlciwgU19BVVRIMSwgJmF1dGgxLCBTRUNfTElTVCkgIT0gMCkgewotCQlsb2dpdCgiQ2FuJ3QgcmV0cmlldmUgYXR0cmlidXRlIGF1dGgxIGZvciAlczogJS4xMDBzIiwKLQkJICAgIHVzZXIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXAgPSBhdXRoMTsKLQkvKiBBIFNFQ19MSVNUIGlzIGNvbmNhdGVuYXRlZCBzdHJpbmdzLCBlbmRpbmcgd2l0aCB0d28gTlVMcy4gKi8KLQl3aGlsZSAocFswXSAhPSAnXDAnICYmIHBbMV0gIT0gJ1wwJykgewotCQlkZWJ1ZzMoIkFJWCBhdXRoMSBhdHRyaWJ1dGUgbGlzdCBtZW1iZXIgJXMiLCBwKTsKLQkJaWYgKHN0cmNtcChwLCAiTk9ORSIpICE9IDAgJiYgc3RyY21wKHAsICJTWVNURU0iKSkgewotCQkJbG9naXQoIkFjY291bnQgJXMgaGFzIHVuc3VwcG9ydGVkIGF1dGgxIHZhbHVlICclcyciLAotCQkJICAgIHVzZXIsIHApOwotCQkJdmFsaWQgPSAwOwotCQl9Ci0JCXAgKz0gc3RybGVuKHApICsgMTsKLQl9Ci0KLQlyZXR1cm4gKHZhbGlkKTsKLX0KLQotLyoKLSAqIERvIGF1dGhlbnRpY2F0aW9uIHZpYSBBSVgncyBhdXRoZW50aWNhdGUgcm91dGluZS4gIFdlIGxvb3AgdW50aWwgdGhlCi0gKiByZWVudGVyIHBhcmFtZXRlciBpcyAwLCBidXQgbm9ybWFsbHkgYXV0aGVudGljYXRlIGlzIGNhbGxlZCBvbmx5IG9uY2UuCi0gKgotICogTm90ZTogdGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgb24gc3VjY2Vzcywgd2hlcmVhcyBBSVgncyBhdXRoZW50aWNhdGUoKQotICogcmV0dXJucyAwLgotICovCi1pbnQKLXN5c19hdXRoX3Bhc3N3ZChBdXRoY3R4dCAqY3R4dCwgY29uc3QgY2hhciAqcGFzc3dvcmQpCi17Ci0JY2hhciAqYXV0aG1zZyA9IE5VTEwsICptc2cgPSBOVUxMLCAqbmFtZSA9IGN0eHQtPnB3LT5wd19uYW1lOwotCWludCBhdXRoc3VjY2VzcyA9IDAsIGV4cGlyZWQsIHJlZW50ZXIsIHJlc3VsdDsKLQotCWRvIHsKLQkJcmVzdWx0ID0gYXV0aGVudGljYXRlKChjaGFyICopbmFtZSwgKGNoYXIgKilwYXNzd29yZCwgJnJlZW50ZXIsCi0JCSAgICAmYXV0aG1zZyk7Ci0JCWFpeF9yZW1vdmVfZW1iZWRkZWRfbmV3bGluZXMoYXV0aG1zZyk7CQotCQlkZWJ1ZzMoIkFJWC9hdXRoZW50aWNhdGUgcmVzdWx0ICVkLCBhdXRobXNnICUuMTAwcyIsIHJlc3VsdCwKLQkJICAgIGF1dGhtc2cpOwotCX0gd2hpbGUgKHJlZW50ZXIpOwotCi0JaWYgKCFhaXhfdmFsaWRfYXV0aGVudGljYXRpb25zKG5hbWUpKQotCQlyZXN1bHQgPSAtMTsKLQotCWlmIChyZXN1bHQgPT0gMCkgewotCQlhdXRoc3VjY2VzcyA9IDE7Ci0KLQkJLyoKLQkJICogUmVjb3JkIHN1Y2Nlc3NmdWwgbG9naW4uICBXZSBkb24ndCBoYXZlIGEgcHR5IHlldCwgc28ganVzdAotCQkgKiBsYWJlbCB0aGUgbGluZSBhcyAic3NoIgotCQkgKi8KLQkJYWl4X3NldGF1dGhkYihuYW1lKTsKLQotCQkvKgotCQkgKiBDaGVjayBpZiB0aGUgdXNlcidzIHBhc3N3b3JkIGlzIGV4cGlyZWQuCi0JCSAqLwotCQlleHBpcmVkID0gcGFzc3dkZXhwaXJlZChuYW1lLCAmbXNnKTsKLQkJaWYgKG1zZyAmJiAqbXNnKSB7Ci0JCQlidWZmZXJfYXBwZW5kKGN0eHQtPmxvZ2lubXNnLCBtc2csIHN0cmxlbihtc2cpKTsKLQkJCWFpeF9yZW1vdmVfZW1iZWRkZWRfbmV3bGluZXMobXNnKTsKLQkJfQotCQlkZWJ1ZzMoIkFJWC9wYXNzd2RleHBpcmVkIHJldHVybmVkICVkIG1zZyAlLjEwMHMiLCBleHBpcmVkLCBtc2cpOwotCi0JCXN3aXRjaCAoZXhwaXJlZCkgewotCQljYXNlIDA6IC8qIHBhc3N3b3JkIG5vdCBleHBpcmVkICovCi0JCQlicmVhazsKLQkJY2FzZSAxOiAvKiBleHBpcmVkLCBwYXNzd29yZCBjaGFuZ2UgcmVxdWlyZWQgKi8KLQkJCWN0eHQtPmZvcmNlX3B3Y2hhbmdlID0gMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OiAvKiB1c2VyIGNhbid0IGNoYW5nZSgyKSBvciBvdGhlciBlcnJvciAoLTEpICovCi0JCQlsb2dpdCgiUGFzc3dvcmQgY2FuJ3QgYmUgY2hhbmdlZCBmb3IgdXNlciAlczogJS4xMDBzIiwKLQkJCSAgICBuYW1lLCBtc2cpOwotCQkJaWYgKG1zZykKLQkJCQl4ZnJlZShtc2cpOwotCQkJYXV0aHN1Y2Nlc3MgPSAwOwotCQl9Ci0KLQkJYWl4X3Jlc3RvcmVhdXRoZGIoKTsKLQl9Ci0KLQlpZiAoYXV0aG1zZyAhPSBOVUxMKQotCQl4ZnJlZShhdXRobXNnKTsKLQotCXJldHVybiBhdXRoc3VjY2VzczsKLX0KLQotLyoKLSAqIENoZWNrIGlmIHNwZWNpZmllZCBhY2NvdW50IGlzIHBlcm1pdHRlZCB0byBsb2cgaW4uCi0gKiBSZXR1cm5zIDEgaWYgbG9naW4gaXMgYWxsb3dlZCwgMCBpZiBub3QgYWxsb3dlZC4KLSAqLwotaW50Ci1zeXNfYXV0aF9hbGxvd2VkX3VzZXIoc3RydWN0IHBhc3N3ZCAqcHcsIEJ1ZmZlciAqbG9naW5tc2cpCi17Ci0JY2hhciAqbXNnID0gTlVMTDsKLQlpbnQgcmVzdWx0LCBwZXJtaXR0ZWQgPSAwOwotCXN0cnVjdCBzdGF0IHN0OwotCi0JLyoKLQkgKiBEb24ndCBwZXJmb3JtIGNoZWNrcyBmb3Igcm9vdCBhY2NvdW50IChQZXJtaXRSb290TG9naW4gY29udHJvbHMKLQkgKiBsb2dpbnMgdmlhIHNzaCkgb3IgaWYgcnVubmluZyBhcyBub24tcm9vdCB1c2VyIChzaW5jZQotCSAqIGxvZ2lucmVzdHJpY3Rpb25zIHdpbGwgYWx3YXlzIGZhaWwgZHVlIHRvIGluc3VmZmljaWVudCBwcml2aWxlZ2UpLgotCSAqLwotCWlmIChwdy0+cHdfdWlkID09IDAgfHwgZ2V0ZXVpZCgpICE9IDApIHsKLQkJZGVidWczKCIlczogbm90IGNoZWNraW5nIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlyZXN1bHQgPSBsb2dpbnJlc3RyaWN0aW9ucyhwdy0+cHdfbmFtZSwgU19STE9HSU4sIE5VTEwsICZtc2cpOwotCWlmIChyZXN1bHQgPT0gMCkKLQkJcGVybWl0dGVkID0gMTsKLQkvKgotCSAqIElmIHJlc3RyaWN0ZWQgYmVjYXVzZSAvZXRjL25vbG9naW4gZXhpc3RzLCB0aGUgbG9naW4gd2lsbCBiZSBkZW5pZWQKLQkgKiBpbiBzZXNzaW9uLmMgYWZ0ZXIgdGhlIG5vbG9naW4gbWVzc2FnZSBpcyBzZW50LCBzbyBhbGxvdyBmb3Igbm93Ci0JICogYW5kIGRvIG5vdCBhcHBlbmQgdGhlIHJldHVybmVkIG1lc3NhZ2UuCi0JICovCi0JaWYgKHJlc3VsdCA9PSAtMSAmJiBlcnJubyA9PSBFUEVSTSAmJiBzdGF0KF9QQVRIX05PTE9HSU4sICZzdCkgPT0gMCkKLQkJcGVybWl0dGVkID0gMTsKLQllbHNlIGlmIChtc2cgIT0gTlVMTCkKLQkJYnVmZmVyX2FwcGVuZChsb2dpbm1zZywgbXNnLCBzdHJsZW4obXNnKSk7Ci0JaWYgKG1zZyA9PSBOVUxMKQotCQltc2cgPSB4c3RyZHVwKCIobm9uZSkiKTsKLQlhaXhfcmVtb3ZlX2VtYmVkZGVkX25ld2xpbmVzKG1zZyk7Ci0JZGVidWczKCJBSVgvbG9naW5yZXN0cmljdGlvbnMgcmV0dXJuZWQgJWQgbXNnICUuMTAwcyIsIHJlc3VsdCwgbXNnKTsKLQotCWlmICghcGVybWl0dGVkKQotCQlsb2dpdCgiTG9naW4gcmVzdHJpY3RlZCBmb3IgJXM6ICUuMTAwcyIsIHB3LT5wd19uYW1lLCBtc2cpOwotCXhmcmVlKG1zZyk7Ci0JcmV0dXJuIHBlcm1pdHRlZDsKLX0KLQotaW50Ci1zeXNfYXV0aF9yZWNvcmRfbG9naW4oY29uc3QgY2hhciAqdXNlciwgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqdHR5bm0sCi0gICAgQnVmZmVyICpsb2dpbm1zZykKLXsKLQljaGFyICptc2cgPSBOVUxMOwotCWludCBzdWNjZXNzID0gMDsKLQotCWFpeF9zZXRhdXRoZGIodXNlcik7Ci0JaWYgKGxvZ2luc3VjY2VzcygoY2hhciAqKXVzZXIsIChjaGFyICopaG9zdCwgKGNoYXIgKil0dHlubSwgJm1zZykgPT0gMCkgewotCQlzdWNjZXNzID0gMTsKLQkJaWYgKG1zZyAhPSBOVUxMKSB7Ci0JCQlkZWJ1ZygiQUlYL2xvZ2luc3VjY2VzczogbXNnICVzIiwgbXNnKTsKLQkJCWlmIChsYXN0bG9naW5fbXNnID09IE5VTEwpCi0JCQkJbGFzdGxvZ2luX21zZyA9IG1zZzsKLQkJfQotCX0KLQlhaXhfcmVzdG9yZWF1dGhkYigpOwotCXJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLWNoYXIgKgotc3lzX2F1dGhfZ2V0X2xhc3Rsb2dpbl9tc2coY29uc3QgY2hhciAqdXNlciwgdWlkX3QgdWlkKQotewotCWNoYXIgKm1zZyA9IGxhc3Rsb2dpbl9tc2c7Ci0KLQlsYXN0bG9naW5fbXNnID0gTlVMTDsKLQlyZXR1cm4gbXNnOwotfQotCi0jICBpZmRlZiBDVVNUT01fRkFJTEVEX0xPR0lOCi0vKgotICogcmVjb3JkX2ZhaWxlZF9sb2dpbjogZ2VuZXJpYyAibG9naW4gZmFpbGVkIiBpbnRlcmZhY2UgZnVuY3Rpb24KLSAqLwotdm9pZAotcmVjb3JkX2ZhaWxlZF9sb2dpbihjb25zdCBjaGFyICp1c2VyLCBjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3QgY2hhciAqdHR5bmFtZSkKLXsKLQlpZiAoZ2V0ZXVpZCgpICE9IDApCi0JCXJldHVybjsKLQotCWFpeF9zZXRhdXRoZGIodXNlcik7Ci0jICAgaWZkZWYgQUlYX0xPR0lORkFJTEVEXzRBUkcKLQlsb2dpbmZhaWxlZCgoY2hhciAqKXVzZXIsIChjaGFyICopaG9zdG5hbWUsIChjaGFyICopdHR5bmFtZSwKLQkgICAgQVVESVRfRkFJTF9BVVRIKTsKLSMgICBlbHNlCi0JbG9naW5mYWlsZWQoKGNoYXIgKil1c2VyLCAoY2hhciAqKWhvc3RuYW1lLCAoY2hhciAqKXR0eW5hbWUpOwotIyAgIGVuZGlmCi0JYWl4X3Jlc3RvcmVhdXRoZGIoKTsKLX0KLSMgIGVuZGlmIC8qIENVU1RPTV9GQUlMRURfTE9HSU4gKi8KLQotLyoKLSAqIElmIHdlIGhhdmUgc2V0YXV0aGRiLCByZXRyaWV2ZSB0aGUgcGFzc3dvcmQgcmVnaXN0cnkgZm9yIHRoZSB1c2VyJ3MKLSAqIGFjY291bnQgdGhlbiBmZWVkIGl0IHRvIHNldGF1dGhkYi4gIFRoaXMgd2lsbCBtZWFuIHRoYXQgc3Vic2VxdWVudCBBSVggYXV0aAotICogZnVuY3Rpb25zIHdpbGwgb25seSB1c2UgdGhlIHNwZWNpZmllZCBsb2FkYWJsZSBtb2R1bGUuICBJZiB3ZSBkb24ndCBoYXZlCi0gKiBzZXRhdXRoZGIgdGhpcyBpcyBhIG5vLW9wLgotICovCi12b2lkCi1haXhfc2V0YXV0aGRiKGNvbnN0IGNoYXIgKnVzZXIpCi17Ci0jICBpZmRlZiBIQVZFX1NFVEFVVEhEQgotCWNoYXIgKnJlZ2lzdHJ5OwotCi0JaWYgKHNldHVzZXJkYihTX1JFQUQpID09IC0xKSB7Ci0JCWRlYnVnMygiJXM6IENvdWxkIG5vdCBvcGVuIHVzZXJkYiB0byByZWFkIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCQotCWlmIChnZXR1c2VyYXR0cigoY2hhciAqKXVzZXIsIFNfUkVHSVNUUlksICZyZWdpc3RyeSwgU0VDX0NIQVIpID09IDApIHsKLQkJaWYgKHNldGF1dGhkYihyZWdpc3RyeSwgb2xkX3JlZ2lzdHJ5KSA9PSAwKQotCQkJZGVidWczKCJBSVgvc2V0YXV0aGRiIHNldCByZWdpc3RyeSAnJXMnIiwgcmVnaXN0cnkpOwotCQllbHNlIAotCQkJZGVidWczKCJBSVgvc2V0YXV0aGRiIHNldCByZWdpc3RyeSAnJXMnIGZhaWxlZDogJXMiLAotCQkJICAgIHJlZ2lzdHJ5LCBzdHJlcnJvcihlcnJubykpOwotCX0gZWxzZQotCQlkZWJ1ZzMoIiVzOiBDb3VsZCBub3QgcmVhZCBTX1JFR0lTVFJZIGZvciB1c2VyOiAlcyIsIF9fZnVuY19fLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQllbmR1c2VyZGIoKTsKLSMgIGVuZGlmIC8qIEhBVkVfU0VUQVVUSERCICovCi19Ci0KLS8qCi0gKiBSZXN0b3JlIHRoZSB1c2VyJ3MgcmVnaXN0cnkgc2V0dGluZ3MgZnJvbSBvbGRfcmVnaXN0cnkuCi0gKiBOb3RlIHRoYXQgaWYgdGhlIGZpcnN0IGFpeF9zZXRhdXRoZGIgZmFpbHMsIHNldGF1dGhkYigiIikgaXMgc3RpbGwgc2FmZQotICogKGl0IHJlc3RvcmVzIHRoZSBzeXN0ZW0gZGVmYXVsdCBiZWhhdmlvdXIpLiAgSWYgd2UgZG9uJ3QgaGF2ZSBzZXRhdXRoZGIsCi0gKiB0aGlzIGlzIGEgbm8tb3AuCi0gKi8KLXZvaWQKLWFpeF9yZXN0b3JlYXV0aGRiKHZvaWQpCi17Ci0jICBpZmRlZiBIQVZFX1NFVEFVVEhEQgotCWlmIChzZXRhdXRoZGIob2xkX3JlZ2lzdHJ5LCBOVUxMKSA9PSAwKQotCQlkZWJ1ZzMoIiVzOiByZXN0b3Jpbmcgb2xkIHJlZ2lzdHJ5ICclcyciLCBfX2Z1bmNfXywKLQkJICAgIG9sZF9yZWdpc3RyeSk7Ci0JZWxzZQotCQlkZWJ1ZzMoIiVzOiBmYWlsZWQgdG8gcmVzdG9yZSBvbGQgcmVnaXN0cnkgJXMiLCBfX2Z1bmNfXywKLQkJICAgIG9sZF9yZWdpc3RyeSk7Ci0jICBlbmRpZiAvKiBIQVZFX1NFVEFVVEhEQiAqLwotfQotCi0jIGVuZGlmIC8qIFdJVEhfQUlYQVVUSEVOVElDQVRFICovCi0KLSMgaWZkZWYgVVNFX0FJWF9LUkJfTkFNRQotLyoKLSAqIGFpeF9rcmI1X2dldF9wcmluY2lwYWxfbmFtZTogcmV0dXJucyB0aGUgdXNlcidzIGtlcmJlcm9zIGNsaWVudCBwcmluY2lwYWwgbmFtZSBpZgotICogY29uZmlndXJlZCwgb3RoZXJ3aXNlIE5VTEwuICBDYWxsZXIgbXVzdCBmcmVlIHJldHVybmVkIHN0cmluZy4KLSAqLwotY2hhciAqCi1haXhfa3JiNV9nZXRfcHJpbmNpcGFsX25hbWUoY2hhciAqcHdfbmFtZSkKLXsKLQljaGFyICphdXRobmFtZSA9IE5VTEwsICphdXRoZG9tYWluID0gTlVMTCwgKnByaW5jaXBhbCA9IE5VTEw7Ci0KLQlzZXR1c2VyZGIoU19SRUFEKTsKLQlpZiAoZ2V0dXNlcmF0dHIocHdfbmFtZSwgU19BVVRIRE9NQUlOLCAmYXV0aGRvbWFpbiwgU0VDX0NIQVIpICE9IDApCi0JCWRlYnVnKCJBSVggZ2V0dXNlcmF0dHIgU19BVVRIRE9NQUlOOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JaWYgKGdldHVzZXJhdHRyKHB3X25hbWUsIFNfQVVUSE5BTUUsICZhdXRobmFtZSwgU0VDX0NIQVIpICE9IDApCi0JCWRlYnVnKCJBSVggZ2V0dXNlcmF0dHIgU19BVVRITkFNRTogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCi0JaWYgKGF1dGhkb21haW4gIT0gTlVMTCkKLQkJeGFzcHJpbnRmKCZwcmluY2lwYWwsICIlc0AlcyIsIGF1dGhuYW1lID8gYXV0aG5hbWUgOiBwd19uYW1lLCBhdXRoZG9tYWluKTsKLQllbHNlIGlmIChhdXRobmFtZSAhPSBOVUxMKQotCQlwcmluY2lwYWwgPSB4c3RyZHVwKGF1dGhuYW1lKTsKLQllbmR1c2VyZGIoKTsKLQlyZXR1cm4gcHJpbmNpcGFsOwotfQotIyBlbmRpZiAvKiBVU0VfQUlYX0tSQl9OQU1FICovCi0KLSMgaWYgZGVmaW5lZChBSVhfR0VUTkFNRUlORk9fSEFDSykgJiYgIWRlZmluZWQoQlJPS0VOX0FERFJJTkZPKQotIyB1bmRlZiBnZXRuYW1laW5mbwotLyoKLSAqIEZvciBzb21lIHJlYXNvbiwgQUlYJ3MgZ2V0bmFtZWluZm8gd2lsbCByZWZ1c2UgdG8gcmVzb2x2ZSB0aGUgYWxsLXplcm9zCi0gKiBJUHY2IGFkZHJlc3MgaW50byBpdHMgdGV4dHVhbCByZXByZXNlbnRhdGlvbiAoIjo6IiksIHNvIHdlIHdyYXAgaXQKLSAqIHdpdGggYSBmdW5jdGlvbiB0aGF0IHdpbGwuCi0gKi8KLWludAotc3NoYWl4X2dldG5hbWVpbmZvKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EsIHNpemVfdCBzYWxlbiwgY2hhciAqaG9zdCwKLSAgICBzaXplX3QgaG9zdGxlbiwgY2hhciAqc2Vydiwgc2l6ZV90IHNlcnZsZW4sIGludCBmbGFncykKLXsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzYTY7Ci0JdV9pbnQzMl90ICphNjsKLQotCWlmIChmbGFncyAmIChOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVikgJiYKLQkgICAgc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgewotCQlzYTYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhOwotCQlhNiA9IHNhNi0+c2luNl9hZGRyLnU2X2FkZHIudTZfYWRkcjMyOwotCi0JCWlmIChhNlswXSA9PSAwICYmIGE2WzFdID09IDAgJiYgYTZbMl0gPT0gMCAmJiBhNlszXSA9PSAwKSB7Ci0JCQlzdHJsY3B5KGhvc3QsICI6OiIsIGhvc3RsZW4pOwotCQkJc25wcmludGYoc2Vydiwgc2VydmxlbiwgIiVkIiwgc2E2LT5zaW42X3BvcnQpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIGdldG5hbWVpbmZvKHNhLCBzYWxlbiwgaG9zdCwgaG9zdGxlbiwgc2Vydiwgc2VydmxlbiwgZmxhZ3MpOwotfQotIyBlbmRpZiAvKiBBSVhfR0VUTkFNRUlORk9fSEFDSyAqLwotCi0jIGlmIGRlZmluZWQoVVNFX0dFVEdSU0VUKQotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci1pbnQKLWdldGdyb3VwbGlzdChjb25zdCBjaGFyICp1c2VyLCBnaWRfdCBwZ2lkLCBnaWRfdCAqZ3JvdXBzLCBpbnQgKmdycGNudCkKLXsKLQljaGFyICpjcCwgKmdycGxpc3QsICpncnA7Ci0JZ2lkX3QgZ2lkOwotCWludCByZXQgPSAwLCBuZ3JvdXBzID0gMCwgbWF4Z3JvdXBzOwotCWxvbmcgbDsKLQotCW1heGdyb3VwcyA9ICpncnBjbnQ7Ci0KLQlpZiAoKGNwID0gZ3JwbGlzdCA9IGdldGdyc2V0KHVzZXIpKSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBoYW5kbGUgemVyby1sZW5ndGggY2FzZSAqLwotCWlmIChtYXhncm91cHMgPD0gMCkgewotCQkqZ3JwY250ID0gMDsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGNvcHkgcHJpbWFyeSBncm91cCAqLwotCWdyb3Vwc1tuZ3JvdXBzKytdID0gcGdpZDsKLQotCS8qIGNvcHkgZWFjaCBlbnRyeSBmcm9tIGdldGdyc2V0IGludG8gZ3JvdXAgbGlzdCAqLwotCXdoaWxlICgoZ3JwID0gc3Ryc2VwKCZncnBsaXN0LCAiLCIpKSAhPSBOVUxMKSB7Ci0JCWwgPSBzdHJ0b2woZ3JwLCBOVUxMLCAxMCk7Ci0JCWlmIChuZ3JvdXBzID49IG1heGdyb3VwcyB8fCBsID09IExPTkdfTUlOIHx8IGwgPT0gTE9OR19NQVgpIHsKLQkJCXJldCA9IC0xOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJZ2lkID0gKGdpZF90KWw7Ci0JCWlmIChnaWQgPT0gcGdpZCkKLQkJCWNvbnRpbnVlOwkvKiB3ZSBoYXZlIGFscmVhZHkgYWRkZWQgcHJpbWFyeSBnaWQgKi8KLQkJZ3JvdXBzW25ncm91cHMrK10gPSBnaWQ7Ci0JfQotb3V0OgotCWZyZWUoY3ApOwotCSpncnBjbnQgPSBuZ3JvdXBzOwotCXJldHVybiByZXQ7Ci19Ci0jIGVuZGlmCS8qIFVTRV9HRVRHUlNFVCAqLwotCi0jZW5kaWYgLyogX0FJWCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvcG9ydC1haXguaCBiL29wZW5ic2QtY29tcGF0L3BvcnQtYWl4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZTRlODguLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvcG9ydC1haXguaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKiAkSWQ6IHBvcnQtYWl4LmgsdiAxLjMyIDIwMDkvMTIvMjAgMjM6NDk6MjIgZHR1Y2tlciBFeHAgJCAqLwotCi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBHZXJ0IERvZXJpbmcuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDUsMjAwNiBEYXJyZW4gVHVja2VyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmZGVmIF9BSVgKLQotI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICi0jIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0KLS8qIFRoZXNlIHNob3VsZCBiZSBpbiB0aGUgc3lzdGVtIGhlYWRlcnMgYnV0IGFyZSBub3QuICovCi1pbnQgdXNyaW5mbyhpbnQsIGNoYXIgKiwgaW50KTsKLSNpZiBkZWZpbmVkKEhBVkVfREVDTF9TRVRBVVRIREIpICYmIChIQVZFX0RFQ0xfU0VUQVVUSERCID09IDApCi1pbnQgc2V0YXV0aGRiKGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKLSNlbmRpZgotLyogdGhlc2UgbWF5IG9yIG1heSBub3QgYmUgaW4gdGhlIGhlYWRlcnMgZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uICovCi0jaWYgZGVmaW5lZChIQVZFX0RFQ0xfQVVUSEVOVElDQVRFKSAmJiAoSEFWRV9ERUNMX0FVVEhFTlRJQ0FURSA9PSAwKQotaW50IGF1dGhlbnRpY2F0ZShjaGFyICosIGNoYXIgKiwgaW50ICosIGNoYXIgKiopOwotI2VuZGlmCi0jaWYgZGVmaW5lZChIQVZFX0RFQ0xfTE9HSU5GQUlMRUQpICYmIChIQVZFX0RFQ0xfTE9HSU5GQUlMRUQgPT0gMCkKLWludCBsb2dpbmZhaWxlZChjaGFyICosIGNoYXIgKiwgY2hhciAqKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoSEFWRV9ERUNMX0xPR0lOUkVTVFJJQ1RJT05TKSAmJiAoSEFWRV9ERUNMX0xPR0lOUkVTVFJJQ1RJT05TID09IDApCi1pbnQgbG9naW5yZXN0cmljdGlvbnMoY2hhciAqLCBpbnQsIGNoYXIgKiwgY2hhciAqKik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKEhBVkVfREVDTF9MT0dJTlNVQ0NFU1MpICYmIChIQVZFX0RFQ0xfTE9HSU5TVUNDRVNTID09IDApCi1pbnQgbG9naW5zdWNjZXNzKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiopOwotI2VuZGlmCi0jaWYgZGVmaW5lZChIQVZFX0RFQ0xfUEFTU1dERVhQSVJFRCkgJiYgKEhBVkVfREVDTF9QQVNTV0RFWFBJUkVEID09IDApCi1pbnQgcGFzc3dkZXhwaXJlZChjaGFyICosIGNoYXIgKiopOwotI2VuZGlmCi0KLS8qIFNvbWUgdmVyc2lvbnMgZGVmaW5lIHJfdHlwZSBpbiB0aGUgYWJvdmUgaGVhZGVycywgd2hpY2ggY2F1c2VzIGEgY29uZmxpY3QgKi8KLSNpZmRlZiByX3R5cGUKLSMgdW5kZWYgcl90eXBlCi0jZW5kaWYKLQotLyogQUlYIDQuMi54IGRvZXNuJ3QgaGF2ZSBuYW5vc2xlZXAgYnV0IGRvZXMgaGF2ZSBuc2xlZXAgd2hpY2ggaXMgZXF1aXZhbGVudCAqLwotI2lmICFkZWZpbmVkKEhBVkVfTkFOT1NMRUVQKSAmJiBkZWZpbmVkKEhBVkVfTlNMRUVQKQotIyBkZWZpbmUgbmFub3NsZWVwKGEsYikgbnNsZWVwKGEsYikKLSNlbmRpZgotCi0vKiBGb3Igc3RydWN0IHRpbWVzcGVjIG9uIEFJWCA0LjIueCAqLwotI2lmZGVmIEhBVkVfU1lTX1RJTUVSU19ICi0jIGluY2x1ZGUgPHN5cy90aW1lcnMuaD4KLSNlbmRpZgotCi0vKiBmb3Igc2V0cGNyZWQgYW5kIGZyaWVuZHMgKi8KLSNpZmRlZiBIQVZFX1VTRVJTRUNfSAotIyBpbmNsdWRlIDx1c2Vyc2VjLmg+Ci0jZW5kaWYKLQotLyoKLSAqIEFjY29yZGluZyB0byB0aGUgc2V0YXV0aGRiIG1hbiBwYWdlLCBBSVggcGFzc3dvcmQgcmVnaXN0cmllcyBtdXN0IGJlIDE1Ci0gKiBjaGFycyBvciBsZXNzIHBsdXMgdGVybWluYXRpbmcgTlVMLgotICovCi0jaWZkZWYgSEFWRV9TRVRBVVRIREIKLSMgZGVmaW5lIFJFR0lTVFJZX1NJWkUJMTYKLSNlbmRpZgotCi12b2lkIGFpeF91c3JpbmZvKHN0cnVjdCBwYXNzd2QgKik7Ci0KLSNpZmRlZiBXSVRIX0FJWEFVVEhFTlRJQ0FURQotIyBkZWZpbmUgQ1VTVE9NX1NZU19BVVRIX1BBU1NXRCAxCi0jIGRlZmluZSBDVVNUT01fU1lTX0FVVEhfQUxMT1dFRF9VU0VSIDEKLWludCBzeXNfYXV0aF9hbGxvd2VkX3VzZXIoc3RydWN0IHBhc3N3ZCAqLCBCdWZmZXIgKik7Ci0jIGRlZmluZSBDVVNUT01fU1lTX0FVVEhfUkVDT1JEX0xPR0lOIDEKLWludCBzeXNfYXV0aF9yZWNvcmRfbG9naW4oY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgQnVmZmVyICopOwotIyBkZWZpbmUgQ1VTVE9NX1NZU19BVVRIX0dFVF9MQVNUTE9HSU5fTVNHCi1jaGFyICpzeXNfYXV0aF9nZXRfbGFzdGxvZ2luX21zZyhjb25zdCBjaGFyICosIHVpZF90KTsKLSMgZGVmaW5lIENVU1RPTV9GQUlMRURfTE9HSU4gMQotIyBpZiBkZWZpbmVkKFNfQVVUSERPTUFJTikgICYmIGRlZmluZWQgKFNfQVVUSE5BTUUpCi0jIGRlZmluZSBVU0VfQUlYX0tSQl9OQU1FCi1jaGFyICphaXhfa3JiNV9nZXRfcHJpbmNpcGFsX25hbWUoY2hhciAqKTsKLSMgZW5kaWYKLSNlbmRpZgotCi12b2lkIGFpeF9zZXRhdXRoZGIoY29uc3QgY2hhciAqKTsKLXZvaWQgYWl4X3Jlc3RvcmVhdXRoZGIodm9pZCk7Ci12b2lkIGFpeF9yZW1vdmVfZW1iZWRkZWRfbmV3bGluZXMoY2hhciAqKTsKLQotI2lmIGRlZmluZWQoQUlYX0dFVE5BTUVJTkZPX0hBQ0spICYmICFkZWZpbmVkKEJST0tFTl9HRVRBRERSSU5GTykKLSMgaWZkZWYgZ2V0bmFtZWluZm8KLSMgIHVuZGVmIGdldG5hbWVpbmZvCi0jIGVuZGlmCi1pbnQgc3NoYWl4X2dldG5hbWVpbmZvKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqLCBzaXplX3QsIGNoYXIgKiwgc2l6ZV90LAotICAgIGNoYXIgKiwgc2l6ZV90LCBpbnQpOwotIyBkZWZpbmUgZ2V0bmFtZWluZm8oYSxiLGMsZCxlLGYsZykgKHNzaGFpeF9nZXRuYW1laW5mbyhhLGIsYyxkLGUsZixnKSkKLSNlbmRpZgotCi0vKgotICogV2UgdXNlIGdldGdyc2V0IGluIHByZWZlcmVuY2UgdG8gbXVsdGlwbGUgZ2V0Z3JlbnQgY2FsbHMgZm9yIGVmZmljaWVuY3kKLSAqIHBsdXMgaXQgc3VwcG9ydHMgTklTIGFuZCBMREFQIGdyb3Vwcy4KLSAqLwotI2lmICFkZWZpbmVkKEhBVkVfR0VUR1JPVVBMSVNUKSAmJiBkZWZpbmVkKEhBVkVfR0VUR1JTRVQpCi0jIGRlZmluZSBIQVZFX0dFVEdST1VQTElTVAotIyBkZWZpbmUgVVNFX0dFVEdSU0VUCi1pbnQgZ2V0Z3JvdXBsaXN0KGNvbnN0IGNoYXIgKiwgZ2lkX3QsIGdpZF90ICosIGludCAqKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogX0FJWCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvcG9ydC1pcml4LmMgYi9vcGVuYnNkLWNvbXBhdC9wb3J0LWlyaXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3NTFhNS4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9wb3J0LWlyaXguYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgRGVuaXMgUGFya2VyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwMCBNaWNoYWVsIFN0b25lLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpZiBkZWZpbmVkKFdJVEhfSVJJWF9QUk9KRUNUKSB8fCBcCi0gICAgZGVmaW5lZChXSVRIX0lSSVhfSk9CUykgfHwgXAotICAgIGRlZmluZWQoV0lUSF9JUklYX0FSUkFZKQotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2lmZGVmIFdJVEhfSVJJWF9QUk9KRUNUCi0jIGluY2x1ZGUgPHByb2ouaD4KLSNlbmRpZiAvKiBXSVRIX0lSSVhfUFJPSkVDVCAqLwotI2lmZGVmIFdJVEhfSVJJWF9KT0JTCi0jIGluY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2VuZGlmCi0jaWZkZWYgV0lUSF9JUklYX0FVRElUCi0jIGluY2x1ZGUgPHNhdC5oPgotI2VuZGlmIC8qIFdJVEhfSVJJWF9BVURJVCAqLwotCi12b2lkCi1pcml4X3NldHVzZXJjb250ZXh0KHN0cnVjdCBwYXNzd2QgKnB3KQotewotI2lmZGVmIFdJVEhfSVJJWF9QUk9KRUNUCi0gICAgICAgIHByaWRfdCBwcm9qaWQ7Ci0jZW5kaWYKLSNpZmRlZiBXSVRIX0lSSVhfSk9CUwotICAgICAgICBqaWRfdCBqaWQgPSAwOwotI2VsaWYgZGVmaW5lZChXSVRIX0lSSVhfQVJSQVkpCi0gICAgICAgIGludCBqaWQgPSAwOwotI2VuZGlmCi0KLSNpZmRlZiBXSVRIX0lSSVhfSk9CUwotICAgICAgICBqaWQgPSBqbGltaXRfc3RhcnRqb2IocHctPnB3X25hbWUsIHB3LT5wd191aWQsICJpbnRlcmFjdGl2ZSIpOwotICAgICAgICBpZiAoamlkID09IC0xKQotICAgICAgICAgICAgICAgIGZhdGFsKCJGYWlsZWQgdG8gY3JlYXRlIGpvYiBjb250YWluZXI6ICUuMTAwcyIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0jZW5kaWYgLyogV0lUSF9JUklYX0pPQlMgKi8KLSNpZmRlZiBXSVRIX0lSSVhfQVJSQVkKLSAgICAgICAgLyogaW5pdGlhbGl6ZSBhcnJheSBzZXNzaW9uICovCi0gICAgICAgIGlmIChqaWQgPT0gMCAgJiYgbmV3YXJyYXlzZXNzKCkgIT0gMCkKLSAgICAgICAgICAgICAgICBmYXRhbCgiRmFpbGVkIHRvIHNldCB1cCBuZXcgYXJyYXkgc2Vzc2lvbjogJS4xMDBzIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSNlbmRpZiAvKiBXSVRIX0lSSVhfQVJSQVkgKi8KLSNpZmRlZiBXSVRIX0lSSVhfUFJPSkVDVAotICAgICAgICAvKiBpbml0aWFsaXplIGlyaXggcHJvamVjdCBpbmZvICovCi0gICAgICAgIGlmICgocHJvamlkID0gZ2V0ZGZsdHByb2p1c2VyKHB3LT5wd19uYW1lKSkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBkZWJ1ZygiRmFpbGVkIHRvIGdldCBwcm9qZWN0IGlkLCB1c2luZyBwcm9qaWQgMCIpOwotICAgICAgICAgICAgICAgIHByb2ppZCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNldHByaWQocHJvamlkKSkKLSAgICAgICAgICAgICAgICBmYXRhbCgiRmFpbGVkIHRvIGluaXRpYWxpemUgcHJvamVjdCAlZCBmb3IgJXM6ICUuMTAwcyIsCi0gICAgICAgICAgICAgICAgICAgIChpbnQpcHJvamlkLCBwdy0+cHdfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLSNlbmRpZiAvKiBXSVRIX0lSSVhfUFJPSkVDVCAqLwotI2lmZGVmIFdJVEhfSVJJWF9BVURJVAotICAgICAgICBpZiAoc3lzY29uZihfU0NfQVVESVQpKSB7Ci0gICAgICAgICAgICAgICAgZGVidWcoIlNldHRpbmcgc2F0IGlkIHRvICVkIiwgKGludCkgcHctPnB3X3VpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNhdHNldGlkKHB3LT5wd191aWQpKQotICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoImVycm9yIHNldHRpbmcgc2F0aWQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKiBXSVRIX0lSSVhfQVVESVQgKi8KLX0KLQotCi0jZW5kaWYgLyogZGVmaW5lZChXSVRIX0lSSVhfUFJPSkVDVCkgfHwgZGVmaW5lZChXSVRIX0lSSVhfSk9CUykgfHwgZGVmaW5lZChXSVRIX0lSSVhfQVJSQVkpICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9wb3J0LWlyaXguaCBiL29wZW5ic2QtY29tcGF0L3BvcnQtaXJpeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2M0ODYzLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3BvcnQtaXJpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogJElkOiBwb3J0LWlyaXguaCx2IDEuNCAyMDAzLzA4LzI5IDE2OjU5OjUyIG1vdXJpbmcgRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBEZW5pcyBQYXJrZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDAwIE1pY2hhZWwgU3RvbmUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9QT1JUX0lSSVhfSAotI2RlZmluZSBfUE9SVF9JUklYX0gKLQotI2lmIGRlZmluZWQoV0lUSF9JUklYX1BST0pFQ1QpIHx8IFwKLSAgICBkZWZpbmVkKFdJVEhfSVJJWF9KT0JTKSB8fCBcCi0gICAgZGVmaW5lZChXSVRIX0lSSVhfQVJSQVkpCi0KLXZvaWQgaXJpeF9zZXR1c2VyY29udGV4dChzdHJ1Y3QgcGFzc3dkICpwdyk7Ci0KLSNlbmRpZiAvKiBkZWZpbmVkKFdJVEhfSVJJWF9QUk9KRUNUKSB8fCBkZWZpbmVkKFdJVEhfSVJJWF9KT0JTKSB8fCBkZWZpbmVkKFdJVEhfSVJJWF9BUlJBWSkgKi8KLQotI2VuZGlmIC8qICEgX1BPUlRfSVJJWF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9wb3J0LWxpbnV4LmMgYi9vcGVuYnNkLWNvbXBhdC9wb3J0LWxpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOGRmZjQuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvcG9ydC1saW51eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qICRJZDogcG9ydC1saW51eC5jLHYgMS4xNiAyMDExLzA4LzI5IDA2OjA5OjU3IGRqbSBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1IERhbmllbCBXYWxzaCA8ZHdhbHNoQHJlZGhhdC5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgRGFtaWVuIE1pbGxlciA8ZGptQG9wZW5ic2Qub3JnPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLS8qCi0gKiBMaW51eC1zcGVjaWZpYyBwb3J0YWJpbGl0eSBjb2RlIC0ganVzdCBTRUxpbnV4IHN1cHBvcnQgYXQgcHJlc2VudAotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWYgZGVmaW5lZChXSVRIX1NFTElOVVgpIHx8IGRlZmluZWQoTElOVVhfT09NX0FESlVTVCkKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAicG9ydC1saW51eC5oIgotCi0jaWZkZWYgV0lUSF9TRUxJTlVYCi0jaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+Ci0jaW5jbHVkZSA8c2VsaW51eC9mbGFzay5oPgotI2luY2x1ZGUgPHNlbGludXgvZ2V0X2NvbnRleHRfbGlzdC5oPgotCi0jaWZuZGVmIFNTSF9TRUxJTlVYX1VOQ09ORklORURfVFlQRQotIyBkZWZpbmUgU1NIX1NFTElOVVhfVU5DT05GSU5FRF9UWVBFICI6dW5jb25maW5lZF90OiIKLSNlbmRpZgotCi0vKiBXcmFwcGVyIGFyb3VuZCBpc19zZWxpbnV4X2VuYWJsZWQoKSB0byBsb2cgaXRzIHJldHVybiB2YWx1ZSBvbmNlIG9ubHkgKi8KLWludAotc3NoX3NlbGludXhfZW5hYmxlZCh2b2lkKQotewotCXN0YXRpYyBpbnQgZW5hYmxlZCA9IC0xOwotCi0JaWYgKGVuYWJsZWQgPT0gLTEpIHsKLQkJZW5hYmxlZCA9IChpc19zZWxpbnV4X2VuYWJsZWQoKSA9PSAxKTsKLQkJZGVidWcoIlNFTGludXggc3VwcG9ydCAlcyIsIGVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLQl9Ci0KLQlyZXR1cm4gKGVuYWJsZWQpOwotfQotCi0vKiBSZXR1cm4gdGhlIGRlZmF1bHQgc2VjdXJpdHkgY29udGV4dCBmb3IgdGhlIGdpdmVuIHVzZXJuYW1lICovCi1zdGF0aWMgc2VjdXJpdHlfY29udGV4dF90Ci1zc2hfc2VsaW51eF9nZXRjdHhieW5hbWUoY2hhciAqcHduYW1lKQotewotCXNlY3VyaXR5X2NvbnRleHRfdCBzYzsKLQljaGFyICpzZW5hbWUgPSBOVUxMLCAqbHZsID0gTlVMTDsKLQlpbnQgcjsKLQotI2lmZGVmIEhBVkVfR0VUU0VVU0VSQllOQU1FCi0JaWYgKGdldHNldXNlcmJ5bmFtZShwd25hbWUsICZzZW5hbWUsICZsdmwpICE9IDApCi0JCXJldHVybiBOVUxMOwotI2Vsc2UKLQlzZW5hbWUgPSBwd25hbWU7Ci0JbHZsID0gTlVMTDsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9HRVRfREVGQVVMVF9DT05URVhUX1dJVEhfTEVWRUwKLQlyID0gZ2V0X2RlZmF1bHRfY29udGV4dF93aXRoX2xldmVsKHNlbmFtZSwgbHZsLCBOVUxMLCAmc2MpOwotI2Vsc2UKLQlyID0gZ2V0X2RlZmF1bHRfY29udGV4dChzZW5hbWUsIE5VTEwsICZzYyk7Ci0jZW5kaWYKLQotCWlmIChyICE9IDApIHsKLQkJc3dpdGNoIChzZWN1cml0eV9nZXRlbmZvcmNlKCkpIHsKLQkJY2FzZSAtMToKLQkJCWZhdGFsKCIlczogc3NoX3NlbGludXhfZ2V0Y3R4YnluYW1lOiAiCi0JCQkgICAgInNlY3VyaXR5X2dldGVuZm9yY2UoKSBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCWNhc2UgMDoKLQkJCWVycm9yKCIlczogRmFpbGVkIHRvIGdldCBkZWZhdWx0IFNFTGludXggc2VjdXJpdHkgIgotCQkJICAgICJjb250ZXh0IGZvciAlcyIsIF9fZnVuY19fLCBwd25hbWUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlmYXRhbCgiJXM6IEZhaWxlZCB0byBnZXQgZGVmYXVsdCBTRUxpbnV4IHNlY3VyaXR5ICIKLQkJCSAgICAiY29udGV4dCBmb3IgJXMgKGluIGVuZm9yY2luZyBtb2RlKSIsCi0JCQkgICAgX19mdW5jX18sIHB3bmFtZSk7Ci0JCX0KLQl9Ci0KLSNpZmRlZiBIQVZFX0dFVFNFVVNFUkJZTkFNRQotCWlmIChzZW5hbWUgIT0gTlVMTCkKLQkJeGZyZWUoc2VuYW1lKTsKLQlpZiAobHZsICE9IE5VTEwpCi0JCXhmcmVlKGx2bCk7Ci0jZW5kaWYKLQotCXJldHVybiAoc2MpOwotfQotCi0vKiBTZXQgdGhlIGV4ZWN1dGlvbiBjb250ZXh0IHRvIHRoZSBkZWZhdWx0IGZvciB0aGUgc3BlY2lmaWVkIHVzZXIgKi8KLXZvaWQKLXNzaF9zZWxpbnV4X3NldHVwX2V4ZWNfY29udGV4dChjaGFyICpwd25hbWUpCi17Ci0Jc2VjdXJpdHlfY29udGV4dF90IHVzZXJfY3R4ID0gTlVMTDsKLQotCWlmICghc3NoX3NlbGludXhfZW5hYmxlZCgpKQotCQlyZXR1cm47Ci0KLQlkZWJ1ZzMoIiVzOiBzZXR0aW5nIGV4ZWN1dGlvbiBjb250ZXh0IiwgX19mdW5jX18pOwotCi0JdXNlcl9jdHggPSBzc2hfc2VsaW51eF9nZXRjdHhieW5hbWUocHduYW1lKTsKLQlpZiAoc2V0ZXhlY2Nvbih1c2VyX2N0eCkgIT0gMCkgewotCQlzd2l0Y2ggKHNlY3VyaXR5X2dldGVuZm9yY2UoKSkgewotCQljYXNlIC0xOgotCQkJZmF0YWwoIiVzOiBzZWN1cml0eV9nZXRlbmZvcmNlKCkgZmFpbGVkIiwgX19mdW5jX18pOwotCQljYXNlIDA6Ci0JCQllcnJvcigiJXM6IEZhaWxlZCB0byBzZXQgU0VMaW51eCBleGVjdXRpb24gIgotCQkJICAgICJjb250ZXh0IGZvciAlcyIsIF9fZnVuY19fLCBwd25hbWUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlmYXRhbCgiJXM6IEZhaWxlZCB0byBzZXQgU0VMaW51eCBleGVjdXRpb24gY29udGV4dCAiCi0JCQkgICAgImZvciAlcyAoaW4gZW5mb3JjaW5nIG1vZGUpIiwgX19mdW5jX18sIHB3bmFtZSk7Ci0JCX0KLQl9Ci0JaWYgKHVzZXJfY3R4ICE9IE5VTEwpCi0JCWZyZWVjb24odXNlcl9jdHgpOwotCi0JZGVidWczKCIlczogZG9uZSIsIF9fZnVuY19fKTsKLX0KLQotLyogU2V0IHRoZSBUVFkgY29udGV4dCBmb3IgdGhlIHNwZWNpZmllZCB1c2VyICovCi12b2lkCi1zc2hfc2VsaW51eF9zZXR1cF9wdHkoY2hhciAqcHduYW1lLCBjb25zdCBjaGFyICp0dHkpCi17Ci0Jc2VjdXJpdHlfY29udGV4dF90IG5ld190dHlfY3R4ID0gTlVMTDsKLQlzZWN1cml0eV9jb250ZXh0X3QgdXNlcl9jdHggPSBOVUxMOwotCXNlY3VyaXR5X2NvbnRleHRfdCBvbGRfdHR5X2N0eCA9IE5VTEw7Ci0KLQlpZiAoIXNzaF9zZWxpbnV4X2VuYWJsZWQoKSkKLQkJcmV0dXJuOwotCi0JZGVidWczKCIlczogc2V0dGluZyBUVFkgY29udGV4dCBvbiAlcyIsIF9fZnVuY19fLCB0dHkpOwotCi0JdXNlcl9jdHggPSBzc2hfc2VsaW51eF9nZXRjdHhieW5hbWUocHduYW1lKTsKLQotCS8qIFhYWDogc2hvdWxkIHRoZXNlIGNhbGxzIGZhdGFsKCkgdXBvbiBmYWlsdXJlIGluIGVuZm9yY2luZyBtb2RlPyAqLwotCi0JaWYgKGdldGZpbGVjb24odHR5LCAmb2xkX3R0eV9jdHgpID09IC0xKSB7Ci0JCWVycm9yKCIlczogZ2V0ZmlsZWNvbjogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHNlY3VyaXR5X2NvbXB1dGVfcmVsYWJlbCh1c2VyX2N0eCwgb2xkX3R0eV9jdHgsCi0JICAgIFNFQ0NMQVNTX0NIUl9GSUxFLCAmbmV3X3R0eV9jdHgpICE9IDApIHsKLQkJZXJyb3IoIiVzOiBzZWN1cml0eV9jb21wdXRlX3JlbGFiZWw6ICVzIiwKLQkJICAgIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoc2V0ZmlsZWNvbih0dHksIG5ld190dHlfY3R4KSAhPSAwKQotCQllcnJvcigiJXM6IHNldGZpbGVjb246ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gb3V0OgotCWlmIChuZXdfdHR5X2N0eCAhPSBOVUxMKQotCQlmcmVlY29uKG5ld190dHlfY3R4KTsKLQlpZiAob2xkX3R0eV9jdHggIT0gTlVMTCkKLQkJZnJlZWNvbihvbGRfdHR5X2N0eCk7Ci0JaWYgKHVzZXJfY3R4ICE9IE5VTEwpCi0JCWZyZWVjb24odXNlcl9jdHgpOwotCWRlYnVnMygiJXM6IGRvbmUiLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQKLXNzaF9zZWxpbnV4X2NoYW5nZV9jb250ZXh0KGNvbnN0IGNoYXIgKm5ld25hbWUpCi17Ci0JaW50IGxlbiwgbmV3bGVuOwotCWNoYXIgKm9sZGN0eCwgKm5ld2N0eCwgKmN4OwotCXZvaWQgKCpzd2l0Y2hsb2cpIChjb25zdCBjaGFyICpmbXQsLi4uKSA9IGxvZ2l0OwotCi0JaWYgKCFzc2hfc2VsaW51eF9lbmFibGVkKCkpCi0JCXJldHVybjsKLQotCWlmIChnZXRjb24oKHNlY3VyaXR5X2NvbnRleHRfdCAqKSZvbGRjdHgpIDwgMCkgewotCQlsb2dpdCgiJXM6IGdldGNvbiBmYWlsZWQgd2l0aCAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm47Ci0JfQotCWlmICgoY3ggPSBpbmRleChvbGRjdHgsICc6JykpID09IE5VTEwgfHwgKGN4ID0gaW5kZXgoY3ggKyAxLCAnOicpKSA9PQotCSAgICBOVUxMKSB7Ci0JCWxvZ2l0ICgiJXM6IHVucGFyc2VhYmxlIGNvbnRleHQgJXMiLCBfX2Z1bmNfXywgb2xkY3R4KTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogQ2hlY2sgd2hldGhlciB3ZSBhcmUgYXR0ZW1wdGluZyB0byBzd2l0Y2ggYXdheSBmcm9tIGFuIHVuY29uZmluZWQKLQkgKiBzZWN1cml0eSBjb250ZXh0LgotCSAqLwotCWlmIChzdHJuY21wKGN4LCBTU0hfU0VMSU5VWF9VTkNPTkZJTkVEX1RZUEUsCi0JICAgIHNpemVvZihTU0hfU0VMSU5VWF9VTkNPTkZJTkVEX1RZUEUpIC0gMSkgPT0gMCkKLQkJc3dpdGNobG9nID0gZGVidWczOwotCi0JbmV3bGVuID0gc3RybGVuKG9sZGN0eCkgKyBzdHJsZW4obmV3bmFtZSkgKyAxOwotCW5ld2N0eCA9IHhtYWxsb2MobmV3bGVuKTsKLQlsZW4gPSBjeCAtIG9sZGN0eCArIDE7Ci0JbWVtY3B5KG5ld2N0eCwgb2xkY3R4LCBsZW4pOwotCXN0cmxjcHkobmV3Y3R4ICsgbGVuLCBuZXduYW1lLCBuZXdsZW4gLSBsZW4pOwotCWlmICgoY3ggPSBpbmRleChjeCArIDEsICc6JykpKQotCQlzdHJsY2F0KG5ld2N0eCwgY3gsIG5ld2xlbik7Ci0JZGVidWczKCIlczogc2V0dGluZyBjb250ZXh0IGZyb20gJyVzJyB0byAnJXMnIiwgX19mdW5jX18sCi0JICAgIG9sZGN0eCwgbmV3Y3R4KTsKLQlpZiAoc2V0Y29uKG5ld2N0eCkgPCAwKQotCQlzd2l0Y2hsb2coIiVzOiBzZXRjb24gJXMgZnJvbSAlcyBmYWlsZWQgd2l0aCAlcyIsIF9fZnVuY19fLAotCQkgICAgbmV3Y3R4LCBvbGRjdHgsIHN0cmVycm9yKGVycm5vKSk7Ci0JeGZyZWUob2xkY3R4KTsKLQl4ZnJlZShuZXdjdHgpOwotfQotCi12b2lkCi1zc2hfc2VsaW51eF9zZXRmc2NyZWF0ZWNvbihjb25zdCBjaGFyICpwYXRoKQotewotCXNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0OwotCi0JaWYgKCFzc2hfc2VsaW51eF9lbmFibGVkKCkpCi0JCXJldHVybjsKLQlpZiAocGF0aCA9PSBOVUxMKSB7Ci0JCXNldGZzY3JlYXRlY29uKE5VTEwpOwotCQlyZXR1cm47Ci0JfQotCWlmIChtYXRjaHBhdGhjb24ocGF0aCwgMDcwMCwgJmNvbnRleHQpID09IDApCi0JCXNldGZzY3JlYXRlY29uKGNvbnRleHQpOwotfQotCi0jZW5kaWYgLyogV0lUSF9TRUxJTlVYICovCi0KLSNpZmRlZiBMSU5VWF9PT01fQURKVVNUCi0vKgotICogVGhlIG1hZ2ljICJkb24ndCBraWxsIG1lIiB2YWx1ZXMsIG9sZCBhbmQgbmV3LCBhcyBkb2N1bWVudGVkIGluIGVnOgotICogaHR0cDovL2x4ci5saW51eC5uby8jbGludXgrdjIuNi4zMi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0Ci0gKiBodHRwOi8vbHhyLmxpbnV4Lm5vLyNsaW51eCt2Mi42LjM2L0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKLSAqLwotCi1zdGF0aWMgaW50IG9vbV9hZGpfc2F2ZSA9IElOVF9NSU47Ci1zdGF0aWMgY2hhciAqb29tX2Fkal9wYXRoID0gTlVMTDsKLXN0cnVjdCB7Ci0JY2hhciAqcGF0aDsKLQlpbnQgdmFsdWU7Ci19IG9vbV9hZGp1c3RbXSA9IHsKLQl7Ii9wcm9jL3NlbGYvb29tX3Njb3JlX2FkaiIsIC0xMDAwfSwJLyoga2VybmVscyA+PSAyLjYuMzYgKi8KLQl7Ii9wcm9jL3NlbGYvb29tX2FkaiIsIC0xN30sCQkvKiBrZXJuZWxzIDw9IDIuNi4zNSAqLwotCXtOVUxMLCAwfSwKLX07Ci0KLS8qCi0gKiBUZWxsIHRoZSBrZXJuZWwncyBvdXQtb2YtbWVtb3J5IGtpbGxlciB0byBhdm9pZCBzc2hkLgotICogUmV0dXJucyB0aGUgcHJldmlvdXMgb29tX2FkaiB2YWx1ZSBvciB6ZXJvLgotICovCi12b2lkCi1vb21fYWRqdXN0X3NldHVwKHZvaWQpCi17Ci0JaW50IGksIHZhbHVlOwotCUZJTEUgKmZwOwotCi0JZGVidWczKCIlcyIsIF9fZnVuY19fKTsKLQkgZm9yIChpID0gMDsgb29tX2FkanVzdFtpXS5wYXRoICE9IE5VTEw7IGkrKykgewotCQlvb21fYWRqX3BhdGggPSBvb21fYWRqdXN0W2ldLnBhdGg7Ci0JCXZhbHVlID0gb29tX2FkanVzdFtpXS52YWx1ZTsKLQkJaWYgKChmcCA9IGZvcGVuKG9vbV9hZGpfcGF0aCwgInIrIikpICE9IE5VTEwpIHsKLQkJCWlmIChmc2NhbmYoZnAsICIlZCIsICZvb21fYWRqX3NhdmUpICE9IDEpCi0JCQkJdmVyYm9zZSgiZXJyb3IgcmVhZGluZyAlczogJXMiLCBvb21fYWRqX3BhdGgsCi0JCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCQllbHNlIHsKLQkJCQlyZXdpbmQoZnApOwotCQkJCWlmIChmcHJpbnRmKGZwLCAiJWRcbiIsIHZhbHVlKSA8PSAwKQotCQkJCQl2ZXJib3NlKCJlcnJvciB3cml0aW5nICVzOiAlcyIsCi0JCQkJCSAgIG9vbV9hZGpfcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQllbHNlCi0JCQkJCXZlcmJvc2UoIlNldCAlcyBmcm9tICVkIHRvICVkIiwKLQkJCQkJICAgb29tX2Fkal9wYXRoLCBvb21fYWRqX3NhdmUsIHZhbHVlKTsKLQkJCX0KLQkJCWZjbG9zZShmcCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0Jb29tX2Fkal9wYXRoID0gTlVMTDsKLX0KLQotLyogUmVzdG9yZSB0aGUgc2F2ZWQgT09NIGFkanVzdG1lbnQgKi8KLXZvaWQKLW9vbV9hZGp1c3RfcmVzdG9yZSh2b2lkKQotewotCUZJTEUgKmZwOwotCi0JZGVidWczKCIlcyIsIF9fZnVuY19fKTsKLQlpZiAob29tX2Fkal9zYXZlID09IElOVF9NSU4gfHwgb29tX2Fkal9wYXRoID09IE5VTEwgfHwKLQkgICAgKGZwID0gZm9wZW4ob29tX2Fkal9wYXRoLCAidyIpKSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAoZnByaW50ZihmcCwgIiVkXG4iLCBvb21fYWRqX3NhdmUpIDw9IDApCi0JCXZlcmJvc2UoImVycm9yIHdyaXRpbmcgJXM6ICVzIiwgb29tX2Fkal9wYXRoLCBzdHJlcnJvcihlcnJubykpOwotCWVsc2UKLQkJdmVyYm9zZSgiU2V0ICVzIHRvICVkIiwgb29tX2Fkal9wYXRoLCBvb21fYWRqX3NhdmUpOwotCi0JZmNsb3NlKGZwKTsKLQlyZXR1cm47Ci19Ci0jZW5kaWYgLyogTElOVVhfT09NX0FESlVTVCAqLwotI2VuZGlmIC8qIFdJVEhfU0VMSU5VWCB8fCBMSU5VWF9PT01fQURKVVNUICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9wb3J0LWxpbnV4LmggYi9vcGVuYnNkLWNvbXBhdC9wb3J0LWxpbnV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZDEwMDQuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvcG9ydC1saW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogJElkOiBwb3J0LWxpbnV4LmgsdiAxLjUgMjAxMS8wMS8yNSAwMToxNjoxOCBkam0gRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBEYW1pZW4gTWlsbGVyIDxkam1Ab3BlbmJzZC5vcmc+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfUE9SVF9MSU5VWF9ICi0jZGVmaW5lIF9QT1JUX0xJTlVYX0gKLQotI2lmZGVmIFdJVEhfU0VMSU5VWAotaW50IHNzaF9zZWxpbnV4X2VuYWJsZWQodm9pZCk7Ci12b2lkIHNzaF9zZWxpbnV4X3NldHVwX3B0eShjaGFyICosIGNvbnN0IGNoYXIgKik7Ci12b2lkIHNzaF9zZWxpbnV4X3NldHVwX2V4ZWNfY29udGV4dChjaGFyICopOwotdm9pZCBzc2hfc2VsaW51eF9jaGFuZ2VfY29udGV4dChjb25zdCBjaGFyICopOwotdm9pZCBzc2hfc2VsaW51eF9zZXRmc2NyZWF0ZWNvbihjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLSNpZmRlZiBMSU5VWF9PT01fQURKVVNUCi12b2lkIG9vbV9hZGp1c3RfcmVzdG9yZSh2b2lkKTsKLXZvaWQgb29tX2FkanVzdF9zZXR1cCh2b2lkKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogISBfUE9SVF9MSU5VWF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9wb3J0LXNvbGFyaXMuYyBiL29wZW5ic2QtY29tcGF0L3BvcnQtc29sYXJpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTM4MmYxLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3BvcnQtc29sYXJpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qICRJZDogcG9ydC1zb2xhcmlzLmMsdiAxLjQgMjAxMC8xMS8wNSAwMTowMzowNSBkdHVja2VyIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgQ2hhZCBNeW5oaWVyLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZkZWYgVVNFX1NPTEFSSVNfUFJPQ0VTU19DT05UUkFDVFMKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmZGVmIEhBVkVfRkNOVExfSAotIyBpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxsaWJjb250cmFjdC5oPgotI2luY2x1ZGUgPHN5cy9jb250cmFjdC9wcm9jZXNzLmg+Ci0jaW5jbHVkZSA8c3lzL2N0ZnMuaD4KLQotI2luY2x1ZGUgImxvZy5oIgotCi0jZGVmaW5lIENUX1RFTVBMQVRFCUNURlNfUk9PVCAiL3Byb2Nlc3MvdGVtcGxhdGUiCi0jZGVmaW5lIENUX0xBVEVTVAlDVEZTX1JPT1QgIi9wcm9jZXNzL2xhdGVzdCIKLQotc3RhdGljIGludCB0bXBsX2ZkID0gLTE7Ci0KLS8qIExvb2t1cCB0aGUgbGF0ZXN0IHByb2Nlc3MgY29udHJhY3QgKi8KLXN0YXRpYyBjdGlkX3QKLWdldF9hY3RpdmVfcHJvY2Vzc19jb250cmFjdF9pZCh2b2lkKQotewotCWludCBzdGF0X2ZkOwotCWN0aWRfdCBjdGlkID0gLTE7Ci0JY3Rfc3RhdGhkbF90IHN0YXRoZGw7Ci0KLQlpZiAoKHN0YXRfZmQgPSBvcGVuNjQoQ1RfTEFURVNULCBPX1JET05MWSkpID09IC0xKSB7Ci0JCWVycm9yKCIlczogRXJyb3Igb3BlbmluZyAnbGF0ZXN0JyBwcm9jZXNzICIKLQkJICAgICJjb250cmFjdDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoY3Rfc3RhdHVzX3JlYWQoc3RhdF9mZCwgQ1REX0NPTU1PTiwgJnN0YXRoZGwpICE9IDApIHsKLQkJZXJyb3IoIiVzOiBFcnJvciByZWFkaW5nIHByb2Nlc3MgY29udHJhY3QgIgotCQkgICAgInN0YXR1czogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmICgoY3RpZCA9IGN0X3N0YXR1c19nZXRfaWQoc3RhdGhkbCkpIDwgMCkgewotCQllcnJvcigiJXM6IEVycm9yIGdldHRpbmcgcHJvY2VzcyBjb250cmFjdCBpZDogJXMiLAotCQkgICAgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWN0X3N0YXR1c19mcmVlKHN0YXRoZGwpOwotIG91dDoKLQljbG9zZShzdGF0X2ZkKTsKLQlyZXR1cm4gY3RpZDsKLX0KLQotdm9pZAotc29sYXJpc19jb250cmFjdF9wcmVfZm9yayh2b2lkKQotewotCWlmICgodG1wbF9mZCA9IG9wZW42NChDVF9URU1QTEFURSwgT19SRFdSKSkgPT0gLTEpIHsKLQkJZXJyb3IoIiVzOiBvcGVuICVzOiAlcyIsIF9fZnVuY19fLAotCQkgICAgQ1RfVEVNUExBVEUsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkZWJ1ZzIoIiVzOiBzZXR0aW5nIHVwIHByb2Nlc3MgY29udHJhY3QgdGVtcGxhdGUgb24gZmQgJWQiLAotCSAgICBfX2Z1bmNfXywgdG1wbF9mZCk7Ci0KLQkvKiBGaXJzdCB3ZSBzZXQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYW5kIGV2ZW50IHNldHMuICovCi0JaWYgKGN0X3ByX3RtcGxfc2V0X3BhcmFtKHRtcGxfZmQsIENUX1BSX1BHUlBPTkxZKSAhPSAwKSB7Ci0JCWVycm9yKCIlczogRXJyb3Igc2V0dGluZyBwcm9jZXNzIGNvbnRyYWN0IHBhcmFtZXRlciBzZXQgIgotCQkgICAgIihwZ3Jwb25seSk6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKGN0X3ByX3RtcGxfc2V0X2ZhdGFsKHRtcGxfZmQsIENUX1BSX0VWX0hXRVJSKSAhPSAwKSB7Ci0JCWVycm9yKCIlczogRXJyb3Igc2V0dGluZyBwcm9jZXNzIGNvbnRyYWN0IHRlbXBsYXRlICIKLQkJICAgICJmYXRhbCBldmVudHM6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKGN0X3RtcGxfc2V0X2NyaXRpY2FsKHRtcGxfZmQsIDApICE9IDApIHsKLQkJZXJyb3IoIiVzOiBFcnJvciBzZXR0aW5nIHByb2Nlc3MgY29udHJhY3QgdGVtcGxhdGUgIgotCQkgICAgImNyaXRpY2FsIGV2ZW50czogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAoY3RfdG1wbF9zZXRfaW5mb3JtYXRpdmUodG1wbF9mZCwgQ1RfUFJfRVZfSFdFUlIpICE9IDApIHsKLQkJZXJyb3IoIiVzOiBFcnJvciBzZXR0aW5nIHByb2Nlc3MgY29udHJhY3QgdGVtcGxhdGUgIgotCQkgICAgImluZm9ybWF0aXZlIGV2ZW50czogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIE5vdyBtYWtlIHRoaXMgdGhlIGFjdGl2ZSB0ZW1wbGF0ZSBmb3IgdGhpcyBwcm9jZXNzLiAqLwotCWlmIChjdF90bXBsX2FjdGl2YXRlKHRtcGxfZmQpICE9IDApIHsKLQkJZXJyb3IoIiVzOiBFcnJvciBhY3RpdmF0aW5nIHByb2Nlc3MgY29udHJhY3QgIgotCQkgICAgInRlbXBsYXRlOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXJldHVybjsKLQotIGZhaWw6Ci0JaWYgKHRtcGxfZmQgIT0gLTEpIHsKLQkJY2xvc2UodG1wbF9mZCk7Ci0JCXRtcGxfZmQgPSAtMTsKLQl9Ci19Ci0KLXZvaWQKLXNvbGFyaXNfY29udHJhY3RfcG9zdF9mb3JrX2NoaWxkKCkKLXsKLQlkZWJ1ZzIoIiVzOiBjbGVhcmluZyBwcm9jZXNzIGNvbnRyYWN0IHRlbXBsYXRlIG9uIGZkICVkIiwKLQkgICAgX19mdW5jX18sIHRtcGxfZmQpOwotCi0JLyogQ2xlYXIgdGhlIGFjdGl2ZSB0ZW1wbGF0ZS4gKi8KLQlpZiAoY3RfdG1wbF9jbGVhcih0bXBsX2ZkKSAhPSAwKQotCQllcnJvcigiJXM6IEVycm9yIGNsZWFyaW5nIGFjdGl2ZSBwcm9jZXNzIGNvbnRyYWN0ICIKLQkJICAgICJ0ZW1wbGF0ZTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQotCWNsb3NlKHRtcGxfZmQpOwotCXRtcGxfZmQgPSAtMTsKLX0KLQotdm9pZAotc29sYXJpc19jb250cmFjdF9wb3N0X2ZvcmtfcGFyZW50KHBpZF90IHBpZCkKLXsKLQljdGlkX3QgY3RpZDsKLQljaGFyIGN0bF9wYXRoWzI1Nl07Ci0JaW50IHIsIGN0bF9mZCA9IC0xLCBzdGF0X2ZkID0gLTE7Ci0KLQlkZWJ1ZzIoIiVzOiBjbGVhcmluZyB0ZW1wbGF0ZSAoZmQgJWQpIiwgX19mdW5jX18sIHRtcGxfZmQpOwotCi0JaWYgKHRtcGxfZmQgPT0gLTEpCi0JCXJldHVybjsKLQotCS8qIEZpcnN0IGNsZWFyIHRoZSBhY3RpdmUgdGVtcGxhdGUuICovCi0JaWYgKChyID0gY3RfdG1wbF9jbGVhcih0bXBsX2ZkKSkgIT0gMCkKLQkJZXJyb3IoIiVzOiBFcnJvciBjbGVhcmluZyBhY3RpdmUgcHJvY2VzcyBjb250cmFjdCAiCi0JCSAgICAidGVtcGxhdGU6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0KLQljbG9zZSh0bXBsX2ZkKTsKLQl0bXBsX2ZkID0gLTE7Ci0KLQkvKgotCSAqIElmIGVpdGhlciB0aGUgZm9yayBkaWRuJ3Qgc3VjY2VlZCAocGlkIDwgMCksIG9yIGNsZWFyaW5nCi0JICogdGggYWN0aXZlIGNvbnRyYWN0IGZhaWxlZCAociAhPSAwKSwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcKLQkgKiBtb3JlIGRvLgotCSAqLwotCWlmIChyICE9IDAgfHwgcGlkIDw9IDApCi0JCXJldHVybjsKLQotCS8qIE5vdyBsb29rdXAgYW5kIGFiYW5kb24gdGhlIGNvbnRyYWN0IHdlJ3ZlIGNyZWF0ZWQuICovCi0JY3RpZCA9IGdldF9hY3RpdmVfcHJvY2Vzc19jb250cmFjdF9pZCgpOwotCi0JZGVidWcyKCIlczogYWJhbmRvbmluZyBjb250cmFjdCBpZCAlbGQiLCBfX2Z1bmNfXywgY3RpZCk7Ci0KLQlzbnByaW50ZihjdGxfcGF0aCwgc2l6ZW9mKGN0bF9wYXRoKSwKLQkgICAgQ1RGU19ST09UICIvcHJvY2Vzcy8lbGQvY3RsIiwgY3RpZCk7Ci0JaWYgKChjdGxfZmQgPSBvcGVuNjQoY3RsX3BhdGgsIE9fV1JPTkxZKSkgPCAwKSB7Ci0JCWVycm9yKCIlczogRXJyb3Igb3BlbmluZyBwcm9jZXNzIGNvbnRyYWN0ICIKLQkJICAgICJjdGwgZmlsZTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAoY3RfY3RsX2FiYW5kb24oY3RsX2ZkKSA8IDApIHsKLQkJZXJyb3IoIiVzOiBFcnJvciBhYmFuZG9uaW5nIHByb2Nlc3MgY29udHJhY3Q6ICVzIiwKLQkJICAgIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCQlnb3RvIGZhaWw7Ci0JfQotCWNsb3NlKGN0bF9mZCk7Ci0JcmV0dXJuOwotCi0gZmFpbDoKLQlpZiAodG1wbF9mZCAhPSAtMSkgewotCQljbG9zZSh0bXBsX2ZkKTsKLQkJdG1wbF9mZCA9IC0xOwotCX0KLQlpZiAoc3RhdF9mZCAhPSAtMSkKLQkJY2xvc2Uoc3RhdF9mZCk7Ci0JaWYgKGN0bF9mZCAhPSAtMSkKLQkJY2xvc2UoY3RsX2ZkKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgVVNFX1NPTEFSSVNfUFJPSkVDVFMKLSNpbmNsdWRlIDxzeXMvdGFzay5oPgotI2luY2x1ZGUgPHByb2plY3QuaD4KLQotLyoKLSAqIEdldC9zZXQgc29sYXJpcyBkZWZhdWx0IHByb2plY3QuCi0gKiBJZiB3ZSBmYWlsLCBqdXN0IHJ1biBhbG9uZyBncmFjZWZ1bGx5LgotICovCi12b2lkCi1zb2xhcmlzX3NldF9kZWZhdWx0X3Byb2plY3Qoc3RydWN0IHBhc3N3ZCAqcHcpCi17Ci0Jc3RydWN0IHByb2plY3QgICpkZWZhdWx0cHJvamVjdDsKLQlzdHJ1Y3QgcHJvamVjdCAgIHRlbXBwcm9qZWN0OwotCWNoYXIgYnVmWzEwMjRdOwotCi0JLyogZ2V0IGRlZmF1bHQgcHJvamVjdCwgaWYgd2UgZmFpbCBqdXN0IHJldHVybiBncmFjZWZ1bGx5ICAqLwotCWlmICgoZGVmYXVsdHByb2plY3QgPSBnZXRkZWZhdWx0cHJvaihwdy0+cHdfbmFtZSwgJnRlbXBwcm9qZWN0LCAmYnVmLAotCSAgICBzaXplb2YoYnVmKSkpID4gMCkgewotCQkvKiBzZXQgZGVmYXVsdCBwcm9qZWN0ICovCi0JCWlmIChzZXRwcm9qZWN0KGRlZmF1bHRwcm9qZWN0LT5wal9uYW1lLCBwdy0+cHdfbmFtZSwKLQkJICAgIFRBU0tfTk9STUFMKSAhPSAwKQotCQkJZGVidWcoInNldHByb2plY3QoJXMpOiAlcyIsIGRlZmF1bHRwcm9qZWN0LT5wal9uYW1lLAotCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JfSBlbHNlIHsKLQkJLyogZGVidWcgb24gZ2V0ZGVmYXVsdHByb2ooKSBlcnJvciAqLwotCQlkZWJ1ZygiZ2V0ZGVmYXVsdHByb2ooJXMpOiAlcyIsIHB3LT5wd19uYW1lLCBzdHJlcnJvcihlcnJubykpOwotCX0KLX0KLSNlbmRpZiAvKiBVU0VfU09MQVJJU19QUk9KRUNUUyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvcG9ydC1zb2xhcmlzLmggYi9vcGVuYnNkLWNvbXBhdC9wb3J0LXNvbGFyaXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q0NDJlNy4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9wb3J0LXNvbGFyaXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qICRJZDogcG9ydC1zb2xhcmlzLmgsdiAxLjIgMjAxMC8xMS8wNSAwMTowMzowNSBkdHVja2VyIEV4cCAkICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgQ2hhZCBNeW5oaWVyLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX1BPUlRfU09MQVJJU19ICi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHB3ZC5oPgotCi12b2lkIHNvbGFyaXNfY29udHJhY3RfcHJlX2Zvcmsodm9pZCk7Ci12b2lkIHNvbGFyaXNfY29udHJhY3RfcG9zdF9mb3JrX2NoaWxkKHZvaWQpOwotdm9pZCBzb2xhcmlzX2NvbnRyYWN0X3Bvc3RfZm9ya19wYXJlbnQocGlkX3QgcGlkKTsKLXZvaWQgc29sYXJpc19zZXRfZGVmYXVsdF9wcm9qZWN0KHN0cnVjdCBwYXNzd2QgKik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvcG9ydC10dW4uYyBiL29wZW5ic2QtY29tcGF0L3BvcnQtdHVuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNzU2ZjcuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvcG9ydC10dW4uYworKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJjaGFubmVscy5oIgotCi0vKgotICogVGhpcyBpcyB0aGUgcG9ydGFibGUgdmVyc2lvbiBvZiB0aGUgU1NIIHR1bm5lbCBmb3J3YXJkaW5nLCBpdAotICogdXNlcyBzb21lIHByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyBwbGF0Zm9ybS1zcGVjaWZpYwotICogc2V0dGluZ3MuCi0gKgotICogU1NIX1RVTl9MSU5VWAlVc2UgdGhlIChuZXdlcikgTGludXggdHVuL3RhcCBkZXZpY2UKLSAqIFNTSF9UVU5fRlJFRUJTRAlVc2UgdGhlIEZyZWVCU0QgdHVuL3RhcCBkZXZpY2UKLSAqIFNTSF9UVU5fQ09NUEFUX0FGCVRyYW5zbGF0ZSB0aGUgT3BlbkJTRCBhZGRyZXNzIGZhbWlseQotICogU1NIX1RVTl9QUkVQRU5EX0FGCVByZXBlbmQvcmVtb3ZlIHRoZSBhZGRyZXNzIGZhbWlseQotICovCi0KLS8qCi0gKiBTeXN0ZW0tc3BlY2lmaWMgdHVubmVsIG9wZW4gZnVuY3Rpb24KLSAqLwotCi0jaWYgZGVmaW5lZChTU0hfVFVOX0xJTlVYKQotI2luY2x1ZGUgPGxpbnV4L2lmLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfdHVuLmg+Ci0KLWludAotc3lzX3R1bl9vcGVuKGludCB0dW4sIGludCBtb2RlKQotewotCXN0cnVjdCBpZnJlcSBpZnI7Ci0JaW50IGZkID0gLTE7Ci0JY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7Ci0KLQlpZiAoKGZkID0gb3BlbigiL2Rldi9uZXQvdHVuIiwgT19SRFdSKSkgPT0gLTEpIHsKLQkJZGVidWcoIiVzOiBmYWlsZWQgdG8gb3BlbiB0dW5uZWwgY29udHJvbCBpbnRlcmZhY2U6ICVzIiwKLQkJICAgIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQliemVybygmaWZyLCBzaXplb2YoaWZyKSk7CQotCi0JaWYgKG1vZGUgPT0gU1NIX1RVTk1PREVfRVRIRVJORVQpIHsKLQkJaWZyLmlmcl9mbGFncyA9IElGRl9UQVA7Ci0JCW5hbWUgPSAidGFwJWQiOwotCX0gZWxzZSB7Ci0JCWlmci5pZnJfZmxhZ3MgPSBJRkZfVFVOOwotCQluYW1lID0gInR1biVkIjsKLQl9Ci0JaWZyLmlmcl9mbGFncyB8PSBJRkZfTk9fUEk7Ci0KLQlpZiAodHVuICE9IFNTSF9UVU5JRF9BTlkpIHsKLQkJaWYgKHR1biA+IFNTSF9UVU5JRF9NQVgpIHsKLQkJCWRlYnVnKCIlczogaW52YWxpZCB0dW5uZWwgaWQgJXg6ICVzIiwgX19mdW5jX18sCi0JCQkgICAgdHVuLCBzdHJlcnJvcihlcnJubykpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQkJc25wcmludGYoaWZyLmlmcl9uYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSwgbmFtZSwgdHVuKTsKLQl9Ci0KLQlpZiAoaW9jdGwoZmQsIFRVTlNFVElGRiwgJmlmcikgPT0gLTEpIHsKLQkJZGVidWcoIiVzOiBmYWlsZWQgdG8gY29uZmlndXJlIHR1bm5lbCAobW9kZSAlZCk6ICVzIiwgX19mdW5jX18sCi0JCSAgICBtb2RlLCBzdHJlcnJvcihlcnJubykpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlpZiAodHVuID09IFNTSF9UVU5JRF9BTlkpCi0JCWRlYnVnKCIlczogdHVubmVsIG1vZGUgJWQgZmQgJWQiLCBfX2Z1bmNfXywgbW9kZSwgZmQpOwotCWVsc2UKLQkJZGVidWcoIiVzOiAlcyBtb2RlICVkIGZkICVkIiwgX19mdW5jX18sIGlmci5pZnJfbmFtZSwgbW9kZSwgZmQpOwotCi0JcmV0dXJuIChmZCk7Ci0KLSBmYWlsZWQ6Ci0JY2xvc2UoZmQpOwotCXJldHVybiAoLTEpOwotfQotI2VuZGlmIC8qIFNTSF9UVU5fTElOVVggKi8KLQotI2lmZGVmIFNTSF9UVU5fRlJFRUJTRAotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXQvaWYuaD4KLQotI2lmZGVmIEhBVkVfTkVUX0lGX1RVTl9ICi0jaW5jbHVkZSA8bmV0L2lmX3R1bi5oPgotI2VuZGlmCi0KLWludAotc3lzX3R1bl9vcGVuKGludCB0dW4sIGludCBtb2RlKQotewotCXN0cnVjdCBpZnJlcSBpZnI7Ci0JY2hhciBuYW1lWzEwMF07Ci0JaW50IGZkID0gLTEsIHNvY2ssIGZsYWc7Ci0JY29uc3QgY2hhciAqdHVuYmFzZSA9ICJ0dW4iOwotCi0JaWYgKG1vZGUgPT0gU1NIX1RVTk1PREVfRVRIRVJORVQpIHsKLSNpZmRlZiBTU0hfVFVOX05PX0wyCi0JCWRlYnVnKCIlczogbm8gbGF5ZXIgMiB0dW5uZWxsaW5nIHN1cHBvcnQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAoLTEpOwotI2Vsc2UKLQkJdHVuYmFzZSA9ICJ0YXAiOwotI2VuZGlmCi0JfQotCi0JLyogT3BlbiB0aGUgdHVubmVsIGRldmljZSAqLwotCWlmICh0dW4gPD0gU1NIX1RVTklEX01BWCkgewotCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIvZGV2LyVzJWQiLCB0dW5iYXNlLCB0dW4pOwotCQlmZCA9IG9wZW4obmFtZSwgT19SRFdSKTsKLQl9IGVsc2UgaWYgKHR1biA9PSBTU0hfVFVOSURfQU5ZKSB7Ci0JCWZvciAodHVuID0gMTAwOyB0dW4gPj0gMDsgdHVuLS0pIHsKLQkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIi9kZXYvJXMlZCIsCi0JCQkgICAgdHVuYmFzZSwgdHVuKTsKLQkJCWlmICgoZmQgPSBvcGVuKG5hbWUsIE9fUkRXUikpID49IDApCi0JCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlkZWJ1ZygiJXM6IGludmFsaWQgdHVubmVsICV1XG4iLCBfX2Z1bmNfXywgdHVuKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCi0JaWYgKGZkIDwgMCkgewotCQlkZWJ1ZygiJXM6ICVzIG9wZW4gZmFpbGVkOiAlcyIsIF9fZnVuY19fLCBuYW1lLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCi0JLyogVHVybiBvbiB0dW5uZWwgaGVhZGVycyAqLwotCWZsYWcgPSAxOwotI2lmIGRlZmluZWQoVFVOU0lGSEVBRCkgJiYgIWRlZmluZWQoU1NIX1RVTl9QUkVQRU5EX0FGKQotCWlmIChtb2RlICE9IFNTSF9UVU5NT0RFX0VUSEVSTkVUICYmCi0JICAgIGlvY3RsKGZkLCBUVU5TSUZIRUFELCAmZmxhZykgPT0gLTEpIHsKLQkJZGVidWcoIiVzOiBpb2N0bCglZCwgVFVOU0lGSEVBRCwgMSk6ICVzIiwgX19mdW5jX18sIGZkLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJY2xvc2UoZmQpOwotCX0KLSNlbmRpZgotCi0JZGVidWcoIiVzOiAlcyBtb2RlICVkIGZkICVkIiwgX19mdW5jX18sIG5hbWUsIG1vZGUsIGZkKTsKLQotCS8qIFNldCB0aGUgdHVubmVsIGRldmljZSBvcGVyYXRpb24gbW9kZSAqLwotCXNucHJpbnRmKGlmci5pZnJfbmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSksICIlcyVkIiwgdHVuYmFzZSwgdHVuKTsKLQlpZiAoKHNvY2sgPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIDApKSA9PSAtMSkKLQkJZ290byBmYWlsZWQ7Ci0KLQlpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkZMQUdTLCAmaWZyKSA9PSAtMSkKLQkJZ290byBmYWlsZWQ7Ci0JaWYgKChpZnIuaWZyX2ZsYWdzICYgSUZGX1VQKSA9PSAwKSB7Ci0JCWlmci5pZnJfZmxhZ3MgfD0gSUZGX1VQOwotCQlpZiAoaW9jdGwoc29jaywgU0lPQ1NJRkZMQUdTLCAmaWZyKSA9PSAtMSkKLQkJCWdvdG8gZmFpbGVkOwotCX0KLQotCWNsb3NlKHNvY2spOwotCXJldHVybiAoZmQpOwotCi0gZmFpbGVkOgotCWlmIChmZCA+PSAwKQotCQljbG9zZShmZCk7Ci0JaWYgKHNvY2sgPj0gMCkKLQkJY2xvc2Uoc29jayk7Ci0JZGVidWcoIiVzOiBmYWlsZWQgdG8gc2V0ICVzIG1vZGUgJWQ6ICVzIiwgX19mdW5jX18sIG5hbWUsCi0JICAgIG1vZGUsIHN0cmVycm9yKGVycm5vKSk7Ci0JcmV0dXJuICgtMSk7Ci19Ci0jZW5kaWYgLyogU1NIX1RVTl9GUkVFQlNEICovCi0KLS8qCi0gKiBTeXN0ZW0tc3BlY2lmaWMgY2hhbm5lbCBmaWx0ZXJzCi0gKi8KLQotI2lmIGRlZmluZWQoU1NIX1RVTl9GSUxURVIpCi0jZGVmaW5lIE9QRU5CU0RfQUZfSU5FVAkJMgotI2RlZmluZSBPUEVOQlNEX0FGX0lORVQ2CTI0Ci0KLWludAotc3lzX3R1bl9pbmZpbHRlcihzdHJ1Y3QgQ2hhbm5lbCAqYywgY2hhciAqYnVmLCBpbnQgbGVuKQotewotI2lmIGRlZmluZWQoU1NIX1RVTl9QUkVQRU5EX0FGKQotCWNoYXIgcmJ1ZltDSEFOX1JCVUZdOwotCXN0cnVjdCBpcCAqaXBoOwotI2VuZGlmCi0JdV9pbnQzMl90ICphZjsKLQljaGFyICpwdHIgPSBidWY7Ci0KLSNpZiBkZWZpbmVkKFNTSF9UVU5fUFJFUEVORF9BRikKLQlpZiAobGVuIDw9IDAgfHwgbGVuID4gKGludCkoc2l6ZW9mKHJidWYpIC0gc2l6ZW9mKCphZikpKQotCQlyZXR1cm4gKC0xKTsKLQlwdHIgPSAoY2hhciAqKSZyYnVmWzBdOwotCWJjb3B5KGJ1ZiwgcHRyICsgc2l6ZW9mKHVfaW50MzJfdCksIGxlbik7Ci0JbGVuICs9IHNpemVvZih1X2ludDMyX3QpOwotCWFmID0gKHVfaW50MzJfdCAqKXB0cjsKLQotCWlwaCA9IChzdHJ1Y3QgaXAgKikocHRyICsgc2l6ZW9mKHVfaW50MzJfdCkpOwotCXN3aXRjaCAoaXBoLT5pcF92KSB7Ci0JY2FzZSA2OgotCQkqYWYgPSBBRl9JTkVUNjsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCWRlZmF1bHQ6Ci0JCSphZiA9IEFGX0lORVQ7Ci0JCWJyZWFrOwotCX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChTU0hfVFVOX0NPTVBBVF9BRikKLQlpZiAobGVuIDwgKGludClzaXplb2YodV9pbnQzMl90KSkKLQkJcmV0dXJuICgtMSk7Ci0KLQlhZiA9ICh1X2ludDMyX3QgKilwdHI7Ci0JaWYgKCphZiA9PSBodG9ubChBRl9JTkVUNikpCi0JCSphZiA9IGh0b25sKE9QRU5CU0RfQUZfSU5FVDYpOwotCWVsc2UKLQkJKmFmID0gaHRvbmwoT1BFTkJTRF9BRl9JTkVUKTsKLSNlbmRpZgotCi0JYnVmZmVyX3B1dF9zdHJpbmcoJmMtPmlucHV0LCBwdHIsIGxlbik7Ci0JcmV0dXJuICgwKTsKLX0KLQotdV9jaGFyICoKLXN5c190dW5fb3V0ZmlsdGVyKHN0cnVjdCBDaGFubmVsICpjLCB1X2NoYXIgKipkYXRhLCB1X2ludCAqZGxlbikKLXsKLQl1X2NoYXIgKmJ1ZjsKLQl1X2ludDMyX3QgKmFmOwotCi0JKmRhdGEgPSBidWZmZXJfZ2V0X3N0cmluZygmYy0+b3V0cHV0LCBkbGVuKTsKLQlpZiAoKmRsZW4gPCBzaXplb2YoKmFmKSkKLQkJcmV0dXJuIChOVUxMKTsKLQlidWYgPSAqZGF0YTsKLQotI2lmIGRlZmluZWQoU1NIX1RVTl9QUkVQRU5EX0FGKQotCSpkbGVuIC09IHNpemVvZih1X2ludDMyX3QpOwotCWJ1ZiA9ICpkYXRhICsgc2l6ZW9mKHVfaW50MzJfdCk7Ci0jZWxpZiBkZWZpbmVkKFNTSF9UVU5fQ09NUEFUX0FGKQotCWFmID0gbnRvaGwoKih1X2ludDMyX3QgKilidWYpOwotCWlmICgqYWYgPT0gT1BFTkJTRF9BRl9JTkVUNikKLQkJKmFmID0gaHRvbmwoQUZfSU5FVDYpOwotCWVsc2UKLQkJKmFmID0gaHRvbmwoQUZfSU5FVCk7Ci0jZW5kaWYKLQotCXJldHVybiAoYnVmKTsKLX0KLSNlbmRpZiAvKiBTU0hfVFVOX0ZJTFRFUiAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvcG9ydC10dW4uaCBiL29wZW5ic2QtY29tcGF0L3BvcnQtdHVuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1M2RmMDEuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvcG9ydC10dW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgUmV5ayBGbG9ldGVyIDxyZXlrQG9wZW5ic2Qub3JnPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX1BPUlRfVFVOX0gKLSNkZWZpbmUgX1BPUlRfVFVOX0gKLQotc3RydWN0IENoYW5uZWw7Ci0KLSNpZiBkZWZpbmVkKFNTSF9UVU5fTElOVVgpIHx8IGRlZmluZWQoU1NIX1RVTl9GUkVFQlNEKQotIyBkZWZpbmUgQ1VTVE9NX1NZU19UVU5fT1BFTgotaW50CSAgc3lzX3R1bl9vcGVuKGludCwgaW50KTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChTU0hfVFVOX0NPTVBBVF9BRikgfHwgZGVmaW5lZChTU0hfVFVOX1BSRVBFTkRfQUYpCi0jIGRlZmluZSBTU0hfVFVOX0ZJTFRFUgotaW50CSBzeXNfdHVuX2luZmlsdGVyKHN0cnVjdCBDaGFubmVsICosIGNoYXIgKiwgaW50KTsKLXVfY2hhcgkqc3lzX3R1bl9vdXRmaWx0ZXIoc3RydWN0IENoYW5uZWwgKiwgdV9jaGFyICoqLCB1X2ludCAqKTsKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L3BvcnQtdXcuYyBiL29wZW5ic2QtY29tcGF0L3BvcnQtdXcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmYmZhMi4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9wb3J0LXV3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgU0NPIEdyb3VwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRpbSBSaWNlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmIGRlZmluZWQoSEFWRV9MSUJJQUYpICAmJiAgIWRlZmluZWQoSEFWRV9TRUNVUkVXQVJFKQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfQ1JZUFRfSAotIyBpbmNsdWRlIDxjcnlwdC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJhdXRoLW9wdGlvbnMuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJzZXJ2Y29uZi5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgInNzaC5oIgotCi1pbnQgbmlzY2hlY2soY2hhciAqKTsKLQotaW50Ci1zeXNfYXV0aF9wYXNzd2QoQXV0aGN0eHQgKmF1dGhjdHh0LCBjb25zdCBjaGFyICpwYXNzd29yZCkKLXsKLQlzdHJ1Y3QgcGFzc3dkICpwdyA9IGF1dGhjdHh0LT5wdzsKLQljaGFyICpzYWx0OwotCWludCByZXN1bHQ7Ci0KLQkvKiBKdXN0IHVzZSB0aGUgc3VwcGxpZWQgZmFrZSBwYXNzd29yZCBpZiBhdXRoY3R4dCBpcyBpbnZhbGlkICovCi0JY2hhciAqcHdfcGFzc3dvcmQgPSBhdXRoY3R4dC0+dmFsaWQgPyBzaGFkb3dfcHcocHcpIDogcHctPnB3X3Bhc3N3ZDsKLQotCS8qIENoZWNrIGZvciB1c2VycyB3aXRoIG5vIHBhc3N3b3JkLiAqLwotCWlmIChzdHJjbXAocHdfcGFzc3dvcmQsICIiKSA9PSAwICYmIHN0cmNtcChwYXNzd29yZCwgIiIpID09IDApCi0JCXJldHVybiAoMSk7Ci0KLQkvKiBFbmNyeXB0IHRoZSBjYW5kaWRhdGUgcGFzc3dvcmQgdXNpbmcgdGhlIHByb3BlciBzYWx0LiAqLwotCXNhbHQgPSAocHdfcGFzc3dvcmRbMF0gJiYgcHdfcGFzc3dvcmRbMV0pID8gcHdfcGFzc3dvcmQgOiAieHgiOwotCi0JLyoKLQkgKiBBdXRoZW50aWNhdGlvbiBpcyBhY2NlcHRlZCBpZiB0aGUgZW5jcnlwdGVkIHBhc3N3b3JkcwotCSAqIGFyZSBpZGVudGljYWwuCi0JICovCi0jaWZkZWYgVU5JWFdBUkVfTE9OR19QQVNTV09SRFMKLQlpZiAoIW5pc2NoZWNrKHB3LT5wd19uYW1lKSkgewotCQlyZXN1bHQgPSAoKHN0cmNtcChiaWdjcnlwdChwYXNzd29yZCwgc2FsdCksIHB3X3Bhc3N3b3JkKSA9PSAwKQotCQl8fCAgKHN0cmNtcChvc3I1YmlnY3J5cHQocGFzc3dvcmQsIHNhbHQpLCBwd19wYXNzd29yZCkgPT0gMCkpOwotCX0KLQllbHNlCi0jZW5kaWYgLyogVU5JWFdBUkVfTE9OR19QQVNTV09SRFMgKi8KLQkJcmVzdWx0ID0gKHN0cmNtcCh4Y3J5cHQocGFzc3dvcmQsIHNhbHQpLCBwd19wYXNzd29yZCkgPT0gMCk7Ci0KLSNpZmRlZiBVU0VfTElCSUFGCi0JaWYgKGF1dGhjdHh0LT52YWxpZCkKLQkJZnJlZShwd19wYXNzd29yZCk7Ci0jZW5kaWYKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotI2lmZGVmIFVOSVhXQVJFX0xPTkdfUEFTU1dPUkRTCi1pbnQKLW5pc2NoZWNrKGNoYXIgKm5hbWVwKQotewotCWNoYXIgcGFzc3dvcmRfZmlsZVtdID0gIi9ldGMvcGFzc3dkIjsKLQlGSUxFICpmZDsKLQlzdHJ1Y3QgcGFzc3dkICplbnQgPSBOVUxMOwotCi0JaWYgKChmZCA9IGZvcGVuIChwYXNzd29yZF9maWxlLCAiciIpKSA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBwYXNzd2QgZmlsZSBoYXMgZGlzc2FwZWFyZWQgd2UgYXJlIGluIGEgYmFkIHN0YXRlLgotCQkgKiBIb3dldmVyLCByZXR1cm5pbmcgMCB3aWxsIHNlbmQgdXMgYmFjayB0aHJvdWdoIHRoZQotCQkgKiBhdXRoZW50aWNhdGlvbiBzY2hlbWUgdGhhdCBoYXMgY2hlY2tlZCB0aGUgaWEgZGF0YWJhc2UgZm9yCi0JCSAqIHBhc3N3b3JkcyBlYXJsaWVyLgotCQkgKi8KLQkJcmV0dXJuKDApOwotCX0KLQotCS8qCi0JICogZmdldHB3ZW50KCkgb25seSByZWFkcyBmcm9tIHBhc3N3b3JkIGZpbGUsIHNvIHdlIGtub3cgZm9yIGNlcnRhaW4KLQkgKiB0aGF0IHRoZSB1c2VyIGlzIGxvY2FsLgotCSAqLwotCXdoaWxlIChlbnQgPSBmZ2V0cHdlbnQoZmQpKSB7Ci0JCWlmIChzdHJjbXAgKGVudC0+cHdfbmFtZSwgbmFtZXApID09IDApIHsKLQkJCS8qIExvY2FsIHVzZXIgKi8KLQkJCWZjbG9zZSAoZmQpOwotCQkJcmV0dXJuKDApOwotCQl9Ci0JfQotCi0JZmNsb3NlIChmZCk7Ci0JcmV0dXJuICgxKTsKLX0KLQotI2VuZGlmIC8qIFVOSVhXQVJFX0xPTkdfUEFTU1dPUkRTICovCi0KLS8qCi0JTk9URTogaWFfZ2V0X2xvZ3B3ZCgpIGFsbG9jYXRlcyBtZW1vcnkgZm9yIGFyZyAyCi0JZnVuY3Rpb25zIHRoYXQgY2FsbCBzaGFkb3dfcHcoKSB3aWxsIG5lZWQgdG8gZnJlZQotICovCi0KLSNpZmRlZiBVU0VfTElCSUFGCi1jaGFyICoKLWdldF9pYWZfcGFzc3dvcmQoc3RydWN0IHBhc3N3ZCAqcHcpCi17Ci0JY2hhciAqcHdfcGFzc3dvcmQgPSBOVUxMOwotCi0JdWluZm9fdCB1aW5mbzsKLQlpZiAoIWlhX29wZW5pbmZvKHB3LT5wd19uYW1lLCZ1aW5mbykpIHsKLQkJaWFfZ2V0X2xvZ3B3ZCh1aW5mbywgJnB3X3Bhc3N3b3JkKTsKLQkJaWYgKHB3X3Bhc3N3b3JkID09IE5VTEwpCi0JCQlmYXRhbCgiaWFfZ2V0X2xvZ3B3ZDogVW5hYmxlIHRvIGdldCB0aGUgc2hhZG93IHBhc3N3ZCIpOwotCQlpYV9jbG9zZWluZm8odWluZm8pOwotCSAJcmV0dXJuIHB3X3Bhc3N3b3JkOwotCX0KLQllbHNlCi0JCWZhdGFsKCJpYV9vcGVuaW5mbzogVW5hYmxlIHRvIG9wZW4gdGhlIHNoYWRvdyBwYXNzd2QgZmlsZSIpOwotfQotI2VuZGlmIC8qIFVTRV9MSUJJQUYgKi8KLSNlbmRpZiAvKiBIQVZFX0xJQklBRiBhbmQgbm90IEhBVkVfU0VDVVJFV0FSRSAqLwotCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9wb3J0LXV3LmggYi9vcGVuYnNkLWNvbXBhdC9wb3J0LXV3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2M2Q4YjUuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvcG9ydC11dy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaW0gUmljZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZkZWYgVVNFX0xJQklBRgotY2hhciAqIGdldF9pYWZfcGFzc3dvcmQoc3RydWN0IHBhc3N3ZCAqcHcpOwotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L3B3Y2FjaGUuYyBiL29wZW5ic2QtY29tcGF0L3B3Y2FjaGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4Yjc4OC4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9wd2NhY2hlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHB3Y2FjaGUuYyx2IDEuOSAyMDA1LzA4LzA4IDA4OjA1OjM0IGVzcGllIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCi0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvZ2VuL3B3Y2FjaGUuYyAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8Z3JwLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZQlOQ0FDSEUJNjQJCQkvKiBwb3dlciBvZiAyICovCi0jZGVmaW5lCU1BU0sJKE5DQUNIRSAtIDEpCQkvKiBiaXRzIHRvIHN0b3JlIHdpdGggKi8KLQotI2lmbmRlZiBIQVZFX1VTRVJfRlJPTV9VSUQKLWNoYXIgKgotdXNlcl9mcm9tX3VpZCh1aWRfdCB1aWQsIGludCBub3VzZXIpCi17Ci0Jc3RhdGljIHN0cnVjdCBuY2FjaGUgewotCQl1aWRfdAl1aWQ7Ci0JCWNoYXIJKm5hbWU7Ci0JfSBjX3VpZFtOQ0FDSEVdOwotCXN0YXRpYyBpbnQgcHdvcGVuOwotCXN0YXRpYyBjaGFyIG5idWZbMTVdOwkJLyogMzIgYml0cyA9PSAxMCBkaWdpdHMgKi8KLQlzdHJ1Y3QgcGFzc3dkICpwdzsKLQlzdHJ1Y3QgbmNhY2hlICpjcDsKLQotCWNwID0gY191aWQgKyAodWlkICYgTUFTSyk7Ci0JaWYgKGNwLT51aWQgIT0gdWlkIHx8IGNwLT5uYW1lID09IE5VTEwpIHsKLQkJaWYgKHB3b3BlbiA9PSAwKSB7Ci0jaWZkZWYgSEFWRV9TRVRQQVNTRU5UCi0JCQlzZXRwYXNzZW50KDEpOwotI2VuZGlmCi0JCQlwd29wZW4gPSAxOwotCQl9Ci0JCWlmICgocHcgPSBnZXRwd3VpZCh1aWQpKSA9PSBOVUxMKSB7Ci0JCQlpZiAobm91c2VyKQotCQkJCXJldHVybiAoTlVMTCk7Ci0JCQkodm9pZClzbnByaW50ZihuYnVmLCBzaXplb2YobmJ1ZiksICIldSIsIHVpZCk7Ci0JCX0KLQkJY3AtPnVpZCA9IHVpZDsKLQkJaWYgKGNwLT5uYW1lICE9IE5VTEwpCi0JCQlmcmVlKGNwLT5uYW1lKTsKLQkJY3AtPm5hbWUgPSBzdHJkdXAocHcgPyBwdy0+cHdfbmFtZSA6IG5idWYpOwotCX0KLQlyZXR1cm4gKGNwLT5uYW1lKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfR1JPVVBfRlJPTV9HSUQKLWNoYXIgKgotZ3JvdXBfZnJvbV9naWQoZ2lkX3QgZ2lkLCBpbnQgbm9ncm91cCkKLXsKLQlzdGF0aWMgc3RydWN0IG5jYWNoZSB7Ci0JCWdpZF90CWdpZDsKLQkJY2hhcgkqbmFtZTsKLQl9IGNfZ2lkW05DQUNIRV07Ci0Jc3RhdGljIGludCBncm9wZW47Ci0Jc3RhdGljIGNoYXIgbmJ1ZlsxNV07CQkvKiAzMiBiaXRzID09IDEwIGRpZ2l0cyAqLwotCXN0cnVjdCBncm91cCAqZ3I7Ci0Jc3RydWN0IG5jYWNoZSAqY3A7Ci0KLQljcCA9IGNfZ2lkICsgKGdpZCAmIE1BU0spOwotCWlmIChjcC0+Z2lkICE9IGdpZCB8fCBjcC0+bmFtZSA9PSBOVUxMKSB7Ci0JCWlmIChncm9wZW4gPT0gMCkgewotI2lmZGVmIEhBVkVfU0VUR1JPVVBFTlQKLQkJCXNldGdyb3VwZW50KDEpOwotI2VuZGlmCi0JCQlncm9wZW4gPSAxOwotCQl9Ci0JCWlmICgoZ3IgPSBnZXRncmdpZChnaWQpKSA9PSBOVUxMKSB7Ci0JCQlpZiAobm9ncm91cCkKLQkJCQlyZXR1cm4gKE5VTEwpOwotCQkJKHZvaWQpc25wcmludGYobmJ1Ziwgc2l6ZW9mKG5idWYpLCAiJXUiLCBnaWQpOwotCQl9Ci0JCWNwLT5naWQgPSBnaWQ7Ci0JCWlmIChjcC0+bmFtZSAhPSBOVUxMKQotCQkJZnJlZShjcC0+bmFtZSk7Ci0JCWNwLT5uYW1lID0gc3RyZHVwKGdyID8gZ3ItPmdyX25hbWUgOiBuYnVmKTsKLQl9Ci0JcmV0dXJuIChjcC0+bmFtZSk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L3JlYWRwYXNzcGhyYXNlLmMgYi9vcGVuYnNkLWNvbXBhdC9yZWFkcGFzc3BocmFzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTFmNTExLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3JlYWRwYXNzcGhyYXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHJlYWRwYXNzcGhyYXNlLmMsdiAxLjIyIDIwMTAvMDEvMTMgMTA6MjA6NTQgZHR1Y2tlciBFeHAgJAkqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIsIDIwMDcgVG9kZCBDLiBNaWxsZXIgPFRvZGQuTWlsbGVyQGNvdXJ0ZXNhbi5jb20+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICogU3BvbnNvcmVkIGluIHBhcnQgYnkgdGhlIERlZmVuc2UgQWR2YW5jZWQgUmVzZWFyY2ggUHJvamVjdHMKLSAqIEFnZW5jeSAoREFSUEEpIGFuZCBBaXIgRm9yY2UgUmVzZWFyY2ggTGFib3JhdG9yeSwgQWlyIEZvcmNlCi0gKiBNYXRlcmllbCBDb21tYW5kLCBVU0FGLCB1bmRlciBhZ3JlZW1lbnQgbnVtYmVyIEYzOTUwMi05OS0xLTA1MTIuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvZ2VuL3JlYWRwYXNzcGhyYXNlLmMgKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpZm5kZWYgSEFWRV9SRUFEUEFTU1BIUkFTRQotCi0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAicmVhZHBhc3NwaHJhc2UuaCIKLQotI2lmZGVmIFRDU0FTT0ZUCi0jIGRlZmluZSBfVF9GTFVTSAkoVENTQUZMVVNIfFRDU0FTT0ZUKQotI2Vsc2UKLSMgZGVmaW5lIF9UX0ZMVVNICShUQ1NBRkxVU0gpCi0jZW5kaWYKLQotLyogU3VuT1MgNC54IHdoaWNoIGxhY2tzIF9QT1NJWF9WRElTQUJMRSwgYnV0IGhhcyBWRElTQUJMRSAqLwotI2lmICFkZWZpbmVkKF9QT1NJWF9WRElTQUJMRSkgJiYgZGVmaW5lZChWRElTQUJMRSkKLSMgIGRlZmluZSBfUE9TSVhfVkRJU0FCTEUgICAgICAgVkRJU0FCTEUKLSNlbmRpZgotCi1zdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHNpZ25vW19OU0lHXTsKLQotc3RhdGljIHZvaWQgaGFuZGxlcihpbnQpOwotCi1jaGFyICoKLXJlYWRwYXNzcGhyYXNlKGNvbnN0IGNoYXIgKnByb21wdCwgY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6LCBpbnQgZmxhZ3MpCi17Ci0Jc3NpemVfdCBucjsKLQlpbnQgaW5wdXQsIG91dHB1dCwgc2F2ZV9lcnJubywgaSwgbmVlZF9yZXN0YXJ0OwotCWNoYXIgY2gsICpwLCAqZW5kOwotCXN0cnVjdCB0ZXJtaW9zIHRlcm0sIG90ZXJtOwotCXN0cnVjdCBzaWdhY3Rpb24gc2EsIHNhdmVhbHJtLCBzYXZlaW50LCBzYXZlaHVwLCBzYXZlcXVpdCwgc2F2ZXRlcm07Ci0Jc3RydWN0IHNpZ2FjdGlvbiBzYXZldHN0cCwgc2F2ZXR0aW4sIHNhdmV0dG91LCBzYXZlcGlwZTsKLQotCS8qIEkgc3VwcG9zZSB3ZSBjb3VsZCBhbGxvYyBvbiBkZW1hbmQgaW4gdGhpcyBjYXNlIChYWFgpLiAqLwotCWlmIChidWZzaXogPT0gMCkgewotCQllcnJubyA9IEVJTlZBTDsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotcmVzdGFydDoKLQlmb3IgKGkgPSAwOyBpIDwgX05TSUc7IGkrKykKLQkJc2lnbm9baV0gPSAwOwotCW5yID0gLTE7Ci0Jc2F2ZV9lcnJubyA9IDA7Ci0JbmVlZF9yZXN0YXJ0ID0gMDsKLQkvKgotCSAqIFJlYWQgYW5kIHdyaXRlIHRvIC9kZXYvdHR5IGlmIGF2YWlsYWJsZS4gIElmIG5vdCwgcmVhZCBmcm9tCi0JICogc3RkaW4gYW5kIHdyaXRlIHRvIHN0ZGVyciB1bmxlc3MgYSB0dHkgaXMgcmVxdWlyZWQuCi0JICovCi0JaWYgKChmbGFncyAmIFJQUF9TVERJTikgfHwKLQkgICAgKGlucHV0ID0gb3V0cHV0ID0gb3BlbihfUEFUSF9UVFksIE9fUkRXUikpID09IC0xKSB7Ci0JCWlmIChmbGFncyAmIFJQUF9SRVFVSVJFX1RUWSkgewotCQkJZXJybm8gPSBFTk9UVFk7Ci0JCQlyZXR1cm4oTlVMTCk7Ci0JCX0KLQkJaW5wdXQgPSBTVERJTl9GSUxFTk87Ci0JCW91dHB1dCA9IFNUREVSUl9GSUxFTk87Ci0JfQotCi0JLyoKLQkgKiBDYXRjaCBzaWduYWxzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGNhdXNlIHRoZSB1c2VyIHRvIGVuZAotCSAqIHVwIHdpdGggZWNobyB0dXJuZWQgb2ZmIGluIHRoZSBzaGVsbC4gIERvbid0IHdvcnJ5IGFib3V0Ci0JICogdGhpbmdzIGxpa2UgU0lHWENQVSBhbmQgU0lHVlRBTFJNIGZvciBub3cuCi0JICovCi0Jc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOwotCXNhLnNhX2ZsYWdzID0gMDsJCS8qIGRvbid0IHJlc3RhcnQgc3lzdGVtIGNhbGxzICovCi0Jc2Euc2FfaGFuZGxlciA9IGhhbmRsZXI7Ci0JKHZvaWQpc2lnYWN0aW9uKFNJR0FMUk0sICZzYSwgJnNhdmVhbHJtKTsKLQkodm9pZClzaWdhY3Rpb24oU0lHSFVQLCAmc2EsICZzYXZlaHVwKTsKLQkodm9pZClzaWdhY3Rpb24oU0lHSU5ULCAmc2EsICZzYXZlaW50KTsKLQkodm9pZClzaWdhY3Rpb24oU0lHUElQRSwgJnNhLCAmc2F2ZXBpcGUpOwotCSh2b2lkKXNpZ2FjdGlvbihTSUdRVUlULCAmc2EsICZzYXZlcXVpdCk7Ci0JKHZvaWQpc2lnYWN0aW9uKFNJR1RFUk0sICZzYSwgJnNhdmV0ZXJtKTsKLQkodm9pZClzaWdhY3Rpb24oU0lHVFNUUCwgJnNhLCAmc2F2ZXRzdHApOwotCSh2b2lkKXNpZ2FjdGlvbihTSUdUVElOLCAmc2EsICZzYXZldHRpbik7Ci0JKHZvaWQpc2lnYWN0aW9uKFNJR1RUT1UsICZzYSwgJnNhdmV0dG91KTsKLQotCS8qIFR1cm4gb2ZmIGVjaG8gaWYgcG9zc2libGUuICovCi0JaWYgKGlucHV0ICE9IFNURElOX0ZJTEVOTyAmJiB0Y2dldGF0dHIoaW5wdXQsICZvdGVybSkgPT0gMCkgewotCQltZW1jcHkoJnRlcm0sICZvdGVybSwgc2l6ZW9mKHRlcm0pKTsKLQkJaWYgKCEoZmxhZ3MgJiBSUFBfRUNIT19PTikpCi0JCQl0ZXJtLmNfbGZsYWcgJj0gfihFQ0hPIHwgRUNIT05MKTsKLSNpZmRlZiBWU1RBVFVTCi0JCWlmICh0ZXJtLmNfY2NbVlNUQVRVU10gIT0gX1BPU0lYX1ZESVNBQkxFKQotCQkJdGVybS5jX2NjW1ZTVEFUVVNdID0gX1BPU0lYX1ZESVNBQkxFOwotI2VuZGlmCi0JCSh2b2lkKXRjc2V0YXR0cihpbnB1dCwgX1RfRkxVU0gsICZ0ZXJtKTsKLQl9IGVsc2UgewotCQltZW1zZXQoJnRlcm0sIDAsIHNpemVvZih0ZXJtKSk7Ci0JCXRlcm0uY19sZmxhZyB8PSBFQ0hPOwotCQltZW1zZXQoJm90ZXJtLCAwLCBzaXplb2Yob3Rlcm0pKTsKLQkJb3Rlcm0uY19sZmxhZyB8PSBFQ0hPOwotCX0KLQotCS8qIE5vIEkvTyBpZiB3ZSBhcmUgYWxyZWFkeSBiYWNrZ3JvdW5kZWQuICovCi0JaWYgKHNpZ25vW1NJR1RUT1VdICE9IDEgJiYgc2lnbm9bU0lHVFRJTl0gIT0gMSkgewotCQlpZiAoIShmbGFncyAmIFJQUF9TVERJTikpCi0JCQkodm9pZCl3cml0ZShvdXRwdXQsIHByb21wdCwgc3RybGVuKHByb21wdCkpOwotCQllbmQgPSBidWYgKyBidWZzaXogLSAxOwotCQlwID0gYnVmOwotCQl3aGlsZSAoKG5yID0gcmVhZChpbnB1dCwgJmNoLCAxKSkgPT0gMSAmJiBjaCAhPSAnXG4nICYmIGNoICE9ICdccicpIHsKLQkJCWlmIChwIDwgZW5kKSB7Ci0JCQkJaWYgKChmbGFncyAmIFJQUF9TRVZFTkJJVCkpCi0JCQkJCWNoICY9IDB4N2Y7Ci0JCQkJaWYgKGlzYWxwaGEoY2gpKSB7Ci0JCQkJCWlmICgoZmxhZ3MgJiBSUFBfRk9SQ0VMT1dFUikpCi0JCQkJCQljaCA9IChjaGFyKXRvbG93ZXIoY2gpOwotCQkJCQlpZiAoKGZsYWdzICYgUlBQX0ZPUkNFVVBQRVIpKQotCQkJCQkJY2ggPSAoY2hhcil0b3VwcGVyKGNoKTsKLQkJCQl9Ci0JCQkJKnArKyA9IGNoOwotCQkJfQotCQl9Ci0JCSpwID0gJ1wwJzsKLQkJc2F2ZV9lcnJubyA9IGVycm5vOwotCQlpZiAoISh0ZXJtLmNfbGZsYWcgJiBFQ0hPKSkKLQkJCSh2b2lkKXdyaXRlKG91dHB1dCwgIlxuIiwgMSk7Ci0JfQotCi0JLyogUmVzdG9yZSBvbGQgdGVybWluYWwgc2V0dGluZ3MgYW5kIHNpZ25hbHMuICovCi0JaWYgKG1lbWNtcCgmdGVybSwgJm90ZXJtLCBzaXplb2YodGVybSkpICE9IDApIHsKLQkJd2hpbGUgKHRjc2V0YXR0cihpbnB1dCwgX1RfRkxVU0gsICZvdGVybSkgPT0gLTEgJiYKLQkJICAgIGVycm5vID09IEVJTlRSKQotCQkJY29udGludWU7Ci0JfQotCSh2b2lkKXNpZ2FjdGlvbihTSUdBTFJNLCAmc2F2ZWFscm0sIE5VTEwpOwotCSh2b2lkKXNpZ2FjdGlvbihTSUdIVVAsICZzYXZlaHVwLCBOVUxMKTsKLQkodm9pZClzaWdhY3Rpb24oU0lHSU5ULCAmc2F2ZWludCwgTlVMTCk7Ci0JKHZvaWQpc2lnYWN0aW9uKFNJR1FVSVQsICZzYXZlcXVpdCwgTlVMTCk7Ci0JKHZvaWQpc2lnYWN0aW9uKFNJR1BJUEUsICZzYXZlcGlwZSwgTlVMTCk7Ci0JKHZvaWQpc2lnYWN0aW9uKFNJR1RFUk0sICZzYXZldGVybSwgTlVMTCk7Ci0JKHZvaWQpc2lnYWN0aW9uKFNJR1RTVFAsICZzYXZldHN0cCwgTlVMTCk7Ci0JKHZvaWQpc2lnYWN0aW9uKFNJR1RUSU4sICZzYXZldHRpbiwgTlVMTCk7Ci0JKHZvaWQpc2lnYWN0aW9uKFNJR1RUT1UsICZzYXZldHRvdSwgTlVMTCk7Ci0JaWYgKGlucHV0ICE9IFNURElOX0ZJTEVOTykKLQkJKHZvaWQpY2xvc2UoaW5wdXQpOwotCi0JLyoKLQkgKiBJZiB3ZSB3ZXJlIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLCByZXNlbmQgaXQgdG8gb3Vyc2VsdmVzCi0JICogbm93IHRoYXQgd2UgaGF2ZSByZXN0b3JlZCB0aGUgc2lnbmFsIGhhbmRsZXJzLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBfTlNJRzsgaSsrKSB7Ci0JCWlmIChzaWdub1tpXSkgewotCQkJa2lsbChnZXRwaWQoKSwgaSk7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCWNhc2UgU0lHVFNUUDoKLQkJCWNhc2UgU0lHVFRJTjoKLQkJCWNhc2UgU0lHVFRPVToKLQkJCQluZWVkX3Jlc3RhcnQgPSAxOwotCQkJfQotCQl9Ci0JfQotCWlmIChuZWVkX3Jlc3RhcnQpCi0JCWdvdG8gcmVzdGFydDsKLQotCWlmIChzYXZlX2Vycm5vKQotCQllcnJubyA9IHNhdmVfZXJybm87Ci0JcmV0dXJuKG5yID09IC0xID8gTlVMTCA6IGJ1Zik7Ci19Ci0KLSNpZiAwCi1jaGFyICoKLWdldHBhc3MoY29uc3QgY2hhciAqcHJvbXB0KQotewotCXN0YXRpYyBjaGFyIGJ1ZltfUEFTU1dPUkRfTEVOICsgMV07Ci0KLQlyZXR1cm4ocmVhZHBhc3NwaHJhc2UocHJvbXB0LCBidWYsIHNpemVvZihidWYpLCBSUFBfRUNIT19PRkYpKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBoYW5kbGVyKGludCBzKQotewotCi0Jc2lnbm9bc10gPSAxOwotfQotI2VuZGlmIC8qIEhBVkVfUkVBRFBBU1NQSFJBU0UgKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L3JlYWRwYXNzcGhyYXNlLmggYi9vcGVuYnNkLWNvbXBhdC9yZWFkcGFzc3BocmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmQ3YzVkLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3JlYWRwYXNzcGhyYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgkkT3BlbkJTRDogcmVhZHBhc3NwaHJhc2UuaCx2IDEuNSAyMDAzLzA2LzE3IDIxOjU2OjIzIG1pbGxlcnQgRXhwICQJKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBUb2RkIEMuIE1pbGxlciA8VG9kZC5NaWxsZXJAY291cnRlc2FuLmNvbT4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqCi0gKiBTcG9uc29yZWQgaW4gcGFydCBieSB0aGUgRGVmZW5zZSBBZHZhbmNlZCBSZXNlYXJjaCBQcm9qZWN0cwotICogQWdlbmN5IChEQVJQQSkgYW5kIEFpciBGb3JjZSBSZXNlYXJjaCBMYWJvcmF0b3J5LCBBaXIgRm9yY2UKLSAqIE1hdGVyaWVsIENvbW1hbmQsIFVTQUYsIHVuZGVyIGFncmVlbWVudCBudW1iZXIgRjM5NTAyLTk5LTEtMDUxMi4KLSAqLwotCi0vKiBPUEVOQlNEIE9SSUdJTkFMOiBpbmNsdWRlL3JlYWRwYXNzcGhyYXNlLmggKi8KLQotI2lmbmRlZiBfUkVBRFBBU1NQSFJBU0VfSF8KLSNkZWZpbmUgX1JFQURQQVNTUEhSQVNFX0hfCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZuZGVmIEhBVkVfUkVBRFBBU1NQSFJBU0UKLQotI2RlZmluZSBSUFBfRUNIT19PRkYgICAgMHgwMAkJLyogVHVybiBvZmYgZWNobyAoZGVmYXVsdCkuICovCi0jZGVmaW5lIFJQUF9FQ0hPX09OICAgICAweDAxCQkvKiBMZWF2ZSBlY2hvIG9uLiAqLwotI2RlZmluZSBSUFBfUkVRVUlSRV9UVFkgMHgwMgkJLyogRmFpbCBpZiB0aGVyZSBpcyBubyB0dHkuICovCi0jZGVmaW5lIFJQUF9GT1JDRUxPV0VSICAweDA0CQkvKiBGb3JjZSBpbnB1dCB0byBsb3dlciBjYXNlLiAqLwotI2RlZmluZSBSUFBfRk9SQ0VVUFBFUiAgMHgwOAkJLyogRm9yY2UgaW5wdXQgdG8gdXBwZXIgY2FzZS4gKi8KLSNkZWZpbmUgUlBQX1NFVkVOQklUICAgIDB4MTAJCS8qIFN0cmlwIHRoZSBoaWdoIGJpdCBmcm9tIGlucHV0LiAqLwotI2RlZmluZSBSUFBfU1RESU4gICAgICAgMHgyMAkJLyogUmVhZCBmcm9tIHN0ZGluLCBub3QgL2Rldi90dHkgKi8KLQotY2hhciAqIHJlYWRwYXNzcGhyYXNlKGNvbnN0IGNoYXIgKiwgY2hhciAqLCBzaXplX3QsIGludCk7Ci0KLSNlbmRpZiAvKiBIQVZFX1JFQURQQVNTUEhSQVNFICovCi0KLSNlbmRpZiAvKiAhX1JFQURQQVNTUEhSQVNFX0hfICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9yZWFscGF0aC5jIGIvb3BlbmJzZC1jb21wYXQvcmVhbHBhdGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxMjBkMC4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9yZWFscGF0aC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qCSRPcGVuQlNEOiByZWFscGF0aC5jLHYgMS4xMyAyMDA1LzA4LzA4IDA4OjA1OjM3IGVzcGllIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzIENvbnN0YW50aW4gUy4gU3ZpbnRzb2ZmIDxrb3N0aWtAaWNsdWIubnN1LnJ1PgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9zdGRsaWIvcmVhbHBhdGguYyAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmICFkZWZpbmVkKEhBVkVfUkVBTFBBVEgpIHx8IGRlZmluZWQoQlJPS0VOX1JFQUxQQVRIKQotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLS8qCi0gKiBjaGFyICpyZWFscGF0aChjb25zdCBjaGFyICpwYXRoLCBjaGFyIHJlc29sdmVkW1BBVEhfTUFYXSk7Ci0gKgotICogRmluZCB0aGUgcmVhbCBuYW1lIG9mIHBhdGgsIGJ5IHJlbW92aW5nIGFsbCAiLiIsICIuLiIgYW5kIHN5bWxpbmsKLSAqIGNvbXBvbmVudHMuICBSZXR1cm5zIChyZXNvbHZlZCkgb24gc3VjY2Vzcywgb3IgKE5VTEwpIG9uIGZhaWx1cmUsCi0gKiBpbiB3aGljaCBjYXNlIHRoZSBwYXRoIHdoaWNoIGNhdXNlZCB0cm91YmxlIGlzIGxlZnQgaW4gKHJlc29sdmVkKS4KLSAqLwotY2hhciAqCi1yZWFscGF0aChjb25zdCBjaGFyICpwYXRoLCBjaGFyIHJlc29sdmVkW1BBVEhfTUFYXSkKLXsKLQlzdHJ1Y3Qgc3RhdCBzYjsKLQljaGFyICpwLCAqcSwgKnM7Ci0Jc2l6ZV90IGxlZnRfbGVuLCByZXNvbHZlZF9sZW47Ci0JdW5zaWduZWQgc3ltbGlua3M7Ci0JaW50IHNlcnJubywgc2xlbjsKLQljaGFyIGxlZnRbUEFUSF9NQVhdLCBuZXh0X3Rva2VuW1BBVEhfTUFYXSwgc3ltbGlua1tQQVRIX01BWF07Ci0KLQlzZXJybm8gPSBlcnJubzsKLQlzeW1saW5rcyA9IDA7Ci0JaWYgKHBhdGhbMF0gPT0gJy8nKSB7Ci0JCXJlc29sdmVkWzBdID0gJy8nOwotCQlyZXNvbHZlZFsxXSA9ICdcMCc7Ci0JCWlmIChwYXRoWzFdID09ICdcMCcpCi0JCQlyZXR1cm4gKHJlc29sdmVkKTsKLQkJcmVzb2x2ZWRfbGVuID0gMTsKLQkJbGVmdF9sZW4gPSBzdHJsY3B5KGxlZnQsIHBhdGggKyAxLCBzaXplb2YobGVmdCkpOwotCX0gZWxzZSB7Ci0JCWlmIChnZXRjd2QocmVzb2x2ZWQsIFBBVEhfTUFYKSA9PSBOVUxMKSB7Ci0JCQlzdHJsY3B5KHJlc29sdmVkLCAiLiIsIFBBVEhfTUFYKTsKLQkJCXJldHVybiAoTlVMTCk7Ci0JCX0KLQkJcmVzb2x2ZWRfbGVuID0gc3RybGVuKHJlc29sdmVkKTsKLQkJbGVmdF9sZW4gPSBzdHJsY3B5KGxlZnQsIHBhdGgsIHNpemVvZihsZWZ0KSk7Ci0JfQotCWlmIChsZWZ0X2xlbiA+PSBzaXplb2YobGVmdCkgfHwgcmVzb2x2ZWRfbGVuID49IFBBVEhfTUFYKSB7Ci0JCWVycm5vID0gRU5BTUVUT09MT05HOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCS8qCi0JICogSXRlcmF0ZSBvdmVyIHBhdGggY29tcG9uZW50cyBpbiBgbGVmdCcuCi0JICovCi0Jd2hpbGUgKGxlZnRfbGVuICE9IDApIHsKLQkJLyoKLQkJICogRXh0cmFjdCB0aGUgbmV4dCBwYXRoIGNvbXBvbmVudCBhbmQgYWRqdXN0IGBsZWZ0JwotCQkgKiBhbmQgaXRzIGxlbmd0aC4KLQkJICovCi0JCXAgPSBzdHJjaHIobGVmdCwgJy8nKTsKLQkJcyA9IHAgPyBwIDogbGVmdCArIGxlZnRfbGVuOwotCQlpZiAocyAtIGxlZnQgPj0gc2l6ZW9mKG5leHRfdG9rZW4pKSB7Ci0JCQllcnJubyA9IEVOQU1FVE9PTE9ORzsKLQkJCXJldHVybiAoTlVMTCk7Ci0JCX0KLQkJbWVtY3B5KG5leHRfdG9rZW4sIGxlZnQsIHMgLSBsZWZ0KTsKLQkJbmV4dF90b2tlbltzIC0gbGVmdF0gPSAnXDAnOwotCQlsZWZ0X2xlbiAtPSBzIC0gbGVmdDsKLQkJaWYgKHAgIT0gTlVMTCkKLQkJCW1lbW1vdmUobGVmdCwgcyArIDEsIGxlZnRfbGVuICsgMSk7Ci0JCWlmIChyZXNvbHZlZFtyZXNvbHZlZF9sZW4gLSAxXSAhPSAnLycpIHsKLQkJCWlmIChyZXNvbHZlZF9sZW4gKyAxID49IFBBVEhfTUFYKSB7Ci0JCQkJZXJybm8gPSBFTkFNRVRPT0xPTkc7Ci0JCQkJcmV0dXJuIChOVUxMKTsKLQkJCX0KLQkJCXJlc29sdmVkW3Jlc29sdmVkX2xlbisrXSA9ICcvJzsKLQkJCXJlc29sdmVkW3Jlc29sdmVkX2xlbl0gPSAnXDAnOwotCQl9Ci0JCWlmIChuZXh0X3Rva2VuWzBdID09ICdcMCcpCi0JCQljb250aW51ZTsKLQkJZWxzZSBpZiAoc3RyY21wKG5leHRfdG9rZW4sICIuIikgPT0gMCkKLQkJCWNvbnRpbnVlOwotCQllbHNlIGlmIChzdHJjbXAobmV4dF90b2tlbiwgIi4uIikgPT0gMCkgewotCQkJLyoKLQkJCSAqIFN0cmlwIHRoZSBsYXN0IHBhdGggY29tcG9uZW50IGV4Y2VwdCB3aGVuIHdlIGhhdmUKLQkJCSAqIHNpbmdsZSAiLyIKLQkJCSAqLwotCQkJaWYgKHJlc29sdmVkX2xlbiA+IDEpIHsKLQkJCQlyZXNvbHZlZFtyZXNvbHZlZF9sZW4gLSAxXSA9ICdcMCc7Ci0JCQkJcSA9IHN0cnJjaHIocmVzb2x2ZWQsICcvJykgKyAxOwotCQkJCSpxID0gJ1wwJzsKLQkJCQlyZXNvbHZlZF9sZW4gPSBxIC0gcmVzb2x2ZWQ7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qCi0JCSAqIEFwcGVuZCB0aGUgbmV4dCBwYXRoIGNvbXBvbmVudCBhbmQgbHN0YXQoKSBpdC4gSWYKLQkJICogbHN0YXQoKSBmYWlscyB3ZSBzdGlsbCBjYW4gcmV0dXJuIHN1Y2Nlc3NmdWxseSBpZgotCQkgKiB0aGVyZSBhcmUgbm8gbW9yZSBwYXRoIGNvbXBvbmVudHMgbGVmdC4KLQkJICovCi0JCXJlc29sdmVkX2xlbiA9IHN0cmxjYXQocmVzb2x2ZWQsIG5leHRfdG9rZW4sIFBBVEhfTUFYKTsKLQkJaWYgKHJlc29sdmVkX2xlbiA+PSBQQVRIX01BWCkgewotCQkJZXJybm8gPSBFTkFNRVRPT0xPTkc7Ci0JCQlyZXR1cm4gKE5VTEwpOwotCQl9Ci0JCWlmIChsc3RhdChyZXNvbHZlZCwgJnNiKSAhPSAwKSB7Ci0JCQlpZiAoZXJybm8gPT0gRU5PRU5UICYmIHAgPT0gTlVMTCkgewotCQkJCWVycm5vID0gc2Vycm5vOwotCQkJCXJldHVybiAocmVzb2x2ZWQpOwotCQkJfQotCQkJcmV0dXJuIChOVUxMKTsKLQkJfQotCQlpZiAoU19JU0xOSyhzYi5zdF9tb2RlKSkgewotCQkJaWYgKHN5bWxpbmtzKysgPiBNQVhTWU1MSU5LUykgewotCQkJCWVycm5vID0gRUxPT1A7Ci0JCQkJcmV0dXJuIChOVUxMKTsKLQkJCX0KLQkJCXNsZW4gPSByZWFkbGluayhyZXNvbHZlZCwgc3ltbGluaywgc2l6ZW9mKHN5bWxpbmspIC0gMSk7Ci0JCQlpZiAoc2xlbiA8IDApCi0JCQkJcmV0dXJuIChOVUxMKTsKLQkJCXN5bWxpbmtbc2xlbl0gPSAnXDAnOwotCQkJaWYgKHN5bWxpbmtbMF0gPT0gJy8nKSB7Ci0JCQkJcmVzb2x2ZWRbMV0gPSAwOwotCQkJCXJlc29sdmVkX2xlbiA9IDE7Ci0JCQl9IGVsc2UgaWYgKHJlc29sdmVkX2xlbiA+IDEpIHsKLQkJCQkvKiBTdHJpcCB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudC4gKi8KLQkJCQlyZXNvbHZlZFtyZXNvbHZlZF9sZW4gLSAxXSA9ICdcMCc7Ci0JCQkJcSA9IHN0cnJjaHIocmVzb2x2ZWQsICcvJykgKyAxOwotCQkJCSpxID0gJ1wwJzsKLQkJCQlyZXNvbHZlZF9sZW4gPSBxIC0gcmVzb2x2ZWQ7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBJZiB0aGVyZSBhcmUgYW55IHBhdGggY29tcG9uZW50cyBsZWZ0LCB0aGVuCi0JCQkgKiBhcHBlbmQgdGhlbSB0byBzeW1saW5rLiBUaGUgcmVzdWx0IGlzIHBsYWNlZAotCQkJICogaW4gYGxlZnQnLgotCQkJICovCi0JCQlpZiAocCAhPSBOVUxMKSB7Ci0JCQkJaWYgKHN5bWxpbmtbc2xlbiAtIDFdICE9ICcvJykgewotCQkJCQlpZiAoc2xlbiArIDEgPj0gc2l6ZW9mKHN5bWxpbmspKSB7Ci0JCQkJCQllcnJubyA9IEVOQU1FVE9PTE9ORzsKLQkJCQkJCXJldHVybiAoTlVMTCk7Ci0JCQkJCX0KLQkJCQkJc3ltbGlua1tzbGVuXSA9ICcvJzsKLQkJCQkJc3ltbGlua1tzbGVuICsgMV0gPSAwOwotCQkJCX0KLQkJCQlsZWZ0X2xlbiA9IHN0cmxjYXQoc3ltbGluaywgbGVmdCwgc2l6ZW9mKGxlZnQpKTsKLQkJCQlpZiAobGVmdF9sZW4gPj0gc2l6ZW9mKGxlZnQpKSB7Ci0JCQkJCWVycm5vID0gRU5BTUVUT09MT05HOwotCQkJCQlyZXR1cm4gKE5VTEwpOwotCQkJCX0KLQkJCX0KLQkJCWxlZnRfbGVuID0gc3RybGNweShsZWZ0LCBzeW1saW5rLCBzaXplb2YobGVmdCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZW1vdmUgdHJhaWxpbmcgc2xhc2ggZXhjZXB0IHdoZW4gdGhlIHJlc29sdmVkIHBhdGhuYW1lCi0JICogaXMgYSBzaW5nbGUgIi8iLgotCSAqLwotCWlmIChyZXNvbHZlZF9sZW4gPiAxICYmIHJlc29sdmVkW3Jlc29sdmVkX2xlbiAtIDFdID09ICcvJykKLQkJcmVzb2x2ZWRbcmVzb2x2ZWRfbGVuIC0gMV0gPSAnXDAnOwotCXJldHVybiAocmVzb2x2ZWQpOwotfQotI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfUkVBTFBBVEgpIHx8IGRlZmluZWQoQlJPS0VOX1JFQUxQQVRIKSAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9NYWtlZmlsZS5pbiBiL29wZW5ic2QtY29tcGF0L3JlZ3Jlc3MvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZjIxNGIuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMgJElkOiBNYWtlZmlsZS5pbix2IDEuNCAyMDA2LzA4LzE5IDA5OjEyOjE0IGR0dWNrZXIgRXhwICQKLQotc3lzY29uZmRpcj1Ac3lzY29uZmRpckAKLXBpZGRpcj1AcGlkZGlyQAotc3JjZGlyPUBzcmNkaXJACi10b3Bfc3JjZGlyPUB0b3Bfc3JjZGlyQAotCi1WUEFUSD1Ac3JjZGlyQAotQ0M9QENDQAotTEQ9QExEQAotQ0ZMQUdTPUBDRkxBR1NACi1DUFBGTEFHUz0tSS4gLUkuLiAtSSQoc3JjZGlyKSAtSSQoc3JjZGlyKS8uLiBAQ1BQRkxBR1NAIEBERUZTQAotRVhFRVhUPUBFWEVFWFRACi1MSUJDT01QQVQ9Li4vbGlib3BlbmJzZC1jb21wYXQuYQotTElCUz1ATElCU0AKLUxERkxBR1M9QExERkxBR1NAICQoTElCQ09NUEFUKQotCi1URVNUUFJPR1M9Y2xvc2Vmcm9tdGVzdCQoRVhFRVhUKSBzbnByaW50ZnRlc3QkKEVYRUVYVCkgc3RyZHVwdGVzdCQoRVhFRVhUKSBcCi0Jc3RydG9udW10ZXN0JChFWEVFWFQpCi0KLWFsbDoJdC1leGVjICR7T1RIRVJURVNUU30KLQotJSQoRVhFRVhUKToJJS5jCi0JJChDQykgJChDRkxBR1MpICQoQ1BQRkxBR1MpICQoTERGTEFHUykgLW8gJEAgJDwgJChMSUJDT01QQVQpICQoTElCUykKLQotdC1leGVjOgkkKFRFU1RQUk9HUykKLQlAZWNobyBydW5uaW5nIGNvbXBhdCByZWdyZXNzIHRlc3RzCi0JQGZvciBURVNUIGluICIiJD87IGRvIFwKLQkJZWNobyAicnVuIHRlc3QgJCR7VEVTVH0iIC4uLiAxPiYyOyBcCi0JCS4vJCR7VEVTVH0kKEVYRUVYVCkgfHwgZXhpdCAkJD8gOyBcCi0JZG9uZQotCUBlY2hvIGZpbmlzaGVkIGNvbXBhdCByZWdyZXNzIHRlc3RzCi0KLWNsZWFuOgotCXJtIC1mICoubyAqLmEgY29yZSAkKFRFU1RQUk9HUykgdmFsaWQub3V0Ci0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSAqfgpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9jbG9zZWZyb210ZXN0LmMgYi9vcGVuYnNkLWNvbXBhdC9yZWdyZXNzL2Nsb3NlZnJvbXRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmZmViOS4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9yZWdyZXNzL2Nsb3NlZnJvbXRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgRGFycmVuIFR1Y2tlcgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jZGVmaW5lIE5VTV9PUEVOUyAxMAotCi1pbnQgY2xvc2Vmcm9tKGludCk7Ci0KLXZvaWQKLWZhaWwoY2hhciAqbXNnKQotewotCWZwcmludGYoc3RkZXJyLCAiY2xvc2Vmcm9tOiAlc1xuIiwgbXNnKTsKLQlleGl0KDEpOwotfQotCi1pbnQKLW1haW4odm9pZCkKLXsKLQlpbnQgaSwgbWF4LCBmZHNbTlVNX09QRU5TXTsKLQljaGFyIGJ1Zls1MTJdOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9PUEVOUzsgaSsrKQotCQlpZiAoKGZkc1tpXSA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRPTkxZKSkgPT0gLTEpCi0JCQlleGl0KDApOwkvKiBjYW4ndCB0ZXN0ICovCi0JbWF4ID0gaSAtIDE7Ci0KLQkvKiBzaG91bGQgY2xvc2UgbGFzdCBmZCBvbmx5ICovCi0JY2xvc2Vmcm9tKGZkc1ttYXhdKTsKLQlpZiAoY2xvc2UoZmRzW21heF0pICE9IC0xKQotCQlmYWlsKCJmYWlsZWQgdG8gY2xvc2UgaGlnaGVzdCBmZCIpOwotCi0JLyogbWFrZSBzdXJlIHdlIGNhbiBzdGlsbCB1c2UgcmVtYWluaW5nIGRlc2NyaXB0b3JzICovCi0JZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKQotCQlpZiAocmVhZChmZHNbaV0sIGJ1Ziwgc2l6ZW9mKGJ1ZikpID09IC0xKQotCQkJZmFpbCgiY2xvc2VkIGRlc2NyaXB0b3JzIGl0IHNob3VsZCBub3QgaGF2ZSIpOwotCi0JLyogc2hvdWxkIGNsb3NlIGFsbCBmZHMgKi8KLQljbG9zZWZyb20oZmRzWzBdKTsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX09QRU5TOyBpKyspCi0JCWlmIChjbG9zZShmZHNbaV0pICE9IC0xKQotCQkJZmFpbCgiZmFpbGVkIHRvIGNsb3NlIGZyb20gbG93ZXN0IGZkIik7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9yZWdyZXNzL3NucHJpbnRmdGVzdC5jIGIvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9zbnByaW50ZnRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhNjNlMS4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9yZWdyZXNzL3NucHJpbnRmdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSBEYXJyZW4gVHVja2VyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGFtaWVuIE1pbGxlcgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNkZWZpbmUgQlVGU1ogMjA0OAotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotc3RhdGljIGludCBmYWlsZWQgPSAwOwotCi1zdGF0aWMgdm9pZAotZmFpbChjb25zdCBjaGFyICptKQotewotCWZwcmludGYoc3RkZXJyLCAic25wcmludGZ0ZXN0OiAlc1xuIiwgbSk7Ci0JZmFpbGVkID0gMTsKLX0KLQotaW50IHhfc25wcmludGYoY2hhciAqc3RyLCBzaXplX3QgY291bnQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXNpemVfdCByZXQ7Ci0JdmFfbGlzdCBhcDsKLQotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCXJldCA9IHZzbnByaW50ZihzdHIsIGNvdW50LCBmbXQsIGFwKTsKLQl2YV9lbmQoYXApOwotCXJldHVybiByZXQ7Ci19Ci0KLWludAotbWFpbih2b2lkKQotewotCWNoYXIgYls1XTsKLQljaGFyICpzcmM7Ci0KLQlzbnByaW50ZihiLDUsIjEyMzQ1Njc4OSIpOwotCWlmIChiWzRdICE9ICdcMCcpCi0JCWZhaWwoInNucHJpbnRmIGRvZXMgbm90IGNvcnJlY3RseSB0ZXJtaW5hdGUgbG9uZyBzdHJpbmdzIik7Ci0KLQkvKiBjaGVjayBmb3IgcmVhZCBvdmVycnVuIG9uIHVudGVybWluYXRlZCBzdHJpbmcgKi8KLQlpZiAoKHNyYyA9IG1hbGxvYyhCVUZTWikpID09IE5VTEwpIHsKLQkJZmFpbCgibWFsbG9jIGZhaWxlZCIpOwotCX0gZWxzZSB7Ci0JCW1lbXNldChzcmMsICdhJywgQlVGU1opOwotCQlzbnByaW50ZihiLCBzaXplb2YoYiksICIlLipzIiwgMSwgc3JjKTsKLQkJaWYgKHN0cmNtcChiLCAiYSIpICE9IDApCi0JCQlmYWlsKCJmYWlsZWQgd2l0aCBsZW5ndGggbGltaXQgJyUlLnMnIik7Ci0JfQotCi0JLyogY2hlY2sgdGhhdCBzbnByaW50ZiBhbmQgdnNucHJpbnRmIHJldHVybiBzYW5lIHZhbHVlcyAqLwotCWlmIChzbnByaW50ZihiLCAxLCAiJXMgJWQiLCAiaGVsbG8iLCAxMjM0NSkgIT0gMTEpCi0JCWZhaWwoInNucHJpbnRmIGRvZXMgbm90IHJldHVybiByZXF1aXJlZCBsZW5ndGgiKTsKLQlpZiAoeF9zbnByaW50ZihiLCAxLCAiJXMgJWQiLCAiaGVsbG8iLCAxMjM0NSkgIT0gMTEpCi0JCWZhaWwoInZzbnByaW50ZiBkb2VzIG5vdCByZXR1cm4gcmVxdWlyZWQgbGVuZ3RoIik7Ci0KLQlyZXR1cm4gZmFpbGVkOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9zdHJkdXB0ZXN0LmMgYi9vcGVuYnNkLWNvbXBhdC9yZWdyZXNzL3N0cmR1cHRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2ZDc3OS4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9yZWdyZXNzL3N0cmR1cHRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGFycmVuIFR1Y2tlcgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotc3RhdGljIGludCBmYWlsID0gMDsKLQotdm9pZAotdGVzdChjb25zdCBjaGFyICphKQotewotCWNoYXIgKmI7Ci0KLQliID0gc3RyZHVwKGEpOwotCWlmIChiID09IDApIHsKLQkJZmFpbCA9IDE7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHN0cmNtcChhLCBiKSAhPSAwKQotCQlmYWlsID0gMTsKLQlmcmVlKGIpOwotfQotCi1pbnQKLW1haW4odm9pZCkKLXsKLQl0ZXN0KCIiKTsKLQl0ZXN0KCJhIik7Ci0JdGVzdCgiXDAiKTsKLQl0ZXN0KCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpOwotCXJldHVybiBmYWlsOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9zdHJ0b251bXRlc3QuYyBiL29wZW5ic2QtY29tcGF0L3JlZ3Jlc3Mvc3RydG9udW10ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwY2E1YmQuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvcmVncmVzcy9zdHJ0b251bXRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCSRPcGVuQlNEOiBzdHJ0b251bXRlc3QuYyx2IDEuMSAyMDA0LzA4LzAzIDIwOjM4OjM2IG90dG8gRXhwICQJKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgT3R0byBNb2VyYmVlayA8b3R0b0BkcmlqZi5uZXQ+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogcmVncmVzcy9saWIvbGliYy9zdHJ0b251bS9zdHJ0b251bXRlc3QuYyAqLwotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyogTExPTkdfTUFYIGlzIGtub3duIGFzIExPTkdMT05HX01BWCBvbiBBSVggKi8KLSNpZiBkZWZpbmVkKExPTkdMT05HX01BWCkgJiYgIWRlZmluZWQoTExPTkdfTUFYKQotIyBkZWZpbmUgTExPTkdfTUFYIExPTkdMT05HX01BWAotIyBkZWZpbmUgTExPTkdfTUlOIExPTkdMT05HX01JTgotI2VuZGlmCi0KLS8qIExMT05HX01BWCBpcyBrbm93biBhcyBMT05HX0xPTkdfTUFYIG9uIEhQLVVYICovCi0jaWYgZGVmaW5lZChMT05HX0xPTkdfTUFYKSAmJiAhZGVmaW5lZChMTE9OR19NQVgpCi0jIGRlZmluZSBMTE9OR19NQVggTE9OR19MT05HX01BWAotIyBkZWZpbmUgTExPTkdfTUlOIExPTkdfTE9OR19NSU4KLSNlbmRpZgotCi1sb25nIGxvbmcgc3RydG9udW0oY29uc3QgY2hhciAqLCBsb25nIGxvbmcsIGxvbmcgbG9uZywgY29uc3QgY2hhciAqKik7Ci0KLWludCBmYWlsOwotCi12b2lkCi10ZXN0KGNvbnN0IGNoYXIgKnAsIGxvbmcgbG9uZyBsYiwgbG9uZyBsb25nIHViLCBpbnQgb2spCi17Ci0JbG9uZyBsb25nIHZhbDsKLQljb25zdCBjaGFyICpxOwotCi0JdmFsID0gc3RydG9udW0ocCwgbGIsIHViLCAmcSk7Ci0JaWYgKG9rICYmIHEgIT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVzIFslbGxkLSVsbGRdICIsIHAsIGxiLCB1Yik7Ci0JCWZwcmludGYoc3RkZXJyLCAiTlVNQkVSIE5PVCBBQ0NFUFRFRCAlc1xuIiwgcSk7Ci0JCWZhaWwgPSAxOwotCX0gZWxzZSBpZiAoIW9rICYmIHEgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVzIFslbGxkLSVsbGRdICVsbGQgIiwgcCwgbGIsIHViLCB2YWwpOwotCQlmcHJpbnRmKHN0ZGVyciwgIk5VTUJFUiBBQ0NFUFRFRFxuIik7Ci0JCWZhaWwgPSAxOwotCX0KLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQl0ZXN0KCIxIiwgMCwgMTAsIDEpOwotCXRlc3QoIjAiLCAtMiwgNSwgMSk7Ci0JdGVzdCgiMCIsIDIsIDUsIDApOwotCXRlc3QoIjAiLCAyLCBMTE9OR19NQVgsIDApOwotCXRlc3QoIi0yIiwgMCwgTExPTkdfTUFYLCAwKTsKLQl0ZXN0KCIwIiwgLTUsIExMT05HX01BWCwgMSk7Ci0JdGVzdCgiLTMiLCAtMywgTExPTkdfTUFYLCAxKTsKLQl0ZXN0KCItOTIyMzM3MjAzNjg1NDc3NTgwOCIsIExMT05HX01JTiwgTExPTkdfTUFYLCAxKTsKLQl0ZXN0KCI5MjIzMzcyMDM2ODU0Nzc1ODA3IiwgTExPTkdfTUlOLCBMTE9OR19NQVgsIDEpOwotCXRlc3QoIi05MjIzMzcyMDM2ODU0Nzc1ODA5IiwgTExPTkdfTUlOLCBMTE9OR19NQVgsIDApOwotCXRlc3QoIjkyMjMzNzIwMzY4NTQ3NzU4MDgiLCBMTE9OR19NSU4sIExMT05HX01BWCwgMCk7Ci0JdGVzdCgiMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIExMT05HX01JTiwgTExPTkdfTUFYLCAwKTsKLQl0ZXN0KCItMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIExMT05HX01JTiwgTExPTkdfTUFYLCAwKTsKLQl0ZXN0KCItMiIsIDEwLCAtMSwgMCk7Ci0JdGVzdCgiLTIiLCAtMTAsIC0xLCAxKTsKLQl0ZXN0KCItMjAiLCAtMTAsIC0xLCAwKTsKLQl0ZXN0KCIyMCIsIC0xMCwgLTEsIDApOwotCi0JcmV0dXJuIChmYWlsKTsKLX0KLQpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvcnJlc3Zwb3J0LmMgYi9vcGVuYnNkLWNvbXBhdC9ycmVzdnBvcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkNjFlNS4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9ycmVzdnBvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKiAkT3BlbkJTRDogcnJlc3Zwb3J0LmMsdiAxLjkgMjAwNS8xMS8xMCAxMDowMDoxNyBlc3BpZSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiwgMTk5OCBUaGVvIGRlIFJhYWR0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5MywgMTk5NAotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLS8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL25ldC9ycmVzdnBvcnQuYyAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmbmRlZiBIQVZFX1JSRVNWUE9SVF9BRgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2lmIDAKLWludAotcnJlc3Zwb3J0KGludCAqYWxwb3J0KQotewotCXJldHVybiBycmVzdnBvcnRfYWYoYWxwb3J0LCBBRl9JTkVUKTsKLX0KLSNlbmRpZgotCi1pbnQKLXJyZXN2cG9ydF9hZihpbnQgKmFscG9ydCwgc2FfZmFtaWx5X3QgYWYpCi17Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3M7Ci0Jc3RydWN0IHNvY2thZGRyICpzYTsKLQl1X2ludDE2X3QgKnBvcnRwOwotCWludCBzOwotCXNvY2tsZW5fdCBzYWxlbjsKLQotCW1lbXNldCgmc3MsICdcMCcsIHNpemVvZiBzcyk7Ci0Jc2EgPSAoc3RydWN0IHNvY2thZGRyICopJnNzOwotCi0Jc3dpdGNoIChhZikgewotCWNhc2UgQUZfSU5FVDoKLQkJc2FsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKLQkJcG9ydHAgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYSktPnNpbl9wb3J0OwotCQlicmVhazsKLQljYXNlIEFGX0lORVQ2OgotCQlzYWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKLQkJcG9ydHAgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2EpLT5zaW42X3BvcnQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycm5vID0gRVBGTk9TVVBQT1JUOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0Jc2EtPnNhX2ZhbWlseSA9IGFmOwotCQotCXMgPSBzb2NrZXQoYWYsIFNPQ0tfU1RSRUFNLCAwKTsKLQlpZiAocyA8IDApCi0JCXJldHVybiAoLTEpOwotCi0JKnBvcnRwID0gaHRvbnMoKmFscG9ydCk7Ci0JaWYgKCphbHBvcnQgPCBJUFBPUlRfUkVTRVJWRUQgLSAxKSB7Ci0JCWlmIChiaW5kKHMsIHNhLCBzYWxlbikgPj0gMCkKLQkJCXJldHVybiAocyk7Ci0JCWlmIChlcnJubyAhPSBFQUREUklOVVNFKSB7Ci0JCQkodm9pZCljbG9zZShzKTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JfQotCi0JKnBvcnRwID0gMDsKLQlzYS0+c2FfZmFtaWx5ID0gYWY7Ci0JaWYgKGJpbmRyZXN2cG9ydF9zYShzLCBzYSkgPT0gLTEpIHsKLQkJKHZvaWQpY2xvc2Uocyk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQkqYWxwb3J0ID0gbnRvaHMoKnBvcnRwKTsKLQlyZXR1cm4gKHMpOwotfQotCi0jZW5kaWYgLyogSEFWRV9SUkVTVlBPUlRfQUYgKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L3NldGVudi5jIGIvb3BlbmJzZC1jb21wYXQvc2V0ZW52LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYThiNmQuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvc2V0ZW52LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHNldGVudi5jLHYgMS45IDIwMDUvMDgvMDggMDg6MDU6MzcgZXNwaWUgRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODcgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvc3RkbGliL3NldGVudi5jICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2lmICFkZWZpbmVkKEhBVkVfU0VURU5WKSB8fCAhZGVmaW5lZChIQVZFX1VOU0VURU5WKQotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLWV4dGVybiBjaGFyICoqZW52aXJvbjsKLQotLyogT3BlblNTSCBQb3J0YWJsZTogX19maW5kZW52IGlzIGZyb20gZ2V0ZW52LmMgcmV2IDEuOCwgbWFkZSBzdGF0aWMgKi8KLS8qCi0gKiBfX2ZpbmRlbnYgLS0KLSAqCVJldHVybnMgcG9pbnRlciB0byB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggbmFtZSwgaWYgYW55LCBlbHNlIE5VTEwuCi0gKglTZXRzIG9mZnNldCB0byBiZSB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lL3ZhbHVlIGNvbWJpbmF0aW9uIGluIHRoZQotICoJZW52aXJvbm1lbnRhbCBhcnJheSwgZm9yIHVzZSBieSBzZXRlbnYoMykgYW5kIHVuc2V0ZW52KDMpLgotICoJRXhwbGljaXRseSByZW1vdmVzICc9JyBpbiBhcmd1bWVudCBuYW1lLgotICovCi1zdGF0aWMgY2hhciAqCi1fX2ZpbmRlbnYoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90ICpvZmZzZXQpCi17Ci0JZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotCWludCBsZW4sIGk7Ci0JY29uc3QgY2hhciAqbnA7Ci0JY2hhciAqKnAsICpjcDsKLQotCWlmIChuYW1lID09IE5VTEwgfHwgZW52aXJvbiA9PSBOVUxMKQotCQlyZXR1cm4gKE5VTEwpOwotCWZvciAobnAgPSBuYW1lOyAqbnAgJiYgKm5wICE9ICc9JzsgKytucCkKLQkJOwotCWxlbiA9IG5wIC0gbmFtZTsKLQlmb3IgKHAgPSBlbnZpcm9uOyAoY3AgPSAqcCkgIT0gTlVMTDsgKytwKSB7Ci0JCWZvciAobnAgPSBuYW1lLCBpID0gbGVuOyBpICYmICpjcDsgaS0tKQotCQkJaWYgKCpjcCsrICE9ICpucCsrKQotCQkJCWJyZWFrOwotCQlpZiAoaSA9PSAwICYmICpjcCsrID09ICc9JykgewotCQkJKm9mZnNldCA9IHAgLSBlbnZpcm9uOwotCQkJcmV0dXJuIChjcCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotI2lmbmRlZiBIQVZFX1NFVEVOVgotLyoKLSAqIHNldGVudiAtLQotICoJU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnRhbCB2YXJpYWJsZSAibmFtZSIgdG8gYmUKLSAqCSJ2YWx1ZSIuICBJZiByZXdyaXRlIGlzIHNldCwgcmVwbGFjZSBhbnkgY3VycmVudCB2YWx1ZS4KLSAqLwotaW50Ci1zZXRlbnYoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGludCByZXdyaXRlKQotewotCXN0YXRpYyBjaGFyICoqbGFzdGVudjsJCQkvKiBsYXN0IHZhbHVlIG9mIGVudmlyb24gKi8KLQljaGFyICpDOwotCXNpemVfdCBsX3ZhbHVlLCBvZmZzZXQ7Ci0KLQlpZiAoKnZhbHVlID09ICc9JykJCQkvKiBubyBgPScgaW4gdmFsdWUgKi8KLQkJKyt2YWx1ZTsKLQlsX3ZhbHVlID0gc3RybGVuKHZhbHVlKTsKLQlpZiAoKEMgPSBfX2ZpbmRlbnYobmFtZSwgJm9mZnNldCkpKSB7CS8qIGZpbmQgaWYgYWxyZWFkeSBleGlzdHMgKi8KLQkJaWYgKCFyZXdyaXRlKQotCQkJcmV0dXJuICgwKTsKLQkJaWYgKHN0cmxlbihDKSA+PSBsX3ZhbHVlKSB7CS8qIG9sZCBsYXJnZXI7IGNvcHkgb3ZlciAqLwotCQkJd2hpbGUgKCgqQysrID0gKnZhbHVlKyspKQotCQkJCTsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQl9IGVsc2UgewkJCQkJLyogY3JlYXRlIG5ldyBzbG90ICovCi0JCXNpemVfdCBjbnQ7Ci0JCWNoYXIgKipQOwotCi0JCWZvciAoUCA9IGVudmlyb247ICpQICE9IE5VTEw7IFArKykKLQkJCTsKLQkJY250ID0gUCAtIGVudmlyb247Ci0JCVAgPSAoY2hhciAqKilyZWFsbG9jKGxhc3RlbnYsIHNpemVvZihjaGFyICopICogKGNudCArIDIpKTsKLQkJaWYgKCFQKQotCQkJcmV0dXJuICgtMSk7Ci0JCWlmIChsYXN0ZW52ICE9IGVudmlyb24pCi0JCQltZW1jcHkoUCwgZW52aXJvbiwgY250ICogc2l6ZW9mKGNoYXIgKikpOwotCQlsYXN0ZW52ID0gZW52aXJvbiA9IFA7Ci0JCW9mZnNldCA9IGNudDsKLQkJZW52aXJvbltjbnQgKyAxXSA9IE5VTEw7Ci0JfQotCWZvciAoQyA9IChjaGFyICopbmFtZTsgKkMgJiYgKkMgIT0gJz0nOyArK0MpCi0JCTsJCQkJLyogbm8gYD0nIGluIG5hbWUgKi8KLQlpZiAoIShlbnZpcm9uW29mZnNldF0gPQkJCS8qIG5hbWUgKyBgPScgKyB2YWx1ZSAqLwotCSAgICBtYWxsb2MoKHNpemVfdCkoKGludCkoQyAtIG5hbWUpICsgbF92YWx1ZSArIDIpKSkpCi0JCXJldHVybiAoLTEpOwotCWZvciAoQyA9IGVudmlyb25bb2Zmc2V0XTsgKCpDID0gKm5hbWUrKykgJiYgKkMgIT0gJz0nOyArK0MpCi0JCTsKLQlmb3IgKCpDKysgPSAnPSc7ICgqQysrID0gKnZhbHVlKyspOyApCi0JCTsKLQlyZXR1cm4gKDApOwotfQotI2VuZGlmIC8qIEhBVkVfU0VURU5WICovCi0KLSNpZm5kZWYgSEFWRV9VTlNFVEVOVgotLyoKLSAqIHVuc2V0ZW52KG5hbWUpIC0tCi0gKglEZWxldGUgZW52aXJvbm1lbnRhbCB2YXJpYWJsZSAibmFtZSIuCi0gKi8KLXZvaWQKLXVuc2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JY2hhciAqKlA7Ci0Jc2l6ZV90IG9mZnNldDsKLQotCXdoaWxlIChfX2ZpbmRlbnYobmFtZSwgJm9mZnNldCkpCS8qIGlmIHNldCBtdWx0aXBsZSB0aW1lcyAqLwotCQlmb3IgKFAgPSAmZW52aXJvbltvZmZzZXRdOzsgKytQKQotCQkJaWYgKCEoKlAgPSAqKFAgKyAxKSkpCi0JCQkJYnJlYWs7Ci19Ci0jZW5kaWYgLyogSEFWRV9VTlNFVEVOViAqLwotCi0jZW5kaWYgLyogIWRlZmluZWQoSEFWRV9TRVRFTlYpIHx8ICFkZWZpbmVkKEhBVkVfVU5TRVRFTlYpICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9zZXRwcm9jdGl0bGUuYyBiL29wZW5ic2QtY29tcGF0L3NldHByb2N0aXRsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQ4YzRkLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3NldHByb2N0aXRsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qIEJhc2VkIG9uIGNvbmYuYyBmcm9tIFVDQiBzZW5kbWFpbCA4LjguOCAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGFtaWVuIE1pbGxlcgotICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTk1LTE5OTcgRXJpYyBQLiBBbGxtYW4KLSAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk5MwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZuZGVmIEhBVkVfU0VUUFJPQ1RJVExFCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpZmRlZiBIQVZFX1NZU19QU1RBVF9ICi0jaW5jbHVkZSA8c3lzL3BzdGF0Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInZpcy5oIgotCi0jZGVmaW5lIFNQVF9OT05FCTAJLyogZG9uJ3QgdXNlIGl0IGF0IGFsbCAqLwotI2RlZmluZSBTUFRfUFNUQVQJMQkvKiB1c2UgcHN0YXQoUFNUQVRfU0VUQ01ELCAuLi4pICovCi0jZGVmaW5lIFNQVF9SRVVTRUFSR1YJMgkvKiBjb3ZlciBhcmd2IHdpdGggdGl0bGUgaW5mb3JtYXRpb24gKi8KLQotI2lmbmRlZiBTUFRfVFlQRQotIyBkZWZpbmUgU1BUX1RZUEUJU1BUX05PTkUKLSNlbmRpZgotCi0jaWZuZGVmIFNQVF9QQURDSEFSCi0jIGRlZmluZSBTUFRfUEFEQ0hBUgknXDAnCi0jZW5kaWYKLQotI2lmIFNQVF9UWVBFID09IFNQVF9SRVVTRUFSR1YKLXN0YXRpYyBjaGFyICphcmd2X3N0YXJ0ID0gTlVMTDsKLXN0YXRpYyBzaXplX3QgYXJndl9lbnZfbGVuID0gMDsKLSNlbmRpZgotCi0jZW5kaWYgLyogSEFWRV9TRVRQUk9DVElUTEUgKi8KLQotdm9pZAotY29tcGF0X2luaXRfc2V0cHJvY3RpdGxlKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0jaWYgZGVmaW5lZChTUFRfVFlQRSkgJiYgU1BUX1RZUEUgPT0gU1BUX1JFVVNFQVJHVgotCWV4dGVybiBjaGFyICoqZW52aXJvbjsKLQljaGFyICpsYXN0YXJndiA9IE5VTEw7Ci0JY2hhciAqKmVudnAgPSBlbnZpcm9uOwotCWludCBpOwotCi0JLyoKLQkgKiBOQjogVGhpcyBhc3N1bWVzIHRoYXQgYXJndiBoYXMgYWxyZWFkeSBiZWVuIGNvcGllZCBvdXQgb2YgdGhlCi0JICogd2F5LiBUaGlzIGlzIHRydWUgZm9yIHNzaGQsIGJ1dCBtYXkgbm90IGJlIHRydWUgZm9yIG90aGVyIAotCSAqIHByb2dyYW1zLiBCZXdhcmUuCi0JICovCi0KLQlpZiAoYXJnYyA9PSAwIHx8IGFyZ3ZbMF0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLyogRmFpbCBpZiB3ZSBjYW4ndCBhbGxvY2F0ZSByb29tIGZvciB0aGUgbmV3IGVudmlyb25tZW50ICovCi0JZm9yIChpID0gMDsgZW52cFtpXSAhPSBOVUxMOyBpKyspCi0JCTsKLQlpZiAoKGVudmlyb24gPSBjYWxsb2MoaSArIDEsIHNpemVvZigqZW52aXJvbikpKSA9PSBOVUxMKSB7Ci0JCWVudmlyb24gPSBlbnZwOwkvKiBwdXQgaXQgYmFjayAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBGaW5kIHRoZSBsYXN0IGFyZ3Ygc3RyaW5nIG9yIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGhpbiAKLQkgKiBvdXIgcHJvY2VzcyBtZW1vcnkgYXJlYS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7Ci0JCWlmIChsYXN0YXJndiA9PSBOVUxMIHx8IGxhc3Rhcmd2ICsgMSA9PSBhcmd2W2ldKQotCQkJbGFzdGFyZ3YgPSBhcmd2W2ldICsgc3RybGVuKGFyZ3ZbaV0pOwotCX0KLQlmb3IgKGkgPSAwOyBlbnZwW2ldICE9IE5VTEw7IGkrKykgewotCQlpZiAobGFzdGFyZ3YgKyAxID09IGVudnBbaV0pCi0JCQlsYXN0YXJndiA9IGVudnBbaV0gKyBzdHJsZW4oZW52cFtpXSk7Ci0JfQotCi0JYXJndlsxXSA9IE5VTEw7Ci0JYXJndl9zdGFydCA9IGFyZ3ZbMF07Ci0JYXJndl9lbnZfbGVuID0gbGFzdGFyZ3YgLSBhcmd2WzBdIC0gMTsKLQotCS8qIAotCSAqIENvcHkgZW52aXJvbm1lbnQgCi0JICogWFhYIC0gd2lsbCB0cnVuY2F0ZSBlbnYgb24gc3RyZHVwIGZhaWwKLQkgKi8KLQlmb3IgKGkgPSAwOyBlbnZwW2ldICE9IE5VTEw7IGkrKykKLQkJZW52aXJvbltpXSA9IHN0cmR1cChlbnZwW2ldKTsKLQllbnZpcm9uW2ldID0gTlVMTDsKLSNlbmRpZiAvKiBTUFRfUkVVU0VBUkdWICovCi19Ci0KLSNpZm5kZWYgSEFWRV9TRVRQUk9DVElUTEUKLXZvaWQKLXNldHByb2N0aXRsZShjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSNpZiBTUFRfVFlQRSAhPSBTUFRfTk9ORQotCXZhX2xpc3QgYXA7Ci0JY2hhciBidWZbMTAyNF0sIHB0aXRsZVsxMDI0XTsKLQlzaXplX3QgbGVuOwotCWV4dGVybiBjaGFyICpfX3Byb2duYW1lOwotI2lmIFNQVF9UWVBFID09IFNQVF9QU1RBVAotCXVuaW9uIHBzdHVuIHBzdDsKLSNlbmRpZgotCi0jaWYgU1BUX1RZUEUgPT0gU1BUX1JFVVNFQVJHVgotCWlmIChhcmd2X2Vudl9sZW4gPD0gMCkKLQkJcmV0dXJuOwotI2VuZGlmCi0KLQlzdHJsY3B5KGJ1ZiwgX19wcm9nbmFtZSwgc2l6ZW9mKGJ1ZikpOwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JaWYgKGZtdCAhPSBOVUxMKSB7Ci0JCWxlbiA9IHN0cmxjYXQoYnVmLCAiOiAiLCBzaXplb2YoYnVmKSk7Ci0JCWlmIChsZW4gPCBzaXplb2YoYnVmKSkKLQkJCXZzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuICwgZm10LCBhcCk7Ci0JfQotCXZhX2VuZChhcCk7Ci0Jc3RybnZpcyhwdGl0bGUsIGJ1Ziwgc2l6ZW9mKHB0aXRsZSksCi0JICAgIFZJU19DU1RZTEV8VklTX05MfFZJU19UQUJ8VklTX09DVEFMKTsKLQotI2lmIFNQVF9UWVBFID09IFNQVF9QU1RBVAotCXBzdC5wc3RfY29tbWFuZCA9IHB0aXRsZTsKLQlwc3RhdChQU1RBVF9TRVRDTUQsIHBzdCwgc3RybGVuKHB0aXRsZSksIDAsIDApOwotI2VsaWYgU1BUX1RZUEUgPT0gU1BUX1JFVVNFQVJHVgotLyoJZGVidWcoInNldHByb2N0aXRsZTogY29weSBcIiVzXCIgaW50byBsZW4gJWQiLCAKLQkgICAgYnVmLCBhcmd2X2Vudl9sZW4pOyAqLwotCWxlbiA9IHN0cmxjcHkoYXJndl9zdGFydCwgcHRpdGxlLCBhcmd2X2Vudl9sZW4pOwotCWZvcig7IGxlbiA8IGFyZ3ZfZW52X2xlbjsgbGVuKyspCi0JCWFyZ3Zfc3RhcnRbbGVuXSA9IFNQVF9QQURDSEFSOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBTUFRfTk9ORSAqLwotfQotCi0jZW5kaWYgLyogSEFWRV9TRVRQUk9DVElUTEUgKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L3NoYTIuYyBiL29wZW5ic2QtY29tcGF0L3NoYTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2Y4ZTBhZC4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9zaGEyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ODIgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHNoYTIuYyx2IDEuMTEgMjAwNS8wOC8wOCAwODowNTozNSBlc3BpZSBFeHAgJAkqLwotCi0vKgotICogRklMRToJc2hhMi5jCi0gKiBBVVRIT1I6CUFhcm9uIEQuIEdpZmZvcmQgPG1lQGFhcm9uZ2lmZm9yZC5jb20+Ci0gKiAKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxLCBBYXJvbiBELiBHaWZmb3JkCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUihTKSBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1IoUykgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqICRGcm9tOiBzaGEyLmMsdiAxLjEgMjAwMS8xMS8wOCAwMDowMTo1MSBhZGcgRXhwIGFkZyAkCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvaGFzaC9zaGEyLmMgKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+Ci0KLSNpZiAhZGVmaW5lZChIQVZFX0VWUF9TSEEyNTYpICYmICFkZWZpbmVkKEhBVkVfU0hBMjU2X1VQREFURSkgJiYgXAotICAgIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDcwMDBMKQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInNoYTIuaCIKLQotLyoKLSAqIFVOUk9MTEVEIFRSQU5TRk9STSBMT09QIE5PVEU6Ci0gKiBZb3UgY2FuIGRlZmluZSBTSEEyX1VOUk9MTF9UUkFOU0ZPUk0gdG8gdXNlIHRoZSB1bnJvbGxlZCB0cmFuc2Zvcm0KLSAqIGxvb3AgdmVyc2lvbiBmb3IgdGhlIGhhc2ggdHJhbnNmb3JtIHJvdW5kcyAoZGVmaW5lZCB1c2luZyBtYWNyb3MKLSAqIGxhdGVyIGluIHRoaXMgZmlsZSkuICBFaXRoZXIgZGVmaW5lIG9uIHRoZSBjb21tYW5kIGxpbmUsIGZvciBleGFtcGxlOgotICoKLSAqICAgY2MgLURTSEEyX1VOUk9MTF9UUkFOU0ZPUk0gLW8gc2hhMiBzaGEyLmMgc2hhMnByb2cuYwotICoKLSAqIG9yIGRlZmluZSBiZWxvdzoKLSAqCi0gKiAgICNkZWZpbmUgU0hBMl9VTlJPTExfVFJBTlNGT1JNCi0gKgotICovCi0KLS8qKiogU0hBLTI1Ni8zODQvNTEyIE1hY2hpbmUgQXJjaGl0ZWN0dXJlIERlZmluaXRpb25zICoqKioqKioqKioqKioqKioqLwotLyoKLSAqIEJZVEVfT1JERVIgTk9URToKLSAqCi0gKiBQbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91ciBzeXN0ZW0gZGVmaW5lcyBCWVRFX09SREVSLiAgSWYgeW91cgotICogYXJjaGl0ZWN0dXJlIGlzIGxpdHRsZS1lbmRpYW4sIG1ha2Ugc3VyZSBpdCBhbHNvIGRlZmluZXMKLSAqIExJVFRMRV9FTkRJQU4gYW5kIHRoYXQgdGhlIHR3byAoQllURV9PUkRFUiBhbmQgTElUVExFX0VORElBTikgYXJlCi0gKiBlcXVpdmlsZW50LgotICoKLSAqIElmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGRlZmluZSB0aGUgYWJvdmUsIHRoZW4geW91IGNhbiBkbyBzbyBieQotICogaGFuZCBsaWtlIHRoaXM6Ci0gKgotICogICAjZGVmaW5lIExJVFRMRV9FTkRJQU4gMTIzNAotICogICAjZGVmaW5lIEJJR19FTkRJQU4gICAgNDMyMQotICoKLSAqIEFuZCBmb3IgbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgYWRkOgotICoKLSAqICAgI2RlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4gCi0gKgotICogT3IgZm9yIGJpZy1lbmRpYW4gbWFjaGluZXM6Ci0gKgotICogICAjZGVmaW5lIEJZVEVfT1JERVIgQklHX0VORElBTgotICoKLSAqIFRoZSBGcmVlQlNEIG1hY2hpbmUgdGhpcyB3YXMgd3JpdHRlbiBvbiBkZWZpbmVzIEJZVEVfT1JERVIKLSAqIGFwcHJvcHJpYXRlbHkgYnkgaW5jbHVkaW5nIDxzeXMvdHlwZXMuaD4gKHdoaWNoIGluIHR1cm4gaW5jbHVkZXMKLSAqIDxtYWNoaW5lL2VuZGlhbi5oPiB3aGVyZSB0aGUgYXBwcm9wcmlhdGUgZGVmaW5pdGlvbnMgYXJlIGFjdHVhbGx5Ci0gKiBtYWRlKS4KLSAqLwotI2lmICFkZWZpbmVkKEJZVEVfT1JERVIpIHx8IChCWVRFX09SREVSICE9IExJVFRMRV9FTkRJQU4gJiYgQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOKQotI2Vycm9yIERlZmluZSBCWVRFX09SREVSIHRvIGJlIGVxdWFsIHRvIGVpdGhlciBMSVRUTEVfRU5ESUFOIG9yIEJJR19FTkRJQU4KLSNlbmRpZgotCi0KLS8qKiogU0hBLTI1Ni8zODQvNTEyIFZhcmlvdXMgTGVuZ3RoIERlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqLwotLyogTk9URTogTW9zdCBvZiB0aGVzZSBhcmUgaW4gc2hhMi5oICovCi0jZGVmaW5lIFNIQTI1Nl9TSE9SVF9CTE9DS19MRU5HVEgJKFNIQTI1Nl9CTE9DS19MRU5HVEggLSA4KQotI2RlZmluZSBTSEEzODRfU0hPUlRfQkxPQ0tfTEVOR1RICShTSEEzODRfQkxPQ0tfTEVOR1RIIC0gMTYpCi0jZGVmaW5lIFNIQTUxMl9TSE9SVF9CTE9DS19MRU5HVEgJKFNIQTUxMl9CTE9DS19MRU5HVEggLSAxNikKLQotLyoqKiBFTkRJQU4gU1BFQ0lGSUMgQ09QWSBNQUNST1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEJFXzhfVE9fMzIoZHN0LCBjcCkgZG8gewkJCQkJXAotCShkc3QpID0gKHVfaW50MzJfdCkoY3ApWzNdIHwgKCh1X2ludDMyX3QpKGNwKVsyXSA8PCA4KSB8CVwKLQkgICAgKCh1X2ludDMyX3QpKGNwKVsxXSA8PCAxNikgfCAoKHVfaW50MzJfdCkoY3ApWzBdIDw8IDI0KTsJXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIEJFXzhfVE9fNjQoZHN0LCBjcCkgZG8gewkJCQkJXAotCShkc3QpID0gKHVfaW50NjRfdCkoY3ApWzddIHwgKCh1X2ludDY0X3QpKGNwKVs2XSA8PCA4KSB8CVwKLQkgICAgKCh1X2ludDY0X3QpKGNwKVs1XSA8PCAxNikgfCAoKHVfaW50NjRfdCkoY3ApWzRdIDw8IDI0KSB8CVwKLQkgICAgKCh1X2ludDY0X3QpKGNwKVszXSA8PCAzMikgfCAoKHVfaW50NjRfdCkoY3ApWzJdIDw8IDQwKSB8CVwKLQkgICAgKCh1X2ludDY0X3QpKGNwKVsxXSA8PCA0OCkgfCAoKHVfaW50NjRfdCkoY3ApWzBdIDw8IDU2KTsJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBCRV82NF9UT184KGNwLCBzcmMpIGRvIHsJCQkJCVwKLQkoY3ApWzBdID0gKHNyYykgPj4gNTY7CQkJCQkJXAotICAgICAgICAoY3ApWzFdID0gKHNyYykgPj4gNDg7CQkJCQkJXAotCShjcClbMl0gPSAoc3JjKSA+PiA0MDsJCQkJCQlcCi0JKGNwKVszXSA9IChzcmMpID4+IDMyOwkJCQkJCVwKLQkoY3ApWzRdID0gKHNyYykgPj4gMjQ7CQkJCQkJXAotCShjcClbNV0gPSAoc3JjKSA+PiAxNjsJCQkJCQlcCi0JKGNwKVs2XSA9IChzcmMpID4+IDg7CQkJCQkJXAotCShjcClbN10gPSAoc3JjKTsJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEJFXzMyX1RPXzgoY3AsIHNyYykgZG8gewkJCQkJXAotCShjcClbMF0gPSAoc3JjKSA+PiAyNDsJCQkJCQlcCi0JKGNwKVsxXSA9IChzcmMpID4+IDE2OwkJCQkJCVwKLQkoY3ApWzJdID0gKHNyYykgPj4gODsJCQkJCQlcCi0JKGNwKVszXSA9IChzcmMpOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLS8qCi0gKiBNYWNybyBmb3IgaW5jcmVtZW50YWxseSBhZGRpbmcgdGhlIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIG4gdG8gdGhlCi0gKiB1bnNpZ25lZCAxMjgtYml0IGludGVnZXIgKHJlcHJlc2VudGVkIHVzaW5nIGEgdHdvLWVsZW1lbnQgYXJyYXkgb2YKLSAqIDY0LWJpdCB3b3Jkcyk6Ci0gKi8KLSNkZWZpbmUgQURESU5DMTI4KHcsbikgZG8gewkJCQkJCVwKLQkodylbMF0gKz0gKHVfaW50NjRfdCkobik7CQkJCQlcCi0JaWYgKCh3KVswXSA8IChuKSkgewkJCQkJCVwKLQkJKHcpWzFdKys7CQkJCQkJXAotCX0JCQkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLS8qKiogVEhFIFNJWCBMT0dJQ0FMIEZVTkNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEJpdCBzaGlmdGluZyBhbmQgcm90YXRpb24gKHVzZWQgYnkgdGhlIHNpeCBTSEEtWFlaIGxvZ2ljYWwgZnVuY3Rpb25zOgotICoKLSAqICAgTk9URTogIFRoZSBuYW1pbmcgb2YgUiBhbmQgUyBhcHBlYXJzIGJhY2t3YXJkcyBoZXJlIChSIGlzIGEgU0hJRlQgYW5kCi0gKiAgIFMgaXMgYSBST1RBVElPTikgYmVjYXVzZSB0aGUgU0hBLTI1Ni8zODQvNTEyIGRlc2NyaXB0aW9uIGRvY3VtZW50Ci0gKiAgIChzZWUgaHR0cDovL2NzcmMubmlzdC5nb3YvY3J5cHR2YWwvc2hzL3NoYTI1Ni0zODQtNTEyLnBkZikgdXNlcyB0aGlzCi0gKiAgIHNhbWUgImJhY2t3YXJkcyIgZGVmaW5pdGlvbi4KLSAqLwotLyogU2hpZnQtcmlnaHQgKHVzZWQgaW4gU0hBLTI1NiwgU0hBLTM4NCwgYW5kIFNIQS01MTIpOiAqLwotI2RlZmluZSBSKGIseCkgCQkoKHgpID4+IChiKSkKLS8qIDMyLWJpdCBSb3RhdGUtcmlnaHQgKHVzZWQgaW4gU0hBLTI1Nik6ICovCi0jZGVmaW5lIFMzMihiLHgpCSgoKHgpID4+IChiKSkgfCAoKHgpIDw8ICgzMiAtIChiKSkpKQotLyogNjQtYml0IFJvdGF0ZS1yaWdodCAodXNlZCBpbiBTSEEtMzg0IGFuZCBTSEEtNTEyKTogKi8KLSNkZWZpbmUgUzY0KGIseCkJKCgoeCkgPj4gKGIpKSB8ICgoeCkgPDwgKDY0IC0gKGIpKSkpCi0KLS8qIFR3byBvZiBzaXggbG9naWNhbCBmdW5jdGlvbnMgdXNlZCBpbiBTSEEtMjU2LCBTSEEtMzg0LCBhbmQgU0hBLTUxMjogKi8KLSNkZWZpbmUgQ2goeCx5LHopCSgoKHgpICYgKHkpKSBeICgofih4KSkgJiAoeikpKQotI2RlZmluZSBNYWooeCx5LHopCSgoKHgpICYgKHkpKSBeICgoeCkgJiAoeikpIF4gKCh5KSAmICh6KSkpCi0KLS8qIEZvdXIgb2Ygc2l4IGxvZ2ljYWwgZnVuY3Rpb25zIHVzZWQgaW4gU0hBLTI1NjogKi8KLSNkZWZpbmUgU2lnbWEwXzI1Nih4KQkoUzMyKDIsICAoeCkpIF4gUzMyKDEzLCAoeCkpIF4gUzMyKDIyLCAoeCkpKQotI2RlZmluZSBTaWdtYTFfMjU2KHgpCShTMzIoNiwgICh4KSkgXiBTMzIoMTEsICh4KSkgXiBTMzIoMjUsICh4KSkpCi0jZGVmaW5lIHNpZ21hMF8yNTYoeCkJKFMzMig3LCAgKHgpKSBeIFMzMigxOCwgKHgpKSBeIFIoMyAsICAgKHgpKSkKLSNkZWZpbmUgc2lnbWExXzI1Nih4KQkoUzMyKDE3LCAoeCkpIF4gUzMyKDE5LCAoeCkpIF4gUigxMCwgICAoeCkpKQotCi0vKiBGb3VyIG9mIHNpeCBsb2dpY2FsIGZ1bmN0aW9ucyB1c2VkIGluIFNIQS0zODQgYW5kIFNIQS01MTI6ICovCi0jZGVmaW5lIFNpZ21hMF81MTIoeCkJKFM2NCgyOCwgKHgpKSBeIFM2NCgzNCwgKHgpKSBeIFM2NCgzOSwgKHgpKSkKLSNkZWZpbmUgU2lnbWExXzUxMih4KQkoUzY0KDE0LCAoeCkpIF4gUzY0KDE4LCAoeCkpIF4gUzY0KDQxLCAoeCkpKQotI2RlZmluZSBzaWdtYTBfNTEyKHgpCShTNjQoIDEsICh4KSkgXiBTNjQoIDgsICh4KSkgXiBSKCA3LCAgICh4KSkpCi0jZGVmaW5lIHNpZ21hMV81MTIoeCkJKFM2NCgxOSwgKHgpKSBeIFM2NCg2MSwgKHgpKSBeIFIoIDYsICAgKHgpKSkKLQotCi0vKioqIFNIQS1YWVogSU5JVElBTCBIQVNIIFZBTFVFUyBBTkQgQ09OU1RBTlRTICoqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEhhc2ggY29uc3RhbnQgd29yZHMgSyBmb3IgU0hBLTI1NjogKi8KLWNvbnN0IHN0YXRpYyB1X2ludDMyX3QgSzI1Nls2NF0gPSB7Ci0JMHg0MjhhMmY5OFVMLCAweDcxMzc0NDkxVUwsIDB4YjVjMGZiY2ZVTCwgMHhlOWI1ZGJhNVVMLAotCTB4Mzk1NmMyNWJVTCwgMHg1OWYxMTFmMVVMLCAweDkyM2Y4MmE0VUwsIDB4YWIxYzVlZDVVTCwKLQkweGQ4MDdhYTk4VUwsIDB4MTI4MzViMDFVTCwgMHgyNDMxODViZVVMLCAweDU1MGM3ZGMzVUwsCi0JMHg3MmJlNWQ3NFVMLCAweDgwZGViMWZlVUwsIDB4OWJkYzA2YTdVTCwgMHhjMTliZjE3NFVMLAotCTB4ZTQ5YjY5YzFVTCwgMHhlZmJlNDc4NlVMLCAweDBmYzE5ZGM2VUwsIDB4MjQwY2ExY2NVTCwKLQkweDJkZTkyYzZmVUwsIDB4NGE3NDg0YWFVTCwgMHg1Y2IwYTlkY1VMLCAweDc2Zjk4OGRhVUwsCi0JMHg5ODNlNTE1MlVMLCAweGE4MzFjNjZkVUwsIDB4YjAwMzI3YzhVTCwgMHhiZjU5N2ZjN1VMLAotCTB4YzZlMDBiZjNVTCwgMHhkNWE3OTE0N1VMLCAweDA2Y2E2MzUxVUwsIDB4MTQyOTI5NjdVTCwKLQkweDI3YjcwYTg1VUwsIDB4MmUxYjIxMzhVTCwgMHg0ZDJjNmRmY1VMLCAweDUzMzgwZDEzVUwsCi0JMHg2NTBhNzM1NFVMLCAweDc2NmEwYWJiVUwsIDB4ODFjMmM5MmVVTCwgMHg5MjcyMmM4NVVMLAotCTB4YTJiZmU4YTFVTCwgMHhhODFhNjY0YlVMLCAweGMyNGI4YjcwVUwsIDB4Yzc2YzUxYTNVTCwKLQkweGQxOTJlODE5VUwsIDB4ZDY5OTA2MjRVTCwgMHhmNDBlMzU4NVVMLCAweDEwNmFhMDcwVUwsCi0JMHgxOWE0YzExNlVMLCAweDFlMzc2YzA4VUwsIDB4Mjc0ODc3NGNVTCwgMHgzNGIwYmNiNVVMLAotCTB4MzkxYzBjYjNVTCwgMHg0ZWQ4YWE0YVVMLCAweDViOWNjYTRmVUwsIDB4NjgyZTZmZjNVTCwKLQkweDc0OGY4MmVlVUwsIDB4NzhhNTYzNmZVTCwgMHg4NGM4NzgxNFVMLCAweDhjYzcwMjA4VUwsCi0JMHg5MGJlZmZmYVVMLCAweGE0NTA2Y2ViVUwsIDB4YmVmOWEzZjdVTCwgMHhjNjcxNzhmMlVMCi19OwotCi0vKiBJbml0aWFsIGhhc2ggdmFsdWUgSCBmb3IgU0hBLTI1NjogKi8KLWNvbnN0IHN0YXRpYyB1X2ludDMyX3Qgc2hhMjU2X2luaXRpYWxfaGFzaF92YWx1ZVs4XSA9IHsKLQkweDZhMDllNjY3VUwsCi0JMHhiYjY3YWU4NVVMLAotCTB4M2M2ZWYzNzJVTCwKLQkweGE1NGZmNTNhVUwsCi0JMHg1MTBlNTI3ZlVMLAotCTB4OWIwNTY4OGNVTCwKLQkweDFmODNkOWFiVUwsCi0JMHg1YmUwY2QxOVVMCi19OwotCi0vKiBIYXNoIGNvbnN0YW50IHdvcmRzIEsgZm9yIFNIQS0zODQgYW5kIFNIQS01MTI6ICovCi1jb25zdCBzdGF0aWMgdV9pbnQ2NF90IEs1MTJbODBdID0gewotCTB4NDI4YTJmOThkNzI4YWUyMlVMTCwgMHg3MTM3NDQ5MTIzZWY2NWNkVUxMLAotCTB4YjVjMGZiY2ZlYzRkM2IyZlVMTCwgMHhlOWI1ZGJhNTgxODlkYmJjVUxMLAotCTB4Mzk1NmMyNWJmMzQ4YjUzOFVMTCwgMHg1OWYxMTFmMWI2MDVkMDE5VUxMLAotCTB4OTIzZjgyYTRhZjE5NGY5YlVMTCwgMHhhYjFjNWVkNWRhNmQ4MTE4VUxMLAotCTB4ZDgwN2FhOThhMzAzMDI0MlVMTCwgMHgxMjgzNWIwMTQ1NzA2ZmJlVUxMLAotCTB4MjQzMTg1YmU0ZWU0YjI4Y1VMTCwgMHg1NTBjN2RjM2Q1ZmZiNGUyVUxMLAotCTB4NzJiZTVkNzRmMjdiODk2ZlVMTCwgMHg4MGRlYjFmZTNiMTY5NmIxVUxMLAotCTB4OWJkYzA2YTcyNWM3MTIzNVVMTCwgMHhjMTliZjE3NGNmNjkyNjk0VUxMLAotCTB4ZTQ5YjY5YzE5ZWYxNGFkMlVMTCwgMHhlZmJlNDc4NjM4NGYyNWUzVUxMLAotCTB4MGZjMTlkYzY4YjhjZDViNVVMTCwgMHgyNDBjYTFjYzc3YWM5YzY1VUxMLAotCTB4MmRlOTJjNmY1OTJiMDI3NVVMTCwgMHg0YTc0ODRhYTZlYTZlNDgzVUxMLAotCTB4NWNiMGE5ZGNiZDQxZmJkNFVMTCwgMHg3NmY5ODhkYTgzMTE1M2I1VUxMLAotCTB4OTgzZTUxNTJlZTY2ZGZhYlVMTCwgMHhhODMxYzY2ZDJkYjQzMjEwVUxMLAotCTB4YjAwMzI3Yzg5OGZiMjEzZlVMTCwgMHhiZjU5N2ZjN2JlZWYwZWU0VUxMLAotCTB4YzZlMDBiZjMzZGE4OGZjMlVMTCwgMHhkNWE3OTE0NzkzMGFhNzI1VUxMLAotCTB4MDZjYTYzNTFlMDAzODI2ZlVMTCwgMHgxNDI5Mjk2NzBhMGU2ZTcwVUxMLAotCTB4MjdiNzBhODU0NmQyMmZmY1VMTCwgMHgyZTFiMjEzODVjMjZjOTI2VUxMLAotCTB4NGQyYzZkZmM1YWM0MmFlZFVMTCwgMHg1MzM4MGQxMzlkOTViM2RmVUxMLAotCTB4NjUwYTczNTQ4YmFmNjNkZVVMTCwgMHg3NjZhMGFiYjNjNzdiMmE4VUxMLAotCTB4ODFjMmM5MmU0N2VkYWVlNlVMTCwgMHg5MjcyMmM4NTE0ODIzNTNiVUxMLAotCTB4YTJiZmU4YTE0Y2YxMDM2NFVMTCwgMHhhODFhNjY0YmJjNDIzMDAxVUxMLAotCTB4YzI0YjhiNzBkMGY4OTc5MVVMTCwgMHhjNzZjNTFhMzA2NTRiZTMwVUxMLAotCTB4ZDE5MmU4MTlkNmVmNTIxOFVMTCwgMHhkNjk5MDYyNDU1NjVhOTEwVUxMLAotCTB4ZjQwZTM1ODU1NzcxMjAyYVVMTCwgMHgxMDZhYTA3MDMyYmJkMWI4VUxMLAotCTB4MTlhNGMxMTZiOGQyZDBjOFVMTCwgMHgxZTM3NmMwODUxNDFhYjUzVUxMLAotCTB4Mjc0ODc3NGNkZjhlZWI5OVVMTCwgMHgzNGIwYmNiNWUxOWI0OGE4VUxMLAotCTB4MzkxYzBjYjNjNWM5NWE2M1VMTCwgMHg0ZWQ4YWE0YWUzNDE4YWNiVUxMLAotCTB4NWI5Y2NhNGY3NzYzZTM3M1VMTCwgMHg2ODJlNmZmM2Q2YjJiOGEzVUxMLAotCTB4NzQ4ZjgyZWU1ZGVmYjJmY1VMTCwgMHg3OGE1NjM2ZjQzMTcyZjYwVUxMLAotCTB4ODRjODc4MTRhMWYwYWI3MlVMTCwgMHg4Y2M3MDIwODFhNjQzOWVjVUxMLAotCTB4OTBiZWZmZmEyMzYzMWUyOFVMTCwgMHhhNDUwNmNlYmRlODJiZGU5VUxMLAotCTB4YmVmOWEzZjdiMmM2NzkxNVVMTCwgMHhjNjcxNzhmMmUzNzI1MzJiVUxMLAotCTB4Y2EyNzNlY2VlYTI2NjE5Y1VMTCwgMHhkMTg2YjhjNzIxYzBjMjA3VUxMLAotCTB4ZWFkYTdkZDZjZGUwZWIxZVVMTCwgMHhmNTdkNGY3ZmVlNmVkMTc4VUxMLAotCTB4MDZmMDY3YWE3MjE3NmZiYVVMTCwgMHgwYTYzN2RjNWEyYzg5OGE2VUxMLAotCTB4MTEzZjk4MDRiZWY5MGRhZVVMTCwgMHgxYjcxMGIzNTEzMWM0NzFiVUxMLAotCTB4MjhkYjc3ZjUyMzA0N2Q4NFVMTCwgMHgzMmNhYWI3YjQwYzcyNDkzVUxMLAotCTB4M2M5ZWJlMGExNWM5YmViY1VMTCwgMHg0MzFkNjdjNDljMTAwZDRjVUxMLAotCTB4NGNjNWQ0YmVjYjNlNDJiNlVMTCwgMHg1OTdmMjk5Y2ZjNjU3ZTJhVUxMLAotCTB4NWZjYjZmYWIzYWQ2ZmFlY1VMTCwgMHg2YzQ0MTk4YzRhNDc1ODE3VUxMCi19OwotCi0vKiBJbml0aWFsIGhhc2ggdmFsdWUgSCBmb3IgU0hBLTM4NCAqLwotY29uc3Qgc3RhdGljIHVfaW50NjRfdCBzaGEzODRfaW5pdGlhbF9oYXNoX3ZhbHVlWzhdID0gewotCTB4Y2JiYjlkNWRjMTA1OWVkOFVMTCwKLQkweDYyOWEyOTJhMzY3Y2Q1MDdVTEwsCi0JMHg5MTU5MDE1YTMwNzBkZDE3VUxMLAotCTB4MTUyZmVjZDhmNzBlNTkzOVVMTCwKLQkweDY3MzMyNjY3ZmZjMDBiMzFVTEwsCi0JMHg4ZWI0NGE4NzY4NTgxNTExVUxMLAotCTB4ZGIwYzJlMGQ2NGY5OGZhN1VMTCwKLQkweDQ3YjU0ODFkYmVmYTRmYTRVTEwKLX07Ci0KLS8qIEluaXRpYWwgaGFzaCB2YWx1ZSBIIGZvciBTSEEtNTEyICovCi1jb25zdCBzdGF0aWMgdV9pbnQ2NF90IHNoYTUxMl9pbml0aWFsX2hhc2hfdmFsdWVbOF0gPSB7Ci0JMHg2YTA5ZTY2N2YzYmNjOTA4VUxMLAotCTB4YmI2N2FlODU4NGNhYTczYlVMTCwKLQkweDNjNmVmMzcyZmU5NGY4MmJVTEwsCi0JMHhhNTRmZjUzYTVmMWQzNmYxVUxMLAotCTB4NTEwZTUyN2ZhZGU2ODJkMVVMTCwKLQkweDliMDU2ODhjMmIzZTZjMWZVTEwsCi0JMHgxZjgzZDlhYmZiNDFiZDZiVUxMLAotCTB4NWJlMGNkMTkxMzdlMjE3OVVMTAotfTsKLQotCi0vKioqIFNIQS0yNTY6ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLVNIQTI1Nl9Jbml0KFNIQTI1Nl9DVFggKmNvbnRleHQpCi17Ci0JaWYgKGNvbnRleHQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCW1lbWNweShjb250ZXh0LT5zdGF0ZSwgc2hhMjU2X2luaXRpYWxfaGFzaF92YWx1ZSwKLQkgICAgc2l6ZW9mKHNoYTI1Nl9pbml0aWFsX2hhc2hfdmFsdWUpKTsKLQltZW1zZXQoY29udGV4dC0+YnVmZmVyLCAwLCBzaXplb2YoY29udGV4dC0+YnVmZmVyKSk7Ci0JY29udGV4dC0+Yml0Y291bnQgPSAwOwotfQotCi0jaWZkZWYgU0hBMl9VTlJPTExfVFJBTlNGT1JNCi0KLS8qIFVucm9sbGVkIFNIQS0yNTYgcm91bmQgbWFjcm9zOiAqLwotCi0jZGVmaW5lIFJPVU5EMjU2XzBfVE9fMTUoYSxiLGMsZCxlLGYsZyxoKSBkbyB7CQkJCSAgICBcCi0JQkVfOF9UT18zMihXMjU2W2pdLCBkYXRhKTsJCQkJCSAgICBcCi0JZGF0YSArPSA0OwkJCQkJCQkgICAgXAotCVQxID0gKGgpICsgU2lnbWExXzI1NigoZSkpICsgQ2goKGUpLCAoZiksIChnKSkgKyBLMjU2W2pdICsgVzI1NltqXTsgXAotCShkKSArPSBUMTsJCQkJCQkJICAgIFwKLQkoaCkgPSBUMSArIFNpZ21hMF8yNTYoKGEpKSArIE1haigoYSksIChiKSwgKGMpKTsJCSAgICBcCi0JaisrOwkJCQkJCQkJICAgIFwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBST1VORDI1NihhLGIsYyxkLGUsZixnLGgpIGRvIHsJCQkJCSAgICBcCi0JczAgPSBXMjU2WyhqKzEpJjB4MGZdOwkJCQkJCSAgICBcCi0JczAgPSBzaWdtYTBfMjU2KHMwKTsJCQkJCQkgICAgXAotCXMxID0gVzI1NlsoaisxNCkmMHgwZl07CQkJCQkJICAgIFwKLQlzMSA9IHNpZ21hMV8yNTYoczEpOwkJCQkJCSAgICBcCi0JVDEgPSAoaCkgKyBTaWdtYTFfMjU2KChlKSkgKyBDaCgoZSksIChmKSwgKGcpKSArIEsyNTZbal0gKwkgICAgXAotCSAgICAgKFcyNTZbaiYweDBmXSArPSBzMSArIFcyNTZbKGorOSkmMHgwZl0gKyBzMCk7CQkgICAgXAotCShkKSArPSBUMTsJCQkJCQkJICAgIFwKLQkoaCkgPSBUMSArIFNpZ21hMF8yNTYoKGEpKSArIE1haigoYSksIChiKSwgKGMpKTsJCSAgICBcCi0JaisrOwkJCQkJCQkJICAgIFwKLX0gd2hpbGUoMCkKLQotdm9pZAotU0hBMjU2X1RyYW5zZm9ybSh1X2ludDMyX3Qgc3RhdGVbOF0sIGNvbnN0IHVfaW50OF90IGRhdGFbU0hBMjU2X0JMT0NLX0xFTkdUSF0pCi17Ci0JdV9pbnQzMl90CWEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIHMwLCBzMTsKLQl1X2ludDMyX3QJVDEsIFcyNTZbMTZdOwotCWludAkJajsKLQotCS8qIEluaXRpYWxpemUgcmVnaXN0ZXJzIHdpdGggdGhlIHByZXYuIGludGVybWVkaWF0ZSB2YWx1ZSAqLwotCWEgPSBzdGF0ZVswXTsKLQliID0gc3RhdGVbMV07Ci0JYyA9IHN0YXRlWzJdOwotCWQgPSBzdGF0ZVszXTsKLQllID0gc3RhdGVbNF07Ci0JZiA9IHN0YXRlWzVdOwotCWcgPSBzdGF0ZVs2XTsKLQloID0gc3RhdGVbN107Ci0KLQlqID0gMDsKLQlkbyB7Ci0JCS8qIFJvdW5kcyAwIHRvIDE1ICh1bnJvbGxlZCk6ICovCi0JCVJPVU5EMjU2XzBfVE9fMTUoYSxiLGMsZCxlLGYsZyxoKTsKLQkJUk9VTkQyNTZfMF9UT18xNShoLGEsYixjLGQsZSxmLGcpOwotCQlST1VORDI1Nl8wX1RPXzE1KGcsaCxhLGIsYyxkLGUsZik7Ci0JCVJPVU5EMjU2XzBfVE9fMTUoZixnLGgsYSxiLGMsZCxlKTsKLQkJUk9VTkQyNTZfMF9UT18xNShlLGYsZyxoLGEsYixjLGQpOwotCQlST1VORDI1Nl8wX1RPXzE1KGQsZSxmLGcsaCxhLGIsYyk7Ci0JCVJPVU5EMjU2XzBfVE9fMTUoYyxkLGUsZixnLGgsYSxiKTsKLQkJUk9VTkQyNTZfMF9UT18xNShiLGMsZCxlLGYsZyxoLGEpOwotCX0gd2hpbGUgKGogPCAxNik7Ci0KLQkvKiBOb3cgZm9yIHRoZSByZW1haW5pbmcgcm91bmRzIHVwIHRvIDYzOiAqLwotCWRvIHsKLQkJUk9VTkQyNTYoYSxiLGMsZCxlLGYsZyxoKTsKLQkJUk9VTkQyNTYoaCxhLGIsYyxkLGUsZixnKTsKLQkJUk9VTkQyNTYoZyxoLGEsYixjLGQsZSxmKTsKLQkJUk9VTkQyNTYoZixnLGgsYSxiLGMsZCxlKTsKLQkJUk9VTkQyNTYoZSxmLGcsaCxhLGIsYyxkKTsKLQkJUk9VTkQyNTYoZCxlLGYsZyxoLGEsYixjKTsKLQkJUk9VTkQyNTYoYyxkLGUsZixnLGgsYSxiKTsKLQkJUk9VTkQyNTYoYixjLGQsZSxmLGcsaCxhKTsKLQl9IHdoaWxlIChqIDwgNjQpOwotCi0JLyogQ29tcHV0ZSB0aGUgY3VycmVudCBpbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZSAqLwotCXN0YXRlWzBdICs9IGE7Ci0Jc3RhdGVbMV0gKz0gYjsKLQlzdGF0ZVsyXSArPSBjOwotCXN0YXRlWzNdICs9IGQ7Ci0Jc3RhdGVbNF0gKz0gZTsKLQlzdGF0ZVs1XSArPSBmOwotCXN0YXRlWzZdICs9IGc7Ci0Jc3RhdGVbN10gKz0gaDsKLQotCS8qIENsZWFuIHVwICovCi0JYSA9IGIgPSBjID0gZCA9IGUgPSBmID0gZyA9IGggPSBUMSA9IDA7Ci19Ci0KLSNlbHNlIC8qIFNIQTJfVU5ST0xMX1RSQU5TRk9STSAqLwotCi12b2lkCi1TSEEyNTZfVHJhbnNmb3JtKHVfaW50MzJfdCBzdGF0ZVs4XSwgY29uc3QgdV9pbnQ4X3QgZGF0YVtTSEEyNTZfQkxPQ0tfTEVOR1RIXSkKLXsKLQl1X2ludDMyX3QJYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgczAsIHMxOwotCXVfaW50MzJfdAlUMSwgVDIsIFcyNTZbMTZdOwotCWludAkJajsKLQotCS8qIEluaXRpYWxpemUgcmVnaXN0ZXJzIHdpdGggdGhlIHByZXYuIGludGVybWVkaWF0ZSB2YWx1ZSAqLwotCWEgPSBzdGF0ZVswXTsKLQliID0gc3RhdGVbMV07Ci0JYyA9IHN0YXRlWzJdOwotCWQgPSBzdGF0ZVszXTsKLQllID0gc3RhdGVbNF07Ci0JZiA9IHN0YXRlWzVdOwotCWcgPSBzdGF0ZVs2XTsKLQloID0gc3RhdGVbN107Ci0KLQlqID0gMDsKLQlkbyB7Ci0JCUJFXzhfVE9fMzIoVzI1NltqXSwgZGF0YSk7Ci0JCWRhdGEgKz0gNDsKLQkJLyogQXBwbHkgdGhlIFNIQS0yNTYgY29tcHJlc3Npb24gZnVuY3Rpb24gdG8gdXBkYXRlIGEuLmggKi8KLQkJVDEgPSBoICsgU2lnbWExXzI1NihlKSArIENoKGUsIGYsIGcpICsgSzI1NltqXSArIFcyNTZbal07Ci0JCVQyID0gU2lnbWEwXzI1NihhKSArIE1haihhLCBiLCBjKTsKLQkJaCA9IGc7Ci0JCWcgPSBmOwotCQlmID0gZTsKLQkJZSA9IGQgKyBUMTsKLQkJZCA9IGM7Ci0JCWMgPSBiOwotCQliID0gYTsKLQkJYSA9IFQxICsgVDI7Ci0KLQkJaisrOwotCX0gd2hpbGUgKGogPCAxNik7Ci0KLQlkbyB7Ci0JCS8qIFBhcnQgb2YgdGhlIG1lc3NhZ2UgYmxvY2sgZXhwYW5zaW9uOiAqLwotCQlzMCA9IFcyNTZbKGorMSkmMHgwZl07Ci0JCXMwID0gc2lnbWEwXzI1NihzMCk7Ci0JCXMxID0gVzI1NlsoaisxNCkmMHgwZl07CQotCQlzMSA9IHNpZ21hMV8yNTYoczEpOwotCi0JCS8qIEFwcGx5IHRoZSBTSEEtMjU2IGNvbXByZXNzaW9uIGZ1bmN0aW9uIHRvIHVwZGF0ZSBhLi5oICovCi0JCVQxID0gaCArIFNpZ21hMV8yNTYoZSkgKyBDaChlLCBmLCBnKSArIEsyNTZbal0gKyAKLQkJICAgICAoVzI1NltqJjB4MGZdICs9IHMxICsgVzI1Nlsoais5KSYweDBmXSArIHMwKTsKLQkJVDIgPSBTaWdtYTBfMjU2KGEpICsgTWFqKGEsIGIsIGMpOwotCQloID0gZzsKLQkJZyA9IGY7Ci0JCWYgPSBlOwotCQllID0gZCArIFQxOwotCQlkID0gYzsKLQkJYyA9IGI7Ci0JCWIgPSBhOwotCQlhID0gVDEgKyBUMjsKLQotCQlqKys7Ci0JfSB3aGlsZSAoaiA8IDY0KTsKLQotCS8qIENvbXB1dGUgdGhlIGN1cnJlbnQgaW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUgKi8KLQlzdGF0ZVswXSArPSBhOwotCXN0YXRlWzFdICs9IGI7Ci0Jc3RhdGVbMl0gKz0gYzsKLQlzdGF0ZVszXSArPSBkOwotCXN0YXRlWzRdICs9IGU7Ci0Jc3RhdGVbNV0gKz0gZjsKLQlzdGF0ZVs2XSArPSBnOwotCXN0YXRlWzddICs9IGg7Ci0KLQkvKiBDbGVhbiB1cCAqLwotCWEgPSBiID0gYyA9IGQgPSBlID0gZiA9IGcgPSBoID0gVDEgPSBUMiA9IDA7Ci19Ci0KLSNlbmRpZiAvKiBTSEEyX1VOUk9MTF9UUkFOU0ZPUk0gKi8KLQotdm9pZAotU0hBMjU2X1VwZGF0ZShTSEEyNTZfQ1RYICpjb250ZXh0LCBjb25zdCB1X2ludDhfdCAqZGF0YSwgc2l6ZV90IGxlbikKLXsKLQlzaXplX3QJZnJlZXNwYWNlLCB1c2Vkc3BhY2U7Ci0KLQkvKiBDYWxsaW5nIHdpdGggbm8gZGF0YSBpcyB2YWxpZCAod2UgZG8gbm90aGluZykgKi8KLQlpZiAobGVuID09IDApCi0JCXJldHVybjsKLQotCXVzZWRzcGFjZSA9IChjb250ZXh0LT5iaXRjb3VudCA+PiAzKSAlIFNIQTI1Nl9CTE9DS19MRU5HVEg7Ci0JaWYgKHVzZWRzcGFjZSA+IDApIHsKLQkJLyogQ2FsY3VsYXRlIGhvdyBtdWNoIGZyZWUgc3BhY2UgaXMgYXZhaWxhYmxlIGluIHRoZSBidWZmZXIgKi8KLQkJZnJlZXNwYWNlID0gU0hBMjU2X0JMT0NLX0xFTkdUSCAtIHVzZWRzcGFjZTsKLQotCQlpZiAobGVuID49IGZyZWVzcGFjZSkgewotCQkJLyogRmlsbCB0aGUgYnVmZmVyIGNvbXBsZXRlbHkgYW5kIHByb2Nlc3MgaXQgKi8KLQkJCW1lbWNweSgmY29udGV4dC0+YnVmZmVyW3VzZWRzcGFjZV0sIGRhdGEsIGZyZWVzcGFjZSk7Ci0JCQljb250ZXh0LT5iaXRjb3VudCArPSBmcmVlc3BhY2UgPDwgMzsKLQkJCWxlbiAtPSBmcmVlc3BhY2U7Ci0JCQlkYXRhICs9IGZyZWVzcGFjZTsKLQkJCVNIQTI1Nl9UcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsIGNvbnRleHQtPmJ1ZmZlcik7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBUaGUgYnVmZmVyIGlzIG5vdCB5ZXQgZnVsbCAqLwotCQkJbWVtY3B5KCZjb250ZXh0LT5idWZmZXJbdXNlZHNwYWNlXSwgZGF0YSwgbGVuKTsKLQkJCWNvbnRleHQtPmJpdGNvdW50ICs9IGxlbiA8PCAzOwotCQkJLyogQ2xlYW4gdXA6ICovCi0JCQl1c2Vkc3BhY2UgPSBmcmVlc3BhY2UgPSAwOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCXdoaWxlIChsZW4gPj0gU0hBMjU2X0JMT0NLX0xFTkdUSCkgewotCQkvKiBQcm9jZXNzIGFzIG1hbnkgY29tcGxldGUgYmxvY2tzIGFzIHdlIGNhbiAqLwotCQlTSEEyNTZfVHJhbnNmb3JtKGNvbnRleHQtPnN0YXRlLCBkYXRhKTsKLQkJY29udGV4dC0+Yml0Y291bnQgKz0gU0hBMjU2X0JMT0NLX0xFTkdUSCA8PCAzOwotCQlsZW4gLT0gU0hBMjU2X0JMT0NLX0xFTkdUSDsKLQkJZGF0YSArPSBTSEEyNTZfQkxPQ0tfTEVOR1RIOwotCX0KLQlpZiAobGVuID4gMCkgewotCQkvKiBUaGVyZSdzIGxlZnQtb3ZlcnMsIHNvIHNhdmUgJ2VtICovCi0JCW1lbWNweShjb250ZXh0LT5idWZmZXIsIGRhdGEsIGxlbik7Ci0JCWNvbnRleHQtPmJpdGNvdW50ICs9IGxlbiA8PCAzOwotCX0KLQkvKiBDbGVhbiB1cDogKi8KLQl1c2Vkc3BhY2UgPSBmcmVlc3BhY2UgPSAwOwotfQotCi12b2lkCi1TSEEyNTZfUGFkKFNIQTI1Nl9DVFggKmNvbnRleHQpCi17Ci0JdW5zaWduZWQgaW50CXVzZWRzcGFjZTsKLQotCXVzZWRzcGFjZSA9IChjb250ZXh0LT5iaXRjb3VudCA+PiAzKSAlIFNIQTI1Nl9CTE9DS19MRU5HVEg7Ci0JaWYgKHVzZWRzcGFjZSA+IDApIHsKLQkJLyogQmVnaW4gcGFkZGluZyB3aXRoIGEgMSBiaXQ6ICovCi0JCWNvbnRleHQtPmJ1ZmZlclt1c2Vkc3BhY2UrK10gPSAweDgwOwotCi0JCWlmICh1c2Vkc3BhY2UgPD0gU0hBMjU2X1NIT1JUX0JMT0NLX0xFTkdUSCkgewotCQkJLyogU2V0LXVwIGZvciB0aGUgbGFzdCB0cmFuc2Zvcm06ICovCi0JCQltZW1zZXQoJmNvbnRleHQtPmJ1ZmZlclt1c2Vkc3BhY2VdLCAwLAotCQkJICAgIFNIQTI1Nl9TSE9SVF9CTE9DS19MRU5HVEggLSB1c2Vkc3BhY2UpOwotCQl9IGVsc2UgewotCQkJaWYgKHVzZWRzcGFjZSA8IFNIQTI1Nl9CTE9DS19MRU5HVEgpIHsKLQkJCQltZW1zZXQoJmNvbnRleHQtPmJ1ZmZlclt1c2Vkc3BhY2VdLCAwLAotCQkJCSAgICBTSEEyNTZfQkxPQ0tfTEVOR1RIIC0gdXNlZHNwYWNlKTsKLQkJCX0KLQkJCS8qIERvIHNlY29uZC10by1sYXN0IHRyYW5zZm9ybTogKi8KLQkJCVNIQTI1Nl9UcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsIGNvbnRleHQtPmJ1ZmZlcik7Ci0KLQkJCS8qIFByZXBhcmUgZm9yIGxhc3QgdHJhbnNmb3JtOiAqLwotCQkJbWVtc2V0KGNvbnRleHQtPmJ1ZmZlciwgMCwgU0hBMjU2X1NIT1JUX0JMT0NLX0xFTkdUSCk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBTZXQtdXAgZm9yIHRoZSBsYXN0IHRyYW5zZm9ybTogKi8KLQkJbWVtc2V0KGNvbnRleHQtPmJ1ZmZlciwgMCwgU0hBMjU2X1NIT1JUX0JMT0NLX0xFTkdUSCk7Ci0KLQkJLyogQmVnaW4gcGFkZGluZyB3aXRoIGEgMSBiaXQ6ICovCi0JCSpjb250ZXh0LT5idWZmZXIgPSAweDgwOwotCX0KLQkvKiBTdG9yZSB0aGUgbGVuZ3RoIG9mIGlucHV0IGRhdGEgKGluIGJpdHMpIGluIGJpZyBlbmRpYW4gZm9ybWF0OiAqLwotCUJFXzY0X1RPXzgoJmNvbnRleHQtPmJ1ZmZlcltTSEEyNTZfU0hPUlRfQkxPQ0tfTEVOR1RIXSwKLQkgICAgY29udGV4dC0+Yml0Y291bnQpOwotCi0JLyogRmluYWwgdHJhbnNmb3JtOiAqLwotCVNIQTI1Nl9UcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsIGNvbnRleHQtPmJ1ZmZlcik7Ci0KLQkvKiBDbGVhbiB1cDogKi8KLQl1c2Vkc3BhY2UgPSAwOwotfQotCi12b2lkCi1TSEEyNTZfRmluYWwodV9pbnQ4X3QgZGlnZXN0W1NIQTI1Nl9ESUdFU1RfTEVOR1RIXSwgU0hBMjU2X0NUWCAqY29udGV4dCkKLXsKLQlTSEEyNTZfUGFkKGNvbnRleHQpOwotCi0JLyogSWYgbm8gZGlnZXN0IGJ1ZmZlciBpcyBwYXNzZWQsIHdlIGRvbid0IGJvdGhlciBkb2luZyB0aGlzOiAqLwotCWlmIChkaWdlc3QgIT0gTlVMTCkgewotI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgotCQlpbnQJaTsKLQotCQkvKiBDb252ZXJ0IFRPIGhvc3QgYnl0ZSBvcmRlciAqLwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJQkVfMzJfVE9fOChkaWdlc3QgKyBpICogNCwgY29udGV4dC0+c3RhdGVbaV0pOwotI2Vsc2UKLQkJbWVtY3B5KGRpZ2VzdCwgY29udGV4dC0+c3RhdGUsIFNIQTI1Nl9ESUdFU1RfTEVOR1RIKTsKLSNlbmRpZgotCQltZW1zZXQoY29udGV4dCwgMCwgc2l6ZW9mKCpjb250ZXh0KSk7Ci0JfQotfQotCi0KLS8qKiogU0hBLTUxMjogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotU0hBNTEyX0luaXQoU0hBNTEyX0NUWCAqY29udGV4dCkKLXsKLQlpZiAoY29udGV4dCA9PSBOVUxMKQotCQlyZXR1cm47Ci0JbWVtY3B5KGNvbnRleHQtPnN0YXRlLCBzaGE1MTJfaW5pdGlhbF9oYXNoX3ZhbHVlLAotCSAgICBzaXplb2Yoc2hhNTEyX2luaXRpYWxfaGFzaF92YWx1ZSkpOwotCW1lbXNldChjb250ZXh0LT5idWZmZXIsIDAsIHNpemVvZihjb250ZXh0LT5idWZmZXIpKTsKLQljb250ZXh0LT5iaXRjb3VudFswXSA9IGNvbnRleHQtPmJpdGNvdW50WzFdID0gIDA7Ci19Ci0KLSNpZmRlZiBTSEEyX1VOUk9MTF9UUkFOU0ZPUk0KLQotLyogVW5yb2xsZWQgU0hBLTUxMiByb3VuZCBtYWNyb3M6ICovCi0KLSNkZWZpbmUgUk9VTkQ1MTJfMF9UT18xNShhLGIsYyxkLGUsZixnLGgpIGRvIHsJCQkJICAgIFwKLQlCRV84X1RPXzY0KFc1MTJbal0sIGRhdGEpOwkJCQkJICAgIFwKLQlkYXRhICs9IDg7CQkJCQkJCSAgICBcCi0JVDEgPSAoaCkgKyBTaWdtYTFfNTEyKChlKSkgKyBDaCgoZSksIChmKSwgKGcpKSArIEs1MTJbal0gKyBXNTEyW2pdOyBcCi0JKGQpICs9IFQxOwkJCQkJCQkgICAgXAotCShoKSA9IFQxICsgU2lnbWEwXzUxMigoYSkpICsgTWFqKChhKSwgKGIpLCAoYykpOwkJICAgIFwKLQlqKys7CQkJCQkJCQkgICAgXAotfSB3aGlsZSgwKQotCi0KLSNkZWZpbmUgUk9VTkQ1MTIoYSxiLGMsZCxlLGYsZyxoKSBkbyB7CQkJCQkgICAgXAotCXMwID0gVzUxMlsoaisxKSYweDBmXTsJCQkJCQkgICAgXAotCXMwID0gc2lnbWEwXzUxMihzMCk7CQkJCQkJICAgIFwKLQlzMSA9IFc1MTJbKGorMTQpJjB4MGZdOwkJCQkJCSAgICBcCi0JczEgPSBzaWdtYTFfNTEyKHMxKTsJCQkJCQkgICAgXAotCVQxID0gKGgpICsgU2lnbWExXzUxMigoZSkpICsgQ2goKGUpLCAoZiksIChnKSkgKyBLNTEyW2pdICsJICAgIFwKLSAgICAgICAgICAgICAoVzUxMltqJjB4MGZdICs9IHMxICsgVzUxMlsoais5KSYweDBmXSArIHMwKTsJCSAgICBcCi0JKGQpICs9IFQxOwkJCQkJCQkgICAgXAotCShoKSA9IFQxICsgU2lnbWEwXzUxMigoYSkpICsgTWFqKChhKSwgKGIpLCAoYykpOwkJICAgIFwKLQlqKys7CQkJCQkJCQkgICAgXAotfSB3aGlsZSgwKQotCi12b2lkCi1TSEE1MTJfVHJhbnNmb3JtKHVfaW50NjRfdCBzdGF0ZVs4XSwgY29uc3QgdV9pbnQ4X3QgZGF0YVtTSEE1MTJfQkxPQ0tfTEVOR1RIXSkKLXsKLQl1X2ludDY0X3QJYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgczAsIHMxOwotCXVfaW50NjRfdAlUMSwgVzUxMlsxNl07Ci0JaW50CQlqOwotCi0JLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgd2l0aCB0aGUgcHJldi4gaW50ZXJtZWRpYXRlIHZhbHVlICovCi0JYSA9IHN0YXRlWzBdOwotCWIgPSBzdGF0ZVsxXTsKLQljID0gc3RhdGVbMl07Ci0JZCA9IHN0YXRlWzNdOwotCWUgPSBzdGF0ZVs0XTsKLQlmID0gc3RhdGVbNV07Ci0JZyA9IHN0YXRlWzZdOwotCWggPSBzdGF0ZVs3XTsKLQotCWogPSAwOwotCWRvIHsKLQkJLyogUm91bmRzIDAgdG8gMTUgKHVucm9sbGVkKTogKi8KLQkJUk9VTkQ1MTJfMF9UT18xNShhLGIsYyxkLGUsZixnLGgpOwotCQlST1VORDUxMl8wX1RPXzE1KGgsYSxiLGMsZCxlLGYsZyk7Ci0JCVJPVU5ENTEyXzBfVE9fMTUoZyxoLGEsYixjLGQsZSxmKTsKLQkJUk9VTkQ1MTJfMF9UT18xNShmLGcsaCxhLGIsYyxkLGUpOwotCQlST1VORDUxMl8wX1RPXzE1KGUsZixnLGgsYSxiLGMsZCk7Ci0JCVJPVU5ENTEyXzBfVE9fMTUoZCxlLGYsZyxoLGEsYixjKTsKLQkJUk9VTkQ1MTJfMF9UT18xNShjLGQsZSxmLGcsaCxhLGIpOwotCQlST1VORDUxMl8wX1RPXzE1KGIsYyxkLGUsZixnLGgsYSk7Ci0JfSB3aGlsZSAoaiA8IDE2KTsKLQotCS8qIE5vdyBmb3IgdGhlIHJlbWFpbmluZyByb3VuZHMgdXAgdG8gNzk6ICovCi0JZG8gewotCQlST1VORDUxMihhLGIsYyxkLGUsZixnLGgpOwotCQlST1VORDUxMihoLGEsYixjLGQsZSxmLGcpOwotCQlST1VORDUxMihnLGgsYSxiLGMsZCxlLGYpOwotCQlST1VORDUxMihmLGcsaCxhLGIsYyxkLGUpOwotCQlST1VORDUxMihlLGYsZyxoLGEsYixjLGQpOwotCQlST1VORDUxMihkLGUsZixnLGgsYSxiLGMpOwotCQlST1VORDUxMihjLGQsZSxmLGcsaCxhLGIpOwotCQlST1VORDUxMihiLGMsZCxlLGYsZyxoLGEpOwotCX0gd2hpbGUgKGogPCA4MCk7Ci0KLQkvKiBDb21wdXRlIHRoZSBjdXJyZW50IGludGVybWVkaWF0ZSBoYXNoIHZhbHVlICovCi0Jc3RhdGVbMF0gKz0gYTsKLQlzdGF0ZVsxXSArPSBiOwotCXN0YXRlWzJdICs9IGM7Ci0Jc3RhdGVbM10gKz0gZDsKLQlzdGF0ZVs0XSArPSBlOwotCXN0YXRlWzVdICs9IGY7Ci0Jc3RhdGVbNl0gKz0gZzsKLQlzdGF0ZVs3XSArPSBoOwotCi0JLyogQ2xlYW4gdXAgKi8KLQlhID0gYiA9IGMgPSBkID0gZSA9IGYgPSBnID0gaCA9IFQxID0gMDsKLX0KLQotI2Vsc2UgLyogU0hBMl9VTlJPTExfVFJBTlNGT1JNICovCi0KLXZvaWQKLVNIQTUxMl9UcmFuc2Zvcm0odV9pbnQ2NF90IHN0YXRlWzhdLCBjb25zdCB1X2ludDhfdCBkYXRhW1NIQTUxMl9CTE9DS19MRU5HVEhdKQotewotCXVfaW50NjRfdAlhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBzMCwgczE7Ci0JdV9pbnQ2NF90CVQxLCBUMiwgVzUxMlsxNl07Ci0JaW50CQlqOwotCi0JLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgd2l0aCB0aGUgcHJldi4gaW50ZXJtZWRpYXRlIHZhbHVlICovCi0JYSA9IHN0YXRlWzBdOwotCWIgPSBzdGF0ZVsxXTsKLQljID0gc3RhdGVbMl07Ci0JZCA9IHN0YXRlWzNdOwotCWUgPSBzdGF0ZVs0XTsKLQlmID0gc3RhdGVbNV07Ci0JZyA9IHN0YXRlWzZdOwotCWggPSBzdGF0ZVs3XTsKLQotCWogPSAwOwotCWRvIHsKLQkJQkVfOF9UT182NChXNTEyW2pdLCBkYXRhKTsKLQkJZGF0YSArPSA4OwotCQkvKiBBcHBseSB0aGUgU0hBLTUxMiBjb21wcmVzc2lvbiBmdW5jdGlvbiB0byB1cGRhdGUgYS4uaCAqLwotCQlUMSA9IGggKyBTaWdtYTFfNTEyKGUpICsgQ2goZSwgZiwgZykgKyBLNTEyW2pdICsgVzUxMltqXTsKLQkJVDIgPSBTaWdtYTBfNTEyKGEpICsgTWFqKGEsIGIsIGMpOwotCQloID0gZzsKLQkJZyA9IGY7Ci0JCWYgPSBlOwotCQllID0gZCArIFQxOwotCQlkID0gYzsKLQkJYyA9IGI7Ci0JCWIgPSBhOwotCQlhID0gVDEgKyBUMjsKLQotCQlqKys7Ci0JfSB3aGlsZSAoaiA8IDE2KTsKLQotCWRvIHsKLQkJLyogUGFydCBvZiB0aGUgbWVzc2FnZSBibG9jayBleHBhbnNpb246ICovCi0JCXMwID0gVzUxMlsoaisxKSYweDBmXTsKLQkJczAgPSBzaWdtYTBfNTEyKHMwKTsKLQkJczEgPSBXNTEyWyhqKzE0KSYweDBmXTsKLQkJczEgPSAgc2lnbWExXzUxMihzMSk7Ci0KLQkJLyogQXBwbHkgdGhlIFNIQS01MTIgY29tcHJlc3Npb24gZnVuY3Rpb24gdG8gdXBkYXRlIGEuLmggKi8KLQkJVDEgPSBoICsgU2lnbWExXzUxMihlKSArIENoKGUsIGYsIGcpICsgSzUxMltqXSArCi0JCSAgICAgKFc1MTJbaiYweDBmXSArPSBzMSArIFc1MTJbKGorOSkmMHgwZl0gKyBzMCk7Ci0JCVQyID0gU2lnbWEwXzUxMihhKSArIE1haihhLCBiLCBjKTsKLQkJaCA9IGc7Ci0JCWcgPSBmOwotCQlmID0gZTsKLQkJZSA9IGQgKyBUMTsKLQkJZCA9IGM7Ci0JCWMgPSBiOwotCQliID0gYTsKLQkJYSA9IFQxICsgVDI7Ci0KLQkJaisrOwotCX0gd2hpbGUgKGogPCA4MCk7Ci0KLQkvKiBDb21wdXRlIHRoZSBjdXJyZW50IGludGVybWVkaWF0ZSBoYXNoIHZhbHVlICovCi0Jc3RhdGVbMF0gKz0gYTsKLQlzdGF0ZVsxXSArPSBiOwotCXN0YXRlWzJdICs9IGM7Ci0Jc3RhdGVbM10gKz0gZDsKLQlzdGF0ZVs0XSArPSBlOwotCXN0YXRlWzVdICs9IGY7Ci0Jc3RhdGVbNl0gKz0gZzsKLQlzdGF0ZVs3XSArPSBoOwotCi0JLyogQ2xlYW4gdXAgKi8KLQlhID0gYiA9IGMgPSBkID0gZSA9IGYgPSBnID0gaCA9IFQxID0gVDIgPSAwOwotfQotCi0jZW5kaWYgLyogU0hBMl9VTlJPTExfVFJBTlNGT1JNICovCi0KLXZvaWQKLVNIQTUxMl9VcGRhdGUoU0hBNTEyX0NUWCAqY29udGV4dCwgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW4pCi17Ci0Jc2l6ZV90CWZyZWVzcGFjZSwgdXNlZHNwYWNlOwotCi0JLyogQ2FsbGluZyB3aXRoIG5vIGRhdGEgaXMgdmFsaWQgKHdlIGRvIG5vdGhpbmcpICovCi0JaWYgKGxlbiA9PSAwKQotCQlyZXR1cm47Ci0KLQl1c2Vkc3BhY2UgPSAoY29udGV4dC0+Yml0Y291bnRbMF0gPj4gMykgJSBTSEE1MTJfQkxPQ0tfTEVOR1RIOwotCWlmICh1c2Vkc3BhY2UgPiAwKSB7Ci0JCS8qIENhbGN1bGF0ZSBob3cgbXVjaCBmcmVlIHNwYWNlIGlzIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyICovCi0JCWZyZWVzcGFjZSA9IFNIQTUxMl9CTE9DS19MRU5HVEggLSB1c2Vkc3BhY2U7Ci0KLQkJaWYgKGxlbiA+PSBmcmVlc3BhY2UpIHsKLQkJCS8qIEZpbGwgdGhlIGJ1ZmZlciBjb21wbGV0ZWx5IGFuZCBwcm9jZXNzIGl0ICovCi0JCQltZW1jcHkoJmNvbnRleHQtPmJ1ZmZlclt1c2Vkc3BhY2VdLCBkYXRhLCBmcmVlc3BhY2UpOwotCQkJQURESU5DMTI4KGNvbnRleHQtPmJpdGNvdW50LCBmcmVlc3BhY2UgPDwgMyk7Ci0JCQlsZW4gLT0gZnJlZXNwYWNlOwotCQkJZGF0YSArPSBmcmVlc3BhY2U7Ci0JCQlTSEE1MTJfVHJhbnNmb3JtKGNvbnRleHQtPnN0YXRlLCBjb250ZXh0LT5idWZmZXIpOwotCQl9IGVsc2UgewotCQkJLyogVGhlIGJ1ZmZlciBpcyBub3QgeWV0IGZ1bGwgKi8KLQkJCW1lbWNweSgmY29udGV4dC0+YnVmZmVyW3VzZWRzcGFjZV0sIGRhdGEsIGxlbik7Ci0JCQlBRERJTkMxMjgoY29udGV4dC0+Yml0Y291bnQsIGxlbiA8PCAzKTsKLQkJCS8qIENsZWFuIHVwOiAqLwotCQkJdXNlZHNwYWNlID0gZnJlZXNwYWNlID0gMDsKLQkJCXJldHVybjsKLQkJfQotCX0KLQl3aGlsZSAobGVuID49IFNIQTUxMl9CTE9DS19MRU5HVEgpIHsKLQkJLyogUHJvY2VzcyBhcyBtYW55IGNvbXBsZXRlIGJsb2NrcyBhcyB3ZSBjYW4gKi8KLQkJU0hBNTEyX1RyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgZGF0YSk7Ci0JCUFERElOQzEyOChjb250ZXh0LT5iaXRjb3VudCwgU0hBNTEyX0JMT0NLX0xFTkdUSCA8PCAzKTsKLQkJbGVuIC09IFNIQTUxMl9CTE9DS19MRU5HVEg7Ci0JCWRhdGEgKz0gU0hBNTEyX0JMT0NLX0xFTkdUSDsKLQl9Ci0JaWYgKGxlbiA+IDApIHsKLQkJLyogVGhlcmUncyBsZWZ0LW92ZXJzLCBzbyBzYXZlICdlbSAqLwotCQltZW1jcHkoY29udGV4dC0+YnVmZmVyLCBkYXRhLCBsZW4pOwotCQlBRERJTkMxMjgoY29udGV4dC0+Yml0Y291bnQsIGxlbiA8PCAzKTsKLQl9Ci0JLyogQ2xlYW4gdXA6ICovCi0JdXNlZHNwYWNlID0gZnJlZXNwYWNlID0gMDsKLX0KLQotdm9pZAotU0hBNTEyX1BhZChTSEE1MTJfQ1RYICpjb250ZXh0KQotewotCXVuc2lnbmVkIGludAl1c2Vkc3BhY2U7Ci0KLQl1c2Vkc3BhY2UgPSAoY29udGV4dC0+Yml0Y291bnRbMF0gPj4gMykgJSBTSEE1MTJfQkxPQ0tfTEVOR1RIOwotCWlmICh1c2Vkc3BhY2UgPiAwKSB7Ci0JCS8qIEJlZ2luIHBhZGRpbmcgd2l0aCBhIDEgYml0OiAqLwotCQljb250ZXh0LT5idWZmZXJbdXNlZHNwYWNlKytdID0gMHg4MDsKLQotCQlpZiAodXNlZHNwYWNlIDw9IFNIQTUxMl9TSE9SVF9CTE9DS19MRU5HVEgpIHsKLQkJCS8qIFNldC11cCBmb3IgdGhlIGxhc3QgdHJhbnNmb3JtOiAqLwotCQkJbWVtc2V0KCZjb250ZXh0LT5idWZmZXJbdXNlZHNwYWNlXSwgMCwgU0hBNTEyX1NIT1JUX0JMT0NLX0xFTkdUSCAtIHVzZWRzcGFjZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodXNlZHNwYWNlIDwgU0hBNTEyX0JMT0NLX0xFTkdUSCkgewotCQkJCW1lbXNldCgmY29udGV4dC0+YnVmZmVyW3VzZWRzcGFjZV0sIDAsIFNIQTUxMl9CTE9DS19MRU5HVEggLSB1c2Vkc3BhY2UpOwotCQkJfQotCQkJLyogRG8gc2Vjb25kLXRvLWxhc3QgdHJhbnNmb3JtOiAqLwotCQkJU0hBNTEyX1RyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgY29udGV4dC0+YnVmZmVyKTsKLQotCQkJLyogQW5kIHNldC11cCBmb3IgdGhlIGxhc3QgdHJhbnNmb3JtOiAqLwotCQkJbWVtc2V0KGNvbnRleHQtPmJ1ZmZlciwgMCwgU0hBNTEyX0JMT0NLX0xFTkdUSCAtIDIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogUHJlcGFyZSBmb3IgZmluYWwgdHJhbnNmb3JtOiAqLwotCQltZW1zZXQoY29udGV4dC0+YnVmZmVyLCAwLCBTSEE1MTJfU0hPUlRfQkxPQ0tfTEVOR1RIKTsKLQotCQkvKiBCZWdpbiBwYWRkaW5nIHdpdGggYSAxIGJpdDogKi8KLQkJKmNvbnRleHQtPmJ1ZmZlciA9IDB4ODA7Ci0JfQotCS8qIFN0b3JlIHRoZSBsZW5ndGggb2YgaW5wdXQgZGF0YSAoaW4gYml0cykgaW4gYmlnIGVuZGlhbiBmb3JtYXQ6ICovCi0JQkVfNjRfVE9fOCgmY29udGV4dC0+YnVmZmVyW1NIQTUxMl9TSE9SVF9CTE9DS19MRU5HVEhdLAotCSAgICBjb250ZXh0LT5iaXRjb3VudFsxXSk7Ci0JQkVfNjRfVE9fOCgmY29udGV4dC0+YnVmZmVyW1NIQTUxMl9TSE9SVF9CTE9DS19MRU5HVEggKyA4XSwKLQkgICAgY29udGV4dC0+Yml0Y291bnRbMF0pOwotCi0JLyogRmluYWwgdHJhbnNmb3JtOiAqLwotCVNIQTUxMl9UcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsIGNvbnRleHQtPmJ1ZmZlcik7Ci0KLQkvKiBDbGVhbiB1cDogKi8KLQl1c2Vkc3BhY2UgPSAwOwotfQotCi12b2lkCi1TSEE1MTJfRmluYWwodV9pbnQ4X3QgZGlnZXN0W1NIQTUxMl9ESUdFU1RfTEVOR1RIXSwgU0hBNTEyX0NUWCAqY29udGV4dCkKLXsKLQlTSEE1MTJfUGFkKGNvbnRleHQpOwotCi0JLyogSWYgbm8gZGlnZXN0IGJ1ZmZlciBpcyBwYXNzZWQsIHdlIGRvbid0IGJvdGhlciBkb2luZyB0aGlzOiAqLwotCWlmIChkaWdlc3QgIT0gTlVMTCkgewotI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgotCQlpbnQJaTsKLQotCQkvKiBDb252ZXJ0IFRPIGhvc3QgYnl0ZSBvcmRlciAqLwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJQkVfNjRfVE9fOChkaWdlc3QgKyBpICogOCwgY29udGV4dC0+c3RhdGVbaV0pOwotI2Vsc2UKLQkJbWVtY3B5KGRpZ2VzdCwgY29udGV4dC0+c3RhdGUsIFNIQTUxMl9ESUdFU1RfTEVOR1RIKTsKLSNlbmRpZgotCQltZW1zZXQoY29udGV4dCwgMCwgc2l6ZW9mKCpjb250ZXh0KSk7Ci0JfQotfQotCi0KLSNpZiAwCi0vKioqIFNIQS0zODQ6ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLVNIQTM4NF9Jbml0KFNIQTM4NF9DVFggKmNvbnRleHQpCi17Ci0JaWYgKGNvbnRleHQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCW1lbWNweShjb250ZXh0LT5zdGF0ZSwgc2hhMzg0X2luaXRpYWxfaGFzaF92YWx1ZSwKLQkgICAgc2l6ZW9mKHNoYTM4NF9pbml0aWFsX2hhc2hfdmFsdWUpKTsKLQltZW1zZXQoY29udGV4dC0+YnVmZmVyLCAwLCBzaXplb2YoY29udGV4dC0+YnVmZmVyKSk7Ci0JY29udGV4dC0+Yml0Y291bnRbMF0gPSBjb250ZXh0LT5iaXRjb3VudFsxXSA9IDA7Ci19Ci0KLV9fd2Vha19hbGlhcyhTSEEzODRfVHJhbnNmb3JtLCBTSEE1MTJfVHJhbnNmb3JtKTsKLV9fd2Vha19hbGlhcyhTSEEzODRfVXBkYXRlLCBTSEE1MTJfVXBkYXRlKTsKLV9fd2Vha19hbGlhcyhTSEEzODRfUGFkLCBTSEE1MTJfUGFkKTsKLQotdm9pZAotU0hBMzg0X0ZpbmFsKHVfaW50OF90IGRpZ2VzdFtTSEEzODRfRElHRVNUX0xFTkdUSF0sIFNIQTM4NF9DVFggKmNvbnRleHQpCi17Ci0JU0hBMzg0X1BhZChjb250ZXh0KTsKLQotCS8qIElmIG5vIGRpZ2VzdCBidWZmZXIgaXMgcGFzc2VkLCB3ZSBkb24ndCBib3RoZXIgZG9pbmcgdGhpczogKi8KLQlpZiAoZGlnZXN0ICE9IE5VTEwpIHsKLSNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KLQkJaW50CWk7Ci0KLQkJLyogQ29udmVydCBUTyBob3N0IGJ5dGUgb3JkZXIgKi8KLQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJCUJFXzY0X1RPXzgoZGlnZXN0ICsgaSAqIDgsIGNvbnRleHQtPnN0YXRlW2ldKTsKLSNlbHNlCi0JCW1lbWNweShkaWdlc3QsIGNvbnRleHQtPnN0YXRlLCBTSEEzODRfRElHRVNUX0xFTkdUSCk7Ci0jZW5kaWYKLQl9Ci0KLQkvKiBaZXJvIG91dCBzdGF0ZSBkYXRhICovCi0JbWVtc2V0KGNvbnRleHQsIDAsIHNpemVvZigqY29udGV4dCkpOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX0VWUF9TSEEyNTYpICYmICFkZWZpbmVkKEhBVkVfU0hBMjU2X1VQREFURSkgJiYgXAotICAgIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDcwMDBMKSAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvc2hhMi5oIGIvb3BlbmJzZC1jb21wYXQvc2hhMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjFmMmRkLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3NoYTIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgkkT3BlbkJTRDogc2hhMi5oLHYgMS42IDIwMDQvMDYvMjIgMDE6NTc6MzAgamZiIEV4cCAkCSovCi0KLS8qCi0gKiBGSUxFOglzaGEyLmgKLSAqIEFVVEhPUjoJQWFyb24gRC4gR2lmZm9yZCA8bWVAYWFyb25naWZmb3JkLmNvbT4KLSAqIAotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEsIEFhcm9uIEQuIEdpZmZvcmQKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SKFMpIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUihTKSBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICogJEZyb206IHNoYTIuaCx2IDEuMSAyMDAxLzExLzA4IDAwOjAyOjAxIGFkZyBFeHAgYWRnICQKLSAqLwotCi0vKiBPUEVOQlNEIE9SSUdJTkFMOiBpbmNsdWRlL3NoYTIuaCAqLwotCi0jaWZuZGVmIF9TU0hTSEEyX0gKLSNkZWZpbmUgX1NTSFNIQTJfSAotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbHYuaD4KLQotI2lmICFkZWZpbmVkKEhBVkVfRVZQX1NIQTI1NikgJiYgIWRlZmluZWQoSEFWRV9TSEEyNTZfVVBEQVRFKSAmJiBcCi0gICAgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMEwpCi0KLS8qKiogU0hBLTI1Ni8zODQvNTEyIFZhcmlvdXMgTGVuZ3RoIERlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTSEEyNTZfQkxPQ0tfTEVOR1RICQk2NAotI2RlZmluZSBTSEEyNTZfRElHRVNUX0xFTkdUSAkJMzIKLSNkZWZpbmUgU0hBMjU2X0RJR0VTVF9TVFJJTkdfTEVOR1RICShTSEEyNTZfRElHRVNUX0xFTkdUSCAqIDIgKyAxKQotI2RlZmluZSBTSEEzODRfQkxPQ0tfTEVOR1RICQkxMjgKLSNkZWZpbmUgU0hBMzg0X0RJR0VTVF9MRU5HVEgJCTQ4Ci0jZGVmaW5lIFNIQTM4NF9ESUdFU1RfU1RSSU5HX0xFTkdUSAkoU0hBMzg0X0RJR0VTVF9MRU5HVEggKiAyICsgMSkKLSNkZWZpbmUgU0hBNTEyX0JMT0NLX0xFTkdUSAkJMTI4Ci0jZGVmaW5lIFNIQTUxMl9ESUdFU1RfTEVOR1RICQk2NAotI2RlZmluZSBTSEE1MTJfRElHRVNUX1NUUklOR19MRU5HVEgJKFNIQTUxMl9ESUdFU1RfTEVOR1RIICogMiArIDEpCi0KLQotLyoqKiBTSEEtMjU2LzM4NC81MTIgQ29udGV4dCBTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCBfU0hBMjU2X0NUWCB7Ci0JdV9pbnQzMl90CXN0YXRlWzhdOwotCXVfaW50NjRfdAliaXRjb3VudDsKLQl1X2ludDhfdAlidWZmZXJbU0hBMjU2X0JMT0NLX0xFTkdUSF07Ci19IFNIQTI1Nl9DVFg7Ci10eXBlZGVmIHN0cnVjdCBfU0hBNTEyX0NUWCB7Ci0JdV9pbnQ2NF90CXN0YXRlWzhdOwotCXVfaW50NjRfdAliaXRjb3VudFsyXTsKLQl1X2ludDhfdAlidWZmZXJbU0hBNTEyX0JMT0NLX0xFTkdUSF07Ci19IFNIQTUxMl9DVFg7Ci0KLSNpZiAwCi10eXBlZGVmIFNIQTUxMl9DVFggU0hBMzg0X0NUWDsKLSNlbmRpZgotCi12b2lkIFNIQTI1Nl9Jbml0KFNIQTI1Nl9DVFggKik7Ci12b2lkIFNIQTI1Nl9UcmFuc2Zvcm0odV9pbnQzMl90IHN0YXRlWzhdLCBjb25zdCB1X2ludDhfdCBbU0hBMjU2X0JMT0NLX0xFTkdUSF0pOwotdm9pZCBTSEEyNTZfVXBkYXRlKFNIQTI1Nl9DVFggKiwgY29uc3QgdV9pbnQ4X3QgKiwgc2l6ZV90KQotCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fc3RyaW5nX18sMiwzKSkpOwotdm9pZCBTSEEyNTZfUGFkKFNIQTI1Nl9DVFggKik7Ci12b2lkIFNIQTI1Nl9GaW5hbCh1X2ludDhfdCBbU0hBMjU2X0RJR0VTVF9MRU5HVEhdLCBTSEEyNTZfQ1RYICopCi0JX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19taW5ieXRlc19fLDEsU0hBMjU2X0RJR0VTVF9MRU5HVEgpKSk7Ci1jaGFyICpTSEEyNTZfRW5kKFNIQTI1Nl9DVFggKiwgY2hhciAqKQotCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fbWluYnl0ZXNfXywyLFNIQTI1Nl9ESUdFU1RfU1RSSU5HX0xFTkdUSCkpKTsKLWNoYXIgKlNIQTI1Nl9GaWxlKGNvbnN0IGNoYXIgKiwgY2hhciAqKQotCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fbWluYnl0ZXNfXywyLFNIQTI1Nl9ESUdFU1RfU1RSSU5HX0xFTkdUSCkpKTsKLWNoYXIgKlNIQTI1Nl9GaWxlQ2h1bmsoY29uc3QgY2hhciAqLCBjaGFyICosIG9mZl90LCBvZmZfdCkKLQlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX21pbmJ5dGVzX18sMixTSEEyNTZfRElHRVNUX1NUUklOR19MRU5HVEgpKSk7Ci1jaGFyICpTSEEyNTZfRGF0YShjb25zdCB1X2ludDhfdCAqLCBzaXplX3QsIGNoYXIgKikKLQlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX3N0cmluZ19fLDEsMikpKQotCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fbWluYnl0ZXNfXywzLFNIQTI1Nl9ESUdFU1RfU1RSSU5HX0xFTkdUSCkpKTsKLQotI2lmIDAKLXZvaWQgU0hBMzg0X0luaXQoU0hBMzg0X0NUWCAqKTsKLXZvaWQgU0hBMzg0X1RyYW5zZm9ybSh1X2ludDY0X3Qgc3RhdGVbOF0sIGNvbnN0IHVfaW50OF90IFtTSEEzODRfQkxPQ0tfTEVOR1RIXSk7Ci12b2lkIFNIQTM4NF9VcGRhdGUoU0hBMzg0X0NUWCAqLCBjb25zdCB1X2ludDhfdCAqLCBzaXplX3QpCi0JX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19zdHJpbmdfXywyLDMpKSk7Ci12b2lkIFNIQTM4NF9QYWQoU0hBMzg0X0NUWCAqKTsKLXZvaWQgU0hBMzg0X0ZpbmFsKHVfaW50OF90IFtTSEEzODRfRElHRVNUX0xFTkdUSF0sIFNIQTM4NF9DVFggKikKLQlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX21pbmJ5dGVzX18sMSxTSEEzODRfRElHRVNUX0xFTkdUSCkpKTsKLWNoYXIgKlNIQTM4NF9FbmQoU0hBMzg0X0NUWCAqLCBjaGFyICopCi0JX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19taW5ieXRlc19fLDIsU0hBMzg0X0RJR0VTVF9TVFJJTkdfTEVOR1RIKSkpOwotY2hhciAqU0hBMzg0X0ZpbGUoY29uc3QgY2hhciAqLCBjaGFyICopCi0JX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19taW5ieXRlc19fLDIsU0hBMzg0X0RJR0VTVF9TVFJJTkdfTEVOR1RIKSkpOwotY2hhciAqU0hBMzg0X0ZpbGVDaHVuayhjb25zdCBjaGFyICosIGNoYXIgKiwgb2ZmX3QsIG9mZl90KQotCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fbWluYnl0ZXNfXywyLFNIQTM4NF9ESUdFU1RfU1RSSU5HX0xFTkdUSCkpKTsKLWNoYXIgKlNIQTM4NF9EYXRhKGNvbnN0IHVfaW50OF90ICosIHNpemVfdCwgY2hhciAqKQotCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fc3RyaW5nX18sMSwyKSkpCi0JX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19taW5ieXRlc19fLDMsU0hBMzg0X0RJR0VTVF9TVFJJTkdfTEVOR1RIKSkpOwotI2VuZGlmIC8qIDAgKi8KLQotdm9pZCBTSEE1MTJfSW5pdChTSEE1MTJfQ1RYICopOwotdm9pZCBTSEE1MTJfVHJhbnNmb3JtKHVfaW50NjRfdCBzdGF0ZVs4XSwgY29uc3QgdV9pbnQ4X3QgW1NIQTUxMl9CTE9DS19MRU5HVEhdKTsKLXZvaWQgU0hBNTEyX1VwZGF0ZShTSEE1MTJfQ1RYICosIGNvbnN0IHVfaW50OF90ICosIHNpemVfdCkKLQlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX3N0cmluZ19fLDIsMykpKTsKLXZvaWQgU0hBNTEyX1BhZChTSEE1MTJfQ1RYICopOwotdm9pZCBTSEE1MTJfRmluYWwodV9pbnQ4X3QgW1NIQTUxMl9ESUdFU1RfTEVOR1RIXSwgU0hBNTEyX0NUWCAqKQotCV9fYXR0cmlidXRlX18oKF9fYm91bmRlZF9fKF9fbWluYnl0ZXNfXywxLFNIQTUxMl9ESUdFU1RfTEVOR1RIKSkpOwotY2hhciAqU0hBNTEyX0VuZChTSEE1MTJfQ1RYICosIGNoYXIgKikKLQlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX21pbmJ5dGVzX18sMixTSEE1MTJfRElHRVNUX1NUUklOR19MRU5HVEgpKSk7Ci1jaGFyICpTSEE1MTJfRmlsZShjb25zdCBjaGFyICosIGNoYXIgKikKLQlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX21pbmJ5dGVzX18sMixTSEE1MTJfRElHRVNUX1NUUklOR19MRU5HVEgpKSk7Ci1jaGFyICpTSEE1MTJfRmlsZUNodW5rKGNvbnN0IGNoYXIgKiwgY2hhciAqLCBvZmZfdCwgb2ZmX3QpCi0JX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19taW5ieXRlc19fLDIsU0hBNTEyX0RJR0VTVF9TVFJJTkdfTEVOR1RIKSkpOwotY2hhciAqU0hBNTEyX0RhdGEoY29uc3QgdV9pbnQ4X3QgKiwgc2l6ZV90LCBjaGFyICopCi0JX19hdHRyaWJ1dGVfXygoX19ib3VuZGVkX18oX19zdHJpbmdfXywxLDIpKSkKLQlfX2F0dHJpYnV0ZV9fKChfX2JvdW5kZWRfXyhfX21pbmJ5dGVzX18sMyxTSEE1MTJfRElHRVNUX1NUUklOR19MRU5HVEgpKSk7Ci0KLSNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX0VWUF9TSEEyNTYpICYmICFkZWZpbmVkKEhBVkVfU0hBMjU2X1VQREFURSkgJiYgXAotICAgIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDcwMDBMKSAqLwotCi0jZW5kaWYgLyogX1NTSFNIQTJfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvc2lnYWN0LmMgYi9vcGVuYnNkLWNvbXBhdC9zaWdhY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3ODQ1Yy4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9zaWdhY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgkkT3BlbkJTRDogc2lnYWN0aW9uLmMsdiAxLjQgMjAwMS8wMS8yMiAxODowMTo0OCBtaWxsZXJ0IEV4cCAkCSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCi0gKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgotICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKLSAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKLSAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCi0gKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgotICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgotICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKLSAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCi0gKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQXV0aG9yOiBaZXlkIE0uIEJlbi1IYWxpbSA8em1iZW5oYWxAbmV0Y29tLmNvbT4gMTk5MiwxOTk1ICAgICAgICAgICAgICAgKgotICogICAgIGFuZDogRXJpYyBTLiBSYXltb25kIDxlc3JAc25hcmsudGh5cnN1cy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliY3Vyc2VzL2Jhc2Uvc2lnYWN0aW9uLmMgKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlICJzaWdhY3QuaCIKLQotLyogVGhpcyBmaWxlIHByb3ZpZGVzIHNpZ2FjdGlvbigpIGVtdWxhdGlvbiB1c2luZyBzaWd2ZWMoKSAqLwotLyogVXNlIG9ubHkgaWYgdGhpcyBpcyBub24gUE9TSVggc3lzdGVtICovCi0KLSNpZiAhSEFWRV9TSUdBQ1RJT04gJiYgSEFWRV9TSUdWRUMKLQotaW50Ci1zaWdhY3Rpb24oaW50IHNpZywgc3RydWN0IHNpZ2FjdGlvbiAqc2lnYWN0LCBzdHJ1Y3Qgc2lnYWN0aW9uICpvc2lnYWN0KQotewotCXJldHVybiBzaWd2ZWMoc2lnLCBzaWdhY3QgPyAmc2lnYWN0LT5zdiA6IE5VTEwsCi0JICAgIG9zaWdhY3QgPyAmb3NpZ2FjdC0+c3YgOiBOVUxMKTsKLX0KLQotaW50Ci1zaWdlbXB0eXNldCAoc2lnc2V0X3QgKm1hc2spCi17Ci0JaWYgKCFtYXNrKSB7Ci0JCWVycm5vID0gRUlOVkFMOwotCQlyZXR1cm4gLTE7Ci0JfQotCSptYXNrID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1zaWdwcm9jbWFzayAoaW50IG1vZGUsIHNpZ3NldF90ICptYXNrLCBzaWdzZXRfdCAqb21hc2spCi17Ci0Jc2lnc2V0X3QgY3VycmVudCA9IHNpZ3NldG1hc2soMCk7Ci0KLQlpZiAoIW1hc2spIHsKLQkJZXJybm8gPSBFSU5WQUw7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAob21hc2spCi0JCSpvbWFzayA9IGN1cnJlbnQ7Ci0KLQlpZiAobW9kZSA9PSBTSUdfQkxPQ0spCi0JCWN1cnJlbnQgfD0gKm1hc2s7Ci0JZWxzZSBpZiAobW9kZSA9PSBTSUdfVU5CTE9DSykKLQkJY3VycmVudCAmPSB+Km1hc2s7Ci0JZWxzZSBpZiAobW9kZSA9PSBTSUdfU0VUTUFTSykKLQljdXJyZW50ID0gKm1hc2s7Ci0KLQlzaWdzZXRtYXNrKGN1cnJlbnQpOwotCXJldHVybiAwOwotfQotCi1pbnQKLXNpZ3N1c3BlbmQgKHNpZ3NldF90ICptYXNrKQotewotCWlmICghbWFzaykgewotCQllcnJubyA9IEVJTlZBTDsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gc2lncGF1c2UoKm1hc2spOwotfQotCi1pbnQKLXNpZ2RlbHNldCAoc2lnc2V0X3QgKm1hc2ssIGludCBzaWcpCi17Ci0JaWYgKCFtYXNrKSB7Ci0JCWVycm5vID0gRUlOVkFMOwotCQlyZXR1cm4gLTE7Ci0JfQotCSptYXNrICY9IH5zaWdtYXNrKHNpZyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAotc2lnYWRkc2V0IChzaWdzZXRfdCAqbWFzaywgaW50IHNpZykKLXsKLQlpZiAoIW1hc2spIHsKLQkJZXJybm8gPSBFSU5WQUw7Ci0JCXJldHVybiAtMTsKLQl9Ci0JKm1hc2sgfD0gc2lnbWFzayhzaWcpOwotCXJldHVybiAwOwotfQotCi1pbnQKLXNpZ2lzbWVtYmVyIChzaWdzZXRfdCAqbWFzaywgaW50IHNpZykKLXsKLQlpZiAoIW1hc2spIHsKLQkJZXJybm8gPSBFSU5WQUw7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuICgqbWFzayAmIHNpZ21hc2soc2lnKSkgIT0gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9zaWdhY3QuaCBiL29wZW5ic2QtY29tcGF0L3NpZ2FjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjk2ZDBhLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3NpZ2FjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IFNpZ0FjdGlvbi5oLHYgMS4zIDIwMDEvMDEvMjIgMTg6MDE6MzIgbWlsbGVydCBFeHAgJAkqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgotICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKLSAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCi0gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCi0gKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgotICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKLSAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKLSAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCi0gKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgotICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEF1dGhvcjogWmV5ZCBNLiBCZW4tSGFsaW0gPHptYmVuaGFsQG5ldGNvbS5jb20+IDE5OTIsMTk5NSAgICAgICAgICAgICAgICoKLSAqICAgICBhbmQ6IEVyaWMgUy4gUmF5bW9uZCA8ZXNyQHNuYXJrLnRoeXJzdXMuY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqICRGcm9tOiBTaWdBY3Rpb24uaCx2IDEuNiAyMDAwLzEyLzEwIDAyOjM2OjEwIHRvbSBFeHAgJAotICoKLSAqIFRoaXMgZmlsZSBleGlzdHMgdG8gaGFuZGxlIG5vbi1QT1NJWCBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgPHVuaXN0ZC5oPiwKLSAqIGFuZCB1c3VhbGx5IG5vIHNpZ2FjdGlvbigpIG5vciA8dGVybWlvcy5oPgotICovCi0KLS8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjdXJzZXMvU2lnQWN0aW9uLmggKi8KLQotI2lmbmRlZiBfU0lHQUNUSU9OX0gKLSNkZWZpbmUgX1NJR0FDVElPTl9ICi0KLSNpZiAhZGVmaW5lZChIQVZFX1NJR0FDVElPTikgJiYgZGVmaW5lZChIQVZFX1NJR1ZFQykKLQotI3VuZGVmICBTSUdfQkxPQ0sKLSNkZWZpbmUgU0lHX0JMT0NLICAgICAgIDAwCi0KLSN1bmRlZiAgU0lHX1VOQkxPQ0sKLSNkZWZpbmUgU0lHX1VOQkxPQ0sgICAgIDAxCi0KLSN1bmRlZiAgU0lHX1NFVE1BU0sKLSNkZWZpbmUgU0lHX1NFVE1BU0sgICAgIDAyCi0KLS8qCi0gKiA8YnNkL3NpZ25hbC5oPiBpcyBpbiB0aGUgTGludXggMS4yLjggKyBnY2MgMi43LjAgY29uZmlndXJhdGlvbiwKLSAqIGFuZCBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgdGhpcyBoZWFkZXIgZmlsZS4KLSAqLwotI2lmIEhBVkVfQlNEX1NJR05BTF9ICi0jIGluY2x1ZGUgPGJzZC9zaWduYWwuaD4KLSNlbmRpZgotCi1zdHJ1Y3Qgc2lnYWN0aW9uCi17Ci0Jc3RydWN0IHNpZ3ZlYyBzdjsKLX07Ci0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBzaWdzZXRfdDsKLQotI3VuZGVmICBzYV9tYXNrCi0jZGVmaW5lIHNhX21hc2sgc3Yuc3ZfbWFzawotI3VuZGVmICBzYV9oYW5kbGVyCi0jZGVmaW5lIHNhX2hhbmRsZXIgc3Yuc3ZfaGFuZGxlcgotI3VuZGVmICBzYV9mbGFncwotI2RlZmluZSBzYV9mbGFncyBzdi5zdl9mbGFncwotCi1pbnQgc2lnYWN0aW9uKGludCBzaWcsIHN0cnVjdCBzaWdhY3Rpb24gKnNpZ2FjdCwgc3RydWN0IHNpZ2FjdGlvbiAqb3NpZ2FjdCk7Ci1pbnQgc2lncHJvY21hc2sgKGludCBob3csIHNpZ3NldF90ICptYXNrLCBzaWdzZXRfdCAqb21hc2spOwotaW50IHNpZ2VtcHR5c2V0IChzaWdzZXRfdCAqbWFzayk7Ci1pbnQgc2lnc3VzcGVuZCAoc2lnc2V0X3QgKm1hc2spOwotaW50IHNpZ2RlbHNldCAoc2lnc2V0X3QgKm1hc2ssIGludCBzaWcpOwotaW50IHNpZ2FkZHNldCAoc2lnc2V0X3QgKm1hc2ssIGludCBzaWcpOwotCi0jZW5kaWYgLyogIWRlZmluZWQoSEFWRV9TSUdBQ1RJT04pICYmIGRlZmluZWQoSEFWRV9TSUdWRUMpICovCi0KLSNlbmRpZiAvKiAhZGVmaW5lZChfU0lHQUNUSU9OX0gpICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9zdHJsY2F0LmMgYi9vcGVuYnNkLWNvbXBhdC9zdHJsY2F0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYzFiNjEuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvc3RybGNhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHN0cmxjYXQuYyx2IDEuMTMgMjAwNS8wOC8wOCAwODowNTozNyBlc3BpZSBFeHAgJAkqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk4IFRvZGQgQy4gTWlsbGVyIDxUb2RkLk1pbGxlckBjb3VydGVzYW4uY29tPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLS8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL3N0cmluZy9zdHJsY2F0LmMgKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0jaWZuZGVmIEhBVkVfU1RSTENBVAotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qCi0gKiBBcHBlbmRzIHNyYyB0byBzdHJpbmcgZHN0IG9mIHNpemUgc2l6ICh1bmxpa2Ugc3RybmNhdCwgc2l6IGlzIHRoZQotICogZnVsbCBzaXplIG9mIGRzdCwgbm90IHNwYWNlIGxlZnQpLiAgQXQgbW9zdCBzaXotMSBjaGFyYWN0ZXJzCi0gKiB3aWxsIGJlIGNvcGllZC4gIEFsd2F5cyBOVUwgdGVybWluYXRlcyAodW5sZXNzIHNpeiA8PSBzdHJsZW4oZHN0KSkuCi0gKiBSZXR1cm5zIHN0cmxlbihzcmMpICsgTUlOKHNpeiwgc3RybGVuKGluaXRpYWwgZHN0KSkuCi0gKiBJZiByZXR2YWwgPj0gc2l6LCB0cnVuY2F0aW9uIG9jY3VycmVkLgotICovCi1zaXplX3QKLXN0cmxjYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXopCi17Ci0JY2hhciAqZCA9IGRzdDsKLQljb25zdCBjaGFyICpzID0gc3JjOwotCXNpemVfdCBuID0gc2l6OwotCXNpemVfdCBkbGVuOwotCi0JLyogRmluZCB0aGUgZW5kIG9mIGRzdCBhbmQgYWRqdXN0IGJ5dGVzIGxlZnQgYnV0IGRvbid0IGdvIHBhc3QgZW5kICovCi0Jd2hpbGUgKG4tLSAhPSAwICYmICpkICE9ICdcMCcpCi0JCWQrKzsKLQlkbGVuID0gZCAtIGRzdDsKLQluID0gc2l6IC0gZGxlbjsKLQotCWlmIChuID09IDApCi0JCXJldHVybihkbGVuICsgc3RybGVuKHMpKTsKLQl3aGlsZSAoKnMgIT0gJ1wwJykgewotCQlpZiAobiAhPSAxKSB7Ci0JCQkqZCsrID0gKnM7Ci0JCQluLS07Ci0JCX0KLQkJcysrOwotCX0KLQkqZCA9ICdcMCc7Ci0KLQlyZXR1cm4oZGxlbiArIChzIC0gc3JjKSk7CS8qIGNvdW50IGRvZXMgbm90IGluY2x1ZGUgTlVMICovCi19Ci0KLSNlbmRpZiAvKiAhSEFWRV9TVFJMQ0FUICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC9zdHJsY3B5LmMgYi9vcGVuYnNkLWNvbXBhdC9zdHJsY3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OWE1YjIuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvc3RybGNweS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHN0cmxjcHkuYyx2IDEuMTAgMjAwNS8wOC8wOCAwODowNTozNyBlc3BpZSBFeHAgJAkqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk4IFRvZGQgQy4gTWlsbGVyIDxUb2RkLk1pbGxlckBjb3VydGVzYW4uY29tPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLS8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL3N0cmluZy9zdHJsY3B5LmMgKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0jaWZuZGVmIEhBVkVfU1RSTENQWQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qCi0gKiBDb3B5IHNyYyB0byBzdHJpbmcgZHN0IG9mIHNpemUgc2l6LiAgQXQgbW9zdCBzaXotMSBjaGFyYWN0ZXJzCi0gKiB3aWxsIGJlIGNvcGllZC4gIEFsd2F5cyBOVUwgdGVybWluYXRlcyAodW5sZXNzIHNpeiA9PSAwKS4KLSAqIFJldHVybnMgc3RybGVuKHNyYyk7IGlmIHJldHZhbCA+PSBzaXosIHRydW5jYXRpb24gb2NjdXJyZWQuCi0gKi8KLXNpemVfdAotc3RybGNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpeikKLXsKLQljaGFyICpkID0gZHN0OwotCWNvbnN0IGNoYXIgKnMgPSBzcmM7Ci0Jc2l6ZV90IG4gPSBzaXo7Ci0KLQkvKiBDb3B5IGFzIG1hbnkgYnl0ZXMgYXMgd2lsbCBmaXQgKi8KLQlpZiAobiAhPSAwICYmIC0tbiAhPSAwKSB7Ci0JCWRvIHsKLQkJCWlmICgoKmQrKyA9ICpzKyspID09IDApCi0JCQkJYnJlYWs7Ci0JCX0gd2hpbGUgKC0tbiAhPSAwKTsKLQl9Ci0KLQkvKiBOb3QgZW5vdWdoIHJvb20gaW4gZHN0LCBhZGQgTlVMIGFuZCB0cmF2ZXJzZSByZXN0IG9mIHNyYyAqLwotCWlmIChuID09IDApIHsKLQkJaWYgKHNpeiAhPSAwKQotCQkJKmQgPSAnXDAnOwkJLyogTlVMLXRlcm1pbmF0ZSBkc3QgKi8KLQkJd2hpbGUgKCpzKyspCi0JCQk7Ci0JfQotCi0JcmV0dXJuKHMgLSBzcmMgLSAxKTsJLyogY291bnQgZG9lcyBub3QgaW5jbHVkZSBOVUwgKi8KLX0KLQotI2VuZGlmIC8qICFIQVZFX1NUUkxDUFkgKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L3N0cm1vZGUuYyBiL29wZW5ic2QtY29tcGF0L3N0cm1vZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4MTYxNC4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9zdHJtb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHN0cm1vZGUuYyx2IDEuNyAyMDA1LzA4LzA4IDA4OjA1OjM3IGVzcGllIEV4cCAkICovCi0vKi0KLSAqIENvcHlyaWdodCAoYykgMTk5MCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvc3RyaW5nL3N0cm1vZGUuYyAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLSNpZm5kZWYgSEFWRV9TVFJNT0RFCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiBYWFggbW9kZSBzaG91bGQgYmUgbW9kZV90ICovCi0KLXZvaWQKLXN0cm1vZGUoaW50IG1vZGUsIGNoYXIgKnApCi17Ci0JIC8qIHByaW50IHR5cGUgKi8KLQlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKLQljYXNlIFNfSUZESVI6CQkJLyogZGlyZWN0b3J5ICovCi0JCSpwKysgPSAnZCc7Ci0JCWJyZWFrOwotCWNhc2UgU19JRkNIUjoJCQkvKiBjaGFyYWN0ZXIgc3BlY2lhbCAqLwotCQkqcCsrID0gJ2MnOwotCQlicmVhazsKLQljYXNlIFNfSUZCTEs6CQkJLyogYmxvY2sgc3BlY2lhbCAqLwotCQkqcCsrID0gJ2InOwotCQlicmVhazsKLQljYXNlIFNfSUZSRUc6CQkJLyogcmVndWxhciAqLwotCQkqcCsrID0gJy0nOwotCQlicmVhazsKLQljYXNlIFNfSUZMTks6CQkJLyogc3ltYm9saWMgbGluayAqLwotCQkqcCsrID0gJ2wnOwotCQlicmVhazsKLSNpZmRlZiBTX0lGU09DSwotCWNhc2UgU19JRlNPQ0s6CQkJLyogc29ja2V0ICovCi0JCSpwKysgPSAncyc7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgU19JRklGTwotCWNhc2UgU19JRklGTzoJCQkvKiBmaWZvICovCi0JCSpwKysgPSAncCc7Ci0JCWJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoJCQkvKiB1bmtub3duICovCi0JCSpwKysgPSAnPyc7Ci0JCWJyZWFrOwotCX0KLQkvKiB1c3IgKi8KLQlpZiAobW9kZSAmIFNfSVJVU1IpCi0JCSpwKysgPSAncic7Ci0JZWxzZQotCQkqcCsrID0gJy0nOwotCWlmIChtb2RlICYgU19JV1VTUikKLQkJKnArKyA9ICd3JzsKLQllbHNlCi0JCSpwKysgPSAnLSc7Ci0Jc3dpdGNoIChtb2RlICYgKFNfSVhVU1IgfCBTX0lTVUlEKSkgewotCWNhc2UgMDoKLQkJKnArKyA9ICctJzsKLQkJYnJlYWs7Ci0JY2FzZSBTX0lYVVNSOgotCQkqcCsrID0gJ3gnOwotCQlicmVhazsKLQljYXNlIFNfSVNVSUQ6Ci0JCSpwKysgPSAnUyc7Ci0JCWJyZWFrOwotCWNhc2UgU19JWFVTUiB8IFNfSVNVSUQ6Ci0JCSpwKysgPSAncyc7Ci0JCWJyZWFrOwotCX0KLQkvKiBncm91cCAqLwotCWlmIChtb2RlICYgU19JUkdSUCkKLQkJKnArKyA9ICdyJzsKLQllbHNlCi0JCSpwKysgPSAnLSc7Ci0JaWYgKG1vZGUgJiBTX0lXR1JQKQotCQkqcCsrID0gJ3cnOwotCWVsc2UKLQkJKnArKyA9ICctJzsKLQlzd2l0Y2ggKG1vZGUgJiAoU19JWEdSUCB8IFNfSVNHSUQpKSB7Ci0JY2FzZSAwOgotCQkqcCsrID0gJy0nOwotCQlicmVhazsKLQljYXNlIFNfSVhHUlA6Ci0JCSpwKysgPSAneCc7Ci0JCWJyZWFrOwotCWNhc2UgU19JU0dJRDoKLQkJKnArKyA9ICdTJzsKLQkJYnJlYWs7Ci0JY2FzZSBTX0lYR1JQIHwgU19JU0dJRDoKLQkJKnArKyA9ICdzJzsKLQkJYnJlYWs7Ci0JfQotCS8qIG90aGVyICovCi0JaWYgKG1vZGUgJiBTX0lST1RIKQotCQkqcCsrID0gJ3InOwotCWVsc2UKLQkJKnArKyA9ICctJzsKLQlpZiAobW9kZSAmIFNfSVdPVEgpCi0JCSpwKysgPSAndyc7Ci0JZWxzZQotCQkqcCsrID0gJy0nOwotCXN3aXRjaCAobW9kZSAmIChTX0lYT1RIIHwgU19JU1ZUWCkpIHsKLQljYXNlIDA6Ci0JCSpwKysgPSAnLSc7Ci0JCWJyZWFrOwotCWNhc2UgU19JWE9USDoKLQkJKnArKyA9ICd4JzsKLQkJYnJlYWs7Ci0JY2FzZSBTX0lTVlRYOgotCQkqcCsrID0gJ1QnOwotCQlicmVhazsKLQljYXNlIFNfSVhPVEggfCBTX0lTVlRYOgotCQkqcCsrID0gJ3QnOwotCQlicmVhazsKLQl9Ci0JKnArKyA9ICcgJzsJCS8qIHdpbGwgYmUgYSAnKycgaWYgQUNMJ3MgaW1wbGVtZW50ZWQgKi8KLQkqcCA9ICdcMCc7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L3N0cnB0aW1lLmMgYi9vcGVuYnNkLWNvbXBhdC9zdHJwdGltZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGQ4M2Q5Li4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3N0cnB0aW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHN0cnB0aW1lLmMsdiAxLjEyIDIwMDgvMDYvMjYgMDU6NDI6MDUgcmF5IEV4cCAkICovCi0vKgkkTmV0QlNEOiBzdHJwdGltZS5jLHYgMS4xMiAxOTk4LzAxLzIwIDIxOjM5OjQwIG15Y3JvZnQgRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTggVGhlIE5ldEJTRCBGb3VuZGF0aW9uLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29kZSB3YXMgY29udHJpYnV0ZWQgdG8gVGhlIE5ldEJTRCBGb3VuZGF0aW9uIGJ5IEtsYXVzIEtsZWluLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE5FVEJTRCBGT1VOREFUSU9OLCBJTkMuIEFORCBDT05UUklCVVRPUlMKLSAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAotICogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgRk9VTkRBVElPTiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS8qIE9QRU5CU0QgT1JJR0lOQUw6IGxpYi9saWJjL3RpbWUvc3RycHRpbWUuYyAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmbmRlZiBIQVZFX1NUUlBUSU1FCi0KLSNkZWZpbmUgVE1fWUVBUl9CQVNFIDE5MDAJLyogZnJvbSB0emZpbGUuaCAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLS8qICNkZWZpbmUJX2N0bG9jKHgpCQkoX0N1cnJlbnRUaW1lTG9jYWxlLT54KSAqLwotCi0vKgotICogV2UgZG8gbm90IGltcGxlbWVudCBhbHRlcm5hdGUgcmVwcmVzZW50YXRpb25zLiBIb3dldmVyLCB3ZSBhbHdheXMKLSAqIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBtb2RpZmllciBpcyBhbGxvd2VkIGZvciBhIGNlcnRhaW4gY29udmVyc2lvbi4KLSAqLwotI2RlZmluZSBfQUxUX0UJCQkweDAxCi0jZGVmaW5lIF9BTFRfTwkJCTB4MDIKLSNkZWZpbmUJX0xFR0FMX0FMVCh4KQkJeyBpZiAoYWx0X2Zvcm1hdCAmIH4oeCkpIHJldHVybiAoMCk7IH0KLQotCi1zdGF0aWMJaW50IF9jb252X251bShjb25zdCB1bnNpZ25lZCBjaGFyICoqLCBpbnQgKiwgaW50LCBpbnQpOwotc3RhdGljCWNoYXIgKl9zdHJwdGltZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgc3RydWN0IHRtICosIGludCk7Ci0KLQotY2hhciAqCi1zdHJwdGltZShjb25zdCBjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgc3RydWN0IHRtICp0bSkKLXsKLQlyZXR1cm4oX3N0cnB0aW1lKGJ1ZiwgZm10LCB0bSwgMSkpOwotfQotCi1zdGF0aWMgY2hhciAqCi1fc3RycHRpbWUoY29uc3QgY2hhciAqYnVmLCBjb25zdCBjaGFyICpmbXQsIHN0cnVjdCB0bSAqdG0sIGludCBpbml0aWFsaXplKQotewotCXVuc2lnbmVkIGNoYXIgYzsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpicDsKLQlzaXplX3QgbGVuOwotCWludCBhbHRfZm9ybWF0LCBpOwotCXN0YXRpYyBpbnQgY2VudHVyeSwgcmVseWVhcjsKLQotCWlmIChpbml0aWFsaXplKSB7Ci0JCWNlbnR1cnkgPSBUTV9ZRUFSX0JBU0U7Ci0JCXJlbHllYXIgPSAtMTsKLQl9Ci0KLQlicCA9ICh1bnNpZ25lZCBjaGFyICopYnVmOwotCXdoaWxlICgoYyA9ICpmbXQpICE9ICdcMCcpIHsKLQkJLyogQ2xlYXIgYGFsdGVybmF0ZScgbW9kaWZpZXIgcHJpb3IgdG8gbmV3IGNvbnZlcnNpb24uICovCi0JCWFsdF9mb3JtYXQgPSAwOwotCi0JCS8qIEVhdCB1cCB3aGl0ZS1zcGFjZS4gKi8KLQkJaWYgKGlzc3BhY2UoYykpIHsKLQkJCXdoaWxlIChpc3NwYWNlKCpicCkpCi0JCQkJYnArKzsKLQotCQkJZm10Kys7Ci0JCQljb250aW51ZTsKLQkJfQotCQkJCQotCQlpZiAoKGMgPSAqZm10KyspICE9ICclJykKLQkJCWdvdG8gbGl0ZXJhbDsKLQotCi1hZ2FpbjoJCXN3aXRjaCAoYyA9ICpmbXQrKykgewotCQljYXNlICclJzoJLyogIiUlIiBpcyBjb252ZXJ0ZWQgdG8gIiUiLiAqLwotbGl0ZXJhbDoKLQkJaWYgKGMgIT0gKmJwKyspCi0JCQlyZXR1cm4gKE5VTEwpOwotCi0JCWJyZWFrOwotCi0JCS8qCi0JCSAqICJBbHRlcm5hdGl2ZSIgbW9kaWZpZXJzLiBKdXN0IHNldCB0aGUgYXBwcm9wcmlhdGUgZmxhZwotCQkgKiBhbmQgc3RhcnQgb3ZlciBhZ2Fpbi4KLQkJICovCi0JCWNhc2UgJ0UnOgkvKiAiJUU/IiBhbHRlcm5hdGl2ZSBjb252ZXJzaW9uIG1vZGlmaWVyLiAqLwotCQkJX0xFR0FMX0FMVCgwKTsKLQkJCWFsdF9mb3JtYXQgfD0gX0FMVF9FOwotCQkJZ290byBhZ2FpbjsKLQotCQljYXNlICdPJzoJLyogIiVPPyIgYWx0ZXJuYXRpdmUgY29udmVyc2lvbiBtb2RpZmllci4gKi8KLQkJCV9MRUdBTF9BTFQoMCk7Ci0JCQlhbHRfZm9ybWF0IHw9IF9BTFRfTzsKLQkJCWdvdG8gYWdhaW47Ci0JCQkKLQkJLyoKLQkJICogIkNvbXBsZXgiIGNvbnZlcnNpb24gcnVsZXMsIGltcGxlbWVudGVkIHRocm91Z2ggcmVjdXJzaW9uLgotCQkgKi8KLSNpZiAwCi0JCWNhc2UgJ2MnOgkvKiBEYXRlIGFuZCB0aW1lLCB1c2luZyB0aGUgbG9jYWxlJ3MgZm9ybWF0LiAqLwotCQkJX0xFR0FMX0FMVChfQUxUX0UpOwotCQkJaWYgKCEoYnAgPSBfc3RycHRpbWUoYnAsIF9jdGxvYyhkX3RfZm10KSwgdG0sIDApKSkKLQkJCQlyZXR1cm4gKE5VTEwpOwotCQkJYnJlYWs7Ci0jZW5kaWYKLQkJY2FzZSAnRCc6CS8qIFRoZSBkYXRlIGFzICIlbS8lZC8leSIuICovCi0JCQlfTEVHQUxfQUxUKDApOwotCQkJaWYgKCEoYnAgPSBfc3RycHRpbWUoYnAsICIlbS8lZC8leSIsIHRtLCAwKSkpCi0JCQkJcmV0dXJuIChOVUxMKTsKLQkJCWJyZWFrOwotCQotCQljYXNlICdSJzoJLyogVGhlIHRpbWUgYXMgIiVIOiVNIi4gKi8KLQkJCV9MRUdBTF9BTFQoMCk7Ci0JCQlpZiAoIShicCA9IF9zdHJwdGltZShicCwgIiVIOiVNIiwgdG0sIDApKSkKLQkJCQlyZXR1cm4gKE5VTEwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAncic6CS8qIFRoZSB0aW1lIGFzICIlSTolTTolUyAlcCIuICovCi0JCQlfTEVHQUxfQUxUKDApOwotCQkJaWYgKCEoYnAgPSBfc3RycHRpbWUoYnAsICIlSTolTTolUyAlcCIsIHRtLCAwKSkpCi0JCQkJcmV0dXJuIChOVUxMKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ1QnOgkvKiBUaGUgdGltZSBhcyAiJUg6JU06JVMiLiAqLwotCQkJX0xFR0FMX0FMVCgwKTsKLQkJCWlmICghKGJwID0gX3N0cnB0aW1lKGJwLCAiJUg6JU06JVMiLCB0bSwgMCkpKQotCQkJCXJldHVybiAoTlVMTCk7Ci0JCQlicmVhazsKLSNpZiAwCi0JCWNhc2UgJ1gnOgkvKiBUaGUgdGltZSwgdXNpbmcgdGhlIGxvY2FsZSdzIGZvcm1hdC4gKi8KLQkJCV9MRUdBTF9BTFQoX0FMVF9FKTsKLQkJCWlmICghKGJwID0gX3N0cnB0aW1lKGJwLCBfY3Rsb2ModF9mbXQpLCB0bSwgMCkpKQotCQkJCXJldHVybiAoTlVMTCk7Ci0JCQlicmVhazsKLQotCQljYXNlICd4JzoJLyogVGhlIGRhdGUsIHVzaW5nIHRoZSBsb2NhbGUncyBmb3JtYXQuICovCi0JCQlfTEVHQUxfQUxUKF9BTFRfRSk7Ci0JCQlpZiAoIShicCA9IF9zdHJwdGltZShicCwgX2N0bG9jKGRfZm10KSwgdG0sIDApKSkKLQkJCQlyZXR1cm4gKE5VTEwpOwotCQkJYnJlYWs7Ci0jZW5kaWYKLQkJLyoKLQkJICogIkVsZW1lbnRhcnkiIGNvbnZlcnNpb24gcnVsZXMuCi0JCSAqLwotI2lmIDAKLQkJY2FzZSAnQSc6CS8qIFRoZSBkYXkgb2Ygd2VlaywgdXNpbmcgdGhlIGxvY2FsZSdzIGZvcm0uICovCi0JCWNhc2UgJ2EnOgotCQkJX0xFR0FMX0FMVCgwKTsKLQkJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKLQkJCQkvKiBGdWxsIG5hbWUuICovCi0JCQkJbGVuID0gc3RybGVuKF9jdGxvYyhkYXlbaV0pKTsKLQkJCQlpZiAoc3RybmNhc2VjbXAoX2N0bG9jKGRheVtpXSksIGJwLCBsZW4pID09IDApCi0JCQkJCWJyZWFrOwotCi0JCQkJLyogQWJicmV2aWF0ZWQgbmFtZS4gKi8KLQkJCQlsZW4gPSBzdHJsZW4oX2N0bG9jKGFiZGF5W2ldKSk7Ci0JCQkJaWYgKHN0cm5jYXNlY21wKF9jdGxvYyhhYmRheVtpXSksIGJwLCBsZW4pID09IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBOb3RoaW5nIG1hdGNoZWQuICovCi0JCQlpZiAoaSA9PSA3KQotCQkJCXJldHVybiAoTlVMTCk7Ci0KLQkJCXRtLT50bV93ZGF5ID0gaTsKLQkJCWJwICs9IGxlbjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ0InOgkvKiBUaGUgbW9udGgsIHVzaW5nIHRoZSBsb2NhbGUncyBmb3JtLiAqLwotCQljYXNlICdiJzoKLQkJY2FzZSAnaCc6Ci0JCQlfTEVHQUxfQUxUKDApOwotCQkJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKLQkJCQkvKiBGdWxsIG5hbWUuICovCi0JCQkJbGVuID0gc3RybGVuKF9jdGxvYyhtb25baV0pKTsKLQkJCQlpZiAoc3RybmNhc2VjbXAoX2N0bG9jKG1vbltpXSksIGJwLCBsZW4pID09IDApCi0JCQkJCWJyZWFrOwotCi0JCQkJLyogQWJicmV2aWF0ZWQgbmFtZS4gKi8KLQkJCQlsZW4gPSBzdHJsZW4oX2N0bG9jKGFibW9uW2ldKSk7Ci0JCQkJaWYgKHN0cm5jYXNlY21wKF9jdGxvYyhhYm1vbltpXSksIGJwLCBsZW4pID09IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBOb3RoaW5nIG1hdGNoZWQuICovCi0JCQlpZiAoaSA9PSAxMikKLQkJCQlyZXR1cm4gKE5VTEwpOwotCi0JCQl0bS0+dG1fbW9uID0gaTsKLQkJCWJwICs9IGxlbjsKLQkJCWJyZWFrOwotI2VuZGlmCi0KLQkJY2FzZSAnQyc6CS8qIFRoZSBjZW50dXJ5IG51bWJlci4gKi8KLQkJCV9MRUdBTF9BTFQoX0FMVF9FKTsKLQkJCWlmICghKF9jb252X251bSgmYnAsICZpLCAwLCA5OSkpKQotCQkJCXJldHVybiAoTlVMTCk7Ci0KLQkJCWNlbnR1cnkgPSBpICogMTAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnZCc6CS8qIFRoZSBkYXkgb2YgbW9udGguICovCi0JCWNhc2UgJ2UnOgotCQkJX0xFR0FMX0FMVChfQUxUX08pOwotCQkJaWYgKCEoX2NvbnZfbnVtKCZicCwgJnRtLT50bV9tZGF5LCAxLCAzMSkpKQotCQkJCXJldHVybiAoTlVMTCk7Ci0JCQlicmVhazsKLQotCQljYXNlICdrJzoJLyogVGhlIGhvdXIgKDI0LWhvdXIgY2xvY2sgcmVwcmVzZW50YXRpb24pLiAqLwotCQkJX0xFR0FMX0FMVCgwKTsKLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWNhc2UgJ0gnOgotCQkJX0xFR0FMX0FMVChfQUxUX08pOwotCQkJaWYgKCEoX2NvbnZfbnVtKCZicCwgJnRtLT50bV9ob3VyLCAwLCAyMykpKQotCQkJCXJldHVybiAoTlVMTCk7Ci0JCQlicmVhazsKLQotCQljYXNlICdsJzoJLyogVGhlIGhvdXIgKDEyLWhvdXIgY2xvY2sgcmVwcmVzZW50YXRpb24pLiAqLwotCQkJX0xFR0FMX0FMVCgwKTsKLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWNhc2UgJ0knOgotCQkJX0xFR0FMX0FMVChfQUxUX08pOwotCQkJaWYgKCEoX2NvbnZfbnVtKCZicCwgJnRtLT50bV9ob3VyLCAxLCAxMikpKQotCQkJCXJldHVybiAoTlVMTCk7Ci0JCQlicmVhazsKLQotCQljYXNlICdqJzoJLyogVGhlIGRheSBvZiB5ZWFyLiAqLwotCQkJX0xFR0FMX0FMVCgwKTsKLQkJCWlmICghKF9jb252X251bSgmYnAsICZ0bS0+dG1feWRheSwgMSwgMzY2KSkpCi0JCQkJcmV0dXJuIChOVUxMKTsKLQkJCXRtLT50bV95ZGF5LS07Ci0JCQlicmVhazsKLQotCQljYXNlICdNJzoJLyogVGhlIG1pbnV0ZS4gKi8KLQkJCV9MRUdBTF9BTFQoX0FMVF9PKTsKLQkJCWlmICghKF9jb252X251bSgmYnAsICZ0bS0+dG1fbWluLCAwLCA1OSkpKQotCQkJCXJldHVybiAoTlVMTCk7Ci0JCQlicmVhazsKLQotCQljYXNlICdtJzoJLyogVGhlIG1vbnRoLiAqLwotCQkJX0xFR0FMX0FMVChfQUxUX08pOwotCQkJaWYgKCEoX2NvbnZfbnVtKCZicCwgJnRtLT50bV9tb24sIDEsIDEyKSkpCi0JCQkJcmV0dXJuIChOVUxMKTsKLQkJCXRtLT50bV9tb24tLTsKLQkJCWJyZWFrOwotCi0jaWYgMAotCQljYXNlICdwJzoJLyogVGhlIGxvY2FsZSdzIGVxdWl2YWxlbnQgb2YgQU0vUE0uICovCi0JCQlfTEVHQUxfQUxUKDApOwotCQkJLyogQU0/ICovCi0JCQlsZW4gPSBzdHJsZW4oX2N0bG9jKGFtX3BtWzBdKSk7Ci0JCQlpZiAoc3RybmNhc2VjbXAoX2N0bG9jKGFtX3BtWzBdKSwgYnAsIGxlbikgPT0gMCkgewotCQkJCWlmICh0bS0+dG1faG91ciA+IDEyKQkvKiBpLmUuLCAxMzowMCBBTSA/ISAqLwotCQkJCQlyZXR1cm4gKE5VTEwpOwotCQkJCWVsc2UgaWYgKHRtLT50bV9ob3VyID09IDEyKQotCQkJCQl0bS0+dG1faG91ciA9IDA7Ci0KLQkJCQlicCArPSBsZW47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBQTT8gKi8KLQkJCWxlbiA9IHN0cmxlbihfY3Rsb2MoYW1fcG1bMV0pKTsKLQkJCWlmIChzdHJuY2FzZWNtcChfY3Rsb2MoYW1fcG1bMV0pLCBicCwgbGVuKSA9PSAwKSB7Ci0JCQkJaWYgKHRtLT50bV9ob3VyID4gMTIpCS8qIGkuZS4sIDEzOjAwIFBNID8hICovCi0JCQkJCXJldHVybiAoTlVMTCk7Ci0JCQkJZWxzZSBpZiAodG0tPnRtX2hvdXIgPCAxMikKLQkJCQkJdG0tPnRtX2hvdXIgKz0gMTI7Ci0KLQkJCQlicCArPSBsZW47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIE5vdGhpbmcgbWF0Y2hlZC4gKi8KLQkJCXJldHVybiAoTlVMTCk7Ci0jZW5kaWYKLQkJY2FzZSAnUyc6CS8qIFRoZSBzZWNvbmRzLiAqLwotCQkJX0xFR0FMX0FMVChfQUxUX08pOwotCQkJaWYgKCEoX2NvbnZfbnVtKCZicCwgJnRtLT50bV9zZWMsIDAsIDYxKSkpCi0JCQkJcmV0dXJuIChOVUxMKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ1UnOgkvKiBUaGUgd2VlayBvZiB5ZWFyLCBiZWdpbm5pbmcgb24gc3VuZGF5LiAqLwotCQljYXNlICdXJzoJLyogVGhlIHdlZWsgb2YgeWVhciwgYmVnaW5uaW5nIG9uIG1vbmRheS4gKi8KLQkJCV9MRUdBTF9BTFQoX0FMVF9PKTsKLQkJCS8qCi0JCQkgKiBYWFggVGhpcyBpcyBib2d1cywgYXMgd2UgY2FuIG5vdCBhc3N1bWUgYW55IHZhbGlkCi0JCQkgKiBpbmZvcm1hdGlvbiBwcmVzZW50IGluIHRoZSB0bSBzdHJ1Y3R1cmUgYXQgdGhpcwotCQkJICogcG9pbnQgdG8gY2FsY3VsYXRlIGEgcmVhbCB2YWx1ZSwgc28ganVzdCBjaGVjayB0aGUKLQkJCSAqIHJhbmdlIGZvciBub3cuCi0JCQkgKi8KLQkJCSBpZiAoIShfY29udl9udW0oJmJwLCAmaSwgMCwgNTMpKSkKLQkJCQlyZXR1cm4gKE5VTEwpOwotCQkJIGJyZWFrOwotCi0JCWNhc2UgJ3cnOgkvKiBUaGUgZGF5IG9mIHdlZWssIGJlZ2lubmluZyBvbiBzdW5kYXkuICovCi0JCQlfTEVHQUxfQUxUKF9BTFRfTyk7Ci0JCQlpZiAoIShfY29udl9udW0oJmJwLCAmdG0tPnRtX3dkYXksIDAsIDYpKSkKLQkJCQlyZXR1cm4gKE5VTEwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnWSc6CS8qIFRoZSB5ZWFyLiAqLwotCQkJX0xFR0FMX0FMVChfQUxUX0UpOwotCQkJaWYgKCEoX2NvbnZfbnVtKCZicCwgJmksIDAsIDk5OTkpKSkKLQkJCQlyZXR1cm4gKE5VTEwpOwotCi0JCQlyZWx5ZWFyID0gLTE7Ci0JCQl0bS0+dG1feWVhciA9IGkgLSBUTV9ZRUFSX0JBU0U7Ci0JCQlicmVhazsKLQotCQljYXNlICd5JzoJLyogVGhlIHllYXIgd2l0aGluIHRoZSBjZW50dXJ5ICgyIGRpZ2l0cykuICovCi0JCQlfTEVHQUxfQUxUKF9BTFRfRSB8IF9BTFRfTyk7Ci0JCQlpZiAoIShfY29udl9udW0oJmJwLCAmcmVseWVhciwgMCwgOTkpKSkKLQkJCQlyZXR1cm4gKE5VTEwpOwotCQkJYnJlYWs7Ci0KLQkJLyoKLQkJICogTWlzY2VsbGFuZW91cyBjb252ZXJzaW9ucy4KLQkJICovCi0JCWNhc2UgJ24nOgkvKiBBbnkga2luZCBvZiB3aGl0ZS1zcGFjZS4gKi8KLQkJY2FzZSAndCc6Ci0JCQlfTEVHQUxfQUxUKDApOwotCQkJd2hpbGUgKGlzc3BhY2UoKmJwKSkKLQkJCQlicCsrOwotCQkJYnJlYWs7Ci0KLQotCQlkZWZhdWx0OgkvKiBVbmtub3duL3Vuc3VwcG9ydGVkIGNvbnZlcnNpb24uICovCi0JCQlyZXR1cm4gKE5VTEwpOwotCQl9Ci0KLQotCX0KLQotCS8qCi0JICogV2UgbmVlZCB0byBldmFsdWF0ZSB0aGUgdHdvIGRpZ2l0IHllYXIgc3BlYyAoJXkpCi0JICogbGFzdCBhcyB3ZSBjYW4gZ2V0IGEgY2VudHVyeSBzcGVjICglQykgYXQgYW55IHRpbWUuCi0JICovCi0JaWYgKHJlbHllYXIgIT0gLTEpIHsKLQkJaWYgKGNlbnR1cnkgPT0gVE1fWUVBUl9CQVNFKSB7Ci0JCQlpZiAocmVseWVhciA8PSA2OCkKLQkJCQl0bS0+dG1feWVhciA9IHJlbHllYXIgKyAyMDAwIC0gVE1fWUVBUl9CQVNFOwotCQkJZWxzZQotCQkJCXRtLT50bV95ZWFyID0gcmVseWVhciArIDE5MDAgLSBUTV9ZRUFSX0JBU0U7Ci0JCX0gZWxzZSB7Ci0JCQl0bS0+dG1feWVhciA9IHJlbHllYXIgKyBjZW50dXJ5IC0gVE1fWUVBUl9CQVNFOwotCQl9Ci0JfQotCi0JcmV0dXJuICgoY2hhciAqKWJwKTsKLX0KLQotCi1zdGF0aWMgaW50Ci1fY29udl9udW0oY29uc3QgdW5zaWduZWQgY2hhciAqKmJ1ZiwgaW50ICpkZXN0LCBpbnQgbGxpbSwgaW50IHVsaW0pCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JaW50IHJ1bGltID0gdWxpbTsKLQotCWlmICgqKmJ1ZiA8ICcwJyB8fCAqKmJ1ZiA+ICc5JykKLQkJcmV0dXJuICgwKTsKLQotCS8qIHdlIHVzZSBydWxpbSB0byBicmVhayBvdXQgb2YgdGhlIGxvb3Agd2hlbiB3ZSBydW4gb3V0IG9mIGRpZ2l0cyAqLwotCWRvIHsKLQkJcmVzdWx0ICo9IDEwOwotCQlyZXN1bHQgKz0gKigqYnVmKSsrIC0gJzAnOwotCQlydWxpbSAvPSAxMDsKLQl9IHdoaWxlICgocmVzdWx0ICogMTAgPD0gdWxpbSkgJiYgcnVsaW0gJiYgKipidWYgPj0gJzAnICYmICoqYnVmIDw9ICc5Jyk7Ci0KLQlpZiAocmVzdWx0IDwgbGxpbSB8fCByZXN1bHQgPiB1bGltKQotCQlyZXR1cm4gKDApOwotCi0JKmRlc3QgPSByZXN1bHQ7Ci0JcmV0dXJuICgxKTsKLX0KLQotI2VuZGlmIC8qIEhBVkVfU1RSUFRJTUUgKi8KLQpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvc3Ryc2VwLmMgYi9vcGVuYnNkLWNvbXBhdC9zdHJzZXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2ZWI4Zi4uMDAwMDAwMAotLS0gYS9vcGVuYnNkLWNvbXBhdC9zdHJzZXAuYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCSRPcGVuQlNEOiBzdHJzZXAuYyx2IDEuNiAyMDA1LzA4LzA4IDA4OjA1OjM3IGVzcGllIEV4cCAkCSovCi0KLS8qLQotICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkzCi0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvc3RyaW5nL3N0cnNlcC5jICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWYgIWRlZmluZWQoSEFWRV9TVFJTRVApCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKgotICogR2V0IG5leHQgdG9rZW4gZnJvbSBzdHJpbmcgKnN0cmluZ3AsIHdoZXJlIHRva2VucyBhcmUgcG9zc2libHktZW1wdHkKLSAqIHN0cmluZ3Mgc2VwYXJhdGVkIGJ5IGNoYXJhY3RlcnMgZnJvbSBkZWxpbS4gIAotICoKLSAqIFdyaXRlcyBOVUxzIGludG8gdGhlIHN0cmluZyBhdCAqc3RyaW5ncCB0byBlbmQgdG9rZW5zLgotICogZGVsaW0gbmVlZCBub3QgcmVtYWluIGNvbnN0YW50IGZyb20gY2FsbCB0byBjYWxsLgotICogT24gcmV0dXJuLCAqc3RyaW5ncCBwb2ludHMgcGFzdCB0aGUgbGFzdCBOVUwgd3JpdHRlbiAoaWYgdGhlcmUgbWlnaHQKLSAqIGJlIGZ1cnRoZXIgdG9rZW5zKSwgb3IgaXMgTlVMTCAoaWYgdGhlcmUgYXJlIGRlZmluaXRlbHkgbm8gbW9yZSB0b2tlbnMpLgotICoKLSAqIElmICpzdHJpbmdwIGlzIE5VTEwsIHN0cnNlcCByZXR1cm5zIE5VTEwuCi0gKi8KLWNoYXIgKgotc3Ryc2VwKGNoYXIgKipzdHJpbmdwLCBjb25zdCBjaGFyICpkZWxpbSkKLXsKLQljaGFyICpzOwotCWNvbnN0IGNoYXIgKnNwYW5wOwotCWludCBjLCBzYzsKLQljaGFyICp0b2s7Ci0KLQlpZiAoKHMgPSAqc3RyaW5ncCkgPT0gTlVMTCkKLQkJcmV0dXJuIChOVUxMKTsKLQlmb3IgKHRvayA9IHM7OykgewotCQljID0gKnMrKzsKLQkJc3BhbnAgPSBkZWxpbTsKLQkJZG8gewotCQkJaWYgKChzYyA9ICpzcGFucCsrKSA9PSBjKSB7Ci0JCQkJaWYgKGMgPT0gMCkKLQkJCQkJcyA9IE5VTEw7Ci0JCQkJZWxzZQotCQkJCQlzWy0xXSA9IDA7Ci0JCQkJKnN0cmluZ3AgPSBzOwotCQkJCXJldHVybiAodG9rKTsKLQkJCX0KLQkJfSB3aGlsZSAoc2MgIT0gMCk7Ci0JfQotCS8qIE5PVFJFQUNIRUQgKi8KLX0KLQotI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfU1RSU0VQKSAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvc3RydG9sbC5jIGIvb3BlbmJzZC1jb21wYXQvc3RydG9sbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjI5MzAzLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3N0cnRvbGwuYworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKiAkT3BlbkJTRDogc3RydG9sbC5jLHYgMS42IDIwMDUvMTEvMTAgMTA6MDA6MTcgZXNwaWUgRXhwICQgKi8KLS8qLQotICogQ29weXJpZ2h0IChjKSAxOTkyIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9zdGRsaWIvc3RydG9sbC5jICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2lmbmRlZiBIQVZFX1NUUlRPTEwKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0vKgotICogQ29udmVydCBhIHN0cmluZyB0byBhIGxvbmcgbG9uZy4KLSAqCi0gKiBJZ25vcmVzIGBsb2NhbGUnIHN0dWZmLiAgQXNzdW1lcyB0aGF0IHRoZSB1cHBlciBhbmQgbG93ZXIgY2FzZQotICogYWxwaGFiZXRzIGFuZCBkaWdpdHMgYXJlIGVhY2ggY29udGlndW91cy4KLSAqLwotbG9uZyBsb25nCi1zdHJ0b2xsKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKQotewotCWNvbnN0IGNoYXIgKnM7Ci0JbG9uZyBsb25nIGFjYywgY3V0b2ZmOwotCWludCBjOwotCWludCBuZWcsIGFueSwgY3V0bGltOwotCi0JLyoKLQkgKiBTa2lwIHdoaXRlIHNwYWNlIGFuZCBwaWNrIHVwIGxlYWRpbmcgKy8tIHNpZ24gaWYgYW55LgotCSAqIElmIGJhc2UgaXMgMCwgYWxsb3cgMHggZm9yIGhleCBhbmQgMCBmb3Igb2N0YWwsIGVsc2UKLQkgKiBhc3N1bWUgZGVjaW1hbDsgaWYgYmFzZSBpcyBhbHJlYWR5IDE2LCBhbGxvdyAweC4KLQkgKi8KLQlzID0gbnB0cjsKLQlkbyB7Ci0JCWMgPSAodW5zaWduZWQgY2hhcikgKnMrKzsKLQl9IHdoaWxlIChpc3NwYWNlKGMpKTsKLQlpZiAoYyA9PSAnLScpIHsKLQkJbmVnID0gMTsKLQkJYyA9ICpzKys7Ci0JfSBlbHNlIHsKLQkJbmVnID0gMDsKLQkJaWYgKGMgPT0gJysnKQotCQkJYyA9ICpzKys7Ci0JfQotCWlmICgoYmFzZSA9PSAwIHx8IGJhc2UgPT0gMTYpICYmCi0JICAgIGMgPT0gJzAnICYmICgqcyA9PSAneCcgfHwgKnMgPT0gJ1gnKSkgewotCQljID0gc1sxXTsKLQkJcyArPSAyOwotCQliYXNlID0gMTY7Ci0JfQotCWlmIChiYXNlID09IDApCi0JCWJhc2UgPSBjID09ICcwJyA/IDggOiAxMDsKLQotCS8qCi0JICogQ29tcHV0ZSB0aGUgY3V0b2ZmIHZhbHVlIGJldHdlZW4gbGVnYWwgbnVtYmVycyBhbmQgaWxsZWdhbAotCSAqIG51bWJlcnMuICBUaGF0IGlzIHRoZSBsYXJnZXN0IGxlZ2FsIHZhbHVlLCBkaXZpZGVkIGJ5IHRoZQotCSAqIGJhc2UuICBBbiBpbnB1dCBudW1iZXIgdGhhdCBpcyBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZSwgaWYKLQkgKiBmb2xsb3dlZCBieSBhIGxlZ2FsIGlucHV0IGNoYXJhY3RlciwgaXMgdG9vIGJpZy4gIE9uZSB0aGF0Ci0JICogaXMgZXF1YWwgdG8gdGhpcyB2YWx1ZSBtYXkgYmUgdmFsaWQgb3Igbm90OyB0aGUgbGltaXQKLQkgKiBiZXR3ZWVuIHZhbGlkIGFuZCBpbnZhbGlkIG51bWJlcnMgaXMgdGhlbiBiYXNlZCBvbiB0aGUgbGFzdAotCSAqIGRpZ2l0LiAgRm9yIGluc3RhbmNlLCBpZiB0aGUgcmFuZ2UgZm9yIGxvbmcgbG9uZ3MgaXMKLQkgKiBbLTkyMjMzNzIwMzY4NTQ3NzU4MDguLjkyMjMzNzIwMzY4NTQ3NzU4MDddIGFuZCB0aGUgaW5wdXQgYmFzZQotCSAqIGlzIDEwLCBjdXRvZmYgd2lsbCBiZSBzZXQgdG8gOTIyMzM3MjAzNjg1NDc3NTgwIGFuZCBjdXRsaW0gdG8KLQkgKiBlaXRoZXIgNyAobmVnPT0wKSBvciA4IChuZWc9PTEpLCBtZWFuaW5nIHRoYXQgaWYgd2UgaGF2ZQotCSAqIGFjY3VtdWxhdGVkIGEgdmFsdWUgPiA5MjIzMzcyMDM2ODU0Nzc1ODAsIG9yIGVxdWFsIGJ1dCB0aGUKLQkgKiBuZXh0IGRpZ2l0IGlzID4gNyAob3IgOCksIHRoZSBudW1iZXIgaXMgdG9vIGJpZywgYW5kIHdlIHdpbGwKLQkgKiByZXR1cm4gYSByYW5nZSBlcnJvci4KLQkgKgotCSAqIFNldCBhbnkgaWYgYW55IGBkaWdpdHMnIGNvbnN1bWVkOyBtYWtlIGl0IG5lZ2F0aXZlIHRvIGluZGljYXRlCi0JICogb3ZlcmZsb3cuCi0JICovCi0JY3V0b2ZmID0gbmVnID8gTExPTkdfTUlOIDogTExPTkdfTUFYOwotCWN1dGxpbSA9IGN1dG9mZiAlIGJhc2U7Ci0JY3V0b2ZmIC89IGJhc2U7Ci0JaWYgKG5lZykgewotCQlpZiAoY3V0bGltID4gMCkgewotCQkJY3V0bGltIC09IGJhc2U7Ci0JCQljdXRvZmYgKz0gMTsKLQkJfQotCQljdXRsaW0gPSAtY3V0bGltOwotCX0KLQlmb3IgKGFjYyA9IDAsIGFueSA9IDA7OyBjID0gKHVuc2lnbmVkIGNoYXIpICpzKyspIHsKLQkJaWYgKGlzZGlnaXQoYykpCi0JCQljIC09ICcwJzsKLQkJZWxzZSBpZiAoaXNhbHBoYShjKSkKLQkJCWMgLT0gaXN1cHBlcihjKSA/ICdBJyAtIDEwIDogJ2EnIC0gMTA7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCQlpZiAoYyA+PSBiYXNlKQotCQkJYnJlYWs7Ci0JCWlmIChhbnkgPCAwKQotCQkJY29udGludWU7Ci0JCWlmIChuZWcpIHsKLQkJCWlmIChhY2MgPCBjdXRvZmYgfHwgKGFjYyA9PSBjdXRvZmYgJiYgYyA+IGN1dGxpbSkpIHsKLQkJCQlhbnkgPSAtMTsKLQkJCQlhY2MgPSBMTE9OR19NSU47Ci0JCQkJZXJybm8gPSBFUkFOR0U7Ci0JCQl9IGVsc2UgewotCQkJCWFueSA9IDE7Ci0JCQkJYWNjICo9IGJhc2U7Ci0JCQkJYWNjIC09IGM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYWNjID4gY3V0b2ZmIHx8IChhY2MgPT0gY3V0b2ZmICYmIGMgPiBjdXRsaW0pKSB7Ci0JCQkJYW55ID0gLTE7Ci0JCQkJYWNjID0gTExPTkdfTUFYOwotCQkJCWVycm5vID0gRVJBTkdFOwotCQkJfSBlbHNlIHsKLQkJCQlhbnkgPSAxOwotCQkJCWFjYyAqPSBiYXNlOwotCQkJCWFjYyArPSBjOwotCQkJfQotCQl9Ci0JfQotCWlmIChlbmRwdHIgIT0gMCkKLQkJKmVuZHB0ciA9IChjaGFyICopIChhbnkgPyBzIC0gMSA6IG5wdHIpOwotCXJldHVybiAoYWNjKTsKLX0KLSNlbmRpZiAvKiBIQVZFX1NUUlRPTEwgKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L3N0cnRvbnVtLmMgYi9vcGVuYnNkLWNvbXBhdC9zdHJ0b251bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2YyZjI0Li4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3N0cnRvbnVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgkkT3BlbkJTRDogc3RydG9udW0uYyx2IDEuNiAyMDA0LzA4LzAzIDE5OjM4OjAxIG1pbGxlcnQgRXhwICQJKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBUZWQgVW5hbmdzdCBhbmQgVG9kZCBNaWxsZXIKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvc3RkbGliL3N0cnRvbnVtLmMgKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpZm5kZWYgSEFWRV9TVFJUT05VTQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNkZWZpbmUgSU5WQUxJRCAJMQotI2RlZmluZSBUT09TTUFMTCAJMgotI2RlZmluZSBUT09MQVJHRSAJMwotCi1sb25nIGxvbmcKLXN0cnRvbnVtKGNvbnN0IGNoYXIgKm51bXN0ciwgbG9uZyBsb25nIG1pbnZhbCwgbG9uZyBsb25nIG1heHZhbCwKLSAgICBjb25zdCBjaGFyICoqZXJyc3RycCkKLXsKLQlsb25nIGxvbmcgbGwgPSAwOwotCWNoYXIgKmVwOwotCWludCBlcnJvciA9IDA7Ci0Jc3RydWN0IGVycnZhbCB7Ci0JCWNvbnN0IGNoYXIgKmVycnN0cjsKLQkJaW50IGVycjsKLQl9IGV2WzRdID0gewotCQl7IE5VTEwsCQkwIH0sCi0JCXsgImludmFsaWQiLAlFSU5WQUwgfSwKLQkJeyAidG9vIHNtYWxsIiwJRVJBTkdFIH0sCi0JCXsgInRvbyBsYXJnZSIsCUVSQU5HRSB9LAotCX07Ci0KLQlldlswXS5lcnIgPSBlcnJubzsKLQllcnJubyA9IDA7Ci0JaWYgKG1pbnZhbCA+IG1heHZhbCkKLQkJZXJyb3IgPSBJTlZBTElEOwotCWVsc2UgewotCQlsbCA9IHN0cnRvbGwobnVtc3RyLCAmZXAsIDEwKTsKLQkJaWYgKG51bXN0ciA9PSBlcCB8fCAqZXAgIT0gJ1wwJykKLQkJCWVycm9yID0gSU5WQUxJRDsKLQkJZWxzZSBpZiAoKGxsID09IExMT05HX01JTiAmJiBlcnJubyA9PSBFUkFOR0UpIHx8IGxsIDwgbWludmFsKQotCQkJZXJyb3IgPSBUT09TTUFMTDsKLQkJZWxzZSBpZiAoKGxsID09IExMT05HX01BWCAmJiBlcnJubyA9PSBFUkFOR0UpIHx8IGxsID4gbWF4dmFsKQotCQkJZXJyb3IgPSBUT09MQVJHRTsKLQl9Ci0JaWYgKGVycnN0cnAgIT0gTlVMTCkKLQkJKmVycnN0cnAgPSBldltlcnJvcl0uZXJyc3RyOwotCWVycm5vID0gZXZbZXJyb3JdLmVycjsKLQlpZiAoZXJyb3IpCi0JCWxsID0gMDsKLQotCXJldHVybiAobGwpOwotfQotCi0jZW5kaWYgLyogSEFWRV9TVFJUT05VTSAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvc3RydG91bC5jIGIvb3BlbmJzZC1jb21wYXQvc3RydG91bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjE5YzgzLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3N0cnRvdWwuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgkkT3BlbkJTRDogc3RydG91bC5jLHYgMS43IDIwMDUvMDgvMDggMDg6MDU6MzcgZXNwaWUgRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvc3RkbGliL3N0cnRvdWwuYyAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLSNpZm5kZWYgSEFWRV9TVFJUT1VMCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8qCi0gKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgaW50ZWdlci4KLSAqCi0gKiBJZ25vcmVzIGBsb2NhbGUnIHN0dWZmLiAgQXNzdW1lcyB0aGF0IHRoZSB1cHBlciBhbmQgbG93ZXIgY2FzZQotICogYWxwaGFiZXRzIGFuZCBkaWdpdHMgYXJlIGVhY2ggY29udGlndW91cy4KLSAqLwotdW5zaWduZWQgbG9uZwotc3RydG91bChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkKLXsKLQljb25zdCBjaGFyICpzOwotCXVuc2lnbmVkIGxvbmcgYWNjLCBjdXRvZmY7Ci0JaW50IGM7Ci0JaW50IG5lZywgYW55LCBjdXRsaW07Ci0KLQkvKgotCSAqIFNlZSBzdHJ0b2wgZm9yIGNvbW1lbnRzIGFzIHRvIHRoZSBsb2dpYyB1c2VkLgotCSAqLwotCXMgPSBucHRyOwotCWRvIHsKLQkJYyA9ICh1bnNpZ25lZCBjaGFyKSAqcysrOwotCX0gd2hpbGUgKGlzc3BhY2UoYykpOwotCWlmIChjID09ICctJykgewotCQluZWcgPSAxOwotCQljID0gKnMrKzsKLQl9IGVsc2UgewotCQluZWcgPSAwOwotCQlpZiAoYyA9PSAnKycpCi0JCQljID0gKnMrKzsKLQl9Ci0JaWYgKChiYXNlID09IDAgfHwgYmFzZSA9PSAxNikgJiYKLQkgICAgYyA9PSAnMCcgJiYgKCpzID09ICd4JyB8fCAqcyA9PSAnWCcpKSB7Ci0JCWMgPSBzWzFdOwotCQlzICs9IDI7Ci0JCWJhc2UgPSAxNjsKLQl9Ci0JaWYgKGJhc2UgPT0gMCkKLQkJYmFzZSA9IGMgPT0gJzAnID8gOCA6IDEwOwotCi0JY3V0b2ZmID0gVUxPTkdfTUFYIC8gKHVuc2lnbmVkIGxvbmcpYmFzZTsKLQljdXRsaW0gPSBVTE9OR19NQVggJSAodW5zaWduZWQgbG9uZyliYXNlOwotCWZvciAoYWNjID0gMCwgYW55ID0gMDs7IGMgPSAodW5zaWduZWQgY2hhcikgKnMrKykgewotCQlpZiAoaXNkaWdpdChjKSkKLQkJCWMgLT0gJzAnOwotCQllbHNlIGlmIChpc2FscGhhKGMpKQotCQkJYyAtPSBpc3VwcGVyKGMpID8gJ0EnIC0gMTAgOiAnYScgLSAxMDsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JCWlmIChjID49IGJhc2UpCi0JCQlicmVhazsKLQkJaWYgKGFueSA8IDApCi0JCQljb250aW51ZTsKLQkJaWYgKGFjYyA+IGN1dG9mZiB8fCBhY2MgPT0gY3V0b2ZmICYmIGMgPiBjdXRsaW0pIHsKLQkJCWFueSA9IC0xOwotCQkJYWNjID0gVUxPTkdfTUFYOwotCQkJZXJybm8gPSBFUkFOR0U7Ci0JCX0gZWxzZSB7Ci0JCQlhbnkgPSAxOwotCQkJYWNjICo9ICh1bnNpZ25lZCBsb25nKWJhc2U7Ci0JCQlhY2MgKz0gYzsKLQkJfQotCX0KLQlpZiAobmVnICYmIGFueSA+IDApCi0JCWFjYyA9IC1hY2M7Ci0JaWYgKGVuZHB0ciAhPSAwKQotCQkqZW5kcHRyID0gKGNoYXIgKikgKGFueSA/IHMgLSAxIDogbnB0cik7Ci0JcmV0dXJuIChhY2MpOwotfQotI2VuZGlmIC8qICFIQVZFX1NUUlRPVUwgKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIGIvb3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjA1ODcuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MTIgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHF1ZXVlLmgsdiAxLjMyIDIwMDcvMDQvMzAgMTg6NDI6MzQgcGVkcm8gRXhwICQJKi8KLS8qCSROZXRCU0Q6IHF1ZXVlLmgsdiAxLjExIDE5OTYvMDUvMTYgMDU6MTc6MTQgbXljcm9mdCBFeHAgJAkqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCi0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICoJQCgjKXF1ZXVlLmgJOC41IChCZXJrZWxleSkgOC8yMC85NAotICovCi0KLS8qIE9QRU5CU0QgT1JJR0lOQUw6IHN5cy9zeXMvcXVldWUuaCAqLwotCi0jaWZuZGVmCV9GQUtFX1FVRVVFX0hfCi0jZGVmaW5lCV9GQUtFX1FVRVVFX0hfCi0KLS8qCi0gKiBSZXF1aXJlIGZvciBPUy9YIGFuZCBvdGhlciBwbGF0Zm9ybXMgdGhhdCBoYXZlIG9sZC9icm9rZW4vaW5jb21wbGV0ZQotICogPHN5cy9xdWV1ZS5oPi4KLSAqLwotI3VuZGVmIFNMSVNUX0hFQUQKLSN1bmRlZiBTTElTVF9IRUFEX0lOSVRJQUxJWkVSCi0jdW5kZWYgU0xJU1RfRU5UUlkKLSN1bmRlZiBTTElTVF9GT1JFQUNIX1BSRVZQVFIKLSN1bmRlZiBTTElTVF9GSVJTVAotI3VuZGVmIFNMSVNUX0VORAotI3VuZGVmIFNMSVNUX0VNUFRZCi0jdW5kZWYgU0xJU1RfTkVYVAotI3VuZGVmIFNMSVNUX0ZPUkVBQ0gKLSN1bmRlZiBTTElTVF9JTklUCi0jdW5kZWYgU0xJU1RfSU5TRVJUX0FGVEVSCi0jdW5kZWYgU0xJU1RfSU5TRVJUX0hFQUQKLSN1bmRlZiBTTElTVF9SRU1PVkVfSEVBRAotI3VuZGVmIFNMSVNUX1JFTU9WRQotI3VuZGVmIFNMSVNUX1JFTU9WRV9ORVhUCi0jdW5kZWYgTElTVF9IRUFECi0jdW5kZWYgTElTVF9IRUFEX0lOSVRJQUxJWkVSCi0jdW5kZWYgTElTVF9FTlRSWQotI3VuZGVmIExJU1RfRklSU1QKLSN1bmRlZiBMSVNUX0VORAotI3VuZGVmIExJU1RfRU1QVFkKLSN1bmRlZiBMSVNUX05FWFQKLSN1bmRlZiBMSVNUX0ZPUkVBQ0gKLSN1bmRlZiBMSVNUX0lOSVQKLSN1bmRlZiBMSVNUX0lOU0VSVF9BRlRFUgotI3VuZGVmIExJU1RfSU5TRVJUX0JFRk9SRQotI3VuZGVmIExJU1RfSU5TRVJUX0hFQUQKLSN1bmRlZiBMSVNUX1JFTU9WRQotI3VuZGVmIExJU1RfUkVQTEFDRQotI3VuZGVmIFNJTVBMRVFfSEVBRAotI3VuZGVmIFNJTVBMRVFfSEVBRF9JTklUSUFMSVpFUgotI3VuZGVmIFNJTVBMRVFfRU5UUlkKLSN1bmRlZiBTSU1QTEVRX0ZJUlNUCi0jdW5kZWYgU0lNUExFUV9FTkQKLSN1bmRlZiBTSU1QTEVRX0VNUFRZCi0jdW5kZWYgU0lNUExFUV9ORVhUCi0jdW5kZWYgU0lNUExFUV9GT1JFQUNICi0jdW5kZWYgU0lNUExFUV9JTklUCi0jdW5kZWYgU0lNUExFUV9JTlNFUlRfSEVBRAotI3VuZGVmIFNJTVBMRVFfSU5TRVJUX1RBSUwKLSN1bmRlZiBTSU1QTEVRX0lOU0VSVF9BRlRFUgotI3VuZGVmIFNJTVBMRVFfUkVNT1ZFX0hFQUQKLSN1bmRlZiBUQUlMUV9IRUFECi0jdW5kZWYgVEFJTFFfSEVBRF9JTklUSUFMSVpFUgotI3VuZGVmIFRBSUxRX0VOVFJZCi0jdW5kZWYgVEFJTFFfRklSU1QKLSN1bmRlZiBUQUlMUV9FTkQKLSN1bmRlZiBUQUlMUV9ORVhUCi0jdW5kZWYgVEFJTFFfTEFTVAotI3VuZGVmIFRBSUxRX1BSRVYKLSN1bmRlZiBUQUlMUV9FTVBUWQotI3VuZGVmIFRBSUxRX0ZPUkVBQ0gKLSN1bmRlZiBUQUlMUV9GT1JFQUNIX1JFVkVSU0UKLSN1bmRlZiBUQUlMUV9JTklUCi0jdW5kZWYgVEFJTFFfSU5TRVJUX0hFQUQKLSN1bmRlZiBUQUlMUV9JTlNFUlRfVEFJTAotI3VuZGVmIFRBSUxRX0lOU0VSVF9BRlRFUgotI3VuZGVmIFRBSUxRX0lOU0VSVF9CRUZPUkUKLSN1bmRlZiBUQUlMUV9SRU1PVkUKLSN1bmRlZiBUQUlMUV9SRVBMQUNFCi0jdW5kZWYgQ0lSQ0xFUV9IRUFECi0jdW5kZWYgQ0lSQ0xFUV9IRUFEX0lOSVRJQUxJWkVSCi0jdW5kZWYgQ0lSQ0xFUV9FTlRSWQotI3VuZGVmIENJUkNMRVFfRklSU1QKLSN1bmRlZiBDSVJDTEVRX0xBU1QKLSN1bmRlZiBDSVJDTEVRX0VORAotI3VuZGVmIENJUkNMRVFfTkVYVAotI3VuZGVmIENJUkNMRVFfUFJFVgotI3VuZGVmIENJUkNMRVFfRU1QVFkKLSN1bmRlZiBDSVJDTEVRX0ZPUkVBQ0gKLSN1bmRlZiBDSVJDTEVRX0ZPUkVBQ0hfUkVWRVJTRQotI3VuZGVmIENJUkNMRVFfSU5JVAotI3VuZGVmIENJUkNMRVFfSU5TRVJUX0FGVEVSCi0jdW5kZWYgQ0lSQ0xFUV9JTlNFUlRfQkVGT1JFCi0jdW5kZWYgQ0lSQ0xFUV9JTlNFUlRfSEVBRAotI3VuZGVmIENJUkNMRVFfSU5TRVJUX1RBSUwKLSN1bmRlZiBDSVJDTEVRX1JFTU9WRQotI3VuZGVmIENJUkNMRVFfUkVQTEFDRQotCi0vKgotICogVGhpcyBmaWxlIGRlZmluZXMgZml2ZSB0eXBlcyBvZiBkYXRhIHN0cnVjdHVyZXM6IHNpbmdseS1saW5rZWQgbGlzdHMsIAotICogbGlzdHMsIHNpbXBsZSBxdWV1ZXMsIHRhaWwgcXVldWVzLCBhbmQgY2lyY3VsYXIgcXVldWVzLgotICoKLSAqCi0gKiBBIHNpbmdseS1saW5rZWQgbGlzdCBpcyBoZWFkZWQgYnkgYSBzaW5nbGUgZm9yd2FyZCBwb2ludGVyLiBUaGUgZWxlbWVudHMKLSAqIGFyZSBzaW5nbHkgbGlua2VkIGZvciBtaW5pbXVtIHNwYWNlIGFuZCBwb2ludGVyIG1hbmlwdWxhdGlvbiBvdmVyaGVhZCBhdAotICogdGhlIGV4cGVuc2Ugb2YgTyhuKSByZW1vdmFsIGZvciBhcmJpdHJhcnkgZWxlbWVudHMuIE5ldyBlbGVtZW50cyBjYW4gYmUKLSAqIGFkZGVkIHRvIHRoZSBsaXN0IGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQgb3IgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCi0gKiBFbGVtZW50cyBiZWluZyByZW1vdmVkIGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpc3Qgc2hvdWxkIHVzZSB0aGUgZXhwbGljaXQKLSAqIG1hY3JvIGZvciB0aGlzIHB1cnBvc2UgZm9yIG9wdGltdW0gZWZmaWNpZW5jeS4gQSBzaW5nbHktbGlua2VkIGxpc3QgbWF5Ci0gKiBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uICBTaW5nbHktbGlua2VkIGxpc3RzIGFyZSBpZGVhbAotICogZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxhcmdlIGRhdGFzZXRzIGFuZCBmZXcgb3Igbm8gcmVtb3ZhbHMgb3IgZm9yCi0gKiBpbXBsZW1lbnRpbmcgYSBMSUZPIHF1ZXVlLgotICoKLSAqIEEgbGlzdCBpcyBoZWFkZWQgYnkgYSBzaW5nbGUgZm9yd2FyZCBwb2ludGVyIChvciBhbiBhcnJheSBvZiBmb3J3YXJkCi0gKiBwb2ludGVycyBmb3IgYSBoYXNoIHRhYmxlIGhlYWRlcikuIFRoZSBlbGVtZW50cyBhcmUgZG91Ymx5IGxpbmtlZAotICogc28gdGhhdCBhbiBhcmJpdHJhcnkgZWxlbWVudCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IGEgbmVlZCB0bwotICogdHJhdmVyc2UgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlCi0gKiBvciBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50IG9yIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LiBBIGxpc3QKLSAqIG1heSBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCi0gKgotICogQSBzaW1wbGUgcXVldWUgaXMgaGVhZGVkIGJ5IGEgcGFpciBvZiBwb2ludGVycywgb25lIHRoZSBoZWFkIG9mIHRoZQotICogbGlzdCBhbmQgdGhlIG90aGVyIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LiBUaGUgZWxlbWVudHMgYXJlIHNpbmdseQotICogbGlua2VkIHRvIHNhdmUgc3BhY2UsIHNvIGVsZW1lbnRzIGNhbiBvbmx5IGJlIHJlbW92ZWQgZnJvbSB0aGUKLSAqIGhlYWQgb2YgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlIG9yIGFmdGVyCi0gKiBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlIGVuZCBvZiB0aGUKLSAqIGxpc3QuIEEgc2ltcGxlIHF1ZXVlIG1heSBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCi0gKgotICogQSB0YWlsIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0byB0aGUgaGVhZCBvZiB0aGUKLSAqIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkKLSAqIGxpbmtlZCBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCi0gKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUgb3IKLSAqIGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQsIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBvciBhdCB0aGUgZW5kIG9mCi0gKiB0aGUgbGlzdC4gQSB0YWlsIHF1ZXVlIG1heSBiZSB0cmF2ZXJzZWQgaW4gZWl0aGVyIGRpcmVjdGlvbi4KLSAqCi0gKiBBIGNpcmNsZSBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdG8gdGhlIGhlYWQgb2YgdGhlCi0gKiBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUgZG91Ymx5Ci0gKiBsaW5rZWQgc28gdGhhdCBhbiBhcmJpdHJhcnkgZWxlbWVudCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IGEgbmVlZCB0bwotICogdHJhdmVyc2UgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlIG9yIGFmdGVyCi0gKiBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAqIEEgY2lyY2xlIHF1ZXVlIG1heSBiZSB0cmF2ZXJzZWQgaW4gZWl0aGVyIGRpcmVjdGlvbiwgYnV0IGhhcyBhIG1vcmUKLSAqIGNvbXBsZXggZW5kIG9mIGxpc3QgZGV0ZWN0aW9uLgotICoKLSAqIEZvciBkZXRhaWxzIG9uIHRoZSB1c2Ugb2YgdGhlc2UgbWFjcm9zLCBzZWUgdGhlIHF1ZXVlKDMpIG1hbnVhbCBwYWdlLgotICovCi0KLSNpZiBkZWZpbmVkKFFVRVVFX01BQ1JPX0RFQlVHKSB8fCAoZGVmaW5lZChfS0VSTkVMKSAmJiBkZWZpbmVkKERJQUdOT1NUSUMpKQotI2RlZmluZSBfUV9JTlZBTElEQVRFKGEpIChhKSA9ICgodm9pZCAqKS0xKQotI2Vsc2UKLSNkZWZpbmUgX1FfSU5WQUxJREFURShhKQotI2VuZGlmCi0KLS8qCi0gKiBTaW5nbHktbGlua2VkIExpc3QgZGVmaW5pdGlvbnMuCi0gKi8KLSNkZWZpbmUgU0xJU1RfSEVBRChuYW1lLCB0eXBlKQkJCQkJCVwKLXN0cnVjdCBuYW1lIHsJCQkJCQkJCVwKLQlzdHJ1Y3QgdHlwZSAqc2xoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAotfQotIAotI2RlZmluZQlTTElTVF9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCi0JeyBOVUxMIH0KLSAKLSNkZWZpbmUgU0xJU1RfRU5UUlkodHlwZSkJCQkJCQlcCi1zdHJ1Y3QgewkJCQkJCQkJXAotCXN0cnVjdCB0eXBlICpzbGVfbmV4dDsJLyogbmV4dCBlbGVtZW50ICovCQkJXAotfQotIAotLyoKLSAqIFNpbmdseS1saW5rZWQgTGlzdCBhY2Nlc3MgbWV0aG9kcy4KLSAqLwotI2RlZmluZQlTTElTVF9GSVJTVChoZWFkKQkoKGhlYWQpLT5zbGhfZmlyc3QpCi0jZGVmaW5lCVNMSVNUX0VORChoZWFkKQkJTlVMTAotI2RlZmluZQlTTElTVF9FTVBUWShoZWFkKQkoU0xJU1RfRklSU1QoaGVhZCkgPT0gU0xJU1RfRU5EKGhlYWQpKQotI2RlZmluZQlTTElTVF9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuc2xlX25leHQpCi0KLSNkZWZpbmUJU0xJU1RfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAotCWZvcigodmFyKSA9IFNMSVNUX0ZJUlNUKGhlYWQpOwkJCQkJXAotCSAgICAodmFyKSAhPSBTTElTVF9FTkQoaGVhZCk7CQkJCQlcCi0JICAgICh2YXIpID0gU0xJU1RfTkVYVCh2YXIsIGZpZWxkKSkKLQotI2RlZmluZQlTTElTVF9GT1JFQUNIX1BSRVZQVFIodmFyLCB2YXJwLCBoZWFkLCBmaWVsZCkJCQlcCi0JZm9yICgodmFycCkgPSAmU0xJU1RfRklSU1QoKGhlYWQpKTsJCQkJXAotCSAgICAoKHZhcikgPSAqKHZhcnApKSAhPSBTTElTVF9FTkQoaGVhZCk7CQkJXAotCSAgICAodmFycCkgPSAmU0xJU1RfTkVYVCgodmFyKSwgZmllbGQpKQotCi0vKgotICogU2luZ2x5LWxpbmtlZCBMaXN0IGZ1bmN0aW9ucy4KLSAqLwotI2RlZmluZQlTTElTVF9JTklUKGhlYWQpIHsJCQkJCQlcCi0JU0xJU1RfRklSU1QoaGVhZCkgPSBTTElTVF9FTkQoaGVhZCk7CQkJCVwKLX0KLQotI2RlZmluZQlTTElTVF9JTlNFUlRfQUZURVIoc2xpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCi0JKGVsbSktPmZpZWxkLnNsZV9uZXh0ID0gKHNsaXN0ZWxtKS0+ZmllbGQuc2xlX25leHQ7CQlcCi0JKHNsaXN0ZWxtKS0+ZmllbGQuc2xlX25leHQgPSAoZWxtKTsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZQlTTElTVF9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAotCShlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChoZWFkKS0+c2xoX2ZpcnN0OwkJCVwKLQkoaGVhZCktPnNsaF9maXJzdCA9IChlbG0pOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZQlTTElTVF9SRU1PVkVfTkVYVChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAotCShlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChlbG0pLT5maWVsZC5zbGVfbmV4dC0+ZmllbGQuc2xlX25leHQ7CVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUJU0xJU1RfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpIGRvIHsJCQkJXAotCShoZWFkKS0+c2xoX2ZpcnN0ID0gKGhlYWQpLT5zbGhfZmlyc3QtPmZpZWxkLnNsZV9uZXh0OwkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTTElTVF9SRU1PVkUoaGVhZCwgZWxtLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKLQlpZiAoKGhlYWQpLT5zbGhfZmlyc3QgPT0gKGVsbSkpIHsJCQkJXAotCQlTTElTVF9SRU1PVkVfSEVBRCgoaGVhZCksIGZpZWxkKTsJCQlcCi0JfSBlbHNlIHsJCQkJCQkJXAotCQlzdHJ1Y3QgdHlwZSAqY3VyZWxtID0gKGhlYWQpLT5zbGhfZmlyc3Q7CQlcCi0JCQkJCQkJCQlcCi0JCXdoaWxlIChjdXJlbG0tPmZpZWxkLnNsZV9uZXh0ICE9IChlbG0pKQkJCVwKLQkJCWN1cmVsbSA9IGN1cmVsbS0+ZmllbGQuc2xlX25leHQ7CQlcCi0JCWN1cmVsbS0+ZmllbGQuc2xlX25leHQgPQkJCQlcCi0JCSAgICBjdXJlbG0tPmZpZWxkLnNsZV9uZXh0LT5maWVsZC5zbGVfbmV4dDsJCVwKLQkJX1FfSU5WQUxJREFURSgoZWxtKS0+ZmllbGQuc2xlX25leHQpOwkJCVwKLQl9CQkJCQkJCQlcCi19IHdoaWxlICgwKQotCi0vKgotICogTGlzdCBkZWZpbml0aW9ucy4KLSAqLwotI2RlZmluZSBMSVNUX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCi1zdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCi0Jc3RydWN0IHR5cGUgKmxoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAotfQotCi0jZGVmaW5lIExJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAotCXsgTlVMTCB9Ci0KLSNkZWZpbmUgTElTVF9FTlRSWSh0eXBlKQkJCQkJCVwKLXN0cnVjdCB7CQkJCQkJCQlcCi0Jc3RydWN0IHR5cGUgKmxlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKLQlzdHJ1Y3QgdHlwZSAqKmxlX3ByZXY7CS8qIGFkZHJlc3Mgb2YgcHJldmlvdXMgbmV4dCBlbGVtZW50ICovCVwKLX0KLQotLyoKLSAqIExpc3QgYWNjZXNzIG1ldGhvZHMKLSAqLwotI2RlZmluZQlMSVNUX0ZJUlNUKGhlYWQpCQkoKGhlYWQpLT5saF9maXJzdCkKLSNkZWZpbmUJTElTVF9FTkQoaGVhZCkJCQlOVUxMCi0jZGVmaW5lCUxJU1RfRU1QVFkoaGVhZCkJCShMSVNUX0ZJUlNUKGhlYWQpID09IExJU1RfRU5EKGhlYWQpKQotI2RlZmluZQlMSVNUX05FWFQoZWxtLCBmaWVsZCkJCSgoZWxtKS0+ZmllbGQubGVfbmV4dCkKLQotI2RlZmluZSBMSVNUX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJCVwKLQlmb3IoKHZhcikgPSBMSVNUX0ZJUlNUKGhlYWQpOwkJCQkJXAotCSAgICAodmFyKSE9IExJU1RfRU5EKGhlYWQpOwkJCQkJXAotCSAgICAodmFyKSA9IExJU1RfTkVYVCh2YXIsIGZpZWxkKSkKLQotLyoKLSAqIExpc3QgZnVuY3Rpb25zLgotICovCi0jZGVmaW5lCUxJU1RfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAotCUxJU1RfRklSU1QoaGVhZCkgPSBMSVNUX0VORChoZWFkKTsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBMSVNUX0lOU0VSVF9BRlRFUihsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAotCWlmICgoKGVsbSktPmZpZWxkLmxlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLmxlX25leHQpICE9IE5VTEwpCVwKLQkJKGxpc3RlbG0pLT5maWVsZC5sZV9uZXh0LT5maWVsZC5sZV9wcmV2ID0JCVwKLQkJICAgICYoZWxtKS0+ZmllbGQubGVfbmV4dDsJCQkJXAotCShsaXN0ZWxtKS0+ZmllbGQubGVfbmV4dCA9IChlbG0pOwkJCQlcCi0JKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAmKGxpc3RlbG0pLT5maWVsZC5sZV9uZXh0OwkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZQlMSVNUX0lOU0VSVF9CRUZPUkUobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKLQkoZWxtKS0+ZmllbGQubGVfcHJldiA9IChsaXN0ZWxtKS0+ZmllbGQubGVfcHJldjsJCVwKLQkoZWxtKS0+ZmllbGQubGVfbmV4dCA9IChsaXN0ZWxtKTsJCQkJXAotCSoobGlzdGVsbSktPmZpZWxkLmxlX3ByZXYgPSAoZWxtKTsJCQkJXAotCShsaXN0ZWxtKS0+ZmllbGQubGVfcHJldiA9ICYoZWxtKS0+ZmllbGQubGVfbmV4dDsJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgTElTVF9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKLQlpZiAoKChlbG0pLT5maWVsZC5sZV9uZXh0ID0gKGhlYWQpLT5saF9maXJzdCkgIT0gTlVMTCkJCVwKLQkJKGhlYWQpLT5saF9maXJzdC0+ZmllbGQubGVfcHJldiA9ICYoZWxtKS0+ZmllbGQubGVfbmV4dDtcCi0JKGhlYWQpLT5saF9maXJzdCA9IChlbG0pOwkJCQkJXAotCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gJihoZWFkKS0+bGhfZmlyc3Q7CQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBMSVNUX1JFTU9WRShlbG0sIGZpZWxkKSBkbyB7CQkJCQlcCi0JaWYgKChlbG0pLT5maWVsZC5sZV9uZXh0ICE9IE5VTEwpCQkJCVwKLQkJKGVsbSktPmZpZWxkLmxlX25leHQtPmZpZWxkLmxlX3ByZXYgPQkJCVwKLQkJICAgIChlbG0pLT5maWVsZC5sZV9wcmV2OwkJCQlcCi0JKihlbG0pLT5maWVsZC5sZV9wcmV2ID0gKGVsbSktPmZpZWxkLmxlX25leHQ7CQkJXAotCV9RX0lOVkFMSURBVEUoKGVsbSktPmZpZWxkLmxlX3ByZXYpOwkJCQlcCi0JX1FfSU5WQUxJREFURSgoZWxtKS0+ZmllbGQubGVfbmV4dCk7CQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgTElTVF9SRVBMQUNFKGVsbSwgZWxtMiwgZmllbGQpIGRvIHsJCQkJXAotCWlmICgoKGVsbTIpLT5maWVsZC5sZV9uZXh0ID0gKGVsbSktPmZpZWxkLmxlX25leHQpICE9IE5VTEwpCVwKLQkJKGVsbTIpLT5maWVsZC5sZV9uZXh0LT5maWVsZC5sZV9wcmV2ID0JCQlcCi0JCSAgICAmKGVsbTIpLT5maWVsZC5sZV9uZXh0OwkJCQlcCi0JKGVsbTIpLT5maWVsZC5sZV9wcmV2ID0gKGVsbSktPmZpZWxkLmxlX3ByZXY7CQkJXAotCSooZWxtMiktPmZpZWxkLmxlX3ByZXYgPSAoZWxtMik7CQkJCVwKLQlfUV9JTlZBTElEQVRFKChlbG0pLT5maWVsZC5sZV9wcmV2KTsJCQkJXAotCV9RX0lOVkFMSURBVEUoKGVsbSktPmZpZWxkLmxlX25leHQpOwkJCQlcCi19IHdoaWxlICgwKQotCi0vKgotICogU2ltcGxlIHF1ZXVlIGRlZmluaXRpb25zLgotICovCi0jZGVmaW5lIFNJTVBMRVFfSEVBRChuYW1lLCB0eXBlKQkJCQkJXAotc3RydWN0IG5hbWUgewkJCQkJCQkJXAotCXN0cnVjdCB0eXBlICpzcWhfZmlyc3Q7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCi0Jc3RydWN0IHR5cGUgKipzcWhfbGFzdDsJLyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwkJXAotfQotCi0jZGVmaW5lIFNJTVBMRVFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAotCXsgTlVMTCwgJihoZWFkKS5zcWhfZmlyc3QgfQotCi0jZGVmaW5lIFNJTVBMRVFfRU5UUlkodHlwZSkJCQkJCQlcCi1zdHJ1Y3QgewkJCQkJCQkJXAotCXN0cnVjdCB0eXBlICpzcWVfbmV4dDsJLyogbmV4dCBlbGVtZW50ICovCQkJXAotfQotCi0vKgotICogU2ltcGxlIHF1ZXVlIGFjY2VzcyBtZXRob2RzLgotICovCi0jZGVmaW5lCVNJTVBMRVFfRklSU1QoaGVhZCkJICAgICgoaGVhZCktPnNxaF9maXJzdCkKLSNkZWZpbmUJU0lNUExFUV9FTkQoaGVhZCkJICAgIE5VTEwKLSNkZWZpbmUJU0lNUExFUV9FTVBUWShoZWFkKQkgICAgKFNJTVBMRVFfRklSU1QoaGVhZCkgPT0gU0lNUExFUV9FTkQoaGVhZCkpCi0jZGVmaW5lCVNJTVBMRVFfTkVYVChlbG0sIGZpZWxkKSAgICAoKGVsbSktPmZpZWxkLnNxZV9uZXh0KQotCi0jZGVmaW5lIFNJTVBMRVFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQlcCi0JZm9yKCh2YXIpID0gU0lNUExFUV9GSVJTVChoZWFkKTsJCQkJXAotCSAgICAodmFyKSAhPSBTSU1QTEVRX0VORChoZWFkKTsJCQkJCVwKLQkgICAgKHZhcikgPSBTSU1QTEVRX05FWFQodmFyLCBmaWVsZCkpCi0KLS8qCi0gKiBTaW1wbGUgcXVldWUgZnVuY3Rpb25zLgotICovCi0jZGVmaW5lCVNJTVBMRVFfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAotCShoZWFkKS0+c3FoX2ZpcnN0ID0gTlVMTDsJCQkJCVwKLQkoaGVhZCktPnNxaF9sYXN0ID0gJihoZWFkKS0+c3FoX2ZpcnN0OwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNJTVBMRVFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKLQlpZiAoKChlbG0pLT5maWVsZC5zcWVfbmV4dCA9IChoZWFkKS0+c3FoX2ZpcnN0KSA9PSBOVUxMKQlcCi0JCShoZWFkKS0+c3FoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnNxZV9uZXh0OwkJXAotCShoZWFkKS0+c3FoX2ZpcnN0ID0gKGVsbSk7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNJTVBMRVFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKLQkoZWxtKS0+ZmllbGQuc3FlX25leHQgPSBOVUxMOwkJCQkJXAotCSooaGVhZCktPnNxaF9sYXN0ID0gKGVsbSk7CQkJCQlcCi0JKGhlYWQpLT5zcWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3FlX25leHQ7CQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTSU1QTEVRX0lOU0VSVF9BRlRFUihoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCi0JaWYgKCgoZWxtKS0+ZmllbGQuc3FlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLnNxZV9uZXh0KSA9PSBOVUxMKVwKLQkJKGhlYWQpLT5zcWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3FlX25leHQ7CQlcCi0JKGxpc3RlbG0pLT5maWVsZC5zcWVfbmV4dCA9IChlbG0pOwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNJTVBMRVFfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpIGRvIHsJCQlcCi0JaWYgKCgoaGVhZCktPnNxaF9maXJzdCA9IChoZWFkKS0+c3FoX2ZpcnN0LT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTCkgXAotCQkoaGVhZCktPnNxaF9sYXN0ID0gJihoZWFkKS0+c3FoX2ZpcnN0OwkJCVwKLX0gd2hpbGUgKDApCi0KLS8qCi0gKiBUYWlsIHF1ZXVlIGRlZmluaXRpb25zLgotICovCi0jZGVmaW5lIFRBSUxRX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCi1zdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCi0Jc3RydWN0IHR5cGUgKnRxaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKLQlzdHJ1Y3QgdHlwZSAqKnRxaF9sYXN0OwkvKiBhZGRyIG9mIGxhc3QgbmV4dCBlbGVtZW50ICovCQlcCi19Ci0KLSNkZWZpbmUgVEFJTFFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAotCXsgTlVMTCwgJihoZWFkKS50cWhfZmlyc3QgfQotCi0jZGVmaW5lIFRBSUxRX0VOVFJZKHR5cGUpCQkJCQkJXAotc3RydWN0IHsJCQkJCQkJCVwKLQlzdHJ1Y3QgdHlwZSAqdHFlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKLQlzdHJ1Y3QgdHlwZSAqKnRxZV9wcmV2OwkvKiBhZGRyZXNzIG9mIHByZXZpb3VzIG5leHQgZWxlbWVudCAqLwlcCi19Ci0KLS8qIAotICogdGFpbCBxdWV1ZSBhY2Nlc3MgbWV0aG9kcyAKLSAqLwotI2RlZmluZQlUQUlMUV9GSVJTVChoZWFkKQkJKChoZWFkKS0+dHFoX2ZpcnN0KQotI2RlZmluZQlUQUlMUV9FTkQoaGVhZCkJCQlOVUxMCi0jZGVmaW5lCVRBSUxRX05FWFQoZWxtLCBmaWVsZCkJCSgoZWxtKS0+ZmllbGQudHFlX25leHQpCi0jZGVmaW5lIFRBSUxRX0xBU1QoaGVhZCwgaGVhZG5hbWUpCQkJCQlcCi0JKCooKChzdHJ1Y3QgaGVhZG5hbWUgKikoKGhlYWQpLT50cWhfbGFzdCkpLT50cWhfbGFzdCkpCi0vKiBYWFggKi8KLSNkZWZpbmUgVEFJTFFfUFJFVihlbG0sIGhlYWRuYW1lLCBmaWVsZCkJCQkJXAotCSgqKCgoc3RydWN0IGhlYWRuYW1lICopKChlbG0pLT5maWVsZC50cWVfcHJldikpLT50cWhfbGFzdCkpCi0jZGVmaW5lCVRBSUxRX0VNUFRZKGhlYWQpCQkJCQkJXAotCShUQUlMUV9GSVJTVChoZWFkKSA9PSBUQUlMUV9FTkQoaGVhZCkpCi0KLSNkZWZpbmUgVEFJTFFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAotCWZvcigodmFyKSA9IFRBSUxRX0ZJUlNUKGhlYWQpOwkJCQkJXAotCSAgICAodmFyKSAhPSBUQUlMUV9FTkQoaGVhZCk7CQkJCQlcCi0JICAgICh2YXIpID0gVEFJTFFfTkVYVCh2YXIsIGZpZWxkKSkKLQotI2RlZmluZSBUQUlMUV9GT1JFQUNIX1JFVkVSU0UodmFyLCBoZWFkLCBoZWFkbmFtZSwgZmllbGQpCQlcCi0JZm9yKCh2YXIpID0gVEFJTFFfTEFTVChoZWFkLCBoZWFkbmFtZSk7CQkJCVwKLQkgICAgKHZhcikgIT0gVEFJTFFfRU5EKGhlYWQpOwkJCQkJXAotCSAgICAodmFyKSA9IFRBSUxRX1BSRVYodmFyLCBoZWFkbmFtZSwgZmllbGQpKQotCi0vKgotICogVGFpbCBxdWV1ZSBmdW5jdGlvbnMuCi0gKi8KLSNkZWZpbmUJVEFJTFFfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAotCShoZWFkKS0+dHFoX2ZpcnN0ID0gTlVMTDsJCQkJCVwKLQkoaGVhZCktPnRxaF9sYXN0ID0gJihoZWFkKS0+dHFoX2ZpcnN0OwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRBSUxRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCi0JaWYgKCgoZWxtKS0+ZmllbGQudHFlX25leHQgPSAoaGVhZCktPnRxaF9maXJzdCkgIT0gTlVMTCkJXAotCQkoaGVhZCktPnRxaF9maXJzdC0+ZmllbGQudHFlX3ByZXYgPQkJCVwKLQkJICAgICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJCVwKLQllbHNlCQkJCQkJCQlcCi0JCShoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJXAotCShoZWFkKS0+dHFoX2ZpcnN0ID0gKGVsbSk7CQkJCQlcCi0JKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJihoZWFkKS0+dHFoX2ZpcnN0OwkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVEFJTFFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKLQkoZWxtKS0+ZmllbGQudHFlX25leHQgPSBOVUxMOwkJCQkJXAotCShlbG0pLT5maWVsZC50cWVfcHJldiA9IChoZWFkKS0+dHFoX2xhc3Q7CQkJXAotCSooaGVhZCktPnRxaF9sYXN0ID0gKGVsbSk7CQkJCQlcCi0JKGhlYWQpLT50cWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBUQUlMUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAotCWlmICgoKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC50cWVfbmV4dCkgIT0gTlVMTClcCi0JCShlbG0pLT5maWVsZC50cWVfbmV4dC0+ZmllbGQudHFlX3ByZXYgPQkJCVwKLQkJICAgICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJCVwKLQllbHNlCQkJCQkJCQlcCi0JCShoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJXAotCShsaXN0ZWxtKS0+ZmllbGQudHFlX25leHQgPSAoZWxtKTsJCQkJXAotCShlbG0pLT5maWVsZC50cWVfcHJldiA9ICYobGlzdGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZQlUQUlMUV9JTlNFUlRfQkVGT1JFKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCi0JKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldjsJCVwKLQkoZWxtKS0+ZmllbGQudHFlX25leHQgPSAobGlzdGVsbSk7CQkJCVwKLQkqKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldiA9IChlbG0pOwkJCQlcCi0JKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldiA9ICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRBSUxRX1JFTU9WRShoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKLQlpZiAoKChlbG0pLT5maWVsZC50cWVfbmV4dCkgIT0gTlVMTCkJCQkJXAotCQkoZWxtKS0+ZmllbGQudHFlX25leHQtPmZpZWxkLnRxZV9wcmV2ID0JCQlcCi0JCSAgICAoZWxtKS0+ZmllbGQudHFlX3ByZXY7CQkJCVwKLQllbHNlCQkJCQkJCQlcCi0JCShoZWFkKS0+dHFoX2xhc3QgPSAoZWxtKS0+ZmllbGQudHFlX3ByZXY7CQlcCi0JKihlbG0pLT5maWVsZC50cWVfcHJldiA9IChlbG0pLT5maWVsZC50cWVfbmV4dDsJCQlcCi0JX1FfSU5WQUxJREFURSgoZWxtKS0+ZmllbGQudHFlX3ByZXYpOwkJCQlcCi0JX1FfSU5WQUxJREFURSgoZWxtKS0+ZmllbGQudHFlX25leHQpOwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRBSUxRX1JFUExBQ0UoaGVhZCwgZWxtLCBlbG0yLCBmaWVsZCkgZG8gewkJCVwKLQlpZiAoKChlbG0yKS0+ZmllbGQudHFlX25leHQgPSAoZWxtKS0+ZmllbGQudHFlX25leHQpICE9IE5VTEwpCVwKLQkJKGVsbTIpLT5maWVsZC50cWVfbmV4dC0+ZmllbGQudHFlX3ByZXYgPQkJXAotCQkgICAgJihlbG0yKS0+ZmllbGQudHFlX25leHQ7CQkJCVwKLQllbHNlCQkJCQkJCQlcCi0JCShoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbTIpLT5maWVsZC50cWVfbmV4dDsJCVwKLQkoZWxtMiktPmZpZWxkLnRxZV9wcmV2ID0gKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJCVwKLQkqKGVsbTIpLT5maWVsZC50cWVfcHJldiA9IChlbG0yKTsJCQkJXAotCV9RX0lOVkFMSURBVEUoKGVsbSktPmZpZWxkLnRxZV9wcmV2KTsJCQkJXAotCV9RX0lOVkFMSURBVEUoKGVsbSktPmZpZWxkLnRxZV9uZXh0KTsJCQkJXAotfSB3aGlsZSAoMCkKLQotLyoKLSAqIENpcmN1bGFyIHF1ZXVlIGRlZmluaXRpb25zLgotICovCi0jZGVmaW5lIENJUkNMRVFfSEVBRChuYW1lLCB0eXBlKQkJCQkJXAotc3RydWN0IG5hbWUgewkJCQkJCQkJXAotCXN0cnVjdCB0eXBlICpjcWhfZmlyc3Q7CQkvKiBmaXJzdCBlbGVtZW50ICovCQlcCi0Jc3RydWN0IHR5cGUgKmNxaF9sYXN0OwkJLyogbGFzdCBlbGVtZW50ICovCQlcCi19Ci0KLSNkZWZpbmUgQ0lSQ0xFUV9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCi0JeyBDSVJDTEVRX0VORCgmaGVhZCksIENJUkNMRVFfRU5EKCZoZWFkKSB9Ci0KLSNkZWZpbmUgQ0lSQ0xFUV9FTlRSWSh0eXBlKQkJCQkJCVwKLXN0cnVjdCB7CQkJCQkJCQlcCi0Jc3RydWN0IHR5cGUgKmNxZV9uZXh0OwkJLyogbmV4dCBlbGVtZW50ICovCQlcCi0Jc3RydWN0IHR5cGUgKmNxZV9wcmV2OwkJLyogcHJldmlvdXMgZWxlbWVudCAqLwkJXAotfQotCi0vKgotICogQ2lyY3VsYXIgcXVldWUgYWNjZXNzIG1ldGhvZHMgCi0gKi8KLSNkZWZpbmUJQ0lSQ0xFUV9GSVJTVChoZWFkKQkJKChoZWFkKS0+Y3FoX2ZpcnN0KQotI2RlZmluZQlDSVJDTEVRX0xBU1QoaGVhZCkJCSgoaGVhZCktPmNxaF9sYXN0KQotI2RlZmluZQlDSVJDTEVRX0VORChoZWFkKQkJKCh2b2lkICopKGhlYWQpKQotI2RlZmluZQlDSVJDTEVRX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5jcWVfbmV4dCkKLSNkZWZpbmUJQ0lSQ0xFUV9QUkVWKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuY3FlX3ByZXYpCi0jZGVmaW5lCUNJUkNMRVFfRU1QVFkoaGVhZCkJCQkJCQlcCi0JKENJUkNMRVFfRklSU1QoaGVhZCkgPT0gQ0lSQ0xFUV9FTkQoaGVhZCkpCi0KLSNkZWZpbmUgQ0lSQ0xFUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCVwKLQlmb3IoKHZhcikgPSBDSVJDTEVRX0ZJUlNUKGhlYWQpOwkJCQlcCi0JICAgICh2YXIpICE9IENJUkNMRVFfRU5EKGhlYWQpOwkJCQkJXAotCSAgICAodmFyKSA9IENJUkNMRVFfTkVYVCh2YXIsIGZpZWxkKSkKLQotI2RlZmluZSBDSVJDTEVRX0ZPUkVBQ0hfUkVWRVJTRSh2YXIsIGhlYWQsIGZpZWxkKQkJCVwKLQlmb3IoKHZhcikgPSBDSVJDTEVRX0xBU1QoaGVhZCk7CQkJCQlcCi0JICAgICh2YXIpICE9IENJUkNMRVFfRU5EKGhlYWQpOwkJCQkJXAotCSAgICAodmFyKSA9IENJUkNMRVFfUFJFVih2YXIsIGZpZWxkKSkKLQotLyoKLSAqIENpcmN1bGFyIHF1ZXVlIGZ1bmN0aW9ucy4KLSAqLwotI2RlZmluZQlDSVJDTEVRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKLQkoaGVhZCktPmNxaF9maXJzdCA9IENJUkNMRVFfRU5EKGhlYWQpOwkJCQlcCi0JKGhlYWQpLT5jcWhfbGFzdCA9IENJUkNMRVFfRU5EKGhlYWQpOwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIENJUkNMRVFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKLQkoZWxtKS0+ZmllbGQuY3FlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0OwkJXAotCShlbG0pLT5maWVsZC5jcWVfcHJldiA9IChsaXN0ZWxtKTsJCQkJXAotCWlmICgobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0ID09IENJUkNMRVFfRU5EKGhlYWQpKQkJXAotCQkoaGVhZCktPmNxaF9sYXN0ID0gKGVsbSk7CQkJCVwKLQllbHNlCQkJCQkJCQlcCi0JCShsaXN0ZWxtKS0+ZmllbGQuY3FlX25leHQtPmZpZWxkLmNxZV9wcmV2ID0gKGVsbSk7CVwKLQkobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGVsbSk7CQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0lSQ0xFUV9JTlNFUlRfQkVGT1JFKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKLQkoZWxtKS0+ZmllbGQuY3FlX25leHQgPSAobGlzdGVsbSk7CQkJCVwKLQkoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2OwkJXAotCWlmICgobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2ID09IENJUkNMRVFfRU5EKGhlYWQpKQkJXAotCQkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pOwkJCQlcCi0JZWxzZQkJCQkJCQkJXAotCQkobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2LT5maWVsZC5jcWVfbmV4dCA9IChlbG0pOwlcCi0JKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldiA9IChlbG0pOwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIENJUkNMRVFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKLQkoZWxtKS0+ZmllbGQuY3FlX25leHQgPSAoaGVhZCktPmNxaF9maXJzdDsJCQlcCi0JKGVsbSktPmZpZWxkLmNxZV9wcmV2ID0gQ0lSQ0xFUV9FTkQoaGVhZCk7CQkJXAotCWlmICgoaGVhZCktPmNxaF9sYXN0ID09IENJUkNMRVFfRU5EKGhlYWQpKQkJCVwKLQkJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pOwkJCQlcCi0JZWxzZQkJCQkJCQkJXAotCQkoaGVhZCktPmNxaF9maXJzdC0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtKTsJCVwKLQkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDSVJDTEVRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCi0JKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gQ0lSQ0xFUV9FTkQoaGVhZCk7CQkJXAotCShlbG0pLT5maWVsZC5jcWVfcHJldiA9IChoZWFkKS0+Y3FoX2xhc3Q7CQkJXAotCWlmICgoaGVhZCktPmNxaF9maXJzdCA9PSBDSVJDTEVRX0VORChoZWFkKSkJCQlcCi0JCShoZWFkKS0+Y3FoX2ZpcnN0ID0gKGVsbSk7CQkJCVwKLQllbHNlCQkJCQkJCQlcCi0JCShoZWFkKS0+Y3FoX2xhc3QtPmZpZWxkLmNxZV9uZXh0ID0gKGVsbSk7CQlcCi0JKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZQlDSVJDTEVRX1JFTU9WRShoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKLQlpZiAoKGVsbSktPmZpZWxkLmNxZV9uZXh0ID09IENJUkNMRVFfRU5EKGhlYWQpKQkJCVwKLQkJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pLT5maWVsZC5jcWVfcHJldjsJCVwKLQllbHNlCQkJCQkJCQlcCi0JCShlbG0pLT5maWVsZC5jcWVfbmV4dC0+ZmllbGQuY3FlX3ByZXYgPQkJCVwKLQkJICAgIChlbG0pLT5maWVsZC5jcWVfcHJldjsJCQkJXAotCWlmICgoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPT0gQ0lSQ0xFUV9FTkQoaGVhZCkpCQkJXAotCQkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pLT5maWVsZC5jcWVfbmV4dDsJCVwKLQllbHNlCQkJCQkJCQlcCi0JCShlbG0pLT5maWVsZC5jcWVfcHJldi0+ZmllbGQuY3FlX25leHQgPQkJCVwKLQkJICAgIChlbG0pLT5maWVsZC5jcWVfbmV4dDsJCQkJXAotCV9RX0lOVkFMSURBVEUoKGVsbSktPmZpZWxkLmNxZV9wcmV2KTsJCQkJXAotCV9RX0lOVkFMSURBVEUoKGVsbSktPmZpZWxkLmNxZV9uZXh0KTsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDSVJDTEVRX1JFUExBQ0UoaGVhZCwgZWxtLCBlbG0yLCBmaWVsZCkgZG8gewkJCVwKLQlpZiAoKChlbG0yKS0+ZmllbGQuY3FlX25leHQgPSAoZWxtKS0+ZmllbGQuY3FlX25leHQpID09CQlcCi0JICAgIENJUkNMRVFfRU5EKGhlYWQpKQkJCQkJCVwKLQkJKGhlYWQpLmNxaF9sYXN0ID0gKGVsbTIpOwkJCQlcCi0JZWxzZQkJCQkJCQkJXAotCQkoZWxtMiktPmZpZWxkLmNxZV9uZXh0LT5maWVsZC5jcWVfcHJldiA9IChlbG0yKTsJXAotCWlmICgoKGVsbTIpLT5maWVsZC5jcWVfcHJldiA9IChlbG0pLT5maWVsZC5jcWVfcHJldikgPT0JCVwKLQkgICAgQ0lSQ0xFUV9FTkQoaGVhZCkpCQkJCQkJXAotCQkoaGVhZCkuY3FoX2ZpcnN0ID0gKGVsbTIpOwkJCQlcCi0JZWxzZQkJCQkJCQkJXAotCQkoZWxtMiktPmZpZWxkLmNxZV9wcmV2LT5maWVsZC5jcWVfbmV4dCA9IChlbG0yKTsJXAotCV9RX0lOVkFMSURBVEUoKGVsbSktPmZpZWxkLmNxZV9wcmV2KTsJCQkJXAotCV9RX0lOVkFMSURBVEUoKGVsbSktPmZpZWxkLmNxZV9uZXh0KTsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2VuZGlmCS8qICFfRkFLRV9RVUVVRV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzZC1jb21wYXQvc3lzLXRyZWUuaCBiL29wZW5ic2QtY29tcGF0L3N5cy10cmVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTQ5YjUuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvc3lzLXRyZWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3OSArMCwwIEBACi0vKgkkT3BlbkJTRDogdHJlZS5oLHYgMS4xMCAyMDA3LzEwLzI5IDIzOjQ5OjQxIGRqbSBFeHAgJAkqLwotLyoKLSAqIENvcHlyaWdodCAyMDAyIE5pZWxzIFByb3ZvcyA8cHJvdm9zQGNpdGkudW1pY2guZWR1PgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogc3lzL3N5cy90cmVlLmggKi8KLQotI2lmbmRlZglfU1lTX1RSRUVfSF8KLSNkZWZpbmUJX1NZU19UUkVFX0hfCi0KLS8qCi0gKiBUaGlzIGZpbGUgZGVmaW5lcyBkYXRhIHN0cnVjdHVyZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiB0cmVlczoKLSAqIHNwbGF5IHRyZWVzIGFuZCByZWQtYmxhY2sgdHJlZXMuCi0gKgotICogQSBzcGxheSB0cmVlIGlzIGEgc2VsZi1vcmdhbml6aW5nIGRhdGEgc3RydWN0dXJlLiAgRXZlcnkgb3BlcmF0aW9uCi0gKiBvbiB0aGUgdHJlZSBjYXVzZXMgYSBzcGxheSB0byBoYXBwZW4uICBUaGUgc3BsYXkgbW92ZXMgdGhlIHJlcXVlc3RlZAotICogbm9kZSB0byB0aGUgcm9vdCBvZiB0aGUgdHJlZSBhbmQgcGFydGx5IHJlYmFsYW5jZXMgaXQuCi0gKgotICogVGhpcyBoYXMgdGhlIGJlbmVmaXQgdGhhdCByZXF1ZXN0IGxvY2FsaXR5IGNhdXNlcyBmYXN0ZXIgbG9va3VwcyBhcwotICogdGhlIHJlcXVlc3RlZCBub2RlcyBtb3ZlIHRvIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBPbiB0aGUgb3RoZXIgaGFuZCwKLSAqIGV2ZXJ5IGxvb2t1cCBjYXVzZXMgbWVtb3J5IHdyaXRlcy4KLSAqCi0gKiBUaGUgQmFsYW5jZSBUaGVvcmVtIGJvdW5kcyB0aGUgdG90YWwgYWNjZXNzIHRpbWUgZm9yIG0gb3BlcmF0aW9ucwotICogYW5kIG4gaW5zZXJ0cyBvbiBhbiBpbml0aWFsbHkgZW1wdHkgdHJlZSBhcyBPKChtICsgbilsZyBuKS4gIFRoZQotICogYW1vcnRpemVkIGNvc3QgZm9yIGEgc2VxdWVuY2Ugb2YgbSBhY2Nlc3NlcyB0byBhIHNwbGF5IHRyZWUgaXMgTyhsZyBuKTsKLSAqCi0gKiBBIHJlZC1ibGFjayB0cmVlIGlzIGEgYmluYXJ5IHNlYXJjaCB0cmVlIHdpdGggdGhlIG5vZGUgY29sb3IgYXMgYW4KLSAqIGV4dHJhIGF0dHJpYnV0ZS4gIEl0IGZ1bGZpbGxzIGEgc2V0IG9mIGNvbmRpdGlvbnM6Ci0gKgktIGV2ZXJ5IHNlYXJjaCBwYXRoIGZyb20gdGhlIHJvb3QgdG8gYSBsZWFmIGNvbnNpc3RzIG9mIHRoZQotICoJICBzYW1lIG51bWJlciBvZiBibGFjayBub2RlcywKLSAqCS0gZWFjaCByZWQgbm9kZSAoZXhjZXB0IGZvciB0aGUgcm9vdCkgaGFzIGEgYmxhY2sgcGFyZW50LAotICoJLSBlYWNoIGxlYWYgbm9kZSBpcyBibGFjay4KLSAqCi0gKiBFdmVyeSBvcGVyYXRpb24gb24gYSByZWQtYmxhY2sgdHJlZSBpcyBib3VuZGVkIGFzIE8obGcgbikuCi0gKiBUaGUgbWF4aW11bSBoZWlnaHQgb2YgYSByZWQtYmxhY2sgdHJlZSBpcyAybGcgKG4rMSkuCi0gKi8KLQotI2RlZmluZSBTUExBWV9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAotc3RydWN0IG5hbWUgewkJCQkJCQkJXAotCXN0cnVjdCB0eXBlICpzcGhfcm9vdDsgLyogcm9vdCBvZiB0aGUgdHJlZSAqLwkJCVwKLX0KLQotI2RlZmluZSBTUExBWV9JTklUSUFMSVpFUihyb290KQkJCQkJCVwKLQl7IE5VTEwgfQotCi0jZGVmaW5lIFNQTEFZX0lOSVQocm9vdCkgZG8gewkJCQkJCVwKLQkocm9vdCktPnNwaF9yb290ID0gTlVMTDsJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgU1BMQVlfRU5UUlkodHlwZSkJCQkJCQlcCi1zdHJ1Y3QgewkJCQkJCQkJXAotCXN0cnVjdCB0eXBlICpzcGVfbGVmdDsgLyogbGVmdCBlbGVtZW50ICovCQkJXAotCXN0cnVjdCB0eXBlICpzcGVfcmlnaHQ7IC8qIHJpZ2h0IGVsZW1lbnQgKi8JCQlcCi19Ci0KLSNkZWZpbmUgU1BMQVlfTEVGVChlbG0sIGZpZWxkKQkJKGVsbSktPmZpZWxkLnNwZV9sZWZ0Ci0jZGVmaW5lIFNQTEFZX1JJR0hUKGVsbSwgZmllbGQpCQkoZWxtKS0+ZmllbGQuc3BlX3JpZ2h0Ci0jZGVmaW5lIFNQTEFZX1JPT1QoaGVhZCkJCShoZWFkKS0+c3BoX3Jvb3QKLSNkZWZpbmUgU1BMQVlfRU1QVFkoaGVhZCkJCShTUExBWV9ST09UKGhlYWQpID09IE5VTEwpCi0KLS8qIFNQTEFZX1JPVEFURV97TEVGVCxSSUdIVH0gZXhwZWN0IHRoYXQgdG1wIGhvbGQgU1BMQVlfe1JJR0hULExFRlR9ICovCi0jZGVmaW5lIFNQTEFZX1JPVEFURV9SSUdIVChoZWFkLCB0bXAsIGZpZWxkKSBkbyB7CQkJXAotCVNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID0gU1BMQVlfUklHSFQodG1wLCBmaWVsZCk7CVwKLQlTUExBWV9SSUdIVCh0bXAsIGZpZWxkKSA9IChoZWFkKS0+c3BoX3Jvb3Q7CQkJXAotCShoZWFkKS0+c3BoX3Jvb3QgPSB0bXA7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQkKLSNkZWZpbmUgU1BMQVlfUk9UQVRFX0xFRlQoaGVhZCwgdG1wLCBmaWVsZCkgZG8gewkJCVwKLQlTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPSBTUExBWV9MRUZUKHRtcCwgZmllbGQpOwlcCi0JU1BMQVlfTEVGVCh0bXAsIGZpZWxkKSA9IChoZWFkKS0+c3BoX3Jvb3Q7CQkJXAotCShoZWFkKS0+c3BoX3Jvb3QgPSB0bXA7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTUExBWV9MSU5LTEVGVChoZWFkLCB0bXAsIGZpZWxkKSBkbyB7CQkJCVwKLQlTUExBWV9MRUZUKHRtcCwgZmllbGQpID0gKGhlYWQpLT5zcGhfcm9vdDsJCQlcCi0JdG1wID0gKGhlYWQpLT5zcGhfcm9vdDsJCQkJCQlcCi0JKGhlYWQpLT5zcGhfcm9vdCA9IFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOwkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTUExBWV9MSU5LUklHSFQoaGVhZCwgdG1wLCBmaWVsZCkgZG8gewkJCQlcCi0JU1BMQVlfUklHSFQodG1wLCBmaWVsZCkgPSAoaGVhZCktPnNwaF9yb290OwkJCVwKLQl0bXAgPSAoaGVhZCktPnNwaF9yb290OwkJCQkJCVwKLQkoaGVhZCktPnNwaF9yb290ID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOwlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNQTEFZX0FTU0VNQkxFKGhlYWQsIG5vZGUsIGxlZnQsIHJpZ2h0LCBmaWVsZCkgZG8gewkJXAotCVNQTEFZX1JJR0hUKGxlZnQsIGZpZWxkKSA9IFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOwlcCi0JU1BMQVlfTEVGVChyaWdodCwgZmllbGQpID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpO1wKLQlTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IFNQTEFZX1JJR0hUKG5vZGUsIGZpZWxkKTsJXAotCVNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IFNQTEFZX0xFRlQobm9kZSwgZmllbGQpOwlcCi19IHdoaWxlICgwKQotCi0vKiBHZW5lcmF0ZXMgcHJvdG90eXBlcyBhbmQgaW5saW5lIGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIFNQTEFZX1BST1RPVFlQRShuYW1lLCB0eXBlLCBmaWVsZCwgY21wKQkJCQlcCi12b2lkIG5hbWUjI19TUExBWShzdHJ1Y3QgbmFtZSAqLCBzdHJ1Y3QgdHlwZSAqKTsJCQlcCi12b2lkIG5hbWUjI19TUExBWV9NSU5NQVgoc3RydWN0IG5hbWUgKiwgaW50KTsJCQkJXAotc3RydWN0IHR5cGUgKm5hbWUjI19TUExBWV9JTlNFUlQoc3RydWN0IG5hbWUgKiwgc3RydWN0IHR5cGUgKik7CQlcCi1zdHJ1Y3QgdHlwZSAqbmFtZSMjX1NQTEFZX1JFTU9WRShzdHJ1Y3QgbmFtZSAqLCBzdHJ1Y3QgdHlwZSAqKTsJCVwKLQkJCQkJCQkJCVwKLS8qIEZpbmRzIHRoZSBub2RlIHdpdGggdGhlIHNhbWUga2V5IGFzIGVsbSAqLwkJCQlcCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IHR5cGUgKgkJCQkJCVwKLW5hbWUjI19TUExBWV9GSU5EKHN0cnVjdCBuYW1lICpoZWFkLCBzdHJ1Y3QgdHlwZSAqZWxtKQkJCVwKLXsJCQkJCQkJCQlcCi0JaWYgKFNQTEFZX0VNUFRZKGhlYWQpKQkJCQkJCVwKLQkJcmV0dXJuKE5VTEwpOwkJCQkJCVwKLQluYW1lIyNfU1BMQVkoaGVhZCwgZWxtKTsJCQkJCVwKLQlpZiAoKGNtcCkoZWxtLCAoaGVhZCktPnNwaF9yb290KSA9PSAwKQkJCQlcCi0JCXJldHVybiAoaGVhZC0+c3BoX3Jvb3QpOwkJCQlcCi0JcmV0dXJuIChOVUxMKTsJCQkJCQkJXAotfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgdHlwZSAqCQkJCQkJXAotbmFtZSMjX1NQTEFZX05FWFQoc3RydWN0IG5hbWUgKmhlYWQsIHN0cnVjdCB0eXBlICplbG0pCQkJXAotewkJCQkJCQkJCVwKLQluYW1lIyNfU1BMQVkoaGVhZCwgZWxtKTsJCQkJCVwKLQlpZiAoU1BMQVlfUklHSFQoZWxtLCBmaWVsZCkgIT0gTlVMTCkgewkJCQlcCi0JCWVsbSA9IFNQTEFZX1JJR0hUKGVsbSwgZmllbGQpOwkJCQlcCi0JCXdoaWxlIChTUExBWV9MRUZUKGVsbSwgZmllbGQpICE9IE5VTEwpIHsJCVwKLQkJCWVsbSA9IFNQTEFZX0xFRlQoZWxtLCBmaWVsZCk7CQkJXAotCQl9CQkJCQkJCVwKLQl9IGVsc2UJCQkJCQkJCVwKLQkJZWxtID0gTlVMTDsJCQkJCQlcCi0JcmV0dXJuIChlbG0pOwkJCQkJCQlcCi19CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotc3RhdGljIF9faW5saW5lIHN0cnVjdCB0eXBlICoJCQkJCQlcCi1uYW1lIyNfU1BMQVlfTUlOX01BWChzdHJ1Y3QgbmFtZSAqaGVhZCwgaW50IHZhbCkJCQlcCi17CQkJCQkJCQkJXAotCW5hbWUjI19TUExBWV9NSU5NQVgoaGVhZCwgdmFsKTsJCQkJCVwKLSAgICAgICAgcmV0dXJuIChTUExBWV9ST09UKGhlYWQpKTsJCQkJCVwKLX0KLQotLyogTWFpbiBzcGxheSBvcGVyYXRpb24uCi0gKiBNb3ZlcyBub2RlIGNsb3NlIHRvIHRoZSBrZXkgb2YgZWxtIHRvIHRvcAotICovCi0jZGVmaW5lIFNQTEFZX0dFTkVSQVRFKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXApCQkJCVwKLXN0cnVjdCB0eXBlICoJCQkJCQkJCVwKLW5hbWUjI19TUExBWV9JTlNFUlQoc3RydWN0IG5hbWUgKmhlYWQsIHN0cnVjdCB0eXBlICplbG0pCQlcCi17CQkJCQkJCQkJXAotICAgIGlmIChTUExBWV9FTVBUWShoZWFkKSkgewkJCQkJCVwKLQkgICAgU1BMQVlfTEVGVChlbG0sIGZpZWxkKSA9IFNQTEFZX1JJR0hUKGVsbSwgZmllbGQpID0gTlVMTDsJXAotICAgIH0gZWxzZSB7CQkJCQkJCQlcCi0JICAgIGludCBfX2NvbXA7CQkJCQkJCVwKLQkgICAgbmFtZSMjX1NQTEFZKGhlYWQsIGVsbSk7CQkJCQlcCi0JICAgIF9fY29tcCA9IChjbXApKGVsbSwgKGhlYWQpLT5zcGhfcm9vdCk7CQkJXAotCSAgICBpZihfX2NvbXAgPCAwKSB7CQkJCQkJXAotCQkgICAgU1BMQVlfTEVGVChlbG0sIGZpZWxkKSA9IFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpO1wKLQkJICAgIFNQTEFZX1JJR0hUKGVsbSwgZmllbGQpID0gKGhlYWQpLT5zcGhfcm9vdDsJCVwKLQkJICAgIFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID0gTlVMTDsJCVwKLQkgICAgfSBlbHNlIGlmIChfX2NvbXAgPiAwKSB7CQkJCQlcCi0JCSAgICBTUExBWV9SSUdIVChlbG0sIGZpZWxkKSA9IFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTtcCi0JCSAgICBTUExBWV9MRUZUKGVsbSwgZmllbGQpID0gKGhlYWQpLT5zcGhfcm9vdDsJCVwKLQkJICAgIFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IE5VTEw7CVwKLQkgICAgfSBlbHNlCQkJCQkJCVwKLQkJICAgIHJldHVybiAoKGhlYWQpLT5zcGhfcm9vdCk7CQkJCVwKLSAgICB9CQkJCQkJCQkJXAotICAgIChoZWFkKS0+c3BoX3Jvb3QgPSAoZWxtKTsJCQkJCQlcCi0gICAgcmV0dXJuIChOVUxMKTsJCQkJCQkJXAotfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLXN0cnVjdCB0eXBlICoJCQkJCQkJCVwKLW5hbWUjI19TUExBWV9SRU1PVkUoc3RydWN0IG5hbWUgKmhlYWQsIHN0cnVjdCB0eXBlICplbG0pCQlcCi17CQkJCQkJCQkJXAotCXN0cnVjdCB0eXBlICpfX3RtcDsJCQkJCQlcCi0JaWYgKFNQTEFZX0VNUFRZKGhlYWQpKQkJCQkJCVwKLQkJcmV0dXJuIChOVUxMKTsJCQkJCQlcCi0JbmFtZSMjX1NQTEFZKGhlYWQsIGVsbSk7CQkJCQlcCi0JaWYgKChjbXApKGVsbSwgKGhlYWQpLT5zcGhfcm9vdCkgPT0gMCkgewkJCVwKLQkJaWYgKFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID09IE5VTEwpIHsJXAotCQkJKGhlYWQpLT5zcGhfcm9vdCA9IFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTtcCi0JCX0gZWxzZSB7CQkJCQkJXAotCQkJX190bXAgPSBTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7CVwKLQkJCShoZWFkKS0+c3BoX3Jvb3QgPSBTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTtcCi0JCQluYW1lIyNfU1BMQVkoaGVhZCwgZWxtKTsJCQlcCi0JCQlTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPSBfX3RtcDsJXAotCQl9CQkJCQkJCVwKLQkJcmV0dXJuIChlbG0pOwkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JcmV0dXJuIChOVUxMKTsJCQkJCQkJXAotfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLXZvaWQJCQkJCQkJCQlcCi1uYW1lIyNfU1BMQVkoc3RydWN0IG5hbWUgKmhlYWQsIHN0cnVjdCB0eXBlICplbG0pCQkJXAotewkJCQkJCQkJCVwKLQlzdHJ1Y3QgdHlwZSBfX25vZGUsICpfX2xlZnQsICpfX3JpZ2h0LCAqX190bXA7CQkJXAotCWludCBfX2NvbXA7CQkJCQkJCVwKLVwKLQlTUExBWV9MRUZUKCZfX25vZGUsIGZpZWxkKSA9IFNQTEFZX1JJR0hUKCZfX25vZGUsIGZpZWxkKSA9IE5VTEw7XAotCV9fbGVmdCA9IF9fcmlnaHQgPSAmX19ub2RlOwkJCQkJXAotXAotCXdoaWxlICgoX19jb21wID0gKGNtcCkoZWxtLCAoaGVhZCktPnNwaF9yb290KSkpIHsJCVwKLQkJaWYgKF9fY29tcCA8IDApIHsJCQkJCVwKLQkJCV9fdG1wID0gU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7CVwKLQkJCWlmIChfX3RtcCA9PSBOVUxMKQkJCQlcCi0JCQkJYnJlYWs7CQkJCQlcCi0JCQlpZiAoKGNtcCkoZWxtLCBfX3RtcCkgPCAwKXsJCQlcCi0JCQkJU1BMQVlfUk9UQVRFX1JJR0hUKGhlYWQsIF9fdG1wLCBmaWVsZCk7CVwKLQkJCQlpZiAoU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPT0gTlVMTClcCi0JCQkJCWJyZWFrOwkJCQlcCi0JCQl9CQkJCQkJXAotCQkJU1BMQVlfTElOS0xFRlQoaGVhZCwgX19yaWdodCwgZmllbGQpOwkJXAotCQl9IGVsc2UgaWYgKF9fY29tcCA+IDApIHsJCQkJXAotCQkJX190bXAgPSBTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7CVwKLQkJCWlmIChfX3RtcCA9PSBOVUxMKQkJCQlcCi0JCQkJYnJlYWs7CQkJCQlcCi0JCQlpZiAoKGNtcCkoZWxtLCBfX3RtcCkgPiAwKXsJCQlcCi0JCQkJU1BMQVlfUk9UQVRFX0xFRlQoaGVhZCwgX190bXAsIGZpZWxkKTsJXAotCQkJCWlmIChTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPT0gTlVMTClcCi0JCQkJCWJyZWFrOwkJCQlcCi0JCQl9CQkJCQkJXAotCQkJU1BMQVlfTElOS1JJR0hUKGhlYWQsIF9fbGVmdCwgZmllbGQpOwkJXAotCQl9CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JU1BMQVlfQVNTRU1CTEUoaGVhZCwgJl9fbm9kZSwgX19sZWZ0LCBfX3JpZ2h0LCBmaWVsZCk7CQlcCi19CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotLyogU3BsYXkgd2l0aCBlaXRoZXIgdGhlIG1pbmltdW0gb3IgdGhlIG1heGltdW0gZWxlbWVudAkJCVwKLSAqIFVzZWQgdG8gZmluZCBtaW5pbXVtIG9yIG1heGltdW0gZWxlbWVudCBpbiB0cmVlLgkJCVwKLSAqLwkJCQkJCQkJCVwKLXZvaWQgbmFtZSMjX1NQTEFZX01JTk1BWChzdHJ1Y3QgbmFtZSAqaGVhZCwgaW50IF9fY29tcCkgXAotewkJCQkJCQkJCVwKLQlzdHJ1Y3QgdHlwZSBfX25vZGUsICpfX2xlZnQsICpfX3JpZ2h0LCAqX190bXA7CQkJXAotXAotCVNQTEFZX0xFRlQoJl9fbm9kZSwgZmllbGQpID0gU1BMQVlfUklHSFQoJl9fbm9kZSwgZmllbGQpID0gTlVMTDtcCi0JX19sZWZ0ID0gX19yaWdodCA9ICZfX25vZGU7CQkJCQlcCi1cCi0Jd2hpbGUgKDEpIHsJCQkJCQkJXAotCQlpZiAoX19jb21wIDwgMCkgewkJCQkJXAotCQkJX190bXAgPSBTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTsJXAotCQkJaWYgKF9fdG1wID09IE5VTEwpCQkJCVwKLQkJCQlicmVhazsJCQkJCVwKLQkJCWlmIChfX2NvbXAgPCAwKXsJCQkJXAotCQkJCVNQTEFZX1JPVEFURV9SSUdIVChoZWFkLCBfX3RtcCwgZmllbGQpOwlcCi0JCQkJaWYgKFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID09IE5VTEwpXAotCQkJCQlicmVhazsJCQkJXAotCQkJfQkJCQkJCVwKLQkJCVNQTEFZX0xJTktMRUZUKGhlYWQsIF9fcmlnaHQsIGZpZWxkKTsJCVwKLQkJfSBlbHNlIGlmIChfX2NvbXAgPiAwKSB7CQkJCVwKLQkJCV9fdG1wID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOwlcCi0JCQlpZiAoX190bXAgPT0gTlVMTCkJCQkJXAotCQkJCWJyZWFrOwkJCQkJXAotCQkJaWYgKF9fY29tcCA+IDApIHsJCQkJXAotCQkJCVNQTEFZX1JPVEFURV9MRUZUKGhlYWQsIF9fdG1wLCBmaWVsZCk7CVwKLQkJCQlpZiAoU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID09IE5VTEwpXAotCQkJCQlicmVhazsJCQkJXAotCQkJfQkJCQkJCVwKLQkJCVNQTEFZX0xJTktSSUdIVChoZWFkLCBfX2xlZnQsIGZpZWxkKTsJCVwKLQkJfQkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCVNQTEFZX0FTU0VNQkxFKGhlYWQsICZfX25vZGUsIF9fbGVmdCwgX19yaWdodCwgZmllbGQpOwkJXAotfQotCi0jZGVmaW5lIFNQTEFZX05FR0lORgktMQotI2RlZmluZSBTUExBWV9JTkYJMQotCi0jZGVmaW5lIFNQTEFZX0lOU0VSVChuYW1lLCB4LCB5KQluYW1lIyNfU1BMQVlfSU5TRVJUKHgsIHkpCi0jZGVmaW5lIFNQTEFZX1JFTU9WRShuYW1lLCB4LCB5KQluYW1lIyNfU1BMQVlfUkVNT1ZFKHgsIHkpCi0jZGVmaW5lIFNQTEFZX0ZJTkQobmFtZSwgeCwgeSkJCW5hbWUjI19TUExBWV9GSU5EKHgsIHkpCi0jZGVmaW5lIFNQTEFZX05FWFQobmFtZSwgeCwgeSkJCW5hbWUjI19TUExBWV9ORVhUKHgsIHkpCi0jZGVmaW5lIFNQTEFZX01JTihuYW1lLCB4KQkJKFNQTEFZX0VNUFRZKHgpID8gTlVMTAlcCi0JCQkJCTogbmFtZSMjX1NQTEFZX01JTl9NQVgoeCwgU1BMQVlfTkVHSU5GKSkKLSNkZWZpbmUgU1BMQVlfTUFYKG5hbWUsIHgpCQkoU1BMQVlfRU1QVFkoeCkgPyBOVUxMCVwKLQkJCQkJOiBuYW1lIyNfU1BMQVlfTUlOX01BWCh4LCBTUExBWV9JTkYpKQotCi0jZGVmaW5lIFNQTEFZX0ZPUkVBQ0goeCwgbmFtZSwgaGVhZCkJCQkJCVwKLQlmb3IgKCh4KSA9IFNQTEFZX01JTihuYW1lLCBoZWFkKTsJCQkJXAotCSAgICAgKHgpICE9IE5VTEw7CQkJCQkJXAotCSAgICAgKHgpID0gU1BMQVlfTkVYVChuYW1lLCBoZWFkLCB4KSkKLQotLyogTWFjcm9zIHRoYXQgZGVmaW5lIGEgcmVkLWJsYWNrIHRyZWUgKi8KLSNkZWZpbmUgUkJfSEVBRChuYW1lLCB0eXBlKQkJCQkJCVwKLXN0cnVjdCBuYW1lIHsJCQkJCQkJCVwKLQlzdHJ1Y3QgdHlwZSAqcmJoX3Jvb3Q7IC8qIHJvb3Qgb2YgdGhlIHRyZWUgKi8JCQlcCi19Ci0KLSNkZWZpbmUgUkJfSU5JVElBTElaRVIocm9vdCkJCQkJCQlcCi0JeyBOVUxMIH0KLQotI2RlZmluZSBSQl9JTklUKHJvb3QpIGRvIHsJCQkJCQlcCi0JKHJvb3QpLT5yYmhfcm9vdCA9IE5VTEw7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFJCX0JMQUNLCTAKLSNkZWZpbmUgUkJfUkVECQkxCi0jZGVmaW5lIFJCX0VOVFJZKHR5cGUpCQkJCQkJCVwKLXN0cnVjdCB7CQkJCQkJCQlcCi0Jc3RydWN0IHR5cGUgKnJiZV9sZWZ0OwkJLyogbGVmdCBlbGVtZW50ICovCQlcCi0Jc3RydWN0IHR5cGUgKnJiZV9yaWdodDsJCS8qIHJpZ2h0IGVsZW1lbnQgKi8JCVwKLQlzdHJ1Y3QgdHlwZSAqcmJlX3BhcmVudDsJLyogcGFyZW50IGVsZW1lbnQgKi8JCVwKLQlpbnQgcmJlX2NvbG9yOwkJCS8qIG5vZGUgY29sb3IgKi8JCVwKLX0KLQotI2RlZmluZSBSQl9MRUZUKGVsbSwgZmllbGQpCQkoZWxtKS0+ZmllbGQucmJlX2xlZnQKLSNkZWZpbmUgUkJfUklHSFQoZWxtLCBmaWVsZCkJCShlbG0pLT5maWVsZC5yYmVfcmlnaHQKLSNkZWZpbmUgUkJfUEFSRU5UKGVsbSwgZmllbGQpCQkoZWxtKS0+ZmllbGQucmJlX3BhcmVudAotI2RlZmluZSBSQl9DT0xPUihlbG0sIGZpZWxkKQkJKGVsbSktPmZpZWxkLnJiZV9jb2xvcgotI2RlZmluZSBSQl9ST09UKGhlYWQpCQkJKGhlYWQpLT5yYmhfcm9vdAotI2RlZmluZSBSQl9FTVBUWShoZWFkKQkJCShSQl9ST09UKGhlYWQpID09IE5VTEwpCi0KLSNkZWZpbmUgUkJfU0VUKGVsbSwgcGFyZW50LCBmaWVsZCkgZG8gewkJCQkJXAotCVJCX1BBUkVOVChlbG0sIGZpZWxkKSA9IHBhcmVudDsJCQkJCVwKLQlSQl9MRUZUKGVsbSwgZmllbGQpID0gUkJfUklHSFQoZWxtLCBmaWVsZCkgPSBOVUxMOwkJXAotCVJCX0NPTE9SKGVsbSwgZmllbGQpID0gUkJfUkVEOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBSQl9TRVRfQkxBQ0tSRUQoYmxhY2ssIHJlZCwgZmllbGQpIGRvIHsJCQkJXAotCVJCX0NPTE9SKGJsYWNrLCBmaWVsZCkgPSBSQl9CTEFDSzsJCQkJXAotCVJCX0NPTE9SKHJlZCwgZmllbGQpID0gUkJfUkVEOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2lmbmRlZiBSQl9BVUdNRU5UCi0jZGVmaW5lIFJCX0FVR01FTlQoeCkKLSNlbmRpZgotCi0jZGVmaW5lIFJCX1JPVEFURV9MRUZUKGhlYWQsIGVsbSwgdG1wLCBmaWVsZCkgZG8gewkJCVwKLQkodG1wKSA9IFJCX1JJR0hUKGVsbSwgZmllbGQpOwkJCQkJXAotCWlmICgoUkJfUklHSFQoZWxtLCBmaWVsZCkgPSBSQl9MRUZUKHRtcCwgZmllbGQpKSkgewkJXAotCQlSQl9QQVJFTlQoUkJfTEVGVCh0bXAsIGZpZWxkKSwgZmllbGQpID0gKGVsbSk7CQlcCi0JfQkJCQkJCQkJXAotCVJCX0FVR01FTlQoZWxtKTsJCQkJCQlcCi0JaWYgKChSQl9QQVJFTlQodG1wLCBmaWVsZCkgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCkpKSB7CQlcCi0JCWlmICgoZWxtKSA9PSBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKQlcCi0JCQlSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpID0gKHRtcCk7CVwKLQkJZWxzZQkJCQkJCQlcCi0JCQlSQl9SSUdIVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSA9ICh0bXApOwlcCi0JfSBlbHNlCQkJCQkJCQlcCi0JCShoZWFkKS0+cmJoX3Jvb3QgPSAodG1wKTsJCQkJXAotCVJCX0xFRlQodG1wLCBmaWVsZCkgPSAoZWxtKTsJCQkJCVwKLQlSQl9QQVJFTlQoZWxtLCBmaWVsZCkgPSAodG1wKTsJCQkJCVwKLQlSQl9BVUdNRU5UKHRtcCk7CQkJCQkJXAotCWlmICgoUkJfUEFSRU5UKHRtcCwgZmllbGQpKSkJCQkJCVwKLQkJUkJfQVVHTUVOVChSQl9QQVJFTlQodG1wLCBmaWVsZCkpOwkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgUkJfUk9UQVRFX1JJR0hUKGhlYWQsIGVsbSwgdG1wLCBmaWVsZCkgZG8gewkJCVwKLQkodG1wKSA9IFJCX0xFRlQoZWxtLCBmaWVsZCk7CQkJCQlcCi0JaWYgKChSQl9MRUZUKGVsbSwgZmllbGQpID0gUkJfUklHSFQodG1wLCBmaWVsZCkpKSB7CQlcCi0JCVJCX1BBUkVOVChSQl9SSUdIVCh0bXAsIGZpZWxkKSwgZmllbGQpID0gKGVsbSk7CQlcCi0JfQkJCQkJCQkJXAotCVJCX0FVR01FTlQoZWxtKTsJCQkJCQlcCi0JaWYgKChSQl9QQVJFTlQodG1wLCBmaWVsZCkgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCkpKSB7CQlcCi0JCWlmICgoZWxtKSA9PSBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKQlcCi0JCQlSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpID0gKHRtcCk7CVwKLQkJZWxzZQkJCQkJCQlcCi0JCQlSQl9SSUdIVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSA9ICh0bXApOwlcCi0JfSBlbHNlCQkJCQkJCQlcCi0JCShoZWFkKS0+cmJoX3Jvb3QgPSAodG1wKTsJCQkJXAotCVJCX1JJR0hUKHRtcCwgZmllbGQpID0gKGVsbSk7CQkJCQlcCi0JUkJfUEFSRU5UKGVsbSwgZmllbGQpID0gKHRtcCk7CQkJCQlcCi0JUkJfQVVHTUVOVCh0bXApOwkJCQkJCVwKLQlpZiAoKFJCX1BBUkVOVCh0bXAsIGZpZWxkKSkpCQkJCQlcCi0JCVJCX0FVR01FTlQoUkJfUEFSRU5UKHRtcCwgZmllbGQpKTsJCQlcCi19IHdoaWxlICgwKQotCi0vKiBHZW5lcmF0ZXMgcHJvdG90eXBlcyBhbmQgaW5saW5lIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBSQl9QUk9UT1RZUEUobmFtZSwgdHlwZSwgZmllbGQsIGNtcCkJCQkJXAotdm9pZCBuYW1lIyNfUkJfSU5TRVJUX0NPTE9SKHN0cnVjdCBuYW1lICosIHN0cnVjdCB0eXBlICopOwlcCi12b2lkIG5hbWUjI19SQl9SRU1PVkVfQ09MT1Ioc3RydWN0IG5hbWUgKiwgc3RydWN0IHR5cGUgKiwgc3RydWN0IHR5cGUgKik7XAotc3RydWN0IHR5cGUgKm5hbWUjI19SQl9SRU1PVkUoc3RydWN0IG5hbWUgKiwgc3RydWN0IHR5cGUgKik7CQlcCi1zdHJ1Y3QgdHlwZSAqbmFtZSMjX1JCX0lOU0VSVChzdHJ1Y3QgbmFtZSAqLCBzdHJ1Y3QgdHlwZSAqKTsJCVwKLXN0cnVjdCB0eXBlICpuYW1lIyNfUkJfRklORChzdHJ1Y3QgbmFtZSAqLCBzdHJ1Y3QgdHlwZSAqKTsJCVwKLXN0cnVjdCB0eXBlICpuYW1lIyNfUkJfTkVYVChzdHJ1Y3QgdHlwZSAqKTsJCQkJXAotc3RydWN0IHR5cGUgKm5hbWUjI19SQl9NSU5NQVgoc3RydWN0IG5hbWUgKiwgaW50KTsJCQkKLQotCi0vKiBNYWluIHJiIG9wZXJhdGlvbi4KLSAqIE1vdmVzIG5vZGUgY2xvc2UgdG8gdGhlIGtleSBvZiBlbG0gdG8gdG9wCi0gKi8KLSNkZWZpbmUgUkJfR0VORVJBVEUobmFtZSwgdHlwZSwgZmllbGQsIGNtcCkJCQkJXAotdm9pZAkJCQkJCQkJCVwKLW5hbWUjI19SQl9JTlNFUlRfQ09MT1Ioc3RydWN0IG5hbWUgKmhlYWQsIHN0cnVjdCB0eXBlICplbG0pCQlcCi17CQkJCQkJCQkJXAotCXN0cnVjdCB0eXBlICpwYXJlbnQsICpncGFyZW50LCAqdG1wOwkJCQlcCi0Jd2hpbGUgKChwYXJlbnQgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCkpICYmCQkJXAotCSAgICBSQl9DT0xPUihwYXJlbnQsIGZpZWxkKSA9PSBSQl9SRUQpIHsJCQlcCi0JCWdwYXJlbnQgPSBSQl9QQVJFTlQocGFyZW50LCBmaWVsZCk7CQkJXAotCQlpZiAocGFyZW50ID09IFJCX0xFRlQoZ3BhcmVudCwgZmllbGQpKSB7CQlcCi0JCQl0bXAgPSBSQl9SSUdIVChncGFyZW50LCBmaWVsZCk7CQkJXAotCQkJaWYgKHRtcCAmJiBSQl9DT0xPUih0bXAsIGZpZWxkKSA9PSBSQl9SRUQpIHsJXAotCQkJCVJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfQkxBQ0s7CVwKLQkJCQlSQl9TRVRfQkxBQ0tSRUQocGFyZW50LCBncGFyZW50LCBmaWVsZCk7XAotCQkJCWVsbSA9IGdwYXJlbnQ7CQkJCVwKLQkJCQljb250aW51ZTsJCQkJXAotCQkJfQkJCQkJCVwKLQkJCWlmIChSQl9SSUdIVChwYXJlbnQsIGZpZWxkKSA9PSBlbG0pIHsJCVwKLQkJCQlSQl9ST1RBVEVfTEVGVChoZWFkLCBwYXJlbnQsIHRtcCwgZmllbGQpO1wKLQkJCQl0bXAgPSBwYXJlbnQ7CQkJCVwKLQkJCQlwYXJlbnQgPSBlbG07CQkJCVwKLQkJCQllbG0gPSB0bXA7CQkJCVwKLQkJCX0JCQkJCQlcCi0JCQlSQl9TRVRfQkxBQ0tSRUQocGFyZW50LCBncGFyZW50LCBmaWVsZCk7CVwKLQkJCVJCX1JPVEFURV9SSUdIVChoZWFkLCBncGFyZW50LCB0bXAsIGZpZWxkKTsJXAotCQl9IGVsc2UgewkJCQkJCVwKLQkJCXRtcCA9IFJCX0xFRlQoZ3BhcmVudCwgZmllbGQpOwkJCVwKLQkJCWlmICh0bXAgJiYgUkJfQ09MT1IodG1wLCBmaWVsZCkgPT0gUkJfUkVEKSB7CVwKLQkJCQlSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX0JMQUNLOwlcCi0JCQkJUkJfU0VUX0JMQUNLUkVEKHBhcmVudCwgZ3BhcmVudCwgZmllbGQpO1wKLQkJCQllbG0gPSBncGFyZW50OwkJCQlcCi0JCQkJY29udGludWU7CQkJCVwKLQkJCX0JCQkJCQlcCi0JCQlpZiAoUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9PSBlbG0pIHsJCVwKLQkJCQlSQl9ST1RBVEVfUklHSFQoaGVhZCwgcGFyZW50LCB0bXAsIGZpZWxkKTtcCi0JCQkJdG1wID0gcGFyZW50OwkJCQlcCi0JCQkJcGFyZW50ID0gZWxtOwkJCQlcCi0JCQkJZWxtID0gdG1wOwkJCQlcCi0JCQl9CQkJCQkJXAotCQkJUkJfU0VUX0JMQUNLUkVEKHBhcmVudCwgZ3BhcmVudCwgZmllbGQpOwlcCi0JCQlSQl9ST1RBVEVfTEVGVChoZWFkLCBncGFyZW50LCB0bXAsIGZpZWxkKTsJXAotCQl9CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JUkJfQ09MT1IoaGVhZC0+cmJoX3Jvb3QsIGZpZWxkKSA9IFJCX0JMQUNLOwkJCVwKLX0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi12b2lkCQkJCQkJCQkJXAotbmFtZSMjX1JCX1JFTU9WRV9DT0xPUihzdHJ1Y3QgbmFtZSAqaGVhZCwgc3RydWN0IHR5cGUgKnBhcmVudCwgc3RydWN0IHR5cGUgKmVsbSkgXAotewkJCQkJCQkJCVwKLQlzdHJ1Y3QgdHlwZSAqdG1wOwkJCQkJCVwKLQl3aGlsZSAoKGVsbSA9PSBOVUxMIHx8IFJCX0NPTE9SKGVsbSwgZmllbGQpID09IFJCX0JMQUNLKSAmJglcCi0JICAgIGVsbSAhPSBSQl9ST09UKGhlYWQpKSB7CQkJCQlcCi0JCWlmIChSQl9MRUZUKHBhcmVudCwgZmllbGQpID09IGVsbSkgewkJCVwKLQkJCXRtcCA9IFJCX1JJR0hUKHBhcmVudCwgZmllbGQpOwkJCVwKLQkJCWlmIChSQl9DT0xPUih0bXAsIGZpZWxkKSA9PSBSQl9SRUQpIHsJCVwKLQkJCQlSQl9TRVRfQkxBQ0tSRUQodG1wLCBwYXJlbnQsIGZpZWxkKTsJXAotCQkJCVJCX1JPVEFURV9MRUZUKGhlYWQsIHBhcmVudCwgdG1wLCBmaWVsZCk7XAotCQkJCXRtcCA9IFJCX1JJR0hUKHBhcmVudCwgZmllbGQpOwkJXAotCQkJfQkJCQkJCVwKLQkJCWlmICgoUkJfTEVGVCh0bXAsIGZpZWxkKSA9PSBOVUxMIHx8CQlcCi0JCQkgICAgUkJfQ09MT1IoUkJfTEVGVCh0bXAsIGZpZWxkKSwgZmllbGQpID09IFJCX0JMQUNLKSAmJlwKLQkJCSAgICAoUkJfUklHSFQodG1wLCBmaWVsZCkgPT0gTlVMTCB8fAkJXAotCQkJICAgIFJCX0NPTE9SKFJCX1JJR0hUKHRtcCwgZmllbGQpLCBmaWVsZCkgPT0gUkJfQkxBQ0spKSB7XAotCQkJCVJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfUkVEOwkJXAotCQkJCWVsbSA9IHBhcmVudDsJCQkJXAotCQkJCXBhcmVudCA9IFJCX1BBUkVOVChlbG0sIGZpZWxkKTsJCVwKLQkJCX0gZWxzZSB7CQkJCQlcCi0JCQkJaWYgKFJCX1JJR0hUKHRtcCwgZmllbGQpID09IE5VTEwgfHwJXAotCQkJCSAgICBSQl9DT0xPUihSQl9SSUdIVCh0bXAsIGZpZWxkKSwgZmllbGQpID09IFJCX0JMQUNLKSB7XAotCQkJCQlzdHJ1Y3QgdHlwZSAqb2xlZnQ7CQlcCi0JCQkJCWlmICgob2xlZnQgPSBSQl9MRUZUKHRtcCwgZmllbGQpKSlcCi0JCQkJCQlSQl9DT0xPUihvbGVmdCwgZmllbGQpID0gUkJfQkxBQ0s7XAotCQkJCQlSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX1JFRDsJXAotCQkJCQlSQl9ST1RBVEVfUklHSFQoaGVhZCwgdG1wLCBvbGVmdCwgZmllbGQpO1wKLQkJCQkJdG1wID0gUkJfUklHSFQocGFyZW50LCBmaWVsZCk7CVwKLQkJCQl9CQkJCQlcCi0JCQkJUkJfQ09MT1IodG1wLCBmaWVsZCkgPSBSQl9DT0xPUihwYXJlbnQsIGZpZWxkKTtcCi0JCQkJUkJfQ09MT1IocGFyZW50LCBmaWVsZCkgPSBSQl9CTEFDSzsJXAotCQkJCWlmIChSQl9SSUdIVCh0bXAsIGZpZWxkKSkJCVwKLQkJCQkJUkJfQ09MT1IoUkJfUklHSFQodG1wLCBmaWVsZCksIGZpZWxkKSA9IFJCX0JMQUNLO1wKLQkJCQlSQl9ST1RBVEVfTEVGVChoZWFkLCBwYXJlbnQsIHRtcCwgZmllbGQpO1wKLQkJCQllbG0gPSBSQl9ST09UKGhlYWQpOwkJCVwKLQkJCQlicmVhazsJCQkJCVwKLQkJCX0JCQkJCQlcCi0JCX0gZWxzZSB7CQkJCQkJXAotCQkJdG1wID0gUkJfTEVGVChwYXJlbnQsIGZpZWxkKTsJCQlcCi0JCQlpZiAoUkJfQ09MT1IodG1wLCBmaWVsZCkgPT0gUkJfUkVEKSB7CQlcCi0JCQkJUkJfU0VUX0JMQUNLUkVEKHRtcCwgcGFyZW50LCBmaWVsZCk7CVwKLQkJCQlSQl9ST1RBVEVfUklHSFQoaGVhZCwgcGFyZW50LCB0bXAsIGZpZWxkKTtcCi0JCQkJdG1wID0gUkJfTEVGVChwYXJlbnQsIGZpZWxkKTsJCVwKLQkJCX0JCQkJCQlcCi0JCQlpZiAoKFJCX0xFRlQodG1wLCBmaWVsZCkgPT0gTlVMTCB8fAkJXAotCQkJICAgIFJCX0NPTE9SKFJCX0xFRlQodG1wLCBmaWVsZCksIGZpZWxkKSA9PSBSQl9CTEFDSykgJiZcCi0JCQkgICAgKFJCX1JJR0hUKHRtcCwgZmllbGQpID09IE5VTEwgfHwJCVwKLQkJCSAgICBSQl9DT0xPUihSQl9SSUdIVCh0bXAsIGZpZWxkKSwgZmllbGQpID09IFJCX0JMQUNLKSkge1wKLQkJCQlSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX1JFRDsJCVwKLQkJCQllbG0gPSBwYXJlbnQ7CQkJCVwKLQkJCQlwYXJlbnQgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7CQlcCi0JCQl9IGVsc2UgewkJCQkJXAotCQkJCWlmIChSQl9MRUZUKHRtcCwgZmllbGQpID09IE5VTEwgfHwJXAotCQkJCSAgICBSQl9DT0xPUihSQl9MRUZUKHRtcCwgZmllbGQpLCBmaWVsZCkgPT0gUkJfQkxBQ0spIHtcCi0JCQkJCXN0cnVjdCB0eXBlICpvcmlnaHQ7CQlcCi0JCQkJCWlmICgob3JpZ2h0ID0gUkJfUklHSFQodG1wLCBmaWVsZCkpKVwKLQkJCQkJCVJCX0NPTE9SKG9yaWdodCwgZmllbGQpID0gUkJfQkxBQ0s7XAotCQkJCQlSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX1JFRDsJXAotCQkJCQlSQl9ST1RBVEVfTEVGVChoZWFkLCB0bXAsIG9yaWdodCwgZmllbGQpO1wKLQkJCQkJdG1wID0gUkJfTEVGVChwYXJlbnQsIGZpZWxkKTsJXAotCQkJCX0JCQkJCVwKLQkJCQlSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX0NPTE9SKHBhcmVudCwgZmllbGQpO1wKLQkJCQlSQl9DT0xPUihwYXJlbnQsIGZpZWxkKSA9IFJCX0JMQUNLOwlcCi0JCQkJaWYgKFJCX0xFRlQodG1wLCBmaWVsZCkpCQlcCi0JCQkJCVJCX0NPTE9SKFJCX0xFRlQodG1wLCBmaWVsZCksIGZpZWxkKSA9IFJCX0JMQUNLO1wKLQkJCQlSQl9ST1RBVEVfUklHSFQoaGVhZCwgcGFyZW50LCB0bXAsIGZpZWxkKTtcCi0JCQkJZWxtID0gUkJfUk9PVChoZWFkKTsJCQlcCi0JCQkJYnJlYWs7CQkJCQlcCi0JCQl9CQkJCQkJXAotCQl9CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JaWYgKGVsbSkJCQkJCQkJXAotCQlSQl9DT0xPUihlbG0sIGZpZWxkKSA9IFJCX0JMQUNLOwkJCVwKLX0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi1zdHJ1Y3QgdHlwZSAqCQkJCQkJCQlcCi1uYW1lIyNfUkJfUkVNT1ZFKHN0cnVjdCBuYW1lICpoZWFkLCBzdHJ1Y3QgdHlwZSAqZWxtKQkJCVwKLXsJCQkJCQkJCQlcCi0Jc3RydWN0IHR5cGUgKmNoaWxkLCAqcGFyZW50LCAqb2xkID0gZWxtOwkJCVwKLQlpbnQgY29sb3I7CQkJCQkJCVwKLQlpZiAoUkJfTEVGVChlbG0sIGZpZWxkKSA9PSBOVUxMKQkJCQlcCi0JCWNoaWxkID0gUkJfUklHSFQoZWxtLCBmaWVsZCk7CQkJCVwKLQllbHNlIGlmIChSQl9SSUdIVChlbG0sIGZpZWxkKSA9PSBOVUxMKQkJCQlcCi0JCWNoaWxkID0gUkJfTEVGVChlbG0sIGZpZWxkKTsJCQkJXAotCWVsc2UgewkJCQkJCQkJXAotCQlzdHJ1Y3QgdHlwZSAqbGVmdDsJCQkJCVwKLQkJZWxtID0gUkJfUklHSFQoZWxtLCBmaWVsZCk7CQkJCVwKLQkJd2hpbGUgKChsZWZ0ID0gUkJfTEVGVChlbG0sIGZpZWxkKSkpCQkJXAotCQkJZWxtID0gbGVmdDsJCQkJCVwKLQkJY2hpbGQgPSBSQl9SSUdIVChlbG0sIGZpZWxkKTsJCQkJXAotCQlwYXJlbnQgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7CQkJCVwKLQkJY29sb3IgPSBSQl9DT0xPUihlbG0sIGZpZWxkKTsJCQkJXAotCQlpZiAoY2hpbGQpCQkJCQkJXAotCQkJUkJfUEFSRU5UKGNoaWxkLCBmaWVsZCkgPSBwYXJlbnQ7CQlcCi0JCWlmIChwYXJlbnQpIHsJCQkJCQlcCi0JCQlpZiAoUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9PSBlbG0pCQlcCi0JCQkJUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOwkJXAotCQkJZWxzZQkJCQkJCVwKLQkJCQlSQl9SSUdIVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOwlcCi0JCQlSQl9BVUdNRU5UKHBhcmVudCk7CQkJCVwKLQkJfSBlbHNlCQkJCQkJCVwKLQkJCVJCX1JPT1QoaGVhZCkgPSBjaGlsZDsJCQkJXAotCQlpZiAoUkJfUEFSRU5UKGVsbSwgZmllbGQpID09IG9sZCkJCQlcCi0JCQlwYXJlbnQgPSBlbG07CQkJCQlcCi0JCShlbG0pLT5maWVsZCA9IChvbGQpLT5maWVsZDsJCQkJXAotCQlpZiAoUkJfUEFSRU5UKG9sZCwgZmllbGQpKSB7CQkJCVwKLQkJCWlmIChSQl9MRUZUKFJCX1BBUkVOVChvbGQsIGZpZWxkKSwgZmllbGQpID09IG9sZClcCi0JCQkJUkJfTEVGVChSQl9QQVJFTlQob2xkLCBmaWVsZCksIGZpZWxkKSA9IGVsbTtcCi0JCQllbHNlCQkJCQkJXAotCQkJCVJCX1JJR0hUKFJCX1BBUkVOVChvbGQsIGZpZWxkKSwgZmllbGQpID0gZWxtO1wKLQkJCVJCX0FVR01FTlQoUkJfUEFSRU5UKG9sZCwgZmllbGQpKTsJCVwKLQkJfSBlbHNlCQkJCQkJCVwKLQkJCVJCX1JPT1QoaGVhZCkgPSBlbG07CQkJCVwKLQkJUkJfUEFSRU5UKFJCX0xFRlQob2xkLCBmaWVsZCksIGZpZWxkKSA9IGVsbTsJCVwKLQkJaWYgKFJCX1JJR0hUKG9sZCwgZmllbGQpKQkJCQlcCi0JCQlSQl9QQVJFTlQoUkJfUklHSFQob2xkLCBmaWVsZCksIGZpZWxkKSA9IGVsbTsJXAotCQlpZiAocGFyZW50KSB7CQkJCQkJXAotCQkJbGVmdCA9IHBhcmVudDsJCQkJCVwKLQkJCWRvIHsJCQkJCQlcCi0JCQkJUkJfQVVHTUVOVChsZWZ0KTsJCQlcCi0JCQl9IHdoaWxlICgobGVmdCA9IFJCX1BBUkVOVChsZWZ0LCBmaWVsZCkpKTsJXAotCQl9CQkJCQkJCVwKLQkJZ290byBjb2xvcjsJCQkJCQlcCi0JfQkJCQkJCQkJXAotCXBhcmVudCA9IFJCX1BBUkVOVChlbG0sIGZpZWxkKTsJCQkJCVwKLQljb2xvciA9IFJCX0NPTE9SKGVsbSwgZmllbGQpOwkJCQkJXAotCWlmIChjaGlsZCkJCQkJCQkJXAotCQlSQl9QQVJFTlQoY2hpbGQsIGZpZWxkKSA9IHBhcmVudDsJCQlcCi0JaWYgKHBhcmVudCkgewkJCQkJCQlcCi0JCWlmIChSQl9MRUZUKHBhcmVudCwgZmllbGQpID09IGVsbSkJCQlcCi0JCQlSQl9MRUZUKHBhcmVudCwgZmllbGQpID0gY2hpbGQ7CQkJXAotCQllbHNlCQkJCQkJCVwKLQkJCVJCX1JJR0hUKHBhcmVudCwgZmllbGQpID0gY2hpbGQ7CQlcCi0JCVJCX0FVR01FTlQocGFyZW50KTsJCQkJCVwKLQl9IGVsc2UJCQkJCQkJCVwKLQkJUkJfUk9PVChoZWFkKSA9IGNoaWxkOwkJCQkJXAotY29sb3I6CQkJCQkJCQkJXAotCWlmIChjb2xvciA9PSBSQl9CTEFDSykJCQkJCQlcCi0JCW5hbWUjI19SQl9SRU1PVkVfQ09MT1IoaGVhZCwgcGFyZW50LCBjaGlsZCk7CQlcCi0JcmV0dXJuIChvbGQpOwkJCQkJCQlcCi19CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotLyogSW5zZXJ0cyBhIG5vZGUgaW50byB0aGUgUkIgdHJlZSAqLwkJCQkJXAotc3RydWN0IHR5cGUgKgkJCQkJCQkJXAotbmFtZSMjX1JCX0lOU0VSVChzdHJ1Y3QgbmFtZSAqaGVhZCwgc3RydWN0IHR5cGUgKmVsbSkJCQlcCi17CQkJCQkJCQkJXAotCXN0cnVjdCB0eXBlICp0bXA7CQkJCQkJXAotCXN0cnVjdCB0eXBlICpwYXJlbnQgPSBOVUxMOwkJCQkJXAotCWludCBjb21wID0gMDsJCQkJCQkJXAotCXRtcCA9IFJCX1JPT1QoaGVhZCk7CQkJCQkJXAotCXdoaWxlICh0bXApIHsJCQkJCQkJXAotCQlwYXJlbnQgPSB0bXA7CQkJCQkJXAotCQljb21wID0gKGNtcCkoZWxtLCBwYXJlbnQpOwkJCQlcCi0JCWlmIChjb21wIDwgMCkJCQkJCQlcCi0JCQl0bXAgPSBSQl9MRUZUKHRtcCwgZmllbGQpOwkJCVwKLQkJZWxzZSBpZiAoY29tcCA+IDApCQkJCQlcCi0JCQl0bXAgPSBSQl9SSUdIVCh0bXAsIGZpZWxkKTsJCQlcCi0JCWVsc2UJCQkJCQkJXAotCQkJcmV0dXJuICh0bXApOwkJCQkJXAotCX0JCQkJCQkJCVwKLQlSQl9TRVQoZWxtLCBwYXJlbnQsIGZpZWxkKTsJCQkJCVwKLQlpZiAocGFyZW50ICE9IE5VTEwpIHsJCQkJCQlcCi0JCWlmIChjb21wIDwgMCkJCQkJCQlcCi0JCQlSQl9MRUZUKHBhcmVudCwgZmllbGQpID0gZWxtOwkJCVwKLQkJZWxzZQkJCQkJCQlcCi0JCQlSQl9SSUdIVChwYXJlbnQsIGZpZWxkKSA9IGVsbTsJCQlcCi0JCVJCX0FVR01FTlQocGFyZW50KTsJCQkJCVwKLQl9IGVsc2UJCQkJCQkJCVwKLQkJUkJfUk9PVChoZWFkKSA9IGVsbTsJCQkJCVwKLQluYW1lIyNfUkJfSU5TRVJUX0NPTE9SKGhlYWQsIGVsbSk7CQkJCVwKLQlyZXR1cm4gKE5VTEwpOwkJCQkJCQlcCi19CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotLyogRmluZHMgdGhlIG5vZGUgd2l0aCB0aGUgc2FtZSBrZXkgYXMgZWxtICovCQkJCVwKLXN0cnVjdCB0eXBlICoJCQkJCQkJCVwKLW5hbWUjI19SQl9GSU5EKHN0cnVjdCBuYW1lICpoZWFkLCBzdHJ1Y3QgdHlwZSAqZWxtKQkJCVwKLXsJCQkJCQkJCQlcCi0Jc3RydWN0IHR5cGUgKnRtcCA9IFJCX1JPT1QoaGVhZCk7CQkJCVwKLQlpbnQgY29tcDsJCQkJCQkJXAotCXdoaWxlICh0bXApIHsJCQkJCQkJXAotCQljb21wID0gY21wKGVsbSwgdG1wKTsJCQkJCVwKLQkJaWYgKGNvbXAgPCAwKQkJCQkJCVwKLQkJCXRtcCA9IFJCX0xFRlQodG1wLCBmaWVsZCk7CQkJXAotCQllbHNlIGlmIChjb21wID4gMCkJCQkJCVwKLQkJCXRtcCA9IFJCX1JJR0hUKHRtcCwgZmllbGQpOwkJCVwKLQkJZWxzZQkJCQkJCQlcCi0JCQlyZXR1cm4gKHRtcCk7CQkJCQlcCi0JfQkJCQkJCQkJXAotCXJldHVybiAoTlVMTCk7CQkJCQkJCVwKLX0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi1zdHJ1Y3QgdHlwZSAqCQkJCQkJCQlcCi1uYW1lIyNfUkJfTkVYVChzdHJ1Y3QgdHlwZSAqZWxtKQkJCQkJXAotewkJCQkJCQkJCVwKLQlpZiAoUkJfUklHSFQoZWxtLCBmaWVsZCkpIHsJCQkJCVwKLQkJZWxtID0gUkJfUklHSFQoZWxtLCBmaWVsZCk7CQkJCVwKLQkJd2hpbGUgKFJCX0xFRlQoZWxtLCBmaWVsZCkpCQkJCVwKLQkJCWVsbSA9IFJCX0xFRlQoZWxtLCBmaWVsZCk7CQkJXAotCX0gZWxzZSB7CQkJCQkJCVwKLQkJaWYgKFJCX1BBUkVOVChlbG0sIGZpZWxkKSAmJgkJCQlcCi0JCSAgICAoZWxtID09IFJCX0xFRlQoUkJfUEFSRU5UKGVsbSwgZmllbGQpLCBmaWVsZCkpKQlcCi0JCQllbG0gPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7CQkJXAotCQllbHNlIHsJCQkJCQkJXAotCQkJd2hpbGUgKFJCX1BBUkVOVChlbG0sIGZpZWxkKSAmJgkJCVwKLQkJCSAgICAoZWxtID09IFJCX1JJR0hUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKSlcCi0JCQkJZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJXAotCQkJZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJCVwKLQkJfQkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCXJldHVybiAoZWxtKTsJCQkJCQkJXAotfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLXN0cnVjdCB0eXBlICoJCQkJCQkJCVwKLW5hbWUjI19SQl9NSU5NQVgoc3RydWN0IG5hbWUgKmhlYWQsIGludCB2YWwpCQkJCVwKLXsJCQkJCQkJCQlcCi0Jc3RydWN0IHR5cGUgKnRtcCA9IFJCX1JPT1QoaGVhZCk7CQkJCVwKLQlzdHJ1Y3QgdHlwZSAqcGFyZW50ID0gTlVMTDsJCQkJCVwKLQl3aGlsZSAodG1wKSB7CQkJCQkJCVwKLQkJcGFyZW50ID0gdG1wOwkJCQkJCVwKLQkJaWYgKHZhbCA8IDApCQkJCQkJXAotCQkJdG1wID0gUkJfTEVGVCh0bXAsIGZpZWxkKTsJCQlcCi0JCWVsc2UJCQkJCQkJXAotCQkJdG1wID0gUkJfUklHSFQodG1wLCBmaWVsZCk7CQkJXAotCX0JCQkJCQkJCVwKLQlyZXR1cm4gKHBhcmVudCk7CQkJCQkJXAotfQotCi0jZGVmaW5lIFJCX05FR0lORgktMQotI2RlZmluZSBSQl9JTkYJMQotCi0jZGVmaW5lIFJCX0lOU0VSVChuYW1lLCB4LCB5KQluYW1lIyNfUkJfSU5TRVJUKHgsIHkpCi0jZGVmaW5lIFJCX1JFTU9WRShuYW1lLCB4LCB5KQluYW1lIyNfUkJfUkVNT1ZFKHgsIHkpCi0jZGVmaW5lIFJCX0ZJTkQobmFtZSwgeCwgeSkJbmFtZSMjX1JCX0ZJTkQoeCwgeSkKLSNkZWZpbmUgUkJfTkVYVChuYW1lLCB4LCB5KQluYW1lIyNfUkJfTkVYVCh5KQotI2RlZmluZSBSQl9NSU4obmFtZSwgeCkJCW5hbWUjI19SQl9NSU5NQVgoeCwgUkJfTkVHSU5GKQotI2RlZmluZSBSQl9NQVgobmFtZSwgeCkJCW5hbWUjI19SQl9NSU5NQVgoeCwgUkJfSU5GKQotCi0jZGVmaW5lIFJCX0ZPUkVBQ0goeCwgbmFtZSwgaGVhZCkJCQkJCVwKLQlmb3IgKCh4KSA9IFJCX01JTihuYW1lLCBoZWFkKTsJCQkJCVwKLQkgICAgICh4KSAhPSBOVUxMOwkJCQkJCVwKLQkgICAgICh4KSA9IG5hbWUjI19SQl9ORVhUKHgpKQotCi0jZW5kaWYJLyogX1NZU19UUkVFX0hfICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC90aW1pbmdzYWZlX2JjbXAuYyBiL29wZW5ic2QtY29tcGF0L3RpbWluZ3NhZmVfYmNtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTI4YzBlLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3RpbWluZ3NhZmVfYmNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHRpbWluZ3NhZmVfYmNtcC5jLHYgMS4xIDIwMTAvMDkvMjQgMTM6MzM6MDAgbWF0dGhldyBFeHAgJAkqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBEYW1pZW4gTWlsbGVyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0vKiBPUEVOQlNEIE9SSUdJTkFMOiBsaWIvbGliYy9zdHJpbmcvdGltaW5nc2FmZV9iY21wLmMgKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0jaWZuZGVmIEhBVkVfVElNSU5HU0FGRV9CQ01QCi0KLWludAotdGltaW5nc2FmZV9iY21wKGNvbnN0IHZvaWQgKmIxLCBjb25zdCB2b2lkICpiMiwgc2l6ZV90IG4pCi17Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcDEgPSBiMSwgKnAyID0gYjI7Ci0JaW50IHJldCA9IDA7Ci0KLQlmb3IgKDsgbiA+IDA7IG4tLSkKLQkJcmV0IHw9ICpwMSsrIF4gKnAyKys7Ci0JcmV0dXJuIChyZXQgIT0gMCk7Ci19Ci0KLSNlbmRpZiAvKiBUSU1JTkdTQUZFX0JDTVAgKi8KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L3Zpcy5jIGIvb3BlbmJzZC1jb21wYXQvdmlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMDg3YjMuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvdmlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHZpcy5jLHYgMS4xOSAyMDA1LzA5LzAxIDE3OjE1OjQ5IG1pbGxlcnQgRXhwICQgKi8KLS8qLQotICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCi0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogT1BFTkJTRCBPUklHSU5BTDogbGliL2xpYmMvZ2VuL3Zpcy5jICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2lmICFkZWZpbmVkKEhBVkVfU1RSTlZJUykKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJ2aXMuaCIKLQotI2RlZmluZQlpc29jdGFsKGMpCSgoKHVfY2hhcikoYykpID49ICcwJyAmJiAoKHVfY2hhcikoYykpIDw9ICc3JykKLSNkZWZpbmUJaXN2aXNpYmxlKGMpCQkJCQkJCVwKLQkoKCh1X2ludCkoYykgPD0gVUNIQVJfTUFYICYmIGlzYXNjaWkoKHVfY2hhcikoYykpICYmCQlcCi0JKCgoYykgIT0gJyonICYmIChjKSAhPSAnPycgJiYgKGMpICE9ICdbJyAmJiAoYykgIT0gJyMnKSB8fAlcCi0JCShmbGFnICYgVklTX0dMT0IpID09IDApICYmIGlzZ3JhcGgoKHVfY2hhcikoYykpKSB8fAlcCi0JKChmbGFnICYgVklTX1NQKSA9PSAwICYmIChjKSA9PSAnICcpIHx8CQkJCVwKLQkoKGZsYWcgJiBWSVNfVEFCKSA9PSAwICYmIChjKSA9PSAnXHQnKSB8fAkJCVwKLQkoKGZsYWcgJiBWSVNfTkwpID09IDAgJiYgKGMpID09ICdcbicpIHx8CQkJXAotCSgoZmxhZyAmIFZJU19TQUZFKSAmJiAoKGMpID09ICdcYicgfHwJCQkJXAotCQkoYykgPT0gJ1wwMDcnIHx8IChjKSA9PSAnXHInIHx8CQkJCVwKLQkJaXNncmFwaCgodV9jaGFyKShjKSkpKSkKLQotLyoKLSAqIHZpcyAtIHZpc3VhbGx5IGVuY29kZSBjaGFyYWN0ZXJzCi0gKi8KLWNoYXIgKgotdmlzKGNoYXIgKmRzdCwgaW50IGMsIGludCBmbGFnLCBpbnQgbmV4dGMpCi17Ci0JaWYgKGlzdmlzaWJsZShjKSkgewotCQkqZHN0KysgPSBjOwotCQlpZiAoYyA9PSAnXFwnICYmIChmbGFnICYgVklTX05PU0xBU0gpID09IDApCi0JCQkqZHN0KysgPSAnXFwnOwotCQkqZHN0ID0gJ1wwJzsKLQkJcmV0dXJuIChkc3QpOwotCX0KLQotCWlmIChmbGFnICYgVklTX0NTVFlMRSkgewotCQlzd2l0Y2goYykgewotCQljYXNlICdcbic6Ci0JCQkqZHN0KysgPSAnXFwnOwotCQkJKmRzdCsrID0gJ24nOwotCQkJZ290byBkb25lOwotCQljYXNlICdccic6Ci0JCQkqZHN0KysgPSAnXFwnOwotCQkJKmRzdCsrID0gJ3InOwotCQkJZ290byBkb25lOwotCQljYXNlICdcYic6Ci0JCQkqZHN0KysgPSAnXFwnOwotCQkJKmRzdCsrID0gJ2InOwotCQkJZ290byBkb25lOwotCQljYXNlICdcYSc6Ci0JCQkqZHN0KysgPSAnXFwnOwotCQkJKmRzdCsrID0gJ2EnOwotCQkJZ290byBkb25lOwotCQljYXNlICdcdic6Ci0JCQkqZHN0KysgPSAnXFwnOwotCQkJKmRzdCsrID0gJ3YnOwotCQkJZ290byBkb25lOwotCQljYXNlICdcdCc6Ci0JCQkqZHN0KysgPSAnXFwnOwotCQkJKmRzdCsrID0gJ3QnOwotCQkJZ290byBkb25lOwotCQljYXNlICdcZic6Ci0JCQkqZHN0KysgPSAnXFwnOwotCQkJKmRzdCsrID0gJ2YnOwotCQkJZ290byBkb25lOwotCQljYXNlICcgJzoKLQkJCSpkc3QrKyA9ICdcXCc7Ci0JCQkqZHN0KysgPSAncyc7Ci0JCQlnb3RvIGRvbmU7Ci0JCWNhc2UgJ1wwJzoKLQkJCSpkc3QrKyA9ICdcXCc7Ci0JCQkqZHN0KysgPSAnMCc7Ci0JCQlpZiAoaXNvY3RhbChuZXh0YykpIHsKLQkJCQkqZHN0KysgPSAnMCc7Ci0JCQkJKmRzdCsrID0gJzAnOwotCQkJfQotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCWlmICgoKGMgJiAwMTc3KSA9PSAnICcpIHx8IChmbGFnICYgVklTX09DVEFMKSB8fAotCSAgICAoKGZsYWcgJiBWSVNfR0xPQikgJiYgKGMgPT0gJyonIHx8IGMgPT0gJz8nIHx8IGMgPT0gJ1snIHx8IGMgPT0gJyMnKSkpIHsKLQkJKmRzdCsrID0gJ1xcJzsKLQkJKmRzdCsrID0gKCh1X2NoYXIpYyA+PiA2ICYgMDcpICsgJzAnOwotCQkqZHN0KysgPSAoKHVfY2hhciljID4+IDMgJiAwNykgKyAnMCc7Ci0JCSpkc3QrKyA9ICgodV9jaGFyKWMgJiAwNykgKyAnMCc7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKChmbGFnICYgVklTX05PU0xBU0gpID09IDApCi0JCSpkc3QrKyA9ICdcXCc7Ci0JaWYgKGMgJiAwMjAwKSB7Ci0JCWMgJj0gMDE3NzsKLQkJKmRzdCsrID0gJ00nOwotCX0KLQlpZiAoaXNjbnRybCgodV9jaGFyKWMpKSB7Ci0JCSpkc3QrKyA9ICdeJzsKLQkJaWYgKGMgPT0gMDE3NykKLQkJCSpkc3QrKyA9ICc/JzsKLQkJZWxzZQotCQkJKmRzdCsrID0gYyArICdAJzsKLQl9IGVsc2UgewotCQkqZHN0KysgPSAnLSc7Ci0JCSpkc3QrKyA9IGM7Ci0JfQotZG9uZToKLQkqZHN0ID0gJ1wwJzsKLQlyZXR1cm4gKGRzdCk7Ci19Ci0KLS8qCi0gKiBzdHJ2aXMsIHN0cm52aXMsIHN0cnZpc3ggLSB2aXN1YWxseSBlbmNvZGUgY2hhcmFjdGVycyBmcm9tIHNyYyBpbnRvIGRzdAotICoJCi0gKglEc3QgbXVzdCBiZSA0IHRpbWVzIHRoZSBzaXplIG9mIHNyYyB0byBhY2NvdW50IGZvciBwb3NzaWJsZQotICoJZXhwYW5zaW9uLiAgVGhlIGxlbmd0aCBvZiBkc3QsIG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTEwsCi0gKglpcyByZXR1cm5lZC4gCi0gKgotICoJU3RybnZpcyB3aWxsIHdyaXRlIG5vIG1vcmUgdGhhbiBzaXotMSBieXRlcyAoYW5kIHdpbGwgTlVMTCB0ZXJtaW5hdGUpLgotICoJVGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gZnVsbHkgZW5jb2RlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0gKgotICoJU3RydmlzeCBlbmNvZGVzIGV4YWN0bHkgbGVuIGJ5dGVzIGZyb20gc3JjIGludG8gZHN0LgotICoJVGhpcyBpcyB1c2VmdWwgZm9yIGVuY29kaW5nIGEgYmxvY2sgb2YgZGF0YS4KLSAqLwotaW50Ci1zdHJ2aXMoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGludCBmbGFnKQotewotCWNoYXIgYzsKLQljaGFyICpzdGFydDsKLQotCWZvciAoc3RhcnQgPSBkc3Q7IChjID0gKnNyYyk7KQotCQlkc3QgPSB2aXMoZHN0LCBjLCBmbGFnLCAqKytzcmMpOwotCSpkc3QgPSAnXDAnOwotCXJldHVybiAoZHN0IC0gc3RhcnQpOwotfQotCi1pbnQKLXN0cm52aXMoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXosIGludCBmbGFnKQotewotCWNoYXIgKnN0YXJ0LCAqZW5kOwotCWNoYXIgdGJ1Zls1XTsKLQlpbnQgYywgaTsKLQotCWkgPSAwOwotCWZvciAoc3RhcnQgPSBkc3QsIGVuZCA9IHN0YXJ0ICsgc2l6IC0gMTsgKGMgPSAqc3JjKSAmJiBkc3QgPCBlbmQ7ICkgewotCQlpZiAoaXN2aXNpYmxlKGMpKSB7Ci0JCQlpID0gMTsKLQkJCSpkc3QrKyA9IGM7Ci0JCQlpZiAoYyA9PSAnXFwnICYmIChmbGFnICYgVklTX05PU0xBU0gpID09IDApIHsKLQkJCQkvKiBuZWVkIHNwYWNlIGZvciB0aGUgZXh0cmEgJ1xcJyAqLwotCQkJCWlmIChkc3QgPCBlbmQpCi0JCQkJCSpkc3QrKyA9ICdcXCc7Ci0JCQkJZWxzZSB7Ci0JCQkJCWRzdC0tOwotCQkJCQlpID0gMjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJc3JjKys7Ci0JCX0gZWxzZSB7Ci0JCQlpID0gdmlzKHRidWYsIGMsIGZsYWcsICorK3NyYykgLSB0YnVmOwotCQkJaWYgKGRzdCArIGkgPD0gZW5kKSB7Ci0JCQkJbWVtY3B5KGRzdCwgdGJ1ZiwgaSk7Ci0JCQkJZHN0ICs9IGk7Ci0JCQl9IGVsc2UgewotCQkJCXNyYy0tOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWlmIChzaXogPiAwKQotCQkqZHN0ID0gJ1wwJzsKLQlpZiAoZHN0ICsgaSA+IGVuZCkgewotCQkvKiBhZGp1c3QgcmV0dXJuIHZhbHVlIGZvciB0cnVuY2F0aW9uICovCi0JCXdoaWxlICgoYyA9ICpzcmMpKQotCQkJZHN0ICs9IHZpcyh0YnVmLCBjLCBmbGFnLCAqKytzcmMpIC0gdGJ1ZjsKLQl9Ci0JcmV0dXJuIChkc3QgLSBzdGFydCk7Ci19Ci0KLWludAotc3RydmlzeChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGxlbiwgaW50IGZsYWcpCi17Ci0JY2hhciBjOwotCWNoYXIgKnN0YXJ0OwotCi0JZm9yIChzdGFydCA9IGRzdDsgbGVuID4gMTsgbGVuLS0pIHsKLQkJYyA9ICpzcmM7Ci0JCWRzdCA9IHZpcyhkc3QsIGMsIGZsYWcsICorK3NyYyk7Ci0JfQotCWlmIChsZW4pCi0JCWRzdCA9IHZpcyhkc3QsICpzcmMsIGZsYWcsICdcMCcpOwotCSpkc3QgPSAnXDAnOwotCXJldHVybiAoZHN0IC0gc3RhcnQpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L3Zpcy5oIGIvb3BlbmJzZC1jb21wYXQvdmlzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OThhOWUuLjAwMDAwMDAKLS0tIGEvb3BlbmJzZC1jb21wYXQvdmlzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgkkT3BlbkJTRDogdmlzLmgsdiAxLjExIDIwMDUvMDgvMDkgMTk6Mzg6MzEgbWlsbGVydCBFeHAgJAkqLwotLyoJJE5ldEJTRDogdmlzLmgsdiAxLjQgMTk5NC8xMC8yNiAwMDo1Njo0MSBjZ2QgRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqCUAoIyl2aXMuaAk1LjkgKEJlcmtlbGV5KSA0LzMvOTEKLSAqLwotCi0vKiBPUEVOQlNEIE9SSUdJTkFMOiBpbmNsdWRlL3Zpcy5oICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2lmICFkZWZpbmVkKEhBVkVfU1RSTlZJUykKLQotI2lmbmRlZiBfVklTX0hfCi0jZGVmaW5lCV9WSVNfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0vKgotICogdG8gc2VsZWN0IGFsdGVybmF0ZSBlbmNvZGluZyBmb3JtYXQKLSAqLwotI2RlZmluZQlWSVNfT0NUQUwJMHgwMQkvKiB1c2Ugb2N0YWwgXGRkZCBmb3JtYXQgKi8KLSNkZWZpbmUJVklTX0NTVFlMRQkweDAyCS8qIHVzZSBcW25yZnQwLi5dIHdoZXJlIGFwcHJvcHJpYXRlICovCi0KLS8qCi0gKiB0byBhbHRlciBzZXQgb2YgY2hhcmFjdGVycyBlbmNvZGVkIChkZWZhdWx0IGlzIHRvIGVuY29kZSBhbGwKLSAqIG5vbi1ncmFwaGljIGV4Y2VwdCBzcGFjZSwgdGFiLCBhbmQgbmV3bGluZSkuCi0gKi8KLSNkZWZpbmUJVklTX1NQCQkweDA0CS8qIGFsc28gZW5jb2RlIHNwYWNlICovCi0jZGVmaW5lCVZJU19UQUIJCTB4MDgJLyogYWxzbyBlbmNvZGUgdGFiICovCi0jZGVmaW5lCVZJU19OTAkJMHgxMAkvKiBhbHNvIGVuY29kZSBuZXdsaW5lICovCi0jZGVmaW5lCVZJU19XSElURQkoVklTX1NQIHwgVklTX1RBQiB8IFZJU19OTCkKLSNkZWZpbmUJVklTX1NBRkUJMHgyMAkvKiBvbmx5IGVuY29kZSAidW5zYWZlIiBjaGFyYWN0ZXJzICovCi0KLS8qCi0gKiBvdGhlcgotICovCi0jZGVmaW5lCVZJU19OT1NMQVNICTB4NDAJLyogaW5oaWJpdCBwcmludGluZyAnXCcgKi8KLSNkZWZpbmUJVklTX0dMT0IJMHgxMDAJLyogZW5jb2RlIGdsb2IoMykgbWFnaWNzIGFuZCAnIycgKi8KLQotLyoKLSAqIHVudmlzIHJldHVybiBjb2RlcwotICovCi0jZGVmaW5lCVVOVklTX1ZBTElECSAxCS8qIGNoYXJhY3RlciB2YWxpZCAqLwotI2RlZmluZQlVTlZJU19WQUxJRFBVU0gJIDIJLyogY2hhcmFjdGVyIHZhbGlkLCBwdXNoIGJhY2sgcGFzc2VkIGNoYXIgKi8KLSNkZWZpbmUJVU5WSVNfTk9DSEFSCSAzCS8qIHZhbGlkIHNlcXVlbmNlLCBubyBjaGFyYWN0ZXIgcHJvZHVjZWQgKi8KLSNkZWZpbmUJVU5WSVNfU1lOQkFECS0xCS8qIHVucmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2UgKi8KLSNkZWZpbmUJVU5WSVNfRVJST1IJLTIJLyogZGVjb2RlciBpbiB1bmtub3duIHN0YXRlICh1bnJlY292ZXJhYmxlKSAqLwotCi0vKgotICogdW52aXMgZmxhZ3MKLSAqLwotI2RlZmluZQlVTlZJU19FTkQJMQkvKiBubyBtb3JlIGNoYXJhY3RlcnMgKi8KLQotY2hhcgkqdmlzKGNoYXIgKiwgaW50LCBpbnQsIGludCk7Ci1pbnQJc3RydmlzKGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOwotaW50CXN0cm52aXMoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCwgaW50KQotCQlfX2F0dHJpYnV0ZV9fICgoX19ib3VuZGVkX18oX19zdHJpbmdfXywxLDMpKSk7Ci1pbnQJc3RydmlzeChjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBpbnQpCi0JCV9fYXR0cmlidXRlX18gKChfX2JvdW5kZWRfXyhfX3N0cmluZ19fLDEsMykpKTsKLWludAlzdHJ1bnZpcyhjaGFyICosIGNvbnN0IGNoYXIgKik7Ci1pbnQJdW52aXMoY2hhciAqLCBjaGFyLCBpbnQgKiwgaW50KTsKLXNzaXplX3Qgc3RybnVudmlzKGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpCi0JCV9fYXR0cmlidXRlX18gKChfX2JvdW5kZWRfXyhfX3N0cmluZ19fLDEsMykpKTsKLQotI2VuZGlmIC8qICFfVklTX0hfICovCi0KLSNlbmRpZiAvKiAhSEFWRV9TVFJOVklTICovCmRpZmYgLS1naXQgYS9vcGVuYnNkLWNvbXBhdC94Y3J5cHQuYyBiL29wZW5ic2QtY29tcGF0L3hjcnlwdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjkxZTI4Li4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3hjcnlwdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgQmVuIExpbmRzdHJvbS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0KLSMgaWYgZGVmaW5lZChIQVZFX0NSWVBUX0gpICYmICFkZWZpbmVkKEhBVkVfU0VDVVJFV0FSRSkKLSMgIGluY2x1ZGUgPGNyeXB0Lmg+Ci0jIGVuZGlmCi0KLSMgaWZkZWYgX19ocHV4Ci0jICBpbmNsdWRlIDxocHNlY3VyaXR5Lmg+Ci0jICBpbmNsdWRlIDxwcm90Lmg+Ci0jIGVuZGlmCi0KLSMgaWZkZWYgSEFWRV9TRUNVUkVXQVJFCi0jICBpbmNsdWRlIDxzeXMvc2VjdXJpdHkuaD4KLSMgIGluY2x1ZGUgPHN5cy9hdWRpdC5oPgotIyAgaW5jbHVkZSA8cHJvdC5oPgotIyBlbmRpZiAKLQotIyBpZiBkZWZpbmVkKEhBVkVfU0hBRE9XX0gpICYmICFkZWZpbmVkKERJU0FCTEVfU0hBRE9XKQotIyAgaW5jbHVkZSA8c2hhZG93Lmg+Ci0jIGVuZGlmCi0KLSMgaWYgZGVmaW5lZChIQVZFX0dFVFBXQU5BTSkgJiYgIWRlZmluZWQoRElTQUJMRV9TSEFET1cpCi0jICBpbmNsdWRlIDxzeXMvbGFiZWwuaD4KLSMgIGluY2x1ZGUgPHN5cy9hdWRpdC5oPgotIyAgaW5jbHVkZSA8cHdkYWRqLmg+Ci0jIGVuZGlmCi0KLSMgaWYgZGVmaW5lZChIQVZFX01ENV9QQVNTV09SRFMpICYmICFkZWZpbmVkKEhBVkVfTUQ1X0NSWVBUKQotIyAgaW5jbHVkZSAibWQ1Y3J5cHQuaCIKLSMgZW5kaWYgCi0KLWNoYXIgKgoteGNyeXB0KGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjb25zdCBjaGFyICpzYWx0KQotewotCWNoYXIgKmNyeXB0ZWQ7Ci0KLSMgaWZkZWYgSEFWRV9NRDVfUEFTU1dPUkRTCi0gICAgICAgIGlmIChpc19tZDVfc2FsdChzYWx0KSkKLSAgICAgICAgICAgICAgICBjcnlwdGVkID0gbWQ1X2NyeXB0KHBhc3N3b3JkLCBzYWx0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNyeXB0ZWQgPSBjcnlwdChwYXNzd29yZCwgc2FsdCk7Ci0jIGVsaWYgZGVmaW5lZChfX2hwdXgpICYmICFkZWZpbmVkKEhBVkVfU0VDVVJFV0FSRSkKLQlpZiAoaXNjb21zZWMoKSkKLSAgICAgICAgICAgICAgICBjcnlwdGVkID0gYmlnY3J5cHQocGFzc3dvcmQsIHNhbHQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY3J5cHRlZCA9IGNyeXB0KHBhc3N3b3JkLCBzYWx0KTsKLSMgZWxpZiBkZWZpbmVkKEhBVkVfU0VDVVJFV0FSRSkKLSAgICAgICAgY3J5cHRlZCA9IGJpZ2NyeXB0KHBhc3N3b3JkLCBzYWx0KTsKLSMgZWxzZQotICAgICAgICBjcnlwdGVkID0gY3J5cHQocGFzc3dvcmQsIHNhbHQpOwotIyBlbmRpZiAKLQotCXJldHVybiBjcnlwdGVkOwotfQotCi0vKgotICogSGFuZGxlIHNoYWRvd2VkIHBhc3N3b3JkIHN5c3RlbXMgaW4gYSBjbGVhbmVyIHdheSBmb3IgcG9ydGFibGUKLSAqIHZlcnNpb24uCi0gKi8KLQotY2hhciAqCi1zaGFkb3dfcHcoc3RydWN0IHBhc3N3ZCAqcHcpCi17Ci0JY2hhciAqcHdfcGFzc3dvcmQgPSBwdy0+cHdfcGFzc3dkOwotCi0jIGlmIGRlZmluZWQoSEFWRV9TSEFET1dfSCkgJiYgIWRlZmluZWQoRElTQUJMRV9TSEFET1cpCi0Jc3RydWN0IHNwd2QgKnNwdyA9IGdldHNwbmFtKHB3LT5wd19uYW1lKTsKLQotCWlmIChzcHcgIT0gTlVMTCkKLQkJcHdfcGFzc3dvcmQgPSBzcHctPnNwX3B3ZHA7Ci0jIGVuZGlmCi0KLSNpZmRlZiBVU0VfTElCSUFGCi0JcmV0dXJuKGdldF9pYWZfcGFzc3dvcmQocHcpKTsKLSNlbmRpZgotCi0jIGlmIGRlZmluZWQoSEFWRV9HRVRQV0FOQU0pICYmICFkZWZpbmVkKERJU0FCTEVfU0hBRE9XKQotCXN0cnVjdCBwYXNzd2RfYWRqdW5jdCAqc3B3OwotCWlmIChpc3NlY3VyZSgpICYmIChzcHcgPSBnZXRwd2FuYW0ocHctPnB3X25hbWUpKSAhPSBOVUxMKQotCQlwd19wYXNzd29yZCA9IHNwdy0+cHdhX3Bhc3N3ZDsKLSMgZWxpZiBkZWZpbmVkKEhBVkVfU0VDVVJFV0FSRSkKLQlzdHJ1Y3QgcHJfcGFzc3dkICpzcHcgPSBnZXRwcnB3bmFtKHB3LT5wd19uYW1lKTsKLQotCWlmIChzcHcgIT0gTlVMTCkKLQkJcHdfcGFzc3dvcmQgPSBzcHctPnVmbGQuZmRfZW5jcnlwdDsKLSMgZW5kaWYKLQotCXJldHVybiBwd19wYXNzd29yZDsKLX0KZGlmZiAtLWdpdCBhL29wZW5ic2QtY29tcGF0L3htbWFwLmMgYi9vcGVuYnNkLWNvbXBhdC94bW1hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGM2YmFiLi4wMDAwMDAwCi0tLSBhL29wZW5ic2QtY29tcGF0L3htbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAyIFRpbSBSaWNlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIE1BUF9GQUlMRUQgY29kZSBieSBTb2xhciBEZXNpZ25lci4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS8qICRJZDogeG1tYXAuYyx2IDEuMTUgMjAwOS8wMi8xNiAwNDoyMTo0MCBkam0gRXhwICQgKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1NZU19NTUFOX0gKLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmZGVmIEhBVkVfRkNOVExfSAotIyBpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImxvZy5oIgotCi12b2lkICoKLXhtbWFwKHNpemVfdCBzaXplKQotewotI2lmZGVmIEhBVkVfTU1BUAotCXZvaWQgKmFkZHJlc3M7Ci0KLSMgaWZkZWYgTUFQX0FOT04KLQlhZGRyZXNzID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1dSSVRFfFBST1RfUkVBRCwgTUFQX0FOT058TUFQX1NIQVJFRCwKLQkgICAgLTEsIChvZmZfdCkwKTsKLSMgZWxzZQotCWFkZHJlc3MgPSBtbWFwKE5VTEwsIHNpemUsIFBST1RfV1JJVEV8UFJPVF9SRUFELCBNQVBfU0hBUkVELAotCSAgICBvcGVuKCIvZGV2L3plcm8iLCBPX1JEV1IpLCAob2ZmX3QpMCk7Ci0jIGVuZGlmCi0KLSNkZWZpbmUgTU1fU1dBUF9URU1QTEFURSAiL3Zhci9ydW4vc3NoZC5tbS5YWFhYWFhYWCIKLQlpZiAoYWRkcmVzcyA9PSAodm9pZCAqKU1BUF9GQUlMRUQpIHsKLQkJY2hhciB0bXBuYW1lW3NpemVvZihNTV9TV0FQX1RFTVBMQVRFKV0gPSBNTV9TV0FQX1RFTVBMQVRFOwotCQlpbnQgdG1wZmQ7Ci0JCW1vZGVfdCBvbGRfdW1hc2s7Ci0KLQkJb2xkX3VtYXNrID0gdW1hc2soMDE3Nyk7Ci0JCXRtcGZkID0gbWtzdGVtcCh0bXBuYW1lKTsKLQkJdW1hc2sob2xkX3VtYXNrKTsKLQkJaWYgKHRtcGZkID09IC0xKQotCQkJZmF0YWwoIm1rc3RlbXAoXCIlc1wiKTogJXMiLAotCQkJICAgIE1NX1NXQVBfVEVNUExBVEUsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXVubGluayh0bXBuYW1lKTsKLQkJaWYgKGZ0cnVuY2F0ZSh0bXBmZCwgc2l6ZSkgIT0gMCkKLQkJCWZhdGFsKCIlczogZnRydW5jYXRlOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCQlhZGRyZXNzID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1dSSVRFfFBST1RfUkVBRCwgTUFQX1NIQVJFRCwKLQkJICAgIHRtcGZkLCAob2ZmX3QpMCk7Ci0JCWNsb3NlKHRtcGZkKTsKLQl9Ci0KLQlyZXR1cm4gKGFkZHJlc3MpOwotI2Vsc2UKLQlmYXRhbCgiJXM6IFVzZVByaXZpbGVnZVNlcGFyYXRpb249eWVzIGFuZCBDb21wcmVzc2lvbj15ZXMgbm90IHN1cHBvcnRlZCIsCi0JICAgIF9fZnVuY19fKTsKLSNlbmRpZiAvKiBIQVZFX01NQVAgKi8KLQotfQotCmRpZmYgLS1naXQgYS9vcGVuc3NoLnhtbC5pbiBiL29wZW5zc2gueG1sLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWZlMWQzLi4wMDAwMDAwCi0tLSBhL29wZW5zc2gueG1sLmluCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IURPQ1RZUEUgc2VydmljZV9idW5kbGUgU1lTVEVNICcvdXNyL3NoYXJlL2xpYi94bWwvZHRkL3NlcnZpY2VfYnVuZGxlLmR0ZC4xJz4KLTwhLS0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDYgQ2hhZCBNeW5oaWVyLgotCi0gICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICAgIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0KLSAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAgICBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAgICBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotLS0+Ci0KLTxzZXJ2aWNlX2J1bmRsZSB0eXBlPSdtYW5pZmVzdCcgbmFtZT0nT3BlblNTSCBzZXJ2ZXInPgotCi0gICAgPHNlcnZpY2UKLSAgICAgICAgbmFtZT0nc2l0ZS9fX1NZU1ZJTklUX05BTUVfXycKLSAgICAgICAgdHlwZT0nc2VydmljZScKLSAgICAgICAgdmVyc2lvbj0nMSc+Ci0KLTwhLS0KLQlXZSBkZWZhdWx0IHRvIGRpc2FibGVkIHNvIGFkbWluaXN0cmF0b3IgY2FuIGRlY2lkZSB0byBlbmFibGUgb3Igbm90LgotLS0+Ci0gICAgICAgIDxjcmVhdGVfZGVmYXVsdF9pbnN0YW5jZSBlbmFibGVkPSdmYWxzZScvPgotCi0gICAgICAgIDxzaW5nbGVfaW5zdGFuY2UvPgotCi0gICAgICAgIDxkZXBlbmRlbmN5Ci0gICAgICAgICAgICBuYW1lPSdmaWxlc3lzdGVtLWxvY2FsJwotICAgICAgICAgICAgZ3JvdXBpbmc9J3JlcXVpcmVfYWxsJwotICAgICAgICAgICAgcmVzdGFydF9vbj0nbm9uZScKLSAgICAgICAgICAgIHR5cGU9J3NlcnZpY2UnPgotICAgICAgICAgICAgPHNlcnZpY2VfZm1yaSB2YWx1ZT0nc3ZjOi9zeXN0ZW0vZmlsZXN5c3RlbS9sb2NhbCcvPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3kKLSAgICAgICAgICAgIG5hbWU9J25ldHdvcmsnCi0gICAgICAgICAgICBncm91cGluZz0ncmVxdWlyZV9hbGwnCi0gICAgICAgICAgICByZXN0YXJ0X29uPSdub25lJwotICAgICAgICAgICAgdHlwZT0nc2VydmljZSc+Ci0gICAgICAgICAgICA8c2VydmljZV9mbXJpIHZhbHVlPSdzdmM6L21pbGVzdG9uZS9uZXR3b3JrJy8+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW50Ci0gICAgICAgICAgICBuYW1lPSdtdWx0aS11c2VyLXNlcnZlcicKLSAgICAgICAgICAgIHJlc3RhcnRfb249J25vbmUnCi0gICAgICAgICAgICBncm91cGluZz0nb3B0aW9uYWxfYWxsJz4KLSAgICAgICAgICAgIDxzZXJ2aWNlX2ZtcmkgdmFsdWU9J3N2YzovbWlsZXN0b25lL211bHRpLXVzZXItc2VydmVyJy8+Ci0gICAgICAgIDwvZGVwZW5kZW50PgotCi0gICAgICAgIDxleGVjX21ldGhvZAotICAgICAgICAgICAgbmFtZT0nc3RhcnQnCi0gICAgICAgICAgICB0eXBlPSdtZXRob2QnCi0gICAgICAgICAgICBleGVjPSdfX1NNRl9NRVRIT0RfRElSX18vX19TWVNWSU5JVF9OQU1FX18gc3RhcnQnCi0gICAgICAgICAgICB0aW1lb3V0X3NlY29uZHM9JzYwJz4KLSAgICAgICAgICAgIDxtZXRob2RfY29udGV4dC8+Ci0gICAgICAgIDwvZXhlY19tZXRob2Q+Ci0KLSAgICAgICAgPGV4ZWNfbWV0aG9kCi0gICAgICAgICAgICBuYW1lPSdzdG9wJwotICAgICAgICAgICAgdHlwZT0nbWV0aG9kJwotICAgICAgICAgICAgZXhlYz0nOmtpbGwnCi0gICAgICAgICAgICB0aW1lb3V0X3NlY29uZHM9JzYwJz4KLSAgICAgICAgICAgIDxtZXRob2RfY29udGV4dC8+Ci0gICAgICAgIDwvZXhlY19tZXRob2Q+Ci0KLSAgICAgICAgPHByb3BlcnR5X2dyb3VwCi0gICAgICAgICAgICBuYW1lPSdzdGFydGQnCi0gICAgICAgICAgICB0eXBlPSdmcmFtZXdvcmsnPgotICAgICAgICAgICAgPHByb3B2YWwgbmFtZT0naWdub3JlX2Vycm9yJyB0eXBlPSdhc3RyaW5nJyB2YWx1ZT0nY29yZSxzaWduYWwnLz4KLSAgICAgICAgPC9wcm9wZXJ0eV9ncm91cD4KLQotICAgICAgICA8dGVtcGxhdGU+Ci0gICAgICAgICAgICA8Y29tbW9uX25hbWU+Ci0gICAgICAgICAgICAgICAgPGxvY3RleHQgeG1sOmxhbmc9J0MnPk9wZW5TU0ggc2VydmVyPC9sb2N0ZXh0PgotICAgICAgICAgICAgPC9jb21tb25fbmFtZT4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDxtYW5wYWdlCi0gICAgICAgICAgICAgICAgICAgIHRpdGxlPSdzc2hkJwotICAgICAgICAgICAgICAgICAgICBzZWN0aW9uPScxTScKLSAgICAgICAgICAgICAgICAgICAgbWFucGF0aD0nQHByZWZpeEAvbWFuJy8+Ci0gICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgIDwvdGVtcGxhdGU+Ci0gICAgPC9zZXJ2aWNlPgotPC9zZXJ2aWNlX2J1bmRsZT4KZGlmZiAtLWdpdCBhL29wZW5zc2hkLmluaXQuaW4gYi9vcGVuc3NoZC5pbml0LmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZGI2MGNhLi4wMDAwMDAwCi0tLSBhL29wZW5zc2hkLmluaXQuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jIUBTVEFSVFVQX1NDUklQVF9TSEVMTEAKLSMgRG9uYXRlZCBjb2RlIHRoYXQgd2FzIHB1dCB1bmRlciBQRCBsaWNlbnNlLgotIwotIyBTdHJpcHBlZCBQUk5HZCBvdXQgb2YgaXQgZm9yIHRoZSB0aW1lIGJlaW5nLgotCi11bWFzayAwMjIKLQotQ0FUPUBDQVRACi1LSUxMPUBLSUxMQAotCi1wcmVmaXg9QHByZWZpeEAKLXN5c2NvbmZkaXI9QHN5c2NvbmZkaXJACi1waWRkaXI9QHBpZGRpckAKLQotU1NIRD0kcHJlZml4L3NiaW4vc3NoZAotUElERklMRT0kcGlkZGlyL3NzaGQucGlkCi1QaWRGaWxlPWBncmVwICJeUGlkRmlsZSIgJHtzeXNjb25mZGlyfS9zc2hkX2NvbmZpZyB8IHRyICI9IiAiICIgfCBhd2sgJ3twcmludCAkMn0nYAotWyBYJFBpZEZpbGUgPSBYIF0gIHx8ICBQSURGSUxFPSRQaWRGaWxlCi1TU0hfS0VZR0VOPSRwcmVmaXgvYmluL3NzaC1rZXlnZW4KLUhPU1RfS0VZX1JTQTE9JHN5c2NvbmZkaXIvc3NoX2hvc3Rfa2V5Ci1IT1NUX0tFWV9EU0E9JHN5c2NvbmZkaXIvc3NoX2hvc3RfZHNhX2tleQotSE9TVF9LRVlfUlNBPSRzeXNjb25mZGlyL3NzaF9ob3N0X3JzYV9rZXkKLUBDT01NRU5UX09VVF9FQ0NASE9TVF9LRVlfRUNEU0E9JHN5c2NvbmZkaXIvc3NoX2hvc3RfZWNkc2Ffa2V5Ci0KLQotY2hlY2trZXlzKCkgewotICAgIGlmIFsgISAtZiAkSE9TVF9LRVlfUlNBMSBdOyB0aGVuCi0JJHtTU0hfS0VZR0VOfSAtdCByc2ExIC1mICR7SE9TVF9LRVlfUlNBMX0gLU4gIiIKLSAgICBmaQotICAgIGlmIFsgISAtZiAkSE9TVF9LRVlfRFNBIF07IHRoZW4KLQkke1NTSF9LRVlHRU59IC10IGRzYSAtZiAke0hPU1RfS0VZX0RTQX0gLU4gIiIKLSAgICBmaQotICAgIGlmIFsgISAtZiAkSE9TVF9LRVlfUlNBIF07IHRoZW4KLQkke1NTSF9LRVlHRU59IC10IHJzYSAtZiAke0hPU1RfS0VZX1JTQX0gLU4gIiIKLSAgICBmaQotQENPTU1FTlRfT1VUX0VDQ0AgICAgaWYgWyAhIC1mICRIT1NUX0tFWV9FQ0RTQSBdOyB0aGVuCi1AQ09NTUVOVF9PVVRfRUNDQAkke1NTSF9LRVlHRU59IC10IGVjZHNhIC1mICR7SE9TVF9LRVlfRUNEU0F9IC1OICIiCi1AQ09NTUVOVF9PVVRfRUNDQCAgICBmaQotfQotCi1zdG9wX3NlcnZpY2UoKSB7Ci0gICAgaWYgWyAgLXIgJFBJREZJTEUgIC1hICAhIC16ICR7UElERklMRX0gIF07IHRoZW4KLQlQSUQ9YCR7Q0FUfSAke1BJREZJTEV9YAotICAgIGZpCi0gICAgaWYgWyAgJHtQSUQ6PTB9IC1ndCAxIC1hICAhICJYJFBJRCIgPSAiWCAiICBdOyB0aGVuCi0JJHtLSUxMfSAke1BJRH0KLSAgICBlbHNlCi0JZWNobyAiVW5hYmxlIHRvIHJlYWQgUElEIGZpbGUiCi0gICAgZmkKLX0KLQotc3RhcnRfc2VydmljZSgpIHsKLSAgICAjIFhYWCBXZSByZWFsbHkgc2hvdWxkIGNoZWNrIGlmIHRoZSBzZXJ2aWNlIGlzIGFscmVhZHkgZ29pbmcsIGJ1dAotICAgICMgWFhYIHdlIHdpbGwgb3B0IG91dCBhdCB0aGlzIHRpbWUuIC0gQmFsCi0KLSAgICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGtleXMgdGhhdCBuZWVkIHRvIGJlIG1hZGUKLSAgICBjaGVja2tleXMKLQotICAgICMgU3RhcnQgU1NIRAotICAgIGVjaG8gInN0YXJ0aW5nICRTU0hELi4uIFxjIiAgICAgICAgIDsgJFNTSEQKLQotICAgIHNzaGRfcmM9JD8KLSAgICBpZiBbICRzc2hkX3JjIC1uZSAwIF07IHRoZW4KLQllY2hvICIkMDogRXJyb3IgJHtzc2hkX3JjfSBzdGFydGluZyAke1NTSER9Li4uIGJhaWxpbmcuIgotCWV4aXQgJHNzaGRfcmMKLSAgICBmaQotICAgIGVjaG8gZG9uZS4KLX0KLQotY2FzZSAkMSBpbgotCi0nc3RhcnQnKQotICAgIHN0YXJ0X3NlcnZpY2UKLSAgICA7OwotCi0nc3RvcCcpCi0gICAgc3RvcF9zZXJ2aWNlCi0gICAgOzsKLQotJ3Jlc3RhcnQnKQotICAgIHN0b3Bfc2VydmljZQotICAgIHN0YXJ0X3NlcnZpY2UKLSAgICA7OwotCi0qKQotICAgIGVjaG8gIiQwOiAgdXNhZ2U6ICAkMCB7c3RhcnR8c3RvcHxyZXN0YXJ0fSIKLSAgICA7OwotZXNhYwpkaWZmIC0tZ2l0IGEvcGFja2V0LmMgYi9wYWNrZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5MzQxNy4uMDAwMDAwMAotLS0gYS9wYWNrZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NzIgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHBhY2tldC5jLHYgMS4xNzMgMjAxMS8wNS8wNiAyMToxNDowNSBkam0gRXhwICQgKi8KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgY29kZSBpbXBsZW1lbnRpbmcgdGhlIHBhY2tldCBwcm90b2NvbCBhbmQgY29tbXVuaWNhdGlvbgotICogd2l0aCB0aGUgb3RoZXIgc2lkZS4gIFRoaXMgc2FtZSBjb2RlIGlzIHVzZWQgYm90aCBvbiBjbGllbnQgYW5kIHNlcnZlciBzaWRlLgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKgotICoKLSAqIFNTSDIgcGFja2V0IGZvcm1hdCBhZGRlZCBieSBNYXJrdXMgRnJpZWRsLgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLSAKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAiY3JjMzIuaCIKLSNpbmNsdWRlICJjb21wcmVzcy5oIgotI2luY2x1ZGUgImRlYXR0YWNrLmgiCi0jaW5jbHVkZSAiY2hhbm5lbHMuaCIKLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJzc2gxLmgiCi0jaW5jbHVkZSAic3NoMi5oIgotI2luY2x1ZGUgImNpcGhlci5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImtleC5oIgotI2luY2x1ZGUgIm1hYy5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImNhbm9ob3N0LmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgInJvYW1pbmcuaCIKLQotI2lmZGVmIFBBQ0tFVF9ERUJVRwotI2RlZmluZSBEQkcoeCkgeAotI2Vsc2UKLSNkZWZpbmUgREJHKHgpCi0jZW5kaWYKLQotI2RlZmluZSBQQUNLRVRfTUFYX1NJWkUgKDI1NiAqIDEwMjQpCi0KLXN0cnVjdCBwYWNrZXRfc3RhdGUgewotCXVfaW50MzJfdCBzZXFucjsKLQl1X2ludDMyX3QgcGFja2V0czsKLQl1X2ludDY0X3QgYmxvY2tzOwotCXVfaW50NjRfdCBieXRlczsKLX07Ci0KLXN0cnVjdCBwYWNrZXQgewotCVRBSUxRX0VOVFJZKHBhY2tldCkgbmV4dDsKLQl1X2NoYXIgdHlwZTsKLQlCdWZmZXIgcGF5bG9hZDsKLX07Ci0KLXN0cnVjdCBzZXNzaW9uX3N0YXRlIHsKLQkvKgotCSAqIFRoaXMgdmFyaWFibGUgY29udGFpbnMgdGhlIGZpbGUgZGVzY3JpcHRvcnMgdXNlZCBmb3IKLQkgKiBjb21tdW5pY2F0aW5nIHdpdGggdGhlIG90aGVyIHNpZGUuICBjb25uZWN0aW9uX2luIGlzIHVzZWQgZm9yCi0JICogcmVhZGluZzsgY29ubmVjdGlvbl9vdXQgZm9yIHdyaXRpbmcuICBUaGVzZSBjYW4gYmUgdGhlIHNhbWUKLQkgKiBkZXNjcmlwdG9yLCBpbiB3aGljaCBjYXNlIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBzb2NrZXQuCi0JICovCi0JaW50IGNvbm5lY3Rpb25faW47Ci0JaW50IGNvbm5lY3Rpb25fb3V0OwotCi0JLyogUHJvdG9jb2wgZmxhZ3MgZm9yIHRoZSByZW1vdGUgc2lkZS4gKi8KLQl1X2ludCByZW1vdGVfcHJvdG9jb2xfZmxhZ3M7Ci0KLQkvKiBFbmNyeXB0aW9uIGNvbnRleHQgZm9yIHJlY2VpdmluZyBkYXRhLiAgT25seSB1c2VkIGZvciBkZWNyeXB0aW9uLiAqLwotCUNpcGhlckNvbnRleHQgcmVjZWl2ZV9jb250ZXh0OwotCi0JLyogRW5jcnlwdGlvbiBjb250ZXh0IGZvciBzZW5kaW5nIGRhdGEuICBPbmx5IHVzZWQgZm9yIGVuY3J5cHRpb24uICovCi0JQ2lwaGVyQ29udGV4dCBzZW5kX2NvbnRleHQ7Ci0KLQkvKiBCdWZmZXIgZm9yIHJhdyBpbnB1dCBkYXRhIGZyb20gdGhlIHNvY2tldC4gKi8KLQlCdWZmZXIgaW5wdXQ7Ci0KLQkvKiBCdWZmZXIgZm9yIHJhdyBvdXRwdXQgZGF0YSBnb2luZyB0byB0aGUgc29ja2V0LiAqLwotCUJ1ZmZlciBvdXRwdXQ7Ci0KLQkvKiBCdWZmZXIgZm9yIHRoZSBwYXJ0aWFsIG91dGdvaW5nIHBhY2tldCBiZWluZyBjb25zdHJ1Y3RlZC4gKi8KLQlCdWZmZXIgb3V0Z29pbmdfcGFja2V0OwotCi0JLyogQnVmZmVyIGZvciB0aGUgaW5jb21pbmcgcGFja2V0IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuICovCi0JQnVmZmVyIGluY29taW5nX3BhY2tldDsKLQotCS8qIFNjcmF0Y2ggYnVmZmVyIGZvciBwYWNrZXQgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbi4gKi8KLQlCdWZmZXIgY29tcHJlc3Npb25fYnVmZmVyOwotCWludCBjb21wcmVzc2lvbl9idWZmZXJfcmVhZHk7Ci0KLQkvKgotCSAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHBhY2tldCBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGlzCi0JICogZW5hYmxlZC4KLQkgKi8KLQlpbnQgcGFja2V0X2NvbXByZXNzaW9uOwotCi0JLyogZGVmYXVsdCBtYXhpbXVtIHBhY2tldCBzaXplICovCi0JdV9pbnQgbWF4X3BhY2tldF9zaXplOwotCi0JLyogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBtb2R1bGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICovCi0JaW50IGluaXRpYWxpemVkOwotCi0JLyogU2V0IHRvIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW50ZXJhY3RpdmUuICovCi0JaW50IGludGVyYWN0aXZlX21vZGU7Ci0KLQkvKiBTZXQgdG8gdHJ1ZSBpZiB3ZSBhcmUgdGhlIHNlcnZlciBzaWRlLiAqLwotCWludCBzZXJ2ZXJfc2lkZTsKLQotCS8qIFNldCB0byB0cnVlIGlmIHdlIGFyZSBhdXRoZW50aWNhdGVkLiAqLwotCWludCBhZnRlcl9hdXRoZW50aWNhdGlvbjsKLQotCWludCBrZWVwX2FsaXZlX3RpbWVvdXRzOwotCi0JLyogVGhlIG1heGltdW0gdGltZSB0aGF0IHdlIHdpbGwgd2FpdCB0byBzZW5kIG9yIHJlY2VpdmUgYSBwYWNrZXQgKi8KLQlpbnQgcGFja2V0X3RpbWVvdXRfbXM7Ci0KLQkvKiBTZXNzaW9uIGtleSBpbmZvcm1hdGlvbiBmb3IgRW5jcnlwdGlvbiBhbmQgTUFDICovCi0JTmV3a2V5cyAqbmV3a2V5c1tNT0RFX01BWF07Ci0Jc3RydWN0IHBhY2tldF9zdGF0ZSBwX3JlYWQsIHBfc2VuZDsKLQotCXVfaW50NjRfdCBtYXhfYmxvY2tzX2luLCBtYXhfYmxvY2tzX291dDsKLQl1X2ludDMyX3QgcmVrZXlfbGltaXQ7Ci0KLQkvKiBTZXNzaW9uIGtleSBmb3IgcHJvdG9jb2wgdjEgKi8KLQl1X2NoYXIgc3NoMV9rZXlbU1NIX1NFU1NJT05fS0VZX0xFTkdUSF07Ci0JdV9pbnQgc3NoMV9rZXlsZW47Ci0KLQkvKiByb3VuZHVwIGN1cnJlbnQgbWVzc2FnZSB0byBleHRyYV9wYWQgYnl0ZXMgKi8KLQl1X2NoYXIgZXh0cmFfcGFkOwotCi0JLyogWFhYIGRpc2NhcmQgaW5jb21pbmcgZGF0YSBhZnRlciBNQUMgZXJyb3IgKi8KLQl1X2ludCBwYWNrZXRfZGlzY2FyZDsKLQlNYWMgKnBhY2tldF9kaXNjYXJkX21hYzsKLQotCS8qIFVzZWQgaW4gcGFja2V0X3JlYWRfcG9sbDIoKSAqLwotCXVfaW50IHBhY2tsZW47Ci0KLQkvKiBVc2VkIGluIHBhY2tldF9zZW5kMiAqLwotCWludCByZWtleWluZzsKLQotCS8qIFVzZWQgaW4gcGFja2V0X3NldF9pbnRlcmFjdGl2ZSAqLwotCWludCBzZXRfaW50ZXJhY3RpdmVfY2FsbGVkOwotCi0JLyogVXNlZCBpbiBwYWNrZXRfc2V0X21heHNpemUgKi8KLQlpbnQgc2V0X21heHNpemVfY2FsbGVkOwotCi0JVEFJTFFfSEVBRCgsIHBhY2tldCkgb3V0Z29pbmc7Ci19OwotCi1zdGF0aWMgc3RydWN0IHNlc3Npb25fc3RhdGUgKmFjdGl2ZV9zdGF0ZSwgKmJhY2t1cF9zdGF0ZTsKLQotc3RhdGljIHN0cnVjdCBzZXNzaW9uX3N0YXRlICoKLWFsbG9jX3Nlc3Npb25fc3RhdGUodm9pZCkKLXsKLQlzdHJ1Y3Qgc2Vzc2lvbl9zdGF0ZSAqcyA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpzKSk7Ci0KLQlzLT5jb25uZWN0aW9uX2luID0gLTE7Ci0Jcy0+Y29ubmVjdGlvbl9vdXQgPSAtMTsKLQlzLT5tYXhfcGFja2V0X3NpemUgPSAzMjc2ODsKLQlzLT5wYWNrZXRfdGltZW91dF9tcyA9IC0xOwotCXJldHVybiBzOwotfQotCi0vKgotICogU2V0cyB0aGUgZGVzY3JpcHRvcnMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbi4gIERpc2FibGVzIGVuY3J5cHRpb24gdW50aWwKLSAqIHBhY2tldF9zZXRfZW5jcnlwdGlvbl9rZXkgaXMgY2FsbGVkLgotICovCi12b2lkCi1wYWNrZXRfc2V0X2Nvbm5lY3Rpb24oaW50IGZkX2luLCBpbnQgZmRfb3V0KQotewotCUNpcGhlciAqbm9uZSA9IGNpcGhlcl9ieV9uYW1lKCJub25lIik7Ci0KLQlpZiAobm9uZSA9PSBOVUxMKQotCQlmYXRhbCgicGFja2V0X3NldF9jb25uZWN0aW9uOiBjYW5ub3QgbG9hZCBjaXBoZXIgJ25vbmUnIik7Ci0JaWYgKGFjdGl2ZV9zdGF0ZSA9PSBOVUxMKQotCQlhY3RpdmVfc3RhdGUgPSBhbGxvY19zZXNzaW9uX3N0YXRlKCk7Ci0JYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX2luID0gZmRfaW47Ci0JYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX291dCA9IGZkX291dDsKLQljaXBoZXJfaW5pdCgmYWN0aXZlX3N0YXRlLT5zZW5kX2NvbnRleHQsIG5vbmUsIChjb25zdCB1X2NoYXIgKikiIiwKLQkgICAgMCwgTlVMTCwgMCwgQ0lQSEVSX0VOQ1JZUFQpOwotCWNpcGhlcl9pbml0KCZhY3RpdmVfc3RhdGUtPnJlY2VpdmVfY29udGV4dCwgbm9uZSwgKGNvbnN0IHVfY2hhciAqKSIiLAotCSAgICAwLCBOVUxMLCAwLCBDSVBIRVJfREVDUllQVCk7Ci0JYWN0aXZlX3N0YXRlLT5uZXdrZXlzW01PREVfSU5dID0gYWN0aXZlX3N0YXRlLT5uZXdrZXlzW01PREVfT1VUXSA9IE5VTEw7Ci0JaWYgKCFhY3RpdmVfc3RhdGUtPmluaXRpYWxpemVkKSB7Ci0JCWFjdGl2ZV9zdGF0ZS0+aW5pdGlhbGl6ZWQgPSAxOwotCQlidWZmZXJfaW5pdCgmYWN0aXZlX3N0YXRlLT5pbnB1dCk7Ci0JCWJ1ZmZlcl9pbml0KCZhY3RpdmVfc3RhdGUtPm91dHB1dCk7Ci0JCWJ1ZmZlcl9pbml0KCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCk7Ci0JCWJ1ZmZlcl9pbml0KCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCk7Ci0JCVRBSUxRX0lOSVQoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmcpOwotCQlhY3RpdmVfc3RhdGUtPnBfc2VuZC5wYWNrZXRzID0gYWN0aXZlX3N0YXRlLT5wX3JlYWQucGFja2V0cyA9IDA7Ci0JfQotfQotCi12b2lkCi1wYWNrZXRfc2V0X3RpbWVvdXQoaW50IHRpbWVvdXQsIGludCBjb3VudCkKLXsKLQlpZiAodGltZW91dCA9PSAwIHx8IGNvdW50ID09IDApIHsKLQkJYWN0aXZlX3N0YXRlLT5wYWNrZXRfdGltZW91dF9tcyA9IC0xOwotCQlyZXR1cm47Ci0JfQotCWlmICgoSU5UX01BWCAvIDEwMDApIC8gY291bnQgPCB0aW1lb3V0KQotCQlhY3RpdmVfc3RhdGUtPnBhY2tldF90aW1lb3V0X21zID0gSU5UX01BWDsKLQllbHNlCi0JCWFjdGl2ZV9zdGF0ZS0+cGFja2V0X3RpbWVvdXRfbXMgPSB0aW1lb3V0ICogY291bnQgKiAxMDAwOwotfQotCi1zdGF0aWMgdm9pZAotcGFja2V0X3N0b3BfZGlzY2FyZCh2b2lkKQotewotCWlmIChhY3RpdmVfc3RhdGUtPnBhY2tldF9kaXNjYXJkX21hYykgewotCQljaGFyIGJ1ZlsxMDI0XTsKLQkJCi0JCW1lbXNldChidWYsICdhJywgc2l6ZW9mKGJ1ZikpOwotCQl3aGlsZSAoYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpIDwKLQkJICAgIFBBQ0tFVF9NQVhfU0laRSkKLQkJCWJ1ZmZlcl9hcHBlbmQoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LCBidWYsCi0JCQkgICAgc2l6ZW9mKGJ1ZikpOwotCQkodm9pZCkgbWFjX2NvbXB1dGUoYWN0aXZlX3N0YXRlLT5wYWNrZXRfZGlzY2FyZF9tYWMsCi0JCSAgICBhY3RpdmVfc3RhdGUtPnBfcmVhZC5zZXFuciwKLQkJICAgIGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KSwKLQkJICAgIFBBQ0tFVF9NQVhfU0laRSk7Ci0JfQotCWxvZ2l0KCJGaW5pc2hlZCBkaXNjYXJkaW5nIGZvciAlLjIwMHMiLCBnZXRfcmVtb3RlX2lwYWRkcigpKTsKLQljbGVhbnVwX2V4aXQoMjU1KTsKLX0KLQotc3RhdGljIHZvaWQKLXBhY2tldF9zdGFydF9kaXNjYXJkKEVuYyAqZW5jLCBNYWMgKm1hYywgdV9pbnQgcGFja2V0X2xlbmd0aCwgdV9pbnQgZGlzY2FyZCkKLXsKLQlpZiAoZW5jID09IE5VTEwgfHwgIWNpcGhlcl9pc19jYmMoZW5jLT5jaXBoZXIpKQotCQlwYWNrZXRfZGlzY29ubmVjdCgiUGFja2V0IGNvcnJ1cHQiKTsKLQlpZiAocGFja2V0X2xlbmd0aCAhPSBQQUNLRVRfTUFYX1NJWkUgJiYgbWFjICYmIG1hYy0+ZW5hYmxlZCkKLQkJYWN0aXZlX3N0YXRlLT5wYWNrZXRfZGlzY2FyZF9tYWMgPSBtYWM7Ci0JaWYgKGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+aW5wdXQpID49IGRpc2NhcmQpCi0JCXBhY2tldF9zdG9wX2Rpc2NhcmQoKTsKLQlhY3RpdmVfc3RhdGUtPnBhY2tldF9kaXNjYXJkID0gZGlzY2FyZCAtCi0JICAgIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+aW5wdXQpOwotfQotCi0vKiBSZXR1cm5zIDEgaWYgcmVtb3RlIGhvc3QgaXMgY29ubmVjdGVkIHZpYSBzb2NrZXQsIDAgaWYgbm90LiAqLwotCi1pbnQKLXBhY2tldF9jb25uZWN0aW9uX2lzX29uX3NvY2tldCh2b2lkKQotewotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGZyb20sIHRvOwotCXNvY2tsZW5fdCBmcm9tbGVuLCB0b2xlbjsKLQotCS8qIGZpbGVkZXNjcmlwdG9ycyBpbiBhbmQgb3V0IGFyZSB0aGUgc2FtZSwgc28gaXQncyBhIHNvY2tldCAqLwotCWlmIChhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4gPT0gYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX291dCkKLQkJcmV0dXJuIDE7Ci0JZnJvbWxlbiA9IHNpemVvZihmcm9tKTsKLQltZW1zZXQoJmZyb20sIDAsIHNpemVvZihmcm9tKSk7Ci0JaWYgKGdldHBlZXJuYW1lKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbiwgKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tLAotCSAgICAmZnJvbWxlbikgPCAwKQotCQlyZXR1cm4gMDsKLQl0b2xlbiA9IHNpemVvZih0byk7Ci0JbWVtc2V0KCZ0bywgMCwgc2l6ZW9mKHRvKSk7Ci0JaWYgKGdldHBlZXJuYW1lKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmdG8sCi0JICAgICZ0b2xlbikgPCAwKQotCQlyZXR1cm4gMDsKLQlpZiAoZnJvbWxlbiAhPSB0b2xlbiB8fCBtZW1jbXAoJmZyb20sICZ0bywgZnJvbWxlbikgIT0gMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKGZyb20uc3NfZmFtaWx5ICE9IEFGX0lORVQgJiYgZnJvbS5zc19mYW1pbHkgIT0gQUZfSU5FVDYpCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCi0vKgotICogRXhwb3J0cyBhbiBJViBmcm9tIHRoZSBDaXBoZXJDb250ZXh0IHJlcXVpcmVkIHRvIGV4cG9ydCB0aGUga2V5Ci0gKiBzdGF0ZSBiYWNrIGZyb20gdGhlIHVucHJpdmlsZWdlZCBjaGlsZCB0byB0aGUgcHJpdmlsZWdlZCBwYXJlbnQKLSAqIHByb2Nlc3MuCi0gKi8KLQotdm9pZAotcGFja2V0X2dldF9rZXlpdihpbnQgbW9kZSwgdV9jaGFyICppdiwgdV9pbnQgbGVuKQotewotCUNpcGhlckNvbnRleHQgKmNjOwotCi0JaWYgKG1vZGUgPT0gTU9ERV9PVVQpCi0JCWNjID0gJmFjdGl2ZV9zdGF0ZS0+c2VuZF9jb250ZXh0OwotCWVsc2UKLQkJY2MgPSAmYWN0aXZlX3N0YXRlLT5yZWNlaXZlX2NvbnRleHQ7Ci0KLQljaXBoZXJfZ2V0X2tleWl2KGNjLCBpdiwgbGVuKTsKLX0KLQotaW50Ci1wYWNrZXRfZ2V0X2tleWNvbnRleHQoaW50IG1vZGUsIHVfY2hhciAqZGF0KQotewotCUNpcGhlckNvbnRleHQgKmNjOwotCi0JaWYgKG1vZGUgPT0gTU9ERV9PVVQpCi0JCWNjID0gJmFjdGl2ZV9zdGF0ZS0+c2VuZF9jb250ZXh0OwotCWVsc2UKLQkJY2MgPSAmYWN0aXZlX3N0YXRlLT5yZWNlaXZlX2NvbnRleHQ7Ci0KLQlyZXR1cm4gKGNpcGhlcl9nZXRfa2V5Y29udGV4dChjYywgZGF0KSk7Ci19Ci0KLXZvaWQKLXBhY2tldF9zZXRfa2V5Y29udGV4dChpbnQgbW9kZSwgdV9jaGFyICpkYXQpCi17Ci0JQ2lwaGVyQ29udGV4dCAqY2M7Ci0KLQlpZiAobW9kZSA9PSBNT0RFX09VVCkKLQkJY2MgPSAmYWN0aXZlX3N0YXRlLT5zZW5kX2NvbnRleHQ7Ci0JZWxzZQotCQljYyA9ICZhY3RpdmVfc3RhdGUtPnJlY2VpdmVfY29udGV4dDsKLQotCWNpcGhlcl9zZXRfa2V5Y29udGV4dChjYywgZGF0KTsKLX0KLQotaW50Ci1wYWNrZXRfZ2V0X2tleWl2X2xlbihpbnQgbW9kZSkKLXsKLQlDaXBoZXJDb250ZXh0ICpjYzsKLQotCWlmIChtb2RlID09IE1PREVfT1VUKQotCQljYyA9ICZhY3RpdmVfc3RhdGUtPnNlbmRfY29udGV4dDsKLQllbHNlCi0JCWNjID0gJmFjdGl2ZV9zdGF0ZS0+cmVjZWl2ZV9jb250ZXh0OwotCi0JcmV0dXJuIChjaXBoZXJfZ2V0X2tleWl2X2xlbihjYykpOwotfQotCi12b2lkCi1wYWNrZXRfc2V0X2l2KGludCBtb2RlLCB1X2NoYXIgKmRhdCkKLXsKLQlDaXBoZXJDb250ZXh0ICpjYzsKLQotCWlmIChtb2RlID09IE1PREVfT1VUKQotCQljYyA9ICZhY3RpdmVfc3RhdGUtPnNlbmRfY29udGV4dDsKLQllbHNlCi0JCWNjID0gJmFjdGl2ZV9zdGF0ZS0+cmVjZWl2ZV9jb250ZXh0OwotCi0JY2lwaGVyX3NldF9rZXlpdihjYywgZGF0KTsKLX0KLQotaW50Ci1wYWNrZXRfZ2V0X3NzaDFfY2lwaGVyKHZvaWQpCi17Ci0JcmV0dXJuIChjaXBoZXJfZ2V0X251bWJlcihhY3RpdmVfc3RhdGUtPnJlY2VpdmVfY29udGV4dC5jaXBoZXIpKTsKLX0KLQotdm9pZAotcGFja2V0X2dldF9zdGF0ZShpbnQgbW9kZSwgdV9pbnQzMl90ICpzZXFuciwgdV9pbnQ2NF90ICpibG9ja3MsCi0gICAgdV9pbnQzMl90ICpwYWNrZXRzLCB1X2ludDY0X3QgKmJ5dGVzKQotewotCXN0cnVjdCBwYWNrZXRfc3RhdGUgKnN0YXRlOwotCi0Jc3RhdGUgPSAobW9kZSA9PSBNT0RFX0lOKSA/Ci0JICAgICZhY3RpdmVfc3RhdGUtPnBfcmVhZCA6ICZhY3RpdmVfc3RhdGUtPnBfc2VuZDsKLQlpZiAoc2VxbnIpCi0JCSpzZXFuciA9IHN0YXRlLT5zZXFucjsKLQlpZiAoYmxvY2tzKQotCQkqYmxvY2tzID0gc3RhdGUtPmJsb2NrczsKLQlpZiAocGFja2V0cykKLQkJKnBhY2tldHMgPSBzdGF0ZS0+cGFja2V0czsKLQlpZiAoYnl0ZXMpCi0JCSpieXRlcyA9IHN0YXRlLT5ieXRlczsKLX0KLQotdm9pZAotcGFja2V0X3NldF9zdGF0ZShpbnQgbW9kZSwgdV9pbnQzMl90IHNlcW5yLCB1X2ludDY0X3QgYmxvY2tzLCB1X2ludDMyX3QgcGFja2V0cywKLSAgICB1X2ludDY0X3QgYnl0ZXMpCi17Ci0Jc3RydWN0IHBhY2tldF9zdGF0ZSAqc3RhdGU7Ci0KLQlzdGF0ZSA9IChtb2RlID09IE1PREVfSU4pID8KLQkgICAgJmFjdGl2ZV9zdGF0ZS0+cF9yZWFkIDogJmFjdGl2ZV9zdGF0ZS0+cF9zZW5kOwotCXN0YXRlLT5zZXFuciA9IHNlcW5yOwotCXN0YXRlLT5ibG9ja3MgPSBibG9ja3M7Ci0Jc3RhdGUtPnBhY2tldHMgPSBwYWNrZXRzOwotCXN0YXRlLT5ieXRlcyA9IGJ5dGVzOwotfQotCi1zdGF0aWMgaW50Ci1wYWNrZXRfY29ubmVjdGlvbl9hZih2b2lkKQotewotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHRvOwotCXNvY2tsZW5fdCB0b2xlbiA9IHNpemVvZih0byk7Ci0KLQltZW1zZXQoJnRvLCAwLCBzaXplb2YodG8pKTsKLQlpZiAoZ2V0c29ja25hbWUoYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX291dCwgKHN0cnVjdCBzb2NrYWRkciAqKSZ0bywKLQkgICAgJnRvbGVuKSA8IDApCi0JCXJldHVybiAwOwotCWlmICh0by5zc19mYW1pbHkgPT0gQUZfSU5FVCkKLQkJcmV0dXJuIDE7Ci0jaWZkZWYgSVBWNF9JTl9JUFY2Ci0JaWYgKHRvLnNzX2ZhbWlseSA9PSBBRl9JTkVUNiAmJgotCSAgICBJTjZfSVNfQUREUl9WNE1BUFBFRCgmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnRvKS0+c2luNl9hZGRyKSkKLQkJcmV0dXJuIEFGX0lORVQ7Ci0jZW5kaWYKLQlyZXR1cm4gdG8uc3NfZmFtaWx5OwotfQotCi0vKiBTZXRzIHRoZSBjb25uZWN0aW9uIGludG8gbm9uLWJsb2NraW5nIG1vZGUuICovCi0KLXZvaWQKLXBhY2tldF9zZXRfbm9uYmxvY2tpbmcodm9pZCkKLXsKLQkvKiBTZXQgdGhlIHNvY2tldCBpbnRvIG5vbi1ibG9ja2luZyBtb2RlLiAqLwotCXNldF9ub25ibG9jayhhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4pOwotCi0JaWYgKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQgIT0gYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX2luKQotCQlzZXRfbm9uYmxvY2soYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX291dCk7Ci19Ci0KLS8qIFJldHVybnMgdGhlIHNvY2tldCB1c2VkIGZvciByZWFkaW5nLiAqLwotCi1pbnQKLXBhY2tldF9nZXRfY29ubmVjdGlvbl9pbih2b2lkKQotewotCXJldHVybiBhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW47Ci19Ci0KLS8qIFJldHVybnMgdGhlIGRlc2NyaXB0b3IgdXNlZCBmb3Igd3JpdGluZy4gKi8KLQotaW50Ci1wYWNrZXRfZ2V0X2Nvbm5lY3Rpb25fb3V0KHZvaWQpCi17Ci0JcmV0dXJuIGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQ7Ci19Ci0KLS8qIENsb3NlcyB0aGUgY29ubmVjdGlvbiBhbmQgY2xlYXJzIGFuZCBmcmVlcyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuICovCi0KLXZvaWQKLXBhY2tldF9jbG9zZSh2b2lkKQotewotCWlmICghYWN0aXZlX3N0YXRlLT5pbml0aWFsaXplZCkKLQkJcmV0dXJuOwotCWFjdGl2ZV9zdGF0ZS0+aW5pdGlhbGl6ZWQgPSAwOwotCWlmIChhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4gPT0gYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX291dCkgewotCQlzaHV0ZG93bihhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25fb3V0LCBTSFVUX1JEV1IpOwotCQljbG9zZShhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25fb3V0KTsKLQl9IGVsc2UgewotCQljbG9zZShhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4pOwotCQljbG9zZShhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25fb3V0KTsKLQl9Ci0JYnVmZmVyX2ZyZWUoJmFjdGl2ZV9zdGF0ZS0+aW5wdXQpOwotCWJ1ZmZlcl9mcmVlKCZhY3RpdmVfc3RhdGUtPm91dHB1dCk7Ci0JYnVmZmVyX2ZyZWUoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KTsKLQlidWZmZXJfZnJlZSgmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpOwotCWlmIChhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcl9yZWFkeSkgewotCQlidWZmZXJfZnJlZSgmYWN0aXZlX3N0YXRlLT5jb21wcmVzc2lvbl9idWZmZXIpOwotCQlidWZmZXJfY29tcHJlc3NfdW5pbml0KCk7Ci0JfQotCWNpcGhlcl9jbGVhbnVwKCZhY3RpdmVfc3RhdGUtPnNlbmRfY29udGV4dCk7Ci0JY2lwaGVyX2NsZWFudXAoJmFjdGl2ZV9zdGF0ZS0+cmVjZWl2ZV9jb250ZXh0KTsKLX0KLQotLyogU2V0cyByZW1vdGUgc2lkZSBwcm90b2NvbCBmbGFncy4gKi8KLQotdm9pZAotcGFja2V0X3NldF9wcm90b2NvbF9mbGFncyh1X2ludCBwcm90b2NvbF9mbGFncykKLXsKLQlhY3RpdmVfc3RhdGUtPnJlbW90ZV9wcm90b2NvbF9mbGFncyA9IHByb3RvY29sX2ZsYWdzOwotfQotCi0vKiBSZXR1cm5zIHRoZSByZW1vdGUgcHJvdG9jb2wgZmxhZ3Mgc2V0IGVhcmxpZXIgYnkgdGhlIGFib3ZlIGZ1bmN0aW9uLiAqLwotCi11X2ludAotcGFja2V0X2dldF9wcm90b2NvbF9mbGFncyh2b2lkKQotewotCXJldHVybiBhY3RpdmVfc3RhdGUtPnJlbW90ZV9wcm90b2NvbF9mbGFnczsKLX0KLQotLyoKLSAqIFN0YXJ0cyBwYWNrZXQgY29tcHJlc3Npb24gZnJvbSB0aGUgbmV4dCBwYWNrZXQgb24gaW4gYm90aCBkaXJlY3Rpb25zLgotICogTGV2ZWwgaXMgY29tcHJlc3Npb24gbGV2ZWwgMSAoZmFzdGVzdCkgLSA5IChzbG93LCBiZXN0KSBhcyBpbiBnemlwLgotICovCi0KLXN0YXRpYyB2b2lkCi1wYWNrZXRfaW5pdF9jb21wcmVzc2lvbih2b2lkKQotewotCWlmIChhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcl9yZWFkeSA9PSAxKQotCQlyZXR1cm47Ci0JYWN0aXZlX3N0YXRlLT5jb21wcmVzc2lvbl9idWZmZXJfcmVhZHkgPSAxOwotCWJ1ZmZlcl9pbml0KCZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcik7Ci19Ci0KLXZvaWQKLXBhY2tldF9zdGFydF9jb21wcmVzc2lvbihpbnQgbGV2ZWwpCi17Ci0JaWYgKGFjdGl2ZV9zdGF0ZS0+cGFja2V0X2NvbXByZXNzaW9uICYmICFjb21wYXQyMCkKLQkJZmF0YWwoIkNvbXByZXNzaW9uIGFscmVhZHkgZW5hYmxlZC4iKTsKLQlhY3RpdmVfc3RhdGUtPnBhY2tldF9jb21wcmVzc2lvbiA9IDE7Ci0JcGFja2V0X2luaXRfY29tcHJlc3Npb24oKTsKLQlidWZmZXJfY29tcHJlc3NfaW5pdF9zZW5kKGxldmVsKTsKLQlidWZmZXJfY29tcHJlc3NfaW5pdF9yZWN2KCk7Ci19Ci0KLS8qCi0gKiBDYXVzZXMgYW55IGZ1cnRoZXIgcGFja2V0cyB0byBiZSBlbmNyeXB0ZWQgdXNpbmcgdGhlIGdpdmVuIGtleS4gIFRoZSBzYW1lCi0gKiBrZXkgaXMgdXNlZCBmb3IgYm90aCBzZW5kaW5nIGFuZCByZWNlcHRpb24uICBIb3dldmVyLCBib3RoIGRpcmVjdGlvbnMgYXJlCi0gKiBlbmNyeXB0ZWQgaW5kZXBlbmRlbnRseSBvZiBlYWNoIG90aGVyLgotICovCi0KLXZvaWQKLXBhY2tldF9zZXRfZW5jcnlwdGlvbl9rZXkoY29uc3QgdV9jaGFyICprZXksIHVfaW50IGtleWxlbiwgaW50IG51bWJlcikKLXsKLQlDaXBoZXIgKmNpcGhlciA9IGNpcGhlcl9ieV9udW1iZXIobnVtYmVyKTsKLQotCWlmIChjaXBoZXIgPT0gTlVMTCkKLQkJZmF0YWwoInBhY2tldF9zZXRfZW5jcnlwdGlvbl9rZXk6IHVua25vd24gY2lwaGVyIG51bWJlciAlZCIsIG51bWJlcik7Ci0JaWYgKGtleWxlbiA8IDIwKQotCQlmYXRhbCgicGFja2V0X3NldF9lbmNyeXB0aW9uX2tleToga2V5bGVuIHRvbyBzbWFsbDogJWQiLCBrZXlsZW4pOwotCWlmIChrZXlsZW4gPiBTU0hfU0VTU0lPTl9LRVlfTEVOR1RIKQotCQlmYXRhbCgicGFja2V0X3NldF9lbmNyeXB0aW9uX2tleToga2V5bGVuIHRvbyBiaWc6ICVkIiwga2V5bGVuKTsKLQltZW1jcHkoYWN0aXZlX3N0YXRlLT5zc2gxX2tleSwga2V5LCBrZXlsZW4pOwotCWFjdGl2ZV9zdGF0ZS0+c3NoMV9rZXlsZW4gPSBrZXlsZW47Ci0JY2lwaGVyX2luaXQoJmFjdGl2ZV9zdGF0ZS0+c2VuZF9jb250ZXh0LCBjaXBoZXIsIGtleSwga2V5bGVuLCBOVUxMLAotCSAgICAwLCBDSVBIRVJfRU5DUllQVCk7Ci0JY2lwaGVyX2luaXQoJmFjdGl2ZV9zdGF0ZS0+cmVjZWl2ZV9jb250ZXh0LCBjaXBoZXIsIGtleSwga2V5bGVuLCBOVUxMLAotCSAgICAwLCBDSVBIRVJfREVDUllQVCk7Ci19Ci0KLXVfaW50Ci1wYWNrZXRfZ2V0X2VuY3J5cHRpb25fa2V5KHVfY2hhciAqa2V5KQotewotCWlmIChrZXkgPT0gTlVMTCkKLQkJcmV0dXJuIChhY3RpdmVfc3RhdGUtPnNzaDFfa2V5bGVuKTsKLQltZW1jcHkoa2V5LCBhY3RpdmVfc3RhdGUtPnNzaDFfa2V5LCBhY3RpdmVfc3RhdGUtPnNzaDFfa2V5bGVuKTsKLQlyZXR1cm4gKGFjdGl2ZV9zdGF0ZS0+c3NoMV9rZXlsZW4pOwotfQotCi0vKiBTdGFydCBjb25zdHJ1Y3RpbmcgYSBwYWNrZXQgdG8gc2VuZC4gKi8KLXZvaWQKLXBhY2tldF9zdGFydCh1X2NoYXIgdHlwZSkKLXsKLQl1X2NoYXIgYnVmWzldOwotCWludCBsZW47Ci0KLQlEQkcoZGVidWcoInBhY2tldF9zdGFydFslZF0iLCB0eXBlKSk7Ci0JbGVuID0gY29tcGF0MjAgPyA2IDogOTsKLQltZW1zZXQoYnVmLCAwLCBsZW4gLSAxKTsKLQlidWZbbGVuIC0gMV0gPSB0eXBlOwotCWJ1ZmZlcl9jbGVhcigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpOwotCWJ1ZmZlcl9hcHBlbmQoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCBidWYsIGxlbik7Ci19Ci0KLS8qIEFwcGVuZCBwYXlsb2FkLiAqLwotdm9pZAotcGFja2V0X3B1dF9jaGFyKGludCB2YWx1ZSkKLXsKLQljaGFyIGNoID0gdmFsdWU7Ci0KLQlidWZmZXJfYXBwZW5kKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwgJmNoLCAxKTsKLX0KLQotdm9pZAotcGFja2V0X3B1dF9pbnQodV9pbnQgdmFsdWUpCi17Ci0JYnVmZmVyX3B1dF9pbnQoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCB2YWx1ZSk7Ci19Ci0KLXZvaWQKLXBhY2tldF9wdXRfaW50NjQodV9pbnQ2NF90IHZhbHVlKQotewotCWJ1ZmZlcl9wdXRfaW50NjQoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCB2YWx1ZSk7Ci19Ci0KLXZvaWQKLXBhY2tldF9wdXRfc3RyaW5nKGNvbnN0IHZvaWQgKmJ1ZiwgdV9pbnQgbGVuKQotewotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwgYnVmLCBsZW4pOwotfQotCi12b2lkCi1wYWNrZXRfcHV0X2NzdHJpbmcoY29uc3QgY2hhciAqc3RyKQotewotCWJ1ZmZlcl9wdXRfY3N0cmluZygmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsIHN0cik7Ci19Ci0KLXZvaWQKLXBhY2tldF9wdXRfcmF3KGNvbnN0IHZvaWQgKmJ1ZiwgdV9pbnQgbGVuKQotewotCWJ1ZmZlcl9hcHBlbmQoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCBidWYsIGxlbik7Ci19Ci0KLXZvaWQKLXBhY2tldF9wdXRfYmlnbnVtKEJJR05VTSAqIHZhbHVlKQotewotCWJ1ZmZlcl9wdXRfYmlnbnVtKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwgdmFsdWUpOwotfQotCi12b2lkCi1wYWNrZXRfcHV0X2JpZ251bTIoQklHTlVNICogdmFsdWUpCi17Ci0JYnVmZmVyX3B1dF9iaWdudW0yKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwgdmFsdWUpOwotfQotCi0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi12b2lkCi1wYWNrZXRfcHV0X2VjcG9pbnQoY29uc3QgRUNfR1JPVVAgKmN1cnZlLCBjb25zdCBFQ19QT0lOVCAqcG9pbnQpCi17Ci0JYnVmZmVyX3B1dF9lY3BvaW50KCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwgY3VydmUsIHBvaW50KTsKLX0KLSNlbmRpZgotCi0vKgotICogRmluYWxpemVzIGFuZCBzZW5kcyB0aGUgcGFja2V0LiAgSWYgdGhlIGVuY3J5cHRpb24ga2V5IGhhcyBiZWVuIHNldCwKLSAqIGVuY3J5cHRzIHRoZSBwYWNrZXQgYmVmb3JlIHNlbmRpbmcuCi0gKi8KLQotc3RhdGljIHZvaWQKLXBhY2tldF9zZW5kMSh2b2lkKQotewotCXVfY2hhciBidWZbOF0sICpjcDsKLQlpbnQgaSwgcGFkZGluZywgbGVuOwotCXVfaW50IGNoZWNrc3VtOwotCXVfaW50MzJfdCBybmQgPSAwOwotCi0JLyoKLQkgKiBJZiB1c2luZyBwYWNrZXQgY29tcHJlc3Npb24sIGNvbXByZXNzIHRoZSBwYXlsb2FkIG9mIHRoZSBvdXRnb2luZwotCSAqIHBhY2tldC4KLQkgKi8KLQlpZiAoYWN0aXZlX3N0YXRlLT5wYWNrZXRfY29tcHJlc3Npb24pIHsKLQkJYnVmZmVyX2NsZWFyKCZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcik7Ci0JCS8qIFNraXAgcGFkZGluZy4gKi8KLQkJYnVmZmVyX2NvbnN1bWUoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCA4KTsKLQkJLyogcGFkZGluZyAqLwotCQlidWZmZXJfYXBwZW5kKCZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlciwKLQkJICAgICJcMFwwXDBcMFwwXDBcMFwwIiwgOCk7Ci0JCWJ1ZmZlcl9jb21wcmVzcygmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsCi0JCSAgICAmYWN0aXZlX3N0YXRlLT5jb21wcmVzc2lvbl9idWZmZXIpOwotCQlidWZmZXJfY2xlYXIoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KTsKLQkJYnVmZmVyX2FwcGVuZCgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsCi0JCSAgICBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlciksCi0JCSAgICBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcikpOwotCX0KLQkvKiBDb21wdXRlIHBhY2tldCBsZW5ndGggd2l0aG91dCBwYWRkaW5nIChhZGQgY2hlY2tzdW0sIHJlbW92ZSBwYWRkaW5nKS4gKi8KLQlsZW4gPSBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCkgKyA0IC0gODsKLQotCS8qIEluc2VydCBwYWRkaW5nLiBJbml0aWFsaXplZCB0byB6ZXJvIGluIHBhY2tldF9zdGFydDEoKSAqLwotCXBhZGRpbmcgPSA4IC0gbGVuICUgODsKLQlpZiAoIWFjdGl2ZV9zdGF0ZS0+c2VuZF9jb250ZXh0LnBsYWludGV4dCkgewotCQljcCA9IGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KTsKLQkJZm9yIChpID0gMDsgaSA8IHBhZGRpbmc7IGkrKykgewotCQkJaWYgKGkgJSA0ID09IDApCi0JCQkJcm5kID0gYXJjNHJhbmRvbSgpOwotCQkJY3BbNyAtIGldID0gcm5kICYgMHhmZjsKLQkJCXJuZCA+Pj0gODsKLQkJfQotCX0KLQlidWZmZXJfY29uc3VtZSgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsIDggLSBwYWRkaW5nKTsKLQotCS8qIEFkZCBjaGVjayBieXRlcy4gKi8KLQljaGVja3N1bSA9IHNzaF9jcmMzMihidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCksCi0JICAgIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KSk7Ci0JcHV0X3UzMihidWYsIGNoZWNrc3VtKTsKLQlidWZmZXJfYXBwZW5kKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwgYnVmLCA0KTsKLQotI2lmZGVmIFBBQ0tFVF9ERUJVRwotCWZwcmludGYoc3RkZXJyLCAicGFja2V0X3NlbmQgcGxhaW46ICIpOwotCWJ1ZmZlcl9kdW1wKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCk7Ci0jZW5kaWYKLQotCS8qIEFwcGVuZCB0byBvdXRwdXQuICovCi0JcHV0X3UzMihidWYsIGxlbik7Ci0JYnVmZmVyX2FwcGVuZCgmYWN0aXZlX3N0YXRlLT5vdXRwdXQsIGJ1ZiwgNCk7Ci0JY3AgPSBidWZmZXJfYXBwZW5kX3NwYWNlKCZhY3RpdmVfc3RhdGUtPm91dHB1dCwKLQkgICAgYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpKTsKLQljaXBoZXJfY3J5cHQoJmFjdGl2ZV9zdGF0ZS0+c2VuZF9jb250ZXh0LCBjcCwKLQkgICAgYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpLAotCSAgICBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCkpOwotCi0jaWZkZWYgUEFDS0VUX0RFQlVHCi0JZnByaW50ZihzdGRlcnIsICJlbmNyeXB0ZWQ6ICIpOwotCWJ1ZmZlcl9kdW1wKCZhY3RpdmVfc3RhdGUtPm91dHB1dCk7Ci0jZW5kaWYKLQlhY3RpdmVfc3RhdGUtPnBfc2VuZC5wYWNrZXRzKys7Ci0JYWN0aXZlX3N0YXRlLT5wX3NlbmQuYnl0ZXMgKz0gbGVuICsKLQkgICAgYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpOwotCWJ1ZmZlcl9jbGVhcigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpOwotCi0JLyoKLQkgKiBOb3RlIHRoYXQgdGhlIHBhY2tldCBpcyBub3cgb25seSBidWZmZXJlZCBpbiBvdXRwdXQuICBJdCB3b24ndCBiZQotCSAqIGFjdHVhbGx5IHNlbnQgdW50aWwgcGFja2V0X3dyaXRlX3dhaXQgb3IgcGFja2V0X3dyaXRlX3BvbGwgaXMKLQkgKiBjYWxsZWQuCi0JICovCi19Ci0KLXZvaWQKLXNldF9uZXdrZXlzKGludCBtb2RlKQotewotCUVuYyAqZW5jOwotCU1hYyAqbWFjOwotCUNvbXAgKmNvbXA7Ci0JQ2lwaGVyQ29udGV4dCAqY2M7Ci0JdV9pbnQ2NF90ICptYXhfYmxvY2tzOwotCWludCBjcnlwdF90eXBlOwotCi0JZGVidWcyKCJzZXRfbmV3a2V5czogbW9kZSAlZCIsIG1vZGUpOwotCi0JaWYgKG1vZGUgPT0gTU9ERV9PVVQpIHsKLQkJY2MgPSAmYWN0aXZlX3N0YXRlLT5zZW5kX2NvbnRleHQ7Ci0JCWNyeXB0X3R5cGUgPSBDSVBIRVJfRU5DUllQVDsKLQkJYWN0aXZlX3N0YXRlLT5wX3NlbmQucGFja2V0cyA9IGFjdGl2ZV9zdGF0ZS0+cF9zZW5kLmJsb2NrcyA9IDA7Ci0JCW1heF9ibG9ja3MgPSAmYWN0aXZlX3N0YXRlLT5tYXhfYmxvY2tzX291dDsKLQl9IGVsc2UgewotCQljYyA9ICZhY3RpdmVfc3RhdGUtPnJlY2VpdmVfY29udGV4dDsKLQkJY3J5cHRfdHlwZSA9IENJUEhFUl9ERUNSWVBUOwotCQlhY3RpdmVfc3RhdGUtPnBfcmVhZC5wYWNrZXRzID0gYWN0aXZlX3N0YXRlLT5wX3JlYWQuYmxvY2tzID0gMDsKLQkJbWF4X2Jsb2NrcyA9ICZhY3RpdmVfc3RhdGUtPm1heF9ibG9ja3NfaW47Ci0JfQotCWlmIChhY3RpdmVfc3RhdGUtPm5ld2tleXNbbW9kZV0gIT0gTlVMTCkgewotCQlkZWJ1Zygic2V0X25ld2tleXM6IHJla2V5aW5nIik7Ci0JCWNpcGhlcl9jbGVhbnVwKGNjKTsKLQkJZW5jICA9ICZhY3RpdmVfc3RhdGUtPm5ld2tleXNbbW9kZV0tPmVuYzsKLQkJbWFjICA9ICZhY3RpdmVfc3RhdGUtPm5ld2tleXNbbW9kZV0tPm1hYzsKLQkJY29tcCA9ICZhY3RpdmVfc3RhdGUtPm5ld2tleXNbbW9kZV0tPmNvbXA7Ci0JCW1hY19jbGVhcihtYWMpOwotCQl4ZnJlZShlbmMtPm5hbWUpOwotCQl4ZnJlZShlbmMtPml2KTsKLQkJeGZyZWUoZW5jLT5rZXkpOwotCQl4ZnJlZShtYWMtPm5hbWUpOwotCQl4ZnJlZShtYWMtPmtleSk7Ci0JCXhmcmVlKGNvbXAtPm5hbWUpOwotCQl4ZnJlZShhY3RpdmVfc3RhdGUtPm5ld2tleXNbbW9kZV0pOwotCX0KLQlhY3RpdmVfc3RhdGUtPm5ld2tleXNbbW9kZV0gPSBrZXhfZ2V0X25ld2tleXMobW9kZSk7Ci0JaWYgKGFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1ttb2RlXSA9PSBOVUxMKQotCQlmYXRhbCgibmV3a2V5czogbm8ga2V5cyBmb3IgbW9kZSAlZCIsIG1vZGUpOwotCWVuYyAgPSAmYWN0aXZlX3N0YXRlLT5uZXdrZXlzW21vZGVdLT5lbmM7Ci0JbWFjICA9ICZhY3RpdmVfc3RhdGUtPm5ld2tleXNbbW9kZV0tPm1hYzsKLQljb21wID0gJmFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1ttb2RlXS0+Y29tcDsKLQlpZiAobWFjX2luaXQobWFjKSA9PSAwKQotCQltYWMtPmVuYWJsZWQgPSAxOwotCURCRyhkZWJ1ZygiY2lwaGVyX2luaXRfY29udGV4dDogJWQiLCBtb2RlKSk7Ci0JY2lwaGVyX2luaXQoY2MsIGVuYy0+Y2lwaGVyLCBlbmMtPmtleSwgZW5jLT5rZXlfbGVuLAotCSAgICBlbmMtPml2LCBlbmMtPmJsb2NrX3NpemUsIGNyeXB0X3R5cGUpOwotCS8qIERlbGV0aW5nIHRoZSBrZXlzIGRvZXMgbm90IGdhaW4gZXh0cmEgc2VjdXJpdHkgKi8KLQkvKiBtZW1zZXQoZW5jLT5pdiwgIDAsIGVuYy0+YmxvY2tfc2l6ZSk7Ci0JICAgbWVtc2V0KGVuYy0+a2V5LCAwLCBlbmMtPmtleV9sZW4pOwotCSAgIG1lbXNldChtYWMtPmtleSwgMCwgbWFjLT5rZXlfbGVuKTsgKi8KLQlpZiAoKGNvbXAtPnR5cGUgPT0gQ09NUF9aTElCIHx8Ci0JICAgIChjb21wLT50eXBlID09IENPTVBfREVMQVlFRCAmJgotCSAgICAgYWN0aXZlX3N0YXRlLT5hZnRlcl9hdXRoZW50aWNhdGlvbikpICYmIGNvbXAtPmVuYWJsZWQgPT0gMCkgewotCQlwYWNrZXRfaW5pdF9jb21wcmVzc2lvbigpOwotCQlpZiAobW9kZSA9PSBNT0RFX09VVCkKLQkJCWJ1ZmZlcl9jb21wcmVzc19pbml0X3NlbmQoNik7Ci0JCWVsc2UKLQkJCWJ1ZmZlcl9jb21wcmVzc19pbml0X3JlY3YoKTsKLQkJY29tcC0+ZW5hYmxlZCA9IDE7Ci0JfQotCS8qCi0JICogVGhlIDJeKGJsb2Nrc2l6ZSoyKSBsaW1pdCBpcyB0b28gZXhwZW5zaXZlIGZvciAzREVTLAotCSAqIGJsb3dmaXNoLCBldGMsIHNvIGVuZm9yY2UgYSAxR0IgbGltaXQgZm9yIHNtYWxsIGJsb2Nrc2l6ZXMuCi0JICovCi0JaWYgKGVuYy0+YmxvY2tfc2l6ZSA+PSAxNikKLQkJKm1heF9ibG9ja3MgPSAodV9pbnQ2NF90KTEgPDwgKGVuYy0+YmxvY2tfc2l6ZSoyKTsKLQllbHNlCi0JCSptYXhfYmxvY2tzID0gKCh1X2ludDY0X3QpMSA8PCAzMCkgLyBlbmMtPmJsb2NrX3NpemU7Ci0JaWYgKGFjdGl2ZV9zdGF0ZS0+cmVrZXlfbGltaXQpCi0JCSptYXhfYmxvY2tzID0gTUlOKCptYXhfYmxvY2tzLAotCQkgICAgYWN0aXZlX3N0YXRlLT5yZWtleV9saW1pdCAvIGVuYy0+YmxvY2tfc2l6ZSk7Ci19Ci0KLS8qCi0gKiBEZWxheWVkIGNvbXByZXNzaW9uIGZvciBTU0gyIGlzIGVuYWJsZWQgYWZ0ZXIgYXV0aGVudGljYXRpb246Ci0gKiBUaGlzIGhhcHBlbnMgb24gdGhlIHNlcnZlciBzaWRlIGFmdGVyIGEgU1NIMl9NU0dfVVNFUkFVVEhfU1VDQ0VTUyBpcyBzZW50LAotICogYW5kIG9uIHRoZSBjbGllbnQgc2lkZSBhZnRlciBhIFNTSDJfTVNHX1VTRVJBVVRIX1NVQ0NFU1MgaXMgcmVjZWl2ZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1wYWNrZXRfZW5hYmxlX2RlbGF5ZWRfY29tcHJlc3Modm9pZCkKLXsKLQlDb21wICpjb21wID0gTlVMTDsKLQlpbnQgbW9kZTsKLQotCS8qCi0JICogUmVtZW1iZXIgdGhhdCB3ZSBhcmUgcGFzdCB0aGUgYXV0aGVudGljYXRpb24gc3RlcCwgc28gcmVrZXlpbmcKLQkgKiB3aXRoIENPTVBfREVMQVlFRCB3aWxsIHR1cm4gb24gY29tcHJlc3Npb24gaW1tZWRpYXRlbHkuCi0JICovCi0JYWN0aXZlX3N0YXRlLT5hZnRlcl9hdXRoZW50aWNhdGlvbiA9IDE7Ci0JZm9yIChtb2RlID0gMDsgbW9kZSA8IE1PREVfTUFYOyBtb2RlKyspIHsKLQkJLyogcHJvdG9jb2wgZXJyb3I6IFVTRVJBVVRIX1NVQ0NFU1MgcmVjZWl2ZWQgYmVmb3JlIE5FV0tFWVMgKi8KLQkJaWYgKGFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1ttb2RlXSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCWNvbXAgPSAmYWN0aXZlX3N0YXRlLT5uZXdrZXlzW21vZGVdLT5jb21wOwotCQlpZiAoY29tcCAmJiAhY29tcC0+ZW5hYmxlZCAmJiBjb21wLT50eXBlID09IENPTVBfREVMQVlFRCkgewotCQkJcGFja2V0X2luaXRfY29tcHJlc3Npb24oKTsKLQkJCWlmIChtb2RlID09IE1PREVfT1VUKQotCQkJCWJ1ZmZlcl9jb21wcmVzc19pbml0X3NlbmQoNik7Ci0JCQllbHNlCi0JCQkJYnVmZmVyX2NvbXByZXNzX2luaXRfcmVjdigpOwotCQkJY29tcC0+ZW5hYmxlZCA9IDE7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBGaW5hbGl6ZSBwYWNrZXQgaW4gU1NIMiBmb3JtYXQgKGNvbXByZXNzLCBtYWMsIGVuY3J5cHQsIGVucXVldWUpCi0gKi8KLXN0YXRpYyB2b2lkCi1wYWNrZXRfc2VuZDJfd3JhcHBlZCh2b2lkKQotewotCXVfY2hhciB0eXBlLCAqY3AsICptYWNidWYgPSBOVUxMOwotCXVfY2hhciBwYWRsZW4sIHBhZDsKLQl1X2ludCBwYWNrZXRfbGVuZ3RoID0gMDsKLQl1X2ludCBpLCBsZW47Ci0JdV9pbnQzMl90IHJuZCA9IDA7Ci0JRW5jICplbmMgICA9IE5VTEw7Ci0JTWFjICptYWMgICA9IE5VTEw7Ci0JQ29tcCAqY29tcCA9IE5VTEw7Ci0JaW50IGJsb2NrX3NpemU7Ci0KLQlpZiAoYWN0aXZlX3N0YXRlLT5uZXdrZXlzW01PREVfT1VUXSAhPSBOVUxMKSB7Ci0JCWVuYyAgPSAmYWN0aXZlX3N0YXRlLT5uZXdrZXlzW01PREVfT1VUXS0+ZW5jOwotCQltYWMgID0gJmFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1tNT0RFX09VVF0tPm1hYzsKLQkJY29tcCA9ICZhY3RpdmVfc3RhdGUtPm5ld2tleXNbTU9ERV9PVVRdLT5jb21wOwotCX0KLQlibG9ja19zaXplID0gZW5jID8gZW5jLT5ibG9ja19zaXplIDogODsKLQotCWNwID0gYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpOwotCXR5cGUgPSBjcFs1XTsKLQotI2lmZGVmIFBBQ0tFVF9ERUJVRwotCWZwcmludGYoc3RkZXJyLCAicGxhaW46ICAgICAiKTsKLQlidWZmZXJfZHVtcCgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpOwotI2VuZGlmCi0KLQlpZiAoY29tcCAmJiBjb21wLT5lbmFibGVkKSB7Ci0JCWxlbiA9IGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KTsKLQkJLyogc2tpcCBoZWFkZXIsIGNvbXByZXNzIG9ubHkgcGF5bG9hZCAqLwotCQlidWZmZXJfY29uc3VtZSgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsIDUpOwotCQlidWZmZXJfY2xlYXIoJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKTsKLQkJYnVmZmVyX2NvbXByZXNzKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwKLQkJICAgICZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcik7Ci0JCWJ1ZmZlcl9jbGVhcigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpOwotCQlidWZmZXJfYXBwZW5kKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCwgIlwwXDBcMFwwXDAiLCA1KTsKLQkJYnVmZmVyX2FwcGVuZCgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQsCi0JCSAgICBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlciksCi0JCSAgICBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcikpOwotCQlEQkcoZGVidWcoImNvbXByZXNzaW9uOiByYXcgJWQgY29tcHJlc3NlZCAlZCIsIGxlbiwKLQkJICAgIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KSkpOwotCX0KLQotCS8qIHNpemVvZiAocGFja2V0X2xlbiArIHBhZF9sZW4gKyBwYXlsb2FkKSAqLwotCWxlbiA9IGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KTsKLQotCS8qCi0JICogY2FsYyBzaXplIG9mIHBhZGRpbmcsIGFsbG9jIHNwYWNlLCBnZXQgcmFuZG9tIGRhdGEsCi0JICogbWluaW11bSBwYWRkaW5nIGlzIDQgYnl0ZXMKLQkgKi8KLQlwYWRsZW4gPSBibG9ja19zaXplIC0gKGxlbiAlIGJsb2NrX3NpemUpOwotCWlmIChwYWRsZW4gPCA0KQotCQlwYWRsZW4gKz0gYmxvY2tfc2l6ZTsKLQlpZiAoYWN0aXZlX3N0YXRlLT5leHRyYV9wYWQpIHsKLQkJLyogd2lsbCB3cmFwIGlmIGV4dHJhX3BhZCtwYWRsZW4gPiAyNTUgKi8KLQkJYWN0aXZlX3N0YXRlLT5leHRyYV9wYWQgPQotCQkgICAgcm91bmR1cChhY3RpdmVfc3RhdGUtPmV4dHJhX3BhZCwgYmxvY2tfc2l6ZSk7Ci0JCXBhZCA9IGFjdGl2ZV9zdGF0ZS0+ZXh0cmFfcGFkIC0KLQkJICAgICgobGVuICsgcGFkbGVuKSAlIGFjdGl2ZV9zdGF0ZS0+ZXh0cmFfcGFkKTsKLQkJZGVidWczKCJwYWNrZXRfc2VuZDI6IGFkZGluZyAlZCAobGVuICVkIHBhZGxlbiAlZCBleHRyYV9wYWQgJWQpIiwKLQkJICAgIHBhZCwgbGVuLCBwYWRsZW4sIGFjdGl2ZV9zdGF0ZS0+ZXh0cmFfcGFkKTsKLQkJcGFkbGVuICs9IHBhZDsKLQkJYWN0aXZlX3N0YXRlLT5leHRyYV9wYWQgPSAwOwotCX0KLQljcCA9IGJ1ZmZlcl9hcHBlbmRfc3BhY2UoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCBwYWRsZW4pOwotCWlmIChlbmMgJiYgIWFjdGl2ZV9zdGF0ZS0+c2VuZF9jb250ZXh0LnBsYWludGV4dCkgewotCQkvKiByYW5kb20gcGFkZGluZyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgcGFkbGVuOyBpKyspIHsKLQkJCWlmIChpICUgNCA9PSAwKQotCQkJCXJuZCA9IGFyYzRyYW5kb20oKTsKLQkJCWNwW2ldID0gcm5kICYgMHhmZjsKLQkJCXJuZCA+Pj0gODsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIGNsZWFyIHBhZGRpbmcgKi8KLQkJbWVtc2V0KGNwLCAwLCBwYWRsZW4pOwotCX0KLQkvKiBwYWNrZXRfbGVuZ3RoIGluY2x1ZGVzIHBheWxvYWQsIHBhZGRpbmcgYW5kIHBhZGRpbmcgbGVuZ3RoIGZpZWxkICovCi0JcGFja2V0X2xlbmd0aCA9IGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KSAtIDQ7Ci0JY3AgPSBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCk7Ci0JcHV0X3UzMihjcCwgcGFja2V0X2xlbmd0aCk7Ci0JY3BbNF0gPSBwYWRsZW47Ci0JREJHKGRlYnVnKCJzZW5kOiBsZW4gJWQgKGluY2x1ZGVzIHBhZGxlbiAlZCkiLCBwYWNrZXRfbGVuZ3RoKzQsIHBhZGxlbikpOwotCi0JLyogY29tcHV0ZSBNQUMgb3ZlciBzZXFuciBhbmQgcGFja2V0KGxlbmd0aCBmaWVsZHMsIHBheWxvYWQsIHBhZGRpbmcpICovCi0JaWYgKG1hYyAmJiBtYWMtPmVuYWJsZWQpIHsKLQkJbWFjYnVmID0gbWFjX2NvbXB1dGUobWFjLCBhY3RpdmVfc3RhdGUtPnBfc2VuZC5zZXFuciwKLQkJICAgIGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KSwKLQkJICAgIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KSk7Ci0JCURCRyhkZWJ1ZygiZG9uZSBjYWxjIE1BQyBvdXQgIyVkIiwgYWN0aXZlX3N0YXRlLT5wX3NlbmQuc2VxbnIpKTsKLQl9Ci0JLyogZW5jcnlwdCBwYWNrZXQgYW5kIGFwcGVuZCB0byBvdXRwdXQgYnVmZmVyLiAqLwotCWNwID0gYnVmZmVyX2FwcGVuZF9zcGFjZSgmYWN0aXZlX3N0YXRlLT5vdXRwdXQsCi0JICAgIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KSk7Ci0JY2lwaGVyX2NyeXB0KCZhY3RpdmVfc3RhdGUtPnNlbmRfY29udGV4dCwgY3AsCi0JICAgIGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0KSwKLQkgICAgYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5vdXRnb2luZ19wYWNrZXQpKTsKLQkvKiBhcHBlbmQgdW5lbmNyeXB0ZWQgTUFDICovCi0JaWYgKG1hYyAmJiBtYWMtPmVuYWJsZWQpCi0JCWJ1ZmZlcl9hcHBlbmQoJmFjdGl2ZV9zdGF0ZS0+b3V0cHV0LCBtYWNidWYsIG1hYy0+bWFjX2xlbik7Ci0jaWZkZWYgUEFDS0VUX0RFQlVHCi0JZnByaW50ZihzdGRlcnIsICJlbmNyeXB0ZWQ6ICIpOwotCWJ1ZmZlcl9kdW1wKCZhY3RpdmVfc3RhdGUtPm91dHB1dCk7Ci0jZW5kaWYKLQkvKiBpbmNyZW1lbnQgc2VxdWVuY2UgbnVtYmVyIGZvciBvdXRnb2luZyBwYWNrZXRzICovCi0JaWYgKCsrYWN0aXZlX3N0YXRlLT5wX3NlbmQuc2VxbnIgPT0gMCkKLQkJbG9naXQoIm91dGdvaW5nIHNlcW5yIHdyYXBzIGFyb3VuZCIpOwotCWlmICgrK2FjdGl2ZV9zdGF0ZS0+cF9zZW5kLnBhY2tldHMgPT0gMCkKLQkJaWYgKCEoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX05PUkVLRVkpKQotCQkJZmF0YWwoIlhYWCB0b28gbWFueSBwYWNrZXRzIHdpdGggc2FtZSBrZXkiKTsKLQlhY3RpdmVfc3RhdGUtPnBfc2VuZC5ibG9ja3MgKz0gKHBhY2tldF9sZW5ndGggKyA0KSAvIGJsb2NrX3NpemU7Ci0JYWN0aXZlX3N0YXRlLT5wX3NlbmQuYnl0ZXMgKz0gcGFja2V0X2xlbmd0aCArIDQ7Ci0JYnVmZmVyX2NsZWFyKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCk7Ci0KLQlpZiAodHlwZSA9PSBTU0gyX01TR19ORVdLRVlTKQotCQlzZXRfbmV3a2V5cyhNT0RFX09VVCk7Ci0JZWxzZSBpZiAodHlwZSA9PSBTU0gyX01TR19VU0VSQVVUSF9TVUNDRVNTICYmIGFjdGl2ZV9zdGF0ZS0+c2VydmVyX3NpZGUpCi0JCXBhY2tldF9lbmFibGVfZGVsYXllZF9jb21wcmVzcygpOwotfQotCi1zdGF0aWMgdm9pZAotcGFja2V0X3NlbmQyKHZvaWQpCi17Ci0Jc3RydWN0IHBhY2tldCAqcDsKLQl1X2NoYXIgdHlwZSwgKmNwOwotCi0JY3AgPSBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCk7Ci0JdHlwZSA9IGNwWzVdOwotCi0JLyogZHVyaW5nIHJla2V5aW5nIHdlIGNhbiBvbmx5IHNlbmQga2V5IGV4Y2hhbmdlIG1lc3NhZ2VzICovCi0JaWYgKGFjdGl2ZV9zdGF0ZS0+cmVrZXlpbmcpIHsKLQkJaWYgKCEoKHR5cGUgPj0gU1NIMl9NU0dfVFJBTlNQT1JUX01JTikgJiYKLQkJICAgICh0eXBlIDw9IFNTSDJfTVNHX1RSQU5TUE9SVF9NQVgpKSkgewotCQkJZGVidWcoImVucXVldWUgcGFja2V0OiAldSIsIHR5cGUpOwotCQkJcCA9IHhtYWxsb2Moc2l6ZW9mKCpwKSk7Ci0JCQlwLT50eXBlID0gdHlwZTsKLQkJCW1lbWNweSgmcC0+cGF5bG9hZCwgJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LAotCQkJICAgIHNpemVvZihCdWZmZXIpKTsKLQkJCWJ1ZmZlcl9pbml0KCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCk7Ci0JCQlUQUlMUV9JTlNFUlRfVEFJTCgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZywgcCwgbmV4dCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKiByZWtleWluZyBzdGFydHMgd2l0aCBzZW5kaW5nIEtFWElOSVQgKi8KLQlpZiAodHlwZSA9PSBTU0gyX01TR19LRVhJTklUKQotCQlhY3RpdmVfc3RhdGUtPnJla2V5aW5nID0gMTsKLQotCXBhY2tldF9zZW5kMl93cmFwcGVkKCk7Ci0KLQkvKiBhZnRlciBhIE5FV0tFWVMgbWVzc2FnZSB3ZSBjYW4gc2VuZCB0aGUgY29tcGxldGUgcXVldWUgKi8KLQlpZiAodHlwZSA9PSBTU0gyX01TR19ORVdLRVlTKSB7Ci0JCWFjdGl2ZV9zdGF0ZS0+cmVrZXlpbmcgPSAwOwotCQl3aGlsZSAoKHAgPSBUQUlMUV9GSVJTVCgmYWN0aXZlX3N0YXRlLT5vdXRnb2luZykpKSB7Ci0JCQl0eXBlID0gcC0+dHlwZTsKLQkJCWRlYnVnKCJkZXF1ZXVlIHBhY2tldDogJXUiLCB0eXBlKTsKLQkJCWJ1ZmZlcl9mcmVlKCZhY3RpdmVfc3RhdGUtPm91dGdvaW5nX3BhY2tldCk7Ci0JCQltZW1jcHkoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmdfcGFja2V0LCAmcC0+cGF5bG9hZCwKLQkJCSAgICBzaXplb2YoQnVmZmVyKSk7Ci0JCQlUQUlMUV9SRU1PVkUoJmFjdGl2ZV9zdGF0ZS0+b3V0Z29pbmcsIHAsIG5leHQpOwotCQkJeGZyZWUocCk7Ci0JCQlwYWNrZXRfc2VuZDJfd3JhcHBlZCgpOwotCQl9Ci0JfQotfQotCi12b2lkCi1wYWNrZXRfc2VuZCh2b2lkKQotewotCWlmIChjb21wYXQyMCkKLQkJcGFja2V0X3NlbmQyKCk7Ci0JZWxzZQotCQlwYWNrZXRfc2VuZDEoKTsKLQlEQkcoZGVidWcoInBhY2tldF9zZW5kIGRvbmUiKSk7Ci19Ci0KLS8qCi0gKiBXYWl0cyB1bnRpbCBhIHBhY2tldCBoYXMgYmVlbiByZWNlaXZlZCwgYW5kIHJldHVybnMgaXRzIHR5cGUuICBOb3RlIHRoYXQKLSAqIG5vIG90aGVyIGRhdGEgaXMgcHJvY2Vzc2VkIHVudGlsIHRoaXMgcmV0dXJucywgc28gdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90Ci0gKiBiZSB1c2VkIGR1cmluZyB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbi4KLSAqLwotCi1pbnQKLXBhY2tldF9yZWFkX3NlcW5yKHVfaW50MzJfdCAqc2VxbnJfcCkKLXsKLQlpbnQgdHlwZSwgbGVuLCByZXQsIG1zX3JlbWFpbiwgY29udDsKLQlmZF9zZXQgKnNldHA7Ci0JY2hhciBidWZbODE5Ml07Ci0Jc3RydWN0IHRpbWV2YWwgdGltZW91dCwgc3RhcnQsICp0aW1lb3V0cCA9IE5VTEw7Ci0KLQlEQkcoZGVidWcoInBhY2tldF9yZWFkKCkiKSk7Ci0KLQlzZXRwID0gKGZkX3NldCAqKXhjYWxsb2MoaG93bWFueShhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4gKyAxLAotCSAgICBORkRCSVRTKSwgc2l6ZW9mKGZkX21hc2spKTsKLQotCS8qIFNpbmNlIHdlIGFyZSBibG9ja2luZywgZW5zdXJlIHRoYXQgYWxsIHdyaXR0ZW4gcGFja2V0cyBoYXZlIGJlZW4gc2VudC4gKi8KLQlwYWNrZXRfd3JpdGVfd2FpdCgpOwotCi0JLyogU3RheSBpbiB0aGUgbG9vcCB1bnRpbCB3ZSBoYXZlIHJlY2VpdmVkIGEgY29tcGxldGUgcGFja2V0LiAqLwotCWZvciAoOzspIHsKLQkJLyogVHJ5IHRvIHJlYWQgYSBwYWNrZXQgZnJvbSB0aGUgYnVmZmVyLiAqLwotCQl0eXBlID0gcGFja2V0X3JlYWRfcG9sbF9zZXFucihzZXFucl9wKTsKLQkJaWYgKCFjb21wYXQyMCAmJiAoCi0JCSAgICB0eXBlID09IFNTSF9TTVNHX1NVQ0NFU1MKLQkJICAgIHx8IHR5cGUgPT0gU1NIX1NNU0dfRkFJTFVSRQotCQkgICAgfHwgdHlwZSA9PSBTU0hfQ01TR19FT0YKLQkJICAgIHx8IHR5cGUgPT0gU1NIX0NNU0dfRVhJVF9DT05GSVJNQVRJT04pKQotCQkJcGFja2V0X2NoZWNrX2VvbSgpOwotCQkvKiBJZiB3ZSBnb3QgYSBwYWNrZXQsIHJldHVybiBpdC4gKi8KLQkJaWYgKHR5cGUgIT0gU1NIX01TR19OT05FKSB7Ci0JCQl4ZnJlZShzZXRwKTsKLQkJCXJldHVybiB0eXBlOwotCQl9Ci0JCS8qCi0JCSAqIE90aGVyd2lzZSwgd2FpdCBmb3Igc29tZSBkYXRhIHRvIGFycml2ZSwgYWRkIGl0IHRvIHRoZQotCQkgKiBidWZmZXIsIGFuZCB0cnkgYWdhaW4uCi0JCSAqLwotCQltZW1zZXQoc2V0cCwgMCwgaG93bWFueShhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4gKyAxLAotCQkgICAgTkZEQklUUykgKiBzaXplb2YoZmRfbWFzaykpOwotCQlGRF9TRVQoYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX2luLCBzZXRwKTsKLQotCQlpZiAoYWN0aXZlX3N0YXRlLT5wYWNrZXRfdGltZW91dF9tcyA+IDApIHsKLQkJCW1zX3JlbWFpbiA9IGFjdGl2ZV9zdGF0ZS0+cGFja2V0X3RpbWVvdXRfbXM7Ci0JCQl0aW1lb3V0cCA9ICZ0aW1lb3V0OwotCQl9Ci0JCS8qIFdhaXQgZm9yIHNvbWUgZGF0YSB0byBhcnJpdmUuICovCi0JCWZvciAoOzspIHsKLQkJCWlmIChhY3RpdmVfc3RhdGUtPnBhY2tldF90aW1lb3V0X21zICE9IC0xKSB7Ci0JCQkJbXNfdG9fdGltZXZhbCgmdGltZW91dCwgbXNfcmVtYWluKTsKLQkJCQlnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKLQkJCX0KLQkJCWlmICgocmV0ID0gc2VsZWN0KGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbiArIDEsIHNldHAsCi0JCQkgICAgTlVMTCwgTlVMTCwgdGltZW91dHApKSA+PSAwKQotCQkJCWJyZWFrOwotCQkJaWYgKGVycm5vICE9IEVBR0FJTiAmJiBlcnJubyAhPSBFSU5UUiAmJgotCQkJICAgIGVycm5vICE9IEVXT1VMREJMT0NLKQotCQkJCWJyZWFrOwotCQkJaWYgKGFjdGl2ZV9zdGF0ZS0+cGFja2V0X3RpbWVvdXRfbXMgPT0gLTEpCi0JCQkJY29udGludWU7Ci0JCQltc19zdWJ0cmFjdF9kaWZmKCZzdGFydCwgJm1zX3JlbWFpbik7Ci0JCQlpZiAobXNfcmVtYWluIDw9IDApIHsKLQkJCQlyZXQgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChyZXQgPT0gMCkgewotCQkJbG9naXQoIkNvbm5lY3Rpb24gdG8gJS4yMDBzIHRpbWVkIG91dCB3aGlsZSAiCi0JCQkgICAgIndhaXRpbmcgdG8gcmVhZCIsIGdldF9yZW1vdGVfaXBhZGRyKCkpOwotCQkJY2xlYW51cF9leGl0KDI1NSk7Ci0JCX0KLQkJLyogUmVhZCBkYXRhIGZyb20gdGhlIHNvY2tldC4gKi8KLQkJZG8gewotCQkJY29udCA9IDA7Ci0JCQlsZW4gPSByb2FtaW5nX3JlYWQoYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX2luLCBidWYsCi0JCQkgICAgc2l6ZW9mKGJ1ZiksICZjb250KTsKLQkJfSB3aGlsZSAobGVuID09IDAgJiYgY29udCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJbG9naXQoIkNvbm5lY3Rpb24gY2xvc2VkIGJ5ICUuMjAwcyIsIGdldF9yZW1vdGVfaXBhZGRyKCkpOwotCQkJY2xlYW51cF9leGl0KDI1NSk7Ci0JCX0KLQkJaWYgKGxlbiA8IDApCi0JCQlmYXRhbCgiUmVhZCBmcm9tIHNvY2tldCBmYWlsZWQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCS8qIEFwcGVuZCBpdCB0byB0aGUgYnVmZmVyLiAqLwotCQlwYWNrZXRfcHJvY2Vzc19pbmNvbWluZyhidWYsIGxlbik7Ci0JfQotCS8qIE5PVFJFQUNIRUQgKi8KLX0KLQotaW50Ci1wYWNrZXRfcmVhZCh2b2lkKQotewotCXJldHVybiBwYWNrZXRfcmVhZF9zZXFucihOVUxMKTsKLX0KLQotLyoKLSAqIFdhaXRzIHVudGlsIGEgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkLCB2ZXJpZmllcyB0aGF0IGl0cyB0eXBlIG1hdGNoZXMKLSAqIHRoYXQgZ2l2ZW4sIGFuZCBnaXZlcyBhIGZhdGFsIGVycm9yIGFuZCBleGl0cyBpZiB0aGVyZSBpcyBhIG1pc21hdGNoLgotICovCi0KLXZvaWQKLXBhY2tldF9yZWFkX2V4cGVjdChpbnQgZXhwZWN0ZWRfdHlwZSkKLXsKLQlpbnQgdHlwZTsKLQotCXR5cGUgPSBwYWNrZXRfcmVhZCgpOwotCWlmICh0eXBlICE9IGV4cGVjdGVkX3R5cGUpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJQcm90b2NvbCBlcnJvcjogZXhwZWN0ZWQgcGFja2V0IHR5cGUgJWQsIGdvdCAlZCIsCi0JCSAgICBleHBlY3RlZF90eXBlLCB0eXBlKTsKLX0KLQotLyogQ2hlY2tzIGlmIGEgZnVsbCBwYWNrZXQgaXMgYXZhaWxhYmxlIGluIHRoZSBkYXRhIHJlY2VpdmVkIHNvIGZhciB2aWEKLSAqIHBhY2tldF9wcm9jZXNzX2luY29taW5nLiAgSWYgc28sIHJlYWRzIHRoZSBwYWNrZXQ7IG90aGVyd2lzZSByZXR1cm5zCi0gKiBTU0hfTVNHX05PTkUuICBUaGlzIGRvZXMgbm90IHdhaXQgZm9yIGRhdGEgZnJvbSB0aGUgY29ubmVjdGlvbi4KLSAqCi0gKiBTU0hfTVNHX0RJU0NPTk5FQ1QgaXMgaGFuZGxlZCBzcGVjaWFsbHkgaGVyZS4gIEFsc28sCi0gKiBTU0hfTVNHX0lHTk9SRSBtZXNzYWdlcyBhcmUgc2tpcHBlZCBieSB0aGlzIGZ1bmN0aW9uIGFuZCBhcmUgbmV2ZXIgcmV0dXJuZWQKLSAqIHRvIGhpZ2hlciBsZXZlbHMuCi0gKi8KLQotc3RhdGljIGludAotcGFja2V0X3JlYWRfcG9sbDEodm9pZCkKLXsKLQl1X2ludCBsZW4sIHBhZGRlZF9sZW47Ci0JdV9jaGFyICpjcCwgdHlwZTsKLQl1X2ludCBjaGVja3N1bSwgc3RvcmVkX2NoZWNrc3VtOwotCi0JLyogQ2hlY2sgaWYgaW5wdXQgc2l6ZSBpcyBsZXNzIHRoYW4gbWluaW11bSBwYWNrZXQgc2l6ZS4gKi8KLQlpZiAoYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5pbnB1dCkgPCA0ICsgOCkKLQkJcmV0dXJuIFNTSF9NU0dfTk9ORTsKLQkvKiBHZXQgbGVuZ3RoIG9mIGluY29taW5nIHBhY2tldC4gKi8KLQljcCA9IGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+aW5wdXQpOwotCWxlbiA9IGdldF91MzIoY3ApOwotCWlmIChsZW4gPCAxICsgMiArIDIgfHwgbGVuID4gMjU2ICogMTAyNCkKLQkJcGFja2V0X2Rpc2Nvbm5lY3QoIkJhZCBwYWNrZXQgbGVuZ3RoICV1LiIsIGxlbik7Ci0JcGFkZGVkX2xlbiA9IChsZW4gKyA4KSAmIH43OwotCi0JLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBoYXMgYmVlbiBlbnRpcmVseSByZWNlaXZlZC4gKi8KLQlpZiAoYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5pbnB1dCkgPCA0ICsgcGFkZGVkX2xlbikKLQkJcmV0dXJuIFNTSF9NU0dfTk9ORTsKLQotCS8qIFRoZSBlbnRpcmUgcGFja2V0IGlzIGluIGJ1ZmZlci4gKi8KLQotCS8qIENvbnN1bWUgcGFja2V0IGxlbmd0aC4gKi8KLQlidWZmZXJfY29uc3VtZSgmYWN0aXZlX3N0YXRlLT5pbnB1dCwgNCk7Ci0KLQkvKgotCSAqIENyeXB0b2dyYXBoaWMgYXR0YWNrIGRldGVjdG9yIGZvciBzc2gKLQkgKiAoQykxOTk4IENPUkUtU0RJLCBCdWVub3MgQWlyZXMgQXJnZW50aW5hCi0JICogQXJpZWwgRnV0b3JhbnNreShmdXRvQGNvcmUtc2RpLmNvbSkKLQkgKi8KLQlpZiAoIWFjdGl2ZV9zdGF0ZS0+cmVjZWl2ZV9jb250ZXh0LnBsYWludGV4dCkgewotCQlzd2l0Y2ggKGRldGVjdF9hdHRhY2soYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5pbnB1dCksCi0JCSAgICBwYWRkZWRfbGVuKSkgewotCQljYXNlIERFQVRUQUNLX0RFVEVDVEVEOgotCQkJcGFja2V0X2Rpc2Nvbm5lY3QoImNyYzMyIGNvbXBlbnNhdGlvbiBhdHRhY2s6ICIKLQkJCSAgICAibmV0d29yayBhdHRhY2sgZGV0ZWN0ZWQiKTsKLQkJY2FzZSBERUFUVEFDS19ET1NfREVURUNURUQ6Ci0JCQlwYWNrZXRfZGlzY29ubmVjdCgiZGVhdHRhY2sgZGVuaWFsIG9mICIKLQkJCSAgICAic2VydmljZSBkZXRlY3RlZCIpOwotCQl9Ci0JfQotCi0JLyogRGVjcnlwdCBkYXRhIHRvIGluY29taW5nX3BhY2tldC4gKi8KLQlidWZmZXJfY2xlYXIoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KTsKLQljcCA9IGJ1ZmZlcl9hcHBlbmRfc3BhY2UoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LCBwYWRkZWRfbGVuKTsKLQljaXBoZXJfY3J5cHQoJmFjdGl2ZV9zdGF0ZS0+cmVjZWl2ZV9jb250ZXh0LCBjcCwKLQkgICAgYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5pbnB1dCksIHBhZGRlZF9sZW4pOwotCi0JYnVmZmVyX2NvbnN1bWUoJmFjdGl2ZV9zdGF0ZS0+aW5wdXQsIHBhZGRlZF9sZW4pOwotCi0jaWZkZWYgUEFDS0VUX0RFQlVHCi0JZnByaW50ZihzdGRlcnIsICJyZWFkX3BvbGwgcGxhaW46ICIpOwotCWJ1ZmZlcl9kdW1wKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCk7Ci0jZW5kaWYKLQotCS8qIENvbXB1dGUgcGFja2V0IGNoZWNrc3VtLiAqLwotCWNoZWNrc3VtID0gc3NoX2NyYzMyKGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KSwKLQkgICAgYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpIC0gNCk7Ci0KLQkvKiBTa2lwIHBhZGRpbmcuICovCi0JYnVmZmVyX2NvbnN1bWUoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LCA4IC0gbGVuICUgOCk7Ci0KLQkvKiBUZXN0IGNoZWNrIGJ5dGVzLiAqLwotCWlmIChsZW4gIT0gYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpKQotCQlwYWNrZXRfZGlzY29ubmVjdCgicGFja2V0X3JlYWRfcG9sbDE6IGxlbiAlZCAhPSBidWZmZXJfbGVuICVkLiIsCi0JCSAgICBsZW4sIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KSk7Ci0KLQljcCA9ICh1X2NoYXIgKilidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCkgKyBsZW4gLSA0OwotCXN0b3JlZF9jaGVja3N1bSA9IGdldF91MzIoY3ApOwotCWlmIChjaGVja3N1bSAhPSBzdG9yZWRfY2hlY2tzdW0pCi0JCXBhY2tldF9kaXNjb25uZWN0KCJDb3JydXB0ZWQgY2hlY2sgYnl0ZXMgb24gaW5wdXQuIik7Ci0JYnVmZmVyX2NvbnN1bWVfZW5kKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCwgNCk7Ci0KLQlpZiAoYWN0aXZlX3N0YXRlLT5wYWNrZXRfY29tcHJlc3Npb24pIHsKLQkJYnVmZmVyX2NsZWFyKCZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcik7Ci0JCWJ1ZmZlcl91bmNvbXByZXNzKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCwKLQkJICAgICZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcik7Ci0JCWJ1ZmZlcl9jbGVhcigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpOwotCQlidWZmZXJfYXBwZW5kKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCwKLQkJICAgIGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKSwKLQkJICAgIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+Y29tcHJlc3Npb25fYnVmZmVyKSk7Ci0JfQotCWFjdGl2ZV9zdGF0ZS0+cF9yZWFkLnBhY2tldHMrKzsKLQlhY3RpdmVfc3RhdGUtPnBfcmVhZC5ieXRlcyArPSBwYWRkZWRfbGVuICsgNDsKLQl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCk7Ci0JaWYgKHR5cGUgPCBTU0hfTVNHX01JTiB8fCB0eXBlID4gU1NIX01TR19NQVgpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJJbnZhbGlkIHNzaDEgcGFja2V0IHR5cGU6ICVkIiwgdHlwZSk7Ci0JcmV0dXJuIHR5cGU7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhY2tldF9yZWFkX3BvbGwyKHVfaW50MzJfdCAqc2VxbnJfcCkKLXsKLQl1X2ludCBwYWRsZW4sIG5lZWQ7Ci0JdV9jaGFyICptYWNidWYsICpjcCwgdHlwZTsKLQl1X2ludCBtYWNsZW4sIGJsb2NrX3NpemU7Ci0JRW5jICplbmMgICA9IE5VTEw7Ci0JTWFjICptYWMgICA9IE5VTEw7Ci0JQ29tcCAqY29tcCA9IE5VTEw7Ci0KLQlpZiAoYWN0aXZlX3N0YXRlLT5wYWNrZXRfZGlzY2FyZCkKLQkJcmV0dXJuIFNTSF9NU0dfTk9ORTsKLQotCWlmIChhY3RpdmVfc3RhdGUtPm5ld2tleXNbTU9ERV9JTl0gIT0gTlVMTCkgewotCQllbmMgID0gJmFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1tNT0RFX0lOXS0+ZW5jOwotCQltYWMgID0gJmFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1tNT0RFX0lOXS0+bWFjOwotCQljb21wID0gJmFjdGl2ZV9zdGF0ZS0+bmV3a2V5c1tNT0RFX0lOXS0+Y29tcDsKLQl9Ci0JbWFjbGVuID0gbWFjICYmIG1hYy0+ZW5hYmxlZCA/IG1hYy0+bWFjX2xlbiA6IDA7Ci0JYmxvY2tfc2l6ZSA9IGVuYyA/IGVuYy0+YmxvY2tfc2l6ZSA6IDg7Ci0KLQlpZiAoYWN0aXZlX3N0YXRlLT5wYWNrbGVuID09IDApIHsKLQkJLyoKLQkJICogY2hlY2sgaWYgaW5wdXQgc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGNpcGhlciBibG9jayBzaXplLAotCQkgKiBkZWNyeXB0IGZpcnN0IGJsb2NrIGFuZCBleHRyYWN0IGxlbmd0aCBvZiBpbmNvbWluZyBwYWNrZXQKLQkJICovCi0JCWlmIChidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmlucHV0KSA8IGJsb2NrX3NpemUpCi0JCQlyZXR1cm4gU1NIX01TR19OT05FOwotCQlidWZmZXJfY2xlYXIoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KTsKLQkJY3AgPSBidWZmZXJfYXBwZW5kX3NwYWNlKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCwKLQkJICAgIGJsb2NrX3NpemUpOwotCQljaXBoZXJfY3J5cHQoJmFjdGl2ZV9zdGF0ZS0+cmVjZWl2ZV9jb250ZXh0LCBjcCwKLQkJICAgIGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+aW5wdXQpLCBibG9ja19zaXplKTsKLQkJY3AgPSBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCk7Ci0JCWFjdGl2ZV9zdGF0ZS0+cGFja2xlbiA9IGdldF91MzIoY3ApOwotCQlpZiAoYWN0aXZlX3N0YXRlLT5wYWNrbGVuIDwgMSArIDQgfHwKLQkJICAgIGFjdGl2ZV9zdGF0ZS0+cGFja2xlbiA+IFBBQ0tFVF9NQVhfU0laRSkgewotI2lmZGVmIFBBQ0tFVF9ERUJVRwotCQkJYnVmZmVyX2R1bXAoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KTsKLSNlbmRpZgotCQkJbG9naXQoIkJhZCBwYWNrZXQgbGVuZ3RoICV1LiIsIGFjdGl2ZV9zdGF0ZS0+cGFja2xlbik7Ci0JCQlwYWNrZXRfc3RhcnRfZGlzY2FyZChlbmMsIG1hYywgYWN0aXZlX3N0YXRlLT5wYWNrbGVuLAotCQkJICAgIFBBQ0tFVF9NQVhfU0laRSk7Ci0JCQlyZXR1cm4gU1NIX01TR19OT05FOwotCQl9Ci0JCURCRyhkZWJ1ZygiaW5wdXQ6IHBhY2tldCBsZW4gJXUiLCBhY3RpdmVfc3RhdGUtPnBhY2tsZW4rNCkpOwotCQlidWZmZXJfY29uc3VtZSgmYWN0aXZlX3N0YXRlLT5pbnB1dCwgYmxvY2tfc2l6ZSk7Ci0JfQotCS8qIHdlIGhhdmUgYSBwYXJ0aWFsIHBhY2tldCBvZiBibG9ja19zaXplIGJ5dGVzICovCi0JbmVlZCA9IDQgKyBhY3RpdmVfc3RhdGUtPnBhY2tsZW4gLSBibG9ja19zaXplOwotCURCRyhkZWJ1ZygicGFydGlhbCBwYWNrZXQgJWQsIG5lZWQgJWQsIG1hY2xlbiAlZCIsIGJsb2NrX3NpemUsCi0JICAgIG5lZWQsIG1hY2xlbikpOwotCWlmIChuZWVkICUgYmxvY2tfc2l6ZSAhPSAwKSB7Ci0JCWxvZ2l0KCJwYWRkaW5nIGVycm9yOiBuZWVkICVkIGJsb2NrICVkIG1vZCAlZCIsCi0JCSAgICBuZWVkLCBibG9ja19zaXplLCBuZWVkICUgYmxvY2tfc2l6ZSk7Ci0JCXBhY2tldF9zdGFydF9kaXNjYXJkKGVuYywgbWFjLCBhY3RpdmVfc3RhdGUtPnBhY2tsZW4sCi0JCSAgICBQQUNLRVRfTUFYX1NJWkUgLSBibG9ja19zaXplKTsKLQkJcmV0dXJuIFNTSF9NU0dfTk9ORTsKLQl9Ci0JLyoKLQkgKiBjaGVjayBpZiB0aGUgZW50aXJlIHBhY2tldCBoYXMgYmVlbiByZWNlaXZlZCBhbmQKLQkgKiBkZWNyeXB0IGludG8gaW5jb21pbmdfcGFja2V0Ci0JICovCi0JaWYgKGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+aW5wdXQpIDwgbmVlZCArIG1hY2xlbikKLQkJcmV0dXJuIFNTSF9NU0dfTk9ORTsKLSNpZmRlZiBQQUNLRVRfREVCVUcKLQlmcHJpbnRmKHN0ZGVyciwgInJlYWRfcG9sbCBlbmMvZnVsbDogIik7Ci0JYnVmZmVyX2R1bXAoJmFjdGl2ZV9zdGF0ZS0+aW5wdXQpOwotI2VuZGlmCi0JY3AgPSBidWZmZXJfYXBwZW5kX3NwYWNlKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCwgbmVlZCk7Ci0JY2lwaGVyX2NyeXB0KCZhY3RpdmVfc3RhdGUtPnJlY2VpdmVfY29udGV4dCwgY3AsCi0JICAgIGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+aW5wdXQpLCBuZWVkKTsKLQlidWZmZXJfY29uc3VtZSgmYWN0aXZlX3N0YXRlLT5pbnB1dCwgbmVlZCk7Ci0JLyoKLQkgKiBjb21wdXRlIE1BQyBvdmVyIHNlcW5yIGFuZCBwYWNrZXQsCi0JICogaW5jcmVtZW50IHNlcXVlbmNlIG51bWJlciBmb3IgaW5jb21pbmcgcGFja2V0Ci0JICovCi0JaWYgKG1hYyAmJiBtYWMtPmVuYWJsZWQpIHsKLQkJbWFjYnVmID0gbWFjX2NvbXB1dGUobWFjLCBhY3RpdmVfc3RhdGUtPnBfcmVhZC5zZXFuciwKLQkJICAgIGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KSwKLQkJICAgIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KSk7Ci0JCWlmICh0aW1pbmdzYWZlX2JjbXAobWFjYnVmLCBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPmlucHV0KSwKLQkJICAgIG1hYy0+bWFjX2xlbikgIT0gMCkgewotCQkJbG9naXQoIkNvcnJ1cHRlZCBNQUMgb24gaW5wdXQuIik7Ci0JCQlpZiAobmVlZCA+IFBBQ0tFVF9NQVhfU0laRSkKLQkJCQlmYXRhbCgiaW50ZXJuYWwgZXJyb3IgbmVlZCAlZCIsIG5lZWQpOwotCQkJcGFja2V0X3N0YXJ0X2Rpc2NhcmQoZW5jLCBtYWMsIGFjdGl2ZV9zdGF0ZS0+cGFja2xlbiwKLQkJCSAgICBQQUNLRVRfTUFYX1NJWkUgLSBuZWVkKTsKLQkJCXJldHVybiBTU0hfTVNHX05PTkU7Ci0JCX0KLQkJCQkKLQkJREJHKGRlYnVnKCJNQUMgIyVkIG9rIiwgYWN0aXZlX3N0YXRlLT5wX3JlYWQuc2VxbnIpKTsKLQkJYnVmZmVyX2NvbnN1bWUoJmFjdGl2ZV9zdGF0ZS0+aW5wdXQsIG1hYy0+bWFjX2xlbik7Ci0JfQotCS8qIFhYWCBub3cgaXQncyBzYWZlIHRvIHVzZSBmYXRhbC9wYWNrZXRfZGlzY29ubmVjdCAqLwotCWlmIChzZXFucl9wICE9IE5VTEwpCi0JCSpzZXFucl9wID0gYWN0aXZlX3N0YXRlLT5wX3JlYWQuc2VxbnI7Ci0JaWYgKCsrYWN0aXZlX3N0YXRlLT5wX3JlYWQuc2VxbnIgPT0gMCkKLQkJbG9naXQoImluY29taW5nIHNlcW5yIHdyYXBzIGFyb3VuZCIpOwotCWlmICgrK2FjdGl2ZV9zdGF0ZS0+cF9yZWFkLnBhY2tldHMgPT0gMCkKLQkJaWYgKCEoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX05PUkVLRVkpKQotCQkJZmF0YWwoIlhYWCB0b28gbWFueSBwYWNrZXRzIHdpdGggc2FtZSBrZXkiKTsKLQlhY3RpdmVfc3RhdGUtPnBfcmVhZC5ibG9ja3MgKz0gKGFjdGl2ZV9zdGF0ZS0+cGFja2xlbiArIDQpIC8gYmxvY2tfc2l6ZTsKLQlhY3RpdmVfc3RhdGUtPnBfcmVhZC5ieXRlcyArPSBhY3RpdmVfc3RhdGUtPnBhY2tsZW4gKyA0OwotCi0JLyogZ2V0IHBhZGxlbiAqLwotCWNwID0gYnVmZmVyX3B0cigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpOwotCXBhZGxlbiA9IGNwWzRdOwotCURCRyhkZWJ1ZygiaW5wdXQ6IHBhZGxlbiAlZCIsIHBhZGxlbikpOwotCWlmIChwYWRsZW4gPCA0KQotCQlwYWNrZXRfZGlzY29ubmVjdCgiQ29ycnVwdGVkIHBhZGxlbiAlZCBvbiBpbnB1dC4iLCBwYWRsZW4pOwotCi0JLyogc2tpcCBwYWNrZXQgc2l6ZSArIHBhZGxlbiwgZGlzY2FyZCBwYWRkaW5nICovCi0JYnVmZmVyX2NvbnN1bWUoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LCA0ICsgMSk7Ci0JYnVmZmVyX2NvbnN1bWVfZW5kKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCwgcGFkbGVuKTsKLQotCURCRyhkZWJ1ZygiaW5wdXQ6IGxlbiBiZWZvcmUgZGUtY29tcHJlc3MgJWQiLAotCSAgICBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCkpKTsKLQlpZiAoY29tcCAmJiBjb21wLT5lbmFibGVkKSB7Ci0JCWJ1ZmZlcl9jbGVhcigmYWN0aXZlX3N0YXRlLT5jb21wcmVzc2lvbl9idWZmZXIpOwotCQlidWZmZXJfdW5jb21wcmVzcygmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQsCi0JCSAgICAmYWN0aXZlX3N0YXRlLT5jb21wcmVzc2lvbl9idWZmZXIpOwotCQlidWZmZXJfY2xlYXIoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KTsKLQkJYnVmZmVyX2FwcGVuZCgmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQsCi0JCSAgICBidWZmZXJfcHRyKCZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlciksCi0JCSAgICBidWZmZXJfbGVuKCZhY3RpdmVfc3RhdGUtPmNvbXByZXNzaW9uX2J1ZmZlcikpOwotCQlEQkcoZGVidWcoImlucHV0OiBsZW4gYWZ0ZXIgZGUtY29tcHJlc3MgJWQiLAotCQkgICAgYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpKSk7Ci0JfQotCS8qCi0JICogZ2V0IHBhY2tldCB0eXBlLCBpbXBsaWVzIGNvbnN1bWUuCi0JICogcmV0dXJuIGxlbmd0aCBvZiBwYXlsb2FkICh3aXRob3V0IHR5cGUgZmllbGQpCi0JICovCi0JdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpOwotCWlmICh0eXBlIDwgU1NIMl9NU0dfTUlOIHx8IHR5cGUgPj0gU1NIMl9NU0dfTE9DQUxfTUlOKQotCQlwYWNrZXRfZGlzY29ubmVjdCgiSW52YWxpZCBzc2gyIHBhY2tldCB0eXBlOiAlZCIsIHR5cGUpOwotCWlmICh0eXBlID09IFNTSDJfTVNHX05FV0tFWVMpCi0JCXNldF9uZXdrZXlzKE1PREVfSU4pOwotCWVsc2UgaWYgKHR5cGUgPT0gU1NIMl9NU0dfVVNFUkFVVEhfU1VDQ0VTUyAmJgotCSAgICAhYWN0aXZlX3N0YXRlLT5zZXJ2ZXJfc2lkZSkKLQkJcGFja2V0X2VuYWJsZV9kZWxheWVkX2NvbXByZXNzKCk7Ci0jaWZkZWYgUEFDS0VUX0RFQlVHCi0JZnByaW50ZihzdGRlcnIsICJyZWFkL3BsYWluWyVkXTpcclxuIiwgdHlwZSk7Ci0JYnVmZmVyX2R1bXAoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KTsKLSNlbmRpZgotCS8qIHJlc2V0IGZvciBuZXh0IHBhY2tldCAqLwotCWFjdGl2ZV9zdGF0ZS0+cGFja2xlbiA9IDA7Ci0JcmV0dXJuIHR5cGU7Ci19Ci0KLWludAotcGFja2V0X3JlYWRfcG9sbF9zZXFucih1X2ludDMyX3QgKnNlcW5yX3ApCi17Ci0JdV9pbnQgcmVhc29uLCBzZXFucjsKLQl1X2NoYXIgdHlwZTsKLQljaGFyICptc2c7Ci0KLQlmb3IgKDs7KSB7Ci0JCWlmIChjb21wYXQyMCkgewotCQkJdHlwZSA9IHBhY2tldF9yZWFkX3BvbGwyKHNlcW5yX3ApOwotCQkJaWYgKHR5cGUpIHsKLQkJCQlhY3RpdmVfc3RhdGUtPmtlZXBfYWxpdmVfdGltZW91dHMgPSAwOwotCQkJCURCRyhkZWJ1ZygicmVjZWl2ZWQgcGFja2V0IHR5cGUgJWQiLCB0eXBlKSk7Ci0JCQl9Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgU1NIMl9NU0dfSUdOT1JFOgotCQkJCWRlYnVnMygiUmVjZWl2ZWQgU1NIMl9NU0dfSUdOT1JFIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNTSDJfTVNHX0RFQlVHOgotCQkJCXBhY2tldF9nZXRfY2hhcigpOwotCQkJCW1zZyA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOwotCQkJCWRlYnVnKCJSZW1vdGU6ICUuOTAwcyIsIG1zZyk7Ci0JCQkJeGZyZWUobXNnKTsKLQkJCQltc2cgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQkJCQl4ZnJlZShtc2cpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTU0gyX01TR19ESVNDT05ORUNUOgotCQkJCXJlYXNvbiA9IHBhY2tldF9nZXRfaW50KCk7Ci0JCQkJbXNnID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JCQkJbG9naXQoIlJlY2VpdmVkIGRpc2Nvbm5lY3QgZnJvbSAlczogJXU6ICUuNDAwcyIsCi0JCQkJICAgIGdldF9yZW1vdGVfaXBhZGRyKCksIHJlYXNvbiwgbXNnKTsKLQkJCQl4ZnJlZShtc2cpOwotCQkJCWNsZWFudXBfZXhpdCgyNTUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTU0gyX01TR19VTklNUExFTUVOVEVEOgotCQkJCXNlcW5yID0gcGFja2V0X2dldF9pbnQoKTsKLQkJCQlkZWJ1ZygiUmVjZWl2ZWQgU1NIMl9NU0dfVU5JTVBMRU1FTlRFRCBmb3IgJXUiLAotCQkJCSAgICBzZXFucik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiB0eXBlOwotCQkJfQotCQl9IGVsc2UgewotCQkJdHlwZSA9IHBhY2tldF9yZWFkX3BvbGwxKCk7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgU1NIX01TR19JR05PUkU6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNTSF9NU0dfREVCVUc6Ci0JCQkJbXNnID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JCQkJZGVidWcoIlJlbW90ZTogJS45MDBzIiwgbXNnKTsKLQkJCQl4ZnJlZShtc2cpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTU0hfTVNHX0RJU0NPTk5FQ1Q6Ci0JCQkJbXNnID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JCQkJbG9naXQoIlJlY2VpdmVkIGRpc2Nvbm5lY3QgZnJvbSAlczogJS40MDBzIiwKLQkJCQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSwgbXNnKTsKLQkJCQljbGVhbnVwX2V4aXQoMjU1KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKHR5cGUpCi0JCQkJCURCRyhkZWJ1ZygicmVjZWl2ZWQgcGFja2V0IHR5cGUgJWQiLCB0eXBlKSk7Ci0JCQkJcmV0dXJuIHR5cGU7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLWludAotcGFja2V0X3JlYWRfcG9sbCh2b2lkKQotewotCXJldHVybiBwYWNrZXRfcmVhZF9wb2xsX3NlcW5yKE5VTEwpOwotfQotCi0vKgotICogQnVmZmVycyB0aGUgZ2l2ZW4gYW1vdW50IG9mIGlucHV0IGNoYXJhY3RlcnMuICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQKLSAqIHRvZ2V0aGVyIHdpdGggcGFja2V0X3JlYWRfcG9sbC4KLSAqLwotCi12b2lkCi1wYWNrZXRfcHJvY2Vzc19pbmNvbWluZyhjb25zdCBjaGFyICpidWYsIHVfaW50IGxlbikKLXsKLQlpZiAoYWN0aXZlX3N0YXRlLT5wYWNrZXRfZGlzY2FyZCkgewotCQlhY3RpdmVfc3RhdGUtPmtlZXBfYWxpdmVfdGltZW91dHMgPSAwOyAvKiA/PyAqLwotCQlpZiAobGVuID49IGFjdGl2ZV9zdGF0ZS0+cGFja2V0X2Rpc2NhcmQpCi0JCQlwYWNrZXRfc3RvcF9kaXNjYXJkKCk7Ci0JCWFjdGl2ZV9zdGF0ZS0+cGFja2V0X2Rpc2NhcmQgLT0gbGVuOwotCQlyZXR1cm47Ci0JfQotCWJ1ZmZlcl9hcHBlbmQoJmFjdGl2ZV9zdGF0ZS0+aW5wdXQsIGJ1ZiwgbGVuKTsKLX0KLQotLyogUmV0dXJucyBhIGNoYXJhY3RlciBmcm9tIHRoZSBwYWNrZXQuICovCi0KLXVfaW50Ci1wYWNrZXRfZ2V0X2NoYXIodm9pZCkKLXsKLQljaGFyIGNoOwotCi0JYnVmZmVyX2dldCgmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQsICZjaCwgMSk7Ci0JcmV0dXJuICh1X2NoYXIpIGNoOwotfQotCi0vKiBSZXR1cm5zIGFuIGludGVnZXIgZnJvbSB0aGUgcGFja2V0IGRhdGEuICovCi0KLXVfaW50Ci1wYWNrZXRfZ2V0X2ludCh2b2lkKQotewotCXJldHVybiBidWZmZXJfZ2V0X2ludCgmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpOwotfQotCi0vKiBSZXR1cm5zIGFuIDY0IGJpdCBpbnRlZ2VyIGZyb20gdGhlIHBhY2tldCBkYXRhLiAqLwotCi11X2ludDY0X3QKLXBhY2tldF9nZXRfaW50NjQodm9pZCkKLXsKLQlyZXR1cm4gYnVmZmVyX2dldF9pbnQ2NCgmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQpOwotfQotCi0vKgotICogUmV0dXJucyBhbiBhcmJpdHJhcnkgcHJlY2lzaW9uIGludGVnZXIgZnJvbSB0aGUgcGFja2V0IGRhdGEuICBUaGUgaW50ZWdlcgotICogbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgY2FsbC4KLSAqLwotCi12b2lkCi1wYWNrZXRfZ2V0X2JpZ251bShCSUdOVU0gKiB2YWx1ZSkKLXsKLQlidWZmZXJfZ2V0X2JpZ251bSgmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQsIHZhbHVlKTsKLX0KLQotdm9pZAotcGFja2V0X2dldF9iaWdudW0yKEJJR05VTSAqIHZhbHVlKQotewotCWJ1ZmZlcl9nZXRfYmlnbnVtMigmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQsIHZhbHVlKTsKLX0KLQotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotdm9pZAotcGFja2V0X2dldF9lY3BvaW50KGNvbnN0IEVDX0dST1VQICpjdXJ2ZSwgRUNfUE9JTlQgKnBvaW50KQotewotCWJ1ZmZlcl9nZXRfZWNwb2ludCgmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQsIGN1cnZlLCBwb2ludCk7Ci19Ci0jZW5kaWYKLQotdm9pZCAqCi1wYWNrZXRfZ2V0X3Jhdyh1X2ludCAqbGVuZ3RoX3B0cikKLXsKLQl1X2ludCBieXRlcyA9IGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KTsKLQotCWlmIChsZW5ndGhfcHRyICE9IE5VTEwpCi0JCSpsZW5ndGhfcHRyID0gYnl0ZXM7Ci0JcmV0dXJuIGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KTsKLX0KLQotaW50Ci1wYWNrZXRfcmVtYWluaW5nKHZvaWQpCi17Ci0JcmV0dXJuIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0KTsKLX0KLQotLyoKLSAqIFJldHVybnMgYSBzdHJpbmcgZnJvbSB0aGUgcGFja2V0IGRhdGEuICBUaGUgc3RyaW5nIGlzIGFsbG9jYXRlZCB1c2luZwotICogeG1hbGxvYzsgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsaW5nIHByb2dyYW0gdG8gZnJlZSBpdCB3aGVuCi0gKiBubyBsb25nZXIgbmVlZGVkLiAgVGhlIGxlbmd0aF9wdHIgYXJndW1lbnQgbWF5IGJlIE5VTEwsIG9yIHBvaW50IHRvIGFuCi0gKiBpbnRlZ2VyIGludG8gd2hpY2ggdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzIHN0b3JlZC4KLSAqLwotCi12b2lkICoKLXBhY2tldF9nZXRfc3RyaW5nKHVfaW50ICpsZW5ndGhfcHRyKQotewotCXJldHVybiBidWZmZXJfZ2V0X3N0cmluZygmYWN0aXZlX3N0YXRlLT5pbmNvbWluZ19wYWNrZXQsIGxlbmd0aF9wdHIpOwotfQotCi12b2lkICoKLXBhY2tldF9nZXRfc3RyaW5nX3B0cih1X2ludCAqbGVuZ3RoX3B0cikKLXsKLQlyZXR1cm4gYnVmZmVyX2dldF9zdHJpbmdfcHRyKCZhY3RpdmVfc3RhdGUtPmluY29taW5nX3BhY2tldCwgbGVuZ3RoX3B0cik7Ci19Ci0KLS8qIEVuc3VyZXMgdGhlIHJldHVybmVkIHN0cmluZyBoYXMgbm8gZW1iZWRkZWQgXDAgY2hhcmFjdGVycyBpbiBpdC4gKi8KLWNoYXIgKgotcGFja2V0X2dldF9jc3RyaW5nKHVfaW50ICpsZW5ndGhfcHRyKQotewotCXJldHVybiBidWZmZXJfZ2V0X2NzdHJpbmcoJmFjdGl2ZV9zdGF0ZS0+aW5jb21pbmdfcGFja2V0LCBsZW5ndGhfcHRyKTsKLX0KLQotLyoKLSAqIFNlbmRzIGEgZGlhZ25vc3RpYyBtZXNzYWdlIGZyb20gdGhlIHNlcnZlciB0byB0aGUgY2xpZW50LiAgVGhpcyBtZXNzYWdlCi0gKiBjYW4gYmUgc2VudCBhdCBhbnkgdGltZSAoYnV0IG5vdCB3aGlsZSBjb25zdHJ1Y3RpbmcgYW5vdGhlciBtZXNzYWdlKS4gVGhlCi0gKiBtZXNzYWdlIGlzIHByaW50ZWQgaW1tZWRpYXRlbHksIGJ1dCBvbmx5IGlmIHRoZSBjbGllbnQgaXMgYmVpbmcgZXhlY3V0ZWQKLSAqIGluIHZlcmJvc2UgbW9kZS4gIFRoZXNlIG1lc3NhZ2VzIGFyZSBwcmltYXJpbHkgaW50ZW5kZWQgdG8gZWFzZSBkZWJ1Z2dpbmcKLSAqIGF1dGhlbnRpY2F0aW9uIHByb2JsZW1zLiAgIFRoZSBsZW5ndGggb2YgdGhlIGZvcm1hdHRlZCBtZXNzYWdlIG11c3Qgbm90Ci0gKiBleGNlZWQgMTAyNCBieXRlcy4gIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwgcGFja2V0X3dyaXRlX3dhaXQuCi0gKi8KLQotdm9pZAotcGFja2V0X3NlbmRfZGVidWcoY29uc3QgY2hhciAqZm10LC4uLikKLXsKLQljaGFyIGJ1ZlsxMDI0XTsKLQl2YV9saXN0IGFyZ3M7Ci0KLQlpZiAoY29tcGF0MjAgJiYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19ERUJVRykpCi0JCXJldHVybjsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCi0JaWYgKGNvbXBhdDIwKSB7Ci0JCXBhY2tldF9zdGFydChTU0gyX01TR19ERUJVRyk7Ci0JCXBhY2tldF9wdXRfY2hhcigwKTsJLyogYm9vbDogYWx3YXlzIGRpc3BsYXkgKi8KLQkJcGFja2V0X3B1dF9jc3RyaW5nKGJ1Zik7Ci0JCXBhY2tldF9wdXRfY3N0cmluZygiIik7Ci0JfSBlbHNlIHsKLQkJcGFja2V0X3N0YXJ0KFNTSF9NU0dfREVCVUcpOwotCQlwYWNrZXRfcHV0X2NzdHJpbmcoYnVmKTsKLQl9Ci0JcGFja2V0X3NlbmQoKTsKLQlwYWNrZXRfd3JpdGVfd2FpdCgpOwotfQotCi0vKgotICogTG9ncyB0aGUgZXJyb3IgcGx1cyBjb25zdHJ1Y3RzIGFuZCBzZW5kcyBhIGRpc2Nvbm5lY3QgcGFja2V0LCBjbG9zZXMgdGhlCi0gKiBjb25uZWN0aW9uLCBhbmQgZXhpdHMuICBUaGlzIGZ1bmN0aW9uIG5ldmVyIHJldHVybnMuIFRoZSBlcnJvciBtZXNzYWdlCi0gKiBzaG91bGQgbm90IGNvbnRhaW4gYSBuZXdsaW5lLiAgVGhlIGxlbmd0aCBvZiB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgbXVzdAotICogbm90IGV4Y2VlZCAxMDI0IGJ5dGVzLgotICovCi0KLXZvaWQKLXBhY2tldF9kaXNjb25uZWN0KGNvbnN0IGNoYXIgKmZtdCwuLi4pCi17Ci0JY2hhciBidWZbMTAyNF07Ci0JdmFfbGlzdCBhcmdzOwotCXN0YXRpYyBpbnQgZGlzY29ubmVjdGluZyA9IDA7Ci0KLQlpZiAoZGlzY29ubmVjdGluZykJLyogR3VhcmQgYWdhaW5zdCByZWN1cnNpdmUgaW52b2NhdGlvbnMuICovCi0JCWZhdGFsKCJwYWNrZXRfZGlzY29ubmVjdCBjYWxsZWQgcmVjdXJzaXZlbHkuIik7Ci0JZGlzY29ubmVjdGluZyA9IDE7Ci0KLQkvKgotCSAqIEZvcm1hdCB0aGUgbWVzc2FnZS4gIE5vdGUgdGhhdCB0aGUgY2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoZQotCSAqIG1lc3NhZ2UgaXMgb2YgbGltaXRlZCBzaXplLgotCSAqLwotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCi0JLyogRGlzcGxheSB0aGUgZXJyb3IgbG9jYWxseSAqLwotCWxvZ2l0KCJEaXNjb25uZWN0aW5nOiAlLjEwMHMiLCBidWYpOwotCi0JLyogU2VuZCB0aGUgZGlzY29ubmVjdCBtZXNzYWdlIHRvIHRoZSBvdGhlciBzaWRlLCBhbmQgd2FpdCBmb3IgaXQgdG8gZ2V0IHNlbnQuICovCi0JaWYgKGNvbXBhdDIwKSB7Ci0JCXBhY2tldF9zdGFydChTU0gyX01TR19ESVNDT05ORUNUKTsKLQkJcGFja2V0X3B1dF9pbnQoU1NIMl9ESVNDT05ORUNUX1BST1RPQ09MX0VSUk9SKTsKLQkJcGFja2V0X3B1dF9jc3RyaW5nKGJ1Zik7Ci0JCXBhY2tldF9wdXRfY3N0cmluZygiIik7Ci0JfSBlbHNlIHsKLQkJcGFja2V0X3N0YXJ0KFNTSF9NU0dfRElTQ09OTkVDVCk7Ci0JCXBhY2tldF9wdXRfY3N0cmluZyhidWYpOwotCX0KLQlwYWNrZXRfc2VuZCgpOwotCXBhY2tldF93cml0ZV93YWl0KCk7Ci0KLQkvKiBTdG9wIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMuICovCi0JY2hhbm5lbF9jbG9zZV9hbGwoKTsKLQotCS8qIENsb3NlIHRoZSBjb25uZWN0aW9uLiAqLwotCXBhY2tldF9jbG9zZSgpOwotCWNsZWFudXBfZXhpdCgyNTUpOwotfQotCi0vKiBDaGVja3MgaWYgdGhlcmUgaXMgYW55IGJ1ZmZlcmVkIG91dHB1dCwgYW5kIHRyaWVzIHRvIHdyaXRlIHNvbWUgb2YgdGhlIG91dHB1dC4gKi8KLQotdm9pZAotcGFja2V0X3dyaXRlX3BvbGwodm9pZCkKLXsKLQlpbnQgbGVuID0gYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5vdXRwdXQpOwotCWludCBjb250OwotCi0JaWYgKGxlbiA+IDApIHsKLQkJY29udCA9IDA7Ci0JCWxlbiA9IHJvYW1pbmdfd3JpdGUoYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX291dCwKLQkJICAgIGJ1ZmZlcl9wdHIoJmFjdGl2ZV9zdGF0ZS0+b3V0cHV0KSwgbGVuLCAmY29udCk7Ci0JCWlmIChsZW4gPT0gLTEpIHsKLQkJCWlmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4gfHwKLQkJCSAgICBlcnJubyA9PSBFV09VTERCTE9DSykKLQkJCQlyZXR1cm47Ci0JCQlmYXRhbCgiV3JpdGUgZmFpbGVkOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQl9Ci0JCWlmIChsZW4gPT0gMCAmJiAhY29udCkKLQkJCWZhdGFsKCJXcml0ZSBjb25uZWN0aW9uIGNsb3NlZCIpOwotCQlidWZmZXJfY29uc3VtZSgmYWN0aXZlX3N0YXRlLT5vdXRwdXQsIGxlbik7Ci0JfQotfQotCi0vKgotICogQ2FsbHMgcGFja2V0X3dyaXRlX3BvbGwgcmVwZWF0ZWRseSB1bnRpbCBhbGwgcGVuZGluZyBvdXRwdXQgZGF0YSBoYXMgYmVlbgotICogd3JpdHRlbi4KLSAqLwotCi12b2lkCi1wYWNrZXRfd3JpdGVfd2FpdCh2b2lkKQotewotCWZkX3NldCAqc2V0cDsKLQlpbnQgcmV0LCBtc19yZW1haW47Ci0Jc3RydWN0IHRpbWV2YWwgc3RhcnQsIHRpbWVvdXQsICp0aW1lb3V0cCA9IE5VTEw7Ci0KLQlzZXRwID0gKGZkX3NldCAqKXhjYWxsb2MoaG93bWFueShhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25fb3V0ICsgMSwKLQkgICAgTkZEQklUUyksIHNpemVvZihmZF9tYXNrKSk7Ci0JcGFja2V0X3dyaXRlX3BvbGwoKTsKLQl3aGlsZSAocGFja2V0X2hhdmVfZGF0YV90b193cml0ZSgpKSB7Ci0JCW1lbXNldChzZXRwLCAwLCBob3dtYW55KGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQgKyAxLAotCQkgICAgTkZEQklUUykgKiBzaXplb2YoZmRfbWFzaykpOwotCQlGRF9TRVQoYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX291dCwgc2V0cCk7Ci0KLQkJaWYgKGFjdGl2ZV9zdGF0ZS0+cGFja2V0X3RpbWVvdXRfbXMgPiAwKSB7Ci0JCQltc19yZW1haW4gPSBhY3RpdmVfc3RhdGUtPnBhY2tldF90aW1lb3V0X21zOwotCQkJdGltZW91dHAgPSAmdGltZW91dDsKLQkJfQotCQlmb3IgKDs7KSB7Ci0JCQlpZiAoYWN0aXZlX3N0YXRlLT5wYWNrZXRfdGltZW91dF9tcyAhPSAtMSkgewotCQkJCW1zX3RvX3RpbWV2YWwoJnRpbWVvdXQsIG1zX3JlbWFpbik7Ci0JCQkJZ2V0dGltZW9mZGF5KCZzdGFydCwgTlVMTCk7Ci0JCQl9Ci0JCQlpZiAoKHJldCA9IHNlbGVjdChhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25fb3V0ICsgMSwKLQkJCSAgICBOVUxMLCBzZXRwLCBOVUxMLCB0aW1lb3V0cCkpID49IDApCi0JCQkJYnJlYWs7Ci0JCQlpZiAoZXJybm8gIT0gRUFHQUlOICYmIGVycm5vICE9IEVJTlRSICYmCi0JCQkgICAgZXJybm8gIT0gRVdPVUxEQkxPQ0spCi0JCQkJYnJlYWs7Ci0JCQlpZiAoYWN0aXZlX3N0YXRlLT5wYWNrZXRfdGltZW91dF9tcyA9PSAtMSkKLQkJCQljb250aW51ZTsKLQkJCW1zX3N1YnRyYWN0X2RpZmYoJnN0YXJ0LCAmbXNfcmVtYWluKTsKLQkJCWlmIChtc19yZW1haW4gPD0gMCkgewotCQkJCXJldCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlsb2dpdCgiQ29ubmVjdGlvbiB0byAlLjIwMHMgdGltZWQgb3V0IHdoaWxlICIKLQkJCSAgICAid2FpdGluZyB0byB3cml0ZSIsIGdldF9yZW1vdGVfaXBhZGRyKCkpOwotCQkJY2xlYW51cF9leGl0KDI1NSk7Ci0JCX0KLQkJcGFja2V0X3dyaXRlX3BvbGwoKTsKLQl9Ci0JeGZyZWUoc2V0cCk7Ci19Ci0KLS8qIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBidWZmZXJlZCBkYXRhIHRvIHdyaXRlIHRvIHRoZSBjb25uZWN0aW9uLiAqLwotCi1pbnQKLXBhY2tldF9oYXZlX2RhdGFfdG9fd3JpdGUodm9pZCkKLXsKLQlyZXR1cm4gYnVmZmVyX2xlbigmYWN0aXZlX3N0YXRlLT5vdXRwdXQpICE9IDA7Ci19Ci0KLS8qIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBub3QgdG9vIG11Y2ggZGF0YSB0byB3cml0ZSB0byB0aGUgY29ubmVjdGlvbi4gKi8KLQotaW50Ci1wYWNrZXRfbm90X3ZlcnlfbXVjaF9kYXRhX3RvX3dyaXRlKHZvaWQpCi17Ci0JaWYgKGFjdGl2ZV9zdGF0ZS0+aW50ZXJhY3RpdmVfbW9kZSkKLQkJcmV0dXJuIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+b3V0cHV0KSA8IDE2Mzg0OwotCWVsc2UKLQkJcmV0dXJuIGJ1ZmZlcl9sZW4oJmFjdGl2ZV9zdGF0ZS0+b3V0cHV0KSA8IDEyOCAqIDEwMjQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYWNrZXRfc2V0X3RvcyhpbnQgdG9zKQotewotI2lmbmRlZiBJUF9UT1NfSVNfQlJPS0VOCi0JaWYgKCFwYWNrZXRfY29ubmVjdGlvbl9pc19vbl9zb2NrZXQoKSkKLQkJcmV0dXJuOwotCXN3aXRjaCAocGFja2V0X2Nvbm5lY3Rpb25fYWYoKSkgewotIyBpZmRlZiBJUF9UT1MKLQljYXNlIEFGX0lORVQ6Ci0JCWRlYnVnMygiJXM6IHNldCBJUF9UT1MgMHglMDJ4IiwgX19mdW5jX18sIHRvcyk7Ci0JCWlmIChzZXRzb2Nrb3B0KGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbiwKLQkJICAgIElQUFJPVE9fSVAsIElQX1RPUywgJnRvcywgc2l6ZW9mKHRvcykpIDwgMCkKLQkJCWVycm9yKCJzZXRzb2Nrb3B0IElQX1RPUyAlZDogJS4xMDBzOiIsCi0JCQkgICAgdG9zLCBzdHJlcnJvcihlcnJubykpOwotCQlicmVhazsKLSMgZW5kaWYgLyogSVBfVE9TICovCi0jIGlmZGVmIElQVjZfVENMQVNTCi0JY2FzZSBBRl9JTkVUNjoKLQkJZGVidWczKCIlczogc2V0IElQVjZfVENMQVNTIDB4JTAyeCIsIF9fZnVuY19fLCB0b3MpOwotCQlpZiAoc2V0c29ja29wdChhY3RpdmVfc3RhdGUtPmNvbm5lY3Rpb25faW4sCi0JCSAgICBJUFBST1RPX0lQVjYsIElQVjZfVENMQVNTLCAmdG9zLCBzaXplb2YodG9zKSkgPCAwKQotCQkJZXJyb3IoInNldHNvY2tvcHQgSVBWNl9UQ0xBU1MgJWQ6ICUuMTAwczoiLAotCQkJICAgIHRvcywgc3RyZXJyb3IoZXJybm8pKTsKLQkJYnJlYWs7Ci0jIGVuZGlmIC8qIElQVjZfVENMQVNTICovCi0JfQotI2VuZGlmIC8qIElQX1RPU19JU19CUk9LRU4gKi8KLX0KLQotLyogSW5mb3JtcyB0aGF0IHRoZSBjdXJyZW50IHNlc3Npb24gaXMgaW50ZXJhY3RpdmUuICBTZXRzIElQIGZsYWdzIGZvciB0aGF0LiAqLwotCi12b2lkCi1wYWNrZXRfc2V0X2ludGVyYWN0aXZlKGludCBpbnRlcmFjdGl2ZSwgaW50IHFvc19pbnRlcmFjdGl2ZSwgaW50IHFvc19idWxrKQotewotCWlmIChhY3RpdmVfc3RhdGUtPnNldF9pbnRlcmFjdGl2ZV9jYWxsZWQpCi0JCXJldHVybjsKLQlhY3RpdmVfc3RhdGUtPnNldF9pbnRlcmFjdGl2ZV9jYWxsZWQgPSAxOwotCi0JLyogUmVjb3JkIHRoYXQgd2UgYXJlIGluIGludGVyYWN0aXZlIG1vZGUuICovCi0JYWN0aXZlX3N0YXRlLT5pbnRlcmFjdGl2ZV9tb2RlID0gaW50ZXJhY3RpdmU7Ci0KLQkvKiBPbmx5IHNldCBzb2NrZXQgb3B0aW9ucyBpZiB1c2luZyBhIHNvY2tldC4gICovCi0JaWYgKCFwYWNrZXRfY29ubmVjdGlvbl9pc19vbl9zb2NrZXQoKSkKLQkJcmV0dXJuOwotCXNldF9ub2RlbGF5KGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbik7Ci0JcGFja2V0X3NldF90b3MoaW50ZXJhY3RpdmUgPyBxb3NfaW50ZXJhY3RpdmUgOiBxb3NfYnVsayk7Ci19Ci0KLS8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBjb25uZWN0aW9uIGlzIGludGVyYWN0aXZlLiAqLwotCi1pbnQKLXBhY2tldF9pc19pbnRlcmFjdGl2ZSh2b2lkKQotewotCXJldHVybiBhY3RpdmVfc3RhdGUtPmludGVyYWN0aXZlX21vZGU7Ci19Ci0KLWludAotcGFja2V0X3NldF9tYXhzaXplKHVfaW50IHMpCi17Ci0JaWYgKGFjdGl2ZV9zdGF0ZS0+c2V0X21heHNpemVfY2FsbGVkKSB7Ci0JCWxvZ2l0KCJwYWNrZXRfc2V0X21heHNpemU6IGNhbGxlZCB0d2ljZTogb2xkICVkIG5ldyAlZCIsCi0JCSAgICBhY3RpdmVfc3RhdGUtPm1heF9wYWNrZXRfc2l6ZSwgcyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHMgPCA0ICogMTAyNCB8fCBzID4gMTAyNCAqIDEwMjQpIHsKLQkJbG9naXQoInBhY2tldF9zZXRfbWF4c2l6ZTogYmFkIHNpemUgJWQiLCBzKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlhY3RpdmVfc3RhdGUtPnNldF9tYXhzaXplX2NhbGxlZCA9IDE7Ci0JZGVidWcoInBhY2tldF9zZXRfbWF4c2l6ZTogc2V0dGluZyB0byAlZCIsIHMpOwotCWFjdGl2ZV9zdGF0ZS0+bWF4X3BhY2tldF9zaXplID0gczsKLQlyZXR1cm4gczsKLX0KLQotaW50Ci1wYWNrZXRfaW5jX2FsaXZlX3RpbWVvdXRzKHZvaWQpCi17Ci0JcmV0dXJuICsrYWN0aXZlX3N0YXRlLT5rZWVwX2FsaXZlX3RpbWVvdXRzOwotfQotCi12b2lkCi1wYWNrZXRfc2V0X2FsaXZlX3RpbWVvdXRzKGludCBrYSkKLXsKLQlhY3RpdmVfc3RhdGUtPmtlZXBfYWxpdmVfdGltZW91dHMgPSBrYTsKLX0KLQotdV9pbnQKLXBhY2tldF9nZXRfbWF4c2l6ZSh2b2lkKQotewotCXJldHVybiBhY3RpdmVfc3RhdGUtPm1heF9wYWNrZXRfc2l6ZTsKLX0KLQotLyogcm91bmR1cCBjdXJyZW50IG1lc3NhZ2UgdG8gcGFkIGJ5dGVzICovCi12b2lkCi1wYWNrZXRfYWRkX3BhZGRpbmcodV9jaGFyIHBhZCkKLXsKLQlhY3RpdmVfc3RhdGUtPmV4dHJhX3BhZCA9IHBhZDsKLX0KLQotLyoKLSAqIDkuMi4gIElnbm9yZWQgRGF0YSBNZXNzYWdlCi0gKgotICogICBieXRlICAgICAgU1NIX01TR19JR05PUkUKLSAqICAgc3RyaW5nICAgIGRhdGEKLSAqCi0gKiBBbGwgaW1wbGVtZW50YXRpb25zIE1VU1QgdW5kZXJzdGFuZCAoYW5kIGlnbm9yZSkgdGhpcyBtZXNzYWdlIGF0IGFueQotICogdGltZSAoYWZ0ZXIgcmVjZWl2aW5nIHRoZSBwcm90b2NvbCB2ZXJzaW9uKS4gTm8gaW1wbGVtZW50YXRpb24gaXMKLSAqIHJlcXVpcmVkIHRvIHNlbmQgdGhlbS4gVGhpcyBtZXNzYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGFkZGl0aW9uYWwKLSAqIHByb3RlY3Rpb24gbWVhc3VyZSBhZ2FpbnN0IGFkdmFuY2VkIHRyYWZmaWMgYW5hbHlzaXMgdGVjaG5pcXVlcy4KLSAqLwotdm9pZAotcGFja2V0X3NlbmRfaWdub3JlKGludCBuYnl0ZXMpCi17Ci0JdV9pbnQzMl90IHJuZCA9IDA7Ci0JaW50IGk7Ci0KLQlwYWNrZXRfc3RhcnQoY29tcGF0MjAgPyBTU0gyX01TR19JR05PUkUgOiBTU0hfTVNHX0lHTk9SRSk7Ci0JcGFja2V0X3B1dF9pbnQobmJ5dGVzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspIHsKLQkJaWYgKGkgJSA0ID09IDApCi0JCQlybmQgPSBhcmM0cmFuZG9tKCk7Ci0JCXBhY2tldF9wdXRfY2hhcigodV9jaGFyKXJuZCAmIDB4ZmYpOwotCQlybmQgPj49IDg7Ci0JfQotfQotCi0jZGVmaW5lIE1BWF9QQUNLRVRTCSgxVTw8MzEpCi1pbnQKLXBhY2tldF9uZWVkX3Jla2V5aW5nKHZvaWQpCi17Ci0JaWYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19OT1JFS0VZKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4KLQkgICAgKGFjdGl2ZV9zdGF0ZS0+cF9zZW5kLnBhY2tldHMgPiBNQVhfUEFDS0VUUykgfHwKLQkgICAgKGFjdGl2ZV9zdGF0ZS0+cF9yZWFkLnBhY2tldHMgPiBNQVhfUEFDS0VUUykgfHwKLQkgICAgKGFjdGl2ZV9zdGF0ZS0+bWF4X2Jsb2Nrc19vdXQgJiYKLQkgICAgICAgIChhY3RpdmVfc3RhdGUtPnBfc2VuZC5ibG9ja3MgPiBhY3RpdmVfc3RhdGUtPm1heF9ibG9ja3Nfb3V0KSkgfHwKLQkgICAgKGFjdGl2ZV9zdGF0ZS0+bWF4X2Jsb2Nrc19pbiAmJgotCSAgICAgICAgKGFjdGl2ZV9zdGF0ZS0+cF9yZWFkLmJsb2NrcyA+IGFjdGl2ZV9zdGF0ZS0+bWF4X2Jsb2Nrc19pbikpOwotfQotCi12b2lkCi1wYWNrZXRfc2V0X3Jla2V5X2xpbWl0KHVfaW50MzJfdCBieXRlcykKLXsKLQlhY3RpdmVfc3RhdGUtPnJla2V5X2xpbWl0ID0gYnl0ZXM7Ci19Ci0KLXZvaWQKLXBhY2tldF9zZXRfc2VydmVyKHZvaWQpCi17Ci0JYWN0aXZlX3N0YXRlLT5zZXJ2ZXJfc2lkZSA9IDE7Ci19Ci0KLXZvaWQKLXBhY2tldF9zZXRfYXV0aGVudGljYXRlZCh2b2lkKQotewotCWFjdGl2ZV9zdGF0ZS0+YWZ0ZXJfYXV0aGVudGljYXRpb24gPSAxOwotfQotCi12b2lkICoKLXBhY2tldF9nZXRfaW5wdXQodm9pZCkKLXsKLQlyZXR1cm4gKHZvaWQgKikmYWN0aXZlX3N0YXRlLT5pbnB1dDsKLX0KLQotdm9pZCAqCi1wYWNrZXRfZ2V0X291dHB1dCh2b2lkKQotewotCXJldHVybiAodm9pZCAqKSZhY3RpdmVfc3RhdGUtPm91dHB1dDsKLX0KLQotdm9pZCAqCi1wYWNrZXRfZ2V0X25ld2tleXMoaW50IG1vZGUpCi17Ci0JcmV0dXJuICh2b2lkICopYWN0aXZlX3N0YXRlLT5uZXdrZXlzW21vZGVdOwotfQotCi0vKgotICogU2F2ZSB0aGUgc3RhdGUgZm9yIHRoZSByZWFsIGNvbm5lY3Rpb24sIGFuZCB1c2UgYSBzZXBhcmF0ZSBzdGF0ZSB3aGVuCi0gKiByZXN1bWluZyBhIHN1c3BlbmRlZCBjb25uZWN0aW9uLgotICovCi12b2lkCi1wYWNrZXRfYmFja3VwX3N0YXRlKHZvaWQpCi17Ci0Jc3RydWN0IHNlc3Npb25fc3RhdGUgKnRtcDsKLQotCWNsb3NlKGFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9pbik7Ci0JYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX2luID0gLTE7Ci0JY2xvc2UoYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX291dCk7Ci0JYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX291dCA9IC0xOwotCWlmIChiYWNrdXBfc3RhdGUpCi0JCXRtcCA9IGJhY2t1cF9zdGF0ZTsKLQllbHNlCi0JCXRtcCA9IGFsbG9jX3Nlc3Npb25fc3RhdGUoKTsKLQliYWNrdXBfc3RhdGUgPSBhY3RpdmVfc3RhdGU7Ci0JYWN0aXZlX3N0YXRlID0gdG1wOwotfQotCi0vKgotICogU3dhcCBpbiB0aGUgb2xkIHN0YXRlIHdoZW4gcmVzdW1pbmcgYSBjb25uZWNpb24uCi0gKi8KLXZvaWQKLXBhY2tldF9yZXN0b3JlX3N0YXRlKHZvaWQpCi17Ci0Jc3RydWN0IHNlc3Npb25fc3RhdGUgKnRtcDsKLQl2b2lkICpidWY7Ci0JdV9pbnQgbGVuOwotCi0JdG1wID0gYmFja3VwX3N0YXRlOwotCWJhY2t1cF9zdGF0ZSA9IGFjdGl2ZV9zdGF0ZTsKLQlhY3RpdmVfc3RhdGUgPSB0bXA7Ci0JYWN0aXZlX3N0YXRlLT5jb25uZWN0aW9uX2luID0gYmFja3VwX3N0YXRlLT5jb25uZWN0aW9uX2luOwotCWJhY2t1cF9zdGF0ZS0+Y29ubmVjdGlvbl9pbiA9IC0xOwotCWFjdGl2ZV9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQgPSBiYWNrdXBfc3RhdGUtPmNvbm5lY3Rpb25fb3V0OwotCWJhY2t1cF9zdGF0ZS0+Y29ubmVjdGlvbl9vdXQgPSAtMTsKLQlsZW4gPSBidWZmZXJfbGVuKCZiYWNrdXBfc3RhdGUtPmlucHV0KTsKLQlpZiAobGVuID4gMCkgewotCQlidWYgPSBidWZmZXJfcHRyKCZiYWNrdXBfc3RhdGUtPmlucHV0KTsKLQkJYnVmZmVyX2FwcGVuZCgmYWN0aXZlX3N0YXRlLT5pbnB1dCwgYnVmLCBsZW4pOwotCQlidWZmZXJfY2xlYXIoJmJhY2t1cF9zdGF0ZS0+aW5wdXQpOwotCQlhZGRfcmVjdl9ieXRlcyhsZW4pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BhY2tldC5oIGIvcGFja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWVjMTcuLjAwMDAwMDAKLS0tIGEvcGFja2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHBhY2tldC5oLHYgMS41NiAyMDExLzA1LzA2IDIxOjE0OjA1IGRqbSBFeHAgJCAqLwotCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogSW50ZXJmYWNlIGZvciB0aGUgcGFja2V0IHByb3RvY29sIGZ1bmN0aW9ucy4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpZm5kZWYgUEFDS0VUX0gKLSNkZWZpbmUgUEFDS0VUX0gKLQotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLSNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+Ci0jZW5kaWYKLQotdm9pZCAgICAgcGFja2V0X3NldF9jb25uZWN0aW9uKGludCwgaW50KTsKLXZvaWQgICAgIHBhY2tldF9zZXRfdGltZW91dChpbnQsIGludCk7Ci12b2lkICAgICBwYWNrZXRfc2V0X25vbmJsb2NraW5nKHZvaWQpOwotaW50ICAgICAgcGFja2V0X2dldF9jb25uZWN0aW9uX2luKHZvaWQpOwotaW50ICAgICAgcGFja2V0X2dldF9jb25uZWN0aW9uX291dCh2b2lkKTsKLXZvaWQgICAgIHBhY2tldF9jbG9zZSh2b2lkKTsKLXZvaWQJIHBhY2tldF9zZXRfZW5jcnlwdGlvbl9rZXkoY29uc3QgdV9jaGFyICosIHVfaW50LCBpbnQpOwotdV9pbnQJIHBhY2tldF9nZXRfZW5jcnlwdGlvbl9rZXkodV9jaGFyICopOwotdm9pZCAgICAgcGFja2V0X3NldF9wcm90b2NvbF9mbGFncyh1X2ludCk7Ci11X2ludAkgcGFja2V0X2dldF9wcm90b2NvbF9mbGFncyh2b2lkKTsKLXZvaWQgICAgIHBhY2tldF9zdGFydF9jb21wcmVzc2lvbihpbnQpOwotdm9pZCAgICAgcGFja2V0X3NldF9pbnRlcmFjdGl2ZShpbnQsIGludCwgaW50KTsKLWludCAgICAgIHBhY2tldF9pc19pbnRlcmFjdGl2ZSh2b2lkKTsKLXZvaWQgICAgIHBhY2tldF9zZXRfc2VydmVyKHZvaWQpOwotdm9pZCAgICAgcGFja2V0X3NldF9hdXRoZW50aWNhdGVkKHZvaWQpOwotCi12b2lkICAgICBwYWNrZXRfc3RhcnQodV9jaGFyKTsKLXZvaWQgICAgIHBhY2tldF9wdXRfY2hhcihpbnQgY2gpOwotdm9pZCAgICAgcGFja2V0X3B1dF9pbnQodV9pbnQgdmFsdWUpOwotdm9pZCAgICAgcGFja2V0X3B1dF9pbnQ2NCh1X2ludDY0X3QgdmFsdWUpOwotdm9pZCAgICAgcGFja2V0X3B1dF9iaWdudW0oQklHTlVNICogdmFsdWUpOwotdm9pZCAgICAgcGFja2V0X3B1dF9iaWdudW0yKEJJR05VTSAqIHZhbHVlKTsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLXZvaWQgICAgIHBhY2tldF9wdXRfZWNwb2ludChjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqKTsKLSNlbmRpZgotdm9pZCAgICAgcGFja2V0X3B1dF9zdHJpbmcoY29uc3Qgdm9pZCAqYnVmLCB1X2ludCBsZW4pOwotdm9pZCAgICAgcGFja2V0X3B1dF9jc3RyaW5nKGNvbnN0IGNoYXIgKnN0cik7Ci12b2lkICAgICBwYWNrZXRfcHV0X3Jhdyhjb25zdCB2b2lkICpidWYsIHVfaW50IGxlbik7Ci12b2lkICAgICBwYWNrZXRfc2VuZCh2b2lkKTsKLQotaW50ICAgICAgcGFja2V0X3JlYWQodm9pZCk7Ci12b2lkICAgICBwYWNrZXRfcmVhZF9leHBlY3QoaW50IHR5cGUpOwotaW50ICAgICAgcGFja2V0X3JlYWRfcG9sbCh2b2lkKTsKLXZvaWQgICAgIHBhY2tldF9wcm9jZXNzX2luY29taW5nKGNvbnN0IGNoYXIgKmJ1ZiwgdV9pbnQgbGVuKTsKLWludCAgICAgIHBhY2tldF9yZWFkX3NlcW5yKHVfaW50MzJfdCAqc2VxbnJfcCk7Ci1pbnQgICAgICBwYWNrZXRfcmVhZF9wb2xsX3NlcW5yKHVfaW50MzJfdCAqc2VxbnJfcCk7Ci0KLXVfaW50CSBwYWNrZXRfZ2V0X2NoYXIodm9pZCk7Ci11X2ludAkgcGFja2V0X2dldF9pbnQodm9pZCk7Ci11X2ludDY0X3QgcGFja2V0X2dldF9pbnQ2NCh2b2lkKTsKLXZvaWQgICAgIHBhY2tldF9nZXRfYmlnbnVtKEJJR05VTSAqIHZhbHVlKTsKLXZvaWQgICAgIHBhY2tldF9nZXRfYmlnbnVtMihCSUdOVU0gKiB2YWx1ZSk7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi12b2lkCSBwYWNrZXRfZ2V0X2VjcG9pbnQoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKik7Ci0jZW5kaWYKLXZvaWQJKnBhY2tldF9nZXRfcmF3KHVfaW50ICpsZW5ndGhfcHRyKTsKLXZvaWQJKnBhY2tldF9nZXRfc3RyaW5nKHVfaW50ICpsZW5ndGhfcHRyKTsKLWNoYXIJKnBhY2tldF9nZXRfY3N0cmluZyh1X2ludCAqbGVuZ3RoX3B0cik7Ci12b2lkCSpwYWNrZXRfZ2V0X3N0cmluZ19wdHIodV9pbnQgKmxlbmd0aF9wdHIpOwotdm9pZCAgICAgcGFja2V0X2Rpc2Nvbm5lY3QoY29uc3QgY2hhciAqZm10LC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKLXZvaWQgICAgIHBhY2tldF9zZW5kX2RlYnVnKGNvbnN0IGNoYXIgKmZtdCwuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSk7Ci0KLXZvaWQJIHNldF9uZXdrZXlzKGludCBtb2RlKTsKLWludAkgcGFja2V0X2dldF9rZXlpdl9sZW4oaW50KTsKLXZvaWQJIHBhY2tldF9nZXRfa2V5aXYoaW50LCB1X2NoYXIgKiwgdV9pbnQpOwotaW50CSBwYWNrZXRfZ2V0X2tleWNvbnRleHQoaW50LCB1X2NoYXIgKik7Ci12b2lkCSBwYWNrZXRfc2V0X2tleWNvbnRleHQoaW50LCB1X2NoYXIgKik7Ci12b2lkCSBwYWNrZXRfZ2V0X3N0YXRlKGludCwgdV9pbnQzMl90ICosIHVfaW50NjRfdCAqLCB1X2ludDMyX3QgKiwgdV9pbnQ2NF90ICopOwotdm9pZAkgcGFja2V0X3NldF9zdGF0ZShpbnQsIHVfaW50MzJfdCwgdV9pbnQ2NF90LCB1X2ludDMyX3QsIHVfaW50NjRfdCk7Ci1pbnQJIHBhY2tldF9nZXRfc3NoMV9jaXBoZXIodm9pZCk7Ci12b2lkCSBwYWNrZXRfc2V0X2l2KGludCwgdV9jaGFyICopOwotdm9pZAkqcGFja2V0X2dldF9uZXdrZXlzKGludCk7Ci0KLXZvaWQgICAgIHBhY2tldF93cml0ZV9wb2xsKHZvaWQpOwotdm9pZCAgICAgcGFja2V0X3dyaXRlX3dhaXQodm9pZCk7Ci1pbnQgICAgICBwYWNrZXRfaGF2ZV9kYXRhX3RvX3dyaXRlKHZvaWQpOwotaW50ICAgICAgcGFja2V0X25vdF92ZXJ5X211Y2hfZGF0YV90b193cml0ZSh2b2lkKTsKLQotaW50CSBwYWNrZXRfY29ubmVjdGlvbl9pc19vbl9zb2NrZXQodm9pZCk7Ci1pbnQJIHBhY2tldF9yZW1haW5pbmcodm9pZCk7Ci12b2lkCSBwYWNrZXRfc2VuZF9pZ25vcmUoaW50KTsKLXZvaWQJIHBhY2tldF9hZGRfcGFkZGluZyh1X2NoYXIpOwotCi12b2lkCSB0dHlfbWFrZV9tb2RlcyhpbnQsIHN0cnVjdCB0ZXJtaW9zICopOwotdm9pZAkgdHR5X3BhcnNlX21vZGVzKGludCwgaW50ICopOwotCi12b2lkCSBwYWNrZXRfc2V0X2FsaXZlX3RpbWVvdXRzKGludCk7Ci1pbnQJIHBhY2tldF9pbmNfYWxpdmVfdGltZW91dHModm9pZCk7Ci1pbnQJIHBhY2tldF9zZXRfbWF4c2l6ZSh1X2ludCk7Ci11X2ludAkgcGFja2V0X2dldF9tYXhzaXplKHZvaWQpOwotCi0vKiBkb24ndCBhbGxvdyByZW1haW5pbmcgYnl0ZXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSAqLwotI2RlZmluZSBwYWNrZXRfY2hlY2tfZW9tKCkgXAotZG8geyBcCi0JaW50IF9sZW4gPSBwYWNrZXRfcmVtYWluaW5nKCk7IFwKLQlpZiAoX2xlbiA+IDApIHsgXAotCQlsb2dpdCgiUGFja2V0IGludGVncml0eSBlcnJvciAoJWQgYnl0ZXMgcmVtYWluaW5nKSBhdCAlczolZCIsIFwKLQkJICAgIF9sZW4gLF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKLQkJcGFja2V0X2Rpc2Nvbm5lY3QoIlBhY2tldCBpbnRlZ3JpdHkgZXJyb3IuIik7IFwKLQl9IFwKLX0gd2hpbGUgKDApCi0KLWludAkgcGFja2V0X25lZWRfcmVrZXlpbmcodm9pZCk7Ci12b2lkCSBwYWNrZXRfc2V0X3Jla2V5X2xpbWl0KHVfaW50MzJfdCk7Ci0KLXZvaWQJIHBhY2tldF9iYWNrdXBfc3RhdGUodm9pZCk7Ci12b2lkCSBwYWNrZXRfcmVzdG9yZV9zdGF0ZSh2b2lkKTsKLQotdm9pZAkqcGFja2V0X2dldF9pbnB1dCh2b2lkKTsKLXZvaWQJKnBhY2tldF9nZXRfb3V0cHV0KHZvaWQpOwotCi0jZW5kaWYJCQkJLyogUEFDS0VUX0ggKi8KZGlmZiAtLWdpdCBhL3BhdGhuYW1lcy5oIGIvcGF0aG5hbWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDlhYmYuLjAwMDAwMDAKLS0tIGEvcGF0aG5hbWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHBhdGhuYW1lcy5oLHYgMS4yMiAyMDExLzA1LzIzIDAzOjMwOjA3IGRqbSBFeHAgJCAqLwotCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLQotI2RlZmluZSBFVENESVIJCQkJIi9ldGMiCi0KLSNpZm5kZWYgU1NIRElSCi0jZGVmaW5lIFNTSERJUgkJCQlFVENESVIgIi9zc2giCi0jZW5kaWYKLQotI2lmbmRlZiBfUEFUSF9TU0hfUElERElSCi0jZGVmaW5lIF9QQVRIX1NTSF9QSURESVIJCSIvdmFyL3J1biIKLSNlbmRpZgotCi0vKgotICogU3lzdGVtLXdpZGUgZmlsZSBjb250YWluaW5nIGhvc3Qga2V5cyBvZiBrbm93biBob3N0cy4gIFRoaXMgZmlsZSBzaG91bGQgYmUKLSAqIHdvcmxkLXJlYWRhYmxlLgotICovCi0jZGVmaW5lIF9QQVRIX1NTSF9TWVNURU1fSE9TVEZJTEUJU1NIRElSICIvc3NoX2tub3duX2hvc3RzIgotLyogYmFja3dhcmQgY29tcGF0IGZvciBwcm90b2NvbCAyICovCi0jZGVmaW5lIF9QQVRIX1NTSF9TWVNURU1fSE9TVEZJTEUyCVNTSERJUiAiL3NzaF9rbm93bl9ob3N0czIiCi0KLS8qCi0gKiBPZiB0aGVzZSwgc3NoX2hvc3Rfa2V5IG11c3QgYmUgcmVhZGFibGUgb25seSBieSByb290LCB3aGVyZWFzIHNzaF9jb25maWcKLSAqIHNob3VsZCBiZSB3b3JsZC1yZWFkYWJsZS4KLSAqLwotI2RlZmluZSBfUEFUSF9TRVJWRVJfQ09ORklHX0ZJTEUJU1NIRElSICIvc3NoZF9jb25maWciCi0jZGVmaW5lIF9QQVRIX0hPU1RfQ09ORklHX0ZJTEUJCVNTSERJUiAiL3NzaF9jb25maWciCi0jZGVmaW5lIF9QQVRIX0hPU1RfS0VZX0ZJTEUJCVNTSERJUiAiL3NzaF9ob3N0X2tleSIKLSNkZWZpbmUgX1BBVEhfSE9TVF9EU0FfS0VZX0ZJTEUJCVNTSERJUiAiL3NzaF9ob3N0X2RzYV9rZXkiCi0jZGVmaW5lIF9QQVRIX0hPU1RfRUNEU0FfS0VZX0ZJTEUJU1NIRElSICIvc3NoX2hvc3RfZWNkc2Ffa2V5IgotI2RlZmluZSBfUEFUSF9IT1NUX1JTQV9LRVlfRklMRQkJU1NIRElSICIvc3NoX2hvc3RfcnNhX2tleSIKLSNkZWZpbmUgX1BBVEhfREhfTU9EVUxJCQkJU1NIRElSICIvbW9kdWxpIgotLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgX1BBVEhfREhfUFJJTUVTCQkJU1NIRElSICIvcHJpbWVzIgotCi0jaWZuZGVmIF9QQVRIX1NTSF9QUk9HUkFNCi0jZGVmaW5lIF9QQVRIX1NTSF9QUk9HUkFNCQkiL3Vzci9iaW4vc3NoIgotI2VuZGlmCi0KLS8qCi0gKiBUaGUgcHJvY2VzcyBpZCBvZiB0aGUgZGFlbW9uIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMgaXMgc2F2ZWQgaGVyZSB0bwotICogbWFrZSBpdCBlYXNpZXIgdG8ga2lsbCB0aGUgY29ycmVjdCBkYWVtb24gd2hlbiBuZWNlc3NhcnkuCi0gKi8KLSNkZWZpbmUgX1BBVEhfU1NIX0RBRU1PTl9QSURfRklMRQlfUEFUSF9TU0hfUElERElSICIvc3NoZC5waWQiCi0KLS8qCi0gKiBUaGUgZGlyZWN0b3J5IGluIHVzZXIncyBob21lIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgZmlsZXMgcmVzaWRlLiBUaGUKLSAqIGRpcmVjdG9yeSBzaG91bGQgYmUgd29ybGQtcmVhZGFibGUgKHRob3VnaCBub3QgYWxsIGZpbGVzIGFyZSkuCi0gKi8KLSNkZWZpbmUgX1BBVEhfU1NIX1VTRVJfRElSCQkiLnNzaCIKLQotLyoKLSAqIFBlci11c2VyIGZpbGUgY29udGFpbmluZyBob3N0IGtleXMgb2Yga25vd24gaG9zdHMuICBUaGlzIGZpbGUgbmVlZCBub3QgYmUKLSAqIHJlYWRhYmxlIGJ5IGFueW9uZSBleGNlcHQgdGhlIHVzZXIgaGltL2hlcnNlbGYsIHRob3VnaCB0aGlzIGRvZXMgbm90Ci0gKiBjb250YWluIGFueXRoaW5nIHBhcnRpY3VsYXJseSBzZWNyZXQuCi0gKi8KLSNkZWZpbmUgX1BBVEhfU1NIX1VTRVJfSE9TVEZJTEUJCSJ+Ly5zc2gva25vd25faG9zdHMiCi0vKiBiYWNrd2FyZCBjb21wYXQgZm9yIHByb3RvY29sIDIgKi8KLSNkZWZpbmUgX1BBVEhfU1NIX1VTRVJfSE9TVEZJTEUyCSJ+Ly5zc2gva25vd25faG9zdHMyIgotCi0vKgotICogTmFtZSBvZiB0aGUgZGVmYXVsdCBmaWxlIGNvbnRhaW5pbmcgY2xpZW50LXNpZGUgYXV0aGVudGljYXRpb24ga2V5LiBUaGlzCi0gKiBmaWxlIHNob3VsZCBvbmx5IGJlIHJlYWRhYmxlIGJ5IHRoZSB1c2VyIGhpbS9oZXJzZWxmLgotICovCi0jZGVmaW5lIF9QQVRIX1NTSF9DTElFTlRfSURFTlRJVFkJIi5zc2gvaWRlbnRpdHkiCi0jZGVmaW5lIF9QQVRIX1NTSF9DTElFTlRfSURfRFNBCQkiLnNzaC9pZF9kc2EiCi0jZGVmaW5lIF9QQVRIX1NTSF9DTElFTlRfSURfRUNEU0EJIi5zc2gvaWRfZWNkc2EiCi0jZGVmaW5lIF9QQVRIX1NTSF9DTElFTlRfSURfUlNBCQkiLnNzaC9pZF9yc2EiCi0KLS8qCi0gKiBDb25maWd1cmF0aW9uIGZpbGUgaW4gdXNlcidzIGhvbWUgZGlyZWN0b3J5LiAgVGhpcyBmaWxlIG5lZWQgbm90IGJlCi0gKiByZWFkYWJsZSBieSBhbnlvbmUgYnV0IHRoZSB1c2VyIGhpbS9oZXJzZWxmLCBidXQgZG9lcyBub3QgY29udGFpbiBhbnl0aGluZwotICogcGFydGljdWxhcmx5IHNlY3JldC4gIElmIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgcmVzaWRlcyBvbiBhbiBORlMKLSAqIHZvbHVtZSB3aGVyZSByb290IGlzIG1hcHBlZCB0byBub2JvZHksIHRoaXMgbWF5IG5lZWQgdG8gYmUgd29ybGQtcmVhZGFibGUuCi0gKi8KLSNkZWZpbmUgX1BBVEhfU1NIX1VTRVJfQ09ORkZJTEUJCSIuc3NoL2NvbmZpZyIKLQotLyoKLSAqIEZpbGUgY29udGFpbmluZyBhIGxpc3Qgb2YgdGhvc2UgcnNhIGtleXMgdGhhdCBwZXJtaXQgbG9nZ2luZyBpbiBhcyB0aGlzCi0gKiB1c2VyLiAgVGhpcyBmaWxlIG5lZWQgbm90IGJlIHJlYWRhYmxlIGJ5IGFueW9uZSBidXQgdGhlIHVzZXIgaGltL2hlcnNlbGYsCi0gKiBidXQgZG9lcyBub3QgY29udGFpbiBhbnl0aGluZyBwYXJ0aWN1bGFybHkgc2VjcmV0LiAgSWYgdGhlIHVzZXIncyBob21lCi0gKiBkaXJlY3RvcnkgcmVzaWRlcyBvbiBhbiBORlMgdm9sdW1lIHdoZXJlIHJvb3QgaXMgbWFwcGVkIHRvIG5vYm9keSwgdGhpcwotICogbWF5IG5lZWQgdG8gYmUgd29ybGQtcmVhZGFibGUuICAoVGhpcyBmaWxlIGlzIHJlYWQgYnkgdGhlIGRhZW1vbiB3aGljaCBpcwotICogcnVubmluZyBhcyByb290LikKLSAqLwotI2RlZmluZSBfUEFUSF9TU0hfVVNFUl9QRVJNSVRURURfS0VZUwkiLnNzaC9hdXRob3JpemVkX2tleXMiCi0KLS8qIGJhY2t3YXJkIGNvbXBhdCBmb3IgcHJvdG9jb2wgdjIgKi8KLSNkZWZpbmUgX1BBVEhfU1NIX1VTRVJfUEVSTUlUVEVEX0tFWVMyCSIuc3NoL2F1dGhvcml6ZWRfa2V5czIiCi0KLS8qCi0gKiBQZXItdXNlciBhbmQgc3lzdGVtLXdpZGUgc3NoICJyYyIgZmlsZXMuICBUaGVzZSBmaWxlcyBhcmUgZXhlY3V0ZWQgd2l0aAotICogL2Jpbi9zaCBiZWZvcmUgc3RhcnRpbmcgdGhlIHNoZWxsIG9yIGNvbW1hbmQgaWYgdGhleSBleGlzdC4gIFRoZXkgd2lsbCBiZQotICogcGFzc2VkICJwcm90byBjb29raWUiIGFzIGFyZ3VtZW50cyBpZiBYMTEgZm9yd2FyZGluZyB3aXRoIHNwb29maW5nIGlzIGluCi0gKiB1c2UuICB4YXV0aCB3aWxsIGJlIHJ1biBpZiBuZWl0aGVyIG9mIHRoZXNlIGV4aXN0cy4KLSAqLwotI2RlZmluZSBfUEFUSF9TU0hfVVNFUl9SQwkJIi5zc2gvcmMiCi0jZGVmaW5lIF9QQVRIX1NTSF9TWVNURU1fUkMJCVNTSERJUiAiL3NzaHJjIgotCi0vKgotICogU3NoLW9ubHkgdmVyc2lvbiBvZiAvZXRjL2hvc3RzLmVxdWl2LiAgQWRkaXRpb25hbGx5LCB0aGUgZGFlbW9uIG1heSB1c2UKLSAqIH4vLnJob3N0cyBhbmQgL2V0Yy9ob3N0cy5lcXVpdiBpZiByaG9zdHMgYXV0aGVudGljYXRpb24gaXMgZW5hYmxlZC4KLSAqLwotI2RlZmluZSBfUEFUSF9TU0hfSE9TVFNfRVFVSVYJCVNTSERJUiAiL3Nob3N0cy5lcXVpdiIKLSNkZWZpbmUgX1BBVEhfUkhPU1RTX0VRVUlWCQkiL2V0Yy9ob3N0cy5lcXVpdiIKLQotLyoKLSAqIERlZmF1bHQgbG9jYXRpb24gb2YgYXNrcGFzcwotICovCi0jaWZuZGVmIF9QQVRIX1NTSF9BU0tQQVNTX0RFRkFVTFQKLSNkZWZpbmUgX1BBVEhfU1NIX0FTS1BBU1NfREVGQVVMVAkiL3Vzci9YMTFSNi9iaW4vc3NoLWFza3Bhc3MiCi0jZW5kaWYKLQotLyogTG9jYXRpb24gb2Ygc3NoLWtleXNpZ24gZm9yIGhvc3RiYXNlZCBhdXRoZW50aWNhdGlvbiAqLwotI2lmbmRlZiBfUEFUSF9TU0hfS0VZX1NJR04KLSNkZWZpbmUgX1BBVEhfU1NIX0tFWV9TSUdOCQkiL3Vzci9saWJleGVjL3NzaC1rZXlzaWduIgotI2VuZGlmCi0KLS8qIExvY2F0aW9uIG9mIHNzaC1wa2NzMTEtaGVscGVyIHRvIHN1cHBvcnQga2V5cyBpbiB0b2tlbnMgKi8KLSNpZm5kZWYgX1BBVEhfU1NIX1BLQ1MxMV9IRUxQRVIKLSNkZWZpbmUgX1BBVEhfU1NIX1BLQ1MxMV9IRUxQRVIJCSIvdXNyL2xpYmV4ZWMvc3NoLXBrY3MxMS1oZWxwZXIiCi0jZW5kaWYKLQotLyogeGF1dGggZm9yIFgxMSBmb3J3YXJkaW5nICovCi0jaWZuZGVmIF9QQVRIX1hBVVRICi0jZGVmaW5lIF9QQVRIX1hBVVRICQkJIi91c3IvWDExUjYvYmluL3hhdXRoIgotI2VuZGlmCi0KLS8qIFVOSVggZG9tYWluIHNvY2tldCBmb3IgWDExIHNlcnZlcjsgZGlzcGxheW51bSB3aWxsIHJlcGxhY2UgJXUgKi8KLSNpZm5kZWYgX1BBVEhfVU5JWF9YCi0jZGVmaW5lIF9QQVRIX1VOSVhfWCAiL3RtcC8uWDExLXVuaXgvWCV1IgotI2VuZGlmCi0KLS8qIGZvciBzY3AgKi8KLSNpZm5kZWYgX1BBVEhfQ1AKLSNkZWZpbmUgX1BBVEhfQ1AJCQkiY3AiCi0jZW5kaWYKLQotLyogZm9yIHNmdHAgKi8KLSNpZm5kZWYgX1BBVEhfU0ZUUF9TRVJWRVIKLSNkZWZpbmUgX1BBVEhfU0ZUUF9TRVJWRVIJCSIvdXNyL2xpYmV4ZWMvc2Z0cC1zZXJ2ZXIiCi0jZW5kaWYKLQotLyogY2hyb290IGRpcmVjdG9yeSBmb3IgdW5wcml2aWxlZ2VkIHVzZXIgd2hlbiBVc2VQcml2aWxlZ2VTZXBhcmF0aW9uPXllcyAqLwotI2lmbmRlZiBfUEFUSF9QUklWU0VQX0NIUk9PVF9ESVIKLSNkZWZpbmUgX1BBVEhfUFJJVlNFUF9DSFJPT1RfRElSCSIvdmFyL2VtcHR5IgotI2VuZGlmCi0KLS8qIGZvciBwYXNzd2QgY2hhbmdlICovCi0jaWZuZGVmIF9QQVRIX1BBU1NXRF9QUk9HCi0jZGVmaW5lIF9QQVRIX1BBU1NXRF9QUk9HICAgICAgICAgICAgICIvdXNyL2Jpbi9wYXNzd2QiCi0jZW5kaWYKLQotI2lmbmRlZiBfUEFUSF9MUwotI2RlZmluZSBfUEFUSF9MUwkJCSJscyIKLSNlbmRpZgotCi0vKiBwYXRoIHRvIGxvZ2luIHByb2dyYW0gKi8KLSNpZm5kZWYgTE9HSU5fUFJPR1JBTQotIyBpZmRlZiBMT0dJTl9QUk9HUkFNX0ZBTExCQUNLCi0jICBkZWZpbmUgTE9HSU5fUFJPR1JBTSAgICAgICAgIExPR0lOX1BST0dSQU1fRkFMTEJBQ0sKLSMgZWxzZQotIyAgZGVmaW5lIExPR0lOX1BST0dSQU0gICAgICAgICAiL3Vzci9iaW4vbG9naW4iCi0jIGVuZGlmCi0jZW5kaWYgLyogTE9HSU5fUFJPR1JBTSAqLwotCi0vKiBBc2twYXNzIHByb2dyYW0gZGVmaW5lICovCi0jaWZuZGVmIEFTS1BBU1NfUFJPR1JBTQotI2RlZmluZSBBU0tQQVNTX1BST0dSQU0gICAgICAgICAiL3Vzci9saWIvc3NoL3NzaC1hc2twYXNzIgotI2VuZGlmIC8qIEFTS1BBU1NfUFJPR1JBTSAqLwpkaWZmIC0tZ2l0IGEvcGtjczExLmggYi9wa2NzMTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkZTViMy4uMDAwMDAwMAotLS0gYS9wa2NzMTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNTcgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHBrY3MxMS5oLHYgMS4yIDIwMTAvMDIvMjQgMDY6MTI6NTMgZGptIEV4cCAkICovCi0vKiBwa2NzMTEuaAotICAgQ29weXJpZ2h0IDIwMDYsIDIwMDcgZzEwIENvZGUgR21iSAotICAgQ29weXJpZ2h0IDIwMDYgQW5kcmVhcyBKZWxsaW5naGF1cwotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0aGUgYXV0aG9yIGdpdmVzCi0gICB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKLSAgIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0gICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0IGV2ZW4KLSAgIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAgIFBVUlBPU0UuICAqLwotCi0vKiBQbGVhc2Ugc3VibWl0IGNoYW5nZXMgYmFjayB0byB0aGUgU2N1dGUgcHJvamVjdCBhdAotICAgaHR0cDovL3d3dy5zY3V0ZS5vcmcvIChvciBzZW5kIHRoZW0gdG8gbWFyY3VzQGcxMGNvZGUuY29tKSwgc28gdGhhdAotICAgdGhleSBjYW4gYmUgcGlja2VkIHVwIGJ5IG90aGVyIHByb2plY3RzIGZyb20gdGhlcmUgYXMgd2VsbC4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBhIG1vZGlmaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQS0NTICMxMSBzdGFuZGFyZCBieQotICAgUlNBIFNlY3VyaXR5IEluYy4gIEl0IGlzIG1vc3RseSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQsIHdpdGggdGhlCi0gICBmb2xsb3dpbmcgY2hhbmdlOgotCi0gICBUaGlzIGhlYWRlciBmaWxlIGRvZXMgbm90IHJlcXVpcmUgYW55IG1hY3JvIGRlZmluaXRpb25zIGJ5IHRoZSB1c2VyCi0gICAobGlrZSBDS19ERUZJTkVfRlVOQ1RJT04gZXRjKS4gIEluIGZhY3QsIGl0IGRlZmluZXMgdGhvc2UgbWFjcm9zCi0gICBmb3IgeW91IChpZiB1c2VmdWwsIHNvbWUgYXJlIG1pc3NpbmcsIGxldCBtZSBrbm93IGlmIHlvdSBuZWVkCi0gICBtb3JlKS4KLQotICAgVGhlcmUgaXMgYW4gYWRkaXRpb25hbCBBUEkgYXZhaWxhYmxlIHRoYXQgZG9lcyBjb21wbHkgYmV0dGVyIHRvIHRoZQotICAgR05VIGNvZGluZyBzdGFuZGFyZC4gIEl0IGNhbiBiZSBzd2l0Y2hlZCBvbiBieSBkZWZpbmluZwotICAgQ1JZUFRPS0lfR05VIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgZmlsZS4gIEZvciB0aGlzLCB0aGUKLSAgIGZvbGxvd2luZyBjaGFuZ2VzIGFyZSBtYWRlIHRvIHRoZSBzcGVjaWZpY2F0aW9uOgotCi0gICBBbGwgc3RydWN0dXJlIHR5cGVzIGFyZSBjaGFuZ2VkIHRvIGEgInN0cnVjdCBja19mb28iIHdoZXJlIENLX0ZPTwotICAgaXMgdGhlIHR5cGUgbmFtZSBpbiBQS0NTICMxMS4KLQotICAgQWxsIG5vbi1zdHJ1Y3R1cmUgdHlwZXMgYXJlIGNoYW5nZWQgdG8gY2tfZm9vX3Qgd2hlcmUgQ0tfRk9PIGlzIHRoZQotICAgbG93ZXJjYXNlIHZlcnNpb24gb2YgdGhlIHR5cGUgbmFtZSBpbiBQS0NTICMxMS4gIFRoZSBiYXNpYyB0eXBlcwotICAgKENLX1VMT05HIGV0IGFsLikgYXJlIHJlbW92ZWQgd2l0aG91dCBzdWJzdGl0dXRlLgotCi0gICBBbGwgbWVtYmVycyBvZiBzdHJ1Y3R1cmVzIGFyZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIHdheTogVHlwZQotICAgaW5kaWNhdGlvbiBwcmVmaXhlcyBhcmUgcmVtb3ZlZCwgYW5kIHVuZGVyc2NvcmUgY2hhcmFjdGVycyBhcmUKLSAgIGluc2VydGVkIGJlZm9yZSB3b3Jkcy4gIFRoZW4gdGhlIHJlc3VsdCBpcyBsb3dlcmNhc2VkLgotCi0gICBOb3RlIHRoYXQgZnVuY3Rpb24gbmFtZXMgYXJlIHN0aWxsIGluIHRoZSBvcmlnaW5hbCBjYXNlLCBhcyB0aGV5Ci0gICBuZWVkIGZvciBBQkkgY29tcGF0aWJpbGl0eS4KLQotICAgQ0tfRkFMU0UsIENLX1RSVUUgYW5kIE5VTExfUFRSIGFyZSByZW1vdmVkIHdpdGhvdXQgc3Vic3RpdHV0ZS4gIFVzZQotICAgPHN0ZGJvb2wuaD4uCi0KLSAgIElmIENSWVBUT0tJX0NPTVBBVCBpcyBkZWZpbmVkIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgZmlsZSwKLSAgIHRoZW4gbm9uZSBvZiB0aGUgQVBJIGNoYW5nZXMgYWJvdmUgdGFrZSBwbGFjZSwgYW5kIHRoZSBBUEkgaXMgdGhlCi0gICBvbmUgZGVmaW5lZCBieSB0aGUgUEtDUyAjMTEgc3RhbmRhcmQuICAqLwotCi0jaWZuZGVmIFBLQ1MxMV9ICi0jZGVmaW5lIFBLQ1MxMV9IIDEKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qIFRoZSB2ZXJzaW9uIG9mIGNyeXB0b2tpIHdlIGltcGxlbWVudC4gIFRoZSByZXZpc2lvbiBpcyBjaGFuZ2VkIHdpdGgKLSAgIGVhY2ggbW9kaWZpY2F0aW9uIG9mIHRoaXMgZmlsZS4gIElmIHlvdSBkbyBub3QgdXNlIHRoZSAib2ZmaWNpYWwiCi0gICB2ZXJzaW9uIG9mIHRoaXMgZmlsZSwgcGxlYXNlIGNvbnNpZGVyIGRlbGV0aW5nIHRoZSByZXZpc2lvbiBtYWNybwotICAgKHlvdSBtYXkgdXNlIGEgbWFjcm8gd2l0aCBhIGRpZmZlcmVudCBuYW1lIHRvIGtlZXAgdHJhY2sgb2YgeW91cgotICAgdmVyc2lvbnMpLiAgKi8KLSNkZWZpbmUgQ1JZUFRPS0lfVkVSU0lPTl9NQUpPUgkJMgotI2RlZmluZSBDUllQVE9LSV9WRVJTSU9OX01JTk9SCQkyMAotI2RlZmluZSBDUllQVE9LSV9WRVJTSU9OX1JFVklTSU9OCTYKLQotCi0vKiBDb21wYXRpYmlsaXR5IGludGVyZmFjZSBpcyBkZWZhdWx0LCB1bmxlc3MgQ1JZUFRPS0lfR05VIGlzCi0gICBnaXZlbi4gICovCi0jaWZuZGVmIENSWVBUT0tJX0dOVQotI2lmbmRlZiBDUllQVE9LSV9DT01QQVQKLSNkZWZpbmUgQ1JZUFRPS0lfQ09NUEFUIDEKLSNlbmRpZgotI2VuZGlmCi0KLS8qIFN5c3RlbSBkZXBlbmRlbmNpZXMuICAqLwotCi0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoQ1JZUFRPS0lfRk9SQ0VfV0lOMzIpCi0KLS8qIFRoZXJlIGlzIGEgbWF0Y2hpbmcgcG9wIGJlbG93LiAgKi8KLSNwcmFnbWEgcGFjayhwdXNoLCBjcnlwdG9raSwgMSkKLQotI2lmZGVmIENSWVBUT0tJX0VYUE9SVFMKLSNkZWZpbmUgQ0tfU1BFQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSNlbHNlCi0jZGVmaW5lIENLX1NQRUMgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jZW5kaWYKLQotI2Vsc2UKLQotI2RlZmluZSBDS19TUEVDCi0KLSNlbmRpZgotCi0KLSNpZmRlZiBDUllQVE9LSV9DT01QQVQKLSAgLyogSWYgd2UgYXJlIGluIGNvbXBhdGliaWxpdHkgbW9kZSwgc3dpdGNoIGFsbCBleHBvc2VkIG5hbWVzIHRvIHRoZQotICAgICBQS0NTICMxMSB2YXJpYW50LiAgVGhlcmUgYXJlIGNvcnJlc3BvbmRpbmcgI3VuZGVmcyBiZWxvdy4gICovCi0KLSNkZWZpbmUgY2tfZmxhZ3NfdCBDS19GTEFHUwotI2RlZmluZSBja192ZXJzaW9uIF9DS19WRVJTSU9OCi0KLSNkZWZpbmUgY2tfaW5mbyBfQ0tfSU5GTwotI2RlZmluZSBjcnlwdG9raV92ZXJzaW9uIGNyeXB0b2tpVmVyc2lvbgotI2RlZmluZSBtYW51ZmFjdHVyZXJfaWQgbWFudWZhY3R1cmVySUQKLSNkZWZpbmUgbGlicmFyeV9kZXNjcmlwdGlvbiBsaWJyYXJ5RGVzY3JpcHRpb24KLSNkZWZpbmUgbGlicmFyeV92ZXJzaW9uIGxpYnJhcnlWZXJzaW9uCi0KLSNkZWZpbmUgY2tfbm90aWZpY2F0aW9uX3QgQ0tfTk9USUZJQ0FUSU9OCi0jZGVmaW5lIGNrX3Nsb3RfaWRfdCBDS19TTE9UX0lECi0KLSNkZWZpbmUgY2tfc2xvdF9pbmZvIF9DS19TTE9UX0lORk8KLSNkZWZpbmUgc2xvdF9kZXNjcmlwdGlvbiBzbG90RGVzY3JpcHRpb24KLSNkZWZpbmUgaGFyZHdhcmVfdmVyc2lvbiBoYXJkd2FyZVZlcnNpb24KLSNkZWZpbmUgZmlybXdhcmVfdmVyc2lvbiBmaXJtd2FyZVZlcnNpb24KLQotI2RlZmluZSBja190b2tlbl9pbmZvIF9DS19UT0tFTl9JTkZPCi0jZGVmaW5lIHNlcmlhbF9udW1iZXIgc2VyaWFsTnVtYmVyCi0jZGVmaW5lIG1heF9zZXNzaW9uX2NvdW50IHVsTWF4U2Vzc2lvbkNvdW50Ci0jZGVmaW5lIHNlc3Npb25fY291bnQgdWxTZXNzaW9uQ291bnQKLSNkZWZpbmUgbWF4X3J3X3Nlc3Npb25fY291bnQgdWxNYXhSd1Nlc3Npb25Db3VudAotI2RlZmluZSByd19zZXNzaW9uX2NvdW50IHVsUndTZXNzaW9uQ291bnQKLSNkZWZpbmUgbWF4X3Bpbl9sZW4gdWxNYXhQaW5MZW4KLSNkZWZpbmUgbWluX3Bpbl9sZW4gdWxNaW5QaW5MZW4KLSNkZWZpbmUgdG90YWxfcHVibGljX21lbW9yeSB1bFRvdGFsUHVibGljTWVtb3J5Ci0jZGVmaW5lIGZyZWVfcHVibGljX21lbW9yeSB1bEZyZWVQdWJsaWNNZW1vcnkKLSNkZWZpbmUgdG90YWxfcHJpdmF0ZV9tZW1vcnkgdWxUb3RhbFByaXZhdGVNZW1vcnkKLSNkZWZpbmUgZnJlZV9wcml2YXRlX21lbW9yeSB1bEZyZWVQcml2YXRlTWVtb3J5Ci0jZGVmaW5lIHV0Y190aW1lIHV0Y1RpbWUKLQotI2RlZmluZSBja19zZXNzaW9uX2hhbmRsZV90IENLX1NFU1NJT05fSEFORExFCi0jZGVmaW5lIGNrX3VzZXJfdHlwZV90IENLX1VTRVJfVFlQRQotI2RlZmluZSBja19zdGF0ZV90IENLX1NUQVRFCi0KLSNkZWZpbmUgY2tfc2Vzc2lvbl9pbmZvIF9DS19TRVNTSU9OX0lORk8KLSNkZWZpbmUgc2xvdF9pZCBzbG90SUQKLSNkZWZpbmUgZGV2aWNlX2Vycm9yIHVsRGV2aWNlRXJyb3IKLQotI2RlZmluZSBja19vYmplY3RfaGFuZGxlX3QgQ0tfT0JKRUNUX0hBTkRMRQotI2RlZmluZSBja19vYmplY3RfY2xhc3NfdCBDS19PQkpFQ1RfQ0xBU1MKLSNkZWZpbmUgY2tfaHdfZmVhdHVyZV90eXBlX3QgQ0tfSFdfRkVBVFVSRV9UWVBFCi0jZGVmaW5lIGNrX2tleV90eXBlX3QgQ0tfS0VZX1RZUEUKLSNkZWZpbmUgY2tfY2VydGlmaWNhdGVfdHlwZV90IENLX0NFUlRJRklDQVRFX1RZUEUKLSNkZWZpbmUgY2tfYXR0cmlidXRlX3R5cGVfdCBDS19BVFRSSUJVVEVfVFlQRQotCi0jZGVmaW5lIGNrX2F0dHJpYnV0ZSBfQ0tfQVRUUklCVVRFCi0jZGVmaW5lIHZhbHVlIHBWYWx1ZQotI2RlZmluZSB2YWx1ZV9sZW4gdWxWYWx1ZUxlbgotCi0jZGVmaW5lIGNrX2RhdGUgX0NLX0RBVEUKLQotI2RlZmluZSBja19tZWNoYW5pc21fdHlwZV90IENLX01FQ0hBTklTTV9UWVBFCi0KLSNkZWZpbmUgY2tfbWVjaGFuaXNtIF9DS19NRUNIQU5JU00KLSNkZWZpbmUgcGFyYW1ldGVyIHBQYXJhbWV0ZXIKLSNkZWZpbmUgcGFyYW1ldGVyX2xlbiB1bFBhcmFtZXRlckxlbgotCi0jZGVmaW5lIGNrX21lY2hhbmlzbV9pbmZvIF9DS19NRUNIQU5JU01fSU5GTwotI2RlZmluZSBtaW5fa2V5X3NpemUgdWxNaW5LZXlTaXplCi0jZGVmaW5lIG1heF9rZXlfc2l6ZSB1bE1heEtleVNpemUKLQotI2RlZmluZSBja19ydl90IENLX1JWCi0jZGVmaW5lIGNrX25vdGlmeV90IENLX05PVElGWQotCi0jZGVmaW5lIGNrX2Z1bmN0aW9uX2xpc3QgX0NLX0ZVTkNUSU9OX0xJU1QKLQotI2RlZmluZSBja19jcmVhdGVtdXRleF90IENLX0NSRUFURU1VVEVYCi0jZGVmaW5lIGNrX2Rlc3Ryb3ltdXRleF90IENLX0RFU1RST1lNVVRFWAotI2RlZmluZSBja19sb2NrbXV0ZXhfdCBDS19MT0NLTVVURVgKLSNkZWZpbmUgY2tfdW5sb2NrbXV0ZXhfdCBDS19VTkxPQ0tNVVRFWAotCi0jZGVmaW5lIGNrX2NfaW5pdGlhbGl6ZV9hcmdzIF9DS19DX0lOSVRJQUxJWkVfQVJHUwotI2RlZmluZSBjcmVhdGVfbXV0ZXggQ3JlYXRlTXV0ZXgKLSNkZWZpbmUgZGVzdHJveV9tdXRleCBEZXN0cm95TXV0ZXgKLSNkZWZpbmUgbG9ja19tdXRleCBMb2NrTXV0ZXgKLSNkZWZpbmUgdW5sb2NrX211dGV4IFVubG9ja011dGV4Ci0jZGVmaW5lIHJlc2VydmVkIHBSZXNlcnZlZAotCi0jZW5kaWYJLyogQ1JZUFRPS0lfQ09NUEFUICovCi0KLQotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfZmxhZ3NfdDsKLQotc3RydWN0IGNrX3ZlcnNpb24KLXsKLSAgdW5zaWduZWQgY2hhciBtYWpvcjsKLSAgdW5zaWduZWQgY2hhciBtaW5vcjsKLX07Ci0KLQotc3RydWN0IGNrX2luZm8KLXsKLSAgc3RydWN0IGNrX3ZlcnNpb24gY3J5cHRva2lfdmVyc2lvbjsKLSAgdW5zaWduZWQgY2hhciBtYW51ZmFjdHVyZXJfaWRbMzJdOwotICBja19mbGFnc190IGZsYWdzOwotICB1bnNpZ25lZCBjaGFyIGxpYnJhcnlfZGVzY3JpcHRpb25bMzJdOwotICBzdHJ1Y3QgY2tfdmVyc2lvbiBsaWJyYXJ5X3ZlcnNpb247Ci19OwotCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBja19ub3RpZmljYXRpb25fdDsKLQotI2RlZmluZSBDS05fU1VSUkVOREVSCSgwKQotCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBja19zbG90X2lkX3Q7Ci0KLQotc3RydWN0IGNrX3Nsb3RfaW5mbwotewotICB1bnNpZ25lZCBjaGFyIHNsb3RfZGVzY3JpcHRpb25bNjRdOwotICB1bnNpZ25lZCBjaGFyIG1hbnVmYWN0dXJlcl9pZFszMl07Ci0gIGNrX2ZsYWdzX3QgZmxhZ3M7Ci0gIHN0cnVjdCBja192ZXJzaW9uIGhhcmR3YXJlX3ZlcnNpb247Ci0gIHN0cnVjdCBja192ZXJzaW9uIGZpcm13YXJlX3ZlcnNpb247Ci19OwotCi0KLSNkZWZpbmUgQ0tGX1RPS0VOX1BSRVNFTlQJKDEgPDwgMCkKLSNkZWZpbmUgQ0tGX1JFTU9WQUJMRV9ERVZJQ0UJKDEgPDwgMSkKLSNkZWZpbmUgQ0tGX0hXX1NMT1QJCSgxIDw8IDIpCi0jZGVmaW5lIENLRl9BUlJBWV9BVFRSSUJVVEUJKDEgPDwgMzApCi0KLQotc3RydWN0IGNrX3Rva2VuX2luZm8KLXsKLSAgdW5zaWduZWQgY2hhciBsYWJlbFszMl07Ci0gIHVuc2lnbmVkIGNoYXIgbWFudWZhY3R1cmVyX2lkWzMyXTsKLSAgdW5zaWduZWQgY2hhciBtb2RlbFsxNl07Ci0gIHVuc2lnbmVkIGNoYXIgc2VyaWFsX251bWJlclsxNl07Ci0gIGNrX2ZsYWdzX3QgZmxhZ3M7Ci0gIHVuc2lnbmVkIGxvbmcgbWF4X3Nlc3Npb25fY291bnQ7Ci0gIHVuc2lnbmVkIGxvbmcgc2Vzc2lvbl9jb3VudDsKLSAgdW5zaWduZWQgbG9uZyBtYXhfcndfc2Vzc2lvbl9jb3VudDsKLSAgdW5zaWduZWQgbG9uZyByd19zZXNzaW9uX2NvdW50OwotICB1bnNpZ25lZCBsb25nIG1heF9waW5fbGVuOwotICB1bnNpZ25lZCBsb25nIG1pbl9waW5fbGVuOwotICB1bnNpZ25lZCBsb25nIHRvdGFsX3B1YmxpY19tZW1vcnk7Ci0gIHVuc2lnbmVkIGxvbmcgZnJlZV9wdWJsaWNfbWVtb3J5OwotICB1bnNpZ25lZCBsb25nIHRvdGFsX3ByaXZhdGVfbWVtb3J5OwotICB1bnNpZ25lZCBsb25nIGZyZWVfcHJpdmF0ZV9tZW1vcnk7Ci0gIHN0cnVjdCBja192ZXJzaW9uIGhhcmR3YXJlX3ZlcnNpb247Ci0gIHN0cnVjdCBja192ZXJzaW9uIGZpcm13YXJlX3ZlcnNpb247Ci0gIHVuc2lnbmVkIGNoYXIgdXRjX3RpbWVbMTZdOwotfTsKLQotCi0jZGVmaW5lIENLRl9STkcJCQkJCSgxIDw8IDApCi0jZGVmaW5lIENLRl9XUklURV9QUk9URUNURUQJCQkoMSA8PCAxKQotI2RlZmluZSBDS0ZfTE9HSU5fUkVRVUlSRUQJCQkoMSA8PCAyKQotI2RlZmluZSBDS0ZfVVNFUl9QSU5fSU5JVElBTElaRUQJCSgxIDw8IDMpCi0jZGVmaW5lIENLRl9SRVNUT1JFX0tFWV9OT1RfTkVFREVECQkoMSA8PCA1KQotI2RlZmluZSBDS0ZfQ0xPQ0tfT05fVE9LRU4JCQkoMSA8PCA2KQotI2RlZmluZSBDS0ZfUFJPVEVDVEVEX0FVVEhFTlRJQ0FUSU9OX1BBVEgJKDEgPDwgOCkKLSNkZWZpbmUgQ0tGX0RVQUxfQ1JZUFRPX09QRVJBVElPTlMJCSgxIDw8IDkpCi0jZGVmaW5lIENLRl9UT0tFTl9JTklUSUFMSVpFRAkJCSgxIDw8IDEwKQotI2RlZmluZSBDS0ZfU0VDT05EQVJZX0FVVEhFTlRJQ0FUSU9OCQkoMSA8PCAxMSkKLSNkZWZpbmUgQ0tGX1VTRVJfUElOX0NPVU5UX0xPVwkJCSgxIDw8IDE2KQotI2RlZmluZSBDS0ZfVVNFUl9QSU5fRklOQUxfVFJZCQkJKDEgPDwgMTcpCi0jZGVmaW5lIENLRl9VU0VSX1BJTl9MT0NLRUQJCQkoMSA8PCAxOCkKLSNkZWZpbmUgQ0tGX1VTRVJfUElOX1RPX0JFX0NIQU5HRUQJCSgxIDw8IDE5KQotI2RlZmluZSBDS0ZfU09fUElOX0NPVU5UX0xPVwkJCSgxIDw8IDIwKQotI2RlZmluZSBDS0ZfU09fUElOX0ZJTkFMX1RSWQkJCSgxIDw8IDIxKQotI2RlZmluZSBDS0ZfU09fUElOX0xPQ0tFRAkJCSgxIDw8IDIyKQotI2RlZmluZSBDS0ZfU09fUElOX1RPX0JFX0NIQU5HRUQJCSgxIDw8IDIzKQotCi0jZGVmaW5lIENLX1VOQVZBSUxBQkxFX0lORk9STUFUSU9OCSgodW5zaWduZWQgbG9uZykgLTEpCi0jZGVmaW5lIENLX0VGRkVDVElWRUxZX0lORklOSVRFCQkoMCkKLQotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfc2Vzc2lvbl9oYW5kbGVfdDsKLQotI2RlZmluZSBDS19JTlZBTElEX0hBTkRMRQkoMCkKLQotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfdXNlcl90eXBlX3Q7Ci0KLSNkZWZpbmUgQ0tVX1NPCQkJKDApCi0jZGVmaW5lIENLVV9VU0VSCQkoMSkKLSNkZWZpbmUgQ0tVX0NPTlRFWFRfU1BFQ0lGSUMJKDIpCi0KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGNrX3N0YXRlX3Q7Ci0KLSNkZWZpbmUgQ0tTX1JPX1BVQkxJQ19TRVNTSU9OCSgwKQotI2RlZmluZSBDS1NfUk9fVVNFUl9GVU5DVElPTlMJKDEpCi0jZGVmaW5lIENLU19SV19QVUJMSUNfU0VTU0lPTgkoMikKLSNkZWZpbmUgQ0tTX1JXX1VTRVJfRlVOQ1RJT05TCSgzKQotI2RlZmluZSBDS1NfUldfU09fRlVOQ1RJT05TCSg0KQotCi0KLXN0cnVjdCBja19zZXNzaW9uX2luZm8KLXsKLSAgY2tfc2xvdF9pZF90IHNsb3RfaWQ7Ci0gIGNrX3N0YXRlX3Qgc3RhdGU7Ci0gIGNrX2ZsYWdzX3QgZmxhZ3M7Ci0gIHVuc2lnbmVkIGxvbmcgZGV2aWNlX2Vycm9yOwotfTsKLQotI2RlZmluZSBDS0ZfUldfU0VTU0lPTgkJKDEgPDwgMSkKLSNkZWZpbmUgQ0tGX1NFUklBTF9TRVNTSU9OCSgxIDw8IDIpCi0KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGNrX29iamVjdF9oYW5kbGVfdDsKLQotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfb2JqZWN0X2NsYXNzX3Q7Ci0KLSNkZWZpbmUgQ0tPX0RBVEEJCSgwKQotI2RlZmluZSBDS09fQ0VSVElGSUNBVEUJCSgxKQotI2RlZmluZSBDS09fUFVCTElDX0tFWQkJKDIpCi0jZGVmaW5lIENLT19QUklWQVRFX0tFWQkJKDMpCi0jZGVmaW5lIENLT19TRUNSRVRfS0VZCQkoNCkKLSNkZWZpbmUgQ0tPX0hXX0ZFQVRVUkUJCSg1KQotI2RlZmluZSBDS09fRE9NQUlOX1BBUkFNRVRFUlMJKDYpCi0jZGVmaW5lIENLT19NRUNIQU5JU00JCSg3KQotI2RlZmluZSBDS09fVkVORE9SX0RFRklORUQJKCh1bnNpZ25lZCBsb25nKSAoMSA8PCAzMSkpCi0KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGNrX2h3X2ZlYXR1cmVfdHlwZV90OwotCi0jZGVmaW5lIENLSF9NT05PVE9OSUNfQ09VTlRFUgkoMSkKLSNkZWZpbmUgQ0tIX0NMT0NLCQkoMikKLSNkZWZpbmUgQ0tIX1VTRVJfSU5URVJGQUNFCSgzKQotI2RlZmluZSBDS0hfVkVORE9SX0RFRklORUQJKCh1bnNpZ25lZCBsb25nKSAoMSA8PCAzMSkpCi0KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGNrX2tleV90eXBlX3Q7Ci0KLSNkZWZpbmUgQ0tLX1JTQQkJCSgwKQotI2RlZmluZSBDS0tfRFNBCQkJKDEpCi0jZGVmaW5lIENLS19ESAkJCSgyKQotI2RlZmluZSBDS0tfRUNEU0EJCSgzKQotI2RlZmluZSBDS0tfRUMJCQkoMykKLSNkZWZpbmUgQ0tLX1g5XzQyX0RICQkoNCkKLSNkZWZpbmUgQ0tLX0tFQQkJCSg1KQotI2RlZmluZSBDS0tfR0VORVJJQ19TRUNSRVQJKDB4MTApCi0jZGVmaW5lIENLS19SQzIJCQkoMHgxMSkKLSNkZWZpbmUgQ0tLX1JDNAkJCSgweDEyKQotI2RlZmluZSBDS0tfREVTCQkJKDB4MTMpCi0jZGVmaW5lIENLS19ERVMyCQkoMHgxNCkKLSNkZWZpbmUgQ0tLX0RFUzMJCSgweDE1KQotI2RlZmluZSBDS0tfQ0FTVAkJKDB4MTYpCi0jZGVmaW5lIENLS19DQVNUMwkJKDB4MTcpCi0jZGVmaW5lIENLS19DQVNUMTI4CQkoMHgxOCkKLSNkZWZpbmUgQ0tLX1JDNQkJCSgweDE5KQotI2RlZmluZSBDS0tfSURFQQkJKDB4MWEpCi0jZGVmaW5lIENLS19TS0lQSkFDSwkJKDB4MWIpCi0jZGVmaW5lIENLS19CQVRPTgkJKDB4MWMpCi0jZGVmaW5lIENLS19KVU5JUEVSCQkoMHgxZCkKLSNkZWZpbmUgQ0tLX0NETUYJCSgweDFlKQotI2RlZmluZSBDS0tfQUVTCQkJKDB4MWYpCi0jZGVmaW5lIENLS19CTE9XRklTSAkJKDB4MjApCi0jZGVmaW5lIENLS19UV09GSVNICQkoMHgyMSkKLSNkZWZpbmUgQ0tLX1ZFTkRPUl9ERUZJTkVECSgodW5zaWduZWQgbG9uZykgKDEgPDwgMzEpKQotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfY2VydGlmaWNhdGVfdHlwZV90OwotCi0jZGVmaW5lIENLQ19YXzUwOQkJKDApCi0jZGVmaW5lIENLQ19YXzUwOV9BVFRSX0NFUlQJKDEpCi0jZGVmaW5lIENLQ19XVExTCQkoMikKLSNkZWZpbmUgQ0tDX1ZFTkRPUl9ERUZJTkVECSgodW5zaWduZWQgbG9uZykgKDEgPDwgMzEpKQotCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBja19hdHRyaWJ1dGVfdHlwZV90OwotCi0jZGVmaW5lIENLQV9DTEFTUwkJCSgwKQotI2RlZmluZSBDS0FfVE9LRU4JCQkoMSkKLSNkZWZpbmUgQ0tBX1BSSVZBVEUJCQkoMikKLSNkZWZpbmUgQ0tBX0xBQkVMCQkJKDMpCi0jZGVmaW5lIENLQV9BUFBMSUNBVElPTgkJCSgweDEwKQotI2RlZmluZSBDS0FfVkFMVUUJCQkoMHgxMSkKLSNkZWZpbmUgQ0tBX09CSkVDVF9JRAkJCSgweDEyKQotI2RlZmluZSBDS0FfQ0VSVElGSUNBVEVfVFlQRQkJKDB4ODApCi0jZGVmaW5lIENLQV9JU1NVRVIJCQkoMHg4MSkKLSNkZWZpbmUgQ0tBX1NFUklBTF9OVU1CRVIJCSgweDgyKQotI2RlZmluZSBDS0FfQUNfSVNTVUVSCQkJKDB4ODMpCi0jZGVmaW5lIENLQV9PV05FUgkJCSgweDg0KQotI2RlZmluZSBDS0FfQVRUUl9UWVBFUwkJCSgweDg1KQotI2RlZmluZSBDS0FfVFJVU1RFRAkJCSgweDg2KQotI2RlZmluZSBDS0FfQ0VSVElGSUNBVEVfQ0FURUdPUlkJKDB4ODcpCi0jZGVmaW5lIENLQV9KQVZBX01JRFBfU0VDVVJJVFlfRE9NQUlOCSgweDg4KQotI2RlZmluZSBDS0FfVVJMCQkJCSgweDg5KQotI2RlZmluZSBDS0FfSEFTSF9PRl9TVUJKRUNUX1BVQkxJQ19LRVkJKDB4OGEpCi0jZGVmaW5lIENLQV9IQVNIX09GX0lTU1VFUl9QVUJMSUNfS0VZCSgweDhiKQotI2RlZmluZSBDS0FfQ0hFQ0tfVkFMVUUJCQkoMHg5MCkKLSNkZWZpbmUgQ0tBX0tFWV9UWVBFCQkJKDB4MTAwKQotI2RlZmluZSBDS0FfU1VCSkVDVAkJCSgweDEwMSkKLSNkZWZpbmUgQ0tBX0lECQkJCSgweDEwMikKLSNkZWZpbmUgQ0tBX1NFTlNJVElWRQkJCSgweDEwMykKLSNkZWZpbmUgQ0tBX0VOQ1JZUFQJCQkoMHgxMDQpCi0jZGVmaW5lIENLQV9ERUNSWVBUCQkJKDB4MTA1KQotI2RlZmluZSBDS0FfV1JBUAkJCSgweDEwNikKLSNkZWZpbmUgQ0tBX1VOV1JBUAkJCSgweDEwNykKLSNkZWZpbmUgQ0tBX1NJR04JCQkoMHgxMDgpCi0jZGVmaW5lIENLQV9TSUdOX1JFQ09WRVIJCSgweDEwOSkKLSNkZWZpbmUgQ0tBX1ZFUklGWQkJCSgweDEwYSkKLSNkZWZpbmUgQ0tBX1ZFUklGWV9SRUNPVkVSCQkoMHgxMGIpCi0jZGVmaW5lIENLQV9ERVJJVkUJCQkoMHgxMGMpCi0jZGVmaW5lIENLQV9TVEFSVF9EQVRFCQkJKDB4MTEwKQotI2RlZmluZSBDS0FfRU5EX0RBVEUJCQkoMHgxMTEpCi0jZGVmaW5lIENLQV9NT0RVTFVTCQkJKDB4MTIwKQotI2RlZmluZSBDS0FfTU9EVUxVU19CSVRTCQkoMHgxMjEpCi0jZGVmaW5lIENLQV9QVUJMSUNfRVhQT05FTlQJCSgweDEyMikKLSNkZWZpbmUgQ0tBX1BSSVZBVEVfRVhQT05FTlQJCSgweDEyMykKLSNkZWZpbmUgQ0tBX1BSSU1FXzEJCQkoMHgxMjQpCi0jZGVmaW5lIENLQV9QUklNRV8yCQkJKDB4MTI1KQotI2RlZmluZSBDS0FfRVhQT05FTlRfMQkJCSgweDEyNikKLSNkZWZpbmUgQ0tBX0VYUE9ORU5UXzIJCQkoMHgxMjcpCi0jZGVmaW5lIENLQV9DT0VGRklDSUVOVAkJCSgweDEyOCkKLSNkZWZpbmUgQ0tBX1BSSU1FCQkJKDB4MTMwKQotI2RlZmluZSBDS0FfU1VCUFJJTUUJCQkoMHgxMzEpCi0jZGVmaW5lIENLQV9CQVNFCQkJKDB4MTMyKQotI2RlZmluZSBDS0FfUFJJTUVfQklUUwkJCSgweDEzMykKLSNkZWZpbmUgQ0tBX1NVQl9QUklNRV9CSVRTCQkoMHgxMzQpCi0jZGVmaW5lIENLQV9WQUxVRV9CSVRTCQkJKDB4MTYwKQotI2RlZmluZSBDS0FfVkFMVUVfTEVOCQkJKDB4MTYxKQotI2RlZmluZSBDS0FfRVhUUkFDVEFCTEUJCQkoMHgxNjIpCi0jZGVmaW5lIENLQV9MT0NBTAkJCSgweDE2MykKLSNkZWZpbmUgQ0tBX05FVkVSX0VYVFJBQ1RBQkxFCQkoMHgxNjQpCi0jZGVmaW5lIENLQV9BTFdBWVNfU0VOU0lUSVZFCQkoMHgxNjUpCi0jZGVmaW5lIENLQV9LRVlfR0VOX01FQ0hBTklTTQkJKDB4MTY2KQotI2RlZmluZSBDS0FfTU9ESUZJQUJMRQkJCSgweDE3MCkKLSNkZWZpbmUgQ0tBX0VDRFNBX1BBUkFNUwkJKDB4MTgwKQotI2RlZmluZSBDS0FfRUNfUEFSQU1TCQkJKDB4MTgwKQotI2RlZmluZSBDS0FfRUNfUE9JTlQJCQkoMHgxODEpCi0jZGVmaW5lIENLQV9TRUNPTkRBUllfQVVUSAkJKDB4MjAwKQotI2RlZmluZSBDS0FfQVVUSF9QSU5fRkxBR1MJCSgweDIwMSkKLSNkZWZpbmUgQ0tBX0FMV0FZU19BVVRIRU5USUNBVEUJCSgweDIwMikKLSNkZWZpbmUgQ0tBX1dSQVBfV0lUSF9UUlVTVEVECQkoMHgyMTApCi0jZGVmaW5lIENLQV9IV19GRUFUVVJFX1RZUEUJCSgweDMwMCkKLSNkZWZpbmUgQ0tBX1JFU0VUX09OX0lOSVQJCSgweDMwMSkKLSNkZWZpbmUgQ0tBX0hBU19SRVNFVAkJCSgweDMwMikKLSNkZWZpbmUgQ0tBX1BJWEVMX1gJCQkoMHg0MDApCi0jZGVmaW5lIENLQV9QSVhFTF9ZCQkJKDB4NDAxKQotI2RlZmluZSBDS0FfUkVTT0xVVElPTgkJCSgweDQwMikKLSNkZWZpbmUgQ0tBX0NIQVJfUk9XUwkJCSgweDQwMykKLSNkZWZpbmUgQ0tBX0NIQVJfQ09MVU1OUwkJKDB4NDA0KQotI2RlZmluZSBDS0FfQ09MT1IJCQkoMHg0MDUpCi0jZGVmaW5lIENLQV9CSVRTX1BFUl9QSVhFTAkJKDB4NDA2KQotI2RlZmluZSBDS0FfQ0hBUl9TRVRTCQkJKDB4NDgwKQotI2RlZmluZSBDS0FfRU5DT0RJTkdfTUVUSE9EUwkJKDB4NDgxKQotI2RlZmluZSBDS0FfTUlNRV9UWVBFUwkJCSgweDQ4MikKLSNkZWZpbmUgQ0tBX01FQ0hBTklTTV9UWVBFCQkoMHg1MDApCi0jZGVmaW5lIENLQV9SRVFVSVJFRF9DTVNfQVRUUklCVVRFUwkoMHg1MDEpCi0jZGVmaW5lIENLQV9ERUZBVUxUX0NNU19BVFRSSUJVVEVTCSgweDUwMikKLSNkZWZpbmUgQ0tBX1NVUFBPUlRFRF9DTVNfQVRUUklCVVRFUwkoMHg1MDMpCi0jZGVmaW5lIENLQV9XUkFQX1RFTVBMQVRFCQkoQ0tGX0FSUkFZX0FUVFJJQlVURSB8IDB4MjExKQotI2RlZmluZSBDS0FfVU5XUkFQX1RFTVBMQVRFCQkoQ0tGX0FSUkFZX0FUVFJJQlVURSB8IDB4MjEyKQotI2RlZmluZSBDS0FfQUxMT1dFRF9NRUNIQU5JU01TCQkoQ0tGX0FSUkFZX0FUVFJJQlVURSB8IDB4NjAwKQotI2RlZmluZSBDS0FfVkVORE9SX0RFRklORUQJCSgodW5zaWduZWQgbG9uZykgKDEgPDwgMzEpKQotCi0KLXN0cnVjdCBja19hdHRyaWJ1dGUKLXsKLSAgY2tfYXR0cmlidXRlX3R5cGVfdCB0eXBlOwotICB2b2lkICp2YWx1ZTsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZV9sZW47Ci19OwotCi0KLXN0cnVjdCBja19kYXRlCi17Ci0gIHVuc2lnbmVkIGNoYXIgeWVhcls0XTsKLSAgdW5zaWduZWQgY2hhciBtb250aFsyXTsKLSAgdW5zaWduZWQgY2hhciBkYXlbMl07Ci19OwotCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBja19tZWNoYW5pc21fdHlwZV90OwotCi0jZGVmaW5lIENLTV9SU0FfUEtDU19LRVlfUEFJUl9HRU4JKDApCi0jZGVmaW5lIENLTV9SU0FfUEtDUwkJCSgxKQotI2RlZmluZSBDS01fUlNBXzk3OTYJCQkoMikKLSNkZWZpbmUgQ0tNX1JTQV9YXzUwOQkJCSgzKQotI2RlZmluZSBDS01fTUQyX1JTQV9QS0NTCQkoNCkKLSNkZWZpbmUgQ0tNX01ENV9SU0FfUEtDUwkJKDUpCi0jZGVmaW5lIENLTV9TSEExX1JTQV9QS0NTCQkoNikKLSNkZWZpbmUgQ0tNX1JJUEVNRDEyOF9SU0FfUEtDUwkJKDcpCi0jZGVmaW5lIENLTV9SSVBFTUQxNjBfUlNBX1BLQ1MJCSg4KQotI2RlZmluZSBDS01fUlNBX1BLQ1NfT0FFUAkJKDkpCi0jZGVmaW5lIENLTV9SU0FfWDlfMzFfS0VZX1BBSVJfR0VOCSgweGEpCi0jZGVmaW5lIENLTV9SU0FfWDlfMzEJCQkoMHhiKQotI2RlZmluZSBDS01fU0hBMV9SU0FfWDlfMzEJCSgweGMpCi0jZGVmaW5lIENLTV9SU0FfUEtDU19QU1MJCSgweGQpCi0jZGVmaW5lIENLTV9TSEExX1JTQV9QS0NTX1BTUwkJKDB4ZSkKLSNkZWZpbmUgQ0tNX0RTQV9LRVlfUEFJUl9HRU4JCSgweDEwKQotI2RlZmluZQlDS01fRFNBCQkJCSgweDExKQotI2RlZmluZSBDS01fRFNBX1NIQTEJCQkoMHgxMikKLSNkZWZpbmUgQ0tNX0RIX1BLQ1NfS0VZX1BBSVJfR0VOCSgweDIwKQotI2RlZmluZSBDS01fREhfUEtDU19ERVJJVkUJCSgweDIxKQotI2RlZmluZQlDS01fWDlfNDJfREhfS0VZX1BBSVJfR0VOCSgweDMwKQotI2RlZmluZSBDS01fWDlfNDJfREhfREVSSVZFCQkoMHgzMSkKLSNkZWZpbmUgQ0tNX1g5XzQyX0RIX0hZQlJJRF9ERVJJVkUJKDB4MzIpCi0jZGVmaW5lIENLTV9YOV80Ml9NUVZfREVSSVZFCQkoMHgzMykKLSNkZWZpbmUgQ0tNX1NIQTI1Nl9SU0FfUEtDUwkJKDB4NDApCi0jZGVmaW5lIENLTV9TSEEzODRfUlNBX1BLQ1MJCSgweDQxKQotI2RlZmluZSBDS01fU0hBNTEyX1JTQV9QS0NTCQkoMHg0MikKLSNkZWZpbmUgQ0tNX1NIQTI1Nl9SU0FfUEtDU19QU1MJCSgweDQzKQotI2RlZmluZSBDS01fU0hBMzg0X1JTQV9QS0NTX1BTUwkJKDB4NDQpCi0jZGVmaW5lIENLTV9TSEE1MTJfUlNBX1BLQ1NfUFNTCQkoMHg0NSkKLSNkZWZpbmUgQ0tNX1JDMl9LRVlfR0VOCQkJKDB4MTAwKQotI2RlZmluZSBDS01fUkMyX0VDQgkJCSgweDEwMSkKLSNkZWZpbmUJQ0tNX1JDMl9DQkMJCQkoMHgxMDIpCi0jZGVmaW5lCUNLTV9SQzJfTUFDCQkJKDB4MTAzKQotI2RlZmluZSBDS01fUkMyX01BQ19HRU5FUkFMCQkoMHgxMDQpCi0jZGVmaW5lIENLTV9SQzJfQ0JDX1BBRAkJCSgweDEwNSkKLSNkZWZpbmUgQ0tNX1JDNF9LRVlfR0VOCQkJKDB4MTEwKQotI2RlZmluZSBDS01fUkM0CQkJCSgweDExMSkKLSNkZWZpbmUgQ0tNX0RFU19LRVlfR0VOCQkJKDB4MTIwKQotI2RlZmluZSBDS01fREVTX0VDQgkJCSgweDEyMSkKLSNkZWZpbmUgQ0tNX0RFU19DQkMJCQkoMHgxMjIpCi0jZGVmaW5lIENLTV9ERVNfTUFDCQkJKDB4MTIzKQotI2RlZmluZSBDS01fREVTX01BQ19HRU5FUkFMCQkoMHgxMjQpCi0jZGVmaW5lIENLTV9ERVNfQ0JDX1BBRAkJCSgweDEyNSkKLSNkZWZpbmUgQ0tNX0RFUzJfS0VZX0dFTgkJKDB4MTMwKQotI2RlZmluZSBDS01fREVTM19LRVlfR0VOCQkoMHgxMzEpCi0jZGVmaW5lIENLTV9ERVMzX0VDQgkJCSgweDEzMikKLSNkZWZpbmUgQ0tNX0RFUzNfQ0JDCQkJKDB4MTMzKQotI2RlZmluZSBDS01fREVTM19NQUMJCQkoMHgxMzQpCi0jZGVmaW5lIENLTV9ERVMzX01BQ19HRU5FUkFMCQkoMHgxMzUpCi0jZGVmaW5lIENLTV9ERVMzX0NCQ19QQUQJCSgweDEzNikKLSNkZWZpbmUgQ0tNX0NETUZfS0VZX0dFTgkJKDB4MTQwKQotI2RlZmluZSBDS01fQ0RNRl9FQ0IJCQkoMHgxNDEpCi0jZGVmaW5lIENLTV9DRE1GX0NCQwkJCSgweDE0MikKLSNkZWZpbmUgQ0tNX0NETUZfTUFDCQkJKDB4MTQzKQotI2RlZmluZSBDS01fQ0RNRl9NQUNfR0VORVJBTAkJKDB4MTQ0KQotI2RlZmluZSBDS01fQ0RNRl9DQkNfUEFECQkoMHgxNDUpCi0jZGVmaW5lIENLTV9NRDIJCQkJKDB4MjAwKQotI2RlZmluZSBDS01fTUQyX0hNQUMJCQkoMHgyMDEpCi0jZGVmaW5lIENLTV9NRDJfSE1BQ19HRU5FUkFMCQkoMHgyMDIpCi0jZGVmaW5lIENLTV9NRDUJCQkJKDB4MjEwKQotI2RlZmluZSBDS01fTUQ1X0hNQUMJCQkoMHgyMTEpCi0jZGVmaW5lIENLTV9NRDVfSE1BQ19HRU5FUkFMCQkoMHgyMTIpCi0jZGVmaW5lIENLTV9TSEFfMQkJCSgweDIyMCkKLSNkZWZpbmUgQ0tNX1NIQV8xX0hNQUMJCQkoMHgyMjEpCi0jZGVmaW5lIENLTV9TSEFfMV9ITUFDX0dFTkVSQUwJCSgweDIyMikKLSNkZWZpbmUgQ0tNX1JJUEVNRDEyOAkJCSgweDIzMCkKLSNkZWZpbmUgQ0tNX1JJUEVNRDEyOF9ITUFDCQkoMHgyMzEpCi0jZGVmaW5lIENLTV9SSVBFTUQxMjhfSE1BQ19HRU5FUkFMCSgweDIzMikKLSNkZWZpbmUgQ0tNX1JJUEVNRDE2MAkJCSgweDI0MCkKLSNkZWZpbmUgQ0tNX1JJUEVNRDE2MF9ITUFDCQkoMHgyNDEpCi0jZGVmaW5lIENLTV9SSVBFTUQxNjBfSE1BQ19HRU5FUkFMCSgweDI0MikKLSNkZWZpbmUgQ0tNX1NIQTI1NgkJCSgweDI1MCkKLSNkZWZpbmUgQ0tNX1NIQTI1Nl9ITUFDCQkJKDB4MjUxKQotI2RlZmluZSBDS01fU0hBMjU2X0hNQUNfR0VORVJBTAkJKDB4MjUyKQotI2RlZmluZSBDS01fU0hBMzg0CQkJKDB4MjYwKQotI2RlZmluZSBDS01fU0hBMzg0X0hNQUMJCQkoMHgyNjEpCi0jZGVmaW5lIENLTV9TSEEzODRfSE1BQ19HRU5FUkFMCQkoMHgyNjIpCi0jZGVmaW5lIENLTV9TSEE1MTIJCQkoMHgyNzApCi0jZGVmaW5lIENLTV9TSEE1MTJfSE1BQwkJCSgweDI3MSkKLSNkZWZpbmUgQ0tNX1NIQTUxMl9ITUFDX0dFTkVSQUwJCSgweDI3MikKLSNkZWZpbmUgQ0tNX0NBU1RfS0VZX0dFTgkJKDB4MzAwKQotI2RlZmluZSBDS01fQ0FTVF9FQ0IJCQkoMHgzMDEpCi0jZGVmaW5lIENLTV9DQVNUX0NCQwkJCSgweDMwMikKLSNkZWZpbmUgQ0tNX0NBU1RfTUFDCQkJKDB4MzAzKQotI2RlZmluZSBDS01fQ0FTVF9NQUNfR0VORVJBTAkJKDB4MzA0KQotI2RlZmluZSBDS01fQ0FTVF9DQkNfUEFECQkoMHgzMDUpCi0jZGVmaW5lIENLTV9DQVNUM19LRVlfR0VOCQkoMHgzMTApCi0jZGVmaW5lIENLTV9DQVNUM19FQ0IJCQkoMHgzMTEpCi0jZGVmaW5lIENLTV9DQVNUM19DQkMJCQkoMHgzMTIpCi0jZGVmaW5lIENLTV9DQVNUM19NQUMJCQkoMHgzMTMpCi0jZGVmaW5lIENLTV9DQVNUM19NQUNfR0VORVJBTAkJKDB4MzE0KQotI2RlZmluZSBDS01fQ0FTVDNfQ0JDX1BBRAkJKDB4MzE1KQotI2RlZmluZSBDS01fQ0FTVDVfS0VZX0dFTgkJKDB4MzIwKQotI2RlZmluZSBDS01fQ0FTVDEyOF9LRVlfR0VOCQkoMHgzMjApCi0jZGVmaW5lIENLTV9DQVNUNV9FQ0IJCQkoMHgzMjEpCi0jZGVmaW5lIENLTV9DQVNUMTI4X0VDQgkJCSgweDMyMSkKLSNkZWZpbmUgQ0tNX0NBU1Q1X0NCQwkJCSgweDMyMikKLSNkZWZpbmUgQ0tNX0NBU1QxMjhfQ0JDCQkJKDB4MzIyKQotI2RlZmluZSBDS01fQ0FTVDVfTUFDCQkJKDB4MzIzKQotI2RlZmluZQlDS01fQ0FTVDEyOF9NQUMJCQkoMHgzMjMpCi0jZGVmaW5lIENLTV9DQVNUNV9NQUNfR0VORVJBTAkJKDB4MzI0KQotI2RlZmluZSBDS01fQ0FTVDEyOF9NQUNfR0VORVJBTAkJKDB4MzI0KQotI2RlZmluZSBDS01fQ0FTVDVfQ0JDX1BBRAkJKDB4MzI1KQotI2RlZmluZSBDS01fQ0FTVDEyOF9DQkNfUEFECQkoMHgzMjUpCi0jZGVmaW5lIENLTV9SQzVfS0VZX0dFTgkJCSgweDMzMCkKLSNkZWZpbmUgQ0tNX1JDNV9FQ0IJCQkoMHgzMzEpCi0jZGVmaW5lIENLTV9SQzVfQ0JDCQkJKDB4MzMyKQotI2RlZmluZSBDS01fUkM1X01BQwkJCSgweDMzMykKLSNkZWZpbmUgQ0tNX1JDNV9NQUNfR0VORVJBTAkJKDB4MzM0KQotI2RlZmluZSBDS01fUkM1X0NCQ19QQUQJCQkoMHgzMzUpCi0jZGVmaW5lIENLTV9JREVBX0tFWV9HRU4JCSgweDM0MCkKLSNkZWZpbmUgQ0tNX0lERUFfRUNCCQkJKDB4MzQxKQotI2RlZmluZQlDS01fSURFQV9DQkMJCQkoMHgzNDIpCi0jZGVmaW5lIENLTV9JREVBX01BQwkJCSgweDM0MykKLSNkZWZpbmUgQ0tNX0lERUFfTUFDX0dFTkVSQUwJCSgweDM0NCkKLSNkZWZpbmUgQ0tNX0lERUFfQ0JDX1BBRAkJKDB4MzQ1KQotI2RlZmluZSBDS01fR0VORVJJQ19TRUNSRVRfS0VZX0dFTgkoMHgzNTApCi0jZGVmaW5lIENLTV9DT05DQVRFTkFURV9CQVNFX0FORF9LRVkJKDB4MzYwKQotI2RlZmluZSBDS01fQ09OQ0FURU5BVEVfQkFTRV9BTkRfREFUQQkoMHgzNjIpCi0jZGVmaW5lIENLTV9DT05DQVRFTkFURV9EQVRBX0FORF9CQVNFCSgweDM2MykKLSNkZWZpbmUgQ0tNX1hPUl9CQVNFX0FORF9EQVRBCQkoMHgzNjQpCi0jZGVmaW5lIENLTV9FWFRSQUNUX0tFWV9GUk9NX0tFWQkoMHgzNjUpCi0jZGVmaW5lIENLTV9TU0wzX1BSRV9NQVNURVJfS0VZX0dFTgkoMHgzNzApCi0jZGVmaW5lIENLTV9TU0wzX01BU1RFUl9LRVlfREVSSVZFCSgweDM3MSkKLSNkZWZpbmUgQ0tNX1NTTDNfS0VZX0FORF9NQUNfREVSSVZFCSgweDM3MikKLSNkZWZpbmUgQ0tNX1NTTDNfTUFTVEVSX0tFWV9ERVJJVkVfREgJKDB4MzczKQotI2RlZmluZSBDS01fVExTX1BSRV9NQVNURVJfS0VZX0dFTgkoMHgzNzQpCi0jZGVmaW5lIENLTV9UTFNfTUFTVEVSX0tFWV9ERVJJVkUJKDB4Mzc1KQotI2RlZmluZSBDS01fVExTX0tFWV9BTkRfTUFDX0RFUklWRQkoMHgzNzYpCi0jZGVmaW5lIENLTV9UTFNfTUFTVEVSX0tFWV9ERVJJVkVfREgJKDB4Mzc3KQotI2RlZmluZSBDS01fU1NMM19NRDVfTUFDCQkoMHgzODApCi0jZGVmaW5lIENLTV9TU0wzX1NIQTFfTUFDCQkoMHgzODEpCi0jZGVmaW5lIENLTV9NRDVfS0VZX0RFUklWQVRJT04JCSgweDM5MCkKLSNkZWZpbmUgQ0tNX01EMl9LRVlfREVSSVZBVElPTgkJKDB4MzkxKQotI2RlZmluZSBDS01fU0hBMV9LRVlfREVSSVZBVElPTgkJKDB4MzkyKQotI2RlZmluZSBDS01fUEJFX01EMl9ERVNfQ0JDCQkoMHgzYTApCi0jZGVmaW5lIENLTV9QQkVfTUQ1X0RFU19DQkMJCSgweDNhMSkKLSNkZWZpbmUgQ0tNX1BCRV9NRDVfQ0FTVF9DQkMJCSgweDNhMikKLSNkZWZpbmUgQ0tNX1BCRV9NRDVfQ0FTVDNfQ0JDCQkoMHgzYTMpCi0jZGVmaW5lIENLTV9QQkVfTUQ1X0NBU1Q1X0NCQwkJKDB4M2E0KQotI2RlZmluZSBDS01fUEJFX01ENV9DQVNUMTI4X0NCQwkJKDB4M2E0KQotI2RlZmluZSBDS01fUEJFX1NIQTFfQ0FTVDVfQ0JDCQkoMHgzYTUpCi0jZGVmaW5lIENLTV9QQkVfU0hBMV9DQVNUMTI4X0NCQwkoMHgzYTUpCi0jZGVmaW5lIENLTV9QQkVfU0hBMV9SQzRfMTI4CQkoMHgzYTYpCi0jZGVmaW5lIENLTV9QQkVfU0hBMV9SQzRfNDAJCSgweDNhNykKLSNkZWZpbmUgQ0tNX1BCRV9TSEExX0RFUzNfRURFX0NCQwkoMHgzYTgpCi0jZGVmaW5lIENLTV9QQkVfU0hBMV9ERVMyX0VERV9DQkMJKDB4M2E5KQotI2RlZmluZSBDS01fUEJFX1NIQTFfUkMyXzEyOF9DQkMJKDB4M2FhKQotI2RlZmluZSBDS01fUEJFX1NIQTFfUkMyXzQwX0NCQwkJKDB4M2FiKQotI2RlZmluZSBDS01fUEtDUzVfUEJLRDIJCQkoMHgzYjApCi0jZGVmaW5lIENLTV9QQkFfU0hBMV9XSVRIX1NIQTFfSE1BQwkoMHgzYzApCi0jZGVmaW5lIENLTV9LRVlfV1JBUF9MWU5LUwkJKDB4NDAwKQotI2RlZmluZSBDS01fS0VZX1dSQVBfU0VUX09BRVAJCSgweDQwMSkKLSNkZWZpbmUgQ0tNX1NLSVBKQUNLX0tFWV9HRU4JCSgweDEwMDApCi0jZGVmaW5lIENLTV9TS0lQSkFDS19FQ0I2NAkJKDB4MTAwMSkKLSNkZWZpbmUgQ0tNX1NLSVBKQUNLX0NCQzY0CQkoMHgxMDAyKQotI2RlZmluZSBDS01fU0tJUEpBQ0tfT0ZCNjQJCSgweDEwMDMpCi0jZGVmaW5lIENLTV9TS0lQSkFDS19DRkI2NAkJKDB4MTAwNCkKLSNkZWZpbmUgQ0tNX1NLSVBKQUNLX0NGQjMyCQkoMHgxMDA1KQotI2RlZmluZSBDS01fU0tJUEpBQ0tfQ0ZCMTYJCSgweDEwMDYpCi0jZGVmaW5lIENLTV9TS0lQSkFDS19DRkI4CQkoMHgxMDA3KQotI2RlZmluZSBDS01fU0tJUEpBQ0tfV1JBUAkJKDB4MTAwOCkKLSNkZWZpbmUgQ0tNX1NLSVBKQUNLX1BSSVZBVEVfV1JBUAkoMHgxMDA5KQotI2RlZmluZSBDS01fU0tJUEpBQ0tfUkVMQVlYCQkoMHgxMDBhKQotI2RlZmluZSBDS01fS0VBX0tFWV9QQUlSX0dFTgkJKDB4MTAxMCkKLSNkZWZpbmUgQ0tNX0tFQV9LRVlfREVSSVZFCQkoMHgxMDExKQotI2RlZmluZSBDS01fRk9SVEVaWkFfVElNRVNUQU1QCQkoMHgxMDIwKQotI2RlZmluZSBDS01fQkFUT05fS0VZX0dFTgkJKDB4MTAzMCkKLSNkZWZpbmUgQ0tNX0JBVE9OX0VDQjEyOAkJKDB4MTAzMSkKLSNkZWZpbmUgQ0tNX0JBVE9OX0VDQjk2CQkJKDB4MTAzMikKLSNkZWZpbmUgQ0tNX0JBVE9OX0NCQzEyOAkJKDB4MTAzMykKLSNkZWZpbmUgQ0tNX0JBVE9OX0NPVU5URVIJCSgweDEwMzQpCi0jZGVmaW5lIENLTV9CQVRPTl9TSFVGRkxFCQkoMHgxMDM1KQotI2RlZmluZSBDS01fQkFUT05fV1JBUAkJCSgweDEwMzYpCi0jZGVmaW5lIENLTV9FQ0RTQV9LRVlfUEFJUl9HRU4JCSgweDEwNDApCi0jZGVmaW5lIENLTV9FQ19LRVlfUEFJUl9HRU4JCSgweDEwNDApCi0jZGVmaW5lIENLTV9FQ0RTQQkJCSgweDEwNDEpCi0jZGVmaW5lIENLTV9FQ0RTQV9TSEExCQkJKDB4MTA0MikKLSNkZWZpbmUgQ0tNX0VDREgxX0RFUklWRQkJKDB4MTA1MCkKLSNkZWZpbmUgQ0tNX0VDREgxX0NPRkFDVE9SX0RFUklWRQkoMHgxMDUxKQotI2RlZmluZSBDS01fRUNNUVZfREVSSVZFCQkoMHgxMDUyKQotI2RlZmluZSBDS01fSlVOSVBFUl9LRVlfR0VOCQkoMHgxMDYwKQotI2RlZmluZSBDS01fSlVOSVBFUl9FQ0IxMjgJCSgweDEwNjEpCi0jZGVmaW5lIENLTV9KVU5JUEVSX0NCQzEyOAkJKDB4MTA2MikKLSNkZWZpbmUgQ0tNX0pVTklQRVJfQ09VTlRFUgkJKDB4MTA2MykKLSNkZWZpbmUgQ0tNX0pVTklQRVJfU0hVRkZMRQkJKDB4MTA2NCkKLSNkZWZpbmUgQ0tNX0pVTklQRVJfV1JBUAkJKDB4MTA2NSkKLSNkZWZpbmUgQ0tNX0ZBU1RIQVNICQkJKDB4MTA3MCkKLSNkZWZpbmUgQ0tNX0FFU19LRVlfR0VOCQkJKDB4MTA4MCkKLSNkZWZpbmUgQ0tNX0FFU19FQ0IJCQkoMHgxMDgxKQotI2RlZmluZSBDS01fQUVTX0NCQwkJCSgweDEwODIpCi0jZGVmaW5lIENLTV9BRVNfTUFDCQkJKDB4MTA4MykKLSNkZWZpbmUgQ0tNX0FFU19NQUNfR0VORVJBTAkJKDB4MTA4NCkKLSNkZWZpbmUgQ0tNX0FFU19DQkNfUEFECQkJKDB4MTA4NSkKLSNkZWZpbmUgQ0tNX0RTQV9QQVJBTUVURVJfR0VOCQkoMHgyMDAwKQotI2RlZmluZSBDS01fREhfUEtDU19QQVJBTUVURVJfR0VOCSgweDIwMDEpCi0jZGVmaW5lIENLTV9YOV80Ml9ESF9QQVJBTUVURVJfR0VOCSgweDIwMDIpCi0jZGVmaW5lIENLTV9WRU5ET1JfREVGSU5FRAkJKCh1bnNpZ25lZCBsb25nKSAoMSA8PCAzMSkpCi0KLQotc3RydWN0IGNrX21lY2hhbmlzbQotewotICBja19tZWNoYW5pc21fdHlwZV90IG1lY2hhbmlzbTsKLSAgdm9pZCAqcGFyYW1ldGVyOwotICB1bnNpZ25lZCBsb25nIHBhcmFtZXRlcl9sZW47Ci19OwotCi0KLXN0cnVjdCBja19tZWNoYW5pc21faW5mbwotewotICB1bnNpZ25lZCBsb25nIG1pbl9rZXlfc2l6ZTsKLSAgdW5zaWduZWQgbG9uZyBtYXhfa2V5X3NpemU7Ci0gIGNrX2ZsYWdzX3QgZmxhZ3M7Ci19OwotCi0jZGVmaW5lIENLRl9IVwkJCSgxIDw8IDApCi0jZGVmaW5lIENLRl9FTkNSWVBUCQkoMSA8PCA4KQotI2RlZmluZSBDS0ZfREVDUllQVAkJKDEgPDwgOSkKLSNkZWZpbmUgQ0tGX0RJR0VTVAkJKDEgPDwgMTApCi0jZGVmaW5lIENLRl9TSUdOCQkoMSA8PCAxMSkKLSNkZWZpbmUgQ0tGX1NJR05fUkVDT1ZFUgkoMSA8PCAxMikKLSNkZWZpbmUgQ0tGX1ZFUklGWQkJKDEgPDwgMTMpCi0jZGVmaW5lIENLRl9WRVJJRllfUkVDT1ZFUgkoMSA8PCAxNCkKLSNkZWZpbmUgQ0tGX0dFTkVSQVRFCQkoMSA8PCAxNSkKLSNkZWZpbmUgQ0tGX0dFTkVSQVRFX0tFWV9QQUlSCSgxIDw8IDE2KQotI2RlZmluZSBDS0ZfV1JBUAkJKDEgPDwgMTcpCi0jZGVmaW5lIENLRl9VTldSQVAJCSgxIDw8IDE4KQotI2RlZmluZSBDS0ZfREVSSVZFCQkoMSA8PCAxOSkKLSNkZWZpbmUgQ0tGX0VYVEVOU0lPTgkJKCh1bnNpZ25lZCBsb25nKSAoMSA8PCAzMSkpCi0KLQotLyogRmxhZ3MgZm9yIENfV2FpdEZvclNsb3RFdmVudC4gICovCi0jZGVmaW5lIENLRl9ET05UX0JMT0NLCQkJCSgxKQotCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBja19ydl90OwotCi0KLXR5cGVkZWYgY2tfcnZfdCAoKmNrX25vdGlmeV90KSAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkJCWNrX25vdGlmaWNhdGlvbl90IGV2ZW50LCB2b2lkICphcHBsaWNhdGlvbik7Ci0KLS8qIEZvcndhcmQgcmVmZXJlbmNlLiAgKi8KLXN0cnVjdCBja19mdW5jdGlvbl9saXN0OwotCi0jZGVmaW5lIF9DS19ERUNMQVJFX0ZVTkNUSU9OKG5hbWUsIGFyZ3MpCVwKLXR5cGVkZWYgY2tfcnZfdCAoKkNLXyAjIyBuYW1lKSBhcmdzOwkJXAotY2tfcnZfdCBDS19TUEVDIG5hbWUgYXJncwotCi1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19Jbml0aWFsaXplLCAodm9pZCAqaW5pdF9hcmdzKSk7Ci1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19GaW5hbGl6ZSwgKHZvaWQgKnJlc2VydmVkKSk7Ci1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19HZXRJbmZvLCAoc3RydWN0IGNrX2luZm8gKmluZm8pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dldEZ1bmN0aW9uTGlzdCwKLQkJICAgICAgKHN0cnVjdCBja19mdW5jdGlvbl9saXN0ICoqZnVuY3Rpb25fbGlzdCkpOwotCi1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19HZXRTbG90TGlzdCwKLQkJICAgICAgKHVuc2lnbmVkIGNoYXIgdG9rZW5fcHJlc2VudCwgY2tfc2xvdF9pZF90ICpzbG90X2xpc3QsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICpjb3VudCkpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0U2xvdEluZm8sCi0JCSAgICAgIChja19zbG90X2lkX3Qgc2xvdF9pZCwgc3RydWN0IGNrX3Nsb3RfaW5mbyAqaW5mbykpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0VG9rZW5JbmZvLAotCQkgICAgICAoY2tfc2xvdF9pZF90IHNsb3RfaWQsIHN0cnVjdCBja190b2tlbl9pbmZvICppbmZvKSk7Ci1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19XYWl0Rm9yU2xvdEV2ZW50LAotCQkgICAgICAoY2tfZmxhZ3NfdCBmbGFncywgY2tfc2xvdF9pZF90ICpzbG90LCB2b2lkICpyZXNlcnZlZCkpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0TWVjaGFuaXNtTGlzdCwKLQkJICAgICAgKGNrX3Nsb3RfaWRfdCBzbG90X2lkLAotCQkgICAgICAgY2tfbWVjaGFuaXNtX3R5cGVfdCAqbWVjaGFuaXNtX2xpc3QsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICpjb3VudCkpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0TWVjaGFuaXNtSW5mbywKLQkJICAgICAgKGNrX3Nsb3RfaWRfdCBzbG90X2lkLCBja19tZWNoYW5pc21fdHlwZV90IHR5cGUsCi0JCSAgICAgICBzdHJ1Y3QgY2tfbWVjaGFuaXNtX2luZm8gKmluZm8pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0luaXRUb2tlbiwKLQkJICAgICAgKGNrX3Nsb3RfaWRfdCBzbG90X2lkLCB1bnNpZ25lZCBjaGFyICpwaW4sCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIHBpbl9sZW4sIHVuc2lnbmVkIGNoYXIgKmxhYmVsKSk7Ci1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19Jbml0UElOLAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLCB1bnNpZ25lZCBjaGFyICpwaW4sCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIHBpbl9sZW4pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX1NldFBJTiwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwgdW5zaWduZWQgY2hhciAqb2xkX3BpbiwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgb2xkX2xlbiwgdW5zaWduZWQgY2hhciAqbmV3X3BpbiwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3X2xlbikpOwotCi1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19PcGVuU2Vzc2lvbiwKLQkJICAgICAgKGNrX3Nsb3RfaWRfdCBzbG90X2lkLCBja19mbGFnc190IGZsYWdzLAotCQkgICAgICAgdm9pZCAqYXBwbGljYXRpb24sIGNrX25vdGlmeV90IG5vdGlmeSwKLQkJICAgICAgIGNrX3Nlc3Npb25faGFuZGxlX3QgKnNlc3Npb24pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0Nsb3NlU2Vzc2lvbiwgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbikpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfQ2xvc2VBbGxTZXNzaW9ucywgKGNrX3Nsb3RfaWRfdCBzbG90X2lkKSk7Ci1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19HZXRTZXNzaW9uSW5mbywKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIHN0cnVjdCBja19zZXNzaW9uX2luZm8gKmluZm8pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dldE9wZXJhdGlvblN0YXRlLAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqb3BlcmF0aW9uX3N0YXRlLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb3BlcmF0aW9uX3N0YXRlX2xlbikpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2V0T3BlcmF0aW9uU3RhdGUsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICpvcGVyYXRpb25fc3RhdGUsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIG9wZXJhdGlvbl9zdGF0ZV9sZW4sCi0JCSAgICAgICBja19vYmplY3RfaGFuZGxlX3QgZW5jcnlwdGlvbl9rZXksCi0JCSAgICAgICBja19vYmplY3RfaGFuZGxlX3QgYXV0aGVudGlhdGlvbl9rZXkpKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0xvZ2luLAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLCBja191c2VyX3R5cGVfdCB1c2VyX3R5cGUsCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICpwaW4sIHVuc2lnbmVkIGxvbmcgcGluX2xlbikpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfTG9nb3V0LCAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uKSk7Ci0KLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0NyZWF0ZU9iamVjdCwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIHN0cnVjdCBja19hdHRyaWJ1dGUgKnRlbXBsLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgY2tfb2JqZWN0X2hhbmRsZV90ICpvYmplY3QpKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0NvcHlPYmplY3QsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sIGNrX29iamVjdF9oYW5kbGVfdCBvYmplY3QsCi0JCSAgICAgICBzdHJ1Y3QgY2tfYXR0cmlidXRlICp0ZW1wbCwgdW5zaWduZWQgbG9uZyBjb3VudCwKLQkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCAqbmV3X29iamVjdCkpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGVzdHJveU9iamVjdCwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCBvYmplY3QpKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dldE9iamVjdFNpemUsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICBja19vYmplY3RfaGFuZGxlX3Qgb2JqZWN0LAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc2l6ZSkpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0QXR0cmlidXRlVmFsdWUsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICBja19vYmplY3RfaGFuZGxlX3Qgb2JqZWN0LAotCQkgICAgICAgc3RydWN0IGNrX2F0dHJpYnV0ZSAqdGVtcGwsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50KSk7Ci1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19TZXRBdHRyaWJ1dGVWYWx1ZSwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCBvYmplY3QsCi0JCSAgICAgICBzdHJ1Y3QgY2tfYXR0cmlidXRlICp0ZW1wbCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0ZpbmRPYmplY3RzSW5pdCwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIHN0cnVjdCBja19hdHRyaWJ1dGUgKnRlbXBsLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCkpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRmluZE9iamVjdHMsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICBja19vYmplY3RfaGFuZGxlX3QgKm9iamVjdCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbWF4X29iamVjdF9jb3VudCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm9iamVjdF9jb3VudCkpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRmluZE9iamVjdHNGaW5hbCwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbikpOwotCi1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19FbmNyeXB0SW5pdCwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIHN0cnVjdCBja19tZWNoYW5pc20gKm1lY2hhbmlzbSwKLQkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCBrZXkpKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0VuY3J5cHQsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGRhdGFfbGVuLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqZW5jcnlwdGVkX2RhdGEsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICplbmNyeXB0ZWRfZGF0YV9sZW4pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0VuY3J5cHRVcGRhdGUsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICpwYXJ0LCB1bnNpZ25lZCBsb25nIHBhcnRfbGVuLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqZW5jcnlwdGVkX3BhcnQsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICplbmNyeXB0ZWRfcGFydF9sZW4pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0VuY3J5cHRGaW5hbCwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmxhc3RfZW5jcnlwdGVkX3BhcnQsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICpsYXN0X2VuY3J5cHRlZF9wYXJ0X2xlbikpOwotCi1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19EZWNyeXB0SW5pdCwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIHN0cnVjdCBja19tZWNoYW5pc20gKm1lY2hhbmlzbSwKLQkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCBrZXkpKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RlY3J5cHQsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICplbmNyeXB0ZWRfZGF0YSwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5jcnlwdGVkX2RhdGFfbGVuLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgbG9uZyAqZGF0YV9sZW4pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RlY3J5cHRVcGRhdGUsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICplbmNyeXB0ZWRfcGFydCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5jcnlwdGVkX3BhcnRfbGVuLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqcGFydCwgdW5zaWduZWQgbG9uZyAqcGFydF9sZW4pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RlY3J5cHRGaW5hbCwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmxhc3RfcGFydCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmxhc3RfcGFydF9sZW4pKTsKLQotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGlnZXN0SW5pdCwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIHN0cnVjdCBja19tZWNoYW5pc20gKm1lY2hhbmlzbSkpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGlnZXN0LAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgbG9uZyBkYXRhX2xlbiwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmRpZ2VzdF9sZW4pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RpZ2VzdFVwZGF0ZSwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnBhcnQsIHVuc2lnbmVkIGxvbmcgcGFydF9sZW4pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RpZ2VzdEtleSwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwgY2tfb2JqZWN0X2hhbmRsZV90IGtleSkpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGlnZXN0RmluYWwsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICpkaWdlc3QsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICpkaWdlc3RfbGVuKSk7Ci0KLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX1NpZ25Jbml0LAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtLAotCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IGtleSkpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2lnbiwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGxvbmcgZGF0YV9sZW4sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICpzaWduYXR1cmVfbGVuKSk7Ci1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19TaWduVXBkYXRlLAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqcGFydCwgdW5zaWduZWQgbG9uZyBwYXJ0X2xlbikpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2lnbkZpbmFsLAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc2lnbmF0dXJlX2xlbikpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2lnblJlY292ZXJJbml0LAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtLAotCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IGtleSkpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2lnblJlY292ZXIsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGRhdGFfbGVuLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc2lnbmF0dXJlX2xlbikpOwotCi1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19WZXJpZnlJbml0LAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtLAotCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IGtleSkpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfVmVyaWZ5LAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgbG9uZyBkYXRhX2xlbiwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlX2xlbikpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfVmVyaWZ5VXBkYXRlLAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqcGFydCwgdW5zaWduZWQgbG9uZyBwYXJ0X2xlbikpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfVmVyaWZ5RmluYWwsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIHNpZ25hdHVyZV9sZW4pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX1ZlcmlmeVJlY292ZXJJbml0LAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtLAotCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IGtleSkpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfVmVyaWZ5UmVjb3ZlciwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlX2xlbiwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICpkYXRhX2xlbikpOwotCi1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19EaWdlc3RFbmNyeXB0VXBkYXRlLAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqcGFydCwgdW5zaWduZWQgbG9uZyBwYXJ0X2xlbiwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmVuY3J5cHRlZF9wYXJ0LAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqZW5jcnlwdGVkX3BhcnRfbGVuKSk7Ci1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19EZWNyeXB0RGlnZXN0VXBkYXRlLAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqZW5jcnlwdGVkX3BhcnQsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIGVuY3J5cHRlZF9wYXJ0X2xlbiwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnBhcnQsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICpwYXJ0X2xlbikpOwotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2lnbkVuY3J5cHRVcGRhdGUsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICpwYXJ0LCB1bnNpZ25lZCBsb25nIHBhcnRfbGVuLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqZW5jcnlwdGVkX3BhcnQsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICplbmNyeXB0ZWRfcGFydF9sZW4pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RlY3J5cHRWZXJpZnlVcGRhdGUsCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICplbmNyeXB0ZWRfcGFydCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5jcnlwdGVkX3BhcnRfbGVuLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqcGFydCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnBhcnRfbGVuKSk7Ci0KLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dlbmVyYXRlS2V5LAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtLAotCQkgICAgICAgc3RydWN0IGNrX2F0dHJpYnV0ZSAqdGVtcGwsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LAotCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90ICprZXkpKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dlbmVyYXRlS2V5UGFpciwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKLQkJICAgICAgIHN0cnVjdCBja19tZWNoYW5pc20gKm1lY2hhbmlzbSwKLQkJICAgICAgIHN0cnVjdCBja19hdHRyaWJ1dGUgKnB1YmxpY19rZXlfdGVtcGxhdGUsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIHB1YmxpY19rZXlfYXR0cmlidXRlX2NvdW50LAotCQkgICAgICAgc3RydWN0IGNrX2F0dHJpYnV0ZSAqcHJpdmF0ZV9rZXlfdGVtcGxhdGUsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIHByaXZhdGVfa2V5X2F0dHJpYnV0ZV9jb3VudCwKLQkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCAqcHVibGljX2tleSwKLQkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCAqcHJpdmF0ZV9rZXkpKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX1dyYXBLZXksCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICBzdHJ1Y3QgY2tfbWVjaGFuaXNtICptZWNoYW5pc20sCi0JCSAgICAgICBja19vYmplY3RfaGFuZGxlX3Qgd3JhcHBpbmdfa2V5LAotCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IGtleSwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKndyYXBwZWRfa2V5LAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqd3JhcHBlZF9rZXlfbGVuKSk7Ci1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19VbndyYXBLZXksCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICBzdHJ1Y3QgY2tfbWVjaGFuaXNtICptZWNoYW5pc20sCi0JCSAgICAgICBja19vYmplY3RfaGFuZGxlX3QgdW53cmFwcGluZ19rZXksCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICp3cmFwcGVkX2tleSwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgd3JhcHBlZF9rZXlfbGVuLAotCQkgICAgICAgc3RydWN0IGNrX2F0dHJpYnV0ZSAqdGVtcGwsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIGF0dHJpYnV0ZV9jb3VudCwKLQkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCAqa2V5KSk7Ci1fQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19EZXJpdmVLZXksCi0JCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCi0JCSAgICAgICBzdHJ1Y3QgY2tfbWVjaGFuaXNtICptZWNoYW5pc20sCi0JCSAgICAgICBja19vYmplY3RfaGFuZGxlX3QgYmFzZV9rZXksCi0JCSAgICAgICBzdHJ1Y3QgY2tfYXR0cmlidXRlICp0ZW1wbCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXR0cmlidXRlX2NvdW50LAotCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90ICprZXkpKTsKLQotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2VlZFJhbmRvbSwKLQkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwgdW5zaWduZWQgY2hhciAqc2VlZCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2VlZF9sZW4pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dlbmVyYXRlUmFuZG9tLAotCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqcmFuZG9tX2RhdGEsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIHJhbmRvbV9sZW4pKTsKLQotX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0RnVuY3Rpb25TdGF0dXMsIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24pKTsKLV9DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0NhbmNlbEZ1bmN0aW9uLCAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uKSk7Ci0KLQotc3RydWN0IGNrX2Z1bmN0aW9uX2xpc3QKLXsKLSAgc3RydWN0IGNrX3ZlcnNpb24gdmVyc2lvbjsKLSAgQ0tfQ19Jbml0aWFsaXplIENfSW5pdGlhbGl6ZTsKLSAgQ0tfQ19GaW5hbGl6ZSBDX0ZpbmFsaXplOwotICBDS19DX0dldEluZm8gQ19HZXRJbmZvOwotICBDS19DX0dldEZ1bmN0aW9uTGlzdCBDX0dldEZ1bmN0aW9uTGlzdDsKLSAgQ0tfQ19HZXRTbG90TGlzdCBDX0dldFNsb3RMaXN0OwotICBDS19DX0dldFNsb3RJbmZvIENfR2V0U2xvdEluZm87Ci0gIENLX0NfR2V0VG9rZW5JbmZvIENfR2V0VG9rZW5JbmZvOwotICBDS19DX0dldE1lY2hhbmlzbUxpc3QgQ19HZXRNZWNoYW5pc21MaXN0OwotICBDS19DX0dldE1lY2hhbmlzbUluZm8gQ19HZXRNZWNoYW5pc21JbmZvOwotICBDS19DX0luaXRUb2tlbiBDX0luaXRUb2tlbjsKLSAgQ0tfQ19Jbml0UElOIENfSW5pdFBJTjsKLSAgQ0tfQ19TZXRQSU4gQ19TZXRQSU47Ci0gIENLX0NfT3BlblNlc3Npb24gQ19PcGVuU2Vzc2lvbjsKLSAgQ0tfQ19DbG9zZVNlc3Npb24gQ19DbG9zZVNlc3Npb247Ci0gIENLX0NfQ2xvc2VBbGxTZXNzaW9ucyBDX0Nsb3NlQWxsU2Vzc2lvbnM7Ci0gIENLX0NfR2V0U2Vzc2lvbkluZm8gQ19HZXRTZXNzaW9uSW5mbzsKLSAgQ0tfQ19HZXRPcGVyYXRpb25TdGF0ZSBDX0dldE9wZXJhdGlvblN0YXRlOwotICBDS19DX1NldE9wZXJhdGlvblN0YXRlIENfU2V0T3BlcmF0aW9uU3RhdGU7Ci0gIENLX0NfTG9naW4gQ19Mb2dpbjsKLSAgQ0tfQ19Mb2dvdXQgQ19Mb2dvdXQ7Ci0gIENLX0NfQ3JlYXRlT2JqZWN0IENfQ3JlYXRlT2JqZWN0OwotICBDS19DX0NvcHlPYmplY3QgQ19Db3B5T2JqZWN0OwotICBDS19DX0Rlc3Ryb3lPYmplY3QgQ19EZXN0cm95T2JqZWN0OwotICBDS19DX0dldE9iamVjdFNpemUgQ19HZXRPYmplY3RTaXplOwotICBDS19DX0dldEF0dHJpYnV0ZVZhbHVlIENfR2V0QXR0cmlidXRlVmFsdWU7Ci0gIENLX0NfU2V0QXR0cmlidXRlVmFsdWUgQ19TZXRBdHRyaWJ1dGVWYWx1ZTsKLSAgQ0tfQ19GaW5kT2JqZWN0c0luaXQgQ19GaW5kT2JqZWN0c0luaXQ7Ci0gIENLX0NfRmluZE9iamVjdHMgQ19GaW5kT2JqZWN0czsKLSAgQ0tfQ19GaW5kT2JqZWN0c0ZpbmFsIENfRmluZE9iamVjdHNGaW5hbDsKLSAgQ0tfQ19FbmNyeXB0SW5pdCBDX0VuY3J5cHRJbml0OwotICBDS19DX0VuY3J5cHQgQ19FbmNyeXB0OwotICBDS19DX0VuY3J5cHRVcGRhdGUgQ19FbmNyeXB0VXBkYXRlOwotICBDS19DX0VuY3J5cHRGaW5hbCBDX0VuY3J5cHRGaW5hbDsKLSAgQ0tfQ19EZWNyeXB0SW5pdCBDX0RlY3J5cHRJbml0OwotICBDS19DX0RlY3J5cHQgQ19EZWNyeXB0OwotICBDS19DX0RlY3J5cHRVcGRhdGUgQ19EZWNyeXB0VXBkYXRlOwotICBDS19DX0RlY3J5cHRGaW5hbCBDX0RlY3J5cHRGaW5hbDsKLSAgQ0tfQ19EaWdlc3RJbml0IENfRGlnZXN0SW5pdDsKLSAgQ0tfQ19EaWdlc3QgQ19EaWdlc3Q7Ci0gIENLX0NfRGlnZXN0VXBkYXRlIENfRGlnZXN0VXBkYXRlOwotICBDS19DX0RpZ2VzdEtleSBDX0RpZ2VzdEtleTsKLSAgQ0tfQ19EaWdlc3RGaW5hbCBDX0RpZ2VzdEZpbmFsOwotICBDS19DX1NpZ25Jbml0IENfU2lnbkluaXQ7Ci0gIENLX0NfU2lnbiBDX1NpZ247Ci0gIENLX0NfU2lnblVwZGF0ZSBDX1NpZ25VcGRhdGU7Ci0gIENLX0NfU2lnbkZpbmFsIENfU2lnbkZpbmFsOwotICBDS19DX1NpZ25SZWNvdmVySW5pdCBDX1NpZ25SZWNvdmVySW5pdDsKLSAgQ0tfQ19TaWduUmVjb3ZlciBDX1NpZ25SZWNvdmVyOwotICBDS19DX1ZlcmlmeUluaXQgQ19WZXJpZnlJbml0OwotICBDS19DX1ZlcmlmeSBDX1ZlcmlmeTsKLSAgQ0tfQ19WZXJpZnlVcGRhdGUgQ19WZXJpZnlVcGRhdGU7Ci0gIENLX0NfVmVyaWZ5RmluYWwgQ19WZXJpZnlGaW5hbDsKLSAgQ0tfQ19WZXJpZnlSZWNvdmVySW5pdCBDX1ZlcmlmeVJlY292ZXJJbml0OwotICBDS19DX1ZlcmlmeVJlY292ZXIgQ19WZXJpZnlSZWNvdmVyOwotICBDS19DX0RpZ2VzdEVuY3J5cHRVcGRhdGUgQ19EaWdlc3RFbmNyeXB0VXBkYXRlOwotICBDS19DX0RlY3J5cHREaWdlc3RVcGRhdGUgQ19EZWNyeXB0RGlnZXN0VXBkYXRlOwotICBDS19DX1NpZ25FbmNyeXB0VXBkYXRlIENfU2lnbkVuY3J5cHRVcGRhdGU7Ci0gIENLX0NfRGVjcnlwdFZlcmlmeVVwZGF0ZSBDX0RlY3J5cHRWZXJpZnlVcGRhdGU7Ci0gIENLX0NfR2VuZXJhdGVLZXkgQ19HZW5lcmF0ZUtleTsKLSAgQ0tfQ19HZW5lcmF0ZUtleVBhaXIgQ19HZW5lcmF0ZUtleVBhaXI7Ci0gIENLX0NfV3JhcEtleSBDX1dyYXBLZXk7Ci0gIENLX0NfVW53cmFwS2V5IENfVW53cmFwS2V5OwotICBDS19DX0Rlcml2ZUtleSBDX0Rlcml2ZUtleTsKLSAgQ0tfQ19TZWVkUmFuZG9tIENfU2VlZFJhbmRvbTsKLSAgQ0tfQ19HZW5lcmF0ZVJhbmRvbSBDX0dlbmVyYXRlUmFuZG9tOwotICBDS19DX0dldEZ1bmN0aW9uU3RhdHVzIENfR2V0RnVuY3Rpb25TdGF0dXM7Ci0gIENLX0NfQ2FuY2VsRnVuY3Rpb24gQ19DYW5jZWxGdW5jdGlvbjsKLSAgQ0tfQ19XYWl0Rm9yU2xvdEV2ZW50IENfV2FpdEZvclNsb3RFdmVudDsKLX07Ci0KLQotdHlwZWRlZiBja19ydl90ICgqY2tfY3JlYXRlbXV0ZXhfdCkgKHZvaWQgKiptdXRleCk7Ci10eXBlZGVmIGNrX3J2X3QgKCpja19kZXN0cm95bXV0ZXhfdCkgKHZvaWQgKm11dGV4KTsKLXR5cGVkZWYgY2tfcnZfdCAoKmNrX2xvY2ttdXRleF90KSAodm9pZCAqbXV0ZXgpOwotdHlwZWRlZiBja19ydl90ICgqY2tfdW5sb2NrbXV0ZXhfdCkgKHZvaWQgKm11dGV4KTsKLQotCi1zdHJ1Y3QgY2tfY19pbml0aWFsaXplX2FyZ3MKLXsKLSAgY2tfY3JlYXRlbXV0ZXhfdCBjcmVhdGVfbXV0ZXg7Ci0gIGNrX2Rlc3Ryb3ltdXRleF90IGRlc3Ryb3lfbXV0ZXg7Ci0gIGNrX2xvY2ttdXRleF90IGxvY2tfbXV0ZXg7Ci0gIGNrX3VubG9ja211dGV4X3QgdW5sb2NrX211dGV4OwotICBja19mbGFnc190IGZsYWdzOwotICB2b2lkICpyZXNlcnZlZDsKLX07Ci0KLQotI2RlZmluZSBDS0ZfTElCUkFSWV9DQU5UX0NSRUFURV9PU19USFJFQURTCSgxIDw8IDApCi0jZGVmaW5lIENLRl9PU19MT0NLSU5HX09LCQkJKDEgPDwgMSkKLQotI2RlZmluZSBDS1JfT0sJCQkJCSgwKQotI2RlZmluZSBDS1JfQ0FOQ0VMCQkJCSgxKQotI2RlZmluZSBDS1JfSE9TVF9NRU1PUlkJCQkJKDIpCi0jZGVmaW5lIENLUl9TTE9UX0lEX0lOVkFMSUQJCQkoMykKLSNkZWZpbmUgQ0tSX0dFTkVSQUxfRVJST1IJCQkoNSkKLSNkZWZpbmUgQ0tSX0ZVTkNUSU9OX0ZBSUxFRAkJCSg2KQotI2RlZmluZSBDS1JfQVJHVU1FTlRTX0JBRAkJCSg3KQotI2RlZmluZSBDS1JfTk9fRVZFTlQJCQkJKDgpCi0jZGVmaW5lIENLUl9ORUVEX1RPX0NSRUFURV9USFJFQURTCQkoOSkKLSNkZWZpbmUgQ0tSX0NBTlRfTE9DSwkJCQkoMHhhKQotI2RlZmluZSBDS1JfQVRUUklCVVRFX1JFQURfT05MWQkJCSgweDEwKQotI2RlZmluZSBDS1JfQVRUUklCVVRFX1NFTlNJVElWRQkJCSgweDExKQotI2RlZmluZSBDS1JfQVRUUklCVVRFX1RZUEVfSU5WQUxJRAkJKDB4MTIpCi0jZGVmaW5lIENLUl9BVFRSSUJVVEVfVkFMVUVfSU5WQUxJRAkJKDB4MTMpCi0jZGVmaW5lIENLUl9EQVRBX0lOVkFMSUQJCQkoMHgyMCkKLSNkZWZpbmUgQ0tSX0RBVEFfTEVOX1JBTkdFCQkJKDB4MjEpCi0jZGVmaW5lIENLUl9ERVZJQ0VfRVJST1IJCQkoMHgzMCkKLSNkZWZpbmUgQ0tSX0RFVklDRV9NRU1PUlkJCQkoMHgzMSkKLSNkZWZpbmUgQ0tSX0RFVklDRV9SRU1PVkVECQkJKDB4MzIpCi0jZGVmaW5lIENLUl9FTkNSWVBURURfREFUQV9JTlZBTElECQkoMHg0MCkKLSNkZWZpbmUgQ0tSX0VOQ1JZUFRFRF9EQVRBX0xFTl9SQU5HRQkJKDB4NDEpCi0jZGVmaW5lIENLUl9GVU5DVElPTl9DQU5DRUxFRAkJCSgweDUwKQotI2RlZmluZSBDS1JfRlVOQ1RJT05fTk9UX1BBUkFMTEVMCQkoMHg1MSkKLSNkZWZpbmUgQ0tSX0ZVTkNUSU9OX05PVF9TVVBQT1JURUQJCSgweDU0KQotI2RlZmluZSBDS1JfS0VZX0hBTkRMRV9JTlZBTElECQkJKDB4NjApCi0jZGVmaW5lIENLUl9LRVlfU0laRV9SQU5HRQkJCSgweDYyKQotI2RlZmluZSBDS1JfS0VZX1RZUEVfSU5DT05TSVNURU5UCQkoMHg2MykKLSNkZWZpbmUgQ0tSX0tFWV9OT1RfTkVFREVECQkJKDB4NjQpCi0jZGVmaW5lIENLUl9LRVlfQ0hBTkdFRAkJCQkoMHg2NSkKLSNkZWZpbmUgQ0tSX0tFWV9ORUVERUQJCQkJKDB4NjYpCi0jZGVmaW5lIENLUl9LRVlfSU5ESUdFU1RJQkxFCQkJKDB4NjcpCi0jZGVmaW5lIENLUl9LRVlfRlVOQ1RJT05fTk9UX1BFUk1JVFRFRAkJKDB4NjgpCi0jZGVmaW5lIENLUl9LRVlfTk9UX1dSQVBQQUJMRQkJCSgweDY5KQotI2RlZmluZSBDS1JfS0VZX1VORVhUUkFDVEFCTEUJCQkoMHg2YSkKLSNkZWZpbmUgQ0tSX01FQ0hBTklTTV9JTlZBTElECQkJKDB4NzApCi0jZGVmaW5lIENLUl9NRUNIQU5JU01fUEFSQU1fSU5WQUxJRAkJKDB4NzEpCi0jZGVmaW5lIENLUl9PQkpFQ1RfSEFORExFX0lOVkFMSUQJCSgweDgyKQotI2RlZmluZSBDS1JfT1BFUkFUSU9OX0FDVElWRQkJCSgweDkwKQotI2RlZmluZSBDS1JfT1BFUkFUSU9OX05PVF9JTklUSUFMSVpFRAkJKDB4OTEpCi0jZGVmaW5lIENLUl9QSU5fSU5DT1JSRUNUCQkJKDB4YTApCi0jZGVmaW5lIENLUl9QSU5fSU5WQUxJRAkJCQkoMHhhMSkKLSNkZWZpbmUgQ0tSX1BJTl9MRU5fUkFOR0UJCQkoMHhhMikKLSNkZWZpbmUgQ0tSX1BJTl9FWFBJUkVECQkJCSgweGEzKQotI2RlZmluZSBDS1JfUElOX0xPQ0tFRAkJCQkoMHhhNCkKLSNkZWZpbmUgQ0tSX1NFU1NJT05fQ0xPU0VECQkJKDB4YjApCi0jZGVmaW5lIENLUl9TRVNTSU9OX0NPVU5UCQkJKDB4YjEpCi0jZGVmaW5lIENLUl9TRVNTSU9OX0hBTkRMRV9JTlZBTElECQkoMHhiMykKLSNkZWZpbmUgQ0tSX1NFU1NJT05fUEFSQUxMRUxfTk9UX1NVUFBPUlRFRAkoMHhiNCkKLSNkZWZpbmUgQ0tSX1NFU1NJT05fUkVBRF9PTkxZCQkJKDB4YjUpCi0jZGVmaW5lIENLUl9TRVNTSU9OX0VYSVNUUwkJCSgweGI2KQotI2RlZmluZSBDS1JfU0VTU0lPTl9SRUFEX09OTFlfRVhJU1RTCQkoMHhiNykKLSNkZWZpbmUgQ0tSX1NFU1NJT05fUkVBRF9XUklURV9TT19FWElTVFMJKDB4YjgpCi0jZGVmaW5lIENLUl9TSUdOQVRVUkVfSU5WQUxJRAkJCSgweGMwKQotI2RlZmluZSBDS1JfU0lHTkFUVVJFX0xFTl9SQU5HRQkJCSgweGMxKQotI2RlZmluZSBDS1JfVEVNUExBVEVfSU5DT01QTEVURQkJCSgweGQwKQotI2RlZmluZSBDS1JfVEVNUExBVEVfSU5DT05TSVNURU5UCQkoMHhkMSkKLSNkZWZpbmUgQ0tSX1RPS0VOX05PVF9QUkVTRU5UCQkJKDB4ZTApCi0jZGVmaW5lIENLUl9UT0tFTl9OT1RfUkVDT0dOSVpFRAkJKDB4ZTEpCi0jZGVmaW5lIENLUl9UT0tFTl9XUklURV9QUk9URUNURUQJCSgweGUyKQotI2RlZmluZQlDS1JfVU5XUkFQUElOR19LRVlfSEFORExFX0lOVkFMSUQJKDB4ZjApCi0jZGVmaW5lIENLUl9VTldSQVBQSU5HX0tFWV9TSVpFX1JBTkdFCQkoMHhmMSkKLSNkZWZpbmUgQ0tSX1VOV1JBUFBJTkdfS0VZX1RZUEVfSU5DT05TSVNURU5UCSgweGYyKQotI2RlZmluZSBDS1JfVVNFUl9BTFJFQURZX0xPR0dFRF9JTgkJKDB4MTAwKQotI2RlZmluZSBDS1JfVVNFUl9OT1RfTE9HR0VEX0lOCQkJKDB4MTAxKQotI2RlZmluZSBDS1JfVVNFUl9QSU5fTk9UX0lOSVRJQUxJWkVECQkoMHgxMDIpCi0jZGVmaW5lIENLUl9VU0VSX1RZUEVfSU5WQUxJRAkJCSgweDEwMykKLSNkZWZpbmUgQ0tSX1VTRVJfQU5PVEhFUl9BTFJFQURZX0xPR0dFRF9JTgkoMHgxMDQpCi0jZGVmaW5lIENLUl9VU0VSX1RPT19NQU5ZX1RZUEVTCQkJKDB4MTA1KQotI2RlZmluZSBDS1JfV1JBUFBFRF9LRVlfSU5WQUxJRAkJCSgweDExMCkKLSNkZWZpbmUgQ0tSX1dSQVBQRURfS0VZX0xFTl9SQU5HRQkJKDB4MTEyKQotI2RlZmluZSBDS1JfV1JBUFBJTkdfS0VZX0hBTkRMRV9JTlZBTElECQkoMHgxMTMpCi0jZGVmaW5lIENLUl9XUkFQUElOR19LRVlfU0laRV9SQU5HRQkJKDB4MTE0KQotI2RlZmluZSBDS1JfV1JBUFBJTkdfS0VZX1RZUEVfSU5DT05TSVNURU5UCSgweDExNSkKLSNkZWZpbmUgQ0tSX1JBTkRPTV9TRUVEX05PVF9TVVBQT1JURUQJCSgweDEyMCkKLSNkZWZpbmUgQ0tSX1JBTkRPTV9OT19STkcJCQkoMHgxMjEpCi0jZGVmaW5lIENLUl9ET01BSU5fUEFSQU1TX0lOVkFMSUQJCSgweDEzMCkKLSNkZWZpbmUgQ0tSX0JVRkZFUl9UT09fU01BTEwJCQkoMHgxNTApCi0jZGVmaW5lIENLUl9TQVZFRF9TVEFURV9JTlZBTElECQkJKDB4MTYwKQotI2RlZmluZSBDS1JfSU5GT1JNQVRJT05fU0VOU0lUSVZFCQkoMHgxNzApCi0jZGVmaW5lIENLUl9TVEFURV9VTlNBVkVBQkxFCQkJKDB4MTgwKQotI2RlZmluZSBDS1JfQ1JZUFRPS0lfTk9UX0lOSVRJQUxJWkVECQkoMHgxOTApCi0jZGVmaW5lIENLUl9DUllQVE9LSV9BTFJFQURZX0lOSVRJQUxJWkVECSgweDE5MSkKLSNkZWZpbmUgQ0tSX01VVEVYX0JBRAkJCQkoMHgxYTApCi0jZGVmaW5lIENLUl9NVVRFWF9OT1RfTE9DS0VECQkJKDB4MWExKQotI2RlZmluZSBDS1JfRlVOQ1RJT05fUkVKRUNURUQJCQkoMHgyMDApCi0jZGVmaW5lIENLUl9WRU5ET1JfREVGSU5FRAkJCSgodW5zaWduZWQgbG9uZykgKDEgPDwgMzEpKQotCi0KLQotLyogQ29tcGF0aWJpbGl0eSBsYXllci4gICovCi0KLSNpZmRlZiBDUllQVE9LSV9DT01QQVQKLQotI3VuZGVmIENLX0RFRklORV9GVU5DVElPTgotI2RlZmluZSBDS19ERUZJTkVfRlVOQ1RJT04ocmV0dmFsLCBuYW1lKSByZXR2YWwgQ0tfU1BFQyBuYW1lCi0KLS8qIEZvciBOVUxMLiAgKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIENLX0JZVEU7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgQ0tfQ0hBUjsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBDS19VVEY4Q0hBUjsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBDS19CQk9PTDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgQ0tfVUxPTkc7Ci10eXBlZGVmIGxvbmcgaW50IENLX0xPTkc7Ci10eXBlZGVmIENLX0JZVEUgKkNLX0JZVEVfUFRSOwotdHlwZWRlZiBDS19DSEFSICpDS19DSEFSX1BUUjsKLXR5cGVkZWYgQ0tfVVRGOENIQVIgKkNLX1VURjhDSEFSX1BUUjsKLXR5cGVkZWYgQ0tfVUxPTkcgKkNLX1VMT05HX1BUUjsKLXR5cGVkZWYgdm9pZCAqQ0tfVk9JRF9QVFI7Ci10eXBlZGVmIHZvaWQgKipDS19WT0lEX1BUUl9QVFI7Ci0jZGVmaW5lIENLX0ZBTFNFIDAKLSNkZWZpbmUgQ0tfVFJVRSAxCi0jaWZuZGVmIENLX0RJU0FCTEVfVFJVRV9GQUxTRQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAwCi0jZW5kaWYKLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFIDEKLSNlbmRpZgotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IGNrX3ZlcnNpb24gQ0tfVkVSU0lPTjsKLXR5cGVkZWYgc3RydWN0IGNrX3ZlcnNpb24gKkNLX1ZFUlNJT05fUFRSOwotCi10eXBlZGVmIHN0cnVjdCBja19pbmZvIENLX0lORk87Ci10eXBlZGVmIHN0cnVjdCBja19pbmZvICpDS19JTkZPX1BUUjsKLQotdHlwZWRlZiBja19zbG90X2lkX3QgKkNLX1NMT1RfSURfUFRSOwotCi10eXBlZGVmIHN0cnVjdCBja19zbG90X2luZm8gQ0tfU0xPVF9JTkZPOwotdHlwZWRlZiBzdHJ1Y3QgY2tfc2xvdF9pbmZvICpDS19TTE9UX0lORk9fUFRSOwotCi10eXBlZGVmIHN0cnVjdCBja190b2tlbl9pbmZvIENLX1RPS0VOX0lORk87Ci10eXBlZGVmIHN0cnVjdCBja190b2tlbl9pbmZvICpDS19UT0tFTl9JTkZPX1BUUjsKLQotdHlwZWRlZiBja19zZXNzaW9uX2hhbmRsZV90ICpDS19TRVNTSU9OX0hBTkRMRV9QVFI7Ci0KLXR5cGVkZWYgc3RydWN0IGNrX3Nlc3Npb25faW5mbyBDS19TRVNTSU9OX0lORk87Ci10eXBlZGVmIHN0cnVjdCBja19zZXNzaW9uX2luZm8gKkNLX1NFU1NJT05fSU5GT19QVFI7Ci0KLXR5cGVkZWYgY2tfb2JqZWN0X2hhbmRsZV90ICpDS19PQkpFQ1RfSEFORExFX1BUUjsKLQotdHlwZWRlZiBja19vYmplY3RfY2xhc3NfdCAqQ0tfT0JKRUNUX0NMQVNTX1BUUjsKLQotdHlwZWRlZiBzdHJ1Y3QgY2tfYXR0cmlidXRlIENLX0FUVFJJQlVURTsKLXR5cGVkZWYgc3RydWN0IGNrX2F0dHJpYnV0ZSAqQ0tfQVRUUklCVVRFX1BUUjsKLQotdHlwZWRlZiBzdHJ1Y3QgY2tfZGF0ZSBDS19EQVRFOwotdHlwZWRlZiBzdHJ1Y3QgY2tfZGF0ZSAqQ0tfREFURV9QVFI7Ci0KLXR5cGVkZWYgY2tfbWVjaGFuaXNtX3R5cGVfdCAqQ0tfTUVDSEFOSVNNX1RZUEVfUFRSOwotCi10eXBlZGVmIHN0cnVjdCBja19tZWNoYW5pc20gQ0tfTUVDSEFOSVNNOwotdHlwZWRlZiBzdHJ1Y3QgY2tfbWVjaGFuaXNtICpDS19NRUNIQU5JU01fUFRSOwotCi10eXBlZGVmIHN0cnVjdCBja19tZWNoYW5pc21faW5mbyBDS19NRUNIQU5JU01fSU5GTzsKLXR5cGVkZWYgc3RydWN0IGNrX21lY2hhbmlzbV9pbmZvICpDS19NRUNIQU5JU01fSU5GT19QVFI7Ci0KLXR5cGVkZWYgc3RydWN0IGNrX2Z1bmN0aW9uX2xpc3QgQ0tfRlVOQ1RJT05fTElTVDsKLXR5cGVkZWYgc3RydWN0IGNrX2Z1bmN0aW9uX2xpc3QgKkNLX0ZVTkNUSU9OX0xJU1RfUFRSOwotdHlwZWRlZiBzdHJ1Y3QgY2tfZnVuY3Rpb25fbGlzdCAqKkNLX0ZVTkNUSU9OX0xJU1RfUFRSX1BUUjsKLQotdHlwZWRlZiBzdHJ1Y3QgY2tfY19pbml0aWFsaXplX2FyZ3MgQ0tfQ19JTklUSUFMSVpFX0FSR1M7Ci10eXBlZGVmIHN0cnVjdCBja19jX2luaXRpYWxpemVfYXJncyAqQ0tfQ19JTklUSUFMSVpFX0FSR1NfUFRSOwotCi0jZGVmaW5lIE5VTExfUFRSIE5VTEwKLQotLyogRGVsZXRlIHRoZSBoZWxwZXIgbWFjcm9zIGRlZmluZWQgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4gICovCi0jdW5kZWYgY2tfZmxhZ3NfdAotI3VuZGVmIGNrX3ZlcnNpb24KLQotI3VuZGVmIGNrX2luZm8KLSN1bmRlZiBjcnlwdG9raV92ZXJzaW9uCi0jdW5kZWYgbWFudWZhY3R1cmVyX2lkCi0jdW5kZWYgbGlicmFyeV9kZXNjcmlwdGlvbgotI3VuZGVmIGxpYnJhcnlfdmVyc2lvbgotCi0jdW5kZWYgY2tfbm90aWZpY2F0aW9uX3QKLSN1bmRlZiBja19zbG90X2lkX3QKLQotI3VuZGVmIGNrX3Nsb3RfaW5mbwotI3VuZGVmIHNsb3RfZGVzY3JpcHRpb24KLSN1bmRlZiBoYXJkd2FyZV92ZXJzaW9uCi0jdW5kZWYgZmlybXdhcmVfdmVyc2lvbgotCi0jdW5kZWYgY2tfdG9rZW5faW5mbwotI3VuZGVmIHNlcmlhbF9udW1iZXIKLSN1bmRlZiBtYXhfc2Vzc2lvbl9jb3VudAotI3VuZGVmIHNlc3Npb25fY291bnQKLSN1bmRlZiBtYXhfcndfc2Vzc2lvbl9jb3VudAotI3VuZGVmIHJ3X3Nlc3Npb25fY291bnQKLSN1bmRlZiBtYXhfcGluX2xlbgotI3VuZGVmIG1pbl9waW5fbGVuCi0jdW5kZWYgdG90YWxfcHVibGljX21lbW9yeQotI3VuZGVmIGZyZWVfcHVibGljX21lbW9yeQotI3VuZGVmIHRvdGFsX3ByaXZhdGVfbWVtb3J5Ci0jdW5kZWYgZnJlZV9wcml2YXRlX21lbW9yeQotI3VuZGVmIHV0Y190aW1lCi0KLSN1bmRlZiBja19zZXNzaW9uX2hhbmRsZV90Ci0jdW5kZWYgY2tfdXNlcl90eXBlX3QKLSN1bmRlZiBja19zdGF0ZV90Ci0KLSN1bmRlZiBja19zZXNzaW9uX2luZm8KLSN1bmRlZiBzbG90X2lkCi0jdW5kZWYgZGV2aWNlX2Vycm9yCi0KLSN1bmRlZiBja19vYmplY3RfaGFuZGxlX3QKLSN1bmRlZiBja19vYmplY3RfY2xhc3NfdAotI3VuZGVmIGNrX2h3X2ZlYXR1cmVfdHlwZV90Ci0jdW5kZWYgY2tfa2V5X3R5cGVfdAotI3VuZGVmIGNrX2NlcnRpZmljYXRlX3R5cGVfdAotI3VuZGVmIGNrX2F0dHJpYnV0ZV90eXBlX3QKLQotI3VuZGVmIGNrX2F0dHJpYnV0ZQotI3VuZGVmIHZhbHVlCi0jdW5kZWYgdmFsdWVfbGVuCi0KLSN1bmRlZiBja19kYXRlCi0KLSN1bmRlZiBja19tZWNoYW5pc21fdHlwZV90Ci0KLSN1bmRlZiBja19tZWNoYW5pc20KLSN1bmRlZiBwYXJhbWV0ZXIKLSN1bmRlZiBwYXJhbWV0ZXJfbGVuCi0KLSN1bmRlZiBja19tZWNoYW5pc21faW5mbwotI3VuZGVmIG1pbl9rZXlfc2l6ZQotI3VuZGVmIG1heF9rZXlfc2l6ZQotCi0jdW5kZWYgY2tfcnZfdAotI3VuZGVmIGNrX25vdGlmeV90Ci0KLSN1bmRlZiBja19mdW5jdGlvbl9saXN0Ci0KLSN1bmRlZiBja19jcmVhdGVtdXRleF90Ci0jdW5kZWYgY2tfZGVzdHJveW11dGV4X3QKLSN1bmRlZiBja19sb2NrbXV0ZXhfdAotI3VuZGVmIGNrX3VubG9ja211dGV4X3QKLQotI3VuZGVmIGNrX2NfaW5pdGlhbGl6ZV9hcmdzCi0jdW5kZWYgY3JlYXRlX211dGV4Ci0jdW5kZWYgZGVzdHJveV9tdXRleAotI3VuZGVmIGxvY2tfbXV0ZXgKLSN1bmRlZiB1bmxvY2tfbXV0ZXgKLSN1bmRlZiByZXNlcnZlZAotCi0jZW5kaWYJLyogQ1JZUFRPS0lfQ09NUEFUICovCi0KLQotLyogU3lzdGVtIGRlcGVuZGVuY2llcy4gICovCi0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoQ1JZUFRPS0lfRk9SQ0VfV0lOMzIpCi0jcHJhZ21hIHBhY2socG9wLCBjcnlwdG9raSkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogUEtDUzExX0ggKi8KZGlmZiAtLWdpdCBhL3BsYXRmb3JtLmMgYi9wbGF0Zm9ybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDU1NDcyLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyogJElkOiBwbGF0Zm9ybS5jLHYgMS4xOCAyMDExLzAxLzExIDA2OjAyOjI1IGRqbSBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA2IERhcnJlbiBUdWNrZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgInNlcnZjb25mLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJhdXRoLmgiCi0jaW5jbHVkZSAiYXV0aC1wYW0uaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbmJzZC1jb21wYXQuaCIKLQotZXh0ZXJuIGludCB1c2VfcHJpdnNlcDsKLWV4dGVybiBTZXJ2ZXJPcHRpb25zIG9wdGlvbnM7Ci0KLXZvaWQKLXBsYXRmb3JtX3ByZV9saXN0ZW4odm9pZCkKLXsKLSNpZmRlZiBMSU5VWF9PT01fQURKVVNUCi0JLyogQWRqdXN0IG91dC1vZi1tZW1vcnkga2lsbGVyIHNvIGxpc3RlbmluZyBwcm9jZXNzIGlzIG5vdCBraWxsZWQgKi8KLQlvb21fYWRqdXN0X3NldHVwKCk7Ci0jZW5kaWYKLX0KLQotdm9pZAotcGxhdGZvcm1fcHJlX2Zvcmsodm9pZCkKLXsKLSNpZmRlZiBVU0VfU09MQVJJU19QUk9DRVNTX0NPTlRSQUNUUwotCXNvbGFyaXNfY29udHJhY3RfcHJlX2ZvcmsoKTsKLSNlbmRpZgotfQotCi12b2lkCi1wbGF0Zm9ybV9wb3N0X2ZvcmtfcGFyZW50KHBpZF90IGNoaWxkX3BpZCkKLXsKLSNpZmRlZiBVU0VfU09MQVJJU19QUk9DRVNTX0NPTlRSQUNUUwotCXNvbGFyaXNfY29udHJhY3RfcG9zdF9mb3JrX3BhcmVudChjaGlsZF9waWQpOwotI2VuZGlmCi19Ci0KLXZvaWQKLXBsYXRmb3JtX3Bvc3RfZm9ya19jaGlsZCh2b2lkKQotewotI2lmZGVmIFVTRV9TT0xBUklTX1BST0NFU1NfQ09OVFJBQ1RTCi0Jc29sYXJpc19jb250cmFjdF9wb3N0X2ZvcmtfY2hpbGQoKTsKLSNlbmRpZgotI2lmZGVmIExJTlVYX09PTV9BREpVU1QKLQlvb21fYWRqdXN0X3Jlc3RvcmUoKTsKLSNlbmRpZgotfQotCi0vKiByZXR1cm4gMSBpZiB3ZSBhcmUgcnVubmluZyB3aXRoIHByaXZpbGVnZSB0byBzd2FwIFVJRHMsIDAgb3RoZXJ3aXNlICovCi1pbnQKLXBsYXRmb3JtX3ByaXZpbGVnZWRfdWlkc3dhcCh2b2lkKQotewotI2lmZGVmIEhBVkVfQ1lHV0lOCi0JLyogdWlkIDAgaXMgbm90IHNwZWNpYWwgb24gQ3lnd2luIHNvIGFsd2F5cyB0cnkgKi8KLQlyZXR1cm4gMTsKLSNlbHNlCi0JcmV0dXJuIChnZXR1aWQoKSA9PSAwIHx8IGdldGV1aWQoKSA9PSAwKTsKLSNlbmRpZgotfQotCi0vKgotICogVGhpcyBnZXRzIGNhbGxlZCBiZWZvcmUgc3dpdGNoaW5nIFVJRHMsIGFuZCBpcyBjYWxsZWQgZXZlbiB3aGVuIHNzaGQgaXMKLSAqIG5vdCBydW5uaW5nIGFzIHJvb3QuCi0gKi8KLXZvaWQKLXBsYXRmb3JtX3NldHVzZXJjb250ZXh0KHN0cnVjdCBwYXNzd2QgKnB3KQotewotI2lmZGVmIFdJVEhfU0VMSU5VWAotCS8qIENhY2hlIHNlbGludXggc3RhdHVzIGZvciBsYXRlciB1c2UgKi8KLQkodm9pZClzc2hfc2VsaW51eF9lbmFibGVkKCk7Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9TT0xBUklTX1BST0pFQ1RTCi0JLyogaWYgc29sYXJpcyBwcm9qZWN0cyB3ZXJlIGRldGVjdGVkLCBzZXQgdGhlIGRlZmF1bHQgbm93ICovCi0JaWYgKGdldHVpZCgpID09IDAgfHwgZ2V0ZXVpZCgpID09IDApCi0JCXNvbGFyaXNfc2V0X2RlZmF1bHRfcHJvamVjdChwdyk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoSEFWRV9MT0dJTl9DQVApICYmIGRlZmluZWQgKF9fYnNkaV9fKQotCWlmIChnZXR1aWQoKSA9PSAwIHx8IGdldGV1aWQoKSA9PSAwKQotCQlzZXRwZ2lkKDAsIDApOwotIyBlbmRpZgotCi0jaWYgZGVmaW5lZChIQVZFX0xPR0lOX0NBUCkgJiYgZGVmaW5lZChVU0VfUEFNKQotCS8qCi0JICogSWYgd2UgaGF2ZSBib3RoIExPR0lOX0NBUCBhbmQgUEFNLCB3ZSB3YW50IHRvIGVzdGFibGlzaCBjcmVkcwotCSAqIGJlZm9yZSBjYWxsaW5nIHNldHVzZXJjb250ZXh0IChpbiBzZXNzaW9uLmM6ZG9fc2V0dXNlcmNvbnRleHQpLgotCSAqLwotCWlmIChnZXR1aWQoKSA9PSAwIHx8IGdldGV1aWQoKSA9PSAwKSB7Ci0JCWlmIChvcHRpb25zLnVzZV9wYW0pIHsKLQkJCWRvX3BhbV9zZXRjcmVkKHVzZV9wcml2c2VwKTsKLQkJfQotCX0KLSMgZW5kaWYgLyogVVNFX1BBTSAqLwotCi0jaWYgIWRlZmluZWQoSEFWRV9MT0dJTl9DQVApICYmIGRlZmluZWQoSEFWRV9HRVRMVUlEKSAmJiBkZWZpbmVkKEhBVkVfU0VUTFVJRCkKLQlpZiAoZ2V0dWlkKCkgPT0gMCB8fCBnZXRldWlkKCkgPT0gMCkgewotCQkvKiBTZXRzIGxvZ2luIHVpZCBmb3IgYWNjb3VudGluZyAqLwotCQlpZiAoZ2V0bHVpZCgpID09IC0xICYmIHNldGx1aWQocHctPnB3X3VpZCkgPT0gLTEpCi0JCQllcnJvcigic2V0bHVpZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCX0KLSNlbmRpZgotfQotCi0vKgotICogVGhpcyBnZXRzIGNhbGxlZCBhZnRlciB3ZSd2ZSBlc3RhYmxpc2hlZCB0aGUgdXNlcidzIGdyb3VwcywgYW5kIGlzIG9ubHkKLSAqIGNhbGxlZCBpZiBzc2hkIGlzIHJ1bm5pbmcgYXMgcm9vdC4KLSAqLwotdm9pZAotcGxhdGZvcm1fc2V0dXNlcmNvbnRleHRfcG9zdF9ncm91cHMoc3RydWN0IHBhc3N3ZCAqcHcpCi17Ci0jaWYgIWRlZmluZWQoSEFWRV9MT0dJTl9DQVApICYmIGRlZmluZWQoVVNFX1BBTSkKLQkvKgotCSAqIFBBTSBjcmVkZW50aWFscyBtYXkgdGFrZSB0aGUgZm9ybSBvZiBzdXBwbGVtZW50YXJ5IGdyb3Vwcy4KLQkgKiBUaGVzZSB3aWxsIGhhdmUgYmVlbiB3aXBlZCBieSB0aGUgYWJvdmUgaW5pdGdyb3VwcygpIGNhbGwuCi0JICogUmVlc3RhYmxpc2ggdGhlbSBoZXJlLgotCSAqLwotCWlmIChvcHRpb25zLnVzZV9wYW0pIHsKLQkJZG9fcGFtX3NldGNyZWQodXNlX3ByaXZzZXApOwotCX0KLSNlbmRpZiAvKiBVU0VfUEFNICovCi0KLSNpZiAhZGVmaW5lZChIQVZFX0xPR0lOX0NBUCkgJiYgKGRlZmluZWQoV0lUSF9JUklYX1BST0pFQ1QpIHx8IFwKLSAgICBkZWZpbmVkKFdJVEhfSVJJWF9KT0JTKSB8fCBkZWZpbmVkKFdJVEhfSVJJWF9BUlJBWSkpCi0JaXJpeF9zZXR1c2VyY29udGV4dChwdyk7Ci0jZW5kaWYgLyogZGVmaW5lZChXSVRIX0lSSVhfUFJPSkVDVCkgfHwgZGVmaW5lZChXSVRIX0lSSVhfSk9CUykgfHwgZGVmaW5lZChXSVRIX0lSSVhfQVJSQVkpICovCi0KLSNpZmRlZiBfQUlYCi0JYWl4X3VzcmluZm8ocHcpOwotI2VuZGlmIC8qIF9BSVggKi8KLQotI2lmICFkZWZpbmVkKEhBVkVfTE9HSU5fQ0FQKSAmJiBkZWZpbmVkKFVTRV9MSUJJQUYpCi0JaWYgKHNldF9pZChwdy0+cHdfbmFtZSkgIT0gMCkgewotCQlleGl0KDEpOwotCX0KLSMgZW5kaWYgLyogVVNFX0xJQklBRiAqLwotCi0jaWZkZWYgSEFWRV9TRVRQQ1JFRAotCS8qCi0JICogSWYgd2UgaGF2ZSBhIGNocm9vdCBkaXJlY3RvcnksIHdlIHNldCBhbGwgY3JlZHMgZXhjZXB0IHJlYWwKLQkgKiB1aWQgd2hpY2ggd2Ugd2lsbCBuZWVkIGZvciBjaHJvb3QuICBJZiB3ZSBkb24ndCBoYXZlIGEKLQkgKiBjaHJvb3QgZGlyZWN0b3J5LCB3ZSBkb24ndCBvdmVycmlkZSBhbnl0aGluZy4KLQkgKi8KLQl7Ci0JCWNoYXIgKipjcmVkcyA9IE5VTEwsICpjaHJvb3RfY3JlZHNbXSA9Ci0JCSAgICB7ICJSRUFMX1VTRVI9cm9vdCIsIE5VTEwgfTsKLQotCQlpZiAob3B0aW9ucy5jaHJvb3RfZGlyZWN0b3J5ICE9IE5VTEwgJiYKLQkJICAgIHN0cmNhc2VjbXAob3B0aW9ucy5jaHJvb3RfZGlyZWN0b3J5LCAibm9uZSIpICE9IDApCi0JCQljcmVkcyA9IGNocm9vdF9jcmVkczsKLQotCQlpZiAoc2V0cGNyZWQocHctPnB3X25hbWUsIGNyZWRzKSA9PSAtMSkKLQkJCWZhdGFsKCJGYWlsZWQgdG8gc2V0IHByb2Nlc3MgY3JlZGVudGlhbHMiKTsKLQl9Ci0jZW5kaWYgLyogSEFWRV9TRVRQQ1JFRCAqLwotI2lmZGVmIFdJVEhfU0VMSU5VWAotCXNzaF9zZWxpbnV4X3NldHVwX2V4ZWNfY29udGV4dChwdy0+cHdfbmFtZSk7Ci0jZW5kaWYKLX0KLQotY2hhciAqCi1wbGF0Zm9ybV9rcmI1X2dldF9wcmluY2lwYWxfbmFtZShjb25zdCBjaGFyICpwd19uYW1lKQotewotI2lmZGVmIFVTRV9BSVhfS1JCX05BTUUKLQlyZXR1cm4gYWl4X2tyYjVfZ2V0X3ByaW5jaXBhbF9uYW1lKHB3X25hbWUpOwotI2Vsc2UKLQlyZXR1cm4gTlVMTDsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0uaCBiL3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NGQyYzMuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qICRJZDogcGxhdGZvcm0uaCx2IDEuNyAyMDEwLzExLzA1IDAzOjQ3OjAxIGR0dWNrZXIgRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBEYXJyZW4gVHVja2VyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxwd2QuaD4KLQotdm9pZCBwbGF0Zm9ybV9wcmVfbGlzdGVuKHZvaWQpOwotdm9pZCBwbGF0Zm9ybV9wcmVfZm9yayh2b2lkKTsKLXZvaWQgcGxhdGZvcm1fcG9zdF9mb3JrX3BhcmVudChwaWRfdCBjaGlsZF9waWQpOwotdm9pZCBwbGF0Zm9ybV9wb3N0X2ZvcmtfY2hpbGQodm9pZCk7Ci1pbnQgIHBsYXRmb3JtX3ByaXZpbGVnZWRfdWlkc3dhcCh2b2lkKTsKLXZvaWQgcGxhdGZvcm1fc2V0dXNlcmNvbnRleHQoc3RydWN0IHBhc3N3ZCAqKTsKLXZvaWQgcGxhdGZvcm1fc2V0dXNlcmNvbnRleHRfcG9zdF9ncm91cHMoc3RydWN0IHBhc3N3ZCAqKTsKLWNoYXIgKnBsYXRmb3JtX2dldF9rcmI1X2NsaWVudChjb25zdCBjaGFyICopOwotY2hhciAqcGxhdGZvcm1fa3JiNV9nZXRfcHJpbmNpcGFsX25hbWUoY29uc3QgY2hhciAqKTsKLQotCmRpZmYgLS1naXQgYS9wcm9ncmVzc21ldGVyLmMgYi9wcm9ncmVzc21ldGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOTUyMjIuLjAwMDAwMDAKLS0tIGEvcHJvZ3Jlc3NtZXRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qICRPcGVuQlNEOiBwcm9ncmVzc21ldGVyLmMsdiAxLjM3IDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBOaWxzIE5vcmRtYW4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJwcm9ncmVzc21ldGVyLmgiCi0jaW5jbHVkZSAiYXRvbWljaW8uaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLSNkZWZpbmUgREVGQVVMVF9XSU5TSVpFIDgwCi0jZGVmaW5lIE1BWF9XSU5TSVpFIDUxMgotI2RlZmluZSBQQURESU5HIDEJCS8qIHBhZGRpbmcgYmV0d2VlbiB0aGUgcHJvZ3Jlc3MgaW5kaWNhdG9ycyAqLwotI2RlZmluZSBVUERBVEVfSU5URVJWQUwgMQkvKiB1cGRhdGUgdGhlIHByb2dyZXNzIG1ldGVyIGV2ZXJ5IHNlY29uZCAqLwotI2RlZmluZSBTVEFMTF9USU1FIDUJCS8qIHdlJ3JlIHN0YWxsZWQgYWZ0ZXIgdGhpcyBtYW55IHNlY29uZHMgKi8KLQotLyogZGV0ZXJtaW5lcyB3aGV0aGVyIHdlIGNhbiBvdXRwdXQgdG8gdGhlIHRlcm1pbmFsICovCi1zdGF0aWMgaW50IGNhbl9vdXRwdXQodm9pZCk7Ci0KLS8qIGZvcm1hdHMgYW5kIGluc2VydHMgdGhlIHNwZWNpZmllZCBzaXplIGludG8gdGhlIGdpdmVuIGJ1ZmZlciAqLwotc3RhdGljIHZvaWQgZm9ybWF0X3NpemUoY2hhciAqLCBpbnQsIG9mZl90KTsKLXN0YXRpYyB2b2lkIGZvcm1hdF9yYXRlKGNoYXIgKiwgaW50LCBvZmZfdCk7Ci0KLS8qIHdpbmRvdyByZXNpemluZyAqLwotc3RhdGljIHZvaWQgc2lnX3dpbmNoKGludCk7Ci1zdGF0aWMgdm9pZCBzZXRzY3JlZW5zaXplKHZvaWQpOwotCi0vKiB1cGRhdGVzIHRoZSBwcm9ncmVzc21ldGVyIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRyYW5zZmVyICovCi12b2lkIHJlZnJlc2hfcHJvZ3Jlc3NfbWV0ZXIodm9pZCk7Ci0KLS8qIHNpZ25hbCBoYW5kbGVyIGZvciB1cGRhdGluZyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgKi8KLXN0YXRpYyB2b2lkIHVwZGF0ZV9wcm9ncmVzc19tZXRlcihpbnQpOwotCi1zdGF0aWMgdGltZV90IHN0YXJ0OwkJLyogc3RhcnQgcHJvZ3Jlc3MgKi8KLXN0YXRpYyB0aW1lX3QgbGFzdF91cGRhdGU7CS8qIGxhc3QgcHJvZ3Jlc3MgdXBkYXRlICovCi1zdGF0aWMgY2hhciAqZmlsZTsJCS8qIG5hbWUgb2YgdGhlIGZpbGUgYmVpbmcgdHJhbnNmZXJyZWQgKi8KLXN0YXRpYyBvZmZfdCBlbmRfcG9zOwkJLyogZW5kaW5nIHBvc2l0aW9uIG9mIHRyYW5zZmVyICovCi1zdGF0aWMgb2ZmX3QgY3VyX3BvczsJCS8qIHRyYW5zZmVyIHBvc2l0aW9uIGFzIG9mIGxhc3QgcmVmcmVzaCAqLwotc3RhdGljIHZvbGF0aWxlIG9mZl90ICpjb3VudGVyOwkvKiBwcm9ncmVzcyBjb3VudGVyICovCi1zdGF0aWMgbG9uZyBzdGFsbGVkOwkJLyogaG93IGxvbmcgd2UgaGF2ZSBiZWVuIHN0YWxsZWQgKi8KLXN0YXRpYyBpbnQgYnl0ZXNfcGVyX3NlY29uZDsJLyogY3VycmVudCBzcGVlZCBpbiBieXRlcyBwZXIgc2Vjb25kICovCi1zdGF0aWMgaW50IHdpbl9zaXplOwkJLyogdGVybWluYWwgd2luZG93IHNpemUgKi8KLXN0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgd2luX3Jlc2l6ZWQ7IC8qIGZvciB3aW5kb3cgcmVzaXppbmcgKi8KLQotLyogdW5pdHMgZm9yIGZvcm1hdF9zaXplICovCi1zdGF0aWMgY29uc3QgY2hhciB1bml0W10gPSAiIEtNR1QiOwotCi1zdGF0aWMgaW50Ci1jYW5fb3V0cHV0KHZvaWQpCi17Ci0JcmV0dXJuIChnZXRwZ3JwKCkgPT0gdGNnZXRwZ3JwKFNURE9VVF9GSUxFTk8pKTsKLX0KLQotc3RhdGljIHZvaWQKLWZvcm1hdF9yYXRlKGNoYXIgKmJ1ZiwgaW50IHNpemUsIG9mZl90IGJ5dGVzKQotewotCWludCBpOwotCi0JYnl0ZXMgKj0gMTAwOwotCWZvciAoaSA9IDA7IGJ5dGVzID49IDEwMCoxMDAwICYmIHVuaXRbaV0gIT0gJ1QnOyBpKyspCi0JCWJ5dGVzID0gKGJ5dGVzICsgNTEyKSAvIDEwMjQ7Ci0JaWYgKGkgPT0gMCkgewotCQlpKys7Ci0JCWJ5dGVzID0gKGJ5dGVzICsgNTEyKSAvIDEwMjQ7Ci0JfQotCXNucHJpbnRmKGJ1Ziwgc2l6ZSwgIiUzbGxkLiUxbGxkJWMlcyIsCi0JICAgIChsb25nIGxvbmcpIChieXRlcyArIDUpIC8gMTAwLAotCSAgICAobG9uZyBsb25nKSAoYnl0ZXMgKyA1KSAvIDEwICUgMTAsCi0JICAgIHVuaXRbaV0sCi0JICAgIGkgPyAiQiIgOiAiICIpOwotfQotCi1zdGF0aWMgdm9pZAotZm9ybWF0X3NpemUoY2hhciAqYnVmLCBpbnQgc2l6ZSwgb2ZmX3QgYnl0ZXMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBieXRlcyA+PSAxMDAwMCAmJiB1bml0W2ldICE9ICdUJzsgaSsrKQotCQlieXRlcyA9IChieXRlcyArIDUxMikgLyAxMDI0OwotCXNucHJpbnRmKGJ1Ziwgc2l6ZSwgIiU0bGxkJWMlcyIsCi0JICAgIChsb25nIGxvbmcpIGJ5dGVzLAotCSAgICB1bml0W2ldLAotCSAgICBpID8gIkIiIDogIiAiKTsKLX0KLQotdm9pZAotcmVmcmVzaF9wcm9ncmVzc19tZXRlcih2b2lkKQotewotCWNoYXIgYnVmW01BWF9XSU5TSVpFICsgMV07Ci0JdGltZV90IG5vdzsKLQlvZmZfdCB0cmFuc2ZlcnJlZDsKLQlkb3VibGUgZWxhcHNlZDsKLQlpbnQgcGVyY2VudDsKLQlvZmZfdCBieXRlc19sZWZ0OwotCWludCBjdXJfc3BlZWQ7Ci0JaW50IGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzOwotCWludCBpLCBsZW47Ci0JaW50IGZpbGVfbGVuOwotCi0JdHJhbnNmZXJyZWQgPSAqY291bnRlciAtIGN1cl9wb3M7Ci0JY3VyX3BvcyA9ICpjb3VudGVyOwotCW5vdyA9IHRpbWUoTlVMTCk7Ci0JYnl0ZXNfbGVmdCA9IGVuZF9wb3MgLSBjdXJfcG9zOwotCi0JaWYgKGJ5dGVzX2xlZnQgPiAwKQotCQllbGFwc2VkID0gbm93IC0gbGFzdF91cGRhdGU7Ci0JZWxzZSB7Ci0JCWVsYXBzZWQgPSBub3cgLSBzdGFydDsKLQkJLyogQ2FsY3VsYXRlIHRydWUgdG90YWwgc3BlZWQgd2hlbiBkb25lICovCi0JCXRyYW5zZmVycmVkID0gZW5kX3BvczsKLQkJYnl0ZXNfcGVyX3NlY29uZCA9IDA7Ci0JfQotCi0JLyogY2FsY3VsYXRlIHNwZWVkICovCi0JaWYgKGVsYXBzZWQgIT0gMCkKLQkJY3VyX3NwZWVkID0gKHRyYW5zZmVycmVkIC8gZWxhcHNlZCk7Ci0JZWxzZQotCQljdXJfc3BlZWQgPSB0cmFuc2ZlcnJlZDsKLQotI2RlZmluZSBBR0VfRkFDVE9SIDAuOQotCWlmIChieXRlc19wZXJfc2Vjb25kICE9IDApIHsKLQkJYnl0ZXNfcGVyX3NlY29uZCA9IChieXRlc19wZXJfc2Vjb25kICogQUdFX0ZBQ1RPUikgKwotCQkgICAgKGN1cl9zcGVlZCAqICgxLjAgLSBBR0VfRkFDVE9SKSk7Ci0JfSBlbHNlCi0JCWJ5dGVzX3Blcl9zZWNvbmQgPSBjdXJfc3BlZWQ7Ci0KLQkvKiBmaWxlbmFtZSAqLwotCWJ1ZlswXSA9ICdcMCc7Ci0JZmlsZV9sZW4gPSB3aW5fc2l6ZSAtIDM1OwotCWlmIChmaWxlX2xlbiA+IDApIHsKLQkJbGVuID0gc25wcmludGYoYnVmLCBmaWxlX2xlbiArIDEsICJcciVzIiwgZmlsZSk7Ci0JCWlmIChsZW4gPCAwKQotCQkJbGVuID0gMDsKLQkJaWYgKGxlbiA+PSBmaWxlX2xlbiArIDEpCi0JCQlsZW4gPSBmaWxlX2xlbjsKLQkJZm9yIChpID0gbGVuOyBpIDwgZmlsZV9sZW47IGkrKykKLQkJCWJ1ZltpXSA9ICcgJzsKLQkJYnVmW2ZpbGVfbGVuXSA9ICdcMCc7Ci0JfQotCi0JLyogcGVyY2VudCBvZiB0cmFuc2ZlciBkb25lICovCi0JaWYgKGVuZF9wb3MgIT0gMCkKLQkJcGVyY2VudCA9ICgoZmxvYXQpY3VyX3BvcyAvIGVuZF9wb3MpICogMTAwOwotCWVsc2UKLQkJcGVyY2VudCA9IDEwMDsKLQlzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgd2luX3NpemUgLSBzdHJsZW4oYnVmKSwKLQkgICAgIiAlM2QlJSAiLCBwZXJjZW50KTsKLQotCS8qIGFtb3VudCB0cmFuc2ZlcnJlZCAqLwotCWZvcm1hdF9zaXplKGJ1ZiArIHN0cmxlbihidWYpLCB3aW5fc2l6ZSAtIHN0cmxlbihidWYpLAotCSAgICBjdXJfcG9zKTsKLQlzdHJsY2F0KGJ1ZiwgIiAiLCB3aW5fc2l6ZSk7Ci0KLQkvKiBiYW5kd2lkdGggdXNhZ2UgKi8KLQlmb3JtYXRfcmF0ZShidWYgKyBzdHJsZW4oYnVmKSwgd2luX3NpemUgLSBzdHJsZW4oYnVmKSwKLQkgICAgKG9mZl90KWJ5dGVzX3Blcl9zZWNvbmQpOwotCXN0cmxjYXQoYnVmLCAiL3MgIiwgd2luX3NpemUpOwotCi0JLyogRVRBICovCi0JaWYgKCF0cmFuc2ZlcnJlZCkKLQkJc3RhbGxlZCArPSBlbGFwc2VkOwotCWVsc2UKLQkJc3RhbGxlZCA9IDA7Ci0KLQlpZiAoc3RhbGxlZCA+PSBTVEFMTF9USU1FKQotCQlzdHJsY2F0KGJ1ZiwgIi0gc3RhbGxlZCAtIiwgd2luX3NpemUpOwotCWVsc2UgaWYgKGJ5dGVzX3Blcl9zZWNvbmQgPT0gMCAmJiBieXRlc19sZWZ0KQotCQlzdHJsY2F0KGJ1ZiwgIiAgLS06LS0gRVRBIiwgd2luX3NpemUpOwotCWVsc2UgewotCQlpZiAoYnl0ZXNfbGVmdCA+IDApCi0JCQlzZWNvbmRzID0gYnl0ZXNfbGVmdCAvIGJ5dGVzX3Blcl9zZWNvbmQ7Ci0JCWVsc2UKLQkJCXNlY29uZHMgPSBlbGFwc2VkOwotCi0JCWhvdXJzID0gc2Vjb25kcyAvIDM2MDA7Ci0JCXNlY29uZHMgLT0gaG91cnMgKiAzNjAwOwotCQltaW51dGVzID0gc2Vjb25kcyAvIDYwOwotCQlzZWNvbmRzIC09IG1pbnV0ZXMgKiA2MDsKLQotCQlpZiAoaG91cnMgIT0gMCkKLQkJCXNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCB3aW5fc2l6ZSAtIHN0cmxlbihidWYpLAotCQkJICAgICIlZDolMDJkOiUwMmQiLCBob3VycywgbWludXRlcywgc2Vjb25kcyk7Ci0JCWVsc2UKLQkJCXNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCB3aW5fc2l6ZSAtIHN0cmxlbihidWYpLAotCQkJICAgICIgICUwMmQ6JTAyZCIsIG1pbnV0ZXMsIHNlY29uZHMpOwotCi0JCWlmIChieXRlc19sZWZ0ID4gMCkKLQkJCXN0cmxjYXQoYnVmLCAiIEVUQSIsIHdpbl9zaXplKTsKLQkJZWxzZQotCQkJc3RybGNhdChidWYsICIgICAgIiwgd2luX3NpemUpOwotCX0KLQotCWF0b21pY2lvKHZ3cml0ZSwgU1RET1VUX0ZJTEVOTywgYnVmLCB3aW5fc2l6ZSAtIDEpOwotCWxhc3RfdXBkYXRlID0gbm93OwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi11cGRhdGVfcHJvZ3Jlc3NfbWV0ZXIoaW50IGlnbm9yZSkKLXsKLQlpbnQgc2F2ZV9lcnJubzsKLQotCXNhdmVfZXJybm8gPSBlcnJubzsKLQotCWlmICh3aW5fcmVzaXplZCkgewotCQlzZXRzY3JlZW5zaXplKCk7Ci0JCXdpbl9yZXNpemVkID0gMDsKLQl9Ci0JaWYgKGNhbl9vdXRwdXQoKSkKLQkJcmVmcmVzaF9wcm9ncmVzc19tZXRlcigpOwotCi0Jc2lnbmFsKFNJR0FMUk0sIHVwZGF0ZV9wcm9ncmVzc19tZXRlcik7Ci0JYWxhcm0oVVBEQVRFX0lOVEVSVkFMKTsKLQllcnJubyA9IHNhdmVfZXJybm87Ci19Ci0KLXZvaWQKLXN0YXJ0X3Byb2dyZXNzX21ldGVyKGNoYXIgKmYsIG9mZl90IGZpbGVzaXplLCBvZmZfdCAqY3RyKQotewotCXN0YXJ0ID0gbGFzdF91cGRhdGUgPSB0aW1lKE5VTEwpOwotCWZpbGUgPSBmOwotCWVuZF9wb3MgPSBmaWxlc2l6ZTsKLQljdXJfcG9zID0gMDsKLQljb3VudGVyID0gY3RyOwotCXN0YWxsZWQgPSAwOwotCWJ5dGVzX3Blcl9zZWNvbmQgPSAwOwotCi0Jc2V0c2NyZWVuc2l6ZSgpOwotCWlmIChjYW5fb3V0cHV0KCkpCi0JCXJlZnJlc2hfcHJvZ3Jlc3NfbWV0ZXIoKTsKLQotCXNpZ25hbChTSUdBTFJNLCB1cGRhdGVfcHJvZ3Jlc3NfbWV0ZXIpOwotCXNpZ25hbChTSUdXSU5DSCwgc2lnX3dpbmNoKTsKLQlhbGFybShVUERBVEVfSU5URVJWQUwpOwotfQotCi12b2lkCi1zdG9wX3Byb2dyZXNzX21ldGVyKHZvaWQpCi17Ci0JYWxhcm0oMCk7Ci0KLQlpZiAoIWNhbl9vdXRwdXQoKSkKLQkJcmV0dXJuOwotCi0JLyogRW5zdXJlIHdlIGNvbXBsZXRlIHRoZSBwcm9ncmVzcyAqLwotCWlmIChjdXJfcG9zICE9IGVuZF9wb3MpCi0JCXJlZnJlc2hfcHJvZ3Jlc3NfbWV0ZXIoKTsKLQotCWF0b21pY2lvKHZ3cml0ZSwgU1RET1VUX0ZJTEVOTywgIlxuIiwgMSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNpZ193aW5jaChpbnQgc2lnKQotewotCXdpbl9yZXNpemVkID0gMTsKLX0KLQotc3RhdGljIHZvaWQKLXNldHNjcmVlbnNpemUodm9pZCkKLXsKLQlzdHJ1Y3Qgd2luc2l6ZSB3aW5zaXplOwotCi0JaWYgKGlvY3RsKFNURE9VVF9GSUxFTk8sIFRJT0NHV0lOU1osICZ3aW5zaXplKSAhPSAtMSAmJgotCSAgICB3aW5zaXplLndzX2NvbCAhPSAwKSB7Ci0JCWlmICh3aW5zaXplLndzX2NvbCA+IE1BWF9XSU5TSVpFKQotCQkJd2luX3NpemUgPSBNQVhfV0lOU0laRTsKLQkJZWxzZQotCQkJd2luX3NpemUgPSB3aW5zaXplLndzX2NvbDsKLQl9IGVsc2UKLQkJd2luX3NpemUgPSBERUZBVUxUX1dJTlNJWkU7Ci0Jd2luX3NpemUgKz0gMTsJCQkJCS8qIHRyYWlsaW5nIFwwICovCi19CmRpZmYgLS1naXQgYS9wcm9ncmVzc21ldGVyLmggYi9wcm9ncmVzc21ldGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYmFiOTkuLjAwMDAwMDAKLS0tIGEvcHJvZ3Jlc3NtZXRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHByb2dyZXNzbWV0ZXIuaCx2IDEuMiAyMDA2LzAzLzI1IDIyOjIyOjQzIGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBOaWxzIE5vcmRtYW4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi12b2lkCXN0YXJ0X3Byb2dyZXNzX21ldGVyKGNoYXIgKiwgb2ZmX3QsIG9mZl90ICopOwotdm9pZAlzdG9wX3Byb2dyZXNzX21ldGVyKHZvaWQpOwpkaWZmIC0tZ2l0IGEvcmVhZGNvbmYuYyBiL3JlYWRjb25mLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZGZhNTYuLjAwMDAwMDAKLS0tIGEvcmVhZGNvbmYuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NzMgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHJlYWRjb25mLmMsdiAxLjE5MyAyMDExLzA1LzI0IDA3OjE1OjQ3IGRqbSBFeHAgJCAqLwotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIEZ1bmN0aW9ucyBmb3IgcmVhZGluZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlcy4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgotI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAic3NoLmgiCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAiY2lwaGVyLmgiCi0jaW5jbHVkZSAicGF0aG5hbWVzLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAicmVhZGNvbmYuaCIKLSNpbmNsdWRlICJtYXRjaC5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJrZXguaCIKLSNpbmNsdWRlICJtYWMuaCIKLQotLyogRm9ybWF0IG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGU6Ci0KLSAgICMgQ29uZmlndXJhdGlvbiBkYXRhIGlzIHBhcnNlZCBhcyBmb2xsb3dzOgotICAgIyAgMS4gY29tbWFuZCBsaW5lIG9wdGlvbnMKLSAgICMgIDIuIHVzZXItc3BlY2lmaWMgZmlsZQotICAgIyAgMy4gc3lzdGVtLXdpZGUgZmlsZQotICAgIyBBbnkgY29uZmlndXJhdGlvbiB2YWx1ZSBpcyBvbmx5IGNoYW5nZWQgdGhlIGZpcnN0IHRpbWUgaXQgaXMgc2V0LgotICAgIyBUaHVzLCBob3N0LXNwZWNpZmljIGRlZmluaXRpb25zIHNob3VsZCBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgIyBjb25maWd1cmF0aW9uIGZpbGUsIGFuZCBkZWZhdWx0cyBhdCB0aGUgZW5kLgotCi0gICAjIEhvc3Qtc3BlY2lmaWMgZGVjbGFyYXRpb25zLiAgVGhlc2UgbWF5IG92ZXJyaWRlIGFueXRoaW5nIGFib3ZlLiAgQSBzaW5nbGUKLSAgICMgaG9zdCBtYXkgbWF0Y2ggbXVsdGlwbGUgZGVjbGFyYXRpb25zOyB0aGVzZSBhcmUgcHJvY2Vzc2VkIGluIHRoZSBvcmRlcgotICAgIyB0aGF0IHRoZXkgYXJlIGdpdmVuIGluLgotCi0gICBIb3N0ICoubmdzLmZpIG5ncy5maQotICAgICBVc2VyIGZvbwotCi0gICBIb3N0IGZha2UuY29tCi0gICAgIEhvc3ROYW1lIGFub3RoZXIuaG9zdC5uYW1lLnJlYWwub3JnCi0gICAgIFVzZXIgYmxhYWgKLSAgICAgUG9ydCAzNDI4OQotICAgICBGb3J3YXJkWDExIG5vCi0gICAgIEZvcndhcmRBZ2VudCBubwotCi0gICBIb3N0IGJvb2tzLmNvbQotICAgICBSZW1vdGVGb3J3YXJkIDk5OTkgc2hhZG93cy5jcy5odXQuZmk6OTk5OQotICAgICBDaXBoZXIgM2RlcwotCi0gICBIb3N0IGZhc2Npc3QuYmxvYi5jb20KLSAgICAgUG9ydCAyMzEyMwotICAgICBVc2VyIHR5bG9uZW4KLSAgICAgUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBubwotCi0gICBIb3N0IHB1dWtrby5odXQuZmkKLSAgICAgVXNlciB0MzUxMjRwCi0gICAgIFByb3h5Q29tbWFuZCBzc2gtcHJveHkgJWggJXAKLQotICAgSG9zdCAqLmZyCi0gICAgIFB1YmxpY0tleUF1dGhlbnRpY2F0aW9uIG5vCi0KLSAgIEhvc3QgKi5zdQotICAgICBDaXBoZXIgbm9uZQotICAgICBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIG5vCi0KLSAgIEhvc3QgdnBuLmZha2UuY29tCi0gICAgIFR1bm5lbCB5ZXMKLSAgICAgVHVubmVsRGV2aWNlIDMKLQotICAgIyBEZWZhdWx0cyBmb3IgdmFyaW91cyBvcHRpb25zCi0gICBIb3N0ICoKLSAgICAgRm9yd2FyZEFnZW50IG5vCi0gICAgIEZvcndhcmRYMTEgbm8KLSAgICAgUGFzc3dvcmRBdXRoZW50aWNhdGlvbiB5ZXMKLSAgICAgUlNBQXV0aGVudGljYXRpb24geWVzCi0gICAgIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uIHllcwotICAgICBTdHJpY3RIb3N0S2V5Q2hlY2tpbmcgeWVzCi0gICAgIFRjcEtlZXBBbGl2ZSBubwotICAgICBJZGVudGl0eUZpbGUgfi8uc3NoL2lkZW50aXR5Ci0gICAgIFBvcnQgMjIKLSAgICAgRXNjYXBlQ2hhciB+Ci0KLSovCi0KLS8qIEtleXdvcmQgdG9rZW5zLiAqLwotCi10eXBlZGVmIGVudW0gewotCW9CYWRPcHRpb24sCi0Jb0ZvcndhcmRBZ2VudCwgb0ZvcndhcmRYMTEsIG9Gb3J3YXJkWDExVHJ1c3RlZCwgb0ZvcndhcmRYMTFUaW1lb3V0LAotCW9HYXRld2F5UG9ydHMsIG9FeGl0T25Gb3J3YXJkRmFpbHVyZSwKLQlvUGFzc3dvcmRBdXRoZW50aWNhdGlvbiwgb1JTQUF1dGhlbnRpY2F0aW9uLAotCW9DaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uLCBvWEF1dGhMb2NhdGlvbiwKLQlvSWRlbnRpdHlGaWxlLCBvSG9zdE5hbWUsIG9Qb3J0LCBvQ2lwaGVyLCBvUmVtb3RlRm9yd2FyZCwgb0xvY2FsRm9yd2FyZCwKLQlvVXNlciwgb0hvc3QsIG9Fc2NhcGVDaGFyLCBvUmhvc3RzUlNBQXV0aGVudGljYXRpb24sIG9Qcm94eUNvbW1hbmQsCi0Jb0dsb2JhbEtub3duSG9zdHNGaWxlLCBvVXNlcktub3duSG9zdHNGaWxlLCBvQ29ubmVjdGlvbkF0dGVtcHRzLAotCW9CYXRjaE1vZGUsIG9DaGVja0hvc3RJUCwgb1N0cmljdEhvc3RLZXlDaGVja2luZywgb0NvbXByZXNzaW9uLAotCW9Db21wcmVzc2lvbkxldmVsLCBvVENQS2VlcEFsaXZlLCBvTnVtYmVyT2ZQYXNzd29yZFByb21wdHMsCi0Jb1VzZVByaXZpbGVnZWRQb3J0LCBvTG9nTGV2ZWwsIG9DaXBoZXJzLCBvUHJvdG9jb2wsIG9NYWNzLAotCW9HbG9iYWxLbm93bkhvc3RzRmlsZTIsIG9Vc2VyS25vd25Ib3N0c0ZpbGUyLCBvUHVia2V5QXV0aGVudGljYXRpb24sCi0Jb0tiZEludGVyYWN0aXZlQXV0aGVudGljYXRpb24sIG9LYmRJbnRlcmFjdGl2ZURldmljZXMsIG9Ib3N0S2V5QWxpYXMsCi0Jb0R5bmFtaWNGb3J3YXJkLCBvUHJlZmVycmVkQXV0aGVudGljYXRpb25zLCBvSG9zdGJhc2VkQXV0aGVudGljYXRpb24sCi0Jb0hvc3RLZXlBbGdvcml0aG1zLCBvQmluZEFkZHJlc3MsIG9QS0NTMTFQcm92aWRlciwKLQlvQ2xlYXJBbGxGb3J3YXJkaW5ncywgb05vSG9zdEF1dGhlbnRpY2F0aW9uRm9yTG9jYWxob3N0LAotCW9FbmFibGVTU0hLZXlzaWduLCBvUmVrZXlMaW1pdCwgb1ZlcmlmeUhvc3RLZXlETlMsIG9Db25uZWN0VGltZW91dCwKLQlvQWRkcmVzc0ZhbWlseSwgb0dzc0F1dGhlbnRpY2F0aW9uLCBvR3NzRGVsZWdhdGVDcmVkcywKLQlvU2VydmVyQWxpdmVJbnRlcnZhbCwgb1NlcnZlckFsaXZlQ291bnRNYXgsIG9JZGVudGl0aWVzT25seSwKLQlvU2VuZEVudiwgb0NvbnRyb2xQYXRoLCBvQ29udHJvbE1hc3Rlciwgb0NvbnRyb2xQZXJzaXN0LAotCW9IYXNoS25vd25Ib3N0cywKLQlvVHVubmVsLCBvVHVubmVsRGV2aWNlLCBvTG9jYWxDb21tYW5kLCBvUGVybWl0TG9jYWxDb21tYW5kLAotCW9WaXN1YWxIb3N0S2V5LCBvVXNlUm9hbWluZywgb1plcm9Lbm93bGVkZ2VQYXNzd29yZEF1dGhlbnRpY2F0aW9uLAotCW9LZXhBbGdvcml0aG1zLCBvSVBRb1MsIG9SZXF1ZXN0VFRZLAotCW9EZXByZWNhdGVkLCBvVW5zdXBwb3J0ZWQKLX0gT3BDb2RlczsKLQotLyogVGV4dHVhbCByZXByZXNlbnRhdGlvbnMgb2YgdGhlIHRva2Vucy4gKi8KLQotc3RhdGljIHN0cnVjdCB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlPcENvZGVzIG9wY29kZTsKLX0ga2V5d29yZHNbXSA9IHsKLQl7ICJmb3J3YXJkYWdlbnQiLCBvRm9yd2FyZEFnZW50IH0sCi0JeyAiZm9yd2FyZHgxMSIsIG9Gb3J3YXJkWDExIH0sCi0JeyAiZm9yd2FyZHgxMXRydXN0ZWQiLCBvRm9yd2FyZFgxMVRydXN0ZWQgfSwKLQl7ICJmb3J3YXJkeDExdGltZW91dCIsIG9Gb3J3YXJkWDExVGltZW91dCB9LAotCXsgImV4aXRvbmZvcndhcmRmYWlsdXJlIiwgb0V4aXRPbkZvcndhcmRGYWlsdXJlIH0sCi0JeyAieGF1dGhsb2NhdGlvbiIsIG9YQXV0aExvY2F0aW9uIH0sCi0JeyAiZ2F0ZXdheXBvcnRzIiwgb0dhdGV3YXlQb3J0cyB9LAotCXsgInVzZXByaXZpbGVnZWRwb3J0Iiwgb1VzZVByaXZpbGVnZWRQb3J0IH0sCi0JeyAicmhvc3RzYXV0aGVudGljYXRpb24iLCBvRGVwcmVjYXRlZCB9LAotCXsgInBhc3N3b3JkYXV0aGVudGljYXRpb24iLCBvUGFzc3dvcmRBdXRoZW50aWNhdGlvbiB9LAotCXsgImtiZGludGVyYWN0aXZlYXV0aGVudGljYXRpb24iLCBvS2JkSW50ZXJhY3RpdmVBdXRoZW50aWNhdGlvbiB9LAotCXsgImtiZGludGVyYWN0aXZlZGV2aWNlcyIsIG9LYmRJbnRlcmFjdGl2ZURldmljZXMgfSwKLQl7ICJyc2FhdXRoZW50aWNhdGlvbiIsIG9SU0FBdXRoZW50aWNhdGlvbiB9LAotCXsgInB1YmtleWF1dGhlbnRpY2F0aW9uIiwgb1B1YmtleUF1dGhlbnRpY2F0aW9uIH0sCi0JeyAiZHNhYXV0aGVudGljYXRpb24iLCBvUHVia2V5QXV0aGVudGljYXRpb24gfSwJCSAgICAvKiBhbGlhcyAqLwotCXsgInJob3N0c3JzYWF1dGhlbnRpY2F0aW9uIiwgb1Job3N0c1JTQUF1dGhlbnRpY2F0aW9uIH0sCi0JeyAiaG9zdGJhc2VkYXV0aGVudGljYXRpb24iLCBvSG9zdGJhc2VkQXV0aGVudGljYXRpb24gfSwKLQl7ICJjaGFsbGVuZ2VyZXNwb25zZWF1dGhlbnRpY2F0aW9uIiwgb0NoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gfSwKLQl7ICJza2V5YXV0aGVudGljYXRpb24iLCBvQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiB9LCAvKiBhbGlhcyAqLwotCXsgInRpc2F1dGhlbnRpY2F0aW9uIiwgb0NoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gfSwgIC8qIGFsaWFzICovCi0JeyAia2VyYmVyb3NhdXRoZW50aWNhdGlvbiIsIG9VbnN1cHBvcnRlZCB9LAotCXsgImtlcmJlcm9zdGd0cGFzc2luZyIsIG9VbnN1cHBvcnRlZCB9LAotCXsgImFmc3Rva2VucGFzc2luZyIsIG9VbnN1cHBvcnRlZCB9LAotI2lmIGRlZmluZWQoR1NTQVBJKQotCXsgImdzc2FwaWF1dGhlbnRpY2F0aW9uIiwgb0dzc0F1dGhlbnRpY2F0aW9uIH0sCi0JeyAiZ3NzYXBpZGVsZWdhdGVjcmVkZW50aWFscyIsIG9Hc3NEZWxlZ2F0ZUNyZWRzIH0sCi0jZWxzZQotCXsgImdzc2FwaWF1dGhlbnRpY2F0aW9uIiwgb1Vuc3VwcG9ydGVkIH0sCi0JeyAiZ3NzYXBpZGVsZWdhdGVjcmVkZW50aWFscyIsIG9VbnN1cHBvcnRlZCB9LAotI2VuZGlmCi0JeyAiZmFsbGJhY2t0b3JzaCIsIG9EZXByZWNhdGVkIH0sCi0JeyAidXNlcnNoIiwgb0RlcHJlY2F0ZWQgfSwKLQl7ICJpZGVudGl0eWZpbGUiLCBvSWRlbnRpdHlGaWxlIH0sCi0JeyAiaWRlbnRpdHlmaWxlMiIsIG9JZGVudGl0eUZpbGUgfSwJCQkvKiBvYnNvbGV0ZSAqLwotCXsgImlkZW50aXRpZXNvbmx5Iiwgb0lkZW50aXRpZXNPbmx5IH0sCi0JeyAiaG9zdG5hbWUiLCBvSG9zdE5hbWUgfSwKLQl7ICJob3N0a2V5YWxpYXMiLCBvSG9zdEtleUFsaWFzIH0sCi0JeyAicHJveHljb21tYW5kIiwgb1Byb3h5Q29tbWFuZCB9LAotCXsgInBvcnQiLCBvUG9ydCB9LAotCXsgImNpcGhlciIsIG9DaXBoZXIgfSwKLQl7ICJjaXBoZXJzIiwgb0NpcGhlcnMgfSwKLQl7ICJtYWNzIiwgb01hY3MgfSwKLQl7ICJwcm90b2NvbCIsIG9Qcm90b2NvbCB9LAotCXsgInJlbW90ZWZvcndhcmQiLCBvUmVtb3RlRm9yd2FyZCB9LAotCXsgImxvY2FsZm9yd2FyZCIsIG9Mb2NhbEZvcndhcmQgfSwKLQl7ICJ1c2VyIiwgb1VzZXIgfSwKLQl7ICJob3N0Iiwgb0hvc3QgfSwKLQl7ICJlc2NhcGVjaGFyIiwgb0VzY2FwZUNoYXIgfSwKLQl7ICJnbG9iYWxrbm93bmhvc3RzZmlsZSIsIG9HbG9iYWxLbm93bkhvc3RzRmlsZSB9LAotCXsgImdsb2JhbGtub3duaG9zdHNmaWxlMiIsIG9EZXByZWNhdGVkIH0sCi0JeyAidXNlcmtub3duaG9zdHNmaWxlIiwgb1VzZXJLbm93bkhvc3RzRmlsZSB9LAotCXsgInVzZXJrbm93bmhvc3RzZmlsZTIiLCBvRGVwcmVjYXRlZCB9LCAKLQl7ICJjb25uZWN0aW9uYXR0ZW1wdHMiLCBvQ29ubmVjdGlvbkF0dGVtcHRzIH0sCi0JeyAiYmF0Y2htb2RlIiwgb0JhdGNoTW9kZSB9LAotCXsgImNoZWNraG9zdGlwIiwgb0NoZWNrSG9zdElQIH0sCi0JeyAic3RyaWN0aG9zdGtleWNoZWNraW5nIiwgb1N0cmljdEhvc3RLZXlDaGVja2luZyB9LAotCXsgImNvbXByZXNzaW9uIiwgb0NvbXByZXNzaW9uIH0sCi0JeyAiY29tcHJlc3Npb25sZXZlbCIsIG9Db21wcmVzc2lvbkxldmVsIH0sCi0JeyAidGNwa2VlcGFsaXZlIiwgb1RDUEtlZXBBbGl2ZSB9LAotCXsgImtlZXBhbGl2ZSIsIG9UQ1BLZWVwQWxpdmUgfSwJCQkJLyogb2Jzb2xldGUgKi8KLQl7ICJudW1iZXJvZnBhc3N3b3JkcHJvbXB0cyIsIG9OdW1iZXJPZlBhc3N3b3JkUHJvbXB0cyB9LAotCXsgImxvZ2xldmVsIiwgb0xvZ0xldmVsIH0sCi0JeyAiZHluYW1pY2ZvcndhcmQiLCBvRHluYW1pY0ZvcndhcmQgfSwKLQl7ICJwcmVmZXJyZWRhdXRoZW50aWNhdGlvbnMiLCBvUHJlZmVycmVkQXV0aGVudGljYXRpb25zIH0sCi0JeyAiaG9zdGtleWFsZ29yaXRobXMiLCBvSG9zdEtleUFsZ29yaXRobXMgfSwKLQl7ICJiaW5kYWRkcmVzcyIsIG9CaW5kQWRkcmVzcyB9LAotI2lmZGVmIEVOQUJMRV9QS0NTMTEKLQl7ICJzbWFydGNhcmRkZXZpY2UiLCBvUEtDUzExUHJvdmlkZXIgfSwKLQl7ICJwa2NzMTFwcm92aWRlciIsIG9QS0NTMTFQcm92aWRlciB9LAotI2Vsc2UKLQl7ICJzbWFydGNhcmRkZXZpY2UiLCBvVW5zdXBwb3J0ZWQgfSwKLQl7ICJwa2NzMTFwcm92aWRlciIsIG9VbnN1cHBvcnRlZCB9LAotI2VuZGlmCi0JeyAiY2xlYXJhbGxmb3J3YXJkaW5ncyIsIG9DbGVhckFsbEZvcndhcmRpbmdzIH0sCi0JeyAiZW5hYmxlc3Noa2V5c2lnbiIsIG9FbmFibGVTU0hLZXlzaWduIH0sCi0JeyAidmVyaWZ5aG9zdGtleWRucyIsIG9WZXJpZnlIb3N0S2V5RE5TIH0sCi0JeyAibm9ob3N0YXV0aGVudGljYXRpb25mb3Jsb2NhbGhvc3QiLCBvTm9Ib3N0QXV0aGVudGljYXRpb25Gb3JMb2NhbGhvc3QgfSwKLQl7ICJyZWtleWxpbWl0Iiwgb1Jla2V5TGltaXQgfSwKLQl7ICJjb25uZWN0dGltZW91dCIsIG9Db25uZWN0VGltZW91dCB9LAotCXsgImFkZHJlc3NmYW1pbHkiLCBvQWRkcmVzc0ZhbWlseSB9LAotCXsgInNlcnZlcmFsaXZlaW50ZXJ2YWwiLCBvU2VydmVyQWxpdmVJbnRlcnZhbCB9LAotCXsgInNlcnZlcmFsaXZlY291bnRtYXgiLCBvU2VydmVyQWxpdmVDb3VudE1heCB9LAotCXsgInNlbmRlbnYiLCBvU2VuZEVudiB9LAotCXsgImNvbnRyb2xwYXRoIiwgb0NvbnRyb2xQYXRoIH0sCi0JeyAiY29udHJvbG1hc3RlciIsIG9Db250cm9sTWFzdGVyIH0sCi0JeyAiY29udHJvbHBlcnNpc3QiLCBvQ29udHJvbFBlcnNpc3QgfSwKLQl7ICJoYXNoa25vd25ob3N0cyIsIG9IYXNoS25vd25Ib3N0cyB9LAotCXsgInR1bm5lbCIsIG9UdW5uZWwgfSwKLQl7ICJ0dW5uZWxkZXZpY2UiLCBvVHVubmVsRGV2aWNlIH0sCi0JeyAibG9jYWxjb21tYW5kIiwgb0xvY2FsQ29tbWFuZCB9LAotCXsgInBlcm1pdGxvY2FsY29tbWFuZCIsIG9QZXJtaXRMb2NhbENvbW1hbmQgfSwKLQl7ICJ2aXN1YWxob3N0a2V5Iiwgb1Zpc3VhbEhvc3RLZXkgfSwKLQl7ICJ1c2Vyb2FtaW5nIiwgb1VzZVJvYW1pbmcgfSwKLSNpZmRlZiBKUEFLRQotCXsgInplcm9rbm93bGVkZ2VwYXNzd29yZGF1dGhlbnRpY2F0aW9uIiwKLQkgICAgb1plcm9Lbm93bGVkZ2VQYXNzd29yZEF1dGhlbnRpY2F0aW9uIH0sCi0jZWxzZQotCXsgInplcm9rbm93bGVkZ2VwYXNzd29yZGF1dGhlbnRpY2F0aW9uIiwgb1Vuc3VwcG9ydGVkIH0sCi0jZW5kaWYKLQl7ICJrZXhhbGdvcml0aG1zIiwgb0tleEFsZ29yaXRobXMgfSwKLQl7ICJpcHFvcyIsIG9JUFFvUyB9LAotCXsgInJlcXVlc3R0dHkiLCBvUmVxdWVzdFRUWSB9LAotCi0JeyBOVUxMLCBvQmFkT3B0aW9uIH0KLX07Ci0KLS8qCi0gKiBBZGRzIGEgbG9jYWwgVENQL0lQIHBvcnQgZm9yd2FyZCB0byBvcHRpb25zLiAgTmV2ZXIgcmV0dXJucyBpZiB0aGVyZSBpcyBhbgotICogZXJyb3IuCi0gKi8KLQotdm9pZAotYWRkX2xvY2FsX2ZvcndhcmQoT3B0aW9ucyAqb3B0aW9ucywgY29uc3QgRm9yd2FyZCAqbmV3ZndkKQotewotCUZvcndhcmQgKmZ3ZDsKLSNpZm5kZWYgTk9fSVBQT1JUX1JFU0VSVkVEX0NPTkNFUFQKLQlleHRlcm4gdWlkX3Qgb3JpZ2luYWxfcmVhbF91aWQ7Ci0JaWYgKG5ld2Z3ZC0+bGlzdGVuX3BvcnQgPCBJUFBPUlRfUkVTRVJWRUQgJiYgb3JpZ2luYWxfcmVhbF91aWQgIT0gMCkKLQkJZmF0YWwoIlByaXZpbGVnZWQgcG9ydHMgY2FuIG9ubHkgYmUgZm9yd2FyZGVkIGJ5IHJvb3QuIik7Ci0jZW5kaWYKLQlvcHRpb25zLT5sb2NhbF9mb3J3YXJkcyA9IHhyZWFsbG9jKG9wdGlvbnMtPmxvY2FsX2ZvcndhcmRzLAotCSAgICBvcHRpb25zLT5udW1fbG9jYWxfZm9yd2FyZHMgKyAxLAotCSAgICBzaXplb2YoKm9wdGlvbnMtPmxvY2FsX2ZvcndhcmRzKSk7Ci0JZndkID0gJm9wdGlvbnMtPmxvY2FsX2ZvcndhcmRzW29wdGlvbnMtPm51bV9sb2NhbF9mb3J3YXJkcysrXTsKLQotCWZ3ZC0+bGlzdGVuX2hvc3QgPSBuZXdmd2QtPmxpc3Rlbl9ob3N0OwotCWZ3ZC0+bGlzdGVuX3BvcnQgPSBuZXdmd2QtPmxpc3Rlbl9wb3J0OwotCWZ3ZC0+Y29ubmVjdF9ob3N0ID0gbmV3ZndkLT5jb25uZWN0X2hvc3Q7Ci0JZndkLT5jb25uZWN0X3BvcnQgPSBuZXdmd2QtPmNvbm5lY3RfcG9ydDsKLX0KLQotLyoKLSAqIEFkZHMgYSByZW1vdGUgVENQL0lQIHBvcnQgZm9yd2FyZCB0byBvcHRpb25zLiAgTmV2ZXIgcmV0dXJucyBpZiB0aGVyZSBpcwotICogYW4gZXJyb3IuCi0gKi8KLQotdm9pZAotYWRkX3JlbW90ZV9mb3J3YXJkKE9wdGlvbnMgKm9wdGlvbnMsIGNvbnN0IEZvcndhcmQgKm5ld2Z3ZCkKLXsKLQlGb3J3YXJkICpmd2Q7Ci0KLQlvcHRpb25zLT5yZW1vdGVfZm9yd2FyZHMgPSB4cmVhbGxvYyhvcHRpb25zLT5yZW1vdGVfZm9yd2FyZHMsCi0JICAgIG9wdGlvbnMtPm51bV9yZW1vdGVfZm9yd2FyZHMgKyAxLAotCSAgICBzaXplb2YoKm9wdGlvbnMtPnJlbW90ZV9mb3J3YXJkcykpOwotCWZ3ZCA9ICZvcHRpb25zLT5yZW1vdGVfZm9yd2FyZHNbb3B0aW9ucy0+bnVtX3JlbW90ZV9mb3J3YXJkcysrXTsKLQotCWZ3ZC0+bGlzdGVuX2hvc3QgPSBuZXdmd2QtPmxpc3Rlbl9ob3N0OwotCWZ3ZC0+bGlzdGVuX3BvcnQgPSBuZXdmd2QtPmxpc3Rlbl9wb3J0OwotCWZ3ZC0+Y29ubmVjdF9ob3N0ID0gbmV3ZndkLT5jb25uZWN0X2hvc3Q7Ci0JZndkLT5jb25uZWN0X3BvcnQgPSBuZXdmd2QtPmNvbm5lY3RfcG9ydDsKLQlmd2QtPmFsbG9jYXRlZF9wb3J0ID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLWNsZWFyX2ZvcndhcmRpbmdzKE9wdGlvbnMgKm9wdGlvbnMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy0+bnVtX2xvY2FsX2ZvcndhcmRzOyBpKyspIHsKLQkJaWYgKG9wdGlvbnMtPmxvY2FsX2ZvcndhcmRzW2ldLmxpc3Rlbl9ob3N0ICE9IE5VTEwpCi0JCQl4ZnJlZShvcHRpb25zLT5sb2NhbF9mb3J3YXJkc1tpXS5saXN0ZW5faG9zdCk7Ci0JCXhmcmVlKG9wdGlvbnMtPmxvY2FsX2ZvcndhcmRzW2ldLmNvbm5lY3RfaG9zdCk7Ci0JfQotCWlmIChvcHRpb25zLT5udW1fbG9jYWxfZm9yd2FyZHMgPiAwKSB7Ci0JCXhmcmVlKG9wdGlvbnMtPmxvY2FsX2ZvcndhcmRzKTsKLQkJb3B0aW9ucy0+bG9jYWxfZm9yd2FyZHMgPSBOVUxMOwotCX0KLQlvcHRpb25zLT5udW1fbG9jYWxfZm9yd2FyZHMgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLT5udW1fcmVtb3RlX2ZvcndhcmRzOyBpKyspIHsKLQkJaWYgKG9wdGlvbnMtPnJlbW90ZV9mb3J3YXJkc1tpXS5saXN0ZW5faG9zdCAhPSBOVUxMKQotCQkJeGZyZWUob3B0aW9ucy0+cmVtb3RlX2ZvcndhcmRzW2ldLmxpc3Rlbl9ob3N0KTsKLQkJeGZyZWUob3B0aW9ucy0+cmVtb3RlX2ZvcndhcmRzW2ldLmNvbm5lY3RfaG9zdCk7Ci0JfQotCWlmIChvcHRpb25zLT5udW1fcmVtb3RlX2ZvcndhcmRzID4gMCkgewotCQl4ZnJlZShvcHRpb25zLT5yZW1vdGVfZm9yd2FyZHMpOwotCQlvcHRpb25zLT5yZW1vdGVfZm9yd2FyZHMgPSBOVUxMOwotCX0KLQlvcHRpb25zLT5udW1fcmVtb3RlX2ZvcndhcmRzID0gMDsKLQlvcHRpb25zLT50dW5fb3BlbiA9IFNTSF9UVU5NT0RFX05POwotfQotCi0vKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSB0b2tlbiBwb2ludGVkIHRvIGJ5IGNwIG9yIG9CYWRPcHRpb24uCi0gKi8KLQotc3RhdGljIE9wQ29kZXMKLXBhcnNlX3Rva2VuKGNvbnN0IGNoYXIgKmNwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVudW0pCi17Ci0JdV9pbnQgaTsKLQotCWZvciAoaSA9IDA7IGtleXdvcmRzW2ldLm5hbWU7IGkrKykKLQkJaWYgKHN0cmNhc2VjbXAoY3AsIGtleXdvcmRzW2ldLm5hbWUpID09IDApCi0JCQlyZXR1cm4ga2V5d29yZHNbaV0ub3Bjb2RlOwotCi0JZXJyb3IoIiVzOiBsaW5lICVkOiBCYWQgY29uZmlndXJhdGlvbiBvcHRpb246ICVzIiwKLQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGNwKTsKLQlyZXR1cm4gb0JhZE9wdGlvbjsKLX0KLQotLyoKLSAqIFByb2Nlc3NlcyBhIHNpbmdsZSBvcHRpb24gbGluZSBhcyB1c2VkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzLiBUaGlzCi0gKiBvbmx5IHNldHMgdGhvc2UgdmFsdWVzIHRoYXQgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHNldC4KLSAqLwotI2RlZmluZSBXSElURVNQQUNFICIgXHRcclxuIgotCi1pbnQKLXByb2Nlc3NfY29uZmlnX2xpbmUoT3B0aW9ucyAqb3B0aW9ucywgY29uc3QgY2hhciAqaG9zdCwKLQkJICAgIGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW51bSwKLQkJICAgIGludCAqYWN0aXZlcCkKLXsKLQljaGFyICpzLCAqKmNoYXJwdHIsICplbmRvZm51bWJlciwgKmtleXdvcmQsICphcmcsICphcmcyOwotCWNoYXIgKipjcHB0ciwgZndkYXJnWzI1Nl07Ci0JdV9pbnQgKnVpbnRwdHIsIG1heF9lbnRyaWVzID0gMDsKLQlpbnQgbmVnYXRlZCwgb3Bjb2RlLCAqaW50cHRyLCB2YWx1ZSwgdmFsdWUyLCBzY2FsZTsKLQlMb2dMZXZlbCAqbG9nX2xldmVsX3B0cjsKLQlsb25nIGxvbmcgb3JpZywgdmFsNjQ7Ci0Jc2l6ZV90IGxlbjsKLQlGb3J3YXJkIGZ3ZDsKLQotCS8qIFN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KLQlmb3IgKGxlbiA9IHN0cmxlbihsaW5lKSAtIDE7IGxlbiA+IDA7IGxlbi0tKSB7Ci0JCWlmIChzdHJjaHIoV0hJVEVTUEFDRSwgbGluZVtsZW5dKSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCWxpbmVbbGVuXSA9ICdcMCc7Ci0JfQotCi0JcyA9IGxpbmU7Ci0JLyogR2V0IHRoZSBrZXl3b3JkLiAoRWFjaCBsaW5lIGlzIHN1cHBvc2VkIHRvIGJlZ2luIHdpdGggYSBrZXl3b3JkKS4gKi8KLQlpZiAoKGtleXdvcmQgPSBzdHJkZWxpbSgmcykpID09IE5VTEwpCi0JCXJldHVybiAwOwotCS8qIElnbm9yZSBsZWFkaW5nIHdoaXRlc3BhY2UuICovCi0JaWYgKCprZXl3b3JkID09ICdcMCcpCi0JCWtleXdvcmQgPSBzdHJkZWxpbSgmcyk7Ci0JaWYgKGtleXdvcmQgPT0gTlVMTCB8fCAhKmtleXdvcmQgfHwgKmtleXdvcmQgPT0gJ1xuJyB8fCAqa2V5d29yZCA9PSAnIycpCi0JCXJldHVybiAwOwotCi0Jb3Bjb2RlID0gcGFyc2VfdG9rZW4oa2V5d29yZCwgZmlsZW5hbWUsIGxpbmVudW0pOwotCi0Jc3dpdGNoIChvcGNvZGUpIHsKLQljYXNlIG9CYWRPcHRpb246Ci0JCS8qIGRvbid0IHBhbmljLCBidXQgY291bnQgYmFkIG9wdGlvbnMgKi8KLQkJcmV0dXJuIC0xOwotCQkvKiBOT1RSRUFDSEVEICovCi0JY2FzZSBvQ29ubmVjdFRpbWVvdXQ6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5jb25uZWN0aW9uX3RpbWVvdXQ7Ci1wYXJzZV90aW1lOgotCQlhcmcgPSBzdHJkZWxpbSgmcyk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBtaXNzaW5nIHRpbWUgdmFsdWUuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWlmICgodmFsdWUgPSBjb252dGltZShhcmcpKSA9PSAtMSkKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBpbnZhbGlkIHRpbWUgdmFsdWUuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWlmICgqYWN0aXZlcCAmJiAqaW50cHRyID09IC0xKQotCQkJKmludHB0ciA9IHZhbHVlOwotCQlicmVhazsKLQotCWNhc2Ugb0ZvcndhcmRBZ2VudDoKLQkJaW50cHRyID0gJm9wdGlvbnMtPmZvcndhcmRfYWdlbnQ7Ci1wYXJzZV9mbGFnOgotCQlhcmcgPSBzdHJkZWxpbSgmcyk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogTWlzc2luZyB5ZXMvbm8gYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOwotCQl2YWx1ZSA9IDA7CS8qIFRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuLi4gKi8KLQkJaWYgKHN0cmNtcChhcmcsICJ5ZXMiKSA9PSAwIHx8IHN0cmNtcChhcmcsICJ0cnVlIikgPT0gMCkKLQkJCXZhbHVlID0gMTsKLQkJZWxzZSBpZiAoc3RyY21wKGFyZywgIm5vIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiZmFsc2UiKSA9PSAwKQotCQkJdmFsdWUgPSAwOwotCQllbHNlCi0JCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IEJhZCB5ZXMvbm8gYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOwotCQlpZiAoKmFjdGl2ZXAgJiYgKmludHB0ciA9PSAtMSkKLQkJCSppbnRwdHIgPSB2YWx1ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIG9Gb3J3YXJkWDExOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+Zm9yd2FyZF94MTE7Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugb0ZvcndhcmRYMTFUcnVzdGVkOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+Zm9yd2FyZF94MTFfdHJ1c3RlZDsKLQkJZ290byBwYXJzZV9mbGFnOwotCQotCWNhc2Ugb0ZvcndhcmRYMTFUaW1lb3V0OgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+Zm9yd2FyZF94MTFfdGltZW91dDsKLQkJZ290byBwYXJzZV90aW1lOwotCi0JY2FzZSBvR2F0ZXdheVBvcnRzOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+Z2F0ZXdheV9wb3J0czsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBvRXhpdE9uRm9yd2FyZEZhaWx1cmU6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5leGl0X29uX2ZvcndhcmRfZmFpbHVyZTsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBvVXNlUHJpdmlsZWdlZFBvcnQ6Ci0JCWludHB0ciA9ICZvcHRpb25zLT51c2VfcHJpdmlsZWdlZF9wb3J0OwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIG9QYXNzd29yZEF1dGhlbnRpY2F0aW9uOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+cGFzc3dvcmRfYXV0aGVudGljYXRpb247Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugb1plcm9Lbm93bGVkZ2VQYXNzd29yZEF1dGhlbnRpY2F0aW9uOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+emVyb19rbm93bGVkZ2VfcGFzc3dvcmRfYXV0aGVudGljYXRpb247Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugb0tiZEludGVyYWN0aXZlQXV0aGVudGljYXRpb246Ci0JCWludHB0ciA9ICZvcHRpb25zLT5rYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb247Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugb0tiZEludGVyYWN0aXZlRGV2aWNlczoKLQkJY2hhcnB0ciA9ICZvcHRpb25zLT5rYmRfaW50ZXJhY3RpdmVfZGV2aWNlczsKLQkJZ290byBwYXJzZV9zdHJpbmc7Ci0KLQljYXNlIG9QdWJrZXlBdXRoZW50aWNhdGlvbjoKLQkJaW50cHRyID0gJm9wdGlvbnMtPnB1YmtleV9hdXRoZW50aWNhdGlvbjsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBvUlNBQXV0aGVudGljYXRpb246Ci0JCWludHB0ciA9ICZvcHRpb25zLT5yc2FfYXV0aGVudGljYXRpb247Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugb1Job3N0c1JTQUF1dGhlbnRpY2F0aW9uOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+cmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbjsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBvSG9zdGJhc2VkQXV0aGVudGljYXRpb246Ci0JCWludHB0ciA9ICZvcHRpb25zLT5ob3N0YmFzZWRfYXV0aGVudGljYXRpb247Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugb0NoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb246Ci0JCWludHB0ciA9ICZvcHRpb25zLT5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb247Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugb0dzc0F1dGhlbnRpY2F0aW9uOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+Z3NzX2F1dGhlbnRpY2F0aW9uOwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIG9Hc3NEZWxlZ2F0ZUNyZWRzOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+Z3NzX2RlbGVnX2NyZWRzOwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIG9CYXRjaE1vZGU6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5iYXRjaF9tb2RlOwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIG9DaGVja0hvc3RJUDoKLQkJaW50cHRyID0gJm9wdGlvbnMtPmNoZWNrX2hvc3RfaXA7Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugb1ZlcmlmeUhvc3RLZXlETlM6Ci0JCWludHB0ciA9ICZvcHRpb25zLT52ZXJpZnlfaG9zdF9rZXlfZG5zOwotCQlnb3RvIHBhcnNlX3llc25vYXNrOwotCi0JY2FzZSBvU3RyaWN0SG9zdEtleUNoZWNraW5nOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+c3RyaWN0X2hvc3Rfa2V5X2NoZWNraW5nOwotcGFyc2VfeWVzbm9hc2s6Ci0JCWFyZyA9IHN0cmRlbGltKCZzKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIHllcy9uby9hc2sgYXJndW1lbnQuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCXZhbHVlID0gMDsJLyogVG8gYXZvaWQgY29tcGlsZXIgd2FybmluZy4uLiAqLwotCQlpZiAoc3RyY21wKGFyZywgInllcyIpID09IDAgfHwgc3RyY21wKGFyZywgInRydWUiKSA9PSAwKQotCQkJdmFsdWUgPSAxOwotCQllbHNlIGlmIChzdHJjbXAoYXJnLCAibm8iKSA9PSAwIHx8IHN0cmNtcChhcmcsICJmYWxzZSIpID09IDApCi0JCQl2YWx1ZSA9IDA7Ci0JCWVsc2UgaWYgKHN0cmNtcChhcmcsICJhc2siKSA9PSAwKQotCQkJdmFsdWUgPSAyOwotCQllbHNlCi0JCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IEJhZCB5ZXMvbm8vYXNrIGFyZ3VtZW50LiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJaWYgKCphY3RpdmVwICYmICppbnRwdHIgPT0gLTEpCi0JCQkqaW50cHRyID0gdmFsdWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBvQ29tcHJlc3Npb246Ci0JCWludHB0ciA9ICZvcHRpb25zLT5jb21wcmVzc2lvbjsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBvVENQS2VlcEFsaXZlOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+dGNwX2tlZXBfYWxpdmU7Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugb05vSG9zdEF1dGhlbnRpY2F0aW9uRm9yTG9jYWxob3N0OgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+bm9faG9zdF9hdXRoZW50aWNhdGlvbl9mb3JfbG9jYWxob3N0OwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIG9OdW1iZXJPZlBhc3N3b3JkUHJvbXB0czoKLQkJaW50cHRyID0gJm9wdGlvbnMtPm51bWJlcl9vZl9wYXNzd29yZF9wcm9tcHRzOwotCQlnb3RvIHBhcnNlX2ludDsKLQotCWNhc2Ugb0NvbXByZXNzaW9uTGV2ZWw6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5jb21wcmVzc2lvbl9sZXZlbDsKLQkJZ290byBwYXJzZV9pbnQ7Ci0KLQljYXNlIG9SZWtleUxpbWl0OgotCQlhcmcgPSBzdHJkZWxpbSgmcyk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogTWlzc2luZyBhcmd1bWVudC4iLCBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWlmIChhcmdbMF0gPCAnMCcgfHwgYXJnWzBdID4gJzknKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgbnVtYmVyLiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJb3JpZyA9IHZhbDY0ID0gc3RydG9sbChhcmcsICZlbmRvZm51bWJlciwgMTApOwotCQlpZiAoYXJnID09IGVuZG9mbnVtYmVyKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgbnVtYmVyLiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJc3dpdGNoICh0b3VwcGVyKCplbmRvZm51bWJlcikpIHsKLQkJY2FzZSAnXDAnOgotCQkJc2NhbGUgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ0snOgotCQkJc2NhbGUgPSAxPDwxMDsKLQkJCWJyZWFrOwotCQljYXNlICdNJzoKLQkJCXNjYWxlID0gMTw8MjA7Ci0JCQlicmVhazsKLQkJY2FzZSAnRyc6Ci0JCQlzY2FsZSA9IDE8PDMwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IEludmFsaWQgUmVrZXlMaW1pdCBzdWZmaXgiLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJfQotCQl2YWw2NCAqPSBzY2FsZTsKLQkJLyogZGV0ZWN0IGludGVnZXIgd3JhcCBhbmQgdG9vLWxhcmdlIGxpbWl0cyAqLwotCQlpZiAoKHZhbDY0IC8gc2NhbGUpICE9IG9yaWcgfHwgdmFsNjQgPiBVSU5UX01BWCkKLQkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogUmVrZXlMaW1pdCB0b28gbGFyZ2UiLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJaWYgKHZhbDY0IDwgMTYpCi0JCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IFJla2V5TGltaXQgdG9vIHNtYWxsIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWlmICgqYWN0aXZlcCAmJiBvcHRpb25zLT5yZWtleV9saW1pdCA9PSAtMSkKLQkJCW9wdGlvbnMtPnJla2V5X2xpbWl0ID0gKHVfaW50MzJfdCl2YWw2NDsKLQkJYnJlYWs7Ci0KLQljYXNlIG9JZGVudGl0eUZpbGU6Ci0JCWFyZyA9IHN0cmRlbGltKCZzKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJaWYgKCphY3RpdmVwKSB7Ci0JCQlpbnRwdHIgPSAmb3B0aW9ucy0+bnVtX2lkZW50aXR5X2ZpbGVzOwotCQkJaWYgKCppbnRwdHIgPj0gU1NIX01BWF9JREVOVElUWV9GSUxFUykKLQkJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IFRvbyBtYW55IGlkZW50aXR5IGZpbGVzIHNwZWNpZmllZCAobWF4ICVkKS4iLAotCQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgU1NIX01BWF9JREVOVElUWV9GSUxFUyk7Ci0JCQljaGFycHRyID0gJm9wdGlvbnMtPmlkZW50aXR5X2ZpbGVzWyppbnRwdHJdOwotCQkJKmNoYXJwdHIgPSB4c3RyZHVwKGFyZyk7Ci0JCQkqaW50cHRyID0gKmludHB0ciArIDE7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIG9YQXV0aExvY2F0aW9uOgotCQljaGFycHRyPSZvcHRpb25zLT54YXV0aF9sb2NhdGlvbjsKLQkJZ290byBwYXJzZV9zdHJpbmc7Ci0KLQljYXNlIG9Vc2VyOgotCQljaGFycHRyID0gJm9wdGlvbnMtPnVzZXI7Ci1wYXJzZV9zdHJpbmc6Ci0JCWFyZyA9IHN0cmRlbGltKCZzKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCQlpZiAoKmFjdGl2ZXAgJiYgKmNoYXJwdHIgPT0gTlVMTCkKLQkJCSpjaGFycHRyID0geHN0cmR1cChhcmcpOwotCQlicmVhazsKLQotCWNhc2Ugb0dsb2JhbEtub3duSG9zdHNGaWxlOgotCQljcHB0ciA9IChjaGFyICoqKSZvcHRpb25zLT5zeXN0ZW1faG9zdGZpbGVzOwotCQl1aW50cHRyID0gJm9wdGlvbnMtPm51bV9zeXN0ZW1faG9zdGZpbGVzOwotCQltYXhfZW50cmllcyA9IFNTSF9NQVhfSE9TVFNfRklMRVM7Ci1wYXJzZV9jaGFyX2FycmF5OgotCQlpZiAoKmFjdGl2ZXAgJiYgKnVpbnRwdHIgPT0gMCkgewotCQkJd2hpbGUgKChhcmcgPSBzdHJkZWxpbSgmcykpICE9IE5VTEwgJiYgKmFyZyAhPSAnXDAnKSB7Ci0JCQkJaWYgKCgqdWludHB0cikgPj0gbWF4X2VudHJpZXMpCi0JCQkJCWZhdGFsKCIlcyBsaW5lICVkOiAiCi0JCQkJCSAgICAidG9vIG1hbnkgYXV0aG9yaXplZCBrZXlzIGZpbGVzLiIsCi0JCQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCQkJY3BwdHJbKCp1aW50cHRyKSsrXSA9IHhzdHJkdXAoYXJnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQotCWNhc2Ugb1VzZXJLbm93bkhvc3RzRmlsZToKLQkJY3BwdHIgPSAoY2hhciAqKikmb3B0aW9ucy0+dXNlcl9ob3N0ZmlsZXM7Ci0JCXVpbnRwdHIgPSAmb3B0aW9ucy0+bnVtX3VzZXJfaG9zdGZpbGVzOwotCQltYXhfZW50cmllcyA9IFNTSF9NQVhfSE9TVFNfRklMRVM7Ci0JCWdvdG8gcGFyc2VfY2hhcl9hcnJheTsKLQotCWNhc2Ugb0hvc3ROYW1lOgotCQljaGFycHRyID0gJm9wdGlvbnMtPmhvc3RuYW1lOwotCQlnb3RvIHBhcnNlX3N0cmluZzsKLQotCWNhc2Ugb0hvc3RLZXlBbGlhczoKLQkJY2hhcnB0ciA9ICZvcHRpb25zLT5ob3N0X2tleV9hbGlhczsKLQkJZ290byBwYXJzZV9zdHJpbmc7Ci0KLQljYXNlIG9QcmVmZXJyZWRBdXRoZW50aWNhdGlvbnM6Ci0JCWNoYXJwdHIgPSAmb3B0aW9ucy0+cHJlZmVycmVkX2F1dGhlbnRpY2F0aW9uczsKLQkJZ290byBwYXJzZV9zdHJpbmc7Ci0KLQljYXNlIG9CaW5kQWRkcmVzczoKLQkJY2hhcnB0ciA9ICZvcHRpb25zLT5iaW5kX2FkZHJlc3M7Ci0JCWdvdG8gcGFyc2Vfc3RyaW5nOwotCi0JY2FzZSBvUEtDUzExUHJvdmlkZXI6Ci0JCWNoYXJwdHIgPSAmb3B0aW9ucy0+cGtjczExX3Byb3ZpZGVyOwotCQlnb3RvIHBhcnNlX3N0cmluZzsKLQotCWNhc2Ugb1Byb3h5Q29tbWFuZDoKLQkJY2hhcnB0ciA9ICZvcHRpb25zLT5wcm94eV9jb21tYW5kOwotcGFyc2VfY29tbWFuZDoKLQkJaWYgKHMgPT0gTlVMTCkKLQkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogTWlzc2luZyBhcmd1bWVudC4iLCBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWxlbiA9IHN0cnNwbihzLCBXSElURVNQQUNFICI9Iik7Ci0JCWlmICgqYWN0aXZlcCAmJiAqY2hhcnB0ciA9PSBOVUxMKQotCQkJKmNoYXJwdHIgPSB4c3RyZHVwKHMgKyBsZW4pOwotCQlyZXR1cm4gMDsKLQotCWNhc2Ugb1BvcnQ6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5wb3J0OwotcGFyc2VfaW50OgotCQlhcmcgPSBzdHJkZWxpbSgmcyk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogTWlzc2luZyBhcmd1bWVudC4iLCBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWlmIChhcmdbMF0gPCAnMCcgfHwgYXJnWzBdID4gJzknKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgbnVtYmVyLiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQotCQkvKiBPY3RhbCwgZGVjaW1hbCwgb3IgaGV4IGZvcm1hdD8gKi8KLQkJdmFsdWUgPSBzdHJ0b2woYXJnLCAmZW5kb2ZudW1iZXIsIDApOwotCQlpZiAoYXJnID09IGVuZG9mbnVtYmVyKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgbnVtYmVyLiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJaWYgKCphY3RpdmVwICYmICppbnRwdHIgPT0gLTEpCi0JCQkqaW50cHRyID0gdmFsdWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBvQ29ubmVjdGlvbkF0dGVtcHRzOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+Y29ubmVjdGlvbl9hdHRlbXB0czsKLQkJZ290byBwYXJzZV9pbnQ7Ci0KLQljYXNlIG9DaXBoZXI6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5jaXBoZXI7Ci0JCWFyZyA9IHN0cmRlbGltKCZzKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJdmFsdWUgPSBjaXBoZXJfbnVtYmVyKGFyZyk7Ci0JCWlmICh2YWx1ZSA9PSAtMSkKLQkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogQmFkIGNpcGhlciAnJXMnLiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyA/IGFyZyA6ICI8Tk9ORT4iKTsKLQkJaWYgKCphY3RpdmVwICYmICppbnRwdHIgPT0gLTEpCi0JCQkqaW50cHRyID0gdmFsdWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBvQ2lwaGVyczoKLQkJYXJnID0gc3RyZGVsaW0oJnMpOwotCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCi0JCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IE1pc3NpbmcgYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOwotCQlpZiAoIWNpcGhlcnNfdmFsaWQoYXJnKSkKLQkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogQmFkIFNTSDIgY2lwaGVyIHNwZWMgJyVzJy4iLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcgPyBhcmcgOiAiPE5PTkU+Iik7Ci0JCWlmICgqYWN0aXZlcCAmJiBvcHRpb25zLT5jaXBoZXJzID09IE5VTEwpCi0JCQlvcHRpb25zLT5jaXBoZXJzID0geHN0cmR1cChhcmcpOwotCQlicmVhazsKLQotCWNhc2Ugb01hY3M6Ci0JCWFyZyA9IHN0cmRlbGltKCZzKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJaWYgKCFtYWNfdmFsaWQoYXJnKSkKLQkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogQmFkIFNTSDIgTWFjIHNwZWMgJyVzJy4iLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcgPyBhcmcgOiAiPE5PTkU+Iik7Ci0JCWlmICgqYWN0aXZlcCAmJiBvcHRpb25zLT5tYWNzID09IE5VTEwpCi0JCQlvcHRpb25zLT5tYWNzID0geHN0cmR1cChhcmcpOwotCQlicmVhazsKLQotCWNhc2Ugb0tleEFsZ29yaXRobXM6Ci0JCWFyZyA9IHN0cmRlbGltKCZzKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCQlpZiAoIWtleF9uYW1lc192YWxpZChhcmcpKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgU1NIMiBLZXhBbGdvcml0aG1zICclcycuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnID8gYXJnIDogIjxOT05FPiIpOwotCQlpZiAoKmFjdGl2ZXAgJiYgb3B0aW9ucy0+a2V4X2FsZ29yaXRobXMgPT0gTlVMTCkKLQkJCW9wdGlvbnMtPmtleF9hbGdvcml0aG1zID0geHN0cmR1cChhcmcpOwotCQlicmVhazsKLQotCWNhc2Ugb0hvc3RLZXlBbGdvcml0aG1zOgotCQlhcmcgPSBzdHJkZWxpbSgmcyk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogTWlzc2luZyBhcmd1bWVudC4iLCBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWlmICgha2V5X25hbWVzX3ZhbGlkMihhcmcpKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgcHJvdG9jb2wgMiBob3N0IGtleSBhbGdvcml0aG1zICclcycuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnID8gYXJnIDogIjxOT05FPiIpOwotCQlpZiAoKmFjdGl2ZXAgJiYgb3B0aW9ucy0+aG9zdGtleWFsZ29yaXRobXMgPT0gTlVMTCkKLQkJCW9wdGlvbnMtPmhvc3RrZXlhbGdvcml0aG1zID0geHN0cmR1cChhcmcpOwotCQlicmVhazsKLQotCWNhc2Ugb1Byb3RvY29sOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+cHJvdG9jb2w7Ci0JCWFyZyA9IHN0cmRlbGltKCZzKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJdmFsdWUgPSBwcm90b19zcGVjKGFyZyk7Ci0JCWlmICh2YWx1ZSA9PSBTU0hfUFJPVE9fVU5LTk9XTikKLQkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogQmFkIHByb3RvY29sIHNwZWMgJyVzJy4iLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcgPyBhcmcgOiAiPE5PTkU+Iik7Ci0JCWlmICgqYWN0aXZlcCAmJiAqaW50cHRyID09IFNTSF9QUk9UT19VTktOT1dOKQotCQkJKmludHB0ciA9IHZhbHVlOwotCQlicmVhazsKLQotCWNhc2Ugb0xvZ0xldmVsOgotCQlsb2dfbGV2ZWxfcHRyID0gJm9wdGlvbnMtPmxvZ19sZXZlbDsKLQkJYXJnID0gc3RyZGVsaW0oJnMpOwotCQl2YWx1ZSA9IGxvZ19sZXZlbF9udW1iZXIoYXJnKTsKLQkJaWYgKHZhbHVlID09IFNZU0xPR19MRVZFTF9OT1RfU0VUKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiB1bnN1cHBvcnRlZCBsb2cgbGV2ZWwgJyVzJyIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyA/IGFyZyA6ICI8Tk9ORT4iKTsKLQkJaWYgKCphY3RpdmVwICYmICpsb2dfbGV2ZWxfcHRyID09IFNZU0xPR19MRVZFTF9OT1RfU0VUKQotCQkJKmxvZ19sZXZlbF9wdHIgPSAoTG9nTGV2ZWwpIHZhbHVlOwotCQlicmVhazsKLQotCWNhc2Ugb0xvY2FsRm9yd2FyZDoKLQljYXNlIG9SZW1vdGVGb3J3YXJkOgotCWNhc2Ugb0R5bmFtaWNGb3J3YXJkOgotCQlhcmcgPSBzdHJkZWxpbSgmcyk7Ci0JCWlmIChhcmcgPT0gTlVMTCB8fCAqYXJnID09ICdcMCcpCi0JCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IE1pc3NpbmcgcG9ydCBhcmd1bWVudC4iLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQotCQlpZiAob3Bjb2RlID09IG9Mb2NhbEZvcndhcmQgfHwKLQkJICAgIG9wY29kZSA9PSBvUmVtb3RlRm9yd2FyZCkgewotCQkJYXJnMiA9IHN0cmRlbGltKCZzKTsKLQkJCWlmIChhcmcyID09IE5VTEwgfHwgKmFyZzIgPT0gJ1wwJykKLQkJCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IE1pc3NpbmcgdGFyZ2V0IGFyZ3VtZW50LiIsCi0JCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQotCQkJLyogY29uc3RydWN0IGEgc3RyaW5nIGZvciBwYXJzZV9mb3J3YXJkICovCi0JCQlzbnByaW50Zihmd2RhcmcsIHNpemVvZihmd2RhcmcpLCAiJXM6JXMiLCBhcmcsIGFyZzIpOwotCQl9IGVsc2UgaWYgKG9wY29kZSA9PSBvRHluYW1pY0ZvcndhcmQpIHsKLQkJCXN0cmxjcHkoZndkYXJnLCBhcmcsIHNpemVvZihmd2RhcmcpKTsKLQkJfQotCi0JCWlmIChwYXJzZV9mb3J3YXJkKCZmd2QsIGZ3ZGFyZywKLQkJICAgIG9wY29kZSA9PSBvRHluYW1pY0ZvcndhcmQgPyAxIDogMCwKLQkJICAgIG9wY29kZSA9PSBvUmVtb3RlRm9yd2FyZCA/IDEgOiAwKSA9PSAwKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgZm9yd2FyZGluZyBzcGVjaWZpY2F0aW9uLiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCi0JCWlmICgqYWN0aXZlcCkgewotCQkJaWYgKG9wY29kZSA9PSBvTG9jYWxGb3J3YXJkIHx8Ci0JCQkgICAgb3Bjb2RlID09IG9EeW5hbWljRm9yd2FyZCkKLQkJCQlhZGRfbG9jYWxfZm9yd2FyZChvcHRpb25zLCAmZndkKTsKLQkJCWVsc2UgaWYgKG9wY29kZSA9PSBvUmVtb3RlRm9yd2FyZCkKLQkJCQlhZGRfcmVtb3RlX2ZvcndhcmQob3B0aW9ucywgJmZ3ZCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIG9DbGVhckFsbEZvcndhcmRpbmdzOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+Y2xlYXJfZm9yd2FyZGluZ3M7Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugb0hvc3Q6Ci0JCSphY3RpdmVwID0gMDsKLQkJYXJnMiA9IE5VTEw7Ci0JCXdoaWxlICgoYXJnID0gc3RyZGVsaW0oJnMpKSAhPSBOVUxMICYmICphcmcgIT0gJ1wwJykgewotCQkJbmVnYXRlZCA9ICphcmcgPT0gJyEnOwotCQkJaWYgKG5lZ2F0ZWQpCi0JCQkJYXJnKys7Ci0JCQlpZiAobWF0Y2hfcGF0dGVybihob3N0LCBhcmcpKSB7Ci0JCQkJaWYgKG5lZ2F0ZWQpIHsKLQkJCQkJZGVidWcoIiUuMjAwcyBsaW5lICVkOiBTa2lwcGluZyBIb3N0ICIKLQkJCQkJICAgICJibG9jayBiZWNhdXNlIG9mIG5lZ2F0ZWQgbWF0Y2ggIgotCQkJCQkgICAgImZvciAlLjEwMHMiLCBmaWxlbmFtZSwgbGluZW51bSwKLQkJCQkJICAgIGFyZyk7Ci0JCQkJCSphY3RpdmVwID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICghKmFjdGl2ZXApCi0JCQkJCWFyZzIgPSBhcmc7IC8qIGxvZ2dlZCBiZWxvdyAqLwotCQkJCSphY3RpdmVwID0gMTsKLQkJCX0KLQkJfQotCQlpZiAoKmFjdGl2ZXApCi0JCQlkZWJ1ZygiJS4yMDBzIGxpbmUgJWQ6IEFwcGx5aW5nIG9wdGlvbnMgZm9yICUuMTAwcyIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZzIpOwotCQkvKiBBdm9pZCBnYXJiYWdlIGNoZWNrIGJlbG93LCBhcyBzdHJkZWxpbSBpcyBkb25lLiAqLwotCQlyZXR1cm4gMDsKLQotCWNhc2Ugb0VzY2FwZUNoYXI6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5lc2NhcGVfY2hhcjsKLQkJYXJnID0gc3RyZGVsaW0oJnMpOwotCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCi0JCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IE1pc3NpbmcgYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOwotCQlpZiAoYXJnWzBdID09ICdeJyAmJiBhcmdbMl0gPT0gMCAmJgotCQkgICAgKHVfY2hhcikgYXJnWzFdID49IDY0ICYmICh1X2NoYXIpIGFyZ1sxXSA8IDEyOCkKLQkJCXZhbHVlID0gKHVfY2hhcikgYXJnWzFdICYgMzE7Ci0JCWVsc2UgaWYgKHN0cmxlbihhcmcpID09IDEpCi0JCQl2YWx1ZSA9ICh1X2NoYXIpIGFyZ1swXTsKLQkJZWxzZSBpZiAoc3RyY21wKGFyZywgIm5vbmUiKSA9PSAwKQotCQkJdmFsdWUgPSBTU0hfRVNDQVBFQ0hBUl9OT05FOwotCQllbHNlIHsKLQkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogQmFkIGVzY2FwZSBjaGFyYWN0ZXIuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCQkvKiBOT1RSRUFDSEVEICovCi0JCQl2YWx1ZSA9IDA7CS8qIEF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuICovCi0JCX0KLQkJaWYgKCphY3RpdmVwICYmICppbnRwdHIgPT0gLTEpCi0JCQkqaW50cHRyID0gdmFsdWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBvQWRkcmVzc0ZhbWlseToKLQkJYXJnID0gc3RyZGVsaW0oJnMpOwotCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCi0JCQlmYXRhbCgiJXMgbGluZSAlZDogbWlzc2luZyBhZGRyZXNzIGZhbWlseS4iLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJaW50cHRyID0gJm9wdGlvbnMtPmFkZHJlc3NfZmFtaWx5OwotCQlpZiAoc3RyY2FzZWNtcChhcmcsICJpbmV0IikgPT0gMCkKLQkJCXZhbHVlID0gQUZfSU5FVDsKLQkJZWxzZSBpZiAoc3RyY2FzZWNtcChhcmcsICJpbmV0NiIpID09IDApCi0JCQl2YWx1ZSA9IEFGX0lORVQ2OwotCQllbHNlIGlmIChzdHJjYXNlY21wKGFyZywgImFueSIpID09IDApCi0JCQl2YWx1ZSA9IEFGX1VOU1BFQzsKLQkJZWxzZQotCQkJZmF0YWwoIlVuc3VwcG9ydGVkIEFkZHJlc3NGYW1pbHkgXCIlc1wiIiwgYXJnKTsKLQkJaWYgKCphY3RpdmVwICYmICppbnRwdHIgPT0gLTEpCi0JCQkqaW50cHRyID0gdmFsdWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBvRW5hYmxlU1NIS2V5c2lnbjoKLQkJaW50cHRyID0gJm9wdGlvbnMtPmVuYWJsZV9zc2hfa2V5c2lnbjsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBvSWRlbnRpdGllc09ubHk6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5pZGVudGl0aWVzX29ubHk7Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugb1NlcnZlckFsaXZlSW50ZXJ2YWw6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5zZXJ2ZXJfYWxpdmVfaW50ZXJ2YWw7Ci0JCWdvdG8gcGFyc2VfdGltZTsKLQotCWNhc2Ugb1NlcnZlckFsaXZlQ291bnRNYXg6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5zZXJ2ZXJfYWxpdmVfY291bnRfbWF4OwotCQlnb3RvIHBhcnNlX2ludDsKLQotCWNhc2Ugb1NlbmRFbnY6Ci0JCXdoaWxlICgoYXJnID0gc3RyZGVsaW0oJnMpKSAhPSBOVUxMICYmICphcmcgIT0gJ1wwJykgewotCQkJaWYgKHN0cmNocihhcmcsICc9JykgIT0gTlVMTCkKLQkJCQlmYXRhbCgiJXMgbGluZSAlZDogSW52YWxpZCBlbnZpcm9ubWVudCBuYW1lLiIsCi0JCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJCWlmICghKmFjdGl2ZXApCi0JCQkJY29udGludWU7Ci0JCQlpZiAob3B0aW9ucy0+bnVtX3NlbmRfZW52ID49IE1BWF9TRU5EX0VOVikKLQkJCQlmYXRhbCgiJXMgbGluZSAlZDogdG9vIG1hbnkgc2VuZCBlbnYuIiwKLQkJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCQkJb3B0aW9ucy0+c2VuZF9lbnZbb3B0aW9ucy0+bnVtX3NlbmRfZW52KytdID0KLQkJCSAgICB4c3RyZHVwKGFyZyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIG9Db250cm9sUGF0aDoKLQkJY2hhcnB0ciA9ICZvcHRpb25zLT5jb250cm9sX3BhdGg7Ci0JCWdvdG8gcGFyc2Vfc3RyaW5nOwotCi0JY2FzZSBvQ29udHJvbE1hc3RlcjoKLQkJaW50cHRyID0gJm9wdGlvbnMtPmNvbnRyb2xfbWFzdGVyOwotCQlhcmcgPSBzdHJkZWxpbSgmcyk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogTWlzc2luZyBDb250cm9sTWFzdGVyIGFyZ3VtZW50LiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCQl2YWx1ZSA9IDA7CS8qIFRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuLi4gKi8KLQkJaWYgKHN0cmNtcChhcmcsICJ5ZXMiKSA9PSAwIHx8IHN0cmNtcChhcmcsICJ0cnVlIikgPT0gMCkKLQkJCXZhbHVlID0gU1NIQ1RMX01BU1RFUl9ZRVM7Ci0JCWVsc2UgaWYgKHN0cmNtcChhcmcsICJubyIpID09IDAgfHwgc3RyY21wKGFyZywgImZhbHNlIikgPT0gMCkKLQkJCXZhbHVlID0gU1NIQ1RMX01BU1RFUl9OTzsKLQkJZWxzZSBpZiAoc3RyY21wKGFyZywgImF1dG8iKSA9PSAwKQotCQkJdmFsdWUgPSBTU0hDVExfTUFTVEVSX0FVVE87Ci0JCWVsc2UgaWYgKHN0cmNtcChhcmcsICJhc2siKSA9PSAwKQotCQkJdmFsdWUgPSBTU0hDVExfTUFTVEVSX0FTSzsKLQkJZWxzZSBpZiAoc3RyY21wKGFyZywgImF1dG9hc2siKSA9PSAwKQotCQkJdmFsdWUgPSBTU0hDVExfTUFTVEVSX0FVVE9fQVNLOwotCQllbHNlCi0JCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IEJhZCBDb250cm9sTWFzdGVyIGFyZ3VtZW50LiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCQlpZiAoKmFjdGl2ZXAgJiYgKmludHB0ciA9PSAtMSkKLQkJCSppbnRwdHIgPSB2YWx1ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIG9Db250cm9sUGVyc2lzdDoKLQkJLyogbm8vZmFsc2UveWVzL3RydWUsIG9yIGEgdGltZSBzcGVjICovCi0JCWludHB0ciA9ICZvcHRpb25zLT5jb250cm9sX3BlcnNpc3Q7Ci0JCWFyZyA9IHN0cmRlbGltKCZzKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBNaXNzaW5nIENvbnRyb2xQZXJzaXN0IgotCQkJICAgICIgYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOwotCQl2YWx1ZSA9IDA7Ci0JCXZhbHVlMiA9IDA7CS8qIHRpbWVvdXQgKi8KLQkJaWYgKHN0cmNtcChhcmcsICJubyIpID09IDAgfHwgc3RyY21wKGFyZywgImZhbHNlIikgPT0gMCkKLQkJCXZhbHVlID0gMDsKLQkJZWxzZSBpZiAoc3RyY21wKGFyZywgInllcyIpID09IDAgfHwgc3RyY21wKGFyZywgInRydWUiKSA9PSAwKQotCQkJdmFsdWUgPSAxOwotCQllbHNlIGlmICgodmFsdWUyID0gY29udnRpbWUoYXJnKSkgPj0gMCkKLQkJCXZhbHVlID0gMTsKLQkJZWxzZQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgQ29udHJvbFBlcnNpc3QgYXJndW1lbnQuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWlmICgqYWN0aXZlcCAmJiAqaW50cHRyID09IC0xKSB7Ci0JCQkqaW50cHRyID0gdmFsdWU7Ci0JCQlvcHRpb25zLT5jb250cm9sX3BlcnNpc3RfdGltZW91dCA9IHZhbHVlMjsKLQkJfQotCQlicmVhazsKLQotCWNhc2Ugb0hhc2hLbm93bkhvc3RzOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+aGFzaF9rbm93bl9ob3N0czsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBvVHVubmVsOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+dHVuX29wZW47Ci0JCWFyZyA9IHN0cmRlbGltKCZzKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IE1pc3NpbmcgeWVzL3BvaW50LXRvLXBvaW50LyIKLQkJCSAgICAiZXRoZXJuZXQvbm8gYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOwotCQl2YWx1ZSA9IDA7CS8qIHNpbGVuY2UgY29tcGlsZXIgKi8KLQkJaWYgKHN0cmNhc2VjbXAoYXJnLCAiZXRoZXJuZXQiKSA9PSAwKQotCQkJdmFsdWUgPSBTU0hfVFVOTU9ERV9FVEhFUk5FVDsKLQkJZWxzZSBpZiAoc3RyY2FzZWNtcChhcmcsICJwb2ludC10by1wb2ludCIpID09IDApCi0JCQl2YWx1ZSA9IFNTSF9UVU5NT0RFX1BPSU5UT1BPSU5UOwotCQllbHNlIGlmIChzdHJjYXNlY21wKGFyZywgInllcyIpID09IDApCi0JCQl2YWx1ZSA9IFNTSF9UVU5NT0RFX0RFRkFVTFQ7Ci0JCWVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnLCAibm8iKSA9PSAwKQotCQkJdmFsdWUgPSBTU0hfVFVOTU9ERV9OTzsKLQkJZWxzZQotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IEJhZCB5ZXMvcG9pbnQtdG8tcG9pbnQvZXRoZXJuZXQvIgotCQkJICAgICJubyBhcmd1bWVudDogJXMiLCBmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKLQkJaWYgKCphY3RpdmVwKQotCQkJKmludHB0ciA9IHZhbHVlOwotCQlicmVhazsKLQotCWNhc2Ugb1R1bm5lbERldmljZToKLQkJYXJnID0gc3RyZGVsaW0oJnMpOwotCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCi0JCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IE1pc3NpbmcgYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOwotCQl2YWx1ZSA9IGEydHVuKGFyZywgJnZhbHVlMik7Ci0JCWlmICh2YWx1ZSA9PSBTU0hfVFVOSURfRVJSKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiBCYWQgdHVuIGRldmljZS4iLCBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWlmICgqYWN0aXZlcCkgewotCQkJb3B0aW9ucy0+dHVuX2xvY2FsID0gdmFsdWU7Ci0JCQlvcHRpb25zLT50dW5fcmVtb3RlID0gdmFsdWUyOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBvTG9jYWxDb21tYW5kOgotCQljaGFycHRyID0gJm9wdGlvbnMtPmxvY2FsX2NvbW1hbmQ7Ci0JCWdvdG8gcGFyc2VfY29tbWFuZDsKLQotCWNhc2Ugb1Blcm1pdExvY2FsQ29tbWFuZDoKLQkJaW50cHRyID0gJm9wdGlvbnMtPnBlcm1pdF9sb2NhbF9jb21tYW5kOwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIG9WaXN1YWxIb3N0S2V5OgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+dmlzdWFsX2hvc3Rfa2V5OwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIG9JUFFvUzoKLQkJYXJnID0gc3RyZGVsaW0oJnMpOwotCQlpZiAoKHZhbHVlID0gcGFyc2VfaXBxb3MoYXJnKSkgPT0gLTEpCi0JCQlmYXRhbCgiJXMgbGluZSAlZDogQmFkIElQUW9TIHZhbHVlOiAlcyIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyk7Ci0JCWFyZyA9IHN0cmRlbGltKCZzKTsKLQkJaWYgKGFyZyA9PSBOVUxMKQotCQkJdmFsdWUyID0gdmFsdWU7Ci0JCWVsc2UgaWYgKCh2YWx1ZTIgPSBwYXJzZV9pcHFvcyhhcmcpKSA9PSAtMSkKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBCYWQgSVBRb1MgdmFsdWU6ICVzIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKLQkJaWYgKCphY3RpdmVwKSB7Ci0JCQlvcHRpb25zLT5pcF9xb3NfaW50ZXJhY3RpdmUgPSB2YWx1ZTsKLQkJCW9wdGlvbnMtPmlwX3Fvc19idWxrID0gdmFsdWUyOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBvVXNlUm9hbWluZzoKLQkJaW50cHRyID0gJm9wdGlvbnMtPnVzZV9yb2FtaW5nOwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIG9SZXF1ZXN0VFRZOgotCQlhcmcgPSBzdHJkZWxpbSgmcyk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBtaXNzaW5nIGFyZ3VtZW50LiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCQlpbnRwdHIgPSAmb3B0aW9ucy0+cmVxdWVzdF90dHk7Ci0JCWlmIChzdHJjYXNlY21wKGFyZywgInllcyIpID09IDApCi0JCQl2YWx1ZSA9IFJFUVVFU1RfVFRZX1lFUzsKLQkJZWxzZSBpZiAoc3RyY2FzZWNtcChhcmcsICJubyIpID09IDApCi0JCQl2YWx1ZSA9IFJFUVVFU1RfVFRZX05POwotCQllbHNlIGlmIChzdHJjYXNlY21wKGFyZywgImZvcmNlIikgPT0gMCkKLQkJCXZhbHVlID0gUkVRVUVTVF9UVFlfRk9SQ0U7Ci0JCWVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnLCAiYXV0byIpID09IDApCi0JCQl2YWx1ZSA9IFJFUVVFU1RfVFRZX0FVVE87Ci0JCWVsc2UKLQkJCWZhdGFsKCJVbnN1cHBvcnRlZCBSZXF1ZXN0VFRZIFwiJXNcIiIsIGFyZyk7Ci0JCWlmICgqYWN0aXZlcCAmJiAqaW50cHRyID09IC0xKQotCQkJKmludHB0ciA9IHZhbHVlOwotCQlicmVhazsKLQotCWNhc2Ugb0RlcHJlY2F0ZWQ6Ci0JCWRlYnVnKCIlcyBsaW5lICVkOiBEZXByZWNhdGVkIG9wdGlvbiBcIiVzXCIiLAotCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGtleXdvcmQpOwotCQlyZXR1cm4gMDsKLQotCWNhc2Ugb1Vuc3VwcG9ydGVkOgotCQllcnJvcigiJXMgbGluZSAlZDogVW5zdXBwb3J0ZWQgb3B0aW9uIFwiJXNcIiIsCi0JCSAgICBmaWxlbmFtZSwgbGluZW51bSwga2V5d29yZCk7Ci0JCXJldHVybiAwOwotCi0JZGVmYXVsdDoKLQkJZmF0YWwoInByb2Nlc3NfY29uZmlnX2xpbmU6IFVuaW1wbGVtZW50ZWQgb3Bjb2RlICVkIiwgb3Bjb2RlKTsKLQl9Ci0KLQkvKiBDaGVjayB0aGF0IHRoZXJlIGlzIG5vIGdhcmJhZ2UgYXQgZW5kIG9mIGxpbmUuICovCi0JaWYgKChhcmcgPSBzdHJkZWxpbSgmcykpICE9IE5VTEwgJiYgKmFyZyAhPSAnXDAnKSB7Ci0JCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogZ2FyYmFnZSBhdCBlbmQgb2YgbGluZTsgXCIlLjIwMHNcIi4iLAotCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyk7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBSZWFkcyB0aGUgY29uZmlnIGZpbGUgYW5kIG1vZGlmaWVzIHRoZSBvcHRpb25zIGFjY29yZGluZ2x5LiAgT3B0aW9ucwotICogc2hvdWxkIGFscmVhZHkgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgY2FsbC4gIFRoaXMgbmV2ZXIgcmV0dXJucyBpZgotICogdGhlcmUgaXMgYW4gZXJyb3IuICBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhpcyByZXR1cm5zIDAuCi0gKi8KLQotaW50Ci1yZWFkX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpob3N0LCBPcHRpb25zICpvcHRpb25zLAotICAgIGludCBjaGVja3Blcm0pCi17Ci0JRklMRSAqZjsKLQljaGFyIGxpbmVbMTAyNF07Ci0JaW50IGFjdGl2ZSwgbGluZW51bTsKLQlpbnQgYmFkX29wdGlvbnMgPSAwOwotCi0JaWYgKChmID0gZm9wZW4oZmlsZW5hbWUsICJyIikpID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JaWYgKGNoZWNrcGVybSkgewotCQlzdHJ1Y3Qgc3RhdCBzYjsKLQotCQlpZiAoZnN0YXQoZmlsZW5vKGYpLCAmc2IpID09IC0xKQotCQkJZmF0YWwoImZzdGF0ICVzOiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOwotCQlpZiAoKChzYi5zdF91aWQgIT0gMCAmJiBzYi5zdF91aWQgIT0gZ2V0dWlkKCkpIHx8Ci0JCSAgICAoc2Iuc3RfbW9kZSAmIDAyMikgIT0gMCkpCi0JCQlmYXRhbCgiQmFkIG93bmVyIG9yIHBlcm1pc3Npb25zIG9uICVzIiwgZmlsZW5hbWUpOwotCX0KLQotCWRlYnVnKCJSZWFkaW5nIGNvbmZpZ3VyYXRpb24gZGF0YSAlLjIwMHMiLCBmaWxlbmFtZSk7Ci0KLQkvKgotCSAqIE1hcmsgdGhhdCB3ZSBhcmUgbm93IHByb2Nlc3NpbmcgdGhlIG9wdGlvbnMuICBUaGlzIGZsYWcgaXMgdHVybmVkCi0JICogb24vb2ZmIGJ5IEhvc3Qgc3BlY2lmaWNhdGlvbnMuCi0JICovCi0JYWN0aXZlID0gMTsKLQlsaW5lbnVtID0gMDsKLQl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkgewotCQkvKiBVcGRhdGUgbGluZSBudW1iZXIgY291bnRlci4gKi8KLQkJbGluZW51bSsrOwotCQlpZiAocHJvY2Vzc19jb25maWdfbGluZShvcHRpb25zLCBob3N0LCBsaW5lLCBmaWxlbmFtZSwgbGluZW51bSwgJmFjdGl2ZSkgIT0gMCkKLQkJCWJhZF9vcHRpb25zKys7Ci0JfQotCWZjbG9zZShmKTsKLQlpZiAoYmFkX29wdGlvbnMgPiAwKQotCQlmYXRhbCgiJXM6IHRlcm1pbmF0aW5nLCAlZCBiYWQgY29uZmlndXJhdGlvbiBvcHRpb25zIiwKLQkJICAgIGZpbGVuYW1lLCBiYWRfb3B0aW9ucyk7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplcyBvcHRpb25zIHRvIHNwZWNpYWwgdmFsdWVzIHRoYXQgaW5kaWNhdGUgdGhhdCB0aGV5IGhhdmUgbm90IHlldAotICogYmVlbiBzZXQuICBSZWFkX2NvbmZpZ19maWxlIHdpbGwgb25seSBzZXQgb3B0aW9ucyB3aXRoIHRoaXMgdmFsdWUuIE9wdGlvbnMKLSAqIGFyZSBwcm9jZXNzZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogY29tbWFuZCBsaW5lLCB1c2VyIGNvbmZpZyBmaWxlLAotICogc3lzdGVtIGNvbmZpZyBmaWxlLiAgTGFzdCwgZmlsbF9kZWZhdWx0X29wdGlvbnMgaXMgY2FsbGVkLgotICovCi0KLXZvaWQKLWluaXRpYWxpemVfb3B0aW9ucyhPcHRpb25zICogb3B0aW9ucykKLXsKLQltZW1zZXQob3B0aW9ucywgJ1gnLCBzaXplb2YoKm9wdGlvbnMpKTsKLQlvcHRpb25zLT5mb3J3YXJkX2FnZW50ID0gLTE7Ci0Jb3B0aW9ucy0+Zm9yd2FyZF94MTEgPSAtMTsKLQlvcHRpb25zLT5mb3J3YXJkX3gxMV90cnVzdGVkID0gLTE7Ci0Jb3B0aW9ucy0+Zm9yd2FyZF94MTFfdGltZW91dCA9IC0xOwotCW9wdGlvbnMtPmV4aXRfb25fZm9yd2FyZF9mYWlsdXJlID0gLTE7Ci0Jb3B0aW9ucy0+eGF1dGhfbG9jYXRpb24gPSBOVUxMOwotCW9wdGlvbnMtPmdhdGV3YXlfcG9ydHMgPSAtMTsKLQlvcHRpb25zLT51c2VfcHJpdmlsZWdlZF9wb3J0ID0gLTE7Ci0Jb3B0aW9ucy0+cnNhX2F1dGhlbnRpY2F0aW9uID0gLTE7Ci0Jb3B0aW9ucy0+cHVia2V5X2F1dGhlbnRpY2F0aW9uID0gLTE7Ci0Jb3B0aW9ucy0+Y2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uID0gLTE7Ci0Jb3B0aW9ucy0+Z3NzX2F1dGhlbnRpY2F0aW9uID0gLTE7Ci0Jb3B0aW9ucy0+Z3NzX2RlbGVnX2NyZWRzID0gLTE7Ci0Jb3B0aW9ucy0+cGFzc3dvcmRfYXV0aGVudGljYXRpb24gPSAtMTsKLQlvcHRpb25zLT5rYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb24gPSAtMTsKLQlvcHRpb25zLT5rYmRfaW50ZXJhY3RpdmVfZGV2aWNlcyA9IE5VTEw7Ci0Jb3B0aW9ucy0+cmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbiA9IC0xOwotCW9wdGlvbnMtPmhvc3RiYXNlZF9hdXRoZW50aWNhdGlvbiA9IC0xOwotCW9wdGlvbnMtPmJhdGNoX21vZGUgPSAtMTsKLQlvcHRpb25zLT5jaGVja19ob3N0X2lwID0gLTE7Ci0Jb3B0aW9ucy0+c3RyaWN0X2hvc3Rfa2V5X2NoZWNraW5nID0gLTE7Ci0Jb3B0aW9ucy0+Y29tcHJlc3Npb24gPSAtMTsKLQlvcHRpb25zLT50Y3Bfa2VlcF9hbGl2ZSA9IC0xOwotCW9wdGlvbnMtPmNvbXByZXNzaW9uX2xldmVsID0gLTE7Ci0Jb3B0aW9ucy0+cG9ydCA9IC0xOwotCW9wdGlvbnMtPmFkZHJlc3NfZmFtaWx5ID0gLTE7Ci0Jb3B0aW9ucy0+Y29ubmVjdGlvbl9hdHRlbXB0cyA9IC0xOwotCW9wdGlvbnMtPmNvbm5lY3Rpb25fdGltZW91dCA9IC0xOwotCW9wdGlvbnMtPm51bWJlcl9vZl9wYXNzd29yZF9wcm9tcHRzID0gLTE7Ci0Jb3B0aW9ucy0+Y2lwaGVyID0gLTE7Ci0Jb3B0aW9ucy0+Y2lwaGVycyA9IE5VTEw7Ci0Jb3B0aW9ucy0+bWFjcyA9IE5VTEw7Ci0Jb3B0aW9ucy0+a2V4X2FsZ29yaXRobXMgPSBOVUxMOwotCW9wdGlvbnMtPmhvc3RrZXlhbGdvcml0aG1zID0gTlVMTDsKLQlvcHRpb25zLT5wcm90b2NvbCA9IFNTSF9QUk9UT19VTktOT1dOOwotCW9wdGlvbnMtPm51bV9pZGVudGl0eV9maWxlcyA9IDA7Ci0Jb3B0aW9ucy0+aG9zdG5hbWUgPSBOVUxMOwotCW9wdGlvbnMtPmhvc3Rfa2V5X2FsaWFzID0gTlVMTDsKLQlvcHRpb25zLT5wcm94eV9jb21tYW5kID0gTlVMTDsKLQlvcHRpb25zLT51c2VyID0gTlVMTDsKLQlvcHRpb25zLT5lc2NhcGVfY2hhciA9IC0xOwotCW9wdGlvbnMtPm51bV9zeXN0ZW1faG9zdGZpbGVzID0gMDsKLQlvcHRpb25zLT5udW1fdXNlcl9ob3N0ZmlsZXMgPSAwOwotCW9wdGlvbnMtPmxvY2FsX2ZvcndhcmRzID0gTlVMTDsKLQlvcHRpb25zLT5udW1fbG9jYWxfZm9yd2FyZHMgPSAwOwotCW9wdGlvbnMtPnJlbW90ZV9mb3J3YXJkcyA9IE5VTEw7Ci0Jb3B0aW9ucy0+bnVtX3JlbW90ZV9mb3J3YXJkcyA9IDA7Ci0Jb3B0aW9ucy0+Y2xlYXJfZm9yd2FyZGluZ3MgPSAtMTsKLQlvcHRpb25zLT5sb2dfbGV2ZWwgPSBTWVNMT0dfTEVWRUxfTk9UX1NFVDsKLQlvcHRpb25zLT5wcmVmZXJyZWRfYXV0aGVudGljYXRpb25zID0gTlVMTDsKLQlvcHRpb25zLT5iaW5kX2FkZHJlc3MgPSBOVUxMOwotCW9wdGlvbnMtPnBrY3MxMV9wcm92aWRlciA9IE5VTEw7Ci0Jb3B0aW9ucy0+ZW5hYmxlX3NzaF9rZXlzaWduID0gLSAxOwotCW9wdGlvbnMtPm5vX2hvc3RfYXV0aGVudGljYXRpb25fZm9yX2xvY2FsaG9zdCA9IC0gMTsKLQlvcHRpb25zLT5pZGVudGl0aWVzX29ubHkgPSAtIDE7Ci0Jb3B0aW9ucy0+cmVrZXlfbGltaXQgPSAtIDE7Ci0Jb3B0aW9ucy0+dmVyaWZ5X2hvc3Rfa2V5X2RucyA9IC0xOwotCW9wdGlvbnMtPnNlcnZlcl9hbGl2ZV9pbnRlcnZhbCA9IC0xOwotCW9wdGlvbnMtPnNlcnZlcl9hbGl2ZV9jb3VudF9tYXggPSAtMTsKLQlvcHRpb25zLT5udW1fc2VuZF9lbnYgPSAwOwotCW9wdGlvbnMtPmNvbnRyb2xfcGF0aCA9IE5VTEw7Ci0Jb3B0aW9ucy0+Y29udHJvbF9tYXN0ZXIgPSAtMTsKLQlvcHRpb25zLT5jb250cm9sX3BlcnNpc3QgPSAtMTsKLQlvcHRpb25zLT5jb250cm9sX3BlcnNpc3RfdGltZW91dCA9IDA7Ci0Jb3B0aW9ucy0+aGFzaF9rbm93bl9ob3N0cyA9IC0xOwotCW9wdGlvbnMtPnR1bl9vcGVuID0gLTE7Ci0Jb3B0aW9ucy0+dHVuX2xvY2FsID0gLTE7Ci0Jb3B0aW9ucy0+dHVuX3JlbW90ZSA9IC0xOwotCW9wdGlvbnMtPmxvY2FsX2NvbW1hbmQgPSBOVUxMOwotCW9wdGlvbnMtPnBlcm1pdF9sb2NhbF9jb21tYW5kID0gLTE7Ci0Jb3B0aW9ucy0+dXNlX3JvYW1pbmcgPSAtMTsKLQlvcHRpb25zLT52aXN1YWxfaG9zdF9rZXkgPSAtMTsKLQlvcHRpb25zLT56ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbiA9IC0xOwotCW9wdGlvbnMtPmlwX3Fvc19pbnRlcmFjdGl2ZSA9IC0xOwotCW9wdGlvbnMtPmlwX3Fvc19idWxrID0gLTE7Ci0Jb3B0aW9ucy0+cmVxdWVzdF90dHkgPSAtMTsKLX0KLQotLyoKLSAqIENhbGxlZCBhZnRlciBwcm9jZXNzaW5nIG90aGVyIHNvdXJjZXMgb2Ygb3B0aW9uIGRhdGEsIHRoaXMgZmlsbHMgdGhvc2UKLSAqIG9wdGlvbnMgZm9yIHdoaWNoIG5vIHZhbHVlIGhhcyBiZWVuIHNwZWNpZmllZCB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotICovCi0KLXZvaWQKLWZpbGxfZGVmYXVsdF9vcHRpb25zKE9wdGlvbnMgKiBvcHRpb25zKQotewotCWludCBsZW47Ci0KLQlpZiAob3B0aW9ucy0+Zm9yd2FyZF9hZ2VudCA9PSAtMSkKLQkJb3B0aW9ucy0+Zm9yd2FyZF9hZ2VudCA9IDA7Ci0JaWYgKG9wdGlvbnMtPmZvcndhcmRfeDExID09IC0xKQotCQlvcHRpb25zLT5mb3J3YXJkX3gxMSA9IDA7Ci0JaWYgKG9wdGlvbnMtPmZvcndhcmRfeDExX3RydXN0ZWQgPT0gLTEpCi0JCW9wdGlvbnMtPmZvcndhcmRfeDExX3RydXN0ZWQgPSAwOwotCWlmIChvcHRpb25zLT5mb3J3YXJkX3gxMV90aW1lb3V0ID09IC0xKQotCQlvcHRpb25zLT5mb3J3YXJkX3gxMV90aW1lb3V0ID0gMTIwMDsKLQlpZiAob3B0aW9ucy0+ZXhpdF9vbl9mb3J3YXJkX2ZhaWx1cmUgPT0gLTEpCi0JCW9wdGlvbnMtPmV4aXRfb25fZm9yd2FyZF9mYWlsdXJlID0gMDsKLQlpZiAob3B0aW9ucy0+eGF1dGhfbG9jYXRpb24gPT0gTlVMTCkKLQkJb3B0aW9ucy0+eGF1dGhfbG9jYXRpb24gPSBfUEFUSF9YQVVUSDsKLQlpZiAob3B0aW9ucy0+Z2F0ZXdheV9wb3J0cyA9PSAtMSkKLQkJb3B0aW9ucy0+Z2F0ZXdheV9wb3J0cyA9IDA7Ci0JaWYgKG9wdGlvbnMtPnVzZV9wcml2aWxlZ2VkX3BvcnQgPT0gLTEpCi0JCW9wdGlvbnMtPnVzZV9wcml2aWxlZ2VkX3BvcnQgPSAwOwotCWlmIChvcHRpb25zLT5yc2FfYXV0aGVudGljYXRpb24gPT0gLTEpCi0JCW9wdGlvbnMtPnJzYV9hdXRoZW50aWNhdGlvbiA9IDE7Ci0JaWYgKG9wdGlvbnMtPnB1YmtleV9hdXRoZW50aWNhdGlvbiA9PSAtMSkKLQkJb3B0aW9ucy0+cHVia2V5X2F1dGhlbnRpY2F0aW9uID0gMTsKLQlpZiAob3B0aW9ucy0+Y2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uID09IC0xKQotCQlvcHRpb25zLT5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24gPSAxOwotCWlmIChvcHRpb25zLT5nc3NfYXV0aGVudGljYXRpb24gPT0gLTEpCi0JCW9wdGlvbnMtPmdzc19hdXRoZW50aWNhdGlvbiA9IDA7Ci0JaWYgKG9wdGlvbnMtPmdzc19kZWxlZ19jcmVkcyA9PSAtMSkKLQkJb3B0aW9ucy0+Z3NzX2RlbGVnX2NyZWRzID0gMDsKLQlpZiAob3B0aW9ucy0+cGFzc3dvcmRfYXV0aGVudGljYXRpb24gPT0gLTEpCi0JCW9wdGlvbnMtPnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uID0gMTsKLQlpZiAob3B0aW9ucy0+a2JkX2ludGVyYWN0aXZlX2F1dGhlbnRpY2F0aW9uID09IC0xKQotCQlvcHRpb25zLT5rYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb24gPSAxOwotCWlmIChvcHRpb25zLT5yaG9zdHNfcnNhX2F1dGhlbnRpY2F0aW9uID09IC0xKQotCQlvcHRpb25zLT5yaG9zdHNfcnNhX2F1dGhlbnRpY2F0aW9uID0gMDsKLQlpZiAob3B0aW9ucy0+aG9zdGJhc2VkX2F1dGhlbnRpY2F0aW9uID09IC0xKQotCQlvcHRpb25zLT5ob3N0YmFzZWRfYXV0aGVudGljYXRpb24gPSAwOwotCWlmIChvcHRpb25zLT5iYXRjaF9tb2RlID09IC0xKQotCQlvcHRpb25zLT5iYXRjaF9tb2RlID0gMDsKLQlpZiAob3B0aW9ucy0+Y2hlY2tfaG9zdF9pcCA9PSAtMSkKLQkJb3B0aW9ucy0+Y2hlY2tfaG9zdF9pcCA9IDE7Ci0JaWYgKG9wdGlvbnMtPnN0cmljdF9ob3N0X2tleV9jaGVja2luZyA9PSAtMSkKLQkJb3B0aW9ucy0+c3RyaWN0X2hvc3Rfa2V5X2NoZWNraW5nID0gMjsJLyogMiBpcyBkZWZhdWx0ICovCi0JaWYgKG9wdGlvbnMtPmNvbXByZXNzaW9uID09IC0xKQotCQlvcHRpb25zLT5jb21wcmVzc2lvbiA9IDA7Ci0JaWYgKG9wdGlvbnMtPnRjcF9rZWVwX2FsaXZlID09IC0xKQotCQlvcHRpb25zLT50Y3Bfa2VlcF9hbGl2ZSA9IDE7Ci0JaWYgKG9wdGlvbnMtPmNvbXByZXNzaW9uX2xldmVsID09IC0xKQotCQlvcHRpb25zLT5jb21wcmVzc2lvbl9sZXZlbCA9IDY7Ci0JaWYgKG9wdGlvbnMtPnBvcnQgPT0gLTEpCi0JCW9wdGlvbnMtPnBvcnQgPSAwOwkvKiBGaWxsZWQgaW4gc3NoX2Nvbm5lY3QuICovCi0JaWYgKG9wdGlvbnMtPmFkZHJlc3NfZmFtaWx5ID09IC0xKQotCQlvcHRpb25zLT5hZGRyZXNzX2ZhbWlseSA9IEFGX1VOU1BFQzsKLQlpZiAob3B0aW9ucy0+Y29ubmVjdGlvbl9hdHRlbXB0cyA9PSAtMSkKLQkJb3B0aW9ucy0+Y29ubmVjdGlvbl9hdHRlbXB0cyA9IDE7Ci0JaWYgKG9wdGlvbnMtPm51bWJlcl9vZl9wYXNzd29yZF9wcm9tcHRzID09IC0xKQotCQlvcHRpb25zLT5udW1iZXJfb2ZfcGFzc3dvcmRfcHJvbXB0cyA9IDM7Ci0JLyogU2VsZWN0ZWQgaW4gc3NoX2xvZ2luKCkuICovCi0JaWYgKG9wdGlvbnMtPmNpcGhlciA9PSAtMSkKLQkJb3B0aW9ucy0+Y2lwaGVyID0gU1NIX0NJUEhFUl9OT1RfU0VUOwotCS8qIG9wdGlvbnMtPmNpcGhlcnMsIGRlZmF1bHQgc2V0IGluIG15cHJvcG9zYWxzLmggKi8KLQkvKiBvcHRpb25zLT5tYWNzLCBkZWZhdWx0IHNldCBpbiBteXByb3Bvc2Fscy5oICovCi0JLyogb3B0aW9ucy0+a2V4X2FsZ29yaXRobXMsIGRlZmF1bHQgc2V0IGluIG15cHJvcG9zYWxzLmggKi8KLQkvKiBvcHRpb25zLT5ob3N0a2V5YWxnb3JpdGhtcywgZGVmYXVsdCBzZXQgaW4gbXlwcm9wb3NhbHMuaCAqLwotCWlmIChvcHRpb25zLT5wcm90b2NvbCA9PSBTU0hfUFJPVE9fVU5LTk9XTikKLQkJb3B0aW9ucy0+cHJvdG9jb2wgPSBTU0hfUFJPVE9fMjsKLQlpZiAob3B0aW9ucy0+bnVtX2lkZW50aXR5X2ZpbGVzID09IDApIHsKLQkJaWYgKG9wdGlvbnMtPnByb3RvY29sICYgU1NIX1BST1RPXzEpIHsKLQkJCWxlbiA9IDIgKyBzdHJsZW4oX1BBVEhfU1NIX0NMSUVOVF9JREVOVElUWSkgKyAxOwotCQkJb3B0aW9ucy0+aWRlbnRpdHlfZmlsZXNbb3B0aW9ucy0+bnVtX2lkZW50aXR5X2ZpbGVzXSA9Ci0JCQkgICAgeG1hbGxvYyhsZW4pOwotCQkJc25wcmludGYob3B0aW9ucy0+aWRlbnRpdHlfZmlsZXNbb3B0aW9ucy0+bnVtX2lkZW50aXR5X2ZpbGVzKytdLAotCQkJICAgIGxlbiwgIn4vJS4xMDBzIiwgX1BBVEhfU1NIX0NMSUVOVF9JREVOVElUWSk7Ci0JCX0KLQkJaWYgKG9wdGlvbnMtPnByb3RvY29sICYgU1NIX1BST1RPXzIpIHsKLQkJCWxlbiA9IDIgKyBzdHJsZW4oX1BBVEhfU1NIX0NMSUVOVF9JRF9SU0EpICsgMTsKLQkJCW9wdGlvbnMtPmlkZW50aXR5X2ZpbGVzW29wdGlvbnMtPm51bV9pZGVudGl0eV9maWxlc10gPQotCQkJICAgIHhtYWxsb2MobGVuKTsKLQkJCXNucHJpbnRmKG9wdGlvbnMtPmlkZW50aXR5X2ZpbGVzW29wdGlvbnMtPm51bV9pZGVudGl0eV9maWxlcysrXSwKLQkJCSAgICBsZW4sICJ+LyUuMTAwcyIsIF9QQVRIX1NTSF9DTElFTlRfSURfUlNBKTsKLQotCQkJbGVuID0gMiArIHN0cmxlbihfUEFUSF9TU0hfQ0xJRU5UX0lEX0RTQSkgKyAxOwotCQkJb3B0aW9ucy0+aWRlbnRpdHlfZmlsZXNbb3B0aW9ucy0+bnVtX2lkZW50aXR5X2ZpbGVzXSA9Ci0JCQkgICAgeG1hbGxvYyhsZW4pOwotCQkJc25wcmludGYob3B0aW9ucy0+aWRlbnRpdHlfZmlsZXNbb3B0aW9ucy0+bnVtX2lkZW50aXR5X2ZpbGVzKytdLAotCQkJICAgIGxlbiwgIn4vJS4xMDBzIiwgX1BBVEhfU1NIX0NMSUVOVF9JRF9EU0EpOwotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCQkJbGVuID0gMiArIHN0cmxlbihfUEFUSF9TU0hfQ0xJRU5UX0lEX0VDRFNBKSArIDE7Ci0JCQlvcHRpb25zLT5pZGVudGl0eV9maWxlc1tvcHRpb25zLT5udW1faWRlbnRpdHlfZmlsZXNdID0KLQkJCSAgICB4bWFsbG9jKGxlbik7Ci0JCQlzbnByaW50ZihvcHRpb25zLT5pZGVudGl0eV9maWxlc1tvcHRpb25zLT5udW1faWRlbnRpdHlfZmlsZXMrK10sCi0JCQkgICAgbGVuLCAifi8lLjEwMHMiLCBfUEFUSF9TU0hfQ0xJRU5UX0lEX0VDRFNBKTsKLSNlbmRpZgotCQl9Ci0JfQotCWlmIChvcHRpb25zLT5lc2NhcGVfY2hhciA9PSAtMSkKLQkJb3B0aW9ucy0+ZXNjYXBlX2NoYXIgPSAnfic7Ci0JaWYgKG9wdGlvbnMtPm51bV9zeXN0ZW1faG9zdGZpbGVzID09IDApIHsKLQkJb3B0aW9ucy0+c3lzdGVtX2hvc3RmaWxlc1tvcHRpb25zLT5udW1fc3lzdGVtX2hvc3RmaWxlcysrXSA9Ci0JCSAgICB4c3RyZHVwKF9QQVRIX1NTSF9TWVNURU1fSE9TVEZJTEUpOwotCQlvcHRpb25zLT5zeXN0ZW1faG9zdGZpbGVzW29wdGlvbnMtPm51bV9zeXN0ZW1faG9zdGZpbGVzKytdID0KLQkJICAgIHhzdHJkdXAoX1BBVEhfU1NIX1NZU1RFTV9IT1NURklMRTIpOwotCX0KLQlpZiAob3B0aW9ucy0+bnVtX3VzZXJfaG9zdGZpbGVzID09IDApIHsKLQkJb3B0aW9ucy0+dXNlcl9ob3N0ZmlsZXNbb3B0aW9ucy0+bnVtX3VzZXJfaG9zdGZpbGVzKytdID0KLQkJICAgIHhzdHJkdXAoX1BBVEhfU1NIX1VTRVJfSE9TVEZJTEUpOwotCQlvcHRpb25zLT51c2VyX2hvc3RmaWxlc1tvcHRpb25zLT5udW1fdXNlcl9ob3N0ZmlsZXMrK10gPQotCQkgICAgeHN0cmR1cChfUEFUSF9TU0hfVVNFUl9IT1NURklMRTIpOwotCX0KLQlpZiAob3B0aW9ucy0+bG9nX2xldmVsID09IFNZU0xPR19MRVZFTF9OT1RfU0VUKQotCQlvcHRpb25zLT5sb2dfbGV2ZWwgPSBTWVNMT0dfTEVWRUxfSU5GTzsKLQlpZiAob3B0aW9ucy0+Y2xlYXJfZm9yd2FyZGluZ3MgPT0gMSkKLQkJY2xlYXJfZm9yd2FyZGluZ3Mob3B0aW9ucyk7Ci0JaWYgKG9wdGlvbnMtPm5vX2hvc3RfYXV0aGVudGljYXRpb25fZm9yX2xvY2FsaG9zdCA9PSAtIDEpCi0JCW9wdGlvbnMtPm5vX2hvc3RfYXV0aGVudGljYXRpb25fZm9yX2xvY2FsaG9zdCA9IDA7Ci0JaWYgKG9wdGlvbnMtPmlkZW50aXRpZXNfb25seSA9PSAtMSkKLQkJb3B0aW9ucy0+aWRlbnRpdGllc19vbmx5ID0gMDsKLQlpZiAob3B0aW9ucy0+ZW5hYmxlX3NzaF9rZXlzaWduID09IC0xKQotCQlvcHRpb25zLT5lbmFibGVfc3NoX2tleXNpZ24gPSAwOwotCWlmIChvcHRpb25zLT5yZWtleV9saW1pdCA9PSAtMSkKLQkJb3B0aW9ucy0+cmVrZXlfbGltaXQgPSAwOwotCWlmIChvcHRpb25zLT52ZXJpZnlfaG9zdF9rZXlfZG5zID09IC0xKQotCQlvcHRpb25zLT52ZXJpZnlfaG9zdF9rZXlfZG5zID0gMDsKLQlpZiAob3B0aW9ucy0+c2VydmVyX2FsaXZlX2ludGVydmFsID09IC0xKQotCQlvcHRpb25zLT5zZXJ2ZXJfYWxpdmVfaW50ZXJ2YWwgPSAwOwotCWlmIChvcHRpb25zLT5zZXJ2ZXJfYWxpdmVfY291bnRfbWF4ID09IC0xKQotCQlvcHRpb25zLT5zZXJ2ZXJfYWxpdmVfY291bnRfbWF4ID0gMzsKLQlpZiAob3B0aW9ucy0+Y29udHJvbF9tYXN0ZXIgPT0gLTEpCi0JCW9wdGlvbnMtPmNvbnRyb2xfbWFzdGVyID0gMDsKLQlpZiAob3B0aW9ucy0+Y29udHJvbF9wZXJzaXN0ID09IC0xKSB7Ci0JCW9wdGlvbnMtPmNvbnRyb2xfcGVyc2lzdCA9IDA7Ci0JCW9wdGlvbnMtPmNvbnRyb2xfcGVyc2lzdF90aW1lb3V0ID0gMDsKLQl9Ci0JaWYgKG9wdGlvbnMtPmhhc2hfa25vd25faG9zdHMgPT0gLTEpCi0JCW9wdGlvbnMtPmhhc2hfa25vd25faG9zdHMgPSAwOwotCWlmIChvcHRpb25zLT50dW5fb3BlbiA9PSAtMSkKLQkJb3B0aW9ucy0+dHVuX29wZW4gPSBTU0hfVFVOTU9ERV9OTzsKLQlpZiAob3B0aW9ucy0+dHVuX2xvY2FsID09IC0xKQotCQlvcHRpb25zLT50dW5fbG9jYWwgPSBTU0hfVFVOSURfQU5ZOwotCWlmIChvcHRpb25zLT50dW5fcmVtb3RlID09IC0xKQotCQlvcHRpb25zLT50dW5fcmVtb3RlID0gU1NIX1RVTklEX0FOWTsKLQlpZiAob3B0aW9ucy0+cGVybWl0X2xvY2FsX2NvbW1hbmQgPT0gLTEpCi0JCW9wdGlvbnMtPnBlcm1pdF9sb2NhbF9jb21tYW5kID0gMDsKLQlpZiAob3B0aW9ucy0+dXNlX3JvYW1pbmcgPT0gLTEpCi0JCW9wdGlvbnMtPnVzZV9yb2FtaW5nID0gMTsKLQlpZiAob3B0aW9ucy0+dmlzdWFsX2hvc3Rfa2V5ID09IC0xKQotCQlvcHRpb25zLT52aXN1YWxfaG9zdF9rZXkgPSAwOwotCWlmIChvcHRpb25zLT56ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbiA9PSAtMSkKLQkJb3B0aW9ucy0+emVyb19rbm93bGVkZ2VfcGFzc3dvcmRfYXV0aGVudGljYXRpb24gPSAwOwotCWlmIChvcHRpb25zLT5pcF9xb3NfaW50ZXJhY3RpdmUgPT0gLTEpCi0JCW9wdGlvbnMtPmlwX3Fvc19pbnRlcmFjdGl2ZSA9IElQVE9TX0xPV0RFTEFZOwotCWlmIChvcHRpb25zLT5pcF9xb3NfYnVsayA9PSAtMSkKLQkJb3B0aW9ucy0+aXBfcW9zX2J1bGsgPSBJUFRPU19USFJPVUdIUFVUOwotCWlmIChvcHRpb25zLT5yZXF1ZXN0X3R0eSA9PSAtMSkKLQkJb3B0aW9ucy0+cmVxdWVzdF90dHkgPSBSRVFVRVNUX1RUWV9BVVRPOwotCS8qIG9wdGlvbnMtPmxvY2FsX2NvbW1hbmQgc2hvdWxkIG5vdCBiZSBzZXQgYnkgZGVmYXVsdCAqLwotCS8qIG9wdGlvbnMtPnByb3h5X2NvbW1hbmQgc2hvdWxkIG5vdCBiZSBzZXQgYnkgZGVmYXVsdCAqLwotCS8qIG9wdGlvbnMtPnVzZXIgd2lsbCBiZSBzZXQgaW4gdGhlIG1haW4gcHJvZ3JhbSBpZiBhcHByb3ByaWF0ZSAqLwotCS8qIG9wdGlvbnMtPmhvc3RuYW1lIHdpbGwgYmUgc2V0IGluIHRoZSBtYWluIHByb2dyYW0gaWYgYXBwcm9wcmlhdGUgKi8KLQkvKiBvcHRpb25zLT5ob3N0X2tleV9hbGlhcyBzaG91bGQgbm90IGJlIHNldCBieSBkZWZhdWx0ICovCi0JLyogb3B0aW9ucy0+cHJlZmVycmVkX2F1dGhlbnRpY2F0aW9ucyB3aWxsIGJlIHNldCBpbiBzc2ggKi8KLX0KLQotLyoKLSAqIHBhcnNlX2ZvcndhcmQKLSAqIHBhcnNlcyBhIHN0cmluZyBjb250YWluaW5nIGEgcG9ydCBmb3J3YXJkaW5nIHNwZWNpZmljYXRpb24gb2YgdGhlIGZvcm06Ci0gKiAgIGR5bmFtaWNmd2QgPT0gMAotICoJW2xpc3Rlbmhvc3Q6XWxpc3RlbnBvcnQ6Y29ubmVjdGhvc3Q6Y29ubmVjdHBvcnQKLSAqICAgZHluYW1pY2Z3ZCA9PSAxCi0gKglbbGlzdGVuaG9zdDpdbGlzdGVucG9ydAotICogcmV0dXJucyBudW1iZXIgb2YgYXJndW1lbnRzIHBhcnNlZCBvciB6ZXJvIG9uIGVycm9yCi0gKi8KLWludAotcGFyc2VfZm9yd2FyZChGb3J3YXJkICpmd2QsIGNvbnN0IGNoYXIgKmZ3ZHNwZWMsIGludCBkeW5hbWljZndkLCBpbnQgcmVtb3RlZndkKQotewotCWludCBpOwotCWNoYXIgKnAsICpjcCwgKmZ3ZGFyZ1s0XTsKLQotCW1lbXNldChmd2QsICdcMCcsIHNpemVvZigqZndkKSk7Ci0KLQljcCA9IHAgPSB4c3RyZHVwKGZ3ZHNwZWMpOwotCi0JLyogc2tpcCBsZWFkaW5nIHNwYWNlcyAqLwotCXdoaWxlIChpc3NwYWNlKCpjcCkpCi0JCWNwKys7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQotCQlpZiAoKGZ3ZGFyZ1tpXSA9IGhwZGVsaW0oJmNwKSkgPT0gTlVMTCkKLQkJCWJyZWFrOwotCi0JLyogQ2hlY2sgZm9yIHRyYWlsaW5nIGdhcmJhZ2UgKi8KLQlpZiAoY3AgIT0gTlVMTCkKLQkJaSA9IDA7CS8qIGZhaWx1cmUgKi8KLQotCXN3aXRjaCAoaSkgewotCWNhc2UgMToKLQkJZndkLT5saXN0ZW5faG9zdCA9IE5VTEw7Ci0JCWZ3ZC0+bGlzdGVuX3BvcnQgPSBhMnBvcnQoZndkYXJnWzBdKTsKLQkJZndkLT5jb25uZWN0X2hvc3QgPSB4c3RyZHVwKCJzb2NrcyIpOwotCQlicmVhazsKLQotCWNhc2UgMjoKLQkJZndkLT5saXN0ZW5faG9zdCA9IHhzdHJkdXAoY2xlYW5ob3N0bmFtZShmd2RhcmdbMF0pKTsKLQkJZndkLT5saXN0ZW5fcG9ydCA9IGEycG9ydChmd2RhcmdbMV0pOwotCQlmd2QtPmNvbm5lY3RfaG9zdCA9IHhzdHJkdXAoInNvY2tzIik7Ci0JCWJyZWFrOwotCi0JY2FzZSAzOgotCQlmd2QtPmxpc3Rlbl9ob3N0ID0gTlVMTDsKLQkJZndkLT5saXN0ZW5fcG9ydCA9IGEycG9ydChmd2RhcmdbMF0pOwotCQlmd2QtPmNvbm5lY3RfaG9zdCA9IHhzdHJkdXAoY2xlYW5ob3N0bmFtZShmd2RhcmdbMV0pKTsKLQkJZndkLT5jb25uZWN0X3BvcnQgPSBhMnBvcnQoZndkYXJnWzJdKTsKLQkJYnJlYWs7Ci0KLQljYXNlIDQ6Ci0JCWZ3ZC0+bGlzdGVuX2hvc3QgPSB4c3RyZHVwKGNsZWFuaG9zdG5hbWUoZndkYXJnWzBdKSk7Ci0JCWZ3ZC0+bGlzdGVuX3BvcnQgPSBhMnBvcnQoZndkYXJnWzFdKTsKLQkJZndkLT5jb25uZWN0X2hvc3QgPSB4c3RyZHVwKGNsZWFuaG9zdG5hbWUoZndkYXJnWzJdKSk7Ci0JCWZ3ZC0+Y29ubmVjdF9wb3J0ID0gYTJwb3J0KGZ3ZGFyZ1szXSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWkgPSAwOyAvKiBmYWlsdXJlICovCi0JfQotCi0JeGZyZWUocCk7Ci0KLQlpZiAoZHluYW1pY2Z3ZCkgewotCQlpZiAoIShpID09IDEgfHwgaSA9PSAyKSkKLQkJCWdvdG8gZmFpbF9mcmVlOwotCX0gZWxzZSB7Ci0JCWlmICghKGkgPT0gMyB8fCBpID09IDQpKQotCQkJZ290byBmYWlsX2ZyZWU7Ci0JCWlmIChmd2QtPmNvbm5lY3RfcG9ydCA8PSAwKQotCQkJZ290byBmYWlsX2ZyZWU7Ci0JfQotCi0JaWYgKGZ3ZC0+bGlzdGVuX3BvcnQgPCAwIHx8ICghcmVtb3RlZndkICYmIGZ3ZC0+bGlzdGVuX3BvcnQgPT0gMCkpCi0JCWdvdG8gZmFpbF9mcmVlOwotCi0JaWYgKGZ3ZC0+Y29ubmVjdF9ob3N0ICE9IE5VTEwgJiYKLQkgICAgc3RybGVuKGZ3ZC0+Y29ubmVjdF9ob3N0KSA+PSBOSV9NQVhIT1NUKQotCQlnb3RvIGZhaWxfZnJlZTsKLQlpZiAoZndkLT5saXN0ZW5faG9zdCAhPSBOVUxMICYmCi0JICAgIHN0cmxlbihmd2QtPmxpc3Rlbl9ob3N0KSA+PSBOSV9NQVhIT1NUKQotCQlnb3RvIGZhaWxfZnJlZTsKLQotCi0JcmV0dXJuIChpKTsKLQotIGZhaWxfZnJlZToKLQlpZiAoZndkLT5jb25uZWN0X2hvc3QgIT0gTlVMTCkgewotCQl4ZnJlZShmd2QtPmNvbm5lY3RfaG9zdCk7Ci0JCWZ3ZC0+Y29ubmVjdF9ob3N0ID0gTlVMTDsKLQl9Ci0JaWYgKGZ3ZC0+bGlzdGVuX2hvc3QgIT0gTlVMTCkgewotCQl4ZnJlZShmd2QtPmxpc3Rlbl9ob3N0KTsKLQkJZndkLT5saXN0ZW5faG9zdCA9IE5VTEw7Ci0JfQotCXJldHVybiAoMCk7Ci19CmRpZmYgLS1naXQgYS9yZWFkY29uZi5oIGIvcmVhZGNvbmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0NGNmZi4uMDAwMDAwMAotLS0gYS9yZWFkY29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qICRPcGVuQlNEOiByZWFkY29uZi5oLHYgMS45MCAyMDExLzA1LzI0IDA3OjE1OjQ3IGRqbSBFeHAgJCAqLwotCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogRnVuY3Rpb25zIGZvciByZWFkaW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotCi0jaWZuZGVmIFJFQURDT05GX0gKLSNkZWZpbmUgUkVBRENPTkZfSAotCi0vKiBEYXRhIHN0cnVjdHVyZSBmb3IgcmVwcmVzZW50aW5nIGEgZm9yd2FyZGluZyByZXF1ZXN0LiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JY2hhcgkgKmxpc3Rlbl9ob3N0OwkJLyogSG9zdCAoYWRkcmVzcykgdG8gbGlzdGVuIG9uLiAqLwotCWludAkgIGxpc3Rlbl9wb3J0OwkJLyogUG9ydCB0byBmb3J3YXJkLiAqLwotCWNoYXIJICpjb25uZWN0X2hvc3Q7CQkvKiBIb3N0IHRvIGNvbm5lY3QuICovCi0JaW50CSAgY29ubmVjdF9wb3J0OwkJLyogUG9ydCB0byBjb25uZWN0IG9uIGNvbm5lY3RfaG9zdC4gKi8KLQlpbnQJICBhbGxvY2F0ZWRfcG9ydDsJLyogRHluYW1pY2FsbHkgYWxsb2NhdGVkIGxpc3RlbiBwb3J0ICovCi19ICAgICAgIEZvcndhcmQ7Ci0vKiBEYXRhIHN0cnVjdHVyZSBmb3IgcmVwcmVzZW50aW5nIG9wdGlvbiBkYXRhLiAqLwotCi0jZGVmaW5lIE1BWF9TRU5EX0VOVgkJMjU2Ci0jZGVmaW5lIFNTSF9NQVhfSE9TVFNfRklMRVMJMjU2Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgICAgIGZvcndhcmRfYWdlbnQ7CS8qIEZvcndhcmQgYXV0aGVudGljYXRpb24gYWdlbnQuICovCi0JaW50ICAgICBmb3J3YXJkX3gxMTsJLyogRm9yd2FyZCBYMTEgZGlzcGxheS4gKi8KLQlpbnQgICAgIGZvcndhcmRfeDExX3RpbWVvdXQ7CS8qIEV4cGlyYXRpb24gZm9yIENvb2tpZXMgKi8KLQlpbnQgICAgIGZvcndhcmRfeDExX3RydXN0ZWQ7CS8qIFRydXN0IEZvcndhcmQgWDExIGRpc3BsYXkuICovCi0JaW50ICAgICBleGl0X29uX2ZvcndhcmRfZmFpbHVyZTsJLyogRXhpdCBpZiBiaW5kKDIpIGZhaWxzIGZvciAtTC8tUiAqLwotCWNoYXIgICAqeGF1dGhfbG9jYXRpb247CS8qIExvY2F0aW9uIGZvciB4YXV0aCBwcm9ncmFtICovCi0JaW50ICAgICBnYXRld2F5X3BvcnRzOwkvKiBBbGxvdyByZW1vdGUgY29ubmVjdHMgdG8gZm9yd2FyZGVkIHBvcnRzLiAqLwotCWludCAgICAgdXNlX3ByaXZpbGVnZWRfcG9ydDsJLyogRG9uJ3QgdXNlIHByaXZpbGVnZWQgcG9ydCBpZiBmYWxzZS4gKi8KLQlpbnQgICAgIHJob3N0c19yc2FfYXV0aGVudGljYXRpb247CS8qIFRyeSByaG9zdHMgd2l0aCBSU0EKLQkJCQkJCSAqIGF1dGhlbnRpY2F0aW9uLiAqLwotCWludCAgICAgcnNhX2F1dGhlbnRpY2F0aW9uOwkvKiBUcnkgUlNBIGF1dGhlbnRpY2F0aW9uLiAqLwotCWludCAgICAgcHVia2V5X2F1dGhlbnRpY2F0aW9uOwkvKiBUcnkgc3NoMiBwdWJrZXkgYXV0aGVudGljYXRpb24uICovCi0JaW50ICAgICBob3N0YmFzZWRfYXV0aGVudGljYXRpb247CS8qIHNzaDIncyByaG9zdHNfcnNhICovCi0JaW50ICAgICBjaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb247Ci0JCQkJCS8qIFRyeSBTL0tleSBvciBUSVMsIGF1dGhlbnRpY2F0aW9uLiAqLwotCWludCAgICAgZ3NzX2F1dGhlbnRpY2F0aW9uOwkvKiBUcnkgR1NTIGF1dGhlbnRpY2F0aW9uICovCi0JaW50ICAgICBnc3NfZGVsZWdfY3JlZHM7CS8qIERlbGVnYXRlIEdTUyBjcmVkZW50aWFscyAqLwotCWludCAgICAgcGFzc3dvcmRfYXV0aGVudGljYXRpb247CS8qIFRyeSBwYXNzd29yZAotCQkJCQkJICogYXV0aGVudGljYXRpb24uICovCi0JaW50ICAgICBrYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb247IC8qIFRyeSBrZXlib2FyZC1pbnRlcmFjdGl2ZSBhdXRoLiAqLwotCWNoYXIJKmtiZF9pbnRlcmFjdGl2ZV9kZXZpY2VzOyAvKiBLZXlib2FyZC1pbnRlcmFjdGl2ZSBhdXRoIGRldmljZXMuICovCi0JaW50ICAgICB6ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbjsJLyogVHJ5IGpwYWtlICovCi0JaW50ICAgICBiYXRjaF9tb2RlOwkvKiBCYXRjaCBtb2RlOiBkbyBub3QgYXNrIGZvciBwYXNzd29yZHMuICovCi0JaW50ICAgICBjaGVja19ob3N0X2lwOwkvKiBBbHNvIGtlZXAgdHJhY2sgb2Yga2V5cyBmb3IgSVAgYWRkcmVzcyAqLwotCWludCAgICAgc3RyaWN0X2hvc3Rfa2V5X2NoZWNraW5nOwkvKiBTdHJpY3QgaG9zdCBrZXkgY2hlY2tpbmcuICovCi0JaW50ICAgICBjb21wcmVzc2lvbjsJLyogQ29tcHJlc3MgcGFja2V0cyBpbiBib3RoIGRpcmVjdGlvbnMuICovCi0JaW50ICAgICBjb21wcmVzc2lvbl9sZXZlbDsJLyogQ29tcHJlc3Npb24gbGV2ZWwgMSAoZmFzdCkgdG8gOQotCQkJCQkgKiAoYmVzdCkuICovCi0JaW50ICAgICB0Y3Bfa2VlcF9hbGl2ZTsJLyogU2V0IFNPX0tFRVBBTElWRS4gKi8KLQlpbnQJaXBfcW9zX2ludGVyYWN0aXZlOwkvKiBJUCBUb1MvRFNDUC9jbGFzcyBmb3IgaW50ZXJhY3RpdmUgKi8KLQlpbnQJaXBfcW9zX2J1bGs7CQkvKiBJUCBUb1MvRFNDUC9jbGFzcyBmb3IgYnVsayB0cmFmZmljICovCi0JTG9nTGV2ZWwgbG9nX2xldmVsOwkvKiBMZXZlbCBmb3IgbG9nZ2luZy4gKi8KLQotCWludCAgICAgcG9ydDsJCS8qIFBvcnQgdG8gY29ubmVjdC4gKi8KLQlpbnQgICAgIGFkZHJlc3NfZmFtaWx5OwotCWludCAgICAgY29ubmVjdGlvbl9hdHRlbXB0czsJLyogTWF4IGF0dGVtcHRzIChzZWNvbmRzKSBiZWZvcmUKLQkJCQkJICogZ2l2aW5nIHVwICovCi0JaW50ICAgICBjb25uZWN0aW9uX3RpbWVvdXQ7CS8qIE1heCB0aW1lIChzZWNvbmRzKSBiZWZvcmUKLQkJCQkJICogYWJvcnRpbmcgY29ubmVjdGlvbiBhdHRlbXB0ICovCi0JaW50ICAgICBudW1iZXJfb2ZfcGFzc3dvcmRfcHJvbXB0czsJLyogTWF4IG51bWJlciBvZiBwYXNzd29yZAotCQkJCQkJICogcHJvbXB0cy4gKi8KLQlpbnQgICAgIGNpcGhlcjsJCS8qIENpcGhlciB0byB1c2UuICovCi0JY2hhciAgICpjaXBoZXJzOwkvKiBTU0gyIGNpcGhlcnMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4gKi8KLQljaGFyICAgKm1hY3M7CQkvKiBTU0gyIG1hY3MgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4gKi8KLQljaGFyICAgKmhvc3RrZXlhbGdvcml0aG1zOwkvKiBTU0gyIHNlcnZlciBrZXkgdHlwZXMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4gKi8KLQljaGFyICAgKmtleF9hbGdvcml0aG1zOwkvKiBTU0gyIGtleCBtZXRob2RzIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuICovCi0JaW50CXByb3RvY29sOwkvKiBQcm90b2NvbCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLiAqLwotCWNoYXIgICAqaG9zdG5hbWU7CS8qIFJlYWwgaG9zdCB0byBjb25uZWN0LiAqLwotCWNoYXIgICAqaG9zdF9rZXlfYWxpYXM7CS8qIGhvc3RuYW1lIGFsaWFzIGZvciAuc3NoL2tub3duX2hvc3RzICovCi0JY2hhciAgICpwcm94eV9jb21tYW5kOwkvKiBQcm94eSBjb21tYW5kIGZvciBjb25uZWN0aW5nIHRoZSBob3N0LiAqLwotCWNoYXIgICAqdXNlcjsJCS8qIFVzZXIgdG8gbG9nIGluIGFzLiAqLwotCWludCAgICAgZXNjYXBlX2NoYXI7CS8qIEVzY2FwZSBjaGFyYWN0ZXI7IC0yID0gbm9uZSAqLwotCi0JdV9pbnQJbnVtX3N5c3RlbV9ob3N0ZmlsZXM7CS8qIFBhdGhzIGZvciAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMgKi8KLQljaGFyICAgKnN5c3RlbV9ob3N0ZmlsZXNbU1NIX01BWF9IT1NUU19GSUxFU107Ci0JdV9pbnQJbnVtX3VzZXJfaG9zdGZpbGVzOwkvKiBQYXRoIGZvciAkSE9NRS8uc3NoL2tub3duX2hvc3RzICovCi0JY2hhciAgICp1c2VyX2hvc3RmaWxlc1tTU0hfTUFYX0hPU1RTX0ZJTEVTXTsKLQljaGFyICAgKnByZWZlcnJlZF9hdXRoZW50aWNhdGlvbnM7Ci0JY2hhciAgICpiaW5kX2FkZHJlc3M7CS8qIGxvY2FsIHNvY2tldCBhZGRyZXNzIGZvciBjb25uZWN0aW9uIHRvIHNzaGQgKi8KLQljaGFyICAgKnBrY3MxMV9wcm92aWRlcjsgLyogUEtDUyMxMSBwcm92aWRlciAqLwotCWludAl2ZXJpZnlfaG9zdF9rZXlfZG5zOwkvKiBWZXJpZnkgaG9zdCBrZXkgdXNpbmcgRE5TICovCi0KLQlpbnQgICAgIG51bV9pZGVudGl0eV9maWxlczsJLyogTnVtYmVyIG9mIGZpbGVzIGZvciBSU0EvRFNBIGlkZW50aXRpZXMuICovCi0JY2hhciAgICppZGVudGl0eV9maWxlc1tTU0hfTUFYX0lERU5USVRZX0ZJTEVTXTsKLQlLZXkgICAgKmlkZW50aXR5X2tleXNbU1NIX01BWF9JREVOVElUWV9GSUxFU107Ci0KLQkvKiBMb2NhbCBUQ1AvSVAgZm9yd2FyZCByZXF1ZXN0cy4gKi8KLQlpbnQgICAgIG51bV9sb2NhbF9mb3J3YXJkczsKLQlGb3J3YXJkICpsb2NhbF9mb3J3YXJkczsKLQotCS8qIFJlbW90ZSBUQ1AvSVAgZm9yd2FyZCByZXF1ZXN0cy4gKi8KLQlpbnQgICAgIG51bV9yZW1vdGVfZm9yd2FyZHM7Ci0JRm9yd2FyZCAqcmVtb3RlX2ZvcndhcmRzOwotCWludAljbGVhcl9mb3J3YXJkaW5nczsKLQotCWludAllbmFibGVfc3NoX2tleXNpZ247Ci0JaW50NjRfdCByZWtleV9saW1pdDsKLQlpbnQJbm9faG9zdF9hdXRoZW50aWNhdGlvbl9mb3JfbG9jYWxob3N0OwotCWludAlpZGVudGl0aWVzX29ubHk7Ci0JaW50CXNlcnZlcl9hbGl2ZV9pbnRlcnZhbDsKLQlpbnQJc2VydmVyX2FsaXZlX2NvdW50X21heDsKLQotCWludCAgICAgbnVtX3NlbmRfZW52OwotCWNoYXIgICAqc2VuZF9lbnZbTUFYX1NFTkRfRU5WXTsKLQotCWNoYXIJKmNvbnRyb2xfcGF0aDsKLQlpbnQJY29udHJvbF9tYXN0ZXI7Ci0JaW50ICAgICBjb250cm9sX3BlcnNpc3Q7IC8qIENvbnRyb2xQZXJzaXN0IGZsYWcgKi8KLQlpbnQgICAgIGNvbnRyb2xfcGVyc2lzdF90aW1lb3V0OyAvKiBDb250cm9sUGVyc2lzdCB0aW1lb3V0IChzZWNvbmRzKSAqLwotCi0JaW50CWhhc2hfa25vd25faG9zdHM7Ci0KLQlpbnQJdHVuX29wZW47CS8qIHR1big0KSAqLwotCWludCAgICAgdHVuX2xvY2FsOwkvKiBmb3JjZSB0dW4gZGV2aWNlIChvcHRpb25hbCkgKi8KLQlpbnQgICAgIHR1bl9yZW1vdGU7CS8qIGZvcmNlIHR1biBkZXZpY2UgKG9wdGlvbmFsKSAqLwotCi0JY2hhcgkqbG9jYWxfY29tbWFuZDsKLQlpbnQJcGVybWl0X2xvY2FsX2NvbW1hbmQ7Ci0JaW50CXZpc3VhbF9ob3N0X2tleTsKLQotCWludAl1c2Vfcm9hbWluZzsKLQotCWludAlyZXF1ZXN0X3R0eTsKLX0gICAgICAgT3B0aW9uczsKLQotI2RlZmluZSBTU0hDVExfTUFTVEVSX05PCTAKLSNkZWZpbmUgU1NIQ1RMX01BU1RFUl9ZRVMJMQotI2RlZmluZSBTU0hDVExfTUFTVEVSX0FVVE8JMgotI2RlZmluZSBTU0hDVExfTUFTVEVSX0FTSwkzCi0jZGVmaW5lIFNTSENUTF9NQVNURVJfQVVUT19BU0sJNAotCi0jZGVmaW5lIFJFUVVFU1RfVFRZX0FVVE8JMAotI2RlZmluZSBSRVFVRVNUX1RUWV9OTwkJMQotI2RlZmluZSBSRVFVRVNUX1RUWV9ZRVMJCTIKLSNkZWZpbmUgUkVRVUVTVF9UVFlfRk9SQ0UJMwotCi12b2lkICAgICBpbml0aWFsaXplX29wdGlvbnMoT3B0aW9ucyAqKTsKLXZvaWQgICAgIGZpbGxfZGVmYXVsdF9vcHRpb25zKE9wdGlvbnMgKik7Ci1pbnQJIHJlYWRfY29uZmlnX2ZpbGUoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIE9wdGlvbnMgKiwgaW50KTsKLWludAkgcGFyc2VfZm9yd2FyZChGb3J3YXJkICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOwotCi1pbnQKLXByb2Nlc3NfY29uZmlnX2xpbmUoT3B0aW9ucyAqLCBjb25zdCBjaGFyICosIGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCAqKTsKLQotdm9pZAkgYWRkX2xvY2FsX2ZvcndhcmQoT3B0aW9ucyAqLCBjb25zdCBGb3J3YXJkICopOwotdm9pZAkgYWRkX3JlbW90ZV9mb3J3YXJkKE9wdGlvbnMgKiwgY29uc3QgRm9yd2FyZCAqKTsKLQotI2VuZGlmCQkJCS8qIFJFQURDT05GX0ggKi8KZGlmZiAtLWdpdCBhL3JlYWRwYXNzLmMgYi9yZWFkcGFzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTljOGVmLi4wMDAwMDAwCi0tLSBhL3JlYWRwYXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHJlYWRwYXNzLmMsdiAxLjQ4IDIwMTAvMTIvMTUgMDA6NDk6MjcgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaWZkZWYgSEFWRV9QQVRIU19ICi0jIGluY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJwYXRobmFtZXMuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJzc2guaCIKLSNpbmNsdWRlICJ1aWRzd2FwLmgiCi0KLXN0YXRpYyBjaGFyICoKLXNzaF9hc2twYXNzKGNoYXIgKmFza3Bhc3MsIGNvbnN0IGNoYXIgKm1zZykKLXsKLQlwaWRfdCBwaWQsIHJldDsKLQlzaXplX3QgbGVuOwotCWNoYXIgKnBhc3M7Ci0JaW50IHBbMl0sIHN0YXR1czsKLQljaGFyIGJ1ZlsxMDI0XTsKLQl2b2lkICgqb3NpZ2NobGQpKGludCk7Ci0KLQlpZiAoZmZsdXNoKHN0ZG91dCkgIT0gMCkKLQkJZXJyb3IoInNzaF9hc2twYXNzOiBmZmx1c2g6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoYXNrcGFzcyA9PSBOVUxMKQotCQlmYXRhbCgiaW50ZXJuYWwgZXJyb3I6IGFza3Bhc3MgdW5kZWZpbmVkIik7Ci0JaWYgKHBpcGUocCkgPCAwKSB7Ci0JCWVycm9yKCJzc2hfYXNrcGFzczogcGlwZTogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb3NpZ2NobGQgPSBzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7Ci0JaWYgKChwaWQgPSBmb3JrKCkpIDwgMCkgewotCQllcnJvcigic3NoX2Fza3Bhc3M6IGZvcms6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJc2lnbmFsKFNJR0NITEQsIG9zaWdjaGxkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChwaWQgPT0gMCkgewotCQlwZXJtYW5lbnRseV9kcm9wX3N1aWQoZ2V0dWlkKCkpOwotCQljbG9zZShwWzBdKTsKLQkJaWYgKGR1cDIocFsxXSwgU1RET1VUX0ZJTEVOTykgPCAwKQotCQkJZmF0YWwoInNzaF9hc2twYXNzOiBkdXAyOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWV4ZWNscChhc2twYXNzLCBhc2twYXNzLCBtc2csIChjaGFyICopIDApOwotCQlmYXRhbCgic3NoX2Fza3Bhc3M6IGV4ZWMoJXMpOiAlcyIsIGFza3Bhc3MsIHN0cmVycm9yKGVycm5vKSk7Ci0JfQotCWNsb3NlKHBbMV0pOwotCi0JbGVuID0gMDsKLQlkbyB7Ci0JCXNzaXplX3QgciA9IHJlYWQocFswXSwgYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIDEgLSBsZW4pOwotCi0JCWlmIChyID09IC0xICYmIGVycm5vID09IEVJTlRSKQotCQkJY29udGludWU7Ci0JCWlmIChyIDw9IDApCi0JCQlicmVhazsKLQkJbGVuICs9IHI7Ci0JfSB3aGlsZSAoc2l6ZW9mKGJ1ZikgLSAxIC0gbGVuID4gMCk7Ci0JYnVmW2xlbl0gPSAnXDAnOwotCi0JY2xvc2UocFswXSk7Ci0Jd2hpbGUgKChyZXQgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkpIDwgMCkKLQkJaWYgKGVycm5vICE9IEVJTlRSKQotCQkJYnJlYWs7Ci0Jc2lnbmFsKFNJR0NITEQsIG9zaWdjaGxkKTsKLQlpZiAocmV0ID09IC0xIHx8ICFXSUZFWElURUQoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyhzdGF0dXMpICE9IDApIHsKLQkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlidWZbc3RyY3NwbihidWYsICJcclxuIildID0gJ1wwJzsKLQlwYXNzID0geHN0cmR1cChidWYpOwotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlyZXR1cm4gcGFzczsKLX0KLQotLyoKLSAqIFJlYWRzIGEgcGFzc3BocmFzZSBmcm9tIC9kZXYvdHR5IHdpdGggZWNobyB0dXJuZWQgb2ZmL29uLiAgUmV0dXJucyB0aGUKLSAqIHBhc3NwaHJhc2UgKGFsbG9jYXRlZCB3aXRoIHhtYWxsb2MpLiAgRXhpdHMgaWYgRU9GIGlzIGVuY291bnRlcmVkLiBJZgotICogUlBfQUxMT1dfU1RESU4gaXMgc2V0LCB0aGUgcGFzc3BocmFzZSB3aWxsIGJlIHJlYWQgZnJvbSBzdGRpbiBpZiBubwotICogdHR5IGlzIGF2YWlsYWJsZQotICovCi1jaGFyICoKLXJlYWRfcGFzc3BocmFzZShjb25zdCBjaGFyICpwcm9tcHQsIGludCBmbGFncykKLXsKLQljaGFyICphc2twYXNzID0gTlVMTCwgKnJldCwgYnVmWzEwMjRdOwotCWludCBycHBmbGFncywgdXNlX2Fza3Bhc3MgPSAwLCB0dHlmZDsKLQotCXJwcGZsYWdzID0gKGZsYWdzICYgUlBfRUNITykgPyBSUFBfRUNIT19PTiA6IFJQUF9FQ0hPX09GRjsKLQlpZiAoZmxhZ3MgJiBSUF9VU0VfQVNLUEFTUykKLQkJdXNlX2Fza3Bhc3MgPSAxOwotCWVsc2UgaWYgKGZsYWdzICYgUlBfQUxMT1dfU1RESU4pIHsKLQkJaWYgKCFpc2F0dHkoU1RESU5fRklMRU5PKSkgewotCQkJZGVidWcoInJlYWRfcGFzc3BocmFzZTogc3RkaW4gaXMgbm90IGEgdHR5Iik7Ci0JCQl1c2VfYXNrcGFzcyA9IDE7Ci0JCX0KLQl9IGVsc2UgewotCQlycHBmbGFncyB8PSBSUFBfUkVRVUlSRV9UVFk7Ci0JCXR0eWZkID0gb3BlbihfUEFUSF9UVFksIE9fUkRXUik7Ci0JCWlmICh0dHlmZCA+PSAwKQotCQkJY2xvc2UodHR5ZmQpOwotCQllbHNlIHsKLQkJCWRlYnVnKCJyZWFkX3Bhc3NwaHJhc2U6IGNhbid0IG9wZW4gJXM6ICVzIiwgX1BBVEhfVFRZLAotCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCQl1c2VfYXNrcGFzcyA9IDE7Ci0JCX0KLQl9Ci0KLQlpZiAoKGZsYWdzICYgUlBfVVNFX0FTS1BBU1MpICYmIGdldGVudigiRElTUExBWSIpID09IE5VTEwpCi0JCXJldHVybiAoZmxhZ3MgJiBSUF9BTExPV19FT0YpID8gTlVMTCA6IHhzdHJkdXAoIiIpOwotCi0JaWYgKHVzZV9hc2twYXNzICYmIGdldGVudigiRElTUExBWSIpKSB7Ci0JCWlmIChnZXRlbnYoU1NIX0FTS1BBU1NfRU5WKSkKLQkJCWFza3Bhc3MgPSBnZXRlbnYoU1NIX0FTS1BBU1NfRU5WKTsKLQkJZWxzZQotCQkJYXNrcGFzcyA9IF9QQVRIX1NTSF9BU0tQQVNTX0RFRkFVTFQ7Ci0JCWlmICgocmV0ID0gc3NoX2Fza3Bhc3MoYXNrcGFzcywgcHJvbXB0KSkgPT0gTlVMTCkKLQkJCWlmICghKGZsYWdzICYgUlBfQUxMT1dfRU9GKSkKLQkJCQlyZXR1cm4geHN0cmR1cCgiIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKHJlYWRwYXNzcGhyYXNlKHByb21wdCwgYnVmLCBzaXplb2YgYnVmLCBycHBmbGFncykgPT0gTlVMTCkgewotCQlpZiAoZmxhZ3MgJiBSUF9BTExPV19FT0YpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcmV0dXJuIHhzdHJkdXAoIiIpOwotCX0KLQotCXJldCA9IHhzdHJkdXAoYnVmKTsKLQltZW1zZXQoYnVmLCAneCcsIHNpemVvZiBidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludAotYXNrX3Blcm1pc3Npb24oY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCWNoYXIgKnAsIHByb21wdFsxMDI0XTsKLQlpbnQgYWxsb3dlZCA9IDA7Ci0KLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCXZzbnByaW50Zihwcm9tcHQsIHNpemVvZihwcm9tcHQpLCBmbXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKLQotCXAgPSByZWFkX3Bhc3NwaHJhc2UocHJvbXB0LCBSUF9VU0VfQVNLUEFTU3xSUF9BTExPV19FT0YpOwotCWlmIChwICE9IE5VTEwpIHsKLQkJLyoKLQkJICogQWNjZXB0IGVtcHR5IHJlc3BvbnNlcyBhbmQgcmVzcG9uc2VzIGNvbnNpc3RpbmcKLQkJICogb2YgdGhlIHdvcmQgInllcyIgYXMgYWZmaXJtYXRpdmUuCi0JCSAqLwotCQlpZiAoKnAgPT0gJ1wwJyB8fCAqcCA9PSAnXG4nIHx8Ci0JCSAgICBzdHJjYXNlY21wKHAsICJ5ZXMiKSA9PSAwKQotCQkJYWxsb3dlZCA9IDE7Ci0JCXhmcmVlKHApOwotCX0KLQotCXJldHVybiAoYWxsb3dlZCk7Ci19CmRpZmYgLS1naXQgYS9yZWdyZXNzL01ha2VmaWxlIGIvcmVncmVzcy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExNGMyNy4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMJJE9wZW5CU0Q6IE1ha2VmaWxlLHYgMS41OCAyMDExLzAxLzA2IDIyOjQ2OjIxIGRqbSBFeHAgJAotCi1SRUdSRVNTX1RBUkdFVFM9CXQxIHQyIHQzIHQ0IHQ1IHQ2IHQ3IHQ4IHQ5IHQtZXhlYwotdGVzdHM6CQkkKFJFR1JFU1NfVEFSR0VUUykKLQotIyBJbnRlcm9wIHRlc3RzIGFyZSBub3QgcnVuIGJ5IGRlZmF1bHQKLWludGVyb3AgaW50ZXJvcC10ZXN0czogdC1leGVjLWludGVyb3AKLQotY2xlYW46Ci0JZm9yIEYgaW4gJChDTEVBTkZJTEVTKTsgZG8gcm0gLWYgJChPQkopJCRGOyBkb25lCi0Jcm0gLXJmICQoT0JKKS5wdXR0eQotCi1kaXN0Y2xlYW46CWNsZWFuCi0KLUxURVNUUz0gCWNvbm5lY3QgXAotCQlwcm94eS1jb25uZWN0IFwKLQkJY29ubmVjdC1wcml2c2VwIFwKLQkJcHJvdG8tdmVyc2lvbiBcCi0JCXByb3RvLW1pc21hdGNoIFwKLQkJZXhpdC1zdGF0dXMgXAotCQllbnZwYXNzIFwKLQkJdHJhbnNmZXIgXAotCQliYW5uZXIgXAotCQlyZWtleSBcCi0JCXN0ZGVyci1kYXRhIFwKLQkJc3RkZXJyLWFmdGVyLWVvZiBcCi0JCWJyb2tlbi1waXBlIFwKLQkJdHJ5LWNpcGhlcnMgXAotCQl5ZXMtaGVhZCBcCi0JCWxvZ2luLXRpbWVvdXQgXAotCQlhZ2VudCBcCi0JCWFnZW50LWdldHBlZXJlaWQgXAotCQlhZ2VudC10aW1lb3V0IFwKLQkJYWdlbnQtcHRyYWNlIFwKLQkJa2V5c2NhbiBcCi0JCWtleWdlbi1jaGFuZ2UgXAotCQlrZXlnZW4tY29udmVydCBcCi0JCWtleS1vcHRpb25zIFwKLQkJc2NwIFwKLQkJc2Z0cCBcCi0JCXNmdHAtY21kcyBcCi0JCXNmdHAtYmFkY21kcyBcCi0JCXNmdHAtYmF0Y2ggXAotCQlzZnRwLWdsb2IgXAotCQlyZWNvbmZpZ3VyZSBcCi0JCWR5bmFtaWMtZm9yd2FyZCBcCi0JCWZvcndhcmRpbmcgXAotCQltdWx0aXBsZXggXAotCQlyZWV4ZWMgXAotCQlicm9rZW5rZXlzIFwKLQkJY2ZnbWF0Y2ggXAotCQlhZGRybWF0Y2ggXAotCQlsb2NhbGNvbW1hbmQgXAotCQlmb3JjZWNvbW1hbmQgXAotCQlwb3J0bnVtIFwKLQkJa2V5dHlwZSBcCi0JCWtleHR5cGUgXAotCQljZXJ0LWhvc3RrZXkgXAotCQljZXJ0LXVzZXJrZXkgXAotCQlob3N0LWV4cGFuZAotCi1JTlRFUk9QX1RFU1RTPQlwdXR0eS10cmFuc2ZlciBwdXR0eS1jaXBoZXJzIHB1dHR5LWtleCBjb25jaC1jaXBoZXJzCi0jSU5URVJPUF9URVNUUys9c3NoLWNvbSBzc2gtY29tLWNsaWVudCBzc2gtY29tLWtleWdlbiBzc2gtY29tLXNmdHAKLQotI0xURVNUUz0gCWNpcGhlci1zcGVlZAotCi1VU0VSIT0JCWlkIC11bgotQ0xFQU5GSUxFUz0JdDIub3V0IHQzLm91dCB0Ni5vdXQxIHQ2Lm91dDIgdDcub3V0IHQ3Lm91dC5wdWIgY29weS4xIGNvcHkuMiBcCi0JCXQ4Lm91dCB0OC5vdXQucHViIHQ5Lm91dCB0OS5vdXQucHViIFwKLQkJYXV0aG9yaXplZF9rZXlzXyR7VVNFUn0ga25vd25faG9zdHMgcGlkZmlsZSBcCi0JCXNzaF9jb25maWcgc3NoZF9jb25maWcub3JpZyBzc2hfcHJveHkgc3NoZF9jb25maWcgc3NoZF9wcm94eSBcCi0JCXJzYS5wdWIgcnNhIHJzYTEucHViIHJzYTEgaG9zdC5yc2EgaG9zdC5yc2ExIFwKLQkJcnNhLWFnZW50IHJzYS1hZ2VudC5wdWIgcnNhMS1hZ2VudCByc2ExLWFnZW50LnB1YiBcCi0JCWxzLmNvcHkgYmFubmVyLmluIGJhbm5lci5vdXQgZW1wdHkuaW4gXAotCQlzY3Atc3NoLXdyYXBwZXIuc2NwIHNzaF9wcm94eV9lbnZwYXNzIHJlbW90ZV9waWQgXAotCQlzc2hkX3Byb3h5X2JhayByc2Ffc3NoMl9jci5wcnYgcnNhX3NzaDJfY3JubC5wcnYgXAotCQlrbm93bl9ob3N0cy1jZXJ0IGhvc3RfY2Ffa2V5KiBjZXJ0X2hvc3Rfa2V5KiBcCi0JCXB1dHR5LnJzYTIgc3NoZF9wcm94eV9vcmlnIHNzaF9wcm94eV9iYWsgXAotCQlrZXkucnNhLSoga2V5LmRzYS0qIGtleS5lY2RzYS0qIFwKLQkJYXV0aG9yaXplZF9wcmluY2lwYWxzXyR7VVNFUn0gZXhwZWN0IGFjdHVhbAotCi0jIEVuYWJsZSBhbGwgbWFsbG9jKDMpIHJhbmRvbWlzYXRpb25zIGFuZCBjaGVja3MKLVRFU1RfRU5WPSAgICAgICJNQUxMT0NfT1BUSU9OUz1BRkdKUFJYIgotCi1URVNUX1NTSF9TU0hLRVlHRU4/PXNzaC1rZXlnZW4KLQotdDE6Ci0JJHtURVNUX1NTSF9TU0hLRVlHRU59IC1pZiAkey5DVVJESVJ9L3JzYV9zc2gyLnBydiB8IGRpZmYgLSAkey5DVVJESVJ9L3JzYV9vcGVuc3NoLnBydgotCXRyICdcbicgJ1xyJyA8JHsuQ1VSRElSfS9yc2Ffc3NoMi5wcnYgPiAkey5PQkpESVJ9L3JzYV9zc2gyX2NyLnBydgotCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtaWYgJHsuT0JKRElSfS9yc2Ffc3NoMl9jci5wcnYgfCBkaWZmIC0gJHsuQ1VSRElSfS9yc2Ffb3BlbnNzaC5wcnYKLQlhd2sgJ3twcmludCAkJDAgIlxyIn0nICR7LkNVUkRJUn0vcnNhX3NzaDIucHJ2ID4gJHsuT0JKRElSfS9yc2Ffc3NoMl9jcm5sLnBydgotCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtaWYgJHsuT0JKRElSfS9yc2Ffc3NoMl9jcm5sLnBydiB8IGRpZmYgLSAkey5DVVJESVJ9L3JzYV9vcGVuc3NoLnBydgotCi10MjoKLQljYXQgJHsuQ1VSRElSfS9yc2Ffb3BlbnNzaC5wcnYgPiAkKE9CSikvdDIub3V0Ci0JY2htb2QgNjAwICQoT0JKKS90Mi5vdXQKLQkke1RFU1RfU1NIX1NTSEtFWUdFTn0gLXlmICQoT0JKKS90Mi5vdXQgfCBkaWZmIC0gJHsuQ1VSRElSfS9yc2Ffb3BlbnNzaC5wdWIKLQotdDM6Ci0JJHtURVNUX1NTSF9TU0hLRVlHRU59IC1lZiAkey5DVVJESVJ9L3JzYV9vcGVuc3NoLnB1YiA+JChPQkopL3QzLm91dAotCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtaWYgJChPQkopL3QzLm91dCB8IGRpZmYgLSAkey5DVVJESVJ9L3JzYV9vcGVuc3NoLnB1YgotCi10NDoKLQkke1RFU1RfU1NIX1NTSEtFWUdFTn0gLWxmICR7LkNVUkRJUn0vcnNhX29wZW5zc2gucHViIHxcCi0JCWF3ayAne3ByaW50ICQkMn0nIHwgZGlmZiAtICR7LkNVUkRJUn0vdDQub2sKLQotdDU6Ci0JJHtURVNUX1NTSF9TU0hLRVlHRU59IC1CZiAkey5DVVJESVJ9L3JzYV9vcGVuc3NoLnB1YiB8XAotCQlhd2sgJ3twcmludCAkJDJ9JyB8IGRpZmYgLSAkey5DVVJESVJ9L3Q1Lm9rCi0KLXQ2OgotCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtaWYgJHsuQ1VSRElSfS9kc2Ffc3NoMi5wcnYgPiAkKE9CSikvdDYub3V0MQotCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtaWYgJHsuQ1VSRElSfS9kc2Ffc3NoMi5wdWIgPiAkKE9CSikvdDYub3V0MgotCWNobW9kIDYwMCAkKE9CSikvdDYub3V0MQotCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAteWYgJChPQkopL3Q2Lm91dDEgfCBkaWZmIC0gJChPQkopL3Q2Lm91dDIKLQotJChPQkopL3Q3Lm91dDoKLQkke1RFU1RfU1NIX1NTSEtFWUdFTn0gLXEgLXQgcnNhIC1OICcnIC1mICRACi0KLXQ3OiAkKE9CSikvdDcub3V0Ci0JJHtURVNUX1NTSF9TU0hLRVlHRU59IC1sZiAkKE9CSikvdDcub3V0ID4gL2Rldi9udWxsCi0JJHtURVNUX1NTSF9TU0hLRVlHRU59IC1CZiAkKE9CSikvdDcub3V0ID4gL2Rldi9udWxsCi0KLSQoT0JKKS90OC5vdXQ6Ci0JJHtURVNUX1NTSF9TU0hLRVlHRU59IC1xIC10IGRzYSAtTiAnJyAtZiAkQAotCi10ODogJChPQkopL3Q4Lm91dAotCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtbGYgJChPQkopL3Q4Lm91dCA+IC9kZXYvbnVsbAotCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtQmYgJChPQkopL3Q4Lm91dCA+IC9kZXYvbnVsbAotCi0kKE9CSikvdDkub3V0OgotCXRlc3QgIiR7VEVTVF9TU0hfRUNDfSIgIT0geWVzIHx8IFwKLQkke1RFU1RfU1NIX1NTSEtFWUdFTn0gLXEgLXQgZWNkc2EgLU4gJycgLWYgJEAKLQotdDk6ICQoT0JKKS90OS5vdXQKLQl0ZXN0ICIke1RFU1RfU1NIX0VDQ30iICE9IHllcyB8fCBcCi0JJHtURVNUX1NTSF9TU0hLRVlHRU59IC1sZiAkKE9CSikvdDkub3V0ID4gL2Rldi9udWxsCi0JdGVzdCAiJHtURVNUX1NTSF9FQ0N9IiAhPSB5ZXMgfHwgXAotCSR7VEVTVF9TU0hfU1NIS0VZR0VOfSAtQmYgJChPQkopL3Q5Lm91dCA+IC9kZXYvbnVsbAotCi10LWV4ZWM6CSR7TFRFU1RTOj0uc2h9Ci0JQGlmIFsgIngkPyIgPSAieCIgXTsgdGhlbiBleGl0IDA7IGZpOyBcCi0JZm9yIFRFU1QgaW4gIiIkPzsgZG8gXAotCQllY2hvICJydW4gdGVzdCAkJHtURVNUfSIgLi4uIDE+JjI7IFwKLQkJKGVudiBTVURPPSIke1NVRE99IiBURVNUX0VOVj0ke1RFU1RfRU5WfSBzaCAkey5DVVJESVJ9L3Rlc3QtZXhlYy5zaCAkey5PQkpESVJ9ICR7LkNVUkRJUn0vJCR7VEVTVH0pIHx8IGV4aXQgJCQ/OyBcCi0JZG9uZQotCi10LWV4ZWMtaW50ZXJvcDoJJHtJTlRFUk9QX1RFU1RTOj0uc2h9Ci0JQGlmIFsgIngkPyIgPSAieCIgXTsgdGhlbiBleGl0IDA7IGZpOyBcCi0JZm9yIFRFU1QgaW4gIiIkPzsgZG8gXAotCQllY2hvICJydW4gdGVzdCAkJHtURVNUfSIgLi4uIDE+JjI7IFwKLQkJKGVudiBTVURPPSIke1NVRE99IiBURVNUX0VOVj0ke1RFU1RfRU5WfSBzaCAkey5DVVJESVJ9L3Rlc3QtZXhlYy5zaCAkey5PQkpESVJ9ICR7LkNVUkRJUn0vJCR7VEVTVH0pIHx8IGV4aXQgJCQ/OyBcCi0JZG9uZQotCi0jIE5vdCBydW4gYnkgZGVmYXVsdAotaW50ZXJvcDogJHtJTlRFUk9QX1RBUkdFVFN9CmRpZmYgLS1naXQgYS9yZWdyZXNzL1JFQURNRS5yZWdyZXNzIGIvcmVncmVzcy9SRUFETUUucmVncmVzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlNGNjNy4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL1JFQURNRS5yZWdyZXNzCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLU92ZXJ2aWV3LgotCi0kIC4vY29uZmlndXJlICYmIG1ha2UgdGVzdHMKLQotWW91J2xsIHNlZSBzb21lIHByb2dyZXNzIGluZm8uIEEgZmFpbHVyZSB3aWxsIGNhdXNlIGVpdGhlciB0aGUgbWFrZSB0bwotYWJvcnQgb3IgdGhlIGRyaXZlciBzY3JpcHQgdG8gcmVwb3J0IGEgIkZBVEFMIiBmYWlsdXJlLgotCi1UaGUgdGVzdCBjb25zaXN0cyBvZiAyIHBhcnRzLiBUaGUgZmlyc3QgaXMgdGhlIGZpbGUtYmFzZWQgdGVzdHMgd2hpY2ggaXMKLWRyaXZlbiBieSB0aGUgTWFrZWZpbGUsIGFuZCB0aGUgc2Vjb25kIGlzIGEgc2V0IG9mIG5ldHdvcmsgb3IgcHJveHljb21tYW5kCi1iYXNlZCB0ZXN0cywgd2hpY2ggYXJlIGRyaXZlbiBieSBhIGRyaXZlciBzY3JpcHQgKHRlc3QtZXhlYy5zaCkgd2hpY2ggaXMKLWNhbGxlZCBtdWx0aXBsZSB0aW1lcyBieSB0aGUgTWFrZWZpbGUuCi0KLUZhaWx1cmVzIGluIHRoZSBmaXJzdCBwYXJ0IHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlIHRvIHJldHVybiBhbiBlcnJvci4KLUZhaWx1cmVzIGluIHRoZSBzZWNvbmQgcGFydCB3aWxsIHByaW50IGEgIkZBVEFMIiBtZXNzYWdlIGZvciB0aGUgZmFpbGVkCi10ZXN0IGFuZCBjb250aW51ZS4KLQotT3BlbkJTRCBoYXMgYSBzeXN0ZW0td2lkZSByZWdyZXNzaW9uIHRlc3Qgc3VpdGUuIE9wZW5TU0ggUG9ydGFibGUncyB0ZXN0Ci1zdWl0ZSBpcyBiYXNlZCBvbiBPcGVuQlNEJ3Mgd2l0aCBtb2RpZmljYXRpb25zLgotCi0KLUVudmlyb25tZW50IHZhcmlhYmxlcy4KLQotU1VETzogcGF0aCB0byBzdWRvIGNvbW1hbmQsIGlmIGRlc2lyZWQuIE5vdGUgdGhhdCBzb21lIHN5c3RlbXMgKG5vdGFibHkKLQlzeXN0ZW1zIHVzaW5nIFBBTSkgcmVxdWlyZSBzdWRvIHRvIGV4ZWN1dGUgc29tZSB0ZXN0cy4KLVRFU1RfU1NIX1RSQUNFOiBzZXQgdG8gInllcyIgZm9yIHZlcmJvc2Ugb3V0cHV0IGZyb20gdGVzdHMgCi1URVNUX1NTSF9RVUlFVDogc2V0IHRvICJ5ZXMiIHRvIHN1cHByZXNzIG5vbi1mYXRhbCBvdXRwdXQuCi1URVNUX1NTSF94OiBwYXRoIHRvICJzc2giIGNvbW1hbmQgdW5kZXIgdGVzdCwgd2hlcmUgeD1TU0gsU1NIRCxTU0hBR0VOVCxTU0hBREQKLQlTU0hLRVlHRU4sU1NIS0VZU0NBTixTRlRQLFNGVFBTRVJWRVIKLU9CSjogdXNlZCBieSB0ZXN0IHNjcmlwdHMgdG8gYWNjZXNzIGJ1aWxkIGRpci4KLVRFU1RfU0hFTEw6IHNoZWxsIHVzZWQgZm9yIHJ1bm5pbmcgdGhlIHRlc3Qgc2NyaXB0cy4KLVRFU1RfU1NIX1BPUlQ6IFRDUCBwb3J0IHRvIGJlIHVzZWQgZm9yIHRoZSBsaXN0ZW5pbmcgdGVzdHMuCi1URVNUX1NTSF9TU0hfQ09ORk9QVFM6IENvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyB0byBiZSBhZGRlZCB0byBzc2hfY29uZmlnCi0JYmVmb3JlIHJ1bm5pbmcgZWFjaCB0ZXN0LgotVEVTVF9TU0hfU1NIRF9DT05GT1RQUzogQ29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIHRvIGJlIGFkZGVkIHRvIHNzaGRfY29uZmlnCi0JYmVmb3JlIHJ1bm5pbmcgZWFjaCB0ZXN0LgotCi0KLUluZGl2aWR1YWwgdGVzdHMuCi0KLVlvdSBjYW4gcnVuIGFuIGluZGl2aWR1YWwgdGVzdCBmcm9tIHRoZSB0b3AtbGV2ZWwgTWFrZWZpbGUsIGVnOgotJCBtYWtlIHRlc3RzIExURVNUUz1hZ2VudC10aW1lb3V0Ci0KLUlmIHlvdSBuZWVkIHRvIG1hbmlwdWxhdGUgdGhlIGVudmlyb25tZW50IG1vcmUgeW91IGNhbiBpbnZva2UgdGVzdC1leGVjLnNoCi1kaXJlY3RseSBpZiB5b3Ugc2V0IHVwIHRoZSBwYXRoIHRvIGZpbmQgdGhlIGJpbmFyaWVzIHVuZGVyIHRlc3QgYW5kIHRoZQotdGVzdCBzY3JpcHRzIHRoZW1zZWx2ZXMsIGZvciBleGFtcGxlOgotCi0kIGNkIHJlZ3Jlc3MKLSQgUEFUSD1gcHdkYC8uLjokUEFUSDouIFRFU1RfU0hFTEw9L2Jpbi9zaCBzaCB0ZXN0LWV4ZWMuc2ggYHB3ZGAgXAotICAgIGFnZW50LXRpbWVvdXQuc2gKLW9rIGFnZW50IHRpbWVvdXQgdGVzdAotCi0KLUZpbGVzLgotCi10ZXN0LWV4ZWMuc2g6IHRoZSBtYWluIHRlc3QgZHJpdmVyLiBTZXRzIGVudmlyb25tZW50LCBjcmVhdGVzIGNvbmZpZyBmaWxlcwotYW5kIGtleXMgYW5kIHJ1bnMgdGhlIHNwZWNpZmllZCB0ZXN0LgotCi1BdCB0aGUgdGltZSBvZiB3cml0aW5nLCB0aGUgaW5kaXZpZHVhbCB0ZXN0cyBhcmU6Ci1hZ2VudC10aW1lb3V0LnNoOglhZ2VudCB0aW1lb3V0IHRlc3QKLWFnZW50LnNoOgkJc2ltcGxlIGFnZW50IHRlc3QKLWJyb2tlbi1waXBlLnNoOgkJYnJva2VuIHBpcGUgdGVzdAotY29ubmVjdC1wcml2c2VwLnNoOglwcm94eSBjb25uZWN0IHdpdGggcHJpdnNlcAotY29ubmVjdC5zaDoJCXNpbXBsZSBjb25uZWN0Ci1leGl0LXN0YXR1cy5zaDoJCXJlbW90ZSBleGl0IHN0YXR1cwotZm9yd2FyZGluZy5zaDoJCWxvY2FsIGFuZCByZW1vdGUgZm9yd2FyZGluZwota2V5Z2VuLWNoYW5nZS5zaDoJY2hhbmdlIHBhc3NwaHJhc2UgZm9yIGtleQota2V5c2Nhbi5zaDoJCWtleXNjYW4KLXByb3RvLW1pc21hdGNoLnNoOglwcm90b2NvbCB2ZXJzaW9uIG1pc21hdGNoCi1wcm90by12ZXJzaW9uLnNoOglzc2hkIHZlcnNpb24gd2l0aCBkaWZmZXJlbnQgcHJvdG9jb2wgY29tYmluYXRpb25zCi1wcm94eS1jb25uZWN0LnNoOglwcm94eSBjb25uZWN0Ci1zZnRwLnNoOgkJYmFzaWMgc2Z0cCBwdXQvZ2V0Ci1zc2gtY29tLWNsaWVudC5zaDoJY29ubmVjdCB3aXRoIHNzaC5jb20gY2xpZW50Ci1zc2gtY29tLWtleWdlbi5zaDoJc3NoLmNvbSBrZXkgaW1wb3J0Ci1zc2gtY29tLXNmdHAuc2g6CWJhc2ljIHNmdHAgcHV0L2dldCB3aXRoIHNzaC5jb20gc2VydmVyCi1zc2gtY29tLnNoOgkJY29ubmVjdCB0byBzc2guY29tIHNlcnZlcgotc3RkZXJyLWFmdGVyLWVvZi5zaDoJc3RkZXJyIGRhdGEgYWZ0ZXIgZW9mCi1zdGRlcnItZGF0YS5zaDoJCXN0ZGVyciBkYXRhIHRyYW5zZmVyCi10cmFuc2Zlci5zaDoJCXRyYW5zZmVyIGRhdGEKLXRyeS1jaXBoZXJzLnNoOgkJdHJ5IGNpcGhlcnMKLXllcy1oZWFkLnNoOgkJeWVzIHBpcGUgaGVhZAotCi0KLVByb2JsZW1zPwotCi1SdW4gdGhlIGZhaWxpbmcgdGVzdCB3aXRoIHNoZWxsIHRyYWNpbmcgKC14KSB0dXJuZWQgb246Ci0kIFBBVEg9YHB3ZGAvLi46JFBBVEg6LiBzaCAteCB0ZXN0LWV4ZWMuc2ggYHB3ZGAgYWdlbnQtdGltZW91dC5zaAotCi1GYWlsZWQgdGVzdHMgY2FuIGJlIGRpZmZpY3VsdCB0byBkaWFnbm9zZS4gU3VnZ2VzdGlvbnM6Ci0tIHJ1biB0aGUgaW5kaXZpZHVhbCB0ZXN0IHZpYSAuL3Rlc3QtZXhlYy5zaCBgcHdkYCBbdGVzdG5hbWVdCi0tIHNldCBMb2dMZXZlbCB0byBWRVJCT1NFIGluIHRlc3QtZXhlYy5zaCBhbmQgZW5hYmxlIHN5c2xvZ2dpbmcgb2YKLSAgYXV0aC5kZWJ1ZyAoZWcgdG8gL3Zhci9sb2cvYXV0aGxvZykuCi0KLQotS25vd24gSXNzdWVzLgotCi0tIFNpbWlsYXJseSwgaWYgeW91IGRvIG5vdCBoYXZlICJzY3AiIGluIHlvdXIgc3lzdGVtJ3MgJFBBVEggdGhlbiB0aGUKLSAgbXVsdGlwbGV4IHNjcCB0ZXN0cyB3aWxsIGZhaWwgKHNpbmNlIHRoZSBzeXN0ZW0ncyBzaGVsbCBzdGFydHVwIHNjcmlwdHMKLSAgd2lsbCBkZXRlcm1pbmUgd2hlcmUgdGhlIHNoZWxsIHN0YXJ0ZWQgYnkgc3NoZCB3aWxsIGxvb2sgZm9yIHNjcCkuCi0KLS0gUmVjZW50IEdOVSBjb3JldXRpbHMgZGVwcmVjYXRlICJoZWFkIC1bbl0iOiB0aGlzIHdpbGwgY2F1c2UgdGhlIHllcy1oZWFkCi0gIHRlc3QgdG8gZmFpbC4gIFRoZSBvbGQgYmVoYXZpb3VyIGNhbiBiZSByZXN0b3JlZCBieSBzZXR0aW5nIChhbmQKLSAgZXhwb3J0aW5nKSBfUE9TSVgyX1ZFUlNJT049MTk5MjA5IGJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0cy4KLQotJElkOiBSRUFETUUucmVncmVzcyx2IDEuMTIgMjAxMS8wNS8wNSAwMzo0ODo0MiBkam0gRXhwICQKZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvYWRkcm1hdGNoLnNoIGIvcmVncmVzcy9hZGRybWF0Y2guc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZGRkNjUuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9hZGRybWF0Y2guc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jCSRPcGVuQlNEOiBhZGRybWF0Y2guc2gsdiAxLjMgMjAxMC8wMi8wOSAwNDo1NzozNiBkam0gRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9ImFkZHJlc3MgbWF0Y2giCi0KLW12ICRPQkovc3NoZF9wcm94eSAkT0JKL3NzaGRfcHJveHlfYmFrCi0KLXJ1bl90cmlhbCgpCi17Ci0JdXNlcj0iJDEiOyBhZGRyPSIkMiI7IGhvc3Q9IiQzIjsgZXhwZWN0ZWQ9IiQ0IjsgZGVzY3I9IiQ1IgotCi0JdmVyYm9zZSAidGVzdCAkZGVzY3IgZm9yICR1c2VyICRhZGRyICRob3N0IgotCXJlc3VsdD1gJHtTU0hEfSAtZiAkT0JKL3NzaGRfcHJveHkgLVQgXAotCSAgICAtQyB1c2VyPSR7dXNlcn0sYWRkcj0ke2FkZHJ9LGhvc3Q9JHtob3N0fSB8IFwKLQkgICAgYXdrICcvXnBhc3N3b3JkYXV0aGVudGljYXRpb24vIHtwcmludCAkMn0nYAotCWlmIFsgIiRyZXN1bHQiICE9ICIkZXhwZWN0ZWQiIF07IHRoZW4KLQkJZmFpbCAiZmFpbGVkIGZvciAkdXNlciAkYWRkciAkaG9zdDogZXhwZWN0ZWQgJGV4cGVjdGVkLCBnb3QgJHJlc3VsdCIKLQlmaQotfQotCi1jcCAkT0JKL3NzaGRfcHJveHlfYmFrICRPQkovc3NoZF9wcm94eQotY2F0ID4+JE9CSi9zc2hkX3Byb3h5IDw8RU9ECi1QYXNzd29yZEF1dGhlbnRpY2F0aW9uIG5vCi1NYXRjaCBBZGRyZXNzIDE5Mi4xNjguMC4wLzE2LCExOTIuMTY4LjMwLjAvMjQsMTAuMC4wLjAvOCxob3N0LmV4YW1wbGUuY29tCi0JUGFzc3dvcmRBdXRoZW50aWNhdGlvbiB5ZXMKLU1hdGNoIEFkZHJlc3MgMS4xLjEuMSw6OjEsITo6MywyMDAwOjovMTYKLQlQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHllcwotRU9ECi0KLXJ1bl90cmlhbCB1c2VyIDE5Mi4xNjguMC4xIHNvbWVob3N0IHllcwkJInBlcm1pdCwgZmlyc3QgZW50cnkiCi1ydW5fdHJpYWwgdXNlciAxOTIuMTY4LjMwLjEgc29tZWhvc3Qgbm8JCSJkZW55LCBuZWdhdGl2ZSBtYXRjaCIKLXJ1bl90cmlhbCB1c2VyIDE5LjAuMC4xIHNvbWVob3N0IG5vCQkiZGVueSwgbm8gbWF0Y2giCi1ydW5fdHJpYWwgdXNlciAxMC4yNTUuMjU1LjI1NCBzb21laG9zdCB5ZXMJInBlcm1pdCwgbGlzdCBtaWRkbGUiCi1ydW5fdHJpYWwgdXNlciAxOTIuMTY4LjMwLjEgMTkyLjE2OC4wLjEgbm8JImRlbnksIGZha2VkIElQIGluIGhvc3RuYW1lIgotcnVuX3RyaWFsIHVzZXIgMS4xLjEuMSBzb21laG9zdC5leGFtcGxlLmNvbSB5ZXMJInBlcm1pdCwgYmFyZSBJUDQgYWRkcmVzcyIKLXRlc3QgIiRURVNUX1NTSF9JUFY2IiA9ICJubyIgJiYgZXhpdAotcnVuX3RyaWFsIHVzZXIgOjoxIHNvbWVob3N0LmV4YW1wbGUuY29tCSB5ZXMJInBlcm1pdCwgYmFyZSBJUDYgYWRkcmVzcyIKLXJ1bl90cmlhbCB1c2VyIDo6MiBzb21laG9zdC5leGFwbGUuY29tIG5vCSJkZW55IElQdjYiCi1ydW5fdHJpYWwgdXNlciA6OjMgc29tZWhvc3Qgbm8JCQkiZGVueSBJUDYgbmVnYXRlZCIKLXJ1bl90cmlhbCB1c2VyIDo6NCBzb21laG9zdCBubwkJCSJkZW55LCBJUDYgbm8gbWF0Y2giCi1ydW5fdHJpYWwgdXNlciAyMDAwOjoxIHNvbWVob3N0IHllcwkJInBlcm1pdCwgSVA2IG5ldHdvcmsiCi1ydW5fdHJpYWwgdXNlciAyMDAxOjoxIHNvbWVob3N0IG5vCQkiZGVueSwgSVA2IG5ldHdvcmsiCi0KLWNwICRPQkovc3NoZF9wcm94eV9iYWsgJE9CSi9zc2hkX3Byb3h5Ci1ybSAkT0JKL3NzaGRfcHJveHlfYmFrCmRpZmYgLS1naXQgYS9yZWdyZXNzL2FnZW50LWdldHBlZXJlaWQuc2ggYi9yZWdyZXNzL2FnZW50LWdldHBlZXJlaWQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjY1NGMuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9hZ2VudC1nZXRwZWVyZWlkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIwkkT3BlbkJTRDogYWdlbnQtZ2V0cGVlcmVpZC5zaCx2IDEuNCAyMDA3LzExLzI1IDE1OjM1OjA5IGptYyBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0iZGlzYWxsb3cgYWdlbnQgYXR0YWNoIGZyb20gb3RoZXIgdWlkIgotCi1VTlBSSVY9bm9ib2R5Ci1BU09DSz0ke09CSn0vYWdlbnQKLVNTSF9BVVRIX1NPQ0s9L25vbmV4aXN0ZW50Ci0KLWlmIGNvbmZpZ19kZWZpbmVkIEhBVkVfR0VUUEVFUkVJRCBIQVZFX0dFVFBFRVJVQ1JFRCBIQVZFX1NPX1BFRVJDUkVEIDsgdGhlbgotCToKLWVsc2UKLQllY2hvICJza2lwcGVkIChub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0pIgotCWV4aXQgMAotZmkKLWlmIFsgLXogIiRTVURPIiBdOyB0aGVuCi0JZWNobyAic2tpcHBlZDogbmVlZCBTVURPIHRvIHN3aXRjaCB0byB1aWQgJFVOUFJJViIKLQlleGl0IDAKLWZpCi0KLQotdHJhY2UgInN0YXJ0IGFnZW50IgotZXZhbCBgJHtTU0hBR0VOVH0gLXMgLWEgJHtBU09DS31gID4gL2Rldi9udWxsCi1yPSQ/Ci1pZiBbICRyIC1uZSAwIF07IHRoZW4KLQlmYWlsICJjb3VsZCBub3Qgc3RhcnQgc3NoLWFnZW50OiBleGl0IGNvZGUgJHIiCi1lbHNlCi0JY2htb2QgNjQ0ICR7U1NIX0FVVEhfU09DS30KLQotCXNzaC1hZGQgLWwgPiAvZGV2L251bGwgMj4mMQotCXI9JD8KLQlpZiBbICRyIC1uZSAxIF07IHRoZW4KLQkJZmFpbCAic3NoLWFkZCBmYWlsZWQgd2l0aCAkciAhPSAxIgotCWZpCi0KLQk8IC9kZXYvbnVsbCAke1NVRE99IC1TIC11ICR7VU5QUklWfSBzc2gtYWRkIC1sIDI+L2Rldi9udWxsCi0Jcj0kPwotCWlmIFsgJHIgLWx0IDIgXTsgdGhlbgotCQlmYWlsICJzc2gtYWRkIGRpZCBub3QgZmFpbCBmb3IgJHtVTlBSSVZ9OiAkciA8IDIiCi0JZmkKLQotCXRyYWNlICJraWxsIGFnZW50IgotCSR7U1NIQUdFTlR9IC1rID4gL2Rldi9udWxsCi1maQotCi1ybSAtZiAke09CSn0vYWdlbnQKZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvYWdlbnQtcGtjczExLnNoIGIvcmVncmVzcy9hZ2VudC1wa2NzMTEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMzNhYjMuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9hZ2VudC1wa2NzMTEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jCSRPcGVuQlNEOiBhZ2VudC1wa2NzMTEuc2gsdiAxLjEgMjAxMC8wMi8wOCAxMDo1Mjo0NyBtYXJrdXMgRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9InBrY3MxMSBhZ2VudCB0ZXN0IgotCi1URVNUX1NTSF9QSU49IiIKLVRFU1RfU1NIX1BLQ1MxMT0vdXNyL2xvY2FsL2xpYi9zb2Z0LXBrY3MxMS5zby4wLjAKLQotIyBzZXR1cCBlbnZpcm9ubWVudCBmb3Igc29mdC1wa2NzMTEgdG9rZW4KLVNPRlRQS0NTMTFSQz0kT0JKL3BrY3MxMS5pbmZvCi1leHBvcnQgU09GVFBLQ1MxMVJDCi0jIHByZXZlbnQgc3NoLWFnZW50IGZyb20gY2FsbGluZyBzc2gtYXNrcGFzcwotU1NIX0FTS1BBU1M9L3Vzci9iaW4vdHJ1ZQotZXhwb3J0IFNTSF9BU0tQQVNTCi11bnNldCBESVNQTEFZCi0KLSMgc3RhcnQgY29tbWFuZCB3L28gdHR5LCBzbyBzc2gtYWRkIGFjY2VwdHMgcGluIGZyb20gc3RkaW4KLW5vdHR5KCkgewotCXBlcmwgLWUgJ3VzZSBQT1NJWDsgUE9TSVg6OnNldHNpZCgpOyAKLQkgICAgaWYgKGZvcmspIHsgd2FpdDsgZXhpdCgkPyA+PiA4KTsgfSBlbHNlIHsgZXhlYyhAQVJHVikgfScgIiRAIgotfQotCi10cmFjZSAic3RhcnQgYWdlbnQiCi1ldmFsIGAke1NTSEFHRU5UfSAtc2AgPiAvZGV2L251bGwKLXI9JD8KLWlmIFsgJHIgLW5lIDAgXTsgdGhlbgotCWZhaWwgImNvdWxkIG5vdCBzdGFydCBzc2gtYWdlbnQ6IGV4aXQgY29kZSAkciIKLWVsc2UKLQl0cmFjZSAiZ2VuZXJhdGluZyBrZXkvY2VydCIKLQlybSAtZiAkT0JKL3BrY3MxMS5rZXkgJE9CSi9wa2NzMTEuY3J0Ci0Jb3BlbnNzbCBnZW5yc2EgLW91dCAkT0JKL3BrY3MxMS5rZXkgMjA0OCA+IC9kZXYvbnVsbCAyPiYxCi0JY2htb2QgNjAwICRPQkovcGtjczExLmtleSAKLQlvcGVuc3NsIHJlcSAta2V5ICRPQkovcGtjczExLmtleSAtbmV3IC14NTA5IFwKLQkgICAgLW91dCAkT0JKL3BrY3MxMS5jcnQgLXRleHQgLXN1YmogJy9DTj1wa2NzMTEgdGVzdCcgPiAvZGV2L251bGwKLQlwcmludGYgImFcdGFcdCRPQkovcGtjczExLmNydFx0JE9CSi9wa2NzMTEua2V5IiA+ICRTT0ZUUEtDUzExUkMKLQkjIGFkZCB0byBhdXRob3JpemVkIGtleXMKLQkke1NTSEtFWUdFTn0gLXkgLWYgJE9CSi9wa2NzMTEua2V5ID4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKLQotCXRyYWNlICJhZGQgcGtjczExIGtleSB0byBhZ2VudCIKLQllY2hvICR7VEVTVF9TU0hfUElOfSB8IG5vdHR5ICR7U1NIQUREfSAtcyAke1RFU1RfU1NIX1BLQ1MxMX0gPiAvZGV2L251bGwgMj4mMQotCXI9JD8KLQlpZiBbICRyIC1uZSAwIF07IHRoZW4KLQkJZmFpbCAic3NoLWFkZCAtcyBmYWlsZWQ6IGV4aXQgY29kZSAkciIKLQlmaQotCi0JdHJhY2UgInBrY3MxMSBsaXN0IHZpYSBhZ2VudCIKLQkke1NTSEFERH0gLWwgPiAvZGV2L251bGwgMj4mMQotCXI9JD8KLQlpZiBbICRyIC1uZSAwIF07IHRoZW4KLQkJZmFpbCAic3NoLWFkZCAtbCBmYWlsZWQ6IGV4aXQgY29kZSAkciIKLQlmaQotCi0JdHJhY2UgInBrY3MxMSBjb25uZWN0IHZpYSBhZ2VudCIKLQkke1NTSH0gLTIgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgZXhpdCA1Ci0Jcj0kPwotCWlmIFsgJHIgLW5lIDUgXTsgdGhlbgotCQlmYWlsICJzc2ggY29ubmVjdCBmYWlsZWQgKGV4aXQgY29kZSAkcikiCi0JZmkKLQotCXRyYWNlICJyZW1vdmUgcGtjczExIGtleXMiCi0JZWNobyAke1RFU1RfU1NIX1BJTn0gfCBub3R0eSAke1NTSEFERH0gLWUgJHtURVNUX1NTSF9QS0NTMTF9ID4gL2Rldi9udWxsIDI+JjEKLQlyPSQ/Ci0JaWYgWyAkciAtbmUgMCBdOyB0aGVuCi0JCWZhaWwgInNzaC1hZGQgLWUgZmFpbGVkOiBleGl0IGNvZGUgJHIiCi0JZmkKLQotCXRyYWNlICJraWxsIGFnZW50IgotCSR7U1NIQUdFTlR9IC1rID4gL2Rldi9udWxsCi1maQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9hZ2VudC1wdHJhY2Uuc2ggYi9yZWdyZXNzL2FnZW50LXB0cmFjZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyOTQ2NC4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL2FnZW50LXB0cmFjZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMJJE9wZW5CU0Q6IGFnZW50LXB0cmFjZS5zaCx2IDEuMSAyMDAyLzEyLzA5IDE1OjM4OjMwIG1hcmt1cyBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0iZGlzYWxsb3cgYWdlbnQgcHRyYWNlIGF0dGFjaCIKLQotaWYgaGF2ZV9wcm9nIHVuYW1lIDsgdGhlbgotCWNhc2UgYHVuYW1lYCBpbgotCUFJWHxDWUdXSU4qfE9TRjEpCi0JCWVjaG8gInNraXBwZWQgKG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSkiCi0JCWV4aXQgMAotCQk7OwotCWVzYWMKLWZpCi0KLWlmIGhhdmVfcHJvZyBnZGIgOyB0aGVuCi0JOiBvawotZWxzZQotCWVjaG8gInNraXBwZWQgKGdkYiBub3QgZm91bmQpIgotCWV4aXQgMAotZmkKLQotaWYgdGVzdCAteiAiJFNVRE8iIDsgdGhlbgotCWVjaG8gInNraXBwZWQgKFNVRE8gbm90IHNldCkiCi0JZXhpdCAwCi1lbHNlCi0JJFNVRE8gY2hvd24gMCAke1NTSEFHRU5UfQotCSRTVURPIGNoZ3JwIDAgJHtTU0hBR0VOVH0KLQkkU1VETyBjaG1vZCAyNzU1ICR7U1NIQUdFTlR9Ci1maQotCi10cmFjZSAic3RhcnQgYWdlbnQiCi1ldmFsIGAke1NTSEFHRU5UfSAtc2AgPiAvZGV2L251bGwKLXI9JD8KLWlmIFsgJHIgLW5lIDAgXTsgdGhlbgotCWZhaWwgImNvdWxkIG5vdCBzdGFydCBzc2gtYWdlbnQ6IGV4aXQgY29kZSAkciIKLWVsc2UKLQkjIGxzIC1sICR7U1NIX0FVVEhfU09DS30KLQlnZGIgJHtTU0hBR0VOVH0gJHtTU0hfQUdFTlRfUElEfSA+ICR7T0JKfS9nZGIub3V0IDI+JjEgPDwgRU9GCi0JCXF1aXQKLUVPRgotCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQlmYWlsICJnZGIgZmFpbGVkOiBleGl0IGNvZGUgJD8iCi0JZmkKLQllZ3JlcCAncHRyYWNlOiBPcGVyYXRpb24gbm90IHBlcm1pdHRlZC58cHJvY2ZzOi4qUGVybWlzc2lvbiBkZW5pZWQufHR0cmFjZS4qUGVybWlzc2lvbiBkZW5pZWQufHByb2NmczouKjogSW52YWxpZCBhcmd1bWVudC58VW5hYmxlIHRvIGFjY2VzcyB0YXNrICcgPi9kZXYvbnVsbCAke09CSn0vZ2RiLm91dAotCXI9JD8KLQlybSAtZiAke09CSn0vZ2RiLm91dAotCWlmIFsgJHIgLW5lIDAgXTsgdGhlbgotCQlmYWlsICJwdHJhY2Ugc3VjY2VlZGVkPzogZXhpdCBjb2RlICRyIgotCWZpCi0KLQl0cmFjZSAia2lsbCBhZ2VudCIKLQkke1NTSEFHRU5UfSAtayA+IC9kZXYvbnVsbAotZmkKZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvYWdlbnQtdGltZW91dC5zaCBiL3JlZ3Jlc3MvYWdlbnQtdGltZW91dC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0MGU3YS4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL2FnZW50LXRpbWVvdXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jCSRPcGVuQlNEOiBhZ2VudC10aW1lb3V0LnNoLHYgMS4xIDIwMDIvMDYvMDYgMDA6Mzg6NDAgbWFya3VzIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJhZ2VudCB0aW1lb3V0IHRlc3QiCi0KLVNTSEFHRU5UX1RJTUVPVVQ9MTAKLQotdHJhY2UgInN0YXJ0IGFnZW50IgotZXZhbCBgJHtTU0hBR0VOVH0gLXNgID4gL2Rldi9udWxsCi1yPSQ/Ci1pZiBbICRyIC1uZSAwIF07IHRoZW4KLQlmYWlsICJjb3VsZCBub3Qgc3RhcnQgc3NoLWFnZW50OiBleGl0IGNvZGUgJHIiCi1lbHNlCi0JdHJhY2UgImFkZCBrZXlzIHdpdGggdGltZW91dCIKLQlmb3IgdCBpbiByc2EgcnNhMTsgZG8KLQkJJHtTU0hBRER9IC10ICR7U1NIQUdFTlRfVElNRU9VVH0gJE9CSi8kdCA+IC9kZXYvbnVsbCAyPiYxCi0JCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQkJZmFpbCAic3NoLWFkZCBkaWQgc3VjY2VlZCBleGl0IGNvZGUgMCIKLQkJZmkKLQlkb25lCi0Jbj1gJHtTU0hBRER9IC1sIDI+IC9kZXYvbnVsbCB8IHdjIC1sYAotCXRyYWNlICJhZ2VudCBoYXMgJG4ga2V5cyIKLQlpZiBbICRuIC1uZSAyIF07IHRoZW4KLQkJZmFpbCAic3NoLWFkZCAtbCBkaWQgbm90IHJldHVybiAyIGtleXM6ICRuIgotCWZpCi0JdHJhY2UgInNsZWVwaW5nIDIqJHtTU0hBR0VOVF9USU1FT1VUfSBzZWNvbmRzIgotCXNsZWVwICR7U1NIQUdFTlRfVElNRU9VVH0KLQlzbGVlcCAke1NTSEFHRU5UX1RJTUVPVVR9Ci0JJHtTU0hBRER9IC1sIDI+IC9kZXYvbnVsbCB8IGdyZXAgJ1RoZSBhZ2VudCBoYXMgbm8gaWRlbnRpdGllcy4nID4vZGV2L251bGwKLQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KLQkJZmFpbCAic3NoLWFkZCAtbCBzdGlsbCByZXR1cm5zIGtleXMgYWZ0ZXIgdGltZW91dCIKLQlmaQotCi0JdHJhY2UgImtpbGwgYWdlbnQiCi0JJHtTU0hBR0VOVH0gLWsgPiAvZGV2L251bGwKLWZpCmRpZmYgLS1naXQgYS9yZWdyZXNzL2FnZW50LnNoIGIvcmVncmVzcy9hZ2VudC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk0Y2Y2OS4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL2FnZW50LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotIwkkT3BlbkJTRDogYWdlbnQuc2gsdiAxLjcgMjAwNy8xMS8yNSAxNTozNTowOSBqbWMgRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9InNpbXBsZSBhZ2VudCB0ZXN0IgotCi1TU0hfQVVUSF9TT0NLPS9ub25leGlzdGVudCAke1NTSEFERH0gLWwgPiAvZGV2L251bGwgMj4mMQotaWYgWyAkPyAtbmUgMiBdOyB0aGVuCi0JZmFpbCAic3NoLWFkZCAtbCBkaWQgbm90IGZhaWwgd2l0aCBleGl0IGNvZGUgMiIKLWZpCi0KLXRyYWNlICJzdGFydCBhZ2VudCIKLWV2YWwgYCR7U1NIQUdFTlR9IC1zYCA+IC9kZXYvbnVsbAotcj0kPwotaWYgWyAkciAtbmUgMCBdOyB0aGVuCi0JZmFpbCAiY291bGQgbm90IHN0YXJ0IHNzaC1hZ2VudDogZXhpdCBjb2RlICRyIgotZWxzZQotCSR7U1NIQUREfSAtbCA+IC9kZXYvbnVsbCAyPiYxCi0JaWYgWyAkPyAtbmUgMSBdOyB0aGVuCi0JCWZhaWwgInNzaC1hZGQgLWwgZGlkIG5vdCBmYWlsIHdpdGggZXhpdCBjb2RlIDEiCi0JZmkKLQl0cmFjZSAib3ZlcndyaXRlIGF1dGhvcml6ZWQga2V5cyIKLQllY2hvbiA+ICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCi0JZm9yIHQgaW4gcnNhIHJzYTE7IGRvCi0JCSMgZ2VuZXJhdGUgdXNlciBrZXkgZm9yIGFnZW50Ci0JCXJtIC1mICRPQkovJHQtYWdlbnQKLQkJJHtTU0hLRVlHRU59IC1xIC1OICcnIC10ICR0IC1mICRPQkovJHQtYWdlbnQgfHxcCi0JCQkgZmFpbCAic3NoLWtleWdlbiBmb3IgJHQtYWdlbnQgZmFpbGVkIgotCQkjIGFkZCB0byBhdXRob3JpemVkIGtleXMKLQkJY2F0ICRPQkovJHQtYWdlbnQucHViID4+ICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCi0JCSMgYWRkIHByaXZhdCBrZXkgdG8gYWdlbnQKLQkJJHtTU0hBRER9ICRPQkovJHQtYWdlbnQgPiAvZGV2L251bGwgMj4mMQotCQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KLQkJCWZhaWwgInNzaC1hZGQgZGlkIHN1Y2NlZWQgZXhpdCBjb2RlIDAiCi0JCWZpCi0JZG9uZQotCSR7U1NIQUREfSAtbCA+IC9kZXYvbnVsbCAyPiYxCi0JaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCWZhaWwgInNzaC1hZGQgLWwgZmFpbGVkOiBleGl0IGNvZGUgJD8iCi0JZmkKLQkjIHRoZSBzYW1lIGZvciBmdWxsIHB1YmtleSBvdXRwdXQKLQkke1NTSEFERH0gLUwgPiAvZGV2L251bGwgMj4mMQotCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQlmYWlsICJzc2gtYWRkIC1MIGZhaWxlZDogZXhpdCBjb2RlICQ/IgotCWZpCi0KLQl0cmFjZSAic2ltcGxlIGNvbm5lY3QgdmlhIGFnZW50IgotCWZvciBwIGluIDEgMjsgZG8KLQkJJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCBleGl0IDUkcAotCQlpZiBbICQ/IC1uZSA1JHAgXTsgdGhlbgotCQkJZmFpbCAic3NoIGNvbm5lY3Qgd2l0aCBwcm90b2NvbCAkcCBmYWlsZWQgKGV4aXQgY29kZSAkPykiCi0JCWZpCi0JZG9uZQotCi0JdHJhY2UgImFnZW50IGZvcndhcmRpbmciCi0JZm9yIHAgaW4gMSAyOyBkbwotCQkke1NTSH0gLUEgLSRwIC1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0ICR7U1NIQUREfSAtbCA+IC9kZXYvbnVsbCAyPiYxCi0JCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQkJZmFpbCAic3NoLWFkZCAtbCB2aWEgYWdlbnQgZndkIHByb3RvICRwIGZhaWxlZCAoZXhpdCBjb2RlICQ/KSIKLQkJZmkKLQkJJHtTU0h9IC1BIC0kcCAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCBcCi0JCQkiJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCBleGl0IDUkcCIKLQkJaWYgWyAkPyAtbmUgNSRwIF07IHRoZW4KLQkJCWZhaWwgImFnZW50IGZ3ZCBwcm90byAkcCBmYWlsZWQgKGV4aXQgY29kZSAkPykiCi0JCWZpCi0JZG9uZQotCi0JdHJhY2UgImRlbGV0ZSBhbGwgYWdlbnQga2V5cyIKLQkke1NTSEFERH0gLUQgPiAvZGV2L251bGwgMj4mMQotCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQlmYWlsICJzc2gtYWRkIC1EIGZhaWxlZDogZXhpdCBjb2RlICQ/IgotCWZpCi0KLQl0cmFjZSAia2lsbCBhZ2VudCIKLQkke1NTSEFHRU5UfSAtayA+IC9kZXYvbnVsbAotZmkKZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvYmFubmVyLnNoIGIvcmVncmVzcy9iYW5uZXIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOWM5NTAuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9iYW5uZXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jCSRPcGVuQlNEOiBiYW5uZXIuc2gsdiAxLjIgMjAwMy8xMC8xMSAxMTo0OTo0OSBkdHVja2VyIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJiYW5uZXIiCi1lY2hvICJCYW5uZXIgJE9CSi9iYW5uZXIuaW4iID4+ICRPQkovc3NoZF9wcm94eQotCi1ybSAtZiAkT0JKL2Jhbm5lci5vdXQgJE9CSi9iYW5uZXIuaW4gJE9CSi9lbXB0eS5pbgotdG91Y2ggJE9CSi9lbXB0eS5pbgotCi10cmFjZSAidGVzdCBtaXNzaW5nIGJhbm5lciBmaWxlIgotdmVyYm9zZSAidGVzdCAkdGlkOiBtaXNzaW5nIGJhbm5lciBmaWxlIgotKCAke1NTSH0gLTIgLUYgJE9CSi9zc2hfcHJveHkgb3RoZXJob3N0IHRydWUgMj4kT0JKL2Jhbm5lci5vdXQgJiYgXAotCWNtcCAkT0JKL2VtcHR5LmluICRPQkovYmFubmVyLm91dCApIHx8IFwKLQlmYWlsICJtaXNzaW5nIGJhbm5lciBmaWxlIgotCi1mb3IgcyBpbiAwIDEwIDEwMCAxMDAwIDEwMDAwIDEwMDAwMCA7IGRvCi0JaWYgWyAiJHMiID0gIjAiIF07IHRoZW4KLQkJIyBjcmVhdGUgZW1wdHkgYmFubmVyCi0JCXRvdWNoICRPQkovYmFubmVyLmluCi0JZWxpZiBbICIkcyIgPSAiMTAiIF07IHRoZW4KLQkJIyBjcmVhdGUgMTAtYnl0ZSBiYW5uZXIgZmlsZQotCQllY2hvICJhYmNkZWZnaGkiID4kT0JKL2Jhbm5lci5pbgotCWVsc2UKLQkJIyBpbmNyZWFzZSBzaXplIDEweAotCQljcCAkT0JKL2Jhbm5lci5pbiAkT0JKL2Jhbm5lci5vdXQKLQkJZm9yIGkgaW4gMCAxIDIgMyA0IDUgNiA3IDggOyBkbwotCQkJY2F0ICRPQkovYmFubmVyLm91dCA+PiAkT0JKL2Jhbm5lci5pbgotCQlkb25lCi0JZmkKLQotCXRyYWNlICJ0ZXN0IGJhbm5lciBzaXplICRzIgotCXZlcmJvc2UgInRlc3QgJHRpZDogc2l6ZSAkcyIKLQkoICR7U1NIfSAtMiAtRiAkT0JKL3NzaF9wcm94eSBvdGhlcmhvc3QgdHJ1ZSAyPiRPQkovYmFubmVyLm91dCAmJiBcCi0JCWNtcCAkT0JKL2Jhbm5lci5pbiAkT0JKL2Jhbm5lci5vdXQgKSB8fCBcCi0JCWZhaWwgImJhbm5lciBzaXplICRzIG1pc21hdGNoIgotZG9uZQotCi10cmFjZSAidGVzdCBzdXBwcmVzcyBiYW5uZXIgKC1xKSIKLXZlcmJvc2UgInRlc3QgJHRpZDogc3VwcHJlc3MgYmFubmVyICgtcSkiCi0oICR7U1NIfSAtcSAtMiAtRiAkT0JKL3NzaF9wcm94eSBvdGhlcmhvc3QgdHJ1ZSAyPiRPQkovYmFubmVyLm91dCAmJiBcCi0JY21wICRPQkovZW1wdHkuaW4gJE9CSi9iYW5uZXIub3V0ICkgfHwgXAotCWZhaWwgInN1cHByZXNzIGJhbm5lciAoLXEpIgotCi1ybSAtZiAkT0JKL2Jhbm5lci5vdXQgJE9CSi9iYW5uZXIuaW4gJE9CSi9lbXB0eS5pbgpkaWZmIC0tZ2l0IGEvcmVncmVzcy9icm9rZW4tcGlwZS5zaCBiL3JlZ3Jlc3MvYnJva2VuLXBpcGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGM4NDkuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9icm9rZW4tcGlwZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMJJE9wZW5CU0Q6IGJyb2tlbi1waXBlLnNoLHYgMS40IDIwMDIvMDMvMTUgMTM6MDg6NTYgbWFya3VzIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJicm9rZW4gcGlwZSB0ZXN0IgotCi1mb3IgcCBpbiAxIDI7IGRvCi0JdHJhY2UgInByb3RvY29sICRwIgotCWZvciBpIGluIDEgMiAzIDQ7IGRvCi0JCSR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfY29uZmlnX2NvbmZpZyBuZXh0aG9zdCBlY2hvICRpIDI+IC9kZXYvbnVsbCB8IHRydWUKLQkJcj0kPwotCQlpZiBbICRyIC1uZSAwIF07IHRoZW4KLQkJCWZhaWwgImJyb2tlbiBwaXBlIHJldHVybnMgJHIgZm9yIHByb3RvY29sICRwIgotCQlmaQotCWRvbmUKLWRvbmUKZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvYnJva2Vua2V5cy5zaCBiL3JlZ3Jlc3MvYnJva2Vua2V5cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U3MGMzNC4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL2Jyb2tlbmtleXMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jCSRPcGVuQlNEOiBicm9rZW5rZXlzLnNoLHYgMS4xIDIwMDQvMTAvMjkgMjM6NTk6MjIgZGptIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJicm9rZW4ga2V5cyIKLQotS0VZUz0iJE9CSi9hdXRob3JpemVkX2tleXNfJHtVU0VSfSIKLQotc3RhcnRfc3NoZAotCi1tdiAke0tFWVN9ICR7S0VZU30uYmFrCi0KLSMgVHJ1bmNhdGVkIGtleQotZWNobyAic3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkl3QUFBSUVBQlRNPSBiYWQga2V5IiA+ICRLRVlTCi1jYXQgJHtLRVlTfS5iYWsgPj4gJHtLRVlTfQotY2F0ICRPQkovJHQucHViID4+ICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCi0KLSR7U1NIfSAtMiAtRiAkT0JKL3NzaF9jb25maWcgc29tZWhvc3QgdHJ1ZQotaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JZmFpbCAic3NoIGNvbm5lY3Qgd2l0aCBwcm90b2NvbCAkcCBmYWlsZWQiCi1maQotCi1tdiAke0tFWVN9LmJhayAke0tFWVN9Ci0KZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvYnNkLnJlZ3Jlc3MubWsgYi9yZWdyZXNzL2JzZC5yZWdyZXNzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjgwMTFhLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvYnNkLnJlZ3Jlc3MubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jCSRPcGVuQlNEOiBic2QucmVncmVzcy5tayx2IDEuOSAyMDAyLzAyLzE3IDAxOjEwOjE1IG1hcmMgRXhwICQKLSMgTm8gbWFuIHBhZ2VzIGZvciByZWdyZXNzaW9uIHRlc3RzLgotTk9NQU49Ci0KLSMgTm8gaW5zdGFsbGF0aW9uLgotaW5zdGFsbDoKLQotIyBJZiBSRUdSRVNTVEFSR0VUUyBpcyBkZWZpbmVkIGFuZCBQUk9HIGlzIG5vdCBkZWZpbmVkLCBzZXQgTk9QUk9HCi0uaWYgZGVmaW5lZChSRUdSRVNTVEFSR0VUUykgJiYgIWRlZmluZWQoUFJPRykKLU5PUFJPRz0KLS5lbmRpZgotCi0uaW5jbHVkZSA8YnNkLnByb2cubWs+Ci0KLS5NQUlOOiBhbGwKLWFsbDogcmVncmVzcwotCi0jIFhYWCAtIE5lZWQgZnVsbCBwYXRoIHRvIFJFR1JFU1NMT0csIG90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIG11Y2ggcGFpbi4KLQotUkVHUkVTU0xPRz89L2Rldi9udWxsCi1SRUdSRVNTTkFNRT0key5DVVJESVI6Uy8ke0JTRFNSQ0RJUn1cL3JlZ3Jlc3NcLy8vfQotCi0uaWYgZGVmaW5lZChQUk9HKSAmJiAhZW1wdHkoUFJPRykKLXJ1bi1yZWdyZXNzLSR7UFJPR306ICR7UFJPR30KLQkuLyR7UFJPR30KLS5lbmRpZgotCi0uaWYgIWRlZmluZWQoUkVHUkVTU1RBUkdFVFMpCi1SRUdSRVNTVEFSR0VUUz1ydW4tcmVncmVzcy0ke1BST0d9Ci0uICBpZiBkZWZpbmVkKFJFR1JFU1NTS0lQKQotUkVHUkVTU1NLSVBUQVJHRVRTPXJ1bi1yZWdyZXNzLSR7UFJPR30KLS4gIGVuZGlmCi0uZW5kaWYKLQotUkVHUkVTU1NLSVBTTE9XPz1ubwotCi0jLmlmICgke1JFR1JFU1NTS0lQU0xPVzpMfSA9PSAieWVzIikgJiYgZGVmaW5lZChSRUdSRVNTU0xPV1RBUkdFVFMpCi0KLS5pZiAoJHtSRUdSRVNTU0tJUFNMT1d9ID09ICJ5ZXMiKSAmJiBkZWZpbmVkKFJFR1JFU1NTTE9XVEFSR0VUUykKLVJFR1JFU1NTS0lQVEFSR0VUUys9JHtSRUdSRVNTU0xPV1RBUkdFVFN9Ci0uZW5kaWYKLQotLmlmIGRlZmluZWQoUkVHUkVTU1JPT1RUQVJHRVRTKQotUk9PVFVTRVIhPWlkIC1nCi1TVURPPz0KLS4gaWYgKCR7Uk9PVFVTRVJ9ICE9IDApICYmIGVtcHR5KFNVRE8pCi1SRUdSRVNTU0tJUFRBUkdFVFMrPSR7UkVHUkVTU1JPT1RUQVJHRVRTfQotLiBlbmRpZgotLmVuZGlmCi0KLVJFR1JFU1NTS0lQVEFSR0VUUz89Ci0KLXJlZ3Jlc3M6Ci0uZm9yIFJUIGluICR7UkVHUkVTU1RBUkdFVFN9IAotLiAgaWYgJHtSRUdSRVNTU0tJUFRBUkdFVFM6TSR7UlR9fQotCUBlY2hvIC1uICJTS0lQICIgPj4gJHtSRUdSRVNTTE9HfQotLiAgZWxzZQotIyBYWFggLSB3ZSBuZWVkIGEgYmV0dGVyIG1ldGhvZCB0byBzZWUgaWYgYSB0ZXN0IGZhaWxzIGR1ZSB0byB0aW1lb3V0IG9yIGp1c3QKLSMgICAgICAgbm9ybWFsIGZhaWx1cmUuCi0uICAgaWYgIWRlZmluZWQoUkVHUkVTU01BWFRJTUUpCi0JQGlmIGNkICR7LkNVUkRJUn0gJiYgJHtNQUtFfSAke1JUfTsgdGhlbiBcCi0JICAgIGVjaG8gLW4gIlNVQ0NFU1MgIiA+PiAke1JFR1JFU1NMT0d9IDsgXAotCWVsc2UgXAotCSAgICBlY2hvIC1uICJGQUlMICIgPj4gJHtSRUdSRVNTTE9HfSA7IFwKLQkgICAgZWNobyBGQUlMRUQgOyBcCi0JZmkKLS4gICBlbHNlCi0JQGlmIGNkICR7LkNVUkRJUn0gJiYgKHVsaW1pdCAtdCAke1JFR1JFU1NNQVhUSU1FfSA7ICR7TUFLRX0gJHtSVH0pOyB0aGVuIFwKLQkgICAgZWNobyAtbiAiU1VDQ0VTUyAiID4+ICR7UkVHUkVTU0xPR30gOyBcCi0JZWxzZSBcCi0JICAgIGVjaG8gLW4gIkZBSUwgKHBvc3NpYmxlIHRpbWVvdXQpICIgPj4gJHtSRUdSRVNTTE9HfSA7IFwKLQkgICAgZWNobyBGQUlMRUQgOyBcCi0JZmkKLS4gICBlbmRpZgotLiAgZW5kaWYKLQlAZWNobyAke1JFR1JFU1NOQU1FfS8ke1JUOlMvXnJ1bi1yZWdyZXNzLS8vfSA+PiAke1JFR1JFU1NMT0d9Ci0uZW5kZm9yCi0KLS5QSE9OWTogcmVncmVzcwpkaWZmIC0tZ2l0IGEvcmVncmVzcy9jZXJ0LWhvc3RrZXkuc2ggYi9yZWdyZXNzL2NlcnQtaG9zdGtleS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxNmFiZC4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL2NlcnQtaG9zdGtleS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0jCSRPcGVuQlNEOiBjZXJ0LWhvc3RrZXkuc2gsdiAxLjYgMjAxMS8wNS8yMCAwMjo0MzozNiBkam0gRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9ImNlcnRpZmllZCBob3N0IGtleXMiCi0KLSMgdXNlZCB0byBkaXNhYmxlIEVDQyBiYXNlZCB0ZXN0cyBvbiBwbGF0Zm9ybXMgd2l0aG91dCBFQ0MKLWVjZHNhPSIiCi1pZiB0ZXN0ICJ4JFRFU1RfU1NIX0VDQyIgPSAieHllcyI7IHRoZW4KLQllY2RzYT1lY2RzYQotZmkKLQotcm0gLWYgJE9CSi9rbm93bl9ob3N0cy1jZXJ0ICRPQkovaG9zdF9jYV9rZXkqICRPQkovY2VydF9ob3N0X2tleSoKLWNwICRPQkovc3NoZF9wcm94eSAkT0JKL3NzaGRfcHJveHlfYmFrCi0KLUhPU1RTPSdsb2NhbGhvc3Qtd2l0aC1hbGlhcywxMjcuMC4wLjEsOjoxJwotCi0jIENyZWF0ZSBhIENBIGtleSBhbmQgYWRkIGl0IHRvIGtub3duIGhvc3RzCi0ke1NTSEtFWUdFTn0gLXEgLU4gJycgLXQgcnNhICAtZiAkT0JKL2hvc3RfY2Ffa2V5IHx8XAotCWZhaWwgInNzaC1rZXlnZW4gb2YgaG9zdF9jYV9rZXkgZmFpbGVkIgotKAotCWVjaG9uICdAY2VydC1hdXRob3JpdHkgJwotCWVjaG9uICIkSE9TVFMgIgotCWNhdCAkT0JKL2hvc3RfY2Ffa2V5LnB1YgotKSA+ICRPQkova25vd25faG9zdHMtY2VydAotCi0jIEdlbmVyYXRlIGFuZCBzaWduIGhvc3Qga2V5cwotZm9yIGt0eXBlIGluIHJzYSBkc2EgJGVjZHNhIDsgZG8gCi0JdmVyYm9zZSAiJHRpZDogc2lnbiBob3N0ICR7a3R5cGV9IGNlcnQiCi0JIyBHZW5lcmF0ZSBhbmQgc2lnbiBhIGhvc3Qga2V5Ci0JJHtTU0hLRVlHRU59IC1xIC1OICcnIC10ICR7a3R5cGV9IFwKLQkgICAgLWYgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9IHx8IFwKLQkJZmFpbCAic3NoLWtleWdlbiBvZiBjZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9IGZhaWxlZCIKLQkke1NTSEtFWUdFTn0gLWggLXEgLXMgJE9CSi9ob3N0X2NhX2tleSBcCi0JICAgIC1JICJyZWdyZXNzIGhvc3Qga2V5IGZvciAkVVNFUiIgXAotCSAgICAtbiAkSE9TVFMgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9IHx8Ci0JCWZhaWwgImNvdWxkbid0IHNpZ24gY2VydF9ob3N0X2tleV8ke2t0eXBlfSIKLQkjIHYwMCBlY2RzYSBjZXJ0cyBkbyBub3QgZXhpc3QKLQl0ZXN0ICIke2t0eXBlfSIgPSAiZWNkc2EiICYmIGNvbnRpbnVlCi0JY3AgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9ICRPQkovY2VydF9ob3N0X2tleV8ke2t0eXBlfV92MDAKLQljcCAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdHlwZX0ucHViICRPQkovY2VydF9ob3N0X2tleV8ke2t0eXBlfV92MDAucHViCi0JJHtTU0hLRVlHRU59IC10IHYwMCAtaCAtcSAtcyAkT0JKL2hvc3RfY2Ffa2V5IFwKLQkgICAgLUkgInJlZ3Jlc3MgaG9zdCBrZXkgZm9yICRVU0VSIiBcCi0JICAgIC1uICRIT1NUUyAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdHlwZX1fdjAwIHx8Ci0JCWZhaWwgImNvdWxkbid0IHNpZ24gY2VydF9ob3N0X2tleV8ke2t0eXBlfV92MDAiCi1kb25lCi0KLSMgQmFzaWMgY29ubmVjdCB0ZXN0cwotZm9yIHByaXZzZXAgaW4geWVzIG5vIDsgZG8KLQlmb3Iga3R5cGUgaW4gcnNhIGRzYSAkZWNkc2EgcnNhX3YwMCBkc2FfdjAwOyBkbyAKLQkJdmVyYm9zZSAiJHRpZDogaG9zdCAke2t0eXBlfSBjZXJ0IGNvbm5lY3QgcHJpdnNlcCAkcHJpdnNlcCIKLQkJKAotCQkJY2F0ICRPQkovc3NoZF9wcm94eV9iYWsKLQkJCWVjaG8gSG9zdEtleSAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdHlwZX0KLQkJCWVjaG8gSG9zdENlcnRpZmljYXRlICRPQkovY2VydF9ob3N0X2tleV8ke2t0eXBlfS1jZXJ0LnB1YgotCQkJZWNobyBVc2VQcml2aWxlZ2VTZXBhcmF0aW9uICRwcml2c2VwCi0JCSkgPiAkT0JKL3NzaGRfcHJveHkKLQotCQkke1NTSH0gLTIgLW9Vc2VyS25vd25Ib3N0c0ZpbGU9JE9CSi9rbm93bl9ob3N0cy1jZXJ0IFwKLQkJICAgIC1vR2xvYmFsS25vd25Ib3N0c0ZpbGU9JE9CSi9rbm93bl9ob3N0cy1jZXJ0IFwKLQkJCS1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0IHRydWUKLQkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCQlmYWlsICJzc2ggY2VydCBjb25uZWN0IGZhaWxlZCIKLQkJZmkKLQlkb25lCi1kb25lCi0KLSMgUmV2b2tlZCBjZXJ0aWZpY2F0ZXMgd2l0aCBrZXkgcHJlc2VudAotKAotCWVjaG9uICdAY2VydC1hdXRob3JpdHkgJwotCWVjaG9uICIkSE9TVFMgIgotCWNhdCAkT0JKL2hvc3RfY2Ffa2V5LnB1YgotCWVjaG9uICdAcmV2b2tlZCAnCi0JZWNob24gIiogIgotCWNhdCAkT0JKL2NlcnRfaG9zdF9rZXlfcnNhLnB1YgotCWlmIHRlc3QgIngkVEVTVF9TU0hfRUNDIiA9ICJ4eWVzIjsgdGhlbgotCQllY2hvbiAnQHJldm9rZWQgJwotCQllY2hvbiAiKiAiCi0JCWNhdCAkT0JKL2NlcnRfaG9zdF9rZXlfZWNkc2EucHViCi0JZmkKLQllY2hvbiAnQHJldm9rZWQgJwotCWVjaG9uICIqICIKLQljYXQgJE9CSi9jZXJ0X2hvc3Rfa2V5X2RzYS5wdWIKLQllY2hvbiAnQHJldm9rZWQgJwotCWVjaG9uICIqICIKLQljYXQgJE9CSi9jZXJ0X2hvc3Rfa2V5X3JzYV92MDAucHViCi0JZWNob24gJ0ByZXZva2VkICcKLQllY2hvbiAiKiAiCi0JY2F0ICRPQkovY2VydF9ob3N0X2tleV9kc2FfdjAwLnB1YgotKSA+ICRPQkova25vd25faG9zdHMtY2VydAotZm9yIHByaXZzZXAgaW4geWVzIG5vIDsgZG8KLQlmb3Iga3R5cGUgaW4gcnNhIGRzYSAkZWNkc2EgcnNhX3YwMCBkc2FfdjAwOyBkbyAKLQkJdmVyYm9zZSAiJHRpZDogaG9zdCAke2t0eXBlfSByZXZva2VkIGNlcnQgcHJpdnNlcCAkcHJpdnNlcCIKLQkJKAotCQkJY2F0ICRPQkovc3NoZF9wcm94eV9iYWsKLQkJCWVjaG8gSG9zdEtleSAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdHlwZX0KLQkJCWVjaG8gSG9zdENlcnRpZmljYXRlICRPQkovY2VydF9ob3N0X2tleV8ke2t0eXBlfS1jZXJ0LnB1YgotCQkJZWNobyBVc2VQcml2aWxlZ2VTZXBhcmF0aW9uICRwcml2c2VwCi0JCSkgPiAkT0JKL3NzaGRfcHJveHkKLQotCQkke1NTSH0gLTIgLW9Vc2VyS25vd25Ib3N0c0ZpbGU9JE9CSi9rbm93bl9ob3N0cy1jZXJ0IFwKLQkJICAgIC1vR2xvYmFsS25vd25Ib3N0c0ZpbGU9JE9CSi9rbm93bl9ob3N0cy1jZXJ0IFwKLQkJCS1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0IHRydWUgPi9kZXYvbnVsbCAyPiYxCi0JCWlmIFsgJD8gLWVxIDAgXTsgdGhlbgotCQkJZmFpbCAic3NoIGNlcnQgY29ubmVjdCBzdWNjZWVkZWQgdW5leHBlY3RlZGx5IgotCQlmaQotCWRvbmUKLWRvbmUKLQotIyBSZXZva2VkIENBCi0oCi0JZWNob24gJ0BjZXJ0LWF1dGhvcml0eSAnCi0JZWNob24gIiRIT1NUUyAiCi0JY2F0ICRPQkovaG9zdF9jYV9rZXkucHViCi0JZWNob24gJ0ByZXZva2VkICcKLQllY2hvbiAiKiAiCi0JY2F0ICRPQkovaG9zdF9jYV9rZXkucHViCi0pID4gJE9CSi9rbm93bl9ob3N0cy1jZXJ0Ci1mb3Iga3R5cGUgaW4gcnNhIGRzYSAkZWNkc2EgcnNhX3YwMCBkc2FfdjAwIDsgZG8gCi0JdmVyYm9zZSAiJHRpZDogaG9zdCAke2t0eXBlfSByZXZva2VkIGNlcnQiCi0JKAotCQljYXQgJE9CSi9zc2hkX3Byb3h5X2JhawotCQllY2hvIEhvc3RLZXkgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9Ci0JCWVjaG8gSG9zdENlcnRpZmljYXRlICRPQkovY2VydF9ob3N0X2tleV8ke2t0eXBlfS1jZXJ0LnB1YgotCSkgPiAkT0JKL3NzaGRfcHJveHkKLQkke1NTSH0gLTIgLW9Vc2VyS25vd25Ib3N0c0ZpbGU9JE9CSi9rbm93bl9ob3N0cy1jZXJ0IFwKLQkgICAgLW9HbG9iYWxLbm93bkhvc3RzRmlsZT0kT0JKL2tub3duX2hvc3RzLWNlcnQgXAotCQktRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlID4vZGV2L251bGwgMj4mMQotCWlmIFsgJD8gLWVxIDAgXTsgdGhlbgotCQlmYWlsICJzc2ggY2VydCBjb25uZWN0IHN1Y2NlZWRlZCB1bmV4cGVjdGVkbHkiCi0JZmkKLWRvbmUKLQotIyBDcmVhdGUgYSBDQSBrZXkgYW5kIGFkZCBpdCB0byBrbm93biBob3N0cwotKAotCWVjaG9uICdAY2VydC1hdXRob3JpdHkgJwotCWVjaG9uICIkSE9TVFMgIgotCWNhdCAkT0JKL2hvc3RfY2Ffa2V5LnB1YgotKSA+ICRPQkova25vd25faG9zdHMtY2VydAotCi10ZXN0X29uZSgpIHsKLQlpZGVudD0kMQotCXJlc3VsdD0kMgotCXNpZ25fb3B0cz0kMwotCi0JZm9yIGt0IGluIHJzYSByc2FfdjAwIDsgZG8KLQkJY2FzZSAka3QgaW4KLQkJKl92MDApIGFyZ3M9Ii10IHYwMCIgOzsKLQkJKikgYXJncz0iIiA7OwotCQllc2FjCi0KLQkJdmVyYm9zZSAiJHRpZDogaG9zdCBjZXJ0IGNvbm5lY3QgJGlkZW50ICRrdCBleHBlY3QgJHJlc3VsdCIKLQkJJHtTU0hLRVlHRU59IC1xIC1zICRPQkovaG9zdF9jYV9rZXkgXAotCQkgICAgLUkgInJlZ3Jlc3MgaG9zdCBrZXkgZm9yICRVU0VSIiBcCi0JCSAgICAkc2lnbl9vcHRzICRhcmdzIFwKLQkJICAgICRPQkovY2VydF9ob3N0X2tleV8ke2t0fSB8fAotCQkJZmFpbCAiY291bGRuJ3Qgc2lnbiBjZXJ0X2hvc3Rfa2V5XyR7a3R9IgotCQkoCi0JCQljYXQgJE9CSi9zc2hkX3Byb3h5X2JhawotCQkJZWNobyBIb3N0S2V5ICRPQkovY2VydF9ob3N0X2tleV8ke2t0fQotCQkJZWNobyBIb3N0Q2VydGlmaWNhdGUgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R9LWNlcnQucHViCi0JCSkgPiAkT0JKL3NzaGRfcHJveHkKLQkKLQkJJHtTU0h9IC0yIC1vVXNlcktub3duSG9zdHNGaWxlPSRPQkova25vd25faG9zdHMtY2VydCBcCi0JCSAgICAtb0dsb2JhbEtub3duSG9zdHNGaWxlPSRPQkova25vd25faG9zdHMtY2VydCBcCi0JCSAgICAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlID4vZGV2L251bGwgMj4mMQotCQlyYz0kPwotCQlpZiBbICJ4JHJlc3VsdCIgPSAieHN1Y2Nlc3MiIF0gOyB0aGVuCi0JCQlpZiBbICRyYyAtbmUgMCBdOyB0aGVuCi0JCQkJZmFpbCAic3NoIGNlcnQgY29ubmVjdCAkaWRlbnQgZmFpbGVkIHVuZXhwZWN0ZWRseSIKLQkJCWZpCi0JCWVsc2UKLQkJCWlmIFsgJHJjIC1lcSAwIF07IHRoZW4KLQkJCQlmYWlsICJzc2ggY2VydCBjb25uZWN0ICRpZGVudCBzdWNjZWVkZWQgdW5leHBlY3RlZGx5IgotCQkJZmkKLQkJZmkKLQlkb25lCi19Ci0KLXRlc3Rfb25lICJ1c2VyLWNlcnRpZmljYXRlIglmYWlsdXJlICItbiAkSE9TVFMiCi10ZXN0X29uZSAiZW1wdHkgcHJpbmNpcGFscyIJc3VjY2VzcyAiLWgiCi10ZXN0X29uZSAid3JvbmcgcHJpbmNpcGFscyIJZmFpbHVyZSAiLWggLW4gZm9vIgotdGVzdF9vbmUgImNlcnQgbm90IHlldCB2YWxpZCIJZmFpbHVyZSAiLWggLVYyMDIwMDEwMToyMDMwMDEwMSIKLXRlc3Rfb25lICJjZXJ0IGV4cGlyZWQiCQlmYWlsdXJlICItaCAtVjE5ODAwMTAxOjE5OTAwMTAxIgotdGVzdF9vbmUgImNlcnQgdmFsaWQgaW50ZXJ2YWwiCXN1Y2Nlc3MgIi1oIC1WLTF3OisydyIKLXRlc3Rfb25lICJjZXJ0IGhhcyBjb25zdHJhaW50cyIJZmFpbHVyZSAiLWggLU9mb3JjZS1jb21tYW5kPWZhbHNlIgotCi0jIENoZWNrIGRvd25ncmFkZSBvZiBjZXJ0IHRvIHJhdyBrZXkgd2hlbiBubyBDQSBmb3VuZAotZm9yIHYgaW4gdjAxIHYwMCA7ICBkbyAKLQlmb3Iga3R5cGUgaW4gcnNhIGRzYSAkZWNkc2EgOyBkbyAKLQkJIyB2MDAgZWNkc2EgY2VydHMgZG8gbm90IGV4aXN0LgotCQl0ZXN0ICIke3Z9JHtrdHlwZX0iID0gInYwMGVjZHNhIiAmJiBjb250aW51ZQotCQlybSAtZiAkT0JKL2tub3duX2hvc3RzLWNlcnQgJE9CSi9jZXJ0X2hvc3Rfa2V5KgotCQl2ZXJib3NlICIkdGlkOiBob3N0ICR7a3R5cGV9ICR7dn0gY2VydCBkb3duZ3JhZGUgdG8gcmF3IGtleSIKLQkJIyBHZW5lcmF0ZSBhbmQgc2lnbiBhIGhvc3Qga2V5Ci0JCSR7U1NIS0VZR0VOfSAtcSAtTiAnJyAtdCAke2t0eXBlfSBcCi0JCSAgICAtZiAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdHlwZX0gfHwgXAotCQkJZmFpbCAic3NoLWtleWdlbiBvZiBjZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9IGZhaWxlZCIKLQkJJHtTU0hLRVlHRU59IC10ICR7dn0gLWggLXEgLXMgJE9CSi9ob3N0X2NhX2tleSBcCi0JCSAgICAtSSAicmVncmVzcyBob3N0IGtleSBmb3IgJFVTRVIiIFwKLQkJICAgIC1uICRIT1NUUyAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdHlwZX0gfHwKLQkJCWZhaWwgImNvdWxkbid0IHNpZ24gY2VydF9ob3N0X2tleV8ke2t0eXBlfSIKLQkJKAotCQkJZWNob24gIiRIT1NUUyAiCi0JCQljYXQgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9LnB1YgotCQkpID4gJE9CSi9rbm93bl9ob3N0cy1jZXJ0Ci0JCSgKLQkJCWNhdCAkT0JKL3NzaGRfcHJveHlfYmFrCi0JCQllY2hvIEhvc3RLZXkgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R5cGV9Ci0JCQllY2hvIEhvc3RDZXJ0aWZpY2F0ZSAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdHlwZX0tY2VydC5wdWIKLQkJKSA+ICRPQkovc3NoZF9wcm94eQotCQkKLQkJJHtTU0h9IC0yIC1vVXNlcktub3duSG9zdHNGaWxlPSRPQkova25vd25faG9zdHMtY2VydCBcCi0JCSAgICAtb0dsb2JhbEtub3duSG9zdHNGaWxlPSRPQkova25vd25faG9zdHMtY2VydCBcCi0JCQktRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlCi0JCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQkJZmFpbCAic3NoIGNlcnQgY29ubmVjdCBmYWlsZWQiCi0JCWZpCi0JZG9uZQotZG9uZQotCi0jIFdyb25nIGNlcnRpZmljYXRlCi0oCi0JZWNob24gJ0BjZXJ0LWF1dGhvcml0eSAnCi0JZWNob24gIiRIT1NUUyAiCi0JY2F0ICRPQkovaG9zdF9jYV9rZXkucHViCi0pID4gJE9CSi9rbm93bl9ob3N0cy1jZXJ0Ci1mb3IgdiBpbiB2MDEgdjAwIDsgIGRvIAotCWZvciBrdCBpbiByc2EgZHNhICRlY2RzYSA7IGRvIAotCQkjIHYwMCBlY2RzYSBjZXJ0cyBkbyBub3QgZXhpc3QuCi0JCXRlc3QgIiR7dn0ke2t0eXBlfSIgPSAidjAwZWNkc2EiICYmIGNvbnRpbnVlCi0JCXJtIC1mICRPQkovY2VydF9ob3N0X2tleSoKLQkJIyBTZWxmLXNpZ24ga2V5Ci0JCSR7U1NIS0VZR0VOfSAtcSAtTiAnJyAtdCAke2t0fSBcCi0JCSAgICAtZiAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdH0gfHwgXAotCQkJZmFpbCAic3NoLWtleWdlbiBvZiBjZXJ0X2hvc3Rfa2V5XyR7a3R9IGZhaWxlZCIKLQkJJHtTU0hLRVlHRU59IC10ICR7dn0gLWggLXEgLXMgJE9CSi9jZXJ0X2hvc3Rfa2V5XyR7a3R9IFwKLQkJICAgIC1JICJyZWdyZXNzIGhvc3Qga2V5IGZvciAkVVNFUiIgXAotCQkgICAgLW4gJEhPU1RTICRPQkovY2VydF9ob3N0X2tleV8ke2t0fSB8fAotCQkJZmFpbCAiY291bGRuJ3Qgc2lnbiBjZXJ0X2hvc3Rfa2V5XyR7a3R9IgotCQl2ZXJib3NlICIkdGlkOiBob3N0ICR7a3R9IGNvbm5lY3Qgd3JvbmcgY2VydCIKLQkJKAotCQkJY2F0ICRPQkovc3NoZF9wcm94eV9iYWsKLQkJCWVjaG8gSG9zdEtleSAkT0JKL2NlcnRfaG9zdF9rZXlfJHtrdH0KLQkJCWVjaG8gSG9zdENlcnRpZmljYXRlICRPQkovY2VydF9ob3N0X2tleV8ke2t0fS1jZXJ0LnB1YgotCQkpID4gJE9CSi9zc2hkX3Byb3h5Ci0JCi0JCSR7U1NIfSAtMiAtb1VzZXJLbm93bkhvc3RzRmlsZT0kT0JKL2tub3duX2hvc3RzLWNlcnQgXAotCQkgICAgLW9HbG9iYWxLbm93bkhvc3RzRmlsZT0kT0JKL2tub3duX2hvc3RzLWNlcnQgXAotCQkJLUYgJE9CSi9zc2hfcHJveHkgLXEgc29tZWhvc3QgdHJ1ZSA+L2Rldi9udWxsIDI+JjEKLQkJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCi0JCQlmYWlsICJzc2ggY2VydCBjb25uZWN0ICRpZGVudCBzdWNjZWVkZWQgdW5leHBlY3RlZGx5IgotCQlmaQotCWRvbmUKLWRvbmUKLQotcm0gLWYgJE9CSi9rbm93bl9ob3N0cy1jZXJ0ICRPQkovaG9zdF9jYV9rZXkqICRPQkovY2VydF9ob3N0X2tleSoKZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvY2VydC11c2Vya2V5LnNoIGIvcmVncmVzcy9jZXJ0LXVzZXJrZXkuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MDBkYjIuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9jZXJ0LXVzZXJrZXkuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotIwkkT3BlbkJTRDogY2VydC11c2Vya2V5LnNoLHYgMS44IDIwMTEvMDUvMTcgMDc6MTM6MzEgZGptIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJjZXJ0aWZpZWQgdXNlciBrZXlzIgotCi0jIHVzZWQgdG8gZGlzYWJsZSBFQ0MgYmFzZWQgdGVzdHMgb24gcGxhdGZvcm1zIHdpdGhvdXQgRUNDCi1lY2RzYT0iIgotaWYgdGVzdCAieCRURVNUX1NTSF9FQ0MiID0gInh5ZXMiOyB0aGVuCi0JZWNkc2E9ZWNkc2EKLWZpCi0KLXJtIC1mICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSICRPQkovdXNlcl9jYV9rZXkqICRPQkovY2VydF91c2VyX2tleSoKLWNwICRPQkovc3NoZF9wcm94eSAkT0JKL3NzaGRfcHJveHlfYmFrCi0KLSMgQ3JlYXRlIGEgQ0Ega2V5Ci0ke1NTSEtFWUdFTn0gLXEgLU4gJycgLXQgcnNhICAtZiAkT0JKL3VzZXJfY2Ffa2V5IHx8XAotCWZhaWwgInNzaC1rZXlnZW4gb2YgdXNlcl9jYV9rZXkgZmFpbGVkIgotCi0jIEdlbmVyYXRlIGFuZCBzaWduIHVzZXIga2V5cwotZm9yIGt0eXBlIGluIHJzYSBkc2EgJGVjZHNhIDsgZG8gCi0JdmVyYm9zZSAiJHRpZDogc2lnbiB1c2VyICR7a3R5cGV9IGNlcnQiCi0JJHtTU0hLRVlHRU59IC1xIC1OICcnIC10ICR7a3R5cGV9IFwKLQkgICAgLWYgJE9CSi9jZXJ0X3VzZXJfa2V5XyR7a3R5cGV9IHx8IFwKLQkJZmFpbCAic3NoLWtleWdlbiBvZiBjZXJ0X3VzZXJfa2V5XyR7a3R5cGV9IGZhaWxlZCIKLQkke1NTSEtFWUdFTn0gLXEgLXMgJE9CSi91c2VyX2NhX2tleSAtSSBcCi0JICAgICJyZWdyZXNzIHVzZXIga2V5IGZvciAkVVNFUiIgXAotCSAgICAtbiAke1VTRVJ9LG1la21pdGFzZGlnb2F0ICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSB8fAotCQlmYWlsICJjb3VsZG4ndCBzaWduIGNlcnRfdXNlcl9rZXlfJHtrdHlwZX0iCi0JIyB2MDAgZWNkc2EgY2VydHMgZG8gbm90IGV4aXN0Ci0JdGVzdCAiJHtrdHlwZX0iID0gImVjZHNhIiAmJiBjb250aW51ZQotCWNwICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX1fdjAwCi0JY3AgJE9CSi9jZXJ0X3VzZXJfa2V5XyR7a3R5cGV9LnB1YiAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX1fdjAwLnB1YgotCSR7U1NIS0VZR0VOfSAtcSAtdCB2MDAgLXMgJE9CSi91c2VyX2NhX2tleSAtSSBcCi0JICAgICJyZWdyZXNzIHVzZXIga2V5IGZvciAkVVNFUiIgXAotCSAgICAtbiAke1VTRVJ9LG1la21pdGFzZGlnb2F0ICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfV92MDAgfHwKLQkJZmFpbCAiY291bGRuJ3Qgc2lnbiBjZXJ0X3VzZXJfa2V5XyR7a3R5cGV9X3YwMCIKLWRvbmUKLQotIyBUZXN0IGV4cGxpY2l0bHktc3BlY2lmaWVkIHByaW5jaXBhbHMKLWZvciBrdHlwZSBpbiByc2EgZHNhICRlY2RzYSByc2FfdjAwIGRzYV92MDAgOyBkbyAKLQlmb3IgcHJpdnNlcCBpbiB5ZXMgbm8gOyBkbwotCQlfcHJlZml4PSIke2t0eXBlfSBwcml2c2VwICRwcml2c2VwIgotCi0JCSMgU2V0dXAgZm9yIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZQotCQlybSAtZiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgotCQkoCi0JCQljYXQgJE9CSi9zc2hkX3Byb3h5X2JhawotCQkJZWNobyAiVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiAkcHJpdnNlcCIKLQkJCWVjaG8gIkF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSAiIFwKLQkJCSAgICAiJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJXUiCi0JCQllY2hvICJUcnVzdGVkVXNlckNBS2V5cyAkT0JKL3VzZXJfY2Ffa2V5LnB1YiIKLQkJKSA+ICRPQkovc3NoZF9wcm94eQotCi0JCSMgTWlzc2luZyBhdXRob3JpemVkX3ByaW5jaXBhbHMKLQkJdmVyYm9zZSAiJHRpZDogJHtfcHJlZml4fSBtaXNzaW5nIGF1dGhvcml6ZWRfcHJpbmNpcGFscyIKLQkJcm0gLWYgJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJFVTRVIKLQkJJHtTU0h9IC0yaSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gXAotCQkgICAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgdHJ1ZSA+L2Rldi9udWxsIDI+JjEKLQkJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCi0JCQlmYWlsICJzc2ggY2VydCBjb25uZWN0IHN1Y2NlZWRlZCB1bmV4cGVjdGVkbHkiCi0JCWZpCi0KLQkJIyBFbXB0eSBhdXRob3JpemVkX3ByaW5jaXBhbHMKLQkJdmVyYm9zZSAiJHRpZDogJHtfcHJlZml4fSBlbXB0eSBhdXRob3JpemVkX3ByaW5jaXBhbHMiCi0JCWVjaG8gPiAkT0JKL2F1dGhvcml6ZWRfcHJpbmNpcGFsc18kVVNFUgotCQkke1NTSH0gLTJpICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSBcCi0JCSAgICAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlID4vZGV2L251bGwgMj4mMQotCQlpZiBbICQ/IC1lcSAwIF07IHRoZW4KLQkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3Qgc3VjY2VlZGVkIHVuZXhwZWN0ZWRseSIKLQkJZmkKLQkKLQkJIyBXcm9uZyBhdXRob3JpemVkX3ByaW5jaXBhbHMKLQkJdmVyYm9zZSAiJHRpZDogJHtfcHJlZml4fSB3cm9uZyBhdXRob3JpemVkX3ByaW5jaXBhbHMiCi0JCWVjaG8gZ3JlZ29yc2Ftc2EgPiAkT0JKL2F1dGhvcml6ZWRfcHJpbmNpcGFsc18kVVNFUgotCQkke1NTSH0gLTJpICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSBcCi0JCSAgICAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlID4vZGV2L251bGwgMj4mMQotCQlpZiBbICQ/IC1lcSAwIF07IHRoZW4KLQkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3Qgc3VjY2VlZGVkIHVuZXhwZWN0ZWRseSIKLQkJZmkKLQotCQkjIENvcnJlY3QgYXV0aG9yaXplZF9wcmluY2lwYWxzCi0JCXZlcmJvc2UgIiR0aWQ6ICR7X3ByZWZpeH0gY29ycmVjdCBhdXRob3JpemVkX3ByaW5jaXBhbHMiCi0JCWVjaG8gbWVrbWl0YXNkaWdvYXQgPiAkT0JKL2F1dGhvcml6ZWRfcHJpbmNpcGFsc18kVVNFUgotCQkke1NTSH0gLTJpICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSBcCi0JCSAgICAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlID4vZGV2L251bGwgMj4mMQotCQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KLQkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3QgZmFpbGVkIgotCQlmaQotCi0JCSMgYXV0aG9yaXplZF9wcmluY2lwYWxzIHdpdGggYmFkIGtleSBvcHRpb24KLQkJdmVyYm9zZSAiJHRpZDogJHtfcHJlZml4fSBhdXRob3JpemVkX3ByaW5jaXBhbHMgYmFkIGtleSBvcHQiCi0JCWVjaG8gJ2JsYWggbWVrbWl0YXNkaWdvYXQnID4gJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJFVTRVIKLQkJJHtTU0h9IC0yaSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gXAotCQkgICAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgdHJ1ZSA+L2Rldi9udWxsIDI+JjEKLQkJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCi0JCQlmYWlsICJzc2ggY2VydCBjb25uZWN0IHN1Y2NlZWRlZCB1bmV4cGVjdGVkbHkiCi0JCWZpCi0KLQkJIyBhdXRob3JpemVkX3ByaW5jaXBhbHMgd2l0aCBjb21tYW5kPWZhbHNlCi0JCXZlcmJvc2UgIiR0aWQ6ICR7X3ByZWZpeH0gYXV0aG9yaXplZF9wcmluY2lwYWxzIGNvbW1hbmQ9ZmFsc2UiCi0JCWVjaG8gJ2NvbW1hbmQ9ImZhbHNlIiBtZWttaXRhc2RpZ29hdCcgPiBcCi0JCSAgICAkT0JKL2F1dGhvcml6ZWRfcHJpbmNpcGFsc18kVVNFUgotCQkke1NTSH0gLTJpICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSBcCi0JCSAgICAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlID4vZGV2L251bGwgMj4mMQotCQlpZiBbICQ/IC1lcSAwIF07IHRoZW4KLQkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3Qgc3VjY2VlZGVkIHVuZXhwZWN0ZWRseSIKLQkJZmkKLQotCi0JCSMgYXV0aG9yaXplZF9wcmluY2lwYWxzIHdpdGggY29tbWFuZD10cnVlCi0JCXZlcmJvc2UgIiR0aWQ6ICR7X3ByZWZpeH0gYXV0aG9yaXplZF9wcmluY2lwYWxzIGNvbW1hbmQ9dHJ1ZSIKLQkJZWNobyAnY29tbWFuZD0idHJ1ZSIgbWVrbWl0YXNkaWdvYXQnID4gXAotCQkgICAgJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJFVTRVIKLQkJJHtTU0h9IC0yaSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gXAotCQkgICAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgZmFsc2UgPi9kZXYvbnVsbCAyPiYxCi0JCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQkJZmFpbCAic3NoIGNlcnQgY29ubmVjdCBmYWlsZWQiCi0JCWZpCi0KLQkJIyBTZXR1cCBmb3IgcHJpbmNpcGFscz0ga2V5IG9wdGlvbgotCQlybSAtZiAkT0JKL2F1dGhvcml6ZWRfcHJpbmNpcGFsc18kVVNFUgotCQkoCi0JCQljYXQgJE9CSi9zc2hkX3Byb3h5X2JhawotCQkJZWNobyAiVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiAkcHJpdnNlcCIKLQkJKSA+ICRPQkovc3NoZF9wcm94eQotCi0JCSMgV3JvbmcgcHJpbmNpcGFscyBsaXN0Ci0JCXZlcmJvc2UgIiR0aWQ6ICR7X3ByZWZpeH0gd3JvbmcgcHJpbmNpcGFscyBrZXkgb3B0aW9uIgotCQkoCi0JCQllY2hvbiAnY2VydC1hdXRob3JpdHkscHJpbmNpcGFscz0iZ3JlZ29yc2Ftc2EiICcKLQkJCWNhdCAkT0JKL3VzZXJfY2Ffa2V5LnB1YgotCQkpID4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKLQkJJHtTU0h9IC0yaSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gXAotCQkgICAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgdHJ1ZSA+L2Rldi9udWxsIDI+JjEKLQkJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCi0JCQlmYWlsICJzc2ggY2VydCBjb25uZWN0IHN1Y2NlZWRlZCB1bmV4cGVjdGVkbHkiCi0JCWZpCi0KLQkJIyBDb3JyZWN0IHByaW5jaXBhbHMgbGlzdAotCQl2ZXJib3NlICIkdGlkOiAke19wcmVmaXh9IGNvcnJlY3QgcHJpbmNpcGFscyBrZXkgb3B0aW9uIgotCQkoCi0JCQllY2hvbiAnY2VydC1hdXRob3JpdHkscHJpbmNpcGFscz0ibWVrbWl0YXNkaWdvYXQiICcKLQkJCWNhdCAkT0JKL3VzZXJfY2Ffa2V5LnB1YgotCQkpID4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKLQkJJHtTU0h9IC0yaSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gXAotCQkgICAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgdHJ1ZSA+L2Rldi9udWxsIDI+JjEKLQkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCQlmYWlsICJzc2ggY2VydCBjb25uZWN0IGZhaWxlZCIKLQkJZmkKLQlkb25lCi1kb25lCi0KLWJhc2ljX3Rlc3RzKCkgewotCWF1dGg9JDEKLQlpZiB0ZXN0ICJ4JGF1dGgiID0gInhhdXRob3JpemVkX2tleXMiIDsgdGhlbgotCQkjIEFkZCBDQSB0byBhdXRob3JpemVkX2tleXMKLQkJKAotCQkJZWNob24gJ2NlcnQtYXV0aG9yaXR5ICcKLQkJCWNhdCAkT0JKL3VzZXJfY2Ffa2V5LnB1YgotCQkpID4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKLQllbHNlCi0JCWVjaG8gPiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgotCQlleHRyYV9zc2hkPSJUcnVzdGVkVXNlckNBS2V5cyAkT0JKL3VzZXJfY2Ffa2V5LnB1YiIKLQlmaQotCQotCWZvciBrdHlwZSBpbiByc2EgZHNhICRlY2RzYSByc2FfdjAwIGRzYV92MDAgOyBkbyAKLQkJZm9yIHByaXZzZXAgaW4geWVzIG5vIDsgZG8KLQkJCV9wcmVmaXg9IiR7a3R5cGV9IHByaXZzZXAgJHByaXZzZXAgJGF1dGgiCi0JCQkjIFNpbXBsZSBjb25uZWN0Ci0JCQl2ZXJib3NlICIkdGlkOiAke19wcmVmaXh9IGNvbm5lY3QiCi0JCQkoCi0JCQkJY2F0ICRPQkovc3NoZF9wcm94eV9iYWsKLQkJCQllY2hvICJVc2VQcml2aWxlZ2VTZXBhcmF0aW9uICRwcml2c2VwIgotCQkJCWVjaG8gIiRleHRyYV9zc2hkIgotCQkJKSA+ICRPQkovc3NoZF9wcm94eQotCQotCQkJJHtTU0h9IC0yaSAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gXAotCQkJICAgIC1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0IHRydWUKLQkJCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3QgZmFpbGVkIgotCQkJZmkKLQotCQkJIyBSZXZva2VkIGtleXMKLQkJCXZlcmJvc2UgIiR0aWQ6ICR7X3ByZWZpeH0gcmV2b2tlZCBrZXkiCi0JCQkoCi0JCQkJY2F0ICRPQkovc3NoZF9wcm94eV9iYWsKLQkJCQllY2hvICJVc2VQcml2aWxlZ2VTZXBhcmF0aW9uICRwcml2c2VwIgotCQkJCWVjaG8gIlJldm9rZWRLZXlzICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfS5wdWIiCi0JCQkJZWNobyAiJGV4dHJhX3NzaGQiCi0JCQkpID4gJE9CSi9zc2hkX3Byb3h5Ci0JCQkke1NTSH0gLTJpICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSBcCi0JCQkgICAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgdHJ1ZSA+L2Rldi9udWxsIDI+JjEKLQkJCWlmIFsgJD8gLWVxIDAgXTsgdGhlbgotCQkJCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3Qgc3VjY2VlZGVkIHVuZXhwZWNlZGx5IgotCQkJZmkKLQkJZG9uZQotCQotCQkjIFJldm9rZWQgQ0EKLQkJdmVyYm9zZSAiJHRpZDogJHtrdHlwZX0gJGF1dGggcmV2b2tlZCBDQSBrZXkiCi0JCSgKLQkJCWNhdCAkT0JKL3NzaGRfcHJveHlfYmFrCi0JCQllY2hvICJSZXZva2VkS2V5cyAkT0JKL3VzZXJfY2Ffa2V5LnB1YiIKLQkJCWVjaG8gIiRleHRyYV9zc2hkIgotCQkpID4gJE9CSi9zc2hkX3Byb3h5Ci0JCSR7U1NIfSAtMmkgJE9CSi9jZXJ0X3VzZXJfa2V5XyR7a3R5cGV9IC1GICRPQkovc3NoX3Byb3h5IFwKLQkJICAgIHNvbWVob3N0IHRydWUgPi9kZXYvbnVsbCAyPiYxCi0JCWlmIFsgJD8gLWVxIDAgXTsgdGhlbgotCQkJZmFpbCAic3NoIGNlcnQgY29ubmVjdCBzdWNjZWVkZWQgdW5leHBlY2VkbHkiCi0JCWZpCi0JZG9uZQotCQotCXZlcmJvc2UgIiR0aWQ6ICRhdXRoIENBIGRvZXMgbm90IGF1dGhlbnRpY2F0ZSIKLQkoCi0JCWNhdCAkT0JKL3NzaGRfcHJveHlfYmFrCi0JCWVjaG8gIiRleHRyYV9zc2hkIgotCSkgPiAkT0JKL3NzaGRfcHJveHkKLQl2ZXJib3NlICIkdGlkOiBlbnN1cmUgQ0Ega2V5IGRvZXMgbm90IGF1dGhlbnRpY2F0ZSB1c2VyIgotCSR7U1NIfSAtMmkgJE9CSi91c2VyX2NhX2tleSBcCi0JICAgIC1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0IHRydWUgPi9kZXYvbnVsbCAyPiYxCi0JaWYgWyAkPyAtZXEgMCBdOyB0aGVuCi0JCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3Qgd2l0aCBDQSBrZXkgc3VjY2VlZGVkIHVuZXhwZWN0ZWRseSIKLQlmaQotfQotCi1iYXNpY190ZXN0cyBhdXRob3JpemVkX2tleXMKLWJhc2ljX3Rlc3RzIFRydXN0ZWRVc2VyQ0FLZXlzCi0KLXRlc3Rfb25lKCkgewotCWlkZW50PSQxCi0JcmVzdWx0PSQyCi0Jc2lnbl9vcHRzPSQzCi0JYXV0aF9jaG9pY2U9JDQKLQlhdXRoX29wdD0kNQotCi0JaWYgdGVzdCAieCRhdXRoX2Nob2ljZSIgPSAieCIgOyB0aGVuCi0JCWF1dGhfY2hvaWNlPSJhdXRob3JpemVkX2tleXMgVHJ1c3RlZFVzZXJDQUtleXMiCi0JZmkKLQotCWZvciBhdXRoIGluICRhdXRoX2Nob2ljZSA7IGRvCi0JCWZvciBrdHlwZSBpbiByc2EgcnNhX3YwMCA7IGRvCi0JCQljYXNlICRrdHlwZSBpbgotCQkJKl92MDApIGtleXY9Ii10IHYwMCIgOzsKLQkJCSopIGtleXY9IiIgOzsKLQkJCWVzYWMKLQotCQkJY2F0ICRPQkovc3NoZF9wcm94eV9iYWsgPiAkT0JKL3NzaGRfcHJveHkKLQkJCWlmIHRlc3QgIngkYXV0aCIgPSAieGF1dGhvcml6ZWRfa2V5cyIgOyB0aGVuCi0JCQkJIyBBZGQgQ0EgdG8gYXV0aG9yaXplZF9rZXlzCi0JCQkJKAotCQkJCQllY2hvbiAiY2VydC1hdXRob3JpdHkke2F1dGhfb3B0fSAiCi0JCQkJCWNhdCAkT0JKL3VzZXJfY2Ffa2V5LnB1YgotCQkJCSkgPiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgotCQkJZWxzZQotCQkJCWVjaG8gPiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgotCQkJCWVjaG8gIlRydXN0ZWRVc2VyQ0FLZXlzICRPQkovdXNlcl9jYV9rZXkucHViIiBcCi0JCQkJICAgID4+ICRPQkovc3NoZF9wcm94eQotCQkJCWlmIHRlc3QgIngkYXV0aF9vcHQiICE9ICJ4IiA7IHRoZW4KLQkJCQkJZWNobyAkYXV0aF9vcHQgPj4gJE9CSi9zc2hkX3Byb3h5Ci0JCQkJZmkKLQkJCWZpCi0JCQkKLQkJCXZlcmJvc2UgIiR0aWQ6ICRpZGVudCBhdXRoICRhdXRoIGV4cGVjdCAkcmVzdWx0ICRrdHlwZSIKLQkJCSR7U1NIS0VZR0VOfSAtcSAtcyAkT0JKL3VzZXJfY2Ffa2V5IFwKLQkJCSAgICAtSSAicmVncmVzcyB1c2VyIGtleSBmb3IgJFVTRVIiIFwKLQkJCSAgICAkc2lnbl9vcHRzICRrZXl2IFwKLQkJCSAgICAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gfHwKLQkJCQlmYWlsICJjb3VsZG4ndCBzaWduIGNlcnRfdXNlcl9rZXlfJHtrdHlwZX0iCi0KLQkJCSR7U1NIfSAtMmkgJE9CSi9jZXJ0X3VzZXJfa2V5XyR7a3R5cGV9IFwKLQkJCSAgICAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCB0cnVlID4vZGV2L251bGwgMj4mMQotCQkJcmM9JD8KLQkJCWlmIFsgIngkcmVzdWx0IiA9ICJ4c3VjY2VzcyIgXSA7IHRoZW4KLQkJCQlpZiBbICRyYyAtbmUgMCBdOyB0aGVuCi0JCQkJCWZhaWwgIiRpZGVudCBmYWlsZWQgdW5leHBlY3RlZGx5IgotCQkJCWZpCi0JCQllbHNlCi0JCQkJaWYgWyAkcmMgLWVxIDAgXTsgdGhlbgotCQkJCQlmYWlsICIkaWRlbnQgc3VjY2VlZGVkIHVuZXhwZWN0ZWRseSIKLQkJCQlmaQotCQkJZmkKLQkJZG9uZQotCWRvbmUKLX0KLQotdGVzdF9vbmUgImNvcnJlY3QgcHJpbmNpcGFsIglzdWNjZXNzICItbiAke1VTRVJ9IgotdGVzdF9vbmUgImhvc3QtY2VydGlmaWNhdGUiCWZhaWx1cmUgIi1uICR7VVNFUn0gLWgiCi10ZXN0X29uZSAid3JvbmcgcHJpbmNpcGFscyIJZmFpbHVyZSAiLW4gZm9vIgotdGVzdF9vbmUgImNlcnQgbm90IHlldCB2YWxpZCIJZmFpbHVyZSAiLW4gJHtVU0VSfSAtVjIwMjAwMTAxOjIwMzAwMTAxIgotdGVzdF9vbmUgImNlcnQgZXhwaXJlZCIJCWZhaWx1cmUgIi1uICR7VVNFUn0gLVYxOTgwMDEwMToxOTkwMDEwMSIKLXRlc3Rfb25lICJjZXJ0IHZhbGlkIGludGVydmFsIglzdWNjZXNzICItbiAke1VTRVJ9IC1WLTF3OisydyIKLXRlc3Rfb25lICJ3cm9uZyBzb3VyY2UtYWRkcmVzcyIJZmFpbHVyZSAiLW4gJHtVU0VSfSAtT3NvdXJjZS1hZGRyZXNzPTEwLjAuMC4wLzgiCi10ZXN0X29uZSAiZm9yY2UtY29tbWFuZCIJZmFpbHVyZSAiLW4gJHtVU0VSfSAtT2ZvcmNlLWNvbW1hbmQ9ZmFsc2UiCi0KLSMgQmVoYXZpb3VyIGlzIGRpZmZlcmVudCBoZXJlOiBUcnVzdGVkVXNlckNBS2V5cyBkb2Vzbid0IGFsbG93IGVtcHR5IHByaW5jaXBhbHMKLXRlc3Rfb25lICJlbXB0eSBwcmluY2lwYWxzIglzdWNjZXNzICIiIGF1dGhvcml6ZWRfa2V5cwotdGVzdF9vbmUgImVtcHR5IHByaW5jaXBhbHMiCWZhaWx1cmUgIiIgVHJ1c3RlZFVzZXJDQUtleXMKLQotIyBDaGVjayBleHBsaWNpdGx5LXNwZWNpZmllZCBwcmluY2lwYWxzOiBhbiBlbXB0eSBwcmluY2lwYWxzIGxpc3QgaW4gdGhlIGNlcnQKLSMgc2hvdWxkIGFsd2F5cyBiZSByZWZ1c2VkLgotCi0jIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZQotcm0gLWYgJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKLWVjaG8gbWVrbWl0YXNkaWdvYXQgPiAkT0JKL2F1dGhvcml6ZWRfcHJpbmNpcGFsc18kVVNFUgotdGVzdF9vbmUgIkF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSBwcmluY2lwYWxzIiBzdWNjZXNzICItbiBtZWttaXRhc2RpZ29hdCIgXAotICAgIFRydXN0ZWRVc2VyQ0FLZXlzICJBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGUgJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJXUiCi10ZXN0X29uZSAiQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlIG5vIHByaW5jaXBhbHMiIGZhaWx1cmUgIiIgXAotICAgIFRydXN0ZWRVc2VyQ0FLZXlzICJBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGUgJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJXUiCi0KLSMgcHJpbmNpcGFscz0ga2V5IG9wdGlvbgotcm0gLWYgJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJFVTRVIKLXRlc3Rfb25lICJwcmluY2lwYWxzIGtleSBvcHRpb24gcHJpbmNpcGFscyIgc3VjY2VzcyAiLW4gbWVrbWl0YXNkaWdvYXQiIFwKLSAgICBhdXRob3JpemVkX2tleXMgJyxwcmluY2lwYWxzPSJtZWttaXRhc2RpZ29hdCInCi10ZXN0X29uZSAicHJpbmNpcGFscyBrZXkgb3B0aW9uIG5vIHByaW5jaXBhbHMiIGZhaWx1cmUgIiIgXAotICAgIGF1dGhvcml6ZWRfa2V5cyAnLHByaW5jaXBhbHM9Im1la21pdGFzZGlnb2F0IicKLQotIyBXcm9uZyBjZXJ0aWZpY2F0ZQotY2F0ICRPQkovc3NoZF9wcm94eV9iYWsgPiAkT0JKL3NzaGRfcHJveHkKLWZvciBrdHlwZSBpbiByc2EgZHNhICRlY2RzYSByc2FfdjAwIGRzYV92MDAgOyBkbyAKLQljYXNlICRrdHlwZSBpbgotCSpfdjAwKSBhcmdzPSItdCB2MDAiIDs7Ci0JKikgYXJncz0iIiA7OwotCWVzYWMKLQkjIFNlbGYtc2lnbgotCSR7U1NIS0VZR0VOfSAkYXJncyAtcSAtcyAkT0JKL2NlcnRfdXNlcl9rZXlfJHtrdHlwZX0gLUkgXAotCSAgICAicmVncmVzcyB1c2VyIGtleSBmb3IgJFVTRVIiIFwKLQkgICAgLW4gJFVTRVIgJE9CSi9jZXJ0X3VzZXJfa2V5XyR7a3R5cGV9IHx8Ci0JCWZhaWwgImNvdWxkbid0IHNpZ24gY2VydF91c2VyX2tleV8ke2t0eXBlfSIKLQl2ZXJib3NlICIkdGlkOiB1c2VyICR7a3R5cGV9IGNvbm5lY3Qgd3JvbmcgY2VydCIKLQkke1NTSH0gLTJpICRPQkovY2VydF91c2VyX2tleV8ke2t0eXBlfSAtRiAkT0JKL3NzaF9wcm94eSBcCi0JICAgIHNvbWVob3N0IHRydWUgPi9kZXYvbnVsbCAyPiYxCi0JaWYgWyAkPyAtZXEgMCBdOyB0aGVuCi0JCWZhaWwgInNzaCBjZXJ0IGNvbm5lY3QgJGlkZW50IHN1Y2NlZWRlZCB1bmV4cGVjdGVkbHkiCi0JZmkKLWRvbmUKLQotcm0gLWYgJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIgJE9CSi91c2VyX2NhX2tleSogJE9CSi9jZXJ0X3VzZXJfa2V5Kgotcm0gLWYgJE9CSi9hdXRob3JpemVkX3ByaW5jaXBhbHNfJFVTRVIKLQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9jZmdtYXRjaC5zaCBiL3JlZ3Jlc3MvY2ZnbWF0Y2guc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MDNmYWIuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9jZmdtYXRjaC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0jCSRPcGVuQlNEOiBjZmdtYXRjaC5zaCx2IDEuNiAyMDExLzA2LzAzIDA1OjM1OjEwIGR0dWNrZXIgRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9InNzaGRfY29uZmlnIG1hdGNoIgotCi1waWRmaWxlPSRPQkovcmVtb3RlX3BpZAotZndkcG9ydD0zMzAxCi1md2Q9Ii1MICRmd2Rwb3J0OjEyNy4wLjAuMTokUE9SVCIKLQotZWNobyAiRXhpdE9uRm9yd2FyZEZhaWx1cmU9eWVzIiA+PiAkT0JKL3NzaF9jb25maWcKLWVjaG8gIkV4aXRPbkZvcndhcmRGYWlsdXJlPXllcyIgPj4gJE9CSi9zc2hfcHJveHkKLQotc3RhcnRfY2xpZW50KCkKLXsKLQlybSAtZiAkcGlkZmlsZQotCSR7U1NIfSAtcSAtJHAgJGZ3ZCAiJEAiIHNvbWVob3N0IFwKLQkgICAgZXhlYyBzaCAtYyBcJyJlY2hvIFwkXCQgPiAkcGlkZmlsZTsgZXhlYyBzbGVlcCAxMDAiXCcgXAotCSAgICA+PiRURVNUX1NTSF9MT0dGSUxFIDI+JjEgJgotCWNsaWVudF9waWQ9JCEKLQkjIFdhaXQgZm9yIHJlbW90ZSBlbmQKLQluPTAKLQl3aGlsZSB0ZXN0ICEgLWYgJHBpZGZpbGUgOyBkbwotCQlzbGVlcCAxCi0JCW49YGV4cHIgJG4gKyAxYAotCQlpZiB0ZXN0ICRuIC1ndCA2MDsgdGhlbgotCQkJa2lsbCAkY2xpZW50X3BpZAotCQkJZmF0YWwgInRpbWVvdXQgd2FpdGluZyBmb3IgYmFja2dyb3VuZCBzc2giCi0JCWZpCi0JZG9uZQkKLX0KLQotc3RvcF9jbGllbnQoKQotewotCXBpZD1gY2F0ICRwaWRmaWxlYAotCWlmIFsgISAteiAiJHBpZCIgXTsgdGhlbgotCQlraWxsICRwaWQKLQkJc2xlZXAgMQotCWZpCi0Jd2FpdAotfQotCi1jcCAkT0JKL3NzaGRfcHJveHkgJE9CSi9zc2hkX3Byb3h5X2JhawotZ3JlcCAtdiBBdXRob3JpemVkS2V5c0ZpbGUgJE9CSi9zc2hkX3Byb3h5X2JhayA+ICRPQkovc3NoZF9wcm94eQotZWNobyAiQXV0aG9yaXplZEtleXNGaWxlIC9kZXYvbnVsbCIgPj4kT0JKL3NzaGRfcHJveHkKLWVjaG8gIlBlcm1pdE9wZW4gMTI3LjAuMC4xOjEiID4+JE9CSi9zc2hkX2NvbmZpZwotZWNobyAiTWF0Y2ggdXNlciAkVVNFUiIgPj4kT0JKL3NzaGRfcHJveHkKLWVjaG8gIkF1dGhvcml6ZWRLZXlzRmlsZSAvZGV2L251bGwgJE9CSi9hdXRob3JpemVkX2tleXNfJXUiID4+JE9CSi9zc2hkX3Byb3h5Ci1lY2hvICJNYXRjaCBBZGRyZXNzIDEyNy4wLjAuMSIgPj4kT0JKL3NzaGRfY29uZmlnCi1lY2hvICJQZXJtaXRPcGVuIDEyNy4wLjAuMTokUE9SVCIgPj4kT0JKL3NzaGRfY29uZmlnCi0KLWVjaG8gIlBlcm1pdE9wZW4gMTI3LjAuMC4xOjEiID4+JE9CSi9zc2hkX3Byb3h5Ci1lY2hvICJNYXRjaCBBZGRyZXNzIDEyNy4wLjAuMSIgPj4kT0JKL3NzaGRfcHJveHkKLWVjaG8gIlBlcm1pdE9wZW4gMTI3LjAuMC4xOiRQT1JUIiA+PiRPQkovc3NoZF9wcm94eQotCi1zdGFydF9zc2hkCi0KLSNzZXQgLXgKLQotIyBUZXN0IE1hdGNoICsgUGVybWl0T3BlbiBpbiBzc2hkX2NvbmZpZy4gIFRoaXMgc2hvdWxkIGJlIHBlcm1pdHRlZAotZm9yIHAgaW4gMSAyOyBkbwotCXRyYWNlICJtYXRjaCBwZXJtaXRvcGVuIGxvY2FsaG9zdCBwcm90byAkcCIKLQlzdGFydF9jbGllbnQgLUYgJE9CSi9zc2hfY29uZmlnCi0JJHtTU0h9IC1xIC0kcCAtcCAkZndkcG9ydCAtRiAkT0JKL3NzaF9jb25maWcgc29tZWhvc3QgdHJ1ZSB8fCBcCi0JICAgIGZhaWwgIm1hdGNoIHBlcm1pdG9wZW4gcGVybWl0IHByb3RvICRwIgotCXN0b3BfY2xpZW50Ci1kb25lCi0KLSMgU2FtZSBidXQgZnJvbSBkaWZmZXJlbnQgc291cmNlLiAgVGhpcyBzaG91bGQgbm90IGJlIHBlcm1pdHRlZAotZm9yIHAgaW4gMSAyOyBkbwotCXRyYWNlICJtYXRjaCBwZXJtaXRvcGVuIHByb3h5IHByb3RvICRwIgotCXN0YXJ0X2NsaWVudCAtRiAkT0JKL3NzaF9wcm94eQotCSR7U1NIfSAtcSAtJHAgLXAgJGZ3ZHBvcnQgLUYgJE9CSi9zc2hfY29uZmlnIHNvbWVob3N0IHRydWUgJiYgXAotCSAgICBmYWlsICJtYXRjaCBwZXJtaXRvcGVuIGRlbnkgcHJvdG8gJHAiCi0Jc3RvcF9jbGllbnQKLWRvbmUKLQotIyBSZXRyeSBwcmV2aW91cyB3aXRoIGtleSBvcHRpb24sIHNob3VsZCBhbHNvIGJlIGRlbmllZC4KLWVjaG9uICdwZXJtaXRvcGVuPSIxMjcuMC4wLjE6JyRQT1JUJyIgJyA+JE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKLWNhdCAkT0JKL3JzYS5wdWIgPj4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKLWVjaG9uICdwZXJtaXRvcGVuPSIxMjcuMC4wLjE6JyRQT1JUJyIgJyA+PiRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCi1jYXQgJE9CSi9yc2ExLnB1YiA+PiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgotZm9yIHAgaW4gMSAyOyBkbwotCXRyYWNlICJtYXRjaCBwZXJtaXRvcGVuIHByb3h5IHcva2V5IG9wdHMgcHJvdG8gJHAiCi0Jc3RhcnRfY2xpZW50IC1GICRPQkovc3NoX3Byb3h5Ci0JJHtTU0h9IC1xIC0kcCAtcCAkZndkcG9ydCAtRiAkT0JKL3NzaF9jb25maWcgc29tZWhvc3QgdHJ1ZSAmJiBcCi0JICAgIGZhaWwgIm1hdGNoIHBlcm1pdG9wZW4gZGVueSB3L2tleSBvcHQgcHJvdG8gJHAiCi0Jc3RvcF9jbGllbnQKLWRvbmUKLQotIyBUZXN0IGJvdGggc3NoZF9jb25maWcgYW5kIGtleSBvcHRpb25zIHBlcm1pdHRpbmcgdGhlIHNhbWUgZHN0L3BvcnQgcGFpci4KLSMgU2hvdWxkIGJlIHBlcm1pdHRlZC4KLWZvciBwIGluIDEgMjsgZG8KLQl0cmFjZSAibWF0Y2ggcGVybWl0b3BlbiBsb2NhbGhvc3QgcHJvdG8gJHAiCi0Jc3RhcnRfY2xpZW50IC1GICRPQkovc3NoX2NvbmZpZwotCSR7U1NIfSAtcSAtJHAgLXAgJGZ3ZHBvcnQgLUYgJE9CSi9zc2hfY29uZmlnIHNvbWVob3N0IHRydWUgfHwgXAotCSAgICBmYWlsICJtYXRjaCBwZXJtaXRvcGVuIHBlcm1pdCBwcm90byAkcCIKLQlzdG9wX2NsaWVudAotZG9uZQotCi1jcCAkT0JKL3NzaGRfcHJveHlfYmFrICRPQkovc3NoZF9wcm94eQotZWNobyAiUGVybWl0T3BlbiAxMjcuMC4wLjE6MSAxMjcuMC4wLjE6JFBPUlQgMTI3LjAuMC4yOjIiID4+JE9CSi9zc2hkX3Byb3h5Ci1lY2hvICJNYXRjaCBVc2VyICRVU0VSIiA+PiRPQkovc3NoZF9wcm94eQotZWNobyAiUGVybWl0T3BlbiAxMjcuMC4wLjE6MSAxMjcuMC4wLjE6MiIgPj4kT0JKL3NzaGRfcHJveHkKLQotIyBUZXN0IHRoYXQgYSBNYXRjaCBvdmVycmlkZXMgYSBQZXJtaXRPcGVuIGluIHRoZSBnbG9iYWwgc2VjdGlvbgotZm9yIHAgaW4gMSAyOyBkbwotCXRyYWNlICJtYXRjaCBwZXJtaXRvcGVuIHByb3h5IHcva2V5IG9wdHMgcHJvdG8gJHAiCi0Jc3RhcnRfY2xpZW50IC1GICRPQkovc3NoX3Byb3h5Ci0JJHtTU0h9IC1xIC0kcCAtcCAkZndkcG9ydCAtRiAkT0JKL3NzaF9jb25maWcgc29tZWhvc3QgdHJ1ZSAmJiBcCi0JICAgIGZhaWwgIm1hdGNoIG92ZXJyaWRlIHBlcm1pdG9wZW4gcHJvdG8gJHAiCi0Jc3RvcF9jbGllbnQKLWRvbmUKLQotY3AgJE9CSi9zc2hkX3Byb3h5X2JhayAkT0JKL3NzaGRfcHJveHkKLWVjaG8gIlBlcm1pdE9wZW4gMTI3LjAuMC4xOjEgMTI3LjAuMC4xOiRQT1JUIDEyNy4wLjAuMjoyIiA+PiRPQkovc3NoZF9wcm94eQotZWNobyAiTWF0Y2ggVXNlciBOb1N1Y2hVc2VyIiA+PiRPQkovc3NoZF9wcm94eQotZWNobyAiUGVybWl0T3BlbiAxMjcuMC4wLjE6MSAxMjcuMC4wLjE6MiIgPj4kT0JKL3NzaGRfcHJveHkKLQotIyBUZXN0IHRoYXQgYSBydWxlIHRoYXQgZG9lc24ndCBtYXRjaCBkb2Vzbid0IG92ZXJyaWRlLCBwbHVzIHRlc3QgYQotIyBQZXJtaXRPcGVuIGVudHJ5IHRoYXQncyBub3QgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0Ci1mb3IgcCBpbiAxIDI7IGRvCi0JdHJhY2UgIm5vbWF0Y2ggcGVybWl0b3BlbiBwcm94eSB3L2tleSBvcHRzIHByb3RvICRwIgotCXN0YXJ0X2NsaWVudCAtRiAkT0JKL3NzaF9wcm94eQotCSR7U1NIfSAtcSAtJHAgLXAgJGZ3ZHBvcnQgLUYgJE9CSi9zc2hfY29uZmlnIHNvbWVob3N0IHRydWUgfHwgXAotCSAgICBmYWlsICJub21hdGNoIG92ZXJyaWRlIHBlcm1pdG9wZW4gcHJvdG8gJHAiCi0Jc3RvcF9jbGllbnQKLWRvbmUKZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvY2lwaGVyLXNwZWVkLnNoIGIvcmVncmVzcy9jaXBoZXItc3BlZWQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1N2FmZDEuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9jaXBoZXItc3BlZWQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jCSRPcGVuQlNEOiBjaXBoZXItc3BlZWQuc2gsdiAxLjQgMjAxMS8wOC8wMiAwMToyMzo0MSBkam0gRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9ImNpcGhlciBzcGVlZCIKLQotZ2V0Ynl0ZXMgKCkKLXsKLQlzZWQgLW4gJy90cmFuc2ZlcnJlZC9zLy4qc2VjcyAoXCguKiBieXRlcy5zZWNcKS4qL1wxL3AnCi19Ci0KLXRyaWVzPSIxIDIiCi1EQVRBPS9iaW4vbHMKLURBVEE9L2JzZAotCi1jaXBoZXJzPSJhZXMxMjgtY2JjIDNkZXMtY2JjIGJsb3dmaXNoLWNiYyBjYXN0MTI4LWNiYyAKLQlhcmNmb3VyMTI4IGFyY2ZvdXIyNTYgYXJjZm91ciAKLQlhZXMxOTItY2JjIGFlczI1Ni1jYmMgcmlqbmRhZWwtY2JjQGx5c2F0b3IubGl1LnNlCi0JYWVzMTI4LWN0ciBhZXMxOTItY3RyIGFlczI1Ni1jdHIiCi1tYWNzPSJobWFjLXNoYTEgaG1hYy1tZDUgdW1hYy02NEBvcGVuc3NoLmNvbSBobWFjLXNoYTEtOTYgaG1hYy1tZDUtOTYiCi1jb25maWdfZGVmaW5lZCBIQVZFX0VWUF9TSEEyNTYgJiYKLSAgICBtYWNzPSIkbWFjcyBobWFjLXNoYTItMjU2IGhtYWMtc2hhMi0yNTYtOTYgaG1hYy1zaGEyLTUxMiBobWFjLXNoYTItNTEyLTk2IgotCi1mb3IgYyBpbiAkY2lwaGVyczsgZG8gZm9yIG0gaW4gJG1hY3M7IGRvCi0JdHJhY2UgInByb3RvIDIgY2lwaGVyICRjIG1hYyAkbSIKLQlmb3IgeCBpbiAkdHJpZXM7IGRvCi0JCWVjaG9uICIkYy8kbTpcdCIKLQkJKCAke1NTSH0gLW8gJ2NvbXByZXNzaW9uIG5vJyBcCi0JCQktRiAkT0JKL3NzaF9wcm94eSAtMiAtbSAkbSAtYyAkYyBzb21laG9zdCBcCi0JCQlleGVjIHNoIC1jIFwnImRkIG9mPS9kZXYvbnVsbCBvYnM9MzJrIlwnIFwKLQkJPCAke0RBVEF9ICkgMj4mMSB8IGdldGJ5dGVzCi0KLQkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCQlmYWlsICJzc2ggLTIgZmFpbGVkIHdpdGggbWFjICRtIGNpcGhlciAkYyIKLQkJZmkKLQlkb25lCi1kb25lOyBkb25lCi0KLWNpcGhlcnM9IjNkZXMgYmxvd2Zpc2giCi1mb3IgYyBpbiAkY2lwaGVyczsgZG8KLQl0cmFjZSAicHJvdG8gMSBjaXBoZXIgJGMiCi0JZm9yIHggaW4gJHRyaWVzOyBkbwotCQllY2hvbiAiJGM6XHQiCi0JCSggJHtTU0h9IC1vICdjb21wcmVzc2lvbiBubycgXAotCQkJLUYgJE9CSi9zc2hfcHJveHkgLTEgLWMgJGMgc29tZWhvc3QgXAotCQkJZXhlYyBzaCAtYyBcJyJkZCBvZj0vZGV2L251bGwgb2JzPTMyayJcJyBcCi0JCTwgJHtEQVRBfSApIDI+JjEgfCBnZXRieXRlcwotCQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KLQkJCWZhaWwgInNzaCAtMSBmYWlsZWQgd2l0aCBjaXBoZXIgJGMiCi0JCWZpCi0JZG9uZQotZG9uZQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9jb25jaC1jaXBoZXJzLnNoIGIvcmVncmVzcy9jb25jaC1jaXBoZXJzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjY1Y2Q5Li4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvY29uY2gtY2lwaGVycy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMJJE9wZW5CU0Q6IGNvbmNoLWNpcGhlcnMuc2gsdiAxLjIgMjAwOC8wNi8zMCAxMDo0MzowMyBkam0gRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9ImNvbmNoIGNpcGhlcnMiCi0KLURBVEE9L2Jpbi9scwotQ09QWT0ke09CSn0vY29weQotCi1pZiB0ZXN0ICJ4JFJFR1JFU1NfSU5URVJPUF9DT05DSCIgIT0gInh5ZXMiIDsgdGhlbgotCWVjaG8gImNvbmNoIGludGVyb3AgdGVzdHMgbm90IGVuYWJsZWQiCi0JZXhpdCAwCi1maQotCi1zdGFydF9zc2hkCi0KLWZvciBjIGluIGFlczI1Ni1jdHIgYWVzMjU2LWNiYyBhZXMxOTItY3RyIGFlczE5Mi1jYmMgYWVzMTI4LWN0ciBhZXMxMjgtY2JjIFwKLSAgICAgICAgIGNhc3QxMjgtY2JjIGJsb3dmaXNoIDNkZXMtY2JjIDsgZG8KLQl2ZXJib3NlICIkdGlkOiBjaXBoZXIgJGMiCi0Jcm0gLWYgJHtDT1BZfQotCSMgWFhYIHRoZSAybmQgImNhdCIgc2VlbXMgdG8gYmUgbmVlZGVkIGJlY2F1c2Ugb2YgYnVnZ3kgRkQgaGFuZGxpbmcKLQkjIGluIGNvbmNoCi0JJHtDT05DSH0gLS1pZGVudGl0eSAkT0JKL3JzYSAtLXBvcnQgJFBPUlQgLS11c2VyICRVU0VSICAtZSBub25lIFwKLQkgICAgLS1rbm93bi1ob3N0cyAkT0JKL2tub3duX2hvc3RzIC0tbm90dHkgLS1ub2FnZW50IC0tbm94MTEgLW4gXAotCSAgICAxMjcuMC4wLjEgImNhdCAke0RBVEF9IiAyPi9kZXYvbnVsbCB8IGNhdCA+ICR7Q09QWX0KLQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KLQkJZmFpbCAic3NoIGNhdCAkREFUQSBmYWlsZWQiCi0JZmkKLQljbXAgJHtEQVRBfSAke0NPUFl9CQl8fCBmYWlsICJjb3JydXB0ZWQgY29weSIKLWRvbmUKLXJtIC1mICR7Q09QWX0KLQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9jb25uZWN0LXByaXZzZXAuc2ggYi9yZWdyZXNzL2Nvbm5lY3QtcHJpdnNlcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmYjlhZS4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL2Nvbm5lY3QtcHJpdnNlcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMJJE9wZW5CU0Q6IGNvbm5lY3QtcHJpdnNlcC5zaCx2IDEuMiAyMDExLzA2LzMwIDIyOjQ0OjQzIG1hcmt1cyBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0icHJveHkgY29ubmVjdCB3aXRoIHByaXZzZXAiCi0KLWNwICRPQkovc3NoZF9wcm94eSAkT0JKL3NzaGRfcHJveHkub3JpZwotZWNobyAnVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiB5ZXMnID4+ICRPQkovc3NoZF9wcm94eQotCi1mb3IgcCBpbiAxIDI7IGRvCi0JJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9wcm94eSA5OTkuOTk5Ljk5OS45OTkgdHJ1ZQotCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQlmYWlsICJzc2ggcHJpdnNlcCtwcm94eWNvbm5lY3QgcHJvdG9jb2wgJHAgZmFpbGVkIgotCWZpCi1kb25lCi0KLWNwICRPQkovc3NoZF9wcm94eS5vcmlnICRPQkovc3NoZF9wcm94eQotZWNobyAnVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiBzYW5kYm94JyA+PiAkT0JKL3NzaGRfcHJveHkKLQotZm9yIHAgaW4gMSAyOyBkbwotCSR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfcHJveHkgOTk5Ljk5OS45OTkuOTk5IHRydWUKLQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KLQkJIyBYWFggcmVwbGFjZSB0aGlzIHdpdGggZmFpbCBvbmNlIHNhbmRib3ggaGFzIHN0YWJpbGlzZWQKLQkJd2FybiAic3NoIHByaXZzZXAvc2FuZGJveCtwcm94eWNvbm5lY3QgcHJvdG9jb2wgJHAgZmFpbGVkIgotCWZpCi1kb25lCmRpZmYgLS1naXQgYS9yZWdyZXNzL2Nvbm5lY3Quc2ggYi9yZWdyZXNzL2Nvbm5lY3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODZmYTYuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9jb25uZWN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIwkkT3BlbkJTRDogY29ubmVjdC5zaCx2IDEuNCAyMDAyLzAzLzE1IDEzOjA4OjU2IG1hcmt1cyBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0ic2ltcGxlIGNvbm5lY3QiCi0KLXN0YXJ0X3NzaGQKLQotZm9yIHAgaW4gMSAyOyBkbwotCSR7U1NIfSAtbyAiUHJvdG9jb2w9JHAiIC1GICRPQkovc3NoX2NvbmZpZyBzb21laG9zdCB0cnVlCi0JaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCWZhaWwgInNzaCBjb25uZWN0IHdpdGggcHJvdG9jb2wgJHAgZmFpbGVkIgotCWZpCi1kb25lCmRpZmYgLS1naXQgYS9yZWdyZXNzL2RzYV9zc2gyLnBydiBiL3JlZ3Jlc3MvZHNhX3NzaDIucHJ2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTNiNDAzLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvZHNhX3NzaDIucHJ2CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLS0tLSBCRUdJTiBTU0gyIEVOQ1JZUFRFRCBQUklWQVRFIEtFWSAtLS0tCi1TdWJqZWN0OiBzc2gta2V5Z2VuIHRlc3QKLUNvbW1lbnQ6ICIxMDI0LWJpdCBkc2EsIFR1ZSBKYW4gMDggMjAwMiAyMjowMDoyMyArMDEwMCIKLVAyLzU2d0FBQWdJQUFBQW1aR3d0Ylc5a2NIdHphV2R1ZTJSellTMXVhWE4wTFhOb1lURjlMR1JvZTNCc1lXbHVmWDBBQUEKLUFFYm05dVpRQUFBY1FBQUFIQUFBQUFBQUFBQkFDd1VmbTNBeFpUdXQzaWNCbXdDY0Q0OG5ZNjRIenVFTGxRK3ZFcWpJY1IKLUxvNDllcy9EUVRlTE5RK2tkS1JDZm91b3NHTnYwV3F4UnRGMHRVc1dkWHhTMzdvSEdhNFFQdWdCZEhSZDdZbFpHWnY4a2cKLXg3RnNvZXBZN3Y3RTY4My85N2R2Mnp4TDNBR2FnVEV6V3I3ZmwweVBleEFhWm9EdnRRcnJqWDQ0Qkxtd0FBQkFDV1FrdnYKLU14bkQ4ZUZrUzFrb25GZk1KMUNrdVJmVE4zNENCWjZkWTdWVFNHZW15NFF3dEZkTUttb3VmRDBlS2d5M3A1V09lV0NZS3QKLUY0RmhqSEtaay9hYXhGampJYnRrcm5sdlhnNjRRSTExZFNaeUJONi9WaVFrSFBTa1VERitBNkFBRWhyTmJRYkFGU3ZhbzEKLWtUdk50UEN0TDBBa1VJZHVFTXpHUWZMQ1RBQUFBS0RlQzA0M1lWbzlabzB6QUVlSUE0dVpoNExCQ1FBQUEvOWFqN1k1aWsKLWVoeWdKNHFURFNsVnlwc1B1VituNTl0TVMwZTJwZnJTRzg3eWY1cjk0QUtCbUplaG81T082d1lhWEN4c1ZCN0FGYlNVRDYKLTc1QUs4bUhGNHYxLys3U1dLazVmOHhsTUNNU1BaOUswK2ovVzFkL3EycWtobm5EWm9sT0hEb21MQStVMDBpNXlhL2puVFYKLXp5RFBXTEZwV0s4dTN4R0JQQVlYMzI0Z0FBQUtESEZ2b29SbmFYZFpiZVdHVFRxbWdIQjFHVTlBPT0KLS0tLS0gRU5EIFNTSDIgRU5DUllQVEVEIFBSSVZBVEUgS0VZIC0tLS0KZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvZHNhX3NzaDIucHViIGIvcmVncmVzcy9kc2Ffc3NoMi5wdWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNWQ3M2IuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9kc2Ffc3NoMi5wdWIKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0tLS0tIEJFR0lOIFNTSDIgUFVCTElDIEtFWSAtLS0tCi1TdWJqZWN0OiBzc2gta2V5Z2VuIHRlc3QKLUNvbW1lbnQ6ICIxMDI0LWJpdCBkc2EsIFR1ZSBKYW4gMDggMjAwMiAyMjowMDoyMyArMDEwMCIKLUFBQUFCM056YUMxa2MzTUFBQUNCQUxCUitiY0RGbE82M2VKd0diQUp3UGp5ZGpyZ2ZPNFF1VkQ2OFNxTWh4RXVqajE2ejgKLU5CTjRzMUQ2UjBwRUoraTZpd1kyL1JhckZHMFhTMVN4WjFmRkxmdWdjWnJoQSs2QUYwZEYzdGlWa1ptL3lTREhzV3loNmwKLWp1L3NUcnpmLzN0Mi9iUEV2Y0FacUJNVE5hdnQrWFRJOTdFQnBtZ08rMUN1dU5mamdFdWJBQUFBRlFEZUMwNDNZVm85Wm8KLTB6QUVlSUE0dVpoNExCQ1FBQUFJRUFsa0pMN3pNWncvSGhaRXRaS0p4WHpDZFFwTGtYMHpkK0FnV2VuV08xVTBobnBzdUUKLU1MUlhUQ3BxTG53OUhpb010NmVWam5sZ21DclJlQllZeHltWlAybXNSWTR5RzdaSzU1YjE0T3VFQ05kWFVtY2dUZXYxWWsKLUpCejBwRkF4ZmdPZ0FCSWF6VzBHd0JVcjJxTlpFN3piVHdyUzlBSkZDSGJoRE14a0h5d2t3QUFBQ0FXbysyT1lwSG9jb0MKLWVLa3cwcFZjcWJEN2xmcCtmYlRFdEh0cVg2MGh2TzhuK2EvZUFDZ1ppWG9hT1RqdXNHR2x3c2JGUWV3QlcwbEErdStRQ3YKLUpoeGVMOWYvdTBsaXBPWC9NWlRBakVqMmZTdFBvLzF0WGY2dHFwSVo1dzJhSlRodzZKaXdQbE5OSXVjbXY0NTAxYzhnejEKLWl4YVZpdkx0OFJnVHdHRjk5dUk9Ci0tLS0tIEVORCBTU0gyIFBVQkxJQyBLRVkgLS0tLQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9keW5hbWljLWZvcndhcmQuc2ggYi9yZWdyZXNzL2R5bmFtaWMtZm9yd2FyZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhYjgwNS4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL2R5bmFtaWMtZm9yd2FyZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLSMJJE9wZW5CU0Q6IGR5bmFtaWMtZm9yd2FyZC5zaCx2IDEuOSAyMDExLzA2LzAzIDAwOjI5OjUyIGR0dWNrZXIgRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9ImR5bmFtaWMgZm9yd2FyZGluZyIKLQotRldEUE9SVD1gZXhwciAkUE9SVCArIDFgCi0KLURBVEE9L2Jpbi9scyR7RVhFRVhUfQotCi1pZiBoYXZlX3Byb2cgbmMgJiYgbmMgLWggMj4mMSB8IGdyZXAgInByb3h5IGFkZHJlc3MiID4vZGV2L251bGw7IHRoZW4KLQlwcm94eWNtZD0ibmMgLXggMTI3LjAuMC4xOiRGV0RQT1JUIC1YIgotZWxpZiBoYXZlX3Byb2cgY29ubmVjdDsgdGhlbgotCXByb3h5Y21kPSJjb25uZWN0IC1TIDEyNy4wLjAuMTokRldEUE9SVCAtIgotZWxzZQotCWVjaG8gInNraXBwZWQgKG5vIHN1aXRhYmxlIFByb3h5Q29tbWFuZCBmb3VuZCkiCi0JZXhpdCAwCi1maQotdHJhY2UgIndpbGwgdXNlIFByb3h5Q29tbWFuZCAkcHJveHljbWQiCi0KLXN0YXJ0X3NzaGQKLQotZm9yIHAgaW4gMSAyOyBkbwotCW49MAotCWVycm9yPSIxIgotCXRyYWNlICJzdGFydCBkeW5hbWljIGZvcndhcmRpbmcsIGZvcmsgdG8gYmFja2dyb3VuZCIKLQl3aGlsZSBbICIkZXJyb3IiIC1uZSAwIC1hICIkbiIgLWx0IDMgXTsgZG8KLQkJbj1gZXhwciAkbiArIDFgCi0JCSR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfY29uZmlnIC1mIC1EICRGV0RQT1JUIC1xIFwKLQkJICAgIC1vRXhpdE9uRm9yd2FyZEZhaWx1cmU9eWVzIHNvbWVob3N0IGV4ZWMgc2ggLWMgXAotCQkJXCciZWNobyBcJFwkID4gJE9CSi9yZW1vdGVfcGlkOyBleGVjIHNsZWVwIDQ0NCJcJwotCQllcnJvcj0kPwotCQlpZiBbICIkZXJyb3IiIC1uZSAwIF07IHRoZW4KLQkJCXRyYWNlICJmb3J3YXJkIGZhaWxlZCBwcm90byAkcCBhdHRlbXB0ICRuIGVyciAkZXJyb3IiCi0JCQlzbGVlcCAkbgotCQlmaQotCWRvbmUKLQlpZiBbICIkZXJyb3IiIC1uZSAwIF07IHRoZW4KLQkJZmF0YWwgImZhaWxlZCB0byBzdGFydCBkeW5hbWljIGZvcndhcmRpbmcgcHJvdG8gJHAiCi0JZmkKLQotCWZvciBzIGluIDQgNTsgZG8KLQkgICAgZm9yIGggaW4gMTI3LjAuMC4xIGxvY2FsaG9zdDsgZG8KLQkJdHJhY2UgInRlc3Rpbmcgc3NoIHByb3RvY29sICRwIHNvY2tzIHZlcnNpb24gJHMgaG9zdCAkaCIKLQkJJHtTU0h9IC1GICRPQkovc3NoX2NvbmZpZyBcCi0JCQktbyAiUHJveHlDb21tYW5kICR7cHJveHljbWR9JHtzfSAkaCAkUE9SVCIgXAotCQkJc29tZWhvc3QgY2F0ICREQVRBID4gJE9CSi9scy5jb3B5Ci0JCXRlc3QgLWYgJE9CSi9scy5jb3B5CSB8fCBmYWlsICJmYWlsZWQgY29weSAkREFUQSIKLQkJY21wICREQVRBICRPQkovbHMuY29weSB8fCBmYWlsICJjb3JydXB0ZWQgY29weSBvZiAkREFUQSIKLQkgICAgZG9uZQotCWRvbmUKLQotCWlmIFsgLWYgJE9CSi9yZW1vdGVfcGlkIF07IHRoZW4KLQkJcmVtb3RlPWBjYXQgJE9CSi9yZW1vdGVfcGlkYAotCQl0cmFjZSAidGVybWluYXRlIHJlbW90ZSBzaGVsbCwgcGlkICRyZW1vdGUiCi0JCWlmIFsgJHJlbW90ZSAtZ3QgMSBdOyB0aGVuCi0JCQlraWxsIC1IVVAgJHJlbW90ZQotCQlmaQotCWVsc2UKLQkJZmFpbCAibm8gcGlkIGZpbGU6ICRPQkovcmVtb3RlX3BpZCIKLQlmaQotZG9uZQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9lbnZwYXNzLnNoIGIvcmVncmVzcy9lbnZwYXNzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjdlYWZlLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvZW52cGFzcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSMJJE9wZW5CU0Q6IGVudnBhc3Muc2gsdiAxLjQgMjAwNS8wMy8wNCAwODo0ODo0NiBkam0gRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9ImVudmlyb25tZW50IHBhc3NpbmciCi0KLSMgTkIgYWNjZXB0ZWQgZW52IHZhcnMgYXJlIGluIHRlc3QtZXhlYy5zaCAoX1hYWF9URVNUXyogYW5kIF9YWFhfVEVTVCkKLQotIyBQcmVwYXJlIGEgY3VzdG9tIGNvbmZpZyB0byB0ZXN0IGZvciBhIGNvbmZpZ3VyYXRpb24gcGFyc2luZyBidWcgZml4ZWQgaW4gNC4wCi1jYXQgPDwgRU9GID4gJE9CSi9zc2hfcHJveHlfZW52cGFzcwotSG9zdCB0ZXN0LXNlbmRlbnYtY29uZnBhcnNlLWJ1ZwotCVNlbmRFbnYgKgotRU9GCi1jYXQgJE9CSi9zc2hfcHJveHkgPj4gJE9CSi9zc2hfcHJveHlfZW52cGFzcwotCi10cmFjZSAicGFzcyBlbnYsIGRvbid0IGFjY2VwdCIKLXZlcmJvc2UgInRlc3QgJHRpZDogcGFzcyBlbnYsIGRvbid0IGFjY2VwdCIKLV9URVNUX0VOVj1ibGFoICR7U1NIfSAtb1NlbmRFbnY9IioiIC1GICRPQkovc3NoX3Byb3h5X2VudnBhc3Mgb3RoZXJob3N0IFwKLQlzaCA8PCAnRU9GJwotCXRlc3QgLXogIiRfVEVTVF9FTlYiCi1FT0YKLXI9JD8KLWlmIFsgJHIgLW5lIDAgXTsgdGhlbgotCWZhaWwgImVudmlyb25tZW50IGZvdW5kIgotZmkKLQotdHJhY2UgImRvbid0IHBhc3MgZW52LCBhY2NlcHQiCi12ZXJib3NlICJ0ZXN0ICR0aWQ6IGRvbid0IHBhc3MgZW52LCBhY2NlcHQiCi1fWFhYX1RFU1RfQT0xIF9YWFhfVEVTVF9CPTIgJHtTU0h9IC1GICRPQkovc3NoX3Byb3h5X2VudnBhc3Mgb3RoZXJob3N0IFwKLQlzaCA8PCAnRU9GJwotCXRlc3QgLXogIiRfWFhYX1RFU1RfQSIgJiYgdGVzdCAteiAiJF9YWFhfVEVTVF9CIgotRU9GCi1yPSQ/Ci1pZiBbICRyIC1uZSAwIF07IHRoZW4KLQlmYWlsICJlbnZpcm9ubWVudCBmb3VuZCIKLWZpCi0KLXRyYWNlICJwYXNzIHNpbmdsZSBlbnYsIGFjY2VwdCBzaW5nbGUgZW52IgotdmVyYm9zZSAidGVzdCAkdGlkOiBwYXNzIHNpbmdsZSBlbnYsIGFjY2VwdCBzaW5nbGUgZW52IgotX1hYWF9URVNUPWJsYWggJHtTU0h9IC1vU2VuZEVudj0iX1hYWF9URVNUIiAtRiAkT0JKL3NzaF9wcm94eV9lbnZwYXNzIFwKLSAgICBvdGhlcmhvc3Qgc2ggPDwgJ0VPRicKLQl0ZXN0IFgiJF9YWFhfVEVTVCIgPSBYImJsYWgiCi1FT0YKLXI9JD8KLWlmIFsgJHIgLW5lIDAgXTsgdGhlbgotCWZhaWwgImVudmlyb25tZW50IG5vdCBmb3VuZCIKLWZpCi0KLXRyYWNlICJwYXNzIG11bHRpcGxlIGVudiwgYWNjZXB0IG11bHRpcGxlIGVudiIKLXZlcmJvc2UgInRlc3QgJHRpZDogcGFzcyBtdWx0aXBsZSBlbnYsIGFjY2VwdCBtdWx0aXBsZSBlbnYiCi1fWFhYX1RFU1RfQT0xIF9YWFhfVEVTVF9CPTIgJHtTU0h9IC1vU2VuZEVudj0iX1hYWF9URVNUXyoiIFwKLSAgICAtRiAkT0JKL3NzaF9wcm94eV9lbnZwYXNzIG90aGVyaG9zdCBcCi0Jc2ggPDwgJ0VPRicKLQl0ZXN0IFgiJF9YWFhfVEVTVF9BIiA9IFgiMSIgLWEgWCIkX1hYWF9URVNUX0IiID0gWCIyIgotRU9GCi1yPSQ/Ci1pZiBbICRyIC1uZSAwIF07IHRoZW4KLQlmYWlsICJlbnZpcm9ubWVudCBub3QgZm91bmQiCi1maQotCi1ybSAtZiAkT0JKL3NzaF9wcm94eV9lbnZwYXNzCmRpZmYgLS1naXQgYS9yZWdyZXNzL2V4aXQtc3RhdHVzLnNoIGIvcmVncmVzcy9leGl0LXN0YXR1cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiNzhhNi4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL2V4aXQtc3RhdHVzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIwkkT3BlbkJTRDogZXhpdC1zdGF0dXMuc2gsdiAxLjYgMjAwMi8wMy8xNSAxMzowODo1NiBtYXJrdXMgRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9InJlbW90ZSBleGl0IHN0YXR1cyIKLQotZm9yIHAgaW4gMSAyOyBkbwotCWZvciBzIGluIDAgMSA0IDUgNDQ7IGRvCi0JCXRyYWNlICJwcm90byAkcCBzdGF0dXMgJHMiCi0JCXZlcmJvc2UgInRlc3QgJHRpZDogcHJvdG8gJHAgc3RhdHVzICRzIgotCQkke1NTSH0gLSRwIC1GICRPQkovc3NoX3Byb3h5IG90aGVyaG9zdCBleGl0ICRzCi0JCXI9JD8KLQkJaWYgWyAkciAtbmUgJHMgXTsgdGhlbgotCQkJZmFpbCAiZXhpdCBjb2RlIG1pc21hdGNoIGZvciBwcm90b2NvbCAkcDogJHIgIT0gJHMiCi0JCWZpCi0KLQkJIyBzYW1lIHdpdGggZWFybHkgY2xvc2Ugb2Ygc3Rkb3V0L2VycgotCQkke1NTSH0gLSRwIC1GICRPQkovc3NoX3Byb3h5IC1uIG90aGVyaG9zdCBcCi0gICAgICAgICAgICAgICAgCWV4ZWMgc2ggLWMgXCcic2xlZXAgMjsgZXhlYyA+IC9kZXYvbnVsbCAyPiYxOyBzbGVlcCAzOyBleGl0ICRzIlwnCi0JCXI9JD8KLQkJaWYgWyAkciAtbmUgJHMgXTsgdGhlbgotCQkJZmFpbCAiZXhpdCBjb2RlICh3aXRoIHNsZWVwKSBtaXNtYXRjaCBmb3IgcHJvdG9jb2wgJHA6ICRyICE9ICRzIgotCQlmaQotCWRvbmUKLWRvbmUKZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvZm9yY2Vjb21tYW5kLnNoIGIvcmVncmVzcy9mb3JjZWNvbW1hbmQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZTUxYTYuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9mb3JjZWNvbW1hbmQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jCSRPcGVuQlNEOiBmb3JjZWNvbW1hbmQuc2gsdiAxLjEgMjAwNi8wNy8xOSAxMzowOToyOCBkdHVja2VyIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJmb3JjZWQgY29tbWFuZCIKLQotY3AgJE9CSi9zc2hkX3Byb3h5ICRPQkovc3NoZF9wcm94eV9iYWsKLQotZWNob24gJ2NvbW1hbmQ9InRydWUiICcgPiRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCi1jYXQgJE9CSi9yc2EucHViID4+ICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCi1lY2hvbiAnY29tbWFuZD0idHJ1ZSIgJyA+PiRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCi1jYXQgJE9CSi9yc2ExLnB1YiA+PiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgotCi1mb3IgcCBpbiAxIDI7IGRvCi0JdHJhY2UgImZvcmNlZCBjb21tYW5kIGluIGtleSBvcHRpb24gcHJvdG8gJHAiCi0JJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCBmYWxzZSBcIHx8Ci0JICAgIGZhaWwgImZvcmNlZCBjb21tYW5kIGluIGtleSBwcm90byAkcCIKLWRvbmUKLQotZWNob24gJ2NvbW1hbmQ9ImZhbHNlIiAnID4kT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgotY2F0ICRPQkovcnNhLnB1YiA+PiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgotZWNob24gJ2NvbW1hbmQ9ImZhbHNlIiAnID4+JE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKLWNhdCAkT0JKL3JzYTEucHViID4+ICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCi0KLWNwICRPQkovc3NoZF9wcm94eV9iYWsgJE9CSi9zc2hkX3Byb3h5Ci1lY2hvICJGb3JjZUNvbW1hbmQgdHJ1ZSIgPj4gJE9CSi9zc2hkX3Byb3h5Ci0KLWZvciBwIGluIDEgMjsgZG8KLQl0cmFjZSAiZm9yY2VkIGNvbW1hbmQgaW4gc3NoZF9jb25maWcgb3ZlcnJpZGVzIGtleSBvcHRpb24gcHJvdG8gJHAiCi0JJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCBmYWxzZSBcIHx8Ci0JICAgIGZhaWwgImZvcmNlZCBjb21tYW5kIGluIGtleSBwcm90byAkcCIKLWRvbmUKLQotY3AgJE9CSi9zc2hkX3Byb3h5X2JhayAkT0JKL3NzaGRfcHJveHkKLWVjaG8gIkZvcmNlQ29tbWFuZCBmYWxzZSIgPj4gJE9CSi9zc2hkX3Byb3h5Ci1lY2hvICJNYXRjaCBVc2VyICRVU0VSIiA+PiAkT0JKL3NzaGRfcHJveHkKLWVjaG8gIiAgICBGb3JjZUNvbW1hbmQgdHJ1ZSIgPj4gJE9CSi9zc2hkX3Byb3h5Ci0KLWZvciBwIGluIDEgMjsgZG8KLQl0cmFjZSAiZm9yY2VkIGNvbW1hbmQgd2l0aCBtYXRjaCBwcm90byAkcCIKLQkke1NTSH0gLSRwIC1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0IGZhbHNlIFwgfHwKLQkgICAgZmFpbCAiZm9yY2VkIGNvbW1hbmQgaW4ga2V5IHByb3RvICRwIgotZG9uZQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9mb3J3YXJkaW5nLnNoIGIvcmVncmVzcy9mb3J3YXJkaW5nLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGVjOTkxLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvZm9yd2FyZGluZy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0jCSRPcGVuQlNEOiBmb3J3YXJkaW5nLnNoLHYgMS43IDIwMTAvMDEvMTEgMDI6NTM6NDQgZHR1Y2tlciBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0ibG9jYWwgYW5kIHJlbW90ZSBmb3J3YXJkaW5nIgotREFUQT0vYmluL2xzJHtFWEVFWFR9Ci0KLXN0YXJ0X3NzaGQKLQotYmFzZT0zMwotbGFzdD0kUE9SVAotZndkPSIiCi1mb3IgaiBpbiAwIDEgMjsgZG8KLQlmb3IgaSBpbiAwIDEgMjsgZG8KLQkJYT0kYmFzZSRqJGkKLQkJYj1gZXhwciAkYSArIDUwYAotCQljPSRsYXN0Ci0JCSMgZndkIGNoYWluOiAkYSAtPiAkYiAtPiAkYwotCQlmd2Q9IiRmd2QgLUwkYToxMjcuMC4wLjE6JGIgLVIkYjoxMjcuMC4wLjE6JGMiCi0JCWxhc3Q9JGEKLQlkb25lCi1kb25lCi1mb3IgcCBpbiAxIDI7IGRvCi0JcT1gZXhwciAzIC0gJHBgCi0JdHJhY2UgInN0YXJ0IGZvcndhcmRpbmcsIGZvcmsgdG8gYmFja2dyb3VuZCIKLQkke1NTSH0gLSRwIC1GICRPQkovc3NoX2NvbmZpZyAtZiAkZndkIHNvbWVob3N0IHNsZWVwIDEwCi0KLQl0cmFjZSAidHJhbnNmZXIgb3ZlciBmb3J3YXJkZWQgY2hhbm5lbHMgYW5kIGNoZWNrIHJlc3VsdCIKLQkke1NTSH0gLSRxIC1GICRPQkovc3NoX2NvbmZpZyAtcCRsYXN0IC1vICdDb25uZWN0aW9uQXR0ZW1wdHM9NCcgXAotCQlzb21laG9zdCBjYXQgJERBVEEgPiAkT0JKL2xzLmNvcHkKLQl0ZXN0IC1mICRPQkovbHMuY29weQkJCXx8IGZhaWwgImZhaWxlZCBjb3B5ICREQVRBIgotCWNtcCAkREFUQSAkT0JKL2xzLmNvcHkJCQl8fCBmYWlsICJjb3JydXB0ZWQgY29weSBvZiAkREFUQSIKLQotCXNsZWVwIDEwCi1kb25lCi0KLWZvciBwIGluIDEgMjsgZG8KLWZvciBkIGluIEwgUjsgZG8KLQl0cmFjZSAiZXhpdCBvbiAtJGQgZm9yd2FyZCBmYWlsdXJlLCBwcm90byAkcCIKLQotCSMgdGhpcyBvbmUgc2hvdWxkIHN1Y2NlZWQKLQkke1NTSH0gLSRwIC1GICRPQkovc3NoX2NvbmZpZyBcCi0JICAgIC0kZCAke2Jhc2V9MDE6MTI3LjAuMC4xOiRQT1JUIFwKLQkgICAgLSRkICR7YmFzZX0wMjoxMjcuMC4wLjE6JFBPUlQgXAotCSAgICAtJGQgJHtiYXNlfTAzOjEyNy4wLjAuMTokUE9SVCBcCi0JICAgIC0kZCAke2Jhc2V9MDQ6MTI3LjAuMC4xOiRQT1JUIFwKLQkgICAgLW9FeGl0T25Gb3J3YXJkRmFpbHVyZT15ZXMgc29tZWhvc3QgdHJ1ZQotCWlmIFsgJD8gIT0gMCBdOyB0aGVuCi0JCWZhaWwgImNvbm5lY3Rpb24gZmFpbGVkLCBzaG91bGQgbm90IgotCWVsc2UKLQkJIyB0aGlzIG9uZSBzaG91bGQgZmFpbAotCQkke1NTSH0gLXEgLSRwIC1GICRPQkovc3NoX2NvbmZpZyBcCi0JCSAgICAtJGQgJHtiYXNlfTAxOjEyNy4wLjAuMTokUE9SVCBcCi0JCSAgICAtJGQgJHtiYXNlfTAyOjEyNy4wLjAuMTokUE9SVCBcCi0JCSAgICAtJGQgJHtiYXNlfTAzOjEyNy4wLjAuMTokUE9SVCBcCi0JCSAgICAtJGQgJHtiYXNlfTAxOjEyNy4wLjAuMTokUE9SVCBcCi0JCSAgICAtJGQgJHtiYXNlfTA0OjEyNy4wLjAuMTokUE9SVCBcCi0JCSAgICAtb0V4aXRPbkZvcndhcmRGYWlsdXJlPXllcyBzb21laG9zdCB0cnVlCi0JCXI9JD8KLQkJaWYgWyAkciAhPSAyNTUgXTsgdGhlbgotCQkJZmFpbCAiY29ubmVjdGlvbiBub3QgdGVybWludGF0ZWQsIGJ1dCBzaG91bGQgKCRyKSIKLQkJZmkKLQlmaQotZG9uZQotZG9uZQotCi1mb3IgcCBpbiAxIDI7IGRvCi0JdHJhY2UgInNpbXBsZSBjbGVhciBmb3J3YXJkaW5nIHByb3RvICRwIgotCSR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfY29uZmlnIC1vQ2xlYXJBbGxGb3J3YXJkaW5ncz15ZXMgc29tZWhvc3QgdHJ1ZQotCi0JdHJhY2UgImNsZWFyIGxvY2FsIGZvcndhcmQgcHJvdG8gJHAiCi0JJHtTU0h9IC0kcCAtZiAtRiAkT0JKL3NzaF9jb25maWcgLUwgJHtiYXNlfTAxOjEyNy4wLjAuMTokUE9SVCBcCi0JICAgIC1vQ2xlYXJBbGxGb3J3YXJkaW5ncz15ZXMgc29tZWhvc3Qgc2xlZXAgMTAKLQlpZiBbICQ/ICE9IDAgXTsgdGhlbgotCQlmYWlsICJjb25uZWN0aW9uIGZhaWxlZCB3aXRoIGNsZWFyZWQgbG9jYWwgZm9yd2FyZGluZyIKLQllbHNlCi0JCSMgdGhpcyBvbmUgc2hvdWxkIGZhaWwKLQkJJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9jb25maWcgLXAgJHtiYXNlfTAxIHRydWUgXAotCQkgICAgIDI+JHtURVNUX1NTSF9MT0dGSUxFfSAmJiBcCi0JCQlmYWlsICJsb2NhbCBmb3J3YXJkaW5nIG5vdCBjbGVhcmVkIgotCWZpCi0Jc2xlZXAgMTAKLQkKLQl0cmFjZSAiY2xlYXIgcmVtb3RlIGZvcndhcmQgcHJvdG8gJHAiCi0JJHtTU0h9IC0kcCAtZiAtRiAkT0JKL3NzaF9jb25maWcgLVIgJHtiYXNlfTAxOjEyNy4wLjAuMTokUE9SVCBcCi0JICAgIC1vQ2xlYXJBbGxGb3J3YXJkaW5ncz15ZXMgc29tZWhvc3Qgc2xlZXAgMTAKLQlpZiBbICQ/ICE9IDAgXTsgdGhlbgotCQlmYWlsICJjb25uZWN0aW9uIGZhaWxlZCB3aXRoIGNsZWFyZWQgcmVtb3RlIGZvcndhcmRpbmciCi0JZWxzZQotCQkjIHRoaXMgb25lIHNob3VsZCBmYWlsCi0JCSR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfY29uZmlnIC1wICR7YmFzZX0wMSB0cnVlIFwKLQkJICAgICAyPiR7VEVTVF9TU0hfTE9HRklMRX0gJiYgXAotCQkJZmFpbCAicmVtb3RlIGZvcndhcmRpbmcgbm90IGNsZWFyZWQiCi0JZmkKLQlzbGVlcCAxMAotZG9uZQotCi1mb3IgcCBpbiAyOyBkbwotCXRyYWNlICJzdGRpbyBmb3J3YXJkaW5nIHByb3RvICRwIgotCWNtZD0iJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9jb25maWciCi0JJGNtZCAtbyAiUHJveHlDb21tYW5kICRjbWQgLXEgLVcgbG9jYWxob3N0OiRQT1JUIHNvbWVob3N0IiBcCi0JCXNvbWVob3N0IHRydWUKLQlpZiBbICQ/ICE9IDAgXTsgdGhlbgotCQlmYWlsICJzdGRpbyBmb3J3YXJkaW5nIHByb3RvICRwIgotCWZpCi1kb25lCmRpZmYgLS1naXQgYS9yZWdyZXNzL2hvc3QtZXhwYW5kLnNoIGIvcmVncmVzcy9ob3N0LWV4cGFuZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxODgzNi4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL2hvc3QtZXhwYW5kLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0iZXhwYW5kICVoIGFuZCAlbiIKLQotZWNobyAnUGVybWl0TG9jYWxDb21tYW5kIHllcycgPj4gJE9CSi9zc2hfcHJveHkKLXByaW50ZiAnTG9jYWxDb21tYW5kIHByaW50ZiAiJSUlJXNcXG4iICIlJW4iICIlJWgiXG4nID4+ICRPQkovc3NoX3Byb3h5Ci0KLWNhdCA+JE9CSi9leHBlY3QgPDxFT0UKLXNvbWVob3N0Ci0xMjcuMC4wLjEKLUVPRQotCi1mb3IgcCBpbiAxIDI7IGRvCi0JdmVyYm9zZSAidGVzdCAkdGlkOiBwcm90byAkcCIKLQkke1NTSH0gLUYgJE9CSi9zc2hfcHJveHkgLSRwIHNvbWVob3N0IHRydWUgPiRPQkovYWN0dWFsCi0JZGlmZiAkT0JKL2V4cGVjdCAkT0JKL2FjdHVhbCB8fCBmYWlsICIkdGlkIHByb3RvICRwIgotZG9uZQotCmRpZmYgLS1naXQgYS9yZWdyZXNzL2tleHR5cGUuc2ggYi9yZWdyZXNzL2tleHR5cGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YzA4MTcuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9rZXh0eXBlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIwkkT3BlbkJTRDoga2V4dHlwZS5zaCx2IDEuMSAyMDEwLzA5LzIyIDEyOjI2OjA1IGRqbSBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0ibG9naW4gd2l0aCBkaWZmZXJlbnQga2V5IGV4Y2hhbmdlIGFsZ29yaXRobXMiCi0KLVRJTUU9L3Vzci9iaW4vdGltZQotY3AgJE9CSi9zc2hkX3Byb3h5ICRPQkovc3NoZF9wcm94eV9iYWsKLWNwICRPQkovc3NoX3Byb3h5ICRPQkovc3NoX3Byb3h5X2JhawotCi1pZiB0ZXN0ICIkVEVTVF9TU0hfRUNDIiA9ICJ5ZXMiOyB0aGVuCi0Ja2V4dHlwZXM9ImVjZGgtc2hhMi1uaXN0cDI1NiBlY2RoLXNoYTItbmlzdHAzODQgZWNkaC1zaGEyLW5pc3RwNTIxIgotZmkKLWlmIHRlc3QgIiRURVNUX1NTSF9TSEEyNTYiID0gInllcyI7IHRoZW4KLQlrZXh0eXBlcz0iJGtleHR5cGVzIGRpZmZpZS1oZWxsbWFuLWdyb3VwLWV4Y2hhbmdlLXNoYTI1NiIKLWZpCi1rZXh0eXBlcz0iJGtleHR5cGVzIGRpZmZpZS1oZWxsbWFuLWdyb3VwLWV4Y2hhbmdlLXNoYTEiCi1rZXh0eXBlcz0iJGtleHR5cGVzIGRpZmZpZS1oZWxsbWFuLWdyb3VwMTQtc2hhMSIKLWtleHR5cGVzPSIka2V4dHlwZXMgZGlmZmllLWhlbGxtYW4tZ3JvdXAxLXNoYTEiCi0KLXRyaWVzPSIxIDIgMyA0IgotZm9yIGsgaW4gJGtleHR5cGVzOyBkbyAKLQl2ZXJib3NlICJrZXggJGsiCi0JZm9yIGkgaW4gJHRyaWVzOyBkbwotCQkke1NTSH0gLUYgJE9CSi9zc2hfcHJveHkgLW8gS2V4QWxnb3JpdGhtcz0kayB4IHRydWUKLQkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCQlmYWlsICJzc2gga2V4ICRrIgotCQlmaQotCWRvbmUKLWRvbmUKLQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9rZXktb3B0aW9ucy5zaCBiL3JlZ3Jlc3Mva2V5LW9wdGlvbnMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OGQ3OGIuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9rZXktb3B0aW9ucy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLSMJJE9wZW5CU0Q6IGtleS1vcHRpb25zLnNoLHYgMS4yIDIwMDgvMDYvMzAgMDg6MDc6MzQgZGptIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJrZXkgb3B0aW9ucyIKLQotb3JpZ2tleXM9IiRPQkovYXV0aGtleXNfb3JpZyIKLWF1dGhrZXlzPSIkT0JKL2F1dGhvcml6ZWRfa2V5c18ke1VTRVJ9IgotY3AgJGF1dGhrZXlzICRvcmlna2V5cwotCi0jIFRlc3QgY29tbWFuZD0gZm9yY2VkIGNvbW1hbmQKLWZvciBwIGluIDEgMjsgZG8KLSAgICBmb3IgYyBpbiAnY29tbWFuZD0iZWNobyBiYXIiJyAnbm8tcHR5LGNvbW1hbmQ9ImVjaG8gYmFyIic7IGRvCi0Jc2VkICJzLy4qLyRjICYvIiAkb3JpZ2tleXMgPiRhdXRoa2V5cwotCXZlcmJvc2UgImtleSBvcHRpb24gcHJvdG8gJHAgJGMiCi0Jcj1gJHtTU0h9IC0kcCAtcSAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCBlY2hvIGZvb2AKLQlpZiBbICIkciIgPSAiZm9vIiBdOyB0aGVuCi0JCWZhaWwgImtleSBvcHRpb24gZm9yY2VkIGNvbW1hbmQgbm90IHJlc3RyaWN0ZWQiCi0JZmkKLQlpZiBbICIkciIgIT0gImJhciIgXTsgdGhlbgotCQlmYWlsICJrZXkgb3B0aW9uIGZvcmNlZCBjb21tYW5kIG5vdCBleGVjdXRlZCIKLQlmaQotICAgIGRvbmUKLWRvbmUKLQotIyBUZXN0IG5vLXB0eQotc2VkICdzLy4qL25vLXB0eSAmLycgJG9yaWdrZXlzID4kYXV0aGtleXMKLWZvciBwIGluIDEgMjsgZG8KLQl2ZXJib3NlICJrZXkgb3B0aW9uIHByb3RvICRwIG5vLXB0eSIKLQlyPWAke1NTSH0gLSRwIC1xIC1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0IHR0eWAKLQlpZiBbIC1mICIkciIgXTsgdGhlbgotCQlmYWlsICJrZXkgb3B0aW9uIGZhaWxlZCBwcm90byAkcCBuby1wdHkgKHB0eSAkcikiCi0JZmkKLWRvbmUKLQotIyBUZXN0IGVudmlyb25tZW50PQotZWNobyAnUGVybWl0VXNlckVudmlyb25tZW50IHllcycgPj4gJE9CSi9zc2hkX3Byb3h5Ci1zZWQgJ3MvLiovZW52aXJvbm1lbnQ9IkZPTz1iYXIiICYvJyAkb3JpZ2tleXMgPiRhdXRoa2V5cwotZm9yIHAgaW4gMSAyOyBkbwotCXZlcmJvc2UgImtleSBvcHRpb24gcHJvdG8gJHAgZW52aXJvbm1lbnQiCi0Jcj1gJHtTU0h9IC0kcCAtcSAtRiAkT0JKL3NzaF9wcm94eSBzb21laG9zdCAnZWNobyAkRk9PJ2AKLQlpZiBbICIkciIgIT0gImJhciIgXTsgdGhlbgotCQlmYWlsICJrZXkgb3B0aW9uIGVudmlyb25tZW50IG5vdCBzZXQiCi0JZmkKLWRvbmUKLQotIyBUZXN0IGZyb209IHJlc3RyaWN0aW9uCi1zdGFydF9zc2hkCi1mb3IgcCBpbiAxIDI7IGRvCi0gICAgZm9yIGYgaW4gMTI3LjAuMC4xICcxMjcuMC4wLjBcLzgnOyBkbwotCWNhdCAgJG9yaWdrZXlzID4kYXV0aGtleXMKLQkke1NTSH0gLSRwIC1xIC1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0IHRydWUKLQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KLQkJZmFpbCAia2V5IG9wdGlvbiBwcm90byAkcCBmYWlsZWQgd2l0aG91dCByZXN0cmljdGlvbiIKLQlmaQotCi0Jc2VkICdzLy4qL2Zyb209IiciJGYiJyIgJi8nICRvcmlna2V5cyA+JGF1dGhrZXlzCi0JZnJvbT1gaGVhZCAtMSAkYXV0aGtleXMgfCBjdXQgLWYxIC1kICcgJ2AKLQl2ZXJib3NlICJrZXkgb3B0aW9uIHByb3RvICRwICRmcm9tIgotCXI9YCR7U1NIfSAtJHAgLXEgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgJ2VjaG8gdHJ1ZSdgCi0JaWYgWyAiJHIiID0gInRydWUiIF07IHRoZW4KLQkJZmFpbCAia2V5IG9wdGlvbiBwcm90byAkcCAkZnJvbSBub3QgcmVzdHJpY3RlZCIKLQlmaQotCi0Jcj1gJHtTU0h9IC0kcCAtcSAtRiAkT0JKL3NzaF9jb25maWcgc29tZWhvc3QgJ2VjaG8gdHJ1ZSdgCi0JaWYgWyAiJHIiICE9ICJ0cnVlIiBdOyB0aGVuCi0JCWZhaWwgImtleSBvcHRpb24gcHJvdG8gJHAgJGZyb20gbm90IGFsbG93ZWQgYnV0IHNob3VsZCBiZSIKLQlmaQotICAgIGRvbmUKLWRvbmUKLQotcm0gLWYgIiRvcmlna2V5cyIKZGlmZiAtLWdpdCBhL3JlZ3Jlc3Mva2V5Z2VuLWNoYW5nZS5zaCBiL3JlZ3Jlc3Mva2V5Z2VuLWNoYW5nZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkMzU5MC4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL2tleWdlbi1jaGFuZ2Uuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jCSRPcGVuQlNEOiBrZXlnZW4tY2hhbmdlLnNoLHYgMS4yIDIwMDIvMDcvMTYgMDk6MTU6NTUgbWFya3VzIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJjaGFuZ2UgcGFzc3BocmFzZSBmb3Iga2V5IgotCi1TMT0ic2VjcmV0MSIKLVMyPSIyc2VjcmV0IgotCi1mb3IgdCBpbiByc2EgZHNhIHJzYTE7IGRvCi0JIyBnZW5lcmF0ZSB1c2VyIGtleSBmb3IgYWdlbnQKLQl0cmFjZSAiZ2VuZXJhdGluZyAkdCBrZXkiCi0Jcm0gLWYgJE9CSi8kdC1rZXkKLQkke1NTSEtFWUdFTn0gLXEgLU4gJHtTMX0gLXQgJHQgLWYgJE9CSi8kdC1rZXkKLQlpZiBbICQ/IC1lcSAwIF07IHRoZW4KLQkJJHtTU0hLRVlHRU59IC1wIC1QICR7UzF9IC1OICR7UzJ9IC1mICRPQkovJHQta2V5ID4gL2Rldi9udWxsCi0JCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQkJZmFpbCAic3NoLWtleWdlbiAtcCBmYWlsZWQgZm9yICR0LWtleSIKLQkJZmkKLQllbHNlCi0JCWZhaWwgInNzaC1rZXlnZW4gZm9yICR0LWtleSBmYWlsZWQiCi0JZmkKLQlybSAtZiAkT0JKLyR0LWtleSAkT0JKLyR0LWtleS5wdWIKLWRvbmUKZGlmZiAtLWdpdCBhL3JlZ3Jlc3Mva2V5Z2VuLWNvbnZlcnQuc2ggYi9yZWdyZXNzL2tleWdlbi1jb252ZXJ0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDBlOWM2Li4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3Mva2V5Z2VuLWNvbnZlcnQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jCSRPcGVuQlNEOiBrZXlnZW4tY29udmVydC5zaCx2IDEuMSAyMDA5LzExLzA5IDA0OjIwOjA0IGR0dWNrZXIgRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9ImNvbnZlcnQga2V5cyIKLQotZm9yIHQgaW4gcnNhIGRzYTsgZG8KLQkjIGdlbmVyYXRlIHVzZXIga2V5IGZvciBhZ2VudAotCXRyYWNlICJnZW5lcmF0aW5nICR0IGtleSIKLQlybSAtZiAkT0JKLyR0LWtleQotCSR7U1NIS0VZR0VOfSAtcSAtTiAiIiAtdCAkdCAtZiAkT0JKLyR0LWtleQotCi0JdHJhY2UgImV4cG9ydCAkdCBwcml2YXRlIHRvIHJmYzQ3MTYgcHVibGljIgotCSR7U1NIS0VZR0VOfSAtcSAtZSAtZiAkT0JKLyR0LWtleSA+JE9CSi8kdC1rZXktcmZjIHx8IFwKLQkgICAgZmFpbCAiZXhwb3J0ICR0IHByaXZhdGUgdG8gcmZjNDcxNiBwdWJsaWMiCi0KLQl0cmFjZSAiZXhwb3J0ICR0IHB1YmxpYyB0byByZmM0NzE2IHB1YmxpYyIKLQkke1NTSEtFWUdFTn0gLXEgLWUgLWYgJE9CSi8kdC1rZXkucHViID4kT0JKLyR0LWtleS1yZmMucHViIHx8IFwKLQkgICAgZmFpbCAiJHQgcHVibGljIHRvIHJmYzQ3MTYgcHVibGljIgotCi0JY21wICRPQkovJHQta2V5LXJmYyAkT0JKLyR0LWtleS1yZmMucHViIHx8IFwKLQkgICAgZmFpbCAiJHQgcmZjNDcxNiBleHBvcnRzIGRpZmZlciBiZXR3ZWVuIHB1YmxpYyBhbmQgcHJpdmF0ZSIKLQotCXRyYWNlICJpbXBvcnQgJHQgcmZjNDcxNiBwdWJsaWMiCi0JJHtTU0hLRVlHRU59IC1xIC1pIC1mICRPQkovJHQta2V5LXJmYyA+JE9CSi8kdC1yZmMtaW1wb3J0ZWQgfHwgXAotCSAgICBmYWlsICIkdCBpbXBvcnQgcmZjNDcxNiBwdWJsaWMiCi0KLQljdXQgLWYxLDIgLWQgIiAiICRPQkovJHQta2V5LnB1YiA+JE9CSi8kdC1rZXktbm9jb21tZW50LnB1YgotCWNtcCAkT0JKLyR0LWtleS1ub2NvbW1lbnQucHViICRPQkovJHQtcmZjLWltcG9ydGVkIHx8IFwKLQkgICAgZmFpbCAiJHQgaW1wb3J0ZWQgZGlmZmVycyBmcm9tIG9yaWdpbmFsIgotCi0Jcm0gLWYgJE9CSi8kdC1rZXkgJE9CSi8kdC1rZXkucHViICRPQkovJHQta2V5LXJmYyAkT0JKLyR0LWtleS1yZmMucHViIFwKLQkgICAgJE9CSi8kdC1yZmMtaW1wb3J0ZWQgJE9CSi8kdC1rZXktbm9jb21tZW50LnB1YgotZG9uZQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9rZXlzY2FuLnNoIGIvcmVncmVzcy9rZXlzY2FuLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2YxNGYwLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3Mva2V5c2Nhbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMJJE9wZW5CU0Q6IGtleXNjYW4uc2gsdiAxLjMgMjAwMi8wMy8xNSAxMzowODo1NiBtYXJrdXMgRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9ImtleXNjYW4iCi0KLSMgcmVtb3ZlIERTQSBob3N0a2V5Ci1ybSAtZiAke09CSn0vaG9zdC5kc2EKLQotc3RhcnRfc3NoZAotCi1mb3IgdCBpbiByc2ExIHJzYSBkc2E7IGRvCi0JdHJhY2UgImtleXNjYW4gdHlwZSAkdCIKLQkke1NTSEtFWVNDQU59IC10ICR0IC1wICRQT1JUIDEyNy4wLjAuMSAxMjcuMC4wLjEgMTI3LjAuMC4xIFwKLQkJPiAvZGV2L251bGwgMj4mMQotCXI9JD8KLQlpZiBbICRyIC1uZSAwIF07IHRoZW4KLQkJZmFpbCAic3NoLWtleXNjYW4gLXQgJHQgZmFpbGVkIHdpdGg6ICRyIgotCWZpCi1kb25lCmRpZmYgLS1naXQgYS9yZWdyZXNzL2tleXR5cGUuc2ggYi9yZWdyZXNzL2tleXR5cGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYmYxMzIuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9rZXl0eXBlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIwkkT3BlbkJTRDoga2V5dHlwZS5zaCx2IDEuMSAyMDEwLzA5LzAyIDE2OjEyOjU1IG1hcmt1cyBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0ibG9naW4gd2l0aCBkaWZmZXJlbnQga2V5IHR5cGVzIgotCi1USU1FPWB3aGljaCB0aW1lYCAyPi9kZXYvbnVsbAotaWYgdGVzdCAhIC14ICIkVElNRSI7IHRoZW4KLQlUSU1FPSIiCi1maQotCi1jcCAkT0JKL3NzaGRfcHJveHkgJE9CSi9zc2hkX3Byb3h5X2JhawotY3AgJE9CSi9zc2hfcHJveHkgJE9CSi9zc2hfcHJveHlfYmFrCi0KLWt0eXBlcz0iZHNhLTEwMjQgcnNhLTIwNDggcnNhLTMwNzIiCi1pZiB0ZXN0ICIkVEVTVF9TU0hfRUNDIiA9ICJ5ZXMiOyB0aGVuCi0Ja3R5cGVzPSIka3R5cGVzIGVjZHNhLTI1NiBlY2RzYS0zODQgZWNkc2EtNTIxIgotZmkKLQotZm9yIGt0IGluICRrdHlwZXM7IGRvIAotCXJtIC1mICRPQkova2V5LiRrdAotCWJpdHM9YGVjaG8gJHtrdH0gfCBhd2sgLUYtICd7cHJpbnQgJDJ9J2AKLQl0eXBlPWBlY2hvICR7a3R9ICB8IGF3ayAtRi0gJ3twcmludCAkMX0nYAotCXByaW50ZiAia2V5Z2VuICR0eXBlLCAkYml0cyBiaXRzOlx0IgotCSR7VElNRX0gJHtTU0hLRVlHRU59IC1iICRiaXRzIC1xIC1OICcnIC10ICR0eXBlICAtZiAkT0JKL2tleS4ka3QgfHxcCi0JCWZhaWwgInNzaC1rZXlnZW4gZm9yIHR5cGUgJHR5cGUsICRiaXRzIGJpdHMgZmFpbGVkIgotZG9uZQotCi10cmllcz0iMSAyIDMiCi1mb3IgdXQgaW4gJGt0eXBlczsgZG8gCi0JaHR5cGVzPSR1dAotCSNodHlwZXM9JGt0eXBlcwotCWZvciBodCBpbiAkaHR5cGVzOyBkbyAKLQkJdHJhY2UgInNzaCBjb25uZWN0LCB1c2Vya2V5ICR1dCwgaG9zdGtleSAkaHQiCi0JCSgKLQkJCWdyZXAgLXYgSG9zdEtleSAkT0JKL3NzaGRfcHJveHlfYmFrCi0JCQllY2hvIEhvc3RLZXkgJE9CSi9rZXkuJGh0IAotCQkpID4gJE9CSi9zc2hkX3Byb3h5Ci0JCSgKLQkJCWdyZXAgLXYgSWRlbnRpdHlGaWxlICRPQkovc3NoX3Byb3h5X2JhawotCQkJZWNobyBJZGVudGl0eUZpbGUgJE9CSi9rZXkuJHV0IAotCQkpID4gJE9CSi9zc2hfcHJveHkKLQkJKAotCQkJZWNob24gJ2xvY2FsaG9zdC13aXRoLWFsaWFzLDEyNy4wLjAuMSw6OjEgJwotCQkJY2F0ICRPQkova2V5LiRodC5wdWIKLQkJKSA+ICRPQkova25vd25faG9zdHMKLQkJY2F0ICRPQkova2V5LiR1dC5wdWIgPiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgotCQlmb3IgaSBpbiAkdHJpZXM7IGRvCi0JCQlwcmludGYgInVzZXJrZXkgJHV0LCBob3N0a2V5ICR7aHR9Olx0IgotCQkJJHtUSU1FfSAke1NTSH0gLUYgJE9CSi9zc2hfcHJveHkgOTk5Ljk5OS45OTkuOTk5IHRydWUKLQkJCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQkJCWZhaWwgInNzaCB1c2Vya2V5ICR1dCwgaG9zdGtleSAkaHQgZmFpbGVkIgotCQkJZmkKLQkJZG9uZQotCWRvbmUKLWRvbmUKZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvbG9jYWxjb21tYW5kLnNoIGIvcmVncmVzcy9sb2NhbGNvbW1hbmQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYWRlN2EuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9sb2NhbGNvbW1hbmQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jCSRPcGVuQlNEOiBsb2NhbGNvbW1hbmQuc2gsdiAxLjEgMjAwNy8xMC8yOSAwNjo1NzoxMyBkdHVja2VyIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJsb2NhbGNvbW1hbmQiCi0KLWVjaG8gJ1Blcm1pdExvY2FsQ29tbWFuZCB5ZXMnID4+ICRPQkovc3NoX3Byb3h5Ci1lY2hvICdMb2NhbENvbW1hbmQgZWNobyBmb28nID4+ICRPQkovc3NoX3Byb3h5Ci0KLWZvciBwIGluIDEgMjsgZG8KLQl2ZXJib3NlICJ0ZXN0ICR0aWQ6IHByb3RvICRwIGxvY2FsY29tbWFuZCIKLQlhPWAke1NTSH0gLUYgJE9CSi9zc2hfcHJveHkgLSRwIHNvbWVob3N0IHRydWVgCi0JaWYgWyAiJGEiICE9ICJmb28iIF0gOyB0aGVuCi0JCWZhaWwgIiR0aWQgcHJvdG8gJHAiCi0JZmkKLWRvbmUKZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvbG9naW4tdGltZW91dC5zaCBiL3JlZ3Jlc3MvbG9naW4tdGltZW91dC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmYmIzMi4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL2xvZ2luLXRpbWVvdXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jCSRPcGVuQlNEOiBsb2dpbi10aW1lb3V0LnNoLHYgMS40IDIwMDUvMDIvMjcgMjM6MTM6MzYgZGptIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJjb25uZWN0IGFmdGVyIGxvZ2luIGdyYWNlIHRpbWVvdXQiCi0KLXRyYWNlICJ0ZXN0IGxvZ2luIGdyYWNlIHdpdGggcHJpdnNlcCIKLWVjaG8gIkxvZ2luR3JhY2VUaW1lIDEwcyIgPj4gJE9CSi9zc2hkX2NvbmZpZwotZWNobyAiTWF4U3RhcnR1cHMgMSIgPj4gJE9CSi9zc2hkX2NvbmZpZwotc3RhcnRfc3NoZAotCi0oZWNobyBTU0gtMi4wLWZha2U7IHNsZWVwIDYwKSB8IHRlbG5ldCAxMjcuMC4wLjEgJHtQT1JUfSA+L2Rldi9udWxsIDI+JjEgJiAKLXNsZWVwIDE1Ci0ke1NTSH0gLUYgJE9CSi9zc2hfY29uZmlnIHNvbWVob3N0IHRydWUKLWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCWZhaWwgInNzaCBjb25uZWN0IGFmdGVyIGxvZ2luIGdyYWNlIHRpbWVvdXQgZmFpbGVkIHdpdGggcHJpdnNlcCIKLWZpCi0KLSRTVURPIGtpbGwgYCRTVURPIGNhdCAkUElERklMRWAKLQotdHJhY2UgInRlc3QgbG9naW4gZ3JhY2Ugd2l0aG91dCBwcml2c2VwIgotZWNobyAiVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiBubyIgPj4gJE9CSi9zc2hkX2NvbmZpZwotc3RhcnRfc3NoZAotCi0oZWNobyBTU0gtMi4wLWZha2U7IHNsZWVwIDYwKSB8IHRlbG5ldCAxMjcuMC4wLjEgJHtQT1JUfSA+L2Rldi9udWxsIDI+JjEgJiAKLXNsZWVwIDE1Ci0ke1NTSH0gLUYgJE9CSi9zc2hfY29uZmlnIHNvbWVob3N0IHRydWUKLWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCWZhaWwgInNzaCBjb25uZWN0IGFmdGVyIGxvZ2luIGdyYWNlIHRpbWVvdXQgZmFpbGVkIHdpdGhvdXQgcHJpdnNlcCIKLWZpCmRpZmYgLS1naXQgYS9yZWdyZXNzL211bHRpcGxleC5zaCBiL3JlZ3Jlc3MvbXVsdGlwbGV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTRjZGYwLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvbXVsdGlwbGV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotIwkkT3BlbkJTRDogbXVsdGlwbGV4LnNoLHYgMS4xMiAyMDA5LzA1LzA1IDA3OjUxOjM2IGR0dWNrZXIgRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi1DVEw9L3RtcC9vcGVuc3NoLnJlZ3Jlc3MuY3RsLXNvY2suJCQKLQotdGlkPSJjb25uZWN0aW9uIG11bHRpcGxleGluZyIKLQotaWYgY29uZmlnX2RlZmluZWQgRElTQUJMRV9GRF9QQVNTSU5HIDsgdGhlbgotCWVjaG8gInNraXBwZWQgKG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSkiCi0JZXhpdCAwCi1maQotCi1EQVRBPS9iaW4vbHMke0VYRUVYVH0KLUNPUFk9JE9CSi9scy5jb3B5Ci1MT0c9JFRFU1RfU1NIX0xPR0ZJTEUKLQotc3RhcnRfc3NoZAotCi10cmFjZSAic3RhcnQgbWFzdGVyLCBmb3JrIHRvIGJhY2tncm91bmQiCi0ke1NTSH0gLU5uMiAtTVMkQ1RMIC1GICRPQkovc3NoX2NvbmZpZyAtb1NlbmRFbnY9Il9YWFhfVEVTVCIgc29tZWhvc3QgJgotTUFTVEVSX1BJRD0kIQotCi0jIFdhaXQgZm9yIG1hc3RlciB0byBzdGFydCBhbmQgYXV0aGVudGljYXRlCi1zbGVlcCA1Ci0KLXZlcmJvc2UgInRlc3QgJHRpZDogZW52cGFzcyIKLXRyYWNlICJlbnYgcGFzc2luZyBvdmVyIG11bHRpcGxleGVkIGNvbm5lY3Rpb24iCi1fWFhYX1RFU1Q9YmxhaCAke1NTSH0gLUYgJE9CSi9zc2hfY29uZmlnIC1vU2VuZEVudj0iX1hYWF9URVNUIiAtUyRDVEwgb3RoZXJob3N0IHNoIDw8ICdFT0YnCi0JdGVzdCBYIiRfWFhYX1RFU1QiID0gWCJibGFoIgotRU9GCi1pZiBbICQ/IC1uZSAwIF07IHRoZW4KLQlmYWlsICJlbnZpcm9ubWVudCBub3QgZm91bmQiCi1maQotCi12ZXJib3NlICJ0ZXN0ICR0aWQ6IHRyYW5zZmVyIgotcm0gLWYgJHtDT1BZfQotdHJhY2UgInNzaCB0cmFuc2ZlciBvdmVyIG11bHRpcGxleGVkIGNvbm5lY3Rpb24gYW5kIGNoZWNrIHJlc3VsdCIKLSR7U1NIfSAtRiAkT0JKL3NzaF9jb25maWcgLVMkQ1RMIG90aGVyaG9zdCBjYXQgJHtEQVRBfSA+ICR7Q09QWX0KLXRlc3QgLWYgJHtDT1BZfQkJCXx8IGZhaWwgInNzaCAtU2N0bDogZmFpbGVkIGNvcHkgJHtEQVRBfSIgCi1jbXAgJHtEQVRBfSAke0NPUFl9CQl8fCBmYWlsICJzc2ggLVNjdGw6IGNvcnJ1cHRlZCBjb3B5IG9mICR7REFUQX0iCi0KLXJtIC1mICR7Q09QWX0KLXRyYWNlICJzc2ggdHJhbnNmZXIgb3ZlciBtdWx0aXBsZXhlZCBjb25uZWN0aW9uIGFuZCBjaGVjayByZXN1bHQiCi0ke1NTSH0gLUYgJE9CSi9zc2hfY29uZmlnIC1TICRDVEwgb3RoZXJob3N0IGNhdCAke0RBVEF9ID4gJHtDT1BZfQotdGVzdCAtZiAke0NPUFl9CQkJfHwgZmFpbCAic3NoIC1TIGN0bDogZmFpbGVkIGNvcHkgJHtEQVRBfSIgCi1jbXAgJHtEQVRBfSAke0NPUFl9CQl8fCBmYWlsICJzc2ggLVMgY3RsOiBjb3JydXB0ZWQgY29weSBvZiAke0RBVEF9IgotCi1ybSAtZiAke0NPUFl9Ci10cmFjZSAic2Z0cCB0cmFuc2ZlciBvdmVyIG11bHRpcGxleGVkIGNvbm5lY3Rpb24gYW5kIGNoZWNrIHJlc3VsdCIKLWVjaG8gImdldCAke0RBVEF9ICR7Q09QWX0iIHwgXAotCSR7U0ZUUH0gLVMgJHtTU0h9IC1GICRPQkovc3NoX2NvbmZpZyAtb0NvbnRyb2xQYXRoPSRDVEwgb3RoZXJob3N0ID4kTE9HIDI+JjEKLXRlc3QgLWYgJHtDT1BZfQkJCXx8IGZhaWwgInNmdHA6IGZhaWxlZCBjb3B5ICR7REFUQX0iIAotY21wICR7REFUQX0gJHtDT1BZfQkJfHwgZmFpbCAic2Z0cDogY29ycnVwdGVkIGNvcHkgb2YgJHtEQVRBfSIKLQotcm0gLWYgJHtDT1BZfQotdHJhY2UgInNjcCB0cmFuc2ZlciBvdmVyIG11bHRpcGxleGVkIGNvbm5lY3Rpb24gYW5kIGNoZWNrIHJlc3VsdCIKLSR7U0NQfSAtUyAke1NTSH0gLUYgJE9CSi9zc2hfY29uZmlnIC1vQ29udHJvbFBhdGg9JENUTCBvdGhlcmhvc3Q6JHtEQVRBfSAke0NPUFl9ID4kTE9HIDI+JjEKLXRlc3QgLWYgJHtDT1BZfQkJCXx8IGZhaWwgInNjcDogZmFpbGVkIGNvcHkgJHtEQVRBfSIgCi1jbXAgJHtEQVRBfSAke0NPUFl9CQl8fCBmYWlsICJzY3A6IGNvcnJ1cHRlZCBjb3B5IG9mICR7REFUQX0iCi0KLXJtIC1mICR7Q09QWX0KLQotZm9yIHMgaW4gMCAxIDQgNSA0NDsgZG8KLQl0cmFjZSAiZXhpdCBzdGF0dXMgJHMgb3ZlciBtdWx0aXBsZXhlZCBjb25uZWN0aW9uIgotCXZlcmJvc2UgInRlc3QgJHRpZDogc3RhdHVzICRzIgotCSR7U1NIfSAtRiAkT0JKL3NzaF9jb25maWcgLVMgJENUTCBvdGhlcmhvc3QgZXhpdCAkcwotCXI9JD8KLQlpZiBbICRyIC1uZSAkcyBdOyB0aGVuCi0JCWZhaWwgImV4aXQgY29kZSBtaXNtYXRjaCBmb3IgcHJvdG9jb2wgJHA6ICRyICE9ICRzIgotCWZpCi0KLQkjIHNhbWUgd2l0aCBlYXJseSBjbG9zZSBvZiBzdGRvdXQvZXJyCi0JdHJhY2UgImV4aXQgc3RhdHVzICRzIHdpdGggZWFybHkgY2xvc2Ugb3ZlciBtdWx0aXBsZXhlZCBjb25uZWN0aW9uIgotCSR7U1NIfSAtRiAkT0JKL3NzaF9jb25maWcgLVMgJENUTCAtbiBvdGhlcmhvc3QgXAotICAgICAgICAgICAgICAgIGV4ZWMgc2ggLWMgXCcic2xlZXAgMjsgZXhlYyA+IC9kZXYvbnVsbCAyPiYxOyBzbGVlcCAzOyBleGl0ICRzIlwnCi0Jcj0kPwotCWlmIFsgJHIgLW5lICRzIF07IHRoZW4KLQkJZmFpbCAiZXhpdCBjb2RlICh3aXRoIHNsZWVwKSBtaXNtYXRjaCBmb3IgcHJvdG9jb2wgJHA6ICRyICE9ICRzIgotCWZpCi1kb25lCi0KLXRyYWNlICJ0ZXN0IGNoZWNrIGNvbW1hbmQiCi0ke1NTSH0gLUYgJE9CSi9zc2hfY29uZmlnIC1TICRDVEwgLU9jaGVjayBvdGhlcmhvc3QgfHwgZmFpbCAiY2hlY2sgY29tbWFuZCBmYWlsZWQiIAotCi10cmFjZSAidGVzdCBleGl0IGNvbW1hbmQiCi0ke1NTSH0gLUYgJE9CSi9zc2hfY29uZmlnIC1TICRDVEwgLU9leGl0IG90aGVyaG9zdCB8fCBmYWlsICJzZW5kIGV4aXQgY29tbWFuZCBmYWlsZWQiIAotCi0jIFdhaXQgZm9yIG1hc3RlciB0byBleGl0Ci1zbGVlcCAyCi0KLWtpbGwgLTAgJE1BU1RFUl9QSUQgPi9kZXYvbnVsbCAyPiYxICYmIGZhaWwgImV4aXQgY29tbWFuZCBmYWlsZWQiIApkaWZmIC0tZ2l0IGEvcmVncmVzcy9wb3J0bnVtLnNoIGIvcmVncmVzcy9wb3J0bnVtLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGUwNjgwLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvcG9ydG51bS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMJJE9wZW5CU0Q6IHBvcnRudW0uc2gsdiAxLjEgMjAwOS8wOC8xMyAwMDo1NzoxNyBkam0gRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9InBvcnQgbnVtYmVyIHBhcnNpbmciCi0KLWJhZHBvcnQoKSB7Ci0JcG9ydD0kMQotCXZlcmJvc2UgIiR0aWQ6IGludmFsaWQgcG9ydCAkcG9ydCIKLQlpZiAke1NTSH0gLUYgJE9CSi9zc2hfcHJveHkgLXAgJHBvcnQgc29tZWhvc3QgdHJ1ZSAyPi9kZXYvbnVsbCA7IHRoZW4KLQkJZmFpbCAiJHRpZCBhY2NlcHRlZCBpbnZhbGlkIHBvcnQgJHBvcnQiCi0JZmkKLX0KLWdvb2Rwb3J0KCkgewotCXBvcnQ9JDEKLQl2ZXJib3NlICIkdGlkOiB2YWxpZCBwb3J0ICRwb3J0IgotCWlmICR7U1NIfSAtRiAkT0JKL3NzaF9wcm94eSAtcCAkcG9ydCBzb21laG9zdCB0cnVlIDI+L2Rldi9udWxsIDsgdGhlbgotCQk6Ci0JZWxzZQotCQlmYWlsICIkdGlkIHJlamVjdGVkIHZhbGlkIHBvcnQgJHBvcnQiCi0JZmkKLX0KLQotYmFkcG9ydCAwCi1iYWRwb3J0IDY1NTM2Ci1iYWRwb3J0IDEzMTA3MwotYmFkcG9ydCAyMDAwYmxhaAotYmFkcG9ydCBibGFoMjAwMAotCi1nb29kcG9ydCAxCi1nb29kcG9ydCAyMgotZ29vZHBvcnQgMjIyMgotZ29vZHBvcnQgMjIyMjIKLWdvb2Rwb3J0IDY1NTM1Ci0KZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvcHJvdG8tbWlzbWF0Y2guc2ggYi9yZWdyZXNzL3Byb3RvLW1pc21hdGNoLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjUyMWYyLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvcHJvdG8tbWlzbWF0Y2guc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jCSRPcGVuQlNEOiBwcm90by1taXNtYXRjaC5zaCx2IDEuMyAyMDAyLzAzLzE1IDEzOjA4OjU2IG1hcmt1cyBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0icHJvdG9jb2wgdmVyc2lvbiBtaXNtYXRjaCIKLQotbWlzbWF0Y2ggKCkKLXsKLQlzZXJ2ZXI9JDEKLQljbGllbnQ9JDIKLQliYW5uZXI9YGVjaG8gJHtjbGllbnR9IHwgJHtTU0hEfSAtbyAiUHJvdG9jb2w9JHtzZXJ2ZXJ9IiAtaSAtZiAke09CSn0vc3NoZF9wcm94eWAKLQlyPSQ/Ci0JdHJhY2UgInNzaGQgcHJpbnRzICR7YmFubmVyfSIKLQlpZiBbICRyIC1uZSAyNTUgXTsgdGhlbgotCQlmYWlsICJzc2hkIHByaW50cyAke2Jhbm5lcn0gYW5kIGFjY2VwdHMgY29ubmVjdCB3aXRoIHZlcnNpb24gJHtjbGllbnR9IgotCWZpCi19Ci0KLW1pc21hdGNoCTIJU1NILTEuNS1IQUxMTwotbWlzbWF0Y2gJMQlTU0gtMi4wLUhBTExPCmRpZmYgLS1naXQgYS9yZWdyZXNzL3Byb3RvLXZlcnNpb24uc2ggYi9yZWdyZXNzL3Byb3RvLXZlcnNpb24uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NTFhNjkuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9wcm90by12ZXJzaW9uLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIwkkT3BlbkJTRDogcHJvdG8tdmVyc2lvbi5zaCx2IDEuMyAyMDAyLzAzLzE1IDEzOjA4OjU2IG1hcmt1cyBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0ic3NoZCB2ZXJzaW9uIHdpdGggZGlmZmVyZW50IHByb3RvY29sIGNvbWJpbmF0aW9ucyIKLQotIyB3ZSBqdXN0IHN0YXJ0IHNzaGQgaW4gaW5ldGQgbW9kZSBhbmQgY2hlY2sgdGhlIGJhbm5lcgotY2hlY2tfdmVyc2lvbiAoKQotewotCXZlcnNpb249JDEKLQlleHBlY3Q9JDIKLQliYW5uZXI9YGVjaG9uIHwgJHtTU0hEfSAtbyAiUHJvdG9jb2w9JHt2ZXJzaW9ufSIgLWkgLWYgJHtPQkp9L3NzaGRfcHJveHlgCi0JY2FzZSAke2Jhbm5lcn0gaW4KLQlTU0gtMS45OS0qKQotCQlwcm90bz0xOTkKLQkJOzsKLQlTU0gtMi4wLSopCi0JCXByb3RvPTIwCi0JCTs7Ci0JU1NILTEuNS0qKQotCQlwcm90bz0xNQotCQk7OwotCSopCi0JCXByb3RvPTAKLQkJOzsKLQllc2FjCi0JaWYgWyAke2V4cGVjdH0gLW5lICR7cHJvdG99IF07IHRoZW4KLQkJZmFpbCAid3JvbmcgcHJvdG9jb2wgdmVyc2lvbiAke2Jhbm5lcn0gZm9yICR7dmVyc2lvbn0iCi0JZmkKLX0KLQotY2hlY2tfdmVyc2lvbgkyLDEJMTk5Ci1jaGVja192ZXJzaW9uCTEsMgkxOTkKLWNoZWNrX3ZlcnNpb24JMgkyMAotY2hlY2tfdmVyc2lvbgkxCTE1CmRpZmYgLS1naXQgYS9yZWdyZXNzL3Byb3h5LWNvbm5lY3Quc2ggYi9yZWdyZXNzL3Byb3h5LWNvbm5lY3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzZiMjUuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9wcm94eS1jb25uZWN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIwkkT3BlbkJTRDogcHJveHktY29ubmVjdC5zaCx2IDEuNSAyMDAyLzEyLzA5IDE1OjI4OjQ2IG1hcmt1cyBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0icHJveHkgY29ubmVjdCIKLQotZm9yIHAgaW4gMSAyOyBkbwotCSR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfcHJveHkgOTk5Ljk5OS45OTkuOTk5IHRydWUKLQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KLQkJZmFpbCAic3NoIHByb3h5Y29ubmVjdCBwcm90b2NvbCAkcCBmYWlsZWQiCi0JZmkKLQlTU0hfQ09OTkVDVElPTj1gJHtTU0h9IC0kcCAtRiAkT0JKL3NzaF9wcm94eSA5OTkuOTk5Ljk5OS45OTkgJ2VjaG8gJFNTSF9DT05ORUNUSU9OJ2AKLQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KLQkJZmFpbCAic3NoIHByb3h5Y29ubmVjdCBwcm90b2NvbCAkcCBmYWlsZWQiCi0JZmkKLQlpZiBbICIkU1NIX0NPTk5FQ1RJT04iICE9ICJVTktOT1dOIDY1NTM1IFVOS05PV04gNjU1MzUiIF07IHRoZW4KLQkJZmFpbCAiYmFkIFNTSF9DT05ORUNUSU9OIgotCWZpCi1kb25lCmRpZmYgLS1naXQgYS9yZWdyZXNzL3B1dHR5LWNpcGhlcnMuc2ggYi9yZWdyZXNzL3B1dHR5LWNpcGhlcnMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOGVhNjAuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9wdXR0eS1jaXBoZXJzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIwkkT3BlbkJTRDogcHV0dHktY2lwaGVycy5zaCx2IDEuMyAyMDA4LzExLzEwIDAyOjA2OjM1IGRqbSBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0icHV0dHkgY2lwaGVycyIKLQotREFUQT0vYmluL2xzCi1DT1BZPSR7T0JKfS9jb3B5Ci0KLWlmIHRlc3QgIngkUkVHUkVTU19JTlRFUk9QX1BVVFRZIiAhPSAieHllcyIgOyB0aGVuCi0JZWNobyAicHV0dHkgaW50ZXJvcCB0ZXN0cyBub3QgZW5hYmxlZCIKLQlleGl0IDAKLWZpCi0KLWZvciBjIGluIGFlcyBibG93ZmlzaCAzZGVzIGFyY2ZvdXIgYWVzMTI4LWN0ciBhZXMxOTItY3RyIGFlczI1Ni1jdHIgOyBkbwotCXZlcmJvc2UgIiR0aWQ6IGNpcGhlciAkYyIKLQljcCAke09CSn0vLnB1dHR5L3Nlc3Npb25zL2xvY2FsaG9zdF9wcm94eSBcCi0JICAgICR7T0JKfS8ucHV0dHkvc2Vzc2lvbnMvY2lwaGVyXyRjCi0JZWNobyAiQ2lwaGVyPSRjIiA+PiAke09CSn0vLnB1dHR5L3Nlc3Npb25zL2NpcGhlcl8kYwotCi0Jcm0gLWYgJHtDT1BZfQotCWVudiBIT01FPSRQV0QgJHtQTElOS30gLWxvYWQgY2lwaGVyXyRjIC1iYXRjaCAtaSBwdXR0eS5yc2EyIFwKLQkgICAgMTI3LjAuMC4xIGNhdCAke0RBVEF9ID4gJHtDT1BZfQotCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQlmYWlsICJzc2ggY2F0ICREQVRBIGZhaWxlZCIKLQlmaQotCWNtcCAke0RBVEF9ICR7Q09QWX0JCXx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgotZG9uZQotcm0gLWYgJHtDT1BZfQotCmRpZmYgLS1naXQgYS9yZWdyZXNzL3B1dHR5LWtleC5zaCBiL3JlZ3Jlc3MvcHV0dHkta2V4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTM4ODVhLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvcHV0dHkta2V4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIwkkT3BlbkJTRDogcHV0dHkta2V4LnNoLHYgMS4yIDIwMDgvMDYvMzAgMTA6MzE6MTEgZGptIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJwdXR0eSBLRVgiCi0KLURBVEE9L2Jpbi9scwotQ09QWT0ke09CSn0vY29weQotCi1pZiB0ZXN0ICJ4JFJFR1JFU1NfSU5URVJPUF9QVVRUWSIgIT0gInh5ZXMiIDsgdGhlbgotCWVjaG8gInB1dHR5IGludGVyb3AgdGVzdHMgbm90IGVuYWJsZWQiCi0JZXhpdCAwCi1maQotCi1mb3IgayBpbiBkaC1nZXgtc2hhMSBkaC1ncm91cDEtc2hhMSBkaC1ncm91cDE0LXNoYTEgOyBkbwotCXZlcmJvc2UgIiR0aWQ6IGtleCAkayIKLQljcCAke09CSn0vLnB1dHR5L3Nlc3Npb25zL2xvY2FsaG9zdF9wcm94eSBcCi0JICAgICR7T0JKfS8ucHV0dHkvc2Vzc2lvbnMva2V4XyRrCi0JZWNobyAiS0VYPSRrIiA+PiAke09CSn0vLnB1dHR5L3Nlc3Npb25zL2tleF8kawotCi0JZW52IEhPTUU9JFBXRCAke1BMSU5LfSAtbG9hZCBrZXhfJGsgLWJhdGNoIC1pIHB1dHR5LnJzYTIgXAotCSAgICAxMjcuMC4wLjEgdHJ1ZQotCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQlmYWlsICJLRVggJGsgZmFpbGVkIgotCWZpCi1kb25lCi0KZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvcHV0dHktdHJhbnNmZXIuc2ggYi9yZWdyZXNzL3B1dHR5LXRyYW5zZmVyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFlMTU1Li4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvcHV0dHktdHJhbnNmZXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jCSRPcGVuQlNEOiBwdXR0eS10cmFuc2Zlci5zaCx2IDEuMiAyMDA4LzA2LzMwIDEwOjMxOjExIGRqbSBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0icHV0dHkgdHJhbnNmZXIgZGF0YSIKLQotREFUQT0vYmluL2xzCi1DT1BZPSR7T0JKfS9jb3B5Ci0KLWlmIHRlc3QgIngkUkVHUkVTU19JTlRFUk9QX1BVVFRZIiAhPSAieHllcyIgOyB0aGVuCi0JZWNobyAicHV0dHkgaW50ZXJvcCB0ZXN0cyBub3QgZW5hYmxlZCIKLQlleGl0IDAKLWZpCi0KLSMgWFhYIHN1cHBvcnQgcHJvdG9jb2wgMSB0b28KLWZvciBwIGluIDI7IGRvCi0JZm9yIGMgaW4gMCAxIDsgZG8gCi0JdmVyYm9zZSAiJHRpZDogcHJvdG8gJHAgY29tcHJlc3Npb24gJGMiCi0JCXJtIC1mICR7Q09QWX0KLQkJY3AgJHtPQkp9Ly5wdXR0eS9zZXNzaW9ucy9sb2NhbGhvc3RfcHJveHkgXAotCQkgICAgJHtPQkp9Ly5wdXR0eS9zZXNzaW9ucy9jb21wcmVzc2lvbl8kYwotCQllY2hvICJDb21wcmVzc2lvbj0kYyIgPj4gJHtPQkp9Ly5wdXR0eS9zZXNzaW9ucy9rZXhfJGsKLQkJZW52IEhPTUU9JFBXRCAke1BMSU5LfSAtbG9hZCBjb21wcmVzc2lvbl8kYyAtYmF0Y2ggXAotCQkgICAgLWkgcHV0dHkucnNhJHAgMTI3LjAuMC4xIGNhdCAke0RBVEF9ID4gJHtDT1BZfQotCQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KLQkJCWZhaWwgInNzaCBjYXQgJERBVEEgZmFpbGVkIgotCQlmaQotCQljbXAgJHtEQVRBfSAke0NPUFl9CQl8fCBmYWlsICJjb3JydXB0ZWQgY29weSIKLQkKLQkJZm9yIHMgaW4gMTAgMTAwIDFrIDMyayA2NGsgMTI4ayAyNTZrOyBkbwotCQkJdHJhY2UgInByb3RvICRwIGNvbXByZXNzaW9uICRjIGRkLXNpemUgJHtzfSIKLQkJCXJtIC1mICR7Q09QWX0KLQkJCWRkIGlmPSREQVRBIG9icz0ke3N9IDI+IC9kZXYvbnVsbCB8IFwKLQkJCQllbnYgSE9NRT0kUFdEICR7UExJTkt9IC1sb2FkIGNvbXByZXNzaW9uXyRjIFwKLQkJCQkgICAgLWJhdGNoIC1pIHB1dHR5LnJzYSRwIDEyNy4wLjAuMSBcCi0JCQkJICAgICJjYXQgPiAke0NPUFl9IgotCQkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCQkJZmFpbCAic3NoIGNhdCAkREFUQSBmYWlsZWQiCi0JCQlmaQotCQkJY21wICREQVRBICR7Q09QWX0JfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkiCi0JCWRvbmUKLQlkb25lCi1kb25lCi1ybSAtZiAke0NPUFl9Ci0KZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvcmVjb25maWd1cmUuc2ggYi9yZWdyZXNzL3JlY29uZmlndXJlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmQyODk1Li4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvcmVjb25maWd1cmUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jCSRPcGVuQlNEOiByZWNvbmZpZ3VyZS5zaCx2IDEuMiAyMDAzLzA2LzIxIDA5OjE0OjA1IG1hcmt1cyBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0ic2ltcGxlIGNvbm5lY3QgYWZ0ZXIgcmVjb25maWd1cmUiCi0KLSMgd2UgbmVlZCB0aGUgZnVsbCBwYXRoIHRvIHNzaGQgZm9yIC1IVVAKLWNhc2UgJFNTSEQgaW4KLS8qKQotCSMgZnVsbCBwYXRoIGlzIE9LIAotCTs7Ci0qKQotCSMgb3RoZXJ3aXNlIG1ha2UgZnVsbHkgcXVhbGlmaWVkCi0JU1NIRD0kT0JKLyRTU0hECi1lc2FjCi0KLXN0YXJ0X3NzaGQKLQotUElEPWAkU1VETyBjYXQgJFBJREZJTEVgCi1ybSAtZiAkUElERklMRQotJFNVRE8ga2lsbCAtSFVQICRQSUQKLQotdHJhY2UgIndhaXQgZm9yIHNzaGQgdG8gcmVzdGFydCIKLWk9MDsKLXdoaWxlIFsgISAtZiAkUElERklMRSAtYSAkaSAtbHQgMTAgXTsgZG8KLQlpPWBleHByICRpICsgMWAKLQlzbGVlcCAkaQotZG9uZQotCi10ZXN0IC1mICRQSURGSUxFIHx8IGZhdGFsICJzc2hkIGRpZCBub3QgcmVzdGFydCIKLQotZm9yIHAgaW4gMSAyOyBkbwotCSR7U1NIfSAtbyAiUHJvdG9jb2w9JHAiIC1GICRPQkovc3NoX2NvbmZpZyBzb21laG9zdCB0cnVlCi0JaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCWZhaWwgInNzaCBjb25uZWN0IHdpdGggcHJvdG9jb2wgJHAgZmFpbGVkIGFmdGVyIHJlY29uZmlndXJlIgotCWZpCi1kb25lCmRpZmYgLS1naXQgYS9yZWdyZXNzL3JlZXhlYy5zaCBiL3JlZ3Jlc3MvcmVleGVjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWRmYzMxLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvcmVleGVjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIwkkT3BlbkJTRDogcmVleGVjLnNoLHYgMS41IDIwMDQvMTAvMDggMDI6MDE6NTAgZGptIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJyZWV4ZWMgdGVzdHMiCi0KLURBVEE9L2Jpbi9scyR7RVhFRVhUfQotQ09QWT0ke09CSn0vY29weQotU1NIRF9PUklHPSRTU0hEJHtFWEVFWFR9Ci1TU0hEX0NPUFk9JE9CSi9zc2hkJHtFWEVFWFR9Ci0KLSMgU3RhcnQgYSBzc2hkIGFuZCB0aGVuIGRlbGV0ZSBpdAotc3RhcnRfc3NoZF9jb3B5ICgpCi17Ci0JY3AgJFNTSERfT1JJRyAkU1NIRF9DT1BZCi0JU1NIRD0kU1NIRF9DT1BZCi0Jc3RhcnRfc3NoZAotCVNTSEQ9JFNTSERfT1JJRwotfQotCi0jIERvIGJhc2ljIGNvcHkgdGVzdHMKLWNvcHlfdGVzdHMgKCkKLXsKLQlybSAtZiAke0NPUFl9Ci0JZm9yIHAgaW4gMSAyOyBkbwotCQl2ZXJib3NlICIkdGlkOiBwcm90byAkcCIKLQkJJHtTU0h9IC1ucW8gIlByb3RvY29sPSRwIiAtRiAkT0JKL3NzaF9jb25maWcgc29tZWhvc3QgXAotCQkgICAgY2F0ICR7REFUQX0gPiAke0NPUFl9Ci0JCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQkJZmFpbCAic3NoIGNhdCAkREFUQSBmYWlsZWQiCi0JCWZpCi0JCWNtcCAke0RBVEF9ICR7Q09QWX0JCXx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgotCQlybSAtZiAke0NPUFl9Ci0JZG9uZQotfQotCi12ZXJib3NlICJ0ZXN0IGNvbmZpZyBwYXNzaW5nIgotCi1jcCAkT0JKL3NzaGRfY29uZmlnICRPQkovc3NoZF9jb25maWcub3JpZwotc3RhcnRfc3NoZAotZWNobyAiSW52YWxpZFhYWD1ubyIgPj4gJE9CSi9zc2hkX2NvbmZpZwotCi1jb3B5X3Rlc3RzCi0KLSRTVURPIGtpbGwgYCRTVURPIGNhdCAkUElERklMRWAKLXJtIC1mICRQSURGSUxFCi0KLWNwICRPQkovc3NoZF9jb25maWcub3JpZyAkT0JKL3NzaGRfY29uZmlnCi0KLXZlcmJvc2UgInRlc3QgcmVleGVjIGZhbGxiYWNrIgotCi1zdGFydF9zc2hkX2NvcHkKLXJtIC1mICRTU0hEX0NPUFkKLQotY29weV90ZXN0cwotCi0kU1VETyBraWxsIGAkU1VETyBjYXQgJFBJREZJTEVgCi1ybSAtZiAkUElERklMRQotCi12ZXJib3NlICJ0ZXN0IHJlZXhlYyBmYWxsYmFjayB3aXRob3V0IHByaXZzZXAiCi0KLWNwICRPQkovc3NoZF9jb25maWcub3JpZyAkT0JKL3NzaGRfY29uZmlnCi1lY2hvICJVc2VQcml2aWxlZ2VTZXBhcmF0aW9uPW5vIiA+PiAkT0JKL3NzaGRfY29uZmlnCi0KLXN0YXJ0X3NzaGRfY29weQotcm0gLWYgJFNTSERfQ09QWQotCi1jb3B5X3Rlc3RzCi0KLSRTVURPIGtpbGwgYCRTVURPIGNhdCAkUElERklMRWAKLXJtIC1mICRQSURGSUxFCi0KLQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9yZWtleS5zaCBiL3JlZ3Jlc3MvcmVrZXkuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNWYyNjYuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9yZWtleS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMJJE9wZW5CU0Q6IHJla2V5LnNoLHYgMS4xIDIwMDMvMDMvMjggMTM6NTg6MjggbWFya3VzIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJyZWtleSBkdXJpbmcgdHJhbnNmZXIgZGF0YSIKLQotREFUQT0ke09CSn0vZGF0YQotQ09QWT0ke09CSn0vY29weQotTE9HPSR7T0JKfS9sb2cKLQotcm0gLWYgJHtDT1BZfSAke0xPR30gJHtEQVRBfQotdG91Y2ggJHtEQVRBfQotZGQgaWY9L2Jpbi9scyR7RVhFRVhUfSBvZj0ke0RBVEF9IGJzPTFrIHNlZWs9NTExIGNvdW50PTEgPiAvZGV2L251bGwgMj4mMQotCi1mb3IgcyBpbiAxNiAxayAxMjhrIDI1Nms7IGRvCi0JdHJhY2UgInJla2V5bGltaXQgJHtzfSIKLQlybSAtZiAke0NPUFl9Ci0JY2F0ICREQVRBIHwgXAotCQkke1NTSH0gLW9Db21wcmVzc2lvbj1ubyAtb1Jla2V5TGltaXQ9JHMgXAotCQkJLXYgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgImNhdCA+ICR7Q09QWX0iIFwKLQkJMj4gJHtMT0d9Ci0JaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCWZhaWwgInNzaCBmYWlsZWQiCi0JZmkKLQljbXAgJERBVEEgJHtDT1BZfQkJfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkiCi0Jbj1gZ3JlcCAnTkVXS0VZUyBzZW50JyAke0xPR30gfCB3YyAtbGAKLQluPWBleHByICRuIC0gMWAKLQl0cmFjZSAiJG4gcmVrZXlpbmcocykiCi0JaWYgWyAkbiAtbHQgMSBdOyB0aGVuCi0JCWZhaWwgIm5vIHJla2V5aW5nIG9jY3VyZWQiCi0JZmkKLWRvbmUKLXJtIC1mICR7Q09QWX0gJHtMT0d9ICR7REFUQX0KZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvcnNhX29wZW5zc2gucHJ2IGIvcmVncmVzcy9yc2Ffb3BlbnNzaC5wcnYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NzU1NTUuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9yc2Ffb3BlbnNzaC5wcnYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0tLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCi1NSUlDV2dJQkFBS0JnUURzaWx3S2NhS042d1NNTmQxV2dROStIUnFRRWtEMGtDVFZ0dHJhekd1ME9oQlUzVWtvCi0rZEZEMUlwMEN4ZFhtTjI1SlFXeE9ZRjdoL09jdThQM2p6djNSVFg4N3hLUjBZemxYVExYK1NMdEYveVNlYlMzCi14V1BybGZSVURoaDAzaFI1Vis4eHh2dnk5d2lkUFlLdy9vSXR3R1N1ZU9zRXExTFRjekNEdjJkQWpRSURBUUFCCi1BbjhuSDVWenZIa01iU3FKNmVPWURzVndvbVJ2WWJINUlFYVlsMXg2VkFUSVROdkF1OWtVZFE0TnNTcHVNYys3Ci1KajlnS1p2bU8xeTJZQ0tjMFAvaU8raS9lVjBMK3lRaDFSdzE4alFabGwrMTJUK0xacktSYXYwM1lOdk14MGdOCi13cVdZNDhLdDZodjIvTi9lYlF6S1JlNzkrRDB0MmNUaDkyaFQ3eEVORkxJQkFrRUJHbm9HS0ZqQVVrSkN3TzFWCi1tenBVcU1IcFJaVk9ycVA5aFVtUGp6Tko1b0JQRkdlNCtoMWhvU1JGT0F6YU51WnQ4c3NicWFMQ2t6QjhiZnpqCi1xaFpxQVFKQkFOWmVrdVVwcDhpQkxlTFNhZ3c1RmtjUHdQenE2emZFeGJodnNaWGI4Qm8vNFNmbE5zNEpIWHdJCi03U0Q5WjhhSkx2TTR1US81TTcwbGJsRE1RNDBpM28wQ1FRRElKdkJZQkZMNXRsT2dha3EvTzd5aSt3dDBMNUJaCi05SDc5dzVyQ1NBQTBJSFJvSy9xSTF1ckhpSEMzZjN2YmJMazVVU3RmcnFFYU5EL21tMHNoeU5JQkFrQkxzWWRDCi0vY3R0NUJjMHdVR0s0Vmw1YkJtajlMdHJyTUo0RnBCcEx3ai82OUJ3Q3VLb0s5WEtaMGg3M3A2WEh2ZUNFR1JnCi1QSWxGWDRNdGFvTHJ3Z1U5QWtCVjJrNGRnSXdzK1g4WVg2NUVzeXlGam5sRHFYNHgwblNPalFCMW1zSUtmSEJyCi1kaDVYTERCVFRDeG5LaE1KMFl4L29wZ092ZjA5WEhCRndhUW50UjVpCi0tLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9yc2Ffb3BlbnNzaC5wdWIgYi9yZWdyZXNzL3JzYV9vcGVuc3NoLnB1YgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwNDczMC4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL3JzYV9vcGVuc3NoLnB1YgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQURBUUFCQUFBQWdRRHNpbHdLY2FLTjZ3U01OZDFXZ1E5K0hScVFFa0Qwa0NUVnR0cmF6R3UwT2hCVTNVa28rZEZEMUlwMEN4ZFhtTjI1SlFXeE9ZRjdoL09jdThQM2p6djNSVFg4N3hLUjBZemxYVExYK1NMdEYveVNlYlMzeFdQcmxmUlVEaGgwM2hSNVYrOHh4dnZ5OXdpZFBZS3cvb0l0d0dTdWVPc0VxMUxUY3pDRHYyZEFqUT09CmRpZmYgLS1naXQgYS9yZWdyZXNzL3JzYV9zc2gyLnBydiBiL3JlZ3Jlc3MvcnNhX3NzaDIucHJ2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNlM2Q3Li4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvcnNhX3NzaDIucHJ2CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLS0tLSBCRUdJTiBTU0gyIEVOQ1JZUFRFRCBQUklWQVRFIEtFWSAtLS0tCi1TdWJqZWN0OiBzc2gta2V5Z2VuIHRlc3QKLUNvbW1lbnQ6ICIxMDI0LWJpdCByc2EsIFNhdCBKdW4gMjMgMjAwMSAxMjoyMToyNiAtMDQwMCIKLVAyLzU2d0FBQWk0QUFBQTNhV1l0Ylc5a2JudHphV2R1ZTNKellTMXdhMk56TVMxemFHRXhmU3hsYm1OeWVYQjBlM0p6WVMKLTF3YTJOek1YWXlMVzloWlhCOWZRQUFBQVJ1YjI1bEFBQUIzd0FBQWRzQUFBQVJBUUFCQUFBRDlpY2ZsWE84ZVF4dEtvbnAKLTQ1Z094WENpWkc5aHNma2dScGlYWEhwVUJNaE0yOEM3MlJSMURnMnhLbTR4ejdzbVAyQXBtK1k3WExaZ0lwelEvK0k3NkwKLTk1WFF2N0pDSFZIRFh5TkJtV1g3WFpQNHRtc3BGcS9UZGcyOHpIU0EzQ3Baamp3cTNxRy9iODM5NXRETXBGN3YzNFBTM1oKLXhPSDNhRlB2RVEwVXNnRUFBQVFBN0lwY0NuR2lqZXNFakRYZFZvRVBmaDBha0JKQTlKQWsxYmJhMnN4cnREb1FWTjFKS1AKLW5SUTlTS2RBc1hWNWpkdVNVRnNUbUJlNGZ6bkx2RDk0ODc5MFUxL084U2tkR001VjB5MS9raTdSZjhrbm0wdDhWajY1WDAKLVZBNFlkTjRVZVZmdk1jYjc4dmNJblQyQ3NQNkNMY0Jrcm5qckJLdFMwM013Zzc5blFJMEFBQUgvVmRwT0hZQ01MUGwvR0YKLSt1UkxNc2hZNTVRNmwrTWRKMGpvMEFkWnJDQ254d2EzWWVWeXd3VTB3c1p5b1RDZEdNZjZLWURyMzlQVnh3UmNHa0o3VWUKLVlnQUFBZ0RXWHBMbEthZklnUzNpMG1vTU9SWkhEOEQ4NnVzM3hNVzRiN0dWMi9BYVArRW41VGJPQ1IxOENPMGcvV2ZHaVMKLTd6T0xrUCtUTzlKVzVRekVPTkl0Nk5BQUFDQVFFYWVnWW9XTUJTUWtMQTdWV2JPbFNvd2VsRmxVNnVvLzJGU1krUE0wbm0KLWdFOFVaN2o2SFdHaEpFVTRETm8yNW0zeXl4dXBvc0tUTUh4dC9PT3FGbW9CCi0tLS0tIEVORCBTU0gyIEVOQ1JZUFRFRCBQUklWQVRFIEtFWSAtLS0tCi0tLS0KZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvcnVudGVzdHMuc2ggYi9yZWdyZXNzL3J1bnRlc3RzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ODA4ZWI4Li4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3MvcnVudGVzdHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIS9iaW4vc2gKLQotVEVTVF9TU0hfU1NIPS4uL3NzaAotVEVTVF9TU0hfU1NIRD0uLi9zc2hkCi1URVNUX1NTSF9TU0hBR0VOVD0uLi9zc2gtYWdlbnQKLVRFU1RfU1NIX1NTSEFERD0uLi9zc2gtYWRkCi1URVNUX1NTSF9TU0hLRVlHRU49Li4vc3NoLWtleWdlbgotVEVTVF9TU0hfU1NIS0VZU0NBTj0uLi9zc2gta2V5c2NhbgotVEVTVF9TU0hfU0ZUUD0uLi9zZnRwCi1URVNUX1NTSF9TRlRQU0VSVkVSPS4uL3NmdHAtc2VydmVyCi0KLXBtYWtlCi0KZGlmZiAtLWdpdCBhL3JlZ3Jlc3Mvc2NwLXNzaC13cmFwcGVyLnNoIGIvcmVncmVzcy9zY3Atc3NoLXdyYXBwZXIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDA1YTkuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9zY3Atc3NoLXdyYXBwZXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jIS9iaW4vc2gKLSMgICAgICAgJE9wZW5CU0Q6IHNjcC1zc2gtd3JhcHBlci5zaCx2IDEuMiAyMDA1LzEyLzE0IDA0OjM2OjM5IGR0dWNrZXIgRXhwICQKLSMgICAgICAgUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi1wcmludG5hbWUgKCkgewotCU5BTUU9JDEKLQlzYXZlX0lGUz0kSUZTCi0JSUZTPS8KLQlzZXQgLS0gYGVjaG8gIiROQU1FImAKLQlJRlM9IiRzYXZlX0lGUyIKLQl3aGlsZSBbICQjIC1nZSAxIF0gOyBkbwotCQlpZiBbICJ4JDEiICE9ICJ4IiBdOyB0aGVuCi0JCQllY2hvICJEMDc1NSAwICQxIgotCQlmaQotCQlzaGlmdDsKLQlkb25lCi19Ci0KLSMgRGlzY2FyZCBhbGwgYnV0IGxhc3QgYXJndW1lbnQuICBXZSB1c2UgYXJnIGxhdGVyLgotd2hpbGUgdGVzdCAiJDEiICE9ICIiOyBkbwotCWFyZz0iJDEiCi0Jc2hpZnQKLWRvbmUKLQotQkFEPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8ke0RJUn0vZG90cGF0aGRpciIKLQotY2FzZSAiJFNDUFRFU1RNT0RFIiBpbgotYmFkc2VydmVyXzApCi0JZWNobyAiRDA3NTUgMCAvJHtESVJ9L3Jvb3RwYXRoZGlyIgotCWVjaG8gIkM3NTUgMiByb290cGF0aGZpbGUiCi0JZWNobyAiWCIKLQk7OwotYmFkc2VydmVyXzEpCi0JZWNobyAiRDA3NTUgMCAkQkFEIgotCWVjaG8gIkM3NTUgMiBmaWxlIgotCWVjaG8gIlgiCi0JOzsKLWJhZHNlcnZlcl8yKQotCWVjaG8gIkQwNzU1IDAgJEJBRCIKLQllY2hvICJDNzU1IDIgZmlsZSIKLQllY2hvICJYIgotCTs7Ci1iYWRzZXJ2ZXJfMykKLQlwcmludG5hbWUgJEJBRAotCWVjaG8gIkM3NTUgMiBmaWxlIgotCWVjaG8gIlgiCi0JOzsKLWJhZHNlcnZlcl80KQotCXByaW50bmFtZSAkQkFECi0JZWNobyAiRDA3NTUgMCAuLiIKLQllY2hvICJDNzU1IDIgZmlsZSIKLQllY2hvICJYIgotCTs7Ci0qKQotCWV4ZWMgJGFyZwotCTs7Ci1lc2FjCmRpZmYgLS1naXQgYS9yZWdyZXNzL3NjcC5zaCBiL3JlZ3Jlc3Mvc2NwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ0MTJkLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3Mvc2NwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSMJJE9wZW5CU0Q6IHNjcC5zaCx2IDEuNyAyMDA2LzAxLzMxIDEwOjM2OjMzIGRqbSBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0ic2NwIgotCi0jc2V0IC14Ci0KLSMgRmlndXJlIG91dCBpZiBkaWZmIHVuZGVyc3RhbmRzICItTiIKLWlmIGRpZmYgLU4gJHtTUkN9L3NjcC5zaCAke1NSQ30vc2NwLnNoIDI+L2Rldi9udWxsOyB0aGVuCi0JRElGRk9QVD0iLXJOIgotZWxzZQotCURJRkZPUFQ9Ii1yIgotZmkKLQotREFUQT0vYmluL2xzJHtFWEVFWFR9Ci1DT1BZPSR7T0JKfS9jb3B5Ci1DT1BZMj0ke09CSn0vY29weTIKLURJUj0ke0NPUFl9LmRkCi1ESVIyPSR7Q09QWX0uZGQyCi0KLVNSQz1gZGlybmFtZSAke1NDUklQVH1gCi1jcCAke1NSQ30vc2NwLXNzaC13cmFwcGVyLnNoICR7T0JKfS9zY3Atc3NoLXdyYXBwZXIuc2NwCi1jaG1vZCA3NTUgJHtPQkp9L3NjcC1zc2gtd3JhcHBlci5zY3AKLXNjcG9wdHM9Ii1xIC1TICR7T0JKfS9zY3Atc3NoLXdyYXBwZXIuc2NwIgotCi1zY3BjbGVhbigpIHsKLQlybSAtcmYgJHtDT1BZfSAke0NPUFkyfSAke0RJUn0gJHtESVIyfQotCW1rZGlyICR7RElSfSAke0RJUjJ9Ci19Ci0KLXZlcmJvc2UgIiR0aWQ6IHNpbXBsZSBjb3B5IGxvY2FsIGZpbGUgdG8gbG9jYWwgZmlsZSIKLXNjcGNsZWFuCi0kU0NQICRzY3BvcHRzICR7REFUQX0gJHtDT1BZfSB8fCBmYWlsICJjb3B5IGZhaWxlZCIKLWNtcCAke0RBVEF9ICR7Q09QWX0gfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkiCi0KLXZlcmJvc2UgIiR0aWQ6IHNpbXBsZSBjb3B5IGxvY2FsIGZpbGUgdG8gcmVtb3RlIGZpbGUiCi1zY3BjbGVhbgotJFNDUCAkc2Nwb3B0cyAke0RBVEF9IHNvbWVob3N0OiR7Q09QWX0gfHwgZmFpbCAiY29weSBmYWlsZWQiCi1jbXAgJHtEQVRBfSAke0NPUFl9IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgotCi12ZXJib3NlICIkdGlkOiBzaW1wbGUgY29weSByZW1vdGUgZmlsZSB0byBsb2NhbCBmaWxlIgotc2NwY2xlYW4KLSRTQ1AgJHNjcG9wdHMgc29tZWhvc3Q6JHtEQVRBfSAke0NPUFl9IHx8IGZhaWwgImNvcHkgZmFpbGVkIgotY21wICR7REFUQX0gJHtDT1BZfSB8fCBmYWlsICJjb3JydXB0ZWQgY29weSIKLQotdmVyYm9zZSAiJHRpZDogc2ltcGxlIGNvcHkgbG9jYWwgZmlsZSB0byByZW1vdGUgZGlyIgotc2NwY2xlYW4KLWNwICR7REFUQX0gJHtDT1BZfQotJFNDUCAkc2Nwb3B0cyAke0NPUFl9IHNvbWVob3N0OiR7RElSfSB8fCBmYWlsICJjb3B5IGZhaWxlZCIKLWNtcCAke0NPUFl9ICR7RElSfS9jb3B5IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgotCi12ZXJib3NlICIkdGlkOiBzaW1wbGUgY29weSBsb2NhbCBmaWxlIHRvIGxvY2FsIGRpciIKLXNjcGNsZWFuCi1jcCAke0RBVEF9ICR7Q09QWX0KLSRTQ1AgJHNjcG9wdHMgJHtDT1BZfSAke0RJUn0gfHwgZmFpbCAiY29weSBmYWlsZWQiCi1jbXAgJHtDT1BZfSAke0RJUn0vY29weSB8fCBmYWlsICJjb3JydXB0ZWQgY29weSIKLQotdmVyYm9zZSAiJHRpZDogc2ltcGxlIGNvcHkgcmVtb3RlIGZpbGUgdG8gbG9jYWwgZGlyIgotc2NwY2xlYW4KLWNwICR7REFUQX0gJHtDT1BZfQotJFNDUCAkc2Nwb3B0cyBzb21laG9zdDoke0NPUFl9ICR7RElSfSB8fCBmYWlsICJjb3B5IGZhaWxlZCIKLWNtcCAke0NPUFl9ICR7RElSfS9jb3B5IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgotCi12ZXJib3NlICIkdGlkOiByZWN1cnNpdmUgbG9jYWwgZGlyIHRvIHJlbW90ZSBkaXIiCi1zY3BjbGVhbgotcm0gLXJmICR7RElSMn0KLWNwICR7REFUQX0gJHtESVJ9L2NvcHkKLSRTQ1AgJHNjcG9wdHMgLXIgJHtESVJ9IHNvbWVob3N0OiR7RElSMn0gfHwgZmFpbCAiY29weSBmYWlsZWQiCi1kaWZmICR7RElGRk9QVH0gJHtESVJ9ICR7RElSMn0gfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkiCi0KLXZlcmJvc2UgIiR0aWQ6IHJlY3Vyc2l2ZSBsb2NhbCBkaXIgdG8gbG9jYWwgZGlyIgotc2NwY2xlYW4KLXJtIC1yZiAke0RJUjJ9Ci1jcCAke0RBVEF9ICR7RElSfS9jb3B5Ci0kU0NQICRzY3BvcHRzIC1yICR7RElSfSAke0RJUjJ9IHx8IGZhaWwgImNvcHkgZmFpbGVkIgotZGlmZiAke0RJRkZPUFR9ICR7RElSfSAke0RJUjJ9IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgotCi12ZXJib3NlICIkdGlkOiByZWN1cnNpdmUgcmVtb3RlIGRpciB0byBsb2NhbCBkaXIiCi1zY3BjbGVhbgotcm0gLXJmICR7RElSMn0KLWNwICR7REFUQX0gJHtESVJ9L2NvcHkKLSRTQ1AgJHNjcG9wdHMgLXIgc29tZWhvc3Q6JHtESVJ9ICR7RElSMn0gfHwgZmFpbCAiY29weSBmYWlsZWQiCi1kaWZmICR7RElGRk9QVH0gJHtESVJ9ICR7RElSMn0gfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkiCi0KLXZlcmJvc2UgIiR0aWQ6IHNoZWxsIG1ldGFjaGFyYWN0ZXJzIgotc2NwY2xlYW4KLShjZCAke0RJUn0gJiYgXAotdG91Y2ggJ2B0b3VjaCBtZXRhY2hhcnRlc3RgJyAmJiBcCi0kU0NQICRzY3BvcHRzICptZXRhY2hhciogJHtESVIyfSAyPi9kZXYvbnVsbDsgXAotWyAhIC1mIG1ldGFjaGFydGVzdCBdICkgfHwgZmFpbCAic2hlbGwgbWV0YWNoYXJhY3RlcnMiCi0KLWlmIFsgISAteiAiJFNVRE8iIF07IHRoZW4KLQl2ZXJib3NlICIkdGlkOiBza2lwcGVkIGZpbGUgYWZ0ZXIgc2NwIC1wIHdpdGggZmFpbGVkIGNob3duK3V0aW1lcyIKLQlzY3BjbGVhbgotCWNwIC1wICR7REFUQX0gJHtESVJ9L2NvcHkKLQljcCAtcCAke0RBVEF9ICR7RElSfS9jb3B5MgotCWNwICR7REFUQX0gJHtESVIyfS9jb3B5Ci0JY2htb2QgNjYwICR7RElSMn0vY29weQotCSRTVURPIGNob3duIHJvb3QgJHtESVIyfS9jb3B5Ci0JJFNDUCAtcCAkc2Nwb3B0cyBzb21laG9zdDoke0RJUn0vXCogJHtESVIyfSA+L2Rldi9udWxsIDI+JjEKLQkkU1VETyBkaWZmICR7RElGRk9QVH0gJHtESVJ9ICR7RElSMn0gfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkiCi0JJFNVRE8gcm0gJHtESVIyfS9jb3B5Ci1maQotCi1mb3IgaSBpbiAwIDEgMiAzIDQ7IGRvCi0JdmVyYm9zZSAiJHRpZDogZGlzYWxsb3cgYmFkIHNlcnZlciAjJGkiCi0JU0NQVEVTVE1PREU9YmFkc2VydmVyXyRpCi0JZXhwb3J0IERJUiBTQ1BURVNUTU9ERQotCXNjcGNsZWFuCi0JJFNDUCAkc2Nwb3B0cyBzb21laG9zdDoke0RBVEF9ICR7RElSfSA+L2Rldi9udWxsIDI+L2Rldi9udWxsCi0JWyAtZCB7JERJUn0vcm9vdHBhdGhkaXIgXSAmJiBmYWlsICJhbGxvd3MgZGlyIHJlbGF0aXZlIHRvIHJvb3QgZGlyIgotCVsgLWQgJHtESVJ9L2RvdHBhdGhkaXIgXSAmJiBmYWlsICJhbGxvd3MgZGlyIGNyZWF0aW9uIGluIG5vbi1yZWN1cnNpdmUgbW9kZSIKLQotCXNjcGNsZWFuCi0JJFNDUCAtciAkc2Nwb3B0cyBzb21laG9zdDoke0RBVEF9ICR7RElSMn0gPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAotCVsgLWQgJHtESVJ9L2RvdHBhdGhkaXIgXSAmJiBmYWlsICJhbGxvd3MgZGlyIGNyZWF0aW9uIG91dHNpZGUgb2Ygc3ViZGlyIgotZG9uZQotCi12ZXJib3NlICIkdGlkOiBkZXRlY3Qgbm9uLWRpcmVjdG9yeSB0YXJnZXQiCi1zY3BjbGVhbgotZWNobyBhID4gJHtDT1BZfQotZWNobyBiID4gJHtDT1BZMn0KLSRTQ1AgJHNjcG9wdHMgJHtEQVRBfSAke0NPUFl9ICR7Q09QWTJ9Ci1jbXAgJHtDT1BZfSAke0NPUFkyfSA+L2Rldi9udWxsICYmIGZhaWwgImNvcnJ1cHQgdGFyZ2V0IgotCi1zY3BjbGVhbgotcm0gLWYgJHtPQkp9L3NjcC1zc2gtd3JhcHBlci5zY3AKZGlmZiAtLWdpdCBhL3JlZ3Jlc3Mvc2Z0cC1iYWRjbWRzLnNoIGIvcmVncmVzcy9zZnRwLWJhZGNtZHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MDA5ZjIuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9zZnRwLWJhZGNtZHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jCSRPcGVuQlNEOiBzZnRwLWJhZGNtZHMuc2gsdiAxLjQgMjAwOS8wOC8xMyAwMToxMTo1NSBkam0gRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9InNmdHAgaW52YWxpZCBjb21tYW5kcyIKLQotREFUQT0vYmluL2xzJHtFWEVFWFR9Ci1EQVRBMj0vYmluL3NoJHtFWEVFWFR9Ci1OT05FWElTVD0vTk9ORVhJU1QuJCQKLUNPUFk9JHtPQkp9L2NvcHkKLUdMT0JGSUxFUz1gKGNkIC9iaW47ZWNobyBsKilgCi0KLXJtIC1yZiAke0NPUFl9ICR7Q09QWX0uMSAke0NPUFl9LjIgJHtDT1BZfS5kZAotCi1ybSAtZiAke0NPUFl9Ci12ZXJib3NlICIkdGlkOiBnZXQgbm9uZXhpc3RlbnQiCi1lY2hvICJnZXQgJE5PTkVYSVNUICRDT1BZIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAotCXx8IGZhaWwgImdldCBub25leGlzdGVudCBmYWlsZWQiCi10ZXN0IC1mICR7Q09QWX0gJiYgZmFpbCAiZXhpc3RpbmcgY29weSBhZnRlciBnZXQgbm9uZXhpc3RlbnQiCi0KLXJtIC1mICR7Q09QWX0uZGQvKgotdmVyYm9zZSAiJHRpZDogZ2xvYiBnZXQgdG8gbm9uZXhpc3RlbnQgZGlyZWN0b3J5IgotZWNobyAiZ2V0IC9iaW4vbCogJE5PTkVYSVNUIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAotICAgICAgICB8fCBmYWlsICJnZXQgbm9uZXhpc3RlbnQgZmFpbGVkIgotZm9yIHggaW4gJEdMT0JGSUxFUzsgZG8KLSAgICAgICAgdGVzdCAtZiAke0NPUFl9LmRkLyR4ICYmIGZhaWwgImV4aXN0aW5nIGNvcHkgYWZ0ZXIgZ2V0IG5vbmV4aXN0ZW50IgotZG9uZQotCi1ybSAtZiAke0NPUFl9Ci12ZXJib3NlICIkdGlkOiBwdXQgbm9uZXhpc3RlbnQiCi1lY2hvICJwdXQgJE5PTkVYSVNUICRDT1BZIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAotCXx8IGZhaWwgInB1dCBub25leGlzdGVudCBmYWlsZWQiCi10ZXN0IC1mICR7Q09QWX0gJiYgZmFpbCAiZXhpc3RpbmcgY29weSBhZnRlciBwdXQgbm9uZXhpc3RlbnQiCi0KLXJtIC1mICR7Q09QWX0uZGQvKgotdmVyYm9zZSAiJHRpZDogZ2xvYiBwdXQgdG8gbm9uZXhpc3RlbnQgZGlyZWN0b3J5IgotZWNobyAicHV0IC9iaW4vbCogJHtDT1BZfS5kZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLSAgICAgICAgfHwgZmFpbCAicHV0IG5vbmV4aXN0ZW50IGZhaWxlZCIKLWZvciB4IGluICRHTE9CRklMRVM7IGRvCi0gICAgICAgIHRlc3QgLWYgJHtDT1BZfS5kZC8keCAmJiBmYWlsICJleGlzdGluZyBjb3B5IGFmdGVyIG5vbmV4aXN0ZW50IgotZG9uZQotCi1ybSAtZiAke0NPUFl9Ci12ZXJib3NlICIkdGlkOiByZW5hbWUgbm9uZXhpc3RlbnQiCi1lY2hvICJyZW5hbWUgJE5PTkVYSVNUICR7Q09QWX0uMSIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCBmYWlsICJyZW5hbWUgbm9uZXhpc3QgZmFpbGVkIgotdGVzdCAtZiAke0NPUFl9LjEgJiYgZmFpbCAiZmlsZSBleGlzdHMgYWZ0ZXIgcmVuYW1lIG5vbmV4aXN0ZW50IgotCi1ybSAtcmYgJHtDT1BZfSAke0NPUFl9LmRkCi1jcCAkREFUQSAkQ09QWQotbWtkaXIgJHtDT1BZfS5kZAotdmVyYm9zZSAiJHRpZDogcmVuYW1lIHRhcmdldCBleGlzdHMgKGRpcmVjdG9yeSkiCi1lY2hvICJyZW5hbWUgJENPUFkgJHtDT1BZfS5kZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCBmYWlsICJyZW5hbWUgdGFyZ2V0IGV4aXN0cyAoZGlyZWN0b3J5KSBmYWlsZWQiCi10ZXN0IC1mICR7Q09QWX0gfHwgZmFpbCAib2xkbmFtZSBtaXNzaW5nIGFmdGVyIHJlbmFtZSB0YXJnZXQgZXhpc3RzIChkaXJlY3RvcnkpIgotdGVzdCAtZCAke0NPUFl9LmRkIHx8IGZhaWwgIm5ld25hbWUgbWlzc2luZyBhZnRlciByZW5hbWUgdGFyZ2V0IGV4aXN0cyAoZGlyZWN0b3J5KSIKLWNtcCAkREFUQSAke0NPUFl9ID4vZGV2L251bGwgMj4mMSB8fCBmYWlsICJjb3JydXB0ZWQgb2xkbmFtZSBhZnRlciByZW5hbWUgdGFyZ2V0IGV4aXN0cyAoZGlyZWN0b3J5KSIKLQotcm0gLWYgJHtDT1BZfS5kZC8qCi1ybSAtcmYgJHtDT1BZfQotY3AgJHtEQVRBMn0gJHtDT1BZfQotdmVyYm9zZSAiJHRpZDogZ2xvYiBwdXQgZmlsZXMgdG8gbG9jYWwgZmlsZSIKLWVjaG8gInB1dCAvYmluL2wqICRDT1BZIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgCi1jbXAgJHtEQVRBMn0gJHtDT1BZfSB8fCBmYWlsICJwdXQgc3VjY2Vzc2VkIHdoZW4gaXQgc2hvdWxkIGhhdmUgZmFpbGVkIgotCi1ybSAtcmYgJHtDT1BZfSAke0NPUFl9LjEgJHtDT1BZfS4yICR7Q09QWX0uZGQKLQotCmRpZmYgLS1naXQgYS9yZWdyZXNzL3NmdHAtYmF0Y2guc2ggYi9yZWdyZXNzL3NmdHAtYmF0Y2guc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWVmMDcuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9zZnRwLWJhdGNoLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIwkkT3BlbkJTRDogc2Z0cC1iYXRjaC5zaCx2IDEuNCAyMDA5LzA4LzEzIDAxOjExOjU1IGRqbSBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0ic2Z0cCBiYXRjaGZpbGUiCi0KLURBVEE9L2Jpbi9scyR7RVhFRVhUfQotQ09QWT0ke09CSn0vY29weQotQkFUQ0g9JHtPQkp9L3NmdHAuYmIKLQotcm0gLXJmICR7Q09QWX0gJHtDT1BZfS4xICR7Q09QWX0uMiAke0NPUFl9LmRkICR7QkFUQ0h9LioKLQotY2F0IDw8IEVPRiA+ICR7QkFUQ0h9LnBhc3MuMQotCWdldCAkREFUQSAkQ09QWQotCXB1dCAke0NPUFl9ICR7Q09QWX0uMQotCXJtICR7Q09QWX0KLQktcHV0ICR7Q09QWX0gJHtDT1BZfS4yCi1FT0YKLQotY2F0IDw8IEVPRiA+ICR7QkFUQ0h9LnBhc3MuMgotCSMgVGhpcyBpcyBhIGNvbW1lbnQKLQotCSMgVGhhdCB3YXMgYSBibGFuayBsaW5lCi0JbHMKLUVPRgotCi1jYXQgPDwgRU9GID4gJHtCQVRDSH0uZmFpbC4xCi0JZ2V0ICREQVRBICRDT1BZCi0JcHV0ICR7Q09QWX0gJHtDT1BZfS4zCi0Jcm0gJHtDT1BZfS4qCi0JIyBUaGUgbmV4dCBjb21tYW5kIHNob3VsZCBmYWlsCi0JcHV0ICR7Q09QWX0uMyAke0NPUFl9LjQKLUVPRgotCi1jYXQgPDwgRU9GID4gJHtCQVRDSH0uZmFpbC4yCi0JIyBUaGUgbmV4dCBjb21tYW5kIHNob3VsZCBmYWlsCi0JamFqYWphamFqYQotRU9GCi0KLXZlcmJvc2UgIiR0aWQ6IGdvb2QgY29tbWFuZHMiCi0ke1NGVFB9IC1iICR7QkFUQ0h9LnBhc3MuMSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCi0JfHwgZmFpbCAiZ29vZCBjb21tYW5kcyBmYWlsZWQiCi0KLXZlcmJvc2UgIiR0aWQ6IGJhZCBjb21tYW5kcyIKLSR7U0ZUUH0gLWIgJHtCQVRDSH0uZmFpbC4xIC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLQkmJiBmYWlsICJiYWQgY29tbWFuZHMgc3VjY2VlZGVkIgotCi12ZXJib3NlICIkdGlkOiBjb21tZW50cyBhbmQgYmxhbmtzIgotJHtTRlRQfSAtYiAke0JBVENIfS5wYXNzLjIgLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAotCXx8IGZhaWwgImNvbW1lbnRzICYgYmxhbmtzIGZhaWxlZCIKLQotdmVyYm9zZSAiJHRpZDoganVuayBjb21tYW5kIgotJHtTRlRQfSAtYiAke0JBVENIfS5mYWlsLjIgLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAotCSYmIGZhaWwgImp1bmsgY29tbWFuZCBzdWNjZWVkZWQiCi0KLXJtIC1yZiAke0NPUFl9ICR7Q09QWX0uMSAke0NPUFl9LjIgJHtDT1BZfS5kZCAke0JBVENIfS4qCi0KLQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9zZnRwLWNtZHMuc2ggYi9yZWdyZXNzL3NmdHAtY21kcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM2N2I2NC4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL3NmdHAtY21kcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0jCSRPcGVuQlNEOiBzZnRwLWNtZHMuc2gsdiAxLjExIDIwMTAvMTIvMDQgMDA6MjE6MTkgZGptIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotIyBYWFggLSBUT0RPOiAKLSMgLSBjaG1vZCAvIGNob3duIC8gY2hncnAKLSMgLSAtcCBmbGFnIGZvciBnZXQgJiBwdXQKLQotdGlkPSJzZnRwIGNvbW1hbmRzIgotCi1EQVRBPS9iaW4vbHMke0VYRUVYVH0KLUNPUFk9JHtPQkp9L2NvcHkKLSMgdGVzdCB0aGF0IHRoZXNlIGZpbGVzIGFyZSByZWFkYWJsZSEKLWZvciBpIGluIGAoY2QgL2JpbjtlY2hvIGwqKWAKLWRvCi0JaWYgWyAtciAkaSBdOyB0aGVuCi0JCUdMT0JGSUxFUz0iJEdMT0JGSUxFUyAkaSIKLQlmaQotZG9uZQotCi1pZiBoYXZlX3Byb2cgdW5hbWUKLXRoZW4KLQljYXNlIGB1bmFtZWAgaW4KLQlDWUdXSU4qKQotCQlvcz1jeWd3aW4KLQkJOzsKLQkqKQotCQlvcz1gdW5hbWVgCi0JCTs7Ci0JZXNhYwotZWxzZQotCW9zPSJ1bmtub3duIgotZmkKLQotIyBQYXRoIHdpdGggZW1iZWRkZWQgcXVvdGUKLVFVT1RFQ09QWT0ke0NPUFl9Ii5cImJsYWhcIiIKLVFVT1RFQ09QWV9BUkc9JHtDT1BZfScuXCJibGFoXCInCi0jIEZpbGUgd2l0aCBzcGFjZXMKLVNQQUNFQ09QWT0iJHtDT1BZfSB0aGlzIGhhcyBzcGFjZXMudHh0IgotU1BBQ0VDT1BZX0FSRz0iJHtDT1BZfVwgdGhpc1wgaGFzXCBzcGFjZXMudHh0IgotIyBGaWxlIHdpdGggZ2xvYiBtZXRhY2hhcmFjdGVycwotR0xPQk1FVEFDT1BZPSIke0NPUFl9IFttZXRhY2hhcl0udHh0IgotCi1ybSAtcmYgJHtDT1BZfSAke0NPUFl9LjEgJHtDT1BZfS4yICR7Q09QWX0uZGQgJHtDT1BZfS5kZDIgJHtCQVRDSH0uKgotbWtkaXIgJHtDT1BZfS5kZAotCi12ZXJib3NlICIkdGlkOiBsbHMiCi0oZWNobyAibGNkICR7T0JKfSIgOyBlY2hvICJsbHMiKSB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSAyPiYxIHwgXAotCWdyZXAgY29weS5kZCA+L2Rldi9udWxsIDI+JjEgfHwgZmFpbCAibGxzIGZhaWxlZCIKLQotdmVyYm9zZSAiJHRpZDogbGxzIHcvcGF0aCIKLWVjaG8gImxscyAke09CSn0iIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9IDI+JjEgfCBcCi0JZ3JlcCBjb3B5LmRkID4vZGV2L251bGwgMj4mMSB8fCBmYWlsICJsbHMgdy9wYXRoIGZhaWxlZCIKLQotdmVyYm9zZSAiJHRpZDogbHMiCi1lY2hvICJscyAke09CSn0iIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCi0JfHwgZmFpbCAibHMgZmFpbGVkIgotIyBYWFggYWx3YXlzIHN1Y2Nlc3NmdWwKLQotdmVyYm9zZSAiJHRpZDogc2hlbGwiCi1lY2hvICIhZWNobyBoaSB0aGVyZSIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCBmYWlsICJzaGVsbCBmYWlsZWQiCi0jIFhYWCBhbHdheXMgc3VjY2Vzc2Z1bAotCi12ZXJib3NlICIkdGlkOiBwd2QiCi1lY2hvICJwd2QiIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCi0JfHwgZmFpbCAicHdkIGZhaWxlZCIKLSMgWFhYIGFsd2F5cyBzdWNjZXNzZnVsCi0KLXZlcmJvc2UgIiR0aWQ6IGxwd2QiCi1lY2hvICJscHdkIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAotCXx8IGZhaWwgImxwd2QgZmFpbGVkIgotIyBYWFggYWx3YXlzIHN1Y2Nlc3NmdWwKLQotdmVyYm9zZSAiJHRpZDogcXVpdCIKLWVjaG8gInF1aXQiIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCi0JfHwgZmFpbCAicXVpdCBmYWlsZWQiCi0jIFhYWCBhbHdheXMgc3VjY2Vzc2Z1bAotCi12ZXJib3NlICIkdGlkOiBoZWxwIgotZWNobyAiaGVscCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCBmYWlsICJoZWxwIGZhaWxlZCIKLSMgWFhYIGFsd2F5cyBzdWNjZXNzZnVsCi0KLXJtIC1mICR7Q09QWX0KLXZlcmJvc2UgIiR0aWQ6IGdldCIKLWVjaG8gImdldCAkREFUQSAkQ09QWSIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCBmYWlsICJnZXQgZmFpbGVkIgotY21wICREQVRBICR7Q09QWX0gfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgYWZ0ZXIgZ2V0IgotCi1ybSAtZiAke0NPUFl9Ci12ZXJib3NlICIkdGlkOiBnZXQgcXVvdGVkIgotZWNobyAiZ2V0IFwiJERBVEFcIiAkQ09QWSIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCBmYWlsICJnZXQgZmFpbGVkIgotY21wICREQVRBICR7Q09QWX0gfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgYWZ0ZXIgZ2V0IgotCi1pZiBbICIkb3MiICE9ICJjeWd3aW4iIF07IHRoZW4KLXJtIC1mICR7UVVPVEVDT1BZfQotY3AgJERBVEEgJHtRVU9URUNPUFl9Ci12ZXJib3NlICIkdGlkOiBnZXQgZmlsZW5hbWUgd2l0aCBxdW90ZXMiCi1lY2hvICJnZXQgXCIkUVVPVEVDT1BZX0FSR1wiICR7Q09QWX0iIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCi0JfHwgZmFpbCAiZ2V0IGZhaWxlZCIKLWNtcCAke0NPUFl9ICR7UVVPVEVDT1BZfSB8fCBmYWlsICJjb3JydXB0ZWQgY29weSBhZnRlciBnZXQgd2l0aCBxdW90ZXMiCi1ybSAtZiAke1FVT1RFQ09QWX0gJHtDT1BZfQotZmkKLQotcm0gLWYgIiRTUEFDRUNPUFkiICR7Q09QWX0KLWNwICREQVRBICIkU1BBQ0VDT1BZIgotdmVyYm9zZSAiJHRpZDogZ2V0IGZpbGVuYW1lIHdpdGggc3BhY2VzIgotZWNobyAiZ2V0ICR7U1BBQ0VDT1BZX0FSR30gJHtDT1BZfSIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLSAgICAgICAgfHwgZmFpbCAiZ2V0IGZhaWxlZCIKLWNtcCAke0NPUFl9ICIkU1BBQ0VDT1BZIiB8fCBmYWlsICJjb3JydXB0ZWQgY29weSBhZnRlciBnZXQgd2l0aCBzcGFjZXMiCi0KLXJtIC1mICIkR0xPQk1FVEFDT1BZIiAke0NPUFl9Ci1jcCAkREFUQSAiJEdMT0JNRVRBQ09QWSIKLXZlcmJvc2UgIiR0aWQ6IGdldCBmaWxlbmFtZSB3aXRoIGdsb2IgbWV0YWNoYXJhY3RlcnMiCi1lY2hvICJnZXQgXCIke0dMT0JNRVRBQ09QWX1cIiAke0NPUFl9IiB8IFwKLQkke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIHx8IGZhaWwgImdldCBmYWlsZWQiCi1jbXAgJHtDT1BZfSAiJEdMT0JNRVRBQ09QWSIgfHwgXAotCWZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIGdldCB3aXRoIGdsb2IgbWV0YWNoYXJhY3RlcnMiCi0KLXJtIC1mICR7Q09QWX0uZGQvKgotdmVyYm9zZSAiJHRpZDogZ2V0IHRvIGRpcmVjdG9yeSIKLWVjaG8gImdldCAkREFUQSAke0NPUFl9LmRkIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAotICAgICAgICB8fCBmYWlsICJnZXQgZmFpbGVkIgotY21wICREQVRBICR7Q09QWX0uZGQvYGJhc2VuYW1lICREQVRBYCB8fCBmYWlsICJjb3JydXB0ZWQgY29weSBhZnRlciBnZXQiCi0KLXJtIC1mICR7Q09QWX0uZGQvKgotdmVyYm9zZSAiJHRpZDogZ2xvYiBnZXQgdG8gZGlyZWN0b3J5IgotZWNobyAiZ2V0IC9iaW4vbCogJHtDT1BZfS5kZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLSAgICAgICAgfHwgZmFpbCAiZ2V0IGZhaWxlZCIKLWZvciB4IGluICRHTE9CRklMRVM7IGRvCi0gICAgICAgIGNtcCAvYmluLyR4ICR7Q09QWX0uZGQvJHggfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgYWZ0ZXIgZ2V0IgotZG9uZQotCi1ybSAtZiAke0NPUFl9LmRkLyoKLXZlcmJvc2UgIiR0aWQ6IGdldCB0byBsb2NhbCBkaXIiCi0oZWNobyAibGNkICR7Q09QWX0uZGQiOyBlY2hvICJnZXQgJERBVEEiICkgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLSAgICAgICAgfHwgZmFpbCAiZ2V0IGZhaWxlZCIKLWNtcCAkREFUQSAke0NPUFl9LmRkL2BiYXNlbmFtZSAkREFUQWAgfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgYWZ0ZXIgZ2V0IgotCi1ybSAtZiAke0NPUFl9LmRkLyoKLXZlcmJvc2UgIiR0aWQ6IGdsb2IgZ2V0IHRvIGxvY2FsIGRpciIKLShlY2hvICJsY2QgJHtDT1BZfS5kZCI7IGVjaG8gImdldCAvYmluL2wqIikgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLSAgICAgICAgfHwgZmFpbCAiZ2V0IGZhaWxlZCIKLWZvciB4IGluICRHTE9CRklMRVM7IGRvCi0gICAgICAgIGNtcCAvYmluLyR4ICR7Q09QWX0uZGQvJHggfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgYWZ0ZXIgZ2V0IgotZG9uZQotCi1ybSAtZiAke0NPUFl9Ci12ZXJib3NlICIkdGlkOiBwdXQiCi1lY2hvICJwdXQgJERBVEEgJENPUFkiIHwgXAotCSR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgfHwgZmFpbCAicHV0IGZhaWxlZCIKLWNtcCAkREFUQSAke0NPUFl9IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIHB1dCIKLQotaWYgWyAiJG9zIiAhPSAiY3lnd2luIiBdOyB0aGVuCi1ybSAtZiAke1FVT1RFQ09QWX0KLXZlcmJvc2UgIiR0aWQ6IHB1dCBmaWxlbmFtZSB3aXRoIHF1b3RlcyIKLWVjaG8gInB1dCAkREFUQSBcIiRRVU9URUNPUFlfQVJHXCIiIHwgXAotCSR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgfHwgZmFpbCAicHV0IGZhaWxlZCIKLWNtcCAkREFUQSAke1FVT1RFQ09QWX0gfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgYWZ0ZXIgcHV0IHdpdGggcXVvdGVzIgotZmkKLQotcm0gLWYgIiRTUEFDRUNPUFkiCi12ZXJib3NlICIkdGlkOiBwdXQgZmlsZW5hbWUgd2l0aCBzcGFjZXMiCi1lY2hvICJwdXQgJERBVEEgJHtTUEFDRUNPUFlfQVJHfSIgfCBcCi0JJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSB8fCBmYWlsICJwdXQgZmFpbGVkIgotY21wICREQVRBICIkU1BBQ0VDT1BZIiB8fCBmYWlsICJjb3JydXB0ZWQgY29weSBhZnRlciBwdXQgd2l0aCBzcGFjZXMiCi0KLXJtIC1mICR7Q09QWX0uZGQvKgotdmVyYm9zZSAiJHRpZDogcHV0IHRvIGRpcmVjdG9yeSIKLWVjaG8gInB1dCAkREFUQSAke0NPUFl9LmRkIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAotCXx8IGZhaWwgInB1dCBmYWlsZWQiCi1jbXAgJERBVEEgJHtDT1BZfS5kZC9gYmFzZW5hbWUgJERBVEFgIHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIHB1dCIKLQotcm0gLWYgJHtDT1BZfS5kZC8qCi12ZXJib3NlICIkdGlkOiBnbG9iIHB1dCB0byBkaXJlY3RvcnkiCi1lY2hvICJwdXQgL2Jpbi9sPyAke0NPUFl9LmRkIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAotCXx8IGZhaWwgInB1dCBmYWlsZWQiCi1mb3IgeCBpbiAkR0xPQkZJTEVTOyBkbwotCWNtcCAvYmluLyR4ICR7Q09QWX0uZGQvJHggfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgYWZ0ZXIgcHV0IgotZG9uZQotCi1ybSAtZiAke0NPUFl9LmRkLyoKLXZlcmJvc2UgIiR0aWQ6IHB1dCB0byBsb2NhbCBkaXIiCi0oZWNobyAiY2QgJHtDT1BZfS5kZCI7IGVjaG8gInB1dCAkREFUQSIpIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSBcCi0JfHwgZmFpbCAicHV0IGZhaWxlZCIKLWNtcCAkREFUQSAke0NPUFl9LmRkL2BiYXNlbmFtZSAkREFUQWAgfHwgZmFpbCAiY29ycnVwdGVkIGNvcHkgYWZ0ZXIgcHV0IgotCi1ybSAtZiAke0NPUFl9LmRkLyoKLXZlcmJvc2UgIiR0aWQ6IGdsb2IgcHV0IHRvIGxvY2FsIGRpciIKLShlY2hvICJjZCAke0NPUFl9LmRkIjsgZWNobyAicHV0IC9iaW4vbD8iKSB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAotCXx8IGZhaWwgInB1dCBmYWlsZWQiCi1mb3IgeCBpbiAkR0xPQkZJTEVTOyBkbwotICAgICAgICBjbXAgL2Jpbi8keCAke0NPUFl9LmRkLyR4IHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIHB1dCIKLWRvbmUKLQotdmVyYm9zZSAiJHRpZDogcmVuYW1lIgotZWNobyAicmVuYW1lICRDT1BZICR7Q09QWX0uMSIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCBmYWlsICJyZW5hbWUgZmFpbGVkIgotdGVzdCAtZiAke0NPUFl9LjEgfHwgZmFpbCAibWlzc2luZyBmaWxlIGFmdGVyIHJlbmFtZSIKLWNtcCAkREFUQSAke0NPUFl9LjEgPi9kZXYvbnVsbCAyPiYxIHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIHJlbmFtZSIKLQotdmVyYm9zZSAiJHRpZDogcmVuYW1lIGRpcmVjdG9yeSIKLWVjaG8gInJlbmFtZSAke0NPUFl9LmRkICR7Q09QWX0uZGQyIiB8IFwKLQkke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIHx8IFwKLQlmYWlsICJyZW5hbWUgZGlyZWN0b3J5IGZhaWxlZCIKLXRlc3QgLWQgJHtDT1BZfS5kZCAmJiBmYWlsICJvbGRuYW1lIGV4aXN0cyBhZnRlciByZW5hbWUgZGlyZWN0b3J5IgotdGVzdCAtZCAke0NPUFl9LmRkMiB8fCBmYWlsICJtaXNzaW5nIG5ld25hbWUgYWZ0ZXIgcmVuYW1lIGRpcmVjdG9yeSIKLQotdmVyYm9zZSAiJHRpZDogbG4iCi1lY2hvICJsbiAke0NPUFl9LjEgJHtDT1BZfS4yIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgfHwgZmFpbCAibG4gZmFpbGVkIgotdGVzdCAtZiAke0NPUFl9LjIgfHwgZmFpbCAibWlzc2luZyBmaWxlIGFmdGVyIGxuIgotY21wICR7Q09QWX0uMSAke0NPUFl9LjIgfHwgZmFpbCAiY3JlYXRlZCBmaWxlIGlzIG5vdCBlcXVhbCBhZnRlciBsbiIKLQotdmVyYm9zZSAiJHRpZDogbG4gLXMiCi1ybSAtZiAke0NPUFl9LjIKLWVjaG8gImxuIC1zICR7Q09QWX0uMSAke0NPUFl9LjIiIHwgJHtTRlRQfSAtRCAke1NGVFBTRVJWRVJ9ID4vZGV2L251bGwgMj4mMSB8fCBmYWlsICJsbiAtcyBmYWlsZWQiCi10ZXN0IC1oICR7Q09QWX0uMiB8fCBmYWlsICJtaXNzaW5nIGZpbGUgYWZ0ZXIgbG4gLXMiCi0KLXZlcmJvc2UgIiR0aWQ6IG1rZGlyIgotZWNobyAibWtkaXIgJHtDT1BZfS5kZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCBmYWlsICJta2RpciBmYWlsZWQiCi10ZXN0IC1kICR7Q09QWX0uZGQgfHwgZmFpbCAibWlzc2luZyBkaXJlY3RvcnkgYWZ0ZXIgbWtkaXIiCi0KLSMgWFhYIGRvIG1vcmUgaGVyZQotdmVyYm9zZSAiJHRpZDogY2hkaXIiCi1lY2hvICJjaGRpciAke0NPUFl9LmRkIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAotCXx8IGZhaWwgImNoZGlyIGZhaWxlZCIKLQotdmVyYm9zZSAiJHRpZDogcm1kaXIiCi1lY2hvICJybWRpciAke0NPUFl9LmRkIiB8ICR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSA+L2Rldi9udWxsIDI+JjEgXAotCXx8IGZhaWwgInJtZGlyIGZhaWxlZCIKLXRlc3QgLWQgJHtDT1BZfS4xICYmIGZhaWwgInByZXNlbnQgZGlyZWN0b3J5IGFmdGVyIHJtZGlyIgotCi12ZXJib3NlICIkdGlkOiBsbWtkaXIiCi1lY2hvICJsbWtkaXIgJHtDT1BZfS5kZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCBmYWlsICJsbWtkaXIgZmFpbGVkIgotdGVzdCAtZCAke0NPUFl9LmRkIHx8IGZhaWwgIm1pc3NpbmcgZGlyZWN0b3J5IGFmdGVyIGxta2RpciIKLQotIyBYWFggZG8gbW9yZSBoZXJlCi12ZXJib3NlICIkdGlkOiBsY2hkaXIiCi1lY2hvICJsY2hkaXIgJHtDT1BZfS5kZCIgfCAke1NGVFB9IC1EICR7U0ZUUFNFUlZFUn0gPi9kZXYvbnVsbCAyPiYxIFwKLQl8fCBmYWlsICJsY2hkaXIgZmFpbGVkIgotCi1ybSAtcmYgJHtDT1BZfSAke0NPUFl9LjEgJHtDT1BZfS4yICR7Q09QWX0uZGQgJHtDT1BZfS5kZDIgJHtCQVRDSH0uKgotcm0gLXJmICR7UVVPVEVDT1BZfSAiJFNQQUNFQ09QWSIgIiRHTE9CTUVUQUNPUFkiCi0KLQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9zZnRwLWdsb2Iuc2ggYi9yZWdyZXNzL3NmdHAtZ2xvYi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0ZGYyYy4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL3NmdHAtZ2xvYi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSMJJE9wZW5CU0Q6IHNmdHAtZ2xvYi5zaCx2IDEuNCAyMDA5LzA4LzEzIDAxOjExOjU1IGRqbSBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0ic2Z0cCBnbG9iIgotCi1jb25maWdfZGVmaW5lZCBGSUxFU1lTVEVNX05PX0JBQ0tTTEFTSCAmJiBub2JzPSJub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iCi0KLXNmdHBfbHMoKSB7Ci0JdGFyZ2V0PSQxCi0JZXJydGFnPSQyCi0JZXhwZWN0ZWQ9JDMKLQl1bmV4cGVjdGVkPSQ0Ci0Jc2tpcD0kNQotCWlmIHRlc3QgIngkc2tpcCIgIT0gIngiIDsgdGhlbgotCQl2ZXJib3NlICIkdGlkOiAkZXJydGFnIChza2lwcGVkOiAkc2tpcCkiCi0JCXJldHVybgotCWZpCi0JdmVyYm9zZSAiJHRpZDogJGVycnRhZyIKLQlwcmludGYgImxzIC1sICVzIiAiJHt0YXJnZXR9IiB8IFwKLQkJJHtTRlRQfSAtYiAtIC1EICR7U0ZUUFNFUlZFUn0gMj4vZGV2L251bGwgfCBcCi0JCWdyZXAgLXYgIl5zZnRwPiIgPiAke1JFU1VMVFN9Ci0JaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCWZhaWwgIiRlcnJ0YWcgZmFpbGVkIgotCWZpCi0JaWYgdGVzdCAieCRleHBlY3RlZCIgIT0gIngiIDsgdGhlbgotCSAgICBpZiBmZ3JlcCAiJGV4cGVjdGVkIiAke1JFU1VMVFN9ID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkJOgotCSAgICBlbHNlCi0JCWZhaWwgIiRleHBlY3RlZCBtaXNzaW5nIGZyb20gJGVycnRhZyByZXN1bHRzIgotCSAgICBmaQotCWZpCi0JaWYgdGVzdCAieCR1bmV4cGVjdGVkIiAhPSAieCIgJiYgXAotCSAgIGZncmVwICIkdW5leHBlY3RlZCIgJHtSRVNVTFRTfSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JCWZhaWwgIiR1bmV4cGVjdGVkIHByZXNlbnQgaW4gJGVycnRhZyByZXN1bHRzIgotCWZpCi0Jcm0gLWYgJHtSRVNVTFRTfQotfQotCi1CQVNFPSR7T0JKfS9nbG9iCi1SRVNVTFRTPSR7T0JKfS9yZXN1bHRzCi1ESVI9JHtCQVNFfS9kaXIKLURBVEE9JHtESVJ9L2ZpbGUKLQotR0xPQjE9IiR7RElSfS9nLXdpbGQqIgotR0xPQjI9IiR7RElSfS9nLXdpbGR4IgotUVVPVEU9IiR7RElSfS9nLXF1b3RlXCIiCi1TTEFTSD0iJHtESVJ9L2ctc2xcXGFzaCIKLUVTTEFTSD0iJHtESVJ9L2ctc2xhc2hcXCIKLVFTTEFTSD0iJHtESVJ9L2ctcXNcXFwiIgotU1BBQ0U9IiR7RElSfS9nLXEgc3BhY2UiCi0KLXJtIC1yZiAke0JBU0V9Ci1ta2RpciAtcCAke0RJUn0KLXRvdWNoICIke0RBVEF9IiAiJHtHTE9CMX0iICIke0dMT0IyfSIgIiR7UVVPVEV9IiAiJHtTUEFDRX0iCi10ZXN0ICJ4JG5vYnMiID0gIngiICYmIHRvdWNoICIke1FTTEFTSH0iICIke0VTTEFTSH0iICIke1NMQVNIfSIKLQotIyAgICAgICB0YXJnZXQgICAgICAgICAgICAgICAgICAgbWVzc2FnZSAgICAgICAgICAgICAgICBleHBlY3RlZCAgICAgdW5leHBlY3RlZAotc2Z0cF9scyAiJHtESVJ9L2ZpbCoiICAgICAgICAgICAgImZpbGUgZ2xvYiIgICAgICAgICAgICAiJHtEQVRBfSIgICAgIiIKLXNmdHBfbHMgIiR7QkFTRX0vZCoiICAgICAgICAgICAgICJkaXIgZ2xvYiIgICAgICAgICAgICAgImBiYXNlbmFtZSAke0RBVEF9YCIgIiIKLXNmdHBfbHMgIiR7RElSfS9nLXdpbGRcIipcIiIgICAgICJxdW90ZWQgZ2xvYiIgICAgICAgICAgImctd2lsZCoiICAgICJnLXdpbGR4Igotc2Z0cF9scyAiJHtESVJ9L2ctd2lsZFwqIiAgICAgICAgImVzY2FwZWQgZ2xvYiIgICAgICAgICAiZy13aWxkKiIgICAgImctd2lsZHgiCi1zZnRwX2xzICIke0RJUn0vZy1xdW90ZVxcXCIiICAgICAiZXNjYXBlZCBxdW90ZSIgICAgICAgICJnLXF1b3RlXCIiICAiIgotc2Z0cF9scyAiXCIke0RJUn0vZy1xdW90ZVxcXCJcIiIgInF1b3RlZCBxdW90ZSIgICAgICAgICAiZy1xdW90ZVwiIiAgIiIKLXNmdHBfbHMgIicke0RJUn0vZy1xdW90ZVwiJyIgICAgICJzaW5nbGUtcXVvdGVkIHF1b3RlIiAgImctcXVvdGVcIiIgICIiCi1zZnRwX2xzICIke0RJUn0vZy1xXFwgc3BhY2UiICAgICAiZXNjYXBlZCBzcGFjZSIgICAgICAgICJnLXEgc3BhY2UiICAiIgotc2Z0cF9scyAiJyR7RElSfS9nLXEgc3BhY2UnIiAgICAgInF1b3RlZCBzcGFjZSIgICAgICAgICAiZy1xIHNwYWNlIiAgIiIKLXNmdHBfbHMgIiR7RElSfS9nLXNsXFxcXGFzaCIgICAgICJlc2NhcGVkIHNsYXNoIiAgICAgICAgImctc2xcXGFzaCIgICIiICIkbm9icyIKLXNmdHBfbHMgIicke0RJUn0vZy1zbFxcXFxhc2gnIiAgICJxdW90ZWQgc2xhc2giICAgICAgICAgImctc2xcXGFzaCIgICIiICIkbm9icyIKLXNmdHBfbHMgIiR7RElSfS9nLXNsYXNoXFxcXCIgICAgICJlc2NhcGVkIHNsYXNoIGF0IEVPTCIgImctc2xhc2hcXCIgICIiICIkbm9icyIKLXNmdHBfbHMgIicke0RJUn0vZy1zbGFzaFxcXFwnIiAgICJxdW90ZWQgc2xhc2ggYXQgRU9MIiAgImctc2xhc2hcXCIgICIiICIkbm9icyIKLXNmdHBfbHMgIiR7RElSfS9nLXFzXFxcXFxcXCIiICAgICJlc2NhcGVkIHNsYXNoK3F1b3RlIiAgImctcXNcXFwiIiAgICIiICIkbm9icyIKLXNmdHBfbHMgIicke0RJUn0vZy1xc1xcXFxcIiciICAgICJxdW90ZWQgc2xhc2grcXVvdGUiICAgImctcXNcXFwiIiAgICIiICIkbm9icyIKLQotcm0gLXJmICR7QkFTRX0KLQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9zZnRwLnNoIGIvcmVncmVzcy9zZnRwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODRmYTZmLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3Mvc2Z0cC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMJJE9wZW5CU0Q6IHNmdHAuc2gsdiAxLjMgMjAwOS8wOC8xMyAwMToxMTo1NSBkam0gRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9ImJhc2ljIHNmdHAgcHV0L2dldCIKLQotREFUQT0vYmluL2xzJHtFWEVFWFR9Ci1DT1BZPSR7T0JKfS9jb3B5Ci0KLVNGVFBDTURGSUxFPSR7T0JKfS9iYXRjaAotY2F0ID4kU0ZUUENNREZJTEUgPDxFT0YKLXZlcnNpb24KLWdldCAkREFUQSAke0NPUFl9LjEKLXB1dCAkREFUQSAke0NPUFl9LjIKLUVPRgotCi1CVUZGRVJTSVpFPSI1IDEwMDAgMzIwMDAgNjQwMDAiCi1SRVFVRVNUUz0iMSAyIDEwIgotCi1mb3IgQiBpbiAke0JVRkZFUlNJWkV9OyBkbwotCWZvciBSIGluICR7UkVRVUVTVFN9OyBkbwotICAgICAgICAgICAgICAgIHZlcmJvc2UgInRlc3QgJHRpZDogYnVmZmVyX3NpemUgJEIgbnVtX3JlcXVlc3RzICRSIgotCQlybSAtZiAke0NPUFl9LjEgJHtDT1BZfS4yCi0JCSR7U0ZUUH0gLUQgJHtTRlRQU0VSVkVSfSAtQiAkQiAtUiAkUiAtYiAkU0ZUUENNREZJTEUgXAotCQk+IC9kZXYvbnVsbCAyPiYxCi0JCXI9JD8KLQkJaWYgWyAkciAtbmUgMCBdOyB0aGVuCi0JCQlmYWlsICJzZnRwIGZhaWxlZCB3aXRoICRyIgotCQllbHNlIAotCQkJY21wICREQVRBICR7Q09QWX0uMSB8fCBmYWlsICJjb3JydXB0ZWQgY29weSBhZnRlciBnZXQiCi0JCQljbXAgJERBVEEgJHtDT1BZfS4yIHx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IGFmdGVyIHB1dCIKLQkJZmkKLQlkb25lCi1kb25lCi1ybSAtZiAke0NPUFl9LjEgJHtDT1BZfS4yICAgICAgICAgICAgICAgIAotcm0gLWYgJFNGVFBDTURGSUxFCmRpZmYgLS1naXQgYS9yZWdyZXNzL3NzaC1jb20tY2xpZW50LnNoIGIvcmVncmVzcy9zc2gtY29tLWNsaWVudC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0YTBhNy4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL3NzaC1jb20tY2xpZW50LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLSMJJE9wZW5CU0Q6IHNzaC1jb20tY2xpZW50LnNoLHYgMS42IDIwMDQvMDIvMjQgMTc6MDY6NTIgbWFya3VzIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJjb25uZWN0IHdpdGggc3NoLmNvbSBjbGllbnQiCi0KLSNURVNUX0NPTUJBU0U9L3BhdGgvdG8vc3NoL2NvbS9iaW5hcmllcwotaWYgWyAiWCR7VEVTVF9DT01CQVNFfSIgPSAiWCIgXTsgdGhlbgotCWZhdGFsICckVEVTVF9DT01CQVNFIGlzIG5vdCBzZXQnCi1maQotCi1WRVJTSU9OUz0iCi0JMi4xLjAKLQkyLjIuMAotCTIuMy4wCi0JMi4zLjEKLQkyLjQuMAotCTMuMC4wCi0JMy4xLjAKLQkzLjIuMAotCTMuMi4yCi0JMy4yLjMKLQkzLjIuNQotCTMuMi45Ci0JMy4yLjkuMQotCTMuMy4wIgotCi0jIDIuMC4xMCAyLjAuMTIgMi4wLjEzIGRvbid0IGxpa2UgdGhlIHRlc3Qgc2V0dXAKLQotIyBzZXR1cCBhdXRob3JpemVkIGtleXMKLVNSQz1gZGlybmFtZSAke1NDUklQVH1gCi1jcCAke1NSQ30vZHNhX3NzaDIucHJ2ICR7T0JKfS9pZC5jb20KLWNobW9kIDYwMCAke09CSn0vaWQuY29tCi0ke1NTSEtFWUdFTn0gLWkgLWYgJHtPQkp9L2lkLmNvbQk+ICRPQkovaWQub3BlbnNzaAotY2htb2QgNjAwICR7T0JKfS9pZC5vcGVuc3NoCi0ke1NTSEtFWUdFTn0gLXkgLWYgJHtPQkp9L2lkLm9wZW5zc2gJPiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgotJHtTU0hLRVlHRU59IC1lIC1mICR7T0JKfS9pZC5vcGVuc3NoCT4gJE9CSi9pZC5jb20ucHViCi1lY2hvIElkS2V5ICR7T0JKfS9pZC5jb20gPiAke09CSn0vaWQubGlzdAotCi0jIHdlIG5lZWQgYSBEU0EgaG9zdCBrZXkKLXQ9ZHNhCi1ybSAtZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtPQkp9LyR0ICR7T0JKfS8kdC5wdWIKLSR7U1NIS0VZR0VOfSAtcSAtTiAnJyAtdCAkdCAtZgkgICR7T0JKfS8kdAotJFNVRE8gY3AgJE9CSi8kdCAkT0JKL2hvc3QuJHQKLWVjaG8gSG9zdEtleSAkT0JKL2hvc3QuJHQgPj4gJE9CSi9zc2hkX2NvbmZpZwotCi0jIGFkZCBob3N0a2V5cyB0byBrbm93biBob3N0cwotbWtkaXIgLXAgJHtPQkp9LyR7VVNFUn0vaG9zdGtleXMKLUhLPSR7T0JKfS8ke1VTRVJ9L2hvc3RrZXlzL2tleV8ke1BPUlR9XzEyNy4wLjAuMQotJHtTU0hLRVlHRU59IC1lIC1mICR7T0JKfS9yc2EucHViID4gJHtIS30uc3NoLXJzYS5wdWIKLSR7U1NIS0VZR0VOfSAtZSAtZiAke09CSn0vZHNhLnB1YiA+ICR7SEt9LnNzaC1kc3MucHViCi0KLWNhdCA+ICR7T0JKfS9zc2gyX2NvbmZpZyA8PCBFT0YKLSo6Ci0JUXVpZXRNb2RlCQkJeWVzCi0JU3RyaWN0SG9zdEtleUNoZWNraW5nCQl5ZXMKLQlQb3J0CQkJCSR7UE9SVH0KLQlVc2VyCQkJCSR7VVNFUn0KLQlIb3N0CQkJCTEyNy4wLjAuMQotCUlkZW50aXR5RmlsZQkJCSR7T0JKfS9pZC5saXN0Ci0JUmFuZG9tU2VlZEZpbGUJCQkke09CSn0vcmFuZG9tX3NlZWQKLSAgICAgICAgVXNlckNvbmZpZ0RpcmVjdG9yeSAgICAgICAgICAgICAke09CSn0vJVUKLQlBdXRoZW50aWNhdGlvblN1Y2Nlc3NNc2cJbm8KLQlCYXRjaE1vZGUJCQl5ZXMKLQlGb3J3YXJkWDExCQkJbm8KLUVPRgotCi0jIHdlIG5lZWQgYSByZWFsIHNlcnZlciAobm8gUHJveHlDb25uZWN0IG9wdGlvbikKLXN0YXJ0X3NzaGQKLQotREFUQT0vYmluL2xzJHtFWEVFWFR9Ci1DT1BZPSR7T0JKfS9jb3B5Ci1ybSAtZiAke0NPUFl9Ci0KLSMgZ28gZm9yIGl0Ci1mb3IgdiBpbiAke1ZFUlNJT05TfTsgZG8KLQlzc2gyPSR7VEVTVF9DT01CQVNFfS8ke3Z9L3NzaDIKLQlpZiBbICEgLXggJHtzc2gyfSBdOyB0aGVuCi0JCWNvbnRpbnVlCi0JZmkKLQl2ZXJib3NlICJzc2gyICR7dn0iCi0Ja2V5PXNzaC1kc3MKLQlza2lwY2F0PTAKLSAgICAgICAgY2FzZSAkdiBpbgotICAgICAgICAyLjEuKnwyLjMuMCkKLSAgICAgICAgICAgICAgICBza2lwY2F0PTEKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICAzLjAuKikKLSAgICAgICAgICAgICAgICBrZXk9c3NoLXJzYQotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLQljcCAke0hLfS4ka2V5LnB1YiAke0hLfS5wdWIKLQotCSMgY2hlY2sgZXhpdCBzdGF0dXMKLQkke3NzaDJ9IC1xIC1GICR7T0JKfS9zc2gyX2NvbmZpZyBzb21laG9zdCBleGl0IDQyCi0Jcj0kPwotICAgICAgICBpZiBbICRyIC1uZSA0MiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgZmFpbCAic3NoMiAke3Z9IGV4aXQgY29kZSB0ZXN0IGZhaWxlZCAoZ290ICRyLCBleHBlY3RlZCA0MikiCi0gICAgICAgIGZpCi0KLQkjIGRhdGEgdHJhbnNmZXIKLQlybSAtZiAke0NPUFl9Ci0JJHtzc2gyfSAtRiAke09CSn0vc3NoMl9jb25maWcgc29tZWhvc3QgY2F0ICR7REFUQX0gPiAke0NPUFl9Ci0gICAgICAgIGlmIFsgJD8gLW5lIDAgXTsgdGhlbgotICAgICAgICAgICAgICAgIGZhaWwgInNzaDIgJHt2fSBjYXQgdGVzdCAocmVjZWl2ZSkgZmFpbGVkIgotICAgICAgICBmaQotCWNtcCAke0RBVEF9ICR7Q09QWX0JfHwgZmFpbCAic3NoMiAke3Z9IGNhdCB0ZXN0IChyZWNlaXZlKSBkYXRhIG1pc21hdGNoIgotCi0JIyBkYXRhIHRyYW5zZmVyLCBhZ2FpbgotCWlmIFsgJHNraXBjYXQgLWVxIDAgXTsgdGhlbgotCQlybSAtZiAke0NPUFl9Ci0JCWNhdCAke0RBVEF9IHwgXAotCQkJJHtzc2gyfSAtRiAke09CSn0vc3NoMl9jb25maWcgaG9zdCAiY2F0ID4gJHtDT1BZfSIKLQkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCQlmYWlsICJzc2gyICR7dn0gY2F0IHRlc3QgKHNlbmQpIGZhaWxlZCIKLQkJZmkKLQkJY21wICR7REFUQX0gJHtDT1BZfQl8fCBcCi0JCQlmYWlsICJzc2gyICR7dn0gY2F0IHRlc3QgKHNlbmQpIGRhdGEgbWlzbWF0Y2giCi0JZmkKLQotCSMgbm8gc3RkZXJyIGFmdGVyIGVvZgotCXJtIC1mICR7Q09QWX0KLQkke3NzaDJ9IC1GICR7T0JKfS9zc2gyX2NvbmZpZyBzb21laG9zdCBcCi0JCWV4ZWMgc2ggLWMgXCciZXhlYyA+IC9kZXYvbnVsbDsgc2xlZXAgMTsgZWNobyBibGEgMT4mMjsgZXhpdCAwIlwnIFwKLQkJMj4gL2Rldi9udWxsCi0gICAgICAgIGlmIFsgJD8gLW5lIDAgXTsgdGhlbgotICAgICAgICAgICAgICAgIGZhaWwgInNzaDIgJHt2fSBzdGRlcnIgdGVzdCBmYWlsZWQiCi0gICAgICAgIGZpCi1kb25lCi0KLXJtIC1yZiAke09CSn0vJHtVU0VSfQotZm9yIGkgaW4gc3NoMl9jb25maWcgcmFuZG9tX3NlZWQgZHNhLnB1YiBkc2EgaG9zdC5kc2EgXAotICAgIGlkLmxpc3QgaWQuY29tIGlkLmNvbS5wdWIgaWQub3BlbnNzaDsgZG8KLQlybSAtZiAke09CSn0vJGkKLWRvbmUKZGlmZiAtLWdpdCBhL3JlZ3Jlc3Mvc3NoLWNvbS1rZXlnZW4uc2ggYi9yZWdyZXNzL3NzaC1jb20ta2V5Z2VuLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWIwMmQ5Li4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3Mvc3NoLWNvbS1rZXlnZW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jCSRPcGVuQlNEOiBzc2gtY29tLWtleWdlbi5zaCx2IDEuNCAyMDA0LzAyLzI0IDE3OjA2OjUyIG1hcmt1cyBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0ic3NoLmNvbSBrZXkgaW1wb3J0IgotCi0jVEVTVF9DT01CQVNFPS9wYXRoL3RvL3NzaC9jb20vYmluYXJpZXMKLWlmIFsgIlgke1RFU1RfQ09NQkFTRX0iID0gIlgiIF07IHRoZW4KLQlmYXRhbCAnJFRFU1RfQ09NQkFTRSBpcyBub3Qgc2V0JwotZmkKLQotVkVSU0lPTlM9IgotCTIuMC4xMAotCTIuMC4xMgotCTIuMC4xMwotCTIuMS4wCi0JMi4yLjAKLQkyLjMuMAotCTIuMy4xCi0JMi40LjAKLQkzLjAuMAotCTMuMS4wCi0JMy4yLjAKLQkzLjIuMgotCTMuMi4zCi0JMy4yLjUKLQkzLjIuOQotCTMuMi45LjEKLQkzLjMuMCIKLQotQ09NUFJWPSR7T0JKfS9jb21rZXkKLUNPTVBVQj0ke0NPTVBSVn0ucHViCi1PUEVOU1NIUFJWPSR7T0JKfS9vcGVuc3Noa2V5Ci1PUEVOU1NIUFVCPSR7T1BFTlNTSFBSVn0ucHViCi0KLSMgZ28gZm9yIGl0Ci1mb3IgdiBpbiAke1ZFUlNJT05TfTsgZG8KLQlrZXlnZW49JHtURVNUX0NPTUJBU0V9LyR7dn0vc3NoLWtleWdlbjIKLQlpZiBbICEgLXggJHtrZXlnZW59IF07IHRoZW4KLQkJY29udGludWUKLQlmaQotCXR5cGVzPSJkc3MiCi0gICAgICAgIGNhc2UgJHYgaW4KLSAgICAgICAgMi4zLjF8My4qKQotICAgICAgICAgICAgICAgIHR5cGVzPSIkdHlwZXMgcnNhIgotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLQlmb3IgdCBpbiAkdHlwZXM7IGRvCi0JCXZlcmJvc2UgInNzaC1rZXlnZW4gJHYvJHQiCi0JCXJtIC1mICRDT01QUlYgJENPTVBVQiAkT1BFTlNTSFBSViAkT1BFTlNTSFBVQgotCQkke2tleWdlbn0gLXEgLVAgLXQgJHQgJHtDT01QUlZ9ID4gL2Rldi9udWxsIDI+JjEKLQkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCQlmYWlsICIke2tleWdlbn0gLXQgJHQgZmFpbGVkIgotCQkJY29udGludWUKLQkJZmkKLQkJJHtTU0hLRVlHRU59IC1pZiAke0NPTVBVQn0gPiAke09QRU5TU0hQVUJ9Ci0JCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQkJZmFpbCAiaW1wb3J0IHB1YmxpYyBrZXkgKCR2LyR0KSBmYWlsZWQiCi0JCQljb250aW51ZQotCQlmaQotCQkke1NTSEtFWUdFTn0gLWlmICR7Q09NUFJWfSA+ICR7T1BFTlNTSFBSVn0KLQkJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCQlmYWlsICJpbXBvcnQgcHJpdmF0ZSBrZXkgKCR2LyR0KSBmYWlsZWQiCi0JCQljb250aW51ZQotCQlmaQotCQljaG1vZCA2MDAgJHtPUEVOU1NIUFJWfQotCQkke1NTSEtFWUdFTn0gLXlmICR7T1BFTlNTSFBSVn0gfFwKLQkJCWRpZmYgLSAke09QRU5TU0hQVUJ9Ci0JCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQkJZmFpbCAicHVibGljIGtleXMgKCR2LyR0KSBkaWZmZXIiCi0JCWZpCi0JZG9uZQotZG9uZQotCi1ybSAtZiAkQ09NUFJWICRDT01QVUIgJE9QRU5TU0hQUlYgJE9QRU5TU0hQVUIKZGlmZiAtLWdpdCBhL3JlZ3Jlc3Mvc3NoLWNvbS1zZnRwLnNoIGIvcmVncmVzcy9zc2gtY29tLXNmdHAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNmY0ZTAuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy9zc2gtY29tLXNmdHAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jCSRPcGVuQlNEOiBzc2gtY29tLXNmdHAuc2gsdiAxLjYgMjAwOS8wOC8yMCAxODo0MzowNyBkam0gRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9ImJhc2ljIHNmdHAgcHV0L2dldCB3aXRoIHNzaC5jb20gc2VydmVyIgotCi1EQVRBPS9iaW4vbHMke0VYRUVYVH0KLUNPUFk9JHtPQkp9L2NvcHkKLVNGVFBDTURGSUxFPSR7T0JKfS9iYXRjaAotCi1jYXQgPiRTRlRQQ01ERklMRSA8PEVPRgotdmVyc2lvbgotZ2V0ICREQVRBICR7Q09QWX0uMQotcHV0ICREQVRBICR7Q09QWX0uMgotRU9GCi0KLUJVRkZFUlNJWkU9IjUgMTAwMCAzMjAwMCA2NDAwMCIKLVJFUVVFU1RTPSIxIDIgMTAiCi0KLSNURVNUX0NPTUJBU0U9L3BhdGgvdG8vc3NoL2NvbS9iaW5hcmllcwotaWYgWyAiWCR7VEVTVF9DT01CQVNFfSIgPSAiWCIgXTsgdGhlbgotCWZhdGFsICckVEVTVF9DT01CQVNFIGlzIG5vdCBzZXQnCi1maQotCi1WRVJTSU9OUz0iCi0JMi4wLjEwCi0JMi4wLjEyCi0JMi4wLjEzCi0JMi4xLjAKLQkyLjIuMAotCTIuMy4wCi0JMi4zLjEKLQkyLjQuMAotCTMuMC4wCi0JMy4xLjAKLQkzLjIuMAotCTMuMi4yCi0JMy4yLjMKLQkzLjIuNQotCTMuMi45Ci0JMy4yLjkuMQotCTMuMy4wIgotCi0jIGdvIGZvciBpdAotZm9yIHYgaW4gJHtWRVJTSU9OU307IGRvCi0Jc2VydmVyPSR7VEVTVF9DT01CQVNFfS8ke3Z9L3NmdHAtc2VydmVyMgotCWlmIFsgISAteCAke3NlcnZlcn0gXTsgdGhlbgotCQljb250aW51ZQotCWZpCi0JdmVyYm9zZSAic2Z0cC1zZXJ2ZXIgJHYiCi0JZm9yIEIgaW4gJHtCVUZGRVJTSVpFfTsgZG8KLQkJZm9yIFIgaW4gJHtSRVFVRVNUU307IGRvCi0JCQl2ZXJib3NlICJ0ZXN0ICR0aWQ6IGJ1ZmZlcl9zaXplICRCIG51bV9yZXF1ZXN0cyAkUiIKLQkJCXJtIC1mICR7Q09QWX0uMSAke0NPUFl9LjIKLQkJCSR7U0ZUUH0gLUQgJHtzZXJ2ZXJ9IC1CICRCIC1SICRSIC1iICRTRlRQQ01ERklMRSBcCi0JCQk+IC9kZXYvbnVsbCAyPiYxCi0JCQlyPSQ/Ci0JCQlpZiBbICRyIC1uZSAwIF07IHRoZW4KLQkJCQlmYWlsICJzZnRwIGZhaWxlZCB3aXRoICRyIgotCQkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJY21wICREQVRBICR7Q09QWX0uMSB8fCBmYWlsICJjb3JydXB0ZWQgY29weSBhZnRlciBnZXQiCi0JCQkJY21wICREQVRBICR7Q09QWX0uMiB8fCBmYWlsICJjb3JydXB0ZWQgY29weSBhZnRlciBwdXQiCi0JCQlmaQotCQlkb25lCi0JZG9uZQotZG9uZQotcm0gLWYgJHtDT1BZfS4xICR7Q09QWX0uMiAgICAgICAgICAgICAgICAKLXJtIC1mICRTRlRQQ01ERklMRQpkaWZmIC0tZ2l0IGEvcmVncmVzcy9zc2gtY29tLnNoIGIvcmVncmVzcy9zc2gtY29tLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmNkODViLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3Mvc3NoLWNvbS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0jCSRPcGVuQlNEOiBzc2gtY29tLnNoLHYgMS43IDIwMDQvMDIvMjQgMTc6MDY6NTIgbWFya3VzIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJjb25uZWN0IHRvIHNzaC5jb20gc2VydmVyIgotCi0jVEVTVF9DT01CQVNFPS9wYXRoL3RvL3NzaC9jb20vYmluYXJpZXMKLWlmIFsgIlgke1RFU1RfQ09NQkFTRX0iID0gIlgiIF07IHRoZW4KLQlmYXRhbCAnJFRFU1RfQ09NQkFTRSBpcyBub3Qgc2V0JwotZmkKLQotVkVSU0lPTlM9IgotCTIuMC4xMgotCTIuMC4xMwotCTIuMS4wCi0JMi4yLjAKLQkyLjMuMAotCTIuNC4wCi0JMy4wLjAKLQkzLjEuMAotCTMuMi4wCi0JMy4yLjIKLQkzLjIuMwotCTMuMi41Ci0JMy4yLjkKLQkzLjIuOS4xCi0JMy4zLjAiCi0jIDIuMC4xMCBkb2VzIG5vdCBzdXBwb3J0IFVzZXJDb25maWdEaXJlY3RvcnkKLSMgMi4zLjEgcmVxdWlyZXMgYSBjb25maWcgaW4gJEhPTUUvLnNzaDIKLQotU1JDPWBkaXJuYW1lICR7U0NSSVBUfWAKLQotIyBzc2guY29tCi1jYXQgPDwgRU9GID4gJE9CSi9zc2hkMl9jb25maWcKLSMqOgotCSMgUG9ydCBhbmQgTGlzdGVuQWRkcmVzcyBhcmUgbm90IHVzZWQuCi0JUXVpZXRNb2RlCQkJeWVzCi0JUG9ydAkJCQk0MzQzCi0JTGlzdGVuQWRkcmVzcwkJCTEyNy4wLjAuMQotCVVzZXJDb25maWdEaXJlY3RvcnkJCSR7T0JKfS8lVQotCUNpcGhlcnMJCQkJQW55Q2lwaGVyCi0JUHViS2V5QXV0aGVudGljYXRpb24JCXllcwotCSNBbGxvd2VkQXV0aGVudGljYXRpb25zCQlwdWJsaWNrZXkKLQlBdXRob3JpemF0aW9uRmlsZQkJYXV0aG9yaXphdGlvbgotCUhvc3RLZXlGaWxlCQkJJHtTUkN9L2RzYV9zc2gyLnBydgotCVB1YmxpY0hvc3RLZXlGaWxlCQkke1NSQ30vZHNhX3NzaDIucHViCi0JUmFuZG9tU2VlZEZpbGUJCQkke09CSn0vcmFuZG9tX3NlZWQKLQlNYXhDb25uZWN0aW9ucwkJCTAgCi0JUGVybWl0Um9vdExvZ2luCQkJeWVzCi0JVmVyYm9zZU1vZGUJCQlubwotCUNoZWNrTWFpbAkJCW5vCi0JU3NoMUNvbXBhdGliaWxpdHkJCW5vCi1FT0YKLQotIyBjcmVhdGUgY2xpZW50IGNvbmZpZyAKLXNlZCAicy9Ib3N0S2V5QWxpYXMuKi9Ib3N0S2V5QWxpYXMgc3NoMi1sb2NhbGhvc3Qtd2l0aC1hbGlhcy8iIFwKLQk8ICRPQkovc3NoX2NvbmZpZyA+ICRPQkovc3NoX2NvbmZpZ19jb20KLQotIyB3ZSBuZWVkIGEgRFNBIGtleSBmb3IKLXJtIC1mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke09CSn0vZHNhICR7T0JKfS9kc2EucHViCi0ke1NTSEtFWUdFTn0gLXEgLU4gJycgLXQgZHNhIC1mCSAgJHtPQkp9L2RzYQotCi0jIHNldHVwIHVzZXJkaXIsIHRyeSByc2EgZmlyc3QKLW1rZGlyIC1wICR7T0JKfS8ke1VTRVJ9Ci1jcCAvZGV2L251bGwgJHtPQkp9LyR7VVNFUn0vYXV0aG9yaXphdGlvbgotZm9yIHQgaW4gcnNhIGRzYTsgZG8KLQkke1NTSEtFWUdFTn0gLWUgLWYgJHtPQkp9LyR0LnB1Ygk+ICAke09CSn0vJHtVU0VSfS8kdC5jb20KLQllY2hvIEtleSAkdC5jb20JCQk+PiAke09CSn0vJHtVU0VSfS9hdXRob3JpemF0aW9uCi0JZWNobyBJZGVudGl0eUZpbGUgJHtPQkp9LyR0CT4+ICR7T0JKfS9zc2hfY29uZmlnX2NvbQotZG9uZQotCi0jIGNvbnZlcnQgYW5kIGFwcGVuZCBEU0EgaG9zdGtleQotKAotCWVjaG9uICdzc2gyLWxvY2FsaG9zdC13aXRoLWFsaWFzLDEyNy4wLjAuMSw6OjEgJwotCSR7U1NIS0VZR0VOfSAtaWYgJHtTUkN9L2RzYV9zc2gyLnB1YgotKSA+PiAkT0JKL2tub3duX2hvc3RzCi0KLSMgZ28gZm9yIGl0Ci1mb3IgdiBpbiAke1ZFUlNJT05TfTsgZG8KLQlzc2hkMj0ke1RFU1RfQ09NQkFTRX0vJHt2fS9zc2hkMgotCWlmIFsgISAteCAke3NzaGQyfSBdOyB0aGVuCi0JCWNvbnRpbnVlCi0JZmkKLQl0cmFjZSAic3NoZDIgJHt2fSIKLQlQUk9YWT0icHJveHljb21tYW5kICR7c3NoZDJ9IC1xaWYgJHtPQkp9L3NzaGQyX2NvbmZpZyAyPiAvZGV2L251bGwiCi0JJHtTU0h9IC1xRiAke09CSn0vc3NoX2NvbmZpZ19jb20gLW8gIiR7UFJPWFl9IiBkdW1teSBleGl0IDAKLSAgICAgICAgaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0gICAgICAgICAgICAgICAgZmFpbCAic3NoIGNvbm5lY3QgdG8gc3NoZDIgJHt2fSBmYWlsZWQiCi0gICAgICAgIGZpCi0KLQljaXBoZXJzPSIzZGVzLWNiYyBibG93ZmlzaC1jYmMgYXJjZm91ciIKLQltYWNzPSJobWFjLW1kNSIKLQljYXNlICR2IGluCi0JMi40LiopCi0JCWNpcGhlcnM9IiRjaXBoZXJzIGNhc3QxMjgtY2JjIgotCQltYWNzPSIkbWFjcyBobWFjLXNoYTEgaG1hYy1zaGExLTk2IGhtYWMtbWQ1LTk2IgotCQk7OwotCTMuKikKLQkJY2lwaGVycz0iJGNpcGhlcnMgYWVzMTI4LWNiYyBjYXN0MTI4LWNiYyIKLQkJbWFjcz0iJG1hY3MgaG1hYy1zaGExIGhtYWMtc2hhMS05NiBobWFjLW1kNS05NiIKLQkJOzsKLQllc2FjCi0JI2NpcGhlcnM9IjNkZXMtY2JjIgotCWZvciBtIGluICRtYWNzOyBkbwotCWZvciBjIGluICRjaXBoZXJzOyBkbwotCQl0cmFjZSAic3NoZDIgJHt2fSBjaXBoZXIgJGMgbWFjICRtIgotCQl2ZXJib3NlICJ0ZXN0ICR7dGlkfTogc3NoZDIgJHt2fSBjaXBoZXIgJGMgbWFjICRtIgotCQkke1NTSH0gLWMgJGMgLW0gJG0gLXFGICR7T0JKfS9zc2hfY29uZmlnX2NvbSAtbyAiJHtQUk9YWX0iIGR1bW15IGV4aXQgMAotCQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KLQkJCWZhaWwgInNzaCBjb25uZWN0IHRvIHNzaGQyICR7dn0gd2l0aCAkYy8kbSBmYWlsZWQiCi0JCWZpCi0JZG9uZQotCWRvbmUKLWRvbmUKLQotcm0gLXJmICR7T0JKfS8ke1VTRVJ9Ci1mb3IgaSBpbiBzc2hkX2NvbmZpZ19wcm94eSBzc2hfY29uZmlnX3Byb3h5IHJhbmRvbV9zZWVkIFwKLQlzc2hkMl9jb25maWcgZHNhLnB1YiBkc2Egc3NoX2NvbmZpZ19jb207IGRvCi0Jcm0gLWYgJHtPQkp9LyRpCi1kb25lCmRpZmYgLS1naXQgYS9yZWdyZXNzL3NzaDJwdXR0eS5zaCBiL3JlZ3Jlc3Mvc3NoMnB1dHR5LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OTFkYjE2Li4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3Mvc3NoMnB1dHR5LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyEvYmluL3NoCi0jCSRPcGVuQlNEOiBzc2gycHV0dHkuc2gsdiAxLjIgMjAwOS8xMC8wNiAyMzo1MTo0OSBkdHVja2VyIEV4cCAkCi0KLWlmIHRlc3QgIngkMSIgPSAieCIgLW8gIngkMiIgPSAieCIgLW8gIngkMyIgPSAieCIgOyB0aGVuCi0JZWNobyAiVXNhZ2U6IHNzaDJwdXR0eSBob3N0bmFtZSBwb3J0IHNzaC1wcml2YXRlLWtleSIKLQlleGl0IDEKLWZpCi0KLUhPU1Q9JDEKLVBPUlQ9JDIKLUtFWUZJTEU9JDMKLQotIyBYWFggLSBzdXBwb3J0IERTQSBrZXlzIHRvbwotaWYgZ3JlcCAiQkVHSU4gUlNBIFBSSVZBVEUgS0VZIiAkS0VZRklMRSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JOgotZWxzZQotCWVjaG8gIlVuc3VwcG9ydGVkIHByaXZhdGUga2V5IGZvcm1hdCIKLQlleGl0IDEKLWZpCi0KLXB1YmxpY19leHBvbmVudD1gCi0Jb3BlbnNzbCByc2EgLW5vb3V0IC10ZXh0IC1pbiAkS0VZRklMRSB8IGdyZXAgXnB1YmxpY0V4cG9uZW50IHwgCi0Jc2VkICdzLy4qKC8vO3MvKS4qLy8nCi1gCi10ZXN0ICQ/IC1uZSAwICYmIGV4aXQgMQotCi1tb2R1bHVzPWAKLQlvcGVuc3NsIHJzYSAtbm9vdXQgLW1vZHVsdXMgLWluICRLRVlGSUxFIHwgZ3JlcCBeTW9kdWx1cz0gfCAKLQlzZWQgJ3MvXk1vZHVsdXM9LzB4LycgfCB0ciBBLVogYS16Ci1gCi10ZXN0ICQ/IC1uZSAwICYmIGV4aXQgMQotCi1lY2hvICJyc2EyQCRQT1JUOiRIT1NUICRwdWJsaWNfZXhwb25lbnQsJG1vZHVsdXMiCi0KZGlmZiAtLWdpdCBhL3JlZ3Jlc3Mvc3NoZC1sb2ctd3JhcHBlci5zaCBiL3JlZ3Jlc3Mvc3NoZC1sb2ctd3JhcHBlci5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhNWVmMy4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL3NzaGQtbG9nLXdyYXBwZXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIS9iaW4vc2gKLSMgICAgICAgJE9wZW5CU0Q6IHNzaGQtbG9nLXdyYXBwZXIuc2gsdiAxLjIgMjAwNS8wMi8yNyAxMTo0MDozMCBkdHVja2VyIEV4cCAkCi0jICAgICAgIFBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLSMKLSMgc2ltcGxlIHdyYXBwZXIgZm9yIHNzaGQgcHJveHkgbW9kZSB0byBjYXRjaCBzdGRlcnIgb3V0cHV0Ci0jIHNoIHNzaGQtbG9nLXdyYXBwZXIuc2ggL3BhdGgvdG8vc3NoZCAvcGF0aC90by9sb2dmaWxlCi0KLXNzaGQ9JDEKLWxvZz0kMgotc2hpZnQKLXNoaWZ0Ci0KLWV4ZWMgJHNzaGQgJEAgLWUgMj4+JGxvZwpkaWZmIC0tZ2l0IGEvcmVncmVzcy9zdGRlcnItYWZ0ZXItZW9mLnNoIGIvcmVncmVzcy9zdGRlcnItYWZ0ZXItZW9mLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWE1ZWE1Li4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3Mvc3RkZXJyLWFmdGVyLWVvZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMJJE9wZW5CU0Q6IHN0ZGVyci1hZnRlci1lb2Yuc2gsdiAxLjEgMjAwMi8wMy8yMyAxNjozODowOSBtYXJrdXMgRXhwICQKLSMJUGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLgotCi10aWQ9InN0ZGVyciBkYXRhIGFmdGVyIGVvZiIKLQotREFUQT0vZXRjL21vdGQKLURBVEE9JHtPQkp9L2RhdGEKLUNPUFk9JHtPQkp9L2NvcHkKLQotaWYgaGF2ZV9wcm9nIG1kNXN1bTsgdGhlbgotCUNIRUNLU1VNPW1kNXN1bQotZWxpZiBoYXZlX3Byb2cgb3BlbnNzbDsgdGhlbgotCUNIRUNLU1VNPSJvcGVuc3NsIG1kNSIKLWVsaWYgaGF2ZV9wcm9nIGNrc3VtOyB0aGVuCi0JQ0hFQ0tTVU09Y2tzdW0KLWVsaWYgaGF2ZV9wcm9nIHN1bTsgdGhlbgotCUNIRUNLU1VNPXN1bQotZWxzZQotCWZhdGFsICJObyBjaGVja3N1bSBwcm9ncmFtIGF2YWlsYWJsZSwgYWJvcnRpbmcgJHRpZCB0ZXN0IgotZmkKLQotIyBzZXR1cCBkYXRhCi1ybSAtZiAke0RBVEF9ICR7Q09QWX0KLWNwIC9kZXYvbnVsbCAke0RBVEF9Ci1mb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KLQkoZGF0ZTtlY2hvICRpKSB8ICRDSEVDS1NVTSA+PiAke0RBVEF9Ci1kb25lCi0KLSR7U1NIfSAtMiAtRiAkT0JKL3NzaF9wcm94eSBvdGhlcmhvc3QgXAotCWV4ZWMgc2ggLWMgXCciZXhlYyA+IC9kZXYvbnVsbDsgc2xlZXAgMjsgY2F0ICR7REFUQX0gMT4mMiAkcyJcJyBcCi0JMj4gJHtDT1BZfQotcj0kPwotaWYgWyAkciAtbmUgMCBdOyB0aGVuCi0JZmFpbCAic3NoIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAkciIKLWZpCi1lZ3JlcCAnRGlzY29ubmVjdGluZzogUmVjZWl2ZWQgZXh0ZW5kZWRfZGF0YSBhZnRlciBFT0YnICR7Q09QWX0gJiYKLQlmYWlsICJleHQgZGF0YSByZWNlaXZlZCBhZnRlciBlb2YiCi1jbXAgJHtEQVRBfSAke0NPUFl9CXx8IGZhaWwgInN0ZGVyciBjb3JydXB0IgotCi1ybSAtZiAke0RBVEF9ICR7Q09QWX0KZGlmZiAtLWdpdCBhL3JlZ3Jlc3Mvc3RkZXJyLWRhdGEuc2ggYi9yZWdyZXNzL3N0ZGVyci1kYXRhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGFmNzliLi4wMDAwMDAwCi0tLSBhL3JlZ3Jlc3Mvc3RkZXJyLWRhdGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jCSRPcGVuQlNEOiBzdGRlcnItZGF0YS5zaCx2IDEuMiAyMDAyLzAzLzI3IDIyOjM5OjUyIG1hcmt1cyBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLXRpZD0ic3RkZXJyIGRhdGEgdHJhbnNmZXIiCi0KLURBVEE9L2Jpbi9scyR7RVhFRVhUfQotQ09QWT0ke09CSn0vY29weQotcm0gLWYgJHtDT1BZfQotCi1mb3IgbiBpbiAnJyAtbjsgZG8KLWZvciBwIGluIDEgMjsgZG8KLQl2ZXJib3NlICJ0ZXN0ICR0aWQ6IHByb3RvICRwICgkbikiCi0JJHtTU0h9ICRuIC0kcCAtRiAkT0JKL3NzaF9wcm94eSBvdGhlcmhvc3QgXAotCQlleGVjIHNoIC1jIFwnImV4ZWMgPiAvZGV2L251bGw7IHNsZWVwIDM7IGNhdCAke0RBVEF9IDE+JjIgJHMiXCcgXAotCQkyPiAke0NPUFl9Ci0Jcj0kPwotCWlmIFsgJHIgLW5lIDAgXTsgdGhlbgotCQlmYWlsICJzc2ggZmFpbGVkIHdpdGggZXhpdCBjb2RlICRyIgotCWZpCi0JY21wICR7REFUQX0gJHtDT1BZfQl8fCBmYWlsICJzdGRlcnIgY29ycnVwdCIKLQlybSAtZiAke0NPUFl9Ci0KLQkke1NTSH0gJG4gLSRwIC1GICRPQkovc3NoX3Byb3h5IG90aGVyaG9zdCBcCi0JCWV4ZWMgc2ggLWMgXCciZWNobyBhOyBleGVjID4gL2Rldi9udWxsOyBzbGVlcCAzOyBjYXQgJHtEQVRBfSAxPiYyICRzIlwnIFwKLQkJPiAvZGV2L251bGwgMj4gJHtDT1BZfQotCXI9JD8KLQlpZiBbICRyIC1uZSAwIF07IHRoZW4KLQkJZmFpbCAic3NoIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAkciIKLQlmaQotCWNtcCAke0RBVEF9ICR7Q09QWX0JfHwgZmFpbCAic3RkZXJyIGNvcnJ1cHQiCi0Jcm0gLWYgJHtDT1BZfQotZG9uZQotZG9uZQpkaWZmIC0tZ2l0IGEvcmVncmVzcy90NC5vayBiL3JlZ3Jlc3MvdDQub2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDk0MmIuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy90NC5vaworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTNiOmRkOjQ0OmU5OjQ5OjE4Ojg0Ojk1OmYxOmU3OjMzOjZiOjlkOjkzOmIxOjM2CmRpZmYgLS1naXQgYS9yZWdyZXNzL3Q1Lm9rIGIvcmVncmVzcy90NS5vawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2MjJmMy4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL3Q1Lm9rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAoteG9rZXMtbHlsaXMtYnlsZWgtemViaWIta2FsdXMtYmloYXMtdGV2YWgtaGFyb3otc3VoYXItZm92ZWQtbm94ZXgKZGlmZiAtLWdpdCBhL3JlZ3Jlc3MvdGVzdC1leGVjLnNoIGIvcmVncmVzcy90ZXN0LWV4ZWMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MmNmZWQuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy90ZXN0LWV4ZWMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotIwkkT3BlbkJTRDogdGVzdC1leGVjLnNoLHYgMS4zNyAyMDEwLzAyLzI0IDA2OjIxOjU2IGRqbSBFeHAgJAotIwlQbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0KLSNTVURPPXN1ZG8KLQotIyBVbmJyZWFrIEdOVSBoZWFkKDEpCi1fUE9TSVgyX1ZFUlNJT049MTk5MjA5Ci1leHBvcnQgX1BPU0lYMl9WRVJTSU9OCi0KLWNhc2UgYHVuYW1lIC1zIDI+L2Rldi9udWxsYCBpbgotT1NGMSopCi0JQklOX1NIPXhwZzQKLQlleHBvcnQgQklOX1NICi0JOzsKLWVzYWMKLQotaWYgWyAhIC16ICIkVEVTVF9TU0hfUE9SVCIgXTsgdGhlbgotCVBPUlQ9IiRURVNUX1NTSF9QT1JUIgotZWxzZQotCVBPUlQ9NDI0MgotZmkKLQotaWYgWyAteCAvdXNyL3VjYi93aG9hbWkgXTsgdGhlbgotCVVTRVI9YC91c3IvdWNiL3dob2FtaWAKLWVsaWYgd2hvYW1pID4vZGV2L251bGwgMj4mMTsgdGhlbgotCVVTRVI9YHdob2FtaWAKLWVsaWYgbG9nbmFtZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQlVU0VSPWBsb2duYW1lYAotZWxzZQotCVVTRVI9YGlkIC11bmAKLWZpCi0KLU9CSj0kMQotaWYgWyAieCRPQkoiID0gIngiIF07IHRoZW4KLQllY2hvICckT0JKIG5vdCBkZWZpbmVkJwotCWV4aXQgMgotZmkKLWlmIFsgISAtZCAkT0JKIF07IHRoZW4KLQllY2hvICJub3QgYSBkaXJlY3Rvcnk6ICRPQkoiCi0JZXhpdCAyCi1maQotU0NSSVBUPSQyCi1pZiBbICJ4JFNDUklQVCIgPSAieCIgXTsgdGhlbgotCWVjaG8gJyRTQ1JJUFQgbm90IGRlZmluZWQnCi0JZXhpdCAyCi1maQotaWYgWyAhIC1mICRTQ1JJUFQgXTsgdGhlbgotCWVjaG8gIm5vdCBhIGZpbGU6ICRTQ1JJUFQiCi0JZXhpdCAyCi1maQotaWYgJFRFU1RfU0hFTEwgLW4gJFNDUklQVDsgdGhlbgotCXRydWUKLWVsc2UKLQllY2hvICJzeW50YXggZXJyb3IgaW4gJFNDUklQVCIKLQlleGl0IDIKLWZpCi11bnNldCBTU0hfQVVUSF9TT0NLCi0KLVNSQz1gZGlybmFtZSAke1NDUklQVH1gCi0KLSMgZGVmYXVsdHMKLVNTSD1zc2gKLVNTSEQ9c3NoZAotU1NIQUdFTlQ9c3NoLWFnZW50Ci1TU0hBREQ9c3NoLWFkZAotU1NIS0VZR0VOPXNzaC1rZXlnZW4KLVNTSEtFWVNDQU49c3NoLWtleXNjYW4KLVNGVFA9c2Z0cAotU0ZUUFNFUlZFUj0vdXNyL2xpYmV4ZWMvb3BlbnNzaC9zZnRwLXNlcnZlcgotU0NQPXNjcAotCi0jIEludGVyb3AgdGVzdGluZwotUExJTks9cGxpbmsKLVBVVFRZR0VOPXB1dHR5Z2VuCi1DT05DSD1jb25jaAotCi1pZiBbICJ4JFRFU1RfU1NIX1NTSCIgIT0gIngiIF07IHRoZW4KLQlTU0g9IiR7VEVTVF9TU0hfU1NIfSIKLWZpCi1pZiBbICJ4JFRFU1RfU1NIX1NTSEQiICE9ICJ4IiBdOyB0aGVuCi0JU1NIRD0iJHtURVNUX1NTSF9TU0hEfSIKLWZpCi1pZiBbICJ4JFRFU1RfU1NIX1NTSEFHRU5UIiAhPSAieCIgXTsgdGhlbgotCVNTSEFHRU5UPSIke1RFU1RfU1NIX1NTSEFHRU5UfSIKLWZpCi1pZiBbICJ4JFRFU1RfU1NIX1NTSEFERCIgIT0gIngiIF07IHRoZW4KLQlTU0hBREQ9IiR7VEVTVF9TU0hfU1NIQUREfSIKLWZpCi1pZiBbICJ4JFRFU1RfU1NIX1NTSEtFWUdFTiIgIT0gIngiIF07IHRoZW4KLQlTU0hLRVlHRU49IiR7VEVTVF9TU0hfU1NIS0VZR0VOfSIKLWZpCi1pZiBbICJ4JFRFU1RfU1NIX1NTSEtFWVNDQU4iICE9ICJ4IiBdOyB0aGVuCi0JU1NIS0VZU0NBTj0iJHtURVNUX1NTSF9TU0hLRVlTQ0FOfSIKLWZpCi1pZiBbICJ4JFRFU1RfU1NIX1NGVFAiICE9ICJ4IiBdOyB0aGVuCi0JU0ZUUD0iJHtURVNUX1NTSF9TRlRQfSIKLWZpCi1pZiBbICJ4JFRFU1RfU1NIX1NGVFBTRVJWRVIiICE9ICJ4IiBdOyB0aGVuCi0JU0ZUUFNFUlZFUj0iJHtURVNUX1NTSF9TRlRQU0VSVkVSfSIKLWZpCi1pZiBbICJ4JFRFU1RfU1NIX1NDUCIgIT0gIngiIF07IHRoZW4KLQlTQ1A9IiR7VEVTVF9TU0hfU0NQfSIKLWZpCi1pZiBbICJ4JFRFU1RfU1NIX1BMSU5LIiAhPSAieCIgXTsgdGhlbgotCSMgRmluZCByZWFsIGJpbmFyeSwgaWYgaXQgZXhpc3RzCi0JY2FzZSAiJHtURVNUX1NTSF9QTElOS30iIGluCi0JLyopIFBMSU5LPSIke1RFU1RfU1NIX1BMSU5LfSIgOzsKLQkqKSBQTElOSz1gd2hpY2ggJHtURVNUX1NTSF9QTElOS30gMj4vZGV2L251bGxgIDs7Ci0JZXNhYwotZmkKLWlmIFsgIngkVEVTVF9TU0hfUFVUVFlHRU4iICE9ICJ4IiBdOyB0aGVuCi0JIyBGaW5kIHJlYWwgYmluYXJ5LCBpZiBpdCBleGlzdHMKLQljYXNlICIke1RFU1RfU1NIX1BVVFRZR0VOfSIgaW4KLQkvKikgUFVUVFlHRU49IiR7VEVTVF9TU0hfUFVUVFlHRU59IiA7OwotCSopIFBVVFRZR0VOPWB3aGljaCAke1RFU1RfU1NIX1BVVFRZR0VOfSAyPi9kZXYvbnVsbGAgOzsKLQllc2FjCi1maQotaWYgWyAieCRURVNUX1NTSF9DT05DSCIgIT0gIngiIF07IHRoZW4KLQkjIEZpbmQgcmVhbCBiaW5hcnksIGlmIGl0IGV4aXN0cwotCWNhc2UgIiR7VEVTVF9TU0hfQ09OQ0h9IiBpbgotCS8qKSBDT05DSD0iJHtURVNUX1NTSF9DT05DSH0iIDs7Ci0JKikgQ09OQ0g9YHdoaWNoICR7VEVTVF9TU0hfQ09OQ0h9IDI+L2Rldi9udWxsYCA7OwotCWVzYWMKLWZpCi0KLSMgUGF0aCB0byBzc2hkIG11c3QgYmUgYWJzb2x1dGUgZm9yIHJleGVjCi1jYXNlICIkU1NIRCIgaW4KLS8qKSA7OwotKikgU1NIRD1gd2hpY2ggc3NoZGAgOzsKLWVzYWMKLQotaWYgWyAieCRURVNUX1NTSF9MT0dGSUxFIiA9ICJ4IiBdOyB0aGVuCi0JVEVTVF9TU0hfTE9HRklMRT0vZGV2L251bGwKLWZpCi0KLSMgdGhlc2Ugc2hvdWxkIGJlIHVzZWQgaW4gdGVzdHMKLWV4cG9ydCBTU0ggU1NIRCBTU0hBR0VOVCBTU0hBREQgU1NIS0VZR0VOIFNTSEtFWVNDQU4gU0ZUUCBTRlRQU0VSVkVSIFNDUAotI2VjaG8gJFNTSCAkU1NIRCAkU1NIQUdFTlQgJFNTSEFERCAkU1NIS0VZR0VOICRTU0hLRVlTQ0FOICRTRlRQICRTRlRQU0VSVkVSICRTQ1AKLQotIyBoZWxwZXIKLWVjaG9uKCkKLXsKLSAgICAgICBpZiBbICJ4YGVjaG8gLW5gIiA9ICJ4IiBdOyB0aGVuCi0gICAgICAgICAgICAgICBlY2hvIC1uICIkQCIKLSAgICAgICBlbGlmIFsgInhgZWNobyAnXGMnYCIgPSAieCIgXTsgdGhlbgotICAgICAgICAgICAgICAgZWNobyAiJEBcYyIKLSAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBmYXRhbCAiRG9uJ3Qga25vdyBob3cgdG8gZWNobyB3aXRob3V0IG5ld2xpbmUuIgotICAgICAgIGZpCi19Ci0KLWhhdmVfcHJvZygpCi17Ci0Jc2F2ZWRfSUZTPSIkSUZTIgotCUlGUz0iOiIKLQlmb3IgaSBpbiAkUEFUSAotCWRvCi0JCWlmIFsgLXggJGkvJDEgXTsgdGhlbgotCQkJSUZTPSIkc2F2ZWRfSUZTIgotCQkJcmV0dXJuIDAKLQkJZmkKLQlkb25lCi0JSUZTPSIkc2F2ZWRfSUZTIgotCXJldHVybiAxCi19Ci0KLWNsZWFudXAgKCkKLXsKLQlpZiBbIC1mICRQSURGSUxFIF07IHRoZW4KLQkJcGlkPWAkU1VETyBjYXQgJFBJREZJTEVgCi0JCWlmIFsgIlgkcGlkIiA9ICJYIiBdOyB0aGVuCi0JCQllY2hvIG5vIHNzaGQgcnVubmluZwotCQllbHNlCi0JCQlpZiBbICRwaWQgLWx0IDIgXTsgdGhlbgotCQkJCWVjaG8gYmFkIHBpZCBmb3Igc3NoOiAkcGlkCi0JCQllbHNlCi0JCQkJJFNVRE8ga2lsbCAkcGlkCi0JCQkJdHJhY2UgIndhaXQgZm9yIHNzaGQgdG8gZXhpdCIKLQkJCQlpPTA7Ci0JCQkJd2hpbGUgWyAtZiAkUElERklMRSAtYSAkaSAtbHQgNSBdOyBkbwotCQkJCQlpPWBleHByICRpICsgMWAKLQkJCQkJc2xlZXAgJGkKLQkJCQlkb25lCi0JCQkJdGVzdCAtZiAkUElERklMRSAmJiBcCi0JCQkJICAgIGZhdGFsICJzc2hkIGRpZG4ndCBleGl0IHBvcnQgJFBPUlQgcGlkICRwaWQiCi0JCQlmaQotCQlmaQotCWZpCi19Ci0KLXRyYWNlICgpCi17Ci0JZWNobyAidHJhY2U6ICRAIiA+PiRURVNUX1NTSF9MT0dGSUxFCi0JaWYgWyAiWCRURVNUX1NTSF9UUkFDRSIgPSAiWHllcyIgXTsgdGhlbgotCQllY2hvICIkQCIKLQlmaQotfQotCi12ZXJib3NlICgpCi17Ci0JZWNobyAidmVyYm9zZTogJEAiID4+JFRFU1RfU1NIX0xPR0ZJTEUKLQlpZiBbICJYJFRFU1RfU1NIX1FVSUVUIiAhPSAiWHllcyIgXTsgdGhlbgotCQllY2hvICIkQCIKLQlmaQotfQotCi13YXJuICgpCi17Ci0JZWNobyAiV0FSTklORzogJEAiID4+JFRFU1RfU1NIX0xPR0ZJTEUKLQllY2hvICJXQVJOSU5HOiAkQCIKLX0KLQotZmFpbCAoKQotewotCWVjaG8gIkZBSUw6ICRAIiA+PiRURVNUX1NTSF9MT0dGSUxFCi0JUkVTVUxUPTEKLQllY2hvICIkQCIKLX0KLQotZmF0YWwgKCkKLXsKLQllY2hvICJGQVRBTDogJEAiID4+JFRFU1RfU1NIX0xPR0ZJTEUKLQllY2hvbiAiRkFUQUw6ICIKLQlmYWlsICIkQCIKLQljbGVhbnVwCi0JZXhpdCAkUkVTVUxUCi19Ci0KLSMgQ2hlY2sgd2hldGhlciBwcmVwcm9jZXNzb3Igc3ltYm9scyBhcmUgZGVmaW5lZCBpbiBjb25maWcuaC4KLWNvbmZpZ19kZWZpbmVkICgpCi17Ci0Jc3RyPSQxCi0Jd2hpbGUgdGVzdCAieCQyIiAhPSAieCIgOyBkbwotCQlzdHI9IiRzdHJ8JDIiCi0JCXNoaWZ0Ci0JZG9uZQotCWVncmVwICJeI2RlZmluZS4qKCRzdHIpIiAke0JVSUxERElSfS9jb25maWcuaCA+L2Rldi9udWxsIDI+JjEKLX0KLQotUkVTVUxUPTAKLVBJREZJTEU9JE9CSi9waWRmaWxlCi0KLXRyYXAgZmF0YWwgMyAyCi0KLSMgY3JlYXRlIHNlcnZlciBjb25maWcKLWNhdCA8PCBFT0YgPiAkT0JKL3NzaGRfY29uZmlnCi0JU3RyaWN0TW9kZXMJCW5vCi0JUG9ydAkJCSRQT1JUCi0JUHJvdG9jb2wJCTIsMQotCUFkZHJlc3NGYW1pbHkJCWluZXQKLQlMaXN0ZW5BZGRyZXNzCQkxMjcuMC4wLjEKLQkjTGlzdGVuQWRkcmVzcwkJOjoxCi0JUGlkRmlsZQkJCSRQSURGSUxFCi0JQXV0aG9yaXplZEtleXNGaWxlCSRPQkovYXV0aG9yaXplZF9rZXlzXyV1Ci0JTG9nTGV2ZWwJCVZFUkJPU0UKLQlBY2NlcHRFbnYJCV9YWFhfVEVTVF8qCi0JQWNjZXB0RW52CQlfWFhYX1RFU1QKLQlTdWJzeXN0ZW0Jc2Z0cAkkU0ZUUFNFUlZFUgotRU9GCi0KLWlmIFsgISAteiAiJFRFU1RfU1NIX1NTSERfQ09ORk9QVFMiIF07IHRoZW4KLQl0cmFjZSAiYWRkaW5nIHNzaGRfY29uZmlnIG9wdGlvbiAkVEVTVF9TU0hfU1NIRF9DT05GT1BUUyIKLQllY2hvICIkVEVTVF9TU0hfU1NIRF9DT05GT1BUUyIgPj4gJE9CSi9zc2hkX2NvbmZpZwotZmkKLQotIyBzZXJ2ZXIgY29uZmlnIGZvciBwcm94eSBjb25uZWN0cwotY3AgJE9CSi9zc2hkX2NvbmZpZyAkT0JKL3NzaGRfcHJveHkKLQotIyBhbGxvdyBncm91cC13cml0YWJsZSBkaXJlY3RvcmllcyBpbiBwcm94eS1tb2RlCi1lY2hvICdTdHJpY3RNb2RlcyBubycgPj4gJE9CSi9zc2hkX3Byb3h5Ci0KLSMgY3JlYXRlIGNsaWVudCBjb25maWcKLWNhdCA8PCBFT0YgPiAkT0JKL3NzaF9jb25maWcKLUhvc3QgKgotCVByb3RvY29sCQkyLDEKLQlIb3N0bmFtZQkJMTI3LjAuMC4xCi0JSG9zdEtleUFsaWFzCQlsb2NhbGhvc3Qtd2l0aC1hbGlhcwotCVBvcnQJCQkkUE9SVAotCVVzZXIJCQkkVVNFUgotCUdsb2JhbEtub3duSG9zdHNGaWxlCSRPQkova25vd25faG9zdHMKLQlVc2VyS25vd25Ib3N0c0ZpbGUJJE9CSi9rbm93bl9ob3N0cwotCVJTQUF1dGhlbnRpY2F0aW9uCXllcwotCVB1YmtleUF1dGhlbnRpY2F0aW9uCXllcwotCUNoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24Jbm8KLQlIb3N0YmFzZWRBdXRoZW50aWNhdGlvbglubwotCVBhc3N3b3JkQXV0aGVudGljYXRpb24Jbm8KLQlCYXRjaE1vZGUJCXllcwotCVN0cmljdEhvc3RLZXlDaGVja2luZwl5ZXMKLUVPRgotCi1pZiBbICEgLXogIiRURVNUX1NTSF9TU0hfQ09ORk9QVFMiIF07IHRoZW4KLQl0cmFjZSAiYWRkaW5nIHNzaF9jb25maWcgb3B0aW9uICRURVNUX1NTSF9TU0hEX0NPTkZPUFRTIgotCWVjaG8gIiRURVNUX1NTSF9TU0hfQ09ORk9QVFMiID4+ICRPQkovc3NoX2NvbmZpZwotZmkKLQotcm0gLWYgJE9CSi9rbm93bl9ob3N0cyAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgotCi10cmFjZSAiZ2VuZXJhdGUga2V5cyIKLWZvciB0IGluIHJzYSByc2ExOyBkbwotCSMgZ2VuZXJhdGUgdXNlciBrZXkKLQlybSAtZiAkT0JKLyR0Ci0JJHtTU0hLRVlHRU59IC1iIDEwMjQgLXEgLU4gJycgLXQgJHQgIC1mICRPQkovJHQgfHxcCi0JCWZhaWwgInNzaC1rZXlnZW4gZm9yICR0IGZhaWxlZCIKLQotCSMga25vd24gaG9zdHMgZmlsZSBmb3IgY2xpZW50Ci0JKAotCQllY2hvbiAnbG9jYWxob3N0LXdpdGgtYWxpYXMsMTI3LjAuMC4xLDo6MSAnCi0JCWNhdCAkT0JKLyR0LnB1YgotCSkgPj4gJE9CSi9rbm93bl9ob3N0cwotCi0JIyBzZXR1cCBhdXRob3JpemVkIGtleXMKLQljYXQgJE9CSi8kdC5wdWIgPj4gJE9CSi9hdXRob3JpemVkX2tleXNfJFVTRVIKLQllY2hvIElkZW50aXR5RmlsZSAkT0JKLyR0ID4+ICRPQkovc3NoX2NvbmZpZwotCi0JIyB1c2Uga2V5IGFzIGhvc3Qga2V5LCB0b28KLQkkU1VETyBjcCAkT0JKLyR0ICRPQkovaG9zdC4kdAotCWVjaG8gSG9zdEtleSAkT0JKL2hvc3QuJHQgPj4gJE9CSi9zc2hkX2NvbmZpZwotCi0JIyBkb24ndCB1c2UgU1VETyBmb3IgcHJveHkgY29ubmVjdAotCWVjaG8gSG9zdEtleSAkT0JKLyR0ID4+ICRPQkovc3NoZF9wcm94eQotZG9uZQotY2htb2QgNjQ0ICRPQkovYXV0aG9yaXplZF9rZXlzXyRVU0VSCi0KLSMgQWN0aXZhdGUgVHdpc3RlZCBDb25jaCB0ZXN0cyBpZiB0aGUgYmluYXJ5IGlzIHByZXNlbnQKLVJFR1JFU1NfSU5URVJPUF9DT05DSD1ubwotaWYgdGVzdCAteCAiJENPTkNIIiA7IHRoZW4KLQlSRUdSRVNTX0lOVEVST1BfQ09OQ0g9eWVzCi1maQotCi0jIElmIFB1VFRZIGlzIHByZXNlbnQgYW5kIHdlIGFyZSBydW5uaW5nIGEgUHVUVFkgdGVzdCwgcHJlcGFyZSBrZXlzIGFuZAotIyBjb25maWd1cmF0aW9uCi1SRUdSRVNTX0lOVEVST1BfUFVUVFk9bm8KLWlmIHRlc3QgLXggIiRQVVRUWUdFTiIgLWEgLXggIiRQTElOSyIgOyB0aGVuCi0JUkVHUkVTU19JTlRFUk9QX1BVVFRZPXllcwotZmkKLWNhc2UgIiRTQ1JJUFQiIGluCi0qcHV0dHkqKQk7OwotKikJCVJFR1JFU1NfSU5URVJPUF9QVVRUWT1ubyA7OwotZXNhYwotCi1pZiB0ZXN0ICIkUkVHUkVTU19JTlRFUk9QX1BVVFRZIiA9ICJ5ZXMiIDsgdGhlbgotCW1rZGlyIC1wICR7T0JKfS8ucHV0dHkKLQotCSMgQWRkIGEgUHVUVFkga2V5IHRvIGF1dGhvcml6ZWRfa2V5cwotCXJtIC1mICR7T0JKfS9wdXR0eS5yc2EyCi0JcHV0dHlnZW4gLXQgcnNhIC1vICR7T0JKfS9wdXR0eS5yc2EyIDwgL2Rldi9udWxsID4gL2Rldi9udWxsCi0JcHV0dHlnZW4gLU8gcHVibGljLW9wZW5zc2ggJHtPQkp9L3B1dHR5LnJzYTIgXAotCSAgICA+PiAkT0JKL2F1dGhvcml6ZWRfa2V5c18kVVNFUgotCi0JIyBDb252ZXJ0IHJzYTIgaG9zdCBrZXkgdG8gUHVUVFkgZm9ybWF0Ci0JJHtTUkN9L3NzaDJwdXR0eS5zaCAxMjcuMC4wLjEgJFBPUlQgJE9CSi9yc2EgPiBcCi0JICAgICR7T0JKfS8ucHV0dHkvc3NoaG9zdGtleXMKLQkke1NSQ30vc3NoMnB1dHR5LnNoIDEyNy4wLjAuMSAyMiAkT0JKL3JzYSA+PiBcCi0JICAgICR7T0JKfS8ucHV0dHkvc3NoaG9zdGtleXMKLQotCSMgU2V0dXAgcHJveGllZCBzZXNzaW9uCi0JbWtkaXIgLXAgJHtPQkp9Ly5wdXR0eS9zZXNzaW9ucwotCXJtIC1mICR7T0JKfS8ucHV0dHkvc2Vzc2lvbnMvbG9jYWxob3N0X3Byb3h5Ci0JZWNobyAiSG9zdG5hbWU9MTI3LjAuMC4xIiA+PiAke09CSn0vLnB1dHR5L3Nlc3Npb25zL2xvY2FsaG9zdF9wcm94eQotCWVjaG8gIlBvcnROdW1iZXI9JFBPUlQiID4+ICR7T0JKfS8ucHV0dHkvc2Vzc2lvbnMvbG9jYWxob3N0X3Byb3h5Ci0JZWNobyAiUHJveHlNZXRob2Q9NSIgPj4gJHtPQkp9Ly5wdXR0eS9zZXNzaW9ucy9sb2NhbGhvc3RfcHJveHkKLQllY2hvICJQcm94eVRlbG5ldENvbW1hbmQ9c2ggJHtTUkN9L3NzaGQtbG9nLXdyYXBwZXIuc2ggJHtTU0hEfSAke1RFU1RfU1NIX0xPR0ZJTEV9IC1pIC1mICRPQkovc3NoZF9wcm94eSIgPj4gJHtPQkp9Ly5wdXR0eS9zZXNzaW9ucy9sb2NhbGhvc3RfcHJveHkgCi0KLQlSRUdSRVNTX0lOVEVST1BfUFVUVFk9eWVzCi1maQotCi0jIGNyZWF0ZSBhIHByb3h5IHZlcnNpb24gb2YgdGhlIGNsaWVudCBjb25maWcKLSgKLQljYXQgJE9CSi9zc2hfY29uZmlnCi0JZWNobyBwcm94eWNvbW1hbmQgJHtTVURPfSBzaCAke1NSQ30vc3NoZC1sb2ctd3JhcHBlci5zaCAke1NTSER9ICR7VEVTVF9TU0hfTE9HRklMRX0gLWkgLWYgJE9CSi9zc2hkX3Byb3h5Ci0pID4gJE9CSi9zc2hfcHJveHkKLQotIyBjaGVjayBwcm94eSBjb25maWcKLSR7U1NIRH0gLXQgLWYgJE9CSi9zc2hkX3Byb3h5CXx8IGZhdGFsICJzc2hkX3Byb3h5IGJyb2tlbiIKLQotc3RhcnRfc3NoZCAoKQotewotCSMgc3RhcnQgc3NoZAotCSRTVURPICR7U1NIRH0gLWYgJE9CSi9zc2hkX2NvbmZpZyAiJEAiIC10IHx8IGZhdGFsICJzc2hkX2NvbmZpZyBicm9rZW4iCi0JJFNVRE8gJHtTU0hEfSAtZiAkT0JKL3NzaGRfY29uZmlnIC1lICIkQCIgPj4kVEVTVF9TU0hfTE9HRklMRSAyPiYxCi0KLQl0cmFjZSAid2FpdCBmb3Igc3NoZCIKLQlpPTA7Ci0Jd2hpbGUgWyAhIC1mICRQSURGSUxFIC1hICRpIC1sdCAxMCBdOyBkbwotCQlpPWBleHByICRpICsgMWAKLQkJc2xlZXAgJGkKLQlkb25lCi0KLQl0ZXN0IC1mICRQSURGSUxFIHx8IGZhdGFsICJubyBzc2hkIHJ1bm5pbmcgb24gcG9ydCAkUE9SVCIKLX0KLQotIyBzb3VyY2UgdGVzdCBib2R5Ci0uICRTQ1JJUFQKLQotIyBraWxsIHNzaGQKLWNsZWFudXAKLWlmIFsgJFJFU1VMVCAtZXEgMCBdOyB0aGVuCi0JdmVyYm9zZSBvayAkdGlkCi1lbHNlCi0JZWNobyBmYWlsZWQgJHRpZAotZmkKLWV4aXQgJFJFU1VMVApkaWZmIC0tZ2l0IGEvcmVncmVzcy90cmFuc2Zlci5zaCBiL3JlZ3Jlc3MvdHJhbnNmZXIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZWEzNjcuLjAwMDAwMDAKLS0tIGEvcmVncmVzcy90cmFuc2Zlci5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMJJE9wZW5CU0Q6IHRyYW5zZmVyLnNoLHYgMS4xIDIwMDIvMDMvMjcgMDA6MDM6MzcgbWFya3VzIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJ0cmFuc2ZlciBkYXRhIgotCi1EQVRBPS9iaW4vbHMke0VYRUVYVH0KLUNPUFk9JHtPQkp9L2NvcHkKLQotZm9yIHAgaW4gMSAyOyBkbwotCXZlcmJvc2UgIiR0aWQ6IHByb3RvICRwIgotCXJtIC1mICR7Q09QWX0KLQkke1NTSH0gLW4gLXEgLSRwIC1GICRPQkovc3NoX3Byb3h5IHNvbWVob3N0IGNhdCAke0RBVEF9ID4gJHtDT1BZfQotCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQlmYWlsICJzc2ggY2F0ICREQVRBIGZhaWxlZCIKLQlmaQotCWNtcCAke0RBVEF9ICR7Q09QWX0JCXx8IGZhaWwgImNvcnJ1cHRlZCBjb3B5IgotCi0JZm9yIHMgaW4gMTAgMTAwIDFrIDMyayA2NGsgMTI4ayAyNTZrOyBkbwotCQl0cmFjZSAicHJvdG8gJHAgZGQtc2l6ZSAke3N9IgotCQlybSAtZiAke0NPUFl9Ci0JCWRkIGlmPSREQVRBIG9icz0ke3N9IDI+IC9kZXYvbnVsbCB8IFwKLQkJCSR7U1NIfSAtcSAtJHAgLUYgJE9CSi9zc2hfcHJveHkgc29tZWhvc3QgImNhdCA+ICR7Q09QWX0iCi0JCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQkJZmFpbCAic3NoIGNhdCAkREFUQSBmYWlsZWQiCi0JCWZpCi0JCWNtcCAkREFUQSAke0NPUFl9CQl8fCBmYWlsICJjb3JydXB0ZWQgY29weSIKLQlkb25lCi1kb25lCi1ybSAtZiAke0NPUFl9CmRpZmYgLS1naXQgYS9yZWdyZXNzL3RyeS1jaXBoZXJzLnNoIGIvcmVncmVzcy90cnktY2lwaGVycy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxOGQyMi4uMDAwMDAwMAotLS0gYS9yZWdyZXNzL3RyeS1jaXBoZXJzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIwkkT3BlbkJTRDogdHJ5LWNpcGhlcnMuc2gsdiAxLjEyIDIwMTEvMDgvMDIgMDE6MjM6NDEgZGptIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJ0cnkgY2lwaGVycyIKLQotY2lwaGVycz0iYWVzMTI4LWNiYyAzZGVzLWNiYyBibG93ZmlzaC1jYmMgY2FzdDEyOC1jYmMgCi0JYXJjZm91cjEyOCBhcmNmb3VyMjU2IGFyY2ZvdXIgCi0JYWVzMTkyLWNiYyBhZXMyNTYtY2JjIHJpam5kYWVsLWNiY0BseXNhdG9yLmxpdS5zZQotCWFlczEyOC1jdHIgYWVzMTkyLWN0ciBhZXMyNTYtY3RyIgotbWFjcz0iaG1hYy1zaGExIGhtYWMtbWQ1IHVtYWMtNjRAb3BlbnNzaC5jb20gaG1hYy1zaGExLTk2IGhtYWMtbWQ1LTk2IgotY29uZmlnX2RlZmluZWQgSEFWRV9FVlBfU0hBMjU2ICYmCi0gICAgbWFjcz0iJG1hY3MgaG1hYy1zaGEyLTI1NiBobWFjLXNoYTItMjU2LTk2IGhtYWMtc2hhMi01MTIgaG1hYy1zaGEyLTUxMi05NiIKLQotZm9yIGMgaW4gJGNpcGhlcnM7IGRvCi0JZm9yIG0gaW4gJG1hY3M7IGRvCi0JCXRyYWNlICJwcm90byAyIGNpcGhlciAkYyBtYWMgJG0iCi0JCXZlcmJvc2UgInRlc3QgJHRpZDogcHJvdG8gMiBjaXBoZXIgJGMgbWFjICRtIgotCQkke1NTSH0gLUYgJE9CSi9zc2hfcHJveHkgLTIgLW0gJG0gLWMgJGMgc29tZWhvc3QgdHJ1ZQotCQlpZiBbICQ/IC1uZSAwIF07IHRoZW4KLQkJCWZhaWwgInNzaCAtMiBmYWlsZWQgd2l0aCBtYWMgJG0gY2lwaGVyICRjIgotCQlmaQotCWRvbmUKLWRvbmUKLQotY2lwaGVycz0iM2RlcyBibG93ZmlzaCIKLWZvciBjIGluICRjaXBoZXJzOyBkbwotCXRyYWNlICJwcm90byAxIGNpcGhlciAkYyIKLQl2ZXJib3NlICJ0ZXN0ICR0aWQ6IHByb3RvIDEgY2lwaGVyICRjIgotCSR7U1NIfSAtRiAkT0JKL3NzaF9wcm94eSAtMSAtYyAkYyBzb21laG9zdCB0cnVlCi0JaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0JCWZhaWwgInNzaCAtMSBmYWlsZWQgd2l0aCBjaXBoZXIgJGMiCi0JZmkKLWRvbmUKLQotaWYgJHtTU0h9IC1vQ2lwaGVycz1hY3NzQG9wZW5zc2gub3JnIDI+JjEgfCBncmVwICJCYWQgU1NIMiBjaXBoZXIiID4vZGV2L251bGwKLXRoZW4KLQk6Ci1lbHNlCi0KLWVjaG8gIkNpcGhlcnMgYWNzc0BvcGVuc3NoLm9yZyIgPj4gJE9CSi9zc2hkX3Byb3h5Ci1jPWFjc3NAb3BlbnNzaC5vcmcKLWZvciBtIGluICRtYWNzOyBkbwotCXRyYWNlICJwcm90byAyICRjIG1hYyAkbSIKLQl2ZXJib3NlICJ0ZXN0ICR0aWQ6IHByb3RvIDIgY2lwaGVyICRjIG1hYyAkbSIKLQkke1NTSH0gLUYgJE9CSi9zc2hfcHJveHkgLTIgLW0gJG0gLWMgJGMgc29tZWhvc3QgdHJ1ZQotCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQlmYWlsICJzc2ggLTIgZmFpbGVkIHdpdGggbWFjICRtIGNpcGhlciAkYyIKLQlmaQotZG9uZQotCi1maQpkaWZmIC0tZ2l0IGEvcmVncmVzcy95ZXMtaGVhZC5zaCBiL3JlZ3Jlc3MveWVzLWhlYWQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTZiYzguLjAwMDAwMDAKLS0tIGEvcmVncmVzcy95ZXMtaGVhZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMJJE9wZW5CU0Q6IHllcy1oZWFkLnNoLHYgMS40IDIwMDIvMDMvMTUgMTM6MDg6NTYgbWFya3VzIEV4cCAkCi0jCVBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLQotdGlkPSJ5ZXMgcGlwZSBoZWFkIgotCi1mb3IgcCBpbiAxIDI7IGRvCi0JbGluZXM9YCR7U1NIfSAtJHAgLUYgJE9CSi9zc2hfcHJveHkgdGhpc2hvc3QgJ3NoIC1jICJ3aGlsZSB0cnVlO2RvIGVjaG8geWVzO2RvbmUgfCBfUE9TSVgyX1ZFUlNJT049MTk5MjA5IGhlYWQgLTIwMDAiJyB8IChzbGVlcCAzIDsgd2MgLWwpYAotCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgotCQlmYWlsICJ5ZXN8aGVhZCB0ZXN0IGZhaWxlZCIKLQkJbGluZXMgPSAwOwotCWZpCi0JaWYgWyAkbGluZXMgLW5lIDIwMDAgXTsgdGhlbgotCQlmYWlsICJ5ZXN8aGVhZCByZXR1cm5zICRsaW5lcyBsaW5lcyBpbnN0ZWFkIG9mIDIwMDAiCi0JZmkKLWRvbmUKZGlmZiAtLWdpdCBhL3Jpam5kYWVsLmMgYi9yaWpuZGFlbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDMyZWEyLi4wMDAwMDAwCi0tLSBhL3Jpam5kYWVsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQ0ICswLDAgQEAKLS8qCSRPcGVuQlNEOiByaWpuZGFlbC5jLHYgMS4xNiAyMDA0LzA2LzIzIDAwOjM5OjM4IG1vdXJpbmcgRXhwICQgKi8KLQotLyoqCi0gKiByaWpuZGFlbC1hbGctZnN0LmMKLSAqCi0gKiBAdmVyc2lvbiAzLjAgKERlY2VtYmVyIDIwMDApCi0gKgotICogT3B0aW1pc2VkIEFOU0kgQyBjb2RlIGZvciB0aGUgUmlqbmRhZWwgY2lwaGVyIChub3cgQUVTKQotICoKLSAqIEBhdXRob3IgVmluY2VudCBSaWptZW4gPHZpbmNlbnQucmlqbWVuQGVzYXQua3VsZXV2ZW4uYWMuYmU+Ci0gKiBAYXV0aG9yIEFudG9vbiBCb3NzZWxhZXJzIDxhbnRvb24uYm9zc2VsYWVyc0Blc2F0Lmt1bGV1dmVuLmFjLmJlPgotICogQGF1dGhvciBQYXVsbyBCYXJyZXRvIDxwYXVsby5iYXJyZXRvQHRlcnJhLmNvbS5icj4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgaGVyZWJ5IHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1JTICcnQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MKLSAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAotICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInJpam5kYWVsLmgiCi0KLSNkZWZpbmUgRlVMTF9VTlJPTEwKLQotLyoKLVRlMFt4XSA9IFMgW3hdLlswMiwgMDEsIDAxLCAwM107Ci1UZTFbeF0gPSBTIFt4XS5bMDMsIDAyLCAwMSwgMDFdOwotVGUyW3hdID0gUyBbeF0uWzAxLCAwMywgMDIsIDAxXTsKLVRlM1t4XSA9IFMgW3hdLlswMSwgMDEsIDAzLCAwMl07Ci1UZTRbeF0gPSBTIFt4XS5bMDEsIDAxLCAwMSwgMDFdOwotCi1UZDBbeF0gPSBTaVt4XS5bMGUsIDA5LCAwZCwgMGJdOwotVGQxW3hdID0gU2lbeF0uWzBiLCAwZSwgMDksIDBkXTsKLVRkMlt4XSA9IFNpW3hdLlswZCwgMGIsIDBlLCAwOV07Ci1UZDNbeF0gPSBTaVt4XS5bMDksIDBkLCAwYiwgMGVdOwotVGQ0W3hdID0gU2lbeF0uWzAxLCAwMSwgMDEsIDAxXTsKLSovCi0KLXN0YXRpYyBjb25zdCB1MzIgVGUwWzI1Nl0gPSB7Ci0gICAgMHhjNjYzNjNhNVUsIDB4Zjg3YzdjODRVLCAweGVlNzc3Nzk5VSwgMHhmNjdiN2I4ZFUsCi0gICAgMHhmZmYyZjIwZFUsIDB4ZDY2YjZiYmRVLCAweGRlNmY2ZmIxVSwgMHg5MWM1YzU1NFUsCi0gICAgMHg2MDMwMzA1MFUsIDB4MDIwMTAxMDNVLCAweGNlNjc2N2E5VSwgMHg1NjJiMmI3ZFUsCi0gICAgMHhlN2ZlZmUxOVUsIDB4YjVkN2Q3NjJVLCAweDRkYWJhYmU2VSwgMHhlYzc2NzY5YVUsCi0gICAgMHg4ZmNhY2E0NVUsIDB4MWY4MjgyOWRVLCAweDg5YzljOTQwVSwgMHhmYTdkN2Q4N1UsCi0gICAgMHhlZmZhZmExNVUsIDB4YjI1OTU5ZWJVLCAweDhlNDc0N2M5VSwgMHhmYmYwZjAwYlUsCi0gICAgMHg0MWFkYWRlY1UsIDB4YjNkNGQ0NjdVLCAweDVmYTJhMmZkVSwgMHg0NWFmYWZlYVUsCi0gICAgMHgyMzljOWNiZlUsIDB4NTNhNGE0ZjdVLCAweGU0NzI3Mjk2VSwgMHg5YmMwYzA1YlUsCi0gICAgMHg3NWI3YjdjMlUsIDB4ZTFmZGZkMWNVLCAweDNkOTM5M2FlVSwgMHg0YzI2MjY2YVUsCi0gICAgMHg2YzM2MzY1YVUsIDB4N2UzZjNmNDFVLCAweGY1ZjdmNzAyVSwgMHg4M2NjY2M0ZlUsCi0gICAgMHg2ODM0MzQ1Y1UsIDB4NTFhNWE1ZjRVLCAweGQxZTVlNTM0VSwgMHhmOWYxZjEwOFUsCi0gICAgMHhlMjcxNzE5M1UsIDB4YWJkOGQ4NzNVLCAweDYyMzEzMTUzVSwgMHgyYTE1MTUzZlUsCi0gICAgMHgwODA0MDQwY1UsIDB4OTVjN2M3NTJVLCAweDQ2MjMyMzY1VSwgMHg5ZGMzYzM1ZVUsCi0gICAgMHgzMDE4MTgyOFUsIDB4Mzc5Njk2YTFVLCAweDBhMDUwNTBmVSwgMHgyZjlhOWFiNVUsCi0gICAgMHgwZTA3MDcwOVUsIDB4MjQxMjEyMzZVLCAweDFiODA4MDliVSwgMHhkZmUyZTIzZFUsCi0gICAgMHhjZGViZWIyNlUsIDB4NGUyNzI3NjlVLCAweDdmYjJiMmNkVSwgMHhlYTc1NzU5ZlUsCi0gICAgMHgxMjA5MDkxYlUsIDB4MWQ4MzgzOWVVLCAweDU4MmMyYzc0VSwgMHgzNDFhMWEyZVUsCi0gICAgMHgzNjFiMWIyZFUsIDB4ZGM2ZTZlYjJVLCAweGI0NWE1YWVlVSwgMHg1YmEwYTBmYlUsCi0gICAgMHhhNDUyNTJmNlUsIDB4NzYzYjNiNGRVLCAweGI3ZDZkNjYxVSwgMHg3ZGIzYjNjZVUsCi0gICAgMHg1MjI5Mjk3YlUsIDB4ZGRlM2UzM2VVLCAweDVlMmYyZjcxVSwgMHgxMzg0ODQ5N1UsCi0gICAgMHhhNjUzNTNmNVUsIDB4YjlkMWQxNjhVLCAweDAwMDAwMDAwVSwgMHhjMWVkZWQyY1UsCi0gICAgMHg0MDIwMjA2MFUsIDB4ZTNmY2ZjMWZVLCAweDc5YjFiMWM4VSwgMHhiNjViNWJlZFUsCi0gICAgMHhkNDZhNmFiZVUsIDB4OGRjYmNiNDZVLCAweDY3YmViZWQ5VSwgMHg3MjM5Mzk0YlUsCi0gICAgMHg5NDRhNGFkZVUsIDB4OTg0YzRjZDRVLCAweGIwNTg1OGU4VSwgMHg4NWNmY2Y0YVUsCi0gICAgMHhiYmQwZDA2YlUsIDB4YzVlZmVmMmFVLCAweDRmYWFhYWU1VSwgMHhlZGZiZmIxNlUsCi0gICAgMHg4NjQzNDNjNVUsIDB4OWE0ZDRkZDdVLCAweDY2MzMzMzU1VSwgMHgxMTg1ODU5NFUsCi0gICAgMHg4YTQ1NDVjZlUsIDB4ZTlmOWY5MTBVLCAweDA0MDIwMjA2VSwgMHhmZTdmN2Y4MVUsCi0gICAgMHhhMDUwNTBmMFUsIDB4NzgzYzNjNDRVLCAweDI1OWY5ZmJhVSwgMHg0YmE4YThlM1UsCi0gICAgMHhhMjUxNTFmM1UsIDB4NWRhM2EzZmVVLCAweDgwNDA0MGMwVSwgMHgwNThmOGY4YVUsCi0gICAgMHgzZjkyOTJhZFUsIDB4MjE5ZDlkYmNVLCAweDcwMzgzODQ4VSwgMHhmMWY1ZjUwNFUsCi0gICAgMHg2M2JjYmNkZlUsIDB4NzdiNmI2YzFVLCAweGFmZGFkYTc1VSwgMHg0MjIxMjE2M1UsCi0gICAgMHgyMDEwMTAzMFUsIDB4ZTVmZmZmMWFVLCAweGZkZjNmMzBlVSwgMHhiZmQyZDI2ZFUsCi0gICAgMHg4MWNkY2Q0Y1UsIDB4MTgwYzBjMTRVLCAweDI2MTMxMzM1VSwgMHhjM2VjZWMyZlUsCi0gICAgMHhiZTVmNWZlMVUsIDB4MzU5Nzk3YTJVLCAweDg4NDQ0NGNjVSwgMHgyZTE3MTczOVUsCi0gICAgMHg5M2M0YzQ1N1UsIDB4NTVhN2E3ZjJVLCAweGZjN2U3ZTgyVSwgMHg3YTNkM2Q0N1UsCi0gICAgMHhjODY0NjRhY1UsIDB4YmE1ZDVkZTdVLCAweDMyMTkxOTJiVSwgMHhlNjczNzM5NVUsCi0gICAgMHhjMDYwNjBhMFUsIDB4MTk4MTgxOThVLCAweDllNGY0ZmQxVSwgMHhhM2RjZGM3ZlUsCi0gICAgMHg0NDIyMjI2NlUsIDB4NTQyYTJhN2VVLCAweDNiOTA5MGFiVSwgMHgwYjg4ODg4M1UsCi0gICAgMHg4YzQ2NDZjYVUsIDB4YzdlZWVlMjlVLCAweDZiYjhiOGQzVSwgMHgyODE0MTQzY1UsCi0gICAgMHhhN2RlZGU3OVUsIDB4YmM1ZTVlZTJVLCAweDE2MGIwYjFkVSwgMHhhZGRiZGI3NlUsCi0gICAgMHhkYmUwZTAzYlUsIDB4NjQzMjMyNTZVLCAweDc0M2EzYTRlVSwgMHgxNDBhMGExZVUsCi0gICAgMHg5MjQ5NDlkYlUsIDB4MGMwNjA2MGFVLCAweDQ4MjQyNDZjVSwgMHhiODVjNWNlNFUsCi0gICAgMHg5ZmMyYzI1ZFUsIDB4YmRkM2QzNmVVLCAweDQzYWNhY2VmVSwgMHhjNDYyNjJhNlUsCi0gICAgMHgzOTkxOTFhOFUsIDB4MzE5NTk1YTRVLCAweGQzZTRlNDM3VSwgMHhmMjc5Nzk4YlUsCi0gICAgMHhkNWU3ZTczMlUsIDB4OGJjOGM4NDNVLCAweDZlMzczNzU5VSwgMHhkYTZkNmRiN1UsCi0gICAgMHgwMThkOGQ4Y1UsIDB4YjFkNWQ1NjRVLCAweDljNGU0ZWQyVSwgMHg0OWE5YTllMFUsCi0gICAgMHhkODZjNmNiNFUsIDB4YWM1NjU2ZmFVLCAweGYzZjRmNDA3VSwgMHhjZmVhZWEyNVUsCi0gICAgMHhjYTY1NjVhZlUsIDB4ZjQ3YTdhOGVVLCAweDQ3YWVhZWU5VSwgMHgxMDA4MDgxOFUsCi0gICAgMHg2ZmJhYmFkNVUsIDB4ZjA3ODc4ODhVLCAweDRhMjUyNTZmVSwgMHg1YzJlMmU3MlUsCi0gICAgMHgzODFjMWMyNFUsIDB4NTdhNmE2ZjFVLCAweDczYjRiNGM3VSwgMHg5N2M2YzY1MVUsCi0gICAgMHhjYmU4ZTgyM1UsIDB4YTFkZGRkN2NVLCAweGU4NzQ3NDljVSwgMHgzZTFmMWYyMVUsCi0gICAgMHg5NjRiNGJkZFUsIDB4NjFiZGJkZGNVLCAweDBkOGI4Yjg2VSwgMHgwZjhhOGE4NVUsCi0gICAgMHhlMDcwNzA5MFUsIDB4N2MzZTNlNDJVLCAweDcxYjViNWM0VSwgMHhjYzY2NjZhYVUsCi0gICAgMHg5MDQ4NDhkOFUsIDB4MDYwMzAzMDVVLCAweGY3ZjZmNjAxVSwgMHgxYzBlMGUxMlUsCi0gICAgMHhjMjYxNjFhM1UsIDB4NmEzNTM1NWZVLCAweGFlNTc1N2Y5VSwgMHg2OWI5YjlkMFUsCi0gICAgMHgxNzg2ODY5MVUsIDB4OTljMWMxNThVLCAweDNhMWQxZDI3VSwgMHgyNzllOWViOVUsCi0gICAgMHhkOWUxZTEzOFUsIDB4ZWJmOGY4MTNVLCAweDJiOTg5OGIzVSwgMHgyMjExMTEzM1UsCi0gICAgMHhkMjY5NjliYlUsIDB4YTlkOWQ5NzBVLCAweDA3OGU4ZTg5VSwgMHgzMzk0OTRhN1UsCi0gICAgMHgyZDliOWJiNlUsIDB4M2MxZTFlMjJVLCAweDE1ODc4NzkyVSwgMHhjOWU5ZTkyMFUsCi0gICAgMHg4N2NlY2U0OVUsIDB4YWE1NTU1ZmZVLCAweDUwMjgyODc4VSwgMHhhNWRmZGY3YVUsCi0gICAgMHgwMzhjOGM4ZlUsIDB4NTlhMWExZjhVLCAweDA5ODk4OTgwVSwgMHgxYTBkMGQxN1UsCi0gICAgMHg2NWJmYmZkYVUsIDB4ZDdlNmU2MzFVLCAweDg0NDI0MmM2VSwgMHhkMDY4NjhiOFUsCi0gICAgMHg4MjQxNDFjM1UsIDB4Mjk5OTk5YjBVLCAweDVhMmQyZDc3VSwgMHgxZTBmMGYxMVUsCi0gICAgMHg3YmIwYjBjYlUsIDB4YTg1NDU0ZmNVLCAweDZkYmJiYmQ2VSwgMHgyYzE2MTYzYVUsCi19Owotc3RhdGljIGNvbnN0IHUzMiBUZTFbMjU2XSA9IHsKLSAgICAweGE1YzY2MzYzVSwgMHg4NGY4N2M3Y1UsIDB4OTllZTc3NzdVLCAweDhkZjY3YjdiVSwKLSAgICAweDBkZmZmMmYyVSwgMHhiZGQ2NmI2YlUsIDB4YjFkZTZmNmZVLCAweDU0OTFjNWM1VSwKLSAgICAweDUwNjAzMDMwVSwgMHgwMzAyMDEwMVUsIDB4YTljZTY3NjdVLCAweDdkNTYyYjJiVSwKLSAgICAweDE5ZTdmZWZlVSwgMHg2MmI1ZDdkN1UsIDB4ZTY0ZGFiYWJVLCAweDlhZWM3Njc2VSwKLSAgICAweDQ1OGZjYWNhVSwgMHg5ZDFmODI4MlUsIDB4NDA4OWM5YzlVLCAweDg3ZmE3ZDdkVSwKLSAgICAweDE1ZWZmYWZhVSwgMHhlYmIyNTk1OVUsIDB4Yzk4ZTQ3NDdVLCAweDBiZmJmMGYwVSwKLSAgICAweGVjNDFhZGFkVSwgMHg2N2IzZDRkNFUsIDB4ZmQ1ZmEyYTJVLCAweGVhNDVhZmFmVSwKLSAgICAweGJmMjM5YzljVSwgMHhmNzUzYTRhNFUsIDB4OTZlNDcyNzJVLCAweDViOWJjMGMwVSwKLSAgICAweGMyNzViN2I3VSwgMHgxY2UxZmRmZFUsIDB4YWUzZDkzOTNVLCAweDZhNGMyNjI2VSwKLSAgICAweDVhNmMzNjM2VSwgMHg0MTdlM2YzZlUsIDB4MDJmNWY3ZjdVLCAweDRmODNjY2NjVSwKLSAgICAweDVjNjgzNDM0VSwgMHhmNDUxYTVhNVUsIDB4MzRkMWU1ZTVVLCAweDA4ZjlmMWYxVSwKLSAgICAweDkzZTI3MTcxVSwgMHg3M2FiZDhkOFUsIDB4NTM2MjMxMzFVLCAweDNmMmExNTE1VSwKLSAgICAweDBjMDgwNDA0VSwgMHg1Mjk1YzdjN1UsIDB4NjU0NjIzMjNVLCAweDVlOWRjM2MzVSwKLSAgICAweDI4MzAxODE4VSwgMHhhMTM3OTY5NlUsIDB4MGYwYTA1MDVVLCAweGI1MmY5YTlhVSwKLSAgICAweDA5MGUwNzA3VSwgMHgzNjI0MTIxMlUsIDB4OWIxYjgwODBVLCAweDNkZGZlMmUyVSwKLSAgICAweDI2Y2RlYmViVSwgMHg2OTRlMjcyN1UsIDB4Y2Q3ZmIyYjJVLCAweDlmZWE3NTc1VSwKLSAgICAweDFiMTIwOTA5VSwgMHg5ZTFkODM4M1UsIDB4NzQ1ODJjMmNVLCAweDJlMzQxYTFhVSwKLSAgICAweDJkMzYxYjFiVSwgMHhiMmRjNmU2ZVUsIDB4ZWViNDVhNWFVLCAweGZiNWJhMGEwVSwKLSAgICAweGY2YTQ1MjUyVSwgMHg0ZDc2M2IzYlUsIDB4NjFiN2Q2ZDZVLCAweGNlN2RiM2IzVSwKLSAgICAweDdiNTIyOTI5VSwgMHgzZWRkZTNlM1UsIDB4NzE1ZTJmMmZVLCAweDk3MTM4NDg0VSwKLSAgICAweGY1YTY1MzUzVSwgMHg2OGI5ZDFkMVUsIDB4MDAwMDAwMDBVLCAweDJjYzFlZGVkVSwKLSAgICAweDYwNDAyMDIwVSwgMHgxZmUzZmNmY1UsIDB4Yzg3OWIxYjFVLCAweGVkYjY1YjViVSwKLSAgICAweGJlZDQ2YTZhVSwgMHg0NjhkY2JjYlUsIDB4ZDk2N2JlYmVVLCAweDRiNzIzOTM5VSwKLSAgICAweGRlOTQ0YTRhVSwgMHhkNDk4NGM0Y1UsIDB4ZThiMDU4NThVLCAweDRhODVjZmNmVSwKLSAgICAweDZiYmJkMGQwVSwgMHgyYWM1ZWZlZlUsIDB4ZTU0ZmFhYWFVLCAweDE2ZWRmYmZiVSwKLSAgICAweGM1ODY0MzQzVSwgMHhkNzlhNGQ0ZFUsIDB4NTU2NjMzMzNVLCAweDk0MTE4NTg1VSwKLSAgICAweGNmOGE0NTQ1VSwgMHgxMGU5ZjlmOVUsIDB4MDYwNDAyMDJVLCAweDgxZmU3ZjdmVSwKLSAgICAweGYwYTA1MDUwVSwgMHg0NDc4M2MzY1UsIDB4YmEyNTlmOWZVLCAweGUzNGJhOGE4VSwKLSAgICAweGYzYTI1MTUxVSwgMHhmZTVkYTNhM1UsIDB4YzA4MDQwNDBVLCAweDhhMDU4ZjhmVSwKLSAgICAweGFkM2Y5MjkyVSwgMHhiYzIxOWQ5ZFUsIDB4NDg3MDM4MzhVLCAweDA0ZjFmNWY1VSwKLSAgICAweGRmNjNiY2JjVSwgMHhjMTc3YjZiNlUsIDB4NzVhZmRhZGFVLCAweDYzNDIyMTIxVSwKLSAgICAweDMwMjAxMDEwVSwgMHgxYWU1ZmZmZlUsIDB4MGVmZGYzZjNVLCAweDZkYmZkMmQyVSwKLSAgICAweDRjODFjZGNkVSwgMHgxNDE4MGMwY1UsIDB4MzUyNjEzMTNVLCAweDJmYzNlY2VjVSwKLSAgICAweGUxYmU1ZjVmVSwgMHhhMjM1OTc5N1UsIDB4Y2M4ODQ0NDRVLCAweDM5MmUxNzE3VSwKLSAgICAweDU3OTNjNGM0VSwgMHhmMjU1YTdhN1UsIDB4ODJmYzdlN2VVLCAweDQ3N2EzZDNkVSwKLSAgICAweGFjYzg2NDY0VSwgMHhlN2JhNWQ1ZFUsIDB4MmIzMjE5MTlVLCAweDk1ZTY3MzczVSwKLSAgICAweGEwYzA2MDYwVSwgMHg5ODE5ODE4MVUsIDB4ZDE5ZTRmNGZVLCAweDdmYTNkY2RjVSwKLSAgICAweDY2NDQyMjIyVSwgMHg3ZTU0MmEyYVUsIDB4YWIzYjkwOTBVLCAweDgzMGI4ODg4VSwKLSAgICAweGNhOGM0NjQ2VSwgMHgyOWM3ZWVlZVUsIDB4ZDM2YmI4YjhVLCAweDNjMjgxNDE0VSwKLSAgICAweDc5YTdkZWRlVSwgMHhlMmJjNWU1ZVUsIDB4MWQxNjBiMGJVLCAweDc2YWRkYmRiVSwKLSAgICAweDNiZGJlMGUwVSwgMHg1NjY0MzIzMlUsIDB4NGU3NDNhM2FVLCAweDFlMTQwYTBhVSwKLSAgICAweGRiOTI0OTQ5VSwgMHgwYTBjMDYwNlUsIDB4NmM0ODI0MjRVLCAweGU0Yjg1YzVjVSwKLSAgICAweDVkOWZjMmMyVSwgMHg2ZWJkZDNkM1UsIDB4ZWY0M2FjYWNVLCAweGE2YzQ2MjYyVSwKLSAgICAweGE4Mzk5MTkxVSwgMHhhNDMxOTU5NVUsIDB4MzdkM2U0ZTRVLCAweDhiZjI3OTc5VSwKLSAgICAweDMyZDVlN2U3VSwgMHg0MzhiYzhjOFUsIDB4NTk2ZTM3MzdVLCAweGI3ZGE2ZDZkVSwKLSAgICAweDhjMDE4ZDhkVSwgMHg2NGIxZDVkNVUsIDB4ZDI5YzRlNGVVLCAweGUwNDlhOWE5VSwKLSAgICAweGI0ZDg2YzZjVSwgMHhmYWFjNTY1NlUsIDB4MDdmM2Y0ZjRVLCAweDI1Y2ZlYWVhVSwKLSAgICAweGFmY2E2NTY1VSwgMHg4ZWY0N2E3YVUsIDB4ZTk0N2FlYWVVLCAweDE4MTAwODA4VSwKLSAgICAweGQ1NmZiYWJhVSwgMHg4OGYwNzg3OFUsIDB4NmY0YTI1MjVVLCAweDcyNWMyZTJlVSwKLSAgICAweDI0MzgxYzFjVSwgMHhmMTU3YTZhNlUsIDB4Yzc3M2I0YjRVLCAweDUxOTdjNmM2VSwKLSAgICAweDIzY2JlOGU4VSwgMHg3Y2ExZGRkZFUsIDB4OWNlODc0NzRVLCAweDIxM2UxZjFmVSwKLSAgICAweGRkOTY0YjRiVSwgMHhkYzYxYmRiZFUsIDB4ODYwZDhiOGJVLCAweDg1MGY4YThhVSwKLSAgICAweDkwZTA3MDcwVSwgMHg0MjdjM2UzZVUsIDB4YzQ3MWI1YjVVLCAweGFhY2M2NjY2VSwKLSAgICAweGQ4OTA0ODQ4VSwgMHgwNTA2MDMwM1UsIDB4MDFmN2Y2ZjZVLCAweDEyMWMwZTBlVSwKLSAgICAweGEzYzI2MTYxVSwgMHg1ZjZhMzUzNVUsIDB4ZjlhZTU3NTdVLCAweGQwNjliOWI5VSwKLSAgICAweDkxMTc4Njg2VSwgMHg1ODk5YzFjMVUsIDB4MjczYTFkMWRVLCAweGI5Mjc5ZTllVSwKLSAgICAweDM4ZDllMWUxVSwgMHgxM2ViZjhmOFUsIDB4YjMyYjk4OThVLCAweDMzMjIxMTExVSwKLSAgICAweGJiZDI2OTY5VSwgMHg3MGE5ZDlkOVUsIDB4ODkwNzhlOGVVLCAweGE3MzM5NDk0VSwKLSAgICAweGI2MmQ5YjliVSwgMHgyMjNjMWUxZVUsIDB4OTIxNTg3ODdVLCAweDIwYzllOWU5VSwKLSAgICAweDQ5ODdjZWNlVSwgMHhmZmFhNTU1NVUsIDB4Nzg1MDI4MjhVLCAweDdhYTVkZmRmVSwKLSAgICAweDhmMDM4YzhjVSwgMHhmODU5YTFhMVUsIDB4ODAwOTg5ODlVLCAweDE3MWEwZDBkVSwKLSAgICAweGRhNjViZmJmVSwgMHgzMWQ3ZTZlNlUsIDB4YzY4NDQyNDJVLCAweGI4ZDA2ODY4VSwKLSAgICAweGMzODI0MTQxVSwgMHhiMDI5OTk5OVUsIDB4Nzc1YTJkMmRVLCAweDExMWUwZjBmVSwKLSAgICAweGNiN2JiMGIwVSwgMHhmY2E4NTQ1NFUsIDB4ZDY2ZGJiYmJVLCAweDNhMmMxNjE2VSwKLX07Ci1zdGF0aWMgY29uc3QgdTMyIFRlMlsyNTZdID0gewotICAgIDB4NjNhNWM2NjNVLCAweDdjODRmODdjVSwgMHg3Nzk5ZWU3N1UsIDB4N2I4ZGY2N2JVLAotICAgIDB4ZjIwZGZmZjJVLCAweDZiYmRkNjZiVSwgMHg2ZmIxZGU2ZlUsIDB4YzU1NDkxYzVVLAotICAgIDB4MzA1MDYwMzBVLCAweDAxMDMwMjAxVSwgMHg2N2E5Y2U2N1UsIDB4MmI3ZDU2MmJVLAotICAgIDB4ZmUxOWU3ZmVVLCAweGQ3NjJiNWQ3VSwgMHhhYmU2NGRhYlUsIDB4NzY5YWVjNzZVLAotICAgIDB4Y2E0NThmY2FVLCAweDgyOWQxZjgyVSwgMHhjOTQwODljOVUsIDB4N2Q4N2ZhN2RVLAotICAgIDB4ZmExNWVmZmFVLCAweDU5ZWJiMjU5VSwgMHg0N2M5OGU0N1UsIDB4ZjAwYmZiZjBVLAotICAgIDB4YWRlYzQxYWRVLCAweGQ0NjdiM2Q0VSwgMHhhMmZkNWZhMlUsIDB4YWZlYTQ1YWZVLAotICAgIDB4OWNiZjIzOWNVLCAweGE0Zjc1M2E0VSwgMHg3Mjk2ZTQ3MlUsIDB4YzA1YjliYzBVLAotICAgIDB4YjdjMjc1YjdVLCAweGZkMWNlMWZkVSwgMHg5M2FlM2Q5M1UsIDB4MjY2YTRjMjZVLAotICAgIDB4MzY1YTZjMzZVLCAweDNmNDE3ZTNmVSwgMHhmNzAyZjVmN1UsIDB4Y2M0ZjgzY2NVLAotICAgIDB4MzQ1YzY4MzRVLCAweGE1ZjQ1MWE1VSwgMHhlNTM0ZDFlNVUsIDB4ZjEwOGY5ZjFVLAotICAgIDB4NzE5M2UyNzFVLCAweGQ4NzNhYmQ4VSwgMHgzMTUzNjIzMVUsIDB4MTUzZjJhMTVVLAotICAgIDB4MDQwYzA4MDRVLCAweGM3NTI5NWM3VSwgMHgyMzY1NDYyM1UsIDB4YzM1ZTlkYzNVLAotICAgIDB4MTgyODMwMThVLCAweDk2YTEzNzk2VSwgMHgwNTBmMGEwNVUsIDB4OWFiNTJmOWFVLAotICAgIDB4MDcwOTBlMDdVLCAweDEyMzYyNDEyVSwgMHg4MDliMWI4MFUsIDB4ZTIzZGRmZTJVLAotICAgIDB4ZWIyNmNkZWJVLCAweDI3Njk0ZTI3VSwgMHhiMmNkN2ZiMlUsIDB4NzU5ZmVhNzVVLAotICAgIDB4MDkxYjEyMDlVLCAweDgzOWUxZDgzVSwgMHgyYzc0NTgyY1UsIDB4MWEyZTM0MWFVLAotICAgIDB4MWIyZDM2MWJVLCAweDZlYjJkYzZlVSwgMHg1YWVlYjQ1YVUsIDB4YTBmYjViYTBVLAotICAgIDB4NTJmNmE0NTJVLCAweDNiNGQ3NjNiVSwgMHhkNjYxYjdkNlUsIDB4YjNjZTdkYjNVLAotICAgIDB4Mjk3YjUyMjlVLCAweGUzM2VkZGUzVSwgMHgyZjcxNWUyZlUsIDB4ODQ5NzEzODRVLAotICAgIDB4NTNmNWE2NTNVLCAweGQxNjhiOWQxVSwgMHgwMDAwMDAwMFUsIDB4ZWQyY2MxZWRVLAotICAgIDB4MjA2MDQwMjBVLCAweGZjMWZlM2ZjVSwgMHhiMWM4NzliMVUsIDB4NWJlZGI2NWJVLAotICAgIDB4NmFiZWQ0NmFVLCAweGNiNDY4ZGNiVSwgMHhiZWQ5NjdiZVUsIDB4Mzk0YjcyMzlVLAotICAgIDB4NGFkZTk0NGFVLCAweDRjZDQ5ODRjVSwgMHg1OGU4YjA1OFUsIDB4Y2Y0YTg1Y2ZVLAotICAgIDB4ZDA2YmJiZDBVLCAweGVmMmFjNWVmVSwgMHhhYWU1NGZhYVUsIDB4ZmIxNmVkZmJVLAotICAgIDB4NDNjNTg2NDNVLCAweDRkZDc5YTRkVSwgMHgzMzU1NjYzM1UsIDB4ODU5NDExODVVLAotICAgIDB4NDVjZjhhNDVVLCAweGY5MTBlOWY5VSwgMHgwMjA2MDQwMlUsIDB4N2Y4MWZlN2ZVLAotICAgIDB4NTBmMGEwNTBVLCAweDNjNDQ3ODNjVSwgMHg5ZmJhMjU5ZlUsIDB4YThlMzRiYThVLAotICAgIDB4NTFmM2EyNTFVLCAweGEzZmU1ZGEzVSwgMHg0MGMwODA0MFUsIDB4OGY4YTA1OGZVLAotICAgIDB4OTJhZDNmOTJVLCAweDlkYmMyMTlkVSwgMHgzODQ4NzAzOFUsIDB4ZjUwNGYxZjVVLAotICAgIDB4YmNkZjYzYmNVLCAweGI2YzE3N2I2VSwgMHhkYTc1YWZkYVUsIDB4MjE2MzQyMjFVLAotICAgIDB4MTAzMDIwMTBVLCAweGZmMWFlNWZmVSwgMHhmMzBlZmRmM1UsIDB4ZDI2ZGJmZDJVLAotICAgIDB4Y2Q0YzgxY2RVLCAweDBjMTQxODBjVSwgMHgxMzM1MjYxM1UsIDB4ZWMyZmMzZWNVLAotICAgIDB4NWZlMWJlNWZVLCAweDk3YTIzNTk3VSwgMHg0NGNjODg0NFUsIDB4MTczOTJlMTdVLAotICAgIDB4YzQ1NzkzYzRVLCAweGE3ZjI1NWE3VSwgMHg3ZTgyZmM3ZVUsIDB4M2Q0NzdhM2RVLAotICAgIDB4NjRhY2M4NjRVLCAweDVkZTdiYTVkVSwgMHgxOTJiMzIxOVUsIDB4NzM5NWU2NzNVLAotICAgIDB4NjBhMGMwNjBVLCAweDgxOTgxOTgxVSwgMHg0ZmQxOWU0ZlUsIDB4ZGM3ZmEzZGNVLAotICAgIDB4MjI2NjQ0MjJVLCAweDJhN2U1NDJhVSwgMHg5MGFiM2I5MFUsIDB4ODg4MzBiODhVLAotICAgIDB4NDZjYThjNDZVLCAweGVlMjljN2VlVSwgMHhiOGQzNmJiOFUsIDB4MTQzYzI4MTRVLAotICAgIDB4ZGU3OWE3ZGVVLCAweDVlZTJiYzVlVSwgMHgwYjFkMTYwYlUsIDB4ZGI3NmFkZGJVLAotICAgIDB4ZTAzYmRiZTBVLCAweDMyNTY2NDMyVSwgMHgzYTRlNzQzYVUsIDB4MGExZTE0MGFVLAotICAgIDB4NDlkYjkyNDlVLCAweDA2MGEwYzA2VSwgMHgyNDZjNDgyNFUsIDB4NWNlNGI4NWNVLAotICAgIDB4YzI1ZDlmYzJVLCAweGQzNmViZGQzVSwgMHhhY2VmNDNhY1UsIDB4NjJhNmM0NjJVLAotICAgIDB4OTFhODM5OTFVLCAweDk1YTQzMTk1VSwgMHhlNDM3ZDNlNFUsIDB4Nzk4YmYyNzlVLAotICAgIDB4ZTczMmQ1ZTdVLCAweGM4NDM4YmM4VSwgMHgzNzU5NmUzN1UsIDB4NmRiN2RhNmRVLAotICAgIDB4OGQ4YzAxOGRVLCAweGQ1NjRiMWQ1VSwgMHg0ZWQyOWM0ZVUsIDB4YTllMDQ5YTlVLAotICAgIDB4NmNiNGQ4NmNVLCAweDU2ZmFhYzU2VSwgMHhmNDA3ZjNmNFUsIDB4ZWEyNWNmZWFVLAotICAgIDB4NjVhZmNhNjVVLCAweDdhOGVmNDdhVSwgMHhhZWU5NDdhZVUsIDB4MDgxODEwMDhVLAotICAgIDB4YmFkNTZmYmFVLCAweDc4ODhmMDc4VSwgMHgyNTZmNGEyNVUsIDB4MmU3MjVjMmVVLAotICAgIDB4MWMyNDM4MWNVLCAweGE2ZjE1N2E2VSwgMHhiNGM3NzNiNFUsIDB4YzY1MTk3YzZVLAotICAgIDB4ZTgyM2NiZThVLCAweGRkN2NhMWRkVSwgMHg3NDljZTg3NFUsIDB4MWYyMTNlMWZVLAotICAgIDB4NGJkZDk2NGJVLCAweGJkZGM2MWJkVSwgMHg4Yjg2MGQ4YlUsIDB4OGE4NTBmOGFVLAotICAgIDB4NzA5MGUwNzBVLCAweDNlNDI3YzNlVSwgMHhiNWM0NzFiNVUsIDB4NjZhYWNjNjZVLAotICAgIDB4NDhkODkwNDhVLCAweDAzMDUwNjAzVSwgMHhmNjAxZjdmNlUsIDB4MGUxMjFjMGVVLAotICAgIDB4NjFhM2MyNjFVLCAweDM1NWY2YTM1VSwgMHg1N2Y5YWU1N1UsIDB4YjlkMDY5YjlVLAotICAgIDB4ODY5MTE3ODZVLCAweGMxNTg5OWMxVSwgMHgxZDI3M2ExZFUsIDB4OWViOTI3OWVVLAotICAgIDB4ZTEzOGQ5ZTFVLCAweGY4MTNlYmY4VSwgMHg5OGIzMmI5OFUsIDB4MTEzMzIyMTFVLAotICAgIDB4NjliYmQyNjlVLCAweGQ5NzBhOWQ5VSwgMHg4ZTg5MDc4ZVUsIDB4OTRhNzMzOTRVLAotICAgIDB4OWJiNjJkOWJVLCAweDFlMjIzYzFlVSwgMHg4NzkyMTU4N1UsIDB4ZTkyMGM5ZTlVLAotICAgIDB4Y2U0OTg3Y2VVLCAweDU1ZmZhYTU1VSwgMHgyODc4NTAyOFUsIDB4ZGY3YWE1ZGZVLAotICAgIDB4OGM4ZjAzOGNVLCAweGExZjg1OWExVSwgMHg4OTgwMDk4OVUsIDB4MGQxNzFhMGRVLAotICAgIDB4YmZkYTY1YmZVLCAweGU2MzFkN2U2VSwgMHg0MmM2ODQ0MlUsIDB4NjhiOGQwNjhVLAotICAgIDB4NDFjMzgyNDFVLCAweDk5YjAyOTk5VSwgMHgyZDc3NWEyZFUsIDB4MGYxMTFlMGZVLAotICAgIDB4YjBjYjdiYjBVLCAweDU0ZmNhODU0VSwgMHhiYmQ2NmRiYlUsIDB4MTYzYTJjMTZVLAotfTsKLXN0YXRpYyBjb25zdCB1MzIgVGUzWzI1Nl0gPSB7Ci0KLSAgICAweDYzNjNhNWM2VSwgMHg3YzdjODRmOFUsIDB4Nzc3Nzk5ZWVVLCAweDdiN2I4ZGY2VSwKLSAgICAweGYyZjIwZGZmVSwgMHg2YjZiYmRkNlUsIDB4NmY2ZmIxZGVVLCAweGM1YzU1NDkxVSwKLSAgICAweDMwMzA1MDYwVSwgMHgwMTAxMDMwMlUsIDB4Njc2N2E5Y2VVLCAweDJiMmI3ZDU2VSwKLSAgICAweGZlZmUxOWU3VSwgMHhkN2Q3NjJiNVUsIDB4YWJhYmU2NGRVLCAweDc2NzY5YWVjVSwKLSAgICAweGNhY2E0NThmVSwgMHg4MjgyOWQxZlUsIDB4YzljOTQwODlVLCAweDdkN2Q4N2ZhVSwKLSAgICAweGZhZmExNWVmVSwgMHg1OTU5ZWJiMlUsIDB4NDc0N2M5OGVVLCAweGYwZjAwYmZiVSwKLSAgICAweGFkYWRlYzQxVSwgMHhkNGQ0NjdiM1UsIDB4YTJhMmZkNWZVLCAweGFmYWZlYTQ1VSwKLSAgICAweDljOWNiZjIzVSwgMHhhNGE0Zjc1M1UsIDB4NzI3Mjk2ZTRVLCAweGMwYzA1YjliVSwKLSAgICAweGI3YjdjMjc1VSwgMHhmZGZkMWNlMVUsIDB4OTM5M2FlM2RVLCAweDI2MjY2YTRjVSwKLSAgICAweDM2MzY1YTZjVSwgMHgzZjNmNDE3ZVUsIDB4ZjdmNzAyZjVVLCAweGNjY2M0ZjgzVSwKLSAgICAweDM0MzQ1YzY4VSwgMHhhNWE1ZjQ1MVUsIDB4ZTVlNTM0ZDFVLCAweGYxZjEwOGY5VSwKLSAgICAweDcxNzE5M2UyVSwgMHhkOGQ4NzNhYlUsIDB4MzEzMTUzNjJVLCAweDE1MTUzZjJhVSwKLSAgICAweDA0MDQwYzA4VSwgMHhjN2M3NTI5NVUsIDB4MjMyMzY1NDZVLCAweGMzYzM1ZTlkVSwKLSAgICAweDE4MTgyODMwVSwgMHg5Njk2YTEzN1UsIDB4MDUwNTBmMGFVLCAweDlhOWFiNTJmVSwKLSAgICAweDA3MDcwOTBlVSwgMHgxMjEyMzYyNFUsIDB4ODA4MDliMWJVLCAweGUyZTIzZGRmVSwKLSAgICAweGViZWIyNmNkVSwgMHgyNzI3Njk0ZVUsIDB4YjJiMmNkN2ZVLCAweDc1NzU5ZmVhVSwKLSAgICAweDA5MDkxYjEyVSwgMHg4MzgzOWUxZFUsIDB4MmMyYzc0NThVLCAweDFhMWEyZTM0VSwKLSAgICAweDFiMWIyZDM2VSwgMHg2ZTZlYjJkY1UsIDB4NWE1YWVlYjRVLCAweGEwYTBmYjViVSwKLSAgICAweDUyNTJmNmE0VSwgMHgzYjNiNGQ3NlUsIDB4ZDZkNjYxYjdVLCAweGIzYjNjZTdkVSwKLSAgICAweDI5Mjk3YjUyVSwgMHhlM2UzM2VkZFUsIDB4MmYyZjcxNWVVLCAweDg0ODQ5NzEzVSwKLSAgICAweDUzNTNmNWE2VSwgMHhkMWQxNjhiOVUsIDB4MDAwMDAwMDBVLCAweGVkZWQyY2MxVSwKLSAgICAweDIwMjA2MDQwVSwgMHhmY2ZjMWZlM1UsIDB4YjFiMWM4NzlVLCAweDViNWJlZGI2VSwKLSAgICAweDZhNmFiZWQ0VSwgMHhjYmNiNDY4ZFUsIDB4YmViZWQ5NjdVLCAweDM5Mzk0YjcyVSwKLSAgICAweDRhNGFkZTk0VSwgMHg0YzRjZDQ5OFUsIDB4NTg1OGU4YjBVLCAweGNmY2Y0YTg1VSwKLSAgICAweGQwZDA2YmJiVSwgMHhlZmVmMmFjNVUsIDB4YWFhYWU1NGZVLCAweGZiZmIxNmVkVSwKLSAgICAweDQzNDNjNTg2VSwgMHg0ZDRkZDc5YVUsIDB4MzMzMzU1NjZVLCAweDg1ODU5NDExVSwKLSAgICAweDQ1NDVjZjhhVSwgMHhmOWY5MTBlOVUsIDB4MDIwMjA2MDRVLCAweDdmN2Y4MWZlVSwKLSAgICAweDUwNTBmMGEwVSwgMHgzYzNjNDQ3OFUsIDB4OWY5ZmJhMjVVLCAweGE4YThlMzRiVSwKLSAgICAweDUxNTFmM2EyVSwgMHhhM2EzZmU1ZFUsIDB4NDA0MGMwODBVLCAweDhmOGY4YTA1VSwKLSAgICAweDkyOTJhZDNmVSwgMHg5ZDlkYmMyMVUsIDB4MzgzODQ4NzBVLCAweGY1ZjUwNGYxVSwKLSAgICAweGJjYmNkZjYzVSwgMHhiNmI2YzE3N1UsIDB4ZGFkYTc1YWZVLCAweDIxMjE2MzQyVSwKLSAgICAweDEwMTAzMDIwVSwgMHhmZmZmMWFlNVUsIDB4ZjNmMzBlZmRVLCAweGQyZDI2ZGJmVSwKLSAgICAweGNkY2Q0YzgxVSwgMHgwYzBjMTQxOFUsIDB4MTMxMzM1MjZVLCAweGVjZWMyZmMzVSwKLSAgICAweDVmNWZlMWJlVSwgMHg5Nzk3YTIzNVUsIDB4NDQ0NGNjODhVLCAweDE3MTczOTJlVSwKLSAgICAweGM0YzQ1NzkzVSwgMHhhN2E3ZjI1NVUsIDB4N2U3ZTgyZmNVLCAweDNkM2Q0NzdhVSwKLSAgICAweDY0NjRhY2M4VSwgMHg1ZDVkZTdiYVUsIDB4MTkxOTJiMzJVLCAweDczNzM5NWU2VSwKLSAgICAweDYwNjBhMGMwVSwgMHg4MTgxOTgxOVUsIDB4NGY0ZmQxOWVVLCAweGRjZGM3ZmEzVSwKLSAgICAweDIyMjI2NjQ0VSwgMHgyYTJhN2U1NFUsIDB4OTA5MGFiM2JVLCAweDg4ODg4MzBiVSwKLSAgICAweDQ2NDZjYThjVSwgMHhlZWVlMjljN1UsIDB4YjhiOGQzNmJVLCAweDE0MTQzYzI4VSwKLSAgICAweGRlZGU3OWE3VSwgMHg1ZTVlZTJiY1UsIDB4MGIwYjFkMTZVLCAweGRiZGI3NmFkVSwKLSAgICAweGUwZTAzYmRiVSwgMHgzMjMyNTY2NFUsIDB4M2EzYTRlNzRVLCAweDBhMGExZTE0VSwKLSAgICAweDQ5NDlkYjkyVSwgMHgwNjA2MGEwY1UsIDB4MjQyNDZjNDhVLCAweDVjNWNlNGI4VSwKLSAgICAweGMyYzI1ZDlmVSwgMHhkM2QzNmViZFUsIDB4YWNhY2VmNDNVLCAweDYyNjJhNmM0VSwKLSAgICAweDkxOTFhODM5VSwgMHg5NTk1YTQzMVUsIDB4ZTRlNDM3ZDNVLCAweDc5Nzk4YmYyVSwKLSAgICAweGU3ZTczMmQ1VSwgMHhjOGM4NDM4YlUsIDB4MzczNzU5NmVVLCAweDZkNmRiN2RhVSwKLSAgICAweDhkOGQ4YzAxVSwgMHhkNWQ1NjRiMVUsIDB4NGU0ZWQyOWNVLCAweGE5YTllMDQ5VSwKLSAgICAweDZjNmNiNGQ4VSwgMHg1NjU2ZmFhY1UsIDB4ZjRmNDA3ZjNVLCAweGVhZWEyNWNmVSwKLSAgICAweDY1NjVhZmNhVSwgMHg3YTdhOGVmNFUsIDB4YWVhZWU5NDdVLCAweDA4MDgxODEwVSwKLSAgICAweGJhYmFkNTZmVSwgMHg3ODc4ODhmMFUsIDB4MjUyNTZmNGFVLCAweDJlMmU3MjVjVSwKLSAgICAweDFjMWMyNDM4VSwgMHhhNmE2ZjE1N1UsIDB4YjRiNGM3NzNVLCAweGM2YzY1MTk3VSwKLSAgICAweGU4ZTgyM2NiVSwgMHhkZGRkN2NhMVUsIDB4NzQ3NDljZThVLCAweDFmMWYyMTNlVSwKLSAgICAweDRiNGJkZDk2VSwgMHhiZGJkZGM2MVUsIDB4OGI4Yjg2MGRVLCAweDhhOGE4NTBmVSwKLSAgICAweDcwNzA5MGUwVSwgMHgzZTNlNDI3Y1UsIDB4YjViNWM0NzFVLCAweDY2NjZhYWNjVSwKLSAgICAweDQ4NDhkODkwVSwgMHgwMzAzMDUwNlUsIDB4ZjZmNjAxZjdVLCAweDBlMGUxMjFjVSwKLSAgICAweDYxNjFhM2MyVSwgMHgzNTM1NWY2YVUsIDB4NTc1N2Y5YWVVLCAweGI5YjlkMDY5VSwKLSAgICAweDg2ODY5MTE3VSwgMHhjMWMxNTg5OVUsIDB4MWQxZDI3M2FVLCAweDllOWViOTI3VSwKLSAgICAweGUxZTEzOGQ5VSwgMHhmOGY4MTNlYlUsIDB4OTg5OGIzMmJVLCAweDExMTEzMzIyVSwKLSAgICAweDY5NjliYmQyVSwgMHhkOWQ5NzBhOVUsIDB4OGU4ZTg5MDdVLCAweDk0OTRhNzMzVSwKLSAgICAweDliOWJiNjJkVSwgMHgxZTFlMjIzY1UsIDB4ODc4NzkyMTVVLCAweGU5ZTkyMGM5VSwKLSAgICAweGNlY2U0OTg3VSwgMHg1NTU1ZmZhYVUsIDB4MjgyODc4NTBVLCAweGRmZGY3YWE1VSwKLSAgICAweDhjOGM4ZjAzVSwgMHhhMWExZjg1OVUsIDB4ODk4OTgwMDlVLCAweDBkMGQxNzFhVSwKLSAgICAweGJmYmZkYTY1VSwgMHhlNmU2MzFkN1UsIDB4NDI0MmM2ODRVLCAweDY4NjhiOGQwVSwKLSAgICAweDQxNDFjMzgyVSwgMHg5OTk5YjAyOVUsIDB4MmQyZDc3NWFVLCAweDBmMGYxMTFlVSwKLSAgICAweGIwYjBjYjdiVSwgMHg1NDU0ZmNhOFUsIDB4YmJiYmQ2NmRVLCAweDE2MTYzYTJjVSwKLX07Ci1zdGF0aWMgY29uc3QgdTMyIFRlNFsyNTZdID0gewotICAgIDB4NjM2MzYzNjNVLCAweDdjN2M3YzdjVSwgMHg3Nzc3Nzc3N1UsIDB4N2I3YjdiN2JVLAotICAgIDB4ZjJmMmYyZjJVLCAweDZiNmI2YjZiVSwgMHg2ZjZmNmY2ZlUsIDB4YzVjNWM1YzVVLAotICAgIDB4MzAzMDMwMzBVLCAweDAxMDEwMTAxVSwgMHg2NzY3Njc2N1UsIDB4MmIyYjJiMmJVLAotICAgIDB4ZmVmZWZlZmVVLCAweGQ3ZDdkN2Q3VSwgMHhhYmFiYWJhYlUsIDB4NzY3Njc2NzZVLAotICAgIDB4Y2FjYWNhY2FVLCAweDgyODI4MjgyVSwgMHhjOWM5YzljOVUsIDB4N2Q3ZDdkN2RVLAotICAgIDB4ZmFmYWZhZmFVLCAweDU5NTk1OTU5VSwgMHg0NzQ3NDc0N1UsIDB4ZjBmMGYwZjBVLAotICAgIDB4YWRhZGFkYWRVLCAweGQ0ZDRkNGQ0VSwgMHhhMmEyYTJhMlUsIDB4YWZhZmFmYWZVLAotICAgIDB4OWM5YzljOWNVLCAweGE0YTRhNGE0VSwgMHg3MjcyNzI3MlUsIDB4YzBjMGMwYzBVLAotICAgIDB4YjdiN2I3YjdVLCAweGZkZmRmZGZkVSwgMHg5MzkzOTM5M1UsIDB4MjYyNjI2MjZVLAotICAgIDB4MzYzNjM2MzZVLCAweDNmM2YzZjNmVSwgMHhmN2Y3ZjdmN1UsIDB4Y2NjY2NjY2NVLAotICAgIDB4MzQzNDM0MzRVLCAweGE1YTVhNWE1VSwgMHhlNWU1ZTVlNVUsIDB4ZjFmMWYxZjFVLAotICAgIDB4NzE3MTcxNzFVLCAweGQ4ZDhkOGQ4VSwgMHgzMTMxMzEzMVUsIDB4MTUxNTE1MTVVLAotICAgIDB4MDQwNDA0MDRVLCAweGM3YzdjN2M3VSwgMHgyMzIzMjMyM1UsIDB4YzNjM2MzYzNVLAotICAgIDB4MTgxODE4MThVLCAweDk2OTY5Njk2VSwgMHgwNTA1MDUwNVUsIDB4OWE5YTlhOWFVLAotICAgIDB4MDcwNzA3MDdVLCAweDEyMTIxMjEyVSwgMHg4MDgwODA4MFUsIDB4ZTJlMmUyZTJVLAotICAgIDB4ZWJlYmViZWJVLCAweDI3MjcyNzI3VSwgMHhiMmIyYjJiMlUsIDB4NzU3NTc1NzVVLAotICAgIDB4MDkwOTA5MDlVLCAweDgzODM4MzgzVSwgMHgyYzJjMmMyY1UsIDB4MWExYTFhMWFVLAotICAgIDB4MWIxYjFiMWJVLCAweDZlNmU2ZTZlVSwgMHg1YTVhNWE1YVUsIDB4YTBhMGEwYTBVLAotICAgIDB4NTI1MjUyNTJVLCAweDNiM2IzYjNiVSwgMHhkNmQ2ZDZkNlUsIDB4YjNiM2IzYjNVLAotICAgIDB4MjkyOTI5MjlVLCAweGUzZTNlM2UzVSwgMHgyZjJmMmYyZlUsIDB4ODQ4NDg0ODRVLAotICAgIDB4NTM1MzUzNTNVLCAweGQxZDFkMWQxVSwgMHgwMDAwMDAwMFUsIDB4ZWRlZGVkZWRVLAotICAgIDB4MjAyMDIwMjBVLCAweGZjZmNmY2ZjVSwgMHhiMWIxYjFiMVUsIDB4NWI1YjViNWJVLAotICAgIDB4NmE2YTZhNmFVLCAweGNiY2JjYmNiVSwgMHhiZWJlYmViZVUsIDB4MzkzOTM5MzlVLAotICAgIDB4NGE0YTRhNGFVLCAweDRjNGM0YzRjVSwgMHg1ODU4NTg1OFUsIDB4Y2ZjZmNmY2ZVLAotICAgIDB4ZDBkMGQwZDBVLCAweGVmZWZlZmVmVSwgMHhhYWFhYWFhYVUsIDB4ZmJmYmZiZmJVLAotICAgIDB4NDM0MzQzNDNVLCAweDRkNGQ0ZDRkVSwgMHgzMzMzMzMzM1UsIDB4ODU4NTg1ODVVLAotICAgIDB4NDU0NTQ1NDVVLCAweGY5ZjlmOWY5VSwgMHgwMjAyMDIwMlUsIDB4N2Y3ZjdmN2ZVLAotICAgIDB4NTA1MDUwNTBVLCAweDNjM2MzYzNjVSwgMHg5ZjlmOWY5ZlUsIDB4YThhOGE4YThVLAotICAgIDB4NTE1MTUxNTFVLCAweGEzYTNhM2EzVSwgMHg0MDQwNDA0MFUsIDB4OGY4ZjhmOGZVLAotICAgIDB4OTI5MjkyOTJVLCAweDlkOWQ5ZDlkVSwgMHgzODM4MzgzOFUsIDB4ZjVmNWY1ZjVVLAotICAgIDB4YmNiY2JjYmNVLCAweGI2YjZiNmI2VSwgMHhkYWRhZGFkYVUsIDB4MjEyMTIxMjFVLAotICAgIDB4MTAxMDEwMTBVLCAweGZmZmZmZmZmVSwgMHhmM2YzZjNmM1UsIDB4ZDJkMmQyZDJVLAotICAgIDB4Y2RjZGNkY2RVLCAweDBjMGMwYzBjVSwgMHgxMzEzMTMxM1UsIDB4ZWNlY2VjZWNVLAotICAgIDB4NWY1ZjVmNWZVLCAweDk3OTc5Nzk3VSwgMHg0NDQ0NDQ0NFUsIDB4MTcxNzE3MTdVLAotICAgIDB4YzRjNGM0YzRVLCAweGE3YTdhN2E3VSwgMHg3ZTdlN2U3ZVUsIDB4M2QzZDNkM2RVLAotICAgIDB4NjQ2NDY0NjRVLCAweDVkNWQ1ZDVkVSwgMHgxOTE5MTkxOVUsIDB4NzM3MzczNzNVLAotICAgIDB4NjA2MDYwNjBVLCAweDgxODE4MTgxVSwgMHg0ZjRmNGY0ZlUsIDB4ZGNkY2RjZGNVLAotICAgIDB4MjIyMjIyMjJVLCAweDJhMmEyYTJhVSwgMHg5MDkwOTA5MFUsIDB4ODg4ODg4ODhVLAotICAgIDB4NDY0NjQ2NDZVLCAweGVlZWVlZWVlVSwgMHhiOGI4YjhiOFUsIDB4MTQxNDE0MTRVLAotICAgIDB4ZGVkZWRlZGVVLCAweDVlNWU1ZTVlVSwgMHgwYjBiMGIwYlUsIDB4ZGJkYmRiZGJVLAotICAgIDB4ZTBlMGUwZTBVLCAweDMyMzIzMjMyVSwgMHgzYTNhM2EzYVUsIDB4MGEwYTBhMGFVLAotICAgIDB4NDk0OTQ5NDlVLCAweDA2MDYwNjA2VSwgMHgyNDI0MjQyNFUsIDB4NWM1YzVjNWNVLAotICAgIDB4YzJjMmMyYzJVLCAweGQzZDNkM2QzVSwgMHhhY2FjYWNhY1UsIDB4NjI2MjYyNjJVLAotICAgIDB4OTE5MTkxOTFVLCAweDk1OTU5NTk1VSwgMHhlNGU0ZTRlNFUsIDB4Nzk3OTc5NzlVLAotICAgIDB4ZTdlN2U3ZTdVLCAweGM4YzhjOGM4VSwgMHgzNzM3MzczN1UsIDB4NmQ2ZDZkNmRVLAotICAgIDB4OGQ4ZDhkOGRVLCAweGQ1ZDVkNWQ1VSwgMHg0ZTRlNGU0ZVUsIDB4YTlhOWE5YTlVLAotICAgIDB4NmM2YzZjNmNVLCAweDU2NTY1NjU2VSwgMHhmNGY0ZjRmNFUsIDB4ZWFlYWVhZWFVLAotICAgIDB4NjU2NTY1NjVVLCAweDdhN2E3YTdhVSwgMHhhZWFlYWVhZVUsIDB4MDgwODA4MDhVLAotICAgIDB4YmFiYWJhYmFVLCAweDc4Nzg3ODc4VSwgMHgyNTI1MjUyNVUsIDB4MmUyZTJlMmVVLAotICAgIDB4MWMxYzFjMWNVLCAweGE2YTZhNmE2VSwgMHhiNGI0YjRiNFUsIDB4YzZjNmM2YzZVLAotICAgIDB4ZThlOGU4ZThVLCAweGRkZGRkZGRkVSwgMHg3NDc0NzQ3NFUsIDB4MWYxZjFmMWZVLAotICAgIDB4NGI0YjRiNGJVLCAweGJkYmRiZGJkVSwgMHg4YjhiOGI4YlUsIDB4OGE4YThhOGFVLAotICAgIDB4NzA3MDcwNzBVLCAweDNlM2UzZTNlVSwgMHhiNWI1YjViNVUsIDB4NjY2NjY2NjZVLAotICAgIDB4NDg0ODQ4NDhVLCAweDAzMDMwMzAzVSwgMHhmNmY2ZjZmNlUsIDB4MGUwZTBlMGVVLAotICAgIDB4NjE2MTYxNjFVLCAweDM1MzUzNTM1VSwgMHg1NzU3NTc1N1UsIDB4YjliOWI5YjlVLAotICAgIDB4ODY4Njg2ODZVLCAweGMxYzFjMWMxVSwgMHgxZDFkMWQxZFUsIDB4OWU5ZTllOWVVLAotICAgIDB4ZTFlMWUxZTFVLCAweGY4ZjhmOGY4VSwgMHg5ODk4OTg5OFUsIDB4MTExMTExMTFVLAotICAgIDB4Njk2OTY5NjlVLCAweGQ5ZDlkOWQ5VSwgMHg4ZThlOGU4ZVUsIDB4OTQ5NDk0OTRVLAotICAgIDB4OWI5YjliOWJVLCAweDFlMWUxZTFlVSwgMHg4Nzg3ODc4N1UsIDB4ZTllOWU5ZTlVLAotICAgIDB4Y2VjZWNlY2VVLCAweDU1NTU1NTU1VSwgMHgyODI4MjgyOFUsIDB4ZGZkZmRmZGZVLAotICAgIDB4OGM4YzhjOGNVLCAweGExYTFhMWExVSwgMHg4OTg5ODk4OVUsIDB4MGQwZDBkMGRVLAotICAgIDB4YmZiZmJmYmZVLCAweGU2ZTZlNmU2VSwgMHg0MjQyNDI0MlUsIDB4Njg2ODY4NjhVLAotICAgIDB4NDE0MTQxNDFVLCAweDk5OTk5OTk5VSwgMHgyZDJkMmQyZFUsIDB4MGYwZjBmMGZVLAotICAgIDB4YjBiMGIwYjBVLCAweDU0NTQ1NDU0VSwgMHhiYmJiYmJiYlUsIDB4MTYxNjE2MTZVLAotfTsKLXN0YXRpYyBjb25zdCB1MzIgVGQwWzI1Nl0gPSB7Ci0gICAgMHg1MWY0YTc1MFUsIDB4N2U0MTY1NTNVLCAweDFhMTdhNGMzVSwgMHgzYTI3NWU5NlUsCi0gICAgMHgzYmFiNmJjYlUsIDB4MWY5ZDQ1ZjFVLCAweGFjZmE1OGFiVSwgMHg0YmUzMDM5M1UsCi0gICAgMHgyMDMwZmE1NVUsIDB4YWQ3NjZkZjZVLCAweDg4Y2M3NjkxVSwgMHhmNTAyNGMyNVUsCi0gICAgMHg0ZmU1ZDdmY1UsIDB4YzUyYWNiZDdVLCAweDI2MzU0NDgwVSwgMHhiNTYyYTM4ZlUsCi0gICAgMHhkZWIxNWE0OVUsIDB4MjViYTFiNjdVLCAweDQ1ZWEwZTk4VSwgMHg1ZGZlYzBlMVUsCi0gICAgMHhjMzJmNzUwMlUsIDB4ODE0Y2YwMTJVLCAweDhkNDY5N2EzVSwgMHg2YmQzZjljNlUsCi0gICAgMHgwMzhmNWZlN1UsIDB4MTU5MjljOTVVLCAweGJmNmQ3YWViVSwgMHg5NTUyNTlkYVUsCi0gICAgMHhkNGJlODMyZFUsIDB4NTg3NDIxZDNVLCAweDQ5ZTA2OTI5VSwgMHg4ZWM5Yzg0NFUsCi0gICAgMHg3NWMyODk2YVUsIDB4ZjQ4ZTc5NzhVLCAweDk5NTgzZTZiVSwgMHgyN2I5NzFkZFUsCi0gICAgMHhiZWUxNGZiNlUsIDB4ZjA4OGFkMTdVLCAweGM5MjBhYzY2VSwgMHg3ZGNlM2FiNFUsCi0gICAgMHg2M2RmNGExOFUsIDB4ZTUxYTMxODJVLCAweDk3NTEzMzYwVSwgMHg2MjUzN2Y0NVUsCi0gICAgMHhiMTY0NzdlMFUsIDB4YmI2YmFlODRVLCAweGZlODFhMDFjVSwgMHhmOTA4MmI5NFUsCi0gICAgMHg3MDQ4Njg1OFUsIDB4OGY0NWZkMTlVLCAweDk0ZGU2Yzg3VSwgMHg1MjdiZjhiN1UsCi0gICAgMHhhYjczZDMyM1UsIDB4NzI0YjAyZTJVLCAweGUzMWY4ZjU3VSwgMHg2NjU1YWIyYVUsCi0gICAgMHhiMmViMjgwN1UsIDB4MmZiNWMyMDNVLCAweDg2YzU3YjlhVSwgMHhkMzM3MDhhNVUsCi0gICAgMHgzMDI4ODdmMlUsIDB4MjNiZmE1YjJVLCAweDAyMDM2YWJhVSwgMHhlZDE2ODI1Y1UsCi0gICAgMHg4YWNmMWMyYlUsIDB4YTc3OWI0OTJVLCAweGYzMDdmMmYwVSwgMHg0ZTY5ZTJhMVUsCi0gICAgMHg2NWRhZjRjZFUsIDB4MDYwNWJlZDVVLCAweGQxMzQ2MjFmVSwgMHhjNGE2ZmU4YVUsCi0gICAgMHgzNDJlNTM5ZFUsIDB4YTJmMzU1YTBVLCAweDA1OGFlMTMyVSwgMHhhNGY2ZWI3NVUsCi0gICAgMHgwYjgzZWMzOVUsIDB4NDA2MGVmYWFVLCAweDVlNzE5ZjA2VSwgMHhiZDZlMTA1MVUsCi0gICAgMHgzZTIxOGFmOVUsIDB4OTZkZDA2M2RVLCAweGRkM2UwNWFlVSwgMHg0ZGU2YmQ0NlUsCi0gICAgMHg5MTU0OGRiNVUsIDB4NzFjNDVkMDVVLCAweDA0MDZkNDZmVSwgMHg2MDUwMTVmZlUsCi0gICAgMHgxOTk4ZmIyNFUsIDB4ZDZiZGU5OTdVLCAweDg5NDA0M2NjVSwgMHg2N2Q5OWU3N1UsCi0gICAgMHhiMGU4NDJiZFUsIDB4MDc4OThiODhVLCAweGU3MTk1YjM4VSwgMHg3OWM4ZWVkYlUsCi0gICAgMHhhMTdjMGE0N1UsIDB4N2M0MjBmZTlVLCAweGY4ODQxZWM5VSwgMHgwMDAwMDAwMFUsCi0gICAgMHgwOTgwODY4M1UsIDB4MzIyYmVkNDhVLCAweDFlMTE3MGFjVSwgMHg2YzVhNzI0ZVUsCi0gICAgMHhmZDBlZmZmYlUsIDB4MGY4NTM4NTZVLCAweDNkYWVkNTFlVSwgMHgzNjJkMzkyN1UsCi0gICAgMHgwYTBmZDk2NFUsIDB4Njg1Y2E2MjFVLCAweDliNWI1NGQxVSwgMHgyNDM2MmUzYVUsCi0gICAgMHgwYzBhNjdiMVUsIDB4OTM1N2U3MGZVLCAweGI0ZWU5NmQyVSwgMHgxYjliOTE5ZVUsCi0gICAgMHg4MGMwYzU0ZlUsIDB4NjFkYzIwYTJVLCAweDVhNzc0YjY5VSwgMHgxYzEyMWExNlUsCi0gICAgMHhlMjkzYmEwYVUsIDB4YzBhMDJhZTVVLCAweDNjMjJlMDQzVSwgMHgxMjFiMTcxZFUsCi0gICAgMHgwZTA5MGQwYlUsIDB4ZjI4YmM3YWRVLCAweDJkYjZhOGI5VSwgMHgxNDFlYTljOFUsCi0gICAgMHg1N2YxMTk4NVUsIDB4YWY3NTA3NGNVLCAweGVlOTlkZGJiVSwgMHhhMzdmNjBmZFUsCi0gICAgMHhmNzAxMjY5ZlUsIDB4NWM3MmY1YmNVLCAweDQ0NjYzYmM1VSwgMHg1YmZiN2UzNFUsCi0gICAgMHg4YjQzMjk3NlUsIDB4Y2IyM2M2ZGNVLCAweGI2ZWRmYzY4VSwgMHhiOGU0ZjE2M1UsCi0gICAgMHhkNzMxZGNjYVUsIDB4NDI2Mzg1MTBVLCAweDEzOTcyMjQwVSwgMHg4NGM2MTEyMFUsCi0gICAgMHg4NTRhMjQ3ZFUsIDB4ZDJiYjNkZjhVLCAweGFlZjkzMjExVSwgMHhjNzI5YTE2ZFUsCi0gICAgMHgxZDllMmY0YlUsIDB4ZGNiMjMwZjNVLCAweDBkODY1MmVjVSwgMHg3N2MxZTNkMFUsCi0gICAgMHgyYmIzMTY2Y1UsIDB4YTk3MGI5OTlVLCAweDExOTQ0OGZhVSwgMHg0N2U5NjQyMlUsCi0gICAgMHhhOGZjOGNjNFUsIDB4YTBmMDNmMWFVLCAweDU2N2QyY2Q4VSwgMHgyMjMzOTBlZlUsCi0gICAgMHg4NzQ5NGVjN1UsIDB4ZDkzOGQxYzFVLCAweDhjY2FhMmZlVSwgMHg5OGQ0MGIzNlUsCi0gICAgMHhhNmY1ODFjZlUsIDB4YTU3YWRlMjhVLCAweGRhYjc4ZTI2VSwgMHgzZmFkYmZhNFUsCi0gICAgMHgyYzNhOWRlNFUsIDB4NTA3ODkyMGRVLCAweDZhNWZjYzliVSwgMHg1NDdlNDY2MlUsCi0gICAgMHhmNjhkMTNjMlUsIDB4OTBkOGI4ZThVLCAweDJlMzlmNzVlVSwgMHg4MmMzYWZmNVUsCi0gICAgMHg5ZjVkODBiZVUsIDB4NjlkMDkzN2NVLCAweDZmZDUyZGE5VSwgMHhjZjI1MTJiM1UsCi0gICAgMHhjOGFjOTkzYlUsIDB4MTAxODdkYTdVLCAweGU4OWM2MzZlVSwgMHhkYjNiYmI3YlUsCi0gICAgMHhjZDI2NzgwOVUsIDB4NmU1OTE4ZjRVLCAweGVjOWFiNzAxVSwgMHg4MzRmOWFhOFUsCi0gICAgMHhlNjk1NmU2NVUsIDB4YWFmZmU2N2VVLCAweDIxYmNjZjA4VSwgMHhlZjE1ZThlNlUsCi0gICAgMHhiYWU3OWJkOVUsIDB4NGE2ZjM2Y2VVLCAweGVhOWYwOWQ0VSwgMHgyOWIwN2NkNlUsCi0gICAgMHgzMWE0YjJhZlUsIDB4MmEzZjIzMzFVLCAweGM2YTU5NDMwVSwgMHgzNWEyNjZjMFUsCi0gICAgMHg3NDRlYmMzN1UsIDB4ZmM4MmNhYTZVLCAweGUwOTBkMGIwVSwgMHgzM2E3ZDgxNVUsCi0gICAgMHhmMTA0OTg0YVUsIDB4NDFlY2RhZjdVLCAweDdmY2Q1MDBlVSwgMHgxNzkxZjYyZlUsCi0gICAgMHg3NjRkZDY4ZFUsIDB4NDNlZmIwNGRVLCAweGNjYWE0ZDU0VSwgMHhlNDk2MDRkZlUsCi0gICAgMHg5ZWQxYjVlM1UsIDB4NGM2YTg4MWJVLCAweGMxMmMxZmI4VSwgMHg0NjY1NTE3ZlUsCi0gICAgMHg5ZDVlZWEwNFUsIDB4MDE4YzM1NWRVLCAweGZhODc3NDczVSwgMHhmYjBiNDEyZVUsCi0gICAgMHhiMzY3MWQ1YVUsIDB4OTJkYmQyNTJVLCAweGU5MTA1NjMzVSwgMHg2ZGQ2NDcxM1UsCi0gICAgMHg5YWQ3NjE4Y1UsIDB4MzdhMTBjN2FVLCAweDU5ZjgxNDhlVSwgMHhlYjEzM2M4OVUsCi0gICAgMHhjZWE5MjdlZVUsIDB4Yjc2MWM5MzVVLCAweGUxMWNlNWVkVSwgMHg3YTQ3YjEzY1UsCi0gICAgMHg5Y2QyZGY1OVUsIDB4NTVmMjczM2ZVLCAweDE4MTRjZTc5VSwgMHg3M2M3MzdiZlUsCi0gICAgMHg1M2Y3Y2RlYVUsIDB4NWZmZGFhNWJVLCAweGRmM2Q2ZjE0VSwgMHg3ODQ0ZGI4NlUsCi0gICAgMHhjYWFmZjM4MVUsIDB4Yjk2OGM0M2VVLCAweDM4MjQzNDJjVSwgMHhjMmEzNDA1ZlUsCi0gICAgMHgxNjFkYzM3MlUsIDB4YmNlMjI1MGNVLCAweDI4M2M0OThiVSwgMHhmZjBkOTU0MVUsCi0gICAgMHgzOWE4MDE3MVUsIDB4MDgwY2IzZGVVLCAweGQ4YjRlNDljVSwgMHg2NDU2YzE5MFUsCi0gICAgMHg3YmNiODQ2MVUsIDB4ZDUzMmI2NzBVLCAweDQ4NmM1Yzc0VSwgMHhkMGI4NTc0MlUsCi19Owotc3RhdGljIGNvbnN0IHUzMiBUZDFbMjU2XSA9IHsKLSAgICAweDUwNTFmNGE3VSwgMHg1MzdlNDE2NVUsIDB4YzMxYTE3YTRVLCAweDk2M2EyNzVlVSwKLSAgICAweGNiM2JhYjZiVSwgMHhmMTFmOWQ0NVUsIDB4YWJhY2ZhNThVLCAweDkzNGJlMzAzVSwKLSAgICAweDU1MjAzMGZhVSwgMHhmNmFkNzY2ZFUsIDB4OTE4OGNjNzZVLCAweDI1ZjUwMjRjVSwKLSAgICAweGZjNGZlNWQ3VSwgMHhkN2M1MmFjYlUsIDB4ODAyNjM1NDRVLCAweDhmYjU2MmEzVSwKLSAgICAweDQ5ZGViMTVhVSwgMHg2NzI1YmExYlUsIDB4OTg0NWVhMGVVLCAweGUxNWRmZWMwVSwKLSAgICAweDAyYzMyZjc1VSwgMHgxMjgxNGNmMFUsIDB4YTM4ZDQ2OTdVLCAweGM2NmJkM2Y5VSwKLSAgICAweGU3MDM4ZjVmVSwgMHg5NTE1OTI5Y1UsIDB4ZWJiZjZkN2FVLCAweGRhOTU1MjU5VSwKLSAgICAweDJkZDRiZTgzVSwgMHhkMzU4NzQyMVUsIDB4Mjk0OWUwNjlVLCAweDQ0OGVjOWM4VSwKLSAgICAweDZhNzVjMjg5VSwgMHg3OGY0OGU3OVUsIDB4NmI5OTU4M2VVLCAweGRkMjdiOTcxVSwKLSAgICAweGI2YmVlMTRmVSwgMHgxN2YwODhhZFUsIDB4NjZjOTIwYWNVLCAweGI0N2RjZTNhVSwKLSAgICAweDE4NjNkZjRhVSwgMHg4MmU1MWEzMVUsIDB4NjA5NzUxMzNVLCAweDQ1NjI1MzdmVSwKLSAgICAweGUwYjE2NDc3VSwgMHg4NGJiNmJhZVUsIDB4MWNmZTgxYTBVLCAweDk0ZjkwODJiVSwKLSAgICAweDU4NzA0ODY4VSwgMHgxOThmNDVmZFUsIDB4ODc5NGRlNmNVLCAweGI3NTI3YmY4VSwKLSAgICAweDIzYWI3M2QzVSwgMHhlMjcyNGIwMlUsIDB4NTdlMzFmOGZVLCAweDJhNjY1NWFiVSwKLSAgICAweDA3YjJlYjI4VSwgMHgwMzJmYjVjMlUsIDB4OWE4NmM1N2JVLCAweGE1ZDMzNzA4VSwKLSAgICAweGYyMzAyODg3VSwgMHhiMjIzYmZhNVUsIDB4YmEwMjAzNmFVLCAweDVjZWQxNjgyVSwKLSAgICAweDJiOGFjZjFjVSwgMHg5MmE3NzliNFUsIDB4ZjBmMzA3ZjJVLCAweGExNGU2OWUyVSwKLSAgICAweGNkNjVkYWY0VSwgMHhkNTA2MDViZVUsIDB4MWZkMTM0NjJVLCAweDhhYzRhNmZlVSwKLSAgICAweDlkMzQyZTUzVSwgMHhhMGEyZjM1NVUsIDB4MzIwNThhZTFVLCAweDc1YTRmNmViVSwKLSAgICAweDM5MGI4M2VjVSwgMHhhYTQwNjBlZlUsIDB4MDY1ZTcxOWZVLCAweDUxYmQ2ZTEwVSwKLSAgICAweGY5M2UyMThhVSwgMHgzZDk2ZGQwNlUsIDB4YWVkZDNlMDVVLCAweDQ2NGRlNmJkVSwKLSAgICAweGI1OTE1NDhkVSwgMHgwNTcxYzQ1ZFUsIDB4NmYwNDA2ZDRVLCAweGZmNjA1MDE1VSwKLSAgICAweDI0MTk5OGZiVSwgMHg5N2Q2YmRlOVUsIDB4Y2M4OTQwNDNVLCAweDc3NjdkOTllVSwKLSAgICAweGJkYjBlODQyVSwgMHg4ODA3ODk4YlUsIDB4MzhlNzE5NWJVLCAweGRiNzljOGVlVSwKLSAgICAweDQ3YTE3YzBhVSwgMHhlOTdjNDIwZlUsIDB4YzlmODg0MWVVLCAweDAwMDAwMDAwVSwKLSAgICAweDgzMDk4MDg2VSwgMHg0ODMyMmJlZFUsIDB4YWMxZTExNzBVLCAweDRlNmM1YTcyVSwKLSAgICAweGZiZmQwZWZmVSwgMHg1NjBmODUzOFUsIDB4MWUzZGFlZDVVLCAweDI3MzYyZDM5VSwKLSAgICAweDY0MGEwZmQ5VSwgMHgyMTY4NWNhNlUsIDB4ZDE5YjViNTRVLCAweDNhMjQzNjJlVSwKLSAgICAweGIxMGMwYTY3VSwgMHgwZjkzNTdlN1UsIDB4ZDJiNGVlOTZVLCAweDllMWI5YjkxVSwKLSAgICAweDRmODBjMGM1VSwgMHhhMjYxZGMyMFUsIDB4Njk1YTc3NGJVLCAweDE2MWMxMjFhVSwKLSAgICAweDBhZTI5M2JhVSwgMHhlNWMwYTAyYVUsIDB4NDMzYzIyZTBVLCAweDFkMTIxYjE3VSwKLSAgICAweDBiMGUwOTBkVSwgMHhhZGYyOGJjN1UsIDB4YjkyZGI2YThVLCAweGM4MTQxZWE5VSwKLSAgICAweDg1NTdmMTE5VSwgMHg0Y2FmNzUwN1UsIDB4YmJlZTk5ZGRVLCAweGZkYTM3ZjYwVSwKLSAgICAweDlmZjcwMTI2VSwgMHhiYzVjNzJmNVUsIDB4YzU0NDY2M2JVLCAweDM0NWJmYjdlVSwKLSAgICAweDc2OGI0MzI5VSwgMHhkY2NiMjNjNlUsIDB4NjhiNmVkZmNVLCAweDYzYjhlNGYxVSwKLSAgICAweGNhZDczMWRjVSwgMHgxMDQyNjM4NVUsIDB4NDAxMzk3MjJVLCAweDIwODRjNjExVSwKLSAgICAweDdkODU0YTI0VSwgMHhmOGQyYmIzZFUsIDB4MTFhZWY5MzJVLCAweDZkYzcyOWExVSwKLSAgICAweDRiMWQ5ZTJmVSwgMHhmM2RjYjIzMFUsIDB4ZWMwZDg2NTJVLCAweGQwNzdjMWUzVSwKLSAgICAweDZjMmJiMzE2VSwgMHg5OWE5NzBiOVUsIDB4ZmExMTk0NDhVLCAweDIyNDdlOTY0VSwKLSAgICAweGM0YThmYzhjVSwgMHgxYWEwZjAzZlUsIDB4ZDg1NjdkMmNVLCAweGVmMjIzMzkwVSwKLSAgICAweGM3ODc0OTRlVSwgMHhjMWQ5MzhkMVUsIDB4ZmU4Y2NhYTJVLCAweDM2OThkNDBiVSwKLSAgICAweGNmYTZmNTgxVSwgMHgyOGE1N2FkZVUsIDB4MjZkYWI3OGVVLCAweGE0M2ZhZGJmVSwKLSAgICAweGU0MmMzYTlkVSwgMHgwZDUwNzg5MlUsIDB4OWI2YTVmY2NVLCAweDYyNTQ3ZTQ2VSwKLSAgICAweGMyZjY4ZDEzVSwgMHhlODkwZDhiOFUsIDB4NWUyZTM5ZjdVLCAweGY1ODJjM2FmVSwKLSAgICAweGJlOWY1ZDgwVSwgMHg3YzY5ZDA5M1UsIDB4YTk2ZmQ1MmRVLCAweGIzY2YyNTEyVSwKLSAgICAweDNiYzhhYzk5VSwgMHhhNzEwMTg3ZFUsIDB4NmVlODljNjNVLCAweDdiZGIzYmJiVSwKLSAgICAweDA5Y2QyNjc4VSwgMHhmNDZlNTkxOFUsIDB4MDFlYzlhYjdVLCAweGE4ODM0ZjlhVSwKLSAgICAweDY1ZTY5NTZlVSwgMHg3ZWFhZmZlNlUsIDB4MDgyMWJjY2ZVLCAweGU2ZWYxNWU4VSwKLSAgICAweGQ5YmFlNzliVSwgMHhjZTRhNmYzNlUsIDB4ZDRlYTlmMDlVLCAweGQ2MjliMDdjVSwKLSAgICAweGFmMzFhNGIyVSwgMHgzMTJhM2YyM1UsIDB4MzBjNmE1OTRVLCAweGMwMzVhMjY2VSwKLSAgICAweDM3NzQ0ZWJjVSwgMHhhNmZjODJjYVUsIDB4YjBlMDkwZDBVLCAweDE1MzNhN2Q4VSwKLSAgICAweDRhZjEwNDk4VSwgMHhmNzQxZWNkYVUsIDB4MGU3ZmNkNTBVLCAweDJmMTc5MWY2VSwKLSAgICAweDhkNzY0ZGQ2VSwgMHg0ZDQzZWZiMFUsIDB4NTRjY2FhNGRVLCAweGRmZTQ5NjA0VSwKLSAgICAweGUzOWVkMWI1VSwgMHgxYjRjNmE4OFUsIDB4YjhjMTJjMWZVLCAweDdmNDY2NTUxVSwKLSAgICAweDA0OWQ1ZWVhVSwgMHg1ZDAxOGMzNVUsIDB4NzNmYTg3NzRVLCAweDJlZmIwYjQxVSwKLSAgICAweDVhYjM2NzFkVSwgMHg1MjkyZGJkMlUsIDB4MzNlOTEwNTZVLCAweDEzNmRkNjQ3VSwKLSAgICAweDhjOWFkNzYxVSwgMHg3YTM3YTEwY1UsIDB4OGU1OWY4MTRVLCAweDg5ZWIxMzNjVSwKLSAgICAweGVlY2VhOTI3VSwgMHgzNWI3NjFjOVUsIDB4ZWRlMTFjZTVVLCAweDNjN2E0N2IxVSwKLSAgICAweDU5OWNkMmRmVSwgMHgzZjU1ZjI3M1UsIDB4NzkxODE0Y2VVLCAweGJmNzNjNzM3VSwKLSAgICAweGVhNTNmN2NkVSwgMHg1YjVmZmRhYVUsIDB4MTRkZjNkNmZVLCAweDg2Nzg0NGRiVSwKLSAgICAweDgxY2FhZmYzVSwgMHgzZWI5NjhjNFUsIDB4MmMzODI0MzRVLCAweDVmYzJhMzQwVSwKLSAgICAweDcyMTYxZGMzVSwgMHgwY2JjZTIyNVUsIDB4OGIyODNjNDlVLCAweDQxZmYwZDk1VSwKLSAgICAweDcxMzlhODAxVSwgMHhkZTA4MGNiM1UsIDB4OWNkOGI0ZTRVLCAweDkwNjQ1NmMxVSwKLSAgICAweDYxN2JjYjg0VSwgMHg3MGQ1MzJiNlUsIDB4NzQ0ODZjNWNVLCAweDQyZDBiODU3VSwKLX07Ci1zdGF0aWMgY29uc3QgdTMyIFRkMlsyNTZdID0gewotICAgIDB4YTc1MDUxZjRVLCAweDY1NTM3ZTQxVSwgMHhhNGMzMWExN1UsIDB4NWU5NjNhMjdVLAotICAgIDB4NmJjYjNiYWJVLCAweDQ1ZjExZjlkVSwgMHg1OGFiYWNmYVUsIDB4MDM5MzRiZTNVLAotICAgIDB4ZmE1NTIwMzBVLCAweDZkZjZhZDc2VSwgMHg3NjkxODhjY1UsIDB4NGMyNWY1MDJVLAotICAgIDB4ZDdmYzRmZTVVLCAweGNiZDdjNTJhVSwgMHg0NDgwMjYzNVUsIDB4YTM4ZmI1NjJVLAotICAgIDB4NWE0OWRlYjFVLCAweDFiNjcyNWJhVSwgMHgwZTk4NDVlYVUsIDB4YzBlMTVkZmVVLAotICAgIDB4NzUwMmMzMmZVLCAweGYwMTI4MTRjVSwgMHg5N2EzOGQ0NlUsIDB4ZjljNjZiZDNVLAotICAgIDB4NWZlNzAzOGZVLCAweDljOTUxNTkyVSwgMHg3YWViYmY2ZFUsIDB4NTlkYTk1NTJVLAotICAgIDB4ODMyZGQ0YmVVLCAweDIxZDM1ODc0VSwgMHg2OTI5NDllMFUsIDB4Yzg0NDhlYzlVLAotICAgIDB4ODk2YTc1YzJVLCAweDc5NzhmNDhlVSwgMHgzZTZiOTk1OFUsIDB4NzFkZDI3YjlVLAotICAgIDB4NGZiNmJlZTFVLCAweGFkMTdmMDg4VSwgMHhhYzY2YzkyMFUsIDB4M2FiNDdkY2VVLAotICAgIDB4NGExODYzZGZVLCAweDMxODJlNTFhVSwgMHgzMzYwOTc1MVUsIDB4N2Y0NTYyNTNVLAotICAgIDB4NzdlMGIxNjRVLCAweGFlODRiYjZiVSwgMHhhMDFjZmU4MVUsIDB4MmI5NGY5MDhVLAotICAgIDB4Njg1ODcwNDhVLCAweGZkMTk4ZjQ1VSwgMHg2Yzg3OTRkZVUsIDB4ZjhiNzUyN2JVLAotICAgIDB4ZDMyM2FiNzNVLCAweDAyZTI3MjRiVSwgMHg4ZjU3ZTMxZlUsIDB4YWIyYTY2NTVVLAotICAgIDB4MjgwN2IyZWJVLCAweGMyMDMyZmI1VSwgMHg3YjlhODZjNVUsIDB4MDhhNWQzMzdVLAotICAgIDB4ODdmMjMwMjhVLCAweGE1YjIyM2JmVSwgMHg2YWJhMDIwM1UsIDB4ODI1Y2VkMTZVLAotICAgIDB4MWMyYjhhY2ZVLCAweGI0OTJhNzc5VSwgMHhmMmYwZjMwN1UsIDB4ZTJhMTRlNjlVLAotICAgIDB4ZjRjZDY1ZGFVLCAweGJlZDUwNjA1VSwgMHg2MjFmZDEzNFUsIDB4ZmU4YWM0YTZVLAotICAgIDB4NTM5ZDM0MmVVLCAweDU1YTBhMmYzVSwgMHhlMTMyMDU4YVUsIDB4ZWI3NWE0ZjZVLAotICAgIDB4ZWMzOTBiODNVLCAweGVmYWE0MDYwVSwgMHg5ZjA2NWU3MVUsIDB4MTA1MWJkNmVVLAotCi0gICAgMHg4YWY5M2UyMVUsIDB4MDYzZDk2ZGRVLCAweDA1YWVkZDNlVSwgMHhiZDQ2NGRlNlUsCi0gICAgMHg4ZGI1OTE1NFUsIDB4NWQwNTcxYzRVLCAweGQ0NmYwNDA2VSwgMHgxNWZmNjA1MFUsCi0gICAgMHhmYjI0MTk5OFUsIDB4ZTk5N2Q2YmRVLCAweDQzY2M4OTQwVSwgMHg5ZTc3NjdkOVUsCi0gICAgMHg0MmJkYjBlOFUsIDB4OGI4ODA3ODlVLCAweDViMzhlNzE5VSwgMHhlZWRiNzljOFUsCi0gICAgMHgwYTQ3YTE3Y1UsIDB4MGZlOTdjNDJVLCAweDFlYzlmODg0VSwgMHgwMDAwMDAwMFUsCi0gICAgMHg4NjgzMDk4MFUsIDB4ZWQ0ODMyMmJVLCAweDcwYWMxZTExVSwgMHg3MjRlNmM1YVUsCi0gICAgMHhmZmZiZmQwZVUsIDB4Mzg1NjBmODVVLCAweGQ1MWUzZGFlVSwgMHgzOTI3MzYyZFUsCi0gICAgMHhkOTY0MGEwZlUsIDB4YTYyMTY4NWNVLCAweDU0ZDE5YjViVSwgMHgyZTNhMjQzNlUsCi0gICAgMHg2N2IxMGMwYVUsIDB4ZTcwZjkzNTdVLCAweDk2ZDJiNGVlVSwgMHg5MTllMWI5YlUsCi0gICAgMHhjNTRmODBjMFUsIDB4MjBhMjYxZGNVLCAweDRiNjk1YTc3VSwgMHgxYTE2MWMxMlUsCi0gICAgMHhiYTBhZTI5M1UsIDB4MmFlNWMwYTBVLCAweGUwNDMzYzIyVSwgMHgxNzFkMTIxYlUsCi0gICAgMHgwZDBiMGUwOVUsIDB4YzdhZGYyOGJVLCAweGE4YjkyZGI2VSwgMHhhOWM4MTQxZVUsCi0gICAgMHgxOTg1NTdmMVUsIDB4MDc0Y2FmNzVVLCAweGRkYmJlZTk5VSwgMHg2MGZkYTM3ZlUsCi0gICAgMHgyNjlmZjcwMVUsIDB4ZjViYzVjNzJVLCAweDNiYzU0NDY2VSwgMHg3ZTM0NWJmYlUsCi0gICAgMHgyOTc2OGI0M1UsIDB4YzZkY2NiMjNVLCAweGZjNjhiNmVkVSwgMHhmMTYzYjhlNFUsCi0gICAgMHhkY2NhZDczMVUsIDB4ODUxMDQyNjNVLCAweDIyNDAxMzk3VSwgMHgxMTIwODRjNlUsCi0gICAgMHgyNDdkODU0YVUsIDB4M2RmOGQyYmJVLCAweDMyMTFhZWY5VSwgMHhhMTZkYzcyOVUsCi0gICAgMHgyZjRiMWQ5ZVUsIDB4MzBmM2RjYjJVLCAweDUyZWMwZDg2VSwgMHhlM2QwNzdjMVUsCi0gICAgMHgxNjZjMmJiM1UsIDB4Yjk5OWE5NzBVLCAweDQ4ZmExMTk0VSwgMHg2NDIyNDdlOVUsCi0gICAgMHg4Y2M0YThmY1UsIDB4M2YxYWEwZjBVLCAweDJjZDg1NjdkVSwgMHg5MGVmMjIzM1UsCi0gICAgMHg0ZWM3ODc0OVUsIDB4ZDFjMWQ5MzhVLCAweGEyZmU4Y2NhVSwgMHgwYjM2OThkNFUsCi0gICAgMHg4MWNmYTZmNVUsIDB4ZGUyOGE1N2FVLCAweDhlMjZkYWI3VSwgMHhiZmE0M2ZhZFUsCi0gICAgMHg5ZGU0MmMzYVUsIDB4OTIwZDUwNzhVLCAweGNjOWI2YTVmVSwgMHg0NjYyNTQ3ZVUsCi0gICAgMHgxM2MyZjY4ZFUsIDB4YjhlODkwZDhVLCAweGY3NWUyZTM5VSwgMHhhZmY1ODJjM1UsCi0gICAgMHg4MGJlOWY1ZFUsIDB4OTM3YzY5ZDBVLCAweDJkYTk2ZmQ1VSwgMHgxMmIzY2YyNVUsCi0gICAgMHg5OTNiYzhhY1UsIDB4N2RhNzEwMThVLCAweDYzNmVlODljVSwgMHhiYjdiZGIzYlUsCi0gICAgMHg3ODA5Y2QyNlUsIDB4MThmNDZlNTlVLCAweGI3MDFlYzlhVSwgMHg5YWE4ODM0ZlUsCi0gICAgMHg2ZTY1ZTY5NVUsIDB4ZTY3ZWFhZmZVLCAweGNmMDgyMWJjVSwgMHhlOGU2ZWYxNVUsCi0gICAgMHg5YmQ5YmFlN1UsIDB4MzZjZTRhNmZVLCAweDA5ZDRlYTlmVSwgMHg3Y2Q2MjliMFUsCi0gICAgMHhiMmFmMzFhNFUsIDB4MjMzMTJhM2ZVLCAweDk0MzBjNmE1VSwgMHg2NmMwMzVhMlUsCi0gICAgMHhiYzM3NzQ0ZVUsIDB4Y2FhNmZjODJVLCAweGQwYjBlMDkwVSwgMHhkODE1MzNhN1UsCi0gICAgMHg5ODRhZjEwNFUsIDB4ZGFmNzQxZWNVLCAweDUwMGU3ZmNkVSwgMHhmNjJmMTc5MVUsCi0gICAgMHhkNjhkNzY0ZFUsIDB4YjA0ZDQzZWZVLCAweDRkNTRjY2FhVSwgMHgwNGRmZTQ5NlUsCi0gICAgMHhiNWUzOWVkMVUsIDB4ODgxYjRjNmFVLCAweDFmYjhjMTJjVSwgMHg1MTdmNDY2NVUsCi0gICAgMHhlYTA0OWQ1ZVUsIDB4MzU1ZDAxOGNVLCAweDc0NzNmYTg3VSwgMHg0MTJlZmIwYlUsCi0gICAgMHgxZDVhYjM2N1UsIDB4ZDI1MjkyZGJVLCAweDU2MzNlOTEwVSwgMHg0NzEzNmRkNlUsCi0gICAgMHg2MThjOWFkN1UsIDB4MGM3YTM3YTFVLCAweDE0OGU1OWY4VSwgMHgzYzg5ZWIxM1UsCi0gICAgMHgyN2VlY2VhOVUsIDB4YzkzNWI3NjFVLCAweGU1ZWRlMTFjVSwgMHhiMTNjN2E0N1UsCi0gICAgMHhkZjU5OWNkMlUsIDB4NzMzZjU1ZjJVLCAweGNlNzkxODE0VSwgMHgzN2JmNzNjN1UsCi0gICAgMHhjZGVhNTNmN1UsIDB4YWE1YjVmZmRVLCAweDZmMTRkZjNkVSwgMHhkYjg2Nzg0NFUsCi0gICAgMHhmMzgxY2FhZlUsIDB4YzQzZWI5NjhVLCAweDM0MmMzODI0VSwgMHg0MDVmYzJhM1UsCi0gICAgMHhjMzcyMTYxZFUsIDB4MjUwY2JjZTJVLCAweDQ5OGIyODNjVSwgMHg5NTQxZmYwZFUsCi0gICAgMHgwMTcxMzlhOFUsIDB4YjNkZTA4MGNVLCAweGU0OWNkOGI0VSwgMHhjMTkwNjQ1NlUsCi0gICAgMHg4NDYxN2JjYlUsIDB4YjY3MGQ1MzJVLCAweDVjNzQ0ODZjVSwgMHg1NzQyZDBiOFUsCi19Owotc3RhdGljIGNvbnN0IHUzMiBUZDNbMjU2XSA9IHsKLSAgICAweGY0YTc1MDUxVSwgMHg0MTY1NTM3ZVUsIDB4MTdhNGMzMWFVLCAweDI3NWU5NjNhVSwKLSAgICAweGFiNmJjYjNiVSwgMHg5ZDQ1ZjExZlUsIDB4ZmE1OGFiYWNVLCAweGUzMDM5MzRiVSwKLSAgICAweDMwZmE1NTIwVSwgMHg3NjZkZjZhZFUsIDB4Y2M3NjkxODhVLCAweDAyNGMyNWY1VSwKLSAgICAweGU1ZDdmYzRmVSwgMHgyYWNiZDdjNVUsIDB4MzU0NDgwMjZVLCAweDYyYTM4ZmI1VSwKLSAgICAweGIxNWE0OWRlVSwgMHhiYTFiNjcyNVUsIDB4ZWEwZTk4NDVVLCAweGZlYzBlMTVkVSwKLSAgICAweDJmNzUwMmMzVSwgMHg0Y2YwMTI4MVUsIDB4NDY5N2EzOGRVLCAweGQzZjljNjZiVSwKLSAgICAweDhmNWZlNzAzVSwgMHg5MjljOTUxNVUsIDB4NmQ3YWViYmZVLCAweDUyNTlkYTk1VSwKLSAgICAweGJlODMyZGQ0VSwgMHg3NDIxZDM1OFUsIDB4ZTA2OTI5NDlVLCAweGM5Yzg0NDhlVSwKLSAgICAweGMyODk2YTc1VSwgMHg4ZTc5NzhmNFUsIDB4NTgzZTZiOTlVLCAweGI5NzFkZDI3VSwKLSAgICAweGUxNGZiNmJlVSwgMHg4OGFkMTdmMFUsIDB4MjBhYzY2YzlVLCAweGNlM2FiNDdkVSwKLSAgICAweGRmNGExODYzVSwgMHgxYTMxODJlNVUsIDB4NTEzMzYwOTdVLCAweDUzN2Y0NTYyVSwKLSAgICAweDY0NzdlMGIxVSwgMHg2YmFlODRiYlUsIDB4ODFhMDFjZmVVLCAweDA4MmI5NGY5VSwKLSAgICAweDQ4Njg1ODcwVSwgMHg0NWZkMTk4ZlUsIDB4ZGU2Yzg3OTRVLCAweDdiZjhiNzUyVSwKLSAgICAweDczZDMyM2FiVSwgMHg0YjAyZTI3MlUsIDB4MWY4ZjU3ZTNVLCAweDU1YWIyYTY2VSwKLSAgICAweGViMjgwN2IyVSwgMHhiNWMyMDMyZlUsIDB4YzU3YjlhODZVLCAweDM3MDhhNWQzVSwKLSAgICAweDI4ODdmMjMwVSwgMHhiZmE1YjIyM1UsIDB4MDM2YWJhMDJVLCAweDE2ODI1Y2VkVSwKLSAgICAweGNmMWMyYjhhVSwgMHg3OWI0OTJhN1UsIDB4MDdmMmYwZjNVLCAweDY5ZTJhMTRlVSwKLSAgICAweGRhZjRjZDY1VSwgMHgwNWJlZDUwNlUsIDB4MzQ2MjFmZDFVLCAweGE2ZmU4YWM0VSwKLSAgICAweDJlNTM5ZDM0VSwgMHhmMzU1YTBhMlUsIDB4OGFlMTMyMDVVLCAweGY2ZWI3NWE0VSwKLSAgICAweDgzZWMzOTBiVSwgMHg2MGVmYWE0MFUsIDB4NzE5ZjA2NWVVLCAweDZlMTA1MWJkVSwKLSAgICAweDIxOGFmOTNlVSwgMHhkZDA2M2Q5NlUsIDB4M2UwNWFlZGRVLCAweGU2YmQ0NjRkVSwKLSAgICAweDU0OGRiNTkxVSwgMHhjNDVkMDU3MVUsIDB4MDZkNDZmMDRVLCAweDUwMTVmZjYwVSwKLSAgICAweDk4ZmIyNDE5VSwgMHhiZGU5OTdkNlUsIDB4NDA0M2NjODlVLCAweGQ5OWU3NzY3VSwKLSAgICAweGU4NDJiZGIwVSwgMHg4OThiODgwN1UsIDB4MTk1YjM4ZTdVLCAweGM4ZWVkYjc5VSwKLSAgICAweDdjMGE0N2ExVSwgMHg0MjBmZTk3Y1UsIDB4ODQxZWM5ZjhVLCAweDAwMDAwMDAwVSwKLSAgICAweDgwODY4MzA5VSwgMHgyYmVkNDgzMlUsIDB4MTE3MGFjMWVVLCAweDVhNzI0ZTZjVSwKLSAgICAweDBlZmZmYmZkVSwgMHg4NTM4NTYwZlUsIDB4YWVkNTFlM2RVLCAweDJkMzkyNzM2VSwKLSAgICAweDBmZDk2NDBhVSwgMHg1Y2E2MjE2OFUsIDB4NWI1NGQxOWJVLCAweDM2MmUzYTI0VSwKLSAgICAweDBhNjdiMTBjVSwgMHg1N2U3MGY5M1UsIDB4ZWU5NmQyYjRVLCAweDliOTE5ZTFiVSwKLSAgICAweGMwYzU0ZjgwVSwgMHhkYzIwYTI2MVUsIDB4Nzc0YjY5NWFVLCAweDEyMWExNjFjVSwKLSAgICAweDkzYmEwYWUyVSwgMHhhMDJhZTVjMFUsIDB4MjJlMDQzM2NVLCAweDFiMTcxZDEyVSwKLSAgICAweDA5MGQwYjBlVSwgMHg4YmM3YWRmMlUsIDB4YjZhOGI5MmRVLCAweDFlYTljODE0VSwKLSAgICAweGYxMTk4NTU3VSwgMHg3NTA3NGNhZlUsIDB4OTlkZGJiZWVVLCAweDdmNjBmZGEzVSwKLSAgICAweDAxMjY5ZmY3VSwgMHg3MmY1YmM1Y1UsIDB4NjYzYmM1NDRVLCAweGZiN2UzNDViVSwKLSAgICAweDQzMjk3NjhiVSwgMHgyM2M2ZGNjYlUsIDB4ZWRmYzY4YjZVLCAweGU0ZjE2M2I4VSwKLSAgICAweDMxZGNjYWQ3VSwgMHg2Mzg1MTA0MlUsIDB4OTcyMjQwMTNVLCAweGM2MTEyMDg0VSwKLSAgICAweDRhMjQ3ZDg1VSwgMHhiYjNkZjhkMlUsIDB4ZjkzMjExYWVVLCAweDI5YTE2ZGM3VSwKLSAgICAweDllMmY0YjFkVSwgMHhiMjMwZjNkY1UsIDB4ODY1MmVjMGRVLCAweGMxZTNkMDc3VSwKLSAgICAweGIzMTY2YzJiVSwgMHg3MGI5OTlhOVUsIDB4OTQ0OGZhMTFVLCAweGU5NjQyMjQ3VSwKLSAgICAweGZjOGNjNGE4VSwgMHhmMDNmMWFhMFUsIDB4N2QyY2Q4NTZVLCAweDMzOTBlZjIyVSwKLSAgICAweDQ5NGVjNzg3VSwgMHgzOGQxYzFkOVUsIDB4Y2FhMmZlOGNVLCAweGQ0MGIzNjk4VSwKLSAgICAweGY1ODFjZmE2VSwgMHg3YWRlMjhhNVUsIDB4Yjc4ZTI2ZGFVLCAweGFkYmZhNDNmVSwKLSAgICAweDNhOWRlNDJjVSwgMHg3ODkyMGQ1MFUsIDB4NWZjYzliNmFVLCAweDdlNDY2MjU0VSwKLSAgICAweDhkMTNjMmY2VSwgMHhkOGI4ZTg5MFUsIDB4MzlmNzVlMmVVLCAweGMzYWZmNTgyVSwKLSAgICAweDVkODBiZTlmVSwgMHhkMDkzN2M2OVUsIDB4ZDUyZGE5NmZVLCAweDI1MTJiM2NmVSwKLSAgICAweGFjOTkzYmM4VSwgMHgxODdkYTcxMFUsIDB4OWM2MzZlZThVLCAweDNiYmI3YmRiVSwKLSAgICAweDI2NzgwOWNkVSwgMHg1OTE4ZjQ2ZVUsIDB4OWFiNzAxZWNVLCAweDRmOWFhODgzVSwKLSAgICAweDk1NmU2NWU2VSwgMHhmZmU2N2VhYVUsIDB4YmNjZjA4MjFVLCAweDE1ZThlNmVmVSwKLSAgICAweGU3OWJkOWJhVSwgMHg2ZjM2Y2U0YVUsIDB4OWYwOWQ0ZWFVLCAweGIwN2NkNjI5VSwKLSAgICAweGE0YjJhZjMxVSwgMHgzZjIzMzEyYVUsIDB4YTU5NDMwYzZVLCAweGEyNjZjMDM1VSwKLSAgICAweDRlYmMzNzc0VSwgMHg4MmNhYTZmY1UsIDB4OTBkMGIwZTBVLCAweGE3ZDgxNTMzVSwKLSAgICAweDA0OTg0YWYxVSwgMHhlY2RhZjc0MVUsIDB4Y2Q1MDBlN2ZVLCAweDkxZjYyZjE3VSwKLSAgICAweDRkZDY4ZDc2VSwgMHhlZmIwNGQ0M1UsIDB4YWE0ZDU0Y2NVLCAweDk2MDRkZmU0VSwKLSAgICAweGQxYjVlMzllVSwgMHg2YTg4MWI0Y1UsIDB4MmMxZmI4YzFVLCAweDY1NTE3ZjQ2VSwKLSAgICAweDVlZWEwNDlkVSwgMHg4YzM1NWQwMVUsIDB4ODc3NDczZmFVLCAweDBiNDEyZWZiVSwKLSAgICAweDY3MWQ1YWIzVSwgMHhkYmQyNTI5MlUsIDB4MTA1NjMzZTlVLCAweGQ2NDcxMzZkVSwKLSAgICAweGQ3NjE4YzlhVSwgMHhhMTBjN2EzN1UsIDB4ZjgxNDhlNTlVLCAweDEzM2M4OWViVSwKLSAgICAweGE5MjdlZWNlVSwgMHg2MWM5MzViN1UsIDB4MWNlNWVkZTFVLCAweDQ3YjEzYzdhVSwKLSAgICAweGQyZGY1OTljVSwgMHhmMjczM2Y1NVUsIDB4MTRjZTc5MThVLCAweGM3MzdiZjczVSwKLSAgICAweGY3Y2RlYTUzVSwgMHhmZGFhNWI1ZlUsIDB4M2Q2ZjE0ZGZVLCAweDQ0ZGI4Njc4VSwKLSAgICAweGFmZjM4MWNhVSwgMHg2OGM0M2ViOVUsIDB4MjQzNDJjMzhVLCAweGEzNDA1ZmMyVSwKLSAgICAweDFkYzM3MjE2VSwgMHhlMjI1MGNiY1UsIDB4M2M0OThiMjhVLCAweDBkOTU0MWZmVSwKLSAgICAweGE4MDE3MTM5VSwgMHgwY2IzZGUwOFUsIDB4YjRlNDljZDhVLCAweDU2YzE5MDY0VSwKLSAgICAweGNiODQ2MTdiVSwgMHgzMmI2NzBkNVUsIDB4NmM1Yzc0NDhVLCAweGI4NTc0MmQwVSwKLX07Ci1zdGF0aWMgY29uc3QgdTMyIFRkNFsyNTZdID0gewotICAgIDB4NTI1MjUyNTJVLCAweDA5MDkwOTA5VSwgMHg2YTZhNmE2YVUsIDB4ZDVkNWQ1ZDVVLAotICAgIDB4MzAzMDMwMzBVLCAweDM2MzYzNjM2VSwgMHhhNWE1YTVhNVUsIDB4MzgzODM4MzhVLAotICAgIDB4YmZiZmJmYmZVLCAweDQwNDA0MDQwVSwgMHhhM2EzYTNhM1UsIDB4OWU5ZTllOWVVLAotICAgIDB4ODE4MTgxODFVLCAweGYzZjNmM2YzVSwgMHhkN2Q3ZDdkN1UsIDB4ZmJmYmZiZmJVLAotICAgIDB4N2M3YzdjN2NVLCAweGUzZTNlM2UzVSwgMHgzOTM5MzkzOVUsIDB4ODI4MjgyODJVLAotICAgIDB4OWI5YjliOWJVLCAweDJmMmYyZjJmVSwgMHhmZmZmZmZmZlUsIDB4ODc4Nzg3ODdVLAotICAgIDB4MzQzNDM0MzRVLCAweDhlOGU4ZThlVSwgMHg0MzQzNDM0M1UsIDB4NDQ0NDQ0NDRVLAotICAgIDB4YzRjNGM0YzRVLCAweGRlZGVkZWRlVSwgMHhlOWU5ZTllOVUsIDB4Y2JjYmNiY2JVLAotICAgIDB4NTQ1NDU0NTRVLCAweDdiN2I3YjdiVSwgMHg5NDk0OTQ5NFUsIDB4MzIzMjMyMzJVLAotICAgIDB4YTZhNmE2YTZVLCAweGMyYzJjMmMyVSwgMHgyMzIzMjMyM1UsIDB4M2QzZDNkM2RVLAotICAgIDB4ZWVlZWVlZWVVLCAweDRjNGM0YzRjVSwgMHg5NTk1OTU5NVUsIDB4MGIwYjBiMGJVLAotICAgIDB4NDI0MjQyNDJVLCAweGZhZmFmYWZhVSwgMHhjM2MzYzNjM1UsIDB4NGU0ZTRlNGVVLAotICAgIDB4MDgwODA4MDhVLCAweDJlMmUyZTJlVSwgMHhhMWExYTFhMVUsIDB4NjY2NjY2NjZVLAotICAgIDB4MjgyODI4MjhVLCAweGQ5ZDlkOWQ5VSwgMHgyNDI0MjQyNFUsIDB4YjJiMmIyYjJVLAotICAgIDB4NzY3Njc2NzZVLCAweDViNWI1YjViVSwgMHhhMmEyYTJhMlUsIDB4NDk0OTQ5NDlVLAotICAgIDB4NmQ2ZDZkNmRVLCAweDhiOGI4YjhiVSwgMHhkMWQxZDFkMVUsIDB4MjUyNTI1MjVVLAotICAgIDB4NzI3MjcyNzJVLCAweGY4ZjhmOGY4VSwgMHhmNmY2ZjZmNlUsIDB4NjQ2NDY0NjRVLAotICAgIDB4ODY4Njg2ODZVLCAweDY4Njg2ODY4VSwgMHg5ODk4OTg5OFUsIDB4MTYxNjE2MTZVLAotICAgIDB4ZDRkNGQ0ZDRVLCAweGE0YTRhNGE0VSwgMHg1YzVjNWM1Y1UsIDB4Y2NjY2NjY2NVLAotICAgIDB4NWQ1ZDVkNWRVLCAweDY1NjU2NTY1VSwgMHhiNmI2YjZiNlUsIDB4OTI5MjkyOTJVLAotICAgIDB4NmM2YzZjNmNVLCAweDcwNzA3MDcwVSwgMHg0ODQ4NDg0OFUsIDB4NTA1MDUwNTBVLAotICAgIDB4ZmRmZGZkZmRVLCAweGVkZWRlZGVkVSwgMHhiOWI5YjliOVUsIDB4ZGFkYWRhZGFVLAotICAgIDB4NWU1ZTVlNWVVLCAweDE1MTUxNTE1VSwgMHg0NjQ2NDY0NlUsIDB4NTc1NzU3NTdVLAotICAgIDB4YTdhN2E3YTdVLCAweDhkOGQ4ZDhkVSwgMHg5ZDlkOWQ5ZFUsIDB4ODQ4NDg0ODRVLAotICAgIDB4OTA5MDkwOTBVLCAweGQ4ZDhkOGQ4VSwgMHhhYmFiYWJhYlUsIDB4MDAwMDAwMDBVLAotICAgIDB4OGM4YzhjOGNVLCAweGJjYmNiY2JjVSwgMHhkM2QzZDNkM1UsIDB4MGEwYTBhMGFVLAotICAgIDB4ZjdmN2Y3ZjdVLCAweGU0ZTRlNGU0VSwgMHg1ODU4NTg1OFUsIDB4MDUwNTA1MDVVLAotICAgIDB4YjhiOGI4YjhVLCAweGIzYjNiM2IzVSwgMHg0NTQ1NDU0NVUsIDB4MDYwNjA2MDZVLAotICAgIDB4ZDBkMGQwZDBVLCAweDJjMmMyYzJjVSwgMHgxZTFlMWUxZVUsIDB4OGY4ZjhmOGZVLAotICAgIDB4Y2FjYWNhY2FVLCAweDNmM2YzZjNmVSwgMHgwZjBmMGYwZlUsIDB4MDIwMjAyMDJVLAotICAgIDB4YzFjMWMxYzFVLCAweGFmYWZhZmFmVSwgMHhiZGJkYmRiZFUsIDB4MDMwMzAzMDNVLAotICAgIDB4MDEwMTAxMDFVLCAweDEzMTMxMzEzVSwgMHg4YThhOGE4YVUsIDB4NmI2YjZiNmJVLAotICAgIDB4M2EzYTNhM2FVLCAweDkxOTE5MTkxVSwgMHgxMTExMTExMVUsIDB4NDE0MTQxNDFVLAotICAgIDB4NGY0ZjRmNGZVLCAweDY3Njc2NzY3VSwgMHhkY2RjZGNkY1UsIDB4ZWFlYWVhZWFVLAotICAgIDB4OTc5Nzk3OTdVLCAweGYyZjJmMmYyVSwgMHhjZmNmY2ZjZlUsIDB4Y2VjZWNlY2VVLAotICAgIDB4ZjBmMGYwZjBVLCAweGI0YjRiNGI0VSwgMHhlNmU2ZTZlNlUsIDB4NzM3MzczNzNVLAotICAgIDB4OTY5Njk2OTZVLCAweGFjYWNhY2FjVSwgMHg3NDc0NzQ3NFUsIDB4MjIyMjIyMjJVLAotICAgIDB4ZTdlN2U3ZTdVLCAweGFkYWRhZGFkVSwgMHgzNTM1MzUzNVUsIDB4ODU4NTg1ODVVLAotICAgIDB4ZTJlMmUyZTJVLCAweGY5ZjlmOWY5VSwgMHgzNzM3MzczN1UsIDB4ZThlOGU4ZThVLAotICAgIDB4MWMxYzFjMWNVLCAweDc1NzU3NTc1VSwgMHhkZmRmZGZkZlUsIDB4NmU2ZTZlNmVVLAotICAgIDB4NDc0NzQ3NDdVLCAweGYxZjFmMWYxVSwgMHgxYTFhMWExYVUsIDB4NzE3MTcxNzFVLAotICAgIDB4MWQxZDFkMWRVLCAweDI5MjkyOTI5VSwgMHhjNWM1YzVjNVUsIDB4ODk4OTg5ODlVLAotICAgIDB4NmY2ZjZmNmZVLCAweGI3YjdiN2I3VSwgMHg2MjYyNjI2MlUsIDB4MGUwZTBlMGVVLAotICAgIDB4YWFhYWFhYWFVLCAweDE4MTgxODE4VSwgMHhiZWJlYmViZVUsIDB4MWIxYjFiMWJVLAotICAgIDB4ZmNmY2ZjZmNVLCAweDU2NTY1NjU2VSwgMHgzZTNlM2UzZVUsIDB4NGI0YjRiNGJVLAotICAgIDB4YzZjNmM2YzZVLCAweGQyZDJkMmQyVSwgMHg3OTc5Nzk3OVUsIDB4MjAyMDIwMjBVLAotICAgIDB4OWE5YTlhOWFVLCAweGRiZGJkYmRiVSwgMHhjMGMwYzBjMFUsIDB4ZmVmZWZlZmVVLAotICAgIDB4Nzg3ODc4NzhVLCAweGNkY2RjZGNkVSwgMHg1YTVhNWE1YVUsIDB4ZjRmNGY0ZjRVLAotICAgIDB4MWYxZjFmMWZVLCAweGRkZGRkZGRkVSwgMHhhOGE4YThhOFUsIDB4MzMzMzMzMzNVLAotICAgIDB4ODg4ODg4ODhVLCAweDA3MDcwNzA3VSwgMHhjN2M3YzdjN1UsIDB4MzEzMTMxMzFVLAotICAgIDB4YjFiMWIxYjFVLCAweDEyMTIxMjEyVSwgMHgxMDEwMTAxMFUsIDB4NTk1OTU5NTlVLAotICAgIDB4MjcyNzI3MjdVLCAweDgwODA4MDgwVSwgMHhlY2VjZWNlY1UsIDB4NWY1ZjVmNWZVLAotICAgIDB4NjA2MDYwNjBVLCAweDUxNTE1MTUxVSwgMHg3ZjdmN2Y3ZlUsIDB4YTlhOWE5YTlVLAotICAgIDB4MTkxOTE5MTlVLCAweGI1YjViNWI1VSwgMHg0YTRhNGE0YVUsIDB4MGQwZDBkMGRVLAotICAgIDB4MmQyZDJkMmRVLCAweGU1ZTVlNWU1VSwgMHg3YTdhN2E3YVUsIDB4OWY5ZjlmOWZVLAotICAgIDB4OTM5MzkzOTNVLCAweGM5YzljOWM5VSwgMHg5YzljOWM5Y1UsIDB4ZWZlZmVmZWZVLAotICAgIDB4YTBhMGEwYTBVLCAweGUwZTBlMGUwVSwgMHgzYjNiM2IzYlUsIDB4NGQ0ZDRkNGRVLAotICAgIDB4YWVhZWFlYWVVLCAweDJhMmEyYTJhVSwgMHhmNWY1ZjVmNVUsIDB4YjBiMGIwYjBVLAotICAgIDB4YzhjOGM4YzhVLCAweGViZWJlYmViVSwgMHhiYmJiYmJiYlUsIDB4M2MzYzNjM2NVLAotICAgIDB4ODM4MzgzODNVLCAweDUzNTM1MzUzVSwgMHg5OTk5OTk5OVUsIDB4NjE2MTYxNjFVLAotICAgIDB4MTcxNzE3MTdVLCAweDJiMmIyYjJiVSwgMHgwNDA0MDQwNFUsIDB4N2U3ZTdlN2VVLAotICAgIDB4YmFiYWJhYmFVLCAweDc3Nzc3Nzc3VSwgMHhkNmQ2ZDZkNlUsIDB4MjYyNjI2MjZVLAotICAgIDB4ZTFlMWUxZTFVLCAweDY5Njk2OTY5VSwgMHgxNDE0MTQxNFUsIDB4NjM2MzYzNjNVLAotICAgIDB4NTU1NTU1NTVVLCAweDIxMjEyMTIxVSwgMHgwYzBjMGMwY1UsIDB4N2Q3ZDdkN2RVLAotfTsKLXN0YXRpYyBjb25zdCB1MzIgcmNvbltdID0gewotCTB4MDEwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDgwMDAwMDAsCi0JMHgxMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg4MDAwMDAwMCwKLQkweDFCMDAwMDAwLCAweDM2MDAwMDAwLCAvKiBmb3IgMTI4LWJpdCBibG9ja3MsIFJpam5kYWVsIG5ldmVyIHVzZXMgbW9yZSB0aGFuIDEwIHJjb24gdmFsdWVzICovCi19OwotCi0jZGVmaW5lIEdFVFUzMihwdCkgKCgodTMyKShwdClbMF0gPDwgMjQpIF4gKCh1MzIpKHB0KVsxXSA8PCAxNikgXiAoKHUzMikocHQpWzJdIDw8ICA4KSBeICgodTMyKShwdClbM10pKQotI2RlZmluZSBQVVRVMzIoY3QsIHN0KSB7IChjdClbMF0gPSAodTgpKChzdCkgPj4gMjQpOyAoY3QpWzFdID0gKHU4KSgoc3QpID4+IDE2KTsgKGN0KVsyXSA9ICh1OCkoKHN0KSA+PiAgOCk7IChjdClbM10gPSAodTgpKHN0KTsgfQotCi0vKioKLSAqIEV4cGFuZCB0aGUgY2lwaGVyIGtleSBpbnRvIHRoZSBlbmNyeXB0aW9uIGtleSBzY2hlZHVsZS4KLSAqCi0gKiBAcmV0dXJuCXRoZSBudW1iZXIgb2Ygcm91bmRzIGZvciB0aGUgZ2l2ZW4gY2lwaGVyIGtleSBzaXplLgotICovCi1zdGF0aWMgaW50IHJpam5kYWVsS2V5U2V0dXBFbmModTMyIHJrWy8qNCooTnIgKyAxKSovXSwgY29uc3QgdTggY2lwaGVyS2V5W10sIGludCBrZXlCaXRzKSB7Ci0JaW50IGkgPSAwOwotCXUzMiB0ZW1wOwotCi0JcmtbMF0gPSBHRVRVMzIoY2lwaGVyS2V5ICAgICApOwotCXJrWzFdID0gR0VUVTMyKGNpcGhlcktleSArICA0KTsKLQlya1syXSA9IEdFVFUzMihjaXBoZXJLZXkgKyAgOCk7Ci0JcmtbM10gPSBHRVRVMzIoY2lwaGVyS2V5ICsgMTIpOwotCWlmIChrZXlCaXRzID09IDEyOCkgewotCQlmb3IgKDs7KSB7Ci0JCQl0ZW1wICA9IHJrWzNdOwotCQkJcmtbNF0gPSBya1swXSBeCi0JCQkJKFRlNFsodGVtcCA+PiAxNikgJiAweGZmXSAmIDB4ZmYwMDAwMDApIF4KLQkJCQkoVGU0Wyh0ZW1wID4+ICA4KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgotCQkJCShUZTRbKHRlbXAgICAgICApICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeCi0JCQkJKFRlNFsodGVtcCA+PiAyNCkgICAgICAgXSAmIDB4MDAwMDAwZmYpIF4KLQkJCQlyY29uW2ldOwotCQkJcmtbNV0gPSBya1sxXSBeIHJrWzRdOwotCQkJcmtbNl0gPSBya1syXSBeIHJrWzVdOwotCQkJcmtbN10gPSBya1szXSBeIHJrWzZdOwotCQkJaWYgKCsraSA9PSAxMCkgewotCQkJCXJldHVybiAxMDsKLQkJCX0KLQkJCXJrICs9IDQ7Ci0JCX0KLQl9Ci0JcmtbNF0gPSBHRVRVMzIoY2lwaGVyS2V5ICsgMTYpOwotCXJrWzVdID0gR0VUVTMyKGNpcGhlcktleSArIDIwKTsKLQlpZiAoa2V5Qml0cyA9PSAxOTIpIHsKLQkJZm9yICg7OykgewotCQkJdGVtcCA9IHJrWyA1XTsKLQkJCXJrWyA2XSA9IHJrWyAwXSBeCi0JCQkJKFRlNFsodGVtcCA+PiAxNikgJiAweGZmXSAmIDB4ZmYwMDAwMDApIF4KLQkJCQkoVGU0Wyh0ZW1wID4+ICA4KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgotCQkJCShUZTRbKHRlbXAgICAgICApICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeCi0JCQkJKFRlNFsodGVtcCA+PiAyNCkgICAgICAgXSAmIDB4MDAwMDAwZmYpIF4KLQkJCQlyY29uW2ldOwotCQkJcmtbIDddID0gcmtbIDFdIF4gcmtbIDZdOwotCQkJcmtbIDhdID0gcmtbIDJdIF4gcmtbIDddOwotCQkJcmtbIDldID0gcmtbIDNdIF4gcmtbIDhdOwotCQkJaWYgKCsraSA9PSA4KSB7Ci0JCQkJcmV0dXJuIDEyOwotCQkJfQotCQkJcmtbMTBdID0gcmtbIDRdIF4gcmtbIDldOwotCQkJcmtbMTFdID0gcmtbIDVdIF4gcmtbMTBdOwotCQkJcmsgKz0gNjsKLQkJfQotCX0KLQlya1s2XSA9IEdFVFUzMihjaXBoZXJLZXkgKyAyNCk7Ci0JcmtbN10gPSBHRVRVMzIoY2lwaGVyS2V5ICsgMjgpOwotCWlmIChrZXlCaXRzID09IDI1NikgewotCQlmb3IgKDs7KSB7Ci0JCQl0ZW1wID0gcmtbIDddOwotCQkJcmtbIDhdID0gcmtbIDBdIF4KLQkJCQkoVGU0Wyh0ZW1wID4+IDE2KSAmIDB4ZmZdICYgMHhmZjAwMDAwMCkgXgotCQkJCShUZTRbKHRlbXAgPj4gIDgpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCi0JCQkJKFRlNFsodGVtcCAgICAgICkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KLQkJCQkoVGU0Wyh0ZW1wID4+IDI0KSAgICAgICBdICYgMHgwMDAwMDBmZikgXgotCQkJCXJjb25baV07Ci0JCQlya1sgOV0gPSBya1sgMV0gXiBya1sgOF07Ci0JCQlya1sxMF0gPSBya1sgMl0gXiBya1sgOV07Ci0JCQlya1sxMV0gPSBya1sgM10gXiBya1sxMF07Ci0JCQkJaWYgKCsraSA9PSA3KSB7Ci0JCQkJCXJldHVybiAxNDsKLQkJCQl9Ci0JCQl0ZW1wID0gcmtbMTFdOwotCQkJcmtbMTJdID0gcmtbIDRdIF4KLQkJCQkoVGU0Wyh0ZW1wID4+IDI0KSAgICAgICBdICYgMHhmZjAwMDAwMCkgXgotCQkJCShUZTRbKHRlbXAgPj4gMTYpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCi0JCQkJKFRlNFsodGVtcCA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KLQkJCQkoVGU0Wyh0ZW1wICAgICAgKSAmIDB4ZmZdICYgMHgwMDAwMDBmZik7Ci0JCQlya1sxM10gPSBya1sgNV0gXiBya1sxMl07Ci0JCQlya1sxNF0gPSBya1sgNl0gXiBya1sxM107Ci0JCQlya1sxNV0gPSBya1sgN10gXiBya1sxNF07Ci0JCQlyayArPSA4OwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIEV4cGFuZCB0aGUgY2lwaGVyIGtleSBpbnRvIHRoZSBkZWNyeXB0aW9uIGtleSBzY2hlZHVsZS4KLSAqCi0gKiBAcmV0dXJuCXRoZSBudW1iZXIgb2Ygcm91bmRzIGZvciB0aGUgZ2l2ZW4gY2lwaGVyIGtleSBzaXplLgotICovCi1zdGF0aWMgaW50Ci1yaWpuZGFlbEtleVNldHVwRGVjKHUzMiBya1svKjQqKE5yICsgMSkqL10sIGNvbnN0IHU4IGNpcGhlcktleVtdLCBpbnQga2V5Qml0cywKLSAgICBpbnQgaGF2ZV9lbmNyeXB0KSB7Ci0JaW50IE5yLCBpLCBqOwotCXUzMiB0ZW1wOwotCi0JaWYgKGhhdmVfZW5jcnlwdCkgewotCQlOciA9IGhhdmVfZW5jcnlwdDsKLQl9IGVsc2UgewotCQkvKiBleHBhbmQgdGhlIGNpcGhlciBrZXk6ICovCi0JCU5yID0gcmlqbmRhZWxLZXlTZXR1cEVuYyhyaywgY2lwaGVyS2V5LCBrZXlCaXRzKTsKLQl9Ci0JLyogaW52ZXJ0IHRoZSBvcmRlciBvZiB0aGUgcm91bmQga2V5czogKi8KLQlmb3IgKGkgPSAwLCBqID0gNCpOcjsgaSA8IGo7IGkgKz0gNCwgaiAtPSA0KSB7Ci0JCXRlbXAgPSBya1tpICAgIF07IHJrW2kgICAgXSA9IHJrW2ogICAgXTsgcmtbaiAgICBdID0gdGVtcDsKLQkJdGVtcCA9IHJrW2kgKyAxXTsgcmtbaSArIDFdID0gcmtbaiArIDFdOyBya1tqICsgMV0gPSB0ZW1wOwotCQl0ZW1wID0gcmtbaSArIDJdOyBya1tpICsgMl0gPSBya1tqICsgMl07IHJrW2ogKyAyXSA9IHRlbXA7Ci0JCXRlbXAgPSBya1tpICsgM107IHJrW2kgKyAzXSA9IHJrW2ogKyAzXTsgcmtbaiArIDNdID0gdGVtcDsKLQl9Ci0JLyogYXBwbHkgdGhlIGludmVyc2UgTWl4Q29sdW1uIHRyYW5zZm9ybSB0byBhbGwgcm91bmQga2V5cyBidXQgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdDogKi8KLQlmb3IgKGkgPSAxOyBpIDwgTnI7IGkrKykgewotCQlyayArPSA0OwotCQlya1swXSA9Ci0JCQlUZDBbVGU0Wyhya1swXSA+PiAyNCkgICAgICAgXSAmIDB4ZmZdIF4KLQkJCVRkMVtUZTRbKHJrWzBdID4+IDE2KSAmIDB4ZmZdICYgMHhmZl0gXgotCQkJVGQyW1RlNFsocmtbMF0gPj4gIDgpICYgMHhmZl0gJiAweGZmXSBeCi0JCQlUZDNbVGU0Wyhya1swXSAgICAgICkgJiAweGZmXSAmIDB4ZmZdOwotCQlya1sxXSA9Ci0JCQlUZDBbVGU0Wyhya1sxXSA+PiAyNCkgICAgICAgXSAmIDB4ZmZdIF4KLQkJCVRkMVtUZTRbKHJrWzFdID4+IDE2KSAmIDB4ZmZdICYgMHhmZl0gXgotCQkJVGQyW1RlNFsocmtbMV0gPj4gIDgpICYgMHhmZl0gJiAweGZmXSBeCi0JCQlUZDNbVGU0Wyhya1sxXSAgICAgICkgJiAweGZmXSAmIDB4ZmZdOwotCQlya1syXSA9Ci0JCQlUZDBbVGU0Wyhya1syXSA+PiAyNCkgICAgICAgXSAmIDB4ZmZdIF4KLQkJCVRkMVtUZTRbKHJrWzJdID4+IDE2KSAmIDB4ZmZdICYgMHhmZl0gXgotCQkJVGQyW1RlNFsocmtbMl0gPj4gIDgpICYgMHhmZl0gJiAweGZmXSBeCi0JCQlUZDNbVGU0Wyhya1syXSAgICAgICkgJiAweGZmXSAmIDB4ZmZdOwotCQlya1szXSA9Ci0JCQlUZDBbVGU0Wyhya1szXSA+PiAyNCkgICAgICAgXSAmIDB4ZmZdIF4KLQkJCVRkMVtUZTRbKHJrWzNdID4+IDE2KSAmIDB4ZmZdICYgMHhmZl0gXgotCQkJVGQyW1RlNFsocmtbM10gPj4gIDgpICYgMHhmZl0gJiAweGZmXSBeCi0JCQlUZDNbVGU0Wyhya1szXSAgICAgICkgJiAweGZmXSAmIDB4ZmZdOwotCX0KLQlyZXR1cm4gTnI7Ci19Ci0KLXN0YXRpYyB2b2lkIHJpam5kYWVsRW5jcnlwdChjb25zdCB1MzIgcmtbLyo0KihOciArIDEpKi9dLCBpbnQgTnIsIGNvbnN0IHU4IHB0WzE2XSwgdTggY3RbMTZdKSB7Ci0JdTMyIHMwLCBzMSwgczIsIHMzLCB0MCwgdDEsIHQyLCB0MzsKLSNpZm5kZWYgRlVMTF9VTlJPTEwKLSAgICBpbnQgcjsKLSNlbmRpZiAvKiA/RlVMTF9VTlJPTEwgKi8KLQotICAgIC8qCi0JICogbWFwIGJ5dGUgYXJyYXkgYmxvY2sgdG8gY2lwaGVyIHN0YXRlCi0JICogYW5kIGFkZCBpbml0aWFsIHJvdW5kIGtleToKLQkgKi8KLQlzMCA9IEdFVFUzMihwdCAgICAgKSBeIHJrWzBdOwotCXMxID0gR0VUVTMyKHB0ICsgIDQpIF4gcmtbMV07Ci0JczIgPSBHRVRVMzIocHQgKyAgOCkgXiBya1syXTsKLQlzMyA9IEdFVFUzMihwdCArIDEyKSBeIHJrWzNdOwotI2lmZGVmIEZVTExfVU5ST0xMCi0gICAgLyogcm91bmQgMTogKi8KLQl0MCA9IFRlMFtzMCA+PiAyNF0gXiBUZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMyAmIDB4ZmZdIF4gcmtbIDRdOwotCXQxID0gVGUwW3MxID4+IDI0XSBeIFRlMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MwICYgMHhmZl0gXiBya1sgNV07Ci0JdDIgPSBUZTBbczIgPj4gMjRdIF4gVGUxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRlMlsoczAgPj4gIDgpICYgMHhmZl0gXiBUZTNbczEgJiAweGZmXSBeIHJrWyA2XTsKLQl0MyA9IFRlMFtzMyA+PiAyNF0gXiBUZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMiAmIDB4ZmZdIF4gcmtbIDddOwotCS8qIHJvdW5kIDI6ICovCi0JczAgPSBUZTBbdDAgPj4gMjRdIF4gVGUxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRlMlsodDIgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDMgJiAweGZmXSBeIHJrWyA4XTsKLQlzMSA9IFRlMFt0MSA+PiAyNF0gXiBUZTFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MyA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MCAmIDB4ZmZdIF4gcmtbIDldOwotCXMyID0gVGUwW3QyID4+IDI0XSBeIFRlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QxICYgMHhmZl0gXiBya1sxMF07Ci0JczMgPSBUZTBbdDMgPj4gMjRdIF4gVGUxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRlMlsodDEgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDIgJiAweGZmXSBeIHJrWzExXTsKLSAgICAvKiByb3VuZCAzOiAqLwotCXQwID0gVGUwW3MwID4+IDI0XSBeIFRlMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MzICYgMHhmZl0gXiBya1sxMl07Ci0JdDEgPSBUZTBbczEgPj4gMjRdIF4gVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRlMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZTNbczAgJiAweGZmXSBeIHJrWzEzXTsKLQl0MiA9IFRlMFtzMiA+PiAyNF0gXiBUZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMSAmIDB4ZmZdIF4gcmtbMTRdOwotCXQzID0gVGUwW3MzID4+IDI0XSBeIFRlMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MyICYgMHhmZl0gXiBya1sxNV07Ci0JLyogcm91bmQgNDogKi8KLQlzMCA9IFRlMFt0MCA+PiAyNF0gXiBUZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MiA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MyAmIDB4ZmZdIF4gcmtbMTZdOwotCXMxID0gVGUwW3QxID4+IDI0XSBeIFRlMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QwICYgMHhmZl0gXiBya1sxN107Ci0JczIgPSBUZTBbdDIgPj4gMjRdIF4gVGUxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRlMlsodDAgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDEgJiAweGZmXSBeIHJrWzE4XTsKLQlzMyA9IFRlMFt0MyA+PiAyNF0gXiBUZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MSA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MiAmIDB4ZmZdIF4gcmtbMTldOwotICAgIC8qIHJvdW5kIDU6ICovCi0JdDAgPSBUZTBbczAgPj4gMjRdIF4gVGUxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRlMlsoczIgPj4gIDgpICYgMHhmZl0gXiBUZTNbczMgJiAweGZmXSBeIHJrWzIwXTsKLQl0MSA9IFRlMFtzMSA+PiAyNF0gXiBUZTFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMCAmIDB4ZmZdIF4gcmtbMjFdOwotCXQyID0gVGUwW3MyID4+IDI0XSBeIFRlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MxICYgMHhmZl0gXiBya1syMl07Ci0JdDMgPSBUZTBbczMgPj4gMjRdIF4gVGUxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRlMlsoczEgPj4gIDgpICYgMHhmZl0gXiBUZTNbczIgJiAweGZmXSBeIHJrWzIzXTsKLQkvKiByb3VuZCA2OiAqLwotCXMwID0gVGUwW3QwID4+IDI0XSBeIFRlMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QzICYgMHhmZl0gXiBya1syNF07Ci0JczEgPSBUZTBbdDEgPj4gMjRdIF4gVGUxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRlMlsodDMgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDAgJiAweGZmXSBeIHJrWzI1XTsKLQlzMiA9IFRlMFt0MiA+PiAyNF0gXiBUZTFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MCA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MSAmIDB4ZmZdIF4gcmtbMjZdOwotCXMzID0gVGUwW3QzID4+IDI0XSBeIFRlMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QyICYgMHhmZl0gXiBya1syN107Ci0gICAgLyogcm91bmQgNzogKi8KLQl0MCA9IFRlMFtzMCA+PiAyNF0gXiBUZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMyAmIDB4ZmZdIF4gcmtbMjhdOwotCXQxID0gVGUwW3MxID4+IDI0XSBeIFRlMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MwICYgMHhmZl0gXiBya1syOV07Ci0JdDIgPSBUZTBbczIgPj4gMjRdIF4gVGUxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRlMlsoczAgPj4gIDgpICYgMHhmZl0gXiBUZTNbczEgJiAweGZmXSBeIHJrWzMwXTsKLQl0MyA9IFRlMFtzMyA+PiAyNF0gXiBUZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMiAmIDB4ZmZdIF4gcmtbMzFdOwotCS8qIHJvdW5kIDg6ICovCi0JczAgPSBUZTBbdDAgPj4gMjRdIF4gVGUxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRlMlsodDIgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDMgJiAweGZmXSBeIHJrWzMyXTsKLQlzMSA9IFRlMFt0MSA+PiAyNF0gXiBUZTFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MyA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MCAmIDB4ZmZdIF4gcmtbMzNdOwotCXMyID0gVGUwW3QyID4+IDI0XSBeIFRlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QxICYgMHhmZl0gXiBya1szNF07Ci0JczMgPSBUZTBbdDMgPj4gMjRdIF4gVGUxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRlMlsodDEgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDIgJiAweGZmXSBeIHJrWzM1XTsKLSAgICAvKiByb3VuZCA5OiAqLwotCXQwID0gVGUwW3MwID4+IDI0XSBeIFRlMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MzICYgMHhmZl0gXiBya1szNl07Ci0JdDEgPSBUZTBbczEgPj4gMjRdIF4gVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRlMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZTNbczAgJiAweGZmXSBeIHJrWzM3XTsKLQl0MiA9IFRlMFtzMiA+PiAyNF0gXiBUZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMSAmIDB4ZmZdIF4gcmtbMzhdOwotCXQzID0gVGUwW3MzID4+IDI0XSBeIFRlMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MyICYgMHhmZl0gXiBya1szOV07Ci0gICAgaWYgKE5yID4gMTApIHsKLQkvKiByb3VuZCAxMDogKi8KLQlzMCA9IFRlMFt0MCA+PiAyNF0gXiBUZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MiA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MyAmIDB4ZmZdIF4gcmtbNDBdOwotCXMxID0gVGUwW3QxID4+IDI0XSBeIFRlMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QwICYgMHhmZl0gXiBya1s0MV07Ci0JczIgPSBUZTBbdDIgPj4gMjRdIF4gVGUxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRlMlsodDAgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDEgJiAweGZmXSBeIHJrWzQyXTsKLQlzMyA9IFRlMFt0MyA+PiAyNF0gXiBUZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MSA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MiAmIDB4ZmZdIF4gcmtbNDNdOwotCS8qIHJvdW5kIDExOiAqLwotCXQwID0gVGUwW3MwID4+IDI0XSBeIFRlMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MzICYgMHhmZl0gXiBya1s0NF07Ci0JdDEgPSBUZTBbczEgPj4gMjRdIF4gVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRlMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZTNbczAgJiAweGZmXSBeIHJrWzQ1XTsKLQl0MiA9IFRlMFtzMiA+PiAyNF0gXiBUZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMSAmIDB4ZmZdIF4gcmtbNDZdOwotCXQzID0gVGUwW3MzID4+IDI0XSBeIFRlMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MyICYgMHhmZl0gXiBya1s0N107Ci0JaWYgKE5yID4gMTIpIHsKLQkgICAgLyogcm91bmQgMTI6ICovCi0JICAgIHMwID0gVGUwW3QwID4+IDI0XSBeIFRlMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QzICYgMHhmZl0gXiBya1s0OF07Ci0JICAgIHMxID0gVGUwW3QxID4+IDI0XSBeIFRlMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QwICYgMHhmZl0gXiBya1s0OV07Ci0JICAgIHMyID0gVGUwW3QyID4+IDI0XSBeIFRlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QxICYgMHhmZl0gXiBya1s1MF07Ci0JICAgIHMzID0gVGUwW3QzID4+IDI0XSBeIFRlMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QyICYgMHhmZl0gXiBya1s1MV07Ci0JICAgIC8qIHJvdW5kIDEzOiAqLwotCSAgICB0MCA9IFRlMFtzMCA+PiAyNF0gXiBUZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMyAmIDB4ZmZdIF4gcmtbNTJdOwotCSAgICB0MSA9IFRlMFtzMSA+PiAyNF0gXiBUZTFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMCAmIDB4ZmZdIF4gcmtbNTNdOwotCSAgICB0MiA9IFRlMFtzMiA+PiAyNF0gXiBUZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMSAmIDB4ZmZdIF4gcmtbNTRdOwotCSAgICB0MyA9IFRlMFtzMyA+PiAyNF0gXiBUZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMiAmIDB4ZmZdIF4gcmtbNTVdOwotCX0KLSAgICB9Ci0gICAgcmsgKz0gTnIgPDwgMjsKLSNlbHNlICAvKiAhRlVMTF9VTlJPTEwgKi8KLSAgICAvKgotCSAqIE5yIC0gMSBmdWxsIHJvdW5kczoKLQkgKi8KLSAgICByID0gTnIgPj4gMTsKLSAgICBmb3IgKDs7KSB7Ci0JdDAgPQotCSAgICBUZTBbKHMwID4+IDI0KSAgICAgICBdIF4KLQkgICAgVGUxWyhzMSA+PiAxNikgJiAweGZmXSBeCi0JICAgIFRlMlsoczIgPj4gIDgpICYgMHhmZl0gXgotCSAgICBUZTNbKHMzICAgICAgKSAmIDB4ZmZdIF4KLQkgICAgcmtbNF07Ci0JdDEgPQotCSAgICBUZTBbKHMxID4+IDI0KSAgICAgICBdIF4KLQkgICAgVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeCi0JICAgIFRlMlsoczMgPj4gIDgpICYgMHhmZl0gXgotCSAgICBUZTNbKHMwICAgICAgKSAmIDB4ZmZdIF4KLQkgICAgcmtbNV07Ci0JdDIgPQotCSAgICBUZTBbKHMyID4+IDI0KSAgICAgICBdIF4KLQkgICAgVGUxWyhzMyA+PiAxNikgJiAweGZmXSBeCi0JICAgIFRlMlsoczAgPj4gIDgpICYgMHhmZl0gXgotCSAgICBUZTNbKHMxICAgICAgKSAmIDB4ZmZdIF4KLQkgICAgcmtbNl07Ci0JdDMgPQotCSAgICBUZTBbKHMzID4+IDI0KSAgICAgICBdIF4KLQkgICAgVGUxWyhzMCA+PiAxNikgJiAweGZmXSBeCi0JICAgIFRlMlsoczEgPj4gIDgpICYgMHhmZl0gXgotCSAgICBUZTNbKHMyICAgICAgKSAmIDB4ZmZdIF4KLQkgICAgcmtbN107Ci0KLQlyayArPSA4OwotCWlmICgtLXIgPT0gMCkgewotCSAgICBicmVhazsKLQl9Ci0KLQlzMCA9Ci0JICAgIFRlMFsodDAgPj4gMjQpICAgICAgIF0gXgotCSAgICBUZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4KLQkgICAgVGUyWyh0MiA+PiAgOCkgJiAweGZmXSBeCi0JICAgIFRlM1sodDMgICAgICApICYgMHhmZl0gXgotCSAgICBya1swXTsKLQlzMSA9Ci0JICAgIFRlMFsodDEgPj4gMjQpICAgICAgIF0gXgotCSAgICBUZTFbKHQyID4+IDE2KSAmIDB4ZmZdIF4KLQkgICAgVGUyWyh0MyA+PiAgOCkgJiAweGZmXSBeCi0JICAgIFRlM1sodDAgICAgICApICYgMHhmZl0gXgotCSAgICBya1sxXTsKLQlzMiA9Ci0JICAgIFRlMFsodDIgPj4gMjQpICAgICAgIF0gXgotCSAgICBUZTFbKHQzID4+IDE2KSAmIDB4ZmZdIF4KLQkgICAgVGUyWyh0MCA+PiAgOCkgJiAweGZmXSBeCi0JICAgIFRlM1sodDEgICAgICApICYgMHhmZl0gXgotCSAgICBya1syXTsKLQlzMyA9Ci0JICAgIFRlMFsodDMgPj4gMjQpICAgICAgIF0gXgotCSAgICBUZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4KLQkgICAgVGUyWyh0MSA+PiAgOCkgJiAweGZmXSBeCi0JICAgIFRlM1sodDIgICAgICApICYgMHhmZl0gXgotCSAgICBya1szXTsKLSAgICB9Ci0jZW5kaWYgLyogP0ZVTExfVU5ST0xMICovCi0gICAgLyoKLQkgKiBhcHBseSBsYXN0IHJvdW5kIGFuZAotCSAqIG1hcCBjaXBoZXIgc3RhdGUgdG8gYnl0ZSBhcnJheSBibG9jazoKLQkgKi8KLQlzMCA9Ci0JCShUZTRbKHQwID4+IDI0KSAgICAgICBdICYgMHhmZjAwMDAwMCkgXgotCQkoVGU0Wyh0MSA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDApIF4KLQkJKFRlNFsodDIgPj4gIDgpICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeCi0JCShUZTRbKHQzICAgICAgKSAmIDB4ZmZdICYgMHgwMDAwMDBmZikgXgotCQlya1swXTsKLQlQVVRVMzIoY3QgICAgICwgczApOwotCXMxID0KLQkJKFRlNFsodDEgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCi0JCShUZTRbKHQyID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgotCQkoVGU0Wyh0MyA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KLQkJKFRlNFsodDAgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKSBeCi0JCXJrWzFdOwotCVBVVFUzMihjdCArICA0LCBzMSk7Ci0JczIgPQotCQkoVGU0Wyh0MiA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDApIF4KLQkJKFRlNFsodDMgPj4gMTYpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCi0JCShUZTRbKHQwID4+ICA4KSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXgotCQkoVGU0Wyh0MSAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmYpIF4KLQkJcmtbMl07Ci0JUFVUVTMyKGN0ICsgIDgsIHMyKTsKLQlzMyA9Ci0JCShUZTRbKHQzID4+IDI0KSAgICAgICBdICYgMHhmZjAwMDAwMCkgXgotCQkoVGU0Wyh0MCA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDApIF4KLQkJKFRlNFsodDEgPj4gIDgpICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeCi0JCShUZTRbKHQyICAgICAgKSAmIDB4ZmZdICYgMHgwMDAwMDBmZikgXgotCQlya1szXTsKLQlQVVRVMzIoY3QgKyAxMiwgczMpOwotfQotCi1zdGF0aWMgdm9pZCByaWpuZGFlbERlY3J5cHQoY29uc3QgdTMyIHJrWy8qNCooTnIgKyAxKSovXSwgaW50IE5yLCBjb25zdCB1OCBjdFsxNl0sIHU4IHB0WzE2XSkgewotCXUzMiBzMCwgczEsIHMyLCBzMywgdDAsIHQxLCB0MiwgdDM7Ci0jaWZuZGVmIEZVTExfVU5ST0xMCi0gICAgaW50IHI7Ci0jZW5kaWYgLyogP0ZVTExfVU5ST0xMICovCi0KLSAgICAvKgotCSAqIG1hcCBieXRlIGFycmF5IGJsb2NrIHRvIGNpcGhlciBzdGF0ZQotCSAqIGFuZCBhZGQgaW5pdGlhbCByb3VuZCBrZXk6Ci0JICovCi0gICAgczAgPSBHRVRVMzIoY3QgICAgICkgXiBya1swXTsKLSAgICBzMSA9IEdFVFUzMihjdCArICA0KSBeIHJrWzFdOwotICAgIHMyID0gR0VUVTMyKGN0ICsgIDgpIF4gcmtbMl07Ci0gICAgczMgPSBHRVRVMzIoY3QgKyAxMikgXiBya1szXTsKLSNpZmRlZiBGVUxMX1VOUk9MTAotICAgIC8qIHJvdW5kIDE6ICovCi0gICAgdDAgPSBUZDBbczAgPj4gMjRdIF4gVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRkMlsoczIgPj4gIDgpICYgMHhmZl0gXiBUZDNbczEgJiAweGZmXSBeIHJrWyA0XTsKLSAgICB0MSA9IFRkMFtzMSA+PiAyNF0gXiBUZDFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMiAmIDB4ZmZdIF4gcmtbIDVdOwotICAgIHQyID0gVGQwW3MyID4+IDI0XSBeIFRkMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MzICYgMHhmZl0gXiBya1sgNl07Ci0gICAgdDMgPSBUZDBbczMgPj4gMjRdIF4gVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRkMlsoczEgPj4gIDgpICYgMHhmZl0gXiBUZDNbczAgJiAweGZmXSBeIHJrWyA3XTsKLSAgICAvKiByb3VuZCAyOiAqLwotICAgIHMwID0gVGQwW3QwID4+IDI0XSBeIFRkMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QxICYgMHhmZl0gXiBya1sgOF07Ci0gICAgczEgPSBUZDBbdDEgPj4gMjRdIF4gVGQxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRkMlsodDMgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDIgJiAweGZmXSBeIHJrWyA5XTsKLSAgICBzMiA9IFRkMFt0MiA+PiAyNF0gXiBUZDFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MCA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MyAmIDB4ZmZdIF4gcmtbMTBdOwotICAgIHMzID0gVGQwW3QzID4+IDI0XSBeIFRkMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QwICYgMHhmZl0gXiBya1sxMV07Ci0gICAgLyogcm91bmQgMzogKi8KLSAgICB0MCA9IFRkMFtzMCA+PiAyNF0gXiBUZDFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMSAmIDB4ZmZdIF4gcmtbMTJdOwotICAgIHQxID0gVGQwW3MxID4+IDI0XSBeIFRkMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MyICYgMHhmZl0gXiBya1sxM107Ci0gICAgdDIgPSBUZDBbczIgPj4gMjRdIF4gVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRkMlsoczAgPj4gIDgpICYgMHhmZl0gXiBUZDNbczMgJiAweGZmXSBeIHJrWzE0XTsKLSAgICB0MyA9IFRkMFtzMyA+PiAyNF0gXiBUZDFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMCAmIDB4ZmZdIF4gcmtbMTVdOwotICAgIC8qIHJvdW5kIDQ6ICovCi0gICAgczAgPSBUZDBbdDAgPj4gMjRdIF4gVGQxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRkMlsodDIgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDEgJiAweGZmXSBeIHJrWzE2XTsKLSAgICBzMSA9IFRkMFt0MSA+PiAyNF0gXiBUZDFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MyA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MiAmIDB4ZmZdIF4gcmtbMTddOwotICAgIHMyID0gVGQwW3QyID4+IDI0XSBeIFRkMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QzICYgMHhmZl0gXiBya1sxOF07Ci0gICAgczMgPSBUZDBbdDMgPj4gMjRdIF4gVGQxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRkMlsodDEgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDAgJiAweGZmXSBeIHJrWzE5XTsKLSAgICAvKiByb3VuZCA1OiAqLwotICAgIHQwID0gVGQwW3MwID4+IDI0XSBeIFRkMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MxICYgMHhmZl0gXiBya1syMF07Ci0gICAgdDEgPSBUZDBbczEgPj4gMjRdIF4gVGQxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRkMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZDNbczIgJiAweGZmXSBeIHJrWzIxXTsKLSAgICB0MiA9IFRkMFtzMiA+PiAyNF0gXiBUZDFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMyAmIDB4ZmZdIF4gcmtbMjJdOwotICAgIHQzID0gVGQwW3MzID4+IDI0XSBeIFRkMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MwICYgMHhmZl0gXiBya1syM107Ci0gICAgLyogcm91bmQgNjogKi8KLSAgICBzMCA9IFRkMFt0MCA+PiAyNF0gXiBUZDFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MiA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MSAmIDB4ZmZdIF4gcmtbMjRdOwotICAgIHMxID0gVGQwW3QxID4+IDI0XSBeIFRkMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QyICYgMHhmZl0gXiBya1syNV07Ci0gICAgczIgPSBUZDBbdDIgPj4gMjRdIF4gVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRkMlsodDAgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDMgJiAweGZmXSBeIHJrWzI2XTsKLSAgICBzMyA9IFRkMFt0MyA+PiAyNF0gXiBUZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MSA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MCAmIDB4ZmZdIF4gcmtbMjddOwotICAgIC8qIHJvdW5kIDc6ICovCi0gICAgdDAgPSBUZDBbczAgPj4gMjRdIF4gVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRkMlsoczIgPj4gIDgpICYgMHhmZl0gXiBUZDNbczEgJiAweGZmXSBeIHJrWzI4XTsKLSAgICB0MSA9IFRkMFtzMSA+PiAyNF0gXiBUZDFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMiAmIDB4ZmZdIF4gcmtbMjldOwotICAgIHQyID0gVGQwW3MyID4+IDI0XSBeIFRkMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MzICYgMHhmZl0gXiBya1szMF07Ci0gICAgdDMgPSBUZDBbczMgPj4gMjRdIF4gVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRkMlsoczEgPj4gIDgpICYgMHhmZl0gXiBUZDNbczAgJiAweGZmXSBeIHJrWzMxXTsKLSAgICAvKiByb3VuZCA4OiAqLwotICAgIHMwID0gVGQwW3QwID4+IDI0XSBeIFRkMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QxICYgMHhmZl0gXiBya1szMl07Ci0gICAgczEgPSBUZDBbdDEgPj4gMjRdIF4gVGQxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRkMlsodDMgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDIgJiAweGZmXSBeIHJrWzMzXTsKLSAgICBzMiA9IFRkMFt0MiA+PiAyNF0gXiBUZDFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MCA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MyAmIDB4ZmZdIF4gcmtbMzRdOwotICAgIHMzID0gVGQwW3QzID4+IDI0XSBeIFRkMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QwICYgMHhmZl0gXiBya1szNV07Ci0gICAgLyogcm91bmQgOTogKi8KLSAgICB0MCA9IFRkMFtzMCA+PiAyNF0gXiBUZDFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMSAmIDB4ZmZdIF4gcmtbMzZdOwotICAgIHQxID0gVGQwW3MxID4+IDI0XSBeIFRkMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MyICYgMHhmZl0gXiBya1szN107Ci0gICAgdDIgPSBUZDBbczIgPj4gMjRdIF4gVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRkMlsoczAgPj4gIDgpICYgMHhmZl0gXiBUZDNbczMgJiAweGZmXSBeIHJrWzM4XTsKLSAgICB0MyA9IFRkMFtzMyA+PiAyNF0gXiBUZDFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMCAmIDB4ZmZdIF4gcmtbMzldOwotICAgIGlmIChOciA+IDEwKSB7Ci0JLyogcm91bmQgMTA6ICovCi0JczAgPSBUZDBbdDAgPj4gMjRdIF4gVGQxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRkMlsodDIgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDEgJiAweGZmXSBeIHJrWzQwXTsKLQlzMSA9IFRkMFt0MSA+PiAyNF0gXiBUZDFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MyA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MiAmIDB4ZmZdIF4gcmtbNDFdOwotCXMyID0gVGQwW3QyID4+IDI0XSBeIFRkMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QzICYgMHhmZl0gXiBya1s0Ml07Ci0JczMgPSBUZDBbdDMgPj4gMjRdIF4gVGQxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRkMlsodDEgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDAgJiAweGZmXSBeIHJrWzQzXTsKLQkvKiByb3VuZCAxMTogKi8KLQl0MCA9IFRkMFtzMCA+PiAyNF0gXiBUZDFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMSAmIDB4ZmZdIF4gcmtbNDRdOwotCXQxID0gVGQwW3MxID4+IDI0XSBeIFRkMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MyICYgMHhmZl0gXiBya1s0NV07Ci0JdDIgPSBUZDBbczIgPj4gMjRdIF4gVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRkMlsoczAgPj4gIDgpICYgMHhmZl0gXiBUZDNbczMgJiAweGZmXSBeIHJrWzQ2XTsKLQl0MyA9IFRkMFtzMyA+PiAyNF0gXiBUZDFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMCAmIDB4ZmZdIF4gcmtbNDddOwotCWlmIChOciA+IDEyKSB7Ci0JICAgIC8qIHJvdW5kIDEyOiAqLwotCSAgICBzMCA9IFRkMFt0MCA+PiAyNF0gXiBUZDFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MiA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MSAmIDB4ZmZdIF4gcmtbNDhdOwotCSAgICBzMSA9IFRkMFt0MSA+PiAyNF0gXiBUZDFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MyA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MiAmIDB4ZmZdIF4gcmtbNDldOwotCSAgICBzMiA9IFRkMFt0MiA+PiAyNF0gXiBUZDFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MCA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MyAmIDB4ZmZdIF4gcmtbNTBdOwotCSAgICBzMyA9IFRkMFt0MyA+PiAyNF0gXiBUZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MSA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MCAmIDB4ZmZdIF4gcmtbNTFdOwotCSAgICAvKiByb3VuZCAxMzogKi8KLQkgICAgdDAgPSBUZDBbczAgPj4gMjRdIF4gVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRkMlsoczIgPj4gIDgpICYgMHhmZl0gXiBUZDNbczEgJiAweGZmXSBeIHJrWzUyXTsKLQkgICAgdDEgPSBUZDBbczEgPj4gMjRdIF4gVGQxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRkMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZDNbczIgJiAweGZmXSBeIHJrWzUzXTsKLQkgICAgdDIgPSBUZDBbczIgPj4gMjRdIF4gVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRkMlsoczAgPj4gIDgpICYgMHhmZl0gXiBUZDNbczMgJiAweGZmXSBeIHJrWzU0XTsKLQkgICAgdDMgPSBUZDBbczMgPj4gMjRdIF4gVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRkMlsoczEgPj4gIDgpICYgMHhmZl0gXiBUZDNbczAgJiAweGZmXSBeIHJrWzU1XTsKLQl9Ci0gICAgfQotCXJrICs9IE5yIDw8IDI7Ci0jZWxzZSAgLyogIUZVTExfVU5ST0xMICovCi0gICAgLyoKLSAgICAgKiBOciAtIDEgZnVsbCByb3VuZHM6Ci0gICAgICovCi0gICAgciA9IE5yID4+IDE7Ci0gICAgZm9yICg7OykgewotCXQwID0KLQkgICAgVGQwWyhzMCA+PiAyNCkgICAgICAgXSBeCi0JICAgIFRkMVsoczMgPj4gMTYpICYgMHhmZl0gXgotCSAgICBUZDJbKHMyID4+ICA4KSAmIDB4ZmZdIF4KLQkgICAgVGQzWyhzMSAgICAgICkgJiAweGZmXSBeCi0JICAgIHJrWzRdOwotCXQxID0KLQkgICAgVGQwWyhzMSA+PiAyNCkgICAgICAgXSBeCi0JICAgIFRkMVsoczAgPj4gMTYpICYgMHhmZl0gXgotCSAgICBUZDJbKHMzID4+ICA4KSAmIDB4ZmZdIF4KLQkgICAgVGQzWyhzMiAgICAgICkgJiAweGZmXSBeCi0JICAgIHJrWzVdOwotCXQyID0KLQkgICAgVGQwWyhzMiA+PiAyNCkgICAgICAgXSBeCi0JICAgIFRkMVsoczEgPj4gMTYpICYgMHhmZl0gXgotCSAgICBUZDJbKHMwID4+ICA4KSAmIDB4ZmZdIF4KLQkgICAgVGQzWyhzMyAgICAgICkgJiAweGZmXSBeCi0JICAgIHJrWzZdOwotCXQzID0KLQkgICAgVGQwWyhzMyA+PiAyNCkgICAgICAgXSBeCi0JICAgIFRkMVsoczIgPj4gMTYpICYgMHhmZl0gXgotCSAgICBUZDJbKHMxID4+ICA4KSAmIDB4ZmZdIF4KLQkgICAgVGQzWyhzMCAgICAgICkgJiAweGZmXSBeCi0JICAgIHJrWzddOwotCi0JcmsgKz0gODsKLQlpZiAoLS1yID09IDApIHsKLQkgICAgYnJlYWs7Ci0JfQotCi0JczAgPQotCSAgICBUZDBbKHQwID4+IDI0KSAgICAgICBdIF4KLQkgICAgVGQxWyh0MyA+PiAxNikgJiAweGZmXSBeCi0JICAgIFRkMlsodDIgPj4gIDgpICYgMHhmZl0gXgotCSAgICBUZDNbKHQxICAgICAgKSAmIDB4ZmZdIF4KLQkgICAgcmtbMF07Ci0JczEgPQotCSAgICBUZDBbKHQxID4+IDI0KSAgICAgICBdIF4KLQkgICAgVGQxWyh0MCA+PiAxNikgJiAweGZmXSBeCi0JICAgIFRkMlsodDMgPj4gIDgpICYgMHhmZl0gXgotCSAgICBUZDNbKHQyICAgICAgKSAmIDB4ZmZdIF4KLQkgICAgcmtbMV07Ci0JczIgPQotCSAgICBUZDBbKHQyID4+IDI0KSAgICAgICBdIF4KLQkgICAgVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeCi0JICAgIFRkMlsodDAgPj4gIDgpICYgMHhmZl0gXgotCSAgICBUZDNbKHQzICAgICAgKSAmIDB4ZmZdIF4KLQkgICAgcmtbMl07Ci0JczMgPQotCSAgICBUZDBbKHQzID4+IDI0KSAgICAgICBdIF4KLQkgICAgVGQxWyh0MiA+PiAxNikgJiAweGZmXSBeCi0JICAgIFRkMlsodDEgPj4gIDgpICYgMHhmZl0gXgotCSAgICBUZDNbKHQwICAgICAgKSAmIDB4ZmZdIF4KLQkgICAgcmtbM107Ci0gICAgfQotI2VuZGlmIC8qID9GVUxMX1VOUk9MTCAqLwotICAgIC8qCi0JICogYXBwbHkgbGFzdCByb3VuZCBhbmQKLQkgKiBtYXAgY2lwaGVyIHN0YXRlIHRvIGJ5dGUgYXJyYXkgYmxvY2s6Ci0JICovCi0JczAgPQotCQkoVGQ0Wyh0MCA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDApIF4KLQkJKFRkNFsodDMgPj4gMTYpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCi0JCShUZDRbKHQyID4+ICA4KSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXgotCQkoVGQ0Wyh0MSAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmYpIF4KLQkJcmtbMF07Ci0JUFVUVTMyKHB0ICAgICAsIHMwKTsKLQlzMSA9Ci0JCShUZDRbKHQxID4+IDI0KSAgICAgICBdICYgMHhmZjAwMDAwMCkgXgotCQkoVGQ0Wyh0MCA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDApIF4KLQkJKFRkNFsodDMgPj4gIDgpICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeCi0JCShUZDRbKHQyICAgICAgKSAmIDB4ZmZdICYgMHgwMDAwMDBmZikgXgotCQlya1sxXTsKLQlQVVRVMzIocHQgKyAgNCwgczEpOwotCXMyID0KLQkJKFRkNFsodDIgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCi0JCShUZDRbKHQxID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgotCQkoVGQ0Wyh0MCA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KLQkJKFRkNFsodDMgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKSBeCi0JCXJrWzJdOwotCVBVVFUzMihwdCArICA4LCBzMik7Ci0JczMgPQotCQkoVGQ0Wyh0MyA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDApIF4KLQkJKFRkNFsodDIgPj4gMTYpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCi0JCShUZDRbKHQxID4+ICA4KSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXgotCQkoVGQ0Wyh0MCAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmYpIF4KLQkJcmtbM107Ci0JUFVUVTMyKHB0ICsgMTIsIHMzKTsKLX0KLQotdm9pZAotcmlqbmRhZWxfc2V0X2tleShyaWpuZGFlbF9jdHggKmN0eCwgdV9jaGFyICprZXksIGludCBiaXRzLCBpbnQgZG9fZW5jcnlwdCkKLXsKLQljdHgtPk5yID0gcmlqbmRhZWxLZXlTZXR1cEVuYyhjdHgtPmVrLCBrZXksIGJpdHMpOwotCWlmIChkb19lbmNyeXB0KSB7Ci0JCWN0eC0+ZGVjcnlwdCA9IDA7Ci0JCW1lbXNldChjdHgtPmRrLCAwLCBzaXplb2YoY3R4LT5kaykpOwotCX0gZWxzZSB7Ci0JCWN0eC0+ZGVjcnlwdCA9IDE7Ci0JCW1lbWNweShjdHgtPmRrLCBjdHgtPmVrLCBzaXplb2YoY3R4LT5kaykpOwotCQlyaWpuZGFlbEtleVNldHVwRGVjKGN0eC0+ZGssIGtleSwgYml0cywgY3R4LT5Ocik7Ci0JfQotfQotCi12b2lkCi1yaWpuZGFlbF9kZWNyeXB0KHJpam5kYWVsX2N0eCAqY3R4LCB1X2NoYXIgKnNyYywgdV9jaGFyICpkc3QpCi17Ci0JcmlqbmRhZWxEZWNyeXB0KGN0eC0+ZGssIGN0eC0+TnIsIHNyYywgZHN0KTsKLX0KLQotdm9pZAotcmlqbmRhZWxfZW5jcnlwdChyaWpuZGFlbF9jdHggKmN0eCwgdV9jaGFyICpzcmMsIHVfY2hhciAqZHN0KQotewotCXJpam5kYWVsRW5jcnlwdChjdHgtPmVrLCBjdHgtPk5yLCBzcmMsIGRzdCk7Ci19CmRpZmYgLS1naXQgYS9yaWpuZGFlbC5oIGIvcmlqbmRhZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxNGJiMS4uMDAwMDAwMAotLS0gYS9yaWpuZGFlbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHJpam5kYWVsLmgsdiAxLjEyIDIwMDEvMTIvMTkgMDc6MTg6NTYgZGVyYWFkdCBFeHAgJCAqLwotCi0vKioKLSAqIHJpam5kYWVsLWFsZy1mc3QuaAotICoKLSAqIEB2ZXJzaW9uIDMuMCAoRGVjZW1iZXIgMjAwMCkKLSAqCi0gKiBPcHRpbWlzZWQgQU5TSSBDIGNvZGUgZm9yIHRoZSBSaWpuZGFlbCBjaXBoZXIgKG5vdyBBRVMpCi0gKgotICogQGF1dGhvciBWaW5jZW50IFJpam1lbiA8dmluY2VudC5yaWptZW5AZXNhdC5rdWxldXZlbi5hYy5iZT4KLSAqIEBhdXRob3IgQW50b29uIEJvc3NlbGFlcnMgPGFudG9vbi5ib3NzZWxhZXJzQGVzYXQua3VsZXV2ZW4uYWMuYmU+Ci0gKiBAYXV0aG9yIFBhdWxvIEJhcnJldG8gPHBhdWxvLmJhcnJldG9AdGVycmEuY29tLmJyPgotICoKLSAqIFRoaXMgY29kZSBpcyBoZXJlYnkgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUlMgJydBUyBJUycnIEFORCBBTlkgRVhQUkVTUwotICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCi0gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0jaWZuZGVmIF9fUklKTkRBRUxfSAotI2RlZmluZSBfX1JJSk5EQUVMX0gKLQotI2RlZmluZSBNQVhLQwkoMjU2LzMyKQotI2RlZmluZSBNQVhLQgkoMjU2LzgpCi0jZGVmaW5lIE1BWE5SCTE0Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhcgl1ODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJdTE2OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQJdTMyOwotCi0vKiAgVGhlIHN0cnVjdHVyZSBmb3Iga2V5IGluZm9ybWF0aW9uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50CWRlY3J5cHQ7Ci0JaW50CU5yOwkJCS8qIGtleS1sZW5ndGgtZGVwZW5kZW50IG51bWJlciBvZiByb3VuZHMgKi8KLQl1MzIJZWtbNCooTUFYTlIgKyAxKV07CS8qIGVuY3J5cHQga2V5IHNjaGVkdWxlICovCi0JdTMyCWRrWzQqKE1BWE5SICsgMSldOwkvKiBkZWNyeXB0IGtleSBzY2hlZHVsZSAqLwotfSByaWpuZGFlbF9jdHg7Ci0KLXZvaWQJIHJpam5kYWVsX3NldF9rZXkocmlqbmRhZWxfY3R4ICosIHVfY2hhciAqLCBpbnQsIGludCk7Ci12b2lkCSByaWpuZGFlbF9kZWNyeXB0KHJpam5kYWVsX2N0eCAqLCB1X2NoYXIgKiwgdV9jaGFyICopOwotdm9pZAkgcmlqbmRhZWxfZW5jcnlwdChyaWpuZGFlbF9jdHggKiwgdV9jaGFyICosIHVfY2hhciAqKTsKLQotI2VuZGlmIC8qIF9fUklKTkRBRUxfSCAqLwpkaWZmIC0tZ2l0IGEvcm9hbWluZy5oIGIvcm9hbWluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmI5NGNjLi4wMDAwMDAwCi0tLSBhL3JvYW1pbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qICRPcGVuQlNEOiByb2FtaW5nLmgsdiAxLjUgMjAwOS8xMC8yNCAxMToxMTo1OCBhbmRyZWFzIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDkgQXBwR2F0ZSBOZXR3b3JrIFNlY3VyaXR5IEFCCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBST0FNSU5HX0gKLSNkZWZpbmUgUk9BTUlOR19ICi0KLSNkZWZpbmUgREVGQVVMVF9ST0FNQlVGIDY1NTM2Ci0jZGVmaW5lIFJPQU1JTkdfUkVRVUVTVCAicm9hbWluZ0BhcHBnYXRlLmNvbSIKLQotZXh0ZXJuIGludCByb2FtaW5nX2VuYWJsZWQ7Ci1leHRlcm4gaW50IHJlc3VtZV9pbl9wcm9ncmVzczsKLQotdm9pZAlyZXF1ZXN0X3JvYW1pbmcodm9pZCk7Ci1pbnQJZ2V0X3NuZF9idWZfc2l6ZSh2b2lkKTsKLWludAlnZXRfcmVjdl9idWZfc2l6ZSh2b2lkKTsKLXZvaWQJYWRkX3JlY3ZfYnl0ZXModV9pbnQ2NF90KTsKLWludAl3YWl0X2Zvcl9yb2FtaW5nX3JlY29ubmVjdCh2b2lkKTsKLXZvaWQJcm9hbWluZ19yZXBseShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKLXZvaWQJc2V0X291dF9idWZmZXJfc2l6ZShzaXplX3QpOwotc3NpemVfdAlyb2FtaW5nX3dyaXRlKGludCwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCAqKTsKLXNzaXplX3QJcm9hbWluZ19yZWFkKGludCwgdm9pZCAqLCBzaXplX3QsIGludCAqKTsKLXNpemVfdAlyb2FtaW5nX2F0b21pY2lvKHNzaXplX3QgKCopKGludCwgdm9pZCAqLCBzaXplX3QpLCBpbnQsIHZvaWQgKiwgc2l6ZV90KTsKLXVfaW50NjRfdAlnZXRfcmVjdl9ieXRlcyh2b2lkKTsKLXVfaW50NjRfdAlnZXRfc2VudF9ieXRlcyh2b2lkKTsKLXZvaWQJcm9hbV9zZXRfYnl0ZXModV9pbnQ2NF90LCB1X2ludDY0X3QpOwotdm9pZAlyZXNlbmRfYnl0ZXMoaW50LCB1X2ludDY0X3QgKik7Ci12b2lkCWNhbGN1bGF0ZV9uZXdfa2V5KHVfaW50NjRfdCAqLCB1X2ludDY0X3QsIHVfaW50NjRfdCk7Ci1pbnQJcmVzdW1lX2tleCh2b2lkKTsKLQotI2VuZGlmIC8qIFJPQU1JTkcgKi8KZGlmZiAtLWdpdCBhL3JvYW1pbmdfY2xpZW50LmMgYi9yb2FtaW5nX2NsaWVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWE4ZTczLi4wMDAwMDAwCi0tLSBhL3JvYW1pbmdfY2xpZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHJvYW1pbmdfY2xpZW50LmMsdiAxLjMgMjAxMC8wMS8xOCAwMTo1MDoyNyBkdHVja2VyIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDkgQXBwR2F0ZSBOZXR3b3JrIFNlY3VyaXR5IEFCCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgotI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAiY2hhbm5lbHMuaCIKLSNpbmNsdWRlICJjaXBoZXIuaCIKLSNpbmNsdWRlICJkaXNwYXRjaC5oIgotI2luY2x1ZGUgImNsaWVudGxvb3AuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJtYXRjaC5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJzc2guaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJrZXguaCIKLSNpbmNsdWRlICJyZWFkY29uZi5oIgotI2luY2x1ZGUgInJvYW1pbmcuaCIKLSNpbmNsdWRlICJzc2gyLmgiCi0jaW5jbHVkZSAic3NoY29ubmVjdC5oIgotCi0vKiBpbXBvcnQgKi8KLWV4dGVybiBPcHRpb25zIG9wdGlvbnM7Ci1leHRlcm4gY2hhciAqaG9zdDsKLWV4dGVybiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBob3N0YWRkcjsKLWV4dGVybiBpbnQgc2Vzc2lvbl9yZXN1bWVkOwotCi1zdGF0aWMgdV9pbnQzMl90IHJvYW1pbmdfaWQ7Ci1zdGF0aWMgdV9pbnQ2NF90IGNvb2tpZTsKLXN0YXRpYyB1X2ludDY0X3QgbGFzdHNlZW5jaGFsbDsKLXN0YXRpYyB1X2ludDY0X3Qga2V5MSwga2V5Miwgb2xka2V5MSwgb2xka2V5MjsKLQotdm9pZAotcm9hbWluZ19yZXBseShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlpZiAodHlwZSA9PSBTU0gyX01TR19SRVFVRVNUX0ZBSUxVUkUpIHsKLQkJbG9naXQoIlNlcnZlciBkZW5pZWQgcm9hbWluZyIpOwotCQlyZXR1cm47Ci0JfQotCXZlcmJvc2UoIlJvYW1pbmcgZW5hYmxlZCIpOwotCXJvYW1pbmdfaWQgPSBwYWNrZXRfZ2V0X2ludCgpOwotCWNvb2tpZSA9IHBhY2tldF9nZXRfaW50NjQoKTsKLQlrZXkxID0gb2xka2V5MSA9IHBhY2tldF9nZXRfaW50NjQoKTsKLQlrZXkyID0gb2xka2V5MiA9IHBhY2tldF9nZXRfaW50NjQoKTsKLQlzZXRfb3V0X2J1ZmZlcl9zaXplKHBhY2tldF9nZXRfaW50KCkgKyAgZ2V0X3NuZF9idWZfc2l6ZSgpKTsKLQlyb2FtaW5nX2VuYWJsZWQgPSAxOwotfQotCi12b2lkCi1yZXF1ZXN0X3JvYW1pbmcodm9pZCkKLXsKLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfR0xPQkFMX1JFUVVFU1QpOwotCXBhY2tldF9wdXRfY3N0cmluZyhST0FNSU5HX1JFUVVFU1QpOwotCXBhY2tldF9wdXRfY2hhcigxKTsKLQlwYWNrZXRfcHV0X2ludChnZXRfcmVjdl9idWZfc2l6ZSgpKTsKLQlwYWNrZXRfc2VuZCgpOwotCWNsaWVudF9yZWdpc3Rlcl9nbG9iYWxfY29uZmlybShyb2FtaW5nX3JlcGx5LCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQKLXJvYW1pbmdfYXV0aF9yZXF1aXJlZCh2b2lkKQotewotCXVfY2hhciBkaWdlc3RbU0hBX0RJR0VTVF9MRU5HVEhdOwotCUVWUF9NRF9DVFggbWQ7Ci0JQnVmZmVyIGI7Ci0JY29uc3QgRVZQX01EICpldnBfbWQgPSBFVlBfc2hhMSgpOwotCXVfaW50NjRfdCBjaGFsbCwgb2xkY2hhbGw7Ci0KLQljaGFsbCA9IHBhY2tldF9nZXRfaW50NjQoKTsKLQlvbGRjaGFsbCA9IHBhY2tldF9nZXRfaW50NjQoKTsKLQlpZiAob2xkY2hhbGwgIT0gbGFzdHNlZW5jaGFsbCkgewotCQlrZXkxID0gb2xka2V5MTsKLQkJa2V5MiA9IG9sZGtleTI7Ci0JfQotCWxhc3RzZWVuY2hhbGwgPSBjaGFsbDsKLQotCWJ1ZmZlcl9pbml0KCZiKTsKLQlidWZmZXJfcHV0X2ludDY0KCZiLCBjb29raWUpOwotCWJ1ZmZlcl9wdXRfaW50NjQoJmIsIGNoYWxsKTsKLQlFVlBfRGlnZXN0SW5pdCgmbWQsIGV2cF9tZCk7Ci0JRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7Ci0JRVZQX0RpZ2VzdEZpbmFsKCZtZCwgZGlnZXN0LCBOVUxMKTsKLQlidWZmZXJfZnJlZSgmYik7Ci0KLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfS0VYX1JPQU1JTkdfQVVUSCk7Ci0JcGFja2V0X3B1dF9pbnQ2NChrZXkxIF4gZ2V0X3JlY3ZfYnl0ZXMoKSk7Ci0JcGFja2V0X3B1dF9yYXcoZGlnZXN0LCBzaXplb2YoZGlnZXN0KSk7Ci0JcGFja2V0X3NlbmQoKTsKLQotCW9sZGtleTEgPSBrZXkxOwotCW9sZGtleTIgPSBrZXkyOwotCWNhbGN1bGF0ZV9uZXdfa2V5KCZrZXkxLCBjb29raWUsIGNoYWxsKTsKLQljYWxjdWxhdGVfbmV3X2tleSgma2V5MiwgY29va2llLCBjaGFsbCk7Ci0KLQlkZWJ1ZygiUmVjZWl2ZWQgJWxsdSBieXRlcyIsICh1bnNpZ25lZCBsb25nIGxvbmcpZ2V0X3JlY3ZfYnl0ZXMoKSk7Ci0JZGVidWcoIlNlbnQgcm9hbWluZ19hdXRoIHBhY2tldCIpOwotfQotCi1pbnQKLXJlc3VtZV9rZXgodm9pZCkKLXsKLQkvKgotCSAqIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gLSBpZiB0aGUgY2xpZW50IHNlbmRzIHRoZSBrZXggbWV0aG9kCi0JICogcmVzdW1lQGFwcGdhdGUuY29tIHRoZW4gdGhlIGtleCBpcyBkb25lIGluIHJvYW1pbmdfcmVzdW1lKCkuCi0JICovCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXJvYW1pbmdfcmVzdW1lKHZvaWQpCi17Ci0JdV9pbnQ2NF90IHJlY3ZfYnl0ZXM7Ci0JY2hhciAqc3RyID0gTlVMTCwgKmtleGxpc3QgPSBOVUxMLCAqYzsKLQlpbnQgaSwgdHlwZTsKLQlpbnQgdGltZW91dF9tcyA9IG9wdGlvbnMuY29ubmVjdGlvbl90aW1lb3V0ICogMTAwMDsKLQl1X2ludCBsZW47Ci0JdV9pbnQzMl90IHJuZCA9IDA7Ci0KLQlyZXN1bWVfaW5fcHJvZ3Jlc3MgPSAxOwotCi0JLyogRXhjaGFuZ2UgYmFubmVycyAqLwotCXNzaF9leGNoYW5nZV9pZGVudGlmaWNhdGlvbih0aW1lb3V0X21zKTsKLQlwYWNrZXRfc2V0X25vbmJsb2NraW5nKCk7Ci0KLQkvKiBTZW5kIGEga2V4aW5pdCBtZXNzYWdlIHdpdGggcmVzdW1lQGFwcGdhdGUuY29tIGFzIG9ubHkga2V4IGFsZ28gKi8KLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfS0VYSU5JVCk7Ci0JZm9yIChpID0gMDsgaSA8IEtFWF9DT09LSUVfTEVOOyBpKyspIHsKLQkJaWYgKGkgJSA0ID09IDApCi0JCQlybmQgPSBhcmM0cmFuZG9tKCk7Ci0JCXBhY2tldF9wdXRfY2hhcihybmQgJiAweGZmKTsKLQkJcm5kID4+PSA4OwotCX0KLQlwYWNrZXRfcHV0X2NzdHJpbmcoS0VYX1JFU1VNRSk7Ci0JZm9yIChpID0gMTsgaSA8IFBST1BPU0FMX01BWDsgaSsrKSB7Ci0JCS8qIGtleCBhbGdvcml0aG0gYWRkZWQgc28gc3RhcnQgd2l0aCBpPTEgYW5kIG5vdCAwICovCi0JCXBhY2tldF9wdXRfY3N0cmluZygiIik7IC8qIE5vdCB1c2VkIHdoZW4gd2UgcmVzdW1lICovCi0JfQotCXBhY2tldF9wdXRfY2hhcigxKTsgLyogZmlyc3Qga2V4X3BhY2tldCBmb2xsb3dzICovCi0JcGFja2V0X3B1dF9pbnQoMCk7IC8qIHJlc2VydmVkICovCi0JcGFja2V0X3NlbmQoKTsKLQotCS8qIEFzc3VtZSB0aGF0IHJlc3VtZUBhcHBnYXRlLmNvbSB3aWxsIGJlIGFjY2VwdGVkICovCi0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0tFWF9ST0FNSU5HX1JFU1VNRSk7Ci0JcGFja2V0X3B1dF9pbnQocm9hbWluZ19pZCk7Ci0JcGFja2V0X3NlbmQoKTsKLQotCS8qIFJlYWQgdGhlIHNlcnZlcidzIGtleGluaXQgYW5kIGNoZWNrIGZvciByZXN1bWVAYXBwZ2F0ZS5jb20gKi8KLQlpZiAoKHR5cGUgPSBwYWNrZXRfcmVhZCgpKSAhPSBTU0gyX01TR19LRVhJTklUKSB7Ci0JCWRlYnVnKCJleHBlY3RlZCBrZXhpbml0IG9uIHJlc3VtZSwgZ290ICVkIiwgdHlwZSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IEtFWF9DT09LSUVfTEVOOyBpKyspCi0JCSh2b2lkKXBhY2tldF9nZXRfY2hhcigpOwotCWtleGxpc3QgPSBwYWNrZXRfZ2V0X3N0cmluZygmbGVuKTsKLQlpZiAoIWtleGxpc3QKLQkgICAgfHwgKHN0ciA9IG1hdGNoX2xpc3QoS0VYX1JFU1VNRSwga2V4bGlzdCwgTlVMTCkpID09IE5VTEwpIHsKLQkJZGVidWcoInNlcnZlciBkb2Vzbid0IGFsbG93IHJlc3VtZSIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXhmcmVlKHN0cik7Ci0JZm9yIChpID0gMTsgaSA8IFBST1BPU0FMX01BWDsgaSsrKSB7Ci0JCS8qIGtleCBhbGdvcml0aG0gdGFrZW4gY2FyZSBvZiBzbyBzdGFydCB3aXRoIGk9MSBhbmQgbm90IDAgKi8KLQkJeGZyZWUocGFja2V0X2dldF9zdHJpbmcoJmxlbikpOwotCX0KLQlpID0gcGFja2V0X2dldF9jaGFyKCk7IC8qIGZpcnN0X2tleF9wYWNrZXRfZm9sbG93cyAqLwotCWlmIChpICYmIChjID0gc3RyY2hyKGtleGxpc3QsICcsJykpKQotCQkqYyA9IDA7Ci0JaWYgKGkgJiYgc3RyY21wKGtleGxpc3QsIEtFWF9SRVNVTUUpKSB7Ci0JCWRlYnVnKCJzZXJ2ZXIncyBrZXggZ3Vlc3MgKCVzKSB3YXMgd3JvbmcsIHNraXBwaW5nIiwga2V4bGlzdCk7Ci0JCSh2b2lkKXBhY2tldF9yZWFkKCk7IC8qIFdyb25nIGd1ZXNzIC0gZGlzY2FyZCBwYWNrZXQgKi8KLQl9Ci0KLQkvKgotCSAqIFJlYWQgdGhlIFJPQU1JTkdfQVVUSF9SRVFVSVJFRCBjaGFsbGVuZ2UgZnJvbSB0aGUgc2VydmVyIGFuZAotCSAqIHNlbmQgUk9BTUlOR19BVVRICi0JICovCi0JaWYgKCh0eXBlID0gcGFja2V0X3JlYWQoKSkgIT0gU1NIMl9NU0dfS0VYX1JPQU1JTkdfQVVUSF9SRVFVSVJFRCkgewotCQlkZWJ1ZygiZXhwZWN0ZWQgcm9hbWluZ19hdXRoX3JlcXVpcmVkLCBnb3QgJWQiLCB0eXBlKTsKLQkJZ290byBmYWlsOwotCX0KLQlyb2FtaW5nX2F1dGhfcmVxdWlyZWQoKTsKLQotCS8qIFJlYWQgUk9BTUlOR19BVVRIX09LIGZyb20gdGhlIHNlcnZlciAqLwotCWlmICgodHlwZSA9IHBhY2tldF9yZWFkKCkpICE9IFNTSDJfTVNHX0tFWF9ST0FNSU5HX0FVVEhfT0spIHsKLQkJZGVidWcoImV4cGVjdGVkIHJvYW1pbmdfYXV0aF9vaywgZ290ICVkIiwgdHlwZSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmVjdl9ieXRlcyA9IHBhY2tldF9nZXRfaW50NjQoKSBeIG9sZGtleTI7Ci0JZGVidWcoIlBlZXIgcmVjZWl2ZWQgJWxsdSBieXRlcyIsICh1bnNpZ25lZCBsb25nIGxvbmcpcmVjdl9ieXRlcyk7Ci0JcmVzZW5kX2J5dGVzKHBhY2tldF9nZXRfY29ubmVjdGlvbl9vdXQoKSwgJnJlY3ZfYnl0ZXMpOwotCi0JcmVzdW1lX2luX3Byb2dyZXNzID0gMDsKLQotCXNlc3Npb25fcmVzdW1lZCA9IDE7IC8qIFRlbGwgY2xpZW50bG9vcCAqLwotCi0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JaWYgKGtleGxpc3QpCi0JCXhmcmVlKGtleGxpc3QpOwotCWlmIChwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSA9PSBwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25fb3V0KCkpCi0JCWNsb3NlKHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpKTsKLQllbHNlIHsKLQkJY2xvc2UocGFja2V0X2dldF9jb25uZWN0aW9uX2luKCkpOwotCQljbG9zZShwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25fb3V0KCkpOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotaW50Ci13YWl0X2Zvcl9yb2FtaW5nX3JlY29ubmVjdCh2b2lkKQotewotCXN0YXRpYyBpbnQgcmVlbnRlcl9ndWFyZCA9IDA7Ci0JaW50IHRpbWVvdXRfbXMgPSBvcHRpb25zLmNvbm5lY3Rpb25fdGltZW91dCAqIDEwMDA7Ci0JaW50IGM7Ci0KLQlpZiAocmVlbnRlcl9ndWFyZCAhPSAwKQotCQlmYXRhbCgiU2VydmVyIHJlZnVzZWQgcmVzdW1lLCByb2FtaW5nIHRpbWVvdXQgbWF5IGJlIGV4Y2VlZGVkIik7Ci0JcmVlbnRlcl9ndWFyZCA9IDE7Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIltjb25uZWN0aW9uIHN1c3BlbmRlZCwgcHJlc3MgcmV0dXJuIHRvIHJlc3VtZV0iKTsKLQlmZmx1c2goc3RkZXJyKTsKLQlwYWNrZXRfYmFja3VwX3N0YXRlKCk7Ci0JLyogVE9ETyBQZXJoYXBzIHdlIHNob3VsZCByZWFkIGZyb20gdHR5IGhlcmUgKi8KLQl3aGlsZSAoKGMgPSBmZ2V0YyhzdGRpbikpICE9IEVPRikgewotCQlpZiAoYyA9PSAnWicgLSA2NCkgewotCQkJa2lsbChnZXRwaWQoKSwgU0lHVFNUUCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoYyAhPSAnXG4nICYmIGMgIT0gJ1xyJykKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChzc2hfY29ubmVjdChob3N0LCAmaG9zdGFkZHIsIG9wdGlvbnMucG9ydCwKLQkJICAgIG9wdGlvbnMuYWRkcmVzc19mYW1pbHksIDEsICZ0aW1lb3V0X21zLAotCQkgICAgb3B0aW9ucy50Y3Bfa2VlcF9hbGl2ZSwgb3B0aW9ucy51c2VfcHJpdmlsZWdlZF9wb3J0LAotCQkgICAgb3B0aW9ucy5wcm94eV9jb21tYW5kKSA9PSAwICYmIHJvYW1pbmdfcmVzdW1lKCkgPT0gMCkgewotCQkJcGFja2V0X3Jlc3RvcmVfc3RhdGUoKTsKLQkJCXJlZW50ZXJfZ3VhcmQgPSAwOwotCQkJZnByaW50ZihzdGRlcnIsICJbY29ubmVjdGlvbiByZXN1bWVkXVxuIik7Ci0JCQlmZmx1c2goc3RkZXJyKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJZnByaW50ZihzdGRlcnIsICJbcmVjb25uZWN0IGZhaWxlZCwgcHJlc3MgcmV0dXJuIHRvIHJldHJ5XSIpOwotCQlmZmx1c2goc3RkZXJyKTsKLQl9Ci0JZnByaW50ZihzdGRlcnIsICJbZXhpdGluZ11cbiIpOwotCWZmbHVzaChzdGRlcnIpOwotCWV4aXQoMCk7Ci19CmRpZmYgLS1naXQgYS9yb2FtaW5nX2NvbW1vbi5jIGIvcm9hbWluZ19jb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkYmU1Ni4uMDAwMDAwMAotLS0gYS9yb2FtaW5nX2NvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qICRPcGVuQlNEOiByb2FtaW5nX2NvbW1vbi5jLHYgMS44IDIwMTAvMDEvMTIgMDA6NTk6MjkgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDkgQXBwR2F0ZSBOZXR3b3JrIFNlY3VyaXR5IEFCCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJhdG9taWNpby5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgInBhY2tldC5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJjaXBoZXIuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJyb2FtaW5nLmgiCi0KLXN0YXRpYyBzaXplX3Qgb3V0X2J1Zl9zaXplID0gMDsKLXN0YXRpYyBjaGFyICpvdXRfYnVmID0gTlVMTDsKLXN0YXRpYyBzaXplX3Qgb3V0X3N0YXJ0Owotc3RhdGljIHNpemVfdCBvdXRfbGFzdDsKLQotc3RhdGljIHVfaW50NjRfdCB3cml0ZV9ieXRlcyA9IDA7Ci1zdGF0aWMgdV9pbnQ2NF90IHJlYWRfYnl0ZXMgPSAwOwotCi1pbnQgcm9hbWluZ19lbmFibGVkID0gMDsKLWludCByZXN1bWVfaW5fcHJvZ3Jlc3MgPSAwOwotCi1pbnQKLWdldF9zbmRfYnVmX3NpemUoKQotewotCWludCBmZCA9IHBhY2tldF9nZXRfY29ubmVjdGlvbl9vdXQoKTsKLQlpbnQgb3B0dmFsOwotCXNvY2tsZW5fdCBvcHR2YWxsZW4gPSBzaXplb2Yob3B0dmFsKTsKLQotCWlmIChnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19TTkRCVUYsICZvcHR2YWwsICZvcHR2YWxsZW4pICE9IDApCi0JCW9wdHZhbCA9IERFRkFVTFRfUk9BTUJVRjsKLQlyZXR1cm4gb3B0dmFsOwotfQotCi1pbnQKLWdldF9yZWN2X2J1Zl9zaXplKCkKLXsKLQlpbnQgZmQgPSBwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKTsKLQlpbnQgb3B0dmFsOwotCXNvY2tsZW5fdCBvcHR2YWxsZW4gPSBzaXplb2Yob3B0dmFsKTsKLQotCWlmIChnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZvcHR2YWwsICZvcHR2YWxsZW4pICE9IDApCi0JCW9wdHZhbCA9IERFRkFVTFRfUk9BTUJVRjsKLQlyZXR1cm4gb3B0dmFsOwotfQotCi12b2lkCi1zZXRfb3V0X2J1ZmZlcl9zaXplKHNpemVfdCBzaXplKQotewotCS8qCi0JICogVGhlIGJ1ZmZlciBzaXplIGNhbiBvbmx5IGJlIHNldCBvbmNlIGFuZCB0aGUgYnVmZmVyIHdpbGwgbGl2ZQotCSAqIGFzIGxvbmcgYXMgdGhlIHNlc3Npb24gbGl2ZXMuCi0JICovCi0JaWYgKG91dF9idWYgPT0gTlVMTCkgewotCQlvdXRfYnVmX3NpemUgPSBzaXplOwotCQlvdXRfYnVmID0geG1hbGxvYyhzaXplKTsKLQkJb3V0X3N0YXJ0ID0gMDsKLQkJb3V0X2xhc3QgPSAwOwotCX0KLX0KLQotdV9pbnQ2NF90Ci1nZXRfcmVjdl9ieXRlcyh2b2lkKQotewotCXJldHVybiByZWFkX2J5dGVzOwotfQotCi12b2lkCi1hZGRfcmVjdl9ieXRlcyh1X2ludDY0X3QgbnVtKQotewotCXJlYWRfYnl0ZXMgKz0gbnVtOwotfQotCi11X2ludDY0X3QKLWdldF9zZW50X2J5dGVzKHZvaWQpCi17Ci0JcmV0dXJuIHdyaXRlX2J5dGVzOwotfQotCi12b2lkCi1yb2FtX3NldF9ieXRlcyh1X2ludDY0X3Qgc2VudCwgdV9pbnQ2NF90IHJlY3ZkKQotewotCXJlYWRfYnl0ZXMgPSByZWN2ZDsKLQl3cml0ZV9ieXRlcyA9IHNlbnQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idWZfYXBwZW5kKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCWlmIChjb3VudCA+IG91dF9idWZfc2l6ZSkgewotCQlidWYgKz0gY291bnQgLSBvdXRfYnVmX3NpemU7Ci0JCWNvdW50ID0gb3V0X2J1Zl9zaXplOwotCX0KLQlpZiAoY291bnQgPCBvdXRfYnVmX3NpemUgLSBvdXRfbGFzdCkgewotCQltZW1jcHkob3V0X2J1ZiArIG91dF9sYXN0LCBidWYsIGNvdW50KTsKLQkJaWYgKG91dF9zdGFydCA+IG91dF9sYXN0KQotCQkJb3V0X3N0YXJ0ICs9IGNvdW50OwotCQlvdXRfbGFzdCArPSBjb3VudDsKLQl9IGVsc2UgewotCQkvKiBkYXRhIHdpbGwgd3JhcCAqLwotCQlzaXplX3QgY2h1bmsgPSBvdXRfYnVmX3NpemUgLSBvdXRfbGFzdDsKLQkJbWVtY3B5KG91dF9idWYgKyBvdXRfbGFzdCwgYnVmLCBjaHVuayk7Ci0JCW1lbWNweShvdXRfYnVmLCBidWYgKyBjaHVuaywgY291bnQgLSBjaHVuayk7Ci0JCW91dF9sYXN0ID0gY291bnQgLSBjaHVuazsKLQkJb3V0X3N0YXJ0ID0gb3V0X2xhc3QgKyAxOwotCX0KLX0KLQotc3NpemVfdAotcm9hbWluZ193cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgKmNvbnQpCi17Ci0Jc3NpemVfdCByZXQ7Ci0KLQlyZXQgPSB3cml0ZShmZCwgYnVmLCBjb3VudCk7Ci0JaWYgKHJldCA+IDAgJiYgIXJlc3VtZV9pbl9wcm9ncmVzcykgewotCQl3cml0ZV9ieXRlcyArPSByZXQ7Ci0JCWlmIChvdXRfYnVmX3NpemUgPiAwKQotCQkJYnVmX2FwcGVuZChidWYsIHJldCk7Ci0JfQotCWlmIChvdXRfYnVmX3NpemUgPiAwICYmCi0JICAgIChyZXQgPT0gMCB8fCAocmV0ID09IC0xICYmIGVycm5vID09IEVQSVBFKSkpIHsKLQkJaWYgKHdhaXRfZm9yX3JvYW1pbmdfcmVjb25uZWN0KCkgIT0gMCkgewotCQkJcmV0ID0gMDsKLQkJCSpjb250ID0gMTsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IC0xOwotCQkJZXJybm8gPSBFQUdBSU47Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3NpemVfdAotcm9hbWluZ19yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGludCAqY29udCkKLXsKLQlzc2l6ZV90IHJldCA9IHJlYWQoZmQsIGJ1ZiwgY291bnQpOwotCWlmIChyZXQgPiAwKSB7Ci0JCWlmICghcmVzdW1lX2luX3Byb2dyZXNzKSB7Ci0JCQlyZWFkX2J5dGVzICs9IHJldDsKLQkJfQotCX0gZWxzZSBpZiAob3V0X2J1Zl9zaXplID4gMCAmJgotCSAgICAocmV0ID09IDAgfHwgKHJldCA9PSAtMSAmJiAoZXJybm8gPT0gRUNPTk5SRVNFVAotCSAgICB8fCBlcnJubyA9PSBFQ09OTkFCT1JURUQgfHwgZXJybm8gPT0gRVRJTUVET1VUCi0JICAgIHx8IGVycm5vID09IEVIT1NUVU5SRUFDSCkpKSkgewotCQlkZWJ1Zygicm9hbWluZ19yZWFkIGZhaWxlZCBmb3IgJWQgIHJldD0lbGQgIGVycm5vPSVkIiwKLQkJICAgIGZkLCAobG9uZylyZXQsIGVycm5vKTsKLQkJcmV0ID0gMDsKLQkJaWYgKHdhaXRfZm9yX3JvYW1pbmdfcmVjb25uZWN0KCkgPT0gMCkKLQkJCSpjb250ID0gMTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc2l6ZV90Ci1yb2FtaW5nX2F0b21pY2lvKHNzaXplX3QoKmYpKGludCwgdm9pZCosIHNpemVfdCksIGludCBmZCwgdm9pZCAqYnVmLAotICAgIHNpemVfdCBjb3VudCkKLXsKLQlzaXplX3QgcmV0ID0gYXRvbWljaW8oZiwgZmQsIGJ1ZiwgY291bnQpOwotCi0JaWYgKGYgPT0gdndyaXRlICYmIHJldCA+IDAgJiYgIXJlc3VtZV9pbl9wcm9ncmVzcykgewotCQl3cml0ZV9ieXRlcyArPSByZXQ7Ci0JfSBlbHNlIGlmIChmID09IHJlYWQgJiYgcmV0ID4gMCAmJiAhcmVzdW1lX2luX3Byb2dyZXNzKSB7Ci0JCXJlYWRfYnl0ZXMgKz0gcmV0OwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkCi1yZXNlbmRfYnl0ZXMoaW50IGZkLCB1X2ludDY0X3QgKm9mZnNldCkKLXsKLQlzaXplX3QgYXZhaWxhYmxlLCBuZWVkZWQ7Ci0KLQlpZiAob3V0X3N0YXJ0IDwgb3V0X2xhc3QpCi0JCWF2YWlsYWJsZSA9IG91dF9sYXN0IC0gb3V0X3N0YXJ0OwotCWVsc2UKLQkJYXZhaWxhYmxlID0gb3V0X2J1Zl9zaXplOwotCW5lZWRlZCA9IHdyaXRlX2J5dGVzIC0gKm9mZnNldDsKLQlkZWJ1ZzMoInJlc2VuZF9ieXRlczogcmVzZW5kICVsdSBieXRlcyBmcm9tICVsbHUiLAotCSAgICAodW5zaWduZWQgbG9uZyluZWVkZWQsICh1bnNpZ25lZCBsb25nIGxvbmcpKm9mZnNldCk7Ci0JaWYgKG5lZWRlZCA+IGF2YWlsYWJsZSkKLQkJZmF0YWwoIk5lZWRlZCB0byByZXNlbmQgbW9yZSBkYXRhIHRoYW4gaW4gdGhlIGNhY2hlIik7Ci0JaWYgKG91dF9sYXN0IDwgbmVlZGVkKSB7Ci0JCWludCBjaHVua2VuZCA9IG5lZWRlZCAtIG91dF9sYXN0OwotCQlhdG9taWNpbyh2d3JpdGUsIGZkLCBvdXRfYnVmICsgb3V0X2J1Zl9zaXplIC0gY2h1bmtlbmQsCi0JCSAgICBjaHVua2VuZCk7Ci0JCWF0b21pY2lvKHZ3cml0ZSwgZmQsIG91dF9idWYsIG91dF9sYXN0KTsKLQl9IGVsc2UgewotCQlhdG9taWNpbyh2d3JpdGUsIGZkLCBvdXRfYnVmICsgKG91dF9sYXN0IC0gbmVlZGVkKSwgbmVlZGVkKTsKLQl9Ci19Ci0KLS8qCi0gKiBDYWNsdWxhdGUgYSBuZXcga2V5IGFmdGVyIGEgcmVjb25uZWN0Ci0gKi8KLXZvaWQKLWNhbGN1bGF0ZV9uZXdfa2V5KHVfaW50NjRfdCAqa2V5LCB1X2ludDY0X3QgY29va2llLCB1X2ludDY0X3QgY2hhbGxlbmdlKQotewotCWNvbnN0IEVWUF9NRCAqbWQgPSBFVlBfc2hhMSgpOwotCUVWUF9NRF9DVFggY3R4OwotCWNoYXIgaGFzaFtFVlBfTUFYX01EX1NJWkVdOwotCUJ1ZmZlciBiOwotCi0JYnVmZmVyX2luaXQoJmIpOwotCWJ1ZmZlcl9wdXRfaW50NjQoJmIsICprZXkpOwotCWJ1ZmZlcl9wdXRfaW50NjQoJmIsIGNvb2tpZSk7Ci0JYnVmZmVyX3B1dF9pbnQ2NCgmYiwgY2hhbGxlbmdlKTsKLQotCUVWUF9EaWdlc3RJbml0KCZjdHgsIG1kKTsKLQlFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7Ci0JRVZQX0RpZ2VzdEZpbmFsKCZjdHgsIGhhc2gsIE5VTEwpOwotCi0JYnVmZmVyX2NsZWFyKCZiKTsKLQlidWZmZXJfYXBwZW5kKCZiLCBoYXNoLCBFVlBfTURfc2l6ZShtZCkpOwotCSprZXkgPSBidWZmZXJfZ2V0X2ludDY0KCZiKTsKLQlidWZmZXJfZnJlZSgmYik7Ci19CmRpZmYgLS1naXQgYS9yb2FtaW5nX2R1bW15LmMgYi9yb2FtaW5nX2R1bW15LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YzQwMDguLjAwMDAwMDAKLS0tIGEvcm9hbWluZ19kdW1teS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHJvYW1pbmdfZHVtbXkuYyx2IDEuMyAyMDA5LzA2LzIxIDA5OjA0OjAzIGR0dWNrZXIgRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOSBBcHBHYXRlIE5ldHdvcmsgU2VjdXJpdHkgQUIKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0vKgotICogVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGluIHRoZSBjbGllbnQgcHJvZ3JhbXMgd2hpY2ggc2hvdWxkIG5vdAotICogc3VwcG9ydCByb2FtaW5nLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJyb2FtaW5nLmgiCi0KLWludCByZXN1bWVfaW5fcHJvZ3Jlc3MgPSAwOwotCi11X2ludDY0X3QKLWdldF9yZWN2X2J5dGVzKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXNzaXplX3QKLXJvYW1pbmdfd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgaW50ICpjb250KQotewotCXJldHVybiB3cml0ZShmZCwgYnVmLCBjb3VudCk7Ci19Ci0KLXNzaXplX3QKLXJvYW1pbmdfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgKmNvbnQpCi17Ci0JaWYgKGNvbnQpCi0JCSpjb250ID0gMDsKLQlyZXR1cm4gcmVhZChmZCwgYnVmLCBjb3VudCk7Ci19Ci0KLXZvaWQKLWFkZF9yZWN2X2J5dGVzKHVfaW50NjRfdCBudW0pCi17Ci19Ci0KLWludAotcmVzdW1lX2tleCh2b2lkKQotewotCXJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvcm9hbWluZ19zZXJ2LmMgYi9yb2FtaW5nX3NlcnYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExY2E4NC4uMDAwMDAwMAotLS0gYS9yb2FtaW5nX3NlcnYuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qICRPcGVuQlNEOiByb2FtaW5nX3NlcnYuYyx2IDEuMSAyMDA5LzEwLzI0IDExOjE4OjIzIGFuZHJlYXMgRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOSBBcHBHYXRlIE5ldHdvcmsgU2VjdXJpdHkgQUIKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSAicm9hbWluZy5oIgotCi0vKgotICogV2FpdCBmb3IgdGhlIHJvYW1pbmcgY2xpZW50IHRvIHJlY29ubmVjdC4gUmV0dXJucyAwIGlmIGEgY29ubmVjdCBvY3VycmVkLgotICovCi1pbnQKLXdhaXRfZm9yX3JvYW1pbmdfcmVjb25uZWN0KHZvaWQpCi17Ci0JcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9yc2EuYyBiL3JzYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWMxZDE5Li4wMDAwMDAwCi0tLSBhL3JzYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qICRPcGVuQlNEOiByc2EuYyx2IDEuMjkgMjAwNi8xMS8wNiAyMToyNToyOCBtYXJrdXMgRXhwICQgKi8KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IE5pZWxzIFByb3Zvcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqCi0gKiBEZXNjcmlwdGlvbiBvZiB0aGUgUlNBIGFsZ29yaXRobSBjYW4gYmUgZm91bmQgZS5nLiBmcm9tIHRoZSBmb2xsb3dpbmcKLSAqIHNvdXJjZXM6Ci0gKgotICogICBCcnVjZSBTY2huZWllcjogQXBwbGllZCBDcnlwdG9ncmFwaHkuICBKb2huIFdpbGV5ICYgU29ucywgMTk5NC4KLSAqCi0gKiAgIEplbm5pZmVyIFNlYmVycnkgYW5kIEpvc2VkIFBpZXByenlrOiBDcnlwdG9ncmFwaHk6IEFuIEludHJvZHVjdGlvbiB0bwotICogICBDb21wdXRlciBTZWN1cml0eS4gIFByZW50aWNlLUhhbGwsIDE5ODkuCi0gKgotICogICBNYW4gWW91bmcgUmhlZTogQ3J5cHRvZ3JhcGh5IGFuZCBTZWN1cmUgRGF0YSBDb21tdW5pY2F0aW9ucy4gIE1jR3Jhdy1IaWxsLAotICogICAxOTk0LgotICoKLSAqICAgUi4gUml2ZXN0LCBBLiBTaGFtaXIsIGFuZCBMLiBNLiBBZGxlbWFuOiBDcnlwdG9ncmFwaGljIENvbW11bmljYXRpb25zCi0gKiAgIFN5c3RlbSBhbmQgTWV0aG9kLiAgVVMgUGF0ZW50IDQsNDA1LDgyOSwgMTk4My4KLSAqCi0gKiAgIEhhbnMgUmllc2VsOiBQcmltZSBOdW1iZXJzIGFuZCBDb21wdXRlciBNZXRob2RzIGZvciBGYWN0b3JpemF0aW9uLgotICogICBCaXJraGF1c2VyLCAxOTk0LgotICoKLSAqICAgVGhlIFJTQSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBkb2N1bWVudCBieSBSU0EgRGF0YSBTZWN1cml0eSwKLSAqICAgSW5jLiwgMTk5NS4KLSAqCi0gKiAgIFJTQSBpbiAzIGxpbmVzIG9mIHBlcmwgYnkgQWRhbSBCYWNrIDxhYmFAYXRsYXguZXguYWMudWs+LCAxOTk1LCBhcwotICogaW5jbHVkZWQgYmVsb3c6Ci0gKgotICogICAgIFtnb25lIC0gaGFkIHRvIGJlIGRlbGV0ZWQgLSB3aGF0IGEgcGl0eV0KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAicnNhLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0KLXZvaWQKLXJzYV9wdWJsaWNfZW5jcnlwdChCSUdOVU0gKm91dCwgQklHTlVNICppbiwgUlNBICprZXkpCi17Ci0JdV9jaGFyICppbmJ1ZiwgKm91dGJ1ZjsKLQlpbnQgbGVuLCBpbGVuLCBvbGVuOwotCi0JaWYgKEJOX251bV9iaXRzKGtleS0+ZSkgPCAyIHx8ICFCTl9pc19vZGQoa2V5LT5lKSkKLQkJZmF0YWwoInJzYV9wdWJsaWNfZW5jcnlwdCgpIGV4cG9uZW50IHRvbyBzbWFsbCBvciBub3Qgb2RkIik7Ci0KLQlvbGVuID0gQk5fbnVtX2J5dGVzKGtleS0+bik7Ci0Jb3V0YnVmID0geG1hbGxvYyhvbGVuKTsKLQotCWlsZW4gPSBCTl9udW1fYnl0ZXMoaW4pOwotCWluYnVmID0geG1hbGxvYyhpbGVuKTsKLQlCTl9ibjJiaW4oaW4sIGluYnVmKTsKLQotCWlmICgobGVuID0gUlNBX3B1YmxpY19lbmNyeXB0KGlsZW4sIGluYnVmLCBvdXRidWYsIGtleSwKLQkgICAgUlNBX1BLQ1MxX1BBRERJTkcpKSA8PSAwKQotCQlmYXRhbCgicnNhX3B1YmxpY19lbmNyeXB0KCkgZmFpbGVkIik7Ci0KLQlpZiAoQk5fYmluMmJuKG91dGJ1ZiwgbGVuLCBvdXQpID09IE5VTEwpCi0JCWZhdGFsKCJyc2FfcHVibGljX2VuY3J5cHQ6IEJOX2JpbjJibiBmYWlsZWQiKTsKLQotCW1lbXNldChvdXRidWYsIDAsIG9sZW4pOwotCW1lbXNldChpbmJ1ZiwgMCwgaWxlbik7Ci0JeGZyZWUob3V0YnVmKTsKLQl4ZnJlZShpbmJ1Zik7Ci19Ci0KLWludAotcnNhX3ByaXZhdGVfZGVjcnlwdChCSUdOVU0gKm91dCwgQklHTlVNICppbiwgUlNBICprZXkpCi17Ci0JdV9jaGFyICppbmJ1ZiwgKm91dGJ1ZjsKLQlpbnQgbGVuLCBpbGVuLCBvbGVuOwotCi0Jb2xlbiA9IEJOX251bV9ieXRlcyhrZXktPm4pOwotCW91dGJ1ZiA9IHhtYWxsb2Mob2xlbik7Ci0KLQlpbGVuID0gQk5fbnVtX2J5dGVzKGluKTsKLQlpbmJ1ZiA9IHhtYWxsb2MoaWxlbik7Ci0JQk5fYm4yYmluKGluLCBpbmJ1Zik7Ci0KLQlpZiAoKGxlbiA9IFJTQV9wcml2YXRlX2RlY3J5cHQoaWxlbiwgaW5idWYsIG91dGJ1Ziwga2V5LAotCSAgICBSU0FfUEtDUzFfUEFERElORykpIDw9IDApIHsKLQkJZXJyb3IoInJzYV9wcml2YXRlX2RlY3J5cHQoKSBmYWlsZWQiKTsKLQl9IGVsc2UgewotCQlpZiAoQk5fYmluMmJuKG91dGJ1ZiwgbGVuLCBvdXQpID09IE5VTEwpCi0JCQlmYXRhbCgicnNhX3ByaXZhdGVfZGVjcnlwdDogQk5fYmluMmJuIGZhaWxlZCIpOwotCX0KLQltZW1zZXQob3V0YnVmLCAwLCBvbGVuKTsKLQltZW1zZXQoaW5idWYsIDAsIGlsZW4pOwotCXhmcmVlKG91dGJ1Zik7Ci0JeGZyZWUoaW5idWYpOwotCXJldHVybiBsZW47Ci19Ci0KLS8qIGNhbGN1bGF0ZSBwLTEgYW5kIHEtMSAqLwotdm9pZAotcnNhX2dlbmVyYXRlX2FkZGl0aW9uYWxfcGFyYW1ldGVycyhSU0EgKnJzYSkKLXsKLQlCSUdOVU0gKmF1eDsKLQlCTl9DVFggKmN0eDsKLQotCWlmICgoYXV4ID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJyc2FfZ2VuZXJhdGVfYWRkaXRpb25hbF9wYXJhbWV0ZXJzOiBCTl9uZXcgZmFpbGVkIik7Ci0JaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJyc2FfZ2VuZXJhdGVfYWRkaXRpb25hbF9wYXJhbWV0ZXJzOiBCTl9DVFhfbmV3IGZhaWxlZCIpOwotCi0JaWYgKChCTl9zdWIoYXV4LCByc2EtPnEsIEJOX3ZhbHVlX29uZSgpKSA9PSAwKSB8fAotCSAgICAoQk5fbW9kKHJzYS0+ZG1xMSwgcnNhLT5kLCBhdXgsIGN0eCkgPT0gMCkgfHwKLQkgICAgKEJOX3N1YihhdXgsIHJzYS0+cCwgQk5fdmFsdWVfb25lKCkpID09IDApIHx8Ci0JICAgIChCTl9tb2QocnNhLT5kbXAxLCByc2EtPmQsIGF1eCwgY3R4KSA9PSAwKSkKLQkJZmF0YWwoInJzYV9nZW5lcmF0ZV9hZGRpdGlvbmFsX3BhcmFtZXRlcnM6IEJOX3N1Yi9tb2QgZmFpbGVkIik7Ci0KLQlCTl9jbGVhcl9mcmVlKGF1eCk7Ci0JQk5fQ1RYX2ZyZWUoY3R4KTsKLX0KLQpkaWZmIC0tZ2l0IGEvcnNhLmggYi9yc2EuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg0MWVhNC4uMDAwMDAwMAotLS0gYS9yc2EuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qICRPcGVuQlNEOiByc2EuaCx2IDEuMTYgMjAwNi8wMy8yNSAyMjoyMjo0MyBkam0gRXhwICQgKi8KLQotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIFJTQSBrZXkgZ2VuZXJhdGlvbiwgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbi4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpZm5kZWYgUlNBX0gKLSNkZWZpbmUgUlNBX0gKLQotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgotCi12b2lkCSByc2FfcHVibGljX2VuY3J5cHQoQklHTlVNICosIEJJR05VTSAqLCBSU0EgKik7Ci1pbnQJIHJzYV9wcml2YXRlX2RlY3J5cHQoQklHTlVNICosIEJJR05VTSAqLCBSU0EgKik7Ci12b2lkCSByc2FfZ2VuZXJhdGVfYWRkaXRpb25hbF9wYXJhbWV0ZXJzKFJTQSAqKTsKLQotI2VuZGlmCQkJCS8qIFJTQV9IICovCmRpZmYgLS1naXQgYS9zYW5kYm94LWRhcndpbi5jIGIvc2FuZGJveC1kYXJ3aW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5MDFlZi4uMDAwMDAwMAotLS0gYS9zYW5kYm94LWRhcndpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpZmRlZiBTQU5EQk9YX0RBUldJTgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzYW5kYm94Lmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJzYW5kYm94LmgiCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotCi0vKiBEYXJ3aW4vT1MgWCBzYW5kYm94ICovCi0KLXN0cnVjdCBzc2hfc2FuZGJveCB7Ci0JcGlkX3QgY2hpbGRfcGlkOwotfTsKLQotc3RydWN0IHNzaF9zYW5kYm94ICoKLXNzaF9zYW5kYm94X2luaXQodm9pZCkKLXsKLQlzdHJ1Y3Qgc3NoX3NhbmRib3ggKmJveDsKLQotCS8qCi0JICogU3RyaWN0bHksIHdlIGRvbid0IG5lZWQgdG8gbWFpbnRhaW4gYW55IHN0YXRlIGhlcmUgYnV0IHdlIG5lZWQKLQkgKiB0byByZXR1cm4gbm9uLU5VTEwgdG8gc2F0aXNmeSB0aGUgQVBJLgotCSAqLwotCWRlYnVnMygiJXM6IHByZXBhcmluZyBEYXJ3aW4gc2FuZGJveCIsIF9fZnVuY19fKTsKLQlib3ggPSB4Y2FsbG9jKDEsIHNpemVvZigqYm94KSk7Ci0JYm94LT5jaGlsZF9waWQgPSAwOwotCi0JcmV0dXJuIGJveDsKLX0KLQotdm9pZAotc3NoX3NhbmRib3hfY2hpbGQoc3RydWN0IHNzaF9zYW5kYm94ICpib3gpCi17Ci0JY2hhciAqZXJybXNnOwotCXN0cnVjdCBybGltaXQgcmxfemVybzsKLQotCWRlYnVnMygiJXM6IHN0YXJ0aW5nIERhcndpbiBzYW5kYm94IiwgX19mdW5jX18pOwotCWlmIChzYW5kYm94X2luaXQoa1NCWFByb2ZpbGVQdXJlQ29tcHV0YXRpb24sIFNBTkRCT1hfTkFNRUQsCi0JICAgICZlcnJtc2cpID09IC0xKQotCQlmYXRhbCgiJXM6IHNhbmRib3hfaW5pdDogJXMiLCBfX2Z1bmNfXywgZXJybXNnKTsKLQotCS8qCi0JICogVGhlIGtTQlhQcm9maWxlUHVyZUNvbXB1dGF0aW9uIHN0aWxsIGFsbG93cyBzb2NrZXRzLCBzbwotCSAqIHdlIG11c3QgZGlzYWJsZSB0aGVzZSB1c2luZyBybGltaXQuCi0JICovCi0JcmxfemVyby5ybGltX2N1ciA9IHJsX3plcm8ucmxpbV9tYXggPSAwOwotCWlmIChzZXRybGltaXQoUkxJTUlUX0ZTSVpFLCAmcmxfemVybykgPT0gLTEpCi0JCWZhdGFsKCIlczogc2V0cmxpbWl0KFJMSU1JVF9GU0laRSwgeyAwLCAwIH0pOiAlcyIsCi0JCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZybF96ZXJvKSA9PSAtMSkKLQkJZmF0YWwoIiVzOiBzZXRybGltaXQoUkxJTUlUX05PRklMRSwgeyAwLCAwIH0pOiAlcyIsCi0JCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoc2V0cmxpbWl0KFJMSU1JVF9OUFJPQywgJnJsX3plcm8pID09IC0xKQotCQlmYXRhbCgiJXM6IHNldHJsaW1pdChSTElNSVRfTlBST0MsIHsgMCwgMCB9KTogJXMiLAotCQkJX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci19Ci0KLXZvaWQKLXNzaF9zYW5kYm94X3BhcmVudF9maW5pc2goc3RydWN0IHNzaF9zYW5kYm94ICpib3gpCi17Ci0JZnJlZShib3gpOwotCWRlYnVnMygiJXM6IGZpbmlzaGVkIiwgX19mdW5jX18pOwotfQotCi12b2lkCi1zc2hfc2FuZGJveF9wYXJlbnRfcHJlYXV0aChzdHJ1Y3Qgc3NoX3NhbmRib3ggKmJveCwgcGlkX3QgY2hpbGRfcGlkKQotewotCWJveC0+Y2hpbGRfcGlkID0gY2hpbGRfcGlkOwotfQotCi0jZW5kaWYgLyogU0FOREJPWF9EQVJXSU4gKi8KZGlmZiAtLWdpdCBhL3NhbmRib3gtbnVsbC5jIGIvc2FuZGJveC1udWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZmE5NjYuLjAwMDAwMDAKLS0tIGEvc2FuZGJveC1udWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKiAkT3BlbkJTRCQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZkZWYgU0FOREJPWF9OVUxMCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgInNzaC1zYW5kYm94LmgiCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotCi0vKiBkdW1teSBzYW5kYm94ICovCi0KLXN0cnVjdCBzc2hfc2FuZGJveCB7Ci0JaW50IGp1bms7Ci19OwotCi1zdHJ1Y3Qgc3NoX3NhbmRib3ggKgotc3NoX3NhbmRib3hfaW5pdCh2b2lkKQotewotCXN0cnVjdCBzc2hfc2FuZGJveCAqYm94OwotCi0JLyoKLQkgKiBTdHJpY3RseSwgd2UgZG9uJ3QgbmVlZCB0byBtYWludGFpbiBhbnkgc3RhdGUgaGVyZSBidXQgd2UgbmVlZAotCSAqIHRvIHJldHVybiBub24tTlVMTCB0byBzYXRpc2Z5IHRoZSBBUEkuCi0JICovCi0JYm94ID0geGNhbGxvYygxLCBzaXplb2YoKmJveCkpOwotCXJldHVybiBib3g7Ci19Ci0KLXZvaWQKLXNzaF9zYW5kYm94X2NoaWxkKHN0cnVjdCBzc2hfc2FuZGJveCAqYm94KQotewotCS8qIE5vdGhpbmcgdG8gZG8gaGVyZSAqLwotfQotCi12b2lkCi1zc2hfc2FuZGJveF9wYXJlbnRfZmluaXNoKHN0cnVjdCBzc2hfc2FuZGJveCAqYm94KQotewotCWZyZWUoYm94KTsKLX0KLQotdm9pZAotc3NoX3NhbmRib3hfcGFyZW50X3ByZWF1dGgoc3RydWN0IHNzaF9zYW5kYm94ICpib3gsIHBpZF90IGNoaWxkX3BpZCkKLXsKLQkvKiBOb3RoaW5nIHRvIGRvIGhlcmUgKi8KLX0KLQotI2VuZGlmIC8qIFNBTkRCT1hfTlVMTCAqLwpkaWZmIC0tZ2l0IGEvc2FuZGJveC1ybGltaXQuYyBiL3NhbmRib3gtcmxpbWl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MWU5MjguLjAwMDAwMDAKLS0tIGEvc2FuZGJveC1ybGltaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qICRPcGVuQlNEOiBzYW5kYm94LXJsaW1pdC5jLHYgMS4zIDIwMTEvMDYvMjMgMDk6MzQ6MTMgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDExIERhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmZGVmIFNBTkRCT1hfUkxJTUlUCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAic3NoLXNhbmRib3guaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0KLS8qIE1pbmltYWwgc2FuZGJveCB0aGF0IHNldHMgemVybyBuZmlsZXMsIG5wcm9jcyBhbmQgZmlsZXNpemUgcmxpbWl0cyAqLwotCi1zdHJ1Y3Qgc3NoX3NhbmRib3ggewotCXBpZF90IGNoaWxkX3BpZDsKLX07Ci0KLXN0cnVjdCBzc2hfc2FuZGJveCAqCi1zc2hfc2FuZGJveF9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHNzaF9zYW5kYm94ICpib3g7Ci0KLQkvKgotCSAqIFN0cmljdGx5LCB3ZSBkb24ndCBuZWVkIHRvIG1haW50YWluIGFueSBzdGF0ZSBoZXJlIGJ1dCB3ZSBuZWVkCi0JICogdG8gcmV0dXJuIG5vbi1OVUxMIHRvIHNhdGlzZnkgdGhlIEFQSS4KLQkgKi8KLQlkZWJ1ZzMoIiVzOiBwcmVwYXJpbmcgcmxpbWl0IHNhbmRib3giLCBfX2Z1bmNfXyk7Ci0JYm94ID0geGNhbGxvYygxLCBzaXplb2YoKmJveCkpOwotCWJveC0+Y2hpbGRfcGlkID0gMDsKLQotCXJldHVybiBib3g7Ci19Ci0KLXZvaWQKLXNzaF9zYW5kYm94X2NoaWxkKHN0cnVjdCBzc2hfc2FuZGJveCAqYm94KQotewotCXN0cnVjdCBybGltaXQgcmxfemVybzsKLQotCXJsX3plcm8ucmxpbV9jdXIgPSBybF96ZXJvLnJsaW1fbWF4ID0gMDsKLQotCWlmIChzZXRybGltaXQoUkxJTUlUX0ZTSVpFLCAmcmxfemVybykgPT0gLTEpCi0JCWZhdGFsKCIlczogc2V0cmxpbWl0KFJMSU1JVF9GU0laRSwgeyAwLCAwIH0pOiAlcyIsCi0JCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZybF96ZXJvKSA9PSAtMSkKLQkJZmF0YWwoIiVzOiBzZXRybGltaXQoUkxJTUlUX05PRklMRSwgeyAwLCAwIH0pOiAlcyIsCi0JCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLSNpZmRlZiBIQVZFX1JMSU1JVF9OUFJPQwotCWlmIChzZXRybGltaXQoUkxJTUlUX05QUk9DLCAmcmxfemVybykgPT0gLTEpCi0JCWZhdGFsKCIlczogc2V0cmxpbWl0KFJMSU1JVF9OUFJPQywgeyAwLCAwIH0pOiAlcyIsCi0JCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLSNlbmRpZgotfQotCi12b2lkCi1zc2hfc2FuZGJveF9wYXJlbnRfZmluaXNoKHN0cnVjdCBzc2hfc2FuZGJveCAqYm94KQotewotCWZyZWUoYm94KTsKLQlkZWJ1ZzMoIiVzOiBmaW5pc2hlZCIsIF9fZnVuY19fKTsKLX0KLQotdm9pZAotc3NoX3NhbmRib3hfcGFyZW50X3ByZWF1dGgoc3RydWN0IHNzaF9zYW5kYm94ICpib3gsIHBpZF90IGNoaWxkX3BpZCkKLXsKLQlib3gtPmNoaWxkX3BpZCA9IGNoaWxkX3BpZDsKLX0KLQotI2VuZGlmIC8qIFNBTkRCT1hfUkxJTUlUICovCmRpZmYgLS1naXQgYS9zYW5kYm94LXN5c3RyYWNlLmMgYi9zYW5kYm94LXN5c3RyYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMzlmNGYuLjAwMDAwMDAKLS0tIGEvc2FuZGJveC1zeXN0cmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qICRPcGVuQlNEOiBzYW5kYm94LXN5c3RyYWNlLmMsdiAxLjQgMjAxMS8wNy8yOSAxNDo0Mjo0NSBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZkZWYgU0FOREJPWF9TWVNUUkFDRQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxkZXYvc3lzdHJhY2UuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAiYXRvbWljaW8uaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJzc2gtc2FuZGJveC5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKLQotc3RydWN0IHNhbmRib3hfcG9saWN5IHsKLQlpbnQgc3lzY2FsbDsKLQlpbnQgYWN0aW9uOwotfTsKLQotLyogUGVybWl0dGVkIHN5c2NhbGxzIGluIHByZWF1dGguIFVubGlzdGVkIHN5c2NhbGxzIGdldCBTWVNUUl9QT0xJQ1lfS0lMTCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzYW5kYm94X3BvbGljeSBwcmVhdXRoX3BvbGljeVtdID0gewotCXsgU1lTX29wZW4sIFNZU1RSX1BPTElDWV9ORVZFUiB9LAotCi0JeyBTWVNfX19zeXNjdGwsIFNZU1RSX1BPTElDWV9QRVJNSVQgfSwKLQl7IFNZU19jbG9zZSwgU1lTVFJfUE9MSUNZX1BFUk1JVCB9LAotCXsgU1lTX2V4aXQsIFNZU1RSX1BPTElDWV9QRVJNSVQgfSwKLQl7IFNZU19nZXRwaWQsIFNZU1RSX1BPTElDWV9QRVJNSVQgfSwKLQl7IFNZU19nZXR0aW1lb2ZkYXksIFNZU1RSX1BPTElDWV9QRVJNSVQgfSwKLQl7IFNZU19tYWR2aXNlLCBTWVNUUl9QT0xJQ1lfUEVSTUlUIH0sCi0JeyBTWVNfbW1hcCwgU1lTVFJfUE9MSUNZX1BFUk1JVCB9LAotCXsgU1lTX21wcm90ZWN0LCBTWVNUUl9QT0xJQ1lfUEVSTUlUIH0sCi0JeyBTWVNfcG9sbCwgU1lTVFJfUE9MSUNZX1BFUk1JVCB9LAotCXsgU1lTX211bm1hcCwgU1lTVFJfUE9MSUNZX1BFUk1JVCB9LAotCXsgU1lTX3JlYWQsIFNZU1RSX1BPTElDWV9QRVJNSVQgfSwKLQl7IFNZU19zZWxlY3QsIFNZU1RSX1BPTElDWV9QRVJNSVQgfSwKLQl7IFNZU19zaWdwcm9jbWFzaywgU1lTVFJfUE9MSUNZX1BFUk1JVCB9LAotCXsgU1lTX3dyaXRlLCBTWVNUUl9QT0xJQ1lfUEVSTUlUIH0sCi0JeyAtMSwgLTEgfQotfTsKLQotc3RydWN0IHNzaF9zYW5kYm94IHsKLQlpbnQgY2hpbGRfc29jazsKLQlpbnQgcGFyZW50X3NvY2s7Ci0JaW50IHN5c3RyYWNlX2ZkOwotCXBpZF90IGNoaWxkX3BpZDsKLX07Ci0KLXN0cnVjdCBzc2hfc2FuZGJveCAqCi1zc2hfc2FuZGJveF9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHNzaF9zYW5kYm94ICpib3g7Ci0JaW50IHNbMl07Ci0KLQlkZWJ1ZzMoIiVzOiBwcmVwYXJpbmcgc3lzdHJhY2Ugc2FuZGJveCIsIF9fZnVuY19fKTsKLQlib3ggPSB4Y2FsbG9jKDEsIHNpemVvZigqYm94KSk7Ci0JaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHMpID09IC0xKQotCQlmYXRhbCgiJXM6IHNvY2tldHBhaXI6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JYm94LT5jaGlsZF9zb2NrID0gc1swXTsKLQlib3gtPnBhcmVudF9zb2NrID0gc1sxXTsKLQlib3gtPnN5c3RyYWNlX2ZkID0gLTE7Ci0JYm94LT5jaGlsZF9waWQgPSAwOwotCi0JcmV0dXJuIGJveDsKLX0KLQotdm9pZAotc3NoX3NhbmRib3hfY2hpbGQoc3RydWN0IHNzaF9zYW5kYm94ICpib3gpCi17Ci0JY2hhciB3aGF0ZXZlciA9IDA7Ci0KLQljbG9zZShib3gtPnBhcmVudF9zb2NrKTsKLQkvKiBTaWduYWwgcGFyZW50IHRoYXQgd2UgYXJlIHJlYWR5ICovCi0JZGVidWczKCIlczogcmVhZHkiLCBfX2Z1bmNfXyk7Ci0JaWYgKGF0b21pY2lvKHZ3cml0ZSwgYm94LT5jaGlsZF9zb2NrLCAmd2hhdGV2ZXIsIDEpICE9IDEpCi0JCWZhdGFsKCIlczogd3JpdGU6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JLyogV2FpdCBmb3IgcGFyZW50IHRvIHNpZ25hbCBmb3IgdXMgdG8gZ28gKi8KLQlpZiAoYXRvbWljaW8ocmVhZCwgYm94LT5jaGlsZF9zb2NrLCAmd2hhdGV2ZXIsIDEpICE9IDEpCi0JCWZhdGFsKCIlczogcmVhZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQlkZWJ1ZzMoIiVzOiBzdGFydGVkIiwgX19mdW5jX18pOwotCWNsb3NlKGJveC0+Y2hpbGRfc29jayk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zc2hfc2FuZGJveF9wYXJlbnQoc3RydWN0IHNzaF9zYW5kYm94ICpib3gsIHBpZF90IGNoaWxkX3BpZCwKLSAgICBjb25zdCBzdHJ1Y3Qgc2FuZGJveF9wb2xpY3kgKmFsbG93ZWRfc3lzY2FsbHMpCi17Ci0JaW50IGRldl9zeXN0cmFjZSwgaSwgaiwgZm91bmQ7Ci0JY2hhciB3aGF0ZXZlciA9IDA7Ci0Jc3RydWN0IHN5c3RyYWNlX3BvbGljeSBwb2xpY3k7Ci0KLQlkZWJ1ZzMoIiVzOiB3YWl0IGZvciBjaGlsZCAlbGQiLCBfX2Z1bmNfXywgKGxvbmcpY2hpbGRfcGlkKTsKLQlib3gtPmNoaWxkX3BpZCA9IGNoaWxkX3BpZDsKLQljbG9zZShib3gtPmNoaWxkX3NvY2spOwotCS8qIFdhaXQgZm9yIGNoaWxkIHRvIHNpZ25hbCB0aGF0IGl0IGlzIHJlYWR5ICovCi0JaWYgKGF0b21pY2lvKHJlYWQsIGJveC0+cGFyZW50X3NvY2ssICZ3aGF0ZXZlciwgMSkgIT0gMSkKLQkJZmF0YWwoIiVzOiByZWFkOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCWRlYnVnMygiJXM6IGNoaWxkICVsZCByZWFkeSIsIF9fZnVuY19fLCAobG9uZyljaGlsZF9waWQpOwotCi0JLyogU2V0IHVwIHN5c3RyYWNpbmcgb2YgY2hpbGQgKi8KLQlpZiAoKGRldl9zeXN0cmFjZSA9IG9wZW4oIi9kZXYvc3lzdHJhY2UiLCBPX1JET05MWSkpID09IC0xKQotCQlmYXRhbCgiJXM6IG9wZW4oXCIvZGV2L3N5c3RyYWNlXCIpOiAlcyIsIF9fZnVuY19fLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoaW9jdGwoZGV2X3N5c3RyYWNlLCBTVFJJT0NDTE9ORSwgJmJveC0+c3lzdHJhY2VfZmQpID09IC0xKQotCQlmYXRhbCgiJXM6IGlvY3RsKFNUUklPQ0NMT05FLCAlZCk6ICVzIiwgX19mdW5jX18sCi0JCSAgICBkZXZfc3lzdHJhY2UsIHN0cmVycm9yKGVycm5vKSk7Ci0JY2xvc2UoZGV2X3N5c3RyYWNlKTsKLQlkZWJ1ZzMoIiVzOiBzeXN0cmFjZSBhdHRhY2gsIGZkPSVkIiwgX19mdW5jX18sIGJveC0+c3lzdHJhY2VfZmQpOwotCWlmIChpb2N0bChib3gtPnN5c3RyYWNlX2ZkLCBTVFJJT0NBVFRBQ0gsICZjaGlsZF9waWQpID09IC0xKQotCQlmYXRhbCgiJXM6IGlvY3RsKCVkLCBTVFJJT0NBVFRBQ0gsICVkKTogJXMiLCBfX2Z1bmNfXywKLQkJICAgIGJveC0+c3lzdHJhY2VfZmQsIGNoaWxkX3BpZCwgc3RyZXJyb3IoZXJybm8pKTsKLQotCS8qIEFsbG9jYXRlIGFuZCBhc3NpZ24gcG9saWN5ICovCi0JYnplcm8oJnBvbGljeSwgc2l6ZW9mKHBvbGljeSkpOwotCXBvbGljeS5zdHJwX29wID0gU1lTVFJfUE9MSUNZX05FVzsKLQlwb2xpY3kuc3RycF9tYXhlbnRzID0gU1lTX01BWFNZU0NBTEw7Ci0JaWYgKGlvY3RsKGJveC0+c3lzdHJhY2VfZmQsIFNUUklPQ1BPTElDWSwgJnBvbGljeSkgPT0gLTEpCi0JCWZhdGFsKCIlczogaW9jdGwoJWQsIFNUUklPQ1BPTElDWSAobmV3KSk6ICVzIiwgX19mdW5jX18sCi0JCSAgICBib3gtPnN5c3RyYWNlX2ZkLCBzdHJlcnJvcihlcnJubykpOwotCi0JcG9saWN5LnN0cnBfb3AgPSBTWVNUUl9QT0xJQ1lfQVNTSUdOOwotCXBvbGljeS5zdHJwX3BpZCA9IGJveC0+Y2hpbGRfcGlkOwotCWlmIChpb2N0bChib3gtPnN5c3RyYWNlX2ZkLCBTVFJJT0NQT0xJQ1ksICZwb2xpY3kpID09IC0xKQotCQlmYXRhbCgiJXM6IGlvY3RsKCVkLCBTVFJJT0NQT0xJQ1kgKGFzc2lnbikpOiAlcyIsCi0JCSAgICBfX2Z1bmNfXywgYm94LT5zeXN0cmFjZV9mZCwgc3RyZXJyb3IoZXJybm8pKTsKLQotCS8qIFNldCBwZXItc3lzY2FsbCBwb2xpY3kgKi8KLQlmb3IgKGkgPSAwOyBpIDwgU1lTX01BWFNZU0NBTEw7IGkrKykgewotCQlmb3VuZCA9IDA7Ci0JCWZvciAoaiA9IDA7IGFsbG93ZWRfc3lzY2FsbHNbal0uc3lzY2FsbCAhPSAtMTsgaisrKSB7Ci0JCQlpZiAoYWxsb3dlZF9zeXNjYWxsc1tqXS5zeXNjYWxsID09IGkpIHsKLQkJCQlmb3VuZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcG9saWN5LnN0cnBfb3AgPSBTWVNUUl9QT0xJQ1lfTU9ESUZZOwotCQlwb2xpY3kuc3RycF9jb2RlID0gaTsKLQkJcG9saWN5LnN0cnBfcG9saWN5ID0gZm91bmQgPwotCQkgICAgYWxsb3dlZF9zeXNjYWxsc1tqXS5hY3Rpb24gOiBTWVNUUl9QT0xJQ1lfS0lMTDsKLQkJaWYgKGZvdW5kKQotCQkJZGVidWczKCIlczogcG9saWN5OiBlbmFibGUgc3lzY2FsbCAlZCIsIF9fZnVuY19fLCBpKTsKLQkJaWYgKGlvY3RsKGJveC0+c3lzdHJhY2VfZmQsIFNUUklPQ1BPTElDWSwgJnBvbGljeSkgPT0gLTEpCi0JCQlmYXRhbCgiJXM6IGlvY3RsKCVkLCBTVFJJT0NQT0xJQ1kgKG1vZGlmeSkpOiAlcyIsCi0JCQkgICAgX19mdW5jX18sIGJveC0+c3lzdHJhY2VfZmQsIHN0cmVycm9yKGVycm5vKSk7Ci0JfQotCi0JLyogU2lnbmFsIHRoZSBjaGlsZCB0byBzdGFydCBydW5uaW5nICovCi0JZGVidWczKCIlczogc3RhcnQgY2hpbGQgJWxkIiwgX19mdW5jX18sIChsb25nKWNoaWxkX3BpZCk7Ci0JaWYgKGF0b21pY2lvKHZ3cml0ZSwgYm94LT5wYXJlbnRfc29jaywgJndoYXRldmVyLCAxKSAhPSAxKQotCQlmYXRhbCgiJXM6IHdyaXRlOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCWNsb3NlKGJveC0+cGFyZW50X3NvY2spOwotfQotCi12b2lkCi1zc2hfc2FuZGJveF9wYXJlbnRfZmluaXNoKHN0cnVjdCBzc2hfc2FuZGJveCAqYm94KQotewotCS8qIENsb3NpbmcgdGhpcyBiZWZvcmUgdGhlIGNoaWxkIGV4aXRzIHdpbGwgdGVybWluYXRlIGl0ICovCi0JY2xvc2UoYm94LT5zeXN0cmFjZV9mZCk7Ci0KLQlmcmVlKGJveCk7Ci0JZGVidWczKCIlczogZmluaXNoZWQiLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQKLXNzaF9zYW5kYm94X3BhcmVudF9wcmVhdXRoKHN0cnVjdCBzc2hfc2FuZGJveCAqYm94LCBwaWRfdCBjaGlsZF9waWQpCi17Ci0Jc3NoX3NhbmRib3hfcGFyZW50KGJveCwgY2hpbGRfcGlkLCBwcmVhdXRoX3BvbGljeSk7Ci19Ci0KLSNlbmRpZiAvKiBTQU5EQk9YX1NZU1RSQUNFICovCmRpZmYgLS1naXQgYS9zY2hub3JyLmMgYi9zY2hub3JyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNTRkNjguLjAwMDAwMDAKLS0tIGEvc2Nobm9yci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLS8qICRPcGVuQlNEOiBzY2hub3JyLmMsdiAxLjUgMjAxMC8xMi8wMyAyMzo0OToyNiBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotLyoKLSAqIEltcGxlbWVudGF0aW9uIG9mIFNjaG5vcnIgc2lnbmF0dXJlcyAvIHplcm8ta25vd2xlZGdlIHByb29mcywgYmFzZWQgb24KLSAqIGRlc2NyaXB0aW9uIGluOgotICogCQotICogRi4gSGFvLCBQLiBSeWFuLCAiUGFzc3dvcmQgQXV0aGVudGljYXRlZCBLZXkgRXhjaGFuZ2UgYnkgSnVnZ2xpbmciLAotICogMTZ0aCBXb3Jrc2hvcCBvbiBTZWN1cml0eSBQcm90b2NvbHMsIENhbWJyaWRnZSwgQXByaWwgMjAwOAotICoKLSAqIGh0dHA6Ly9ncm91cGVyLmllZWUub3JnL2dyb3Vwcy8xMzYzL1Jlc2VhcmNoL2NvbnRyaWJ1dGlvbnMvaGFvLXJ5YW4tMjAwOC5wZGYKLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImxvZy5oIgotCi0jaW5jbHVkZSAic2Nobm9yci5oIgotCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKLQotLyogI2RlZmluZSBTQ0hOT1JSX0RFQlVHICovCQkvKiBQcml2YWN5LXZpb2xhdGluZyBkZWJ1Z2dpbmcgKi8KLS8qICNkZWZpbmUgU0NITk9SUl9NQUlOICovCQkvKiBJbmNsdWRlIG1haW4oKSBzZWxmdGVzdCAqLwotCi0jaWZuZGVmIFNDSE5PUlJfREVCVUcKLSMgZGVmaW5lIFNDSE5PUlJfREVCVUdfQk4oYSkKLSMgZGVmaW5lIFNDSE5PUlJfREVCVUdfQlVGKGEpCi0jZWxzZQotIyBkZWZpbmUgU0NITk9SUl9ERUJVR19CTihhKQlkZWJ1ZzNfYm4gYQotIyBkZWZpbmUgU0NITk9SUl9ERUJVR19CVUYoYSkJZGVidWczX2J1ZiBhCi0jZW5kaWYgLyogU0NITk9SUl9ERUJVRyAqLwotCi0vKgotICogQ2FsY3VsYXRlIGhhc2ggY29tcG9uZW50IG9mIFNjaG5vcnIgc2lnbmF0dXJlIEgoZyB8fCBnXnYgfHwgZ154IHx8IGlkKQotICogdXNpbmcgdGhlIGhhc2ggZnVuY3Rpb24gZGVmaW5lZCBieSAiZXZwX21kIi4gUmV0dXJucyBzaWduYXR1cmUgYXMKLSAqIGJpZ251bSBvciBOVUxMIG9uIGVycm9yLgotICovCi1zdGF0aWMgQklHTlVNICoKLXNjaG5vcnJfaGFzaChjb25zdCBCSUdOVU0gKnAsIGNvbnN0IEJJR05VTSAqcSwgY29uc3QgQklHTlVNICpnLAotICAgIGNvbnN0IEVWUF9NRCAqZXZwX21kLCBjb25zdCBCSUdOVU0gKmdfdiwgY29uc3QgQklHTlVNICpnX3gsCi0gICAgY29uc3QgdV9jaGFyICppZCwgdV9pbnQgaWRsZW4pCi17Ci0JdV9jaGFyICpkaWdlc3Q7Ci0JdV9pbnQgZGlnZXN0X2xlbjsKLQlCSUdOVU0gKmg7Ci0JQnVmZmVyIGI7Ci0JaW50IHN1Y2Nlc3MgPSAtMTsKLQotCWlmICgoaCA9IEJOX25ldygpKSA9PSBOVUxMKSB7Ci0JCWVycm9yKCIlczogQk5fbmV3IiwgX19mdW5jX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlidWZmZXJfaW5pdCgmYik7Ci0KLQkvKiBoID0gSChnIHx8IHAgfHwgcSB8fCBnXnYgfHwgZ154IHx8IGlkKSAqLwotCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgZyk7Ci0JYnVmZmVyX3B1dF9iaWdudW0yKCZiLCBwKTsKLQlidWZmZXJfcHV0X2JpZ251bTIoJmIsIHEpOwotCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgZ192KTsKLQlidWZmZXJfcHV0X2JpZ251bTIoJmIsIGdfeCk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJmIsIGlkLCBpZGxlbik7Ci0KLQlTQ0hOT1JSX0RFQlVHX0JVRigoYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpLAotCSAgICAiJXM6IGhhc2hibG9iIiwgX19mdW5jX18pKTsKLQlpZiAoaGFzaF9idWZmZXIoYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpLCBldnBfbWQsCi0JICAgICZkaWdlc3QsICZkaWdlc3RfbGVuKSAhPSAwKSB7Ci0JCWVycm9yKCIlczogaGFzaF9idWZmZXIiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoQk5fYmluMmJuKGRpZ2VzdCwgKGludClkaWdlc3RfbGVuLCBoKSA9PSBOVUxMKSB7Ci0JCWVycm9yKCIlczogQk5fYmluMmJuIiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0Jc3VjY2VzcyA9IDA7Ci0JU0NITk9SUl9ERUJVR19CTigoaCwgIiVzOiBoID0gIiwgX19mdW5jX18pKTsKLSBvdXQ6Ci0JYnVmZmVyX2ZyZWUoJmIpOwotCWJ6ZXJvKGRpZ2VzdCwgZGlnZXN0X2xlbik7Ci0JeGZyZWUoZGlnZXN0KTsKLQlkaWdlc3RfbGVuID0gMDsKLQlpZiAoc3VjY2VzcyA9PSAwKQotCQlyZXR1cm4gaDsKLQlCTl9jbGVhcl9mcmVlKGgpOwotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogR2VuZXJhdGUgU2Nobm9yciBzaWduYXR1cmUgdG8gcHJvdmUga25vd2xlZGdlIG9mIHByaXZhdGUgdmFsdWUgJ3gnIHVzZWQKLSAqIGluIHB1YmxpYyBleHBvbmVudCBnXngsIHVuZGVyIGdyb3VwIGRlZmluZWQgYnkgJ2dycF9wJywgJ2dycF9xJyBhbmQgJ2dycF9nJwotICogdXNpbmcgdGhlIGhhc2ggZnVuY3Rpb24gImV2cF9tZCIuCi0gKiAnaWRsZW4nIGJ5dGVzIGZyb20gJ2lkJyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBzaWduYXR1cmUgaGFzaCBhcyBhbiBhbnRpLQotICogcmVwbGF5IHNhbHQuCi0gKiAKLSAqIE9uIHN1Y2Nlc3MsIDAgaXMgcmV0dXJuZWQuIFRoZSBzaWduYXR1cmUgdmFsdWVzIGFyZSByZXR1cm5lZCBhcyAqZV9wCi0gKiAoZ152IG1vZCBwKSBhbmQgKnJfcCAodiAtIHhoIG1vZCBxKS4gVGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlc2UgdmFsdWVzLgotICogT24gZmFpbHVyZSwgLTEgaXMgcmV0dXJuZWQuCi0gKi8KLWludAotc2Nobm9ycl9zaWduKGNvbnN0IEJJR05VTSAqZ3JwX3AsIGNvbnN0IEJJR05VTSAqZ3JwX3EsIGNvbnN0IEJJR05VTSAqZ3JwX2csCi0gICAgY29uc3QgRVZQX01EICpldnBfbWQsIGNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICpnX3gsCi0gICAgY29uc3QgdV9jaGFyICppZCwgdV9pbnQgaWRsZW4sIEJJR05VTSAqKnJfcCwgQklHTlVNICoqZV9wKQotewotCWludCBzdWNjZXNzID0gLTE7Ci0JQklHTlVNICpoLCAqdG1wLCAqdiwgKmdfdiwgKnI7Ci0JQk5fQ1RYICpibl9jdHg7Ci0KLQlTQ0hOT1JSX0RFQlVHX0JOKCh4LCAiJXM6IHggPSAiLCBfX2Z1bmNfXykpOwotCVNDSE5PUlJfREVCVUdfQk4oKGdfeCwgIiVzOiBnX3ggPSAiLCBfX2Z1bmNfXykpOwotCi0JLyogQXZvaWQgZGVnZW5lcmF0ZSBjYXNlczogZ14wIHlpZWxkcyBhIHNwb29mYWJsZSBzaWduYXR1cmUgKi8KLQlpZiAoQk5fY21wKGdfeCwgQk5fdmFsdWVfb25lKCkpIDw9IDApIHsKLQkJZXJyb3IoIiVzOiBnX3ggPCAxIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChCTl9jbXAoZ194LCBncnBfcCkgPj0gMCkgewotCQllcnJvcigiJXM6IGdfeCA+IGciLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQloID0gZ192ID0gciA9IHRtcCA9IHYgPSBOVUxMOwotCWlmICgoYm5fY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKSB7Ci0JCWVycm9yKCIlczogQk5fQ1RYX25ldyIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmICgoZ192ID0gQk5fbmV3KCkpID09IE5VTEwgfHwKLQkgICAgKHIgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAotCSAgICAodG1wID0gQk5fbmV3KCkpID09IE5VTEwpIHsKLQkJZXJyb3IoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogdiBtdXN0IGJlIGEgcmFuZG9tIGVsZW1lbnQgb2YgWnEsIHNvIDEgPD0gdiA8IHEKLQkgKiB3ZSBhbHNvIGV4Y2x1ZGUgdiA9IDEsIHNpbmNlIGdeMSBsb29rcyBkYW5nZXJvdXMKLQkgKi8KLQlpZiAoKHYgPSBibl9yYW5kX3JhbmdlX2d0X29uZShncnBfcCkpID09IE5VTEwpIHsKLQkJZXJyb3IoIiVzOiBibl9yYW5kX3JhbmdlMiIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCVNDSE5PUlJfREVCVUdfQk4oKHYsICIlczogdiA9ICIsIF9fZnVuY19fKSk7Ci0KLQkvKiBnX3YgPSBnXnYgbW9kIHAgKi8KLQlpZiAoQk5fbW9kX2V4cChnX3YsIGdycF9nLCB2LCBncnBfcCwgYm5fY3R4KSA9PSAtMSkgewotCQllcnJvcigiJXM6IEJOX21vZF9leHAgKGdediBtb2QgcCkiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlTQ0hOT1JSX0RFQlVHX0JOKChnX3YsICIlczogZ192ID0gIiwgX19mdW5jX18pKTsKLQotCS8qIGggPSBIKGcgfHwgZ152IHx8IGdeeCB8fCBpZCkgKi8KLQlpZiAoKGggPSBzY2hub3JyX2hhc2goZ3JwX3AsIGdycF9xLCBncnBfZywgZXZwX21kLCBnX3YsIGdfeCwKLQkgICAgaWQsIGlkbGVuKSkgPT0gTlVMTCkgewotCQllcnJvcigiJXM6IHNjaG5vcnJfaGFzaCBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIHIgPSB2IC0geGggbW9kIHEgKi8KLQlpZiAoQk5fbW9kX211bCh0bXAsIHgsIGgsIGdycF9xLCBibl9jdHgpID09IC0xKSB7Ci0JCWVycm9yKCIlczogQk5fbW9kX211bCAodG1wID0geHYgbW9kIHEpIiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKEJOX21vZF9zdWIociwgdiwgdG1wLCBncnBfcSwgYm5fY3R4KSA9PSAtMSkgewotCQllcnJvcigiJXM6IEJOX21vZF9tdWwgKHIgPSB2IC0gdG1wKSIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCVNDSE5PUlJfREVCVUdfQk4oKGdfdiwgIiVzOiBlID0gIiwgX19mdW5jX18pKTsKLQlTQ0hOT1JSX0RFQlVHX0JOKChyLCAiJXM6IHIgPSAiLCBfX2Z1bmNfXykpOwotCi0JKmVfcCA9IGdfdjsKLQkqcl9wID0gcjsKLQotCXN1Y2Nlc3MgPSAwOwotIG91dDoKLQlCTl9DVFhfZnJlZShibl9jdHgpOwotCWlmIChoICE9IE5VTEwpCi0JCUJOX2NsZWFyX2ZyZWUoaCk7Ci0JaWYgKHYgIT0gTlVMTCkKLQkJQk5fY2xlYXJfZnJlZSh2KTsKLQlCTl9jbGVhcl9mcmVlKHRtcCk7Ci0KLQlyZXR1cm4gc3VjY2VzczsKLX0KLQotLyoKLSAqIEdlbmVyYXRlIFNjaG5vcnIgc2lnbmF0dXJlIHRvIHByb3ZlIGtub3dsZWRnZSBvZiBwcml2YXRlIHZhbHVlICd4JyB1c2VkCi0gKiBpbiBwdWJsaWMgZXhwb25lbnQgZ154LCB1bmRlciBncm91cCBkZWZpbmVkIGJ5ICdncnBfcCcsICdncnBfcScgYW5kICdncnBfZycKLSAqIHVzaW5nIGEgU0hBMjU2IGhhc2guCi0gKiAnaWRsZW4nIGJ5dGVzIGZyb20gJ2lkJyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBzaWduYXR1cmUgaGFzaCBhcyBhbiBhbnRpLQotICogcmVwbGF5IHNhbHQuCi0gKiBPbiBzdWNjZXNzLCAwIGlzIHJldHVybmVkIGFuZCAqc2lnbGVuIGJ5dGVzIG9mIHNpZ25hdHVyZSBhcmUgcmV0dXJuZWQgaW4KLSAqICpzaWcgKGNhbGxlciB0byBmcmVlKS4gUmV0dXJucyAtMSBvbiBmYWlsdXJlLgotICovCi1pbnQKLXNjaG5vcnJfc2lnbl9idWYoY29uc3QgQklHTlVNICpncnBfcCwgY29uc3QgQklHTlVNICpncnBfcSwgY29uc3QgQklHTlVNICpncnBfZywKLSAgICBjb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqZ194LCBjb25zdCB1X2NoYXIgKmlkLCB1X2ludCBpZGxlbiwKLSAgICB1X2NoYXIgKipzaWcsIHVfaW50ICpzaWdsZW4pCi17Ci0JQnVmZmVyIGI7Ci0JQklHTlVNICpyLCAqZTsKLQotCWlmIChzY2hub3JyX3NpZ24oZ3JwX3AsIGdycF9xLCBncnBfZywgRVZQX3NoYTI1NigpLAotCSAgICB4LCBnX3gsIGlkLCBpZGxlbiwgJnIsICZlKSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBTaWduYXR1cmUgaXMgKGUsIHIpICovCi0JYnVmZmVyX2luaXQoJmIpOwotCS8qIFhYWCBzaWd0eXBlLWhhc2ggYXMgc3RyaW5nPyAqLwotCWJ1ZmZlcl9wdXRfYmlnbnVtMigmYiwgZSk7Ci0JYnVmZmVyX3B1dF9iaWdudW0yKCZiLCByKTsKLQkqc2lnbGVuID0gYnVmZmVyX2xlbigmYik7Ci0JKnNpZyA9IHhtYWxsb2MoKnNpZ2xlbik7Ci0JbWVtY3B5KCpzaWcsIGJ1ZmZlcl9wdHIoJmIpLCAqc2lnbGVuKTsKLQlTQ0hOT1JSX0RFQlVHX0JVRigoYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpLAotCSAgICAiJXM6IHNpZ2Jsb2IiLCBfX2Z1bmNfXykpOwotCWJ1ZmZlcl9mcmVlKCZiKTsKLQotCUJOX2NsZWFyX2ZyZWUocik7Ci0JQk5fY2xlYXJfZnJlZShlKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogVmVyaWZ5IFNjaG5vcnIgc2lnbmF0dXJlIHsgciAodiAtIHhoIG1vZCBxKSwgZSAoZ152IG1vZCBwKSB9IGFnYWluc3QKLSAqIHB1YmxpYyBleHBvbmVudCBnX3ggKGdeeCkgdW5kZXIgZ3JvdXAgZGVmaW5lZCBieSAnZ3JwX3AnLCAnZ3JwX3EnIGFuZAotICogJ2dycF9nJyB1c2luZyBoYXNoICJldnBfbWQiLgotICogU2lnbmF0dXJlIGhhc2ggd2lsbCBiZSBzYWx0ZWQgd2l0aCAnaWRsZW4nIGJ5dGVzIGZyb20gJ2lkJy4KLSAqIFJldHVybnMgLTEgb24gZmFpbHVyZSwgMCBvbiBpbmNvcnJlY3Qgc2lnbmF0dXJlIG9yIDEgb24gbWF0Y2hpbmcgc2lnbmF0dXJlLgotICovCi1pbnQKLXNjaG5vcnJfdmVyaWZ5KGNvbnN0IEJJR05VTSAqZ3JwX3AsIGNvbnN0IEJJR05VTSAqZ3JwX3EsIGNvbnN0IEJJR05VTSAqZ3JwX2csCi0gICAgY29uc3QgRVZQX01EICpldnBfbWQsIGNvbnN0IEJJR05VTSAqZ194LCBjb25zdCB1X2NoYXIgKmlkLCB1X2ludCBpZGxlbiwKLSAgICBjb25zdCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqZSkKLXsKLQlpbnQgc3VjY2VzcyA9IC0xOwotCUJJR05VTSAqaCA9IE5VTEwsICpnX3hoID0gTlVMTCwgKmdfciA9IE5VTEwsICpneF9xID0gTlVMTDsKLQlCSUdOVU0gKmV4cGVjdGVkID0gTlVMTDsKLQlCTl9DVFggKmJuX2N0eDsKLQotCVNDSE5PUlJfREVCVUdfQk4oKGdfeCwgIiVzOiBnX3ggPSAiLCBfX2Z1bmNfXykpOwotCi0JLyogQXZvaWQgZGVnZW5lcmF0ZSBjYXNlczogZ14wIHlpZWxkcyBhIHNwb29mYWJsZSBzaWduYXR1cmUgKi8KLQlpZiAoQk5fY21wKGdfeCwgQk5fdmFsdWVfb25lKCkpIDw9IDApIHsKLQkJZXJyb3IoIiVzOiBnX3ggPD0gMSIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoQk5fY21wKGdfeCwgZ3JwX3ApID49IDApIHsKLQkJZXJyb3IoIiVzOiBnX3ggPj0gcCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWggPSBnX3hoID0gZ19yID0gZXhwZWN0ZWQgPSBOVUxMOwotCWlmICgoYm5fY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKSB7Ci0JCWVycm9yKCIlczogQk5fQ1RYX25ldyIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmICgoZ194aCA9IEJOX25ldygpKSA9PSBOVUxMIHx8Ci0JICAgIChnX3IgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAotCSAgICAoZ3hfcSA9IEJOX25ldygpKSA9PSBOVUxMIHx8Ci0JICAgIChleHBlY3RlZCA9IEJOX25ldygpKSA9PSBOVUxMKSB7Ci0JCWVycm9yKCIlczogQk5fbmV3IiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlTQ0hOT1JSX0RFQlVHX0JOKChlLCAiJXM6IGUgPSAiLCBfX2Z1bmNfXykpOwotCVNDSE5PUlJfREVCVUdfQk4oKHIsICIlczogciA9ICIsIF9fZnVuY19fKSk7Ci0KLQkvKiBneF9xID0gKGdeeClecSBtdXN0ID09PSAxIG1vZCBwICovCi0JaWYgKEJOX21vZF9leHAoZ3hfcSwgZ194LCBncnBfcSwgZ3JwX3AsIGJuX2N0eCkgPT0gLTEpIHsKLQkJZXJyb3IoIiVzOiBCTl9tb2RfZXhwIChnX3hecSBtb2QgcCkiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoQk5fY21wKGd4X3EsIEJOX3ZhbHVlX29uZSgpKSAhPSAwKSB7Ci0JCWVycm9yKCIlczogSW52YWxpZCBzaWduYXR1cmUgKGdeeClecSAhPSAxIG1vZCBwIiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlTQ0hOT1JSX0RFQlVHX0JOKChnX3hoLCAiJXM6IGdfeGggPSAiLCBfX2Z1bmNfXykpOwotCS8qIGggPSBIKGcgfHwgZ152IHx8IGdeeCB8fCBpZCkgKi8KLQlpZiAoKGggPSBzY2hub3JyX2hhc2goZ3JwX3AsIGdycF9xLCBncnBfZywgZXZwX21kLCBlLCBnX3gsCi0JICAgIGlkLCBpZGxlbikpID09IE5VTEwpIHsKLQkJZXJyb3IoIiVzOiBzY2hub3JyX2hhc2ggZmFpbGVkIiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBnX3hoID0gKGdeeCleaCAqLwotCWlmIChCTl9tb2RfZXhwKGdfeGgsIGdfeCwgaCwgZ3JwX3AsIGJuX2N0eCkgPT0gLTEpIHsKLQkJZXJyb3IoIiVzOiBCTl9tb2RfZXhwIChnX3heaCBtb2QgcCkiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlTQ0hOT1JSX0RFQlVHX0JOKChnX3hoLCAiJXM6IGdfeGggPSAiLCBfX2Z1bmNfXykpOwotCi0JLyogZ19yID0gZ15yICovCi0JaWYgKEJOX21vZF9leHAoZ19yLCBncnBfZywgciwgZ3JwX3AsIGJuX2N0eCkgPT0gLTEpIHsKLQkJZXJyb3IoIiVzOiBCTl9tb2RfZXhwIChnX3heaCBtb2QgcCkiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlTQ0hOT1JSX0RFQlVHX0JOKChnX3IsICIlczogZ19yID0gIiwgX19mdW5jX18pKTsKLQotCS8qIGV4cGVjdGVkID0gZ15yICogZ194aCAqLwotCWlmIChCTl9tb2RfbXVsKGV4cGVjdGVkLCBnX3IsIGdfeGgsIGdycF9wLCBibl9jdHgpID09IC0xKSB7Ci0JCWVycm9yKCIlczogQk5fbW9kX211bCAoZXhwZWN0ZWQgPSBnX3IgbW9kIHApIiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0JU0NITk9SUl9ERUJVR19CTigoZXhwZWN0ZWQsICIlczogZXhwZWN0ZWQgPSAiLCBfX2Z1bmNfXykpOwotCi0JLyogQ2hlY2sgZSA9PSBleHBlY3RlZCAqLwotCXN1Y2Nlc3MgPSBCTl9jbXAoZXhwZWN0ZWQsIGUpID09IDA7Ci0gb3V0OgotCUJOX0NUWF9mcmVlKGJuX2N0eCk7Ci0JaWYgKGggIT0gTlVMTCkKLQkJQk5fY2xlYXJfZnJlZShoKTsKLQlpZiAoZ3hfcSAhPSBOVUxMKQotCQlCTl9jbGVhcl9mcmVlKGd4X3EpOwotCWlmIChnX3hoICE9IE5VTEwpCi0JCUJOX2NsZWFyX2ZyZWUoZ194aCk7Ci0JaWYgKGdfciAhPSBOVUxMKQotCQlCTl9jbGVhcl9mcmVlKGdfcik7Ci0JaWYgKGV4cGVjdGVkICE9IE5VTEwpCi0JCUJOX2NsZWFyX2ZyZWUoZXhwZWN0ZWQpOwotCXJldHVybiBzdWNjZXNzOwotfQotCi0vKgotICogVmVyaWZ5IFNjaG5vcnIgc2lnbmF0dXJlICdzaWcnIG9mIGxlbmd0aCAnc2lnbGVuJyBhZ2FpbnN0IHB1YmxpYyBleHBvbmVudAotICogZ194IChnXngpIHVuZGVyIGdyb3VwIGRlZmluZWQgYnkgJ2dycF9wJywgJ2dycF9xJyBhbmQgJ2dycF9nJyB1c2luZyBhCi0gKiBTSEEyNTYgaGFzaC4KLSAqIFNpZ25hdHVyZSBoYXNoIHdpbGwgYmUgc2FsdGVkIHdpdGggJ2lkbGVuJyBieXRlcyBmcm9tICdpZCcuCi0gKiBSZXR1cm5zIC0xIG9uIGZhaWx1cmUsIDAgb24gaW5jb3JyZWN0IHNpZ25hdHVyZSBvciAxIG9uIG1hdGNoaW5nIHNpZ25hdHVyZS4KLSAqLwotaW50Ci1zY2hub3JyX3ZlcmlmeV9idWYoY29uc3QgQklHTlVNICpncnBfcCwgY29uc3QgQklHTlVNICpncnBfcSwKLSAgICBjb25zdCBCSUdOVU0gKmdycF9nLAotICAgIGNvbnN0IEJJR05VTSAqZ194LCBjb25zdCB1X2NoYXIgKmlkLCB1X2ludCBpZGxlbiwKLSAgICBjb25zdCB1X2NoYXIgKnNpZywgdV9pbnQgc2lnbGVuKQotewotCUJ1ZmZlciBiOwotCWludCByZXQgPSAtMTsKLQl1X2ludCBybGVuOwotCUJJR05VTSAqciwgKmU7Ci0KLQllID0gciA9IE5VTEw7Ci0JaWYgKChlID0gQk5fbmV3KCkpID09IE5VTEwgfHwKLQkgICAgKHIgPSBCTl9uZXcoKSkgPT0gTlVMTCkgewotCQllcnJvcigiJXM6IEJOX25ldyIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogRXh0cmFjdCBnXnYgYW5kIHIgZnJvbSBzaWduYXR1cmUgYmxvYiAqLwotCWJ1ZmZlcl9pbml0KCZiKTsKLQlidWZmZXJfYXBwZW5kKCZiLCBzaWcsIHNpZ2xlbik7Ci0JU0NITk9SUl9ERUJVR19CVUYoKGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSwKLQkgICAgIiVzOiBzaWdibG9iIiwgX19mdW5jX18pKTsKLQlidWZmZXJfZ2V0X2JpZ251bTIoJmIsIGUpOwotCWJ1ZmZlcl9nZXRfYmlnbnVtMigmYiwgcik7Ci0JcmxlbiA9IGJ1ZmZlcl9sZW4oJmIpOwotCWJ1ZmZlcl9mcmVlKCZiKTsKLQlpZiAocmxlbiAhPSAwKSB7Ci0JCWVycm9yKCIlczogcmVtYWluaW5nIGJ5dGVzIGluIHNpZ25hdHVyZSAlZCIsIF9fZnVuY19fLCBybGVuKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gc2Nobm9ycl92ZXJpZnkoZ3JwX3AsIGdycF9xLCBncnBfZywgRVZQX3NoYTI1NigpLAotCSAgICBnX3gsIGlkLCBpZGxlbiwgciwgZSk7Ci0gb3V0OgotCUJOX2NsZWFyX2ZyZWUoZSk7Ci0JQk5fY2xlYXJfZnJlZShyKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIEhlbHBlciBmdW5jdGlvbnMgKi8KLQotLyoKLSAqIEdlbmVyYXRlIHVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gbnVtYmVyIGluIHJhbmdlICgxLCBoaWdoKS4KLSAqIFJldHVybiBudW1iZXIgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgotICovCi1CSUdOVU0gKgotYm5fcmFuZF9yYW5nZV9ndF9vbmUoY29uc3QgQklHTlVNICpoaWdoKQotewotCUJJR05VTSAqciwgKnRtcDsKLQlpbnQgc3VjY2VzcyA9IC0xOwotCi0JaWYgKCh0bXAgPSBCTl9uZXcoKSkgPT0gTlVMTCkgewotCQllcnJvcigiJXM6IEJOX25ldyIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICgociA9IEJOX25ldygpKSA9PSBOVUxMKSB7Ci0JCWVycm9yKCIlczogQk5fbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChCTl9zZXRfd29yZCh0bXAsIDIpICE9IDEpIHsKLQkJZXJyb3IoIiVzOiBCTl9zZXRfd29yZCh0bXAsIDIpIiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKEJOX3N1Yih0bXAsIGhpZ2gsIHRtcCkgPT0gLTEpIHsKLQkJZXJyb3IoIiVzOiBCTl9zdWIgZmFpbGVkICh0bXAgPSBoaWdoIC0gMikiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoQk5fcmFuZF9yYW5nZShyLCB0bXApID09IC0xKSB7Ci0JCWVycm9yKCIlczogQk5fcmFuZF9yYW5nZSBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoQk5fc2V0X3dvcmQodG1wLCAyKSAhPSAxKSB7Ci0JCWVycm9yKCIlczogQk5fc2V0X3dvcmQodG1wLCAyKSIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChCTl9hZGQociwgciwgdG1wKSA9PSAtMSkgewotCQllcnJvcigiJXM6IEJOX2FkZCBmYWlsZWQgKHIgPSByICsgMikiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlzdWNjZXNzID0gMDsKLSBvdXQ6Ci0JQk5fY2xlYXJfZnJlZSh0bXApOwotCWlmIChzdWNjZXNzID09IDApCi0JCXJldHVybiByOwotCUJOX2NsZWFyX2ZyZWUocik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBIYXNoIGNvbnRlbnRzIG9mIGJ1ZmZlciAnYicgd2l0aCBoYXNoICdtZCcuIFJldHVybnMgMCBvbiBzdWNjZXNzLAotICogd2l0aCBkaWdlc3QgdmlhICdkaWdlc3RwJyAoY2FsbGVyIHRvIGZyZWUpIGFuZCBsZW5ndGggdmlhICdsZW5wJy4KLSAqIFJldHVybnMgLTEgb24gZmFpbHVyZS4KLSAqLwotaW50Ci1oYXNoX2J1ZmZlcihjb25zdCB1X2NoYXIgKmJ1ZiwgdV9pbnQgbGVuLCBjb25zdCBFVlBfTUQgKm1kLAotICAgIHVfY2hhciAqKmRpZ2VzdHAsIHVfaW50ICpsZW5wKQotewotCXVfY2hhciBkaWdlc3RbRVZQX01BWF9NRF9TSVpFXTsKLQl1X2ludCBkaWdlc3RfbGVuOwotCUVWUF9NRF9DVFggZXZwX21kX2N0eDsKLQlpbnQgc3VjY2VzcyA9IC0xOwotCi0JRVZQX01EX0NUWF9pbml0KCZldnBfbWRfY3R4KTsKLQotCWlmIChFVlBfRGlnZXN0SW5pdF9leCgmZXZwX21kX2N0eCwgbWQsIE5VTEwpICE9IDEpIHsKLQkJZXJyb3IoIiVzOiBFVlBfRGlnZXN0SW5pdF9leCIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChFVlBfRGlnZXN0VXBkYXRlKCZldnBfbWRfY3R4LCBidWYsIGxlbikgIT0gMSkgewotCQllcnJvcigiJXM6IEVWUF9EaWdlc3RVcGRhdGUiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoRVZQX0RpZ2VzdEZpbmFsX2V4KCZldnBfbWRfY3R4LCBkaWdlc3QsICZkaWdlc3RfbGVuKSAhPSAxKSB7Ci0JCWVycm9yKCIlczogRVZQX0RpZ2VzdEZpbmFsX2V4IiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0JKmRpZ2VzdHAgPSB4bWFsbG9jKGRpZ2VzdF9sZW4pOwotCSpsZW5wID0gZGlnZXN0X2xlbjsKLQltZW1jcHkoKmRpZ2VzdHAsIGRpZ2VzdCwgKmxlbnApOwotCXN1Y2Nlc3MgPSAwOwotIG91dDoKLQlFVlBfTURfQ1RYX2NsZWFudXAoJmV2cF9tZF9jdHgpOwotCWJ6ZXJvKGRpZ2VzdCwgc2l6ZW9mKGRpZ2VzdCkpOwotCWRpZ2VzdF9sZW4gPSAwOwotCXJldHVybiBzdWNjZXNzOwotfQotCi0vKiBwcmludCBmb3JtYXR0ZWQgc3RyaW5nIGZvbGxvd2VkIGJ5IGJpZ251bSAqLwotdm9pZAotZGVidWczX2JuKGNvbnN0IEJJR05VTSAqbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JY2hhciAqb3V0LCAqaDsKLQl2YV9saXN0IGFyZ3M7Ci0KLQlvdXQgPSBOVUxMOwotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdmFzcHJpbnRmKCZvdXQsIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCWlmIChvdXQgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiB2YXNwcmludGYgZmFpbGVkIiwgX19mdW5jX18pOwotCi0JaWYgKG4gPT0gTlVMTCkKLQkJZGVidWczKCIlcyhudWxsKSIsIG91dCk7Ci0JZWxzZSB7Ci0JCWggPSBCTl9ibjJoZXgobik7Ci0JCWRlYnVnMygiJXMweCVzIiwgb3V0LCBoKTsKLQkJZnJlZShoKTsKLQl9Ci0JZnJlZShvdXQpOwotfQotCi0vKiBwcmludCBmb3JtYXR0ZWQgc3RyaW5nIGZvbGxvd2VkIGJ5IGJ1ZmZlciBjb250ZW50cyBpbiBoZXggKi8KLXZvaWQKLWRlYnVnM19idWYoY29uc3QgdV9jaGFyICpidWYsIHVfaW50IGxlbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JY2hhciAqb3V0LCBoWzY1XTsKLQl1X2ludCBpLCBqOwotCXZhX2xpc3QgYXJnczsKLQotCW91dCA9IE5VTEw7Ci0JdmFfc3RhcnQoYXJncywgZm10KTsKLQl2YXNwcmludGYoJm91dCwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0JaWYgKG91dCA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IHZhc3ByaW50ZiBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0KLQlkZWJ1ZzMoIiVzIGxlbmd0aCAldSVzIiwgb3V0LCBsZW4sIGJ1ZiA9PSBOVUxMID8gIiAobnVsbCkiIDogIiIpOwotCWZyZWUob3V0KTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybjsKLQotCSpoID0gJ1wwJzsKLQlmb3IgKGkgPSBqID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCXNucHJpbnRmKGggKyBqLCBzaXplb2YoaCkgLSBqLCAiJTAyeCIsIGJ1ZltpXSk7Ci0JCWogKz0gMjsKLQkJaWYgKGogPj0gc2l6ZW9mKGgpIC0gMSB8fCBpID09IGxlbiAtIDEpIHsKLQkJCWRlYnVnMygiICAgICVzIiwgaCk7Ci0JCQkqaCA9ICdcMCc7Ci0JCQlqID0gMDsKLQkJfQotCX0KLX0KLQotLyoKLSAqIENvbnN0cnVjdCBhIE1PRFAgZ3JvdXAgZnJvbSBoZXggc3RyaW5ncyBwICh3aGljaCBtdXN0IGJlIGEgc2FmZQotICogcHJpbWUpIGFuZCBnLCBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0aW5nIHN1Ymdyb3VwIHEgYXMgKHAgLyAyKQotICovCi1zdHJ1Y3QgbW9kcF9ncm91cCAqCi1tb2RwX2dyb3VwX2Zyb21fZ19hbmRfc2FmZV9wKGNvbnN0IGNoYXIgKmdycF9nLCBjb25zdCBjaGFyICpncnBfcCkKLXsKLQlzdHJ1Y3QgbW9kcF9ncm91cCAqcmV0OwotCi0JcmV0ID0geG1hbGxvYyhzaXplb2YoKnJldCkpOwotCXJldC0+cCA9IHJldC0+cSA9IHJldC0+ZyA9IE5VTEw7Ci0JaWYgKEJOX2hleDJibigmcmV0LT5wLCBncnBfcCkgPT0gMCB8fAotCSAgICBCTl9oZXgyYm4oJnJldC0+ZywgZ3JwX2cpID09IDApCi0JCWZhdGFsKCIlczogQk5faGV4MmJuIiwgX19mdW5jX18pOwotCS8qIFN1Ymdyb3VwIG9yZGVyIGlzIHAvMiAocCBpcyBhIHNhZmUgcHJpbWUpICovCi0JaWYgKChyZXQtPnEgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBCTl9uZXciLCBfX2Z1bmNfXyk7Ci0JaWYgKEJOX3JzaGlmdDEocmV0LT5xLCByZXQtPnApICE9IDEpCi0JCWZhdGFsKCIlczogQk5fcnNoaWZ0MSIsIF9fZnVuY19fKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQKLW1vZHBfZ3JvdXBfZnJlZShzdHJ1Y3QgbW9kcF9ncm91cCAqZ3JwKQotewotCWlmIChncnAtPmcgIT0gTlVMTCkKLQkJQk5fY2xlYXJfZnJlZShncnAtPmcpOwotCWlmIChncnAtPnAgIT0gTlVMTCkKLQkJQk5fY2xlYXJfZnJlZShncnAtPnApOwotCWlmIChncnAtPnEgIT0gTlVMTCkKLQkJQk5fY2xlYXJfZnJlZShncnAtPnEpOwotCWJ6ZXJvKGdycCwgc2l6ZW9mKCpncnApKTsKLQl4ZnJlZShncnApOwotfQotCi0vKiBtYWluKCkgZnVuY3Rpb24gZm9yIHNlbGYtdGVzdCAqLwotCi0jaWZkZWYgU0NITk9SUl9NQUlOCi1zdGF0aWMgdm9pZAotc2Nobm9ycl9zZWxmdGVzdF9vbmUoY29uc3QgQklHTlVNICpncnBfcCwgY29uc3QgQklHTlVNICpncnBfcSwKLSAgICBjb25zdCBCSUdOVU0gKmdycF9nLCBjb25zdCBCSUdOVU0gKngpCi17Ci0JQklHTlVNICpnX3g7Ci0JdV9jaGFyICpzaWc7Ci0JdV9pbnQgc2lnbGVuOwotCUJOX0NUWCAqYm5fY3R4OwotCi0JaWYgKChibl9jdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fQ1RYX25ldyIsIF9fZnVuY19fKTsKLQlpZiAoKGdfeCA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEJOX25ldyIsIF9fZnVuY19fKTsKLQotCWlmIChCTl9tb2RfZXhwKGdfeCwgZ3JwX2csIHgsIGdycF9wLCBibl9jdHgpID09IC0xKQotCQlmYXRhbCgiJXM6IGdfeCIsIF9fZnVuY19fKTsKLQlpZiAoc2Nobm9ycl9zaWduX2J1ZihncnBfcCwgZ3JwX3EsIGdycF9nLCB4LCBnX3gsICJqdW5rIiwgNCwKLQkgICAgJnNpZywgJnNpZ2xlbikpCi0JCWZhdGFsKCIlczogc2Nobm9ycl9zaWduIiwgX19mdW5jX18pOwotCWlmIChzY2hub3JyX3ZlcmlmeV9idWYoZ3JwX3AsIGdycF9xLCBncnBfZywgZ194LCAianVuayIsIDQsCi0JICAgIHNpZywgc2lnbGVuKSAhPSAxKQotCQlmYXRhbCgiJXM6IHZlcmlmeSBmYWlsIiwgX19mdW5jX18pOwotCWlmIChzY2hub3JyX3ZlcmlmeV9idWYoZ3JwX3AsIGdycF9xLCBncnBfZywgZ194LCAiSlVOSyIsIDQsCi0JICAgIHNpZywgc2lnbGVuKSAhPSAwKQotCQlmYXRhbCgiJXM6IHZlcmlmeSBzaG91bGQgaGF2ZSBmYWlsZWQgKGJhZCBJRCkiLCBfX2Z1bmNfXyk7Ci0Jc2lnWzRdIF49IDE7Ci0JaWYgKHNjaG5vcnJfdmVyaWZ5X2J1ZihncnBfcCwgZ3JwX3EsIGdycF9nLCBnX3gsICJqdW5rIiwgNCwKLQkgICAgc2lnLCBzaWdsZW4pICE9IDApCi0JCWZhdGFsKCIlczogdmVyaWZ5IHNob3VsZCBoYXZlIGZhaWxlZCAoYml0IGVycm9yKSIsIF9fZnVuY19fKTsKLQl4ZnJlZShzaWcpOwotCUJOX2ZyZWUoZ194KTsKLQlCTl9DVFhfZnJlZShibl9jdHgpOwotfQotCi1zdGF0aWMgdm9pZAotc2Nobm9ycl9zZWxmdGVzdCh2b2lkKQotewotCUJJR05VTSAqeDsKLQlzdHJ1Y3QgbW9kcF9ncm91cCAqZ3JwOwotCXVfaW50IGk7Ci0JY2hhciAqaGg7Ci0KLQlncnAgPSBqcGFrZV9kZWZhdWx0X2dyb3VwKCk7Ci0JaWYgKCh4ID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fbmV3IiwgX19mdW5jX18pOwotCVNDSE5PUlJfREVCVUdfQk4oKGdycC0+cCwgIiVzOiBncnAtPnAgPSAiLCBfX2Z1bmNfXykpOwotCVNDSE5PUlJfREVCVUdfQk4oKGdycC0+cSwgIiVzOiBncnAtPnEgPSAiLCBfX2Z1bmNfXykpOwotCVNDSE5PUlJfREVCVUdfQk4oKGdycC0+ZywgIiVzOiBncnAtPmcgPSAiLCBfX2Z1bmNfXykpOwotCi0JLyogWzEsIDIwKSAqLwotCWZvciAoaSA9IDE7IGkgPCAyMDsgaSsrKSB7Ci0JCXByaW50ZigieCA9ICV1XG4iLCBpKTsKLQkJZmZsdXNoKHN0ZG91dCk7Ci0JCWlmIChCTl9zZXRfd29yZCh4LCBpKSAhPSAxKQotCQkJZmF0YWwoIiVzOiBzZXQgeCB3b3JkIiwgX19mdW5jX18pOwotCQlzY2hub3JyX3NlbGZ0ZXN0X29uZShncnAtPnAsIGdycC0+cSwgZ3JwLT5nLCB4KTsKLQl9Ci0KLQkvKiAxMDAgeCByYW5kb20gWzAsIHApICovCi0JZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCWlmIChCTl9yYW5kX3JhbmdlKHgsIGdycC0+cCkgIT0gMSkKLQkJCWZhdGFsKCIlczogQk5fcmFuZF9yYW5nZSIsIF9fZnVuY19fKTsKLQkJaGggPSBCTl9ibjJoZXgoeCk7Ci0JCXByaW50ZigieCA9IChyYW5kb20pIDB4JXNcbiIsIGhoKTsKLQkJZnJlZShoaCk7Ci0JCWZmbHVzaChzdGRvdXQpOwotCQlzY2hub3JyX3NlbGZ0ZXN0X29uZShncnAtPnAsIGdycC0+cSwgZ3JwLT5nLCB4KTsKLQl9Ci0KLQkvKiBbcS0yMCwgcSkgKi8KLQlpZiAoQk5fc2V0X3dvcmQoeCwgMjApICE9IDEpCi0JCWZhdGFsKCIlczogQk5fc2V0X3dvcmQgKHggPSAyMCkiLCBfX2Z1bmNfXyk7Ci0JaWYgKEJOX3N1Yih4LCBncnAtPnEsIHgpICE9IDEpCi0JCWZhdGFsKCIlczogQk5fc3ViIChxIC0geCkiLCBfX2Z1bmNfXyk7Ci0JZm9yIChpID0gMDsgaSA8IDE5OyBpKyspIHsKLQkJaGggPSBCTl9ibjJoZXgoeCk7Ci0JCXByaW50ZigieCA9IChxIC0gJWQpIDB4JXNcbiIsIDIwIC0gaSwgaGgpOwotCQlmcmVlKGhoKTsKLQkJZmZsdXNoKHN0ZG91dCk7Ci0JCXNjaG5vcnJfc2VsZnRlc3Rfb25lKGdycC0+cCwgZ3JwLT5xLCBncnAtPmcsIHgpOwotCQlpZiAoQk5fYWRkKHgsIHgsIEJOX3ZhbHVlX29uZSgpKSAhPSAxKQotCQkJZmF0YWwoIiVzOiBCTl9hZGQgKHggKyAxKSIsIF9fZnVuY19fKTsKLQl9Ci0JQk5fZnJlZSh4KTsKLX0KLQotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQlsb2dfaW5pdChhcmd2WzBdLCBTWVNMT0dfTEVWRUxfREVCVUczLCBTWVNMT0dfRkFDSUxJVFlfVVNFUiwgMSk7Ci0KLQlzY2hub3JyX3NlbGZ0ZXN0KCk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc2Nobm9yci5oIGIvc2Nobm9yci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzMwYjQ3Li4wMDAwMDAwCi0tLSBhL3NjaG5vcnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qICRPcGVuQlNEOiBzY2hub3JyLmgsdiAxLjEgMjAwOS8wMy8wNSAwNzoxODoxOSBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBTQ0hOT1JSX0gKLSNkZWZpbmUgU0NITk9SUl9ICi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLQotc3RydWN0IG1vZHBfZ3JvdXAgewotCUJJR05VTSAqcCwgKnEsICpnOwotfTsKLQotQklHTlVNICpibl9yYW5kX3JhbmdlX2d0X29uZShjb25zdCBCSUdOVU0gKmhpZ2gpOwotaW50IGhhc2hfYnVmZmVyKGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgRVZQX01EICosIHVfY2hhciAqKiwgdV9pbnQgKik7Ci12b2lkIGRlYnVnM19ibihjb25zdCBCSUdOVU0gKiwgY29uc3QgY2hhciAqLCAuLi4pCi0gICAgX19hdHRyaWJ1dGVfXygoX19ub25udWxsX18gKDIpKSkKLSAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOwotdm9pZCBkZWJ1ZzNfYnVmKGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgY2hhciAqLCAuLi4pCi0gICAgX19hdHRyaWJ1dGVfXygoX19ub25udWxsX18gKDMpKSkKLSAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOwotc3RydWN0IG1vZHBfZ3JvdXAgKm1vZHBfZ3JvdXBfZnJvbV9nX2FuZF9zYWZlX3AoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotdm9pZCBtb2RwX2dyb3VwX2ZyZWUoc3RydWN0IG1vZHBfZ3JvdXAgKik7Ci0KLS8qIFNpZ25hdHVyZSBhbmQgdmVyaWZpY2F0aW9uIGZ1bmN0aW9ucyAqLwotaW50Ci1zY2hub3JyX3NpZ24oY29uc3QgQklHTlVNICpncnBfcCwgY29uc3QgQklHTlVNICpncnBfcSwgY29uc3QgQklHTlVNICpncnBfZywKLSAgICBjb25zdCBFVlBfTUQgKmV2cF9tZCwgY29uc3QgQklHTlVNICp4LCBjb25zdCBCSUdOVU0gKmdfeCwKLSAgICBjb25zdCB1X2NoYXIgKmlkLCB1X2ludCBpZGxlbiwgQklHTlVNICoqcl9wLCBCSUdOVU0gKiplX3ApOwotaW50Ci1zY2hub3JyX3NpZ25fYnVmKGNvbnN0IEJJR05VTSAqZ3JwX3AsIGNvbnN0IEJJR05VTSAqZ3JwX3EsIGNvbnN0IEJJR05VTSAqZ3JwX2csCi0gICAgY29uc3QgQklHTlVNICp4LCBjb25zdCBCSUdOVU0gKmdfeCwgY29uc3QgdV9jaGFyICppZCwgdV9pbnQgaWRsZW4sCi0gICAgdV9jaGFyICoqc2lnLCB1X2ludCAqc2lnbGVuKTsKLWludAotc2Nobm9ycl92ZXJpZnkoY29uc3QgQklHTlVNICpncnBfcCwgY29uc3QgQklHTlVNICpncnBfcSwgY29uc3QgQklHTlVNICpncnBfZywKLSAgICBjb25zdCBFVlBfTUQgKmV2cF9tZCwgY29uc3QgQklHTlVNICpnX3gsIGNvbnN0IHVfY2hhciAqaWQsIHVfaW50IGlkbGVuLAotICAgIGNvbnN0IEJJR05VTSAqciwgY29uc3QgQklHTlVNICplKTsKLWludAotc2Nobm9ycl92ZXJpZnlfYnVmKGNvbnN0IEJJR05VTSAqZ3JwX3AsIGNvbnN0IEJJR05VTSAqZ3JwX3EsCi0gICAgY29uc3QgQklHTlVNICpncnBfZywKLSAgICBjb25zdCBCSUdOVU0gKmdfeCwgY29uc3QgdV9jaGFyICppZCwgdV9pbnQgaWRsZW4sCi0gICAgY29uc3QgdV9jaGFyICpzaWcsIHVfaW50IHNpZ2xlbik7Ci0KLSNlbmRpZiAvKiBKUEFLRV9IICovCi0KZGlmZiAtLWdpdCBhL3NjcC4wIGIvc2NwLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZmFkOGEuLjAwMDAwMDAKLS0tIGEvc2NwLjAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotU0NQKDEpICAgICAgICAgICAgICAgICAgICAgT3BlbkJTRCBSZWZlcmVuY2UgTWFudWFsICAgICAgICAgICAgICAgICAgICAgU0NQKDEpCi0KLU5BTUUKLSAgICAgc2NwIC0gc2VjdXJlIGNvcHkgKHJlbW90ZSBmaWxlIGNvcHkgcHJvZ3JhbSkKLQotU1lOT1BTSVMKLSAgICAgc2NwIFstMTIzNDZCQ3BxcnZdIFstYyBjaXBoZXJdIFstRiBzc2hfY29uZmlnXSBbLWkgaWRlbnRpdHlfZmlsZV0KLSAgICAgICAgIFstbCBsaW1pdF0gWy1vIHNzaF9vcHRpb25dIFstUCBwb3J0XSBbLVMgcHJvZ3JhbV0KLSAgICAgICAgIFtbdXNlckBdaG9zdDE6XWZpbGUxIC4uLiBbW3VzZXJAXWhvc3QyOl1maWxlMgotCi1ERVNDUklQVElPTgotICAgICBzY3AgY29waWVzIGZpbGVzIGJldHdlZW4gaG9zdHMgb24gYSBuZXR3b3JrLiAgSXQgdXNlcyBzc2goMSkgZm9yIGRhdGEKLSAgICAgdHJhbnNmZXIsIGFuZCB1c2VzIHRoZSBzYW1lIGF1dGhlbnRpY2F0aW9uIGFuZCBwcm92aWRlcyB0aGUgc2FtZSBzZWN1cml0eQotICAgICBhcyBzc2goMSkuICBVbmxpa2UgcmNwKDEpLCBzY3Agd2lsbCBhc2sgZm9yIHBhc3N3b3JkcyBvciBwYXNzcGhyYXNlcyBpZgotICAgICB0aGV5IGFyZSBuZWVkZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgotCi0gICAgIEZpbGUgbmFtZXMgbWF5IGNvbnRhaW4gYSB1c2VyIGFuZCBob3N0IHNwZWNpZmljYXRpb24gdG8gaW5kaWNhdGUgdGhhdCB0aGUKLSAgICAgZmlsZSBpcyB0byBiZSBjb3BpZWQgdG8vZnJvbSB0aGF0IGhvc3QuICBMb2NhbCBmaWxlIG5hbWVzIGNhbiBiZSBtYWRlCi0gICAgIGV4cGxpY2l0IHVzaW5nIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhuYW1lcyB0byBhdm9pZCBzY3AgdHJlYXRpbmcgZmlsZQotICAgICBuYW1lcyBjb250YWluaW5nIGA6JyBhcyBob3N0IHNwZWNpZmllcnMuICBDb3BpZXMgYmV0d2VlbiB0d28gcmVtb3RlIGhvc3RzCi0gICAgIGFyZSBhbHNvIHBlcm1pdHRlZC4KLQotICAgICBUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czoKLQotICAgICAtMSAgICAgIEZvcmNlcyBzY3AgdG8gdXNlIHByb3RvY29sIDEuCi0KLSAgICAgLTIgICAgICBGb3JjZXMgc2NwIHRvIHVzZSBwcm90b2NvbCAyLgotCi0gICAgIC0zICAgICAgQ29waWVzIGJldHdlZW4gdHdvIHJlbW90ZSBob3N0cyBhcmUgdHJhbnNmZXJyZWQgdGhyb3VnaCB0aGUgbG9jYWwKLSAgICAgICAgICAgICBob3N0LiAgV2l0aG91dCB0aGlzIG9wdGlvbiB0aGUgZGF0YSBpcyBjb3BpZWQgZGlyZWN0bHkgYmV0d2VlbgotICAgICAgICAgICAgIHRoZSB0d28gcmVtb3RlIGhvc3RzLiAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGRpc2FibGVzIHRoZQotICAgICAgICAgICAgIHByb2dyZXNzIG1ldGVyLgotCi0gICAgIC00ICAgICAgRm9yY2VzIHNjcCB0byB1c2UgSVB2NCBhZGRyZXNzZXMgb25seS4KLQotICAgICAtNiAgICAgIEZvcmNlcyBzY3AgdG8gdXNlIElQdjYgYWRkcmVzc2VzIG9ubHkuCi0KLSAgICAgLUIgICAgICBTZWxlY3RzIGJhdGNoIG1vZGUgKHByZXZlbnRzIGFza2luZyBmb3IgcGFzc3dvcmRzIG9yCi0gICAgICAgICAgICAgcGFzc3BocmFzZXMpLgotCi0gICAgIC1DICAgICAgQ29tcHJlc3Npb24gZW5hYmxlLiAgUGFzc2VzIHRoZSAtQyBmbGFnIHRvIHNzaCgxKSB0byBlbmFibGUKLSAgICAgICAgICAgICBjb21wcmVzc2lvbi4KLQotICAgICAtYyBjaXBoZXIKLSAgICAgICAgICAgICBTZWxlY3RzIHRoZSBjaXBoZXIgdG8gdXNlIGZvciBlbmNyeXB0aW5nIHRoZSBkYXRhIHRyYW5zZmVyLiAgVGhpcwotICAgICAgICAgICAgIG9wdGlvbiBpcyBkaXJlY3RseSBwYXNzZWQgdG8gc3NoKDEpLgotCi0gICAgIC1GIHNzaF9jb25maWcKLSAgICAgICAgICAgICBTcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlIGZvciBzc2guCi0gICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgZGlyZWN0bHkgcGFzc2VkIHRvIHNzaCgxKS4KLQotICAgICAtaSBpZGVudGl0eV9maWxlCi0gICAgICAgICAgICAgU2VsZWN0cyB0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZSBpZGVudGl0eSAocHJpdmF0ZSBrZXkpIGZvciBwdWJsaWMKLSAgICAgICAgICAgICBrZXkgYXV0aGVudGljYXRpb24gaXMgcmVhZC4gIFRoaXMgb3B0aW9uIGlzIGRpcmVjdGx5IHBhc3NlZCB0bwotICAgICAgICAgICAgIHNzaCgxKS4KLQotICAgICAtbCBsaW1pdAotICAgICAgICAgICAgIExpbWl0cyB0aGUgdXNlZCBiYW5kd2lkdGgsIHNwZWNpZmllZCBpbiBLYml0L3MuCi0KLSAgICAgLW8gc3NoX29wdGlvbgotICAgICAgICAgICAgIENhbiBiZSB1c2VkIHRvIHBhc3Mgb3B0aW9ucyB0byBzc2ggaW4gdGhlIGZvcm1hdCB1c2VkIGluCi0gICAgICAgICAgICAgc3NoX2NvbmZpZyg1KS4gIFRoaXMgaXMgdXNlZnVsIGZvciBzcGVjaWZ5aW5nIG9wdGlvbnMgZm9yIHdoaWNoCi0gICAgICAgICAgICAgdGhlcmUgaXMgbm8gc2VwYXJhdGUgc2NwIGNvbW1hbmQtbGluZSBmbGFnLiAgRm9yIGZ1bGwgZGV0YWlscyBvZgotICAgICAgICAgICAgIHRoZSBvcHRpb25zIGxpc3RlZCBiZWxvdywgYW5kIHRoZWlyIHBvc3NpYmxlIHZhbHVlcywgc2VlCi0gICAgICAgICAgICAgc3NoX2NvbmZpZyg1KS4KLQotICAgICAgICAgICAgICAgICAgIEFkZHJlc3NGYW1pbHkKLSAgICAgICAgICAgICAgICAgICBCYXRjaE1vZGUKLSAgICAgICAgICAgICAgICAgICBCaW5kQWRkcmVzcwotICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICAgICBDaGVja0hvc3RJUAotICAgICAgICAgICAgICAgICAgIENpcGhlcgotICAgICAgICAgICAgICAgICAgIENpcGhlcnMKLSAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbgotICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uTGV2ZWwKLSAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uQXR0ZW1wdHMKLSAgICAgICAgICAgICAgICAgICBDb25uZWN0VGltZW91dAotICAgICAgICAgICAgICAgICAgIENvbnRyb2xNYXN0ZXIKLSAgICAgICAgICAgICAgICAgICBDb250cm9sUGF0aAotICAgICAgICAgICAgICAgICAgIEdsb2JhbEtub3duSG9zdHNGaWxlCi0gICAgICAgICAgICAgICAgICAgR1NTQVBJQXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICAgICBHU1NBUElEZWxlZ2F0ZUNyZWRlbnRpYWxzCi0gICAgICAgICAgICAgICAgICAgSGFzaEtub3duSG9zdHMKLSAgICAgICAgICAgICAgICAgICBIb3N0Ci0gICAgICAgICAgICAgICAgICAgSG9zdGJhc2VkQXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICAgICBIb3N0S2V5QWxnb3JpdGhtcwotICAgICAgICAgICAgICAgICAgIEhvc3RLZXlBbGlhcwotICAgICAgICAgICAgICAgICAgIEhvc3ROYW1lCi0gICAgICAgICAgICAgICAgICAgSWRlbnRpdHlGaWxlCi0gICAgICAgICAgICAgICAgICAgSWRlbnRpdGllc09ubHkKLSAgICAgICAgICAgICAgICAgICBJUFFvUwotICAgICAgICAgICAgICAgICAgIEtiZEludGVyYWN0aXZlRGV2aWNlcwotICAgICAgICAgICAgICAgICAgIEtleEFsZ29yaXRobXMKLSAgICAgICAgICAgICAgICAgICBMb2dMZXZlbAotICAgICAgICAgICAgICAgICAgIE1BQ3MKLSAgICAgICAgICAgICAgICAgICBOb0hvc3RBdXRoZW50aWNhdGlvbkZvckxvY2FsaG9zdAotICAgICAgICAgICAgICAgICAgIE51bWJlck9mUGFzc3dvcmRQcm9tcHRzCi0gICAgICAgICAgICAgICAgICAgUGFzc3dvcmRBdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgICAgICAgIFBLQ1MxMVByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgUG9ydAotICAgICAgICAgICAgICAgICAgIFByZWZlcnJlZEF1dGhlbnRpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgIFByb3RvY29sCi0gICAgICAgICAgICAgICAgICAgUHJveHlDb21tYW5kCi0gICAgICAgICAgICAgICAgICAgUHVia2V5QXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICAgICBSZWtleUxpbWl0Ci0gICAgICAgICAgICAgICAgICAgUmhvc3RzUlNBQXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICAgICBSU0FBdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgICAgICAgIFNlbmRFbnYKLSAgICAgICAgICAgICAgICAgICBTZXJ2ZXJBbGl2ZUludGVydmFsCi0gICAgICAgICAgICAgICAgICAgU2VydmVyQWxpdmVDb3VudE1heAotICAgICAgICAgICAgICAgICAgIFN0cmljdEhvc3RLZXlDaGVja2luZwotICAgICAgICAgICAgICAgICAgIFRDUEtlZXBBbGl2ZQotICAgICAgICAgICAgICAgICAgIFVzZVByaXZpbGVnZWRQb3J0Ci0gICAgICAgICAgICAgICAgICAgVXNlcgotICAgICAgICAgICAgICAgICAgIFVzZXJLbm93bkhvc3RzRmlsZQotICAgICAgICAgICAgICAgICAgIFZlcmlmeUhvc3RLZXlETlMKLQotICAgICAtUCBwb3J0Ci0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwb3J0IHRvIGNvbm5lY3QgdG8gb24gdGhlIHJlbW90ZSBob3N0LiAgTm90ZSB0aGF0Ci0gICAgICAgICAgICAgdGhpcyBvcHRpb24gaXMgd3JpdHRlbiB3aXRoIGEgY2FwaXRhbCBgUCcsIGJlY2F1c2UgLXAgaXMgYWxyZWFkeQotICAgICAgICAgICAgIHJlc2VydmVkIGZvciBwcmVzZXJ2aW5nIHRoZSB0aW1lcyBhbmQgbW9kZXMgb2YgdGhlIGZpbGUgaW4KLSAgICAgICAgICAgICByY3AoMSkuCi0KLSAgICAgLXAgICAgICBQcmVzZXJ2ZXMgbW9kaWZpY2F0aW9uIHRpbWVzLCBhY2Nlc3MgdGltZXMsIGFuZCBtb2RlcyBmcm9tIHRoZQotICAgICAgICAgICAgIG9yaWdpbmFsIGZpbGUuCi0KLSAgICAgLXEgICAgICBRdWlldCBtb2RlOiBkaXNhYmxlcyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYXMgd2VsbCBhcyB3YXJuaW5nIGFuZAotICAgICAgICAgICAgIGRpYWdub3N0aWMgbWVzc2FnZXMgZnJvbSBzc2goMSkuCi0KLSAgICAgLXIgICAgICBSZWN1cnNpdmVseSBjb3B5IGVudGlyZSBkaXJlY3Rvcmllcy4gIE5vdGUgdGhhdCBzY3AgZm9sbG93cwotICAgICAgICAgICAgIHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIGluIHRoZSB0cmVlIHRyYXZlcnNhbC4KLQotICAgICAtUyBwcm9ncmFtCi0gICAgICAgICAgICAgTmFtZSBvZiBwcm9ncmFtIHRvIHVzZSBmb3IgdGhlIGVuY3J5cHRlZCBjb25uZWN0aW9uLiAgVGhlIHByb2dyYW0KLSAgICAgICAgICAgICBtdXN0IHVuZGVyc3RhbmQgc3NoKDEpIG9wdGlvbnMuCi0KLSAgICAgLXYgICAgICBWZXJib3NlIG1vZGUuICBDYXVzZXMgc2NwIGFuZCBzc2goMSkgdG8gcHJpbnQgZGVidWdnaW5nIG1lc3NhZ2VzCi0gICAgICAgICAgICAgYWJvdXQgdGhlaXIgcHJvZ3Jlc3MuICBUaGlzIGlzIGhlbHBmdWwgaW4gZGVidWdnaW5nIGNvbm5lY3Rpb24sCi0gICAgICAgICAgICAgYXV0aGVudGljYXRpb24sIGFuZCBjb25maWd1cmF0aW9uIHByb2JsZW1zLgotCi1FWElUIFNUQVRVUwotICAgICBUaGUgc2NwIHV0aWxpdHkgZXhpdHMgMCBvbiBzdWNjZXNzLCBhbmQgPjAgaWYgYW4gZXJyb3Igb2NjdXJzLgotCi1TRUUgQUxTTwotICAgICByY3AoMSksIHNmdHAoMSksIHNzaCgxKSwgc3NoLWFkZCgxKSwgc3NoLWFnZW50KDEpLCBzc2gta2V5Z2VuKDEpLAotICAgICBzc2hfY29uZmlnKDUpLCBzc2hkKDgpCi0KLUhJU1RPUlkKLSAgICAgc2NwIGlzIGJhc2VkIG9uIHRoZSByY3AoMSkgcHJvZ3JhbSBpbiBCU0Qgc291cmNlIGNvZGUgZnJvbSB0aGUgUmVnZW50cyBvZgotICAgICB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotCi1BVVRIT1JTCi0gICAgIFRpbW8gUmlubmUgPHRyaUBpa2kuZmk+Ci0gICAgIFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotCi1PcGVuQlNEIDUuMCAgICAgICAgICAgICAgICAgICAgRGVjZW1iZXIgOSwgMjAxMCAgICAgICAgICAgICAgICAgICAgT3BlbkJTRCA1LjAKZGlmZiAtLWdpdCBhL3NjcC4xIGIvc2NwLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3N2RkNTIuLjAwMDAwMDAKLS0tIGEvc2NwLjEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLlwiCi0uXCIgc2NwLjEKLS5cIgotLlwiIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0uXCIKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotLlwiICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0uXCIKLS5cIiBDcmVhdGVkOiBTdW4gTWF5ICA3IDAwOjE0OjM3IDE5OTUgeWxvCi0uXCIKLS5cIiAkT3BlbkJTRDogc2NwLjEsdiAxLjU2IDIwMTAvMTIvMDkgMTQ6MTM6MzIgam1jIEV4cCAkCi0uXCIKLS5EZCAkTWRvY2RhdGU6IERlY2VtYmVyIDkgMjAxMCAkCi0uRHQgU0NQIDEKLS5PcwotLlNoIE5BTUUKLS5ObSBzY3AKLS5OZCBzZWN1cmUgY29weSAocmVtb3RlIGZpbGUgY29weSBwcm9ncmFtKQotLlNoIFNZTk9QU0lTCi0uTm0gc2NwCi0uQmsgLXdvcmRzCi0uT3AgRmwgMTIzNDZCQ3BxcnYKLS5PcCBGbCBjIEFyIGNpcGhlcgotLk9wIEZsIEYgQXIgc3NoX2NvbmZpZwotLk9wIEZsIGkgQXIgaWRlbnRpdHlfZmlsZQotLk9wIEZsIGwgQXIgbGltaXQKLS5PcCBGbCBvIEFyIHNzaF9vcHRpb24KLS5PcCBGbCBQIEFyIHBvcnQKLS5PcCBGbCBTIEFyIHByb2dyYW0KLS5TbSBvZmYKLS5PbwotLk9wIEFyIHVzZXIgTm8gQAotLkFyIGhvc3QxIE5vIDoKLS5PYyBOcyBBciBmaWxlMQotLlNtIG9uCi0uQXIgLi4uCi0uU20gb2ZmCi0uT28KLS5PcCBBciB1c2VyIE5vIEAKLS5BciBob3N0MiBObyA6Ci0uT2MgQXIgZmlsZTIKLS5TbSBvbgotLkVrCi0uU2ggREVTQ1JJUFRJT04KLS5ObQotY29waWVzIGZpbGVzIGJldHdlZW4gaG9zdHMgb24gYSBuZXR3b3JrLgotSXQgdXNlcwotLlhyIHNzaCAxCi1mb3IgZGF0YSB0cmFuc2ZlciwgYW5kIHVzZXMgdGhlIHNhbWUgYXV0aGVudGljYXRpb24gYW5kIHByb3ZpZGVzIHRoZQotc2FtZSBzZWN1cml0eSBhcwotLlhyIHNzaCAxIC4KLVVubGlrZQotLlhyIHJjcCAxICwKLS5ObQotd2lsbCBhc2sgZm9yIHBhc3N3b3JkcyBvciBwYXNzcGhyYXNlcyBpZiB0aGV5IGFyZSBuZWVkZWQgZm9yCi1hdXRoZW50aWNhdGlvbi4KLS5QcAotRmlsZSBuYW1lcyBtYXkgY29udGFpbiBhIHVzZXIgYW5kIGhvc3Qgc3BlY2lmaWNhdGlvbiB0byBpbmRpY2F0ZQotdGhhdCB0aGUgZmlsZSBpcyB0byBiZSBjb3BpZWQgdG8vZnJvbSB0aGF0IGhvc3QuCi1Mb2NhbCBmaWxlIG5hbWVzIGNhbiBiZSBtYWRlIGV4cGxpY2l0IHVzaW5nIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhuYW1lcwotdG8gYXZvaWQKLS5ObQotdHJlYXRpbmcgZmlsZSBuYW1lcyBjb250YWluaW5nCi0uU3EgOlwmCi1hcyBob3N0IHNwZWNpZmllcnMuCi1Db3BpZXMgYmV0d2VlbiB0d28gcmVtb3RlIGhvc3RzIGFyZSBhbHNvIHBlcm1pdHRlZC4KLS5QcAotVGhlIG9wdGlvbnMgYXJlIGFzIGZvbGxvd3M6Ci0uQmwgLXRhZyAtd2lkdGggRHMKLS5JdCBGbCAxCi1Gb3JjZXMKLS5ObQotdG8gdXNlIHByb3RvY29sIDEuCi0uSXQgRmwgMgotRm9yY2VzCi0uTm0KLXRvIHVzZSBwcm90b2NvbCAyLgotLkl0IEZsIDMKLUNvcGllcyBiZXR3ZWVuIHR3byByZW1vdGUgaG9zdHMgYXJlIHRyYW5zZmVycmVkIHRocm91Z2ggdGhlIGxvY2FsIGhvc3QuCi1XaXRob3V0IHRoaXMgb3B0aW9uIHRoZSBkYXRhIGlzIGNvcGllZCBkaXJlY3RseSBiZXR3ZWVuIHRoZSB0d28gcmVtb3RlCi1ob3N0cy4KLU5vdGUgdGhhdCB0aGlzIG9wdGlvbiBkaXNhYmxlcyB0aGUgcHJvZ3Jlc3MgbWV0ZXIuCi0uSXQgRmwgNAotRm9yY2VzCi0uTm0KLXRvIHVzZSBJUHY0IGFkZHJlc3NlcyBvbmx5LgotLkl0IEZsIDYKLUZvcmNlcwotLk5tCi10byB1c2UgSVB2NiBhZGRyZXNzZXMgb25seS4KLS5JdCBGbCBCCi1TZWxlY3RzIGJhdGNoIG1vZGUgKHByZXZlbnRzIGFza2luZyBmb3IgcGFzc3dvcmRzIG9yIHBhc3NwaHJhc2VzKS4KLS5JdCBGbCBDCi1Db21wcmVzc2lvbiBlbmFibGUuCi1QYXNzZXMgdGhlCi0uRmwgQwotZmxhZyB0bwotLlhyIHNzaCAxCi10byBlbmFibGUgY29tcHJlc3Npb24uCi0uSXQgRmwgYyBBciBjaXBoZXIKLVNlbGVjdHMgdGhlIGNpcGhlciB0byB1c2UgZm9yIGVuY3J5cHRpbmcgdGhlIGRhdGEgdHJhbnNmZXIuCi1UaGlzIG9wdGlvbiBpcyBkaXJlY3RseSBwYXNzZWQgdG8KLS5YciBzc2ggMSAuCi0uSXQgRmwgRiBBciBzc2hfY29uZmlnCi1TcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUKLXBlci11c2VyIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IKLS5ObSBzc2ggLgotVGhpcyBvcHRpb24gaXMgZGlyZWN0bHkgcGFzc2VkIHRvCi0uWHIgc3NoIDEgLgotLkl0IEZsIGkgQXIgaWRlbnRpdHlfZmlsZQotU2VsZWN0cyB0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZSBpZGVudGl0eSAocHJpdmF0ZSBrZXkpIGZvciBwdWJsaWMga2V5Ci1hdXRoZW50aWNhdGlvbiBpcyByZWFkLgotVGhpcyBvcHRpb24gaXMgZGlyZWN0bHkgcGFzc2VkIHRvCi0uWHIgc3NoIDEgLgotLkl0IEZsIGwgQXIgbGltaXQKLUxpbWl0cyB0aGUgdXNlZCBiYW5kd2lkdGgsIHNwZWNpZmllZCBpbiBLYml0L3MuCi0uSXQgRmwgbyBBciBzc2hfb3B0aW9uCi1DYW4gYmUgdXNlZCB0byBwYXNzIG9wdGlvbnMgdG8KLS5ObSBzc2gKLWluIHRoZSBmb3JtYXQgdXNlZCBpbgotLlhyIHNzaF9jb25maWcgNSAuCi1UaGlzIGlzIHVzZWZ1bCBmb3Igc3BlY2lmeWluZyBvcHRpb25zCi1mb3Igd2hpY2ggdGhlcmUgaXMgbm8gc2VwYXJhdGUKLS5ObSBzY3AKLWNvbW1hbmQtbGluZSBmbGFnLgotRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgb3B0aW9ucyBsaXN0ZWQgYmVsb3csIGFuZCB0aGVpciBwb3NzaWJsZSB2YWx1ZXMsIHNlZQotLlhyIHNzaF9jb25maWcgNSAuCi0uUHAKLS5CbCAtdGFnIC13aWR0aCBEcyAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAotLkl0IEFkZHJlc3NGYW1pbHkKLS5JdCBCYXRjaE1vZGUKLS5JdCBCaW5kQWRkcmVzcwotLkl0IENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24KLS5JdCBDaGVja0hvc3RJUAotLkl0IENpcGhlcgotLkl0IENpcGhlcnMKLS5JdCBDb21wcmVzc2lvbgotLkl0IENvbXByZXNzaW9uTGV2ZWwKLS5JdCBDb25uZWN0aW9uQXR0ZW1wdHMKLS5JdCBDb25uZWN0VGltZW91dAotLkl0IENvbnRyb2xNYXN0ZXIKLS5JdCBDb250cm9sUGF0aAotLkl0IEdsb2JhbEtub3duSG9zdHNGaWxlCi0uSXQgR1NTQVBJQXV0aGVudGljYXRpb24KLS5JdCBHU1NBUElEZWxlZ2F0ZUNyZWRlbnRpYWxzCi0uSXQgSGFzaEtub3duSG9zdHMKLS5JdCBIb3N0Ci0uSXQgSG9zdGJhc2VkQXV0aGVudGljYXRpb24KLS5JdCBIb3N0S2V5QWxnb3JpdGhtcwotLkl0IEhvc3RLZXlBbGlhcwotLkl0IEhvc3ROYW1lCi0uSXQgSWRlbnRpdHlGaWxlCi0uSXQgSWRlbnRpdGllc09ubHkKLS5JdCBJUFFvUwotLkl0IEtiZEludGVyYWN0aXZlRGV2aWNlcwotLkl0IEtleEFsZ29yaXRobXMKLS5JdCBMb2dMZXZlbAotLkl0IE1BQ3MKLS5JdCBOb0hvc3RBdXRoZW50aWNhdGlvbkZvckxvY2FsaG9zdAotLkl0IE51bWJlck9mUGFzc3dvcmRQcm9tcHRzCi0uSXQgUGFzc3dvcmRBdXRoZW50aWNhdGlvbgotLkl0IFBLQ1MxMVByb3ZpZGVyCi0uSXQgUG9ydAotLkl0IFByZWZlcnJlZEF1dGhlbnRpY2F0aW9ucwotLkl0IFByb3RvY29sCi0uSXQgUHJveHlDb21tYW5kCi0uSXQgUHVia2V5QXV0aGVudGljYXRpb24KLS5JdCBSZWtleUxpbWl0Ci0uSXQgUmhvc3RzUlNBQXV0aGVudGljYXRpb24KLS5JdCBSU0FBdXRoZW50aWNhdGlvbgotLkl0IFNlbmRFbnYKLS5JdCBTZXJ2ZXJBbGl2ZUludGVydmFsCi0uSXQgU2VydmVyQWxpdmVDb3VudE1heAotLkl0IFN0cmljdEhvc3RLZXlDaGVja2luZwotLkl0IFRDUEtlZXBBbGl2ZQotLkl0IFVzZVByaXZpbGVnZWRQb3J0Ci0uSXQgVXNlcgotLkl0IFVzZXJLbm93bkhvc3RzRmlsZQotLkl0IFZlcmlmeUhvc3RLZXlETlMKLS5FbAotLkl0IEZsIFAgQXIgcG9ydAotU3BlY2lmaWVzIHRoZSBwb3J0IHRvIGNvbm5lY3QgdG8gb24gdGhlIHJlbW90ZSBob3N0LgotTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGlzIHdyaXR0ZW4gd2l0aCBhIGNhcGl0YWwKLS5TcSBQICwKLWJlY2F1c2UKLS5GbCBwCi1pcyBhbHJlYWR5IHJlc2VydmVkIGZvciBwcmVzZXJ2aW5nIHRoZSB0aW1lcyBhbmQgbW9kZXMgb2YgdGhlIGZpbGUgaW4KLS5YciByY3AgMSAuCi0uSXQgRmwgcAotUHJlc2VydmVzIG1vZGlmaWNhdGlvbiB0aW1lcywgYWNjZXNzIHRpbWVzLCBhbmQgbW9kZXMgZnJvbSB0aGUKLW9yaWdpbmFsIGZpbGUuCi0uSXQgRmwgcQotUXVpZXQgbW9kZTogZGlzYWJsZXMgdGhlIHByb2dyZXNzIG1ldGVyIGFzIHdlbGwgYXMgd2FybmluZyBhbmQgZGlhZ25vc3RpYwotbWVzc2FnZXMgZnJvbQotLlhyIHNzaCAxIC4KLS5JdCBGbCByCi1SZWN1cnNpdmVseSBjb3B5IGVudGlyZSBkaXJlY3Rvcmllcy4KLU5vdGUgdGhhdAotLk5tCi1mb2xsb3dzIHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIGluIHRoZSB0cmVlIHRyYXZlcnNhbC4KLS5JdCBGbCBTIEFyIHByb2dyYW0KLU5hbWUgb2YKLS5BciBwcm9ncmFtCi10byB1c2UgZm9yIHRoZSBlbmNyeXB0ZWQgY29ubmVjdGlvbi4KLVRoZSBwcm9ncmFtIG11c3QgdW5kZXJzdGFuZAotLlhyIHNzaCAxCi1vcHRpb25zLgotLkl0IEZsIHYKLVZlcmJvc2UgbW9kZS4KLUNhdXNlcwotLk5tCi1hbmQKLS5YciBzc2ggMQotdG8gcHJpbnQgZGVidWdnaW5nIG1lc3NhZ2VzIGFib3V0IHRoZWlyIHByb2dyZXNzLgotVGhpcyBpcyBoZWxwZnVsIGluCi1kZWJ1Z2dpbmcgY29ubmVjdGlvbiwgYXV0aGVudGljYXRpb24sIGFuZCBjb25maWd1cmF0aW9uIHByb2JsZW1zLgotLkVsCi0uU2ggRVhJVCBTVEFUVVMKLS5FeCAtc3RkIHNjcAotLlNoIFNFRSBBTFNPCi0uWHIgcmNwIDEgLAotLlhyIHNmdHAgMSAsCi0uWHIgc3NoIDEgLAotLlhyIHNzaC1hZGQgMSAsCi0uWHIgc3NoLWFnZW50IDEgLAotLlhyIHNzaC1rZXlnZW4gMSAsCi0uWHIgc3NoX2NvbmZpZyA1ICwKLS5YciBzc2hkIDgKLS5TaCBISVNUT1JZCi0uTm0KLWlzIGJhc2VkIG9uIHRoZQotLlhyIHJjcCAxCi1wcm9ncmFtIGluIEJTRCBzb3VyY2UgY29kZSBmcm9tIHRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mCi1DYWxpZm9ybmlhLgotLlNoIEFVVEhPUlMKLS5BbiBUaW1vIFJpbm5lIEFxIHRyaUBpa2kuZmkKLS5BbiBUYXR1IFlsb25lbiBBcSB5bG9AY3MuaHV0LmZpCmRpZmYgLS1naXQgYS9zY3AuYyBiL3NjcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRhOTdmLi4wMDAwMDAwCi0tLSBhL3NjcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMyOSArMCwwIEBACi0vKiAkT3BlbkJTRDogc2NwLmMsdiAxLjE3MCAyMDEwLzEyLzA5IDE0OjEzOjMzIGptYyBFeHAgJCAqLwotLyoKLSAqIHNjcCAtIHNlY3VyZSByZW1vdGUgY29weS4gIFRoaXMgaXMgYmFzaWNhbGx5IHBhdGNoZWQgQlNEIHJjcCB3aGljaAotICogdXNlcyBzc2ggdG8gZG8gdGhlIGRhdGEgdHJhbnNmZXIgKGluc3RlYWQgb2YgdXNpbmcgcmNtZCkuCi0gKgotICogTk9URTogVGhpcyB2ZXJzaW9uIHNob3VsZCBOT1QgYmUgc3VpZCByb290LiAgKFRoaXMgdXNlcyBzc2ggdG8KLSAqIGRvIHRoZSB0cmFuc2ZlciBhbmQgc3NoIGhhcyB0aGUgbmVjZXNzYXJ5IHByaXZpbGVnZXMuKQotICoKLSAqIDE5OTUgVGltbyBSaW5uZSA8dHJpQGlraS5maT4sIFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlbyBkZSBSYWFkdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgQWFyb24gQ2FtcGJlbGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKgotICogUGFydHMgZnJvbToKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTAsIDE5OTIsIDE5OTMsIDE5OTUKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfUE9MTF9ICi0jaW5jbHVkZSA8cG9sbC5oPgotI2Vsc2UKLSMgaWZkZWYgSEFWRV9TWVNfUE9MTF9ICi0jICBpbmNsdWRlIDxzeXMvcG9sbC5oPgotIyBlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2lmIGRlZmluZWQoSEFWRV9TVFJOVklTKSAmJiBkZWZpbmVkKEhBVkVfVklTX0gpCi0jaW5jbHVkZSA8dmlzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJhdG9taWNpby5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJwcm9ncmVzc21ldGVyLmgiCi0KLWV4dGVybiBjaGFyICpfX3Byb2duYW1lOwotCi0jZGVmaW5lIENPUFlfQlVGTEVOCTE2Mzg0Ci0KLWludCBkb19jbWQoY2hhciAqaG9zdCwgY2hhciAqcmVtdXNlciwgY2hhciAqY21kLCBpbnQgKmZkaW4sIGludCAqZmRvdXQpOwotaW50IGRvX2NtZDIoY2hhciAqaG9zdCwgY2hhciAqcmVtdXNlciwgY2hhciAqY21kLCBpbnQgZmRpbiwgaW50IGZkb3V0KTsKLQotLyogU3RydWN0IGZvciBhZGRhcmdzICovCi1hcmdsaXN0IGFyZ3M7Ci1hcmdsaXN0IHJlbW90ZV9yZW1vdGVfYXJnczsKLQotLyogQmFuZHdpZHRoIGxpbWl0ICovCi1sb25nIGxvbmcgbGltaXRfa2JwcyA9IDA7Ci1zdHJ1Y3QgYndsaW1pdCBid2xpbWl0OwotCi0vKiBOYW1lIG9mIGN1cnJlbnQgZmlsZSBiZWluZyB0cmFuc2ZlcnJlZC4gKi8KLWNoYXIgKmN1cmZpbGU7Ci0KLS8qIFRoaXMgaXMgc2V0IHRvIG5vbi16ZXJvIHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUuICovCi1pbnQgdmVyYm9zZV9tb2RlID0gMDsKLQotLyogVGhpcyBpcyBzZXQgdG8gemVybyBpZiB0aGUgcHJvZ3Jlc3NtZXRlciBpcyBub3QgZGVzaXJlZC4gKi8KLWludCBzaG93cHJvZ3Jlc3MgPSAxOwotCi0vKgotICogVGhpcyBpcyBzZXQgdG8gbm9uLXplcm8gaWYgcmVtb3RlLXJlbW90ZSBjb3B5IHNob3VsZCBiZSBwaXBlZAotICogdGhyb3VnaCB0aGlzIHByb2Nlc3MuCi0gKi8KLWludCB0aHJvdWdobG9jYWwgPSAwOwotCi0vKiBUaGlzIGlzIHRoZSBwcm9ncmFtIHRvIGV4ZWN1dGUgZm9yIHRoZSBzZWN1cmVkIGNvbm5lY3Rpb24uICgic3NoIiBvciAtUykgKi8KLWNoYXIgKnNzaF9wcm9ncmFtID0gX1BBVEhfU1NIX1BST0dSQU07Ci0KLS8qIFRoaXMgaXMgdXNlZCB0byBzdG9yZSB0aGUgcGlkIG9mIHNzaF9wcm9ncmFtICovCi1waWRfdCBkb19jbWRfcGlkID0gLTE7Ci0KLXN0YXRpYyB2b2lkCi1raWxsY2hpbGQoaW50IHNpZ25vKQotewotCWlmIChkb19jbWRfcGlkID4gMSkgewotCQlraWxsKGRvX2NtZF9waWQsIHNpZ25vID8gc2lnbm8gOiBTSUdURVJNKTsKLQkJd2FpdHBpZChkb19jbWRfcGlkLCBOVUxMLCAwKTsKLQl9Ci0KLQlpZiAoc2lnbm8pCi0JCV9leGl0KDEpOwotCWV4aXQoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdXNwY2hpbGQoaW50IHNpZ25vKQotewotCWludCBzdGF0dXM7Ci0KLQlpZiAoZG9fY21kX3BpZCA+IDEpIHsKLQkJa2lsbChkb19jbWRfcGlkLCBzaWdubyk7Ci0JCXdoaWxlICh3YWl0cGlkKGRvX2NtZF9waWQsICZzdGF0dXMsIFdVTlRSQUNFRCkgPT0gLTEgJiYKLQkJICAgIGVycm5vID09IEVJTlRSKQotCQkJOwotCQlraWxsKGdldHBpZCgpLCBTSUdTVE9QKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLWRvX2xvY2FsX2NtZChhcmdsaXN0ICphKQotewotCXVfaW50IGk7Ci0JaW50IHN0YXR1czsKLQlwaWRfdCBwaWQ7Ci0KLQlpZiAoYS0+bnVtID09IDApCi0JCWZhdGFsKCJkb19sb2NhbF9jbWQ6IG5vIGFyZ3VtZW50cyIpOwotCi0JaWYgKHZlcmJvc2VfbW9kZSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIkV4ZWN1dGluZzoiKTsKLQkJZm9yIChpID0gMDsgaSA8IGEtPm51bTsgaSsrKQotCQkJZnByaW50ZihzdGRlcnIsICIgJXMiLCBhLT5saXN0W2ldKTsKLQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCX0KLQlpZiAoKHBpZCA9IGZvcmsoKSkgPT0gLTEpCi0JCWZhdGFsKCJkb19sb2NhbF9jbWQ6IGZvcms6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQotCWlmIChwaWQgPT0gMCkgewotCQlleGVjdnAoYS0+bGlzdFswXSwgYS0+bGlzdCk7Ci0JCXBlcnJvcihhLT5saXN0WzBdKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlkb19jbWRfcGlkID0gcGlkOwotCXNpZ25hbChTSUdURVJNLCBraWxsY2hpbGQpOwotCXNpZ25hbChTSUdJTlQsIGtpbGxjaGlsZCk7Ci0Jc2lnbmFsKFNJR0hVUCwga2lsbGNoaWxkKTsKLQotCXdoaWxlICh3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgPT0gLTEpCi0JCWlmIChlcnJubyAhPSBFSU5UUikKLQkJCWZhdGFsKCJkb19sb2NhbF9jbWQ6IHdhaXRwaWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQotCWRvX2NtZF9waWQgPSAtMTsKLQotCWlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSAwKQotCQlyZXR1cm4gKC0xKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBnaXZlbiBjb21tYW5kIGFzIHRoZSBzcGVjaWZpZWQgdXNlciBvbiB0aGUKLSAqIGdpdmVuIGhvc3QuICBUaGlzIHJldHVybnMgPCAwIGlmIGV4ZWN1dGlvbiBmYWlscywgYW5kID49IDAgb3RoZXJ3aXNlLiBUaGlzCi0gKiBhc3NpZ25zIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgZGVzY3JpcHRvcnMgb24gc3VjY2Vzcy4KLSAqLwotCi1pbnQKLWRvX2NtZChjaGFyICpob3N0LCBjaGFyICpyZW11c2VyLCBjaGFyICpjbWQsIGludCAqZmRpbiwgaW50ICpmZG91dCkKLXsKLQlpbnQgcGluWzJdLCBwb3V0WzJdLCByZXNlcnZlZFsyXTsKLQotCWlmICh2ZXJib3NlX21vZGUpCi0JCWZwcmludGYoc3RkZXJyLAotCQkgICAgIkV4ZWN1dGluZzogcHJvZ3JhbSAlcyBob3N0ICVzLCB1c2VyICVzLCBjb21tYW5kICVzXG4iLAotCQkgICAgc3NoX3Byb2dyYW0sIGhvc3QsCi0JCSAgICByZW11c2VyID8gcmVtdXNlciA6ICIodW5zcGVjaWZpZWQpIiwgY21kKTsKLQotCS8qCi0JICogUmVzZXJ2ZSB0d28gZGVzY3JpcHRvcnMgc28gdGhhdCB0aGUgcmVhbCBwaXBlcyB3b24ndCBnZXQKLQkgKiBkZXNjcmlwdG9ycyAwIGFuZCAxIGJlY2F1c2UgdGhhdCB3aWxsIHNjcmV3IHVwIGR1cDIgYmVsb3cuCi0JICovCi0JaWYgKHBpcGUocmVzZXJ2ZWQpIDwgMCkKLQkJZmF0YWwoInBpcGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQotCS8qIENyZWF0ZSBhIHNvY2tldCBwYWlyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggc3NoLiAqLwotCWlmIChwaXBlKHBpbikgPCAwKQotCQlmYXRhbCgicGlwZTogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCWlmIChwaXBlKHBvdXQpIDwgMCkKLQkJZmF0YWwoInBpcGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQotCS8qIEZyZWUgdGhlIHJlc2VydmVkIGRlc2NyaXB0b3JzLiAqLwotCWNsb3NlKHJlc2VydmVkWzBdKTsKLQljbG9zZShyZXNlcnZlZFsxXSk7Ci0KLQlzaWduYWwoU0lHVFNUUCwgc3VzcGNoaWxkKTsKLQlzaWduYWwoU0lHVFRJTiwgc3VzcGNoaWxkKTsKLQlzaWduYWwoU0lHVFRPVSwgc3VzcGNoaWxkKTsKLQotCS8qIEZvcmsgYSBjaGlsZCB0byBleGVjdXRlIHRoZSBjb21tYW5kIG9uIHRoZSByZW1vdGUgaG9zdCB1c2luZyBzc2guICovCi0JZG9fY21kX3BpZCA9IGZvcmsoKTsKLQlpZiAoZG9fY21kX3BpZCA9PSAwKSB7Ci0JCS8qIENoaWxkLiAqLwotCQljbG9zZShwaW5bMV0pOwotCQljbG9zZShwb3V0WzBdKTsKLQkJZHVwMihwaW5bMF0sIDApOwotCQlkdXAyKHBvdXRbMV0sIDEpOwotCQljbG9zZShwaW5bMF0pOwotCQljbG9zZShwb3V0WzFdKTsKLQotCQlyZXBsYWNlYXJnKCZhcmdzLCAwLCAiJXMiLCBzc2hfcHJvZ3JhbSk7Ci0JCWlmIChyZW11c2VyICE9IE5VTEwpIHsKLQkJCWFkZGFyZ3MoJmFyZ3MsICItbCIpOwotCQkJYWRkYXJncygmYXJncywgIiVzIiwgcmVtdXNlcik7Ci0JCX0KLQkJYWRkYXJncygmYXJncywgIi0tIik7Ci0JCWFkZGFyZ3MoJmFyZ3MsICIlcyIsIGhvc3QpOwotCQlhZGRhcmdzKCZhcmdzLCAiJXMiLCBjbWQpOwotCi0JCWV4ZWN2cChzc2hfcHJvZ3JhbSwgYXJncy5saXN0KTsKLQkJcGVycm9yKHNzaF9wcm9ncmFtKTsKLQkJZXhpdCgxKTsKLQl9IGVsc2UgaWYgKGRvX2NtZF9waWQgPT0gLTEpIHsKLQkJZmF0YWwoImZvcms6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci0JLyogUGFyZW50LiAgQ2xvc2UgdGhlIG90aGVyIHNpZGUsIGFuZCByZXR1cm4gdGhlIGxvY2FsIHNpZGUuICovCi0JY2xvc2UocGluWzBdKTsKLQkqZmRvdXQgPSBwaW5bMV07Ci0JY2xvc2UocG91dFsxXSk7Ci0JKmZkaW4gPSBwb3V0WzBdOwotCXNpZ25hbChTSUdURVJNLCBraWxsY2hpbGQpOwotCXNpZ25hbChTSUdJTlQsIGtpbGxjaGlsZCk7Ci0Jc2lnbmFsKFNJR0hVUCwga2lsbGNoaWxkKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb25zIGV4ZWN1dGVzIGEgY29tbWFuZCBzaW1sYXIgdG8gZG9fY21kKCksIGJ1dCBleHBlY3RzIHRoZQotICogaW5wdXQgYW5kIG91dHB1dCBkZXNjcmlwdG9ycyB0byBiZSBzZXR1cCBieSBhIHByZXZpb3VzIGNhbGwgdG8gZG9fY21kKCkuCi0gKiBUaGlzIHdheSB0aGUgaW5wdXQgYW5kIG91dHB1dCBvZiB0d28gY29tbWFuZHMgY2FuIGJlIGNvbm5lY3RlZC4KLSAqLwotaW50Ci1kb19jbWQyKGNoYXIgKmhvc3QsIGNoYXIgKnJlbXVzZXIsIGNoYXIgKmNtZCwgaW50IGZkaW4sIGludCBmZG91dCkKLXsKLQlwaWRfdCBwaWQ7Ci0JaW50IHN0YXR1czsKLQotCWlmICh2ZXJib3NlX21vZGUpCi0JCWZwcmludGYoc3RkZXJyLAotCQkgICAgIkV4ZWN1dGluZzogMm5kIHByb2dyYW0gJXMgaG9zdCAlcywgdXNlciAlcywgY29tbWFuZCAlc1xuIiwKLQkJICAgIHNzaF9wcm9ncmFtLCBob3N0LAotCQkgICAgcmVtdXNlciA/IHJlbXVzZXIgOiAiKHVuc3BlY2lmaWVkKSIsIGNtZCk7Ci0KLQkvKiBGb3JrIGEgY2hpbGQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBvbiB0aGUgcmVtb3RlIGhvc3QgdXNpbmcgc3NoLiAqLwotCXBpZCA9IGZvcmsoKTsKLQlpZiAocGlkID09IDApIHsKLQkJZHVwMihmZGluLCAwKTsKLQkJZHVwMihmZG91dCwgMSk7Ci0KLQkJcmVwbGFjZWFyZygmYXJncywgMCwgIiVzIiwgc3NoX3Byb2dyYW0pOwotCQlpZiAocmVtdXNlciAhPSBOVUxMKSB7Ci0JCQlhZGRhcmdzKCZhcmdzLCAiLWwiKTsKLQkJCWFkZGFyZ3MoJmFyZ3MsICIlcyIsIHJlbXVzZXIpOwotCQl9Ci0JCWFkZGFyZ3MoJmFyZ3MsICItLSIpOwotCQlhZGRhcmdzKCZhcmdzLCAiJXMiLCBob3N0KTsKLQkJYWRkYXJncygmYXJncywgIiVzIiwgY21kKTsKLQotCQlleGVjdnAoc3NoX3Byb2dyYW0sIGFyZ3MubGlzdCk7Ci0JCXBlcnJvcihzc2hfcHJvZ3JhbSk7Ci0JCWV4aXQoMSk7Ci0JfSBlbHNlIGlmIChwaWQgPT0gLTEpIHsKLQkJZmF0YWwoImZvcms6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci0Jd2hpbGUgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA9PSAtMSkKLQkJaWYgKGVycm5vICE9IEVJTlRSKQotCQkJZmF0YWwoImRvX2NtZDI6IHdhaXRwaWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQlyZXR1cm4gMDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXNpemVfdCBjbnQ7Ci0JY2hhciAqYnVmOwotfSBCVUY7Ci0KLUJVRiAqYWxsb2NidWYoQlVGICosIGludCwgaW50KTsKLXZvaWQgbG9zdGNvbm4oaW50KTsKLWludCBva25hbWUoY2hhciAqKTsKLXZvaWQgcnVuX2Vycihjb25zdCBjaGFyICosLi4uKTsKLXZvaWQgdmVyaWZ5ZGlyKGNoYXIgKik7Ci0KLXN0cnVjdCBwYXNzd2QgKnB3ZDsKLXVpZF90IHVzZXJpZDsKLWludCBlcnJzLCByZW1pbiwgcmVtb3V0OwotaW50IHBmbGFnLCBpYW1yZW1vdGUsIGlhbXJlY3Vyc2l2ZSwgdGFyZ2V0c2hvdWxkYmVkaXJlY3Rvcnk7Ci0KLSNkZWZpbmUJQ01ETkVFRFMJNjQKLWNoYXIgY21kW0NNRE5FRURTXTsJCS8qIG11c3QgaG9sZCAicmNwIC1yIC1wIC1kXDAiICovCi0KLWludCByZXNwb25zZSh2b2lkKTsKLXZvaWQgcnNvdXJjZShjaGFyICosIHN0cnVjdCBzdGF0ICopOwotdm9pZCBzaW5rKGludCwgY2hhciAqW10pOwotdm9pZCBzb3VyY2UoaW50LCBjaGFyICpbXSk7Ci12b2lkIHRvbG9jYWwoaW50LCBjaGFyICpbXSk7Ci12b2lkIHRvcmVtb3RlKGNoYXIgKiwgaW50LCBjaGFyICpbXSk7Ci12b2lkIHVzYWdlKHZvaWQpOwotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCWludCBjaCwgZmZsYWcsIHRmbGFnLCBzdGF0dXMsIG47Ci0JY2hhciAqdGFyZywgKipuZXdhcmd2OwotCWNvbnN0IGNoYXIgKmVycnN0cjsKLQlleHRlcm4gY2hhciAqb3B0YXJnOwotCWV4dGVybiBpbnQgb3B0aW5kOwotCi0JLyogRW5zdXJlIHRoYXQgZmRzIDAsIDEgYW5kIDIgYXJlIG9wZW4gb3IgZGlyZWN0ZWQgdG8gL2Rldi9udWxsICovCi0Jc2FuaXRpc2Vfc3RkZmQoKTsKLQotCS8qIENvcHkgYXJndiwgYmVjYXVzZSB3ZSBtb2RpZnkgaXQgKi8KLQluZXdhcmd2ID0geGNhbGxvYyhNQVgoYXJnYyArIDEsIDEpLCBzaXplb2YoKm5ld2FyZ3YpKTsKLQlmb3IgKG4gPSAwOyBuIDwgYXJnYzsgbisrKQotCQluZXdhcmd2W25dID0geHN0cmR1cChhcmd2W25dKTsKLQlhcmd2ID0gbmV3YXJndjsKLQotCV9fcHJvZ25hbWUgPSBzc2hfZ2V0X3Byb2duYW1lKGFyZ3ZbMF0pOwotCi0JbWVtc2V0KCZhcmdzLCAnXDAnLCBzaXplb2YoYXJncykpOwotCW1lbXNldCgmcmVtb3RlX3JlbW90ZV9hcmdzLCAnXDAnLCBzaXplb2YocmVtb3RlX3JlbW90ZV9hcmdzKSk7Ci0JYXJncy5saXN0ID0gcmVtb3RlX3JlbW90ZV9hcmdzLmxpc3QgPSBOVUxMOwotCWFkZGFyZ3MoJmFyZ3MsICIlcyIsIHNzaF9wcm9ncmFtKTsKLQlhZGRhcmdzKCZhcmdzLCAiLXgiKTsKLQlhZGRhcmdzKCZhcmdzLCAiLW9Gb3J3YXJkQWdlbnQ9bm8iKTsKLQlhZGRhcmdzKCZhcmdzLCAiLW9QZXJtaXRMb2NhbENvbW1hbmQ9bm8iKTsKLQlhZGRhcmdzKCZhcmdzLCAiLW9DbGVhckFsbEZvcndhcmRpbmdzPXllcyIpOwotCi0JZmZsYWcgPSB0ZmxhZyA9IDA7Ci0Jd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZGZsOnBydHZCQ2M6aTpQOnExMjM0NlM6bzpGOiIpKSAhPSAtMSkKLQkJc3dpdGNoIChjaCkgewotCQkvKiBVc2VyLXZpc2libGUgZmxhZ3MuICovCi0JCWNhc2UgJzEnOgotCQljYXNlICcyJzoKLQkJY2FzZSAnNCc6Ci0JCWNhc2UgJzYnOgotCQljYXNlICdDJzoKLQkJCWFkZGFyZ3MoJmFyZ3MsICItJWMiLCBjaCk7Ci0JCQlhZGRhcmdzKCZyZW1vdGVfcmVtb3RlX2FyZ3MsICItJWMiLCBjaCk7Ci0JCQlicmVhazsKLQkJY2FzZSAnMyc6Ci0JCQl0aHJvdWdobG9jYWwgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ28nOgotCQljYXNlICdjJzoKLQkJY2FzZSAnaSc6Ci0JCWNhc2UgJ0YnOgotCQkJYWRkYXJncygmcmVtb3RlX3JlbW90ZV9hcmdzLCAiLSVjIiwgY2gpOwotCQkJYWRkYXJncygmcmVtb3RlX3JlbW90ZV9hcmdzLCAiJXMiLCBvcHRhcmcpOwotCQkJYWRkYXJncygmYXJncywgIi0lYyIsIGNoKTsKLQkJCWFkZGFyZ3MoJmFyZ3MsICIlcyIsIG9wdGFyZyk7Ci0JCQlicmVhazsKLQkJY2FzZSAnUCc6Ci0JCQlhZGRhcmdzKCZyZW1vdGVfcmVtb3RlX2FyZ3MsICItcCIpOwotCQkJYWRkYXJncygmcmVtb3RlX3JlbW90ZV9hcmdzLCAiJXMiLCBvcHRhcmcpOwotCQkJYWRkYXJncygmYXJncywgIi1wIik7Ci0JCQlhZGRhcmdzKCZhcmdzLCAiJXMiLCBvcHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ0InOgotCQkJYWRkYXJncygmcmVtb3RlX3JlbW90ZV9hcmdzLCAiLW9CYXRjaG1vZGU9eWVzIik7Ci0JCQlhZGRhcmdzKCZhcmdzLCAiLW9CYXRjaG1vZGU9eWVzIik7Ci0JCQlicmVhazsKLQkJY2FzZSAnbCc6Ci0JCQlsaW1pdF9rYnBzID0gc3RydG9udW0ob3B0YXJnLCAxLCAxMDAgKiAxMDI0ICogMTAyNCwKLQkJCSAgICAmZXJyc3RyKTsKLQkJCWlmIChlcnJzdHIgIT0gTlVMTCkKLQkJCQl1c2FnZSgpOwotCQkJbGltaXRfa2JwcyAqPSAxMDI0OyAvKiBrYnBzICovCi0JCQliYW5kd2lkdGhfbGltaXRfaW5pdCgmYndsaW1pdCwgbGltaXRfa2JwcywgQ09QWV9CVUZMRU4pOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3AnOgotCQkJcGZsYWcgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3InOgotCQkJaWFtcmVjdXJzaXZlID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdTJzoKLQkJCXNzaF9wcm9ncmFtID0geHN0cmR1cChvcHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3YnOgotCQkJYWRkYXJncygmYXJncywgIi12Iik7Ci0JCQlhZGRhcmdzKCZyZW1vdGVfcmVtb3RlX2FyZ3MsICItdiIpOwotCQkJdmVyYm9zZV9tb2RlID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdxJzoKLQkJCWFkZGFyZ3MoJmFyZ3MsICItcSIpOwotCQkJYWRkYXJncygmcmVtb3RlX3JlbW90ZV9hcmdzLCAiLXEiKTsKLQkJCXNob3dwcm9ncmVzcyA9IDA7Ci0JCQlicmVhazsKLQotCQkvKiBTZXJ2ZXIgb3B0aW9ucy4gKi8KLQkJY2FzZSAnZCc6Ci0JCQl0YXJnZXRzaG91bGRiZWRpcmVjdG9yeSA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnZic6CS8qICJmcm9tIiAqLwotCQkJaWFtcmVtb3RlID0gMTsKLQkJCWZmbGFnID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICd0JzoJLyogInRvIiAqLwotCQkJaWFtcmVtb3RlID0gMTsKLQkJCXRmbGFnID0gMTsKLSNpZmRlZiBIQVZFX0NZR1dJTgotCQkJc2V0bW9kZSgwLCBPX0JJTkFSWSk7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdXNhZ2UoKTsKLQkJfQotCWFyZ2MgLT0gb3B0aW5kOwotCWFyZ3YgKz0gb3B0aW5kOwotCi0JaWYgKChwd2QgPSBnZXRwd3VpZCh1c2VyaWQgPSBnZXR1aWQoKSkpID09IE5VTEwpCi0JCWZhdGFsKCJ1bmtub3duIHVzZXIgJXUiLCAodV9pbnQpIHVzZXJpZCk7Ci0KLQlpZiAoIWlzYXR0eShTVERPVVRfRklMRU5PKSkKLQkJc2hvd3Byb2dyZXNzID0gMDsKLQotCXJlbWluID0gU1RESU5fRklMRU5POwotCXJlbW91dCA9IFNURE9VVF9GSUxFTk87Ci0KLQlpZiAoZmZsYWcpIHsKLQkJLyogRm9sbG93ICJwcm90b2NvbCIsIHNlbmQgZGF0YS4gKi8KLQkJKHZvaWQpIHJlc3BvbnNlKCk7Ci0JCXNvdXJjZShhcmdjLCBhcmd2KTsKLQkJZXhpdChlcnJzICE9IDApOwotCX0KLQlpZiAodGZsYWcpIHsKLQkJLyogUmVjZWl2ZSBkYXRhLiAqLwotCQlzaW5rKGFyZ2MsIGFyZ3YpOwotCQlleGl0KGVycnMgIT0gMCk7Ci0JfQotCWlmIChhcmdjIDwgMikKLQkJdXNhZ2UoKTsKLQlpZiAoYXJnYyA+IDIpCi0JCXRhcmdldHNob3VsZGJlZGlyZWN0b3J5ID0gMTsKLQotCXJlbWluID0gcmVtb3V0ID0gLTE7Ci0JZG9fY21kX3BpZCA9IC0xOwotCS8qIENvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgb24gcmVtb3RlIHN5c3RlbSB1c2luZyAic3NoIi4gKi8KLQkodm9pZCkgc25wcmludGYoY21kLCBzaXplb2YgY21kLCAic2NwJXMlcyVzJXMiLAotCSAgICB2ZXJib3NlX21vZGUgPyAiIC12IiA6ICIiLAotCSAgICBpYW1yZWN1cnNpdmUgPyAiIC1yIiA6ICIiLCBwZmxhZyA/ICIgLXAiIDogIiIsCi0JICAgIHRhcmdldHNob3VsZGJlZGlyZWN0b3J5ID8gIiAtZCIgOiAiIik7Ci0KLQkodm9pZCkgc2lnbmFsKFNJR1BJUEUsIGxvc3Rjb25uKTsKLQotCWlmICgodGFyZyA9IGNvbG9uKGFyZ3ZbYXJnYyAtIDFdKSkpCS8qIERlc3QgaXMgcmVtb3RlIGhvc3QuICovCi0JCXRvcmVtb3RlKHRhcmcsIGFyZ2MsIGFyZ3YpOwotCWVsc2UgewotCQlpZiAodGFyZ2V0c2hvdWxkYmVkaXJlY3RvcnkpCi0JCQl2ZXJpZnlkaXIoYXJndlthcmdjIC0gMV0pOwotCQl0b2xvY2FsKGFyZ2MsIGFyZ3YpOwkvKiBEZXN0IGlzIGxvY2FsIGhvc3QuICovCi0JfQotCS8qCi0JICogRmluYWxseSBjaGVjayB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIHNzaCBwcm9jZXNzLCBpZiBvbmUgd2FzIGZvcmtlZAotCSAqIGFuZCBubyBlcnJvciBoYXMgb2NjdXJyZWQgeWV0Ci0JICovCi0JaWYgKGRvX2NtZF9waWQgIT0gLTEgJiYgZXJycyA9PSAwKSB7Ci0JCWlmIChyZW1pbiAhPSAtMSkKLQkJICAgICh2b2lkKSBjbG9zZShyZW1pbik7Ci0JCWlmIChyZW1vdXQgIT0gLTEpCi0JCSAgICAodm9pZCkgY2xvc2UocmVtb3V0KTsKLQkJaWYgKHdhaXRwaWQoZG9fY21kX3BpZCwgJnN0YXR1cywgMCkgPT0gLTEpCi0JCQllcnJzID0gMTsKLQkJZWxzZSB7Ci0JCQlpZiAoIVdJRkVYSVRFRChzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkKLQkJCQllcnJzID0gMTsKLQkJfQotCX0KLQlleGl0KGVycnMgIT0gMCk7Ci19Ci0KLS8qIENhbGxiYWNrIGZyb20gYXRvbWljaW82IHRvIHVwZGF0ZSBwcm9ncmVzcyBtZXRlciBhbmQgbGltaXQgYmFuZHdpZHRoICovCi1zdGF0aWMgaW50Ci1zY3Bpbyh2b2lkICpfY250LCBzaXplX3QgcykKLXsKLQlvZmZfdCAqY250ID0gKG9mZl90ICopX2NudDsKLQotCSpjbnQgKz0gczsKLQlpZiAobGltaXRfa2JwcyA+IDApCi0JCWJhbmR3aWR0aF9saW1pdCgmYndsaW1pdCwgcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLXRvcmVtb3RlKGNoYXIgKnRhcmcsIGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQljaGFyICpicCwgKmhvc3QsICpzcmMsICpzdXNlciwgKnRob3N0LCAqdHVzZXIsICphcmc7Ci0JYXJnbGlzdCBhbGlzdDsKLQlpbnQgaTsKLQl1X2ludCBqOwotCi0JbWVtc2V0KCZhbGlzdCwgJ1wwJywgc2l6ZW9mKGFsaXN0KSk7Ci0JYWxpc3QubGlzdCA9IE5VTEw7Ci0KLQkqdGFyZysrID0gMDsKLQlpZiAoKnRhcmcgPT0gMCkKLQkJdGFyZyA9ICIuIjsKLQotCWFyZyA9IHhzdHJkdXAoYXJndlthcmdjIC0gMV0pOwotCWlmICgodGhvc3QgPSBzdHJyY2hyKGFyZywgJ0AnKSkpIHsKLQkJLyogdXNlckBob3N0ICovCi0JCSp0aG9zdCsrID0gMDsKLQkJdHVzZXIgPSBhcmc7Ci0JCWlmICgqdHVzZXIgPT0gJ1wwJykKLQkJCXR1c2VyID0gTlVMTDsKLQl9IGVsc2UgewotCQl0aG9zdCA9IGFyZzsKLQkJdHVzZXIgPSBOVUxMOwotCX0KLQotCWlmICh0dXNlciAhPSBOVUxMICYmICFva25hbWUodHVzZXIpKSB7Ci0JCXhmcmVlKGFyZyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYXJnYyAtIDE7IGkrKykgewotCQlzcmMgPSBjb2xvbihhcmd2W2ldKTsKLQkJaWYgKHNyYyAmJiB0aHJvdWdobG9jYWwpIHsJLyogZXh0ZW5kZWQgcmVtb3RlIHRvIHJlbW90ZSAqLwotCQkJKnNyYysrID0gMDsKLQkJCWlmICgqc3JjID09IDApCi0JCQkJc3JjID0gIi4iOwotCQkJaG9zdCA9IHN0cnJjaHIoYXJndltpXSwgJ0AnKTsKLQkJCWlmIChob3N0KSB7Ci0JCQkJKmhvc3QrKyA9IDA7Ci0JCQkJaG9zdCA9IGNsZWFuaG9zdG5hbWUoaG9zdCk7Ci0JCQkJc3VzZXIgPSBhcmd2W2ldOwotCQkJCWlmICgqc3VzZXIgPT0gJ1wwJykKLQkJCQkJc3VzZXIgPSBwd2QtPnB3X25hbWU7Ci0JCQkJZWxzZSBpZiAoIW9rbmFtZShzdXNlcikpCi0JCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIHsKLQkJCQlob3N0ID0gY2xlYW5ob3N0bmFtZShhcmd2W2ldKTsKLQkJCQlzdXNlciA9IE5VTEw7Ci0JCQl9Ci0JCQl4YXNwcmludGYoJmJwLCAiJXMgLWYgLS0gJXMiLCBjbWQsIHNyYyk7Ci0JCQlpZiAoZG9fY21kKGhvc3QsIHN1c2VyLCBicCwgJnJlbWluLCAmcmVtb3V0KSA8IDApCi0JCQkJZXhpdCgxKTsKLQkJCSh2b2lkKSB4ZnJlZShicCk7Ci0JCQlob3N0ID0gY2xlYW5ob3N0bmFtZSh0aG9zdCk7Ci0JCQl4YXNwcmludGYoJmJwLCAiJXMgLXQgLS0gJXMiLCBjbWQsIHRhcmcpOwotCQkJaWYgKGRvX2NtZDIoaG9zdCwgdHVzZXIsIGJwLCByZW1pbiwgcmVtb3V0KSA8IDApCi0JCQkJZXhpdCgxKTsKLQkJCSh2b2lkKSB4ZnJlZShicCk7Ci0JCQkodm9pZCkgY2xvc2UocmVtaW4pOwotCQkJKHZvaWQpIGNsb3NlKHJlbW91dCk7Ci0JCQlyZW1pbiA9IHJlbW91dCA9IC0xOwotCQl9IGVsc2UgaWYgKHNyYykgewkvKiBzdGFuZGFyZCByZW1vdGUgdG8gcmVtb3RlICovCi0JCQlmcmVlYXJncygmYWxpc3QpOwotCQkJYWRkYXJncygmYWxpc3QsICIlcyIsIHNzaF9wcm9ncmFtKTsKLQkJCWFkZGFyZ3MoJmFsaXN0LCAiLXgiKTsKLQkJCWFkZGFyZ3MoJmFsaXN0LCAiLW9DbGVhckFsbEZvcndhcmRpbmdzPXllcyIpOwotCQkJYWRkYXJncygmYWxpc3QsICItbiIpOwotCQkJZm9yIChqID0gMDsgaiA8IHJlbW90ZV9yZW1vdGVfYXJncy5udW07IGorKykgewotCQkJCWFkZGFyZ3MoJmFsaXN0LCAiJXMiLAotCQkJCSAgICByZW1vdGVfcmVtb3RlX2FyZ3MubGlzdFtqXSk7Ci0JCQl9Ci0JCQkqc3JjKysgPSAwOwotCQkJaWYgKCpzcmMgPT0gMCkKLQkJCQlzcmMgPSAiLiI7Ci0JCQlob3N0ID0gc3RycmNocihhcmd2W2ldLCAnQCcpOwotCi0JCQlpZiAoaG9zdCkgewotCQkJCSpob3N0KysgPSAwOwotCQkJCWhvc3QgPSBjbGVhbmhvc3RuYW1lKGhvc3QpOwotCQkJCXN1c2VyID0gYXJndltpXTsKLQkJCQlpZiAoKnN1c2VyID09ICdcMCcpCi0JCQkJCXN1c2VyID0gcHdkLT5wd19uYW1lOwotCQkJCWVsc2UgaWYgKCFva25hbWUoc3VzZXIpKQotCQkJCQljb250aW51ZTsKLQkJCQlhZGRhcmdzKCZhbGlzdCwgIi1sIik7Ci0JCQkJYWRkYXJncygmYWxpc3QsICIlcyIsIHN1c2VyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaG9zdCA9IGNsZWFuaG9zdG5hbWUoYXJndltpXSk7Ci0JCQl9Ci0JCQlhZGRhcmdzKCZhbGlzdCwgIi0tIik7Ci0JCQlhZGRhcmdzKCZhbGlzdCwgIiVzIiwgaG9zdCk7Ci0JCQlhZGRhcmdzKCZhbGlzdCwgIiVzIiwgY21kKTsKLQkJCWFkZGFyZ3MoJmFsaXN0LCAiJXMiLCBzcmMpOwotCQkJYWRkYXJncygmYWxpc3QsICIlcyVzJXM6JXMiLAotCQkJICAgIHR1c2VyID8gdHVzZXIgOiAiIiwgdHVzZXIgPyAiQCIgOiAiIiwKLQkJCSAgICB0aG9zdCwgdGFyZyk7Ci0JCQlpZiAoZG9fbG9jYWxfY21kKCZhbGlzdCkgIT0gMCkKLQkJCQllcnJzID0gMTsKLQkJfSBlbHNlIHsJLyogbG9jYWwgdG8gcmVtb3RlICovCi0JCQlpZiAocmVtaW4gPT0gLTEpIHsKLQkJCQl4YXNwcmludGYoJmJwLCAiJXMgLXQgLS0gJXMiLCBjbWQsIHRhcmcpOwotCQkJCWhvc3QgPSBjbGVhbmhvc3RuYW1lKHRob3N0KTsKLQkJCQlpZiAoZG9fY21kKGhvc3QsIHR1c2VyLCBicCwgJnJlbWluLAotCQkJCSAgICAmcmVtb3V0KSA8IDApCi0JCQkJCWV4aXQoMSk7Ci0JCQkJaWYgKHJlc3BvbnNlKCkgPCAwKQotCQkJCQlleGl0KDEpOwotCQkJCSh2b2lkKSB4ZnJlZShicCk7Ci0JCQl9Ci0JCQlzb3VyY2UoMSwgYXJndiArIGkpOwotCQl9Ci0JfQotCXhmcmVlKGFyZyk7Ci19Ci0KLXZvaWQKLXRvbG9jYWwoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCWNoYXIgKmJwLCAqaG9zdCwgKnNyYywgKnN1c2VyOwotCWFyZ2xpc3QgYWxpc3Q7Ci0JaW50IGk7Ci0KLQltZW1zZXQoJmFsaXN0LCAnXDAnLCBzaXplb2YoYWxpc3QpKTsKLQlhbGlzdC5saXN0ID0gTlVMTDsKLQotCWZvciAoaSA9IDA7IGkgPCBhcmdjIC0gMTsgaSsrKSB7Ci0JCWlmICghKHNyYyA9IGNvbG9uKGFyZ3ZbaV0pKSkgewkvKiBMb2NhbCB0byBsb2NhbC4gKi8KLQkJCWZyZWVhcmdzKCZhbGlzdCk7Ci0JCQlhZGRhcmdzKCZhbGlzdCwgIiVzIiwgX1BBVEhfQ1ApOwotCQkJaWYgKGlhbXJlY3Vyc2l2ZSkKLQkJCQlhZGRhcmdzKCZhbGlzdCwgIi1yIik7Ci0JCQlpZiAocGZsYWcpCi0JCQkJYWRkYXJncygmYWxpc3QsICItcCIpOwotCQkJYWRkYXJncygmYWxpc3QsICItLSIpOwotCQkJYWRkYXJncygmYWxpc3QsICIlcyIsIGFyZ3ZbaV0pOwotCQkJYWRkYXJncygmYWxpc3QsICIlcyIsIGFyZ3ZbYXJnYy0xXSk7Ci0JCQlpZiAoZG9fbG9jYWxfY21kKCZhbGlzdCkpCi0JCQkJKytlcnJzOwotCQkJY29udGludWU7Ci0JCX0KLQkJKnNyYysrID0gMDsKLQkJaWYgKCpzcmMgPT0gMCkKLQkJCXNyYyA9ICIuIjsKLQkJaWYgKChob3N0ID0gc3RycmNocihhcmd2W2ldLCAnQCcpKSA9PSBOVUxMKSB7Ci0JCQlob3N0ID0gYXJndltpXTsKLQkJCXN1c2VyID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCSpob3N0KysgPSAwOwotCQkJc3VzZXIgPSBhcmd2W2ldOwotCQkJaWYgKCpzdXNlciA9PSAnXDAnKQotCQkJCXN1c2VyID0gcHdkLT5wd19uYW1lOwotCQl9Ci0JCWhvc3QgPSBjbGVhbmhvc3RuYW1lKGhvc3QpOwotCQl4YXNwcmludGYoJmJwLCAiJXMgLWYgLS0gJXMiLCBjbWQsIHNyYyk7Ci0JCWlmIChkb19jbWQoaG9zdCwgc3VzZXIsIGJwLCAmcmVtaW4sICZyZW1vdXQpIDwgMCkgewotCQkJKHZvaWQpIHhmcmVlKGJwKTsKLQkJCSsrZXJyczsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXhmcmVlKGJwKTsKLQkJc2luaygxLCBhcmd2ICsgYXJnYyAtIDEpOwotCQkodm9pZCkgY2xvc2UocmVtaW4pOwotCQlyZW1pbiA9IHJlbW91dCA9IC0xOwotCX0KLX0KLQotdm9pZAotc291cmNlKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQlzdHJ1Y3Qgc3RhdCBzdGI7Ci0Jc3RhdGljIEJVRiBidWZmZXI7Ci0JQlVGICpicDsKLQlvZmZfdCBpLCBzdGF0Ynl0ZXM7Ci0Jc2l6ZV90IGFtdDsKLQlpbnQgZmQgPSAtMSwgaGFkZXJyLCBpbmR4OwotCWNoYXIgKmxhc3QsICpuYW1lLCBidWZbMjA0OF0sIGVuY25hbWVbTUFYUEFUSExFTl07Ci0JaW50IGxlbjsKLQotCWZvciAoaW5keCA9IDA7IGluZHggPCBhcmdjOyArK2luZHgpIHsKLQkJbmFtZSA9IGFyZ3ZbaW5keF07Ci0JCXN0YXRieXRlcyA9IDA7Ci0JCWxlbiA9IHN0cmxlbihuYW1lKTsKLQkJd2hpbGUgKGxlbiA+IDEgJiYgbmFtZVtsZW4tMV0gPT0gJy8nKQotCQkJbmFtZVstLWxlbl0gPSAnXDAnOwotCQlpZiAoKGZkID0gb3BlbihuYW1lLCBPX1JET05MWXxPX05PTkJMT0NLLCAwKSkgPCAwKQotCQkJZ290byBzeXNlcnI7Ci0JCWlmIChzdHJjaHIobmFtZSwgJ1xuJykgIT0gTlVMTCkgewotCQkJc3RybnZpcyhlbmNuYW1lLCBuYW1lLCBzaXplb2YoZW5jbmFtZSksIFZJU19OTCk7Ci0JCQluYW1lID0gZW5jbmFtZTsKLQkJfQotCQlpZiAoZnN0YXQoZmQsICZzdGIpIDwgMCkgewotc3lzZXJyOgkJCXJ1bl9lcnIoIiVzOiAlcyIsIG5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlnb3RvIG5leHQ7Ci0JCX0KLQkJaWYgKHN0Yi5zdF9zaXplIDwgMCkgewotCQkJcnVuX2VycigiJXM6ICVzIiwgbmFtZSwgIk5lZ2F0aXZlIGZpbGUgc2l6ZSIpOwotCQkJZ290byBuZXh0OwotCQl9Ci0JCXVuc2V0X25vbmJsb2NrKGZkKTsKLQkJc3dpdGNoIChzdGIuc3RfbW9kZSAmIFNfSUZNVCkgewotCQljYXNlIFNfSUZSRUc6Ci0JCQlicmVhazsKLQkJY2FzZSBTX0lGRElSOgotCQkJaWYgKGlhbXJlY3Vyc2l2ZSkgewotCQkJCXJzb3VyY2UobmFtZSwgJnN0Yik7Ci0JCQkJZ290byBuZXh0OwotCQkJfQotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJZGVmYXVsdDoKLQkJCXJ1bl9lcnIoIiVzOiBub3QgYSByZWd1bGFyIGZpbGUiLCBuYW1lKTsKLQkJCWdvdG8gbmV4dDsKLQkJfQotCQlpZiAoKGxhc3QgPSBzdHJyY2hyKG5hbWUsICcvJykpID09IE5VTEwpCi0JCQlsYXN0ID0gbmFtZTsKLQkJZWxzZQotCQkJKytsYXN0OwotCQljdXJmaWxlID0gbGFzdDsKLQkJaWYgKHBmbGFnKSB7Ci0JCQkvKgotCQkJICogTWFrZSBpdCBjb21wYXRpYmxlIHdpdGggcG9zc2libGUgZnV0dXJlCi0JCQkgKiB2ZXJzaW9ucyBleHBlY3RpbmcgbWljcm9zZWNvbmRzLgotCQkJICovCi0JCQkodm9pZCkgc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiVCVsdSAwICVsdSAwXG4iLAotCQkJICAgICh1X2xvbmcpIChzdGIuc3RfbXRpbWUgPCAwID8gMCA6IHN0Yi5zdF9tdGltZSksCi0JCQkgICAgKHVfbG9uZykgKHN0Yi5zdF9hdGltZSA8IDAgPyAwIDogc3RiLnN0X2F0aW1lKSk7Ci0JCQlpZiAodmVyYm9zZV9tb2RlKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJGaWxlIG10aW1lICVsZCBhdGltZSAlbGRcbiIsCi0JCQkJICAgIChsb25nKXN0Yi5zdF9tdGltZSwgKGxvbmcpc3RiLnN0X2F0aW1lKTsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIlNlbmRpbmcgZmlsZSB0aW1lc3RhbXBzOiAlcyIsCi0JCQkJICAgIGJ1Zik7Ci0JCQl9Ci0JCQkodm9pZCkgYXRvbWljaW8odndyaXRlLCByZW1vdXQsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotCQkJaWYgKHJlc3BvbnNlKCkgPCAwKQotCQkJCWdvdG8gbmV4dDsKLQkJfQotI2RlZmluZQlGSUxFTU9ERU1BU0sJKFNfSVNVSUR8U19JU0dJRHxTX0lSV1hVfFNfSVJXWEd8U19JUldYTykKLQkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiQyUwNG8gJWxsZCAlc1xuIiwKLQkJICAgICh1X2ludCkgKHN0Yi5zdF9tb2RlICYgRklMRU1PREVNQVNLKSwKLQkJICAgIChsb25nIGxvbmcpc3RiLnN0X3NpemUsIGxhc3QpOwotCQlpZiAodmVyYm9zZV9tb2RlKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlNlbmRpbmcgZmlsZSBtb2RlczogJXMiLCBidWYpOwotCQl9Ci0JCSh2b2lkKSBhdG9taWNpbyh2d3JpdGUsIHJlbW91dCwgYnVmLCBzdHJsZW4oYnVmKSk7Ci0JCWlmIChyZXNwb25zZSgpIDwgMCkKLQkJCWdvdG8gbmV4dDsKLQkJaWYgKChicCA9IGFsbG9jYnVmKCZidWZmZXIsIGZkLCBDT1BZX0JVRkxFTikpID09IE5VTEwpIHsKLW5leHQ6CQkJaWYgKGZkICE9IC0xKSB7Ci0JCQkJKHZvaWQpIGNsb3NlKGZkKTsKLQkJCQlmZCA9IC0xOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHNob3dwcm9ncmVzcykKLQkJCXN0YXJ0X3Byb2dyZXNzX21ldGVyKGN1cmZpbGUsIHN0Yi5zdF9zaXplLCAmc3RhdGJ5dGVzKTsKLQkJc2V0X25vbmJsb2NrKHJlbW91dCk7Ci0JCWZvciAoaGFkZXJyID0gaSA9IDA7IGkgPCBzdGIuc3Rfc2l6ZTsgaSArPSBicC0+Y250KSB7Ci0JCQlhbXQgPSBicC0+Y250OwotCQkJaWYgKGkgKyAob2ZmX3QpYW10ID4gc3RiLnN0X3NpemUpCi0JCQkJYW10ID0gc3RiLnN0X3NpemUgLSBpOwotCQkJaWYgKCFoYWRlcnIpIHsKLQkJCQlpZiAoYXRvbWljaW8ocmVhZCwgZmQsIGJwLT5idWYsIGFtdCkgIT0gYW10KQotCQkJCQloYWRlcnIgPSBlcnJubzsKLQkJCX0KLQkJCS8qIEtlZXAgd3JpdGluZyBhZnRlciBlcnJvciB0byByZXRhaW4gc3luYyAqLwotCQkJaWYgKGhhZGVycikgewotCQkJCSh2b2lkKWF0b21pY2lvKHZ3cml0ZSwgcmVtb3V0LCBicC0+YnVmLCBhbXQpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGF0b21pY2lvNih2d3JpdGUsIHJlbW91dCwgYnAtPmJ1ZiwgYW10LCBzY3BpbywKLQkJCSAgICAmc3RhdGJ5dGVzKSAhPSBhbXQpCi0JCQkJaGFkZXJyID0gZXJybm87Ci0JCX0KLQkJdW5zZXRfbm9uYmxvY2socmVtb3V0KTsKLQkJaWYgKHNob3dwcm9ncmVzcykKLQkJCXN0b3BfcHJvZ3Jlc3NfbWV0ZXIoKTsKLQotCQlpZiAoZmQgIT0gLTEpIHsKLQkJCWlmIChjbG9zZShmZCkgPCAwICYmICFoYWRlcnIpCi0JCQkJaGFkZXJyID0gZXJybm87Ci0JCQlmZCA9IC0xOwotCQl9Ci0JCWlmICghaGFkZXJyKQotCQkJKHZvaWQpIGF0b21pY2lvKHZ3cml0ZSwgcmVtb3V0LCAiIiwgMSk7Ci0JCWVsc2UKLQkJCXJ1bl9lcnIoIiVzOiAlcyIsIG5hbWUsIHN0cmVycm9yKGhhZGVycikpOwotCQkodm9pZCkgcmVzcG9uc2UoKTsKLQl9Ci19Ci0KLXZvaWQKLXJzb3VyY2UoY2hhciAqbmFtZSwgc3RydWN0IHN0YXQgKnN0YXRwKQotewotCURJUiAqZGlycDsKLQlzdHJ1Y3QgZGlyZW50ICpkcDsKLQljaGFyICpsYXN0LCAqdmVjdFsxXSwgcGF0aFsxMTAwXTsKLQotCWlmICghKGRpcnAgPSBvcGVuZGlyKG5hbWUpKSkgewotCQlydW5fZXJyKCIlczogJXMiLCBuYW1lLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm47Ci0JfQotCWxhc3QgPSBzdHJyY2hyKG5hbWUsICcvJyk7Ci0JaWYgKGxhc3QgPT0gMCkKLQkJbGFzdCA9IG5hbWU7Ci0JZWxzZQotCQlsYXN0Kys7Ci0JaWYgKHBmbGFnKSB7Ci0JCSh2b2lkKSBzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICJUJWx1IDAgJWx1IDBcbiIsCi0JCSAgICAodV9sb25nKSBzdGF0cC0+c3RfbXRpbWUsCi0JCSAgICAodV9sb25nKSBzdGF0cC0+c3RfYXRpbWUpOwotCQkodm9pZCkgYXRvbWljaW8odndyaXRlLCByZW1vdXQsIHBhdGgsIHN0cmxlbihwYXRoKSk7Ci0JCWlmIChyZXNwb25zZSgpIDwgMCkgewotCQkJY2xvc2VkaXIoZGlycCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JKHZvaWQpIHNucHJpbnRmKHBhdGgsIHNpemVvZiBwYXRoLCAiRCUwNG8gJWQgJS4xMDI0c1xuIiwKLQkgICAgKHVfaW50KSAoc3RhdHAtPnN0X21vZGUgJiBGSUxFTU9ERU1BU0spLCAwLCBsYXN0KTsKLQlpZiAodmVyYm9zZV9tb2RlKQotCQlmcHJpbnRmKHN0ZGVyciwgIkVudGVyaW5nIGRpcmVjdG9yeTogJXMiLCBwYXRoKTsKLQkodm9pZCkgYXRvbWljaW8odndyaXRlLCByZW1vdXQsIHBhdGgsIHN0cmxlbihwYXRoKSk7Ci0JaWYgKHJlc3BvbnNlKCkgPCAwKSB7Ci0JCWNsb3NlZGlyKGRpcnApOwotCQlyZXR1cm47Ci0JfQotCXdoaWxlICgoZHAgPSByZWFkZGlyKGRpcnApKSAhPSBOVUxMKSB7Ci0JCWlmIChkcC0+ZF9pbm8gPT0gMCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIXN0cmNtcChkcC0+ZF9uYW1lLCAiLiIpIHx8ICFzdHJjbXAoZHAtPmRfbmFtZSwgIi4uIikpCi0JCQljb250aW51ZTsKLQkJaWYgKHN0cmxlbihuYW1lKSArIDEgKyBzdHJsZW4oZHAtPmRfbmFtZSkgPj0gc2l6ZW9mKHBhdGgpIC0gMSkgewotCQkJcnVuX2VycigiJXMvJXM6IG5hbWUgdG9vIGxvbmciLCBuYW1lLCBkcC0+ZF9uYW1lKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCSh2b2lkKSBzbnByaW50ZihwYXRoLCBzaXplb2YgcGF0aCwgIiVzLyVzIiwgbmFtZSwgZHAtPmRfbmFtZSk7Ci0JCXZlY3RbMF0gPSBwYXRoOwotCQlzb3VyY2UoMSwgdmVjdCk7Ci0JfQotCSh2b2lkKSBjbG9zZWRpcihkaXJwKTsKLQkodm9pZCkgYXRvbWljaW8odndyaXRlLCByZW1vdXQsICJFXG4iLCAyKTsKLQkodm9pZCkgcmVzcG9uc2UoKTsKLX0KLQotdm9pZAotc2luayhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0Jc3RhdGljIEJVRiBidWZmZXI7Ci0Jc3RydWN0IHN0YXQgc3RiOwotCWVudW0gewotCQlZRVMsIE5PLCBESVNQTEFZRUQKLQl9IHdyZXJyOwotCUJVRiAqYnA7Ci0Jb2ZmX3QgaTsKLQlzaXplX3QgaiwgY291bnQ7Ci0JaW50IGFtdCwgZXhpc3RzLCBmaXJzdCwgb2ZkOwotCW1vZGVfdCBtb2RlLCBvbW9kZSwgbWFzazsKLQlvZmZfdCBzaXplLCBzdGF0Ynl0ZXM7Ci0JaW50IHNldGltZXMsIHRhcmdpc2Rpciwgd3JlcnJubyA9IDA7Ci0JY2hhciBjaCwgKmNwLCAqbnAsICp0YXJnLCAqd2h5LCAqdmVjdFsxXSwgYnVmWzIwNDhdOwotCXN0cnVjdCB0aW1ldmFsIHR2WzJdOwotCi0jZGVmaW5lCWF0aW1lCXR2WzBdCi0jZGVmaW5lCW10aW1lCXR2WzFdCi0jZGVmaW5lCVNDUkVXVVAoc3RyKQl7IHdoeSA9IHN0cjsgZ290byBzY3Jld3VwOyB9Ci0KLQlzZXRpbWVzID0gdGFyZ2lzZGlyID0gMDsKLQltYXNrID0gdW1hc2soMCk7Ci0JaWYgKCFwZmxhZykKLQkJKHZvaWQpIHVtYXNrKG1hc2spOwotCWlmIChhcmdjICE9IDEpIHsKLQkJcnVuX2VycigiYW1iaWd1b3VzIHRhcmdldCIpOwotCQlleGl0KDEpOwotCX0KLQl0YXJnID0gKmFyZ3Y7Ci0JaWYgKHRhcmdldHNob3VsZGJlZGlyZWN0b3J5KQotCQl2ZXJpZnlkaXIodGFyZyk7Ci0KLQkodm9pZCkgYXRvbWljaW8odndyaXRlLCByZW1vdXQsICIiLCAxKTsKLQlpZiAoc3RhdCh0YXJnLCAmc3RiKSA9PSAwICYmIFNfSVNESVIoc3RiLnN0X21vZGUpKQotCQl0YXJnaXNkaXIgPSAxOwotCWZvciAoZmlyc3QgPSAxOzsgZmlyc3QgPSAwKSB7Ci0JCWNwID0gYnVmOwotCQlpZiAoYXRvbWljaW8ocmVhZCwgcmVtaW4sIGNwLCAxKSAhPSAxKQotCQkJcmV0dXJuOwotCQlpZiAoKmNwKysgPT0gJ1xuJykKLQkJCVNDUkVXVVAoInVuZXhwZWN0ZWQgPG5ld2xpbmU+Iik7Ci0JCWRvIHsKLQkJCWlmIChhdG9taWNpbyhyZWFkLCByZW1pbiwgJmNoLCBzaXplb2YoY2gpKSAhPSBzaXplb2YoY2gpKQotCQkJCVNDUkVXVVAoImxvc3QgY29ubmVjdGlvbiIpOwotCQkJKmNwKysgPSBjaDsKLQkJfSB3aGlsZSAoY3AgPCAmYnVmW3NpemVvZihidWYpIC0gMV0gJiYgY2ggIT0gJ1xuJyk7Ci0JCSpjcCA9IDA7Ci0JCWlmICh2ZXJib3NlX21vZGUpCi0JCQlmcHJpbnRmKHN0ZGVyciwgIlNpbms6ICVzIiwgYnVmKTsKLQotCQlpZiAoYnVmWzBdID09ICdcMDEnIHx8IGJ1ZlswXSA9PSAnXDAyJykgewotCQkJaWYgKGlhbXJlbW90ZSA9PSAwKQotCQkJCSh2b2lkKSBhdG9taWNpbyh2d3JpdGUsIFNUREVSUl9GSUxFTk8sCi0JCQkJICAgIGJ1ZiArIDEsIHN0cmxlbihidWYgKyAxKSk7Ci0JCQlpZiAoYnVmWzBdID09ICdcMDInKQotCQkJCWV4aXQoMSk7Ci0JCQkrK2VycnM7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoYnVmWzBdID09ICdFJykgewotCQkJKHZvaWQpIGF0b21pY2lvKHZ3cml0ZSwgcmVtb3V0LCAiIiwgMSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNoID09ICdcbicpCi0JCQkqLS1jcCA9IDA7Ci0KLQkJY3AgPSBidWY7Ci0JCWlmICgqY3AgPT0gJ1QnKSB7Ci0JCQlzZXRpbWVzKys7Ci0JCQljcCsrOwotCQkJbXRpbWUudHZfc2VjID0gc3RydG9sKGNwLCAmY3AsIDEwKTsKLQkJCWlmICghY3AgfHwgKmNwKysgIT0gJyAnKQotCQkJCVNDUkVXVVAoIm10aW1lLnNlYyBub3QgZGVsaW1pdGVkIik7Ci0JCQltdGltZS50dl91c2VjID0gc3RydG9sKGNwLCAmY3AsIDEwKTsKLQkJCWlmICghY3AgfHwgKmNwKysgIT0gJyAnKQotCQkJCVNDUkVXVVAoIm10aW1lLnVzZWMgbm90IGRlbGltaXRlZCIpOwotCQkJYXRpbWUudHZfc2VjID0gc3RydG9sKGNwLCAmY3AsIDEwKTsKLQkJCWlmICghY3AgfHwgKmNwKysgIT0gJyAnKQotCQkJCVNDUkVXVVAoImF0aW1lLnNlYyBub3QgZGVsaW1pdGVkIik7Ci0JCQlhdGltZS50dl91c2VjID0gc3RydG9sKGNwLCAmY3AsIDEwKTsKLQkJCWlmICghY3AgfHwgKmNwKysgIT0gJ1wwJykKLQkJCQlTQ1JFV1VQKCJhdGltZS51c2VjIG5vdCBkZWxpbWl0ZWQiKTsKLQkJCSh2b2lkKSBhdG9taWNpbyh2d3JpdGUsIHJlbW91dCwgIiIsIDEpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCpjcCAhPSAnQycgJiYgKmNwICE9ICdEJykgewotCQkJLyoKLQkJCSAqIENoZWNrIGZvciB0aGUgY2FzZSAicmNwIHJlbW90ZTpmb29cKiBsb2NhbDpiYXIiLgotCQkJICogSW4gdGhpcyBjYXNlLCB0aGUgbGluZSAiTm8gbWF0Y2guIiBjYW4gYmUgcmV0dXJuZWQKLQkJCSAqIGJ5IHRoZSBzaGVsbCBiZWZvcmUgdGhlIHJjcCBjb21tYW5kIG9uIHRoZSByZW1vdGUgaXMKLQkJCSAqIGV4ZWN1dGVkIHNvIHRoZSBeQWVycm9yX21lc3NhZ2UgY29udmVudGlvbiBpc24ndAotCQkJICogZm9sbG93ZWQuCi0JCQkgKi8KLQkJCWlmIChmaXJzdCkgewotCQkJCXJ1bl9lcnIoIiVzIiwgY3ApOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCQlTQ1JFV1VQKCJleHBlY3RlZCBjb250cm9sIHJlY29yZCIpOwotCQl9Ci0JCW1vZGUgPSAwOwotCQlmb3IgKCsrY3A7IGNwIDwgYnVmICsgNTsgY3ArKykgewotCQkJaWYgKCpjcCA8ICcwJyB8fCAqY3AgPiAnNycpCi0JCQkJU0NSRVdVUCgiYmFkIG1vZGUiKTsKLQkJCW1vZGUgPSAobW9kZSA8PCAzKSB8ICgqY3AgLSAnMCcpOwotCQl9Ci0JCWlmICgqY3ArKyAhPSAnICcpCi0JCQlTQ1JFV1VQKCJtb2RlIG5vdCBkZWxpbWl0ZWQiKTsKLQotCQlmb3IgKHNpemUgPSAwOyBpc2RpZ2l0KCpjcCk7KQotCQkJc2l6ZSA9IHNpemUgKiAxMCArICgqY3ArKyAtICcwJyk7Ci0JCWlmICgqY3ArKyAhPSAnICcpCi0JCQlTQ1JFV1VQKCJzaXplIG5vdCBkZWxpbWl0ZWQiKTsKLQkJaWYgKChzdHJjaHIoY3AsICcvJykgIT0gTlVMTCkgfHwgKHN0cmNtcChjcCwgIi4uIikgPT0gMCkpIHsKLQkJCXJ1bl9lcnIoImVycm9yOiB1bmV4cGVjdGVkIGZpbGVuYW1lOiAlcyIsIGNwKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJaWYgKHRhcmdpc2RpcikgewotCQkJc3RhdGljIGNoYXIgKm5hbWVidWY7Ci0JCQlzdGF0aWMgc2l6ZV90IGN1cnNpemU7Ci0JCQlzaXplX3QgbmVlZDsKLQotCQkJbmVlZCA9IHN0cmxlbih0YXJnKSArIHN0cmxlbihjcCkgKyAyNTA7Ci0JCQlpZiAobmVlZCA+IGN1cnNpemUpIHsKLQkJCQlpZiAobmFtZWJ1ZikKLQkJCQkJeGZyZWUobmFtZWJ1Zik7Ci0JCQkJbmFtZWJ1ZiA9IHhtYWxsb2MobmVlZCk7Ci0JCQkJY3Vyc2l6ZSA9IG5lZWQ7Ci0JCQl9Ci0JCQkodm9pZCkgc25wcmludGYobmFtZWJ1ZiwgbmVlZCwgIiVzJXMlcyIsIHRhcmcsCi0JCQkgICAgc3RyY21wKHRhcmcsICIvIikgPyAiLyIgOiAiIiwgY3ApOwotCQkJbnAgPSBuYW1lYnVmOwotCQl9IGVsc2UKLQkJCW5wID0gdGFyZzsKLQkJY3VyZmlsZSA9IGNwOwotCQlleGlzdHMgPSBzdGF0KG5wLCAmc3RiKSA9PSAwOwotCQlpZiAoYnVmWzBdID09ICdEJykgewotCQkJaW50IG1vZF9mbGFnID0gcGZsYWc7Ci0JCQlpZiAoIWlhbXJlY3Vyc2l2ZSkKLQkJCQlTQ1JFV1VQKCJyZWNlaXZlZCBkaXJlY3Rvcnkgd2l0aG91dCAtciIpOwotCQkJaWYgKGV4aXN0cykgewotCQkJCWlmICghU19JU0RJUihzdGIuc3RfbW9kZSkpIHsKLQkJCQkJZXJybm8gPSBFTk9URElSOwotCQkJCQlnb3RvIGJhZDsKLQkJCQl9Ci0JCQkJaWYgKHBmbGFnKQotCQkJCQkodm9pZCkgY2htb2QobnAsIG1vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBIYW5kbGUgY29weWluZyBmcm9tIGEgcmVhZC1vbmx5Ci0JCQkJICAgZGlyZWN0b3J5ICovCi0JCQkJbW9kX2ZsYWcgPSAxOwotCQkJCWlmIChta2RpcihucCwgbW9kZSB8IFNfSVJXWFUpIDwgMCkKLQkJCQkJZ290byBiYWQ7Ci0JCQl9Ci0JCQl2ZWN0WzBdID0geHN0cmR1cChucCk7Ci0JCQlzaW5rKDEsIHZlY3QpOwotCQkJaWYgKHNldGltZXMpIHsKLQkJCQlzZXRpbWVzID0gMDsKLQkJCQlpZiAodXRpbWVzKHZlY3RbMF0sIHR2KSA8IDApCi0JCQkJCXJ1bl9lcnIoIiVzOiBzZXQgdGltZXM6ICVzIiwKLQkJCQkJICAgIHZlY3RbMF0sIHN0cmVycm9yKGVycm5vKSk7Ci0JCQl9Ci0JCQlpZiAobW9kX2ZsYWcpCi0JCQkJKHZvaWQpIGNobW9kKHZlY3RbMF0sIG1vZGUpOwotCQkJaWYgKHZlY3RbMF0pCi0JCQkJeGZyZWUodmVjdFswXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlvbW9kZSA9IG1vZGU7Ci0JCW1vZGUgfD0gU19JV1VTUjsKLQkJaWYgKChvZmQgPSBvcGVuKG5wLCBPX1dST05MWXxPX0NSRUFULCBtb2RlKSkgPCAwKSB7Ci1iYWQ6CQkJcnVuX2VycigiJXM6ICVzIiwgbnAsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQkodm9pZCkgYXRvbWljaW8odndyaXRlLCByZW1vdXQsICIiLCAxKTsKLQkJaWYgKChicCA9IGFsbG9jYnVmKCZidWZmZXIsIG9mZCwgQ09QWV9CVUZMRU4pKSA9PSBOVUxMKSB7Ci0JCQkodm9pZCkgY2xvc2Uob2ZkKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWNwID0gYnAtPmJ1ZjsKLQkJd3JlcnIgPSBOTzsKLQotCQlzdGF0Ynl0ZXMgPSAwOwotCQlpZiAoc2hvd3Byb2dyZXNzKQotCQkJc3RhcnRfcHJvZ3Jlc3NfbWV0ZXIoY3VyZmlsZSwgc2l6ZSwgJnN0YXRieXRlcyk7Ci0JCXNldF9ub25ibG9jayhyZW1pbik7Ci0JCWZvciAoY291bnQgPSBpID0gMDsgaSA8IHNpemU7IGkgKz0gYnAtPmNudCkgewotCQkJYW10ID0gYnAtPmNudDsKLQkJCWlmIChpICsgYW10ID4gc2l6ZSkKLQkJCQlhbXQgPSBzaXplIC0gaTsKLQkJCWNvdW50ICs9IGFtdDsKLQkJCWRvIHsKLQkJCQlqID0gYXRvbWljaW82KHJlYWQsIHJlbWluLCBjcCwgYW10LAotCQkJCSAgICBzY3BpbywgJnN0YXRieXRlcyk7Ci0JCQkJaWYgKGogPT0gMCkgewotCQkJCQlydW5fZXJyKCIlcyIsIGogIT0gRVBJUEUgPwotCQkJCQkgICAgc3RyZXJyb3IoZXJybm8pIDoKLQkJCQkJICAgICJkcm9wcGVkIGNvbm5lY3Rpb24iKTsKLQkJCQkJZXhpdCgxKTsKLQkJCQl9Ci0JCQkJYW10IC09IGo7Ci0JCQkJY3AgKz0gajsKLQkJCX0gd2hpbGUgKGFtdCA+IDApOwotCi0JCQlpZiAoY291bnQgPT0gYnAtPmNudCkgewotCQkJCS8qIEtlZXAgcmVhZGluZyBzbyB3ZSBzdGF5IHN5bmMnZCB1cC4gKi8KLQkJCQlpZiAod3JlcnIgPT0gTk8pIHsKLQkJCQkJaWYgKGF0b21pY2lvKHZ3cml0ZSwgb2ZkLCBicC0+YnVmLAotCQkJCQkgICAgY291bnQpICE9IGNvdW50KSB7Ci0JCQkJCQl3cmVyciA9IFlFUzsKLQkJCQkJCXdyZXJybm8gPSBlcnJubzsKLQkJCQkJfQotCQkJCX0KLQkJCQljb3VudCA9IDA7Ci0JCQkJY3AgPSBicC0+YnVmOwotCQkJfQotCQl9Ci0JCXVuc2V0X25vbmJsb2NrKHJlbWluKTsKLQkJaWYgKHNob3dwcm9ncmVzcykKLQkJCXN0b3BfcHJvZ3Jlc3NfbWV0ZXIoKTsKLQkJaWYgKGNvdW50ICE9IDAgJiYgd3JlcnIgPT0gTk8gJiYKLQkJICAgIGF0b21pY2lvKHZ3cml0ZSwgb2ZkLCBicC0+YnVmLCBjb3VudCkgIT0gY291bnQpIHsKLQkJCXdyZXJyID0gWUVTOwotCQkJd3JlcnJubyA9IGVycm5vOwotCQl9Ci0JCWlmICh3cmVyciA9PSBOTyAmJiAoIWV4aXN0cyB8fCBTX0lTUkVHKHN0Yi5zdF9tb2RlKSkgJiYKLQkJICAgIGZ0cnVuY2F0ZShvZmQsIHNpemUpICE9IDApIHsKLQkJCXJ1bl9lcnIoIiVzOiB0cnVuY2F0ZTogJXMiLCBucCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCXdyZXJyID0gRElTUExBWUVEOwotCQl9Ci0JCWlmIChwZmxhZykgewotCQkJaWYgKGV4aXN0cyB8fCBvbW9kZSAhPSBtb2RlKQotI2lmZGVmIEhBVkVfRkNITU9ECi0JCQkJaWYgKGZjaG1vZChvZmQsIG9tb2RlKSkgewotI2Vsc2UgLyogSEFWRV9GQ0hNT0QgKi8KLQkJCQlpZiAoY2htb2QobnAsIG9tb2RlKSkgewotI2VuZGlmIC8qIEhBVkVfRkNITU9EICovCi0JCQkJCXJ1bl9lcnIoIiVzOiBzZXQgbW9kZTogJXMiLAotCQkJCQkgICAgbnAsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQkJCXdyZXJyID0gRElTUExBWUVEOwotCQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICghZXhpc3RzICYmIG9tb2RlICE9IG1vZGUpCi0jaWZkZWYgSEFWRV9GQ0hNT0QKLQkJCQlpZiAoZmNobW9kKG9mZCwgb21vZGUgJiB+bWFzaykpIHsKLSNlbHNlIC8qIEhBVkVfRkNITU9EICovCi0JCQkJaWYgKGNobW9kKG5wLCBvbW9kZSAmIH5tYXNrKSkgewotI2VuZGlmIC8qIEhBVkVfRkNITU9EICovCi0JCQkJCXJ1bl9lcnIoIiVzOiBzZXQgbW9kZTogJXMiLAotCQkJCQkgICAgbnAsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQkJCXdyZXJyID0gRElTUExBWUVEOwotCQkJCX0KLQkJfQotCQlpZiAoY2xvc2Uob2ZkKSA9PSAtMSkgewotCQkJd3JlcnIgPSBZRVM7Ci0JCQl3cmVycm5vID0gZXJybm87Ci0JCX0KLQkJKHZvaWQpIHJlc3BvbnNlKCk7Ci0JCWlmIChzZXRpbWVzICYmIHdyZXJyID09IE5PKSB7Ci0JCQlzZXRpbWVzID0gMDsKLQkJCWlmICh1dGltZXMobnAsIHR2KSA8IDApIHsKLQkJCQlydW5fZXJyKCIlczogc2V0IHRpbWVzOiAlcyIsCi0JCQkJICAgIG5wLCBzdHJlcnJvcihlcnJubykpOwotCQkJCXdyZXJyID0gRElTUExBWUVEOwotCQkJfQotCQl9Ci0JCXN3aXRjaCAod3JlcnIpIHsKLQkJY2FzZSBZRVM6Ci0JCQlydW5fZXJyKCIlczogJXMiLCBucCwgc3RyZXJyb3Iod3JlcnJubykpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTk86Ci0JCQkodm9pZCkgYXRvbWljaW8odndyaXRlLCByZW1vdXQsICIiLCAxKTsKLQkJCWJyZWFrOwotCQljYXNlIERJU1BMQVlFRDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotc2NyZXd1cDoKLQlydW5fZXJyKCJwcm90b2NvbCBlcnJvcjogJXMiLCB3aHkpOwotCWV4aXQoMSk7Ci19Ci0KLWludAotcmVzcG9uc2Uodm9pZCkKLXsKLQljaGFyIGNoLCAqY3AsIHJlc3AsIHJidWZbMjA0OF07Ci0KLQlpZiAoYXRvbWljaW8ocmVhZCwgcmVtaW4sICZyZXNwLCBzaXplb2YocmVzcCkpICE9IHNpemVvZihyZXNwKSkKLQkJbG9zdGNvbm4oMCk7Ci0KLQljcCA9IHJidWY7Ci0Jc3dpdGNoIChyZXNwKSB7Ci0JY2FzZSAwOgkJLyogb2sgKi8KLQkJcmV0dXJuICgwKTsKLQlkZWZhdWx0OgotCQkqY3ArKyA9IHJlc3A7Ci0JCS8qIEZBTExUSFJPVUdIICovCi0JY2FzZSAxOgkJLyogZXJyb3IsIGZvbGxvd2VkIGJ5IGVycm9yIG1zZyAqLwotCWNhc2UgMjoJCS8qIGZhdGFsIGVycm9yLCAiIiAqLwotCQlkbyB7Ci0JCQlpZiAoYXRvbWljaW8ocmVhZCwgcmVtaW4sICZjaCwgc2l6ZW9mKGNoKSkgIT0gc2l6ZW9mKGNoKSkKLQkJCQlsb3N0Y29ubigwKTsKLQkJCSpjcCsrID0gY2g7Ci0JCX0gd2hpbGUgKGNwIDwgJnJidWZbc2l6ZW9mKHJidWYpIC0gMV0gJiYgY2ggIT0gJ1xuJyk7Ci0KLQkJaWYgKCFpYW1yZW1vdGUpCi0JCQkodm9pZCkgYXRvbWljaW8odndyaXRlLCBTVERFUlJfRklMRU5PLCByYnVmLCBjcCAtIHJidWYpOwotCQkrK2VycnM7Ci0JCWlmIChyZXNwID09IDEpCi0JCQlyZXR1cm4gKC0xKTsKLQkJZXhpdCgxKTsKLQl9Ci0JLyogTk9UUkVBQ0hFRCAqLwotfQotCi12b2lkCi11c2FnZSh2b2lkKQotewotCSh2b2lkKSBmcHJpbnRmKHN0ZGVyciwKLQkgICAgInVzYWdlOiBzY3AgWy0xMjM0NkJDcHFydl0gWy1jIGNpcGhlcl0gWy1GIHNzaF9jb25maWddIFstaSBpZGVudGl0eV9maWxlXVxuIgotCSAgICAiICAgICAgICAgICBbLWwgbGltaXRdIFstbyBzc2hfb3B0aW9uXSBbLVAgcG9ydF0gWy1TIHByb2dyYW1dXG4iCi0JICAgICIgICAgICAgICAgIFtbdXNlckBdaG9zdDE6XWZpbGUxIC4uLiBbW3VzZXJAXWhvc3QyOl1maWxlMlxuIik7Ci0JZXhpdCgxKTsKLX0KLQotdm9pZAotcnVuX2Vycihjb25zdCBjaGFyICpmbXQsLi4uKQotewotCXN0YXRpYyBGSUxFICpmcDsKLQl2YV9saXN0IGFwOwotCi0JKytlcnJzOwotCWlmIChmcCAhPSBOVUxMIHx8IChyZW1vdXQgIT0gLTEgJiYgKGZwID0gZmRvcGVuKHJlbW91dCwgInciKSkpKSB7Ci0JCSh2b2lkKSBmcHJpbnRmKGZwLCAiJWMiLCAweDAxKTsKLQkJKHZvaWQpIGZwcmludGYoZnAsICJzY3A6ICIpOwotCQl2YV9zdGFydChhcCwgZm10KTsKLQkJKHZvaWQpIHZmcHJpbnRmKGZwLCBmbXQsIGFwKTsKLQkJdmFfZW5kKGFwKTsKLQkJKHZvaWQpIGZwcmludGYoZnAsICJcbiIpOwotCQkodm9pZCkgZmZsdXNoKGZwKTsKLQl9Ci0KLQlpZiAoIWlhbXJlbW90ZSkgewotCQl2YV9zdGFydChhcCwgZm10KTsKLQkJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKLQkJdmFfZW5kKGFwKTsKLQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCX0KLX0KLQotdm9pZAotdmVyaWZ5ZGlyKGNoYXIgKmNwKQotewotCXN0cnVjdCBzdGF0IHN0YjsKLQotCWlmICghc3RhdChjcCwgJnN0YikpIHsKLQkJaWYgKFNfSVNESVIoc3RiLnN0X21vZGUpKQotCQkJcmV0dXJuOwotCQllcnJubyA9IEVOT1RESVI7Ci0JfQotCXJ1bl9lcnIoIiVzOiAlcyIsIGNwLCBzdHJlcnJvcihlcnJubykpOwotCWtpbGxjaGlsZCgwKTsKLX0KLQotaW50Ci1va25hbWUoY2hhciAqY3AwKQotewotCWludCBjOwotCWNoYXIgKmNwOwotCi0JY3AgPSBjcDA7Ci0JZG8gewotCQljID0gKGludCkqY3A7Ci0JCWlmIChjICYgMDIwMCkKLQkJCWdvdG8gYmFkOwotCQlpZiAoIWlzYWxwaGEoYykgJiYgIWlzZGlnaXQoYykpIHsKLQkJCXN3aXRjaCAoYykgewotCQkJY2FzZSAnXCcnOgotCQkJY2FzZSAnIic6Ci0JCQljYXNlICdgJzoKLQkJCWNhc2UgJyAnOgotCQkJY2FzZSAnIyc6Ci0JCQkJZ290byBiYWQ7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfSB3aGlsZSAoKisrY3ApOwotCXJldHVybiAoMSk7Ci0KLWJhZDoJZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCB1c2VyIG5hbWVcbiIsIGNwMCk7Ci0JcmV0dXJuICgwKTsKLX0KLQotQlVGICoKLWFsbG9jYnVmKEJVRiAqYnAsIGludCBmZCwgaW50IGJsa3NpemUpCi17Ci0Jc2l6ZV90IHNpemU7Ci0jaWZkZWYgSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTEtTSVpFCi0Jc3RydWN0IHN0YXQgc3RiOwotCi0JaWYgKGZzdGF0KGZkLCAmc3RiKSA8IDApIHsKLQkJcnVuX2VycigiZnN0YXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0Jc2l6ZSA9IHJvdW5kdXAoc3RiLnN0X2Jsa3NpemUsIGJsa3NpemUpOwotCWlmIChzaXplID09IDApCi0JCXNpemUgPSBibGtzaXplOwotI2Vsc2UgLyogSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTEtTSVpFICovCi0Jc2l6ZSA9IGJsa3NpemU7Ci0jZW5kaWYgLyogSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTEtTSVpFICovCi0JaWYgKGJwLT5jbnQgPj0gc2l6ZSkKLQkJcmV0dXJuIChicCk7Ci0JaWYgKGJwLT5idWYgPT0gTlVMTCkKLQkJYnAtPmJ1ZiA9IHhtYWxsb2Moc2l6ZSk7Ci0JZWxzZQotCQlicC0+YnVmID0geHJlYWxsb2MoYnAtPmJ1ZiwgMSwgc2l6ZSk7Ci0JbWVtc2V0KGJwLT5idWYsIDAsIHNpemUpOwotCWJwLT5jbnQgPSBzaXplOwotCXJldHVybiAoYnApOwotfQotCi12b2lkCi1sb3N0Y29ubihpbnQgc2lnbm8pCi17Ci0JaWYgKCFpYW1yZW1vdGUpCi0JCXdyaXRlKFNUREVSUl9GSUxFTk8sICJsb3N0IGNvbm5lY3Rpb25cbiIsIDE2KTsKLQlpZiAoc2lnbm8pCi0JCV9leGl0KDEpOwotCWVsc2UKLQkJZXhpdCgxKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZjb25mLmMgYi9zZXJ2Y29uZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjI5M2Y1Li4wMDAwMDAwCi0tLSBhL3NlcnZjb25mLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODExICswLDAgQEAKLS8qICRPcGVuQlNEOiBzZXJ2Y29uZi5jLHYgMS4yMjIgMjAxMS8wNi8yMiAyMTo1NzowMSBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW5fc3lzdG0uaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+Ci0KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJzc2guaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJzZXJ2Y29uZi5oIgotI2luY2x1ZGUgImNvbXBhdC5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJjaXBoZXIuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJrZXguaCIKLSNpbmNsdWRlICJtYWMuaCIKLSNpbmNsdWRlICJtYXRjaC5oIgotI2luY2x1ZGUgImNoYW5uZWxzLmgiCi0jaW5jbHVkZSAiZ3JvdXBhY2Nlc3MuaCIKLQotI2lmZGVmIEFORFJPSUQKLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGFkZF9saXN0ZW5fYWRkcihTZXJ2ZXJPcHRpb25zICosIGNoYXIgKiwgaW50KTsKLXN0YXRpYyB2b2lkIGFkZF9vbmVfbGlzdGVuX2FkZHIoU2VydmVyT3B0aW9ucyAqLCBjaGFyICosIGludCk7Ci0KLS8qIFVzZSBvZiBwcml2aWxlZ2Ugc2VwYXJhdGlvbiBvciBub3QgKi8KLWV4dGVybiBpbnQgdXNlX3ByaXZzZXA7Ci1leHRlcm4gQnVmZmVyIGNmZzsKLQotLyogSW5pdGlhbGl6ZXMgdGhlIHNlcnZlciBvcHRpb25zIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiAqLwotCi12b2lkCi1pbml0aWFsaXplX3NlcnZlcl9vcHRpb25zKFNlcnZlck9wdGlvbnMgKm9wdGlvbnMpCi17Ci0JbWVtc2V0KG9wdGlvbnMsIDAsIHNpemVvZigqb3B0aW9ucykpOwotCi0JLyogUG9ydGFibGUtc3BlY2lmaWMgb3B0aW9ucyAqLwotCW9wdGlvbnMtPnVzZV9wYW0gPSAtMTsKLQotCS8qIFN0YW5kYXJkIE9wdGlvbnMgKi8KLQlvcHRpb25zLT5udW1fcG9ydHMgPSAwOwotCW9wdGlvbnMtPnBvcnRzX2Zyb21fY21kbGluZSA9IDA7Ci0Jb3B0aW9ucy0+bGlzdGVuX2FkZHJzID0gTlVMTDsKLQlvcHRpb25zLT5hZGRyZXNzX2ZhbWlseSA9IC0xOwotCW9wdGlvbnMtPm51bV9ob3N0X2tleV9maWxlcyA9IDA7Ci0Jb3B0aW9ucy0+bnVtX2hvc3RfY2VydF9maWxlcyA9IDA7Ci0Jb3B0aW9ucy0+cGlkX2ZpbGUgPSBOVUxMOwotCW9wdGlvbnMtPnNlcnZlcl9rZXlfYml0cyA9IC0xOwotCW9wdGlvbnMtPmxvZ2luX2dyYWNlX3RpbWUgPSAtMTsKLQlvcHRpb25zLT5rZXlfcmVnZW5lcmF0aW9uX3RpbWUgPSAtMTsKLQlvcHRpb25zLT5wZXJtaXRfcm9vdF9sb2dpbiA9IFBFUk1JVF9OT1RfU0VUOwotCW9wdGlvbnMtPmlnbm9yZV9yaG9zdHMgPSAtMTsKLQlvcHRpb25zLT5pZ25vcmVfdXNlcl9rbm93bl9ob3N0cyA9IC0xOwotCW9wdGlvbnMtPnByaW50X21vdGQgPSAtMTsKLQlvcHRpb25zLT5wcmludF9sYXN0bG9nID0gLTE7Ci0Jb3B0aW9ucy0+eDExX2ZvcndhcmRpbmcgPSAtMTsKLQlvcHRpb25zLT54MTFfZGlzcGxheV9vZmZzZXQgPSAtMTsKLQlvcHRpb25zLT54MTFfdXNlX2xvY2FsaG9zdCA9IC0xOwotCW9wdGlvbnMtPnhhdXRoX2xvY2F0aW9uID0gTlVMTDsKLQlvcHRpb25zLT5zdHJpY3RfbW9kZXMgPSAtMTsKLQlvcHRpb25zLT50Y3Bfa2VlcF9hbGl2ZSA9IC0xOwotCW9wdGlvbnMtPmxvZ19mYWNpbGl0eSA9IFNZU0xPR19GQUNJTElUWV9OT1RfU0VUOwotCW9wdGlvbnMtPmxvZ19sZXZlbCA9IFNZU0xPR19MRVZFTF9OT1RfU0VUOwotCW9wdGlvbnMtPnJob3N0c19yc2FfYXV0aGVudGljYXRpb24gPSAtMTsKLQlvcHRpb25zLT5ob3N0YmFzZWRfYXV0aGVudGljYXRpb24gPSAtMTsKLQlvcHRpb25zLT5ob3N0YmFzZWRfdXNlc19uYW1lX2Zyb21fcGFja2V0X29ubHkgPSAtMTsKLQlvcHRpb25zLT5yc2FfYXV0aGVudGljYXRpb24gPSAtMTsKLQlvcHRpb25zLT5wdWJrZXlfYXV0aGVudGljYXRpb24gPSAtMTsKLQlvcHRpb25zLT5rZXJiZXJvc19hdXRoZW50aWNhdGlvbiA9IC0xOwotCW9wdGlvbnMtPmtlcmJlcm9zX29yX2xvY2FsX3Bhc3N3ZCA9IC0xOwotCW9wdGlvbnMtPmtlcmJlcm9zX3RpY2tldF9jbGVhbnVwID0gLTE7Ci0Jb3B0aW9ucy0+a2VyYmVyb3NfZ2V0X2Fmc190b2tlbiA9IC0xOwotCW9wdGlvbnMtPmdzc19hdXRoZW50aWNhdGlvbj0tMTsKLQlvcHRpb25zLT5nc3NfY2xlYW51cF9jcmVkcyA9IC0xOwotCW9wdGlvbnMtPnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uID0gLTE7Ci0Jb3B0aW9ucy0+a2JkX2ludGVyYWN0aXZlX2F1dGhlbnRpY2F0aW9uID0gLTE7Ci0Jb3B0aW9ucy0+Y2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uID0gLTE7Ci0Jb3B0aW9ucy0+cGVybWl0X2VtcHR5X3Bhc3N3ZCA9IC0xOwotCW9wdGlvbnMtPnBlcm1pdF91c2VyX2VudiA9IC0xOwotCW9wdGlvbnMtPnVzZV9sb2dpbiA9IC0xOwotCW9wdGlvbnMtPmNvbXByZXNzaW9uID0gLTE7Ci0Jb3B0aW9ucy0+YWxsb3dfdGNwX2ZvcndhcmRpbmcgPSAtMTsKLQlvcHRpb25zLT5hbGxvd19hZ2VudF9mb3J3YXJkaW5nID0gLTE7Ci0Jb3B0aW9ucy0+bnVtX2FsbG93X3VzZXJzID0gMDsKLQlvcHRpb25zLT5udW1fZGVueV91c2VycyA9IDA7Ci0Jb3B0aW9ucy0+bnVtX2FsbG93X2dyb3VwcyA9IDA7Ci0Jb3B0aW9ucy0+bnVtX2RlbnlfZ3JvdXBzID0gMDsKLQlvcHRpb25zLT5jaXBoZXJzID0gTlVMTDsKLQlvcHRpb25zLT5tYWNzID0gTlVMTDsKLQlvcHRpb25zLT5rZXhfYWxnb3JpdGhtcyA9IE5VTEw7Ci0Jb3B0aW9ucy0+cHJvdG9jb2wgPSBTU0hfUFJPVE9fVU5LTk9XTjsKLQlvcHRpb25zLT5nYXRld2F5X3BvcnRzID0gLTE7Ci0Jb3B0aW9ucy0+bnVtX3N1YnN5c3RlbXMgPSAwOwotCW9wdGlvbnMtPm1heF9zdGFydHVwc19iZWdpbiA9IC0xOwotCW9wdGlvbnMtPm1heF9zdGFydHVwc19yYXRlID0gLTE7Ci0Jb3B0aW9ucy0+bWF4X3N0YXJ0dXBzID0gLTE7Ci0Jb3B0aW9ucy0+bWF4X2F1dGh0cmllcyA9IC0xOwotCW9wdGlvbnMtPm1heF9zZXNzaW9ucyA9IC0xOwotCW9wdGlvbnMtPmJhbm5lciA9IE5VTEw7Ci0Jb3B0aW9ucy0+dXNlX2RucyA9IC0xOwotCW9wdGlvbnMtPmNsaWVudF9hbGl2ZV9pbnRlcnZhbCA9IC0xOwotCW9wdGlvbnMtPmNsaWVudF9hbGl2ZV9jb3VudF9tYXggPSAtMTsKLQlvcHRpb25zLT5udW1fYXV0aGtleXNfZmlsZXMgPSAwOwotCW9wdGlvbnMtPm51bV9hY2NlcHRfZW52ID0gMDsKLQlvcHRpb25zLT5wZXJtaXRfdHVuID0gLTE7Ci0Jb3B0aW9ucy0+bnVtX3Blcm1pdHRlZF9vcGVucyA9IC0xOwotCW9wdGlvbnMtPmFkbV9mb3JjZWRfY29tbWFuZCA9IE5VTEw7Ci0Jb3B0aW9ucy0+Y2hyb290X2RpcmVjdG9yeSA9IE5VTEw7Ci0Jb3B0aW9ucy0+emVyb19rbm93bGVkZ2VfcGFzc3dvcmRfYXV0aGVudGljYXRpb24gPSAtMTsKLQlvcHRpb25zLT5yZXZva2VkX2tleXNfZmlsZSA9IE5VTEw7Ci0Jb3B0aW9ucy0+dHJ1c3RlZF91c2VyX2NhX2tleXMgPSBOVUxMOwotCW9wdGlvbnMtPmF1dGhvcml6ZWRfcHJpbmNpcGFsc19maWxlID0gTlVMTDsKLQlvcHRpb25zLT5pcF9xb3NfaW50ZXJhY3RpdmUgPSAtMTsKLQlvcHRpb25zLT5pcF9xb3NfYnVsayA9IC0xOwotfQotCi12b2lkCi1maWxsX2RlZmF1bHRfc2VydmVyX29wdGlvbnMoU2VydmVyT3B0aW9ucyAqb3B0aW9ucykKLXsKLQkvKiBQb3J0YWJsZS1zcGVjaWZpYyBvcHRpb25zICovCi0JaWYgKG9wdGlvbnMtPnVzZV9wYW0gPT0gLTEpCi0JCW9wdGlvbnMtPnVzZV9wYW0gPSAwOwotCi0JLyogU3RhbmRhcmQgT3B0aW9ucyAqLwotCWlmIChvcHRpb25zLT5wcm90b2NvbCA9PSBTU0hfUFJPVE9fVU5LTk9XTikKLQkJb3B0aW9ucy0+cHJvdG9jb2wgPSBTU0hfUFJPVE9fMjsKLQlpZiAob3B0aW9ucy0+bnVtX2hvc3Rfa2V5X2ZpbGVzID09IDApIHsKLQkJLyogZmlsbCBkZWZhdWx0IGhvc3RrZXlzIGZvciBwcm90b2NvbHMgKi8KLQkJaWYgKG9wdGlvbnMtPnByb3RvY29sICYgU1NIX1BST1RPXzEpCi0JCQlvcHRpb25zLT5ob3N0X2tleV9maWxlc1tvcHRpb25zLT5udW1faG9zdF9rZXlfZmlsZXMrK10gPQotCQkJICAgIF9QQVRIX0hPU1RfS0VZX0ZJTEU7Ci0JCWlmIChvcHRpb25zLT5wcm90b2NvbCAmIFNTSF9QUk9UT18yKSB7Ci0JCQlvcHRpb25zLT5ob3N0X2tleV9maWxlc1tvcHRpb25zLT5udW1faG9zdF9rZXlfZmlsZXMrK10gPQotCQkJICAgIF9QQVRIX0hPU1RfUlNBX0tFWV9GSUxFOwotCQkJb3B0aW9ucy0+aG9zdF9rZXlfZmlsZXNbb3B0aW9ucy0+bnVtX2hvc3Rfa2V5X2ZpbGVzKytdID0KLQkJCSAgICBfUEFUSF9IT1NUX0RTQV9LRVlfRklMRTsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQkJCW9wdGlvbnMtPmhvc3Rfa2V5X2ZpbGVzW29wdGlvbnMtPm51bV9ob3N0X2tleV9maWxlcysrXSA9Ci0JCQkgICAgX1BBVEhfSE9TVF9FQ0RTQV9LRVlfRklMRTsKLSNlbmRpZgotCQl9Ci0JfQotCS8qIE5vIGNlcnRpZmljYXRlcyBieSBkZWZhdWx0ICovCi0JaWYgKG9wdGlvbnMtPm51bV9wb3J0cyA9PSAwKQotCQlvcHRpb25zLT5wb3J0c1tvcHRpb25zLT5udW1fcG9ydHMrK10gPSBTU0hfREVGQVVMVF9QT1JUOwotCWlmIChvcHRpb25zLT5saXN0ZW5fYWRkcnMgPT0gTlVMTCkKLQkJYWRkX2xpc3Rlbl9hZGRyKG9wdGlvbnMsIE5VTEwsIDApOwotCWlmIChvcHRpb25zLT5waWRfZmlsZSA9PSBOVUxMKQotCQlvcHRpb25zLT5waWRfZmlsZSA9IF9QQVRIX1NTSF9EQUVNT05fUElEX0ZJTEU7Ci0JaWYgKG9wdGlvbnMtPnNlcnZlcl9rZXlfYml0cyA9PSAtMSkKLQkJb3B0aW9ucy0+c2VydmVyX2tleV9iaXRzID0gMTAyNDsKLQlpZiAob3B0aW9ucy0+bG9naW5fZ3JhY2VfdGltZSA9PSAtMSkKLQkJb3B0aW9ucy0+bG9naW5fZ3JhY2VfdGltZSA9IDEyMDsKLQlpZiAob3B0aW9ucy0+a2V5X3JlZ2VuZXJhdGlvbl90aW1lID09IC0xKQotCQlvcHRpb25zLT5rZXlfcmVnZW5lcmF0aW9uX3RpbWUgPSAzNjAwOwotCWlmIChvcHRpb25zLT5wZXJtaXRfcm9vdF9sb2dpbiA9PSBQRVJNSVRfTk9UX1NFVCkKLQkJb3B0aW9ucy0+cGVybWl0X3Jvb3RfbG9naW4gPSBQRVJNSVRfWUVTOwotCWlmIChvcHRpb25zLT5pZ25vcmVfcmhvc3RzID09IC0xKQotCQlvcHRpb25zLT5pZ25vcmVfcmhvc3RzID0gMTsKLQlpZiAob3B0aW9ucy0+aWdub3JlX3VzZXJfa25vd25faG9zdHMgPT0gLTEpCi0JCW9wdGlvbnMtPmlnbm9yZV91c2VyX2tub3duX2hvc3RzID0gMDsKLQlpZiAob3B0aW9ucy0+cHJpbnRfbW90ZCA9PSAtMSkKLQkJb3B0aW9ucy0+cHJpbnRfbW90ZCA9IDE7Ci0JaWYgKG9wdGlvbnMtPnByaW50X2xhc3Rsb2cgPT0gLTEpCi0JCW9wdGlvbnMtPnByaW50X2xhc3Rsb2cgPSAxOwotCWlmIChvcHRpb25zLT54MTFfZm9yd2FyZGluZyA9PSAtMSkKLQkJb3B0aW9ucy0+eDExX2ZvcndhcmRpbmcgPSAwOwotCWlmIChvcHRpb25zLT54MTFfZGlzcGxheV9vZmZzZXQgPT0gLTEpCi0JCW9wdGlvbnMtPngxMV9kaXNwbGF5X29mZnNldCA9IDEwOwotCWlmIChvcHRpb25zLT54MTFfdXNlX2xvY2FsaG9zdCA9PSAtMSkKLQkJb3B0aW9ucy0+eDExX3VzZV9sb2NhbGhvc3QgPSAxOwotCWlmIChvcHRpb25zLT54YXV0aF9sb2NhdGlvbiA9PSBOVUxMKQotCQlvcHRpb25zLT54YXV0aF9sb2NhdGlvbiA9IF9QQVRIX1hBVVRIOwotCWlmIChvcHRpb25zLT5zdHJpY3RfbW9kZXMgPT0gLTEpCi0JCW9wdGlvbnMtPnN0cmljdF9tb2RlcyA9IDE7Ci0JaWYgKG9wdGlvbnMtPnRjcF9rZWVwX2FsaXZlID09IC0xKQotCQlvcHRpb25zLT50Y3Bfa2VlcF9hbGl2ZSA9IDE7Ci0JaWYgKG9wdGlvbnMtPmxvZ19mYWNpbGl0eSA9PSBTWVNMT0dfRkFDSUxJVFlfTk9UX1NFVCkKLQkJb3B0aW9ucy0+bG9nX2ZhY2lsaXR5ID0gU1lTTE9HX0ZBQ0lMSVRZX0FVVEg7Ci0JaWYgKG9wdGlvbnMtPmxvZ19sZXZlbCA9PSBTWVNMT0dfTEVWRUxfTk9UX1NFVCkKLQkJb3B0aW9ucy0+bG9nX2xldmVsID0gU1lTTE9HX0xFVkVMX0lORk87Ci0JaWYgKG9wdGlvbnMtPnJob3N0c19yc2FfYXV0aGVudGljYXRpb24gPT0gLTEpCi0JCW9wdGlvbnMtPnJob3N0c19yc2FfYXV0aGVudGljYXRpb24gPSAwOwotCWlmIChvcHRpb25zLT5ob3N0YmFzZWRfYXV0aGVudGljYXRpb24gPT0gLTEpCi0JCW9wdGlvbnMtPmhvc3RiYXNlZF9hdXRoZW50aWNhdGlvbiA9IDA7Ci0JaWYgKG9wdGlvbnMtPmhvc3RiYXNlZF91c2VzX25hbWVfZnJvbV9wYWNrZXRfb25seSA9PSAtMSkKLQkJb3B0aW9ucy0+aG9zdGJhc2VkX3VzZXNfbmFtZV9mcm9tX3BhY2tldF9vbmx5ID0gMDsKLQlpZiAob3B0aW9ucy0+cnNhX2F1dGhlbnRpY2F0aW9uID09IC0xKQotCQlvcHRpb25zLT5yc2FfYXV0aGVudGljYXRpb24gPSAxOwotCWlmIChvcHRpb25zLT5wdWJrZXlfYXV0aGVudGljYXRpb24gPT0gLTEpCi0JCW9wdGlvbnMtPnB1YmtleV9hdXRoZW50aWNhdGlvbiA9IDE7Ci0JaWYgKG9wdGlvbnMtPmtlcmJlcm9zX2F1dGhlbnRpY2F0aW9uID09IC0xKQotCQlvcHRpb25zLT5rZXJiZXJvc19hdXRoZW50aWNhdGlvbiA9IDA7Ci0JaWYgKG9wdGlvbnMtPmtlcmJlcm9zX29yX2xvY2FsX3Bhc3N3ZCA9PSAtMSkKLQkJb3B0aW9ucy0+a2VyYmVyb3Nfb3JfbG9jYWxfcGFzc3dkID0gMTsKLQlpZiAob3B0aW9ucy0+a2VyYmVyb3NfdGlja2V0X2NsZWFudXAgPT0gLTEpCi0JCW9wdGlvbnMtPmtlcmJlcm9zX3RpY2tldF9jbGVhbnVwID0gMTsKLQlpZiAob3B0aW9ucy0+a2VyYmVyb3NfZ2V0X2Fmc190b2tlbiA9PSAtMSkKLQkJb3B0aW9ucy0+a2VyYmVyb3NfZ2V0X2Fmc190b2tlbiA9IDA7Ci0JaWYgKG9wdGlvbnMtPmdzc19hdXRoZW50aWNhdGlvbiA9PSAtMSkKLQkJb3B0aW9ucy0+Z3NzX2F1dGhlbnRpY2F0aW9uID0gMDsKLQlpZiAob3B0aW9ucy0+Z3NzX2NsZWFudXBfY3JlZHMgPT0gLTEpCi0JCW9wdGlvbnMtPmdzc19jbGVhbnVwX2NyZWRzID0gMTsKLQlpZiAob3B0aW9ucy0+cGFzc3dvcmRfYXV0aGVudGljYXRpb24gPT0gLTEpCi0JCW9wdGlvbnMtPnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uID0gMTsKLQlpZiAob3B0aW9ucy0+a2JkX2ludGVyYWN0aXZlX2F1dGhlbnRpY2F0aW9uID09IC0xKQotCQlvcHRpb25zLT5rYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb24gPSAwOwotCWlmIChvcHRpb25zLT5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24gPT0gLTEpCi0JCW9wdGlvbnMtPmNoYWxsZW5nZV9yZXNwb25zZV9hdXRoZW50aWNhdGlvbiA9IDE7Ci0JaWYgKG9wdGlvbnMtPnBlcm1pdF9lbXB0eV9wYXNzd2QgPT0gLTEpCi0JCW9wdGlvbnMtPnBlcm1pdF9lbXB0eV9wYXNzd2QgPSAwOwotCWlmIChvcHRpb25zLT5wZXJtaXRfdXNlcl9lbnYgPT0gLTEpCi0JCW9wdGlvbnMtPnBlcm1pdF91c2VyX2VudiA9IDA7Ci0JaWYgKG9wdGlvbnMtPnVzZV9sb2dpbiA9PSAtMSkKLQkJb3B0aW9ucy0+dXNlX2xvZ2luID0gMDsKLQlpZiAob3B0aW9ucy0+Y29tcHJlc3Npb24gPT0gLTEpCi0JCW9wdGlvbnMtPmNvbXByZXNzaW9uID0gQ09NUF9ERUxBWUVEOwotCWlmIChvcHRpb25zLT5hbGxvd190Y3BfZm9yd2FyZGluZyA9PSAtMSkKLQkJb3B0aW9ucy0+YWxsb3dfdGNwX2ZvcndhcmRpbmcgPSAxOwotCWlmIChvcHRpb25zLT5hbGxvd19hZ2VudF9mb3J3YXJkaW5nID09IC0xKQotCQlvcHRpb25zLT5hbGxvd19hZ2VudF9mb3J3YXJkaW5nID0gMTsKLQlpZiAob3B0aW9ucy0+Z2F0ZXdheV9wb3J0cyA9PSAtMSkKLQkJb3B0aW9ucy0+Z2F0ZXdheV9wb3J0cyA9IDA7Ci0JaWYgKG9wdGlvbnMtPm1heF9zdGFydHVwcyA9PSAtMSkKLQkJb3B0aW9ucy0+bWF4X3N0YXJ0dXBzID0gMTA7Ci0JaWYgKG9wdGlvbnMtPm1heF9zdGFydHVwc19yYXRlID09IC0xKQotCQlvcHRpb25zLT5tYXhfc3RhcnR1cHNfcmF0ZSA9IDEwMDsJCS8qIDEwMCUgKi8KLQlpZiAob3B0aW9ucy0+bWF4X3N0YXJ0dXBzX2JlZ2luID09IC0xKQotCQlvcHRpb25zLT5tYXhfc3RhcnR1cHNfYmVnaW4gPSBvcHRpb25zLT5tYXhfc3RhcnR1cHM7Ci0JaWYgKG9wdGlvbnMtPm1heF9hdXRodHJpZXMgPT0gLTEpCi0JCW9wdGlvbnMtPm1heF9hdXRodHJpZXMgPSBERUZBVUxUX0FVVEhfRkFJTF9NQVg7Ci0JaWYgKG9wdGlvbnMtPm1heF9zZXNzaW9ucyA9PSAtMSkKLQkJb3B0aW9ucy0+bWF4X3Nlc3Npb25zID0gREVGQVVMVF9TRVNTSU9OU19NQVg7Ci0JaWYgKG9wdGlvbnMtPnVzZV9kbnMgPT0gLTEpCi0JCW9wdGlvbnMtPnVzZV9kbnMgPSAxOwotCWlmIChvcHRpb25zLT5jbGllbnRfYWxpdmVfaW50ZXJ2YWwgPT0gLTEpCi0JCW9wdGlvbnMtPmNsaWVudF9hbGl2ZV9pbnRlcnZhbCA9IDA7Ci0JaWYgKG9wdGlvbnMtPmNsaWVudF9hbGl2ZV9jb3VudF9tYXggPT0gLTEpCi0JCW9wdGlvbnMtPmNsaWVudF9hbGl2ZV9jb3VudF9tYXggPSAzOwotCWlmIChvcHRpb25zLT5udW1fYXV0aGtleXNfZmlsZXMgPT0gMCkgewotCQlvcHRpb25zLT5hdXRob3JpemVkX2tleXNfZmlsZXNbb3B0aW9ucy0+bnVtX2F1dGhrZXlzX2ZpbGVzKytdID0KLQkJICAgIHhzdHJkdXAoX1BBVEhfU1NIX1VTRVJfUEVSTUlUVEVEX0tFWVMpOwotCQlvcHRpb25zLT5hdXRob3JpemVkX2tleXNfZmlsZXNbb3B0aW9ucy0+bnVtX2F1dGhrZXlzX2ZpbGVzKytdID0KLQkJICAgIHhzdHJkdXAoX1BBVEhfU1NIX1VTRVJfUEVSTUlUVEVEX0tFWVMyKTsKLQl9Ci0JaWYgKG9wdGlvbnMtPnBlcm1pdF90dW4gPT0gLTEpCi0JCW9wdGlvbnMtPnBlcm1pdF90dW4gPSBTU0hfVFVOTU9ERV9OTzsKLQlpZiAob3B0aW9ucy0+emVyb19rbm93bGVkZ2VfcGFzc3dvcmRfYXV0aGVudGljYXRpb24gPT0gLTEpCi0JCW9wdGlvbnMtPnplcm9fa25vd2xlZGdlX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uID0gMDsKLQlpZiAob3B0aW9ucy0+aXBfcW9zX2ludGVyYWN0aXZlID09IC0xKQotCQlvcHRpb25zLT5pcF9xb3NfaW50ZXJhY3RpdmUgPSBJUFRPU19MT1dERUxBWTsKLQlpZiAob3B0aW9ucy0+aXBfcW9zX2J1bGsgPT0gLTEpCi0JCW9wdGlvbnMtPmlwX3Fvc19idWxrID0gSVBUT1NfVEhST1VHSFBVVDsKLQotCS8qIFR1cm4gcHJpdmlsZWdlIHNlcGFyYXRpb24gb24gYnkgZGVmYXVsdCAqLwotCWlmICh1c2VfcHJpdnNlcCA9PSAtMSkKLQkJdXNlX3ByaXZzZXAgPSBQUklWU0VQX09OOwotCi0jaWZuZGVmIEhBVkVfTU1BUAotCWlmICh1c2VfcHJpdnNlcCAmJiBvcHRpb25zLT5jb21wcmVzc2lvbiA9PSAxKSB7Ci0JCWVycm9yKCJUaGlzIHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgYm90aCBwcml2aWxlZ2UgIgotCQkgICAgInNlcGFyYXRpb24gYW5kIGNvbXByZXNzaW9uIik7Ci0JCWVycm9yKCJDb21wcmVzc2lvbiBkaXNhYmxlZCIpOwotCQlvcHRpb25zLT5jb21wcmVzc2lvbiA9IDA7Ci0JfQotI2VuZGlmCi0KLX0KLQotLyogS2V5d29yZCB0b2tlbnMuICovCi10eXBlZGVmIGVudW0gewotCXNCYWRPcHRpb24sCQkvKiA9PSB1bmtub3duIG9wdGlvbiAqLwotCS8qIFBvcnRhYmxlLXNwZWNpZmljIG9wdGlvbnMgKi8KLQlzVXNlUEFNLAotCS8qIFN0YW5kYXJkIE9wdGlvbnMgKi8KLQlzUG9ydCwgc0hvc3RLZXlGaWxlLCBzU2VydmVyS2V5Qml0cywgc0xvZ2luR3JhY2VUaW1lLCBzS2V5UmVnZW5lcmF0aW9uVGltZSwKLQlzUGVybWl0Um9vdExvZ2luLCBzTG9nRmFjaWxpdHksIHNMb2dMZXZlbCwKLQlzUmhvc3RzUlNBQXV0aGVudGljYXRpb24sIHNSU0FBdXRoZW50aWNhdGlvbiwKLQlzS2VyYmVyb3NBdXRoZW50aWNhdGlvbiwgc0tlcmJlcm9zT3JMb2NhbFBhc3N3ZCwgc0tlcmJlcm9zVGlja2V0Q2xlYW51cCwKLQlzS2VyYmVyb3NHZXRBRlNUb2tlbiwKLQlzS2VyYmVyb3NUZ3RQYXNzaW5nLCBzQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiwKLQlzUGFzc3dvcmRBdXRoZW50aWNhdGlvbiwgc0tiZEludGVyYWN0aXZlQXV0aGVudGljYXRpb24sCi0Jc0xpc3RlbkFkZHJlc3MsIHNBZGRyZXNzRmFtaWx5LAotCXNQcmludE1vdGQsIHNQcmludExhc3RMb2csIHNJZ25vcmVSaG9zdHMsCi0Jc1gxMUZvcndhcmRpbmcsIHNYMTFEaXNwbGF5T2Zmc2V0LCBzWDExVXNlTG9jYWxob3N0LAotCXNTdHJpY3RNb2Rlcywgc0VtcHR5UGFzc3dkLCBzVENQS2VlcEFsaXZlLAotCXNQZXJtaXRVc2VyRW52aXJvbm1lbnQsIHNVc2VMb2dpbiwgc0FsbG93VGNwRm9yd2FyZGluZywgc0NvbXByZXNzaW9uLAotCXNBbGxvd1VzZXJzLCBzRGVueVVzZXJzLCBzQWxsb3dHcm91cHMsIHNEZW55R3JvdXBzLAotCXNJZ25vcmVVc2VyS25vd25Ib3N0cywgc0NpcGhlcnMsIHNNYWNzLCBzUHJvdG9jb2wsIHNQaWRGaWxlLAotCXNHYXRld2F5UG9ydHMsIHNQdWJrZXlBdXRoZW50aWNhdGlvbiwgc1hBdXRoTG9jYXRpb24sIHNTdWJzeXN0ZW0sCi0Jc01heFN0YXJ0dXBzLCBzTWF4QXV0aFRyaWVzLCBzTWF4U2Vzc2lvbnMsCi0Jc0Jhbm5lciwgc1VzZUROUywgc0hvc3RiYXNlZEF1dGhlbnRpY2F0aW9uLAotCXNIb3N0YmFzZWRVc2VzTmFtZUZyb21QYWNrZXRPbmx5LCBzQ2xpZW50QWxpdmVJbnRlcnZhbCwKLQlzQ2xpZW50QWxpdmVDb3VudE1heCwgc0F1dGhvcml6ZWRLZXlzRmlsZSwKLQlzR3NzQXV0aGVudGljYXRpb24sIHNHc3NDbGVhbnVwQ3JlZHMsIHNBY2NlcHRFbnYsIHNQZXJtaXRUdW5uZWwsCi0Jc01hdGNoLCBzUGVybWl0T3Blbiwgc0ZvcmNlQ29tbWFuZCwgc0Nocm9vdERpcmVjdG9yeSwKLQlzVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiwgc0FsbG93QWdlbnRGb3J3YXJkaW5nLAotCXNaZXJvS25vd2xlZGdlUGFzc3dvcmRBdXRoZW50aWNhdGlvbiwgc0hvc3RDZXJ0aWZpY2F0ZSwKLQlzUmV2b2tlZEtleXMsIHNUcnVzdGVkVXNlckNBS2V5cywgc0F1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSwKLQlzS2V4QWxnb3JpdGhtcywgc0lQUW9TLAotCXNEZXByZWNhdGVkLCBzVW5zdXBwb3J0ZWQKLX0gU2VydmVyT3BDb2RlczsKLQotI2RlZmluZSBTU0hDRkdfR0xPQkFMCTB4MDEJLyogYWxsb3dlZCBpbiBtYWluIHNlY3Rpb24gb2Ygc3NoZF9jb25maWcgKi8KLSNkZWZpbmUgU1NIQ0ZHX01BVENICTB4MDIJLyogYWxsb3dlZCBpbnNpZGUgYSBNYXRjaCBzZWN0aW9uICovCi0jZGVmaW5lIFNTSENGR19BTEwJKFNTSENGR19HTE9CQUx8U1NIQ0ZHX01BVENIKQotCi0vKiBUZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0b2tlbnMuICovCi1zdGF0aWMgc3RydWN0IHsKLQljb25zdCBjaGFyICpuYW1lOwotCVNlcnZlck9wQ29kZXMgb3Bjb2RlOwotCXVfaW50IGZsYWdzOwotfSBrZXl3b3Jkc1tdID0gewotCS8qIFBvcnRhYmxlLXNwZWNpZmljIG9wdGlvbnMgKi8KLSNpZmRlZiBVU0VfUEFNCi0JeyAidXNlcGFtIiwgc1VzZVBBTSwgU1NIQ0ZHX0dMT0JBTCB9LAotI2Vsc2UKLQl7ICJ1c2VwYW0iLCBzVW5zdXBwb3J0ZWQsIFNTSENGR19HTE9CQUwgfSwKLSNlbmRpZgotCXsgInBhbWF1dGhlbnRpY2F0aW9udmlha2JkaW50Iiwgc0RlcHJlY2F0ZWQsIFNTSENGR19HTE9CQUwgfSwKLQkvKiBTdGFuZGFyZCBPcHRpb25zICovCi0JeyAicG9ydCIsIHNQb3J0LCBTU0hDRkdfR0xPQkFMIH0sCi0JeyAiaG9zdGtleSIsIHNIb3N0S2V5RmlsZSwgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgImhvc3Rkc2FrZXkiLCBzSG9zdEtleUZpbGUsIFNTSENGR19HTE9CQUwgfSwJCS8qIGFsaWFzICovCi0JeyAicGlkZmlsZSIsIHNQaWRGaWxlLCBTU0hDRkdfR0xPQkFMIH0sCi0JeyAic2VydmVya2V5Yml0cyIsIHNTZXJ2ZXJLZXlCaXRzLCBTU0hDRkdfR0xPQkFMIH0sCi0JeyAibG9naW5ncmFjZXRpbWUiLCBzTG9naW5HcmFjZVRpbWUsIFNTSENGR19HTE9CQUwgfSwKLQl7ICJrZXlyZWdlbmVyYXRpb25pbnRlcnZhbCIsIHNLZXlSZWdlbmVyYXRpb25UaW1lLCBTU0hDRkdfR0xPQkFMIH0sCi0JeyAicGVybWl0cm9vdGxvZ2luIiwgc1Blcm1pdFJvb3RMb2dpbiwgU1NIQ0ZHX0FMTCB9LAotCXsgInN5c2xvZ2ZhY2lsaXR5Iiwgc0xvZ0ZhY2lsaXR5LCBTU0hDRkdfR0xPQkFMIH0sCi0JeyAibG9nbGV2ZWwiLCBzTG9nTGV2ZWwsIFNTSENGR19HTE9CQUwgfSwKLQl7ICJyaG9zdHNhdXRoZW50aWNhdGlvbiIsIHNEZXByZWNhdGVkLCBTU0hDRkdfR0xPQkFMIH0sCi0JeyAicmhvc3RzcnNhYXV0aGVudGljYXRpb24iLCBzUmhvc3RzUlNBQXV0aGVudGljYXRpb24sIFNTSENGR19BTEwgfSwKLQl7ICJob3N0YmFzZWRhdXRoZW50aWNhdGlvbiIsIHNIb3N0YmFzZWRBdXRoZW50aWNhdGlvbiwgU1NIQ0ZHX0FMTCB9LAotCXsgImhvc3RiYXNlZHVzZXNuYW1lZnJvbXBhY2tldG9ubHkiLCBzSG9zdGJhc2VkVXNlc05hbWVGcm9tUGFja2V0T25seSwgU1NIQ0ZHX0FMTCB9LAotCXsgInJzYWF1dGhlbnRpY2F0aW9uIiwgc1JTQUF1dGhlbnRpY2F0aW9uLCBTU0hDRkdfQUxMIH0sCi0JeyAicHVia2V5YXV0aGVudGljYXRpb24iLCBzUHVia2V5QXV0aGVudGljYXRpb24sIFNTSENGR19BTEwgfSwKLQl7ICJkc2FhdXRoZW50aWNhdGlvbiIsIHNQdWJrZXlBdXRoZW50aWNhdGlvbiwgU1NIQ0ZHX0dMT0JBTCB9LCAvKiBhbGlhcyAqLwotI2lmZGVmIEtSQjUKLQl7ICJrZXJiZXJvc2F1dGhlbnRpY2F0aW9uIiwgc0tlcmJlcm9zQXV0aGVudGljYXRpb24sIFNTSENGR19BTEwgfSwKLQl7ICJrZXJiZXJvc29ybG9jYWxwYXNzd2QiLCBzS2VyYmVyb3NPckxvY2FsUGFzc3dkLCBTU0hDRkdfR0xPQkFMIH0sCi0JeyAia2VyYmVyb3N0aWNrZXRjbGVhbnVwIiwgc0tlcmJlcm9zVGlja2V0Q2xlYW51cCwgU1NIQ0ZHX0dMT0JBTCB9LAotI2lmZGVmIFVTRV9BRlMKLQl7ICJrZXJiZXJvc2dldGFmc3Rva2VuIiwgc0tlcmJlcm9zR2V0QUZTVG9rZW4sIFNTSENGR19HTE9CQUwgfSwKLSNlbHNlCi0JeyAia2VyYmVyb3NnZXRhZnN0b2tlbiIsIHNVbnN1cHBvcnRlZCwgU1NIQ0ZHX0dMT0JBTCB9LAotI2VuZGlmCi0jZWxzZQotCXsgImtlcmJlcm9zYXV0aGVudGljYXRpb24iLCBzVW5zdXBwb3J0ZWQsIFNTSENGR19BTEwgfSwKLQl7ICJrZXJiZXJvc29ybG9jYWxwYXNzd2QiLCBzVW5zdXBwb3J0ZWQsIFNTSENGR19HTE9CQUwgfSwKLQl7ICJrZXJiZXJvc3RpY2tldGNsZWFudXAiLCBzVW5zdXBwb3J0ZWQsIFNTSENGR19HTE9CQUwgfSwKLQl7ICJrZXJiZXJvc2dldGFmc3Rva2VuIiwgc1Vuc3VwcG9ydGVkLCBTU0hDRkdfR0xPQkFMIH0sCi0jZW5kaWYKLQl7ICJrZXJiZXJvc3RndHBhc3NpbmciLCBzVW5zdXBwb3J0ZWQsIFNTSENGR19HTE9CQUwgfSwKLQl7ICJhZnN0b2tlbnBhc3NpbmciLCBzVW5zdXBwb3J0ZWQsIFNTSENGR19HTE9CQUwgfSwKLSNpZmRlZiBHU1NBUEkKLQl7ICJnc3NhcGlhdXRoZW50aWNhdGlvbiIsIHNHc3NBdXRoZW50aWNhdGlvbiwgU1NIQ0ZHX0FMTCB9LAotCXsgImdzc2FwaWNsZWFudXBjcmVkZW50aWFscyIsIHNHc3NDbGVhbnVwQ3JlZHMsIFNTSENGR19HTE9CQUwgfSwKLSNlbHNlCi0JeyAiZ3NzYXBpYXV0aGVudGljYXRpb24iLCBzVW5zdXBwb3J0ZWQsIFNTSENGR19BTEwgfSwKLQl7ICJnc3NhcGljbGVhbnVwY3JlZGVudGlhbHMiLCBzVW5zdXBwb3J0ZWQsIFNTSENGR19HTE9CQUwgfSwKLSNlbmRpZgotCXsgInBhc3N3b3JkYXV0aGVudGljYXRpb24iLCBzUGFzc3dvcmRBdXRoZW50aWNhdGlvbiwgU1NIQ0ZHX0FMTCB9LAotCXsgImtiZGludGVyYWN0aXZlYXV0aGVudGljYXRpb24iLCBzS2JkSW50ZXJhY3RpdmVBdXRoZW50aWNhdGlvbiwgU1NIQ0ZHX0FMTCB9LAotCXsgImNoYWxsZW5nZXJlc3BvbnNlYXV0aGVudGljYXRpb24iLCBzQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiwgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgInNrZXlhdXRoZW50aWNhdGlvbiIsIHNDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uLCBTU0hDRkdfR0xPQkFMIH0sIC8qIGFsaWFzICovCi0jaWZkZWYgSlBBS0UKLQl7ICJ6ZXJva25vd2xlZGdlcGFzc3dvcmRhdXRoZW50aWNhdGlvbiIsIHNaZXJvS25vd2xlZGdlUGFzc3dvcmRBdXRoZW50aWNhdGlvbiwgU1NIQ0ZHX0FMTCB9LAotI2Vsc2UKLQl7ICJ6ZXJva25vd2xlZGdlcGFzc3dvcmRhdXRoZW50aWNhdGlvbiIsIHNVbnN1cHBvcnRlZCwgU1NIQ0ZHX0FMTCB9LAotI2VuZGlmCi0JeyAiY2hlY2ttYWlsIiwgc0RlcHJlY2F0ZWQsIFNTSENGR19HTE9CQUwgfSwKLQl7ICJsaXN0ZW5hZGRyZXNzIiwgc0xpc3RlbkFkZHJlc3MsIFNTSENGR19HTE9CQUwgfSwKLQl7ICJhZGRyZXNzZmFtaWx5Iiwgc0FkZHJlc3NGYW1pbHksIFNTSENGR19HTE9CQUwgfSwKLQl7ICJwcmludG1vdGQiLCBzUHJpbnRNb3RkLCBTU0hDRkdfR0xPQkFMIH0sCi0JeyAicHJpbnRsYXN0bG9nIiwgc1ByaW50TGFzdExvZywgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgImlnbm9yZXJob3N0cyIsIHNJZ25vcmVSaG9zdHMsIFNTSENGR19HTE9CQUwgfSwKLQl7ICJpZ25vcmV1c2Vya25vd25ob3N0cyIsIHNJZ25vcmVVc2VyS25vd25Ib3N0cywgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgIngxMWZvcndhcmRpbmciLCBzWDExRm9yd2FyZGluZywgU1NIQ0ZHX0FMTCB9LAotCXsgIngxMWRpc3BsYXlvZmZzZXQiLCBzWDExRGlzcGxheU9mZnNldCwgU1NIQ0ZHX0FMTCB9LAotCXsgIngxMXVzZWxvY2FsaG9zdCIsIHNYMTFVc2VMb2NhbGhvc3QsIFNTSENGR19BTEwgfSwKLQl7ICJ4YXV0aGxvY2F0aW9uIiwgc1hBdXRoTG9jYXRpb24sIFNTSENGR19HTE9CQUwgfSwKLQl7ICJzdHJpY3Rtb2RlcyIsIHNTdHJpY3RNb2RlcywgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgInBlcm1pdGVtcHR5cGFzc3dvcmRzIiwgc0VtcHR5UGFzc3dkLCBTU0hDRkdfQUxMIH0sCi0JeyAicGVybWl0dXNlcmVudmlyb25tZW50Iiwgc1Blcm1pdFVzZXJFbnZpcm9ubWVudCwgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgInVzZWxvZ2luIiwgc1VzZUxvZ2luLCBTU0hDRkdfR0xPQkFMIH0sCi0JeyAiY29tcHJlc3Npb24iLCBzQ29tcHJlc3Npb24sIFNTSENGR19HTE9CQUwgfSwKLQl7ICJ0Y3BrZWVwYWxpdmUiLCBzVENQS2VlcEFsaXZlLCBTU0hDRkdfR0xPQkFMIH0sCi0JeyAia2VlcGFsaXZlIiwgc1RDUEtlZXBBbGl2ZSwgU1NIQ0ZHX0dMT0JBTCB9LAkvKiBvYnNvbGV0ZSBhbGlhcyAqLwotCXsgImFsbG93dGNwZm9yd2FyZGluZyIsIHNBbGxvd1RjcEZvcndhcmRpbmcsIFNTSENGR19BTEwgfSwKLQl7ICJhbGxvd2FnZW50Zm9yd2FyZGluZyIsIHNBbGxvd0FnZW50Rm9yd2FyZGluZywgU1NIQ0ZHX0FMTCB9LAotCXsgImFsbG93dXNlcnMiLCBzQWxsb3dVc2VycywgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgImRlbnl1c2VycyIsIHNEZW55VXNlcnMsIFNTSENGR19HTE9CQUwgfSwKLQl7ICJhbGxvd2dyb3VwcyIsIHNBbGxvd0dyb3VwcywgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgImRlbnlncm91cHMiLCBzRGVueUdyb3VwcywgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgImNpcGhlcnMiLCBzQ2lwaGVycywgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgIm1hY3MiLCBzTWFjcywgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgInByb3RvY29sIiwgc1Byb3RvY29sLCBTU0hDRkdfR0xPQkFMIH0sCi0JeyAiZ2F0ZXdheXBvcnRzIiwgc0dhdGV3YXlQb3J0cywgU1NIQ0ZHX0FMTCB9LAotCXsgInN1YnN5c3RlbSIsIHNTdWJzeXN0ZW0sIFNTSENGR19HTE9CQUwgfSwKLQl7ICJtYXhzdGFydHVwcyIsIHNNYXhTdGFydHVwcywgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgIm1heGF1dGh0cmllcyIsIHNNYXhBdXRoVHJpZXMsIFNTSENGR19BTEwgfSwKLQl7ICJtYXhzZXNzaW9ucyIsIHNNYXhTZXNzaW9ucywgU1NIQ0ZHX0FMTCB9LAotCXsgImJhbm5lciIsIHNCYW5uZXIsIFNTSENGR19BTEwgfSwKLQl7ICJ1c2VkbnMiLCBzVXNlRE5TLCBTU0hDRkdfR0xPQkFMIH0sCi0JeyAidmVyaWZ5cmV2ZXJzZW1hcHBpbmciLCBzRGVwcmVjYXRlZCwgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgInJldmVyc2VtYXBwaW5nY2hlY2siLCBzRGVwcmVjYXRlZCwgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgImNsaWVudGFsaXZlaW50ZXJ2YWwiLCBzQ2xpZW50QWxpdmVJbnRlcnZhbCwgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgImNsaWVudGFsaXZlY291bnRtYXgiLCBzQ2xpZW50QWxpdmVDb3VudE1heCwgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgImF1dGhvcml6ZWRrZXlzZmlsZSIsIHNBdXRob3JpemVkS2V5c0ZpbGUsIFNTSENGR19BTEwgfSwKLQl7ICJhdXRob3JpemVka2V5c2ZpbGUyIiwgc0RlcHJlY2F0ZWQsIFNTSENGR19BTEwgfSwKLQl7ICJ1c2Vwcml2aWxlZ2VzZXBhcmF0aW9uIiwgc1VzZVByaXZpbGVnZVNlcGFyYXRpb24sIFNTSENGR19HTE9CQUx9LAotCXsgImFjY2VwdGVudiIsIHNBY2NlcHRFbnYsIFNTSENGR19HTE9CQUwgfSwKLQl7ICJwZXJtaXR0dW5uZWwiLCBzUGVybWl0VHVubmVsLCBTU0hDRkdfQUxMIH0sCi0JeyAibWF0Y2giLCBzTWF0Y2gsIFNTSENGR19BTEwgfSwKLQl7ICJwZXJtaXRvcGVuIiwgc1Blcm1pdE9wZW4sIFNTSENGR19BTEwgfSwKLQl7ICJmb3JjZWNvbW1hbmQiLCBzRm9yY2VDb21tYW5kLCBTU0hDRkdfQUxMIH0sCi0JeyAiY2hyb290ZGlyZWN0b3J5Iiwgc0Nocm9vdERpcmVjdG9yeSwgU1NIQ0ZHX0FMTCB9LAotCXsgImhvc3RjZXJ0aWZpY2F0ZSIsIHNIb3N0Q2VydGlmaWNhdGUsIFNTSENGR19HTE9CQUwgfSwKLQl7ICJyZXZva2Vka2V5cyIsIHNSZXZva2VkS2V5cywgU1NIQ0ZHX0FMTCB9LAotCXsgInRydXN0ZWR1c2VyY2FrZXlzIiwgc1RydXN0ZWRVc2VyQ0FLZXlzLCBTU0hDRkdfQUxMIH0sCi0JeyAiYXV0aG9yaXplZHByaW5jaXBhbHNmaWxlIiwgc0F1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSwgU1NIQ0ZHX0FMTCB9LAotCXsgImtleGFsZ29yaXRobXMiLCBzS2V4QWxnb3JpdGhtcywgU1NIQ0ZHX0dMT0JBTCB9LAotCXsgImlwcW9zIiwgc0lQUW9TLCBTU0hDRkdfQUxMIH0sCi0JeyBOVUxMLCBzQmFkT3B0aW9uLCAwIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgewotCWludCB2YWw7Ci0JY2hhciAqdGV4dDsKLX0gdHVubW9kZV9kZXNjW10gPSB7Ci0JeyBTU0hfVFVOTU9ERV9OTywgIm5vIiB9LAotCXsgU1NIX1RVTk1PREVfUE9JTlRPUE9JTlQsICJwb2ludC10by1wb2ludCIgfSwKLQl7IFNTSF9UVU5NT0RFX0VUSEVSTkVULCAiZXRoZXJuZXQiIH0sCi0JeyBTU0hfVFVOTU9ERV9ZRVMsICJ5ZXMiIH0sCi0JeyAtMSwgTlVMTCB9Ci19OwotCi0vKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSB0b2tlbiBwb2ludGVkIHRvIGJ5IGNwIG9yIHNCYWRPcHRpb24uCi0gKi8KLQotc3RhdGljIFNlcnZlck9wQ29kZXMKLXBhcnNlX3Rva2VuKGNvbnN0IGNoYXIgKmNwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLQkgICAgaW50IGxpbmVudW0sIHVfaW50ICpmbGFncykKLXsKLQl1X2ludCBpOwotCi0JZm9yIChpID0gMDsga2V5d29yZHNbaV0ubmFtZTsgaSsrKQotCQlpZiAoc3RyY2FzZWNtcChjcCwga2V5d29yZHNbaV0ubmFtZSkgPT0gMCkgewotCQkJKmZsYWdzID0ga2V5d29yZHNbaV0uZmxhZ3M7Ci0JCQlyZXR1cm4ga2V5d29yZHNbaV0ub3Bjb2RlOwotCQl9Ci0KLQllcnJvcigiJXM6IGxpbmUgJWQ6IEJhZCBjb25maWd1cmF0aW9uIG9wdGlvbjogJXMiLAotCSAgICBmaWxlbmFtZSwgbGluZW51bSwgY3ApOwotCXJldHVybiBzQmFkT3B0aW9uOwotfQotCi1jaGFyICoKLWRlcmVsYXRpdmlzZV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0JY2hhciAqZXhwYW5kZWQsICpyZXQsIGN3ZFtNQVhQQVRITEVOXTsKLQotCWV4cGFuZGVkID0gdGlsZGVfZXhwYW5kX2ZpbGVuYW1lKHBhdGgsIGdldHVpZCgpKTsKLQlpZiAoKmV4cGFuZGVkID09ICcvJykKLQkJcmV0dXJuIGV4cGFuZGVkOwotCWlmIChnZXRjd2QoY3dkLCBzaXplb2YoY3dkKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiBnZXRjd2Q6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JeGFzcHJpbnRmKCZyZXQsICIlcy8lcyIsIGN3ZCwgZXhwYW5kZWQpOwotCXhmcmVlKGV4cGFuZGVkKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZAotYWRkX2xpc3Rlbl9hZGRyKFNlcnZlck9wdGlvbnMgKm9wdGlvbnMsIGNoYXIgKmFkZHIsIGludCBwb3J0KQotewotCXVfaW50IGk7Ci0KLQlpZiAob3B0aW9ucy0+bnVtX3BvcnRzID09IDApCi0JCW9wdGlvbnMtPnBvcnRzW29wdGlvbnMtPm51bV9wb3J0cysrXSA9IFNTSF9ERUZBVUxUX1BPUlQ7Ci0JaWYgKG9wdGlvbnMtPmFkZHJlc3NfZmFtaWx5ID09IC0xKQotCQlvcHRpb25zLT5hZGRyZXNzX2ZhbWlseSA9IEFGX1VOU1BFQzsKLQlpZiAocG9ydCA9PSAwKQotCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy0+bnVtX3BvcnRzOyBpKyspCi0JCQlhZGRfb25lX2xpc3Rlbl9hZGRyKG9wdGlvbnMsIGFkZHIsIG9wdGlvbnMtPnBvcnRzW2ldKTsKLQllbHNlCi0JCWFkZF9vbmVfbGlzdGVuX2FkZHIob3B0aW9ucywgYWRkciwgcG9ydCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGRfb25lX2xpc3Rlbl9hZGRyKFNlcnZlck9wdGlvbnMgKm9wdGlvbnMsIGNoYXIgKmFkZHIsIGludCBwb3J0KQotewotCXN0cnVjdCBhZGRyaW5mbyBoaW50cywgKmFpLCAqYWl0b3A7Ci0JY2hhciBzdHJwb3J0W05JX01BWFNFUlZdOwotCWludCBnYWllcnI7Ci0KLQltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLQloaW50cy5haV9mYW1pbHkgPSBvcHRpb25zLT5hZGRyZXNzX2ZhbWlseTsKLQloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotCWhpbnRzLmFpX2ZsYWdzID0gKGFkZHIgPT0gTlVMTCkgPyBBSV9QQVNTSVZFIDogMDsKLQlzbnByaW50ZihzdHJwb3J0LCBzaXplb2Ygc3RycG9ydCwgIiVkIiwgcG9ydCk7Ci0JaWYgKChnYWllcnIgPSBnZXRhZGRyaW5mbyhhZGRyLCBzdHJwb3J0LCAmaGludHMsICZhaXRvcCkpICE9IDApCi0JCWZhdGFsKCJiYWQgYWRkciBvciBob3N0OiAlcyAoJXMpIiwKLQkJICAgIGFkZHIgPyBhZGRyIDogIjxOVUxMPiIsCi0JCSAgICBzc2hfZ2FpX3N0cmVycm9yKGdhaWVycikpOwotCWZvciAoYWkgPSBhaXRvcDsgYWktPmFpX25leHQ7IGFpID0gYWktPmFpX25leHQpCi0JCTsKLQlhaS0+YWlfbmV4dCA9IG9wdGlvbnMtPmxpc3Rlbl9hZGRyczsKLQlvcHRpb25zLT5saXN0ZW5fYWRkcnMgPSBhaXRvcDsKLX0KLQotLyoKLSAqIFRoZSBzdHJhdGVneSBmb3IgdGhlIE1hdGNoIGJsb2NrcyBpcyB0aGF0IHRoZSBjb25maWcgZmlsZSBpcyBwYXJzZWQgdHdpY2UuCi0gKgotICogVGhlIGZpcnN0IHRpbWUgaXMgYXQgc3RhcnR1cC4gIGFjdGl2ZXAgaXMgaW5pdGlhbGl6ZWQgdG8gMSBhbmQgdGhlCi0gKiBkaXJlY3RpdmVzIGluIHRoZSBnbG9iYWwgY29udGV4dCBhcmUgcHJvY2Vzc2VkIGFuZCBhY3RlZCBvbi4gIEhpdHRpbmcgYQotICogTWF0Y2ggZGlyZWN0aXZlIHVuc2V0cyBhY3RpdmVwIGFuZCB0aGUgZGlyZWN0aXZlcyBpbnNpZGUgdGhlIGJsb2NrIGFyZQotICogY2hlY2tlZCBmb3Igc3ludGF4IG9ubHkuCi0gKgotICogVGhlIHNlY29uZCB0aW1lIGlzIGFmdGVyIGEgY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZCBidXQgYmVmb3JlCi0gKiBhdXRoZW50aWNhdGlvbi4gIGFjdGl2ZXAgaXMgaW5pdGlhbGl6ZWQgdG8gMiBhbmQgZ2xvYmFsIGNvbmZpZyBkaXJlY3RpdmVzCi0gKiBhcmUgaWdub3JlZCBzaW5jZSB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZC4gIElmIHRoZSBjcml0ZXJpYSBpbiBhCi0gKiBNYXRjaCBibG9jayBpcyBtZXQsIGFjdGl2ZXAgaXMgc2V0IGFuZCB0aGUgc3Vic2VxdWVudCBkaXJlY3RpdmVzCi0gKiBwcm9jZXNzZWQgYW5kIGFjdGlvbmVkIHVudGlsIEVPRiBvciBhbm90aGVyIE1hdGNoIGJsb2NrIHVuc2V0cyBpdC4gIEFueQotICogb3B0aW9ucyBzZXQgYXJlIGNvcGllZCBpbnRvIHRoZSBtYWluIHNlcnZlciBjb25maWcuCi0gKgotICogUG90ZW50aWFsIGFkZGl0aW9ucy9pbXByb3ZlbWVudHM6Ci0gKiAgLSBBZGQgTWF0Y2ggc3VwcG9ydCBmb3IgcHJlLWtleCBkaXJlY3RpdmVzLCBlZyBQcm90b2NvbCwgQ2lwaGVycy4KLSAqCi0gKiAgLSBBZGQgYSBUYWcgZGlyZWN0aXZlIChpZGVhIGZyb20gRGF2aWQgTGVvbmFyZCkgYWxhIHBmLCBlZzoKLSAqCU1hdGNoIEFkZHJlc3MgMTkyLjE2OC4wLioKLSAqCQlUYWcgdHJ1c3RlZAotICoJTWF0Y2ggR3JvdXAgd2hlZWwKLSAqCQlUYWcgdHJ1c3RlZAotICoJTWF0Y2ggVGFnIHRydXN0ZWQKLSAqCQlBbGxvd1RjcEZvcndhcmRpbmcgeWVzCi0gKgkJR2F0ZXdheVBvcnRzIGNsaWVudHNwZWNpZmllZAotICoJCVsuLi5dCi0gKgotICogIC0gQWRkIGEgUGVybWl0dGVkQ2hhbm5lbFJlcXVlc3RzIGRpcmVjdGl2ZQotICoJTWF0Y2ggR3JvdXAgc2hlbGwKLSAqCQlQZXJtaXR0ZWRDaGFubmVsUmVxdWVzdHMgc2Vzc2lvbixmb3J3YXJkZWQtdGNwaXAKLSAqLwotCi1zdGF0aWMgaW50Ci1tYXRjaF9jZmdfbGluZV9ncm91cChjb25zdCBjaGFyICpncnBzLCBpbnQgbGluZSwgY29uc3QgY2hhciAqdXNlcikKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgcGFzc3dkICpwdzsKLQotCWlmICh1c2VyID09IE5VTEwpCi0JCWdvdG8gb3V0OwotCi0JaWYgKChwdyA9IGdldHB3bmFtKHVzZXIpKSA9PSBOVUxMKSB7Ci0JCWRlYnVnKCJDYW4ndCBtYXRjaCBncm91cCBhdCBsaW5lICVkIGJlY2F1c2UgdXNlciAlLjEwMHMgZG9lcyAiCi0JCSAgICAibm90IGV4aXN0IiwgbGluZSwgdXNlcik7Ci0JfSBlbHNlIGlmIChnYV9pbml0KHB3LT5wd19uYW1lLCBwdy0+cHdfZ2lkKSA9PSAwKSB7Ci0JCWRlYnVnKCJDYW4ndCBNYXRjaCBncm91cCBiZWNhdXNlIHVzZXIgJS4xMDBzIG5vdCBpbiBhbnkgZ3JvdXAgIgotCQkgICAgImF0IGxpbmUgJWQiLCB1c2VyLCBsaW5lKTsKLQl9IGVsc2UgaWYgKGdhX21hdGNoX3BhdHRlcm5fbGlzdChncnBzKSAhPSAxKSB7Ci0JCWRlYnVnKCJ1c2VyICUuMTAwcyBkb2VzIG5vdCBtYXRjaCBncm91cCBsaXN0ICUuMTAwcyBhdCBsaW5lICVkIiwKLQkJICAgIHVzZXIsIGdycHMsIGxpbmUpOwotCX0gZWxzZSB7Ci0JCWRlYnVnKCJ1c2VyICUuMTAwcyBtYXRjaGVkIGdyb3VwIGxpc3QgJS4xMDBzIGF0IGxpbmUgJWQiLCB1c2VyLAotCQkgICAgZ3JwcywgbGluZSk7Ci0JCXJlc3VsdCA9IDE7Ci0JfQotb3V0OgotCWdhX2ZyZWUoKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50Ci1tYXRjaF9jZmdfbGluZShjaGFyICoqY29uZGl0aW9uLCBpbnQgbGluZSwgY29uc3QgY2hhciAqdXNlciwgY29uc3QgY2hhciAqaG9zdCwKLSAgICBjb25zdCBjaGFyICphZGRyZXNzKQotewotCWludCByZXN1bHQgPSAxOwotCWNoYXIgKmFyZywgKmF0dHJpYiwgKmNwID0gKmNvbmRpdGlvbjsKLQlzaXplX3QgbGVuOwotCi0JaWYgKHVzZXIgPT0gTlVMTCkKLQkJZGVidWczKCJjaGVja2luZyBzeW50YXggZm9yICdNYXRjaCAlcyciLCBjcCk7Ci0JZWxzZQotCQlkZWJ1ZzMoImNoZWNraW5nIG1hdGNoIGZvciAnJXMnIHVzZXIgJXMgaG9zdCAlcyBhZGRyICVzIiwgY3AsCi0JCSAgICB1c2VyID8gdXNlciA6ICIobnVsbCkiLCBob3N0ID8gaG9zdCA6ICIobnVsbCkiLAotCQkgICAgYWRkcmVzcyA/IGFkZHJlc3MgOiAiKG51bGwpIik7Ci0KLQl3aGlsZSAoKGF0dHJpYiA9IHN0cmRlbGltKCZjcCkpICYmICphdHRyaWIgIT0gJ1wwJykgewotCQlpZiAoKGFyZyA9IHN0cmRlbGltKCZjcCkpID09IE5VTEwgfHwgKmFyZyA9PSAnXDAnKSB7Ci0JCQllcnJvcigiTWlzc2luZyBNYXRjaCBjcml0ZXJpYSBmb3IgJXMiLCBhdHRyaWIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWxlbiA9IHN0cmxlbihhcmcpOwotCQlpZiAoc3RyY2FzZWNtcChhdHRyaWIsICJ1c2VyIikgPT0gMCkgewotCQkJaWYgKCF1c2VyKSB7Ci0JCQkJcmVzdWx0ID0gMDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChtYXRjaF9wYXR0ZXJuX2xpc3QodXNlciwgYXJnLCBsZW4sIDApICE9IDEpCi0JCQkJcmVzdWx0ID0gMDsKLQkJCWVsc2UKLQkJCQlkZWJ1ZygidXNlciAlLjEwMHMgbWF0Y2hlZCAnVXNlciAlLjEwMHMnIGF0ICIKLQkJCQkgICAgImxpbmUgJWQiLCB1c2VyLCBhcmcsIGxpbmUpOwotCQl9IGVsc2UgaWYgKHN0cmNhc2VjbXAoYXR0cmliLCAiZ3JvdXAiKSA9PSAwKSB7Ci0JCQlzd2l0Y2ggKG1hdGNoX2NmZ19saW5lX2dyb3VwKGFyZywgbGluZSwgdXNlcikpIHsKLQkJCWNhc2UgLTE6Ci0JCQkJcmV0dXJuIC0xOwotCQkJY2FzZSAwOgotCQkJCXJlc3VsdCA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChhdHRyaWIsICJob3N0IikgPT0gMCkgewotCQkJaWYgKCFob3N0KSB7Ci0JCQkJcmVzdWx0ID0gMDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChtYXRjaF9ob3N0bmFtZShob3N0LCBhcmcsIGxlbikgIT0gMSkKLQkJCQlyZXN1bHQgPSAwOwotCQkJZWxzZQotCQkJCWRlYnVnKCJjb25uZWN0aW9uIGZyb20gJS4xMDBzIG1hdGNoZWQgJ0hvc3QgIgotCQkJCSAgICAiJS4xMDBzJyBhdCBsaW5lICVkIiwgaG9zdCwgYXJnLCBsaW5lKTsKLQkJfSBlbHNlIGlmIChzdHJjYXNlY21wKGF0dHJpYiwgImFkZHJlc3MiKSA9PSAwKSB7Ci0JCQlzd2l0Y2ggKGFkZHJfbWF0Y2hfbGlzdChhZGRyZXNzLCBhcmcpKSB7Ci0JCQljYXNlIDE6Ci0JCQkJZGVidWcoImNvbm5lY3Rpb24gZnJvbSAlLjEwMHMgbWF0Y2hlZCAnQWRkcmVzcyAiCi0JCQkJICAgICIlLjEwMHMnIGF0IGxpbmUgJWQiLCBhZGRyZXNzLCBhcmcsIGxpbmUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAwOgotCQkJY2FzZSAtMToKLQkJCQlyZXN1bHQgPSAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSAtMjoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQllcnJvcigiVW5zdXBwb3J0ZWQgTWF0Y2ggYXR0cmlidXRlICVzIiwgYXR0cmliKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlpZiAodXNlciAhPSBOVUxMKQotCQlkZWJ1ZzMoIm1hdGNoICVzZm91bmQiLCByZXN1bHQgPyAiIiA6ICJub3QgIik7Ci0JKmNvbmRpdGlvbiA9IGNwOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLSNkZWZpbmUgV0hJVEVTUEFDRSAiIFx0XHJcbiIKLQotLyogTXVsdGlzdGF0ZSBvcHRpb24gcGFyc2luZyAqLwotc3RydWN0IG11bHRpc3RhdGUgewotCWNoYXIgKmtleTsKLQlpbnQgdmFsdWU7Ci19Owotc3RhdGljIGNvbnN0IHN0cnVjdCBtdWx0aXN0YXRlIG11bHRpc3RhdGVfYWRkcmVzc2ZhbWlseVtdID0gewotCXsgImluZXQiLAkJCUFGX0lORVQgfSwKLQl7ICJpbmV0NiIsCQkJQUZfSU5FVDYgfSwKLQl7ICJhbnkiLAkJCUFGX1VOU1BFQyB9LAotCXsgTlVMTCwgLTEgfQotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbXVsdGlzdGF0ZSBtdWx0aXN0YXRlX3Blcm1pdHJvb3Rsb2dpbltdID0gewotCXsgIndpdGhvdXQtcGFzc3dvcmQiLAkJUEVSTUlUX05PX1BBU1NXRCB9LAotCXsgImZvcmNlZC1jb21tYW5kcy1vbmx5IiwJUEVSTUlUX0ZPUkNFRF9PTkxZIH0sCi0JeyAieWVzIiwJCQlQRVJNSVRfWUVTIH0sCi0JeyAibm8iLAkJCQlQRVJNSVRfTk8gfSwKLQl7IE5VTEwsIC0xIH0KLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IG11bHRpc3RhdGUgbXVsdGlzdGF0ZV9jb21wcmVzc2lvbltdID0gewotCXsgImRlbGF5ZWQiLAkJCUNPTVBfREVMQVlFRCB9LAotCXsgInllcyIsCQkJQ09NUF9aTElCIH0sCi0JeyAibm8iLAkJCQlDT01QX05PTkUgfSwKLQl7IE5VTEwsIC0xIH0KLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IG11bHRpc3RhdGUgbXVsdGlzdGF0ZV9nYXRld2F5cG9ydHNbXSA9IHsKLQl7ICJjbGllbnRzcGVjaWZpZWQiLAkJMiB9LAotCXsgInllcyIsCQkJMSB9LAotCXsgIm5vIiwJCQkJMCB9LAotCXsgTlVMTCwgLTEgfQotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbXVsdGlzdGF0ZSBtdWx0aXN0YXRlX3ByaXZzZXBbXSA9IHsKLQl7ICJzYW5kYm94IiwJCQlQUklWU0VQX1NBTkRCT1ggfSwKLQl7ICJ5ZXMiLAkJCVBSSVZTRVBfT04gfSwKLQl7ICJubyIsCQkJCVBSSVZTRVBfT0ZGIH0sCi0JeyBOVUxMLCAtMSB9Ci19OwotCi1pbnQKLXByb2Nlc3Nfc2VydmVyX2NvbmZpZ19saW5lKFNlcnZlck9wdGlvbnMgKm9wdGlvbnMsIGNoYXIgKmxpbmUsCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbnVtLCBpbnQgKmFjdGl2ZXAsIGNvbnN0IGNoYXIgKnVzZXIsCi0gICAgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqYWRkcmVzcykKLXsKLQljaGFyICpjcCwgKipjaGFycHRyLCAqYXJnLCAqcDsKLQlpbnQgY21kbGluZSA9IDAsICppbnRwdHIsIHZhbHVlLCB2YWx1ZTIsIG47Ci0JU3lzbG9nRmFjaWxpdHkgKmxvZ19mYWNpbGl0eV9wdHI7Ci0JTG9nTGV2ZWwgKmxvZ19sZXZlbF9wdHI7Ci0JU2VydmVyT3BDb2RlcyBvcGNvZGU7Ci0JaW50IHBvcnQ7Ci0JdV9pbnQgaSwgZmxhZ3MgPSAwOwotCXNpemVfdCBsZW47Ci0JY29uc3Qgc3RydWN0IG11bHRpc3RhdGUgKm11bHRpc3RhdGVfcHRyOwotCi0JY3AgPSBsaW5lOwotCWlmICgoYXJnID0gc3RyZGVsaW0oJmNwKSkgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JLyogSWdub3JlIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotCWlmICgqYXJnID09ICdcMCcpCi0JCWFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JaWYgKCFhcmcgfHwgISphcmcgfHwgKmFyZyA9PSAnIycpCi0JCXJldHVybiAwOwotCWludHB0ciA9IE5VTEw7Ci0JY2hhcnB0ciA9IE5VTEw7Ci0Jb3Bjb2RlID0gcGFyc2VfdG9rZW4oYXJnLCBmaWxlbmFtZSwgbGluZW51bSwgJmZsYWdzKTsKLQotCWlmIChhY3RpdmVwID09IE5VTEwpIHsgLyogV2UgYXJlIHByb2Nlc3NpbmcgYSBjb21tYW5kIGxpbmUgZGlyZWN0aXZlICovCi0JCWNtZGxpbmUgPSAxOwotCQlhY3RpdmVwID0gJmNtZGxpbmU7Ci0JfQotCWlmICgqYWN0aXZlcCAmJiBvcGNvZGUgIT0gc01hdGNoKQotCQlkZWJ1ZzMoIiVzOiVkIHNldHRpbmcgJXMgJXMiLCBmaWxlbmFtZSwgbGluZW51bSwgYXJnLCBjcCk7Ci0JaWYgKCphY3RpdmVwID09IDAgJiYgIShmbGFncyAmIFNTSENGR19NQVRDSCkpIHsKLQkJaWYgKHVzZXIgPT0gTlVMTCkgewotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IERpcmVjdGl2ZSAnJXMnIGlzIG5vdCBhbGxvd2VkICIKLQkJCSAgICAid2l0aGluIGEgTWF0Y2ggYmxvY2siLCBmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKLQkJfSBlbHNlIHsgLyogdGhpcyBpcyBhIGRpcmVjdGl2ZSB3ZSBoYXZlIGFscmVhZHkgcHJvY2Vzc2VkICovCi0JCQl3aGlsZSAoYXJnKQotCQkJCWFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JLyogUG9ydGFibGUtc3BlY2lmaWMgb3B0aW9ucyAqLwotCWNhc2Ugc1VzZVBBTToKLQkJaW50cHRyID0gJm9wdGlvbnMtPnVzZV9wYW07Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCS8qIFN0YW5kYXJkIE9wdGlvbnMgKi8KLQljYXNlIHNCYWRPcHRpb246Ci0JCXJldHVybiAtMTsKLQljYXNlIHNQb3J0OgotCQkvKiBpZ25vcmUgcG9ydHMgZnJvbSBjb25maWdmaWxlIGlmIGNtZGxpbmUgc3BlY2lmaWVzIHBvcnRzICovCi0JCWlmIChvcHRpb25zLT5wb3J0c19mcm9tX2NtZGxpbmUpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKG9wdGlvbnMtPmxpc3Rlbl9hZGRycyAhPSBOVUxMKQotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IHBvcnRzIG11c3QgYmUgc3BlY2lmaWVkIGJlZm9yZSAiCi0JCQkgICAgIkxpc3RlbkFkZHJlc3MuIiwgZmlsZW5hbWUsIGxpbmVudW0pOwotCQlpZiAob3B0aW9ucy0+bnVtX3BvcnRzID49IE1BWF9QT1JUUykKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiB0b28gbWFueSBwb3J0cy4iLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJYXJnID0gc3RyZGVsaW0oJmNwKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IG1pc3NpbmcgcG9ydCBudW1iZXIuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCW9wdGlvbnMtPnBvcnRzW29wdGlvbnMtPm51bV9wb3J0cysrXSA9IGEycG9ydChhcmcpOwotCQlpZiAob3B0aW9ucy0+cG9ydHNbb3B0aW9ucy0+bnVtX3BvcnRzLTFdIDw9IDApCi0JCQlmYXRhbCgiJXMgbGluZSAlZDogQmFkbHkgZm9ybWF0dGVkIHBvcnQgbnVtYmVyLiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCQlicmVhazsKLQotCWNhc2Ugc1NlcnZlcktleUJpdHM6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5zZXJ2ZXJfa2V5X2JpdHM7Ci0gcGFyc2VfaW50OgotCQlhcmcgPSBzdHJkZWxpbSgmY3ApOwotCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCi0JCQlmYXRhbCgiJXMgbGluZSAlZDogbWlzc2luZyBpbnRlZ2VyIHZhbHVlLiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCQl2YWx1ZSA9IGF0b2koYXJnKTsKLQkJaWYgKCphY3RpdmVwICYmICppbnRwdHIgPT0gLTEpCi0JCQkqaW50cHRyID0gdmFsdWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBzTG9naW5HcmFjZVRpbWU6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5sb2dpbl9ncmFjZV90aW1lOwotIHBhcnNlX3RpbWU6Ci0JCWFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBtaXNzaW5nIHRpbWUgdmFsdWUuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWlmICgodmFsdWUgPSBjb252dGltZShhcmcpKSA9PSAtMSkKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBpbnZhbGlkIHRpbWUgdmFsdWUuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWlmICgqaW50cHRyID09IC0xKQotCQkJKmludHB0ciA9IHZhbHVlOwotCQlicmVhazsKLQotCWNhc2Ugc0tleVJlZ2VuZXJhdGlvblRpbWU6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5rZXlfcmVnZW5lcmF0aW9uX3RpbWU7Ci0JCWdvdG8gcGFyc2VfdGltZTsKLQotCWNhc2Ugc0xpc3RlbkFkZHJlc3M6Ci0JCWFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JCWlmIChhcmcgPT0gTlVMTCB8fCAqYXJnID09ICdcMCcpCi0JCQlmYXRhbCgiJXMgbGluZSAlZDogbWlzc2luZyBhZGRyZXNzIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCS8qIGNoZWNrIGZvciBiYXJlIElQdjYgYWRkcmVzczogbm8gIltdIiBhbmQgMiBvciBtb3JlICI6IiAqLwotCQlpZiAoc3RyY2hyKGFyZywgJ1snKSA9PSBOVUxMICYmIChwID0gc3RyY2hyKGFyZywgJzonKSkgIT0gTlVMTAotCQkgICAgJiYgc3RyY2hyKHArMSwgJzonKSAhPSBOVUxMKSB7Ci0JCQlhZGRfbGlzdGVuX2FkZHIob3B0aW9ucywgYXJnLCAwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXAgPSBocGRlbGltKCZhcmcpOwotCQlpZiAocCA9PSBOVUxMKQotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IGJhZCBhZGRyZXNzOnBvcnQgdXNhZ2UiLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJcCA9IGNsZWFuaG9zdG5hbWUocCk7Ci0JCWlmIChhcmcgPT0gTlVMTCkKLQkJCXBvcnQgPSAwOwotCQllbHNlIGlmICgocG9ydCA9IGEycG9ydChhcmcpKSA8PSAwKQotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IGJhZCBwb3J0IG51bWJlciIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQotCQlhZGRfbGlzdGVuX2FkZHIob3B0aW9ucywgcCwgcG9ydCk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIHNBZGRyZXNzRmFtaWx5OgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+YWRkcmVzc19mYW1pbHk7Ci0JCW11bHRpc3RhdGVfcHRyID0gbXVsdGlzdGF0ZV9hZGRyZXNzZmFtaWx5OwotCQlpZiAob3B0aW9ucy0+bGlzdGVuX2FkZHJzICE9IE5VTEwpCi0JCQlmYXRhbCgiJXMgbGluZSAlZDogYWRkcmVzcyBmYW1pbHkgbXVzdCBiZSBzcGVjaWZpZWQgIgotCQkJICAgICJiZWZvcmUgTGlzdGVuQWRkcmVzcy4iLCBmaWxlbmFtZSwgbGluZW51bSk7Ci0gcGFyc2VfbXVsdGlzdGF0ZToKLQkJYXJnID0gc3RyZGVsaW0oJmNwKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IG1pc3NpbmcgYXJndW1lbnQuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCXZhbHVlID0gLTE7Ci0JCWZvciAoaSA9IDA7IG11bHRpc3RhdGVfcHRyW2ldLmtleSAhPSBOVUxMOyBpKyspIHsKLQkJCWlmIChzdHJjYXNlY21wKGFyZywgbXVsdGlzdGF0ZV9wdHJbaV0ua2V5KSA9PSAwKSB7Ci0JCQkJdmFsdWUgPSBtdWx0aXN0YXRlX3B0cltpXS52YWx1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAodmFsdWUgPT0gLTEpCi0JCQlmYXRhbCgiJXMgbGluZSAlZDogdW5zdXBwb3J0ZWQgb3B0aW9uIFwiJXNcIi4iLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcpOwotCQlpZiAoKmFjdGl2ZXAgJiYgKmludHB0ciA9PSAtMSkKLQkJCSppbnRwdHIgPSB2YWx1ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIHNIb3N0S2V5RmlsZToKLQkJaW50cHRyID0gJm9wdGlvbnMtPm51bV9ob3N0X2tleV9maWxlczsKLQkJaWYgKCppbnRwdHIgPj0gTUFYX0hPU1RLRVlTKQotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IHRvbyBtYW55IGhvc3Qga2V5cyBzcGVjaWZpZWQgKG1heCAlZCkuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgTUFYX0hPU1RLRVlTKTsKLQkJY2hhcnB0ciA9ICZvcHRpb25zLT5ob3N0X2tleV9maWxlc1sqaW50cHRyXTsKLSBwYXJzZV9maWxlbmFtZToKLQkJYXJnID0gc3RyZGVsaW0oJmNwKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IG1pc3NpbmcgZmlsZSBuYW1lLiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCQlpZiAoKmFjdGl2ZXAgJiYgKmNoYXJwdHIgPT0gTlVMTCkgewotCQkJKmNoYXJwdHIgPSBkZXJlbGF0aXZpc2VfcGF0aChhcmcpOwotCQkJLyogaW5jcmVhc2Ugb3B0aW9uYWwgY291bnRlciAqLwotCQkJaWYgKGludHB0ciAhPSBOVUxMKQotCQkJCSppbnRwdHIgPSAqaW50cHRyICsgMTsKLQkJfQotCQlicmVhazsKLQotCWNhc2Ugc0hvc3RDZXJ0aWZpY2F0ZToKLQkJaW50cHRyID0gJm9wdGlvbnMtPm51bV9ob3N0X2NlcnRfZmlsZXM7Ci0JCWlmICgqaW50cHRyID49IE1BWF9IT1NUS0VZUykKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiB0b28gbWFueSBob3N0IGNlcnRpZmljYXRlcyAiCi0JCQkgICAgInNwZWNpZmllZCAobWF4ICVkKS4iLCBmaWxlbmFtZSwgbGluZW51bSwKLQkJCSAgICBNQVhfSE9TVENFUlRTKTsKLQkJY2hhcnB0ciA9ICZvcHRpb25zLT5ob3N0X2NlcnRfZmlsZXNbKmludHB0cl07Ci0JCWdvdG8gcGFyc2VfZmlsZW5hbWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBzUGlkRmlsZToKLQkJY2hhcnB0ciA9ICZvcHRpb25zLT5waWRfZmlsZTsKLQkJZ290byBwYXJzZV9maWxlbmFtZTsKLQotCWNhc2Ugc1Blcm1pdFJvb3RMb2dpbjoKLQkJaW50cHRyID0gJm9wdGlvbnMtPnBlcm1pdF9yb290X2xvZ2luOwotCQltdWx0aXN0YXRlX3B0ciA9IG11bHRpc3RhdGVfcGVybWl0cm9vdGxvZ2luOwotCQlnb3RvIHBhcnNlX211bHRpc3RhdGU7Ci0KLQljYXNlIHNJZ25vcmVSaG9zdHM6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5pZ25vcmVfcmhvc3RzOwotIHBhcnNlX2ZsYWc6Ci0JCWFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBtaXNzaW5nIHllcy9ubyBhcmd1bWVudC4iLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJdmFsdWUgPSAwOwkvKiBzaWxlbmNlIGNvbXBpbGVyICovCi0JCWlmIChzdHJjbXAoYXJnLCAieWVzIikgPT0gMCkKLQkJCXZhbHVlID0gMTsKLQkJZWxzZSBpZiAoc3RyY21wKGFyZywgIm5vIikgPT0gMCkKLQkJCXZhbHVlID0gMDsKLQkJZWxzZQotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IEJhZCB5ZXMvbm8gYXJndW1lbnQ6ICVzIiwKLQkJCQlmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKLQkJaWYgKCphY3RpdmVwICYmICppbnRwdHIgPT0gLTEpCi0JCQkqaW50cHRyID0gdmFsdWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBzSWdub3JlVXNlcktub3duSG9zdHM6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5pZ25vcmVfdXNlcl9rbm93bl9ob3N0czsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzUmhvc3RzUlNBQXV0aGVudGljYXRpb246Ci0JCWludHB0ciA9ICZvcHRpb25zLT5yaG9zdHNfcnNhX2F1dGhlbnRpY2F0aW9uOwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIHNIb3N0YmFzZWRBdXRoZW50aWNhdGlvbjoKLQkJaW50cHRyID0gJm9wdGlvbnMtPmhvc3RiYXNlZF9hdXRoZW50aWNhdGlvbjsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzSG9zdGJhc2VkVXNlc05hbWVGcm9tUGFja2V0T25seToKLQkJaW50cHRyID0gJm9wdGlvbnMtPmhvc3RiYXNlZF91c2VzX25hbWVfZnJvbV9wYWNrZXRfb25seTsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzUlNBQXV0aGVudGljYXRpb246Ci0JCWludHB0ciA9ICZvcHRpb25zLT5yc2FfYXV0aGVudGljYXRpb247Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugc1B1YmtleUF1dGhlbnRpY2F0aW9uOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+cHVia2V5X2F1dGhlbnRpY2F0aW9uOwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIHNLZXJiZXJvc0F1dGhlbnRpY2F0aW9uOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+a2VyYmVyb3NfYXV0aGVudGljYXRpb247Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugc0tlcmJlcm9zT3JMb2NhbFBhc3N3ZDoKLQkJaW50cHRyID0gJm9wdGlvbnMtPmtlcmJlcm9zX29yX2xvY2FsX3Bhc3N3ZDsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzS2VyYmVyb3NUaWNrZXRDbGVhbnVwOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+a2VyYmVyb3NfdGlja2V0X2NsZWFudXA7Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugc0tlcmJlcm9zR2V0QUZTVG9rZW46Ci0JCWludHB0ciA9ICZvcHRpb25zLT5rZXJiZXJvc19nZXRfYWZzX3Rva2VuOwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIHNHc3NBdXRoZW50aWNhdGlvbjoKLQkJaW50cHRyID0gJm9wdGlvbnMtPmdzc19hdXRoZW50aWNhdGlvbjsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzR3NzQ2xlYW51cENyZWRzOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+Z3NzX2NsZWFudXBfY3JlZHM7Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugc1Bhc3N3b3JkQXV0aGVudGljYXRpb246Ci0JCWludHB0ciA9ICZvcHRpb25zLT5wYXNzd29yZF9hdXRoZW50aWNhdGlvbjsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzWmVyb0tub3dsZWRnZVBhc3N3b3JkQXV0aGVudGljYXRpb246Ci0JCWludHB0ciA9ICZvcHRpb25zLT56ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbjsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzS2JkSW50ZXJhY3RpdmVBdXRoZW50aWNhdGlvbjoKLQkJaW50cHRyID0gJm9wdGlvbnMtPmtiZF9pbnRlcmFjdGl2ZV9hdXRoZW50aWNhdGlvbjsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbjoKLQkJaW50cHRyID0gJm9wdGlvbnMtPmNoYWxsZW5nZV9yZXNwb25zZV9hdXRoZW50aWNhdGlvbjsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzUHJpbnRNb3RkOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+cHJpbnRfbW90ZDsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzUHJpbnRMYXN0TG9nOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+cHJpbnRfbGFzdGxvZzsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzWDExRm9yd2FyZGluZzoKLQkJaW50cHRyID0gJm9wdGlvbnMtPngxMV9mb3J3YXJkaW5nOwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIHNYMTFEaXNwbGF5T2Zmc2V0OgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+eDExX2Rpc3BsYXlfb2Zmc2V0OwotCQlnb3RvIHBhcnNlX2ludDsKLQotCWNhc2Ugc1gxMVVzZUxvY2FsaG9zdDoKLQkJaW50cHRyID0gJm9wdGlvbnMtPngxMV91c2VfbG9jYWxob3N0OwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIHNYQXV0aExvY2F0aW9uOgotCQljaGFycHRyID0gJm9wdGlvbnMtPnhhdXRoX2xvY2F0aW9uOwotCQlnb3RvIHBhcnNlX2ZpbGVuYW1lOwotCi0JY2FzZSBzU3RyaWN0TW9kZXM6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5zdHJpY3RfbW9kZXM7Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugc1RDUEtlZXBBbGl2ZToKLQkJaW50cHRyID0gJm9wdGlvbnMtPnRjcF9rZWVwX2FsaXZlOwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIHNFbXB0eVBhc3N3ZDoKLQkJaW50cHRyID0gJm9wdGlvbnMtPnBlcm1pdF9lbXB0eV9wYXNzd2Q7Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugc1Blcm1pdFVzZXJFbnZpcm9ubWVudDoKLQkJaW50cHRyID0gJm9wdGlvbnMtPnBlcm1pdF91c2VyX2VudjsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzVXNlTG9naW46Ci0JCWludHB0ciA9ICZvcHRpb25zLT51c2VfbG9naW47Ci0JCWdvdG8gcGFyc2VfZmxhZzsKLQotCWNhc2Ugc0NvbXByZXNzaW9uOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+Y29tcHJlc3Npb247Ci0JCW11bHRpc3RhdGVfcHRyID0gbXVsdGlzdGF0ZV9jb21wcmVzc2lvbjsKLQkJZ290byBwYXJzZV9tdWx0aXN0YXRlOwotCi0JY2FzZSBzR2F0ZXdheVBvcnRzOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+Z2F0ZXdheV9wb3J0czsKLQkJbXVsdGlzdGF0ZV9wdHIgPSBtdWx0aXN0YXRlX2dhdGV3YXlwb3J0czsKLQkJZ290byBwYXJzZV9tdWx0aXN0YXRlOwotCi0JY2FzZSBzVXNlRE5TOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+dXNlX2RuczsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzTG9nRmFjaWxpdHk6Ci0JCWxvZ19mYWNpbGl0eV9wdHIgPSAmb3B0aW9ucy0+bG9nX2ZhY2lsaXR5OwotCQlhcmcgPSBzdHJkZWxpbSgmY3ApOwotCQl2YWx1ZSA9IGxvZ19mYWNpbGl0eV9udW1iZXIoYXJnKTsKLQkJaWYgKHZhbHVlID09IFNZU0xPR19GQUNJTElUWV9OT1RfU0VUKQotCQkJZmF0YWwoIiUuMjAwcyBsaW5lICVkOiB1bnN1cHBvcnRlZCBsb2cgZmFjaWxpdHkgJyVzJyIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyA/IGFyZyA6ICI8Tk9ORT4iKTsKLQkJaWYgKCpsb2dfZmFjaWxpdHlfcHRyID09IC0xKQotCQkJKmxvZ19mYWNpbGl0eV9wdHIgPSAoU3lzbG9nRmFjaWxpdHkpIHZhbHVlOwotCQlicmVhazsKLQotCWNhc2Ugc0xvZ0xldmVsOgotCQlsb2dfbGV2ZWxfcHRyID0gJm9wdGlvbnMtPmxvZ19sZXZlbDsKLQkJYXJnID0gc3RyZGVsaW0oJmNwKTsKLQkJdmFsdWUgPSBsb2dfbGV2ZWxfbnVtYmVyKGFyZyk7Ci0JCWlmICh2YWx1ZSA9PSBTWVNMT0dfTEVWRUxfTk9UX1NFVCkKLQkJCWZhdGFsKCIlLjIwMHMgbGluZSAlZDogdW5zdXBwb3J0ZWQgbG9nIGxldmVsICclcyciLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcgPyBhcmcgOiAiPE5PTkU+Iik7Ci0JCWlmICgqbG9nX2xldmVsX3B0ciA9PSAtMSkKLQkJCSpsb2dfbGV2ZWxfcHRyID0gKExvZ0xldmVsKSB2YWx1ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIHNBbGxvd1RjcEZvcndhcmRpbmc6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5hbGxvd190Y3BfZm9yd2FyZGluZzsKLQkJZ290byBwYXJzZV9mbGFnOwotCi0JY2FzZSBzQWxsb3dBZ2VudEZvcndhcmRpbmc6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5hbGxvd19hZ2VudF9mb3J3YXJkaW5nOwotCQlnb3RvIHBhcnNlX2ZsYWc7Ci0KLQljYXNlIHNVc2VQcml2aWxlZ2VTZXBhcmF0aW9uOgotCQlpbnRwdHIgPSAmdXNlX3ByaXZzZXA7Ci0JCW11bHRpc3RhdGVfcHRyID0gbXVsdGlzdGF0ZV9wcml2c2VwOwotCQlnb3RvIHBhcnNlX211bHRpc3RhdGU7Ci0KLQljYXNlIHNBbGxvd1VzZXJzOgotCQl3aGlsZSAoKGFyZyA9IHN0cmRlbGltKCZjcCkpICYmICphcmcgIT0gJ1wwJykgewotCQkJaWYgKG9wdGlvbnMtPm51bV9hbGxvd191c2VycyA+PSBNQVhfQUxMT1dfVVNFUlMpCi0JCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IHRvbyBtYW55IGFsbG93IHVzZXJzLiIsCi0JCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJCW9wdGlvbnMtPmFsbG93X3VzZXJzW29wdGlvbnMtPm51bV9hbGxvd191c2VycysrXSA9Ci0JCQkgICAgeHN0cmR1cChhcmcpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBzRGVueVVzZXJzOgotCQl3aGlsZSAoKGFyZyA9IHN0cmRlbGltKCZjcCkpICYmICphcmcgIT0gJ1wwJykgewotCQkJaWYgKG9wdGlvbnMtPm51bV9kZW55X3VzZXJzID49IE1BWF9ERU5ZX1VTRVJTKQotCQkJCWZhdGFsKCIlcyBsaW5lICVkOiB0b28gbWFueSBkZW55IHVzZXJzLiIsCi0JCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJCW9wdGlvbnMtPmRlbnlfdXNlcnNbb3B0aW9ucy0+bnVtX2RlbnlfdXNlcnMrK10gPQotCQkJICAgIHhzdHJkdXAoYXJnKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2Ugc0FsbG93R3JvdXBzOgotCQl3aGlsZSAoKGFyZyA9IHN0cmRlbGltKCZjcCkpICYmICphcmcgIT0gJ1wwJykgewotCQkJaWYgKG9wdGlvbnMtPm51bV9hbGxvd19ncm91cHMgPj0gTUFYX0FMTE9XX0dST1VQUykKLQkJCQlmYXRhbCgiJXMgbGluZSAlZDogdG9vIG1hbnkgYWxsb3cgZ3JvdXBzLiIsCi0JCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJCW9wdGlvbnMtPmFsbG93X2dyb3Vwc1tvcHRpb25zLT5udW1fYWxsb3dfZ3JvdXBzKytdID0KLQkJCSAgICB4c3RyZHVwKGFyZyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIHNEZW55R3JvdXBzOgotCQl3aGlsZSAoKGFyZyA9IHN0cmRlbGltKCZjcCkpICYmICphcmcgIT0gJ1wwJykgewotCQkJaWYgKG9wdGlvbnMtPm51bV9kZW55X2dyb3VwcyA+PSBNQVhfREVOWV9HUk9VUFMpCi0JCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IHRvbyBtYW55IGRlbnkgZ3JvdXBzLiIsCi0JCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJCW9wdGlvbnMtPmRlbnlfZ3JvdXBzW29wdGlvbnMtPm51bV9kZW55X2dyb3VwcysrXSA9IHhzdHJkdXAoYXJnKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2Ugc0NpcGhlcnM6Ci0JCWFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJaWYgKCFjaXBoZXJzX3ZhbGlkKGFyZykpCi0JCQlmYXRhbCgiJXMgbGluZSAlZDogQmFkIFNTSDIgY2lwaGVyIHNwZWMgJyVzJy4iLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcgPyBhcmcgOiAiPE5PTkU+Iik7Ci0JCWlmIChvcHRpb25zLT5jaXBoZXJzID09IE5VTEwpCi0JCQlvcHRpb25zLT5jaXBoZXJzID0geHN0cmR1cChhcmcpOwotCQlicmVhazsKLQotCWNhc2Ugc01hY3M6Ci0JCWFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBNaXNzaW5nIGFyZ3VtZW50LiIsIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJaWYgKCFtYWNfdmFsaWQoYXJnKSkKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBCYWQgU1NIMiBtYWMgc3BlYyAnJXMnLiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyA/IGFyZyA6ICI8Tk9ORT4iKTsKLQkJaWYgKG9wdGlvbnMtPm1hY3MgPT0gTlVMTCkKLQkJCW9wdGlvbnMtPm1hY3MgPSB4c3RyZHVwKGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBzS2V4QWxnb3JpdGhtczoKLQkJYXJnID0gc3RyZGVsaW0oJmNwKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IE1pc3NpbmcgYXJndW1lbnQuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWlmICgha2V4X25hbWVzX3ZhbGlkKGFyZykpCi0JCQlmYXRhbCgiJXMgbGluZSAlZDogQmFkIFNTSDIgS2V4QWxnb3JpdGhtcyAnJXMnLiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyA/IGFyZyA6ICI8Tk9ORT4iKTsKLQkJaWYgKG9wdGlvbnMtPmtleF9hbGdvcml0aG1zID09IE5VTEwpCi0JCQlvcHRpb25zLT5rZXhfYWxnb3JpdGhtcyA9IHhzdHJkdXAoYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIHNQcm90b2NvbDoKLQkJaW50cHRyID0gJm9wdGlvbnMtPnByb3RvY29sOwotCQlhcmcgPSBzdHJkZWxpbSgmY3ApOwotCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCi0JCQlmYXRhbCgiJXMgbGluZSAlZDogTWlzc2luZyBhcmd1bWVudC4iLCBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCXZhbHVlID0gcHJvdG9fc3BlYyhhcmcpOwotCQlpZiAodmFsdWUgPT0gU1NIX1BST1RPX1VOS05PV04pCi0JCQlmYXRhbCgiJXMgbGluZSAlZDogQmFkIHByb3RvY29sIHNwZWMgJyVzJy4iLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcgPyBhcmcgOiAiPE5PTkU+Iik7Ci0JCWlmICgqaW50cHRyID09IFNTSF9QUk9UT19VTktOT1dOKQotCQkJKmludHB0ciA9IHZhbHVlOwotCQlicmVhazsKLQotCWNhc2Ugc1N1YnN5c3RlbToKLQkJaWYgKG9wdGlvbnMtPm51bV9zdWJzeXN0ZW1zID49IE1BWF9TVUJTWVNURU1TKSB7Ci0JCQlmYXRhbCgiJXMgbGluZSAlZDogdG9vIG1hbnkgc3Vic3lzdGVtcyBkZWZpbmVkLiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCQl9Ci0JCWFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBNaXNzaW5nIHN1YnN5c3RlbSBuYW1lLiIsCi0JCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCQlpZiAoISphY3RpdmVwKSB7Ci0JCQlhcmcgPSBzdHJkZWxpbSgmY3ApOwotCQkJYnJlYWs7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMtPm51bV9zdWJzeXN0ZW1zOyBpKyspCi0JCQlpZiAoc3RyY21wKGFyZywgb3B0aW9ucy0+c3Vic3lzdGVtX25hbWVbaV0pID09IDApCi0JCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IFN1YnN5c3RlbSAnJXMnIGFscmVhZHkgZGVmaW5lZC4iLAotCQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKLQkJb3B0aW9ucy0+c3Vic3lzdGVtX25hbWVbb3B0aW9ucy0+bnVtX3N1YnN5c3RlbXNdID0geHN0cmR1cChhcmcpOwotCQlhcmcgPSBzdHJkZWxpbSgmY3ApOwotCQlpZiAoIWFyZyB8fCAqYXJnID09ICdcMCcpCi0JCQlmYXRhbCgiJXMgbGluZSAlZDogTWlzc2luZyBzdWJzeXN0ZW0gY29tbWFuZC4iLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJb3B0aW9ucy0+c3Vic3lzdGVtX2NvbW1hbmRbb3B0aW9ucy0+bnVtX3N1YnN5c3RlbXNdID0geHN0cmR1cChhcmcpOwotCi0JCS8qIENvbGxlY3QgYXJndW1lbnRzIChzZXBhcmF0ZSB0byBleGVjdXRhYmxlKSAqLwotCQlwID0geHN0cmR1cChhcmcpOwotCQlsZW4gPSBzdHJsZW4ocCkgKyAxOwotCQl3aGlsZSAoKGFyZyA9IHN0cmRlbGltKCZjcCkpICE9IE5VTEwgJiYgKmFyZyAhPSAnXDAnKSB7Ci0JCQlsZW4gKz0gMSArIHN0cmxlbihhcmcpOwotCQkJcCA9IHhyZWFsbG9jKHAsIDEsIGxlbik7Ci0JCQlzdHJsY2F0KHAsICIgIiwgbGVuKTsKLQkJCXN0cmxjYXQocCwgYXJnLCBsZW4pOwotCQl9Ci0JCW9wdGlvbnMtPnN1YnN5c3RlbV9hcmdzW29wdGlvbnMtPm51bV9zdWJzeXN0ZW1zXSA9IHA7Ci0JCW9wdGlvbnMtPm51bV9zdWJzeXN0ZW1zKys7Ci0JCWJyZWFrOwotCi0JY2FzZSBzTWF4U3RhcnR1cHM6Ci0JCWFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBNaXNzaW5nIE1heFN0YXJ0dXBzIHNwZWMuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWlmICgobiA9IHNzY2FuZihhcmcsICIlZDolZDolZCIsCi0JCSAgICAmb3B0aW9ucy0+bWF4X3N0YXJ0dXBzX2JlZ2luLAotCQkgICAgJm9wdGlvbnMtPm1heF9zdGFydHVwc19yYXRlLAotCQkgICAgJm9wdGlvbnMtPm1heF9zdGFydHVwcykpID09IDMpIHsKLQkJCWlmIChvcHRpb25zLT5tYXhfc3RhcnR1cHNfYmVnaW4gPgotCQkJICAgIG9wdGlvbnMtPm1heF9zdGFydHVwcyB8fAotCQkJICAgIG9wdGlvbnMtPm1heF9zdGFydHVwc19yYXRlID4gMTAwIHx8Ci0JCQkgICAgb3B0aW9ucy0+bWF4X3N0YXJ0dXBzX3JhdGUgPCAxKQotCQkJCWZhdGFsKCIlcyBsaW5lICVkOiBJbGxlZ2FsIE1heFN0YXJ0dXBzIHNwZWMuIiwKLQkJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCQl9IGVsc2UgaWYgKG4gIT0gMSkKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBJbGxlZ2FsIE1heFN0YXJ0dXBzIHNwZWMuIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCWVsc2UKLQkJCW9wdGlvbnMtPm1heF9zdGFydHVwcyA9IG9wdGlvbnMtPm1heF9zdGFydHVwc19iZWdpbjsKLQkJYnJlYWs7Ci0KLQljYXNlIHNNYXhBdXRoVHJpZXM6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5tYXhfYXV0aHRyaWVzOwotCQlnb3RvIHBhcnNlX2ludDsKLQotCWNhc2Ugc01heFNlc3Npb25zOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+bWF4X3Nlc3Npb25zOwotCQlnb3RvIHBhcnNlX2ludDsKLQotCWNhc2Ugc0Jhbm5lcjoKLQkJY2hhcnB0ciA9ICZvcHRpb25zLT5iYW5uZXI7Ci0JCWdvdG8gcGFyc2VfZmlsZW5hbWU7Ci0KLQkvKgotCSAqIFRoZXNlIG9wdGlvbnMgY2FuIGNvbnRhaW4gJVggb3B0aW9ucyBleHBhbmRlZCBhdAotCSAqIGNvbm5lY3QgdGltZSwgc28gdGhhdCB5b3UgY2FuIHNwZWNpZnkgcGF0aHMgbGlrZToKLQkgKgotCSAqIEF1dGhvcml6ZWRLZXlzRmlsZQkvZXRjL3NzaF9rZXlzLyV1Ci0JICovCi0JY2FzZSBzQXV0aG9yaXplZEtleXNGaWxlOgotCQlpZiAoKmFjdGl2ZXAgJiYgb3B0aW9ucy0+bnVtX2F1dGhrZXlzX2ZpbGVzID09IDApIHsKLQkJCXdoaWxlICgoYXJnID0gc3RyZGVsaW0oJmNwKSkgJiYgKmFyZyAhPSAnXDAnKSB7Ci0JCQkJaWYgKG9wdGlvbnMtPm51bV9hdXRoa2V5c19maWxlcyA+PQotCQkJCSAgICBNQVhfQVVUSEtFWVNfRklMRVMpCi0JCQkJCWZhdGFsKCIlcyBsaW5lICVkOiAiCi0JCQkJCSAgICAidG9vIG1hbnkgYXV0aG9yaXplZCBrZXlzIGZpbGVzLiIsCi0JCQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCQkJb3B0aW9ucy0+YXV0aG9yaXplZF9rZXlzX2ZpbGVzWwotCQkJCSAgICBvcHRpb25zLT5udW1fYXV0aGtleXNfZmlsZXMrK10gPQotCQkJCSAgICB0aWxkZV9leHBhbmRfZmlsZW5hbWUoYXJnLCBnZXR1aWQoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0KLQljYXNlIHNBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGU6Ci0JCWNoYXJwdHIgPSAmb3B0aW9ucy0+YXV0aG9yaXplZF9wcmluY2lwYWxzX2ZpbGU7Ci0JCWFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBtaXNzaW5nIGZpbGUgbmFtZS4iLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJaWYgKCphY3RpdmVwICYmICpjaGFycHRyID09IE5VTEwpIHsKLQkJCSpjaGFycHRyID0gdGlsZGVfZXhwYW5kX2ZpbGVuYW1lKGFyZywgZ2V0dWlkKCkpOwotCQkJLyogaW5jcmVhc2Ugb3B0aW9uYWwgY291bnRlciAqLwotCQkJaWYgKGludHB0ciAhPSBOVUxMKQotCQkJCSppbnRwdHIgPSAqaW50cHRyICsgMTsKLQkJfQotCQlicmVhazsKLQotCWNhc2Ugc0NsaWVudEFsaXZlSW50ZXJ2YWw6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5jbGllbnRfYWxpdmVfaW50ZXJ2YWw7Ci0JCWdvdG8gcGFyc2VfdGltZTsKLQotCWNhc2Ugc0NsaWVudEFsaXZlQ291bnRNYXg6Ci0JCWludHB0ciA9ICZvcHRpb25zLT5jbGllbnRfYWxpdmVfY291bnRfbWF4OwotCQlnb3RvIHBhcnNlX2ludDsKLQotCWNhc2Ugc0FjY2VwdEVudjoKLQkJd2hpbGUgKChhcmcgPSBzdHJkZWxpbSgmY3ApKSAmJiAqYXJnICE9ICdcMCcpIHsKLQkJCWlmIChzdHJjaHIoYXJnLCAnPScpICE9IE5VTEwpCi0JCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IEludmFsaWQgZW52aXJvbm1lbnQgbmFtZS4iLAotCQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCQlpZiAob3B0aW9ucy0+bnVtX2FjY2VwdF9lbnYgPj0gTUFYX0FDQ0VQVF9FTlYpCi0JCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IHRvbyBtYW55IGFsbG93IGVudi4iLAotCQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCQlpZiAoISphY3RpdmVwKQotCQkJCWJyZWFrOwotCQkJb3B0aW9ucy0+YWNjZXB0X2VudltvcHRpb25zLT5udW1fYWNjZXB0X2VudisrXSA9Ci0JCQkgICAgeHN0cmR1cChhcmcpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBzUGVybWl0VHVubmVsOgotCQlpbnRwdHIgPSAmb3B0aW9ucy0+cGVybWl0X3R1bjsKLQkJYXJnID0gc3RyZGVsaW0oJmNwKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IE1pc3NpbmcgeWVzL3BvaW50LXRvLXBvaW50LyIKLQkJCSAgICAiZXRoZXJuZXQvbm8gYXJndW1lbnQuIiwgZmlsZW5hbWUsIGxpbmVudW0pOwotCQl2YWx1ZSA9IC0xOwotCQlmb3IgKGkgPSAwOyB0dW5tb2RlX2Rlc2NbaV0udmFsICE9IC0xOyBpKyspCi0JCQlpZiAoc3RyY21wKHR1bm1vZGVfZGVzY1tpXS50ZXh0LCBhcmcpID09IDApIHsKLQkJCQl2YWx1ZSA9IHR1bm1vZGVfZGVzY1tpXS52YWw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWlmICh2YWx1ZSA9PSAtMSkKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBCYWQgeWVzL3BvaW50LXRvLXBvaW50L2V0aGVybmV0LyIKLQkJCSAgICAibm8gYXJndW1lbnQ6ICVzIiwgZmlsZW5hbWUsIGxpbmVudW0sIGFyZyk7Ci0JCWlmICgqaW50cHRyID09IC0xKQotCQkJKmludHB0ciA9IHZhbHVlOwotCQlicmVhazsKLQotCWNhc2Ugc01hdGNoOgotCQlpZiAoY21kbGluZSkKLQkJCWZhdGFsKCJNYXRjaCBkaXJlY3RpdmUgbm90IHN1cHBvcnRlZCBhcyBhIGNvbW1hbmQtbGluZSAiCi0JCQkgICAib3B0aW9uIik7Ci0JCXZhbHVlID0gbWF0Y2hfY2ZnX2xpbmUoJmNwLCBsaW5lbnVtLCB1c2VyLCBob3N0LCBhZGRyZXNzKTsKLQkJaWYgKHZhbHVlIDwgMCkKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBCYWQgTWF0Y2ggY29uZGl0aW9uIiwgZmlsZW5hbWUsCi0JCQkgICAgbGluZW51bSk7Ci0JCSphY3RpdmVwID0gdmFsdWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBzUGVybWl0T3BlbjoKLQkJYXJnID0gc3RyZGVsaW0oJmNwKTsKLQkJaWYgKCFhcmcgfHwgKmFyZyA9PSAnXDAnKQotCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IG1pc3NpbmcgUGVybWl0T3BlbiBzcGVjaWZpY2F0aW9uIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCW4gPSBvcHRpb25zLT5udW1fcGVybWl0dGVkX29wZW5zOwkvKiBtb2RpZmllZCBsYXRlciAqLwotCQlpZiAoc3RyY21wKGFyZywgImFueSIpID09IDApIHsKLQkJCWlmICgqYWN0aXZlcCAmJiBuID09IC0xKSB7Ci0JCQkJY2hhbm5lbF9jbGVhcl9hZG1fcGVybWl0dGVkX29wZW5zKCk7Ci0JCQkJb3B0aW9ucy0+bnVtX3Blcm1pdHRlZF9vcGVucyA9IDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoKmFjdGl2ZXAgJiYgbiA9PSAtMSkKLQkJCWNoYW5uZWxfY2xlYXJfYWRtX3Blcm1pdHRlZF9vcGVucygpOwotCQlmb3IgKDsgYXJnICE9IE5VTEwgJiYgKmFyZyAhPSAnXDAnOyBhcmcgPSBzdHJkZWxpbSgmY3ApKSB7Ci0JCQlwID0gaHBkZWxpbSgmYXJnKTsKLQkJCWlmIChwID09IE5VTEwpCi0JCQkJZmF0YWwoIiVzIGxpbmUgJWQ6IG1pc3NpbmcgaG9zdCBpbiBQZXJtaXRPcGVuIiwKLQkJCQkgICAgZmlsZW5hbWUsIGxpbmVudW0pOwotCQkJcCA9IGNsZWFuaG9zdG5hbWUocCk7Ci0JCQlpZiAoYXJnID09IE5VTEwgfHwgKHBvcnQgPSBhMnBvcnQoYXJnKSkgPD0gMCkKLQkJCQlmYXRhbCgiJXMgbGluZSAlZDogYmFkIHBvcnQgbnVtYmVyIGluICIKLQkJCQkgICAgIlBlcm1pdE9wZW4iLCBmaWxlbmFtZSwgbGluZW51bSk7Ci0JCQlpZiAoKmFjdGl2ZXAgJiYgbiA9PSAtMSkKLQkJCQlvcHRpb25zLT5udW1fcGVybWl0dGVkX29wZW5zID0KLQkJCQkgICAgY2hhbm5lbF9hZGRfYWRtX3Blcm1pdHRlZF9vcGVucyhwLCBwb3J0KTsKLQkJfQotCQlicmVhazsKLQotCWNhc2Ugc0ZvcmNlQ29tbWFuZDoKLQkJaWYgKGNwID09IE5VTEwpCi0JCQlmYXRhbCgiJS4yMDBzIGxpbmUgJWQ6IE1pc3NpbmcgYXJndW1lbnQuIiwgZmlsZW5hbWUsCi0JCQkgICAgbGluZW51bSk7Ci0JCWxlbiA9IHN0cnNwbihjcCwgV0hJVEVTUEFDRSk7Ci0JCWlmICgqYWN0aXZlcCAmJiBvcHRpb25zLT5hZG1fZm9yY2VkX2NvbW1hbmQgPT0gTlVMTCkKLQkJCW9wdGlvbnMtPmFkbV9mb3JjZWRfY29tbWFuZCA9IHhzdHJkdXAoY3AgKyBsZW4pOwotCQlyZXR1cm4gMDsKLQotCWNhc2Ugc0Nocm9vdERpcmVjdG9yeToKLQkJY2hhcnB0ciA9ICZvcHRpb25zLT5jaHJvb3RfZGlyZWN0b3J5OwotCi0JCWFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JCWlmICghYXJnIHx8ICphcmcgPT0gJ1wwJykKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBtaXNzaW5nIGZpbGUgbmFtZS4iLAotCQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtKTsKLQkJaWYgKCphY3RpdmVwICYmICpjaGFycHRyID09IE5VTEwpCi0JCQkqY2hhcnB0ciA9IHhzdHJkdXAoYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIHNUcnVzdGVkVXNlckNBS2V5czoKLQkJY2hhcnB0ciA9ICZvcHRpb25zLT50cnVzdGVkX3VzZXJfY2Ffa2V5czsKLQkJZ290byBwYXJzZV9maWxlbmFtZTsKLQotCWNhc2Ugc1Jldm9rZWRLZXlzOgotCQljaGFycHRyID0gJm9wdGlvbnMtPnJldm9rZWRfa2V5c19maWxlOwotCQlnb3RvIHBhcnNlX2ZpbGVuYW1lOwotCi0JY2FzZSBzSVBRb1M6Ci0JCWFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JCWlmICgodmFsdWUgPSBwYXJzZV9pcHFvcyhhcmcpKSA9PSAtMSkKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBCYWQgSVBRb1MgdmFsdWU6ICVzIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKLQkJYXJnID0gc3RyZGVsaW0oJmNwKTsKLQkJaWYgKGFyZyA9PSBOVUxMKQotCQkJdmFsdWUyID0gdmFsdWU7Ci0JCWVsc2UgaWYgKCh2YWx1ZTIgPSBwYXJzZV9pcHFvcyhhcmcpKSA9PSAtMSkKLQkJCWZhdGFsKCIlcyBsaW5lICVkOiBCYWQgSVBRb1MgdmFsdWU6ICVzIiwKLQkJCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKLQkJaWYgKCphY3RpdmVwKSB7Ci0JCQlvcHRpb25zLT5pcF9xb3NfaW50ZXJhY3RpdmUgPSB2YWx1ZTsKLQkJCW9wdGlvbnMtPmlwX3Fvc19idWxrID0gdmFsdWUyOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBzRGVwcmVjYXRlZDoKLQkJbG9naXQoIiVzIGxpbmUgJWQ6IERlcHJlY2F0ZWQgb3B0aW9uICVzIiwKLQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcpOwotCQl3aGlsZSAoYXJnKQotCQkgICAgYXJnID0gc3RyZGVsaW0oJmNwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIHNVbnN1cHBvcnRlZDoKLQkJbG9naXQoIiVzIGxpbmUgJWQ6IFVuc3VwcG9ydGVkIG9wdGlvbiAlcyIsCi0JCSAgICBmaWxlbmFtZSwgbGluZW51bSwgYXJnKTsKLQkJd2hpbGUgKGFyZykKLQkJICAgIGFyZyA9IHN0cmRlbGltKCZjcCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZmF0YWwoIiVzIGxpbmUgJWQ6IE1pc3NpbmcgaGFuZGxlciBmb3Igb3Bjb2RlICVzICglZCkiLAotCQkgICAgZmlsZW5hbWUsIGxpbmVudW0sIGFyZywgb3Bjb2RlKTsKLQl9Ci0JaWYgKChhcmcgPSBzdHJkZWxpbSgmY3ApKSAhPSBOVUxMICYmICphcmcgIT0gJ1wwJykKLQkJZmF0YWwoIiVzIGxpbmUgJWQ6IGdhcmJhZ2UgYXQgZW5kIG9mIGxpbmU7IFwiJS4yMDBzXCIuIiwKLQkJICAgIGZpbGVuYW1lLCBsaW5lbnVtLCBhcmcpOwotCXJldHVybiAwOwotfQotCi0vKiBSZWFkcyB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZS4gKi8KLQotdm9pZAotbG9hZF9zZXJ2ZXJfY29uZmlnKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBCdWZmZXIgKmNvbmYpCi17Ci0JY2hhciBsaW5lWzEwMjRdLCAqY3A7Ci0JRklMRSAqZjsKLQotCWRlYnVnMigiJXM6IGZpbGVuYW1lICVzIiwgX19mdW5jX18sIGZpbGVuYW1lKTsKLQlpZiAoKGYgPSBmb3BlbihmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgewotCQlwZXJyb3IoZmlsZW5hbWUpOwotCQlleGl0KDEpOwotCX0KLQlidWZmZXJfY2xlYXIoY29uZik7Ci0Jd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKLQkJLyoKLQkJICogVHJpbSBvdXQgY29tbWVudHMgYW5kIHN0cmlwIHdoaXRlc3BhY2UKLQkJICogTkIgLSBwcmVzZXJ2ZSBuZXdsaW5lcywgdGhleSBhcmUgbmVlZGVkIHRvIHJlcHJvZHVjZQotCQkgKiBsaW5lIG51bWJlcnMgbGF0ZXIgZm9yIGVycm9yIG1lc3NhZ2VzCi0JCSAqLwotCQlpZiAoKGNwID0gc3RyY2hyKGxpbmUsICcjJykpICE9IE5VTEwpCi0JCQltZW1jcHkoY3AsICJcbiIsIDIpOwotCQljcCA9IGxpbmUgKyBzdHJzcG4obGluZSwgIiBcdFxyIik7Ci0KLQkJYnVmZmVyX2FwcGVuZChjb25mLCBjcCwgc3RybGVuKGNwKSk7Ci0JfQotCWJ1ZmZlcl9hcHBlbmQoY29uZiwgIlwwIiwgMSk7Ci0JZmNsb3NlKGYpOwotCWRlYnVnMigiJXM6IGRvbmUgY29uZmlnIGxlbiA9ICVkIiwgX19mdW5jX18sIGJ1ZmZlcl9sZW4oY29uZikpOwotfQotCi12b2lkCi1wYXJzZV9zZXJ2ZXJfbWF0Y2hfY29uZmlnKFNlcnZlck9wdGlvbnMgKm9wdGlvbnMsIGNvbnN0IGNoYXIgKnVzZXIsCi0gICAgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqYWRkcmVzcykKLXsKLQlTZXJ2ZXJPcHRpb25zIG1vOwotI2lmZGVmIEFORFJPSUQKLQljaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0jZW5kaWYKLQotCWluaXRpYWxpemVfc2VydmVyX29wdGlvbnMoJm1vKTsKLQlwYXJzZV9zZXJ2ZXJfY29uZmlnKCZtbywgInJlcHJvY2VzcyBjb25maWciLCAmY2ZnLCB1c2VyLCBob3N0LCBhZGRyZXNzKTsKLSNpZmRlZiBBTkRST0lECi0JLyogQWxsb3cgcm9vdCBsb2dpbiBpZiByby5kZWJ1Z2dhYmxlIGlzIHNldCAqLwotCXByb3BlcnR5X2dldCgicm8uZGVidWdnYWJsZSIsIHZhbHVlLCAiIik7Ci0JaWYgKHN0cmNtcCh2YWx1ZSwgIjEiKSA9PSAwKQotCQltby5wZXJtaXRfcm9vdF9sb2dpbiA9IFBFUk1JVF9ZRVM7Ci0jZW5kaWYKLQljb3B5X3NldF9zZXJ2ZXJfb3B0aW9ucyhvcHRpb25zLCAmbW8sIDApOwotfQotCi0vKiBIZWxwZXIgbWFjcm9zICovCi0jZGVmaW5lIE1fQ1BfSU5UT1BUKG4pIGRvIHtcCi0JaWYgKHNyYy0+biAhPSAtMSkgXAotCQlkc3QtPm4gPSBzcmMtPm47IFwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIE1fQ1BfU1RST1BUKG4pIGRvIHtcCi0JaWYgKHNyYy0+biAhPSBOVUxMKSB7IFwKLQkJaWYgKGRzdC0+biAhPSBOVUxMKSBcCi0JCQl4ZnJlZShkc3QtPm4pOyBcCi0JCWRzdC0+biA9IHNyYy0+bjsgXAotCX0gXAotfSB3aGlsZSgwKQotI2RlZmluZSBNX0NQX1NUUkFSUkFZT1BUKG4sIG51bV9uKSBkbyB7XAotCWlmIChzcmMtPm51bV9uICE9IDApIHsgXAotCQlmb3IgKGRzdC0+bnVtX24gPSAwOyBkc3QtPm51bV9uIDwgc3JjLT5udW1fbjsgZHN0LT5udW1fbisrKSBcCi0JCQlkc3QtPm5bZHN0LT5udW1fbl0gPSB4c3RyZHVwKHNyYy0+bltkc3QtPm51bV9uXSk7IFwKLQl9IFwKLX0gd2hpbGUoMCkKLQotLyoKLSAqIENvcHkgYW55IHN1cHBvcnRlZCB2YWx1ZXMgdGhhdCBhcmUgc2V0LgotICoKLSAqIElmIHRoZSBwcmVhdXRoIGZsYWcgaXMgc2V0LCB3ZSBkbyBub3QgYm90aGVyIGNvcHlpbmcgdGhlIHN0cmluZyBvcgotICogYXJyYXkgdmFsdWVzIHRoYXQgYXJlIG5vdCB1c2VkIHByZS1hdXRoZW50aWNhdGlvbiwgYmVjYXVzZSBhbnkgdGhhdCB3ZQotICogZG8gdXNlIG11c3QgYmUgZXhwbGljdGx5IHNlbnQgaW4gbW1fZ2V0cHduYW1hbGxvdygpLgotICovCi12b2lkCi1jb3B5X3NldF9zZXJ2ZXJfb3B0aW9ucyhTZXJ2ZXJPcHRpb25zICpkc3QsIFNlcnZlck9wdGlvbnMgKnNyYywgaW50IHByZWF1dGgpCi17Ci0JTV9DUF9JTlRPUFQocGFzc3dvcmRfYXV0aGVudGljYXRpb24pOwotCU1fQ1BfSU5UT1BUKGdzc19hdXRoZW50aWNhdGlvbik7Ci0JTV9DUF9JTlRPUFQocnNhX2F1dGhlbnRpY2F0aW9uKTsKLQlNX0NQX0lOVE9QVChwdWJrZXlfYXV0aGVudGljYXRpb24pOwotCU1fQ1BfSU5UT1BUKGtlcmJlcm9zX2F1dGhlbnRpY2F0aW9uKTsKLQlNX0NQX0lOVE9QVChob3N0YmFzZWRfYXV0aGVudGljYXRpb24pOwotCU1fQ1BfSU5UT1BUKGhvc3RiYXNlZF91c2VzX25hbWVfZnJvbV9wYWNrZXRfb25seSk7Ci0JTV9DUF9JTlRPUFQoa2JkX2ludGVyYWN0aXZlX2F1dGhlbnRpY2F0aW9uKTsKLQlNX0NQX0lOVE9QVCh6ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbik7Ci0JTV9DUF9JTlRPUFQocGVybWl0X3Jvb3RfbG9naW4pOwotCU1fQ1BfSU5UT1BUKHBlcm1pdF9lbXB0eV9wYXNzd2QpOwotCi0JTV9DUF9JTlRPUFQoYWxsb3dfdGNwX2ZvcndhcmRpbmcpOwotCU1fQ1BfSU5UT1BUKGFsbG93X2FnZW50X2ZvcndhcmRpbmcpOwotCU1fQ1BfSU5UT1BUKHBlcm1pdF90dW4pOwotCU1fQ1BfSU5UT1BUKGdhdGV3YXlfcG9ydHMpOwotCU1fQ1BfSU5UT1BUKHgxMV9kaXNwbGF5X29mZnNldCk7Ci0JTV9DUF9JTlRPUFQoeDExX2ZvcndhcmRpbmcpOwotCU1fQ1BfSU5UT1BUKHgxMV91c2VfbG9jYWxob3N0KTsKLQlNX0NQX0lOVE9QVChtYXhfc2Vzc2lvbnMpOwotCU1fQ1BfSU5UT1BUKG1heF9hdXRodHJpZXMpOwotCU1fQ1BfSU5UT1BUKGlwX3Fvc19pbnRlcmFjdGl2ZSk7Ci0JTV9DUF9JTlRPUFQoaXBfcW9zX2J1bGspOwotCi0JLyogU2VlIGNvbW1lbnQgaW4gc2VydmNvbmYuaCAqLwotCUNPUFlfTUFUQ0hfU1RSSU5HX09QVFMoKTsKLQotCS8qCi0JICogVGhlIG9ubHkgdGhpbmdzIHRoYXQgc2hvdWxkIGJlIGJlbG93IHRoaXMgcG9pbnQgYXJlIHN0cmluZyBvcHRpb25zCi0JICogd2hpY2ggYXJlIG9ubHkgdXNlZCBhZnRlciBhdXRoZW50aWNhdGlvbi4KLQkgKi8KLQlpZiAocHJlYXV0aCkKLQkJcmV0dXJuOwotCi0JTV9DUF9TVFJPUFQoYWRtX2ZvcmNlZF9jb21tYW5kKTsKLQlNX0NQX1NUUk9QVChjaHJvb3RfZGlyZWN0b3J5KTsKLX0KLQotI3VuZGVmIE1fQ1BfSU5UT1BUCi0jdW5kZWYgTV9DUF9TVFJPUFQKLSN1bmRlZiBNX0NQX1NUUkFSUkFZT1BUCi0KLXZvaWQKLXBhcnNlX3NlcnZlcl9jb25maWcoU2VydmVyT3B0aW9ucyAqb3B0aW9ucywgY29uc3QgY2hhciAqZmlsZW5hbWUsIEJ1ZmZlciAqY29uZiwKLSAgICBjb25zdCBjaGFyICp1c2VyLCBjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICphZGRyZXNzKQotewotCWludCBhY3RpdmUsIGxpbmVudW0sIGJhZF9vcHRpb25zID0gMDsKLQljaGFyICpjcCwgKm9idWYsICpjYnVmOwotCi0JZGVidWcyKCIlczogY29uZmlnICVzIGxlbiAlZCIsIF9fZnVuY19fLCBmaWxlbmFtZSwgYnVmZmVyX2xlbihjb25mKSk7Ci0KLQlvYnVmID0gY2J1ZiA9IHhzdHJkdXAoYnVmZmVyX3B0cihjb25mKSk7Ci0JYWN0aXZlID0gdXNlciA/IDAgOiAxOwotCWxpbmVudW0gPSAxOwotCXdoaWxlICgoY3AgPSBzdHJzZXAoJmNidWYsICJcbiIpKSAhPSBOVUxMKSB7Ci0JCWlmIChwcm9jZXNzX3NlcnZlcl9jb25maWdfbGluZShvcHRpb25zLCBjcCwgZmlsZW5hbWUsCi0JCSAgICBsaW5lbnVtKyssICZhY3RpdmUsIHVzZXIsIGhvc3QsIGFkZHJlc3MpICE9IDApCi0JCQliYWRfb3B0aW9ucysrOwotCX0KLQl4ZnJlZShvYnVmKTsKLQlpZiAoYmFkX29wdGlvbnMgPiAwKQotCQlmYXRhbCgiJXM6IHRlcm1pbmF0aW5nLCAlZCBiYWQgY29uZmlndXJhdGlvbiBvcHRpb25zIiwKLQkJICAgIGZpbGVuYW1lLCBiYWRfb3B0aW9ucyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWZtdF9tdWx0aXN0YXRlX2ludChpbnQgdmFsLCBjb25zdCBzdHJ1Y3QgbXVsdGlzdGF0ZSAqbSkKLXsKLQl1X2ludCBpOwotCi0JZm9yIChpID0gMDsgbVtpXS5rZXkgIT0gTlVMTDsgaSsrKSB7Ci0JCWlmIChtW2ldLnZhbHVlID09IHZhbCkKLQkJCXJldHVybiBtW2ldLmtleTsKLQl9Ci0JcmV0dXJuICJVTktOT1dOIjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZm10X2ludGFyZyhTZXJ2ZXJPcENvZGVzIGNvZGUsIGludCB2YWwpCi17Ci0JaWYgKHZhbCA9PSAtMSkKLQkJcmV0dXJuICJ1bnNldCI7Ci0Jc3dpdGNoIChjb2RlKSB7Ci0JY2FzZSBzQWRkcmVzc0ZhbWlseToKLQkJcmV0dXJuIGZtdF9tdWx0aXN0YXRlX2ludCh2YWwsIG11bHRpc3RhdGVfYWRkcmVzc2ZhbWlseSk7Ci0JY2FzZSBzUGVybWl0Um9vdExvZ2luOgotCQlyZXR1cm4gZm10X211bHRpc3RhdGVfaW50KHZhbCwgbXVsdGlzdGF0ZV9wZXJtaXRyb290bG9naW4pOwotCWNhc2Ugc0dhdGV3YXlQb3J0czoKLQkJcmV0dXJuIGZtdF9tdWx0aXN0YXRlX2ludCh2YWwsIG11bHRpc3RhdGVfZ2F0ZXdheXBvcnRzKTsKLQljYXNlIHNDb21wcmVzc2lvbjoKLQkJcmV0dXJuIGZtdF9tdWx0aXN0YXRlX2ludCh2YWwsIG11bHRpc3RhdGVfY29tcHJlc3Npb24pOwotCWNhc2Ugc1VzZVByaXZpbGVnZVNlcGFyYXRpb246Ci0JCXJldHVybiBmbXRfbXVsdGlzdGF0ZV9pbnQodmFsLCBtdWx0aXN0YXRlX3ByaXZzZXApOwotCWNhc2Ugc1Byb3RvY29sOgotCQlzd2l0Y2ggKHZhbCkgewotCQljYXNlIFNTSF9QUk9UT18xOgotCQkJcmV0dXJuICIxIjsKLQkJY2FzZSBTU0hfUFJPVE9fMjoKLQkJCXJldHVybiAiMiI7Ci0JCWNhc2UgKFNTSF9QUk9UT18xfFNTSF9QUk9UT18yKToKLQkJCXJldHVybiAiMiwxIjsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAiVU5LTk9XTiI7Ci0JCX0KLQlkZWZhdWx0OgotCQlzd2l0Y2ggKHZhbCkgewotCQljYXNlIDA6Ci0JCQlyZXR1cm4gIm5vIjsKLQkJY2FzZSAxOgotCQkJcmV0dXJuICJ5ZXMiOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuICJVTktOT1dOIjsKLQkJfQotCX0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbG9va3VwX29wY29kZV9uYW1lKFNlcnZlck9wQ29kZXMgY29kZSkKLXsKLQl1X2ludCBpOwotCi0JZm9yIChpID0gMDsga2V5d29yZHNbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JCWlmIChrZXl3b3Jkc1tpXS5vcGNvZGUgPT0gY29kZSkKLQkJCXJldHVybihrZXl3b3Jkc1tpXS5uYW1lKTsKLQlyZXR1cm4gIlVOS05PV04iOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jZmdfaW50KFNlcnZlck9wQ29kZXMgY29kZSwgaW50IHZhbCkKLXsKLQlwcmludGYoIiVzICVkXG4iLCBsb29rdXBfb3Bjb2RlX25hbWUoY29kZSksIHZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NmZ19mbXRpbnQoU2VydmVyT3BDb2RlcyBjb2RlLCBpbnQgdmFsKQotewotCXByaW50ZigiJXMgJXNcbiIsIGxvb2t1cF9vcGNvZGVfbmFtZShjb2RlKSwgZm10X2ludGFyZyhjb2RlLCB2YWwpKTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY2ZnX3N0cmluZyhTZXJ2ZXJPcENvZGVzIGNvZGUsIGNvbnN0IGNoYXIgKnZhbCkKLXsKLQlpZiAodmFsID09IE5VTEwpCi0JCXJldHVybjsKLQlwcmludGYoIiVzICVzXG4iLCBsb29rdXBfb3Bjb2RlX25hbWUoY29kZSksIHZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NmZ19zdHJhcnJheShTZXJ2ZXJPcENvZGVzIGNvZGUsIHVfaW50IGNvdW50LCBjaGFyICoqdmFscykKLXsKLQl1X2ludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCXByaW50ZigiJXMgJXNcbiIsIGxvb2t1cF9vcGNvZGVfbmFtZShjb2RlKSwgdmFsc1tpXSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NmZ19zdHJhcnJheV9vbmVsaW5lKFNlcnZlck9wQ29kZXMgY29kZSwgdV9pbnQgY291bnQsIGNoYXIgKip2YWxzKQotewotCXVfaW50IGk7Ci0KLQlwcmludGYoIiVzIiwgbG9va3VwX29wY29kZV9uYW1lKGNvZGUpKTsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJcHJpbnRmKCIgJXMiLCAgdmFsc1tpXSk7Ci0JcHJpbnRmKCJcbiIpOwotfQotCi12b2lkCi1kdW1wX2NvbmZpZyhTZXJ2ZXJPcHRpb25zICpvKQotewotCXVfaW50IGk7Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYWRkcmluZm8gKmFpOwotCWNoYXIgYWRkcltOSV9NQVhIT1NUXSwgcG9ydFtOSV9NQVhTRVJWXSwgKnMgPSBOVUxMOwotCi0JLyogdGhlc2UgYXJlIHVzdWFsbHkgYXQgdGhlIHRvcCBvZiB0aGUgY29uZmlnICovCi0JZm9yIChpID0gMDsgaSA8IG8tPm51bV9wb3J0czsgaSsrKQotCQlwcmludGYoInBvcnQgJWRcbiIsIG8tPnBvcnRzW2ldKTsKLQlkdW1wX2NmZ19mbXRpbnQoc1Byb3RvY29sLCBvLT5wcm90b2NvbCk7Ci0JZHVtcF9jZmdfZm10aW50KHNBZGRyZXNzRmFtaWx5LCBvLT5hZGRyZXNzX2ZhbWlseSk7Ci0KLQkvKiBMaXN0ZW5BZGRyZXNzIG11c3QgYmUgYWZ0ZXIgUG9ydCAqLwotCWZvciAoYWkgPSBvLT5saXN0ZW5fYWRkcnM7IGFpOyBhaSA9IGFpLT5haV9uZXh0KSB7Ci0JCWlmICgocmV0ID0gZ2V0bmFtZWluZm8oYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuLCBhZGRyLAotCQkgICAgc2l6ZW9mKGFkZHIpLCBwb3J0LCBzaXplb2YocG9ydCksCi0JCSAgICBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVikpICE9IDApIHsKLQkJCWVycm9yKCJnZXRuYW1laW5mbyBmYWlsZWQ6ICUuMTAwcyIsCi0JCQkgICAgKHJldCAhPSBFQUlfU1lTVEVNKSA/IGdhaV9zdHJlcnJvcihyZXQpIDoKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQl9IGVsc2UgewotCQkJaWYgKGFpLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYpCi0JCQkJcHJpbnRmKCJsaXN0ZW5hZGRyZXNzIFslc106JXNcbiIsIGFkZHIsIHBvcnQpOwotCQkJZWxzZQotCQkJCXByaW50ZigibGlzdGVuYWRkcmVzcyAlczolc1xuIiwgYWRkciwgcG9ydCk7Ci0JCX0KLQl9Ci0KLQkvKiBpbnRlZ2VyIGFyZ3VtZW50cyAqLwotI2lmZGVmIFVTRV9QQU0KLQlkdW1wX2NmZ19pbnQoc1VzZVBBTSwgby0+dXNlX3BhbSk7Ci0jZW5kaWYKLQlkdW1wX2NmZ19pbnQoc1NlcnZlcktleUJpdHMsIG8tPnNlcnZlcl9rZXlfYml0cyk7Ci0JZHVtcF9jZmdfaW50KHNMb2dpbkdyYWNlVGltZSwgby0+bG9naW5fZ3JhY2VfdGltZSk7Ci0JZHVtcF9jZmdfaW50KHNLZXlSZWdlbmVyYXRpb25UaW1lLCBvLT5rZXlfcmVnZW5lcmF0aW9uX3RpbWUpOwotCWR1bXBfY2ZnX2ludChzWDExRGlzcGxheU9mZnNldCwgby0+eDExX2Rpc3BsYXlfb2Zmc2V0KTsKLQlkdW1wX2NmZ19pbnQoc01heEF1dGhUcmllcywgby0+bWF4X2F1dGh0cmllcyk7Ci0JZHVtcF9jZmdfaW50KHNNYXhTZXNzaW9ucywgby0+bWF4X3Nlc3Npb25zKTsKLQlkdW1wX2NmZ19pbnQoc0NsaWVudEFsaXZlSW50ZXJ2YWwsIG8tPmNsaWVudF9hbGl2ZV9pbnRlcnZhbCk7Ci0JZHVtcF9jZmdfaW50KHNDbGllbnRBbGl2ZUNvdW50TWF4LCBvLT5jbGllbnRfYWxpdmVfY291bnRfbWF4KTsKLQotCS8qIGZvcm1hdHRlZCBpbnRlZ2VyIGFyZ3VtZW50cyAqLwotCWR1bXBfY2ZnX2ZtdGludChzUGVybWl0Um9vdExvZ2luLCBvLT5wZXJtaXRfcm9vdF9sb2dpbik7Ci0JZHVtcF9jZmdfZm10aW50KHNJZ25vcmVSaG9zdHMsIG8tPmlnbm9yZV9yaG9zdHMpOwotCWR1bXBfY2ZnX2ZtdGludChzSWdub3JlVXNlcktub3duSG9zdHMsIG8tPmlnbm9yZV91c2VyX2tub3duX2hvc3RzKTsKLQlkdW1wX2NmZ19mbXRpbnQoc1Job3N0c1JTQUF1dGhlbnRpY2F0aW9uLCBvLT5yaG9zdHNfcnNhX2F1dGhlbnRpY2F0aW9uKTsKLQlkdW1wX2NmZ19mbXRpbnQoc0hvc3RiYXNlZEF1dGhlbnRpY2F0aW9uLCBvLT5ob3N0YmFzZWRfYXV0aGVudGljYXRpb24pOwotCWR1bXBfY2ZnX2ZtdGludChzSG9zdGJhc2VkVXNlc05hbWVGcm9tUGFja2V0T25seSwKLQkgICAgby0+aG9zdGJhc2VkX3VzZXNfbmFtZV9mcm9tX3BhY2tldF9vbmx5KTsKLQlkdW1wX2NmZ19mbXRpbnQoc1JTQUF1dGhlbnRpY2F0aW9uLCBvLT5yc2FfYXV0aGVudGljYXRpb24pOwotCWR1bXBfY2ZnX2ZtdGludChzUHVia2V5QXV0aGVudGljYXRpb24sIG8tPnB1YmtleV9hdXRoZW50aWNhdGlvbik7Ci0jaWZkZWYgS1JCNQotCWR1bXBfY2ZnX2ZtdGludChzS2VyYmVyb3NBdXRoZW50aWNhdGlvbiwgby0+a2VyYmVyb3NfYXV0aGVudGljYXRpb24pOwotCWR1bXBfY2ZnX2ZtdGludChzS2VyYmVyb3NPckxvY2FsUGFzc3dkLCBvLT5rZXJiZXJvc19vcl9sb2NhbF9wYXNzd2QpOwotCWR1bXBfY2ZnX2ZtdGludChzS2VyYmVyb3NUaWNrZXRDbGVhbnVwLCBvLT5rZXJiZXJvc190aWNrZXRfY2xlYW51cCk7Ci0jIGlmZGVmIFVTRV9BRlMKLQlkdW1wX2NmZ19mbXRpbnQoc0tlcmJlcm9zR2V0QUZTVG9rZW4sIG8tPmtlcmJlcm9zX2dldF9hZnNfdG9rZW4pOwotIyBlbmRpZgotI2VuZGlmCi0jaWZkZWYgR1NTQVBJCi0JZHVtcF9jZmdfZm10aW50KHNHc3NBdXRoZW50aWNhdGlvbiwgby0+Z3NzX2F1dGhlbnRpY2F0aW9uKTsKLQlkdW1wX2NmZ19mbXRpbnQoc0dzc0NsZWFudXBDcmVkcywgby0+Z3NzX2NsZWFudXBfY3JlZHMpOwotI2VuZGlmCi0jaWZkZWYgSlBBS0UKLQlkdW1wX2NmZ19mbXRpbnQoc1plcm9Lbm93bGVkZ2VQYXNzd29yZEF1dGhlbnRpY2F0aW9uLAotCSAgICBvLT56ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbik7Ci0jZW5kaWYKLQlkdW1wX2NmZ19mbXRpbnQoc1Bhc3N3b3JkQXV0aGVudGljYXRpb24sIG8tPnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uKTsKLQlkdW1wX2NmZ19mbXRpbnQoc0tiZEludGVyYWN0aXZlQXV0aGVudGljYXRpb24sCi0JICAgIG8tPmtiZF9pbnRlcmFjdGl2ZV9hdXRoZW50aWNhdGlvbik7Ci0JZHVtcF9jZmdfZm10aW50KHNDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uLAotCSAgICBvLT5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24pOwotCWR1bXBfY2ZnX2ZtdGludChzUHJpbnRNb3RkLCBvLT5wcmludF9tb3RkKTsKLQlkdW1wX2NmZ19mbXRpbnQoc1ByaW50TGFzdExvZywgby0+cHJpbnRfbGFzdGxvZyk7Ci0JZHVtcF9jZmdfZm10aW50KHNYMTFGb3J3YXJkaW5nLCBvLT54MTFfZm9yd2FyZGluZyk7Ci0JZHVtcF9jZmdfZm10aW50KHNYMTFVc2VMb2NhbGhvc3QsIG8tPngxMV91c2VfbG9jYWxob3N0KTsKLQlkdW1wX2NmZ19mbXRpbnQoc1N0cmljdE1vZGVzLCBvLT5zdHJpY3RfbW9kZXMpOwotCWR1bXBfY2ZnX2ZtdGludChzVENQS2VlcEFsaXZlLCBvLT50Y3Bfa2VlcF9hbGl2ZSk7Ci0JZHVtcF9jZmdfZm10aW50KHNFbXB0eVBhc3N3ZCwgby0+cGVybWl0X2VtcHR5X3Bhc3N3ZCk7Ci0JZHVtcF9jZmdfZm10aW50KHNQZXJtaXRVc2VyRW52aXJvbm1lbnQsIG8tPnBlcm1pdF91c2VyX2Vudik7Ci0JZHVtcF9jZmdfZm10aW50KHNVc2VMb2dpbiwgby0+dXNlX2xvZ2luKTsKLQlkdW1wX2NmZ19mbXRpbnQoc0NvbXByZXNzaW9uLCBvLT5jb21wcmVzc2lvbik7Ci0JZHVtcF9jZmdfZm10aW50KHNHYXRld2F5UG9ydHMsIG8tPmdhdGV3YXlfcG9ydHMpOwotCWR1bXBfY2ZnX2ZtdGludChzVXNlRE5TLCBvLT51c2VfZG5zKTsKLQlkdW1wX2NmZ19mbXRpbnQoc0FsbG93VGNwRm9yd2FyZGluZywgby0+YWxsb3dfdGNwX2ZvcndhcmRpbmcpOwotCWR1bXBfY2ZnX2ZtdGludChzVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiwgdXNlX3ByaXZzZXApOwotCi0JLyogc3RyaW5nIGFyZ3VtZW50cyAqLwotCWR1bXBfY2ZnX3N0cmluZyhzUGlkRmlsZSwgby0+cGlkX2ZpbGUpOwotCWR1bXBfY2ZnX3N0cmluZyhzWEF1dGhMb2NhdGlvbiwgby0+eGF1dGhfbG9jYXRpb24pOwotCWR1bXBfY2ZnX3N0cmluZyhzQ2lwaGVycywgby0+Y2lwaGVycyk7Ci0JZHVtcF9jZmdfc3RyaW5nKHNNYWNzLCBvLT5tYWNzKTsKLQlkdW1wX2NmZ19zdHJpbmcoc0Jhbm5lciwgby0+YmFubmVyKTsKLQlkdW1wX2NmZ19zdHJpbmcoc0ZvcmNlQ29tbWFuZCwgby0+YWRtX2ZvcmNlZF9jb21tYW5kKTsKLQlkdW1wX2NmZ19zdHJpbmcoc0Nocm9vdERpcmVjdG9yeSwgby0+Y2hyb290X2RpcmVjdG9yeSk7Ci0JZHVtcF9jZmdfc3RyaW5nKHNUcnVzdGVkVXNlckNBS2V5cywgby0+dHJ1c3RlZF91c2VyX2NhX2tleXMpOwotCWR1bXBfY2ZnX3N0cmluZyhzUmV2b2tlZEtleXMsIG8tPnJldm9rZWRfa2V5c19maWxlKTsKLQlkdW1wX2NmZ19zdHJpbmcoc0F1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSwKLQkgICAgby0+YXV0aG9yaXplZF9wcmluY2lwYWxzX2ZpbGUpOwotCi0JLyogc3RyaW5nIGFyZ3VtZW50cyByZXF1aXJpbmcgYSBsb29rdXAgKi8KLQlkdW1wX2NmZ19zdHJpbmcoc0xvZ0xldmVsLCBsb2dfbGV2ZWxfbmFtZShvLT5sb2dfbGV2ZWwpKTsKLQlkdW1wX2NmZ19zdHJpbmcoc0xvZ0ZhY2lsaXR5LCBsb2dfZmFjaWxpdHlfbmFtZShvLT5sb2dfZmFjaWxpdHkpKTsKLQotCS8qIHN0cmluZyBhcnJheSBhcmd1bWVudHMgKi8KLQlkdW1wX2NmZ19zdHJhcnJheV9vbmVsaW5lKHNBdXRob3JpemVkS2V5c0ZpbGUsIG8tPm51bV9hdXRoa2V5c19maWxlcywKLQkgICAgby0+YXV0aG9yaXplZF9rZXlzX2ZpbGVzKTsKLQlkdW1wX2NmZ19zdHJhcnJheShzSG9zdEtleUZpbGUsIG8tPm51bV9ob3N0X2tleV9maWxlcywKLQkgICAgIG8tPmhvc3Rfa2V5X2ZpbGVzKTsKLQlkdW1wX2NmZ19zdHJhcnJheShzSG9zdEtleUZpbGUsIG8tPm51bV9ob3N0X2NlcnRfZmlsZXMsCi0JICAgICBvLT5ob3N0X2NlcnRfZmlsZXMpOwotCWR1bXBfY2ZnX3N0cmFycmF5KHNBbGxvd1VzZXJzLCBvLT5udW1fYWxsb3dfdXNlcnMsIG8tPmFsbG93X3VzZXJzKTsKLQlkdW1wX2NmZ19zdHJhcnJheShzRGVueVVzZXJzLCBvLT5udW1fZGVueV91c2Vycywgby0+ZGVueV91c2Vycyk7Ci0JZHVtcF9jZmdfc3RyYXJyYXkoc0FsbG93R3JvdXBzLCBvLT5udW1fYWxsb3dfZ3JvdXBzLCBvLT5hbGxvd19ncm91cHMpOwotCWR1bXBfY2ZnX3N0cmFycmF5KHNEZW55R3JvdXBzLCBvLT5udW1fZGVueV9ncm91cHMsIG8tPmRlbnlfZ3JvdXBzKTsKLQlkdW1wX2NmZ19zdHJhcnJheShzQWNjZXB0RW52LCBvLT5udW1fYWNjZXB0X2Vudiwgby0+YWNjZXB0X2Vudik7Ci0KLQkvKiBvdGhlciBhcmd1bWVudHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgby0+bnVtX3N1YnN5c3RlbXM7IGkrKykKLQkJcHJpbnRmKCJzdWJzeXN0ZW0gJXMgJXNcbiIsIG8tPnN1YnN5c3RlbV9uYW1lW2ldLAotCQkgICAgby0+c3Vic3lzdGVtX2FyZ3NbaV0pOwotCi0JcHJpbnRmKCJtYXhzdGFydHVwcyAlZDolZDolZFxuIiwgby0+bWF4X3N0YXJ0dXBzX2JlZ2luLAotCSAgICBvLT5tYXhfc3RhcnR1cHNfcmF0ZSwgby0+bWF4X3N0YXJ0dXBzKTsKLQotCWZvciAoaSA9IDA7IHR1bm1vZGVfZGVzY1tpXS52YWwgIT0gLTE7IGkrKykKLQkJaWYgKHR1bm1vZGVfZGVzY1tpXS52YWwgPT0gby0+cGVybWl0X3R1bikgewotCQkJcyA9IHR1bm1vZGVfZGVzY1tpXS50ZXh0OwotCQkJYnJlYWs7Ci0JCX0KLQlkdW1wX2NmZ19zdHJpbmcoc1Blcm1pdFR1bm5lbCwgcyk7Ci0KLQlwcmludGYoImlwcW9zICVzICIsIGlwdG9zMnN0cihvLT5pcF9xb3NfaW50ZXJhY3RpdmUpKTsKLQlwcmludGYoIiVzXG4iLCBpcHRvczJzdHIoby0+aXBfcW9zX2J1bGspKTsKLQotCWNoYW5uZWxfcHJpbnRfYWRtX3Blcm1pdHRlZF9vcGVucygpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmNvbmYuaCBiL3NlcnZjb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZjM4ZTIuLjAwMDAwMDAKLS0tIGEvc2VydmNvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKiAkT3BlbkJTRDogc2VydmNvbmYuaCx2IDEuOTkgMjAxMS8wNi8yMiAyMTo1NzowMSBkam0gRXhwICQgKi8KLQotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIERlZmluaXRpb25zIGZvciBzZXJ2ZXIgY29uZmlndXJhdGlvbiBkYXRhIGFuZCBmb3IgdGhlIGZ1bmN0aW9ucyByZWFkaW5nIGl0LgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLQotI2lmbmRlZiBTRVJWQ09ORl9ICi0jZGVmaW5lIFNFUlZDT05GX0gKLQotI2RlZmluZSBNQVhfUE9SVFMJCTI1NgkvKiBNYXggIyBwb3J0cy4gKi8KLQotI2RlZmluZSBNQVhfQUxMT1dfVVNFUlMJCTI1NgkvKiBNYXggIyB1c2VycyBvbiBhbGxvdyBsaXN0LiAqLwotI2RlZmluZSBNQVhfREVOWV9VU0VSUwkJMjU2CS8qIE1heCAjIHVzZXJzIG9uIGRlbnkgbGlzdC4gKi8KLSNkZWZpbmUgTUFYX0FMTE9XX0dST1VQUwkyNTYJLyogTWF4ICMgZ3JvdXBzIG9uIGFsbG93IGxpc3QuICovCi0jZGVmaW5lIE1BWF9ERU5ZX0dST1VQUwkJMjU2CS8qIE1heCAjIGdyb3VwcyBvbiBkZW55IGxpc3QuICovCi0jZGVmaW5lIE1BWF9TVUJTWVNURU1TCQkyNTYJLyogTWF4ICMgc3Vic3lzdGVtcy4gKi8KLSNkZWZpbmUgTUFYX0hPU1RLRVlTCQkyNTYJLyogTWF4ICMgaG9zdGtleXMuICovCi0jZGVmaW5lIE1BWF9IT1NUQ0VSVFMJCTI1NgkvKiBNYXggIyBob3N0IGNlcnRpZmljYXRlcy4gKi8KLSNkZWZpbmUgTUFYX0FDQ0VQVF9FTlYJCTI1NgkvKiBNYXggIyBvZiBlbnYgdmFycy4gKi8KLSNkZWZpbmUgTUFYX01BVENIX0dST1VQUwkyNTYJLyogTWF4ICMgb2YgZ3JvdXBzIGZvciBNYXRjaC4gKi8KLSNkZWZpbmUgTUFYX0FVVEhLRVlTX0ZJTEVTCTI1NgkvKiBNYXggIyBvZiBhdXRob3JpemVkX2tleXMgZmlsZXMuICovCi0KLS8qIHBlcm1pdF9yb290X2xvZ2luICovCi0jZGVmaW5lCVBFUk1JVF9OT1RfU0VUCQktMQotI2RlZmluZQlQRVJNSVRfTk8JCTAKLSNkZWZpbmUJUEVSTUlUX0ZPUkNFRF9PTkxZCTEKLSNkZWZpbmUJUEVSTUlUX05PX1BBU1NXRAkyCi0jZGVmaW5lCVBFUk1JVF9ZRVMJCTMKLQotLyogdXNlX3ByaXZzZXAgKi8KLSNkZWZpbmUgUFJJVlNFUF9PRkYJCTAKLSNkZWZpbmUgUFJJVlNFUF9PTgkJMQotI2RlZmluZSBQUklWU0VQX1NBTkRCT1gJCTIKLQotI2RlZmluZSBERUZBVUxUX0FVVEhfRkFJTF9NQVgJNgkvKiBEZWZhdWx0IGZvciBNYXhBdXRoVHJpZXMgKi8KLSNkZWZpbmUgREVGQVVMVF9TRVNTSU9OU19NQVgJMTAJLyogRGVmYXVsdCBmb3IgTWF4U2Vzc2lvbnMgKi8KLQotLyogTWFnaWMgbmFtZSBmb3IgaW50ZXJuYWwgc2Z0cC1zZXJ2ZXIgKi8KLSNkZWZpbmUgSU5URVJOQUxfU0ZUUF9OQU1FCSJpbnRlcm5hbC1zZnRwIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdV9pbnQJbnVtX3BvcnRzOwotCXVfaW50CXBvcnRzX2Zyb21fY21kbGluZTsKLQlpbnQJcG9ydHNbTUFYX1BPUlRTXTsJLyogUG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uLiAqLwotCWNoYXIgICAqbGlzdGVuX2FkZHI7CQkvKiBBZGRyZXNzIG9uIHdoaWNoIHRoZSBzZXJ2ZXIgbGlzdGVucy4gKi8KLQlzdHJ1Y3QgYWRkcmluZm8gKmxpc3Rlbl9hZGRyczsJLyogQWRkcmVzc2VzIG9uIHdoaWNoIHRoZSBzZXJ2ZXIgbGlzdGVucy4gKi8KLQlpbnQgICAgIGFkZHJlc3NfZmFtaWx5OwkJLyogQWRkcmVzcyBmYW1pbHkgdXNlZCBieSB0aGUgc2VydmVyLiAqLwotCWNoYXIgICAqaG9zdF9rZXlfZmlsZXNbTUFYX0hPU1RLRVlTXTsJLyogRmlsZXMgY29udGFpbmluZyBob3N0IGtleXMuICovCi0JaW50ICAgICBudW1faG9zdF9rZXlfZmlsZXM7ICAgICAvKiBOdW1iZXIgb2YgZmlsZXMgZm9yIGhvc3Qga2V5cy4gKi8KLQljaGFyICAgKmhvc3RfY2VydF9maWxlc1tNQVhfSE9TVENFUlRTXTsJLyogRmlsZXMgY29udGFpbmluZyBob3N0IGNlcnRzLiAqLwotCWludCAgICAgbnVtX2hvc3RfY2VydF9maWxlczsgICAgIC8qIE51bWJlciBvZiBmaWxlcyBmb3IgaG9zdCBjZXJ0cy4gKi8KLQljaGFyICAgKnBpZF9maWxlOwkvKiBXaGVyZSB0byBwdXQgb3VyIHBpZCAqLwotCWludCAgICAgc2VydmVyX2tleV9iaXRzOy8qIFNpemUgb2YgdGhlIHNlcnZlciBrZXkuICovCi0JaW50ICAgICBsb2dpbl9ncmFjZV90aW1lOwkvKiBEaXNjb25uZWN0IGlmIG5vIGF1dGggaW4gdGhpcyB0aW1lCi0JCQkJCSAqIChzZWMpLiAqLwotCWludCAgICAga2V5X3JlZ2VuZXJhdGlvbl90aW1lOwkvKiBTZXJ2ZXIga2V5IGxpZmV0aW1lIChzZWNvbmRzKS4gKi8KLQlpbnQgICAgIHBlcm1pdF9yb290X2xvZ2luOwkvKiBQRVJNSVRfKiwgc2VlIGFib3ZlICovCi0JaW50ICAgICBpZ25vcmVfcmhvc3RzOwkvKiBJZ25vcmUgLnJob3N0cyBhbmQgLnNob3N0cy4gKi8KLQlpbnQgICAgIGlnbm9yZV91c2VyX2tub3duX2hvc3RzOwkvKiBJZ25vcmUgfi8uc3NoL2tub3duX2hvc3RzCi0JCQkJCQkgKiBmb3IgUmhvc3RzUnNhQXV0aCAqLwotCWludCAgICAgcHJpbnRfbW90ZDsJLyogSWYgdHJ1ZSwgcHJpbnQgL2V0Yy9tb3RkLiAqLwotCWludAlwcmludF9sYXN0bG9nOwkvKiBJZiB0cnVlLCBwcmludCBsYXN0bG9nICovCi0JaW50ICAgICB4MTFfZm9yd2FyZGluZzsJLyogSWYgdHJ1ZSwgcGVybWl0IGluZXQgKHNwb29maW5nKSBYMTEgZndkLiAqLwotCWludCAgICAgeDExX2Rpc3BsYXlfb2Zmc2V0OwkvKiBXaGF0IERJU1BMQVkgbnVtYmVyIHRvIHN0YXJ0Ci0JCQkJCSAqIHNlYXJjaGluZyBhdCAqLwotCWludCAgICAgeDExX3VzZV9sb2NhbGhvc3Q7CS8qIElmIHRydWUsIHVzZSBsb2NhbGhvc3QgZm9yIGZha2UgWDExIHNlcnZlci4gKi8KLQljaGFyICAgKnhhdXRoX2xvY2F0aW9uOwkvKiBMb2NhdGlvbiBvZiB4YXV0aCBwcm9ncmFtICovCi0JaW50ICAgICBzdHJpY3RfbW9kZXM7CS8qIElmIHRydWUsIHJlcXVpcmUgc3RyaW5nIGhvbWUgZGlyIG1vZGVzLiAqLwotCWludCAgICAgdGNwX2tlZXBfYWxpdmU7CS8qIElmIHRydWUsIHNldCBTT19LRUVQQUxJVkUuICovCi0JaW50CWlwX3Fvc19pbnRlcmFjdGl2ZTsJLyogSVAgVG9TL0RTQ1AvY2xhc3MgZm9yIGludGVyYWN0aXZlICovCi0JaW50CWlwX3Fvc19idWxrOwkJLyogSVAgVG9TL0RTQ1AvY2xhc3MgZm9yIGJ1bGsgdHJhZmZpYyAqLwotCWNoYXIgICAqY2lwaGVyczsJLyogU3VwcG9ydGVkIFNTSDIgY2lwaGVycy4gKi8KLQljaGFyICAgKm1hY3M7CQkvKiBTdXBwb3J0ZWQgU1NIMiBtYWNzLiAqLwotCWNoYXIgICAqa2V4X2FsZ29yaXRobXM7CS8qIFNTSDIga2V4IG1ldGhvZHMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4gKi8KLQlpbnQJcHJvdG9jb2w7CS8qIFN1cHBvcnRlZCBwcm90b2NvbCB2ZXJzaW9ucy4gKi8KLQlpbnQgICAgIGdhdGV3YXlfcG9ydHM7CS8qIElmIHRydWUsIGFsbG93IHJlbW90ZSBjb25uZWN0cyB0byBmb3J3YXJkZWQgcG9ydHMuICovCi0JU3lzbG9nRmFjaWxpdHkgbG9nX2ZhY2lsaXR5OwkvKiBGYWNpbGl0eSBmb3Igc3lzdGVtIGxvZ2dpbmcuICovCi0JTG9nTGV2ZWwgbG9nX2xldmVsOwkvKiBMZXZlbCBmb3Igc3lzdGVtIGxvZ2dpbmcuICovCi0JaW50ICAgICByaG9zdHNfcnNhX2F1dGhlbnRpY2F0aW9uOwkvKiBJZiB0cnVlLCBwZXJtaXQgcmhvc3RzIFJTQQotCQkJCQkJICogYXV0aGVudGljYXRpb24uICovCi0JaW50ICAgICBob3N0YmFzZWRfYXV0aGVudGljYXRpb247CS8qIElmIHRydWUsIHBlcm1pdCBzc2gyIGhvc3RiYXNlZCBhdXRoICovCi0JaW50ICAgICBob3N0YmFzZWRfdXNlc19uYW1lX2Zyb21fcGFja2V0X29ubHk7IC8qIGV4cGVyaW1lbnRhbCAqLwotCWludCAgICAgcnNhX2F1dGhlbnRpY2F0aW9uOwkvKiBJZiB0cnVlLCBwZXJtaXQgUlNBIGF1dGhlbnRpY2F0aW9uLiAqLwotCWludCAgICAgcHVia2V5X2F1dGhlbnRpY2F0aW9uOwkvKiBJZiB0cnVlLCBwZXJtaXQgc3NoMiBwdWJrZXkgYXV0aGVudGljYXRpb24uICovCi0JaW50ICAgICBrZXJiZXJvc19hdXRoZW50aWNhdGlvbjsJLyogSWYgdHJ1ZSwgcGVybWl0IEtlcmJlcm9zCi0JCQkJCQkgKiBhdXRoZW50aWNhdGlvbi4gKi8KLQlpbnQgICAgIGtlcmJlcm9zX29yX2xvY2FsX3Bhc3N3ZDsJLyogSWYgdHJ1ZSwgcGVybWl0IGtlcmJlcm9zCi0JCQkJCQkgKiBhbmQgYW55IG90aGVyIHBhc3N3b3JkCi0JCQkJCQkgKiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20sCi0JCQkJCQkgKiBzdWNoIGFzIFNlY3VySUQgb3IKLQkJCQkJCSAqIC9ldGMvcGFzc3dkICovCi0JaW50ICAgICBrZXJiZXJvc190aWNrZXRfY2xlYW51cDsJLyogSWYgdHJ1ZSwgZGVzdHJveSB0aWNrZXQKLQkJCQkJCSAqIGZpbGUgb24gbG9nb3V0LiAqLwotCWludCAgICAga2VyYmVyb3NfZ2V0X2Fmc190b2tlbjsJCS8qIElmIHRydWUsIHRyeSB0byBnZXQgQUZTIHRva2VuIGlmCi0JCQkJCQkgKiBhdXRoZW50aWNhdGVkIHdpdGggS2VyYmVyb3MuICovCi0JaW50ICAgICBnc3NfYXV0aGVudGljYXRpb247CS8qIElmIHRydWUsIHBlcm1pdCBHU1NBUEkgYXV0aGVudGljYXRpb24gKi8KLQlpbnQgICAgIGdzc19jbGVhbnVwX2NyZWRzOwkvKiBJZiB0cnVlLCBkZXN0cm95IGNyZWQgY2FjaGUgb24gbG9nb3V0ICovCi0JaW50ICAgICBwYXNzd29yZF9hdXRoZW50aWNhdGlvbjsJLyogSWYgdHJ1ZSwgcGVybWl0IHBhc3N3b3JkCi0JCQkJCQkgKiBhdXRoZW50aWNhdGlvbi4gKi8KLQlpbnQgICAgIGtiZF9pbnRlcmFjdGl2ZV9hdXRoZW50aWNhdGlvbjsJLyogSWYgdHJ1ZSwgcGVybWl0ICovCi0JaW50ICAgICBjaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb247Ci0JaW50ICAgICB6ZXJvX2tub3dsZWRnZV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbjsKLQkJCQkJLyogSWYgdHJ1ZSwgcGVybWl0IGpwYWtlIGF1dGggKi8KLQlpbnQgICAgIHBlcm1pdF9lbXB0eV9wYXNzd2Q7CS8qIElmIGZhbHNlLCBkbyBub3QgcGVybWl0IGVtcHR5Ci0JCQkJCSAqIHBhc3N3b3Jkcy4gKi8KLQlpbnQgICAgIHBlcm1pdF91c2VyX2VudjsJLyogSWYgdHJ1ZSwgcmVhZCB+Ly5zc2gvZW52aXJvbm1lbnQgKi8KLQlpbnQgICAgIHVzZV9sb2dpbjsJLyogSWYgdHJ1ZSwgbG9naW4oMSkgaXMgdXNlZCAqLwotCWludCAgICAgY29tcHJlc3Npb247CS8qIElmIHRydWUsIGNvbXByZXNzaW9uIGlzIGFsbG93ZWQgKi8KLQlpbnQJYWxsb3dfdGNwX2ZvcndhcmRpbmc7Ci0JaW50CWFsbG93X2FnZW50X2ZvcndhcmRpbmc7Ci0JdV9pbnQgbnVtX2FsbG93X3VzZXJzOwotCWNoYXIgICAqYWxsb3dfdXNlcnNbTUFYX0FMTE9XX1VTRVJTXTsKLQl1X2ludCBudW1fZGVueV91c2VyczsKLQljaGFyICAgKmRlbnlfdXNlcnNbTUFYX0RFTllfVVNFUlNdOwotCXVfaW50IG51bV9hbGxvd19ncm91cHM7Ci0JY2hhciAgICphbGxvd19ncm91cHNbTUFYX0FMTE9XX0dST1VQU107Ci0JdV9pbnQgbnVtX2RlbnlfZ3JvdXBzOwotCWNoYXIgICAqZGVueV9ncm91cHNbTUFYX0RFTllfR1JPVVBTXTsKLQotCXVfaW50IG51bV9zdWJzeXN0ZW1zOwotCWNoYXIgICAqc3Vic3lzdGVtX25hbWVbTUFYX1NVQlNZU1RFTVNdOwotCWNoYXIgICAqc3Vic3lzdGVtX2NvbW1hbmRbTUFYX1NVQlNZU1RFTVNdOwotCWNoYXIgICAqc3Vic3lzdGVtX2FyZ3NbTUFYX1NVQlNZU1RFTVNdOwotCi0JdV9pbnQgbnVtX2FjY2VwdF9lbnY7Ci0JY2hhciAgICphY2NlcHRfZW52W01BWF9BQ0NFUFRfRU5WXTsKLQotCWludAltYXhfc3RhcnR1cHNfYmVnaW47Ci0JaW50CW1heF9zdGFydHVwc19yYXRlOwotCWludAltYXhfc3RhcnR1cHM7Ci0JaW50CW1heF9hdXRodHJpZXM7Ci0JaW50CW1heF9zZXNzaW9uczsKLQljaGFyICAgKmJhbm5lcjsJCQkvKiBTU0gtMiBiYW5uZXIgbWVzc2FnZSAqLwotCWludAl1c2VfZG5zOwotCWludAljbGllbnRfYWxpdmVfaW50ZXJ2YWw7CS8qCi0JCQkJCSAqIHBva2UgdGhlIGNsaWVudCB0aGlzIG9mdGVuIHRvCi0JCQkJCSAqIHNlZSBpZiBpdCdzIHN0aWxsIHRoZXJlCi0JCQkJCSAqLwotCWludAljbGllbnRfYWxpdmVfY291bnRfbWF4OwkvKgotCQkJCQkgKiBJZiB0aGUgY2xpZW50IGlzIHVucmVzcG9uc2l2ZQotCQkJCQkgKiBmb3IgdGhpcyBtYW55IGludGVydmFscyBhYm92ZSwKLQkJCQkJICogZGlzY29ubmVjdCB0aGUgc2Vzc2lvbgotCQkJCQkgKi8KLQotCXVfaW50IG51bV9hdXRoa2V5c19maWxlczsJLyogRmlsZXMgY29udGFpbmluZyBwdWJsaWMga2V5cyAqLwotCWNoYXIgICAqYXV0aG9yaXplZF9rZXlzX2ZpbGVzW01BWF9BVVRIS0VZU19GSUxFU107Ci0KLQljaGFyICAgKmFkbV9mb3JjZWRfY29tbWFuZDsKLQotCWludAl1c2VfcGFtOwkJLyogRW5hYmxlIGF1dGggdmlhIFBBTSAqLwotCi0JaW50CXBlcm1pdF90dW47Ci0KLQlpbnQJbnVtX3Blcm1pdHRlZF9vcGVuczsKLQotCWNoYXIgICAqY2hyb290X2RpcmVjdG9yeTsKLQljaGFyICAgKnJldm9rZWRfa2V5c19maWxlOwotCWNoYXIgICAqdHJ1c3RlZF91c2VyX2NhX2tleXM7Ci0JY2hhciAgICphdXRob3JpemVkX3ByaW5jaXBhbHNfZmlsZTsKLX0gICAgICAgU2VydmVyT3B0aW9uczsKLQotLyoKLSAqIFRoZXNlIGFyZSBzdHJpbmcgY29uZmlnIG9wdGlvbnMgdGhhdCBtdXN0IGJlIGNvcGllZCBiZXR3ZWVuIHRoZQotICogTWF0Y2ggc3ViLWNvbmZpZyBhbmQgdGhlIG1haW4gY29uZmlnLCBhbmQgbXVzdCBiZSBzZW50IGZyb20gdGhlCi0gKiBwcml2c2VwIHNsYXZlIHRvIHRoZSBwcml2c2VwIG1hc3Rlci4gV2UgdXNlIGEgbWFjcm8gdG8gZW5zdXJlIGFsbAotICogdGhlIG9wdGlvbnMgYXJlIGNvcGllZCBhbmQgdGhlIGNvcGllcyBhcmUgZG9uZSBpbiB0aGUgY29ycmVjdCBvcmRlci4KLSAqLwotI2RlZmluZSBDT1BZX01BVENIX1NUUklOR19PUFRTKCkgZG8geyBcCi0JCU1fQ1BfU1RST1BUKGJhbm5lcik7IFwKLQkJTV9DUF9TVFJPUFQodHJ1c3RlZF91c2VyX2NhX2tleXMpOyBcCi0JCU1fQ1BfU1RST1BUKHJldm9rZWRfa2V5c19maWxlKTsgXAotCQlNX0NQX1NUUk9QVChhdXRob3JpemVkX3ByaW5jaXBhbHNfZmlsZSk7IFwKLQkJTV9DUF9TVFJBUlJBWU9QVChhdXRob3JpemVkX2tleXNfZmlsZXMsIG51bV9hdXRoa2V5c19maWxlcyk7IFwKLQl9IHdoaWxlICgwKQotCi12b2lkCSBpbml0aWFsaXplX3NlcnZlcl9vcHRpb25zKFNlcnZlck9wdGlvbnMgKik7Ci12b2lkCSBmaWxsX2RlZmF1bHRfc2VydmVyX29wdGlvbnMoU2VydmVyT3B0aW9ucyAqKTsKLWludAkgcHJvY2Vzc19zZXJ2ZXJfY29uZmlnX2xpbmUoU2VydmVyT3B0aW9ucyAqLCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LAotCSAgICAgaW50ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotdm9pZAkgbG9hZF9zZXJ2ZXJfY29uZmlnKGNvbnN0IGNoYXIgKiwgQnVmZmVyICopOwotdm9pZAkgcGFyc2Vfc2VydmVyX2NvbmZpZyhTZXJ2ZXJPcHRpb25zICosIGNvbnN0IGNoYXIgKiwgQnVmZmVyICosCi0JICAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLXZvaWQJIHBhcnNlX3NlcnZlcl9tYXRjaF9jb25maWcoU2VydmVyT3B0aW9ucyAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkgICAgIGNvbnN0IGNoYXIgKik7Ci12b2lkCSBjb3B5X3NldF9zZXJ2ZXJfb3B0aW9ucyhTZXJ2ZXJPcHRpb25zICosIFNlcnZlck9wdGlvbnMgKiwgaW50KTsKLXZvaWQJIGR1bXBfY29uZmlnKFNlcnZlck9wdGlvbnMgKik7Ci1jaGFyCSpkZXJlbGF0aXZpc2VfcGF0aChjb25zdCBjaGFyICopOwotCi0jZW5kaWYJCQkJLyogU0VSVkNPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVybG9vcC5jIGIvc2VydmVybG9vcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWI4NGZmLi4wMDAwMDAwCi0tLSBhL3NlcnZlcmxvb3AuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNTQgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNlcnZlcmxvb3AuYyx2IDEuMTYwIDIwMTEvMDUvMTUgMDg6MDk6MDEgZGptIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogU2VydmVyIG1haW4gbG9vcCBmb3IgaGFuZGxpbmcgdGhlIGludGVyYWN0aXZlIHNlc3Npb24uCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqCi0gKiBTU0gyIHN1cHBvcnQgYnkgTWFya3VzIEZyaWVkbC4KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpZmRlZiBIQVZFX1NZU19USU1FX0gKLSMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJzZXJ2Y29uZi5oIgotI2luY2x1ZGUgImNhbm9ob3N0LmgiCi0jaW5jbHVkZSAic3NocHR5LmgiCi0jaW5jbHVkZSAiY2hhbm5lbHMuaCIKLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJzc2gxLmgiCi0jaW5jbHVkZSAic3NoMi5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImNpcGhlci5oIgotI2luY2x1ZGUgImtleC5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgInNlc3Npb24uaCIKLSNpbmNsdWRlICJkaXNwYXRjaC5oIgotI2luY2x1ZGUgImF1dGgtb3B0aW9ucy5oIgotI2luY2x1ZGUgInNlcnZlcmxvb3AuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAicm9hbWluZy5oIgotCi1leHRlcm4gU2VydmVyT3B0aW9ucyBvcHRpb25zOwotCi0vKiBYWFggKi8KLWV4dGVybiBLZXggKnh4eF9rZXg7Ci1leHRlcm4gQXV0aGN0eHQgKnRoZV9hdXRoY3R4dDsKLWV4dGVybiBpbnQgdXNlX3ByaXZzZXA7Ci0KLXN0YXRpYyBCdWZmZXIgc3RkaW5fYnVmZmVyOwkvKiBCdWZmZXIgZm9yIHN0ZGluIGRhdGEuICovCi1zdGF0aWMgQnVmZmVyIHN0ZG91dF9idWZmZXI7CS8qIEJ1ZmZlciBmb3Igc3Rkb3V0IGRhdGEuICovCi1zdGF0aWMgQnVmZmVyIHN0ZGVycl9idWZmZXI7CS8qIEJ1ZmZlciBmb3Igc3RkZXJyIGRhdGEuICovCi1zdGF0aWMgaW50IGZkaW47CQkvKiBEZXNjcmlwdG9yIGZvciBzdGRpbiAoZm9yIHdyaXRpbmcpICovCi1zdGF0aWMgaW50IGZkb3V0OwkJLyogRGVzY3JpcHRvciBmb3Igc3Rkb3V0IChmb3IgcmVhZGluZyk7Ci0JCQkJICAgTWF5IGJlIHNhbWUgbnVtYmVyIGFzIGZkaW4uICovCi1zdGF0aWMgaW50IGZkZXJyOwkJLyogRGVzY3JpcHRvciBmb3Igc3RkZXJyLiAgTWF5IGJlIC0xLiAqLwotc3RhdGljIGxvbmcgc3RkaW5fYnl0ZXMgPSAwOwkvKiBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBzdGRpbi4gKi8KLXN0YXRpYyBsb25nIHN0ZG91dF9ieXRlcyA9IDA7CS8qIE51bWJlciBvZiBzdGRvdXQgYnl0ZXMgc2VudCB0byBjbGllbnQuICovCi1zdGF0aWMgbG9uZyBzdGRlcnJfYnl0ZXMgPSAwOwkvKiBOdW1iZXIgb2Ygc3RkZXJyIGJ5dGVzIHNlbnQgdG8gY2xpZW50LiAqLwotc3RhdGljIGxvbmcgZmRvdXRfYnl0ZXMgPSAwOwkvKiBOdW1iZXIgb2Ygc3Rkb3V0IGJ5dGVzIHJlYWQgZnJvbSBwcm9ncmFtLiAqLwotc3RhdGljIGludCBzdGRpbl9lb2YgPSAwOwkvKiBFT0YgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGNsaWVudC4gKi8KLXN0YXRpYyBpbnQgZmRvdXRfZW9mID0gMDsJLyogRU9GIGVuY291bnRlcmVkIHJlYWRpbmcgZnJvbSBmZG91dC4gKi8KLXN0YXRpYyBpbnQgZmRlcnJfZW9mID0gMDsJLyogRU9GIGVuY291bnRlcmVkIHJlYWR1bmcgZnJvbSBmZGVyci4gKi8KLXN0YXRpYyBpbnQgZmRpbl9pc190dHkgPSAwOwkvKiBmZGluIHBvaW50cyB0byBhIHR0eS4gKi8KLXN0YXRpYyBpbnQgY29ubmVjdGlvbl9pbjsJLyogQ29ubmVjdGlvbiB0byBjbGllbnQgKGlucHV0KS4gKi8KLXN0YXRpYyBpbnQgY29ubmVjdGlvbl9vdXQ7CS8qIENvbm5lY3Rpb24gdG8gY2xpZW50IChvdXRwdXQpLiAqLwotc3RhdGljIGludCBjb25uZWN0aW9uX2Nsb3NlZCA9IDA7CS8qIENvbm5lY3Rpb24gdG8gY2xpZW50IGNsb3NlZC4gKi8KLXN0YXRpYyB1X2ludCBidWZmZXJfaGlnaDsJLyogIlNvZnQiIG1heCBidWZmZXIgc2l6ZS4gKi8KLXN0YXRpYyBpbnQgbm9fbW9yZV9zZXNzaW9ucyA9IDA7IC8qIERpc2FsbG93IGZ1cnRoZXIgc2Vzc2lvbnMuICovCi0KLS8qCi0gKiBUaGlzIFNJR0NITEQga2x1ZGdlIGlzIHVzZWQgdG8gZGV0ZWN0IHdoZW4gdGhlIGNoaWxkIGV4aXRzLiAgVGhlIHNlcnZlcgotICogd2lsbCBleGl0IGFmdGVyIHRoYXQsIGFzIHNvb24gYXMgZm9yd2FyZGVkIGNvbm5lY3Rpb25zIGhhdmUgdGVybWluYXRlZC4KLSAqLwotCi1zdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IGNoaWxkX3Rlcm1pbmF0ZWQgPSAwOwkvKiBUaGUgY2hpbGQgaGFzIHRlcm1pbmF0ZWQuICovCi0KLS8qIENsZWFudXAgb24gc2lnbmFscyAoIXVzZV9wcml2c2VwIGNhc2Ugb25seSkgKi8KLXN0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgcmVjZWl2ZWRfc2lndGVybSA9IDA7Ci0KLS8qIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB2b2lkIHNlcnZlcl9pbml0X2Rpc3BhdGNoKHZvaWQpOwotCi0vKgotICogd2Ugd3JpdGUgdG8gdGhpcyBwaXBlIGlmIGEgU0lHQ0hMRCBpcyBjYXVnaHQgaW4gb3JkZXIgdG8gYXZvaWQKLSAqIHRoZSByYWNlIGJldHdlZW4gc2VsZWN0KCkgYW5kIGNoaWxkX3Rlcm1pbmF0ZWQKLSAqLwotc3RhdGljIGludCBub3RpZnlfcGlwZVsyXTsKLXN0YXRpYyB2b2lkCi1ub3RpZnlfc2V0dXAodm9pZCkKLXsKLQlpZiAocGlwZShub3RpZnlfcGlwZSkgPCAwKSB7Ci0JCWVycm9yKCJwaXBlKG5vdGlmeV9waXBlKSBmYWlsZWQgJXMiLCBzdHJlcnJvcihlcnJubykpOwotCX0gZWxzZSBpZiAoKGZjbnRsKG5vdGlmeV9waXBlWzBdLCBGX1NFVEZELCBGRF9DTE9FWEVDKSA9PSAtMSkgfHwKLQkgICAgKGZjbnRsKG5vdGlmeV9waXBlWzFdLCBGX1NFVEZELCBGRF9DTE9FWEVDKSA9PSAtMSkpIHsKLQkJZXJyb3IoImZjbnRsKG5vdGlmeV9waXBlLCBGX1NFVEZEKSBmYWlsZWQgJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQljbG9zZShub3RpZnlfcGlwZVswXSk7Ci0JCWNsb3NlKG5vdGlmeV9waXBlWzFdKTsKLQl9IGVsc2UgewotCQlzZXRfbm9uYmxvY2sobm90aWZ5X3BpcGVbMF0pOwotCQlzZXRfbm9uYmxvY2sobm90aWZ5X3BpcGVbMV0pOwotCQlyZXR1cm47Ci0JfQotCW5vdGlmeV9waXBlWzBdID0gLTE7CS8qIHJlYWQgZW5kICovCi0Jbm90aWZ5X3BpcGVbMV0gPSAtMTsJLyogd3JpdGUgZW5kICovCi19Ci1zdGF0aWMgdm9pZAotbm90aWZ5X3BhcmVudCh2b2lkKQotewotCWlmIChub3RpZnlfcGlwZVsxXSAhPSAtMSkKLQkJd3JpdGUobm90aWZ5X3BpcGVbMV0sICIiLCAxKTsKLX0KLXN0YXRpYyB2b2lkCi1ub3RpZnlfcHJlcGFyZShmZF9zZXQgKnJlYWRzZXQpCi17Ci0JaWYgKG5vdGlmeV9waXBlWzBdICE9IC0xKQotCQlGRF9TRVQobm90aWZ5X3BpcGVbMF0sIHJlYWRzZXQpOwotfQotc3RhdGljIHZvaWQKLW5vdGlmeV9kb25lKGZkX3NldCAqcmVhZHNldCkKLXsKLQljaGFyIGM7Ci0KLQlpZiAobm90aWZ5X3BpcGVbMF0gIT0gLTEgJiYgRkRfSVNTRVQobm90aWZ5X3BpcGVbMF0sIHJlYWRzZXQpKQotCQl3aGlsZSAocmVhZChub3RpZnlfcGlwZVswXSwgJmMsIDEpICE9IC0xKQotCQkJZGVidWcyKCJub3RpZnlfZG9uZTogcmVhZGluZyIpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1zaWdjaGxkX2hhbmRsZXIoaW50IHNpZykKLXsKLQlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwotCWNoaWxkX3Rlcm1pbmF0ZWQgPSAxOwotI2lmbmRlZiBfVU5JQ09TCi0JbXlzaWduYWwoU0lHQ0hMRCwgc2lnY2hsZF9oYW5kbGVyKTsKLSNlbmRpZgotCW5vdGlmeV9wYXJlbnQoKTsKLQllcnJubyA9IHNhdmVfZXJybm87Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNpZ3Rlcm1faGFuZGxlcihpbnQgc2lnKQotewotCXJlY2VpdmVkX3NpZ3Rlcm0gPSBzaWc7Ci19Ci0KLS8qCi0gKiBNYWtlIHBhY2tldHMgZnJvbSBidWZmZXJlZCBzdGRlcnIgZGF0YSwgYW5kIGJ1ZmZlciBpdCBmb3Igc2VuZGluZwotICogdG8gdGhlIGNsaWVudC4KLSAqLwotc3RhdGljIHZvaWQKLW1ha2VfcGFja2V0c19mcm9tX3N0ZGVycl9kYXRhKHZvaWQpCi17Ci0JdV9pbnQgbGVuOwotCi0JLyogU2VuZCBidWZmZXJlZCBzdGRlcnIgZGF0YSB0byB0aGUgY2xpZW50LiAqLwotCXdoaWxlIChidWZmZXJfbGVuKCZzdGRlcnJfYnVmZmVyKSA+IDAgJiYKLQkgICAgcGFja2V0X25vdF92ZXJ5X211Y2hfZGF0YV90b193cml0ZSgpKSB7Ci0JCWxlbiA9IGJ1ZmZlcl9sZW4oJnN0ZGVycl9idWZmZXIpOwotCQlpZiAocGFja2V0X2lzX2ludGVyYWN0aXZlKCkpIHsKLQkJCWlmIChsZW4gPiA1MTIpCi0JCQkJbGVuID0gNTEyOwotCQl9IGVsc2UgewotCQkJLyogS2VlcCB0aGUgcGFja2V0cyBhdCByZWFzb25hYmxlIHNpemUuICovCi0JCQlpZiAobGVuID4gcGFja2V0X2dldF9tYXhzaXplKCkpCi0JCQkJbGVuID0gcGFja2V0X2dldF9tYXhzaXplKCk7Ci0JCX0KLQkJcGFja2V0X3N0YXJ0KFNTSF9TTVNHX1NUREVSUl9EQVRBKTsKLQkJcGFja2V0X3B1dF9zdHJpbmcoYnVmZmVyX3B0cigmc3RkZXJyX2J1ZmZlciksIGxlbik7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JCWJ1ZmZlcl9jb25zdW1lKCZzdGRlcnJfYnVmZmVyLCBsZW4pOwotCQlzdGRlcnJfYnl0ZXMgKz0gbGVuOwotCX0KLX0KLQotLyoKLSAqIE1ha2UgcGFja2V0cyBmcm9tIGJ1ZmZlcmVkIHN0ZG91dCBkYXRhLCBhbmQgYnVmZmVyIGl0IGZvciBzZW5kaW5nIHRvIHRoZQotICogY2xpZW50LgotICovCi1zdGF0aWMgdm9pZAotbWFrZV9wYWNrZXRzX2Zyb21fc3Rkb3V0X2RhdGEodm9pZCkKLXsKLQl1X2ludCBsZW47Ci0KLQkvKiBTZW5kIGJ1ZmZlcmVkIHN0ZG91dCBkYXRhIHRvIHRoZSBjbGllbnQuICovCi0Jd2hpbGUgKGJ1ZmZlcl9sZW4oJnN0ZG91dF9idWZmZXIpID4gMCAmJgotCSAgICBwYWNrZXRfbm90X3ZlcnlfbXVjaF9kYXRhX3RvX3dyaXRlKCkpIHsKLQkJbGVuID0gYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcik7Ci0JCWlmIChwYWNrZXRfaXNfaW50ZXJhY3RpdmUoKSkgewotCQkJaWYgKGxlbiA+IDUxMikKLQkJCQlsZW4gPSA1MTI7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBLZWVwIHRoZSBwYWNrZXRzIGF0IHJlYXNvbmFibGUgc2l6ZS4gKi8KLQkJCWlmIChsZW4gPiBwYWNrZXRfZ2V0X21heHNpemUoKSkKLQkJCQlsZW4gPSBwYWNrZXRfZ2V0X21heHNpemUoKTsKLQkJfQotCQlwYWNrZXRfc3RhcnQoU1NIX1NNU0dfU1RET1VUX0RBVEEpOwotCQlwYWNrZXRfcHV0X3N0cmluZyhidWZmZXJfcHRyKCZzdGRvdXRfYnVmZmVyKSwgbGVuKTsKLQkJcGFja2V0X3NlbmQoKTsKLQkJYnVmZmVyX2NvbnN1bWUoJnN0ZG91dF9idWZmZXIsIGxlbik7Ci0JCXN0ZG91dF9ieXRlcyArPSBsZW47Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotY2xpZW50X2FsaXZlX2NoZWNrKHZvaWQpCi17Ci0JaW50IGNoYW5uZWxfaWQ7Ci0KLQkvKiB0aW1lb3V0LCBjaGVjayB0byBzZWUgaG93IG1hbnkgd2UgaGF2ZSBoYWQgKi8KLQlpZiAocGFja2V0X2luY19hbGl2ZV90aW1lb3V0cygpID4gb3B0aW9ucy5jbGllbnRfYWxpdmVfY291bnRfbWF4KSB7Ci0JCWxvZ2l0KCJUaW1lb3V0LCBjbGllbnQgbm90IHJlc3BvbmRpbmcuIik7Ci0JCWNsZWFudXBfZXhpdCgyNTUpOwotCX0KLQotCS8qCi0JICogc2VuZCBhIGJvZ3VzIGdsb2JhbC9jaGFubmVsIHJlcXVlc3Qgd2l0aCAid2FudHJlcGx5IiwKLQkgKiB3ZSBzaG91bGQgZ2V0IGJhY2sgYSBmYWlsdXJlCi0JICovCi0JaWYgKChjaGFubmVsX2lkID0gY2hhbm5lbF9maW5kX29wZW4oKSkgPT0gLTEpIHsKLQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0dMT0JBTF9SRVFVRVNUKTsKLQkJcGFja2V0X3B1dF9jc3RyaW5nKCJrZWVwYWxpdmVAb3BlbnNzaC5jb20iKTsKLQkJcGFja2V0X3B1dF9jaGFyKDEpOwkvKiBib29sZWFuOiB3YW50IHJlcGx5ICovCi0JfSBlbHNlIHsKLQkJY2hhbm5lbF9yZXF1ZXN0X3N0YXJ0KGNoYW5uZWxfaWQsICJrZWVwYWxpdmVAb3BlbnNzaC5jb20iLCAxKTsKLQl9Ci0JcGFja2V0X3NlbmQoKTsKLX0KLQotLyoKLSAqIFNsZWVwIGluIHNlbGVjdCgpIHVudGlsIHdlIGNhbiBkbyBzb21ldGhpbmcuICBUaGlzIHdpbGwgaW5pdGlhbGl6ZSB0aGUKLSAqIHNlbGVjdCBtYXNrcy4gIFVwb24gcmV0dXJuLCB0aGUgbWFza3Mgd2lsbCBpbmRpY2F0ZSB3aGljaCBkZXNjcmlwdG9ycwotICogaGF2ZSBkYXRhIG9yIGNhbiBhY2NlcHQgZGF0YS4gIE9wdGlvbmFsbHksIGEgbWF4aW11bSB0aW1lIGNhbiBiZSBzcGVjaWZpZWQKLSAqIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHdhaXQgKDAgPSBpbmZpbml0ZSkuCi0gKi8KLXN0YXRpYyB2b2lkCi13YWl0X3VudGlsX2Nhbl9kb19zb21ldGhpbmcoZmRfc2V0ICoqcmVhZHNldHAsIGZkX3NldCAqKndyaXRlc2V0cCwgaW50ICptYXhmZHAsCi0gICAgdV9pbnQgKm5hbGxvY3AsIHVfaW50IG1heF90aW1lX21pbGxpc2Vjb25kcykKLXsKLQlzdHJ1Y3QgdGltZXZhbCB0diwgKnR2cDsKLQlpbnQgcmV0OwotCWludCBjbGllbnRfYWxpdmVfc2NoZWR1bGVkID0gMDsKLQlpbnQgcHJvZ3JhbV9hbGl2ZV9zY2hlZHVsZWQgPSAwOwotCi0JLyoKLQkgKiBpZiB1c2luZyBjbGllbnRfYWxpdmUsIHNldCB0aGUgbWF4IHRpbWVvdXQgYWNjb3JkaW5nbHksCi0JICogYW5kIGluZGljYXRlIHRoYXQgdGhpcyBwYXJ0aWN1bGFyIHRpbWVvdXQgd2FzIGZvciBjbGllbnQKLQkgKiBhbGl2ZSBieSBzZXR0aW5nIHRoZSBjbGllbnRfYWxpdmVfc2NoZWR1bGVkIGZsYWcuCi0JICoKLQkgKiB0aGlzIGNvdWxkIGJlIHJhbmRvbWl6ZWQgc29tZXdoYXQgdG8gbWFrZSB0cmFmZmljCi0JICogYW5hbHlzaXMgbW9yZSBkaWZmaWN1bHQsIGJ1dCB3ZSdyZSBub3QgZG9pbmcgaXQgeWV0LgotCSAqLwotCWlmIChjb21wYXQyMCAmJgotCSAgICBtYXhfdGltZV9taWxsaXNlY29uZHMgPT0gMCAmJiBvcHRpb25zLmNsaWVudF9hbGl2ZV9pbnRlcnZhbCkgewotCQljbGllbnRfYWxpdmVfc2NoZWR1bGVkID0gMTsKLQkJbWF4X3RpbWVfbWlsbGlzZWNvbmRzID0gb3B0aW9ucy5jbGllbnRfYWxpdmVfaW50ZXJ2YWwgKiAxMDAwOwotCX0KLQotCS8qIEFsbG9jYXRlIGFuZCB1cGRhdGUgc2VsZWN0KCkgbWFza3MgZm9yIGNoYW5uZWwgZGVzY3JpcHRvcnMuICovCi0JY2hhbm5lbF9wcmVwYXJlX3NlbGVjdChyZWFkc2V0cCwgd3JpdGVzZXRwLCBtYXhmZHAsIG5hbGxvY3AsIDApOwotCi0JaWYgKGNvbXBhdDIwKSB7Ci0jaWYgMAotCQkvKiB3cm9uZzogYmFkIGNvbmRpdGlvbiBYWFggKi8KLQkJaWYgKGNoYW5uZWxfbm90X3ZlcnlfbXVjaF9idWZmZXJlZF9kYXRhKCkpCi0jZW5kaWYKLQkJRkRfU0VUKGNvbm5lY3Rpb25faW4sICpyZWFkc2V0cCk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogUmVhZCBwYWNrZXRzIGZyb20gdGhlIGNsaWVudCB1bmxlc3Mgd2UgaGF2ZSB0b28gbXVjaAotCQkgKiBidWZmZXJlZCBzdGRpbiBvciBjaGFubmVsIGRhdGEuCi0JCSAqLwotCQlpZiAoYnVmZmVyX2xlbigmc3RkaW5fYnVmZmVyKSA8IGJ1ZmZlcl9oaWdoICYmCi0JCSAgICBjaGFubmVsX25vdF92ZXJ5X211Y2hfYnVmZmVyZWRfZGF0YSgpKQotCQkJRkRfU0VUKGNvbm5lY3Rpb25faW4sICpyZWFkc2V0cCk7Ci0JCS8qCi0JCSAqIElmIHRoZXJlIGlzIG5vdCB0b28gbXVjaCBkYXRhIGFscmVhZHkgYnVmZmVyZWQgZ29pbmcgdG8KLQkJICogdGhlIGNsaWVudCwgdHJ5IHRvIGdldCBzb21lIG1vcmUgZGF0YSBmcm9tIHRoZSBwcm9ncmFtLgotCQkgKi8KLQkJaWYgKHBhY2tldF9ub3RfdmVyeV9tdWNoX2RhdGFfdG9fd3JpdGUoKSkgewotCQkJcHJvZ3JhbV9hbGl2ZV9zY2hlZHVsZWQgPSBjaGlsZF90ZXJtaW5hdGVkOwotCQkJaWYgKCFmZG91dF9lb2YpCi0JCQkJRkRfU0VUKGZkb3V0LCAqcmVhZHNldHApOwotCQkJaWYgKCFmZGVycl9lb2YpCi0JCQkJRkRfU0VUKGZkZXJyLCAqcmVhZHNldHApOwotCQl9Ci0JCS8qCi0JCSAqIElmIHdlIGhhdmUgYnVmZmVyZWQgZGF0YSwgdHJ5IHRvIHdyaXRlIHNvbWUgb2YgdGhhdCBkYXRhCi0JCSAqIHRvIHRoZSBwcm9ncmFtLgotCQkgKi8KLQkJaWYgKGZkaW4gIT0gLTEgJiYgYnVmZmVyX2xlbigmc3RkaW5fYnVmZmVyKSA+IDApCi0JCQlGRF9TRVQoZmRpbiwgKndyaXRlc2V0cCk7Ci0JfQotCW5vdGlmeV9wcmVwYXJlKCpyZWFkc2V0cCk7Ci0KLQkvKgotCSAqIElmIHdlIGhhdmUgYnVmZmVyZWQgcGFja2V0IGRhdGEgZ29pbmcgdG8gdGhlIGNsaWVudCwgbWFyayB0aGF0Ci0JICogZGVzY3JpcHRvci4KLQkgKi8KLQlpZiAocGFja2V0X2hhdmVfZGF0YV90b193cml0ZSgpKQotCQlGRF9TRVQoY29ubmVjdGlvbl9vdXQsICp3cml0ZXNldHApOwotCi0JLyoKLQkgKiBJZiBjaGlsZCBoYXMgdGVybWluYXRlZCBhbmQgdGhlcmUgaXMgZW5vdWdoIGJ1ZmZlciBzcGFjZSB0byByZWFkCi0JICogZnJvbSBpdCwgdGhlbiByZWFkIGFzIG11Y2ggYXMgaXMgYXZhaWxhYmxlIGFuZCBleGl0LgotCSAqLwotCWlmIChjaGlsZF90ZXJtaW5hdGVkICYmIHBhY2tldF9ub3RfdmVyeV9tdWNoX2RhdGFfdG9fd3JpdGUoKSkKLQkJaWYgKG1heF90aW1lX21pbGxpc2Vjb25kcyA9PSAwIHx8IGNsaWVudF9hbGl2ZV9zY2hlZHVsZWQpCi0JCQltYXhfdGltZV9taWxsaXNlY29uZHMgPSAxMDA7Ci0KLQlpZiAobWF4X3RpbWVfbWlsbGlzZWNvbmRzID09IDApCi0JCXR2cCA9IE5VTEw7Ci0JZWxzZSB7Ci0JCXR2LnR2X3NlYyA9IG1heF90aW1lX21pbGxpc2Vjb25kcyAvIDEwMDA7Ci0JCXR2LnR2X3VzZWMgPSAxMDAwICogKG1heF90aW1lX21pbGxpc2Vjb25kcyAlIDEwMDApOwotCQl0dnAgPSAmdHY7Ci0JfQotCi0JLyogV2FpdCBmb3Igc29tZXRoaW5nIHRvIGhhcHBlbiwgb3IgdGhlIHRpbWVvdXQgdG8gZXhwaXJlLiAqLwotCXJldCA9IHNlbGVjdCgoKm1heGZkcCkrMSwgKnJlYWRzZXRwLCAqd3JpdGVzZXRwLCBOVUxMLCB0dnApOwotCi0JaWYgKHJldCA9PSAtMSkgewotCQltZW1zZXQoKnJlYWRzZXRwLCAwLCAqbmFsbG9jcCk7Ci0JCW1lbXNldCgqd3JpdGVzZXRwLCAwLCAqbmFsbG9jcCk7Ci0JCWlmIChlcnJubyAhPSBFSU5UUikKLQkJCWVycm9yKCJzZWxlY3Q6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JfSBlbHNlIHsKLQkJaWYgKHJldCA9PSAwICYmIGNsaWVudF9hbGl2ZV9zY2hlZHVsZWQpCi0JCQljbGllbnRfYWxpdmVfY2hlY2soKTsKLQkJaWYgKCFjb21wYXQyMCAmJiBwcm9ncmFtX2FsaXZlX3NjaGVkdWxlZCAmJiBmZGluX2lzX3R0eSkgewotCQkJaWYgKCFmZG91dF9lb2YpCi0JCQkJRkRfU0VUKGZkb3V0LCAqcmVhZHNldHApOwotCQkJaWYgKCFmZGVycl9lb2YpCi0JCQkJRkRfU0VUKGZkZXJyLCAqcmVhZHNldHApOwotCQl9Ci0JfQotCi0Jbm90aWZ5X2RvbmUoKnJlYWRzZXRwKTsKLX0KLQotLyoKLSAqIFByb2Nlc3NlcyBpbnB1dCBmcm9tIHRoZSBjbGllbnQgYW5kIHRoZSBwcm9ncmFtLiAgSW5wdXQgZGF0YSBpcyBzdG9yZWQKLSAqIGluIGJ1ZmZlcnMgYW5kIHByb2Nlc3NlZCBsYXRlci4KLSAqLwotc3RhdGljIHZvaWQKLXByb2Nlc3NfaW5wdXQoZmRfc2V0ICpyZWFkc2V0KQotewotCWludCBsZW47Ci0JY2hhciBidWZbMTYzODRdOwotCi0JLyogUmVhZCBhbmQgYnVmZmVyIGFueSBpbnB1dCBkYXRhIGZyb20gdGhlIGNsaWVudC4gKi8KLQlpZiAoRkRfSVNTRVQoY29ubmVjdGlvbl9pbiwgcmVhZHNldCkpIHsKLQkJaW50IGNvbnQgPSAwOwotCQlsZW4gPSByb2FtaW5nX3JlYWQoY29ubmVjdGlvbl9pbiwgYnVmLCBzaXplb2YoYnVmKSwgJmNvbnQpOwotCQlpZiAobGVuID09IDApIHsKLQkJCWlmIChjb250KQotCQkJCXJldHVybjsKLQkJCXZlcmJvc2UoIkNvbm5lY3Rpb24gY2xvc2VkIGJ5ICUuMTAwcyIsCi0JCQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSk7Ci0JCQljb25uZWN0aW9uX2Nsb3NlZCA9IDE7Ci0JCQlpZiAoY29tcGF0MjApCi0JCQkJcmV0dXJuOwotCQkJY2xlYW51cF9leGl0KDI1NSk7Ci0JCX0gZWxzZSBpZiAobGVuIDwgMCkgewotCQkJaWYgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTiAmJgotCQkJICAgIGVycm5vICE9IEVXT1VMREJMT0NLKSB7Ci0JCQkJdmVyYm9zZSgiUmVhZCBlcnJvciBmcm9tIHJlbW90ZSBob3N0ICIKLQkJCQkgICAgIiUuMTAwczogJS4xMDBzIiwKLQkJCQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQljbGVhbnVwX2V4aXQoMjU1KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIEJ1ZmZlciBhbnkgcmVjZWl2ZWQgZGF0YS4gKi8KLQkJCXBhY2tldF9wcm9jZXNzX2luY29taW5nKGJ1ZiwgbGVuKTsKLQkJfQotCX0KLQlpZiAoY29tcGF0MjApCi0JCXJldHVybjsKLQotCS8qIFJlYWQgYW5kIGJ1ZmZlciBhbnkgYXZhaWxhYmxlIHN0ZG91dCBkYXRhIGZyb20gdGhlIHByb2dyYW0uICovCi0JaWYgKCFmZG91dF9lb2YgJiYgRkRfSVNTRVQoZmRvdXQsIHJlYWRzZXQpKSB7Ci0JCWVycm5vID0gMDsKLQkJbGVuID0gcmVhZChmZG91dCwgYnVmLCBzaXplb2YoYnVmKSk7Ci0JCWlmIChsZW4gPCAwICYmIChlcnJubyA9PSBFSU5UUiB8fCAoKGVycm5vID09IEVBR0FJTiB8fAotCQkgICAgZXJybm8gPT0gRVdPVUxEQkxPQ0spICYmICFjaGlsZF90ZXJtaW5hdGVkKSkpIHsKLQkJCS8qIGRvIG5vdGhpbmcgKi8KLSNpZm5kZWYgUFRZX1pFUk9SRUFECi0JCX0gZWxzZSBpZiAobGVuIDw9IDApIHsKLSNlbHNlCi0JCX0gZWxzZSBpZiAoKCFpc2F0dHkoZmRvdXQpICYmIGxlbiA8PSAwKSB8fAotCQkgICAgKGlzYXR0eShmZG91dCkgJiYgKGxlbiA8IDAgfHwgKGxlbiA9PSAwICYmIGVycm5vICE9IDApKSkpIHsKLSNlbmRpZgotCQkJZmRvdXRfZW9mID0gMTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlcl9hcHBlbmQoJnN0ZG91dF9idWZmZXIsIGJ1ZiwgbGVuKTsKLQkJCWZkb3V0X2J5dGVzICs9IGxlbjsKLQkJfQotCX0KLQkvKiBSZWFkIGFuZCBidWZmZXIgYW55IGF2YWlsYWJsZSBzdGRlcnIgZGF0YSBmcm9tIHRoZSBwcm9ncmFtLiAqLwotCWlmICghZmRlcnJfZW9mICYmIEZEX0lTU0VUKGZkZXJyLCByZWFkc2V0KSkgewotCQllcnJubyA9IDA7Ci0JCWxlbiA9IHJlYWQoZmRlcnIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCQlpZiAobGVuIDwgMCAmJiAoZXJybm8gPT0gRUlOVFIgfHwgKChlcnJubyA9PSBFQUdBSU4gfHwKLQkJICAgIGVycm5vID09IEVXT1VMREJMT0NLKSAmJiAhY2hpbGRfdGVybWluYXRlZCkpKSB7Ci0JCQkvKiBkbyBub3RoaW5nICovCi0jaWZuZGVmIFBUWV9aRVJPUkVBRAotCQl9IGVsc2UgaWYgKGxlbiA8PSAwKSB7Ci0jZWxzZQotCQl9IGVsc2UgaWYgKCghaXNhdHR5KGZkZXJyKSAmJiBsZW4gPD0gMCkgfHwKLQkJICAgIChpc2F0dHkoZmRlcnIpICYmIChsZW4gPCAwIHx8IChsZW4gPT0gMCAmJiBlcnJubyAhPSAwKSkpKSB7Ci0jZW5kaWYKLQkJCWZkZXJyX2VvZiA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlidWZmZXJfYXBwZW5kKCZzdGRlcnJfYnVmZmVyLCBidWYsIGxlbik7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBTZW5kcyBkYXRhIGZyb20gaW50ZXJuYWwgYnVmZmVycyB0byBjbGllbnQgcHJvZ3JhbSBzdGRpbi4KLSAqLwotc3RhdGljIHZvaWQKLXByb2Nlc3Nfb3V0cHV0KGZkX3NldCAqd3JpdGVzZXQpCi17Ci0Jc3RydWN0IHRlcm1pb3MgdGlvOwotCXVfY2hhciAqZGF0YTsKLQl1X2ludCBkbGVuOwotCWludCBsZW47Ci0KLQkvKiBXcml0ZSBidWZmZXJlZCBkYXRhIHRvIHByb2dyYW0gc3RkaW4uICovCi0JaWYgKCFjb21wYXQyMCAmJiBmZGluICE9IC0xICYmIEZEX0lTU0VUKGZkaW4sIHdyaXRlc2V0KSkgewotCQlkYXRhID0gYnVmZmVyX3B0cigmc3RkaW5fYnVmZmVyKTsKLQkJZGxlbiA9IGJ1ZmZlcl9sZW4oJnN0ZGluX2J1ZmZlcik7Ci0JCWxlbiA9IHdyaXRlKGZkaW4sIGRhdGEsIGRsZW4pOwotCQlpZiAobGVuIDwgMCAmJgotCQkgICAgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykpIHsKLQkJCS8qIGRvIG5vdGhpbmcgKi8KLQkJfSBlbHNlIGlmIChsZW4gPD0gMCkgewotCQkJaWYgKGZkaW4gIT0gZmRvdXQpCi0JCQkJY2xvc2UoZmRpbik7Ci0JCQllbHNlCi0JCQkJc2h1dGRvd24oZmRpbiwgU0hVVF9XUik7IC8qIFdlIHdpbGwgbm8gbG9uZ2VyIHNlbmQuICovCi0JCQlmZGluID0gLTE7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBTdWNjZXNzZnVsIHdyaXRlLiAqLwotCQkJaWYgKGZkaW5faXNfdHR5ICYmIGRsZW4gPj0gMSAmJiBkYXRhWzBdICE9ICdccicgJiYKLQkJCSAgICB0Y2dldGF0dHIoZmRpbiwgJnRpbykgPT0gMCAmJgotCQkJICAgICEodGlvLmNfbGZsYWcgJiBFQ0hPKSAmJiAodGlvLmNfbGZsYWcgJiBJQ0FOT04pKSB7Ci0JCQkJLyoKLQkJCQkgKiBTaW11bGF0ZSBlY2hvIHRvIHJlZHVjZSB0aGUgaW1wYWN0IG9mCi0JCQkJICogdHJhZmZpYyBhbmFseXNpcwotCQkJCSAqLwotCQkJCXBhY2tldF9zZW5kX2lnbm9yZShsZW4pOwotCQkJCXBhY2tldF9zZW5kKCk7Ci0JCQl9Ci0JCQkvKiBDb25zdW1lIHRoZSBkYXRhIGZyb20gdGhlIGJ1ZmZlci4gKi8KLQkJCWJ1ZmZlcl9jb25zdW1lKCZzdGRpbl9idWZmZXIsIGxlbik7Ci0JCQkvKiBVcGRhdGUgdGhlIGNvdW50IG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIHByb2dyYW0uICovCi0JCQlzdGRpbl9ieXRlcyArPSBsZW47Ci0JCX0KLQl9Ci0JLyogU2VuZCBhbnkgYnVmZmVyZWQgcGFja2V0IGRhdGEgdG8gdGhlIGNsaWVudC4gKi8KLQlpZiAoRkRfSVNTRVQoY29ubmVjdGlvbl9vdXQsIHdyaXRlc2V0KSkKLQkJcGFja2V0X3dyaXRlX3BvbGwoKTsKLX0KLQotLyoKLSAqIFdhaXQgdW50aWwgYWxsIGJ1ZmZlcmVkIG91dHB1dCBoYXMgYmVlbiBzZW50IHRvIHRoZSBjbGllbnQuCi0gKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgcHJvZ3JhbSB0ZXJtaW5hdGVzLgotICovCi1zdGF0aWMgdm9pZAotZHJhaW5fb3V0cHV0KHZvaWQpCi17Ci0JLyogU2VuZCBhbnkgYnVmZmVyZWQgc3Rkb3V0IGRhdGEgdG8gdGhlIGNsaWVudC4gKi8KLQlpZiAoYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcikgPiAwKSB7Ci0JCXBhY2tldF9zdGFydChTU0hfU01TR19TVERPVVRfREFUQSk7Ci0JCXBhY2tldF9wdXRfc3RyaW5nKGJ1ZmZlcl9wdHIoJnN0ZG91dF9idWZmZXIpLAotCQkJCSAgYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcikpOwotCQlwYWNrZXRfc2VuZCgpOwotCQkvKiBVcGRhdGUgdGhlIGNvdW50IG9mIHNlbnQgYnl0ZXMuICovCi0JCXN0ZG91dF9ieXRlcyArPSBidWZmZXJfbGVuKCZzdGRvdXRfYnVmZmVyKTsKLQl9Ci0JLyogU2VuZCBhbnkgYnVmZmVyZWQgc3RkZXJyIGRhdGEgdG8gdGhlIGNsaWVudC4gKi8KLQlpZiAoYnVmZmVyX2xlbigmc3RkZXJyX2J1ZmZlcikgPiAwKSB7Ci0JCXBhY2tldF9zdGFydChTU0hfU01TR19TVERFUlJfREFUQSk7Ci0JCXBhY2tldF9wdXRfc3RyaW5nKGJ1ZmZlcl9wdHIoJnN0ZGVycl9idWZmZXIpLAotCQkJCSAgYnVmZmVyX2xlbigmc3RkZXJyX2J1ZmZlcikpOwotCQlwYWNrZXRfc2VuZCgpOwotCQkvKiBVcGRhdGUgdGhlIGNvdW50IG9mIHNlbnQgYnl0ZXMuICovCi0JCXN0ZGVycl9ieXRlcyArPSBidWZmZXJfbGVuKCZzdGRlcnJfYnVmZmVyKTsKLQl9Ci0JLyogV2FpdCB1bnRpbCBhbGwgYnVmZmVyZWQgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRvIHRoZSBjbGllbnQuICovCi0JcGFja2V0X3dyaXRlX3dhaXQoKTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfYnVmZmVyZWRfaW5wdXRfcGFja2V0cyh2b2lkKQotewotCWRpc3BhdGNoX3J1bihESVNQQVRDSF9OT05CTE9DSywgTlVMTCwgY29tcGF0MjAgPyB4eHhfa2V4IDogTlVMTCk7Ci19Ci0KLS8qCi0gKiBQZXJmb3JtcyB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbi4gIFRoaXMgaGFuZGxlcyBkYXRhIHRyYW5zbWlzc2lvbiBiZXR3ZWVuCi0gKiB0aGUgY2xpZW50IGFuZCB0aGUgcHJvZ3JhbS4gIE5vdGUgdGhhdCB0aGUgbm90aW9uIG9mIHN0ZGluLCBzdGRvdXQsIGFuZAotICogc3RkZXJyIGluIHRoaXMgZnVuY3Rpb24gaXMgc29ydCBvZiByZXZlcnNlZDogdGhpcyBmdW5jdGlvbiB3cml0ZXMgdG8KLSAqIHN0ZGluIChvZiB0aGUgY2hpbGQgcHJvZ3JhbSksIGFuZCByZWFkcyBmcm9tIHN0ZG91dCBhbmQgc3RkZXJyIChvZiB0aGUKLSAqIGNoaWxkIHByb2dyYW0pLgotICovCi12b2lkCi1zZXJ2ZXJfbG9vcChwaWRfdCBwaWQsIGludCBmZGluX2FyZywgaW50IGZkb3V0X2FyZywgaW50IGZkZXJyX2FyZykKLXsKLQlmZF9zZXQgKnJlYWRzZXQgPSBOVUxMLCAqd3JpdGVzZXQgPSBOVUxMOwotCWludCBtYXhfZmQgPSAwOwotCXVfaW50IG5hbGxvYyA9IDA7Ci0JaW50IHdhaXRfc3RhdHVzOwkvKiBTdGF0dXMgcmV0dXJuZWQgYnkgd2FpdCgpLiAqLwotCXBpZF90IHdhaXRfcGlkOwkJLyogcGlkIHJldHVybmVkIGJ5IHdhaXQoKS4gKi8KLQlpbnQgd2FpdGluZ190ZXJtaW5hdGlvbiA9IDA7CS8qIEhhdmUgZGlzcGxheWVkIHdhaXRpbmcgY2xvc2UgbWVzc2FnZS4gKi8KLQl1X2ludCBtYXhfdGltZV9taWxsaXNlY29uZHM7Ci0JdV9pbnQgcHJldmlvdXNfc3Rkb3V0X2J1ZmZlcl9ieXRlczsKLQl1X2ludCBzdGRvdXRfYnVmZmVyX2J5dGVzOwotCWludCB0eXBlOwotCi0JZGVidWcoIkVudGVyaW5nIGludGVyYWN0aXZlIHNlc3Npb24uIik7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBTSUdDSExEIGtsdWRnZS4gKi8KLQljaGlsZF90ZXJtaW5hdGVkID0gMDsKLQlteXNpZ25hbChTSUdDSExELCBzaWdjaGxkX2hhbmRsZXIpOwotCi0JaWYgKCF1c2VfcHJpdnNlcCkgewotCQlzaWduYWwoU0lHVEVSTSwgc2lndGVybV9oYW5kbGVyKTsKLQkJc2lnbmFsKFNJR0lOVCwgc2lndGVybV9oYW5kbGVyKTsKLQkJc2lnbmFsKFNJR1FVSVQsIHNpZ3Rlcm1faGFuZGxlcik7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBvdXIgZ2xvYmFsIHZhcmlhYmxlcy4gKi8KLQlmZGluID0gZmRpbl9hcmc7Ci0JZmRvdXQgPSBmZG91dF9hcmc7Ci0JZmRlcnIgPSBmZGVycl9hcmc7Ci0KLQkvKiBub25ibG9ja2luZyBJTyAqLwotCXNldF9ub25ibG9jayhmZGluKTsKLQlzZXRfbm9uYmxvY2soZmRvdXQpOwotCS8qIHdlIGRvbid0IGhhdmUgc3RkZXJyIGZvciBpbnRlcmFjdGl2ZSB0ZXJtaW5hbCBzZXNzaW9ucywgc2VlIGJlbG93ICovCi0JaWYgKGZkZXJyICE9IC0xKQotCQlzZXRfbm9uYmxvY2soZmRlcnIpOwotCi0JaWYgKCEoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX0lHTk9SRU1TRykgJiYgaXNhdHR5KGZkaW4pKQotCQlmZGluX2lzX3R0eSA9IDE7Ci0KLQljb25uZWN0aW9uX2luID0gcGFja2V0X2dldF9jb25uZWN0aW9uX2luKCk7Ci0JY29ubmVjdGlvbl9vdXQgPSBwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25fb3V0KCk7Ci0KLQlub3RpZnlfc2V0dXAoKTsKLQotCXByZXZpb3VzX3N0ZG91dF9idWZmZXJfYnl0ZXMgPSAwOwotCi0JLyogU2V0IGFwcHJveGltYXRlIEkvTyBidWZmZXIgc2l6ZS4gKi8KLQlpZiAocGFja2V0X2lzX2ludGVyYWN0aXZlKCkpCi0JCWJ1ZmZlcl9oaWdoID0gNDA5NjsKLQllbHNlCi0JCWJ1ZmZlcl9oaWdoID0gNjQgKiAxMDI0OwotCi0jaWYgMAotCS8qIEluaXRpYWxpemUgbWF4X2ZkIHRvIHRoZSBtYXhpbXVtIG9mIHRoZSBrbm93biBmaWxlIGRlc2NyaXB0b3JzLiAqLwotCW1heF9mZCA9IE1BWChjb25uZWN0aW9uX2luLCBjb25uZWN0aW9uX291dCk7Ci0JbWF4X2ZkID0gTUFYKG1heF9mZCwgZmRpbik7Ci0JbWF4X2ZkID0gTUFYKG1heF9mZCwgZmRvdXQpOwotCWlmIChmZGVyciAhPSAtMSkKLQkJbWF4X2ZkID0gTUFYKG1heF9mZCwgZmRlcnIpOwotI2VuZGlmCi0KLQkvKiBJbml0aWFsaXplIEluaXRpYWxpemUgYnVmZmVycy4gKi8KLQlidWZmZXJfaW5pdCgmc3RkaW5fYnVmZmVyKTsKLQlidWZmZXJfaW5pdCgmc3Rkb3V0X2J1ZmZlcik7Ci0JYnVmZmVyX2luaXQoJnN0ZGVycl9idWZmZXIpOwotCi0JLyoKLQkgKiBJZiB3ZSBoYXZlIG5vIHNlcGFyYXRlIGZkZXJyICh3aGljaCBpcyB0aGUgY2FzZSB3aGVuIHdlIGhhdmUgYSBwdHkKLQkgKiAtIHRoZXJlIHdlIGNhbm5vdCBtYWtlIGRpZmZlcmVuY2UgYmV0d2VlbiBkYXRhIHNlbnQgdG8gc3Rkb3V0IGFuZAotCSAqIHN0ZGVyciksIGluZGljYXRlIHRoYXQgd2UgaGF2ZSBzZWVuIGFuIEVPRiBmcm9tIHN0ZGVyci4gIFRoaXMgd2F5Ci0JICogd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgZGVzY3JpcHRvciBldmVyeXdoZXJlLgotCSAqLwotCWlmIChmZGVyciA9PSAtMSkKLQkJZmRlcnJfZW9mID0gMTsKLQotCXNlcnZlcl9pbml0X2Rpc3BhdGNoKCk7Ci0KLQkvKiBNYWluIGxvb3Agb2YgdGhlIHNlcnZlciBmb3IgdGhlIGludGVyYWN0aXZlIHNlc3Npb24gbW9kZS4gKi8KLQlmb3IgKDs7KSB7Ci0KLQkJLyogUHJvY2VzcyBidWZmZXJlZCBwYWNrZXRzIGZyb20gdGhlIGNsaWVudC4gKi8KLQkJcHJvY2Vzc19idWZmZXJlZF9pbnB1dF9wYWNrZXRzKCk7Ci0KLQkJLyoKLQkJICogSWYgd2UgaGF2ZSByZWNlaXZlZCBlb2YsIGFuZCB0aGVyZSBpcyBubyBtb3JlIHBlbmRpbmcKLQkJICogaW5wdXQgZGF0YSwgY2F1c2UgYSByZWFsIGVvZiBieSBjbG9zaW5nIGZkaW4uCi0JCSAqLwotCQlpZiAoc3RkaW5fZW9mICYmIGZkaW4gIT0gLTEgJiYgYnVmZmVyX2xlbigmc3RkaW5fYnVmZmVyKSA9PSAwKSB7Ci0JCQlpZiAoZmRpbiAhPSBmZG91dCkKLQkJCQljbG9zZShmZGluKTsKLQkJCWVsc2UKLQkJCQlzaHV0ZG93bihmZGluLCBTSFVUX1dSKTsgLyogV2Ugd2lsbCBubyBsb25nZXIgc2VuZC4gKi8KLQkJCWZkaW4gPSAtMTsKLQkJfQotCQkvKiBNYWtlIHBhY2tldHMgZnJvbSBidWZmZXJlZCBzdGRlcnIgZGF0YSB0byBzZW5kIHRvIHRoZSBjbGllbnQuICovCi0JCW1ha2VfcGFja2V0c19mcm9tX3N0ZGVycl9kYXRhKCk7Ci0KLQkJLyoKLQkJICogTWFrZSBwYWNrZXRzIGZyb20gYnVmZmVyZWQgc3Rkb3V0IGRhdGEgdG8gc2VuZCB0byB0aGUKLQkJICogY2xpZW50LiBJZiB0aGVyZSBpcyB2ZXJ5IGxpdHRsZSB0byBzZW5kLCB0aGlzIGFycmFuZ2VzIHRvCi0JCSAqIG5vdCBzZW5kIHRoZW0gbm93LCBidXQgdG8gd2FpdCBhIHNob3J0IHdoaWxlIHRvIHNlZSBpZiB3ZQotCQkgKiBhcmUgZ2V0dGluZyBtb3JlIGRhdGEuIFRoaXMgaXMgbmVjZXNzYXJ5LCBhcyBzb21lIHN5c3RlbXMKLQkJICogd2FrZSB1cCByZWFkZXJzIGZyb20gYSBwdHkgYWZ0ZXIgZWFjaCBzZXBhcmF0ZSBjaGFyYWN0ZXIuCi0JCSAqLwotCQltYXhfdGltZV9taWxsaXNlY29uZHMgPSAwOwotCQlzdGRvdXRfYnVmZmVyX2J5dGVzID0gYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcik7Ci0JCWlmIChzdGRvdXRfYnVmZmVyX2J5dGVzICE9IDAgJiYgc3Rkb3V0X2J1ZmZlcl9ieXRlcyA8IDI1NiAmJgotCQkgICAgc3Rkb3V0X2J1ZmZlcl9ieXRlcyAhPSBwcmV2aW91c19zdGRvdXRfYnVmZmVyX2J5dGVzKSB7Ci0JCQkvKiB0cnkgYWdhaW4gYWZ0ZXIgYSB3aGlsZSAqLwotCQkJbWF4X3RpbWVfbWlsbGlzZWNvbmRzID0gMTA7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBTZW5kIGl0IG5vdy4gKi8KLQkJCW1ha2VfcGFja2V0c19mcm9tX3N0ZG91dF9kYXRhKCk7Ci0JCX0KLQkJcHJldmlvdXNfc3Rkb3V0X2J1ZmZlcl9ieXRlcyA9IGJ1ZmZlcl9sZW4oJnN0ZG91dF9idWZmZXIpOwotCi0JCS8qIFNlbmQgY2hhbm5lbCBkYXRhIHRvIHRoZSBjbGllbnQuICovCi0JCWlmIChwYWNrZXRfbm90X3ZlcnlfbXVjaF9kYXRhX3RvX3dyaXRlKCkpCi0JCQljaGFubmVsX291dHB1dF9wb2xsKCk7Ci0KLQkJLyoKLQkJICogQmFpbCBvdXQgb2YgdGhlIGxvb3AgaWYgdGhlIHByb2dyYW0gaGFzIGNsb3NlZCBpdHMgb3V0cHV0Ci0JCSAqIGRlc2NyaXB0b3JzLCBhbmQgd2UgaGF2ZSBubyBtb3JlIGRhdGEgdG8gc2VuZCB0byB0aGUKLQkJICogY2xpZW50LCBhbmQgdGhlcmUgaXMgbm8gcGVuZGluZyBidWZmZXJlZCBkYXRhLgotCQkgKi8KLQkJaWYgKGZkb3V0X2VvZiAmJiBmZGVycl9lb2YgJiYgIXBhY2tldF9oYXZlX2RhdGFfdG9fd3JpdGUoKSAmJgotCQkgICAgYnVmZmVyX2xlbigmc3Rkb3V0X2J1ZmZlcikgPT0gMCAmJiBidWZmZXJfbGVuKCZzdGRlcnJfYnVmZmVyKSA9PSAwKSB7Ci0JCQlpZiAoIWNoYW5uZWxfc3RpbGxfb3BlbigpKQotCQkJCWJyZWFrOwotCQkJaWYgKCF3YWl0aW5nX3Rlcm1pbmF0aW9uKSB7Ci0JCQkJY29uc3QgY2hhciAqcyA9ICJXYWl0aW5nIGZvciBmb3J3YXJkZWQgY29ubmVjdGlvbnMgdG8gdGVybWluYXRlLi4uXHJcbiI7Ci0JCQkJY2hhciAqY3A7Ci0JCQkJd2FpdGluZ190ZXJtaW5hdGlvbiA9IDE7Ci0JCQkJYnVmZmVyX2FwcGVuZCgmc3RkZXJyX2J1ZmZlciwgcywgc3RybGVuKHMpKTsKLQotCQkJCS8qIERpc3BsYXkgbGlzdCBvZiBvcGVuIGNoYW5uZWxzLiAqLwotCQkJCWNwID0gY2hhbm5lbF9vcGVuX21lc3NhZ2UoKTsKLQkJCQlidWZmZXJfYXBwZW5kKCZzdGRlcnJfYnVmZmVyLCBjcCwgc3RybGVuKGNwKSk7Ci0JCQkJeGZyZWUoY3ApOwotCQkJfQotCQl9Ci0JCW1heF9mZCA9IE1BWChjb25uZWN0aW9uX2luLCBjb25uZWN0aW9uX291dCk7Ci0JCW1heF9mZCA9IE1BWChtYXhfZmQsIGZkaW4pOwotCQltYXhfZmQgPSBNQVgobWF4X2ZkLCBmZG91dCk7Ci0JCW1heF9mZCA9IE1BWChtYXhfZmQsIGZkZXJyKTsKLQkJbWF4X2ZkID0gTUFYKG1heF9mZCwgbm90aWZ5X3BpcGVbMF0pOwotCi0JCS8qIFNsZWVwIGluIHNlbGVjdCgpIHVudGlsIHdlIGNhbiBkbyBzb21ldGhpbmcuICovCi0JCXdhaXRfdW50aWxfY2FuX2RvX3NvbWV0aGluZygmcmVhZHNldCwgJndyaXRlc2V0LCAmbWF4X2ZkLAotCQkgICAgJm5hbGxvYywgbWF4X3RpbWVfbWlsbGlzZWNvbmRzKTsKLQotCQlpZiAocmVjZWl2ZWRfc2lndGVybSkgewotCQkJbG9naXQoIkV4aXRpbmcgb24gc2lnbmFsICVkIiwgcmVjZWl2ZWRfc2lndGVybSk7Ci0JCQkvKiBDbGVhbiB1cCBzZXNzaW9ucywgdXRtcCwgZXRjLiAqLwotCQkJY2xlYW51cF9leGl0KDI1NSk7Ci0JCX0KLQotCQkvKiBQcm9jZXNzIGFueSBjaGFubmVsIGV2ZW50cy4gKi8KLQkJY2hhbm5lbF9hZnRlcl9zZWxlY3QocmVhZHNldCwgd3JpdGVzZXQpOwotCi0JCS8qIFByb2Nlc3MgaW5wdXQgZnJvbSB0aGUgY2xpZW50IGFuZCBmcm9tIHByb2dyYW0gc3Rkb3V0L3N0ZGVyci4gKi8KLQkJcHJvY2Vzc19pbnB1dChyZWFkc2V0KTsKLQotCQkvKiBQcm9jZXNzIG91dHB1dCB0byB0aGUgY2xpZW50IGFuZCB0byBwcm9ncmFtIHN0ZGluLiAqLwotCQlwcm9jZXNzX291dHB1dCh3cml0ZXNldCk7Ci0JfQotCWlmIChyZWFkc2V0KQotCQl4ZnJlZShyZWFkc2V0KTsKLQlpZiAod3JpdGVzZXQpCi0JCXhmcmVlKHdyaXRlc2V0KTsKLQotCS8qIENsZWFudXAgYW5kIHRlcm1pbmF0aW9uIGNvZGUuICovCi0KLQkvKiBXYWl0IHVudGlsIGFsbCBvdXRwdXQgaGFzIGJlZW4gc2VudCB0byB0aGUgY2xpZW50LiAqLwotCWRyYWluX291dHB1dCgpOwotCi0JZGVidWcoIkVuZCBvZiBpbnRlcmFjdGl2ZSBzZXNzaW9uOyBzdGRpbiAlbGQsIHN0ZG91dCAocmVhZCAlbGQsIHNlbnQgJWxkKSwgc3RkZXJyICVsZCBieXRlcy4iLAotCSAgICBzdGRpbl9ieXRlcywgZmRvdXRfYnl0ZXMsIHN0ZG91dF9ieXRlcywgc3RkZXJyX2J5dGVzKTsKLQotCS8qIEZyZWUgYW5kIGNsZWFyIHRoZSBidWZmZXJzLiAqLwotCWJ1ZmZlcl9mcmVlKCZzdGRpbl9idWZmZXIpOwotCWJ1ZmZlcl9mcmVlKCZzdGRvdXRfYnVmZmVyKTsKLQlidWZmZXJfZnJlZSgmc3RkZXJyX2J1ZmZlcik7Ci0KLQkvKiBDbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9ycy4gKi8KLQlpZiAoZmRvdXQgIT0gLTEpCi0JCWNsb3NlKGZkb3V0KTsKLQlmZG91dCA9IC0xOwotCWZkb3V0X2VvZiA9IDE7Ci0JaWYgKGZkZXJyICE9IC0xKQotCQljbG9zZShmZGVycik7Ci0JZmRlcnIgPSAtMTsKLQlmZGVycl9lb2YgPSAxOwotCWlmIChmZGluICE9IC0xKQotCQljbG9zZShmZGluKTsKLQlmZGluID0gLTE7Ci0KLQljaGFubmVsX2ZyZWVfYWxsKCk7Ci0KLQkvKiBXZSBubyBsb25nZXIgd2FudCBvdXIgU0lHQ0hMRCBoYW5kbGVyIHRvIGJlIGNhbGxlZC4gKi8KLQlteXNpZ25hbChTSUdDSExELCBTSUdfREZMKTsKLQotCXdoaWxlICgod2FpdF9waWQgPSB3YWl0cGlkKC0xLCAmd2FpdF9zdGF0dXMsIDApKSA8IDApCi0JCWlmIChlcnJubyAhPSBFSU5UUikKLQkJCXBhY2tldF9kaXNjb25uZWN0KCJ3YWl0OiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCWlmICh3YWl0X3BpZCAhPSBwaWQpCi0JCWVycm9yKCJTdHJhbmdlLCB3YWl0IHJldHVybmVkIHBpZCAlbGQsIGV4cGVjdGVkICVsZCIsCi0JCSAgICAobG9uZyl3YWl0X3BpZCwgKGxvbmcpcGlkKTsKLQotCS8qIENoZWNrIGlmIGl0IGV4aXRlZCBub3JtYWxseS4gKi8KLQlpZiAoV0lGRVhJVEVEKHdhaXRfc3RhdHVzKSkgewotCQkvKiBZZXMsIG5vcm1hbCBleGl0LiAgR2V0IGV4aXQgc3RhdHVzIGFuZCBzZW5kIGl0IHRvIHRoZSBjbGllbnQuICovCi0JCWRlYnVnKCJDb21tYW5kIGV4aXRlZCB3aXRoIHN0YXR1cyAlZC4iLCBXRVhJVFNUQVRVUyh3YWl0X3N0YXR1cykpOwotCQlwYWNrZXRfc3RhcnQoU1NIX1NNU0dfRVhJVFNUQVRVUyk7Ci0JCXBhY2tldF9wdXRfaW50KFdFWElUU1RBVFVTKHdhaXRfc3RhdHVzKSk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JCXBhY2tldF93cml0ZV93YWl0KCk7Ci0KLQkJLyoKLQkJICogV2FpdCBmb3IgZXhpdCBjb25maXJtYXRpb24uICBOb3RlIHRoYXQgdGhlcmUgbWlnaHQgYmUKLQkJICogb3RoZXIgcGFja2V0cyBjb21pbmcgYmVmb3JlIGl0OyBob3dldmVyLCB0aGUgcHJvZ3JhbSBoYXMKLQkJICogYWxyZWFkeSBkaWVkIHNvIHdlIGp1c3QgaWdub3JlIHRoZW0uICBUaGUgY2xpZW50IGlzCi0JCSAqIHN1cHBvc2VkIHRvIHJlc3BvbmQgd2l0aCB0aGUgY29uZmlybWF0aW9uIHdoZW4gaXQgcmVjZWl2ZXMKLQkJICogdGhlIGV4aXQgc3RhdHVzLgotCQkgKi8KLQkJZG8gewotCQkJdHlwZSA9IHBhY2tldF9yZWFkKCk7Ci0JCX0KLQkJd2hpbGUgKHR5cGUgIT0gU1NIX0NNU0dfRVhJVF9DT05GSVJNQVRJT04pOwotCi0JCWRlYnVnKCJSZWNlaXZlZCBleGl0IGNvbmZpcm1hdGlvbi4iKTsKLQkJcmV0dXJuOwotCX0KLQkvKiBDaGVjayBpZiB0aGUgcHJvZ3JhbSB0ZXJtaW5hdGVkIGR1ZSB0byBhIHNpZ25hbC4gKi8KLQlpZiAoV0lGU0lHTkFMRUQod2FpdF9zdGF0dXMpKQotCQlwYWNrZXRfZGlzY29ubmVjdCgiQ29tbWFuZCB0ZXJtaW5hdGVkIG9uIHNpZ25hbCAlZC4iLAotCQkJCSAgV1RFUk1TSUcod2FpdF9zdGF0dXMpKTsKLQotCS8qIFNvbWUgd2VpcmQgZXhpdCBjYXVzZS4gIEp1c3QgZXhpdC4gKi8KLQlwYWNrZXRfZGlzY29ubmVjdCgid2FpdCByZXR1cm5lZCBzdGF0dXMgJTA0eC4iLCB3YWl0X3N0YXR1cyk7Ci0JLyogTk9UUkVBQ0hFRCAqLwotfQotCi1zdGF0aWMgdm9pZAotY29sbGVjdF9jaGlsZHJlbih2b2lkKQotewotCXBpZF90IHBpZDsKLQlzaWdzZXRfdCBvc2V0LCBuc2V0OwotCWludCBzdGF0dXM7Ci0KLQkvKiBibG9jayBTSUdDSExEIHdoaWxlIHdlIGNoZWNrIGZvciBkZWFkIGNoaWxkcmVuICovCi0Jc2lnZW1wdHlzZXQoJm5zZXQpOwotCXNpZ2FkZHNldCgmbnNldCwgU0lHQ0hMRCk7Ci0Jc2lncHJvY21hc2soU0lHX0JMT0NLLCAmbnNldCwgJm9zZXQpOwotCWlmIChjaGlsZF90ZXJtaW5hdGVkKSB7Ci0JCWRlYnVnKCJSZWNlaXZlZCBTSUdDSExELiIpOwotCQl3aGlsZSAoKHBpZCA9IHdhaXRwaWQoLTEsICZzdGF0dXMsIFdOT0hBTkcpKSA+IDAgfHwKLQkJICAgIChwaWQgPCAwICYmIGVycm5vID09IEVJTlRSKSkKLQkJCWlmIChwaWQgPiAwKQotCQkJCXNlc3Npb25fY2xvc2VfYnlfcGlkKHBpZCwgc3RhdHVzKTsKLQkJY2hpbGRfdGVybWluYXRlZCA9IDA7Ci0JfQotCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb3NldCwgTlVMTCk7Ci19Ci0KLXZvaWQKLXNlcnZlcl9sb29wMihBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0JZmRfc2V0ICpyZWFkc2V0ID0gTlVMTCwgKndyaXRlc2V0ID0gTlVMTDsKLQlpbnQgcmVrZXlpbmcgPSAwLCBtYXhfZmQsIG5hbGxvYyA9IDA7Ci0KLQlkZWJ1ZygiRW50ZXJpbmcgaW50ZXJhY3RpdmUgc2Vzc2lvbiBmb3IgU1NIMi4iKTsKLQotCW15c2lnbmFsKFNJR0NITEQsIHNpZ2NobGRfaGFuZGxlcik7Ci0JY2hpbGRfdGVybWluYXRlZCA9IDA7Ci0JY29ubmVjdGlvbl9pbiA9IHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpOwotCWNvbm5lY3Rpb25fb3V0ID0gcGFja2V0X2dldF9jb25uZWN0aW9uX291dCgpOwotCi0JaWYgKCF1c2VfcHJpdnNlcCkgewotCQlzaWduYWwoU0lHVEVSTSwgc2lndGVybV9oYW5kbGVyKTsKLQkJc2lnbmFsKFNJR0lOVCwgc2lndGVybV9oYW5kbGVyKTsKLQkJc2lnbmFsKFNJR1FVSVQsIHNpZ3Rlcm1faGFuZGxlcik7Ci0JfQotCi0Jbm90aWZ5X3NldHVwKCk7Ci0KLQltYXhfZmQgPSBNQVgoY29ubmVjdGlvbl9pbiwgY29ubmVjdGlvbl9vdXQpOwotCW1heF9mZCA9IE1BWChtYXhfZmQsIG5vdGlmeV9waXBlWzBdKTsKLQotCXNlcnZlcl9pbml0X2Rpc3BhdGNoKCk7Ci0KLQlmb3IgKDs7KSB7Ci0JCXByb2Nlc3NfYnVmZmVyZWRfaW5wdXRfcGFja2V0cygpOwotCi0JCXJla2V5aW5nID0gKHh4eF9rZXggIT0gTlVMTCAmJiAheHh4X2tleC0+ZG9uZSk7Ci0KLQkJaWYgKCFyZWtleWluZyAmJiBwYWNrZXRfbm90X3ZlcnlfbXVjaF9kYXRhX3RvX3dyaXRlKCkpCi0JCQljaGFubmVsX291dHB1dF9wb2xsKCk7Ci0JCXdhaXRfdW50aWxfY2FuX2RvX3NvbWV0aGluZygmcmVhZHNldCwgJndyaXRlc2V0LCAmbWF4X2ZkLAotCQkgICAgJm5hbGxvYywgMCk7Ci0KLQkJaWYgKHJlY2VpdmVkX3NpZ3Rlcm0pIHsKLQkJCWxvZ2l0KCJFeGl0aW5nIG9uIHNpZ25hbCAlZCIsIHJlY2VpdmVkX3NpZ3Rlcm0pOwotCQkJLyogQ2xlYW4gdXAgc2Vzc2lvbnMsIHV0bXAsIGV0Yy4gKi8KLQkJCWNsZWFudXBfZXhpdCgyNTUpOwotCQl9Ci0KLQkJY29sbGVjdF9jaGlsZHJlbigpOwotCQlpZiAoIXJla2V5aW5nKSB7Ci0JCQljaGFubmVsX2FmdGVyX3NlbGVjdChyZWFkc2V0LCB3cml0ZXNldCk7Ci0JCQlpZiAocGFja2V0X25lZWRfcmVrZXlpbmcoKSkgewotCQkJCWRlYnVnKCJuZWVkIHJla2V5aW5nIik7Ci0JCQkJeHh4X2tleC0+ZG9uZSA9IDA7Ci0JCQkJa2V4X3NlbmRfa2V4aW5pdCh4eHhfa2V4KTsKLQkJCX0KLQkJfQotCQlwcm9jZXNzX2lucHV0KHJlYWRzZXQpOwotCQlpZiAoY29ubmVjdGlvbl9jbG9zZWQpCi0JCQlicmVhazsKLQkJcHJvY2Vzc19vdXRwdXQod3JpdGVzZXQpOwotCX0KLQljb2xsZWN0X2NoaWxkcmVuKCk7Ci0KLQlpZiAocmVhZHNldCkKLQkJeGZyZWUocmVhZHNldCk7Ci0JaWYgKHdyaXRlc2V0KQotCQl4ZnJlZSh3cml0ZXNldCk7Ci0KLQkvKiBmcmVlIGFsbCBjaGFubmVscywgbm8gbW9yZSByZWFkcyBhbmQgd3JpdGVzICovCi0JY2hhbm5lbF9mcmVlX2FsbCgpOwotCi0JLyogZnJlZSByZW1haW5pbmcgc2Vzc2lvbnMsIGUuZy4gcmVtb3ZlIHd0bXAgZW50cmllcyAqLwotCXNlc3Npb25fZGVzdHJveV9hbGwoTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXJ2ZXJfaW5wdXRfa2VlcF9hbGl2ZShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlkZWJ1ZygiR290ICVkLyV1IGZvciBrZWVwYWxpdmUiLCB0eXBlLCBzZXEpOwotCS8qCi0JICogcmVzZXQgdGltZW91dCwgc2luY2Ugd2UgZ290IGEgc2FuZSBhbnN3ZXIgZnJvbSB0aGUgY2xpZW50LgotCSAqIGV2ZW4gaWYgdGhpcyB3YXMgZ2VuZXJhdGVkIGJ5IHNvbWV0aGluZyBvdGhlciB0aGFuCi0JICogdGhlIGJvZ3VzIENIQU5ORUxfUkVRVUVTVCB3ZSBzZW5kIGZvciBrZWVwYWxpdmVzLgotCSAqLwotCXBhY2tldF9zZXRfYWxpdmVfdGltZW91dHMoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXJ2ZXJfaW5wdXRfc3RkaW5fZGF0YShpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQljaGFyICpkYXRhOwotCXVfaW50IGRhdGFfbGVuOwotCi0JLyogU3RkaW4gZGF0YSBmcm9tIHRoZSBjbGllbnQuICBBcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlci4gKi8KLQkvKiBJZ25vcmUgYW55IGRhdGEgaWYgdGhlIGNsaWVudCBoYXMgY2xvc2VkIHN0ZGluLiAqLwotCWlmIChmZGluID09IC0xKQotCQlyZXR1cm47Ci0JZGF0YSA9IHBhY2tldF9nZXRfc3RyaW5nKCZkYXRhX2xlbik7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCWJ1ZmZlcl9hcHBlbmQoJnN0ZGluX2J1ZmZlciwgZGF0YSwgZGF0YV9sZW4pOwotCW1lbXNldChkYXRhLCAwLCBkYXRhX2xlbik7Ci0JeGZyZWUoZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXJ2ZXJfaW5wdXRfZW9mKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQotewotCS8qCi0JICogRW9mIGZyb20gdGhlIGNsaWVudC4gIFRoZSBzdGRpbiBkZXNjcmlwdG9yIHRvIHRoZQotCSAqIHByb2dyYW0gd2lsbCBiZSBjbG9zZWQgd2hlbiBhbGwgYnVmZmVyZWQgZGF0YSBoYXMKLQkgKiBkcmFpbmVkLgotCSAqLwotCWRlYnVnKCJFT0YgcmVjZWl2ZWQgZm9yIHN0ZGluLiIpOwotCXBhY2tldF9jaGVja19lb20oKTsKLQlzdGRpbl9lb2YgPSAxOwotfQotCi1zdGF0aWMgdm9pZAotc2VydmVyX2lucHV0X3dpbmRvd19zaXplKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQotewotCXVfaW50IHJvdyA9IHBhY2tldF9nZXRfaW50KCk7Ci0JdV9pbnQgY29sID0gcGFja2V0X2dldF9pbnQoKTsKLQl1X2ludCB4cGl4ZWwgPSBwYWNrZXRfZ2V0X2ludCgpOwotCXVfaW50IHlwaXhlbCA9IHBhY2tldF9nZXRfaW50KCk7Ci0KLQlkZWJ1ZygiV2luZG93IGNoYW5nZSByZWNlaXZlZC4iKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0JaWYgKGZkaW4gIT0gLTEpCi0JCXB0eV9jaGFuZ2Vfd2luZG93X3NpemUoZmRpbiwgcm93LCBjb2wsIHhwaXhlbCwgeXBpeGVsKTsKLX0KLQotc3RhdGljIENoYW5uZWwgKgotc2VydmVyX3JlcXVlc3RfZGlyZWN0X3RjcGlwKHZvaWQpCi17Ci0JQ2hhbm5lbCAqYzsKLQljaGFyICp0YXJnZXQsICpvcmlnaW5hdG9yOwotCXVfc2hvcnQgdGFyZ2V0X3BvcnQsIG9yaWdpbmF0b3JfcG9ydDsKLQotCXRhcmdldCA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOwotCXRhcmdldF9wb3J0ID0gcGFja2V0X2dldF9pbnQoKTsKLQlvcmlnaW5hdG9yID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0Jb3JpZ2luYXRvcl9wb3J0ID0gcGFja2V0X2dldF9pbnQoKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlkZWJ1Zygic2VydmVyX3JlcXVlc3RfZGlyZWN0X3RjcGlwOiBvcmlnaW5hdG9yICVzIHBvcnQgJWQsIHRhcmdldCAlcyAiCi0JICAgICJwb3J0ICVkIiwgb3JpZ2luYXRvciwgb3JpZ2luYXRvcl9wb3J0LCB0YXJnZXQsIHRhcmdldF9wb3J0KTsKLQotCS8qIFhYWCBjaGVjayBwZXJtaXNzaW9uICovCi0JYyA9IGNoYW5uZWxfY29ubmVjdF90byh0YXJnZXQsIHRhcmdldF9wb3J0LAotCSAgICAiZGlyZWN0LXRjcGlwIiwgImRpcmVjdC10Y3BpcCIpOwotCi0JeGZyZWUob3JpZ2luYXRvcik7Ci0JeGZyZWUodGFyZ2V0KTsKLQotCXJldHVybiBjOwotfQotCi1zdGF0aWMgQ2hhbm5lbCAqCi1zZXJ2ZXJfcmVxdWVzdF90dW4odm9pZCkKLXsKLQlDaGFubmVsICpjID0gTlVMTDsKLQlpbnQgbW9kZSwgdHVuOwotCWludCBzb2NrOwotCi0JbW9kZSA9IHBhY2tldF9nZXRfaW50KCk7Ci0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBTU0hfVFVOTU9ERV9QT0lOVE9QT0lOVDoKLQljYXNlIFNTSF9UVU5NT0RFX0VUSEVSTkVUOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwYWNrZXRfc2VuZF9kZWJ1ZygiVW5zdXBwb3J0ZWQgdHVubmVsIGRldmljZSBtb2RlLiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKChvcHRpb25zLnBlcm1pdF90dW4gJiBtb2RlKSA9PSAwKSB7Ci0JCXBhY2tldF9zZW5kX2RlYnVnKCJTZXJ2ZXIgaGFzIHJlamVjdGVkIHR1bm5lbCBkZXZpY2UgIgotCQkgICAgImZvcndhcmRpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JdHVuID0gcGFja2V0X2dldF9pbnQoKTsKLQlpZiAoZm9yY2VkX3R1bl9kZXZpY2UgIT0gLTEpIHsKLQkJaWYgKHR1biAhPSBTU0hfVFVOSURfQU5ZICYmIGZvcmNlZF90dW5fZGV2aWNlICE9IHR1bikKLQkJCWdvdG8gZG9uZTsKLQkJdHVuID0gZm9yY2VkX3R1bl9kZXZpY2U7Ci0JfQotCXNvY2sgPSB0dW5fb3Blbih0dW4sIG1vZGUpOwotCWlmIChzb2NrIDwgMCkKLQkJZ290byBkb25lOwotCWMgPSBjaGFubmVsX25ldygidHVuIiwgU1NIX0NIQU5ORUxfT1BFTiwgc29jaywgc29jaywgLTEsCi0JICAgIENIQU5fVENQX1dJTkRPV19ERUZBVUxULCBDSEFOX1RDUF9QQUNLRVRfREVGQVVMVCwgMCwgInR1biIsIDEpOwotCWMtPmRhdGFncmFtID0gMTsKLSNpZiBkZWZpbmVkKFNTSF9UVU5fRklMVEVSKQotCWlmIChtb2RlID09IFNTSF9UVU5NT0RFX1BPSU5UT1BPSU5UKQotCQljaGFubmVsX3JlZ2lzdGVyX2ZpbHRlcihjLT5zZWxmLCBzeXNfdHVuX2luZmlsdGVyLAotCQkgICAgc3lzX3R1bl9vdXRmaWx0ZXIsIE5VTEwsIE5VTEwpOwotI2VuZGlmCi0KLSBkb25lOgotCWlmIChjID09IE5VTEwpCi0JCXBhY2tldF9zZW5kX2RlYnVnKCJGYWlsZWQgdG8gb3BlbiB0aGUgdHVubmVsIGRldmljZS4iKTsKLQlyZXR1cm4gYzsKLX0KLQotc3RhdGljIENoYW5uZWwgKgotc2VydmVyX3JlcXVlc3Rfc2Vzc2lvbih2b2lkKQotewotCUNoYW5uZWwgKmM7Ci0KLQlkZWJ1ZygiaW5wdXRfc2Vzc2lvbl9yZXF1ZXN0Iik7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JaWYgKG5vX21vcmVfc2Vzc2lvbnMpIHsKLQkJcGFja2V0X2Rpc2Nvbm5lY3QoIlBvc3NpYmxlIGF0dGFjazogYXR0ZW1wdCB0byBvcGVuIGEgc2Vzc2lvbiAiCi0JCSAgICAiYWZ0ZXIgYWRkaXRpb25hbCBzZXNzaW9ucyBkaXNhYmxlZCIpOwotCX0KLQotCS8qCi0JICogQSBzZXJ2ZXIgc2Vzc2lvbiBoYXMgbm8gZmQgdG8gcmVhZCBvciB3cml0ZSB1bnRpbCBhCi0JICogQ0hBTk5FTF9SRVFVRVNUIGZvciBhIHNoZWxsIGlzIG1hZGUsIHNvIHdlIHNldCB0aGUgdHlwZSB0bwotCSAqIFNTSF9DSEFOTkVMX0xBUlZBTC4gIEFkZGl0aW9uYWxseSwgYSBjYWxsYmFjayBmb3IgaGFuZGxpbmcgYWxsCi0JICogQ0hBTk5FTF9SRVFVRVNUIG1lc3NhZ2VzIGlzIHJlZ2lzdGVyZWQuCi0JICovCi0JYyA9IGNoYW5uZWxfbmV3KCJzZXNzaW9uIiwgU1NIX0NIQU5ORUxfTEFSVkFMLAotCSAgICAtMSwgLTEsIC0xLCAvKndpbmRvdyBzaXplKi8wLCBDSEFOX1NFU19QQUNLRVRfREVGQVVMVCwKLQkgICAgMCwgInNlcnZlci1zZXNzaW9uIiwgMSk7Ci0JaWYgKHNlc3Npb25fb3Blbih0aGVfYXV0aGN0eHQsIGMtPnNlbGYpICE9IDEpIHsKLQkJZGVidWcoInNlc3Npb24gb3BlbiBmYWlsZWQsIGZyZWUgY2hhbm5lbCAlZCIsIGMtPnNlbGYpOwotCQljaGFubmVsX2ZyZWUoYyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQljaGFubmVsX3JlZ2lzdGVyX2NsZWFudXAoYy0+c2VsZiwgc2Vzc2lvbl9jbG9zZV9ieV9jaGFubmVsLCAwKTsKLQlyZXR1cm4gYzsKLX0KLQotc3RhdGljIHZvaWQKLXNlcnZlcl9pbnB1dF9jaGFubmVsX29wZW4oaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JQ2hhbm5lbCAqYyA9IE5VTEw7Ci0JY2hhciAqY3R5cGU7Ci0JaW50IHJjaGFuOwotCXVfaW50IHJtYXhwYWNrLCByd2luZG93LCBsZW47Ci0KLQljdHlwZSA9IHBhY2tldF9nZXRfc3RyaW5nKCZsZW4pOwotCXJjaGFuID0gcGFja2V0X2dldF9pbnQoKTsKLQlyd2luZG93ID0gcGFja2V0X2dldF9pbnQoKTsKLQlybWF4cGFjayA9IHBhY2tldF9nZXRfaW50KCk7Ci0KLQlkZWJ1Zygic2VydmVyX2lucHV0X2NoYW5uZWxfb3BlbjogY3R5cGUgJXMgcmNoYW4gJWQgd2luICVkIG1heCAlZCIsCi0JICAgIGN0eXBlLCByY2hhbiwgcndpbmRvdywgcm1heHBhY2spOwotCi0JaWYgKHN0cmNtcChjdHlwZSwgInNlc3Npb24iKSA9PSAwKSB7Ci0JCWMgPSBzZXJ2ZXJfcmVxdWVzdF9zZXNzaW9uKCk7Ci0JfSBlbHNlIGlmIChzdHJjbXAoY3R5cGUsICJkaXJlY3QtdGNwaXAiKSA9PSAwKSB7Ci0JCWMgPSBzZXJ2ZXJfcmVxdWVzdF9kaXJlY3RfdGNwaXAoKTsKLQl9IGVsc2UgaWYgKHN0cmNtcChjdHlwZSwgInR1bkBvcGVuc3NoLmNvbSIpID09IDApIHsKLQkJYyA9IHNlcnZlcl9yZXF1ZXN0X3R1bigpOwotCX0KLQlpZiAoYyAhPSBOVUxMKSB7Ci0JCWRlYnVnKCJzZXJ2ZXJfaW5wdXRfY2hhbm5lbF9vcGVuOiBjb25maXJtICVzIiwgY3R5cGUpOwotCQljLT5yZW1vdGVfaWQgPSByY2hhbjsKLQkJYy0+cmVtb3RlX3dpbmRvdyA9IHJ3aW5kb3c7Ci0JCWMtPnJlbW90ZV9tYXhwYWNrZXQgPSBybWF4cGFjazsKLQkJaWYgKGMtPnR5cGUgIT0gU1NIX0NIQU5ORUxfQ09OTkVDVElORykgewotCQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0NIQU5ORUxfT1BFTl9DT05GSVJNQVRJT04pOwotCQkJcGFja2V0X3B1dF9pbnQoYy0+cmVtb3RlX2lkKTsKLQkJCXBhY2tldF9wdXRfaW50KGMtPnNlbGYpOwotCQkJcGFja2V0X3B1dF9pbnQoYy0+bG9jYWxfd2luZG93KTsKLQkJCXBhY2tldF9wdXRfaW50KGMtPmxvY2FsX21heHBhY2tldCk7Ci0JCQlwYWNrZXRfc2VuZCgpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZGVidWcoInNlcnZlcl9pbnB1dF9jaGFubmVsX29wZW46IGZhaWx1cmUgJXMiLCBjdHlwZSk7Ci0JCXBhY2tldF9zdGFydChTU0gyX01TR19DSEFOTkVMX09QRU5fRkFJTFVSRSk7Ci0JCXBhY2tldF9wdXRfaW50KHJjaGFuKTsKLQkJcGFja2V0X3B1dF9pbnQoU1NIMl9PUEVOX0FETUlOSVNUUkFUSVZFTFlfUFJPSElCSVRFRCk7Ci0JCWlmICghKGRhdGFmZWxsb3dzICYgU1NIX0JVR19PUEVORkFJTFVSRSkpIHsKLQkJCXBhY2tldF9wdXRfY3N0cmluZygib3BlbiBmYWlsZWQiKTsKLQkJCXBhY2tldF9wdXRfY3N0cmluZygiIik7Ci0JCX0KLQkJcGFja2V0X3NlbmQoKTsKLQl9Ci0JeGZyZWUoY3R5cGUpOwotfQotCi1zdGF0aWMgdm9pZAotc2VydmVyX2lucHV0X2dsb2JhbF9yZXF1ZXN0KGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQotewotCWNoYXIgKnJ0eXBlOwotCWludCB3YW50X3JlcGx5OwotCWludCBzdWNjZXNzID0gMCwgYWxsb2NhdGVkX2xpc3Rlbl9wb3J0ID0gMDsKLQotCXJ0eXBlID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0Jd2FudF9yZXBseSA9IHBhY2tldF9nZXRfY2hhcigpOwotCWRlYnVnKCJzZXJ2ZXJfaW5wdXRfZ2xvYmFsX3JlcXVlc3Q6IHJ0eXBlICVzIHdhbnRfcmVwbHkgJWQiLCBydHlwZSwgd2FudF9yZXBseSk7Ci0KLQkvKiAtUiBzdHlsZSBmb3J3YXJkaW5nICovCi0JaWYgKHN0cmNtcChydHlwZSwgInRjcGlwLWZvcndhcmQiKSA9PSAwKSB7Ci0JCXN0cnVjdCBwYXNzd2QgKnB3OwotCQljaGFyICpsaXN0ZW5fYWRkcmVzczsKLQkJdV9zaG9ydCBsaXN0ZW5fcG9ydDsKLQotCQlwdyA9IHRoZV9hdXRoY3R4dC0+cHc7Ci0JCWlmIChwdyA9PSBOVUxMIHx8ICF0aGVfYXV0aGN0eHQtPnZhbGlkKQotCQkJZmF0YWwoInNlcnZlcl9pbnB1dF9nbG9iYWxfcmVxdWVzdDogbm8vaW52YWxpZCB1c2VyIik7Ci0JCWxpc3Rlbl9hZGRyZXNzID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JCWxpc3Rlbl9wb3J0ID0gKHVfc2hvcnQpcGFja2V0X2dldF9pbnQoKTsKLQkJZGVidWcoInNlcnZlcl9pbnB1dF9nbG9iYWxfcmVxdWVzdDogdGNwaXAtZm9yd2FyZCBsaXN0ZW4gJXMgcG9ydCAlZCIsCi0JCSAgICBsaXN0ZW5fYWRkcmVzcywgbGlzdGVuX3BvcnQpOwotCi0JCS8qIGNoZWNrIHBlcm1pc3Npb25zICovCi0JCWlmICghb3B0aW9ucy5hbGxvd190Y3BfZm9yd2FyZGluZyB8fAotCQkgICAgbm9fcG9ydF9mb3J3YXJkaW5nX2ZsYWcgfHwKLQkJICAgICghd2FudF9yZXBseSAmJiBsaXN0ZW5fcG9ydCA9PSAwKQotI2lmbmRlZiBOT19JUFBPUlRfUkVTRVJWRURfQ09OQ0VQVAotCQkgICAgfHwgKGxpc3Rlbl9wb3J0ICE9IDAgJiYgbGlzdGVuX3BvcnQgPCBJUFBPUlRfUkVTRVJWRUQgJiYKLSAgICAgICAgICAgICAgICAgICAgcHctPnB3X3VpZCAhPSAwKQotI2VuZGlmCi0JCSAgICApIHsKLQkJCXN1Y2Nlc3MgPSAwOwotCQkJcGFja2V0X3NlbmRfZGVidWcoIlNlcnZlciBoYXMgZGlzYWJsZWQgcG9ydCBmb3J3YXJkaW5nLiIpOwotCQl9IGVsc2UgewotCQkJLyogU3RhcnQgbGlzdGVuaW5nIG9uIHRoZSBwb3J0ICovCi0JCQlzdWNjZXNzID0gY2hhbm5lbF9zZXR1cF9yZW1vdGVfZndkX2xpc3RlbmVyKAotCQkJICAgIGxpc3Rlbl9hZGRyZXNzLCBsaXN0ZW5fcG9ydCwKLQkJCSAgICAmYWxsb2NhdGVkX2xpc3Rlbl9wb3J0LCBvcHRpb25zLmdhdGV3YXlfcG9ydHMpOwotCQl9Ci0JCXhmcmVlKGxpc3Rlbl9hZGRyZXNzKTsKLQl9IGVsc2UgaWYgKHN0cmNtcChydHlwZSwgImNhbmNlbC10Y3BpcC1mb3J3YXJkIikgPT0gMCkgewotCQljaGFyICpjYW5jZWxfYWRkcmVzczsKLQkJdV9zaG9ydCBjYW5jZWxfcG9ydDsKLQotCQljYW5jZWxfYWRkcmVzcyA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOwotCQljYW5jZWxfcG9ydCA9ICh1X3Nob3J0KXBhY2tldF9nZXRfaW50KCk7Ci0JCWRlYnVnKCIlczogY2FuY2VsLXRjcGlwLWZvcndhcmQgYWRkciAlcyBwb3J0ICVkIiwgX19mdW5jX18sCi0JCSAgICBjYW5jZWxfYWRkcmVzcywgY2FuY2VsX3BvcnQpOwotCi0JCXN1Y2Nlc3MgPSBjaGFubmVsX2NhbmNlbF9ycG9ydF9saXN0ZW5lcihjYW5jZWxfYWRkcmVzcywKLQkJICAgIGNhbmNlbF9wb3J0KTsKLQkJeGZyZWUoY2FuY2VsX2FkZHJlc3MpOwotCX0gZWxzZSBpZiAoc3RyY21wKHJ0eXBlLCAibm8tbW9yZS1zZXNzaW9uc0BvcGVuc3NoLmNvbSIpID09IDApIHsKLQkJbm9fbW9yZV9zZXNzaW9ucyA9IDE7Ci0JCXN1Y2Nlc3MgPSAxOwotCX0KLQlpZiAod2FudF9yZXBseSkgewotCQlwYWNrZXRfc3RhcnQoc3VjY2VzcyA/Ci0JCSAgICBTU0gyX01TR19SRVFVRVNUX1NVQ0NFU1MgOiBTU0gyX01TR19SRVFVRVNUX0ZBSUxVUkUpOwotCQlpZiAoc3VjY2VzcyAmJiBhbGxvY2F0ZWRfbGlzdGVuX3BvcnQgPiAwKQotCQkJcGFja2V0X3B1dF9pbnQoYWxsb2NhdGVkX2xpc3Rlbl9wb3J0KTsKLQkJcGFja2V0X3NlbmQoKTsKLQkJcGFja2V0X3dyaXRlX3dhaXQoKTsKLQl9Ci0JeGZyZWUocnR5cGUpOwotfQotCi1zdGF0aWMgdm9pZAotc2VydmVyX2lucHV0X2NoYW5uZWxfcmVxKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQotewotCUNoYW5uZWwgKmM7Ci0JaW50IGlkLCByZXBseSwgc3VjY2VzcyA9IDA7Ci0JY2hhciAqcnR5cGU7Ci0KLQlpZCA9IHBhY2tldF9nZXRfaW50KCk7Ci0JcnR5cGUgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQlyZXBseSA9IHBhY2tldF9nZXRfY2hhcigpOwotCi0JZGVidWcoInNlcnZlcl9pbnB1dF9jaGFubmVsX3JlcTogY2hhbm5lbCAlZCByZXF1ZXN0ICVzIHJlcGx5ICVkIiwKLQkgICAgaWQsIHJ0eXBlLCByZXBseSk7Ci0KLQlpZiAoKGMgPSBjaGFubmVsX2xvb2t1cChpZCkpID09IE5VTEwpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJzZXJ2ZXJfaW5wdXRfY2hhbm5lbF9yZXE6ICIKLQkJICAgICJ1bmtub3duIGNoYW5uZWwgJWQiLCBpZCk7Ci0JaWYgKCFzdHJjbXAocnR5cGUsICJlb3dAb3BlbnNzaC5jb20iKSkgewotCQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0JCWNoYW5fcmN2ZF9lb3coYyk7Ci0JfSBlbHNlIGlmICgoYy0+dHlwZSA9PSBTU0hfQ0hBTk5FTF9MQVJWQUwgfHwKLQkgICAgYy0+dHlwZSA9PSBTU0hfQ0hBTk5FTF9PUEVOKSAmJiBzdHJjbXAoYy0+Y3R5cGUsICJzZXNzaW9uIikgPT0gMCkKLQkJc3VjY2VzcyA9IHNlc3Npb25faW5wdXRfY2hhbm5lbF9yZXEoYywgcnR5cGUpOwotCWlmIChyZXBseSkgewotCQlwYWNrZXRfc3RhcnQoc3VjY2VzcyA/Ci0JCSAgICBTU0gyX01TR19DSEFOTkVMX1NVQ0NFU1MgOiBTU0gyX01TR19DSEFOTkVMX0ZBSUxVUkUpOwotCQlwYWNrZXRfcHV0X2ludChjLT5yZW1vdGVfaWQpOwotCQlwYWNrZXRfc2VuZCgpOwotCX0KLQl4ZnJlZShydHlwZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXJ2ZXJfaW5pdF9kaXNwYXRjaF8yMCh2b2lkKQotewotCWRlYnVnKCJzZXJ2ZXJfaW5pdF9kaXNwYXRjaF8yMCIpOwotCWRpc3BhdGNoX2luaXQoJmRpc3BhdGNoX3Byb3RvY29sX2Vycm9yKTsKLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9DTE9TRSwgJmNoYW5uZWxfaW5wdXRfb2Nsb3NlKTsKLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9EQVRBLCAmY2hhbm5lbF9pbnB1dF9kYXRhKTsKLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9FT0YsICZjaGFubmVsX2lucHV0X2llb2YpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX0VYVEVOREVEX0RBVEEsICZjaGFubmVsX2lucHV0X2V4dGVuZGVkX2RhdGEpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX09QRU4sICZzZXJ2ZXJfaW5wdXRfY2hhbm5lbF9vcGVuKTsKLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9PUEVOX0NPTkZJUk1BVElPTiwgJmNoYW5uZWxfaW5wdXRfb3Blbl9jb25maXJtYXRpb24pOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX09QRU5fRkFJTFVSRSwgJmNoYW5uZWxfaW5wdXRfb3Blbl9mYWlsdXJlKTsKLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9SRVFVRVNULCAmc2VydmVyX2lucHV0X2NoYW5uZWxfcmVxKTsKLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfQ0hBTk5FTF9XSU5ET1dfQURKVVNULCAmY2hhbm5lbF9pbnB1dF93aW5kb3dfYWRqdXN0KTsKLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfR0xPQkFMX1JFUVVFU1QsICZzZXJ2ZXJfaW5wdXRfZ2xvYmFsX3JlcXVlc3QpOwotCS8qIGNsaWVudF9hbGl2ZSAqLwotCWRpc3BhdGNoX3NldChTU0gyX01TR19DSEFOTkVMX1NVQ0NFU1MsICZzZXJ2ZXJfaW5wdXRfa2VlcF9hbGl2ZSk7Ci0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX0NIQU5ORUxfRkFJTFVSRSwgJnNlcnZlcl9pbnB1dF9rZWVwX2FsaXZlKTsKLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfUkVRVUVTVF9TVUNDRVNTLCAmc2VydmVyX2lucHV0X2tlZXBfYWxpdmUpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19SRVFVRVNUX0ZBSUxVUkUsICZzZXJ2ZXJfaW5wdXRfa2VlcF9hbGl2ZSk7Ci0JLyogcmVrZXlpbmcgKi8KLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfS0VYSU5JVCwgJmtleF9pbnB1dF9rZXhpbml0KTsKLX0KLXN0YXRpYyB2b2lkCi1zZXJ2ZXJfaW5pdF9kaXNwYXRjaF8xMyh2b2lkKQotewotCWRlYnVnKCJzZXJ2ZXJfaW5pdF9kaXNwYXRjaF8xMyIpOwotCWRpc3BhdGNoX2luaXQoTlVMTCk7Ci0JZGlzcGF0Y2hfc2V0KFNTSF9DTVNHX0VPRiwgJnNlcnZlcl9pbnB1dF9lb2YpOwotCWRpc3BhdGNoX3NldChTU0hfQ01TR19TVERJTl9EQVRBLCAmc2VydmVyX2lucHV0X3N0ZGluX2RhdGEpOwotCWRpc3BhdGNoX3NldChTU0hfQ01TR19XSU5ET1dfU0laRSwgJnNlcnZlcl9pbnB1dF93aW5kb3dfc2l6ZSk7Ci0JZGlzcGF0Y2hfc2V0KFNTSF9NU0dfQ0hBTk5FTF9DTE9TRSwgJmNoYW5uZWxfaW5wdXRfY2xvc2UpOwotCWRpc3BhdGNoX3NldChTU0hfTVNHX0NIQU5ORUxfQ0xPU0VfQ09ORklSTUFUSU9OLCAmY2hhbm5lbF9pbnB1dF9jbG9zZV9jb25maXJtYXRpb24pOwotCWRpc3BhdGNoX3NldChTU0hfTVNHX0NIQU5ORUxfREFUQSwgJmNoYW5uZWxfaW5wdXRfZGF0YSk7Ci0JZGlzcGF0Y2hfc2V0KFNTSF9NU0dfQ0hBTk5FTF9PUEVOX0NPTkZJUk1BVElPTiwgJmNoYW5uZWxfaW5wdXRfb3Blbl9jb25maXJtYXRpb24pOwotCWRpc3BhdGNoX3NldChTU0hfTVNHX0NIQU5ORUxfT1BFTl9GQUlMVVJFLCAmY2hhbm5lbF9pbnB1dF9vcGVuX2ZhaWx1cmUpOwotCWRpc3BhdGNoX3NldChTU0hfTVNHX1BPUlRfT1BFTiwgJmNoYW5uZWxfaW5wdXRfcG9ydF9vcGVuKTsKLX0KLXN0YXRpYyB2b2lkCi1zZXJ2ZXJfaW5pdF9kaXNwYXRjaF8xNSh2b2lkKQotewotCXNlcnZlcl9pbml0X2Rpc3BhdGNoXzEzKCk7Ci0JZGVidWcoInNlcnZlcl9pbml0X2Rpc3BhdGNoXzE1Iik7Ci0JZGlzcGF0Y2hfc2V0KFNTSF9NU0dfQ0hBTk5FTF9DTE9TRSwgJmNoYW5uZWxfaW5wdXRfaWVvZik7Ci0JZGlzcGF0Y2hfc2V0KFNTSF9NU0dfQ0hBTk5FTF9DTE9TRV9DT05GSVJNQVRJT04sICZjaGFubmVsX2lucHV0X29jbG9zZSk7Ci19Ci1zdGF0aWMgdm9pZAotc2VydmVyX2luaXRfZGlzcGF0Y2godm9pZCkKLXsKLQlpZiAoY29tcGF0MjApCi0JCXNlcnZlcl9pbml0X2Rpc3BhdGNoXzIwKCk7Ci0JZWxzZSBpZiAoY29tcGF0MTMpCi0JCXNlcnZlcl9pbml0X2Rpc3BhdGNoXzEzKCk7Ci0JZWxzZQotCQlzZXJ2ZXJfaW5pdF9kaXNwYXRjaF8xNSgpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmVybG9vcC5oIGIvc2VydmVybG9vcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzExNTU4Li4wMDAwMDAwCi0tLSBhL3NlcnZlcmxvb3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qICRPcGVuQlNEOiBzZXJ2ZXJsb29wLmgsdiAxLjYgMjAwNi8wMy8yNSAyMjoyMjo0MyBkam0gRXhwICQgKi8KLQotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0vKgotICogUGVyZm9ybXMgdGhlIGludGVyYWN0aXZlIHNlc3Npb24uICBUaGlzIGhhbmRsZXMgZGF0YSB0cmFuc21pc3Npb24gYmV0d2VlbgotICogdGhlIGNsaWVudCBhbmQgdGhlIHByb2dyYW0uICBOb3RlIHRoYXQgdGhlIG5vdGlvbiBvZiBzdGRpbiwgc3Rkb3V0LCBhbmQKLSAqIHN0ZGVyciBpbiB0aGlzIGZ1bmN0aW9uIGlzIHNvcnQgb2YgcmV2ZXJzZWQ6IHRoaXMgZnVuY3Rpb24gd3JpdGVzIHRvIHN0ZGluCi0gKiAob2YgdGhlIGNoaWxkIHByb2dyYW0pLCBhbmQgcmVhZHMgZnJvbSBzdGRvdXQgYW5kIHN0ZGVyciAob2YgdGhlIGNoaWxkCi0gKiBwcm9ncmFtKS4KLSAqLwotI2lmbmRlZiBTRVJWRVJMT09QX0gKLSNkZWZpbmUgU0VSVkVSTE9PUF9ICi0KLXZvaWQgICAgc2VydmVyX2xvb3AocGlkX3QsIGludCwgaW50LCBpbnQpOwotdm9pZCAgICBzZXJ2ZXJfbG9vcDIoQXV0aGN0eHQgKik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2Vzc2lvbi5jIGIvc2Vzc2lvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ4OGZhLi4wMDAwMDAwCi0tLSBhL3Nlc3Npb24uYworKysgL2Rldi9udWxsCkBAIC0xLDI3MzcgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNlc3Npb24uYyx2IDEuMjU4IDIwMTAvMTEvMjUgMDQ6MTA6MDkgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqCi0gKiBTU0gyIHN1cHBvcnQgYnkgTWFya3VzIEZyaWVkbC4KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdW4uaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8Z3JwLmg+Ci0jaWZkZWYgSEFWRV9QQVRIU19ICi0jaW5jbHVkZSA8cGF0aHMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAic3NoLmgiCi0jaW5jbHVkZSAic3NoMS5oIgotI2luY2x1ZGUgInNzaDIuaCIKLSNpbmNsdWRlICJzc2hwdHkuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJtYXRjaC5oIgotI2luY2x1ZGUgInVpZHN3YXAuaCIKLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJjaGFubmVscy5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImNpcGhlci5oIgotI2lmZGVmIEdTU0FQSQotI2luY2x1ZGUgInNzaC1nc3MuaCIKLSNlbmRpZgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgImF1dGgtb3B0aW9ucy5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgInNlcnZjb25mLmgiCi0jaW5jbHVkZSAic3NobG9naW4uaCIKLSNpbmNsdWRlICJzZXJ2ZXJsb29wLmgiCi0jaW5jbHVkZSAiY2Fub2hvc3QuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAic2Vzc2lvbi5oIgotI2luY2x1ZGUgImtleC5oIgotI2luY2x1ZGUgIm1vbml0b3Jfd3JhcC5oIgotI2luY2x1ZGUgInNmdHAuaCIKLQotI2lmIGRlZmluZWQoS1JCNSkgJiYgZGVmaW5lZChVU0VfQUZTKQotI2luY2x1ZGUgPGthZnMuaD4KLSNlbmRpZgotCi0jaWZkZWYgV0lUSF9TRUxJTlVYCi0jaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+Ci0jZW5kaWYKLQotI2RlZmluZSBJU19JTlRFUk5BTF9TRlRQKGMpIFwKLQkoIXN0cm5jbXAoYywgSU5URVJOQUxfU0ZUUF9OQU1FLCBzaXplb2YoSU5URVJOQUxfU0ZUUF9OQU1FKSAtIDEpICYmIFwKLQkgKGNbc2l6ZW9mKElOVEVSTkFMX1NGVFBfTkFNRSkgLSAxXSA9PSAnXDAnIHx8IFwKLQkgIGNbc2l6ZW9mKElOVEVSTkFMX1NGVFBfTkFNRSkgLSAxXSA9PSAnICcgfHwgXAotCSAgY1tzaXplb2YoSU5URVJOQUxfU0ZUUF9OQU1FKSAtIDFdID09ICdcdCcpKQotCi0vKiBmdW5jICovCi0KLVNlc3Npb24gKnNlc3Npb25fbmV3KHZvaWQpOwotdm9pZAlzZXNzaW9uX3NldF9mZHMoU2Vzc2lvbiAqLCBpbnQsIGludCwgaW50LCBpbnQsIGludCk7Ci12b2lkCXNlc3Npb25fcHR5X2NsZWFudXAoU2Vzc2lvbiAqKTsKLXZvaWQJc2Vzc2lvbl9wcm9jdGl0bGUoU2Vzc2lvbiAqKTsKLWludAlzZXNzaW9uX3NldHVwX3gxMWZ3ZChTZXNzaW9uICopOwotaW50CWRvX2V4ZWNfcHR5KFNlc3Npb24gKiwgY29uc3QgY2hhciAqKTsKLWludAlkb19leGVjX25vX3B0eShTZXNzaW9uICosIGNvbnN0IGNoYXIgKik7Ci1pbnQJZG9fZXhlYyhTZXNzaW9uICosIGNvbnN0IGNoYXIgKik7Ci12b2lkCWRvX2xvZ2luKFNlc3Npb24gKiwgY29uc3QgY2hhciAqKTsKLSNpZmRlZiBMT0dJTl9ORUVEU19VVE1QWAotc3RhdGljIHZvaWQJZG9fcHJlX2xvZ2luKFNlc3Npb24gKnMpOwotI2VuZGlmCi12b2lkCWRvX2NoaWxkKFNlc3Npb24gKiwgY29uc3QgY2hhciAqKTsKLXZvaWQJZG9fbW90ZCh2b2lkKTsKLWludAljaGVja19xdWlldGxvZ2luKFNlc3Npb24gKiwgY29uc3QgY2hhciAqKTsKLQotc3RhdGljIHZvaWQgZG9fYXV0aGVudGljYXRlZDEoQXV0aGN0eHQgKik7Ci1zdGF0aWMgdm9pZCBkb19hdXRoZW50aWNhdGVkMihBdXRoY3R4dCAqKTsKLQotc3RhdGljIGludCBzZXNzaW9uX3B0eV9yZXEoU2Vzc2lvbiAqKTsKLQotLyogaW1wb3J0ICovCi1leHRlcm4gU2VydmVyT3B0aW9ucyBvcHRpb25zOwotZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7Ci1leHRlcm4gaW50IGxvZ19zdGRlcnI7Ci1leHRlcm4gaW50IGRlYnVnX2ZsYWc7Ci1leHRlcm4gdV9pbnQgdXRtcF9sZW47Ci1leHRlcm4gaW50IHN0YXJ0dXBfcGlwZTsKLWV4dGVybiB2b2lkIGRlc3Ryb3lfc2Vuc2l0aXZlX2RhdGEodm9pZCk7Ci1leHRlcm4gQnVmZmVyIGxvZ2lubXNnOwotCi0vKiBvcmlnaW5hbCBjb21tYW5kIGZyb20gcGVlci4gKi8KLWNvbnN0IGNoYXIgKm9yaWdpbmFsX2NvbW1hbmQgPSBOVUxMOwotCi0vKiBkYXRhICovCi1zdGF0aWMgaW50IHNlc3Npb25zX2ZpcnN0X3VudXNlZCA9IC0xOwotc3RhdGljIGludCBzZXNzaW9uc19uYWxsb2MgPSAwOwotc3RhdGljIFNlc3Npb24gKnNlc3Npb25zID0gTlVMTDsKLQotI2RlZmluZSBTVUJTWVNURU1fTk9ORQkJCTAKLSNkZWZpbmUgU1VCU1lTVEVNX0VYVAkJCTEKLSNkZWZpbmUgU1VCU1lTVEVNX0lOVF9TRlRQCQkyCi0jZGVmaW5lIFNVQlNZU1RFTV9JTlRfU0ZUUF9FUlJPUgkzCi0KLSNpZmRlZiBIQVZFX0xPR0lOX0NBUAotbG9naW5fY2FwX3QgKmxjOwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaXNfY2hpbGQgPSAwOwotCi0vKiBOYW1lIGFuZCBkaXJlY3Rvcnkgb2Ygc29ja2V0IGZvciBhdXRoZW50aWNhdGlvbiBhZ2VudCBmb3J3YXJkaW5nLiAqLwotc3RhdGljIGNoYXIgKmF1dGhfc29ja19uYW1lID0gTlVMTDsKLXN0YXRpYyBjaGFyICphdXRoX3NvY2tfZGlyID0gTlVMTDsKLQotLyogcmVtb3ZlcyB0aGUgYWdlbnQgZm9yd2FyZGluZyBzb2NrZXQgKi8KLQotc3RhdGljIHZvaWQKLWF1dGhfc29ja19jbGVhbnVwX3Byb2Moc3RydWN0IHBhc3N3ZCAqcHcpCi17Ci0JaWYgKGF1dGhfc29ja19uYW1lICE9IE5VTEwpIHsKLQkJdGVtcG9yYXJpbHlfdXNlX3VpZChwdyk7Ci0JCXVubGluayhhdXRoX3NvY2tfbmFtZSk7Ci0JCXJtZGlyKGF1dGhfc29ja19kaXIpOwotCQlhdXRoX3NvY2tfbmFtZSA9IE5VTEw7Ci0JCXJlc3RvcmVfdWlkKCk7Ci0JfQotfQotCi1zdGF0aWMgaW50Ci1hdXRoX2lucHV0X3JlcXVlc3RfZm9yd2FyZGluZyhzdHJ1Y3QgcGFzc3dkICogcHcpCi17Ci0JQ2hhbm5lbCAqbmM7Ci0JaW50IHNvY2sgPSAtMTsKLQlzdHJ1Y3Qgc29ja2FkZHJfdW4gc3VuYWRkcjsKLQotCWlmIChhdXRoX3NvY2tfbmFtZSAhPSBOVUxMKSB7Ci0JCWVycm9yKCJhdXRoZW50aWNhdGlvbiBmb3J3YXJkaW5nIHJlcXVlc3RlZCB0d2ljZS4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogVGVtcG9yYXJpbHkgZHJvcCBwcml2aWxlZ2VkIHVpZCBmb3IgbWtkaXIvYmluZC4gKi8KLQl0ZW1wb3JhcmlseV91c2VfdWlkKHB3KTsKLQotCS8qIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgc29ja2V0IG5hbWUsIGFuZCBmb3JtYXQgdGhlIG5hbWUuICovCi0JYXV0aF9zb2NrX2RpciA9IHhzdHJkdXAoIi90bXAvc3NoLVhYWFhYWFhYWFgiKTsKLQotCS8qIENyZWF0ZSBwcml2YXRlIGRpcmVjdG9yeSBmb3Igc29ja2V0ICovCi0JaWYgKG1rZHRlbXAoYXV0aF9zb2NrX2RpcikgPT0gTlVMTCkgewotCQlwYWNrZXRfc2VuZF9kZWJ1ZygiQWdlbnQgZm9yd2FyZGluZyBkaXNhYmxlZDogIgotCQkgICAgIm1rZHRlbXAoKSBmYWlsZWQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJlc3RvcmVfdWlkKCk7Ci0JCXhmcmVlKGF1dGhfc29ja19kaXIpOwotCQlhdXRoX3NvY2tfZGlyID0gTlVMTDsKLQkJZ290byBhdXRoc29ja19lcnI7Ci0JfQotCi0JeGFzcHJpbnRmKCZhdXRoX3NvY2tfbmFtZSwgIiVzL2FnZW50LiVsZCIsCi0JICAgIGF1dGhfc29ja19kaXIsIChsb25nKSBnZXRwaWQoKSk7Ci0KLQkvKiBDcmVhdGUgdGhlIHNvY2tldC4gKi8KLQlzb2NrID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKLQlpZiAoc29jayA8IDApIHsKLQkJZXJyb3IoInNvY2tldDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmVzdG9yZV91aWQoKTsKLQkJZ290byBhdXRoc29ja19lcnI7Ci0JfQotCi0JLyogQmluZCBpdCB0byB0aGUgbmFtZS4gKi8KLQltZW1zZXQoJnN1bmFkZHIsIDAsIHNpemVvZihzdW5hZGRyKSk7Ci0Jc3VuYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKLQlzdHJsY3B5KHN1bmFkZHIuc3VuX3BhdGgsIGF1dGhfc29ja19uYW1lLCBzaXplb2Yoc3VuYWRkci5zdW5fcGF0aCkpOwotCi0JaWYgKGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzdW5hZGRyLCBzaXplb2Yoc3VuYWRkcikpIDwgMCkgewotCQllcnJvcigiYmluZDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmVzdG9yZV91aWQoKTsKLQkJZ290byBhdXRoc29ja19lcnI7Ci0JfQotCi0JLyogUmVzdG9yZSB0aGUgcHJpdmlsZWdlZCB1aWQuICovCi0JcmVzdG9yZV91aWQoKTsKLQotCS8qIFN0YXJ0IGxpc3RlbmluZyBvbiB0aGUgc29ja2V0LiAqLwotCWlmIChsaXN0ZW4oc29jaywgU1NIX0xJU1RFTl9CQUNLTE9HKSA8IDApIHsKLQkJZXJyb3IoImxpc3RlbjogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byBhdXRoc29ja19lcnI7Ci0JfQotCi0JLyogQWxsb2NhdGUgYSBjaGFubmVsIGZvciB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQgc29ja2V0LiAqLwotCW5jID0gY2hhbm5lbF9uZXcoImF1dGggc29ja2V0IiwKLQkgICAgU1NIX0NIQU5ORUxfQVVUSF9TT0NLRVQsIHNvY2ssIHNvY2ssIC0xLAotCSAgICBDSEFOX1gxMV9XSU5ET1dfREVGQVVMVCwgQ0hBTl9YMTFfUEFDS0VUX0RFRkFVTFQsCi0JICAgIDAsICJhdXRoIHNvY2tldCIsIDEpOwotCW5jLT5wYXRoID0geHN0cmR1cChhdXRoX3NvY2tfbmFtZSk7Ci0JcmV0dXJuIDE7Ci0KLSBhdXRoc29ja19lcnI6Ci0JaWYgKGF1dGhfc29ja19uYW1lICE9IE5VTEwpCi0JCXhmcmVlKGF1dGhfc29ja19uYW1lKTsKLQlpZiAoYXV0aF9zb2NrX2RpciAhPSBOVUxMKSB7Ci0JCXJtZGlyKGF1dGhfc29ja19kaXIpOwotCQl4ZnJlZShhdXRoX3NvY2tfZGlyKTsKLQl9Ci0JaWYgKHNvY2sgIT0gLTEpCi0JCWNsb3NlKHNvY2spOwotCWF1dGhfc29ja19uYW1lID0gTlVMTDsKLQlhdXRoX3NvY2tfZGlyID0gTlVMTDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfbG9naW5tc2codm9pZCkKLXsKLQlpZiAoYnVmZmVyX2xlbigmbG9naW5tc2cpID4gMCkgewotCQlidWZmZXJfYXBwZW5kKCZsb2dpbm1zZywgIlwwIiwgMSk7Ci0JCXByaW50ZigiJXMiLCAoY2hhciAqKWJ1ZmZlcl9wdHIoJmxvZ2lubXNnKSk7Ci0JCWJ1ZmZlcl9jbGVhcigmbG9naW5tc2cpOwotCX0KLX0KLQotdm9pZAotZG9fYXV0aGVudGljYXRlZChBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0Jc2V0cHJvY3RpdGxlKCIlcyIsIGF1dGhjdHh0LT5wdy0+cHdfbmFtZSk7Ci0KLQkvKiBzZXR1cCB0aGUgY2hhbm5lbCBsYXllciAqLwotCWlmICghbm9fcG9ydF9mb3J3YXJkaW5nX2ZsYWcgJiYgb3B0aW9ucy5hbGxvd190Y3BfZm9yd2FyZGluZykKLQkJY2hhbm5lbF9wZXJtaXRfYWxsX29wZW5zKCk7Ci0KLQlhdXRoX2RlYnVnX3NlbmQoKTsKLQotCWlmIChjb21wYXQyMCkKLQkJZG9fYXV0aGVudGljYXRlZDIoYXV0aGN0eHQpOwotCWVsc2UKLQkJZG9fYXV0aGVudGljYXRlZDEoYXV0aGN0eHQpOwotCi0JZG9fY2xlYW51cChhdXRoY3R4dCk7Ci19Ci0KLS8qCi0gKiBQcmVwYXJlcyBmb3IgYW4gaW50ZXJhY3RpdmUgc2Vzc2lvbi4gIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSB1c2VyIGhhcwotICogYmVlbiBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZC4gIER1cmluZyB0aGlzIG1lc3NhZ2UgZXhjaGFuZ2UsIHBzZXVkbwotICogdGVybWluYWxzIGFyZSBhbGxvY2F0ZWQsIFgxMSwgVENQL0lQLCBhbmQgYXV0aGVudGljYXRpb24gYWdlbnQgZm9yd2FyZGluZ3MKLSAqIGFyZSByZXF1ZXN0ZWQsIGV0Yy4KLSAqLwotc3RhdGljIHZvaWQKLWRvX2F1dGhlbnRpY2F0ZWQxKEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlTZXNzaW9uICpzOwotCWNoYXIgKmNvbW1hbmQ7Ci0JaW50IHN1Y2Nlc3MsIHR5cGUsIHNjcmVlbl9mbGFnOwotCWludCBlbmFibGVfY29tcHJlc3Npb25fYWZ0ZXJfcmVwbHkgPSAwOwotCXVfaW50IHByb3RvX2xlbiwgZGF0YV9sZW4sIGRsZW4sIGNvbXByZXNzaW9uX2xldmVsID0gMDsKLQotCXMgPSBzZXNzaW9uX25ldygpOwotCWlmIChzID09IE5VTEwpIHsKLQkJZXJyb3IoIm5vIG1vcmUgc2Vzc2lvbnMiKTsKLQkJcmV0dXJuOwotCX0KLQlzLT5hdXRoY3R4dCA9IGF1dGhjdHh0OwotCXMtPnB3ID0gYXV0aGN0eHQtPnB3OwotCi0JLyoKLQkgKiBXZSBzdGF5IGluIHRoaXMgbG9vcCB1bnRpbCB0aGUgY2xpZW50IHJlcXVlc3RzIHRvIGV4ZWN1dGUgYSBzaGVsbAotCSAqIG9yIGEgY29tbWFuZC4KLQkgKi8KLQlmb3IgKDs7KSB7Ci0JCXN1Y2Nlc3MgPSAwOwotCi0JCS8qIEdldCBhIHBhY2tldCBmcm9tIHRoZSBjbGllbnQuICovCi0JCXR5cGUgPSBwYWNrZXRfcmVhZCgpOwotCi0JCS8qIFByb2Nlc3MgdGhlIHBhY2tldC4gKi8KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgU1NIX0NNU0dfUkVRVUVTVF9DT01QUkVTU0lPTjoKLQkJCWNvbXByZXNzaW9uX2xldmVsID0gcGFja2V0X2dldF9pbnQoKTsKLQkJCXBhY2tldF9jaGVja19lb20oKTsKLQkJCWlmIChjb21wcmVzc2lvbl9sZXZlbCA8IDEgfHwgY29tcHJlc3Npb25fbGV2ZWwgPiA5KSB7Ci0JCQkJcGFja2V0X3NlbmRfZGVidWcoIlJlY2VpdmVkIGludmFsaWQgY29tcHJlc3Npb24gbGV2ZWwgJWQuIiwKLQkJCQkgICAgY29tcHJlc3Npb25fbGV2ZWwpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKG9wdGlvbnMuY29tcHJlc3Npb24gPT0gQ09NUF9OT05FKSB7Ci0JCQkJZGVidWcyKCJjb21wcmVzc2lvbiBkaXNhYmxlZCIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogRW5hYmxlIGNvbXByZXNzaW9uIGFmdGVyIHdlIGhhdmUgcmVzcG9uZGVkIHdpdGggU1VDQ0VTUy4gKi8KLQkJCWVuYWJsZV9jb21wcmVzc2lvbl9hZnRlcl9yZXBseSA9IDE7Ci0JCQlzdWNjZXNzID0gMTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1NIX0NNU0dfUkVRVUVTVF9QVFk6Ci0JCQlzdWNjZXNzID0gc2Vzc2lvbl9wdHlfcmVxKHMpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTU0hfQ01TR19YMTFfUkVRVUVTVF9GT1JXQVJESU5HOgotCQkJcy0+YXV0aF9wcm90byA9IHBhY2tldF9nZXRfc3RyaW5nKCZwcm90b19sZW4pOwotCQkJcy0+YXV0aF9kYXRhID0gcGFja2V0X2dldF9zdHJpbmcoJmRhdGFfbGVuKTsKLQotCQkJc2NyZWVuX2ZsYWcgPSBwYWNrZXRfZ2V0X3Byb3RvY29sX2ZsYWdzKCkgJgotCQkJICAgIFNTSF9QUk9UT0ZMQUdfU0NSRUVOX05VTUJFUjsKLQkJCWRlYnVnMigiU1NIX1BST1RPRkxBR19TQ1JFRU5fTlVNQkVSOiAlZCIsIHNjcmVlbl9mbGFnKTsKLQotCQkJaWYgKHBhY2tldF9yZW1haW5pbmcoKSA9PSA0KSB7Ci0JCQkJaWYgKCFzY3JlZW5fZmxhZykKLQkJCQkJZGVidWcyKCJCdWdneSBjbGllbnQ6ICIKLQkJCQkJICAgICJYMTEgc2NyZWVuIGZsYWcgbWlzc2luZyIpOwotCQkJCXMtPnNjcmVlbiA9IHBhY2tldF9nZXRfaW50KCk7Ci0JCQl9IGVsc2UgewotCQkJCXMtPnNjcmVlbiA9IDA7Ci0JCQl9Ci0JCQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0JCQlzdWNjZXNzID0gc2Vzc2lvbl9zZXR1cF94MTFmd2Qocyk7Ci0JCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQl4ZnJlZShzLT5hdXRoX3Byb3RvKTsKLQkJCQl4ZnJlZShzLT5hdXRoX2RhdGEpOwotCQkJCXMtPmF1dGhfcHJvdG8gPSBOVUxMOwotCQkJCXMtPmF1dGhfZGF0YSA9IE5VTEw7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFNTSF9DTVNHX0FHRU5UX1JFUVVFU1RfRk9SV0FSRElORzoKLQkJCWlmICghb3B0aW9ucy5hbGxvd19hZ2VudF9mb3J3YXJkaW5nIHx8Ci0JCQkgICAgbm9fYWdlbnRfZm9yd2FyZGluZ19mbGFnIHx8IGNvbXBhdDEzKSB7Ci0JCQkJZGVidWcoIkF1dGhlbnRpY2F0aW9uIGFnZW50IGZvcndhcmRpbmcgbm90IHBlcm1pdHRlZCBmb3IgdGhpcyBhdXRoZW50aWNhdGlvbi4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlYnVnKCJSZWNlaXZlZCBhdXRoZW50aWNhdGlvbiBhZ2VudCBmb3J3YXJkaW5nIHJlcXVlc3QuIik7Ci0JCQlzdWNjZXNzID0gYXV0aF9pbnB1dF9yZXF1ZXN0X2ZvcndhcmRpbmcocy0+cHcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTU0hfQ01TR19QT1JUX0ZPUldBUkRfUkVRVUVTVDoKLQkJCWlmIChub19wb3J0X2ZvcndhcmRpbmdfZmxhZykgewotCQkJCWRlYnVnKCJQb3J0IGZvcndhcmRpbmcgbm90IHBlcm1pdHRlZCBmb3IgdGhpcyBhdXRoZW50aWNhdGlvbi4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICghb3B0aW9ucy5hbGxvd190Y3BfZm9yd2FyZGluZykgewotCQkJCWRlYnVnKCJQb3J0IGZvcndhcmRpbmcgbm90IHBlcm1pdHRlZC4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlYnVnKCJSZWNlaXZlZCBUQ1AvSVAgcG9ydCBmb3J3YXJkaW5nIHJlcXVlc3QuIik7Ci0JCQlpZiAoY2hhbm5lbF9pbnB1dF9wb3J0X2ZvcndhcmRfcmVxdWVzdChzLT5wdy0+cHdfdWlkID09IDAsCi0JCQkgICAgb3B0aW9ucy5nYXRld2F5X3BvcnRzKSA8IDApIHsKLQkJCQlkZWJ1ZygiUG9ydCBmb3J3YXJkaW5nIGZhaWxlZC4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXN1Y2Nlc3MgPSAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTU0hfQ01TR19NQVhfUEFDS0VUX1NJWkU6Ci0JCQlpZiAocGFja2V0X3NldF9tYXhzaXplKHBhY2tldF9nZXRfaW50KCkpID4gMCkKLQkJCQlzdWNjZXNzID0gMTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1NIX0NNU0dfRVhFQ19TSEVMTDoKLQkJY2FzZSBTU0hfQ01TR19FWEVDX0NNRDoKLQkJCWlmICh0eXBlID09IFNTSF9DTVNHX0VYRUNfQ01EKSB7Ci0JCQkJY29tbWFuZCA9IHBhY2tldF9nZXRfc3RyaW5nKCZkbGVuKTsKLQkJCQlkZWJ1ZygiRXhlYyBjb21tYW5kICclLjUwMHMnIiwgY29tbWFuZCk7Ci0JCQkJaWYgKGRvX2V4ZWMocywgY29tbWFuZCkgIT0gMCkKLQkJCQkJcGFja2V0X2Rpc2Nvbm5lY3QoCi0JCQkJCSAgICAiY29tbWFuZCBleGVjdXRpb24gZmFpbGVkIik7Ci0JCQkJeGZyZWUoY29tbWFuZCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkb19leGVjKHMsIE5VTEwpICE9IDApCi0JCQkJCXBhY2tldF9kaXNjb25uZWN0KAotCQkJCQkgICAgInNoZWxsIGV4ZWN1dGlvbiBmYWlsZWQiKTsKLQkJCX0KLQkJCXBhY2tldF9jaGVja19lb20oKTsKLQkJCXNlc3Npb25fY2xvc2Uocyk7Ci0JCQlyZXR1cm47Ci0KLQkJZGVmYXVsdDoKLQkJCS8qCi0JCQkgKiBBbnkgdW5rbm93biBtZXNzYWdlcyBpbiB0aGlzIHBoYXNlIGFyZSBpZ25vcmVkLAotCQkJICogYW5kIGEgZmFpbHVyZSBtZXNzYWdlIGlzIHJldHVybmVkLgotCQkJICovCi0JCQlsb2dpdCgiVW5rbm93biBwYWNrZXQgdHlwZSByZWNlaXZlZCBhZnRlciBhdXRoZW50aWNhdGlvbjogJWQiLCB0eXBlKTsKLQkJfQotCQlwYWNrZXRfc3RhcnQoc3VjY2VzcyA/IFNTSF9TTVNHX1NVQ0NFU1MgOiBTU0hfU01TR19GQUlMVVJFKTsKLQkJcGFja2V0X3NlbmQoKTsKLQkJcGFja2V0X3dyaXRlX3dhaXQoKTsKLQotCQkvKiBFbmFibGUgY29tcHJlc3Npb24gbm93IHRoYXQgd2UgaGF2ZSByZXBsaWVkIGlmIGFwcHJvcHJpYXRlLiAqLwotCQlpZiAoZW5hYmxlX2NvbXByZXNzaW9uX2FmdGVyX3JlcGx5KSB7Ci0JCQllbmFibGVfY29tcHJlc3Npb25fYWZ0ZXJfcmVwbHkgPSAwOwotCQkJcGFja2V0X3N0YXJ0X2NvbXByZXNzaW9uKGNvbXByZXNzaW9uX2xldmVsKTsKLQkJfQotCX0KLX0KLQotI2RlZmluZSBVU0VfUElQRVMKLS8qCi0gKiBUaGlzIGlzIGNhbGxlZCB0byBmb3JrIGFuZCBleGVjdXRlIGEgY29tbWFuZCB3aGVuIHdlIGhhdmUgbm8gdHR5LiAgVGhpcwotICogd2lsbCBjYWxsIGRvX2NoaWxkIGZyb20gdGhlIGNoaWxkLCBhbmQgc2VydmVyX2xvb3AgZnJvbSB0aGUgcGFyZW50IGFmdGVyCi0gKiBzZXR0aW5nIHVwIGZpbGUgZGVzY3JpcHRvcnMgYW5kIHN1Y2guCi0gKi8KLWludAotZG9fZXhlY19ub19wdHkoU2Vzc2lvbiAqcywgY29uc3QgY2hhciAqY29tbWFuZCkKLXsKLQlwaWRfdCBwaWQ7Ci0KLSNpZmRlZiBVU0VfUElQRVMKLQlpbnQgcGluWzJdLCBwb3V0WzJdLCBwZXJyWzJdOwotCi0JaWYgKHMgPT0gTlVMTCkKLQkJZmF0YWwoImRvX2V4ZWNfbm9fcHR5OiBubyBzZXNzaW9uIik7Ci0KLQkvKiBBbGxvY2F0ZSBwaXBlcyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBwcm9ncmFtLiAqLwotCWlmIChwaXBlKHBpbikgPCAwKSB7Ci0JCWVycm9yKCIlczogcGlwZSBpbjogJS4xMDBzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHBpcGUocG91dCkgPCAwKSB7Ci0JCWVycm9yKCIlczogcGlwZSBvdXQ6ICUuMTAwcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCQljbG9zZShwaW5bMF0pOwotCQljbG9zZShwaW5bMV0pOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChwaXBlKHBlcnIpIDwgMCkgewotCQllcnJvcigiJXM6IHBpcGUgZXJyOiAlLjEwMHMiLCBfX2Z1bmNfXywKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCWNsb3NlKHBpblswXSk7Ci0JCWNsb3NlKHBpblsxXSk7Ci0JCWNsb3NlKHBvdXRbMF0pOwotCQljbG9zZShwb3V0WzFdKTsKLQkJcmV0dXJuIC0xOwotCX0KLSNlbHNlCi0JaW50IGlub3V0WzJdLCBlcnJbMl07Ci0KLQlpZiAocyA9PSBOVUxMKQotCQlmYXRhbCgiZG9fZXhlY19ub19wdHk6IG5vIHNlc3Npb24iKTsKLQotCS8qIFVzZXMgc29ja2V0IHBhaXJzIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHByb2dyYW0uICovCi0JaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGlub3V0KSA8IDApIHsKLQkJZXJyb3IoIiVzOiBzb2NrZXRwYWlyICMxOiAlLjEwMHMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgZXJyKSA8IDApIHsKLQkJZXJyb3IoIiVzOiBzb2NrZXRwYWlyICMyOiAlLjEwMHMiLCBfX2Z1bmNfXywKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCWNsb3NlKGlub3V0WzBdKTsKLQkJY2xvc2UoaW5vdXRbMV0pOwotCQlyZXR1cm4gLTE7Ci0JfQotI2VuZGlmCi0KLQlzZXNzaW9uX3Byb2N0aXRsZShzKTsKLQotCS8qIEZvcmsgdGhlIGNoaWxkLiAqLwotCXN3aXRjaCAoKHBpZCA9IGZvcmsoKSkpIHsKLQljYXNlIC0xOgotCQllcnJvcigiJXM6IGZvcms6ICUuMTAwcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotI2lmZGVmIFVTRV9QSVBFUwotCQljbG9zZShwaW5bMF0pOwotCQljbG9zZShwaW5bMV0pOwotCQljbG9zZShwb3V0WzBdKTsKLQkJY2xvc2UocG91dFsxXSk7Ci0JCWNsb3NlKHBlcnJbMF0pOwotCQljbG9zZShwZXJyWzFdKTsKLSNlbHNlCi0JCWNsb3NlKGlub3V0WzBdKTsKLQkJY2xvc2UoaW5vdXRbMV0pOwotCQljbG9zZShlcnJbMF0pOwotCQljbG9zZShlcnJbMV0pOwotI2VuZGlmCi0JCXJldHVybiAtMTsKLQljYXNlIDA6Ci0JCWlzX2NoaWxkID0gMTsKLQotCQkvKiBDaGlsZC4gIFJlaW5pdGlhbGl6ZSB0aGUgbG9nIHNpbmNlIHRoZSBwaWQgaGFzIGNoYW5nZWQuICovCi0JCWxvZ19pbml0KF9fcHJvZ25hbWUsIG9wdGlvbnMubG9nX2xldmVsLAotCQkgICAgb3B0aW9ucy5sb2dfZmFjaWxpdHksIGxvZ19zdGRlcnIpOwotCi0JCS8qCi0JCSAqIENyZWF0ZSBhIG5ldyBzZXNzaW9uIGFuZCBwcm9jZXNzIGdyb3VwIHNpbmNlIHRoZSA0LjRCU0QKLQkJICogc2V0bG9naW4oKSBhZmZlY3RzIHRoZSBlbnRpcmUgcHJvY2VzcyBncm91cC4KLQkJICovCi0JCWlmIChzZXRzaWQoKSA8IDApCi0JCQllcnJvcigic2V0c2lkIGZhaWxlZDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQotI2lmZGVmIFVTRV9QSVBFUwotCQkvKgotCQkgKiBSZWRpcmVjdCBzdGRpbi4gIFdlIGNsb3NlIHRoZSBwYXJlbnQgc2lkZSBvZiB0aGUgc29ja2V0Ci0JCSAqIHBhaXIsIGFuZCBtYWtlIHRoZSBjaGlsZCBzaWRlIHRoZSBzdGFuZGFyZCBpbnB1dC4KLQkJICovCi0JCWNsb3NlKHBpblsxXSk7Ci0JCWlmIChkdXAyKHBpblswXSwgMCkgPCAwKQotCQkJcGVycm9yKCJkdXAyIHN0ZGluIik7Ci0JCWNsb3NlKHBpblswXSk7Ci0KLQkJLyogUmVkaXJlY3Qgc3Rkb3V0LiAqLwotCQljbG9zZShwb3V0WzBdKTsKLQkJaWYgKGR1cDIocG91dFsxXSwgMSkgPCAwKQotCQkJcGVycm9yKCJkdXAyIHN0ZG91dCIpOwotCQljbG9zZShwb3V0WzFdKTsKLQotCQkvKiBSZWRpcmVjdCBzdGRlcnIuICovCi0JCWNsb3NlKHBlcnJbMF0pOwotCQlpZiAoZHVwMihwZXJyWzFdLCAyKSA8IDApCi0JCQlwZXJyb3IoImR1cDIgc3RkZXJyIik7Ci0JCWNsb3NlKHBlcnJbMV0pOwotI2Vsc2UKLQkJLyoKLQkJICogUmVkaXJlY3Qgc3RkaW4sIHN0ZG91dCwgYW5kIHN0ZGVyci4gIFN0ZGluIGFuZCBzdGRvdXQgd2lsbAotCQkgKiB1c2UgdGhlIHNhbWUgc29ja2V0LCBhcyBzb21lIHByb2dyYW1zIChwYXJ0aWN1bGFybHkgcmRpc3QpCi0JCSAqIHNlZW0gdG8gZGVwZW5kIG9uIGl0LgotCQkgKi8KLQkJY2xvc2UoaW5vdXRbMV0pOwotCQljbG9zZShlcnJbMV0pOwotCQlpZiAoZHVwMihpbm91dFswXSwgMCkgPCAwKQkvKiBzdGRpbiAqLwotCQkJcGVycm9yKCJkdXAyIHN0ZGluIik7Ci0JCWlmIChkdXAyKGlub3V0WzBdLCAxKSA8IDApCS8qIHN0ZG91dCAoc2FtZSBhcyBzdGRpbikgKi8KLQkJCXBlcnJvcigiZHVwMiBzdGRvdXQiKTsKLQkJY2xvc2UoaW5vdXRbMF0pOwotCQlpZiAoZHVwMihlcnJbMF0sIDIpIDwgMCkJLyogc3RkZXJyICovCi0JCQlwZXJyb3IoImR1cDIgc3RkZXJyIik7Ci0JCWNsb3NlKGVyclswXSk7Ci0jZW5kaWYKLQotCi0jaWZkZWYgX1VOSUNPUwotCQljcmF5X2luaXRfam9iKHMtPnB3KTsgLyogc2V0IHVwIGNyYXkgamlkIGFuZCB0bXBkaXIgKi8KLSNlbmRpZgotCi0JCS8qIERvIHByb2Nlc3NpbmcgZm9yIHRoZSBjaGlsZCAoZXhlYyBjb21tYW5kIGV0YykuICovCi0JCWRvX2NoaWxkKHMsIGNvbW1hbmQpOwotCQkvKiBOT1RSRUFDSEVEICovCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0jaWZkZWYgX1VOSUNPUwotCXNpZ25hbChXSlNJR05BTCwgY3JheV9qb2JfdGVybWluYXRpb25faGFuZGxlcik7Ci0jZW5kaWYgLyogX1VOSUNPUyAqLwotI2lmZGVmIEhBVkVfQ1lHV0lOCi0JY3lnd2luX3NldF9pbXBlcnNvbmF0aW9uX3Rva2VuKElOVkFMSURfSEFORExFX1ZBTFVFKTsKLSNlbmRpZgotCi0Jcy0+cGlkID0gcGlkOwotCS8qIFNldCBpbnRlcmFjdGl2ZS9ub24taW50ZXJhY3RpdmUgbW9kZS4gKi8KLQlwYWNrZXRfc2V0X2ludGVyYWN0aXZlKHMtPmRpc3BsYXkgIT0gTlVMTCwKLQkgICAgb3B0aW9ucy5pcF9xb3NfaW50ZXJhY3RpdmUsIG9wdGlvbnMuaXBfcW9zX2J1bGspOwotCi0JLyoKLQkgKiBDbGVhciBsb2dpbm1zZywgc2luY2UgaXQncyB0aGUgY2hpbGQncyByZXNwb25zaWJpbGl0eSB0byBkaXNwbGF5Ci0JICogaXQgdG8gdGhlIHVzZXIsIG90aGVyd2lzZSBtdWx0aXBsZSBzZXNzaW9ucyBtYXkgYWNjdW11bGF0ZQotCSAqIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgbG9naW4gbWVzc2FnZXMuCi0JICovCi0JYnVmZmVyX2NsZWFyKCZsb2dpbm1zZyk7Ci0KLSNpZmRlZiBVU0VfUElQRVMKLQkvKiBXZSBhcmUgdGhlIHBhcmVudC4gIENsb3NlIHRoZSBjaGlsZCBzaWRlcyBvZiB0aGUgcGlwZXMuICovCi0JY2xvc2UocGluWzBdKTsKLQljbG9zZShwb3V0WzFdKTsKLQljbG9zZShwZXJyWzFdKTsKLQotCWlmIChjb21wYXQyMCkgewotCQlzZXNzaW9uX3NldF9mZHMocywgcGluWzFdLCBwb3V0WzBdLCBwZXJyWzBdLAotCQkgICAgcy0+aXNfc3Vic3lzdGVtLCAwKTsKLQl9IGVsc2UgewotCQkvKiBFbnRlciB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbi4gKi8KLQkJc2VydmVyX2xvb3AocGlkLCBwaW5bMV0sIHBvdXRbMF0sIHBlcnJbMF0pOwotCQkvKiBzZXJ2ZXJfbG9vcCBoYXMgY2xvc2VkIHBpblsxXSwgcG91dFswXSwgYW5kIHBlcnJbMF0uICovCi0JfQotI2Vsc2UKLQkvKiBXZSBhcmUgdGhlIHBhcmVudC4gIENsb3NlIHRoZSBjaGlsZCBzaWRlcyBvZiB0aGUgc29ja2V0IHBhaXJzLiAqLwotCWNsb3NlKGlub3V0WzBdKTsKLQljbG9zZShlcnJbMF0pOwotCi0JLyoKLQkgKiBFbnRlciB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbi4gIE5vdGU6IHNlcnZlcl9sb29wIG11c3QgYmUgYWJsZSB0bwotCSAqIGhhbmRsZSB0aGUgY2FzZSB0aGF0IGZkaW4gYW5kIGZkb3V0IGFyZSB0aGUgc2FtZS4KLQkgKi8KLQlpZiAoY29tcGF0MjApIHsKLQkJc2Vzc2lvbl9zZXRfZmRzKHMsIGlub3V0WzFdLCBpbm91dFsxXSwgZXJyWzFdLAotCQkgICAgcy0+aXNfc3Vic3lzdGVtLCAwKTsKLQl9IGVsc2UgewotCQlzZXJ2ZXJfbG9vcChwaWQsIGlub3V0WzFdLCBpbm91dFsxXSwgZXJyWzFdKTsKLQkJLyogc2VydmVyX2xvb3AgaGFzIGNsb3NlZCBpbm91dFsxXSBhbmQgZXJyWzFdLiAqLwotCX0KLSNlbmRpZgotCXJldHVybiAwOwotfQotCi0vKgotICogVGhpcyBpcyBjYWxsZWQgdG8gZm9yayBhbmQgZXhlY3V0ZSBhIGNvbW1hbmQgd2hlbiB3ZSBoYXZlIGEgdHR5LiAgVGhpcwotICogd2lsbCBjYWxsIGRvX2NoaWxkIGZyb20gdGhlIGNoaWxkLCBhbmQgc2VydmVyX2xvb3AgZnJvbSB0aGUgcGFyZW50IGFmdGVyCi0gKiBzZXR0aW5nIHVwIGZpbGUgZGVzY3JpcHRvcnMsIGNvbnRyb2xsaW5nIHR0eSwgdXBkYXRpbmcgd3RtcCwgdXRtcCwKLSAqIGxhc3Rsb2csIGFuZCBvdGhlciBzdWNoIG9wZXJhdGlvbnMuCi0gKi8KLWludAotZG9fZXhlY19wdHkoU2Vzc2lvbiAqcywgY29uc3QgY2hhciAqY29tbWFuZCkKLXsKLQlpbnQgZmRvdXQsIHB0eWZkLCB0dHlmZCwgcHR5bWFzdGVyOwotCXBpZF90IHBpZDsKLQotCWlmIChzID09IE5VTEwpCi0JCWZhdGFsKCJkb19leGVjX3B0eTogbm8gc2Vzc2lvbiIpOwotCXB0eWZkID0gcy0+cHR5ZmQ7Ci0JdHR5ZmQgPSBzLT50dHlmZDsKLQotCS8qCi0JICogQ3JlYXRlIGFub3RoZXIgZGVzY3JpcHRvciBvZiB0aGUgcHR5IG1hc3RlciBzaWRlIGZvciB1c2UgYXMgdGhlCi0JICogc3RhbmRhcmQgaW5wdXQuICBXZSBjb3VsZCB1c2UgdGhlIG9yaWdpbmFsIGRlc2NyaXB0b3IsIGJ1dCB0aGlzCi0JICogc2ltcGxpZmllcyBjb2RlIGluIHNlcnZlcl9sb29wLiAgVGhlIGRlc2NyaXB0b3IgaXMgYmlkaXJlY3Rpb25hbC4KLQkgKiBEbyB0aGlzIGJlZm9yZSBmb3JraW5nIChhbmQgY2xlYW51cCBpbiB0aGUgY2hpbGQpIHNvIGFzIHRvCi0JICogZGV0ZWN0IGFuZCBncmFjZWZ1bGx5IGZhaWwgb3V0LW9mLWZkIGNvbmRpdGlvbnMuCi0JICovCi0JaWYgKChmZG91dCA9IGR1cChwdHlmZCkpIDwgMCkgewotCQllcnJvcigiJXM6IGR1cCAjMTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQkJY2xvc2UodHR5ZmQpOwotCQljbG9zZShwdHlmZCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogd2Uga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgcHR5IG1hc3RlciAqLwotCWlmICgocHR5bWFzdGVyID0gZHVwKHB0eWZkKSkgPCAwKSB7Ci0JCWVycm9yKCIlczogZHVwICMyOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCQljbG9zZSh0dHlmZCk7Ci0JCWNsb3NlKHB0eWZkKTsKLQkJY2xvc2UoZmRvdXQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogRm9yayB0aGUgY2hpbGQuICovCi0Jc3dpdGNoICgocGlkID0gZm9yaygpKSkgewotCWNhc2UgLTE6Ci0JCWVycm9yKCIlczogZm9yazogJS4xMDBzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JCWNsb3NlKGZkb3V0KTsKLQkJY2xvc2UocHR5bWFzdGVyKTsKLQkJY2xvc2UodHR5ZmQpOwotCQljbG9zZShwdHlmZCk7Ci0JCXJldHVybiAtMTsKLQljYXNlIDA6Ci0JCWlzX2NoaWxkID0gMTsKLQotCQljbG9zZShmZG91dCk7Ci0JCWNsb3NlKHB0eW1hc3Rlcik7Ci0KLQkJLyogQ2hpbGQuICBSZWluaXRpYWxpemUgdGhlIGxvZyBiZWNhdXNlIHRoZSBwaWQgaGFzIGNoYW5nZWQuICovCi0JCWxvZ19pbml0KF9fcHJvZ25hbWUsIG9wdGlvbnMubG9nX2xldmVsLAotCQkgICAgb3B0aW9ucy5sb2dfZmFjaWxpdHksIGxvZ19zdGRlcnIpOwotCQkvKiBDbG9zZSB0aGUgbWFzdGVyIHNpZGUgb2YgdGhlIHBzZXVkbyB0dHkuICovCi0JCWNsb3NlKHB0eWZkKTsKLQotCQkvKiBNYWtlIHRoZSBwc2V1ZG8gdHR5IG91ciBjb250cm9sbGluZyB0dHkuICovCi0JCXB0eV9tYWtlX2NvbnRyb2xsaW5nX3R0eSgmdHR5ZmQsIHMtPnR0eSk7Ci0KLQkJLyogUmVkaXJlY3Qgc3RkaW4vc3Rkb3V0L3N0ZGVyciBmcm9tIHRoZSBwc2V1ZG8gdHR5LiAqLwotCQlpZiAoZHVwMih0dHlmZCwgMCkgPCAwKQotCQkJZXJyb3IoImR1cDIgc3RkaW46ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJaWYgKGR1cDIodHR5ZmQsIDEpIDwgMCkKLQkJCWVycm9yKCJkdXAyIHN0ZG91dDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlpZiAoZHVwMih0dHlmZCwgMikgPCAwKQotCQkJZXJyb3IoImR1cDIgc3RkZXJyOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLQkJLyogQ2xvc2UgdGhlIGV4dHJhIGRlc2NyaXB0b3IgZm9yIHRoZSBwc2V1ZG8gdHR5LiAqLwotCQljbG9zZSh0dHlmZCk7Ci0KLQkJLyogcmVjb3JkIGxvZ2luLCBldGMuIHNpbWlsYXIgdG8gbG9naW4oMSkgKi8KLSNpZm5kZWYgSEFWRV9PU0ZfU0lBCi0JCWlmICghKG9wdGlvbnMudXNlX2xvZ2luICYmIGNvbW1hbmQgPT0gTlVMTCkpIHsKLSNpZmRlZiBfVU5JQ09TCi0JCQljcmF5X2luaXRfam9iKHMtPnB3KTsgLyogc2V0IHVwIGNyYXkgamlkIGFuZCB0bXBkaXIgKi8KLSNlbmRpZiAvKiBfVU5JQ09TICovCi0JCQlkb19sb2dpbihzLCBjb21tYW5kKTsKLQkJfQotIyBpZmRlZiBMT0dJTl9ORUVEU19VVE1QWAotCQllbHNlCi0JCQlkb19wcmVfbG9naW4ocyk7Ci0jIGVuZGlmCi0jZW5kaWYKLQkJLyoKLQkJICogRG8gY29tbW9uIHByb2Nlc3NpbmcgZm9yIHRoZSBjaGlsZCwgc3VjaCBhcyBleGVjaW5nCi0JCSAqIHRoZSBjb21tYW5kLgotCQkgKi8KLQkJZG9fY2hpbGQocywgY29tbWFuZCk7Ci0JCS8qIE5PVFJFQUNIRUQgKi8KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLSNpZmRlZiBfVU5JQ09TCi0Jc2lnbmFsKFdKU0lHTkFMLCBjcmF5X2pvYl90ZXJtaW5hdGlvbl9oYW5kbGVyKTsKLSNlbmRpZiAvKiBfVU5JQ09TICovCi0jaWZkZWYgSEFWRV9DWUdXSU4KLQljeWd3aW5fc2V0X2ltcGVyc29uYXRpb25fdG9rZW4oSU5WQUxJRF9IQU5ETEVfVkFMVUUpOwotI2VuZGlmCi0KLQlzLT5waWQgPSBwaWQ7Ci0KLQkvKiBQYXJlbnQuICBDbG9zZSB0aGUgc2xhdmUgc2lkZSBvZiB0aGUgcHNldWRvIHR0eS4gKi8KLQljbG9zZSh0dHlmZCk7Ci0KLQkvKiBFbnRlciBpbnRlcmFjdGl2ZSBzZXNzaW9uLiAqLwotCXMtPnB0eW1hc3RlciA9IHB0eW1hc3RlcjsKLQlwYWNrZXRfc2V0X2ludGVyYWN0aXZlKDEsIAotCSAgICBvcHRpb25zLmlwX3Fvc19pbnRlcmFjdGl2ZSwgb3B0aW9ucy5pcF9xb3NfYnVsayk7Ci0JaWYgKGNvbXBhdDIwKSB7Ci0JCXNlc3Npb25fc2V0X2ZkcyhzLCBwdHlmZCwgZmRvdXQsIC0xLCAxLCAxKTsKLQl9IGVsc2UgewotCQlzZXJ2ZXJfbG9vcChwaWQsIHB0eWZkLCBmZG91dCwgLTEpOwotCQkvKiBzZXJ2ZXJfbG9vcCBfaGFzXyBjbG9zZWQgcHR5ZmQgYW5kIGZkb3V0LiAqLwotCX0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIExPR0lOX05FRURTX1VUTVBYCi1zdGF0aWMgdm9pZAotZG9fcHJlX2xvZ2luKFNlc3Npb24gKnMpCi17Ci0Jc29ja2xlbl90IGZyb21sZW47Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZnJvbTsKLQlwaWRfdCBwaWQgPSBnZXRwaWQoKTsKLQotCS8qCi0JICogR2V0IElQIGFkZHJlc3Mgb2YgY2xpZW50LiBJZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgYSBzb2NrZXQsIGxldAotCSAqIHRoZSBhZGRyZXNzIGJlIDAuMC4wLjAuCi0JICovCi0JbWVtc2V0KCZmcm9tLCAwLCBzaXplb2YoZnJvbSkpOwotCWZyb21sZW4gPSBzaXplb2YoZnJvbSk7Ci0JaWYgKHBhY2tldF9jb25uZWN0aW9uX2lzX29uX3NvY2tldCgpKSB7Ci0JCWlmIChnZXRwZWVybmFtZShwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSwKLQkJICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbSwgJmZyb21sZW4pIDwgMCkgewotCQkJZGVidWcoImdldHBlZXJuYW1lOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJY2xlYW51cF9leGl0KDI1NSk7Ci0JCX0KLQl9Ci0KLQlyZWNvcmRfdXRtcF9vbmx5KHBpZCwgcy0+dHR5LCBzLT5wdy0+cHdfbmFtZSwKLQkgICAgZ2V0X3JlbW90ZV9uYW1lX29yX2lwKHV0bXBfbGVuLCBvcHRpb25zLnVzZV9kbnMpLAotCSAgICAoc3RydWN0IHNvY2thZGRyICopJmZyb20sIGZyb21sZW4pOwotfQotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGlzIGNhbGxlZCB0byBmb3JrIGFuZCBleGVjdXRlIGEgY29tbWFuZC4gIElmIGFub3RoZXIgY29tbWFuZCBpcwotICogdG8gYmUgZm9yY2VkLCBleGVjdXRlIHRoYXQgaW5zdGVhZC4KLSAqLwotaW50Ci1kb19leGVjKFNlc3Npb24gKnMsIGNvbnN0IGNoYXIgKmNvbW1hbmQpCi17Ci0JaW50IHJldDsKLQotCWlmIChvcHRpb25zLmFkbV9mb3JjZWRfY29tbWFuZCkgewotCQlvcmlnaW5hbF9jb21tYW5kID0gY29tbWFuZDsKLQkJY29tbWFuZCA9IG9wdGlvbnMuYWRtX2ZvcmNlZF9jb21tYW5kOwotCQlpZiAoSVNfSU5URVJOQUxfU0ZUUChjb21tYW5kKSkgewotCQkJcy0+aXNfc3Vic3lzdGVtID0gcy0+aXNfc3Vic3lzdGVtID8KLQkJCSAgICBTVUJTWVNURU1fSU5UX1NGVFAgOiBTVUJTWVNURU1fSU5UX1NGVFBfRVJST1I7Ci0JCX0gZWxzZSBpZiAocy0+aXNfc3Vic3lzdGVtKQotCQkJcy0+aXNfc3Vic3lzdGVtID0gU1VCU1lTVEVNX0VYVDsKLQkJZGVidWcoIkZvcmNlZCBjb21tYW5kIChjb25maWcpICclLjkwMHMnIiwgY29tbWFuZCk7Ci0JfSBlbHNlIGlmIChmb3JjZWRfY29tbWFuZCkgewotCQlvcmlnaW5hbF9jb21tYW5kID0gY29tbWFuZDsKLQkJY29tbWFuZCA9IGZvcmNlZF9jb21tYW5kOwotCQlpZiAoSVNfSU5URVJOQUxfU0ZUUChjb21tYW5kKSkgewotCQkJcy0+aXNfc3Vic3lzdGVtID0gcy0+aXNfc3Vic3lzdGVtID8KLQkJCSAgICBTVUJTWVNURU1fSU5UX1NGVFAgOiBTVUJTWVNURU1fSU5UX1NGVFBfRVJST1I7Ci0JCX0gZWxzZSBpZiAocy0+aXNfc3Vic3lzdGVtKQotCQkJcy0+aXNfc3Vic3lzdGVtID0gU1VCU1lTVEVNX0VYVDsKLQkJZGVidWcoIkZvcmNlZCBjb21tYW5kIChrZXkgb3B0aW9uKSAnJS45MDBzJyIsIGNvbW1hbmQpOwotCX0KLQotI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKLQlpZiAoY29tbWFuZCAhPSBOVUxMKQotCQlQUklWU0VQKGF1ZGl0X3J1bl9jb21tYW5kKGNvbW1hbmQpKTsKLQllbHNlIGlmIChzLT50dHlmZCA9PSAtMSkgewotCQljaGFyICpzaGVsbCA9IHMtPnB3LT5wd19zaGVsbDsKLQotCQlpZiAoc2hlbGxbMF0gPT0gJ1wwJykJLyogZW1wdHkgc2hlbGwgbWVhbnMgL2Jpbi9zaCAqLwotCQkJc2hlbGwgPV9QQVRIX0JTSEVMTDsKLQkJUFJJVlNFUChhdWRpdF9ydW5fY29tbWFuZChzaGVsbCkpOwotCX0KLSNlbmRpZgotCWlmIChzLT50dHlmZCAhPSAtMSkKLQkJcmV0ID0gZG9fZXhlY19wdHkocywgY29tbWFuZCk7Ci0JZWxzZQotCQlyZXQgPSBkb19leGVjX25vX3B0eShzLCBjb21tYW5kKTsKLQotCW9yaWdpbmFsX2NvbW1hbmQgPSBOVUxMOwotCi0JLyoKLQkgKiBDbGVhciBsb2dpbm1zZzogaXQncyB0aGUgY2hpbGQncyByZXNwb25zaWJpbGl0eSB0byBkaXNwbGF5Ci0JICogaXQgdG8gdGhlIHVzZXIsIG90aGVyd2lzZSBtdWx0aXBsZSBzZXNzaW9ucyBtYXkgYWNjdW11bGF0ZQotCSAqIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgbG9naW4gbWVzc2FnZXMuCi0JICovCi0JYnVmZmVyX2NsZWFyKCZsb2dpbm1zZyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBhZG1pbmlzdHJhdGl2ZSwgbG9naW4oMSktbGlrZSB3b3JrICovCi12b2lkCi1kb19sb2dpbihTZXNzaW9uICpzLCBjb25zdCBjaGFyICpjb21tYW5kKQotewotCXNvY2tsZW5fdCBmcm9tbGVuOwotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGZyb207Ci0Jc3RydWN0IHBhc3N3ZCAqIHB3ID0gcy0+cHc7Ci0JcGlkX3QgcGlkID0gZ2V0cGlkKCk7Ci0KLQkvKgotCSAqIEdldCBJUCBhZGRyZXNzIG9mIGNsaWVudC4gSWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGEgc29ja2V0LCBsZXQKLQkgKiB0aGUgYWRkcmVzcyBiZSAwLjAuMC4wLgotCSAqLwotCW1lbXNldCgmZnJvbSwgMCwgc2l6ZW9mKGZyb20pKTsKLQlmcm9tbGVuID0gc2l6ZW9mKGZyb20pOwotCWlmIChwYWNrZXRfY29ubmVjdGlvbl9pc19vbl9zb2NrZXQoKSkgewotCQlpZiAoZ2V0cGVlcm5hbWUocGFja2V0X2dldF9jb25uZWN0aW9uX2luKCksCi0JCSAgICAoc3RydWN0IHNvY2thZGRyICopJmZyb20sICZmcm9tbGVuKSA8IDApIHsKLQkJCWRlYnVnKCJnZXRwZWVybmFtZTogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCWNsZWFudXBfZXhpdCgyNTUpOwotCQl9Ci0JfQotCi0JLyogUmVjb3JkIHRoYXQgdGhlcmUgd2FzIGEgbG9naW4gb24gdGhhdCB0dHkgZnJvbSB0aGUgcmVtb3RlIGhvc3QuICovCi0JaWYgKCF1c2VfcHJpdnNlcCkKLQkJcmVjb3JkX2xvZ2luKHBpZCwgcy0+dHR5LCBwdy0+cHdfbmFtZSwgcHctPnB3X3VpZCwKLQkJICAgIGdldF9yZW1vdGVfbmFtZV9vcl9pcCh1dG1wX2xlbiwKLQkJICAgIG9wdGlvbnMudXNlX2RucyksCi0JCSAgICAoc3RydWN0IHNvY2thZGRyICopJmZyb20sIGZyb21sZW4pOwotCi0jaWZkZWYgVVNFX1BBTQotCS8qCi0JICogSWYgcGFzc3dvcmQgY2hhbmdlIGlzIG5lZWRlZCwgZG8gaXQgbm93LgotCSAqIFRoaXMgbmVlZHMgdG8gb2NjdXIgYmVmb3JlIHRoZSB+Ly5odXNobG9naW4gY2hlY2suCi0JICovCi0JaWYgKG9wdGlvbnMudXNlX3BhbSAmJiAhdXNlX3ByaXZzZXAgJiYgcy0+YXV0aGN0eHQtPmZvcmNlX3B3Y2hhbmdlKSB7Ci0JCWRpc3BsYXlfbG9naW5tc2coKTsKLQkJZG9fcGFtX2NoYXV0aHRvaygpOwotCQlzLT5hdXRoY3R4dC0+Zm9yY2VfcHdjaGFuZ2UgPSAwOwotCQkvKiBYWFggLSBzaWduYWwgW25ldF0gcGFyZW50IHRvIGVuYWJsZSBmb3J3YXJkaW5ncyAqLwotCX0KLSNlbmRpZgotCi0JaWYgKGNoZWNrX3F1aWV0bG9naW4ocywgY29tbWFuZCkpCi0JCXJldHVybjsKLQotCWRpc3BsYXlfbG9naW5tc2coKTsKLQotCWRvX21vdGQoKTsKLX0KLQotLyoKLSAqIERpc3BsYXkgdGhlIG1lc3NhZ2Ugb2YgdGhlIGRheS4KLSAqLwotdm9pZAotZG9fbW90ZCh2b2lkKQotewotCUZJTEUgKmY7Ci0JY2hhciBidWZbMjU2XTsKLQotCWlmIChvcHRpb25zLnByaW50X21vdGQpIHsKLSNpZmRlZiBIQVZFX0xPR0lOX0NBUAotCQlmID0gZm9wZW4obG9naW5fZ2V0Y2Fwc3RyKGxjLCAid2VsY29tZSIsICIvZXRjL21vdGQiLAotCQkgICAgIi9ldGMvbW90ZCIpLCAiciIpOwotI2Vsc2UKLQkJZiA9IGZvcGVuKCIvZXRjL21vdGQiLCAiciIpOwotI2VuZGlmCi0JCWlmIChmKSB7Ci0JCQl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpCi0JCQkJZnB1dHMoYnVmLCBzdGRvdXQpOwotCQkJZmNsb3NlKGYpOwotCQl9Ci0JfQotfQotCi0KLS8qCi0gKiBDaGVjayBmb3IgcXVpZXQgbG9naW4sIGVpdGhlciAuaHVzaGxvZ2luIG9yIGNvbW1hbmQgZ2l2ZW4uCi0gKi8KLWludAotY2hlY2tfcXVpZXRsb2dpbihTZXNzaW9uICpzLCBjb25zdCBjaGFyICpjb21tYW5kKQotewotCWNoYXIgYnVmWzI1Nl07Ci0Jc3RydWN0IHBhc3N3ZCAqcHcgPSBzLT5wdzsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQotCS8qIFJldHVybiAxIGlmIC5odXNobG9naW4gZXhpc3RzIG9yIGEgY29tbWFuZCBnaXZlbi4gKi8KLQlpZiAoY29tbWFuZCAhPSBOVUxMKQotCQlyZXR1cm4gMTsKLQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJS4yMDBzLy5odXNobG9naW4iLCBwdy0+cHdfZGlyKTsKLSNpZmRlZiBIQVZFX0xPR0lOX0NBUAotCWlmIChsb2dpbl9nZXRjYXBib29sKGxjLCAiaHVzaGxvZ2luIiwgMCkgfHwgc3RhdChidWYsICZzdCkgPj0gMCkKLQkJcmV0dXJuIDE7Ci0jZWxzZQotCWlmIChzdGF0KGJ1ZiwgJnN0KSA+PSAwKQotCQlyZXR1cm4gMTsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCi0vKgotICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHZhcmlhYmxlIGluIHRoZSBlbnZpcm9ubWVudC4gIElmIHRoZSB2YXJpYWJsZQotICogYWxyZWFkeSBleGlzdHMsIGl0cyB2YWx1ZSBpcyBvdmVycmlkZGVuLgotICovCi12b2lkCi1jaGlsZF9zZXRfZW52KGNoYXIgKioqZW52cCwgdV9pbnQgKmVudnNpemVwLCBjb25zdCBjaGFyICpuYW1lLAotCWNvbnN0IGNoYXIgKnZhbHVlKQotewotCWNoYXIgKiplbnY7Ci0JdV9pbnQgZW52c2l6ZTsKLQl1X2ludCBpLCBuYW1lbGVuOwotCi0JLyoKLQkgKiBJZiB3ZSdyZSBwYXNzZWQgYW4gdW5pbml0aWFsaXplZCBsaXN0LCBhbGxvY2F0ZSBhIHNpbmdsZSBudWxsCi0JICogZW50cnkgYmVmb3JlIGNvbnRpbnVpbmcuCi0JICovCi0JaWYgKCplbnZwID09IE5VTEwgJiYgKmVudnNpemVwID09IDApIHsKLQkJKmVudnAgPSB4bWFsbG9jKHNpemVvZihjaGFyICopKTsKLQkJKmVudnBbMF0gPSBOVUxMOwotCQkqZW52c2l6ZXAgPSAxOwotCX0KLQotCS8qCi0JICogRmluZCB0aGUgc2xvdCB3aGVyZSB0aGUgdmFsdWUgc2hvdWxkIGJlIHN0b3JlZC4gIElmIHRoZSB2YXJpYWJsZQotCSAqIGFscmVhZHkgZXhpc3RzLCB3ZSByZXVzZSB0aGUgc2xvdDsgb3RoZXJ3aXNlIHdlIGFwcGVuZCBhIG5ldyBzbG90Ci0JICogYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXksIGV4cGFuZGluZyBpZiBuZWNlc3NhcnkuCi0JICovCi0JZW52ID0gKmVudnA7Ci0JbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKLQlmb3IgKGkgPSAwOyBlbnZbaV07IGkrKykKLQkJaWYgKHN0cm5jbXAoZW52W2ldLCBuYW1lLCBuYW1lbGVuKSA9PSAwICYmIGVudltpXVtuYW1lbGVuXSA9PSAnPScpCi0JCQlicmVhazsKLQlpZiAoZW52W2ldKSB7Ci0JCS8qIFJldXNlIHRoZSBzbG90LiAqLwotCQl4ZnJlZShlbnZbaV0pOwotCX0gZWxzZSB7Ci0JCS8qIE5ldyB2YXJpYWJsZS4gIEV4cGFuZCBpZiBuZWNlc3NhcnkuICovCi0JCWVudnNpemUgPSAqZW52c2l6ZXA7Ci0JCWlmIChpID49IGVudnNpemUgLSAxKSB7Ci0JCQlpZiAoZW52c2l6ZSA+PSAxMDAwKQotCQkJCWZhdGFsKCJjaGlsZF9zZXRfZW52OiB0b28gbWFueSBlbnYgdmFycyIpOwotCQkJZW52c2l6ZSArPSA1MDsKLQkJCWVudiA9ICgqZW52cCkgPSB4cmVhbGxvYyhlbnYsIGVudnNpemUsIHNpemVvZihjaGFyICopKTsKLQkJCSplbnZzaXplcCA9IGVudnNpemU7Ci0JCX0KLQkJLyogTmVlZCB0byBzZXQgdGhlIE5VTEwgcG9pbnRlciBhdCBlbmQgb2YgYXJyYXkgYmV5b25kIHRoZSBuZXcgc2xvdC4gKi8KLQkJZW52W2kgKyAxXSA9IE5VTEw7Ci0JfQotCi0JLyogQWxsb2NhdGUgc3BhY2UgYW5kIGZvcm1hdCB0aGUgdmFyaWFibGUgaW4gdGhlIGFwcHJvcHJpYXRlIHNsb3QuICovCi0JZW52W2ldID0geG1hbGxvYyhzdHJsZW4obmFtZSkgKyAxICsgc3RybGVuKHZhbHVlKSArIDEpOwotCXNucHJpbnRmKGVudltpXSwgc3RybGVuKG5hbWUpICsgMSArIHN0cmxlbih2YWx1ZSkgKyAxLCAiJXM9JXMiLCBuYW1lLCB2YWx1ZSk7Ci19Ci0KLS8qCi0gKiBSZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBhbmQgYWRkcy9vdmVycmlkZXMgdGhlbQotICogaW50byB0aGUgZW52aXJvbm1lbnQuICBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhpcyBkb2VzIG5vdGhpbmcuCi0gKiBPdGhlcndpc2UsIGl0IG11c3QgY29uc2lzdCBvZiBlbXB0eSBsaW5lcywgY29tbWVudHMgKGxpbmUgc3RhcnRzIHdpdGggJyMnKQotICogYW5kIGFzc2lnbm1lbnRzIG9mIHRoZSBmb3JtIG5hbWU9dmFsdWUuICBObyBvdGhlciBmb3JtcyBhcmUgYWxsb3dlZC4KLSAqLwotc3RhdGljIHZvaWQKLXJlYWRfZW52aXJvbm1lbnRfZmlsZShjaGFyICoqKmVudiwgdV9pbnQgKmVudnNpemUsCi0JY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0JRklMRSAqZjsKLQljaGFyIGJ1Zls0MDk2XTsKLQljaGFyICpjcCwgKnZhbHVlOwotCXVfaW50IGxpbmVubyA9IDA7Ci0KLQlmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0JaWYgKCFmKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpIHsKLQkJaWYgKCsrbGluZW5vID4gMTAwMCkKLQkJCWZhdGFsKCJUb28gbWFueSBsaW5lcyBpbiBlbnZpcm9ubWVudCBmaWxlICVzIiwgZmlsZW5hbWUpOwotCQlmb3IgKGNwID0gYnVmOyAqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnOyBjcCsrKQotCQkJOwotCQlpZiAoISpjcCB8fCAqY3AgPT0gJyMnIHx8ICpjcCA9PSAnXG4nKQotCQkJY29udGludWU7Ci0KLQkJY3Bbc3RyY3NwbihjcCwgIlxuIildID0gJ1wwJzsKLQotCQl2YWx1ZSA9IHN0cmNocihjcCwgJz0nKTsKLQkJaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiQmFkIGxpbmUgJXUgaW4gJS4xMDBzXG4iLCBsaW5lbm8sCi0JCQkgICAgZmlsZW5hbWUpOwotCQkJY29udGludWU7Ci0JCX0KLQkJLyoKLQkJICogUmVwbGFjZSB0aGUgZXF1YWxzIHNpZ24gYnkgbnVsLCBhbmQgYWR2YW5jZSB2YWx1ZSB0bwotCQkgKiB0aGUgdmFsdWUgc3RyaW5nLgotCQkgKi8KLQkJKnZhbHVlID0gJ1wwJzsKLQkJdmFsdWUrKzsKLQkJY2hpbGRfc2V0X2VudihlbnYsIGVudnNpemUsIGNwLCB2YWx1ZSk7Ci0JfQotCWZjbG9zZShmKTsKLX0KLQotI2lmZGVmIEhBVkVfRVRDX0RFRkFVTFRfTE9HSU4KLS8qCi0gKiBSZXR1cm4gbmFtZWQgdmFyaWFibGUgZnJvbSBzcGVjaWZpZWQgZW52aXJvbm1lbnQsIG9yIE5VTEwgaWYgbm90IHByZXNlbnQuCi0gKi8KLXN0YXRpYyBjaGFyICoKLWNoaWxkX2dldF9lbnYoY2hhciAqKmVudiwgY29uc3QgY2hhciAqbmFtZSkKLXsKLQlpbnQgaTsKLQlzaXplX3QgbGVuOwotCi0JbGVuID0gc3RybGVuKG5hbWUpOwotCWZvciAoaT0wOyBlbnZbaV0gIT0gTlVMTDsgaSsrKQotCQlpZiAoc3RybmNtcChuYW1lLCBlbnZbaV0sIGxlbikgPT0gMCAmJiBlbnZbaV1bbGVuXSA9PSAnPScpCi0JCQlyZXR1cm4oZW52W2ldICsgbGVuICsgMSk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBSZWFkIC9ldGMvZGVmYXVsdC9sb2dpbi4KLSAqIFdlIHBpY2sgdXAgdGhlIFBBVEggKG9yIFNVUEFUSCBmb3Igcm9vdCkgYW5kIFVNQVNLLgotICovCi1zdGF0aWMgdm9pZAotcmVhZF9ldGNfZGVmYXVsdF9sb2dpbihjaGFyICoqKmVudiwgdV9pbnQgKmVudnNpemUsIHVpZF90IHVpZCkKLXsKLQljaGFyICoqdG1wZW52ID0gTlVMTCwgKnZhcjsKLQl1X2ludCBpLCB0bXBlbnZzaXplID0gMDsKLQl1X2xvbmcgbWFzazsKLQotCS8qCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjb3B5IHRoZSB3aG9sZSBmaWxlIHRvIHRoZSBjaGlsZCdzIGVudmlyb25tZW50LAotCSAqIHNvIHdlIHVzZSBhIHRlbXBvcmFyeSBlbnZpcm9ubWVudCBhbmQgY29weSB0aGUgdmFyaWFibGVzIHdlJ3JlCi0JICogaW50ZXJlc3RlZCBpbi4KLQkgKi8KLQlyZWFkX2Vudmlyb25tZW50X2ZpbGUoJnRtcGVudiwgJnRtcGVudnNpemUsICIvZXRjL2RlZmF1bHQvbG9naW4iKTsKLQotCWlmICh0bXBlbnYgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JaWYgKHVpZCA9PSAwKQotCQl2YXIgPSBjaGlsZF9nZXRfZW52KHRtcGVudiwgIlNVUEFUSCIpOwotCWVsc2UKLQkJdmFyID0gY2hpbGRfZ2V0X2Vudih0bXBlbnYsICJQQVRIIik7Ci0JaWYgKHZhciAhPSBOVUxMKQotCQljaGlsZF9zZXRfZW52KGVudiwgZW52c2l6ZSwgIlBBVEgiLCB2YXIpOwotCi0JaWYgKCh2YXIgPSBjaGlsZF9nZXRfZW52KHRtcGVudiwgIlVNQVNLIikpICE9IE5VTEwpCi0JCWlmIChzc2NhbmYodmFyLCAiJTVsbyIsICZtYXNrKSA9PSAxKQotCQkJdW1hc2soKG1vZGVfdCltYXNrKTsKLQotCWZvciAoaSA9IDA7IHRtcGVudltpXSAhPSBOVUxMOyBpKyspCi0JCXhmcmVlKHRtcGVudltpXSk7Ci0JeGZyZWUodG1wZW52KTsKLX0KLSNlbmRpZiAvKiBIQVZFX0VUQ19ERUZBVUxUX0xPR0lOICovCi0KLXZvaWQKLWNvcHlfZW52aXJvbm1lbnQoY2hhciAqKnNvdXJjZSwgY2hhciAqKiplbnYsIHVfaW50ICplbnZzaXplKQotewotCWNoYXIgKnZhcl9uYW1lLCAqdmFyX3ZhbDsKLQlpbnQgaTsKLQotCWlmIChzb3VyY2UgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JZm9yKGkgPSAwOyBzb3VyY2VbaV0gIT0gTlVMTDsgaSsrKSB7Ci0JCXZhcl9uYW1lID0geHN0cmR1cChzb3VyY2VbaV0pOwotCQlpZiAoKHZhcl92YWwgPSBzdHJzdHIodmFyX25hbWUsICI9IikpID09IE5VTEwpIHsKLQkJCXhmcmVlKHZhcl9uYW1lKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCSp2YXJfdmFsKysgPSAnXDAnOwotCi0JCWRlYnVnMygiQ29weSBlbnZpcm9ubWVudDogJXM9JXMiLCB2YXJfbmFtZSwgdmFyX3ZhbCk7Ci0JCWNoaWxkX3NldF9lbnYoZW52LCBlbnZzaXplLCB2YXJfbmFtZSwgdmFyX3ZhbCk7Ci0KLQkJeGZyZWUodmFyX25hbWUpOwotCX0KLX0KLQotc3RhdGljIGNoYXIgKioKLWRvX3NldHVwX2VudihTZXNzaW9uICpzLCBjb25zdCBjaGFyICpzaGVsbCkKLXsKLQljaGFyIGJ1ZlsyNTZdOwotCXVfaW50IGksIGVudnNpemU7Ci0JY2hhciAqKmVudiwgKmxhZGRyOwotCXN0cnVjdCBwYXNzd2QgKnB3ID0gcy0+cHc7Ci0jaWYgIWRlZmluZWQgKEhBVkVfTE9HSU5fQ0FQKSAmJiAhZGVmaW5lZCAoSEFWRV9DWUdXSU4pCi0JY2hhciAqcGF0aCA9IE5VTEw7Ci0jZW5kaWYKLQotCS8qIEluaXRpYWxpemUgdGhlIGVudmlyb25tZW50LiAqLwotCWVudnNpemUgPSAxMDA7Ci0JZW52ID0geGNhbGxvYyhlbnZzaXplLCBzaXplb2YoY2hhciAqKSk7Ci0JZW52WzBdID0gTlVMTDsKLQotI2lmZGVmIEhBVkVfQ1lHV0lOCi0JLyoKLQkgKiBUaGUgV2luZG93cyBlbnZpcm9ubWVudCBjb250YWlucyBzb21lIHNldHRpbmcgd2hpY2ggYXJlCi0JICogaW1wb3J0YW50IGZvciBhIHJ1bm5pbmcgc3lzdGVtLiBUaGV5IG11c3Qgbm90IGJlIGRyb3BwZWQuCi0JICovCi0JewotCQljaGFyICoqcDsKLQotCQlwID0gZmV0Y2hfd2luZG93c19lbnZpcm9ubWVudCgpOwotCQljb3B5X2Vudmlyb25tZW50KHAsICZlbnYsICZlbnZzaXplKTsKLQkJZnJlZV93aW5kb3dzX2Vudmlyb25tZW50KHApOwotCX0KLSNlbmRpZgotCi0jaWZkZWYgR1NTQVBJCi0JLyogQWxsb3cgYW55IEdTU0FQSSBtZXRob2RzIHRoYXQgd2UndmUgdXNlZCB0byBhbHRlcgotCSAqIHRoZSBjaGlsZHMgZW52aXJvbm1lbnQgYXMgdGhleSBzZWUgZml0Ci0JICovCi0Jc3NoX2dzc2FwaV9kb19jaGlsZCgmZW52LCAmZW52c2l6ZSk7Ci0jZW5kaWYKLQotCWlmICghb3B0aW9ucy51c2VfbG9naW4pIHsKLQkJLyogU2V0IGJhc2ljIGVudmlyb25tZW50LiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgcy0+bnVtX2VudjsgaSsrKQotCQkJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgcy0+ZW52W2ldLm5hbWUsCi0JCQkgICAgcy0+ZW52W2ldLnZhbCk7Ci0KLQkJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgIlVTRVIiLCBwdy0+cHdfbmFtZSk7Ci0JCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJMT0dOQU1FIiwgcHctPnB3X25hbWUpOwotI2lmZGVmIF9BSVgKLQkJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgIkxPR0lOIiwgcHctPnB3X25hbWUpOwotI2VuZGlmCi0JCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJIT01FIiwgcHctPnB3X2Rpcik7Ci0jaWZkZWYgSEFWRV9MT0dJTl9DQVAKLQkJaWYgKHNldHVzZXJjb250ZXh0KGxjLCBwdywgcHctPnB3X3VpZCwgTE9HSU5fU0VUUEFUSCkgPCAwKQotCQkJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgIlBBVEgiLCBfUEFUSF9TVERQQVRIKTsKLQkJZWxzZQotCQkJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgIlBBVEgiLCBnZXRlbnYoIlBBVEgiKSk7Ci0jZWxzZSAvKiBIQVZFX0xPR0lOX0NBUCAqLwotIyBpZm5kZWYgSEFWRV9DWUdXSU4KLQkJLyoKLQkJICogVGhlcmUncyBubyBzdGFuZGFyZCBwYXRoIG9uIFdpbmRvd3MuIFRoZSBwYXRoIGNvbnRhaW5zCi0JCSAqIGltcG9ydGFudCBjb21wb25lbnRzIHBvaW50aW5nIHRvIHRoZSBzeXN0ZW0gZGlyZWN0b3JpZXMsCi0JCSAqIG5lZWRlZCBmb3IgbG9hZGluZyBzaGFyZWQgbGlicmFyaWVzLiBTbyB0aGUgcGF0aCBiZXR0ZXIKLQkJICogcmVtYWlucyBpbnRhY3QgaGVyZS4KLQkJICovCi0jICBpZmRlZiBIQVZFX0VUQ19ERUZBVUxUX0xPR0lOCi0JCXJlYWRfZXRjX2RlZmF1bHRfbG9naW4oJmVudiwgJmVudnNpemUsIHB3LT5wd191aWQpOwotCQlwYXRoID0gY2hpbGRfZ2V0X2VudihlbnYsICJQQVRIIik7Ci0jICBlbmRpZiAvKiBIQVZFX0VUQ19ERUZBVUxUX0xPR0lOICovCi0JCWlmIChwYXRoID09IE5VTEwgfHwgKnBhdGggPT0gJ1wwJykgewotCQkJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgIlBBVEgiLAotCQkJICAgIHMtPnB3LT5wd191aWQgPT0gMCA/Ci0JCQkJU1VQRVJVU0VSX1BBVEggOiBfUEFUSF9TVERQQVRIKTsKLQkJfQotIyBlbmRpZiAvKiBIQVZFX0NZR1dJTiAqLwotI2VuZGlmIC8qIEhBVkVfTE9HSU5fQ0FQICovCi0KLQkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJS4yMDBzLyUuNTBzIiwKLQkJCSBfUEFUSF9NQUlMRElSLCBwdy0+cHdfbmFtZSk7Ci0JCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJNQUlMIiwgYnVmKTsKLQotCQkvKiBOb3JtYWwgc3lzdGVtcyBzZXQgU0hFTEwgYnkgZGVmYXVsdC4gKi8KLQkJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgIlNIRUxMIiwgc2hlbGwpOwotCX0KLQlpZiAoZ2V0ZW52KCJUWiIpKQotCQljaGlsZF9zZXRfZW52KCZlbnYsICZlbnZzaXplLCAiVFoiLCBnZXRlbnYoIlRaIikpOwotCi0JLyogU2V0IGN1c3RvbSBlbnZpcm9ubWVudCBvcHRpb25zIGZyb20gUlNBIGF1dGhlbnRpY2F0aW9uLiAqLwotCWlmICghb3B0aW9ucy51c2VfbG9naW4pIHsKLQkJd2hpbGUgKGN1c3RvbV9lbnZpcm9ubWVudCkgewotCQkJc3RydWN0IGVudnN0cmluZyAqY2UgPSBjdXN0b21fZW52aXJvbm1lbnQ7Ci0JCQljaGFyICpzdHIgPSBjZS0+czsKLQotCQkJZm9yIChpID0gMDsgc3RyW2ldICE9ICc9JyAmJiBzdHJbaV07IGkrKykKLQkJCQk7Ci0JCQlpZiAoc3RyW2ldID09ICc9JykgewotCQkJCXN0cltpXSA9IDA7Ci0JCQkJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgc3RyLCBzdHIgKyBpICsgMSk7Ci0JCQl9Ci0JCQljdXN0b21fZW52aXJvbm1lbnQgPSBjZS0+bmV4dDsKLQkJCXhmcmVlKGNlLT5zKTsKLQkJCXhmcmVlKGNlKTsKLQkJfQotCX0KLQotCS8qIFNTSF9DTElFTlQgZGVwcmVjYXRlZCAqLwotCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiUuNTBzICVkICVkIiwKLQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSwgZ2V0X3JlbW90ZV9wb3J0KCksIGdldF9sb2NhbF9wb3J0KCkpOwotCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJTU0hfQ0xJRU5UIiwgYnVmKTsKLQotCWxhZGRyID0gZ2V0X2xvY2FsX2lwYWRkcihwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSk7Ci0Jc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJS41MHMgJWQgJS41MHMgJWQiLAotCSAgICBnZXRfcmVtb3RlX2lwYWRkcigpLCBnZXRfcmVtb3RlX3BvcnQoKSwgbGFkZHIsIGdldF9sb2NhbF9wb3J0KCkpOwotCXhmcmVlKGxhZGRyKTsKLQljaGlsZF9zZXRfZW52KCZlbnYsICZlbnZzaXplLCAiU1NIX0NPTk5FQ1RJT04iLCBidWYpOwotCi0JaWYgKHMtPnR0eWZkICE9IC0xKQotCQljaGlsZF9zZXRfZW52KCZlbnYsICZlbnZzaXplLCAiU1NIX1RUWSIsIHMtPnR0eSk7Ci0JaWYgKHMtPnRlcm0pCi0JCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJURVJNIiwgcy0+dGVybSk7Ci0JaWYgKHMtPmRpc3BsYXkpCi0JCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJESVNQTEFZIiwgcy0+ZGlzcGxheSk7Ci0JaWYgKG9yaWdpbmFsX2NvbW1hbmQpCi0JCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJTU0hfT1JJR0lOQUxfQ09NTUFORCIsCi0JCSAgICBvcmlnaW5hbF9jb21tYW5kKTsKLQotI2lmZGVmIF9VTklDT1MKLQlpZiAoY3JheV90bXBkaXJbMF0gIT0gJ1wwJykKLQkJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgIlRNUERJUiIsIGNyYXlfdG1wZGlyKTsKLSNlbmRpZiAvKiBfVU5JQ09TICovCi0KLQkvKgotCSAqIFNpbmNlIHdlIGNsZWFyIEtSQjVDQ05BTUUgYXQgc3RhcnR1cCwgaWYgaXQncyBzZXQgbm93IHRoZW4gaXQKLQkgKiBtdXN0IGhhdmUgYmVlbiBzZXQgYnkgYSBuYXRpdmUgYXV0aGVudGljYXRpb24gbWV0aG9kIChlZyBBSVggb3IKLQkgKiBTSUEpLCBzbyBjb3B5IGl0IHRvIHRoZSBjaGlsZC4KLQkgKi8KLQl7Ci0JCWNoYXIgKmNwOwotCi0JCWlmICgoY3AgPSBnZXRlbnYoIktSQjVDQ05BTUUiKSkgIT0gTlVMTCkKLQkJCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsICJLUkI1Q0NOQU1FIiwgY3ApOwotCX0KLQotI2lmZGVmIF9BSVgKLQl7Ci0JCWNoYXIgKmNwOwotCi0JCWlmICgoY3AgPSBnZXRlbnYoIkFVVEhTVEFURSIpKSAhPSBOVUxMKQotCQkJY2hpbGRfc2V0X2VudigmZW52LCAmZW52c2l6ZSwgIkFVVEhTVEFURSIsIGNwKTsKLQkJcmVhZF9lbnZpcm9ubWVudF9maWxlKCZlbnYsICZlbnZzaXplLCAiL2V0Yy9lbnZpcm9ubWVudCIpOwotCX0KLSNlbmRpZgotI2lmZGVmIEtSQjUKLQlpZiAocy0+YXV0aGN0eHQtPmtyYjVfY2NuYW1lKQotCQljaGlsZF9zZXRfZW52KCZlbnYsICZlbnZzaXplLCAiS1JCNUNDTkFNRSIsCi0JCSAgICBzLT5hdXRoY3R4dC0+a3JiNV9jY25hbWUpOwotI2VuZGlmCi0jaWZkZWYgVVNFX1BBTQotCS8qCi0JICogUHVsbCBpbiBhbnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgbWF5IGhhdmUKLQkgKiBiZWVuIHNldCBieSBQQU0uCi0JICovCi0JaWYgKG9wdGlvbnMudXNlX3BhbSkgewotCQljaGFyICoqcDsKLQotCQlwID0gZmV0Y2hfcGFtX2NoaWxkX2Vudmlyb25tZW50KCk7Ci0JCWNvcHlfZW52aXJvbm1lbnQocCwgJmVudiwgJmVudnNpemUpOwotCQlmcmVlX3BhbV9lbnZpcm9ubWVudChwKTsKLQotCQlwID0gZmV0Y2hfcGFtX2Vudmlyb25tZW50KCk7Ci0JCWNvcHlfZW52aXJvbm1lbnQocCwgJmVudiwgJmVudnNpemUpOwotCQlmcmVlX3BhbV9lbnZpcm9ubWVudChwKTsKLQl9Ci0jZW5kaWYgLyogVVNFX1BBTSAqLwotCi0JaWYgKGF1dGhfc29ja19uYW1lICE9IE5VTEwpCi0JCWNoaWxkX3NldF9lbnYoJmVudiwgJmVudnNpemUsIFNTSF9BVVRIU09DS0VUX0VOVl9OQU1FLAotCQkgICAgYXV0aF9zb2NrX25hbWUpOwotCi0JLyogcmVhZCAkSE9NRS8uc3NoL2Vudmlyb25tZW50LiAqLwotCWlmIChvcHRpb25zLnBlcm1pdF91c2VyX2VudiAmJiAhb3B0aW9ucy51c2VfbG9naW4pIHsKLQkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJS4yMDBzLy5zc2gvZW52aXJvbm1lbnQiLAotCQkgICAgc3RyY21wKHB3LT5wd19kaXIsICIvIikgPyBwdy0+cHdfZGlyIDogIiIpOwotCQlyZWFkX2Vudmlyb25tZW50X2ZpbGUoJmVudiwgJmVudnNpemUsIGJ1Zik7Ci0JfQotCWlmIChkZWJ1Z19mbGFnKSB7Ci0JCS8qIGR1bXAgdGhlIGVudmlyb25tZW50ICovCi0JCWZwcmludGYoc3RkZXJyLCAiRW52aXJvbm1lbnQ6XG4iKTsKLQkJZm9yIChpID0gMDsgZW52W2ldOyBpKyspCi0JCQlmcHJpbnRmKHN0ZGVyciwgIiAgJS4yMDBzXG4iLCBlbnZbaV0pOwotCX0KLQlyZXR1cm4gZW52OwotfQotCi0vKgotICogUnVuICRIT01FLy5zc2gvcmMsIC9ldGMvc3NoL3NzaHJjLCBvciB4YXV0aCAod2hpY2hldmVyIGlzIGZvdW5kCi0gKiBmaXJzdCBpbiB0aGlzIG9yZGVyKS4KLSAqLwotc3RhdGljIHZvaWQKLWRvX3JjX2ZpbGVzKFNlc3Npb24gKnMsIGNvbnN0IGNoYXIgKnNoZWxsKQotewotCUZJTEUgKmYgPSBOVUxMOwotCWNoYXIgY21kWzEwMjRdOwotCWludCBkb194YXV0aDsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQotCWRvX3hhdXRoID0KLQkgICAgcy0+ZGlzcGxheSAhPSBOVUxMICYmIHMtPmF1dGhfcHJvdG8gIT0gTlVMTCAmJiBzLT5hdXRoX2RhdGEgIT0gTlVMTDsKLQotCS8qIGlnbm9yZSBfUEFUSF9TU0hfVVNFUl9SQyBmb3Igc3Vic3lzdGVtcyBhbmQgYWRtaW4gZm9yY2VkIGNvbW1hbmRzICovCi0JaWYgKCFzLT5pc19zdWJzeXN0ZW0gJiYgb3B0aW9ucy5hZG1fZm9yY2VkX2NvbW1hbmQgPT0gTlVMTCAmJgotCSAgICAhbm9fdXNlcl9yYyAmJiBzdGF0KF9QQVRIX1NTSF9VU0VSX1JDLCAmc3QpID49IDApIHsKLQkJc25wcmludGYoY21kLCBzaXplb2YgY21kLCAiJXMgLWMgJyVzICVzJyIsCi0JCSAgICBzaGVsbCwgX1BBVEhfQlNIRUxMLCBfUEFUSF9TU0hfVVNFUl9SQyk7Ci0JCWlmIChkZWJ1Z19mbGFnKQotCQkJZnByaW50ZihzdGRlcnIsICJSdW5uaW5nICVzXG4iLCBjbWQpOwotCQlmID0gcG9wZW4oY21kLCAidyIpOwotCQlpZiAoZikgewotCQkJaWYgKGRvX3hhdXRoKQotCQkJCWZwcmludGYoZiwgIiVzICVzXG4iLCBzLT5hdXRoX3Byb3RvLAotCQkJCSAgICBzLT5hdXRoX2RhdGEpOwotCQkJcGNsb3NlKGYpOwotCQl9IGVsc2UKLQkJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHJ1biAlc1xuIiwKLQkJCSAgICBfUEFUSF9TU0hfVVNFUl9SQyk7Ci0JfSBlbHNlIGlmIChzdGF0KF9QQVRIX1NTSF9TWVNURU1fUkMsICZzdCkgPj0gMCkgewotCQlpZiAoZGVidWdfZmxhZykKLQkJCWZwcmludGYoc3RkZXJyLCAiUnVubmluZyAlcyAlc1xuIiwgX1BBVEhfQlNIRUxMLAotCQkJICAgIF9QQVRIX1NTSF9TWVNURU1fUkMpOwotCQlmID0gcG9wZW4oX1BBVEhfQlNIRUxMICIgIiBfUEFUSF9TU0hfU1lTVEVNX1JDLCAidyIpOwotCQlpZiAoZikgewotCQkJaWYgKGRvX3hhdXRoKQotCQkJCWZwcmludGYoZiwgIiVzICVzXG4iLCBzLT5hdXRoX3Byb3RvLAotCQkJCSAgICBzLT5hdXRoX2RhdGEpOwotCQkJcGNsb3NlKGYpOwotCQl9IGVsc2UKLQkJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHJ1biAlc1xuIiwKLQkJCSAgICBfUEFUSF9TU0hfU1lTVEVNX1JDKTsKLQl9IGVsc2UgaWYgKGRvX3hhdXRoICYmIG9wdGlvbnMueGF1dGhfbG9jYXRpb24gIT0gTlVMTCkgewotCQkvKiBBZGQgYXV0aG9yaXR5IGRhdGEgdG8gLlhhdXRob3JpdHkgaWYgYXBwcm9wcmlhdGUuICovCi0JCWlmIChkZWJ1Z19mbGFnKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSAgICAiUnVubmluZyAlLjUwMHMgcmVtb3ZlICUuMTAwc1xuIiwKLQkJCSAgICBvcHRpb25zLnhhdXRoX2xvY2F0aW9uLCBzLT5hdXRoX2Rpc3BsYXkpOwotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkgICAgIiUuNTAwcyBhZGQgJS4xMDBzICUuMTAwcyAlLjEwMHNcbiIsCi0JCQkgICAgb3B0aW9ucy54YXV0aF9sb2NhdGlvbiwgcy0+YXV0aF9kaXNwbGF5LAotCQkJICAgIHMtPmF1dGhfcHJvdG8sIHMtPmF1dGhfZGF0YSk7Ci0JCX0KLQkJc25wcmludGYoY21kLCBzaXplb2YgY21kLCAiJXMgLXEgLSIsCi0JCSAgICBvcHRpb25zLnhhdXRoX2xvY2F0aW9uKTsKLQkJZiA9IHBvcGVuKGNtZCwgInciKTsKLQkJaWYgKGYpIHsKLQkJCWZwcmludGYoZiwgInJlbW92ZSAlc1xuIiwKLQkJCSAgICBzLT5hdXRoX2Rpc3BsYXkpOwotCQkJZnByaW50ZihmLCAiYWRkICVzICVzICVzXG4iLAotCQkJICAgIHMtPmF1dGhfZGlzcGxheSwgcy0+YXV0aF9wcm90bywKLQkJCSAgICBzLT5hdXRoX2RhdGEpOwotCQkJcGNsb3NlKGYpOwotCQl9IGVsc2UgewotCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcnVuICVzXG4iLAotCQkJICAgIGNtZCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19ub2xvZ2luKHN0cnVjdCBwYXNzd2QgKnB3KQotewotCUZJTEUgKmYgPSBOVUxMOwotCWNoYXIgYnVmWzEwMjRdLCAqbmwsICpkZWZfbmwgPSBfUEFUSF9OT0xPR0lOOwotCXN0cnVjdCBzdGF0IHNiOwotCi0jaWZkZWYgSEFWRV9MT0dJTl9DQVAKLQlpZiAobG9naW5fZ2V0Y2FwYm9vbChsYywgImlnbm9yZW5vbG9naW4iLCAwKSAmJiBwdy0+cHdfdWlkKQotCQlyZXR1cm47Ci0JbmwgPSBsb2dpbl9nZXRjYXBzdHIobGMsICJub2xvZ2luIiwgZGVmX25sLCBkZWZfbmwpOwotI2Vsc2UKLQlpZiAocHctPnB3X3VpZCA9PSAwKQotCQlyZXR1cm47Ci0JbmwgPSBkZWZfbmw7Ci0jZW5kaWYKLQlpZiAoc3RhdChubCwgJnNiKSA9PSAtMSkgewotCQlpZiAobmwgIT0gZGVmX25sKQotCQkJeGZyZWUobmwpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogL2V0Yy9ub2xvZ2luIGV4aXN0cy4gIFByaW50IGl0cyBjb250ZW50cyBpZiB3ZSBjYW4gYW5kIGV4aXQuICovCi0JbG9naXQoIlVzZXIgJS4xMDBzIG5vdCBhbGxvd2VkIGJlY2F1c2UgJXMgZXhpc3RzIiwgcHctPnB3X25hbWUsIG5sKTsKLQlpZiAoKGYgPSBmb3BlbihubCwgInIiKSkgIT0gTlVMTCkgewotIAkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpKQotIAkJCWZwdXRzKGJ1Ziwgc3RkZXJyKTsKLSAJCWZjbG9zZShmKTsKLSAJfQotCWV4aXQoMjU0KTsKLX0KLQotLyoKLSAqIENocm9vdCBpbnRvIGEgZGlyZWN0b3J5IGFmdGVyIGNoZWNraW5nIGl0IGZvciBzYWZldHk6IGFsbCBwYXRoIGNvbXBvbmVudHMKLSAqIG11c3QgYmUgcm9vdC1vd25lZCBkaXJlY3RvcmllcyB3aXRoIHN0cmljdCBwZXJtaXNzaW9ucy4KLSAqLwotc3RhdGljIHZvaWQKLXNhZmVseV9jaHJvb3QoY29uc3QgY2hhciAqcGF0aCwgdWlkX3QgdWlkKQotewotCWNvbnN0IGNoYXIgKmNwOwotCWNoYXIgY29tcG9uZW50W01BWFBBVEhMRU5dOwotCXN0cnVjdCBzdGF0IHN0OwotCi0JaWYgKCpwYXRoICE9ICcvJykKLQkJZmF0YWwoImNocm9vdCBwYXRoIGRvZXMgbm90IGJlZ2luIGF0IHJvb3QiKTsKLQlpZiAoc3RybGVuKHBhdGgpID49IHNpemVvZihjb21wb25lbnQpKQotCQlmYXRhbCgiY2hyb290IHBhdGggdG9vIGxvbmciKTsKLQotCS8qCi0JICogRGVzY2VuZCB0aGUgcGF0aCwgY2hlY2tpbmcgdGhhdCBlYWNoIGNvbXBvbmVudCBpcyBhCi0JICogcm9vdC1vd25lZCBkaXJlY3Rvcnkgd2l0aCBzdHJpY3QgcGVybWlzc2lvbnMuCi0JICovCi0JZm9yIChjcCA9IHBhdGg7IGNwICE9IE5VTEw7KSB7Ci0JCWlmICgoY3AgPSBzdHJjaHIoY3AsICcvJykpID09IE5VTEwpCi0JCQlzdHJsY3B5KGNvbXBvbmVudCwgcGF0aCwgc2l6ZW9mKGNvbXBvbmVudCkpOwotCQllbHNlIHsKLQkJCWNwKys7Ci0JCQltZW1jcHkoY29tcG9uZW50LCBwYXRoLCBjcCAtIHBhdGgpOwotCQkJY29tcG9uZW50W2NwIC0gcGF0aF0gPSAnXDAnOwotCQl9Ci0JCi0JCWRlYnVnMygiJXM6IGNoZWNraW5nICclcyciLCBfX2Z1bmNfXywgY29tcG9uZW50KTsKLQotCQlpZiAoc3RhdChjb21wb25lbnQsICZzdCkgIT0gMCkKLQkJCWZhdGFsKCIlczogc3RhdChcIiVzXCIpOiAlcyIsIF9fZnVuY19fLAotCQkJICAgIGNvbXBvbmVudCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJaWYgKHN0LnN0X3VpZCAhPSAwIHx8IChzdC5zdF9tb2RlICYgMDIyKSAhPSAwKQotCQkJZmF0YWwoImJhZCBvd25lcnNoaXAgb3IgbW9kZXMgZm9yIGNocm9vdCAiCi0JCQkgICAgImRpcmVjdG9yeSAlc1wiJXNcIiIsIAotCQkJICAgIGNwID09IE5VTEwgPyAiIiA6ICJjb21wb25lbnQgIiwgY29tcG9uZW50KTsKLQkJaWYgKCFTX0lTRElSKHN0LnN0X21vZGUpKQotCQkJZmF0YWwoImNocm9vdCBwYXRoICVzXCIlc1wiIGlzIG5vdCBhIGRpcmVjdG9yeSIsCi0JCQkgICAgY3AgPT0gTlVMTCA/ICIiIDogImNvbXBvbmVudCAiLCBjb21wb25lbnQpOwotCi0JfQotCi0JaWYgKGNoZGlyKHBhdGgpID09IC0xKQotCQlmYXRhbCgiVW5hYmxlIHRvIGNoZGlyIHRvIGNocm9vdCBwYXRoIFwiJXNcIjogIgotCQkgICAgIiVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoY2hyb290KHBhdGgpID09IC0xKQotCQlmYXRhbCgiY2hyb290KFwiJXNcIik6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoY2hkaXIoIi8iKSA9PSAtMSkKLQkJZmF0YWwoIiVzOiBjaGRpcigvKSBhZnRlciBjaHJvb3Q6ICVzIiwKLQkJICAgIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotCXZlcmJvc2UoIkNoYW5nZWQgcm9vdCBkaXJlY3RvcnkgdG8gXCIlc1wiIiwgcGF0aCk7Ci19Ci0KLS8qIFNldCBsb2dpbiBuYW1lLCB1aWQsIGdpZCwgYW5kIGdyb3Vwcy4gKi8KLXZvaWQKLWRvX3NldHVzZXJjb250ZXh0KHN0cnVjdCBwYXNzd2QgKnB3KQotewotCWNoYXIgKmNocm9vdF9wYXRoLCAqdG1wOwotCi0JcGxhdGZvcm1fc2V0dXNlcmNvbnRleHQocHcpOwotCi0JaWYgKHBsYXRmb3JtX3ByaXZpbGVnZWRfdWlkc3dhcCgpKSB7Ci0jaWZkZWYgSEFWRV9MT0dJTl9DQVAKLQkJaWYgKHNldHVzZXJjb250ZXh0KGxjLCBwdywgcHctPnB3X3VpZCwKLQkJICAgIChMT0dJTl9TRVRBTEwgJiB+KExPR0lOX1NFVFBBVEh8TE9HSU5fU0VUVVNFUikpKSA8IDApIHsKLQkJCXBlcnJvcigidW5hYmxlIHRvIHNldCB1c2VyIGNvbnRleHQiKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLSNlbHNlCi0JCWlmIChzZXRsb2dpbihwdy0+cHdfbmFtZSkgPCAwKQotCQkJZXJyb3IoInNldGxvZ2luIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlpZiAoc2V0Z2lkKHB3LT5wd19naWQpIDwgMCkgewotCQkJcGVycm9yKCJzZXRnaWQiKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJLyogSW5pdGlhbGl6ZSB0aGUgZ3JvdXAgbGlzdC4gKi8KLQkJaWYgKGluaXRncm91cHMocHctPnB3X25hbWUsIHB3LT5wd19naWQpIDwgMCkgewotCQkJcGVycm9yKCJpbml0Z3JvdXBzIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0jaWZuZGVmIEFORFJPSUQKLQkJLyogRklYTUUgLSBBbmRyb2lkIGRvZXNuJ3QgaGF2ZSB0aGlzICovCi0JCWVuZGdyZW50KCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0JCXBsYXRmb3JtX3NldHVzZXJjb250ZXh0X3Bvc3RfZ3JvdXBzKHB3KTsKLQotCQlpZiAob3B0aW9ucy5jaHJvb3RfZGlyZWN0b3J5ICE9IE5VTEwgJiYKLQkJICAgIHN0cmNhc2VjbXAob3B0aW9ucy5jaHJvb3RfZGlyZWN0b3J5LCAibm9uZSIpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRpbGRlX2V4cGFuZF9maWxlbmFtZShvcHRpb25zLmNocm9vdF9kaXJlY3RvcnksCi0JCQkgICAgcHctPnB3X3VpZCk7Ci0JCQljaHJvb3RfcGF0aCA9IHBlcmNlbnRfZXhwYW5kKHRtcCwgImgiLCBwdy0+cHdfZGlyLAotCQkJICAgICJ1IiwgcHctPnB3X25hbWUsIChjaGFyICopTlVMTCk7Ci0JCQlzYWZlbHlfY2hyb290KGNocm9vdF9wYXRoLCBwdy0+cHdfdWlkKTsKLQkJCWZyZWUodG1wKTsKLQkJCWZyZWUoY2hyb290X3BhdGgpOwotCQl9Ci0KLSNpZmRlZiBIQVZFX0xPR0lOX0NBUAotCQlpZiAoc2V0dXNlcmNvbnRleHQobGMsIHB3LCBwdy0+cHdfdWlkLCBMT0dJTl9TRVRVU0VSKSA8IDApIHsKLQkJCXBlcnJvcigidW5hYmxlIHRvIHNldCB1c2VyIGNvbnRleHQgKHNldHVzZXIpIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0jZWxzZQotCQkvKiBQZXJtYW5lbnRseSBzd2l0Y2ggdG8gdGhlIGRlc2lyZWQgdWlkLiAqLwotCQlwZXJtYW5lbnRseV9zZXRfdWlkKHB3KTsKLSNlbmRpZgotCX0KLQotCWlmIChnZXR1aWQoKSAhPSBwdy0+cHdfdWlkIHx8IGdldGV1aWQoKSAhPSBwdy0+cHdfdWlkKQotCQlmYXRhbCgiRmFpbGVkIHRvIHNldCB1aWRzIHRvICV1LiIsICh1X2ludCkgcHctPnB3X3VpZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19wd2NoYW5nZShTZXNzaW9uICpzKQotewotCWZmbHVzaChOVUxMKTsKLQlmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IFlvdXIgcGFzc3dvcmQgaGFzIGV4cGlyZWQuXG4iKTsKLQlpZiAocy0+dHR5ZmQgIT0gLTEpIHsKLQkJZnByaW50ZihzdGRlcnIsCi0JCSAgICAiWW91IG11c3QgY2hhbmdlIHlvdXIgcGFzc3dvcmQgbm93IGFuZCBsb2dpbiBhZ2FpbiFcbiIpOwotI2lmZGVmIFdJVEhfU0VMSU5VWAotCQlzZXRleGVjY29uKE5VTEwpOwotI2VuZGlmCi0jaWZkZWYgUEFTU1dEX05FRURTX1VTRVJOQU1FCi0JCWV4ZWNsKF9QQVRIX1BBU1NXRF9QUk9HLCAicGFzc3dkIiwgcy0+cHctPnB3X25hbWUsCi0JCSAgICAoY2hhciAqKU5VTEwpOwotI2Vsc2UKLQkJZXhlY2woX1BBVEhfUEFTU1dEX1BST0csICJwYXNzd2QiLCAoY2hhciAqKU5VTEwpOwotI2VuZGlmCi0JCXBlcnJvcigicGFzc3dkIik7Ci0JfSBlbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsCi0JCSAgICAiUGFzc3dvcmQgY2hhbmdlIHJlcXVpcmVkIGJ1dCBubyBUVFkgYXZhaWxhYmxlLlxuIik7Ci0JfQotCWV4aXQoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sYXVuY2hfbG9naW4oc3RydWN0IHBhc3N3ZCAqcHcsIGNvbnN0IGNoYXIgKmhvc3RuYW1lKQotewotCS8qIExhdW5jaCBsb2dpbigxKS4gKi8KLQotCWV4ZWNsKExPR0lOX1BST0dSQU0sICJsb2dpbiIsICItaCIsIGhvc3RuYW1lLAotI2lmZGVmIHh4eExPR0lOX05FRURTX1RFUk0KLQkJICAgIChzLT50ZXJtID8gcy0+dGVybSA6ICJ1bmtub3duIiksCi0jZW5kaWYgLyogTE9HSU5fTkVFRFNfVEVSTSAqLwotI2lmZGVmIExPR0lOX05PX0VORE9QVAotCSAgICAiLXAiLCAiLWYiLCBwdy0+cHdfbmFtZSwgKGNoYXIgKilOVUxMKTsKLSNlbHNlCi0JICAgICItcCIsICItZiIsICItLSIsIHB3LT5wd19uYW1lLCAoY2hhciAqKU5VTEwpOwotI2VuZGlmCi0KLQkvKiBMb2dpbiBjb3VsZG4ndCBiZSBleGVjdXRlZCwgZGllLiAqLwotCi0JcGVycm9yKCJsb2dpbiIpOwotCWV4aXQoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGlsZF9jbG9zZV9mZHModm9pZCkKLXsKLQlpZiAocGFja2V0X2dldF9jb25uZWN0aW9uX2luKCkgPT0gcGFja2V0X2dldF9jb25uZWN0aW9uX291dCgpKQotCQljbG9zZShwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSk7Ci0JZWxzZSB7Ci0JCWNsb3NlKHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpKTsKLQkJY2xvc2UocGFja2V0X2dldF9jb25uZWN0aW9uX291dCgpKTsKLQl9Ci0JLyoKLQkgKiBDbG9zZSBhbGwgZGVzY3JpcHRvcnMgcmVsYXRlZCB0byBjaGFubmVscy4gIFRoZXkgd2lsbCBzdGlsbCByZW1haW4KLQkgKiBvcGVuIGluIHRoZSBwYXJlbnQuCi0JICovCi0JLyogWFhYIGJldHRlciB1c2UgY2xvc2Utb24tZXhlYz8gLW1hcmt1cyAqLwotCWNoYW5uZWxfY2xvc2VfYWxsKCk7Ci0KLQkvKgotCSAqIENsb3NlIGFueSBleHRyYSBmaWxlIGRlc2NyaXB0b3JzLiAgTm90ZSB0aGF0IHRoZXJlIG1heSBzdGlsbCBiZQotCSAqIGRlc2NyaXB0b3JzIGxlZnQgYnkgc3lzdGVtIGZ1bmN0aW9ucy4gIFRoZXkgd2lsbCBiZSBjbG9zZWQgbGF0ZXIuCi0JICovCi0JZW5kcHdlbnQoKTsKLQotCS8qCi0JICogQ2xvc2UgYW55IGV4dHJhIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdGhlbQotCSAqIGhhbmdpbmcgYXJvdW5kIGluIGNsaWVudHMuICBOb3RlIHRoYXQgd2Ugd2FudCB0byBkbyB0aGlzIGFmdGVyCi0JICogaW5pdGdyb3VwcywgYmVjYXVzZSBhdCBsZWFzdCBvbiBTb2xhcmlzIDIuMyBpdCBsZWF2ZXMgZmlsZQotCSAqIGRlc2NyaXB0b3JzIG9wZW4uCi0JICovCi0JY2xvc2Vmcm9tKFNUREVSUl9GSUxFTk8gKyAxKTsKLX0KLQotLyoKLSAqIFBlcmZvcm1zIGNvbW1vbiBwcm9jZXNzaW5nIGZvciB0aGUgY2hpbGQsIHN1Y2ggYXMgc2V0dGluZyB1cCB0aGUKLSAqIGVudmlyb25tZW50LCBjbG9zaW5nIGV4dHJhIGZpbGUgZGVzY3JpcHRvcnMsIHNldHRpbmcgdGhlIHVzZXIgYW5kIGdyb3VwCi0gKiBpZHMsIGFuZCBleGVjdXRpbmcgdGhlIGNvbW1hbmQgb3Igc2hlbGwuCi0gKi8KLSNkZWZpbmUgQVJHVl9NQVggMTAKLXZvaWQKLWRvX2NoaWxkKFNlc3Npb24gKnMsIGNvbnN0IGNoYXIgKmNvbW1hbmQpCi17Ci0JZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotCWNoYXIgKiplbnY7Ci0JY2hhciAqYXJndltBUkdWX01BWF07Ci0JY29uc3QgY2hhciAqc2hlbGwsICpzaGVsbDAsICpob3N0bmFtZSA9IE5VTEw7Ci0Jc3RydWN0IHBhc3N3ZCAqcHcgPSBzLT5wdzsKLQlpbnQgciA9IDA7Ci0KLQkvKiByZW1vdmUgaG9zdGtleSBmcm9tIHRoZSBjaGlsZCdzIG1lbW9yeSAqLwotCWRlc3Ryb3lfc2Vuc2l0aXZlX2RhdGEoKTsKLQotCS8qIEZvcmNlIGEgcGFzc3dvcmQgY2hhbmdlICovCi0JaWYgKHMtPmF1dGhjdHh0LT5mb3JjZV9wd2NoYW5nZSkgewotCQlkb19zZXR1c2VyY29udGV4dChwdyk7Ci0JCWNoaWxkX2Nsb3NlX2ZkcygpOwotCQlkb19wd2NoYW5nZShzKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQkvKiBsb2dpbigxKSBpcyBvbmx5IGNhbGxlZCBpZiB3ZSBleGVjdXRlIHRoZSBsb2dpbiBzaGVsbCAqLwotCWlmIChvcHRpb25zLnVzZV9sb2dpbiAmJiBjb21tYW5kICE9IE5VTEwpCi0JCW9wdGlvbnMudXNlX2xvZ2luID0gMDsKLQotI2lmZGVmIF9VTklDT1MKLQljcmF5X3NldHVwKHB3LT5wd191aWQsIHB3LT5wd19uYW1lLCBjb21tYW5kKTsKLSNlbmRpZiAvKiBfVU5JQ09TICovCi0KLQkvKgotCSAqIExvZ2luKDEpIGRvZXMgdGhpcyBhcyB3ZWxsLCBhbmQgaXQgbmVlZHMgdWlkIDAgZm9yIHRoZSAiLWgiCi0JICogc3dpdGNoLCBzbyB3ZSBsZXQgbG9naW4oMSkgdG8gdGhpcyBmb3IgdXMuCi0JICovCi0JaWYgKCFvcHRpb25zLnVzZV9sb2dpbikgewotI2lmZGVmIEhBVkVfT1NGX1NJQQotCQlzZXNzaW9uX3NldHVwX3NpYShwdywgcy0+dHR5ZmQgPT0gLTEgPyBOVUxMIDogcy0+dHR5KTsKLQkJaWYgKCFjaGVja19xdWlldGxvZ2luKHMsIGNvbW1hbmQpKQotCQkJZG9fbW90ZCgpOwotI2Vsc2UgLyogSEFWRV9PU0ZfU0lBICovCi0JCS8qIFdoZW4gUEFNIGlzIGVuYWJsZWQgd2UgcmVseSBvbiBpdCB0byBkbyB0aGUgbm9sb2dpbiBjaGVjayAqLwotCQlpZiAoIW9wdGlvbnMudXNlX3BhbSkKLQkJCWRvX25vbG9naW4ocHcpOwotCQlkb19zZXR1c2VyY29udGV4dChwdyk7Ci0JCS8qCi0JCSAqIFBBTSBzZXNzaW9uIG1vZHVsZXMgaW4gZG9fc2V0dXNlcmNvbnRleHQgbWF5IGhhdmUKLQkJICogZ2VuZXJhdGVkIG1lc3NhZ2VzLCBzbyBpZiB0aGlzIGluIGFuIGludGVyYWN0aXZlCi0JCSAqIGxvZ2luIHRoZW4gZGlzcGxheSB0aGVtIHRvby4KLQkJICovCi0JCWlmICghY2hlY2tfcXVpZXRsb2dpbihzLCBjb21tYW5kKSkKLQkJCWRpc3BsYXlfbG9naW5tc2coKTsKLSNlbmRpZiAvKiBIQVZFX09TRl9TSUEgKi8KLQl9Ci0KLSNpZmRlZiBVU0VfUEFNCi0JaWYgKG9wdGlvbnMudXNlX3BhbSAmJiAhb3B0aW9ucy51c2VfbG9naW4gJiYgIWlzX3BhbV9zZXNzaW9uX29wZW4oKSkgewotCQlkZWJ1ZzMoIlBBTSBzZXNzaW9uIG5vdCBvcGVuZWQsIGV4aXRpbmciKTsKLQkJZGlzcGxheV9sb2dpbm1zZygpOwotCQlleGl0KDI1NCk7Ci0JfQotI2VuZGlmCi0KLQkvKgotCSAqIEdldCB0aGUgc2hlbGwgZnJvbSB0aGUgcGFzc3dvcmQgZGF0YS4gIEFuIGVtcHR5IHNoZWxsIGZpZWxkIGlzCi0JICogbGVnYWwsIGFuZCBtZWFucyAvYmluL3NoLgotCSAqLwotCXNoZWxsID0gKHB3LT5wd19zaGVsbFswXSA9PSAnXDAnKSA/IF9QQVRIX0JTSEVMTCA6IHB3LT5wd19zaGVsbDsKLQotCS8qCi0JICogTWFrZSBzdXJlICRTSEVMTCBwb2ludHMgdG8gdGhlIHNoZWxsIGZyb20gdGhlIHBhc3N3b3JkIGZpbGUsCi0JICogZXZlbiBpZiBzaGVsbCBpcyBvdmVycmlkZGVuIGZyb20gbG9naW4uY29uZgotCSAqLwotCWVudiA9IGRvX3NldHVwX2VudihzLCBzaGVsbCk7Ci0KLSNpZmRlZiBIQVZFX0xPR0lOX0NBUAotCXNoZWxsID0gbG9naW5fZ2V0Y2Fwc3RyKGxjLCAic2hlbGwiLCAoY2hhciAqKXNoZWxsLCAoY2hhciAqKXNoZWxsKTsKLSNlbmRpZgotCi0JLyogd2UgaGF2ZSB0byBzdGFzaCB0aGUgaG9zdG5hbWUgYmVmb3JlIHdlIGNsb3NlIG91ciBzb2NrZXQuICovCi0JaWYgKG9wdGlvbnMudXNlX2xvZ2luKQotCQlob3N0bmFtZSA9IGdldF9yZW1vdGVfbmFtZV9vcl9pcCh1dG1wX2xlbiwKLQkJICAgIG9wdGlvbnMudXNlX2Rucyk7Ci0JLyoKLQkgKiBDbG9zZSB0aGUgY29ubmVjdGlvbiBkZXNjcmlwdG9yczsgbm90ZSB0aGF0IHRoaXMgaXMgdGhlIGNoaWxkLCBhbmQKLQkgKiB0aGUgc2VydmVyIHdpbGwgc3RpbGwgaGF2ZSB0aGUgc29ja2V0IG9wZW4sIGFuZCBpdCBpcyBpbXBvcnRhbnQKLQkgKiB0aGF0IHdlIGRvIG5vdCBzaHV0ZG93biBpdC4gIE5vdGUgdGhhdCB0aGUgZGVzY3JpcHRvcnMgY2Fubm90IGJlCi0JICogY2xvc2VkIGJlZm9yZSBidWlsZGluZyB0aGUgZW52aXJvbm1lbnQsIGFzIHdlIGNhbGwKLQkgKiBnZXRfcmVtb3RlX2lwYWRkciB0aGVyZS4KLQkgKi8KLQljaGlsZF9jbG9zZV9mZHMoKTsKLQotCS8qCi0JICogTXVzdCB0YWtlIG5ldyBlbnZpcm9ubWVudCBpbnRvIHVzZSBzbyB0aGF0IC5zc2gvcmMsCi0JICogL2V0Yy9zc2gvc3NocmMgYW5kIHhhdXRoIGFyZSBydW4gaW4gdGhlIHByb3BlciBlbnZpcm9ubWVudC4KLQkgKi8KLQllbnZpcm9uID0gZW52OwotCi0jaWYgZGVmaW5lZChLUkI1KSAmJiBkZWZpbmVkKFVTRV9BRlMpCi0JLyoKLQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBjaGVjayB0byBzZWUgaWYgQUZTIGlzIGFjdGl2ZSBhbmQgaWYgd2UgaGF2ZQotCSAqIGEgdmFsaWQgS2VyYmVyb3MgNSBUR1QuIElmIHNvLCBpdCBzZWVtcyBsaWtlIGEgZ29vZCBpZGVhIHRvIHNlZQotCSAqIGlmIHdlIGNhbiAoYW5kIG5lZWQgdG8pIGV4dGVuZCB0aGUgdGlja2V0IGludG8gYW4gQUZTIHRva2VuLiBJZgotCSAqIHdlIGRvbid0IGRvIHRoaXMsIHdlIHJ1biBpbnRvIHBvdGVudGlhbCBwcm9ibGVtcyBpZiB0aGUgdXNlcidzCi0JICogaG9tZSBkaXJlY3RvcnkgaXMgaW4gQUZTIGFuZCBpdCdzIG5vdCB3b3JsZC1yZWFkYWJsZS4KLQkgKi8KLQotCWlmIChvcHRpb25zLmtlcmJlcm9zX2dldF9hZnNfdG9rZW4gJiYga19oYXNhZnMoKSAmJgotCSAgICAocy0+YXV0aGN0eHQtPmtyYjVfY3R4ICE9IE5VTEwpKSB7Ci0JCWNoYXIgY2VsbFs2NF07Ci0KLQkJZGVidWcoIkdldHRpbmcgQUZTIHRva2VuIik7Ci0KLQkJa19zZXRwYWcoKTsKLQotCQlpZiAoa19hZnNfY2VsbF9vZl9maWxlKHB3LT5wd19kaXIsIGNlbGwsIHNpemVvZihjZWxsKSkgPT0gMCkKLQkJCWtyYjVfYWZzbG9nKHMtPmF1dGhjdHh0LT5rcmI1X2N0eCwKLQkJCSAgICBzLT5hdXRoY3R4dC0+a3JiNV9md2RfY2NhY2hlLCBjZWxsLCBOVUxMKTsKLQotCQlrcmI1X2Fmc2xvZ19ob21lKHMtPmF1dGhjdHh0LT5rcmI1X2N0eCwKLQkJICAgIHMtPmF1dGhjdHh0LT5rcmI1X2Z3ZF9jY2FjaGUsIE5VTEwsIE5VTEwsIHB3LT5wd19kaXIpOwotCX0KLSNlbmRpZgotCi0JLyogQ2hhbmdlIGN1cnJlbnQgZGlyZWN0b3J5IHRvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuICovCi0JaWYgKGNoZGlyKHB3LT5wd19kaXIpIDwgMCkgewotCQkvKiBTdXBwcmVzcyBtaXNzaW5nIGhvbWVkaXIgd2FybmluZyBmb3IgY2hyb290IGNhc2UgKi8KLSNpZmRlZiBIQVZFX0xPR0lOX0NBUAotCQlyID0gbG9naW5fZ2V0Y2FwYm9vbChsYywgInJlcXVpcmVob21lIiwgMCk7Ci0jZW5kaWYKLQkJaWYgKHIgfHwgb3B0aW9ucy5jaHJvb3RfZGlyZWN0b3J5ID09IE5VTEwgfHwKLQkJICAgIHN0cmNhc2VjbXAob3B0aW9ucy5jaHJvb3RfZGlyZWN0b3J5LCAibm9uZSIpID09IDApCi0JCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBjaGRpciB0byBob21lICIKLQkJCSAgICAiZGlyZWN0b3J5ICVzOiAlc1xuIiwgcHctPnB3X2RpciwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQlpZiAocikKLQkJCWV4aXQoMSk7Ci0JfQotCi0JY2xvc2Vmcm9tKFNUREVSUl9GSUxFTk8gKyAxKTsKLQotCWlmICghb3B0aW9ucy51c2VfbG9naW4pCi0JCWRvX3JjX2ZpbGVzKHMsIHNoZWxsKTsKLQotCS8qIHJlc3RvcmUgU0lHUElQRSBmb3IgY2hpbGQgKi8KLQlzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7Ci0KLQlpZiAocy0+aXNfc3Vic3lzdGVtID09IFNVQlNZU1RFTV9JTlRfU0ZUUF9FUlJPUikgewotCQlwcmludGYoIlRoaXMgc2VydmljZSBhbGxvd3Mgc2Z0cCBjb25uZWN0aW9ucyBvbmx5LlxuIik7Ci0JCWZmbHVzaChOVUxMKTsKLQkJZXhpdCgxKTsKLQl9IGVsc2UgaWYgKHMtPmlzX3N1YnN5c3RlbSA9PSBTVUJTWVNURU1fSU5UX1NGVFApIHsKLQkJZXh0ZXJuIGludCBvcHRpbmQsIG9wdHJlc2V0OwotCQlpbnQgaTsKLQkJY2hhciAqcCwgKmFyZ3M7Ci0KLQkJc2V0cHJvY3RpdGxlKCIlc0AlcyIsIHMtPnB3LT5wd19uYW1lLCBJTlRFUk5BTF9TRlRQX05BTUUpOwotCQlhcmdzID0geHN0cmR1cChjb21tYW5kID8gY29tbWFuZCA6ICJzZnRwLXNlcnZlciIpOwotCQlmb3IgKGkgPSAwLCAocCA9IHN0cnRvayhhcmdzLCAiICIpKTsgcDsgKHAgPSBzdHJ0b2soTlVMTCwgIiAiKSkpCi0JCQlpZiAoaSA8IEFSR1ZfTUFYIC0gMSkKLQkJCQlhcmd2W2krK10gPSBwOwotCQlhcmd2W2ldID0gTlVMTDsKLQkJb3B0aW5kID0gb3B0cmVzZXQgPSAxOwotCQlfX3Byb2duYW1lID0gYXJndlswXTsKLSNpZmRlZiBXSVRIX1NFTElOVVgKLQkJc3NoX3NlbGludXhfY2hhbmdlX2NvbnRleHQoInNmdHBkX3QiKTsKLSNlbmRpZgotCQlleGl0KHNmdHBfc2VydmVyX21haW4oaSwgYXJndiwgcy0+cHcpKTsKLQl9Ci0KLQlmZmx1c2goTlVMTCk7Ci0KLQlpZiAob3B0aW9ucy51c2VfbG9naW4pIHsKLQkJbGF1bmNoX2xvZ2luKHB3LCBob3N0bmFtZSk7Ci0JCS8qIE5FVkVSUkVBQ0hFRCAqLwotCX0KLQotCS8qIEdldCB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhlIHNoZWxsIG5hbWUuICovCi0JaWYgKChzaGVsbDAgPSBzdHJyY2hyKHNoZWxsLCAnLycpKSAhPSBOVUxMKQotCQlzaGVsbDArKzsKLQllbHNlCi0JCXNoZWxsMCA9IHNoZWxsOwotCi0JLyoKLQkgKiBJZiB3ZSBoYXZlIG5vIGNvbW1hbmQsIGV4ZWN1dGUgdGhlIHNoZWxsLiAgSW4gdGhpcyBjYXNlLCB0aGUgc2hlbGwKLQkgKiBuYW1lIHRvIGJlIHBhc3NlZCBpbiBhcmd2WzBdIGlzIHByZWNlZGVkIGJ5ICctJyB0byBpbmRpY2F0ZSB0aGF0Ci0JICogdGhpcyBpcyBhIGxvZ2luIHNoZWxsLgotCSAqLwotCWlmICghY29tbWFuZCkgewotCQljaGFyIGFyZ3YwWzI1Nl07Ci0KLQkJLyogU3RhcnQgdGhlIHNoZWxsLiAgU2V0IGluaXRpYWwgY2hhcmFjdGVyIHRvICctJy4gKi8KLQkJYXJndjBbMF0gPSAnLSc7Ci0KLQkJaWYgKHN0cmxjcHkoYXJndjAgKyAxLCBzaGVsbDAsIHNpemVvZihhcmd2MCkgLSAxKQotCQkgICAgPj0gc2l6ZW9mKGFyZ3YwKSAtIDEpIHsKLQkJCWVycm5vID0gRUlOVkFMOwotCQkJcGVycm9yKHNoZWxsKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQotCQkvKiBFeGVjdXRlIHRoZSBzaGVsbC4gKi8KLQkJYXJndlswXSA9IGFyZ3YwOwotCQlhcmd2WzFdID0gTlVMTDsKLQkJZXhlY3ZlKHNoZWxsLCBhcmd2LCBlbnYpOwotCi0JCS8qIEV4ZWN1dGluZyB0aGUgc2hlbGwgZmFpbGVkLiAqLwotCQlwZXJyb3Ioc2hlbGwpOwotCQlleGl0KDEpOwotCX0KLQkvKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQgdXNpbmcgdGhlIHVzZXIncyBzaGVsbC4gIFRoaXMgdXNlcyB0aGUgLWMKLQkgKiBvcHRpb24gdG8gZXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlhcmd2WzBdID0gKGNoYXIgKikgc2hlbGwwOwotCWFyZ3ZbMV0gPSAiLWMiOwotCWFyZ3ZbMl0gPSAoY2hhciAqKSBjb21tYW5kOwotCWFyZ3ZbM10gPSBOVUxMOwotCWV4ZWN2ZShzaGVsbCwgYXJndiwgZW52KTsKLQlwZXJyb3Ioc2hlbGwpOwotCWV4aXQoMSk7Ci19Ci0KLXZvaWQKLXNlc3Npb25fdW51c2VkKGludCBpZCkKLXsKLQlkZWJ1ZzMoIiVzOiBzZXNzaW9uIGlkICVkIHVudXNlZCIsIF9fZnVuY19fLCBpZCk7Ci0JaWYgKGlkID49IG9wdGlvbnMubWF4X3Nlc3Npb25zIHx8Ci0JICAgIGlkID49IHNlc3Npb25zX25hbGxvYykgewotCQlmYXRhbCgiJXM6IGluc2FuZSBzZXNzaW9uIGlkICVkIChtYXggJWQgbmFsbG9jICVkKSIsCi0JCSAgICBfX2Z1bmNfXywgaWQsIG9wdGlvbnMubWF4X3Nlc3Npb25zLCBzZXNzaW9uc19uYWxsb2MpOwotCX0KLQliemVybygmc2Vzc2lvbnNbaWRdLCBzaXplb2YoKnNlc3Npb25zKSk7Ci0Jc2Vzc2lvbnNbaWRdLnNlbGYgPSBpZDsKLQlzZXNzaW9uc1tpZF0udXNlZCA9IDA7Ci0Jc2Vzc2lvbnNbaWRdLmNoYW5pZCA9IC0xOwotCXNlc3Npb25zW2lkXS5wdHlmZCA9IC0xOwotCXNlc3Npb25zW2lkXS50dHlmZCA9IC0xOwotCXNlc3Npb25zW2lkXS5wdHltYXN0ZXIgPSAtMTsKLQlzZXNzaW9uc1tpZF0ueDExX2NoYW5pZHMgPSBOVUxMOwotCXNlc3Npb25zW2lkXS5uZXh0X3VudXNlZCA9IHNlc3Npb25zX2ZpcnN0X3VudXNlZDsKLQlzZXNzaW9uc19maXJzdF91bnVzZWQgPSBpZDsKLX0KLQotU2Vzc2lvbiAqCi1zZXNzaW9uX25ldyh2b2lkKQotewotCVNlc3Npb24gKnMsICp0bXA7Ci0KLQlpZiAoc2Vzc2lvbnNfZmlyc3RfdW51c2VkID09IC0xKSB7Ci0JCWlmIChzZXNzaW9uc19uYWxsb2MgPj0gb3B0aW9ucy5tYXhfc2Vzc2lvbnMpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGVidWcyKCIlczogYWxsb2NhdGUgKGFsbG9jYXRlZCAlZCBtYXggJWQpIiwKLQkJICAgIF9fZnVuY19fLCBzZXNzaW9uc19uYWxsb2MsIG9wdGlvbnMubWF4X3Nlc3Npb25zKTsKLQkJdG1wID0geHJlYWxsb2Moc2Vzc2lvbnMsIHNlc3Npb25zX25hbGxvYyArIDEsCi0JCSAgICBzaXplb2YoKnNlc3Npb25zKSk7Ci0JCWlmICh0bXAgPT0gTlVMTCkgewotCQkJZXJyb3IoIiVzOiBjYW5ub3QgYWxsb2NhdGUgJWQgc2Vzc2lvbnMiLAotCQkJICAgIF9fZnVuY19fLCBzZXNzaW9uc19uYWxsb2MgKyAxKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXNlc3Npb25zID0gdG1wOwotCQlzZXNzaW9uX3VudXNlZChzZXNzaW9uc19uYWxsb2MrKyk7Ci0JfQotCi0JaWYgKHNlc3Npb25zX2ZpcnN0X3VudXNlZCA+PSBzZXNzaW9uc19uYWxsb2MgfHwKLQkgICAgc2Vzc2lvbnNfZmlyc3RfdW51c2VkIDwgMCkgewotCQlmYXRhbCgiJXM6IGluc2FuZSBmaXJzdF91bnVzZWQgJWQgbWF4ICVkIG5hbGxvYyAlZCIsCi0JCSAgICBfX2Z1bmNfXywgc2Vzc2lvbnNfZmlyc3RfdW51c2VkLCBvcHRpb25zLm1heF9zZXNzaW9ucywKLQkJICAgIHNlc3Npb25zX25hbGxvYyk7Ci0JfQotCi0JcyA9ICZzZXNzaW9uc1tzZXNzaW9uc19maXJzdF91bnVzZWRdOwotCWlmIChzLT51c2VkKSB7Ci0JCWZhdGFsKCIlczogc2Vzc2lvbiAlZCBhbHJlYWR5IHVzZWQiLAotCQkgICAgX19mdW5jX18sIHNlc3Npb25zX2ZpcnN0X3VudXNlZCk7Ci0JfQotCXNlc3Npb25zX2ZpcnN0X3VudXNlZCA9IHMtPm5leHRfdW51c2VkOwotCXMtPnVzZWQgPSAxOwotCXMtPm5leHRfdW51c2VkID0gLTE7Ci0JZGVidWcoInNlc3Npb25fbmV3OiBzZXNzaW9uICVkIiwgcy0+c2VsZik7Ci0KLQlyZXR1cm4gczsKLX0KLQotc3RhdGljIHZvaWQKLXNlc3Npb25fZHVtcCh2b2lkKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBzZXNzaW9uc19uYWxsb2M7IGkrKykgewotCQlTZXNzaW9uICpzID0gJnNlc3Npb25zW2ldOwotCi0JCWRlYnVnKCJkdW1wOiB1c2VkICVkIG5leHRfdW51c2VkICVkIHNlc3Npb24gJWQgJXAgIgotCQkgICAgImNoYW5uZWwgJWQgcGlkICVsZCIsCi0JCSAgICBzLT51c2VkLAotCQkgICAgcy0+bmV4dF91bnVzZWQsCi0JCSAgICBzLT5zZWxmLAotCQkgICAgcywKLQkJICAgIHMtPmNoYW5pZCwKLQkJICAgIChsb25nKXMtPnBpZCk7Ci0JfQotfQotCi1pbnQKLXNlc3Npb25fb3BlbihBdXRoY3R4dCAqYXV0aGN0eHQsIGludCBjaGFuaWQpCi17Ci0JU2Vzc2lvbiAqcyA9IHNlc3Npb25fbmV3KCk7Ci0JZGVidWcoInNlc3Npb25fb3BlbjogY2hhbm5lbCAlZCIsIGNoYW5pZCk7Ci0JaWYgKHMgPT0gTlVMTCkgewotCQllcnJvcigibm8gbW9yZSBzZXNzaW9ucyIpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jcy0+YXV0aGN0eHQgPSBhdXRoY3R4dDsKLQlzLT5wdyA9IGF1dGhjdHh0LT5wdzsKLQlpZiAocy0+cHcgPT0gTlVMTCB8fCAhYXV0aGN0eHQtPnZhbGlkKQotCQlmYXRhbCgibm8gdXNlciBmb3Igc2Vzc2lvbiAlZCIsIHMtPnNlbGYpOwotCWRlYnVnKCJzZXNzaW9uX29wZW46IHNlc3Npb24gJWQ6IGxpbmsgd2l0aCBjaGFubmVsICVkIiwgcy0+c2VsZiwgY2hhbmlkKTsKLQlzLT5jaGFuaWQgPSBjaGFuaWQ7Ci0JcmV0dXJuIDE7Ci19Ci0KLVNlc3Npb24gKgotc2Vzc2lvbl9ieV90dHkoY2hhciAqdHR5KQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBzZXNzaW9uc19uYWxsb2M7IGkrKykgewotCQlTZXNzaW9uICpzID0gJnNlc3Npb25zW2ldOwotCQlpZiAocy0+dXNlZCAmJiBzLT50dHlmZCAhPSAtMSAmJiBzdHJjbXAocy0+dHR5LCB0dHkpID09IDApIHsKLQkJCWRlYnVnKCJzZXNzaW9uX2J5X3R0eTogc2Vzc2lvbiAlZCB0dHkgJXMiLCBpLCB0dHkpOwotCQkJcmV0dXJuIHM7Ci0JCX0KLQl9Ci0JZGVidWcoInNlc3Npb25fYnlfdHR5OiB1bmtub3duIHR0eSAlLjEwMHMiLCB0dHkpOwotCXNlc3Npb25fZHVtcCgpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgU2Vzc2lvbiAqCi1zZXNzaW9uX2J5X2NoYW5uZWwoaW50IGlkKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBzZXNzaW9uc19uYWxsb2M7IGkrKykgewotCQlTZXNzaW9uICpzID0gJnNlc3Npb25zW2ldOwotCQlpZiAocy0+dXNlZCAmJiBzLT5jaGFuaWQgPT0gaWQpIHsKLQkJCWRlYnVnKCJzZXNzaW9uX2J5X2NoYW5uZWw6IHNlc3Npb24gJWQgY2hhbm5lbCAlZCIsCi0JCQkgICAgaSwgaWQpOwotCQkJcmV0dXJuIHM7Ci0JCX0KLQl9Ci0JZGVidWcoInNlc3Npb25fYnlfY2hhbm5lbDogdW5rbm93biBjaGFubmVsICVkIiwgaWQpOwotCXNlc3Npb25fZHVtcCgpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgU2Vzc2lvbiAqCi1zZXNzaW9uX2J5X3gxMV9jaGFubmVsKGludCBpZCkKLXsKLQlpbnQgaSwgajsKLQotCWZvciAoaSA9IDA7IGkgPCBzZXNzaW9uc19uYWxsb2M7IGkrKykgewotCQlTZXNzaW9uICpzID0gJnNlc3Npb25zW2ldOwotCi0JCWlmIChzLT54MTFfY2hhbmlkcyA9PSBOVUxMIHx8ICFzLT51c2VkKQotCQkJY29udGludWU7Ci0JCWZvciAoaiA9IDA7IHMtPngxMV9jaGFuaWRzW2pdICE9IC0xOyBqKyspIHsKLQkJCWlmIChzLT54MTFfY2hhbmlkc1tqXSA9PSBpZCkgewotCQkJCWRlYnVnKCJzZXNzaW9uX2J5X3gxMV9jaGFubmVsOiBzZXNzaW9uICVkICIKLQkJCQkgICAgImNoYW5uZWwgJWQiLCBzLT5zZWxmLCBpZCk7Ci0JCQkJcmV0dXJuIHM7Ci0JCQl9Ci0JCX0KLQl9Ci0JZGVidWcoInNlc3Npb25fYnlfeDExX2NoYW5uZWw6IHVua25vd24gY2hhbm5lbCAlZCIsIGlkKTsKLQlzZXNzaW9uX2R1bXAoKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIFNlc3Npb24gKgotc2Vzc2lvbl9ieV9waWQocGlkX3QgcGlkKQotewotCWludCBpOwotCWRlYnVnKCJzZXNzaW9uX2J5X3BpZDogcGlkICVsZCIsIChsb25nKXBpZCk7Ci0JZm9yIChpID0gMDsgaSA8IHNlc3Npb25zX25hbGxvYzsgaSsrKSB7Ci0JCVNlc3Npb24gKnMgPSAmc2Vzc2lvbnNbaV07Ci0JCWlmIChzLT51c2VkICYmIHMtPnBpZCA9PSBwaWQpCi0JCQlyZXR1cm4gczsKLQl9Ci0JZXJyb3IoInNlc3Npb25fYnlfcGlkOiB1bmtub3duIHBpZCAlbGQiLCAobG9uZylwaWQpOwotCXNlc3Npb25fZHVtcCgpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50Ci1zZXNzaW9uX3dpbmRvd19jaGFuZ2VfcmVxKFNlc3Npb24gKnMpCi17Ci0Jcy0+Y29sID0gcGFja2V0X2dldF9pbnQoKTsKLQlzLT5yb3cgPSBwYWNrZXRfZ2V0X2ludCgpOwotCXMtPnhwaXhlbCA9IHBhY2tldF9nZXRfaW50KCk7Ci0Jcy0+eXBpeGVsID0gcGFja2V0X2dldF9pbnQoKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0JcHR5X2NoYW5nZV93aW5kb3dfc2l6ZShzLT5wdHlmZCwgcy0+cm93LCBzLT5jb2wsIHMtPnhwaXhlbCwgcy0+eXBpeGVsKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotc2Vzc2lvbl9wdHlfcmVxKFNlc3Npb24gKnMpCi17Ci0JdV9pbnQgbGVuOwotCWludCBuX2J5dGVzOwotCi0JaWYgKG5vX3B0eV9mbGFnKSB7Ci0JCWRlYnVnKCJBbGxvY2F0aW5nIGEgcHR5IG5vdCBwZXJtaXR0ZWQgZm9yIHRoaXMgYXV0aGVudGljYXRpb24uIik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAocy0+dHR5ZmQgIT0gLTEpIHsKLQkJcGFja2V0X2Rpc2Nvbm5lY3QoIlByb3RvY29sIGVycm9yOiB5b3UgYWxyZWFkeSBoYXZlIGEgcHR5LiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzLT50ZXJtID0gcGFja2V0X2dldF9zdHJpbmcoJmxlbik7Ci0KLQlpZiAoY29tcGF0MjApIHsKLQkJcy0+Y29sID0gcGFja2V0X2dldF9pbnQoKTsKLQkJcy0+cm93ID0gcGFja2V0X2dldF9pbnQoKTsKLQl9IGVsc2UgewotCQlzLT5yb3cgPSBwYWNrZXRfZ2V0X2ludCgpOwotCQlzLT5jb2wgPSBwYWNrZXRfZ2V0X2ludCgpOwotCX0KLQlzLT54cGl4ZWwgPSBwYWNrZXRfZ2V0X2ludCgpOwotCXMtPnlwaXhlbCA9IHBhY2tldF9nZXRfaW50KCk7Ci0KLQlpZiAoc3RyY21wKHMtPnRlcm0sICIiKSA9PSAwKSB7Ci0JCXhmcmVlKHMtPnRlcm0pOwotCQlzLT50ZXJtID0gTlVMTDsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBhIHB0eSBhbmQgb3BlbiBpdC4gKi8KLQlkZWJ1ZygiQWxsb2NhdGluZyBwdHkuIik7Ci0JaWYgKCFQUklWU0VQKHB0eV9hbGxvY2F0ZSgmcy0+cHR5ZmQsICZzLT50dHlmZCwgcy0+dHR5LAotCSAgICBzaXplb2Yocy0+dHR5KSkpKSB7Ci0JCWlmIChzLT50ZXJtKQotCQkJeGZyZWUocy0+dGVybSk7Ci0JCXMtPnRlcm0gPSBOVUxMOwotCQlzLT5wdHlmZCA9IC0xOwotCQlzLT50dHlmZCA9IC0xOwotCQllcnJvcigic2Vzc2lvbl9wdHlfcmVxOiBzZXNzaW9uICVkIGFsbG9jIGZhaWxlZCIsIHMtPnNlbGYpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZGVidWcoInNlc3Npb25fcHR5X3JlcTogc2Vzc2lvbiAlZCBhbGxvYyAlcyIsIHMtPnNlbGYsIHMtPnR0eSk7Ci0KLQkvKiBmb3IgU1NIMSB0aGUgdHR5IG1vZGVzIGxlbmd0aCBpcyBub3QgZ2l2ZW4gKi8KLQlpZiAoIWNvbXBhdDIwKQotCQluX2J5dGVzID0gcGFja2V0X3JlbWFpbmluZygpOwotCXR0eV9wYXJzZV9tb2RlcyhzLT50dHlmZCwgJm5fYnl0ZXMpOwotCi0JaWYgKCF1c2VfcHJpdnNlcCkKLQkJcHR5X3NldG93bmVyKHMtPnB3LCBzLT50dHkpOwotCi0JLyogU2V0IHdpbmRvdyBzaXplIGZyb20gdGhlIHBhY2tldC4gKi8KLQlwdHlfY2hhbmdlX3dpbmRvd19zaXplKHMtPnB0eWZkLCBzLT5yb3csIHMtPmNvbCwgcy0+eHBpeGVsLCBzLT55cGl4ZWwpOwotCi0JcGFja2V0X2NoZWNrX2VvbSgpOwotCXNlc3Npb25fcHJvY3RpdGxlKHMpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1zZXNzaW9uX3N1YnN5c3RlbV9yZXEoU2Vzc2lvbiAqcykKLXsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQl1X2ludCBsZW47Ci0JaW50IHN1Y2Nlc3MgPSAwOwotCWNoYXIgKnByb2csICpjbWQsICpzdWJzeXMgPSBwYWNrZXRfZ2V0X3N0cmluZygmbGVuKTsKLQl1X2ludCBpOwotCi0JcGFja2V0X2NoZWNrX2VvbSgpOwotCWxvZ2l0KCJzdWJzeXN0ZW0gcmVxdWVzdCBmb3IgJS4xMDBzIGJ5IHVzZXIgJXMiLCBzdWJzeXMsCi0JICAgIHMtPnB3LT5wd19uYW1lKTsKLQotCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9zdWJzeXN0ZW1zOyBpKyspIHsKLQkJaWYgKHN0cmNtcChzdWJzeXMsIG9wdGlvbnMuc3Vic3lzdGVtX25hbWVbaV0pID09IDApIHsKLQkJCXByb2cgPSBvcHRpb25zLnN1YnN5c3RlbV9jb21tYW5kW2ldOwotCQkJY21kID0gb3B0aW9ucy5zdWJzeXN0ZW1fYXJnc1tpXTsKLQkJCWlmIChzdHJjbXAoSU5URVJOQUxfU0ZUUF9OQU1FLCBwcm9nKSA9PSAwKSB7Ci0JCQkJcy0+aXNfc3Vic3lzdGVtID0gU1VCU1lTVEVNX0lOVF9TRlRQOwotCQkJCWRlYnVnKCJzdWJzeXN0ZW06ICVzIiwgcHJvZyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChzdGF0KHByb2csICZzdCkgPCAwKQotCQkJCQlkZWJ1Zygic3Vic3lzdGVtOiBjYW5ub3Qgc3RhdCAlczogJXMiLAotCQkJCQkgICAgcHJvZywgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQlzLT5pc19zdWJzeXN0ZW0gPSBTVUJTWVNURU1fRVhUOwotCQkJCWRlYnVnKCJzdWJzeXN0ZW06IGV4ZWMoKSAlcyIsIGNtZCk7Ci0JCQl9Ci0JCQlzdWNjZXNzID0gZG9fZXhlYyhzLCBjbWQpID09IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmICghc3VjY2VzcykKLQkJbG9naXQoInN1YnN5c3RlbSByZXF1ZXN0IGZvciAlLjEwMHMgZmFpbGVkLCBzdWJzeXN0ZW0gbm90IGZvdW5kIiwKLQkJICAgIHN1YnN5cyk7Ci0KLQl4ZnJlZShzdWJzeXMpOwotCXJldHVybiBzdWNjZXNzOwotfQotCi1zdGF0aWMgaW50Ci1zZXNzaW9uX3gxMV9yZXEoU2Vzc2lvbiAqcykKLXsKLQlpbnQgc3VjY2VzczsKLQotCWlmIChzLT5hdXRoX3Byb3RvICE9IE5VTEwgfHwgcy0+YXV0aF9kYXRhICE9IE5VTEwpIHsKLQkJZXJyb3IoInNlc3Npb25feDExX3JlcTogc2Vzc2lvbiAlZDogIgotCQkgICAgIngxMSBmb3J3YXJkaW5nIGFscmVhZHkgYWN0aXZlIiwgcy0+c2VsZik7Ci0JCXJldHVybiAwOwotCX0KLQlzLT5zaW5nbGVfY29ubmVjdGlvbiA9IHBhY2tldF9nZXRfY2hhcigpOwotCXMtPmF1dGhfcHJvdG8gPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQlzLT5hdXRoX2RhdGEgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQlzLT5zY3JlZW4gPSBwYWNrZXRfZ2V0X2ludCgpOwotCXBhY2tldF9jaGVja19lb20oKTsKLQotCXN1Y2Nlc3MgPSBzZXNzaW9uX3NldHVwX3gxMWZ3ZChzKTsKLQlpZiAoIXN1Y2Nlc3MpIHsKLQkJeGZyZWUocy0+YXV0aF9wcm90byk7Ci0JCXhmcmVlKHMtPmF1dGhfZGF0YSk7Ci0JCXMtPmF1dGhfcHJvdG8gPSBOVUxMOwotCQlzLT5hdXRoX2RhdGEgPSBOVUxMOwotCX0KLQlyZXR1cm4gc3VjY2VzczsKLX0KLQotc3RhdGljIGludAotc2Vzc2lvbl9zaGVsbF9yZXEoU2Vzc2lvbiAqcykKLXsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0JcmV0dXJuIGRvX2V4ZWMocywgTlVMTCkgPT0gMDsKLX0KLQotc3RhdGljIGludAotc2Vzc2lvbl9leGVjX3JlcShTZXNzaW9uICpzKQotewotCXVfaW50IGxlbiwgc3VjY2VzczsKLQotCWNoYXIgKmNvbW1hbmQgPSBwYWNrZXRfZ2V0X3N0cmluZygmbGVuKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0Jc3VjY2VzcyA9IGRvX2V4ZWMocywgY29tbWFuZCkgPT0gMDsKLQl4ZnJlZShjb21tYW5kKTsKLQlyZXR1cm4gc3VjY2VzczsKLX0KLQotc3RhdGljIGludAotc2Vzc2lvbl9icmVha19yZXEoU2Vzc2lvbiAqcykKLXsKLQotCXBhY2tldF9nZXRfaW50KCk7CS8qIGlnbm9yZWQgKi8KLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlpZiAocy0+dHR5ZmQgPT0gLTEgfHwgdGNzZW5kYnJlYWsocy0+dHR5ZmQsIDApIDwgMCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXNlc3Npb25fZW52X3JlcShTZXNzaW9uICpzKQotewotCWNoYXIgKm5hbWUsICp2YWw7Ci0JdV9pbnQgbmFtZV9sZW4sIHZhbF9sZW4sIGk7Ci0KLQluYW1lID0gcGFja2V0X2dldF9zdHJpbmcoJm5hbWVfbGVuKTsKLQl2YWwgPSBwYWNrZXRfZ2V0X3N0cmluZygmdmFsX2xlbik7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JLyogRG9uJ3Qgc2V0IHRvbyBtYW55IGVudmlyb25tZW50IHZhcmlhYmxlcyAqLwotCWlmIChzLT5udW1fZW52ID4gMTI4KSB7Ci0JCWRlYnVnMigiSWdub3JpbmcgZW52IHJlcXVlc3QgJXM6IHRvbyBtYW55IGVudiB2YXJzIiwgbmFtZSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1fYWNjZXB0X2VudjsgaSsrKSB7Ci0JCWlmIChtYXRjaF9wYXR0ZXJuKG5hbWUsIG9wdGlvbnMuYWNjZXB0X2VudltpXSkpIHsKLQkJCWRlYnVnMigiU2V0dGluZyBlbnYgJWQ6ICVzPSVzIiwgcy0+bnVtX2VudiwgbmFtZSwgdmFsKTsKLQkJCXMtPmVudiA9IHhyZWFsbG9jKHMtPmVudiwgcy0+bnVtX2VudiArIDEsCi0JCQkgICAgc2l6ZW9mKCpzLT5lbnYpKTsKLQkJCXMtPmVudltzLT5udW1fZW52XS5uYW1lID0gbmFtZTsKLQkJCXMtPmVudltzLT5udW1fZW52XS52YWwgPSB2YWw7Ci0JCQlzLT5udW1fZW52Kys7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JfQotCWRlYnVnMigiSWdub3JpbmcgZW52IHJlcXVlc3QgJXM6IGRpc2FsbG93ZWQgbmFtZSIsIG5hbWUpOwotCi0gZmFpbDoKLQl4ZnJlZShuYW1lKTsKLQl4ZnJlZSh2YWwpOwotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNlc3Npb25fYXV0aF9hZ2VudF9yZXEoU2Vzc2lvbiAqcykKLXsKLQlzdGF0aWMgaW50IGNhbGxlZCA9IDA7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCWlmIChub19hZ2VudF9mb3J3YXJkaW5nX2ZsYWcgfHwgIW9wdGlvbnMuYWxsb3dfYWdlbnRfZm9yd2FyZGluZykgewotCQlkZWJ1Zygic2Vzc2lvbl9hdXRoX2FnZW50X3JlcTogbm9fYWdlbnRfZm9yd2FyZGluZ19mbGFnIik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoY2FsbGVkKSB7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCWNhbGxlZCA9IDE7Ci0JCXJldHVybiBhdXRoX2lucHV0X3JlcXVlc3RfZm9yd2FyZGluZyhzLT5wdyk7Ci0JfQotfQotCi1pbnQKLXNlc3Npb25faW5wdXRfY2hhbm5lbF9yZXEoQ2hhbm5lbCAqYywgY29uc3QgY2hhciAqcnR5cGUpCi17Ci0JaW50IHN1Y2Nlc3MgPSAwOwotCVNlc3Npb24gKnM7Ci0KLQlpZiAoKHMgPSBzZXNzaW9uX2J5X2NoYW5uZWwoYy0+c2VsZikpID09IE5VTEwpIHsKLQkJbG9naXQoInNlc3Npb25faW5wdXRfY2hhbm5lbF9yZXE6IG5vIHNlc3Npb24gJWQgcmVxICUuMTAwcyIsCi0JCSAgICBjLT5zZWxmLCBydHlwZSk7Ci0JCXJldHVybiAwOwotCX0KLQlkZWJ1Zygic2Vzc2lvbl9pbnB1dF9jaGFubmVsX3JlcTogc2Vzc2lvbiAlZCByZXEgJXMiLCBzLT5zZWxmLCBydHlwZSk7Ci0KLQkvKgotCSAqIGEgc2Vzc2lvbiBpcyBpbiBMQVJWQUwgc3RhdGUgdW50aWwgYSBzaGVsbCwgYSBjb21tYW5kCi0JICogb3IgYSBzdWJzeXN0ZW0gaXMgZXhlY3V0ZWQKLQkgKi8KLQlpZiAoYy0+dHlwZSA9PSBTU0hfQ0hBTk5FTF9MQVJWQUwpIHsKLQkJaWYgKHN0cmNtcChydHlwZSwgInNoZWxsIikgPT0gMCkgewotCQkJc3VjY2VzcyA9IHNlc3Npb25fc2hlbGxfcmVxKHMpOwotCQl9IGVsc2UgaWYgKHN0cmNtcChydHlwZSwgImV4ZWMiKSA9PSAwKSB7Ci0JCQlzdWNjZXNzID0gc2Vzc2lvbl9leGVjX3JlcShzKTsKLQkJfSBlbHNlIGlmIChzdHJjbXAocnR5cGUsICJwdHktcmVxIikgPT0gMCkgewotCQkJc3VjY2VzcyA9IHNlc3Npb25fcHR5X3JlcShzKTsKLQkJfSBlbHNlIGlmIChzdHJjbXAocnR5cGUsICJ4MTEtcmVxIikgPT0gMCkgewotCQkJc3VjY2VzcyA9IHNlc3Npb25feDExX3JlcShzKTsKLQkJfSBlbHNlIGlmIChzdHJjbXAocnR5cGUsICJhdXRoLWFnZW50LXJlcUBvcGVuc3NoLmNvbSIpID09IDApIHsKLQkJCXN1Y2Nlc3MgPSBzZXNzaW9uX2F1dGhfYWdlbnRfcmVxKHMpOwotCQl9IGVsc2UgaWYgKHN0cmNtcChydHlwZSwgInN1YnN5c3RlbSIpID09IDApIHsKLQkJCXN1Y2Nlc3MgPSBzZXNzaW9uX3N1YnN5c3RlbV9yZXEocyk7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHJ0eXBlLCAiZW52IikgPT0gMCkgewotCQkJc3VjY2VzcyA9IHNlc3Npb25fZW52X3JlcShzKTsKLQkJfQotCX0KLQlpZiAoc3RyY21wKHJ0eXBlLCAid2luZG93LWNoYW5nZSIpID09IDApIHsKLQkJc3VjY2VzcyA9IHNlc3Npb25fd2luZG93X2NoYW5nZV9yZXEocyk7Ci0JfSBlbHNlIGlmIChzdHJjbXAocnR5cGUsICJicmVhayIpID09IDApIHsKLQkJc3VjY2VzcyA9IHNlc3Npb25fYnJlYWtfcmVxKHMpOwotCX0KLQotCXJldHVybiBzdWNjZXNzOwotfQotCi12b2lkCi1zZXNzaW9uX3NldF9mZHMoU2Vzc2lvbiAqcywgaW50IGZkaW4sIGludCBmZG91dCwgaW50IGZkZXJyLCBpbnQgaWdub3JlX2ZkZXJyLAotICAgIGludCBpc190dHkpCi17Ci0JaWYgKCFjb21wYXQyMCkKLQkJZmF0YWwoInNlc3Npb25fc2V0X2ZkczogY2FsbGVkIGZvciBwcm90byAhPSAyLjAiKTsKLQkvKgotCSAqIG5vdyB0aGF0IGhhdmUgYSBjaGlsZCBhbmQgYSBwaXBlIHRvIHRoZSBjaGlsZCwKLQkgKiB3ZSBjYW4gYWN0aXZhdGUgb3VyIGNoYW5uZWwgYW5kIHJlZ2lzdGVyIHRoZSBmZCdzCi0JICovCi0JaWYgKHMtPmNoYW5pZCA9PSAtMSkKLQkJZmF0YWwoIm5vIGNoYW5uZWwgZm9yIHNlc3Npb24gJWQiLCBzLT5zZWxmKTsKLQljaGFubmVsX3NldF9mZHMocy0+Y2hhbmlkLAotCSAgICBmZG91dCwgZmRpbiwgZmRlcnIsCi0JICAgIGlnbm9yZV9mZGVyciA/IENIQU5fRVhURU5ERURfSUdOT1JFIDogQ0hBTl9FWFRFTkRFRF9SRUFELAotCSAgICAxLCBpc190dHksIENIQU5fU0VTX1dJTkRPV19ERUZBVUxUKTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uIHRvIHBlcmZvcm0gcHR5IGNsZWFudXAuIEFsc28gY2FsbGVkIGlmIHdlIGdldCBhYm9ydGVkIGFibm9ybWFsbHkKLSAqIChlLmcuLCBkdWUgdG8gYSBkcm9wcGVkIGNvbm5lY3Rpb24pLgotICovCi12b2lkCi1zZXNzaW9uX3B0eV9jbGVhbnVwMihTZXNzaW9uICpzKQotewotCWlmIChzID09IE5VTEwpIHsKLQkJZXJyb3IoInNlc3Npb25fcHR5X2NsZWFudXA6IG5vIHNlc3Npb24iKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAocy0+dHR5ZmQgPT0gLTEpCi0JCXJldHVybjsKLQotCWRlYnVnKCJzZXNzaW9uX3B0eV9jbGVhbnVwOiBzZXNzaW9uICVkIHJlbGVhc2UgJXMiLCBzLT5zZWxmLCBzLT50dHkpOwotCi0JLyogUmVjb3JkIHRoYXQgdGhlIHVzZXIgaGFzIGxvZ2dlZCBvdXQuICovCi0JaWYgKHMtPnBpZCAhPSAwKQotCQlyZWNvcmRfbG9nb3V0KHMtPnBpZCwgcy0+dHR5LCBzLT5wdy0+cHdfbmFtZSk7Ci0KLQkvKiBSZWxlYXNlIHRoZSBwc2V1ZG8tdHR5LiAqLwotCWlmIChnZXR1aWQoKSA9PSAwKQotCQlwdHlfcmVsZWFzZShzLT50dHkpOwotCi0JLyoKLQkgKiBDbG9zZSB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIHNvY2tldCBwYWlycy4gIFdlIG11c3QgZG8gdGhpcyBhZnRlcgotCSAqIHRoZSBwdHkgY2xlYW51cCwgc28gdGhhdCBhbm90aGVyIHByb2Nlc3MgZG9lc24ndCBnZXQgdGhpcyBwdHkKLQkgKiB3aGlsZSB3ZSdyZSBzdGlsbCBjbGVhbmluZyB1cC4KLQkgKi8KLQlpZiAocy0+cHR5bWFzdGVyICE9IC0xICYmIGNsb3NlKHMtPnB0eW1hc3RlcikgPCAwKQotCQllcnJvcigiY2xvc2Uocy0+cHR5bWFzdGVyLyVkKTogJXMiLAotCQkgICAgcy0+cHR5bWFzdGVyLCBzdHJlcnJvcihlcnJubykpOwotCi0JLyogdW5saW5rIHB0eSBmcm9tIHNlc3Npb24gKi8KLQlzLT50dHlmZCA9IC0xOwotfQotCi12b2lkCi1zZXNzaW9uX3B0eV9jbGVhbnVwKFNlc3Npb24gKnMpCi17Ci0JUFJJVlNFUChzZXNzaW9uX3B0eV9jbGVhbnVwMihzKSk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXNpZzJuYW1lKGludCBzaWcpCi17Ci0jZGVmaW5lIFNTSF9TSUcoeCkgaWYgKHNpZyA9PSBTSUcgIyMgeCkgcmV0dXJuICN4Ci0JU1NIX1NJRyhBQlJUKTsKLQlTU0hfU0lHKEFMUk0pOwotCVNTSF9TSUcoRlBFKTsKLQlTU0hfU0lHKEhVUCk7Ci0JU1NIX1NJRyhJTEwpOwotCVNTSF9TSUcoSU5UKTsKLQlTU0hfU0lHKEtJTEwpOwotCVNTSF9TSUcoUElQRSk7Ci0JU1NIX1NJRyhRVUlUKTsKLQlTU0hfU0lHKFNFR1YpOwotCVNTSF9TSUcoVEVSTSk7Ci0JU1NIX1NJRyhVU1IxKTsKLQlTU0hfU0lHKFVTUjIpOwotI3VuZGVmCVNTSF9TSUcKLQlyZXR1cm4gIlNJR0BvcGVuc3NoLmNvbSI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXNzaW9uX2Nsb3NlX3gxMShpbnQgaWQpCi17Ci0JQ2hhbm5lbCAqYzsKLQotCWlmICgoYyA9IGNoYW5uZWxfYnlfaWQoaWQpKSA9PSBOVUxMKSB7Ci0JCWRlYnVnKCJzZXNzaW9uX2Nsb3NlX3gxMTogeDExIGNoYW5uZWwgJWQgbWlzc2luZyIsIGlkKTsKLQl9IGVsc2UgewotCQkvKiBEZXRhY2ggWDExIGxpc3RlbmVyICovCi0JCWRlYnVnKCJzZXNzaW9uX2Nsb3NlX3gxMTogZGV0YWNoIHgxMSBjaGFubmVsICVkIiwgaWQpOwotCQljaGFubmVsX2NhbmNlbF9jbGVhbnVwKGlkKTsKLQkJaWYgKGMtPm9zdGF0ZSAhPSBDSEFOX09VVFBVVF9DTE9TRUQpCi0JCQljaGFuX21hcmtfZGVhZChjKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXNzaW9uX2Nsb3NlX3NpbmdsZV94MTEoaW50IGlkLCB2b2lkICphcmcpCi17Ci0JU2Vzc2lvbiAqczsKLQl1X2ludCBpOwotCi0JZGVidWczKCJzZXNzaW9uX2Nsb3NlX3NpbmdsZV94MTE6IGNoYW5uZWwgJWQiLCBpZCk7Ci0JY2hhbm5lbF9jYW5jZWxfY2xlYW51cChpZCk7Ci0JaWYgKChzID0gc2Vzc2lvbl9ieV94MTFfY2hhbm5lbChpZCkpID09IE5VTEwpCi0JCWZhdGFsKCJzZXNzaW9uX2Nsb3NlX3NpbmdsZV94MTE6IG5vIHgxMSBjaGFubmVsICVkIiwgaWQpOwotCWZvciAoaSA9IDA7IHMtPngxMV9jaGFuaWRzW2ldICE9IC0xOyBpKyspIHsKLQkJZGVidWcoInNlc3Npb25fY2xvc2Vfc2luZ2xlX3gxMTogc2Vzc2lvbiAlZDogIgotCQkgICAgImNsb3NpbmcgY2hhbm5lbCAlZCIsIHMtPnNlbGYsIHMtPngxMV9jaGFuaWRzW2ldKTsKLQkJLyoKLQkJICogVGhlIGNoYW5uZWwgImlkIiBpcyBhbHJlYWR5IGNsb3NpbmcsIGJ1dCBtYWtlIHN1cmUgd2UKLQkJICogY2xvc2UgYWxsIG9mIGl0cyBzaWJsaW5ncy4KLQkJICovCi0JCWlmIChzLT54MTFfY2hhbmlkc1tpXSAhPSBpZCkKLQkJCXNlc3Npb25fY2xvc2VfeDExKHMtPngxMV9jaGFuaWRzW2ldKTsKLQl9Ci0JeGZyZWUocy0+eDExX2NoYW5pZHMpOwotCXMtPngxMV9jaGFuaWRzID0gTlVMTDsKLQlpZiAocy0+ZGlzcGxheSkgewotCQl4ZnJlZShzLT5kaXNwbGF5KTsKLQkJcy0+ZGlzcGxheSA9IE5VTEw7Ci0JfQotCWlmIChzLT5hdXRoX3Byb3RvKSB7Ci0JCXhmcmVlKHMtPmF1dGhfcHJvdG8pOwotCQlzLT5hdXRoX3Byb3RvID0gTlVMTDsKLQl9Ci0JaWYgKHMtPmF1dGhfZGF0YSkgewotCQl4ZnJlZShzLT5hdXRoX2RhdGEpOwotCQlzLT5hdXRoX2RhdGEgPSBOVUxMOwotCX0KLQlpZiAocy0+YXV0aF9kaXNwbGF5KSB7Ci0JCXhmcmVlKHMtPmF1dGhfZGlzcGxheSk7Ci0JCXMtPmF1dGhfZGlzcGxheSA9IE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotc2Vzc2lvbl9leGl0X21lc3NhZ2UoU2Vzc2lvbiAqcywgaW50IHN0YXR1cykKLXsKLQlDaGFubmVsICpjOwotCi0JaWYgKChjID0gY2hhbm5lbF9sb29rdXAocy0+Y2hhbmlkKSkgPT0gTlVMTCkKLQkJZmF0YWwoInNlc3Npb25fZXhpdF9tZXNzYWdlOiBzZXNzaW9uICVkOiBubyBjaGFubmVsICVkIiwKLQkJICAgIHMtPnNlbGYsIHMtPmNoYW5pZCk7Ci0JZGVidWcoInNlc3Npb25fZXhpdF9tZXNzYWdlOiBzZXNzaW9uICVkIGNoYW5uZWwgJWQgcGlkICVsZCIsCi0JICAgIHMtPnNlbGYsIHMtPmNoYW5pZCwgKGxvbmcpcy0+cGlkKTsKLQotCWlmIChXSUZFWElURUQoc3RhdHVzKSkgewotCQljaGFubmVsX3JlcXVlc3Rfc3RhcnQocy0+Y2hhbmlkLCAiZXhpdC1zdGF0dXMiLCAwKTsKLQkJcGFja2V0X3B1dF9pbnQoV0VYSVRTVEFUVVMoc3RhdHVzKSk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JfSBlbHNlIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7Ci0JCWNoYW5uZWxfcmVxdWVzdF9zdGFydChzLT5jaGFuaWQsICJleGl0LXNpZ25hbCIsIDApOwotCQlwYWNrZXRfcHV0X2NzdHJpbmcoc2lnMm5hbWUoV1RFUk1TSUcoc3RhdHVzKSkpOwotI2lmZGVmIFdDT1JFRFVNUAotCQlwYWNrZXRfcHV0X2NoYXIoV0NPUkVEVU1QKHN0YXR1cyk/IDEgOiAwKTsKLSNlbHNlIC8qIFdDT1JFRFVNUCAqLwotCQlwYWNrZXRfcHV0X2NoYXIoMCk7Ci0jZW5kaWYgLyogV0NPUkVEVU1QICovCi0JCXBhY2tldF9wdXRfY3N0cmluZygiIik7Ci0JCXBhY2tldF9wdXRfY3N0cmluZygiIik7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JfSBlbHNlIHsKLQkJLyogU29tZSB3ZWlyZCBleGl0IGNhdXNlLiAgSnVzdCBleGl0LiAqLwotCQlwYWNrZXRfZGlzY29ubmVjdCgid2FpdCByZXR1cm5lZCBzdGF0dXMgJTA0eC4iLCBzdGF0dXMpOwotCX0KLQotCS8qIGRpc2Nvbm5lY3QgY2hhbm5lbCAqLwotCWRlYnVnKCJzZXNzaW9uX2V4aXRfbWVzc2FnZTogcmVsZWFzZSBjaGFubmVsICVkIiwgcy0+Y2hhbmlkKTsKLQotCS8qCi0JICogQWRqdXN0IGNsZWFudXAgY2FsbGJhY2sgYXR0YWNobWVudCB0byBzZW5kIGNsb3NlIG1lc3NhZ2VzIHdoZW4KLQkgKiB0aGUgY2hhbm5lbCBnZXRzIEVPRi4gVGhlIHNlc3Npb24gd2lsbCBiZSB0aGVuIGJlIGNsb3NlZAotCSAqIGJ5IHNlc3Npb25fY2xvc2VfYnlfY2hhbm5lbCB3aGVuIHRoZSBjaGlsZHMgY2xvc2UgdGhlaXIgZmRzLgotCSAqLwotCWNoYW5uZWxfcmVnaXN0ZXJfY2xlYW51cChjLT5zZWxmLCBzZXNzaW9uX2Nsb3NlX2J5X2NoYW5uZWwsIDEpOwotCi0JLyoKLQkgKiBlbXVsYXRlIGEgd3JpdGUgZmFpbHVyZSB3aXRoICdjaGFuX3dyaXRlX2ZhaWxlZCcsIG5vYm9keSB3aWxsIGJlCi0JICogaW50ZXJlc3RlZCBpbiBkYXRhIHdlIHdyaXRlLgotCSAqIE5vdGUgdGhhdCB3ZSBtdXN0IG5vdCBjYWxsICdjaGFuX3JlYWRfZmFpbGVkJywgc2luY2UgdGhlcmUgY291bGQKLQkgKiBiZSBzb21lIG1vcmUgZGF0YSB3YWl0aW5nIGluIHRoZSBwaXBlLgotCSAqLwotCWlmIChjLT5vc3RhdGUgIT0gQ0hBTl9PVVRQVVRfQ0xPU0VEKQotCQljaGFuX3dyaXRlX2ZhaWxlZChjKTsKLX0KLQotdm9pZAotc2Vzc2lvbl9jbG9zZShTZXNzaW9uICpzKQotewotCXVfaW50IGk7Ci0KLQlkZWJ1Zygic2Vzc2lvbl9jbG9zZTogc2Vzc2lvbiAlZCBwaWQgJWxkIiwgcy0+c2VsZiwgKGxvbmcpcy0+cGlkKTsKLQlpZiAocy0+dHR5ZmQgIT0gLTEpCi0JCXNlc3Npb25fcHR5X2NsZWFudXAocyk7Ci0JaWYgKHMtPnRlcm0pCi0JCXhmcmVlKHMtPnRlcm0pOwotCWlmIChzLT5kaXNwbGF5KQotCQl4ZnJlZShzLT5kaXNwbGF5KTsKLQlpZiAocy0+eDExX2NoYW5pZHMpCi0JCXhmcmVlKHMtPngxMV9jaGFuaWRzKTsKLQlpZiAocy0+YXV0aF9kaXNwbGF5KQotCQl4ZnJlZShzLT5hdXRoX2Rpc3BsYXkpOwotCWlmIChzLT5hdXRoX2RhdGEpCi0JCXhmcmVlKHMtPmF1dGhfZGF0YSk7Ci0JaWYgKHMtPmF1dGhfcHJvdG8pCi0JCXhmcmVlKHMtPmF1dGhfcHJvdG8pOwotCWlmIChzLT5lbnYgIT0gTlVMTCkgewotCQlmb3IgKGkgPSAwOyBpIDwgcy0+bnVtX2VudjsgaSsrKSB7Ci0JCQl4ZnJlZShzLT5lbnZbaV0ubmFtZSk7Ci0JCQl4ZnJlZShzLT5lbnZbaV0udmFsKTsKLQkJfQotCQl4ZnJlZShzLT5lbnYpOwotCX0KLQlzZXNzaW9uX3Byb2N0aXRsZShzKTsKLQlzZXNzaW9uX3VudXNlZChzLT5zZWxmKTsKLX0KLQotdm9pZAotc2Vzc2lvbl9jbG9zZV9ieV9waWQocGlkX3QgcGlkLCBpbnQgc3RhdHVzKQotewotCVNlc3Npb24gKnMgPSBzZXNzaW9uX2J5X3BpZChwaWQpOwotCWlmIChzID09IE5VTEwpIHsKLQkJZGVidWcoInNlc3Npb25fY2xvc2VfYnlfcGlkOiBubyBzZXNzaW9uIGZvciBwaWQgJWxkIiwKLQkJICAgIChsb25nKXBpZCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHMtPmNoYW5pZCAhPSAtMSkKLQkJc2Vzc2lvbl9leGl0X21lc3NhZ2Uocywgc3RhdHVzKTsKLQlpZiAocy0+dHR5ZmQgIT0gLTEpCi0JCXNlc3Npb25fcHR5X2NsZWFudXAocyk7Ci0Jcy0+cGlkID0gMDsKLX0KLQotLyoKLSAqIHRoaXMgaXMgY2FsbGVkIHdoZW4gYSBjaGFubmVsIGRpZXMgYmVmb3JlCi0gKiB0aGUgc2Vzc2lvbiAnY2hpbGQnIGl0c2VsZiBkaWVzCi0gKi8KLXZvaWQKLXNlc3Npb25fY2xvc2VfYnlfY2hhbm5lbChpbnQgaWQsIHZvaWQgKmFyZykKLXsKLQlTZXNzaW9uICpzID0gc2Vzc2lvbl9ieV9jaGFubmVsKGlkKTsKLQl1X2ludCBpOwotCi0JaWYgKHMgPT0gTlVMTCkgewotCQlkZWJ1Zygic2Vzc2lvbl9jbG9zZV9ieV9jaGFubmVsOiBubyBzZXNzaW9uIGZvciBpZCAlZCIsIGlkKTsKLQkJcmV0dXJuOwotCX0KLQlkZWJ1Zygic2Vzc2lvbl9jbG9zZV9ieV9jaGFubmVsOiBjaGFubmVsICVkIGNoaWxkICVsZCIsCi0JICAgIGlkLCAobG9uZylzLT5waWQpOwotCWlmIChzLT5waWQgIT0gMCkgewotCQlkZWJ1Zygic2Vzc2lvbl9jbG9zZV9ieV9jaGFubmVsOiBjaGFubmVsICVkOiBoYXMgY2hpbGQiLCBpZCk7Ci0JCS8qCi0JCSAqIGRlbGF5IGRldGFjaCBvZiBzZXNzaW9uLCBidXQgcmVsZWFzZSBwdHksIHNpbmNlCi0JCSAqIHRoZSBmZCdzIHRvIHRoZSBjaGlsZCBhcmUgYWxyZWFkeSBjbG9zZWQKLQkJICovCi0JCWlmIChzLT50dHlmZCAhPSAtMSkKLQkJCXNlc3Npb25fcHR5X2NsZWFudXAocyk7Ci0JCXJldHVybjsKLQl9Ci0JLyogZGV0YWNoIGJ5IHJlbW92aW5nIGNhbGxiYWNrICovCi0JY2hhbm5lbF9jYW5jZWxfY2xlYW51cChzLT5jaGFuaWQpOwotCi0JLyogQ2xvc2UgYW55IFgxMSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbiAqLwotCWlmIChzLT54MTFfY2hhbmlkcyAhPSBOVUxMKSB7Ci0JCWZvciAoaSA9IDA7IHMtPngxMV9jaGFuaWRzW2ldICE9IC0xOyBpKyspIHsKLQkJCXNlc3Npb25fY2xvc2VfeDExKHMtPngxMV9jaGFuaWRzW2ldKTsKLQkJCXMtPngxMV9jaGFuaWRzW2ldID0gLTE7Ci0JCX0KLQl9Ci0KLQlzLT5jaGFuaWQgPSAtMTsKLQlzZXNzaW9uX2Nsb3NlKHMpOwotfQotCi12b2lkCi1zZXNzaW9uX2Rlc3Ryb3lfYWxsKHZvaWQgKCpjbG9zZWZ1bmMpKFNlc3Npb24gKikpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IHNlc3Npb25zX25hbGxvYzsgaSsrKSB7Ci0JCVNlc3Npb24gKnMgPSAmc2Vzc2lvbnNbaV07Ci0JCWlmIChzLT51c2VkKSB7Ci0JCQlpZiAoY2xvc2VmdW5jICE9IE5VTEwpCi0JCQkJY2xvc2VmdW5jKHMpOwotCQkJZWxzZQotCQkJCXNlc3Npb25fY2xvc2Uocyk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXNlc3Npb25fdHR5X2xpc3Qodm9pZCkKLXsKLQlzdGF0aWMgY2hhciBidWZbMTAyNF07Ci0JaW50IGk7Ci0JY2hhciAqY3A7Ci0KLQlidWZbMF0gPSAnXDAnOwotCWZvciAoaSA9IDA7IGkgPCBzZXNzaW9uc19uYWxsb2M7IGkrKykgewotCQlTZXNzaW9uICpzID0gJnNlc3Npb25zW2ldOwotCQlpZiAocy0+dXNlZCAmJiBzLT50dHlmZCAhPSAtMSkgewotCi0JCQlpZiAoc3RybmNtcChzLT50dHksICIvZGV2LyIsIDUpICE9IDApIHsKLQkJCQljcCA9IHN0cnJjaHIocy0+dHR5LCAnLycpOwotCQkJCWNwID0gKGNwID09IE5VTEwpID8gcy0+dHR5IDogY3AgKyAxOwotCQkJfSBlbHNlCi0JCQkJY3AgPSBzLT50dHkgKyA1OwotCi0JCQlpZiAoYnVmWzBdICE9ICdcMCcpCi0JCQkJc3RybGNhdChidWYsICIsIiwgc2l6ZW9mIGJ1Zik7Ci0JCQlzdHJsY2F0KGJ1ZiwgY3AsIHNpemVvZiBidWYpOwotCQl9Ci0JfQotCWlmIChidWZbMF0gPT0gJ1wwJykKLQkJc3RybGNweShidWYsICJub3R0eSIsIHNpemVvZiBidWYpOwotCXJldHVybiBidWY7Ci19Ci0KLXZvaWQKLXNlc3Npb25fcHJvY3RpdGxlKFNlc3Npb24gKnMpCi17Ci0JaWYgKHMtPnB3ID09IE5VTEwpCi0JCWVycm9yKCJubyB1c2VyIGZvciBzZXNzaW9uICVkIiwgcy0+c2VsZik7Ci0JZWxzZQotCQlzZXRwcm9jdGl0bGUoIiVzQCVzIiwgcy0+cHctPnB3X25hbWUsIHNlc3Npb25fdHR5X2xpc3QoKSk7Ci19Ci0KLWludAotc2Vzc2lvbl9zZXR1cF94MTFmd2QoU2Vzc2lvbiAqcykKLXsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQljaGFyIGRpc3BsYXlbNTEyXSwgYXV0aF9kaXNwbGF5WzUxMl07Ci0JY2hhciBob3N0bmFtZVtNQVhIT1NUTkFNRUxFTl07Ci0JdV9pbnQgaTsKLQotCWlmIChub194MTFfZm9yd2FyZGluZ19mbGFnKSB7Ci0JCXBhY2tldF9zZW5kX2RlYnVnKCJYMTEgZm9yd2FyZGluZyBkaXNhYmxlZCBpbiB1c2VyIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghb3B0aW9ucy54MTFfZm9yd2FyZGluZykgewotCQlkZWJ1ZygiWDExIGZvcndhcmRpbmcgZGlzYWJsZWQgaW4gc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghb3B0aW9ucy54YXV0aF9sb2NhdGlvbiB8fAotCSAgICAoc3RhdChvcHRpb25zLnhhdXRoX2xvY2F0aW9uLCAmc3QpID09IC0xKSkgewotCQlwYWNrZXRfc2VuZF9kZWJ1ZygiTm8geGF1dGggcHJvZ3JhbTsgY2Fubm90IGZvcndhcmQgd2l0aCBzcG9vZmluZy4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChvcHRpb25zLnVzZV9sb2dpbikgewotCQlwYWNrZXRfc2VuZF9kZWJ1ZygiWDExIGZvcndhcmRpbmcgZGlzYWJsZWQ7ICIKLQkJICAgICJub3QgY29tcGF0aWJsZSB3aXRoIFVzZUxvZ2luPXllcy4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChzLT5kaXNwbGF5ICE9IE5VTEwpIHsKLQkJZGVidWcoIlgxMSBkaXNwbGF5IGFscmVhZHkgc2V0LiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHgxMV9jcmVhdGVfZGlzcGxheV9pbmV0KG9wdGlvbnMueDExX2Rpc3BsYXlfb2Zmc2V0LAotCSAgICBvcHRpb25zLngxMV91c2VfbG9jYWxob3N0LCBzLT5zaW5nbGVfY29ubmVjdGlvbiwKLQkgICAgJnMtPmRpc3BsYXlfbnVtYmVyLCAmcy0+eDExX2NoYW5pZHMpID09IC0xKSB7Ci0JCWRlYnVnKCJ4MTFfY3JlYXRlX2Rpc3BsYXlfaW5ldCBmYWlsZWQuIik7Ci0JCXJldHVybiAwOwotCX0KLQlmb3IgKGkgPSAwOyBzLT54MTFfY2hhbmlkc1tpXSAhPSAtMTsgaSsrKSB7Ci0JCWNoYW5uZWxfcmVnaXN0ZXJfY2xlYW51cChzLT54MTFfY2hhbmlkc1tpXSwKLQkJICAgIHNlc3Npb25fY2xvc2Vfc2luZ2xlX3gxMSwgMCk7Ci0JfQotCi0JLyogU2V0IHVwIGEgc3VpdGFibGUgdmFsdWUgZm9yIHRoZSBESVNQTEFZIHZhcmlhYmxlLiAqLwotCWlmIChnZXRob3N0bmFtZShob3N0bmFtZSwgc2l6ZW9mKGhvc3RuYW1lKSkgPCAwKQotCQlmYXRhbCgiZ2V0aG9zdG5hbWU6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JLyoKLQkgKiBhdXRoX2Rpc3BsYXkgbXVzdCBiZSB1c2VkIGFzIHRoZSBkaXNwbGF5bmFtZSB3aGVuIHRoZQotCSAqIGF1dGhvcml6YXRpb24gZW50cnkgaXMgYWRkZWQgd2l0aCB4YXV0aCgxKS4gIFRoaXMgd2lsbCBiZQotCSAqIGRpZmZlcmVudCB0aGFuIHRoZSBESVNQTEFZIHN0cmluZyBmb3IgbG9jYWxob3N0IGRpc3BsYXlzLgotCSAqLwotCWlmIChvcHRpb25zLngxMV91c2VfbG9jYWxob3N0KSB7Ci0JCXNucHJpbnRmKGRpc3BsYXksIHNpemVvZiBkaXNwbGF5LCAibG9jYWxob3N0OiV1LiV1IiwKLQkJICAgIHMtPmRpc3BsYXlfbnVtYmVyLCBzLT5zY3JlZW4pOwotCQlzbnByaW50ZihhdXRoX2Rpc3BsYXksIHNpemVvZiBhdXRoX2Rpc3BsYXksICJ1bml4OiV1LiV1IiwKLQkJICAgIHMtPmRpc3BsYXlfbnVtYmVyLCBzLT5zY3JlZW4pOwotCQlzLT5kaXNwbGF5ID0geHN0cmR1cChkaXNwbGF5KTsKLQkJcy0+YXV0aF9kaXNwbGF5ID0geHN0cmR1cChhdXRoX2Rpc3BsYXkpOwotCX0gZWxzZSB7Ci0jaWZkZWYgSVBBRERSX0lOX0RJU1BMQVkKLQkJc3RydWN0IGhvc3RlbnQgKmhlOwotCQlzdHJ1Y3QgaW5fYWRkciBteV9hZGRyOwotCi0JCWhlID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSk7Ci0JCWlmIChoZSA9PSBOVUxMKSB7Ci0JCQllcnJvcigiQ2FuJ3QgZ2V0IElQIGFkZHJlc3MgZm9yIFgxMSBESVNQTEFZLiIpOwotCQkJcGFja2V0X3NlbmRfZGVidWcoIkNhbid0IGdldCBJUCBhZGRyZXNzIGZvciBYMTEgRElTUExBWS4iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCW1lbWNweSgmbXlfYWRkciwgaGUtPmhfYWRkcl9saXN0WzBdLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKLQkJc25wcmludGYoZGlzcGxheSwgc2l6ZW9mIGRpc3BsYXksICIlLjUwczoldS4ldSIsIGluZXRfbnRvYShteV9hZGRyKSwKLQkJICAgIHMtPmRpc3BsYXlfbnVtYmVyLCBzLT5zY3JlZW4pOwotI2Vsc2UKLQkJc25wcmludGYoZGlzcGxheSwgc2l6ZW9mIGRpc3BsYXksICIlLjQwMHM6JXUuJXUiLCBob3N0bmFtZSwKLQkJICAgIHMtPmRpc3BsYXlfbnVtYmVyLCBzLT5zY3JlZW4pOwotI2VuZGlmCi0JCXMtPmRpc3BsYXkgPSB4c3RyZHVwKGRpc3BsYXkpOwotCQlzLT5hdXRoX2Rpc3BsYXkgPSB4c3RyZHVwKGRpc3BsYXkpOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotZG9fYXV0aGVudGljYXRlZDIoQXV0aGN0eHQgKmF1dGhjdHh0KQotewotCXNlcnZlcl9sb29wMihhdXRoY3R4dCk7Ci19Ci0KLXZvaWQKLWRvX2NsZWFudXAoQXV0aGN0eHQgKmF1dGhjdHh0KQotewotCXN0YXRpYyBpbnQgY2FsbGVkID0gMDsKLQotCWRlYnVnKCJkb19jbGVhbnVwIik7Ci0KLQkvKiBubyBjbGVhbnVwIGlmIHdlJ3JlIGluIHRoZSBjaGlsZCBmb3IgbG9naW4gc2hlbGwgKi8KLQlpZiAoaXNfY2hpbGQpCi0JCXJldHVybjsKLQotCS8qIGF2b2lkIGRvdWJsZSBjbGVhbnVwICovCi0JaWYgKGNhbGxlZCkKLQkJcmV0dXJuOwotCWNhbGxlZCA9IDE7Ci0KLQlpZiAoYXV0aGN0eHQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0jaWZkZWYgVVNFX1BBTQotCWlmIChvcHRpb25zLnVzZV9wYW0pIHsKLQkJc3NocGFtX2NsZWFudXAoKTsKLQkJc3NocGFtX3RocmVhZF9jbGVhbnVwKCk7Ci0JfQotI2VuZGlmCi0KLQlpZiAoIWF1dGhjdHh0LT5hdXRoZW50aWNhdGVkKQotCQlyZXR1cm47Ci0KLSNpZmRlZiBLUkI1Ci0JaWYgKG9wdGlvbnMua2VyYmVyb3NfdGlja2V0X2NsZWFudXAgJiYKLQkgICAgYXV0aGN0eHQtPmtyYjVfY3R4KQotCQlrcmI1X2NsZWFudXBfcHJvYyhhdXRoY3R4dCk7Ci0jZW5kaWYKLQotI2lmZGVmIEdTU0FQSQotCWlmIChjb21wYXQyMCAmJiBvcHRpb25zLmdzc19jbGVhbnVwX2NyZWRzKQotCQlzc2hfZ3NzYXBpX2NsZWFudXBfY3JlZHMoKTsKLSNlbmRpZgotCi0JLyogcmVtb3ZlIGFnZW50IHNvY2tldCAqLwotCWF1dGhfc29ja19jbGVhbnVwX3Byb2MoYXV0aGN0eHQtPnB3KTsKLQotCS8qCi0JICogQ2xlYW51cCBwdHlzL3V0bXAgb25seSBpZiBwcml2c2VwIGlzIGRpc2FibGVkLAotCSAqIG9yIGlmIHJ1bm5pbmcgaW4gbW9uaXRvci4KLQkgKi8KLQlpZiAoIXVzZV9wcml2c2VwIHx8IG1tX2lzX21vbml0b3IoKSkKLQkJc2Vzc2lvbl9kZXN0cm95X2FsbChzZXNzaW9uX3B0eV9jbGVhbnVwMik7Ci19CmRpZmYgLS1naXQgYS9zZXNzaW9uLmggYi9zZXNzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjhlM2EuLjAwMDAwMDAKLS0tIGEvc2Vzc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNlc3Npb24uaCx2IDEuMzAgMjAwOC8wNS8wOCAxMjoyMToxNiBkam0gRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLSNpZm5kZWYgU0VTU0lPTl9ICi0jZGVmaW5lIFNFU1NJT05fSAotCi0jZGVmaW5lIFRUWVNaIDY0Ci10eXBlZGVmIHN0cnVjdCBTZXNzaW9uIFNlc3Npb247Ci1zdHJ1Y3QgU2Vzc2lvbiB7Ci0JaW50CXVzZWQ7Ci0JaW50CXNlbGY7Ci0JaW50CW5leHRfdW51c2VkOwotCXN0cnVjdCBwYXNzd2QgKnB3OwotCUF1dGhjdHh0ICphdXRoY3R4dDsKLQlwaWRfdAlwaWQ7Ci0KLQkvKiB0dHkgKi8KLQljaGFyCSp0ZXJtOwotCWludAlwdHlmZCwgdHR5ZmQsIHB0eW1hc3RlcjsKLQl1X2ludAlyb3csIGNvbCwgeHBpeGVsLCB5cGl4ZWw7Ci0JY2hhcgl0dHlbVFRZU1pdOwotCi0JLyogWDExICovCi0JdV9pbnQJZGlzcGxheV9udW1iZXI7Ci0JY2hhcgkqZGlzcGxheTsKLQl1X2ludAlzY3JlZW47Ci0JY2hhcgkqYXV0aF9kaXNwbGF5OwotCWNoYXIJKmF1dGhfcHJvdG87Ci0JY2hhcgkqYXV0aF9kYXRhOwotCWludAlzaW5nbGVfY29ubmVjdGlvbjsKLQotCS8qIHByb3RvIDIgKi8KLQlpbnQJY2hhbmlkOwotCWludAkqeDExX2NoYW5pZHM7Ci0JaW50CWlzX3N1YnN5c3RlbTsKLQl1X2ludAludW1fZW52OwotCXN0cnVjdCB7Ci0JCWNoYXIJKm5hbWU7Ci0JCWNoYXIJKnZhbDsKLQl9ICplbnY7Ci19OwotCi12b2lkCSBkb19hdXRoZW50aWNhdGVkKEF1dGhjdHh0ICopOwotdm9pZAkgZG9fY2xlYW51cChBdXRoY3R4dCAqKTsKLQotaW50CSBzZXNzaW9uX29wZW4oQXV0aGN0eHQgKiwgaW50KTsKLXZvaWQJIHNlc3Npb25fdW51c2VkKGludCk7Ci1pbnQJIHNlc3Npb25faW5wdXRfY2hhbm5lbF9yZXEoQ2hhbm5lbCAqLCBjb25zdCBjaGFyICopOwotdm9pZAkgc2Vzc2lvbl9jbG9zZV9ieV9waWQocGlkX3QsIGludCk7Ci12b2lkCSBzZXNzaW9uX2Nsb3NlX2J5X2NoYW5uZWwoaW50LCB2b2lkICopOwotdm9pZAkgc2Vzc2lvbl9kZXN0cm95X2FsbCh2b2lkICgqKShTZXNzaW9uICopKTsKLXZvaWQJIHNlc3Npb25fcHR5X2NsZWFudXAyKFNlc3Npb24gKik7Ci0KLVNlc3Npb24JKnNlc3Npb25fbmV3KHZvaWQpOwotU2Vzc2lvbgkqc2Vzc2lvbl9ieV90dHkoY2hhciAqKTsKLXZvaWQJIHNlc3Npb25fY2xvc2UoU2Vzc2lvbiAqKTsKLXZvaWQJIGRvX3NldHVzZXJjb250ZXh0KHN0cnVjdCBwYXNzd2QgKik7Ci12b2lkCSBjaGlsZF9zZXRfZW52KGNoYXIgKioqZW52cCwgdV9pbnQgKmVudnNpemVwLCBjb25zdCBjaGFyICpuYW1lLAotCQkgICAgICAgY29uc3QgY2hhciAqdmFsdWUpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NmdHAtY2xpZW50LmMgYi9zZnRwLWNsaWVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTFhYmMwLi4wMDAwMDAwCi0tLSBhL3NmdHAtY2xpZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjM4ICswLDAgQEAKLS8qICRPcGVuQlNEOiBzZnRwLWNsaWVudC5jLHYgMS45NCAyMDEwLzEyLzA0IDAwOjE4OjAxIGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IERhbWllbiBNaWxsZXIgPGRqbUBvcGVuYnNkLm9yZz4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0vKiBYWFg6IG1lbWxlYWtzICovCi0vKiBYWFg6IHNpZ25lZCB2cyB1bnNpZ25lZCAqLwotLyogWFhYOiByZW1vdmUgYWxsIGxvZ2dpbmcsIG9ubHkgcmV0dXJuIHN0YXR1cyBjb2RlcyAqLwotLyogWFhYOiBjb3B5IGJldHdlZW4gdHdvIHJlbW90ZSBzaXRlcyAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2lmZGVmIEhBVkVfU1lTX1NUQVRWRlNfSAotI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKLSNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAotIyBpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3Vpby5oPgotCi0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAiYXRvbWljaW8uaCIKLSNpbmNsdWRlICJwcm9ncmVzc21ldGVyLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotCi0jaW5jbHVkZSAic2Z0cC5oIgotI2luY2x1ZGUgInNmdHAtY29tbW9uLmgiCi0jaW5jbHVkZSAic2Z0cC1jbGllbnQuaCIKLQotZXh0ZXJuIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBpbnRlcnJ1cHRlZDsKLWV4dGVybiBpbnQgc2hvd3Byb2dyZXNzOwotCi0vKiBNaW5pbXVtIGFtb3VudCBvZiBkYXRhIHRvIHJlYWQgYXQgYSB0aW1lICovCi0jZGVmaW5lIE1JTl9SRUFEX1NJWkUJNTEyCi0KLS8qIE1heGltdW0gZGVwdGggdG8gZGVzY2VuZCBpbiBkaXJlY3RvcnkgdHJlZXMgKi8KLSNkZWZpbmUgTUFYX0RJUl9ERVBUSCA2NAotCi1zdHJ1Y3Qgc2Z0cF9jb25uIHsKLQlpbnQgZmRfaW47Ci0JaW50IGZkX291dDsKLQl1X2ludCB0cmFuc2Zlcl9idWZsZW47Ci0JdV9pbnQgbnVtX3JlcXVlc3RzOwotCXVfaW50IHZlcnNpb247Ci0JdV9pbnQgbXNnX2lkOwotI2RlZmluZSBTRlRQX0VYVF9QT1NJWF9SRU5BTUUJMHgwMDAwMDAwMQotI2RlZmluZSBTRlRQX0VYVF9TVEFUVkZTCTB4MDAwMDAwMDIKLSNkZWZpbmUgU0ZUUF9FWFRfRlNUQVRWRlMJMHgwMDAwMDAwNAotI2RlZmluZSBTRlRQX0VYVF9IQVJETElOSwkweDAwMDAwMDA4Ci0JdV9pbnQgZXh0czsKLQl1X2ludDY0X3QgbGltaXRfa2JwczsKLQlzdHJ1Y3QgYndsaW1pdCBid2xpbWl0X2luLCBid2xpbWl0X291dDsKLX07Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9oYW5kbGUoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgdV9pbnQgZXhwZWN0ZWRfaWQsIHVfaW50ICpsZW4sCi0gICAgY29uc3QgY2hhciAqZXJyZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDQsIDUpKSk7Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci1zZnRwaW8odm9pZCAqX2J3bGltaXQsIHNpemVfdCBhbW91bnQpCi17Ci0Jc3RydWN0IGJ3bGltaXQgKmJ3bGltaXQgPSAoc3RydWN0IGJ3bGltaXQgKilfYndsaW1pdDsKLQotCWJhbmR3aWR0aF9saW1pdChid2xpbWl0LCBhbW91bnQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZF9tc2coc3RydWN0IHNmdHBfY29ubiAqY29ubiwgQnVmZmVyICptKQotewotCXVfY2hhciBtbGVuWzRdOwotCXN0cnVjdCBpb3ZlYyBpb3ZbMl07Ci0KLQlpZiAoYnVmZmVyX2xlbihtKSA+IFNGVFBfTUFYX01TR19MRU5HVEgpCi0JCWZhdGFsKCJPdXRib3VuZCBtZXNzYWdlIHRvbyBsb25nICV1IiwgYnVmZmVyX2xlbihtKSk7Ci0KLQkvKiBTZW5kIGxlbmd0aCBmaXJzdCAqLwotCXB1dF91MzIobWxlbiwgYnVmZmVyX2xlbihtKSk7Ci0JaW92WzBdLmlvdl9iYXNlID0gbWxlbjsKLQlpb3ZbMF0uaW92X2xlbiA9IHNpemVvZihtbGVuKTsKLQlpb3ZbMV0uaW92X2Jhc2UgPSBidWZmZXJfcHRyKG0pOwotCWlvdlsxXS5pb3ZfbGVuID0gYnVmZmVyX2xlbihtKTsKLQotCWlmIChhdG9taWNpb3Y2KHdyaXRldiwgY29ubi0+ZmRfb3V0LCBpb3YsIDIsCi0JICAgIGNvbm4tPmxpbWl0X2ticHMgPiAwID8gc2Z0cGlvIDogTlVMTCwgJmNvbm4tPmJ3bGltaXRfb3V0KSAhPSAKLQkgICAgYnVmZmVyX2xlbihtKSArIHNpemVvZihtbGVuKSkKLQkJZmF0YWwoIkNvdWxkbid0IHNlbmQgcGFja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLQlidWZmZXJfY2xlYXIobSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZXRfbXNnKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIEJ1ZmZlciAqbSkKLXsKLQl1X2ludCBtc2dfbGVuOwotCi0JYnVmZmVyX2FwcGVuZF9zcGFjZShtLCA0KTsKLQlpZiAoYXRvbWljaW82KHJlYWQsIGNvbm4tPmZkX2luLCBidWZmZXJfcHRyKG0pLCA0LAotCSAgICBjb25uLT5saW1pdF9rYnBzID4gMCA/IHNmdHBpbyA6IE5VTEwsICZjb25uLT5id2xpbWl0X2luKSAhPSA0KSB7Ci0JCWlmIChlcnJubyA9PSBFUElQRSkKLQkJCWZhdGFsKCJDb25uZWN0aW9uIGNsb3NlZCIpOwotCQllbHNlCi0JCQlmYXRhbCgiQ291bGRuJ3QgcmVhZCBwYWNrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci0KLQltc2dfbGVuID0gYnVmZmVyX2dldF9pbnQobSk7Ci0JaWYgKG1zZ19sZW4gPiBTRlRQX01BWF9NU0dfTEVOR1RIKQotCQlmYXRhbCgiUmVjZWl2ZWQgbWVzc2FnZSB0b28gbG9uZyAldSIsIG1zZ19sZW4pOwotCi0JYnVmZmVyX2FwcGVuZF9zcGFjZShtLCBtc2dfbGVuKTsKLQlpZiAoYXRvbWljaW82KHJlYWQsIGNvbm4tPmZkX2luLCBidWZmZXJfcHRyKG0pLCBtc2dfbGVuLAotCSAgICBjb25uLT5saW1pdF9rYnBzID4gMCA/IHNmdHBpbyA6IE5VTEwsICZjb25uLT5id2xpbWl0X2luKQotCSAgICAhPSBtc2dfbGVuKSB7Ci0JCWlmIChlcnJubyA9PSBFUElQRSkKLQkJCWZhdGFsKCJDb25uZWN0aW9uIGNsb3NlZCIpOwotCQllbHNlCi0JCQlmYXRhbCgiUmVhZCBwYWNrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kX3N0cmluZ19yZXF1ZXN0KHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIHVfaW50IGlkLCB1X2ludCBjb2RlLCBjaGFyICpzLAotICAgIHVfaW50IGxlbikKLXsKLQlCdWZmZXIgbXNnOwotCi0JYnVmZmVyX2luaXQoJm1zZyk7Ci0JYnVmZmVyX3B1dF9jaGFyKCZtc2csIGNvZGUpOwotCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGlkKTsKLQlidWZmZXJfcHV0X3N0cmluZygmbXNnLCBzLCBsZW4pOwotCXNlbmRfbXNnKGNvbm4sICZtc2cpOwotCWRlYnVnMygiU2VudCBtZXNzYWdlIGZkICVkIFQ6JXUgSToldSIsIGNvbm4tPmZkX291dCwgY29kZSwgaWQpOwotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZF9zdHJpbmdfYXR0cnNfcmVxdWVzdChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCB1X2ludCBpZCwgdV9pbnQgY29kZSwKLSAgICBjaGFyICpzLCB1X2ludCBsZW4sIEF0dHJpYiAqYSkKLXsKLQlCdWZmZXIgbXNnOwotCi0JYnVmZmVyX2luaXQoJm1zZyk7Ci0JYnVmZmVyX3B1dF9jaGFyKCZtc2csIGNvZGUpOwotCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGlkKTsKLQlidWZmZXJfcHV0X3N0cmluZygmbXNnLCBzLCBsZW4pOwotCWVuY29kZV9hdHRyaWIoJm1zZywgYSk7Ci0Jc2VuZF9tc2coY29ubiwgJm1zZyk7Ci0JZGVidWczKCJTZW50IG1lc3NhZ2UgZmQgJWQgVDoldSBJOiV1IiwgY29ubi0+ZmRfb3V0LCBjb2RlLCBpZCk7Ci0JYnVmZmVyX2ZyZWUoJm1zZyk7Ci19Ci0KLXN0YXRpYyB1X2ludAotZ2V0X3N0YXR1cyhzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCB1X2ludCBleHBlY3RlZF9pZCkKLXsKLQlCdWZmZXIgbXNnOwotCXVfaW50IHR5cGUsIGlkLCBzdGF0dXM7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQlnZXRfbXNnKGNvbm4sICZtc2cpOwotCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJm1zZyk7Ci0JaWQgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKLQotCWlmIChpZCAhPSBleHBlY3RlZF9pZCkKLQkJZmF0YWwoIklEIG1pc21hdGNoICgldSAhPSAldSkiLCBpZCwgZXhwZWN0ZWRfaWQpOwotCWlmICh0eXBlICE9IFNTSDJfRlhQX1NUQVRVUykKLQkJZmF0YWwoIkV4cGVjdGVkIFNTSDJfRlhQX1NUQVRVUygldSkgcGFja2V0LCBnb3QgJXUiLAotCQkgICAgU1NIMl9GWFBfU1RBVFVTLCB0eXBlKTsKLQotCXN0YXR1cyA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOwotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCi0JZGVidWczKCJTU0gyX0ZYUF9TVEFUVVMgJXUiLCBzdGF0dXMpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2hhbmRsZShzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCB1X2ludCBleHBlY3RlZF9pZCwgdV9pbnQgKmxlbiwKLSAgICBjb25zdCBjaGFyICplcnJmbXQsIC4uLikKLXsKLQlCdWZmZXIgbXNnOwotCXVfaW50IHR5cGUsIGlkOwotCWNoYXIgKmhhbmRsZSwgZXJybXNnWzI1Nl07Ci0JdmFfbGlzdCBhcmdzOwotCWludCBzdGF0dXM7Ci0KLQl2YV9zdGFydChhcmdzLCBlcnJmbXQpOwotCWlmIChlcnJmbXQgIT0gTlVMTCkKLQkJdnNucHJpbnRmKGVycm1zZywgc2l6ZW9mKGVycm1zZyksIGVycmZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCi0JYnVmZmVyX2luaXQoJm1zZyk7Ci0JZ2V0X21zZyhjb25uLCAmbXNnKTsKLQl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZtc2cpOwotCWlkID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7Ci0KLQlpZiAoaWQgIT0gZXhwZWN0ZWRfaWQpCi0JCWZhdGFsKCIlczogSUQgbWlzbWF0Y2ggKCV1ICE9ICV1KSIsCi0JCSAgICBlcnJmbXQgPT0gTlVMTCA/IF9fZnVuY19fIDogZXJybXNnLCBpZCwgZXhwZWN0ZWRfaWQpOwotCWlmICh0eXBlID09IFNTSDJfRlhQX1NUQVRVUykgewotCQlzdGF0dXMgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKLQkJaWYgKGVycmZtdCAhPSBOVUxMKQotCQkJZXJyb3IoIiVzOiAlcyIsIGVycm1zZywgZngydHh0KHN0YXR1cykpOwotCQlidWZmZXJfZnJlZSgmbXNnKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0gZWxzZSBpZiAodHlwZSAhPSBTU0gyX0ZYUF9IQU5ETEUpCi0JCWZhdGFsKCIlczogRXhwZWN0ZWQgU1NIMl9GWFBfSEFORExFKCV1KSBwYWNrZXQsIGdvdCAldSIsCi0JCSAgICBlcnJmbXQgPT0gTlVMTCA/IF9fZnVuY19fIDogZXJybXNnLCBTU0gyX0ZYUF9IQU5ETEUsIHR5cGUpOwotCi0JaGFuZGxlID0gYnVmZmVyX2dldF9zdHJpbmcoJm1zZywgbGVuKTsKLQlidWZmZXJfZnJlZSgmbXNnKTsKLQotCXJldHVybihoYW5kbGUpOwotfQotCi1zdGF0aWMgQXR0cmliICoKLWdldF9kZWNvZGVfc3RhdChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCB1X2ludCBleHBlY3RlZF9pZCwgaW50IHF1aWV0KQotewotCUJ1ZmZlciBtc2c7Ci0JdV9pbnQgdHlwZSwgaWQ7Ci0JQXR0cmliICphOwotCi0JYnVmZmVyX2luaXQoJm1zZyk7Ci0JZ2V0X21zZyhjb25uLCAmbXNnKTsKLQotCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJm1zZyk7Ci0JaWQgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKLQotCWRlYnVnMygiUmVjZWl2ZWQgc3RhdCByZXBseSBUOiV1IEk6JXUiLCB0eXBlLCBpZCk7Ci0JaWYgKGlkICE9IGV4cGVjdGVkX2lkKQotCQlmYXRhbCgiSUQgbWlzbWF0Y2ggKCV1ICE9ICV1KSIsIGlkLCBleHBlY3RlZF9pZCk7Ci0JaWYgKHR5cGUgPT0gU1NIMl9GWFBfU1RBVFVTKSB7Ci0JCWludCBzdGF0dXMgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKLQotCQlpZiAocXVpZXQpCi0JCQlkZWJ1ZygiQ291bGRuJ3Qgc3RhdCByZW1vdGUgZmlsZTogJXMiLCBmeDJ0eHQoc3RhdHVzKSk7Ci0JCWVsc2UKLQkJCWVycm9yKCJDb3VsZG4ndCBzdGF0IHJlbW90ZSBmaWxlOiAlcyIsIGZ4MnR4dChzdGF0dXMpKTsKLQkJYnVmZmVyX2ZyZWUoJm1zZyk7Ci0JCXJldHVybihOVUxMKTsKLQl9IGVsc2UgaWYgKHR5cGUgIT0gU1NIMl9GWFBfQVRUUlMpIHsKLQkJZmF0YWwoIkV4cGVjdGVkIFNTSDJfRlhQX0FUVFJTKCV1KSBwYWNrZXQsIGdvdCAldSIsCi0JCSAgICBTU0gyX0ZYUF9BVFRSUywgdHlwZSk7Ci0JfQotCWEgPSBkZWNvZGVfYXR0cmliKCZtc2cpOwotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCi0JcmV0dXJuKGEpOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfZGVjb2RlX3N0YXR2ZnMoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgc3RydWN0IHNmdHBfc3RhdHZmcyAqc3QsCi0gICAgdV9pbnQgZXhwZWN0ZWRfaWQsIGludCBxdWlldCkKLXsKLQlCdWZmZXIgbXNnOwotCXVfaW50IHR5cGUsIGlkLCBmbGFnOwotCi0JYnVmZmVyX2luaXQoJm1zZyk7Ci0JZ2V0X21zZyhjb25uLCAmbXNnKTsKLQotCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJm1zZyk7Ci0JaWQgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKLQotCWRlYnVnMygiUmVjZWl2ZWQgc3RhdHZmcyByZXBseSBUOiV1IEk6JXUiLCB0eXBlLCBpZCk7Ci0JaWYgKGlkICE9IGV4cGVjdGVkX2lkKQotCQlmYXRhbCgiSUQgbWlzbWF0Y2ggKCV1ICE9ICV1KSIsIGlkLCBleHBlY3RlZF9pZCk7Ci0JaWYgKHR5cGUgPT0gU1NIMl9GWFBfU1RBVFVTKSB7Ci0JCWludCBzdGF0dXMgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKLQotCQlpZiAocXVpZXQpCi0JCQlkZWJ1ZygiQ291bGRuJ3Qgc3RhdHZmczogJXMiLCBmeDJ0eHQoc3RhdHVzKSk7Ci0JCWVsc2UKLQkJCWVycm9yKCJDb3VsZG4ndCBzdGF0dmZzOiAlcyIsIGZ4MnR4dChzdGF0dXMpKTsKLQkJYnVmZmVyX2ZyZWUoJm1zZyk7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2UgaWYgKHR5cGUgIT0gU1NIMl9GWFBfRVhURU5ERURfUkVQTFkpIHsKLQkJZmF0YWwoIkV4cGVjdGVkIFNTSDJfRlhQX0VYVEVOREVEX1JFUExZKCV1KSBwYWNrZXQsIGdvdCAldSIsCi0JCSAgICBTU0gyX0ZYUF9FWFRFTkRFRF9SRVBMWSwgdHlwZSk7Ci0JfQotCi0JYnplcm8oc3QsIHNpemVvZigqc3QpKTsKLQlzdC0+Zl9ic2l6ZSA9IGJ1ZmZlcl9nZXRfaW50NjQoJm1zZyk7Ci0Jc3QtPmZfZnJzaXplID0gYnVmZmVyX2dldF9pbnQ2NCgmbXNnKTsKLQlzdC0+Zl9ibG9ja3MgPSBidWZmZXJfZ2V0X2ludDY0KCZtc2cpOwotCXN0LT5mX2JmcmVlID0gYnVmZmVyX2dldF9pbnQ2NCgmbXNnKTsKLQlzdC0+Zl9iYXZhaWwgPSBidWZmZXJfZ2V0X2ludDY0KCZtc2cpOwotCXN0LT5mX2ZpbGVzID0gYnVmZmVyX2dldF9pbnQ2NCgmbXNnKTsKLQlzdC0+Zl9mZnJlZSA9IGJ1ZmZlcl9nZXRfaW50NjQoJm1zZyk7Ci0Jc3QtPmZfZmF2YWlsID0gYnVmZmVyX2dldF9pbnQ2NCgmbXNnKTsKLQlzdC0+Zl9mc2lkID0gYnVmZmVyX2dldF9pbnQ2NCgmbXNnKTsKLQlmbGFnID0gYnVmZmVyX2dldF9pbnQ2NCgmbXNnKTsKLQlzdC0+Zl9uYW1lbWF4ID0gYnVmZmVyX2dldF9pbnQ2NCgmbXNnKTsKLQotCXN0LT5mX2ZsYWcgPSAoZmxhZyAmIFNTSDJfRlhFX1NUQVRWRlNfU1RfUkRPTkxZKSA/IFNUX1JET05MWSA6IDA7Ci0Jc3QtPmZfZmxhZyB8PSAoZmxhZyAmIFNTSDJfRlhFX1NUQVRWRlNfU1RfTk9TVUlEKSA/IFNUX05PU1VJRCA6IDA7Ci0KLQlidWZmZXJfZnJlZSgmbXNnKTsKLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3Qgc2Z0cF9jb25uICoKLWRvX2luaXQoaW50IGZkX2luLCBpbnQgZmRfb3V0LCB1X2ludCB0cmFuc2Zlcl9idWZsZW4sIHVfaW50IG51bV9yZXF1ZXN0cywKLSAgICB1X2ludDY0X3QgbGltaXRfa2JwcykKLXsKLQl1X2ludCB0eXBlOwotCUJ1ZmZlciBtc2c7Ci0Jc3RydWN0IHNmdHBfY29ubiAqcmV0OwotCi0JcmV0ID0geG1hbGxvYyhzaXplb2YoKnJldCkpOwotCXJldC0+ZmRfaW4gPSBmZF9pbjsKLQlyZXQtPmZkX291dCA9IGZkX291dDsKLQlyZXQtPnRyYW5zZmVyX2J1ZmxlbiA9IHRyYW5zZmVyX2J1ZmxlbjsKLQlyZXQtPm51bV9yZXF1ZXN0cyA9IG51bV9yZXF1ZXN0czsKLQlyZXQtPmV4dHMgPSAwOwotCXJldC0+bGltaXRfa2JwcyA9IDA7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9GWFBfSU5JVCk7Ci0JYnVmZmVyX3B1dF9pbnQoJm1zZywgU1NIMl9GSUxFWEZFUl9WRVJTSU9OKTsKLQlzZW5kX21zZyhyZXQsICZtc2cpOwotCi0JYnVmZmVyX2NsZWFyKCZtc2cpOwotCi0JZ2V0X21zZyhyZXQsICZtc2cpOwotCi0JLyogRXhwZWN0aW5nIGEgVkVSU0lPTiByZXBseSAqLwotCWlmICgodHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbXNnKSkgIT0gU1NIMl9GWFBfVkVSU0lPTikgewotCQllcnJvcigiSW52YWxpZCBwYWNrZXQgYmFjayBmcm9tIFNTSDJfRlhQX0lOSVQgKHR5cGUgJXUpIiwKLQkJICAgIHR5cGUpOwotCQlidWZmZXJfZnJlZSgmbXNnKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlyZXQtPnZlcnNpb24gPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKLQotCWRlYnVnMigiUmVtb3RlIHZlcnNpb246ICV1IiwgcmV0LT52ZXJzaW9uKTsKLQotCS8qIENoZWNrIGZvciBleHRlbnNpb25zICovCi0Jd2hpbGUgKGJ1ZmZlcl9sZW4oJm1zZykgPiAwKSB7Ci0JCWNoYXIgKm5hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbXNnLCBOVUxMKTsKLQkJY2hhciAqdmFsdWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbXNnLCBOVUxMKTsKLQkJaW50IGtub3duID0gMDsKLQotCQlpZiAoc3RyY21wKG5hbWUsICJwb3NpeC1yZW5hbWVAb3BlbnNzaC5jb20iKSA9PSAwICYmCi0JCSAgICBzdHJjbXAodmFsdWUsICIxIikgPT0gMCkgewotCQkJcmV0LT5leHRzIHw9IFNGVFBfRVhUX1BPU0lYX1JFTkFNRTsKLQkJCWtub3duID0gMTsKLQkJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInN0YXR2ZnNAb3BlbnNzaC5jb20iKSA9PSAwICYmCi0JCSAgICBzdHJjbXAodmFsdWUsICIyIikgPT0gMCkgewotCQkJcmV0LT5leHRzIHw9IFNGVFBfRVhUX1NUQVRWRlM7Ci0JCQlrbm93biA9IDE7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJmc3RhdHZmc0BvcGVuc3NoLmNvbSIpID09IDAgJiYKLQkJICAgIHN0cmNtcCh2YWx1ZSwgIjIiKSA9PSAwKSB7Ci0JCQlyZXQtPmV4dHMgfD0gU0ZUUF9FWFRfRlNUQVRWRlM7Ci0JCQlrbm93biA9IDE7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJoYXJkbGlua0BvcGVuc3NoLmNvbSIpID09IDAgJiYKLQkJICAgIHN0cmNtcCh2YWx1ZSwgIjEiKSA9PSAwKSB7Ci0JCQlyZXQtPmV4dHMgfD0gU0ZUUF9FWFRfSEFSRExJTks7Ci0JCQlrbm93biA9IDE7Ci0JCX0KLQkJaWYgKGtub3duKSB7Ci0JCQlkZWJ1ZzIoIlNlcnZlciBzdXBwb3J0cyBleHRlbnNpb24gXCIlc1wiIHJldmlzaW9uICVzIiwKLQkJCSAgICBuYW1lLCB2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlkZWJ1ZzIoIlVucmVjb2duaXNlZCBzZXJ2ZXIgZXh0ZW5zaW9uIFwiJXNcIiIsIG5hbWUpOwotCQl9Ci0JCXhmcmVlKG5hbWUpOwotCQl4ZnJlZSh2YWx1ZSk7Ci0JfQotCi0JYnVmZmVyX2ZyZWUoJm1zZyk7Ci0KLQkvKiBTb21lIGZpbGV4ZmVyIHYuMCBzZXJ2ZXJzIGRvbid0IHN1cHBvcnQgbGFyZ2UgcGFja2V0cyAqLwotCWlmIChyZXQtPnZlcnNpb24gPT0gMCkKLQkJcmV0LT50cmFuc2Zlcl9idWZsZW4gPSBNSU4ocmV0LT50cmFuc2Zlcl9idWZsZW4sIDIwNDgwKTsKLQotCXJldC0+bGltaXRfa2JwcyA9IGxpbWl0X2ticHM7Ci0JaWYgKHJldC0+bGltaXRfa2JwcyA+IDApIHsKLQkJYmFuZHdpZHRoX2xpbWl0X2luaXQoJnJldC0+YndsaW1pdF9pbiwgcmV0LT5saW1pdF9rYnBzLAotCQkgICAgcmV0LT50cmFuc2Zlcl9idWZsZW4pOwotCQliYW5kd2lkdGhfbGltaXRfaW5pdCgmcmV0LT5id2xpbWl0X291dCwgcmV0LT5saW1pdF9rYnBzLAotCQkgICAgcmV0LT50cmFuc2Zlcl9idWZsZW4pOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXVfaW50Ci1zZnRwX3Byb3RvX3ZlcnNpb24oc3RydWN0IHNmdHBfY29ubiAqY29ubikKLXsKLQlyZXR1cm4gY29ubi0+dmVyc2lvbjsKLX0KLQotaW50Ci1kb19jbG9zZShzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpoYW5kbGUsIHVfaW50IGhhbmRsZV9sZW4pCi17Ci0JdV9pbnQgaWQsIHN0YXR1czsKLQlCdWZmZXIgbXNnOwotCi0JYnVmZmVyX2luaXQoJm1zZyk7Ci0KLQlpZCA9IGNvbm4tPm1zZ19pZCsrOwotCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9DTE9TRSk7Ci0JYnVmZmVyX3B1dF9pbnQoJm1zZywgaWQpOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtc2csIGhhbmRsZSwgaGFuZGxlX2xlbik7Ci0Jc2VuZF9tc2coY29ubiwgJm1zZyk7Ci0JZGVidWczKCJTZW50IG1lc3NhZ2UgU1NIMl9GWFBfQ0xPU0UgSToldSIsIGlkKTsKLQotCXN0YXR1cyA9IGdldF9zdGF0dXMoY29ubiwgaWQpOwotCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9PSykKLQkJZXJyb3IoIkNvdWxkbid0IGNsb3NlIGZpbGU6ICVzIiwgZngydHh0KHN0YXR1cykpOwotCi0JYnVmZmVyX2ZyZWUoJm1zZyk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0KLXN0YXRpYyBpbnQKLWRvX2xzcmVhZGRpcihzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpwYXRoLCBpbnQgcHJpbnRmbGFnLAotICAgIFNGVFBfRElSRU5UICoqKmRpcikKLXsKLQlCdWZmZXIgbXNnOwotCXVfaW50IGNvdW50LCB0eXBlLCBpZCwgaGFuZGxlX2xlbiwgaSwgZXhwZWN0ZWRfaWQsIGVudHMgPSAwOwotCWNoYXIgKmhhbmRsZTsKLQotCWlkID0gY29ubi0+bXNnX2lkKys7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9GWFBfT1BFTkRJUik7Ci0JYnVmZmVyX3B1dF9pbnQoJm1zZywgaWQpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBwYXRoKTsKLQlzZW5kX21zZyhjb25uLCAmbXNnKTsKLQotCWJ1ZmZlcl9jbGVhcigmbXNnKTsKLQotCWhhbmRsZSA9IGdldF9oYW5kbGUoY29ubiwgaWQsICZoYW5kbGVfbGVuLAotCSAgICAicmVtb3RlIHJlYWRkaXIoXCIlc1wiKSIsIHBhdGgpOwotCWlmIChoYW5kbGUgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKGRpcikgewotCQllbnRzID0gMDsKLQkJKmRpciA9IHhtYWxsb2Moc2l6ZW9mKCoqZGlyKSk7Ci0JCSgqZGlyKVswXSA9IE5VTEw7Ci0JfQotCi0JZm9yICg7ICFpbnRlcnJ1cHRlZDspIHsKLQkJaWQgPSBleHBlY3RlZF9pZCA9IGNvbm4tPm1zZ19pZCsrOwotCi0JCWRlYnVnMygiU2VuZGluZyBTU0gyX0ZYUF9SRUFERElSIEk6JXUiLCBpZCk7Ci0KLQkJYnVmZmVyX2NsZWFyKCZtc2cpOwotCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9GWFBfUkVBRERJUik7Ci0JCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGlkKTsKLQkJYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgaGFuZGxlLCBoYW5kbGVfbGVuKTsKLQkJc2VuZF9tc2coY29ubiwgJm1zZyk7Ci0KLQkJYnVmZmVyX2NsZWFyKCZtc2cpOwotCi0JCWdldF9tc2coY29ubiwgJm1zZyk7Ci0KLQkJdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbXNnKTsKLQkJaWQgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKLQotCQlkZWJ1ZzMoIlJlY2VpdmVkIHJlcGx5IFQ6JXUgSToldSIsIHR5cGUsIGlkKTsKLQotCQlpZiAoaWQgIT0gZXhwZWN0ZWRfaWQpCi0JCQlmYXRhbCgiSUQgbWlzbWF0Y2ggKCV1ICE9ICV1KSIsIGlkLCBleHBlY3RlZF9pZCk7Ci0KLQkJaWYgKHR5cGUgPT0gU1NIMl9GWFBfU1RBVFVTKSB7Ci0JCQlpbnQgc3RhdHVzID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7Ci0KLQkJCWRlYnVnMygiUmVjZWl2ZWQgU1NIMl9GWFBfU1RBVFVTICVkIiwgc3RhdHVzKTsKLQotCQkJaWYgKHN0YXR1cyA9PSBTU0gyX0ZYX0VPRikgewotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQllcnJvcigiQ291bGRuJ3QgcmVhZCBkaXJlY3Rvcnk6ICVzIiwKLQkJCQkgICAgZngydHh0KHN0YXR1cykpOwotCQkJCWRvX2Nsb3NlKGNvbm4sIGhhbmRsZSwgaGFuZGxlX2xlbik7Ci0JCQkJeGZyZWUoaGFuZGxlKTsKLQkJCQlyZXR1cm4oc3RhdHVzKTsKLQkJCX0KLQkJfSBlbHNlIGlmICh0eXBlICE9IFNTSDJfRlhQX05BTUUpCi0JCQlmYXRhbCgiRXhwZWN0ZWQgU1NIMl9GWFBfTkFNRSgldSkgcGFja2V0LCBnb3QgJXUiLAotCQkJICAgIFNTSDJfRlhQX05BTUUsIHR5cGUpOwotCi0JCWNvdW50ID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJYnJlYWs7Ci0JCWRlYnVnMygiUmVjZWl2ZWQgJWQgU1NIMl9GWFBfTkFNRSByZXNwb25zZXMiLCBjb3VudCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQljaGFyICpmaWxlbmFtZSwgKmxvbmduYW1lOwotCQkJQXR0cmliICphOwotCi0JCQlmaWxlbmFtZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtc2csIE5VTEwpOwotCQkJbG9uZ25hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbXNnLCBOVUxMKTsKLQkJCWEgPSBkZWNvZGVfYXR0cmliKCZtc2cpOwotCi0JCQlpZiAocHJpbnRmbGFnKQotCQkJCXByaW50ZigiJXNcbiIsIGxvbmduYW1lKTsKLQotCQkJLyoKLQkJCSAqIERpcmVjdG9yeSBlbnRyaWVzIHNob3VsZCBuZXZlciBjb250YWluICcvJwotCQkJICogVGhlc2UgY2FuIGJlIHVzZWQgdG8gYXR0YWNrIHJlY3Vyc2l2ZSBvcHMKLQkJCSAqIChlLmcuIHNlbmQgJy4uLy4uLy4uLy4uL2V0Yy9wYXNzd2QnKQotCQkJICovCi0JCQlpZiAoc3RyY2hyKGZpbGVuYW1lLCAnLycpICE9IE5VTEwpIHsKLQkJCQllcnJvcigiU2VydmVyIHNlbnQgc3VzcGVjdCBwYXRoIFwiJXNcIiAiCi0JCQkJICAgICJkdXJpbmcgcmVhZGRpciBvZiBcIiVzXCIiLCBmaWxlbmFtZSwgcGF0aCk7Ci0JCQkJZ290byBuZXh0OwotCQkJfQotCi0JCQlpZiAoZGlyKSB7Ci0JCQkJKmRpciA9IHhyZWFsbG9jKCpkaXIsIGVudHMgKyAyLCBzaXplb2YoKipkaXIpKTsKLQkJCQkoKmRpcilbZW50c10gPSB4bWFsbG9jKHNpemVvZigqKipkaXIpKTsKLQkJCQkoKmRpcilbZW50c10tPmZpbGVuYW1lID0geHN0cmR1cChmaWxlbmFtZSk7Ci0JCQkJKCpkaXIpW2VudHNdLT5sb25nbmFtZSA9IHhzdHJkdXAobG9uZ25hbWUpOwotCQkJCW1lbWNweSgmKCpkaXIpW2VudHNdLT5hLCBhLCBzaXplb2YoKmEpKTsKLQkJCQkoKmRpcilbKytlbnRzXSA9IE5VTEw7Ci0JCQl9Ci0gbmV4dDoKLQkJCXhmcmVlKGZpbGVuYW1lKTsKLQkJCXhmcmVlKGxvbmduYW1lKTsKLQkJfQotCX0KLQotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCWRvX2Nsb3NlKGNvbm4sIGhhbmRsZSwgaGFuZGxlX2xlbik7Ci0JeGZyZWUoaGFuZGxlKTsKLQotCS8qIERvbid0IHJldHVybiBwYXJ0aWFsIG1hdGNoZXMgb24gaW50ZXJydXB0ICovCi0JaWYgKGludGVycnVwdGVkICYmIGRpciAhPSBOVUxMICYmICpkaXIgIT0gTlVMTCkgewotCQlmcmVlX3NmdHBfZGlyZW50cygqZGlyKTsKLQkJKmRpciA9IHhtYWxsb2Moc2l6ZW9mKCoqZGlyKSk7Ci0JCSoqZGlyID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1kb19yZWFkZGlyKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnBhdGgsIFNGVFBfRElSRU5UICoqKmRpcikKLXsKLQlyZXR1cm4oZG9fbHNyZWFkZGlyKGNvbm4sIHBhdGgsIDAsIGRpcikpOwotfQotCi12b2lkIGZyZWVfc2Z0cF9kaXJlbnRzKFNGVFBfRElSRU5UICoqcykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IHNbaV07IGkrKykgewotCQl4ZnJlZShzW2ldLT5maWxlbmFtZSk7Ci0JCXhmcmVlKHNbaV0tPmxvbmduYW1lKTsKLQkJeGZyZWUoc1tpXSk7Ci0JfQotCXhmcmVlKHMpOwotfQotCi1pbnQKLWRvX3JtKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnBhdGgpCi17Ci0JdV9pbnQgc3RhdHVzLCBpZDsKLQotCWRlYnVnMigiU2VuZGluZyBTU0gyX0ZYUF9SRU1PVkUgXCIlc1wiIiwgcGF0aCk7Ci0KLQlpZCA9IGNvbm4tPm1zZ19pZCsrOwotCXNlbmRfc3RyaW5nX3JlcXVlc3QoY29ubiwgaWQsIFNTSDJfRlhQX1JFTU9WRSwgcGF0aCwgc3RybGVuKHBhdGgpKTsKLQlzdGF0dXMgPSBnZXRfc3RhdHVzKGNvbm4sIGlkKTsKLQlpZiAoc3RhdHVzICE9IFNTSDJfRlhfT0spCi0JCWVycm9yKCJDb3VsZG4ndCBkZWxldGUgZmlsZTogJXMiLCBmeDJ0eHQoc3RhdHVzKSk7Ci0JcmV0dXJuKHN0YXR1cyk7Ci19Ci0KLWludAotZG9fbWtkaXIoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqcGF0aCwgQXR0cmliICphLCBpbnQgcHJpbnRmbGFnKQotewotCXVfaW50IHN0YXR1cywgaWQ7Ci0KLQlpZCA9IGNvbm4tPm1zZ19pZCsrOwotCXNlbmRfc3RyaW5nX2F0dHJzX3JlcXVlc3QoY29ubiwgaWQsIFNTSDJfRlhQX01LRElSLCBwYXRoLAotCSAgICBzdHJsZW4ocGF0aCksIGEpOwotCi0Jc3RhdHVzID0gZ2V0X3N0YXR1cyhjb25uLCBpZCk7Ci0JaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LICYmIHByaW50ZmxhZykKLQkJZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBkaXJlY3Rvcnk6ICVzIiwgZngydHh0KHN0YXR1cykpOwotCi0JcmV0dXJuKHN0YXR1cyk7Ci19Ci0KLWludAotZG9fcm1kaXIoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqcGF0aCkKLXsKLQl1X2ludCBzdGF0dXMsIGlkOwotCi0JaWQgPSBjb25uLT5tc2dfaWQrKzsKLQlzZW5kX3N0cmluZ19yZXF1ZXN0KGNvbm4sIGlkLCBTU0gyX0ZYUF9STURJUiwgcGF0aCwKLQkgICAgc3RybGVuKHBhdGgpKTsKLQotCXN0YXR1cyA9IGdldF9zdGF0dXMoY29ubiwgaWQpOwotCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9PSykKLQkJZXJyb3IoIkNvdWxkbid0IHJlbW92ZSBkaXJlY3Rvcnk6ICVzIiwgZngydHh0KHN0YXR1cykpOwotCi0JcmV0dXJuKHN0YXR1cyk7Ci19Ci0KLUF0dHJpYiAqCi1kb19zdGF0KHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnBhdGgsIGludCBxdWlldCkKLXsKLQl1X2ludCBpZDsKLQotCWlkID0gY29ubi0+bXNnX2lkKys7Ci0KLQlzZW5kX3N0cmluZ19yZXF1ZXN0KGNvbm4sIGlkLAotCSAgICBjb25uLT52ZXJzaW9uID09IDAgPyBTU0gyX0ZYUF9TVEFUX1ZFUlNJT05fMCA6IFNTSDJfRlhQX1NUQVQsCi0JICAgIHBhdGgsIHN0cmxlbihwYXRoKSk7Ci0KLQlyZXR1cm4oZ2V0X2RlY29kZV9zdGF0KGNvbm4sIGlkLCBxdWlldCkpOwotfQotCi1BdHRyaWIgKgotZG9fbHN0YXQoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqcGF0aCwgaW50IHF1aWV0KQotewotCXVfaW50IGlkOwotCi0JaWYgKGNvbm4tPnZlcnNpb24gPT0gMCkgewotCQlpZiAocXVpZXQpCi0JCQlkZWJ1ZygiU2VydmVyIHZlcnNpb24gZG9lcyBub3Qgc3VwcG9ydCBsc3RhdCBvcGVyYXRpb24iKTsKLQkJZWxzZQotCQkJbG9naXQoIlNlcnZlciB2ZXJzaW9uIGRvZXMgbm90IHN1cHBvcnQgbHN0YXQgb3BlcmF0aW9uIik7Ci0JCXJldHVybihkb19zdGF0KGNvbm4sIHBhdGgsIHF1aWV0KSk7Ci0JfQotCi0JaWQgPSBjb25uLT5tc2dfaWQrKzsKLQlzZW5kX3N0cmluZ19yZXF1ZXN0KGNvbm4sIGlkLCBTU0gyX0ZYUF9MU1RBVCwgcGF0aCwKLQkgICAgc3RybGVuKHBhdGgpKTsKLQotCXJldHVybihnZXRfZGVjb2RlX3N0YXQoY29ubiwgaWQsIHF1aWV0KSk7Ci19Ci0KLSNpZmRlZiBub3R5ZXQKLUF0dHJpYiAqCi1kb19mc3RhdChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpoYW5kbGUsIHVfaW50IGhhbmRsZV9sZW4sIGludCBxdWlldCkKLXsKLQl1X2ludCBpZDsKLQotCWlkID0gY29ubi0+bXNnX2lkKys7Ci0Jc2VuZF9zdHJpbmdfcmVxdWVzdChjb25uLCBpZCwgU1NIMl9GWFBfRlNUQVQsIGhhbmRsZSwKLQkgICAgaGFuZGxlX2xlbik7Ci0KLQlyZXR1cm4oZ2V0X2RlY29kZV9zdGF0KGNvbm4sIGlkLCBxdWlldCkpOwotfQotI2VuZGlmCi0KLWludAotZG9fc2V0c3RhdChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpwYXRoLCBBdHRyaWIgKmEpCi17Ci0JdV9pbnQgc3RhdHVzLCBpZDsKLQotCWlkID0gY29ubi0+bXNnX2lkKys7Ci0Jc2VuZF9zdHJpbmdfYXR0cnNfcmVxdWVzdChjb25uLCBpZCwgU1NIMl9GWFBfU0VUU1RBVCwgcGF0aCwKLQkgICAgc3RybGVuKHBhdGgpLCBhKTsKLQotCXN0YXR1cyA9IGdldF9zdGF0dXMoY29ubiwgaWQpOwotCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9PSykKLQkJZXJyb3IoIkNvdWxkbid0IHNldHN0YXQgb24gXCIlc1wiOiAlcyIsIHBhdGgsCi0JCSAgICBmeDJ0eHQoc3RhdHVzKSk7Ci0KLQlyZXR1cm4oc3RhdHVzKTsKLX0KLQotaW50Ci1kb19mc2V0c3RhdChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpoYW5kbGUsIHVfaW50IGhhbmRsZV9sZW4sCi0gICAgQXR0cmliICphKQotewotCXVfaW50IHN0YXR1cywgaWQ7Ci0KLQlpZCA9IGNvbm4tPm1zZ19pZCsrOwotCXNlbmRfc3RyaW5nX2F0dHJzX3JlcXVlc3QoY29ubiwgaWQsIFNTSDJfRlhQX0ZTRVRTVEFULCBoYW5kbGUsCi0JICAgIGhhbmRsZV9sZW4sIGEpOwotCi0Jc3RhdHVzID0gZ2V0X3N0YXR1cyhjb25uLCBpZCk7Ci0JaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LKQotCQllcnJvcigiQ291bGRuJ3QgZnNldHN0YXQ6ICVzIiwgZngydHh0KHN0YXR1cykpOwotCi0JcmV0dXJuKHN0YXR1cyk7Ci19Ci0KLWNoYXIgKgotZG9fcmVhbHBhdGgoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqcGF0aCkKLXsKLQlCdWZmZXIgbXNnOwotCXVfaW50IHR5cGUsIGV4cGVjdGVkX2lkLCBjb3VudCwgaWQ7Ci0JY2hhciAqZmlsZW5hbWUsICpsb25nbmFtZTsKLQlBdHRyaWIgKmE7Ci0KLQlleHBlY3RlZF9pZCA9IGlkID0gY29ubi0+bXNnX2lkKys7Ci0Jc2VuZF9zdHJpbmdfcmVxdWVzdChjb25uLCBpZCwgU1NIMl9GWFBfUkVBTFBBVEgsIHBhdGgsCi0JICAgIHN0cmxlbihwYXRoKSk7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQotCWdldF9tc2coY29ubiwgJm1zZyk7Ci0JdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmbXNnKTsKLQlpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOwotCi0JaWYgKGlkICE9IGV4cGVjdGVkX2lkKQotCQlmYXRhbCgiSUQgbWlzbWF0Y2ggKCV1ICE9ICV1KSIsIGlkLCBleHBlY3RlZF9pZCk7Ci0KLQlpZiAodHlwZSA9PSBTU0gyX0ZYUF9TVEFUVVMpIHsKLQkJdV9pbnQgc3RhdHVzID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7Ci0KLQkJZXJyb3IoIkNvdWxkbid0IGNhbm9uaWNhbGlzZTogJXMiLCBmeDJ0eHQoc3RhdHVzKSk7Ci0JCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgaWYgKHR5cGUgIT0gU1NIMl9GWFBfTkFNRSkKLQkJZmF0YWwoIkV4cGVjdGVkIFNTSDJfRlhQX05BTUUoJXUpIHBhY2tldCwgZ290ICV1IiwKLQkJICAgIFNTSDJfRlhQX05BTUUsIHR5cGUpOwotCi0JY291bnQgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKLQlpZiAoY291bnQgIT0gMSkKLQkJZmF0YWwoIkdvdCBtdWx0aXBsZSBuYW1lcyAoJWQpIGZyb20gU1NIX0ZYUF9SRUFMUEFUSCIsIGNvdW50KTsKLQotCWZpbGVuYW1lID0gYnVmZmVyX2dldF9zdHJpbmcoJm1zZywgTlVMTCk7Ci0JbG9uZ25hbWUgPSBidWZmZXJfZ2V0X3N0cmluZygmbXNnLCBOVUxMKTsKLQlhID0gZGVjb2RlX2F0dHJpYigmbXNnKTsKLQotCWRlYnVnMygiU1NIX0ZYUF9SRUFMUEFUSCAlcyAtPiAlcyIsIHBhdGgsIGZpbGVuYW1lKTsKLQotCXhmcmVlKGxvbmduYW1lKTsKLQotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCi0JcmV0dXJuKGZpbGVuYW1lKTsKLX0KLQotaW50Ci1kb19yZW5hbWUoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqb2xkcGF0aCwgY2hhciAqbmV3cGF0aCkKLXsKLQlCdWZmZXIgbXNnOwotCXVfaW50IHN0YXR1cywgaWQ7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQotCS8qIFNlbmQgcmVuYW1lIHJlcXVlc3QgKi8KLQlpZCA9IGNvbm4tPm1zZ19pZCsrOwotCWlmICgoY29ubi0+ZXh0cyAmIFNGVFBfRVhUX1BPU0lYX1JFTkFNRSkpIHsKLQkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfRlhQX0VYVEVOREVEKTsKLQkJYnVmZmVyX3B1dF9pbnQoJm1zZywgaWQpOwotCQlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgInBvc2l4LXJlbmFtZUBvcGVuc3NoLmNvbSIpOwotCX0gZWxzZSB7Ci0JCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9SRU5BTUUpOwotCQlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7Ci0JfQotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBvbGRwYXRoKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgbmV3cGF0aCk7Ci0Jc2VuZF9tc2coY29ubiwgJm1zZyk7Ci0JZGVidWczKCJTZW50IG1lc3NhZ2UgJXMgXCIlc1wiIC0+IFwiJXNcIiIsCi0JICAgIChjb25uLT5leHRzICYgU0ZUUF9FWFRfUE9TSVhfUkVOQU1FKSA/ICJwb3NpeC1yZW5hbWVAb3BlbnNzaC5jb20iIDoKLQkgICAgIlNTSDJfRlhQX1JFTkFNRSIsIG9sZHBhdGgsIG5ld3BhdGgpOwotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCi0Jc3RhdHVzID0gZ2V0X3N0YXR1cyhjb25uLCBpZCk7Ci0JaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LKQotCQllcnJvcigiQ291bGRuJ3QgcmVuYW1lIGZpbGUgXCIlc1wiIHRvIFwiJXNcIjogJXMiLCBvbGRwYXRoLAotCQkgICAgbmV3cGF0aCwgZngydHh0KHN0YXR1cykpOwotCi0JcmV0dXJuKHN0YXR1cyk7Ci19Ci0KLWludAotZG9faGFyZGxpbmsoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqb2xkcGF0aCwgY2hhciAqbmV3cGF0aCkKLXsKLQlCdWZmZXIgbXNnOwotCXVfaW50IHN0YXR1cywgaWQ7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQotCS8qIFNlbmQgbGluayByZXF1ZXN0ICovCi0JaWQgPSBjb25uLT5tc2dfaWQrKzsKLQlpZiAoKGNvbm4tPmV4dHMgJiBTRlRQX0VYVF9IQVJETElOSykgPT0gMCkgewotCQllcnJvcigiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgaGFyZGxpbmtAb3BlbnNzaC5jb20gZXh0ZW5zaW9uIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9GWFBfRVhURU5ERUQpOwotCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGlkKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgImhhcmRsaW5rQG9wZW5zc2guY29tIik7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIG9sZHBhdGgpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBuZXdwYXRoKTsKLQlzZW5kX21zZyhjb25uLCAmbXNnKTsKLQlkZWJ1ZzMoIlNlbnQgbWVzc2FnZSBoYXJkbGlua0BvcGVuc3NoLmNvbSBcIiVzXCIgLT4gXCIlc1wiIiwKLQkgICAgICAgb2xkcGF0aCwgbmV3cGF0aCk7Ci0JYnVmZmVyX2ZyZWUoJm1zZyk7Ci0KLQlzdGF0dXMgPSBnZXRfc3RhdHVzKGNvbm4sIGlkKTsKLQlpZiAoc3RhdHVzICE9IFNTSDJfRlhfT0spCi0JCWVycm9yKCJDb3VsZG4ndCBsaW5rIGZpbGUgXCIlc1wiIHRvIFwiJXNcIjogJXMiLCBvbGRwYXRoLAotCQkgICAgbmV3cGF0aCwgZngydHh0KHN0YXR1cykpOwotCi0JcmV0dXJuKHN0YXR1cyk7Ci19Ci0KLWludAotZG9fc3ltbGluayhzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpvbGRwYXRoLCBjaGFyICpuZXdwYXRoKQotewotCUJ1ZmZlciBtc2c7Ci0JdV9pbnQgc3RhdHVzLCBpZDsKLQotCWlmIChjb25uLT52ZXJzaW9uIDwgMykgewotCQllcnJvcigiVGhpcyBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3ltbGluayBvcGVyYXRpb24iKTsKLQkJcmV0dXJuKFNTSDJfRlhfT1BfVU5TVVBQT1JURUQpOwotCX0KLQotCWJ1ZmZlcl9pbml0KCZtc2cpOwotCi0JLyogU2VuZCBzeW1saW5rIHJlcXVlc3QgKi8KLQlpZCA9IGNvbm4tPm1zZ19pZCsrOwotCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9TWU1MSU5LKTsKLQlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIG9sZHBhdGgpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBuZXdwYXRoKTsKLQlzZW5kX21zZyhjb25uLCAmbXNnKTsKLQlkZWJ1ZzMoIlNlbnQgbWVzc2FnZSBTU0gyX0ZYUF9TWU1MSU5LIFwiJXNcIiAtPiBcIiVzXCIiLCBvbGRwYXRoLAotCSAgICBuZXdwYXRoKTsKLQlidWZmZXJfZnJlZSgmbXNnKTsKLQotCXN0YXR1cyA9IGdldF9zdGF0dXMoY29ubiwgaWQpOwotCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9PSykKLQkJZXJyb3IoIkNvdWxkbid0IHN5bWxpbmsgZmlsZSBcIiVzXCIgdG8gXCIlc1wiOiAlcyIsIG9sZHBhdGgsCi0JCSAgICBuZXdwYXRoLCBmeDJ0eHQoc3RhdHVzKSk7Ci0KLQlyZXR1cm4oc3RhdHVzKTsKLX0KLQotI2lmZGVmIG5vdHlldAotY2hhciAqCi1kb19yZWFkbGluayhzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpwYXRoKQotewotCUJ1ZmZlciBtc2c7Ci0JdV9pbnQgdHlwZSwgZXhwZWN0ZWRfaWQsIGNvdW50LCBpZDsKLQljaGFyICpmaWxlbmFtZSwgKmxvbmduYW1lOwotCUF0dHJpYiAqYTsKLQotCWV4cGVjdGVkX2lkID0gaWQgPSBjb25uLT5tc2dfaWQrKzsKLQlzZW5kX3N0cmluZ19yZXF1ZXN0KGNvbm4sIGlkLCBTU0gyX0ZYUF9SRUFETElOSywgcGF0aCwgc3RybGVuKHBhdGgpKTsKLQotCWJ1ZmZlcl9pbml0KCZtc2cpOwotCi0JZ2V0X21zZyhjb25uLCAmbXNnKTsKLQl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZtc2cpOwotCWlkID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7Ci0KLQlpZiAoaWQgIT0gZXhwZWN0ZWRfaWQpCi0JCWZhdGFsKCJJRCBtaXNtYXRjaCAoJXUgIT0gJXUpIiwgaWQsIGV4cGVjdGVkX2lkKTsKLQotCWlmICh0eXBlID09IFNTSDJfRlhQX1NUQVRVUykgewotCQl1X2ludCBzdGF0dXMgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKLQotCQllcnJvcigiQ291bGRuJ3QgcmVhZGxpbms6ICVzIiwgZngydHh0KHN0YXR1cykpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfSBlbHNlIGlmICh0eXBlICE9IFNTSDJfRlhQX05BTUUpCi0JCWZhdGFsKCJFeHBlY3RlZCBTU0gyX0ZYUF9OQU1FKCV1KSBwYWNrZXQsIGdvdCAldSIsCi0JCSAgICBTU0gyX0ZYUF9OQU1FLCB0eXBlKTsKLQotCWNvdW50ID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7Ci0JaWYgKGNvdW50ICE9IDEpCi0JCWZhdGFsKCJHb3QgbXVsdGlwbGUgbmFtZXMgKCVkKSBmcm9tIFNTSF9GWFBfUkVBRExJTksiLCBjb3VudCk7Ci0KLQlmaWxlbmFtZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtc2csIE5VTEwpOwotCWxvbmduYW1lID0gYnVmZmVyX2dldF9zdHJpbmcoJm1zZywgTlVMTCk7Ci0JYSA9IGRlY29kZV9hdHRyaWIoJm1zZyk7Ci0KLQlkZWJ1ZzMoIlNTSF9GWFBfUkVBRExJTksgJXMgLT4gJXMiLCBwYXRoLCBmaWxlbmFtZSk7Ci0KLQl4ZnJlZShsb25nbmFtZSk7Ci0KLQlidWZmZXJfZnJlZSgmbXNnKTsKLQotCXJldHVybihmaWxlbmFtZSk7Ci19Ci0jZW5kaWYKLQotaW50Ci1kb19zdGF0dmZzKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBzZnRwX3N0YXR2ZnMgKnN0LAotICAgIGludCBxdWlldCkKLXsKLQlCdWZmZXIgbXNnOwotCXVfaW50IGlkOwotCi0JaWYgKChjb25uLT5leHRzICYgU0ZUUF9FWFRfU1RBVFZGUykgPT0gMCkgewotCQllcnJvcigiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc3RhdHZmc0BvcGVuc3NoLmNvbSBleHRlbnNpb24iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlkID0gY29ubi0+bXNnX2lkKys7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQlidWZmZXJfY2xlYXIoJm1zZyk7Ci0JYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfRlhQX0VYVEVOREVEKTsKLQlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csICJzdGF0dmZzQG9wZW5zc2guY29tIik7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIHBhdGgpOwotCXNlbmRfbXNnKGNvbm4sICZtc2cpOwotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCi0JcmV0dXJuIGdldF9kZWNvZGVfc3RhdHZmcyhjb25uLCBzdCwgaWQsIHF1aWV0KTsKLX0KLQotI2lmZGVmIG5vdHlldAotaW50Ci1kb19mc3RhdHZmcyhzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjb25zdCBjaGFyICpoYW5kbGUsIHVfaW50IGhhbmRsZV9sZW4sCi0gICAgc3RydWN0IHNmdHBfc3RhdHZmcyAqc3QsIGludCBxdWlldCkKLXsKLQlCdWZmZXIgbXNnOwotCXVfaW50IGlkOwotCi0JaWYgKChjb25uLT5leHRzICYgU0ZUUF9FWFRfRlNUQVRWRlMpID09IDApIHsKLQkJZXJyb3IoIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IGZzdGF0dmZzQG9wZW5zc2guY29tIGV4dGVuc2lvbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWQgPSBjb25uLT5tc2dfaWQrKzsKLQotCWJ1ZmZlcl9pbml0KCZtc2cpOwotCWJ1ZmZlcl9jbGVhcigmbXNnKTsKLQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9GWFBfRVhURU5ERUQpOwotCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGlkKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgImZzdGF0dmZzQG9wZW5zc2guY29tIik7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgaGFuZGxlLCBoYW5kbGVfbGVuKTsKLQlzZW5kX21zZyhjb25uLCAmbXNnKTsKLQlidWZmZXJfZnJlZSgmbXNnKTsKLQotCXJldHVybiBnZXRfZGVjb2RlX3N0YXR2ZnMoY29ubiwgc3QsIGlkLCBxdWlldCk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXNlbmRfcmVhZF9yZXF1ZXN0KHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIHVfaW50IGlkLCB1X2ludDY0X3Qgb2Zmc2V0LAotICAgIHVfaW50IGxlbiwgY2hhciAqaGFuZGxlLCB1X2ludCBoYW5kbGVfbGVuKQotewotCUJ1ZmZlciBtc2c7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQlidWZmZXJfY2xlYXIoJm1zZyk7Ci0JYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfRlhQX1JFQUQpOwotCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGlkKTsKLQlidWZmZXJfcHV0X3N0cmluZygmbXNnLCBoYW5kbGUsIGhhbmRsZV9sZW4pOwotCWJ1ZmZlcl9wdXRfaW50NjQoJm1zZywgb2Zmc2V0KTsKLQlidWZmZXJfcHV0X2ludCgmbXNnLCBsZW4pOwotCXNlbmRfbXNnKGNvbm4sICZtc2cpOwotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotfQotCi1pbnQKLWRvX2Rvd25sb2FkKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnJlbW90ZV9wYXRoLCBjaGFyICpsb2NhbF9wYXRoLAotICAgIEF0dHJpYiAqYSwgaW50IHBmbGFnKQotewotCUF0dHJpYiBqdW5rOwotCUJ1ZmZlciBtc2c7Ci0JY2hhciAqaGFuZGxlOwotCWludCBsb2NhbF9mZCwgc3RhdHVzID0gMCwgd3JpdGVfZXJyb3I7Ci0JaW50IHJlYWRfZXJyb3IsIHdyaXRlX2Vycm5vOwotCXVfaW50NjRfdCBvZmZzZXQsIHNpemU7Ci0JdV9pbnQgaGFuZGxlX2xlbiwgbW9kZSwgdHlwZSwgaWQsIGJ1ZmxlbiwgbnVtX3JlcSwgbWF4X3JlcTsKLQlvZmZfdCBwcm9ncmVzc19jb3VudGVyOwotCXN0cnVjdCByZXF1ZXN0IHsKLQkJdV9pbnQgaWQ7Ci0JCXVfaW50IGxlbjsKLQkJdV9pbnQ2NF90IG9mZnNldDsKLQkJVEFJTFFfRU5UUlkocmVxdWVzdCkgdHE7Ci0JfTsKLQlUQUlMUV9IRUFEKHJlcWhlYWQsIHJlcXVlc3QpIHJlcXVlc3RzOwotCXN0cnVjdCByZXF1ZXN0ICpyZXE7Ci0KLQlUQUlMUV9JTklUKCZyZXF1ZXN0cyk7Ci0KLQlpZiAoYSA9PSBOVUxMICYmIChhID0gZG9fc3RhdChjb25uLCByZW1vdGVfcGF0aCwgMCkpID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCS8qIERvIG5vdCBwcmVzZXJ2ZSBzZXRbdWddaWQgaGVyZSwgYXMgd2UgZG8gbm90IHByZXNlcnZlIG93bmVyc2hpcCAqLwotCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9QRVJNSVNTSU9OUykKLQkJbW9kZSA9IGEtPnBlcm0gJiAwNzc3OwotCWVsc2UKLQkJbW9kZSA9IDA2NjY7Ci0KLQlpZiAoKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1BFUk1JU1NJT05TKSAmJgotCSAgICAoIVNfSVNSRUcoYS0+cGVybSkpKSB7Ci0JCWVycm9yKCJDYW5ub3QgZG93bmxvYWQgbm9uLXJlZ3VsYXIgZmlsZTogJXMiLCByZW1vdGVfcGF0aCk7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JaWYgKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1NJWkUpCi0JCXNpemUgPSBhLT5zaXplOwotCWVsc2UKLQkJc2l6ZSA9IDA7Ci0KLQlidWZsZW4gPSBjb25uLT50cmFuc2Zlcl9idWZsZW47Ci0JYnVmZmVyX2luaXQoJm1zZyk7Ci0KLQkvKiBTZW5kIG9wZW4gcmVxdWVzdCAqLwotCWlkID0gY29ubi0+bXNnX2lkKys7Ci0JYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfRlhQX09QRU4pOwotCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGlkKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgcmVtb3RlX3BhdGgpOwotCWJ1ZmZlcl9wdXRfaW50KCZtc2csIFNTSDJfRlhGX1JFQUQpOwotCWF0dHJpYl9jbGVhcigmanVuayk7IC8qIFNlbmQgZW1wdHkgYXR0cmlidXRlcyAqLwotCWVuY29kZV9hdHRyaWIoJm1zZywgJmp1bmspOwotCXNlbmRfbXNnKGNvbm4sICZtc2cpOwotCWRlYnVnMygiU2VudCBtZXNzYWdlIFNTSDJfRlhQX09QRU4gSToldSBQOiVzIiwgaWQsIHJlbW90ZV9wYXRoKTsKLQotCWhhbmRsZSA9IGdldF9oYW5kbGUoY29ubiwgaWQsICZoYW5kbGVfbGVuLAotCSAgICAicmVtb3RlIG9wZW4oXCIlc1wiKSIsIHJlbW90ZV9wYXRoKTsKLQlpZiAoaGFuZGxlID09IE5VTEwpIHsKLQkJYnVmZmVyX2ZyZWUoJm1zZyk7Ci0JCXJldHVybigtMSk7Ci0JfQotCi0JbG9jYWxfZmQgPSBvcGVuKGxvY2FsX3BhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsCi0JICAgIG1vZGUgfCBTX0lXVVNSKTsKLQlpZiAobG9jYWxfZmQgPT0gLTEpIHsKLQkJZXJyb3IoIkNvdWxkbid0IG9wZW4gbG9jYWwgZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmc6ICVzIiwKLQkJICAgIGxvY2FsX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWRvX2Nsb3NlKGNvbm4sIGhhbmRsZSwgaGFuZGxlX2xlbik7Ci0JCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCQl4ZnJlZShoYW5kbGUpOwotCQlyZXR1cm4oLTEpOwotCX0KLQotCS8qIFJlYWQgZnJvbSByZW1vdGUgYW5kIHdyaXRlIHRvIGxvY2FsICovCi0Jd3JpdGVfZXJyb3IgPSByZWFkX2Vycm9yID0gd3JpdGVfZXJybm8gPSBudW1fcmVxID0gb2Zmc2V0ID0gMDsKLQltYXhfcmVxID0gMTsKLQlwcm9ncmVzc19jb3VudGVyID0gMDsKLQotCWlmIChzaG93cHJvZ3Jlc3MgJiYgc2l6ZSAhPSAwKQotCQlzdGFydF9wcm9ncmVzc19tZXRlcihyZW1vdGVfcGF0aCwgc2l6ZSwgJnByb2dyZXNzX2NvdW50ZXIpOwotCi0Jd2hpbGUgKG51bV9yZXEgPiAwIHx8IG1heF9yZXEgPiAwKSB7Ci0JCWNoYXIgKmRhdGE7Ci0JCXVfaW50IGxlbjsKLQotCQkvKgotCQkgKiBTaW11bGF0ZSBFT0Ygb24gaW50ZXJydXB0OiBzdG9wIHNlbmRpbmcgbmV3IHJlcXVlc3RzIGFuZAotCQkgKiBhbGxvdyBvdXRzdGFuZGluZyByZXF1ZXN0cyB0byBkcmFpbiBncmFjZWZ1bGx5Ci0JCSAqLwotCQlpZiAoaW50ZXJydXB0ZWQpIHsKLQkJCWlmIChudW1fcmVxID09IDApIC8qIElmIHdlIGhhdmVuJ3Qgc3RhcnRlZCB5ZXQuLi4gKi8KLQkJCQlicmVhazsKLQkJCW1heF9yZXEgPSAwOwotCQl9Ci0KLQkJLyogU2VuZCBzb21lIG1vcmUgcmVxdWVzdHMgKi8KLQkJd2hpbGUgKG51bV9yZXEgPCBtYXhfcmVxKSB7Ci0JCQlkZWJ1ZzMoIlJlcXVlc3QgcmFuZ2UgJWxsdSAtPiAlbGx1ICglZC8lZCkiLAotCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpb2Zmc2V0LAotCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpb2Zmc2V0ICsgYnVmbGVuIC0gMSwKLQkJCSAgICBudW1fcmVxLCBtYXhfcmVxKTsKLQkJCXJlcSA9IHhtYWxsb2Moc2l6ZW9mKCpyZXEpKTsKLQkJCXJlcS0+aWQgPSBjb25uLT5tc2dfaWQrKzsKLQkJCXJlcS0+bGVuID0gYnVmbGVuOwotCQkJcmVxLT5vZmZzZXQgPSBvZmZzZXQ7Ci0JCQlvZmZzZXQgKz0gYnVmbGVuOwotCQkJbnVtX3JlcSsrOwotCQkJVEFJTFFfSU5TRVJUX1RBSUwoJnJlcXVlc3RzLCByZXEsIHRxKTsKLQkJCXNlbmRfcmVhZF9yZXF1ZXN0KGNvbm4sIHJlcS0+aWQsIHJlcS0+b2Zmc2V0LAotCQkJICAgIHJlcS0+bGVuLCBoYW5kbGUsIGhhbmRsZV9sZW4pOwotCQl9Ci0KLQkJYnVmZmVyX2NsZWFyKCZtc2cpOwotCQlnZXRfbXNnKGNvbm4sICZtc2cpOwotCQl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZtc2cpOwotCQlpZCA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOwotCQlkZWJ1ZzMoIlJlY2VpdmVkIHJlcGx5IFQ6JXUgSToldSBSOiVkIiwgdHlwZSwgaWQsIG1heF9yZXEpOwotCi0JCS8qIEZpbmQgdGhlIHJlcXVlc3QgaW4gb3VyIHF1ZXVlICovCi0JCWZvciAocmVxID0gVEFJTFFfRklSU1QoJnJlcXVlc3RzKTsKLQkJICAgIHJlcSAhPSBOVUxMICYmIHJlcS0+aWQgIT0gaWQ7Ci0JCSAgICByZXEgPSBUQUlMUV9ORVhUKHJlcSwgdHEpKQotCQkJOwotCQlpZiAocmVxID09IE5VTEwpCi0JCQlmYXRhbCgiVW5leHBlY3RlZCByZXBseSAldSIsIGlkKTsKLQotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBTU0gyX0ZYUF9TVEFUVVM6Ci0JCQlzdGF0dXMgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKLQkJCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9FT0YpCi0JCQkJcmVhZF9lcnJvciA9IDE7Ci0JCQltYXhfcmVxID0gMDsKLQkJCVRBSUxRX1JFTU9WRSgmcmVxdWVzdHMsIHJlcSwgdHEpOwotCQkJeGZyZWUocmVxKTsKLQkJCW51bV9yZXEtLTsKLQkJCWJyZWFrOwotCQljYXNlIFNTSDJfRlhQX0RBVEE6Ci0JCQlkYXRhID0gYnVmZmVyX2dldF9zdHJpbmcoJm1zZywgJmxlbik7Ci0JCQlkZWJ1ZzMoIlJlY2VpdmVkIGRhdGEgJWxsdSAtPiAlbGx1IiwKLQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXJlcS0+b2Zmc2V0LAotCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVxLT5vZmZzZXQgKyBsZW4gLSAxKTsKLQkJCWlmIChsZW4gPiByZXEtPmxlbikKLQkJCQlmYXRhbCgiUmVjZWl2ZWQgbW9yZSBkYXRhIHRoYW4gYXNrZWQgZm9yICIKLQkJCQkgICAgIiV1ID4gJXUiLCBsZW4sIHJlcS0+bGVuKTsKLQkJCWlmICgobHNlZWsobG9jYWxfZmQsIHJlcS0+b2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEgfHwKLQkJCSAgICBhdG9taWNpbyh2d3JpdGUsIGxvY2FsX2ZkLCBkYXRhLCBsZW4pICE9IGxlbikgJiYKLQkJCSAgICAhd3JpdGVfZXJyb3IpIHsKLQkJCQl3cml0ZV9lcnJubyA9IGVycm5vOwotCQkJCXdyaXRlX2Vycm9yID0gMTsKLQkJCQltYXhfcmVxID0gMDsKLQkJCX0KLQkJCXByb2dyZXNzX2NvdW50ZXIgKz0gbGVuOwotCQkJeGZyZWUoZGF0YSk7Ci0KLQkJCWlmIChsZW4gPT0gcmVxLT5sZW4pIHsKLQkJCQlUQUlMUV9SRU1PVkUoJnJlcXVlc3RzLCByZXEsIHRxKTsKLQkJCQl4ZnJlZShyZXEpOwotCQkJCW51bV9yZXEtLTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogUmVzZW5kIHRoZSByZXF1ZXN0IGZvciB0aGUgbWlzc2luZyBkYXRhICovCi0JCQkJZGVidWczKCJTaG9ydCBkYXRhIGJsb2NrLCByZS1yZXF1ZXN0aW5nICIKLQkJCQkgICAgIiVsbHUgLT4gJWxsdSAoJTJkKSIsCi0JCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVxLT5vZmZzZXQgKyBsZW4sCi0JCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVxLT5vZmZzZXQgKwotCQkJCSAgICByZXEtPmxlbiAtIDEsIG51bV9yZXEpOwotCQkJCXJlcS0+aWQgPSBjb25uLT5tc2dfaWQrKzsKLQkJCQlyZXEtPmxlbiAtPSBsZW47Ci0JCQkJcmVxLT5vZmZzZXQgKz0gbGVuOwotCQkJCXNlbmRfcmVhZF9yZXF1ZXN0KGNvbm4sIHJlcS0+aWQsCi0JCQkJICAgIHJlcS0+b2Zmc2V0LCByZXEtPmxlbiwgaGFuZGxlLCBoYW5kbGVfbGVuKTsKLQkJCQkvKiBSZWR1Y2UgdGhlIHJlcXVlc3Qgc2l6ZSAqLwotCQkJCWlmIChsZW4gPCBidWZsZW4pCi0JCQkJCWJ1ZmxlbiA9IE1BWChNSU5fUkVBRF9TSVpFLCBsZW4pOwotCQkJfQotCQkJaWYgKG1heF9yZXEgPiAwKSB7IC8qIG1heF9yZXEgPSAwIGlmZiBFT0YgcmVjZWl2ZWQgKi8KLQkJCQlpZiAoc2l6ZSA+IDAgJiYgb2Zmc2V0ID4gc2l6ZSkgewotCQkJCQkvKiBPbmx5IG9uZSByZXF1ZXN0IGF0IGEgdGltZQotCQkJCQkgKiBhZnRlciB0aGUgZXhwZWN0ZWQgRU9GICovCi0JCQkJCWRlYnVnMygiRmluaXNoIGF0ICVsbHUgKCUyZCkiLAotCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmZzZXQsCi0JCQkJCSAgICBudW1fcmVxKTsKLQkJCQkJbWF4X3JlcSA9IDE7Ci0JCQkJfSBlbHNlIGlmIChtYXhfcmVxIDw9IGNvbm4tPm51bV9yZXF1ZXN0cykgewotCQkJCQkrK21heF9yZXE7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlmYXRhbCgiRXhwZWN0ZWQgU1NIMl9GWFBfREFUQSgldSkgcGFja2V0LCBnb3QgJXUiLAotCQkJICAgIFNTSDJfRlhQX0RBVEEsIHR5cGUpOwotCQl9Ci0JfQotCi0JaWYgKHNob3dwcm9ncmVzcyAmJiBzaXplKQotCQlzdG9wX3Byb2dyZXNzX21ldGVyKCk7Ci0KLQkvKiBTYW5pdHkgY2hlY2sgKi8KLQlpZiAoVEFJTFFfRklSU1QoJnJlcXVlc3RzKSAhPSBOVUxMKQotCQlmYXRhbCgiVHJhbnNmZXIgY29tcGxldGUsIGJ1dCByZXF1ZXN0cyBzdGlsbCBpbiBxdWV1ZSIpOwotCi0JaWYgKHJlYWRfZXJyb3IpIHsKLQkJZXJyb3IoIkNvdWxkbid0IHJlYWQgZnJvbSByZW1vdGUgZmlsZSBcIiVzXCIgOiAlcyIsCi0JCSAgICByZW1vdGVfcGF0aCwgZngydHh0KHN0YXR1cykpOwotCQlkb19jbG9zZShjb25uLCBoYW5kbGUsIGhhbmRsZV9sZW4pOwotCX0gZWxzZSBpZiAod3JpdGVfZXJyb3IpIHsKLQkJZXJyb3IoIkNvdWxkbid0IHdyaXRlIHRvIFwiJXNcIjogJXMiLCBsb2NhbF9wYXRoLAotCQkgICAgc3RyZXJyb3Iod3JpdGVfZXJybm8pKTsKLQkJc3RhdHVzID0gLTE7Ci0JCWRvX2Nsb3NlKGNvbm4sIGhhbmRsZSwgaGFuZGxlX2xlbik7Ci0JfSBlbHNlIHsKLQkJc3RhdHVzID0gZG9fY2xvc2UoY29ubiwgaGFuZGxlLCBoYW5kbGVfbGVuKTsKLQotCQkvKiBPdmVycmlkZSB1bWFzayBhbmQgdXRpbWVzIGlmIGFza2VkICovCi0jaWZkZWYgSEFWRV9GQ0hNT0QKLQkJaWYgKHBmbGFnICYmIGZjaG1vZChsb2NhbF9mZCwgbW9kZSkgPT0gLTEpCi0jZWxzZQotCQlpZiAocGZsYWcgJiYgY2htb2QobG9jYWxfcGF0aCwgbW9kZSkgPT0gLTEpCi0jZW5kaWYgLyogSEFWRV9GQ0hNT0QgKi8KLQkJCWVycm9yKCJDb3VsZG4ndCBzZXQgbW9kZSBvbiBcIiVzXCI6ICVzIiwgbG9jYWxfcGF0aCwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQlpZiAocGZsYWcgJiYgKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX0FDTU9EVElNRSkpIHsKLQkJCXN0cnVjdCB0aW1ldmFsIHR2WzJdOwotCQkJdHZbMF0udHZfc2VjID0gYS0+YXRpbWU7Ci0JCQl0dlsxXS50dl9zZWMgPSBhLT5tdGltZTsKLQkJCXR2WzBdLnR2X3VzZWMgPSB0dlsxXS50dl91c2VjID0gMDsKLQkJCWlmICh1dGltZXMobG9jYWxfcGF0aCwgdHYpID09IC0xKQotCQkJCWVycm9yKCJDYW4ndCBzZXQgdGltZXMgb24gXCIlc1wiOiAlcyIsCi0JCQkJICAgIGxvY2FsX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0JCX0KLQl9Ci0JY2xvc2UobG9jYWxfZmQpOwotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCXhmcmVlKGhhbmRsZSk7Ci0KLQlyZXR1cm4oc3RhdHVzKTsKLX0KLQotc3RhdGljIGludAotZG93bmxvYWRfZGlyX2ludGVybmFsKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnNyYywgY2hhciAqZHN0LAotICAgIEF0dHJpYiAqZGlyYXR0cmliLCBpbnQgcGZsYWcsIGludCBwcmludGZsYWcsIGludCBkZXB0aCkKLXsKLQlpbnQgaSwgcmV0ID0gMDsKLQlTRlRQX0RJUkVOVCAqKmRpcl9lbnRyaWVzOwotCWNoYXIgKmZpbGVuYW1lLCAqbmV3X3NyYywgKm5ld19kc3Q7Ci0JbW9kZV90IG1vZGUgPSAwNzc3OwotCi0JaWYgKGRlcHRoID49IE1BWF9ESVJfREVQVEgpIHsKLQkJZXJyb3IoIk1heGltdW0gZGlyZWN0b3J5IGRlcHRoIGV4Y2VlZGVkOiAlZCBsZXZlbHMiLCBkZXB0aCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoZGlyYXR0cmliID09IE5VTEwgJiYKLQkgICAgKGRpcmF0dHJpYiA9IGRvX3N0YXQoY29ubiwgc3JjLCAxKSkgPT0gTlVMTCkgewotCQllcnJvcigiVW5hYmxlIHRvIHN0YXQgcmVtb3RlIGRpcmVjdG9yeSBcIiVzXCIiLCBzcmMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghU19JU0RJUihkaXJhdHRyaWItPnBlcm0pKSB7Ci0JCWVycm9yKCJcIiVzXCIgaXMgbm90IGEgZGlyZWN0b3J5Iiwgc3JjKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocHJpbnRmbGFnKQotCQlwcmludGYoIlJldHJpZXZpbmcgJXNcbiIsIHNyYyk7Ci0KLQlpZiAoZGlyYXR0cmliLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9QRVJNSVNTSU9OUykKLQkJbW9kZSA9IGRpcmF0dHJpYi0+cGVybSAmIDAxNzc3OwotCWVsc2UgewotCQlkZWJ1ZygiU2VydmVyIGRpZCBub3Qgc2VuZCBwZXJtaXNzaW9ucyBmb3IgIgotCQkgICAgImRpcmVjdG9yeSBcIiVzXCIiLCBkc3QpOwotCX0KLQotCWlmIChta2Rpcihkc3QsIG1vZGUpID09IC0xICYmIGVycm5vICE9IEVFWElTVCkgewotCQllcnJvcigibWtkaXIgJXM6ICVzIiwgZHN0LCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGRvX3JlYWRkaXIoY29ubiwgc3JjLCAmZGlyX2VudHJpZXMpID09IC0xKSB7Ci0JCWVycm9yKCIlczogRmFpbGVkIHRvIGdldCBkaXJlY3RvcnkgY29udGVudHMiLCBzcmMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZm9yIChpID0gMDsgZGlyX2VudHJpZXNbaV0gIT0gTlVMTCAmJiAhaW50ZXJydXB0ZWQ7IGkrKykgewotCQlmaWxlbmFtZSA9IGRpcl9lbnRyaWVzW2ldLT5maWxlbmFtZTsKLQotCQluZXdfZHN0ID0gcGF0aF9hcHBlbmQoZHN0LCBmaWxlbmFtZSk7Ci0JCW5ld19zcmMgPSBwYXRoX2FwcGVuZChzcmMsIGZpbGVuYW1lKTsKLQotCQlpZiAoU19JU0RJUihkaXJfZW50cmllc1tpXS0+YS5wZXJtKSkgewotCQkJaWYgKHN0cmNtcChmaWxlbmFtZSwgIi4iKSA9PSAwIHx8Ci0JCQkgICAgc3RyY21wKGZpbGVuYW1lLCAiLi4iKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGRvd25sb2FkX2Rpcl9pbnRlcm5hbChjb25uLCBuZXdfc3JjLCBuZXdfZHN0LAotCQkJICAgICYoZGlyX2VudHJpZXNbaV0tPmEpLCBwZmxhZywgcHJpbnRmbGFnLAotCQkJICAgIGRlcHRoICsgMSkgPT0gLTEpCi0JCQkJcmV0ID0gLTE7Ci0JCX0gZWxzZSBpZiAoU19JU1JFRyhkaXJfZW50cmllc1tpXS0+YS5wZXJtKSApIHsKLQkJCWlmIChkb19kb3dubG9hZChjb25uLCBuZXdfc3JjLCBuZXdfZHN0LAotCQkJICAgICYoZGlyX2VudHJpZXNbaV0tPmEpLCBwZmxhZykgPT0gLTEpIHsKLQkJCQllcnJvcigiRG93bmxvYWQgb2YgZmlsZSAlcyB0byAlcyBmYWlsZWQiLAotCQkJCSAgICBuZXdfc3JjLCBuZXdfZHN0KTsKLQkJCQlyZXQgPSAtMTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlsb2dpdCgiJXM6IG5vdCBhIHJlZ3VsYXIgZmlsZVxuIiwgbmV3X3NyYyk7Ci0KLQkJeGZyZWUobmV3X2RzdCk7Ci0JCXhmcmVlKG5ld19zcmMpOwotCX0KLQotCWlmIChwZmxhZykgewotCQlpZiAoZGlyYXR0cmliLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9BQ01PRFRJTUUpIHsKLQkJCXN0cnVjdCB0aW1ldmFsIHR2WzJdOwotCQkJdHZbMF0udHZfc2VjID0gZGlyYXR0cmliLT5hdGltZTsKLQkJCXR2WzFdLnR2X3NlYyA9IGRpcmF0dHJpYi0+bXRpbWU7Ci0JCQl0dlswXS50dl91c2VjID0gdHZbMV0udHZfdXNlYyA9IDA7Ci0JCQlpZiAodXRpbWVzKGRzdCwgdHYpID09IC0xKQotCQkJCWVycm9yKCJDYW4ndCBzZXQgdGltZXMgb24gXCIlc1wiOiAlcyIsCi0JCQkJICAgIGRzdCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJfSBlbHNlCi0JCQlkZWJ1ZygiU2VydmVyIGRpZCBub3Qgc2VuZCB0aW1lcyBmb3IgZGlyZWN0b3J5ICIKLQkJCSAgICAiXCIlc1wiIiwgZHN0KTsKLQl9Ci0KLQlmcmVlX3NmdHBfZGlyZW50cyhkaXJfZW50cmllcyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQKLWRvd25sb2FkX2RpcihzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKLSAgICBBdHRyaWIgKmRpcmF0dHJpYiwgaW50IHBmbGFnLCBpbnQgcHJpbnRmbGFnKQotewotCWNoYXIgKnNyY19jYW5vbjsKLQlpbnQgcmV0OwotCi0JaWYgKChzcmNfY2Fub24gPSBkb19yZWFscGF0aChjb25uLCBzcmMpKSA9PSBOVUxMKSB7Ci0JCWVycm9yKCJVbmFibGUgdG8gY2Fub25pY2FsaXNlIHBhdGggXCIlc1wiIiwgc3JjKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldCA9IGRvd25sb2FkX2Rpcl9pbnRlcm5hbChjb25uLCBzcmNfY2Fub24sIGRzdCwKLQkgICAgZGlyYXR0cmliLCBwZmxhZywgcHJpbnRmbGFnLCAwKTsKLQl4ZnJlZShzcmNfY2Fub24pOwotCXJldHVybiByZXQ7Ci19Ci0KLWludAotZG9fdXBsb2FkKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKmxvY2FsX3BhdGgsIGNoYXIgKnJlbW90ZV9wYXRoLAotICAgIGludCBwZmxhZykKLXsKLQlpbnQgbG9jYWxfZmQ7Ci0JaW50IHN0YXR1cyA9IFNTSDJfRlhfT0s7Ci0JdV9pbnQgaGFuZGxlX2xlbiwgaWQsIHR5cGU7Ci0Jb2ZmX3Qgb2Zmc2V0OwotCWNoYXIgKmhhbmRsZSwgKmRhdGE7Ci0JQnVmZmVyIG1zZzsKLQlzdHJ1Y3Qgc3RhdCBzYjsKLQlBdHRyaWIgYTsKLQl1X2ludDMyX3Qgc3RhcnRpZDsKLQl1X2ludDMyX3QgYWNraWQ7Ci0Jc3RydWN0IG91dHN0YW5kaW5nX2FjayB7Ci0JCXVfaW50IGlkOwotCQl1X2ludCBsZW47Ci0JCW9mZl90IG9mZnNldDsKLQkJVEFJTFFfRU5UUlkob3V0c3RhbmRpbmdfYWNrKSB0cTsKLQl9OwotCVRBSUxRX0hFQUQoYWNraGVhZCwgb3V0c3RhbmRpbmdfYWNrKSBhY2tzOwotCXN0cnVjdCBvdXRzdGFuZGluZ19hY2sgKmFjayA9IE5VTEw7Ci0KLQlUQUlMUV9JTklUKCZhY2tzKTsKLQotCWlmICgobG9jYWxfZmQgPSBvcGVuKGxvY2FsX3BhdGgsIE9fUkRPTkxZLCAwKSkgPT0gLTEpIHsKLQkJZXJyb3IoIkNvdWxkbid0IG9wZW4gbG9jYWwgZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmc6ICVzIiwKLQkJICAgIGxvY2FsX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybigtMSk7Ci0JfQotCWlmIChmc3RhdChsb2NhbF9mZCwgJnNiKSA9PSAtMSkgewotCQllcnJvcigiQ291bGRuJ3QgZnN0YXQgbG9jYWwgZmlsZSBcIiVzXCI6ICVzIiwKLQkJICAgIGxvY2FsX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWNsb3NlKGxvY2FsX2ZkKTsKLQkJcmV0dXJuKC0xKTsKLQl9Ci0JaWYgKCFTX0lTUkVHKHNiLnN0X21vZGUpKSB7Ci0JCWVycm9yKCIlcyBpcyBub3QgYSByZWd1bGFyIGZpbGUiLCBsb2NhbF9wYXRoKTsKLQkJY2xvc2UobG9jYWxfZmQpOwotCQlyZXR1cm4oLTEpOwotCX0KLQlzdGF0X3RvX2F0dHJpYigmc2IsICZhKTsKLQotCWEuZmxhZ3MgJj0gflNTSDJfRklMRVhGRVJfQVRUUl9TSVpFOwotCWEuZmxhZ3MgJj0gflNTSDJfRklMRVhGRVJfQVRUUl9VSURHSUQ7Ci0JYS5wZXJtICY9IDA3Nzc7Ci0JaWYgKCFwZmxhZykKLQkJYS5mbGFncyAmPSB+U1NIMl9GSUxFWEZFUl9BVFRSX0FDTU9EVElNRTsKLQotCWJ1ZmZlcl9pbml0KCZtc2cpOwotCi0JLyogU2VuZCBvcGVuIHJlcXVlc3QgKi8KLQlpZCA9IGNvbm4tPm1zZ19pZCsrOwotCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9PUEVOKTsKLQlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIHJlbW90ZV9wYXRoKTsKLQlidWZmZXJfcHV0X2ludCgmbXNnLCBTU0gyX0ZYRl9XUklURXxTU0gyX0ZYRl9DUkVBVHxTU0gyX0ZYRl9UUlVOQyk7Ci0JZW5jb2RlX2F0dHJpYigmbXNnLCAmYSk7Ci0Jc2VuZF9tc2coY29ubiwgJm1zZyk7Ci0JZGVidWczKCJTZW50IG1lc3NhZ2UgU1NIMl9GWFBfT1BFTiBJOiV1IFA6JXMiLCBpZCwgcmVtb3RlX3BhdGgpOwotCi0JYnVmZmVyX2NsZWFyKCZtc2cpOwotCi0JaGFuZGxlID0gZ2V0X2hhbmRsZShjb25uLCBpZCwgJmhhbmRsZV9sZW4sCi0JICAgICJyZW1vdGUgb3BlbihcIiVzXCIpIiwgcmVtb3RlX3BhdGgpOwotCWlmIChoYW5kbGUgPT0gTlVMTCkgewotCQljbG9zZShsb2NhbF9mZCk7Ci0JCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc3RhcnRpZCA9IGFja2lkID0gaWQgKyAxOwotCWRhdGEgPSB4bWFsbG9jKGNvbm4tPnRyYW5zZmVyX2J1Zmxlbik7Ci0KLQkvKiBSZWFkIGZyb20gbG9jYWwgYW5kIHdyaXRlIHRvIHJlbW90ZSAqLwotCW9mZnNldCA9IDA7Ci0JaWYgKHNob3dwcm9ncmVzcykKLQkJc3RhcnRfcHJvZ3Jlc3NfbWV0ZXIobG9jYWxfcGF0aCwgc2Iuc3Rfc2l6ZSwgJm9mZnNldCk7Ci0KLQlmb3IgKDs7KSB7Ci0JCWludCBsZW47Ci0KLQkJLyoKLQkJICogQ2FuJ3QgdXNlIGF0b21pY2lvIGhlcmUgYmVjYXVzZSBpdCByZXR1cm5zIDAgb24gRU9GLAotCQkgKiB0aHVzIGxvc2luZyB0aGUgbGFzdCBibG9jayBvZiB0aGUgZmlsZS4KLQkJICogU2ltdWxhdGUgYW4gRU9GIG9uIGludGVycnVwdCwgYWxsb3dpbmcgQUNLcyBmcm9tIHRoZQotCQkgKiBzZXJ2ZXIgdG8gZHJhaW4uCi0JCSAqLwotCQlpZiAoaW50ZXJydXB0ZWQgfHwgc3RhdHVzICE9IFNTSDJfRlhfT0spCi0JCQlsZW4gPSAwOwotCQllbHNlIGRvCi0JCQlsZW4gPSByZWFkKGxvY2FsX2ZkLCBkYXRhLCBjb25uLT50cmFuc2Zlcl9idWZsZW4pOwotCQl3aGlsZSAoKGxlbiA9PSAtMSkgJiYKLQkJICAgIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spKTsKLQotCQlpZiAobGVuID09IC0xKQotCQkJZmF0YWwoIkNvdWxkbid0IHJlYWQgZnJvbSBcIiVzXCI6ICVzIiwgbG9jYWxfcGF0aCwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCi0JCWlmIChsZW4gIT0gMCkgewotCQkJYWNrID0geG1hbGxvYyhzaXplb2YoKmFjaykpOwotCQkJYWNrLT5pZCA9ICsraWQ7Ci0JCQlhY2stPm9mZnNldCA9IG9mZnNldDsKLQkJCWFjay0+bGVuID0gbGVuOwotCQkJVEFJTFFfSU5TRVJUX1RBSUwoJmFja3MsIGFjaywgdHEpOwotCi0JCQlidWZmZXJfY2xlYXIoJm1zZyk7Ci0JCQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9GWFBfV1JJVEUpOwotCQkJYnVmZmVyX3B1dF9pbnQoJm1zZywgYWNrLT5pZCk7Ci0JCQlidWZmZXJfcHV0X3N0cmluZygmbXNnLCBoYW5kbGUsIGhhbmRsZV9sZW4pOwotCQkJYnVmZmVyX3B1dF9pbnQ2NCgmbXNnLCBvZmZzZXQpOwotCQkJYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgZGF0YSwgbGVuKTsKLQkJCXNlbmRfbXNnKGNvbm4sICZtc2cpOwotCQkJZGVidWczKCJTZW50IG1lc3NhZ2UgU1NIMl9GWFBfV1JJVEUgSToldSBPOiVsbHUgUzoldSIsCi0JCQkgICAgaWQsICh1bnNpZ25lZCBsb25nIGxvbmcpb2Zmc2V0LCBsZW4pOwotCQl9IGVsc2UgaWYgKFRBSUxRX0ZJUlNUKCZhY2tzKSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGFjayA9PSBOVUxMKQotCQkJZmF0YWwoIlVuZXhwZWN0ZWQgQUNLICV1IiwgaWQpOwotCi0JCWlmIChpZCA9PSBzdGFydGlkIHx8IGxlbiA9PSAwIHx8Ci0JCSAgICBpZCAtIGFja2lkID49IGNvbm4tPm51bV9yZXF1ZXN0cykgewotCQkJdV9pbnQgcl9pZDsKLQotCQkJYnVmZmVyX2NsZWFyKCZtc2cpOwotCQkJZ2V0X21zZyhjb25uLCAmbXNnKTsKLQkJCXR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJm1zZyk7Ci0JCQlyX2lkID0gYnVmZmVyX2dldF9pbnQoJm1zZyk7Ci0KLQkJCWlmICh0eXBlICE9IFNTSDJfRlhQX1NUQVRVUykKLQkJCQlmYXRhbCgiRXhwZWN0ZWQgU1NIMl9GWFBfU1RBVFVTKCVkKSBwYWNrZXQsICIKLQkJCQkgICAgImdvdCAlZCIsIFNTSDJfRlhQX1NUQVRVUywgdHlwZSk7Ci0KLQkJCXN0YXR1cyA9IGJ1ZmZlcl9nZXRfaW50KCZtc2cpOwotCQkJZGVidWczKCJTU0gyX0ZYUF9TVEFUVVMgJWQiLCBzdGF0dXMpOwotCi0JCQkvKiBGaW5kIHRoZSByZXF1ZXN0IGluIG91ciBxdWV1ZSAqLwotCQkJZm9yIChhY2sgPSBUQUlMUV9GSVJTVCgmYWNrcyk7Ci0JCQkgICAgYWNrICE9IE5VTEwgJiYgYWNrLT5pZCAhPSByX2lkOwotCQkJICAgIGFjayA9IFRBSUxRX05FWFQoYWNrLCB0cSkpCi0JCQkJOwotCQkJaWYgKGFjayA9PSBOVUxMKQotCQkJCWZhdGFsKCJDYW4ndCBmaW5kIHJlcXVlc3QgZm9yIElEICV1Iiwgcl9pZCk7Ci0JCQlUQUlMUV9SRU1PVkUoJmFja3MsIGFjaywgdHEpOwotCQkJZGVidWczKCJJbiB3cml0ZSBsb29wLCBhY2sgZm9yICV1ICV1IGJ5dGVzIGF0ICVsbGQiLAotCQkJICAgIGFjay0+aWQsIGFjay0+bGVuLCAobG9uZyBsb25nKWFjay0+b2Zmc2V0KTsKLQkJCSsrYWNraWQ7Ci0JCQl4ZnJlZShhY2spOwotCQl9Ci0JCW9mZnNldCArPSBsZW47Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJZmF0YWwoIiVzOiBvZmZzZXQgPCAwIiwgX19mdW5jX18pOwotCX0KLQlidWZmZXJfZnJlZSgmbXNnKTsKLQotCWlmIChzaG93cHJvZ3Jlc3MpCi0JCXN0b3BfcHJvZ3Jlc3NfbWV0ZXIoKTsKLQl4ZnJlZShkYXRhKTsKLQotCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9PSykgewotCQllcnJvcigiQ291bGRuJ3Qgd3JpdGUgdG8gcmVtb3RlIGZpbGUgXCIlc1wiOiAlcyIsCi0JCSAgICByZW1vdGVfcGF0aCwgZngydHh0KHN0YXR1cykpOwotCQlzdGF0dXMgPSAtMTsKLQl9Ci0KLQlpZiAoY2xvc2UobG9jYWxfZmQpID09IC0xKSB7Ci0JCWVycm9yKCJDb3VsZG4ndCBjbG9zZSBsb2NhbCBmaWxlIFwiJXNcIjogJXMiLCBsb2NhbF9wYXRoLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJc3RhdHVzID0gLTE7Ci0JfQotCi0JLyogT3ZlcnJpZGUgdW1hc2sgYW5kIHV0aW1lcyBpZiBhc2tlZCAqLwotCWlmIChwZmxhZykKLQkJZG9fZnNldHN0YXQoY29ubiwgaGFuZGxlLCBoYW5kbGVfbGVuLCAmYSk7Ci0KLQlpZiAoZG9fY2xvc2UoY29ubiwgaGFuZGxlLCBoYW5kbGVfbGVuKSAhPSBTU0gyX0ZYX09LKQotCQlzdGF0dXMgPSAtMTsKLQl4ZnJlZShoYW5kbGUpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludAotdXBsb2FkX2Rpcl9pbnRlcm5hbChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKLSAgICBpbnQgcGZsYWcsIGludCBwcmludGZsYWcsIGludCBkZXB0aCkKLXsKLQlpbnQgcmV0ID0gMCwgc3RhdHVzOwotCURJUiAqZGlycDsKLQlzdHJ1Y3QgZGlyZW50ICpkcDsKLQljaGFyICpmaWxlbmFtZSwgKm5ld19zcmMsICpuZXdfZHN0OwotCXN0cnVjdCBzdGF0IHNiOwotCUF0dHJpYiBhOwotCi0JaWYgKGRlcHRoID49IE1BWF9ESVJfREVQVEgpIHsKLQkJZXJyb3IoIk1heGltdW0gZGlyZWN0b3J5IGRlcHRoIGV4Y2VlZGVkOiAlZCBsZXZlbHMiLCBkZXB0aCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoc3RhdChzcmMsICZzYikgPT0gLTEpIHsKLQkJZXJyb3IoIkNvdWxkbid0IHN0YXQgZGlyZWN0b3J5IFwiJXNcIjogJXMiLAotCQkgICAgc3JjLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghU19JU0RJUihzYi5zdF9tb2RlKSkgewotCQllcnJvcigiXCIlc1wiIGlzIG5vdCBhIGRpcmVjdG9yeSIsIHNyYyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHByaW50ZmxhZykKLQkJcHJpbnRmKCJFbnRlcmluZyAlc1xuIiwgc3JjKTsKLQotCWF0dHJpYl9jbGVhcigmYSk7Ci0Jc3RhdF90b19hdHRyaWIoJnNiLCAmYSk7Ci0JYS5mbGFncyAmPSB+U1NIMl9GSUxFWEZFUl9BVFRSX1NJWkU7Ci0JYS5mbGFncyAmPSB+U1NIMl9GSUxFWEZFUl9BVFRSX1VJREdJRDsKLQlhLnBlcm0gJj0gMDE3Nzc7Ci0JaWYgKCFwZmxhZykKLQkJYS5mbGFncyAmPSB+U1NIMl9GSUxFWEZFUl9BVFRSX0FDTU9EVElNRTsKLQkKLQlzdGF0dXMgPSBkb19ta2Rpcihjb25uLCBkc3QsICZhLCAwKTsKLQkvKgotCSAqIHdlIGxhY2sgYSBwb3J0YWJsZSBzdGF0dXMgZm9yIGVycm5vIEVFWElTVCwKLQkgKiBzbyBpZiB3ZSBnZXQgYSBTU0gyX0ZYX0ZBSUxVUkUgYmFjayB3ZSBtdXN0IGNoZWNrCi0JICogaWYgaXQgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgotCSAqLwotCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9PSykgewotCQlpZiAoc3RhdHVzICE9IFNTSDJfRlhfRkFJTFVSRSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKGRvX3N0YXQoY29ubiwgZHN0LCAwKSA9PSBOVUxMKSAKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoKGRpcnAgPSBvcGVuZGlyKHNyYykpID09IE5VTEwpIHsKLQkJZXJyb3IoIkZhaWxlZCB0byBvcGVuIGRpciBcIiVzXCI6ICVzIiwgc3JjLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXdoaWxlICgoKGRwID0gcmVhZGRpcihkaXJwKSkgIT0gTlVMTCkgJiYgIWludGVycnVwdGVkKSB7Ci0JCWlmIChkcC0+ZF9pbm8gPT0gMCkKLQkJCWNvbnRpbnVlOwotCQlmaWxlbmFtZSA9IGRwLT5kX25hbWU7Ci0JCW5ld19kc3QgPSBwYXRoX2FwcGVuZChkc3QsIGZpbGVuYW1lKTsKLQkJbmV3X3NyYyA9IHBhdGhfYXBwZW5kKHNyYywgZmlsZW5hbWUpOwotCi0JCWlmIChsc3RhdChuZXdfc3JjLCAmc2IpID09IC0xKSB7Ci0JCQlsb2dpdCgiJXM6IGxzdGF0IGZhaWxlZDogJXMiLCBmaWxlbmFtZSwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQkJcmV0ID0gLTE7Ci0JCX0gZWxzZSBpZiAoU19JU0RJUihzYi5zdF9tb2RlKSkgewotCQkJaWYgKHN0cmNtcChmaWxlbmFtZSwgIi4iKSA9PSAwIHx8Ci0JCQkgICAgc3RyY21wKGZpbGVuYW1lLCAiLi4iKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAodXBsb2FkX2Rpcl9pbnRlcm5hbChjb25uLCBuZXdfc3JjLCBuZXdfZHN0LAotCQkJICAgIHBmbGFnLCBwcmludGZsYWcsIGRlcHRoICsgMSkgPT0gLTEpCi0JCQkJcmV0ID0gLTE7Ci0JCX0gZWxzZSBpZiAoU19JU1JFRyhzYi5zdF9tb2RlKSkgewotCQkJaWYgKGRvX3VwbG9hZChjb25uLCBuZXdfc3JjLCBuZXdfZHN0LCBwZmxhZykgPT0gLTEpIHsKLQkJCQllcnJvcigiVXBsb2FkaW5nIG9mIGZpbGUgJXMgdG8gJXMgZmFpbGVkISIsCi0JCQkJICAgIG5ld19zcmMsIG5ld19kc3QpOwotCQkJCXJldCA9IC0xOwotCQkJfQotCQl9IGVsc2UKLQkJCWxvZ2l0KCIlczogbm90IGEgcmVndWxhciBmaWxlXG4iLCBmaWxlbmFtZSk7Ci0JCXhmcmVlKG5ld19kc3QpOwotCQl4ZnJlZShuZXdfc3JjKTsKLQl9Ci0KLQlkb19zZXRzdGF0KGNvbm4sIGRzdCwgJmEpOwotCi0JKHZvaWQpIGNsb3NlZGlyKGRpcnApOwotCXJldHVybiByZXQ7Ci19Ci0KLWludAotdXBsb2FkX2RpcihzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IHByaW50ZmxhZywKLSAgICBpbnQgcGZsYWcpCi17Ci0JY2hhciAqZHN0X2Nhbm9uOwotCWludCByZXQ7Ci0KLQlpZiAoKGRzdF9jYW5vbiA9IGRvX3JlYWxwYXRoKGNvbm4sIGRzdCkpID09IE5VTEwpIHsKLQkJZXJyb3IoIlVuYWJsZSB0byBjYW5vbmljYWxpc2UgcGF0aCBcIiVzXCIiLCBkc3QpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0ID0gdXBsb2FkX2Rpcl9pbnRlcm5hbChjb25uLCBzcmMsIGRzdF9jYW5vbiwgcGZsYWcsIHByaW50ZmxhZywgMCk7Ci0JeGZyZWUoZHN0X2Nhbm9uKTsKLQlyZXR1cm4gcmV0OwotfQotCi1jaGFyICoKLXBhdGhfYXBwZW5kKGNoYXIgKnAxLCBjaGFyICpwMikKLXsKLQljaGFyICpyZXQ7Ci0Jc2l6ZV90IGxlbiA9IHN0cmxlbihwMSkgKyBzdHJsZW4ocDIpICsgMjsKLQotCXJldCA9IHhtYWxsb2MobGVuKTsKLQlzdHJsY3B5KHJldCwgcDEsIGxlbik7Ci0JaWYgKHAxWzBdICE9ICdcMCcgJiYgcDFbc3RybGVuKHAxKSAtIDFdICE9ICcvJykKLQkJc3RybGNhdChyZXQsICIvIiwgbGVuKTsKLQlzdHJsY2F0KHJldCwgcDIsIGxlbik7Ci0KLQlyZXR1cm4ocmV0KTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2Z0cC1jbGllbnQuaCBiL3NmdHAtY2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZjU0ZWYuLjAwMDAwMDAKLS0tIGEvc2Z0cC1jbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKiAkT3BlbkJTRDogc2Z0cC1jbGllbnQuaCx2IDEuMjAgMjAxMC8xMi8wNCAwMDoxODowMSBkam0gRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IERhbWllbiBNaWxsZXIgPGRqbUBvcGVuYnNkLm9yZz4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0vKiBDbGllbnQgc2lkZSBvZiBTU0gyIGZpbGV4ZmVyIHByb3RvY29sICovCi0KLSNpZm5kZWYgX1NGVFBfQ0xJRU5UX0gKLSNkZWZpbmUgX1NGVFBfQ0xJRU5UX0gKLQotdHlwZWRlZiBzdHJ1Y3QgU0ZUUF9ESVJFTlQgU0ZUUF9ESVJFTlQ7Ci0KLXN0cnVjdCBTRlRQX0RJUkVOVCB7Ci0JY2hhciAqZmlsZW5hbWU7Ci0JY2hhciAqbG9uZ25hbWU7Ci0JQXR0cmliIGE7Ci19OwotCi0vKgotICogVXNlZCBmb3Igc3RhdHZmcyByZXNwb25zZXMgb24gdGhlIHdpcmUgZnJvbSB0aGUgc2VydmVyLCBiZWNhdXNlIHRoZQotICogc2VydmVyJ3MgbmF0aXZlIGZvcm1hdCBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGNsaWVudCdzLgotICovCi1zdHJ1Y3Qgc2Z0cF9zdGF0dmZzIHsKLQl1X2ludDY0X3QgZl9ic2l6ZTsKLQl1X2ludDY0X3QgZl9mcnNpemU7Ci0JdV9pbnQ2NF90IGZfYmxvY2tzOwotCXVfaW50NjRfdCBmX2JmcmVlOwotCXVfaW50NjRfdCBmX2JhdmFpbDsKLQl1X2ludDY0X3QgZl9maWxlczsKLQl1X2ludDY0X3QgZl9mZnJlZTsKLQl1X2ludDY0X3QgZl9mYXZhaWw7Ci0JdV9pbnQ2NF90IGZfZnNpZDsKLQl1X2ludDY0X3QgZl9mbGFnOwotCXVfaW50NjRfdCBmX25hbWVtYXg7Ci19OwotCi0vKgotICogSW5pdGlhbGlzZSBhIFNTSCBmaWxleGZlciBjb25uZWN0aW9uLiBSZXR1cm5zIE5VTEwgb24gZXJyb3Igb3IKLSAqIGEgcG9pbnRlciB0byBhIGluaXRpYWxpemVkIHNmdHBfY29ubiBzdHJ1Y3Qgb24gc3VjY2Vzcy4KLSAqLwotc3RydWN0IHNmdHBfY29ubiAqZG9faW5pdChpbnQsIGludCwgdV9pbnQsIHVfaW50LCB1X2ludDY0X3QpOwotCi11X2ludCBzZnRwX3Byb3RvX3ZlcnNpb24oc3RydWN0IHNmdHBfY29ubiAqKTsKLQotLyogQ2xvc2UgZmlsZSByZWZlcnJlZCB0byBieSAnaGFuZGxlJyAqLwotaW50IGRvX2Nsb3NlKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqLCB1X2ludCk7Ci0KLS8qIFJlYWQgY29udGVudHMgb2YgJ3BhdGgnIHRvIE5VTEwtdGVybWluYXRlZCBhcnJheSAnZGlyJyAqLwotaW50IGRvX3JlYWRkaXIoc3RydWN0IHNmdHBfY29ubiAqLCBjaGFyICosIFNGVFBfRElSRU5UICoqKik7Ci0KLS8qIEZyZWVzIGEgTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIFNGVFBfRElSRU5UcyAoZWcuIGZyb20gZG9fcmVhZGRpcikgKi8KLXZvaWQgZnJlZV9zZnRwX2RpcmVudHMoU0ZUUF9ESVJFTlQgKiopOwotCi0vKiBEZWxldGUgZmlsZSAncGF0aCcgKi8KLWludCBkb19ybShzdHJ1Y3Qgc2Z0cF9jb25uICosIGNoYXIgKik7Ci0KLS8qIENyZWF0ZSBkaXJlY3RvcnkgJ3BhdGgnICovCi1pbnQgZG9fbWtkaXIoc3RydWN0IHNmdHBfY29ubiAqLCBjaGFyICosIEF0dHJpYiAqLCBpbnQpOwotCi0vKiBSZW1vdmUgZGlyZWN0b3J5ICdwYXRoJyAqLwotaW50IGRvX3JtZGlyKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqKTsKLQotLyogR2V0IGZpbGUgYXR0cmlidXRlcyBvZiAncGF0aCcgKGZvbGxvd3Mgc3ltbGlua3MpICovCi1BdHRyaWIgKmRvX3N0YXQoc3RydWN0IHNmdHBfY29ubiAqLCBjaGFyICosIGludCk7Ci0KLS8qIEdldCBmaWxlIGF0dHJpYnV0ZXMgb2YgJ3BhdGgnIChkb2VzIG5vdCBmb2xsb3cgc3ltbGlua3MpICovCi1BdHRyaWIgKmRvX2xzdGF0KHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqLCBpbnQpOwotCi0vKiBTZXQgZmlsZSBhdHRyaWJ1dGVzIG9mICdwYXRoJyAqLwotaW50IGRvX3NldHN0YXQoc3RydWN0IHNmdHBfY29ubiAqLCBjaGFyICosIEF0dHJpYiAqKTsKLQotLyogU2V0IGZpbGUgYXR0cmlidXRlcyBvZiBvcGVuIGZpbGUgJ2hhbmRsZScgKi8KLWludCBkb19mc2V0c3RhdChzdHJ1Y3Qgc2Z0cF9jb25uICosIGNoYXIgKiwgdV9pbnQsIEF0dHJpYiAqKTsKLQotLyogQ2Fub25pY2FsaXNlICdwYXRoJyAtIGNhbGxlciBtdXN0IGZyZWUgcmVzdWx0ICovCi1jaGFyICpkb19yZWFscGF0aChzdHJ1Y3Qgc2Z0cF9jb25uICosIGNoYXIgKik7Ci0KLS8qIEdldCBzdGF0aXN0aWNzIGZvciBmaWxlc3lzdGVtIGhvc3RpbmcgZmlsZSBhdCAicGF0aCIgKi8KLWludCBkb19zdGF0dmZzKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc2Z0cF9zdGF0dmZzICosIGludCk7Ci0KLS8qIFJlbmFtZSAnb2xkcGF0aCcgdG8gJ25ld3BhdGgnICovCi1pbnQgZG9fcmVuYW1lKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqLCBjaGFyICopOwotCi0vKiBMaW5rICdvbGRwYXRoJyB0byAnbmV3cGF0aCcgKi8KLWludCBkb19oYXJkbGluayhzdHJ1Y3Qgc2Z0cF9jb25uICosIGNoYXIgKiwgY2hhciAqKTsKLQotLyogUmVuYW1lICdvbGRwYXRoJyB0byAnbmV3cGF0aCcgKi8KLWludCBkb19zeW1saW5rKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqLCBjaGFyICopOwotCi0vKiBYWFg6IGFkZCBjYWxsYmFja3MgdG8gZG9fZG93bmxvYWQvZG9fdXBsb2FkIHNvIHdlIGNhbiBkbyBwcm9ncmVzcyBtZXRlciAqLwotCi0vKgotICogRG93bmxvYWQgJ3JlbW90ZV9wYXRoJyB0byAnbG9jYWxfcGF0aCcuIFByZXNlcnZlIHBlcm1pc3Npb25zIGFuZCB0aW1lcwotICogaWYgJ3BmbGFnJyBpcyBzZXQKLSAqLwotaW50IGRvX2Rvd25sb2FkKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqLCBjaGFyICosIEF0dHJpYiAqLCBpbnQpOwotCi0vKgotICogUmVjdXJzaXZlbHkgZG93bmxvYWQgJ3JlbW90ZV9kaXJlY3RvcnknIHRvICdsb2NhbF9kaXJlY3RvcnknLiBQcmVzZXJ2ZSAKLSAqIHRpbWVzIGlmICdwZmxhZycgaXMgc2V0Ci0gKi8KLWludCBkb3dubG9hZF9kaXIoc3RydWN0IHNmdHBfY29ubiAqLCBjaGFyICosIGNoYXIgKiwgQXR0cmliICosIGludCwgaW50KTsKLQotLyoKLSAqIFVwbG9hZCAnbG9jYWxfcGF0aCcgdG8gJ3JlbW90ZV9wYXRoJy4gUHJlc2VydmUgcGVybWlzc2lvbnMgYW5kIHRpbWVzCi0gKiBpZiAncGZsYWcnIGlzIHNldAotICovCi1pbnQgZG9fdXBsb2FkKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqLCBjaGFyICosIGludCk7Ci0KLS8qCi0gKiBSZWN1cnNpdmVseSB1cGxvYWQgJ2xvY2FsX2RpcmVjdG9yeScgdG8gJ3JlbW90ZV9kaXJlY3RvcnknLiBQcmVzZXJ2ZSAKLSAqIHRpbWVzIGlmICdwZmxhZycgaXMgc2V0Ci0gKi8KLWludCB1cGxvYWRfZGlyKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqLCBjaGFyICosIGludCwgaW50KTsKLQotLyogQ29uY2F0ZW5hdGUgcGF0aHMsIHRha2luZyBjYXJlIG9mIHNsYXNoZXMuIENhbGxlciBtdXN0IGZyZWUgcmVzdWx0LiAqLwotY2hhciAqcGF0aF9hcHBlbmQoY2hhciAqLCBjaGFyICopOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NmdHAtY29tbW9uLmMgYi9zZnRwLWNvbW1vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDQyODc1Li4wMDAwMDAwCi0tLSBhL3NmdHAtY29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNmdHAtY29tbW9uLmMsdiAxLjIzIDIwMTAvMDEvMTUgMDk6MjQ6MjMgbWFya3VzIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDAxIERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSNpbmNsdWRlIDxncnAuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpZmRlZiBIQVZFX1VUSUxfSAotI2luY2x1ZGUgPHV0aWwuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImxvZy5oIgotCi0jaW5jbHVkZSAic2Z0cC5oIgotI2luY2x1ZGUgInNmdHAtY29tbW9uLmgiCi0KLS8qIENsZWFyIGNvbnRlbnRzIG9mIGF0dHJpYnV0ZXMgc3RydWN0dXJlICovCi12b2lkCi1hdHRyaWJfY2xlYXIoQXR0cmliICphKQotewotCWEtPmZsYWdzID0gMDsKLQlhLT5zaXplID0gMDsKLQlhLT51aWQgPSAwOwotCWEtPmdpZCA9IDA7Ci0JYS0+cGVybSA9IDA7Ci0JYS0+YXRpbWUgPSAwOwotCWEtPm10aW1lID0gMDsKLX0KLQotLyogQ29udmVydCBmcm9tIHN0cnVjdCBzdGF0IHRvIGZpbGV4ZmVyIGF0dHJpYnMgKi8KLXZvaWQKLXN0YXRfdG9fYXR0cmliKGNvbnN0IHN0cnVjdCBzdGF0ICpzdCwgQXR0cmliICphKQotewotCWF0dHJpYl9jbGVhcihhKTsKLQlhLT5mbGFncyA9IDA7Ci0JYS0+ZmxhZ3MgfD0gU1NIMl9GSUxFWEZFUl9BVFRSX1NJWkU7Ci0JYS0+c2l6ZSA9IHN0LT5zdF9zaXplOwotCWEtPmZsYWdzIHw9IFNTSDJfRklMRVhGRVJfQVRUUl9VSURHSUQ7Ci0JYS0+dWlkID0gc3QtPnN0X3VpZDsKLQlhLT5naWQgPSBzdC0+c3RfZ2lkOwotCWEtPmZsYWdzIHw9IFNTSDJfRklMRVhGRVJfQVRUUl9QRVJNSVNTSU9OUzsKLQlhLT5wZXJtID0gc3QtPnN0X21vZGU7Ci0JYS0+ZmxhZ3MgfD0gU1NIMl9GSUxFWEZFUl9BVFRSX0FDTU9EVElNRTsKLQlhLT5hdGltZSA9IHN0LT5zdF9hdGltZTsKLQlhLT5tdGltZSA9IHN0LT5zdF9tdGltZTsKLX0KLQotLyogQ29udmVydCBmcm9tIGZpbGV4ZmVyIGF0dHJpYnMgdG8gc3RydWN0IHN0YXQgKi8KLXZvaWQKLWF0dHJpYl90b19zdGF0KGNvbnN0IEF0dHJpYiAqYSwgc3RydWN0IHN0YXQgKnN0KQotewotCW1lbXNldChzdCwgMCwgc2l6ZW9mKCpzdCkpOwotCi0JaWYgKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1NJWkUpCi0JCXN0LT5zdF9zaXplID0gYS0+c2l6ZTsKLQlpZiAoYS0+ZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfVUlER0lEKSB7Ci0JCXN0LT5zdF91aWQgPSBhLT51aWQ7Ci0JCXN0LT5zdF9naWQgPSBhLT5naWQ7Ci0JfQotCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9QRVJNSVNTSU9OUykKLQkJc3QtPnN0X21vZGUgPSBhLT5wZXJtOwotCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9BQ01PRFRJTUUpIHsKLQkJc3QtPnN0X2F0aW1lID0gYS0+YXRpbWU7Ci0JCXN0LT5zdF9tdGltZSA9IGEtPm10aW1lOwotCX0KLX0KLQotLyogRGVjb2RlIGF0dHJpYnV0ZXMgaW4gYnVmZmVyICovCi1BdHRyaWIgKgotZGVjb2RlX2F0dHJpYihCdWZmZXIgKmIpCi17Ci0Jc3RhdGljIEF0dHJpYiBhOwotCi0JYXR0cmliX2NsZWFyKCZhKTsKLQlhLmZsYWdzID0gYnVmZmVyX2dldF9pbnQoYik7Ci0JaWYgKGEuZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfU0laRSkKLQkJYS5zaXplID0gYnVmZmVyX2dldF9pbnQ2NChiKTsKLQlpZiAoYS5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9VSURHSUQpIHsKLQkJYS51aWQgPSBidWZmZXJfZ2V0X2ludChiKTsKLQkJYS5naWQgPSBidWZmZXJfZ2V0X2ludChiKTsKLQl9Ci0JaWYgKGEuZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfUEVSTUlTU0lPTlMpCi0JCWEucGVybSA9IGJ1ZmZlcl9nZXRfaW50KGIpOwotCWlmIChhLmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX0FDTU9EVElNRSkgewotCQlhLmF0aW1lID0gYnVmZmVyX2dldF9pbnQoYik7Ci0JCWEubXRpbWUgPSBidWZmZXJfZ2V0X2ludChiKTsKLQl9Ci0JLyogdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMgKi8KLQlpZiAoYS5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9FWFRFTkRFRCkgewotCQljaGFyICp0eXBlLCAqZGF0YTsKLQkJaW50IGksIGNvdW50OwotCi0JCWNvdW50ID0gYnVmZmVyX2dldF9pbnQoYik7Ci0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQl0eXBlID0gYnVmZmVyX2dldF9zdHJpbmcoYiwgTlVMTCk7Ci0JCQlkYXRhID0gYnVmZmVyX2dldF9zdHJpbmcoYiwgTlVMTCk7Ci0JCQlkZWJ1ZzMoIkdvdCBmaWxlIGF0dHJpYnV0ZSBcIiVzXCIiLCB0eXBlKTsKLQkJCXhmcmVlKHR5cGUpOwotCQkJeGZyZWUoZGF0YSk7Ci0JCX0KLQl9Ci0JcmV0dXJuICZhOwotfQotCi0vKiBFbmNvZGUgYXR0cmlidXRlcyB0byBidWZmZXIgKi8KLXZvaWQKLWVuY29kZV9hdHRyaWIoQnVmZmVyICpiLCBjb25zdCBBdHRyaWIgKmEpCi17Ci0JYnVmZmVyX3B1dF9pbnQoYiwgYS0+ZmxhZ3MpOwotCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9TSVpFKQotCQlidWZmZXJfcHV0X2ludDY0KGIsIGEtPnNpemUpOwotCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9VSURHSUQpIHsKLQkJYnVmZmVyX3B1dF9pbnQoYiwgYS0+dWlkKTsKLQkJYnVmZmVyX3B1dF9pbnQoYiwgYS0+Z2lkKTsKLQl9Ci0JaWYgKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1BFUk1JU1NJT05TKQotCQlidWZmZXJfcHV0X2ludChiLCBhLT5wZXJtKTsKLQlpZiAoYS0+ZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfQUNNT0RUSU1FKSB7Ci0JCWJ1ZmZlcl9wdXRfaW50KGIsIGEtPmF0aW1lKTsKLQkJYnVmZmVyX3B1dF9pbnQoYiwgYS0+bXRpbWUpOwotCX0KLX0KLQotLyogQ29udmVydCBmcm9tIFNTSDJfRlhfIHN0YXR1cyB0byB0ZXh0IGVycm9yIG1lc3NhZ2UgKi8KLWNvbnN0IGNoYXIgKgotZngydHh0KGludCBzdGF0dXMpCi17Ci0Jc3dpdGNoIChzdGF0dXMpIHsKLQljYXNlIFNTSDJfRlhfT0s6Ci0JCXJldHVybigiTm8gZXJyb3IiKTsKLQljYXNlIFNTSDJfRlhfRU9GOgotCQlyZXR1cm4oIkVuZCBvZiBmaWxlIik7Ci0JY2FzZSBTU0gyX0ZYX05PX1NVQ0hfRklMRToKLQkJcmV0dXJuKCJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Iik7Ci0JY2FzZSBTU0gyX0ZYX1BFUk1JU1NJT05fREVOSUVEOgotCQlyZXR1cm4oIlBlcm1pc3Npb24gZGVuaWVkIik7Ci0JY2FzZSBTU0gyX0ZYX0ZBSUxVUkU6Ci0JCXJldHVybigiRmFpbHVyZSIpOwotCWNhc2UgU1NIMl9GWF9CQURfTUVTU0FHRToKLQkJcmV0dXJuKCJCYWQgbWVzc2FnZSIpOwotCWNhc2UgU1NIMl9GWF9OT19DT05ORUNUSU9OOgotCQlyZXR1cm4oIk5vIGNvbm5lY3Rpb24iKTsKLQljYXNlIFNTSDJfRlhfQ09OTkVDVElPTl9MT1NUOgotCQlyZXR1cm4oIkNvbm5lY3Rpb24gbG9zdCIpOwotCWNhc2UgU1NIMl9GWF9PUF9VTlNVUFBPUlRFRDoKLQkJcmV0dXJuKCJPcGVyYXRpb24gdW5zdXBwb3J0ZWQiKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4oIlVua25vd24gc3RhdHVzIik7Ci0JfQotCS8qIE5PVFJFQUNIRUQgKi8KLX0KLQotLyoKLSAqIGRyd3hyLXhyLXggICAgNSBtYXJrdXMgICBtYXJrdXMgICAgICAgMTAyNCBKYW4gMTMgMTg6MzkgLnNzaAotICovCi1jaGFyICoKLWxzX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IHN0YXQgKnN0LCBpbnQgcmVtb3RlLCBpbnQgc2lfdW5pdHMpCi17Ci0JaW50IHVsZW4sIGdsZW4sIHN6ID0gMDsKLQlzdHJ1Y3QgdG0gKmx0aW1lID0gbG9jYWx0aW1lKCZzdC0+c3RfbXRpbWUpOwotCWNoYXIgKnVzZXIsICpncm91cDsKLQljaGFyIGJ1ZlsxMDI0XSwgbW9kZVsxMSsxXSwgdGJ1ZlsxMisxXSwgdWJ1ZlsxMSsxXSwgZ2J1ZlsxMSsxXTsKLQljaGFyIHNidWZbRk1UX1NDQUxFRF9TVFJTSVpFXTsKLQotCXN0cm1vZGUoc3QtPnN0X21vZGUsIG1vZGUpOwotCWlmICghcmVtb3RlKSB7Ci0JCXVzZXIgPSB1c2VyX2Zyb21fdWlkKHN0LT5zdF91aWQsIDApOwotCX0gZWxzZSB7Ci0JCXNucHJpbnRmKHVidWYsIHNpemVvZiB1YnVmLCAiJXUiLCAodV9pbnQpc3QtPnN0X3VpZCk7Ci0JCXVzZXIgPSB1YnVmOwotCX0KLQlpZiAoIXJlbW90ZSkgewotCQlncm91cCA9IGdyb3VwX2Zyb21fZ2lkKHN0LT5zdF9naWQsIDApOwotCX0gZWxzZSB7Ci0JCXNucHJpbnRmKGdidWYsIHNpemVvZiBnYnVmLCAiJXUiLCAodV9pbnQpc3QtPnN0X2dpZCk7Ci0JCWdyb3VwID0gZ2J1ZjsKLQl9Ci0JaWYgKGx0aW1lICE9IE5VTEwpIHsKLQkJaWYgKHRpbWUoTlVMTCkgLSBzdC0+c3RfbXRpbWUgPCAoMzY1KjI0KjYwKjYwKS8yKQotCQkJc3ogPSBzdHJmdGltZSh0YnVmLCBzaXplb2YgdGJ1ZiwgIiViICVlICVIOiVNIiwgbHRpbWUpOwotCQllbHNlCi0JCQlzeiA9IHN0cmZ0aW1lKHRidWYsIHNpemVvZiB0YnVmLCAiJWIgJWUgICVZIiwgbHRpbWUpOwotCX0KLQlpZiAoc3ogPT0gMCkKLQkJdGJ1ZlswXSA9ICdcMCc7Ci0JdWxlbiA9IE1BWChzdHJsZW4odXNlciksIDgpOwotCWdsZW4gPSBNQVgoc3RybGVuKGdyb3VwKSwgOCk7Ci0JaWYgKHNpX3VuaXRzKSB7Ci0JCWZtdF9zY2FsZWQoKGxvbmcgbG9uZylzdC0+c3Rfc2l6ZSwgc2J1Zik7Ci0JCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiVzICUzdSAlLSpzICUtKnMgJThzICVzICVzIiwgbW9kZSwKLQkJICAgICh1X2ludClzdC0+c3RfbmxpbmssIHVsZW4sIHVzZXIsIGdsZW4sIGdyb3VwLAotCQkgICAgc2J1ZiwgdGJ1ZiwgbmFtZSk7Ci0JfSBlbHNlIHsKLQkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJXMgJTN1ICUtKnMgJS0qcyAlOGxsdSAlcyAlcyIsIG1vZGUsCi0JCSAgICAodV9pbnQpc3QtPnN0X25saW5rLCB1bGVuLCB1c2VyLCBnbGVuLCBncm91cCwKLQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3QtPnN0X3NpemUsIHRidWYsIG5hbWUpOwotCX0KLQlyZXR1cm4geHN0cmR1cChidWYpOwotfQpkaWZmIC0tZ2l0IGEvc2Z0cC1jb21tb24uaCBiL3NmdHAtY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZDg2YzAuLjAwMDAwMDAKLS0tIGEvc2Z0cC1jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qICRPcGVuQlNEOiBzZnRwLWNvbW1vbi5oLHYgMS4xMSAyMDEwLzAxLzEzIDAxOjQwOjE2IGRqbSBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDAxIERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKiBNYXhpbXVtIHBhY2tldCB0aGF0IHdlIGFyZSB3aWxsaW5nIHRvIHNlbmQvYWNjZXB0ICovCi0jZGVmaW5lIFNGVFBfTUFYX01TR19MRU5HVEgJKDI1NiAqIDEwMjQpCi0KLXR5cGVkZWYgc3RydWN0IEF0dHJpYiBBdHRyaWI7Ci0KLS8qIEZpbGUgYXR0cmlidXRlcyAqLwotc3RydWN0IEF0dHJpYiB7Ci0JdV9pbnQzMl90CWZsYWdzOwotCXVfaW50NjRfdAlzaXplOwotCXVfaW50MzJfdAl1aWQ7Ci0JdV9pbnQzMl90CWdpZDsKLQl1X2ludDMyX3QJcGVybTsKLQl1X2ludDMyX3QJYXRpbWU7Ci0JdV9pbnQzMl90CW10aW1lOwotfTsKLQotdm9pZAkgYXR0cmliX2NsZWFyKEF0dHJpYiAqKTsKLXZvaWQJIHN0YXRfdG9fYXR0cmliKGNvbnN0IHN0cnVjdCBzdGF0ICosIEF0dHJpYiAqKTsKLXZvaWQJIGF0dHJpYl90b19zdGF0KGNvbnN0IEF0dHJpYiAqLCBzdHJ1Y3Qgc3RhdCAqKTsKLUF0dHJpYgkqZGVjb2RlX2F0dHJpYihCdWZmZXIgKik7Ci12b2lkCSBlbmNvZGVfYXR0cmliKEJ1ZmZlciAqLCBjb25zdCBBdHRyaWIgKik7Ci1jaGFyCSpsc19maWxlKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHN0YXQgKiwgaW50LCBpbnQpOwotCi1jb25zdCBjaGFyICpmeDJ0eHQoaW50KTsKZGlmZiAtLWdpdCBhL3NmdHAtZ2xvYi5jIGIvc2Z0cC1nbG9iLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYzI3MDguLjAwMDAwMDAKLS0tIGEvc2Z0cC1nbG9iLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNmdHAtZ2xvYi5jLHYgMS4yMiAyMDA2LzA4LzAzIDAzOjM0OjQyIGRlcmFhZHQgRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBEYW1pZW4gTWlsbGVyIDxkam1Ab3BlbmJzZC5vcmc+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAic2Z0cC5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgInNmdHAtY29tbW9uLmgiCi0jaW5jbHVkZSAic2Z0cC1jbGllbnQuaCIKLQotaW50IHJlbW90ZV9nbG9iKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY29uc3QgY2hhciAqLCBpbnQsCi0gICAgaW50ICgqKShjb25zdCBjaGFyICosIGludCksIGdsb2JfdCAqKTsKLQotc3RydWN0IFNGVFBfT1BFTkRJUiB7Ci0JU0ZUUF9ESVJFTlQgKipkaXI7Ci0JaW50IG9mZnNldDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgewotCXN0cnVjdCBzZnRwX2Nvbm4gKmNvbm47Ci19IGN1cjsKLQotc3RhdGljIHZvaWQgKgotZnVkZ2Vfb3BlbmRpcihjb25zdCBjaGFyICpwYXRoKQotewotCXN0cnVjdCBTRlRQX09QRU5ESVIgKnI7Ci0KLQlyID0geG1hbGxvYyhzaXplb2YoKnIpKTsKLQotCWlmIChkb19yZWFkZGlyKGN1ci5jb25uLCAoY2hhciAqKXBhdGgsICZyLT5kaXIpKSB7Ci0JCXhmcmVlKHIpOwotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0Jci0+b2Zmc2V0ID0gMDsKLQotCXJldHVybigodm9pZCAqKXIpOwotfQotCi1zdGF0aWMgc3RydWN0IGRpcmVudCAqCi1mdWRnZV9yZWFkZGlyKHN0cnVjdCBTRlRQX09QRU5ESVIgKm9kKQotewotCS8qIFNvbGFyaXMgbmVlZHMgc2l6ZW9mKGRpcmVudCkgKyBwYXRoIGxlbmd0aCAoc2VlIGJlbG93KSAqLwotCXN0YXRpYyBjaGFyIGJ1ZltzaXplb2Yoc3RydWN0IGRpcmVudCkgKyBNQVhQQVRITEVOXTsKLQlzdHJ1Y3QgZGlyZW50ICpyZXQgPSAoc3RydWN0IGRpcmVudCAqKWJ1ZjsKLSNpZmRlZiBfX0dOVV9MSUJSQVJZX18KLQlzdGF0aWMgaW50IGludW0gPSAxOwotI2VuZGlmIC8qIF9fR05VX0xJQlJBUllfXyAqLwotCi0JaWYgKG9kLT5kaXJbb2QtPm9mZnNldF0gPT0gTlVMTCkKLQkJcmV0dXJuKE5VTEwpOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCi0JLyoKLQkgKiBTb2xhcmlzIGRlZmluZXMgZGlyZW50LT5kX25hbWUgYXMgYSBvbmUgYnl0ZSBhcnJheSBhbmQgZXhwZWN0cwotCSAqIHlvdSB0byBoYWNrIGFyb3VuZCBpdC4KLQkgKi8KLSNpZmRlZiBCUk9LRU5fT05FX0JZVEVfRElSRU5UX0RfTkFNRQotCXN0cmxjcHkocmV0LT5kX25hbWUsIG9kLT5kaXJbb2QtPm9mZnNldCsrXS0+ZmlsZW5hbWUsIE1BWFBBVEhMRU4pOwotI2Vsc2UKLQlzdHJsY3B5KHJldC0+ZF9uYW1lLCBvZC0+ZGlyW29kLT5vZmZzZXQrK10tPmZpbGVuYW1lLAotCSAgICBzaXplb2YocmV0LT5kX25hbWUpKTsKLSNlbmRpZgotI2lmZGVmIF9fR05VX0xJQlJBUllfXwotCS8qCi0JICogSWRpb3QgZ2xpYmMgdXNlcyBleHRlbnNpb25zIHRvIHN0cnVjdCBkaXJlbnQgZm9yIHJlYWRkaXIgd2l0aAotCSAqIEFMVERJUkZVTkNzLiBOb3QgdGhhdCB0aGlzIGlzIGRvY3VtZW50ZWQgYW55d2hlcmUgYnV0IHRoZQotCSAqIHNvdXJjZS4uLiBGYWtlIGFuIGlub2RlIG51bWJlciB0byBhcHBlYXNlIGl0LgotCSAqLwotCXJldC0+ZF9pbm8gPSBpbnVtKys7Ci0JaWYgKCFpbnVtKQotCQlpbnVtID0gMTsKLSNlbmRpZiAvKiBfX0dOVV9MSUJSQVJZX18gKi8KLQotCXJldHVybihyZXQpOwotfQotCi1zdGF0aWMgdm9pZAotZnVkZ2VfY2xvc2VkaXIoc3RydWN0IFNGVFBfT1BFTkRJUiAqb2QpCi17Ci0JZnJlZV9zZnRwX2RpcmVudHMob2QtPmRpcik7Ci0JeGZyZWUob2QpOwotfQotCi1zdGF0aWMgaW50Ci1mdWRnZV9sc3RhdChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdCAqc3QpCi17Ci0JQXR0cmliICphOwotCi0JaWYgKCEoYSA9IGRvX2xzdGF0KGN1ci5jb25uLCAoY2hhciAqKXBhdGgsIDApKSkKLQkJcmV0dXJuKC0xKTsKLQotCWF0dHJpYl90b19zdGF0KGEsIHN0KTsKLQotCXJldHVybigwKTsKLX0KLQotc3RhdGljIGludAotZnVkZ2Vfc3RhdChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdCAqc3QpCi17Ci0JQXR0cmliICphOwotCi0JaWYgKCEoYSA9IGRvX3N0YXQoY3VyLmNvbm4sIChjaGFyICopcGF0aCwgMCkpKQotCQlyZXR1cm4oLTEpOwotCi0JYXR0cmliX3RvX3N0YXQoYSwgc3QpOwotCi0JcmV0dXJuKDApOwotfQotCi1pbnQKLXJlbW90ZV9nbG9iKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNvbnN0IGNoYXIgKnBhdHRlcm4sIGludCBmbGFncywKLSAgICBpbnQgKCplcnJmdW5jKShjb25zdCBjaGFyICosIGludCksIGdsb2JfdCAqcGdsb2IpCi17Ci0JcGdsb2ItPmdsX29wZW5kaXIgPSBmdWRnZV9vcGVuZGlyOwotCXBnbG9iLT5nbF9yZWFkZGlyID0gKHN0cnVjdCBkaXJlbnQgKigqKSh2b2lkICopKWZ1ZGdlX3JlYWRkaXI7Ci0JcGdsb2ItPmdsX2Nsb3NlZGlyID0gKHZvaWQgKCopKHZvaWQgKikpZnVkZ2VfY2xvc2VkaXI7Ci0JcGdsb2ItPmdsX2xzdGF0ID0gZnVkZ2VfbHN0YXQ7Ci0JcGdsb2ItPmdsX3N0YXQgPSBmdWRnZV9zdGF0OwotCi0JbWVtc2V0KCZjdXIsIDAsIHNpemVvZihjdXIpKTsKLQljdXIuY29ubiA9IGNvbm47Ci0KLQlyZXR1cm4oZ2xvYihwYXR0ZXJuLCBmbGFncyB8IEdMT0JfQUxURElSRlVOQywgZXJyZnVuYywgcGdsb2IpKTsKLX0KZGlmZiAtLWdpdCBhL3NmdHAtc2VydmVyLW1haW4uYyBiL3NmdHAtc2VydmVyLW1haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U2NDRhYi4uMDAwMDAwMAotLS0gYS9zZnRwLXNlcnZlci1tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiAkT3BlbkJTRDogc2Z0cC1zZXJ2ZXItbWFpbi5jLHYgMS40IDIwMDkvMDIvMjEgMTk6MzI6MDQgdG9iaWFzIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgInNmdHAuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLXZvaWQKLWNsZWFudXBfZXhpdChpbnQgaSkKLXsKLQlzZnRwX3NlcnZlcl9jbGVhbnVwX2V4aXQoaSk7Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0Jc3RydWN0IHBhc3N3ZCAqdXNlcl9wdzsKLQotCS8qIEVuc3VyZSB0aGF0IGZkcyAwLCAxIGFuZCAyIGFyZSBvcGVuIG9yIGRpcmVjdGVkIHRvIC9kZXYvbnVsbCAqLwotCXNhbml0aXNlX3N0ZGZkKCk7Ci0KLQlpZiAoKHVzZXJfcHcgPSBnZXRwd3VpZChnZXR1aWQoKSkpID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICJObyB1c2VyIGZvdW5kIGZvciB1aWQgJWx1XG4iLAotCQkgICAgKHVfbG9uZylnZXR1aWQoKSk7Ci0JCXJldHVybiAxOwotCX0KLQotCXJldHVybiAoc2Z0cF9zZXJ2ZXJfbWFpbihhcmdjLCBhcmd2LCB1c2VyX3B3KSk7Ci19CmRpZmYgLS1naXQgYS9zZnRwLXNlcnZlci4wIGIvc2Z0cC1zZXJ2ZXIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg2OTVhMC4uMDAwMDAwMAotLS0gYS9zZnRwLXNlcnZlci4wCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotU0ZUUC1TRVJWRVIoOCkgICAgICAgICAgT3BlbkJTRCBTeXN0ZW0gTWFuYWdlcidzIE1hbnVhbCAgICAgICAgIFNGVFAtU0VSVkVSKDgpCi0KLU5BTUUKLSAgICAgc2Z0cC1zZXJ2ZXIgLSBTRlRQIHNlcnZlciBzdWJzeXN0ZW0KLQotU1lOT1BTSVMKLSAgICAgc2Z0cC1zZXJ2ZXIgWy1laFJdIFstZiBsb2dfZmFjaWxpdHldIFstbCBsb2dfbGV2ZWxdIFstdSB1bWFza10KLQotREVTQ1JJUFRJT04KLSAgICAgc2Z0cC1zZXJ2ZXIgaXMgYSBwcm9ncmFtIHRoYXQgc3BlYWtzIHRoZSBzZXJ2ZXIgc2lkZSBvZiBTRlRQIHByb3RvY29sIHRvCi0gICAgIHN0ZG91dCBhbmQgZXhwZWN0cyBjbGllbnQgcmVxdWVzdHMgZnJvbSBzdGRpbi4gIHNmdHAtc2VydmVyIGlzIG5vdAotICAgICBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHksIGJ1dCBmcm9tIHNzaGQoOCkgdXNpbmcgdGhlIFN1YnN5c3RlbQotICAgICBvcHRpb24uCi0KLSAgICAgQ29tbWFuZC1saW5lIGZsYWdzIHRvIHNmdHAtc2VydmVyIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gdGhlIFN1YnN5c3RlbQotICAgICBkZWNsYXJhdGlvbi4gIFNlZSBzc2hkX2NvbmZpZyg1KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgICBWYWxpZCBvcHRpb25zIGFyZToKLQotICAgICAtZSAgICAgIENhdXNlcyBzZnRwLXNlcnZlciB0byBwcmludCBsb2dnaW5nIGluZm9ybWF0aW9uIHRvIHN0ZGVyciBpbnN0ZWFkCi0gICAgICAgICAgICAgb2Ygc3lzbG9nIGZvciBkZWJ1Z2dpbmcuCi0KLSAgICAgLWYgbG9nX2ZhY2lsaXR5Ci0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBmYWNpbGl0eSBjb2RlIHRoYXQgaXMgdXNlZCB3aGVuIGxvZ2dpbmcgbWVzc2FnZXMKLSAgICAgICAgICAgICBmcm9tIHNmdHAtc2VydmVyLiAgVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6IERBRU1PTiwgVVNFUiwgQVVUSCwKLSAgICAgICAgICAgICBMT0NBTDAsIExPQ0FMMSwgTE9DQUwyLCBMT0NBTDMsIExPQ0FMNCwgTE9DQUw1LCBMT0NBTDYsIExPQ0FMNy4KLSAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBBVVRILgotCi0gICAgIC1oICAgICAgRGlzcGxheXMgc2Z0cC1zZXJ2ZXIgdXNhZ2UgaW5mb3JtYXRpb24uCi0KLSAgICAgLWwgbG9nX2xldmVsCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoaWNoIG1lc3NhZ2VzIHdpbGwgYmUgbG9nZ2VkIGJ5IHNmdHAtc2VydmVyLiAgVGhlCi0gICAgICAgICAgICAgcG9zc2libGUgdmFsdWVzIGFyZTogUVVJRVQsIEZBVEFMLCBFUlJPUiwgSU5GTywgVkVSQk9TRSwgREVCVUcsCi0gICAgICAgICAgICAgREVCVUcxLCBERUJVRzIsIGFuZCBERUJVRzMuICBJTkZPIGFuZCBWRVJCT1NFIGxvZyB0cmFuc2FjdGlvbnMKLSAgICAgICAgICAgICB0aGF0IHNmdHAtc2VydmVyIHBlcmZvcm1zIG9uIGJlaGFsZiBvZiB0aGUgY2xpZW50LiAgREVCVUcgYW5kCi0gICAgICAgICAgICAgREVCVUcxIGFyZSBlcXVpdmFsZW50LiAgREVCVUcyIGFuZCBERUJVRzMgZWFjaCBzcGVjaWZ5IGhpZ2hlcgotICAgICAgICAgICAgIGxldmVscyBvZiBkZWJ1Z2dpbmcgb3V0cHV0LiAgVGhlIGRlZmF1bHQgaXMgRVJST1IuCi0KLSAgICAgLVIgICAgICBQbGFjZXMgdGhpcyBpbnN0YW5jZSBvZiBzZnRwLXNlcnZlciBpbnRvIGEgcmVhZC1vbmx5IG1vZGUuCi0gICAgICAgICAgICAgQXR0ZW1wdHMgdG8gb3BlbiBmaWxlcyBmb3Igd3JpdGluZywgYXMgd2VsbCBhcyBvdGhlciBvcGVyYXRpb25zCi0gICAgICAgICAgICAgdGhhdCBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBmaWxlc3lzdGVtLCB3aWxsIGJlIGRlbmllZC4KLQotICAgICAtdSB1bWFzawotICAgICAgICAgICAgIFNldHMgYW4gZXhwbGljaXQgdW1hc2soMikgdG8gYmUgYXBwbGllZCB0byBuZXdseS1jcmVhdGVkIGZpbGVzCi0gICAgICAgICAgICAgYW5kIGRpcmVjdG9yaWVzLCBpbnN0ZWFkIG9mIHRoZSB1c2VyJ3MgZGVmYXVsdCBtYXNrLgotCi0gICAgIEZvciBsb2dnaW5nIHRvIHdvcmssIHNmdHAtc2VydmVyIG11c3QgYmUgYWJsZSB0byBhY2Nlc3MgL2Rldi9sb2cuICBVc2Ugb2YKLSAgICAgc2Z0cC1zZXJ2ZXIgaW4gYSBjaHJvb3QgY29uZmlndXJhdGlvbiB0aGVyZWZvcmUgcmVxdWlyZXMgdGhhdCBzeXNsb2dkKDgpCi0gICAgIGVzdGFibGlzaCBhIGxvZ2dpbmcgc29ja2V0IGluc2lkZSB0aGUgY2hyb290IGRpcmVjdG9yeS4KLQotU0VFIEFMU08KLSAgICAgc2Z0cCgxKSwgc3NoKDEpLCBzc2hkX2NvbmZpZyg1KSwgc3NoZCg4KQotCi0gICAgIFQuIFlsb25lbiBhbmQgUy4gTGVodGluZW4sIFNTSCBGaWxlIFRyYW5zZmVyIFByb3RvY29sLAotICAgICBkcmFmdC1pZXRmLXNlY3NoLWZpbGV4ZmVyLTAwLnR4dCwgSmFudWFyeSAyMDAxLCB3b3JrIGluIHByb2dyZXNzCi0gICAgIG1hdGVyaWFsLgotCi1ISVNUT1JZCi0gICAgIHNmdHAtc2VydmVyIGZpcnN0IGFwcGVhcmVkIGluIE9wZW5CU0QgMi44LgotCi1BVVRIT1JTCi0gICAgIE1hcmt1cyBGcmllZGwgPG1hcmt1c0BvcGVuYnNkLm9yZz4KLQotT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgICBKYW51YXJ5IDksIDIwMTAgICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9zZnRwLXNlcnZlci44IGIvc2Z0cC1zZXJ2ZXIuOApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIxOWMxNS4uMDAwMDAwMAotLS0gYS9zZnRwLXNlcnZlci44CisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS5cIiAkT3BlbkJTRDogc2Z0cC1zZXJ2ZXIuOCx2IDEuMTkgMjAxMC8wMS8wOSAwMzozNjowMCBqbWMgRXhwICQKLS5cIgotLlwiIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIgotLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotLlwiIGFyZSBtZXQ6Ci0uXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0uXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0uXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0uXCIgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotLlwiIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0uXCIgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotLlwiIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS5cIiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS5cIiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0uXCIgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0uXCIgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS5cIgotLkRkICRNZG9jZGF0ZTogSmFudWFyeSA5IDIwMTAgJAotLkR0IFNGVFAtU0VSVkVSIDgKLS5PcwotLlNoIE5BTUUKLS5ObSBzZnRwLXNlcnZlcgotLk5kIFNGVFAgc2VydmVyIHN1YnN5c3RlbQotLlNoIFNZTk9QU0lTCi0uTm0gc2Z0cC1zZXJ2ZXIKLS5PcCBGbCBlaFIKLS5PcCBGbCBmIEFyIGxvZ19mYWNpbGl0eQotLk9wIEZsIGwgQXIgbG9nX2xldmVsCi0uT3AgRmwgdSBBciB1bWFzawotLlNoIERFU0NSSVBUSU9OCi0uTm0KLWlzIGEgcHJvZ3JhbSB0aGF0IHNwZWFrcyB0aGUgc2VydmVyIHNpZGUgb2YgU0ZUUCBwcm90b2NvbAotdG8gc3Rkb3V0IGFuZCBleHBlY3RzIGNsaWVudCByZXF1ZXN0cyBmcm9tIHN0ZGluLgotLk5tCi1pcyBub3QgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LCBidXQgZnJvbQotLlhyIHNzaGQgOAotdXNpbmcgdGhlCi0uQ20gU3Vic3lzdGVtCi1vcHRpb24uCi0uUHAKLUNvbW1hbmQtbGluZSBmbGFncyB0bwotLk5tCi1zaG91bGQgYmUgc3BlY2lmaWVkIGluIHRoZQotLkNtIFN1YnN5c3RlbQotZGVjbGFyYXRpb24uCi1TZWUKLS5YciBzc2hkX2NvbmZpZyA1Ci1mb3IgbW9yZSBpbmZvcm1hdGlvbi4KLS5QcAotVmFsaWQgb3B0aW9ucyBhcmU6Ci0uQmwgLXRhZyAtd2lkdGggRHMKLS5JdCBGbCBlCi1DYXVzZXMKLS5ObQotdG8gcHJpbnQgbG9nZ2luZyBpbmZvcm1hdGlvbiB0byBzdGRlcnIgaW5zdGVhZCBvZiBzeXNsb2cgZm9yIGRlYnVnZ2luZy4KLS5JdCBGbCBmIEFyIGxvZ19mYWNpbGl0eQotU3BlY2lmaWVzIHRoZSBmYWNpbGl0eSBjb2RlIHRoYXQgaXMgdXNlZCB3aGVuIGxvZ2dpbmcgbWVzc2FnZXMgZnJvbQotLk5tIC4KLVRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBEQUVNT04sIFVTRVIsIEFVVEgsIExPQ0FMMCwgTE9DQUwxLCBMT0NBTDIsCi1MT0NBTDMsIExPQ0FMNCwgTE9DQUw1LCBMT0NBTDYsIExPQ0FMNy4KLVRoZSBkZWZhdWx0IGlzIEFVVEguCi0uSXQgRmwgaAotRGlzcGxheXMKLS5ObQotdXNhZ2UgaW5mb3JtYXRpb24uCi0uSXQgRmwgbCBBciBsb2dfbGV2ZWwKLVNwZWNpZmllcyB3aGljaCBtZXNzYWdlcyB3aWxsIGJlIGxvZ2dlZCBieQotLk5tIC4KLVRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOgotUVVJRVQsIEZBVEFMLCBFUlJPUiwgSU5GTywgVkVSQk9TRSwgREVCVUcsIERFQlVHMSwgREVCVUcyLCBhbmQgREVCVUczLgotSU5GTyBhbmQgVkVSQk9TRSBsb2cgdHJhbnNhY3Rpb25zIHRoYXQKLS5ObQotcGVyZm9ybXMgb24gYmVoYWxmIG9mIHRoZSBjbGllbnQuCi1ERUJVRyBhbmQgREVCVUcxIGFyZSBlcXVpdmFsZW50LgotREVCVUcyIGFuZCBERUJVRzMgZWFjaCBzcGVjaWZ5IGhpZ2hlciBsZXZlbHMgb2YgZGVidWdnaW5nIG91dHB1dC4KLVRoZSBkZWZhdWx0IGlzIEVSUk9SLgotLkl0IEZsIFIKLVBsYWNlcyB0aGlzIGluc3RhbmNlIG9mCi0uTm0KLWludG8gYSByZWFkLW9ubHkgbW9kZS4KLUF0dGVtcHRzIHRvIG9wZW4gZmlsZXMgZm9yIHdyaXRpbmcsIGFzIHdlbGwgYXMgb3RoZXIgb3BlcmF0aW9ucyB0aGF0IGNoYW5nZQotdGhlIHN0YXRlIG9mIHRoZSBmaWxlc3lzdGVtLCB3aWxsIGJlIGRlbmllZC4KLS5JdCBGbCB1IEFyIHVtYXNrCi1TZXRzIGFuIGV4cGxpY2l0Ci0uWHIgdW1hc2sgMgotdG8gYmUgYXBwbGllZCB0byBuZXdseS1jcmVhdGVkIGZpbGVzIGFuZCBkaXJlY3RvcmllcywgaW5zdGVhZCBvZiB0aGUKLXVzZXIncyBkZWZhdWx0IG1hc2suCi0uRWwKLS5QcAotRm9yIGxvZ2dpbmcgdG8gd29yaywKLS5ObQotbXVzdCBiZSBhYmxlIHRvIGFjY2VzcwotLlBhIC9kZXYvbG9nIC4KLVVzZSBvZgotLk5tCi1pbiBhIGNocm9vdCBjb25maWd1cmF0aW9uIHRoZXJlZm9yZSByZXF1aXJlcyB0aGF0Ci0uWHIgc3lzbG9nZCA4Ci1lc3RhYmxpc2ggYSBsb2dnaW5nIHNvY2tldCBpbnNpZGUgdGhlIGNocm9vdCBkaXJlY3RvcnkuCi0uU2ggU0VFIEFMU08KLS5YciBzZnRwIDEgLAotLlhyIHNzaCAxICwKLS5YciBzc2hkX2NvbmZpZyA1ICwKLS5YciBzc2hkIDgKLS5ScwotLiVBIFQuIFlsb25lbgotLiVBIFMuIExlaHRpbmVuCi0uJVQgIlNTSCBGaWxlIFRyYW5zZmVyIFByb3RvY29sIgotLiVOIGRyYWZ0LWlldGYtc2Vjc2gtZmlsZXhmZXItMDAudHh0Ci0uJUQgSmFudWFyeSAyMDAxCi0uJU8gd29yayBpbiBwcm9ncmVzcyBtYXRlcmlhbAotLlJlCi0uU2ggSElTVE9SWQotLk5tCi1maXJzdCBhcHBlYXJlZCBpbgotLk94IDIuOCAuCi0uU2ggQVVUSE9SUwotLkFuIE1hcmt1cyBGcmllZGwgQXEgbWFya3VzQG9wZW5ic2Qub3JnCmRpZmYgLS1naXQgYS9zZnRwLXNlcnZlci5jIGIvc2Z0cC1zZXJ2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwMWM3ZC4uMDAwMDAwMAotLS0gYS9zZnRwLXNlcnZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU0OCArMCwwIEBACi0vKiAkT3BlbkJTRDogc2Z0cC1zZXJ2ZXIuYyx2IDEuOTQgMjAxMS8wNi8xNyAyMTo0NjoxNiBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19NT1VOVF9ICi0jaW5jbHVkZSA8c3lzL21vdW50Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19TVEFUVkZTX0gKLSNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgInVpZHN3YXAuaCIKLQotI2luY2x1ZGUgInNmdHAuaCIKLSNpbmNsdWRlICJzZnRwLWNvbW1vbi5oIgotCi0vKiBoZWxwZXIgKi8KLSNkZWZpbmUgZ2V0X2ludDY0KCkJCQlidWZmZXJfZ2V0X2ludDY0KCZpcXVldWUpOwotI2RlZmluZSBnZXRfaW50KCkJCQlidWZmZXJfZ2V0X2ludCgmaXF1ZXVlKTsKLSNkZWZpbmUgZ2V0X3N0cmluZyhsZW5wKQkJYnVmZmVyX2dldF9zdHJpbmcoJmlxdWV1ZSwgbGVucCk7Ci0KLS8qIE91ciB2ZXJib3NpdHkgKi8KLUxvZ0xldmVsIGxvZ19sZXZlbCA9IFNZU0xPR19MRVZFTF9FUlJPUjsKLQotLyogT3VyIGNsaWVudCAqLwotc3RydWN0IHBhc3N3ZCAqcHcgPSBOVUxMOwotY2hhciAqY2xpZW50X2FkZHIgPSBOVUxMOwotCi0vKiBpbnB1dCBhbmQgb3V0cHV0IHF1ZXVlICovCi1CdWZmZXIgaXF1ZXVlOwotQnVmZmVyIG9xdWV1ZTsKLQotLyogVmVyc2lvbiBvZiBjbGllbnQgKi8KLXVfaW50IHZlcnNpb247Ci0KLS8qIERpc2FibGUgd3JpdGVzICovCi1pbnQgcmVhZG9ubHk7Ci0KLS8qIHBvcnRhYmxlIGF0dHJpYnV0ZXMsIGV0Yy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgU3RhdCBTdGF0OwotCi1zdHJ1Y3QgU3RhdCB7Ci0JY2hhciAqbmFtZTsKLQljaGFyICpsb25nX25hbWU7Ci0JQXR0cmliIGF0dHJpYjsKLX07Ci0KLXN0YXRpYyBpbnQKLWVycm5vX3RvX3BvcnRhYmxlKGludCB1bml4ZXJybm8pCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlzd2l0Y2ggKHVuaXhlcnJubykgewotCWNhc2UgMDoKLQkJcmV0ID0gU1NIMl9GWF9PSzsKLQkJYnJlYWs7Ci0JY2FzZSBFTk9FTlQ6Ci0JY2FzZSBFTk9URElSOgotCWNhc2UgRUJBREY6Ci0JY2FzZSBFTE9PUDoKLQkJcmV0ID0gU1NIMl9GWF9OT19TVUNIX0ZJTEU7Ci0JCWJyZWFrOwotCWNhc2UgRVBFUk06Ci0JY2FzZSBFQUNDRVM6Ci0JY2FzZSBFRkFVTFQ6Ci0JCXJldCA9IFNTSDJfRlhfUEVSTUlTU0lPTl9ERU5JRUQ7Ci0JCWJyZWFrOwotCWNhc2UgRU5BTUVUT09MT05HOgotCWNhc2UgRUlOVkFMOgotCQlyZXQgPSBTU0gyX0ZYX0JBRF9NRVNTQUdFOwotCQlicmVhazsKLQljYXNlIEVOT1NZUzoKLQkJcmV0ID0gU1NIMl9GWF9PUF9VTlNVUFBPUlRFRDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gU1NIMl9GWF9GQUlMVVJFOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotZmxhZ3NfZnJvbV9wb3J0YWJsZShpbnQgcGZsYWdzKQotewotCWludCBmbGFncyA9IDA7Ci0KLQlpZiAoKHBmbGFncyAmIFNTSDJfRlhGX1JFQUQpICYmCi0JICAgIChwZmxhZ3MgJiBTU0gyX0ZYRl9XUklURSkpIHsKLQkJZmxhZ3MgPSBPX1JEV1I7Ci0JfSBlbHNlIGlmIChwZmxhZ3MgJiBTU0gyX0ZYRl9SRUFEKSB7Ci0JCWZsYWdzID0gT19SRE9OTFk7Ci0JfSBlbHNlIGlmIChwZmxhZ3MgJiBTU0gyX0ZYRl9XUklURSkgewotCQlmbGFncyA9IE9fV1JPTkxZOwotCX0KLQlpZiAocGZsYWdzICYgU1NIMl9GWEZfQ1JFQVQpCi0JCWZsYWdzIHw9IE9fQ1JFQVQ7Ci0JaWYgKHBmbGFncyAmIFNTSDJfRlhGX1RSVU5DKQotCQlmbGFncyB8PSBPX1RSVU5DOwotCWlmIChwZmxhZ3MgJiBTU0gyX0ZYRl9FWENMKQotCQlmbGFncyB8PSBPX0VYQ0w7Ci0JcmV0dXJuIGZsYWdzOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1zdHJpbmdfZnJvbV9wb3J0YWJsZShpbnQgcGZsYWdzKQotewotCXN0YXRpYyBjaGFyIHJldFsxMjhdOwotCi0JKnJldCA9ICdcMCc7Ci0KLSNkZWZpbmUgUEFQUEVORChzdHIpCXsJCQkJXAotCQlpZiAoKnJldCAhPSAnXDAnKQkJCVwKLQkJCXN0cmxjYXQocmV0LCAiLCIsIHNpemVvZihyZXQpKTsJXAotCQlzdHJsY2F0KHJldCwgc3RyLCBzaXplb2YocmV0KSk7CQlcCi0JfQotCi0JaWYgKHBmbGFncyAmIFNTSDJfRlhGX1JFQUQpCi0JCVBBUFBFTkQoIlJFQUQiKQotCWlmIChwZmxhZ3MgJiBTU0gyX0ZYRl9XUklURSkKLQkJUEFQUEVORCgiV1JJVEUiKQotCWlmIChwZmxhZ3MgJiBTU0gyX0ZYRl9DUkVBVCkKLQkJUEFQUEVORCgiQ1JFQVRFIikKLQlpZiAocGZsYWdzICYgU1NIMl9GWEZfVFJVTkMpCi0JCVBBUFBFTkQoIlRSVU5DQVRFIikKLQlpZiAocGZsYWdzICYgU1NIMl9GWEZfRVhDTCkKLQkJUEFQUEVORCgiRVhDTCIpCi0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgQXR0cmliICoKLWdldF9hdHRyaWIodm9pZCkKLXsKLQlyZXR1cm4gZGVjb2RlX2F0dHJpYigmaXF1ZXVlKTsKLX0KLQotLyogaGFuZGxlIGhhbmRsZXMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgSGFuZGxlIEhhbmRsZTsKLXN0cnVjdCBIYW5kbGUgewotCWludCB1c2U7Ci0JRElSICpkaXJwOwotCWludCBmZDsKLQljaGFyICpuYW1lOwotCXVfaW50NjRfdCBieXRlc19yZWFkLCBieXRlc193cml0ZTsKLQlpbnQgbmV4dF91bnVzZWQ7Ci19OwotCi1lbnVtIHsKLQlIQU5ETEVfVU5VU0VELAotCUhBTkRMRV9ESVIsCi0JSEFORExFX0ZJTEUKLX07Ci0KLUhhbmRsZSAqaGFuZGxlcyA9IE5VTEw7Ci11X2ludCBudW1faGFuZGxlcyA9IDA7Ci1pbnQgZmlyc3RfdW51c2VkX2hhbmRsZSA9IC0xOwotCi1zdGF0aWMgdm9pZCBoYW5kbGVfdW51c2VkKGludCBpKQotewotCWhhbmRsZXNbaV0udXNlID0gSEFORExFX1VOVVNFRDsKLQloYW5kbGVzW2ldLm5leHRfdW51c2VkID0gZmlyc3RfdW51c2VkX2hhbmRsZTsKLQlmaXJzdF91bnVzZWRfaGFuZGxlID0gaTsKLX0KLQotc3RhdGljIGludAotaGFuZGxlX25ldyhpbnQgdXNlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmQsIERJUiAqZGlycCkKLXsKLQlpbnQgaTsKLQotCWlmIChmaXJzdF91bnVzZWRfaGFuZGxlID09IC0xKSB7Ci0JCWlmIChudW1faGFuZGxlcyArIDEgPD0gbnVtX2hhbmRsZXMpCi0JCQlyZXR1cm4gLTE7Ci0JCW51bV9oYW5kbGVzKys7Ci0JCWhhbmRsZXMgPSB4cmVhbGxvYyhoYW5kbGVzLCBudW1faGFuZGxlcywgc2l6ZW9mKEhhbmRsZSkpOwotCQloYW5kbGVfdW51c2VkKG51bV9oYW5kbGVzIC0gMSk7Ci0JfQotCi0JaSA9IGZpcnN0X3VudXNlZF9oYW5kbGU7Ci0JZmlyc3RfdW51c2VkX2hhbmRsZSA9IGhhbmRsZXNbaV0ubmV4dF91bnVzZWQ7Ci0KLQloYW5kbGVzW2ldLnVzZSA9IHVzZTsKLQloYW5kbGVzW2ldLmRpcnAgPSBkaXJwOwotCWhhbmRsZXNbaV0uZmQgPSBmZDsKLQloYW5kbGVzW2ldLm5hbWUgPSB4c3RyZHVwKG5hbWUpOwotCWhhbmRsZXNbaV0uYnl0ZXNfcmVhZCA9IGhhbmRsZXNbaV0uYnl0ZXNfd3JpdGUgPSAwOwotCi0JcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyBpbnQKLWhhbmRsZV9pc19vayhpbnQgaSwgaW50IHR5cGUpCi17Ci0JcmV0dXJuIGkgPj0gMCAmJiAodV9pbnQpaSA8IG51bV9oYW5kbGVzICYmIGhhbmRsZXNbaV0udXNlID09IHR5cGU7Ci19Ci0KLXN0YXRpYyBpbnQKLWhhbmRsZV90b19zdHJpbmcoaW50IGhhbmRsZSwgY2hhciAqKnN0cmluZ3AsIGludCAqaGxlbnApCi17Ci0JaWYgKHN0cmluZ3AgPT0gTlVMTCB8fCBobGVucCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JKnN0cmluZ3AgPSB4bWFsbG9jKHNpemVvZihpbnQzMl90KSk7Ci0JcHV0X3UzMigqc3RyaW5ncCwgaGFuZGxlKTsKLQkqaGxlbnAgPSBzaXplb2YoaW50MzJfdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWhhbmRsZV9mcm9tX3N0cmluZyhjb25zdCBjaGFyICpoYW5kbGUsIHVfaW50IGhsZW4pCi17Ci0JaW50IHZhbDsKLQotCWlmIChobGVuICE9IHNpemVvZihpbnQzMl90KSkKLQkJcmV0dXJuIC0xOwotCXZhbCA9IGdldF91MzIoaGFuZGxlKTsKLQlpZiAoaGFuZGxlX2lzX29rKHZhbCwgSEFORExFX0ZJTEUpIHx8Ci0JICAgIGhhbmRsZV9pc19vayh2YWwsIEhBTkRMRV9ESVIpKQotCQlyZXR1cm4gdmFsOwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGNoYXIgKgotaGFuZGxlX3RvX25hbWUoaW50IGhhbmRsZSkKLXsKLQlpZiAoaGFuZGxlX2lzX29rKGhhbmRsZSwgSEFORExFX0RJUil8fAotCSAgICBoYW5kbGVfaXNfb2soaGFuZGxlLCBIQU5ETEVfRklMRSkpCi0JCXJldHVybiBoYW5kbGVzW2hhbmRsZV0ubmFtZTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIERJUiAqCi1oYW5kbGVfdG9fZGlyKGludCBoYW5kbGUpCi17Ci0JaWYgKGhhbmRsZV9pc19vayhoYW5kbGUsIEhBTkRMRV9ESVIpKQotCQlyZXR1cm4gaGFuZGxlc1toYW5kbGVdLmRpcnA7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQKLWhhbmRsZV90b19mZChpbnQgaGFuZGxlKQotewotCWlmIChoYW5kbGVfaXNfb2soaGFuZGxlLCBIQU5ETEVfRklMRSkpCi0JCXJldHVybiBoYW5kbGVzW2hhbmRsZV0uZmQ7Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdm9pZAotaGFuZGxlX3VwZGF0ZV9yZWFkKGludCBoYW5kbGUsIHNzaXplX3QgYnl0ZXMpCi17Ci0JaWYgKGhhbmRsZV9pc19vayhoYW5kbGUsIEhBTkRMRV9GSUxFKSAmJiBieXRlcyA+IDApCi0JCWhhbmRsZXNbaGFuZGxlXS5ieXRlc19yZWFkICs9IGJ5dGVzOwotfQotCi1zdGF0aWMgdm9pZAotaGFuZGxlX3VwZGF0ZV93cml0ZShpbnQgaGFuZGxlLCBzc2l6ZV90IGJ5dGVzKQotewotCWlmIChoYW5kbGVfaXNfb2soaGFuZGxlLCBIQU5ETEVfRklMRSkgJiYgYnl0ZXMgPiAwKQotCQloYW5kbGVzW2hhbmRsZV0uYnl0ZXNfd3JpdGUgKz0gYnl0ZXM7Ci19Ci0KLXN0YXRpYyB1X2ludDY0X3QKLWhhbmRsZV9ieXRlc19yZWFkKGludCBoYW5kbGUpCi17Ci0JaWYgKGhhbmRsZV9pc19vayhoYW5kbGUsIEhBTkRMRV9GSUxFKSkKLQkJcmV0dXJuIChoYW5kbGVzW2hhbmRsZV0uYnl0ZXNfcmVhZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1X2ludDY0X3QKLWhhbmRsZV9ieXRlc193cml0ZShpbnQgaGFuZGxlKQotewotCWlmIChoYW5kbGVfaXNfb2soaGFuZGxlLCBIQU5ETEVfRklMRSkpCi0JCXJldHVybiAoaGFuZGxlc1toYW5kbGVdLmJ5dGVzX3dyaXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotaGFuZGxlX2Nsb3NlKGludCBoYW5kbGUpCi17Ci0JaW50IHJldCA9IC0xOwotCi0JaWYgKGhhbmRsZV9pc19vayhoYW5kbGUsIEhBTkRMRV9GSUxFKSkgewotCQlyZXQgPSBjbG9zZShoYW5kbGVzW2hhbmRsZV0uZmQpOwotCQl4ZnJlZShoYW5kbGVzW2hhbmRsZV0ubmFtZSk7Ci0JCWhhbmRsZV91bnVzZWQoaGFuZGxlKTsKLQl9IGVsc2UgaWYgKGhhbmRsZV9pc19vayhoYW5kbGUsIEhBTkRMRV9ESVIpKSB7Ci0JCXJldCA9IGNsb3NlZGlyKGhhbmRsZXNbaGFuZGxlXS5kaXJwKTsKLQkJeGZyZWUoaGFuZGxlc1toYW5kbGVdLm5hbWUpOwotCQloYW5kbGVfdW51c2VkKGhhbmRsZSk7Ci0JfSBlbHNlIHsKLQkJZXJybm8gPSBFTk9FTlQ7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1oYW5kbGVfbG9nX2Nsb3NlKGludCBoYW5kbGUsIGNoYXIgKmVtc2cpCi17Ci0JaWYgKGhhbmRsZV9pc19vayhoYW5kbGUsIEhBTkRMRV9GSUxFKSkgewotCQlsb2dpdCgiJXMlc2Nsb3NlIFwiJXNcIiBieXRlcyByZWFkICVsbHUgd3JpdHRlbiAlbGx1IiwKLQkJICAgIGVtc2cgPT0gTlVMTCA/ICIiIDogZW1zZywgZW1zZyA9PSBOVUxMID8gIiIgOiAiICIsCi0JCSAgICBoYW5kbGVfdG9fbmFtZShoYW5kbGUpLAotCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyloYW5kbGVfYnl0ZXNfcmVhZChoYW5kbGUpLAotCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyloYW5kbGVfYnl0ZXNfd3JpdGUoaGFuZGxlKSk7Ci0JfSBlbHNlIHsKLQkJbG9naXQoIiVzJXNjbG9zZWRpciBcIiVzXCIiLAotCQkgICAgZW1zZyA9PSBOVUxMID8gIiIgOiBlbXNnLCBlbXNnID09IE5VTEwgPyAiIiA6ICIgIiwKLQkJICAgIGhhbmRsZV90b19uYW1lKGhhbmRsZSkpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWhhbmRsZV9sb2dfZXhpdCh2b2lkKQotewotCXVfaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2hhbmRsZXM7IGkrKykKLQkJaWYgKGhhbmRsZXNbaV0udXNlICE9IEhBTkRMRV9VTlVTRUQpCi0JCQloYW5kbGVfbG9nX2Nsb3NlKGksICJmb3JjZWQiKTsKLX0KLQotc3RhdGljIGludAotZ2V0X2hhbmRsZSh2b2lkKQotewotCWNoYXIgKmhhbmRsZTsKLQlpbnQgdmFsID0gLTE7Ci0JdV9pbnQgaGxlbjsKLQotCWhhbmRsZSA9IGdldF9zdHJpbmcoJmhsZW4pOwotCWlmIChobGVuIDwgMjU2KQotCQl2YWwgPSBoYW5kbGVfZnJvbV9zdHJpbmcoaGFuZGxlLCBobGVuKTsKLQl4ZnJlZShoYW5kbGUpOwotCXJldHVybiB2YWw7Ci19Ci0KLS8qIHNlbmQgcmVwbGllcyAqLwotCi1zdGF0aWMgdm9pZAotc2VuZF9tc2coQnVmZmVyICptKQotewotCWludCBtbGVuID0gYnVmZmVyX2xlbihtKTsKLQotCWJ1ZmZlcl9wdXRfaW50KCZvcXVldWUsIG1sZW4pOwotCWJ1ZmZlcl9hcHBlbmQoJm9xdWV1ZSwgYnVmZmVyX3B0cihtKSwgbWxlbik7Ci0JYnVmZmVyX2NvbnN1bWUobSwgbWxlbik7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXN0YXR1c190b19tZXNzYWdlKHVfaW50MzJfdCBzdGF0dXMpCi17Ci0JY29uc3QgY2hhciAqc3RhdHVzX21lc3NhZ2VzW10gPSB7Ci0JCSJTdWNjZXNzIiwJCQkvKiBTU0hfRlhfT0sgKi8KLQkJIkVuZCBvZiBmaWxlIiwJCQkvKiBTU0hfRlhfRU9GICovCi0JCSJObyBzdWNoIGZpbGUiLAkJCS8qIFNTSF9GWF9OT19TVUNIX0ZJTEUgKi8KLQkJIlBlcm1pc3Npb24gZGVuaWVkIiwJCS8qIFNTSF9GWF9QRVJNSVNTSU9OX0RFTklFRCAqLwotCQkiRmFpbHVyZSIsCQkJLyogU1NIX0ZYX0ZBSUxVUkUgKi8KLQkJIkJhZCBtZXNzYWdlIiwJCQkvKiBTU0hfRlhfQkFEX01FU1NBR0UgKi8KLQkJIk5vIGNvbm5lY3Rpb24iLAkJLyogU1NIX0ZYX05PX0NPTk5FQ1RJT04gKi8KLQkJIkNvbm5lY3Rpb24gbG9zdCIsCQkvKiBTU0hfRlhfQ09OTkVDVElPTl9MT1NUICovCi0JCSJPcGVyYXRpb24gdW5zdXBwb3J0ZWQiLAkvKiBTU0hfRlhfT1BfVU5TVVBQT1JURUQgKi8KLQkJIlVua25vd24gZXJyb3IiCQkJLyogT3RoZXJzICovCi0JfTsKLQlyZXR1cm4gKHN0YXR1c19tZXNzYWdlc1tNSU4oc3RhdHVzLFNTSDJfRlhfTUFYKV0pOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZF9zdGF0dXModV9pbnQzMl90IGlkLCB1X2ludDMyX3Qgc3RhdHVzKQotewotCUJ1ZmZlciBtc2c7Ci0KLQlkZWJ1ZzMoInJlcXVlc3QgJXU6IHNlbnQgc3RhdHVzICV1IiwgaWQsIHN0YXR1cyk7Ci0JaWYgKGxvZ19sZXZlbCA+IFNZU0xPR19MRVZFTF9WRVJCT1NFIHx8Ci0JICAgIChzdGF0dXMgIT0gU1NIMl9GWF9PSyAmJiBzdGF0dXMgIT0gU1NIMl9GWF9FT0YpKQotCQlsb2dpdCgic2VudCBzdGF0dXMgJXMiLCBzdGF0dXNfdG9fbWVzc2FnZShzdGF0dXMpKTsKLQlidWZmZXJfaW5pdCgmbXNnKTsKLQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9GWFBfU1RBVFVTKTsKLQlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7Ci0JYnVmZmVyX3B1dF9pbnQoJm1zZywgc3RhdHVzKTsKLQlpZiAodmVyc2lvbiA+PSAzKSB7Ci0JCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBzdGF0dXNfdG9fbWVzc2FnZShzdGF0dXMpKTsKLQkJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csICIiKTsKLQl9Ci0Jc2VuZF9tc2coJm1zZyk7Ci0JYnVmZmVyX2ZyZWUoJm1zZyk7Ci19Ci1zdGF0aWMgdm9pZAotc2VuZF9kYXRhX29yX2hhbmRsZShjaGFyIHR5cGUsIHVfaW50MzJfdCBpZCwgY29uc3QgY2hhciAqZGF0YSwgaW50IGRsZW4pCi17Ci0JQnVmZmVyIG1zZzsKLQotCWJ1ZmZlcl9pbml0KCZtc2cpOwotCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCB0eXBlKTsKLQlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgZGF0YSwgZGxlbik7Ci0Jc2VuZF9tc2coJm1zZyk7Ci0JYnVmZmVyX2ZyZWUoJm1zZyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kX2RhdGEodV9pbnQzMl90IGlkLCBjb25zdCBjaGFyICpkYXRhLCBpbnQgZGxlbikKLXsKLQlkZWJ1ZygicmVxdWVzdCAldTogc2VudCBkYXRhIGxlbiAlZCIsIGlkLCBkbGVuKTsKLQlzZW5kX2RhdGFfb3JfaGFuZGxlKFNTSDJfRlhQX0RBVEEsIGlkLCBkYXRhLCBkbGVuKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmRfaGFuZGxlKHVfaW50MzJfdCBpZCwgaW50IGhhbmRsZSkKLXsKLQljaGFyICpzdHJpbmc7Ci0JaW50IGhsZW47Ci0KLQloYW5kbGVfdG9fc3RyaW5nKGhhbmRsZSwgJnN0cmluZywgJmhsZW4pOwotCWRlYnVnKCJyZXF1ZXN0ICV1OiBzZW50IGhhbmRsZSBoYW5kbGUgJWQiLCBpZCwgaGFuZGxlKTsKLQlzZW5kX2RhdGFfb3JfaGFuZGxlKFNTSDJfRlhQX0hBTkRMRSwgaWQsIHN0cmluZywgaGxlbik7Ci0JeGZyZWUoc3RyaW5nKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmRfbmFtZXModV9pbnQzMl90IGlkLCBpbnQgY291bnQsIGNvbnN0IFN0YXQgKnN0YXRzKQotewotCUJ1ZmZlciBtc2c7Ci0JaW50IGk7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIMl9GWFBfTkFNRSk7Ci0JYnVmZmVyX3B1dF9pbnQoJm1zZywgaWQpOwotCWJ1ZmZlcl9wdXRfaW50KCZtc2csIGNvdW50KTsKLQlkZWJ1ZygicmVxdWVzdCAldTogc2VudCBuYW1lcyBjb3VudCAlZCIsIGlkLCBjb3VudCk7Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIHN0YXRzW2ldLm5hbWUpOwotCQlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgc3RhdHNbaV0ubG9uZ19uYW1lKTsKLQkJZW5jb2RlX2F0dHJpYigmbXNnLCAmc3RhdHNbaV0uYXR0cmliKTsKLQl9Ci0Jc2VuZF9tc2coJm1zZyk7Ci0JYnVmZmVyX2ZyZWUoJm1zZyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kX2F0dHJpYih1X2ludDMyX3QgaWQsIGNvbnN0IEF0dHJpYiAqYSkKLXsKLQlCdWZmZXIgbXNnOwotCi0JZGVidWcoInJlcXVlc3QgJXU6IHNlbnQgYXR0cmliIGhhdmUgMHgleCIsIGlkLCBhLT5mbGFncyk7Ci0JYnVmZmVyX2luaXQoJm1zZyk7Ci0JYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfRlhQX0FUVFJTKTsKLQlidWZmZXJfcHV0X2ludCgmbXNnLCBpZCk7Ci0JZW5jb2RlX2F0dHJpYigmbXNnLCBhKTsKLQlzZW5kX21zZygmbXNnKTsKLQlidWZmZXJfZnJlZSgmbXNnKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmRfc3RhdHZmcyh1X2ludDMyX3QgaWQsIHN0cnVjdCBzdGF0dmZzICpzdCkKLXsKLQlCdWZmZXIgbXNnOwotCXVfaW50NjRfdCBmbGFnOwotCi0JZmxhZyA9IChzdC0+Zl9mbGFnICYgU1RfUkRPTkxZKSA/IFNTSDJfRlhFX1NUQVRWRlNfU1RfUkRPTkxZIDogMDsKLQlmbGFnIHw9IChzdC0+Zl9mbGFnICYgU1RfTk9TVUlEKSA/IFNTSDJfRlhFX1NUQVRWRlNfU1RfTk9TVUlEIDogMDsKLQotCWJ1ZmZlcl9pbml0KCZtc2cpOwotCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0ZYUF9FWFRFTkRFRF9SRVBMWSk7Ci0JYnVmZmVyX3B1dF9pbnQoJm1zZywgaWQpOwotCWJ1ZmZlcl9wdXRfaW50NjQoJm1zZywgc3QtPmZfYnNpemUpOwotCWJ1ZmZlcl9wdXRfaW50NjQoJm1zZywgc3QtPmZfZnJzaXplKTsKLQlidWZmZXJfcHV0X2ludDY0KCZtc2csIHN0LT5mX2Jsb2Nrcyk7Ci0JYnVmZmVyX3B1dF9pbnQ2NCgmbXNnLCBzdC0+Zl9iZnJlZSk7Ci0JYnVmZmVyX3B1dF9pbnQ2NCgmbXNnLCBzdC0+Zl9iYXZhaWwpOwotCWJ1ZmZlcl9wdXRfaW50NjQoJm1zZywgc3QtPmZfZmlsZXMpOwotCWJ1ZmZlcl9wdXRfaW50NjQoJm1zZywgc3QtPmZfZmZyZWUpOwotCWJ1ZmZlcl9wdXRfaW50NjQoJm1zZywgc3QtPmZfZmF2YWlsKTsKLQlidWZmZXJfcHV0X2ludDY0KCZtc2csIEZTSURfVE9fVUxPTkcoc3QtPmZfZnNpZCkpOwotCWJ1ZmZlcl9wdXRfaW50NjQoJm1zZywgZmxhZyk7Ci0JYnVmZmVyX3B1dF9pbnQ2NCgmbXNnLCBzdC0+Zl9uYW1lbWF4KTsKLQlzZW5kX21zZygmbXNnKTsKLQlidWZmZXJfZnJlZSgmbXNnKTsKLX0KLQotLyogcGFyc2UgaW5jb21pbmcgKi8KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfaW5pdCh2b2lkKQotewotCUJ1ZmZlciBtc2c7Ci0KLQl2ZXJzaW9uID0gZ2V0X2ludCgpOwotCXZlcmJvc2UoInJlY2VpdmVkIGNsaWVudCB2ZXJzaW9uICV1IiwgdmVyc2lvbik7Ci0JYnVmZmVyX2luaXQoJm1zZyk7Ci0JYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfRlhQX1ZFUlNJT04pOwotCWJ1ZmZlcl9wdXRfaW50KCZtc2csIFNTSDJfRklMRVhGRVJfVkVSU0lPTik7Ci0JLyogUE9TSVggcmVuYW1lIGV4dGVuc2lvbiAqLwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCAicG9zaXgtcmVuYW1lQG9wZW5zc2guY29tIik7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csICIxIik7IC8qIHZlcnNpb24gKi8KLQkvKiBzdGF0dmZzIGV4dGVuc2lvbiAqLwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCAic3RhdHZmc0BvcGVuc3NoLmNvbSIpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCAiMiIpOyAvKiB2ZXJzaW9uICovCi0JLyogZnN0YXR2ZnMgZXh0ZW5zaW9uICovCi0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csICJmc3RhdHZmc0BvcGVuc3NoLmNvbSIpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCAiMiIpOyAvKiB2ZXJzaW9uICovCi0JLyogaGFyZGxpbmsgZXh0ZW5zaW9uICovCi0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csICJoYXJkbGlua0BvcGVuc3NoLmNvbSIpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCAiMSIpOyAvKiB2ZXJzaW9uICovCi0Jc2VuZF9tc2coJm1zZyk7Ci0JYnVmZmVyX2ZyZWUoJm1zZyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX29wZW4odm9pZCkKLXsKLQl1X2ludDMyX3QgaWQsIHBmbGFnczsKLQlBdHRyaWIgKmE7Ci0JY2hhciAqbmFtZTsKLQlpbnQgaGFuZGxlLCBmZCwgZmxhZ3MsIG1vZGUsIHN0YXR1cyA9IFNTSDJfRlhfRkFJTFVSRTsKLQotCWlkID0gZ2V0X2ludCgpOwotCW5hbWUgPSBnZXRfc3RyaW5nKE5VTEwpOwotCXBmbGFncyA9IGdldF9pbnQoKTsJCS8qIHBvcnRhYmxlIGZsYWdzICovCi0JZGVidWczKCJyZXF1ZXN0ICV1OiBvcGVuIGZsYWdzICVkIiwgaWQsIHBmbGFncyk7Ci0JYSA9IGdldF9hdHRyaWIoKTsKLQlmbGFncyA9IGZsYWdzX2Zyb21fcG9ydGFibGUocGZsYWdzKTsKLQltb2RlID0gKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1BFUk1JU1NJT05TKSA/IGEtPnBlcm0gOiAwNjY2OwotCWxvZ2l0KCJvcGVuIFwiJXNcIiBmbGFncyAlcyBtb2RlIDAlbyIsCi0JICAgIG5hbWUsIHN0cmluZ19mcm9tX3BvcnRhYmxlKHBmbGFncyksIG1vZGUpOwotCWlmIChyZWFkb25seSAmJgotCSAgICAoKGZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1dST05MWSB8fCAoZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRXUikpCi0JCXN0YXR1cyA9IFNTSDJfRlhfUEVSTUlTU0lPTl9ERU5JRUQ7Ci0JZWxzZSB7Ci0JCWZkID0gb3BlbihuYW1lLCBmbGFncywgbW9kZSk7Ci0JCWlmIChmZCA8IDApIHsKLQkJCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKLQkJfSBlbHNlIHsKLQkJCWhhbmRsZSA9IGhhbmRsZV9uZXcoSEFORExFX0ZJTEUsIG5hbWUsIGZkLCBOVUxMKTsKLQkJCWlmIChoYW5kbGUgPCAwKSB7Ci0JCQkJY2xvc2UoZmQpOwotCQkJfSBlbHNlIHsKLQkJCQlzZW5kX2hhbmRsZShpZCwgaGFuZGxlKTsKLQkJCQlzdGF0dXMgPSBTU0gyX0ZYX09LOwotCQkJfQotCQl9Ci0JfQotCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9PSykKLQkJc2VuZF9zdGF0dXMoaWQsIHN0YXR1cyk7Ci0JeGZyZWUobmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2Nsb3NlKHZvaWQpCi17Ci0JdV9pbnQzMl90IGlkOwotCWludCBoYW5kbGUsIHJldCwgc3RhdHVzID0gU1NIMl9GWF9GQUlMVVJFOwotCi0JaWQgPSBnZXRfaW50KCk7Ci0JaGFuZGxlID0gZ2V0X2hhbmRsZSgpOwotCWRlYnVnMygicmVxdWVzdCAldTogY2xvc2UgaGFuZGxlICV1IiwgaWQsIGhhbmRsZSk7Ci0JaGFuZGxlX2xvZ19jbG9zZShoYW5kbGUsIE5VTEwpOwotCXJldCA9IGhhbmRsZV9jbG9zZShoYW5kbGUpOwotCXN0YXR1cyA9IChyZXQgPT0gLTEpID8gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pIDogU1NIMl9GWF9PSzsKLQlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfcmVhZCh2b2lkKQotewotCWNoYXIgYnVmWzY0KjEwMjRdOwotCXVfaW50MzJfdCBpZCwgbGVuOwotCWludCBoYW5kbGUsIGZkLCByZXQsIHN0YXR1cyA9IFNTSDJfRlhfRkFJTFVSRTsKLQl1X2ludDY0X3Qgb2ZmOwotCi0JaWQgPSBnZXRfaW50KCk7Ci0JaGFuZGxlID0gZ2V0X2hhbmRsZSgpOwotCW9mZiA9IGdldF9pbnQ2NCgpOwotCWxlbiA9IGdldF9pbnQoKTsKLQotCWRlYnVnKCJyZXF1ZXN0ICV1OiByZWFkIFwiJXNcIiAoaGFuZGxlICVkKSBvZmYgJWxsdSBsZW4gJWQiLAotCSAgICBpZCwgaGFuZGxlX3RvX25hbWUoaGFuZGxlKSwgaGFuZGxlLCAodW5zaWduZWQgbG9uZyBsb25nKW9mZiwgbGVuKTsKLQlpZiAobGVuID4gc2l6ZW9mIGJ1ZikgewotCQlsZW4gPSBzaXplb2YgYnVmOwotCQlkZWJ1ZzIoInJlYWQgY2hhbmdlIGxlbiAlZCIsIGxlbik7Ci0JfQotCWZkID0gaGFuZGxlX3RvX2ZkKGhhbmRsZSk7Ci0JaWYgKGZkID49IDApIHsKLQkJaWYgKGxzZWVrKGZkLCBvZmYsIFNFRUtfU0VUKSA8IDApIHsKLQkJCWVycm9yKCJwcm9jZXNzX3JlYWQ6IHNlZWsgZmFpbGVkIik7Ci0JCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSByZWFkKGZkLCBidWYsIGxlbik7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKLQkJCX0gZWxzZSBpZiAocmV0ID09IDApIHsKLQkJCQlzdGF0dXMgPSBTU0gyX0ZYX0VPRjsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VuZF9kYXRhKGlkLCBidWYsIHJldCk7Ci0JCQkJc3RhdHVzID0gU1NIMl9GWF9PSzsKLQkJCQloYW5kbGVfdXBkYXRlX3JlYWQoaGFuZGxlLCByZXQpOwotCQkJfQotCQl9Ci0JfQotCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9PSykKLQkJc2VuZF9zdGF0dXMoaWQsIHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX3dyaXRlKHZvaWQpCi17Ci0JdV9pbnQzMl90IGlkOwotCXVfaW50NjRfdCBvZmY7Ci0JdV9pbnQgbGVuOwotCWludCBoYW5kbGUsIGZkLCByZXQsIHN0YXR1czsKLQljaGFyICpkYXRhOwotCi0JaWQgPSBnZXRfaW50KCk7Ci0JaGFuZGxlID0gZ2V0X2hhbmRsZSgpOwotCW9mZiA9IGdldF9pbnQ2NCgpOwotCWRhdGEgPSBnZXRfc3RyaW5nKCZsZW4pOwotCi0JZGVidWcoInJlcXVlc3QgJXU6IHdyaXRlIFwiJXNcIiAoaGFuZGxlICVkKSBvZmYgJWxsdSBsZW4gJWQiLAotCSAgICBpZCwgaGFuZGxlX3RvX25hbWUoaGFuZGxlKSwgaGFuZGxlLCAodW5zaWduZWQgbG9uZyBsb25nKW9mZiwgbGVuKTsKLQlmZCA9IGhhbmRsZV90b19mZChoYW5kbGUpOwotCQotCWlmIChmZCA8IDApCi0JCXN0YXR1cyA9IFNTSDJfRlhfRkFJTFVSRTsKLQllbHNlIGlmIChyZWFkb25seSkKLQkJc3RhdHVzID0gU1NIMl9GWF9QRVJNSVNTSU9OX0RFTklFRDsKLQllbHNlIHsKLQkJaWYgKGxzZWVrKGZkLCBvZmYsIFNFRUtfU0VUKSA8IDApIHsKLQkJCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKLQkJCWVycm9yKCJwcm9jZXNzX3dyaXRlOiBzZWVrIGZhaWxlZCIpOwotCQl9IGVsc2UgewotLyogWFhYIEFUT01JQ0lPID8gKi8KLQkJCXJldCA9IHdyaXRlKGZkLCBkYXRhLCBsZW4pOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQllcnJvcigicHJvY2Vzc193cml0ZTogd3JpdGUgZmFpbGVkIik7Ci0JCQkJc3RhdHVzID0gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pOwotCQkJfSBlbHNlIGlmICgoc2l6ZV90KXJldCA9PSBsZW4pIHsKLQkJCQlzdGF0dXMgPSBTU0gyX0ZYX09LOwotCQkJCWhhbmRsZV91cGRhdGVfd3JpdGUoaGFuZGxlLCByZXQpOwotCQkJfSBlbHNlIHsKLQkJCQlkZWJ1ZzIoIm5vdGhpbmcgYXQgYWxsIHdyaXR0ZW4iKTsKLQkJCQlzdGF0dXMgPSBTU0gyX0ZYX0ZBSUxVUkU7Ci0JCQl9Ci0JCX0KLQl9Ci0Jc2VuZF9zdGF0dXMoaWQsIHN0YXR1cyk7Ci0JeGZyZWUoZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2RvX3N0YXQoaW50IGRvX2xzdGF0KQotewotCUF0dHJpYiBhOwotCXN0cnVjdCBzdGF0IHN0OwotCXVfaW50MzJfdCBpZDsKLQljaGFyICpuYW1lOwotCWludCByZXQsIHN0YXR1cyA9IFNTSDJfRlhfRkFJTFVSRTsKLQotCWlkID0gZ2V0X2ludCgpOwotCW5hbWUgPSBnZXRfc3RyaW5nKE5VTEwpOwotCWRlYnVnMygicmVxdWVzdCAldTogJXNzdGF0IiwgaWQsIGRvX2xzdGF0ID8gImwiIDogIiIpOwotCXZlcmJvc2UoIiVzc3RhdCBuYW1lIFwiJXNcIiIsIGRvX2xzdGF0ID8gImwiIDogIiIsIG5hbWUpOwotCXJldCA9IGRvX2xzdGF0ID8gbHN0YXQobmFtZSwgJnN0KSA6IHN0YXQobmFtZSwgJnN0KTsKLQlpZiAocmV0IDwgMCkgewotCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7Ci0JfSBlbHNlIHsKLQkJc3RhdF90b19hdHRyaWIoJnN0LCAmYSk7Ci0JCXNlbmRfYXR0cmliKGlkLCAmYSk7Ci0JCXN0YXR1cyA9IFNTSDJfRlhfT0s7Ci0JfQotCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9PSykKLQkJc2VuZF9zdGF0dXMoaWQsIHN0YXR1cyk7Ci0JeGZyZWUobmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX3N0YXQodm9pZCkKLXsKLQlwcm9jZXNzX2RvX3N0YXQoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2xzdGF0KHZvaWQpCi17Ci0JcHJvY2Vzc19kb19zdGF0KDEpOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19mc3RhdCh2b2lkKQotewotCUF0dHJpYiBhOwotCXN0cnVjdCBzdGF0IHN0OwotCXVfaW50MzJfdCBpZDsKLQlpbnQgZmQsIHJldCwgaGFuZGxlLCBzdGF0dXMgPSBTU0gyX0ZYX0ZBSUxVUkU7Ci0KLQlpZCA9IGdldF9pbnQoKTsKLQloYW5kbGUgPSBnZXRfaGFuZGxlKCk7Ci0JZGVidWcoInJlcXVlc3QgJXU6IGZzdGF0IFwiJXNcIiAoaGFuZGxlICV1KSIsCi0JICAgIGlkLCBoYW5kbGVfdG9fbmFtZShoYW5kbGUpLCBoYW5kbGUpOwotCWZkID0gaGFuZGxlX3RvX2ZkKGhhbmRsZSk7Ci0JaWYgKGZkID49IDApIHsKLQkJcmV0ID0gZnN0YXQoZmQsICZzdCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0X3RvX2F0dHJpYigmc3QsICZhKTsKLQkJCXNlbmRfYXR0cmliKGlkLCAmYSk7Ci0JCQlzdGF0dXMgPSBTU0gyX0ZYX09LOwotCQl9Ci0JfQotCWlmIChzdGF0dXMgIT0gU1NIMl9GWF9PSykKLQkJc2VuZF9zdGF0dXMoaWQsIHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCAqCi1hdHRyaWJfdG9fdHYoY29uc3QgQXR0cmliICphKQotewotCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0dlsyXTsKLQotCXR2WzBdLnR2X3NlYyA9IGEtPmF0aW1lOwotCXR2WzBdLnR2X3VzZWMgPSAwOwotCXR2WzFdLnR2X3NlYyA9IGEtPm10aW1lOwotCXR2WzFdLnR2X3VzZWMgPSAwOwotCXJldHVybiB0djsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3Nfc2V0c3RhdCh2b2lkKQotewotCUF0dHJpYiAqYTsKLQl1X2ludDMyX3QgaWQ7Ci0JY2hhciAqbmFtZTsKLQlpbnQgc3RhdHVzID0gU1NIMl9GWF9PSywgcmV0OwotCi0JaWQgPSBnZXRfaW50KCk7Ci0JbmFtZSA9IGdldF9zdHJpbmcoTlVMTCk7Ci0JYSA9IGdldF9hdHRyaWIoKTsKLQlkZWJ1ZygicmVxdWVzdCAldTogc2V0c3RhdCBuYW1lIFwiJXNcIiIsIGlkLCBuYW1lKTsKLQlpZiAocmVhZG9ubHkpIHsKLQkJc3RhdHVzID0gU1NIMl9GWF9QRVJNSVNTSU9OX0RFTklFRDsKLQkJYS0+ZmxhZ3MgPSAwOwotCX0KLQlpZiAoYS0+ZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfU0laRSkgewotCQlsb2dpdCgic2V0IFwiJXNcIiBzaXplICVsbHUiLAotCQkgICAgbmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylhLT5zaXplKTsKLQkJcmV0ID0gdHJ1bmNhdGUobmFtZSwgYS0+c2l6ZSk7Ci0JCWlmIChyZXQgPT0gLTEpCi0JCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7Ci0JfQotCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9QRVJNSVNTSU9OUykgewotCQlsb2dpdCgic2V0IFwiJXNcIiBtb2RlICUwNG8iLCBuYW1lLCBhLT5wZXJtKTsKLQkJcmV0ID0gY2htb2QobmFtZSwgYS0+cGVybSAmIDA3Nzc3KTsKLQkJaWYgKHJldCA9PSAtMSkKLQkJCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKLQl9Ci0JaWYgKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX0FDTU9EVElNRSkgewotCQljaGFyIGJ1Zls2NF07Ci0JCXRpbWVfdCB0ID0gYS0+bXRpbWU7Ci0KLQkJc3RyZnRpbWUoYnVmLCBzaXplb2YoYnVmKSwgIiVZJW0lZC0lSDolTTolUyIsCi0JCSAgICBsb2NhbHRpbWUoJnQpKTsKLQkJbG9naXQoInNldCBcIiVzXCIgbW9kdGltZSAlcyIsIG5hbWUsIGJ1Zik7Ci0JCXJldCA9IHV0aW1lcyhuYW1lLCBhdHRyaWJfdG9fdHYoYSkpOwotCQlpZiAocmV0ID09IC0xKQotCQkJc3RhdHVzID0gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pOwotCX0KLQlpZiAoYS0+ZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfVUlER0lEKSB7Ci0JCWxvZ2l0KCJzZXQgXCIlc1wiIG93bmVyICVsdSBncm91cCAlbHUiLCBuYW1lLAotCQkgICAgKHVfbG9uZylhLT51aWQsICh1X2xvbmcpYS0+Z2lkKTsKLQkJcmV0ID0gY2hvd24obmFtZSwgYS0+dWlkLCBhLT5naWQpOwotCQlpZiAocmV0ID09IC0xKQotCQkJc3RhdHVzID0gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pOwotCX0KLQlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKLQl4ZnJlZShuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZnNldHN0YXQodm9pZCkKLXsKLQlBdHRyaWIgKmE7Ci0JdV9pbnQzMl90IGlkOwotCWludCBoYW5kbGUsIGZkLCByZXQ7Ci0JaW50IHN0YXR1cyA9IFNTSDJfRlhfT0s7Ci0KLQlpZCA9IGdldF9pbnQoKTsKLQloYW5kbGUgPSBnZXRfaGFuZGxlKCk7Ci0JYSA9IGdldF9hdHRyaWIoKTsKLQlkZWJ1ZygicmVxdWVzdCAldTogZnNldHN0YXQgaGFuZGxlICVkIiwgaWQsIGhhbmRsZSk7Ci0JZmQgPSBoYW5kbGVfdG9fZmQoaGFuZGxlKTsKLQlpZiAoZmQgPCAwKQotCQlzdGF0dXMgPSBTU0gyX0ZYX0ZBSUxVUkU7Ci0JZWxzZSBpZiAocmVhZG9ubHkpCi0JCXN0YXR1cyA9IFNTSDJfRlhfUEVSTUlTU0lPTl9ERU5JRUQ7Ci0JZWxzZSB7Ci0JCWNoYXIgKm5hbWUgPSBoYW5kbGVfdG9fbmFtZShoYW5kbGUpOwotCi0JCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9TSVpFKSB7Ci0JCQlsb2dpdCgic2V0IFwiJXNcIiBzaXplICVsbHUiLAotCQkJICAgIG5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpYS0+c2l6ZSk7Ci0JCQlyZXQgPSBmdHJ1bmNhdGUoZmQsIGEtPnNpemUpOwotCQkJaWYgKHJldCA9PSAtMSkKLQkJCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7Ci0JCX0KLQkJaWYgKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1BFUk1JU1NJT05TKSB7Ci0JCQlsb2dpdCgic2V0IFwiJXNcIiBtb2RlICUwNG8iLCBuYW1lLCBhLT5wZXJtKTsKLSNpZmRlZiBIQVZFX0ZDSE1PRAotCQkJcmV0ID0gZmNobW9kKGZkLCBhLT5wZXJtICYgMDc3NzcpOwotI2Vsc2UKLQkJCXJldCA9IGNobW9kKG5hbWUsIGEtPnBlcm0gJiAwNzc3Nyk7Ci0jZW5kaWYKLQkJCWlmIChyZXQgPT0gLTEpCi0JCQkJc3RhdHVzID0gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pOwotCQl9Ci0JCWlmIChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9BQ01PRFRJTUUpIHsKLQkJCWNoYXIgYnVmWzY0XTsKLQkJCXRpbWVfdCB0ID0gYS0+bXRpbWU7Ci0KLQkJCXN0cmZ0aW1lKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlWSVtJWQtJUg6JU06JVMiLAotCQkJICAgIGxvY2FsdGltZSgmdCkpOwotCQkJbG9naXQoInNldCBcIiVzXCIgbW9kdGltZSAlcyIsIG5hbWUsIGJ1Zik7Ci0jaWZkZWYgSEFWRV9GVVRJTUVTCi0JCQlyZXQgPSBmdXRpbWVzKGZkLCBhdHRyaWJfdG9fdHYoYSkpOwotI2Vsc2UKLQkJCXJldCA9IHV0aW1lcyhuYW1lLCBhdHRyaWJfdG9fdHYoYSkpOwotI2VuZGlmCi0JCQlpZiAocmV0ID09IC0xKQotCQkJCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKLQkJfQotCQlpZiAoYS0+ZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfVUlER0lEKSB7Ci0JCQlsb2dpdCgic2V0IFwiJXNcIiBvd25lciAlbHUgZ3JvdXAgJWx1IiwgbmFtZSwKLQkJCSAgICAodV9sb25nKWEtPnVpZCwgKHVfbG9uZylhLT5naWQpOwotI2lmZGVmIEhBVkVfRkNIT1dOCi0JCQlyZXQgPSBmY2hvd24oZmQsIGEtPnVpZCwgYS0+Z2lkKTsKLSNlbHNlCi0JCQlyZXQgPSBjaG93bihuYW1lLCBhLT51aWQsIGEtPmdpZCk7Ci0jZW5kaWYKLQkJCWlmIChyZXQgPT0gLTEpCi0JCQkJc3RhdHVzID0gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pOwotCQl9Ci0JfQotCXNlbmRfc3RhdHVzKGlkLCBzdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19vcGVuZGlyKHZvaWQpCi17Ci0JRElSICpkaXJwID0gTlVMTDsKLQljaGFyICpwYXRoOwotCWludCBoYW5kbGUsIHN0YXR1cyA9IFNTSDJfRlhfRkFJTFVSRTsKLQl1X2ludDMyX3QgaWQ7Ci0KLQlpZCA9IGdldF9pbnQoKTsKLQlwYXRoID0gZ2V0X3N0cmluZyhOVUxMKTsKLQlkZWJ1ZzMoInJlcXVlc3QgJXU6IG9wZW5kaXIiLCBpZCk7Ci0JbG9naXQoIm9wZW5kaXIgXCIlc1wiIiwgcGF0aCk7Ci0JZGlycCA9IG9wZW5kaXIocGF0aCk7Ci0JaWYgKGRpcnAgPT0gTlVMTCkgewotCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7Ci0JfSBlbHNlIHsKLQkJaGFuZGxlID0gaGFuZGxlX25ldyhIQU5ETEVfRElSLCBwYXRoLCAwLCBkaXJwKTsKLQkJaWYgKGhhbmRsZSA8IDApIHsKLQkJCWNsb3NlZGlyKGRpcnApOwotCQl9IGVsc2UgewotCQkJc2VuZF9oYW5kbGUoaWQsIGhhbmRsZSk7Ci0JCQlzdGF0dXMgPSBTU0gyX0ZYX09LOwotCQl9Ci0KLQl9Ci0JaWYgKHN0YXR1cyAhPSBTU0gyX0ZYX09LKQotCQlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKLQl4ZnJlZShwYXRoKTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfcmVhZGRpcih2b2lkKQotewotCURJUiAqZGlycDsKLQlzdHJ1Y3QgZGlyZW50ICpkcDsKLQljaGFyICpwYXRoOwotCWludCBoYW5kbGU7Ci0JdV9pbnQzMl90IGlkOwotCi0JaWQgPSBnZXRfaW50KCk7Ci0JaGFuZGxlID0gZ2V0X2hhbmRsZSgpOwotCWRlYnVnKCJyZXF1ZXN0ICV1OiByZWFkZGlyIFwiJXNcIiAoaGFuZGxlICVkKSIsIGlkLAotCSAgICBoYW5kbGVfdG9fbmFtZShoYW5kbGUpLCBoYW5kbGUpOwotCWRpcnAgPSBoYW5kbGVfdG9fZGlyKGhhbmRsZSk7Ci0JcGF0aCA9IGhhbmRsZV90b19uYW1lKGhhbmRsZSk7Ci0JaWYgKGRpcnAgPT0gTlVMTCB8fCBwYXRoID09IE5VTEwpIHsKLQkJc2VuZF9zdGF0dXMoaWQsIFNTSDJfRlhfRkFJTFVSRSk7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHN0YXQgc3Q7Ci0JCWNoYXIgcGF0aG5hbWVbTUFYUEFUSExFTl07Ci0JCVN0YXQgKnN0YXRzOwotCQlpbnQgbnN0YXRzID0gMTAsIGNvdW50ID0gMCwgaTsKLQotCQlzdGF0cyA9IHhjYWxsb2MobnN0YXRzLCBzaXplb2YoU3RhdCkpOwotCQl3aGlsZSAoKGRwID0gcmVhZGRpcihkaXJwKSkgIT0gTlVMTCkgewotCQkJaWYgKGNvdW50ID49IG5zdGF0cykgewotCQkJCW5zdGF0cyAqPSAyOwotCQkJCXN0YXRzID0geHJlYWxsb2Moc3RhdHMsIG5zdGF0cywgc2l6ZW9mKFN0YXQpKTsKLQkJCX0KLS8qIFhYWCBPVkVSRkxPVyA/ICovCi0JCQlzbnByaW50ZihwYXRobmFtZSwgc2l6ZW9mIHBhdGhuYW1lLCAiJXMlcyVzIiwgcGF0aCwKLQkJCSAgICBzdHJjbXAocGF0aCwgIi8iKSA/ICIvIiA6ICIiLCBkcC0+ZF9uYW1lKTsKLQkJCWlmIChsc3RhdChwYXRobmFtZSwgJnN0KSA8IDApCi0JCQkJY29udGludWU7Ci0JCQlzdGF0X3RvX2F0dHJpYigmc3QsICYoc3RhdHNbY291bnRdLmF0dHJpYikpOwotCQkJc3RhdHNbY291bnRdLm5hbWUgPSB4c3RyZHVwKGRwLT5kX25hbWUpOwotCQkJc3RhdHNbY291bnRdLmxvbmdfbmFtZSA9IGxzX2ZpbGUoZHAtPmRfbmFtZSwgJnN0LCAwLCAwKTsKLQkJCWNvdW50Kys7Ci0JCQkvKiBzZW5kIHVwIHRvIDEwMCBlbnRyaWVzIGluIG9uZSBtZXNzYWdlICovCi0JCQkvKiBYWFggY2hlY2sgcGFja2V0IHNpemUgaW5zdGVhZCAqLwotCQkJaWYgKGNvdW50ID09IDEwMCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoY291bnQgPiAwKSB7Ci0JCQlzZW5kX25hbWVzKGlkLCBjb3VudCwgc3RhdHMpOwotCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQl4ZnJlZShzdGF0c1tpXS5uYW1lKTsKLQkJCQl4ZnJlZShzdGF0c1tpXS5sb25nX25hbWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJc2VuZF9zdGF0dXMoaWQsIFNTSDJfRlhfRU9GKTsKLQkJfQotCQl4ZnJlZShzdGF0cyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19yZW1vdmUodm9pZCkKLXsKLQljaGFyICpuYW1lOwotCXVfaW50MzJfdCBpZDsKLQlpbnQgc3RhdHVzID0gU1NIMl9GWF9GQUlMVVJFOwotCWludCByZXQ7Ci0KLQlpZCA9IGdldF9pbnQoKTsKLQluYW1lID0gZ2V0X3N0cmluZyhOVUxMKTsKLQlkZWJ1ZzMoInJlcXVlc3QgJXU6IHJlbW92ZSIsIGlkKTsKLQlsb2dpdCgicmVtb3ZlIG5hbWUgXCIlc1wiIiwgbmFtZSk7Ci0JaWYgKHJlYWRvbmx5KQotCQlzdGF0dXMgPSBTU0gyX0ZYX1BFUk1JU1NJT05fREVOSUVEOwotCWVsc2UgewotCQlyZXQgPSB1bmxpbmsobmFtZSk7Ci0JCXN0YXR1cyA9IChyZXQgPT0gLTEpID8gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pIDogU1NIMl9GWF9PSzsKLQl9Ci0Jc2VuZF9zdGF0dXMoaWQsIHN0YXR1cyk7Ci0JeGZyZWUobmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX21rZGlyKHZvaWQpCi17Ci0JQXR0cmliICphOwotCXVfaW50MzJfdCBpZDsKLQljaGFyICpuYW1lOwotCWludCByZXQsIG1vZGUsIHN0YXR1cyA9IFNTSDJfRlhfRkFJTFVSRTsKLQotCWlkID0gZ2V0X2ludCgpOwotCW5hbWUgPSBnZXRfc3RyaW5nKE5VTEwpOwotCWEgPSBnZXRfYXR0cmliKCk7Ci0JbW9kZSA9IChhLT5mbGFncyAmIFNTSDJfRklMRVhGRVJfQVRUUl9QRVJNSVNTSU9OUykgPwotCSAgICBhLT5wZXJtICYgMDc3NzcgOiAwNzc3OwotCWRlYnVnMygicmVxdWVzdCAldTogbWtkaXIiLCBpZCk7Ci0JbG9naXQoIm1rZGlyIG5hbWUgXCIlc1wiIG1vZGUgMCVvIiwgbmFtZSwgbW9kZSk7Ci0JaWYgKHJlYWRvbmx5KQotCQlzdGF0dXMgPSBTU0gyX0ZYX1BFUk1JU1NJT05fREVOSUVEOwotCWVsc2UgewotCQlyZXQgPSBta2RpcihuYW1lLCBtb2RlKTsKLQkJc3RhdHVzID0gKHJldCA9PSAtMSkgPyBlcnJub190b19wb3J0YWJsZShlcnJubykgOiBTU0gyX0ZYX09LOwotCX0KLQlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKLQl4ZnJlZShuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3Nfcm1kaXIodm9pZCkKLXsKLQl1X2ludDMyX3QgaWQ7Ci0JY2hhciAqbmFtZTsKLQlpbnQgcmV0LCBzdGF0dXM7Ci0KLQlpZCA9IGdldF9pbnQoKTsKLQluYW1lID0gZ2V0X3N0cmluZyhOVUxMKTsKLQlkZWJ1ZzMoInJlcXVlc3QgJXU6IHJtZGlyIiwgaWQpOwotCWxvZ2l0KCJybWRpciBuYW1lIFwiJXNcIiIsIG5hbWUpOwotCWlmIChyZWFkb25seSkKLQkJc3RhdHVzID0gU1NIMl9GWF9QRVJNSVNTSU9OX0RFTklFRDsKLQllbHNlIHsKLQkJcmV0ID0gcm1kaXIobmFtZSk7Ci0JCXN0YXR1cyA9IChyZXQgPT0gLTEpID8gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pIDogU1NIMl9GWF9PSzsKLQl9Ci0Jc2VuZF9zdGF0dXMoaWQsIHN0YXR1cyk7Ci0JeGZyZWUobmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX3JlYWxwYXRoKHZvaWQpCi17Ci0JY2hhciByZXNvbHZlZG5hbWVbTUFYUEFUSExFTl07Ci0JdV9pbnQzMl90IGlkOwotCWNoYXIgKnBhdGg7Ci0KLQlpZCA9IGdldF9pbnQoKTsKLQlwYXRoID0gZ2V0X3N0cmluZyhOVUxMKTsKLQlpZiAocGF0aFswXSA9PSAnXDAnKSB7Ci0JCXhmcmVlKHBhdGgpOwotCQlwYXRoID0geHN0cmR1cCgiLiIpOwotCX0KLQlkZWJ1ZzMoInJlcXVlc3QgJXU6IHJlYWxwYXRoIiwgaWQpOwotCXZlcmJvc2UoInJlYWxwYXRoIFwiJXNcIiIsIHBhdGgpOwotCWlmIChyZWFscGF0aChwYXRoLCByZXNvbHZlZG5hbWUpID09IE5VTEwpIHsKLQkJc2VuZF9zdGF0dXMoaWQsIGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKSk7Ci0JfSBlbHNlIHsKLQkJU3RhdCBzOwotCQlhdHRyaWJfY2xlYXIoJnMuYXR0cmliKTsKLQkJcy5uYW1lID0gcy5sb25nX25hbWUgPSByZXNvbHZlZG5hbWU7Ci0JCXNlbmRfbmFtZXMoaWQsIDEsICZzKTsKLQl9Ci0JeGZyZWUocGF0aCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX3JlbmFtZSh2b2lkKQotewotCXVfaW50MzJfdCBpZDsKLQljaGFyICpvbGRwYXRoLCAqbmV3cGF0aDsKLQlpbnQgc3RhdHVzOwotCXN0cnVjdCBzdGF0IHNiOwotCi0JaWQgPSBnZXRfaW50KCk7Ci0Jb2xkcGF0aCA9IGdldF9zdHJpbmcoTlVMTCk7Ci0JbmV3cGF0aCA9IGdldF9zdHJpbmcoTlVMTCk7Ci0JZGVidWczKCJyZXF1ZXN0ICV1OiByZW5hbWUiLCBpZCk7Ci0JbG9naXQoInJlbmFtZSBvbGQgXCIlc1wiIG5ldyBcIiVzXCIiLCBvbGRwYXRoLCBuZXdwYXRoKTsKLQlzdGF0dXMgPSBTU0gyX0ZYX0ZBSUxVUkU7Ci0JaWYgKHJlYWRvbmx5KQotCQlzdGF0dXMgPSBTU0gyX0ZYX1BFUk1JU1NJT05fREVOSUVEOwotCWVsc2UgaWYgKGxzdGF0KG9sZHBhdGgsICZzYikgPT0gLTEpCi0JCXN0YXR1cyA9IGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKTsKLQllbHNlIGlmIChTX0lTUkVHKHNiLnN0X21vZGUpKSB7Ci0JCS8qIFJhY2UtZnJlZSByZW5hbWUgb2YgcmVndWxhciBmaWxlcyAqLwotCQlpZiAobGluayhvbGRwYXRoLCBuZXdwYXRoKSA9PSAtMSkgewotCQkJaWYgKGVycm5vID09IEVPUE5PVFNVUFAgfHwgZXJybm8gPT0gRU5PU1lTCi0jaWZkZWYgRVhERVYKLQkJCSAgICB8fCBlcnJubyA9PSBFWERFVgotI2VuZGlmCi0jaWZkZWYgTElOS19PUE5PVFNVUFBfRVJSTk8KLQkJCSAgICB8fCBlcnJubyA9PSBMSU5LX09QTk9UU1VQUF9FUlJOTwotI2VuZGlmCi0JCQkgICAgKSB7Ci0JCQkJc3RydWN0IHN0YXQgc3Q7Ci0KLQkJCQkvKgotCQkJCSAqIGZzIGRvZXNuJ3Qgc3VwcG9ydCBsaW5rcywgc28gZmFsbCBiYWNrIHRvCi0JCQkJICogc3RhdCtyZW5hbWUuICBUaGlzIGlzIHJhY3kuCi0JCQkJICovCi0JCQkJaWYgKHN0YXQobmV3cGF0aCwgJnN0KSA9PSAtMSkgewotCQkJCQlpZiAocmVuYW1lKG9sZHBhdGgsIG5ld3BhdGgpID09IC0xKQotCQkJCQkJc3RhdHVzID0KLQkJCQkJCSAgICBlcnJub190b19wb3J0YWJsZShlcnJubyk7Ci0JCQkJCWVsc2UKLQkJCQkJCXN0YXR1cyA9IFNTSDJfRlhfT0s7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodW5saW5rKG9sZHBhdGgpID09IC0xKSB7Ci0JCQlzdGF0dXMgPSBlcnJub190b19wb3J0YWJsZShlcnJubyk7Ci0JCQkvKiBjbGVhbiBzcGFyZSBsaW5rICovCi0JCQl1bmxpbmsobmV3cGF0aCk7Ci0JCX0gZWxzZQotCQkJc3RhdHVzID0gU1NIMl9GWF9PSzsKLQl9IGVsc2UgaWYgKHN0YXQobmV3cGF0aCwgJnNiKSA9PSAtMSkgewotCQlpZiAocmVuYW1lKG9sZHBhdGgsIG5ld3BhdGgpID09IC0xKQotCQkJc3RhdHVzID0gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pOwotCQllbHNlCi0JCQlzdGF0dXMgPSBTU0gyX0ZYX09LOwotCX0KLQlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKLQl4ZnJlZShvbGRwYXRoKTsKLQl4ZnJlZShuZXdwYXRoKTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfcmVhZGxpbmsodm9pZCkKLXsKLQl1X2ludDMyX3QgaWQ7Ci0JaW50IGxlbjsKLQljaGFyIGJ1ZltNQVhQQVRITEVOXTsKLQljaGFyICpwYXRoOwotCi0JaWQgPSBnZXRfaW50KCk7Ci0JcGF0aCA9IGdldF9zdHJpbmcoTlVMTCk7Ci0JZGVidWczKCJyZXF1ZXN0ICV1OiByZWFkbGluayIsIGlkKTsKLQl2ZXJib3NlKCJyZWFkbGluayBcIiVzXCIiLCBwYXRoKTsKLQlpZiAoKGxlbiA9IHJlYWRsaW5rKHBhdGgsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKSkgPT0gLTEpCi0JCXNlbmRfc3RhdHVzKGlkLCBlcnJub190b19wb3J0YWJsZShlcnJubykpOwotCWVsc2UgewotCQlTdGF0IHM7Ci0KLQkJYnVmW2xlbl0gPSAnXDAnOwotCQlhdHRyaWJfY2xlYXIoJnMuYXR0cmliKTsKLQkJcy5uYW1lID0gcy5sb25nX25hbWUgPSBidWY7Ci0JCXNlbmRfbmFtZXMoaWQsIDEsICZzKTsKLQl9Ci0JeGZyZWUocGF0aCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX3N5bWxpbmsodm9pZCkKLXsKLQl1X2ludDMyX3QgaWQ7Ci0JY2hhciAqb2xkcGF0aCwgKm5ld3BhdGg7Ci0JaW50IHJldCwgc3RhdHVzOwotCi0JaWQgPSBnZXRfaW50KCk7Ci0Jb2xkcGF0aCA9IGdldF9zdHJpbmcoTlVMTCk7Ci0JbmV3cGF0aCA9IGdldF9zdHJpbmcoTlVMTCk7Ci0JZGVidWczKCJyZXF1ZXN0ICV1OiBzeW1saW5rIiwgaWQpOwotCWxvZ2l0KCJzeW1saW5rIG9sZCBcIiVzXCIgbmV3IFwiJXNcIiIsIG9sZHBhdGgsIG5ld3BhdGgpOwotCS8qIHRoaXMgd2lsbCBmYWlsIGlmICduZXdwYXRoJyBleGlzdHMgKi8KLQlpZiAocmVhZG9ubHkpCi0JCXN0YXR1cyA9IFNTSDJfRlhfUEVSTUlTU0lPTl9ERU5JRUQ7Ci0JZWxzZSB7Ci0JCXJldCA9IHN5bWxpbmsob2xkcGF0aCwgbmV3cGF0aCk7Ci0JCXN0YXR1cyA9IChyZXQgPT0gLTEpID8gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pIDogU1NIMl9GWF9PSzsKLQl9Ci0Jc2VuZF9zdGF0dXMoaWQsIHN0YXR1cyk7Ci0JeGZyZWUob2xkcGF0aCk7Ci0JeGZyZWUobmV3cGF0aCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2V4dGVuZGVkX3Bvc2l4X3JlbmFtZSh1X2ludDMyX3QgaWQpCi17Ci0JY2hhciAqb2xkcGF0aCwgKm5ld3BhdGg7Ci0JaW50IHJldCwgc3RhdHVzOwotCi0Jb2xkcGF0aCA9IGdldF9zdHJpbmcoTlVMTCk7Ci0JbmV3cGF0aCA9IGdldF9zdHJpbmcoTlVMTCk7Ci0JZGVidWczKCJyZXF1ZXN0ICV1OiBwb3NpeC1yZW5hbWUiLCBpZCk7Ci0JbG9naXQoInBvc2l4LXJlbmFtZSBvbGQgXCIlc1wiIG5ldyBcIiVzXCIiLCBvbGRwYXRoLCBuZXdwYXRoKTsKLQlpZiAocmVhZG9ubHkpCi0JCXN0YXR1cyA9IFNTSDJfRlhfUEVSTUlTU0lPTl9ERU5JRUQ7Ci0JZWxzZSB7Ci0JCXJldCA9IHJlbmFtZShvbGRwYXRoLCBuZXdwYXRoKTsKLQkJc3RhdHVzID0gKHJldCA9PSAtMSkgPyBlcnJub190b19wb3J0YWJsZShlcnJubykgOiBTU0gyX0ZYX09LOwotCX0KLQlzZW5kX3N0YXR1cyhpZCwgc3RhdHVzKTsKLQl4ZnJlZShvbGRwYXRoKTsKLQl4ZnJlZShuZXdwYXRoKTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZXh0ZW5kZWRfc3RhdHZmcyh1X2ludDMyX3QgaWQpCi17Ci0JY2hhciAqcGF0aDsKLQlzdHJ1Y3Qgc3RhdHZmcyBzdDsKLQotCXBhdGggPSBnZXRfc3RyaW5nKE5VTEwpOwotCWRlYnVnMygicmVxdWVzdCAldTogc3RhdGZzIiwgaWQpOwotCWxvZ2l0KCJzdGF0ZnMgXCIlc1wiIiwgcGF0aCk7Ci0KLQlpZiAoc3RhdHZmcyhwYXRoLCAmc3QpICE9IDApCi0JCXNlbmRfc3RhdHVzKGlkLCBlcnJub190b19wb3J0YWJsZShlcnJubykpOwotCWVsc2UKLQkJc2VuZF9zdGF0dmZzKGlkLCAmc3QpOwotICAgICAgICB4ZnJlZShwYXRoKTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZXh0ZW5kZWRfZnN0YXR2ZnModV9pbnQzMl90IGlkKQotewotCWludCBoYW5kbGUsIGZkOwotCXN0cnVjdCBzdGF0dmZzIHN0OwotCi0JaGFuZGxlID0gZ2V0X2hhbmRsZSgpOwotCWRlYnVnKCJyZXF1ZXN0ICV1OiBmc3RhdHZmcyBcIiVzXCIgKGhhbmRsZSAldSkiLAotCSAgICBpZCwgaGFuZGxlX3RvX25hbWUoaGFuZGxlKSwgaGFuZGxlKTsKLQlpZiAoKGZkID0gaGFuZGxlX3RvX2ZkKGhhbmRsZSkpIDwgMCkgewotCQlzZW5kX3N0YXR1cyhpZCwgU1NIMl9GWF9GQUlMVVJFKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoZnN0YXR2ZnMoZmQsICZzdCkgIT0gMCkKLQkJc2VuZF9zdGF0dXMoaWQsIGVycm5vX3RvX3BvcnRhYmxlKGVycm5vKSk7Ci0JZWxzZQotCQlzZW5kX3N0YXR2ZnMoaWQsICZzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2V4dGVuZGVkX2hhcmRsaW5rKHVfaW50MzJfdCBpZCkKLXsKLQljaGFyICpvbGRwYXRoLCAqbmV3cGF0aDsKLQlpbnQgcmV0LCBzdGF0dXM7Ci0KLQlvbGRwYXRoID0gZ2V0X3N0cmluZyhOVUxMKTsKLQluZXdwYXRoID0gZ2V0X3N0cmluZyhOVUxMKTsKLQlkZWJ1ZzMoInJlcXVlc3QgJXU6IGhhcmRsaW5rIiwgaWQpOwotCWxvZ2l0KCJoYXJkbGluayBvbGQgXCIlc1wiIG5ldyBcIiVzXCIiLCBvbGRwYXRoLCBuZXdwYXRoKTsKLQlpZiAocmVhZG9ubHkpCi0JCXN0YXR1cyA9IFNTSDJfRlhfUEVSTUlTU0lPTl9ERU5JRUQ7Ci0JZWxzZSB7Ci0JCXJldCA9IGxpbmsob2xkcGF0aCwgbmV3cGF0aCk7Ci0JCXN0YXR1cyA9IChyZXQgPT0gLTEpID8gZXJybm9fdG9fcG9ydGFibGUoZXJybm8pIDogU1NIMl9GWF9PSzsKLQl9Ci0Jc2VuZF9zdGF0dXMoaWQsIHN0YXR1cyk7Ci0JeGZyZWUob2xkcGF0aCk7Ci0JeGZyZWUobmV3cGF0aCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2V4dGVuZGVkKHZvaWQpCi17Ci0JdV9pbnQzMl90IGlkOwotCWNoYXIgKnJlcXVlc3Q7Ci0KLQlpZCA9IGdldF9pbnQoKTsKLQlyZXF1ZXN0ID0gZ2V0X3N0cmluZyhOVUxMKTsKLQlpZiAoc3RyY21wKHJlcXVlc3QsICJwb3NpeC1yZW5hbWVAb3BlbnNzaC5jb20iKSA9PSAwKQotCQlwcm9jZXNzX2V4dGVuZGVkX3Bvc2l4X3JlbmFtZShpZCk7Ci0JZWxzZSBpZiAoc3RyY21wKHJlcXVlc3QsICJzdGF0dmZzQG9wZW5zc2guY29tIikgPT0gMCkKLQkJcHJvY2Vzc19leHRlbmRlZF9zdGF0dmZzKGlkKTsKLQllbHNlIGlmIChzdHJjbXAocmVxdWVzdCwgImZzdGF0dmZzQG9wZW5zc2guY29tIikgPT0gMCkKLQkJcHJvY2Vzc19leHRlbmRlZF9mc3RhdHZmcyhpZCk7Ci0JZWxzZSBpZiAoc3RyY21wKHJlcXVlc3QsICJoYXJkbGlua0BvcGVuc3NoLmNvbSIpID09IDApCi0JCXByb2Nlc3NfZXh0ZW5kZWRfaGFyZGxpbmsoaWQpOwotCWVsc2UKLQkJc2VuZF9zdGF0dXMoaWQsIFNTSDJfRlhfT1BfVU5TVVBQT1JURUQpOwkvKiBNVVNUICovCi0JeGZyZWUocmVxdWVzdCk7Ci19Ci0KLS8qIHN0b2xlbiBmcm9tIHNzaC1hZ2VudCAqLwotCi1zdGF0aWMgdm9pZAotcHJvY2Vzcyh2b2lkKQotewotCXVfaW50IG1zZ19sZW47Ci0JdV9pbnQgYnVmX2xlbjsKLQl1X2ludCBjb25zdW1lZDsKLQl1X2ludCB0eXBlOwotCXVfY2hhciAqY3A7Ci0KLQlidWZfbGVuID0gYnVmZmVyX2xlbigmaXF1ZXVlKTsKLQlpZiAoYnVmX2xlbiA8IDUpCi0JCXJldHVybjsJCS8qIEluY29tcGxldGUgbWVzc2FnZS4gKi8KLQljcCA9IGJ1ZmZlcl9wdHIoJmlxdWV1ZSk7Ci0JbXNnX2xlbiA9IGdldF91MzIoY3ApOwotCWlmIChtc2dfbGVuID4gU0ZUUF9NQVhfTVNHX0xFTkdUSCkgewotCQllcnJvcigiYmFkIG1lc3NhZ2UgZnJvbSAlcyBsb2NhbCB1c2VyICVzIiwKLQkJICAgIGNsaWVudF9hZGRyLCBwdy0+cHdfbmFtZSk7Ci0JCXNmdHBfc2VydmVyX2NsZWFudXBfZXhpdCgxMSk7Ci0JfQotCWlmIChidWZfbGVuIDwgbXNnX2xlbiArIDQpCi0JCXJldHVybjsKLQlidWZmZXJfY29uc3VtZSgmaXF1ZXVlLCA0KTsKLQlidWZfbGVuIC09IDQ7Ci0JdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmaXF1ZXVlKTsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFNTSDJfRlhQX0lOSVQ6Ci0JCXByb2Nlc3NfaW5pdCgpOwotCQlicmVhazsKLQljYXNlIFNTSDJfRlhQX09QRU46Ci0JCXByb2Nlc3Nfb3BlbigpOwotCQlicmVhazsKLQljYXNlIFNTSDJfRlhQX0NMT1NFOgotCQlwcm9jZXNzX2Nsb3NlKCk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIMl9GWFBfUkVBRDoKLQkJcHJvY2Vzc19yZWFkKCk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIMl9GWFBfV1JJVEU6Ci0JCXByb2Nlc3Nfd3JpdGUoKTsKLQkJYnJlYWs7Ci0JY2FzZSBTU0gyX0ZYUF9MU1RBVDoKLQkJcHJvY2Vzc19sc3RhdCgpOwotCQlicmVhazsKLQljYXNlIFNTSDJfRlhQX0ZTVEFUOgotCQlwcm9jZXNzX2ZzdGF0KCk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIMl9GWFBfU0VUU1RBVDoKLQkJcHJvY2Vzc19zZXRzdGF0KCk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIMl9GWFBfRlNFVFNUQVQ6Ci0JCXByb2Nlc3NfZnNldHN0YXQoKTsKLQkJYnJlYWs7Ci0JY2FzZSBTU0gyX0ZYUF9PUEVORElSOgotCQlwcm9jZXNzX29wZW5kaXIoKTsKLQkJYnJlYWs7Ci0JY2FzZSBTU0gyX0ZYUF9SRUFERElSOgotCQlwcm9jZXNzX3JlYWRkaXIoKTsKLQkJYnJlYWs7Ci0JY2FzZSBTU0gyX0ZYUF9SRU1PVkU6Ci0JCXByb2Nlc3NfcmVtb3ZlKCk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIMl9GWFBfTUtESVI6Ci0JCXByb2Nlc3NfbWtkaXIoKTsKLQkJYnJlYWs7Ci0JY2FzZSBTU0gyX0ZYUF9STURJUjoKLQkJcHJvY2Vzc19ybWRpcigpOwotCQlicmVhazsKLQljYXNlIFNTSDJfRlhQX1JFQUxQQVRIOgotCQlwcm9jZXNzX3JlYWxwYXRoKCk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIMl9GWFBfU1RBVDoKLQkJcHJvY2Vzc19zdGF0KCk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIMl9GWFBfUkVOQU1FOgotCQlwcm9jZXNzX3JlbmFtZSgpOwotCQlicmVhazsKLQljYXNlIFNTSDJfRlhQX1JFQURMSU5LOgotCQlwcm9jZXNzX3JlYWRsaW5rKCk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIMl9GWFBfU1lNTElOSzoKLQkJcHJvY2Vzc19zeW1saW5rKCk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIMl9GWFBfRVhURU5ERUQ6Ci0JCXByb2Nlc3NfZXh0ZW5kZWQoKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyb3IoIlVua25vd24gbWVzc2FnZSAlZCIsIHR5cGUpOwotCQlicmVhazsKLQl9Ci0JLyogZGlzY2FyZCB0aGUgcmVtYWluaW5nIGJ5dGVzIGZyb20gdGhlIGN1cnJlbnQgcGFja2V0ICovCi0JaWYgKGJ1Zl9sZW4gPCBidWZmZXJfbGVuKCZpcXVldWUpKSB7Ci0JCWVycm9yKCJpcXVldWUgZ3JldyB1bmV4cGVjdGVkbHkiKTsKLQkJc2Z0cF9zZXJ2ZXJfY2xlYW51cF9leGl0KDI1NSk7Ci0JfQotCWNvbnN1bWVkID0gYnVmX2xlbiAtIGJ1ZmZlcl9sZW4oJmlxdWV1ZSk7Ci0JaWYgKG1zZ19sZW4gPCBjb25zdW1lZCkgewotCQllcnJvcigibXNnX2xlbiAlZCA8IGNvbnN1bWVkICVkIiwgbXNnX2xlbiwgY29uc3VtZWQpOwotCQlzZnRwX3NlcnZlcl9jbGVhbnVwX2V4aXQoMjU1KTsKLQl9Ci0JaWYgKG1zZ19sZW4gPiBjb25zdW1lZCkKLQkJYnVmZmVyX2NvbnN1bWUoJmlxdWV1ZSwgbXNnX2xlbiAtIGNvbnN1bWVkKTsKLX0KLQotLyogQ2xlYW51cCBoYW5kbGVyIHRoYXQgbG9ncyBhY3RpdmUgaGFuZGxlcyB1cG9uIG5vcm1hbCBleGl0ICovCi12b2lkCi1zZnRwX3NlcnZlcl9jbGVhbnVwX2V4aXQoaW50IGkpCi17Ci0JaWYgKHB3ICE9IE5VTEwgJiYgY2xpZW50X2FkZHIgIT0gTlVMTCkgewotCQloYW5kbGVfbG9nX2V4aXQoKTsKLQkJbG9naXQoInNlc3Npb24gY2xvc2VkIGZvciBsb2NhbCB1c2VyICVzIGZyb20gWyVzXSIsCi0JCSAgICBwdy0+cHdfbmFtZSwgY2xpZW50X2FkZHIpOwotCX0KLQlfZXhpdChpKTsKLX0KLQotc3RhdGljIHZvaWQKLXNmdHBfc2VydmVyX3VzYWdlKHZvaWQpCi17Ci0JZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7Ci0KLQlmcHJpbnRmKHN0ZGVyciwKLQkgICAgInVzYWdlOiAlcyBbLWVoUl0gWy1mIGxvZ19mYWNpbGl0eV0gWy1sIGxvZ19sZXZlbF0gWy11IHVtYXNrXVxuIiwKLQkgICAgX19wcm9nbmFtZSk7Ci0JZXhpdCgxKTsKLX0KLQotaW50Ci1zZnRwX3NlcnZlcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IHBhc3N3ZCAqdXNlcl9wdykKLXsKLQlmZF9zZXQgKnJzZXQsICp3c2V0OwotCWludCBpbiwgb3V0LCBtYXgsIGNoLCBza2lwYXJncyA9IDAsIGxvZ19zdGRlcnIgPSAwOwotCXNzaXplX3QgbGVuLCBvbGVuLCBzZXRfc2l6ZTsKLQlTeXNsb2dGYWNpbGl0eSBsb2dfZmFjaWxpdHkgPSBTWVNMT0dfRkFDSUxJVFlfQVVUSDsKLQljaGFyICpjcCwgYnVmWzQqNDA5Nl07Ci0JbG9uZyBtYXNrOwotCi0JZXh0ZXJuIGNoYXIgKm9wdGFyZzsKLQlleHRlcm4gY2hhciAqX19wcm9nbmFtZTsKLQotCV9fcHJvZ25hbWUgPSBzc2hfZ2V0X3Byb2duYW1lKGFyZ3ZbMF0pOwotCWxvZ19pbml0KF9fcHJvZ25hbWUsIGxvZ19sZXZlbCwgbG9nX2ZhY2lsaXR5LCBsb2dfc3RkZXJyKTsKLQotCXdoaWxlICghc2tpcGFyZ3MgJiYgKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJmOmw6dTpjZWhSIikpICE9IC0xKSB7Ci0JCXN3aXRjaCAoY2gpIHsKLQkJY2FzZSAnUic6Ci0JCQlyZWFkb25seSA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnYyc6Ci0JCQkvKgotCQkJICogSWdub3JlIGFsbCBhcmd1bWVudHMgaWYgd2UgYXJlIGludm9rZWQgYXMgYQotCQkJICogc2hlbGwgdXNpbmcgInNmdHAtc2VydmVyIC1jIGNvbW1hbmQiCi0JCQkgKi8KLQkJCXNraXBhcmdzID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdlJzoKLQkJCWxvZ19zdGRlcnIgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2wnOgotCQkJbG9nX2xldmVsID0gbG9nX2xldmVsX251bWJlcihvcHRhcmcpOwotCQkJaWYgKGxvZ19sZXZlbCA9PSBTWVNMT0dfTEVWRUxfTk9UX1NFVCkKLQkJCQllcnJvcigiSW52YWxpZCBsb2cgbGV2ZWwgXCIlc1wiIiwgb3B0YXJnKTsKLQkJCWJyZWFrOwotCQljYXNlICdmJzoKLQkJCWxvZ19mYWNpbGl0eSA9IGxvZ19mYWNpbGl0eV9udW1iZXIob3B0YXJnKTsKLQkJCWlmIChsb2dfZmFjaWxpdHkgPT0gU1lTTE9HX0ZBQ0lMSVRZX05PVF9TRVQpCi0JCQkJZXJyb3IoIkludmFsaWQgbG9nIGZhY2lsaXR5IFwiJXNcIiIsIG9wdGFyZyk7Ci0JCQlicmVhazsKLQkJY2FzZSAndSc6Ci0JCQllcnJubyA9IDA7Ci0JCQltYXNrID0gc3RydG9sKG9wdGFyZywgJmNwLCA4KTsKLQkJCWlmIChtYXNrIDwgMCB8fCBtYXNrID4gMDc3NyB8fCAqY3AgIT0gJ1wwJyB8fAotCQkJICAgIGNwID09IG9wdGFyZyB8fCAobWFzayA9PSAwICYmIGVycm5vICE9IDApKQotCQkJCWZhdGFsKCJJbnZhbGlkIHVtYXNrIFwiJXNcIiIsIG9wdGFyZyk7Ci0JCQkodm9pZCl1bWFzaygobW9kZV90KW1hc2spOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2gnOgotCQlkZWZhdWx0OgotCQkJc2Z0cF9zZXJ2ZXJfdXNhZ2UoKTsKLQkJfQotCX0KLQotCWxvZ19pbml0KF9fcHJvZ25hbWUsIGxvZ19sZXZlbCwgbG9nX2ZhY2lsaXR5LCBsb2dfc3RkZXJyKTsKLQotCWlmICgoY3AgPSBnZXRlbnYoIlNTSF9DT05ORUNUSU9OIikpICE9IE5VTEwpIHsKLQkJY2xpZW50X2FkZHIgPSB4c3RyZHVwKGNwKTsKLQkJaWYgKChjcCA9IHN0cmNocihjbGllbnRfYWRkciwgJyAnKSkgPT0gTlVMTCkgewotCQkJZXJyb3IoIk1hbGZvcm1lZCBTU0hfQ09OTkVDVElPTiB2YXJpYWJsZTogXCIlc1wiIiwKLQkJCSAgICBnZXRlbnYoIlNTSF9DT05ORUNUSU9OIikpOwotCQkJc2Z0cF9zZXJ2ZXJfY2xlYW51cF9leGl0KDI1NSk7Ci0JCX0KLQkJKmNwID0gJ1wwJzsKLQl9IGVsc2UKLQkJY2xpZW50X2FkZHIgPSB4c3RyZHVwKCJVTktOT1dOIik7Ci0KLQlwdyA9IHB3Y29weSh1c2VyX3B3KTsKLQotCWxvZ2l0KCJzZXNzaW9uIG9wZW5lZCBmb3IgbG9jYWwgdXNlciAlcyBmcm9tIFslc10iLAotCSAgICBwdy0+cHdfbmFtZSwgY2xpZW50X2FkZHIpOwotCi0JaW4gPSBTVERJTl9GSUxFTk87Ci0Jb3V0ID0gU1RET1VUX0ZJTEVOTzsKLQotI2lmZGVmIEhBVkVfQ1lHV0lOCi0Jc2V0bW9kZShpbiwgT19CSU5BUlkpOwotCXNldG1vZGUob3V0LCBPX0JJTkFSWSk7Ci0jZW5kaWYKLQotCW1heCA9IDA7Ci0JaWYgKGluID4gbWF4KQotCQltYXggPSBpbjsKLQlpZiAob3V0ID4gbWF4KQotCQltYXggPSBvdXQ7Ci0KLQlidWZmZXJfaW5pdCgmaXF1ZXVlKTsKLQlidWZmZXJfaW5pdCgmb3F1ZXVlKTsKLQotCXNldF9zaXplID0gaG93bWFueShtYXggKyAxLCBORkRCSVRTKSAqIHNpemVvZihmZF9tYXNrKTsKLQlyc2V0ID0gKGZkX3NldCAqKXhtYWxsb2Moc2V0X3NpemUpOwotCXdzZXQgPSAoZmRfc2V0ICopeG1hbGxvYyhzZXRfc2l6ZSk7Ci0KLQlmb3IgKDs7KSB7Ci0JCW1lbXNldChyc2V0LCAwLCBzZXRfc2l6ZSk7Ci0JCW1lbXNldCh3c2V0LCAwLCBzZXRfc2l6ZSk7Ci0KLQkJLyoKLQkJICogRW5zdXJlIHRoYXQgd2UgY2FuIHJlYWQgYSBmdWxsIGJ1ZmZlciBhbmQgaGFuZGxlCi0JCSAqIHRoZSB3b3JzdC1jYXNlIGxlbmd0aCBwYWNrZXQgaXQgY2FuIGdlbmVyYXRlLAotCQkgKiBvdGhlcndpc2UgYXBwbHkgYmFja3ByZXNzdXJlIGJ5IHN0b3BwaW5nIHJlYWRzLgotCQkgKi8KLQkJaWYgKGJ1ZmZlcl9jaGVja19hbGxvYygmaXF1ZXVlLCBzaXplb2YoYnVmKSkgJiYKLQkJICAgIGJ1ZmZlcl9jaGVja19hbGxvYygmb3F1ZXVlLCBTRlRQX01BWF9NU0dfTEVOR1RIKSkKLQkJCUZEX1NFVChpbiwgcnNldCk7Ci0KLQkJb2xlbiA9IGJ1ZmZlcl9sZW4oJm9xdWV1ZSk7Ci0JCWlmIChvbGVuID4gMCkKLQkJCUZEX1NFVChvdXQsIHdzZXQpOwotCi0JCWlmIChzZWxlY3QobWF4KzEsIHJzZXQsIHdzZXQsIE5VTEwsIE5VTEwpIDwgMCkgewotCQkJaWYgKGVycm5vID09IEVJTlRSKQotCQkJCWNvbnRpbnVlOwotCQkJZXJyb3IoInNlbGVjdDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJc2Z0cF9zZXJ2ZXJfY2xlYW51cF9leGl0KDIpOwotCQl9Ci0KLQkJLyogY29weSBzdGRpbiB0byBpcXVldWUgKi8KLQkJaWYgKEZEX0lTU0VUKGluLCByc2V0KSkgewotCQkJbGVuID0gcmVhZChpbiwgYnVmLCBzaXplb2YgYnVmKTsKLQkJCWlmIChsZW4gPT0gMCkgewotCQkJCWRlYnVnKCJyZWFkIGVvZiIpOwotCQkJCXNmdHBfc2VydmVyX2NsZWFudXBfZXhpdCgwKTsKLQkJCX0gZWxzZSBpZiAobGVuIDwgMCkgewotCQkJCWVycm9yKCJyZWFkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQkJc2Z0cF9zZXJ2ZXJfY2xlYW51cF9leGl0KDEpOwotCQkJfSBlbHNlIHsKLQkJCQlidWZmZXJfYXBwZW5kKCZpcXVldWUsIGJ1ZiwgbGVuKTsKLQkJCX0KLQkJfQotCQkvKiBzZW5kIG9xdWV1ZSB0byBzdGRvdXQgKi8KLQkJaWYgKEZEX0lTU0VUKG91dCwgd3NldCkpIHsKLQkJCWxlbiA9IHdyaXRlKG91dCwgYnVmZmVyX3B0cigmb3F1ZXVlKSwgb2xlbik7Ci0JCQlpZiAobGVuIDwgMCkgewotCQkJCWVycm9yKCJ3cml0ZTogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJCXNmdHBfc2VydmVyX2NsZWFudXBfZXhpdCgxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnVmZmVyX2NvbnN1bWUoJm9xdWV1ZSwgbGVuKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFByb2Nlc3MgcmVxdWVzdHMgZnJvbSBjbGllbnQgaWYgd2UgY2FuIGZpdCB0aGUgcmVzdWx0cwotCQkgKiBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLCBvdGhlcndpc2Ugc3RvcCBwcm9jZXNzaW5nIGlucHV0Ci0JCSAqIGFuZCBsZXQgdGhlIG91dHB1dCBxdWV1ZSBkcmFpbi4KLQkJICovCi0JCWlmIChidWZmZXJfY2hlY2tfYWxsb2MoJm9xdWV1ZSwgU0ZUUF9NQVhfTVNHX0xFTkdUSCkpCi0JCQlwcm9jZXNzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc2Z0cC4wIGIvc2Z0cC4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjk3NzY3Li4wMDAwMDAwCi0tLSBhL3NmdHAuMAorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi1TRlRQKDEpICAgICAgICAgICAgICAgICAgICBPcGVuQlNEIFJlZmVyZW5jZSBNYW51YWwgICAgICAgICAgICAgICAgICAgIFNGVFAoMSkKLQotTkFNRQotICAgICBzZnRwIC0gc2VjdXJlIGZpbGUgdHJhbnNmZXIgcHJvZ3JhbQotCi1TWU5PUFNJUwotICAgICBzZnRwIFstMTI0NkNwcXJ2XSBbLUIgYnVmZmVyX3NpemVdIFstYiBiYXRjaGZpbGVdIFstYyBjaXBoZXJdCi0gICAgICAgICAgWy1EIHNmdHBfc2VydmVyX3BhdGhdIFstRiBzc2hfY29uZmlnXSBbLWkgaWRlbnRpdHlfZmlsZV0gWy1sIGxpbWl0XQotICAgICAgICAgIFstbyBzc2hfb3B0aW9uXSBbLVAgcG9ydF0gWy1SIG51bV9yZXF1ZXN0c10gWy1TIHByb2dyYW1dCi0gICAgICAgICAgWy1zIHN1YnN5c3RlbSB8IHNmdHBfc2VydmVyXSBob3N0Ci0gICAgIHNmdHAgW3VzZXJAXWhvc3RbOmZpbGUgLi4uXQotICAgICBzZnRwIFt1c2VyQF1ob3N0WzpkaXJbL11dCi0gICAgIHNmdHAgLWIgYmF0Y2hmaWxlIFt1c2VyQF1ob3N0Ci0KLURFU0NSSVBUSU9OCi0gICAgIHNmdHAgaXMgYW4gaW50ZXJhY3RpdmUgZmlsZSB0cmFuc2ZlciBwcm9ncmFtLCBzaW1pbGFyIHRvIGZ0cCgxKSwgd2hpY2gKLSAgICAgcGVyZm9ybXMgYWxsIG9wZXJhdGlvbnMgb3ZlciBhbiBlbmNyeXB0ZWQgc3NoKDEpIHRyYW5zcG9ydC4gIEl0IG1heSBhbHNvCi0gICAgIHVzZSBtYW55IGZlYXR1cmVzIG9mIHNzaCwgc3VjaCBhcyBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIGFuZAotICAgICBjb21wcmVzc2lvbi4gIHNmdHAgY29ubmVjdHMgYW5kIGxvZ3MgaW50byB0aGUgc3BlY2lmaWVkIGhvc3QsIHRoZW4gZW50ZXJzCi0gICAgIGFuIGludGVyYWN0aXZlIGNvbW1hbmQgbW9kZS4KLQotICAgICBUaGUgc2Vjb25kIHVzYWdlIGZvcm1hdCB3aWxsIHJldHJpZXZlIGZpbGVzIGF1dG9tYXRpY2FsbHkgaWYgYSBub24tCi0gICAgIGludGVyYWN0aXZlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBpcyB1c2VkOyBvdGhlcndpc2UgaXQgd2lsbCBkbyBzbyBhZnRlcgotICAgICBzdWNjZXNzZnVsIGludGVyYWN0aXZlIGF1dGhlbnRpY2F0aW9uLgotCi0gICAgIFRoZSB0aGlyZCB1c2FnZSBmb3JtYXQgYWxsb3dzIHNmdHAgdG8gc3RhcnQgaW4gYSByZW1vdGUgZGlyZWN0b3J5LgotCi0gICAgIFRoZSBmaW5hbCB1c2FnZSBmb3JtYXQgYWxsb3dzIGZvciBhdXRvbWF0ZWQgc2Vzc2lvbnMgdXNpbmcgdGhlIC1iIG9wdGlvbi4KLSAgICAgSW4gc3VjaCBjYXNlcywgaXQgaXMgbmVjZXNzYXJ5IHRvIGNvbmZpZ3VyZSBub24taW50ZXJhY3RpdmUKLSAgICAgYXV0aGVudGljYXRpb24gdG8gb2J2aWF0ZSB0aGUgbmVlZCB0byBlbnRlciBhIHBhc3N3b3JkIGF0IGNvbm5lY3Rpb24gdGltZQotICAgICAoc2VlIHNzaGQoOCkgYW5kIHNzaC1rZXlnZW4oMSkgZm9yIGRldGFpbHMpLgotCi0gICAgIFNpbmNlIHNvbWUgdXNhZ2UgZm9ybWF0cyB1c2UgY29sb24gY2hhcmFjdGVycyB0byBkZWxpbWl0IGhvc3QgbmFtZXMgZnJvbQotICAgICBwYXRoIG5hbWVzLCBJUHY2IGFkZHJlc3NlcyBtdXN0IGJlIGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cyB0byBhdm9pZAotICAgICBhbWJpZ3VpdHkuCi0KLSAgICAgVGhlIG9wdGlvbnMgYXJlIGFzIGZvbGxvd3M6Ci0KLSAgICAgLTEgICAgICBTcGVjaWZ5IHRoZSB1c2Ugb2YgcHJvdG9jb2wgdmVyc2lvbiAxLgotCi0gICAgIC0yICAgICAgU3BlY2lmeSB0aGUgdXNlIG9mIHByb3RvY29sIHZlcnNpb24gMi4KLQotICAgICAtNCAgICAgIEZvcmNlcyBzZnRwIHRvIHVzZSBJUHY0IGFkZHJlc3NlcyBvbmx5LgotCi0gICAgIC02ICAgICAgRm9yY2VzIHNmdHAgdG8gdXNlIElQdjYgYWRkcmVzc2VzIG9ubHkuCi0KLSAgICAgLUIgYnVmZmVyX3NpemUKLSAgICAgICAgICAgICBTcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhhdCBzZnRwIHVzZXMgd2hlbiB0cmFuc2ZlcnJpbmcKLSAgICAgICAgICAgICBmaWxlcy4gIExhcmdlciBidWZmZXJzIHJlcXVpcmUgZmV3ZXIgcm91bmQgdHJpcHMgYXQgdGhlIGNvc3Qgb2YKLSAgICAgICAgICAgICBoaWdoZXIgbWVtb3J5IGNvbnN1bXB0aW9uLiAgVGhlIGRlZmF1bHQgaXMgMzI3NjggYnl0ZXMuCi0KLSAgICAgLWIgYmF0Y2hmaWxlCi0gICAgICAgICAgICAgQmF0Y2ggbW9kZSByZWFkcyBhIHNlcmllcyBvZiBjb21tYW5kcyBmcm9tIGFuIGlucHV0IGJhdGNoZmlsZQotICAgICAgICAgICAgIGluc3RlYWQgb2Ygc3RkaW4uICBTaW5jZSBpdCBsYWNrcyB1c2VyIGludGVyYWN0aW9uIGl0IHNob3VsZCBiZQotICAgICAgICAgICAgIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBub24taW50ZXJhY3RpdmUgYXV0aGVudGljYXRpb24uICBBCi0gICAgICAgICAgICAgYmF0Y2hmaWxlIG9mIGAtJyBtYXkgYmUgdXNlZCB0byBpbmRpY2F0ZSBzdGFuZGFyZCBpbnB1dC4gIHNmdHAKLSAgICAgICAgICAgICB3aWxsIGFib3J0IGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIGZhaWw6IGdldCwgcHV0LAotICAgICAgICAgICAgIHJlbmFtZSwgbG4sIHJtLCBta2RpciwgY2hkaXIsIGxzLCBsY2hkaXIsIGNobW9kLCBjaG93biwgY2hncnAsCi0gICAgICAgICAgICAgbHB3ZCwgZGYsIHN5bWxpbmssIGFuZCBsbWtkaXIuICBUZXJtaW5hdGlvbiBvbiBlcnJvciBjYW4gYmUKLSAgICAgICAgICAgICBzdXBwcmVzc2VkIG9uIGEgY29tbWFuZCBieSBjb21tYW5kIGJhc2lzIGJ5IHByZWZpeGluZyB0aGUgY29tbWFuZAotICAgICAgICAgICAgIHdpdGggYSBgLScgY2hhcmFjdGVyIChmb3IgZXhhbXBsZSwgLXJtIC90bXAvYmxhaCopLgotCi0gICAgIC1DICAgICAgRW5hYmxlcyBjb21wcmVzc2lvbiAodmlhIHNzaCdzIC1DIGZsYWcpLgotCi0gICAgIC1jIGNpcGhlcgotICAgICAgICAgICAgIFNlbGVjdHMgdGhlIGNpcGhlciB0byB1c2UgZm9yIGVuY3J5cHRpbmcgdGhlIGRhdGEgdHJhbnNmZXJzLgotICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGlzIGRpcmVjdGx5IHBhc3NlZCB0byBzc2goMSkuCi0KLSAgICAgLUQgc2Z0cF9zZXJ2ZXJfcGF0aAotICAgICAgICAgICAgIENvbm5lY3QgZGlyZWN0bHkgdG8gYSBsb2NhbCBzZnRwIHNlcnZlciAocmF0aGVyIHRoYW4gdmlhIHNzaCgxKSkuCi0gICAgICAgICAgICAgVGhpcyBvcHRpb24gbWF5IGJlIHVzZWZ1bCBpbiBkZWJ1Z2dpbmcgdGhlIGNsaWVudCBhbmQgc2VydmVyLgotCi0gICAgIC1GIHNzaF9jb25maWcKLSAgICAgICAgICAgICBTcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlIGZvciBzc2goMSkuCi0gICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgZGlyZWN0bHkgcGFzc2VkIHRvIHNzaCgxKS4KLQotICAgICAtaSBpZGVudGl0eV9maWxlCi0gICAgICAgICAgICAgU2VsZWN0cyB0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZSBpZGVudGl0eSAocHJpdmF0ZSBrZXkpIGZvciBwdWJsaWMKLSAgICAgICAgICAgICBrZXkgYXV0aGVudGljYXRpb24gaXMgcmVhZC4gIFRoaXMgb3B0aW9uIGlzIGRpcmVjdGx5IHBhc3NlZCB0bwotICAgICAgICAgICAgIHNzaCgxKS4KLQotICAgICAtbCBsaW1pdAotICAgICAgICAgICAgIExpbWl0cyB0aGUgdXNlZCBiYW5kd2lkdGgsIHNwZWNpZmllZCBpbiBLYml0L3MuCi0KLSAgICAgLW8gc3NoX29wdGlvbgotICAgICAgICAgICAgIENhbiBiZSB1c2VkIHRvIHBhc3Mgb3B0aW9ucyB0byBzc2ggaW4gdGhlIGZvcm1hdCB1c2VkIGluCi0gICAgICAgICAgICAgc3NoX2NvbmZpZyg1KS4gIFRoaXMgaXMgdXNlZnVsIGZvciBzcGVjaWZ5aW5nIG9wdGlvbnMgZm9yIHdoaWNoCi0gICAgICAgICAgICAgdGhlcmUgaXMgbm8gc2VwYXJhdGUgc2Z0cCBjb21tYW5kLWxpbmUgZmxhZy4gIEZvciBleGFtcGxlLCB0bwotICAgICAgICAgICAgIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIHBvcnQgdXNlOiBzZnRwIC1vUG9ydD0yNC4gIEZvciBmdWxsIGRldGFpbHMKLSAgICAgICAgICAgICBvZiB0aGUgb3B0aW9ucyBsaXN0ZWQgYmVsb3csIGFuZCB0aGVpciBwb3NzaWJsZSB2YWx1ZXMsIHNlZQotICAgICAgICAgICAgIHNzaF9jb25maWcoNSkuCi0KLSAgICAgICAgICAgICAgICAgICBBZGRyZXNzRmFtaWx5Ci0gICAgICAgICAgICAgICAgICAgQmF0Y2hNb2RlCi0gICAgICAgICAgICAgICAgICAgQmluZEFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgQ2hlY2tIb3N0SVAKLSAgICAgICAgICAgICAgICAgICBDaXBoZXIKLSAgICAgICAgICAgICAgICAgICBDaXBoZXJzCi0gICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24KLSAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbkxldmVsCi0gICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkF0dGVtcHRzCi0gICAgICAgICAgICAgICAgICAgQ29ubmVjdFRpbWVvdXQKLSAgICAgICAgICAgICAgICAgICBDb250cm9sTWFzdGVyCi0gICAgICAgICAgICAgICAgICAgQ29udHJvbFBhdGgKLSAgICAgICAgICAgICAgICAgICBHbG9iYWxLbm93bkhvc3RzRmlsZQotICAgICAgICAgICAgICAgICAgIEdTU0FQSUF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgR1NTQVBJRGVsZWdhdGVDcmVkZW50aWFscwotICAgICAgICAgICAgICAgICAgIEhhc2hLbm93bkhvc3RzCi0gICAgICAgICAgICAgICAgICAgSG9zdAotICAgICAgICAgICAgICAgICAgIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgSG9zdEtleUFsZ29yaXRobXMKLSAgICAgICAgICAgICAgICAgICBIb3N0S2V5QWxpYXMKLSAgICAgICAgICAgICAgICAgICBIb3N0TmFtZQotICAgICAgICAgICAgICAgICAgIElkZW50aXR5RmlsZQotICAgICAgICAgICAgICAgICAgIElkZW50aXRpZXNPbmx5Ci0gICAgICAgICAgICAgICAgICAgSVBRb1MKLSAgICAgICAgICAgICAgICAgICBLYmRJbnRlcmFjdGl2ZURldmljZXMKLSAgICAgICAgICAgICAgICAgICBLZXhBbGdvcml0aG1zCi0gICAgICAgICAgICAgICAgICAgTG9nTGV2ZWwKLSAgICAgICAgICAgICAgICAgICBNQUNzCi0gICAgICAgICAgICAgICAgICAgTm9Ib3N0QXV0aGVudGljYXRpb25Gb3JMb2NhbGhvc3QKLSAgICAgICAgICAgICAgICAgICBOdW1iZXJPZlBhc3N3b3JkUHJvbXB0cwotICAgICAgICAgICAgICAgICAgIFBhc3N3b3JkQXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICAgICBQS0NTMTFQcm92aWRlcgotICAgICAgICAgICAgICAgICAgIFBvcnQKLSAgICAgICAgICAgICAgICAgICBQcmVmZXJyZWRBdXRoZW50aWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgICBQcm90b2NvbAotICAgICAgICAgICAgICAgICAgIFByb3h5Q29tbWFuZAotICAgICAgICAgICAgICAgICAgIFB1YmtleUF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgUmVrZXlMaW1pdAotICAgICAgICAgICAgICAgICAgIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgUlNBQXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICAgICBTZW5kRW52Ci0gICAgICAgICAgICAgICAgICAgU2VydmVyQWxpdmVJbnRlcnZhbAotICAgICAgICAgICAgICAgICAgIFNlcnZlckFsaXZlQ291bnRNYXgKLSAgICAgICAgICAgICAgICAgICBTdHJpY3RIb3N0S2V5Q2hlY2tpbmcKLSAgICAgICAgICAgICAgICAgICBUQ1BLZWVwQWxpdmUKLSAgICAgICAgICAgICAgICAgICBVc2VQcml2aWxlZ2VkUG9ydAotICAgICAgICAgICAgICAgICAgIFVzZXIKLSAgICAgICAgICAgICAgICAgICBVc2VyS25vd25Ib3N0c0ZpbGUKLSAgICAgICAgICAgICAgICAgICBWZXJpZnlIb3N0S2V5RE5TCi0KLSAgICAgLVAgcG9ydAotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcG9ydCB0byBjb25uZWN0IHRvIG9uIHRoZSByZW1vdGUgaG9zdC4KLQotICAgICAtcCAgICAgIFByZXNlcnZlcyBtb2RpZmljYXRpb24gdGltZXMsIGFjY2VzcyB0aW1lcywgYW5kIG1vZGVzIGZyb20gdGhlCi0gICAgICAgICAgICAgb3JpZ2luYWwgZmlsZXMgdHJhbnNmZXJyZWQuCi0KLSAgICAgLXEgICAgICBRdWlldCBtb2RlOiBkaXNhYmxlcyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYXMgd2VsbCBhcyB3YXJuaW5nIGFuZAotICAgICAgICAgICAgIGRpYWdub3N0aWMgbWVzc2FnZXMgZnJvbSBzc2goMSkuCi0KLSAgICAgLVIgbnVtX3JlcXVlc3RzCi0gICAgICAgICAgICAgU3BlY2lmeSBob3cgbWFueSByZXF1ZXN0cyBtYXkgYmUgb3V0c3RhbmRpbmcgYXQgYW55IG9uZSB0aW1lLgotICAgICAgICAgICAgIEluY3JlYXNpbmcgdGhpcyBtYXkgc2xpZ2h0bHkgaW1wcm92ZSBmaWxlIHRyYW5zZmVyIHNwZWVkIGJ1dCB3aWxsCi0gICAgICAgICAgICAgaW5jcmVhc2UgbWVtb3J5IHVzYWdlLiAgVGhlIGRlZmF1bHQgaXMgNjQgb3V0c3RhbmRpbmcgcmVxdWVzdHMuCi0KLSAgICAgLXIgICAgICBSZWN1cnNpdmVseSBjb3B5IGVudGlyZSBkaXJlY3RvcmllcyB3aGVuIHVwbG9hZGluZyBhbmQKLSAgICAgICAgICAgICBkb3dubG9hZGluZy4gIE5vdGUgdGhhdCBzZnRwIGRvZXMgbm90IGZvbGxvdyBzeW1ib2xpYyBsaW5rcwotICAgICAgICAgICAgIGVuY291bnRlcmVkIGluIHRoZSB0cmVlIHRyYXZlcnNhbC4KLQotICAgICAtUyBwcm9ncmFtCi0gICAgICAgICAgICAgTmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgZm9yIHRoZSBlbmNyeXB0ZWQgY29ubmVjdGlvbi4gIFRoZQotICAgICAgICAgICAgIHByb2dyYW0gbXVzdCB1bmRlcnN0YW5kIHNzaCgxKSBvcHRpb25zLgotCi0gICAgIC1zIHN1YnN5c3RlbSB8IHNmdHBfc2VydmVyCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBTU0gyIHN1YnN5c3RlbSBvciB0aGUgcGF0aCBmb3IgYW4gc2Z0cCBzZXJ2ZXIgb24KLSAgICAgICAgICAgICB0aGUgcmVtb3RlIGhvc3QuICBBIHBhdGggaXMgdXNlZnVsIGZvciB1c2luZyBzZnRwIG92ZXIgcHJvdG9jb2wKLSAgICAgICAgICAgICB2ZXJzaW9uIDEsIG9yIHdoZW4gdGhlIHJlbW90ZSBzc2hkKDgpIGRvZXMgbm90IGhhdmUgYW4gc2Z0cAotICAgICAgICAgICAgIHN1YnN5c3RlbSBjb25maWd1cmVkLgotCi0gICAgIC12ICAgICAgUmFpc2UgbG9nZ2luZyBsZXZlbC4gIFRoaXMgb3B0aW9uIGlzIGFsc28gcGFzc2VkIHRvIHNzaC4KLQotSU5URVJBQ1RJVkUgQ09NTUFORFMKLSAgICAgT25jZSBpbiBpbnRlcmFjdGl2ZSBtb2RlLCBzZnRwIHVuZGVyc3RhbmRzIGEgc2V0IG9mIGNvbW1hbmRzIHNpbWlsYXIgdG8KLSAgICAgdGhvc2Ugb2YgZnRwKDEpLiAgQ29tbWFuZHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUuICBQYXRobmFtZXMgdGhhdCBjb250YWluCi0gICAgIHNwYWNlcyBtdXN0IGJlIGVuY2xvc2VkIGluIHF1b3Rlcy4gIEFueSBzcGVjaWFsIGNoYXJhY3RlcnMgY29udGFpbmVkCi0gICAgIHdpdGhpbiBwYXRobmFtZXMgdGhhdCBhcmUgcmVjb2duaXplZCBieSBnbG9iKDMpIG11c3QgYmUgZXNjYXBlZCB3aXRoCi0gICAgIGJhY2tzbGFzaGVzIChgXCcpLgotCi0gICAgIGJ5ZSAgICAgUXVpdCBzZnRwLgotCi0gICAgIGNkIHBhdGgKLSAgICAgICAgICAgICBDaGFuZ2UgcmVtb3RlIGRpcmVjdG9yeSB0byBwYXRoLgotCi0gICAgIGNoZ3JwIGdycCBwYXRoCi0gICAgICAgICAgICAgQ2hhbmdlIGdyb3VwIG9mIGZpbGUgcGF0aCB0byBncnAuICBwYXRoIG1heSBjb250YWluIGdsb2IoMykKLSAgICAgICAgICAgICBjaGFyYWN0ZXJzIGFuZCBtYXkgbWF0Y2ggbXVsdGlwbGUgZmlsZXMuICBncnAgbXVzdCBiZSBhIG51bWVyaWMKLSAgICAgICAgICAgICBHSUQuCi0KLSAgICAgY2htb2QgbW9kZSBwYXRoCi0gICAgICAgICAgICAgQ2hhbmdlIHBlcm1pc3Npb25zIG9mIGZpbGUgcGF0aCB0byBtb2RlLiAgcGF0aCBtYXkgY29udGFpbgotICAgICAgICAgICAgIGdsb2IoMykgY2hhcmFjdGVycyBhbmQgbWF5IG1hdGNoIG11bHRpcGxlIGZpbGVzLgotCi0gICAgIGNob3duIG93biBwYXRoCi0gICAgICAgICAgICAgQ2hhbmdlIG93bmVyIG9mIGZpbGUgcGF0aCB0byBvd24uICBwYXRoIG1heSBjb250YWluIGdsb2IoMykKLSAgICAgICAgICAgICBjaGFyYWN0ZXJzIGFuZCBtYXkgbWF0Y2ggbXVsdGlwbGUgZmlsZXMuICBvd24gbXVzdCBiZSBhIG51bWVyaWMKLSAgICAgICAgICAgICBVSUQuCi0KLSAgICAgZGYgWy1oaV0gW3BhdGhdCi0gICAgICAgICAgICAgRGlzcGxheSB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGZpbGVzeXN0ZW0gaG9sZGluZyB0aGUgY3VycmVudAotICAgICAgICAgICAgIGRpcmVjdG9yeSAob3IgcGF0aCBpZiBzcGVjaWZpZWQpLiAgSWYgdGhlIC1oIGZsYWcgaXMgc3BlY2lmaWVkLAotICAgICAgICAgICAgIHRoZSBjYXBhY2l0eSBpbmZvcm1hdGlvbiB3aWxsIGJlIGRpc3BsYXllZCB1c2luZyAiaHVtYW4tcmVhZGFibGUiCi0gICAgICAgICAgICAgc3VmZml4ZXMuICBUaGUgLWkgZmxhZyByZXF1ZXN0cyBkaXNwbGF5IG9mIGlub2RlIGluZm9ybWF0aW9uIGluCi0gICAgICAgICAgICAgYWRkaXRpb24gdG8gY2FwYWNpdHkgaW5mb3JtYXRpb24uICBUaGlzIGNvbW1hbmQgaXMgb25seSBzdXBwb3J0ZWQKLSAgICAgICAgICAgICBvbiBzZXJ2ZXJzIHRoYXQgaW1wbGVtZW50IHRoZSBgYHN0YXR2ZnNAb3BlbnNzaC5jb20nJyBleHRlbnNpb24uCi0KLSAgICAgZXhpdCAgICBRdWl0IHNmdHAuCi0KLSAgICAgZ2V0IFstUHByXSByZW1vdGUtcGF0aCBbbG9jYWwtcGF0aF0KLSAgICAgICAgICAgICBSZXRyaWV2ZSB0aGUgcmVtb3RlLXBhdGggYW5kIHN0b3JlIGl0IG9uIHRoZSBsb2NhbCBtYWNoaW5lLiAgSWYKLSAgICAgICAgICAgICB0aGUgbG9jYWwgcGF0aCBuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIGdpdmVuIHRoZSBzYW1lIG5hbWUKLSAgICAgICAgICAgICBpdCBoYXMgb24gdGhlIHJlbW90ZSBtYWNoaW5lLiAgcmVtb3RlLXBhdGggbWF5IGNvbnRhaW4gZ2xvYigzKQotICAgICAgICAgICAgIGNoYXJhY3RlcnMgYW5kIG1heSBtYXRjaCBtdWx0aXBsZSBmaWxlcy4gIElmIGl0IGRvZXMgYW5kCi0gICAgICAgICAgICAgbG9jYWwtcGF0aCBpcyBzcGVjaWZpZWQsIHRoZW4gbG9jYWwtcGF0aCBtdXN0IHNwZWNpZnkgYQotICAgICAgICAgICAgIGRpcmVjdG9yeS4KLQotICAgICAgICAgICAgIElmIGVpdGhlciB0aGUgLVAgb3IgLXAgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZW4gZnVsbCBmaWxlCi0gICAgICAgICAgICAgcGVybWlzc2lvbnMgYW5kIGFjY2VzcyB0aW1lcyBhcmUgY29waWVkIHRvby4KLQotICAgICAgICAgICAgIElmIHRoZSAtciBmbGFnIGlzIHNwZWNpZmllZCB0aGVuIGRpcmVjdG9yaWVzIHdpbGwgYmUgY29waWVkCi0gICAgICAgICAgICAgcmVjdXJzaXZlbHkuICBOb3RlIHRoYXQgc2Z0cCBkb2VzIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3Mgd2hlbgotICAgICAgICAgICAgIHBlcmZvcm1pbmcgcmVjdXJzaXZlIHRyYW5zZmVycy4KLQotICAgICBoZWxwICAgIERpc3BsYXkgaGVscCB0ZXh0LgotCi0gICAgIGxjZCBwYXRoCi0gICAgICAgICAgICAgQ2hhbmdlIGxvY2FsIGRpcmVjdG9yeSB0byBwYXRoLgotCi0gICAgIGxscyBbbHMtb3B0aW9ucyBbcGF0aF1dCi0gICAgICAgICAgICAgRGlzcGxheSBsb2NhbCBkaXJlY3RvcnkgbGlzdGluZyBvZiBlaXRoZXIgcGF0aCBvciBjdXJyZW50Ci0gICAgICAgICAgICAgZGlyZWN0b3J5IGlmIHBhdGggaXMgbm90IHNwZWNpZmllZC4gIGxzLW9wdGlvbnMgbWF5IGNvbnRhaW4gYW55Ci0gICAgICAgICAgICAgZmxhZ3Mgc3VwcG9ydGVkIGJ5IHRoZSBsb2NhbCBzeXN0ZW0ncyBscygxKSBjb21tYW5kLiAgcGF0aCBtYXkKLSAgICAgICAgICAgICBjb250YWluIGdsb2IoMykgY2hhcmFjdGVycyBhbmQgbWF5IG1hdGNoIG11bHRpcGxlIGZpbGVzLgotCi0gICAgIGxta2RpciBwYXRoCi0gICAgICAgICAgICAgQ3JlYXRlIGxvY2FsIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgcGF0aC4KLQotICAgICBsbiBbLXNdIG9sZHBhdGggbmV3cGF0aAotICAgICAgICAgICAgIENyZWF0ZSBhIGxpbmsgZnJvbSBvbGRwYXRoIHRvIG5ld3BhdGguICBJZiB0aGUgLXMgZmxhZyBpcwotICAgICAgICAgICAgIHNwZWNpZmllZCB0aGUgY3JlYXRlZCBsaW5rIGlzIGEgc3ltYm9saWMgbGluaywgb3RoZXJ3aXNlIGl0IGlzIGEKLSAgICAgICAgICAgICBoYXJkIGxpbmsuCi0KLSAgICAgbHB3ZCAgICBQcmludCBsb2NhbCB3b3JraW5nIGRpcmVjdG9yeS4KLQotICAgICBscyBbLTFhZmhsbnJTdF0gW3BhdGhdCi0gICAgICAgICAgICAgRGlzcGxheSBhIHJlbW90ZSBkaXJlY3RvcnkgbGlzdGluZyBvZiBlaXRoZXIgcGF0aCBvciB0aGUgY3VycmVudAotICAgICAgICAgICAgIGRpcmVjdG9yeSBpZiBwYXRoIGlzIG5vdCBzcGVjaWZpZWQuICBwYXRoIG1heSBjb250YWluIGdsb2IoMykKLSAgICAgICAgICAgICBjaGFyYWN0ZXJzIGFuZCBtYXkgbWF0Y2ggbXVsdGlwbGUgZmlsZXMuCi0KLSAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZsYWdzIGFyZSByZWNvZ25pemVkIGFuZCBhbHRlciB0aGUgYmVoYXZpb3VyIG9mIGxzCi0gICAgICAgICAgICAgYWNjb3JkaW5nbHk6Ci0KLSAgICAgICAgICAgICAtMSAgICAgIFByb2R1Y2Ugc2luZ2xlIGNvbHVtbmFyIG91dHB1dC4KLQotICAgICAgICAgICAgIC1hICAgICAgTGlzdCBmaWxlcyBiZWdpbm5pbmcgd2l0aCBhIGRvdCAoYC4nKS4KLQotICAgICAgICAgICAgIC1mICAgICAgRG8gbm90IHNvcnQgdGhlIGxpc3RpbmcuICBUaGUgZGVmYXVsdCBzb3J0IG9yZGVyIGlzCi0gICAgICAgICAgICAgICAgICAgICBsZXhpY29ncmFwaGljYWwuCi0KLSAgICAgICAgICAgICAtaCAgICAgIFdoZW4gdXNlZCB3aXRoIGEgbG9uZyBmb3JtYXQgb3B0aW9uLCB1c2UgdW5pdCBzdWZmaXhlczoKLSAgICAgICAgICAgICAgICAgICAgIEJ5dGUsIEtpbG9ieXRlLCBNZWdhYnl0ZSwgR2lnYWJ5dGUsIFRlcmFieXRlLCBQZXRhYnl0ZSwKLSAgICAgICAgICAgICAgICAgICAgIGFuZCBFeGFieXRlIGluIG9yZGVyIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB0bwotICAgICAgICAgICAgICAgICAgICAgZm91ciBvciBmZXdlciB1c2luZyBwb3dlcnMgb2YgMiBmb3Igc2l6ZXMgKEs9MTAyNCwKLSAgICAgICAgICAgICAgICAgICAgIE09MTA0ODU3NiwgZXRjLikuCi0KLSAgICAgICAgICAgICAtbCAgICAgIERpc3BsYXkgYWRkaXRpb25hbCBkZXRhaWxzIGluY2x1ZGluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcCBpbmZvcm1hdGlvbi4KLQotICAgICAgICAgICAgIC1uICAgICAgUHJvZHVjZSBhIGxvbmcgbGlzdGluZyB3aXRoIHVzZXIgYW5kIGdyb3VwIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICBwcmVzZW50ZWQgbnVtZXJpY2FsbHkuCi0KLSAgICAgICAgICAgICAtciAgICAgIFJldmVyc2UgdGhlIHNvcnQgb3JkZXIgb2YgdGhlIGxpc3RpbmcuCi0KLSAgICAgICAgICAgICAtUyAgICAgIFNvcnQgdGhlIGxpc3RpbmcgYnkgZmlsZSBzaXplLgotCi0gICAgICAgICAgICAgLXQgICAgICBTb3J0IHRoZSBsaXN0aW5nIGJ5IGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUuCi0KLSAgICAgbHVtYXNrIHVtYXNrCi0gICAgICAgICAgICAgU2V0IGxvY2FsIHVtYXNrIHRvIHVtYXNrLgotCi0gICAgIG1rZGlyIHBhdGgKLSAgICAgICAgICAgICBDcmVhdGUgcmVtb3RlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgcGF0aC4KLQotICAgICBwcm9ncmVzcwotICAgICAgICAgICAgIFRvZ2dsZSBkaXNwbGF5IG9mIHByb2dyZXNzIG1ldGVyLgotCi0gICAgIHB1dCBbLVBwcl0gbG9jYWwtcGF0aCBbcmVtb3RlLXBhdGhdCi0gICAgICAgICAgICAgVXBsb2FkIGxvY2FsLXBhdGggYW5kIHN0b3JlIGl0IG9uIHRoZSByZW1vdGUgbWFjaGluZS4gIElmIHRoZQotICAgICAgICAgICAgIHJlbW90ZSBwYXRoIG5hbWUgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMgZ2l2ZW4gdGhlIHNhbWUgbmFtZSBpdAotICAgICAgICAgICAgIGhhcyBvbiB0aGUgbG9jYWwgbWFjaGluZS4gIGxvY2FsLXBhdGggbWF5IGNvbnRhaW4gZ2xvYigzKQotICAgICAgICAgICAgIGNoYXJhY3RlcnMgYW5kIG1heSBtYXRjaCBtdWx0aXBsZSBmaWxlcy4gIElmIGl0IGRvZXMgYW5kCi0gICAgICAgICAgICAgcmVtb3RlLXBhdGggaXMgc3BlY2lmaWVkLCB0aGVuIHJlbW90ZS1wYXRoIG11c3Qgc3BlY2lmeSBhCi0gICAgICAgICAgICAgZGlyZWN0b3J5LgotCi0gICAgICAgICAgICAgSWYgZWl0aGVyIHRoZSAtUCBvciAtcCBmbGFnIGlzIHNwZWNpZmllZCwgdGhlbiBmdWxsIGZpbGUKLSAgICAgICAgICAgICBwZXJtaXNzaW9ucyBhbmQgYWNjZXNzIHRpbWVzIGFyZSBjb3BpZWQgdG9vLgotCi0gICAgICAgICAgICAgSWYgdGhlIC1yIGZsYWcgaXMgc3BlY2lmaWVkIHRoZW4gZGlyZWN0b3JpZXMgd2lsbCBiZSBjb3BpZWQKLSAgICAgICAgICAgICByZWN1cnNpdmVseS4gIE5vdGUgdGhhdCBzZnRwIGRvZXMgbm90IGZvbGxvdyBzeW1ib2xpYyBsaW5rcyB3aGVuCi0gICAgICAgICAgICAgcGVyZm9ybWluZyByZWN1cnNpdmUgdHJhbnNmZXJzLgotCi0gICAgIHB3ZCAgICAgRGlzcGxheSByZW1vdGUgd29ya2luZyBkaXJlY3RvcnkuCi0KLSAgICAgcXVpdCAgICBRdWl0IHNmdHAuCi0KLSAgICAgcmVuYW1lIG9sZHBhdGggbmV3cGF0aAotICAgICAgICAgICAgIFJlbmFtZSByZW1vdGUgZmlsZSBmcm9tIG9sZHBhdGggdG8gbmV3cGF0aC4KLQotICAgICBybSBwYXRoCi0gICAgICAgICAgICAgRGVsZXRlIHJlbW90ZSBmaWxlIHNwZWNpZmllZCBieSBwYXRoLgotCi0gICAgIHJtZGlyIHBhdGgKLSAgICAgICAgICAgICBSZW1vdmUgcmVtb3RlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgcGF0aC4KLQotICAgICBzeW1saW5rIG9sZHBhdGggbmV3cGF0aAotICAgICAgICAgICAgIENyZWF0ZSBhIHN5bWJvbGljIGxpbmsgZnJvbSBvbGRwYXRoIHRvIG5ld3BhdGguCi0KLSAgICAgdmVyc2lvbgotICAgICAgICAgICAgIERpc3BsYXkgdGhlIHNmdHAgcHJvdG9jb2wgdmVyc2lvbi4KLQotICAgICAhY29tbWFuZAotICAgICAgICAgICAgIEV4ZWN1dGUgY29tbWFuZCBpbiBsb2NhbCBzaGVsbC4KLQotICAgICAhICAgICAgIEVzY2FwZSB0byBsb2NhbCBzaGVsbC4KLQotICAgICA/ICAgICAgIFN5bm9ueW0gZm9yIGhlbHAuCi0KLVNFRSBBTFNPCi0gICAgIGZ0cCgxKSwgbHMoMSksIHNjcCgxKSwgc3NoKDEpLCBzc2gtYWRkKDEpLCBzc2gta2V5Z2VuKDEpLCBnbG9iKDMpLAotICAgICBzc2hfY29uZmlnKDUpLCBzZnRwLXNlcnZlcig4KSwgc3NoZCg4KQotCi0gICAgIFQuIFlsb25lbiBhbmQgUy4gTGVodGluZW4sIFNTSCBGaWxlIFRyYW5zZmVyIFByb3RvY29sLAotICAgICBkcmFmdC1pZXRmLXNlY3NoLWZpbGV4ZmVyLTAwLnR4dCwgSmFudWFyeSAyMDAxLCB3b3JrIGluIHByb2dyZXNzCi0gICAgIG1hdGVyaWFsLgotCi1PcGVuQlNEIDUuMCAgICAgICAgICAgICAgICAgICAgIEF1Z3VzdCA3LCAyMDExICAgICAgICAgICAgICAgICAgICAgT3BlbkJTRCA1LjAKZGlmZiAtLWdpdCBhL3NmdHAuMSBiL3NmdHAuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4ODAxNC4uMDAwMDAwMAotLS0gYS9zZnRwLjEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTEgKzAsMCBAQAotLlwiICRPcGVuQlNEOiBzZnRwLjEsdiAxLjkwIDIwMTEvMDgvMDcgMTI6NTU6MzAgZHR1Y2tlciBFeHAgJAotLlwiCi0uXCIgQ29weXJpZ2h0IChjKSAyMDAxIERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiCi0uXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0uXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0uXCIgYXJlIG1ldDoKLS5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLS5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotLlwiCi0uXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLS5cIiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0uXCIgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLS5cIiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0uXCIgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0uXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLlwiIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLlwiIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS5cIiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLS5cIiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLlwiCi0uRGQgJE1kb2NkYXRlOiBBdWd1c3QgNyAyMDExICQKLS5EdCBTRlRQIDEKLS5PcwotLlNoIE5BTUUKLS5ObSBzZnRwCi0uTmQgc2VjdXJlIGZpbGUgdHJhbnNmZXIgcHJvZ3JhbQotLlNoIFNZTk9QU0lTCi0uTm0gc2Z0cAotLkJrIC13b3JkcwotLk9wIEZsIDEyNDZDcHFydgotLk9wIEZsIEIgQXIgYnVmZmVyX3NpemUKLS5PcCBGbCBiIEFyIGJhdGNoZmlsZQotLk9wIEZsIGMgQXIgY2lwaGVyCi0uT3AgRmwgRCBBciBzZnRwX3NlcnZlcl9wYXRoCi0uT3AgRmwgRiBBciBzc2hfY29uZmlnCi0uT3AgRmwgaSBBciBpZGVudGl0eV9maWxlCi0uT3AgRmwgbCBBciBsaW1pdAotLk9wIEZsIG8gQXIgc3NoX29wdGlvbgotLk9wIEZsIFAgQXIgcG9ydAotLk9wIEZsIFIgQXIgbnVtX3JlcXVlc3RzCi0uT3AgRmwgUyBBciBwcm9ncmFtCi0uT3AgRmwgcyBBciBzdWJzeXN0ZW0gfCBzZnRwX3NlcnZlcgotLkFyIGhvc3QKLS5FawotLk5tIHNmdHAKLS5PbyBBciB1c2VyIE5zIEAgT2MgTnMKLS5BciBob3N0IE5zIE9wIDogTnMgQXIKLS5ObSBzZnRwCi0uT28KLS5BciB1c2VyIE5zIEAgT2MgTnMKLS5BciBob3N0IE5zIE9vIDogTnMgQXIgZGlyIE5zCi0uT3AgQXIgLwotLk9jCi0uTm0gc2Z0cAotLkZsIGIgQXIgYmF0Y2hmaWxlCi0uT28gQXIgdXNlciBOcyBAIE9jIE5zIEFyIGhvc3QKLS5TaCBERVNDUklQVElPTgotLk5tCi1pcyBhbiBpbnRlcmFjdGl2ZSBmaWxlIHRyYW5zZmVyIHByb2dyYW0sIHNpbWlsYXIgdG8KLS5YciBmdHAgMSAsCi13aGljaCBwZXJmb3JtcyBhbGwgb3BlcmF0aW9ucyBvdmVyIGFuIGVuY3J5cHRlZAotLlhyIHNzaCAxCi10cmFuc3BvcnQuCi1JdCBtYXkgYWxzbyB1c2UgbWFueSBmZWF0dXJlcyBvZiBzc2gsIHN1Y2ggYXMgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiBhbmQKLWNvbXByZXNzaW9uLgotLk5tCi1jb25uZWN0cyBhbmQgbG9ncyBpbnRvIHRoZSBzcGVjaWZpZWQKLS5BciBob3N0ICwKLXRoZW4gZW50ZXJzIGFuIGludGVyYWN0aXZlIGNvbW1hbmQgbW9kZS4KLS5QcAotVGhlIHNlY29uZCB1c2FnZSBmb3JtYXQgd2lsbCByZXRyaWV2ZSBmaWxlcyBhdXRvbWF0aWNhbGx5IGlmIGEgbm9uLWludGVyYWN0aXZlCi1hdXRoZW50aWNhdGlvbiBtZXRob2QgaXMgdXNlZDsgb3RoZXJ3aXNlIGl0IHdpbGwgZG8gc28gYWZ0ZXIKLXN1Y2Nlc3NmdWwgaW50ZXJhY3RpdmUgYXV0aGVudGljYXRpb24uCi0uUHAKLVRoZSB0aGlyZCB1c2FnZSBmb3JtYXQgYWxsb3dzCi0uTm0KLXRvIHN0YXJ0IGluIGEgcmVtb3RlIGRpcmVjdG9yeS4KLS5QcAotVGhlIGZpbmFsIHVzYWdlIGZvcm1hdCBhbGxvd3MgZm9yIGF1dG9tYXRlZCBzZXNzaW9ucyB1c2luZyB0aGUKLS5GbCBiCi1vcHRpb24uCi1JbiBzdWNoIGNhc2VzLCBpdCBpcyBuZWNlc3NhcnkgdG8gY29uZmlndXJlIG5vbi1pbnRlcmFjdGl2ZSBhdXRoZW50aWNhdGlvbgotdG8gb2J2aWF0ZSB0aGUgbmVlZCB0byBlbnRlciBhIHBhc3N3b3JkIGF0IGNvbm5lY3Rpb24gdGltZSAoc2VlCi0uWHIgc3NoZCA4Ci1hbmQKLS5YciBzc2gta2V5Z2VuIDEKLWZvciBkZXRhaWxzKS4KLS5QcAotU2luY2Ugc29tZSB1c2FnZSBmb3JtYXRzIHVzZSBjb2xvbiBjaGFyYWN0ZXJzIHRvIGRlbGltaXQgaG9zdCBuYW1lcyBmcm9tIHBhdGgKLW5hbWVzLCBJUHY2IGFkZHJlc3NlcyBtdXN0IGJlIGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cyB0byBhdm9pZCBhbWJpZ3VpdHkuCi0uUHAKLVRoZSBvcHRpb25zIGFyZSBhcyBmb2xsb3dzOgotLkJsIC10YWcgLXdpZHRoIERzCi0uSXQgRmwgMQotU3BlY2lmeSB0aGUgdXNlIG9mIHByb3RvY29sIHZlcnNpb24gMS4KLS5JdCBGbCAyCi1TcGVjaWZ5IHRoZSB1c2Ugb2YgcHJvdG9jb2wgdmVyc2lvbiAyLgotLkl0IEZsIDQKLUZvcmNlcwotLk5tCi10byB1c2UgSVB2NCBhZGRyZXNzZXMgb25seS4KLS5JdCBGbCA2Ci1Gb3JjZXMKLS5ObQotdG8gdXNlIElQdjYgYWRkcmVzc2VzIG9ubHkuCi0uSXQgRmwgQiBBciBidWZmZXJfc2l6ZQotU3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRoYXQKLS5ObQotdXNlcyB3aGVuIHRyYW5zZmVycmluZyBmaWxlcy4KLUxhcmdlciBidWZmZXJzIHJlcXVpcmUgZmV3ZXIgcm91bmQgdHJpcHMgYXQgdGhlIGNvc3Qgb2YgaGlnaGVyCi1tZW1vcnkgY29uc3VtcHRpb24uCi1UaGUgZGVmYXVsdCBpcyAzMjc2OCBieXRlcy4KLS5JdCBGbCBiIEFyIGJhdGNoZmlsZQotQmF0Y2ggbW9kZSByZWFkcyBhIHNlcmllcyBvZiBjb21tYW5kcyBmcm9tIGFuIGlucHV0Ci0uQXIgYmF0Y2hmaWxlCi1pbnN0ZWFkIG9mCi0uRW0gc3RkaW4gLgotU2luY2UgaXQgbGFja3MgdXNlciBpbnRlcmFjdGlvbiBpdCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCi1ub24taW50ZXJhY3RpdmUgYXV0aGVudGljYXRpb24uCi1BCi0uQXIgYmF0Y2hmaWxlCi1vZgotLlNxIFwtCi1tYXkgYmUgdXNlZCB0byBpbmRpY2F0ZSBzdGFuZGFyZCBpbnB1dC4KLS5ObQotd2lsbCBhYm9ydCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZwotY29tbWFuZHMgZmFpbDoKLS5JYyBnZXQgLCBwdXQgLCByZW5hbWUgLCBsbiAsCi0uSWMgcm0gLCBta2RpciAsIGNoZGlyICwgbHMgLAotLkljIGxjaGRpciAsIGNobW9kICwgY2hvd24gLAotLkljIGNoZ3JwICwgbHB3ZCAsIGRmICwgc3ltbGluayAsCi1hbmQKLS5JYyBsbWtkaXIgLgotVGVybWluYXRpb24gb24gZXJyb3IgY2FuIGJlIHN1cHByZXNzZWQgb24gYSBjb21tYW5kIGJ5IGNvbW1hbmQgYmFzaXMgYnkKLXByZWZpeGluZyB0aGUgY29tbWFuZCB3aXRoIGEKLS5TcSBcLQotY2hhcmFjdGVyIChmb3IgZXhhbXBsZSwKLS5JYyAtcm0gL3RtcC9ibGFoKiApIC4KLS5JdCBGbCBDCi1FbmFibGVzIGNvbXByZXNzaW9uICh2aWEgc3NoJ3MKLS5GbCBDCi1mbGFnKS4KLS5JdCBGbCBjIEFyIGNpcGhlcgotU2VsZWN0cyB0aGUgY2lwaGVyIHRvIHVzZSBmb3IgZW5jcnlwdGluZyB0aGUgZGF0YSB0cmFuc2ZlcnMuCi1UaGlzIG9wdGlvbiBpcyBkaXJlY3RseSBwYXNzZWQgdG8KLS5YciBzc2ggMSAuCi0uSXQgRmwgRCBBciBzZnRwX3NlcnZlcl9wYXRoCi1Db25uZWN0IGRpcmVjdGx5IHRvIGEgbG9jYWwgc2Z0cCBzZXJ2ZXIKLShyYXRoZXIgdGhhbiB2aWEKLS5YciBzc2ggMSApIC4KLVRoaXMgb3B0aW9uIG1heSBiZSB1c2VmdWwgaW4gZGVidWdnaW5nIHRoZSBjbGllbnQgYW5kIHNlcnZlci4KLS5JdCBGbCBGIEFyIHNzaF9jb25maWcKLVNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZQotcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlIGZvcgotLlhyIHNzaCAxIC4KLVRoaXMgb3B0aW9uIGlzIGRpcmVjdGx5IHBhc3NlZCB0bwotLlhyIHNzaCAxIC4KLS5JdCBGbCBpIEFyIGlkZW50aXR5X2ZpbGUKLVNlbGVjdHMgdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgaWRlbnRpdHkgKHByaXZhdGUga2V5KSBmb3IgcHVibGljIGtleQotYXV0aGVudGljYXRpb24gaXMgcmVhZC4KLVRoaXMgb3B0aW9uIGlzIGRpcmVjdGx5IHBhc3NlZCB0bwotLlhyIHNzaCAxIC4KLS5JdCBGbCBsIEFyIGxpbWl0Ci1MaW1pdHMgdGhlIHVzZWQgYmFuZHdpZHRoLCBzcGVjaWZpZWQgaW4gS2JpdC9zLgotLkl0IEZsIG8gQXIgc3NoX29wdGlvbgotQ2FuIGJlIHVzZWQgdG8gcGFzcyBvcHRpb25zIHRvCi0uTm0gc3NoCi1pbiB0aGUgZm9ybWF0IHVzZWQgaW4KLS5YciBzc2hfY29uZmlnIDUgLgotVGhpcyBpcyB1c2VmdWwgZm9yIHNwZWNpZnlpbmcgb3B0aW9ucwotZm9yIHdoaWNoIHRoZXJlIGlzIG5vIHNlcGFyYXRlCi0uTm0gc2Z0cAotY29tbWFuZC1saW5lIGZsYWcuCi1Gb3IgZXhhbXBsZSwgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGUgcG9ydCB1c2U6Ci0uSWMgc2Z0cCAtb1BvcnQ9MjQgLgotRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgb3B0aW9ucyBsaXN0ZWQgYmVsb3csIGFuZCB0aGVpciBwb3NzaWJsZSB2YWx1ZXMsIHNlZQotLlhyIHNzaF9jb25maWcgNSAuCi0uUHAKLS5CbCAtdGFnIC13aWR0aCBEcyAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAotLkl0IEFkZHJlc3NGYW1pbHkKLS5JdCBCYXRjaE1vZGUKLS5JdCBCaW5kQWRkcmVzcwotLkl0IENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24KLS5JdCBDaGVja0hvc3RJUAotLkl0IENpcGhlcgotLkl0IENpcGhlcnMKLS5JdCBDb21wcmVzc2lvbgotLkl0IENvbXByZXNzaW9uTGV2ZWwKLS5JdCBDb25uZWN0aW9uQXR0ZW1wdHMKLS5JdCBDb25uZWN0VGltZW91dAotLkl0IENvbnRyb2xNYXN0ZXIKLS5JdCBDb250cm9sUGF0aAotLkl0IEdsb2JhbEtub3duSG9zdHNGaWxlCi0uSXQgR1NTQVBJQXV0aGVudGljYXRpb24KLS5JdCBHU1NBUElEZWxlZ2F0ZUNyZWRlbnRpYWxzCi0uSXQgSGFzaEtub3duSG9zdHMKLS5JdCBIb3N0Ci0uSXQgSG9zdGJhc2VkQXV0aGVudGljYXRpb24KLS5JdCBIb3N0S2V5QWxnb3JpdGhtcwotLkl0IEhvc3RLZXlBbGlhcwotLkl0IEhvc3ROYW1lCi0uSXQgSWRlbnRpdHlGaWxlCi0uSXQgSWRlbnRpdGllc09ubHkKLS5JdCBJUFFvUwotLkl0IEtiZEludGVyYWN0aXZlRGV2aWNlcwotLkl0IEtleEFsZ29yaXRobXMKLS5JdCBMb2dMZXZlbAotLkl0IE1BQ3MKLS5JdCBOb0hvc3RBdXRoZW50aWNhdGlvbkZvckxvY2FsaG9zdAotLkl0IE51bWJlck9mUGFzc3dvcmRQcm9tcHRzCi0uSXQgUGFzc3dvcmRBdXRoZW50aWNhdGlvbgotLkl0IFBLQ1MxMVByb3ZpZGVyCi0uSXQgUG9ydAotLkl0IFByZWZlcnJlZEF1dGhlbnRpY2F0aW9ucwotLkl0IFByb3RvY29sCi0uSXQgUHJveHlDb21tYW5kCi0uSXQgUHVia2V5QXV0aGVudGljYXRpb24KLS5JdCBSZWtleUxpbWl0Ci0uSXQgUmhvc3RzUlNBQXV0aGVudGljYXRpb24KLS5JdCBSU0FBdXRoZW50aWNhdGlvbgotLkl0IFNlbmRFbnYKLS5JdCBTZXJ2ZXJBbGl2ZUludGVydmFsCi0uSXQgU2VydmVyQWxpdmVDb3VudE1heAotLkl0IFN0cmljdEhvc3RLZXlDaGVja2luZwotLkl0IFRDUEtlZXBBbGl2ZQotLkl0IFVzZVByaXZpbGVnZWRQb3J0Ci0uSXQgVXNlcgotLkl0IFVzZXJLbm93bkhvc3RzRmlsZQotLkl0IFZlcmlmeUhvc3RLZXlETlMKLS5FbAotLkl0IEZsIFAgQXIgcG9ydAotU3BlY2lmaWVzIHRoZSBwb3J0IHRvIGNvbm5lY3QgdG8gb24gdGhlIHJlbW90ZSBob3N0LgotLkl0IEZsIHAKLVByZXNlcnZlcyBtb2RpZmljYXRpb24gdGltZXMsIGFjY2VzcyB0aW1lcywgYW5kIG1vZGVzIGZyb20gdGhlCi1vcmlnaW5hbCBmaWxlcyB0cmFuc2ZlcnJlZC4KLS5JdCBGbCBxCi1RdWlldCBtb2RlOiBkaXNhYmxlcyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYXMgd2VsbCBhcyB3YXJuaW5nIGFuZAotZGlhZ25vc3RpYyBtZXNzYWdlcyBmcm9tCi0uWHIgc3NoIDEgLgotLkl0IEZsIFIgQXIgbnVtX3JlcXVlc3RzCi1TcGVjaWZ5IGhvdyBtYW55IHJlcXVlc3RzIG1heSBiZSBvdXRzdGFuZGluZyBhdCBhbnkgb25lIHRpbWUuCi1JbmNyZWFzaW5nIHRoaXMgbWF5IHNsaWdodGx5IGltcHJvdmUgZmlsZSB0cmFuc2ZlciBzcGVlZAotYnV0IHdpbGwgaW5jcmVhc2UgbWVtb3J5IHVzYWdlLgotVGhlIGRlZmF1bHQgaXMgNjQgb3V0c3RhbmRpbmcgcmVxdWVzdHMuCi0uSXQgRmwgcgotUmVjdXJzaXZlbHkgY29weSBlbnRpcmUgZGlyZWN0b3JpZXMgd2hlbiB1cGxvYWRpbmcgYW5kIGRvd25sb2FkaW5nLgotTm90ZSB0aGF0Ci0uTm0KLWRvZXMgbm90IGZvbGxvdyBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCBpbiB0aGUgdHJlZSB0cmF2ZXJzYWwuCi0uSXQgRmwgUyBBciBwcm9ncmFtCi1OYW1lIG9mIHRoZQotLkFyIHByb2dyYW0KLXRvIHVzZSBmb3IgdGhlIGVuY3J5cHRlZCBjb25uZWN0aW9uLgotVGhlIHByb2dyYW0gbXVzdCB1bmRlcnN0YW5kCi0uWHIgc3NoIDEKLW9wdGlvbnMuCi0uSXQgRmwgcyBBciBzdWJzeXN0ZW0gfCBzZnRwX3NlcnZlcgotU3BlY2lmaWVzIHRoZSBTU0gyIHN1YnN5c3RlbSBvciB0aGUgcGF0aCBmb3IgYW4gc2Z0cCBzZXJ2ZXIKLW9uIHRoZSByZW1vdGUgaG9zdC4KLUEgcGF0aCBpcyB1c2VmdWwgZm9yIHVzaW5nCi0uTm0KLW92ZXIgcHJvdG9jb2wgdmVyc2lvbiAxLCBvciB3aGVuIHRoZSByZW1vdGUKLS5YciBzc2hkIDgKLWRvZXMgbm90IGhhdmUgYW4gc2Z0cCBzdWJzeXN0ZW0gY29uZmlndXJlZC4KLS5JdCBGbCB2Ci1SYWlzZSBsb2dnaW5nIGxldmVsLgotVGhpcyBvcHRpb24gaXMgYWxzbyBwYXNzZWQgdG8gc3NoLgotLkVsCi0uU2ggSU5URVJBQ1RJVkUgQ09NTUFORFMKLU9uY2UgaW4gaW50ZXJhY3RpdmUgbW9kZSwKLS5ObQotdW5kZXJzdGFuZHMgYSBzZXQgb2YgY29tbWFuZHMgc2ltaWxhciB0byB0aG9zZSBvZgotLlhyIGZ0cCAxIC4KLUNvbW1hbmRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLgotUGF0aG5hbWVzIHRoYXQgY29udGFpbiBzcGFjZXMgbXVzdCBiZSBlbmNsb3NlZCBpbiBxdW90ZXMuCi1Bbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIGNvbnRhaW5lZCB3aXRoaW4gcGF0aG5hbWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgYnkKLS5YciBnbG9iIDMKLW11c3QgYmUgZXNjYXBlZCB3aXRoIGJhY2tzbGFzaGVzCi0uUHEgU3EgXGUgLgotLkJsIC10YWcgLXdpZHRoIERzCi0uSXQgSWMgYnllCi1RdWl0Ci0uTm0gc2Z0cCAuCi0uSXQgSWMgY2QgQXIgcGF0aAotQ2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkgdG8KLS5BciBwYXRoIC4KLS5JdCBJYyBjaGdycCBBciBncnAgQXIgcGF0aAotQ2hhbmdlIGdyb3VwIG9mIGZpbGUKLS5BciBwYXRoCi10bwotLkFyIGdycCAuCi0uQXIgcGF0aAotbWF5IGNvbnRhaW4KLS5YciBnbG9iIDMKLWNoYXJhY3RlcnMgYW5kIG1heSBtYXRjaCBtdWx0aXBsZSBmaWxlcy4KLS5BciBncnAKLW11c3QgYmUgYSBudW1lcmljIEdJRC4KLS5JdCBJYyBjaG1vZCBBciBtb2RlIEFyIHBhdGgKLUNoYW5nZSBwZXJtaXNzaW9ucyBvZiBmaWxlCi0uQXIgcGF0aAotdG8KLS5BciBtb2RlIC4KLS5BciBwYXRoCi1tYXkgY29udGFpbgotLlhyIGdsb2IgMwotY2hhcmFjdGVycyBhbmQgbWF5IG1hdGNoIG11bHRpcGxlIGZpbGVzLgotLkl0IEljIGNob3duIEFyIG93biBBciBwYXRoCi1DaGFuZ2Ugb3duZXIgb2YgZmlsZQotLkFyIHBhdGgKLXRvCi0uQXIgb3duIC4KLS5BciBwYXRoCi1tYXkgY29udGFpbgotLlhyIGdsb2IgMwotY2hhcmFjdGVycyBhbmQgbWF5IG1hdGNoIG11bHRpcGxlIGZpbGVzLgotLkFyIG93bgotbXVzdCBiZSBhIG51bWVyaWMgVUlELgotLkl0IFhvIEljIGRmCi0uT3AgRmwgaGkKLS5PcCBBciBwYXRoCi0uWGMKLURpc3BsYXkgdXNhZ2UgaW5mb3JtYXRpb24gZm9yIHRoZSBmaWxlc3lzdGVtIGhvbGRpbmcgdGhlIGN1cnJlbnQgZGlyZWN0b3J5Ci0ob3IKLS5BciBwYXRoCi1pZiBzcGVjaWZpZWQpLgotSWYgdGhlCi0uRmwgaAotZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSBjYXBhY2l0eSBpbmZvcm1hdGlvbiB3aWxsIGJlIGRpc3BsYXllZCB1c2luZwotImh1bWFuLXJlYWRhYmxlIiBzdWZmaXhlcy4KLVRoZQotLkZsIGkKLWZsYWcgcmVxdWVzdHMgZGlzcGxheSBvZiBpbm9kZSBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byBjYXBhY2l0eSBpbmZvcm1hdGlvbi4KLVRoaXMgY29tbWFuZCBpcyBvbmx5IHN1cHBvcnRlZCBvbiBzZXJ2ZXJzIHRoYXQgaW1wbGVtZW50IHRoZQotLkRxIHN0YXR2ZnNAb3BlbnNzaC5jb20KLWV4dGVuc2lvbi4KLS5JdCBJYyBleGl0Ci1RdWl0Ci0uTm0gc2Z0cCAuCi0uSXQgWG8gSWMgZ2V0Ci0uT3AgRmwgUHByCi0uQXIgcmVtb3RlLXBhdGgKLS5PcCBBciBsb2NhbC1wYXRoCi0uWGMKLVJldHJpZXZlIHRoZQotLkFyIHJlbW90ZS1wYXRoCi1hbmQgc3RvcmUgaXQgb24gdGhlIGxvY2FsIG1hY2hpbmUuCi1JZiB0aGUgbG9jYWwKLXBhdGggbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyBnaXZlbiB0aGUgc2FtZSBuYW1lIGl0IGhhcyBvbiB0aGUKLXJlbW90ZSBtYWNoaW5lLgotLkFyIHJlbW90ZS1wYXRoCi1tYXkgY29udGFpbgotLlhyIGdsb2IgMwotY2hhcmFjdGVycyBhbmQgbWF5IG1hdGNoIG11bHRpcGxlIGZpbGVzLgotSWYgaXQgZG9lcyBhbmQKLS5BciBsb2NhbC1wYXRoCi1pcyBzcGVjaWZpZWQsIHRoZW4KLS5BciBsb2NhbC1wYXRoCi1tdXN0IHNwZWNpZnkgYSBkaXJlY3RvcnkuCi0uUHAKLUlmIGVpdGhlciB0aGUKLS5GbCBQCi1vcgotLkZsIHAKLWZsYWcgaXMgc3BlY2lmaWVkLCB0aGVuIGZ1bGwgZmlsZSBwZXJtaXNzaW9ucyBhbmQgYWNjZXNzIHRpbWVzIGFyZQotY29waWVkIHRvby4KLS5QcAotSWYgdGhlCi0uRmwgcgotZmxhZyBpcyBzcGVjaWZpZWQgdGhlbiBkaXJlY3RvcmllcyB3aWxsIGJlIGNvcGllZCByZWN1cnNpdmVseS4KLU5vdGUgdGhhdAotLk5tCi1kb2VzIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3Mgd2hlbiBwZXJmb3JtaW5nIHJlY3Vyc2l2ZSB0cmFuc2ZlcnMuCi0uSXQgSWMgaGVscAotRGlzcGxheSBoZWxwIHRleHQuCi0uSXQgSWMgbGNkIEFyIHBhdGgKLUNoYW5nZSBsb2NhbCBkaXJlY3RvcnkgdG8KLS5BciBwYXRoIC4KLS5JdCBJYyBsbHMgT3AgQXIgbHMtb3B0aW9ucyBPcCBBciBwYXRoCi1EaXNwbGF5IGxvY2FsIGRpcmVjdG9yeSBsaXN0aW5nIG9mIGVpdGhlcgotLkFyIHBhdGgKLW9yIGN1cnJlbnQgZGlyZWN0b3J5IGlmCi0uQXIgcGF0aAotaXMgbm90IHNwZWNpZmllZC4KLS5BciBscy1vcHRpb25zCi1tYXkgY29udGFpbiBhbnkgZmxhZ3Mgc3VwcG9ydGVkIGJ5IHRoZSBsb2NhbCBzeXN0ZW0ncwotLlhyIGxzIDEKLWNvbW1hbmQuCi0uQXIgcGF0aAotbWF5IGNvbnRhaW4KLS5YciBnbG9iIDMKLWNoYXJhY3RlcnMgYW5kIG1heSBtYXRjaCBtdWx0aXBsZSBmaWxlcy4KLS5JdCBJYyBsbWtkaXIgQXIgcGF0aAotQ3JlYXRlIGxvY2FsIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkKLS5BciBwYXRoIC4KLS5JdCBYbyBJYyBsbgotLk9wIEZsIHMKLS5BciBvbGRwYXRoCi0uQXIgbmV3cGF0aAotLlhjCi1DcmVhdGUgYSBsaW5rIGZyb20KLS5BciBvbGRwYXRoCi10bwotLkFyIG5ld3BhdGggLgotSWYgdGhlCi0uRmwgcwotZmxhZyBpcyBzcGVjaWZpZWQgdGhlIGNyZWF0ZWQgbGluayBpcyBhIHN5bWJvbGljIGxpbmssIG90aGVyd2lzZSBpdCBpcwotYSBoYXJkIGxpbmsuCi0uSXQgSWMgbHB3ZAotUHJpbnQgbG9jYWwgd29ya2luZyBkaXJlY3RvcnkuCi0uSXQgWG8gSWMgbHMKLS5PcCBGbCAxYWZobG5yU3QKLS5PcCBBciBwYXRoCi0uWGMKLURpc3BsYXkgYSByZW1vdGUgZGlyZWN0b3J5IGxpc3Rpbmcgb2YgZWl0aGVyCi0uQXIgcGF0aAotb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmCi0uQXIgcGF0aAotaXMgbm90IHNwZWNpZmllZC4KLS5BciBwYXRoCi1tYXkgY29udGFpbgotLlhyIGdsb2IgMwotY2hhcmFjdGVycyBhbmQgbWF5IG1hdGNoIG11bHRpcGxlIGZpbGVzLgotLlBwCi1UaGUgZm9sbG93aW5nIGZsYWdzIGFyZSByZWNvZ25pemVkIGFuZCBhbHRlciB0aGUgYmVoYXZpb3VyIG9mCi0uSWMgbHMKLWFjY29yZGluZ2x5OgotLkJsIC10YWcgLXdpZHRoIERzCi0uSXQgRmwgMQotUHJvZHVjZSBzaW5nbGUgY29sdW1uYXIgb3V0cHV0LgotLkl0IEZsIGEKLUxpc3QgZmlsZXMgYmVnaW5uaW5nIHdpdGggYSBkb3QKLS5QcSBTcSBcJi4gLgotLkl0IEZsIGYKLURvIG5vdCBzb3J0IHRoZSBsaXN0aW5nLgotVGhlIGRlZmF1bHQgc29ydCBvcmRlciBpcyBsZXhpY29ncmFwaGljYWwuCi0uSXQgRmwgaAotV2hlbiB1c2VkIHdpdGggYSBsb25nIGZvcm1hdCBvcHRpb24sIHVzZSB1bml0IHN1ZmZpeGVzOiBCeXRlLCBLaWxvYnl0ZSwKLU1lZ2FieXRlLCBHaWdhYnl0ZSwgVGVyYWJ5dGUsIFBldGFieXRlLCBhbmQgRXhhYnl0ZSBpbiBvcmRlciB0byByZWR1Y2UKLXRoZSBudW1iZXIgb2YgZGlnaXRzIHRvIGZvdXIgb3IgZmV3ZXIgdXNpbmcgcG93ZXJzIG9mIDIgZm9yIHNpemVzIChLPTEwMjQsCi1NPTEwNDg1NzYsIGV0Yy4pLgotLkl0IEZsIGwKLURpc3BsYXkgYWRkaXRpb25hbCBkZXRhaWxzIGluY2x1ZGluZyBwZXJtaXNzaW9ucwotYW5kIG93bmVyc2hpcCBpbmZvcm1hdGlvbi4KLS5JdCBGbCBuCi1Qcm9kdWNlIGEgbG9uZyBsaXN0aW5nIHdpdGggdXNlciBhbmQgZ3JvdXAgaW5mb3JtYXRpb24gcHJlc2VudGVkCi1udW1lcmljYWxseS4KLS5JdCBGbCByCi1SZXZlcnNlIHRoZSBzb3J0IG9yZGVyIG9mIHRoZSBsaXN0aW5nLgotLkl0IEZsIFMKLVNvcnQgdGhlIGxpc3RpbmcgYnkgZmlsZSBzaXplLgotLkl0IEZsIHQKLVNvcnQgdGhlIGxpc3RpbmcgYnkgbGFzdCBtb2RpZmljYXRpb24gdGltZS4KLS5FbAotLkl0IEljIGx1bWFzayBBciB1bWFzawotU2V0IGxvY2FsIHVtYXNrIHRvCi0uQXIgdW1hc2sgLgotLkl0IEljIG1rZGlyIEFyIHBhdGgKLUNyZWF0ZSByZW1vdGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieQotLkFyIHBhdGggLgotLkl0IEljIHByb2dyZXNzCi1Ub2dnbGUgZGlzcGxheSBvZiBwcm9ncmVzcyBtZXRlci4KLS5JdCBYbyBJYyBwdXQKLS5PcCBGbCBQcHIKLS5BciBsb2NhbC1wYXRoCi0uT3AgQXIgcmVtb3RlLXBhdGgKLS5YYwotVXBsb2FkCi0uQXIgbG9jYWwtcGF0aAotYW5kIHN0b3JlIGl0IG9uIHRoZSByZW1vdGUgbWFjaGluZS4KLUlmIHRoZSByZW1vdGUgcGF0aCBuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIGdpdmVuIHRoZSBzYW1lIG5hbWUgaXQgaGFzCi1vbiB0aGUgbG9jYWwgbWFjaGluZS4KLS5BciBsb2NhbC1wYXRoCi1tYXkgY29udGFpbgotLlhyIGdsb2IgMwotY2hhcmFjdGVycyBhbmQgbWF5IG1hdGNoIG11bHRpcGxlIGZpbGVzLgotSWYgaXQgZG9lcyBhbmQKLS5BciByZW1vdGUtcGF0aAotaXMgc3BlY2lmaWVkLCB0aGVuCi0uQXIgcmVtb3RlLXBhdGgKLW11c3Qgc3BlY2lmeSBhIGRpcmVjdG9yeS4KLS5QcAotSWYgZWl0aGVyIHRoZQotLkZsIFAKLW9yCi0uRmwgcAotZmxhZyBpcyBzcGVjaWZpZWQsIHRoZW4gZnVsbCBmaWxlIHBlcm1pc3Npb25zIGFuZCBhY2Nlc3MgdGltZXMgYXJlCi1jb3BpZWQgdG9vLgotLlBwCi1JZiB0aGUKLS5GbCByCi1mbGFnIGlzIHNwZWNpZmllZCB0aGVuIGRpcmVjdG9yaWVzIHdpbGwgYmUgY29waWVkIHJlY3Vyc2l2ZWx5LgotTm90ZSB0aGF0Ci0uTm0KLWRvZXMgbm90IGZvbGxvdyBzeW1ib2xpYyBsaW5rcyB3aGVuIHBlcmZvcm1pbmcgcmVjdXJzaXZlIHRyYW5zZmVycy4KLS5JdCBJYyBwd2QKLURpc3BsYXkgcmVtb3RlIHdvcmtpbmcgZGlyZWN0b3J5LgotLkl0IEljIHF1aXQKLVF1aXQKLS5ObSBzZnRwIC4KLS5JdCBJYyByZW5hbWUgQXIgb2xkcGF0aCBBciBuZXdwYXRoCi1SZW5hbWUgcmVtb3RlIGZpbGUgZnJvbQotLkFyIG9sZHBhdGgKLXRvCi0uQXIgbmV3cGF0aCAuCi0uSXQgSWMgcm0gQXIgcGF0aAotRGVsZXRlIHJlbW90ZSBmaWxlIHNwZWNpZmllZCBieQotLkFyIHBhdGggLgotLkl0IEljIHJtZGlyIEFyIHBhdGgKLVJlbW92ZSByZW1vdGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieQotLkFyIHBhdGggLgotLkl0IEljIHN5bWxpbmsgQXIgb2xkcGF0aCBBciBuZXdwYXRoCi1DcmVhdGUgYSBzeW1ib2xpYyBsaW5rIGZyb20KLS5BciBvbGRwYXRoCi10bwotLkFyIG5ld3BhdGggLgotLkl0IEljIHZlcnNpb24KLURpc3BsYXkgdGhlCi0uTm0KLXByb3RvY29sIHZlcnNpb24uCi0uSXQgSWMgXCYhIE5zIEFyIGNvbW1hbmQKLUV4ZWN1dGUKLS5BciBjb21tYW5kCi1pbiBsb2NhbCBzaGVsbC4KLS5JdCBJYyBcJiEKLUVzY2FwZSB0byBsb2NhbCBzaGVsbC4KLS5JdCBJYyBcJj8KLVN5bm9ueW0gZm9yIGhlbHAuCi0uRWwKLS5TaCBTRUUgQUxTTwotLlhyIGZ0cCAxICwKLS5YciBscyAxICwKLS5YciBzY3AgMSAsCi0uWHIgc3NoIDEgLAotLlhyIHNzaC1hZGQgMSAsCi0uWHIgc3NoLWtleWdlbiAxICwKLS5YciBnbG9iIDMgLAotLlhyIHNzaF9jb25maWcgNSAsCi0uWHIgc2Z0cC1zZXJ2ZXIgOCAsCi0uWHIgc3NoZCA4Ci0uUnMKLS4lQSBULiBZbG9uZW4KLS4lQSBTLiBMZWh0aW5lbgotLiVUICJTU0ggRmlsZSBUcmFuc2ZlciBQcm90b2NvbCIKLS4lTiBkcmFmdC1pZXRmLXNlY3NoLWZpbGV4ZmVyLTAwLnR4dAotLiVEIEphbnVhcnkgMjAwMQotLiVPIHdvcmsgaW4gcHJvZ3Jlc3MgbWF0ZXJpYWwKLS5SZQpkaWZmIC0tZ2l0IGEvc2Z0cC5jIGIvc2Z0cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjY2N2Y1Li4wMDAwMDAwCi0tLSBhL3NmdHAuYworKysgL2Rldi9udWxsCkBAIC0xLDIyOTAgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNmdHAuYyx2IDEuMTMyIDIwMTAvMTIvMDQgMDA6MTg6MDEgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgRGFtaWVuIE1pbGxlciA8ZGptQG9wZW5ic2Qub3JnPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaWZkZWYgSEFWRV9TWVNfU1RBVF9ICi0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpZmRlZiBIQVZFX1NZU19TVEFUVkZTX0gKLSNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpZmRlZiBIQVZFX1BBVEhTX0gKLSMgaW5jbHVkZSA8cGF0aHMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfTElCR0VOX0gKLSNpbmNsdWRlIDxsaWJnZW4uaD4KLSNlbmRpZgotI2lmZGVmIFVTRV9MSUJFRElUCi0jaW5jbHVkZSA8aGlzdGVkaXQuaD4KLSNlbHNlCi10eXBlZGVmIHZvaWQgRWRpdExpbmU7Ci0jZW5kaWYKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaWZkZWYgSEFWRV9VVElMX0gKLSMgaW5jbHVkZSA8dXRpbC5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0xJQlVUSUxfSAotIyBpbmNsdWRlIDxsaWJ1dGlsLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJwYXRobmFtZXMuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLSNpbmNsdWRlICJzZnRwLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAic2Z0cC1jb21tb24uaCIKLSNpbmNsdWRlICJzZnRwLWNsaWVudC5oIgotCi0jZGVmaW5lIERFRkFVTFRfQ09QWV9CVUZMRU4JMzI3NjgJLyogU2l6ZSBvZiBidWZmZXIgZm9yIHVwL2Rvd25sb2FkICovCi0jZGVmaW5lIERFRkFVTFRfTlVNX1JFUVVFU1RTCTY0CS8qICMgY29uY3VycmVudCBvdXRzdGFuZGluZyByZXF1ZXN0cyAqLwotCi0vKiBGaWxlIHRvIHJlYWQgY29tbWFuZHMgZnJvbSAqLwotRklMRSogaW5maWxlOwotCi0vKiBBcmUgd2UgaW4gYmF0Y2hmaWxlIG1vZGU/ICovCi1pbnQgYmF0Y2htb2RlID0gMDsKLQotLyogUElEIG9mIHNzaCB0cmFuc3BvcnQgcHJvY2VzcyAqLwotc3RhdGljIHBpZF90IHNzaHBpZCA9IC0xOwotCi0vKiBUaGlzIGlzIHNldCB0byAwIGlmIHRoZSBwcm9ncmVzc21ldGVyIGlzIG5vdCBkZXNpcmVkLiAqLwotaW50IHNob3dwcm9ncmVzcyA9IDE7Ci0KLS8qIFdoZW4gdGhpcyBvcHRpb24gaXMgc2V0LCB3ZSBhbHdheXMgcmVjdXJzaXZlbHkgZG93bmxvYWQvdXBsb2FkIGRpcmVjdG9yaWVzICovCi1pbnQgZ2xvYmFsX3JmbGFnID0gMDsKLQotLyogV2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQsIHRoZSBmaWxlIHRyYW5zZmVycyB3aWxsIGFsd2F5cyBwcmVzZXJ2ZSB0aW1lcyAqLwotaW50IGdsb2JhbF9wZmxhZyA9IDA7Ci0KLS8qIFNJR0lOVCByZWNlaXZlZCBkdXJpbmcgY29tbWFuZCBwcm9jZXNzaW5nICovCi12b2xhdGlsZSBzaWdfYXRvbWljX3QgaW50ZXJydXB0ZWQgPSAwOwotCi0vKiBJIHdpc2ggcXNvcnQoKSB0b29rIGEgc2VwYXJhdGUgY3R4IGZvciB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbi4uLiovCi1pbnQgc29ydF9mbGFnOwotCi0vKiBDb250ZXh0IHVzZWQgZm9yIGNvbW1hbmRsaW5lIGNvbXBsZXRpb24gKi8KLXN0cnVjdCBjb21wbGV0ZV9jdHggewotCXN0cnVjdCBzZnRwX2Nvbm4gKmNvbm47Ci0JY2hhciAqKnJlbW90ZV9wYXRocDsKLX07Ci0KLWludCByZW1vdGVfZ2xvYihzdHJ1Y3Qgc2Z0cF9jb25uICosIGNvbnN0IGNoYXIgKiwgaW50LAotICAgIGludCAoKikoY29uc3QgY2hhciAqLCBpbnQpLCBnbG9iX3QgKik7IC8qIHByb3RvIGZvciBzZnRwLWdsb2IuYyAqLwotCi1leHRlcm4gY2hhciAqX19wcm9nbmFtZTsKLQotLyogU2VwYXJhdG9ycyBmb3IgaW50ZXJhY3RpdmUgY29tbWFuZHMgKi8KLSNkZWZpbmUgV0hJVEVTUEFDRSAiIFx0XHJcbiIKLQotLyogbHMgZmxhZ3MgKi8KLSNkZWZpbmUgTFNfTE9OR19WSUVXCTB4MDAwMQkvKiBGdWxsIHZpZXcgYWxhIGxzIC1sICovCi0jZGVmaW5lIExTX1NIT1JUX1ZJRVcJMHgwMDAyCS8qIFNpbmdsZSByb3cgdmlldyBhbGEgbHMgLTEgKi8KLSNkZWZpbmUgTFNfTlVNRVJJQ19WSUVXCTB4MDAwNAkvKiBMb25nIHZpZXcgd2l0aCBudW1lcmljIHVpZC9naWQgKi8KLSNkZWZpbmUgTFNfTkFNRV9TT1JUCTB4MDAwOAkvKiBTb3J0IGJ5IG5hbWUgKGRlZmF1bHQpICovCi0jZGVmaW5lIExTX1RJTUVfU09SVAkweDAwMTAJLyogU29ydCBieSBtdGltZSAqLwotI2RlZmluZSBMU19TSVpFX1NPUlQJMHgwMDIwCS8qIFNvcnQgYnkgZmlsZSBzaXplICovCi0jZGVmaW5lIExTX1JFVkVSU0VfU09SVAkweDAwNDAJLyogUmV2ZXJzZSBzb3J0IG9yZGVyICovCi0jZGVmaW5lIExTX1NIT1dfQUxMCTB4MDA4MAkvKiBEb24ndCBza2lwIGZpbGVuYW1lcyBzdGFydGluZyB3aXRoICcuJyAqLwotI2RlZmluZSBMU19TSV9VTklUUwkweDAxMDAJLyogRGlzcGxheSBzaXplcyBhcyBLLCBNLCBHLCBldGMuICovCi0KLSNkZWZpbmUgVklFV19GTEFHUwkoTFNfTE9OR19WSUVXfExTX1NIT1JUX1ZJRVd8TFNfTlVNRVJJQ19WSUVXfExTX1NJX1VOSVRTKQotI2RlZmluZSBTT1JUX0ZMQUdTCShMU19OQU1FX1NPUlR8TFNfVElNRV9TT1JUfExTX1NJWkVfU09SVCkKLQotLyogQ29tbWFuZHMgZm9yIGludGVyYWN0aXZlIG1vZGUgKi8KLSNkZWZpbmUgSV9DSERJUgkJMQotI2RlZmluZSBJX0NIR1JQCQkyCi0jZGVmaW5lIElfQ0hNT0QJCTMKLSNkZWZpbmUgSV9DSE9XTgkJNAotI2RlZmluZSBJX0RGCQkyNAotI2RlZmluZSBJX0dFVAkJNQotI2RlZmluZSBJX0hFTFAJCTYKLSNkZWZpbmUgSV9MQ0hESVIJNwotI2RlZmluZSBJX0xJTksJCTI1Ci0jZGVmaW5lIElfTExTCQk4Ci0jZGVmaW5lIElfTE1LRElSCTkKLSNkZWZpbmUgSV9MUFdECQkxMAotI2RlZmluZSBJX0xTCQkxMQotI2RlZmluZSBJX0xVTUFTSwkxMgotI2RlZmluZSBJX01LRElSCQkxMwotI2RlZmluZSBJX1BVVAkJMTQKLSNkZWZpbmUgSV9QV0QJCTE1Ci0jZGVmaW5lIElfUVVJVAkJMTYKLSNkZWZpbmUgSV9SRU5BTUUJMTcKLSNkZWZpbmUgSV9STQkJMTgKLSNkZWZpbmUgSV9STURJUgkJMTkKLSNkZWZpbmUgSV9TSEVMTAkJMjAKLSNkZWZpbmUgSV9TWU1MSU5LCTIxCi0jZGVmaW5lIElfVkVSU0lPTgkyMgotI2RlZmluZSBJX1BST0dSRVNTCTIzCi0KLXN0cnVjdCBDTUQgewotCWNvbnN0IGNoYXIgKmM7Ci0JY29uc3QgaW50IG47Ci0JY29uc3QgaW50IHQ7Ci19OwotCi0vKiBUeXBlIG9mIGNvbXBsZXRpb24gKi8KLSNkZWZpbmUgTk9BUkdTCTAKLSNkZWZpbmUgUkVNT1RFCTEKLSNkZWZpbmUgTE9DQUwJMgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IENNRCBjbWRzW10gPSB7Ci0JeyAiYnllIiwJSV9RVUlULAkJTk9BUkdTCX0sCi0JeyAiY2QiLAkJSV9DSERJUiwJUkVNT1RFCX0sCi0JeyAiY2hkaXIiLAlJX0NIRElSLAlSRU1PVEUJfSwKLQl7ICJjaGdycCIsCUlfQ0hHUlAsCVJFTU9URQl9LAotCXsgImNobW9kIiwJSV9DSE1PRCwJUkVNT1RFCX0sCi0JeyAiY2hvd24iLAlJX0NIT1dOLAlSRU1PVEUJfSwKLQl7ICJkZiIsCQlJX0RGLAkJUkVNT1RFCX0sCi0JeyAiZGlyIiwJSV9MUywJCVJFTU9URQl9LAotCXsgImV4aXQiLAlJX1FVSVQsCQlOT0FSR1MJfSwKLQl7ICJnZXQiLAlJX0dFVCwJCVJFTU9URQl9LAotCXsgImhlbHAiLAlJX0hFTFAsCQlOT0FSR1MJfSwKLQl7ICJsY2QiLAlJX0xDSERJUiwJTE9DQUwJfSwKLQl7ICJsY2hkaXIiLAlJX0xDSERJUiwJTE9DQUwJfSwKLQl7ICJsbHMiLAlJX0xMUywJCUxPQ0FMCX0sCi0JeyAibG1rZGlyIiwJSV9MTUtESVIsCUxPQ0FMCX0sCi0JeyAibG4iLAkJSV9MSU5LLAkJUkVNT1RFCX0sCi0JeyAibHB3ZCIsCUlfTFBXRCwJCUxPQ0FMCX0sCi0JeyAibHMiLAkJSV9MUywJCVJFTU9URQl9LAotCXsgImx1bWFzayIsCUlfTFVNQVNLLAlOT0FSR1MJfSwKLQl7ICJta2RpciIsCUlfTUtESVIsCVJFTU9URQl9LAotCXsgIm1nZXQiLAlJX0dFVCwJCVJFTU9URQl9LAotCXsgIm1wdXQiLAlJX1BVVCwJCUxPQ0FMCX0sCi0JeyAicHJvZ3Jlc3MiLAlJX1BST0dSRVNTLAlOT0FSR1MJfSwKLQl7ICJwdXQiLAlJX1BVVCwJCUxPQ0FMCX0sCi0JeyAicHdkIiwJSV9QV0QsCQlSRU1PVEUJfSwKLQl7ICJxdWl0IiwJSV9RVUlULAkJTk9BUkdTCX0sCi0JeyAicmVuYW1lIiwJSV9SRU5BTUUsCVJFTU9URQl9LAotCXsgInJtIiwJCUlfUk0sCQlSRU1PVEUJfSwKLQl7ICJybWRpciIsCUlfUk1ESVIsCVJFTU9URQl9LAotCXsgInN5bWxpbmsiLAlJX1NZTUxJTkssCVJFTU9URQl9LAotCXsgInZlcnNpb24iLAlJX1ZFUlNJT04sCU5PQVJHUwl9LAotCXsgIiEiLAkJSV9TSEVMTCwJTk9BUkdTCX0sCi0JeyAiPyIsCQlJX0hFTFAsCQlOT0FSR1MJfSwKLQl7IE5VTEwsCQktMSwJCS0xCX0KLX07Ci0KLWludCBpbnRlcmFjdGl2ZV9sb29wKHN0cnVjdCBzZnRwX2Nvbm4gKiwgY2hhciAqZmlsZTEsIGNoYXIgKmZpbGUyKTsKLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1raWxsY2hpbGQoaW50IHNpZ25vKQotewotCWlmIChzc2hwaWQgPiAxKSB7Ci0JCWtpbGwoc3NocGlkLCBTSUdURVJNKTsKLQkJd2FpdHBpZChzc2hwaWQsIE5VTEwsIDApOwotCX0KLQotCV9leGl0KDEpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLWNtZF9pbnRlcnJ1cHQoaW50IHNpZ25vKQotewotCWNvbnN0IGNoYXIgbXNnW10gPSAiXHJJbnRlcnJ1cHQgIFxuIjsKLQlpbnQgb2xkZXJybm8gPSBlcnJubzsKLQotCXdyaXRlKFNUREVSUl9GSUxFTk8sIG1zZywgc2l6ZW9mKG1zZykgLSAxKTsKLQlpbnRlcnJ1cHRlZCA9IDE7Ci0JZXJybm8gPSBvbGRlcnJubzsKLX0KLQotc3RhdGljIHZvaWQKLWhlbHAodm9pZCkKLXsKLQlwcmludGYoIkF2YWlsYWJsZSBjb21tYW5kczpcbiIKLQkgICAgImJ5ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVpdCBzZnRwXG4iCi0JICAgICJjZCBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZSByZW1vdGUgZGlyZWN0b3J5IHRvICdwYXRoJ1xuIgotCSAgICAiY2hncnAgZ3JwIHBhdGggICAgICAgICAgICAgICAgICAgICBDaGFuZ2UgZ3JvdXAgb2YgZmlsZSAncGF0aCcgdG8gJ2dycCdcbiIKLQkgICAgImNobW9kIG1vZGUgcGF0aCAgICAgICAgICAgICAgICAgICAgQ2hhbmdlIHBlcm1pc3Npb25zIG9mIGZpbGUgJ3BhdGgnIHRvICdtb2RlJ1xuIgotCSAgICAiY2hvd24gb3duIHBhdGggICAgICAgICAgICAgICAgICAgICBDaGFuZ2Ugb3duZXIgb2YgZmlsZSAncGF0aCcgdG8gJ293bidcbiIKLQkgICAgImRmIFstaGldIFtwYXRoXSAgICAgICAgICAgICAgICAgICAgRGlzcGxheSBzdGF0aXN0aWNzIGZvciBjdXJyZW50IGRpcmVjdG9yeSBvclxuIgotCSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc3lzdGVtIGNvbnRhaW5pbmcgJ3BhdGgnXG4iCi0JICAgICJleGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1aXQgc2Z0cFxuIgotCSAgICAiZ2V0IFstUHByXSByZW1vdGUgW2xvY2FsXSAgICAgICAgICBEb3dubG9hZCBmaWxlXG4iCi0JICAgICJoZWxwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBoZWxwIHRleHRcbiIKLQkgICAgImxjZCBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlIGxvY2FsIGRpcmVjdG9yeSB0byAncGF0aCdcbiIKLQkgICAgImxscyBbbHMtb3B0aW9ucyBbcGF0aF1dICAgICAgICAgICAgRGlzcGxheSBsb2NhbCBkaXJlY3RvcnkgbGlzdGluZ1xuIgotCSAgICAibG1rZGlyIHBhdGggICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgbG9jYWwgZGlyZWN0b3J5XG4iCi0JICAgICJsbiBbLXNdIG9sZHBhdGggbmV3cGF0aCAgICAgICAgICAgIExpbmsgcmVtb3RlIGZpbGUgKC1zIGZvciBzeW1saW5rKVxuIgotCSAgICAibHB3ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludCBsb2NhbCB3b3JraW5nIGRpcmVjdG9yeVxuIgotCSAgICAibHMgWy0xYWZobG5yU3RdIFtwYXRoXSAgICAgICAgICAgICBEaXNwbGF5IHJlbW90ZSBkaXJlY3RvcnkgbGlzdGluZ1xuIgotCSAgICAibHVtYXNrIHVtYXNrICAgICAgICAgICAgICAgICAgICAgICBTZXQgbG9jYWwgdW1hc2sgdG8gJ3VtYXNrJ1xuIgotCSAgICAibWtkaXIgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgcmVtb3RlIGRpcmVjdG9yeVxuIgotCSAgICAicHJvZ3Jlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2dnbGUgZGlzcGxheSBvZiBwcm9ncmVzcyBtZXRlclxuIgotCSAgICAicHV0IFstUHByXSBsb2NhbCBbcmVtb3RlXSAgICAgICAgICBVcGxvYWQgZmlsZVxuIgotCSAgICAicHdkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHJlbW90ZSB3b3JraW5nIGRpcmVjdG9yeVxuIgotCSAgICAicXVpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWl0IHNmdHBcbiIKLQkgICAgInJlbmFtZSBvbGRwYXRoIG5ld3BhdGggICAgICAgICAgICAgUmVuYW1lIHJlbW90ZSBmaWxlXG4iCi0JICAgICJybSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZSByZW1vdGUgZmlsZVxuIgotCSAgICAicm1kaXIgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgcmVtb3RlIGRpcmVjdG9yeVxuIgotCSAgICAic3ltbGluayBvbGRwYXRoIG5ld3BhdGggICAgICAgICAgICBTeW1saW5rIHJlbW90ZSBmaWxlXG4iCi0JICAgICJ2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgU0ZUUCB2ZXJzaW9uXG4iCi0JICAgICIhY29tbWFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGUgJ2NvbW1hbmQnIGluIGxvY2FsIHNoZWxsXG4iCi0JICAgICIhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVzY2FwZSB0byBsb2NhbCBzaGVsbFxuIgotCSAgICAiPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5vbnltIGZvciBoZWxwXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLWxvY2FsX2RvX3NoZWxsKGNvbnN0IGNoYXIgKmFyZ3MpCi17Ci0JaW50IHN0YXR1czsKLQljaGFyICpzaGVsbDsKLQlwaWRfdCBwaWQ7Ci0KLQlpZiAoISphcmdzKQotCQlhcmdzID0gTlVMTDsKLQotCWlmICgoc2hlbGwgPSBnZXRlbnYoIlNIRUxMIikpID09IE5VTEwgfHwgKnNoZWxsID09ICdcMCcpCi0JCXNoZWxsID0gX1BBVEhfQlNIRUxMOwotCi0JaWYgKChwaWQgPSBmb3JrKCkpID09IC0xKQotCQlmYXRhbCgiQ291bGRuJ3QgZm9yazogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCi0JaWYgKHBpZCA9PSAwKSB7Ci0JCS8qIFhYWDogY2hpbGQgaGFzIHBpcGUgZmRzIHRvIHNzaCBzdWJwcm9jIG9wZW4gLSBpc3N1ZT8gKi8KLQkJaWYgKGFyZ3MpIHsKLQkJCWRlYnVnMygiRXhlY3V0aW5nICVzIC1jIFwiJXNcIiIsIHNoZWxsLCBhcmdzKTsKLQkJCWV4ZWNsKHNoZWxsLCBzaGVsbCwgIi1jIiwgYXJncywgKGNoYXIgKilOVUxMKTsKLQkJfSBlbHNlIHsKLQkJCWRlYnVnMygiRXhlY3V0aW5nICVzIiwgc2hlbGwpOwotCQkJZXhlY2woc2hlbGwsIHNoZWxsLCAoY2hhciAqKU5VTEwpOwotCQl9Ci0JCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgZXhlY3V0ZSBcIiVzXCI6ICVzXG4iLCBzaGVsbCwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCV9leGl0KDEpOwotCX0KLQl3aGlsZSAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApID09IC0xKQotCQlpZiAoZXJybm8gIT0gRUlOVFIpCi0JCQlmYXRhbCgiQ291bGRuJ3Qgd2FpdCBmb3IgY2hpbGQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoIVdJRkVYSVRFRChzdGF0dXMpKQotCQllcnJvcigiU2hlbGwgZXhpdGVkIGFibm9ybWFsbHkiKTsKLQllbHNlIGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpKQotCQllcnJvcigiU2hlbGwgZXhpdGVkIHdpdGggc3RhdHVzICVkIiwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sb2NhbF9kb19scyhjb25zdCBjaGFyICphcmdzKQotewotCWlmICghYXJncyB8fCAhKmFyZ3MpCi0JCWxvY2FsX2RvX3NoZWxsKF9QQVRIX0xTKTsKLQllbHNlIHsKLQkJaW50IGxlbiA9IHN0cmxlbihfUEFUSF9MUyAiICIpICsgc3RybGVuKGFyZ3MpICsgMTsKLQkJY2hhciAqYnVmID0geG1hbGxvYyhsZW4pOwotCi0JCS8qIFhYWDogcXVvdGluZyAtIHJpcCBxdW90aW5nIGNvZGUgZnJvbSBmdHA/ICovCi0JCXNucHJpbnRmKGJ1ZiwgbGVuLCBfUEFUSF9MUyAiICVzIiwgYXJncyk7Ci0JCWxvY2FsX2RvX3NoZWxsKGJ1Zik7Ci0JCXhmcmVlKGJ1Zik7Ci0JfQotfQotCi0vKiBTdHJpcCBvbmUgcGF0aCAodXN1YWxseSB0aGUgcHdkKSBmcm9tIHRoZSBzdGFydCBvZiBhbm90aGVyICovCi1zdGF0aWMgY2hhciAqCi1wYXRoX3N0cmlwKGNoYXIgKnBhdGgsIGNoYXIgKnN0cmlwKQotewotCXNpemVfdCBsZW47Ci0KLQlpZiAoc3RyaXAgPT0gTlVMTCkKLQkJcmV0dXJuICh4c3RyZHVwKHBhdGgpKTsKLQotCWxlbiA9IHN0cmxlbihzdHJpcCk7Ci0JaWYgKHN0cm5jbXAocGF0aCwgc3RyaXAsIGxlbikgPT0gMCkgewotCQlpZiAoc3RyaXBbbGVuIC0gMV0gIT0gJy8nICYmIHBhdGhbbGVuXSA9PSAnLycpCi0JCQlsZW4rKzsKLQkJcmV0dXJuICh4c3RyZHVwKHBhdGggKyBsZW4pKTsKLQl9Ci0KLQlyZXR1cm4gKHhzdHJkdXAocGF0aCkpOwotfQotCi1zdGF0aWMgY2hhciAqCi1tYWtlX2Fic29sdXRlKGNoYXIgKnAsIGNoYXIgKnB3ZCkKLXsKLQljaGFyICphYnNfc3RyOwotCi0JLyogRGVyZWxhdGl2aXNlICovCi0JaWYgKHAgJiYgcFswXSAhPSAnLycpIHsKLQkJYWJzX3N0ciA9IHBhdGhfYXBwZW5kKHB3ZCwgcCk7Ci0JCXhmcmVlKHApOwotCQlyZXR1cm4oYWJzX3N0cik7Ci0JfSBlbHNlCi0JCXJldHVybihwKTsKLX0KLQotc3RhdGljIGludAotcGFyc2VfZ2V0cHV0X2ZsYWdzKGNvbnN0IGNoYXIgKmNtZCwgY2hhciAqKmFyZ3YsIGludCBhcmdjLCBpbnQgKnBmbGFnLAotICAgIGludCAqcmZsYWcpCi17Ci0JZXh0ZXJuIGludCBvcHRlcnIsIG9wdGluZCwgb3B0b3B0LCBvcHRyZXNldDsKLQlpbnQgY2g7Ci0KLQlvcHRpbmQgPSBvcHRyZXNldCA9IDE7Ci0Jb3B0ZXJyID0gMDsKLQotCSpyZmxhZyA9ICpwZmxhZyA9IDA7Ci0Jd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiUHBSciIpKSAhPSAtMSkgewotCQlzd2l0Y2ggKGNoKSB7Ci0JCWNhc2UgJ3AnOgotCQljYXNlICdQJzoKLQkJCSpwZmxhZyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAncic6Ci0JCWNhc2UgJ1InOgotCQkJKnJmbGFnID0gMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZXJyb3IoIiVzOiBJbnZhbGlkIGZsYWcgLSVjIiwgY21kLCBvcHRvcHQpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JcmV0dXJuIG9wdGluZDsKLX0KLQotc3RhdGljIGludAotcGFyc2VfbGlua19mbGFncyhjb25zdCBjaGFyICpjbWQsIGNoYXIgKiphcmd2LCBpbnQgYXJnYywgaW50ICpzZmxhZykKLXsKLQlleHRlcm4gaW50IG9wdGVyciwgb3B0aW5kLCBvcHRvcHQsIG9wdHJlc2V0OwotCWludCBjaDsKLQotCW9wdGluZCA9IG9wdHJlc2V0ID0gMTsKLQlvcHRlcnIgPSAwOwotCi0JKnNmbGFnID0gMDsKLQl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJzIikpICE9IC0xKSB7Ci0JCXN3aXRjaCAoY2gpIHsKLQkJY2FzZSAncyc6Ci0JCQkqc2ZsYWcgPSAxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQllcnJvcigiJXM6IEludmFsaWQgZmxhZyAtJWMiLCBjbWQsIG9wdG9wdCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gb3B0aW5kOwotfQotCi1zdGF0aWMgaW50Ci1wYXJzZV9sc19mbGFncyhjaGFyICoqYXJndiwgaW50IGFyZ2MsIGludCAqbGZsYWcpCi17Ci0JZXh0ZXJuIGludCBvcHRlcnIsIG9wdGluZCwgb3B0b3B0LCBvcHRyZXNldDsKLQlpbnQgY2g7Ci0KLQlvcHRpbmQgPSBvcHRyZXNldCA9IDE7Ci0Jb3B0ZXJyID0gMDsKLQotCSpsZmxhZyA9IExTX05BTUVfU09SVDsKLQl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICIxU2FmaGxucnQiKSkgIT0gLTEpIHsKLQkJc3dpdGNoIChjaCkgewotCQljYXNlICcxJzoKLQkJCSpsZmxhZyAmPSB+VklFV19GTEFHUzsKLQkJCSpsZmxhZyB8PSBMU19TSE9SVF9WSUVXOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1MnOgotCQkJKmxmbGFnICY9IH5TT1JUX0ZMQUdTOwotCQkJKmxmbGFnIHw9IExTX1NJWkVfU09SVDsKLQkJCWJyZWFrOwotCQljYXNlICdhJzoKLQkJCSpsZmxhZyB8PSBMU19TSE9XX0FMTDsKLQkJCWJyZWFrOwotCQljYXNlICdmJzoKLQkJCSpsZmxhZyAmPSB+U09SVF9GTEFHUzsKLQkJCWJyZWFrOwotCQljYXNlICdoJzoKLQkJCSpsZmxhZyB8PSBMU19TSV9VTklUUzsKLQkJCWJyZWFrOwotCQljYXNlICdsJzoKLQkJCSpsZmxhZyAmPSB+TFNfU0hPUlRfVklFVzsKLQkJCSpsZmxhZyB8PSBMU19MT05HX1ZJRVc7Ci0JCQlicmVhazsKLQkJY2FzZSAnbic6Ci0JCQkqbGZsYWcgJj0gfkxTX1NIT1JUX1ZJRVc7Ci0JCQkqbGZsYWcgfD0gTFNfTlVNRVJJQ19WSUVXfExTX0xPTkdfVklFVzsKLQkJCWJyZWFrOwotCQljYXNlICdyJzoKLQkJCSpsZmxhZyB8PSBMU19SRVZFUlNFX1NPUlQ7Ci0JCQlicmVhazsKLQkJY2FzZSAndCc6Ci0JCQkqbGZsYWcgJj0gflNPUlRfRkxBR1M7Ci0JCQkqbGZsYWcgfD0gTFNfVElNRV9TT1JUOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQllcnJvcigibHM6IEludmFsaWQgZmxhZyAtJWMiLCBvcHRvcHQpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JcmV0dXJuIG9wdGluZDsKLX0KLQotc3RhdGljIGludAotcGFyc2VfZGZfZmxhZ3MoY29uc3QgY2hhciAqY21kLCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGludCAqaGZsYWcsIGludCAqaWZsYWcpCi17Ci0JZXh0ZXJuIGludCBvcHRlcnIsIG9wdGluZCwgb3B0b3B0LCBvcHRyZXNldDsKLQlpbnQgY2g7Ci0KLQlvcHRpbmQgPSBvcHRyZXNldCA9IDE7Ci0Jb3B0ZXJyID0gMDsKLQotCSpoZmxhZyA9ICppZmxhZyA9IDA7Ci0Jd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGkiKSkgIT0gLTEpIHsKLQkJc3dpdGNoIChjaCkgewotCQljYXNlICdoJzoKLQkJCSpoZmxhZyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnaSc6Ci0JCQkqaWZsYWcgPSAxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQllcnJvcigiJXM6IEludmFsaWQgZmxhZyAtJWMiLCBjbWQsIG9wdG9wdCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gb3B0aW5kOwotfQotCi1zdGF0aWMgaW50Ci1pc19kaXIoY2hhciAqcGF0aCkKLXsKLQlzdHJ1Y3Qgc3RhdCBzYjsKLQotCS8qIFhYWDogcmVwb3J0IGVycm9ycz8gKi8KLQlpZiAoc3RhdChwYXRoLCAmc2IpID09IC0xKQotCQlyZXR1cm4oMCk7Ci0KLQlyZXR1cm4oU19JU0RJUihzYi5zdF9tb2RlKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXJlbW90ZV9pc19kaXIoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqcGF0aCkKLXsKLQlBdHRyaWIgKmE7Ci0KLQkvKiBYWFg6IHJlcG9ydCBlcnJvcnM/ICovCi0JaWYgKChhID0gZG9fc3RhdChjb25uLCBwYXRoLCAxKSkgPT0gTlVMTCkKLQkJcmV0dXJuKDApOwotCWlmICghKGEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1BFUk1JU1NJT05TKSkKLQkJcmV0dXJuKDApOwotCXJldHVybihTX0lTRElSKGEtPnBlcm0pKTsKLX0KLQotLyogQ2hlY2sgd2hldGhlciBwYXRoIHJldHVybmVkIGZyb20gZ2xvYiguLi4sIEdMT0JfTUFSSywgLi4uKSBpcyBhIGRpcmVjdG9yeSAqLwotc3RhdGljIGludAotcGF0aG5hbWVfaXNfZGlyKGNoYXIgKnBhdGhuYW1lKQotewotCXNpemVfdCBsID0gc3RybGVuKHBhdGhuYW1lKTsKLQotCXJldHVybiBsID4gMCAmJiBwYXRobmFtZVtsIC0gMV0gPT0gJy8nOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2dldChzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgY2hhciAqcHdkLAotICAgIGludCBwZmxhZywgaW50IHJmbGFnKQotewotCWNoYXIgKmFic19zcmMgPSBOVUxMOwotCWNoYXIgKmFic19kc3QgPSBOVUxMOwotCWdsb2JfdCBnOwotCWNoYXIgKmZpbGVuYW1lLCAqdG1wPU5VTEw7Ci0JaW50IGksIGVyciA9IDA7Ci0KLQlhYnNfc3JjID0geHN0cmR1cChzcmMpOwotCWFic19zcmMgPSBtYWtlX2Fic29sdXRlKGFic19zcmMsIHB3ZCk7Ci0JbWVtc2V0KCZnLCAwLCBzaXplb2YoZykpOwotCi0JZGVidWczKCJMb29raW5nIHVwICVzIiwgYWJzX3NyYyk7Ci0JaWYgKHJlbW90ZV9nbG9iKGNvbm4sIGFic19zcmMsIEdMT0JfTUFSSywgTlVMTCwgJmcpKSB7Ci0JCWVycm9yKCJGaWxlIFwiJXNcIiBub3QgZm91bmQuIiwgYWJzX3NyYyk7Ci0JCWVyciA9IC0xOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKgotCSAqIElmIG11bHRpcGxlIG1hdGNoZXMgdGhlbiBkc3QgbXVzdCBiZSBhIGRpcmVjdG9yeSBvcgotCSAqIHVuc3BlY2lmaWVkLgotCSAqLwotCWlmIChnLmdsX21hdGNoYyA+IDEgJiYgZHN0ICE9IE5VTEwgJiYgIWlzX2Rpcihkc3QpKSB7Ci0JCWVycm9yKCJNdWx0aXBsZSBzb3VyY2UgcGF0aHMsIGJ1dCBkZXN0aW5hdGlvbiAiCi0JCSAgICAiXCIlc1wiIGlzIG5vdCBhIGRpcmVjdG9yeSIsIGRzdCk7Ci0JCWVyciA9IC0xOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBnLmdsX3BhdGh2W2ldICYmICFpbnRlcnJ1cHRlZDsgaSsrKSB7Ci0JCXRtcCA9IHhzdHJkdXAoZy5nbF9wYXRodltpXSk7Ci0JCWlmICgoZmlsZW5hbWUgPSBiYXNlbmFtZSh0bXApKSA9PSBOVUxMKSB7Ci0JCQllcnJvcigiYmFzZW5hbWUgJXM6ICVzIiwgdG1wLCBzdHJlcnJvcihlcnJubykpOwotCQkJeGZyZWUodG1wKTsKLQkJCWVyciA9IC0xOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoZy5nbF9tYXRjaGMgPT0gMSAmJiBkc3QpIHsKLQkJCWlmIChpc19kaXIoZHN0KSkgewotCQkJCWFic19kc3QgPSBwYXRoX2FwcGVuZChkc3QsIGZpbGVuYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWJzX2RzdCA9IHhzdHJkdXAoZHN0KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChkc3QpIHsKLQkJCWFic19kc3QgPSBwYXRoX2FwcGVuZChkc3QsIGZpbGVuYW1lKTsKLQkJfSBlbHNlIHsKLQkJCWFic19kc3QgPSB4c3RyZHVwKGZpbGVuYW1lKTsKLQkJfQotCQl4ZnJlZSh0bXApOwotCi0JCXByaW50ZigiRmV0Y2hpbmcgJXMgdG8gJXNcbiIsIGcuZ2xfcGF0aHZbaV0sIGFic19kc3QpOwotCQlpZiAocGF0aG5hbWVfaXNfZGlyKGcuZ2xfcGF0aHZbaV0pICYmIChyZmxhZyB8fCBnbG9iYWxfcmZsYWcpKSB7Ci0JCQlpZiAoZG93bmxvYWRfZGlyKGNvbm4sIGcuZ2xfcGF0aHZbaV0sIGFic19kc3QsIE5VTEwsIAotCQkJICAgIHBmbGFnIHx8IGdsb2JhbF9wZmxhZywgMSkgPT0gLTEpCi0JCQkJZXJyID0gLTE7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZG9fZG93bmxvYWQoY29ubiwgZy5nbF9wYXRodltpXSwgYWJzX2RzdCwgTlVMTCwKLQkJCSAgICBwZmxhZyB8fCBnbG9iYWxfcGZsYWcpID09IC0xKQotCQkJCWVyciA9IC0xOwotCQl9Ci0JCXhmcmVlKGFic19kc3QpOwotCQlhYnNfZHN0ID0gTlVMTDsKLQl9Ci0KLW91dDoKLQl4ZnJlZShhYnNfc3JjKTsKLQlnbG9iZnJlZSgmZyk7Ci0JcmV0dXJuKGVycik7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfcHV0KHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNoYXIgKnNyYywgY2hhciAqZHN0LCBjaGFyICpwd2QsCi0gICAgaW50IHBmbGFnLCBpbnQgcmZsYWcpCi17Ci0JY2hhciAqdG1wX2RzdCA9IE5VTEw7Ci0JY2hhciAqYWJzX2RzdCA9IE5VTEw7Ci0JY2hhciAqdG1wID0gTlVMTCwgKmZpbGVuYW1lID0gTlVMTDsKLQlnbG9iX3QgZzsKLQlpbnQgZXJyID0gMDsKLQlpbnQgaSwgZHN0X2lzX2RpciA9IDE7Ci0Jc3RydWN0IHN0YXQgc2I7Ci0KLQlpZiAoZHN0KSB7Ci0JCXRtcF9kc3QgPSB4c3RyZHVwKGRzdCk7Ci0JCXRtcF9kc3QgPSBtYWtlX2Fic29sdXRlKHRtcF9kc3QsIHB3ZCk7Ci0JfQotCi0JbWVtc2V0KCZnLCAwLCBzaXplb2YoZykpOwotCWRlYnVnMygiTG9va2luZyB1cCAlcyIsIHNyYyk7Ci0JaWYgKGdsb2Ioc3JjLCBHTE9CX05PQ0hFQ0sgfCBHTE9CX01BUkssIE5VTEwsICZnKSkgewotCQllcnJvcigiRmlsZSBcIiVzXCIgbm90IGZvdW5kLiIsIHNyYyk7Ci0JCWVyciA9IC0xOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBJZiB3ZSBhcmVuJ3QgZmV0Y2hpbmcgdG8gcHdkIHRoZW4gc3Rhc2ggdGhpcyBzdGF0dXMgZm9yIGxhdGVyICovCi0JaWYgKHRtcF9kc3QgIT0gTlVMTCkKLQkJZHN0X2lzX2RpciA9IHJlbW90ZV9pc19kaXIoY29ubiwgdG1wX2RzdCk7Ci0KLQkvKiBJZiBtdWx0aXBsZSBtYXRjaGVzLCBkc3QgbWF5IGJlIGRpcmVjdG9yeSBvciB1bnNwZWNpZmllZCAqLwotCWlmIChnLmdsX21hdGNoYyA+IDEgJiYgdG1wX2RzdCAmJiAhZHN0X2lzX2RpcikgewotCQllcnJvcigiTXVsdGlwbGUgcGF0aHMgbWF0Y2gsIGJ1dCBkZXN0aW5hdGlvbiAiCi0JCSAgICAiXCIlc1wiIGlzIG5vdCBhIGRpcmVjdG9yeSIsIHRtcF9kc3QpOwotCQllcnIgPSAtMTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZm9yIChpID0gMDsgZy5nbF9wYXRodltpXSAmJiAhaW50ZXJydXB0ZWQ7IGkrKykgewotCQlpZiAoc3RhdChnLmdsX3BhdGh2W2ldLCAmc2IpID09IC0xKSB7Ci0JCQllcnIgPSAtMTsKLQkJCWVycm9yKCJzdGF0ICVzOiAlcyIsIGcuZ2xfcGF0aHZbaV0sIHN0cmVycm9yKGVycm5vKSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQkKLQkJdG1wID0geHN0cmR1cChnLmdsX3BhdGh2W2ldKTsKLQkJaWYgKChmaWxlbmFtZSA9IGJhc2VuYW1lKHRtcCkpID09IE5VTEwpIHsKLQkJCWVycm9yKCJiYXNlbmFtZSAlczogJXMiLCB0bXAsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQl4ZnJlZSh0bXApOwotCQkJZXJyID0gLTE7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWlmIChnLmdsX21hdGNoYyA9PSAxICYmIHRtcF9kc3QpIHsKLQkJCS8qIElmIGRpcmVjdG9yeSBzcGVjaWZpZWQsIGFwcGVuZCBmaWxlbmFtZSAqLwotCQkJaWYgKGRzdF9pc19kaXIpCi0JCQkJYWJzX2RzdCA9IHBhdGhfYXBwZW5kKHRtcF9kc3QsIGZpbGVuYW1lKTsKLQkJCWVsc2UKLQkJCQlhYnNfZHN0ID0geHN0cmR1cCh0bXBfZHN0KTsKLQkJfSBlbHNlIGlmICh0bXBfZHN0KSB7Ci0JCQlhYnNfZHN0ID0gcGF0aF9hcHBlbmQodG1wX2RzdCwgZmlsZW5hbWUpOwotCQl9IGVsc2UgewotCQkJYWJzX2RzdCA9IG1ha2VfYWJzb2x1dGUoeHN0cmR1cChmaWxlbmFtZSksIHB3ZCk7Ci0JCX0KLQkJeGZyZWUodG1wKTsKLQotCQlwcmludGYoIlVwbG9hZGluZyAlcyB0byAlc1xuIiwgZy5nbF9wYXRodltpXSwgYWJzX2RzdCk7Ci0JCWlmIChwYXRobmFtZV9pc19kaXIoZy5nbF9wYXRodltpXSkgJiYgKHJmbGFnIHx8IGdsb2JhbF9yZmxhZykpIHsKLQkJCWlmICh1cGxvYWRfZGlyKGNvbm4sIGcuZ2xfcGF0aHZbaV0sIGFic19kc3QsCi0JCQkgICAgcGZsYWcgfHwgZ2xvYmFsX3BmbGFnLCAxKSA9PSAtMSkKLQkJCQllcnIgPSAtMTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkb191cGxvYWQoY29ubiwgZy5nbF9wYXRodltpXSwgYWJzX2RzdCwKLQkJCSAgICBwZmxhZyB8fCBnbG9iYWxfcGZsYWcpID09IC0xKQotCQkJCWVyciA9IC0xOwotCQl9Ci0JfQotCi1vdXQ6Ci0JaWYgKGFic19kc3QpCi0JCXhmcmVlKGFic19kc3QpOwotCWlmICh0bXBfZHN0KQotCQl4ZnJlZSh0bXBfZHN0KTsKLQlnbG9iZnJlZSgmZyk7Ci0JcmV0dXJuKGVycik7Ci19Ci0KLXN0YXRpYyBpbnQKLXNkaXJlbnRfY29tcChjb25zdCB2b2lkICphYSwgY29uc3Qgdm9pZCAqYmIpCi17Ci0JU0ZUUF9ESVJFTlQgKmEgPSAqKFNGVFBfRElSRU5UICoqKWFhOwotCVNGVFBfRElSRU5UICpiID0gKihTRlRQX0RJUkVOVCAqKiliYjsKLQlpbnQgcm11bCA9IHNvcnRfZmxhZyAmIExTX1JFVkVSU0VfU09SVCA/IC0xIDogMTsKLQotI2RlZmluZSBOQ01QKGEsYikgKGEgPT0gYiA/IDAgOiAoYSA8IGIgPyAxIDogLTEpKQotCWlmIChzb3J0X2ZsYWcgJiBMU19OQU1FX1NPUlQpCi0JCXJldHVybiAocm11bCAqIHN0cmNtcChhLT5maWxlbmFtZSwgYi0+ZmlsZW5hbWUpKTsKLQllbHNlIGlmIChzb3J0X2ZsYWcgJiBMU19USU1FX1NPUlQpCi0JCXJldHVybiAocm11bCAqIE5DTVAoYS0+YS5tdGltZSwgYi0+YS5tdGltZSkpOwotCWVsc2UgaWYgKHNvcnRfZmxhZyAmIExTX1NJWkVfU09SVCkKLQkJcmV0dXJuIChybXVsICogTkNNUChhLT5hLnNpemUsIGItPmEuc2l6ZSkpOwotCi0JZmF0YWwoIlVua25vd24gbHMgc29ydCB0eXBlIik7Ci19Ci0KLS8qIHNmdHAgbHMuMSByZXBsYWNlbWVudCBmb3IgZGlyZWN0b3JpZXMgKi8KLXN0YXRpYyBpbnQKLWRvX2xzX2RpcihzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpwYXRoLCBjaGFyICpzdHJpcF9wYXRoLCBpbnQgbGZsYWcpCi17Ci0JaW50IG47Ci0JdV9pbnQgYyA9IDEsIGNvbHNwYWNlID0gMCwgY29sdW1ucyA9IDE7Ci0JU0ZUUF9ESVJFTlQgKipkOwotCi0JaWYgKChuID0gZG9fcmVhZGRpcihjb25uLCBwYXRoLCAmZCkpICE9IDApCi0JCXJldHVybiAobik7Ci0KLQlpZiAoIShsZmxhZyAmIExTX1NIT1JUX1ZJRVcpKSB7Ci0JCXVfaW50IG0gPSAwLCB3aWR0aCA9IDgwOwotCQlzdHJ1Y3Qgd2luc2l6ZSB3czsKLQkJY2hhciAqdG1wOwotCi0JCS8qIENvdW50IGVudHJpZXMgZm9yIHNvcnQgYW5kIGZpbmQgbG9uZ2VzdCBmaWxlbmFtZSAqLwotCQlmb3IgKG4gPSAwOyBkW25dICE9IE5VTEw7IG4rKykgewotCQkJaWYgKGRbbl0tPmZpbGVuYW1lWzBdICE9ICcuJyB8fCAobGZsYWcgJiBMU19TSE9XX0FMTCkpCi0JCQkJbSA9IE1BWChtLCBzdHJsZW4oZFtuXS0+ZmlsZW5hbWUpKTsKLQkJfQotCi0JCS8qIEFkZCBhbnkgc3VicGF0aCB0aGF0IGFsc28gbmVlZHMgdG8gYmUgY291bnRlZCAqLwotCQl0bXAgPSBwYXRoX3N0cmlwKHBhdGgsIHN0cmlwX3BhdGgpOwotCQltICs9IHN0cmxlbih0bXApOwotCQl4ZnJlZSh0bXApOwotCi0JCWlmIChpb2N0bChmaWxlbm8oc3RkaW4pLCBUSU9DR1dJTlNaLCAmd3MpICE9IC0xKQotCQkJd2lkdGggPSB3cy53c19jb2w7Ci0KLQkJY29sdW1ucyA9IHdpZHRoIC8gKG0gKyAyKTsKLQkJY29sdW1ucyA9IE1BWChjb2x1bW5zLCAxKTsKLQkJY29sc3BhY2UgPSB3aWR0aCAvIGNvbHVtbnM7Ci0JCWNvbHNwYWNlID0gTUlOKGNvbHNwYWNlLCB3aWR0aCk7Ci0JfQotCi0JaWYgKGxmbGFnICYgU09SVF9GTEFHUykgewotCQlmb3IgKG4gPSAwOyBkW25dICE9IE5VTEw7IG4rKykKLQkJCTsJLyogY291bnQgZW50cmllcyAqLwotCQlzb3J0X2ZsYWcgPSBsZmxhZyAmIChTT1JUX0ZMQUdTfExTX1JFVkVSU0VfU09SVCk7Ci0JCXFzb3J0KGQsIG4sIHNpemVvZigqZCksIHNkaXJlbnRfY29tcCk7Ci0JfQotCi0JZm9yIChuID0gMDsgZFtuXSAhPSBOVUxMICYmICFpbnRlcnJ1cHRlZDsgbisrKSB7Ci0JCWNoYXIgKnRtcCwgKmZuYW1lOwotCi0JCWlmIChkW25dLT5maWxlbmFtZVswXSA9PSAnLicgJiYgIShsZmxhZyAmIExTX1NIT1dfQUxMKSkKLQkJCWNvbnRpbnVlOwotCi0JCXRtcCA9IHBhdGhfYXBwZW5kKHBhdGgsIGRbbl0tPmZpbGVuYW1lKTsKLQkJZm5hbWUgPSBwYXRoX3N0cmlwKHRtcCwgc3RyaXBfcGF0aCk7Ci0JCXhmcmVlKHRtcCk7Ci0KLQkJaWYgKGxmbGFnICYgTFNfTE9OR19WSUVXKSB7Ci0JCQlpZiAobGZsYWcgJiAoTFNfTlVNRVJJQ19WSUVXfExTX1NJX1VOSVRTKSkgewotCQkJCWNoYXIgKmxuYW1lOwotCQkJCXN0cnVjdCBzdGF0IHNiOwotCi0JCQkJbWVtc2V0KCZzYiwgMCwgc2l6ZW9mKHNiKSk7Ci0JCQkJYXR0cmliX3RvX3N0YXQoJmRbbl0tPmEsICZzYik7Ci0JCQkJbG5hbWUgPSBsc19maWxlKGZuYW1lLCAmc2IsIDEsCi0JCQkJICAgIChsZmxhZyAmIExTX1NJX1VOSVRTKSk7Ci0JCQkJcHJpbnRmKCIlc1xuIiwgbG5hbWUpOwotCQkJCXhmcmVlKGxuYW1lKTsKLQkJCX0gZWxzZQotCQkJCXByaW50ZigiJXNcbiIsIGRbbl0tPmxvbmduYW1lKTsKLQkJfSBlbHNlIHsKLQkJCXByaW50ZigiJS0qcyIsIGNvbHNwYWNlLCBmbmFtZSk7Ci0JCQlpZiAoYyA+PSBjb2x1bW5zKSB7Ci0JCQkJcHJpbnRmKCJcbiIpOwotCQkJCWMgPSAxOwotCQkJfSBlbHNlCi0JCQkJYysrOwotCQl9Ci0KLQkJeGZyZWUoZm5hbWUpOwotCX0KLQotCWlmICghKGxmbGFnICYgTFNfTE9OR19WSUVXKSAmJiAoYyAhPSAxKSkKLQkJcHJpbnRmKCJcbiIpOwotCi0JZnJlZV9zZnRwX2RpcmVudHMoZCk7Ci0JcmV0dXJuICgwKTsKLX0KLQotLyogc2Z0cCBscy4xIHJlcGxhY2VtZW50IHdoaWNoIGhhbmRsZXMgcGF0aCBnbG9icyAqLwotc3RhdGljIGludAotZG9fZ2xvYmJlZF9scyhzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpwYXRoLCBjaGFyICpzdHJpcF9wYXRoLAotICAgIGludCBsZmxhZykKLXsKLQlBdHRyaWIgKmEgPSBOVUxMOwotCWNoYXIgKmZuYW1lLCAqbG5hbWU7Ci0JZ2xvYl90IGc7Ci0JaW50IGVycjsKLQlzdHJ1Y3Qgd2luc2l6ZSB3czsKLQl1X2ludCBpLCBjID0gMSwgY29sc3BhY2UgPSAwLCBjb2x1bW5zID0gMSwgbSA9IDAsIHdpZHRoID0gODA7Ci0KLQltZW1zZXQoJmcsIDAsIHNpemVvZihnKSk7Ci0KLQlpZiAocmVtb3RlX2dsb2IoY29ubiwgcGF0aCwKLQkgICAgR0xPQl9NQVJLfEdMT0JfTk9DSEVDS3xHTE9CX0JSQUNFfEdMT0JfS0VFUFNUQVQsIE5VTEwsICZnKSB8fAotCSAgICAoZy5nbF9wYXRoYyAmJiAhZy5nbF9tYXRjaGMpKSB7Ci0JCWlmIChnLmdsX3BhdGhjKQotCQkJZ2xvYmZyZWUoJmcpOwotCQllcnJvcigiQ2FuJ3QgbHM6IFwiJXNcIiBub3QgZm91bmQiLCBwYXRoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChpbnRlcnJ1cHRlZCkKLQkJZ290byBvdXQ7Ci0KLQkvKgotCSAqIElmIHRoZSBnbG9iIHJldHVybnMgYSBzaW5nbGUgbWF0Y2ggYW5kIGl0IGlzIGEgZGlyZWN0b3J5LAotCSAqIHRoZW4ganVzdCBsaXN0IGl0cyBjb250ZW50cy4KLQkgKi8KLQlpZiAoZy5nbF9tYXRjaGMgPT0gMSAmJiBnLmdsX3N0YXR2WzBdICE9IE5VTEwgJiYKLQkgICAgU19JU0RJUihnLmdsX3N0YXR2WzBdLT5zdF9tb2RlKSkgewotCQllcnIgPSBkb19sc19kaXIoY29ubiwgZy5nbF9wYXRodlswXSwgc3RyaXBfcGF0aCwgbGZsYWcpOwotCQlnbG9iZnJlZSgmZyk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKGlvY3RsKGZpbGVubyhzdGRpbiksIFRJT0NHV0lOU1osICZ3cykgIT0gLTEpCi0JCXdpZHRoID0gd3Mud3NfY29sOwotCi0JaWYgKCEobGZsYWcgJiBMU19TSE9SVF9WSUVXKSkgewotCQkvKiBDb3VudCBlbnRyaWVzIGZvciBzb3J0IGFuZCBmaW5kIGxvbmdlc3QgZmlsZW5hbWUgKi8KLQkJZm9yIChpID0gMDsgZy5nbF9wYXRodltpXTsgaSsrKQotCQkJbSA9IE1BWChtLCBzdHJsZW4oZy5nbF9wYXRodltpXSkpOwotCi0JCWNvbHVtbnMgPSB3aWR0aCAvIChtICsgMik7Ci0JCWNvbHVtbnMgPSBNQVgoY29sdW1ucywgMSk7Ci0JCWNvbHNwYWNlID0gd2lkdGggLyBjb2x1bW5zOwotCX0KLQotCWZvciAoaSA9IDA7IGcuZ2xfcGF0aHZbaV0gJiYgIWludGVycnVwdGVkOyBpKyssIGEgPSBOVUxMKSB7Ci0JCWZuYW1lID0gcGF0aF9zdHJpcChnLmdsX3BhdGh2W2ldLCBzdHJpcF9wYXRoKTsKLQkJaWYgKGxmbGFnICYgTFNfTE9OR19WSUVXKSB7Ci0JCQlpZiAoZy5nbF9zdGF0dltpXSA9PSBOVUxMKSB7Ci0JCQkJZXJyb3IoIm5vIHN0YXQgaW5mb3JtYXRpb24gZm9yICVzIiwgZm5hbWUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJbG5hbWUgPSBsc19maWxlKGZuYW1lLCBnLmdsX3N0YXR2W2ldLCAxLAotCQkJICAgIChsZmxhZyAmIExTX1NJX1VOSVRTKSk7Ci0JCQlwcmludGYoIiVzXG4iLCBsbmFtZSk7Ci0JCQl4ZnJlZShsbmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGYoIiUtKnMiLCBjb2xzcGFjZSwgZm5hbWUpOwotCQkJaWYgKGMgPj0gY29sdW1ucykgewotCQkJCXByaW50ZigiXG4iKTsKLQkJCQljID0gMTsKLQkJCX0gZWxzZQotCQkJCWMrKzsKLQkJfQotCQl4ZnJlZShmbmFtZSk7Ci0JfQotCi0JaWYgKCEobGZsYWcgJiBMU19MT05HX1ZJRVcpICYmIChjICE9IDEpKQotCQlwcmludGYoIlxuIik7Ci0KLSBvdXQ6Ci0JaWYgKGcuZ2xfcGF0aGMpCi0JCWdsb2JmcmVlKCZnKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kb19kZihzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpwYXRoLCBpbnQgaGZsYWcsIGludCBpZmxhZykKLXsKLQlzdHJ1Y3Qgc2Z0cF9zdGF0dmZzIHN0OwotCWNoYXIgc191c2VkW0ZNVF9TQ0FMRURfU1RSU0laRV07Ci0JY2hhciBzX2F2YWlsW0ZNVF9TQ0FMRURfU1RSU0laRV07Ci0JY2hhciBzX3Jvb3RbRk1UX1NDQUxFRF9TVFJTSVpFXTsKLQljaGFyIHNfdG90YWxbRk1UX1NDQUxFRF9TVFJTSVpFXTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgZmZyZWU7Ci0KLQlpZiAoZG9fc3RhdHZmcyhjb25uLCBwYXRoLCAmc3QsIDEpID09IC0xKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGlmbGFnKSB7Ci0JCWZmcmVlID0gc3QuZl9maWxlcyA/ICgxMDAgKiAoc3QuZl9maWxlcyAtIHN0LmZfZmZyZWUpIC8gc3QuZl9maWxlcykgOiAwOwotCQlwcmludGYoIiAgICAgSW5vZGVzICAgICAgICBVc2VkICAgICAgIEF2YWlsICAgICAgIgotCQkgICAgIihyb290KSAgICAlJUNhcGFjaXR5XG4iKTsKLQkJcHJpbnRmKCIlMTFsbHUgJTExbGx1ICUxMWxsdSAlMTFsbHUgICAgICAgICAlM2xsdSUlXG4iLAotCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdC5mX2ZpbGVzLAotCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoc3QuZl9maWxlcyAtIHN0LmZfZmZyZWUpLAotCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdC5mX2ZhdmFpbCwKLQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3QuZl9mZnJlZSwgZmZyZWUpOwotCX0gZWxzZSBpZiAoaGZsYWcpIHsKLQkJc3RybGNweShzX3VzZWQsICJlcnJvciIsIHNpemVvZihzX3VzZWQpKTsKLQkJc3RybGNweShzX2F2YWlsLCAiZXJyb3IiLCBzaXplb2Yoc19hdmFpbCkpOwotCQlzdHJsY3B5KHNfcm9vdCwgImVycm9yIiwgc2l6ZW9mKHNfcm9vdCkpOwotCQlzdHJsY3B5KHNfdG90YWwsICJlcnJvciIsIHNpemVvZihzX3RvdGFsKSk7Ci0JCWZtdF9zY2FsZWQoKHN0LmZfYmxvY2tzIC0gc3QuZl9iZnJlZSkgKiBzdC5mX2Zyc2l6ZSwgc191c2VkKTsKLQkJZm10X3NjYWxlZChzdC5mX2JhdmFpbCAqIHN0LmZfZnJzaXplLCBzX2F2YWlsKTsKLQkJZm10X3NjYWxlZChzdC5mX2JmcmVlICogc3QuZl9mcnNpemUsIHNfcm9vdCk7Ci0JCWZtdF9zY2FsZWQoc3QuZl9ibG9ja3MgKiBzdC5mX2Zyc2l6ZSwgc190b3RhbCk7Ci0JCXByaW50ZigiICAgIFNpemUgICAgIFVzZWQgICAgQXZhaWwgICAocm9vdCkgICAgJSVDYXBhY2l0eVxuIik7Ci0JCXByaW50ZigiJTdzQiAlN3NCICU3c0IgJTdzQiAgICAgICAgICUzbGx1JSVcbiIsCi0JCSAgICBzX3RvdGFsLCBzX3VzZWQsIHNfYXZhaWwsIHNfcm9vdCwKLQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKDEwMCAqIChzdC5mX2Jsb2NrcyAtIHN0LmZfYmZyZWUpIC8KLQkJICAgIHN0LmZfYmxvY2tzKSk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRmKCIgICAgICAgIFNpemUgICAgICAgICBVc2VkICAgICAgICBBdmFpbCAgICAgICAiCi0JCSAgICAiKHJvb3QpICAgICUlQ2FwYWNpdHlcbiIpOwotCQlwcmludGYoIiUxMmxsdSAlMTJsbHUgJTEybGx1ICUxMmxsdSAgICAgICAgICUzbGx1JSVcbiIsCi0JCSAgICAodW5zaWduZWQgbG9uZyBsb25nKShzdC5mX2Zyc2l6ZSAqIHN0LmZfYmxvY2tzIC8gMTAyNCksCi0JCSAgICAodW5zaWduZWQgbG9uZyBsb25nKShzdC5mX2Zyc2l6ZSAqCi0JCSAgICAoc3QuZl9ibG9ja3MgLSBzdC5mX2JmcmVlKSAvIDEwMjQpLAotCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoc3QuZl9mcnNpemUgKiBzdC5mX2JhdmFpbCAvIDEwMjQpLAotCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoc3QuZl9mcnNpemUgKiBzdC5mX2JmcmVlIC8gMTAyNCksCi0JCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSgxMDAgKiAoc3QuZl9ibG9ja3MgLSBzdC5mX2JmcmVlKSAvCi0JCSAgICBzdC5mX2Jsb2NrcykpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFVuZG8gZXNjYXBpbmcgb2YgZ2xvYiBzZXF1ZW5jZXMgaW4gcGxhY2UuIFVzZWQgdG8gdW5kbyBleHRyYSBlc2NhcGluZwotICogYXBwbGllZCBpbiBtYWtlYXJndigpIHdoZW4gdGhlIHN0cmluZyBpcyBkZXN0aW5lZCBmb3IgYSBmdW5jdGlvbiB0aGF0Ci0gKiBkb2VzIG5vdCBnbG9iIGl0LgotICovCi1zdGF0aWMgdm9pZAotdW5kb19nbG9iX2VzY2FwZShjaGFyICpzKQotewotCXNpemVfdCBpLCBqOwotCi0JZm9yIChpID0gaiA9IDA7OykgewotCQlpZiAoc1tpXSA9PSAnXDAnKSB7Ci0JCQlzW2pdID0gJ1wwJzsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc1tpXSAhPSAnXFwnKSB7Ci0JCQlzW2orK10gPSBzW2krK107Ci0JCQljb250aW51ZTsKLQkJfQotCQkvKiBzW2ldID09ICdcXCcgKi8KLQkJKytpOwotCQlzd2l0Y2ggKHNbaV0pIHsKLQkJY2FzZSAnPyc6Ci0JCWNhc2UgJ1snOgotCQljYXNlICcqJzoKLQkJY2FzZSAnXFwnOgotCQkJc1tqKytdID0gc1tpKytdOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1wwJzoKLQkJCXNbaisrXSA9ICdcXCc7Ci0JCQlzW2pdID0gJ1wwJzsKLQkJCXJldHVybjsKLQkJZGVmYXVsdDoKLQkJCXNbaisrXSA9ICdcXCc7Ci0JCQlzW2orK10gPSBzW2krK107Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotLyoKLSAqIFNwbGl0IGEgc3RyaW5nIGludG8gYW4gYXJndW1lbnQgdmVjdG9yIHVzaW5nIHNoKDEpLXN0eWxlIHF1b3RpbmcsCi0gKiBjb21tZW50IGFuZCBlc2NhcGluZyBydWxlcywgYnV0IHdpdGggc29tZSB0d2Vha3MgdG8gaGFuZGxlIGdsb2IoMykKLSAqIHdpbGRjYXJkcy4KLSAqIFRoZSAic2xvcHB5IiBmbGFnIGFsbG93cyBmb3IgcmVjb3ZlcnkgZnJvbSBtaXNzaW5nIHRlcm1pbmF0aW5nIHF1b3RlLCBmb3IKLSAqIHVzZSBpbiBwYXJzaW5nIGluY29tcGxldGUgY29tbWFuZGxpbmVzIGR1cmluZyB0YWIgYXV0b2NvbXBsZXRpb24uCi0gKgotICogUmV0dXJucyBOVUxMIG9uIGVycm9yIG9yIGEgTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50cy4KLSAqCi0gKiBJZiAibGFzdHF1b3RlIiBpcyBub3QgTlVMTCwgdGhlIHF1b3RpbmcgY2hhcmFjdGVyIHVzZWQgZm9yIHRoZSBsYXN0Ci0gKiBhcmd1bWVudCBpcyBwbGFjZWQgaW4gKmxhc3RxdW90ZSAoIlwwIiwgIiciIG9yICJcIiIpLgotICogCi0gKiBJZiAidGVybWluYXRlZCIgaXMgbm90IE5VTEwsICp0ZXJtaW5hdGVkIHdpbGwgYmUgc2V0IHRvIDEgd2hlbiB0aGUKLSAqIGxhc3QgYXJndW1lbnQncyBxdW90ZSBoYXMgYmVlbiBwcm9wZXJseSB0ZXJtaW5hdGVkIG9yIDAgb3RoZXJ3aXNlLgotICogVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBvZiB1c2UgaWYgInNsb3BweSIgaXMgc2V0LgotICovCi0jZGVmaW5lIE1BWEFSR1MgCTEyOAotI2RlZmluZSBNQVhBUkdMRU4JODE5Mgotc3RhdGljIGNoYXIgKioKLW1ha2Vhcmd2KGNvbnN0IGNoYXIgKmFyZywgaW50ICphcmdjcCwgaW50IHNsb3BweSwgY2hhciAqbGFzdHF1b3RlLAotICAgIHVfaW50ICp0ZXJtaW5hdGVkKQotewotCWludCBhcmdjLCBxdW90OwotCXNpemVfdCBpLCBqOwotCXN0YXRpYyBjaGFyIGFyZ3ZzW01BWEFSR0xFTl07Ci0Jc3RhdGljIGNoYXIgKmFyZ3ZbTUFYQVJHUyArIDFdOwotCWVudW0geyBNQV9TVEFSVCwgTUFfU1FVT1RFLCBNQV9EUVVPVEUsIE1BX1VOUVVPVEVEIH0gc3RhdGUsIHE7Ci0KLQkqYXJnY3AgPSBhcmdjID0gMDsKLQlpZiAoc3RybGVuKGFyZykgPiBzaXplb2YoYXJndnMpIC0gMSkgewotIGFyZ3NfdG9vX2xvbmdzOgotCQllcnJvcigic3RyaW5nIHRvbyBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAodGVybWluYXRlZCAhPSBOVUxMKQotCQkqdGVybWluYXRlZCA9IDE7Ci0JaWYgKGxhc3RxdW90ZSAhPSBOVUxMKQotCQkqbGFzdHF1b3RlID0gJ1wwJzsKLQlzdGF0ZSA9IE1BX1NUQVJUOwotCWkgPSBqID0gMDsKLQlmb3IgKDs7KSB7Ci0JCWlmIChpc3NwYWNlKGFyZ1tpXSkpIHsKLQkJCWlmIChzdGF0ZSA9PSBNQV9VTlFVT1RFRCkgewotCQkJCS8qIFRlcm1pbmF0ZSBjdXJyZW50IGFyZ3VtZW50ICovCi0JCQkJYXJndnNbaisrXSA9ICdcMCc7Ci0JCQkJYXJnYysrOwotCQkJCXN0YXRlID0gTUFfU1RBUlQ7Ci0JCQl9IGVsc2UgaWYgKHN0YXRlICE9IE1BX1NUQVJUKQotCQkJCWFyZ3ZzW2orK10gPSBhcmdbaV07Ci0JCX0gZWxzZSBpZiAoYXJnW2ldID09ICciJyB8fCBhcmdbaV0gPT0gJ1wnJykgewotCQkJcSA9IGFyZ1tpXSA9PSAnIicgPyBNQV9EUVVPVEUgOiBNQV9TUVVPVEU7Ci0JCQlpZiAoc3RhdGUgPT0gTUFfU1RBUlQpIHsKLQkJCQlhcmd2W2FyZ2NdID0gYXJndnMgKyBqOwotCQkJCXN0YXRlID0gcTsKLQkJCQlpZiAobGFzdHF1b3RlICE9IE5VTEwpCi0JCQkJCSpsYXN0cXVvdGUgPSBhcmdbaV07Ci0JCQl9IGVsc2UgaWYgKHN0YXRlID09IE1BX1VOUVVPVEVEKSAKLQkJCQlzdGF0ZSA9IHE7Ci0JCQllbHNlIGlmIChzdGF0ZSA9PSBxKQotCQkJCXN0YXRlID0gTUFfVU5RVU9URUQ7Ci0JCQllbHNlCi0JCQkJYXJndnNbaisrXSA9IGFyZ1tpXTsKLQkJfSBlbHNlIGlmIChhcmdbaV0gPT0gJ1xcJykgewotCQkJaWYgKHN0YXRlID09IE1BX1NRVU9URSB8fCBzdGF0ZSA9PSBNQV9EUVVPVEUpIHsKLQkJCQlxdW90ID0gc3RhdGUgPT0gTUFfU1FVT1RFID8gJ1wnJyA6ICciJzsKLQkJCQkvKiBVbmVzY2FwZSBxdW90ZSB3ZSBhcmUgaW4gKi8KLQkJCQkvKiBYWFggc3VwcG9ydCBcbiBhbmQgZnJpZW5kcz8gKi8KLQkJCQlpZiAoYXJnW2kgKyAxXSA9PSBxdW90KSB7Ci0JCQkJCWkrKzsKLQkJCQkJYXJndnNbaisrXSA9IGFyZ1tpXTsKLQkJCQl9IGVsc2UgaWYgKGFyZ1tpICsgMV0gPT0gJz8nIHx8Ci0JCQkJICAgIGFyZ1tpICsgMV0gPT0gJ1snIHx8IGFyZ1tpICsgMV0gPT0gJyonKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFNwZWNpYWwgY2FzZSBmb3Igc2Z0cDogYXBwZW5kCi0JCQkJCSAqIGRvdWJsZS1lc2NhcGVkIGdsb2Igc2VxdWVuY2UgLQotCQkJCQkgKiBnbG9iIHdpbGwgdW5kbyBvbmUgbGV2ZWwgb2YKLQkJCQkJICogZXNjYXBpbmcuIE5CLiBzdHJpbmcgY2FuIGdyb3cgaGVyZS4KLQkJCQkJICovCi0JCQkJCWlmIChqID49IHNpemVvZihhcmd2cykgLSA1KQotCQkJCQkJZ290byBhcmdzX3Rvb19sb25nczsKLQkJCQkJYXJndnNbaisrXSA9ICdcXCc7Ci0JCQkJCWFyZ3ZzW2orK10gPSBhcmdbaSsrXTsKLQkJCQkJYXJndnNbaisrXSA9ICdcXCc7Ci0JCQkJCWFyZ3ZzW2orK10gPSBhcmdbaV07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYXJndnNbaisrXSA9IGFyZ1tpKytdOwotCQkJCQlhcmd2c1tqKytdID0gYXJnW2ldOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHN0YXRlID09IE1BX1NUQVJUKSB7Ci0JCQkJCWFyZ3ZbYXJnY10gPSBhcmd2cyArIGo7Ci0JCQkJCXN0YXRlID0gTUFfVU5RVU9URUQ7Ci0JCQkJCWlmIChsYXN0cXVvdGUgIT0gTlVMTCkKLQkJCQkJCSpsYXN0cXVvdGUgPSAnXDAnOwotCQkJCX0KLQkJCQlpZiAoYXJnW2kgKyAxXSA9PSAnPycgfHwgYXJnW2kgKyAxXSA9PSAnWycgfHwKLQkJCQkgICAgYXJnW2kgKyAxXSA9PSAnKicgfHwgYXJnW2kgKyAxXSA9PSAnXFwnKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFNwZWNpYWwgY2FzZSBmb3Igc2Z0cDogYXBwZW5kCi0JCQkJCSAqIGVzY2FwZWQgZ2xvYiBzZXF1ZW5jZSAtCi0JCQkJCSAqIGdsb2Igd2lsbCB1bmRvIG9uZSBsZXZlbCBvZgotCQkJCQkgKiBlc2NhcGluZy4KLQkJCQkJICovCi0JCQkJCWFyZ3ZzW2orK10gPSBhcmdbaSsrXTsKLQkJCQkJYXJndnNbaisrXSA9IGFyZ1tpXTsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBVbmVzY2FwZSBldmVyeXRoaW5nICovCi0JCQkJCS8qIFhYWCBzdXBwb3J0IFxuIGFuZCBmcmllbmRzPyAqLwotCQkJCQlpKys7Ci0JCQkJCWFyZ3ZzW2orK10gPSBhcmdbaV07Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGFyZ1tpXSA9PSAnIycpIHsKLQkJCWlmIChzdGF0ZSA9PSBNQV9TUVVPVEUgfHwgc3RhdGUgPT0gTUFfRFFVT1RFKQotCQkJCWFyZ3ZzW2orK10gPSBhcmdbaV07Ci0JCQllbHNlCi0JCQkJZ290byBzdHJpbmdfZG9uZTsKLQkJfSBlbHNlIGlmIChhcmdbaV0gPT0gJ1wwJykgewotCQkJaWYgKHN0YXRlID09IE1BX1NRVU9URSB8fCBzdGF0ZSA9PSBNQV9EUVVPVEUpIHsKLQkJCQlpZiAoc2xvcHB5KSB7Ci0JCQkJCXN0YXRlID0gTUFfVU5RVU9URUQ7Ci0JCQkJCWlmICh0ZXJtaW5hdGVkICE9IE5VTEwpCi0JCQkJCQkqdGVybWluYXRlZCA9IDA7Ci0JCQkJCWdvdG8gc3RyaW5nX2RvbmU7Ci0JCQkJfQotCQkJCWVycm9yKCJVbnRlcm1pbmF0ZWQgcXVvdGVkIGFyZ3VtZW50Iik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0gc3RyaW5nX2RvbmU6Ci0JCQlpZiAoc3RhdGUgPT0gTUFfVU5RVU9URUQpIHsKLQkJCQlhcmd2c1tqKytdID0gJ1wwJzsKLQkJCQlhcmdjKys7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCWlmIChzdGF0ZSA9PSBNQV9TVEFSVCkgewotCQkJCWFyZ3ZbYXJnY10gPSBhcmd2cyArIGo7Ci0JCQkJc3RhdGUgPSBNQV9VTlFVT1RFRDsKLQkJCQlpZiAobGFzdHF1b3RlICE9IE5VTEwpCi0JCQkJCSpsYXN0cXVvdGUgPSAnXDAnOwotCQkJfQotCQkJaWYgKChzdGF0ZSA9PSBNQV9TUVVPVEUgfHwgc3RhdGUgPT0gTUFfRFFVT1RFKSAmJgotCQkJICAgIChhcmdbaV0gPT0gJz8nIHx8IGFyZ1tpXSA9PSAnWycgfHwgYXJnW2ldID09ICcqJykpIHsKLQkJCQkvKgotCQkJCSAqIFNwZWNpYWwgY2FzZSBmb3Igc2Z0cDogZXNjYXBlIHF1b3RlZAotCQkJCSAqIGdsb2IoMykgd2lsZGNhcmRzLiBOQi4gc3RyaW5nIGNhbiBncm93Ci0JCQkJICogaGVyZS4KLQkJCQkgKi8KLQkJCQlpZiAoaiA+PSBzaXplb2YoYXJndnMpIC0gMykKLQkJCQkJZ290byBhcmdzX3Rvb19sb25nczsKLQkJCQlhcmd2c1tqKytdID0gJ1xcJzsKLQkJCQlhcmd2c1tqKytdID0gYXJnW2ldOwotCQkJfSBlbHNlCi0JCQkJYXJndnNbaisrXSA9IGFyZ1tpXTsKLQkJfQotCQlpKys7Ci0JfQotCSphcmdjcCA9IGFyZ2M7Ci0JcmV0dXJuIGFyZ3Y7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX2FyZ3MoY29uc3QgY2hhciAqKmNwcCwgaW50ICpwZmxhZywgaW50ICpyZmxhZywgaW50ICpsZmxhZywgaW50ICppZmxhZywKLSAgICBpbnQgKmhmbGFnLCBpbnQgKnNmbGFnLCB1bnNpZ25lZCBsb25nICpuX2FyZywgY2hhciAqKnBhdGgxLCBjaGFyICoqcGF0aDIpCi17Ci0JY29uc3QgY2hhciAqY21kLCAqY3AgPSAqY3BwOwotCWNoYXIgKmNwMiwgKiphcmd2OwotCWludCBiYXNlID0gMDsKLQlsb25nIGw7Ci0JaW50IGksIGNtZG51bSwgb3B0aWR4LCBhcmdjOwotCi0JLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLQljcCA9IGNwICsgc3Ryc3BuKGNwLCBXSElURVNQQUNFKTsKLQotCS8qIENoZWNrIGZvciBsZWFkaW5nICctJyAoZGlzYWJsZSBlcnJvciBwcm9jZXNzaW5nKSAqLwotCSppZmxhZyA9IDA7Ci0JaWYgKCpjcCA9PSAnLScpIHsKLQkJKmlmbGFnID0gMTsKLQkJY3ArKzsKLQkJY3AgPSBjcCArIHN0cnNwbihjcCwgV0hJVEVTUEFDRSk7Ci0JfQotCi0JLyogSWdub3JlIGJsYW5rIGxpbmVzIGFuZCBsaW5lcyB3aGljaCBiZWdpbiB3aXRoIGNvbW1lbnQgJyMnIGNoYXIgKi8KLQlpZiAoKmNwID09ICdcMCcgfHwgKmNwID09ICcjJykKLQkJcmV0dXJuICgwKTsKLQotCWlmICgoYXJndiA9IG1ha2Vhcmd2KGNwLCAmYXJnYywgMCwgTlVMTCwgTlVMTCkpID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCS8qIEZpZ3VyZSBvdXQgd2hpY2ggY29tbWFuZCB3ZSBoYXZlICovCi0JZm9yIChpID0gMDsgY21kc1tpXS5jICE9IE5VTEw7IGkrKykgewotCQlpZiAoc3RyY2FzZWNtcChjbWRzW2ldLmMsIGFyZ3ZbMF0pID09IDApCi0JCQlicmVhazsKLQl9Ci0JY21kbnVtID0gY21kc1tpXS5uOwotCWNtZCA9IGNtZHNbaV0uYzsKLQotCS8qIFNwZWNpYWwgY2FzZSAqLwotCWlmICgqY3AgPT0gJyEnKSB7Ci0JCWNwKys7Ci0JCWNtZG51bSA9IElfU0hFTEw7Ci0JfSBlbHNlIGlmIChjbWRudW0gPT0gLTEpIHsKLQkJZXJyb3IoIkludmFsaWQgY29tbWFuZC4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIEdldCBhcmd1bWVudHMgYW5kIHBhcnNlIGZsYWdzICovCi0JKmxmbGFnID0gKnBmbGFnID0gKnJmbGFnID0gKmhmbGFnID0gKm5fYXJnID0gMDsKLQkqcGF0aDEgPSAqcGF0aDIgPSBOVUxMOwotCW9wdGlkeCA9IDE7Ci0Jc3dpdGNoIChjbWRudW0pIHsKLQljYXNlIElfR0VUOgotCWNhc2UgSV9QVVQ6Ci0JCWlmICgob3B0aWR4ID0gcGFyc2VfZ2V0cHV0X2ZsYWdzKGNtZCwgYXJndiwgYXJnYywKLQkJICAgIHBmbGFnLCByZmxhZykpID09IC0xKQotCQkJcmV0dXJuIC0xOwotCQkvKiBHZXQgZmlyc3QgcGF0aG5hbWUgKG1hbmRhdG9yeSkgKi8KLQkJaWYgKGFyZ2MgLSBvcHRpZHggPCAxKSB7Ci0JCQllcnJvcigiWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgcGF0aCBhZnRlciBhICIKLQkJCSAgICAiJXMgY29tbWFuZC4iLCBjbWQpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCSpwYXRoMSA9IHhzdHJkdXAoYXJndltvcHRpZHhdKTsKLQkJLyogR2V0IHNlY29uZCBwYXRobmFtZSAob3B0aW9uYWwpICovCi0JCWlmIChhcmdjIC0gb3B0aWR4ID4gMSkgewotCQkJKnBhdGgyID0geHN0cmR1cChhcmd2W29wdGlkeCArIDFdKTsKLQkJCS8qIERlc3RpbmF0aW9uIGlzIG5vdCBnbG9iYmVkICovCi0JCQl1bmRvX2dsb2JfZXNjYXBlKCpwYXRoMik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBJX0xJTks6Ci0JCWlmICgob3B0aWR4ID0gcGFyc2VfbGlua19mbGFncyhjbWQsIGFyZ3YsIGFyZ2MsIHNmbGFnKSkgPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JY2FzZSBJX1NZTUxJTks6Ci0JY2FzZSBJX1JFTkFNRToKLQkJaWYgKGFyZ2MgLSBvcHRpZHggPCAyKSB7Ci0JCQllcnJvcigiWW91IG11c3Qgc3BlY2lmeSB0d28gcGF0aHMgYWZ0ZXIgYSAlcyAiCi0JCQkgICAgImNvbW1hbmQuIiwgY21kKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkqcGF0aDEgPSB4c3RyZHVwKGFyZ3Zbb3B0aWR4XSk7Ci0JCSpwYXRoMiA9IHhzdHJkdXAoYXJndltvcHRpZHggKyAxXSk7Ci0JCS8qIFBhdGhzIGFyZSBub3QgZ2xvYmJlZCAqLwotCQl1bmRvX2dsb2JfZXNjYXBlKCpwYXRoMSk7Ci0JCXVuZG9fZ2xvYl9lc2NhcGUoKnBhdGgyKTsKLQkJYnJlYWs7Ci0JY2FzZSBJX1JNOgotCWNhc2UgSV9NS0RJUjoKLQljYXNlIElfUk1ESVI6Ci0JY2FzZSBJX0NIRElSOgotCWNhc2UgSV9MQ0hESVI6Ci0JY2FzZSBJX0xNS0RJUjoKLQkJLyogR2V0IHBhdGhuYW1lIChtYW5kYXRvcnkpICovCi0JCWlmIChhcmdjIC0gb3B0aWR4IDwgMSkgewotCQkJZXJyb3IoIllvdSBtdXN0IHNwZWNpZnkgYSBwYXRoIGFmdGVyIGEgJXMgY29tbWFuZC4iLAotCQkJICAgIGNtZCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJKnBhdGgxID0geHN0cmR1cChhcmd2W29wdGlkeF0pOwotCQkvKiBPbmx5ICJybSIgZ2xvYnMgKi8KLQkJaWYgKGNtZG51bSAhPSBJX1JNKQotCQkJdW5kb19nbG9iX2VzY2FwZSgqcGF0aDEpOwotCQlicmVhazsKLQljYXNlIElfREY6Ci0JCWlmICgob3B0aWR4ID0gcGFyc2VfZGZfZmxhZ3MoY21kLCBhcmd2LCBhcmdjLCBoZmxhZywKLQkJICAgIGlmbGFnKSkgPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JCS8qIERlZmF1bHQgdG8gY3VycmVudCBkaXJlY3RvcnkgaWYgbm8gcGF0aCBzcGVjaWZpZWQgKi8KLQkJaWYgKGFyZ2MgLSBvcHRpZHggPCAxKQotCQkJKnBhdGgxID0gTlVMTDsKLQkJZWxzZSB7Ci0JCQkqcGF0aDEgPSB4c3RyZHVwKGFyZ3Zbb3B0aWR4XSk7Ci0JCQl1bmRvX2dsb2JfZXNjYXBlKCpwYXRoMSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBJX0xTOgotCQlpZiAoKG9wdGlkeCA9IHBhcnNlX2xzX2ZsYWdzKGFyZ3YsIGFyZ2MsIGxmbGFnKSkgPT0gLTEpCi0JCQlyZXR1cm4oLTEpOwotCQkvKiBQYXRoIGlzIG9wdGlvbmFsICovCi0JCWlmIChhcmdjIC0gb3B0aWR4ID4gMCkKLQkJCSpwYXRoMSA9IHhzdHJkdXAoYXJndltvcHRpZHhdKTsKLQkJYnJlYWs7Ci0JY2FzZSBJX0xMUzoKLQkJLyogU2tpcCBscyBjb21tYW5kIGFuZCBmb2xsb3dpbmcgd2hpdGVzcGFjZSAqLwotCQljcCA9IGNwICsgc3RybGVuKGNtZCkgKyBzdHJzcG4oY3AsIFdISVRFU1BBQ0UpOwotCWNhc2UgSV9TSEVMTDoKLQkJLyogVXNlcyB0aGUgcmVzdCBvZiB0aGUgbGluZSAqLwotCQlicmVhazsKLQljYXNlIElfTFVNQVNLOgotCWNhc2UgSV9DSE1PRDoKLQkJYmFzZSA9IDg7Ci0JY2FzZSBJX0NIT1dOOgotCWNhc2UgSV9DSEdSUDoKLQkJLyogR2V0IG51bWVyaWMgYXJnIChtYW5kYXRvcnkpICovCi0JCWlmIChhcmdjIC0gb3B0aWR4IDwgMSkKLQkJCWdvdG8gbmVlZF9udW1fYXJnOwotCQllcnJubyA9IDA7Ci0JCWwgPSBzdHJ0b2woYXJndltvcHRpZHhdLCAmY3AyLCBiYXNlKTsKLQkJaWYgKGNwMiA9PSBhcmd2W29wdGlkeF0gfHwgKmNwMiAhPSAnXDAnIHx8Ci0JCSAgICAoKGwgPT0gTE9OR19NSU4gfHwgbCA9PSBMT05HX01BWCkgJiYgZXJybm8gPT0gRVJBTkdFKSB8fAotCQkgICAgbCA8IDApIHsKLSBuZWVkX251bV9hcmc6Ci0JCQllcnJvcigiWW91IG11c3Qgc3VwcGx5IGEgbnVtZXJpYyBhcmd1bWVudCAiCi0JCQkgICAgInRvIHRoZSAlcyBjb21tYW5kLiIsIGNtZCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJKm5fYXJnID0gbDsKLQkJaWYgKGNtZG51bSA9PSBJX0xVTUFTSykKLQkJCWJyZWFrOwotCQkvKiBHZXQgcGF0aG5hbWUgKG1hbmRhdG9yeSkgKi8KLQkJaWYgKGFyZ2MgLSBvcHRpZHggPCAyKSB7Ci0JCQllcnJvcigiWW91IG11c3Qgc3BlY2lmeSBhIHBhdGggYWZ0ZXIgYSAlcyBjb21tYW5kLiIsCi0JCQkgICAgY21kKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkqcGF0aDEgPSB4c3RyZHVwKGFyZ3Zbb3B0aWR4ICsgMV0pOwotCQlicmVhazsKLQljYXNlIElfUVVJVDoKLQljYXNlIElfUFdEOgotCWNhc2UgSV9MUFdEOgotCWNhc2UgSV9IRUxQOgotCWNhc2UgSV9WRVJTSU9OOgotCWNhc2UgSV9QUk9HUkVTUzoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmF0YWwoIkNvbW1hbmQgbm90IGltcGxlbWVudGVkIik7Ci0JfQotCi0JKmNwcCA9IGNwOwotCXJldHVybihjbWRudW0pOwotfQotCi1zdGF0aWMgaW50Ci1wYXJzZV9kaXNwYXRjaF9jb21tYW5kKHN0cnVjdCBzZnRwX2Nvbm4gKmNvbm4sIGNvbnN0IGNoYXIgKmNtZCwgY2hhciAqKnB3ZCwKLSAgICBpbnQgZXJyX2Fib3J0KQotewotCWNoYXIgKnBhdGgxLCAqcGF0aDIsICp0bXA7Ci0JaW50IHBmbGFnID0gMCwgcmZsYWcgPSAwLCBsZmxhZyA9IDAsIGlmbGFnID0gMCwgaGZsYWcgPSAwLCBzZmxhZyA9IDA7Ci0JaW50IGNtZG51bSwgaTsKLQl1bnNpZ25lZCBsb25nIG5fYXJnID0gMDsKLQlBdHRyaWIgYSwgKmFhOwotCWNoYXIgcGF0aF9idWZbTUFYUEFUSExFTl07Ci0JaW50IGVyciA9IDA7Ci0JZ2xvYl90IGc7Ci0KLQlwYXRoMSA9IHBhdGgyID0gTlVMTDsKLQljbWRudW0gPSBwYXJzZV9hcmdzKCZjbWQsICZwZmxhZywgJnJmbGFnLCAmbGZsYWcsICZpZmxhZywgJmhmbGFnLAotCSAgICAmc2ZsYWcsICZuX2FyZywgJnBhdGgxLCAmcGF0aDIpOwotCi0JaWYgKGlmbGFnICE9IDApCi0JCWVycl9hYm9ydCA9IDA7Ci0KLQltZW1zZXQoJmcsIDAsIHNpemVvZihnKSk7Ci0KLQkvKiBQZXJmb3JtIGNvbW1hbmQgKi8KLQlzd2l0Y2ggKGNtZG51bSkgewotCWNhc2UgMDoKLQkJLyogQmxhbmsgbGluZSAqLwotCQlicmVhazsKLQljYXNlIC0xOgotCQkvKiBVbnJlY29nbml6ZWQgY29tbWFuZCAqLwotCQllcnIgPSAtMTsKLQkJYnJlYWs7Ci0JY2FzZSBJX0dFVDoKLQkJZXJyID0gcHJvY2Vzc19nZXQoY29ubiwgcGF0aDEsIHBhdGgyLCAqcHdkLCBwZmxhZywgcmZsYWcpOwotCQlicmVhazsKLQljYXNlIElfUFVUOgotCQllcnIgPSBwcm9jZXNzX3B1dChjb25uLCBwYXRoMSwgcGF0aDIsICpwd2QsIHBmbGFnLCByZmxhZyk7Ci0JCWJyZWFrOwotCWNhc2UgSV9SRU5BTUU6Ci0JCXBhdGgxID0gbWFrZV9hYnNvbHV0ZShwYXRoMSwgKnB3ZCk7Ci0JCXBhdGgyID0gbWFrZV9hYnNvbHV0ZShwYXRoMiwgKnB3ZCk7Ci0JCWVyciA9IGRvX3JlbmFtZShjb25uLCBwYXRoMSwgcGF0aDIpOwotCQlicmVhazsKLQljYXNlIElfU1lNTElOSzoKLQkJc2ZsYWcgPSAxOwotCWNhc2UgSV9MSU5LOgotCQlwYXRoMSA9IG1ha2VfYWJzb2x1dGUocGF0aDEsICpwd2QpOwotCQlwYXRoMiA9IG1ha2VfYWJzb2x1dGUocGF0aDIsICpwd2QpOwotCQllcnIgPSAoc2ZsYWcgPyBkb19zeW1saW5rIDogZG9faGFyZGxpbmspKGNvbm4sIHBhdGgxLCBwYXRoMik7Ci0JCWJyZWFrOwotCWNhc2UgSV9STToKLQkJcGF0aDEgPSBtYWtlX2Fic29sdXRlKHBhdGgxLCAqcHdkKTsKLQkJcmVtb3RlX2dsb2IoY29ubiwgcGF0aDEsIEdMT0JfTk9DSEVDSywgTlVMTCwgJmcpOwotCQlmb3IgKGkgPSAwOyBnLmdsX3BhdGh2W2ldICYmICFpbnRlcnJ1cHRlZDsgaSsrKSB7Ci0JCQlwcmludGYoIlJlbW92aW5nICVzXG4iLCBnLmdsX3BhdGh2W2ldKTsKLQkJCWVyciA9IGRvX3JtKGNvbm4sIGcuZ2xfcGF0aHZbaV0pOwotCQkJaWYgKGVyciAhPSAwICYmIGVycl9hYm9ydCkKLQkJCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIElfTUtESVI6Ci0JCXBhdGgxID0gbWFrZV9hYnNvbHV0ZShwYXRoMSwgKnB3ZCk7Ci0JCWF0dHJpYl9jbGVhcigmYSk7Ci0JCWEuZmxhZ3MgfD0gU1NIMl9GSUxFWEZFUl9BVFRSX1BFUk1JU1NJT05TOwotCQlhLnBlcm0gPSAwNzc3OwotCQllcnIgPSBkb19ta2Rpcihjb25uLCBwYXRoMSwgJmEsIDEpOwotCQlicmVhazsKLQljYXNlIElfUk1ESVI6Ci0JCXBhdGgxID0gbWFrZV9hYnNvbHV0ZShwYXRoMSwgKnB3ZCk7Ci0JCWVyciA9IGRvX3JtZGlyKGNvbm4sIHBhdGgxKTsKLQkJYnJlYWs7Ci0JY2FzZSBJX0NIRElSOgotCQlwYXRoMSA9IG1ha2VfYWJzb2x1dGUocGF0aDEsICpwd2QpOwotCQlpZiAoKHRtcCA9IGRvX3JlYWxwYXRoKGNvbm4sIHBhdGgxKSkgPT0gTlVMTCkgewotCQkJZXJyID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICgoYWEgPSBkb19zdGF0KGNvbm4sIHRtcCwgMCkpID09IE5VTEwpIHsKLQkJCXhmcmVlKHRtcCk7Ci0JCQllcnIgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCEoYWEtPmZsYWdzICYgU1NIMl9GSUxFWEZFUl9BVFRSX1BFUk1JU1NJT05TKSkgewotCQkJZXJyb3IoIkNhbid0IGNoYW5nZSBkaXJlY3Rvcnk6IENhbid0IGNoZWNrIHRhcmdldCIpOwotCQkJeGZyZWUodG1wKTsKLQkJCWVyciA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIVNfSVNESVIoYWEtPnBlcm0pKSB7Ci0JCQllcnJvcigiQ2FuJ3QgY2hhbmdlIGRpcmVjdG9yeTogXCIlc1wiIGlzIG5vdCAiCi0JCQkgICAgImEgZGlyZWN0b3J5IiwgdG1wKTsKLQkJCXhmcmVlKHRtcCk7Ci0JCQllcnIgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJeGZyZWUoKnB3ZCk7Ci0JCSpwd2QgPSB0bXA7Ci0JCWJyZWFrOwotCWNhc2UgSV9MUzoKLQkJaWYgKCFwYXRoMSkgewotCQkJZG9fbHNfZGlyKGNvbm4sICpwd2QsICpwd2QsIGxmbGFnKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogU3RyaXAgcHdkIG9mZiBiZWdpbm5pbmcgb2Ygbm9uLWFic29sdXRlIHBhdGhzICovCi0JCXRtcCA9IE5VTEw7Ci0JCWlmICgqcGF0aDEgIT0gJy8nKQotCQkJdG1wID0gKnB3ZDsKLQotCQlwYXRoMSA9IG1ha2VfYWJzb2x1dGUocGF0aDEsICpwd2QpOwotCQllcnIgPSBkb19nbG9iYmVkX2xzKGNvbm4sIHBhdGgxLCB0bXAsIGxmbGFnKTsKLQkJYnJlYWs7Ci0JY2FzZSBJX0RGOgotCQkvKiBEZWZhdWx0IHRvIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5vIHBhdGggc3BlY2lmaWVkICovCi0JCWlmIChwYXRoMSA9PSBOVUxMKQotCQkJcGF0aDEgPSB4c3RyZHVwKCpwd2QpOwotCQlwYXRoMSA9IG1ha2VfYWJzb2x1dGUocGF0aDEsICpwd2QpOwotCQllcnIgPSBkb19kZihjb25uLCBwYXRoMSwgaGZsYWcsIGlmbGFnKTsKLQkJYnJlYWs7Ci0JY2FzZSBJX0xDSERJUjoKLQkJaWYgKGNoZGlyKHBhdGgxKSA9PSAtMSkgewotCQkJZXJyb3IoIkNvdWxkbid0IGNoYW5nZSBsb2NhbCBkaXJlY3RvcnkgdG8gIgotCQkJICAgICJcIiVzXCI6ICVzIiwgcGF0aDEsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQllcnIgPSAxOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSV9MTUtESVI6Ci0JCWlmIChta2RpcihwYXRoMSwgMDc3NykgPT0gLTEpIHsKLQkJCWVycm9yKCJDb3VsZG4ndCBjcmVhdGUgbG9jYWwgZGlyZWN0b3J5ICIKLQkJCSAgICAiXCIlc1wiOiAlcyIsIHBhdGgxLCBzdHJlcnJvcihlcnJubykpOwotCQkJZXJyID0gMTsKLQkJfQotCQlicmVhazsKLQljYXNlIElfTExTOgotCQlsb2NhbF9kb19scyhjbWQpOwotCQlicmVhazsKLQljYXNlIElfU0hFTEw6Ci0JCWxvY2FsX2RvX3NoZWxsKGNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSV9MVU1BU0s6Ci0JCXVtYXNrKG5fYXJnKTsKLQkJcHJpbnRmKCJMb2NhbCB1bWFzazogJTAzbG9cbiIsIG5fYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBJX0NITU9EOgotCQlwYXRoMSA9IG1ha2VfYWJzb2x1dGUocGF0aDEsICpwd2QpOwotCQlhdHRyaWJfY2xlYXIoJmEpOwotCQlhLmZsYWdzIHw9IFNTSDJfRklMRVhGRVJfQVRUUl9QRVJNSVNTSU9OUzsKLQkJYS5wZXJtID0gbl9hcmc7Ci0JCXJlbW90ZV9nbG9iKGNvbm4sIHBhdGgxLCBHTE9CX05PQ0hFQ0ssIE5VTEwsICZnKTsKLQkJZm9yIChpID0gMDsgZy5nbF9wYXRodltpXSAmJiAhaW50ZXJydXB0ZWQ7IGkrKykgewotCQkJcHJpbnRmKCJDaGFuZ2luZyBtb2RlIG9uICVzXG4iLCBnLmdsX3BhdGh2W2ldKTsKLQkJCWVyciA9IGRvX3NldHN0YXQoY29ubiwgZy5nbF9wYXRodltpXSwgJmEpOwotCQkJaWYgKGVyciAhPSAwICYmIGVycl9hYm9ydCkKLQkJCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIElfQ0hPV046Ci0JY2FzZSBJX0NIR1JQOgotCQlwYXRoMSA9IG1ha2VfYWJzb2x1dGUocGF0aDEsICpwd2QpOwotCQlyZW1vdGVfZ2xvYihjb25uLCBwYXRoMSwgR0xPQl9OT0NIRUNLLCBOVUxMLCAmZyk7Ci0JCWZvciAoaSA9IDA7IGcuZ2xfcGF0aHZbaV0gJiYgIWludGVycnVwdGVkOyBpKyspIHsKLQkJCWlmICghKGFhID0gZG9fc3RhdChjb25uLCBnLmdsX3BhdGh2W2ldLCAwKSkpIHsKLQkJCQlpZiAoZXJyX2Fib3J0KSB7Ci0JCQkJCWVyciA9IC0xOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIShhYS0+ZmxhZ3MgJiBTU0gyX0ZJTEVYRkVSX0FUVFJfVUlER0lEKSkgewotCQkJCWVycm9yKCJDYW4ndCBnZXQgY3VycmVudCBvd25lcnNoaXAgb2YgIgotCQkJCSAgICAicmVtb3RlIGZpbGUgXCIlc1wiIiwgZy5nbF9wYXRodltpXSk7Ci0JCQkJaWYgKGVycl9hYm9ydCkgewotCQkJCQllcnIgPSAtMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYWEtPmZsYWdzICY9IFNTSDJfRklMRVhGRVJfQVRUUl9VSURHSUQ7Ci0JCQlpZiAoY21kbnVtID09IElfQ0hPV04pIHsKLQkJCQlwcmludGYoIkNoYW5naW5nIG93bmVyIG9uICVzXG4iLCBnLmdsX3BhdGh2W2ldKTsKLQkJCQlhYS0+dWlkID0gbl9hcmc7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ZigiQ2hhbmdpbmcgZ3JvdXAgb24gJXNcbiIsIGcuZ2xfcGF0aHZbaV0pOwotCQkJCWFhLT5naWQgPSBuX2FyZzsKLQkJCX0KLQkJCWVyciA9IGRvX3NldHN0YXQoY29ubiwgZy5nbF9wYXRodltpXSwgYWEpOwotCQkJaWYgKGVyciAhPSAwICYmIGVycl9hYm9ydCkKLQkJCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIElfUFdEOgotCQlwcmludGYoIlJlbW90ZSB3b3JraW5nIGRpcmVjdG9yeTogJXNcbiIsICpwd2QpOwotCQlicmVhazsKLQljYXNlIElfTFBXRDoKLQkJaWYgKCFnZXRjd2QocGF0aF9idWYsIHNpemVvZihwYXRoX2J1ZikpKSB7Ci0JCQllcnJvcigiQ291bGRuJ3QgZ2V0IGxvY2FsIGN3ZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJZXJyID0gLTE7Ci0JCQlicmVhazsKLQkJfQotCQlwcmludGYoIkxvY2FsIHdvcmtpbmcgZGlyZWN0b3J5OiAlc1xuIiwgcGF0aF9idWYpOwotCQlicmVhazsKLQljYXNlIElfUVVJVDoKLQkJLyogUHJvY2Vzc2VkIGJlbG93ICovCi0JCWJyZWFrOwotCWNhc2UgSV9IRUxQOgotCQloZWxwKCk7Ci0JCWJyZWFrOwotCWNhc2UgSV9WRVJTSU9OOgotCQlwcmludGYoIlNGVFAgcHJvdG9jb2wgdmVyc2lvbiAldVxuIiwgc2Z0cF9wcm90b192ZXJzaW9uKGNvbm4pKTsKLQkJYnJlYWs7Ci0JY2FzZSBJX1BST0dSRVNTOgotCQlzaG93cHJvZ3Jlc3MgPSAhc2hvd3Byb2dyZXNzOwotCQlpZiAoc2hvd3Byb2dyZXNzKQotCQkJcHJpbnRmKCJQcm9ncmVzcyBtZXRlciBlbmFibGVkXG4iKTsKLQkJZWxzZQotCQkJcHJpbnRmKCJQcm9ncmVzcyBtZXRlciBkaXNhYmxlZFxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZhdGFsKCIlZCBpcyBub3QgaW1wbGVtZW50ZWQiLCBjbWRudW0pOwotCX0KLQotCWlmIChnLmdsX3BhdGhjKQotCQlnbG9iZnJlZSgmZyk7Ci0JaWYgKHBhdGgxKQotCQl4ZnJlZShwYXRoMSk7Ci0JaWYgKHBhdGgyKQotCQl4ZnJlZShwYXRoMik7Ci0KLQkvKiBJZiBhbiB1bmlnbm9yZWQgZXJyb3Igb2NjdXJzIGluIGJhdGNoIG1vZGUgd2Ugc2hvdWxkIGFib3J0LiAqLwotCWlmIChlcnJfYWJvcnQgJiYgZXJyICE9IDApCi0JCXJldHVybiAoLTEpOwotCWVsc2UgaWYgKGNtZG51bSA9PSBJX1FVSVQpCi0JCXJldHVybiAoMSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi0jaWZkZWYgVVNFX0xJQkVESVQKLXN0YXRpYyBjaGFyICoKLXByb21wdChFZGl0TGluZSAqZWwpCi17Ci0JcmV0dXJuICgic2Z0cD4gIik7Ci19Ci0KLS8qIERpc3BsYXkgZW50cmllcyBpbiAnbGlzdCcgYWZ0ZXIgc2tpcHBpbmcgdGhlIGZpcnN0ICdsZW4nIGNoYXJzICovCi1zdGF0aWMgdm9pZAotY29tcGxldGVfZGlzcGxheShjaGFyICoqbGlzdCwgdV9pbnQgbGVuKQotewotCXVfaW50IHksIG0gPSAwLCB3aWR0aCA9IDgwLCBjb2x1bW5zID0gMSwgY29sc3BhY2UgPSAwLCBsbGVuOwotCXN0cnVjdCB3aW5zaXplIHdzOwotCWNoYXIgKnRtcDsKLQotCS8qIENvdW50IGVudHJpZXMgZm9yIHNvcnQgYW5kIGZpbmQgbG9uZ2VzdCAqLwotCWZvciAoeSA9IDA7IGxpc3RbeV07IHkrKykgCi0JCW0gPSBNQVgobSwgc3RybGVuKGxpc3RbeV0pKTsKLQotCWlmIChpb2N0bChmaWxlbm8oc3RkaW4pLCBUSU9DR1dJTlNaLCAmd3MpICE9IC0xKQotCQl3aWR0aCA9IHdzLndzX2NvbDsKLQotCW0gPSBtID4gbGVuID8gbSAtIGxlbiA6IDA7Ci0JY29sdW1ucyA9IHdpZHRoIC8gKG0gKyAyKTsKLQljb2x1bW5zID0gTUFYKGNvbHVtbnMsIDEpOwotCWNvbHNwYWNlID0gd2lkdGggLyBjb2x1bW5zOwotCWNvbHNwYWNlID0gTUlOKGNvbHNwYWNlLCB3aWR0aCk7Ci0KLQlwcmludGYoIlxuIik7Ci0JbSA9IDE7Ci0JZm9yICh5ID0gMDsgbGlzdFt5XTsgeSsrKSB7Ci0JCWxsZW4gPSBzdHJsZW4obGlzdFt5XSk7Ci0JCXRtcCA9IGxsZW4gPiBsZW4gPyBsaXN0W3ldICsgbGVuIDogIiI7Ci0JCXByaW50ZigiJS0qcyIsIGNvbHNwYWNlLCB0bXApOwotCQlpZiAobSA+PSBjb2x1bW5zKSB7Ci0JCQlwcmludGYoIlxuIik7Ci0JCQltID0gMTsKLQkJfSBlbHNlCi0JCQltKys7Ci0JfQotCXByaW50ZigiXG4iKTsKLX0KLQotLyoKLSAqIEdpdmVuIGEgImxpc3QiIG9mIHdvcmRzIHRoYXQgYmVnaW4gd2l0aCBhIGNvbW1vbiBwcmVmaXggb2YgIndvcmQiLAotICogYXR0ZW1wdCB0byBmaW5kIGFuIGF1dG9jb21wbGV0aW9uIHRvIGV4dGVuZHMgIndvcmQiIGJ5IHRoZSBuZXh0Ci0gKiBjaGFyYWN0ZXJzIGNvbW1vbiB0byBhbGwgZW50cmllcyBpbiAibGlzdCIuCi0gKi8KLXN0YXRpYyBjaGFyICoKLWNvbXBsZXRlX2FtYmlndW91cyhjb25zdCBjaGFyICp3b3JkLCBjaGFyICoqbGlzdCwgc2l6ZV90IGNvdW50KQotewotCWlmICh3b3JkID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKGNvdW50ID4gMCkgewotCQl1X2ludCB5LCBtYXRjaGxlbiA9IHN0cmxlbihsaXN0WzBdKTsKLQotCQkvKiBGaW5kIGxlbmd0aCBvZiBjb21tb24gc3RlbSAqLwotCQlmb3IgKHkgPSAxOyBsaXN0W3ldOyB5KyspIHsKLQkJCXVfaW50IHg7Ci0KLQkJCWZvciAoeCA9IDA7IHggPCBtYXRjaGxlbjsgeCsrKSAKLQkJCQlpZiAobGlzdFswXVt4XSAhPSBsaXN0W3ldW3hdKSAKLQkJCQkJYnJlYWs7Ci0KLQkJCW1hdGNobGVuID0geDsKLQkJfQotCi0JCWlmIChtYXRjaGxlbiA+IHN0cmxlbih3b3JkKSkgewotCQkJY2hhciAqdG1wID0geHN0cmR1cChsaXN0WzBdKTsKLQotCQkJdG1wW21hdGNobGVuXSA9ICdcMCc7Ci0JCQlyZXR1cm4gdG1wOwotCQl9Ci0JfSAKLQotCXJldHVybiB4c3RyZHVwKHdvcmQpOwotfQotCi0vKiBBdXRvY29tcGxldGUgYSBzZnRwIGNvbW1hbmQgKi8KLXN0YXRpYyBpbnQKLWNvbXBsZXRlX2NtZF9wYXJzZShFZGl0TGluZSAqZWwsIGNoYXIgKmNtZCwgaW50IGxhc3RhcmcsIGNoYXIgcXVvdGUsCi0gICAgaW50IHRlcm1pbmF0ZWQpCi17Ci0JdV9pbnQgeSwgY291bnQgPSAwLCBjbWRsZW4sIHRtcGxlbjsKLQljaGFyICp0bXAsICoqbGlzdCwgYXJndGVybVszXTsKLQljb25zdCBMaW5lSW5mbyAqbGY7Ci0KLQlsaXN0ID0geGNhbGxvYygoc2l6ZW9mKGNtZHMpIC8gc2l6ZW9mKCpjbWRzKSkgKyAxLCBzaXplb2YoY2hhciAqKSk7Ci0KLQkvKiBObyBjb21tYW5kIHNwZWNpZmllZDogZGlzcGxheSBhbGwgYXZhaWxhYmxlIGNvbW1hbmRzICovCi0JaWYgKGNtZCA9PSBOVUxMKSB7Ci0JCWZvciAoeSA9IDA7IGNtZHNbeV0uYzsgeSsrKQotCQkJbGlzdFtjb3VudCsrXSA9IHhzdHJkdXAoY21kc1t5XS5jKTsKLQkJCi0JCWxpc3RbY291bnRdID0gTlVMTDsKLQkJY29tcGxldGVfZGlzcGxheShsaXN0LCAwKTsKLQotCQlmb3IgKHkgPSAwOyBsaXN0W3ldICE9IE5VTEw7IHkrKykgIAotCQkJeGZyZWUobGlzdFt5XSk7CQotCQl4ZnJlZShsaXN0KTsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCS8qIFByZXBhcmUgc3Vic2V0IG9mIGNvbW1hbmRzIHRoYXQgc3RhcnQgd2l0aCAiY21kIiAqLwotCWNtZGxlbiA9IHN0cmxlbihjbWQpOwotCWZvciAoeSA9IDA7IGNtZHNbeV0uYzsgeSsrKSAgewotCQlpZiAoIXN0cm5jYXNlY21wKGNtZCwgY21kc1t5XS5jLCBjbWRsZW4pKSAKLQkJCWxpc3RbY291bnQrK10gPSB4c3RyZHVwKGNtZHNbeV0uYyk7Ci0JfQotCWxpc3RbY291bnRdID0gTlVMTDsKLQotCWlmIChjb3VudCA9PSAwKQotCQlyZXR1cm4gMDsKLQotCS8qIENvbXBsZXRlIGFtYmlnaW91cyBjb21tYW5kICovCi0JdG1wID0gY29tcGxldGVfYW1iaWd1b3VzKGNtZCwgbGlzdCwgY291bnQpOwotCWlmIChjb3VudCA+IDEpCi0JCWNvbXBsZXRlX2Rpc3BsYXkobGlzdCwgMCk7Ci0KLQlmb3IgKHkgPSAwOyBsaXN0W3ldOyB5KyspICAKLQkJeGZyZWUobGlzdFt5XSk7CQotCXhmcmVlKGxpc3QpOwotCi0JaWYgKHRtcCAhPSBOVUxMKSB7Ci0JCXRtcGxlbiA9IHN0cmxlbih0bXApOwotCQljbWRsZW4gPSBzdHJsZW4oY21kKTsKLQkJLyogSWYgY21kIG1heSBiZSBleHRlbmRlZCB0aGVuIGRvIHNvICovCi0JCWlmICh0bXBsZW4gPiBjbWRsZW4pCi0JCQlpZiAoZWxfaW5zZXJ0c3RyKGVsLCB0bXAgKyBjbWRsZW4pID09IC0xKQotCQkJCWZhdGFsKCJlbF9pbnNlcnRzdHIgZmFpbGVkLiIpOwotCQlsZiA9IGVsX2xpbmUoZWwpOwotCQkvKiBUZXJtaW5hdGUgYXJndW1lbnQgY2xlYW5seSAqLwotCQlpZiAoY291bnQgPT0gMSkgewotCQkJeSA9IDA7Ci0JCQlpZiAoIXRlcm1pbmF0ZWQpCi0JCQkJYXJndGVybVt5KytdID0gcXVvdGU7Ci0JCQlpZiAobGFzdGFyZyB8fCAqKGxmLT5jdXJzb3IpICE9ICcgJykKLQkJCQlhcmd0ZXJtW3krK10gPSAnICc7Ci0JCQlhcmd0ZXJtW3ldID0gJ1wwJzsKLQkJCWlmICh5ID4gMCAmJiBlbF9pbnNlcnRzdHIoZWwsIGFyZ3Rlcm0pID09IC0xKQotCQkJCWZhdGFsKCJlbF9pbnNlcnRzdHIgZmFpbGVkLiIpOwotCQl9Ci0JCXhmcmVlKHRtcCk7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi0vKgotICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHNmdHAgY29tbWFuZCdzIGFyZ3VtZW50cyAoaWYgYW55KQotICogcmVwcmVzZW50IGxvY2FsIG9yIHJlbW90ZSBmaWxlcy4KLSAqLwotc3RhdGljIGludAotY29tcGxldGVfaXNfcmVtb3RlKGNoYXIgKmNtZCkgewotCWludCBpOwotCi0JaWYgKGNtZCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQlmb3IgKGkgPSAwOyBjbWRzW2ldLmM7IGkrKykgewotCQlpZiAoIXN0cm5jYXNlY21wKGNtZCwgY21kc1tpXS5jLCBzdHJsZW4oY21kc1tpXS5jKSkpIAotCQkJcmV0dXJuIGNtZHNbaV0udDsKLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLS8qIEF1dG9jb21wbGV0ZSBhIGZpbGVuYW1lICJmaWxlIiAqLwotc3RhdGljIGludAotY29tcGxldGVfbWF0Y2goRWRpdExpbmUgKmVsLCBzdHJ1Y3Qgc2Z0cF9jb25uICpjb25uLCBjaGFyICpyZW1vdGVfcGF0aCwKLSAgICBjaGFyICpmaWxlLCBpbnQgcmVtb3RlLCBpbnQgbGFzdGFyZywgY2hhciBxdW90ZSwgaW50IHRlcm1pbmF0ZWQpCi17Ci0JZ2xvYl90IGc7Ci0JY2hhciAqdG1wLCAqdG1wMiwgaW5zWzNdOwotCXVfaW50IGksIGhhZGdsb2IsIHB3ZGxlbiwgbGVuLCB0bXBsZW4sIGZpbGVsZW47Ci0JY29uc3QgTGluZUluZm8gKmxmOwotCQotCS8qIEdsb2IgZnJvbSAiZmlsZSIgbG9jYXRpb24gKi8KLQlpZiAoZmlsZSA9PSBOVUxMKQotCQl0bXAgPSB4c3RyZHVwKCIqIik7Ci0JZWxzZQotCQl4YXNwcmludGYoJnRtcCwgIiVzKiIsIGZpbGUpOwotCi0JbWVtc2V0KCZnLCAwLCBzaXplb2YoZykpOwotCWlmIChyZW1vdGUgIT0gTE9DQUwpIHsKLQkJdG1wID0gbWFrZV9hYnNvbHV0ZSh0bXAsIHJlbW90ZV9wYXRoKTsKLQkJcmVtb3RlX2dsb2IoY29ubiwgdG1wLCBHTE9CX0RPT0ZGU3xHTE9CX01BUkssIE5VTEwsICZnKTsKLQl9IGVsc2UgCi0JCWdsb2IodG1wLCBHTE9CX0RPT0ZGU3xHTE9CX01BUkssIE5VTEwsICZnKTsKLQkKLQkvKiBEZXRlcm1pbmUgbGVuZ3RoIG9mIHB3ZCBzbyB3ZSBjYW4gdHJpbSBjb21wbGV0aW9uIGRpc3BsYXkgKi8KLQlmb3IgKGhhZGdsb2IgPSB0bXBsZW4gPSBwd2RsZW4gPSAwOyB0bXBbdG1wbGVuXSAhPSAwOyB0bXBsZW4rKykgewotCQkvKiBUZXJtaW5hdGUgY291bnRpbmcgb24gZmlyc3QgdW5lc2NhcGVkIGdsb2IgbWV0YWNoYXJhY3RlciAqLwotCQlpZiAodG1wW3RtcGxlbl0gPT0gJyonIHx8IHRtcFt0bXBsZW5dID09ICc/JykgewotCQkJaWYgKHRtcFt0bXBsZW5dICE9ICcqJyB8fCB0bXBbdG1wbGVuICsgMV0gIT0gJ1wwJykKLQkJCQloYWRnbG9iID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICh0bXBbdG1wbGVuXSA9PSAnXFwnICYmIHRtcFt0bXBsZW4gKyAxXSAhPSAnXDAnKQotCQkJdG1wbGVuKys7Ci0JCWlmICh0bXBbdG1wbGVuXSA9PSAnLycpCi0JCQlwd2RsZW4gPSB0bXBsZW4gKyAxOwkvKiB0cmFjayBsYXN0IHNlZW4gJy8nICovCi0JfQotCXhmcmVlKHRtcCk7Ci0KLQlpZiAoZy5nbF9tYXRjaGMgPT0gMCkgCi0JCWdvdG8gb3V0OwotCi0JaWYgKGcuZ2xfbWF0Y2hjID4gMSkKLQkJY29tcGxldGVfZGlzcGxheShnLmdsX3BhdGh2LCBwd2RsZW4pOwotCi0JdG1wID0gTlVMTDsKLQkvKiBEb24ndCB0cnkgdG8gZXh0ZW5kIGdsb2JzICovCi0JaWYgKGZpbGUgPT0gTlVMTCB8fCBoYWRnbG9iKQotCQlnb3RvIG91dDsKLQotCXRtcDIgPSBjb21wbGV0ZV9hbWJpZ3VvdXMoZmlsZSwgZy5nbF9wYXRodiwgZy5nbF9tYXRjaGMpOwotCXRtcCA9IHBhdGhfc3RyaXAodG1wMiwgcmVtb3RlX3BhdGgpOwotCXhmcmVlKHRtcDIpOwotCi0JaWYgKHRtcCA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQotCXRtcGxlbiA9IHN0cmxlbih0bXApOwotCWZpbGVsZW4gPSBzdHJsZW4oZmlsZSk7Ci0KLQlpZiAodG1wbGVuID4gZmlsZWxlbikgIHsKLQkJdG1wMiA9IHRtcCArIGZpbGVsZW47Ci0JCWxlbiA9IHN0cmxlbih0bXAyKTsgCi0JCS8qIHF1b3RlIGFyZ3VtZW50IG9uIHdheSBvdXQgKi8KLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpbnNbMF0gPSAnXFwnOwotCQkJaW5zWzFdID0gdG1wMltpXTsKLQkJCWluc1syXSA9ICdcMCc7Ci0JCQlzd2l0Y2ggKHRtcDJbaV0pIHsKLQkJCWNhc2UgJ1wnJzoKLQkJCWNhc2UgJyInOgotCQkJY2FzZSAnXFwnOgotCQkJY2FzZSAnXHQnOgotCQkJY2FzZSAnWyc6Ci0JCQljYXNlICcgJzoKLQkJCQlpZiAocXVvdGUgPT0gJ1wwJyB8fCB0bXAyW2ldID09IHF1b3RlKSB7Ci0JCQkJCWlmIChlbF9pbnNlcnRzdHIoZWwsIGlucykgPT0gLTEpCi0JCQkJCQlmYXRhbCgiZWxfaW5zZXJ0c3RyICIKLQkJCQkJCSAgICAiZmFpbGVkLiIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKGVsX2luc2VydHN0cihlbCwgaW5zICsgMSkgPT0gLTEpCi0JCQkJCWZhdGFsKCJlbF9pbnNlcnRzdHIgZmFpbGVkLiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JbGYgPSBlbF9saW5lKGVsKTsKLQlpZiAoZy5nbF9tYXRjaGMgPT0gMSkgewotCQlpID0gMDsKLQkJaWYgKCF0ZXJtaW5hdGVkKQotCQkJaW5zW2krK10gPSBxdW90ZTsKLQkJaWYgKCoobGYtPmN1cnNvciAtIDEpICE9ICcvJyAmJgotCQkgICAgKGxhc3RhcmcgfHwgKihsZi0+Y3Vyc29yKSAhPSAnICcpKQotCQkJaW5zW2krK10gPSAnICc7Ci0JCWluc1tpXSA9ICdcMCc7Ci0JCWlmIChpID4gMCAmJiBlbF9pbnNlcnRzdHIoZWwsIGlucykgPT0gLTEpCi0JCQlmYXRhbCgiZWxfaW5zZXJ0c3RyIGZhaWxlZC4iKTsKLQl9Ci0JeGZyZWUodG1wKTsKLQotIG91dDoKLQlnbG9iZnJlZSgmZyk7Ci0JcmV0dXJuIGcuZ2xfbWF0Y2hjOwotfQotCi0vKiB0YWItY29tcGxldGlvbiBob29rIGZ1bmN0aW9uLCBjYWxsZWQgdmlhIGxpYmVkaXQgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyCi1jb21wbGV0ZShFZGl0TGluZSAqZWwsIGludCBjaCkKLXsKLQljaGFyICoqYXJndiwgKmxpbmUsIHF1b3RlOyAKLQl1X2ludCBhcmdjLCBjYXJnLCBjdXJzb3IsIGxlbiwgdGVybWluYXRlZCwgcmV0ID0gQ0NfRVJST1I7Ci0JY29uc3QgTGluZUluZm8gKmxmOwotCXN0cnVjdCBjb21wbGV0ZV9jdHggKmNvbXBsZXRlX2N0eDsKLQotCWxmID0gZWxfbGluZShlbCk7Ci0JaWYgKGVsX2dldChlbCwgRUxfQ0xJRU5UREFUQSwgKHZvaWQqKikmY29tcGxldGVfY3R4KSAhPSAwKQotCQlmYXRhbCgiJXM6IGVsX2dldCBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0KLQkvKiBGaWd1cmUgb3V0IHdoaWNoIGFyZ3VtZW50IHRoZSBjdXJzb3IgcG9pbnRzIHRvICovCi0JY3Vyc29yID0gbGYtPmN1cnNvciAtIGxmLT5idWZmZXI7Ci0JbGluZSA9IChjaGFyICopeG1hbGxvYyhjdXJzb3IgKyAxKTsKLQltZW1jcHkobGluZSwgbGYtPmJ1ZmZlciwgY3Vyc29yKTsKLQlsaW5lW2N1cnNvcl0gPSAnXDAnOwotCWFyZ3YgPSBtYWtlYXJndihsaW5lLCAmY2FyZywgMSwgJnF1b3RlLCAmdGVybWluYXRlZCk7Ci0JeGZyZWUobGluZSk7Ci0KLQkvKiBHZXQgYWxsIHRoZSBhcmd1bWVudHMgb24gdGhlIGxpbmUgKi8KLQlsZW4gPSBsZi0+bGFzdGNoYXIgLSBsZi0+YnVmZmVyOwotCWxpbmUgPSAoY2hhciAqKXhtYWxsb2MobGVuICsgMSk7Ci0JbWVtY3B5KGxpbmUsIGxmLT5idWZmZXIsIGxlbik7Ci0JbGluZVtsZW5dID0gJ1wwJzsKLQlhcmd2ID0gbWFrZWFyZ3YobGluZSwgJmFyZ2MsIDEsIE5VTEwsIE5VTEwpOwotCi0JLyogRW5zdXJlIGN1cnNvciBpcyBhdCBFT0wgb3IgYSBhcmd1bWVudCBib3VuZGFyeSAqLwotCWlmIChsaW5lW2N1cnNvcl0gIT0gJyAnICYmIGxpbmVbY3Vyc29yXSAhPSAnXDAnICYmCi0JICAgIGxpbmVbY3Vyc29yXSAhPSAnXG4nKSB7Ci0JCXhmcmVlKGxpbmUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChjYXJnID09IDApIHsKLQkJLyogU2hvdyBhbGwgYXZhaWxhYmxlIGNvbW1hbmRzICovCi0JCWNvbXBsZXRlX2NtZF9wYXJzZShlbCwgTlVMTCwgYXJnYyA9PSBjYXJnLCAnXDAnLCAxKTsKLQkJcmV0ID0gQ0NfUkVESVNQTEFZOwotCX0gZWxzZSBpZiAoY2FyZyA9PSAxICYmIGN1cnNvciA+IDAgJiYgbGluZVtjdXJzb3IgLSAxXSAhPSAnICcpICB7Ci0JCS8qIEhhbmRsZSB0aGUgY29tbWFuZCBwYXJzaW5nICovCi0JCWlmIChjb21wbGV0ZV9jbWRfcGFyc2UoZWwsIGFyZ3ZbMF0sIGFyZ2MgPT0gY2FyZywKLQkJICAgIHF1b3RlLCB0ZXJtaW5hdGVkKSAhPSAwKSAKLQkJCXJldCA9IENDX1JFRElTUExBWTsKLQl9IGVsc2UgaWYgKGNhcmcgPj0gMSkgewotCQkvKiBIYW5kbGUgZmlsZSBwYXJzaW5nICovCi0JCWludCByZW1vdGUgPSBjb21wbGV0ZV9pc19yZW1vdGUoYXJndlswXSk7Ci0JCWNoYXIgKmZpbGVtYXRjaCA9IE5VTEw7Ci0KLQkJaWYgKGNhcmcgPiAxICYmIGxpbmVbY3Vyc29yLTFdICE9ICcgJykKLQkJCWZpbGVtYXRjaCA9IGFyZ3ZbY2FyZyAtIDFdOwotCi0JCWlmIChyZW1vdGUgIT0gMCAmJgotCQkgICAgY29tcGxldGVfbWF0Y2goZWwsIGNvbXBsZXRlX2N0eC0+Y29ubiwKLQkJICAgICpjb21wbGV0ZV9jdHgtPnJlbW90ZV9wYXRocCwgZmlsZW1hdGNoLAotCQkgICAgcmVtb3RlLCBjYXJnID09IGFyZ2MsIHF1b3RlLCB0ZXJtaW5hdGVkKSAhPSAwKSAKLQkJCXJldCA9IENDX1JFRElTUExBWTsKLQl9Ci0KLQl4ZnJlZShsaW5lKTsJCi0JcmV0dXJuIHJldDsKLX0KLSNlbmRpZiAvKiBVU0VfTElCRURJVCAqLwotCi1pbnQKLWludGVyYWN0aXZlX2xvb3Aoc3RydWN0IHNmdHBfY29ubiAqY29ubiwgY2hhciAqZmlsZTEsIGNoYXIgKmZpbGUyKQotewotCWNoYXIgKnJlbW90ZV9wYXRoOwotCWNoYXIgKmRpciA9IE5VTEw7Ci0JY2hhciBjbWRbMjA0OF07Ci0JaW50IGVyciwgaW50ZXJhY3RpdmU7Ci0JRWRpdExpbmUgKmVsID0gTlVMTDsKLSNpZmRlZiBVU0VfTElCRURJVAotCUhpc3RvcnkgKmhsID0gTlVMTDsKLQlIaXN0RXZlbnQgaGV2OwotCWV4dGVybiBjaGFyICpfX3Byb2duYW1lOwotCXN0cnVjdCBjb21wbGV0ZV9jdHggY29tcGxldGVfY3R4OwotCi0JaWYgKCFiYXRjaG1vZGUgJiYgaXNhdHR5KFNURElOX0ZJTEVOTykpIHsKLQkJaWYgKChlbCA9IGVsX2luaXQoX19wcm9nbmFtZSwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCJDb3VsZG4ndCBpbml0aWFsaXNlIGVkaXRsaW5lIik7Ci0JCWlmICgoaGwgPSBoaXN0b3J5X2luaXQoKSkgPT0gTlVMTCkKLQkJCWZhdGFsKCJDb3VsZG4ndCBpbml0aWFsaXNlIGVkaXRsaW5lIGhpc3RvcnkiKTsKLQkJaGlzdG9yeShobCwgJmhldiwgSF9TRVRTSVpFLCAxMDApOwotCQllbF9zZXQoZWwsIEVMX0hJU1QsIGhpc3RvcnksIGhsKTsKLQotCQllbF9zZXQoZWwsIEVMX1BST01QVCwgcHJvbXB0KTsKLQkJZWxfc2V0KGVsLCBFTF9FRElUT1IsICJlbWFjcyIpOwotCQllbF9zZXQoZWwsIEVMX1RFUk1JTkFMLCBOVUxMKTsKLQkJZWxfc2V0KGVsLCBFTF9TSUdOQUwsIDEpOwotCQllbF9zb3VyY2UoZWwsIE5VTEwpOwotCi0JCS8qIFRhYiBDb21wbGV0aW9uICovCi0JCWVsX3NldChlbCwgRUxfQURERk4sICJmdHAtY29tcGxldGUiLCAKLQkJICAgICJDb250ZXh0IHNlbnNpdGl2ZSBhcmd1bWVudCBjb21wbGV0aW9uIiwgY29tcGxldGUpOwotCQljb21wbGV0ZV9jdHguY29ubiA9IGNvbm47Ci0JCWNvbXBsZXRlX2N0eC5yZW1vdGVfcGF0aHAgPSAmcmVtb3RlX3BhdGg7Ci0JCWVsX3NldChlbCwgRUxfQ0xJRU5UREFUQSwgKHZvaWQqKSZjb21wbGV0ZV9jdHgpOwotCQllbF9zZXQoZWwsIEVMX0JJTkQsICJeSSIsICJmdHAtY29tcGxldGUiLCBOVUxMKTsKLQl9Ci0jZW5kaWYgLyogVVNFX0xJQkVESVQgKi8KLQotCXJlbW90ZV9wYXRoID0gZG9fcmVhbHBhdGgoY29ubiwgIi4iKTsKLQlpZiAocmVtb3RlX3BhdGggPT0gTlVMTCkKLQkJZmF0YWwoIk5lZWQgY3dkIik7Ci0KLQlpZiAoZmlsZTEgIT0gTlVMTCkgewotCQlkaXIgPSB4c3RyZHVwKGZpbGUxKTsKLQkJZGlyID0gbWFrZV9hYnNvbHV0ZShkaXIsIHJlbW90ZV9wYXRoKTsKLQotCQlpZiAocmVtb3RlX2lzX2Rpcihjb25uLCBkaXIpICYmIGZpbGUyID09IE5VTEwpIHsKLQkJCXByaW50ZigiQ2hhbmdpbmcgdG86ICVzXG4iLCBkaXIpOwotCQkJc25wcmludGYoY21kLCBzaXplb2YgY21kLCAiY2QgXCIlc1wiIiwgZGlyKTsKLQkJCWlmIChwYXJzZV9kaXNwYXRjaF9jb21tYW5kKGNvbm4sIGNtZCwKLQkJCSAgICAmcmVtb3RlX3BhdGgsIDEpICE9IDApIHsKLQkJCQl4ZnJlZShkaXIpOwotCQkJCXhmcmVlKHJlbW90ZV9wYXRoKTsKLQkJCQl4ZnJlZShjb25uKTsKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChmaWxlMiA9PSBOVUxMKQotCQkJCXNucHJpbnRmKGNtZCwgc2l6ZW9mIGNtZCwgImdldCAlcyIsIGRpcik7Ci0JCQllbHNlCi0JCQkJc25wcmludGYoY21kLCBzaXplb2YgY21kLCAiZ2V0ICVzICVzIiwgZGlyLAotCQkJCSAgICBmaWxlMik7Ci0KLQkJCWVyciA9IHBhcnNlX2Rpc3BhdGNoX2NvbW1hbmQoY29ubiwgY21kLAotCQkJICAgICZyZW1vdGVfcGF0aCwgMSk7Ci0JCQl4ZnJlZShkaXIpOwotCQkJeGZyZWUocmVtb3RlX3BhdGgpOwotCQkJeGZyZWUoY29ubik7Ci0JCQlyZXR1cm4gKGVycik7Ci0JCX0KLQkJeGZyZWUoZGlyKTsKLQl9Ci0KLSNpZiBkZWZpbmVkKEhBVkVfU0VUVkJVRikgJiYgIWRlZmluZWQoQlJPS0VOX1NFVFZCVUYpCi0Jc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT0xCRiwgMCk7Ci0Jc2V0dmJ1ZihpbmZpbGUsIE5VTEwsIF9JT0xCRiwgMCk7Ci0jZWxzZQotCXNldGxpbmVidWYoc3Rkb3V0KTsKLQlzZXRsaW5lYnVmKGluZmlsZSk7Ci0jZW5kaWYKLQotCWludGVyYWN0aXZlID0gIWJhdGNobW9kZSAmJiBpc2F0dHkoU1RESU5fRklMRU5PKTsKLQllcnIgPSAwOwotCWZvciAoOzspIHsKLQkJY2hhciAqY3A7Ci0KLQkJc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7Ci0KLQkJaWYgKGVsID09IE5VTEwpIHsKLQkJCWlmIChpbnRlcmFjdGl2ZSkKLQkJCQlwcmludGYoInNmdHA+ICIpOwotCQkJaWYgKGZnZXRzKGNtZCwgc2l6ZW9mKGNtZCksIGluZmlsZSkgPT0gTlVMTCkgewotCQkJCWlmIChpbnRlcmFjdGl2ZSkKLQkJCQkJcHJpbnRmKCJcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKCFpbnRlcmFjdGl2ZSkgeyAvKiBFY2hvIGNvbW1hbmQgKi8KLQkJCQlwcmludGYoInNmdHA+ICVzIiwgY21kKTsKLQkJCQlpZiAoc3RybGVuKGNtZCkgPiAwICYmCi0JCQkJICAgIGNtZFtzdHJsZW4oY21kKSAtIDFdICE9ICdcbicpCi0JCQkJCXByaW50ZigiXG4iKTsKLQkJCX0KLQkJfSBlbHNlIHsKLSNpZmRlZiBVU0VfTElCRURJVAotCQkJY29uc3QgY2hhciAqbGluZTsKLQkJCWludCBjb3VudCA9IDA7Ci0KLQkJCWlmICgobGluZSA9IGVsX2dldHMoZWwsICZjb3VudCkpID09IE5VTEwgfHwKLQkJCSAgICBjb3VudCA8PSAwKSB7Ci0JCQkJcHJpbnRmKCJcbiIpOwotIAkJCQlicmVhazsKLQkJCX0KLQkJCWhpc3RvcnkoaGwsICZoZXYsIEhfRU5URVIsIGxpbmUpOwotCQkJaWYgKHN0cmxjcHkoY21kLCBsaW5lLCBzaXplb2YoY21kKSkgPj0gc2l6ZW9mKGNtZCkpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBpbnB1dCBsaW5lIHRvbyBsb25nXG4iKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLSNlbmRpZiAvKiBVU0VfTElCRURJVCAqLwotCQl9Ci0KLQkJY3AgPSBzdHJyY2hyKGNtZCwgJ1xuJyk7Ci0JCWlmIChjcCkKLQkJCSpjcCA9ICdcMCc7Ci0KLQkJLyogSGFuZGxlIHVzZXIgaW50ZXJydXB0cyBncmFjZWZ1bGx5IGR1cmluZyBjb21tYW5kcyAqLwotCQlpbnRlcnJ1cHRlZCA9IDA7Ci0JCXNpZ25hbChTSUdJTlQsIGNtZF9pbnRlcnJ1cHQpOwotCi0JCWVyciA9IHBhcnNlX2Rpc3BhdGNoX2NvbW1hbmQoY29ubiwgY21kLCAmcmVtb3RlX3BhdGgsCi0JCSAgICBiYXRjaG1vZGUpOwotCQlpZiAoZXJyICE9IDApCi0JCQlicmVhazsKLQl9Ci0JeGZyZWUocmVtb3RlX3BhdGgpOwotCXhmcmVlKGNvbm4pOwotCi0jaWZkZWYgVVNFX0xJQkVESVQKLQlpZiAoZWwgIT0gTlVMTCkKLQkJZWxfZW5kKGVsKTsKLSNlbmRpZiAvKiBVU0VfTElCRURJVCAqLwotCi0JLyogZXJyID09IDEgc2lnbmlmaWVzIG5vcm1hbCAicXVpdCIgZXhpdCAqLwotCXJldHVybiAoZXJyID49IDAgPyAwIDogLTEpOwotfQotCi1zdGF0aWMgdm9pZAotY29ubmVjdF90b19zZXJ2ZXIoY2hhciAqcGF0aCwgY2hhciAqKmFyZ3MsIGludCAqaW4sIGludCAqb3V0KQotewotCWludCBjX2luLCBjX291dDsKLQotI2lmZGVmIFVTRV9QSVBFUwotCWludCBwaW5bMl0sIHBvdXRbMl07Ci0KLQlpZiAoKHBpcGUocGluKSA9PSAtMSkgfHwgKHBpcGUocG91dCkgPT0gLTEpKQotCQlmYXRhbCgicGlwZTogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCSppbiA9IHBpblswXTsKLQkqb3V0ID0gcG91dFsxXTsKLQljX2luID0gcG91dFswXTsKLQljX291dCA9IHBpblsxXTsKLSNlbHNlIC8qIFVTRV9QSVBFUyAqLwotCWludCBpbm91dFsyXTsKLQotCWlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBpbm91dCkgPT0gLTEpCi0JCWZhdGFsKCJzb2NrZXRwYWlyOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JKmluID0gKm91dCA9IGlub3V0WzBdOwotCWNfaW4gPSBjX291dCA9IGlub3V0WzFdOwotI2VuZGlmIC8qIFVTRV9QSVBFUyAqLwotCi0JaWYgKChzc2hwaWQgPSBmb3JrKCkpID09IC0xKQotCQlmYXRhbCgiZm9yazogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCWVsc2UgaWYgKHNzaHBpZCA9PSAwKSB7Ci0JCWlmICgoZHVwMihjX2luLCBTVERJTl9GSUxFTk8pID09IC0xKSB8fAotCQkgICAgKGR1cDIoY19vdXQsIFNURE9VVF9GSUxFTk8pID09IC0xKSkgewotCQkJZnByaW50ZihzdGRlcnIsICJkdXAyOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCV9leGl0KDEpOwotCQl9Ci0JCWNsb3NlKCppbik7Ci0JCWNsb3NlKCpvdXQpOwotCQljbG9zZShjX2luKTsKLQkJY2xvc2UoY19vdXQpOwotCi0JCS8qCi0JCSAqIFRoZSB1bmRlcmx5aW5nIHNzaCBpcyBpbiB0aGUgc2FtZSBwcm9jZXNzIGdyb3VwLCBzbyB3ZSBtdXN0Ci0JCSAqIGlnbm9yZSBTSUdJTlQgaWYgd2Ugd2FudCB0byBncmFjZWZ1bGx5IGFib3J0IGNvbW1hbmRzLAotCQkgKiBvdGhlcndpc2UgdGhlIHNpZ25hbCB3aWxsIG1ha2UgaXQgdG8gdGhlIHNzaCBwcm9jZXNzIGFuZAotCQkgKiBraWxsIGl0IHRvby4gIENvbnRyYXdpc2UsIHNpbmNlIHNmdHAgc2VuZHMgU0lHVEVSTXMgdG8gdGhlCi0JCSAqIHVuZGVybHlpbmcgc3NoLCBpdCBtdXN0ICpub3QqIGlnbm9yZSB0aGF0IHNpZ25hbC4KLQkJICovCi0JCXNpZ25hbChTSUdJTlQsIFNJR19JR04pOwotCQlzaWduYWwoU0lHVEVSTSwgU0lHX0RGTCk7Ci0JCWV4ZWN2cChwYXRoLCBhcmdzKTsKLQkJZnByaW50ZihzdGRlcnIsICJleGVjOiAlczogJXNcbiIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0JCV9leGl0KDEpOwotCX0KLQotCXNpZ25hbChTSUdURVJNLCBraWxsY2hpbGQpOwotCXNpZ25hbChTSUdJTlQsIGtpbGxjaGlsZCk7Ci0Jc2lnbmFsKFNJR0hVUCwga2lsbGNoaWxkKTsKLQljbG9zZShjX2luKTsKLQljbG9zZShjX291dCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSh2b2lkKQotewotCWV4dGVybiBjaGFyICpfX3Byb2duYW1lOwotCi0JZnByaW50ZihzdGRlcnIsCi0JICAgICJ1c2FnZTogJXMgWy0xMjQ2Q3BxcnZdIFstQiBidWZmZXJfc2l6ZV0gWy1iIGJhdGNoZmlsZV0gWy1jIGNpcGhlcl1cbiIKLQkgICAgIiAgICAgICAgICBbLUQgc2Z0cF9zZXJ2ZXJfcGF0aF0gWy1GIHNzaF9jb25maWddICIKLQkgICAgIlstaSBpZGVudGl0eV9maWxlXSBbLWwgbGltaXRdXG4iCi0JICAgICIgICAgICAgICAgWy1vIHNzaF9vcHRpb25dIFstUCBwb3J0XSBbLVIgbnVtX3JlcXVlc3RzXSAiCi0JICAgICJbLVMgcHJvZ3JhbV1cbiIKLQkgICAgIiAgICAgICAgICBbLXMgc3Vic3lzdGVtIHwgc2Z0cF9zZXJ2ZXJdIGhvc3RcbiIKLQkgICAgIiAgICAgICAlcyBbdXNlckBdaG9zdFs6ZmlsZSAuLi5dXG4iCi0JICAgICIgICAgICAgJXMgW3VzZXJAXWhvc3RbOmRpclsvXV1cbiIKLQkgICAgIiAgICAgICAlcyAtYiBiYXRjaGZpbGUgW3VzZXJAXWhvc3RcbiIsCi0JICAgIF9fcHJvZ25hbWUsIF9fcHJvZ25hbWUsIF9fcHJvZ25hbWUsIF9fcHJvZ25hbWUpOwotCWV4aXQoMSk7Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0JaW50IGluLCBvdXQsIGNoLCBlcnI7Ci0JY2hhciAqaG9zdCA9IE5VTEwsICp1c2VyaG9zdCwgKmNwLCAqZmlsZTIgPSBOVUxMOwotCWludCBkZWJ1Z19sZXZlbCA9IDAsIHNzaHZlciA9IDI7Ci0JY2hhciAqZmlsZTEgPSBOVUxMLCAqc2Z0cF9zZXJ2ZXIgPSBOVUxMOwotCWNoYXIgKnNzaF9wcm9ncmFtID0gX1BBVEhfU1NIX1BST0dSQU0sICpzZnRwX2RpcmVjdCA9IE5VTEw7Ci0JY29uc3QgY2hhciAqZXJyc3RyOwotCUxvZ0xldmVsIGxsID0gU1lTTE9HX0xFVkVMX0lORk87Ci0JYXJnbGlzdCBhcmdzOwotCWV4dGVybiBpbnQgb3B0aW5kOwotCWV4dGVybiBjaGFyICpvcHRhcmc7Ci0Jc3RydWN0IHNmdHBfY29ubiAqY29ubjsKLQlzaXplX3QgY29weV9idWZmZXJfbGVuID0gREVGQVVMVF9DT1BZX0JVRkxFTjsKLQlzaXplX3QgbnVtX3JlcXVlc3RzID0gREVGQVVMVF9OVU1fUkVRVUVTVFM7Ci0JbG9uZyBsb25nIGxpbWl0X2ticHMgPSAwOwotCi0JLyogRW5zdXJlIHRoYXQgZmRzIDAsIDEgYW5kIDIgYXJlIG9wZW4gb3IgZGlyZWN0ZWQgdG8gL2Rldi9udWxsICovCi0Jc2FuaXRpc2Vfc3RkZmQoKTsKLQotCV9fcHJvZ25hbWUgPSBzc2hfZ2V0X3Byb2duYW1lKGFyZ3ZbMF0pOwotCW1lbXNldCgmYXJncywgJ1wwJywgc2l6ZW9mKGFyZ3MpKTsKLQlhcmdzLmxpc3QgPSBOVUxMOwotCWFkZGFyZ3MoJmFyZ3MsICIlcyIsIHNzaF9wcm9ncmFtKTsKLQlhZGRhcmdzKCZhcmdzLCAiLW9Gb3J3YXJkWDExIG5vIik7Ci0JYWRkYXJncygmYXJncywgIi1vRm9yd2FyZEFnZW50IG5vIik7Ci0JYWRkYXJncygmYXJncywgIi1vUGVybWl0TG9jYWxDb21tYW5kIG5vIik7Ci0JYWRkYXJncygmYXJncywgIi1vQ2xlYXJBbGxGb3J3YXJkaW5ncyB5ZXMiKTsKLQotCWxsID0gU1lTTE9HX0xFVkVMX0lORk87Ci0JaW5maWxlID0gc3RkaW47Ci0KLQl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsCi0JICAgICIxMjQ2aHBxcnZDYzpEOmk6bDpvOnM6UzpiOkI6RjpQOlI6IikpICE9IC0xKSB7Ci0JCXN3aXRjaCAoY2gpIHsKLQkJLyogUGFzc2VkIHRocm91Z2ggdG8gc3NoKDEpICovCi0JCWNhc2UgJzQnOgotCQljYXNlICc2JzoKLQkJY2FzZSAnQyc6Ci0JCQlhZGRhcmdzKCZhcmdzLCAiLSVjIiwgY2gpOwotCQkJYnJlYWs7Ci0JCS8qIFBhc3NlZCB0aHJvdWdoIHRvIHNzaCgxKSB3aXRoIGFyZ3VtZW50ICovCi0JCWNhc2UgJ0YnOgotCQljYXNlICdjJzoKLQkJY2FzZSAnaSc6Ci0JCWNhc2UgJ28nOgotCQkJYWRkYXJncygmYXJncywgIi0lYyIsIGNoKTsKLQkJCWFkZGFyZ3MoJmFyZ3MsICIlcyIsIG9wdGFyZyk7Ci0JCQlicmVhazsKLQkJY2FzZSAncSc6Ci0JCQlzaG93cHJvZ3Jlc3MgPSAwOwotCQkJYWRkYXJncygmYXJncywgIi0lYyIsIGNoKTsKLQkJCWJyZWFrOwotCQljYXNlICdQJzoKLQkJCWFkZGFyZ3MoJmFyZ3MsICItb1BvcnQgJXMiLCBvcHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3YnOgotCQkJaWYgKGRlYnVnX2xldmVsIDwgMykgewotCQkJCWFkZGFyZ3MoJmFyZ3MsICItdiIpOwotCQkJCWxsID0gU1lTTE9HX0xFVkVMX0RFQlVHMSArIGRlYnVnX2xldmVsOwotCQkJfQotCQkJZGVidWdfbGV2ZWwrKzsKLQkJCWJyZWFrOwotCQljYXNlICcxJzoKLQkJCXNzaHZlciA9IDE7Ci0JCQlpZiAoc2Z0cF9zZXJ2ZXIgPT0gTlVMTCkKLQkJCQlzZnRwX3NlcnZlciA9IF9QQVRIX1NGVFBfU0VSVkVSOwotCQkJYnJlYWs7Ci0JCWNhc2UgJzInOgotCQkJc3NodmVyID0gMjsKLQkJCWJyZWFrOwotCQljYXNlICdCJzoKLQkJCWNvcHlfYnVmZmVyX2xlbiA9IHN0cnRvbChvcHRhcmcsICZjcCwgMTApOwotCQkJaWYgKGNvcHlfYnVmZmVyX2xlbiA9PSAwIHx8ICpjcCAhPSAnXDAnKQotCQkJCWZhdGFsKCJJbnZhbGlkIGJ1ZmZlciBzaXplIFwiJXNcIiIsIG9wdGFyZyk7Ci0JCQlicmVhazsKLQkJY2FzZSAnYic6Ci0JCQlpZiAoYmF0Y2htb2RlKQotCQkJCWZhdGFsKCJCYXRjaCBmaWxlIGFscmVhZHkgc3BlY2lmaWVkLiIpOwotCi0JCQkvKiBBbGxvdyAiLSIgYXMgc3RkaW4gKi8KLQkJCWlmIChzdHJjbXAob3B0YXJnLCAiLSIpICE9IDAgJiYKLQkJCSAgICAoaW5maWxlID0gZm9wZW4ob3B0YXJnLCAiciIpKSA9PSBOVUxMKQotCQkJCWZhdGFsKCIlcyAoJXMpLiIsIHN0cmVycm9yKGVycm5vKSwgb3B0YXJnKTsKLQkJCXNob3dwcm9ncmVzcyA9IDA7Ci0JCQliYXRjaG1vZGUgPSAxOwotCQkJYWRkYXJncygmYXJncywgIi1vYmF0Y2htb2RlIHllcyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3AnOgotCQkJZ2xvYmFsX3BmbGFnID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdEJzoKLQkJCXNmdHBfZGlyZWN0ID0gb3B0YXJnOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2wnOgotCQkJbGltaXRfa2JwcyA9IHN0cnRvbnVtKG9wdGFyZywgMSwgMTAwICogMTAyNCAqIDEwMjQsCi0JCQkgICAgJmVycnN0cik7Ci0JCQlpZiAoZXJyc3RyICE9IE5VTEwpCi0JCQkJdXNhZ2UoKTsKLQkJCWxpbWl0X2ticHMgKj0gMTAyNDsgLyoga2JwcyAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3InOgotCQkJZ2xvYmFsX3JmbGFnID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdSJzoKLQkJCW51bV9yZXF1ZXN0cyA9IHN0cnRvbChvcHRhcmcsICZjcCwgMTApOwotCQkJaWYgKG51bV9yZXF1ZXN0cyA9PSAwIHx8ICpjcCAhPSAnXDAnKQotCQkJCWZhdGFsKCJJbnZhbGlkIG51bWJlciBvZiByZXF1ZXN0cyBcIiVzXCIiLAotCQkJCSAgICBvcHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3MnOgotCQkJc2Z0cF9zZXJ2ZXIgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAnUyc6Ci0JCQlzc2hfcHJvZ3JhbSA9IG9wdGFyZzsKLQkJCXJlcGxhY2VhcmcoJmFyZ3MsIDAsICIlcyIsIHNzaF9wcm9ncmFtKTsKLQkJCWJyZWFrOwotCQljYXNlICdoJzoKLQkJZGVmYXVsdDoKLQkJCXVzYWdlKCk7Ci0JCX0KLQl9Ci0KLQlpZiAoIWlzYXR0eShTVERFUlJfRklMRU5PKSkKLQkJc2hvd3Byb2dyZXNzID0gMDsKLQotCWxvZ19pbml0KGFyZ3ZbMF0sIGxsLCBTWVNMT0dfRkFDSUxJVFlfVVNFUiwgMSk7Ci0KLQlpZiAoc2Z0cF9kaXJlY3QgPT0gTlVMTCkgewotCQlpZiAob3B0aW5kID09IGFyZ2MgfHwgYXJnYyA+IChvcHRpbmQgKyAyKSkKLQkJCXVzYWdlKCk7Ci0KLQkJdXNlcmhvc3QgPSB4c3RyZHVwKGFyZ3Zbb3B0aW5kXSk7Ci0JCWZpbGUyID0gYXJndltvcHRpbmQrMV07Ci0KLQkJaWYgKChob3N0ID0gc3RycmNocih1c2VyaG9zdCwgJ0AnKSkgPT0gTlVMTCkKLQkJCWhvc3QgPSB1c2VyaG9zdDsKLQkJZWxzZSB7Ci0JCQkqaG9zdCsrID0gJ1wwJzsKLQkJCWlmICghdXNlcmhvc3RbMF0pIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgdXNlcm5hbWVcbiIpOwotCQkJCXVzYWdlKCk7Ci0JCQl9Ci0JCQlhZGRhcmdzKCZhcmdzLCAiLWwiKTsKLQkJCWFkZGFyZ3MoJmFyZ3MsICIlcyIsIHVzZXJob3N0KTsKLQkJfQotCi0JCWlmICgoY3AgPSBjb2xvbihob3N0KSkgIT0gTlVMTCkgewotCQkJKmNwKysgPSAnXDAnOwotCQkJZmlsZTEgPSBjcDsKLQkJfQotCi0JCWhvc3QgPSBjbGVhbmhvc3RuYW1lKGhvc3QpOwotCQlpZiAoISpob3N0KSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgaG9zdG5hbWVcbiIpOwotCQkJdXNhZ2UoKTsKLQkJfQotCi0JCWFkZGFyZ3MoJmFyZ3MsICItb1Byb3RvY29sICVkIiwgc3NodmVyKTsKLQotCQkvKiBubyBzdWJzeXN0ZW0gaWYgdGhlIHNlcnZlci1zcGVjIGNvbnRhaW5zIGEgJy8nICovCi0JCWlmIChzZnRwX3NlcnZlciA9PSBOVUxMIHx8IHN0cmNocihzZnRwX3NlcnZlciwgJy8nKSA9PSBOVUxMKQotCQkJYWRkYXJncygmYXJncywgIi1zIik7Ci0KLQkJYWRkYXJncygmYXJncywgIi0tIik7Ci0JCWFkZGFyZ3MoJmFyZ3MsICIlcyIsIGhvc3QpOwotCQlhZGRhcmdzKCZhcmdzLCAiJXMiLCAoc2Z0cF9zZXJ2ZXIgIT0gTlVMTCA/Ci0JCSAgICBzZnRwX3NlcnZlciA6ICJzZnRwIikpOwotCi0JCWNvbm5lY3RfdG9fc2VydmVyKHNzaF9wcm9ncmFtLCBhcmdzLmxpc3QsICZpbiwgJm91dCk7Ci0JfSBlbHNlIHsKLQkJYXJncy5saXN0ID0gTlVMTDsKLQkJYWRkYXJncygmYXJncywgInNmdHAtc2VydmVyIik7Ci0KLQkJY29ubmVjdF90b19zZXJ2ZXIoc2Z0cF9kaXJlY3QsIGFyZ3MubGlzdCwgJmluLCAmb3V0KTsKLQl9Ci0JZnJlZWFyZ3MoJmFyZ3MpOwotCi0JY29ubiA9IGRvX2luaXQoaW4sIG91dCwgY29weV9idWZmZXJfbGVuLCBudW1fcmVxdWVzdHMsIGxpbWl0X2ticHMpOwotCWlmIChjb25uID09IE5VTEwpCi0JCWZhdGFsKCJDb3VsZG4ndCBpbml0aWFsaXNlIGNvbm5lY3Rpb24gdG8gc2VydmVyIik7Ci0KLQlpZiAoIWJhdGNobW9kZSkgewotCQlpZiAoc2Z0cF9kaXJlY3QgPT0gTlVMTCkKLQkJCWZwcmludGYoc3RkZXJyLCAiQ29ubmVjdGVkIHRvICVzLlxuIiwgaG9zdCk7Ci0JCWVsc2UKLQkJCWZwcmludGYoc3RkZXJyLCAiQXR0YWNoZWQgdG8gJXMuXG4iLCBzZnRwX2RpcmVjdCk7Ci0JfQotCi0JZXJyID0gaW50ZXJhY3RpdmVfbG9vcChjb25uLCBmaWxlMSwgZmlsZTIpOwotCi0jaWYgIWRlZmluZWQoVVNFX1BJUEVTKQotCXNodXRkb3duKGluLCBTSFVUX1JEV1IpOwotCXNodXRkb3duKG91dCwgU0hVVF9SRFdSKTsKLSNlbmRpZgotCi0JY2xvc2UoaW4pOwotCWNsb3NlKG91dCk7Ci0JaWYgKGJhdGNobW9kZSkKLQkJZmNsb3NlKGluZmlsZSk7Ci0KLQl3aGlsZSAod2FpdHBpZChzc2hwaWQsIE5VTEwsIDApID09IC0xKQotCQlpZiAoZXJybm8gIT0gRUlOVFIpCi0JCQlmYXRhbCgiQ291bGRuJ3Qgd2FpdCBmb3Igc3NoIHByb2Nlc3M6ICVzIiwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCi0JZXhpdChlcnIgPT0gMCA/IDAgOiAxKTsKLX0KZGlmZiAtLWdpdCBhL3NmdHAuaCBiL3NmdHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkZThiYi4uMDAwMDAwMAotLS0gYS9zZnRwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNmdHAuaCx2IDEuOSAyMDA4LzA2LzEzIDAwOjEyOjAyIGR0dWNrZXIgRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotLyoKLSAqIGRyYWZ0LWlldGYtc2Vjc2gtZmlsZXhmZXItMDEudHh0Ci0gKi8KLQotLyogdmVyc2lvbiAqLwotI2RlZmluZQlTU0gyX0ZJTEVYRkVSX1ZFUlNJT04JCTMKLQotLyogY2xpZW50IHRvIHNlcnZlciAqLwotI2RlZmluZSBTU0gyX0ZYUF9JTklUCQkJMQotI2RlZmluZSBTU0gyX0ZYUF9PUEVOCQkJMwotI2RlZmluZSBTU0gyX0ZYUF9DTE9TRQkJCTQKLSNkZWZpbmUgU1NIMl9GWFBfUkVBRAkJCTUKLSNkZWZpbmUgU1NIMl9GWFBfV1JJVEUJCQk2Ci0jZGVmaW5lIFNTSDJfRlhQX0xTVEFUCQkJNwotI2RlZmluZSBTU0gyX0ZYUF9TVEFUX1ZFUlNJT05fMAkJNwotI2RlZmluZSBTU0gyX0ZYUF9GU1RBVAkJCTgKLSNkZWZpbmUgU1NIMl9GWFBfU0VUU1RBVAkJOQotI2RlZmluZSBTU0gyX0ZYUF9GU0VUU1RBVAkJMTAKLSNkZWZpbmUgU1NIMl9GWFBfT1BFTkRJUgkJMTEKLSNkZWZpbmUgU1NIMl9GWFBfUkVBRERJUgkJMTIKLSNkZWZpbmUgU1NIMl9GWFBfUkVNT1ZFCQkJMTMKLSNkZWZpbmUgU1NIMl9GWFBfTUtESVIJCQkxNAotI2RlZmluZSBTU0gyX0ZYUF9STURJUgkJCTE1Ci0jZGVmaW5lIFNTSDJfRlhQX1JFQUxQQVRICQkxNgotI2RlZmluZSBTU0gyX0ZYUF9TVEFUCQkJMTcKLSNkZWZpbmUgU1NIMl9GWFBfUkVOQU1FCQkJMTgKLSNkZWZpbmUgU1NIMl9GWFBfUkVBRExJTksJCTE5Ci0jZGVmaW5lIFNTSDJfRlhQX1NZTUxJTksJCTIwCi0KLS8qIHNlcnZlciB0byBjbGllbnQgKi8KLSNkZWZpbmUgU1NIMl9GWFBfVkVSU0lPTgkJMgotI2RlZmluZSBTU0gyX0ZYUF9TVEFUVVMJCQkxMDEKLSNkZWZpbmUgU1NIMl9GWFBfSEFORExFCQkJMTAyCi0jZGVmaW5lIFNTSDJfRlhQX0RBVEEJCQkxMDMKLSNkZWZpbmUgU1NIMl9GWFBfTkFNRQkJCTEwNAotI2RlZmluZSBTU0gyX0ZYUF9BVFRSUwkJCTEwNQotCi0jZGVmaW5lIFNTSDJfRlhQX0VYVEVOREVECQkyMDAKLSNkZWZpbmUgU1NIMl9GWFBfRVhURU5ERURfUkVQTFkJCTIwMQotCi0vKiBhdHRyaWJ1dGVzICovCi0jZGVmaW5lIFNTSDJfRklMRVhGRVJfQVRUUl9TSVpFCQkweDAwMDAwMDAxCi0jZGVmaW5lIFNTSDJfRklMRVhGRVJfQVRUUl9VSURHSUQJMHgwMDAwMDAwMgotI2RlZmluZSBTU0gyX0ZJTEVYRkVSX0FUVFJfUEVSTUlTU0lPTlMJMHgwMDAwMDAwNAotI2RlZmluZSBTU0gyX0ZJTEVYRkVSX0FUVFJfQUNNT0RUSU1FCTB4MDAwMDAwMDgKLSNkZWZpbmUgU1NIMl9GSUxFWEZFUl9BVFRSX0VYVEVOREVECTB4ODAwMDAwMDAKLQotLyogcG9ydGFibGUgb3BlbiBtb2RlcyAqLwotI2RlZmluZSBTU0gyX0ZYRl9SRUFECQkJMHgwMDAwMDAwMQotI2RlZmluZSBTU0gyX0ZYRl9XUklURQkJCTB4MDAwMDAwMDIKLSNkZWZpbmUgU1NIMl9GWEZfQVBQRU5ECQkJMHgwMDAwMDAwNAotI2RlZmluZSBTU0gyX0ZYRl9DUkVBVAkJCTB4MDAwMDAwMDgKLSNkZWZpbmUgU1NIMl9GWEZfVFJVTkMJCQkweDAwMDAwMDEwCi0jZGVmaW5lIFNTSDJfRlhGX0VYQ0wJCQkweDAwMDAwMDIwCi0KLS8qIHN0YXR2ZnNAb3BlbnNzaC5jb20gZl9mbGFnIGZsYWdzICovCi0jZGVmaW5lIFNTSDJfRlhFX1NUQVRWRlNfU1RfUkRPTkxZCTB4MDAwMDAwMDEKLSNkZWZpbmUgU1NIMl9GWEVfU1RBVFZGU19TVF9OT1NVSUQJMHgwMDAwMDAwMgotCi0vKiBzdGF0dXMgbWVzc2FnZXMgKi8KLSNkZWZpbmUgU1NIMl9GWF9PSwkJCTAKLSNkZWZpbmUgU1NIMl9GWF9FT0YJCQkxCi0jZGVmaW5lIFNTSDJfRlhfTk9fU1VDSF9GSUxFCQkyCi0jZGVmaW5lIFNTSDJfRlhfUEVSTUlTU0lPTl9ERU5JRUQJMwotI2RlZmluZSBTU0gyX0ZYX0ZBSUxVUkUJCQk0Ci0jZGVmaW5lIFNTSDJfRlhfQkFEX01FU1NBR0UJCTUKLSNkZWZpbmUgU1NIMl9GWF9OT19DT05ORUNUSU9OCQk2Ci0jZGVmaW5lIFNTSDJfRlhfQ09OTkVDVElPTl9MT1NUCQk3Ci0jZGVmaW5lIFNTSDJfRlhfT1BfVU5TVVBQT1JURUQJCTgKLSNkZWZpbmUgU1NIMl9GWF9NQVgJCQk4Ci0KLXN0cnVjdCBwYXNzd2Q7Ci0KLWludAlzZnRwX3NlcnZlcl9tYWluKGludCwgY2hhciAqKiwgc3RydWN0IHBhc3N3ZCAqKTsKLXZvaWQJc2Z0cF9zZXJ2ZXJfY2xlYW51cF9leGl0KGludCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKZGlmZiAtLWdpdCBhL3NzaC1hZGQuMCBiL3NzaC1hZGQuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlMmE2NC4uMDAwMDAwMAotLS0gYS9zc2gtYWRkLjAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotU1NILUFERCgxKSAgICAgICAgICAgICAgICAgT3BlbkJTRCBSZWZlcmVuY2UgTWFudWFsICAgICAgICAgICAgICAgICBTU0gtQUREKDEpCi0KLU5BTUUKLSAgICAgc3NoLWFkZCAtIGFkZHMgcHJpdmF0ZSBrZXkgaWRlbnRpdGllcyB0byB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQKLQotU1lOT1BTSVMKLSAgICAgc3NoLWFkZCBbLWNEZExsWHhdIFstdCBsaWZlXSBbZmlsZSAuLi5dCi0gICAgIHNzaC1hZGQgLXMgcGtjczExCi0gICAgIHNzaC1hZGQgLWUgcGtjczExCi0KLURFU0NSSVBUSU9OCi0gICAgIHNzaC1hZGQgYWRkcyBwcml2YXRlIGtleSBpZGVudGl0aWVzIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudCwKLSAgICAgc3NoLWFnZW50KDEpLiAgV2hlbiBydW4gd2l0aG91dCBhcmd1bWVudHMsIGl0IGFkZHMgdGhlIGZpbGVzCi0gICAgIH4vLnNzaC9pZF9yc2EsIH4vLnNzaC9pZF9kc2EsIH4vLnNzaC9pZF9lY2RzYSBhbmQgfi8uc3NoL2lkZW50aXR5LiAgQWZ0ZXIKLSAgICAgbG9hZGluZyBhIHByaXZhdGUga2V5LCBzc2gtYWRkIHdpbGwgdHJ5IHRvIGxvYWQgY29ycmVzcG9uZGluZyBjZXJ0aWZpY2F0ZQotICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlbmFtZSBvYnRhaW5lZCBieSBhcHBlbmRpbmcgLWNlcnQucHViIHRvIHRoZSBuYW1lCi0gICAgIG9mIHRoZSBwcml2YXRlIGtleSBmaWxlLiAgQWx0ZXJuYXRpdmUgZmlsZSBuYW1lcyBjYW4gYmUgZ2l2ZW4gb24gdGhlCi0gICAgIGNvbW1hbmQgbGluZS4KLQotICAgICBJZiBhbnkgZmlsZSByZXF1aXJlcyBhIHBhc3NwaHJhc2UsIHNzaC1hZGQgYXNrcyBmb3IgdGhlIHBhc3NwaHJhc2UgZnJvbQotICAgICB0aGUgdXNlci4gIFRoZSBwYXNzcGhyYXNlIGlzIHJlYWQgZnJvbSB0aGUgdXNlcidzIHR0eS4gIHNzaC1hZGQgcmV0cmllcwotICAgICB0aGUgbGFzdCBwYXNzcGhyYXNlIGlmIG11bHRpcGxlIGlkZW50aXR5IGZpbGVzIGFyZSBnaXZlbi4KLQotICAgICBUaGUgYXV0aGVudGljYXRpb24gYWdlbnQgbXVzdCBiZSBydW5uaW5nIGFuZCB0aGUgU1NIX0FVVEhfU09DSwotICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2YgaXRzIHNvY2tldCBmb3Igc3NoLWFkZCB0bwotICAgICB3b3JrLgotCi0gICAgIFRoZSBvcHRpb25zIGFyZSBhcyBmb2xsb3dzOgotCi0gICAgIC1jICAgICAgSW5kaWNhdGVzIHRoYXQgYWRkZWQgaWRlbnRpdGllcyBzaG91bGQgYmUgc3ViamVjdCB0byBjb25maXJtYXRpb24KLSAgICAgICAgICAgICBiZWZvcmUgYmVpbmcgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uICBDb25maXJtYXRpb24gaXMgcGVyZm9ybWVkCi0gICAgICAgICAgICAgYnkgdGhlIFNTSF9BU0tQQVNTIHByb2dyYW0gbWVudGlvbmVkIGJlbG93LiAgU3VjY2Vzc2Z1bAotICAgICAgICAgICAgIGNvbmZpcm1hdGlvbiBpcyBzaWduYWxlZCBieSBhIHplcm8gZXhpdCBzdGF0dXMgZnJvbSB0aGUKLSAgICAgICAgICAgICBTU0hfQVNLUEFTUyBwcm9ncmFtLCByYXRoZXIgdGhhbiB0ZXh0IGVudGVyZWQgaW50byB0aGUgcmVxdWVzdGVyLgotCi0gICAgIC1EICAgICAgRGVsZXRlcyBhbGwgaWRlbnRpdGllcyBmcm9tIHRoZSBhZ2VudC4KLQotICAgICAtZCAgICAgIEluc3RlYWQgb2YgYWRkaW5nIGlkZW50aXRpZXMsIHJlbW92ZXMgaWRlbnRpdGllcyBmcm9tIHRoZSBhZ2VudC4KLSAgICAgICAgICAgICBJZiBzc2gtYWRkIGhhcyBiZWVuIHJ1biB3aXRob3V0IGFyZ3VtZW50cywgdGhlIGtleXMgZm9yIHRoZQotICAgICAgICAgICAgIGRlZmF1bHQgaWRlbnRpdGllcyB3aWxsIGJlIHJlbW92ZWQuICBPdGhlcndpc2UsIHRoZSBhcmd1bWVudCBsaXN0Ci0gICAgICAgICAgICAgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhIGxpc3Qgb2YgcGF0aHMgdG8gcHVibGljIGtleSBmaWxlcyBhbmQKLSAgICAgICAgICAgICBtYXRjaGluZyBrZXlzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBhZ2VudC4gIElmIG5vIHB1YmxpYyBrZXkKLSAgICAgICAgICAgICBpcyBmb3VuZCBhdCBhIGdpdmVuIHBhdGgsIHNzaC1hZGQgd2lsbCBhcHBlbmQgLnB1YiBhbmQgcmV0cnkuCi0KLSAgICAgLWUgcGtjczExCi0gICAgICAgICAgICAgUmVtb3ZlIGtleXMgcHJvdmlkZWQgYnkgdGhlIFBLQ1MjMTEgc2hhcmVkIGxpYnJhcnkgcGtjczExLgotCi0gICAgIC1MICAgICAgTGlzdHMgcHVibGljIGtleSBwYXJhbWV0ZXJzIG9mIGFsbCBpZGVudGl0aWVzIGN1cnJlbnRseQotICAgICAgICAgICAgIHJlcHJlc2VudGVkIGJ5IHRoZSBhZ2VudC4KLQotICAgICAtbCAgICAgIExpc3RzIGZpbmdlcnByaW50cyBvZiBhbGwgaWRlbnRpdGllcyBjdXJyZW50bHkgcmVwcmVzZW50ZWQgYnkgdGhlCi0gICAgICAgICAgICAgYWdlbnQuCi0KLSAgICAgLXMgcGtjczExCi0gICAgICAgICAgICAgQWRkIGtleXMgcHJvdmlkZWQgYnkgdGhlIFBLQ1MjMTEgc2hhcmVkIGxpYnJhcnkgcGtjczExLgotCi0gICAgIC10IGxpZmUKLSAgICAgICAgICAgICBTZXQgYSBtYXhpbXVtIGxpZmV0aW1lIHdoZW4gYWRkaW5nIGlkZW50aXRpZXMgdG8gYW4gYWdlbnQuICBUaGUKLSAgICAgICAgICAgICBsaWZldGltZSBtYXkgYmUgc3BlY2lmaWVkIGluIHNlY29uZHMgb3IgaW4gYSB0aW1lIGZvcm1hdAotICAgICAgICAgICAgIHNwZWNpZmllZCBpbiBzc2hkX2NvbmZpZyg1KS4KLQotICAgICAtWCAgICAgIFVubG9jayB0aGUgYWdlbnQuCi0KLSAgICAgLXggICAgICBMb2NrIHRoZSBhZ2VudCB3aXRoIGEgcGFzc3dvcmQuCi0KLUVOVklST05NRU5UCi0gICAgIERJU1BMQVkgYW5kIFNTSF9BU0tQQVNTCi0gICAgICAgICAgICAgSWYgc3NoLWFkZCBuZWVkcyBhIHBhc3NwaHJhc2UsIGl0IHdpbGwgcmVhZCB0aGUgcGFzc3BocmFzZSBmcm9tCi0gICAgICAgICAgICAgdGhlIGN1cnJlbnQgdGVybWluYWwgaWYgaXQgd2FzIHJ1biBmcm9tIGEgdGVybWluYWwuICBJZiBzc2gtYWRkCi0gICAgICAgICAgICAgZG9lcyBub3QgaGF2ZSBhIHRlcm1pbmFsIGFzc29jaWF0ZWQgd2l0aCBpdCBidXQgRElTUExBWSBhbmQKLSAgICAgICAgICAgICBTU0hfQVNLUEFTUyBhcmUgc2V0LCBpdCB3aWxsIGV4ZWN1dGUgdGhlIHByb2dyYW0gc3BlY2lmaWVkIGJ5Ci0gICAgICAgICAgICAgU1NIX0FTS1BBU1MgYW5kIG9wZW4gYW4gWDExIHdpbmRvdyB0byByZWFkIHRoZSBwYXNzcGhyYXNlLiAgVGhpcwotICAgICAgICAgICAgIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiBjYWxsaW5nIHNzaC1hZGQgZnJvbSBhIC54c2Vzc2lvbiBvcgotICAgICAgICAgICAgIHJlbGF0ZWQgc2NyaXB0LiAgKE5vdGUgdGhhdCBvbiBzb21lIG1hY2hpbmVzIGl0IG1heSBiZSBuZWNlc3NhcnkKLSAgICAgICAgICAgICB0byByZWRpcmVjdCB0aGUgaW5wdXQgZnJvbSAvZGV2L251bGwgdG8gbWFrZSB0aGlzIHdvcmsuKQotCi0gICAgIFNTSF9BVVRIX1NPQ0sKLSAgICAgICAgICAgICBJZGVudGlmaWVzIHRoZSBwYXRoIG9mIGEgVU5JWC1kb21haW4gc29ja2V0IHVzZWQgdG8gY29tbXVuaWNhdGUKLSAgICAgICAgICAgICB3aXRoIHRoZSBhZ2VudC4KLQotRklMRVMKLSAgICAgfi8uc3NoL2lkZW50aXR5Ci0gICAgICAgICAgICAgQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMSBSU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YKLSAgICAgICAgICAgICB0aGUgdXNlci4KLQotICAgICB+Ly5zc2gvaWRfZHNhCi0gICAgICAgICAgICAgQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMiBEU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YKLSAgICAgICAgICAgICB0aGUgdXNlci4KLQotICAgICB+Ly5zc2gvaWRfZWNkc2EKLSAgICAgICAgICAgICBDb250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAyIEVDRFNBIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IG9mCi0gICAgICAgICAgICAgdGhlIHVzZXIuCi0KLSAgICAgfi8uc3NoL2lkX3JzYQotICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDIgUlNBIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IG9mCi0gICAgICAgICAgICAgdGhlIHVzZXIuCi0KLSAgICAgSWRlbnRpdHkgZmlsZXMgc2hvdWxkIG5vdCBiZSByZWFkYWJsZSBieSBhbnlvbmUgYnV0IHRoZSB1c2VyLiAgTm90ZSB0aGF0Ci0gICAgIHNzaC1hZGQgaWdub3JlcyBpZGVudGl0eSBmaWxlcyBpZiB0aGV5IGFyZSBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KLQotRVhJVCBTVEFUVVMKLSAgICAgRXhpdCBzdGF0dXMgaXMgMCBvbiBzdWNjZXNzLCAxIGlmIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBmYWlscywgYW5kIDIgaWYKLSAgICAgc3NoLWFkZCBpcyB1bmFibGUgdG8gY29udGFjdCB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQuCi0KLVNFRSBBTFNPCi0gICAgIHNzaCgxKSwgc3NoLWFnZW50KDEpLCBzc2gta2V5Z2VuKDEpLCBzc2hkKDgpCi0KLUFVVEhPUlMKLSAgICAgT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlIHNzaCAxLjIuMTIgcmVsZWFzZSBieQotICAgICBUYXR1IFlsb25lbi4gIEFhcm9uIENhbXBiZWxsLCBCb2IgQmVjaywgTWFya3VzIEZyaWVkbCwgTmllbHMgUHJvdm9zLCBUaGVvCi0gICAgIGRlIFJhYWR0IGFuZCBEdWcgU29uZyByZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCi0gICAgIGNyZWF0ZWQgT3BlblNTSC4gIE1hcmt1cyBGcmllZGwgY29udHJpYnV0ZWQgdGhlIHN1cHBvcnQgZm9yIFNTSCBwcm90b2NvbAotICAgICB2ZXJzaW9ucyAxLjUgYW5kIDIuMC4KLQotT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgIE9jdG9iZXIgMjgsIDIwMTAgICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9zc2gtYWRkLjEgYi9zc2gtYWRkLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDhmZjkuLjAwMDAwMDAKLS0tIGEvc3NoLWFkZC4xCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS5cIgkkT3BlbkJTRDogc3NoLWFkZC4xLHYgMS41NSAyMDEwLzEwLzI4IDE4OjMzOjI4IGptYyBFeHAgJAotLlwiCi0uXCIgQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotLlwiICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0uXCIKLS5cIiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0uXCIgY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLS5cIiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0uXCIgaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotLlwiIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLS5cIgotLlwiCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk5IEFhcm9uIENhbXBiZWxsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlbyBkZSBSYWFkdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLS5cIiBhcmUgbWV0OgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotLlwiIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLS5cIiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotLlwiIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLS5cIiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLS5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0uXCIgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0uXCIgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLlwiIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotLlwiIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIKLS5EZCAkTWRvY2RhdGU6IE9jdG9iZXIgMjggMjAxMCAkCi0uRHQgU1NILUFERCAxCi0uT3MKLS5TaCBOQU1FCi0uTm0gc3NoLWFkZAotLk5kIGFkZHMgcHJpdmF0ZSBrZXkgaWRlbnRpdGllcyB0byB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQKLS5TaCBTWU5PUFNJUwotLk5tIHNzaC1hZGQKLS5PcCBGbCBjRGRMbFh4Ci0uT3AgRmwgdCBBciBsaWZlCi0uT3AgQXIKLS5ObSBzc2gtYWRkCi0uRmwgcyBBciBwa2NzMTEKLS5ObSBzc2gtYWRkCi0uRmwgZSBBciBwa2NzMTEKLS5TaCBERVNDUklQVElPTgotLk5tCi1hZGRzIHByaXZhdGUga2V5IGlkZW50aXRpZXMgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50LAotLlhyIHNzaC1hZ2VudCAxIC4KLVdoZW4gcnVuIHdpdGhvdXQgYXJndW1lbnRzLCBpdCBhZGRzIHRoZSBmaWxlcwotLlBhIH4vLnNzaC9pZF9yc2EgLAotLlBhIH4vLnNzaC9pZF9kc2EgLAotLlBhIH4vLnNzaC9pZF9lY2RzYQotYW5kCi0uUGEgfi8uc3NoL2lkZW50aXR5IC4KLUFmdGVyIGxvYWRpbmcgYSBwcml2YXRlIGtleSwKLS5ObQotd2lsbCB0cnkgdG8gbG9hZCBjb3JyZXNwb25kaW5nIGNlcnRpZmljYXRlIGluZm9ybWF0aW9uIGZyb20gdGhlCi1maWxlbmFtZSBvYnRhaW5lZCBieSBhcHBlbmRpbmcKLS5QYSAtY2VydC5wdWIKLXRvIHRoZSBuYW1lIG9mIHRoZSBwcml2YXRlIGtleSBmaWxlLgotQWx0ZXJuYXRpdmUgZmlsZSBuYW1lcyBjYW4gYmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KLS5QcAotSWYgYW55IGZpbGUgcmVxdWlyZXMgYSBwYXNzcGhyYXNlLAotLk5tCi1hc2tzIGZvciB0aGUgcGFzc3BocmFzZSBmcm9tIHRoZSB1c2VyLgotVGhlIHBhc3NwaHJhc2UgaXMgcmVhZCBmcm9tIHRoZSB1c2VyJ3MgdHR5LgotLk5tCi1yZXRyaWVzIHRoZSBsYXN0IHBhc3NwaHJhc2UgaWYgbXVsdGlwbGUgaWRlbnRpdHkgZmlsZXMgYXJlIGdpdmVuLgotLlBwCi1UaGUgYXV0aGVudGljYXRpb24gYWdlbnQgbXVzdCBiZSBydW5uaW5nIGFuZCB0aGUKLS5FdiBTU0hfQVVUSF9TT0NLCi1lbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2YgaXRzIHNvY2tldCBmb3IKLS5ObQotdG8gd29yay4KLS5QcAotVGhlIG9wdGlvbnMgYXJlIGFzIGZvbGxvd3M6Ci0uQmwgLXRhZyAtd2lkdGggRHMKLS5JdCBGbCBjCi1JbmRpY2F0ZXMgdGhhdCBhZGRlZCBpZGVudGl0aWVzIHNob3VsZCBiZSBzdWJqZWN0IHRvIGNvbmZpcm1hdGlvbiBiZWZvcmUKLWJlaW5nIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgotQ29uZmlybWF0aW9uIGlzIHBlcmZvcm1lZCBieSB0aGUKLS5FdiBTU0hfQVNLUEFTUwotcHJvZ3JhbSBtZW50aW9uZWQgYmVsb3cuCi1TdWNjZXNzZnVsIGNvbmZpcm1hdGlvbiBpcyBzaWduYWxlZCBieSBhIHplcm8gZXhpdCBzdGF0dXMgZnJvbSB0aGUKLS5FdiBTU0hfQVNLUEFTUwotcHJvZ3JhbSwgcmF0aGVyIHRoYW4gdGV4dCBlbnRlcmVkIGludG8gdGhlIHJlcXVlc3Rlci4KLS5JdCBGbCBECi1EZWxldGVzIGFsbCBpZGVudGl0aWVzIGZyb20gdGhlIGFnZW50LgotLkl0IEZsIGQKLUluc3RlYWQgb2YgYWRkaW5nIGlkZW50aXRpZXMsIHJlbW92ZXMgaWRlbnRpdGllcyBmcm9tIHRoZSBhZ2VudC4KLUlmCi0uTm0KLWhhcyBiZWVuIHJ1biB3aXRob3V0IGFyZ3VtZW50cywgdGhlIGtleXMgZm9yIHRoZSBkZWZhdWx0IGlkZW50aXRpZXMgd2lsbAotYmUgcmVtb3ZlZC4KLU90aGVyd2lzZSwgdGhlIGFyZ3VtZW50IGxpc3Qgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhIGxpc3Qgb2YgcGF0aHMgdG8KLXB1YmxpYyBrZXkgZmlsZXMgYW5kIG1hdGNoaW5nIGtleXMgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGFnZW50LgotSWYgbm8gcHVibGljIGtleSBpcyBmb3VuZCBhdCBhIGdpdmVuIHBhdGgsCi0uTm0KLXdpbGwgYXBwZW5kCi0uUGEgLnB1YgotYW5kIHJldHJ5LgotLkl0IEZsIGUgQXIgcGtjczExCi1SZW1vdmUga2V5cyBwcm92aWRlZCBieSB0aGUgUEtDUyMxMSBzaGFyZWQgbGlicmFyeQotLkFyIHBrY3MxMSAuCi0uSXQgRmwgTAotTGlzdHMgcHVibGljIGtleSBwYXJhbWV0ZXJzIG9mIGFsbCBpZGVudGl0aWVzIGN1cnJlbnRseSByZXByZXNlbnRlZAotYnkgdGhlIGFnZW50LgotLkl0IEZsIGwKLUxpc3RzIGZpbmdlcnByaW50cyBvZiBhbGwgaWRlbnRpdGllcyBjdXJyZW50bHkgcmVwcmVzZW50ZWQgYnkgdGhlIGFnZW50LgotLkl0IEZsIHMgQXIgcGtjczExCi1BZGQga2V5cyBwcm92aWRlZCBieSB0aGUgUEtDUyMxMSBzaGFyZWQgbGlicmFyeQotLkFyIHBrY3MxMSAuCi0uSXQgRmwgdCBBciBsaWZlCi1TZXQgYSBtYXhpbXVtIGxpZmV0aW1lIHdoZW4gYWRkaW5nIGlkZW50aXRpZXMgdG8gYW4gYWdlbnQuCi1UaGUgbGlmZXRpbWUgbWF5IGJlIHNwZWNpZmllZCBpbiBzZWNvbmRzIG9yIGluIGEgdGltZSBmb3JtYXQKLXNwZWNpZmllZCBpbgotLlhyIHNzaGRfY29uZmlnIDUgLgotLkl0IEZsIFgKLVVubG9jayB0aGUgYWdlbnQuCi0uSXQgRmwgeAotTG9jayB0aGUgYWdlbnQgd2l0aCBhIHBhc3N3b3JkLgotLkVsCi0uU2ggRU5WSVJPTk1FTlQKLS5CbCAtdGFnIC13aWR0aCBEcwotLkl0IEV2ICJESVNQTEFZIiBhbmQgIlNTSF9BU0tQQVNTIgotSWYKLS5ObQotbmVlZHMgYSBwYXNzcGhyYXNlLCBpdCB3aWxsIHJlYWQgdGhlIHBhc3NwaHJhc2UgZnJvbSB0aGUgY3VycmVudAotdGVybWluYWwgaWYgaXQgd2FzIHJ1biBmcm9tIGEgdGVybWluYWwuCi1JZgotLk5tCi1kb2VzIG5vdCBoYXZlIGEgdGVybWluYWwgYXNzb2NpYXRlZCB3aXRoIGl0IGJ1dAotLkV2IERJU1BMQVkKLWFuZAotLkV2IFNTSF9BU0tQQVNTCi1hcmUgc2V0LCBpdCB3aWxsIGV4ZWN1dGUgdGhlIHByb2dyYW0gc3BlY2lmaWVkIGJ5Ci0uRXYgU1NIX0FTS1BBU1MKLWFuZCBvcGVuIGFuIFgxMSB3aW5kb3cgdG8gcmVhZCB0aGUgcGFzc3BocmFzZS4KLVRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIGNhbGxpbmcKLS5ObQotZnJvbSBhCi0uUGEgLnhzZXNzaW9uCi1vciByZWxhdGVkIHNjcmlwdC4KLShOb3RlIHRoYXQgb24gc29tZSBtYWNoaW5lcyBpdAotbWF5IGJlIG5lY2Vzc2FyeSB0byByZWRpcmVjdCB0aGUgaW5wdXQgZnJvbQotLlBhIC9kZXYvbnVsbAotdG8gbWFrZSB0aGlzIHdvcmsuKQotLkl0IEV2IFNTSF9BVVRIX1NPQ0sKLUlkZW50aWZpZXMgdGhlIHBhdGggb2YgYQotLlV4IE5zIC1kb21haW4KLXNvY2tldCB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGFnZW50LgotLkVsCi0uU2ggRklMRVMKLS5CbCAtdGFnIC13aWR0aCBEcwotLkl0IFBhIH4vLnNzaC9pZGVudGl0eQotQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMSBSU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YgdGhlIHVzZXIuCi0uSXQgUGEgfi8uc3NoL2lkX2RzYQotQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMiBEU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YgdGhlIHVzZXIuCi0uSXQgUGEgfi8uc3NoL2lkX2VjZHNhCi1Db250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAyIEVDRFNBIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IG9mIHRoZSB1c2VyLgotLkl0IFBhIH4vLnNzaC9pZF9yc2EKLUNvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDIgUlNBIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IG9mIHRoZSB1c2VyLgotLkVsCi0uUHAKLUlkZW50aXR5IGZpbGVzIHNob3VsZCBub3QgYmUgcmVhZGFibGUgYnkgYW55b25lIGJ1dCB0aGUgdXNlci4KLU5vdGUgdGhhdAotLk5tCi1pZ25vcmVzIGlkZW50aXR5IGZpbGVzIGlmIHRoZXkgYXJlIGFjY2Vzc2libGUgYnkgb3RoZXJzLgotLlNoIEVYSVQgU1RBVFVTCi1FeGl0IHN0YXR1cyBpcyAwIG9uIHN1Y2Nlc3MsIDEgaWYgdGhlIHNwZWNpZmllZCBjb21tYW5kIGZhaWxzLAotYW5kIDIgaWYKLS5ObQotaXMgdW5hYmxlIHRvIGNvbnRhY3QgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50LgotLlNoIFNFRSBBTFNPCi0uWHIgc3NoIDEgLAotLlhyIHNzaC1hZ2VudCAxICwKLS5YciBzc2gta2V5Z2VuIDEgLAotLlhyIHNzaGQgOAotLlNoIEFVVEhPUlMKLU9wZW5TU0ggaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBhbmQgZnJlZQotc3NoIDEuMi4xMiByZWxlYXNlIGJ5IFRhdHUgWWxvbmVuLgotQWFyb24gQ2FtcGJlbGwsIEJvYiBCZWNrLCBNYXJrdXMgRnJpZWRsLCBOaWVscyBQcm92b3MsCi1UaGVvIGRlIFJhYWR0IGFuZCBEdWcgU29uZwotcmVtb3ZlZCBtYW55IGJ1Z3MsIHJlLWFkZGVkIG5ld2VyIGZlYXR1cmVzIGFuZAotY3JlYXRlZCBPcGVuU1NILgotTWFya3VzIEZyaWVkbCBjb250cmlidXRlZCB0aGUgc3VwcG9ydCBmb3IgU1NICi1wcm90b2NvbCB2ZXJzaW9ucyAxLjUgYW5kIDIuMC4KZGlmZiAtLWdpdCBhL3NzaC1hZGQuYyBiL3NzaC1hZGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1ZTJhOS4uMDAwMDAwMAotLS0gYS9zc2gtYWRkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNzaC1hZGQuYyx2IDEuMTAxIDIwMTEvMDUvMDQgMjE6MTU6MjkgZGptIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogQWRkcyBhbiBpZGVudGl0eSB0byB0aGUgYXV0aGVudGljYXRpb24gc2VydmVyLCBvciByZW1vdmVzIGFuIGlkZW50aXR5LgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKgotICogU1NIMiBpbXBsZW1lbnRhdGlvbiwKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLSNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC5oIgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgInJzYS5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImF1dGhmZC5oIgotI2luY2x1ZGUgImF1dGhmaWxlLmgiCi0jaW5jbHVkZSAicGF0aG5hbWVzLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotCi0vKiBhcmd2MCAqLwotZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7Ci0KLS8qIERlZmF1bHQgZmlsZXMgdG8gYWRkICovCi1zdGF0aWMgY2hhciAqZGVmYXVsdF9maWxlc1tdID0gewotCV9QQVRIX1NTSF9DTElFTlRfSURfUlNBLAotCV9QQVRIX1NTSF9DTElFTlRfSURfRFNBLAotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCV9QQVRIX1NTSF9DTElFTlRfSURfRUNEU0EsCi0jZW5kaWYKLQlfUEFUSF9TU0hfQ0xJRU5UX0lERU5USVRZLAotCU5VTEwKLX07Ci0KLS8qIERlZmF1bHQgbGlmZXRpbWUgKDAgPT0gZm9yZXZlcikgKi8KLXN0YXRpYyBpbnQgbGlmZXRpbWUgPSAwOwotCi0vKiBVc2VyIGhhcyB0byBjb25maXJtIGtleSB1c2UgKi8KLXN0YXRpYyBpbnQgY29uZmlybSA9IDA7Ci0KLS8qIHdlIGtlZXAgYSBjYWNoZSBvZiBvbmUgcGFzc3BocmFzZXMgKi8KLXN0YXRpYyBjaGFyICpwYXNzID0gTlVMTDsKLXN0YXRpYyB2b2lkCi1jbGVhcl9wYXNzKHZvaWQpCi17Ci0JaWYgKHBhc3MpIHsKLQkJbWVtc2V0KHBhc3MsIDAsIHN0cmxlbihwYXNzKSk7Ci0JCXhmcmVlKHBhc3MpOwotCQlwYXNzID0gTlVMTDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLWRlbGV0ZV9maWxlKEF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqYWMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotCUtleSAqcHVibGljOwotCWNoYXIgKmNvbW1lbnQgPSBOVUxMOwotCWludCByZXQgPSAtMTsKLQotCXB1YmxpYyA9IGtleV9sb2FkX3B1YmxpYyhmaWxlbmFtZSwgJmNvbW1lbnQpOwotCWlmIChwdWJsaWMgPT0gTlVMTCkgewotCQlwcmludGYoIkJhZCBrZXkgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChzc2hfcmVtb3ZlX2lkZW50aXR5KGFjLCBwdWJsaWMpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiSWRlbnRpdHkgcmVtb3ZlZDogJXMgKCVzKVxuIiwgZmlsZW5hbWUsIGNvbW1lbnQpOwotCQlyZXQgPSAwOwotCX0gZWxzZQotCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCByZW1vdmUgaWRlbnRpdHk6ICVzXG4iLCBmaWxlbmFtZSk7Ci0KLQlrZXlfZnJlZShwdWJsaWMpOwotCXhmcmVlKGNvbW1lbnQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogU2VuZCBhIHJlcXVlc3QgdG8gcmVtb3ZlIGFsbCBpZGVudGl0aWVzLiAqLwotc3RhdGljIGludAotZGVsZXRlX2FsbChBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmFjKQotewotCWludCByZXQgPSAtMTsKLQotCWlmIChzc2hfcmVtb3ZlX2FsbF9pZGVudGl0aWVzKGFjLCAxKSkKLQkJcmV0ID0gMDsKLQkvKiBpZ25vcmUgZXJyb3ItY29kZSBmb3Igc3NoMiAqLwotCXNzaF9yZW1vdmVfYWxsX2lkZW50aXRpZXMoYWMsIDIpOwotCi0JaWYgKHJldCA9PSAwKQotCQlmcHJpbnRmKHN0ZGVyciwgIkFsbCBpZGVudGl0aWVzIHJlbW92ZWQuXG4iKTsKLQllbHNlCi0JCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJlbW92ZSBhbGwgaWRlbnRpdGllcy5cbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotYWRkX2ZpbGUoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphYywgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0JS2V5ICpwcml2YXRlLCAqY2VydDsKLQljaGFyICpjb21tZW50ID0gTlVMTDsKLQljaGFyIG1zZ1sxMDI0XSwgKmNlcnRwYXRoOwotCWludCBmZCwgcGVybXNfb2ssIHJldCA9IC0xOwotCUJ1ZmZlciBrZXlibG9iOwotCi0JaWYgKHN0cmNtcChmaWxlbmFtZSwgIi0iKSA9PSAwKSB7Ci0JCWZkID0gU1RESU5fRklMRU5POwotCQlmaWxlbmFtZSA9ICIoc3RkaW4pIjsKLQl9IGVsc2UgaWYgKChmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKSkgPCAwKSB7Ci0JCXBlcnJvcihmaWxlbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIFNpbmNlIHdlJ2xsIHRyeSB0byBsb2FkIGEga2V5ZmlsZSBtdWx0aXBsZSB0aW1lcywgcGVybWlzc2lvbiBlcnJvcnMKLQkgKiB3aWxsIG9jY3VyIG11bHRpcGxlIHRpbWVzLCBzbyBjaGVjayBwZXJtcyBmaXJzdCBhbmQgYmFpbCBpZiB3cm9uZy4KLQkgKi8KLQlpZiAoZmQgIT0gU1RESU5fRklMRU5PKSB7Ci0JCXBlcm1zX29rID0ga2V5X3Blcm1fb2soZmQsIGZpbGVuYW1lKTsKLQkJaWYgKCFwZXJtc19vaykgewotCQkJY2xvc2UoZmQpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWJ1ZmZlcl9pbml0KCZrZXlibG9iKTsKLQlpZiAoIWtleV9sb2FkX2ZpbGUoZmQsIGZpbGVuYW1lLCAma2V5YmxvYikpIHsKLQkJYnVmZmVyX2ZyZWUoJmtleWJsb2IpOwotCQljbG9zZShmZCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JY2xvc2UoZmQpOwotCi0JLyogQXQgZmlyc3QsIHRyeSBlbXB0eSBwYXNzcGhyYXNlICovCi0JcHJpdmF0ZSA9IGtleV9wYXJzZV9wcml2YXRlKCZrZXlibG9iLCBmaWxlbmFtZSwgIiIsICZjb21tZW50KTsKLQlpZiAoY29tbWVudCA9PSBOVUxMKQotCQljb21tZW50ID0geHN0cmR1cChmaWxlbmFtZSk7Ci0JLyogdHJ5IGxhc3QgKi8KLQlpZiAocHJpdmF0ZSA9PSBOVUxMICYmIHBhc3MgIT0gTlVMTCkKLQkJcHJpdmF0ZSA9IGtleV9wYXJzZV9wcml2YXRlKCZrZXlibG9iLCBmaWxlbmFtZSwgcGFzcywgTlVMTCk7Ci0JaWYgKHByaXZhdGUgPT0gTlVMTCkgewotCQkvKiBjbGVhciBwYXNzcGhyYXNlIHNpbmNlIGl0IGRpZCBub3Qgd29yayAqLwotCQljbGVhcl9wYXNzKCk7Ci0JCXNucHJpbnRmKG1zZywgc2l6ZW9mIG1zZywgIkVudGVyIHBhc3NwaHJhc2UgZm9yICUuMjAwczogIiwKLQkJICAgIGNvbW1lbnQpOwotCQlmb3IgKDs7KSB7Ci0JCQlwYXNzID0gcmVhZF9wYXNzcGhyYXNlKG1zZywgUlBfQUxMT1dfU1RESU4pOwotCQkJaWYgKHN0cmNtcChwYXNzLCAiIikgPT0gMCkgewotCQkJCWNsZWFyX3Bhc3MoKTsKLQkJCQl4ZnJlZShjb21tZW50KTsKLQkJCQlidWZmZXJfZnJlZSgma2V5YmxvYik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJcHJpdmF0ZSA9IGtleV9wYXJzZV9wcml2YXRlKCZrZXlibG9iLCBmaWxlbmFtZSwgcGFzcywKLQkJCSAgICAmY29tbWVudCk7Ci0JCQlpZiAocHJpdmF0ZSAhPSBOVUxMKQotCQkJCWJyZWFrOwotCQkJY2xlYXJfcGFzcygpOwotCQkJc25wcmludGYobXNnLCBzaXplb2YgbXNnLAotCQkJICAgICJCYWQgcGFzc3BocmFzZSwgdHJ5IGFnYWluIGZvciAlLjIwMHM6ICIsIGNvbW1lbnQpOwotCQl9Ci0JfQotCWJ1ZmZlcl9mcmVlKCZrZXlibG9iKTsKLQotCWlmIChzc2hfYWRkX2lkZW50aXR5X2NvbnN0cmFpbmVkKGFjLCBwcml2YXRlLCBjb21tZW50LCBsaWZldGltZSwKLQkgICAgY29uZmlybSkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJJZGVudGl0eSBhZGRlZDogJXMgKCVzKVxuIiwgZmlsZW5hbWUsIGNvbW1lbnQpOwotCQlyZXQgPSAwOwotCQlpZiAobGlmZXRpbWUgIT0gMCkKLQkJCWZwcmludGYoc3RkZXJyLAotCQkJICAgICJMaWZldGltZSBzZXQgdG8gJWQgc2Vjb25kc1xuIiwgbGlmZXRpbWUpOwotCQlpZiAoY29uZmlybSAhPSAwKQotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkgICAgIlRoZSB1c2VyIG11c3QgY29uZmlybSBlYWNoIHVzZSBvZiB0aGUga2V5XG4iKTsKLQl9IGVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhZGQgaWRlbnRpdHk6ICVzXG4iLCBmaWxlbmFtZSk7Ci0JfQotCi0KLQkvKiBOb3cgdHJ5IHRvIGFkZCB0aGUgY2VydGlmaWNhdGUgZmxhdm91ciB0b28gKi8KLQl4YXNwcmludGYoJmNlcnRwYXRoLCAiJXMtY2VydC5wdWIiLCBmaWxlbmFtZSk7Ci0JaWYgKChjZXJ0ID0ga2V5X2xvYWRfcHVibGljKGNlcnRwYXRoLCBOVUxMKSkgPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoIWtleV9lcXVhbF9wdWJsaWMoY2VydCwgcHJpdmF0ZSkpIHsKLQkJZXJyb3IoIkNlcnRpZmljYXRlICVzIGRvZXMgbm90IG1hdGNoIHByaXZhdGUga2V5ICVzIiwKLQkJICAgIGNlcnRwYXRoLCBmaWxlbmFtZSk7Ci0JCWtleV9mcmVlKGNlcnQpOwotCQlnb3RvIG91dDsKLQl9IAotCi0JLyogR3JhZnQgd2l0aCBwcml2YXRlIGJpdHMgKi8KLQlpZiAoa2V5X3RvX2NlcnRpZmllZChwcml2YXRlLCBrZXlfY2VydF9pc19sZWdhY3koY2VydCkpICE9IDApIHsKLQkJZXJyb3IoIiVzOiBrZXlfdG9fY2VydGlmaWVkIGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJa2V5X2ZyZWUoY2VydCk7Ci0JCWdvdG8gb3V0OwotCX0KLQlrZXlfY2VydF9jb3B5KGNlcnQsIHByaXZhdGUpOwotCWtleV9mcmVlKGNlcnQpOwotCi0JaWYgKCFzc2hfYWRkX2lkZW50aXR5X2NvbnN0cmFpbmVkKGFjLCBwcml2YXRlLCBjb21tZW50LAotCSAgICBsaWZldGltZSwgY29uZmlybSkpIHsKLQkJZXJyb3IoIkNlcnRpZmljYXRlICVzICglcykgYWRkIGZhaWxlZCIsIGNlcnRwYXRoLAotCQkgICAgcHJpdmF0ZS0+Y2VydC0+a2V5X2lkKTsKLQl9Ci0JZnByaW50ZihzdGRlcnIsICJDZXJ0aWZpY2F0ZSBhZGRlZDogJXMgKCVzKVxuIiwgY2VydHBhdGgsCi0JICAgIHByaXZhdGUtPmNlcnQtPmtleV9pZCk7Ci0JaWYgKGxpZmV0aW1lICE9IDApCi0JCWZwcmludGYoc3RkZXJyLCAiTGlmZXRpbWUgc2V0IHRvICVkIHNlY29uZHNcbiIsIGxpZmV0aW1lKTsKLQlpZiAoY29uZmlybSAhPSAwKQotCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSB1c2VyIG11c3QgY29uZmlybSBlYWNoIHVzZSBvZiB0aGUga2V5XG4iKTsKLSBvdXQ6Ci0JeGZyZWUoY2VydHBhdGgpOwotCXhmcmVlKGNvbW1lbnQpOwotCWtleV9mcmVlKHByaXZhdGUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotdXBkYXRlX2NhcmQoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphYywgaW50IGFkZCwgY29uc3QgY2hhciAqaWQpCi17Ci0JY2hhciAqcGluOwotCWludCByZXQgPSAtMTsKLQotCXBpbiA9IHJlYWRfcGFzc3BocmFzZSgiRW50ZXIgcGFzc3BocmFzZSBmb3IgUEtDUyMxMTogIiwgUlBfQUxMT1dfU1RESU4pOwotCWlmIChwaW4gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKHNzaF91cGRhdGVfY2FyZChhYywgYWRkLCBpZCwgcGluLCBsaWZldGltZSwgY29uZmlybSkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJDYXJkICVzOiAlc1xuIiwKLQkJICAgIGFkZCA/ICJhZGRlZCIgOiAicmVtb3ZlZCIsIGlkKTsKLQkJcmV0ID0gMDsKLQl9IGVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCAlcyBjYXJkOiAlc1xuIiwKLQkJICAgIGFkZCA/ICJhZGQiIDogInJlbW92ZSIsIGlkKTsKLQkJcmV0ID0gLTE7Ci0JfQotCXhmcmVlKHBpbik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotbGlzdF9pZGVudGl0aWVzKEF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqYWMsIGludCBkb19mcCkKLXsKLQlLZXkgKmtleTsKLQljaGFyICpjb21tZW50LCAqZnA7Ci0JaW50IGhhZF9pZGVudGl0aWVzID0gMDsKLQlpbnQgdmVyc2lvbjsKLQotCWZvciAodmVyc2lvbiA9IDE7IHZlcnNpb24gPD0gMjsgdmVyc2lvbisrKSB7Ci0JCWZvciAoa2V5ID0gc3NoX2dldF9maXJzdF9pZGVudGl0eShhYywgJmNvbW1lbnQsIHZlcnNpb24pOwotCQkgICAga2V5ICE9IE5VTEw7Ci0JCSAgICBrZXkgPSBzc2hfZ2V0X25leHRfaWRlbnRpdHkoYWMsICZjb21tZW50LCB2ZXJzaW9uKSkgewotCQkJaGFkX2lkZW50aXRpZXMgPSAxOwotCQkJaWYgKGRvX2ZwKSB7Ci0JCQkJZnAgPSBrZXlfZmluZ2VycHJpbnQoa2V5LCBTU0hfRlBfTUQ1LAotCQkJCSAgICBTU0hfRlBfSEVYKTsKLQkJCQlwcmludGYoIiVkICVzICVzICglcylcbiIsCi0JCQkJICAgIGtleV9zaXplKGtleSksIGZwLCBjb21tZW50LCBrZXlfdHlwZShrZXkpKTsKLQkJCQl4ZnJlZShmcCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICgha2V5X3dyaXRlKGtleSwgc3Rkb3V0KSkKLQkJCQkJZnByaW50ZihzdGRlcnIsICJrZXlfd3JpdGUgZmFpbGVkIik7Ci0JCQkJZnByaW50ZihzdGRvdXQsICIgJXNcbiIsIGNvbW1lbnQpOwotCQkJfQotCQkJa2V5X2ZyZWUoa2V5KTsKLQkJCXhmcmVlKGNvbW1lbnQpOwotCQl9Ci0JfQotCWlmICghaGFkX2lkZW50aXRpZXMpIHsKLQkJcHJpbnRmKCJUaGUgYWdlbnQgaGFzIG5vIGlkZW50aXRpZXMuXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbG9ja19hZ2VudChBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmFjLCBpbnQgbG9jaykKLXsKLQljaGFyIHByb21wdFsxMDBdLCAqcDEsICpwMjsKLQlpbnQgcGFzc29rID0gMSwgcmV0ID0gLTE7Ci0KLQlzdHJsY3B5KHByb21wdCwgIkVudGVyIGxvY2sgcGFzc3dvcmQ6ICIsIHNpemVvZihwcm9tcHQpKTsKLQlwMSA9IHJlYWRfcGFzc3BocmFzZShwcm9tcHQsIFJQX0FMTE9XX1NURElOKTsKLQlpZiAobG9jaykgewotCQlzdHJsY3B5KHByb21wdCwgIkFnYWluOiAiLCBzaXplb2YgcHJvbXB0KTsKLQkJcDIgPSByZWFkX3Bhc3NwaHJhc2UocHJvbXB0LCBSUF9BTExPV19TVERJTik7Ci0JCWlmIChzdHJjbXAocDEsIHAyKSAhPSAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlBhc3N3b3JkcyBkbyBub3QgbWF0Y2guXG4iKTsKLQkJCXBhc3NvayA9IDA7Ci0JCX0KLQkJbWVtc2V0KHAyLCAwLCBzdHJsZW4ocDIpKTsKLQkJeGZyZWUocDIpOwotCX0KLQlpZiAocGFzc29rICYmIHNzaF9sb2NrX2FnZW50KGFjLCBsb2NrLCBwMSkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJBZ2VudCAlc2xvY2tlZC5cbiIsIGxvY2sgPyAiIiA6ICJ1biIpOwotCQlyZXQgPSAwOwotCX0gZWxzZQotCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byAlc2xvY2sgYWdlbnQuXG4iLCBsb2NrID8gIiIgOiAidW4iKTsKLQltZW1zZXQocDEsIDAsIHN0cmxlbihwMSkpOwotCXhmcmVlKHAxKTsKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWRvX2ZpbGUoQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphYywgaW50IGRlbGV0aW5nLCBjaGFyICpmaWxlKQotewotCWlmIChkZWxldGluZykgewotCQlpZiAoZGVsZXRlX2ZpbGUoYWMsIGZpbGUpID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0gZWxzZSB7Ci0JCWlmIChhZGRfZmlsZShhYywgZmlsZSkgPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotdXNhZ2Uodm9pZCkKLXsKLQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbb3B0aW9uc10gW2ZpbGUgLi4uXVxuIiwgX19wcm9nbmFtZSk7Ci0JZnByaW50ZihzdGRlcnIsICJPcHRpb25zOlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1sICAgICAgICAgIExpc3QgZmluZ2VycHJpbnRzIG9mIGFsbCBpZGVudGl0aWVzLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1MICAgICAgICAgIExpc3QgcHVibGljIGtleSBwYXJhbWV0ZXJzIG9mIGFsbCBpZGVudGl0aWVzLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1kICAgICAgICAgIERlbGV0ZSBpZGVudGl0eS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtRCAgICAgICAgICBEZWxldGUgYWxsIGlkZW50aXRpZXMuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgLXggICAgICAgICAgTG9jayBhZ2VudC5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtWCAgICAgICAgICBVbmxvY2sgYWdlbnQuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgLXQgbGlmZSAgICAgU2V0IGxpZmV0aW1lIChpbiBzZWNvbmRzKSB3aGVuIGFkZGluZyBpZGVudGl0aWVzLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1jICAgICAgICAgIFJlcXVpcmUgY29uZmlybWF0aW9uIHRvIHNpZ24gdXNpbmcgaWRlbnRpdGllc1xuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1zIHBrY3MxMSAgIEFkZCBrZXlzIGZyb20gUEtDUyMxMSBwcm92aWRlci5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtZSBwa2NzMTEgICBSZW1vdmUga2V5cyBwcm92aWRlZCBieSBQS0NTIzExIHByb3ZpZGVyLlxuIik7Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0JZXh0ZXJuIGNoYXIgKm9wdGFyZzsKLQlleHRlcm4gaW50IG9wdGluZDsKLQlBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmFjID0gTlVMTDsKLQljaGFyICpwa2NzMTFwcm92aWRlciA9IE5VTEw7Ci0JaW50IGksIGNoLCBkZWxldGluZyA9IDAsIHJldCA9IDA7Ci0KLQkvKiBFbnN1cmUgdGhhdCBmZHMgMCwgMSBhbmQgMiBhcmUgb3BlbiBvciBkaXJlY3RlZCB0byAvZGV2L251bGwgKi8KLQlzYW5pdGlzZV9zdGRmZCgpOwotCi0JX19wcm9nbmFtZSA9IHNzaF9nZXRfcHJvZ25hbWUoYXJndlswXSk7Ci0Jc2VlZF9ybmcoKTsKLQotCU9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7Ci0KLQkvKiBBdCBmaXJzdCwgZ2V0IGEgY29ubmVjdGlvbiB0byB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQuICovCi0JYWMgPSBzc2hfZ2V0X2F1dGhlbnRpY2F0aW9uX2Nvbm5lY3Rpb24oKTsKLQlpZiAoYWMgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwKLQkJICAgICJDb3VsZCBub3Qgb3BlbiBhIGNvbm5lY3Rpb24gdG8geW91ciBhdXRoZW50aWNhdGlvbiBhZ2VudC5cbiIpOwotCQlleGl0KDIpOwotCX0KLQl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJsTGNkRHhYZTpzOnQ6IikpICE9IC0xKSB7Ci0JCXN3aXRjaCAoY2gpIHsKLQkJY2FzZSAnbCc6Ci0JCWNhc2UgJ0wnOgotCQkJaWYgKGxpc3RfaWRlbnRpdGllcyhhYywgY2ggPT0gJ2wnID8gMSA6IDApID09IC0xKQotCQkJCXJldCA9IDE7Ci0JCQlnb3RvIGRvbmU7Ci0JCWNhc2UgJ3gnOgotCQljYXNlICdYJzoKLQkJCWlmIChsb2NrX2FnZW50KGFjLCBjaCA9PSAneCcgPyAxIDogMCkgPT0gLTEpCi0JCQkJcmV0ID0gMTsKLQkJCWdvdG8gZG9uZTsKLQkJY2FzZSAnYyc6Ci0JCQljb25maXJtID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdkJzoKLQkJCWRlbGV0aW5nID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdEJzoKLQkJCWlmIChkZWxldGVfYWxsKGFjKSA9PSAtMSkKLQkJCQlyZXQgPSAxOwotCQkJZ290byBkb25lOwotCQljYXNlICdzJzoKLQkJCXBrY3MxMXByb3ZpZGVyID0gb3B0YXJnOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2UnOgotCQkJZGVsZXRpbmcgPSAxOwotCQkJcGtjczExcHJvdmlkZXIgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAndCc6Ci0JCQlpZiAoKGxpZmV0aW1lID0gY29udnRpbWUob3B0YXJnKSkgPT0gLTEpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgbGlmZXRpbWVcbiIpOwotCQkJCXJldCA9IDE7Ci0JCQkJZ290byBkb25lOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl1c2FnZSgpOwotCQkJcmV0ID0gMTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQlhcmdjIC09IG9wdGluZDsKLQlhcmd2ICs9IG9wdGluZDsKLQlpZiAocGtjczExcHJvdmlkZXIgIT0gTlVMTCkgewotCQlpZiAodXBkYXRlX2NhcmQoYWMsICFkZWxldGluZywgcGtjczExcHJvdmlkZXIpID09IC0xKQotCQkJcmV0ID0gMTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoYXJnYyA9PSAwKSB7Ci0JCWNoYXIgYnVmW01BWFBBVEhMRU5dOwotCQlzdHJ1Y3QgcGFzc3dkICpwdzsKLQkJc3RydWN0IHN0YXQgc3Q7Ci0JCWludCBjb3VudCA9IDA7Ci0KLQkJaWYgKChwdyA9IGdldHB3dWlkKGdldHVpZCgpKSkgPT0gTlVMTCkgewotCQkJZnByaW50ZihzdGRlcnIsICJObyB1c2VyIGZvdW5kIHdpdGggdWlkICV1XG4iLAotCQkJICAgICh1X2ludClnZXR1aWQoKSk7Ci0JCQlyZXQgPSAxOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgZGVmYXVsdF9maWxlc1tpXTsgaSsrKSB7Ci0JCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMvJXMiLCBwdy0+cHdfZGlyLAotCQkJICAgIGRlZmF1bHRfZmlsZXNbaV0pOwotCQkJaWYgKHN0YXQoYnVmLCAmc3QpIDwgMCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChkb19maWxlKGFjLCBkZWxldGluZywgYnVmKSA9PSAtMSkKLQkJCQlyZXQgPSAxOwotCQkJZWxzZQotCQkJCWNvdW50Kys7Ci0JCX0KLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXQgPSAxOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLQkJCWlmIChkb19maWxlKGFjLCBkZWxldGluZywgYXJndltpXSkgPT0gLTEpCi0JCQkJcmV0ID0gMTsKLQkJfQotCX0KLQljbGVhcl9wYXNzKCk7Ci0KLWRvbmU6Ci0Jc3NoX2Nsb3NlX2F1dGhlbnRpY2F0aW9uX2Nvbm5lY3Rpb24oYWMpOwotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9zc2gtYWdlbnQuMCBiL3NzaC1hZ2VudC4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFmNDkwLi4wMDAwMDAwCi0tLSBhL3NzaC1hZ2VudC4wCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLVNTSC1BR0VOVCgxKSAgICAgICAgICAgICAgIE9wZW5CU0QgUmVmZXJlbmNlIE1hbnVhbCAgICAgICAgICAgICAgIFNTSC1BR0VOVCgxKQotCi1OQU1FCi0gICAgIHNzaC1hZ2VudCAtIGF1dGhlbnRpY2F0aW9uIGFnZW50Ci0KLVNZTk9QU0lTCi0gICAgIHNzaC1hZ2VudCBbLWMgfCAtc10gWy1kXSBbLWEgYmluZF9hZGRyZXNzXSBbLXQgbGlmZV0gW2NvbW1hbmQgW2FyZyAuLi5dXQotICAgICBzc2gtYWdlbnQgWy1jIHwgLXNdIC1rCi0KLURFU0NSSVBUSU9OCi0gICAgIHNzaC1hZ2VudCBpcyBhIHByb2dyYW0gdG8gaG9sZCBwcml2YXRlIGtleXMgdXNlZCBmb3IgcHVibGljIGtleQotICAgICBhdXRoZW50aWNhdGlvbiAoUlNBLCBEU0EsIEVDRFNBKS4gIFRoZSBpZGVhIGlzIHRoYXQgc3NoLWFnZW50IGlzIHN0YXJ0ZWQKLSAgICAgaW4gdGhlIGJlZ2lubmluZyBvZiBhbiBYLXNlc3Npb24gb3IgYSBsb2dpbiBzZXNzaW9uLCBhbmQgYWxsIG90aGVyCi0gICAgIHdpbmRvd3Mgb3IgcHJvZ3JhbXMgYXJlIHN0YXJ0ZWQgYXMgY2xpZW50cyB0byB0aGUgc3NoLWFnZW50IHByb2dyYW0uCi0gICAgIFRocm91Z2ggdXNlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGUgYWdlbnQgY2FuIGJlIGxvY2F0ZWQgYW5kCi0gICAgIGF1dG9tYXRpY2FsbHkgdXNlZCBmb3IgYXV0aGVudGljYXRpb24gd2hlbiBsb2dnaW5nIGluIHRvIG90aGVyIG1hY2hpbmVzCi0gICAgIHVzaW5nIHNzaCgxKS4KLQotICAgICBUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czoKLQotICAgICAtYSBiaW5kX2FkZHJlc3MKLSAgICAgICAgICAgICBCaW5kIHRoZSBhZ2VudCB0byB0aGUgVU5JWC1kb21haW4gc29ja2V0IGJpbmRfYWRkcmVzcy4gIFRoZQotICAgICAgICAgICAgIGRlZmF1bHQgaXMgJFRNUERJUi9zc2gtWFhYWFhYWFhYWC9hZ2VudC48cHBpZD4uCi0KLSAgICAgLWMgICAgICBHZW5lcmF0ZSBDLXNoZWxsIGNvbW1hbmRzIG9uIHN0ZG91dC4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgaWYKLSAgICAgICAgICAgICBTSEVMTCBsb29rcyBsaWtlIGl0J3MgYSBjc2ggc3R5bGUgb2Ygc2hlbGwuCi0KLSAgICAgLWQgICAgICBEZWJ1ZyBtb2RlLiAgV2hlbiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQgc3NoLWFnZW50IHdpbGwgbm90Ci0gICAgICAgICAgICAgZm9yay4KLQotICAgICAtayAgICAgIEtpbGwgdGhlIGN1cnJlbnQgYWdlbnQgKGdpdmVuIGJ5IHRoZSBTU0hfQUdFTlRfUElEIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgdmFyaWFibGUpLgotCi0gICAgIC1zICAgICAgR2VuZXJhdGUgQm91cm5lIHNoZWxsIGNvbW1hbmRzIG9uIHN0ZG91dC4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgaWYKLSAgICAgICAgICAgICBTSEVMTCBkb2VzIG5vdCBsb29rIGxpa2UgaXQncyBhIGNzaCBzdHlsZSBvZiBzaGVsbC4KLQotICAgICAtdCBsaWZlCi0gICAgICAgICAgICAgU2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG1heGltdW0gbGlmZXRpbWUgb2YgaWRlbnRpdGllcyBhZGRlZAotICAgICAgICAgICAgIHRvIHRoZSBhZ2VudC4gIFRoZSBsaWZldGltZSBtYXkgYmUgc3BlY2lmaWVkIGluIHNlY29uZHMgb3IgaW4gYQotICAgICAgICAgICAgIHRpbWUgZm9ybWF0IHNwZWNpZmllZCBpbiBzc2hkX2NvbmZpZyg1KS4gIEEgbGlmZXRpbWUgc3BlY2lmaWVkCi0gICAgICAgICAgICAgZm9yIGFuIGlkZW50aXR5IHdpdGggc3NoLWFkZCgxKSBvdmVycmlkZXMgdGhpcyB2YWx1ZS4gIFdpdGhvdXQKLSAgICAgICAgICAgICB0aGlzIG9wdGlvbiB0aGUgZGVmYXVsdCBtYXhpbXVtIGxpZmV0aW1lIGlzIGZvcmV2ZXIuCi0KLSAgICAgSWYgYSBjb21tYW5kbGluZSBpcyBnaXZlbiwgdGhpcyBpcyBleGVjdXRlZCBhcyBhIHN1YnByb2Nlc3Mgb2YgdGhlIGFnZW50LgotICAgICBXaGVuIHRoZSBjb21tYW5kIGRpZXMsIHNvIGRvZXMgdGhlIGFnZW50LgotCi0gICAgIFRoZSBhZ2VudCBpbml0aWFsbHkgZG9lcyBub3QgaGF2ZSBhbnkgcHJpdmF0ZSBrZXlzLiAgS2V5cyBhcmUgYWRkZWQgdXNpbmcKLSAgICAgc3NoLWFkZCgxKS4gIFdoZW4gZXhlY3V0ZWQgd2l0aG91dCBhcmd1bWVudHMsIHNzaC1hZGQoMSkgYWRkcyB0aGUgZmlsZXMKLSAgICAgfi8uc3NoL2lkX3JzYSwgfi8uc3NoL2lkX2RzYSwgfi8uc3NoL2lkX2VjZHNhIGFuZCB+Ly5zc2gvaWRlbnRpdHkuICBJZgotICAgICB0aGUgaWRlbnRpdHkgaGFzIGEgcGFzc3BocmFzZSwgc3NoLWFkZCgxKSBhc2tzIGZvciB0aGUgcGFzc3BocmFzZSBvbiB0aGUKLSAgICAgdGVybWluYWwgaWYgaXQgaGFzIG9uZSBvciBmcm9tIGEgc21hbGwgWDExIHByb2dyYW0gaWYgcnVubmluZyB1bmRlciBYMTEuCi0gICAgIElmIG5laXRoZXIgb2YgdGhlc2UgaXMgdGhlIGNhc2UgdGhlbiB0aGUgYXV0aGVudGljYXRpb24gd2lsbCBmYWlsLiAgSXQKLSAgICAgdGhlbiBzZW5kcyB0aGUgaWRlbnRpdHkgdG8gdGhlIGFnZW50LiAgU2V2ZXJhbCBpZGVudGl0aWVzIGNhbiBiZSBzdG9yZWQKLSAgICAgaW4gdGhlIGFnZW50OyB0aGUgYWdlbnQgY2FuIGF1dG9tYXRpY2FsbHkgdXNlIGFueSBvZiB0aGVzZSBpZGVudGl0aWVzLgotICAgICBzc2gtYWRkIC1sIGRpc3BsYXlzIHRoZSBpZGVudGl0aWVzIGN1cnJlbnRseSBoZWxkIGJ5IHRoZSBhZ2VudC4KLQotICAgICBUaGUgaWRlYSBpcyB0aGF0IHRoZSBhZ2VudCBpcyBydW4gaW4gdGhlIHVzZXIncyBsb2NhbCBQQywgbGFwdG9wLCBvcgotICAgICB0ZXJtaW5hbC4gIEF1dGhlbnRpY2F0aW9uIGRhdGEgbmVlZCBub3QgYmUgc3RvcmVkIG9uIGFueSBvdGhlciBtYWNoaW5lLAotICAgICBhbmQgYXV0aGVudGljYXRpb24gcGFzc3BocmFzZXMgbmV2ZXIgZ28gb3ZlciB0aGUgbmV0d29yay4gIEhvd2V2ZXIsIHRoZQotICAgICBjb25uZWN0aW9uIHRvIHRoZSBhZ2VudCBpcyBmb3J3YXJkZWQgb3ZlciBTU0ggcmVtb3RlIGxvZ2lucywgYW5kIHRoZSB1c2VyCi0gICAgIGNhbiB0aHVzIHVzZSB0aGUgcHJpdmlsZWdlcyBnaXZlbiBieSB0aGUgaWRlbnRpdGllcyBhbnl3aGVyZSBpbiB0aGUKLSAgICAgbmV0d29yayBpbiBhIHNlY3VyZSB3YXkuCi0KLSAgICAgVGhlcmUgYXJlIHR3byBtYWluIHdheXMgdG8gZ2V0IGFuIGFnZW50IHNldCB1cDogVGhlIGZpcnN0IGlzIHRoYXQgdGhlCi0gICAgIGFnZW50IHN0YXJ0cyBhIG5ldyBzdWJjb21tYW5kIGludG8gd2hpY2ggc29tZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlCi0gICAgIGV4cG9ydGVkLCBlZyBzc2gtYWdlbnQgeHRlcm0gJi4gIFRoZSBzZWNvbmQgaXMgdGhhdCB0aGUgYWdlbnQgcHJpbnRzIHRoZQotICAgICBuZWVkZWQgc2hlbGwgY29tbWFuZHMgKGVpdGhlciBzaCgxKSBvciBjc2goMSkgc3ludGF4IGNhbiBiZSBnZW5lcmF0ZWQpCi0gICAgIHdoaWNoIGNhbiBiZSBldmFsdWF0ZWQgaW4gdGhlIGNhbGxpbmcgc2hlbGwsIGVnIGV2YWwgYHNzaC1hZ2VudCAtc2AgZm9yCi0gICAgIEJvdXJuZS10eXBlIHNoZWxscyBzdWNoIGFzIHNoKDEpIG9yIGtzaCgxKSBhbmQgZXZhbCBgc3NoLWFnZW50IC1jYCBmb3IKLSAgICAgY3NoKDEpIGFuZCBkZXJpdmF0aXZlcy4KLQotICAgICBMYXRlciBzc2goMSkgbG9va3MgYXQgdGhlc2UgdmFyaWFibGVzIGFuZCB1c2VzIHRoZW0gdG8gZXN0YWJsaXNoIGEKLSAgICAgY29ubmVjdGlvbiB0byB0aGUgYWdlbnQuCi0KLSAgICAgVGhlIGFnZW50IHdpbGwgbmV2ZXIgc2VuZCBhIHByaXZhdGUga2V5IG92ZXIgaXRzIHJlcXVlc3QgY2hhbm5lbC4KLSAgICAgSW5zdGVhZCwgb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgYSBwcml2YXRlIGtleSB3aWxsIGJlIHBlcmZvcm1lZCBieSB0aGUKLSAgICAgYWdlbnQsIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIHJlcXVlc3Rlci4gIFRoaXMgd2F5LAotICAgICBwcml2YXRlIGtleXMgYXJlIG5vdCBleHBvc2VkIHRvIGNsaWVudHMgdXNpbmcgdGhlIGFnZW50LgotCi0gICAgIEEgVU5JWC1kb21haW4gc29ja2V0IGlzIGNyZWF0ZWQgYW5kIHRoZSBuYW1lIG9mIHRoaXMgc29ja2V0IGlzIHN0b3JlZCBpbgotICAgICB0aGUgU1NIX0FVVEhfU09DSyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIFRoZSBzb2NrZXQgaXMgbWFkZSBhY2Nlc3NpYmxlCi0gICAgIG9ubHkgdG8gdGhlIGN1cnJlbnQgdXNlci4gIFRoaXMgbWV0aG9kIGlzIGVhc2lseSBhYnVzZWQgYnkgcm9vdCBvcgotICAgICBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSBzYW1lIHVzZXIuCi0KLSAgICAgVGhlIFNTSF9BR0VOVF9QSUQgZW52aXJvbm1lbnQgdmFyaWFibGUgaG9sZHMgdGhlIGFnZW50J3MgcHJvY2VzcyBJRC4KLQotICAgICBUaGUgYWdlbnQgZXhpdHMgYXV0b21hdGljYWxseSB3aGVuIHRoZSBjb21tYW5kIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUKLSAgICAgdGVybWluYXRlcy4KLQotRklMRVMKLSAgICAgfi8uc3NoL2lkZW50aXR5Ci0gICAgICAgICAgICAgQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMSBSU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YKLSAgICAgICAgICAgICB0aGUgdXNlci4KLQotICAgICB+Ly5zc2gvaWRfZHNhCi0gICAgICAgICAgICAgQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMiBEU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YKLSAgICAgICAgICAgICB0aGUgdXNlci4KLQotICAgICB+Ly5zc2gvaWRfZWNkc2EKLSAgICAgICAgICAgICBDb250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAyIEVDRFNBIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IG9mCi0gICAgICAgICAgICAgdGhlIHVzZXIuCi0KLSAgICAgfi8uc3NoL2lkX3JzYQotICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDIgUlNBIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IG9mCi0gICAgICAgICAgICAgdGhlIHVzZXIuCi0KLSAgICAgJFRNUERJUi9zc2gtWFhYWFhYWFhYWC9hZ2VudC48cHBpZD4KLSAgICAgICAgICAgICBVTklYLWRvbWFpbiBzb2NrZXRzIHVzZWQgdG8gY29udGFpbiB0aGUgY29ubmVjdGlvbiB0byB0aGUKLSAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbiBhZ2VudC4gIFRoZXNlIHNvY2tldHMgc2hvdWxkIG9ubHkgYmUgcmVhZGFibGUgYnkKLSAgICAgICAgICAgICB0aGUgb3duZXIuICBUaGUgc29ja2V0cyBzaG91bGQgZ2V0IGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB3aGVuIHRoZQotICAgICAgICAgICAgIGFnZW50IGV4aXRzLgotCi1TRUUgQUxTTwotICAgICBzc2goMSksIHNzaC1hZGQoMSksIHNzaC1rZXlnZW4oMSksIHNzaGQoOCkKLQotQVVUSE9SUwotICAgICBPcGVuU1NIIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgYW5kIGZyZWUgc3NoIDEuMi4xMiByZWxlYXNlIGJ5Ci0gICAgIFRhdHUgWWxvbmVuLiAgQWFyb24gQ2FtcGJlbGwsIEJvYiBCZWNrLCBNYXJrdXMgRnJpZWRsLCBOaWVscyBQcm92b3MsIFRoZW8KLSAgICAgZGUgUmFhZHQgYW5kIER1ZyBTb25nIHJlbW92ZWQgbWFueSBidWdzLCByZS1hZGRlZCBuZXdlciBmZWF0dXJlcyBhbmQKLSAgICAgY3JlYXRlZCBPcGVuU1NILiAgTWFya3VzIEZyaWVkbCBjb250cmlidXRlZCB0aGUgc3VwcG9ydCBmb3IgU1NIIHByb3RvY29sCi0gICAgIHZlcnNpb25zIDEuNSBhbmQgMi4wLgotCi1PcGVuQlNEIDUuMCAgICAgICAgICAgICAgICAgICAgTm92ZW1iZXIgMjEsIDIwMTAgICAgICAgICAgICAgICAgICAgT3BlbkJTRCA1LjAKZGlmZiAtLWdpdCBhL3NzaC1hZ2VudC4xIGIvc3NoLWFnZW50LjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODAxYzkuLjAwMDAwMDAKLS0tIGEvc3NoLWFnZW50LjEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLlwiICRPcGVuQlNEOiBzc2gtYWdlbnQuMSx2IDEuNTMgMjAxMC8xMS8yMSAwMTowMToxMyBkam0gRXhwICQKLS5cIgotLlwiIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0uXCIgQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLS5cIiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotLlwiCi0uXCIgQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotLlwiIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0uXCIgc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotLlwiIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLS5cIiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0uXCIKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTkgQWFyb24gQ2FtcGJlbGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiIENvcHlyaWdodCAoYykgMTk5OSBUaGVvIGRlIFJhYWR0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIgotLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotLlwiIGFyZSBtZXQ6Ci0uXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0uXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0uXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0uXCIgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotLlwiIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0uXCIgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotLlwiIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS5cIiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS5cIiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0uXCIgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0uXCIgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS5cIgotLkRkICRNZG9jZGF0ZTogTm92ZW1iZXIgMjEgMjAxMCAkCi0uRHQgU1NILUFHRU5UIDEKLS5PcwotLlNoIE5BTUUKLS5ObSBzc2gtYWdlbnQKLS5OZCBhdXRoZW50aWNhdGlvbiBhZ2VudAotLlNoIFNZTk9QU0lTCi0uTm0gc3NoLWFnZW50Ci0uT3AgRmwgYyB8IHMKLS5PcCBGbCBkCi0uT3AgRmwgYSBBciBiaW5kX2FkZHJlc3MKLS5PcCBGbCB0IEFyIGxpZmUKLS5PcCBBciBjb21tYW5kIE9wIEFyIGFyZyAuLi4KLS5ObSBzc2gtYWdlbnQKLS5PcCBGbCBjIHwgcwotLkZsIGsKLS5TaCBERVNDUklQVElPTgotLk5tCi1pcyBhIHByb2dyYW0gdG8gaG9sZCBwcml2YXRlIGtleXMgdXNlZCBmb3IgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbgotKFJTQSwgRFNBLCBFQ0RTQSkuCi1UaGUgaWRlYSBpcyB0aGF0Ci0uTm0KLWlzIHN0YXJ0ZWQgaW4gdGhlIGJlZ2lubmluZyBvZiBhbiBYLXNlc3Npb24gb3IgYSBsb2dpbiBzZXNzaW9uLCBhbmQKLWFsbCBvdGhlciB3aW5kb3dzIG9yIHByb2dyYW1zIGFyZSBzdGFydGVkIGFzIGNsaWVudHMgdG8gdGhlIHNzaC1hZ2VudAotcHJvZ3JhbS4KLVRocm91Z2ggdXNlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGUgYWdlbnQgY2FuIGJlIGxvY2F0ZWQKLWFuZCBhdXRvbWF0aWNhbGx5IHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIHdoZW4gbG9nZ2luZyBpbiB0byBvdGhlcgotbWFjaGluZXMgdXNpbmcKLS5YciBzc2ggMSAuCi0uUHAKLVRoZSBvcHRpb25zIGFyZSBhcyBmb2xsb3dzOgotLkJsIC10YWcgLXdpZHRoIERzCi0uSXQgRmwgYSBBciBiaW5kX2FkZHJlc3MKLUJpbmQgdGhlIGFnZW50IHRvIHRoZQotLlV4IE5zIC1kb21haW4KLXNvY2tldAotLkFyIGJpbmRfYWRkcmVzcyAuCi1UaGUgZGVmYXVsdCBpcwotLlBhICRUTVBESVIvc3NoLVhYWFhYWFhYWFgvYWdlbnQuXCooTHRwcGlkXCooR3QgLgotLkl0IEZsIGMKLUdlbmVyYXRlIEMtc2hlbGwgY29tbWFuZHMgb24KLS5EdiBzdGRvdXQgLgotVGhpcyBpcyB0aGUgZGVmYXVsdCBpZgotLkV2IFNIRUxMCi1sb29rcyBsaWtlIGl0J3MgYSBjc2ggc3R5bGUgb2Ygc2hlbGwuCi0uSXQgRmwgZAotRGVidWcgbW9kZS4KLVdoZW4gdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkCi0uTm0KLXdpbGwgbm90IGZvcmsuCi0uSXQgRmwgawotS2lsbCB0aGUgY3VycmVudCBhZ2VudCAoZ2l2ZW4gYnkgdGhlCi0uRXYgU1NIX0FHRU5UX1BJRAotZW52aXJvbm1lbnQgdmFyaWFibGUpLgotLkl0IEZsIHMKLUdlbmVyYXRlIEJvdXJuZSBzaGVsbCBjb21tYW5kcyBvbgotLkR2IHN0ZG91dCAuCi1UaGlzIGlzIHRoZSBkZWZhdWx0IGlmCi0uRXYgU0hFTEwKLWRvZXMgbm90IGxvb2sgbGlrZSBpdCdzIGEgY3NoIHN0eWxlIG9mIHNoZWxsLgotLkl0IEZsIHQgQXIgbGlmZQotU2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG1heGltdW0gbGlmZXRpbWUgb2YgaWRlbnRpdGllcyBhZGRlZCB0byB0aGUgYWdlbnQuCi1UaGUgbGlmZXRpbWUgbWF5IGJlIHNwZWNpZmllZCBpbiBzZWNvbmRzIG9yIGluIGEgdGltZSBmb3JtYXQgc3BlY2lmaWVkIGluCi0uWHIgc3NoZF9jb25maWcgNSAuCi1BIGxpZmV0aW1lIHNwZWNpZmllZCBmb3IgYW4gaWRlbnRpdHkgd2l0aAotLlhyIHNzaC1hZGQgMQotb3ZlcnJpZGVzIHRoaXMgdmFsdWUuCi1XaXRob3V0IHRoaXMgb3B0aW9uIHRoZSBkZWZhdWx0IG1heGltdW0gbGlmZXRpbWUgaXMgZm9yZXZlci4KLS5FbAotLlBwCi1JZiBhIGNvbW1hbmRsaW5lIGlzIGdpdmVuLCB0aGlzIGlzIGV4ZWN1dGVkIGFzIGEgc3VicHJvY2VzcyBvZiB0aGUgYWdlbnQuCi1XaGVuIHRoZSBjb21tYW5kIGRpZXMsIHNvIGRvZXMgdGhlIGFnZW50LgotLlBwCi1UaGUgYWdlbnQgaW5pdGlhbGx5IGRvZXMgbm90IGhhdmUgYW55IHByaXZhdGUga2V5cy4KLUtleXMgYXJlIGFkZGVkIHVzaW5nCi0uWHIgc3NoLWFkZCAxIC4KLVdoZW4gZXhlY3V0ZWQgd2l0aG91dCBhcmd1bWVudHMsCi0uWHIgc3NoLWFkZCAxCi1hZGRzIHRoZSBmaWxlcwotLlBhIH4vLnNzaC9pZF9yc2EgLAotLlBhIH4vLnNzaC9pZF9kc2EgLAotLlBhIH4vLnNzaC9pZF9lY2RzYQotYW5kCi0uUGEgfi8uc3NoL2lkZW50aXR5IC4KLUlmIHRoZSBpZGVudGl0eSBoYXMgYSBwYXNzcGhyYXNlLAotLlhyIHNzaC1hZGQgMQotYXNrcyBmb3IgdGhlIHBhc3NwaHJhc2Ugb24gdGhlIHRlcm1pbmFsIGlmIGl0IGhhcyBvbmUgb3IgZnJvbSBhIHNtYWxsIFgxMQotcHJvZ3JhbSBpZiBydW5uaW5nIHVuZGVyIFgxMS4KLUlmIG5laXRoZXIgb2YgdGhlc2UgaXMgdGhlIGNhc2UgdGhlbiB0aGUgYXV0aGVudGljYXRpb24gd2lsbCBmYWlsLgotSXQgdGhlbiBzZW5kcyB0aGUgaWRlbnRpdHkgdG8gdGhlIGFnZW50LgotU2V2ZXJhbCBpZGVudGl0aWVzIGNhbiBiZSBzdG9yZWQgaW4gdGhlCi1hZ2VudDsgdGhlIGFnZW50IGNhbiBhdXRvbWF0aWNhbGx5IHVzZSBhbnkgb2YgdGhlc2UgaWRlbnRpdGllcy4KLS5JYyBzc2gtYWRkIC1sCi1kaXNwbGF5cyB0aGUgaWRlbnRpdGllcyBjdXJyZW50bHkgaGVsZCBieSB0aGUgYWdlbnQuCi0uUHAKLVRoZSBpZGVhIGlzIHRoYXQgdGhlIGFnZW50IGlzIHJ1biBpbiB0aGUgdXNlcidzIGxvY2FsIFBDLCBsYXB0b3AsIG9yCi10ZXJtaW5hbC4KLUF1dGhlbnRpY2F0aW9uIGRhdGEgbmVlZCBub3QgYmUgc3RvcmVkIG9uIGFueSBvdGhlcgotbWFjaGluZSwgYW5kIGF1dGhlbnRpY2F0aW9uIHBhc3NwaHJhc2VzIG5ldmVyIGdvIG92ZXIgdGhlIG5ldHdvcmsuCi1Ib3dldmVyLCB0aGUgY29ubmVjdGlvbiB0byB0aGUgYWdlbnQgaXMgZm9yd2FyZGVkIG92ZXIgU1NICi1yZW1vdGUgbG9naW5zLCBhbmQgdGhlIHVzZXIgY2FuIHRodXMgdXNlIHRoZSBwcml2aWxlZ2VzIGdpdmVuIGJ5IHRoZQotaWRlbnRpdGllcyBhbnl3aGVyZSBpbiB0aGUgbmV0d29yayBpbiBhIHNlY3VyZSB3YXkuCi0uUHAKLVRoZXJlIGFyZSB0d28gbWFpbiB3YXlzIHRvIGdldCBhbiBhZ2VudCBzZXQgdXA6Ci1UaGUgZmlyc3QgaXMgdGhhdCB0aGUgYWdlbnQgc3RhcnRzIGEgbmV3IHN1YmNvbW1hbmQgaW50byB3aGljaCBzb21lIGVudmlyb25tZW50Ci12YXJpYWJsZXMgYXJlIGV4cG9ydGVkLCBlZwotLkNtIHNzaC1hZ2VudCB4dGVybSAmIC4KLVRoZSBzZWNvbmQgaXMgdGhhdCB0aGUgYWdlbnQgcHJpbnRzIHRoZSBuZWVkZWQgc2hlbGwgY29tbWFuZHMgKGVpdGhlcgotLlhyIHNoIDEKLW9yCi0uWHIgY3NoIDEKLXN5bnRheCBjYW4gYmUgZ2VuZXJhdGVkKSB3aGljaCBjYW4gYmUgZXZhbHVhdGVkIGluIHRoZSBjYWxsaW5nIHNoZWxsLCBlZwotLkNtIGV2YWwgYHNzaC1hZ2VudCAtc2AKLWZvciBCb3VybmUtdHlwZSBzaGVsbHMgc3VjaCBhcwotLlhyIHNoIDEKLW9yCi0uWHIga3NoIDEKLWFuZAotLkNtIGV2YWwgYHNzaC1hZ2VudCAtY2AKLWZvcgotLlhyIGNzaCAxCi1hbmQgZGVyaXZhdGl2ZXMuCi0uUHAKLUxhdGVyCi0uWHIgc3NoIDEKLWxvb2tzIGF0IHRoZXNlIHZhcmlhYmxlcyBhbmQgdXNlcyB0aGVtIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gdGhlIGFnZW50LgotLlBwCi1UaGUgYWdlbnQgd2lsbCBuZXZlciBzZW5kIGEgcHJpdmF0ZSBrZXkgb3ZlciBpdHMgcmVxdWVzdCBjaGFubmVsLgotSW5zdGVhZCwgb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgYSBwcml2YXRlIGtleSB3aWxsIGJlIHBlcmZvcm1lZAotYnkgdGhlIGFnZW50LCBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSByZXF1ZXN0ZXIuCi1UaGlzIHdheSwgcHJpdmF0ZSBrZXlzIGFyZSBub3QgZXhwb3NlZCB0byBjbGllbnRzIHVzaW5nIHRoZSBhZ2VudC4KLS5QcAotQQotLlV4IE5zIC1kb21haW4KLXNvY2tldCBpcyBjcmVhdGVkIGFuZCB0aGUgbmFtZSBvZiB0aGlzIHNvY2tldCBpcyBzdG9yZWQgaW4gdGhlCi0uRXYgU1NIX0FVVEhfU09DSwotZW52aXJvbm1lbnQKLXZhcmlhYmxlLgotVGhlIHNvY2tldCBpcyBtYWRlIGFjY2Vzc2libGUgb25seSB0byB0aGUgY3VycmVudCB1c2VyLgotVGhpcyBtZXRob2QgaXMgZWFzaWx5IGFidXNlZCBieSByb290IG9yIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIHNhbWUKLXVzZXIuCi0uUHAKLVRoZQotLkV2IFNTSF9BR0VOVF9QSUQKLWVudmlyb25tZW50IHZhcmlhYmxlIGhvbGRzIHRoZSBhZ2VudCdzIHByb2Nlc3MgSUQuCi0uUHAKLVRoZSBhZ2VudCBleGl0cyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGNvbW1hbmQgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKLWxpbmUgdGVybWluYXRlcy4KLS5TaCBGSUxFUwotLkJsIC10YWcgLXdpZHRoIERzCi0uSXQgUGEgfi8uc3NoL2lkZW50aXR5Ci1Db250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAxIFJTQSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eSBvZiB0aGUgdXNlci4KLS5JdCBQYSB+Ly5zc2gvaWRfZHNhCi1Db250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAyIERTQSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eSBvZiB0aGUgdXNlci4KLS5JdCBQYSB+Ly5zc2gvaWRfZWNkc2EKLUNvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDIgRUNEU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YgdGhlIHVzZXIuCi0uSXQgUGEgfi8uc3NoL2lkX3JzYQotQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMiBSU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YgdGhlIHVzZXIuCi0uSXQgUGEgJFRNUERJUi9zc2gtWFhYWFhYWFhYWC9hZ2VudC5cKihMdHBwaWRcKihHdAotLlV4IE5zIC1kb21haW4KLXNvY2tldHMgdXNlZCB0byBjb250YWluIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudC4KLVRoZXNlIHNvY2tldHMgc2hvdWxkIG9ubHkgYmUgcmVhZGFibGUgYnkgdGhlIG93bmVyLgotVGhlIHNvY2tldHMgc2hvdWxkIGdldCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiB0aGUgYWdlbnQgZXhpdHMuCi0uRWwKLS5TaCBTRUUgQUxTTwotLlhyIHNzaCAxICwKLS5YciBzc2gtYWRkIDEgLAotLlhyIHNzaC1rZXlnZW4gMSAsCi0uWHIgc3NoZCA4Ci0uU2ggQVVUSE9SUwotT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlCi1zc2ggMS4yLjEyIHJlbGVhc2UgYnkgVGF0dSBZbG9uZW4uCi1BYXJvbiBDYW1wYmVsbCwgQm9iIEJlY2ssIE1hcmt1cyBGcmllZGwsIE5pZWxzIFByb3ZvcywKLVRoZW8gZGUgUmFhZHQgYW5kIER1ZyBTb25nCi1yZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCi1jcmVhdGVkIE9wZW5TU0guCi1NYXJrdXMgRnJpZWRsIGNvbnRyaWJ1dGVkIHRoZSBzdXBwb3J0IGZvciBTU0gKLXByb3RvY29sIHZlcnNpb25zIDEuNSBhbmQgMi4wLgpkaWZmIC0tZ2l0IGEvc3NoLWFnZW50LmMgYi9zc2gtYWdlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0OThlNi4uMDAwMDAwMAotLS0gYS9zc2gtYWdlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNzMgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNzaC1hZ2VudC5jLHYgMS4xNzIgMjAxMS8wNi8wMyAwMTozNzo0MCBkdHVja2VyIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogVGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50IHByb2dyYW0uCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19VTl9ICi0jIGluY2x1ZGUgPHN5cy91bi5oPgotI2VuZGlmCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgiCi0KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+Ci0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZmRlZiBIQVZFX1BBVEhTX0gKLSMgaW5jbHVkZSA8cGF0aHMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgInJzYS5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImF1dGhmZC5oIgotI2luY2x1ZGUgImNvbXBhdC5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLQotI2lmZGVmIEVOQUJMRV9QS0NTMTEKLSNpbmNsdWRlICJzc2gtcGtjczExLmgiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoSEFWRV9TWVNfUFJDVExfSCkKLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4JLyogRm9yIHByY3RsKCkgYW5kIFBSX1NFVF9EVU1QQUJMRSAqLwotI2VuZGlmCi0KLXR5cGVkZWYgZW51bSB7Ci0JQVVUSF9VTlVTRUQsCi0JQVVUSF9TT0NLRVQsCi0JQVVUSF9DT05ORUNUSU9OCi19IHNvY2tfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBmZDsKLQlzb2NrX3R5cGUgdHlwZTsKLQlCdWZmZXIgaW5wdXQ7Ci0JQnVmZmVyIG91dHB1dDsKLQlCdWZmZXIgcmVxdWVzdDsKLX0gU29ja2V0RW50cnk7Ci0KLXVfaW50IHNvY2tldHNfYWxsb2MgPSAwOwotU29ja2V0RW50cnkgKnNvY2tldHMgPSBOVUxMOwotCi10eXBlZGVmIHN0cnVjdCBpZGVudGl0eSB7Ci0JVEFJTFFfRU5UUlkoaWRlbnRpdHkpIG5leHQ7Ci0JS2V5ICprZXk7Ci0JY2hhciAqY29tbWVudDsKLQljaGFyICpwcm92aWRlcjsKLQl1X2ludCBkZWF0aDsKLQl1X2ludCBjb25maXJtOwotfSBJZGVudGl0eTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBuZW50cmllczsKLQlUQUlMUV9IRUFEKGlkcXVldWUsIGlkZW50aXR5KSBpZGxpc3Q7Ci19IElkdGFiOwotCi0vKiBwcml2YXRlIGtleSB0YWJsZSwgb25lIHBlciBwcm90b2NvbCB2ZXJzaW9uICovCi1JZHRhYiBpZHRhYmxlWzNdOwotCi1pbnQgbWF4X2ZkID0gMDsKLQotLyogcGlkIG9mIHNoZWxsID09IHBhcmVudCBvZiBhZ2VudCAqLwotcGlkX3QgcGFyZW50X3BpZCA9IC0xOwotdV9pbnQgcGFyZW50X2FsaXZlX2ludGVydmFsID0gMDsKLQotLyogcGF0aG5hbWUgYW5kIGRpcmVjdG9yeSBmb3IgQVVUSF9TT0NLRVQgKi8KLWNoYXIgc29ja2V0X25hbWVbTUFYUEFUSExFTl07Ci1jaGFyIHNvY2tldF9kaXJbTUFYUEFUSExFTl07Ci0KLS8qIGxvY2tpbmcgKi8KLWludCBsb2NrZWQgPSAwOwotY2hhciAqbG9ja19wYXNzd2QgPSBOVUxMOwotCi1leHRlcm4gY2hhciAqX19wcm9nbmFtZTsKLQotLyogRGVmYXVsdCBsaWZldGltZSAoMCA9PSBmb3JldmVyKSAqLwotc3RhdGljIGludCBsaWZldGltZSA9IDA7Ci0KLXN0YXRpYyB2b2lkCi1jbG9zZV9zb2NrZXQoU29ja2V0RW50cnkgKmUpCi17Ci0JY2xvc2UoZS0+ZmQpOwotCWUtPmZkID0gLTE7Ci0JZS0+dHlwZSA9IEFVVEhfVU5VU0VEOwotCWJ1ZmZlcl9mcmVlKCZlLT5pbnB1dCk7Ci0JYnVmZmVyX2ZyZWUoJmUtPm91dHB1dCk7Ci0JYnVmZmVyX2ZyZWUoJmUtPnJlcXVlc3QpOwotfQotCi1zdGF0aWMgdm9pZAotaWR0YWJfaW5pdCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8PTI7IGkrKykgewotCQlUQUlMUV9JTklUKCZpZHRhYmxlW2ldLmlkbGlzdCk7Ci0JCWlkdGFibGVbaV0ubmVudHJpZXMgPSAwOwotCX0KLX0KLQotLyogcmV0dXJuIHByaXZhdGUga2V5IHRhYmxlIGZvciByZXF1ZXN0ZWQgcHJvdG9jb2wgdmVyc2lvbiAqLwotc3RhdGljIElkdGFiICoKLWlkdGFiX2xvb2t1cChpbnQgdmVyc2lvbikKLXsKLQlpZiAodmVyc2lvbiA8IDEgfHwgdmVyc2lvbiA+IDIpCi0JCWZhdGFsKCJpbnRlcm5hbCBlcnJvciwgYmFkIHByb3RvY29sIHZlcnNpb24gJWQiLCB2ZXJzaW9uKTsKLQlyZXR1cm4gJmlkdGFibGVbdmVyc2lvbl07Ci19Ci0KLXN0YXRpYyB2b2lkCi1mcmVlX2lkZW50aXR5KElkZW50aXR5ICppZCkKLXsKLQlrZXlfZnJlZShpZC0+a2V5KTsKLQlpZiAoaWQtPnByb3ZpZGVyICE9IE5VTEwpCi0JCXhmcmVlKGlkLT5wcm92aWRlcik7Ci0JeGZyZWUoaWQtPmNvbW1lbnQpOwotCXhmcmVlKGlkKTsKLX0KLQotLyogcmV0dXJuIG1hdGNoaW5nIHByaXZhdGUga2V5IGZvciBnaXZlbiBwdWJsaWMga2V5ICovCi1zdGF0aWMgSWRlbnRpdHkgKgotbG9va3VwX2lkZW50aXR5KEtleSAqa2V5LCBpbnQgdmVyc2lvbikKLXsKLQlJZGVudGl0eSAqaWQ7Ci0KLQlJZHRhYiAqdGFiID0gaWR0YWJfbG9va3VwKHZlcnNpb24pOwotCVRBSUxRX0ZPUkVBQ0goaWQsICZ0YWItPmlkbGlzdCwgbmV4dCkgewotCQlpZiAoa2V5X2VxdWFsKGtleSwgaWQtPmtleSkpCi0JCQlyZXR1cm4gKGlkKTsKLQl9Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotLyogQ2hlY2sgY29uZmlybWF0aW9uIG9mIGtleXNpZ24gcmVxdWVzdCAqLwotc3RhdGljIGludAotY29uZmlybV9rZXkoSWRlbnRpdHkgKmlkKQotewotCWNoYXIgKnA7Ci0JaW50IHJldCA9IC0xOwotCi0JcCA9IGtleV9maW5nZXJwcmludChpZC0+a2V5LCBTU0hfRlBfTUQ1LCBTU0hfRlBfSEVYKTsKLQlpZiAoYXNrX3Blcm1pc3Npb24oIkFsbG93IHVzZSBvZiBrZXkgJXM/XG5LZXkgZmluZ2VycHJpbnQgJXMuIiwKLQkgICAgaWQtPmNvbW1lbnQsIHApKQotCQlyZXQgPSAwOwotCXhmcmVlKHApOwotCi0JcmV0dXJuIChyZXQpOwotfQotCi0vKiBzZW5kIGxpc3Qgb2Ygc3VwcG9ydGVkIHB1YmxpYyBrZXlzIHRvICdjbGllbnQnICovCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19yZXF1ZXN0X2lkZW50aXRpZXMoU29ja2V0RW50cnkgKmUsIGludCB2ZXJzaW9uKQotewotCUlkdGFiICp0YWIgPSBpZHRhYl9sb29rdXAodmVyc2lvbik7Ci0JSWRlbnRpdHkgKmlkOwotCUJ1ZmZlciBtc2c7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQlidWZmZXJfcHV0X2NoYXIoJm1zZywgKHZlcnNpb24gPT0gMSkgPwotCSAgICBTU0hfQUdFTlRfUlNBX0lERU5USVRJRVNfQU5TV0VSIDogU1NIMl9BR0VOVF9JREVOVElUSUVTX0FOU1dFUik7Ci0JYnVmZmVyX3B1dF9pbnQoJm1zZywgdGFiLT5uZW50cmllcyk7Ci0JVEFJTFFfRk9SRUFDSChpZCwgJnRhYi0+aWRsaXN0LCBuZXh0KSB7Ci0JCWlmIChpZC0+a2V5LT50eXBlID09IEtFWV9SU0ExKSB7Ci0JCQlidWZmZXJfcHV0X2ludCgmbXNnLCBCTl9udW1fYml0cyhpZC0+a2V5LT5yc2EtPm4pKTsKLQkJCWJ1ZmZlcl9wdXRfYmlnbnVtKCZtc2csIGlkLT5rZXktPnJzYS0+ZSk7Ci0JCQlidWZmZXJfcHV0X2JpZ251bSgmbXNnLCBpZC0+a2V5LT5yc2EtPm4pOwotCQl9IGVsc2UgewotCQkJdV9jaGFyICpibG9iOwotCQkJdV9pbnQgYmxlbjsKLQkJCWtleV90b19ibG9iKGlkLT5rZXksICZibG9iLCAmYmxlbik7Ci0JCQlidWZmZXJfcHV0X3N0cmluZygmbXNnLCBibG9iLCBibGVuKTsKLQkJCXhmcmVlKGJsb2IpOwotCQl9Ci0JCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCBpZC0+Y29tbWVudCk7Ci0JfQotCWJ1ZmZlcl9wdXRfaW50KCZlLT5vdXRwdXQsIGJ1ZmZlcl9sZW4oJm1zZykpOwotCWJ1ZmZlcl9hcHBlbmQoJmUtPm91dHB1dCwgYnVmZmVyX3B0cigmbXNnKSwgYnVmZmVyX2xlbigmbXNnKSk7Ci0JYnVmZmVyX2ZyZWUoJm1zZyk7Ci19Ci0KLS8qIHNzaDEgb25seSAqLwotc3RhdGljIHZvaWQKLXByb2Nlc3NfYXV0aGVudGljYXRpb25fY2hhbGxlbmdlMShTb2NrZXRFbnRyeSAqZSkKLXsKLQl1X2NoYXIgYnVmWzMyXSwgbWRidWZbMTZdLCBzZXNzaW9uX2lkWzE2XTsKLQl1X2ludCByZXNwb25zZV90eXBlOwotCUJJR05VTSAqY2hhbGxlbmdlOwotCUlkZW50aXR5ICppZDsKLQlpbnQgaSwgbGVuOwotCUJ1ZmZlciBtc2c7Ci0JTUQ1X0NUWCBtZDsKLQlLZXkgKmtleTsKLQotCWJ1ZmZlcl9pbml0KCZtc2cpOwotCWtleSA9IGtleV9uZXcoS0VZX1JTQTEpOwotCWlmICgoY2hhbGxlbmdlID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJwcm9jZXNzX2F1dGhlbnRpY2F0aW9uX2NoYWxsZW5nZTE6IEJOX25ldyBmYWlsZWQiKTsKLQotCSh2b2lkKSBidWZmZXJfZ2V0X2ludCgmZS0+cmVxdWVzdCk7CQkJLyogaWdub3JlZCAqLwotCWJ1ZmZlcl9nZXRfYmlnbnVtKCZlLT5yZXF1ZXN0LCBrZXktPnJzYS0+ZSk7Ci0JYnVmZmVyX2dldF9iaWdudW0oJmUtPnJlcXVlc3QsIGtleS0+cnNhLT5uKTsKLQlidWZmZXJfZ2V0X2JpZ251bSgmZS0+cmVxdWVzdCwgY2hhbGxlbmdlKTsKLQotCS8qIE9ubHkgcHJvdG9jb2wgMS4xIGlzIHN1cHBvcnRlZCAqLwotCWlmIChidWZmZXJfbGVuKCZlLT5yZXF1ZXN0KSA9PSAwKQotCQlnb3RvIGZhaWx1cmU7Ci0JYnVmZmVyX2dldCgmZS0+cmVxdWVzdCwgc2Vzc2lvbl9pZCwgMTYpOwotCXJlc3BvbnNlX3R5cGUgPSBidWZmZXJfZ2V0X2ludCgmZS0+cmVxdWVzdCk7Ci0JaWYgKHJlc3BvbnNlX3R5cGUgIT0gMSkKLQkJZ290byBmYWlsdXJlOwotCi0JaWQgPSBsb29rdXBfaWRlbnRpdHkoa2V5LCAxKTsKLQlpZiAoaWQgIT0gTlVMTCAmJiAoIWlkLT5jb25maXJtIHx8IGNvbmZpcm1fa2V5KGlkKSA9PSAwKSkgewotCQlLZXkgKnByaXZhdGUgPSBpZC0+a2V5OwotCQkvKiBEZWNyeXB0IHRoZSBjaGFsbGVuZ2UgdXNpbmcgdGhlIHByaXZhdGUga2V5LiAqLwotCQlpZiAocnNhX3ByaXZhdGVfZGVjcnlwdChjaGFsbGVuZ2UsIGNoYWxsZW5nZSwgcHJpdmF0ZS0+cnNhKSA8PSAwKQotCQkJZ290byBmYWlsdXJlOwotCi0JCS8qIFRoZSByZXNwb25zZSBpcyBNRDUgb2YgZGVjcnlwdGVkIGNoYWxsZW5nZSBwbHVzIHNlc3Npb24gaWQuICovCi0JCWxlbiA9IEJOX251bV9ieXRlcyhjaGFsbGVuZ2UpOwotCQlpZiAobGVuIDw9IDAgfHwgbGVuID4gMzIpIHsKLQkJCWxvZ2l0KCJwcm9jZXNzX2F1dGhlbnRpY2F0aW9uX2NoYWxsZW5nZTogYmFkIGNoYWxsZW5nZSBsZW5ndGggJWQiLCBsZW4pOwotCQkJZ290byBmYWlsdXJlOwotCQl9Ci0JCW1lbXNldChidWYsIDAsIDMyKTsKLQkJQk5fYm4yYmluKGNoYWxsZW5nZSwgYnVmICsgMzIgLSBsZW4pOwotCQlNRDVfSW5pdCgmbWQpOwotCQlNRDVfVXBkYXRlKCZtZCwgYnVmLCAzMik7Ci0JCU1ENV9VcGRhdGUoJm1kLCBzZXNzaW9uX2lkLCAxNik7Ci0JCU1ENV9GaW5hbChtZGJ1ZiwgJm1kKTsKLQotCQkvKiBTZW5kIHRoZSByZXNwb25zZS4gKi8KLQkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSF9BR0VOVF9SU0FfUkVTUE9OU0UpOwotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBtZGJ1ZltpXSk7Ci0JCWdvdG8gc2VuZDsKLQl9Ci0KLWZhaWx1cmU6Ci0JLyogVW5rbm93biBpZGVudGl0eSBvciBwcm90b2NvbCBlcnJvci4gIFNlbmQgZmFpbHVyZS4gKi8KLQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIX0FHRU5UX0ZBSUxVUkUpOwotc2VuZDoKLQlidWZmZXJfcHV0X2ludCgmZS0+b3V0cHV0LCBidWZmZXJfbGVuKCZtc2cpKTsKLQlidWZmZXJfYXBwZW5kKCZlLT5vdXRwdXQsIGJ1ZmZlcl9wdHIoJm1zZyksIGJ1ZmZlcl9sZW4oJm1zZykpOwotCWtleV9mcmVlKGtleSk7Ci0JQk5fY2xlYXJfZnJlZShjaGFsbGVuZ2UpOwotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotfQotCi0vKiBzc2gyIG9ubHkgKi8KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX3NpZ25fcmVxdWVzdDIoU29ja2V0RW50cnkgKmUpCi17Ci0JdV9jaGFyICpibG9iLCAqZGF0YSwgKnNpZ25hdHVyZSA9IE5VTEw7Ci0JdV9pbnQgYmxlbiwgZGxlbiwgc2xlbiA9IDA7Ci0JZXh0ZXJuIGludCBkYXRhZmVsbG93czsKLQlpbnQgb2RhdGFmZWxsb3dzOwotCWludCBvayA9IC0xLCBmbGFnczsKLQlCdWZmZXIgbXNnOwotCUtleSAqa2V5OwotCi0JZGF0YWZlbGxvd3MgPSAwOwotCi0JYmxvYiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZlLT5yZXF1ZXN0LCAmYmxlbik7Ci0JZGF0YSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZlLT5yZXF1ZXN0LCAmZGxlbik7Ci0KLQlmbGFncyA9IGJ1ZmZlcl9nZXRfaW50KCZlLT5yZXF1ZXN0KTsKLQlvZGF0YWZlbGxvd3MgPSBkYXRhZmVsbG93czsKLQlpZiAoZmxhZ3MgJiBTU0hfQUdFTlRfT0xEX1NJR05BVFVSRSkKLQkJZGF0YWZlbGxvd3MgPSBTU0hfQlVHX1NJR0JMT0I7Ci0KLQlrZXkgPSBrZXlfZnJvbV9ibG9iKGJsb2IsIGJsZW4pOwotCWlmIChrZXkgIT0gTlVMTCkgewotCQlJZGVudGl0eSAqaWQgPSBsb29rdXBfaWRlbnRpdHkoa2V5LCAyKTsKLQkJaWYgKGlkICE9IE5VTEwgJiYgKCFpZC0+Y29uZmlybSB8fCBjb25maXJtX2tleShpZCkgPT0gMCkpCi0JCQlvayA9IGtleV9zaWduKGlkLT5rZXksICZzaWduYXR1cmUsICZzbGVuLCBkYXRhLCBkbGVuKTsKLQkJa2V5X2ZyZWUoa2V5KTsKLQl9Ci0JYnVmZmVyX2luaXQoJm1zZyk7Ci0JaWYgKG9rID09IDApIHsKLQkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfQUdFTlRfU0lHTl9SRVNQT05TRSk7Ci0JCWJ1ZmZlcl9wdXRfc3RyaW5nKCZtc2csIHNpZ25hdHVyZSwgc2xlbik7Ci0JfSBlbHNlIHsKLQkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSF9BR0VOVF9GQUlMVVJFKTsKLQl9Ci0JYnVmZmVyX3B1dF9pbnQoJmUtPm91dHB1dCwgYnVmZmVyX2xlbigmbXNnKSk7Ci0JYnVmZmVyX2FwcGVuZCgmZS0+b3V0cHV0LCBidWZmZXJfcHRyKCZtc2cpLAotCSAgICBidWZmZXJfbGVuKCZtc2cpKTsKLQlidWZmZXJfZnJlZSgmbXNnKTsKLQl4ZnJlZShkYXRhKTsKLQl4ZnJlZShibG9iKTsKLQlpZiAoc2lnbmF0dXJlICE9IE5VTEwpCi0JCXhmcmVlKHNpZ25hdHVyZSk7Ci0JZGF0YWZlbGxvd3MgPSBvZGF0YWZlbGxvd3M7Ci19Ci0KLS8qIHNoYXJlZCAqLwotc3RhdGljIHZvaWQKLXByb2Nlc3NfcmVtb3ZlX2lkZW50aXR5KFNvY2tldEVudHJ5ICplLCBpbnQgdmVyc2lvbikKLXsKLQl1X2ludCBibGVuLCBiaXRzOwotCWludCBzdWNjZXNzID0gMDsKLQlLZXkgKmtleSA9IE5VTEw7Ci0JdV9jaGFyICpibG9iOwotCi0Jc3dpdGNoICh2ZXJzaW9uKSB7Ci0JY2FzZSAxOgotCQlrZXkgPSBrZXlfbmV3KEtFWV9SU0ExKTsKLQkJYml0cyA9IGJ1ZmZlcl9nZXRfaW50KCZlLT5yZXF1ZXN0KTsKLQkJYnVmZmVyX2dldF9iaWdudW0oJmUtPnJlcXVlc3QsIGtleS0+cnNhLT5lKTsKLQkJYnVmZmVyX2dldF9iaWdudW0oJmUtPnJlcXVlc3QsIGtleS0+cnNhLT5uKTsKLQotCQlpZiAoYml0cyAhPSBrZXlfc2l6ZShrZXkpKQotCQkJbG9naXQoIldhcm5pbmc6IGlkZW50aXR5IGtleXNpemUgbWlzbWF0Y2g6IGFjdHVhbCAldSwgYW5ub3VuY2VkICV1IiwKLQkJCSAgICBrZXlfc2l6ZShrZXkpLCBiaXRzKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlibG9iID0gYnVmZmVyX2dldF9zdHJpbmcoJmUtPnJlcXVlc3QsICZibGVuKTsKLQkJa2V5ID0ga2V5X2Zyb21fYmxvYihibG9iLCBibGVuKTsKLQkJeGZyZWUoYmxvYik7Ci0JCWJyZWFrOwotCX0KLQlpZiAoa2V5ICE9IE5VTEwpIHsKLQkJSWRlbnRpdHkgKmlkID0gbG9va3VwX2lkZW50aXR5KGtleSwgdmVyc2lvbik7Ci0JCWlmIChpZCAhPSBOVUxMKSB7Ci0JCQkvKgotCQkJICogV2UgaGF2ZSB0aGlzIGtleS4gIEZyZWUgdGhlIG9sZCBrZXkuICBTaW5jZSB3ZQotCQkJICogZG9uJ3Qgd2FudCB0byBsZWF2ZSBlbXB0eSBzbG90cyBpbiB0aGUgbWlkZGxlIG9mCi0JCQkgKiB0aGUgYXJyYXksIHdlIGFjdHVhbGx5IGZyZWUgdGhlIGtleSB0aGVyZSBhbmQgbW92ZQotCQkJICogYWxsIHRoZSBlbnRyaWVzIGJldHdlZW4gdGhlIGVtcHR5IHNsb3QgYW5kIHRoZSBlbmQKLQkJCSAqIG9mIHRoZSBhcnJheS4KLQkJCSAqLwotCQkJSWR0YWIgKnRhYiA9IGlkdGFiX2xvb2t1cCh2ZXJzaW9uKTsKLQkJCWlmICh0YWItPm5lbnRyaWVzIDwgMSkKLQkJCQlmYXRhbCgicHJvY2Vzc19yZW1vdmVfaWRlbnRpdHk6ICIKLQkJCQkgICAgImludGVybmFsIGVycm9yOiB0YWItPm5lbnRyaWVzICVkIiwKLQkJCQkgICAgdGFiLT5uZW50cmllcyk7Ci0JCQlUQUlMUV9SRU1PVkUoJnRhYi0+aWRsaXN0LCBpZCwgbmV4dCk7Ci0JCQlmcmVlX2lkZW50aXR5KGlkKTsKLQkJCXRhYi0+bmVudHJpZXMtLTsKLQkJCXN1Y2Nlc3MgPSAxOwotCQl9Ci0JCWtleV9mcmVlKGtleSk7Ci0JfQotCWJ1ZmZlcl9wdXRfaW50KCZlLT5vdXRwdXQsIDEpOwotCWJ1ZmZlcl9wdXRfY2hhcigmZS0+b3V0cHV0LAotCSAgICBzdWNjZXNzID8gU1NIX0FHRU5UX1NVQ0NFU1MgOiBTU0hfQUdFTlRfRkFJTFVSRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX3JlbW92ZV9hbGxfaWRlbnRpdGllcyhTb2NrZXRFbnRyeSAqZSwgaW50IHZlcnNpb24pCi17Ci0JSWR0YWIgKnRhYiA9IGlkdGFiX2xvb2t1cCh2ZXJzaW9uKTsKLQlJZGVudGl0eSAqaWQ7Ci0KLQkvKiBMb29wIG92ZXIgYWxsIGlkZW50aXRpZXMgYW5kIGNsZWFyIHRoZSBrZXlzLiAqLwotCWZvciAoaWQgPSBUQUlMUV9GSVJTVCgmdGFiLT5pZGxpc3QpOyBpZDsKLQkgICAgaWQgPSBUQUlMUV9GSVJTVCgmdGFiLT5pZGxpc3QpKSB7Ci0JCVRBSUxRX1JFTU9WRSgmdGFiLT5pZGxpc3QsIGlkLCBuZXh0KTsKLQkJZnJlZV9pZGVudGl0eShpZCk7Ci0JfQotCi0JLyogTWFyayB0aGF0IHRoZXJlIGFyZSBubyBpZGVudGl0aWVzLiAqLwotCXRhYi0+bmVudHJpZXMgPSAwOwotCi0JLyogU2VuZCBzdWNjZXNzLiAqLwotCWJ1ZmZlcl9wdXRfaW50KCZlLT5vdXRwdXQsIDEpOwotCWJ1ZmZlcl9wdXRfY2hhcigmZS0+b3V0cHV0LCBTU0hfQUdFTlRfU1VDQ0VTUyk7Ci19Ci0KLS8qIHJlbW92ZXMgZXhwaXJlZCBrZXlzIGFuZCByZXR1cm5zIG51bWJlciBvZiBzZWNvbmRzIHVudGlsIHRoZSBuZXh0IGV4cGlyeSAqLwotc3RhdGljIHVfaW50Ci1yZWFwZXIodm9pZCkKLXsKLQl1X2ludCBkZWFkbGluZSA9IDAsIG5vdyA9IHRpbWUoTlVMTCk7Ci0JSWRlbnRpdHkgKmlkLCAqbnh0OwotCWludCB2ZXJzaW9uOwotCUlkdGFiICp0YWI7Ci0KLQlmb3IgKHZlcnNpb24gPSAxOyB2ZXJzaW9uIDwgMzsgdmVyc2lvbisrKSB7Ci0JCXRhYiA9IGlkdGFiX2xvb2t1cCh2ZXJzaW9uKTsKLQkJZm9yIChpZCA9IFRBSUxRX0ZJUlNUKCZ0YWItPmlkbGlzdCk7IGlkOyBpZCA9IG54dCkgewotCQkJbnh0ID0gVEFJTFFfTkVYVChpZCwgbmV4dCk7Ci0JCQlpZiAoaWQtPmRlYXRoID09IDApCi0JCQkJY29udGludWU7Ci0JCQlpZiAobm93ID49IGlkLT5kZWF0aCkgewotCQkJCWRlYnVnKCJleHBpcmluZyBrZXkgJyVzJyIsIGlkLT5jb21tZW50KTsKLQkJCQlUQUlMUV9SRU1PVkUoJnRhYi0+aWRsaXN0LCBpZCwgbmV4dCk7Ci0JCQkJZnJlZV9pZGVudGl0eShpZCk7Ci0JCQkJdGFiLT5uZW50cmllcy0tOwotCQkJfSBlbHNlCi0JCQkJZGVhZGxpbmUgPSAoZGVhZGxpbmUgPT0gMCkgPyBpZC0+ZGVhdGggOgotCQkJCSAgICBNSU4oZGVhZGxpbmUsIGlkLT5kZWF0aCk7Ci0JCX0KLQl9Ci0JaWYgKGRlYWRsaW5lID09IDAgfHwgZGVhZGxpbmUgPD0gbm93KQotCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiAoZGVhZGxpbmUgLSBub3cpOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19hZGRfaWRlbnRpdHkoU29ja2V0RW50cnkgKmUsIGludCB2ZXJzaW9uKQotewotCUlkdGFiICp0YWIgPSBpZHRhYl9sb29rdXAodmVyc2lvbik7Ci0JSWRlbnRpdHkgKmlkOwotCWludCB0eXBlLCBzdWNjZXNzID0gMCwgZGVhdGggPSAwLCBjb25maXJtID0gMDsKLQljaGFyICp0eXBlX25hbWUsICpjb21tZW50OwotCUtleSAqayA9IE5VTEw7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JQklHTlVNICpleHBvbmVudDsKLQlFQ19QT0lOVCAqcTsKLQljaGFyICpjdXJ2ZTsKLSNlbmRpZgotCXVfY2hhciAqY2VydDsKLQl1X2ludCBsZW47Ci0KLQlzd2l0Y2ggKHZlcnNpb24pIHsKLQljYXNlIDE6Ci0JCWsgPSBrZXlfbmV3X3ByaXZhdGUoS0VZX1JTQTEpOwotCQkodm9pZCkgYnVmZmVyX2dldF9pbnQoJmUtPnJlcXVlc3QpOwkJLyogaWdub3JlZCAqLwotCQlidWZmZXJfZ2V0X2JpZ251bSgmZS0+cmVxdWVzdCwgay0+cnNhLT5uKTsKLQkJYnVmZmVyX2dldF9iaWdudW0oJmUtPnJlcXVlc3QsIGstPnJzYS0+ZSk7Ci0JCWJ1ZmZlcl9nZXRfYmlnbnVtKCZlLT5yZXF1ZXN0LCBrLT5yc2EtPmQpOwotCQlidWZmZXJfZ2V0X2JpZ251bSgmZS0+cmVxdWVzdCwgay0+cnNhLT5pcW1wKTsKLQotCQkvKiBTU0ggYW5kIFNTTCBoYXZlIHAgYW5kIHEgc3dhcHBlZCAqLwotCQlidWZmZXJfZ2V0X2JpZ251bSgmZS0+cmVxdWVzdCwgay0+cnNhLT5xKTsJLyogcCAqLwotCQlidWZmZXJfZ2V0X2JpZ251bSgmZS0+cmVxdWVzdCwgay0+cnNhLT5wKTsJLyogcSAqLwotCi0JCS8qIEdlbmVyYXRlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyAqLwotCQlyc2FfZ2VuZXJhdGVfYWRkaXRpb25hbF9wYXJhbWV0ZXJzKGstPnJzYSk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJdHlwZV9uYW1lID0gYnVmZmVyX2dldF9zdHJpbmcoJmUtPnJlcXVlc3QsIE5VTEwpOwotCQl0eXBlID0ga2V5X3R5cGVfZnJvbV9uYW1lKHR5cGVfbmFtZSk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIEtFWV9EU0E6Ci0JCQlrID0ga2V5X25ld19wcml2YXRlKHR5cGUpOwotCQkJYnVmZmVyX2dldF9iaWdudW0yKCZlLT5yZXF1ZXN0LCBrLT5kc2EtPnApOwotCQkJYnVmZmVyX2dldF9iaWdudW0yKCZlLT5yZXF1ZXN0LCBrLT5kc2EtPnEpOwotCQkJYnVmZmVyX2dldF9iaWdudW0yKCZlLT5yZXF1ZXN0LCBrLT5kc2EtPmcpOwotCQkJYnVmZmVyX2dldF9iaWdudW0yKCZlLT5yZXF1ZXN0LCBrLT5kc2EtPnB1Yl9rZXkpOwotCQkJYnVmZmVyX2dldF9iaWdudW0yKCZlLT5yZXF1ZXN0LCBrLT5kc2EtPnByaXZfa2V5KTsKLQkJCWJyZWFrOwotCQljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6Ci0JCWNhc2UgS0VZX0RTQV9DRVJUOgotCQkJY2VydCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZlLT5yZXF1ZXN0LCAmbGVuKTsKLQkJCWlmICgoayA9IGtleV9mcm9tX2Jsb2IoY2VydCwgbGVuKSkgPT0gTlVMTCkKLQkJCQlmYXRhbCgiQ2VydGlmaWNhdGUgcGFyc2UgZmFpbGVkIik7Ci0JCQl4ZnJlZShjZXJ0KTsKLQkJCWtleV9hZGRfcHJpdmF0ZShrKTsKLQkJCWJ1ZmZlcl9nZXRfYmlnbnVtMigmZS0+cmVxdWVzdCwgay0+ZHNhLT5wcml2X2tleSk7Ci0JCQlicmVhazsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQkJY2FzZSBLRVlfRUNEU0E6Ci0JCQlrID0ga2V5X25ld19wcml2YXRlKHR5cGUpOwotCQkJay0+ZWNkc2FfbmlkID0ga2V5X2VjZHNhX25pZF9mcm9tX25hbWUodHlwZV9uYW1lKTsKLQkJCWN1cnZlID0gYnVmZmVyX2dldF9zdHJpbmcoJmUtPnJlcXVlc3QsIE5VTEwpOwotCQkJaWYgKGstPmVjZHNhX25pZCAhPSBrZXlfY3VydmVfbmFtZV90b19uaWQoY3VydmUpKQotCQkJCWZhdGFsKCIlczogY3VydmUgbmFtZXMgbWlzbWF0Y2giLCBfX2Z1bmNfXyk7Ci0JCQl4ZnJlZShjdXJ2ZSk7Ci0JCQlrLT5lY2RzYSA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZShrLT5lY2RzYV9uaWQpOwotCQkJaWYgKGstPmVjZHNhID09IE5VTEwpCi0JCQkJZmF0YWwoIiVzOiBFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUgZmFpbGVkIiwKLQkJCQkgICAgX19mdW5jX18pOwotCQkJcSA9IEVDX1BPSU5UX25ldyhFQ19LRVlfZ2V0MF9ncm91cChrLT5lY2RzYSkpOwotCQkJaWYgKHEgPT0gTlVMTCkKLQkJCQlmYXRhbCgiJXM6IEJOX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCQlpZiAoKGV4cG9uZW50ID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCQkJZmF0YWwoIiVzOiBCTl9uZXcgZmFpbGVkIiwgX19mdW5jX18pOwotCQkJYnVmZmVyX2dldF9lY3BvaW50KCZlLT5yZXF1ZXN0LAotCQkJCUVDX0tFWV9nZXQwX2dyb3VwKGstPmVjZHNhKSwgcSk7Ci0JCQlidWZmZXJfZ2V0X2JpZ251bTIoJmUtPnJlcXVlc3QsIGV4cG9uZW50KTsKLQkJCWlmIChFQ19LRVlfc2V0X3B1YmxpY19rZXkoay0+ZWNkc2EsIHEpICE9IDEpCi0JCQkJZmF0YWwoIiVzOiBFQ19LRVlfc2V0X3B1YmxpY19rZXkgZmFpbGVkIiwKLQkJCQkgICAgX19mdW5jX18pOwotCQkJaWYgKEVDX0tFWV9zZXRfcHJpdmF0ZV9rZXkoay0+ZWNkc2EsIGV4cG9uZW50KSAhPSAxKQotCQkJCWZhdGFsKCIlczogRUNfS0VZX3NldF9wcml2YXRlX2tleSBmYWlsZWQiLAotCQkJCSAgICBfX2Z1bmNfXyk7Ci0JCQlpZiAoa2V5X2VjX3ZhbGlkYXRlX3B1YmxpYyhFQ19LRVlfZ2V0MF9ncm91cChrLT5lY2RzYSksCi0JCQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShrLT5lY2RzYSkpICE9IDApCi0JCQkJZmF0YWwoIiVzOiBiYWQgRUNEU0EgcHVibGljIGtleSIsIF9fZnVuY19fKTsKLQkJCWlmIChrZXlfZWNfdmFsaWRhdGVfcHJpdmF0ZShrLT5lY2RzYSkgIT0gMCkKLQkJCQlmYXRhbCgiJXM6IGJhZCBFQ0RTQSBwcml2YXRlIGtleSIsIF9fZnVuY19fKTsKLQkJCUJOX2NsZWFyX2ZyZWUoZXhwb25lbnQpOwotCQkJRUNfUE9JTlRfZnJlZShxKTsKLQkJCWJyZWFrOwotCQljYXNlIEtFWV9FQ0RTQV9DRVJUOgotCQkJY2VydCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZlLT5yZXF1ZXN0LCAmbGVuKTsKLQkJCWlmICgoayA9IGtleV9mcm9tX2Jsb2IoY2VydCwgbGVuKSkgPT0gTlVMTCkKLQkJCQlmYXRhbCgiQ2VydGlmaWNhdGUgcGFyc2UgZmFpbGVkIik7Ci0JCQl4ZnJlZShjZXJ0KTsKLQkJCWtleV9hZGRfcHJpdmF0ZShrKTsKLQkJCWlmICgoZXhwb25lbnQgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJCQlmYXRhbCgiJXM6IEJOX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCQlidWZmZXJfZ2V0X2JpZ251bTIoJmUtPnJlcXVlc3QsIGV4cG9uZW50KTsKLQkJCWlmIChFQ19LRVlfc2V0X3ByaXZhdGVfa2V5KGstPmVjZHNhLCBleHBvbmVudCkgIT0gMSkKLQkJCQlmYXRhbCgiJXM6IEVDX0tFWV9zZXRfcHJpdmF0ZV9rZXkgZmFpbGVkIiwKLQkJCQkgICAgX19mdW5jX18pOwotCQkJaWYgKGtleV9lY192YWxpZGF0ZV9wdWJsaWMoRUNfS0VZX2dldDBfZ3JvdXAoay0+ZWNkc2EpLAotCQkJICAgIEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoay0+ZWNkc2EpKSAhPSAwIHx8Ci0JCQkgICAga2V5X2VjX3ZhbGlkYXRlX3ByaXZhdGUoay0+ZWNkc2EpICE9IDApCi0JCQkJZmF0YWwoIiVzOiBiYWQgRUNEU0Ega2V5IiwgX19mdW5jX18pOwotCQkJQk5fY2xlYXJfZnJlZShleHBvbmVudCk7Ci0JCQlicmVhazsKLSNlbmRpZiAvKiBPUEVOU1NMX0hBU19FQ0MgKi8KLQkJY2FzZSBLRVlfUlNBOgotCQkJayA9IGtleV9uZXdfcHJpdmF0ZSh0eXBlKTsKLQkJCWJ1ZmZlcl9nZXRfYmlnbnVtMigmZS0+cmVxdWVzdCwgay0+cnNhLT5uKTsKLQkJCWJ1ZmZlcl9nZXRfYmlnbnVtMigmZS0+cmVxdWVzdCwgay0+cnNhLT5lKTsKLQkJCWJ1ZmZlcl9nZXRfYmlnbnVtMigmZS0+cmVxdWVzdCwgay0+cnNhLT5kKTsKLQkJCWJ1ZmZlcl9nZXRfYmlnbnVtMigmZS0+cmVxdWVzdCwgay0+cnNhLT5pcW1wKTsKLQkJCWJ1ZmZlcl9nZXRfYmlnbnVtMigmZS0+cmVxdWVzdCwgay0+cnNhLT5wKTsKLQkJCWJ1ZmZlcl9nZXRfYmlnbnVtMigmZS0+cmVxdWVzdCwgay0+cnNhLT5xKTsKLQotCQkJLyogR2VuZXJhdGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzICovCi0JCQlyc2FfZ2VuZXJhdGVfYWRkaXRpb25hbF9wYXJhbWV0ZXJzKGstPnJzYSk7Ci0JCQlicmVhazsKLQkJY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgotCQljYXNlIEtFWV9SU0FfQ0VSVDoKLQkJCWNlcnQgPSBidWZmZXJfZ2V0X3N0cmluZygmZS0+cmVxdWVzdCwgJmxlbik7Ci0JCQlpZiAoKGsgPSBrZXlfZnJvbV9ibG9iKGNlcnQsIGxlbikpID09IE5VTEwpCi0JCQkJZmF0YWwoIkNlcnRpZmljYXRlIHBhcnNlIGZhaWxlZCIpOwotCQkJeGZyZWUoY2VydCk7Ci0JCQlrZXlfYWRkX3ByaXZhdGUoayk7Ci0JCQlidWZmZXJfZ2V0X2JpZ251bTIoJmUtPnJlcXVlc3QsIGstPnJzYS0+ZCk7Ci0JCQlidWZmZXJfZ2V0X2JpZ251bTIoJmUtPnJlcXVlc3QsIGstPnJzYS0+aXFtcCk7Ci0JCQlidWZmZXJfZ2V0X2JpZ251bTIoJmUtPnJlcXVlc3QsIGstPnJzYS0+cCk7Ci0JCQlidWZmZXJfZ2V0X2JpZ251bTIoJmUtPnJlcXVlc3QsIGstPnJzYS0+cSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXhmcmVlKHR5cGVfbmFtZSk7Ci0JCQlidWZmZXJfY2xlYXIoJmUtPnJlcXVlc3QpOwotCQkJZ290byBzZW5kOwotCQl9Ci0JCXhmcmVlKHR5cGVfbmFtZSk7Ci0JCWJyZWFrOwotCX0KLQkvKiBlbmFibGUgYmxpbmRpbmcgKi8KLQlzd2l0Y2ggKGstPnR5cGUpIHsKLQljYXNlIEtFWV9SU0E6Ci0JY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgotCWNhc2UgS0VZX1JTQV9DRVJUOgotCWNhc2UgS0VZX1JTQTE6Ci0JCWlmIChSU0FfYmxpbmRpbmdfb24oay0+cnNhLCBOVUxMKSAhPSAxKSB7Ci0JCQllcnJvcigicHJvY2Vzc19hZGRfaWRlbnRpdHk6IFJTQV9ibGluZGluZ19vbiBmYWlsZWQiKTsKLQkJCWtleV9mcmVlKGspOwotCQkJZ290byBzZW5kOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljb21tZW50ID0gYnVmZmVyX2dldF9zdHJpbmcoJmUtPnJlcXVlc3QsIE5VTEwpOwotCWlmIChrID09IE5VTEwpIHsKLQkJeGZyZWUoY29tbWVudCk7Ci0JCWdvdG8gc2VuZDsKLQl9Ci0Jd2hpbGUgKGJ1ZmZlcl9sZW4oJmUtPnJlcXVlc3QpKSB7Ci0JCXN3aXRjaCAoKHR5cGUgPSBidWZmZXJfZ2V0X2NoYXIoJmUtPnJlcXVlc3QpKSkgewotCQljYXNlIFNTSF9BR0VOVF9DT05TVFJBSU5fTElGRVRJTUU6Ci0JCQlkZWF0aCA9IHRpbWUoTlVMTCkgKyBidWZmZXJfZ2V0X2ludCgmZS0+cmVxdWVzdCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTU0hfQUdFTlRfQ09OU1RSQUlOX0NPTkZJUk06Ci0JCQljb25maXJtID0gMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZXJyb3IoInByb2Nlc3NfYWRkX2lkZW50aXR5OiAiCi0JCQkgICAgIlVua25vd24gY29uc3RyYWludCB0eXBlICVkIiwgdHlwZSk7Ci0JCQl4ZnJlZShjb21tZW50KTsKLQkJCWtleV9mcmVlKGspOwotCQkJZ290byBzZW5kOwotCQl9Ci0JfQotCXN1Y2Nlc3MgPSAxOwotCWlmIChsaWZldGltZSAmJiAhZGVhdGgpCi0JCWRlYXRoID0gdGltZShOVUxMKSArIGxpZmV0aW1lOwotCWlmICgoaWQgPSBsb29rdXBfaWRlbnRpdHkoaywgdmVyc2lvbikpID09IE5VTEwpIHsKLQkJaWQgPSB4Y2FsbG9jKDEsIHNpemVvZihJZGVudGl0eSkpOwotCQlpZC0+a2V5ID0gazsKLQkJVEFJTFFfSU5TRVJUX1RBSUwoJnRhYi0+aWRsaXN0LCBpZCwgbmV4dCk7Ci0JCS8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGlkZW50aXRpZXMuICovCi0JCXRhYi0+bmVudHJpZXMrKzsKLQl9IGVsc2UgewotCQlrZXlfZnJlZShrKTsKLQkJeGZyZWUoaWQtPmNvbW1lbnQpOwotCX0KLQlpZC0+Y29tbWVudCA9IGNvbW1lbnQ7Ci0JaWQtPmRlYXRoID0gZGVhdGg7Ci0JaWQtPmNvbmZpcm0gPSBjb25maXJtOwotc2VuZDoKLQlidWZmZXJfcHV0X2ludCgmZS0+b3V0cHV0LCAxKTsKLQlidWZmZXJfcHV0X2NoYXIoJmUtPm91dHB1dCwKLQkgICAgc3VjY2VzcyA/IFNTSF9BR0VOVF9TVUNDRVNTIDogU1NIX0FHRU5UX0ZBSUxVUkUpOwotfQotCi0vKiBYWFggdG9kbzogZW5jcnlwdCBzZW5zaXRpdmUgZGF0YSB3aXRoIHBhc3NwaHJhc2UgKi8KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2xvY2tfYWdlbnQoU29ja2V0RW50cnkgKmUsIGludCBsb2NrKQotewotCWludCBzdWNjZXNzID0gMDsKLQljaGFyICpwYXNzd2Q7Ci0KLQlwYXNzd2QgPSBidWZmZXJfZ2V0X3N0cmluZygmZS0+cmVxdWVzdCwgTlVMTCk7Ci0JaWYgKGxvY2tlZCAmJiAhbG9jayAmJiBzdHJjbXAocGFzc3dkLCBsb2NrX3Bhc3N3ZCkgPT0gMCkgewotCQlsb2NrZWQgPSAwOwotCQltZW1zZXQobG9ja19wYXNzd2QsIDAsIHN0cmxlbihsb2NrX3Bhc3N3ZCkpOwotCQl4ZnJlZShsb2NrX3Bhc3N3ZCk7Ci0JCWxvY2tfcGFzc3dkID0gTlVMTDsKLQkJc3VjY2VzcyA9IDE7Ci0JfSBlbHNlIGlmICghbG9ja2VkICYmIGxvY2spIHsKLQkJbG9ja2VkID0gMTsKLQkJbG9ja19wYXNzd2QgPSB4c3RyZHVwKHBhc3N3ZCk7Ci0JCXN1Y2Nlc3MgPSAxOwotCX0KLQltZW1zZXQocGFzc3dkLCAwLCBzdHJsZW4ocGFzc3dkKSk7Ci0JeGZyZWUocGFzc3dkKTsKLQotCWJ1ZmZlcl9wdXRfaW50KCZlLT5vdXRwdXQsIDEpOwotCWJ1ZmZlcl9wdXRfY2hhcigmZS0+b3V0cHV0LAotCSAgICBzdWNjZXNzID8gU1NIX0FHRU5UX1NVQ0NFU1MgOiBTU0hfQUdFTlRfRkFJTFVSRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub19pZGVudGl0aWVzKFNvY2tldEVudHJ5ICplLCB1X2ludCB0eXBlKQotewotCUJ1ZmZlciBtc2c7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQlidWZmZXJfcHV0X2NoYXIoJm1zZywKLQkgICAgKHR5cGUgPT0gU1NIX0FHRU5UQ19SRVFVRVNUX1JTQV9JREVOVElUSUVTKSA/Ci0JICAgIFNTSF9BR0VOVF9SU0FfSURFTlRJVElFU19BTlNXRVIgOiBTU0gyX0FHRU5UX0lERU5USVRJRVNfQU5TV0VSKTsKLQlidWZmZXJfcHV0X2ludCgmbXNnLCAwKTsKLQlidWZmZXJfcHV0X2ludCgmZS0+b3V0cHV0LCBidWZmZXJfbGVuKCZtc2cpKTsKLQlidWZmZXJfYXBwZW5kKCZlLT5vdXRwdXQsIGJ1ZmZlcl9wdHIoJm1zZyksIGJ1ZmZlcl9sZW4oJm1zZykpOwotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotfQotCi0jaWZkZWYgRU5BQkxFX1BLQ1MxMQotc3RhdGljIHZvaWQKLXByb2Nlc3NfYWRkX3NtYXJ0Y2FyZF9rZXkoU29ja2V0RW50cnkgKmUpCi17Ci0JY2hhciAqcHJvdmlkZXIgPSBOVUxMLCAqcGluOwotCWludCBpLCB0eXBlLCB2ZXJzaW9uLCBjb3VudCA9IDAsIHN1Y2Nlc3MgPSAwLCBkZWF0aCA9IDAsIGNvbmZpcm0gPSAwOwotCUtleSAqKmtleXMgPSBOVUxMLCAqazsKLQlJZGVudGl0eSAqaWQ7Ci0JSWR0YWIgKnRhYjsKLQotCXByb3ZpZGVyID0gYnVmZmVyX2dldF9zdHJpbmcoJmUtPnJlcXVlc3QsIE5VTEwpOwotCXBpbiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZlLT5yZXF1ZXN0LCBOVUxMKTsKLQotCXdoaWxlIChidWZmZXJfbGVuKCZlLT5yZXF1ZXN0KSkgewotCQlzd2l0Y2ggKCh0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZlLT5yZXF1ZXN0KSkpIHsKLQkJY2FzZSBTU0hfQUdFTlRfQ09OU1RSQUlOX0xJRkVUSU1FOgotCQkJZGVhdGggPSB0aW1lKE5VTEwpICsgYnVmZmVyX2dldF9pbnQoJmUtPnJlcXVlc3QpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1NIX0FHRU5UX0NPTlNUUkFJTl9DT05GSVJNOgotCQkJY29uZmlybSA9IDE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWVycm9yKCJwcm9jZXNzX2FkZF9zbWFydGNhcmRfa2V5OiAiCi0JCQkgICAgIlVua25vd24gY29uc3RyYWludCB0eXBlICVkIiwgdHlwZSk7Ci0JCQlnb3RvIHNlbmQ7Ci0JCX0KLQl9Ci0JaWYgKGxpZmV0aW1lICYmICFkZWF0aCkKLQkJZGVhdGggPSB0aW1lKE5VTEwpICsgbGlmZXRpbWU7Ci0KLQljb3VudCA9IHBrY3MxMV9hZGRfcHJvdmlkZXIocHJvdmlkZXIsIHBpbiwgJmtleXMpOwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWsgPSBrZXlzW2ldOwotCQl2ZXJzaW9uID0gay0+dHlwZSA9PSBLRVlfUlNBMSA/IDEgOiAyOwotCQl0YWIgPSBpZHRhYl9sb29rdXAodmVyc2lvbik7Ci0JCWlmIChsb29rdXBfaWRlbnRpdHkoaywgdmVyc2lvbikgPT0gTlVMTCkgewotCQkJaWQgPSB4Y2FsbG9jKDEsIHNpemVvZihJZGVudGl0eSkpOwotCQkJaWQtPmtleSA9IGs7Ci0JCQlpZC0+cHJvdmlkZXIgPSB4c3RyZHVwKHByb3ZpZGVyKTsKLQkJCWlkLT5jb21tZW50ID0geHN0cmR1cChwcm92aWRlcik7IC8qIFhYWCAqLwotCQkJaWQtPmRlYXRoID0gZGVhdGg7Ci0JCQlpZC0+Y29uZmlybSA9IGNvbmZpcm07Ci0JCQlUQUlMUV9JTlNFUlRfVEFJTCgmdGFiLT5pZGxpc3QsIGlkLCBuZXh0KTsKLQkJCXRhYi0+bmVudHJpZXMrKzsKLQkJCXN1Y2Nlc3MgPSAxOwotCQl9IGVsc2UgewotCQkJa2V5X2ZyZWUoayk7Ci0JCX0KLQkJa2V5c1tpXSA9IE5VTEw7Ci0JfQotc2VuZDoKLQlpZiAocGluKQotCQl4ZnJlZShwaW4pOwotCWlmIChwcm92aWRlcikKLQkJeGZyZWUocHJvdmlkZXIpOwotCWlmIChrZXlzKQotCQl4ZnJlZShrZXlzKTsKLQlidWZmZXJfcHV0X2ludCgmZS0+b3V0cHV0LCAxKTsKLQlidWZmZXJfcHV0X2NoYXIoJmUtPm91dHB1dCwKLQkgICAgc3VjY2VzcyA/IFNTSF9BR0VOVF9TVUNDRVNTIDogU1NIX0FHRU5UX0ZBSUxVUkUpOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19yZW1vdmVfc21hcnRjYXJkX2tleShTb2NrZXRFbnRyeSAqZSkKLXsKLQljaGFyICpwcm92aWRlciA9IE5VTEwsICpwaW4gPSBOVUxMOwotCWludCB2ZXJzaW9uLCBzdWNjZXNzID0gMDsKLQlJZGVudGl0eSAqaWQsICpueHQ7Ci0JSWR0YWIgKnRhYjsKLQotCXByb3ZpZGVyID0gYnVmZmVyX2dldF9zdHJpbmcoJmUtPnJlcXVlc3QsIE5VTEwpOwotCXBpbiA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZlLT5yZXF1ZXN0LCBOVUxMKTsKLQl4ZnJlZShwaW4pOwotCi0JZm9yICh2ZXJzaW9uID0gMTsgdmVyc2lvbiA8IDM7IHZlcnNpb24rKykgewotCQl0YWIgPSBpZHRhYl9sb29rdXAodmVyc2lvbik7Ci0JCWZvciAoaWQgPSBUQUlMUV9GSVJTVCgmdGFiLT5pZGxpc3QpOyBpZDsgaWQgPSBueHQpIHsKLQkJCW54dCA9IFRBSUxRX05FWFQoaWQsIG5leHQpOwotCQkJaWYgKCFzdHJjbXAocHJvdmlkZXIsIGlkLT5wcm92aWRlcikpIHsKLQkJCQlUQUlMUV9SRU1PVkUoJnRhYi0+aWRsaXN0LCBpZCwgbmV4dCk7Ci0JCQkJZnJlZV9pZGVudGl0eShpZCk7Ci0JCQkJdGFiLT5uZW50cmllcy0tOwotCQkJfQotCQl9Ci0JfQotCWlmIChwa2NzMTFfZGVsX3Byb3ZpZGVyKHByb3ZpZGVyKSA9PSAwKQotCQlzdWNjZXNzID0gMTsKLQllbHNlCi0JCWVycm9yKCJwcm9jZXNzX3JlbW92ZV9zbWFydGNhcmRfa2V5OiIKLQkJICAgICIgcGtjczExX2RlbF9wcm92aWRlciBmYWlsZWQiKTsKLQl4ZnJlZShwcm92aWRlcik7Ci0JYnVmZmVyX3B1dF9pbnQoJmUtPm91dHB1dCwgMSk7Ci0JYnVmZmVyX3B1dF9jaGFyKCZlLT5vdXRwdXQsCi0JICAgIHN1Y2Nlc3MgPyBTU0hfQUdFTlRfU1VDQ0VTUyA6IFNTSF9BR0VOVF9GQUlMVVJFKTsKLX0KLSNlbmRpZiAvKiBFTkFCTEVfUEtDUzExICovCi0KLS8qIGRpc3BhdGNoIGluY29taW5nIG1lc3NhZ2VzICovCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX21lc3NhZ2UoU29ja2V0RW50cnkgKmUpCi17Ci0JdV9pbnQgbXNnX2xlbiwgdHlwZTsKLQl1X2NoYXIgKmNwOwotCi0JaWYgKGJ1ZmZlcl9sZW4oJmUtPmlucHV0KSA8IDUpCi0JCXJldHVybjsJCS8qIEluY29tcGxldGUgbWVzc2FnZS4gKi8KLQljcCA9IGJ1ZmZlcl9wdHIoJmUtPmlucHV0KTsKLQltc2dfbGVuID0gZ2V0X3UzMihjcCk7Ci0JaWYgKG1zZ19sZW4gPiAyNTYgKiAxMDI0KSB7Ci0JCWNsb3NlX3NvY2tldChlKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoYnVmZmVyX2xlbigmZS0+aW5wdXQpIDwgbXNnX2xlbiArIDQpCi0JCXJldHVybjsKLQotCS8qIG1vdmUgdGhlIGN1cnJlbnQgaW5wdXQgdG8gZS0+cmVxdWVzdCAqLwotCWJ1ZmZlcl9jb25zdW1lKCZlLT5pbnB1dCwgNCk7Ci0JYnVmZmVyX2NsZWFyKCZlLT5yZXF1ZXN0KTsKLQlidWZmZXJfYXBwZW5kKCZlLT5yZXF1ZXN0LCBidWZmZXJfcHRyKCZlLT5pbnB1dCksIG1zZ19sZW4pOwotCWJ1ZmZlcl9jb25zdW1lKCZlLT5pbnB1dCwgbXNnX2xlbik7Ci0JdHlwZSA9IGJ1ZmZlcl9nZXRfY2hhcigmZS0+cmVxdWVzdCk7Ci0KLQkvKiBjaGVjayB3aGV0ZXIgYWdlbnQgaXMgbG9ja2VkICovCi0JaWYgKGxvY2tlZCAmJiB0eXBlICE9IFNTSF9BR0VOVENfVU5MT0NLKSB7Ci0JCWJ1ZmZlcl9jbGVhcigmZS0+cmVxdWVzdCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIFNTSF9BR0VOVENfUkVRVUVTVF9SU0FfSURFTlRJVElFUzoKLQkJY2FzZSBTU0gyX0FHRU5UQ19SRVFVRVNUX0lERU5USVRJRVM6Ci0JCQkvKiBzZW5kIGVtcHR5IGxpc3RzICovCi0JCQlub19pZGVudGl0aWVzKGUsIHR5cGUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBzZW5kIGEgZmFpbCBtZXNzYWdlIGZvciBhbGwgb3RoZXIgcmVxdWVzdCB0eXBlcyAqLwotCQkJYnVmZmVyX3B1dF9pbnQoJmUtPm91dHB1dCwgMSk7Ci0JCQlidWZmZXJfcHV0X2NoYXIoJmUtPm91dHB1dCwgU1NIX0FHRU5UX0ZBSUxVUkUpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlkZWJ1ZygidHlwZSAlZCIsIHR5cGUpOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgU1NIX0FHRU5UQ19MT0NLOgotCWNhc2UgU1NIX0FHRU5UQ19VTkxPQ0s6Ci0JCXByb2Nlc3NfbG9ja19hZ2VudChlLCB0eXBlID09IFNTSF9BR0VOVENfTE9DSyk7Ci0JCWJyZWFrOwotCS8qIHNzaDEgKi8KLQljYXNlIFNTSF9BR0VOVENfUlNBX0NIQUxMRU5HRToKLQkJcHJvY2Vzc19hdXRoZW50aWNhdGlvbl9jaGFsbGVuZ2UxKGUpOwotCQlicmVhazsKLQljYXNlIFNTSF9BR0VOVENfUkVRVUVTVF9SU0FfSURFTlRJVElFUzoKLQkJcHJvY2Vzc19yZXF1ZXN0X2lkZW50aXRpZXMoZSwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIX0FHRU5UQ19BRERfUlNBX0lERU5USVRZOgotCWNhc2UgU1NIX0FHRU5UQ19BRERfUlNBX0lEX0NPTlNUUkFJTkVEOgotCQlwcm9jZXNzX2FkZF9pZGVudGl0eShlLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBTU0hfQUdFTlRDX1JFTU9WRV9SU0FfSURFTlRJVFk6Ci0JCXByb2Nlc3NfcmVtb3ZlX2lkZW50aXR5KGUsIDEpOwotCQlicmVhazsKLQljYXNlIFNTSF9BR0VOVENfUkVNT1ZFX0FMTF9SU0FfSURFTlRJVElFUzoKLQkJcHJvY2Vzc19yZW1vdmVfYWxsX2lkZW50aXRpZXMoZSwgMSk7Ci0JCWJyZWFrOwotCS8qIHNzaDIgKi8KLQljYXNlIFNTSDJfQUdFTlRDX1NJR05fUkVRVUVTVDoKLQkJcHJvY2Vzc19zaWduX3JlcXVlc3QyKGUpOwotCQlicmVhazsKLQljYXNlIFNTSDJfQUdFTlRDX1JFUVVFU1RfSURFTlRJVElFUzoKLQkJcHJvY2Vzc19yZXF1ZXN0X2lkZW50aXRpZXMoZSwgMik7Ci0JCWJyZWFrOwotCWNhc2UgU1NIMl9BR0VOVENfQUREX0lERU5USVRZOgotCWNhc2UgU1NIMl9BR0VOVENfQUREX0lEX0NPTlNUUkFJTkVEOgotCQlwcm9jZXNzX2FkZF9pZGVudGl0eShlLCAyKTsKLQkJYnJlYWs7Ci0JY2FzZSBTU0gyX0FHRU5UQ19SRU1PVkVfSURFTlRJVFk6Ci0JCXByb2Nlc3NfcmVtb3ZlX2lkZW50aXR5KGUsIDIpOwotCQlicmVhazsKLQljYXNlIFNTSDJfQUdFTlRDX1JFTU9WRV9BTExfSURFTlRJVElFUzoKLQkJcHJvY2Vzc19yZW1vdmVfYWxsX2lkZW50aXRpZXMoZSwgMik7Ci0JCWJyZWFrOwotI2lmZGVmIEVOQUJMRV9QS0NTMTEKLQljYXNlIFNTSF9BR0VOVENfQUREX1NNQVJUQ0FSRF9LRVk6Ci0JY2FzZSBTU0hfQUdFTlRDX0FERF9TTUFSVENBUkRfS0VZX0NPTlNUUkFJTkVEOgotCQlwcm9jZXNzX2FkZF9zbWFydGNhcmRfa2V5KGUpOwotCQlicmVhazsKLQljYXNlIFNTSF9BR0VOVENfUkVNT1ZFX1NNQVJUQ0FSRF9LRVk6Ci0JCXByb2Nlc3NfcmVtb3ZlX3NtYXJ0Y2FyZF9rZXkoZSk7Ci0JCWJyZWFrOwotI2VuZGlmIC8qIEVOQUJMRV9QS0NTMTEgKi8KLQlkZWZhdWx0OgotCQkvKiBVbmtub3duIG1lc3NhZ2UuICBSZXNwb25kIHdpdGggZmFpbHVyZS4gKi8KLQkJZXJyb3IoIlVua25vd24gbWVzc2FnZSAlZCIsIHR5cGUpOwotCQlidWZmZXJfY2xlYXIoJmUtPnJlcXVlc3QpOwotCQlidWZmZXJfcHV0X2ludCgmZS0+b3V0cHV0LCAxKTsKLQkJYnVmZmVyX3B1dF9jaGFyKCZlLT5vdXRwdXQsIFNTSF9BR0VOVF9GQUlMVVJFKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotbmV3X3NvY2tldChzb2NrX3R5cGUgdHlwZSwgaW50IGZkKQotewotCXVfaW50IGksIG9sZF9hbGxvYywgbmV3X2FsbG9jOwotCi0Jc2V0X25vbmJsb2NrKGZkKTsKLQotCWlmIChmZCA+IG1heF9mZCkKLQkJbWF4X2ZkID0gZmQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc29ja2V0c19hbGxvYzsgaSsrKQotCQlpZiAoc29ja2V0c1tpXS50eXBlID09IEFVVEhfVU5VU0VEKSB7Ci0JCQlzb2NrZXRzW2ldLmZkID0gZmQ7Ci0JCQlidWZmZXJfaW5pdCgmc29ja2V0c1tpXS5pbnB1dCk7Ci0JCQlidWZmZXJfaW5pdCgmc29ja2V0c1tpXS5vdXRwdXQpOwotCQkJYnVmZmVyX2luaXQoJnNvY2tldHNbaV0ucmVxdWVzdCk7Ci0JCQlzb2NrZXRzW2ldLnR5cGUgPSB0eXBlOwotCQkJcmV0dXJuOwotCQl9Ci0Jb2xkX2FsbG9jID0gc29ja2V0c19hbGxvYzsKLQluZXdfYWxsb2MgPSBzb2NrZXRzX2FsbG9jICsgMTA7Ci0Jc29ja2V0cyA9IHhyZWFsbG9jKHNvY2tldHMsIG5ld19hbGxvYywgc2l6ZW9mKHNvY2tldHNbMF0pKTsKLQlmb3IgKGkgPSBvbGRfYWxsb2M7IGkgPCBuZXdfYWxsb2M7IGkrKykKLQkJc29ja2V0c1tpXS50eXBlID0gQVVUSF9VTlVTRUQ7Ci0Jc29ja2V0c19hbGxvYyA9IG5ld19hbGxvYzsKLQlzb2NrZXRzW29sZF9hbGxvY10uZmQgPSBmZDsKLQlidWZmZXJfaW5pdCgmc29ja2V0c1tvbGRfYWxsb2NdLmlucHV0KTsKLQlidWZmZXJfaW5pdCgmc29ja2V0c1tvbGRfYWxsb2NdLm91dHB1dCk7Ci0JYnVmZmVyX2luaXQoJnNvY2tldHNbb2xkX2FsbG9jXS5yZXF1ZXN0KTsKLQlzb2NrZXRzW29sZF9hbGxvY10udHlwZSA9IHR5cGU7Ci19Ci0KLXN0YXRpYyBpbnQKLXByZXBhcmVfc2VsZWN0KGZkX3NldCAqKmZkcnAsIGZkX3NldCAqKmZkd3AsIGludCAqZmRsLCB1X2ludCAqbmFsbG9jcCwKLSAgICBzdHJ1Y3QgdGltZXZhbCAqKnR2cHApCi17Ci0JdV9pbnQgaSwgc3osIGRlYWRsaW5lOwotCWludCBuID0gMDsKLQlzdGF0aWMgc3RydWN0IHRpbWV2YWwgdHY7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc29ja2V0c19hbGxvYzsgaSsrKSB7Ci0JCXN3aXRjaCAoc29ja2V0c1tpXS50eXBlKSB7Ci0JCWNhc2UgQVVUSF9TT0NLRVQ6Ci0JCWNhc2UgQVVUSF9DT05ORUNUSU9OOgotCQkJbiA9IE1BWChuLCBzb2NrZXRzW2ldLmZkKTsKLQkJCWJyZWFrOwotCQljYXNlIEFVVEhfVU5VU0VEOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlmYXRhbCgiVW5rbm93biBzb2NrZXQgdHlwZSAlZCIsIHNvY2tldHNbaV0udHlwZSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXN6ID0gaG93bWFueShuKzEsIE5GREJJVFMpICogc2l6ZW9mKGZkX21hc2spOwotCWlmICgqZmRycCA9PSBOVUxMIHx8IHN6ID4gKm5hbGxvY3ApIHsKLQkJaWYgKCpmZHJwKQotCQkJeGZyZWUoKmZkcnApOwotCQlpZiAoKmZkd3ApCi0JCQl4ZnJlZSgqZmR3cCk7Ci0JCSpmZHJwID0geG1hbGxvYyhzeik7Ci0JCSpmZHdwID0geG1hbGxvYyhzeik7Ci0JCSpuYWxsb2NwID0gc3o7Ci0JfQotCWlmIChuIDwgKmZkbCkKLQkJZGVidWcoIlhYWCBzaHJpbms6ICVkIDwgJWQiLCBuLCAqZmRsKTsKLQkqZmRsID0gbjsKLQltZW1zZXQoKmZkcnAsIDAsIHN6KTsKLQltZW1zZXQoKmZkd3AsIDAsIHN6KTsKLQotCWZvciAoaSA9IDA7IGkgPCBzb2NrZXRzX2FsbG9jOyBpKyspIHsKLQkJc3dpdGNoIChzb2NrZXRzW2ldLnR5cGUpIHsKLQkJY2FzZSBBVVRIX1NPQ0tFVDoKLQkJY2FzZSBBVVRIX0NPTk5FQ1RJT046Ci0JCQlGRF9TRVQoc29ja2V0c1tpXS5mZCwgKmZkcnApOwotCQkJaWYgKGJ1ZmZlcl9sZW4oJnNvY2tldHNbaV0ub3V0cHV0KSA+IDApCi0JCQkJRkRfU0VUKHNvY2tldHNbaV0uZmQsICpmZHdwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZGVhZGxpbmUgPSByZWFwZXIoKTsKLQlpZiAocGFyZW50X2FsaXZlX2ludGVydmFsICE9IDApCi0JCWRlYWRsaW5lID0gKGRlYWRsaW5lID09IDApID8gcGFyZW50X2FsaXZlX2ludGVydmFsIDoKLQkJICAgIE1JTihkZWFkbGluZSwgcGFyZW50X2FsaXZlX2ludGVydmFsKTsKLQlpZiAoZGVhZGxpbmUgPT0gMCkgewotCQkqdHZwcCA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJdHYudHZfc2VjID0gZGVhZGxpbmU7Ci0JCXR2LnR2X3VzZWMgPSAwOwotCQkqdHZwcCA9ICZ0djsKLQl9Ci0JcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLWFmdGVyX3NlbGVjdChmZF9zZXQgKnJlYWRzZXQsIGZkX3NldCAqd3JpdGVzZXQpCi17Ci0Jc3RydWN0IHNvY2thZGRyX3VuIHN1bmFkZHI7Ci0Jc29ja2xlbl90IHNsZW47Ci0JY2hhciBidWZbMTAyNF07Ci0JaW50IGxlbiwgc29jazsKLQl1X2ludCBpLCBvcmlnX2FsbG9jOwotCXVpZF90IGV1aWQ7Ci0JZ2lkX3QgZWdpZDsKLQotCWZvciAoaSA9IDAsIG9yaWdfYWxsb2MgPSBzb2NrZXRzX2FsbG9jOyBpIDwgb3JpZ19hbGxvYzsgaSsrKQotCQlzd2l0Y2ggKHNvY2tldHNbaV0udHlwZSkgewotCQljYXNlIEFVVEhfVU5VU0VEOgotCQkJYnJlYWs7Ci0JCWNhc2UgQVVUSF9TT0NLRVQ6Ci0JCQlpZiAoRkRfSVNTRVQoc29ja2V0c1tpXS5mZCwgcmVhZHNldCkpIHsKLQkJCQlzbGVuID0gc2l6ZW9mKHN1bmFkZHIpOwotCQkJCXNvY2sgPSBhY2NlcHQoc29ja2V0c1tpXS5mZCwKLQkJCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzdW5hZGRyLCAmc2xlbik7Ci0JCQkJaWYgKHNvY2sgPCAwKSB7Ci0JCQkJCWVycm9yKCJhY2NlcHQgZnJvbSBBVVRIX1NPQ0tFVDogJXMiLAotCQkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChnZXRwZWVyZWlkKHNvY2ssICZldWlkLCAmZWdpZCkgPCAwKSB7Ci0JCQkJCWVycm9yKCJnZXRwZWVyZWlkICVkIGZhaWxlZDogJXMiLAotCQkJCQkgICAgc29jaywgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQkJY2xvc2Uoc29jayk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoKGV1aWQgIT0gMCkgJiYgKGdldHVpZCgpICE9IGV1aWQpKSB7Ci0JCQkJCWVycm9yKCJ1aWQgbWlzbWF0Y2g6ICIKLQkJCQkJICAgICJwZWVyIGV1aWQgJXUgIT0gdWlkICV1IiwKLQkJCQkJICAgICh1X2ludCkgZXVpZCwgKHVfaW50KSBnZXR1aWQoKSk7Ci0JCQkJCWNsb3NlKHNvY2spOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbmV3X3NvY2tldChBVVRIX0NPTk5FQ1RJT04sIHNvY2spOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgQVVUSF9DT05ORUNUSU9OOgotCQkJaWYgKGJ1ZmZlcl9sZW4oJnNvY2tldHNbaV0ub3V0cHV0KSA+IDAgJiYKLQkJCSAgICBGRF9JU1NFVChzb2NrZXRzW2ldLmZkLCB3cml0ZXNldCkpIHsKLQkJCQlsZW4gPSB3cml0ZShzb2NrZXRzW2ldLmZkLAotCQkJCSAgICBidWZmZXJfcHRyKCZzb2NrZXRzW2ldLm91dHB1dCksCi0JCQkJICAgIGJ1ZmZlcl9sZW4oJnNvY2tldHNbaV0ub3V0cHV0KSk7Ci0JCQkJaWYgKGxlbiA9PSAtMSAmJiAoZXJybm8gPT0gRUFHQUlOIHx8Ci0JCQkJICAgIGVycm5vID09IEVXT1VMREJMT0NLIHx8Ci0JCQkJICAgIGVycm5vID09IEVJTlRSKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGxlbiA8PSAwKSB7Ci0JCQkJCWNsb3NlX3NvY2tldCgmc29ja2V0c1tpXSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlidWZmZXJfY29uc3VtZSgmc29ja2V0c1tpXS5vdXRwdXQsIGxlbik7Ci0JCQl9Ci0JCQlpZiAoRkRfSVNTRVQoc29ja2V0c1tpXS5mZCwgcmVhZHNldCkpIHsKLQkJCQlsZW4gPSByZWFkKHNvY2tldHNbaV0uZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCQkJCWlmIChsZW4gPT0gLTEgJiYgKGVycm5vID09IEVBR0FJTiB8fAotCQkJCSAgICBlcnJubyA9PSBFV09VTERCTE9DSyB8fAotCQkJCSAgICBlcnJubyA9PSBFSU5UUikpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChsZW4gPD0gMCkgewotCQkJCQljbG9zZV9zb2NrZXQoJnNvY2tldHNbaV0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnVmZmVyX2FwcGVuZCgmc29ja2V0c1tpXS5pbnB1dCwgYnVmLCBsZW4pOwotCQkJCXByb2Nlc3NfbWVzc2FnZSgmc29ja2V0c1tpXSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWZhdGFsKCJVbmtub3duIHR5cGUgJWQiLCBzb2NrZXRzW2ldLnR5cGUpOwotCQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jbGVhbnVwX3NvY2tldCh2b2lkKQotewotCWlmIChzb2NrZXRfbmFtZVswXSkKLQkJdW5saW5rKHNvY2tldF9uYW1lKTsKLQlpZiAoc29ja2V0X2RpclswXSkKLQkJcm1kaXIoc29ja2V0X2Rpcik7Ci19Ci0KLXZvaWQKLWNsZWFudXBfZXhpdChpbnQgaSkKLXsKLQljbGVhbnVwX3NvY2tldCgpOwotCV9leGl0KGkpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1jbGVhbnVwX2hhbmRsZXIoaW50IHNpZykKLXsKLQljbGVhbnVwX3NvY2tldCgpOwotI2lmZGVmIEVOQUJMRV9QS0NTMTEKLQlwa2NzMTFfdGVybWluYXRlKCk7Ci0jZW5kaWYKLQlfZXhpdCgyKTsKLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrX3BhcmVudF9leGlzdHModm9pZCkKLXsKLQkvKgotCSAqIElmIG91ciBwYXJlbnQgaGFzIGV4aXRlZCB0aGVuIGdldHBwaWQoKSB3aWxsIHJldHVybiAocGlkX3QpMSwKLQkgKiBzbyB0ZXN0aW5nIGZvciB0aGF0IHNob3VsZCBiZSBzYWZlLgotCSAqLwotCWlmIChwYXJlbnRfcGlkICE9IC0xICYmIGdldHBwaWQoKSAhPSBwYXJlbnRfcGlkKSB7Ci0JCS8qIHByaW50ZigiUGFyZW50IGhhcyBkaWVkIC0gQXV0aGVudGljYXRpb24gYWdlbnQgZXhpdGluZy5cbiIpOyAqLwotCQljbGVhbnVwX3NvY2tldCgpOwotCQlfZXhpdCgyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSh2b2lkKQotewotCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIFtvcHRpb25zXSBbY29tbWFuZCBbYXJnIC4uLl1dXG4iLAotCSAgICBfX3Byb2duYW1lKTsKLQlmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgLWMgICAgICAgICAgR2VuZXJhdGUgQy1zaGVsbCBjb21tYW5kcyBvbiBzdGRvdXQuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgLXMgICAgICAgICAgR2VuZXJhdGUgQm91cm5lIHNoZWxsIGNvbW1hbmRzIG9uIHN0ZG91dC5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtayAgICAgICAgICBLaWxsIHRoZSBjdXJyZW50IGFnZW50LlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1kICAgICAgICAgIERlYnVnIG1vZGUuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgLWEgc29ja2V0ICAgQmluZCBhZ2VudCBzb2NrZXQgdG8gZ2l2ZW4gbmFtZS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtdCBsaWZlICAgICBEZWZhdWx0IGlkZW50aXR5IGxpZmV0aW1lIChzZWNvbmRzKS5cbiIpOwotCWV4aXQoMSk7Ci19Ci0KLWludAotbWFpbihpbnQgYWMsIGNoYXIgKiphdikKLXsKLQlpbnQgY19mbGFnID0gMCwgZF9mbGFnID0gMCwga19mbGFnID0gMCwgc19mbGFnID0gMDsKLQlpbnQgc29jaywgZmQsIGNoLCByZXN1bHQsIHNhdmVkX2Vycm5vOwotCXVfaW50IG5hbGxvYzsKLQljaGFyICpzaGVsbCwgKmZvcm1hdCwgKnBpZHN0ciwgKmFnZW50c29ja2V0ID0gTlVMTDsKLQlmZF9zZXQgKnJlYWRzZXRwID0gTlVMTCwgKndyaXRlc2V0cCA9IE5VTEw7Ci0Jc3RydWN0IHNvY2thZGRyX3VuIHN1bmFkZHI7Ci0jaWZkZWYgSEFWRV9TRVRSTElNSVQKLQlzdHJ1Y3QgcmxpbWl0IHJsaW07Ci0jZW5kaWYKLQlpbnQgcHJldl9tYXNrOwotCWV4dGVybiBpbnQgb3B0aW5kOwotCWV4dGVybiBjaGFyICpvcHRhcmc7Ci0JcGlkX3QgcGlkOwotCWNoYXIgcGlkc3RyYnVmWzEgKyAzICogc2l6ZW9mIHBpZF07Ci0Jc3RydWN0IHRpbWV2YWwgKnR2cCA9IE5VTEw7Ci0Jc2l6ZV90IGxlbjsKLQotCS8qIEVuc3VyZSB0aGF0IGZkcyAwLCAxIGFuZCAyIGFyZSBvcGVuIG9yIGRpcmVjdGVkIHRvIC9kZXYvbnVsbCAqLwotCXNhbml0aXNlX3N0ZGZkKCk7Ci0KLQkvKiBkcm9wICovCi0Jc2V0ZWdpZChnZXRnaWQoKSk7Ci0Jc2V0Z2lkKGdldGdpZCgpKTsKLQotI2lmIGRlZmluZWQoSEFWRV9QUkNUTCkgJiYgZGVmaW5lZChQUl9TRVRfRFVNUEFCTEUpCi0JLyogRGlzYWJsZSBwdHJhY2Ugb24gTGludXggd2l0aG91dCBzZ2lkIGJpdCAqLwotCXByY3RsKFBSX1NFVF9EVU1QQUJMRSwgMCk7Ci0jZW5kaWYKLQotCU9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7Ci0KLQlfX3Byb2duYW1lID0gc3NoX2dldF9wcm9nbmFtZShhdlswXSk7Ci0Jc2VlZF9ybmcoKTsKLQotCXdoaWxlICgoY2ggPSBnZXRvcHQoYWMsIGF2LCAiY2Rrc2E6dDoiKSkgIT0gLTEpIHsKLQkJc3dpdGNoIChjaCkgewotCQljYXNlICdjJzoKLQkJCWlmIChzX2ZsYWcpCi0JCQkJdXNhZ2UoKTsKLQkJCWNfZmxhZysrOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2snOgotCQkJa19mbGFnKys7Ci0JCQlicmVhazsKLQkJY2FzZSAncyc6Ci0JCQlpZiAoY19mbGFnKQotCQkJCXVzYWdlKCk7Ci0JCQlzX2ZsYWcrKzsKLQkJCWJyZWFrOwotCQljYXNlICdkJzoKLQkJCWlmIChkX2ZsYWcpCi0JCQkJdXNhZ2UoKTsKLQkJCWRfZmxhZysrOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2EnOgotCQkJYWdlbnRzb2NrZXQgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAndCc6Ci0JCQlpZiAoKGxpZmV0aW1lID0gY29udnRpbWUob3B0YXJnKSkgPT0gLTEpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgbGlmZXRpbWVcbiIpOwotCQkJCXVzYWdlKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXVzYWdlKCk7Ci0JCX0KLQl9Ci0JYWMgLT0gb3B0aW5kOwotCWF2ICs9IG9wdGluZDsKLQotCWlmIChhYyA+IDAgJiYgKGNfZmxhZyB8fCBrX2ZsYWcgfHwgc19mbGFnIHx8IGRfZmxhZykpCi0JCXVzYWdlKCk7Ci0KLQlpZiAoYWMgPT0gMCAmJiAhY19mbGFnICYmICFzX2ZsYWcpIHsKLQkJc2hlbGwgPSBnZXRlbnYoIlNIRUxMIik7Ci0JCWlmIChzaGVsbCAhPSBOVUxMICYmIChsZW4gPSBzdHJsZW4oc2hlbGwpKSA+IDIgJiYKLQkJICAgIHN0cm5jbXAoc2hlbGwgKyBsZW4gLSAzLCAiY3NoIiwgMykgPT0gMCkKLQkJCWNfZmxhZyA9IDE7Ci0JfQotCWlmIChrX2ZsYWcpIHsKLQkJY29uc3QgY2hhciAqZXJyc3RyID0gTlVMTDsKLQotCQlwaWRzdHIgPSBnZXRlbnYoU1NIX0FHRU5UUElEX0VOVl9OQU1FKTsKLQkJaWYgKHBpZHN0ciA9PSBOVUxMKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzIG5vdCBzZXQsIGNhbm5vdCBraWxsIGFnZW50XG4iLAotCQkJICAgIFNTSF9BR0VOVFBJRF9FTlZfTkFNRSk7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCXBpZCA9IChpbnQpc3RydG9udW0ocGlkc3RyLCAyLCBJTlRfTUFYLCAmZXJyc3RyKTsKLQkJaWYgKGVycnN0cikgewotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkgICAgIiVzPVwiJXNcIiwgd2hpY2ggaXMgbm90IGEgZ29vZCBQSUQ6ICVzXG4iLAotCQkJICAgIFNTSF9BR0VOVFBJRF9FTlZfTkFNRSwgcGlkc3RyLCBlcnJzdHIpOwotCQkJZXhpdCgxKTsKLQkJfQotCQlpZiAoa2lsbChwaWQsIFNJR1RFUk0pID09IC0xKSB7Ci0JCQlwZXJyb3IoImtpbGwiKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJZm9ybWF0ID0gY19mbGFnID8gInVuc2V0ZW52ICVzO1xuIiA6ICJ1bnNldCAlcztcbiI7Ci0JCXByaW50Zihmb3JtYXQsIFNTSF9BVVRIU09DS0VUX0VOVl9OQU1FKTsKLQkJcHJpbnRmKGZvcm1hdCwgU1NIX0FHRU5UUElEX0VOVl9OQU1FKTsKLQkJcHJpbnRmKCJlY2hvIEFnZW50IHBpZCAlbGQga2lsbGVkO1xuIiwgKGxvbmcpcGlkKTsKLQkJZXhpdCgwKTsKLQl9Ci0JcGFyZW50X3BpZCA9IGdldHBpZCgpOwotCi0JaWYgKGFnZW50c29ja2V0ID09IE5VTEwpIHsKLQkJLyogQ3JlYXRlIHByaXZhdGUgZGlyZWN0b3J5IGZvciBhZ2VudCBzb2NrZXQgKi8KLQkJbWt0ZW1wX3Byb3RvKHNvY2tldF9kaXIsIHNpemVvZihzb2NrZXRfZGlyKSk7Ci0JCWlmIChta2R0ZW1wKHNvY2tldF9kaXIpID09IE5VTEwpIHsKLQkJCXBlcnJvcigibWtkdGVtcDogcHJpdmF0ZSBzb2NrZXQgZGlyIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCXNucHJpbnRmKHNvY2tldF9uYW1lLCBzaXplb2Ygc29ja2V0X25hbWUsICIlcy9hZ2VudC4lbGQiLCBzb2NrZXRfZGlyLAotCQkgICAgKGxvbmcpcGFyZW50X3BpZCk7Ci0JfSBlbHNlIHsKLQkJLyogVHJ5IHRvIHVzZSBzcGVjaWZpZWQgYWdlbnQgc29ja2V0ICovCi0JCXNvY2tldF9kaXJbMF0gPSAnXDAnOwotCQlzdHJsY3B5KHNvY2tldF9uYW1lLCBhZ2VudHNvY2tldCwgc2l6ZW9mIHNvY2tldF9uYW1lKTsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSBzb2NrZXQgZWFybHkgc28gaXQgd2lsbCBleGlzdCBiZWZvcmUgY29tbWFuZCBnZXRzIHJ1biBmcm9tCi0JICogdGhlIHBhcmVudC4KLQkgKi8KLQlzb2NrID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKLQlpZiAoc29jayA8IDApIHsKLQkJcGVycm9yKCJzb2NrZXQiKTsKLQkJKnNvY2tldF9uYW1lID0gJ1wwJzsgLyogRG9uJ3QgdW5saW5rIGFueSBleGlzdGluZyBmaWxlICovCi0JCWNsZWFudXBfZXhpdCgxKTsKLQl9Ci0JbWVtc2V0KCZzdW5hZGRyLCAwLCBzaXplb2Yoc3VuYWRkcikpOwotCXN1bmFkZHIuc3VuX2ZhbWlseSA9IEFGX1VOSVg7Ci0Jc3RybGNweShzdW5hZGRyLnN1bl9wYXRoLCBzb2NrZXRfbmFtZSwgc2l6ZW9mKHN1bmFkZHIuc3VuX3BhdGgpKTsKLQlwcmV2X21hc2sgPSB1bWFzaygwMTc3KTsKLQlpZiAoYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZzdW5hZGRyLCBzaXplb2Yoc3VuYWRkcikpIDwgMCkgewotCQlwZXJyb3IoImJpbmQiKTsKLQkJKnNvY2tldF9uYW1lID0gJ1wwJzsgLyogRG9uJ3QgdW5saW5rIGFueSBleGlzdGluZyBmaWxlICovCi0JCXVtYXNrKHByZXZfbWFzayk7Ci0JCWNsZWFudXBfZXhpdCgxKTsKLQl9Ci0JdW1hc2socHJldl9tYXNrKTsKLQlpZiAobGlzdGVuKHNvY2ssIFNTSF9MSVNURU5fQkFDS0xPRykgPCAwKSB7Ci0JCXBlcnJvcigibGlzdGVuIik7Ci0JCWNsZWFudXBfZXhpdCgxKTsKLQl9Ci0KLQkvKgotCSAqIEZvcmssIGFuZCBoYXZlIHRoZSBwYXJlbnQgZXhlY3V0ZSB0aGUgY29tbWFuZCwgaWYgYW55LCBvciBwcmVzZW50Ci0JICogdGhlIHNvY2tldCBkYXRhLiAgVGhlIGNoaWxkIGNvbnRpbnVlcyBhcyB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQuCi0JICovCi0JaWYgKGRfZmxhZykgewotCQlsb2dfaW5pdChfX3Byb2duYW1lLCBTWVNMT0dfTEVWRUxfREVCVUcxLCBTWVNMT0dfRkFDSUxJVFlfQVVUSCwgMSk7Ci0JCWZvcm1hdCA9IGNfZmxhZyA/ICJzZXRlbnYgJXMgJXM7XG4iIDogIiVzPSVzOyBleHBvcnQgJXM7XG4iOwotCQlwcmludGYoZm9ybWF0LCBTU0hfQVVUSFNPQ0tFVF9FTlZfTkFNRSwgc29ja2V0X25hbWUsCi0JCSAgICBTU0hfQVVUSFNPQ0tFVF9FTlZfTkFNRSk7Ci0JCXByaW50ZigiZWNobyBBZ2VudCBwaWQgJWxkO1xuIiwgKGxvbmcpcGFyZW50X3BpZCk7Ci0JCWdvdG8gc2tpcDsKLQl9Ci0JcGlkID0gZm9yaygpOwotCWlmIChwaWQgPT0gLTEpIHsKLQkJcGVycm9yKCJmb3JrIik7Ci0JCWNsZWFudXBfZXhpdCgxKTsKLQl9Ci0JaWYgKHBpZCAhPSAwKSB7CQkvKiBQYXJlbnQgLSBleGVjdXRlIHRoZSBnaXZlbiBjb21tYW5kLiAqLwotCQljbG9zZShzb2NrKTsKLQkJc25wcmludGYocGlkc3RyYnVmLCBzaXplb2YgcGlkc3RyYnVmLCAiJWxkIiwgKGxvbmcpcGlkKTsKLQkJaWYgKGFjID09IDApIHsKLQkJCWZvcm1hdCA9IGNfZmxhZyA/ICJzZXRlbnYgJXMgJXM7XG4iIDogIiVzPSVzOyBleHBvcnQgJXM7XG4iOwotCQkJcHJpbnRmKGZvcm1hdCwgU1NIX0FVVEhTT0NLRVRfRU5WX05BTUUsIHNvY2tldF9uYW1lLAotCQkJICAgIFNTSF9BVVRIU09DS0VUX0VOVl9OQU1FKTsKLQkJCXByaW50Zihmb3JtYXQsIFNTSF9BR0VOVFBJRF9FTlZfTkFNRSwgcGlkc3RyYnVmLAotCQkJICAgIFNTSF9BR0VOVFBJRF9FTlZfTkFNRSk7Ci0JCQlwcmludGYoImVjaG8gQWdlbnQgcGlkICVsZDtcbiIsIChsb25nKXBpZCk7Ci0JCQlleGl0KDApOwotCQl9Ci0JCWlmIChzZXRlbnYoU1NIX0FVVEhTT0NLRVRfRU5WX05BTUUsIHNvY2tldF9uYW1lLCAxKSA9PSAtMSB8fAotCQkgICAgc2V0ZW52KFNTSF9BR0VOVFBJRF9FTlZfTkFNRSwgcGlkc3RyYnVmLCAxKSA9PSAtMSkgewotCQkJcGVycm9yKCJzZXRlbnYiKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJZXhlY3ZwKGF2WzBdLCBhdik7Ci0JCXBlcnJvcihhdlswXSk7Ci0JCWV4aXQoMSk7Ci0JfQotCS8qIGNoaWxkICovCi0JbG9nX2luaXQoX19wcm9nbmFtZSwgU1lTTE9HX0xFVkVMX0lORk8sIFNZU0xPR19GQUNJTElUWV9BVVRILCAwKTsKLQotCWlmIChzZXRzaWQoKSA9PSAtMSkgewotCQllcnJvcigic2V0c2lkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWNsZWFudXBfZXhpdCgxKTsKLQl9Ci0KLQkodm9pZCljaGRpcigiLyIpOwotCWlmICgoZmQgPSBvcGVuKF9QQVRIX0RFVk5VTEwsIE9fUkRXUiwgMCkpICE9IC0xKSB7Ci0JCS8qIFhYWCBtaWdodCBjbG9zZSBsaXN0ZW4gc29ja2V0ICovCi0JCSh2b2lkKWR1cDIoZmQsIFNURElOX0ZJTEVOTyk7Ci0JCSh2b2lkKWR1cDIoZmQsIFNURE9VVF9GSUxFTk8pOwotCQkodm9pZClkdXAyKGZkLCBTVERFUlJfRklMRU5PKTsKLQkJaWYgKGZkID4gMikKLQkJCWNsb3NlKGZkKTsKLQl9Ci0KLSNpZmRlZiBIQVZFX1NFVFJMSU1JVAotCS8qIGRlbnkgY29yZSBkdW1wcywgc2luY2UgbWVtb3J5IGNvbnRhaW5zIHVuZW5jcnlwdGVkIHByaXZhdGUga2V5cyAqLwotCXJsaW0ucmxpbV9jdXIgPSBybGltLnJsaW1fbWF4ID0gMDsKLQlpZiAoc2V0cmxpbWl0KFJMSU1JVF9DT1JFLCAmcmxpbSkgPCAwKSB7Ci0JCWVycm9yKCJzZXRybGltaXQgUkxJTUlUX0NPUkU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJY2xlYW51cF9leGl0KDEpOwotCX0KLSNlbmRpZgotCi1za2lwOgotCi0jaWZkZWYgRU5BQkxFX1BLQ1MxMQotCXBrY3MxMV9pbml0KDApOwotI2VuZGlmCi0JbmV3X3NvY2tldChBVVRIX1NPQ0tFVCwgc29jayk7Ci0JaWYgKGFjID4gMCkKLQkJcGFyZW50X2FsaXZlX2ludGVydmFsID0gMTA7Ci0JaWR0YWJfaW5pdCgpOwotCWlmICghZF9mbGFnKQotCQlzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKLQlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7Ci0Jc2lnbmFsKFNJR0hVUCwgY2xlYW51cF9oYW5kbGVyKTsKLQlzaWduYWwoU0lHVEVSTSwgY2xlYW51cF9oYW5kbGVyKTsKLQluYWxsb2MgPSAwOwotCi0Jd2hpbGUgKDEpIHsKLQkJcHJlcGFyZV9zZWxlY3QoJnJlYWRzZXRwLCAmd3JpdGVzZXRwLCAmbWF4X2ZkLCAmbmFsbG9jLCAmdHZwKTsKLQkJcmVzdWx0ID0gc2VsZWN0KG1heF9mZCArIDEsIHJlYWRzZXRwLCB3cml0ZXNldHAsIE5VTEwsIHR2cCk7Ci0JCXNhdmVkX2Vycm5vID0gZXJybm87Ci0JCWlmIChwYXJlbnRfYWxpdmVfaW50ZXJ2YWwgIT0gMCkKLQkJCWNoZWNrX3BhcmVudF9leGlzdHMoKTsKLQkJKHZvaWQpIHJlYXBlcigpOwkvKiByZW1vdmUgZXhwaXJlZCBrZXlzICovCi0JCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQlpZiAoc2F2ZWRfZXJybm8gPT0gRUlOVFIpCi0JCQkJY29udGludWU7Ci0JCQlmYXRhbCgic2VsZWN0OiAlcyIsIHN0cmVycm9yKHNhdmVkX2Vycm5vKSk7Ci0JCX0gZWxzZSBpZiAocmVzdWx0ID4gMCkKLQkJCWFmdGVyX3NlbGVjdChyZWFkc2V0cCwgd3JpdGVzZXRwKTsKLQl9Ci0JLyogTk9UUkVBQ0hFRCAqLwotfQpkaWZmIC0tZ2l0IGEvc3NoLWRzcy5jIGIvc3NoLWRzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGU1ZTIxLi4wMDAwMDAwCi0tLSBhL3NzaC1kc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKiAkT3BlbkJTRDogc3NoLWRzcy5jLHYgMS4yNyAyMDEwLzA4LzMxIDA5OjU4OjM3IGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0KLSNkZWZpbmUgSU5UQkxPQl9MRU4JMjAKLSNkZWZpbmUgU0lHQkxPQl9MRU4JKDIqSU5UQkxPQl9MRU4pCi0KLWludAotc3NoX2Rzc19zaWduKGNvbnN0IEtleSAqa2V5LCB1X2NoYXIgKipzaWdwLCB1X2ludCAqbGVucCwKLSAgICBjb25zdCB1X2NoYXIgKmRhdGEsIHVfaW50IGRhdGFsZW4pCi17Ci0JRFNBX1NJRyAqc2lnOwotCWNvbnN0IEVWUF9NRCAqZXZwX21kID0gRVZQX3NoYTEoKTsKLQlFVlBfTURfQ1RYIG1kOwotCXVfY2hhciBkaWdlc3RbRVZQX01BWF9NRF9TSVpFXSwgc2lnYmxvYltTSUdCTE9CX0xFTl07Ci0JdV9pbnQgcmxlbiwgc2xlbiwgbGVuLCBkbGVuOwotCUJ1ZmZlciBiOwotCi0JaWYgKGtleSA9PSBOVUxMIHx8IGtleS0+ZHNhID09IE5VTEwgfHwgKGtleS0+dHlwZSAhPSBLRVlfRFNBICYmCi0JICAgIGtleS0+dHlwZSAhPSBLRVlfRFNBX0NFUlQgJiYga2V5LT50eXBlICE9IEtFWV9EU0FfQ0VSVF9WMDApKSB7Ci0JCWVycm9yKCJzc2hfZHNzX3NpZ246IG5vIERTQSBrZXkiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlFVlBfRGlnZXN0SW5pdCgmbWQsIGV2cF9tZCk7Ci0JRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGRhdGEsIGRhdGFsZW4pOwotCUVWUF9EaWdlc3RGaW5hbCgmbWQsIGRpZ2VzdCwgJmRsZW4pOwotCi0Jc2lnID0gRFNBX2RvX3NpZ24oZGlnZXN0LCBkbGVuLCBrZXktPmRzYSk7Ci0JbWVtc2V0KGRpZ2VzdCwgJ2QnLCBzaXplb2YoZGlnZXN0KSk7Ci0KLQlpZiAoc2lnID09IE5VTEwpIHsKLQkJZXJyb3IoInNzaF9kc3Nfc2lnbjogc2lnbiBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJsZW4gPSBCTl9udW1fYnl0ZXMoc2lnLT5yKTsKLQlzbGVuID0gQk5fbnVtX2J5dGVzKHNpZy0+cyk7Ci0JaWYgKHJsZW4gPiBJTlRCTE9CX0xFTiB8fCBzbGVuID4gSU5UQkxPQl9MRU4pIHsKLQkJZXJyb3IoImJhZCBzaWcgc2l6ZSAldSAldSIsIHJsZW4sIHNsZW4pOwotCQlEU0FfU0lHX2ZyZWUoc2lnKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltZW1zZXQoc2lnYmxvYiwgMCwgU0lHQkxPQl9MRU4pOwotCUJOX2JuMmJpbihzaWctPnIsIHNpZ2Jsb2IrIFNJR0JMT0JfTEVOIC0gSU5UQkxPQl9MRU4gLSBybGVuKTsKLQlCTl9ibjJiaW4oc2lnLT5zLCBzaWdibG9iKyBTSUdCTE9CX0xFTiAtIHNsZW4pOwotCURTQV9TSUdfZnJlZShzaWcpOwotCi0JaWYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19TSUdCTE9CKSB7Ci0JCWlmIChsZW5wICE9IE5VTEwpCi0JCQkqbGVucCA9IFNJR0JMT0JfTEVOOwotCQlpZiAoc2lncCAhPSBOVUxMKSB7Ci0JCQkqc2lncCA9IHhtYWxsb2MoU0lHQkxPQl9MRU4pOwotCQkJbWVtY3B5KCpzaWdwLCBzaWdibG9iLCBTSUdCTE9CX0xFTik7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBpZXRmLWRyYWZ0cyAqLwotCQlidWZmZXJfaW5pdCgmYik7Ci0JCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgInNzaC1kc3MiKTsKLQkJYnVmZmVyX3B1dF9zdHJpbmcoJmIsIHNpZ2Jsb2IsIFNJR0JMT0JfTEVOKTsKLQkJbGVuID0gYnVmZmVyX2xlbigmYik7Ci0JCWlmIChsZW5wICE9IE5VTEwpCi0JCQkqbGVucCA9IGxlbjsKLQkJaWYgKHNpZ3AgIT0gTlVMTCkgewotCQkJKnNpZ3AgPSB4bWFsbG9jKGxlbik7Ci0JCQltZW1jcHkoKnNpZ3AsIGJ1ZmZlcl9wdHIoJmIpLCBsZW4pOwotCQl9Ci0JCWJ1ZmZlcl9mcmVlKCZiKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1pbnQKLXNzaF9kc3NfdmVyaWZ5KGNvbnN0IEtleSAqa2V5LCBjb25zdCB1X2NoYXIgKnNpZ25hdHVyZSwgdV9pbnQgc2lnbmF0dXJlbGVuLAotICAgIGNvbnN0IHVfY2hhciAqZGF0YSwgdV9pbnQgZGF0YWxlbikKLXsKLQlEU0FfU0lHICpzaWc7Ci0JY29uc3QgRVZQX01EICpldnBfbWQgPSBFVlBfc2hhMSgpOwotCUVWUF9NRF9DVFggbWQ7Ci0JdV9jaGFyIGRpZ2VzdFtFVlBfTUFYX01EX1NJWkVdLCAqc2lnYmxvYjsKLQl1X2ludCBsZW4sIGRsZW47Ci0JaW50IHJsZW4sIHJldDsKLQlCdWZmZXIgYjsKLQotCWlmIChrZXkgPT0gTlVMTCB8fCBrZXktPmRzYSA9PSBOVUxMIHx8IChrZXktPnR5cGUgIT0gS0VZX0RTQSAmJgotCSAgICBrZXktPnR5cGUgIT0gS0VZX0RTQV9DRVJUICYmIGtleS0+dHlwZSAhPSBLRVlfRFNBX0NFUlRfVjAwKSkgewotCQllcnJvcigic3NoX2Rzc192ZXJpZnk6IG5vIERTQSBrZXkiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGZldGNoIHNpZ25hdHVyZSAqLwotCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfU0lHQkxPQikgewotCQlzaWdibG9iID0geG1hbGxvYyhzaWduYXR1cmVsZW4pOwotCQltZW1jcHkoc2lnYmxvYiwgc2lnbmF0dXJlLCBzaWduYXR1cmVsZW4pOwotCQlsZW4gPSBzaWduYXR1cmVsZW47Ci0JfSBlbHNlIHsKLQkJLyogaWV0Zi1kcmFmdHMgKi8KLQkJY2hhciAqa3R5cGU7Ci0JCWJ1ZmZlcl9pbml0KCZiKTsKLQkJYnVmZmVyX2FwcGVuZCgmYiwgc2lnbmF0dXJlLCBzaWduYXR1cmVsZW4pOwotCQlrdHlwZSA9IGJ1ZmZlcl9nZXRfY3N0cmluZygmYiwgTlVMTCk7Ci0JCWlmIChzdHJjbXAoInNzaC1kc3MiLCBrdHlwZSkgIT0gMCkgewotCQkJZXJyb3IoInNzaF9kc3NfdmVyaWZ5OiBjYW5ub3QgaGFuZGxlIHR5cGUgJXMiLCBrdHlwZSk7Ci0JCQlidWZmZXJfZnJlZSgmYik7Ci0JCQl4ZnJlZShrdHlwZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJeGZyZWUoa3R5cGUpOwotCQlzaWdibG9iID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsICZsZW4pOwotCQlybGVuID0gYnVmZmVyX2xlbigmYik7Ci0JCWJ1ZmZlcl9mcmVlKCZiKTsKLQkJaWYgKHJsZW4gIT0gMCkgewotCQkJZXJyb3IoInNzaF9kc3NfdmVyaWZ5OiAiCi0JCQkgICAgInJlbWFpbmluZyBieXRlcyBpbiBzaWduYXR1cmUgJWQiLCBybGVuKTsKLQkJCXhmcmVlKHNpZ2Jsb2IpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JaWYgKGxlbiAhPSBTSUdCTE9CX0xFTikgewotCQlmYXRhbCgiYmFkIHNpZ2Jsb2JsZW4gJXUgIT0gU0lHQkxPQl9MRU4iLCBsZW4pOwotCX0KLQotCS8qIHBhcnNlIHNpZ25hdHVyZSAqLwotCWlmICgoc2lnID0gRFNBX1NJR19uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoInNzaF9kc3NfdmVyaWZ5OiBEU0FfU0lHX25ldyBmYWlsZWQiKTsKLQlpZiAoKHNpZy0+ciA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgic3NoX2Rzc192ZXJpZnk6IEJOX25ldyBmYWlsZWQiKTsKLQlpZiAoKHNpZy0+cyA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgic3NoX2Rzc192ZXJpZnk6IEJOX25ldyBmYWlsZWQiKTsKLQlpZiAoKEJOX2JpbjJibihzaWdibG9iLCBJTlRCTE9CX0xFTiwgc2lnLT5yKSA9PSBOVUxMKSB8fAotCSAgICAoQk5fYmluMmJuKHNpZ2Jsb2IrIElOVEJMT0JfTEVOLCBJTlRCTE9CX0xFTiwgc2lnLT5zKSA9PSBOVUxMKSkKLQkJZmF0YWwoInNzaF9kc3NfdmVyaWZ5OiBCTl9iaW4yYm4gZmFpbGVkIik7Ci0KLQkvKiBjbGVhbiB1cCAqLwotCW1lbXNldChzaWdibG9iLCAwLCBsZW4pOwotCXhmcmVlKHNpZ2Jsb2IpOwotCi0JLyogc2hhMSB0aGUgZGF0YSAqLwotCUVWUF9EaWdlc3RJbml0KCZtZCwgZXZwX21kKTsKLQlFVlBfRGlnZXN0VXBkYXRlKCZtZCwgZGF0YSwgZGF0YWxlbik7Ci0JRVZQX0RpZ2VzdEZpbmFsKCZtZCwgZGlnZXN0LCAmZGxlbik7Ci0KLQlyZXQgPSBEU0FfZG9fdmVyaWZ5KGRpZ2VzdCwgZGxlbiwgc2lnLCBrZXktPmRzYSk7Ci0JbWVtc2V0KGRpZ2VzdCwgJ2QnLCBzaXplb2YoZGlnZXN0KSk7Ci0KLQlEU0FfU0lHX2ZyZWUoc2lnKTsKLQotCWRlYnVnKCJzc2hfZHNzX3ZlcmlmeTogc2lnbmF0dXJlICVzIiwKLQkgICAgcmV0ID09IDEgPyAiY29ycmVjdCIgOiByZXQgPT0gMCA/ICJpbmNvcnJlY3QiIDogImVycm9yIik7Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL3NzaC1lY2RzYS5jIGIvc3NoLWVjZHNhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Mjc2YjQuLjAwMDAwMDAKLS0tIGEvc3NoLWVjZHNhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNzaC1lY2RzYS5jLHYgMS40IDIwMTAvMDkvMTAgMDE6MDQ6MTAgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDEwIERhbWllbiBNaWxsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZWNkc2EuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0KLWludAotc3NoX2VjZHNhX3NpZ24oY29uc3QgS2V5ICprZXksIHVfY2hhciAqKnNpZ3AsIHVfaW50ICpsZW5wLAotICAgIGNvbnN0IHVfY2hhciAqZGF0YSwgdV9pbnQgZGF0YWxlbikKLXsKLQlFQ0RTQV9TSUcgKnNpZzsKLQljb25zdCBFVlBfTUQgKmV2cF9tZDsKLQlFVlBfTURfQ1RYIG1kOwotCXVfY2hhciBkaWdlc3RbRVZQX01BWF9NRF9TSVpFXTsKLQl1X2ludCBsZW4sIGRsZW47Ci0JQnVmZmVyIGIsIGJiOwotCi0JaWYgKGtleSA9PSBOVUxMIHx8IGtleS0+ZWNkc2EgPT0gTlVMTCB8fAotCSAgICAoa2V5LT50eXBlICE9IEtFWV9FQ0RTQSAmJiBrZXktPnR5cGUgIT0gS0VZX0VDRFNBX0NFUlQpKSB7Ci0JCWVycm9yKCIlczogbm8gRUNEU0Ega2V5IiwgX19mdW5jX18pOwotCQlyZXR1cm4gLTE7Ci0JfQotCWV2cF9tZCA9IGtleV9lY19uaWRfdG9fZXZwbWQoa2V5LT5lY2RzYV9uaWQpOwotCUVWUF9EaWdlc3RJbml0KCZtZCwgZXZwX21kKTsKLQlFVlBfRGlnZXN0VXBkYXRlKCZtZCwgZGF0YSwgZGF0YWxlbik7Ci0JRVZQX0RpZ2VzdEZpbmFsKCZtZCwgZGlnZXN0LCAmZGxlbik7Ci0KLQlzaWcgPSBFQ0RTQV9kb19zaWduKGRpZ2VzdCwgZGxlbiwga2V5LT5lY2RzYSk7Ci0JbWVtc2V0KGRpZ2VzdCwgJ2QnLCBzaXplb2YoZGlnZXN0KSk7Ci0KLQlpZiAoc2lnID09IE5VTEwpIHsKLQkJZXJyb3IoIiVzOiBzaWduIGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWJ1ZmZlcl9pbml0KCZiYik7Ci0JYnVmZmVyX3B1dF9iaWdudW0yKCZiYiwgc2lnLT5yKTsKLQlidWZmZXJfcHV0X2JpZ251bTIoJmJiLCBzaWctPnMpOwotCUVDRFNBX1NJR19mcmVlKHNpZyk7Ci0KLQlidWZmZXJfaW5pdCgmYik7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBrZXlfc3NoX25hbWVfcGxhaW4oa2V5KSk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJmIsIGJ1ZmZlcl9wdHIoJmJiKSwgYnVmZmVyX2xlbigmYmIpKTsKLQlidWZmZXJfZnJlZSgmYmIpOwotCWxlbiA9IGJ1ZmZlcl9sZW4oJmIpOwotCWlmIChsZW5wICE9IE5VTEwpCi0JCSpsZW5wID0gbGVuOwotCWlmIChzaWdwICE9IE5VTEwpIHsKLQkJKnNpZ3AgPSB4bWFsbG9jKGxlbik7Ci0JCW1lbWNweSgqc2lncCwgYnVmZmVyX3B0cigmYiksIGxlbik7Ci0JfQotCWJ1ZmZlcl9mcmVlKCZiKTsKLQotCXJldHVybiAwOwotfQotaW50Ci1zc2hfZWNkc2FfdmVyaWZ5KGNvbnN0IEtleSAqa2V5LCBjb25zdCB1X2NoYXIgKnNpZ25hdHVyZSwgdV9pbnQgc2lnbmF0dXJlbGVuLAotICAgIGNvbnN0IHVfY2hhciAqZGF0YSwgdV9pbnQgZGF0YWxlbikKLXsKLQlFQ0RTQV9TSUcgKnNpZzsKLQljb25zdCBFVlBfTUQgKmV2cF9tZDsKLQlFVlBfTURfQ1RYIG1kOwotCXVfY2hhciBkaWdlc3RbRVZQX01BWF9NRF9TSVpFXSwgKnNpZ2Jsb2I7Ci0JdV9pbnQgbGVuLCBkbGVuOwotCWludCBybGVuLCByZXQ7Ci0JQnVmZmVyIGIsIGJiOwotCWNoYXIgKmt0eXBlOwotCi0JaWYgKGtleSA9PSBOVUxMIHx8IGtleS0+ZWNkc2EgPT0gTlVMTCB8fAotCSAgICAoa2V5LT50eXBlICE9IEtFWV9FQ0RTQSAmJiBrZXktPnR5cGUgIT0gS0VZX0VDRFNBX0NFUlQpKSB7Ci0JCWVycm9yKCIlczogbm8gRUNEU0Ega2V5IiwgX19mdW5jX18pOwotCQlyZXR1cm4gLTE7Ci0JfQotCWV2cF9tZCA9IGtleV9lY19uaWRfdG9fZXZwbWQoa2V5LT5lY2RzYV9uaWQpOwotCi0JLyogZmV0Y2ggc2lnbmF0dXJlICovCi0JYnVmZmVyX2luaXQoJmIpOwotCWJ1ZmZlcl9hcHBlbmQoJmIsIHNpZ25hdHVyZSwgc2lnbmF0dXJlbGVuKTsKLQlrdHlwZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCBOVUxMKTsKLQlpZiAoc3RyY21wKGtleV9zc2hfbmFtZV9wbGFpbihrZXkpLCBrdHlwZSkgIT0gMCkgewotCQllcnJvcigiJXM6IGNhbm5vdCBoYW5kbGUgdHlwZSAlcyIsIF9fZnVuY19fLCBrdHlwZSk7Ci0JCWJ1ZmZlcl9mcmVlKCZiKTsKLQkJeGZyZWUoa3R5cGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXhmcmVlKGt0eXBlKTsKLQlzaWdibG9iID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsICZsZW4pOwotCXJsZW4gPSBidWZmZXJfbGVuKCZiKTsKLQlidWZmZXJfZnJlZSgmYik7Ci0JaWYgKHJsZW4gIT0gMCkgewotCQllcnJvcigiJXM6IHJlbWFpbmluZyBieXRlcyBpbiBzaWduYXR1cmUgJWQiLCBfX2Z1bmNfXywgcmxlbik7Ci0JCXhmcmVlKHNpZ2Jsb2IpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogcGFyc2Ugc2lnbmF0dXJlICovCi0JaWYgKChzaWcgPSBFQ0RTQV9TSUdfbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogRUNEU0FfU0lHX25ldyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JaWYgKChzaWctPnIgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAotCSAgICAoc2lnLT5zID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fbmV3IGZhaWxlZCIsIF9fZnVuY19fKTsKLQotCWJ1ZmZlcl9pbml0KCZiYik7Ci0JYnVmZmVyX2FwcGVuZCgmYmIsIHNpZ2Jsb2IsIGxlbik7Ci0JYnVmZmVyX2dldF9iaWdudW0yKCZiYiwgc2lnLT5yKTsKLQlidWZmZXJfZ2V0X2JpZ251bTIoJmJiLCBzaWctPnMpOwotCWlmIChidWZmZXJfbGVuKCZiYikgIT0gMCkKLQkJZmF0YWwoIiVzOiByZW1haW5pbmcgYnl0ZXMgaW4gaW5uZXIgc2lnYmxvYiIsIF9fZnVuY19fKTsKLQotCS8qIGNsZWFuIHVwICovCi0JbWVtc2V0KHNpZ2Jsb2IsIDAsIGxlbik7Ci0JeGZyZWUoc2lnYmxvYik7Ci0KLQkvKiBoYXNoIHRoZSBkYXRhICovCi0JRVZQX0RpZ2VzdEluaXQoJm1kLCBldnBfbWQpOwotCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBkYXRhLCBkYXRhbGVuKTsKLQlFVlBfRGlnZXN0RmluYWwoJm1kLCBkaWdlc3QsICZkbGVuKTsKLQotCXJldCA9IEVDRFNBX2RvX3ZlcmlmeShkaWdlc3QsIGRsZW4sIHNpZywga2V5LT5lY2RzYSk7Ci0JbWVtc2V0KGRpZ2VzdCwgJ2QnLCBzaXplb2YoZGlnZXN0KSk7Ci0KLQlFQ0RTQV9TSUdfZnJlZShzaWcpOwotCi0JZGVidWcoIiVzOiBzaWduYXR1cmUgJXMiLCBfX2Z1bmNfXywKLQkgICAgcmV0ID09IDEgPyAiY29ycmVjdCIgOiByZXQgPT0gMCA/ICJpbmNvcnJlY3QiIDogImVycm9yIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotI2VuZGlmIC8qIE9QRU5TU0xfSEFTX0VDQyAqLwpkaWZmIC0tZ2l0IGEvc3NoLWdzcy5oIGIvc3NoLWdzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjlhMWI3Li4wMDAwMDAwCi0tLSBhL3NzaC1nc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKiAkT3BlbkJTRDogc3NoLWdzcy5oLHYgMS4xMCAyMDA3LzA2LzEyIDA4OjIwOjAwIGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFNpbW9uIFdpbGtpbnNvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9TU0hfR1NTX0gKLSNkZWZpbmUgX1NTSF9HU1NfSAotCi0jaWZkZWYgR1NTQVBJCi0KLSNpZmRlZiBIQVZFX0dTU0FQSV9ICi0jaW5jbHVkZSA8Z3NzYXBpLmg+Ci0jZWxpZiBkZWZpbmVkKEhBVkVfR1NTQVBJX0dTU0FQSV9IKQotI2luY2x1ZGUgPGdzc2FwaS9nc3NhcGkuaD4KLSNlbmRpZgotCi0jaWZkZWYgS1JCNQotIyBpZm5kZWYgSEVJTURBTAotIyAgaWZkZWYgSEFWRV9HU1NBUElfR0VORVJJQ19ICi0jICAgaW5jbHVkZSA8Z3NzYXBpX2dlbmVyaWMuaD4KLSMgIGVsaWYgZGVmaW5lZChIQVZFX0dTU0FQSV9HU1NBUElfR0VORVJJQ19IKQotIyAgIGluY2x1ZGUgPGdzc2FwaS9nc3NhcGlfZ2VuZXJpYy5oPgotIyAgZW5kaWYKLQotLyogTUlUIEtlcmJlcm9zIGRvZXNuJ3Qgc2VlbSB0byBkZWZpbmUgR1NTX05UX0hPU1RCQVNFRF9TRVJWSUNFICovCi0KLSNpZm5kZWYgR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UKLSNkZWZpbmUgR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UgZ3NzX250X3NlcnZpY2VfbmFtZQotI2VuZGlmIC8qIEdTU19DX05UXy4uLiAqLwotI2VuZGlmIC8qICFIRUlNREFMICovCi0jZW5kaWYgLyogS1JCNSAqLwotCi0vKiBkcmFmdC1pZXRmLXNlY3NoLWdzc2tleWV4LTA2ICovCi0jZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9SRVNQT05TRQkJNjAKLSNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX1RPS0VOCQkJNjEKLSNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX0VYQ0hBTkdFX0NPTVBMRVRFCTYzCi0jZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9FUlJPUgkJCTY0Ci0jZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9FUlJUT0sJCQk2NQotI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfTUlDCQkJNjYKLQotI2RlZmluZSBTU0hfR1NTX09JRFRZUEUgMHgwNgotCi10eXBlZGVmIHN0cnVjdCB7Ci0JY2hhciAqZmlsZW5hbWU7Ci0JY2hhciAqZW52dmFyOwotCWNoYXIgKmVudnZhbDsKLQl2b2lkICpkYXRhOwotfSBzc2hfZ3NzYXBpX2NjYWNoZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWdzc19idWZmZXJfZGVzYyBkaXNwbGF5bmFtZTsKLQlnc3NfYnVmZmVyX2Rlc2MgZXhwb3J0ZWRuYW1lOwotCWdzc19jcmVkX2lkX3QgY3JlZHM7Ci0Jc3RydWN0IHNzaF9nc3NhcGlfbWVjaF9zdHJ1Y3QgKm1lY2g7Ci0Jc3NoX2dzc2FwaV9jY2FjaGUgc3RvcmU7Ci19IHNzaF9nc3NhcGlfY2xpZW50OwotCi10eXBlZGVmIHN0cnVjdCBzc2hfZ3NzYXBpX21lY2hfc3RydWN0IHsKLQljaGFyICplbmNfbmFtZTsKLQljaGFyICpuYW1lOwotCWdzc19PSURfZGVzYyBvaWQ7Ci0JaW50ICgqZG9jaGlsZCkgKHNzaF9nc3NhcGlfY2xpZW50ICopOwotCWludCAoKnVzZXJvaykgKHNzaF9nc3NhcGlfY2xpZW50ICosIGNoYXIgKik7Ci0JaW50ICgqbG9jYWxuYW1lKSAoc3NoX2dzc2FwaV9jbGllbnQgKiwgY2hhciAqKik7Ci0Jdm9pZCAoKnN0b3JlY3JlZHMpIChzc2hfZ3NzYXBpX2NsaWVudCAqKTsKLX0gc3NoX2dzc2FwaV9tZWNoOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JT01fdWludDMyCW1ham9yOyAvKiBib3RoICovCi0JT01fdWludDMyCW1pbm9yOyAvKiBib3RoICovCi0JZ3NzX2N0eF9pZF90CWNvbnRleHQ7IC8qIGJvdGggKi8KLQlnc3NfbmFtZV90CW5hbWU7IC8qIGJvdGggKi8KLQlnc3NfT0lECQlvaWQ7IC8qIGNsaWVudCAqLwotCWdzc19jcmVkX2lkX3QJY3JlZHM7IC8qIHNlcnZlciAqLwotCWdzc19uYW1lX3QJY2xpZW50OyAvKiBzZXJ2ZXIgKi8KLQlnc3NfY3JlZF9pZF90CWNsaWVudF9jcmVkczsgLyogc2VydmVyICovCi19IEdzc2N0eHQ7Ci0KLWV4dGVybiBzc2hfZ3NzYXBpX21lY2ggKnN1cHBvcnRlZF9tZWNoc1tdOwotCi1pbnQgIHNzaF9nc3NhcGlfY2hlY2tfb2lkKEdzc2N0eHQgKiwgdm9pZCAqLCBzaXplX3QpOwotdm9pZCBzc2hfZ3NzYXBpX3NldF9vaWRfZGF0YShHc3NjdHh0ICosIHZvaWQgKiwgc2l6ZV90KTsKLXZvaWQgc3NoX2dzc2FwaV9zZXRfb2lkKEdzc2N0eHQgKiwgZ3NzX09JRCk7Ci12b2lkIHNzaF9nc3NhcGlfc3VwcG9ydGVkX29pZHMoZ3NzX09JRF9zZXQgKik7Ci1zc2hfZ3NzYXBpX21lY2ggKnNzaF9nc3NhcGlfZ2V0X2N0eXBlKEdzc2N0eHQgKik7Ci0KLU9NX3VpbnQzMiBzc2hfZ3NzYXBpX2ltcG9ydF9uYW1lKEdzc2N0eHQgKiwgY29uc3QgY2hhciAqKTsKLU9NX3VpbnQzMiBzc2hfZ3NzYXBpX2luaXRfY3R4KEdzc2N0eHQgKiwgaW50LAotICAgIGdzc19idWZmZXJfZGVzYyAqLCBnc3NfYnVmZmVyX2Rlc2MgKiwgT01fdWludDMyICopOwotT01fdWludDMyIHNzaF9nc3NhcGlfYWNjZXB0X2N0eChHc3NjdHh0ICosCi0gICAgZ3NzX2J1ZmZlcl9kZXNjICosIGdzc19idWZmZXJfZGVzYyAqLCBPTV91aW50MzIgKik7Ci1PTV91aW50MzIgc3NoX2dzc2FwaV9nZXRjbGllbnQoR3NzY3R4dCAqLCBzc2hfZ3NzYXBpX2NsaWVudCAqKTsKLXZvaWQgc3NoX2dzc2FwaV9lcnJvcihHc3NjdHh0ICopOwotY2hhciAqc3NoX2dzc2FwaV9sYXN0X2Vycm9yKEdzc2N0eHQgKiwgT01fdWludDMyICosIE9NX3VpbnQzMiAqKTsKLXZvaWQgc3NoX2dzc2FwaV9idWlsZF9jdHgoR3NzY3R4dCAqKik7Ci12b2lkIHNzaF9nc3NhcGlfZGVsZXRlX2N0eChHc3NjdHh0ICoqKTsKLU9NX3VpbnQzMiBzc2hfZ3NzYXBpX3NpZ24oR3NzY3R4dCAqLCBnc3NfYnVmZmVyX3QsIGdzc19idWZmZXJfdCk7Ci12b2lkIHNzaF9nc3NhcGlfYnVpbGRtaWMoQnVmZmVyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotaW50IHNzaF9nc3NhcGlfY2hlY2tfbWVjaGFuaXNtKEdzc2N0eHQgKiosIGdzc19PSUQsIGNvbnN0IGNoYXIgKik7Ci0KLS8qIEluIHRoZSBzZXJ2ZXIgKi8KLU9NX3VpbnQzMiBzc2hfZ3NzYXBpX3NlcnZlcl9jdHgoR3NzY3R4dCAqKiwgZ3NzX09JRCk7Ci1pbnQgc3NoX2dzc2FwaV91c2Vyb2soY2hhciAqbmFtZSk7Ci1PTV91aW50MzIgc3NoX2dzc2FwaV9jaGVja21pYyhHc3NjdHh0ICosIGdzc19idWZmZXJfdCwgZ3NzX2J1ZmZlcl90KTsKLXZvaWQgc3NoX2dzc2FwaV9kb19jaGlsZChjaGFyICoqKiwgdV9pbnQgKik7Ci12b2lkIHNzaF9nc3NhcGlfY2xlYW51cF9jcmVkcyh2b2lkKTsKLXZvaWQgc3NoX2dzc2FwaV9zdG9yZWNyZWRzKHZvaWQpOwotCi0jZW5kaWYgLyogR1NTQVBJICovCi0KLSNlbmRpZiAvKiBfU1NIX0dTU19IICovCmRpZmYgLS1naXQgYS9zc2gta2V5Z2VuLjAgYi9zc2gta2V5Z2VuLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTc2M2QuLjAwMDAwMDAKLS0tIGEvc3NoLWtleWdlbi4wCisrKyAvZGV2L251bGwKQEAgLTEsNDU0ICswLDAgQEAKLVNTSC1LRVlHRU4oMSkgICAgICAgICAgICAgIE9wZW5CU0QgUmVmZXJlbmNlIE1hbnVhbCAgICAgICAgICAgICAgU1NILUtFWUdFTigxKQotCi1OQU1FCi0gICAgIHNzaC1rZXlnZW4gLSBhdXRoZW50aWNhdGlvbiBrZXkgZ2VuZXJhdGlvbiwgbWFuYWdlbWVudCBhbmQgY29udmVyc2lvbgotCi1TWU5PUFNJUwotICAgICBzc2gta2V5Z2VuIFstcV0gWy1iIGJpdHNdIC10IHR5cGUgWy1OIG5ld19wYXNzcGhyYXNlXSBbLUMgY29tbWVudF0KLSAgICAgICAgICAgICAgICBbLWYgb3V0cHV0X2tleWZpbGVdCi0gICAgIHNzaC1rZXlnZW4gLXAgWy1QIG9sZF9wYXNzcGhyYXNlXSBbLU4gbmV3X3Bhc3NwaHJhc2VdIFstZiBrZXlmaWxlXQotICAgICBzc2gta2V5Z2VuIC1pIFstbSBrZXlfZm9ybWF0XSBbLWYgaW5wdXRfa2V5ZmlsZV0KLSAgICAgc3NoLWtleWdlbiAtZSBbLW0ga2V5X2Zvcm1hdF0gWy1mIGlucHV0X2tleWZpbGVdCi0gICAgIHNzaC1rZXlnZW4gLXkgWy1mIGlucHV0X2tleWZpbGVdCi0gICAgIHNzaC1rZXlnZW4gLWMgWy1QIHBhc3NwaHJhc2VdIFstQyBjb21tZW50XSBbLWYga2V5ZmlsZV0KLSAgICAgc3NoLWtleWdlbiAtbCBbLWYgaW5wdXRfa2V5ZmlsZV0KLSAgICAgc3NoLWtleWdlbiAtQiBbLWYgaW5wdXRfa2V5ZmlsZV0KLSAgICAgc3NoLWtleWdlbiAtRCBwa2NzMTEKLSAgICAgc3NoLWtleWdlbiAtRiBob3N0bmFtZSBbLWYga25vd25faG9zdHNfZmlsZV0gWy1sXQotICAgICBzc2gta2V5Z2VuIC1IIFstZiBrbm93bl9ob3N0c19maWxlXQotICAgICBzc2gta2V5Z2VuIC1SIGhvc3RuYW1lIFstZiBrbm93bl9ob3N0c19maWxlXQotICAgICBzc2gta2V5Z2VuIC1yIGhvc3RuYW1lIFstZiBpbnB1dF9rZXlmaWxlXSBbLWddCi0gICAgIHNzaC1rZXlnZW4gLUcgb3V0cHV0X2ZpbGUgWy12XSBbLWIgYml0c10gWy1NIG1lbW9yeV0gWy1TIHN0YXJ0X3BvaW50XQotICAgICBzc2gta2V5Z2VuIC1UIG91dHB1dF9maWxlIC1mIGlucHV0X2ZpbGUgWy12XSBbLWEgbnVtX3RyaWFsc10KLSAgICAgICAgICAgICAgICBbLVcgZ2VuZXJhdG9yXQotICAgICBzc2gta2V5Z2VuIC1zIGNhX2tleSAtSSBjZXJ0aWZpY2F0ZV9pZGVudGl0eSBbLWhdIFstbiBwcmluY2lwYWxzXQotICAgICAgICAgICAgICAgIFstTyBvcHRpb25dIFstViB2YWxpZGl0eV9pbnRlcnZhbF0gWy16IHNlcmlhbF9udW1iZXJdIGZpbGUgLi4uCi0gICAgIHNzaC1rZXlnZW4gLUwgWy1mIGlucHV0X2tleWZpbGVdCi0gICAgIHNzaC1rZXlnZW4gLUEKLQotREVTQ1JJUFRJT04KLSAgICAgc3NoLWtleWdlbiBnZW5lcmF0ZXMsIG1hbmFnZXMgYW5kIGNvbnZlcnRzIGF1dGhlbnRpY2F0aW9uIGtleXMgZm9yCi0gICAgIHNzaCgxKS4gIHNzaC1rZXlnZW4gY2FuIGNyZWF0ZSBSU0Ega2V5cyBmb3IgdXNlIGJ5IFNTSCBwcm90b2NvbCB2ZXJzaW9uIDEKLSAgICAgYW5kIERTQSwgRUNEU0Egb3IgUlNBIGtleXMgZm9yIHVzZSBieSBTU0ggcHJvdG9jb2wgdmVyc2lvbiAyLiAgVGhlIHR5cGUKLSAgICAgb2Yga2V5IHRvIGJlIGdlbmVyYXRlZCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgLXQgb3B0aW9uLiAgSWYgaW52b2tlZAotICAgICB3aXRob3V0IGFueSBhcmd1bWVudHMsIHNzaC1rZXlnZW4gd2lsbCBnZW5lcmF0ZSBhbiBSU0Ega2V5IGZvciB1c2UgaW4gU1NICi0gICAgIHByb3RvY29sIDIgY29ubmVjdGlvbnMuCi0KLSAgICAgc3NoLWtleWdlbiBpcyBhbHNvIHVzZWQgdG8gZ2VuZXJhdGUgZ3JvdXBzIGZvciB1c2UgaW4gRGlmZmllLUhlbGxtYW4KLSAgICAgZ3JvdXAgZXhjaGFuZ2UgKERILUdFWCkuICBTZWUgdGhlIE1PRFVMSSBHRU5FUkFUSU9OIHNlY3Rpb24gZm9yIGRldGFpbHMuCi0KLSAgICAgTm9ybWFsbHkgZWFjaCB1c2VyIHdpc2hpbmcgdG8gdXNlIFNTSCB3aXRoIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24gcnVucwotICAgICB0aGlzIG9uY2UgdG8gY3JlYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBrZXkgaW4gfi8uc3NoL2lkZW50aXR5LAotICAgICB+Ly5zc2gvaWRfZWNkc2EsIH4vLnNzaC9pZF9kc2Egb3Igfi8uc3NoL2lkX3JzYS4gIEFkZGl0aW9uYWxseSwgdGhlCi0gICAgIHN5c3RlbSBhZG1pbmlzdHJhdG9yIG1heSB1c2UgdGhpcyB0byBnZW5lcmF0ZSBob3N0IGtleXMsIGFzIHNlZW4gaW4KLSAgICAgL2V0Yy9yYy4KLQotICAgICBOb3JtYWxseSB0aGlzIHByb2dyYW0gZ2VuZXJhdGVzIHRoZSBrZXkgYW5kIGFza3MgZm9yIGEgZmlsZSBpbiB3aGljaCB0bwotICAgICBzdG9yZSB0aGUgcHJpdmF0ZSBrZXkuICBUaGUgcHVibGljIGtleSBpcyBzdG9yZWQgaW4gYSBmaWxlIHdpdGggdGhlIHNhbWUKLSAgICAgbmFtZSBidXQgYGAucHViJycgYXBwZW5kZWQuICBUaGUgcHJvZ3JhbSBhbHNvIGFza3MgZm9yIGEgcGFzc3BocmFzZS4gIFRoZQotICAgICBwYXNzcGhyYXNlIG1heSBiZSBlbXB0eSB0byBpbmRpY2F0ZSBubyBwYXNzcGhyYXNlIChob3N0IGtleXMgbXVzdCBoYXZlIGFuCi0gICAgIGVtcHR5IHBhc3NwaHJhc2UpLCBvciBpdCBtYXkgYmUgYSBzdHJpbmcgb2YgYXJiaXRyYXJ5IGxlbmd0aC4gIEEKLSAgICAgcGFzc3BocmFzZSBpcyBzaW1pbGFyIHRvIGEgcGFzc3dvcmQsIGV4Y2VwdCBpdCBjYW4gYmUgYSBwaHJhc2Ugd2l0aCBhCi0gICAgIHNlcmllcyBvZiB3b3JkcywgcHVuY3R1YXRpb24sIG51bWJlcnMsIHdoaXRlc3BhY2UsIG9yIGFueSBzdHJpbmcgb2YKLSAgICAgY2hhcmFjdGVycyB5b3Ugd2FudC4gIEdvb2QgcGFzc3BocmFzZXMgYXJlIDEwLTMwIGNoYXJhY3RlcnMgbG9uZywgYXJlIG5vdAotICAgICBzaW1wbGUgc2VudGVuY2VzIG9yIG90aGVyd2lzZSBlYXNpbHkgZ3Vlc3NhYmxlIChFbmdsaXNoIHByb3NlIGhhcyBvbmx5IDEtCi0gICAgIDIgYml0cyBvZiBlbnRyb3B5IHBlciBjaGFyYWN0ZXIsIGFuZCBwcm92aWRlcyB2ZXJ5IGJhZCBwYXNzcGhyYXNlcyksIGFuZAotICAgICBjb250YWluIGEgbWl4IG9mIHVwcGVyIGFuZCBsb3dlcmNhc2UgbGV0dGVycywgbnVtYmVycywgYW5kIG5vbi0KLSAgICAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuICBUaGUgcGFzc3BocmFzZSBjYW4gYmUgY2hhbmdlZCBsYXRlciBieSB1c2luZwotICAgICB0aGUgLXAgb3B0aW9uLgotCi0gICAgIFRoZXJlIGlzIG5vIHdheSB0byByZWNvdmVyIGEgbG9zdCBwYXNzcGhyYXNlLiAgSWYgdGhlIHBhc3NwaHJhc2UgaXMgbG9zdAotICAgICBvciBmb3Jnb3R0ZW4sIGEgbmV3IGtleSBtdXN0IGJlIGdlbmVyYXRlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcHVibGljCi0gICAgIGtleSBjb3BpZWQgdG8gb3RoZXIgbWFjaGluZXMuCi0KLSAgICAgRm9yIFJTQTEga2V5cywgdGhlcmUgaXMgYWxzbyBhIGNvbW1lbnQgZmllbGQgaW4gdGhlIGtleSBmaWxlIHRoYXQgaXMgb25seQotICAgICBmb3IgY29udmVuaWVuY2UgdG8gdGhlIHVzZXIgdG8gaGVscCBpZGVudGlmeSB0aGUga2V5LiAgVGhlIGNvbW1lbnQgY2FuCi0gICAgIHRlbGwgd2hhdCB0aGUga2V5IGlzIGZvciwgb3Igd2hhdGV2ZXIgaXMgdXNlZnVsLiAgVGhlIGNvbW1lbnQgaXMKLSAgICAgaW5pdGlhbGl6ZWQgdG8gYGB1c2VyQGhvc3QnJyB3aGVuIHRoZSBrZXkgaXMgY3JlYXRlZCwgYnV0IGNhbiBiZSBjaGFuZ2VkCi0gICAgIHVzaW5nIHRoZSAtYyBvcHRpb24uCi0KLSAgICAgQWZ0ZXIgYSBrZXkgaXMgZ2VuZXJhdGVkLCBpbnN0cnVjdGlvbnMgYmVsb3cgZGV0YWlsIHdoZXJlIHRoZSBrZXlzIHNob3VsZAotICAgICBiZSBwbGFjZWQgdG8gYmUgYWN0aXZhdGVkLgotCi0gICAgIFRoZSBvcHRpb25zIGFyZSBhcyBmb2xsb3dzOgotCi0gICAgIC1BICAgICAgRm9yIGVhY2ggb2YgdGhlIGtleSB0eXBlcyAocnNhMSwgcnNhLCBkc2EgYW5kIGVjZHNhKSBmb3Igd2hpY2gKLSAgICAgICAgICAgICBob3N0IGtleXMgZG8gbm90IGV4aXN0LCBnZW5lcmF0ZSB0aGUgaG9zdCBrZXlzIHdpdGggdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICBrZXkgZmlsZSBwYXRoLCBhbiBlbXB0eSBwYXNzcGhyYXNlLCBkZWZhdWx0IGJpdHMgZm9yIHRoZSBrZXkKLSAgICAgICAgICAgICB0eXBlLCBhbmQgZGVmYXVsdCBjb21tZW50LiAgVGhpcyBpcyB1c2VkIGJ5IC9ldGMvcmMgdG8gZ2VuZXJhdGUKLSAgICAgICAgICAgICBuZXcgaG9zdCBrZXlzLgotCi0gICAgIC1hIHRyaWFscwotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHByaW1hbGl0eSB0ZXN0cyB0byBwZXJmb3JtIHdoZW4gc2NyZWVuaW5nCi0gICAgICAgICAgICAgREgtR0VYIGNhbmRpZGF0ZXMgdXNpbmcgdGhlIC1UIGNvbW1hbmQuCi0KLSAgICAgLUIgICAgICBTaG93IHRoZSBidWJibGViYWJibGUgZGlnZXN0IG9mIHNwZWNpZmllZCBwcml2YXRlIG9yIHB1YmxpYyBrZXkKLSAgICAgICAgICAgICBmaWxlLgotCi0gICAgIC1iIGJpdHMKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBrZXkgdG8gY3JlYXRlLiAgRm9yIFJTQSBrZXlzLAotICAgICAgICAgICAgIHRoZSBtaW5pbXVtIHNpemUgaXMgNzY4IGJpdHMgYW5kIHRoZSBkZWZhdWx0IGlzIDIwNDggYml0cy4KLSAgICAgICAgICAgICBHZW5lcmFsbHksIDIwNDggYml0cyBpcyBjb25zaWRlcmVkIHN1ZmZpY2llbnQuICBEU0Ega2V5cyBtdXN0IGJlCi0gICAgICAgICAgICAgZXhhY3RseSAxMDI0IGJpdHMgYXMgc3BlY2lmaWVkIGJ5IEZJUFMgMTg2LTIuICBGb3IgRUNEU0Ega2V5cywKLSAgICAgICAgICAgICB0aGUgLWIgZmxhZyBkZXRlcm1pbmVzIHRoZXkga2V5IGxlbmd0aCBieSBzZWxlY3RpbmcgZnJvbSBvbmUgb2YKLSAgICAgICAgICAgICB0aHJlZSBlbGxpcHRpYyBjdXJ2ZSBzaXplczogMjU2LCAzODQgb3IgNTIxIGJpdHMuICBBdHRlbXB0aW5nIHRvCi0gICAgICAgICAgICAgdXNlIGJpdCBsZW5ndGhzIG90aGVyIHRoYW4gdGhlc2UgdGhyZWUgdmFsdWVzIGZvciBFQ0RTQSBrZXlzIHdpbGwKLSAgICAgICAgICAgICBmYWlsLgotCi0gICAgIC1DIGNvbW1lbnQKLSAgICAgICAgICAgICBQcm92aWRlcyBhIG5ldyBjb21tZW50LgotCi0gICAgIC1jICAgICAgUmVxdWVzdHMgY2hhbmdpbmcgdGhlIGNvbW1lbnQgaW4gdGhlIHByaXZhdGUgYW5kIHB1YmxpYyBrZXkKLSAgICAgICAgICAgICBmaWxlcy4gIFRoaXMgb3BlcmF0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBSU0ExIGtleXMuICBUaGUKLSAgICAgICAgICAgICBwcm9ncmFtIHdpbGwgcHJvbXB0IGZvciB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBwcml2YXRlIGtleXMsIGZvcgotICAgICAgICAgICAgIHRoZSBwYXNzcGhyYXNlIGlmIHRoZSBrZXkgaGFzIG9uZSwgYW5kIGZvciB0aGUgbmV3IGNvbW1lbnQuCi0KLSAgICAgLUQgcGtjczExCi0gICAgICAgICAgICAgRG93bmxvYWQgdGhlIFJTQSBwdWJsaWMga2V5cyBwcm92aWRlZCBieSB0aGUgUEtDUyMxMSBzaGFyZWQKLSAgICAgICAgICAgICBsaWJyYXJ5IHBrY3MxMS4gIFdoZW4gdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIC1zLCB0aGlzIG9wdGlvbgotICAgICAgICAgICAgIGluZGljYXRlcyB0aGF0IGEgQ0Ega2V5IHJlc2lkZXMgaW4gYSBQS0NTIzExIHRva2VuIChzZWUgdGhlCi0gICAgICAgICAgICAgQ0VSVElGSUNBVEVTIHNlY3Rpb24gZm9yIGRldGFpbHMpLgotCi0gICAgIC1lICAgICAgVGhpcyBvcHRpb24gd2lsbCByZWFkIGEgcHJpdmF0ZSBvciBwdWJsaWMgT3BlblNTSCBrZXkgZmlsZSBhbmQKLSAgICAgICAgICAgICBwcmludCB0byBzdGRvdXQgdGhlIGtleSBpbiBvbmUgb2YgdGhlIGZvcm1hdHMgc3BlY2lmaWVkIGJ5IHRoZSAtbQotICAgICAgICAgICAgIG9wdGlvbi4gIFRoZSBkZWZhdWx0IGV4cG9ydCBmb3JtYXQgaXMgYGBSRkM0NzE2JycuICBUaGlzIG9wdGlvbgotICAgICAgICAgICAgIGFsbG93cyBleHBvcnRpbmcgT3BlblNTSCBrZXlzIGZvciB1c2UgYnkgb3RoZXIgcHJvZ3JhbXMsCi0gICAgICAgICAgICAgaW5jbHVkaW5nIHNldmVyYWwgY29tbWVyY2lhbCBTU0ggaW1wbGVtZW50YXRpb25zLgotCi0gICAgIC1GIGhvc3RuYW1lCi0gICAgICAgICAgICAgU2VhcmNoIGZvciB0aGUgc3BlY2lmaWVkIGhvc3RuYW1lIGluIGEga25vd25faG9zdHMgZmlsZSwgbGlzdGluZwotICAgICAgICAgICAgIGFueSBvY2N1cnJlbmNlcyBmb3VuZC4gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB0byBmaW5kIGhhc2hlZCBob3N0Ci0gICAgICAgICAgICAgbmFtZXMgb3IgYWRkcmVzc2VzIGFuZCBtYXkgYWxzbyBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCi0gICAgICAgICAgICAgLUggb3B0aW9uIHRvIHByaW50IGZvdW5kIGtleXMgaW4gYSBoYXNoZWQgZm9ybWF0LgotCi0gICAgIC1mIGZpbGVuYW1lCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBmaWxlbmFtZSBvZiB0aGUga2V5IGZpbGUuCi0KLSAgICAgLUcgb3V0cHV0X2ZpbGUKLSAgICAgICAgICAgICBHZW5lcmF0ZSBjYW5kaWRhdGUgcHJpbWVzIGZvciBESC1HRVguICBUaGVzZSBwcmltZXMgbXVzdCBiZQotICAgICAgICAgICAgIHNjcmVlbmVkIGZvciBzYWZldHkgKHVzaW5nIHRoZSAtVCBvcHRpb24pIGJlZm9yZSB1c2UuCi0KLSAgICAgLWcgICAgICBVc2UgZ2VuZXJpYyBETlMgZm9ybWF0IHdoZW4gcHJpbnRpbmcgZmluZ2VycHJpbnQgcmVzb3VyY2UgcmVjb3JkcwotICAgICAgICAgICAgIHVzaW5nIHRoZSAtciBjb21tYW5kLgotCi0gICAgIC1IICAgICAgSGFzaCBhIGtub3duX2hvc3RzIGZpbGUuICBUaGlzIHJlcGxhY2VzIGFsbCBob3N0bmFtZXMgYW5kCi0gICAgICAgICAgICAgYWRkcmVzc2VzIHdpdGggaGFzaGVkIHJlcHJlc2VudGF0aW9ucyB3aXRoaW4gdGhlIHNwZWNpZmllZCBmaWxlOwotICAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBjb250ZW50IGlzIG1vdmVkIHRvIGEgZmlsZSB3aXRoIGEgLm9sZCBzdWZmaXguCi0gICAgICAgICAgICAgVGhlc2UgaGFzaGVzIG1heSBiZSB1c2VkIG5vcm1hbGx5IGJ5IHNzaCBhbmQgc3NoZCwgYnV0IHRoZXkgZG8KLSAgICAgICAgICAgICBub3QgcmV2ZWFsIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uIHNob3VsZCB0aGUgZmlsZSdzIGNvbnRlbnRzIGJlCi0gICAgICAgICAgICAgZGlzY2xvc2VkLiAgVGhpcyBvcHRpb24gd2lsbCBub3QgbW9kaWZ5IGV4aXN0aW5nIGhhc2hlZCBob3N0bmFtZXMKLSAgICAgICAgICAgICBhbmQgaXMgdGhlcmVmb3JlIHNhZmUgdG8gdXNlIG9uIGZpbGVzIHRoYXQgbWl4IGhhc2hlZCBhbmQgbm9uLQotICAgICAgICAgICAgIGhhc2hlZCBuYW1lcy4KLQotICAgICAtaCAgICAgIFdoZW4gc2lnbmluZyBhIGtleSwgY3JlYXRlIGEgaG9zdCBjZXJ0aWZpY2F0ZSBpbnN0ZWFkIG9mIGEgdXNlcgotICAgICAgICAgICAgIGNlcnRpZmljYXRlLiAgUGxlYXNlIHNlZSB0aGUgQ0VSVElGSUNBVEVTIHNlY3Rpb24gZm9yIGRldGFpbHMuCi0KLSAgICAgLUkgY2VydGlmaWNhdGVfaWRlbnRpdHkKLSAgICAgICAgICAgICBTcGVjaWZ5IHRoZSBrZXkgaWRlbnRpdHkgd2hlbiBzaWduaW5nIGEgcHVibGljIGtleS4gIFBsZWFzZSBzZWUKLSAgICAgICAgICAgICB0aGUgQ0VSVElGSUNBVEVTIHNlY3Rpb24gZm9yIGRldGFpbHMuCi0KLSAgICAgLWkgICAgICBUaGlzIG9wdGlvbiB3aWxsIHJlYWQgYW4gdW5lbmNyeXB0ZWQgcHJpdmF0ZSAob3IgcHVibGljKSBrZXkgZmlsZQotICAgICAgICAgICAgIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHRoZSAtbSBvcHRpb24gYW5kIHByaW50IGFuIE9wZW5TU0gKLSAgICAgICAgICAgICBjb21wYXRpYmxlIHByaXZhdGUgKG9yIHB1YmxpYykga2V5IHRvIHN0ZG91dC4gIFRoaXMgb3B0aW9uIGFsbG93cwotICAgICAgICAgICAgIGltcG9ydGluZyBrZXlzIGZyb20gb3RoZXIgc29mdHdhcmUsIGluY2x1ZGluZyBzZXZlcmFsIGNvbW1lcmNpYWwKLSAgICAgICAgICAgICBTU0ggaW1wbGVtZW50YXRpb25zLiAgVGhlIGRlZmF1bHQgaW1wb3J0IGZvcm1hdCBpcyBgYFJGQzQ3MTYnJy4KLQotICAgICAtTCAgICAgIFByaW50cyB0aGUgY29udGVudHMgb2YgYSBjZXJ0aWZpY2F0ZS4KLQotICAgICAtbCAgICAgIFNob3cgZmluZ2VycHJpbnQgb2Ygc3BlY2lmaWVkIHB1YmxpYyBrZXkgZmlsZS4gIFByaXZhdGUgUlNBMSBrZXlzCi0gICAgICAgICAgICAgYXJlIGFsc28gc3VwcG9ydGVkLiAgRm9yIFJTQSBhbmQgRFNBIGtleXMgc3NoLWtleWdlbiB0cmllcyB0bwotICAgICAgICAgICAgIGZpbmQgdGhlIG1hdGNoaW5nIHB1YmxpYyBrZXkgZmlsZSBhbmQgcHJpbnRzIGl0cyBmaW5nZXJwcmludC4gIElmCi0gICAgICAgICAgICAgY29tYmluZWQgd2l0aCAtdiwgYW4gQVNDSUkgYXJ0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBrZXkgaXMKLSAgICAgICAgICAgICBzdXBwbGllZCB3aXRoIHRoZSBmaW5nZXJwcmludC4KLQotICAgICAtTSBtZW1vcnkKLSAgICAgICAgICAgICBTcGVjaWZ5IHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHVzZSAoaW4gbWVnYWJ5dGVzKSB3aGVuCi0gICAgICAgICAgICAgZ2VuZXJhdGluZyBjYW5kaWRhdGUgbW9kdWxpIGZvciBESC1HRVguCi0KLSAgICAgLW0ga2V5X2Zvcm1hdAotICAgICAgICAgICAgIFNwZWNpZnkgYSBrZXkgZm9ybWF0IGZvciB0aGUgLWkgKGltcG9ydCkgb3IgLWUgKGV4cG9ydCkKLSAgICAgICAgICAgICBjb252ZXJzaW9uIG9wdGlvbnMuICBUaGUgc3VwcG9ydGVkIGtleSBmb3JtYXRzIGFyZTogYGBSRkM0NzE2JycKLSAgICAgICAgICAgICAoUkZDIDQ3MTYvU1NIMiBwdWJsaWMgb3IgcHJpdmF0ZSBrZXkpLCBgYFBLQ1M4JycgKFBFTSBQS0NTOAotICAgICAgICAgICAgIHB1YmxpYyBrZXkpIG9yIGBgUEVNJycgKFBFTSBwdWJsaWMga2V5KS4gIFRoZSBkZWZhdWx0IGNvbnZlcnNpb24KLSAgICAgICAgICAgICBmb3JtYXQgaXMgYGBSRkM0NzE2JycuCi0KLSAgICAgLU4gbmV3X3Bhc3NwaHJhc2UKLSAgICAgICAgICAgICBQcm92aWRlcyB0aGUgbmV3IHBhc3NwaHJhc2UuCi0KLSAgICAgLW4gcHJpbmNpcGFscwotICAgICAgICAgICAgIFNwZWNpZnkgb25lIG9yIG1vcmUgcHJpbmNpcGFscyAodXNlciBvciBob3N0IG5hbWVzKSB0byBiZQotICAgICAgICAgICAgIGluY2x1ZGVkIGluIGEgY2VydGlmaWNhdGUgd2hlbiBzaWduaW5nIGEga2V5LiAgTXVsdGlwbGUKLSAgICAgICAgICAgICBwcmluY2lwYWxzIG1heSBiZSBzcGVjaWZpZWQsIHNlcGFyYXRlZCBieSBjb21tYXMuICBQbGVhc2Ugc2VlIHRoZQotICAgICAgICAgICAgIENFUlRJRklDQVRFUyBzZWN0aW9uIGZvciBkZXRhaWxzLgotCi0gICAgIC1PIG9wdGlvbgotICAgICAgICAgICAgIFNwZWNpZnkgYSBjZXJ0aWZpY2F0ZSBvcHRpb24gd2hlbiBzaWduaW5nIGEga2V5LiAgVGhpcyBvcHRpb24gbWF5Ci0gICAgICAgICAgICAgYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLiAgUGxlYXNlIHNlZSB0aGUgQ0VSVElGSUNBVEVTIHNlY3Rpb24KLSAgICAgICAgICAgICBmb3IgZGV0YWlscy4gIFRoZSBvcHRpb25zIHRoYXQgYXJlIHZhbGlkIGZvciB1c2VyIGNlcnRpZmljYXRlcwotICAgICAgICAgICAgIGFyZToKLQotICAgICAgICAgICAgIGNsZWFyICAgQ2xlYXIgYWxsIGVuYWJsZWQgcGVybWlzc2lvbnMuICBUaGlzIGlzIHVzZWZ1bCBmb3IKLSAgICAgICAgICAgICAgICAgICAgIGNsZWFyaW5nIHRoZSBkZWZhdWx0IHNldCBvZiBwZXJtaXNzaW9ucyBzbyBwZXJtaXNzaW9ucwotICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIGFkZGVkIGluZGl2aWR1YWxseS4KLQotICAgICAgICAgICAgIGZvcmNlLWNvbW1hbmQ9Y29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgRm9yY2VzIHRoZSBleGVjdXRpb24gb2YgY29tbWFuZCBpbnN0ZWFkIG9mIGFueSBzaGVsbCBvcgotICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgd2hlbiB0aGUgY2VydGlmaWNhdGUgaXMKLSAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgotCi0gICAgICAgICAgICAgbm8tYWdlbnQtZm9yd2FyZGluZwotICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBzc2gtYWdlbnQoMSkgZm9yd2FyZGluZyAocGVybWl0dGVkIGJ5IGRlZmF1bHQpLgotCi0gICAgICAgICAgICAgbm8tcG9ydC1mb3J3YXJkaW5nCi0gICAgICAgICAgICAgICAgICAgICBEaXNhYmxlIHBvcnQgZm9yd2FyZGluZyAocGVybWl0dGVkIGJ5IGRlZmF1bHQpLgotCi0gICAgICAgICAgICAgbm8tcHR5ICBEaXNhYmxlIFBUWSBhbGxvY2F0aW9uIChwZXJtaXR0ZWQgYnkgZGVmYXVsdCkuCi0KLSAgICAgICAgICAgICBuby11c2VyLXJjCi0gICAgICAgICAgICAgICAgICAgICBEaXNhYmxlIGV4ZWN1dGlvbiBvZiB+Ly5zc2gvcmMgYnkgc3NoZCg4KSAocGVybWl0dGVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICBkZWZhdWx0KS4KLQotICAgICAgICAgICAgIG5vLXgxMS1mb3J3YXJkaW5nCi0gICAgICAgICAgICAgICAgICAgICBEaXNhYmxlIFgxMSBmb3J3YXJkaW5nIChwZXJtaXR0ZWQgYnkgZGVmYXVsdCkuCi0KLSAgICAgICAgICAgICBwZXJtaXQtYWdlbnQtZm9yd2FyZGluZwotICAgICAgICAgICAgICAgICAgICAgQWxsb3dzIHNzaC1hZ2VudCgxKSBmb3J3YXJkaW5nLgotCi0gICAgICAgICAgICAgcGVybWl0LXBvcnQtZm9yd2FyZGluZwotICAgICAgICAgICAgICAgICAgICAgQWxsb3dzIHBvcnQgZm9yd2FyZGluZy4KLQotICAgICAgICAgICAgIHBlcm1pdC1wdHkKLSAgICAgICAgICAgICAgICAgICAgIEFsbG93cyBQVFkgYWxsb2NhdGlvbi4KLQotICAgICAgICAgICAgIHBlcm1pdC11c2VyLXJjCi0gICAgICAgICAgICAgICAgICAgICBBbGxvd3MgZXhlY3V0aW9uIG9mIH4vLnNzaC9yYyBieSBzc2hkKDgpLgotCi0gICAgICAgICAgICAgcGVybWl0LXgxMS1mb3J3YXJkaW5nCi0gICAgICAgICAgICAgICAgICAgICBBbGxvd3MgWDExIGZvcndhcmRpbmcuCi0KLSAgICAgICAgICAgICBzb3VyY2UtYWRkcmVzcz1hZGRyZXNzX2xpc3QKLSAgICAgICAgICAgICAgICAgICAgIFJlc3RyaWN0IHRoZSBzb3VyY2UgYWRkcmVzc2VzIGZyb20gd2hpY2ggdGhlIGNlcnRpZmljYXRlCi0gICAgICAgICAgICAgICAgICAgICBpcyBjb25zaWRlcmVkIHZhbGlkLiAgVGhlIGFkZHJlc3NfbGlzdCBpcyBhIGNvbW1hLQotICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdGVkIGxpc3Qgb2Ygb25lIG9yIG1vcmUgYWRkcmVzcy9uZXRtYXNrIHBhaXJzIGluCi0gICAgICAgICAgICAgICAgICAgICBDSURSIGZvcm1hdC4KLQotICAgICAgICAgICAgIEF0IHByZXNlbnQsIG5vIG9wdGlvbnMgYXJlIHZhbGlkIGZvciBob3N0IGtleXMuCi0KLSAgICAgLVAgcGFzc3BocmFzZQotICAgICAgICAgICAgIFByb3ZpZGVzIHRoZSAob2xkKSBwYXNzcGhyYXNlLgotCi0gICAgIC1wICAgICAgUmVxdWVzdHMgY2hhbmdpbmcgdGhlIHBhc3NwaHJhc2Ugb2YgYSBwcml2YXRlIGtleSBmaWxlIGluc3RlYWQgb2YKLSAgICAgICAgICAgICBjcmVhdGluZyBhIG5ldyBwcml2YXRlIGtleS4gIFRoZSBwcm9ncmFtIHdpbGwgcHJvbXB0IGZvciB0aGUgZmlsZQotICAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIHByaXZhdGUga2V5LCBmb3IgdGhlIG9sZCBwYXNzcGhyYXNlLCBhbmQgdHdpY2UgZm9yCi0gICAgICAgICAgICAgdGhlIG5ldyBwYXNzcGhyYXNlLgotCi0gICAgIC1xICAgICAgU2lsZW5jZSBzc2gta2V5Z2VuLgotCi0gICAgIC1SIGhvc3RuYW1lCi0gICAgICAgICAgICAgUmVtb3ZlcyBhbGwga2V5cyBiZWxvbmdpbmcgdG8gaG9zdG5hbWUgZnJvbSBhIGtub3duX2hvc3RzIGZpbGUuCi0gICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHRvIGRlbGV0ZSBoYXNoZWQgaG9zdHMgKHNlZSB0aGUgLUggb3B0aW9uCi0gICAgICAgICAgICAgYWJvdmUpLgotCi0gICAgIC1yIGhvc3RuYW1lCi0gICAgICAgICAgICAgUHJpbnQgdGhlIFNTSEZQIGZpbmdlcnByaW50IHJlc291cmNlIHJlY29yZCBuYW1lZCBob3N0bmFtZSBmb3IKLSAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHB1YmxpYyBrZXkgZmlsZS4KLQotICAgICAtUyBzdGFydAotICAgICAgICAgICAgIFNwZWNpZnkgc3RhcnQgcG9pbnQgKGluIGhleCkgd2hlbiBnZW5lcmF0aW5nIGNhbmRpZGF0ZSBtb2R1bGkgZm9yCi0gICAgICAgICAgICAgREgtR0VYLgotCi0gICAgIC1zIGNhX2tleQotICAgICAgICAgICAgIENlcnRpZnkgKHNpZ24pIGEgcHVibGljIGtleSB1c2luZyB0aGUgc3BlY2lmaWVkIENBIGtleS4gIFBsZWFzZQotICAgICAgICAgICAgIHNlZSB0aGUgQ0VSVElGSUNBVEVTIHNlY3Rpb24gZm9yIGRldGFpbHMuCi0KLSAgICAgLVQgb3V0cHV0X2ZpbGUKLSAgICAgICAgICAgICBUZXN0IERIIGdyb3VwIGV4Y2hhbmdlIGNhbmRpZGF0ZSBwcmltZXMgKGdlbmVyYXRlZCB1c2luZyB0aGUgLUcKLSAgICAgICAgICAgICBvcHRpb24pIGZvciBzYWZldHkuCi0KLSAgICAgLXQgdHlwZQotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBrZXkgdG8gY3JlYXRlLiAgVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmUKLSAgICAgICAgICAgICBgYHJzYTEnJyBmb3IgcHJvdG9jb2wgdmVyc2lvbiAxIGFuZCBgYGRzYScnLCBgYGVjZHNhJycgb3IgYGByc2EnJwotICAgICAgICAgICAgIGZvciBwcm90b2NvbCB2ZXJzaW9uIDIuCi0KLSAgICAgLVYgdmFsaWRpdHlfaW50ZXJ2YWwKLSAgICAgICAgICAgICBTcGVjaWZ5IGEgdmFsaWRpdHkgaW50ZXJ2YWwgd2hlbiBzaWduaW5nIGEgY2VydGlmaWNhdGUuICBBCi0gICAgICAgICAgICAgdmFsaWRpdHkgaW50ZXJ2YWwgbWF5IGNvbnNpc3Qgb2YgYSBzaW5nbGUgdGltZSwgaW5kaWNhdGluZyB0aGF0Ci0gICAgICAgICAgICAgdGhlIGNlcnRpZmljYXRlIGlzIHZhbGlkIGJlZ2lubmluZyBub3cgYW5kIGV4cGlyaW5nIGF0IHRoYXQgdGltZSwKLSAgICAgICAgICAgICBvciBtYXkgY29uc2lzdCBvZiB0d28gdGltZXMgc2VwYXJhdGVkIGJ5IGEgY29sb24gdG8gaW5kaWNhdGUgYW4KLSAgICAgICAgICAgICBleHBsaWNpdCB0aW1lIGludGVydmFsLiAgVGhlIHN0YXJ0IHRpbWUgbWF5IGJlIHNwZWNpZmllZCBhcyBhCi0gICAgICAgICAgICAgZGF0ZSBpbiBZWVlZTU1ERCBmb3JtYXQsIGEgdGltZSBpbiBZWVlZTU1EREhITU1TUyBmb3JtYXQgb3IgYQotICAgICAgICAgICAgIHJlbGF0aXZlIHRpbWUgKHRvIHRoZSBjdXJyZW50IHRpbWUpIGNvbnNpc3Rpbmcgb2YgYSBtaW51cyBzaWduCi0gICAgICAgICAgICAgZm9sbG93ZWQgYnkgYSByZWxhdGl2ZSB0aW1lIGluIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGluIHRoZSBUSU1FCi0gICAgICAgICAgICAgRk9STUFUUyBzZWN0aW9uIG9mIHNzaGRfY29uZmlnKDUpLiAgVGhlIGVuZCB0aW1lIG1heSBiZSBzcGVjaWZpZWQKLSAgICAgICAgICAgICBhcyBhIFlZWVlNTUREIGRhdGUsIGEgWVlZWU1NRERISE1NU1MgdGltZSBvciBhIHJlbGF0aXZlIHRpbWUKLSAgICAgICAgICAgICBzdGFydGluZyB3aXRoIGEgcGx1cyBjaGFyYWN0ZXIuCi0KLSAgICAgICAgICAgICBGb3IgZXhhbXBsZTogYGArNTJ3MWQnJyAodmFsaWQgZnJvbSBub3cgdG8gNTIgd2Vla3MgYW5kIG9uZSBkYXkKLSAgICAgICAgICAgICBmcm9tIG5vdyksIGBgLTR3Ois0dycnICh2YWxpZCBmcm9tIGZvdXIgd2Vla3MgYWdvIHRvIGZvdXIgd2Vla3MKLSAgICAgICAgICAgICBmcm9tIG5vdyksIGBgMjAxMDAxMDExMjMwMDA6MjAxMTAxMDExMjMwMDAnJyAodmFsaWQgZnJvbSAxMjozMAotICAgICAgICAgICAgIFBNLCBKYW51YXJ5IDFzdCwgMjAxMCB0byAxMjozMCBQTSwgSmFudWFyeSAxc3QsIDIwMTEpLAotICAgICAgICAgICAgIGBgLTFkOjIwMTEwMTAxJycgKHZhbGlkIGZyb20geWVzdGVyZGF5IHRvIG1pZG5pZ2h0LCBKYW51YXJ5IDFzdCwKLSAgICAgICAgICAgICAyMDExKS4KLQotICAgICAtdiAgICAgIFZlcmJvc2UgbW9kZS4gIENhdXNlcyBzc2gta2V5Z2VuIHRvIHByaW50IGRlYnVnZ2luZyBtZXNzYWdlcwotICAgICAgICAgICAgIGFib3V0IGl0cyBwcm9ncmVzcy4gIFRoaXMgaXMgaGVscGZ1bCBmb3IgZGVidWdnaW5nIG1vZHVsaQotICAgICAgICAgICAgIGdlbmVyYXRpb24uICBNdWx0aXBsZSAtdiBvcHRpb25zIGluY3JlYXNlIHRoZSB2ZXJib3NpdHkuICBUaGUKLSAgICAgICAgICAgICBtYXhpbXVtIGlzIDMuCi0KLSAgICAgLVcgZ2VuZXJhdG9yCi0gICAgICAgICAgICAgU3BlY2lmeSBkZXNpcmVkIGdlbmVyYXRvciB3aGVuIHRlc3RpbmcgY2FuZGlkYXRlIG1vZHVsaSBmb3IgREgtCi0gICAgICAgICAgICAgR0VYLgotCi0gICAgIC15ICAgICAgVGhpcyBvcHRpb24gd2lsbCByZWFkIGEgcHJpdmF0ZSBPcGVuU1NIIGZvcm1hdCBmaWxlIGFuZCBwcmludCBhbgotICAgICAgICAgICAgIE9wZW5TU0ggcHVibGljIGtleSB0byBzdGRvdXQuCi0KLSAgICAgLXogc2VyaWFsX251bWJlcgotICAgICAgICAgICAgIFNwZWNpZmllcyBhIHNlcmlhbCBudW1iZXIgdG8gYmUgZW1iZWRkZWQgaW4gdGhlIGNlcnRpZmljYXRlIHRvCi0gICAgICAgICAgICAgZGlzdGluZ3Vpc2ggdGhpcyBjZXJ0aWZpY2F0ZSBmcm9tIG90aGVycyBmcm9tIHRoZSBzYW1lIENBLiAgVGhlCi0gICAgICAgICAgICAgZGVmYXVsdCBzZXJpYWwgbnVtYmVyIGlzIHplcm8uCi0KLU1PRFVMSSBHRU5FUkFUSU9OCi0gICAgIHNzaC1rZXlnZW4gbWF5IGJlIHVzZWQgdG8gZ2VuZXJhdGUgZ3JvdXBzIGZvciB0aGUgRGlmZmllLUhlbGxtYW4gR3JvdXAKLSAgICAgRXhjaGFuZ2UgKERILUdFWCkgcHJvdG9jb2wuICBHZW5lcmF0aW5nIHRoZXNlIGdyb3VwcyBpcyBhIHR3by1zdGVwCi0gICAgIHByb2Nlc3M6IGZpcnN0LCBjYW5kaWRhdGUgcHJpbWVzIGFyZSBnZW5lcmF0ZWQgdXNpbmcgYSBmYXN0LCBidXQgbWVtb3J5Ci0gICAgIGludGVuc2l2ZSBwcm9jZXNzLiAgVGhlc2UgY2FuZGlkYXRlIHByaW1lcyBhcmUgdGhlbiB0ZXN0ZWQgZm9yCi0gICAgIHN1aXRhYmlsaXR5IChhIENQVS1pbnRlbnNpdmUgcHJvY2VzcykuCi0KLSAgICAgR2VuZXJhdGlvbiBvZiBwcmltZXMgaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSAtRyBvcHRpb24uICBUaGUgZGVzaXJlZAotICAgICBsZW5ndGggb2YgdGhlIHByaW1lcyBtYXkgYmUgc3BlY2lmaWVkIGJ5IHRoZSAtYiBvcHRpb24uICBGb3IgZXhhbXBsZToKLQotICAgICAgICAgICAjIHNzaC1rZXlnZW4gLUcgbW9kdWxpLTIwNDguY2FuZGlkYXRlcyAtYiAyMDQ4Ci0KLSAgICAgQnkgZGVmYXVsdCwgdGhlIHNlYXJjaCBmb3IgcHJpbWVzIGJlZ2lucyBhdCBhIHJhbmRvbSBwb2ludCBpbiB0aGUgZGVzaXJlZAotICAgICBsZW5ndGggcmFuZ2UuICBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZSAtUyBvcHRpb24sIHdoaWNoCi0gICAgIHNwZWNpZmllcyBhIGRpZmZlcmVudCBzdGFydCBwb2ludCAoaW4gaGV4KS4KLQotICAgICBPbmNlIGEgc2V0IG9mIGNhbmRpZGF0ZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZCwgdGhleSBtdXN0IGJlIHRlc3RlZCBmb3IKLSAgICAgc3VpdGFiaWxpdHkuICBUaGlzIG1heSBiZSBwZXJmb3JtZWQgdXNpbmcgdGhlIC1UIG9wdGlvbi4gIEluIHRoaXMgbW9kZQotICAgICBzc2gta2V5Z2VuIHdpbGwgcmVhZCBjYW5kaWRhdGVzIGZyb20gc3RhbmRhcmQgaW5wdXQgKG9yIGEgZmlsZSBzcGVjaWZpZWQKLSAgICAgdXNpbmcgdGhlIC1mIG9wdGlvbikuICBGb3IgZXhhbXBsZToKLQotICAgICAgICAgICAjIHNzaC1rZXlnZW4gLVQgbW9kdWxpLTIwNDggLWYgbW9kdWxpLTIwNDguY2FuZGlkYXRlcwotCi0gICAgIEJ5IGRlZmF1bHQsIGVhY2ggY2FuZGlkYXRlIHdpbGwgYmUgc3ViamVjdGVkIHRvIDEwMCBwcmltYWxpdHkgdGVzdHMuCi0gICAgIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdXNpbmcgdGhlIC1hIG9wdGlvbi4gIFRoZSBESCBnZW5lcmF0b3IgdmFsdWUgd2lsbAotICAgICBiZSBjaG9zZW4gYXV0b21hdGljYWxseSBmb3IgdGhlIHByaW1lIHVuZGVyIGNvbnNpZGVyYXRpb24uICBJZiBhIHNwZWNpZmljCi0gICAgIGdlbmVyYXRvciBpcyBkZXNpcmVkLCBpdCBtYXkgYmUgcmVxdWVzdGVkIHVzaW5nIHRoZSAtVyBvcHRpb24uICBWYWxpZAotICAgICBnZW5lcmF0b3IgdmFsdWVzIGFyZSAyLCAzLCBhbmQgNS4KLQotICAgICBTY3JlZW5lZCBESCBncm91cHMgbWF5IGJlIGluc3RhbGxlZCBpbiAvZXRjL21vZHVsaS4gIEl0IGlzIGltcG9ydGFudCB0aGF0Ci0gICAgIHRoaXMgZmlsZSBjb250YWlucyBtb2R1bGkgb2YgYSByYW5nZSBvZiBiaXQgbGVuZ3RocyBhbmQgdGhhdCBib3RoIGVuZHMgb2YKLSAgICAgYSBjb25uZWN0aW9uIHNoYXJlIGNvbW1vbiBtb2R1bGkuCi0KLUNFUlRJRklDQVRFUwotICAgICBzc2gta2V5Z2VuIHN1cHBvcnRzIHNpZ25pbmcgb2Yga2V5cyB0byBwcm9kdWNlIGNlcnRpZmljYXRlcyB0aGF0IG1heSBiZQotICAgICB1c2VkIGZvciB1c2VyIG9yIGhvc3QgYXV0aGVudGljYXRpb24uICBDZXJ0aWZpY2F0ZXMgY29uc2lzdCBvZiBhIHB1YmxpYwotICAgICBrZXksIHNvbWUgaWRlbnRpdHkgaW5mb3JtYXRpb24sIHplcm8gb3IgbW9yZSBwcmluY2lwYWwgKHVzZXIgb3IgaG9zdCkKLSAgICAgbmFtZXMgYW5kIGEgc2V0IG9mIG9wdGlvbnMgdGhhdCBhcmUgc2lnbmVkIGJ5IGEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKLSAgICAgKENBKSBrZXkuICBDbGllbnRzIG9yIHNlcnZlcnMgbWF5IHRoZW4gdHJ1c3Qgb25seSB0aGUgQ0Ega2V5IGFuZCB2ZXJpZnkKLSAgICAgaXRzIHNpZ25hdHVyZSBvbiBhIGNlcnRpZmljYXRlIHJhdGhlciB0aGFuIHRydXN0aW5nIG1hbnkgdXNlci9ob3N0IGtleXMuCi0gICAgIE5vdGUgdGhhdCBPcGVuU1NIIGNlcnRpZmljYXRlcyBhcmUgYSBkaWZmZXJlbnQsIGFuZCBtdWNoIHNpbXBsZXIsIGZvcm1hdAotICAgICB0byB0aGUgWC41MDkgY2VydGlmaWNhdGVzIHVzZWQgaW4gc3NsKDgpLgotCi0gICAgIHNzaC1rZXlnZW4gc3VwcG9ydHMgdHdvIHR5cGVzIG9mIGNlcnRpZmljYXRlczogdXNlciBhbmQgaG9zdC4gIFVzZXIKLSAgICAgY2VydGlmaWNhdGVzIGF1dGhlbnRpY2F0ZSB1c2VycyB0byBzZXJ2ZXJzLCB3aGVyZWFzIGhvc3QgY2VydGlmaWNhdGVzCi0gICAgIGF1dGhlbnRpY2F0ZSBzZXJ2ZXIgaG9zdHMgdG8gdXNlcnMuICBUbyBnZW5lcmF0ZSBhIHVzZXIgY2VydGlmaWNhdGU6Ci0KLSAgICAgICAgICAgJCBzc2gta2V5Z2VuIC1zIC9wYXRoL3RvL2NhX2tleSAtSSBrZXlfaWQgL3BhdGgvdG8vdXNlcl9rZXkucHViCi0KLSAgICAgVGhlIHJlc3VsdGFudCBjZXJ0aWZpY2F0ZSB3aWxsIGJlIHBsYWNlZCBpbiAvcGF0aC90by91c2VyX2tleS1jZXJ0LnB1Yi4KLSAgICAgQSBob3N0IGNlcnRpZmljYXRlIHJlcXVpcmVzIHRoZSAtaCBvcHRpb246Ci0KLSAgICAgICAgICAgJCBzc2gta2V5Z2VuIC1zIC9wYXRoL3RvL2NhX2tleSAtSSBrZXlfaWQgLWggL3BhdGgvdG8vaG9zdF9rZXkucHViCi0KLSAgICAgVGhlIGhvc3QgY2VydGlmaWNhdGUgd2lsbCBiZSBvdXRwdXQgdG8gL3BhdGgvdG8vaG9zdF9rZXktY2VydC5wdWIuCi0KLSAgICAgSXQgaXMgcG9zc2libGUgdG8gc2lnbiB1c2luZyBhIENBIGtleSBzdG9yZWQgaW4gYSBQS0NTIzExIHRva2VuIGJ5Ci0gICAgIHByb3ZpZGluZyB0aGUgdG9rZW4gbGlicmFyeSB1c2luZyAtRCBhbmQgaWRlbnRpZnlpbmcgdGhlIENBIGtleSBieQotICAgICBwcm92aWRpbmcgaXRzIHB1YmxpYyBoYWxmIGFzIGFuIGFyZ3VtZW50IHRvIC1zOgotCi0gICAgICAgICAgICQgc3NoLWtleWdlbiAtcyBjYV9rZXkucHViIC1EIGxpYnBrY3MxMS5zbyAtSSBrZXlfaWQgaG9zdF9rZXkucHViCi0KLSAgICAgSW4gYWxsIGNhc2VzLCBrZXlfaWQgaXMgYSAia2V5IGlkZW50aWZpZXIiIHRoYXQgaXMgbG9nZ2VkIGJ5IHRoZSBzZXJ2ZXIKLSAgICAgd2hlbiB0aGUgY2VydGlmaWNhdGUgaXMgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uCi0KLSAgICAgQ2VydGlmaWNhdGVzIG1heSBiZSBsaW1pdGVkIHRvIGJlIHZhbGlkIGZvciBhIHNldCBvZiBwcmluY2lwYWwKLSAgICAgKHVzZXIvaG9zdCkgbmFtZXMuICBCeSBkZWZhdWx0LCBnZW5lcmF0ZWQgY2VydGlmaWNhdGVzIGFyZSB2YWxpZCBmb3IgYWxsCi0gICAgIHVzZXJzIG9yIGhvc3RzLiAgVG8gZ2VuZXJhdGUgYSBjZXJ0aWZpY2F0ZSBmb3IgYSBzcGVjaWZpZWQgc2V0IG9mCi0gICAgIHByaW5jaXBhbHM6Ci0KLSAgICAgICAgICAgJCBzc2gta2V5Z2VuIC1zIGNhX2tleSAtSSBrZXlfaWQgLW4gdXNlcjEsdXNlcjIgdXNlcl9rZXkucHViCi0gICAgICAgICAgICQgc3NoLWtleWdlbiAtcyBjYV9rZXkgLUkga2V5X2lkIC1oIC1uIGhvc3QuZG9tYWluIHVzZXJfa2V5LnB1YgotCi0gICAgIEFkZGl0aW9uYWwgbGltaXRhdGlvbnMgb24gdGhlIHZhbGlkaXR5IGFuZCB1c2Ugb2YgdXNlciBjZXJ0aWZpY2F0ZXMgbWF5Ci0gICAgIGJlIHNwZWNpZmllZCB0aHJvdWdoIGNlcnRpZmljYXRlIG9wdGlvbnMuICBBIGNlcnRpZmljYXRlIG9wdGlvbiBtYXkKLSAgICAgZGlzYWJsZSBmZWF0dXJlcyBvZiB0aGUgU1NIIHNlc3Npb24sIG1heSBiZSB2YWxpZCBvbmx5IHdoZW4gcHJlc2VudGVkCi0gICAgIGZyb20gcGFydGljdWxhciBzb3VyY2UgYWRkcmVzc2VzIG9yIG1heSBmb3JjZSB0aGUgdXNlIG9mIGEgc3BlY2lmaWMKLSAgICAgY29tbWFuZC4gIEZvciBhIGxpc3Qgb2YgdmFsaWQgY2VydGlmaWNhdGUgb3B0aW9ucywgc2VlIHRoZSBkb2N1bWVudGF0aW9uCi0gICAgIGZvciB0aGUgLU8gb3B0aW9uIGFib3ZlLgotCi0gICAgIEZpbmFsbHksIGNlcnRpZmljYXRlcyBtYXkgYmUgZGVmaW5lZCB3aXRoIGEgdmFsaWRpdHkgbGlmZXRpbWUuICBUaGUgLVYKLSAgICAgb3B0aW9uIGFsbG93cyBzcGVjaWZpY2F0aW9uIG9mIGNlcnRpZmljYXRlIHN0YXJ0IGFuZCBlbmQgdGltZXMuICBBCi0gICAgIGNlcnRpZmljYXRlIHRoYXQgaXMgcHJlc2VudGVkIGF0IGEgdGltZSBvdXRzaWRlIHRoaXMgcmFuZ2Ugd2lsbCBub3QgYmUKLSAgICAgY29uc2lkZXJlZCB2YWxpZC4gIEJ5IGRlZmF1bHQsIGNlcnRpZmljYXRlcyBoYXZlIGEgbWF4aW11bSB2YWxpZGl0eQotICAgICBpbnRlcnZhbC4KLQotICAgICBGb3IgY2VydGlmaWNhdGVzIHRvIGJlIHVzZWQgZm9yIHVzZXIgb3IgaG9zdCBhdXRoZW50aWNhdGlvbiwgdGhlIENBCi0gICAgIHB1YmxpYyBrZXkgbXVzdCBiZSB0cnVzdGVkIGJ5IHNzaGQoOCkgb3Igc3NoKDEpLiAgUGxlYXNlIHJlZmVyIHRvIHRob3NlCi0gICAgIG1hbnVhbCBwYWdlcyBmb3IgZGV0YWlscy4KLQotRklMRVMKLSAgICAgfi8uc3NoL2lkZW50aXR5Ci0gICAgICAgICAgICAgQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMSBSU0EgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgb2YKLSAgICAgICAgICAgICB0aGUgdXNlci4gIFRoaXMgZmlsZSBzaG91bGQgbm90IGJlIHJlYWRhYmxlIGJ5IGFueW9uZSBidXQgdGhlCi0gICAgICAgICAgICAgdXNlci4gIEl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBwYXNzcGhyYXNlIHdoZW4gZ2VuZXJhdGluZyB0aGUKLSAgICAgICAgICAgICBrZXk7IHRoYXQgcGFzc3BocmFzZSB3aWxsIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUgcHJpdmF0ZSBwYXJ0IG9mCi0gICAgICAgICAgICAgdGhpcyBmaWxlIHVzaW5nIDNERVMuICBUaGlzIGZpbGUgaXMgbm90IGF1dG9tYXRpY2FsbHkgYWNjZXNzZWQgYnkKLSAgICAgICAgICAgICBzc2gta2V5Z2VuIGJ1dCBpdCBpcyBvZmZlcmVkIGFzIHRoZSBkZWZhdWx0IGZpbGUgZm9yIHRoZSBwcml2YXRlCi0gICAgICAgICAgICAga2V5LiAgc3NoKDEpIHdpbGwgcmVhZCB0aGlzIGZpbGUgd2hlbiBhIGxvZ2luIGF0dGVtcHQgaXMgbWFkZS4KLQotICAgICB+Ly5zc2gvaWRlbnRpdHkucHViCi0gICAgICAgICAgICAgQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMSBSU0EgcHVibGljIGtleSBmb3IKLSAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi4gIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgc2hvdWxkIGJlIGFkZGVkIHRvCi0gICAgICAgICAgICAgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cyBvbiBhbGwgbWFjaGluZXMgd2hlcmUgdGhlIHVzZXIgd2lzaGVzIHRvCi0gICAgICAgICAgICAgbG9nIGluIHVzaW5nIFJTQSBhdXRoZW50aWNhdGlvbi4gIFRoZXJlIGlzIG5vIG5lZWQgdG8ga2VlcCB0aGUKLSAgICAgICAgICAgICBjb250ZW50cyBvZiB0aGlzIGZpbGUgc2VjcmV0LgotCi0gICAgIH4vLnNzaC9pZF9kc2EKLSAgICAgfi8uc3NoL2lkX2VjZHNhCi0gICAgIH4vLnNzaC9pZF9yc2EKLSAgICAgICAgICAgICBDb250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAyIERTQSwgRUNEU0Egb3IgUlNBIGF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgaWRlbnRpdHkgb2YgdGhlIHVzZXIuICBUaGlzIGZpbGUgc2hvdWxkIG5vdCBiZSByZWFkYWJsZSBieSBhbnlvbmUKLSAgICAgICAgICAgICBidXQgdGhlIHVzZXIuICBJdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgcGFzc3BocmFzZSB3aGVuCi0gICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUga2V5OyB0aGF0IHBhc3NwaHJhc2Ugd2lsbCBiZSB1c2VkIHRvIGVuY3J5cHQgdGhlCi0gICAgICAgICAgICAgcHJpdmF0ZSBwYXJ0IG9mIHRoaXMgZmlsZSB1c2luZyAxMjgtYml0IEFFUy4gIFRoaXMgZmlsZSBpcyBub3QKLSAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFjY2Vzc2VkIGJ5IHNzaC1rZXlnZW4gYnV0IGl0IGlzIG9mZmVyZWQgYXMgdGhlCi0gICAgICAgICAgICAgZGVmYXVsdCBmaWxlIGZvciB0aGUgcHJpdmF0ZSBrZXkuICBzc2goMSkgd2lsbCByZWFkIHRoaXMgZmlsZQotICAgICAgICAgICAgIHdoZW4gYSBsb2dpbiBhdHRlbXB0IGlzIG1hZGUuCi0KLSAgICAgfi8uc3NoL2lkX2RzYS5wdWIKLSAgICAgfi8uc3NoL2lkX2VjZHNhLnB1YgotICAgICB+Ly5zc2gvaWRfcnNhLnB1YgotICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDIgRFNBLCBFQ0RTQSBvciBSU0EgcHVibGljIGtleSBmb3IKLSAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi4gIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgc2hvdWxkIGJlIGFkZGVkIHRvCi0gICAgICAgICAgICAgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cyBvbiBhbGwgbWFjaGluZXMgd2hlcmUgdGhlIHVzZXIgd2lzaGVzIHRvCi0gICAgICAgICAgICAgbG9nIGluIHVzaW5nIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24uICBUaGVyZSBpcyBubyBuZWVkIHRvIGtlZXAKLSAgICAgICAgICAgICB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIHNlY3JldC4KLQotICAgICAvZXRjL21vZHVsaQotICAgICAgICAgICAgIENvbnRhaW5zIERpZmZpZS1IZWxsbWFuIGdyb3VwcyB1c2VkIGZvciBESC1HRVguICBUaGUgZmlsZSBmb3JtYXQKLSAgICAgICAgICAgICBpcyBkZXNjcmliZWQgaW4gbW9kdWxpKDUpLgotCi1TRUUgQUxTTwotICAgICBzc2goMSksIHNzaC1hZGQoMSksIHNzaC1hZ2VudCgxKSwgbW9kdWxpKDUpLCBzc2hkKDgpCi0KLSAgICAgVGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBQdWJsaWMgS2V5IEZpbGUgRm9ybWF0LCBSRkMgNDcxNiwgMjAwNi4KLQotQVVUSE9SUwotICAgICBPcGVuU1NIIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgYW5kIGZyZWUgc3NoIDEuMi4xMiByZWxlYXNlIGJ5Ci0gICAgIFRhdHUgWWxvbmVuLiAgQWFyb24gQ2FtcGJlbGwsIEJvYiBCZWNrLCBNYXJrdXMgRnJpZWRsLCBOaWVscyBQcm92b3MsIFRoZW8KLSAgICAgZGUgUmFhZHQgYW5kIER1ZyBTb25nIHJlbW92ZWQgbWFueSBidWdzLCByZS1hZGRlZCBuZXdlciBmZWF0dXJlcyBhbmQKLSAgICAgY3JlYXRlZCBPcGVuU1NILiAgTWFya3VzIEZyaWVkbCBjb250cmlidXRlZCB0aGUgc3VwcG9ydCBmb3IgU1NIIHByb3RvY29sCi0gICAgIHZlcnNpb25zIDEuNSBhbmQgMi4wLgotCi1PcGVuQlNEIDUuMCAgICAgICAgICAgICAgICAgICAgIEFwcmlsIDEzLCAyMDExICAgICAgICAgICAgICAgICAgICAgT3BlbkJTRCA1LjAKZGlmZiAtLWdpdCBhL3NzaC1rZXlnZW4uMSBiL3NzaC1rZXlnZW4uMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlMzc5Mi4uMDAwMDAwMAotLS0gYS9zc2gta2V5Z2VuLjEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODggKzAsMCBAQAotLlwiCSRPcGVuQlNEOiBzc2gta2V5Z2VuLjEsdiAxLjEwNiAyMDExLzA0LzEzIDA0OjA5OjM3IGRqbSBFeHAgJAotLlwiCi0uXCIgQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotLlwiICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0uXCIKLS5cIiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0uXCIgY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLS5cIiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0uXCIgaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotLlwiIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLS5cIgotLlwiCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk5IEFhcm9uIENhbXBiZWxsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlbyBkZSBSYWFkdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLS5cIiBhcmUgbWV0OgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotLlwiIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLS5cIiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotLlwiIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLS5cIiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLS5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0uXCIgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0uXCIgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLlwiIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotLlwiIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIKLS5EZCAkTWRvY2RhdGU6IEFwcmlsIDEzIDIwMTEgJAotLkR0IFNTSC1LRVlHRU4gMQotLk9zCi0uU2ggTkFNRQotLk5tIHNzaC1rZXlnZW4KLS5OZCBhdXRoZW50aWNhdGlvbiBrZXkgZ2VuZXJhdGlvbiwgbWFuYWdlbWVudCBhbmQgY29udmVyc2lvbgotLlNoIFNZTk9QU0lTCi0uQmsgLXdvcmRzCi0uTm0gc3NoLWtleWdlbgotLk9wIEZsIHEKLS5PcCBGbCBiIEFyIGJpdHMKLS5GbCB0IEFyIHR5cGUKLS5PcCBGbCBOIEFyIG5ld19wYXNzcGhyYXNlCi0uT3AgRmwgQyBBciBjb21tZW50Ci0uT3AgRmwgZiBBciBvdXRwdXRfa2V5ZmlsZQotLk5tIHNzaC1rZXlnZW4KLS5GbCBwCi0uT3AgRmwgUCBBciBvbGRfcGFzc3BocmFzZQotLk9wIEZsIE4gQXIgbmV3X3Bhc3NwaHJhc2UKLS5PcCBGbCBmIEFyIGtleWZpbGUKLS5ObSBzc2gta2V5Z2VuCi0uRmwgaQotLk9wIEZsIG0gQXIga2V5X2Zvcm1hdAotLk9wIEZsIGYgQXIgaW5wdXRfa2V5ZmlsZQotLk5tIHNzaC1rZXlnZW4KLS5GbCBlCi0uT3AgRmwgbSBBciBrZXlfZm9ybWF0Ci0uT3AgRmwgZiBBciBpbnB1dF9rZXlmaWxlCi0uTm0gc3NoLWtleWdlbgotLkZsIHkKLS5PcCBGbCBmIEFyIGlucHV0X2tleWZpbGUKLS5ObSBzc2gta2V5Z2VuCi0uRmwgYwotLk9wIEZsIFAgQXIgcGFzc3BocmFzZQotLk9wIEZsIEMgQXIgY29tbWVudAotLk9wIEZsIGYgQXIga2V5ZmlsZQotLk5tIHNzaC1rZXlnZW4KLS5GbCBsCi0uT3AgRmwgZiBBciBpbnB1dF9rZXlmaWxlCi0uTm0gc3NoLWtleWdlbgotLkZsIEIKLS5PcCBGbCBmIEFyIGlucHV0X2tleWZpbGUKLS5ObSBzc2gta2V5Z2VuCi0uRmwgRCBBciBwa2NzMTEKLS5ObSBzc2gta2V5Z2VuCi0uRmwgRiBBciBob3N0bmFtZQotLk9wIEZsIGYgQXIga25vd25faG9zdHNfZmlsZQotLk9wIEZsIGwKLS5ObSBzc2gta2V5Z2VuCi0uRmwgSAotLk9wIEZsIGYgQXIga25vd25faG9zdHNfZmlsZQotLk5tIHNzaC1rZXlnZW4KLS5GbCBSIEFyIGhvc3RuYW1lCi0uT3AgRmwgZiBBciBrbm93bl9ob3N0c19maWxlCi0uTm0gc3NoLWtleWdlbgotLkZsIHIgQXIgaG9zdG5hbWUKLS5PcCBGbCBmIEFyIGlucHV0X2tleWZpbGUKLS5PcCBGbCBnCi0uTm0gc3NoLWtleWdlbgotLkZsIEcgQXIgb3V0cHV0X2ZpbGUKLS5PcCBGbCB2Ci0uT3AgRmwgYiBBciBiaXRzCi0uT3AgRmwgTSBBciBtZW1vcnkKLS5PcCBGbCBTIEFyIHN0YXJ0X3BvaW50Ci0uTm0gc3NoLWtleWdlbgotLkZsIFQgQXIgb3V0cHV0X2ZpbGUKLS5GbCBmIEFyIGlucHV0X2ZpbGUKLS5PcCBGbCB2Ci0uT3AgRmwgYSBBciBudW1fdHJpYWxzCi0uT3AgRmwgVyBBciBnZW5lcmF0b3IKLS5ObSBzc2gta2V5Z2VuCi0uRmwgcyBBciBjYV9rZXkKLS5GbCBJIEFyIGNlcnRpZmljYXRlX2lkZW50aXR5Ci0uT3AgRmwgaAotLk9wIEZsIG4gQXIgcHJpbmNpcGFscwotLk9wIEZsIE8gQXIgb3B0aW9uCi0uT3AgRmwgViBBciB2YWxpZGl0eV9pbnRlcnZhbAotLk9wIEZsIHogQXIgc2VyaWFsX251bWJlcgotLkFyCi0uTm0gc3NoLWtleWdlbgotLkZsIEwKLS5PcCBGbCBmIEFyIGlucHV0X2tleWZpbGUKLS5ObSBzc2gta2V5Z2VuCi0uRmwgQQotLkVrCi0uU2ggREVTQ1JJUFRJT04KLS5ObQotZ2VuZXJhdGVzLCBtYW5hZ2VzIGFuZCBjb252ZXJ0cyBhdXRoZW50aWNhdGlvbiBrZXlzIGZvcgotLlhyIHNzaCAxIC4KLS5ObQotY2FuIGNyZWF0ZSBSU0Ega2V5cyBmb3IgdXNlIGJ5IFNTSCBwcm90b2NvbCB2ZXJzaW9uIDEgYW5kIERTQSwgRUNEU0Egb3IgUlNBCi1rZXlzIGZvciB1c2UgYnkgU1NIIHByb3RvY29sIHZlcnNpb24gMi4KLVRoZSB0eXBlIG9mIGtleSB0byBiZSBnZW5lcmF0ZWQgaXMgc3BlY2lmaWVkIHdpdGggdGhlCi0uRmwgdAotb3B0aW9uLgotSWYgaW52b2tlZCB3aXRob3V0IGFueSBhcmd1bWVudHMsCi0uTm0KLXdpbGwgZ2VuZXJhdGUgYW4gUlNBIGtleSBmb3IgdXNlIGluIFNTSCBwcm90b2NvbCAyIGNvbm5lY3Rpb25zLgotLlBwCi0uTm0KLWlzIGFsc28gdXNlZCB0byBnZW5lcmF0ZSBncm91cHMgZm9yIHVzZSBpbiBEaWZmaWUtSGVsbG1hbiBncm91cAotZXhjaGFuZ2UgKERILUdFWCkuCi1TZWUgdGhlCi0uU3ggTU9EVUxJIEdFTkVSQVRJT04KLXNlY3Rpb24gZm9yIGRldGFpbHMuCi0uUHAKLU5vcm1hbGx5IGVhY2ggdXNlciB3aXNoaW5nIHRvIHVzZSBTU0gKLXdpdGggcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiBydW5zIHRoaXMgb25jZSB0byBjcmVhdGUgdGhlIGF1dGhlbnRpY2F0aW9uCi1rZXkgaW4KLS5QYSB+Ly5zc2gvaWRlbnRpdHkgLAotLlBhIH4vLnNzaC9pZF9lY2RzYSAsCi0uUGEgfi8uc3NoL2lkX2RzYQotb3IKLS5QYSB+Ly5zc2gvaWRfcnNhIC4KLUFkZGl0aW9uYWxseSwgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIG1heSB1c2UgdGhpcyB0byBnZW5lcmF0ZSBob3N0IGtleXMsCi1hcyBzZWVuIGluCi0uUGEgL2V0Yy9yYyAuCi0uUHAKLU5vcm1hbGx5IHRoaXMgcHJvZ3JhbSBnZW5lcmF0ZXMgdGhlIGtleSBhbmQgYXNrcyBmb3IgYSBmaWxlIGluIHdoaWNoCi10byBzdG9yZSB0aGUgcHJpdmF0ZSBrZXkuCi1UaGUgcHVibGljIGtleSBpcyBzdG9yZWQgaW4gYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBidXQKLS5EcSAucHViCi1hcHBlbmRlZC4KLVRoZSBwcm9ncmFtIGFsc28gYXNrcyBmb3IgYSBwYXNzcGhyYXNlLgotVGhlIHBhc3NwaHJhc2UgbWF5IGJlIGVtcHR5IHRvIGluZGljYXRlIG5vIHBhc3NwaHJhc2UKLShob3N0IGtleXMgbXVzdCBoYXZlIGFuIGVtcHR5IHBhc3NwaHJhc2UpLCBvciBpdCBtYXkgYmUgYSBzdHJpbmcgb2YKLWFyYml0cmFyeSBsZW5ndGguCi1BIHBhc3NwaHJhc2UgaXMgc2ltaWxhciB0byBhIHBhc3N3b3JkLCBleGNlcHQgaXQgY2FuIGJlIGEgcGhyYXNlIHdpdGggYQotc2VyaWVzIG9mIHdvcmRzLCBwdW5jdHVhdGlvbiwgbnVtYmVycywgd2hpdGVzcGFjZSwgb3IgYW55IHN0cmluZyBvZgotY2hhcmFjdGVycyB5b3Ugd2FudC4KLUdvb2QgcGFzc3BocmFzZXMgYXJlIDEwLTMwIGNoYXJhY3RlcnMgbG9uZywgYXJlCi1ub3Qgc2ltcGxlIHNlbnRlbmNlcyBvciBvdGhlcndpc2UgZWFzaWx5IGd1ZXNzYWJsZSAoRW5nbGlzaAotcHJvc2UgaGFzIG9ubHkgMS0yIGJpdHMgb2YgZW50cm9weSBwZXIgY2hhcmFjdGVyLCBhbmQgcHJvdmlkZXMgdmVyeSBiYWQKLXBhc3NwaHJhc2VzKSwgYW5kIGNvbnRhaW4gYSBtaXggb2YgdXBwZXIgYW5kIGxvd2VyY2FzZSBsZXR0ZXJzLAotbnVtYmVycywgYW5kIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KLVRoZSBwYXNzcGhyYXNlIGNhbiBiZSBjaGFuZ2VkIGxhdGVyIGJ5IHVzaW5nIHRoZQotLkZsIHAKLW9wdGlvbi4KLS5QcAotVGhlcmUgaXMgbm8gd2F5IHRvIHJlY292ZXIgYSBsb3N0IHBhc3NwaHJhc2UuCi1JZiB0aGUgcGFzc3BocmFzZSBpcyBsb3N0IG9yIGZvcmdvdHRlbiwgYSBuZXcga2V5IG11c3QgYmUgZ2VuZXJhdGVkCi1hbmQgdGhlIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleSBjb3BpZWQgdG8gb3RoZXIgbWFjaGluZXMuCi0uUHAKLUZvciBSU0ExIGtleXMsCi10aGVyZSBpcyBhbHNvIGEgY29tbWVudCBmaWVsZCBpbiB0aGUga2V5IGZpbGUgdGhhdCBpcyBvbmx5IGZvcgotY29udmVuaWVuY2UgdG8gdGhlIHVzZXIgdG8gaGVscCBpZGVudGlmeSB0aGUga2V5LgotVGhlIGNvbW1lbnQgY2FuIHRlbGwgd2hhdCB0aGUga2V5IGlzIGZvciwgb3Igd2hhdGV2ZXIgaXMgdXNlZnVsLgotVGhlIGNvbW1lbnQgaXMgaW5pdGlhbGl6ZWQgdG8KLS5EcSB1c2VyQGhvc3QKLXdoZW4gdGhlIGtleSBpcyBjcmVhdGVkLCBidXQgY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhlCi0uRmwgYwotb3B0aW9uLgotLlBwCi1BZnRlciBhIGtleSBpcyBnZW5lcmF0ZWQsIGluc3RydWN0aW9ucyBiZWxvdyBkZXRhaWwgd2hlcmUgdGhlIGtleXMKLXNob3VsZCBiZSBwbGFjZWQgdG8gYmUgYWN0aXZhdGVkLgotLlBwCi1UaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czoKLS5CbCAtdGFnIC13aWR0aCBEcwotLkl0IEZsIEEKLUZvciBlYWNoIG9mIHRoZSBrZXkgdHlwZXMgKHJzYTEsIHJzYSwgZHNhIGFuZCBlY2RzYSkgZm9yIHdoaWNoIGhvc3Qga2V5cwotZG8gbm90IGV4aXN0LCBnZW5lcmF0ZSB0aGUgaG9zdCBrZXlzIHdpdGggdGhlIGRlZmF1bHQga2V5IGZpbGUgcGF0aCwKLWFuIGVtcHR5IHBhc3NwaHJhc2UsIGRlZmF1bHQgYml0cyBmb3IgdGhlIGtleSB0eXBlLCBhbmQgZGVmYXVsdCBjb21tZW50LgotVGhpcyBpcyB1c2VkIGJ5Ci0uUGEgL2V0Yy9yYwotdG8gZ2VuZXJhdGUgbmV3IGhvc3Qga2V5cy4KLS5JdCBGbCBhIEFyIHRyaWFscwotU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcHJpbWFsaXR5IHRlc3RzIHRvIHBlcmZvcm0gd2hlbiBzY3JlZW5pbmcgREgtR0VYCi1jYW5kaWRhdGVzIHVzaW5nIHRoZQotLkZsIFQKLWNvbW1hbmQuCi0uSXQgRmwgQgotU2hvdyB0aGUgYnViYmxlYmFiYmxlIGRpZ2VzdCBvZiBzcGVjaWZpZWQgcHJpdmF0ZSBvciBwdWJsaWMga2V5IGZpbGUuCi0uSXQgRmwgYiBBciBiaXRzCi1TcGVjaWZpZXMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBrZXkgdG8gY3JlYXRlLgotRm9yIFJTQSBrZXlzLCB0aGUgbWluaW11bSBzaXplIGlzIDc2OCBiaXRzIGFuZCB0aGUgZGVmYXVsdCBpcyAyMDQ4IGJpdHMuCi1HZW5lcmFsbHksIDIwNDggYml0cyBpcyBjb25zaWRlcmVkIHN1ZmZpY2llbnQuCi1EU0Ega2V5cyBtdXN0IGJlIGV4YWN0bHkgMTAyNCBiaXRzIGFzIHNwZWNpZmllZCBieSBGSVBTIDE4Ni0yLgotRm9yIEVDRFNBIGtleXMsIHRoZQotLkZsIGIKLWZsYWcgZGV0ZXJtaW5lcyB0aGV5IGtleSBsZW5ndGggYnkgc2VsZWN0aW5nIGZyb20gb25lIG9mIHRocmVlIGVsbGlwdGljCi1jdXJ2ZSBzaXplczogMjU2LCAzODQgb3IgNTIxIGJpdHMuCi1BdHRlbXB0aW5nIHRvIHVzZSBiaXQgbGVuZ3RocyBvdGhlciB0aGFuIHRoZXNlIHRocmVlIHZhbHVlcyBmb3IgRUNEU0Ega2V5cwotd2lsbCBmYWlsLgotLkl0IEZsIEMgQXIgY29tbWVudAotUHJvdmlkZXMgYSBuZXcgY29tbWVudC4KLS5JdCBGbCBjCi1SZXF1ZXN0cyBjaGFuZ2luZyB0aGUgY29tbWVudCBpbiB0aGUgcHJpdmF0ZSBhbmQgcHVibGljIGtleSBmaWxlcy4KLVRoaXMgb3BlcmF0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBSU0ExIGtleXMuCi1UaGUgcHJvZ3JhbSB3aWxsIHByb21wdCBmb3IgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcHJpdmF0ZSBrZXlzLCBmb3IKLXRoZSBwYXNzcGhyYXNlIGlmIHRoZSBrZXkgaGFzIG9uZSwgYW5kIGZvciB0aGUgbmV3IGNvbW1lbnQuCi0uSXQgRmwgRCBBciBwa2NzMTEKLURvd25sb2FkIHRoZSBSU0EgcHVibGljIGtleXMgcHJvdmlkZWQgYnkgdGhlIFBLQ1MjMTEgc2hhcmVkIGxpYnJhcnkKLS5BciBwa2NzMTEgLgotV2hlbiB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgKLS5GbCBzICwKLXRoaXMgb3B0aW9uIGluZGljYXRlcyB0aGF0IGEgQ0Ega2V5IHJlc2lkZXMgaW4gYSBQS0NTIzExIHRva2VuIChzZWUgdGhlCi0uU3ggQ0VSVElGSUNBVEVTCi1zZWN0aW9uIGZvciBkZXRhaWxzKS4KLS5JdCBGbCBlCi1UaGlzIG9wdGlvbiB3aWxsIHJlYWQgYSBwcml2YXRlIG9yIHB1YmxpYyBPcGVuU1NIIGtleSBmaWxlIGFuZAotcHJpbnQgdG8gc3Rkb3V0IHRoZSBrZXkgaW4gb25lIG9mIHRoZSBmb3JtYXRzIHNwZWNpZmllZCBieSB0aGUKLS5GbCBtCi1vcHRpb24uCi1UaGUgZGVmYXVsdCBleHBvcnQgZm9ybWF0IGlzCi0uRHEgUkZDNDcxNiAuCi1UaGlzIG9wdGlvbiBhbGxvd3MgZXhwb3J0aW5nIE9wZW5TU0gga2V5cyBmb3IgdXNlIGJ5IG90aGVyIHByb2dyYW1zLCBpbmNsdWRpbmcKLXNldmVyYWwgY29tbWVyY2lhbCBTU0ggaW1wbGVtZW50YXRpb25zLgotLkl0IEZsIEYgQXIgaG9zdG5hbWUKLVNlYXJjaCBmb3IgdGhlIHNwZWNpZmllZAotLkFyIGhvc3RuYW1lCi1pbiBhCi0uUGEga25vd25faG9zdHMKLWZpbGUsIGxpc3RpbmcgYW55IG9jY3VycmVuY2VzIGZvdW5kLgotVGhpcyBvcHRpb24gaXMgdXNlZnVsIHRvIGZpbmQgaGFzaGVkIGhvc3QgbmFtZXMgb3IgYWRkcmVzc2VzIGFuZCBtYXkgYWxzbyBiZQotdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotLkZsIEgKLW9wdGlvbiB0byBwcmludCBmb3VuZCBrZXlzIGluIGEgaGFzaGVkIGZvcm1hdC4KLS5JdCBGbCBmIEFyIGZpbGVuYW1lCi1TcGVjaWZpZXMgdGhlIGZpbGVuYW1lIG9mIHRoZSBrZXkgZmlsZS4KLS5JdCBGbCBHIEFyIG91dHB1dF9maWxlCi1HZW5lcmF0ZSBjYW5kaWRhdGUgcHJpbWVzIGZvciBESC1HRVguCi1UaGVzZSBwcmltZXMgbXVzdCBiZSBzY3JlZW5lZCBmb3IKLXNhZmV0eSAodXNpbmcgdGhlCi0uRmwgVAotb3B0aW9uKSBiZWZvcmUgdXNlLgotLkl0IEZsIGcKLVVzZSBnZW5lcmljIEROUyBmb3JtYXQgd2hlbiBwcmludGluZyBmaW5nZXJwcmludCByZXNvdXJjZSByZWNvcmRzIHVzaW5nIHRoZQotLkZsIHIKLWNvbW1hbmQuCi0uSXQgRmwgSAotSGFzaCBhCi0uUGEga25vd25faG9zdHMKLWZpbGUuCi1UaGlzIHJlcGxhY2VzIGFsbCBob3N0bmFtZXMgYW5kIGFkZHJlc3NlcyB3aXRoIGhhc2hlZCByZXByZXNlbnRhdGlvbnMKLXdpdGhpbiB0aGUgc3BlY2lmaWVkIGZpbGU7IHRoZSBvcmlnaW5hbCBjb250ZW50IGlzIG1vdmVkIHRvIGEgZmlsZSB3aXRoCi1hIC5vbGQgc3VmZml4LgotVGhlc2UgaGFzaGVzIG1heSBiZSB1c2VkIG5vcm1hbGx5IGJ5Ci0uTm0gc3NoCi1hbmQKLS5ObSBzc2hkICwKLWJ1dCB0aGV5IGRvIG5vdCByZXZlYWwgaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gc2hvdWxkIHRoZSBmaWxlJ3MgY29udGVudHMKLWJlIGRpc2Nsb3NlZC4KLVRoaXMgb3B0aW9uIHdpbGwgbm90IG1vZGlmeSBleGlzdGluZyBoYXNoZWQgaG9zdG5hbWVzIGFuZCBpcyB0aGVyZWZvcmUgc2FmZQotdG8gdXNlIG9uIGZpbGVzIHRoYXQgbWl4IGhhc2hlZCBhbmQgbm9uLWhhc2hlZCBuYW1lcy4KLS5JdCBGbCBoCi1XaGVuIHNpZ25pbmcgYSBrZXksIGNyZWF0ZSBhIGhvc3QgY2VydGlmaWNhdGUgaW5zdGVhZCBvZiBhIHVzZXIKLWNlcnRpZmljYXRlLgotUGxlYXNlIHNlZSB0aGUKLS5TeCBDRVJUSUZJQ0FURVMKLXNlY3Rpb24gZm9yIGRldGFpbHMuCi0uSXQgRmwgSSBBciBjZXJ0aWZpY2F0ZV9pZGVudGl0eQotU3BlY2lmeSB0aGUga2V5IGlkZW50aXR5IHdoZW4gc2lnbmluZyBhIHB1YmxpYyBrZXkuCi1QbGVhc2Ugc2VlIHRoZQotLlN4IENFUlRJRklDQVRFUwotc2VjdGlvbiBmb3IgZGV0YWlscy4KLS5JdCBGbCBpCi1UaGlzIG9wdGlvbiB3aWxsIHJlYWQgYW4gdW5lbmNyeXB0ZWQgcHJpdmF0ZSAob3IgcHVibGljKSBrZXkgZmlsZQotaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgdGhlCi0uRmwgbQotb3B0aW9uIGFuZCBwcmludCBhbiBPcGVuU1NIIGNvbXBhdGlibGUgcHJpdmF0ZQotKG9yIHB1YmxpYykga2V5IHRvIHN0ZG91dC4KLVRoaXMgb3B0aW9uIGFsbG93cyBpbXBvcnRpbmcga2V5cyBmcm9tIG90aGVyIHNvZnR3YXJlLCBpbmNsdWRpbmcgc2V2ZXJhbAotY29tbWVyY2lhbCBTU0ggaW1wbGVtZW50YXRpb25zLgotVGhlIGRlZmF1bHQgaW1wb3J0IGZvcm1hdCBpcwotLkRxIFJGQzQ3MTYgLgotLkl0IEZsIEwKLVByaW50cyB0aGUgY29udGVudHMgb2YgYSBjZXJ0aWZpY2F0ZS4KLS5JdCBGbCBsCi1TaG93IGZpbmdlcnByaW50IG9mIHNwZWNpZmllZCBwdWJsaWMga2V5IGZpbGUuCi1Qcml2YXRlIFJTQTEga2V5cyBhcmUgYWxzbyBzdXBwb3J0ZWQuCi1Gb3IgUlNBIGFuZCBEU0Ega2V5cwotLk5tCi10cmllcyB0byBmaW5kIHRoZSBtYXRjaGluZyBwdWJsaWMga2V5IGZpbGUgYW5kIHByaW50cyBpdHMgZmluZ2VycHJpbnQuCi1JZiBjb21iaW5lZCB3aXRoCi0uRmwgdiAsCi1hbiBBU0NJSSBhcnQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGtleSBpcyBzdXBwbGllZCB3aXRoIHRoZSBmaW5nZXJwcmludC4KLS5JdCBGbCBNIEFyIG1lbW9yeQotU3BlY2lmeSB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgKGluIG1lZ2FieXRlcykgd2hlbiBnZW5lcmF0aW5nCi1jYW5kaWRhdGUgbW9kdWxpIGZvciBESC1HRVguCi0uSXQgRmwgbSBBciBrZXlfZm9ybWF0Ci1TcGVjaWZ5IGEga2V5IGZvcm1hdCBmb3IgdGhlCi0uRmwgaQotKGltcG9ydCkgb3IKLS5GbCBlCi0oZXhwb3J0KSBjb252ZXJzaW9uIG9wdGlvbnMuCi1UaGUgc3VwcG9ydGVkIGtleSBmb3JtYXRzIGFyZToKLS5EcSBSRkM0NzE2Ci0oUkZDIDQ3MTYvU1NIMiBwdWJsaWMgb3IgcHJpdmF0ZSBrZXkpLAotLkRxIFBLQ1M4Ci0oUEVNIFBLQ1M4IHB1YmxpYyBrZXkpCi1vcgotLkRxIFBFTQotKFBFTSBwdWJsaWMga2V5KS4KLVRoZSBkZWZhdWx0IGNvbnZlcnNpb24gZm9ybWF0IGlzCi0uRHEgUkZDNDcxNiAuCi0uSXQgRmwgTiBBciBuZXdfcGFzc3BocmFzZQotUHJvdmlkZXMgdGhlIG5ldyBwYXNzcGhyYXNlLgotLkl0IEZsIG4gQXIgcHJpbmNpcGFscwotU3BlY2lmeSBvbmUgb3IgbW9yZSBwcmluY2lwYWxzICh1c2VyIG9yIGhvc3QgbmFtZXMpIHRvIGJlIGluY2x1ZGVkIGluCi1hIGNlcnRpZmljYXRlIHdoZW4gc2lnbmluZyBhIGtleS4KLU11bHRpcGxlIHByaW5jaXBhbHMgbWF5IGJlIHNwZWNpZmllZCwgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLVBsZWFzZSBzZWUgdGhlCi0uU3ggQ0VSVElGSUNBVEVTCi1zZWN0aW9uIGZvciBkZXRhaWxzLgotLkl0IEZsIE8gQXIgb3B0aW9uCi1TcGVjaWZ5IGEgY2VydGlmaWNhdGUgb3B0aW9uIHdoZW4gc2lnbmluZyBhIGtleS4KLVRoaXMgb3B0aW9uIG1heSBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuCi1QbGVhc2Ugc2VlIHRoZQotLlN4IENFUlRJRklDQVRFUwotc2VjdGlvbiBmb3IgZGV0YWlscy4KLVRoZSBvcHRpb25zIHRoYXQgYXJlIHZhbGlkIGZvciB1c2VyIGNlcnRpZmljYXRlcyBhcmU6Ci0uQmwgLXRhZyAtd2lkdGggRHMKLS5JdCBJYyBjbGVhcgotQ2xlYXIgYWxsIGVuYWJsZWQgcGVybWlzc2lvbnMuCi1UaGlzIGlzIHVzZWZ1bCBmb3IgY2xlYXJpbmcgdGhlIGRlZmF1bHQgc2V0IG9mIHBlcm1pc3Npb25zIHNvIHBlcm1pc3Npb25zIG1heQotYmUgYWRkZWQgaW5kaXZpZHVhbGx5LgotLkl0IEljIGZvcmNlLWNvbW1hbmQgTnMgPSBOcyBBciBjb21tYW5kCi1Gb3JjZXMgdGhlIGV4ZWN1dGlvbiBvZgotLkFyIGNvbW1hbmQKLWluc3RlYWQgb2YgYW55IHNoZWxsIG9yIGNvbW1hbmQgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIHdoZW4KLXRoZSBjZXJ0aWZpY2F0ZSBpcyB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4KLS5JdCBJYyBuby1hZ2VudC1mb3J3YXJkaW5nCi1EaXNhYmxlCi0uWHIgc3NoLWFnZW50IDEKLWZvcndhcmRpbmcgKHBlcm1pdHRlZCBieSBkZWZhdWx0KS4KLS5JdCBJYyBuby1wb3J0LWZvcndhcmRpbmcKLURpc2FibGUgcG9ydCBmb3J3YXJkaW5nIChwZXJtaXR0ZWQgYnkgZGVmYXVsdCkuCi0uSXQgSWMgbm8tcHR5Ci1EaXNhYmxlIFBUWSBhbGxvY2F0aW9uIChwZXJtaXR0ZWQgYnkgZGVmYXVsdCkuCi0uSXQgSWMgbm8tdXNlci1yYwotRGlzYWJsZSBleGVjdXRpb24gb2YKLS5QYSB+Ly5zc2gvcmMKLWJ5Ci0uWHIgc3NoZCA4Ci0ocGVybWl0dGVkIGJ5IGRlZmF1bHQpLgotLkl0IEljIG5vLXgxMS1mb3J3YXJkaW5nCi1EaXNhYmxlIFgxMSBmb3J3YXJkaW5nIChwZXJtaXR0ZWQgYnkgZGVmYXVsdCkuCi0uSXQgSWMgcGVybWl0LWFnZW50LWZvcndhcmRpbmcKLUFsbG93cwotLlhyIHNzaC1hZ2VudCAxCi1mb3J3YXJkaW5nLgotLkl0IEljIHBlcm1pdC1wb3J0LWZvcndhcmRpbmcKLUFsbG93cyBwb3J0IGZvcndhcmRpbmcuCi0uSXQgSWMgcGVybWl0LXB0eQotQWxsb3dzIFBUWSBhbGxvY2F0aW9uLgotLkl0IEljIHBlcm1pdC11c2VyLXJjCi1BbGxvd3MgZXhlY3V0aW9uIG9mCi0uUGEgfi8uc3NoL3JjCi1ieQotLlhyIHNzaGQgOCAuCi0uSXQgSWMgcGVybWl0LXgxMS1mb3J3YXJkaW5nCi1BbGxvd3MgWDExIGZvcndhcmRpbmcuCi0uSXQgSWMgc291cmNlLWFkZHJlc3MgTnMgPSBOcyBBciBhZGRyZXNzX2xpc3QKLVJlc3RyaWN0IHRoZSBzb3VyY2UgYWRkcmVzc2VzIGZyb20gd2hpY2ggdGhlIGNlcnRpZmljYXRlIGlzIGNvbnNpZGVyZWQgdmFsaWQuCi1UaGUKLS5BciBhZGRyZXNzX2xpc3QKLWlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygb25lIG9yIG1vcmUgYWRkcmVzcy9uZXRtYXNrIHBhaXJzIGluIENJRFIKLWZvcm1hdC4KLS5FbAotLlBwCi1BdCBwcmVzZW50LCBubyBvcHRpb25zIGFyZSB2YWxpZCBmb3IgaG9zdCBrZXlzLgotLkl0IEZsIFAgQXIgcGFzc3BocmFzZQotUHJvdmlkZXMgdGhlIChvbGQpIHBhc3NwaHJhc2UuCi0uSXQgRmwgcAotUmVxdWVzdHMgY2hhbmdpbmcgdGhlIHBhc3NwaHJhc2Ugb2YgYSBwcml2YXRlIGtleSBmaWxlIGluc3RlYWQgb2YKLWNyZWF0aW5nIGEgbmV3IHByaXZhdGUga2V5LgotVGhlIHByb2dyYW0gd2lsbCBwcm9tcHQgZm9yIHRoZSBmaWxlCi1jb250YWluaW5nIHRoZSBwcml2YXRlIGtleSwgZm9yIHRoZSBvbGQgcGFzc3BocmFzZSwgYW5kIHR3aWNlIGZvciB0aGUKLW5ldyBwYXNzcGhyYXNlLgotLkl0IEZsIHEKLVNpbGVuY2UKLS5ObSBzc2gta2V5Z2VuIC4KLS5JdCBGbCBSIEFyIGhvc3RuYW1lCi1SZW1vdmVzIGFsbCBrZXlzIGJlbG9uZ2luZyB0bwotLkFyIGhvc3RuYW1lCi1mcm9tIGEKLS5QYSBrbm93bl9ob3N0cwotZmlsZS4KLVRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB0byBkZWxldGUgaGFzaGVkIGhvc3RzIChzZWUgdGhlCi0uRmwgSAotb3B0aW9uIGFib3ZlKS4KLS5JdCBGbCByIEFyIGhvc3RuYW1lCi1QcmludCB0aGUgU1NIRlAgZmluZ2VycHJpbnQgcmVzb3VyY2UgcmVjb3JkIG5hbWVkCi0uQXIgaG9zdG5hbWUKLWZvciB0aGUgc3BlY2lmaWVkIHB1YmxpYyBrZXkgZmlsZS4KLS5JdCBGbCBTIEFyIHN0YXJ0Ci1TcGVjaWZ5IHN0YXJ0IHBvaW50IChpbiBoZXgpIHdoZW4gZ2VuZXJhdGluZyBjYW5kaWRhdGUgbW9kdWxpIGZvciBESC1HRVguCi0uSXQgRmwgcyBBciBjYV9rZXkKLUNlcnRpZnkgKHNpZ24pIGEgcHVibGljIGtleSB1c2luZyB0aGUgc3BlY2lmaWVkIENBIGtleS4KLVBsZWFzZSBzZWUgdGhlCi0uU3ggQ0VSVElGSUNBVEVTCi1zZWN0aW9uIGZvciBkZXRhaWxzLgotLkl0IEZsIFQgQXIgb3V0cHV0X2ZpbGUKLVRlc3QgREggZ3JvdXAgZXhjaGFuZ2UgY2FuZGlkYXRlIHByaW1lcyAoZ2VuZXJhdGVkIHVzaW5nIHRoZQotLkZsIEcKLW9wdGlvbikgZm9yIHNhZmV0eS4KLS5JdCBGbCB0IEFyIHR5cGUKLVNwZWNpZmllcyB0aGUgdHlwZSBvZiBrZXkgdG8gY3JlYXRlLgotVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmUKLS5EcSByc2ExCi1mb3IgcHJvdG9jb2wgdmVyc2lvbiAxIGFuZAotLkRxIGRzYSAsCi0uRHEgZWNkc2EKLW9yCi0uRHEgcnNhCi1mb3IgcHJvdG9jb2wgdmVyc2lvbiAyLgotLkl0IEZsIFYgQXIgdmFsaWRpdHlfaW50ZXJ2YWwKLVNwZWNpZnkgYSB2YWxpZGl0eSBpbnRlcnZhbCB3aGVuIHNpZ25pbmcgYSBjZXJ0aWZpY2F0ZS4KLUEgdmFsaWRpdHkgaW50ZXJ2YWwgbWF5IGNvbnNpc3Qgb2YgYSBzaW5nbGUgdGltZSwgaW5kaWNhdGluZyB0aGF0IHRoZQotY2VydGlmaWNhdGUgaXMgdmFsaWQgYmVnaW5uaW5nIG5vdyBhbmQgZXhwaXJpbmcgYXQgdGhhdCB0aW1lLCBvciBtYXkgY29uc2lzdAotb2YgdHdvIHRpbWVzIHNlcGFyYXRlZCBieSBhIGNvbG9uIHRvIGluZGljYXRlIGFuIGV4cGxpY2l0IHRpbWUgaW50ZXJ2YWwuCi1UaGUgc3RhcnQgdGltZSBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgZGF0ZSBpbiBZWVlZTU1ERCBmb3JtYXQsIGEgdGltZQotaW4gWVlZWU1NRERISE1NU1MgZm9ybWF0IG9yIGEgcmVsYXRpdmUgdGltZSAodG8gdGhlIGN1cnJlbnQgdGltZSkgY29uc2lzdGluZwotb2YgYSBtaW51cyBzaWduIGZvbGxvd2VkIGJ5IGEgcmVsYXRpdmUgdGltZSBpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUKLS5TeCBUSU1FIEZPUk1BVFMKLXNlY3Rpb24gb2YKLS5YciBzc2hkX2NvbmZpZyA1IC4KLVRoZSBlbmQgdGltZSBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgWVlZWU1NREQgZGF0ZSwgYSBZWVlZTU1EREhITU1TUyB0aW1lIG9yCi1hIHJlbGF0aXZlIHRpbWUgc3RhcnRpbmcgd2l0aCBhIHBsdXMgY2hhcmFjdGVyLgotLlBwCi1Gb3IgZXhhbXBsZToKLS5EcSArNTJ3MWQKLSh2YWxpZCBmcm9tIG5vdyB0byA1MiB3ZWVrcyBhbmQgb25lIGRheSBmcm9tIG5vdyksCi0uRHEgLTR3Ois0dwotKHZhbGlkIGZyb20gZm91ciB3ZWVrcyBhZ28gdG8gZm91ciB3ZWVrcyBmcm9tIG5vdyksCi0uRHEgMjAxMDAxMDExMjMwMDA6MjAxMTAxMDExMjMwMDAKLSh2YWxpZCBmcm9tIDEyOjMwIFBNLCBKYW51YXJ5IDFzdCwgMjAxMCB0byAxMjozMCBQTSwgSmFudWFyeSAxc3QsIDIwMTEpLAotLkRxIC0xZDoyMDExMDEwMQotKHZhbGlkIGZyb20geWVzdGVyZGF5IHRvIG1pZG5pZ2h0LCBKYW51YXJ5IDFzdCwgMjAxMSkuCi0uSXQgRmwgdgotVmVyYm9zZSBtb2RlLgotQ2F1c2VzCi0uTm0KLXRvIHByaW50IGRlYnVnZ2luZyBtZXNzYWdlcyBhYm91dCBpdHMgcHJvZ3Jlc3MuCi1UaGlzIGlzIGhlbHBmdWwgZm9yIGRlYnVnZ2luZyBtb2R1bGkgZ2VuZXJhdGlvbi4KLU11bHRpcGxlCi0uRmwgdgotb3B0aW9ucyBpbmNyZWFzZSB0aGUgdmVyYm9zaXR5LgotVGhlIG1heGltdW0gaXMgMy4KLS5JdCBGbCBXIEFyIGdlbmVyYXRvcgotU3BlY2lmeSBkZXNpcmVkIGdlbmVyYXRvciB3aGVuIHRlc3RpbmcgY2FuZGlkYXRlIG1vZHVsaSBmb3IgREgtR0VYLgotLkl0IEZsIHkKLVRoaXMgb3B0aW9uIHdpbGwgcmVhZCBhIHByaXZhdGUKLU9wZW5TU0ggZm9ybWF0IGZpbGUgYW5kIHByaW50IGFuIE9wZW5TU0ggcHVibGljIGtleSB0byBzdGRvdXQuCi0uSXQgRmwgeiBBciBzZXJpYWxfbnVtYmVyCi1TcGVjaWZpZXMgYSBzZXJpYWwgbnVtYmVyIHRvIGJlIGVtYmVkZGVkIGluIHRoZSBjZXJ0aWZpY2F0ZSB0byBkaXN0aW5ndWlzaAotdGhpcyBjZXJ0aWZpY2F0ZSBmcm9tIG90aGVycyBmcm9tIHRoZSBzYW1lIENBLgotVGhlIGRlZmF1bHQgc2VyaWFsIG51bWJlciBpcyB6ZXJvLgotLkVsCi0uU2ggTU9EVUxJIEdFTkVSQVRJT04KLS5ObQotbWF5IGJlIHVzZWQgdG8gZ2VuZXJhdGUgZ3JvdXBzIGZvciB0aGUgRGlmZmllLUhlbGxtYW4gR3JvdXAgRXhjaGFuZ2UKLShESC1HRVgpIHByb3RvY29sLgotR2VuZXJhdGluZyB0aGVzZSBncm91cHMgaXMgYSB0d28tc3RlcCBwcm9jZXNzOiBmaXJzdCwgY2FuZGlkYXRlCi1wcmltZXMgYXJlIGdlbmVyYXRlZCB1c2luZyBhIGZhc3QsIGJ1dCBtZW1vcnkgaW50ZW5zaXZlIHByb2Nlc3MuCi1UaGVzZSBjYW5kaWRhdGUgcHJpbWVzIGFyZSB0aGVuIHRlc3RlZCBmb3Igc3VpdGFiaWxpdHkgKGEgQ1BVLWludGVuc2l2ZQotcHJvY2VzcykuCi0uUHAKLUdlbmVyYXRpb24gb2YgcHJpbWVzIGlzIHBlcmZvcm1lZCB1c2luZyB0aGUKLS5GbCBHCi1vcHRpb24uCi1UaGUgZGVzaXJlZCBsZW5ndGggb2YgdGhlIHByaW1lcyBtYXkgYmUgc3BlY2lmaWVkIGJ5IHRoZQotLkZsIGIKLW9wdGlvbi4KLUZvciBleGFtcGxlOgotLlBwCi0uRGwgIyBzc2gta2V5Z2VuIC1HIG1vZHVsaS0yMDQ4LmNhbmRpZGF0ZXMgLWIgMjA0OAotLlBwCi1CeSBkZWZhdWx0LCB0aGUgc2VhcmNoIGZvciBwcmltZXMgYmVnaW5zIGF0IGEgcmFuZG9tIHBvaW50IGluIHRoZQotZGVzaXJlZCBsZW5ndGggcmFuZ2UuCi1UaGlzIG1heSBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZQotLkZsIFMKLW9wdGlvbiwgd2hpY2ggc3BlY2lmaWVzIGEgZGlmZmVyZW50IHN0YXJ0IHBvaW50IChpbiBoZXgpLgotLlBwCi1PbmNlIGEgc2V0IG9mIGNhbmRpZGF0ZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZCwgdGhleSBtdXN0IGJlIHRlc3RlZCBmb3IKLXN1aXRhYmlsaXR5LgotVGhpcyBtYXkgYmUgcGVyZm9ybWVkIHVzaW5nIHRoZQotLkZsIFQKLW9wdGlvbi4KLUluIHRoaXMgbW9kZQotLk5tCi13aWxsIHJlYWQgY2FuZGlkYXRlcyBmcm9tIHN0YW5kYXJkIGlucHV0IChvciBhIGZpbGUgc3BlY2lmaWVkIHVzaW5nIHRoZQotLkZsIGYKLW9wdGlvbikuCi1Gb3IgZXhhbXBsZToKLS5QcAotLkRsICMgc3NoLWtleWdlbiAtVCBtb2R1bGktMjA0OCAtZiBtb2R1bGktMjA0OC5jYW5kaWRhdGVzCi0uUHAKLUJ5IGRlZmF1bHQsIGVhY2ggY2FuZGlkYXRlIHdpbGwgYmUgc3ViamVjdGVkIHRvIDEwMCBwcmltYWxpdHkgdGVzdHMuCi1UaGlzIG1heSBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZQotLkZsIGEKLW9wdGlvbi4KLVRoZSBESCBnZW5lcmF0b3IgdmFsdWUgd2lsbCBiZSBjaG9zZW4gYXV0b21hdGljYWxseSBmb3IgdGhlCi1wcmltZSB1bmRlciBjb25zaWRlcmF0aW9uLgotSWYgYSBzcGVjaWZpYyBnZW5lcmF0b3IgaXMgZGVzaXJlZCwgaXQgbWF5IGJlIHJlcXVlc3RlZCB1c2luZyB0aGUKLS5GbCBXCi1vcHRpb24uCi1WYWxpZCBnZW5lcmF0b3IgdmFsdWVzIGFyZSAyLCAzLCBhbmQgNS4KLS5QcAotU2NyZWVuZWQgREggZ3JvdXBzIG1heSBiZSBpbnN0YWxsZWQgaW4KLS5QYSAvZXRjL21vZHVsaSAuCi1JdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIGZpbGUgY29udGFpbnMgbW9kdWxpIG9mIGEgcmFuZ2Ugb2YgYml0IGxlbmd0aHMgYW5kCi10aGF0IGJvdGggZW5kcyBvZiBhIGNvbm5lY3Rpb24gc2hhcmUgY29tbW9uIG1vZHVsaS4KLS5TaCBDRVJUSUZJQ0FURVMKLS5ObQotc3VwcG9ydHMgc2lnbmluZyBvZiBrZXlzIHRvIHByb2R1Y2UgY2VydGlmaWNhdGVzIHRoYXQgbWF5IGJlIHVzZWQgZm9yCi11c2VyIG9yIGhvc3QgYXV0aGVudGljYXRpb24uCi1DZXJ0aWZpY2F0ZXMgY29uc2lzdCBvZiBhIHB1YmxpYyBrZXksIHNvbWUgaWRlbnRpdHkgaW5mb3JtYXRpb24sIHplcm8gb3IKLW1vcmUgcHJpbmNpcGFsICh1c2VyIG9yIGhvc3QpIG5hbWVzIGFuZCBhIHNldCBvZiBvcHRpb25zIHRoYXQKLWFyZSBzaWduZWQgYnkgYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAoQ0EpIGtleS4KLUNsaWVudHMgb3Igc2VydmVycyBtYXkgdGhlbiB0cnVzdCBvbmx5IHRoZSBDQSBrZXkgYW5kIHZlcmlmeSBpdHMgc2lnbmF0dXJlCi1vbiBhIGNlcnRpZmljYXRlIHJhdGhlciB0aGFuIHRydXN0aW5nIG1hbnkgdXNlci9ob3N0IGtleXMuCi1Ob3RlIHRoYXQgT3BlblNTSCBjZXJ0aWZpY2F0ZXMgYXJlIGEgZGlmZmVyZW50LCBhbmQgbXVjaCBzaW1wbGVyLCBmb3JtYXQgdG8KLXRoZSBYLjUwOSBjZXJ0aWZpY2F0ZXMgdXNlZCBpbgotLlhyIHNzbCA4IC4KLS5QcAotLk5tCi1zdXBwb3J0cyB0d28gdHlwZXMgb2YgY2VydGlmaWNhdGVzOiB1c2VyIGFuZCBob3N0LgotVXNlciBjZXJ0aWZpY2F0ZXMgYXV0aGVudGljYXRlIHVzZXJzIHRvIHNlcnZlcnMsIHdoZXJlYXMgaG9zdCBjZXJ0aWZpY2F0ZXMKLWF1dGhlbnRpY2F0ZSBzZXJ2ZXIgaG9zdHMgdG8gdXNlcnMuCi1UbyBnZW5lcmF0ZSBhIHVzZXIgY2VydGlmaWNhdGU6Ci0uUHAKLS5EbCAkIHNzaC1rZXlnZW4gLXMgL3BhdGgvdG8vY2Ffa2V5IC1JIGtleV9pZCAvcGF0aC90by91c2VyX2tleS5wdWIKLS5QcAotVGhlIHJlc3VsdGFudCBjZXJ0aWZpY2F0ZSB3aWxsIGJlIHBsYWNlZCBpbgotLlBhIC9wYXRoL3RvL3VzZXJfa2V5LWNlcnQucHViIC4KLUEgaG9zdCBjZXJ0aWZpY2F0ZSByZXF1aXJlcyB0aGUKLS5GbCBoCi1vcHRpb246Ci0uUHAKLS5EbCAkIHNzaC1rZXlnZW4gLXMgL3BhdGgvdG8vY2Ffa2V5IC1JIGtleV9pZCAtaCAvcGF0aC90by9ob3N0X2tleS5wdWIKLS5QcAotVGhlIGhvc3QgY2VydGlmaWNhdGUgd2lsbCBiZSBvdXRwdXQgdG8KLS5QYSAvcGF0aC90by9ob3N0X2tleS1jZXJ0LnB1YiAuCi0uUHAKLUl0IGlzIHBvc3NpYmxlIHRvIHNpZ24gdXNpbmcgYSBDQSBrZXkgc3RvcmVkIGluIGEgUEtDUyMxMSB0b2tlbiBieQotcHJvdmlkaW5nIHRoZSB0b2tlbiBsaWJyYXJ5IHVzaW5nCi0uRmwgRAotYW5kIGlkZW50aWZ5aW5nIHRoZSBDQSBrZXkgYnkgcHJvdmlkaW5nIGl0cyBwdWJsaWMgaGFsZiBhcyBhbiBhcmd1bWVudAotdG8KLS5GbCBzIDoKLS5QcAotLkRsICQgc3NoLWtleWdlbiAtcyBjYV9rZXkucHViIC1EIGxpYnBrY3MxMS5zbyAtSSBrZXlfaWQgaG9zdF9rZXkucHViCi0uUHAKLUluIGFsbCBjYXNlcywKLS5BciBrZXlfaWQKLWlzIGEgImtleSBpZGVudGlmaWVyIiB0aGF0IGlzIGxvZ2dlZCBieSB0aGUgc2VydmVyIHdoZW4gdGhlIGNlcnRpZmljYXRlCi1pcyB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4KLS5QcAotQ2VydGlmaWNhdGVzIG1heSBiZSBsaW1pdGVkIHRvIGJlIHZhbGlkIGZvciBhIHNldCBvZiBwcmluY2lwYWwgKHVzZXIvaG9zdCkKLW5hbWVzLgotQnkgZGVmYXVsdCwgZ2VuZXJhdGVkIGNlcnRpZmljYXRlcyBhcmUgdmFsaWQgZm9yIGFsbCB1c2VycyBvciBob3N0cy4KLVRvIGdlbmVyYXRlIGEgY2VydGlmaWNhdGUgZm9yIGEgc3BlY2lmaWVkIHNldCBvZiBwcmluY2lwYWxzOgotLlBwCi0uRGwgJCBzc2gta2V5Z2VuIC1zIGNhX2tleSAtSSBrZXlfaWQgLW4gdXNlcjEsdXNlcjIgdXNlcl9rZXkucHViCi0uRGwgIiQgc3NoLWtleWdlbiAtcyBjYV9rZXkgLUkga2V5X2lkIC1oIC1uIGhvc3QuZG9tYWluIHVzZXJfa2V5LnB1YiIKLS5QcAotQWRkaXRpb25hbCBsaW1pdGF0aW9ucyBvbiB0aGUgdmFsaWRpdHkgYW5kIHVzZSBvZiB1c2VyIGNlcnRpZmljYXRlcyBtYXkKLWJlIHNwZWNpZmllZCB0aHJvdWdoIGNlcnRpZmljYXRlIG9wdGlvbnMuCi1BIGNlcnRpZmljYXRlIG9wdGlvbiBtYXkgZGlzYWJsZSBmZWF0dXJlcyBvZiB0aGUgU1NIIHNlc3Npb24sIG1heSBiZQotdmFsaWQgb25seSB3aGVuIHByZXNlbnRlZCBmcm9tIHBhcnRpY3VsYXIgc291cmNlIGFkZHJlc3NlcyBvciBtYXkKLWZvcmNlIHRoZSB1c2Ugb2YgYSBzcGVjaWZpYyBjb21tYW5kLgotRm9yIGEgbGlzdCBvZiB2YWxpZCBjZXJ0aWZpY2F0ZSBvcHRpb25zLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZQotLkZsIE8KLW9wdGlvbiBhYm92ZS4KLS5QcAotRmluYWxseSwgY2VydGlmaWNhdGVzIG1heSBiZSBkZWZpbmVkIHdpdGggYSB2YWxpZGl0eSBsaWZldGltZS4KLVRoZQotLkZsIFYKLW9wdGlvbiBhbGxvd3Mgc3BlY2lmaWNhdGlvbiBvZiBjZXJ0aWZpY2F0ZSBzdGFydCBhbmQgZW5kIHRpbWVzLgotQSBjZXJ0aWZpY2F0ZSB0aGF0IGlzIHByZXNlbnRlZCBhdCBhIHRpbWUgb3V0c2lkZSB0aGlzIHJhbmdlIHdpbGwgbm90IGJlCi1jb25zaWRlcmVkIHZhbGlkLgotQnkgZGVmYXVsdCwgY2VydGlmaWNhdGVzIGhhdmUgYSBtYXhpbXVtIHZhbGlkaXR5IGludGVydmFsLgotLlBwCi1Gb3IgY2VydGlmaWNhdGVzIHRvIGJlIHVzZWQgZm9yIHVzZXIgb3IgaG9zdCBhdXRoZW50aWNhdGlvbiwgdGhlIENBCi1wdWJsaWMga2V5IG11c3QgYmUgdHJ1c3RlZCBieQotLlhyIHNzaGQgOAotb3IKLS5YciBzc2ggMSAuCi1QbGVhc2UgcmVmZXIgdG8gdGhvc2UgbWFudWFsIHBhZ2VzIGZvciBkZXRhaWxzLgotLlNoIEZJTEVTCi0uQmwgLXRhZyAtd2lkdGggRHMgLWNvbXBhY3QKLS5JdCBQYSB+Ly5zc2gvaWRlbnRpdHkKLUNvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIDEgUlNBIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IG9mIHRoZSB1c2VyLgotVGhpcyBmaWxlIHNob3VsZCBub3QgYmUgcmVhZGFibGUgYnkgYW55b25lIGJ1dCB0aGUgdXNlci4KLUl0IGlzIHBvc3NpYmxlIHRvCi1zcGVjaWZ5IGEgcGFzc3BocmFzZSB3aGVuIGdlbmVyYXRpbmcgdGhlIGtleTsgdGhhdCBwYXNzcGhyYXNlIHdpbGwgYmUKLXVzZWQgdG8gZW5jcnlwdCB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoaXMgZmlsZSB1c2luZyAzREVTLgotVGhpcyBmaWxlIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGFjY2Vzc2VkIGJ5Ci0uTm0KLWJ1dCBpdCBpcyBvZmZlcmVkIGFzIHRoZSBkZWZhdWx0IGZpbGUgZm9yIHRoZSBwcml2YXRlIGtleS4KLS5YciBzc2ggMQotd2lsbCByZWFkIHRoaXMgZmlsZSB3aGVuIGEgbG9naW4gYXR0ZW1wdCBpcyBtYWRlLgotLlBwCi0uSXQgUGEgfi8uc3NoL2lkZW50aXR5LnB1YgotQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMSBSU0EgcHVibGljIGtleSBmb3IgYXV0aGVudGljYXRpb24uCi1UaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIHNob3VsZCBiZSBhZGRlZCB0bwotLlBhIH4vLnNzaC9hdXRob3JpemVkX2tleXMKLW9uIGFsbCBtYWNoaW5lcwotd2hlcmUgdGhlIHVzZXIgd2lzaGVzIHRvIGxvZyBpbiB1c2luZyBSU0EgYXV0aGVudGljYXRpb24uCi1UaGVyZSBpcyBubyBuZWVkIHRvIGtlZXAgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBzZWNyZXQuCi0uUHAKLS5JdCBQYSB+Ly5zc2gvaWRfZHNhCi0uSXQgUGEgfi8uc3NoL2lkX2VjZHNhCi0uSXQgUGEgfi8uc3NoL2lkX3JzYQotQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMiBEU0EsIEVDRFNBIG9yIFJTQSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eSBvZiB0aGUgdXNlci4KLVRoaXMgZmlsZSBzaG91bGQgbm90IGJlIHJlYWRhYmxlIGJ5IGFueW9uZSBidXQgdGhlIHVzZXIuCi1JdCBpcyBwb3NzaWJsZSB0bwotc3BlY2lmeSBhIHBhc3NwaHJhc2Ugd2hlbiBnZW5lcmF0aW5nIHRoZSBrZXk7IHRoYXQgcGFzc3BocmFzZSB3aWxsIGJlCi11c2VkIHRvIGVuY3J5cHQgdGhlIHByaXZhdGUgcGFydCBvZiB0aGlzIGZpbGUgdXNpbmcgMTI4LWJpdCBBRVMuCi1UaGlzIGZpbGUgaXMgbm90IGF1dG9tYXRpY2FsbHkgYWNjZXNzZWQgYnkKLS5ObQotYnV0IGl0IGlzIG9mZmVyZWQgYXMgdGhlIGRlZmF1bHQgZmlsZSBmb3IgdGhlIHByaXZhdGUga2V5LgotLlhyIHNzaCAxCi13aWxsIHJlYWQgdGhpcyBmaWxlIHdoZW4gYSBsb2dpbiBhdHRlbXB0IGlzIG1hZGUuCi0uUHAKLS5JdCBQYSB+Ly5zc2gvaWRfZHNhLnB1YgotLkl0IFBhIH4vLnNzaC9pZF9lY2RzYS5wdWIKLS5JdCBQYSB+Ly5zc2gvaWRfcnNhLnB1YgotQ29udGFpbnMgdGhlIHByb3RvY29sIHZlcnNpb24gMiBEU0EsIEVDRFNBIG9yIFJTQSBwdWJsaWMga2V5IGZvciBhdXRoZW50aWNhdGlvbi4KLVRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgc2hvdWxkIGJlIGFkZGVkIHRvCi0uUGEgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cwotb24gYWxsIG1hY2hpbmVzCi13aGVyZSB0aGUgdXNlciB3aXNoZXMgdG8gbG9nIGluIHVzaW5nIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24uCi1UaGVyZSBpcyBubyBuZWVkIHRvIGtlZXAgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBzZWNyZXQuCi0uUHAKLS5JdCBQYSAvZXRjL21vZHVsaQotQ29udGFpbnMgRGlmZmllLUhlbGxtYW4gZ3JvdXBzIHVzZWQgZm9yIERILUdFWC4KLVRoZSBmaWxlIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4KLS5YciBtb2R1bGkgNSAuCi0uRWwKLS5TaCBTRUUgQUxTTwotLlhyIHNzaCAxICwKLS5YciBzc2gtYWRkIDEgLAotLlhyIHNzaC1hZ2VudCAxICwKLS5YciBtb2R1bGkgNSAsCi0uWHIgc3NoZCA4Ci0uUnMKLS4lUiBSRkMgNDcxNgotLiVUICJUaGUgU2VjdXJlIFNoZWxsIChTU0gpIFB1YmxpYyBLZXkgRmlsZSBGb3JtYXQiCi0uJUQgMjAwNgotLlJlCi0uU2ggQVVUSE9SUwotT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlCi1zc2ggMS4yLjEyIHJlbGVhc2UgYnkgVGF0dSBZbG9uZW4uCi1BYXJvbiBDYW1wYmVsbCwgQm9iIEJlY2ssIE1hcmt1cyBGcmllZGwsIE5pZWxzIFByb3ZvcywKLVRoZW8gZGUgUmFhZHQgYW5kIER1ZyBTb25nCi1yZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCi1jcmVhdGVkIE9wZW5TU0guCi1NYXJrdXMgRnJpZWRsIGNvbnRyaWJ1dGVkIHRoZSBzdXBwb3J0IGZvciBTU0gKLXByb3RvY29sIHZlcnNpb25zIDEuNSBhbmQgMi4wLgpkaWZmIC0tZ2l0IGEvc3NoLWtleWdlbi5jIGIvc3NoLWtleWdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjYyMThiLi4wMDAwMDAwCi0tLSBhL3NzaC1rZXlnZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDIzNzAgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNzaC1rZXlnZW4uYyx2IDEuMjEwIDIwMTEvMDQvMTggMDA6NDY6MDUgZGptIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NCBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogSWRlbnRpdHkgYW5kIGhvc3Qga2V5IGdlbmVyYXRpb24gYW5kIG1haW50ZW5hbmNlLgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KLSNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9vcGVuc3NsLWNvbXBhdC5oIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaWZkZWYgSEFWRV9QQVRIU19ICi0jIGluY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgInJzYS5oIgotI2luY2x1ZGUgImF1dGhmaWxlLmgiCi0jaW5jbHVkZSAidXVlbmNvZGUuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJwYXRobmFtZXMuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAibWF0Y2guaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotI2luY2x1ZGUgImRucy5oIgotI2luY2x1ZGUgInNzaDIuaCIKLSNpbmNsdWRlICJzc2gtcGtjczExLmgiCi0KLS8qIE51bWJlciBvZiBiaXRzIGluIHRoZSBSU0EvRFNBIGtleS4gIFRoaXMgdmFsdWUgY2FuIGJlIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLiAqLwotI2RlZmluZSBERUZBVUxUX0JJVFMJCTIwNDgKLSNkZWZpbmUgREVGQVVMVF9CSVRTX0RTQQkxMDI0Ci0jZGVmaW5lIERFRkFVTFRfQklUU19FQ0RTQQkyNTYKLXVfaW50MzJfdCBiaXRzID0gMDsKLQotLyoKLSAqIEZsYWcgaW5kaWNhdGluZyB0aGF0IHdlIGp1c3Qgd2FudCB0byBjaGFuZ2UgdGhlIHBhc3NwaHJhc2UuICBUaGlzIGNhbiBiZQotICogc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gKi8KLWludCBjaGFuZ2VfcGFzc3BocmFzZSA9IDA7Ci0KLS8qCi0gKiBGbGFnIGluZGljYXRpbmcgdGhhdCB3ZSBqdXN0IHdhbnQgdG8gY2hhbmdlIHRoZSBjb21tZW50LiAgVGhpcyBjYW4gYmUgc2V0Ci0gKiBvbiB0aGUgY29tbWFuZCBsaW5lLgotICovCi1pbnQgY2hhbmdlX2NvbW1lbnQgPSAwOwotCi1pbnQgcXVpZXQgPSAwOwotCi1pbnQgbG9nX2xldmVsID0gU1lTTE9HX0xFVkVMX0lORk87Ci0KLS8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHdlIHdhbnQgdG8gaGFzaCBhIGtub3duX2hvc3RzIGZpbGUgKi8KLWludCBoYXNoX2hvc3RzID0gMDsKLS8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHdlIHdhbnQgbG9va3VwIGEgaG9zdCBpbiBrbm93bl9ob3N0cyBmaWxlICovCi1pbnQgZmluZF9ob3N0ID0gMDsKLS8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHdlIHdhbnQgdG8gZGVsZXRlIGEgaG9zdCBmcm9tIGEga25vd25faG9zdHMgZmlsZSAqLwotaW50IGRlbGV0ZV9ob3N0ID0gMDsKLQotLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgd2Ugd2FudCB0byBzaG93IHRoZSBjb250ZW50cyBvZiBhIGNlcnRpZmljYXRlICovCi1pbnQgc2hvd19jZXJ0ID0gMDsKLQotLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgd2UganVzdCB3YW50IHRvIHNlZSB0aGUga2V5IGZpbmdlcnByaW50ICovCi1pbnQgcHJpbnRfZmluZ2VycHJpbnQgPSAwOwotaW50IHByaW50X2J1YmJsZWJhYmJsZSA9IDA7Ci0KLS8qIFRoZSBpZGVudGl0eSBmaWxlIG5hbWUsIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgb3IgZW50ZXJlZCBieSB0aGUgdXNlci4gKi8KLWNoYXIgaWRlbnRpdHlfZmlsZVsxMDI0XTsKLWludCBoYXZlX2lkZW50aXR5ID0gMDsKLQotLyogVGhpcyBpcyBzZXQgdG8gdGhlIHBhc3NwaHJhc2UgaWYgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gKi8KLWNoYXIgKmlkZW50aXR5X3Bhc3NwaHJhc2UgPSBOVUxMOwotCi0vKiBUaGlzIGlzIHNldCB0byB0aGUgbmV3IHBhc3NwaHJhc2UgaWYgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gKi8KLWNoYXIgKmlkZW50aXR5X25ld19wYXNzcGhyYXNlID0gTlVMTDsKLQotLyogVGhpcyBpcyBzZXQgdG8gdGhlIG5ldyBjb21tZW50IGlmIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICovCi1jaGFyICppZGVudGl0eV9jb21tZW50ID0gTlVMTDsKLQotLyogUGF0aCB0byBDQSBrZXkgd2hlbiBjZXJ0aWZ5aW5nIGtleXMuICovCi1jaGFyICpjYV9rZXlfcGF0aCA9IE5VTEw7Ci0KLS8qIENlcnRpZmljYXRlIHNlcmlhbCBudW1iZXIgKi8KLWxvbmcgbG9uZyBjZXJ0X3NlcmlhbCA9IDA7Ci0KLS8qIEtleSB0eXBlIHdoZW4gY2VydGlmeWluZyAqLwotdV9pbnQgY2VydF9rZXlfdHlwZSA9IFNTSDJfQ0VSVF9UWVBFX1VTRVI7Ci0KLS8qICJrZXkgSUQiIG9mIHNpZ25lZCBrZXkgKi8KLWNoYXIgKmNlcnRfa2V5X2lkID0gTlVMTDsKLQotLyogQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJpbmNpcGFsIG5hbWVzIGZvciBjZXJ0aWZ5aW5nIGtleXMgKi8KLWNoYXIgKmNlcnRfcHJpbmNpcGFscyA9IE5VTEw7Ci0KLS8qIFZhbGlkaXR5IHBlcmlvZCBmb3IgY2VydGlmaWNhdGVzICovCi11X2ludDY0X3QgY2VydF92YWxpZF9mcm9tID0gMDsKLXVfaW50NjRfdCBjZXJ0X3ZhbGlkX3RvID0gfjBVTEw7Ci0KLS8qIENlcnRpZmljYXRlIG9wdGlvbnMgKi8KLSNkZWZpbmUgQ0VSVE9QVF9YX0ZXRAkoMSkKLSNkZWZpbmUgQ0VSVE9QVF9BR0VOVF9GV0QJKDE8PDEpCi0jZGVmaW5lIENFUlRPUFRfUE9SVF9GV0QJKDE8PDIpCi0jZGVmaW5lIENFUlRPUFRfUFRZCQkoMTw8MykKLSNkZWZpbmUgQ0VSVE9QVF9VU0VSX1JDCSgxPDw0KQotI2RlZmluZSBDRVJUT1BUX0RFRkFVTFQJKENFUlRPUFRfWF9GV0R8Q0VSVE9QVF9BR0VOVF9GV0R8IFwKLQkJCSBDRVJUT1BUX1BPUlRfRldEfENFUlRPUFRfUFRZfENFUlRPUFRfVVNFUl9SQykKLXVfaW50MzJfdCBjZXJ0ZmxhZ3NfZmxhZ3MgPSBDRVJUT1BUX0RFRkFVTFQ7Ci1jaGFyICpjZXJ0ZmxhZ3NfY29tbWFuZCA9IE5VTEw7Ci1jaGFyICpjZXJ0ZmxhZ3Nfc3JjX2FkZHIgPSBOVUxMOwotCi0vKiBDb252ZXJzaW9uIHRvL2Zyb20gdmFyaW91cyBmb3JtYXRzICovCi1pbnQgY29udmVydF90byA9IDA7Ci1pbnQgY29udmVydF9mcm9tID0gMDsKLWVudW0gewotCUZNVF9SRkM0NzE2LAotCUZNVF9QS0NTOCwKLQlGTVRfUEVNCi19IGNvbnZlcnRfZm9ybWF0ID0gRk1UX1JGQzQ3MTY7Ci1pbnQgcHJpbnRfcHVibGljID0gMDsKLWludCBwcmludF9nZW5lcmljID0gMDsKLQotY2hhciAqa2V5X3R5cGVfbmFtZSA9IE5VTEw7Ci0KLS8qIExvYWQga2V5IGZyb20gdGhpcyBQS0NTIzExIHByb3ZpZGVyICovCi1jaGFyICpwa2NzMTFwcm92aWRlciA9IE5VTEw7Ci0KLS8qIGFyZ3YwICovCi1leHRlcm4gY2hhciAqX19wcm9nbmFtZTsKLQotY2hhciBob3N0bmFtZVtNQVhIT1NUTkFNRUxFTl07Ci0KLS8qIG1vZHVsaS5jICovCi1pbnQgZ2VuX2NhbmRpZGF0ZXMoRklMRSAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwgQklHTlVNICopOwotaW50IHByaW1lX3Rlc3QoRklMRSAqLCBGSUxFICosIHVfaW50MzJfdCwgdV9pbnQzMl90KTsKLQotc3RhdGljIHZvaWQKLXR5cGVfYml0c192YWxpZChpbnQgdHlwZSwgdV9pbnQzMl90ICpiaXRzcCkKLXsKLQl1X2ludCBtYXhiaXRzOwotCi0JaWYgKHR5cGUgPT0gS0VZX1VOU1BFQykgewotCQlmcHJpbnRmKHN0ZGVyciwgInVua25vd24ga2V5IHR5cGUgJXNcbiIsIGtleV90eXBlX25hbWUpOwotCQlleGl0KDEpOwotCX0KLQlpZiAoKmJpdHNwID09IDApIHsKLQkJaWYgKHR5cGUgPT0gS0VZX0RTQSkKLQkJCSpiaXRzcCA9IERFRkFVTFRfQklUU19EU0E7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gS0VZX0VDRFNBKQotCQkJKmJpdHNwID0gREVGQVVMVF9CSVRTX0VDRFNBOwotCQllbHNlCi0JCQkqYml0c3AgPSBERUZBVUxUX0JJVFM7Ci0JfQotCW1heGJpdHMgPSAodHlwZSA9PSBLRVlfRFNBKSA/Ci0JICAgIE9QRU5TU0xfRFNBX01BWF9NT0RVTFVTX0JJVFMgOiBPUEVOU1NMX1JTQV9NQVhfTU9EVUxVU19CSVRTOwotCWlmICgqYml0c3AgPiBtYXhiaXRzKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAia2V5IGJpdHMgZXhjZWVkcyBtYXhpbXVtICVkXG4iLCBtYXhiaXRzKTsKLQkJZXhpdCgxKTsKLQl9Ci0JaWYgKHR5cGUgPT0gS0VZX0RTQSAmJiAqYml0c3AgIT0gMTAyNCkKLQkJZmF0YWwoIkRTQSBrZXlzIG11c3QgYmUgMTAyNCBiaXRzIik7Ci0JZWxzZSBpZiAodHlwZSAhPSBLRVlfRUNEU0EgJiYgKmJpdHNwIDwgNzY4KQotCQlmYXRhbCgiS2V5IG11c3QgYXQgbGVhc3QgYmUgNzY4IGJpdHMiKTsKLQllbHNlIGlmICh0eXBlID09IEtFWV9FQ0RTQSAmJiBrZXlfZWNkc2FfYml0c190b19uaWQoKmJpdHNwKSA9PSAtMSkKLQkJZmF0YWwoIkludmFsaWQgRUNEU0Ega2V5IGxlbmd0aCAtIHZhbGlkIGxlbmd0aHMgYXJlICIKLQkJICAgICIyNTYsIDM4NCBvciA1MjEgYml0cyIpOwotfQotCi1zdGF0aWMgdm9pZAotYXNrX2ZpbGVuYW1lKHN0cnVjdCBwYXNzd2QgKnB3LCBjb25zdCBjaGFyICpwcm9tcHQpCi17Ci0JY2hhciBidWZbMTAyNF07Ci0JY2hhciAqbmFtZSA9IE5VTEw7Ci0KLQlpZiAoa2V5X3R5cGVfbmFtZSA9PSBOVUxMKQotCQluYW1lID0gX1BBVEhfU1NIX0NMSUVOVF9JRF9SU0E7Ci0JZWxzZSB7Ci0JCXN3aXRjaCAoa2V5X3R5cGVfZnJvbV9uYW1lKGtleV90eXBlX25hbWUpKSB7Ci0JCWNhc2UgS0VZX1JTQTE6Ci0JCQluYW1lID0gX1BBVEhfU1NIX0NMSUVOVF9JREVOVElUWTsKLQkJCWJyZWFrOwotCQljYXNlIEtFWV9EU0FfQ0VSVDoKLQkJY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgotCQljYXNlIEtFWV9EU0E6Ci0JCQluYW1lID0gX1BBVEhfU1NIX0NMSUVOVF9JRF9EU0E7Ci0JCQlicmVhazsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQkJY2FzZSBLRVlfRUNEU0FfQ0VSVDoKLQkJY2FzZSBLRVlfRUNEU0E6Ci0JCQluYW1lID0gX1BBVEhfU1NIX0NMSUVOVF9JRF9FQ0RTQTsKLQkJCWJyZWFrOwotI2VuZGlmCi0JCWNhc2UgS0VZX1JTQV9DRVJUOgotCQljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6Ci0JCWNhc2UgS0VZX1JTQToKLQkJCW5hbWUgPSBfUEFUSF9TU0hfQ0xJRU5UX0lEX1JTQTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsICJiYWQga2V5IHR5cGVcbiIpOwotCQkJZXhpdCgxKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXNucHJpbnRmKGlkZW50aXR5X2ZpbGUsIHNpemVvZihpZGVudGl0eV9maWxlKSwgIiVzLyVzIiwgcHctPnB3X2RpciwgbmFtZSk7Ci0JZnByaW50ZihzdGRlcnIsICIlcyAoJXMpOiAiLCBwcm9tcHQsIGlkZW50aXR5X2ZpbGUpOwotCWlmIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBzdGRpbikgPT0gTlVMTCkKLQkJZXhpdCgxKTsKLQlidWZbc3RyY3NwbihidWYsICJcbiIpXSA9ICdcMCc7Ci0JaWYgKHN0cmNtcChidWYsICIiKSAhPSAwKQotCQlzdHJsY3B5KGlkZW50aXR5X2ZpbGUsIGJ1Ziwgc2l6ZW9mKGlkZW50aXR5X2ZpbGUpKTsKLQloYXZlX2lkZW50aXR5ID0gMTsKLX0KLQotc3RhdGljIEtleSAqCi1sb2FkX2lkZW50aXR5KGNoYXIgKmZpbGVuYW1lKQotewotCWNoYXIgKnBhc3M7Ci0JS2V5ICpwcnY7Ci0KLQlwcnYgPSBrZXlfbG9hZF9wcml2YXRlKGZpbGVuYW1lLCAiIiwgTlVMTCk7Ci0JaWYgKHBydiA9PSBOVUxMKSB7Ci0JCWlmIChpZGVudGl0eV9wYXNzcGhyYXNlKQotCQkJcGFzcyA9IHhzdHJkdXAoaWRlbnRpdHlfcGFzc3BocmFzZSk7Ci0JCWVsc2UKLQkJCXBhc3MgPSByZWFkX3Bhc3NwaHJhc2UoIkVudGVyIHBhc3NwaHJhc2U6ICIsCi0JCQkgICAgUlBfQUxMT1dfU1RESU4pOwotCQlwcnYgPSBrZXlfbG9hZF9wcml2YXRlKGZpbGVuYW1lLCBwYXNzLCBOVUxMKTsKLQkJbWVtc2V0KHBhc3MsIDAsIHN0cmxlbihwYXNzKSk7Ci0JCXhmcmVlKHBhc3MpOwotCX0KLQlyZXR1cm4gcHJ2OwotfQotCi0jZGVmaW5lIFNTSF9DT01fUFVCTElDX0JFR0lOCQkiLS0tLSBCRUdJTiBTU0gyIFBVQkxJQyBLRVkgLS0tLSIKLSNkZWZpbmUgU1NIX0NPTV9QVUJMSUNfRU5ECQkiLS0tLSBFTkQgU1NIMiBQVUJMSUMgS0VZIC0tLS0iCi0jZGVmaW5lIFNTSF9DT01fUFJJVkFURV9CRUdJTgkJIi0tLS0gQkVHSU4gU1NIMiBFTkNSWVBURUQgUFJJVkFURSBLRVkgLS0tLSIKLSNkZWZpbmUJU1NIX0NPTV9QUklWQVRFX0tFWV9NQUdJQwkweDNmNmZmOWViCi0KLXN0YXRpYyB2b2lkCi1kb19jb252ZXJ0X3RvX3NzaDIoc3RydWN0IHBhc3N3ZCAqcHcsIEtleSAqaykKLXsKLQl1X2ludCBsZW47Ci0JdV9jaGFyICpibG9iOwotCWNoYXIgY29tbWVudFs2MV07Ci0KLQlpZiAoa2V5X3RvX2Jsb2IoaywgJmJsb2IsICZsZW4pIDw9IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJrZXlfdG9fYmxvYiBmYWlsZWRcbiIpOwotCQlleGl0KDEpOwotCX0KLQkvKiBDb21tZW50ICsgc3Vycm91bmRzIG11c3QgZml0IGludG8gNzIgY2hhcnMgKFJGQyA0NzE2IHNlYyAzLjMpICovCi0Jc25wcmludGYoY29tbWVudCwgc2l6ZW9mKGNvbW1lbnQpLAotCSAgICAiJXUtYml0ICVzLCBjb252ZXJ0ZWQgYnkgJXNAJXMgZnJvbSBPcGVuU1NIIiwKLQkgICAga2V5X3NpemUoayksIGtleV90eXBlKGspLAotCSAgICBwdy0+cHdfbmFtZSwgaG9zdG5hbWUpOwotCi0JZnByaW50ZihzdGRvdXQsICIlc1xuIiwgU1NIX0NPTV9QVUJMSUNfQkVHSU4pOwotCWZwcmludGYoc3Rkb3V0LCAiQ29tbWVudDogXCIlc1wiXG4iLCBjb21tZW50KTsKLQlkdW1wX2Jhc2U2NChzdGRvdXQsIGJsb2IsIGxlbik7Ci0JZnByaW50ZihzdGRvdXQsICIlc1xuIiwgU1NIX0NPTV9QVUJMSUNfRU5EKTsKLQlrZXlfZnJlZShrKTsKLQl4ZnJlZShibG9iKTsKLQlleGl0KDApOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY29udmVydF90b19wa2NzOChLZXkgKmspCi17Ci0Jc3dpdGNoIChrZXlfdHlwZV9wbGFpbihrLT50eXBlKSkgewotCWNhc2UgS0VZX1JTQToKLQkJaWYgKCFQRU1fd3JpdGVfUlNBX1BVQktFWShzdGRvdXQsIGstPnJzYSkpCi0JCQlmYXRhbCgiUEVNX3dyaXRlX1JTQV9QVUJLRVkgZmFpbGVkIik7Ci0JCWJyZWFrOwotCWNhc2UgS0VZX0RTQToKLQkJaWYgKCFQRU1fd3JpdGVfRFNBX1BVQktFWShzdGRvdXQsIGstPmRzYSkpCi0JCQlmYXRhbCgiUEVNX3dyaXRlX0RTQV9QVUJLRVkgZmFpbGVkIik7Ci0JCWJyZWFrOwotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCWNhc2UgS0VZX0VDRFNBOgotCQlpZiAoIVBFTV93cml0ZV9FQ19QVUJLRVkoc3Rkb3V0LCBrLT5lY2RzYSkpCi0JCQlmYXRhbCgiUEVNX3dyaXRlX0VDX1BVQktFWSBmYWlsZWQiKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQlmYXRhbCgiJXM6IHVuc3VwcG9ydGVkIGtleSB0eXBlICVzIiwgX19mdW5jX18sIGtleV90eXBlKGspKTsKLQl9Ci0JZXhpdCgwKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NvbnZlcnRfdG9fcGVtKEtleSAqaykKLXsKLQlzd2l0Y2ggKGtleV90eXBlX3BsYWluKGstPnR5cGUpKSB7Ci0JY2FzZSBLRVlfUlNBOgotCQlpZiAoIVBFTV93cml0ZV9SU0FQdWJsaWNLZXkoc3Rkb3V0LCBrLT5yc2EpKQotCQkJZmF0YWwoIlBFTV93cml0ZV9SU0FQdWJsaWNLZXkgZmFpbGVkIik7Ci0JCWJyZWFrOwotI2lmIG5vdHlldCAvKiBPcGVuU1NIIDAuOS44IGxhY2tzIHRoaXMgZnVuY3Rpb24gKi8KLQljYXNlIEtFWV9EU0E6Ci0JCWlmICghUEVNX3dyaXRlX0RTQVB1YmxpY0tleShzdGRvdXQsIGstPmRzYSkpCi0JCQlmYXRhbCgiUEVNX3dyaXRlX0RTQVB1YmxpY0tleSBmYWlsZWQiKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQkvKiBYWFggRUNEU0E/ICovCi0JZGVmYXVsdDoKLQkJZmF0YWwoIiVzOiB1bnN1cHBvcnRlZCBrZXkgdHlwZSAlcyIsIF9fZnVuY19fLCBrZXlfdHlwZShrKSk7Ci0JfQotCWV4aXQoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19jb252ZXJ0X3RvKHN0cnVjdCBwYXNzd2QgKnB3KQotewotCUtleSAqazsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQotCWlmICghaGF2ZV9pZGVudGl0eSkKLQkJYXNrX2ZpbGVuYW1lKHB3LCAiRW50ZXIgZmlsZSBpbiB3aGljaCB0aGUga2V5IGlzIik7Ci0JaWYgKHN0YXQoaWRlbnRpdHlfZmlsZSwgJnN0KSA8IDApCi0JCWZhdGFsKCIlczogJXM6ICVzIiwgX19wcm9nbmFtZSwgaWRlbnRpdHlfZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoKGsgPSBrZXlfbG9hZF9wdWJsaWMoaWRlbnRpdHlfZmlsZSwgTlVMTCkpID09IE5VTEwpIHsKLQkJaWYgKChrID0gbG9hZF9pZGVudGl0eShpZGVudGl0eV9maWxlKSkgPT0gTlVMTCkgewotCQkJZnByaW50ZihzdGRlcnIsICJsb2FkIGZhaWxlZFxuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JfQotCWlmIChrLT50eXBlID09IEtFWV9SU0ExKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAidmVyc2lvbiAxIGtleXMgYXJlIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlleGl0KDEpOwotCX0KLQotCXN3aXRjaCAoY29udmVydF9mb3JtYXQpIHsKLQljYXNlIEZNVF9SRkM0NzE2OgotCQlkb19jb252ZXJ0X3RvX3NzaDIocHcsIGspOwotCQlicmVhazsKLQljYXNlIEZNVF9QS0NTODoKLQkJZG9fY29udmVydF90b19wa2NzOChrKTsKLQkJYnJlYWs7Ci0JY2FzZSBGTVRfUEVNOgotCQlkb19jb252ZXJ0X3RvX3BlbShrKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmF0YWwoIiVzOiB1bmtub3duIGtleSBmb3JtYXQgJWQiLCBfX2Z1bmNfXywgY29udmVydF9mb3JtYXQpOwotCX0KLQlleGl0KDApOwotfQotCi1zdGF0aWMgdm9pZAotYnVmZmVyX2dldF9iaWdudW1fYml0cyhCdWZmZXIgKmIsIEJJR05VTSAqdmFsdWUpCi17Ci0JdV9pbnQgYmlnbnVtX2JpdHMgPSBidWZmZXJfZ2V0X2ludChiKTsKLQl1X2ludCBieXRlcyA9IChiaWdudW1fYml0cyArIDcpIC8gODsKLQotCWlmIChidWZmZXJfbGVuKGIpIDwgYnl0ZXMpCi0JCWZhdGFsKCJidWZmZXJfZ2V0X2JpZ251bV9iaXRzOiBpbnB1dCBidWZmZXIgdG9vIHNtYWxsOiAiCi0JCSAgICAibmVlZCAlZCBoYXZlICVkIiwgYnl0ZXMsIGJ1ZmZlcl9sZW4oYikpOwotCWlmIChCTl9iaW4yYm4oYnVmZmVyX3B0cihiKSwgYnl0ZXMsIHZhbHVlKSA9PSBOVUxMKQotCQlmYXRhbCgiYnVmZmVyX2dldF9iaWdudW1fYml0czogQk5fYmluMmJuIGZhaWxlZCIpOwotCWJ1ZmZlcl9jb25zdW1lKGIsIGJ5dGVzKTsKLX0KLQotc3RhdGljIEtleSAqCi1kb19jb252ZXJ0X3ByaXZhdGVfc3NoMl9mcm9tX2Jsb2IodV9jaGFyICpibG9iLCB1X2ludCBibGVuKQotewotCUJ1ZmZlciBiOwotCUtleSAqa2V5ID0gTlVMTDsKLQljaGFyICp0eXBlLCAqY2lwaGVyOwotCXVfY2hhciAqc2lnLCBkYXRhW10gPSAiYWJjZGUxMjM0NSI7Ci0JaW50IG1hZ2ljLCBybGVuLCBrdHlwZSwgaTEsIGkyLCBpMywgaTQ7Ci0JdV9pbnQgc2xlbjsKLQl1X2xvbmcgZTsKLQotCWJ1ZmZlcl9pbml0KCZiKTsKLQlidWZmZXJfYXBwZW5kKCZiLCBibG9iLCBibGVuKTsKLQotCW1hZ2ljID0gYnVmZmVyX2dldF9pbnQoJmIpOwotCWlmIChtYWdpYyAhPSBTU0hfQ09NX1BSSVZBVEVfS0VZX01BR0lDKSB7Ci0JCWVycm9yKCJiYWQgbWFnaWMgMHgleCAhPSAweCV4IiwgbWFnaWMsIFNTSF9DT01fUFJJVkFURV9LRVlfTUFHSUMpOwotCQlidWZmZXJfZnJlZSgmYik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpMSA9IGJ1ZmZlcl9nZXRfaW50KCZiKTsKLQl0eXBlICAgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgTlVMTCk7Ci0JY2lwaGVyID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsIE5VTEwpOwotCWkyID0gYnVmZmVyX2dldF9pbnQoJmIpOwotCWkzID0gYnVmZmVyX2dldF9pbnQoJmIpOwotCWk0ID0gYnVmZmVyX2dldF9pbnQoJmIpOwotCWRlYnVnKCJpZ25vcmUgKCVkICVkICVkICVkKSIsIGkxLCBpMiwgaTMsIGk0KTsKLQlpZiAoc3RyY21wKGNpcGhlciwgIm5vbmUiKSAhPSAwKSB7Ci0JCWVycm9yKCJ1bnN1cHBvcnRlZCBjaXBoZXIgJXMiLCBjaXBoZXIpOwotCQl4ZnJlZShjaXBoZXIpOwotCQlidWZmZXJfZnJlZSgmYik7Ci0JCXhmcmVlKHR5cGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JeGZyZWUoY2lwaGVyKTsKLQotCWlmIChzdHJzdHIodHlwZSwgImRzYSIpKSB7Ci0JCWt0eXBlID0gS0VZX0RTQTsKLQl9IGVsc2UgaWYgKHN0cnN0cih0eXBlLCAicnNhIikpIHsKLQkJa3R5cGUgPSBLRVlfUlNBOwotCX0gZWxzZSB7Ci0JCWJ1ZmZlcl9mcmVlKCZiKTsKLQkJeGZyZWUodHlwZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlrZXkgPSBrZXlfbmV3X3ByaXZhdGUoa3R5cGUpOwotCXhmcmVlKHR5cGUpOwotCi0Jc3dpdGNoIChrZXktPnR5cGUpIHsKLQljYXNlIEtFWV9EU0E6Ci0JCWJ1ZmZlcl9nZXRfYmlnbnVtX2JpdHMoJmIsIGtleS0+ZHNhLT5wKTsKLQkJYnVmZmVyX2dldF9iaWdudW1fYml0cygmYiwga2V5LT5kc2EtPmcpOwotCQlidWZmZXJfZ2V0X2JpZ251bV9iaXRzKCZiLCBrZXktPmRzYS0+cSk7Ci0JCWJ1ZmZlcl9nZXRfYmlnbnVtX2JpdHMoJmIsIGtleS0+ZHNhLT5wdWJfa2V5KTsKLQkJYnVmZmVyX2dldF9iaWdudW1fYml0cygmYiwga2V5LT5kc2EtPnByaXZfa2V5KTsKLQkJYnJlYWs7Ci0JY2FzZSBLRVlfUlNBOgotCQllID0gYnVmZmVyX2dldF9jaGFyKCZiKTsKLQkJZGVidWcoImUgJWx4IiwgZSk7Ci0JCWlmIChlIDwgMzApIHsKLQkJCWUgPDw9IDg7Ci0JCQllICs9IGJ1ZmZlcl9nZXRfY2hhcigmYik7Ci0JCQlkZWJ1ZygiZSAlbHgiLCBlKTsKLQkJCWUgPDw9IDg7Ci0JCQllICs9IGJ1ZmZlcl9nZXRfY2hhcigmYik7Ci0JCQlkZWJ1ZygiZSAlbHgiLCBlKTsKLQkJfQotCQlpZiAoIUJOX3NldF93b3JkKGtleS0+cnNhLT5lLCBlKSkgewotCQkJYnVmZmVyX2ZyZWUoJmIpOwotCQkJa2V5X2ZyZWUoa2V5KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWJ1ZmZlcl9nZXRfYmlnbnVtX2JpdHMoJmIsIGtleS0+cnNhLT5kKTsKLQkJYnVmZmVyX2dldF9iaWdudW1fYml0cygmYiwga2V5LT5yc2EtPm4pOwotCQlidWZmZXJfZ2V0X2JpZ251bV9iaXRzKCZiLCBrZXktPnJzYS0+aXFtcCk7Ci0JCWJ1ZmZlcl9nZXRfYmlnbnVtX2JpdHMoJmIsIGtleS0+cnNhLT5xKTsKLQkJYnVmZmVyX2dldF9iaWdudW1fYml0cygmYiwga2V5LT5yc2EtPnApOwotCQlyc2FfZ2VuZXJhdGVfYWRkaXRpb25hbF9wYXJhbWV0ZXJzKGtleS0+cnNhKTsKLQkJYnJlYWs7Ci0JfQotCXJsZW4gPSBidWZmZXJfbGVuKCZiKTsKLQlpZiAocmxlbiAhPSAwKQotCQllcnJvcigiZG9fY29udmVydF9wcml2YXRlX3NzaDJfZnJvbV9ibG9iOiAiCi0JCSAgICAicmVtYWluaW5nIGJ5dGVzIGluIGtleSBibG9iICVkIiwgcmxlbik7Ci0JYnVmZmVyX2ZyZWUoJmIpOwotCi0JLyogdHJ5IHRoZSBrZXkgKi8KLQlrZXlfc2lnbihrZXksICZzaWcsICZzbGVuLCBkYXRhLCBzaXplb2YoZGF0YSkpOwotCWtleV92ZXJpZnkoa2V5LCBzaWcsIHNsZW4sIGRhdGEsIHNpemVvZihkYXRhKSk7Ci0JeGZyZWUoc2lnKTsKLQlyZXR1cm4ga2V5OwotfQotCi1zdGF0aWMgaW50Ci1nZXRfbGluZShGSUxFICpmcCwgY2hhciAqbGluZSwgc2l6ZV90IGxlbikKLXsKLQlpbnQgYzsKLQlzaXplX3QgcG9zID0gMDsKLQotCWxpbmVbMF0gPSAnXDAnOwotCXdoaWxlICgoYyA9IGZnZXRjKGZwKSkgIT0gRU9GKSB7Ci0JCWlmIChwb3MgPj0gbGVuIC0gMSkgewotCQkJZnByaW50ZihzdGRlcnIsICJpbnB1dCBsaW5lIHRvbyBsb25nLlxuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCXN3aXRjaCAoYykgewotCQljYXNlICdccic6Ci0JCQljID0gZmdldGMoZnApOwotCQkJaWYgKGMgIT0gRU9GICYmIGMgIT0gJ1xuJyAmJiB1bmdldGMoYywgZnApID09IEVPRikgewotCQkJCWZwcmludGYoc3RkZXJyLCAidW5nZXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcG9zOwotCQljYXNlICdcbic6Ci0JCQlyZXR1cm4gcG9zOwotCQl9Ci0JCWxpbmVbcG9zKytdID0gYzsKLQkJbGluZVtwb3NdID0gJ1wwJzsKLQl9Ci0JLyogV2UgcmVhY2hlZCBFT0YgKi8KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19jb252ZXJ0X2Zyb21fc3NoMihzdHJ1Y3QgcGFzc3dkICpwdywgS2V5ICoqaywgaW50ICpwcml2YXRlKQotewotCWludCBibGVuOwotCXVfaW50IGxlbjsKLQljaGFyIGxpbmVbMTAyNF07Ci0JdV9jaGFyIGJsb2JbODA5Nl07Ci0JY2hhciBlbmNvZGVkWzgwOTZdOwotCWludCBlc2NhcGVkID0gMDsKLQlGSUxFICpmcDsKLQotCWlmICgoZnAgPSBmb3BlbihpZGVudGl0eV9maWxlLCAiciIpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6ICVzOiAlcyIsIF9fcHJvZ25hbWUsIGlkZW50aXR5X2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7Ci0JZW5jb2RlZFswXSA9ICdcMCc7Ci0Jd2hpbGUgKChibGVuID0gZ2V0X2xpbmUoZnAsIGxpbmUsIHNpemVvZihsaW5lKSkpICE9IC0xKSB7Ci0JCWlmIChsaW5lW2JsZW4gLSAxXSA9PSAnXFwnKQotCQkJZXNjYXBlZCsrOwotCQlpZiAoc3RybmNtcChsaW5lLCAiLS0tLSIsIDQpID09IDAgfHwKLQkJICAgIHN0cnN0cihsaW5lLCAiOiAiKSAhPSBOVUxMKSB7Ci0JCQlpZiAoc3Ryc3RyKGxpbmUsIFNTSF9DT01fUFJJVkFURV9CRUdJTikgIT0gTlVMTCkKLQkJCQkqcHJpdmF0ZSA9IDE7Ci0JCQlpZiAoc3Ryc3RyKGxpbmUsICIgRU5EICIpICE9IE5VTEwpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIGZwcmludGYoc3RkZXJyLCAiaWdub3JlOiAlcyIsIGxpbmUpOyAqLwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGVzY2FwZWQpIHsKLQkJCWVzY2FwZWQtLTsKLQkJCS8qIGZwcmludGYoc3RkZXJyLCAiZXNjYXBlZDogJXMiLCBsaW5lKTsgKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXN0cmxjYXQoZW5jb2RlZCwgbGluZSwgc2l6ZW9mKGVuY29kZWQpKTsKLQl9Ci0JbGVuID0gc3RybGVuKGVuY29kZWQpOwotCWlmICgoKGxlbiAlIDQpID09IDMpICYmCi0JICAgIChlbmNvZGVkW2xlbi0xXSA9PSAnPScpICYmCi0JICAgIChlbmNvZGVkW2xlbi0yXSA9PSAnPScpICYmCi0JICAgIChlbmNvZGVkW2xlbi0zXSA9PSAnPScpKQotCQllbmNvZGVkW2xlbi0zXSA9ICdcMCc7Ci0JYmxlbiA9IHV1ZGVjb2RlKGVuY29kZWQsIGJsb2IsIHNpemVvZihibG9iKSk7Ci0JaWYgKGJsZW4gPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAidXVkZWNvZGUgZmFpbGVkLlxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCSprID0gKnByaXZhdGUgPwotCSAgICBkb19jb252ZXJ0X3ByaXZhdGVfc3NoMl9mcm9tX2Jsb2IoYmxvYiwgYmxlbikgOgotCSAgICBrZXlfZnJvbV9ibG9iKGJsb2IsIGJsZW4pOwotCWlmICgqayA9PSBOVUxMKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZGVjb2RlIGJsb2IgZmFpbGVkLlxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCWZjbG9zZShmcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19jb252ZXJ0X2Zyb21fcGtjczgoS2V5ICoqaywgaW50ICpwcml2YXRlKQotewotCUVWUF9QS0VZICpwdWJrZXk7Ci0JRklMRSAqZnA7Ci0KLQlpZiAoKGZwID0gZm9wZW4oaWRlbnRpdHlfZmlsZSwgInIiKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiAlczogJXMiLCBfX3Byb2duYW1lLCBpZGVudGl0eV9maWxlLCBzdHJlcnJvcihlcnJubykpOwotCWlmICgocHVia2V5ID0gUEVNX3JlYWRfUFVCS0VZKGZwLCBOVUxMLCBOVUxMLCBOVUxMKSkgPT0gTlVMTCkgewotCQlmYXRhbCgiJXM6ICVzIGlzIG5vdCBhIHJlY29nbmlzZWQgcHVibGljIGtleSBmb3JtYXQiLCBfX2Z1bmNfXywKLQkJICAgIGlkZW50aXR5X2ZpbGUpOwotCX0KLQlmY2xvc2UoZnApOwotCXN3aXRjaCAoRVZQX1BLRVlfdHlwZShwdWJrZXktPnR5cGUpKSB7Ci0JY2FzZSBFVlBfUEtFWV9SU0E6Ci0JCSprID0ga2V5X25ldyhLRVlfVU5TUEVDKTsKLQkJKCprKS0+dHlwZSA9IEtFWV9SU0E7Ci0JCSgqayktPnJzYSA9IEVWUF9QS0VZX2dldDFfUlNBKHB1YmtleSk7Ci0JCWJyZWFrOwotCWNhc2UgRVZQX1BLRVlfRFNBOgotCQkqayA9IGtleV9uZXcoS0VZX1VOU1BFQyk7Ci0JCSgqayktPnR5cGUgPSBLRVlfRFNBOwotCQkoKmspLT5kc2EgPSBFVlBfUEtFWV9nZXQxX0RTQShwdWJrZXkpOwotCQlicmVhazsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQljYXNlIEVWUF9QS0VZX0VDOgotCQkqayA9IGtleV9uZXcoS0VZX1VOU1BFQyk7Ci0JCSgqayktPnR5cGUgPSBLRVlfRUNEU0E7Ci0JCSgqayktPmVjZHNhID0gRVZQX1BLRVlfZ2V0MV9FQ19LRVkocHVia2V5KTsKLQkJKCprKS0+ZWNkc2FfbmlkID0ga2V5X2VjZHNhX2tleV90b19uaWQoKCprKS0+ZWNkc2EpOwotCQlicmVhazsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCWZhdGFsKCIlczogdW5zdXBwb3J0ZWQgcHVia2V5IHR5cGUgJWQiLCBfX2Z1bmNfXywKLQkJICAgIEVWUF9QS0VZX3R5cGUocHVia2V5LT50eXBlKSk7Ci0JfQotCUVWUF9QS0VZX2ZyZWUocHVia2V5KTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19jb252ZXJ0X2Zyb21fcGVtKEtleSAqKmssIGludCAqcHJpdmF0ZSkKLXsKLQlGSUxFICpmcDsKLQlSU0EgKnJzYTsKLSNpZmRlZiBub3R5ZXQKLQlEU0EgKmRzYTsKLSNlbmRpZgotCi0JaWYgKChmcCA9IGZvcGVuKGlkZW50aXR5X2ZpbGUsICJyIikpID09IE5VTEwpCi0JCWZhdGFsKCIlczogJXM6ICVzIiwgX19wcm9nbmFtZSwgaWRlbnRpdHlfZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoKHJzYSA9IFBFTV9yZWFkX1JTQVB1YmxpY0tleShmcCwgTlVMTCwgTlVMTCwgTlVMTCkpICE9IE5VTEwpIHsKLQkJKmsgPSBrZXlfbmV3KEtFWV9VTlNQRUMpOwotCQkoKmspLT50eXBlID0gS0VZX1JTQTsKLQkJKCprKS0+cnNhID0gcnNhOwotCQlmY2xvc2UoZnApOwotCQlyZXR1cm47Ci0JfQotI2lmIG5vdHlldCAvKiBPcGVuU1NIIDAuOS44IGxhY2tzIHRoaXMgZnVuY3Rpb24gKi8KLQlyZXdpbmQoZnApOwotCWlmICgoZHNhID0gUEVNX3JlYWRfRFNBUHVibGljS2V5KGZwLCBOVUxMLCBOVUxMLCBOVUxMKSkgIT0gTlVMTCkgewotCQkqayA9IGtleV9uZXcoS0VZX1VOU1BFQyk7Ci0JCSgqayktPnR5cGUgPSBLRVlfRFNBOwotCQkoKmspLT5kc2EgPSBkc2E7Ci0JCWZjbG9zZShmcCk7Ci0JCXJldHVybjsKLQl9Ci0JLyogWFhYIEVDRFNBICovCi0jZW5kaWYKLQlmYXRhbCgiJXM6IHVucmVjb2duaXNlZCByYXcgcHJpdmF0ZSBrZXkgZm9ybWF0IiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY29udmVydF9mcm9tKHN0cnVjdCBwYXNzd2QgKnB3KQotewotCUtleSAqayA9IE5VTEw7Ci0JaW50IHByaXZhdGUgPSAwLCBvayA9IDA7Ci0Jc3RydWN0IHN0YXQgc3Q7Ci0KLQlpZiAoIWhhdmVfaWRlbnRpdHkpCi0JCWFza19maWxlbmFtZShwdywgIkVudGVyIGZpbGUgaW4gd2hpY2ggdGhlIGtleSBpcyIpOwotCWlmIChzdGF0KGlkZW50aXR5X2ZpbGUsICZzdCkgPCAwKQotCQlmYXRhbCgiJXM6ICVzOiAlcyIsIF9fcHJvZ25hbWUsIGlkZW50aXR5X2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7Ci0KLQlzd2l0Y2ggKGNvbnZlcnRfZm9ybWF0KSB7Ci0JY2FzZSBGTVRfUkZDNDcxNjoKLQkJZG9fY29udmVydF9mcm9tX3NzaDIocHcsICZrLCAmcHJpdmF0ZSk7Ci0JCWJyZWFrOwotCWNhc2UgRk1UX1BLQ1M4OgotCQlkb19jb252ZXJ0X2Zyb21fcGtjczgoJmssICZwcml2YXRlKTsKLQkJYnJlYWs7Ci0JY2FzZSBGTVRfUEVNOgotCQlkb19jb252ZXJ0X2Zyb21fcGVtKCZrLCAmcHJpdmF0ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZhdGFsKCIlczogdW5rbm93biBrZXkgZm9ybWF0ICVkIiwgX19mdW5jX18sIGNvbnZlcnRfZm9ybWF0KTsKLQl9Ci0KLQlpZiAoIXByaXZhdGUpCi0JCW9rID0ga2V5X3dyaXRlKGssIHN0ZG91dCk7Ci0JCWlmIChvaykKLQkJCWZwcmludGYoc3Rkb3V0LCAiXG4iKTsKLQllbHNlIHsKLQkJc3dpdGNoIChrLT50eXBlKSB7Ci0JCWNhc2UgS0VZX0RTQToKLQkJCW9rID0gUEVNX3dyaXRlX0RTQVByaXZhdGVLZXkoc3Rkb3V0LCBrLT5kc2EsIE5VTEwsCi0JCQkgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7Ci0JCQlicmVhazsKLSNpZmRlZiBPUEVOU1NMX0hBU19FQ0MKLQkJY2FzZSBLRVlfRUNEU0E6Ci0JCQlvayA9IFBFTV93cml0ZV9FQ1ByaXZhdGVLZXkoc3Rkb3V0LCBrLT5lY2RzYSwgTlVMTCwKLQkJCSAgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKLQkJCWJyZWFrOwotI2VuZGlmCi0JCWNhc2UgS0VZX1JTQToKLQkJCW9rID0gUEVNX3dyaXRlX1JTQVByaXZhdGVLZXkoc3Rkb3V0LCBrLT5yc2EsIE5VTEwsCi0JCQkgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWZhdGFsKCIlczogdW5zdXBwb3J0ZWQga2V5IHR5cGUgJXMiLCBfX2Z1bmNfXywKLQkJCSAgICBrZXlfdHlwZShrKSk7Ci0JCX0KLQl9Ci0KLQlpZiAoIW9rKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAia2V5IHdyaXRlIGZhaWxlZFxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCWtleV9mcmVlKGspOwotCWV4aXQoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19wcmludF9wdWJsaWMoc3RydWN0IHBhc3N3ZCAqcHcpCi17Ci0JS2V5ICpwcnY7Ci0Jc3RydWN0IHN0YXQgc3Q7Ci0KLQlpZiAoIWhhdmVfaWRlbnRpdHkpCi0JCWFza19maWxlbmFtZShwdywgIkVudGVyIGZpbGUgaW4gd2hpY2ggdGhlIGtleSBpcyIpOwotCWlmIChzdGF0KGlkZW50aXR5X2ZpbGUsICZzdCkgPCAwKSB7Ci0JCXBlcnJvcihpZGVudGl0eV9maWxlKTsKLQkJZXhpdCgxKTsKLQl9Ci0JcHJ2ID0gbG9hZF9pZGVudGl0eShpZGVudGl0eV9maWxlKTsKLQlpZiAocHJ2ID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICJsb2FkIGZhaWxlZFxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCWlmICgha2V5X3dyaXRlKHBydiwgc3Rkb3V0KSkKLQkJZnByaW50ZihzdGRlcnIsICJrZXlfd3JpdGUgZmFpbGVkIik7Ci0Ja2V5X2ZyZWUocHJ2KTsKLQlmcHJpbnRmKHN0ZG91dCwgIlxuIik7Ci0JZXhpdCgwKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2Rvd25sb2FkKHN0cnVjdCBwYXNzd2QgKnB3KQotewotI2lmZGVmIEVOQUJMRV9QS0NTMTEKLQlLZXkgKiprZXlzID0gTlVMTDsKLQlpbnQgaSwgbmtleXM7Ci0KLQlwa2NzMTFfaW5pdCgwKTsKLQlua2V5cyA9IHBrY3MxMV9hZGRfcHJvdmlkZXIocGtjczExcHJvdmlkZXIsIE5VTEwsICZrZXlzKTsKLQlpZiAobmtleXMgPD0gMCkKLQkJZmF0YWwoImNhbm5vdCByZWFkIHB1YmxpYyBrZXkgZnJvbSBwa2NzMTEiKTsKLQlmb3IgKGkgPSAwOyBpIDwgbmtleXM7IGkrKykgewotCQlrZXlfd3JpdGUoa2V5c1tpXSwgc3Rkb3V0KTsKLQkJa2V5X2ZyZWUoa2V5c1tpXSk7Ci0JCWZwcmludGYoc3Rkb3V0LCAiXG4iKTsKLQl9Ci0JeGZyZWUoa2V5cyk7Ci0JcGtjczExX3Rlcm1pbmF0ZSgpOwotCWV4aXQoMCk7Ci0jZWxzZQotCWZhdGFsKCJubyBwa2NzMTEgc3VwcG9ydCIpOwotI2VuZGlmIC8qIEVOQUJMRV9QS0NTMTEgKi8KLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZpbmdlcnByaW50KHN0cnVjdCBwYXNzd2QgKnB3KQotewotCUZJTEUgKmY7Ci0JS2V5ICpwdWJsaWM7Ci0JY2hhciAqY29tbWVudCA9IE5VTEwsICpjcCwgKmVwLCBsaW5lWzE2KjEwMjRdLCAqZnAsICpyYTsKLQlpbnQgaSwgc2tpcCA9IDAsIG51bSA9IDAsIGludmFsaWQgPSAxOwotCWVudW0gZnBfcmVwIHJlcDsKLQllbnVtIGZwX3R5cGUgZnB0eXBlOwotCXN0cnVjdCBzdGF0IHN0OwotCi0JZnB0eXBlID0gcHJpbnRfYnViYmxlYmFiYmxlID8gU1NIX0ZQX1NIQTEgOiBTU0hfRlBfTUQ1OwotCXJlcCA9ICAgIHByaW50X2J1YmJsZWJhYmJsZSA/IFNTSF9GUF9CVUJCTEVCQUJCTEUgOiBTU0hfRlBfSEVYOwotCi0JaWYgKCFoYXZlX2lkZW50aXR5KQotCQlhc2tfZmlsZW5hbWUocHcsICJFbnRlciBmaWxlIGluIHdoaWNoIHRoZSBrZXkgaXMiKTsKLQlpZiAoc3RhdChpZGVudGl0eV9maWxlLCAmc3QpIDwgMCkgewotCQlwZXJyb3IoaWRlbnRpdHlfZmlsZSk7Ci0JCWV4aXQoMSk7Ci0JfQotCXB1YmxpYyA9IGtleV9sb2FkX3B1YmxpYyhpZGVudGl0eV9maWxlLCAmY29tbWVudCk7Ci0JaWYgKHB1YmxpYyAhPSBOVUxMKSB7Ci0JCWZwID0ga2V5X2ZpbmdlcnByaW50KHB1YmxpYywgZnB0eXBlLCByZXApOwotCQlyYSA9IGtleV9maW5nZXJwcmludChwdWJsaWMsIFNTSF9GUF9NRDUsIFNTSF9GUF9SQU5ET01BUlQpOwotCQlwcmludGYoIiV1ICVzICVzICglcylcbiIsIGtleV9zaXplKHB1YmxpYyksIGZwLCBjb21tZW50LAotCQkgICAga2V5X3R5cGUocHVibGljKSk7Ci0JCWlmIChsb2dfbGV2ZWwgPj0gU1lTTE9HX0xFVkVMX1ZFUkJPU0UpCi0JCQlwcmludGYoIiVzXG4iLCByYSk7Ci0JCWtleV9mcmVlKHB1YmxpYyk7Ci0JCXhmcmVlKGNvbW1lbnQpOwotCQl4ZnJlZShyYSk7Ci0JCXhmcmVlKGZwKTsKLQkJZXhpdCgwKTsKLQl9Ci0JaWYgKGNvbW1lbnQpIHsKLQkJeGZyZWUoY29tbWVudCk7Ci0JCWNvbW1lbnQgPSBOVUxMOwotCX0KLQotCWlmICgoZiA9IGZvcGVuKGlkZW50aXR5X2ZpbGUsICJyIikpID09IE5VTEwpCi0JCWZhdGFsKCIlczogJXM6ICVzIiwgX19wcm9nbmFtZSwgaWRlbnRpdHlfZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKLQotCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpKSB7Ci0JCWlmICgoY3AgPSBzdHJjaHIobGluZSwgJ1xuJykpID09IE5VTEwpIHsKLQkJCWVycm9yKCJsaW5lICVkIHRvbyBsb25nOiAlLjQwcy4uLiIsCi0JCQkgICAgbnVtICsgMSwgbGluZSk7Ci0JCQlza2lwID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCW51bSsrOwotCQlpZiAoc2tpcCkgewotCQkJc2tpcCA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQkqY3AgPSAnXDAnOwotCi0JCS8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlLCBlbXB0eSBhbmQgY29tbWVudCBsaW5lcy4gKi8KLQkJZm9yIChjcCA9IGxpbmU7ICpjcCA9PSAnICcgfHwgKmNwID09ICdcdCc7IGNwKyspCi0JCQk7Ci0JCWlmICghKmNwIHx8ICpjcCA9PSAnXG4nIHx8ICpjcCA9PSAnIycpCi0JCQljb250aW51ZTsKLQkJaSA9IHN0cnRvbChjcCwgJmVwLCAxMCk7Ci0JCWlmIChpID09IDAgfHwgZXAgPT0gTlVMTCB8fCAoKmVwICE9ICcgJyAmJiAqZXAgIT0gJ1x0JykpIHsKLQkJCWludCBxdW90ZWQgPSAwOwotCQkJY29tbWVudCA9IGNwOwotCQkJZm9yICg7ICpjcCAmJiAocXVvdGVkIHx8ICgqY3AgIT0gJyAnICYmCi0JCQkgICAgKmNwICE9ICdcdCcpKTsgY3ArKykgewotCQkJCWlmICgqY3AgPT0gJ1xcJyAmJiBjcFsxXSA9PSAnIicpCi0JCQkJCWNwKys7CS8qIFNraXAgYm90aCAqLwotCQkJCWVsc2UgaWYgKCpjcCA9PSAnIicpCi0JCQkJCXF1b3RlZCA9ICFxdW90ZWQ7Ci0JCQl9Ci0JCQlpZiAoISpjcCkKLQkJCQljb250aW51ZTsKLQkJCSpjcCsrID0gJ1wwJzsKLQkJfQotCQllcCA9IGNwOwotCQlwdWJsaWMgPSBrZXlfbmV3KEtFWV9SU0ExKTsKLQkJaWYgKGtleV9yZWFkKHB1YmxpYywgJmNwKSAhPSAxKSB7Ci0JCQljcCA9IGVwOwotCQkJa2V5X2ZyZWUocHVibGljKTsKLQkJCXB1YmxpYyA9IGtleV9uZXcoS0VZX1VOU1BFQyk7Ci0JCQlpZiAoa2V5X3JlYWQocHVibGljLCAmY3ApICE9IDEpIHsKLQkJCQlrZXlfZnJlZShwdWJsaWMpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCWNvbW1lbnQgPSAqY3AgPyBjcCA6IGNvbW1lbnQ7Ci0JCWZwID0ga2V5X2ZpbmdlcnByaW50KHB1YmxpYywgZnB0eXBlLCByZXApOwotCQlyYSA9IGtleV9maW5nZXJwcmludChwdWJsaWMsIFNTSF9GUF9NRDUsIFNTSF9GUF9SQU5ET01BUlQpOwotCQlwcmludGYoIiV1ICVzICVzICglcylcbiIsIGtleV9zaXplKHB1YmxpYyksIGZwLAotCQkgICAgY29tbWVudCA/IGNvbW1lbnQgOiAibm8gY29tbWVudCIsIGtleV90eXBlKHB1YmxpYykpOwotCQlpZiAobG9nX2xldmVsID49IFNZU0xPR19MRVZFTF9WRVJCT1NFKQotCQkJcHJpbnRmKCIlc1xuIiwgcmEpOwotCQl4ZnJlZShyYSk7Ci0JCXhmcmVlKGZwKTsKLQkJa2V5X2ZyZWUocHVibGljKTsKLQkJaW52YWxpZCA9IDA7Ci0JfQotCWZjbG9zZShmKTsKLQotCWlmIChpbnZhbGlkKSB7Ci0JCXByaW50ZigiJXMgaXMgbm90IGEgcHVibGljIGtleSBmaWxlLlxuIiwgaWRlbnRpdHlfZmlsZSk7Ci0JCWV4aXQoMSk7Ci0JfQotCWV4aXQoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19nZW5fYWxsX2hvc3RrZXlzKHN0cnVjdCBwYXNzd2QgKnB3KQotewotCXN0cnVjdCB7Ci0JCWNoYXIgKmtleV90eXBlOwotCQljaGFyICprZXlfdHlwZV9kaXNwbGF5OwotCQljaGFyICpwYXRoOwotCX0ga2V5X3R5cGVzW10gPSB7Ci0JCXsgInJzYTEiLCAiUlNBMSIsIF9QQVRIX0hPU1RfS0VZX0ZJTEUgfSwKLQkJeyAicnNhIiwgIlJTQSIgLF9QQVRIX0hPU1RfUlNBX0tFWV9GSUxFIH0sCi0JCXsgImRzYSIsICJEU0EiLCBfUEFUSF9IT1NUX0RTQV9LRVlfRklMRSB9LAotCQl7ICJlY2RzYSIsICJFQ0RTQSIsX1BBVEhfSE9TVF9FQ0RTQV9LRVlfRklMRSB9LAotCQl7IE5VTEwsIE5VTEwsIE5VTEwgfQotCX07Ci0KLQlpbnQgZmlyc3QgPSAwOwotCXN0cnVjdCBzdGF0IHN0OwotCUtleSAqcHJpdmF0ZSwgKnB1YmxpYzsKLQljaGFyIGNvbW1lbnRbMTAyNF07Ci0JaW50IGksIHR5cGUsIGZkOwotCUZJTEUgKmY7Ci0KLQlmb3IgKGkgPSAwOyBrZXlfdHlwZXNbaV0ua2V5X3R5cGU7IGkrKykgewotCQlpZiAoc3RhdChrZXlfdHlwZXNbaV0ucGF0aCwgJnN0KSA9PSAwKQotCQkJY29udGludWU7Ci0JCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKLQkJCXByaW50ZigiQ291bGQgbm90IHN0YXQgJXM6ICVzIiwga2V5X3R5cGVzW2ldLnBhdGgsCi0JCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJCWZpcnN0ID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKGZpcnN0ID09IDApIHsKLQkJCWZpcnN0ID0gMTsKLQkJCXByaW50ZigiJXM6IGdlbmVyYXRpbmcgbmV3IGhvc3Qga2V5czogIiwgX19wcm9nbmFtZSk7Ci0JCX0KLQkJcHJpbnRmKCIlcyAiLCBrZXlfdHlwZXNbaV0ua2V5X3R5cGVfZGlzcGxheSk7Ci0JCWZmbHVzaChzdGRvdXQpOwotCQlhcmM0cmFuZG9tX3N0aXIoKTsKLQkJdHlwZSA9IGtleV90eXBlX2Zyb21fbmFtZShrZXlfdHlwZXNbaV0ua2V5X3R5cGUpOwotCQlzdHJsY3B5KGlkZW50aXR5X2ZpbGUsIGtleV90eXBlc1tpXS5wYXRoLCBzaXplb2YoaWRlbnRpdHlfZmlsZSkpOwotCQliaXRzID0gMDsKLQkJdHlwZV9iaXRzX3ZhbGlkKHR5cGUsICZiaXRzKTsKLQkJcHJpdmF0ZSA9IGtleV9nZW5lcmF0ZSh0eXBlLCBiaXRzKTsKLQkJaWYgKHByaXZhdGUgPT0gTlVMTCkgewotCQkJZnByaW50ZihzdGRlcnIsICJrZXlfZ2VuZXJhdGUgZmFpbGVkXG4iKTsKLQkJCWZpcnN0ID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXB1YmxpYyAgPSBrZXlfZnJvbV9wcml2YXRlKHByaXZhdGUpOwotCQlzbnByaW50Zihjb21tZW50LCBzaXplb2YgY29tbWVudCwgIiVzQCVzIiwgcHctPnB3X25hbWUsCi0JCSAgICBob3N0bmFtZSk7Ci0JCWlmICgha2V5X3NhdmVfcHJpdmF0ZShwcml2YXRlLCBpZGVudGl0eV9maWxlLCAiIiwgY29tbWVudCkpIHsKLQkJCXByaW50ZigiU2F2aW5nIHRoZSBrZXkgZmFpbGVkOiAlcy5cbiIsIGlkZW50aXR5X2ZpbGUpOwotCQkJa2V5X2ZyZWUocHJpdmF0ZSk7Ci0JCQlrZXlfZnJlZShwdWJsaWMpOwotCQkJZmlyc3QgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJa2V5X2ZyZWUocHJpdmF0ZSk7Ci0JCWFyYzRyYW5kb21fc3RpcigpOwotCQlzdHJsY2F0KGlkZW50aXR5X2ZpbGUsICIucHViIiwgc2l6ZW9mKGlkZW50aXR5X2ZpbGUpKTsKLQkJZmQgPSBvcGVuKGlkZW50aXR5X2ZpbGUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NDQpOwotCQlpZiAoZmQgPT0gLTEpIHsKLQkJCXByaW50ZigiQ291bGQgbm90IHNhdmUgeW91ciBwdWJsaWMga2V5IGluICVzXG4iLAotCQkJICAgIGlkZW50aXR5X2ZpbGUpOwotCQkJa2V5X2ZyZWUocHVibGljKTsKLQkJCWZpcnN0ID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWYgPSBmZG9wZW4oZmQsICJ3Iik7Ci0JCWlmIChmID09IE5VTEwpIHsKLQkJCXByaW50ZigiZmRvcGVuICVzIGZhaWxlZFxuIiwgaWRlbnRpdHlfZmlsZSk7Ci0JCQlrZXlfZnJlZShwdWJsaWMpOwotCQkJZmlyc3QgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFrZXlfd3JpdGUocHVibGljLCBmKSkgewotCQkJZnByaW50ZihzdGRlcnIsICJ3cml0ZSBrZXkgZmFpbGVkXG4iKTsKLQkJCWtleV9mcmVlKHB1YmxpYyk7Ci0JCQlmaXJzdCA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlmcHJpbnRmKGYsICIgJXNcbiIsIGNvbW1lbnQpOwotCQlmY2xvc2UoZik7Ci0JCWtleV9mcmVlKHB1YmxpYyk7Ci0KLQl9Ci0JaWYgKGZpcnN0ICE9IDApCi0JCXByaW50ZigiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50aG9zdChGSUxFICpmLCBjb25zdCBjaGFyICpuYW1lLCBLZXkgKnB1YmxpYywgaW50IGNhLCBpbnQgaGFzaCkKLXsKLQlpZiAocHJpbnRfZmluZ2VycHJpbnQpIHsKLQkJZW51bSBmcF9yZXAgcmVwOwotCQllbnVtIGZwX3R5cGUgZnB0eXBlOwotCQljaGFyICpmcCwgKnJhOwotCi0JCWZwdHlwZSA9IHByaW50X2J1YmJsZWJhYmJsZSA/IFNTSF9GUF9TSEExIDogU1NIX0ZQX01ENTsKLQkJcmVwID0gICAgcHJpbnRfYnViYmxlYmFiYmxlID8gU1NIX0ZQX0JVQkJMRUJBQkJMRSA6IFNTSF9GUF9IRVg7Ci0JCWZwID0ga2V5X2ZpbmdlcnByaW50KHB1YmxpYywgZnB0eXBlLCByZXApOwotCQlyYSA9IGtleV9maW5nZXJwcmludChwdWJsaWMsIFNTSF9GUF9NRDUsIFNTSF9GUF9SQU5ET01BUlQpOwotCQlwcmludGYoIiV1ICVzICVzICglcylcbiIsIGtleV9zaXplKHB1YmxpYyksIGZwLCBuYW1lLAotCQkgICAga2V5X3R5cGUocHVibGljKSk7Ci0JCWlmIChsb2dfbGV2ZWwgPj0gU1lTTE9HX0xFVkVMX1ZFUkJPU0UpCi0JCQlwcmludGYoIiVzXG4iLCByYSk7Ci0JCXhmcmVlKHJhKTsKLQkJeGZyZWUoZnApOwotCX0gZWxzZSB7Ci0JCWlmIChoYXNoICYmIChuYW1lID0gaG9zdF9oYXNoKG5hbWUsIE5VTEwsIDApKSA9PSBOVUxMKQotCQkJZmF0YWwoImhhc2hfaG9zdCBmYWlsZWQiKTsKLQkJZnByaW50ZihmLCAiJXMlcyVzICIsIGNhID8gQ0FfTUFSS0VSIDogIiIsIGNhID8gIiAiIDogIiIsIG5hbWUpOwotCQlpZiAoIWtleV93cml0ZShwdWJsaWMsIGYpKQotCQkJZmF0YWwoImtleV93cml0ZSBmYWlsZWQiKTsKLQkJZnByaW50ZihmLCAiXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19rbm93bl9ob3N0cyhzdHJ1Y3QgcGFzc3dkICpwdywgY29uc3QgY2hhciAqbmFtZSkKLXsKLQlGSUxFICppbiwgKm91dCA9IHN0ZG91dDsKLQlLZXkgKnB1YjsKLQljaGFyICpjcCwgKmNwMiwgKmtwLCAqa3AyOwotCWNoYXIgbGluZVsxNioxMDI0XSwgdG1wW01BWFBBVEhMRU5dLCBvbGRbTUFYUEFUSExFTl07Ci0JaW50IGMsIHNraXAgPSAwLCBpbnBsYWNlID0gMCwgbnVtID0gMCwgaW52YWxpZCA9IDAsIGhhc191bmhhc2hlZCA9IDA7Ci0JaW50IGNhOwotCi0JaWYgKCFoYXZlX2lkZW50aXR5KSB7Ci0JCWNwID0gdGlsZGVfZXhwYW5kX2ZpbGVuYW1lKF9QQVRIX1NTSF9VU0VSX0hPU1RGSUxFLCBwdy0+cHdfdWlkKTsKLQkJaWYgKHN0cmxjcHkoaWRlbnRpdHlfZmlsZSwgY3AsIHNpemVvZihpZGVudGl0eV9maWxlKSkgPj0KLQkJICAgIHNpemVvZihpZGVudGl0eV9maWxlKSkKLQkJCWZhdGFsKCJTcGVjaWZpZWQga25vd24gaG9zdHMgcGF0aCB0b28gbG9uZyIpOwotCQl4ZnJlZShjcCk7Ci0JCWhhdmVfaWRlbnRpdHkgPSAxOwotCX0KLQlpZiAoKGluID0gZm9wZW4oaWRlbnRpdHlfZmlsZSwgInIiKSkgPT0gTlVMTCkKLQkJZmF0YWwoIiVzOiAlczogJXMiLCBfX3Byb2duYW1lLCBpZGVudGl0eV9maWxlLCBzdHJlcnJvcihlcnJubykpOwotCi0JLyoKLQkgKiBGaW5kIGhvc3RzIGdvZXMgdG8gc3Rkb3V0LCBoYXNoIGFuZCBkZWxldGlvbnMgaGFwcGVuIGluLXBsYWNlCi0JICogQSBjb3JuZXIgY2FzZSBpcyBzc2gta2V5Z2VuIC1IRiBmb28sIHdoaWNoIHNob3VsZCBnbyB0byBzdGRvdXQKLQkgKi8KLQlpZiAoIWZpbmRfaG9zdCAmJiAoaGFzaF9ob3N0cyB8fCBkZWxldGVfaG9zdCkpIHsKLQkJaWYgKHN0cmxjcHkodG1wLCBpZGVudGl0eV9maWxlLCBzaXplb2YodG1wKSkgPj0gc2l6ZW9mKHRtcCkgfHwKLQkJICAgIHN0cmxjYXQodG1wLCAiLlhYWFhYWFhYWFgiLCBzaXplb2YodG1wKSkgPj0gc2l6ZW9mKHRtcCkgfHwKLQkJICAgIHN0cmxjcHkob2xkLCBpZGVudGl0eV9maWxlLCBzaXplb2Yob2xkKSkgPj0gc2l6ZW9mKG9sZCkgfHwKLQkJICAgIHN0cmxjYXQob2xkLCAiLm9sZCIsIHNpemVvZihvbGQpKSA+PSBzaXplb2Yob2xkKSkKLQkJCWZhdGFsKCJrbm93bl9ob3N0cyBwYXRoIHRvbyBsb25nIik7Ci0JCXVtYXNrKDA3Nyk7Ci0JCWlmICgoYyA9IG1rc3RlbXAodG1wKSkgPT0gLTEpCi0JCQlmYXRhbCgibWtzdGVtcDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlpZiAoKG91dCA9IGZkb3BlbihjLCAidyIpKSA9PSBOVUxMKSB7Ci0JCQljID0gZXJybm87Ci0JCQl1bmxpbmsodG1wKTsKLQkJCWZhdGFsKCJmZG9wZW46ICVzIiwgc3RyZXJyb3IoYykpOwotCQl9Ci0JCWlucGxhY2UgPSAxOwotCX0KLQotCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGluKSkgewotCQlpZiAoKGNwID0gc3RyY2hyKGxpbmUsICdcbicpKSA9PSBOVUxMKSB7Ci0JCQllcnJvcigibGluZSAlZCB0b28gbG9uZzogJS40MHMuLi4iLCBudW0gKyAxLCBsaW5lKTsKLQkJCXNraXAgPSAxOwotCQkJaW52YWxpZCA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQludW0rKzsKLQkJaWYgKHNraXApIHsKLQkJCXNraXAgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJKmNwID0gJ1wwJzsKLQotCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSwgZW1wdHkgYW5kIGNvbW1lbnQgbGluZXMuICovCi0JCWZvciAoY3AgPSBsaW5lOyAqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnOyBjcCsrKQotCQkJOwotCQlpZiAoISpjcCB8fCAqY3AgPT0gJ1xuJyB8fCAqY3AgPT0gJyMnKSB7Ci0JCQlpZiAoaW5wbGFjZSkKLQkJCQlmcHJpbnRmKG91dCwgIiVzXG4iLCBjcCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQkvKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYSBDQSBrZXkgKi8KLQkJaWYgKHN0cm5jYXNlY21wKGNwLCBDQV9NQVJLRVIsIHNpemVvZihDQV9NQVJLRVIpIC0gMSkgPT0gMCAmJgotCQkgICAgKGNwW3NpemVvZihDQV9NQVJLRVIpIC0gMV0gPT0gJyAnIHx8Ci0JCSAgICBjcFtzaXplb2YoQ0FfTUFSS0VSKSAtIDFdID09ICdcdCcpKSB7Ci0JCQljYSA9IDE7Ci0JCQljcCArPSBzaXplb2YoQ0FfTUFSS0VSKTsKLQkJfSBlbHNlCi0JCQljYSA9IDA7Ci0KLQkJLyogRmluZCB0aGUgZW5kIG9mIHRoZSBob3N0IG5hbWUgcG9ydGlvbi4gKi8KLQkJZm9yIChrcCA9IGNwOyAqa3AgJiYgKmtwICE9ICcgJyAmJiAqa3AgIT0gJ1x0Jzsga3ArKykKLQkJCTsKLQotCQlpZiAoKmtwID09ICdcMCcgfHwgKihrcCArIDEpID09ICdcMCcpIHsKLQkJCWVycm9yKCJsaW5lICVkIG1pc3Npbmcga2V5OiAlLjQwcy4uLiIsCi0JCQkgICAgbnVtLCBsaW5lKTsKLQkJCWludmFsaWQgPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJKmtwKysgPSAnXDAnOwotCQlrcDIgPSBrcDsKLQotCQlwdWIgPSBrZXlfbmV3KEtFWV9SU0ExKTsKLQkJaWYgKGtleV9yZWFkKHB1YiwgJmtwKSAhPSAxKSB7Ci0JCQlrcCA9IGtwMjsKLQkJCWtleV9mcmVlKHB1Yik7Ci0JCQlwdWIgPSBrZXlfbmV3KEtFWV9VTlNQRUMpOwotCQkJaWYgKGtleV9yZWFkKHB1YiwgJmtwKSAhPSAxKSB7Ci0JCQkJZXJyb3IoImxpbmUgJWQgaW52YWxpZCBrZXk6ICUuNDBzLi4uIiwKLQkJCQkgICAgbnVtLCBsaW5lKTsKLQkJCQlrZXlfZnJlZShwdWIpOwotCQkJCWludmFsaWQgPSAxOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKCpjcCA9PSBIQVNIX0RFTElNKSB7Ci0JCQlpZiAoZmluZF9ob3N0IHx8IGRlbGV0ZV9ob3N0KSB7Ci0JCQkJY3AyID0gaG9zdF9oYXNoKG5hbWUsIGNwLCBzdHJsZW4oY3ApKTsKLQkJCQlpZiAoY3AyID09IE5VTEwpIHsKLQkJCQkJZXJyb3IoImxpbmUgJWQ6IGludmFsaWQgaGFzaGVkICIKLQkJCQkJICAgICJuYW1lOiAlLjY0cy4uLiIsIG51bSwgbGluZSk7Ci0JCQkJCWludmFsaWQgPSAxOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJYyA9IChzdHJjbXAoY3AyLCBjcCkgPT0gMCk7Ci0JCQkJaWYgKGZpbmRfaG9zdCAmJiBjKSB7Ci0JCQkJCXByaW50ZigiIyBIb3N0ICVzIGZvdW5kOiAiCi0JCQkJCSAgICAibGluZSAlZCB0eXBlICVzJXNcbiIsIG5hbWUsCi0JCQkJCSAgICBudW0sIGtleV90eXBlKHB1YiksCi0JCQkJCSAgICBjYSA/ICIgKENBIGtleSkiIDogIiIpOwotCQkJCQlwcmludGhvc3Qob3V0LCBjcCwgcHViLCBjYSwgMCk7Ci0JCQkJfQotCQkJCWlmIChkZWxldGVfaG9zdCAmJiAhYyAmJiAhY2EpCi0JCQkJCXByaW50aG9zdChvdXQsIGNwLCBwdWIsIGNhLCAwKTsKLQkJCX0gZWxzZSBpZiAoaGFzaF9ob3N0cykKLQkJCQlwcmludGhvc3Qob3V0LCBjcCwgcHViLCBjYSwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmluZF9ob3N0IHx8IGRlbGV0ZV9ob3N0KSB7Ci0JCQkJYyA9IChtYXRjaF9ob3N0bmFtZShuYW1lLCBjcCwKLQkJCQkgICAgc3RybGVuKGNwKSkgPT0gMSk7Ci0JCQkJaWYgKGZpbmRfaG9zdCAmJiBjKSB7Ci0JCQkJCXByaW50ZigiIyBIb3N0ICVzIGZvdW5kOiAiCi0JCQkJCSAgICAibGluZSAlZCB0eXBlICVzJXNcbiIsIG5hbWUsCi0JCQkJCSAgICBudW0sIGtleV90eXBlKHB1YiksCi0JCQkJCSAgICBjYSA/ICIgKENBIGtleSkiIDogIiIpOwotCQkJCQlwcmludGhvc3Qob3V0LCBuYW1lLCBwdWIsCi0JCQkJCSAgICBjYSwgaGFzaF9ob3N0cyAmJiAhY2EpOwotCQkJCX0KLQkJCQlpZiAoZGVsZXRlX2hvc3QgJiYgIWMgJiYgIWNhKQotCQkJCQlwcmludGhvc3Qob3V0LCBjcCwgcHViLCBjYSwgMCk7Ci0JCQl9IGVsc2UgaWYgKGhhc2hfaG9zdHMpIHsKLQkJCQlmb3IgKGNwMiA9IHN0cnNlcCgmY3AsICIsIik7Ci0JCQkJICAgIGNwMiAhPSBOVUxMICYmICpjcDIgIT0gJ1wwJzsKLQkJCQkgICAgY3AyID0gc3Ryc2VwKCZjcCwgIiwiKSkgewotCQkJCQlpZiAoY2EpIHsKLQkJCQkJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogIgotCQkJCQkJICAgICJpZ25vcmluZyBDQSBrZXkgZm9yIGhvc3Q6ICIKLQkJCQkJCSAgICAiJS42NHNcbiIsIGNwMik7Ci0JCQkJCQlwcmludGhvc3Qob3V0LCBjcDIsIHB1YiwgY2EsIDApOwotCQkJCQl9IGVsc2UgaWYgKHN0cmNzcG4oY3AyLCAiKj8hIikgIT0KLQkJCQkJICAgIHN0cmxlbihjcDIpKSB7Ci0JCQkJCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6ICIKLQkJCQkJCSAgICAiaWdub3JpbmcgaG9zdCBuYW1lIHdpdGggIgotCQkJCQkJICAgICJtZXRhY2hhcmFjdGVyczogJS42NHNcbiIsCi0JCQkJCQkgICAgY3AyKTsKLQkJCQkJCXByaW50aG9zdChvdXQsIGNwMiwgcHViLCBjYSwgMCk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJcHJpbnRob3N0KG91dCwgY3AyLCBwdWIsIGNhLCAxKTsKLQkJCQl9Ci0JCQkJaGFzX3VuaGFzaGVkID0gMTsKLQkJCX0KLQkJfQotCQlrZXlfZnJlZShwdWIpOwotCX0KLQlmY2xvc2UoaW4pOwotCi0JaWYgKGludmFsaWQpIHsKLQkJZnByaW50ZihzdGRlcnIsICIlcyBpcyBub3QgYSB2YWxpZCBrbm93bl9ob3N0cyBmaWxlLlxuIiwKLQkJICAgIGlkZW50aXR5X2ZpbGUpOwotCQlpZiAoaW5wbGFjZSkgewotCQkJZnByaW50ZihzdGRlcnIsICJOb3QgcmVwbGFjaW5nIGV4aXN0aW5nIGtub3duX2hvc3RzICIKLQkJCSAgICAiZmlsZSBiZWNhdXNlIG9mIGVycm9yc1xuIik7Ci0JCQlmY2xvc2Uob3V0KTsKLQkJCXVubGluayh0bXApOwotCQl9Ci0JCWV4aXQoMSk7Ci0JfQotCi0JaWYgKGlucGxhY2UpIHsKLQkJZmNsb3NlKG91dCk7Ci0KLQkJLyogQmFja3VwIGV4aXN0aW5nIGZpbGUgKi8KLQkJaWYgKHVubGluayhvbGQpID09IC0xICYmIGVycm5vICE9IEVOT0VOVCkKLQkJCWZhdGFsKCJ1bmxpbmsgJS4xMDBzOiAlcyIsIG9sZCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJaWYgKGxpbmsoaWRlbnRpdHlfZmlsZSwgb2xkKSA9PSAtMSkKLQkJCWZhdGFsKCJsaW5rICUuMTAwcyB0byAlLjEwMHM6ICVzIiwgaWRlbnRpdHlfZmlsZSwgb2xkLAotCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCS8qIE1vdmUgbmV3IG9uZSBpbnRvIHBsYWNlICovCi0JCWlmIChyZW5hbWUodG1wLCBpZGVudGl0eV9maWxlKSA9PSAtMSkgewotCQkJZXJyb3IoInJlbmFtZVwiJXNcIiB0byBcIiVzXCI6ICVzIiwgdG1wLCBpZGVudGl0eV9maWxlLAotCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCQl1bmxpbmsodG1wKTsKLQkJCXVubGluayhvbGQpOwotCQkJZXhpdCgxKTsKLQkJfQotCi0JCWZwcmludGYoc3RkZXJyLCAiJXMgdXBkYXRlZC5cbiIsIGlkZW50aXR5X2ZpbGUpOwotCQlmcHJpbnRmKHN0ZGVyciwgIk9yaWdpbmFsIGNvbnRlbnRzIHJldGFpbmVkIGFzICVzXG4iLCBvbGQpOwotCQlpZiAoaGFzX3VuaGFzaGVkKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6ICVzIGNvbnRhaW5zIHVuaGFzaGVkICIKLQkJCSAgICAiZW50cmllc1xuIiwgb2xkKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiRGVsZXRlIHRoaXMgZmlsZSB0byBlbnN1cmUgcHJpdmFjeSAiCi0JCQkgICAgIm9mIGhvc3RuYW1lc1xuIik7Ci0JCX0KLQl9Ci0KLQlleGl0KDApOwotfQotCi0vKgotICogUGVyZm9ybSBjaGFuZ2luZyBhIHBhc3NwaHJhc2UuICBUaGUgYXJndW1lbnQgaXMgdGhlIHBhc3N3ZCBzdHJ1Y3R1cmUKLSAqIGZvciB0aGUgY3VycmVudCB1c2VyLgotICovCi1zdGF0aWMgdm9pZAotZG9fY2hhbmdlX3Bhc3NwaHJhc2Uoc3RydWN0IHBhc3N3ZCAqcHcpCi17Ci0JY2hhciAqY29tbWVudDsKLQljaGFyICpvbGRfcGFzc3BocmFzZSwgKnBhc3NwaHJhc2UxLCAqcGFzc3BocmFzZTI7Ci0Jc3RydWN0IHN0YXQgc3Q7Ci0JS2V5ICpwcml2YXRlOwotCi0JaWYgKCFoYXZlX2lkZW50aXR5KQotCQlhc2tfZmlsZW5hbWUocHcsICJFbnRlciBmaWxlIGluIHdoaWNoIHRoZSBrZXkgaXMiKTsKLQlpZiAoc3RhdChpZGVudGl0eV9maWxlLCAmc3QpIDwgMCkgewotCQlwZXJyb3IoaWRlbnRpdHlfZmlsZSk7Ci0JCWV4aXQoMSk7Ci0JfQotCS8qIFRyeSB0byBsb2FkIHRoZSBmaWxlIHdpdGggZW1wdHkgcGFzc3BocmFzZS4gKi8KLQlwcml2YXRlID0ga2V5X2xvYWRfcHJpdmF0ZShpZGVudGl0eV9maWxlLCAiIiwgJmNvbW1lbnQpOwotCWlmIChwcml2YXRlID09IE5VTEwpIHsKLQkJaWYgKGlkZW50aXR5X3Bhc3NwaHJhc2UpCi0JCQlvbGRfcGFzc3BocmFzZSA9IHhzdHJkdXAoaWRlbnRpdHlfcGFzc3BocmFzZSk7Ci0JCWVsc2UKLQkJCW9sZF9wYXNzcGhyYXNlID0KLQkJCSAgICByZWFkX3Bhc3NwaHJhc2UoIkVudGVyIG9sZCBwYXNzcGhyYXNlOiAiLAotCQkJICAgIFJQX0FMTE9XX1NURElOKTsKLQkJcHJpdmF0ZSA9IGtleV9sb2FkX3ByaXZhdGUoaWRlbnRpdHlfZmlsZSwgb2xkX3Bhc3NwaHJhc2UsCi0JCSAgICAmY29tbWVudCk7Ci0JCW1lbXNldChvbGRfcGFzc3BocmFzZSwgMCwgc3RybGVuKG9sZF9wYXNzcGhyYXNlKSk7Ci0JCXhmcmVlKG9sZF9wYXNzcGhyYXNlKTsKLQkJaWYgKHByaXZhdGUgPT0gTlVMTCkgewotCQkJcHJpbnRmKCJCYWQgcGFzc3BocmFzZS5cbiIpOwotCQkJZXhpdCgxKTsKLQkJfQotCX0KLQlwcmludGYoIktleSBoYXMgY29tbWVudCAnJXMnXG4iLCBjb21tZW50KTsKLQotCS8qIEFzayB0aGUgbmV3IHBhc3NwaHJhc2UgKHR3aWNlKS4gKi8KLQlpZiAoaWRlbnRpdHlfbmV3X3Bhc3NwaHJhc2UpIHsKLQkJcGFzc3BocmFzZTEgPSB4c3RyZHVwKGlkZW50aXR5X25ld19wYXNzcGhyYXNlKTsKLQkJcGFzc3BocmFzZTIgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCXBhc3NwaHJhc2UxID0KLQkJCXJlYWRfcGFzc3BocmFzZSgiRW50ZXIgbmV3IHBhc3NwaHJhc2UgKGVtcHR5IGZvciBubyAiCi0JCQkgICAgInBhc3NwaHJhc2UpOiAiLCBSUF9BTExPV19TVERJTik7Ci0JCXBhc3NwaHJhc2UyID0gcmVhZF9wYXNzcGhyYXNlKCJFbnRlciBzYW1lIHBhc3NwaHJhc2UgYWdhaW46ICIsCi0JCSAgICBSUF9BTExPV19TVERJTik7Ci0KLQkJLyogVmVyaWZ5IHRoYXQgdGhleSBhcmUgdGhlIHNhbWUuICovCi0JCWlmIChzdHJjbXAocGFzc3BocmFzZTEsIHBhc3NwaHJhc2UyKSAhPSAwKSB7Ci0JCQltZW1zZXQocGFzc3BocmFzZTEsIDAsIHN0cmxlbihwYXNzcGhyYXNlMSkpOwotCQkJbWVtc2V0KHBhc3NwaHJhc2UyLCAwLCBzdHJsZW4ocGFzc3BocmFzZTIpKTsKLQkJCXhmcmVlKHBhc3NwaHJhc2UxKTsKLQkJCXhmcmVlKHBhc3NwaHJhc2UyKTsKLQkJCXByaW50ZigiUGFzcyBwaHJhc2VzIGRvIG5vdCBtYXRjaC4gIFRyeSBhZ2Fpbi5cbiIpOwotCQkJZXhpdCgxKTsKLQkJfQotCQkvKiBEZXN0cm95IHRoZSBvdGhlciBjb3B5LiAqLwotCQltZW1zZXQocGFzc3BocmFzZTIsIDAsIHN0cmxlbihwYXNzcGhyYXNlMikpOwotCQl4ZnJlZShwYXNzcGhyYXNlMik7Ci0JfQotCi0JLyogU2F2ZSB0aGUgZmlsZSB1c2luZyB0aGUgbmV3IHBhc3NwaHJhc2UuICovCi0JaWYgKCFrZXlfc2F2ZV9wcml2YXRlKHByaXZhdGUsIGlkZW50aXR5X2ZpbGUsIHBhc3NwaHJhc2UxLCBjb21tZW50KSkgewotCQlwcmludGYoIlNhdmluZyB0aGUga2V5IGZhaWxlZDogJXMuXG4iLCBpZGVudGl0eV9maWxlKTsKLQkJbWVtc2V0KHBhc3NwaHJhc2UxLCAwLCBzdHJsZW4ocGFzc3BocmFzZTEpKTsKLQkJeGZyZWUocGFzc3BocmFzZTEpOwotCQlrZXlfZnJlZShwcml2YXRlKTsKLQkJeGZyZWUoY29tbWVudCk7Ci0JCWV4aXQoMSk7Ci0JfQotCS8qIERlc3Ryb3kgdGhlIHBhc3NwaHJhc2UgYW5kIHRoZSBjb3B5IG9mIHRoZSBrZXkgaW4gbWVtb3J5LiAqLwotCW1lbXNldChwYXNzcGhyYXNlMSwgMCwgc3RybGVuKHBhc3NwaHJhc2UxKSk7Ci0JeGZyZWUocGFzc3BocmFzZTEpOwotCWtleV9mcmVlKHByaXZhdGUpOwkJIC8qIERlc3Ryb3lzIGNvbnRlbnRzICovCi0JeGZyZWUoY29tbWVudCk7Ci0KLQlwcmludGYoIllvdXIgaWRlbnRpZmljYXRpb24gaGFzIGJlZW4gc2F2ZWQgd2l0aCB0aGUgbmV3IHBhc3NwaHJhc2UuXG4iKTsKLQlleGl0KDApOwotfQotCi0vKgotICogUHJpbnQgdGhlIFNTSEZQIFJSLgotICovCi1zdGF0aWMgaW50Ci1kb19wcmludF9yZXNvdXJjZV9yZWNvcmQoc3RydWN0IHBhc3N3ZCAqcHcsIGNoYXIgKmZuYW1lLCBjaGFyICpobmFtZSkKLXsKLQlLZXkgKnB1YmxpYzsKLQljaGFyICpjb21tZW50ID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQotCWlmIChmbmFtZSA9PSBOVUxMKQotCQlhc2tfZmlsZW5hbWUocHcsICJFbnRlciBmaWxlIGluIHdoaWNoIHRoZSBrZXkgaXMiKTsKLQlpZiAoc3RhdChmbmFtZSwgJnN0KSA8IDApIHsKLQkJaWYgKGVycm5vID09IEVOT0VOVCkKLQkJCXJldHVybiAwOwotCQlwZXJyb3IoZm5hbWUpOwotCQlleGl0KDEpOwotCX0KLQlwdWJsaWMgPSBrZXlfbG9hZF9wdWJsaWMoZm5hbWUsICZjb21tZW50KTsKLQlpZiAocHVibGljICE9IE5VTEwpIHsKLQkJZXhwb3J0X2Ruc19ycihobmFtZSwgcHVibGljLCBzdGRvdXQsIHByaW50X2dlbmVyaWMpOwotCQlrZXlfZnJlZShwdWJsaWMpOwotCQl4ZnJlZShjb21tZW50KTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChjb21tZW50KQotCQl4ZnJlZShjb21tZW50KTsKLQotCXByaW50ZigiZmFpbGVkIHRvIHJlYWQgdjIgcHVibGljIGtleSBmcm9tICVzLlxuIiwgZm5hbWUpOwotCWV4aXQoMSk7Ci19Ci0KLS8qCi0gKiBDaGFuZ2UgdGhlIGNvbW1lbnQgb2YgYSBwcml2YXRlIGtleSBmaWxlLgotICovCi1zdGF0aWMgdm9pZAotZG9fY2hhbmdlX2NvbW1lbnQoc3RydWN0IHBhc3N3ZCAqcHcpCi17Ci0JY2hhciBuZXdfY29tbWVudFsxMDI0XSwgKmNvbW1lbnQsICpwYXNzcGhyYXNlOwotCUtleSAqcHJpdmF0ZTsKLQlLZXkgKnB1YmxpYzsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQlGSUxFICpmOwotCWludCBmZDsKLQotCWlmICghaGF2ZV9pZGVudGl0eSkKLQkJYXNrX2ZpbGVuYW1lKHB3LCAiRW50ZXIgZmlsZSBpbiB3aGljaCB0aGUga2V5IGlzIik7Ci0JaWYgKHN0YXQoaWRlbnRpdHlfZmlsZSwgJnN0KSA8IDApIHsKLQkJcGVycm9yKGlkZW50aXR5X2ZpbGUpOwotCQlleGl0KDEpOwotCX0KLQlwcml2YXRlID0ga2V5X2xvYWRfcHJpdmF0ZShpZGVudGl0eV9maWxlLCAiIiwgJmNvbW1lbnQpOwotCWlmIChwcml2YXRlID09IE5VTEwpIHsKLQkJaWYgKGlkZW50aXR5X3Bhc3NwaHJhc2UpCi0JCQlwYXNzcGhyYXNlID0geHN0cmR1cChpZGVudGl0eV9wYXNzcGhyYXNlKTsKLQkJZWxzZSBpZiAoaWRlbnRpdHlfbmV3X3Bhc3NwaHJhc2UpCi0JCQlwYXNzcGhyYXNlID0geHN0cmR1cChpZGVudGl0eV9uZXdfcGFzc3BocmFzZSk7Ci0JCWVsc2UKLQkJCXBhc3NwaHJhc2UgPSByZWFkX3Bhc3NwaHJhc2UoIkVudGVyIHBhc3NwaHJhc2U6ICIsCi0JCQkgICAgUlBfQUxMT1dfU1RESU4pOwotCQkvKiBUcnkgdG8gbG9hZCB1c2luZyB0aGUgcGFzc3BocmFzZS4gKi8KLQkJcHJpdmF0ZSA9IGtleV9sb2FkX3ByaXZhdGUoaWRlbnRpdHlfZmlsZSwgcGFzc3BocmFzZSwgJmNvbW1lbnQpOwotCQlpZiAocHJpdmF0ZSA9PSBOVUxMKSB7Ci0JCQltZW1zZXQocGFzc3BocmFzZSwgMCwgc3RybGVuKHBhc3NwaHJhc2UpKTsKLQkJCXhmcmVlKHBhc3NwaHJhc2UpOwotCQkJcHJpbnRmKCJCYWQgcGFzc3BocmFzZS5cbiIpOwotCQkJZXhpdCgxKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXBhc3NwaHJhc2UgPSB4c3RyZHVwKCIiKTsKLQl9Ci0JaWYgKHByaXZhdGUtPnR5cGUgIT0gS0VZX1JTQTEpIHsKLQkJZnByaW50ZihzdGRlcnIsICJDb21tZW50cyBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIFJTQTEga2V5cy5cbiIpOwotCQlrZXlfZnJlZShwcml2YXRlKTsKLQkJZXhpdCgxKTsKLQl9Ci0JcHJpbnRmKCJLZXkgbm93IGhhcyBjb21tZW50ICclcydcbiIsIGNvbW1lbnQpOwotCi0JaWYgKGlkZW50aXR5X2NvbW1lbnQpIHsKLQkJc3RybGNweShuZXdfY29tbWVudCwgaWRlbnRpdHlfY29tbWVudCwgc2l6ZW9mKG5ld19jb21tZW50KSk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRmKCJFbnRlciBuZXcgY29tbWVudDogIik7Ci0JCWZmbHVzaChzdGRvdXQpOwotCQlpZiAoIWZnZXRzKG5ld19jb21tZW50LCBzaXplb2YobmV3X2NvbW1lbnQpLCBzdGRpbikpIHsKLQkJCW1lbXNldChwYXNzcGhyYXNlLCAwLCBzdHJsZW4ocGFzc3BocmFzZSkpOwotCQkJa2V5X2ZyZWUocHJpdmF0ZSk7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCW5ld19jb21tZW50W3N0cmNzcG4obmV3X2NvbW1lbnQsICJcbiIpXSA9ICdcMCc7Ci0JfQotCi0JLyogU2F2ZSB0aGUgZmlsZSB1c2luZyB0aGUgbmV3IHBhc3NwaHJhc2UuICovCi0JaWYgKCFrZXlfc2F2ZV9wcml2YXRlKHByaXZhdGUsIGlkZW50aXR5X2ZpbGUsIHBhc3NwaHJhc2UsIG5ld19jb21tZW50KSkgewotCQlwcmludGYoIlNhdmluZyB0aGUga2V5IGZhaWxlZDogJXMuXG4iLCBpZGVudGl0eV9maWxlKTsKLQkJbWVtc2V0KHBhc3NwaHJhc2UsIDAsIHN0cmxlbihwYXNzcGhyYXNlKSk7Ci0JCXhmcmVlKHBhc3NwaHJhc2UpOwotCQlrZXlfZnJlZShwcml2YXRlKTsKLQkJeGZyZWUoY29tbWVudCk7Ci0JCWV4aXQoMSk7Ci0JfQotCW1lbXNldChwYXNzcGhyYXNlLCAwLCBzdHJsZW4ocGFzc3BocmFzZSkpOwotCXhmcmVlKHBhc3NwaHJhc2UpOwotCXB1YmxpYyA9IGtleV9mcm9tX3ByaXZhdGUocHJpdmF0ZSk7Ci0Ja2V5X2ZyZWUocHJpdmF0ZSk7Ci0KLQlzdHJsY2F0KGlkZW50aXR5X2ZpbGUsICIucHViIiwgc2l6ZW9mKGlkZW50aXR5X2ZpbGUpKTsKLQlmZCA9IG9wZW4oaWRlbnRpdHlfZmlsZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY0NCk7Ci0JaWYgKGZkID09IC0xKSB7Ci0JCXByaW50ZigiQ291bGQgbm90IHNhdmUgeW91ciBwdWJsaWMga2V5IGluICVzXG4iLCBpZGVudGl0eV9maWxlKTsKLQkJZXhpdCgxKTsKLQl9Ci0JZiA9IGZkb3BlbihmZCwgInciKTsKLQlpZiAoZiA9PSBOVUxMKSB7Ci0JCXByaW50ZigiZmRvcGVuICVzIGZhaWxlZFxuIiwgaWRlbnRpdHlfZmlsZSk7Ci0JCWV4aXQoMSk7Ci0JfQotCWlmICgha2V5X3dyaXRlKHB1YmxpYywgZikpCi0JCWZwcmludGYoc3RkZXJyLCAid3JpdGUga2V5IGZhaWxlZFxuIik7Ci0Ja2V5X2ZyZWUocHVibGljKTsKLQlmcHJpbnRmKGYsICIgJXNcbiIsIG5ld19jb21tZW50KTsKLQlmY2xvc2UoZik7Ci0KLQl4ZnJlZShjb21tZW50KTsKLQotCXByaW50ZigiVGhlIGNvbW1lbnQgaW4geW91ciBrZXkgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkLlxuIik7Ci0JZXhpdCgwKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZm10X3ZhbGlkaXR5KHVfaW50NjRfdCB2YWxpZF9mcm9tLCB1X2ludDY0X3QgdmFsaWRfdG8pCi17Ci0JY2hhciBmcm9tWzMyXSwgdG9bMzJdOwotCXN0YXRpYyBjaGFyIHJldFs2NF07Ci0JdGltZV90IHR0OwotCXN0cnVjdCB0bSAqdG07Ci0KLQkqZnJvbSA9ICp0byA9ICdcMCc7Ci0JaWYgKHZhbGlkX2Zyb20gPT0gMCAmJiB2YWxpZF90byA9PSAweGZmZmZmZmZmZmZmZmZmZmZVTEwpCi0JCXJldHVybiAiZm9yZXZlciI7Ci0KLQlpZiAodmFsaWRfZnJvbSAhPSAwKSB7Ci0JCS8qIFhYWCByZXZpc2l0IElOVF9NQVggaW4gMjAzOCA6KSAqLwotCQl0dCA9IHZhbGlkX2Zyb20gPiBJTlRfTUFYID8gSU5UX01BWCA6IHZhbGlkX2Zyb207Ci0JCXRtID0gbG9jYWx0aW1lKCZ0dCk7Ci0JCXN0cmZ0aW1lKGZyb20sIHNpemVvZihmcm9tKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgdG0pOwotCX0KLQlpZiAodmFsaWRfdG8gIT0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSB7Ci0JCS8qIFhYWCByZXZpc2l0IElOVF9NQVggaW4gMjAzOCA6KSAqLwotCQl0dCA9IHZhbGlkX3RvID4gSU5UX01BWCA/IElOVF9NQVggOiB2YWxpZF90bzsKLQkJdG0gPSBsb2NhbHRpbWUoJnR0KTsKLQkJc3RyZnRpbWUodG8sIHNpemVvZih0byksICIlWS0lbS0lZFQlSDolTTolUyIsIHRtKTsKLQl9Ci0KLQlpZiAodmFsaWRfZnJvbSA9PSAwKSB7Ci0JCXNucHJpbnRmKHJldCwgc2l6ZW9mKHJldCksICJiZWZvcmUgJXMiLCB0byk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWlmICh2YWxpZF90byA9PSAweGZmZmZmZmZmZmZmZmZmZmZVTEwpIHsKLQkJc25wcmludGYocmV0LCBzaXplb2YocmV0KSwgImFmdGVyICVzIiwgZnJvbSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Jc25wcmludGYocmV0LCBzaXplb2YocmV0KSwgImZyb20gJXMgdG8gJXMiLCBmcm9tLCB0byk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQKLWFkZF9mbGFnX29wdGlvbihCdWZmZXIgKmMsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JZGVidWczKCIlczogJXMiLCBfX2Z1bmNfXywgbmFtZSk7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKGMsIG5hbWUpOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKGMsIE5VTEwsIDApOwotfQotCi1zdGF0aWMgdm9pZAotYWRkX3N0cmluZ19vcHRpb24oQnVmZmVyICpjLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKLXsKLQlCdWZmZXIgYjsKLQotCWRlYnVnMygiJXM6ICVzPSVzIiwgX19mdW5jX18sIG5hbWUsIHZhbHVlKTsKLQlidWZmZXJfaW5pdCgmYik7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCB2YWx1ZSk7Ci0KLQlidWZmZXJfcHV0X2NzdHJpbmcoYywgbmFtZSk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoYywgYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpKTsKLQotCWJ1ZmZlcl9mcmVlKCZiKTsKLX0KLQotI2RlZmluZSBPUFRJT05TX0NSSVRJQ0FMCTEKLSNkZWZpbmUgT1BUSU9OU19FWFRFTlNJT05TCTIKLXN0YXRpYyB2b2lkCi1wcmVwYXJlX29wdGlvbnNfYnVmKEJ1ZmZlciAqYywgaW50IHdoaWNoKQotewotCWJ1ZmZlcl9jbGVhcihjKTsKLQlpZiAoKHdoaWNoICYgT1BUSU9OU19DUklUSUNBTCkgIT0gMCAmJgotCSAgICBjZXJ0ZmxhZ3NfY29tbWFuZCAhPSBOVUxMKQotCQlhZGRfc3RyaW5nX29wdGlvbihjLCAiZm9yY2UtY29tbWFuZCIsIGNlcnRmbGFnc19jb21tYW5kKTsKLQlpZiAoKHdoaWNoICYgT1BUSU9OU19FWFRFTlNJT05TKSAhPSAwICYmCi0JICAgIChjZXJ0ZmxhZ3NfZmxhZ3MgJiBDRVJUT1BUX1hfRldEKSAhPSAwKQotCQlhZGRfZmxhZ19vcHRpb24oYywgInBlcm1pdC1YMTEtZm9yd2FyZGluZyIpOwotCWlmICgod2hpY2ggJiBPUFRJT05TX0VYVEVOU0lPTlMpICE9IDAgJiYKLQkgICAgKGNlcnRmbGFnc19mbGFncyAmIENFUlRPUFRfQUdFTlRfRldEKSAhPSAwKQotCQlhZGRfZmxhZ19vcHRpb24oYywgInBlcm1pdC1hZ2VudC1mb3J3YXJkaW5nIik7Ci0JaWYgKCh3aGljaCAmIE9QVElPTlNfRVhURU5TSU9OUykgIT0gMCAmJgotCSAgICAoY2VydGZsYWdzX2ZsYWdzICYgQ0VSVE9QVF9QT1JUX0ZXRCkgIT0gMCkKLQkJYWRkX2ZsYWdfb3B0aW9uKGMsICJwZXJtaXQtcG9ydC1mb3J3YXJkaW5nIik7Ci0JaWYgKCh3aGljaCAmIE9QVElPTlNfRVhURU5TSU9OUykgIT0gMCAmJgotCSAgICAoY2VydGZsYWdzX2ZsYWdzICYgQ0VSVE9QVF9QVFkpICE9IDApCi0JCWFkZF9mbGFnX29wdGlvbihjLCAicGVybWl0LXB0eSIpOwotCWlmICgod2hpY2ggJiBPUFRJT05TX0VYVEVOU0lPTlMpICE9IDAgJiYKLQkgICAgKGNlcnRmbGFnc19mbGFncyAmIENFUlRPUFRfVVNFUl9SQykgIT0gMCkKLQkJYWRkX2ZsYWdfb3B0aW9uKGMsICJwZXJtaXQtdXNlci1yYyIpOwotCWlmICgod2hpY2ggJiBPUFRJT05TX0NSSVRJQ0FMKSAhPSAwICYmCi0JICAgIGNlcnRmbGFnc19zcmNfYWRkciAhPSBOVUxMKQotCQlhZGRfc3RyaW5nX29wdGlvbihjLCAic291cmNlLWFkZHJlc3MiLCBjZXJ0ZmxhZ3Nfc3JjX2FkZHIpOwotfQotCi1zdGF0aWMgS2V5ICoKLWxvYWRfcGtjczExX2tleShjaGFyICpwYXRoKQotewotI2lmZGVmIEVOQUJMRV9QS0NTMTEKLQlLZXkgKiprZXlzID0gTlVMTCwgKnB1YmxpYywgKnByaXZhdGUgPSBOVUxMOwotCWludCBpLCBua2V5czsKLQotCWlmICgocHVibGljID0ga2V5X2xvYWRfcHVibGljKHBhdGgsIE5VTEwpKSA9PSBOVUxMKQotCQlmYXRhbCgiQ291bGRuJ3QgbG9hZCBDQSBwdWJsaWMga2V5IFwiJXNcIiIsIHBhdGgpOwotCi0JbmtleXMgPSBwa2NzMTFfYWRkX3Byb3ZpZGVyKHBrY3MxMXByb3ZpZGVyLCBpZGVudGl0eV9wYXNzcGhyYXNlLCAma2V5cyk7Ci0JZGVidWczKCIlczogJWQga2V5cyIsIF9fZnVuY19fLCBua2V5cyk7Ci0JaWYgKG5rZXlzIDw9IDApCi0JCWZhdGFsKCJjYW5ub3QgcmVhZCBwdWJsaWMga2V5IGZyb20gcGtjczExIik7Ci0JZm9yIChpID0gMDsgaSA8IG5rZXlzOyBpKyspIHsKLQkJaWYgKGtleV9lcXVhbF9wdWJsaWMocHVibGljLCBrZXlzW2ldKSkgewotCQkJcHJpdmF0ZSA9IGtleXNbaV07Ci0JCQljb250aW51ZTsKLQkJfQotCQlrZXlfZnJlZShrZXlzW2ldKTsKLQl9Ci0JeGZyZWUoa2V5cyk7Ci0Ja2V5X2ZyZWUocHVibGljKTsKLQlyZXR1cm4gcHJpdmF0ZTsKLSNlbHNlCi0JZmF0YWwoIm5vIHBrY3MxMSBzdXBwb3J0Iik7Ci0jZW5kaWYgLyogRU5BQkxFX1BLQ1MxMSAqLwotfQotCi1zdGF0aWMgdm9pZAotZG9fY2Ffc2lnbihzdHJ1Y3QgcGFzc3dkICpwdywgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCWludCBpLCBmZDsKLQl1X2ludCBuOwotCUtleSAqY2EsICpwdWJsaWM7Ci0JY2hhciAqb3RtcCwgKnRtcCwgKmNwLCAqb3V0LCAqY29tbWVudCwgKipwbGlzdCA9IE5VTEw7Ci0JRklMRSAqZjsKLQlpbnQgdjAwID0gMDsgLyogbGVnYWN5IGtleXMgKi8KLQotCWlmIChrZXlfdHlwZV9uYW1lICE9IE5VTEwpIHsKLQkJc3dpdGNoIChrZXlfdHlwZV9mcm9tX25hbWUoa2V5X3R5cGVfbmFtZSkpIHsKLQkJY2FzZSBLRVlfUlNBX0NFUlRfVjAwOgotCQljYXNlIEtFWV9EU0FfQ0VSVF9WMDA6Ci0JCQl2MDAgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgS0VZX1VOU1BFQzoKLQkJCWlmIChzdHJjYXNlY21wKGtleV90eXBlX25hbWUsICJ2MDAiKSA9PSAwKSB7Ci0JCQkJdjAwID0gMTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChrZXlfdHlwZV9uYW1lLCAidjAxIikgPT0gMCkKLQkJCQlicmVhazsKLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWRlZmF1bHQ6Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInVua25vd24ga2V5IHR5cGUgJXNcbiIsIGtleV90eXBlX25hbWUpOwotCQkJZXhpdCgxKTsKLQkJfQotCX0KLQotCXBrY3MxMV9pbml0KDEpOwotCXRtcCA9IHRpbGRlX2V4cGFuZF9maWxlbmFtZShjYV9rZXlfcGF0aCwgcHctPnB3X3VpZCk7Ci0JaWYgKHBrY3MxMXByb3ZpZGVyICE9IE5VTEwpIHsKLQkJaWYgKChjYSA9IGxvYWRfcGtjczExX2tleSh0bXApKSA9PSBOVUxMKQotCQkJZmF0YWwoIk5vIFBLQ1MjMTEga2V5IG1hdGNoaW5nICVzIGZvdW5kIiwgY2Ffa2V5X3BhdGgpOwotCX0gZWxzZSBpZiAoKGNhID0gbG9hZF9pZGVudGl0eSh0bXApKSA9PSBOVUxMKQotCQlmYXRhbCgiQ291bGRuJ3QgbG9hZCBDQSBrZXkgXCIlc1wiIiwgdG1wKTsKLQl4ZnJlZSh0bXApOwotCi0JZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewotCQkvKiBTcGxpdCBsaXN0IG9mIHByaW5jaXBhbHMgKi8KLQkJbiA9IDA7Ci0JCWlmIChjZXJ0X3ByaW5jaXBhbHMgIT0gTlVMTCkgewotCQkJb3RtcCA9IHRtcCA9IHhzdHJkdXAoY2VydF9wcmluY2lwYWxzKTsKLQkJCXBsaXN0ID0gTlVMTDsKLQkJCWZvciAoOyAoY3AgPSBzdHJzZXAoJnRtcCwgIiwiKSkgIT0gTlVMTDsgbisrKSB7Ci0JCQkJcGxpc3QgPSB4cmVhbGxvYyhwbGlzdCwgbiArIDEsIHNpemVvZigqcGxpc3QpKTsKLQkJCQlpZiAoKihwbGlzdFtuXSA9IHhzdHJkdXAoY3ApKSA9PSAnXDAnKQotCQkJCQlmYXRhbCgiRW1wdHkgcHJpbmNpcGFsIG5hbWUiKTsKLQkJCX0KLQkJCXhmcmVlKG90bXApOwotCQl9Ci0JCi0JCXRtcCA9IHRpbGRlX2V4cGFuZF9maWxlbmFtZShhcmd2W2ldLCBwdy0+cHdfdWlkKTsKLQkJaWYgKChwdWJsaWMgPSBrZXlfbG9hZF9wdWJsaWModG1wLCAmY29tbWVudCkpID09IE5VTEwpCi0JCQlmYXRhbCgiJXM6IHVuYWJsZSB0byBvcGVuIFwiJXNcIiIsIF9fZnVuY19fLCB0bXApOwotCQlpZiAocHVibGljLT50eXBlICE9IEtFWV9SU0EgJiYgcHVibGljLT50eXBlICE9IEtFWV9EU0EgJiYKLQkJICAgIHB1YmxpYy0+dHlwZSAhPSBLRVlfRUNEU0EpCi0JCQlmYXRhbCgiJXM6IGtleSBcIiVzXCIgdHlwZSAlcyBjYW5ub3QgYmUgY2VydGlmaWVkIiwKLQkJCSAgICBfX2Z1bmNfXywgdG1wLCBrZXlfdHlwZShwdWJsaWMpKTsKLQotCQkvKiBQcmVwYXJlIGNlcnRpZmljYXRlIHRvIHNpZ24gKi8KLQkJaWYgKGtleV90b19jZXJ0aWZpZWQocHVibGljLCB2MDApICE9IDApCi0JCQlmYXRhbCgiQ291bGQgbm90IHVwZ3JhZGUga2V5ICVzIHRvIGNlcnRpZmljYXRlIiwgdG1wKTsKLQkJcHVibGljLT5jZXJ0LT50eXBlID0gY2VydF9rZXlfdHlwZTsKLQkJcHVibGljLT5jZXJ0LT5zZXJpYWwgPSAodV9pbnQ2NF90KWNlcnRfc2VyaWFsOwotCQlwdWJsaWMtPmNlcnQtPmtleV9pZCA9IHhzdHJkdXAoY2VydF9rZXlfaWQpOwotCQlwdWJsaWMtPmNlcnQtPm5wcmluY2lwYWxzID0gbjsKLQkJcHVibGljLT5jZXJ0LT5wcmluY2lwYWxzID0gcGxpc3Q7Ci0JCXB1YmxpYy0+Y2VydC0+dmFsaWRfYWZ0ZXIgPSBjZXJ0X3ZhbGlkX2Zyb207Ci0JCXB1YmxpYy0+Y2VydC0+dmFsaWRfYmVmb3JlID0gY2VydF92YWxpZF90bzsKLQkJaWYgKHYwMCkgewotCQkJcHJlcGFyZV9vcHRpb25zX2J1ZigmcHVibGljLT5jZXJ0LT5jcml0aWNhbCwKLQkJCSAgICBPUFRJT05TX0NSSVRJQ0FMfE9QVElPTlNfRVhURU5TSU9OUyk7Ci0JCX0gZWxzZSB7Ci0JCQlwcmVwYXJlX29wdGlvbnNfYnVmKCZwdWJsaWMtPmNlcnQtPmNyaXRpY2FsLAotCQkJICAgIE9QVElPTlNfQ1JJVElDQUwpOwotCQkJcHJlcGFyZV9vcHRpb25zX2J1ZigmcHVibGljLT5jZXJ0LT5leHRlbnNpb25zLAotCQkJICAgIE9QVElPTlNfRVhURU5TSU9OUyk7Ci0JCX0KLQkJcHVibGljLT5jZXJ0LT5zaWduYXR1cmVfa2V5ID0ga2V5X2Zyb21fcHJpdmF0ZShjYSk7Ci0KLQkJaWYgKGtleV9jZXJ0aWZ5KHB1YmxpYywgY2EpICE9IDApCi0JCQlmYXRhbCgiQ291bGRuJ3Qgbm90IGNlcnRpZnkga2V5ICVzIiwgdG1wKTsKLQotCQlpZiAoKGNwID0gc3RycmNocih0bXAsICcuJykpICE9IE5VTEwgJiYgc3RyY21wKGNwLCAiLnB1YiIpID09IDApCi0JCQkqY3AgPSAnXDAnOwotCQl4YXNwcmludGYoJm91dCwgIiVzLWNlcnQucHViIiwgdG1wKTsKLQkJeGZyZWUodG1wKTsKLQotCQlpZiAoKGZkID0gb3BlbihvdXQsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQywgMDY0NCkpID09IC0xKQotCQkJZmF0YWwoIkNvdWxkIG5vdCBvcGVuIFwiJXNcIiBmb3Igd3JpdGluZzogJXMiLCBvdXQsCi0JCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJaWYgKChmID0gZmRvcGVuKGZkLCAidyIpKSA9PSBOVUxMKQotCQkJZmF0YWwoIiVzOiBmZG9wZW46ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JCWlmICgha2V5X3dyaXRlKHB1YmxpYywgZikpCi0JCQlmYXRhbCgiQ291bGQgbm90IHdyaXRlIGNlcnRpZmllZCBrZXkgdG8gJXMiLCBvdXQpOwotCQlmcHJpbnRmKGYsICIgJXNcbiIsIGNvbW1lbnQpOwotCQlmY2xvc2UoZik7Ci0KLQkJaWYgKCFxdWlldCkgewotCQkJbG9naXQoIlNpZ25lZCAlcyBrZXkgJXM6IGlkIFwiJXNcIiBzZXJpYWwgJWxsdSVzJXMgIgotCQkJICAgICJ2YWxpZCAlcyIsIGtleV9jZXJ0X3R5cGUocHVibGljKSwgCi0JCQkgICAgb3V0LCBwdWJsaWMtPmNlcnQtPmtleV9pZCwKLQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXB1YmxpYy0+Y2VydC0+c2VyaWFsLAotCQkJICAgIGNlcnRfcHJpbmNpcGFscyAhPSBOVUxMID8gIiBmb3IgIiA6ICIiLAotCQkJICAgIGNlcnRfcHJpbmNpcGFscyAhPSBOVUxMID8gY2VydF9wcmluY2lwYWxzIDogIiIsCi0JCQkgICAgZm10X3ZhbGlkaXR5KGNlcnRfdmFsaWRfZnJvbSwgY2VydF92YWxpZF90bykpOwotCQl9Ci0KLQkJa2V5X2ZyZWUocHVibGljKTsKLQkJeGZyZWUob3V0KTsKLQl9Ci0JcGtjczExX3Rlcm1pbmF0ZSgpOwotCWV4aXQoMCk7Ci19Ci0KLXN0YXRpYyB1X2ludDY0X3QKLXBhcnNlX3JlbGF0aXZlX3RpbWUoY29uc3QgY2hhciAqcywgdGltZV90IG5vdykKLXsKLQlpbnQ2NF90IG11bCwgc2VjczsKLQotCW11bCA9ICpzID09ICctJyA/IC0xIDogMTsKLQotCWlmICgoc2VjcyA9IGNvbnZ0aW1lKHMgKyAxKSkgPT0gLTEpCi0JCWZhdGFsKCJJbnZhbGlkIHJlbGF0aXZlIGNlcnRpZmljYXRlIHRpbWUgJXMiLCBzKTsKLQlpZiAobXVsID09IC0xICYmIHNlY3MgPiBub3cpCi0JCWZhdGFsKCJDZXJ0aWZpY2F0ZSB0aW1lICVzIGNhbm5vdCBiZSByZXByZXNlbnRlZCIsIHMpOwotCXJldHVybiBub3cgKyAodV9pbnQ2NF90KShzZWNzICogbXVsKTsKLX0KLQotc3RhdGljIHVfaW50NjRfdAotcGFyc2VfYWJzb2x1dGVfdGltZShjb25zdCBjaGFyICpzKQotewotCXN0cnVjdCB0bSB0bTsKLQl0aW1lX3QgdHQ7Ci0JY2hhciBidWZbMzJdLCAqZm10OwotCi0JLyoKLQkgKiBQT1NJWCBzdHJwdGltZSBzYXlzICJUaGUgYXBwbGljYXRpb24gc2hhbGwgZW5zdXJlIHRoYXQgdGhlcmUgCi0JICogaXMgd2hpdGUtc3BhY2Ugb3Igb3RoZXIgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGJldHdlZW4KLQkgKiBhbnkgdHdvIGNvbnZlcnNpb24gc3BlY2lmaWNhdGlvbnMiIHNvIGFycmFuZ2UgdGhpbmdzIHRoaXMgd2F5LgotCSAqLwotCXN3aXRjaCAoc3RybGVuKHMpKSB7Ci0JY2FzZSA4OgotCQlmbXQgPSAiJVktJW0tJWQiOwotCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJS40cy0lLjJzLSUuMnMiLCBzLCBzICsgNCwgcyArIDYpOwotCQlicmVhazsKLQljYXNlIDE0OgotCQlmbXQgPSAiJVktJW0tJWRUJUg6JU06JVMiOwotCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJS40cy0lLjJzLSUuMnNUJS4yczolLjJzOiUuMnMiLAotCQkgICAgcywgcyArIDQsIHMgKyA2LCBzICsgOCwgcyArIDEwLCBzICsgMTIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlmYXRhbCgiSW52YWxpZCBjZXJ0aWZpY2F0ZSB0aW1lIGZvcm1hdCAlcyIsIHMpOwotCX0KLQotCWJ6ZXJvKCZ0bSwgc2l6ZW9mKHRtKSk7Ci0JaWYgKHN0cnB0aW1lKGJ1ZiwgZm10LCAmdG0pID09IE5VTEwpCi0JCWZhdGFsKCJJbnZhbGlkIGNlcnRpZmljYXRlIHRpbWUgJXMiLCBzKTsKLQlpZiAoKHR0ID0gbWt0aW1lKCZ0bSkpIDwgMCkKLQkJZmF0YWwoIkNlcnRpZmljYXRlIHRpbWUgJXMgY2Fubm90IGJlIHJlcHJlc2VudGVkIiwgcyk7Ci0JcmV0dXJuICh1X2ludDY0X3QpdHQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYXJzZV9jZXJ0X3RpbWVzKGNoYXIgKnRpbWVzcGVjKQotewotCWNoYXIgKmZyb20sICp0bzsKLQl0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKLQlpbnQ2NF90IHNlY3M7Ci0KLQkvKiArdGltZXNwZWMgcmVsYXRpdmUgdG8gbm93ICovCi0JaWYgKCp0aW1lc3BlYyA9PSAnKycgJiYgc3RyY2hyKHRpbWVzcGVjLCAnOicpID09IE5VTEwpIHsKLQkJaWYgKChzZWNzID0gY29udnRpbWUodGltZXNwZWMgKyAxKSkgPT0gLTEpCi0JCQlmYXRhbCgiSW52YWxpZCByZWxhdGl2ZSBjZXJ0aWZpY2F0ZSBsaWZlICVzIiwgdGltZXNwZWMpOwotCQljZXJ0X3ZhbGlkX3RvID0gbm93ICsgc2VjczsKLQkJLyoKLQkJICogQmFja2RhdGUgY2VydGlmaWNhdGUgb25lIG1pbnV0ZSB0byBhdm9pZCBwcm9ibGVtcyBvbiBob3N0cwotCQkgKiB3aXRoIHBvb3JseS1zeW5jaHJvbmlzZWQgY2xvY2tzLgotCQkgKi8KLQkJY2VydF92YWxpZF9mcm9tID0gKChub3cgLSA1OSkvIDYwKSAqIDYwOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBmcm9tOnRvLCB3aGVyZQotCSAqIGZyb20gOj0gWystXXRpbWVzcGVjIHwgWVlZWU1NREQgfCBZWVlZTU1EREhITU1TUwotCSAqICAgdG8gOj0gWystXXRpbWVzcGVjIHwgWVlZWU1NREQgfCBZWVlZTU1EREhITU1TUwotCSAqLwotCWZyb20gPSB4c3RyZHVwKHRpbWVzcGVjKTsKLQl0byA9IHN0cmNocihmcm9tLCAnOicpOwotCWlmICh0byA9PSBOVUxMIHx8IGZyb20gPT0gdG8gfHwgKih0byArIDEpID09ICdcMCcpCi0JCWZhdGFsKCJJbnZhbGlkIGNlcnRpZmljYXRlIGxpZmUgc3BlY2lmaWNhdGlvbiAlcyIsIHRpbWVzcGVjKTsKLQkqdG8rKyA9ICdcMCc7Ci0KLQlpZiAoKmZyb20gPT0gJy0nIHx8ICpmcm9tID09ICcrJykKLQkJY2VydF92YWxpZF9mcm9tID0gcGFyc2VfcmVsYXRpdmVfdGltZShmcm9tLCBub3cpOwotCWVsc2UKLQkJY2VydF92YWxpZF9mcm9tID0gcGFyc2VfYWJzb2x1dGVfdGltZShmcm9tKTsKLQotCWlmICgqdG8gPT0gJy0nIHx8ICp0byA9PSAnKycpCi0JCWNlcnRfdmFsaWRfdG8gPSBwYXJzZV9yZWxhdGl2ZV90aW1lKHRvLCBjZXJ0X3ZhbGlkX2Zyb20pOwotCWVsc2UKLQkJY2VydF92YWxpZF90byA9IHBhcnNlX2Fic29sdXRlX3RpbWUodG8pOwotCi0JaWYgKGNlcnRfdmFsaWRfdG8gPD0gY2VydF92YWxpZF9mcm9tKQotCQlmYXRhbCgiRW1wdHkgY2VydGlmaWNhdGUgdmFsaWRpdHkgaW50ZXJ2YWwiKTsKLQl4ZnJlZShmcm9tKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkZF9jZXJ0X29wdGlvbihjaGFyICpvcHQpCi17Ci0JY2hhciAqdmFsOwotCi0JaWYgKHN0cmNhc2VjbXAob3B0LCAiY2xlYXIiKSA9PSAwKQotCQljZXJ0ZmxhZ3NfZmxhZ3MgPSAwOwotCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0LCAibm8teDExLWZvcndhcmRpbmciKSA9PSAwKQotCQljZXJ0ZmxhZ3NfZmxhZ3MgJj0gfkNFUlRPUFRfWF9GV0Q7Ci0JZWxzZSBpZiAoc3RyY2FzZWNtcChvcHQsICJwZXJtaXQteDExLWZvcndhcmRpbmciKSA9PSAwKQotCQljZXJ0ZmxhZ3NfZmxhZ3MgfD0gQ0VSVE9QVF9YX0ZXRDsKLQllbHNlIGlmIChzdHJjYXNlY21wKG9wdCwgIm5vLWFnZW50LWZvcndhcmRpbmciKSA9PSAwKQotCQljZXJ0ZmxhZ3NfZmxhZ3MgJj0gfkNFUlRPUFRfQUdFTlRfRldEOwotCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0LCAicGVybWl0LWFnZW50LWZvcndhcmRpbmciKSA9PSAwKQotCQljZXJ0ZmxhZ3NfZmxhZ3MgfD0gQ0VSVE9QVF9BR0VOVF9GV0Q7Ci0JZWxzZSBpZiAoc3RyY2FzZWNtcChvcHQsICJuby1wb3J0LWZvcndhcmRpbmciKSA9PSAwKQotCQljZXJ0ZmxhZ3NfZmxhZ3MgJj0gfkNFUlRPUFRfUE9SVF9GV0Q7Ci0JZWxzZSBpZiAoc3RyY2FzZWNtcChvcHQsICJwZXJtaXQtcG9ydC1mb3J3YXJkaW5nIikgPT0gMCkKLQkJY2VydGZsYWdzX2ZsYWdzIHw9IENFUlRPUFRfUE9SVF9GV0Q7Ci0JZWxzZSBpZiAoc3RyY2FzZWNtcChvcHQsICJuby1wdHkiKSA9PSAwKQotCQljZXJ0ZmxhZ3NfZmxhZ3MgJj0gfkNFUlRPUFRfUFRZOwotCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0LCAicGVybWl0LXB0eSIpID09IDApCi0JCWNlcnRmbGFnc19mbGFncyB8PSBDRVJUT1BUX1BUWTsKLQllbHNlIGlmIChzdHJjYXNlY21wKG9wdCwgIm5vLXVzZXItcmMiKSA9PSAwKQotCQljZXJ0ZmxhZ3NfZmxhZ3MgJj0gfkNFUlRPUFRfVVNFUl9SQzsKLQllbHNlIGlmIChzdHJjYXNlY21wKG9wdCwgInBlcm1pdC11c2VyLXJjIikgPT0gMCkKLQkJY2VydGZsYWdzX2ZsYWdzIHw9IENFUlRPUFRfVVNFUl9SQzsKLQllbHNlIGlmIChzdHJuY2FzZWNtcChvcHQsICJmb3JjZS1jb21tYW5kPSIsIDE0KSA9PSAwKSB7Ci0JCXZhbCA9IG9wdCArIDE0OwotCQlpZiAoKnZhbCA9PSAnXDAnKQotCQkJZmF0YWwoIkVtcHR5IGZvcmNlLWNvbW1hbmQgb3B0aW9uIik7Ci0JCWlmIChjZXJ0ZmxhZ3NfY29tbWFuZCAhPSBOVUxMKQotCQkJZmF0YWwoImZvcmNlLWNvbW1hbmQgYWxyZWFkeSBzcGVjaWZpZWQiKTsKLQkJY2VydGZsYWdzX2NvbW1hbmQgPSB4c3RyZHVwKHZhbCk7Ci0JfSBlbHNlIGlmIChzdHJuY2FzZWNtcChvcHQsICJzb3VyY2UtYWRkcmVzcz0iLCAxNSkgPT0gMCkgewotCQl2YWwgPSBvcHQgKyAxNTsKLQkJaWYgKCp2YWwgPT0gJ1wwJykKLQkJCWZhdGFsKCJFbXB0eSBzb3VyY2UtYWRkcmVzcyBvcHRpb24iKTsKLQkJaWYgKGNlcnRmbGFnc19zcmNfYWRkciAhPSBOVUxMKQotCQkJZmF0YWwoInNvdXJjZS1hZGRyZXNzIGFscmVhZHkgc3BlY2lmaWVkIik7Ci0JCWlmIChhZGRyX21hdGNoX2NpZHJfbGlzdChOVUxMLCB2YWwpICE9IDApCi0JCQlmYXRhbCgiSW52YWxpZCBzb3VyY2UtYWRkcmVzcyBsaXN0Iik7Ci0JCWNlcnRmbGFnc19zcmNfYWRkciA9IHhzdHJkdXAodmFsKTsKLQl9IGVsc2UKLQkJZmF0YWwoIlVuc3VwcG9ydGVkIGNlcnRpZmljYXRlIG9wdGlvbiBcIiVzXCIiLCBvcHQpOwotfQotCi1zdGF0aWMgdm9pZAotc2hvd19vcHRpb25zKGNvbnN0IEJ1ZmZlciAqb3B0YnVmLCBpbnQgdjAwLCBpbnQgaW5fY3JpdGljYWwpCi17Ci0JdV9jaGFyICpuYW1lLCAqZGF0YTsKLQl1X2ludCBkbGVuOwotCUJ1ZmZlciBvcHRpb25zLCBvcHRpb247Ci0KLQlidWZmZXJfaW5pdCgmb3B0aW9ucyk7Ci0JYnVmZmVyX2FwcGVuZCgmb3B0aW9ucywgYnVmZmVyX3B0cihvcHRidWYpLCBidWZmZXJfbGVuKG9wdGJ1ZikpOwotCi0JYnVmZmVyX2luaXQoJm9wdGlvbik7Ci0Jd2hpbGUgKGJ1ZmZlcl9sZW4oJm9wdGlvbnMpICE9IDApIHsKLQkJbmFtZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZvcHRpb25zLCBOVUxMKTsKLQkJZGF0YSA9IGJ1ZmZlcl9nZXRfc3RyaW5nX3B0cigmb3B0aW9ucywgJmRsZW4pOwotCQlidWZmZXJfYXBwZW5kKCZvcHRpb24sIGRhdGEsIGRsZW4pOwotCQlwcmludGYoIiAgICAgICAgICAgICAgICAlcyIsIG5hbWUpOwotCQlpZiAoKHYwMCB8fCAhaW5fY3JpdGljYWwpICYmIAotCQkgICAgKHN0cmNtcChuYW1lLCAicGVybWl0LVgxMS1mb3J3YXJkaW5nIikgPT0gMCB8fAotCQkgICAgc3RyY21wKG5hbWUsICJwZXJtaXQtYWdlbnQtZm9yd2FyZGluZyIpID09IDAgfHwKLQkJICAgIHN0cmNtcChuYW1lLCAicGVybWl0LXBvcnQtZm9yd2FyZGluZyIpID09IDAgfHwKLQkJICAgIHN0cmNtcChuYW1lLCAicGVybWl0LXB0eSIpID09IDAgfHwKLQkJICAgIHN0cmNtcChuYW1lLCAicGVybWl0LXVzZXItcmMiKSA9PSAwKSkKLQkJCXByaW50ZigiXG4iKTsKLQkJZWxzZSBpZiAoKHYwMCB8fCBpbl9jcml0aWNhbCkgJiYKLQkJICAgIChzdHJjbXAobmFtZSwgImZvcmNlLWNvbW1hbmQiKSA9PSAwIHx8Ci0JCSAgICBzdHJjbXAobmFtZSwgInNvdXJjZS1hZGRyZXNzIikgPT0gMCkpIHsKLQkJCWRhdGEgPSBidWZmZXJfZ2V0X3N0cmluZygmb3B0aW9uLCBOVUxMKTsKLQkJCXByaW50ZigiICVzXG4iLCBkYXRhKTsKLQkJCXhmcmVlKGRhdGEpOwotCQl9IGVsc2UgewotCQkJcHJpbnRmKCIgVU5LTk9XTiBPUFRJT04gKGxlbiAldSlcbiIsCi0JCQkgICAgYnVmZmVyX2xlbigmb3B0aW9uKSk7Ci0JCQlidWZmZXJfY2xlYXIoJm9wdGlvbik7Ci0JCX0KLQkJeGZyZWUobmFtZSk7Ci0JCWlmIChidWZmZXJfbGVuKCZvcHRpb24pICE9IDApCi0JCQlmYXRhbCgiT3B0aW9uIGNvcnJ1cHQ6IGV4dHJhIGRhdGEgYXQgZW5kIik7Ci0JfQotCWJ1ZmZlcl9mcmVlKCZvcHRpb24pOwotCWJ1ZmZlcl9mcmVlKCZvcHRpb25zKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3Nob3dfY2VydChzdHJ1Y3QgcGFzc3dkICpwdykKLXsKLQlLZXkgKmtleTsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQljaGFyICprZXlfZnAsICpjYV9mcDsKLQl1X2ludCBpLCB2MDA7Ci0KLQlpZiAoIWhhdmVfaWRlbnRpdHkpCi0JCWFza19maWxlbmFtZShwdywgIkVudGVyIGZpbGUgaW4gd2hpY2ggdGhlIGtleSBpcyIpOwotCWlmIChzdGF0KGlkZW50aXR5X2ZpbGUsICZzdCkgPCAwKQotCQlmYXRhbCgiJXM6ICVzOiAlcyIsIF9fcHJvZ25hbWUsIGlkZW50aXR5X2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7Ci0JaWYgKChrZXkgPSBrZXlfbG9hZF9wdWJsaWMoaWRlbnRpdHlfZmlsZSwgTlVMTCkpID09IE5VTEwpCi0JCWZhdGFsKCIlcyBpcyBub3QgYSBwdWJsaWMga2V5IiwgaWRlbnRpdHlfZmlsZSk7Ci0JaWYgKCFrZXlfaXNfY2VydChrZXkpKQotCQlmYXRhbCgiJXMgaXMgbm90IGEgY2VydGlmaWNhdGUiLCBpZGVudGl0eV9maWxlKTsKLQl2MDAgPSBrZXktPnR5cGUgPT0gS0VZX1JTQV9DRVJUX1YwMCB8fCBrZXktPnR5cGUgPT0gS0VZX0RTQV9DRVJUX1YwMDsKLQotCWtleV9mcCA9IGtleV9maW5nZXJwcmludChrZXksIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOwotCWNhX2ZwID0ga2V5X2ZpbmdlcnByaW50KGtleS0+Y2VydC0+c2lnbmF0dXJlX2tleSwKLQkgICAgU1NIX0ZQX01ENSwgU1NIX0ZQX0hFWCk7Ci0KLQlwcmludGYoIiVzOlxuIiwgaWRlbnRpdHlfZmlsZSk7Ci0JcHJpbnRmKCIgICAgICAgIFR5cGU6ICVzICVzIGNlcnRpZmljYXRlXG4iLCBrZXlfc3NoX25hbWUoa2V5KSwKLQkgICAga2V5X2NlcnRfdHlwZShrZXkpKTsKLQlwcmludGYoIiAgICAgICAgUHVibGljIGtleTogJXMgJXNcbiIsIGtleV90eXBlKGtleSksIGtleV9mcCk7Ci0JcHJpbnRmKCIgICAgICAgIFNpZ25pbmcgQ0E6ICVzICVzXG4iLAotCSAgICBrZXlfdHlwZShrZXktPmNlcnQtPnNpZ25hdHVyZV9rZXkpLCBjYV9mcCk7Ci0JcHJpbnRmKCIgICAgICAgIEtleSBJRDogXCIlc1wiXG4iLCBrZXktPmNlcnQtPmtleV9pZCk7Ci0JaWYgKCF2MDApIHsKLQkJcHJpbnRmKCIgICAgICAgIFNlcmlhbDogJWxsdVxuIiwKLQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpa2V5LT5jZXJ0LT5zZXJpYWwpOwotCX0KLQlwcmludGYoIiAgICAgICAgVmFsaWQ6ICVzXG4iLAotCSAgICBmbXRfdmFsaWRpdHkoa2V5LT5jZXJ0LT52YWxpZF9hZnRlciwga2V5LT5jZXJ0LT52YWxpZF9iZWZvcmUpKTsKLQlwcmludGYoIiAgICAgICAgUHJpbmNpcGFsczogIik7Ci0JaWYgKGtleS0+Y2VydC0+bnByaW5jaXBhbHMgPT0gMCkKLQkJcHJpbnRmKCIobm9uZSlcbiIpOwotCWVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwga2V5LT5jZXJ0LT5ucHJpbmNpcGFsczsgaSsrKQotCQkJcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAlcyIsCi0JCQkgICAga2V5LT5jZXJ0LT5wcmluY2lwYWxzW2ldKTsKLQkJcHJpbnRmKCJcbiIpOwotCX0KLQlwcmludGYoIiAgICAgICAgQ3JpdGljYWwgT3B0aW9uczogIik7Ci0JaWYgKGJ1ZmZlcl9sZW4oJmtleS0+Y2VydC0+Y3JpdGljYWwpID09IDApCi0JCXByaW50ZigiKG5vbmUpXG4iKTsKLQllbHNlIHsKLQkJcHJpbnRmKCJcbiIpOwotCQlzaG93X29wdGlvbnMoJmtleS0+Y2VydC0+Y3JpdGljYWwsIHYwMCwgMSk7Ci0JfQotCWlmICghdjAwKSB7Ci0JCXByaW50ZigiICAgICAgICBFeHRlbnNpb25zOiAiKTsKLQkJaWYgKGJ1ZmZlcl9sZW4oJmtleS0+Y2VydC0+ZXh0ZW5zaW9ucykgPT0gMCkKLQkJCXByaW50ZigiKG5vbmUpXG4iKTsKLQkJZWxzZSB7Ci0JCQlwcmludGYoIlxuIik7Ci0JCQlzaG93X29wdGlvbnMoJmtleS0+Y2VydC0+ZXh0ZW5zaW9ucywgdjAwLCAwKTsKLQkJfQotCX0KLQlleGl0KDApOwotfQotCi1zdGF0aWMgdm9pZAotdXNhZ2Uodm9pZCkKLXsKLQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbb3B0aW9uc11cbiIsIF9fcHJvZ25hbWUpOwotCWZwcmludGYoc3RkZXJyLCAiT3B0aW9uczpcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtQSAgICAgICAgICBHZW5lcmF0ZSBub24tZXhpc3RlbnQgaG9zdCBrZXlzIGZvciBhbGwga2V5IHR5cGVzLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1hIHRyaWFscyAgIE51bWJlciBvZiB0cmlhbHMgZm9yIHNjcmVlbmluZyBESC1HRVggbW9kdWxpLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1CICAgICAgICAgIFNob3cgYnViYmxlYmFiYmxlIGRpZ2VzdCBvZiBrZXkgZmlsZS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtYiBiaXRzICAgICBOdW1iZXIgb2YgYml0cyBpbiB0aGUga2V5IHRvIGNyZWF0ZS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtQyBjb21tZW50ICBQcm92aWRlIG5ldyBjb21tZW50LlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1jICAgICAgICAgIENoYW5nZSBjb21tZW50IGluIHByaXZhdGUgYW5kIHB1YmxpYyBrZXkgZmlsZXMuXG4iKTsKLSNpZmRlZiBFTkFCTEVfUEtDUzExCi0JZnByaW50ZihzdGRlcnIsICIgIC1EIHBrY3MxMSAgIERvd25sb2FkIHB1YmxpYyBrZXkgZnJvbSBwa2NzMTEgdG9rZW4uXG4iKTsKLSNlbmRpZgotCWZwcmludGYoc3RkZXJyLCAiICAtZSAgICAgICAgICBFeHBvcnQgT3BlblNTSCB0byBmb3JlaWduIGZvcm1hdCBrZXkgZmlsZS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtRiBob3N0bmFtZSBGaW5kIGhvc3RuYW1lIGluIGtub3duIGhvc3RzIGZpbGUuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgLWYgZmlsZW5hbWUgRmlsZW5hbWUgb2YgdGhlIGtleSBmaWxlLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1HIGZpbGUgICAgIEdlbmVyYXRlIGNhbmRpZGF0ZXMgZm9yIERILUdFWCBtb2R1bGkuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgLWcgICAgICAgICAgVXNlIGdlbmVyaWMgRE5TIHJlc291cmNlIHJlY29yZCBmb3JtYXQuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgLUggICAgICAgICAgSGFzaCBuYW1lcyBpbiBrbm93bl9ob3N0cyBmaWxlLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1oICAgICAgICAgIEdlbmVyYXRlIGhvc3QgY2VydGlmaWNhdGUgaW5zdGVhZCBvZiBhIHVzZXIgY2VydGlmaWNhdGUuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgLUkga2V5X2lkICAgS2V5IGlkZW50aWZpZXIgdG8gaW5jbHVkZSBpbiBjZXJ0aWZpY2F0ZS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtaSAgICAgICAgICBJbXBvcnQgZm9yZWlnbiBmb3JtYXQgdG8gT3BlblNTSCBrZXkgZmlsZS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtTCAgICAgICAgICBQcmludCB0aGUgY29udGVudHMgb2YgYSBjZXJ0aWZpY2F0ZS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtbCAgICAgICAgICBTaG93IGZpbmdlcnByaW50IG9mIGtleSBmaWxlLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1NIG1lbW9yeSAgIEFtb3VudCBvZiBtZW1vcnkgKE1CKSB0byB1c2UgZm9yIGdlbmVyYXRpbmcgREgtR0VYIG1vZHVsaS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtbSBrZXlfZm10ICBDb252ZXJzaW9uIGZvcm1hdCBmb3IgLWUvLWkgKFBFTXxQS0NTOHxSRkM0NzE2KS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtTiBwaHJhc2UgICBQcm92aWRlIG5ldyBwYXNzcGhyYXNlLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1uIG5hbWUsLi4uIFVzZXIvaG9zdCBwcmluY2lwYWwgbmFtZXMgdG8gaW5jbHVkZSBpbiBjZXJ0aWZpY2F0ZVxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1PIG9wdGlvbiAgIFNwZWNpZnkgYSBjZXJ0aWZpY2F0ZSBvcHRpb24uXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgLVAgcGhyYXNlICAgUHJvdmlkZSBvbGQgcGFzc3BocmFzZS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtcCAgICAgICAgICBDaGFuZ2UgcGFzc3BocmFzZSBvZiBwcml2YXRlIGtleSBmaWxlLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1xICAgICAgICAgIFF1aWV0LlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1SIGhvc3RuYW1lIFJlbW92ZSBob3N0IGZyb20ga25vd25faG9zdHMgZmlsZS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtciBob3N0bmFtZSBQcmludCBETlMgcmVzb3VyY2UgcmVjb3JkLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1TIHN0YXJ0ICAgIFN0YXJ0IHBvaW50IChoZXgpIGZvciBnZW5lcmF0aW5nIERILUdFWCBtb2R1bGkuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgLXMgY2Ffa2V5ICAgQ2VydGlmeSBrZXlzIHdpdGggQ0Ega2V5LlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1UIGZpbGUgICAgIFNjcmVlbiBjYW5kaWRhdGVzIGZvciBESC1HRVggbW9kdWxpLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC10IHR5cGUgICAgIFNwZWNpZnkgdHlwZSBvZiBrZXkgdG8gY3JlYXRlLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC1WIGZyb206dG8gIFNwZWNpZnkgY2VydGlmaWNhdGUgdmFsaWRpdHkgaW50ZXJ2YWwuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgLXYgICAgICAgICAgVmVyYm9zZS5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiICAtVyBnZW4gICAgICBHZW5lcmF0b3IgdG8gdXNlIGZvciBnZW5lcmF0aW5nIERILUdFWCBtb2R1bGkuXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgLXkgICAgICAgICAgUmVhZCBwcml2YXRlIGtleSBmaWxlIGFuZCBwcmludCBwdWJsaWMga2V5LlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICIgIC16IHNlcmlhbCAgIFNwZWNpZnkgYSBzZXJpYWwgbnVtYmVyLlxuIik7Ci0KLQlleGl0KDEpOwotfQotCi0vKgotICogTWFpbiBwcm9ncmFtIGZvciBrZXkgbWFuYWdlbWVudC4KLSAqLwotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQljaGFyIGRvdHNzaGRpcltNQVhQQVRITEVOXSwgY29tbWVudFsxMDI0XSwgKnBhc3NwaHJhc2UxLCAqcGFzc3BocmFzZTI7Ci0JY2hhciBvdXRfZmlsZVtNQVhQQVRITEVOXSwgKnJyX2hvc3RuYW1lID0gTlVMTDsKLQlLZXkgKnByaXZhdGUsICpwdWJsaWM7Ci0Jc3RydWN0IHBhc3N3ZCAqcHc7Ci0Jc3RydWN0IHN0YXQgc3Q7Ci0JaW50IG9wdCwgdHlwZSwgZmQ7Ci0JdV9pbnQzMl90IG1lbW9yeSA9IDAsIGdlbmVyYXRvcl93YW50ZWQgPSAwLCB0cmlhbHMgPSAxMDA7Ci0JaW50IGRvX2dlbl9jYW5kaWRhdGVzID0gMCwgZG9fc2NyZWVuX2NhbmRpZGF0ZXMgPSAwOwotCWludCBnZW5fYWxsX2hvc3RrZXlzID0gMDsKLQlCSUdOVU0gKnN0YXJ0ID0gTlVMTDsKLQlGSUxFICpmOwotCWNvbnN0IGNoYXIgKmVycnN0cjsKLQotCWV4dGVybiBpbnQgb3B0aW5kOwotCWV4dGVybiBjaGFyICpvcHRhcmc7Ci0KLQkvKiBFbnN1cmUgdGhhdCBmZHMgMCwgMSBhbmQgMiBhcmUgb3BlbiBvciBkaXJlY3RlZCB0byAvZGV2L251bGwgKi8KLQlzYW5pdGlzZV9zdGRmZCgpOwotCi0JX19wcm9nbmFtZSA9IHNzaF9nZXRfcHJvZ25hbWUoYXJndlswXSk7Ci0KLQlPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpOwotCWxvZ19pbml0KGFyZ3ZbMF0sIFNZU0xPR19MRVZFTF9JTkZPLCBTWVNMT0dfRkFDSUxJVFlfVVNFUiwgMSk7Ci0KLQlzZWVkX3JuZygpOwotCi0JLyogd2UgbmVlZCB0aGlzIGZvciB0aGUgaG9tZSAqIGRpcmVjdG9yeS4gICovCi0JcHcgPSBnZXRwd3VpZChnZXR1aWQoKSk7Ci0JaWYgKCFwdykgewotCQlwcmludGYoIllvdSBkb24ndCBleGlzdCwgZ28gYXdheSFcbiIpOwotCQlleGl0KDEpOwotCX0KLQlpZiAoZ2V0aG9zdG5hbWUoaG9zdG5hbWUsIHNpemVvZihob3N0bmFtZSkpIDwgMCkgewotCQlwZXJyb3IoImdldGhvc3RuYW1lIik7Ci0JCWV4aXQoMSk7Ci0JfQotCi0Jd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgIkFlZ2lxcGNsQkhMaHZ4WHlGOmI6Zjp0OkQ6STpQOm06TjpuOiIKLQkgICAgIk86QzpyOmc6UjpUOkc6TTpTOnM6YTpWOlc6ejoiKSkgIT0gLTEpIHsKLQkJc3dpdGNoIChvcHQpIHsKLQkJY2FzZSAnQSc6Ci0JCQlnZW5fYWxsX2hvc3RrZXlzID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdiJzoKLQkJCWJpdHMgPSAodV9pbnQzMl90KXN0cnRvbnVtKG9wdGFyZywgMjU2LCAzMjc2OCwgJmVycnN0cik7Ci0JCQlpZiAoZXJyc3RyKQotCQkJCWZhdGFsKCJCaXRzIGhhcyBiYWQgdmFsdWUgJXMgKCVzKSIsCi0JCQkJCW9wdGFyZywgZXJyc3RyKTsKLQkJCWJyZWFrOwotCQljYXNlICdGJzoKLQkJCWZpbmRfaG9zdCA9IDE7Ci0JCQlycl9ob3N0bmFtZSA9IG9wdGFyZzsKLQkJCWJyZWFrOwotCQljYXNlICdIJzoKLQkJCWhhc2hfaG9zdHMgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ0knOgotCQkJY2VydF9rZXlfaWQgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAnUic6Ci0JCQlkZWxldGVfaG9zdCA9IDE7Ci0JCQlycl9ob3N0bmFtZSA9IG9wdGFyZzsKLQkJCWJyZWFrOwotCQljYXNlICdMJzoKLQkJCXNob3dfY2VydCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnbCc6Ci0JCQlwcmludF9maW5nZXJwcmludCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnQic6Ci0JCQlwcmludF9idWJibGViYWJibGUgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ20nOgotCQkJaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAiUkZDNDcxNiIpID09IDAgfHwKLQkJCSAgICBzdHJjYXNlY21wKG9wdGFyZywgInNzaDIiKSA9PSAwKSB7Ci0JCQkJY29udmVydF9mb3JtYXQgPSBGTVRfUkZDNDcxNjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChzdHJjYXNlY21wKG9wdGFyZywgIlBLQ1M4IikgPT0gMCkgewotCQkJCWNvbnZlcnRfZm9ybWF0ID0gRk1UX1BLQ1M4OwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAiUEVNIikgPT0gMCkgewotCQkJCWNvbnZlcnRfZm9ybWF0ID0gRk1UX1BFTTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZhdGFsKCJVbnN1cHBvcnRlZCBjb252ZXJzaW9uIGZvcm1hdCBcIiVzXCIiLCBvcHRhcmcpOwotCQljYXNlICduJzoKLQkJCWNlcnRfcHJpbmNpcGFscyA9IG9wdGFyZzsKLQkJCWJyZWFrOwotCQljYXNlICdwJzoKLQkJCWNoYW5nZV9wYXNzcGhyYXNlID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdjJzoKLQkJCWNoYW5nZV9jb21tZW50ID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdmJzoKLQkJCWlmIChzdHJsY3B5KGlkZW50aXR5X2ZpbGUsIG9wdGFyZywgc2l6ZW9mKGlkZW50aXR5X2ZpbGUpKSA+PQotCQkJICAgIHNpemVvZihpZGVudGl0eV9maWxlKSkKLQkJCQlmYXRhbCgiSWRlbnRpdHkgZmlsZW5hbWUgdG9vIGxvbmciKTsKLQkJCWhhdmVfaWRlbnRpdHkgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2cnOgotCQkJcHJpbnRfZ2VuZXJpYyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnUCc6Ci0JCQlpZGVudGl0eV9wYXNzcGhyYXNlID0gb3B0YXJnOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ04nOgotCQkJaWRlbnRpdHlfbmV3X3Bhc3NwaHJhc2UgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAnTyc6Ci0JCQlhZGRfY2VydF9vcHRpb24ob3B0YXJnKTsKLQkJCWJyZWFrOwotCQljYXNlICdDJzoKLQkJCWlkZW50aXR5X2NvbW1lbnQgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAncSc6Ci0JCQlxdWlldCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnZSc6Ci0JCWNhc2UgJ3gnOgotCQkJLyogZXhwb3J0IGtleSAqLwotCQkJY29udmVydF90byA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnaCc6Ci0JCQljZXJ0X2tleV90eXBlID0gU1NIMl9DRVJUX1RZUEVfSE9TVDsKLQkJCWNlcnRmbGFnc19mbGFncyA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSAnaSc6Ci0JCWNhc2UgJ1gnOgotCQkJLyogaW1wb3J0IGtleSAqLwotCQkJY29udmVydF9mcm9tID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICd5JzoKLQkJCXByaW50X3B1YmxpYyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAncyc6Ci0JCQljYV9rZXlfcGF0aCA9IG9wdGFyZzsKLQkJCWJyZWFrOwotCQljYXNlICd0JzoKLQkJCWtleV90eXBlX25hbWUgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAnRCc6Ci0JCQlwa2NzMTFwcm92aWRlciA9IG9wdGFyZzsKLQkJCWJyZWFrOwotCQljYXNlICd2JzoKLQkJCWlmIChsb2dfbGV2ZWwgPT0gU1lTTE9HX0xFVkVMX0lORk8pCi0JCQkJbG9nX2xldmVsID0gU1lTTE9HX0xFVkVMX0RFQlVHMTsKLQkJCWVsc2UgewotCQkJCWlmIChsb2dfbGV2ZWwgPj0gU1lTTE9HX0xFVkVMX0RFQlVHMSAmJgotCQkJCSAgICBsb2dfbGV2ZWwgPCBTWVNMT0dfTEVWRUxfREVCVUczKQotCQkJCQlsb2dfbGV2ZWwrKzsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICdyJzoKLQkJCXJyX2hvc3RuYW1lID0gb3B0YXJnOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1cnOgotCQkJZ2VuZXJhdG9yX3dhbnRlZCA9ICh1X2ludDMyX3Qpc3RydG9udW0ob3B0YXJnLCAxLAotCQkJICAgIFVJTlRfTUFYLCAmZXJyc3RyKTsKLQkJCWlmIChlcnJzdHIpCi0JCQkJZmF0YWwoIkRlc2lyZWQgZ2VuZXJhdG9yIGhhcyBiYWQgdmFsdWU6ICVzICglcykiLAotCQkJCQlvcHRhcmcsIGVycnN0cik7Ci0JCQlicmVhazsKLQkJY2FzZSAnYSc6Ci0JCQl0cmlhbHMgPSAodV9pbnQzMl90KXN0cnRvbnVtKG9wdGFyZywgMSwgVUlOVF9NQVgsICZlcnJzdHIpOwotCQkJaWYgKGVycnN0cikKLQkJCQlmYXRhbCgiSW52YWxpZCBudW1iZXIgb2YgdHJpYWxzOiAlcyAoJXMpIiwKLQkJCQkJb3B0YXJnLCBlcnJzdHIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ00nOgotCQkJbWVtb3J5ID0gKHVfaW50MzJfdClzdHJ0b251bShvcHRhcmcsIDEsIFVJTlRfTUFYLCAmZXJyc3RyKTsKLQkJCWlmIChlcnJzdHIpCi0JCQkJZmF0YWwoIk1lbW9yeSBsaW1pdCBpcyAlczogJXMiLCBlcnJzdHIsIG9wdGFyZyk7Ci0JCQlicmVhazsKLQkJY2FzZSAnRyc6Ci0JCQlkb19nZW5fY2FuZGlkYXRlcyA9IDE7Ci0JCQlpZiAoc3RybGNweShvdXRfZmlsZSwgb3B0YXJnLCBzaXplb2Yob3V0X2ZpbGUpKSA+PQotCQkJICAgIHNpemVvZihvdXRfZmlsZSkpCi0JCQkJZmF0YWwoIk91dHB1dCBmaWxlbmFtZSB0b28gbG9uZyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1QnOgotCQkJZG9fc2NyZWVuX2NhbmRpZGF0ZXMgPSAxOwotCQkJaWYgKHN0cmxjcHkob3V0X2ZpbGUsIG9wdGFyZywgc2l6ZW9mKG91dF9maWxlKSkgPj0KLQkJCSAgICBzaXplb2Yob3V0X2ZpbGUpKQotCQkJCWZhdGFsKCJPdXRwdXQgZmlsZW5hbWUgdG9vIGxvbmciKTsKLQkJCWJyZWFrOwotCQljYXNlICdTJzoKLQkJCS8qIFhYWCAtIGFsc28gY29tcGFyZSBsZW5ndGggYWdhaW5zdCBiaXRzICovCi0JCQlpZiAoQk5faGV4MmJuKCZzdGFydCwgb3B0YXJnKSA9PSAwKQotCQkJCWZhdGFsKCJJbnZhbGlkIHN0YXJ0IHBvaW50LiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1YnOgotCQkJcGFyc2VfY2VydF90aW1lcyhvcHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3onOgotCQkJY2VydF9zZXJpYWwgPSBzdHJ0b251bShvcHRhcmcsIDAsIExMT05HX01BWCwgJmVycnN0cik7Ci0JCQlpZiAoZXJyc3RyKQotCQkJCWZhdGFsKCJJbnZhbGlkIHNlcmlhbCBudW1iZXI6ICVzIiwgZXJyc3RyKTsKLQkJCWJyZWFrOwotCQljYXNlICc/JzoKLQkJZGVmYXVsdDoKLQkJCXVzYWdlKCk7Ci0JCX0KLQl9Ci0KLQkvKiByZWluaXQgKi8KLQlsb2dfaW5pdChhcmd2WzBdLCBsb2dfbGV2ZWwsIFNZU0xPR19GQUNJTElUWV9VU0VSLCAxKTsKLQotCWFyZ3YgKz0gb3B0aW5kOwotCWFyZ2MgLT0gb3B0aW5kOwotCi0JaWYgKGNhX2tleV9wYXRoICE9IE5VTEwpIHsKLQkJaWYgKGFyZ2MgPCAxKSB7Ci0JCQlwcmludGYoIlRvbyBmZXcgYXJndW1lbnRzLlxuIik7Ci0JCQl1c2FnZSgpOwotCQl9Ci0JfSBlbHNlIGlmIChhcmdjID4gMCkgewotCQlwcmludGYoIlRvbyBtYW55IGFyZ3VtZW50cy5cbiIpOwotCQl1c2FnZSgpOwotCX0KLQlpZiAoY2hhbmdlX3Bhc3NwaHJhc2UgJiYgY2hhbmdlX2NvbW1lbnQpIHsKLQkJcHJpbnRmKCJDYW4gb25seSBoYXZlIG9uZSBvZiAtcCBhbmQgLWMuXG4iKTsKLQkJdXNhZ2UoKTsKLQl9Ci0JaWYgKHByaW50X2ZpbmdlcnByaW50ICYmIChkZWxldGVfaG9zdCB8fCBoYXNoX2hvc3RzKSkgewotCQlwcmludGYoIkNhbm5vdCB1c2UgLWwgd2l0aCAtRCBvciAtUi5cbiIpOwotCQl1c2FnZSgpOwotCX0KLQlpZiAoY2Ffa2V5X3BhdGggIT0gTlVMTCkgewotCQlpZiAoY2VydF9rZXlfaWQgPT0gTlVMTCkKLQkJCWZhdGFsKCJNdXN0IHNwZWNpZnkga2V5IGlkICgtSSkgd2hlbiBjZXJ0aWZ5aW5nIik7Ci0JCWRvX2NhX3NpZ24ocHcsIGFyZ2MsIGFyZ3YpOwotCX0KLQlpZiAoc2hvd19jZXJ0KQotCQlkb19zaG93X2NlcnQocHcpOwotCWlmIChkZWxldGVfaG9zdCB8fCBoYXNoX2hvc3RzIHx8IGZpbmRfaG9zdCkKLQkJZG9fa25vd25faG9zdHMocHcsIHJyX2hvc3RuYW1lKTsKLQlpZiAocHJpbnRfZmluZ2VycHJpbnQgfHwgcHJpbnRfYnViYmxlYmFiYmxlKQotCQlkb19maW5nZXJwcmludChwdyk7Ci0JaWYgKGNoYW5nZV9wYXNzcGhyYXNlKQotCQlkb19jaGFuZ2VfcGFzc3BocmFzZShwdyk7Ci0JaWYgKGNoYW5nZV9jb21tZW50KQotCQlkb19jaGFuZ2VfY29tbWVudChwdyk7Ci0JaWYgKGNvbnZlcnRfdG8pCi0JCWRvX2NvbnZlcnRfdG8ocHcpOwotCWlmIChjb252ZXJ0X2Zyb20pCi0JCWRvX2NvbnZlcnRfZnJvbShwdyk7Ci0JaWYgKHByaW50X3B1YmxpYykKLQkJZG9fcHJpbnRfcHVibGljKHB3KTsKLQlpZiAocnJfaG9zdG5hbWUgIT0gTlVMTCkgewotCQl1bnNpZ25lZCBpbnQgbiA9IDA7Ci0KLQkJaWYgKGhhdmVfaWRlbnRpdHkpIHsKLQkJCW4gPSBkb19wcmludF9yZXNvdXJjZV9yZWNvcmQocHcsCi0JCQkgICAgaWRlbnRpdHlfZmlsZSwgcnJfaG9zdG5hbWUpOwotCQkJaWYgKG4gPT0gMCkgewotCQkJCXBlcnJvcihpZGVudGl0eV9maWxlKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJZXhpdCgwKTsKLQkJfSBlbHNlIHsKLQotCQkJbiArPSBkb19wcmludF9yZXNvdXJjZV9yZWNvcmQocHcsCi0JCQkgICAgX1BBVEhfSE9TVF9SU0FfS0VZX0ZJTEUsIHJyX2hvc3RuYW1lKTsKLQkJCW4gKz0gZG9fcHJpbnRfcmVzb3VyY2VfcmVjb3JkKHB3LAotCQkJICAgIF9QQVRIX0hPU1RfRFNBX0tFWV9GSUxFLCBycl9ob3N0bmFtZSk7Ci0KLQkJCWlmIChuID09IDApCi0JCQkJZmF0YWwoIm5vIGtleXMgZm91bmQuIik7Ci0JCQlleGl0KDApOwotCQl9Ci0JfQotCWlmIChwa2NzMTFwcm92aWRlciAhPSBOVUxMKQotCQlkb19kb3dubG9hZChwdyk7Ci0KLQlpZiAoZG9fZ2VuX2NhbmRpZGF0ZXMpIHsKLQkJRklMRSAqb3V0ID0gZm9wZW4ob3V0X2ZpbGUsICJ3Iik7Ci0KLQkJaWYgKG91dCA9PSBOVUxMKSB7Ci0JCQllcnJvcigiQ291bGRuJ3Qgb3BlbiBtb2R1bHVzIGNhbmRpZGF0ZSBmaWxlIFwiJXNcIjogJXMiLAotCQkJICAgIG91dF9maWxlLCBzdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuICgxKTsKLQkJfQotCQlpZiAoYml0cyA9PSAwKQotCQkJYml0cyA9IERFRkFVTFRfQklUUzsKLQkJaWYgKGdlbl9jYW5kaWRhdGVzKG91dCwgbWVtb3J5LCBiaXRzLCBzdGFydCkgIT0gMCkKLQkJCWZhdGFsKCJtb2R1bHVzIGNhbmRpZGF0ZSBnZW5lcmF0aW9uIGZhaWxlZCIpOwotCi0JCXJldHVybiAoMCk7Ci0JfQotCi0JaWYgKGRvX3NjcmVlbl9jYW5kaWRhdGVzKSB7Ci0JCUZJTEUgKmluOwotCQlGSUxFICpvdXQgPSBmb3BlbihvdXRfZmlsZSwgInciKTsKLQotCQlpZiAoaGF2ZV9pZGVudGl0eSAmJiBzdHJjbXAoaWRlbnRpdHlfZmlsZSwgIi0iKSAhPSAwKSB7Ci0JCQlpZiAoKGluID0gZm9wZW4oaWRlbnRpdHlfZmlsZSwgInIiKSkgPT0gTlVMTCkgewotCQkJCWZhdGFsKCJDb3VsZG4ndCBvcGVuIG1vZHVsdXMgY2FuZGlkYXRlICIKLQkJCQkgICAgImZpbGUgXCIlc1wiOiAlcyIsIGlkZW50aXR5X2ZpbGUsCi0JCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJaW4gPSBzdGRpbjsKLQotCQlpZiAob3V0ID09IE5VTEwpIHsKLQkJCWZhdGFsKCJDb3VsZG4ndCBvcGVuIG1vZHVsaSBmaWxlIFwiJXNcIjogJXMiLAotCQkJICAgIG91dF9maWxlLCBzdHJlcnJvcihlcnJubykpOwotCQl9Ci0JCWlmIChwcmltZV90ZXN0KGluLCBvdXQsIHRyaWFscywgZ2VuZXJhdG9yX3dhbnRlZCkgIT0gMCkKLQkJCWZhdGFsKCJtb2R1bHVzIHNjcmVlbmluZyBmYWlsZWQiKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0KLQlpZiAoZ2VuX2FsbF9ob3N0a2V5cykgewotCQlkb19nZW5fYWxsX2hvc3RrZXlzKHB3KTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0KLQlhcmM0cmFuZG9tX3N0aXIoKTsKLQotCWlmIChrZXlfdHlwZV9uYW1lID09IE5VTEwpCi0JCWtleV90eXBlX25hbWUgPSAicnNhIjsKLQotCXR5cGUgPSBrZXlfdHlwZV9mcm9tX25hbWUoa2V5X3R5cGVfbmFtZSk7Ci0JdHlwZV9iaXRzX3ZhbGlkKHR5cGUsICZiaXRzKTsKLQotCWlmICghcXVpZXQpCi0JCXByaW50ZigiR2VuZXJhdGluZyBwdWJsaWMvcHJpdmF0ZSAlcyBrZXkgcGFpci5cbiIsIGtleV90eXBlX25hbWUpOwotCXByaXZhdGUgPSBrZXlfZ2VuZXJhdGUodHlwZSwgYml0cyk7Ci0JaWYgKHByaXZhdGUgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImtleV9nZW5lcmF0ZSBmYWlsZWRcbiIpOwotCQlleGl0KDEpOwotCX0KLQlwdWJsaWMgID0ga2V5X2Zyb21fcHJpdmF0ZShwcml2YXRlKTsKLQotCWlmICghaGF2ZV9pZGVudGl0eSkKLQkJYXNrX2ZpbGVuYW1lKHB3LCAiRW50ZXIgZmlsZSBpbiB3aGljaCB0byBzYXZlIHRoZSBrZXkiKTsKLQotCS8qIENyZWF0ZSB+Ly5zc2ggZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4gKi8KLQlzbnByaW50Zihkb3Rzc2hkaXIsIHNpemVvZiBkb3Rzc2hkaXIsICIlcy8lcyIsCi0JICAgIHB3LT5wd19kaXIsIF9QQVRIX1NTSF9VU0VSX0RJUik7Ci0JaWYgKHN0cnN0cihpZGVudGl0eV9maWxlLCBkb3Rzc2hkaXIpICE9IE5VTEwpIHsKLQkJaWYgKHN0YXQoZG90c3NoZGlyLCAmc3QpIDwgMCkgewotCQkJaWYgKGVycm5vICE9IEVOT0VOVCkgewotCQkJCWVycm9yKCJDb3VsZCBub3Qgc3RhdCAlczogJXMiLCBkb3Rzc2hkaXIsCi0JCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCQl9IGVsc2UgaWYgKG1rZGlyKGRvdHNzaGRpciwgMDcwMCkgPCAwKSB7Ci0JCQkJZXJyb3IoIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5ICclcyc6ICVzIiwKLQkJCQkgICAgZG90c3NoZGlyLCBzdHJlcnJvcihlcnJubykpOwotCQkJfSBlbHNlIGlmICghcXVpZXQpCi0JCQkJcHJpbnRmKCJDcmVhdGVkIGRpcmVjdG9yeSAnJXMnLlxuIiwgZG90c3NoZGlyKTsKLQkJfQotCX0KLQkvKiBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cywgYXNrIHRoZSB1c2VyIHRvIGNvbmZpcm0uICovCi0JaWYgKHN0YXQoaWRlbnRpdHlfZmlsZSwgJnN0KSA+PSAwKSB7Ci0JCWNoYXIgeWVzbm9bM107Ci0JCXByaW50ZigiJXMgYWxyZWFkeSBleGlzdHMuXG4iLCBpZGVudGl0eV9maWxlKTsKLQkJcHJpbnRmKCJPdmVyd3JpdGUgKHkvbik/ICIpOwotCQlmZmx1c2goc3Rkb3V0KTsKLQkJaWYgKGZnZXRzKHllc25vLCBzaXplb2YoeWVzbm8pLCBzdGRpbikgPT0gTlVMTCkKLQkJCWV4aXQoMSk7Ci0JCWlmICh5ZXNub1swXSAhPSAneScgJiYgeWVzbm9bMF0gIT0gJ1knKQotCQkJZXhpdCgxKTsKLQl9Ci0JLyogQXNrIGZvciBhIHBhc3NwaHJhc2UgKHR3aWNlKS4gKi8KLQlpZiAoaWRlbnRpdHlfcGFzc3BocmFzZSkKLQkJcGFzc3BocmFzZTEgPSB4c3RyZHVwKGlkZW50aXR5X3Bhc3NwaHJhc2UpOwotCWVsc2UgaWYgKGlkZW50aXR5X25ld19wYXNzcGhyYXNlKQotCQlwYXNzcGhyYXNlMSA9IHhzdHJkdXAoaWRlbnRpdHlfbmV3X3Bhc3NwaHJhc2UpOwotCWVsc2UgewotcGFzc3BocmFzZV9hZ2FpbjoKLQkJcGFzc3BocmFzZTEgPQotCQkJcmVhZF9wYXNzcGhyYXNlKCJFbnRlciBwYXNzcGhyYXNlIChlbXB0eSBmb3Igbm8gIgotCQkJICAgICJwYXNzcGhyYXNlKTogIiwgUlBfQUxMT1dfU1RESU4pOwotCQlwYXNzcGhyYXNlMiA9IHJlYWRfcGFzc3BocmFzZSgiRW50ZXIgc2FtZSBwYXNzcGhyYXNlIGFnYWluOiAiLAotCQkgICAgUlBfQUxMT1dfU1RESU4pOwotCQlpZiAoc3RyY21wKHBhc3NwaHJhc2UxLCBwYXNzcGhyYXNlMikgIT0gMCkgewotCQkJLyoKLQkJCSAqIFRoZSBwYXNzcGhyYXNlcyBkbyBub3QgbWF0Y2guICBDbGVhciB0aGVtIGFuZAotCQkJICogcmV0cnkuCi0JCQkgKi8KLQkJCW1lbXNldChwYXNzcGhyYXNlMSwgMCwgc3RybGVuKHBhc3NwaHJhc2UxKSk7Ci0JCQltZW1zZXQocGFzc3BocmFzZTIsIDAsIHN0cmxlbihwYXNzcGhyYXNlMikpOwotCQkJeGZyZWUocGFzc3BocmFzZTEpOwotCQkJeGZyZWUocGFzc3BocmFzZTIpOwotCQkJcHJpbnRmKCJQYXNzcGhyYXNlcyBkbyBub3QgbWF0Y2guICBUcnkgYWdhaW4uXG4iKTsKLQkJCWdvdG8gcGFzc3BocmFzZV9hZ2FpbjsKLQkJfQotCQkvKiBDbGVhciB0aGUgb3RoZXIgY29weSBvZiB0aGUgcGFzc3BocmFzZS4gKi8KLQkJbWVtc2V0KHBhc3NwaHJhc2UyLCAwLCBzdHJsZW4ocGFzc3BocmFzZTIpKTsKLQkJeGZyZWUocGFzc3BocmFzZTIpOwotCX0KLQotCWlmIChpZGVudGl0eV9jb21tZW50KSB7Ci0JCXN0cmxjcHkoY29tbWVudCwgaWRlbnRpdHlfY29tbWVudCwgc2l6ZW9mKGNvbW1lbnQpKTsKLQl9IGVsc2UgewotCQkvKiBDcmVhdGUgZGVmYXVsdCBjb21tZW50IGZpZWxkIGZvciB0aGUgcGFzc3BocmFzZS4gKi8KLQkJc25wcmludGYoY29tbWVudCwgc2l6ZW9mIGNvbW1lbnQsICIlc0AlcyIsIHB3LT5wd19uYW1lLCBob3N0bmFtZSk7Ci0JfQotCi0JLyogU2F2ZSB0aGUga2V5IHdpdGggdGhlIGdpdmVuIHBhc3NwaHJhc2UgYW5kIGNvbW1lbnQuICovCi0JaWYgKCFrZXlfc2F2ZV9wcml2YXRlKHByaXZhdGUsIGlkZW50aXR5X2ZpbGUsIHBhc3NwaHJhc2UxLCBjb21tZW50KSkgewotCQlwcmludGYoIlNhdmluZyB0aGUga2V5IGZhaWxlZDogJXMuXG4iLCBpZGVudGl0eV9maWxlKTsKLQkJbWVtc2V0KHBhc3NwaHJhc2UxLCAwLCBzdHJsZW4ocGFzc3BocmFzZTEpKTsKLQkJeGZyZWUocGFzc3BocmFzZTEpOwotCQlleGl0KDEpOwotCX0KLQkvKiBDbGVhciB0aGUgcGFzc3BocmFzZS4gKi8KLQltZW1zZXQocGFzc3BocmFzZTEsIDAsIHN0cmxlbihwYXNzcGhyYXNlMSkpOwotCXhmcmVlKHBhc3NwaHJhc2UxKTsKLQotCS8qIENsZWFyIHRoZSBwcml2YXRlIGtleSBhbmQgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiAqLwotCWtleV9mcmVlKHByaXZhdGUpOwotCWFyYzRyYW5kb21fc3RpcigpOwotCi0JaWYgKCFxdWlldCkKLQkJcHJpbnRmKCJZb3VyIGlkZW50aWZpY2F0aW9uIGhhcyBiZWVuIHNhdmVkIGluICVzLlxuIiwgaWRlbnRpdHlfZmlsZSk7Ci0KLQlzdHJsY2F0KGlkZW50aXR5X2ZpbGUsICIucHViIiwgc2l6ZW9mKGlkZW50aXR5X2ZpbGUpKTsKLQlmZCA9IG9wZW4oaWRlbnRpdHlfZmlsZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY0NCk7Ci0JaWYgKGZkID09IC0xKSB7Ci0JCXByaW50ZigiQ291bGQgbm90IHNhdmUgeW91ciBwdWJsaWMga2V5IGluICVzXG4iLCBpZGVudGl0eV9maWxlKTsKLQkJZXhpdCgxKTsKLQl9Ci0JZiA9IGZkb3BlbihmZCwgInciKTsKLQlpZiAoZiA9PSBOVUxMKSB7Ci0JCXByaW50ZigiZmRvcGVuICVzIGZhaWxlZFxuIiwgaWRlbnRpdHlfZmlsZSk7Ci0JCWV4aXQoMSk7Ci0JfQotCWlmICgha2V5X3dyaXRlKHB1YmxpYywgZikpCi0JCWZwcmludGYoc3RkZXJyLCAid3JpdGUga2V5IGZhaWxlZFxuIik7Ci0JZnByaW50ZihmLCAiICVzXG4iLCBjb21tZW50KTsKLQlmY2xvc2UoZik7Ci0KLQlpZiAoIXF1aWV0KSB7Ci0JCWNoYXIgKmZwID0ga2V5X2ZpbmdlcnByaW50KHB1YmxpYywgU1NIX0ZQX01ENSwgU1NIX0ZQX0hFWCk7Ci0JCWNoYXIgKnJhID0ga2V5X2ZpbmdlcnByaW50KHB1YmxpYywgU1NIX0ZQX01ENSwKLQkJICAgIFNTSF9GUF9SQU5ET01BUlQpOwotCQlwcmludGYoIllvdXIgcHVibGljIGtleSBoYXMgYmVlbiBzYXZlZCBpbiAlcy5cbiIsCi0JCSAgICBpZGVudGl0eV9maWxlKTsKLQkJcHJpbnRmKCJUaGUga2V5IGZpbmdlcnByaW50IGlzOlxuIik7Ci0JCXByaW50ZigiJXMgJXNcbiIsIGZwLCBjb21tZW50KTsKLQkJcHJpbnRmKCJUaGUga2V5J3MgcmFuZG9tYXJ0IGltYWdlIGlzOlxuIik7Ci0JCXByaW50ZigiJXNcbiIsIHJhKTsKLQkJeGZyZWUocmEpOwotCQl4ZnJlZShmcCk7Ci0JfQotCi0Ja2V5X2ZyZWUocHVibGljKTsKLQlleGl0KDApOwotfQpkaWZmIC0tZ2l0IGEvc3NoLWtleXNjYW4uMCBiL3NzaC1rZXlzY2FuLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZGIwZDQuLjAwMDAwMDAKLS0tIGEvc3NoLWtleXNjYW4uMAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi1TU0gtS0VZU0NBTigxKSAgICAgICAgICAgICBPcGVuQlNEIFJlZmVyZW5jZSBNYW51YWwgICAgICAgICAgICAgU1NILUtFWVNDQU4oMSkKLQotTkFNRQotICAgICBzc2gta2V5c2NhbiAtIGdhdGhlciBzc2ggcHVibGljIGtleXMKLQotU1lOT1BTSVMKLSAgICAgc3NoLWtleXNjYW4gWy00Nkh2XSBbLWYgZmlsZV0gWy1wIHBvcnRdIFstVCB0aW1lb3V0XSBbLXQgdHlwZV0KLSAgICAgICAgICAgICAgICAgW2hvc3QgfCBhZGRybGlzdCBuYW1lbGlzdF0gLi4uCi0KLURFU0NSSVBUSU9OCi0gICAgIHNzaC1rZXlzY2FuIGlzIGEgdXRpbGl0eSBmb3IgZ2F0aGVyaW5nIHRoZSBwdWJsaWMgc3NoIGhvc3Qga2V5cyBvZiBhCi0gICAgIG51bWJlciBvZiBob3N0cy4gIEl0IHdhcyBkZXNpZ25lZCB0byBhaWQgaW4gYnVpbGRpbmcgYW5kIHZlcmlmeWluZwotICAgICBzc2hfa25vd25faG9zdHMgZmlsZXMuICBzc2gta2V5c2NhbiBwcm92aWRlcyBhIG1pbmltYWwgaW50ZXJmYWNlIHN1aXRhYmxlCi0gICAgIGZvciB1c2UgYnkgc2hlbGwgYW5kIHBlcmwgc2NyaXB0cy4KLQotICAgICBzc2gta2V5c2NhbiB1c2VzIG5vbi1ibG9ja2luZyBzb2NrZXQgSS9PIHRvIGNvbnRhY3QgYXMgbWFueSBob3N0cyBhcwotICAgICBwb3NzaWJsZSBpbiBwYXJhbGxlbCwgc28gaXQgaXMgdmVyeSBlZmZpY2llbnQuICBUaGUga2V5cyBmcm9tIGEgZG9tYWluIG9mCi0gICAgIDEsMDAwIGhvc3RzIGNhbiBiZSBjb2xsZWN0ZWQgaW4gdGVucyBvZiBzZWNvbmRzLCBldmVuIHdoZW4gc29tZSBvZiB0aG9zZQotICAgICBob3N0cyBhcmUgZG93biBvciBkbyBub3QgcnVuIHNzaC4gIEZvciBzY2FubmluZywgb25lIGRvZXMgbm90IG5lZWQgbG9naW4KLSAgICAgYWNjZXNzIHRvIHRoZSBtYWNoaW5lcyB0aGF0IGFyZSBiZWluZyBzY2FubmVkLCBub3IgZG9lcyB0aGUgc2Nhbm5pbmcKLSAgICAgcHJvY2VzcyBpbnZvbHZlIGFueSBlbmNyeXB0aW9uLgotCi0gICAgIFRoZSBvcHRpb25zIGFyZSBhcyBmb2xsb3dzOgotCi0gICAgIC00ICAgICAgRm9yY2VzIHNzaC1rZXlzY2FuIHRvIHVzZSBJUHY0IGFkZHJlc3NlcyBvbmx5LgotCi0gICAgIC02ICAgICAgRm9yY2VzIHNzaC1rZXlzY2FuIHRvIHVzZSBJUHY2IGFkZHJlc3NlcyBvbmx5LgotCi0gICAgIC1mIGZpbGUKLSAgICAgICAgICAgICBSZWFkIGhvc3RzIG9yIGFkZHJsaXN0IG5hbWVsaXN0IHBhaXJzIGZyb20gdGhpcyBmaWxlLCBvbmUgcGVyCi0gICAgICAgICAgICAgbGluZS4gIElmIC0gaXMgc3VwcGxpZWQgaW5zdGVhZCBvZiBhIGZpbGVuYW1lLCBzc2gta2V5c2NhbiB3aWxsCi0gICAgICAgICAgICAgcmVhZCBob3N0cyBvciBhZGRybGlzdCBuYW1lbGlzdCBwYWlycyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4KLQotICAgICAtSCAgICAgIEhhc2ggYWxsIGhvc3RuYW1lcyBhbmQgYWRkcmVzc2VzIGluIHRoZSBvdXRwdXQuICBIYXNoZWQgbmFtZXMgbWF5Ci0gICAgICAgICAgICAgYmUgdXNlZCBub3JtYWxseSBieSBzc2ggYW5kIHNzaGQsIGJ1dCB0aGV5IGRvIG5vdCByZXZlYWwKLSAgICAgICAgICAgICBpZGVudGlmeWluZyBpbmZvcm1hdGlvbiBzaG91bGQgdGhlIGZpbGUncyBjb250ZW50cyBiZSBkaXNjbG9zZWQuCi0KLSAgICAgLXAgcG9ydAotICAgICAgICAgICAgIFBvcnQgdG8gY29ubmVjdCB0byBvbiB0aGUgcmVtb3RlIGhvc3QuCi0KLSAgICAgLVQgdGltZW91dAotICAgICAgICAgICAgIFNldCB0aGUgdGltZW91dCBmb3IgY29ubmVjdGlvbiBhdHRlbXB0cy4gIElmIHRpbWVvdXQgc2Vjb25kcyBoYXZlCi0gICAgICAgICAgICAgZWxhcHNlZCBzaW5jZSBhIGNvbm5lY3Rpb24gd2FzIGluaXRpYXRlZCB0byBhIGhvc3Qgb3Igc2luY2UgdGhlCi0gICAgICAgICAgICAgbGFzdCB0aW1lIGFueXRoaW5nIHdhcyByZWFkIGZyb20gdGhhdCBob3N0LCB0aGVuIHRoZSBjb25uZWN0aW9uCi0gICAgICAgICAgICAgaXMgY2xvc2VkIGFuZCB0aGUgaG9zdCBpbiBxdWVzdGlvbiBjb25zaWRlcmVkIHVuYXZhaWxhYmxlLgotICAgICAgICAgICAgIERlZmF1bHQgaXMgNSBzZWNvbmRzLgotCi0gICAgIC10IHR5cGUKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGtleSB0byBmZXRjaCBmcm9tIHRoZSBzY2FubmVkIGhvc3RzLgotICAgICAgICAgICAgIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgcnNhMScnIGZvciBwcm90b2NvbCB2ZXJzaW9uIDEgYW5kCi0gICAgICAgICAgICAgYGBkc2EnJywgYGBlY2RzYScnIG9yIGBgcnNhJycgZm9yIHByb3RvY29sIHZlcnNpb24gMi4gIE11bHRpcGxlCi0gICAgICAgICAgICAgdmFsdWVzIG1heSBiZSBzcGVjaWZpZWQgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggY29tbWFzLiAgVGhlCi0gICAgICAgICAgICAgZGVmYXVsdCBpcyBgYHJzYScnLgotCi0gICAgIC12ICAgICAgVmVyYm9zZSBtb2RlLiAgQ2F1c2VzIHNzaC1rZXlzY2FuIHRvIHByaW50IGRlYnVnZ2luZyBtZXNzYWdlcwotICAgICAgICAgICAgIGFib3V0IGl0cyBwcm9ncmVzcy4KLQotU0VDVVJJVFkKLSAgICAgSWYgYW4gc3NoX2tub3duX2hvc3RzIGZpbGUgaXMgY29uc3RydWN0ZWQgdXNpbmcgc3NoLWtleXNjYW4gd2l0aG91dAotICAgICB2ZXJpZnlpbmcgdGhlIGtleXMsIHVzZXJzIHdpbGwgYmUgdnVsbmVyYWJsZSB0byBtYW4gaW4gdGhlIG1pZGRsZQotICAgICBhdHRhY2tzLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZSBzZWN1cml0eSBtb2RlbCBhbGxvd3Mgc3VjaCBhIHJpc2ssCi0gICAgIHNzaC1rZXlzY2FuIGNhbiBoZWxwIGluIHRoZSBkZXRlY3Rpb24gb2YgdGFtcGVyZWQga2V5ZmlsZXMgb3IgbWFuIGluIHRoZQotICAgICBtaWRkbGUgYXR0YWNrcyB3aGljaCBoYXZlIGJlZ3VuIGFmdGVyIHRoZSBzc2hfa25vd25faG9zdHMgZmlsZSB3YXMKLSAgICAgY3JlYXRlZC4KLQotRklMRVMKLSAgICAgSW5wdXQgZm9ybWF0OgotCi0gICAgIDEuMi4zLjQsMS4yLjQuNCBuYW1lLm15LmRvbWFpbixuYW1lLG4ubXkuZG9tYWluLG4sMS4yLjMuNCwxLjIuNC40Ci0KLSAgICAgT3V0cHV0IGZvcm1hdCBmb3IgcnNhMSBrZXlzOgotCi0gICAgIGhvc3Qtb3ItbmFtZWxpc3QgYml0cyBleHBvbmVudCBtb2R1bHVzCi0KLSAgICAgT3V0cHV0IGZvcm1hdCBmb3IgcnNhLCBkc2EgYW5kIGVjZHNhIGtleXM6Ci0KLSAgICAgaG9zdC1vci1uYW1lbGlzdCBrZXl0eXBlIGJhc2U2NC1lbmNvZGVkLWtleQotCi0gICAgIFdoZXJlIGtleXR5cGUgaXMgZWl0aGVyIGBgZWNkc2Etc2hhMi1uaXN0cDI1NicnLCBgYGVjZHNhLXNoYTItbmlzdHAzODQnJywKLSAgICAgYGBlY2RzYS1zaGEyLW5pc3RwNTIxJycsIGBgc3NoLWRzcycnIG9yIGBgc3NoLXJzYScnLgotCi0gICAgIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cwotCi1FWEFNUExFUwotICAgICBQcmludCB0aGUgcnNhIGhvc3Qga2V5IGZvciBtYWNoaW5lIGhvc3RuYW1lOgotCi0gICAgICQgc3NoLWtleXNjYW4gaG9zdG5hbWUKLQotICAgICBGaW5kIGFsbCBob3N0cyBmcm9tIHRoZSBmaWxlIHNzaF9ob3N0cyB3aGljaCBoYXZlIG5ldyBvciBkaWZmZXJlbnQga2V5cwotICAgICBmcm9tIHRob3NlIGluIHRoZSBzb3J0ZWQgZmlsZSBzc2hfa25vd25faG9zdHM6Ci0KLSAgICAgJCBzc2gta2V5c2NhbiAtdCByc2EsZHNhLGVjZHNhIC1mIHNzaF9ob3N0cyB8IFwKLSAgICAgICAgICAgICBzb3J0IC11IC0gc3NoX2tub3duX2hvc3RzIHwgZGlmZiBzc2hfa25vd25faG9zdHMgLQotCi1TRUUgQUxTTwotICAgICBzc2goMSksIHNzaGQoOCkKLQotQVVUSE9SUwotICAgICBEYXZpZCBNYXppZXJlcyA8ZG1AbGNzLm1pdC5lZHU+IHdyb3RlIHRoZSBpbml0aWFsIHZlcnNpb24sIGFuZCBXYXluZQotICAgICBEYXZpc29uIDx3YXluZWRAdXNlcnMuc291cmNlZm9yZ2UubmV0PiBhZGRlZCBzdXBwb3J0IGZvciBwcm90b2NvbCB2ZXJzaW9uCi0gICAgIDIuCi0KLUJVR1MKLSAgICAgSXQgZ2VuZXJhdGVzICJDb25uZWN0aW9uIGNsb3NlZCBieSByZW1vdGUgaG9zdCIgbWVzc2FnZXMgb24gdGhlIGNvbnNvbGVzCi0gICAgIG9mIGFsbCB0aGUgbWFjaGluZXMgaXQgc2NhbnMgaWYgdGhlIHNlcnZlciBpcyBvbGRlciB0aGFuIHZlcnNpb24gMi45LgotICAgICBUaGlzIGlzIGJlY2F1c2UgaXQgb3BlbnMgYSBjb25uZWN0aW9uIHRvIHRoZSBzc2ggcG9ydCwgcmVhZHMgdGhlIHB1YmxpYwotICAgICBrZXksIGFuZCBkcm9wcyB0aGUgY29ubmVjdGlvbiBhcyBzb29uIGFzIGl0IGdldHMgdGhlIGtleS4KLQotT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgICBBdWd1c3QgMzEsIDIwMTAgICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9zc2gta2V5c2Nhbi4xIGIvc3NoLWtleXNjYW4uMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5YmI2ZS4uMDAwMDAwMAotLS0gYS9zc2gta2V5c2Nhbi4xCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS5cIgkkT3BlbkJTRDogc3NoLWtleXNjYW4uMSx2IDEuMjkgMjAxMC8wOC8zMSAxMTo1NDo0NSBkam0gRXhwICQKLS5cIgotLlwiIENvcHlyaWdodCAxOTk1LCAxOTk2IGJ5IERhdmlkIE1hemllcmVzIDxkbUBsY3MubWl0LmVkdT4uCi0uXCIKLS5cIiBNb2RpZmljYXRpb24gYW5kIHJlZGlzdHJpYnV0aW9uIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGlzCi0uXCIgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgZHVlIGNyZWRpdCBpcyBnaXZlbiB0byB0aGUgYXV0aG9yIGFuZCB0aGUKLS5cIiBPcGVuQlNEIHByb2plY3QgYnkgbGVhdmluZyB0aGlzIGNvcHlyaWdodCBub3RpY2UgaW50YWN0LgotLlwiCi0uRGQgJE1kb2NkYXRlOiBBdWd1c3QgMzEgMjAxMCAkCi0uRHQgU1NILUtFWVNDQU4gMQotLk9zCi0uU2ggTkFNRQotLk5tIHNzaC1rZXlzY2FuCi0uTmQgZ2F0aGVyIHNzaCBwdWJsaWMga2V5cwotLlNoIFNZTk9QU0lTCi0uTm0gc3NoLWtleXNjYW4KLS5CayAtd29yZHMKLS5PcCBGbCA0Nkh2Ci0uT3AgRmwgZiBBciBmaWxlCi0uT3AgRmwgcCBBciBwb3J0Ci0uT3AgRmwgVCBBciB0aW1lb3V0Ci0uT3AgRmwgdCBBciB0eXBlCi0uT3AgQXIgaG9zdCB8IGFkZHJsaXN0IG5hbWVsaXN0Ci0uQXIgLi4uCi0uRWsKLS5TaCBERVNDUklQVElPTgotLk5tCi1pcyBhIHV0aWxpdHkgZm9yIGdhdGhlcmluZyB0aGUgcHVibGljIHNzaCBob3N0IGtleXMgb2YgYSBudW1iZXIgb2YKLWhvc3RzLgotSXQgd2FzIGRlc2lnbmVkIHRvIGFpZCBpbiBidWlsZGluZyBhbmQgdmVyaWZ5aW5nCi0uUGEgc3NoX2tub3duX2hvc3RzCi1maWxlcy4KLS5ObQotcHJvdmlkZXMgYSBtaW5pbWFsIGludGVyZmFjZSBzdWl0YWJsZSBmb3IgdXNlIGJ5IHNoZWxsIGFuZCBwZXJsCi1zY3JpcHRzLgotLlBwCi0uTm0KLXVzZXMgbm9uLWJsb2NraW5nIHNvY2tldCBJL08gdG8gY29udGFjdCBhcyBtYW55IGhvc3RzIGFzIHBvc3NpYmxlIGluCi1wYXJhbGxlbCwgc28gaXQgaXMgdmVyeSBlZmZpY2llbnQuCi1UaGUga2V5cyBmcm9tIGEgZG9tYWluIG9mIDEsMDAwCi1ob3N0cyBjYW4gYmUgY29sbGVjdGVkIGluIHRlbnMgb2Ygc2Vjb25kcywgZXZlbiB3aGVuIHNvbWUgb2YgdGhvc2UKLWhvc3RzIGFyZSBkb3duIG9yIGRvIG5vdCBydW4gc3NoLgotRm9yIHNjYW5uaW5nLCBvbmUgZG9lcyBub3QgbmVlZAotbG9naW4gYWNjZXNzIHRvIHRoZSBtYWNoaW5lcyB0aGF0IGFyZSBiZWluZyBzY2FubmVkLCBub3IgZG9lcyB0aGUKLXNjYW5uaW5nIHByb2Nlc3MgaW52b2x2ZSBhbnkgZW5jcnlwdGlvbi4KLS5QcAotVGhlIG9wdGlvbnMgYXJlIGFzIGZvbGxvd3M6Ci0uQmwgLXRhZyAtd2lkdGggRHMKLS5JdCBGbCA0Ci1Gb3JjZXMKLS5ObQotdG8gdXNlIElQdjQgYWRkcmVzc2VzIG9ubHkuCi0uSXQgRmwgNgotRm9yY2VzCi0uTm0KLXRvIHVzZSBJUHY2IGFkZHJlc3NlcyBvbmx5LgotLkl0IEZsIGYgQXIgZmlsZQotUmVhZCBob3N0cyBvcgotLlBhIGFkZHJsaXN0IG5hbWVsaXN0Ci1wYWlycyBmcm9tIHRoaXMgZmlsZSwgb25lIHBlciBsaW5lLgotSWYKLS5QYSAtCi1pcyBzdXBwbGllZCBpbnN0ZWFkIG9mIGEgZmlsZW5hbWUsCi0uTm0KLXdpbGwgcmVhZCBob3N0cyBvcgotLlBhIGFkZHJsaXN0IG5hbWVsaXN0Ci1wYWlycyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4KLS5JdCBGbCBICi1IYXNoIGFsbCBob3N0bmFtZXMgYW5kIGFkZHJlc3NlcyBpbiB0aGUgb3V0cHV0LgotSGFzaGVkIG5hbWVzIG1heSBiZSB1c2VkIG5vcm1hbGx5IGJ5Ci0uTm0gc3NoCi1hbmQKLS5ObSBzc2hkICwKLWJ1dCB0aGV5IGRvIG5vdCByZXZlYWwgaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gc2hvdWxkIHRoZSBmaWxlJ3MgY29udGVudHMKLWJlIGRpc2Nsb3NlZC4KLS5JdCBGbCBwIEFyIHBvcnQKLVBvcnQgdG8gY29ubmVjdCB0byBvbiB0aGUgcmVtb3RlIGhvc3QuCi0uSXQgRmwgVCBBciB0aW1lb3V0Ci1TZXQgdGhlIHRpbWVvdXQgZm9yIGNvbm5lY3Rpb24gYXR0ZW1wdHMuCi1JZgotLlBhIHRpbWVvdXQKLXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIGEgY29ubmVjdGlvbiB3YXMgaW5pdGlhdGVkIHRvIGEgaG9zdCBvciBzaW5jZSB0aGUKLWxhc3QgdGltZSBhbnl0aGluZyB3YXMgcmVhZCBmcm9tIHRoYXQgaG9zdCwgdGhlbiB0aGUgY29ubmVjdGlvbiBpcwotY2xvc2VkIGFuZCB0aGUgaG9zdCBpbiBxdWVzdGlvbiBjb25zaWRlcmVkIHVuYXZhaWxhYmxlLgotRGVmYXVsdCBpcyA1IHNlY29uZHMuCi0uSXQgRmwgdCBBciB0eXBlCi1TcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGtleSB0byBmZXRjaCBmcm9tIHRoZSBzY2FubmVkIGhvc3RzLgotVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmUKLS5EcSByc2ExCi1mb3IgcHJvdG9jb2wgdmVyc2lvbiAxIGFuZAotLkRxIGRzYSAsCi0uRHEgZWNkc2EKLW9yCi0uRHEgcnNhCi1mb3IgcHJvdG9jb2wgdmVyc2lvbiAyLgotTXVsdGlwbGUgdmFsdWVzIG1heSBiZSBzcGVjaWZpZWQgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggY29tbWFzLgotVGhlIGRlZmF1bHQgaXMKLS5EcSByc2EgLgotLkl0IEZsIHYKLVZlcmJvc2UgbW9kZS4KLUNhdXNlcwotLk5tCi10byBwcmludCBkZWJ1Z2dpbmcgbWVzc2FnZXMgYWJvdXQgaXRzIHByb2dyZXNzLgotLkVsCi0uU2ggU0VDVVJJVFkKLUlmIGFuIHNzaF9rbm93bl9ob3N0cyBmaWxlIGlzIGNvbnN0cnVjdGVkIHVzaW5nCi0uTm0KLXdpdGhvdXQgdmVyaWZ5aW5nIHRoZSBrZXlzLCB1c2VycyB3aWxsIGJlIHZ1bG5lcmFibGUgdG8KLS5FbSBtYW4gaW4gdGhlIG1pZGRsZQotYXR0YWNrcy4KLU9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgc2VjdXJpdHkgbW9kZWwgYWxsb3dzIHN1Y2ggYSByaXNrLAotLk5tCi1jYW4gaGVscCBpbiB0aGUgZGV0ZWN0aW9uIG9mIHRhbXBlcmVkIGtleWZpbGVzIG9yIG1hbiBpbiB0aGUgbWlkZGxlCi1hdHRhY2tzIHdoaWNoIGhhdmUgYmVndW4gYWZ0ZXIgdGhlIHNzaF9rbm93bl9ob3N0cyBmaWxlIHdhcyBjcmVhdGVkLgotLlNoIEZJTEVTCi0uUGEgSW5wdXQgZm9ybWF0OgotLkJkIC1saXRlcmFsCi0xLjIuMy40LDEuMi40LjQgbmFtZS5teS5kb21haW4sbmFtZSxuLm15LmRvbWFpbixuLDEuMi4zLjQsMS4yLjQuNAotLkVkCi0uUHAKLS5QYSBPdXRwdXQgZm9ybWF0IGZvciByc2ExIGtleXM6Ci0uQmQgLWxpdGVyYWwKLWhvc3Qtb3ItbmFtZWxpc3QgYml0cyBleHBvbmVudCBtb2R1bHVzCi0uRWQKLS5QcAotLlBhIE91dHB1dCBmb3JtYXQgZm9yIHJzYSwgZHNhIGFuZCBlY2RzYSBrZXlzOgotLkJkIC1saXRlcmFsCi1ob3N0LW9yLW5hbWVsaXN0IGtleXR5cGUgYmFzZTY0LWVuY29kZWQta2V5Ci0uRWQKLS5QcAotV2hlcmUKLS5QYSBrZXl0eXBlCi1pcyBlaXRoZXIKLS5EcSBlY2RzYS1zaGEyLW5pc3RwMjU2ICwKLS5EcSBlY2RzYS1zaGEyLW5pc3RwMzg0ICwKLS5EcSBlY2RzYS1zaGEyLW5pc3RwNTIxICwKLS5EcSBzc2gtZHNzCi1vcgotLkRxIHNzaC1yc2EgLgotLlBwCi0uUGEgL2V0Yy9zc2gvc3NoX2tub3duX2hvc3RzCi0uU2ggRVhBTVBMRVMKLVByaW50IHRoZQotLlBhIHJzYQotaG9zdCBrZXkgZm9yIG1hY2hpbmUKLS5QYSBob3N0bmFtZSA6Ci0uQmQgLWxpdGVyYWwKLSQgc3NoLWtleXNjYW4gaG9zdG5hbWUKLS5FZAotLlBwCi1GaW5kIGFsbCBob3N0cyBmcm9tIHRoZSBmaWxlCi0uUGEgc3NoX2hvc3RzCi13aGljaCBoYXZlIG5ldyBvciBkaWZmZXJlbnQga2V5cyBmcm9tIHRob3NlIGluIHRoZSBzb3J0ZWQgZmlsZQotLlBhIHNzaF9rbm93bl9ob3N0cyA6Ci0uQmQgLWxpdGVyYWwKLSQgc3NoLWtleXNjYW4gLXQgcnNhLGRzYSxlY2RzYSAtZiBzc2hfaG9zdHMgfCBcZQotCXNvcnQgLXUgLSBzc2hfa25vd25faG9zdHMgfCBkaWZmIHNzaF9rbm93bl9ob3N0cyAtCi0uRWQKLS5TaCBTRUUgQUxTTwotLlhyIHNzaCAxICwKLS5YciBzc2hkIDgKLS5TaCBBVVRIT1JTCi0uQW4gLW5vc3BsaXQKLS5BbiBEYXZpZCBNYXppZXJlcyBBcSBkbUBsY3MubWl0LmVkdQotd3JvdGUgdGhlIGluaXRpYWwgdmVyc2lvbiwgYW5kCi0uQW4gV2F5bmUgRGF2aXNvbiBBcSB3YXluZWRAdXNlcnMuc291cmNlZm9yZ2UubmV0Ci1hZGRlZCBzdXBwb3J0IGZvciBwcm90b2NvbCB2ZXJzaW9uIDIuCi0uU2ggQlVHUwotSXQgZ2VuZXJhdGVzICJDb25uZWN0aW9uIGNsb3NlZCBieSByZW1vdGUgaG9zdCIgbWVzc2FnZXMgb24gdGhlIGNvbnNvbGVzCi1vZiBhbGwgdGhlIG1hY2hpbmVzIGl0IHNjYW5zIGlmIHRoZSBzZXJ2ZXIgaXMgb2xkZXIgdGhhbiB2ZXJzaW9uIDIuOS4KLVRoaXMgaXMgYmVjYXVzZSBpdCBvcGVucyBhIGNvbm5lY3Rpb24gdG8gdGhlIHNzaCBwb3J0LCByZWFkcyB0aGUgcHVibGljCi1rZXksIGFuZCBkcm9wcyB0aGUgY29ubmVjdGlvbiBhcyBzb29uIGFzIGl0IGdldHMgdGhlIGtleS4KZGlmZiAtLWdpdCBhL3NzaC1rZXlzY2FuLmMgYi9zc2gta2V5c2Nhbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDg1ZGQ0Li4wMDAwMDAwCi0tLSBhL3NzaC1rZXlzY2FuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjMgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNzaC1rZXlzY2FuLmMsdiAxLjg1IDIwMTEvMDMvMTUgMTA6MzY6MDIgb2thbiBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAxOTk1LCAxOTk2IGJ5IERhdmlkIE1hemllcmVzIDxkbUBsY3MubWl0LmVkdT4uCi0gKgotICogTW9kaWZpY2F0aW9uIGFuZCByZWRpc3RyaWJ1dGlvbiBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBpcwotICogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgZHVlIGNyZWRpdCBpcyBnaXZlbiB0byB0aGUgYXV0aG9yIGFuZCB0aGUKLSAqIE9wZW5CU0QgcHJvamVjdCBieSBsZWF2aW5nIHRoaXMgY29weXJpZ2h0IG5vdGljZSBpbnRhY3QuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0gCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgiCi0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLQotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgInNzaDEuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJjaXBoZXIuaCIKLSNpbmNsdWRlICJrZXguaCIKLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJteXByb3Bvc2FsLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAiZGlzcGF0Y2guaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJhdG9taWNpby5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotCi0vKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciBJUHY0IG9yIElQdjYuICBUaGlzIGNhbiBiZSBzZXQgb24gdGhlIGNvbW1hbmQgbGluZS4KLSAgIERlZmF1bHQgdmFsdWUgaXMgQUZfVU5TUEVDIG1lYW5zIGJvdGggSVB2NCBhbmQgSVB2Ni4gKi8KLWludCBJUHY0b3I2ID0gQUZfVU5TUEVDOwotCi1pbnQgc3NoX3BvcnQgPSBTU0hfREVGQVVMVF9QT1JUOwotCi0jZGVmaW5lIEtUX1JTQTEJCTEKLSNkZWZpbmUgS1RfRFNBCQkyCi0jZGVmaW5lIEtUX1JTQQkJNAotI2RlZmluZSBLVF9FQ0RTQQk4Ci0KLWludCBnZXRfa2V5dHlwZXMgPSBLVF9SU0E7CS8qIEdldCBvbmx5IFJTQSBrZXlzIGJ5IGRlZmF1bHQgKi8KLQotaW50IGhhc2hfaG9zdHMgPSAwOwkJLyogSGFzaCBob3N0bmFtZSBvbiBvdXRwdXQgKi8KLQotI2RlZmluZSBNQVhNQVhGRCAyNTYKLQotLyogVGhlIG51bWJlciBvZiBzZWNvbmRzIGFmdGVyIHdoaWNoIHRvIGdpdmUgdXAgb24gYSBUQ1AgY29ubmVjdGlvbiAqLwotaW50IHRpbWVvdXQgPSA1OwotCi1pbnQgbWF4ZmQ7Ci0jZGVmaW5lIE1BWENPTiAobWF4ZmQgLSAxMCkKLQotZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7Ci1mZF9zZXQgKnJlYWRfd2FpdDsKLXNpemVfdCByZWFkX3dhaXRfbmZkc2V0OwotaW50IG5jb247Ci1pbnQgbm9uZmF0YWxfZmF0YWwgPSAwOwotam1wX2J1ZiBrZXhqbXA7Ci1LZXkgKmtleGptcF9rZXk7Ci0KLS8qCi0gKiBLZWVwIGEgY29ubmVjdGlvbiBzdHJ1Y3R1cmUgZm9yIGVhY2ggZmlsZSBkZXNjcmlwdG9yLiAgVGhlIHN0YXRlCi0gKiBhc3NvY2lhdGVkIHdpdGggZmlsZSBkZXNjcmlwdG9yIG4gaXMgaGVsZCBpbiBmZGNvbltuXS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgQ29ubmVjdGlvbiB7Ci0JdV9jaGFyIGNfc3RhdHVzOwkvKiBTdGF0ZSBvZiBjb25uZWN0aW9uIG9uIHRoaXMgZmlsZSBkZXNjLiAqLwotI2RlZmluZSBDU19VTlVTRUQgMAkJLyogRmlsZSBkZXNjcmlwdG9yIHVudXNlZCAqLwotI2RlZmluZSBDU19DT04gMQkJLyogV2FpdGluZyB0byBjb25uZWN0L3JlYWQgZ3JlZXRpbmcgKi8KLSNkZWZpbmUgQ1NfU0laRSAyCQkvKiBXYWl0aW5nIHRvIHJlYWQgaW5pdGlhbCBwYWNrZXQgc2l6ZSAqLwotI2RlZmluZSBDU19LRVlTIDMJCS8qIFdhaXRpbmcgdG8gcmVhZCBwdWJsaWMga2V5IHBhY2tldCAqLwotCWludCBjX2ZkOwkJLyogUXVpY2sgbG9va3VwOiBjLT5jX2ZkID09IGMgLSBmZGNvbiAqLwotCWludCBjX3BsZW47CQkvKiBQYWNrZXQgbGVuZ3RoIGZpZWxkIGZvciBzc2ggcGFja2V0ICovCi0JaW50IGNfbGVuOwkJLyogVG90YWwgYnl0ZXMgd2hpY2ggbXVzdCBiZSByZWFkLiAqLwotCWludCBjX29mZjsJCS8qIExlbmd0aCBvZiBkYXRhIHJlYWQgc28gZmFyLiAqLwotCWludCBjX2tleXR5cGU7CQkvKiBPbmx5IG9uZSBvZiBLVF9SU0ExLCBLVF9EU0EsIG9yIEtUX1JTQSAqLwotCWNoYXIgKmNfbmFtZWJhc2U7CS8qIEFkZHJlc3MgdG8gZnJlZSBmb3IgY19uYW1lIGFuZCBjX25hbWVsaXN0ICovCi0JY2hhciAqY19uYW1lOwkJLyogSG9zdG5hbWUgb2YgY29ubmVjdGlvbiBmb3IgZXJyb3JzICovCi0JY2hhciAqY19uYW1lbGlzdDsJLyogUG9pbnRlciB0byBvdGhlciBwb3NzaWJsZSBhZGRyZXNzZXMgKi8KLQljaGFyICpjX291dHB1dF9uYW1lOwkvKiBIb3N0bmFtZSBvZiBjb25uZWN0aW9uIGZvciBvdXRwdXQgKi8KLQljaGFyICpjX2RhdGE7CQkvKiBEYXRhIHJlYWQgZnJvbSB0aGlzIGZkICovCi0JS2V4ICpjX2tleDsJCS8qIFRoZSBrZXktZXhjaGFuZ2Ugc3RydWN0IGZvciBzc2gyICovCi0Jc3RydWN0IHRpbWV2YWwgY190djsJLyogVGltZSBhdCB3aGljaCBjb25uZWN0aW9uIGdldHMgYWJvcnRlZCAqLwotCVRBSUxRX0VOVFJZKENvbm5lY3Rpb24pIGNfbGluazsJLyogTGlzdCBvZiBjb25uZWN0aW9ucyBpbiB0aW1lb3V0IG9yZGVyLiAqLwotfSBjb247Ci0KLVRBSUxRX0hFQUQoY29ubGlzdCwgQ29ubmVjdGlvbikgdHE7CS8qIFRpbWVvdXQgUXVldWUgKi8KLWNvbiAqZmRjb247Ci0KLXN0YXRpYyBpbnQKLWZkbGltX2dldChpbnQgaGFyZCkKLXsKLSNpZiBkZWZpbmVkKEhBVkVfR0VUUkxJTUlUKSAmJiBkZWZpbmVkKFJMSU1JVF9OT0ZJTEUpCi0Jc3RydWN0IHJsaW1pdCBybGZkOwotCi0JaWYgKGdldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmcmxmZCkgPCAwKQotCQlyZXR1cm4gKC0xKTsKLQlpZiAoKGhhcmQgPyBybGZkLnJsaW1fbWF4IDogcmxmZC5ybGltX2N1cikgPT0gUkxJTV9JTkZJTklUWSkKLQkJcmV0dXJuIFNTSF9TWVNGRE1BWDsKLQllbHNlCi0JCXJldHVybiBoYXJkID8gcmxmZC5ybGltX21heCA6IHJsZmQucmxpbV9jdXI7Ci0jZWxzZQotCXJldHVybiBTU0hfU1lTRkRNQVg7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludAotZmRsaW1fc2V0KGludCBsaW0pCi17Ci0jaWYgZGVmaW5lZChIQVZFX1NFVFJMSU1JVCkgJiYgZGVmaW5lZChSTElNSVRfTk9GSUxFKQotCXN0cnVjdCBybGltaXQgcmxmZDsKLSNlbmRpZgotCi0JaWYgKGxpbSA8PSAwKQotCQlyZXR1cm4gKC0xKTsKLSNpZiBkZWZpbmVkKEhBVkVfU0VUUkxJTUlUKSAmJiBkZWZpbmVkKFJMSU1JVF9OT0ZJTEUpCi0JaWYgKGdldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmcmxmZCkgPCAwKQotCQlyZXR1cm4gKC0xKTsKLQlybGZkLnJsaW1fY3VyID0gbGltOwotCWlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsZmQpIDwgMCkKLQkJcmV0dXJuICgtMSk7Ci0jZWxpZiBkZWZpbmVkIChIQVZFX1NFVERUQUJMRVNJWkUpCi0Jc2V0ZHRhYmxlc2l6ZShsaW0pOwotI2VuZGlmCi0JcmV0dXJuICgwKTsKLX0KLQotLyoKLSAqIFRoaXMgaXMgYW4gc3Ryc2VwIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG51bGwgZmllbGQgZm9yIGFkamFjZW50Ci0gKiBzZXBhcmF0b3JzLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgNC40QlNEIHN0cnNlcCwgYnV0IGRpZmZlcmVudCBmcm9tIHRoZQotICogb25lIGluIHRoZSBHTlUgbGliYy4KLSAqLwotc3RhdGljIGNoYXIgKgoteHN0cnNlcChjaGFyICoqc3RyLCBjb25zdCBjaGFyICpkZWxpbSkKLXsKLQljaGFyICpzLCAqZTsKLQotCWlmICghKipzdHIpCi0JCXJldHVybiAoTlVMTCk7Ci0KLQlzID0gKnN0cjsKLQllID0gcyArIHN0cmNzcG4ocywgZGVsaW0pOwotCi0JaWYgKCplICE9ICdcMCcpCi0JCSplKysgPSAnXDAnOwotCSpzdHIgPSBlOwotCi0JcmV0dXJuIChzKTsKLX0KLQotLyoKLSAqIEdldCB0aGUgbmV4dCBub24tbnVsbCB0b2tlbiAobGlrZSBHTlUgc3Ryc2VwKS4gIFN0cnNlcCgpIHdpbGwgcmV0dXJuIGEKLSAqIG51bGwgdG9rZW4gZm9yIHR3byBhZGphY2VudCBzZXBhcmF0b3JzLCBzbyB3ZSBtYXkgaGF2ZSB0byBsb29wLgotICovCi1zdGF0aWMgY2hhciAqCi1zdHJubnNlcChjaGFyICoqc3RyaW5ncCwgY2hhciAqZGVsaW0pCi17Ci0JY2hhciAqdG9rOwotCi0JZG8gewotCQl0b2sgPSB4c3Ryc2VwKHN0cmluZ3AsIGRlbGltKTsKLQl9IHdoaWxlICh0b2sgJiYgKnRvayA9PSAnXDAnKTsKLQlyZXR1cm4gKHRvayk7Ci19Ci0KLXN0YXRpYyBLZXkgKgota2V5Z3JhYl9zc2gxKGNvbiAqYykKLXsKLQlzdGF0aWMgS2V5ICpyc2E7Ci0Jc3RhdGljIEJ1ZmZlciBtc2c7Ci0KLQlpZiAocnNhID09IE5VTEwpIHsKLQkJYnVmZmVyX2luaXQoJm1zZyk7Ci0JCXJzYSA9IGtleV9uZXcoS0VZX1JTQTEpOwotCX0KLQlidWZmZXJfYXBwZW5kKCZtc2csIGMtPmNfZGF0YSwgYy0+Y19wbGVuKTsKLQlidWZmZXJfY29uc3VtZSgmbXNnLCA4IC0gKGMtPmNfcGxlbiAmIDcpKTsJLyogcGFkZGluZyAqLwotCWlmIChidWZmZXJfZ2V0X2NoYXIoJm1zZykgIT0gKGludCkgU1NIX1NNU0dfUFVCTElDX0tFWSkgewotCQllcnJvcigiJXM6IGludmFsaWQgcGFja2V0IHR5cGUiLCBjLT5jX25hbWUpOwotCQlidWZmZXJfY2xlYXIoJm1zZyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlidWZmZXJfY29uc3VtZSgmbXNnLCA4KTsJCS8qIGNvb2tpZSAqLwotCi0JLyogc2VydmVyIGtleSAqLwotCSh2b2lkKSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKLQlidWZmZXJfZ2V0X2JpZ251bSgmbXNnLCByc2EtPnJzYS0+ZSk7Ci0JYnVmZmVyX2dldF9iaWdudW0oJm1zZywgcnNhLT5yc2EtPm4pOwotCi0JLyogaG9zdCBrZXkgKi8KLQkodm9pZCkgYnVmZmVyX2dldF9pbnQoJm1zZyk7Ci0JYnVmZmVyX2dldF9iaWdudW0oJm1zZywgcnNhLT5yc2EtPmUpOwotCWJ1ZmZlcl9nZXRfYmlnbnVtKCZtc2csIHJzYS0+cnNhLT5uKTsKLQotCWJ1ZmZlcl9jbGVhcigmbXNnKTsKLQotCXJldHVybiAocnNhKTsKLX0KLQotc3RhdGljIGludAotaG9zdGp1bXAoS2V5ICpob3N0a2V5KQotewotCWtleGptcF9rZXkgPSBob3N0a2V5OwotCWxvbmdqbXAoa2V4am1wLCAxKTsKLX0KLQotc3RhdGljIGludAotc3NoMl9jYXBhYmxlKGludCByZW1vdGVfbWFqb3IsIGludCByZW1vdGVfbWlub3IpCi17Ci0Jc3dpdGNoIChyZW1vdGVfbWFqb3IpIHsKLQljYXNlIDE6Ci0JCWlmIChyZW1vdGVfbWlub3IgPT0gOTkpCi0JCQlyZXR1cm4gMTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlyZXR1cm4gMTsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBLZXkgKgota2V5Z3JhYl9zc2gyKGNvbiAqYykKLXsKLQlpbnQgajsKLQotCXBhY2tldF9zZXRfY29ubmVjdGlvbihjLT5jX2ZkLCBjLT5jX2ZkKTsKLQllbmFibGVfY29tcGF0MjAoKTsKLQlteXByb3Bvc2FsW1BST1BPU0FMX1NFUlZFUl9IT1NUX0tFWV9BTEdTXSA9IGMtPmNfa2V5dHlwZSA9PSBLVF9EU0E/Ci0JICAgICJzc2gtZHNzIiA6IChjLT5jX2tleXR5cGUgPT0gS1RfUlNBID8gInNzaC1yc2EiIDoKLQkgICAgImVjZHNhLXNoYTItbmlzdHAyNTYsZWNkc2Etc2hhMi1uaXN0cDM4NCxlY2RzYS1zaGEyLW5pc3RwNTIxIik7Ci0JYy0+Y19rZXggPSBrZXhfc2V0dXAobXlwcm9wb3NhbCk7Ci0JYy0+Y19rZXgtPmtleFtLRVhfREhfR1JQMV9TSEExXSA9IGtleGRoX2NsaWVudDsKLQljLT5jX2tleC0+a2V4W0tFWF9ESF9HUlAxNF9TSEExXSA9IGtleGRoX2NsaWVudDsKLQljLT5jX2tleC0+a2V4W0tFWF9ESF9HRVhfU0hBMV0gPSBrZXhnZXhfY2xpZW50OwotCWMtPmNfa2V4LT5rZXhbS0VYX0RIX0dFWF9TSEEyNTZdID0ga2V4Z2V4X2NsaWVudDsKLQljLT5jX2tleC0+a2V4W0tFWF9FQ0RIX1NIQTJdID0ga2V4ZWNkaF9jbGllbnQ7Ci0JYy0+Y19rZXgtPnZlcmlmeV9ob3N0X2tleSA9IGhvc3RqdW1wOwotCi0JaWYgKCEoaiA9IHNldGptcChrZXhqbXApKSkgewotCQlub25mYXRhbF9mYXRhbCA9IDE7Ci0JCWRpc3BhdGNoX3J1bihESVNQQVRDSF9CTE9DSywgJmMtPmNfa2V4LT5kb25lLCBjLT5jX2tleCk7Ci0JCWZwcmludGYoc3RkZXJyLCAiSW1wb3NzaWJsZSEgZGlzcGF0Y2hfcnVuKCkgcmV0dXJuZWQhXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0Jbm9uZmF0YWxfZmF0YWwgPSAwOwotCXhmcmVlKGMtPmNfa2V4KTsKLQljLT5jX2tleCA9IE5VTEw7Ci0JcGFja2V0X2Nsb3NlKCk7Ci0KLQlyZXR1cm4gaiA8IDA/IE5VTEwgOiBrZXhqbXBfa2V5OwotfQotCi1zdGF0aWMgdm9pZAota2V5cHJpbnQoY29uICpjLCBLZXkgKmtleSkKLXsKLQljaGFyICpob3N0ID0gYy0+Y19vdXRwdXRfbmFtZSA/IGMtPmNfb3V0cHV0X25hbWUgOiBjLT5jX25hbWU7Ci0KLQlpZiAoIWtleSkKLQkJcmV0dXJuOwotCWlmIChoYXNoX2hvc3RzICYmIChob3N0ID0gaG9zdF9oYXNoKGhvc3QsIE5VTEwsIDApKSA9PSBOVUxMKQotCQlmYXRhbCgiaG9zdF9oYXNoIGZhaWxlZCIpOwotCi0JZnByaW50ZihzdGRvdXQsICIlcyAiLCBob3N0KTsKLQlrZXlfd3JpdGUoa2V5LCBzdGRvdXQpOwotCWZwdXRzKCJcbiIsIHN0ZG91dCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXRjcGNvbm5lY3QoY2hhciAqaG9zdCkKLXsKLQlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaSwgKmFpdG9wOwotCWNoYXIgc3RycG9ydFtOSV9NQVhTRVJWXTsKLQlpbnQgZ2FpZXJyLCBzID0gLTE7Ci0KLQlzbnByaW50ZihzdHJwb3J0LCBzaXplb2Ygc3RycG9ydCwgIiVkIiwgc3NoX3BvcnQpOwotCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotCWhpbnRzLmFpX2ZhbWlseSA9IElQdjRvcjY7Ci0JaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLQlpZiAoKGdhaWVyciA9IGdldGFkZHJpbmZvKGhvc3QsIHN0cnBvcnQsICZoaW50cywgJmFpdG9wKSkgIT0gMCkKLQkJZmF0YWwoImdldGFkZHJpbmZvICVzOiAlcyIsIGhvc3QsIHNzaF9nYWlfc3RyZXJyb3IoZ2FpZXJyKSk7Ci0JZm9yIChhaSA9IGFpdG9wOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgewotCQlzID0gc29ja2V0KGFpLT5haV9mYW1pbHksIGFpLT5haV9zb2NrdHlwZSwgYWktPmFpX3Byb3RvY29sKTsKLQkJaWYgKHMgPCAwKSB7Ci0JCQllcnJvcigic29ja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoc2V0X25vbmJsb2NrKHMpID09IC0xKQotCQkJZmF0YWwoIiVzOiBzZXRfbm9uYmxvY2soJWQpIiwgX19mdW5jX18sIHMpOwotCQlpZiAoY29ubmVjdChzLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCAmJgotCQkgICAgZXJybm8gIT0gRUlOUFJPR1JFU1MpCi0JCQllcnJvcigiY29ubmVjdCAoYCVzJyk6ICVzIiwgaG9zdCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JCWNsb3NlKHMpOwotCQlzID0gLTE7Ci0JfQotCWZyZWVhZGRyaW5mbyhhaXRvcCk7Ci0JcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvbmFsbG9jKGNoYXIgKmluYW1lLCBjaGFyICpvbmFtZSwgaW50IGtleXR5cGUpCi17Ci0JY2hhciAqbmFtZWJhc2UsICpuYW1lLCAqbmFtZWxpc3Q7Ci0JaW50IHM7Ci0KLQluYW1lYmFzZSA9IG5hbWVsaXN0ID0geHN0cmR1cChpbmFtZSk7Ci0KLQlkbyB7Ci0JCW5hbWUgPSB4c3Ryc2VwKCZuYW1lbGlzdCwgIiwiKTsKLQkJaWYgKCFuYW1lKSB7Ci0JCQl4ZnJlZShuYW1lYmFzZSk7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCX0gd2hpbGUgKChzID0gdGNwY29ubmVjdChuYW1lKSkgPCAwKTsKLQotCWlmIChzID49IG1heGZkKQotCQlmYXRhbCgiY29uYWxsb2M6IGZkbm8gJWQgdG9vIGhpZ2giLCBzKTsKLQlpZiAoZmRjb25bc10uY19zdGF0dXMpCi0JCWZhdGFsKCJjb25hbGxvYzogYXR0ZW1wdCB0byByZXVzZSBmZG5vICVkIiwgcyk7Ci0KLQlmZGNvbltzXS5jX2ZkID0gczsKLQlmZGNvbltzXS5jX3N0YXR1cyA9IENTX0NPTjsKLQlmZGNvbltzXS5jX25hbWViYXNlID0gbmFtZWJhc2U7Ci0JZmRjb25bc10uY19uYW1lID0gbmFtZTsKLQlmZGNvbltzXS5jX25hbWVsaXN0ID0gbmFtZWxpc3Q7Ci0JZmRjb25bc10uY19vdXRwdXRfbmFtZSA9IHhzdHJkdXAob25hbWUpOwotCWZkY29uW3NdLmNfZGF0YSA9IChjaGFyICopICZmZGNvbltzXS5jX3BsZW47Ci0JZmRjb25bc10uY19sZW4gPSA0OwotCWZkY29uW3NdLmNfb2ZmID0gMDsKLQlmZGNvbltzXS5jX2tleXR5cGUgPSBrZXl0eXBlOwotCWdldHRpbWVvZmRheSgmZmRjb25bc10uY190diwgTlVMTCk7Ci0JZmRjb25bc10uY190di50dl9zZWMgKz0gdGltZW91dDsKLQlUQUlMUV9JTlNFUlRfVEFJTCgmdHEsICZmZGNvbltzXSwgY19saW5rKTsKLQlGRF9TRVQocywgcmVhZF93YWl0KTsKLQluY29uKys7Ci0JcmV0dXJuIChzKTsKLX0KLQotc3RhdGljIHZvaWQKLWNvbmZyZWUoaW50IHMpCi17Ci0JaWYgKHMgPj0gbWF4ZmQgfHwgZmRjb25bc10uY19zdGF0dXMgPT0gQ1NfVU5VU0VEKQotCQlmYXRhbCgiY29uZnJlZTogYXR0ZW1wdCB0byBmcmVlIGJhZCBmZG5vICVkIiwgcyk7Ci0JY2xvc2Uocyk7Ci0JeGZyZWUoZmRjb25bc10uY19uYW1lYmFzZSk7Ci0JeGZyZWUoZmRjb25bc10uY19vdXRwdXRfbmFtZSk7Ci0JaWYgKGZkY29uW3NdLmNfc3RhdHVzID09IENTX0tFWVMpCi0JCXhmcmVlKGZkY29uW3NdLmNfZGF0YSk7Ci0JZmRjb25bc10uY19zdGF0dXMgPSBDU19VTlVTRUQ7Ci0JZmRjb25bc10uY19rZXl0eXBlID0gMDsKLQlUQUlMUV9SRU1PVkUoJnRxLCAmZmRjb25bc10sIGNfbGluayk7Ci0JRkRfQ0xSKHMsIHJlYWRfd2FpdCk7Ci0JbmNvbi0tOwotfQotCi1zdGF0aWMgdm9pZAotY29udG91Y2goaW50IHMpCi17Ci0JVEFJTFFfUkVNT1ZFKCZ0cSwgJmZkY29uW3NdLCBjX2xpbmspOwotCWdldHRpbWVvZmRheSgmZmRjb25bc10uY190diwgTlVMTCk7Ci0JZmRjb25bc10uY190di50dl9zZWMgKz0gdGltZW91dDsKLQlUQUlMUV9JTlNFUlRfVEFJTCgmdHEsICZmZGNvbltzXSwgY19saW5rKTsKLX0KLQotc3RhdGljIGludAotY29ucmVjeWNsZShpbnQgcykKLXsKLQljb24gKmMgPSAmZmRjb25bc107Ci0JaW50IHJldDsKLQotCXJldCA9IGNvbmFsbG9jKGMtPmNfbmFtZWxpc3QsIGMtPmNfb3V0cHV0X25hbWUsIGMtPmNfa2V5dHlwZSk7Ci0JY29uZnJlZShzKTsKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb25ncmVldChpbnQgcykKLXsKLQlpbnQgbiA9IDAsIHJlbW90ZV9tYWpvciA9IDAsIHJlbW90ZV9taW5vciA9IDA7Ci0JY2hhciBidWZbMjU2XSwgKmNwOwotCWNoYXIgcmVtb3RlX3ZlcnNpb25bc2l6ZW9mIGJ1Zl07Ci0Jc2l6ZV90IGJ1ZnNpejsKLQljb24gKmMgPSAmZmRjb25bc107Ci0KLQlmb3IgKDs7KSB7Ci0JCW1lbXNldChidWYsICdcMCcsIHNpemVvZihidWYpKTsKLQkJYnVmc2l6ID0gc2l6ZW9mKGJ1Zik7Ci0JCWNwID0gYnVmOwotCQl3aGlsZSAoYnVmc2l6LS0gJiYKLQkJICAgIChuID0gYXRvbWljaW8ocmVhZCwgcywgY3AsIDEpKSA9PSAxICYmICpjcCAhPSAnXG4nKSB7Ci0JCQlpZiAoKmNwID09ICdccicpCi0JCQkJKmNwID0gJ1xuJzsKLQkJCWNwKys7Ci0JCX0KLQkJaWYgKG4gIT0gMSB8fCBzdHJuY21wKGJ1ZiwgIlNTSC0iLCA0KSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCWlmIChuID09IDApIHsKLQkJc3dpdGNoIChlcnJubykgewotCQljYXNlIEVQSVBFOgotCQkJZXJyb3IoIiVzOiBDb25uZWN0aW9uIGNsb3NlZCBieSByZW1vdGUgaG9zdCIsIGMtPmNfbmFtZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBFQ09OTlJFRlVTRUQ6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWVycm9yKCJyZWFkICglcyk6ICVzIiwgYy0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY29ucmVjeWNsZShzKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoKmNwICE9ICdcbicgJiYgKmNwICE9ICdccicpIHsKLQkJZXJyb3IoIiVzOiBiYWQgZ3JlZXRpbmciLCBjLT5jX25hbWUpOwotCQljb25mcmVlKHMpOwotCQlyZXR1cm47Ci0JfQotCSpjcCA9ICdcMCc7Ci0JaWYgKHNzY2FuZihidWYsICJTU0gtJWQuJWQtJVteXG5dXG4iLAotCSAgICAmcmVtb3RlX21ham9yLCAmcmVtb3RlX21pbm9yLCByZW1vdGVfdmVyc2lvbikgPT0gMykKLQkJY29tcGF0X2RhdGFmZWxsb3dzKHJlbW90ZV92ZXJzaW9uKTsKLQllbHNlCi0JCWRhdGFmZWxsb3dzID0gMDsKLQlpZiAoYy0+Y19rZXl0eXBlICE9IEtUX1JTQTEpIHsKLQkJaWYgKCFzc2gyX2NhcGFibGUocmVtb3RlX21ham9yLCByZW1vdGVfbWlub3IpKSB7Ci0JCQlkZWJ1ZygiJXMgZG9lc24ndCBzdXBwb3J0IHNzaDIiLCBjLT5jX25hbWUpOwotCQkJY29uZnJlZShzKTsKLQkJCXJldHVybjsKLQkJfQotCX0gZWxzZSBpZiAocmVtb3RlX21ham9yICE9IDEpIHsKLQkJZGVidWcoIiVzIGRvZXNuJ3Qgc3VwcG9ydCBzc2gxIiwgYy0+Y19uYW1lKTsKLQkJY29uZnJlZShzKTsKLQkJcmV0dXJuOwotCX0KLQlmcHJpbnRmKHN0ZGVyciwgIiMgJXMgJXNcbiIsIGMtPmNfbmFtZSwgY2hvcChidWYpKTsKLQluID0gc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiU1NILSVkLiVkLU9wZW5TU0gta2V5c2NhblxyXG4iLAotCSAgICBjLT5jX2tleXR5cGUgPT0gS1RfUlNBMT8gUFJPVE9DT0xfTUFKT1JfMSA6IFBST1RPQ09MX01BSk9SXzIsCi0JICAgIGMtPmNfa2V5dHlwZSA9PSBLVF9SU0ExPyBQUk9UT0NPTF9NSU5PUl8xIDogUFJPVE9DT0xfTUlOT1JfMik7Ci0JaWYgKG4gPCAwIHx8IChzaXplX3QpbiA+PSBzaXplb2YoYnVmKSkgewotCQllcnJvcigic25wcmludGY6IGJ1ZmZlciB0b28gc21hbGwiKTsKLQkJY29uZnJlZShzKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoYXRvbWljaW8odndyaXRlLCBzLCBidWYsIG4pICE9IChzaXplX3QpbikgewotCQllcnJvcigid3JpdGUgKCVzKTogJXMiLCBjLT5jX25hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWNvbmZyZWUocyk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGMtPmNfa2V5dHlwZSAhPSBLVF9SU0ExKSB7Ci0JCWtleXByaW50KGMsIGtleWdyYWJfc3NoMihjKSk7Ci0JCWNvbmZyZWUocyk7Ci0JCXJldHVybjsKLQl9Ci0JYy0+Y19zdGF0dXMgPSBDU19TSVpFOwotCWNvbnRvdWNoKHMpOwotfQotCi1zdGF0aWMgdm9pZAotY29ucmVhZChpbnQgcykKLXsKLQljb24gKmMgPSAmZmRjb25bc107Ci0Jc2l6ZV90IG47Ci0KLQlpZiAoYy0+Y19zdGF0dXMgPT0gQ1NfQ09OKSB7Ci0JCWNvbmdyZWV0KHMpOwotCQlyZXR1cm47Ci0JfQotCW4gPSBhdG9taWNpbyhyZWFkLCBzLCBjLT5jX2RhdGEgKyBjLT5jX29mZiwgYy0+Y19sZW4gLSBjLT5jX29mZik7Ci0JaWYgKG4gPT0gMCkgewotCQllcnJvcigicmVhZCAoJXMpOiAlcyIsIGMtPmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJY29uZnJlZShzKTsKLQkJcmV0dXJuOwotCX0KLQljLT5jX29mZiArPSBuOwotCi0JaWYgKGMtPmNfb2ZmID09IGMtPmNfbGVuKQotCQlzd2l0Y2ggKGMtPmNfc3RhdHVzKSB7Ci0JCWNhc2UgQ1NfU0laRToKLQkJCWMtPmNfcGxlbiA9IGh0b25sKGMtPmNfcGxlbik7Ci0JCQljLT5jX2xlbiA9IGMtPmNfcGxlbiArIDggLSAoYy0+Y19wbGVuICYgNyk7Ci0JCQljLT5jX29mZiA9IDA7Ci0JCQljLT5jX2RhdGEgPSB4bWFsbG9jKGMtPmNfbGVuKTsKLQkJCWMtPmNfc3RhdHVzID0gQ1NfS0VZUzsKLQkJCWJyZWFrOwotCQljYXNlIENTX0tFWVM6Ci0JCQlrZXlwcmludChjLCBrZXlncmFiX3NzaDEoYykpOwotCQkJY29uZnJlZShzKTsKLQkJCXJldHVybjsKLQkJZGVmYXVsdDoKLQkJCWZhdGFsKCJjb25yZWFkOiBpbnZhbGlkIHN0YXR1cyAlZCIsIGMtPmNfc3RhdHVzKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQljb250b3VjaChzKTsKLX0KLQotc3RhdGljIHZvaWQKLWNvbmxvb3Aodm9pZCkKLXsKLQlzdHJ1Y3QgdGltZXZhbCBzZWx0aW1lLCBub3c7Ci0JZmRfc2V0ICpyLCAqZTsKLQljb24gKmM7Ci0JaW50IGk7Ci0KLQlnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7Ci0JYyA9IFRBSUxRX0ZJUlNUKCZ0cSk7Ci0KLQlpZiAoYyAmJiAoYy0+Y190di50dl9zZWMgPiBub3cudHZfc2VjIHx8Ci0JICAgIChjLT5jX3R2LnR2X3NlYyA9PSBub3cudHZfc2VjICYmIGMtPmNfdHYudHZfdXNlYyA+IG5vdy50dl91c2VjKSkpIHsKLQkJc2VsdGltZSA9IGMtPmNfdHY7Ci0JCXNlbHRpbWUudHZfc2VjIC09IG5vdy50dl9zZWM7Ci0JCXNlbHRpbWUudHZfdXNlYyAtPSBub3cudHZfdXNlYzsKLQkJaWYgKHNlbHRpbWUudHZfdXNlYyA8IDApIHsKLQkJCXNlbHRpbWUudHZfdXNlYyArPSAxMDAwMDAwOwotCQkJc2VsdGltZS50dl9zZWMtLTsKLQkJfQotCX0gZWxzZQotCQl0aW1lcmNsZWFyKCZzZWx0aW1lKTsKLQotCXIgPSB4Y2FsbG9jKHJlYWRfd2FpdF9uZmRzZXQsIHNpemVvZihmZF9tYXNrKSk7Ci0JZSA9IHhjYWxsb2MocmVhZF93YWl0X25mZHNldCwgc2l6ZW9mKGZkX21hc2spKTsKLQltZW1jcHkociwgcmVhZF93YWl0LCByZWFkX3dhaXRfbmZkc2V0ICogc2l6ZW9mKGZkX21hc2spKTsKLQltZW1jcHkoZSwgcmVhZF93YWl0LCByZWFkX3dhaXRfbmZkc2V0ICogc2l6ZW9mKGZkX21hc2spKTsKLQotCXdoaWxlIChzZWxlY3QobWF4ZmQsIHIsIE5VTEwsIGUsICZzZWx0aW1lKSA9PSAtMSAmJgotCSAgICAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSkKLQkJOwotCi0JZm9yIChpID0gMDsgaSA8IG1heGZkOyBpKyspIHsKLQkJaWYgKEZEX0lTU0VUKGksIGUpKSB7Ci0JCQllcnJvcigiJXM6IGV4Y2VwdGlvbiEiLCBmZGNvbltpXS5jX25hbWUpOwotCQkJY29uZnJlZShpKTsKLQkJfSBlbHNlIGlmIChGRF9JU1NFVChpLCByKSkKLQkJCWNvbnJlYWQoaSk7Ci0JfQotCXhmcmVlKHIpOwotCXhmcmVlKGUpOwotCi0JYyA9IFRBSUxRX0ZJUlNUKCZ0cSk7Ci0Jd2hpbGUgKGMgJiYgKGMtPmNfdHYudHZfc2VjIDwgbm93LnR2X3NlYyB8fAotCSAgICAoYy0+Y190di50dl9zZWMgPT0gbm93LnR2X3NlYyAmJiBjLT5jX3R2LnR2X3VzZWMgPCBub3cudHZfdXNlYykpKSB7Ci0JCWludCBzID0gYy0+Y19mZDsKLQotCQljID0gVEFJTFFfTkVYVChjLCBjX2xpbmspOwotCQljb25yZWN5Y2xlKHMpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWRvX2hvc3QoY2hhciAqaG9zdCkKLXsKLQljaGFyICpuYW1lID0gc3Rybm5zZXAoJmhvc3QsICIgXHRcbiIpOwotCWludCBqOwotCi0JaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWZvciAoaiA9IEtUX1JTQTE7IGogPD0gS1RfRUNEU0E7IGogKj0gMikgewotCQlpZiAoZ2V0X2tleXR5cGVzICYgaikgewotCQkJd2hpbGUgKG5jb24gPj0gTUFYQ09OKQotCQkJCWNvbmxvb3AoKTsKLQkJCWNvbmFsbG9jKG5hbWUsICpob3N0ID8gaG9zdCA6IG5hbWUsIGopOwotCQl9Ci0JfQotfQotCi12b2lkCi1mYXRhbChjb25zdCBjaGFyICpmbXQsLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JZG9fbG9nKFNZU0xPR19MRVZFTF9GQVRBTCwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0JaWYgKG5vbmZhdGFsX2ZhdGFsKQotCQlsb25nam1wKGtleGptcCwgLTEpOwotCWVsc2UKLQkJZXhpdCgyNTUpOwotfQotCi1zdGF0aWMgdm9pZAotdXNhZ2Uodm9pZCkKLXsKLQlmcHJpbnRmKHN0ZGVyciwKLQkgICAgInVzYWdlOiAlcyBbLTQ2SHZdIFstZiBmaWxlXSBbLXAgcG9ydF0gWy1UIHRpbWVvdXRdIFstdCB0eXBlXVxuIgotCSAgICAiXHRcdCAgIFtob3N0IHwgYWRkcmxpc3QgbmFtZWxpc3RdIC4uLlxuIiwKLQkgICAgX19wcm9nbmFtZSk7Ci0JZXhpdCgxKTsKLX0KLQotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQlpbnQgZGVidWdfZmxhZyA9IDAsIGxvZ19sZXZlbCA9IFNZU0xPR19MRVZFTF9JTkZPOwotCWludCBvcHQsIGZvcHRfY291bnQgPSAwLCBqOwotCWNoYXIgKnRuYW1lLCAqY3AsIGxpbmVbTklfTUFYSE9TVF07Ci0JRklMRSAqZnA7Ci0JdV9sb25nIGxpbmVudW07Ci0KLQlleHRlcm4gaW50IG9wdGluZDsKLQlleHRlcm4gY2hhciAqb3B0YXJnOwotCi0JX19wcm9nbmFtZSA9IHNzaF9nZXRfcHJvZ25hbWUoYXJndlswXSk7Ci0Jc2VlZF9ybmcoKTsKLQlUQUlMUV9JTklUKCZ0cSk7Ci0KLQkvKiBFbnN1cmUgdGhhdCBmZHMgMCwgMSBhbmQgMiBhcmUgb3BlbiBvciBkaXJlY3RlZCB0byAvZGV2L251bGwgKi8KLQlzYW5pdGlzZV9zdGRmZCgpOwotCi0JaWYgKGFyZ2MgPD0gMSkKLQkJdXNhZ2UoKTsKLQotCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJIdjQ2cDpUOnQ6ZjoiKSkgIT0gLTEpIHsKLQkJc3dpdGNoIChvcHQpIHsKLQkJY2FzZSAnSCc6Ci0JCQloYXNoX2hvc3RzID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdwJzoKLQkJCXNzaF9wb3J0ID0gYTJwb3J0KG9wdGFyZyk7Ci0JCQlpZiAoc3NoX3BvcnQgPD0gMCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiQmFkIHBvcnQgJyVzJ1xuIiwgb3B0YXJnKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ1QnOgotCQkJdGltZW91dCA9IGNvbnZ0aW1lKG9wdGFyZyk7Ci0JCQlpZiAodGltZW91dCA9PSAtMSB8fCB0aW1lb3V0ID09IDApIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIkJhZCB0aW1lb3V0ICclcydcbiIsIG9wdGFyZyk7Ci0JCQkJdXNhZ2UoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICd2JzoKLQkJCWlmICghZGVidWdfZmxhZykgewotCQkJCWRlYnVnX2ZsYWcgPSAxOwotCQkJCWxvZ19sZXZlbCA9IFNZU0xPR19MRVZFTF9ERUJVRzE7Ci0JCQl9Ci0JCQllbHNlIGlmIChsb2dfbGV2ZWwgPCBTWVNMT0dfTEVWRUxfREVCVUczKQotCQkJCWxvZ19sZXZlbCsrOwotCQkJZWxzZQotCQkJCWZhdGFsKCJUb28gaGlnaCBkZWJ1Z2dpbmcgbGV2ZWwuIik7Ci0JCQlicmVhazsKLQkJY2FzZSAnZic6Ci0JCQlpZiAoc3RyY21wKG9wdGFyZywgIi0iKSA9PSAwKQotCQkJCW9wdGFyZyA9IE5VTEw7Ci0JCQlhcmd2W2ZvcHRfY291bnQrK10gPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAndCc6Ci0JCQlnZXRfa2V5dHlwZXMgPSAwOwotCQkJdG5hbWUgPSBzdHJ0b2sob3B0YXJnLCAiLCIpOwotCQkJd2hpbGUgKHRuYW1lKSB7Ci0JCQkJaW50IHR5cGUgPSBrZXlfdHlwZV9mcm9tX25hbWUodG5hbWUpOwotCQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgS0VZX1JTQTE6Ci0JCQkJCWdldF9rZXl0eXBlcyB8PSBLVF9SU0ExOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEtFWV9EU0E6Ci0JCQkJCWdldF9rZXl0eXBlcyB8PSBLVF9EU0E7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgS0VZX0VDRFNBOgotCQkJCQlnZXRfa2V5dHlwZXMgfD0gS1RfRUNEU0E7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgS0VZX1JTQToKLQkJCQkJZ2V0X2tleXR5cGVzIHw9IEtUX1JTQTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBLRVlfVU5TUEVDOgotCQkJCQlmYXRhbCgidW5rbm93biBrZXkgdHlwZSAlcyIsIHRuYW1lKTsKLQkJCQl9Ci0JCQkJdG5hbWUgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICc0JzoKLQkJCUlQdjRvcjYgPSBBRl9JTkVUOwotCQkJYnJlYWs7Ci0JCWNhc2UgJzYnOgotCQkJSVB2NG9yNiA9IEFGX0lORVQ2OwotCQkJYnJlYWs7Ci0JCWNhc2UgJz8nOgotCQlkZWZhdWx0OgotCQkJdXNhZ2UoKTsKLQkJfQotCX0KLQlpZiAob3B0aW5kID09IGFyZ2MgJiYgIWZvcHRfY291bnQpCi0JCXVzYWdlKCk7Ci0KLQlsb2dfaW5pdCgic3NoLWtleXNjYW4iLCBsb2dfbGV2ZWwsIFNZU0xPR19GQUNJTElUWV9VU0VSLCAxKTsKLQotCW1heGZkID0gZmRsaW1fZ2V0KDEpOwotCWlmIChtYXhmZCA8IDApCi0JCWZhdGFsKCIlczogZmRsaW1fZ2V0OiBiYWQgdmFsdWUiLCBfX3Byb2duYW1lKTsKLQlpZiAobWF4ZmQgPiBNQVhNQVhGRCkKLQkJbWF4ZmQgPSBNQVhNQVhGRDsKLQlpZiAoTUFYQ09OIDw9IDApCi0JCWZhdGFsKCIlczogbm90IGVub3VnaCBmaWxlIGRlc2NyaXB0b3JzIiwgX19wcm9nbmFtZSk7Ci0JaWYgKG1heGZkID4gZmRsaW1fZ2V0KDApKQotCQlmZGxpbV9zZXQobWF4ZmQpOwotCWZkY29uID0geGNhbGxvYyhtYXhmZCwgc2l6ZW9mKGNvbikpOwotCi0JcmVhZF93YWl0X25mZHNldCA9IGhvd21hbnkobWF4ZmQsIE5GREJJVFMpOwotCXJlYWRfd2FpdCA9IHhjYWxsb2MocmVhZF93YWl0X25mZHNldCwgc2l6ZW9mKGZkX21hc2spKTsKLQotCWZvciAoaiA9IDA7IGogPCBmb3B0X2NvdW50OyBqKyspIHsKLQkJaWYgKGFyZ3Zbal0gPT0gTlVMTCkKLQkJCWZwID0gc3RkaW47Ci0JCWVsc2UgaWYgKChmcCA9IGZvcGVuKGFyZ3Zbal0sICJyIikpID09IE5VTEwpCi0JCQlmYXRhbCgiJXM6ICVzOiAlcyIsIF9fcHJvZ25hbWUsIGFyZ3Zbal0sCi0JCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJbGluZW51bSA9IDA7Ci0KLQkJd2hpbGUgKHJlYWRfa2V5ZmlsZV9saW5lKGZwLAotCQkgICAgYXJndltqXSA9PSBOVUxMID8gIihzdGRpbikiIDogYXJndltqXSwgbGluZSwgc2l6ZW9mKGxpbmUpLAotCQkgICAgJmxpbmVudW0pICE9IC0xKSB7Ci0JCQkvKiBDaG9tcCBvZmYgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgKi8KLQkJCWlmICgoY3AgPSBzdHJjaHIobGluZSwgJyMnKSkgPT0gTlVMTCkKLQkJCQljcCA9IGxpbmUgKyBzdHJsZW4obGluZSkgLSAxOwotCQkJd2hpbGUgKGNwID49IGxpbmUpIHsKLQkJCQlpZiAoKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JyB8fAotCQkJCSAgICAqY3AgPT0gJ1xuJyB8fCAqY3AgPT0gJyMnKQotCQkJCQkqY3AtLSA9ICdcMCc7Ci0JCQkJZWxzZQotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogU2tpcCBlbXB0eSBsaW5lcyAqLwotCQkJaWYgKCpsaW5lID09ICdcMCcpCi0JCQkJY29udGludWU7Ci0KLQkJCWRvX2hvc3QobGluZSk7Ci0JCX0KLQotCQlpZiAoZmVycm9yKGZwKSkKLQkJCWZhdGFsKCIlczogJXM6ICVzIiwgX19wcm9nbmFtZSwgYXJndltqXSwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCi0JCWZjbG9zZShmcCk7Ci0JfQotCi0Jd2hpbGUgKG9wdGluZCA8IGFyZ2MpCi0JCWRvX2hvc3QoYXJndltvcHRpbmQrK10pOwotCi0Jd2hpbGUgKG5jb24gPiAwKQotCQljb25sb29wKCk7Ci0KLQlyZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvc3NoLWtleXNpZ24uMCBiL3NzaC1rZXlzaWduLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNTIwODQuLjAwMDAwMDAKLS0tIGEvc3NoLWtleXNpZ24uMAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLVNTSC1LRVlTSUdOKDgpICAgICAgICAgIE9wZW5CU0QgU3lzdGVtIE1hbmFnZXIncyBNYW51YWwgICAgICAgICBTU0gtS0VZU0lHTig4KQotCi1OQU1FCi0gICAgIHNzaC1rZXlzaWduIC0gc3NoIGhlbHBlciBwcm9ncmFtIGZvciBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uCi0KLVNZTk9QU0lTCi0gICAgIHNzaC1rZXlzaWduCi0KLURFU0NSSVBUSU9OCi0gICAgIHNzaC1rZXlzaWduIGlzIHVzZWQgYnkgc3NoKDEpIHRvIGFjY2VzcyB0aGUgbG9jYWwgaG9zdCBrZXlzIGFuZCBnZW5lcmF0ZQotICAgICB0aGUgZGlnaXRhbCBzaWduYXR1cmUgcmVxdWlyZWQgZHVyaW5nIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24gd2l0aCBTU0gKLSAgICAgcHJvdG9jb2wgdmVyc2lvbiAyLgotCi0gICAgIHNzaC1rZXlzaWduIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBvbmx5IGJlIGVuYWJsZWQgaW4gdGhlIGdsb2JhbAotICAgICBjbGllbnQgY29uZmlndXJhdGlvbiBmaWxlIC9ldGMvc3NoL3NzaF9jb25maWcgYnkgc2V0dGluZyBFbmFibGVTU0hLZXlzaWduCi0gICAgIHRvIGBgeWVzJycuCi0KLSAgICAgc3NoLWtleXNpZ24gaXMgbm90IGludGVuZGVkIHRvIGJlIGludm9rZWQgYnkgdGhlIHVzZXIsIGJ1dCBmcm9tIHNzaCgxKS4KLSAgICAgU2VlIHNzaCgxKSBhbmQgc3NoZCg4KSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3N0LWJhc2VkCi0gICAgIGF1dGhlbnRpY2F0aW9uLgotCi1GSUxFUwotICAgICAvZXRjL3NzaC9zc2hfY29uZmlnCi0gICAgICAgICAgICAgQ29udHJvbHMgd2hldGhlciBzc2gta2V5c2lnbiBpcyBlbmFibGVkLgotCi0gICAgIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXkKLSAgICAgL2V0Yy9zc2gvc3NoX2hvc3RfZWNkc2Ffa2V5Ci0gICAgIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkKLSAgICAgICAgICAgICBUaGVzZSBmaWxlcyBjb250YWluIHRoZSBwcml2YXRlIHBhcnRzIG9mIHRoZSBob3N0IGtleXMgdXNlZCB0bwotICAgICAgICAgICAgIGdlbmVyYXRlIHRoZSBkaWdpdGFsIHNpZ25hdHVyZS4gIFRoZXkgc2hvdWxkIGJlIG93bmVkIGJ5IHJvb3QsCi0gICAgICAgICAgICAgcmVhZGFibGUgb25seSBieSByb290LCBhbmQgbm90IGFjY2Vzc2libGUgdG8gb3RoZXJzLiAgU2luY2UgdGhleQotICAgICAgICAgICAgIGFyZSByZWFkYWJsZSBvbmx5IGJ5IHJvb3QsIHNzaC1rZXlzaWduIG11c3QgYmUgc2V0LXVpZCByb290IGlmCi0gICAgICAgICAgICAgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiBpcyB1c2VkLgotCi0gICAgIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXktY2VydC5wdWIKLSAgICAgL2V0Yy9zc2gvc3NoX2hvc3RfZWNkc2Ffa2V5LWNlcnQucHViCi0gICAgIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXktY2VydC5wdWIKLSAgICAgICAgICAgICBJZiB0aGVzZSBmaWxlcyBleGlzdCB0aGV5IGFyZSBhc3N1bWVkIHRvIGNvbnRhaW4gcHVibGljCi0gICAgICAgICAgICAgY2VydGlmaWNhdGUgaW5mb3JtYXRpb24gY29ycmVzcG9uZGluZyB3aXRoIHRoZSBwcml2YXRlIGtleXMKLSAgICAgICAgICAgICBhYm92ZS4KLQotU0VFIEFMU08KLSAgICAgc3NoKDEpLCBzc2gta2V5Z2VuKDEpLCBzc2hfY29uZmlnKDUpLCBzc2hkKDgpCi0KLUhJU1RPUlkKLSAgICAgc3NoLWtleXNpZ24gZmlyc3QgYXBwZWFyZWQgaW4gT3BlbkJTRCAzLjIuCi0KLUFVVEhPUlMKLSAgICAgTWFya3VzIEZyaWVkbCA8bWFya3VzQG9wZW5ic2Qub3JnPgotCi1PcGVuQlNEIDUuMCAgICAgICAgICAgICAgICAgICAgIEF1Z3VzdCAzMSwgMjAxMCAgICAgICAgICAgICAgICAgICAgT3BlbkJTRCA1LjAKZGlmZiAtLWdpdCBhL3NzaC1rZXlzaWduLjggYi9zc2gta2V5c2lnbi44CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTA5ZTAyLi4wMDAwMDAwCi0tLSBhL3NzaC1rZXlzaWduLjgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0uXCIgJE9wZW5CU0Q6IHNzaC1rZXlzaWduLjgsdiAxLjEyIDIwMTAvMDgvMzEgMTE6NTQ6NDUgZGptIEV4cCAkCi0uXCIKLS5cIiBDb3B5cmlnaHQgKGMpIDIwMDIgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLS5cIiBhcmUgbWV0OgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotLlwiIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLS5cIiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotLlwiIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLS5cIiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLS5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0uXCIgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0uXCIgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLlwiIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotLlwiIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIKLS5EZCAkTWRvY2RhdGU6IEF1Z3VzdCAzMSAyMDEwICQKLS5EdCBTU0gtS0VZU0lHTiA4Ci0uT3MKLS5TaCBOQU1FCi0uTm0gc3NoLWtleXNpZ24KLS5OZCBzc2ggaGVscGVyIHByb2dyYW0gZm9yIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24KLS5TaCBTWU5PUFNJUwotLk5tCi0uU2ggREVTQ1JJUFRJT04KLS5ObQotaXMgdXNlZCBieQotLlhyIHNzaCAxCi10byBhY2Nlc3MgdGhlIGxvY2FsIGhvc3Qga2V5cyBhbmQgZ2VuZXJhdGUgdGhlIGRpZ2l0YWwgc2lnbmF0dXJlCi1yZXF1aXJlZCBkdXJpbmcgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiB3aXRoIFNTSCBwcm90b2NvbCB2ZXJzaW9uIDIuCi0uUHAKLS5ObQotaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIG9ubHkgYmUgZW5hYmxlZCBpbiB0aGUKLWdsb2JhbCBjbGllbnQgY29uZmlndXJhdGlvbiBmaWxlCi0uUGEgL2V0Yy9zc2gvc3NoX2NvbmZpZwotYnkgc2V0dGluZwotLkNtIEVuYWJsZVNTSEtleXNpZ24KLXRvCi0uRHEgeWVzIC4KLS5QcAotLk5tCi1pcyBub3QgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBieSB0aGUgdXNlciwgYnV0IGZyb20KLS5YciBzc2ggMSAuCi1TZWUKLS5YciBzc2ggMQotYW5kCi0uWHIgc3NoZCA4Ci1mb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uLgotLlNoIEZJTEVTCi0uQmwgLXRhZyAtd2lkdGggRHMgLWNvbXBhY3QKLS5JdCBQYSAvZXRjL3NzaC9zc2hfY29uZmlnCi1Db250cm9scyB3aGV0aGVyCi0uTm0KLWlzIGVuYWJsZWQuCi0uUHAKLS5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9kc2Ffa2V5Ci0uSXQgUGEgL2V0Yy9zc2gvc3NoX2hvc3RfZWNkc2Ffa2V5Ci0uSXQgUGEgL2V0Yy9zc2gvc3NoX2hvc3RfcnNhX2tleQotVGhlc2UgZmlsZXMgY29udGFpbiB0aGUgcHJpdmF0ZSBwYXJ0cyBvZiB0aGUgaG9zdCBrZXlzIHVzZWQgdG8KLWdlbmVyYXRlIHRoZSBkaWdpdGFsIHNpZ25hdHVyZS4KLVRoZXkgc2hvdWxkIGJlIG93bmVkIGJ5IHJvb3QsIHJlYWRhYmxlIG9ubHkgYnkgcm9vdCwgYW5kIG5vdAotYWNjZXNzaWJsZSB0byBvdGhlcnMuCi1TaW5jZSB0aGV5IGFyZSByZWFkYWJsZSBvbmx5IGJ5IHJvb3QsCi0uTm0KLW11c3QgYmUgc2V0LXVpZCByb290IGlmIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24gaXMgdXNlZC4KLS5QcAotLkl0IFBhIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXktY2VydC5wdWIKLS5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9lY2RzYV9rZXktY2VydC5wdWIKLS5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9yc2Ffa2V5LWNlcnQucHViCi1JZiB0aGVzZSBmaWxlcyBleGlzdCB0aGV5IGFyZSBhc3N1bWVkIHRvIGNvbnRhaW4gcHVibGljIGNlcnRpZmljYXRlCi1pbmZvcm1hdGlvbiBjb3JyZXNwb25kaW5nIHdpdGggdGhlIHByaXZhdGUga2V5cyBhYm92ZS4KLS5FbAotLlNoIFNFRSBBTFNPCi0uWHIgc3NoIDEgLAotLlhyIHNzaC1rZXlnZW4gMSAsCi0uWHIgc3NoX2NvbmZpZyA1ICwKLS5YciBzc2hkIDgKLS5TaCBISVNUT1JZCi0uTm0KLWZpcnN0IGFwcGVhcmVkIGluCi0uT3ggMy4yIC4KLS5TaCBBVVRIT1JTCi0uQW4gTWFya3VzIEZyaWVkbCBBcSBtYXJrdXNAb3BlbmJzZC5vcmcKZGlmZiAtLWdpdCBhL3NzaC1rZXlzaWduLmMgYi9zc2gta2V5c2lnbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGViN2UxLi4wMDAwMDAwCi0tLSBhL3NzaC1rZXlzaWduLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNzaC1rZXlzaWduLmMsdiAxLjM2IDIwMTEvMDIvMTYgMDA6MzE6MTQgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAyIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaWZkZWYgSEFWRV9QQVRIU19ICi0jaW5jbHVkZSA8cGF0aHMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgInNzaDIuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAiYXV0aGZpbGUuaCIKLSNpbmNsdWRlICJtc2cuaCIKLSNpbmNsdWRlICJjYW5vaG9zdC5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotI2luY2x1ZGUgInJlYWRjb25mLmgiCi0jaW5jbHVkZSAidWlkc3dhcC5oIgotCi0vKiBYWFggcmVhZGNvbmYuYyBuZWVkcyB0aGVzZSAqLwotdWlkX3Qgb3JpZ2luYWxfcmVhbF91aWQ7Ci0KLWV4dGVybiBjaGFyICpfX3Byb2duYW1lOwotCi1zdGF0aWMgaW50Ci12YWxpZF9yZXF1ZXN0KHN0cnVjdCBwYXNzd2QgKnB3LCBjaGFyICpob3N0LCBLZXkgKipyZXQsIHVfY2hhciAqZGF0YSwKLSAgICB1X2ludCBkYXRhbGVuKQotewotCUJ1ZmZlciBiOwotCUtleSAqa2V5ID0gTlVMTDsKLQl1X2NoYXIgKnBrYmxvYjsKLQl1X2ludCBibGVuLCBsZW47Ci0JY2hhciAqcGthbGcsICpwOwotCWludCBwa3R5cGUsIGZhaWw7Ci0KLQlmYWlsID0gMDsKLQotCWJ1ZmZlcl9pbml0KCZiKTsKLQlidWZmZXJfYXBwZW5kKCZiLCBkYXRhLCBkYXRhbGVuKTsKLQotCS8qIHNlc3Npb24gaWQsIGN1cnJlbnRseSBsaW1pdGVkIHRvIFNIQTEgKDIwIGJ5dGVzKSBvciBTSEEyNTYgKDMyKSAqLwotCXAgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgJmxlbik7Ci0JaWYgKGxlbiAhPSAyMCAmJiBsZW4gIT0gMzIpCi0JCWZhaWwrKzsKLQl4ZnJlZShwKTsKLQotCWlmIChidWZmZXJfZ2V0X2NoYXIoJmIpICE9IFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpCi0JCWZhaWwrKzsKLQotCS8qIHNlcnZlciB1c2VyICovCi0JYnVmZmVyX3NraXBfc3RyaW5nKCZiKTsKLQotCS8qIHNlcnZpY2UgKi8KLQlwID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsIE5VTEwpOwotCWlmIChzdHJjbXAoInNzaC1jb25uZWN0aW9uIiwgcCkgIT0gMCkKLQkJZmFpbCsrOwotCXhmcmVlKHApOwotCi0JLyogbWV0aG9kICovCi0JcCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCBOVUxMKTsKLQlpZiAoc3RyY21wKCJob3N0YmFzZWQiLCBwKSAhPSAwKQotCQlmYWlsKys7Ci0JeGZyZWUocCk7Ci0KLQkvKiBwdWJrZXkgKi8KLQlwa2FsZyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCBOVUxMKTsKLQlwa2Jsb2IgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgJmJsZW4pOwotCi0JcGt0eXBlID0ga2V5X3R5cGVfZnJvbV9uYW1lKHBrYWxnKTsKLQlpZiAocGt0eXBlID09IEtFWV9VTlNQRUMpCi0JCWZhaWwrKzsKLQllbHNlIGlmICgoa2V5ID0ga2V5X2Zyb21fYmxvYihwa2Jsb2IsIGJsZW4pKSA9PSBOVUxMKQotCQlmYWlsKys7Ci0JZWxzZSBpZiAoa2V5LT50eXBlICE9IHBrdHlwZSkKLQkJZmFpbCsrOwotCXhmcmVlKHBrYWxnKTsKLQl4ZnJlZShwa2Jsb2IpOwotCi0JLyogY2xpZW50IGhvc3QgbmFtZSwgaGFuZGxlIHRyYWlsaW5nIGRvdCAqLwotCXAgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgJmxlbik7Ci0JZGVidWcyKCJ2YWxpZF9yZXF1ZXN0OiBjaGVjayBleHBlY3QgY2hvc3QgJXMgZ290ICVzIiwgaG9zdCwgcCk7Ci0JaWYgKHN0cmxlbihob3N0KSAhPSBsZW4gLSAxKQotCQlmYWlsKys7Ci0JZWxzZSBpZiAocFtsZW4gLSAxXSAhPSAnLicpCi0JCWZhaWwrKzsKLQllbHNlIGlmIChzdHJuY2FzZWNtcChob3N0LCBwLCBsZW4gLSAxKSAhPSAwKQotCQlmYWlsKys7Ci0JeGZyZWUocCk7Ci0KLQkvKiBsb2NhbCB1c2VyICovCi0JcCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCBOVUxMKTsKLQotCWlmIChzdHJjbXAocHctPnB3X25hbWUsIHApICE9IDApCi0JCWZhaWwrKzsKLQl4ZnJlZShwKTsKLQotCS8qIGVuZCBvZiBtZXNzYWdlICovCi0JaWYgKGJ1ZmZlcl9sZW4oJmIpICE9IDApCi0JCWZhaWwrKzsKLQlidWZmZXJfZnJlZSgmYik7Ci0KLQlkZWJ1ZzMoInZhbGlkX3JlcXVlc3Q6IGZhaWwgJWQiLCBmYWlsKTsKLQotCWlmIChmYWlsICYmIGtleSAhPSBOVUxMKQotCQlrZXlfZnJlZShrZXkpOwotCWVsc2UKLQkJKnJldCA9IGtleTsKLQotCXJldHVybiAoZmFpbCA/IC0xIDogMCk7Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0JQnVmZmVyIGI7Ci0JT3B0aW9ucyBvcHRpb25zOwotI2RlZmluZSBOVU1fS0VZVFlQRVMgMwotCUtleSAqa2V5c1tOVU1fS0VZVFlQRVNdLCAqa2V5ID0gTlVMTDsKLQlzdHJ1Y3QgcGFzc3dkICpwdzsKLQlpbnQga2V5X2ZkW05VTV9LRVlUWVBFU10sIGksIGZvdW5kLCB2ZXJzaW9uID0gMiwgZmQ7Ci0JdV9jaGFyICpzaWduYXR1cmUsICpkYXRhOwotCWNoYXIgKmhvc3Q7Ci0JdV9pbnQgc2xlbiwgZGxlbjsKLQl1X2ludDMyX3Qgcm5kWzI1Nl07Ci0KLQkvKiBFbnN1cmUgdGhhdCBzdGRpbiBhbmQgc3Rkb3V0IGFyZSBjb25uZWN0ZWQgKi8KLQlpZiAoKGZkID0gb3BlbihfUEFUSF9ERVZOVUxMLCBPX1JEV1IpKSA8IDIpCi0JCWV4aXQoMSk7Ci0JLyogTGVhdmUgL2Rldi9udWxsIGZkIGlmZiBpdCBpcyBhdHRhY2hlZCB0byBzdGRlcnIgKi8KLQlpZiAoZmQgPiAyKQotCQljbG9zZShmZCk7Ci0KLQlpID0gMDsKLQlrZXlfZmRbaSsrXSA9IG9wZW4oX1BBVEhfSE9TVF9EU0FfS0VZX0ZJTEUsIE9fUkRPTkxZKTsKLQlrZXlfZmRbaSsrXSA9IG9wZW4oX1BBVEhfSE9TVF9FQ0RTQV9LRVlfRklMRSwgT19SRE9OTFkpOwotCWtleV9mZFtpKytdID0gb3BlbihfUEFUSF9IT1NUX1JTQV9LRVlfRklMRSwgT19SRE9OTFkpOwotCi0Jb3JpZ2luYWxfcmVhbF91aWQgPSBnZXR1aWQoKTsJLyogWFhYIHJlYWRjb25mLmMgbmVlZHMgdGhpcyAqLwotCWlmICgocHcgPSBnZXRwd3VpZChvcmlnaW5hbF9yZWFsX3VpZCkpID09IE5VTEwpCi0JCWZhdGFsKCJnZXRwd3VpZCBmYWlsZWQiKTsKLQlwdyA9IHB3Y29weShwdyk7Ci0KLQlwZXJtYW5lbnRseV9zZXRfdWlkKHB3KTsKLQotCXNlZWRfcm5nKCk7Ci0JYXJjNHJhbmRvbV9zdGlyKCk7Ci0KLSNpZmRlZiBERUJVR19TU0hfS0VZU0lHTgotCWxvZ19pbml0KCJzc2gta2V5c2lnbiIsIFNZU0xPR19MRVZFTF9ERUJVRzMsIFNZU0xPR19GQUNJTElUWV9BVVRILCAwKTsKLSNlbmRpZgotCi0JLyogdmVyaWZ5IHRoYXQgc3NoLWtleXNpZ24gaXMgZW5hYmxlZCBieSB0aGUgYWRtaW4gKi8KLQlpbml0aWFsaXplX29wdGlvbnMoJm9wdGlvbnMpOwotCSh2b2lkKXJlYWRfY29uZmlnX2ZpbGUoX1BBVEhfSE9TVF9DT05GSUdfRklMRSwgIiIsICZvcHRpb25zLCAwKTsKLQlmaWxsX2RlZmF1bHRfb3B0aW9ucygmb3B0aW9ucyk7Ci0JaWYgKG9wdGlvbnMuZW5hYmxlX3NzaF9rZXlzaWduICE9IDEpCi0JCWZhdGFsKCJzc2gta2V5c2lnbiBub3QgZW5hYmxlZCBpbiAlcyIsCi0JCSAgICBfUEFUSF9IT1NUX0NPTkZJR19GSUxFKTsKLQotCWZvciAoaSA9IGZvdW5kID0gMDsgaSA8IE5VTV9LRVlUWVBFUzsgaSsrKSB7Ci0JCWlmIChrZXlfZmRbaV0gIT0gLTEpCi0JCQlmb3VuZCA9IDE7Ci0JfQotCWlmIChmb3VuZCA9PSAwKQotCQlmYXRhbCgiY291bGQgbm90IG9wZW4gYW55IGhvc3Qga2V5Iik7Ci0KLQlPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpOwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJcm5kW2ldID0gYXJjNHJhbmRvbSgpOwotCVJBTkRfc2VlZChybmQsIHNpemVvZihybmQpKTsKLQotCWZvdW5kID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0tFWVRZUEVTOyBpKyspIHsKLQkJa2V5c1tpXSA9IE5VTEw7Ci0JCWlmIChrZXlfZmRbaV0gPT0gLTEpCi0JCQljb250aW51ZTsKLQkJa2V5c1tpXSA9IGtleV9sb2FkX3ByaXZhdGVfcGVtKGtleV9mZFtpXSwgS0VZX1VOU1BFQywKLQkJICAgIE5VTEwsIE5VTEwpOwotCQljbG9zZShrZXlfZmRbaV0pOwotCQlpZiAoa2V5c1tpXSAhPSBOVUxMKQotCQkJZm91bmQgPSAxOwotCX0KLQlpZiAoIWZvdW5kKQotCQlmYXRhbCgibm8gaG9zdGtleSBmb3VuZCIpOwotCi0JYnVmZmVyX2luaXQoJmIpOwotCWlmIChzc2hfbXNnX3JlY3YoU1RESU5fRklMRU5PLCAmYikgPCAwKQotCQlmYXRhbCgic3NoX21zZ19yZWN2IGZhaWxlZCIpOwotCWlmIChidWZmZXJfZ2V0X2NoYXIoJmIpICE9IHZlcnNpb24pCi0JCWZhdGFsKCJiYWQgdmVyc2lvbiIpOwotCWZkID0gYnVmZmVyX2dldF9pbnQoJmIpOwotCWlmICgoZmQgPT0gU1RESU5fRklMRU5PKSB8fCAoZmQgPT0gU1RET1VUX0ZJTEVOTykpCi0JCWZhdGFsKCJiYWQgZmQiKTsKLQlpZiAoKGhvc3QgPSBnZXRfbG9jYWxfbmFtZShmZCkpID09IE5VTEwpCi0JCWZhdGFsKCJjYW5ub3QgZ2V0IGxvY2FsIG5hbWUgZm9yIGZkIik7Ci0KLQlkYXRhID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsICZkbGVuKTsKLQlpZiAodmFsaWRfcmVxdWVzdChwdywgaG9zdCwgJmtleSwgZGF0YSwgZGxlbikgPCAwKQotCQlmYXRhbCgibm90IGEgdmFsaWQgcmVxdWVzdCIpOwotCXhmcmVlKGhvc3QpOwotCi0JZm91bmQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBOVU1fS0VZVFlQRVM7IGkrKykgewotCQlpZiAoa2V5c1tpXSAhPSBOVUxMICYmCi0JCSAgICBrZXlfZXF1YWxfcHVibGljKGtleSwga2V5c1tpXSkpIHsKLQkJCWZvdW5kID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICghZm91bmQpCi0JCWZhdGFsKCJubyBtYXRjaGluZyBob3N0a2V5IGZvdW5kIik7Ci0KLQlpZiAoa2V5X3NpZ24oa2V5c1tpXSwgJnNpZ25hdHVyZSwgJnNsZW4sIGRhdGEsIGRsZW4pICE9IDApCi0JCWZhdGFsKCJrZXlfc2lnbiBmYWlsZWQiKTsKLQl4ZnJlZShkYXRhKTsKLQotCS8qIHNlbmQgcmVwbHkgKi8KLQlidWZmZXJfY2xlYXIoJmIpOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBzaWduYXR1cmUsIHNsZW4pOwotCWlmIChzc2hfbXNnX3NlbmQoU1RET1VUX0ZJTEVOTywgdmVyc2lvbiwgJmIpID09IC0xKQotCQlmYXRhbCgic3NoX21zZ19zZW5kIGZhaWxlZCIpOwotCi0JcmV0dXJuICgwKTsKLX0KZGlmZiAtLWdpdCBhL3NzaC1wa2NzMTEtY2xpZW50LmMgYi9zc2gtcGtjczExLWNsaWVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTBjMzczLi4wMDAwMDAwCi0tLSBhL3NzaC1wa2NzMTEtY2xpZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNzaC1wa2NzMTEtY2xpZW50LmMsdiAxLjIgMjAxMC8wMi8yNCAwNjoxMjo1MyBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpZmRlZiBFTkFCTEVfUEtDUzExCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1NZU19USU1FX0gKLSMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlICJwYXRobmFtZXMuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImF1dGhmZC5oIgotI2luY2x1ZGUgImF0b21pY2lvLmgiCi0jaW5jbHVkZSAic3NoLXBrY3MxMS5oIgotCi0vKiBib3Jyb3dzIGNvZGUgZnJvbSBzZnRwLXNlcnZlciBhbmQgc3NoLWFnZW50ICovCi0KLWludCBmZCA9IC0xOwotcGlkX3QgcGlkID0gLTE7Ci0KLXN0YXRpYyB2b2lkCi1zZW5kX21zZyhCdWZmZXIgKm0pCi17Ci0JdV9jaGFyIGJ1Zls0XTsKLQlpbnQgbWxlbiA9IGJ1ZmZlcl9sZW4obSk7Ci0KLQlwdXRfdTMyKGJ1ZiwgbWxlbik7Ci0JaWYgKGF0b21pY2lvKHZ3cml0ZSwgZmQsIGJ1ZiwgNCkgIT0gNCB8fAotCSAgICBhdG9taWNpbyh2d3JpdGUsIGZkLCBidWZmZXJfcHRyKG0pLAotCSAgICBidWZmZXJfbGVuKG0pKSAhPSBidWZmZXJfbGVuKG0pKQotCQllcnJvcigid3JpdGUgdG8gaGVscGVyIGZhaWxlZCIpOwotCWJ1ZmZlcl9jb25zdW1lKG0sIG1sZW4pOwotfQotCi1zdGF0aWMgaW50Ci1yZWN2X21zZyhCdWZmZXIgKm0pCi17Ci0JdV9pbnQgbCwgbGVuOwotCXVfY2hhciBidWZbMTAyNF07Ci0KLQlpZiAoKGxlbiA9IGF0b21pY2lvKHJlYWQsIGZkLCBidWYsIDQpKSAhPSA0KSB7Ci0JCWVycm9yKCJyZWFkIGZyb20gaGVscGVyIGZhaWxlZDogJXUiLCBsZW4pOwotCQlyZXR1cm4gKDApOyAvKiBYWFggKi8KLQl9Ci0JbGVuID0gZ2V0X3UzMihidWYpOwotCWlmIChsZW4gPiAyNTYgKiAxMDI0KQotCQlmYXRhbCgicmVzcG9uc2UgdG9vIGxvbmc6ICV1IiwgbGVuKTsKLQkvKiByZWFkIGxlbiBieXRlcyBpbnRvIG0gKi8KLQlidWZmZXJfY2xlYXIobSk7Ci0Jd2hpbGUgKGxlbiA+IDApIHsKLQkJbCA9IGxlbjsKLQkJaWYgKGwgPiBzaXplb2YoYnVmKSkKLQkJCWwgPSBzaXplb2YoYnVmKTsKLQkJaWYgKGF0b21pY2lvKHJlYWQsIGZkLCBidWYsIGwpICE9IGwpIHsKLQkJCWVycm9yKCJyZXNwb25zZSBmcm9tIGhlbHBlciBmYWlsZWQuIik7Ci0JCQlyZXR1cm4gKDApOyAvKiBYWFggKi8KLQkJfQotCQlidWZmZXJfYXBwZW5kKG0sIGJ1ZiwgbCk7Ci0JCWxlbiAtPSBsOwotCX0KLQlyZXR1cm4gKGJ1ZmZlcl9nZXRfY2hhcihtKSk7Ci19Ci0KLWludAotcGtjczExX2luaXQoaW50IGludGVyYWN0aXZlKQotewotCXJldHVybiAoMCk7Ci19Ci0KLXZvaWQKLXBrY3MxMV90ZXJtaW5hdGUodm9pZCkKLXsKLQljbG9zZShmZCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXBrY3MxMV9yc2FfcHJpdmF0ZV9lbmNyeXB0KGludCBmbGVuLCBjb25zdCB1X2NoYXIgKmZyb20sIHVfY2hhciAqdG8sIFJTQSAqcnNhLAotICAgIGludCBwYWRkaW5nKQotewotCUtleSBrZXk7Ci0JdV9jaGFyICpibG9iLCAqc2lnbmF0dXJlID0gTlVMTDsKLQl1X2ludCBibGVuLCBzbGVuID0gMDsKLQlpbnQgcmV0ID0gLTE7Ci0JQnVmZmVyIG1zZzsKLQotCWlmIChwYWRkaW5nICE9IFJTQV9QS0NTMV9QQURESU5HKQotCQlyZXR1cm4gKC0xKTsKLQlrZXkudHlwZSA9IEtFWV9SU0E7Ci0Ja2V5LnJzYSA9IHJzYTsKLQlpZiAoa2V5X3RvX2Jsb2IoJmtleSwgJmJsb2IsICZibGVuKSA9PSAwKQotCQlyZXR1cm4gLTE7Ci0JYnVmZmVyX2luaXQoJm1zZyk7Ci0JYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfQUdFTlRDX1NJR05fUkVRVUVTVCk7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgYmxvYiwgYmxlbik7Ci0JYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgZnJvbSwgZmxlbik7Ci0JYnVmZmVyX3B1dF9pbnQoJm1zZywgMCk7Ci0JeGZyZWUoYmxvYik7Ci0Jc2VuZF9tc2coJm1zZyk7Ci0KLQlpZiAocmVjdl9tc2coJm1zZykgPT0gU1NIMl9BR0VOVF9TSUdOX1JFU1BPTlNFKSB7Ci0JCXNpZ25hdHVyZSA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtc2csICZzbGVuKTsKLQkJaWYgKHNsZW4gPD0gKHVfaW50KVJTQV9zaXplKHJzYSkpIHsKLQkJCW1lbWNweSh0bywgc2lnbmF0dXJlLCBzbGVuKTsKLQkJCXJldCA9IHNsZW47Ci0JCX0KLQkJeGZyZWUoc2lnbmF0dXJlKTsKLQl9Ci0JcmV0dXJuIChyZXQpOwotfQotCi0vKiByZWRpcmVjdCB0aGUgcHJpdmF0ZSBrZXkgZW5jcnlwdCBvcGVyYXRpb24gdG8gdGhlIHNzaC1wa2NzMTEtaGVscGVyICovCi1zdGF0aWMgaW50Ci13cmFwX2tleShSU0EgKnJzYSkKLXsKLQlzdGF0aWMgUlNBX01FVEhPRCBoZWxwZXJfcnNhOwotCi0JbWVtY3B5KCZoZWxwZXJfcnNhLCBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKCksIHNpemVvZihoZWxwZXJfcnNhKSk7Ci0JaGVscGVyX3JzYS5uYW1lID0gInNzaC1wa2NzMTEtaGVscGVyIjsKLQloZWxwZXJfcnNhLnJzYV9wcml2X2VuYyA9IHBrY3MxMV9yc2FfcHJpdmF0ZV9lbmNyeXB0OwotCVJTQV9zZXRfbWV0aG9kKHJzYSwgJmhlbHBlcl9yc2EpOwotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXBrY3MxMV9zdGFydF9oZWxwZXIodm9pZCkKLXsKLQlpbnQgcGFpclsyXTsKLQotCWlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBwYWlyKSA9PSAtMSkgewotCQllcnJvcigic29ja2V0cGFpcjogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JaWYgKChwaWQgPSBmb3JrKCkpID09IC0xKSB7Ci0JCWVycm9yKCJmb3JrOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoLTEpOwotCX0gZWxzZSBpZiAocGlkID09IDApIHsKLQkJaWYgKChkdXAyKHBhaXJbMV0sIFNURElOX0ZJTEVOTykgPT0gLTEpIHx8Ci0JCSAgICAoZHVwMihwYWlyWzFdLCBTVERPVVRfRklMRU5PKSA9PSAtMSkpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiZHVwMjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlfZXhpdCgxKTsKLQkJfQotCQljbG9zZShwYWlyWzBdKTsKLQkJY2xvc2UocGFpclsxXSk7Ci0JCWV4ZWNscChfUEFUSF9TU0hfUEtDUzExX0hFTFBFUiwgX1BBVEhfU1NIX1BLQ1MxMV9IRUxQRVIsCi0JCSAgICAoY2hhciAqKSAwKTsKLQkJZnByaW50ZihzdGRlcnIsICJleGVjOiAlczogJXNcbiIsIF9QQVRIX1NTSF9QS0NTMTFfSEVMUEVSLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJX2V4aXQoMSk7Ci0JfQotCWNsb3NlKHBhaXJbMV0pOwotCWZkID0gcGFpclswXTsKLQlyZXR1cm4gKDApOwotfQotCi1pbnQKLXBrY3MxMV9hZGRfcHJvdmlkZXIoY2hhciAqbmFtZSwgY2hhciAqcGluLCBLZXkgKioqa2V5c3ApCi17Ci0JS2V5ICprOwotCWludCBpLCBua2V5czsKLQl1X2NoYXIgKmJsb2I7Ci0JdV9pbnQgYmxlbjsKLQlCdWZmZXIgbXNnOwotCi0JaWYgKGZkIDwgMCAmJiBwa2NzMTFfc3RhcnRfaGVscGVyKCkgPCAwKQotCQlyZXR1cm4gKC0xKTsKLQotCWJ1ZmZlcl9pbml0KCZtc2cpOwotCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0hfQUdFTlRDX0FERF9TTUFSVENBUkRfS0VZKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgbmFtZSk7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIHBpbik7Ci0Jc2VuZF9tc2coJm1zZyk7Ci0JYnVmZmVyX2NsZWFyKCZtc2cpOwotCi0JaWYgKHJlY3ZfbXNnKCZtc2cpID09IFNTSDJfQUdFTlRfSURFTlRJVElFU19BTlNXRVIpIHsKLQkJbmtleXMgPSBidWZmZXJfZ2V0X2ludCgmbXNnKTsKLQkJKmtleXNwID0geGNhbGxvYyhua2V5cywgc2l6ZW9mKEtleSAqKSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBua2V5czsgaSsrKSB7Ci0JCQlibG9iID0gYnVmZmVyX2dldF9zdHJpbmcoJm1zZywgJmJsZW4pOwotCQkJeGZyZWUoYnVmZmVyX2dldF9zdHJpbmcoJm1zZywgTlVMTCkpOwotCQkJayA9IGtleV9mcm9tX2Jsb2IoYmxvYiwgYmxlbik7Ci0JCQl3cmFwX2tleShrLT5yc2EpOwotCQkJKCprZXlzcClbaV0gPSBrOwotCQkJeGZyZWUoYmxvYik7Ci0JCX0KLQl9IGVsc2UgewotCQlua2V5cyA9IC0xOwotCX0KLQlidWZmZXJfZnJlZSgmbXNnKTsKLQlyZXR1cm4gKG5rZXlzKTsKLX0KLQotaW50Ci1wa2NzMTFfZGVsX3Byb3ZpZGVyKGNoYXIgKm5hbWUpCi17Ci0JaW50IHJldCA9IC0xOwotCUJ1ZmZlciBtc2c7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQlidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIX0FHRU5UQ19SRU1PVkVfU01BUlRDQVJEX0tFWSk7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZtc2csIG5hbWUpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmbXNnLCAiIik7Ci0Jc2VuZF9tc2coJm1zZyk7Ci0JYnVmZmVyX2NsZWFyKCZtc2cpOwotCi0JaWYgKHJlY3ZfbXNnKCZtc2cpID09IFNTSF9BR0VOVF9TVUNDRVNTKQotCQlyZXQgPSAwOwotCWJ1ZmZlcl9mcmVlKCZtc2cpOwotCXJldHVybiAocmV0KTsKLX0KLQotI2VuZGlmIC8qIEVOQUJMRV9QS0NTMTEgKi8KZGlmZiAtLWdpdCBhL3NzaC1wa2NzMTEtaGVscGVyLjAgYi9zc2gtcGtjczExLWhlbHBlci4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDcxMTdlLi4wMDAwMDAwCi0tLSBhL3NzaC1wa2NzMTEtaGVscGVyLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1TU0gtUEtDUzExLUhFTFBFUig4KSAgICBPcGVuQlNEIFN5c3RlbSBNYW5hZ2VyJ3MgTWFudWFsICAgU1NILVBLQ1MxMS1IRUxQRVIoOCkKLQotTkFNRQotICAgICBzc2gtcGtjczExLWhlbHBlciAtIHNzaC1hZ2VudCBoZWxwZXIgcHJvZ3JhbSBmb3IgUEtDUyMxMSBzdXBwb3J0Ci0KLVNZTk9QU0lTCi0gICAgIHNzaC1wa2NzMTEtaGVscGVyCi0KLURFU0NSSVBUSU9OCi0gICAgIHNzaC1wa2NzMTEtaGVscGVyIGlzIHVzZWQgYnkgc3NoLWFnZW50KDEpIHRvIGFjY2VzcyBrZXlzIHByb3ZpZGVkIGJ5IGEKLSAgICAgUEtDUyMxMSB0b2tlbi4KLQotICAgICBzc2gtcGtjczExLWhlbHBlciBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBieSB0aGUgdXNlciwgYnV0IGZyb20KLSAgICAgc3NoLWFnZW50KDEpLgotCi1TRUUgQUxTTwotICAgICBzc2goMSksIHNzaC1hZGQoMSksIHNzaC1hZ2VudCgxKQotCi1ISVNUT1JZCi0gICAgIHNzaC1wa2NzMTEtaGVscGVyIGZpcnN0IGFwcGVhcmVkIGluIE9wZW5CU0QgNC43LgotCi1BVVRIT1JTCi0gICAgIE1hcmt1cyBGcmllZGwgPG1hcmt1c0BvcGVuYnNkLm9yZz4KLQotT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgIEZlYnJ1YXJ5IDEwLCAyMDEwICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9zc2gtcGtjczExLWhlbHBlci44IGIvc3NoLXBrY3MxMS1oZWxwZXIuOApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkYWFkYy4uMDAwMDAwMAotLS0gYS9zc2gtcGtjczExLWhlbHBlci44CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLlwiICRPcGVuQlNEOiBzc2gtcGtjczExLWhlbHBlci44LHYgMS4zIDIwMTAvMDIvMTAgMjM6MjA6MzggbWFya3VzIEV4cCAkCi0uXCIKLS5cIiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLS5cIiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0uXCIgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLS5cIgotLlwiIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotLlwiIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLS5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotLlwiIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLS5cIiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLS5cIiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotLlwiIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0uXCIKLS5EZCAkTWRvY2RhdGU6IEZlYnJ1YXJ5IDEwIDIwMTAgJAotLkR0IFNTSC1QS0NTMTEtSEVMUEVSIDgKLS5PcwotLlNoIE5BTUUKLS5ObSBzc2gtcGtjczExLWhlbHBlcgotLk5kIHNzaC1hZ2VudCBoZWxwZXIgcHJvZ3JhbSBmb3IgUEtDUyMxMSBzdXBwb3J0Ci0uU2ggU1lOT1BTSVMKLS5ObQotLlNoIERFU0NSSVBUSU9OCi0uTm0KLWlzIHVzZWQgYnkKLS5YciBzc2gtYWdlbnQgMQotdG8gYWNjZXNzIGtleXMgcHJvdmlkZWQgYnkgYSBQS0NTIzExIHRva2VuLgotLlBwCi0uTm0KLWlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnZva2VkIGJ5IHRoZSB1c2VyLCBidXQgZnJvbQotLlhyIHNzaC1hZ2VudCAxIC4KLS5TaCBTRUUgQUxTTwotLlhyIHNzaCAxICwKLS5YciBzc2gtYWRkIDEgLAotLlhyIHNzaC1hZ2VudCAxCi0uU2ggSElTVE9SWQotLk5tCi1maXJzdCBhcHBlYXJlZCBpbgotLk94IDQuNyAuCi0uU2ggQVVUSE9SUwotLkFuIE1hcmt1cyBGcmllZGwgQXEgbWFya3VzQG9wZW5ic2Qub3JnCmRpZmYgLS1naXQgYS9zc2gtcGtjczExLWhlbHBlci5jIGIvc3NoLXBrY3MxMS1oZWxwZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzMzUxNS4uMDAwMDAwMAotLS0gYS9zc2gtcGtjczExLWhlbHBlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qICRPcGVuQlNEOiBzc2gtcGtjczExLWhlbHBlci5jLHYgMS4zIDIwMTAvMDIvMjQgMDY6MTI6NTMgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiYXV0aGZkLmgiCi0jaW5jbHVkZSAic3NoLXBrY3MxMS5oIgotCi0jaWZkZWYgRU5BQkxFX1BLQ1MxMQotCi0vKiBib3Jyb3dzIGNvZGUgZnJvbSBzZnRwLXNlcnZlciBhbmQgc3NoLWFnZW50ICovCi0KLXN0cnVjdCBwa2NzMTFfa2V5aW5mbyB7Ci0JS2V5CQkqa2V5OwotCWNoYXIJCSpwcm92aWRlcm5hbWU7Ci0JVEFJTFFfRU5UUlkocGtjczExX2tleWluZm8pIG5leHQ7Ci19OwotCi1UQUlMUV9IRUFEKCwgcGtjczExX2tleWluZm8pIHBrY3MxMV9rZXlsaXN0OwotCi0jZGVmaW5lIE1BWF9NU0dfTEVOR1RICQkxMDI0MCAvKlhYWCovCi0KLS8qIGhlbHBlciAqLwotI2RlZmluZSBnZXRfaW50KCkJCQlidWZmZXJfZ2V0X2ludCgmaXF1ZXVlKTsKLSNkZWZpbmUgZ2V0X3N0cmluZyhsZW5wKQkJYnVmZmVyX2dldF9zdHJpbmcoJmlxdWV1ZSwgbGVucCk7Ci0KLS8qIGlucHV0IGFuZCBvdXRwdXQgcXVldWUgKi8KLUJ1ZmZlciBpcXVldWU7Ci1CdWZmZXIgb3F1ZXVlOwotCi1zdGF0aWMgdm9pZAotYWRkX2tleShLZXkgKmssIGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHBrY3MxMV9rZXlpbmZvICpraTsKLQotCWtpID0geGNhbGxvYygxLCBzaXplb2YoKmtpKSk7Ci0Ja2ktPnByb3ZpZGVybmFtZSA9IHhzdHJkdXAobmFtZSk7Ci0Ja2ktPmtleSA9IGs7Ci0JVEFJTFFfSU5TRVJUX1RBSUwoJnBrY3MxMV9rZXlsaXN0LCBraSwgbmV4dCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWxfa2V5c19ieV9uYW1lKGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHBrY3MxMV9rZXlpbmZvICpraSwgKm54dDsKLQotCWZvciAoa2kgPSBUQUlMUV9GSVJTVCgmcGtjczExX2tleWxpc3QpOyBraTsga2kgPSBueHQpIHsKLQkJbnh0ID0gVEFJTFFfTkVYVChraSwgbmV4dCk7Ci0JCWlmICghc3RyY21wKGtpLT5wcm92aWRlcm5hbWUsIG5hbWUpKSB7Ci0JCQlUQUlMUV9SRU1PVkUoJnBrY3MxMV9rZXlsaXN0LCBraSwgbmV4dCk7Ci0JCQl4ZnJlZShraS0+cHJvdmlkZXJuYW1lKTsKLQkJCWtleV9mcmVlKGtpLT5rZXkpOwotCQkJZnJlZShraSk7Ci0JCX0KLQl9Ci19Ci0KLS8qIGxvb2t1cCBtYXRjaGluZyAncHJpdmF0ZScga2V5ICovCi1zdGF0aWMgS2V5ICoKLWxvb2t1cF9rZXkoS2V5ICprKQotewotCXN0cnVjdCBwa2NzMTFfa2V5aW5mbyAqa2k7Ci0KLQlUQUlMUV9GT1JFQUNIKGtpLCAmcGtjczExX2tleWxpc3QsIG5leHQpIHsKLQkJZGVidWcoImNoZWNrICVwICVzIiwga2ksIGtpLT5wcm92aWRlcm5hbWUpOwotCQlpZiAoa2V5X2VxdWFsKGssIGtpLT5rZXkpKQotCQkJcmV0dXJuIChraS0+a2V5KTsKLQl9Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmRfbXNnKEJ1ZmZlciAqbSkKLXsKLQlpbnQgbWxlbiA9IGJ1ZmZlcl9sZW4obSk7Ci0KLQlidWZmZXJfcHV0X2ludCgmb3F1ZXVlLCBtbGVuKTsKLQlidWZmZXJfYXBwZW5kKCZvcXVldWUsIGJ1ZmZlcl9wdHIobSksIG1sZW4pOwotCWJ1ZmZlcl9jb25zdW1lKG0sIG1sZW4pOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19hZGQodm9pZCkKLXsKLQljaGFyICpuYW1lLCAqcGluOwotCUtleSAqKmtleXM7Ci0JaW50IGksIG5rZXlzOwotCXVfY2hhciAqYmxvYjsKLQl1X2ludCBibGVuOwotCUJ1ZmZlciBtc2c7Ci0KLQlidWZmZXJfaW5pdCgmbXNnKTsKLQluYW1lID0gZ2V0X3N0cmluZyhOVUxMKTsKLQlwaW4gPSBnZXRfc3RyaW5nKE5VTEwpOwotCWlmICgobmtleXMgPSBwa2NzMTFfYWRkX3Byb3ZpZGVyKG5hbWUsIHBpbiwgJmtleXMpKSA+IDApIHsKLQkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSDJfQUdFTlRfSURFTlRJVElFU19BTlNXRVIpOwotCQlidWZmZXJfcHV0X2ludCgmbXNnLCBua2V5cyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBua2V5czsgaSsrKSB7Ci0JCQlrZXlfdG9fYmxvYihrZXlzW2ldLCAmYmxvYiwgJmJsZW4pOwotCQkJYnVmZmVyX3B1dF9zdHJpbmcoJm1zZywgYmxvYiwgYmxlbik7Ci0JCQlidWZmZXJfcHV0X2NzdHJpbmcoJm1zZywgbmFtZSk7Ci0JCQl4ZnJlZShibG9iKTsKLQkJCWFkZF9rZXkoa2V5c1tpXSwgbmFtZSk7Ci0JCX0KLQkJeGZyZWUoa2V5cyk7Ci0JfSBlbHNlIHsKLQkJYnVmZmVyX3B1dF9jaGFyKCZtc2csIFNTSF9BR0VOVF9GQUlMVVJFKTsKLQl9Ci0JeGZyZWUocGluKTsKLQl4ZnJlZShuYW1lKTsKLQlzZW5kX21zZygmbXNnKTsKLQlidWZmZXJfZnJlZSgmbXNnKTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZGVsKHZvaWQpCi17Ci0JY2hhciAqbmFtZSwgKnBpbjsKLQlCdWZmZXIgbXNnOwotCi0JYnVmZmVyX2luaXQoJm1zZyk7Ci0JbmFtZSA9IGdldF9zdHJpbmcoTlVMTCk7Ci0JcGluID0gZ2V0X3N0cmluZyhOVUxMKTsKLQlkZWxfa2V5c19ieV9uYW1lKG5hbWUpOwotCWlmIChwa2NzMTFfZGVsX3Byb3ZpZGVyKG5hbWUpID09IDApCi0JCSBidWZmZXJfcHV0X2NoYXIoJm1zZywgU1NIX0FHRU5UX1NVQ0NFU1MpOwotCWVsc2UKLQkJIGJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0hfQUdFTlRfRkFJTFVSRSk7Ci0JeGZyZWUocGluKTsKLQl4ZnJlZShuYW1lKTsKLQlzZW5kX21zZygmbXNnKTsKLQlidWZmZXJfZnJlZSgmbXNnKTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3Nfc2lnbih2b2lkKQotewotCXVfY2hhciAqYmxvYiwgKmRhdGEsICpzaWduYXR1cmUgPSBOVUxMOwotCXVfaW50IGJsZW4sIGRsZW4sIHNsZW4gPSAwOwotCWludCBvayA9IC0xLCBmbGFncywgcmV0OwotCUtleSAqa2V5LCAqZm91bmQ7Ci0JQnVmZmVyIG1zZzsKLQotCWJsb2IgPSBnZXRfc3RyaW5nKCZibGVuKTsKLQlkYXRhID0gZ2V0X3N0cmluZygmZGxlbik7Ci0JZmxhZ3MgPSBnZXRfaW50KCk7IC8qIFhYWCBpZ25vcmUgKi8KLQotCWlmICgoa2V5ID0ga2V5X2Zyb21fYmxvYihibG9iLCBibGVuKSkgIT0gTlVMTCkgewotCQlpZiAoKGZvdW5kID0gbG9va3VwX2tleShrZXkpKSAhPSBOVUxMKSB7Ci0JCQlzbGVuID0gUlNBX3NpemUoa2V5LT5yc2EpOwotCQkJc2lnbmF0dXJlID0geG1hbGxvYyhzbGVuKTsKLQkJCWlmICgocmV0ID0gUlNBX3ByaXZhdGVfZW5jcnlwdChkbGVuLCBkYXRhLCBzaWduYXR1cmUsCi0JCQkgICAgZm91bmQtPnJzYSwgUlNBX1BLQ1MxX1BBRERJTkcpKSAhPSAtMSkgewotCQkJCXNsZW4gPSByZXQ7Ci0JCQkJb2sgPSAwOwotCQkJfQotCQl9Ci0JCWtleV9mcmVlKGtleSk7Ci0JfQotCWJ1ZmZlcl9pbml0KCZtc2cpOwotCWlmIChvayA9PSAwKSB7Ci0JCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0gyX0FHRU5UX1NJR05fUkVTUE9OU0UpOwotCQlidWZmZXJfcHV0X3N0cmluZygmbXNnLCBzaWduYXR1cmUsIHNsZW4pOwotCX0gZWxzZSB7Ci0JCWJ1ZmZlcl9wdXRfY2hhcigmbXNnLCBTU0hfQUdFTlRfRkFJTFVSRSk7Ci0JfQotCXhmcmVlKGRhdGEpOwotCXhmcmVlKGJsb2IpOwotCWlmIChzaWduYXR1cmUgIT0gTlVMTCkKLQkJeGZyZWUoc2lnbmF0dXJlKTsKLQlzZW5kX21zZygmbXNnKTsKLQlidWZmZXJfZnJlZSgmbXNnKTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3Modm9pZCkKLXsKLQl1X2ludCBtc2dfbGVuOwotCXVfaW50IGJ1Zl9sZW47Ci0JdV9pbnQgY29uc3VtZWQ7Ci0JdV9pbnQgdHlwZTsKLQl1X2NoYXIgKmNwOwotCi0JYnVmX2xlbiA9IGJ1ZmZlcl9sZW4oJmlxdWV1ZSk7Ci0JaWYgKGJ1Zl9sZW4gPCA1KQotCQlyZXR1cm47CQkvKiBJbmNvbXBsZXRlIG1lc3NhZ2UuICovCi0JY3AgPSBidWZmZXJfcHRyKCZpcXVldWUpOwotCW1zZ19sZW4gPSBnZXRfdTMyKGNwKTsKLQlpZiAobXNnX2xlbiA+IE1BWF9NU0dfTEVOR1RIKSB7Ci0JCWVycm9yKCJiYWQgbWVzc2FnZSBsZW4gJWQiLCBtc2dfbGVuKTsKLQkJY2xlYW51cF9leGl0KDExKTsKLQl9Ci0JaWYgKGJ1Zl9sZW4gPCBtc2dfbGVuICsgNCkKLQkJcmV0dXJuOwotCWJ1ZmZlcl9jb25zdW1lKCZpcXVldWUsIDQpOwotCWJ1Zl9sZW4gLT0gNDsKLQl0eXBlID0gYnVmZmVyX2dldF9jaGFyKCZpcXVldWUpOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgU1NIX0FHRU5UQ19BRERfU01BUlRDQVJEX0tFWToKLQkJZGVidWcoInByb2Nlc3NfYWRkIik7Ci0JCXByb2Nlc3NfYWRkKCk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIX0FHRU5UQ19SRU1PVkVfU01BUlRDQVJEX0tFWToKLQkJZGVidWcoInByb2Nlc3NfZGVsIik7Ci0JCXByb2Nlc3NfZGVsKCk7Ci0JCWJyZWFrOwotCWNhc2UgU1NIMl9BR0VOVENfU0lHTl9SRVFVRVNUOgotCQlkZWJ1ZygicHJvY2Vzc19zaWduIik7Ci0JCXByb2Nlc3Nfc2lnbigpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQllcnJvcigiVW5rbm93biBtZXNzYWdlICVkIiwgdHlwZSk7Ci0JCWJyZWFrOwotCX0KLQkvKiBkaXNjYXJkIHRoZSByZW1haW5pbmcgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBwYWNrZXQgKi8KLQlpZiAoYnVmX2xlbiA8IGJ1ZmZlcl9sZW4oJmlxdWV1ZSkpIHsKLQkJZXJyb3IoImlxdWV1ZSBncmV3IHVuZXhwZWN0ZWRseSIpOwotCQljbGVhbnVwX2V4aXQoMjU1KTsKLQl9Ci0JY29uc3VtZWQgPSBidWZfbGVuIC0gYnVmZmVyX2xlbigmaXF1ZXVlKTsKLQlpZiAobXNnX2xlbiA8IGNvbnN1bWVkKSB7Ci0JCWVycm9yKCJtc2dfbGVuICVkIDwgY29uc3VtZWQgJWQiLCBtc2dfbGVuLCBjb25zdW1lZCk7Ci0JCWNsZWFudXBfZXhpdCgyNTUpOwotCX0KLQlpZiAobXNnX2xlbiA+IGNvbnN1bWVkKQotCQlidWZmZXJfY29uc3VtZSgmaXF1ZXVlLCBtc2dfbGVuIC0gY29uc3VtZWQpOwotfQotCi12b2lkCi1jbGVhbnVwX2V4aXQoaW50IGkpCi17Ci0JLyogWFhYICovCi0JX2V4aXQoaSk7Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0JZmRfc2V0ICpyc2V0LCAqd3NldDsKLQlpbnQgaW4sIG91dCwgbWF4LCBsb2dfc3RkZXJyID0gMDsKLQlzc2l6ZV90IGxlbiwgb2xlbiwgc2V0X3NpemU7Ci0JU3lzbG9nRmFjaWxpdHkgbG9nX2ZhY2lsaXR5ID0gU1lTTE9HX0ZBQ0lMSVRZX0FVVEg7Ci0JTG9nTGV2ZWwgbG9nX2xldmVsID0gU1lTTE9HX0xFVkVMX0VSUk9SOwotCWNoYXIgYnVmWzQqNDA5Nl07Ci0KLQlleHRlcm4gY2hhciAqb3B0YXJnOwotCWV4dGVybiBjaGFyICpfX3Byb2duYW1lOwotCi0JVEFJTFFfSU5JVCgmcGtjczExX2tleWxpc3QpOwotCXBrY3MxMV9pbml0KDApOwotCi0Jc2VlZF9ybmcoKTsKLQlfX3Byb2duYW1lID0gc3NoX2dldF9wcm9nbmFtZShhcmd2WzBdKTsKLQotCWxvZ19pbml0KF9fcHJvZ25hbWUsIGxvZ19sZXZlbCwgbG9nX2ZhY2lsaXR5LCBsb2dfc3RkZXJyKTsKLQotCWluID0gU1RESU5fRklMRU5POwotCW91dCA9IFNURE9VVF9GSUxFTk87Ci0KLQltYXggPSAwOwotCWlmIChpbiA+IG1heCkKLQkJbWF4ID0gaW47Ci0JaWYgKG91dCA+IG1heCkKLQkJbWF4ID0gb3V0OwotCi0JYnVmZmVyX2luaXQoJmlxdWV1ZSk7Ci0JYnVmZmVyX2luaXQoJm9xdWV1ZSk7Ci0KLQlzZXRfc2l6ZSA9IGhvd21hbnkobWF4ICsgMSwgTkZEQklUUykgKiBzaXplb2YoZmRfbWFzayk7Ci0JcnNldCA9IChmZF9zZXQgKil4bWFsbG9jKHNldF9zaXplKTsKLQl3c2V0ID0gKGZkX3NldCAqKXhtYWxsb2Moc2V0X3NpemUpOwotCi0JZm9yICg7OykgewotCQltZW1zZXQocnNldCwgMCwgc2V0X3NpemUpOwotCQltZW1zZXQod3NldCwgMCwgc2V0X3NpemUpOwotCi0JCS8qCi0JCSAqIEVuc3VyZSB0aGF0IHdlIGNhbiByZWFkIGEgZnVsbCBidWZmZXIgYW5kIGhhbmRsZQotCQkgKiB0aGUgd29yc3QtY2FzZSBsZW5ndGggcGFja2V0IGl0IGNhbiBnZW5lcmF0ZSwKLQkJICogb3RoZXJ3aXNlIGFwcGx5IGJhY2twcmVzc3VyZSBieSBzdG9wcGluZyByZWFkcy4KLQkJICovCi0JCWlmIChidWZmZXJfY2hlY2tfYWxsb2MoJmlxdWV1ZSwgc2l6ZW9mKGJ1ZikpICYmCi0JCSAgICBidWZmZXJfY2hlY2tfYWxsb2MoJm9xdWV1ZSwgTUFYX01TR19MRU5HVEgpKQotCQkJRkRfU0VUKGluLCByc2V0KTsKLQotCQlvbGVuID0gYnVmZmVyX2xlbigmb3F1ZXVlKTsKLQkJaWYgKG9sZW4gPiAwKQotCQkJRkRfU0VUKG91dCwgd3NldCk7Ci0KLQkJaWYgKHNlbGVjdChtYXgrMSwgcnNldCwgd3NldCwgTlVMTCwgTlVMTCkgPCAwKSB7Ci0JCQlpZiAoZXJybm8gPT0gRUlOVFIpCi0JCQkJY29udGludWU7Ci0JCQllcnJvcigic2VsZWN0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQljbGVhbnVwX2V4aXQoMik7Ci0JCX0KLQotCQkvKiBjb3B5IHN0ZGluIHRvIGlxdWV1ZSAqLwotCQlpZiAoRkRfSVNTRVQoaW4sIHJzZXQpKSB7Ci0JCQlsZW4gPSByZWFkKGluLCBidWYsIHNpemVvZiBidWYpOwotCQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQkJZGVidWcoInJlYWQgZW9mIik7Ci0JCQkJY2xlYW51cF9leGl0KDApOwotCQkJfSBlbHNlIGlmIChsZW4gPCAwKSB7Ci0JCQkJZXJyb3IoInJlYWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQljbGVhbnVwX2V4aXQoMSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ1ZmZlcl9hcHBlbmQoJmlxdWV1ZSwgYnVmLCBsZW4pOwotCQkJfQotCQl9Ci0JCS8qIHNlbmQgb3F1ZXVlIHRvIHN0ZG91dCAqLwotCQlpZiAoRkRfSVNTRVQob3V0LCB3c2V0KSkgewotCQkJbGVuID0gd3JpdGUob3V0LCBidWZmZXJfcHRyKCZvcXVldWUpLCBvbGVuKTsKLQkJCWlmIChsZW4gPCAwKSB7Ci0JCQkJZXJyb3IoIndyaXRlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQkJY2xlYW51cF9leGl0KDEpOwotCQkJfSBlbHNlIHsKLQkJCQlidWZmZXJfY29uc3VtZSgmb3F1ZXVlLCBsZW4pOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogUHJvY2VzcyByZXF1ZXN0cyBmcm9tIGNsaWVudCBpZiB3ZSBjYW4gZml0IHRoZSByZXN1bHRzCi0JCSAqIGludG8gdGhlIG91dHB1dCBidWZmZXIsIG90aGVyd2lzZSBzdG9wIHByb2Nlc3NpbmcgaW5wdXQKLQkJICogYW5kIGxldCB0aGUgb3V0cHV0IHF1ZXVlIGRyYWluLgotCQkgKi8KLQkJaWYgKGJ1ZmZlcl9jaGVja19hbGxvYygmb3F1ZXVlLCBNQVhfTVNHX0xFTkdUSCkpCi0JCQlwcm9jZXNzKCk7Ci0JfQotfQotI2Vsc2UgLyogRU5BQkxFX1BLQ1MxMSAqLwotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQlleHRlcm4gY2hhciAqX19wcm9nbmFtZTsKLQotCV9fcHJvZ25hbWUgPSBzc2hfZ2V0X3Byb2duYW1lKGFyZ3ZbMF0pOwotCWxvZ19pbml0KF9fcHJvZ25hbWUsIFNZU0xPR19MRVZFTF9FUlJPUiwgU1lTTE9HX0ZBQ0lMSVRZX0FVVEgsIDApOwotCWZhdGFsKCJQS0NTIzExIHN1cHBvcnQgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lIik7Ci19Ci0jZW5kaWYgLyogRU5BQkxFX1BLQ1MxMSAqLwpkaWZmIC0tZ2l0IGEvc3NoLXBrY3MxMS5jIGIvc3NoLXBrY3MxMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRjMWM4Li4wMDAwMDAwCi0tLSBhL3NzaC1wa2NzMTEuYworKysgL2Rldi9udWxsCkBAIC0xLDYwNyArMCwwIEBACi0vKiAkT3BlbkJTRDogc3NoLXBrY3MxMS5jLHYgMS42IDIwMTAvMDYvMDggMjE6MzI6MTkgbWFya3VzIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaWZkZWYgRU5BQkxFX1BLQ1MxMQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLQotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy1xdWV1ZS5oIgotCi0jZGVmaW5lIENSWVBUT0tJX0NPTVBBVAotI2luY2x1ZGUgInBrY3MxMS5oIgotCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgInNzaC1wa2NzMTEuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0KLXN0cnVjdCBwa2NzMTFfc2xvdGluZm8gewotCUNLX1RPS0VOX0lORk8JCXRva2VuOwotCUNLX1NFU1NJT05fSEFORExFCXNlc3Npb247Ci0JaW50CQkJbG9nZ2VkX2luOwotfTsKLQotc3RydWN0IHBrY3MxMV9wcm92aWRlciB7Ci0JY2hhcgkJCSpuYW1lOwotCXZvaWQJCQkqaGFuZGxlOwotCUNLX0ZVTkNUSU9OX0xJU1QJKmZ1bmN0aW9uX2xpc3Q7Ci0JQ0tfSU5GTwkJCWluZm87Ci0JQ0tfVUxPTkcJCW5zbG90czsKLQlDS19TTE9UX0lECQkqc2xvdGxpc3Q7Ci0Jc3RydWN0IHBrY3MxMV9zbG90aW5mbwkqc2xvdGluZm87Ci0JaW50CQkJdmFsaWQ7Ci0JaW50CQkJcmVmY291bnQ7Ci0JVEFJTFFfRU5UUlkocGtjczExX3Byb3ZpZGVyKSBuZXh0OwotfTsKLQotVEFJTFFfSEVBRCgsIHBrY3MxMV9wcm92aWRlcikgcGtjczExX3Byb3ZpZGVyczsKLQotc3RydWN0IHBrY3MxMV9rZXkgewotCXN0cnVjdCBwa2NzMTFfcHJvdmlkZXIJKnByb3ZpZGVyOwotCUNLX1VMT05HCQlzbG90aWR4OwotCWludAkJCSgqb3JpZ19maW5pc2gpKFJTQSAqcnNhKTsKLQlSU0FfTUVUSE9ECQlyc2FfbWV0aG9kOwotCWNoYXIJCQkqa2V5aWQ7Ci0JaW50CQkJa2V5aWRfbGVuOwotfTsKLQotaW50IHBrY3MxMV9pbnRlcmFjdGl2ZSA9IDA7Ci0KLWludAotcGtjczExX2luaXQoaW50IGludGVyYWN0aXZlKQotewotCXBrY3MxMV9pbnRlcmFjdGl2ZSA9IGludGVyYWN0aXZlOwotCVRBSUxRX0lOSVQoJnBrY3MxMV9wcm92aWRlcnMpOwotCXJldHVybiAoMCk7Ci19Ci0KLS8qCi0gKiBmaW5hbGl6ZSBhIHByb3ZpZGVyIHNoYXJlZCBsaWJhcmFyeSwgaXQncyBubyBsb25nZXIgdXNhYmxlLgotICogaG93ZXZlciwgdGhlcmUgbWlnaHQgc3RpbGwgYmUga2V5cyByZWZlcmVuY2luZyB0aGlzIHByb3ZpZGVyLAotICogc28gdGhlIGFjdHVhbGwgZnJlZWluZyBvZiBtZW1vcnkgaXMgaGFuZGxlZCBieSBwa2NzMTFfcHJvdmlkZXJfdW5yZWYoKS4KLSAqIHRoaXMgaXMgY2FsbGVkIHdoZW4gYSBwcm92aWRlciBnZXRzIHVucmVnaXN0ZXJlZC4KLSAqLwotc3RhdGljIHZvaWQKLXBrY3MxMV9wcm92aWRlcl9maW5hbGl6ZShzdHJ1Y3QgcGtjczExX3Byb3ZpZGVyICpwKQotewotCUNLX1JWIHJ2OwotCUNLX1VMT05HIGk7Ci0KLQlkZWJ1ZygicGtjczExX3Byb3ZpZGVyX2ZpbmFsaXplOiAlcCByZWZjb3VudCAlZCB2YWxpZCAlZCIsCi0JICAgIHAsIHAtPnJlZmNvdW50LCBwLT52YWxpZCk7Ci0JaWYgKCFwLT52YWxpZCkKLQkJcmV0dXJuOwotCWZvciAoaSA9IDA7IGkgPCBwLT5uc2xvdHM7IGkrKykgewotCQlpZiAocC0+c2xvdGluZm9baV0uc2Vzc2lvbiAmJgotCQkgICAgKHJ2ID0gcC0+ZnVuY3Rpb25fbGlzdC0+Q19DbG9zZVNlc3Npb24oCi0JCSAgICBwLT5zbG90aW5mb1tpXS5zZXNzaW9uKSkgIT0gQ0tSX09LKQotCQkJZXJyb3IoIkNfQ2xvc2VTZXNzaW9uIGZhaWxlZDogJWx1IiwgcnYpOwotCX0KLQlpZiAoKHJ2ID0gcC0+ZnVuY3Rpb25fbGlzdC0+Q19GaW5hbGl6ZShOVUxMKSkgIT0gQ0tSX09LKQotCQllcnJvcigiQ19GaW5hbGl6ZSBmYWlsZWQ6ICVsdSIsIHJ2KTsKLQlwLT52YWxpZCA9IDA7Ci0JcC0+ZnVuY3Rpb25fbGlzdCA9IE5VTEw7Ci0JZGxjbG9zZShwLT5oYW5kbGUpOwotfQotCi0vKgotICogcmVtb3ZlIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm92aWRlci4KLSAqIGNhbGxlZCB3aGVuIGEga2V5IGdldHMgZGVzdHJveWVkIG9yIHdoZW4gdGhlIHByb3ZpZGVyIGlzIHVucmVnaXN0ZXJlZC4KLSAqLwotc3RhdGljIHZvaWQKLXBrY3MxMV9wcm92aWRlcl91bnJlZihzdHJ1Y3QgcGtjczExX3Byb3ZpZGVyICpwKQotewotCWRlYnVnKCJwa2NzMTFfcHJvdmlkZXJfdW5yZWY6ICVwIHJlZmNvdW50ICVkIiwgcCwgcC0+cmVmY291bnQpOwotCWlmICgtLXAtPnJlZmNvdW50IDw9IDApIHsKLQkJaWYgKHAtPnZhbGlkKQotCQkJZXJyb3IoInBrY3MxMV9wcm92aWRlcl91bnJlZjogJXAgc3RpbGwgdmFsaWQiLCBwKTsKLQkJeGZyZWUocC0+c2xvdGxpc3QpOwotCQl4ZnJlZShwLT5zbG90aW5mbyk7Ci0JCXhmcmVlKHApOwotCX0KLX0KLQotLyogdW5yZWdpc3RlciBhbGwgcHJvdmlkZXJzLCBrZXlzIG1pZ2h0IHN0aWxsIHBvaW50IHRvIHRoZSBwcm92aWRlcnMgKi8KLXZvaWQKLXBrY3MxMV90ZXJtaW5hdGUodm9pZCkKLXsKLQlzdHJ1Y3QgcGtjczExX3Byb3ZpZGVyICpwOwotCi0Jd2hpbGUgKChwID0gVEFJTFFfRklSU1QoJnBrY3MxMV9wcm92aWRlcnMpKSAhPSBOVUxMKSB7Ci0JCVRBSUxRX1JFTU9WRSgmcGtjczExX3Byb3ZpZGVycywgcCwgbmV4dCk7Ci0JCXBrY3MxMV9wcm92aWRlcl9maW5hbGl6ZShwKTsKLQkJcGtjczExX3Byb3ZpZGVyX3VucmVmKHApOwotCX0KLX0KLQotLyogbG9va3VwIHByb3ZpZGVyIGJ5IG5hbWUgKi8KLXN0YXRpYyBzdHJ1Y3QgcGtjczExX3Byb3ZpZGVyICoKLXBrY3MxMV9wcm92aWRlcl9sb29rdXAoY2hhciAqcHJvdmlkZXJfaWQpCi17Ci0Jc3RydWN0IHBrY3MxMV9wcm92aWRlciAqcDsKLQotCVRBSUxRX0ZPUkVBQ0gocCwgJnBrY3MxMV9wcm92aWRlcnMsIG5leHQpIHsKLQkJZGVidWcoImNoZWNrICVwICVzIiwgcCwgcC0+bmFtZSk7Ci0JCWlmICghc3RyY21wKHByb3ZpZGVyX2lkLCBwLT5uYW1lKSkKLQkJCXJldHVybiAocCk7Ci0JfQotCXJldHVybiAoTlVMTCk7Ci19Ci0KLS8qIHVucmVnaXN0ZXIgcHJvdmlkZXIgYnkgbmFtZSAqLwotaW50Ci1wa2NzMTFfZGVsX3Byb3ZpZGVyKGNoYXIgKnByb3ZpZGVyX2lkKQotewotCXN0cnVjdCBwa2NzMTFfcHJvdmlkZXIgKnA7Ci0KLQlpZiAoKHAgPSBwa2NzMTFfcHJvdmlkZXJfbG9va3VwKHByb3ZpZGVyX2lkKSkgIT0gTlVMTCkgewotCQlUQUlMUV9SRU1PVkUoJnBrY3MxMV9wcm92aWRlcnMsIHAsIG5leHQpOwotCQlwa2NzMTFfcHJvdmlkZXJfZmluYWxpemUocCk7Ci0JCXBrY3MxMV9wcm92aWRlcl91bnJlZihwKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JcmV0dXJuICgtMSk7Ci19Ci0KLS8qIG9wZW5zc2wgY2FsbGJhY2sgZm9yIGZyZWVpbmcgYW4gUlNBIGtleSAqLwotc3RhdGljIGludAotcGtjczExX3JzYV9maW5pc2goUlNBICpyc2EpCi17Ci0Jc3RydWN0IHBrY3MxMV9rZXkJKmsxMTsKLQlpbnQgcnYgPSAtMTsKLQotCWlmICgoazExID0gUlNBX2dldF9hcHBfZGF0YShyc2EpKSAhPSBOVUxMKSB7Ci0JCWlmIChrMTEtPm9yaWdfZmluaXNoKQotCQkJcnYgPSBrMTEtPm9yaWdfZmluaXNoKHJzYSk7Ci0JCWlmIChrMTEtPnByb3ZpZGVyKQotCQkJcGtjczExX3Byb3ZpZGVyX3VucmVmKGsxMS0+cHJvdmlkZXIpOwotCQlpZiAoazExLT5rZXlpZCkKLQkJCXhmcmVlKGsxMS0+a2V5aWQpOwotCQl4ZnJlZShrMTEpOwotCX0KLQlyZXR1cm4gKHJ2KTsKLX0KLQotLyogZmluZCBhIHNpbmdsZSAnb2JqJyBmb3IgZ2l2ZW4gYXR0cmlidXRlcyAqLwotc3RhdGljIGludAotcGtjczExX2ZpbmQoc3RydWN0IHBrY3MxMV9wcm92aWRlciAqcCwgQ0tfVUxPTkcgc2xvdGlkeCwgQ0tfQVRUUklCVVRFICphdHRyLAotICAgIENLX1VMT05HIG5hdHRyLCBDS19PQkpFQ1RfSEFORExFICpvYmopCi17Ci0JQ0tfRlVOQ1RJT05fTElTVAkqZjsKLQlDS19TRVNTSU9OX0hBTkRMRQlzZXNzaW9uOwotCUNLX1VMT05HCQluZm91bmQgPSAwOwotCUNLX1JWCQkJcnY7Ci0JaW50CQkJcmV0ID0gLTE7Ci0KLQlmID0gcC0+ZnVuY3Rpb25fbGlzdDsKLQlzZXNzaW9uID0gcC0+c2xvdGluZm9bc2xvdGlkeF0uc2Vzc2lvbjsKLQlpZiAoKHJ2ID0gZi0+Q19GaW5kT2JqZWN0c0luaXQoc2Vzc2lvbiwgYXR0ciwgbmF0dHIpKSAhPSBDS1JfT0spIHsKLQkJZXJyb3IoIkNfRmluZE9iamVjdHNJbml0IGZhaWxlZCAobmF0dHIgJWx1KTogJWx1IiwgbmF0dHIsIHJ2KTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWlmICgocnYgPSBmLT5DX0ZpbmRPYmplY3RzKHNlc3Npb24sIG9iaiwgMSwgJm5mb3VuZCkpICE9IENLUl9PSyB8fAotCSAgICBuZm91bmQgIT0gMSkgewotCQlkZWJ1ZygiQ19GaW5kT2JqZWN0cyBmYWlsZWQgKG5mb3VuZCAlbHUgbmF0dHIgJWx1KTogJWx1IiwKLQkJICAgIG5mb3VuZCwgbmF0dHIsIHJ2KTsKLQl9IGVsc2UKLQkJcmV0ID0gMDsKLQlpZiAoKHJ2ID0gZi0+Q19GaW5kT2JqZWN0c0ZpbmFsKHNlc3Npb24pKSAhPSBDS1JfT0spCi0JCWVycm9yKCJDX0ZpbmRPYmplY3RzRmluYWwgZmFpbGVkOiAlbHUiLCBydik7Ci0JcmV0dXJuIChyZXQpOwotfQotCi0vKiBvcGVuc3NsIGNhbGxiYWNrIGRvaW5nIHRoZSBhY3R1YWwgc2lnbmluZyBvcGVyYXRpb24gKi8KLXN0YXRpYyBpbnQKLXBrY3MxMV9yc2FfcHJpdmF0ZV9lbmNyeXB0KGludCBmbGVuLCBjb25zdCB1X2NoYXIgKmZyb20sIHVfY2hhciAqdG8sIFJTQSAqcnNhLAotICAgIGludCBwYWRkaW5nKQotewotCXN0cnVjdCBwa2NzMTFfa2V5CSprMTE7Ci0Jc3RydWN0IHBrY3MxMV9zbG90aW5mbwkqc2k7Ci0JQ0tfRlVOQ1RJT05fTElTVAkqZjsKLQlDS19PQkpFQ1RfSEFORExFCW9iajsKLQlDS19VTE9ORwkJdGxlbiA9IDA7Ci0JQ0tfUlYJCQlydjsKLQlDS19PQkpFQ1RfQ0xBU1MJCXByaXZhdGVfa2V5X2NsYXNzID0gQ0tPX1BSSVZBVEVfS0VZOwotCUNLX0JCT09MCQl0cnVlX3ZhbCA9IENLX1RSVUU7Ci0JQ0tfTUVDSEFOSVNNCQltZWNoID0gewotCQlDS01fUlNBX1BLQ1MsIE5VTExfUFRSLCAwCi0JfTsKLQlDS19BVFRSSUJVVEUJCWtleV9maWx0ZXJbXSA9IHsKLQkJe0NLQV9DTEFTUywgTlVMTCwgc2l6ZW9mKHByaXZhdGVfa2V5X2NsYXNzKSB9LAotCQl7Q0tBX0lELCBOVUxMLCAwfSwKLQkJe0NLQV9TSUdOLCBOVUxMLCBzaXplb2YodHJ1ZV92YWwpIH0KLQl9OwotCWNoYXIJCQkqcGluLCBwcm9tcHRbMTAyNF07Ci0JaW50CQkJcnZhbCA9IC0xOwotCi0JLyogc29tZSBjb21waWxlcnMgY29tcGxhaW4gYWJvdXQgbm9uLWNvbnN0YW50IGluaXRpYWxpemVyIHNvIHdlCi0JICAgdXNlIE5VTEwgaW4gQ0tfQVRUUklCVVRFIGFib3ZlIGFuZCBzZXQgdGhlIHZhbHVlcyBoZXJlICovCi0Ja2V5X2ZpbHRlclswXS5wVmFsdWUgPSAmcHJpdmF0ZV9rZXlfY2xhc3M7Ci0Ja2V5X2ZpbHRlclsyXS5wVmFsdWUgPSAmdHJ1ZV92YWw7Ci0KLQlpZiAoKGsxMSA9IFJTQV9nZXRfYXBwX2RhdGEocnNhKSkgPT0gTlVMTCkgewotCQllcnJvcigiUlNBX2dldF9hcHBfZGF0YSBmYWlsZWQgZm9yIHJzYSAlcCIsIHJzYSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlpZiAoIWsxMS0+cHJvdmlkZXIgfHwgIWsxMS0+cHJvdmlkZXItPnZhbGlkKSB7Ci0JCWVycm9yKCJubyBwa2NzMTEgKHZhbGlkKSBwcm92aWRlciBmb3IgcnNhICVwIiwgcnNhKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWYgPSBrMTEtPnByb3ZpZGVyLT5mdW5jdGlvbl9saXN0OwotCXNpID0gJmsxMS0+cHJvdmlkZXItPnNsb3RpbmZvW2sxMS0+c2xvdGlkeF07Ci0JaWYgKChzaS0+dG9rZW4uZmxhZ3MgJiBDS0ZfTE9HSU5fUkVRVUlSRUQpICYmICFzaS0+bG9nZ2VkX2luKSB7Ci0JCWlmICghcGtjczExX2ludGVyYWN0aXZlKSB7Ci0JCQllcnJvcigibmVlZCBwaW4iKTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JCXNucHJpbnRmKHByb21wdCwgc2l6ZW9mKHByb21wdCksICJFbnRlciBQSU4gZm9yICclcyc6ICIsCi0JCSAgICBzaS0+dG9rZW4ubGFiZWwpOwotCQlwaW4gPSByZWFkX3Bhc3NwaHJhc2UocHJvbXB0LCBSUF9BTExPV19FT0YpOwotCQlpZiAocGluID09IE5VTEwpCi0JCQlyZXR1cm4gKC0xKTsJLyogYmFpbCBvdXQgKi8KLQkJaWYgKChydiA9IGYtPkNfTG9naW4oc2ktPnNlc3Npb24sIENLVV9VU0VSLCBwaW4sIHN0cmxlbihwaW4pKSkKLQkJICAgICE9IENLUl9PSykgewotCQkJeGZyZWUocGluKTsKLQkJCWVycm9yKCJDX0xvZ2luIGZhaWxlZDogJWx1IiwgcnYpOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQkJeGZyZWUocGluKTsKLQkJc2ktPmxvZ2dlZF9pbiA9IDE7Ci0JfQotCWtleV9maWx0ZXJbMV0ucFZhbHVlID0gazExLT5rZXlpZDsKLQlrZXlfZmlsdGVyWzFdLnVsVmFsdWVMZW4gPSBrMTEtPmtleWlkX2xlbjsKLQkvKiB0cnkgdG8gZmluZCBvYmplY3Qgdy9DS0FfU0lHTiBmaXJzdCwgcmV0cnkgdy9vICovCi0JaWYgKHBrY3MxMV9maW5kKGsxMS0+cHJvdmlkZXIsIGsxMS0+c2xvdGlkeCwga2V5X2ZpbHRlciwgMywgJm9iaikgPCAwICYmCi0JICAgIHBrY3MxMV9maW5kKGsxMS0+cHJvdmlkZXIsIGsxMS0+c2xvdGlkeCwga2V5X2ZpbHRlciwgMiwgJm9iaikgPCAwKSB7Ci0JCWVycm9yKCJjYW5ub3QgZmluZCBwcml2YXRlIGtleSIpOwotCX0gZWxzZSBpZiAoKHJ2ID0gZi0+Q19TaWduSW5pdChzaS0+c2Vzc2lvbiwgJm1lY2gsIG9iaikpICE9IENLUl9PSykgewotCQllcnJvcigiQ19TaWduSW5pdCBmYWlsZWQ6ICVsdSIsIHJ2KTsKLQl9IGVsc2UgewotCQkvKiBYWFggaGFuZGxlIENLUl9CVUZGRVJfVE9PX1NNQUxMICovCi0JCXRsZW4gPSBSU0Ffc2l6ZShyc2EpOwotCQlydiA9IGYtPkNfU2lnbihzaS0+c2Vzc2lvbiwgKENLX0JZVEUgKilmcm9tLCBmbGVuLCB0bywgJnRsZW4pOwotCQlpZiAocnYgPT0gQ0tSX09LKSAKLQkJCXJ2YWwgPSB0bGVuOwotCQllbHNlIAotCQkJZXJyb3IoIkNfU2lnbiBmYWlsZWQ6ICVsdSIsIHJ2KTsKLQl9Ci0JcmV0dXJuIChydmFsKTsKLX0KLQotc3RhdGljIGludAotcGtjczExX3JzYV9wcml2YXRlX2RlY3J5cHQoaW50IGZsZW4sIGNvbnN0IHVfY2hhciAqZnJvbSwgdV9jaGFyICp0bywgUlNBICpyc2EsCi0gICAgaW50IHBhZGRpbmcpCi17Ci0JcmV0dXJuICgtMSk7Ci19Ci0KLS8qIHJlZGlyZWN0IHByaXZhdGUga2V5IG9wZXJhdGlvbnMgZm9yIHJzYSBrZXkgdG8gcGtjczExIHRva2VuICovCi1zdGF0aWMgaW50Ci1wa2NzMTFfcnNhX3dyYXAoc3RydWN0IHBrY3MxMV9wcm92aWRlciAqcHJvdmlkZXIsIENLX1VMT05HIHNsb3RpZHgsCi0gICAgQ0tfQVRUUklCVVRFICprZXlpZF9hdHRyaWIsIFJTQSAqcnNhKQotewotCXN0cnVjdCBwa2NzMTFfa2V5CSprMTE7Ci0JY29uc3QgUlNBX01FVEhPRAkqZGVmID0gUlNBX2dldF9kZWZhdWx0X21ldGhvZCgpOwotCi0JazExID0geGNhbGxvYygxLCBzaXplb2YoKmsxMSkpOwotCWsxMS0+cHJvdmlkZXIgPSBwcm92aWRlcjsKLQlwcm92aWRlci0+cmVmY291bnQrKzsJLyogcHJvdmlkZXIgcmVmZXJlbmNlZCBieSBSU0Ega2V5ICovCi0JazExLT5zbG90aWR4ID0gc2xvdGlkeDsKLQkvKiBpZGVudGlmeSBrZXkgb2JqZWN0IG9uIHNtYXJ0Y2FyZCAqLwotCWsxMS0+a2V5aWRfbGVuID0ga2V5aWRfYXR0cmliLT51bFZhbHVlTGVuOwotCWsxMS0+a2V5aWQgPSB4bWFsbG9jKGsxMS0+a2V5aWRfbGVuKTsKLQltZW1jcHkoazExLT5rZXlpZCwga2V5aWRfYXR0cmliLT5wVmFsdWUsIGsxMS0+a2V5aWRfbGVuKTsKLQlrMTEtPm9yaWdfZmluaXNoID0gZGVmLT5maW5pc2g7Ci0JbWVtY3B5KCZrMTEtPnJzYV9tZXRob2QsIGRlZiwgc2l6ZW9mKGsxMS0+cnNhX21ldGhvZCkpOwotCWsxMS0+cnNhX21ldGhvZC5uYW1lID0gInBrY3MxMSI7Ci0JazExLT5yc2FfbWV0aG9kLnJzYV9wcml2X2VuYyA9IHBrY3MxMV9yc2FfcHJpdmF0ZV9lbmNyeXB0OwotCWsxMS0+cnNhX21ldGhvZC5yc2FfcHJpdl9kZWMgPSBwa2NzMTFfcnNhX3ByaXZhdGVfZGVjcnlwdDsKLQlrMTEtPnJzYV9tZXRob2QuZmluaXNoID0gcGtjczExX3JzYV9maW5pc2g7Ci0JUlNBX3NldF9tZXRob2QocnNhLCAmazExLT5yc2FfbWV0aG9kKTsKLQlSU0Ffc2V0X2FwcF9kYXRhKHJzYSwgazExKTsKLQlyZXR1cm4gKDApOwotfQotCi0vKiByZW1vdmUgdHJhaWxpbmcgc3BhY2VzICovCi1zdGF0aWMgdm9pZAotcm1zcGFjZShjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0Jc2l6ZV90IGk7Ci0KLQlpZiAoIWxlbikKLQkJcmV0dXJuOwotCWZvciAoaSA9IGxlbiAtIDE7ICBpID4gMDsgaS0tKQotCQlpZiAoaSA9PSBsZW4gLSAxIHx8IGJ1ZltpXSA9PSAnICcpCi0JCQlidWZbaV0gPSAnXDAnOwotCQllbHNlCi0JCQlicmVhazsKLX0KLQotLyoKLSAqIG9wZW4gYSBwa2NzMTEgc2Vzc2lvbiBhbmQgbG9naW4gaWYgcmVxdWlyZWQuCi0gKiBpZiBwaW4gPT0gTlVMTCB3ZSBkZWxheSBsb2dpbiB1bnRpbCBrZXkgdXNlCi0gKi8KLXN0YXRpYyBpbnQKLXBrY3MxMV9vcGVuX3Nlc3Npb24oc3RydWN0IHBrY3MxMV9wcm92aWRlciAqcCwgQ0tfVUxPTkcgc2xvdGlkeCwgY2hhciAqcGluKQotewotCUNLX1JWCQkJcnY7Ci0JQ0tfRlVOQ1RJT05fTElTVAkqZjsKLQlDS19TRVNTSU9OX0hBTkRMRQlzZXNzaW9uOwotCWludAkJCWxvZ2luX3JlcXVpcmVkOwotCi0JZiA9IHAtPmZ1bmN0aW9uX2xpc3Q7Ci0JbG9naW5fcmVxdWlyZWQgPSBwLT5zbG90aW5mb1tzbG90aWR4XS50b2tlbi5mbGFncyAmIENLRl9MT0dJTl9SRVFVSVJFRDsKLQlpZiAocGluICYmIGxvZ2luX3JlcXVpcmVkICYmICFzdHJsZW4ocGluKSkgewotCQllcnJvcigicGluIHJlcXVpcmVkIik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlpZiAoKHJ2ID0gZi0+Q19PcGVuU2Vzc2lvbihwLT5zbG90bGlzdFtzbG90aWR4XSwgQ0tGX1JXX1NFU1NJT058Ci0JICAgIENLRl9TRVJJQUxfU0VTU0lPTiwgTlVMTCwgTlVMTCwgJnNlc3Npb24pKQotCSAgICAhPSBDS1JfT0spIHsKLQkJZXJyb3IoIkNfT3BlblNlc3Npb24gZmFpbGVkOiAlbHUiLCBydik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlpZiAobG9naW5fcmVxdWlyZWQgJiYgcGluKSB7Ci0JCWlmICgocnYgPSBmLT5DX0xvZ2luKHNlc3Npb24sIENLVV9VU0VSLCBwaW4sIHN0cmxlbihwaW4pKSkKLQkJICAgICE9IENLUl9PSykgewotCQkJZXJyb3IoIkNfTG9naW4gZmFpbGVkOiAlbHUiLCBydik7Ci0JCQlpZiAoKHJ2ID0gZi0+Q19DbG9zZVNlc3Npb24oc2Vzc2lvbikpICE9IENLUl9PSykKLQkJCQllcnJvcigiQ19DbG9zZVNlc3Npb24gZmFpbGVkOiAlbHUiLCBydik7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCQlwLT5zbG90aW5mb1tzbG90aWR4XS5sb2dnZWRfaW4gPSAxOwotCX0KLQlwLT5zbG90aW5mb1tzbG90aWR4XS5zZXNzaW9uID0gc2Vzc2lvbjsKLQlyZXR1cm4gKDApOwotfQotCi0vKgotICogbG9va3VwIHB1YmxpYyBrZXlzIGZvciB0b2tlbiBpbiBzbG90IGlkZW50aWZpZWQgYnkgc2xvdGlkeCwKLSAqIGFkZCAnd3JhcHBlZCcgcHVibGljIGtleXMgdG8gdGhlICdrZXlzcCcgYXJyYXkgYW5kIGluY3JlbWVudCBua2V5cy4KLSAqIGtleXNwIHBvaW50cyB0byBhbiAocG9zc2libHkgZW1wdHkpIGFycmF5IHdpdGggKm5rZXlzIGtleXMuCi0gKi8KLXN0YXRpYyBpbnQKLXBrY3MxMV9mZXRjaF9rZXlzKHN0cnVjdCBwa2NzMTFfcHJvdmlkZXIgKnAsIENLX1VMT05HIHNsb3RpZHgsIEtleSAqKiprZXlzcCwKLSAgICBpbnQgKm5rZXlzKQotewotCUtleQkJCSprZXk7Ci0JUlNBCQkJKnJzYTsKLQlpbnQJCQlpOwotCUNLX1JWCQkJcnY7Ci0JQ0tfT0JKRUNUX0hBTkRMRQlvYmo7Ci0JQ0tfVUxPTkcJCW5mb3VuZDsKLQlDS19TRVNTSU9OX0hBTkRMRQlzZXNzaW9uOwotCUNLX0ZVTkNUSU9OX0xJU1QJKmY7Ci0JQ0tfT0JKRUNUX0NMQVNTCQlwdWJrZXlfY2xhc3MgPSBDS09fUFVCTElDX0tFWTsKLQlDS19BVFRSSUJVVEUJCXB1YmtleV9maWx0ZXJbXSA9IHsKLQkJeyBDS0FfQ0xBU1MsIE5VTEwsIHNpemVvZihwdWJrZXlfY2xhc3MpIH0KLQl9OwotCUNLX0FUVFJJQlVURQkJYXR0cmlic1tdID0gewotCQl7IENLQV9JRCwgTlVMTCwgMCB9LAotCQl7IENLQV9NT0RVTFVTLCBOVUxMLCAwIH0sCi0JCXsgQ0tBX1BVQkxJQ19FWFBPTkVOVCwgTlVMTCwgMCB9Ci0JfTsKLQotCS8qIHNvbWUgY29tcGlsZXJzIGNvbXBsYWluIGFib3V0IG5vbi1jb25zdGFudCBpbml0aWFsaXplciBzbyB3ZQotCSAgIHVzZSBOVUxMIGluIENLX0FUVFJJQlVURSBhYm92ZSBhbmQgc2V0IHRoZSB2YWx1ZSBoZXJlICovCi0JcHVia2V5X2ZpbHRlclswXS5wVmFsdWUgPSAmcHVia2V5X2NsYXNzOwotCi0JZiA9IHAtPmZ1bmN0aW9uX2xpc3Q7Ci0Jc2Vzc2lvbiA9IHAtPnNsb3RpbmZvW3Nsb3RpZHhdLnNlc3Npb247Ci0JLyogc2V0dXAgYSBmaWx0ZXIgdGhlIGxvb2tzIGZvciBwdWJsaWMga2V5cyAqLwotCWlmICgocnYgPSBmLT5DX0ZpbmRPYmplY3RzSW5pdChzZXNzaW9uLCBwdWJrZXlfZmlsdGVyLCAxKSkgIT0gQ0tSX09LKSB7Ci0JCWVycm9yKCJDX0ZpbmRPYmplY3RzSW5pdCBmYWlsZWQ6ICVsdSIsIHJ2KTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCXdoaWxlICgxKSB7Ci0JCS8qIFhYWCAzIGF0dHJpYnV0ZXMgaW4gYXR0cmlic1tdICovCi0JCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWF0dHJpYnNbaV0ucFZhbHVlID0gTlVMTDsKLQkJCWF0dHJpYnNbaV0udWxWYWx1ZUxlbiA9IDA7Ci0JCX0KLQkJaWYgKChydiA9IGYtPkNfRmluZE9iamVjdHMoc2Vzc2lvbiwgJm9iaiwgMSwgJm5mb3VuZCkpICE9IENLUl9PSwotCQkgICAgfHwgbmZvdW5kID09IDApCi0JCQlicmVhazsKLQkJLyogZm91bmQgYSBrZXksIHNvIGZpZ3VyZSBvdXQgc2l6ZSBvZiB0aGUgYXR0cmlidXRlcyAqLwotCQlpZiAoKHJ2ID0gZi0+Q19HZXRBdHRyaWJ1dGVWYWx1ZShzZXNzaW9uLCBvYmosIGF0dHJpYnMsIDMpKQotCQkgICAgIT0gQ0tSX09LKSB7Ci0JCQllcnJvcigiQ19HZXRBdHRyaWJ1dGVWYWx1ZSBmYWlsZWQ6ICVsdSIsIHJ2KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIGNoZWNrIHRoYXQgbm9uZSBvZiB0aGUgYXR0cmlidXRlcyBhcmUgemVybyBsZW5ndGggKi8KLQkJaWYgKGF0dHJpYnNbMF0udWxWYWx1ZUxlbiA9PSAwIHx8Ci0JCSAgICBhdHRyaWJzWzFdLnVsVmFsdWVMZW4gPT0gMCB8fAotCQkgICAgYXR0cmlic1syXS51bFZhbHVlTGVuID09IDApIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIGFsbG9jYXRlIGJ1ZmZlcnMgZm9yIGF0dHJpYnV0ZXMgKi8KLQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLQkJCWF0dHJpYnNbaV0ucFZhbHVlID0geG1hbGxvYyhhdHRyaWJzW2ldLnVsVmFsdWVMZW4pOwotCQkvKiByZXRyaWV2ZSBJRCwgbW9kdWx1cyBhbmQgcHVibGljIGV4cG9uZW50IG9mIFJTQSBrZXkgKi8KLQkJaWYgKChydiA9IGYtPkNfR2V0QXR0cmlidXRlVmFsdWUoc2Vzc2lvbiwgb2JqLCBhdHRyaWJzLCAzKSkKLQkJICAgICE9IENLUl9PSykgewotCQkJZXJyb3IoIkNfR2V0QXR0cmlidXRlVmFsdWUgZmFpbGVkOiAlbHUiLCBydik7Ci0JCX0gZWxzZSBpZiAoKHJzYSA9IFJTQV9uZXcoKSkgPT0gTlVMTCkgewotCQkJZXJyb3IoIlJTQV9uZXcgZmFpbGVkIik7Ci0JCX0gZWxzZSB7Ci0JCQlyc2EtPm4gPSBCTl9iaW4yYm4oYXR0cmlic1sxXS5wVmFsdWUsCi0JCQkgICAgYXR0cmlic1sxXS51bFZhbHVlTGVuLCBOVUxMKTsKLQkJCXJzYS0+ZSA9IEJOX2JpbjJibihhdHRyaWJzWzJdLnBWYWx1ZSwKLQkJCSAgICBhdHRyaWJzWzJdLnVsVmFsdWVMZW4sIE5VTEwpOwotCQkJaWYgKHJzYS0+biAmJiByc2EtPmUgJiYKLQkJCSAgICBwa2NzMTFfcnNhX3dyYXAocCwgc2xvdGlkeCwgJmF0dHJpYnNbMF0sIHJzYSkgPT0gMCkgewotCQkJCWtleSA9IGtleV9uZXcoS0VZX1VOU1BFQyk7Ci0JCQkJa2V5LT5yc2EgPSByc2E7Ci0JCQkJa2V5LT50eXBlID0gS0VZX1JTQTsKLQkJCQlrZXktPmZsYWdzIHw9IEtFWV9GTEFHX0VYVDsKLQkJCQkvKiBleHBhbmQga2V5IGFycmF5IGFuZCBhZGQga2V5ICovCi0JCQkJKmtleXNwID0geHJlYWxsb2MoKmtleXNwLCAqbmtleXMgKyAxLAotCQkJCSAgICBzaXplb2YoS2V5ICopKTsKLQkJCQkoKmtleXNwKVsqbmtleXNdID0ga2V5OwotCQkJCSpua2V5cyA9ICpua2V5cyArIDE7Ci0JCQkJZGVidWcoImhhdmUgJWQga2V5cyIsICpua2V5cyk7Ci0JCQl9IGVsc2UgewotCQkJCVJTQV9mcmVlKHJzYSk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLQkJCXhmcmVlKGF0dHJpYnNbaV0ucFZhbHVlKTsKLQl9Ci0JaWYgKChydiA9IGYtPkNfRmluZE9iamVjdHNGaW5hbChzZXNzaW9uKSkgIT0gQ0tSX09LKQotCQllcnJvcigiQ19GaW5kT2JqZWN0c0ZpbmFsIGZhaWxlZDogJWx1IiwgcnYpOwotCXJldHVybiAoMCk7Ci19Ci0KLS8qIHJlZ2lzdGVyIGEgbmV3IHByb3ZpZGVyLCBmYWlscyBpZiBwcm92aWRlciBhbHJlYWR5IGV4aXN0cyAqLwotaW50Ci1wa2NzMTFfYWRkX3Byb3ZpZGVyKGNoYXIgKnByb3ZpZGVyX2lkLCBjaGFyICpwaW4sIEtleSAqKiprZXlwKQotewotCWludCBua2V5cywgbmVlZF9maW5hbGl6ZSA9IDA7Ci0Jc3RydWN0IHBrY3MxMV9wcm92aWRlciAqcCA9IE5VTEw7Ci0Jdm9pZCAqaGFuZGxlID0gTlVMTDsKLQlDS19SViAoKmdldGZ1bmN0aW9ubGlzdCkoQ0tfRlVOQ1RJT05fTElTVCAqKik7Ci0JQ0tfUlYgcnY7Ci0JQ0tfRlVOQ1RJT05fTElTVCAqZiA9IE5VTEw7Ci0JQ0tfVE9LRU5fSU5GTyAqdG9rZW47Ci0JQ0tfVUxPTkcgaTsKLQotCSprZXlwID0gTlVMTDsKLQlpZiAocGtjczExX3Byb3ZpZGVyX2xvb2t1cChwcm92aWRlcl9pZCkgIT0gTlVMTCkgewotCQllcnJvcigicHJvdmlkZXIgYWxyZWFkeSByZWdpc3RlcmVkOiAlcyIsIHByb3ZpZGVyX2lkKTsKLQkJZ290byBmYWlsOwotCX0KLQkvKiBvcGVuIHNoYXJlZCBwa2NzMTEtbGliYXJhcnkgKi8KLQlpZiAoKGhhbmRsZSA9IGRsb3Blbihwcm92aWRlcl9pZCwgUlRMRF9OT1cpKSA9PSBOVUxMKSB7Ci0JCWVycm9yKCJkbG9wZW4gJXMgZmFpbGVkOiAlcyIsIHByb3ZpZGVyX2lkLCBkbGVycm9yKCkpOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICgoZ2V0ZnVuY3Rpb25saXN0ID0gZGxzeW0oaGFuZGxlLCAiQ19HZXRGdW5jdGlvbkxpc3QiKSkgPT0gTlVMTCkgewotCQllcnJvcigiZGxzeW0oQ19HZXRGdW5jdGlvbkxpc3QpIGZhaWxlZDogJXMiLCBkbGVycm9yKCkpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXAgPSB4Y2FsbG9jKDEsIHNpemVvZigqcCkpOwotCXAtPm5hbWUgPSB4c3RyZHVwKHByb3ZpZGVyX2lkKTsKLQlwLT5oYW5kbGUgPSBoYW5kbGU7Ci0JLyogc2V0dXAgdGhlIHBrY3MxMSBjYWxsYmFja3MgKi8KLQlpZiAoKHJ2ID0gKCpnZXRmdW5jdGlvbmxpc3QpKCZmKSkgIT0gQ0tSX09LKSB7Ci0JCWVycm9yKCJDX0dldEZ1bmN0aW9uTGlzdCBmYWlsZWQ6ICVsdSIsIHJ2KTsKLQkJZ290byBmYWlsOwotCX0KLQlwLT5mdW5jdGlvbl9saXN0ID0gZjsKLQlpZiAoKHJ2ID0gZi0+Q19Jbml0aWFsaXplKE5VTEwpKSAhPSBDS1JfT0spIHsKLQkJZXJyb3IoIkNfSW5pdGlhbGl6ZSBmYWlsZWQ6ICVsdSIsIHJ2KTsKLQkJZ290byBmYWlsOwotCX0KLQluZWVkX2ZpbmFsaXplID0gMTsKLQlpZiAoKHJ2ID0gZi0+Q19HZXRJbmZvKCZwLT5pbmZvKSkgIT0gQ0tSX09LKSB7Ci0JCWVycm9yKCJDX0dldEluZm8gZmFpbGVkOiAlbHUiLCBydik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0Jcm1zcGFjZShwLT5pbmZvLm1hbnVmYWN0dXJlcklELCBzaXplb2YocC0+aW5mby5tYW51ZmFjdHVyZXJJRCkpOwotCXJtc3BhY2UocC0+aW5mby5saWJyYXJ5RGVzY3JpcHRpb24sIHNpemVvZihwLT5pbmZvLmxpYnJhcnlEZXNjcmlwdGlvbikpOwotCWRlYnVnKCJtYW51ZmFjdHVyZXJJRCA8JXM+IGNyeXB0b2tpVmVyc2lvbiAlZC4lZCIKLQkgICAgIiBsaWJyYXJ5RGVzY3JpcHRpb24gPCVzPiBsaWJyYXJ5VmVyc2lvbiAlZC4lZCIsCi0JICAgIHAtPmluZm8ubWFudWZhY3R1cmVySUQsCi0JICAgIHAtPmluZm8uY3J5cHRva2lWZXJzaW9uLm1ham9yLAotCSAgICBwLT5pbmZvLmNyeXB0b2tpVmVyc2lvbi5taW5vciwKLQkgICAgcC0+aW5mby5saWJyYXJ5RGVzY3JpcHRpb24sCi0JICAgIHAtPmluZm8ubGlicmFyeVZlcnNpb24ubWFqb3IsCi0JICAgIHAtPmluZm8ubGlicmFyeVZlcnNpb24ubWlub3IpOwotCWlmICgocnYgPSBmLT5DX0dldFNsb3RMaXN0KENLX1RSVUUsIE5VTEwsICZwLT5uc2xvdHMpKSAhPSBDS1JfT0spIHsKLQkJZXJyb3IoIkNfR2V0U2xvdExpc3QgZmFpbGVkOiAlbHUiLCBydik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKHAtPm5zbG90cyA9PSAwKSB7Ci0JCWVycm9yKCJubyBzbG90cyIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXAtPnNsb3RsaXN0ID0geGNhbGxvYyhwLT5uc2xvdHMsIHNpemVvZihDS19TTE9UX0lEKSk7Ci0JaWYgKChydiA9IGYtPkNfR2V0U2xvdExpc3QoQ0tfVFJVRSwgcC0+c2xvdGxpc3QsICZwLT5uc2xvdHMpKQotCSAgICAhPSBDS1JfT0spIHsKLQkJZXJyb3IoIkNfR2V0U2xvdExpc3QgZmFpbGVkOiAlbHUiLCBydik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcC0+c2xvdGluZm8gPSB4Y2FsbG9jKHAtPm5zbG90cywgc2l6ZW9mKHN0cnVjdCBwa2NzMTFfc2xvdGluZm8pKTsKLQlwLT52YWxpZCA9IDE7Ci0JbmtleXMgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBwLT5uc2xvdHM7IGkrKykgewotCQl0b2tlbiA9ICZwLT5zbG90aW5mb1tpXS50b2tlbjsKLQkJaWYgKChydiA9IGYtPkNfR2V0VG9rZW5JbmZvKHAtPnNsb3RsaXN0W2ldLCB0b2tlbikpCi0JCSAgICAhPSBDS1JfT0spIHsKLQkJCWVycm9yKCJDX0dldFRva2VuSW5mbyBmYWlsZWQ6ICVsdSIsIHJ2KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXJtc3BhY2UodG9rZW4tPmxhYmVsLCBzaXplb2YodG9rZW4tPmxhYmVsKSk7Ci0JCXJtc3BhY2UodG9rZW4tPm1hbnVmYWN0dXJlcklELCBzaXplb2YodG9rZW4tPm1hbnVmYWN0dXJlcklEKSk7Ci0JCXJtc3BhY2UodG9rZW4tPm1vZGVsLCBzaXplb2YodG9rZW4tPm1vZGVsKSk7Ci0JCXJtc3BhY2UodG9rZW4tPnNlcmlhbE51bWJlciwgc2l6ZW9mKHRva2VuLT5zZXJpYWxOdW1iZXIpKTsKLQkJZGVidWcoImxhYmVsIDwlcz4gbWFudWZhY3R1cmVySUQgPCVzPiBtb2RlbCA8JXM+IHNlcmlhbCA8JXM+IgotCQkgICAgIiBmbGFncyAweCVseCIsCi0JCSAgICB0b2tlbi0+bGFiZWwsIHRva2VuLT5tYW51ZmFjdHVyZXJJRCwgdG9rZW4tPm1vZGVsLAotCQkgICAgdG9rZW4tPnNlcmlhbE51bWJlciwgdG9rZW4tPmZsYWdzKTsKLQkJLyogb3BlbiBzZXNzaW9uLCBsb2dpbiB3aXRoIHBpbiBhbmQgcmV0cmlldmUgcHVibGljIGtleXMgKi8KLQkJaWYgKHBrY3MxMV9vcGVuX3Nlc3Npb24ocCwgaSwgcGluKSA9PSAwKQotCQkJcGtjczExX2ZldGNoX2tleXMocCwgaSwga2V5cCwgJm5rZXlzKTsKLQl9Ci0JaWYgKG5rZXlzID4gMCkgewotCQlUQUlMUV9JTlNFUlRfVEFJTCgmcGtjczExX3Byb3ZpZGVycywgcCwgbmV4dCk7Ci0JCXAtPnJlZmNvdW50Kys7CS8qIGFkZCB0byBwcm92aWRlciBsaXN0ICovCi0JCXJldHVybiAobmtleXMpOwotCX0KLQllcnJvcigibm8ga2V5cyIpOwotCS8qIGRvbid0IGFkZCB0aGUgcHJvdmlkZXIsIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgYW55IGtleXMgKi8KLWZhaWw6Ci0JaWYgKG5lZWRfZmluYWxpemUgJiYgKHJ2ID0gZi0+Q19GaW5hbGl6ZShOVUxMKSkgIT0gQ0tSX09LKQotCQllcnJvcigiQ19GaW5hbGl6ZSBmYWlsZWQ6ICVsdSIsIHJ2KTsKLQlpZiAocCkgewotCQlpZiAocC0+c2xvdGxpc3QpCi0JCQl4ZnJlZShwLT5zbG90bGlzdCk7Ci0JCWlmIChwLT5zbG90aW5mbykKLQkJCXhmcmVlKHAtPnNsb3RpbmZvKTsKLQkJeGZyZWUocCk7Ci0JfQotCWlmIChoYW5kbGUpCi0JCWRsY2xvc2UoaGFuZGxlKTsKLQlyZXR1cm4gKC0xKTsKLX0KLQotI2Vsc2UKLQotaW50Ci1wa2NzMTFfaW5pdChpbnQgaW50ZXJhY3RpdmUpCi17Ci0JcmV0dXJuICgwKTsKLX0KLQotdm9pZAotcGtjczExX3Rlcm1pbmF0ZSh2b2lkKQotewotCXJldHVybjsKLX0KLQotI2VuZGlmIC8qIEVOQUJMRV9QS0NTMTEgKi8KZGlmZiAtLWdpdCBhL3NzaC1wa2NzMTEuaCBiL3NzaC1wa2NzMTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmNDU2YS4uMDAwMDAwMAotLS0gYS9zc2gtcGtjczExLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKiAkT3BlbkJTRDogc3NoLXBrY3MxMS5oLHYgMS4yIDIwMTAvMDIvMjQgMDY6MTI6NTMgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi1pbnQJcGtjczExX2luaXQoaW50KTsKLXZvaWQJcGtjczExX3Rlcm1pbmF0ZSh2b2lkKTsKLWludAlwa2NzMTFfYWRkX3Byb3ZpZGVyKGNoYXIgKiwgY2hhciAqLCBLZXkgKioqKTsKLWludAlwa2NzMTFfZGVsX3Byb3ZpZGVyKGNoYXIgKik7CmRpZmYgLS1naXQgYS9zc2gtcnNhLmMgYi9zc2gtcnNhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MzU1ZmEuLjAwMDAwMDAKLS0tIGEvc3NoLXJzYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qICRPcGVuQlNEOiBzc2gtcnNhLmMsdiAxLjQ1IDIwMTAvMDgvMzEgMDk6NTg6MzcgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIE1hcmt1cyBGcmllZGwgPG1hcmt1c0BvcGVuYnNkLm9yZz4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgInNzaC5oIgotCi1zdGF0aWMgaW50IG9wZW5zc2hfUlNBX3ZlcmlmeShpbnQsIHVfY2hhciAqLCB1X2ludCwgdV9jaGFyICosIHVfaW50LCBSU0EgKik7Ci0KLS8qIFJTQVNTQS1QS0NTMS12MV81IChQS0NTICMxIHYyLjAgc2lnbmF0dXJlKSB3aXRoIFNIQTEgKi8KLWludAotc3NoX3JzYV9zaWduKGNvbnN0IEtleSAqa2V5LCB1X2NoYXIgKipzaWdwLCB1X2ludCAqbGVucCwKLSAgICBjb25zdCB1X2NoYXIgKmRhdGEsIHVfaW50IGRhdGFsZW4pCi17Ci0JY29uc3QgRVZQX01EICpldnBfbWQ7Ci0JRVZQX01EX0NUWCBtZDsKLQl1X2NoYXIgZGlnZXN0W0VWUF9NQVhfTURfU0laRV0sICpzaWc7Ci0JdV9pbnQgc2xlbiwgZGxlbiwgbGVuOwotCWludCBvaywgbmlkOwotCUJ1ZmZlciBiOwotCi0JaWYgKGtleSA9PSBOVUxMIHx8IGtleS0+cnNhID09IE5VTEwgfHwgKGtleS0+dHlwZSAhPSBLRVlfUlNBICYmCi0JICAgIGtleS0+dHlwZSAhPSBLRVlfUlNBX0NFUlQgJiYga2V5LT50eXBlICE9IEtFWV9SU0FfQ0VSVF9WMDApKSB7Ci0JCWVycm9yKCJzc2hfcnNhX3NpZ246IG5vIFJTQSBrZXkiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQluaWQgPSAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1JTQVNJR01ENSkgPyBOSURfbWQ1IDogTklEX3NoYTE7Ci0JaWYgKChldnBfbWQgPSBFVlBfZ2V0X2RpZ2VzdGJ5bmlkKG5pZCkpID09IE5VTEwpIHsKLQkJZXJyb3IoInNzaF9yc2Ffc2lnbjogRVZQX2dldF9kaWdlc3RieW5pZCAlZCBmYWlsZWQiLCBuaWQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCUVWUF9EaWdlc3RJbml0KCZtZCwgZXZwX21kKTsKLQlFVlBfRGlnZXN0VXBkYXRlKCZtZCwgZGF0YSwgZGF0YWxlbik7Ci0JRVZQX0RpZ2VzdEZpbmFsKCZtZCwgZGlnZXN0LCAmZGxlbik7Ci0KLQlzbGVuID0gUlNBX3NpemUoa2V5LT5yc2EpOwotCXNpZyA9IHhtYWxsb2Moc2xlbik7Ci0KLQlvayA9IFJTQV9zaWduKG5pZCwgZGlnZXN0LCBkbGVuLCBzaWcsICZsZW4sIGtleS0+cnNhKTsKLQltZW1zZXQoZGlnZXN0LCAnZCcsIHNpemVvZihkaWdlc3QpKTsKLQotCWlmIChvayAhPSAxKSB7Ci0JCWludCBlY29kZSA9IEVSUl9nZXRfZXJyb3IoKTsKLQotCQllcnJvcigic3NoX3JzYV9zaWduOiBSU0Ffc2lnbiBmYWlsZWQ6ICVzIiwKLQkJICAgIEVSUl9lcnJvcl9zdHJpbmcoZWNvZGUsIE5VTEwpKTsKLQkJeGZyZWUoc2lnKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAobGVuIDwgc2xlbikgewotCQl1X2ludCBkaWZmID0gc2xlbiAtIGxlbjsKLQkJZGVidWcoInNsZW4gJXUgPiBsZW4gJXUiLCBzbGVuLCBsZW4pOwotCQltZW1tb3ZlKHNpZyArIGRpZmYsIHNpZywgbGVuKTsKLQkJbWVtc2V0KHNpZywgMCwgZGlmZik7Ci0JfSBlbHNlIGlmIChsZW4gPiBzbGVuKSB7Ci0JCWVycm9yKCJzc2hfcnNhX3NpZ246IHNsZW4gJXUgc2xlbjIgJXUiLCBzbGVuLCBsZW4pOwotCQl4ZnJlZShzaWcpOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qIGVuY29kZSBzaWduYXR1cmUgKi8KLQlidWZmZXJfaW5pdCgmYik7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCAic3NoLXJzYSIpOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBzaWcsIHNsZW4pOwotCWxlbiA9IGJ1ZmZlcl9sZW4oJmIpOwotCWlmIChsZW5wICE9IE5VTEwpCi0JCSpsZW5wID0gbGVuOwotCWlmIChzaWdwICE9IE5VTEwpIHsKLQkJKnNpZ3AgPSB4bWFsbG9jKGxlbik7Ci0JCW1lbWNweSgqc2lncCwgYnVmZmVyX3B0cigmYiksIGxlbik7Ci0JfQotCWJ1ZmZlcl9mcmVlKCZiKTsKLQltZW1zZXQoc2lnLCAncycsIHNsZW4pOwotCXhmcmVlKHNpZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1zc2hfcnNhX3ZlcmlmeShjb25zdCBLZXkgKmtleSwgY29uc3QgdV9jaGFyICpzaWduYXR1cmUsIHVfaW50IHNpZ25hdHVyZWxlbiwKLSAgICBjb25zdCB1X2NoYXIgKmRhdGEsIHVfaW50IGRhdGFsZW4pCi17Ci0JQnVmZmVyIGI7Ci0JY29uc3QgRVZQX01EICpldnBfbWQ7Ci0JRVZQX01EX0NUWCBtZDsKLQljaGFyICprdHlwZTsKLQl1X2NoYXIgZGlnZXN0W0VWUF9NQVhfTURfU0laRV0sICpzaWdibG9iOwotCXVfaW50IGxlbiwgZGxlbiwgbW9kbGVuOwotCWludCBybGVuLCByZXQsIG5pZDsKLQotCWlmIChrZXkgPT0gTlVMTCB8fCBrZXktPnJzYSA9PSBOVUxMIHx8IChrZXktPnR5cGUgIT0gS0VZX1JTQSAmJgotCSAgICBrZXktPnR5cGUgIT0gS0VZX1JTQV9DRVJUICYmIGtleS0+dHlwZSAhPSBLRVlfUlNBX0NFUlRfVjAwKSkgewotCQllcnJvcigic3NoX3JzYV92ZXJpZnk6IG5vIFJTQSBrZXkiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoQk5fbnVtX2JpdHMoa2V5LT5yc2EtPm4pIDwgU1NIX1JTQV9NSU5JTVVNX01PRFVMVVNfU0laRSkgewotCQllcnJvcigic3NoX3JzYV92ZXJpZnk6IFJTQSBtb2R1bHVzIHRvbyBzbWFsbDogJWQgPCBtaW5pbXVtICVkIGJpdHMiLAotCQkgICAgQk5fbnVtX2JpdHMoa2V5LT5yc2EtPm4pLCBTU0hfUlNBX01JTklNVU1fTU9EVUxVU19TSVpFKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlidWZmZXJfaW5pdCgmYik7Ci0JYnVmZmVyX2FwcGVuZCgmYiwgc2lnbmF0dXJlLCBzaWduYXR1cmVsZW4pOwotCWt0eXBlID0gYnVmZmVyX2dldF9jc3RyaW5nKCZiLCBOVUxMKTsKLQlpZiAoc3RyY21wKCJzc2gtcnNhIiwga3R5cGUpICE9IDApIHsKLQkJZXJyb3IoInNzaF9yc2FfdmVyaWZ5OiBjYW5ub3QgaGFuZGxlIHR5cGUgJXMiLCBrdHlwZSk7Ci0JCWJ1ZmZlcl9mcmVlKCZiKTsKLQkJeGZyZWUoa3R5cGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXhmcmVlKGt0eXBlKTsKLQlzaWdibG9iID0gYnVmZmVyX2dldF9zdHJpbmcoJmIsICZsZW4pOwotCXJsZW4gPSBidWZmZXJfbGVuKCZiKTsKLQlidWZmZXJfZnJlZSgmYik7Ci0JaWYgKHJsZW4gIT0gMCkgewotCQllcnJvcigic3NoX3JzYV92ZXJpZnk6IHJlbWFpbmluZyBieXRlcyBpbiBzaWduYXR1cmUgJWQiLCBybGVuKTsKLQkJeGZyZWUoc2lnYmxvYik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogUlNBX3ZlcmlmeSBleHBlY3RzIGEgc2lnbmF0dXJlIG9mIFJTQV9zaXplICovCi0JbW9kbGVuID0gUlNBX3NpemUoa2V5LT5yc2EpOwotCWlmIChsZW4gPiBtb2RsZW4pIHsKLQkJZXJyb3IoInNzaF9yc2FfdmVyaWZ5OiBsZW4gJXUgPiBtb2RsZW4gJXUiLCBsZW4sIG1vZGxlbik7Ci0JCXhmcmVlKHNpZ2Jsb2IpOwotCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIGlmIChsZW4gPCBtb2RsZW4pIHsKLQkJdV9pbnQgZGlmZiA9IG1vZGxlbiAtIGxlbjsKLQkJZGVidWcoInNzaF9yc2FfdmVyaWZ5OiBhZGQgcGFkZGluZzogbW9kbGVuICV1ID4gbGVuICV1IiwKLQkJICAgIG1vZGxlbiwgbGVuKTsKLQkJc2lnYmxvYiA9IHhyZWFsbG9jKHNpZ2Jsb2IsIDEsIG1vZGxlbik7Ci0JCW1lbW1vdmUoc2lnYmxvYiArIGRpZmYsIHNpZ2Jsb2IsIGxlbik7Ci0JCW1lbXNldChzaWdibG9iLCAwLCBkaWZmKTsKLQkJbGVuID0gbW9kbGVuOwotCX0KLQluaWQgPSAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1JTQVNJR01ENSkgPyBOSURfbWQ1IDogTklEX3NoYTE7Ci0JaWYgKChldnBfbWQgPSBFVlBfZ2V0X2RpZ2VzdGJ5bmlkKG5pZCkpID09IE5VTEwpIHsKLQkJZXJyb3IoInNzaF9yc2FfdmVyaWZ5OiBFVlBfZ2V0X2RpZ2VzdGJ5bmlkICVkIGZhaWxlZCIsIG5pZCk7Ci0JCXhmcmVlKHNpZ2Jsb2IpOwotCQlyZXR1cm4gLTE7Ci0JfQotCUVWUF9EaWdlc3RJbml0KCZtZCwgZXZwX21kKTsKLQlFVlBfRGlnZXN0VXBkYXRlKCZtZCwgZGF0YSwgZGF0YWxlbik7Ci0JRVZQX0RpZ2VzdEZpbmFsKCZtZCwgZGlnZXN0LCAmZGxlbik7Ci0KLQlyZXQgPSBvcGVuc3NoX1JTQV92ZXJpZnkobmlkLCBkaWdlc3QsIGRsZW4sIHNpZ2Jsb2IsIGxlbiwga2V5LT5yc2EpOwotCW1lbXNldChkaWdlc3QsICdkJywgc2l6ZW9mKGRpZ2VzdCkpOwotCW1lbXNldChzaWdibG9iLCAncycsIGxlbik7Ci0JeGZyZWUoc2lnYmxvYik7Ci0JZGVidWcoInNzaF9yc2FfdmVyaWZ5OiBzaWduYXR1cmUgJXNjb3JyZWN0IiwgKHJldD09MCkgPyAiaW4iIDogIiIpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBTZWU6Ci0gKiBodHRwOi8vd3d3LnJzYXNlY3VyaXR5LmNvbS9yc2FsYWJzL3BrY3MvcGtjcy0xLwotICogZnRwOi8vZnRwLnJzYXNlY3VyaXR5LmNvbS9wdWIvcGtjcy9wa2NzLTEvcGtjcy0xdjItMS5hc24KLSAqLwotLyoKLSAqIGlkLXNoYTEgT0JKRUNUIElERU5USUZJRVIgOjo9IHsgaXNvKDEpIGlkZW50aWZpZWQtb3JnYW5pemF0aW9uKDMpCi0gKglvaXcoMTQpIHNlY3NpZygzKSBhbGdvcml0aG1zKDIpIDI2IH0KLSAqLwotc3RhdGljIGNvbnN0IHVfY2hhciBpZF9zaGExW10gPSB7Ci0JMHgzMCwgMHgyMSwgLyogdHlwZSBTZXF1ZW5jZSwgbGVuZ3RoIDB4MjEgKDMzKSAqLwotCTB4MzAsIDB4MDksIC8qIHR5cGUgU2VxdWVuY2UsIGxlbmd0aCAweDA5ICovCi0JMHgwNiwgMHgwNSwgLyogdHlwZSBPSUQsIGxlbmd0aCAweDA1ICovCi0JMHgyYiwgMHgwZSwgMHgwMywgMHgwMiwgMHgxYSwgLyogaWQtc2hhMSBPSUQgKi8KLQkweDA1LCAweDAwLCAvKiBOVUxMICovCi0JMHgwNCwgMHgxNCAgLyogT2N0ZXQgc3RyaW5nLCBsZW5ndGggMHgxNCAoMjApLCBmb2xsb3dlZCBieSBzaGExIGhhc2ggKi8KLX07Ci0vKgotICogaWQtbWQ1IE9CSkVDVCBJREVOVElGSUVSIDo6PSB7IGlzbygxKSBtZW1iZXItYm9keSgyKSB1cyg4NDApCi0gKglyc2Fkc2koMTEzNTQ5KSBkaWdlc3RBbGdvcml0aG0oMikgNSB9Ci0gKi8KLXN0YXRpYyBjb25zdCB1X2NoYXIgaWRfbWQ1W10gPSB7Ci0JMHgzMCwgMHgyMCwgLyogdHlwZSBTZXF1ZW5jZSwgbGVuZ3RoIDB4MjAgKDMyKSAqLwotCTB4MzAsIDB4MGMsIC8qIHR5cGUgU2VxdWVuY2UsIGxlbmd0aCAweDA5ICovCi0JMHgwNiwgMHgwOCwgLyogdHlwZSBPSUQsIGxlbmd0aCAweDA1ICovCi0JMHgyYSwgMHg4NiwgMHg0OCwgMHg4NiwgMHhGNywgMHgwRCwgMHgwMiwgMHgwNSwgLyogaWQtbWQ1ICovCi0JMHgwNSwgMHgwMCwgLyogTlVMTCAqLwotCTB4MDQsIDB4MTAgIC8qIE9jdGV0IHN0cmluZywgbGVuZ3RoIDB4MTAgKDE2KSwgZm9sbG93ZWQgYnkgbWQ1IGhhc2ggKi8KLX07Ci0KLXN0YXRpYyBpbnQKLW9wZW5zc2hfUlNBX3ZlcmlmeShpbnQgdHlwZSwgdV9jaGFyICpoYXNoLCB1X2ludCBoYXNobGVuLAotICAgIHVfY2hhciAqc2lnYnVmLCB1X2ludCBzaWdsZW4sIFJTQSAqcnNhKQotewotCXVfaW50IHJldCwgcnNhc2l6ZSwgb2lkbGVuID0gMCwgaGxlbiA9IDA7Ci0JaW50IGxlbiwgb2lkbWF0Y2gsIGhhc2htYXRjaDsKLQljb25zdCB1X2NoYXIgKm9pZCA9IE5VTEw7Ci0JdV9jaGFyICpkZWNyeXB0ZWQgPSBOVUxMOwotCi0JcmV0ID0gMDsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIE5JRF9zaGExOgotCQlvaWQgPSBpZF9zaGExOwotCQlvaWRsZW4gPSBzaXplb2YoaWRfc2hhMSk7Ci0JCWhsZW4gPSAyMDsKLQkJYnJlYWs7Ci0JY2FzZSBOSURfbWQ1OgotCQlvaWQgPSBpZF9tZDU7Ci0JCW9pZGxlbiA9IHNpemVvZihpZF9tZDUpOwotCQlobGVuID0gMTY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGhhc2hsZW4gIT0gaGxlbikgewotCQllcnJvcigiYmFkIGhhc2hsZW4iKTsKLQkJZ290byBkb25lOwotCX0KLQlyc2FzaXplID0gUlNBX3NpemUocnNhKTsKLQlpZiAoc2lnbGVuID09IDAgfHwgc2lnbGVuID4gcnNhc2l6ZSkgewotCQllcnJvcigiYmFkIHNpZ2xlbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWRlY3J5cHRlZCA9IHhtYWxsb2MocnNhc2l6ZSk7Ci0JaWYgKChsZW4gPSBSU0FfcHVibGljX2RlY3J5cHQoc2lnbGVuLCBzaWdidWYsIGRlY3J5cHRlZCwgcnNhLAotCSAgICBSU0FfUEtDUzFfUEFERElORykpIDwgMCkgewotCQllcnJvcigiUlNBX3B1YmxpY19kZWNyeXB0IGZhaWxlZDogJXMiLAotCQkgICAgRVJSX2Vycm9yX3N0cmluZyhFUlJfZ2V0X2Vycm9yKCksIE5VTEwpKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAobGVuIDwgMCB8fCAodV9pbnQpbGVuICE9IGhsZW4gKyBvaWRsZW4pIHsKLQkJZXJyb3IoImJhZCBkZWNyeXB0ZWQgbGVuOiAlZCAhPSAlZCArICVkIiwgbGVuLCBobGVuLCBvaWRsZW4pOwotCQlnb3RvIGRvbmU7Ci0JfQotCW9pZG1hdGNoID0gdGltaW5nc2FmZV9iY21wKGRlY3J5cHRlZCwgb2lkLCBvaWRsZW4pID09IDA7Ci0JaGFzaG1hdGNoID0gdGltaW5nc2FmZV9iY21wKGRlY3J5cHRlZCArIG9pZGxlbiwgaGFzaCwgaGxlbikgPT0gMDsKLQlpZiAoIW9pZG1hdGNoKSB7Ci0JCWVycm9yKCJvaWQgbWlzbWF0Y2giKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIWhhc2htYXRjaCkgewotCQllcnJvcigiaGFzaCBtaXNtYXRjaCIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCXJldCA9IDE7Ci1kb25lOgotCWlmIChkZWNyeXB0ZWQpCi0JCXhmcmVlKGRlY3J5cHRlZCk7Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL3NzaC1zYW5kYm94LmggYi9zc2gtc2FuZGJveC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZmVjZDVhLi4wMDAwMDAwCi0tLSBhL3NzaC1zYW5kYm94LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiAkT3BlbkJTRDogc3NoLXNhbmRib3guaCx2IDEuMSAyMDExLzA2LzIzIDA5OjM0OjEzIGRqbSBFeHAgJCAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotc3RydWN0IHNzaF9zYW5kYm94OwotCi1zdHJ1Y3Qgc3NoX3NhbmRib3ggKnNzaF9zYW5kYm94X2luaXQodm9pZCk7Ci12b2lkIHNzaF9zYW5kYm94X2NoaWxkKHN0cnVjdCBzc2hfc2FuZGJveCAqKTsKLXZvaWQgc3NoX3NhbmRib3hfcGFyZW50X2ZpbmlzaChzdHJ1Y3Qgc3NoX3NhbmRib3ggKik7Ci12b2lkIHNzaF9zYW5kYm94X3BhcmVudF9wcmVhdXRoKHN0cnVjdCBzc2hfc2FuZGJveCAqLCBwaWRfdCk7CmRpZmYgLS1naXQgYS9zc2guMCBiL3NzaC4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzk4Zjc3Li4wMDAwMDAwCi0tLSBhL3NzaC4wCisrKyAvZGV2L251bGwKQEAgLTEsOTAxICswLDAgQEAKLVNTSCgxKSAgICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgUmVmZXJlbmNlIE1hbnVhbCAgICAgICAgICAgICAgICAgICAgIFNTSCgxKQotCi1OQU1FCi0gICAgIHNzaCAtIE9wZW5TU0ggU1NIIGNsaWVudCAocmVtb3RlIGxvZ2luIHByb2dyYW0pCi0KLVNZTk9QU0lTCi0gICAgIHNzaCBbLTEyNDZBYUNmZ0trTU5ucXNUdFZ2WHhZeV0gWy1iIGJpbmRfYWRkcmVzc10gWy1jIGNpcGhlcl9zcGVjXQotICAgICAgICAgWy1EIFtiaW5kX2FkZHJlc3M6XXBvcnRdIFstZSBlc2NhcGVfY2hhcl0gWy1GIGNvbmZpZ2ZpbGVdIFstSSBwa2NzMTFdCi0gICAgICAgICBbLWkgaWRlbnRpdHlfZmlsZV0gWy1MIFtiaW5kX2FkZHJlc3M6XXBvcnQ6aG9zdDpob3N0cG9ydF0KLSAgICAgICAgIFstbCBsb2dpbl9uYW1lXSBbLW0gbWFjX3NwZWNdIFstTyBjdGxfY21kXSBbLW8gb3B0aW9uXSBbLXAgcG9ydF0KLSAgICAgICAgIFstUiBbYmluZF9hZGRyZXNzOl1wb3J0Omhvc3Q6aG9zdHBvcnRdIFstUyBjdGxfcGF0aF0gWy1XIGhvc3Q6cG9ydF0KLSAgICAgICAgIFstdyBsb2NhbF90dW5bOnJlbW90ZV90dW5dXSBbdXNlckBdaG9zdG5hbWUgW2NvbW1hbmRdCi0KLURFU0NSSVBUSU9OCi0gICAgIHNzaCAoU1NIIGNsaWVudCkgaXMgYSBwcm9ncmFtIGZvciBsb2dnaW5nIGludG8gYSByZW1vdGUgbWFjaGluZSBhbmQgZm9yCi0gICAgIGV4ZWN1dGluZyBjb21tYW5kcyBvbiBhIHJlbW90ZSBtYWNoaW5lLiAgSXQgaXMgaW50ZW5kZWQgdG8gcmVwbGFjZSBybG9naW4KLSAgICAgYW5kIHJzaCwgYW5kIHByb3ZpZGUgc2VjdXJlIGVuY3J5cHRlZCBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuIHR3bwotICAgICB1bnRydXN0ZWQgaG9zdHMgb3ZlciBhbiBpbnNlY3VyZSBuZXR3b3JrLiAgWDExIGNvbm5lY3Rpb25zIGFuZCBhcmJpdHJhcnkKLSAgICAgVENQIHBvcnRzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBvdmVyIHRoZSBzZWN1cmUgY2hhbm5lbC4KLQotICAgICBzc2ggY29ubmVjdHMgYW5kIGxvZ3MgaW50byB0aGUgc3BlY2lmaWVkIGhvc3RuYW1lICh3aXRoIG9wdGlvbmFsIHVzZXIKLSAgICAgbmFtZSkuICBUaGUgdXNlciBtdXN0IHByb3ZlIGhpcy9oZXIgaWRlbnRpdHkgdG8gdGhlIHJlbW90ZSBtYWNoaW5lIHVzaW5nCi0gICAgIG9uZSBvZiBzZXZlcmFsIG1ldGhvZHMgZGVwZW5kaW5nIG9uIHRoZSBwcm90b2NvbCB2ZXJzaW9uIHVzZWQgKHNlZQotICAgICBiZWxvdykuCi0KLSAgICAgSWYgY29tbWFuZCBpcyBzcGVjaWZpZWQsIGl0IGlzIGV4ZWN1dGVkIG9uIHRoZSByZW1vdGUgaG9zdCBpbnN0ZWFkIG9mIGEKLSAgICAgbG9naW4gc2hlbGwuCi0KLSAgICAgVGhlIG9wdGlvbnMgYXJlIGFzIGZvbGxvd3M6Ci0KLSAgICAgLTEgICAgICBGb3JjZXMgc3NoIHRvIHRyeSBwcm90b2NvbCB2ZXJzaW9uIDEgb25seS4KLQotICAgICAtMiAgICAgIEZvcmNlcyBzc2ggdG8gdHJ5IHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgotCi0gICAgIC00ICAgICAgRm9yY2VzIHNzaCB0byB1c2UgSVB2NCBhZGRyZXNzZXMgb25seS4KLQotICAgICAtNiAgICAgIEZvcmNlcyBzc2ggdG8gdXNlIElQdjYgYWRkcmVzc2VzIG9ubHkuCi0KLSAgICAgLUEgICAgICBFbmFibGVzIGZvcndhcmRpbmcgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50IGNvbm5lY3Rpb24uICBUaGlzCi0gICAgICAgICAgICAgY2FuIGFsc28gYmUgc3BlY2lmaWVkIG9uIGEgcGVyLWhvc3QgYmFzaXMgaW4gYSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgZmlsZS4KLQotICAgICAgICAgICAgIEFnZW50IGZvcndhcmRpbmcgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aCBjYXV0aW9uLiAgVXNlcnMgd2l0aCB0aGUKLSAgICAgICAgICAgICBhYmlsaXR5IHRvIGJ5cGFzcyBmaWxlIHBlcm1pc3Npb25zIG9uIHRoZSByZW1vdGUgaG9zdCAoZm9yIHRoZQotICAgICAgICAgICAgIGFnZW50J3MgVU5JWC1kb21haW4gc29ja2V0KSBjYW4gYWNjZXNzIHRoZSBsb2NhbCBhZ2VudCB0aHJvdWdoCi0gICAgICAgICAgICAgdGhlIGZvcndhcmRlZCBjb25uZWN0aW9uLiAgQW4gYXR0YWNrZXIgY2Fubm90IG9idGFpbiBrZXkgbWF0ZXJpYWwKLSAgICAgICAgICAgICBmcm9tIHRoZSBhZ2VudCwgaG93ZXZlciB0aGV5IGNhbiBwZXJmb3JtIG9wZXJhdGlvbnMgb24gdGhlIGtleXMKLSAgICAgICAgICAgICB0aGF0IGVuYWJsZSB0aGVtIHRvIGF1dGhlbnRpY2F0ZSB1c2luZyB0aGUgaWRlbnRpdGllcyBsb2FkZWQgaW50bwotICAgICAgICAgICAgIHRoZSBhZ2VudC4KLQotICAgICAtYSAgICAgIERpc2FibGVzIGZvcndhcmRpbmcgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50IGNvbm5lY3Rpb24uCi0KLSAgICAgLWIgYmluZF9hZGRyZXNzCi0gICAgICAgICAgICAgVXNlIGJpbmRfYWRkcmVzcyBvbiB0aGUgbG9jYWwgbWFjaGluZSBhcyB0aGUgc291cmNlIGFkZHJlc3Mgb2YKLSAgICAgICAgICAgICB0aGUgY29ubmVjdGlvbi4gIE9ubHkgdXNlZnVsIG9uIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lCi0gICAgICAgICAgICAgYWRkcmVzcy4KLQotICAgICAtQyAgICAgIFJlcXVlc3RzIGNvbXByZXNzaW9uIG9mIGFsbCBkYXRhIChpbmNsdWRpbmcgc3RkaW4sIHN0ZG91dCwKLSAgICAgICAgICAgICBzdGRlcnIsIGFuZCBkYXRhIGZvciBmb3J3YXJkZWQgWDExIGFuZCBUQ1AgY29ubmVjdGlvbnMpLiAgVGhlCi0gICAgICAgICAgICAgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzIHRoZSBzYW1lIHVzZWQgYnkgZ3ppcCgxKSwgYW5kIHRoZQotICAgICAgICAgICAgIGBgbGV2ZWwnJyBjYW4gYmUgY29udHJvbGxlZCBieSB0aGUgQ29tcHJlc3Npb25MZXZlbCBvcHRpb24gZm9yCi0gICAgICAgICAgICAgcHJvdG9jb2wgdmVyc2lvbiAxLiAgQ29tcHJlc3Npb24gaXMgZGVzaXJhYmxlIG9uIG1vZGVtIGxpbmVzIGFuZAotICAgICAgICAgICAgIG90aGVyIHNsb3cgY29ubmVjdGlvbnMsIGJ1dCB3aWxsIG9ubHkgc2xvdyBkb3duIHRoaW5ncyBvbiBmYXN0Ci0gICAgICAgICAgICAgbmV0d29ya3MuICBUaGUgZGVmYXVsdCB2YWx1ZSBjYW4gYmUgc2V0IG9uIGEgaG9zdC1ieS1ob3N0IGJhc2lzCi0gICAgICAgICAgICAgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXM7IHNlZSB0aGUgQ29tcHJlc3Npb24gb3B0aW9uLgotCi0gICAgIC1jIGNpcGhlcl9zcGVjCi0gICAgICAgICAgICAgU2VsZWN0cyB0aGUgY2lwaGVyIHNwZWNpZmljYXRpb24gZm9yIGVuY3J5cHRpbmcgdGhlIHNlc3Npb24uCi0KLSAgICAgICAgICAgICBQcm90b2NvbCB2ZXJzaW9uIDEgYWxsb3dzIHNwZWNpZmljYXRpb24gb2YgYSBzaW5nbGUgY2lwaGVyLiAgVGhlCi0gICAgICAgICAgICAgc3VwcG9ydGVkIHZhbHVlcyBhcmUgYGAzZGVzJycsIGBgYmxvd2Zpc2gnJywgYW5kIGBgZGVzJycuICAzZGVzCi0gICAgICAgICAgICAgKHRyaXBsZS1kZXMpIGlzIGFuIGVuY3J5cHQtZGVjcnlwdC1lbmNyeXB0IHRyaXBsZSB3aXRoIHRocmVlCi0gICAgICAgICAgICAgZGlmZmVyZW50IGtleXMuICBJdCBpcyBiZWxpZXZlZCB0byBiZSBzZWN1cmUuICBibG93ZmlzaCBpcyBhIGZhc3QKLSAgICAgICAgICAgICBibG9jayBjaXBoZXI7IGl0IGFwcGVhcnMgdmVyeSBzZWN1cmUgYW5kIGlzIG11Y2ggZmFzdGVyIHRoYW4KLSAgICAgICAgICAgICAzZGVzLiAgZGVzIGlzIG9ubHkgc3VwcG9ydGVkIGluIHRoZSBzc2ggY2xpZW50IGZvcgotICAgICAgICAgICAgIGludGVyb3BlcmFiaWxpdHkgd2l0aCBsZWdhY3kgcHJvdG9jb2wgMSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkbwotICAgICAgICAgICAgIG5vdCBzdXBwb3J0IHRoZSAzZGVzIGNpcGhlci4gIEl0cyB1c2UgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQgZHVlCi0gICAgICAgICAgICAgdG8gY3J5cHRvZ3JhcGhpYyB3ZWFrbmVzc2VzLiAgVGhlIGRlZmF1bHQgaXMgYGAzZGVzJycuCi0KLSAgICAgICAgICAgICBGb3IgcHJvdG9jb2wgdmVyc2lvbiAyLCBjaXBoZXJfc3BlYyBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mCi0gICAgICAgICAgICAgY2lwaGVycyBsaXN0ZWQgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4gIFNlZSB0aGUgQ2lwaGVycyBrZXl3b3JkCi0gICAgICAgICAgICAgaW4gc3NoX2NvbmZpZyg1KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgICAtRCBbYmluZF9hZGRyZXNzOl1wb3J0Ci0gICAgICAgICAgICAgU3BlY2lmaWVzIGEgbG9jYWwgYGBkeW5hbWljJycgYXBwbGljYXRpb24tbGV2ZWwgcG9ydCBmb3J3YXJkaW5nLgotICAgICAgICAgICAgIFRoaXMgd29ya3MgYnkgYWxsb2NhdGluZyBhIHNvY2tldCB0byBsaXN0ZW4gdG8gcG9ydCBvbiB0aGUgbG9jYWwKLSAgICAgICAgICAgICBzaWRlLCBvcHRpb25hbGx5IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgYmluZF9hZGRyZXNzLiAgV2hlbmV2ZXIgYQotICAgICAgICAgICAgIGNvbm5lY3Rpb24gaXMgbWFkZSB0byB0aGlzIHBvcnQsIHRoZSBjb25uZWN0aW9uIGlzIGZvcndhcmRlZCBvdmVyCi0gICAgICAgICAgICAgdGhlIHNlY3VyZSBjaGFubmVsLCBhbmQgdGhlIGFwcGxpY2F0aW9uIHByb3RvY29sIGlzIHRoZW4gdXNlZCB0bwotICAgICAgICAgICAgIGRldGVybWluZSB3aGVyZSB0byBjb25uZWN0IHRvIGZyb20gdGhlIHJlbW90ZSBtYWNoaW5lLiAgQ3VycmVudGx5Ci0gICAgICAgICAgICAgdGhlIFNPQ0tTNCBhbmQgU09DS1M1IHByb3RvY29scyBhcmUgc3VwcG9ydGVkLCBhbmQgc3NoIHdpbGwgYWN0Ci0gICAgICAgICAgICAgYXMgYSBTT0NLUyBzZXJ2ZXIuICBPbmx5IHJvb3QgY2FuIGZvcndhcmQgcHJpdmlsZWdlZCBwb3J0cy4KLSAgICAgICAgICAgICBEeW5hbWljIHBvcnQgZm9yd2FyZGluZ3MgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGluIHRoZQotICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZS4KLQotICAgICAgICAgICAgIElQdjYgYWRkcmVzc2VzIGNhbiBiZSBzcGVjaWZpZWQgYnkgZW5jbG9zaW5nIHRoZSBhZGRyZXNzIGluCi0gICAgICAgICAgICAgc3F1YXJlIGJyYWNrZXRzLiAgT25seSB0aGUgc3VwZXJ1c2VyIGNhbiBmb3J3YXJkIHByaXZpbGVnZWQKLSAgICAgICAgICAgICBwb3J0cy4gIEJ5IGRlZmF1bHQsIHRoZSBsb2NhbCBwb3J0IGlzIGJvdW5kIGluIGFjY29yZGFuY2Ugd2l0aAotICAgICAgICAgICAgIHRoZSBHYXRld2F5UG9ydHMgc2V0dGluZy4gIEhvd2V2ZXIsIGFuIGV4cGxpY2l0IGJpbmRfYWRkcmVzcyBtYXkKLSAgICAgICAgICAgICBiZSB1c2VkIHRvIGJpbmQgdGhlIGNvbm5lY3Rpb24gdG8gYSBzcGVjaWZpYyBhZGRyZXNzLiAgVGhlCi0gICAgICAgICAgICAgYmluZF9hZGRyZXNzIG9mIGBgbG9jYWxob3N0JycgaW5kaWNhdGVzIHRoYXQgdGhlIGxpc3RlbmluZyBwb3J0Ci0gICAgICAgICAgICAgYmUgYm91bmQgZm9yIGxvY2FsIHVzZSBvbmx5LCB3aGlsZSBhbiBlbXB0eSBhZGRyZXNzIG9yIGAqJwotICAgICAgICAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBwb3J0IHNob3VsZCBiZSBhdmFpbGFibGUgZnJvbSBhbGwgaW50ZXJmYWNlcy4KLQotICAgICAtZSBlc2NhcGVfY2hhcgotICAgICAgICAgICAgIFNldHMgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgZm9yIHNlc3Npb25zIHdpdGggYSBwdHkgKGRlZmF1bHQ6IGB+JykuCi0gICAgICAgICAgICAgVGhlIGVzY2FwZSBjaGFyYWN0ZXIgaXMgb25seSByZWNvZ25pemVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYQotICAgICAgICAgICAgIGxpbmUuICBUaGUgZXNjYXBlIGNoYXJhY3RlciBmb2xsb3dlZCBieSBhIGRvdCAoYC4nKSBjbG9zZXMgdGhlCi0gICAgICAgICAgICAgY29ubmVjdGlvbjsgZm9sbG93ZWQgYnkgY29udHJvbC1aIHN1c3BlbmRzIHRoZSBjb25uZWN0aW9uOyBhbmQKLSAgICAgICAgICAgICBmb2xsb3dlZCBieSBpdHNlbGYgc2VuZHMgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgb25jZS4gIFNldHRpbmcgdGhlCi0gICAgICAgICAgICAgY2hhcmFjdGVyIHRvIGBgbm9uZScnIGRpc2FibGVzIGFueSBlc2NhcGVzIGFuZCBtYWtlcyB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgIGZ1bGx5IHRyYW5zcGFyZW50LgotCi0gICAgIC1GIGNvbmZpZ2ZpbGUKLSAgICAgICAgICAgICBTcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlLiAgSWYgYQotICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGUgc3lzdGVtLXdpZGUKLSAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGUgKC9ldGMvc3NoL3NzaF9jb25maWcpIHdpbGwgYmUgaWdub3JlZC4gIFRoZQotICAgICAgICAgICAgIGRlZmF1bHQgZm9yIHRoZSBwZXItdXNlciBjb25maWd1cmF0aW9uIGZpbGUgaXMgfi8uc3NoL2NvbmZpZy4KLQotICAgICAtZiAgICAgIFJlcXVlc3RzIHNzaCB0byBnbyB0byBiYWNrZ3JvdW5kIGp1c3QgYmVmb3JlIGNvbW1hbmQgZXhlY3V0aW9uLgotICAgICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIGlmIHNzaCBpcyBnb2luZyB0byBhc2sgZm9yIHBhc3N3b3JkcyBvcgotICAgICAgICAgICAgIHBhc3NwaHJhc2VzLCBidXQgdGhlIHVzZXIgd2FudHMgaXQgaW4gdGhlIGJhY2tncm91bmQuICBUaGlzCi0gICAgICAgICAgICAgaW1wbGllcyAtbi4gIFRoZSByZWNvbW1lbmRlZCB3YXkgdG8gc3RhcnQgWDExIHByb2dyYW1zIGF0IGEKLSAgICAgICAgICAgICByZW1vdGUgc2l0ZSBpcyB3aXRoIHNvbWV0aGluZyBsaWtlIHNzaCAtZiBob3N0IHh0ZXJtLgotCi0gICAgICAgICAgICAgSWYgdGhlIEV4aXRPbkZvcndhcmRGYWlsdXJlIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIHNldCB0bwotICAgICAgICAgICAgIGBgeWVzJycsIHRoZW4gYSBjbGllbnQgc3RhcnRlZCB3aXRoIC1mIHdpbGwgd2FpdCBmb3IgYWxsIHJlbW90ZQotICAgICAgICAgICAgIHBvcnQgZm9yd2FyZHMgdG8gYmUgc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIGJlZm9yZSBwbGFjaW5nCi0gICAgICAgICAgICAgaXRzZWxmIGluIHRoZSBiYWNrZ3JvdW5kLgotCi0gICAgIC1nICAgICAgQWxsb3dzIHJlbW90ZSBob3N0cyB0byBjb25uZWN0IHRvIGxvY2FsIGZvcndhcmRlZCBwb3J0cy4KLQotICAgICAtSSBwa2NzMTEKLSAgICAgICAgICAgICBTcGVjaWZ5IHRoZSBQS0NTIzExIHNoYXJlZCBsaWJyYXJ5IHNzaCBzaG91bGQgdXNlIHRvIGNvbW11bmljYXRlCi0gICAgICAgICAgICAgd2l0aCBhIFBLQ1MjMTEgdG9rZW4gcHJvdmlkaW5nIHRoZSB1c2VyJ3MgcHJpdmF0ZSBSU0Ega2V5LgotCi0gICAgIC1pIGlkZW50aXR5X2ZpbGUKLSAgICAgICAgICAgICBTZWxlY3RzIGEgZmlsZSBmcm9tIHdoaWNoIHRoZSBpZGVudGl0eSAocHJpdmF0ZSBrZXkpIGZvciBwdWJsaWMKLSAgICAgICAgICAgICBrZXkgYXV0aGVudGljYXRpb24gaXMgcmVhZC4gIFRoZSBkZWZhdWx0IGlzIH4vLnNzaC9pZGVudGl0eSBmb3IKLSAgICAgICAgICAgICBwcm90b2NvbCB2ZXJzaW9uIDEsIGFuZCB+Ly5zc2gvaWRfZHNhLCB+Ly5zc2gvaWRfZWNkc2EgYW5kCi0gICAgICAgICAgICAgfi8uc3NoL2lkX3JzYSBmb3IgcHJvdG9jb2wgdmVyc2lvbiAyLiAgSWRlbnRpdHkgZmlsZXMgbWF5IGFsc28gYmUKLSAgICAgICAgICAgICBzcGVjaWZpZWQgb24gYSBwZXItaG9zdCBiYXNpcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgSXQgaXMKLSAgICAgICAgICAgICBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIC1pIG9wdGlvbnMgKGFuZCBtdWx0aXBsZSBpZGVudGl0aWVzCi0gICAgICAgICAgICAgc3BlY2lmaWVkIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMpLiAgc3NoIHdpbGwgYWxzbyB0cnkgdG8gbG9hZAotICAgICAgICAgICAgIGNlcnRpZmljYXRlIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpbGVuYW1lIG9idGFpbmVkIGJ5IGFwcGVuZGluZwotICAgICAgICAgICAgIC1jZXJ0LnB1YiB0byBpZGVudGl0eSBmaWxlbmFtZXMuCi0KLSAgICAgLUsgICAgICBFbmFibGVzIEdTU0FQSS1iYXNlZCBhdXRoZW50aWNhdGlvbiBhbmQgZm9yd2FyZGluZyAoZGVsZWdhdGlvbikKLSAgICAgICAgICAgICBvZiBHU1NBUEkgY3JlZGVudGlhbHMgdG8gdGhlIHNlcnZlci4KLQotICAgICAtayAgICAgIERpc2FibGVzIGZvcndhcmRpbmcgKGRlbGVnYXRpb24pIG9mIEdTU0FQSSBjcmVkZW50aWFscyB0byB0aGUKLSAgICAgICAgICAgICBzZXJ2ZXIuCi0KLSAgICAgLUwgW2JpbmRfYWRkcmVzczpdcG9ydDpob3N0Omhvc3Rwb3J0Ci0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIGdpdmVuIHBvcnQgb24gdGhlIGxvY2FsIChjbGllbnQpIGhvc3QgaXMgdG8gYmUKLSAgICAgICAgICAgICBmb3J3YXJkZWQgdG8gdGhlIGdpdmVuIGhvc3QgYW5kIHBvcnQgb24gdGhlIHJlbW90ZSBzaWRlLiAgVGhpcwotICAgICAgICAgICAgIHdvcmtzIGJ5IGFsbG9jYXRpbmcgYSBzb2NrZXQgdG8gbGlzdGVuIHRvIHBvcnQgb24gdGhlIGxvY2FsIHNpZGUsCi0gICAgICAgICAgICAgb3B0aW9uYWxseSBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGJpbmRfYWRkcmVzcy4gIFdoZW5ldmVyIGEKLSAgICAgICAgICAgICBjb25uZWN0aW9uIGlzIG1hZGUgdG8gdGhpcyBwb3J0LCB0aGUgY29ubmVjdGlvbiBpcyBmb3J3YXJkZWQgb3ZlcgotICAgICAgICAgICAgIHRoZSBzZWN1cmUgY2hhbm5lbCwgYW5kIGEgY29ubmVjdGlvbiBpcyBtYWRlIHRvIGhvc3QgcG9ydAotICAgICAgICAgICAgIGhvc3Rwb3J0IGZyb20gdGhlIHJlbW90ZSBtYWNoaW5lLiAgUG9ydCBmb3J3YXJkaW5ncyBjYW4gYWxzbyBiZQotICAgICAgICAgICAgIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgSVB2NiBhZGRyZXNzZXMgY2FuIGJlCi0gICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IGVuY2xvc2luZyB0aGUgYWRkcmVzcyBpbiBzcXVhcmUgYnJhY2tldHMuICBPbmx5IHRoZQotICAgICAgICAgICAgIHN1cGVydXNlciBjYW4gZm9yd2FyZCBwcml2aWxlZ2VkIHBvcnRzLiAgQnkgZGVmYXVsdCwgdGhlIGxvY2FsCi0gICAgICAgICAgICAgcG9ydCBpcyBib3VuZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIEdhdGV3YXlQb3J0cyBzZXR0aW5nLgotICAgICAgICAgICAgIEhvd2V2ZXIsIGFuIGV4cGxpY2l0IGJpbmRfYWRkcmVzcyBtYXkgYmUgdXNlZCB0byBiaW5kIHRoZQotICAgICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBzcGVjaWZpYyBhZGRyZXNzLiAgVGhlIGJpbmRfYWRkcmVzcyBvZgotICAgICAgICAgICAgIGBgbG9jYWxob3N0JycgaW5kaWNhdGVzIHRoYXQgdGhlIGxpc3RlbmluZyBwb3J0IGJlIGJvdW5kIGZvcgotICAgICAgICAgICAgIGxvY2FsIHVzZSBvbmx5LCB3aGlsZSBhbiBlbXB0eSBhZGRyZXNzIG9yIGAqJyBpbmRpY2F0ZXMgdGhhdCB0aGUKLSAgICAgICAgICAgICBwb3J0IHNob3VsZCBiZSBhdmFpbGFibGUgZnJvbSBhbGwgaW50ZXJmYWNlcy4KLQotICAgICAtbCBsb2dpbl9uYW1lCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSB1c2VyIHRvIGxvZyBpbiBhcyBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuICBUaGlzIGFsc28KLSAgICAgICAgICAgICBtYXkgYmUgc3BlY2lmaWVkIG9uIGEgcGVyLWhvc3QgYmFzaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLQotICAgICAtTSAgICAgIFBsYWNlcyB0aGUgc3NoIGNsaWVudCBpbnRvIGBgbWFzdGVyJycgbW9kZSBmb3IgY29ubmVjdGlvbgotICAgICAgICAgICAgIHNoYXJpbmcuICBNdWx0aXBsZSAtTSBvcHRpb25zIHBsYWNlcyBzc2ggaW50byBgYG1hc3RlcicnIG1vZGUKLSAgICAgICAgICAgICB3aXRoIGNvbmZpcm1hdGlvbiByZXF1aXJlZCBiZWZvcmUgc2xhdmUgY29ubmVjdGlvbnMgYXJlIGFjY2VwdGVkLgotICAgICAgICAgICAgIFJlZmVyIHRvIHRoZSBkZXNjcmlwdGlvbiBvZiBDb250cm9sTWFzdGVyIGluIHNzaF9jb25maWcoNSkgZm9yCi0gICAgICAgICAgICAgZGV0YWlscy4KLQotICAgICAtbSBtYWNfc3BlYwotICAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgZm9yIHByb3RvY29sIHZlcnNpb24gMiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mCi0gICAgICAgICAgICAgTUFDIChtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUpIGFsZ29yaXRobXMgY2FuIGJlIHNwZWNpZmllZCBpbgotICAgICAgICAgICAgIG9yZGVyIG9mIHByZWZlcmVuY2UuICBTZWUgdGhlIE1BQ3Mga2V5d29yZCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgICAtTiAgICAgIERvIG5vdCBleGVjdXRlIGEgcmVtb3RlIGNvbW1hbmQuICBUaGlzIGlzIHVzZWZ1bCBmb3IganVzdAotICAgICAgICAgICAgIGZvcndhcmRpbmcgcG9ydHMgKHByb3RvY29sIHZlcnNpb24gMiBvbmx5KS4KLQotICAgICAtbiAgICAgIFJlZGlyZWN0cyBzdGRpbiBmcm9tIC9kZXYvbnVsbCAoYWN0dWFsbHksIHByZXZlbnRzIHJlYWRpbmcgZnJvbQotICAgICAgICAgICAgIHN0ZGluKS4gIFRoaXMgbXVzdCBiZSB1c2VkIHdoZW4gc3NoIGlzIHJ1biBpbiB0aGUgYmFja2dyb3VuZC4gIEEKLSAgICAgICAgICAgICBjb21tb24gdHJpY2sgaXMgdG8gdXNlIHRoaXMgdG8gcnVuIFgxMSBwcm9ncmFtcyBvbiBhIHJlbW90ZQotICAgICAgICAgICAgIG1hY2hpbmUuICBGb3IgZXhhbXBsZSwgc3NoIC1uIHNoYWRvd3MuY3MuaHV0LmZpIGVtYWNzICYgd2lsbAotICAgICAgICAgICAgIHN0YXJ0IGFuIGVtYWNzIG9uIHNoYWRvd3MuY3MuaHV0LmZpLCBhbmQgdGhlIFgxMSBjb25uZWN0aW9uIHdpbGwKLSAgICAgICAgICAgICBiZSBhdXRvbWF0aWNhbGx5IGZvcndhcmRlZCBvdmVyIGFuIGVuY3J5cHRlZCBjaGFubmVsLiAgVGhlIHNzaAotICAgICAgICAgICAgIHByb2dyYW0gd2lsbCBiZSBwdXQgaW4gdGhlIGJhY2tncm91bmQuICAoVGhpcyBkb2VzIG5vdCB3b3JrIGlmCi0gICAgICAgICAgICAgc3NoIG5lZWRzIHRvIGFzayBmb3IgYSBwYXNzd29yZCBvciBwYXNzcGhyYXNlOyBzZWUgYWxzbyB0aGUgLWYKLSAgICAgICAgICAgICBvcHRpb24uKQotCi0gICAgIC1PIGN0bF9jbWQKLSAgICAgICAgICAgICBDb250cm9sIGFuIGFjdGl2ZSBjb25uZWN0aW9uIG11bHRpcGxleGluZyBtYXN0ZXIgcHJvY2Vzcy4gIFdoZW4KLSAgICAgICAgICAgICB0aGUgLU8gb3B0aW9uIGlzIHNwZWNpZmllZCwgdGhlIGN0bF9jbWQgYXJndW1lbnQgaXMgaW50ZXJwcmV0ZWQKLSAgICAgICAgICAgICBhbmQgcGFzc2VkIHRvIHRoZSBtYXN0ZXIgcHJvY2Vzcy4gIFZhbGlkIGNvbW1hbmRzIGFyZTogYGBjaGVjaycnCi0gICAgICAgICAgICAgKGNoZWNrIHRoYXQgdGhlIG1hc3RlciBwcm9jZXNzIGlzIHJ1bm5pbmcpLCBgYGZvcndhcmQnJyAocmVxdWVzdAotICAgICAgICAgICAgIGZvcndhcmRpbmdzIHdpdGhvdXQgY29tbWFuZCBleGVjdXRpb24pLCBgYGV4aXQnJyAocmVxdWVzdCB0aGUKLSAgICAgICAgICAgICBtYXN0ZXIgdG8gZXhpdCksIGFuZCBgYHN0b3AnJyAocmVxdWVzdCB0aGUgbWFzdGVyIHRvIHN0b3AKLSAgICAgICAgICAgICBhY2NlcHRpbmcgZnVydGhlciBtdWx0aXBsZXhpbmcgcmVxdWVzdHMpLgotCi0gICAgIC1vIG9wdGlvbgotICAgICAgICAgICAgIENhbiBiZSB1c2VkIHRvIGdpdmUgb3B0aW9ucyBpbiB0aGUgZm9ybWF0IHVzZWQgaW4gdGhlCi0gICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHNwZWNpZnlpbmcgb3B0aW9ucyBmb3IKLSAgICAgICAgICAgICB3aGljaCB0aGVyZSBpcyBubyBzZXBhcmF0ZSBjb21tYW5kLWxpbmUgZmxhZy4gIEZvciBmdWxsIGRldGFpbHMKLSAgICAgICAgICAgICBvZiB0aGUgb3B0aW9ucyBsaXN0ZWQgYmVsb3csIGFuZCB0aGVpciBwb3NzaWJsZSB2YWx1ZXMsIHNlZQotICAgICAgICAgICAgIHNzaF9jb25maWcoNSkuCi0KLSAgICAgICAgICAgICAgICAgICBBZGRyZXNzRmFtaWx5Ci0gICAgICAgICAgICAgICAgICAgQmF0Y2hNb2RlCi0gICAgICAgICAgICAgICAgICAgQmluZEFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgQ2hlY2tIb3N0SVAKLSAgICAgICAgICAgICAgICAgICBDaXBoZXIKLSAgICAgICAgICAgICAgICAgICBDaXBoZXJzCi0gICAgICAgICAgICAgICAgICAgQ2xlYXJBbGxGb3J3YXJkaW5ncwotICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25MZXZlbAotICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25BdHRlbXB0cwotICAgICAgICAgICAgICAgICAgIENvbm5lY3RUaW1lb3V0Ci0gICAgICAgICAgICAgICAgICAgQ29udHJvbE1hc3RlcgotICAgICAgICAgICAgICAgICAgIENvbnRyb2xQYXRoCi0gICAgICAgICAgICAgICAgICAgRHluYW1pY0ZvcndhcmQKLSAgICAgICAgICAgICAgICAgICBFc2NhcGVDaGFyCi0gICAgICAgICAgICAgICAgICAgRXhpdE9uRm9yd2FyZEZhaWx1cmUKLSAgICAgICAgICAgICAgICAgICBGb3J3YXJkQWdlbnQKLSAgICAgICAgICAgICAgICAgICBGb3J3YXJkWDExCi0gICAgICAgICAgICAgICAgICAgRm9yd2FyZFgxMVRydXN0ZWQKLSAgICAgICAgICAgICAgICAgICBHYXRld2F5UG9ydHMKLSAgICAgICAgICAgICAgICAgICBHbG9iYWxLbm93bkhvc3RzRmlsZQotICAgICAgICAgICAgICAgICAgIEdTU0FQSUF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgR1NTQVBJRGVsZWdhdGVDcmVkZW50aWFscwotICAgICAgICAgICAgICAgICAgIEhhc2hLbm93bkhvc3RzCi0gICAgICAgICAgICAgICAgICAgSG9zdAotICAgICAgICAgICAgICAgICAgIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgSG9zdEtleUFsZ29yaXRobXMKLSAgICAgICAgICAgICAgICAgICBIb3N0S2V5QWxpYXMKLSAgICAgICAgICAgICAgICAgICBIb3N0TmFtZQotICAgICAgICAgICAgICAgICAgIElkZW50aXR5RmlsZQotICAgICAgICAgICAgICAgICAgIElkZW50aXRpZXNPbmx5Ci0gICAgICAgICAgICAgICAgICAgSVBRb1MKLSAgICAgICAgICAgICAgICAgICBLYmRJbnRlcmFjdGl2ZURldmljZXMKLSAgICAgICAgICAgICAgICAgICBLZXhBbGdvcml0aG1zCi0gICAgICAgICAgICAgICAgICAgTG9jYWxDb21tYW5kCi0gICAgICAgICAgICAgICAgICAgTG9jYWxGb3J3YXJkCi0gICAgICAgICAgICAgICAgICAgTG9nTGV2ZWwKLSAgICAgICAgICAgICAgICAgICBNQUNzCi0gICAgICAgICAgICAgICAgICAgTm9Ib3N0QXV0aGVudGljYXRpb25Gb3JMb2NhbGhvc3QKLSAgICAgICAgICAgICAgICAgICBOdW1iZXJPZlBhc3N3b3JkUHJvbXB0cwotICAgICAgICAgICAgICAgICAgIFBhc3N3b3JkQXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICAgICBQZXJtaXRMb2NhbENvbW1hbmQKLSAgICAgICAgICAgICAgICAgICBQS0NTMTFQcm92aWRlcgotICAgICAgICAgICAgICAgICAgIFBvcnQKLSAgICAgICAgICAgICAgICAgICBQcmVmZXJyZWRBdXRoZW50aWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgICBQcm90b2NvbAotICAgICAgICAgICAgICAgICAgIFByb3h5Q29tbWFuZAotICAgICAgICAgICAgICAgICAgIFB1YmtleUF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgUmVrZXlMaW1pdAotICAgICAgICAgICAgICAgICAgIFJlbW90ZUZvcndhcmQKLSAgICAgICAgICAgICAgICAgICBSZXF1ZXN0VFRZCi0gICAgICAgICAgICAgICAgICAgUmhvc3RzUlNBQXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICAgICBSU0FBdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgICAgICAgIFNlbmRFbnYKLSAgICAgICAgICAgICAgICAgICBTZXJ2ZXJBbGl2ZUludGVydmFsCi0gICAgICAgICAgICAgICAgICAgU2VydmVyQWxpdmVDb3VudE1heAotICAgICAgICAgICAgICAgICAgIFN0cmljdEhvc3RLZXlDaGVja2luZwotICAgICAgICAgICAgICAgICAgIFRDUEtlZXBBbGl2ZQotICAgICAgICAgICAgICAgICAgIFR1bm5lbAotICAgICAgICAgICAgICAgICAgIFR1bm5lbERldmljZQotICAgICAgICAgICAgICAgICAgIFVzZVByaXZpbGVnZWRQb3J0Ci0gICAgICAgICAgICAgICAgICAgVXNlcgotICAgICAgICAgICAgICAgICAgIFVzZXJLbm93bkhvc3RzRmlsZQotICAgICAgICAgICAgICAgICAgIFZlcmlmeUhvc3RLZXlETlMKLSAgICAgICAgICAgICAgICAgICBWaXN1YWxIb3N0S2V5Ci0gICAgICAgICAgICAgICAgICAgWEF1dGhMb2NhdGlvbgotCi0gICAgIC1wIHBvcnQKLSAgICAgICAgICAgICBQb3J0IHRvIGNvbm5lY3QgdG8gb24gdGhlIHJlbW90ZSBob3N0LiAgVGhpcyBjYW4gYmUgc3BlY2lmaWVkIG9uCi0gICAgICAgICAgICAgYSBwZXItaG9zdCBiYXNpcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotCi0gICAgIC1xICAgICAgUXVpZXQgbW9kZS4gIENhdXNlcyBtb3N0IHdhcm5pbmcgYW5kIGRpYWdub3N0aWMgbWVzc2FnZXMgdG8gYmUKLSAgICAgICAgICAgICBzdXBwcmVzc2VkLgotCi0gICAgIC1SIFtiaW5kX2FkZHJlc3M6XXBvcnQ6aG9zdDpob3N0cG9ydAotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGF0IHRoZSBnaXZlbiBwb3J0IG9uIHRoZSByZW1vdGUgKHNlcnZlcikgaG9zdCBpcyB0bwotICAgICAgICAgICAgIGJlIGZvcndhcmRlZCB0byB0aGUgZ2l2ZW4gaG9zdCBhbmQgcG9ydCBvbiB0aGUgbG9jYWwgc2lkZS4gIFRoaXMKLSAgICAgICAgICAgICB3b3JrcyBieSBhbGxvY2F0aW5nIGEgc29ja2V0IHRvIGxpc3RlbiB0byBwb3J0IG9uIHRoZSByZW1vdGUKLSAgICAgICAgICAgICBzaWRlLCBhbmQgd2hlbmV2ZXIgYSBjb25uZWN0aW9uIGlzIG1hZGUgdG8gdGhpcyBwb3J0LCB0aGUKLSAgICAgICAgICAgICBjb25uZWN0aW9uIGlzIGZvcndhcmRlZCBvdmVyIHRoZSBzZWN1cmUgY2hhbm5lbCwgYW5kIGEgY29ubmVjdGlvbgotICAgICAgICAgICAgIGlzIG1hZGUgdG8gaG9zdCBwb3J0IGhvc3Rwb3J0IGZyb20gdGhlIGxvY2FsIG1hY2hpbmUuCi0KLSAgICAgICAgICAgICBQb3J0IGZvcndhcmRpbmdzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAgICAgICAgIFByaXZpbGVnZWQgcG9ydHMgY2FuIGJlIGZvcndhcmRlZCBvbmx5IHdoZW4gbG9nZ2luZyBpbiBhcyByb290IG9uCi0gICAgICAgICAgICAgdGhlIHJlbW90ZSBtYWNoaW5lLiAgSVB2NiBhZGRyZXNzZXMgY2FuIGJlIHNwZWNpZmllZCBieSBlbmNsb3NpbmcKLSAgICAgICAgICAgICB0aGUgYWRkcmVzcyBpbiBzcXVhcmUgYnJhY2VzLgotCi0gICAgICAgICAgICAgQnkgZGVmYXVsdCwgdGhlIGxpc3RlbmluZyBzb2NrZXQgb24gdGhlIHNlcnZlciB3aWxsIGJlIGJvdW5kIHRvCi0gICAgICAgICAgICAgdGhlIGxvb3BiYWNrIGludGVyZmFjZSBvbmx5LiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieQotICAgICAgICAgICAgIHNwZWNpZnlpbmcgYSBiaW5kX2FkZHJlc3MuICBBbiBlbXB0eSBiaW5kX2FkZHJlc3MsIG9yIHRoZSBhZGRyZXNzCi0gICAgICAgICAgICAgYConLCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVtb3RlIHNvY2tldCBzaG91bGQgbGlzdGVuIG9uIGFsbAotICAgICAgICAgICAgIGludGVyZmFjZXMuICBTcGVjaWZ5aW5nIGEgcmVtb3RlIGJpbmRfYWRkcmVzcyB3aWxsIG9ubHkgc3VjY2VlZAotICAgICAgICAgICAgIGlmIHRoZSBzZXJ2ZXIncyBHYXRld2F5UG9ydHMgb3B0aW9uIGlzIGVuYWJsZWQgKHNlZQotICAgICAgICAgICAgIHNzaGRfY29uZmlnKDUpKS4KLQotICAgICAgICAgICAgIElmIHRoZSBwb3J0IGFyZ3VtZW50IGlzIGAwJywgdGhlIGxpc3RlbiBwb3J0IHdpbGwgYmUgZHluYW1pY2FsbHkKLSAgICAgICAgICAgICBhbGxvY2F0ZWQgb24gdGhlIHNlcnZlciBhbmQgcmVwb3J0ZWQgdG8gdGhlIGNsaWVudCBhdCBydW4gdGltZS4KLSAgICAgICAgICAgICBXaGVuIHVzZWQgdG9nZXRoZXIgd2l0aCAtTyBmb3J3YXJkIHRoZSBhbGxvY2F0ZWQgcG9ydCB3aWxsIGJlCi0gICAgICAgICAgICAgcHJpbnRlZCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi0gICAgIC1TIGN0bF9wYXRoCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBhIGNvbnRyb2wgc29ja2V0IGZvciBjb25uZWN0aW9uCi0gICAgICAgICAgICAgc2hhcmluZywgb3IgdGhlIHN0cmluZyBgYG5vbmUnJyB0byBkaXNhYmxlIGNvbm5lY3Rpb24gc2hhcmluZy4KLSAgICAgICAgICAgICBSZWZlciB0byB0aGUgZGVzY3JpcHRpb24gb2YgQ29udHJvbFBhdGggYW5kIENvbnRyb2xNYXN0ZXIgaW4KLSAgICAgICAgICAgICBzc2hfY29uZmlnKDUpIGZvciBkZXRhaWxzLgotCi0gICAgIC1zICAgICAgTWF5IGJlIHVzZWQgdG8gcmVxdWVzdCBpbnZvY2F0aW9uIG9mIGEgc3Vic3lzdGVtIG9uIHRoZSByZW1vdGUKLSAgICAgICAgICAgICBzeXN0ZW0uICBTdWJzeXN0ZW1zIGFyZSBhIGZlYXR1cmUgb2YgdGhlIFNTSDIgcHJvdG9jb2wgd2hpY2gKLSAgICAgICAgICAgICBmYWNpbGl0YXRlIHRoZSB1c2Ugb2YgU1NIIGFzIGEgc2VjdXJlIHRyYW5zcG9ydCBmb3Igb3RoZXIKLSAgICAgICAgICAgICBhcHBsaWNhdGlvbnMgKGVnLiBzZnRwKDEpKS4gIFRoZSBzdWJzeXN0ZW0gaXMgc3BlY2lmaWVkIGFzIHRoZQotICAgICAgICAgICAgIHJlbW90ZSBjb21tYW5kLgotCi0gICAgIC1UICAgICAgRGlzYWJsZSBwc2V1ZG8tdHR5IGFsbG9jYXRpb24uCi0KLSAgICAgLXQgICAgICBGb3JjZSBwc2V1ZG8tdHR5IGFsbG9jYXRpb24uICBUaGlzIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUKLSAgICAgICAgICAgICBhcmJpdHJhcnkgc2NyZWVuLWJhc2VkIHByb2dyYW1zIG9uIGEgcmVtb3RlIG1hY2hpbmUsIHdoaWNoIGNhbiBiZQotICAgICAgICAgICAgIHZlcnkgdXNlZnVsLCBlLmcuIHdoZW4gaW1wbGVtZW50aW5nIG1lbnUgc2VydmljZXMuICBNdWx0aXBsZSAtdAotICAgICAgICAgICAgIG9wdGlvbnMgZm9yY2UgdHR5IGFsbG9jYXRpb24sIGV2ZW4gaWYgc3NoIGhhcyBubyBsb2NhbCB0dHkuCi0KLSAgICAgLVYgICAgICBEaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdC4KLQotICAgICAtdiAgICAgIFZlcmJvc2UgbW9kZS4gIENhdXNlcyBzc2ggdG8gcHJpbnQgZGVidWdnaW5nIG1lc3NhZ2VzIGFib3V0IGl0cwotICAgICAgICAgICAgIHByb2dyZXNzLiAgVGhpcyBpcyBoZWxwZnVsIGluIGRlYnVnZ2luZyBjb25uZWN0aW9uLAotICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLCBhbmQgY29uZmlndXJhdGlvbiBwcm9ibGVtcy4gIE11bHRpcGxlIC12IG9wdGlvbnMKLSAgICAgICAgICAgICBpbmNyZWFzZSB0aGUgdmVyYm9zaXR5LiAgVGhlIG1heGltdW0gaXMgMy4KLQotICAgICAtVyBob3N0OnBvcnQKLSAgICAgICAgICAgICBSZXF1ZXN0cyB0aGF0IHN0YW5kYXJkIGlucHV0IGFuZCBvdXRwdXQgb24gdGhlIGNsaWVudCBiZQotICAgICAgICAgICAgIGZvcndhcmRlZCB0byBob3N0IG9uIHBvcnQgb3ZlciB0aGUgc2VjdXJlIGNoYW5uZWwuICBJbXBsaWVzIC1OLAotICAgICAgICAgICAgIC1ULCBFeGl0T25Gb3J3YXJkRmFpbHVyZSBhbmQgQ2xlYXJBbGxGb3J3YXJkaW5ncyBhbmQgd29ya3Mgd2l0aAotICAgICAgICAgICAgIFByb3RvY29sIHZlcnNpb24gMiBvbmx5LgotCi0gICAgIC13IGxvY2FsX3R1bls6cmVtb3RlX3R1bl0KLSAgICAgICAgICAgICBSZXF1ZXN0cyB0dW5uZWwgZGV2aWNlIGZvcndhcmRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHR1big0KQotICAgICAgICAgICAgIGRldmljZXMgYmV0d2VlbiB0aGUgY2xpZW50IChsb2NhbF90dW4pIGFuZCB0aGUgc2VydmVyCi0gICAgICAgICAgICAgKHJlbW90ZV90dW4pLgotCi0gICAgICAgICAgICAgVGhlIGRldmljZXMgbWF5IGJlIHNwZWNpZmllZCBieSBudW1lcmljYWwgSUQgb3IgdGhlIGtleXdvcmQKLSAgICAgICAgICAgICBgYGFueScnLCB3aGljaCB1c2VzIHRoZSBuZXh0IGF2YWlsYWJsZSB0dW5uZWwgZGV2aWNlLiAgSWYKLSAgICAgICAgICAgICByZW1vdGVfdHVuIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBgYW55JycuICBTZWUgYWxzbwotICAgICAgICAgICAgIHRoZSBUdW5uZWwgYW5kIFR1bm5lbERldmljZSBkaXJlY3RpdmVzIGluIHNzaF9jb25maWcoNSkuICBJZiB0aGUKLSAgICAgICAgICAgICBUdW5uZWwgZGlyZWN0aXZlIGlzIHVuc2V0LCBpdCBpcyBzZXQgdG8gdGhlIGRlZmF1bHQgdHVubmVsIG1vZGUsCi0gICAgICAgICAgICAgd2hpY2ggaXMgYGBwb2ludC10by1wb2ludCcnLgotCi0gICAgIC1YICAgICAgRW5hYmxlcyBYMTEgZm9yd2FyZGluZy4gIFRoaXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIG9uIGEgcGVyLWhvc3QKLSAgICAgICAgICAgICBiYXNpcyBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KLQotICAgICAgICAgICAgIFgxMSBmb3J3YXJkaW5nIHNob3VsZCBiZSBlbmFibGVkIHdpdGggY2F1dGlvbi4gIFVzZXJzIHdpdGggdGhlCi0gICAgICAgICAgICAgYWJpbGl0eSB0byBieXBhc3MgZmlsZSBwZXJtaXNzaW9ucyBvbiB0aGUgcmVtb3RlIGhvc3QgKGZvciB0aGUKLSAgICAgICAgICAgICB1c2VyJ3MgWCBhdXRob3JpemF0aW9uIGRhdGFiYXNlKSBjYW4gYWNjZXNzIHRoZSBsb2NhbCBYMTEgZGlzcGxheQotICAgICAgICAgICAgIHRocm91Z2ggdGhlIGZvcndhcmRlZCBjb25uZWN0aW9uLiAgQW4gYXR0YWNrZXIgbWF5IHRoZW4gYmUgYWJsZQotICAgICAgICAgICAgIHRvIHBlcmZvcm0gYWN0aXZpdGllcyBzdWNoIGFzIGtleXN0cm9rZSBtb25pdG9yaW5nLgotCi0gICAgICAgICAgICAgRm9yIHRoaXMgcmVhc29uLCBYMTEgZm9yd2FyZGluZyBpcyBzdWJqZWN0ZWQgdG8gWDExIFNFQ1VSSVRZCi0gICAgICAgICAgICAgZXh0ZW5zaW9uIHJlc3RyaWN0aW9ucyBieSBkZWZhdWx0LiAgUGxlYXNlIHJlZmVyIHRvIHRoZSBzc2ggLVkKLSAgICAgICAgICAgICBvcHRpb24gYW5kIHRoZSBGb3J3YXJkWDExVHJ1c3RlZCBkaXJlY3RpdmUgaW4gc3NoX2NvbmZpZyg1KSBmb3IKLSAgICAgICAgICAgICBtb3JlIGluZm9ybWF0aW9uLgotCi0gICAgIC14ICAgICAgRGlzYWJsZXMgWDExIGZvcndhcmRpbmcuCi0KLSAgICAgLVkgICAgICBFbmFibGVzIHRydXN0ZWQgWDExIGZvcndhcmRpbmcuICBUcnVzdGVkIFgxMSBmb3J3YXJkaW5ncyBhcmUgbm90Ci0gICAgICAgICAgICAgc3ViamVjdGVkIHRvIHRoZSBYMTEgU0VDVVJJVFkgZXh0ZW5zaW9uIGNvbnRyb2xzLgotCi0gICAgIC15ICAgICAgU2VuZCBsb2cgaW5mb3JtYXRpb24gdXNpbmcgdGhlIHN5c2xvZygzKSBzeXN0ZW0gbW9kdWxlLiAgQnkKLSAgICAgICAgICAgICBkZWZhdWx0IHRoaXMgaW5mb3JtYXRpb24gaXMgc2VudCB0byBzdGRlcnIuCi0KLSAgICAgc3NoIG1heSBhZGRpdGlvbmFsbHkgb2J0YWluIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGEgcGVyLXVzZXIKLSAgICAgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBhIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZSBmaWxlIGZvcm1hdAotICAgICBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBkZXNjcmliZWQgaW4gc3NoX2NvbmZpZyg1KS4KLQotQVVUSEVOVElDQVRJT04KLSAgICAgVGhlIE9wZW5TU0ggU1NIIGNsaWVudCBzdXBwb3J0cyBTU0ggcHJvdG9jb2xzIDEgYW5kIDIuICBUaGUgZGVmYXVsdCBpcyB0bwotICAgICB1c2UgcHJvdG9jb2wgMiBvbmx5LCB0aG91Z2ggdGhpcyBjYW4gYmUgY2hhbmdlZCB2aWEgdGhlIFByb3RvY29sIG9wdGlvbgotICAgICBpbiBzc2hfY29uZmlnKDUpIG9yIHRoZSAtMSBhbmQgLTIgb3B0aW9ucyAoc2VlIGFib3ZlKS4gIEJvdGggcHJvdG9jb2xzCi0gICAgIHN1cHBvcnQgc2ltaWxhciBhdXRoZW50aWNhdGlvbiBtZXRob2RzLCBidXQgcHJvdG9jb2wgMiBpcyB0aGUgZGVmYXVsdAotICAgICBzaW5jZSBpdCBwcm92aWRlcyBhZGRpdGlvbmFsIG1lY2hhbmlzbXMgZm9yIGNvbmZpZGVudGlhbGl0eSAodGhlIHRyYWZmaWMKLSAgICAgaXMgZW5jcnlwdGVkIHVzaW5nIEFFUywgM0RFUywgQmxvd2Zpc2gsIENBU1QxMjgsIG9yIEFyY2ZvdXIpIGFuZAotICAgICBpbnRlZ3JpdHkgKGhtYWMtbWQ1LCBobWFjLXNoYTEsIGhtYWMtc2hhMi0yNTYsIGhtYWMtc2hhMi01MTIsIHVtYWMtNjQsCi0gICAgIGhtYWMtcmlwZW1kMTYwKS4gIFByb3RvY29sIDEgbGFja3MgYSBzdHJvbmcgbWVjaGFuaXNtIGZvciBlbnN1cmluZyB0aGUKLSAgICAgaW50ZWdyaXR5IG9mIHRoZSBjb25uZWN0aW9uLgotCi0gICAgIFRoZSBtZXRob2RzIGF2YWlsYWJsZSBmb3IgYXV0aGVudGljYXRpb24gYXJlOiBHU1NBUEktYmFzZWQKLSAgICAgYXV0aGVudGljYXRpb24sIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24sIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24sCi0gICAgIGNoYWxsZW5nZS1yZXNwb25zZSBhdXRoZW50aWNhdGlvbiwgYW5kIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLgotICAgICBBdXRoZW50aWNhdGlvbiBtZXRob2RzIGFyZSB0cmllZCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGFib3ZlLCB0aG91Z2gKLSAgICAgcHJvdG9jb2wgMiBoYXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgb3JkZXI6Ci0gICAgIFByZWZlcnJlZEF1dGhlbnRpY2F0aW9ucy4KLQotICAgICBIb3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIHdvcmtzIGFzIGZvbGxvd3M6IElmIHRoZSBtYWNoaW5lIHRoZSB1c2VyIGxvZ3MKLSAgICAgaW4gZnJvbSBpcyBsaXN0ZWQgaW4gL2V0Yy9ob3N0cy5lcXVpdiBvciAvZXRjL3Nob3N0cy5lcXVpdiBvbiB0aGUgcmVtb3RlCi0gICAgIG1hY2hpbmUsIGFuZCB0aGUgdXNlciBuYW1lcyBhcmUgdGhlIHNhbWUgb24gYm90aCBzaWRlcywgb3IgaWYgdGhlIGZpbGVzCi0gICAgIH4vLnJob3N0cyBvciB+Ly5zaG9zdHMgZXhpc3QgaW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBvbiB0aGUgcmVtb3RlCi0gICAgIG1hY2hpbmUgYW5kIGNvbnRhaW4gYSBsaW5lIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGNsaWVudCBtYWNoaW5lIGFuZAotICAgICB0aGUgbmFtZSBvZiB0aGUgdXNlciBvbiB0aGF0IG1hY2hpbmUsIHRoZSB1c2VyIGlzIGNvbnNpZGVyZWQgZm9yIGxvZ2luLgotICAgICBBZGRpdGlvbmFsbHksIHRoZSBzZXJ2ZXIgbXVzdCBiZSBhYmxlIHRvIHZlcmlmeSB0aGUgY2xpZW50J3MgaG9zdCBrZXkKLSAgICAgKHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgL2V0Yy9zc2gvc3NoX2tub3duX2hvc3RzIGFuZCB+Ly5zc2gva25vd25faG9zdHMsCi0gICAgIGJlbG93KSBmb3IgbG9naW4gdG8gYmUgcGVybWl0dGVkLiAgVGhpcyBhdXRoZW50aWNhdGlvbiBtZXRob2QgY2xvc2VzCi0gICAgIHNlY3VyaXR5IGhvbGVzIGR1ZSB0byBJUCBzcG9vZmluZywgRE5TIHNwb29maW5nLCBhbmQgcm91dGluZyBzcG9vZmluZy4KLSAgICAgW05vdGUgdG8gdGhlIGFkbWluaXN0cmF0b3I6IC9ldGMvaG9zdHMuZXF1aXYsIH4vLnJob3N0cywgYW5kIHRoZQotICAgICBybG9naW4vcnNoIHByb3RvY29sIGluIGdlbmVyYWwsIGFyZSBpbmhlcmVudGx5IGluc2VjdXJlIGFuZCBzaG91bGQgYmUKLSAgICAgZGlzYWJsZWQgaWYgc2VjdXJpdHkgaXMgZGVzaXJlZC5dCi0KLSAgICAgUHVibGljIGtleSBhdXRoZW50aWNhdGlvbiB3b3JrcyBhcyBmb2xsb3dzOiBUaGUgc2NoZW1lIGlzIGJhc2VkIG9uCi0gICAgIHB1YmxpYy1rZXkgY3J5cHRvZ3JhcGh5LCB1c2luZyBjcnlwdG9zeXN0ZW1zIHdoZXJlIGVuY3J5cHRpb24gYW5kCi0gICAgIGRlY3J5cHRpb24gYXJlIGRvbmUgdXNpbmcgc2VwYXJhdGUga2V5cywgYW5kIGl0IGlzIHVuZmVhc2libGUgdG8gZGVyaXZlCi0gICAgIHRoZSBkZWNyeXB0aW9uIGtleSBmcm9tIHRoZSBlbmNyeXB0aW9uIGtleS4gIFRoZSBpZGVhIGlzIHRoYXQgZWFjaCB1c2VyCi0gICAgIGNyZWF0ZXMgYSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFpciBmb3IgYXV0aGVudGljYXRpb24gcHVycG9zZXMuICBUaGUKLSAgICAgc2VydmVyIGtub3dzIHRoZSBwdWJsaWMga2V5LCBhbmQgb25seSB0aGUgdXNlciBrbm93cyB0aGUgcHJpdmF0ZSBrZXkuCi0gICAgIHNzaCBpbXBsZW1lbnRzIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgYXV0b21hdGljYWxseSwgdXNpbmcKLSAgICAgb25lIG9mIHRoZSBEU0EsIEVDRFNBIG9yIFJTQSBhbGdvcml0aG1zLiAgUHJvdG9jb2wgMSBpcyByZXN0cmljdGVkIHRvCi0gICAgIHVzaW5nIG9ubHkgUlNBIGtleXMsIGJ1dCBwcm90b2NvbCAyIG1heSB1c2UgYW55LiAgVGhlIEhJU1RPUlkgc2VjdGlvbiBvZgotICAgICBzc2woOCkgY29udGFpbnMgYSBicmllZiBkaXNjdXNzaW9uIG9mIHRoZSBEU0EgYW5kIFJTQSBhbGdvcml0aG1zLgotCi0gICAgIFRoZSBmaWxlIH4vLnNzaC9hdXRob3JpemVkX2tleXMgbGlzdHMgdGhlIHB1YmxpYyBrZXlzIHRoYXQgYXJlIHBlcm1pdHRlZAotICAgICBmb3IgbG9nZ2luZyBpbi4gIFdoZW4gdGhlIHVzZXIgbG9ncyBpbiwgdGhlIHNzaCBwcm9ncmFtIHRlbGxzIHRoZSBzZXJ2ZXIKLSAgICAgd2hpY2gga2V5IHBhaXIgaXQgd291bGQgbGlrZSB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uLiAgVGhlIGNsaWVudAotICAgICBwcm92ZXMgdGhhdCBpdCBoYXMgYWNjZXNzIHRvIHRoZSBwcml2YXRlIGtleSBhbmQgdGhlIHNlcnZlciBjaGVja3MgdGhhdAotICAgICB0aGUgY29ycmVzcG9uZGluZyBwdWJsaWMga2V5IGlzIGF1dGhvcml6ZWQgdG8gYWNjZXB0IHRoZSBhY2NvdW50LgotCi0gICAgIFRoZSB1c2VyIGNyZWF0ZXMgaGlzL2hlciBrZXkgcGFpciBieSBydW5uaW5nIHNzaC1rZXlnZW4oMSkuICBUaGlzIHN0b3JlcwotICAgICB0aGUgcHJpdmF0ZSBrZXkgaW4gfi8uc3NoL2lkZW50aXR5IChwcm90b2NvbCAxKSwgfi8uc3NoL2lkX2RzYSAocHJvdG9jb2wKLSAgICAgMiBEU0EpLCB+Ly5zc2gvaWRfZWNkc2EgKHByb3RvY29sIDIgRUNEU0EpLCBvciB+Ly5zc2gvaWRfcnNhIChwcm90b2NvbCAyCi0gICAgIFJTQSkgYW5kIHN0b3JlcyB0aGUgcHVibGljIGtleSBpbiB+Ly5zc2gvaWRlbnRpdHkucHViIChwcm90b2NvbCAxKSwKLSAgICAgfi8uc3NoL2lkX2RzYS5wdWIgKHByb3RvY29sIDIgRFNBKSwgfi8uc3NoL2lkX2VjZHNhLnB1YiAocHJvdG9jb2wgMgotICAgICBFQ0RTQSksIG9yIH4vLnNzaC9pZF9yc2EucHViIChwcm90b2NvbCAyIFJTQSkgaW4gdGhlIHVzZXIncyBob21lCi0gICAgIGRpcmVjdG9yeS4gIFRoZSB1c2VyIHNob3VsZCB0aGVuIGNvcHkgdGhlIHB1YmxpYyBrZXkgdG8KLSAgICAgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cyBpbiBoaXMvaGVyIGhvbWUgZGlyZWN0b3J5IG9uIHRoZSByZW1vdGUgbWFjaGluZS4KLSAgICAgVGhlIGF1dGhvcml6ZWRfa2V5cyBmaWxlIGNvcnJlc3BvbmRzIHRvIHRoZSBjb252ZW50aW9uYWwgfi8ucmhvc3RzIGZpbGUsCi0gICAgIGFuZCBoYXMgb25lIGtleSBwZXIgbGluZSwgdGhvdWdoIHRoZSBsaW5lcyBjYW4gYmUgdmVyeSBsb25nLiAgQWZ0ZXIgdGhpcywKLSAgICAgdGhlIHVzZXIgY2FuIGxvZyBpbiB3aXRob3V0IGdpdmluZyB0aGUgcGFzc3dvcmQuCi0KLSAgICAgQSB2YXJpYXRpb24gb24gcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGZvcm0gb2YKLSAgICAgY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb246IGluc3RlYWQgb2YgYSBzZXQgb2YgcHVibGljL3ByaXZhdGUga2V5cywKLSAgICAgc2lnbmVkIGNlcnRpZmljYXRlcyBhcmUgdXNlZC4gIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCBhIHNpbmdsZQotICAgICB0cnVzdGVkIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5IGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIG1hbnkKLSAgICAgcHVibGljL3ByaXZhdGUga2V5cy4gIFNlZSB0aGUgQ0VSVElGSUNBVEVTIHNlY3Rpb24gb2Ygc3NoLWtleWdlbigxKSBmb3IKLSAgICAgbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgICBUaGUgbW9zdCBjb252ZW5pZW50IHdheSB0byB1c2UgcHVibGljIGtleSBvciBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbgotICAgICBtYXkgYmUgd2l0aCBhbiBhdXRoZW50aWNhdGlvbiBhZ2VudC4gIFNlZSBzc2gtYWdlbnQoMSkgZm9yIG1vcmUKLSAgICAgaW5mb3JtYXRpb24uCi0KLSAgICAgQ2hhbGxlbmdlLXJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uIHdvcmtzIGFzIGZvbGxvd3M6IFRoZSBzZXJ2ZXIgc2VuZHMgYW4KLSAgICAgYXJiaXRyYXJ5ICJjaGFsbGVuZ2UiIHRleHQsIGFuZCBwcm9tcHRzIGZvciBhIHJlc3BvbnNlLiAgUHJvdG9jb2wgMgotICAgICBhbGxvd3MgbXVsdGlwbGUgY2hhbGxlbmdlcyBhbmQgcmVzcG9uc2VzOyBwcm90b2NvbCAxIGlzIHJlc3RyaWN0ZWQgdG8KLSAgICAganVzdCBvbmUgY2hhbGxlbmdlL3Jlc3BvbnNlLiAgRXhhbXBsZXMgb2YgY2hhbGxlbmdlLXJlc3BvbnNlCi0gICAgIGF1dGhlbnRpY2F0aW9uIGluY2x1ZGUgQlNEIEF1dGhlbnRpY2F0aW9uIChzZWUgbG9naW4uY29uZig1KSkgYW5kIFBBTQotICAgICAoc29tZSBub24tT3BlbkJTRCBzeXN0ZW1zKS4KLQotICAgICBGaW5hbGx5LCBpZiBvdGhlciBhdXRoZW50aWNhdGlvbiBtZXRob2RzIGZhaWwsIHNzaCBwcm9tcHRzIHRoZSB1c2VyIGZvciBhCi0gICAgIHBhc3N3b3JkLiAgVGhlIHBhc3N3b3JkIGlzIHNlbnQgdG8gdGhlIHJlbW90ZSBob3N0IGZvciBjaGVja2luZzsgaG93ZXZlciwKLSAgICAgc2luY2UgYWxsIGNvbW11bmljYXRpb25zIGFyZSBlbmNyeXB0ZWQsIHRoZSBwYXNzd29yZCBjYW5ub3QgYmUgc2VlbiBieQotICAgICBzb21lb25lIGxpc3RlbmluZyBvbiB0aGUgbmV0d29yay4KLQotICAgICBzc2ggYXV0b21hdGljYWxseSBtYWludGFpbnMgYW5kIGNoZWNrcyBhIGRhdGFiYXNlIGNvbnRhaW5pbmcKLSAgICAgaWRlbnRpZmljYXRpb24gZm9yIGFsbCBob3N0cyBpdCBoYXMgZXZlciBiZWVuIHVzZWQgd2l0aC4gIEhvc3Qga2V5cyBhcmUKLSAgICAgc3RvcmVkIGluIH4vLnNzaC9rbm93bl9ob3N0cyBpbiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LiAgQWRkaXRpb25hbGx5LAotICAgICB0aGUgZmlsZSAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMgaXMgYXV0b21hdGljYWxseSBjaGVja2VkIGZvciBrbm93bgotICAgICBob3N0cy4gIEFueSBuZXcgaG9zdHMgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHVzZXIncyBmaWxlLiAgSWYgYQotICAgICBob3N0J3MgaWRlbnRpZmljYXRpb24gZXZlciBjaGFuZ2VzLCBzc2ggd2FybnMgYWJvdXQgdGhpcyBhbmQgZGlzYWJsZXMKLSAgICAgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gdG8gcHJldmVudCBzZXJ2ZXIgc3Bvb2Zpbmcgb3IgbWFuLWluLXRoZS1taWRkbGUKLSAgICAgYXR0YWNrcywgd2hpY2ggY291bGQgb3RoZXJ3aXNlIGJlIHVzZWQgdG8gY2lyY3VtdmVudCB0aGUgZW5jcnlwdGlvbi4gIFRoZQotICAgICBTdHJpY3RIb3N0S2V5Q2hlY2tpbmcgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgbG9naW5zIHRvIG1hY2hpbmVzCi0gICAgIHdob3NlIGhvc3Qga2V5IGlzIG5vdCBrbm93biBvciBoYXMgY2hhbmdlZC4KLQotICAgICBXaGVuIHRoZSB1c2VyJ3MgaWRlbnRpdHkgaGFzIGJlZW4gYWNjZXB0ZWQgYnkgdGhlIHNlcnZlciwgdGhlIHNlcnZlcgotICAgICBlaXRoZXIgZXhlY3V0ZXMgdGhlIGdpdmVuIGNvbW1hbmQsIG9yIGxvZ3MgaW50byB0aGUgbWFjaGluZSBhbmQgZ2l2ZXMgdGhlCi0gICAgIHVzZXIgYSBub3JtYWwgc2hlbGwgb24gdGhlIHJlbW90ZSBtYWNoaW5lLiAgQWxsIGNvbW11bmljYXRpb24gd2l0aCB0aGUKLSAgICAgcmVtb3RlIGNvbW1hbmQgb3Igc2hlbGwgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGVuY3J5cHRlZC4KLQotICAgICBJZiBhIHBzZXVkby10ZXJtaW5hbCBoYXMgYmVlbiBhbGxvY2F0ZWQgKG5vcm1hbCBsb2dpbiBzZXNzaW9uKSwgdGhlIHVzZXIKLSAgICAgbWF5IHVzZSB0aGUgZXNjYXBlIGNoYXJhY3RlcnMgbm90ZWQgYmVsb3cuCi0KLSAgICAgSWYgbm8gcHNldWRvLXR0eSBoYXMgYmVlbiBhbGxvY2F0ZWQsIHRoZSBzZXNzaW9uIGlzIHRyYW5zcGFyZW50IGFuZCBjYW4KLSAgICAgYmUgdXNlZCB0byByZWxpYWJseSB0cmFuc2ZlciBiaW5hcnkgZGF0YS4gIE9uIG1vc3Qgc3lzdGVtcywgc2V0dGluZyB0aGUKLSAgICAgZXNjYXBlIGNoYXJhY3RlciB0byBgYG5vbmUnJyB3aWxsIGFsc28gbWFrZSB0aGUgc2Vzc2lvbiB0cmFuc3BhcmVudCBldmVuCi0gICAgIGlmIGEgdHR5IGlzIHVzZWQuCi0KLSAgICAgVGhlIHNlc3Npb24gdGVybWluYXRlcyB3aGVuIHRoZSBjb21tYW5kIG9yIHNoZWxsIG9uIHRoZSByZW1vdGUgbWFjaGluZQotICAgICBleGl0cyBhbmQgYWxsIFgxMSBhbmQgVENQIGNvbm5lY3Rpb25zIGhhdmUgYmVlbiBjbG9zZWQuCi0KLUVTQ0FQRSBDSEFSQUNURVJTCi0gICAgIFdoZW4gYSBwc2V1ZG8tdGVybWluYWwgaGFzIGJlZW4gcmVxdWVzdGVkLCBzc2ggc3VwcG9ydHMgYSBudW1iZXIgb2YKLSAgICAgZnVuY3Rpb25zIHRocm91Z2ggdGhlIHVzZSBvZiBhbiBlc2NhcGUgY2hhcmFjdGVyLgotCi0gICAgIEEgc2luZ2xlIHRpbGRlIGNoYXJhY3RlciBjYW4gYmUgc2VudCBhcyB+fiBvciBieSBmb2xsb3dpbmcgdGhlIHRpbGRlIGJ5IGEKLSAgICAgY2hhcmFjdGVyIG90aGVyIHRoYW4gdGhvc2UgZGVzY3JpYmVkIGJlbG93LiAgVGhlIGVzY2FwZSBjaGFyYWN0ZXIgbXVzdAotICAgICBhbHdheXMgZm9sbG93IGEgbmV3bGluZSB0byBiZSBpbnRlcnByZXRlZCBhcyBzcGVjaWFsLiAgVGhlIGVzY2FwZQotICAgICBjaGFyYWN0ZXIgY2FuIGJlIGNoYW5nZWQgaW4gY29uZmlndXJhdGlvbiBmaWxlcyB1c2luZyB0aGUgRXNjYXBlQ2hhcgotICAgICBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZSBvciBvbiB0aGUgY29tbWFuZCBsaW5lIGJ5IHRoZSAtZSBvcHRpb24uCi0KLSAgICAgVGhlIHN1cHBvcnRlZCBlc2NhcGVzIChhc3N1bWluZyB0aGUgZGVmYXVsdCBgficpIGFyZToKLQotICAgICB+LiAgICAgIERpc2Nvbm5lY3QuCi0KLSAgICAgfl5aICAgICBCYWNrZ3JvdW5kIHNzaC4KLQotICAgICB+IyAgICAgIExpc3QgZm9yd2FyZGVkIGNvbm5lY3Rpb25zLgotCi0gICAgIH4mICAgICAgQmFja2dyb3VuZCBzc2ggYXQgbG9nb3V0IHdoZW4gd2FpdGluZyBmb3IgZm9yd2FyZGVkIGNvbm5lY3Rpb24gLwotICAgICAgICAgICAgIFgxMSBzZXNzaW9ucyB0byB0ZXJtaW5hdGUuCi0KLSAgICAgfj8gICAgICBEaXNwbGF5IGEgbGlzdCBvZiBlc2NhcGUgY2hhcmFjdGVycy4KLQotICAgICB+QiAgICAgIFNlbmQgYSBCUkVBSyB0byB0aGUgcmVtb3RlIHN5c3RlbSAob25seSB1c2VmdWwgZm9yIFNTSCBwcm90b2NvbAotICAgICAgICAgICAgIHZlcnNpb24gMiBhbmQgaWYgdGhlIHBlZXIgc3VwcG9ydHMgaXQpLgotCi0gICAgIH5DICAgICAgT3BlbiBjb21tYW5kIGxpbmUuICBDdXJyZW50bHkgdGhpcyBhbGxvd3MgdGhlIGFkZGl0aW9uIG9mIHBvcnQKLSAgICAgICAgICAgICBmb3J3YXJkaW5ncyB1c2luZyB0aGUgLUwsIC1SIGFuZCAtRCBvcHRpb25zIChzZWUgYWJvdmUpLiAgSXQgYWxzbwotICAgICAgICAgICAgIGFsbG93cyB0aGUgY2FuY2VsbGF0aW9uIG9mIGV4aXN0aW5nIHJlbW90ZSBwb3J0LWZvcndhcmRpbmdzIHVzaW5nCi0gICAgICAgICAgICAgLUtSW2JpbmRfYWRkcmVzczpdcG9ydC4gICFjb21tYW5kIGFsbG93cyB0aGUgdXNlciB0byBleGVjdXRlIGEKLSAgICAgICAgICAgICBsb2NhbCBjb21tYW5kIGlmIHRoZSBQZXJtaXRMb2NhbENvbW1hbmQgb3B0aW9uIGlzIGVuYWJsZWQgaW4KLSAgICAgICAgICAgICBzc2hfY29uZmlnKDUpLiAgQmFzaWMgaGVscCBpcyBhdmFpbGFibGUsIHVzaW5nIHRoZSAtaCBvcHRpb24uCi0KLSAgICAgflIgICAgICBSZXF1ZXN0IHJla2V5aW5nIG9mIHRoZSBjb25uZWN0aW9uIChvbmx5IHVzZWZ1bCBmb3IgU1NIIHByb3RvY29sCi0gICAgICAgICAgICAgdmVyc2lvbiAyIGFuZCBpZiB0aGUgcGVlciBzdXBwb3J0cyBpdCkuCi0KLVRDUCBGT1JXQVJESU5HCi0gICAgIEZvcndhcmRpbmcgb2YgYXJiaXRyYXJ5IFRDUCBjb25uZWN0aW9ucyBvdmVyIHRoZSBzZWN1cmUgY2hhbm5lbCBjYW4gYmUKLSAgICAgc3BlY2lmaWVkIGVpdGhlciBvbiB0aGUgY29tbWFuZCBsaW5lIG9yIGluIGEgY29uZmlndXJhdGlvbiBmaWxlLiAgT25lCi0gICAgIHBvc3NpYmxlIGFwcGxpY2F0aW9uIG9mIFRDUCBmb3J3YXJkaW5nIGlzIGEgc2VjdXJlIGNvbm5lY3Rpb24gdG8gYSBtYWlsCi0gICAgIHNlcnZlcjsgYW5vdGhlciBpcyBnb2luZyB0aHJvdWdoIGZpcmV3YWxscy4KLQotICAgICBJbiB0aGUgZXhhbXBsZSBiZWxvdywgd2UgbG9vayBhdCBlbmNyeXB0aW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiBhbiBJUkMKLSAgICAgY2xpZW50IGFuZCBzZXJ2ZXIsIGV2ZW4gdGhvdWdoIHRoZSBJUkMgc2VydmVyIGRvZXMgbm90IGRpcmVjdGx5IHN1cHBvcnQKLSAgICAgZW5jcnlwdGVkIGNvbW11bmljYXRpb25zLiAgVGhpcyB3b3JrcyBhcyBmb2xsb3dzOiB0aGUgdXNlciBjb25uZWN0cyB0bwotICAgICB0aGUgcmVtb3RlIGhvc3QgdXNpbmcgc3NoLCBzcGVjaWZ5aW5nIGEgcG9ydCB0byBiZSB1c2VkIHRvIGZvcndhcmQKLSAgICAgY29ubmVjdGlvbnMgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIuICBBZnRlciB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHN0YXJ0IHRoZQotICAgICBzZXJ2aWNlIHdoaWNoIGlzIHRvIGJlIGVuY3J5cHRlZCBvbiB0aGUgY2xpZW50IG1hY2hpbmUsIGNvbm5lY3RpbmcgdG8gdGhlCi0gICAgIHNhbWUgbG9jYWwgcG9ydCwgYW5kIHNzaCB3aWxsIGVuY3J5cHQgYW5kIGZvcndhcmQgdGhlIGNvbm5lY3Rpb24uCi0KLSAgICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHR1bm5lbHMgYW4gSVJDIHNlc3Npb24gZnJvbSBjbGllbnQgbWFjaGluZQotICAgICBgYDEyNy4wLjAuMScnIChsb2NhbGhvc3QpIHRvIHJlbW90ZSBzZXJ2ZXIgYGBzZXJ2ZXIuZXhhbXBsZS5jb20nJzoKLQotICAgICAgICAgJCBzc2ggLWYgLUwgMTIzNDpsb2NhbGhvc3Q6NjY2NyBzZXJ2ZXIuZXhhbXBsZS5jb20gc2xlZXAgMTAKLSAgICAgICAgICQgaXJjIC1jICcjdXNlcnMnIC1wIDEyMzQgcGlua3kgMTI3LjAuMC4xCi0KLSAgICAgVGhpcyB0dW5uZWxzIGEgY29ubmVjdGlvbiB0byBJUkMgc2VydmVyIGBgc2VydmVyLmV4YW1wbGUuY29tJycsIGpvaW5pbmcKLSAgICAgY2hhbm5lbCBgYCN1c2VycycnLCBuaWNrbmFtZSBgYHBpbmt5JycsIHVzaW5nIHBvcnQgMTIzNC4gIEl0IGRvZXNuJ3QKLSAgICAgbWF0dGVyIHdoaWNoIHBvcnQgaXMgdXNlZCwgYXMgbG9uZyBhcyBpdCdzIGdyZWF0ZXIgdGhhbiAxMDIzIChyZW1lbWJlciwKLSAgICAgb25seSByb290IGNhbiBvcGVuIHNvY2tldHMgb24gcHJpdmlsZWdlZCBwb3J0cykgYW5kIGRvZXNuJ3QgY29uZmxpY3Qgd2l0aAotICAgICBhbnkgcG9ydHMgYWxyZWFkeSBpbiB1c2UuICBUaGUgY29ubmVjdGlvbiBpcyBmb3J3YXJkZWQgdG8gcG9ydCA2NjY3IG9uCi0gICAgIHRoZSByZW1vdGUgc2VydmVyLCBzaW5jZSB0aGF0J3MgdGhlIHN0YW5kYXJkIHBvcnQgZm9yIElSQyBzZXJ2aWNlcy4KLQotICAgICBUaGUgLWYgb3B0aW9uIGJhY2tncm91bmRzIHNzaCBhbmQgdGhlIHJlbW90ZSBjb21tYW5kIGBgc2xlZXAgMTAnJyBpcwotICAgICBzcGVjaWZpZWQgdG8gYWxsb3cgYW4gYW1vdW50IG9mIHRpbWUgKDEwIHNlY29uZHMsIGluIHRoZSBleGFtcGxlKSB0bwotICAgICBzdGFydCB0aGUgc2VydmljZSB3aGljaCBpcyB0byBiZSB0dW5uZWxsZWQuICBJZiBubyBjb25uZWN0aW9ucyBhcmUgbWFkZQotICAgICB3aXRoaW4gdGhlIHRpbWUgc3BlY2lmaWVkLCBzc2ggd2lsbCBleGl0LgotCi1YMTEgRk9SV0FSRElORwotICAgICBJZiB0aGUgRm9yd2FyZFgxMSB2YXJpYWJsZSBpcyBzZXQgdG8gYGB5ZXMnJyAob3Igc2VlIHRoZSBkZXNjcmlwdGlvbiBvZgotICAgICB0aGUgLVgsIC14LCBhbmQgLVkgb3B0aW9ucyBhYm92ZSkgYW5kIHRoZSB1c2VyIGlzIHVzaW5nIFgxMSAodGhlIERJU1BMQVkKLSAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0KSwgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIFgxMSBkaXNwbGF5IGlzCi0gICAgIGF1dG9tYXRpY2FsbHkgZm9yd2FyZGVkIHRvIHRoZSByZW1vdGUgc2lkZSBpbiBzdWNoIGEgd2F5IHRoYXQgYW55IFgxMQotICAgICBwcm9ncmFtcyBzdGFydGVkIGZyb20gdGhlIHNoZWxsIChvciBjb21tYW5kKSB3aWxsIGdvIHRocm91Z2ggdGhlCi0gICAgIGVuY3J5cHRlZCBjaGFubmVsLCBhbmQgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHJlYWwgWCBzZXJ2ZXIgd2lsbCBiZSBtYWRlCi0gICAgIGZyb20gdGhlIGxvY2FsIG1hY2hpbmUuICBUaGUgdXNlciBzaG91bGQgbm90IG1hbnVhbGx5IHNldCBESVNQTEFZLgotICAgICBGb3J3YXJkaW5nIG9mIFgxMSBjb25uZWN0aW9ucyBjYW4gYmUgY29uZmlndXJlZCBvbiB0aGUgY29tbWFuZCBsaW5lIG9yIGluCi0gICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgVGhlIERJU1BMQVkgdmFsdWUgc2V0IGJ5IHNzaCB3aWxsIHBvaW50IHRvIHRoZSBzZXJ2ZXIgbWFjaGluZSwgYnV0IHdpdGggYQotICAgICBkaXNwbGF5IG51bWJlciBncmVhdGVyIHRoYW4gemVyby4gIFRoaXMgaXMgbm9ybWFsLCBhbmQgaGFwcGVucyBiZWNhdXNlCi0gICAgIHNzaCBjcmVhdGVzIGEgYGBwcm94eScnIFggc2VydmVyIG9uIHRoZSBzZXJ2ZXIgbWFjaGluZSBmb3IgZm9yd2FyZGluZyB0aGUKLSAgICAgY29ubmVjdGlvbnMgb3ZlciB0aGUgZW5jcnlwdGVkIGNoYW5uZWwuCi0KLSAgICAgc3NoIHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHNldCB1cCBYYXV0aG9yaXR5IGRhdGEgb24gdGhlIHNlcnZlciBtYWNoaW5lLgotICAgICBGb3IgdGhpcyBwdXJwb3NlLCBpdCB3aWxsIGdlbmVyYXRlIGEgcmFuZG9tIGF1dGhvcml6YXRpb24gY29va2llLCBzdG9yZQotICAgICBpdCBpbiBYYXV0aG9yaXR5IG9uIHRoZSBzZXJ2ZXIsIGFuZCB2ZXJpZnkgdGhhdCBhbnkgZm9yd2FyZGVkIGNvbm5lY3Rpb25zCi0gICAgIGNhcnJ5IHRoaXMgY29va2llIGFuZCByZXBsYWNlIGl0IGJ5IHRoZSByZWFsIGNvb2tpZSB3aGVuIHRoZSBjb25uZWN0aW9uCi0gICAgIGlzIG9wZW5lZC4gIFRoZSByZWFsIGF1dGhlbnRpY2F0aW9uIGNvb2tpZSBpcyBuZXZlciBzZW50IHRvIHRoZSBzZXJ2ZXIKLSAgICAgbWFjaGluZSAoYW5kIG5vIGNvb2tpZXMgYXJlIHNlbnQgaW4gdGhlIHBsYWluKS4KLQotICAgICBJZiB0aGUgRm9yd2FyZEFnZW50IHZhcmlhYmxlIGlzIHNldCB0byBgYHllcycnIChvciBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mCi0gICAgIHRoZSAtQSBhbmQgLWEgb3B0aW9ucyBhYm92ZSkgYW5kIHRoZSB1c2VyIGlzIHVzaW5nIGFuIGF1dGhlbnRpY2F0aW9uCi0gICAgIGFnZW50LCB0aGUgY29ubmVjdGlvbiB0byB0aGUgYWdlbnQgaXMgYXV0b21hdGljYWxseSBmb3J3YXJkZWQgdG8gdGhlCi0gICAgIHJlbW90ZSBzaWRlLgotCi1WRVJJRllJTkcgSE9TVCBLRVlTCi0gICAgIFdoZW4gY29ubmVjdGluZyB0byBhIHNlcnZlciBmb3IgdGhlIGZpcnN0IHRpbWUsIGEgZmluZ2VycHJpbnQgb2YgdGhlCi0gICAgIHNlcnZlcidzIHB1YmxpYyBrZXkgaXMgcHJlc2VudGVkIHRvIHRoZSB1c2VyICh1bmxlc3MgdGhlIG9wdGlvbgotICAgICBTdHJpY3RIb3N0S2V5Q2hlY2tpbmcgaGFzIGJlZW4gZGlzYWJsZWQpLiAgRmluZ2VycHJpbnRzIGNhbiBiZSBkZXRlcm1pbmVkCi0gICAgIHVzaW5nIHNzaC1rZXlnZW4oMSk6Ci0KLSAgICAgICAgICAgJCBzc2gta2V5Z2VuIC1sIC1mIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkKLQotICAgICBJZiB0aGUgZmluZ2VycHJpbnQgaXMgYWxyZWFkeSBrbm93biwgaXQgY2FuIGJlIG1hdGNoZWQgYW5kIHRoZSBrZXkgY2FuIGJlCi0gICAgIGFjY2VwdGVkIG9yIHJlamVjdGVkLiAgQmVjYXVzZSBvZiB0aGUgZGlmZmljdWx0eSBvZiBjb21wYXJpbmcgaG9zdCBrZXlzCi0gICAgIGp1c3QgYnkgbG9va2luZyBhdCBoZXggc3RyaW5ncywgdGhlcmUgaXMgYWxzbyBzdXBwb3J0IHRvIGNvbXBhcmUgaG9zdAotICAgICBrZXlzIHZpc3VhbGx5LCB1c2luZyByYW5kb20gYXJ0LiAgQnkgc2V0dGluZyB0aGUgVmlzdWFsSG9zdEtleSBvcHRpb24gdG8KLSAgICAgYGB5ZXMnJywgYSBzbWFsbCBBU0NJSSBncmFwaGljIGdldHMgZGlzcGxheWVkIG9uIGV2ZXJ5IGxvZ2luIHRvIGEgc2VydmVyLAotICAgICBubyBtYXR0ZXIgaWYgdGhlIHNlc3Npb24gaXRzZWxmIGlzIGludGVyYWN0aXZlIG9yIG5vdC4gIEJ5IGxlYXJuaW5nIHRoZQotICAgICBwYXR0ZXJuIGEga25vd24gc2VydmVyIHByb2R1Y2VzLCBhIHVzZXIgY2FuIGVhc2lseSBmaW5kIG91dCB0aGF0IHRoZSBob3N0Ci0gICAgIGtleSBoYXMgY2hhbmdlZCB3aGVuIGEgY29tcGxldGVseSBkaWZmZXJlbnQgcGF0dGVybiBpcyBkaXNwbGF5ZWQuCi0gICAgIEJlY2F1c2UgdGhlc2UgcGF0dGVybnMgYXJlIG5vdCB1bmFtYmlndW91cyBob3dldmVyLCBhIHBhdHRlcm4gdGhhdCBsb29rcwotICAgICBzaW1pbGFyIHRvIHRoZSBwYXR0ZXJuIHJlbWVtYmVyZWQgb25seSBnaXZlcyBhIGdvb2QgcHJvYmFiaWxpdHkgdGhhdCB0aGUKLSAgICAgaG9zdCBrZXkgaXMgdGhlIHNhbWUsIG5vdCBndWFyYW50ZWVkIHByb29mLgotCi0gICAgIFRvIGdldCBhIGxpc3Rpbmcgb2YgdGhlIGZpbmdlcnByaW50cyBhbG9uZyB3aXRoIHRoZWlyIHJhbmRvbSBhcnQgZm9yIGFsbAotICAgICBrbm93biBob3N0cywgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgY2FuIGJlIHVzZWQ6Ci0KLSAgICAgICAgICAgJCBzc2gta2V5Z2VuIC1sdiAtZiB+Ly5zc2gva25vd25faG9zdHMKLQotICAgICBJZiB0aGUgZmluZ2VycHJpbnQgaXMgdW5rbm93biwgYW4gYWx0ZXJuYXRpdmUgbWV0aG9kIG9mIHZlcmlmaWNhdGlvbiBpcwotICAgICBhdmFpbGFibGU6IFNTSCBmaW5nZXJwcmludHMgdmVyaWZpZWQgYnkgRE5TLiAgQW4gYWRkaXRpb25hbCByZXNvdXJjZQotICAgICByZWNvcmQgKFJSKSwgU1NIRlAsIGlzIGFkZGVkIHRvIGEgem9uZWZpbGUgYW5kIHRoZSBjb25uZWN0aW5nIGNsaWVudCBpcwotICAgICBhYmxlIHRvIG1hdGNoIHRoZSBmaW5nZXJwcmludCB3aXRoIHRoYXQgb2YgdGhlIGtleSBwcmVzZW50ZWQuCi0KLSAgICAgSW4gdGhpcyBleGFtcGxlLCB3ZSBhcmUgY29ubmVjdGluZyBhIGNsaWVudCB0byBhIHNlcnZlciwKLSAgICAgYGBob3N0LmV4YW1wbGUuY29tJycuICBUaGUgU1NIRlAgcmVzb3VyY2UgcmVjb3JkcyBzaG91bGQgZmlyc3QgYmUgYWRkZWQKLSAgICAgdG8gdGhlIHpvbmVmaWxlIGZvciBob3N0LmV4YW1wbGUuY29tOgotCi0gICAgICAgICAgICQgc3NoLWtleWdlbiAtciBob3N0LmV4YW1wbGUuY29tLgotCi0gICAgIFRoZSBvdXRwdXQgbGluZXMgd2lsbCBoYXZlIHRvIGJlIGFkZGVkIHRvIHRoZSB6b25lZmlsZS4gIFRvIGNoZWNrIHRoYXQKLSAgICAgdGhlIHpvbmUgaXMgYW5zd2VyaW5nIGZpbmdlcnByaW50IHF1ZXJpZXM6Ci0KLSAgICAgICAgICAgJCBkaWcgLXQgU1NIRlAgaG9zdC5leGFtcGxlLmNvbQotCi0gICAgIEZpbmFsbHkgdGhlIGNsaWVudCBjb25uZWN0czoKLQotICAgICAgICAgICAkIHNzaCAtbyAiVmVyaWZ5SG9zdEtleUROUyBhc2siIGhvc3QuZXhhbXBsZS5jb20KLSAgICAgICAgICAgWy4uLl0KLSAgICAgICAgICAgTWF0Y2hpbmcgaG9zdCBrZXkgZmluZ2VycHJpbnQgZm91bmQgaW4gRE5TLgotICAgICAgICAgICBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWUgY29ubmVjdGluZyAoeWVzL25vKT8KLQotICAgICBTZWUgdGhlIFZlcmlmeUhvc3RLZXlETlMgb3B0aW9uIGluIHNzaF9jb25maWcoNSkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLVNTSC1CQVNFRCBWSVJUVUFMIFBSSVZBVEUgTkVUV09SS1MKLSAgICAgc3NoIGNvbnRhaW5zIHN1cHBvcnQgZm9yIFZpcnR1YWwgUHJpdmF0ZSBOZXR3b3JrIChWUE4pIHR1bm5lbGxpbmcgdXNpbmcKLSAgICAgdGhlIHR1big0KSBuZXR3b3JrIHBzZXVkby1kZXZpY2UsIGFsbG93aW5nIHR3byBuZXR3b3JrcyB0byBiZSBqb2luZWQKLSAgICAgc2VjdXJlbHkuICBUaGUgc3NoZF9jb25maWcoNSkgY29uZmlndXJhdGlvbiBvcHRpb24gUGVybWl0VHVubmVsIGNvbnRyb2xzCi0gICAgIHdoZXRoZXIgdGhlIHNlcnZlciBzdXBwb3J0cyB0aGlzLCBhbmQgYXQgd2hhdCBsZXZlbCAobGF5ZXIgMiBvciAzCi0gICAgIHRyYWZmaWMpLgotCi0gICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3b3VsZCBjb25uZWN0IGNsaWVudCBuZXR3b3JrIDEwLjAuNTAuMC8yNCB3aXRoCi0gICAgIHJlbW90ZSBuZXR3b3JrIDEwLjAuOTkuMC8yNCB1c2luZyBhIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb24gZnJvbQotICAgICAxMC4xLjEuMSB0byAxMC4xLjEuMiwgcHJvdmlkZWQgdGhhdCB0aGUgU1NIIHNlcnZlciBydW5uaW5nIG9uIHRoZSBnYXRld2F5Ci0gICAgIHRvIHRoZSByZW1vdGUgbmV0d29yaywgYXQgMTkyLjE2OC4xLjE1LCBhbGxvd3MgaXQuCi0KLSAgICAgT24gdGhlIGNsaWVudDoKLQotICAgICAgICAgICAjIHNzaCAtZiAtdyAwOjEgMTkyLjE2OC4xLjE1IHRydWUKLSAgICAgICAgICAgIyBpZmNvbmZpZyB0dW4wIDEwLjEuMS4xIDEwLjEuMS4yIG5ldG1hc2sgMjU1LjI1NS4yNTUuMjUyCi0gICAgICAgICAgICMgcm91dGUgYWRkIDEwLjAuOTkuMC8yNCAxMC4xLjEuMgotCi0gICAgIE9uIHRoZSBzZXJ2ZXI6Ci0KLSAgICAgICAgICAgIyBpZmNvbmZpZyB0dW4xIDEwLjEuMS4yIDEwLjEuMS4xIG5ldG1hc2sgMjU1LjI1NS4yNTUuMjUyCi0gICAgICAgICAgICMgcm91dGUgYWRkIDEwLjAuNTAuMC8yNCAxMC4xLjEuMQotCi0gICAgIENsaWVudCBhY2Nlc3MgbWF5IGJlIG1vcmUgZmluZWx5IHR1bmVkIHZpYSB0aGUgL3Jvb3QvLnNzaC9hdXRob3JpemVkX2tleXMKLSAgICAgZmlsZSAoc2VlIGJlbG93KSBhbmQgdGhlIFBlcm1pdFJvb3RMb2dpbiBzZXJ2ZXIgb3B0aW9uLiAgVGhlIGZvbGxvd2luZwotICAgICBlbnRyeSB3b3VsZCBwZXJtaXQgY29ubmVjdGlvbnMgb24gdHVuKDQpIGRldmljZSAxIGZyb20gdXNlciBgYGphbmUnJyBhbmQKLSAgICAgb24gdHVuIGRldmljZSAyIGZyb20gdXNlciBgYGpvaG4nJywgaWYgUGVybWl0Um9vdExvZ2luIGlzIHNldCB0bwotICAgICBgYGZvcmNlZC1jb21tYW5kcy1vbmx5Jyc6Ci0KLSAgICAgICB0dW5uZWw9IjEiLGNvbW1hbmQ9InNoIC9ldGMvbmV0c3RhcnQgdHVuMSIgc3NoLXJzYSAuLi4gamFuZQotICAgICAgIHR1bm5lbD0iMiIsY29tbWFuZD0ic2ggL2V0Yy9uZXRzdGFydCB0dW4yIiBzc2gtcnNhIC4uLiBqb2huCi0KLSAgICAgU2luY2UgYW4gU1NILWJhc2VkIHNldHVwIGVudGFpbHMgYSBmYWlyIGFtb3VudCBvZiBvdmVyaGVhZCwgaXQgbWF5IGJlCi0gICAgIG1vcmUgc3VpdGVkIHRvIHRlbXBvcmFyeSBzZXR1cHMsIHN1Y2ggYXMgZm9yIHdpcmVsZXNzIFZQTnMuICBNb3JlCi0gICAgIHBlcm1hbmVudCBWUE5zIGFyZSBiZXR0ZXIgcHJvdmlkZWQgYnkgdG9vbHMgc3VjaCBhcyBpcHNlY2N0bCg4KSBhbmQKLSAgICAgaXNha21wZCg4KS4KLQotRU5WSVJPTk1FTlQKLSAgICAgc3NoIHdpbGwgbm9ybWFsbHkgc2V0IHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOgotCi0gICAgIERJU1BMQVkgICAgICAgICAgICAgICBUaGUgRElTUExBWSB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhlIGxvY2F0aW9uIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgWDExIHNlcnZlci4gIEl0IGlzIGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHNzaCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgdG8gYSB2YWx1ZSBvZiB0aGUgZm9ybSBgYGhvc3RuYW1lOm4nJywgd2hlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgaG9zdG5hbWUnJyBpbmRpY2F0ZXMgdGhlIGhvc3Qgd2hlcmUgdGhlIHNoZWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBydW5zLCBhbmQgYG4nIGlzIGFuIGludGVnZXIgPj0gMS4gIHNzaCB1c2VzIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgdmFsdWUgdG8gZm9yd2FyZCBYMTEgY29ubmVjdGlvbnMgb3ZlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZSBjaGFubmVsLiAgVGhlIHVzZXIgc2hvdWxkIG5vcm1hbGx5IG5vdCBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU1BMQVkgZXhwbGljaXRseSwgYXMgdGhhdCB3aWxsIHJlbmRlciB0aGUgWDExCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGluc2VjdXJlIChhbmQgd2lsbCByZXF1aXJlIHRoZSB1c2VyIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51YWxseSBjb3B5IGFueSByZXF1aXJlZCBhdXRob3JpemF0aW9uIGNvb2tpZXMpLgotCi0gICAgIEhPTUUgICAgICAgICAgICAgICAgICBTZXQgdG8gdGhlIHBhdGggb2YgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4KLQotICAgICBMT0dOQU1FICAgICAgICAgICAgICAgU3lub255bSBmb3IgVVNFUjsgc2V0IGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbXMgdGhhdCB1c2UgdGhpcyB2YXJpYWJsZS4KLQotICAgICBNQUlMICAgICAgICAgICAgICAgICAgU2V0IHRvIHRoZSBwYXRoIG9mIHRoZSB1c2VyJ3MgbWFpbGJveC4KLQotICAgICBQQVRIICAgICAgICAgICAgICAgICAgU2V0IHRvIHRoZSBkZWZhdWx0IFBBVEgsIGFzIHNwZWNpZmllZCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxpbmcgc3NoLgotCi0gICAgIFNTSF9BU0tQQVNTICAgICAgICAgICBJZiBzc2ggbmVlZHMgYSBwYXNzcGhyYXNlLCBpdCB3aWxsIHJlYWQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzcGhyYXNlIGZyb20gdGhlIGN1cnJlbnQgdGVybWluYWwgaWYgaXQgd2FzIHJ1bgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBhIHRlcm1pbmFsLiAgSWYgc3NoIGRvZXMgbm90IGhhdmUgYSB0ZXJtaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGl0IGJ1dCBESVNQTEFZIGFuZCBTU0hfQVNLUEFTUyBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwgaXQgd2lsbCBleGVjdXRlIHRoZSBwcm9ncmFtIHNwZWNpZmllZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NIX0FTS1BBU1MgYW5kIG9wZW4gYW4gWDExIHdpbmRvdyB0byByZWFkIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3BocmFzZS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIHNzaCBmcm9tIGEgLnhzZXNzaW9uIG9yIHJlbGF0ZWQgc2NyaXB0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vdGUgdGhhdCBvbiBzb21lIG1hY2hpbmVzIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0IHRoZSBpbnB1dCBmcm9tIC9kZXYvbnVsbCB0byBtYWtlIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsuKQotCi0gICAgIFNTSF9BVVRIX1NPQ0sgICAgICAgICBJZGVudGlmaWVzIHRoZSBwYXRoIG9mIGEgVU5JWC1kb21haW4gc29ja2V0IHVzZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW11bmljYXRlIHdpdGggdGhlIGFnZW50LgotCi0gICAgIFNTSF9DT05ORUNUSU9OICAgICAgICBJZGVudGlmaWVzIHRoZSBjbGllbnQgYW5kIHNlcnZlciBlbmRzIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi4gIFRoZSB2YXJpYWJsZSBjb250YWlucyBmb3VyIHNwYWNlLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdGVkIHZhbHVlczogY2xpZW50IElQIGFkZHJlc3MsIGNsaWVudCBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIsIHNlcnZlciBJUCBhZGRyZXNzLCBhbmQgc2VydmVyIHBvcnQgbnVtYmVyLgotCi0gICAgIFNTSF9PUklHSU5BTF9DT01NQU5EICBUaGlzIHZhcmlhYmxlIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCBjb21tYW5kIGxpbmUgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgZm9yY2VkIGNvbW1hbmQgaXMgZXhlY3V0ZWQuICBJdCBjYW4gYmUgdXNlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdCB0aGUgb3JpZ2luYWwgYXJndW1lbnRzLgotCi0gICAgIFNTSF9UVFkgICAgICAgICAgICAgICBUaGlzIGlzIHNldCB0byB0aGUgbmFtZSBvZiB0aGUgdHR5IChwYXRoIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2hlbGwgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQuICBJZiB0aGUgY3VycmVudCBzZXNzaW9uIGhhcyBubyB0dHksIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIGlzIG5vdCBzZXQuCi0KLSAgICAgVFogICAgICAgICAgICAgICAgICAgIFRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIGluZGljYXRlIHRoZSBwcmVzZW50IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvbmUgaWYgaXQgd2FzIHNldCB3aGVuIHRoZSBkYWVtb24gd2FzIHN0YXJ0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIHRoZSBkYWVtb24gcGFzc2VzIHRoZSB2YWx1ZSBvbiB0byBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zKS4KLQotICAgICBVU0VSICAgICAgICAgICAgICAgICAgU2V0IHRvIHRoZSBuYW1lIG9mIHRoZSB1c2VyIGxvZ2dpbmcgaW4uCi0KLSAgICAgQWRkaXRpb25hbGx5LCBzc2ggcmVhZHMgfi8uc3NoL2Vudmlyb25tZW50LCBhbmQgYWRkcyBsaW5lcyBvZiB0aGUgZm9ybWF0Ci0gICAgIGBgVkFSTkFNRT12YWx1ZScnIHRvIHRoZSBlbnZpcm9ubWVudCBpZiB0aGUgZmlsZSBleGlzdHMgYW5kIHVzZXJzIGFyZQotICAgICBhbGxvd2VkIHRvIGNoYW5nZSB0aGVpciBlbnZpcm9ubWVudC4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlCi0gICAgIFBlcm1pdFVzZXJFbnZpcm9ubWVudCBvcHRpb24gaW4gc3NoZF9jb25maWcoNSkuCi0KLUZJTEVTCi0gICAgIH4vLnJob3N0cwotICAgICAgICAgICAgIFRoaXMgZmlsZSBpcyB1c2VkIGZvciBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIChzZWUgYWJvdmUpLiAgT24KLSAgICAgICAgICAgICBzb21lIG1hY2hpbmVzIHRoaXMgZmlsZSBtYXkgbmVlZCB0byBiZSB3b3JsZC1yZWFkYWJsZSBpZiB0aGUKLSAgICAgICAgICAgICB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgaXMgb24gYW4gTkZTIHBhcnRpdGlvbiwgYmVjYXVzZSBzc2hkKDgpCi0gICAgICAgICAgICAgcmVhZHMgaXQgYXMgcm9vdC4gIEFkZGl0aW9uYWxseSwgdGhpcyBmaWxlIG11c3QgYmUgb3duZWQgYnkgdGhlCi0gICAgICAgICAgICAgdXNlciwgYW5kIG11c3Qgbm90IGhhdmUgd3JpdGUgcGVybWlzc2lvbnMgZm9yIGFueW9uZSBlbHNlLiAgVGhlCi0gICAgICAgICAgICAgcmVjb21tZW5kZWQgcGVybWlzc2lvbiBmb3IgbW9zdCBtYWNoaW5lcyBpcyByZWFkL3dyaXRlIGZvciB0aGUKLSAgICAgICAgICAgICB1c2VyLCBhbmQgbm90IGFjY2Vzc2libGUgYnkgb3RoZXJzLgotCi0gICAgIH4vLnNob3N0cwotICAgICAgICAgICAgIFRoaXMgZmlsZSBpcyB1c2VkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIC5yaG9zdHMsIGJ1dCBhbGxvd3MKLSAgICAgICAgICAgICBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIHdpdGhvdXQgcGVybWl0dGluZyBsb2dpbiB3aXRoCi0gICAgICAgICAgICAgcmxvZ2luL3JzaC4KLQotICAgICB+Ly5zc2gvCi0gICAgICAgICAgICAgVGhpcyBkaXJlY3RvcnkgaXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gZm9yIGFsbCB1c2VyLXNwZWNpZmljCi0gICAgICAgICAgICAgY29uZmlndXJhdGlvbiBhbmQgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uICBUaGVyZSBpcyBubwotICAgICAgICAgICAgIGdlbmVyYWwgcmVxdWlyZW1lbnQgdG8ga2VlcCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoaXMgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgc2VjcmV0LCBidXQgdGhlIHJlY29tbWVuZGVkIHBlcm1pc3Npb25zIGFyZSByZWFkL3dyaXRlL2V4ZWN1dGUKLSAgICAgICAgICAgICBmb3IgdGhlIHVzZXIsIGFuZCBub3QgYWNjZXNzaWJsZSBieSBvdGhlcnMuCi0KLSAgICAgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cwotICAgICAgICAgICAgIExpc3RzIHRoZSBwdWJsaWMga2V5cyAoRFNBL0VDRFNBL1JTQSkgdGhhdCBjYW4gYmUgdXNlZCBmb3IKLSAgICAgICAgICAgICBsb2dnaW5nIGluIGFzIHRoaXMgdXNlci4gIFRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIGRlc2NyaWJlZCBpbgotICAgICAgICAgICAgIHRoZSBzc2hkKDgpIG1hbnVhbCBwYWdlLiAgVGhpcyBmaWxlIGlzIG5vdCBoaWdobHkgc2Vuc2l0aXZlLCBidXQKLSAgICAgICAgICAgICB0aGUgcmVjb21tZW5kZWQgcGVybWlzc2lvbnMgYXJlIHJlYWQvd3JpdGUgZm9yIHRoZSB1c2VyLCBhbmQgbm90Ci0gICAgICAgICAgICAgYWNjZXNzaWJsZSBieSBvdGhlcnMuCi0KLSAgICAgfi8uc3NoL2NvbmZpZwotICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHBlci11c2VyIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZSBmaWxlIGZvcm1hdCBhbmQKLSAgICAgICAgICAgICBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGRlc2NyaWJlZCBpbiBzc2hfY29uZmlnKDUpLiAgQmVjYXVzZSBvZgotICAgICAgICAgICAgIHRoZSBwb3RlbnRpYWwgZm9yIGFidXNlLCB0aGlzIGZpbGUgbXVzdCBoYXZlIHN0cmljdCBwZXJtaXNzaW9uczoKLSAgICAgICAgICAgICByZWFkL3dyaXRlIGZvciB0aGUgdXNlciwgYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KLQotICAgICB+Ly5zc2gvZW52aXJvbm1lbnQKLSAgICAgICAgICAgICBDb250YWlucyBhZGRpdGlvbmFsIGRlZmluaXRpb25zIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXM7IHNlZQotICAgICAgICAgICAgIEVOVklST05NRU5ULCBhYm92ZS4KLQotICAgICB+Ly5zc2gvaWRlbnRpdHkKLSAgICAgfi8uc3NoL2lkX2RzYQotICAgICB+Ly5zc2gvaWRfZWNkc2EKLSAgICAgfi8uc3NoL2lkX3JzYQotICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBwcml2YXRlIGtleSBmb3IgYXV0aGVudGljYXRpb24uICBUaGVzZSBmaWxlcyBjb250YWluCi0gICAgICAgICAgICAgc2Vuc2l0aXZlIGRhdGEgYW5kIHNob3VsZCBiZSByZWFkYWJsZSBieSB0aGUgdXNlciBidXQgbm90Ci0gICAgICAgICAgICAgYWNjZXNzaWJsZSBieSBvdGhlcnMgKHJlYWQvd3JpdGUvZXhlY3V0ZSkuICBzc2ggd2lsbCBzaW1wbHkKLSAgICAgICAgICAgICBpZ25vcmUgYSBwcml2YXRlIGtleSBmaWxlIGlmIGl0IGlzIGFjY2Vzc2libGUgYnkgb3RoZXJzLiAgSXQgaXMKLSAgICAgICAgICAgICBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgcGFzc3BocmFzZSB3aGVuIGdlbmVyYXRpbmcgdGhlIGtleSB3aGljaAotICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCB0byBlbmNyeXB0IHRoZSBzZW5zaXRpdmUgcGFydCBvZiB0aGlzIGZpbGUgdXNpbmcKLSAgICAgICAgICAgICAzREVTLgotCi0gICAgIH4vLnNzaC9pZGVudGl0eS5wdWIKLSAgICAgfi8uc3NoL2lkX2RzYS5wdWIKLSAgICAgfi8uc3NoL2lkX2VjZHNhLnB1YgotICAgICB+Ly5zc2gvaWRfcnNhLnB1YgotICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBwdWJsaWMga2V5IGZvciBhdXRoZW50aWNhdGlvbi4gIFRoZXNlIGZpbGVzIGFyZSBub3QKLSAgICAgICAgICAgICBzZW5zaXRpdmUgYW5kIGNhbiAoYnV0IG5lZWQgbm90KSBiZSByZWFkYWJsZSBieSBhbnlvbmUuCi0KLSAgICAgfi8uc3NoL2tub3duX2hvc3RzCi0gICAgICAgICAgICAgQ29udGFpbnMgYSBsaXN0IG9mIGhvc3Qga2V5cyBmb3IgYWxsIGhvc3RzIHRoZSB1c2VyIGhhcyBsb2dnZWQKLSAgICAgICAgICAgICBpbnRvIHRoYXQgYXJlIG5vdCBhbHJlYWR5IGluIHRoZSBzeXN0ZW13aWRlIGxpc3Qgb2Yga25vd24gaG9zdAotICAgICAgICAgICAgIGtleXMuICBTZWUgc3NoZCg4KSBmb3IgZnVydGhlciBkZXRhaWxzIG9mIHRoZSBmb3JtYXQgb2YgdGhpcwotICAgICAgICAgICAgIGZpbGUuCi0KLSAgICAgfi8uc3NoL3JjCi0gICAgICAgICAgICAgQ29tbWFuZHMgaW4gdGhpcyBmaWxlIGFyZSBleGVjdXRlZCBieSBzc2ggd2hlbiB0aGUgdXNlciBsb2dzIGluLAotICAgICAgICAgICAgIGp1c3QgYmVmb3JlIHRoZSB1c2VyJ3Mgc2hlbGwgKG9yIGNvbW1hbmQpIGlzIHN0YXJ0ZWQuICBTZWUgdGhlCi0gICAgICAgICAgICAgc3NoZCg4KSBtYW51YWwgcGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgICAvZXRjL2hvc3RzLmVxdWl2Ci0gICAgICAgICAgICAgVGhpcyBmaWxlIGlzIGZvciBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIChzZWUgYWJvdmUpLiAgSXQKLSAgICAgICAgICAgICBzaG91bGQgb25seSBiZSB3cml0YWJsZSBieSByb290LgotCi0gICAgIC9ldGMvc2hvc3RzLmVxdWl2Ci0gICAgICAgICAgICAgVGhpcyBmaWxlIGlzIHVzZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgaG9zdHMuZXF1aXYsIGJ1dAotICAgICAgICAgICAgIGFsbG93cyBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIHdpdGhvdXQgcGVybWl0dGluZyBsb2dpbiB3aXRoCi0gICAgICAgICAgICAgcmxvZ2luL3JzaC4KLQotICAgICAvZXRjL3NzaC9zc2hfY29uZmlnCi0gICAgICAgICAgICAgU3lzdGVtd2lkZSBjb25maWd1cmF0aW9uIGZpbGUuICBUaGUgZmlsZSBmb3JtYXQgYW5kIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICBvcHRpb25zIGFyZSBkZXNjcmliZWQgaW4gc3NoX2NvbmZpZyg1KS4KLQotICAgICAvZXRjL3NzaC9zc2hfaG9zdF9rZXkKLSAgICAgL2V0Yy9zc2gvc3NoX2hvc3RfZHNhX2tleQotICAgICAvZXRjL3NzaC9zc2hfaG9zdF9lY2RzYV9rZXkKLSAgICAgL2V0Yy9zc2gvc3NoX2hvc3RfcnNhX2tleQotICAgICAgICAgICAgIFRoZXNlIHRocmVlIGZpbGVzIGNvbnRhaW4gdGhlIHByaXZhdGUgcGFydHMgb2YgdGhlIGhvc3Qga2V5cyBhbmQKLSAgICAgICAgICAgICBhcmUgdXNlZCBmb3IgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbi4gIElmIHByb3RvY29sIHZlcnNpb24gMSBpcwotICAgICAgICAgICAgIHVzZWQsIHNzaCBtdXN0IGJlIHNldHVpZCByb290LCBzaW5jZSB0aGUgaG9zdCBrZXkgaXMgcmVhZGFibGUKLSAgICAgICAgICAgICBvbmx5IGJ5IHJvb3QuICBGb3IgcHJvdG9jb2wgdmVyc2lvbiAyLCBzc2ggdXNlcyBzc2gta2V5c2lnbig4KSB0bwotICAgICAgICAgICAgIGFjY2VzcyB0aGUgaG9zdCBrZXlzLCBlbGltaW5hdGluZyB0aGUgcmVxdWlyZW1lbnQgdGhhdCBzc2ggYmUKLSAgICAgICAgICAgICBzZXR1aWQgcm9vdCB3aGVuIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24gaXMgdXNlZC4gIEJ5IGRlZmF1bHQKLSAgICAgICAgICAgICBzc2ggaXMgbm90IHNldHVpZCByb290LgotCi0gICAgIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cwotICAgICAgICAgICAgIFN5c3RlbXdpZGUgbGlzdCBvZiBrbm93biBob3N0IGtleXMuICBUaGlzIGZpbGUgc2hvdWxkIGJlIHByZXBhcmVkCi0gICAgICAgICAgICAgYnkgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHRvIGNvbnRhaW4gdGhlIHB1YmxpYyBob3N0IGtleXMgb2YKLSAgICAgICAgICAgICBhbGwgbWFjaGluZXMgaW4gdGhlIG9yZ2FuaXphdGlvbi4gIEl0IHNob3VsZCBiZSB3b3JsZC1yZWFkYWJsZS4KLSAgICAgICAgICAgICBTZWUgc3NoZCg4KSBmb3IgZnVydGhlciBkZXRhaWxzIG9mIHRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlLgotCi0gICAgIC9ldGMvc3NoL3NzaHJjCi0gICAgICAgICAgICAgQ29tbWFuZHMgaW4gdGhpcyBmaWxlIGFyZSBleGVjdXRlZCBieSBzc2ggd2hlbiB0aGUgdXNlciBsb2dzIGluLAotICAgICAgICAgICAgIGp1c3QgYmVmb3JlIHRoZSB1c2VyJ3Mgc2hlbGwgKG9yIGNvbW1hbmQpIGlzIHN0YXJ0ZWQuICBTZWUgdGhlCi0gICAgICAgICAgICAgc3NoZCg4KSBtYW51YWwgcGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotRVhJVCBTVEFUVVMKLSAgICAgc3NoIGV4aXRzIHdpdGggdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSByZW1vdGUgY29tbWFuZCBvciB3aXRoIDI1NSBpZiBhbgotICAgICBlcnJvciBvY2N1cnJlZC4KLQotU0VFIEFMU08KLSAgICAgc2NwKDEpLCBzZnRwKDEpLCBzc2gtYWRkKDEpLCBzc2gtYWdlbnQoMSksIHNzaC1rZXlnZW4oMSksIHNzaC1rZXlzY2FuKDEpLAotICAgICB0dW4oNCksIGhvc3RzLmVxdWl2KDUpLCBzc2hfY29uZmlnKDUpLCBzc2gta2V5c2lnbig4KSwgc3NoZCg4KQotCi0gICAgIFRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgUHJvdG9jb2wgQXNzaWduZWQgTnVtYmVycywgUkZDIDQyNTAsIDIwMDYuCi0KLSAgICAgVGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBQcm90b2NvbCBBcmNoaXRlY3R1cmUsIFJGQyA0MjUxLCAyMDA2LgotCi0gICAgIFRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgQXV0aGVudGljYXRpb24gUHJvdG9jb2wsIFJGQyA0MjUyLCAyMDA2LgotCi0gICAgIFRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgVHJhbnNwb3J0IExheWVyIFByb3RvY29sLCBSRkMgNDI1MywgMjAwNi4KLQotICAgICBUaGUgU2VjdXJlIFNoZWxsIChTU0gpIENvbm5lY3Rpb24gUHJvdG9jb2wsIFJGQyA0MjU0LCAyMDA2LgotCi0gICAgIFVzaW5nIEROUyB0byBTZWN1cmVseSBQdWJsaXNoIFNlY3VyZSBTaGVsbCAoU1NIKSBLZXkgRmluZ2VycHJpbnRzLCBSRkMKLSAgICAgNDI1NSwgMjAwNi4KLQotICAgICBHZW5lcmljIE1lc3NhZ2UgRXhjaGFuZ2UgQXV0aGVudGljYXRpb24gZm9yIHRoZSBTZWN1cmUgU2hlbGwgUHJvdG9jb2wKLSAgICAgKFNTSCksIFJGQyA0MjU2LCAyMDA2LgotCi0gICAgIFRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgU2Vzc2lvbiBDaGFubmVsIEJyZWFrIEV4dGVuc2lvbiwgUkZDIDQzMzUsIDIwMDYuCi0KLSAgICAgVGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBUcmFuc3BvcnQgTGF5ZXIgRW5jcnlwdGlvbiBNb2RlcywgUkZDIDQzNDQsIDIwMDYuCi0KLSAgICAgSW1wcm92ZWQgQXJjZm91ciBNb2RlcyBmb3IgdGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBUcmFuc3BvcnQgTGF5ZXIKLSAgICAgUHJvdG9jb2wsIFJGQyA0MzQ1LCAyMDA2LgotCi0gICAgIERpZmZpZS1IZWxsbWFuIEdyb3VwIEV4Y2hhbmdlIGZvciB0aGUgU2VjdXJlIFNoZWxsIChTU0gpIFRyYW5zcG9ydCBMYXllcgotICAgICBQcm90b2NvbCwgUkZDIDQ0MTksIDIwMDYuCi0KLSAgICAgVGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBQdWJsaWMgS2V5IEZpbGUgRm9ybWF0LCBSRkMgNDcxNiwgMjAwNi4KLQotICAgICBFbGxpcHRpYyBDdXJ2ZSBBbGdvcml0aG0gSW50ZWdyYXRpb24gaW4gdGhlIFNlY3VyZSBTaGVsbCBUcmFuc3BvcnQgTGF5ZXIsCi0gICAgIFJGQyA1NjU2LCAyMDA5LgotCi0gICAgIEEuIFBlcnJpZyBhbmQgRC4gU29uZywgSGFzaCBWaXN1YWxpemF0aW9uOiBhIE5ldyBUZWNobmlxdWUgdG8gaW1wcm92ZQotICAgICBSZWFsLVdvcmxkIFNlY3VyaXR5LCAxOTk5LCBJbnRlcm5hdGlvbmFsIFdvcmtzaG9wIG9uIENyeXB0b2dyYXBoaWMKLSAgICAgVGVjaG5pcXVlcyBhbmQgRS1Db21tZXJjZSAoQ3J5cFRFQyAnOTkpLgotCi1BVVRIT1JTCi0gICAgIE9wZW5TU0ggaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBhbmQgZnJlZSBzc2ggMS4yLjEyIHJlbGVhc2UgYnkKLSAgICAgVGF0dSBZbG9uZW4uICBBYXJvbiBDYW1wYmVsbCwgQm9iIEJlY2ssIE1hcmt1cyBGcmllZGwsIE5pZWxzIFByb3ZvcywgVGhlbwotICAgICBkZSBSYWFkdCBhbmQgRHVnIFNvbmcgcmVtb3ZlZCBtYW55IGJ1Z3MsIHJlLWFkZGVkIG5ld2VyIGZlYXR1cmVzIGFuZAotICAgICBjcmVhdGVkIE9wZW5TU0guICBNYXJrdXMgRnJpZWRsIGNvbnRyaWJ1dGVkIHRoZSBzdXBwb3J0IGZvciBTU0ggcHJvdG9jb2wKLSAgICAgdmVyc2lvbnMgMS41IGFuZCAyLjAuCi0KLU9wZW5CU0QgNS4wICAgICAgICAgICAgICAgICAgICAgQXVndXN0IDIsIDIwMTEgICAgICAgICAgICAgICAgICAgICBPcGVuQlNEIDUuMApkaWZmIC0tZ2l0IGEvc3NoLjEgYi9zc2guMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxY2E0Yi4uMDAwMDAwMAotLS0gYS9zc2guMQorKysgL2Rldi9udWxsCkBAIC0xLDE0OTUgKzAsMCBAQAotLlwiCi0uXCIgQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotLlwiICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0uXCIKLS5cIiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0uXCIgY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLS5cIiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0uXCIgaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotLlwiIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLS5cIgotLlwiIENvcHlyaWdodCAoYykgMTk5OSwyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiIENvcHlyaWdodCAoYykgMTk5OSBBYXJvbiBDYW1wYmVsbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk5IFRoZW8gZGUgUmFhZHQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiCi0uXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0uXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0uXCIgYXJlIG1ldDoKLS5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLS5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotLlwiCi0uXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLS5cIiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0uXCIgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLS5cIiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0uXCIgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0uXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLlwiIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLlwiIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS5cIiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLS5cIiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLlwiCi0uXCIgJE9wZW5CU0Q6IHNzaC4xLHYgMS4zMjAgMjAxMS8wOC8wMiAwMToyMjoxMSBkam0gRXhwICQKLS5EZCAkTWRvY2RhdGU6IEF1Z3VzdCAyIDIwMTEgJAotLkR0IFNTSCAxCi0uT3MKLS5TaCBOQU1FCi0uTm0gc3NoCi0uTmQgT3BlblNTSCBTU0ggY2xpZW50IChyZW1vdGUgbG9naW4gcHJvZ3JhbSkKLS5TaCBTWU5PUFNJUwotLk5tIHNzaAotLkJrIC13b3JkcwotLk9wIEZsIDEyNDZBYUNmZ0trTU5ucXNUdFZ2WHhZeQotLk9wIEZsIGIgQXIgYmluZF9hZGRyZXNzCi0uT3AgRmwgYyBBciBjaXBoZXJfc3BlYwotLk9wIEZsIEQgT28gQXIgYmluZF9hZGRyZXNzIDogT2MgTnMgQXIgcG9ydAotLk9wIEZsIGUgQXIgZXNjYXBlX2NoYXIKLS5PcCBGbCBGIEFyIGNvbmZpZ2ZpbGUKLS5PcCBGbCBJIEFyIHBrY3MxMQotLk9wIEZsIGkgQXIgaWRlbnRpdHlfZmlsZQotLk9wIEZsIEwgT28gQXIgYmluZF9hZGRyZXNzIDogT2MgTnMgQXIgcG9ydCA6IE5zIEFyIGhvc3QgOiBOcyBBciBob3N0cG9ydAotLk9wIEZsIGwgQXIgbG9naW5fbmFtZQotLk9wIEZsIG0gQXIgbWFjX3NwZWMKLS5PcCBGbCBPIEFyIGN0bF9jbWQKLS5PcCBGbCBvIEFyIG9wdGlvbgotLk9wIEZsIHAgQXIgcG9ydAotLk9wIEZsIFIgT28gQXIgYmluZF9hZGRyZXNzIDogT2MgTnMgQXIgcG9ydCA6IE5zIEFyIGhvc3QgOiBOcyBBciBob3N0cG9ydAotLk9wIEZsIFMgQXIgY3RsX3BhdGgKLS5PcCBGbCBXIEFyIGhvc3QgOiBOcyBBciBwb3J0Ci0uT3AgRmwgdyBBciBsb2NhbF90dW4gTnMgT3AgOiBOcyBBciByZW1vdGVfdHVuCi0uT28gQXIgdXNlciBOcyBAIE9jIE5zIEFyIGhvc3RuYW1lCi0uT3AgQXIgY29tbWFuZAotLkVrCi0uU2ggREVTQ1JJUFRJT04KLS5ObQotKFNTSCBjbGllbnQpIGlzIGEgcHJvZ3JhbSBmb3IgbG9nZ2luZyBpbnRvIGEgcmVtb3RlIG1hY2hpbmUgYW5kIGZvcgotZXhlY3V0aW5nIGNvbW1hbmRzIG9uIGEgcmVtb3RlIG1hY2hpbmUuCi1JdCBpcyBpbnRlbmRlZCB0byByZXBsYWNlIHJsb2dpbiBhbmQgcnNoLAotYW5kIHByb3ZpZGUgc2VjdXJlIGVuY3J5cHRlZCBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuCi10d28gdW50cnVzdGVkIGhvc3RzIG92ZXIgYW4gaW5zZWN1cmUgbmV0d29yay4KLVgxMSBjb25uZWN0aW9ucyBhbmQgYXJiaXRyYXJ5IFRDUCBwb3J0cwotY2FuIGFsc28gYmUgZm9yd2FyZGVkIG92ZXIgdGhlIHNlY3VyZSBjaGFubmVsLgotLlBwCi0uTm0KLWNvbm5lY3RzIGFuZCBsb2dzIGludG8gdGhlIHNwZWNpZmllZAotLkFyIGhvc3RuYW1lCi0od2l0aCBvcHRpb25hbAotLkFyIHVzZXIKLW5hbWUpLgotVGhlIHVzZXIgbXVzdCBwcm92ZQotaGlzL2hlciBpZGVudGl0eSB0byB0aGUgcmVtb3RlIG1hY2hpbmUgdXNpbmcgb25lIG9mIHNldmVyYWwgbWV0aG9kcwotZGVwZW5kaW5nIG9uIHRoZSBwcm90b2NvbCB2ZXJzaW9uIHVzZWQgKHNlZSBiZWxvdykuCi0uUHAKLUlmCi0uQXIgY29tbWFuZAotaXMgc3BlY2lmaWVkLAotaXQgaXMgZXhlY3V0ZWQgb24gdGhlIHJlbW90ZSBob3N0IGluc3RlYWQgb2YgYSBsb2dpbiBzaGVsbC4KLS5QcAotVGhlIG9wdGlvbnMgYXJlIGFzIGZvbGxvd3M6Ci0uQmwgLXRhZyAtd2lkdGggRHMKLS5JdCBGbCAxCi1Gb3JjZXMKLS5ObQotdG8gdHJ5IHByb3RvY29sIHZlcnNpb24gMSBvbmx5LgotLkl0IEZsIDIKLUZvcmNlcwotLk5tCi10byB0cnkgcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCi0uSXQgRmwgNAotRm9yY2VzCi0uTm0KLXRvIHVzZSBJUHY0IGFkZHJlc3NlcyBvbmx5LgotLkl0IEZsIDYKLUZvcmNlcwotLk5tCi10byB1c2UgSVB2NiBhZGRyZXNzZXMgb25seS4KLS5JdCBGbCBBCi1FbmFibGVzIGZvcndhcmRpbmcgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50IGNvbm5lY3Rpb24uCi1UaGlzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBvbiBhIHBlci1ob3N0IGJhc2lzIGluIGEgY29uZmlndXJhdGlvbiBmaWxlLgotLlBwCi1BZ2VudCBmb3J3YXJkaW5nIHNob3VsZCBiZSBlbmFibGVkIHdpdGggY2F1dGlvbi4KLVVzZXJzIHdpdGggdGhlIGFiaWxpdHkgdG8gYnlwYXNzIGZpbGUgcGVybWlzc2lvbnMgb24gdGhlIHJlbW90ZSBob3N0Ci0oZm9yIHRoZSBhZ2VudCdzCi0uVXggTnMgLWRvbWFpbgotc29ja2V0KSBjYW4gYWNjZXNzIHRoZSBsb2NhbCBhZ2VudCB0aHJvdWdoIHRoZSBmb3J3YXJkZWQgY29ubmVjdGlvbi4KLUFuIGF0dGFja2VyIGNhbm5vdCBvYnRhaW4ga2V5IG1hdGVyaWFsIGZyb20gdGhlIGFnZW50LAotaG93ZXZlciB0aGV5IGNhbiBwZXJmb3JtIG9wZXJhdGlvbnMgb24gdGhlIGtleXMgdGhhdCBlbmFibGUgdGhlbSB0bwotYXV0aGVudGljYXRlIHVzaW5nIHRoZSBpZGVudGl0aWVzIGxvYWRlZCBpbnRvIHRoZSBhZ2VudC4KLS5JdCBGbCBhCi1EaXNhYmxlcyBmb3J3YXJkaW5nIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudCBjb25uZWN0aW9uLgotLkl0IEZsIGIgQXIgYmluZF9hZGRyZXNzCi1Vc2UKLS5BciBiaW5kX2FkZHJlc3MKLW9uIHRoZSBsb2NhbCBtYWNoaW5lIGFzIHRoZSBzb3VyY2UgYWRkcmVzcwotb2YgdGhlIGNvbm5lY3Rpb24uCi1Pbmx5IHVzZWZ1bCBvbiBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIG9uZSBhZGRyZXNzLgotLkl0IEZsIEMKLVJlcXVlc3RzIGNvbXByZXNzaW9uIG9mIGFsbCBkYXRhIChpbmNsdWRpbmcgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBhbmQKLWRhdGEgZm9yIGZvcndhcmRlZCBYMTEgYW5kIFRDUCBjb25uZWN0aW9ucykuCi1UaGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzIHRoZSBzYW1lIHVzZWQgYnkKLS5YciBnemlwIDEgLAotYW5kIHRoZQotLkRxIGxldmVsCi1jYW4gYmUgY29udHJvbGxlZCBieSB0aGUKLS5DbSBDb21wcmVzc2lvbkxldmVsCi1vcHRpb24gZm9yIHByb3RvY29sIHZlcnNpb24gMS4KLUNvbXByZXNzaW9uIGlzIGRlc2lyYWJsZSBvbiBtb2RlbSBsaW5lcyBhbmQgb3RoZXIKLXNsb3cgY29ubmVjdGlvbnMsIGJ1dCB3aWxsIG9ubHkgc2xvdyBkb3duIHRoaW5ncyBvbiBmYXN0IG5ldHdvcmtzLgotVGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIHNldCBvbiBhIGhvc3QtYnktaG9zdCBiYXNpcyBpbiB0aGUKLWNvbmZpZ3VyYXRpb24gZmlsZXM7IHNlZSB0aGUKLS5DbSBDb21wcmVzc2lvbgotb3B0aW9uLgotLkl0IEZsIGMgQXIgY2lwaGVyX3NwZWMKLVNlbGVjdHMgdGhlIGNpcGhlciBzcGVjaWZpY2F0aW9uIGZvciBlbmNyeXB0aW5nIHRoZSBzZXNzaW9uLgotLlBwCi1Qcm90b2NvbCB2ZXJzaW9uIDEgYWxsb3dzIHNwZWNpZmljYXRpb24gb2YgYSBzaW5nbGUgY2lwaGVyLgotVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlCi0uRHEgM2RlcyAsCi0uRHEgYmxvd2Zpc2ggLAotYW5kCi0uRHEgZGVzIC4KLS5BciAzZGVzCi0odHJpcGxlLWRlcykgaXMgYW4gZW5jcnlwdC1kZWNyeXB0LWVuY3J5cHQgdHJpcGxlIHdpdGggdGhyZWUgZGlmZmVyZW50IGtleXMuCi1JdCBpcyBiZWxpZXZlZCB0byBiZSBzZWN1cmUuCi0uQXIgYmxvd2Zpc2gKLWlzIGEgZmFzdCBibG9jayBjaXBoZXI7IGl0IGFwcGVhcnMgdmVyeSBzZWN1cmUgYW5kIGlzIG11Y2ggZmFzdGVyIHRoYW4KLS5BciAzZGVzIC4KLS5BciBkZXMKLWlzIG9ubHkgc3VwcG9ydGVkIGluIHRoZQotLk5tCi1jbGllbnQgZm9yIGludGVyb3BlcmFiaWxpdHkgd2l0aCBsZWdhY3kgcHJvdG9jb2wgMSBpbXBsZW1lbnRhdGlvbnMKLXRoYXQgZG8gbm90IHN1cHBvcnQgdGhlCi0uQXIgM2RlcwotY2lwaGVyLgotSXRzIHVzZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCBkdWUgdG8gY3J5cHRvZ3JhcGhpYyB3ZWFrbmVzc2VzLgotVGhlIGRlZmF1bHQgaXMKLS5EcSAzZGVzIC4KLS5QcAotRm9yIHByb3RvY29sIHZlcnNpb24gMiwKLS5BciBjaXBoZXJfc3BlYwotaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjaXBoZXJzCi1saXN0ZWQgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4KLVNlZSB0aGUKLS5DbSBDaXBoZXJzCi1rZXl3b3JkIGluCi0uWHIgc3NoX2NvbmZpZyA1Ci1mb3IgbW9yZSBpbmZvcm1hdGlvbi4KLS5JdCBGbCBEIFhvCi0uU20gb2ZmCi0uT28gQXIgYmluZF9hZGRyZXNzIDogT2MKLS5BciBwb3J0Ci0uU20gb24KLS5YYwotU3BlY2lmaWVzIGEgbG9jYWwKLS5EcSBkeW5hbWljCi1hcHBsaWNhdGlvbi1sZXZlbCBwb3J0IGZvcndhcmRpbmcuCi1UaGlzIHdvcmtzIGJ5IGFsbG9jYXRpbmcgYSBzb2NrZXQgdG8gbGlzdGVuIHRvCi0uQXIgcG9ydAotb24gdGhlIGxvY2FsIHNpZGUsIG9wdGlvbmFsbHkgYm91bmQgdG8gdGhlIHNwZWNpZmllZAotLkFyIGJpbmRfYWRkcmVzcyAuCi1XaGVuZXZlciBhIGNvbm5lY3Rpb24gaXMgbWFkZSB0byB0aGlzIHBvcnQsIHRoZQotY29ubmVjdGlvbiBpcyBmb3J3YXJkZWQgb3ZlciB0aGUgc2VjdXJlIGNoYW5uZWwsIGFuZCB0aGUgYXBwbGljYXRpb24KLXByb3RvY29sIGlzIHRoZW4gdXNlZCB0byBkZXRlcm1pbmUgd2hlcmUgdG8gY29ubmVjdCB0byBmcm9tIHRoZQotcmVtb3RlIG1hY2hpbmUuCi1DdXJyZW50bHkgdGhlIFNPQ0tTNCBhbmQgU09DS1M1IHByb3RvY29scyBhcmUgc3VwcG9ydGVkLCBhbmQKLS5ObQotd2lsbCBhY3QgYXMgYSBTT0NLUyBzZXJ2ZXIuCi1Pbmx5IHJvb3QgY2FuIGZvcndhcmQgcHJpdmlsZWdlZCBwb3J0cy4KLUR5bmFtaWMgcG9ydCBmb3J3YXJkaW5ncyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLS5QcAotSVB2NiBhZGRyZXNzZXMgY2FuIGJlIHNwZWNpZmllZCBieSBlbmNsb3NpbmcgdGhlIGFkZHJlc3MgaW4gc3F1YXJlIGJyYWNrZXRzLgotT25seSB0aGUgc3VwZXJ1c2VyIGNhbiBmb3J3YXJkIHByaXZpbGVnZWQgcG9ydHMuCi1CeSBkZWZhdWx0LCB0aGUgbG9jYWwgcG9ydCBpcyBib3VuZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0uQ20gR2F0ZXdheVBvcnRzCi1zZXR0aW5nLgotSG93ZXZlciwgYW4gZXhwbGljaXQKLS5BciBiaW5kX2FkZHJlc3MKLW1heSBiZSB1c2VkIHRvIGJpbmQgdGhlIGNvbm5lY3Rpb24gdG8gYSBzcGVjaWZpYyBhZGRyZXNzLgotVGhlCi0uQXIgYmluZF9hZGRyZXNzCi1vZgotLkRxIGxvY2FsaG9zdAotaW5kaWNhdGVzIHRoYXQgdGhlIGxpc3RlbmluZyBwb3J0IGJlIGJvdW5kIGZvciBsb2NhbCB1c2Ugb25seSwgd2hpbGUgYW4KLWVtcHR5IGFkZHJlc3Mgb3IKLS5TcSAqCi1pbmRpY2F0ZXMgdGhhdCB0aGUgcG9ydCBzaG91bGQgYmUgYXZhaWxhYmxlIGZyb20gYWxsIGludGVyZmFjZXMuCi0uSXQgRmwgZSBBciBlc2NhcGVfY2hhcgotU2V0cyB0aGUgZXNjYXBlIGNoYXJhY3RlciBmb3Igc2Vzc2lvbnMgd2l0aCBhIHB0eSAoZGVmYXVsdDoKLS5RbCB+ICkgLgotVGhlIGVzY2FwZSBjaGFyYWN0ZXIgaXMgb25seSByZWNvZ25pemVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgotVGhlIGVzY2FwZSBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgYSBkb3QKLS5QcSBRbCBcJi4KLWNsb3NlcyB0aGUgY29ubmVjdGlvbjsKLWZvbGxvd2VkIGJ5IGNvbnRyb2wtWiBzdXNwZW5kcyB0aGUgY29ubmVjdGlvbjsKLWFuZCBmb2xsb3dlZCBieSBpdHNlbGYgc2VuZHMgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgb25jZS4KLVNldHRpbmcgdGhlIGNoYXJhY3RlciB0bwotLkRxIG5vbmUKLWRpc2FibGVzIGFueSBlc2NhcGVzIGFuZCBtYWtlcyB0aGUgc2Vzc2lvbiBmdWxseSB0cmFuc3BhcmVudC4KLS5JdCBGbCBGIEFyIGNvbmZpZ2ZpbGUKLVNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSBwZXItdXNlciBjb25maWd1cmF0aW9uIGZpbGUuCi1JZiBhIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLAotdGhlIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZQotLlBxIFBhIC9ldGMvc3NoL3NzaF9jb25maWcKLXdpbGwgYmUgaWdub3JlZC4KLVRoZSBkZWZhdWx0IGZvciB0aGUgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlIGlzCi0uUGEgfi8uc3NoL2NvbmZpZyAuCi0uSXQgRmwgZgotUmVxdWVzdHMKLS5ObQotdG8gZ28gdG8gYmFja2dyb3VuZCBqdXN0IGJlZm9yZSBjb21tYW5kIGV4ZWN1dGlvbi4KLVRoaXMgaXMgdXNlZnVsIGlmCi0uTm0KLWlzIGdvaW5nIHRvIGFzayBmb3IgcGFzc3dvcmRzIG9yIHBhc3NwaHJhc2VzLCBidXQgdGhlIHVzZXIKLXdhbnRzIGl0IGluIHRoZSBiYWNrZ3JvdW5kLgotVGhpcyBpbXBsaWVzCi0uRmwgbiAuCi1UaGUgcmVjb21tZW5kZWQgd2F5IHRvIHN0YXJ0IFgxMSBwcm9ncmFtcyBhdCBhIHJlbW90ZSBzaXRlIGlzIHdpdGgKLXNvbWV0aGluZyBsaWtlCi0uSWMgc3NoIC1mIGhvc3QgeHRlcm0gLgotLlBwCi1JZiB0aGUKLS5DbSBFeGl0T25Gb3J3YXJkRmFpbHVyZQotY29uZmlndXJhdGlvbiBvcHRpb24gaXMgc2V0IHRvCi0uRHEgeWVzICwKLXRoZW4gYSBjbGllbnQgc3RhcnRlZCB3aXRoCi0uRmwgZgotd2lsbCB3YWl0IGZvciBhbGwgcmVtb3RlIHBvcnQgZm9yd2FyZHMgdG8gYmUgc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkCi1iZWZvcmUgcGxhY2luZyBpdHNlbGYgaW4gdGhlIGJhY2tncm91bmQuCi0uSXQgRmwgZwotQWxsb3dzIHJlbW90ZSBob3N0cyB0byBjb25uZWN0IHRvIGxvY2FsIGZvcndhcmRlZCBwb3J0cy4KLS5JdCBGbCBJIEFyIHBrY3MxMQotU3BlY2lmeSB0aGUgUEtDUyMxMSBzaGFyZWQgbGlicmFyeQotLk5tCi1zaG91bGQgdXNlIHRvIGNvbW11bmljYXRlIHdpdGggYSBQS0NTIzExIHRva2VuIHByb3ZpZGluZyB0aGUgdXNlcidzCi1wcml2YXRlIFJTQSBrZXkuCi0uSXQgRmwgaSBBciBpZGVudGl0eV9maWxlCi1TZWxlY3RzIGEgZmlsZSBmcm9tIHdoaWNoIHRoZSBpZGVudGl0eSAocHJpdmF0ZSBrZXkpIGZvcgotcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiBpcyByZWFkLgotVGhlIGRlZmF1bHQgaXMKLS5QYSB+Ly5zc2gvaWRlbnRpdHkKLWZvciBwcm90b2NvbCB2ZXJzaW9uIDEsIGFuZAotLlBhIH4vLnNzaC9pZF9kc2EgLAotLlBhIH4vLnNzaC9pZF9lY2RzYQotYW5kCi0uUGEgfi8uc3NoL2lkX3JzYQotZm9yIHByb3RvY29sIHZlcnNpb24gMi4KLUlkZW50aXR5IGZpbGVzIG1heSBhbHNvIGJlIHNwZWNpZmllZCBvbgotYSBwZXItaG9zdCBiYXNpcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZQotLkZsIGkKLW9wdGlvbnMgKGFuZCBtdWx0aXBsZSBpZGVudGl0aWVzIHNwZWNpZmllZCBpbgotY29uZmlndXJhdGlvbiBmaWxlcykuCi0uTm0KLXdpbGwgYWxzbyB0cnkgdG8gbG9hZCBjZXJ0aWZpY2F0ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlbmFtZSBvYnRhaW5lZAotYnkgYXBwZW5kaW5nCi0uUGEgLWNlcnQucHViCi10byBpZGVudGl0eSBmaWxlbmFtZXMuCi0uSXQgRmwgSwotRW5hYmxlcyBHU1NBUEktYmFzZWQgYXV0aGVudGljYXRpb24gYW5kIGZvcndhcmRpbmcgKGRlbGVnYXRpb24pIG9mIEdTU0FQSQotY3JlZGVudGlhbHMgdG8gdGhlIHNlcnZlci4KLS5JdCBGbCBrCi1EaXNhYmxlcyBmb3J3YXJkaW5nIChkZWxlZ2F0aW9uKSBvZiBHU1NBUEkgY3JlZGVudGlhbHMgdG8gdGhlIHNlcnZlci4KLS5JdCBGbCBMIFhvCi0uU20gb2ZmCi0uT28gQXIgYmluZF9hZGRyZXNzIDogT2MKLS5BciBwb3J0IDogaG9zdCA6IGhvc3Rwb3J0Ci0uU20gb24KLS5YYwotU3BlY2lmaWVzIHRoYXQgdGhlIGdpdmVuIHBvcnQgb24gdGhlIGxvY2FsIChjbGllbnQpIGhvc3QgaXMgdG8gYmUKLWZvcndhcmRlZCB0byB0aGUgZ2l2ZW4gaG9zdCBhbmQgcG9ydCBvbiB0aGUgcmVtb3RlIHNpZGUuCi1UaGlzIHdvcmtzIGJ5IGFsbG9jYXRpbmcgYSBzb2NrZXQgdG8gbGlzdGVuIHRvCi0uQXIgcG9ydAotb24gdGhlIGxvY2FsIHNpZGUsIG9wdGlvbmFsbHkgYm91bmQgdG8gdGhlIHNwZWNpZmllZAotLkFyIGJpbmRfYWRkcmVzcyAuCi1XaGVuZXZlciBhIGNvbm5lY3Rpb24gaXMgbWFkZSB0byB0aGlzIHBvcnQsIHRoZQotY29ubmVjdGlvbiBpcyBmb3J3YXJkZWQgb3ZlciB0aGUgc2VjdXJlIGNoYW5uZWwsIGFuZCBhIGNvbm5lY3Rpb24gaXMKLW1hZGUgdG8KLS5BciBob3N0Ci1wb3J0Ci0uQXIgaG9zdHBvcnQKLWZyb20gdGhlIHJlbW90ZSBtYWNoaW5lLgotUG9ydCBmb3J3YXJkaW5ncyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLUlQdjYgYWRkcmVzc2VzIGNhbiBiZSBzcGVjaWZpZWQgYnkgZW5jbG9zaW5nIHRoZSBhZGRyZXNzIGluIHNxdWFyZSBicmFja2V0cy4KLU9ubHkgdGhlIHN1cGVydXNlciBjYW4gZm9yd2FyZCBwcml2aWxlZ2VkIHBvcnRzLgotQnkgZGVmYXVsdCwgdGhlIGxvY2FsIHBvcnQgaXMgYm91bmQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotLkNtIEdhdGV3YXlQb3J0cwotc2V0dGluZy4KLUhvd2V2ZXIsIGFuIGV4cGxpY2l0Ci0uQXIgYmluZF9hZGRyZXNzCi1tYXkgYmUgdXNlZCB0byBiaW5kIHRoZSBjb25uZWN0aW9uIHRvIGEgc3BlY2lmaWMgYWRkcmVzcy4KLVRoZQotLkFyIGJpbmRfYWRkcmVzcwotb2YKLS5EcSBsb2NhbGhvc3QKLWluZGljYXRlcyB0aGF0IHRoZSBsaXN0ZW5pbmcgcG9ydCBiZSBib3VuZCBmb3IgbG9jYWwgdXNlIG9ubHksIHdoaWxlIGFuCi1lbXB0eSBhZGRyZXNzIG9yCi0uU3EgKgotaW5kaWNhdGVzIHRoYXQgdGhlIHBvcnQgc2hvdWxkIGJlIGF2YWlsYWJsZSBmcm9tIGFsbCBpbnRlcmZhY2VzLgotLkl0IEZsIGwgQXIgbG9naW5fbmFtZQotU3BlY2lmaWVzIHRoZSB1c2VyIHRvIGxvZyBpbiBhcyBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuCi1UaGlzIGFsc28gbWF5IGJlIHNwZWNpZmllZCBvbiBhIHBlci1ob3N0IGJhc2lzIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0uSXQgRmwgTQotUGxhY2VzIHRoZQotLk5tCi1jbGllbnQgaW50bwotLkRxIG1hc3RlcgotbW9kZSBmb3IgY29ubmVjdGlvbiBzaGFyaW5nLgotTXVsdGlwbGUKLS5GbCBNCi1vcHRpb25zIHBsYWNlcwotLk5tCi1pbnRvCi0uRHEgbWFzdGVyCi1tb2RlIHdpdGggY29uZmlybWF0aW9uIHJlcXVpcmVkIGJlZm9yZSBzbGF2ZSBjb25uZWN0aW9ucyBhcmUgYWNjZXB0ZWQuCi1SZWZlciB0byB0aGUgZGVzY3JpcHRpb24gb2YKLS5DbSBDb250cm9sTWFzdGVyCi1pbgotLlhyIHNzaF9jb25maWcgNQotZm9yIGRldGFpbHMuCi0uSXQgRmwgbSBBciBtYWNfc3BlYwotQWRkaXRpb25hbGx5LCBmb3IgcHJvdG9jb2wgdmVyc2lvbiAyIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgTUFDCi0obWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlKSBhbGdvcml0aG1zIGNhbgotYmUgc3BlY2lmaWVkIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuCi1TZWUgdGhlCi0uQ20gTUFDcwota2V5d29yZCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLS5JdCBGbCBOCi1EbyBub3QgZXhlY3V0ZSBhIHJlbW90ZSBjb21tYW5kLgotVGhpcyBpcyB1c2VmdWwgZm9yIGp1c3QgZm9yd2FyZGluZyBwb3J0cwotKHByb3RvY29sIHZlcnNpb24gMiBvbmx5KS4KLS5JdCBGbCBuCi1SZWRpcmVjdHMgc3RkaW4gZnJvbQotLlBhIC9kZXYvbnVsbAotKGFjdHVhbGx5LCBwcmV2ZW50cyByZWFkaW5nIGZyb20gc3RkaW4pLgotVGhpcyBtdXN0IGJlIHVzZWQgd2hlbgotLk5tCi1pcyBydW4gaW4gdGhlIGJhY2tncm91bmQuCi1BIGNvbW1vbiB0cmljayBpcyB0byB1c2UgdGhpcyB0byBydW4gWDExIHByb2dyYW1zIG9uIGEgcmVtb3RlIG1hY2hpbmUuCi1Gb3IgZXhhbXBsZSwKLS5JYyBzc2ggLW4gc2hhZG93cy5jcy5odXQuZmkgZW1hY3MgJgotd2lsbCBzdGFydCBhbiBlbWFjcyBvbiBzaGFkb3dzLmNzLmh1dC5maSwgYW5kIHRoZSBYMTEKLWNvbm5lY3Rpb24gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZvcndhcmRlZCBvdmVyIGFuIGVuY3J5cHRlZCBjaGFubmVsLgotVGhlCi0uTm0KLXByb2dyYW0gd2lsbCBiZSBwdXQgaW4gdGhlIGJhY2tncm91bmQuCi0oVGhpcyBkb2VzIG5vdCB3b3JrIGlmCi0uTm0KLW5lZWRzIHRvIGFzayBmb3IgYSBwYXNzd29yZCBvciBwYXNzcGhyYXNlOyBzZWUgYWxzbyB0aGUKLS5GbCBmCi1vcHRpb24uKQotLkl0IEZsIE8gQXIgY3RsX2NtZAotQ29udHJvbCBhbiBhY3RpdmUgY29ubmVjdGlvbiBtdWx0aXBsZXhpbmcgbWFzdGVyIHByb2Nlc3MuCi1XaGVuIHRoZQotLkZsIE8KLW9wdGlvbiBpcyBzcGVjaWZpZWQsIHRoZQotLkFyIGN0bF9jbWQKLWFyZ3VtZW50IGlzIGludGVycHJldGVkIGFuZCBwYXNzZWQgdG8gdGhlIG1hc3RlciBwcm9jZXNzLgotVmFsaWQgY29tbWFuZHMgYXJlOgotLkRxIGNoZWNrCi0oY2hlY2sgdGhhdCB0aGUgbWFzdGVyIHByb2Nlc3MgaXMgcnVubmluZyksCi0uRHEgZm9yd2FyZAotKHJlcXVlc3QgZm9yd2FyZGluZ3Mgd2l0aG91dCBjb21tYW5kIGV4ZWN1dGlvbiksCi0uRHEgZXhpdAotKHJlcXVlc3QgdGhlIG1hc3RlciB0byBleGl0KSwgYW5kCi0uRHEgc3RvcAotKHJlcXVlc3QgdGhlIG1hc3RlciB0byBzdG9wIGFjY2VwdGluZyBmdXJ0aGVyIG11bHRpcGxleGluZyByZXF1ZXN0cykuCi0uSXQgRmwgbyBBciBvcHRpb24KLUNhbiBiZSB1c2VkIHRvIGdpdmUgb3B0aW9ucyBpbiB0aGUgZm9ybWF0IHVzZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLVRoaXMgaXMgdXNlZnVsIGZvciBzcGVjaWZ5aW5nIG9wdGlvbnMgZm9yIHdoaWNoIHRoZXJlIGlzIG5vIHNlcGFyYXRlCi1jb21tYW5kLWxpbmUgZmxhZy4KLUZvciBmdWxsIGRldGFpbHMgb2YgdGhlIG9wdGlvbnMgbGlzdGVkIGJlbG93LCBhbmQgdGhlaXIgcG9zc2libGUgdmFsdWVzLCBzZWUKLS5YciBzc2hfY29uZmlnIDUgLgotLlBwCi0uQmwgLXRhZyAtd2lkdGggRHMgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKLS5JdCBBZGRyZXNzRmFtaWx5Ci0uSXQgQmF0Y2hNb2RlCi0uSXQgQmluZEFkZHJlc3MKLS5JdCBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uCi0uSXQgQ2hlY2tIb3N0SVAKLS5JdCBDaXBoZXIKLS5JdCBDaXBoZXJzCi0uSXQgQ2xlYXJBbGxGb3J3YXJkaW5ncwotLkl0IENvbXByZXNzaW9uCi0uSXQgQ29tcHJlc3Npb25MZXZlbAotLkl0IENvbm5lY3Rpb25BdHRlbXB0cwotLkl0IENvbm5lY3RUaW1lb3V0Ci0uSXQgQ29udHJvbE1hc3RlcgotLkl0IENvbnRyb2xQYXRoCi0uSXQgRHluYW1pY0ZvcndhcmQKLS5JdCBFc2NhcGVDaGFyCi0uSXQgRXhpdE9uRm9yd2FyZEZhaWx1cmUKLS5JdCBGb3J3YXJkQWdlbnQKLS5JdCBGb3J3YXJkWDExCi0uSXQgRm9yd2FyZFgxMVRydXN0ZWQKLS5JdCBHYXRld2F5UG9ydHMKLS5JdCBHbG9iYWxLbm93bkhvc3RzRmlsZQotLkl0IEdTU0FQSUF1dGhlbnRpY2F0aW9uCi0uSXQgR1NTQVBJRGVsZWdhdGVDcmVkZW50aWFscwotLkl0IEhhc2hLbm93bkhvc3RzCi0uSXQgSG9zdAotLkl0IEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCi0uSXQgSG9zdEtleUFsZ29yaXRobXMKLS5JdCBIb3N0S2V5QWxpYXMKLS5JdCBIb3N0TmFtZQotLkl0IElkZW50aXR5RmlsZQotLkl0IElkZW50aXRpZXNPbmx5Ci0uSXQgSVBRb1MKLS5JdCBLYmRJbnRlcmFjdGl2ZURldmljZXMKLS5JdCBLZXhBbGdvcml0aG1zCi0uSXQgTG9jYWxDb21tYW5kCi0uSXQgTG9jYWxGb3J3YXJkCi0uSXQgTG9nTGV2ZWwKLS5JdCBNQUNzCi0uSXQgTm9Ib3N0QXV0aGVudGljYXRpb25Gb3JMb2NhbGhvc3QKLS5JdCBOdW1iZXJPZlBhc3N3b3JkUHJvbXB0cwotLkl0IFBhc3N3b3JkQXV0aGVudGljYXRpb24KLS5JdCBQZXJtaXRMb2NhbENvbW1hbmQKLS5JdCBQS0NTMTFQcm92aWRlcgotLkl0IFBvcnQKLS5JdCBQcmVmZXJyZWRBdXRoZW50aWNhdGlvbnMKLS5JdCBQcm90b2NvbAotLkl0IFByb3h5Q29tbWFuZAotLkl0IFB1YmtleUF1dGhlbnRpY2F0aW9uCi0uSXQgUmVrZXlMaW1pdAotLkl0IFJlbW90ZUZvcndhcmQKLS5JdCBSZXF1ZXN0VFRZCi0uSXQgUmhvc3RzUlNBQXV0aGVudGljYXRpb24KLS5JdCBSU0FBdXRoZW50aWNhdGlvbgotLkl0IFNlbmRFbnYKLS5JdCBTZXJ2ZXJBbGl2ZUludGVydmFsCi0uSXQgU2VydmVyQWxpdmVDb3VudE1heAotLkl0IFN0cmljdEhvc3RLZXlDaGVja2luZwotLkl0IFRDUEtlZXBBbGl2ZQotLkl0IFR1bm5lbAotLkl0IFR1bm5lbERldmljZQotLkl0IFVzZVByaXZpbGVnZWRQb3J0Ci0uSXQgVXNlcgotLkl0IFVzZXJLbm93bkhvc3RzRmlsZQotLkl0IFZlcmlmeUhvc3RLZXlETlMKLS5JdCBWaXN1YWxIb3N0S2V5Ci0uSXQgWEF1dGhMb2NhdGlvbgotLkVsCi0uSXQgRmwgcCBBciBwb3J0Ci1Qb3J0IHRvIGNvbm5lY3QgdG8gb24gdGhlIHJlbW90ZSBob3N0LgotVGhpcyBjYW4gYmUgc3BlY2lmaWVkIG9uIGEKLXBlci1ob3N0IGJhc2lzIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0uSXQgRmwgcQotUXVpZXQgbW9kZS4KLUNhdXNlcyBtb3N0IHdhcm5pbmcgYW5kIGRpYWdub3N0aWMgbWVzc2FnZXMgdG8gYmUgc3VwcHJlc3NlZC4KLS5JdCBGbCBSIFhvCi0uU20gb2ZmCi0uT28gQXIgYmluZF9hZGRyZXNzIDogT2MKLS5BciBwb3J0IDogaG9zdCA6IGhvc3Rwb3J0Ci0uU20gb24KLS5YYwotU3BlY2lmaWVzIHRoYXQgdGhlIGdpdmVuIHBvcnQgb24gdGhlIHJlbW90ZSAoc2VydmVyKSBob3N0IGlzIHRvIGJlCi1mb3J3YXJkZWQgdG8gdGhlIGdpdmVuIGhvc3QgYW5kIHBvcnQgb24gdGhlIGxvY2FsIHNpZGUuCi1UaGlzIHdvcmtzIGJ5IGFsbG9jYXRpbmcgYSBzb2NrZXQgdG8gbGlzdGVuIHRvCi0uQXIgcG9ydAotb24gdGhlIHJlbW90ZSBzaWRlLCBhbmQgd2hlbmV2ZXIgYSBjb25uZWN0aW9uIGlzIG1hZGUgdG8gdGhpcyBwb3J0LCB0aGUKLWNvbm5lY3Rpb24gaXMgZm9yd2FyZGVkIG92ZXIgdGhlIHNlY3VyZSBjaGFubmVsLCBhbmQgYSBjb25uZWN0aW9uIGlzCi1tYWRlIHRvCi0uQXIgaG9zdAotcG9ydAotLkFyIGhvc3Rwb3J0Ci1mcm9tIHRoZSBsb2NhbCBtYWNoaW5lLgotLlBwCi1Qb3J0IGZvcndhcmRpbmdzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotUHJpdmlsZWdlZCBwb3J0cyBjYW4gYmUgZm9yd2FyZGVkIG9ubHkgd2hlbgotbG9nZ2luZyBpbiBhcyByb290IG9uIHRoZSByZW1vdGUgbWFjaGluZS4KLUlQdjYgYWRkcmVzc2VzIGNhbiBiZSBzcGVjaWZpZWQgYnkgZW5jbG9zaW5nIHRoZSBhZGRyZXNzIGluIHNxdWFyZSBicmFjZXMuCi0uUHAKLUJ5IGRlZmF1bHQsIHRoZSBsaXN0ZW5pbmcgc29ja2V0IG9uIHRoZSBzZXJ2ZXIgd2lsbCBiZSBib3VuZCB0byB0aGUgbG9vcGJhY2sKLWludGVyZmFjZSBvbmx5LgotVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSBzcGVjaWZ5aW5nIGEKLS5BciBiaW5kX2FkZHJlc3MgLgotQW4gZW1wdHkKLS5BciBiaW5kX2FkZHJlc3MgLAotb3IgdGhlIGFkZHJlc3MKLS5RbCAqICwKLWluZGljYXRlcyB0aGF0IHRoZSByZW1vdGUgc29ja2V0IHNob3VsZCBsaXN0ZW4gb24gYWxsIGludGVyZmFjZXMuCi1TcGVjaWZ5aW5nIGEgcmVtb3RlCi0uQXIgYmluZF9hZGRyZXNzCi13aWxsIG9ubHkgc3VjY2VlZCBpZiB0aGUgc2VydmVyJ3MKLS5DbSBHYXRld2F5UG9ydHMKLW9wdGlvbiBpcyBlbmFibGVkIChzZWUKLS5YciBzc2hkX2NvbmZpZyA1ICkgLgotLlBwCi1JZiB0aGUKLS5BciBwb3J0Ci1hcmd1bWVudCBpcwotLlFsIDAgLAotdGhlIGxpc3RlbiBwb3J0IHdpbGwgYmUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG9uIHRoZSBzZXJ2ZXIgYW5kIHJlcG9ydGVkCi10byB0aGUgY2xpZW50IGF0IHJ1biB0aW1lLgotV2hlbiB1c2VkIHRvZ2V0aGVyIHdpdGgKLS5JYyAtTyBmb3J3YXJkCi10aGUgYWxsb2NhdGVkIHBvcnQgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuCi0uSXQgRmwgUyBBciBjdGxfcGF0aAotU3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBhIGNvbnRyb2wgc29ja2V0IGZvciBjb25uZWN0aW9uIHNoYXJpbmcsCi1vciB0aGUgc3RyaW5nCi0uRHEgbm9uZQotdG8gZGlzYWJsZSBjb25uZWN0aW9uIHNoYXJpbmcuCi1SZWZlciB0byB0aGUgZGVzY3JpcHRpb24gb2YKLS5DbSBDb250cm9sUGF0aAotYW5kCi0uQ20gQ29udHJvbE1hc3RlcgotaW4KLS5YciBzc2hfY29uZmlnIDUKLWZvciBkZXRhaWxzLgotLkl0IEZsIHMKLU1heSBiZSB1c2VkIHRvIHJlcXVlc3QgaW52b2NhdGlvbiBvZiBhIHN1YnN5c3RlbSBvbiB0aGUgcmVtb3RlIHN5c3RlbS4KLVN1YnN5c3RlbXMgYXJlIGEgZmVhdHVyZSBvZiB0aGUgU1NIMiBwcm90b2NvbCB3aGljaCBmYWNpbGl0YXRlIHRoZSB1c2UKLW9mIFNTSCBhcyBhIHNlY3VyZSB0cmFuc3BvcnQgZm9yIG90aGVyIGFwcGxpY2F0aW9ucyAoZWcuXCYKLS5YciBzZnRwIDEgKSAuCi1UaGUgc3Vic3lzdGVtIGlzIHNwZWNpZmllZCBhcyB0aGUgcmVtb3RlIGNvbW1hbmQuCi0uSXQgRmwgVAotRGlzYWJsZSBwc2V1ZG8tdHR5IGFsbG9jYXRpb24uCi0uSXQgRmwgdAotRm9yY2UgcHNldWRvLXR0eSBhbGxvY2F0aW9uLgotVGhpcyBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGFyYml0cmFyeQotc2NyZWVuLWJhc2VkIHByb2dyYW1zIG9uIGEgcmVtb3RlIG1hY2hpbmUsIHdoaWNoIGNhbiBiZSB2ZXJ5IHVzZWZ1bCwKLWUuZy4gd2hlbiBpbXBsZW1lbnRpbmcgbWVudSBzZXJ2aWNlcy4KLU11bHRpcGxlCi0uRmwgdAotb3B0aW9ucyBmb3JjZSB0dHkgYWxsb2NhdGlvbiwgZXZlbiBpZgotLk5tCi1oYXMgbm8gbG9jYWwgdHR5LgotLkl0IEZsIFYKLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0LgotLkl0IEZsIHYKLVZlcmJvc2UgbW9kZS4KLUNhdXNlcwotLk5tCi10byBwcmludCBkZWJ1Z2dpbmcgbWVzc2FnZXMgYWJvdXQgaXRzIHByb2dyZXNzLgotVGhpcyBpcyBoZWxwZnVsIGluCi1kZWJ1Z2dpbmcgY29ubmVjdGlvbiwgYXV0aGVudGljYXRpb24sIGFuZCBjb25maWd1cmF0aW9uIHByb2JsZW1zLgotTXVsdGlwbGUKLS5GbCB2Ci1vcHRpb25zIGluY3JlYXNlIHRoZSB2ZXJib3NpdHkuCi1UaGUgbWF4aW11bSBpcyAzLgotLkl0IEZsIFcgQXIgaG9zdCA6IE5zIEFyIHBvcnQKLVJlcXVlc3RzIHRoYXQgc3RhbmRhcmQgaW5wdXQgYW5kIG91dHB1dCBvbiB0aGUgY2xpZW50IGJlIGZvcndhcmRlZCB0bwotLkFyIGhvc3QKLW9uCi0uQXIgcG9ydAotb3ZlciB0aGUgc2VjdXJlIGNoYW5uZWwuCi1JbXBsaWVzCi0uRmwgTiAsCi0uRmwgVCAsCi0uQ20gRXhpdE9uRm9yd2FyZEZhaWx1cmUKLWFuZAotLkNtIENsZWFyQWxsRm9yd2FyZGluZ3MKLWFuZCB3b3JrcyB3aXRoIFByb3RvY29sIHZlcnNpb24gMiBvbmx5LgotLkl0IEZsIHcgWG8KLS5BciBsb2NhbF90dW4gTnMgT3AgOiBOcyBBciByZW1vdGVfdHVuCi0uWGMKLVJlcXVlc3RzCi10dW5uZWwKLWRldmljZSBmb3J3YXJkaW5nIHdpdGggdGhlIHNwZWNpZmllZAotLlhyIHR1biA0Ci1kZXZpY2VzIGJldHdlZW4gdGhlIGNsaWVudAotLlBxIEFyIGxvY2FsX3R1bgotYW5kIHRoZSBzZXJ2ZXIKLS5QcSBBciByZW1vdGVfdHVuIC4KLS5QcAotVGhlIGRldmljZXMgbWF5IGJlIHNwZWNpZmllZCBieSBudW1lcmljYWwgSUQgb3IgdGhlIGtleXdvcmQKLS5EcSBhbnkgLAotd2hpY2ggdXNlcyB0aGUgbmV4dCBhdmFpbGFibGUgdHVubmVsIGRldmljZS4KLUlmCi0uQXIgcmVtb3RlX3R1bgotaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8KLS5EcSBhbnkgLgotU2VlIGFsc28gdGhlCi0uQ20gVHVubmVsCi1hbmQKLS5DbSBUdW5uZWxEZXZpY2UKLWRpcmVjdGl2ZXMgaW4KLS5YciBzc2hfY29uZmlnIDUgLgotSWYgdGhlCi0uQ20gVHVubmVsCi1kaXJlY3RpdmUgaXMgdW5zZXQsIGl0IGlzIHNldCB0byB0aGUgZGVmYXVsdCB0dW5uZWwgbW9kZSwgd2hpY2ggaXMKLS5EcSBwb2ludC10by1wb2ludCAuCi0uSXQgRmwgWAotRW5hYmxlcyBYMTEgZm9yd2FyZGluZy4KLVRoaXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIG9uIGEgcGVyLWhvc3QgYmFzaXMgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUuCi0uUHAKLVgxMSBmb3J3YXJkaW5nIHNob3VsZCBiZSBlbmFibGVkIHdpdGggY2F1dGlvbi4KLVVzZXJzIHdpdGggdGhlIGFiaWxpdHkgdG8gYnlwYXNzIGZpbGUgcGVybWlzc2lvbnMgb24gdGhlIHJlbW90ZSBob3N0Ci0oZm9yIHRoZSB1c2VyJ3MgWCBhdXRob3JpemF0aW9uIGRhdGFiYXNlKQotY2FuIGFjY2VzcyB0aGUgbG9jYWwgWDExIGRpc3BsYXkgdGhyb3VnaCB0aGUgZm9yd2FyZGVkIGNvbm5lY3Rpb24uCi1BbiBhdHRhY2tlciBtYXkgdGhlbiBiZSBhYmxlIHRvIHBlcmZvcm0gYWN0aXZpdGllcyBzdWNoIGFzIGtleXN0cm9rZSBtb25pdG9yaW5nLgotLlBwCi1Gb3IgdGhpcyByZWFzb24sIFgxMSBmb3J3YXJkaW5nIGlzIHN1YmplY3RlZCB0byBYMTEgU0VDVVJJVFkgZXh0ZW5zaW9uCi1yZXN0cmljdGlvbnMgYnkgZGVmYXVsdC4KLVBsZWFzZSByZWZlciB0byB0aGUKLS5ObQotLkZsIFkKLW9wdGlvbiBhbmQgdGhlCi0uQ20gRm9yd2FyZFgxMVRydXN0ZWQKLWRpcmVjdGl2ZSBpbgotLlhyIHNzaF9jb25maWcgNQotZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0uSXQgRmwgeAotRGlzYWJsZXMgWDExIGZvcndhcmRpbmcuCi0uSXQgRmwgWQotRW5hYmxlcyB0cnVzdGVkIFgxMSBmb3J3YXJkaW5nLgotVHJ1c3RlZCBYMTEgZm9yd2FyZGluZ3MgYXJlIG5vdCBzdWJqZWN0ZWQgdG8gdGhlIFgxMSBTRUNVUklUWSBleHRlbnNpb24KLWNvbnRyb2xzLgotLkl0IEZsIHkKLVNlbmQgbG9nIGluZm9ybWF0aW9uIHVzaW5nIHRoZQotLlhyIHN5c2xvZyAzCi1zeXN0ZW0gbW9kdWxlLgotQnkgZGVmYXVsdCB0aGlzIGluZm9ybWF0aW9uIGlzIHNlbnQgdG8gc3RkZXJyLgotLkVsCi0uUHAKLS5ObQotbWF5IGFkZGl0aW9uYWxseSBvYnRhaW4gY29uZmlndXJhdGlvbiBkYXRhIGZyb20KLWEgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBhIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLVRoZSBmaWxlIGZvcm1hdCBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBkZXNjcmliZWQgaW4KLS5YciBzc2hfY29uZmlnIDUgLgotLlNoIEFVVEhFTlRJQ0FUSU9OCi1UaGUgT3BlblNTSCBTU0ggY2xpZW50IHN1cHBvcnRzIFNTSCBwcm90b2NvbHMgMSBhbmQgMi4KLVRoZSBkZWZhdWx0IGlzIHRvIHVzZSBwcm90b2NvbCAyIG9ubHksCi10aG91Z2ggdGhpcyBjYW4gYmUgY2hhbmdlZCB2aWEgdGhlCi0uQ20gUHJvdG9jb2wKLW9wdGlvbiBpbgotLlhyIHNzaF9jb25maWcgNQotb3IgdGhlCi0uRmwgMQotYW5kCi0uRmwgMgotb3B0aW9ucyAoc2VlIGFib3ZlKS4KLUJvdGggcHJvdG9jb2xzIHN1cHBvcnQgc2ltaWxhciBhdXRoZW50aWNhdGlvbiBtZXRob2RzLAotYnV0IHByb3RvY29sIDIgaXMgdGhlIGRlZmF1bHQgc2luY2UKLWl0IHByb3ZpZGVzIGFkZGl0aW9uYWwgbWVjaGFuaXNtcyBmb3IgY29uZmlkZW50aWFsaXR5Ci0odGhlIHRyYWZmaWMgaXMgZW5jcnlwdGVkIHVzaW5nIEFFUywgM0RFUywgQmxvd2Zpc2gsIENBU1QxMjgsIG9yIEFyY2ZvdXIpCi1hbmQgaW50ZWdyaXR5IChobWFjLW1kNSwgaG1hYy1zaGExLAotaG1hYy1zaGEyLTI1NiwgaG1hYy1zaGEyLTUxMiwKLXVtYWMtNjQsIGhtYWMtcmlwZW1kMTYwKS4KLVByb3RvY29sIDEgbGFja3MgYSBzdHJvbmcgbWVjaGFuaXNtIGZvciBlbnN1cmluZyB0aGUKLWludGVncml0eSBvZiB0aGUgY29ubmVjdGlvbi4KLS5QcAotVGhlIG1ldGhvZHMgYXZhaWxhYmxlIGZvciBhdXRoZW50aWNhdGlvbiBhcmU6Ci1HU1NBUEktYmFzZWQgYXV0aGVudGljYXRpb24sCi1ob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uLAotcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiwKLWNoYWxsZW5nZS1yZXNwb25zZSBhdXRoZW50aWNhdGlvbiwKLWFuZCBwYXNzd29yZCBhdXRoZW50aWNhdGlvbi4KLUF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgYXJlIHRyaWVkIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYWJvdmUsCi10aG91Z2ggcHJvdG9jb2wgMiBoYXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgb3JkZXI6Ci0uQ20gUHJlZmVycmVkQXV0aGVudGljYXRpb25zIC4KLS5QcAotSG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiB3b3JrcyBhcyBmb2xsb3dzOgotSWYgdGhlIG1hY2hpbmUgdGhlIHVzZXIgbG9ncyBpbiBmcm9tIGlzIGxpc3RlZCBpbgotLlBhIC9ldGMvaG9zdHMuZXF1aXYKLW9yCi0uUGEgL2V0Yy9zaG9zdHMuZXF1aXYKLW9uIHRoZSByZW1vdGUgbWFjaGluZSwgYW5kIHRoZSB1c2VyIG5hbWVzIGFyZQotdGhlIHNhbWUgb24gYm90aCBzaWRlcywgb3IgaWYgdGhlIGZpbGVzCi0uUGEgfi8ucmhvc3RzCi1vcgotLlBhIH4vLnNob3N0cwotZXhpc3QgaW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBvbiB0aGUKLXJlbW90ZSBtYWNoaW5lIGFuZCBjb250YWluIGEgbGluZSBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBjbGllbnQKLW1hY2hpbmUgYW5kIHRoZSBuYW1lIG9mIHRoZSB1c2VyIG9uIHRoYXQgbWFjaGluZSwgdGhlIHVzZXIgaXMKLWNvbnNpZGVyZWQgZm9yIGxvZ2luLgotQWRkaXRpb25hbGx5LCB0aGUgc2VydmVyCi0uRW0gbXVzdAotYmUgYWJsZSB0byB2ZXJpZnkgdGhlIGNsaWVudCdzCi1ob3N0IGtleSAoc2VlIHRoZSBkZXNjcmlwdGlvbiBvZgotLlBhIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cwotYW5kCi0uUGEgfi8uc3NoL2tub3duX2hvc3RzICwKLWJlbG93KQotZm9yIGxvZ2luIHRvIGJlIHBlcm1pdHRlZC4KLVRoaXMgYXV0aGVudGljYXRpb24gbWV0aG9kIGNsb3NlcyBzZWN1cml0eSBob2xlcyBkdWUgdG8gSVAKLXNwb29maW5nLCBETlMgc3Bvb2ZpbmcsIGFuZCByb3V0aW5nIHNwb29maW5nLgotW05vdGUgdG8gdGhlIGFkbWluaXN0cmF0b3I6Ci0uUGEgL2V0Yy9ob3N0cy5lcXVpdiAsCi0uUGEgfi8ucmhvc3RzICwKLWFuZCB0aGUgcmxvZ2luL3JzaCBwcm90b2NvbCBpbiBnZW5lcmFsLCBhcmUgaW5oZXJlbnRseSBpbnNlY3VyZSBhbmQgc2hvdWxkIGJlCi1kaXNhYmxlZCBpZiBzZWN1cml0eSBpcyBkZXNpcmVkLl0KLS5QcAotUHVibGljIGtleSBhdXRoZW50aWNhdGlvbiB3b3JrcyBhcyBmb2xsb3dzOgotVGhlIHNjaGVtZSBpcyBiYXNlZCBvbiBwdWJsaWMta2V5IGNyeXB0b2dyYXBoeSwKLXVzaW5nIGNyeXB0b3N5c3RlbXMKLXdoZXJlIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gYXJlIGRvbmUgdXNpbmcgc2VwYXJhdGUga2V5cywKLWFuZCBpdCBpcyB1bmZlYXNpYmxlIHRvIGRlcml2ZSB0aGUgZGVjcnlwdGlvbiBrZXkgZnJvbSB0aGUgZW5jcnlwdGlvbiBrZXkuCi1UaGUgaWRlYSBpcyB0aGF0IGVhY2ggdXNlciBjcmVhdGVzIGEgcHVibGljL3ByaXZhdGUKLWtleSBwYWlyIGZvciBhdXRoZW50aWNhdGlvbiBwdXJwb3Nlcy4KLVRoZSBzZXJ2ZXIga25vd3MgdGhlIHB1YmxpYyBrZXksIGFuZCBvbmx5IHRoZSB1c2VyIGtub3dzIHRoZSBwcml2YXRlIGtleS4KLS5ObQotaW1wbGVtZW50cyBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIGF1dG9tYXRpY2FsbHksCi11c2luZyBvbmUgb2YgdGhlIERTQSwgRUNEU0Egb3IgUlNBIGFsZ29yaXRobXMuCi1Qcm90b2NvbCAxIGlzIHJlc3RyaWN0ZWQgdG8gdXNpbmcgb25seSBSU0Ega2V5cywKLWJ1dCBwcm90b2NvbCAyIG1heSB1c2UgYW55LgotVGhlCi0uU3ggSElTVE9SWQotc2VjdGlvbiBvZgotLlhyIHNzbCA4Ci1jb250YWlucyBhIGJyaWVmIGRpc2N1c3Npb24gb2YgdGhlIERTQSBhbmQgUlNBIGFsZ29yaXRobXMuCi0uUHAKLVRoZSBmaWxlCi0uUGEgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cwotbGlzdHMgdGhlIHB1YmxpYyBrZXlzIHRoYXQgYXJlIHBlcm1pdHRlZCBmb3IgbG9nZ2luZyBpbi4KLVdoZW4gdGhlIHVzZXIgbG9ncyBpbiwgdGhlCi0uTm0KLXByb2dyYW0gdGVsbHMgdGhlIHNlcnZlciB3aGljaCBrZXkgcGFpciBpdCB3b3VsZCBsaWtlIHRvIHVzZSBmb3IKLWF1dGhlbnRpY2F0aW9uLgotVGhlIGNsaWVudCBwcm92ZXMgdGhhdCBpdCBoYXMgYWNjZXNzIHRvIHRoZSBwcml2YXRlIGtleQotYW5kIHRoZSBzZXJ2ZXIgY2hlY2tzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleQotaXMgYXV0aG9yaXplZCB0byBhY2NlcHQgdGhlIGFjY291bnQuCi0uUHAKLVRoZSB1c2VyIGNyZWF0ZXMgaGlzL2hlciBrZXkgcGFpciBieSBydW5uaW5nCi0uWHIgc3NoLWtleWdlbiAxIC4KLVRoaXMgc3RvcmVzIHRoZSBwcml2YXRlIGtleSBpbgotLlBhIH4vLnNzaC9pZGVudGl0eQotKHByb3RvY29sIDEpLAotLlBhIH4vLnNzaC9pZF9kc2EKLShwcm90b2NvbCAyIERTQSksCi0uUGEgfi8uc3NoL2lkX2VjZHNhCi0ocHJvdG9jb2wgMiBFQ0RTQSksCi1vcgotLlBhIH4vLnNzaC9pZF9yc2EKLShwcm90b2NvbCAyIFJTQSkKLWFuZCBzdG9yZXMgdGhlIHB1YmxpYyBrZXkgaW4KLS5QYSB+Ly5zc2gvaWRlbnRpdHkucHViCi0ocHJvdG9jb2wgMSksCi0uUGEgfi8uc3NoL2lkX2RzYS5wdWIKLShwcm90b2NvbCAyIERTQSksCi0uUGEgfi8uc3NoL2lkX2VjZHNhLnB1YgotKHByb3RvY29sIDIgRUNEU0EpLAotb3IKLS5QYSB+Ly5zc2gvaWRfcnNhLnB1YgotKHByb3RvY29sIDIgUlNBKQotaW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4KLVRoZSB1c2VyIHNob3VsZCB0aGVuIGNvcHkgdGhlIHB1YmxpYyBrZXkKLXRvCi0uUGEgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cwotaW4gaGlzL2hlciBob21lIGRpcmVjdG9yeSBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuCi1UaGUKLS5QYSBhdXRob3JpemVkX2tleXMKLWZpbGUgY29ycmVzcG9uZHMgdG8gdGhlIGNvbnZlbnRpb25hbAotLlBhIH4vLnJob3N0cwotZmlsZSwgYW5kIGhhcyBvbmUga2V5Ci1wZXIgbGluZSwgdGhvdWdoIHRoZSBsaW5lcyBjYW4gYmUgdmVyeSBsb25nLgotQWZ0ZXIgdGhpcywgdGhlIHVzZXIgY2FuIGxvZyBpbiB3aXRob3V0IGdpdmluZyB0aGUgcGFzc3dvcmQuCi0uUHAKLUEgdmFyaWF0aW9uIG9uIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24KLWlzIGF2YWlsYWJsZSBpbiB0aGUgZm9ybSBvZiBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbjoKLWluc3RlYWQgb2YgYSBzZXQgb2YgcHVibGljL3ByaXZhdGUga2V5cywKLXNpZ25lZCBjZXJ0aWZpY2F0ZXMgYXJlIHVzZWQuCi1UaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgYSBzaW5nbGUgdHJ1c3RlZCBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eQotY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgbWFueSBwdWJsaWMvcHJpdmF0ZSBrZXlzLgotU2VlIHRoZQotLlN4IENFUlRJRklDQVRFUwotc2VjdGlvbiBvZgotLlhyIHNzaC1rZXlnZW4gMQotZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0uUHAKLVRoZSBtb3N0IGNvbnZlbmllbnQgd2F5IHRvIHVzZSBwdWJsaWMga2V5IG9yIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uCi1tYXkgYmUgd2l0aCBhbiBhdXRoZW50aWNhdGlvbiBhZ2VudC4KLVNlZQotLlhyIHNzaC1hZ2VudCAxCi1mb3IgbW9yZSBpbmZvcm1hdGlvbi4KLS5QcAotQ2hhbGxlbmdlLXJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uIHdvcmtzIGFzIGZvbGxvd3M6Ci1UaGUgc2VydmVyIHNlbmRzIGFuIGFyYml0cmFyeQotLlFxIGNoYWxsZW5nZQotdGV4dCwgYW5kIHByb21wdHMgZm9yIGEgcmVzcG9uc2UuCi1Qcm90b2NvbCAyIGFsbG93cyBtdWx0aXBsZSBjaGFsbGVuZ2VzIGFuZCByZXNwb25zZXM7Ci1wcm90b2NvbCAxIGlzIHJlc3RyaWN0ZWQgdG8ganVzdCBvbmUgY2hhbGxlbmdlL3Jlc3BvbnNlLgotRXhhbXBsZXMgb2YgY2hhbGxlbmdlLXJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uIGluY2x1ZGUKLUJTRCBBdXRoZW50aWNhdGlvbiAoc2VlCi0uWHIgbG9naW4uY29uZiA1ICkKLWFuZCBQQU0gKHNvbWUgbm9uLU9wZW5CU0Qgc3lzdGVtcykuCi0uUHAKLUZpbmFsbHksIGlmIG90aGVyIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgZmFpbCwKLS5ObQotcHJvbXB0cyB0aGUgdXNlciBmb3IgYSBwYXNzd29yZC4KLVRoZSBwYXNzd29yZCBpcyBzZW50IHRvIHRoZSByZW1vdGUKLWhvc3QgZm9yIGNoZWNraW5nOyBob3dldmVyLCBzaW5jZSBhbGwgY29tbXVuaWNhdGlvbnMgYXJlIGVuY3J5cHRlZCwKLXRoZSBwYXNzd29yZCBjYW5ub3QgYmUgc2VlbiBieSBzb21lb25lIGxpc3RlbmluZyBvbiB0aGUgbmV0d29yay4KLS5QcAotLk5tCi1hdXRvbWF0aWNhbGx5IG1haW50YWlucyBhbmQgY2hlY2tzIGEgZGF0YWJhc2UgY29udGFpbmluZwotaWRlbnRpZmljYXRpb24gZm9yIGFsbCBob3N0cyBpdCBoYXMgZXZlciBiZWVuIHVzZWQgd2l0aC4KLUhvc3Qga2V5cyBhcmUgc3RvcmVkIGluCi0uUGEgfi8uc3NoL2tub3duX2hvc3RzCi1pbiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LgotQWRkaXRpb25hbGx5LCB0aGUgZmlsZQotLlBhIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cwotaXMgYXV0b21hdGljYWxseSBjaGVja2VkIGZvciBrbm93biBob3N0cy4KLUFueSBuZXcgaG9zdHMgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHVzZXIncyBmaWxlLgotSWYgYSBob3N0J3MgaWRlbnRpZmljYXRpb24gZXZlciBjaGFuZ2VzLAotLk5tCi13YXJucyBhYm91dCB0aGlzIGFuZCBkaXNhYmxlcyBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiB0byBwcmV2ZW50Ci1zZXJ2ZXIgc3Bvb2Zpbmcgb3IgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcywKLXdoaWNoIGNvdWxkIG90aGVyd2lzZSBiZSB1c2VkIHRvIGNpcmN1bXZlbnQgdGhlIGVuY3J5cHRpb24uCi1UaGUKLS5DbSBTdHJpY3RIb3N0S2V5Q2hlY2tpbmcKLW9wdGlvbiBjYW4gYmUgdXNlZCB0byBjb250cm9sIGxvZ2lucyB0byBtYWNoaW5lcyB3aG9zZQotaG9zdCBrZXkgaXMgbm90IGtub3duIG9yIGhhcyBjaGFuZ2VkLgotLlBwCi1XaGVuIHRoZSB1c2VyJ3MgaWRlbnRpdHkgaGFzIGJlZW4gYWNjZXB0ZWQgYnkgdGhlIHNlcnZlciwgdGhlIHNlcnZlcgotZWl0aGVyIGV4ZWN1dGVzIHRoZSBnaXZlbiBjb21tYW5kLCBvciBsb2dzIGludG8gdGhlIG1hY2hpbmUgYW5kIGdpdmVzCi10aGUgdXNlciBhIG5vcm1hbCBzaGVsbCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuCi1BbGwgY29tbXVuaWNhdGlvbiB3aXRoCi10aGUgcmVtb3RlIGNvbW1hbmQgb3Igc2hlbGwgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGVuY3J5cHRlZC4KLS5QcAotSWYgYSBwc2V1ZG8tdGVybWluYWwgaGFzIGJlZW4gYWxsb2NhdGVkIChub3JtYWwgbG9naW4gc2Vzc2lvbiksIHRoZQotdXNlciBtYXkgdXNlIHRoZSBlc2NhcGUgY2hhcmFjdGVycyBub3RlZCBiZWxvdy4KLS5QcAotSWYgbm8gcHNldWRvLXR0eSBoYXMgYmVlbiBhbGxvY2F0ZWQsCi10aGUgc2Vzc2lvbiBpcyB0cmFuc3BhcmVudCBhbmQgY2FuIGJlIHVzZWQgdG8gcmVsaWFibHkgdHJhbnNmZXIgYmluYXJ5IGRhdGEuCi1PbiBtb3N0IHN5c3RlbXMsIHNldHRpbmcgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgdG8KLS5EcSBub25lCi13aWxsIGFsc28gbWFrZSB0aGUgc2Vzc2lvbiB0cmFuc3BhcmVudCBldmVuIGlmIGEgdHR5IGlzIHVzZWQuCi0uUHAKLVRoZSBzZXNzaW9uIHRlcm1pbmF0ZXMgd2hlbiB0aGUgY29tbWFuZCBvciBzaGVsbCBvbiB0aGUgcmVtb3RlCi1tYWNoaW5lIGV4aXRzIGFuZCBhbGwgWDExIGFuZCBUQ1AgY29ubmVjdGlvbnMgaGF2ZSBiZWVuIGNsb3NlZC4KLS5TaCBFU0NBUEUgQ0hBUkFDVEVSUwotV2hlbiBhIHBzZXVkby10ZXJtaW5hbCBoYXMgYmVlbiByZXF1ZXN0ZWQsCi0uTm0KLXN1cHBvcnRzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0aHJvdWdoIHRoZSB1c2Ugb2YgYW4gZXNjYXBlIGNoYXJhY3Rlci4KLS5QcAotQSBzaW5nbGUgdGlsZGUgY2hhcmFjdGVyIGNhbiBiZSBzZW50IGFzCi0uSWMgfn4KLW9yIGJ5IGZvbGxvd2luZyB0aGUgdGlsZGUgYnkgYSBjaGFyYWN0ZXIgb3RoZXIgdGhhbiB0aG9zZSBkZXNjcmliZWQgYmVsb3cuCi1UaGUgZXNjYXBlIGNoYXJhY3RlciBtdXN0IGFsd2F5cyBmb2xsb3cgYSBuZXdsaW5lIHRvIGJlIGludGVycHJldGVkIGFzCi1zcGVjaWFsLgotVGhlIGVzY2FwZSBjaGFyYWN0ZXIgY2FuIGJlIGNoYW5nZWQgaW4gY29uZmlndXJhdGlvbiBmaWxlcyB1c2luZyB0aGUKLS5DbSBFc2NhcGVDaGFyCi1jb25maWd1cmF0aW9uIGRpcmVjdGl2ZSBvciBvbiB0aGUgY29tbWFuZCBsaW5lIGJ5IHRoZQotLkZsIGUKLW9wdGlvbi4KLS5QcAotVGhlIHN1cHBvcnRlZCBlc2NhcGVzIChhc3N1bWluZyB0aGUgZGVmYXVsdAotLlFsIH4gKQotYXJlOgotLkJsIC10YWcgLXdpZHRoIERzCi0uSXQgQ20gfi4KLURpc2Nvbm5lY3QuCi0uSXQgQ20gfl5aCi1CYWNrZ3JvdW5kCi0uTm0gLgotLkl0IENtIH4jCi1MaXN0IGZvcndhcmRlZCBjb25uZWN0aW9ucy4KLS5JdCBDbSB+JgotQmFja2dyb3VuZAotLk5tCi1hdCBsb2dvdXQgd2hlbiB3YWl0aW5nIGZvciBmb3J3YXJkZWQgY29ubmVjdGlvbiAvIFgxMSBzZXNzaW9ucyB0byB0ZXJtaW5hdGUuCi0uSXQgQ20gfj8KLURpc3BsYXkgYSBsaXN0IG9mIGVzY2FwZSBjaGFyYWN0ZXJzLgotLkl0IENtIH5CCi1TZW5kIGEgQlJFQUsgdG8gdGhlIHJlbW90ZSBzeXN0ZW0KLShvbmx5IHVzZWZ1bCBmb3IgU1NIIHByb3RvY29sIHZlcnNpb24gMiBhbmQgaWYgdGhlIHBlZXIgc3VwcG9ydHMgaXQpLgotLkl0IENtIH5DCi1PcGVuIGNvbW1hbmQgbGluZS4KLUN1cnJlbnRseSB0aGlzIGFsbG93cyB0aGUgYWRkaXRpb24gb2YgcG9ydCBmb3J3YXJkaW5ncyB1c2luZyB0aGUKLS5GbCBMICwKLS5GbCBSCi1hbmQKLS5GbCBECi1vcHRpb25zIChzZWUgYWJvdmUpLgotSXQgYWxzbyBhbGxvd3MgdGhlIGNhbmNlbGxhdGlvbiBvZiBleGlzdGluZyByZW1vdGUgcG9ydC1mb3J3YXJkaW5ncwotdXNpbmcKLS5TbSBvZmYKLS5GbCBLUiBPbyBBciBiaW5kX2FkZHJlc3MgOiBPYyBBciBwb3J0IC4KLS5TbSBvbgotLkljICFcJiBOcyBBciBjb21tYW5kCi1hbGxvd3MgdGhlIHVzZXIgdG8gZXhlY3V0ZSBhIGxvY2FsIGNvbW1hbmQgaWYgdGhlCi0uSWMgUGVybWl0TG9jYWxDb21tYW5kCi1vcHRpb24gaXMgZW5hYmxlZCBpbgotLlhyIHNzaF9jb25maWcgNSAuCi1CYXNpYyBoZWxwIGlzIGF2YWlsYWJsZSwgdXNpbmcgdGhlCi0uRmwgaAotb3B0aW9uLgotLkl0IENtIH5SCi1SZXF1ZXN0IHJla2V5aW5nIG9mIHRoZSBjb25uZWN0aW9uCi0ob25seSB1c2VmdWwgZm9yIFNTSCBwcm90b2NvbCB2ZXJzaW9uIDIgYW5kIGlmIHRoZSBwZWVyIHN1cHBvcnRzIGl0KS4KLS5FbAotLlNoIFRDUCBGT1JXQVJESU5HCi1Gb3J3YXJkaW5nIG9mIGFyYml0cmFyeSBUQ1AgY29ubmVjdGlvbnMgb3ZlciB0aGUgc2VjdXJlIGNoYW5uZWwgY2FuCi1iZSBzcGVjaWZpZWQgZWl0aGVyIG9uIHRoZSBjb21tYW5kIGxpbmUgb3IgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUuCi1PbmUgcG9zc2libGUgYXBwbGljYXRpb24gb2YgVENQIGZvcndhcmRpbmcgaXMgYSBzZWN1cmUgY29ubmVjdGlvbiB0byBhCi1tYWlsIHNlcnZlcjsgYW5vdGhlciBpcyBnb2luZyB0aHJvdWdoIGZpcmV3YWxscy4KLS5QcAotSW4gdGhlIGV4YW1wbGUgYmVsb3csIHdlIGxvb2sgYXQgZW5jcnlwdGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4KLWFuIElSQyBjbGllbnQgYW5kIHNlcnZlciwgZXZlbiB0aG91Z2ggdGhlIElSQyBzZXJ2ZXIgZG9lcyBub3QgZGlyZWN0bHkKLXN1cHBvcnQgZW5jcnlwdGVkIGNvbW11bmljYXRpb25zLgotVGhpcyB3b3JrcyBhcyBmb2xsb3dzOgotdGhlIHVzZXIgY29ubmVjdHMgdG8gdGhlIHJlbW90ZSBob3N0IHVzaW5nCi0uTm0gLAotc3BlY2lmeWluZyBhIHBvcnQgdG8gYmUgdXNlZCB0byBmb3J3YXJkIGNvbm5lY3Rpb25zCi10byB0aGUgcmVtb3RlIHNlcnZlci4KLUFmdGVyIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gc3RhcnQgdGhlIHNlcnZpY2Ugd2hpY2ggaXMgdG8gYmUgZW5jcnlwdGVkCi1vbiB0aGUgY2xpZW50IG1hY2hpbmUsCi1jb25uZWN0aW5nIHRvIHRoZSBzYW1lIGxvY2FsIHBvcnQsCi1hbmQKLS5ObQotd2lsbCBlbmNyeXB0IGFuZCBmb3J3YXJkIHRoZSBjb25uZWN0aW9uLgotLlBwCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgdHVubmVscyBhbiBJUkMgc2Vzc2lvbiBmcm9tIGNsaWVudCBtYWNoaW5lCi0uRHEgMTI3LjAuMC4xCi0obG9jYWxob3N0KQotdG8gcmVtb3RlIHNlcnZlcgotLkRxIHNlcnZlci5leGFtcGxlLmNvbSA6Ci0uQmQgLWxpdGVyYWwgLW9mZnNldCA0bgotJCBzc2ggLWYgLUwgMTIzNDpsb2NhbGhvc3Q6NjY2NyBzZXJ2ZXIuZXhhbXBsZS5jb20gc2xlZXAgMTAKLSQgaXJjIC1jICcjdXNlcnMnIC1wIDEyMzQgcGlua3kgMTI3LjAuMC4xCi0uRWQKLS5QcAotVGhpcyB0dW5uZWxzIGEgY29ubmVjdGlvbiB0byBJUkMgc2VydmVyCi0uRHEgc2VydmVyLmV4YW1wbGUuY29tICwKLWpvaW5pbmcgY2hhbm5lbAotLkRxICN1c2VycyAsCi1uaWNrbmFtZQotLkRxIHBpbmt5ICwKLXVzaW5nIHBvcnQgMTIzNC4KLUl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHBvcnQgaXMgdXNlZCwKLWFzIGxvbmcgYXMgaXQncyBncmVhdGVyIHRoYW4gMTAyMwotKHJlbWVtYmVyLCBvbmx5IHJvb3QgY2FuIG9wZW4gc29ja2V0cyBvbiBwcml2aWxlZ2VkIHBvcnRzKQotYW5kIGRvZXNuJ3QgY29uZmxpY3Qgd2l0aCBhbnkgcG9ydHMgYWxyZWFkeSBpbiB1c2UuCi1UaGUgY29ubmVjdGlvbiBpcyBmb3J3YXJkZWQgdG8gcG9ydCA2NjY3IG9uIHRoZSByZW1vdGUgc2VydmVyLAotc2luY2UgdGhhdCdzIHRoZSBzdGFuZGFyZCBwb3J0IGZvciBJUkMgc2VydmljZXMuCi0uUHAKLVRoZQotLkZsIGYKLW9wdGlvbiBiYWNrZ3JvdW5kcwotLk5tCi1hbmQgdGhlIHJlbW90ZSBjb21tYW5kCi0uRHEgc2xlZXAgMTAKLWlzIHNwZWNpZmllZCB0byBhbGxvdyBhbiBhbW91bnQgb2YgdGltZQotKDEwIHNlY29uZHMsIGluIHRoZSBleGFtcGxlKQotdG8gc3RhcnQgdGhlIHNlcnZpY2Ugd2hpY2ggaXMgdG8gYmUgdHVubmVsbGVkLgotSWYgbm8gY29ubmVjdGlvbnMgYXJlIG1hZGUgd2l0aGluIHRoZSB0aW1lIHNwZWNpZmllZCwKLS5ObQotd2lsbCBleGl0LgotLlNoIFgxMSBGT1JXQVJESU5HCi1JZiB0aGUKLS5DbSBGb3J3YXJkWDExCi12YXJpYWJsZSBpcyBzZXQgdG8KLS5EcSB5ZXMKLShvciBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZQotLkZsIFggLAotLkZsIHggLAotYW5kCi0uRmwgWQotb3B0aW9ucyBhYm92ZSkKLWFuZCB0aGUgdXNlciBpcyB1c2luZyBYMTEgKHRoZQotLkV2IERJU1BMQVkKLWVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCksIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBYMTEgZGlzcGxheSBpcwotYXV0b21hdGljYWxseSBmb3J3YXJkZWQgdG8gdGhlIHJlbW90ZSBzaWRlIGluIHN1Y2ggYSB3YXkgdGhhdCBhbnkgWDExCi1wcm9ncmFtcyBzdGFydGVkIGZyb20gdGhlIHNoZWxsIChvciBjb21tYW5kKSB3aWxsIGdvIHRocm91Z2ggdGhlCi1lbmNyeXB0ZWQgY2hhbm5lbCwgYW5kIHRoZSBjb25uZWN0aW9uIHRvIHRoZSByZWFsIFggc2VydmVyIHdpbGwgYmUgbWFkZQotZnJvbSB0aGUgbG9jYWwgbWFjaGluZS4KLVRoZSB1c2VyIHNob3VsZCBub3QgbWFudWFsbHkgc2V0Ci0uRXYgRElTUExBWSAuCi1Gb3J3YXJkaW5nIG9mIFgxMSBjb25uZWN0aW9ucyBjYW4gYmUKLWNvbmZpZ3VyZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBpbiBjb25maWd1cmF0aW9uIGZpbGVzLgotLlBwCi1UaGUKLS5FdiBESVNQTEFZCi12YWx1ZSBzZXQgYnkKLS5ObQotd2lsbCBwb2ludCB0byB0aGUgc2VydmVyIG1hY2hpbmUsIGJ1dCB3aXRoIGEgZGlzcGxheSBudW1iZXIgZ3JlYXRlciB0aGFuIHplcm8uCi1UaGlzIGlzIG5vcm1hbCwgYW5kIGhhcHBlbnMgYmVjYXVzZQotLk5tCi1jcmVhdGVzIGEKLS5EcSBwcm94eQotWCBzZXJ2ZXIgb24gdGhlIHNlcnZlciBtYWNoaW5lIGZvciBmb3J3YXJkaW5nIHRoZQotY29ubmVjdGlvbnMgb3ZlciB0aGUgZW5jcnlwdGVkIGNoYW5uZWwuCi0uUHAKLS5ObQotd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgc2V0IHVwIFhhdXRob3JpdHkgZGF0YSBvbiB0aGUgc2VydmVyIG1hY2hpbmUuCi1Gb3IgdGhpcyBwdXJwb3NlLCBpdCB3aWxsIGdlbmVyYXRlIGEgcmFuZG9tIGF1dGhvcml6YXRpb24gY29va2llLAotc3RvcmUgaXQgaW4gWGF1dGhvcml0eSBvbiB0aGUgc2VydmVyLCBhbmQgdmVyaWZ5IHRoYXQgYW55IGZvcndhcmRlZAotY29ubmVjdGlvbnMgY2FycnkgdGhpcyBjb29raWUgYW5kIHJlcGxhY2UgaXQgYnkgdGhlIHJlYWwgY29va2llIHdoZW4KLXRoZSBjb25uZWN0aW9uIGlzIG9wZW5lZC4KLVRoZSByZWFsIGF1dGhlbnRpY2F0aW9uIGNvb2tpZSBpcyBuZXZlcgotc2VudCB0byB0aGUgc2VydmVyIG1hY2hpbmUgKGFuZCBubyBjb29raWVzIGFyZSBzZW50IGluIHRoZSBwbGFpbikuCi0uUHAKLUlmIHRoZQotLkNtIEZvcndhcmRBZ2VudAotdmFyaWFibGUgaXMgc2V0IHRvCi0uRHEgeWVzCi0ob3Igc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKLS5GbCBBCi1hbmQKLS5GbCBhCi1vcHRpb25zIGFib3ZlKSBhbmQKLXRoZSB1c2VyIGlzIHVzaW5nIGFuIGF1dGhlbnRpY2F0aW9uIGFnZW50LCB0aGUgY29ubmVjdGlvbiB0byB0aGUgYWdlbnQKLWlzIGF1dG9tYXRpY2FsbHkgZm9yd2FyZGVkIHRvIHRoZSByZW1vdGUgc2lkZS4KLS5TaCBWRVJJRllJTkcgSE9TVCBLRVlTCi1XaGVuIGNvbm5lY3RpbmcgdG8gYSBzZXJ2ZXIgZm9yIHRoZSBmaXJzdCB0aW1lLAotYSBmaW5nZXJwcmludCBvZiB0aGUgc2VydmVyJ3MgcHVibGljIGtleSBpcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIKLSh1bmxlc3MgdGhlIG9wdGlvbgotLkNtIFN0cmljdEhvc3RLZXlDaGVja2luZwotaGFzIGJlZW4gZGlzYWJsZWQpLgotRmluZ2VycHJpbnRzIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nCi0uWHIgc3NoLWtleWdlbiAxIDoKLS5QcAotLkRsICQgc3NoLWtleWdlbiAtbCAtZiAvZXRjL3NzaC9zc2hfaG9zdF9yc2Ffa2V5Ci0uUHAKLUlmIHRoZSBmaW5nZXJwcmludCBpcyBhbHJlYWR5IGtub3duLCBpdCBjYW4gYmUgbWF0Y2hlZAotYW5kIHRoZSBrZXkgY2FuIGJlIGFjY2VwdGVkIG9yIHJlamVjdGVkLgotQmVjYXVzZSBvZiB0aGUgZGlmZmljdWx0eSBvZiBjb21wYXJpbmcgaG9zdCBrZXlzCi1qdXN0IGJ5IGxvb2tpbmcgYXQgaGV4IHN0cmluZ3MsCi10aGVyZSBpcyBhbHNvIHN1cHBvcnQgdG8gY29tcGFyZSBob3N0IGtleXMgdmlzdWFsbHksCi11c2luZwotLkVtIHJhbmRvbSBhcnQgLgotQnkgc2V0dGluZyB0aGUKLS5DbSBWaXN1YWxIb3N0S2V5Ci1vcHRpb24gdG8KLS5EcSB5ZXMgLAotYSBzbWFsbCBBU0NJSSBncmFwaGljIGdldHMgZGlzcGxheWVkIG9uIGV2ZXJ5IGxvZ2luIHRvIGEgc2VydmVyLCBubyBtYXR0ZXIKLWlmIHRoZSBzZXNzaW9uIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBvciBub3QuCi1CeSBsZWFybmluZyB0aGUgcGF0dGVybiBhIGtub3duIHNlcnZlciBwcm9kdWNlcywgYSB1c2VyIGNhbiBlYXNpbHkKLWZpbmQgb3V0IHRoYXQgdGhlIGhvc3Qga2V5IGhhcyBjaGFuZ2VkIHdoZW4gYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBwYXR0ZXJuCi1pcyBkaXNwbGF5ZWQuCi1CZWNhdXNlIHRoZXNlIHBhdHRlcm5zIGFyZSBub3QgdW5hbWJpZ3VvdXMgaG93ZXZlciwgYSBwYXR0ZXJuIHRoYXQgbG9va3MKLXNpbWlsYXIgdG8gdGhlIHBhdHRlcm4gcmVtZW1iZXJlZCBvbmx5IGdpdmVzIGEgZ29vZCBwcm9iYWJpbGl0eSB0aGF0IHRoZQotaG9zdCBrZXkgaXMgdGhlIHNhbWUsIG5vdCBndWFyYW50ZWVkIHByb29mLgotLlBwCi1UbyBnZXQgYSBsaXN0aW5nIG9mIHRoZSBmaW5nZXJwcmludHMgYWxvbmcgd2l0aCB0aGVpciByYW5kb20gYXJ0IGZvcgotYWxsIGtub3duIGhvc3RzLCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZSBjYW4gYmUgdXNlZDoKLS5QcAotLkRsICQgc3NoLWtleWdlbiAtbHYgLWYgfi8uc3NoL2tub3duX2hvc3RzCi0uUHAKLUlmIHRoZSBmaW5nZXJwcmludCBpcyB1bmtub3duLAotYW4gYWx0ZXJuYXRpdmUgbWV0aG9kIG9mIHZlcmlmaWNhdGlvbiBpcyBhdmFpbGFibGU6Ci1TU0ggZmluZ2VycHJpbnRzIHZlcmlmaWVkIGJ5IEROUy4KLUFuIGFkZGl0aW9uYWwgcmVzb3VyY2UgcmVjb3JkIChSUiksCi1TU0hGUCwKLWlzIGFkZGVkIHRvIGEgem9uZWZpbGUKLWFuZCB0aGUgY29ubmVjdGluZyBjbGllbnQgaXMgYWJsZSB0byBtYXRjaCB0aGUgZmluZ2VycHJpbnQKLXdpdGggdGhhdCBvZiB0aGUga2V5IHByZXNlbnRlZC4KLS5QcAotSW4gdGhpcyBleGFtcGxlLCB3ZSBhcmUgY29ubmVjdGluZyBhIGNsaWVudCB0byBhIHNlcnZlciwKLS5EcSBob3N0LmV4YW1wbGUuY29tIC4KLVRoZSBTU0hGUCByZXNvdXJjZSByZWNvcmRzIHNob3VsZCBmaXJzdCBiZSBhZGRlZCB0byB0aGUgem9uZWZpbGUgZm9yCi1ob3N0LmV4YW1wbGUuY29tOgotLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50Ci0kIHNzaC1rZXlnZW4gLXIgaG9zdC5leGFtcGxlLmNvbS4KLS5FZAotLlBwCi1UaGUgb3V0cHV0IGxpbmVzIHdpbGwgaGF2ZSB0byBiZSBhZGRlZCB0byB0aGUgem9uZWZpbGUuCi1UbyBjaGVjayB0aGF0IHRoZSB6b25lIGlzIGFuc3dlcmluZyBmaW5nZXJwcmludCBxdWVyaWVzOgotLlBwCi0uRGwgJCBkaWcgLXQgU1NIRlAgaG9zdC5leGFtcGxlLmNvbQotLlBwCi1GaW5hbGx5IHRoZSBjbGllbnQgY29ubmVjdHM6Ci0uQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKLSQgc3NoIC1vICJWZXJpZnlIb3N0S2V5RE5TIGFzayIgaG9zdC5leGFtcGxlLmNvbQotWy4uLl0KLU1hdGNoaW5nIGhvc3Qga2V5IGZpbmdlcnByaW50IGZvdW5kIGluIEROUy4KLUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZSBjb25uZWN0aW5nICh5ZXMvbm8pPwotLkVkCi0uUHAKLVNlZSB0aGUKLS5DbSBWZXJpZnlIb3N0S2V5RE5TCi1vcHRpb24gaW4KLS5YciBzc2hfY29uZmlnIDUKLWZvciBtb3JlIGluZm9ybWF0aW9uLgotLlNoIFNTSC1CQVNFRCBWSVJUVUFMIFBSSVZBVEUgTkVUV09SS1MKLS5ObQotY29udGFpbnMgc3VwcG9ydCBmb3IgVmlydHVhbCBQcml2YXRlIE5ldHdvcmsgKFZQTikgdHVubmVsbGluZwotdXNpbmcgdGhlCi0uWHIgdHVuIDQKLW5ldHdvcmsgcHNldWRvLWRldmljZSwKLWFsbG93aW5nIHR3byBuZXR3b3JrcyB0byBiZSBqb2luZWQgc2VjdXJlbHkuCi1UaGUKLS5YciBzc2hkX2NvbmZpZyA1Ci1jb25maWd1cmF0aW9uIG9wdGlvbgotLkNtIFBlcm1pdFR1bm5lbAotY29udHJvbHMgd2hldGhlciB0aGUgc2VydmVyIHN1cHBvcnRzIHRoaXMsCi1hbmQgYXQgd2hhdCBsZXZlbCAobGF5ZXIgMiBvciAzIHRyYWZmaWMpLgotLlBwCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgd291bGQgY29ubmVjdCBjbGllbnQgbmV0d29yayAxMC4wLjUwLjAvMjQKLXdpdGggcmVtb3RlIG5ldHdvcmsgMTAuMC45OS4wLzI0IHVzaW5nIGEgcG9pbnQtdG8tcG9pbnQgY29ubmVjdGlvbgotZnJvbSAxMC4xLjEuMSB0byAxMC4xLjEuMiwKLXByb3ZpZGVkIHRoYXQgdGhlIFNTSCBzZXJ2ZXIgcnVubmluZyBvbiB0aGUgZ2F0ZXdheSB0byB0aGUgcmVtb3RlIG5ldHdvcmssCi1hdCAxOTIuMTY4LjEuMTUsIGFsbG93cyBpdC4KLS5QcAotT24gdGhlIGNsaWVudDoKLS5CZCAtbGl0ZXJhbCAtb2Zmc2V0IGluZGVudAotIyBzc2ggLWYgLXcgMDoxIDE5Mi4xNjguMS4xNSB0cnVlCi0jIGlmY29uZmlnIHR1bjAgMTAuMS4xLjEgMTAuMS4xLjIgbmV0bWFzayAyNTUuMjU1LjI1NS4yNTIKLSMgcm91dGUgYWRkIDEwLjAuOTkuMC8yNCAxMC4xLjEuMgotLkVkCi0uUHAKLU9uIHRoZSBzZXJ2ZXI6Ci0uQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKLSMgaWZjb25maWcgdHVuMSAxMC4xLjEuMiAxMC4xLjEuMSBuZXRtYXNrIDI1NS4yNTUuMjU1LjI1MgotIyByb3V0ZSBhZGQgMTAuMC41MC4wLzI0IDEwLjEuMS4xCi0uRWQKLS5QcAotQ2xpZW50IGFjY2VzcyBtYXkgYmUgbW9yZSBmaW5lbHkgdHVuZWQgdmlhIHRoZQotLlBhIC9yb290Ly5zc2gvYXV0aG9yaXplZF9rZXlzCi1maWxlIChzZWUgYmVsb3cpIGFuZCB0aGUKLS5DbSBQZXJtaXRSb290TG9naW4KLXNlcnZlciBvcHRpb24uCi1UaGUgZm9sbG93aW5nIGVudHJ5IHdvdWxkIHBlcm1pdCBjb25uZWN0aW9ucyBvbgotLlhyIHR1biA0Ci1kZXZpY2UgMSBmcm9tIHVzZXIKLS5EcSBqYW5lCi1hbmQgb24gdHVuIGRldmljZSAyIGZyb20gdXNlcgotLkRxIGpvaG4gLAotaWYKLS5DbSBQZXJtaXRSb290TG9naW4KLWlzIHNldCB0bwotLkRxIGZvcmNlZC1jb21tYW5kcy1vbmx5IDoKLS5CZCAtbGl0ZXJhbCAtb2Zmc2V0IDJuCi10dW5uZWw9IjEiLGNvbW1hbmQ9InNoIC9ldGMvbmV0c3RhcnQgdHVuMSIgc3NoLXJzYSAuLi4gamFuZQotdHVubmVsPSIyIixjb21tYW5kPSJzaCAvZXRjL25ldHN0YXJ0IHR1bjIiIHNzaC1yc2EgLi4uIGpvaG4KLS5FZAotLlBwCi1TaW5jZSBhbiBTU0gtYmFzZWQgc2V0dXAgZW50YWlscyBhIGZhaXIgYW1vdW50IG9mIG92ZXJoZWFkLAotaXQgbWF5IGJlIG1vcmUgc3VpdGVkIHRvIHRlbXBvcmFyeSBzZXR1cHMsCi1zdWNoIGFzIGZvciB3aXJlbGVzcyBWUE5zLgotTW9yZSBwZXJtYW5lbnQgVlBOcyBhcmUgYmV0dGVyIHByb3ZpZGVkIGJ5IHRvb2xzIHN1Y2ggYXMKLS5YciBpcHNlY2N0bCA4Ci1hbmQKLS5YciBpc2FrbXBkIDggLgotLlNoIEVOVklST05NRU5UCi0uTm0KLXdpbGwgbm9ybWFsbHkgc2V0IHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOgotLkJsIC10YWcgLXdpZHRoICJTU0hfT1JJR0lOQUxfQ09NTUFORCIKLS5JdCBFdiBESVNQTEFZCi1UaGUKLS5FdiBESVNQTEFZCi12YXJpYWJsZSBpbmRpY2F0ZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBYMTEgc2VydmVyLgotSXQgaXMgYXV0b21hdGljYWxseSBzZXQgYnkKLS5ObQotdG8gcG9pbnQgdG8gYSB2YWx1ZSBvZiB0aGUgZm9ybQotLkRxIGhvc3RuYW1lOm4gLAotd2hlcmUKLS5EcSBob3N0bmFtZQotaW5kaWNhdGVzIHRoZSBob3N0IHdoZXJlIHRoZSBzaGVsbCBydW5zLCBhbmQKLS5TcSBuCi1pcyBhbiBpbnRlZ2VyIFwqKEdlIDEuCi0uTm0KLXVzZXMgdGhpcyBzcGVjaWFsIHZhbHVlIHRvIGZvcndhcmQgWDExIGNvbm5lY3Rpb25zIG92ZXIgdGhlIHNlY3VyZQotY2hhbm5lbC4KLVRoZSB1c2VyIHNob3VsZCBub3JtYWxseSBub3Qgc2V0Ci0uRXYgRElTUExBWQotZXhwbGljaXRseSwgYXMgdGhhdAotd2lsbCByZW5kZXIgdGhlIFgxMSBjb25uZWN0aW9uIGluc2VjdXJlIChhbmQgd2lsbCByZXF1aXJlIHRoZSB1c2VyIHRvCi1tYW51YWxseSBjb3B5IGFueSByZXF1aXJlZCBhdXRob3JpemF0aW9uIGNvb2tpZXMpLgotLkl0IEV2IEhPTUUKLVNldCB0byB0aGUgcGF0aCBvZiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LgotLkl0IEV2IExPR05BTUUKLVN5bm9ueW0gZm9yCi0uRXYgVVNFUiA7Ci1zZXQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzeXN0ZW1zIHRoYXQgdXNlIHRoaXMgdmFyaWFibGUuCi0uSXQgRXYgTUFJTAotU2V0IHRvIHRoZSBwYXRoIG9mIHRoZSB1c2VyJ3MgbWFpbGJveC4KLS5JdCBFdiBQQVRICi1TZXQgdG8gdGhlIGRlZmF1bHQKLS5FdiBQQVRIICwKLWFzIHNwZWNpZmllZCB3aGVuIGNvbXBpbGluZwotLk5tIC4KLS5JdCBFdiBTU0hfQVNLUEFTUwotSWYKLS5ObQotbmVlZHMgYSBwYXNzcGhyYXNlLCBpdCB3aWxsIHJlYWQgdGhlIHBhc3NwaHJhc2UgZnJvbSB0aGUgY3VycmVudAotdGVybWluYWwgaWYgaXQgd2FzIHJ1biBmcm9tIGEgdGVybWluYWwuCi1JZgotLk5tCi1kb2VzIG5vdCBoYXZlIGEgdGVybWluYWwgYXNzb2NpYXRlZCB3aXRoIGl0IGJ1dAotLkV2IERJU1BMQVkKLWFuZAotLkV2IFNTSF9BU0tQQVNTCi1hcmUgc2V0LCBpdCB3aWxsIGV4ZWN1dGUgdGhlIHByb2dyYW0gc3BlY2lmaWVkIGJ5Ci0uRXYgU1NIX0FTS1BBU1MKLWFuZCBvcGVuIGFuIFgxMSB3aW5kb3cgdG8gcmVhZCB0aGUgcGFzc3BocmFzZS4KLVRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIGNhbGxpbmcKLS5ObQotZnJvbSBhCi0uUGEgLnhzZXNzaW9uCi1vciByZWxhdGVkIHNjcmlwdC4KLShOb3RlIHRoYXQgb24gc29tZSBtYWNoaW5lcyBpdAotbWF5IGJlIG5lY2Vzc2FyeSB0byByZWRpcmVjdCB0aGUgaW5wdXQgZnJvbQotLlBhIC9kZXYvbnVsbAotdG8gbWFrZSB0aGlzIHdvcmsuKQotLkl0IEV2IFNTSF9BVVRIX1NPQ0sKLUlkZW50aWZpZXMgdGhlIHBhdGggb2YgYQotLlV4IE5zIC1kb21haW4KLXNvY2tldCB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGFnZW50LgotLkl0IEV2IFNTSF9DT05ORUNUSU9OCi1JZGVudGlmaWVzIHRoZSBjbGllbnQgYW5kIHNlcnZlciBlbmRzIG9mIHRoZSBjb25uZWN0aW9uLgotVGhlIHZhcmlhYmxlIGNvbnRhaW5zCi1mb3VyIHNwYWNlLXNlcGFyYXRlZCB2YWx1ZXM6IGNsaWVudCBJUCBhZGRyZXNzLCBjbGllbnQgcG9ydCBudW1iZXIsCi1zZXJ2ZXIgSVAgYWRkcmVzcywgYW5kIHNlcnZlciBwb3J0IG51bWJlci4KLS5JdCBFdiBTU0hfT1JJR0lOQUxfQ09NTUFORAotVGhpcyB2YXJpYWJsZSBjb250YWlucyB0aGUgb3JpZ2luYWwgY29tbWFuZCBsaW5lIGlmIGEgZm9yY2VkIGNvbW1hbmQKLWlzIGV4ZWN1dGVkLgotSXQgY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCB0aGUgb3JpZ2luYWwgYXJndW1lbnRzLgotLkl0IEV2IFNTSF9UVFkKLVRoaXMgaXMgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSB0dHkgKHBhdGggdG8gdGhlIGRldmljZSkgYXNzb2NpYXRlZAotd2l0aCB0aGUgY3VycmVudCBzaGVsbCBvciBjb21tYW5kLgotSWYgdGhlIGN1cnJlbnQgc2Vzc2lvbiBoYXMgbm8gdHR5LAotdGhpcyB2YXJpYWJsZSBpcyBub3Qgc2V0LgotLkl0IEV2IFRaCi1UaGlzIHZhcmlhYmxlIGlzIHNldCB0byBpbmRpY2F0ZSB0aGUgcHJlc2VudCB0aW1lIHpvbmUgaWYgaXQKLXdhcyBzZXQgd2hlbiB0aGUgZGFlbW9uIHdhcyBzdGFydGVkIChpLmUuIHRoZSBkYWVtb24gcGFzc2VzIHRoZSB2YWx1ZQotb24gdG8gbmV3IGNvbm5lY3Rpb25zKS4KLS5JdCBFdiBVU0VSCi1TZXQgdG8gdGhlIG5hbWUgb2YgdGhlIHVzZXIgbG9nZ2luZyBpbi4KLS5FbAotLlBwCi1BZGRpdGlvbmFsbHksCi0uTm0KLXJlYWRzCi0uUGEgfi8uc3NoL2Vudmlyb25tZW50ICwKLWFuZCBhZGRzIGxpbmVzIG9mIHRoZSBmb3JtYXQKLS5EcSBWQVJOQU1FPXZhbHVlCi10byB0aGUgZW52aXJvbm1lbnQgaWYgdGhlIGZpbGUgZXhpc3RzIGFuZCB1c2VycyBhcmUgYWxsb3dlZCB0bwotY2hhbmdlIHRoZWlyIGVudmlyb25tZW50LgotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUKLS5DbSBQZXJtaXRVc2VyRW52aXJvbm1lbnQKLW9wdGlvbiBpbgotLlhyIHNzaGRfY29uZmlnIDUgLgotLlNoIEZJTEVTCi0uQmwgLXRhZyAtd2lkdGggRHMgLWNvbXBhY3QKLS5JdCBQYSB+Ly5yaG9zdHMKLVRoaXMgZmlsZSBpcyB1c2VkIGZvciBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIChzZWUgYWJvdmUpLgotT24gc29tZSBtYWNoaW5lcyB0aGlzIGZpbGUgbWF5IG5lZWQgdG8gYmUKLXdvcmxkLXJlYWRhYmxlIGlmIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgaXMgb24gYW4gTkZTIHBhcnRpdGlvbiwKLWJlY2F1c2UKLS5YciBzc2hkIDgKLXJlYWRzIGl0IGFzIHJvb3QuCi1BZGRpdGlvbmFsbHksIHRoaXMgZmlsZSBtdXN0IGJlIG93bmVkIGJ5IHRoZSB1c2VyLAotYW5kIG11c3Qgbm90IGhhdmUgd3JpdGUgcGVybWlzc2lvbnMgZm9yIGFueW9uZSBlbHNlLgotVGhlIHJlY29tbWVuZGVkCi1wZXJtaXNzaW9uIGZvciBtb3N0IG1hY2hpbmVzIGlzIHJlYWQvd3JpdGUgZm9yIHRoZSB1c2VyLCBhbmQgbm90Ci1hY2Nlc3NpYmxlIGJ5IG90aGVycy4KLS5QcAotLkl0IFBhIH4vLnNob3N0cwotVGhpcyBmaWxlIGlzIHVzZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMKLS5QYSAucmhvc3RzICwKLWJ1dCBhbGxvd3MgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiB3aXRob3V0IHBlcm1pdHRpbmcgbG9naW4gd2l0aAotcmxvZ2luL3JzaC4KLS5QcAotLkl0IFBhIH4vLnNzaC8KLVRoaXMgZGlyZWN0b3J5IGlzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGZvciBhbGwgdXNlci1zcGVjaWZpYyBjb25maWd1cmF0aW9uCi1hbmQgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uCi1UaGVyZSBpcyBubyBnZW5lcmFsIHJlcXVpcmVtZW50IHRvIGtlZXAgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeQotc2VjcmV0LCBidXQgdGhlIHJlY29tbWVuZGVkIHBlcm1pc3Npb25zIGFyZSByZWFkL3dyaXRlL2V4ZWN1dGUgZm9yIHRoZSB1c2VyLAotYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KLS5QcAotLkl0IFBhIH4vLnNzaC9hdXRob3JpemVkX2tleXMKLUxpc3RzIHRoZSBwdWJsaWMga2V5cyAoRFNBL0VDRFNBL1JTQSkgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9nZ2luZyBpbiBhcwotdGhpcyB1c2VyLgotVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgZGVzY3JpYmVkIGluIHRoZQotLlhyIHNzaGQgOAotbWFudWFsIHBhZ2UuCi1UaGlzIGZpbGUgaXMgbm90IGhpZ2hseSBzZW5zaXRpdmUsIGJ1dCB0aGUgcmVjb21tZW5kZWQKLXBlcm1pc3Npb25zIGFyZSByZWFkL3dyaXRlIGZvciB0aGUgdXNlciwgYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KLS5QcAotLkl0IFBhIH4vLnNzaC9jb25maWcKLVRoaXMgaXMgdGhlIHBlci11c2VyIGNvbmZpZ3VyYXRpb24gZmlsZS4KLVRoZSBmaWxlIGZvcm1hdCBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBkZXNjcmliZWQgaW4KLS5YciBzc2hfY29uZmlnIDUgLgotQmVjYXVzZSBvZiB0aGUgcG90ZW50aWFsIGZvciBhYnVzZSwgdGhpcyBmaWxlIG11c3QgaGF2ZSBzdHJpY3QgcGVybWlzc2lvbnM6Ci1yZWFkL3dyaXRlIGZvciB0aGUgdXNlciwgYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KLS5QcAotLkl0IFBhIH4vLnNzaC9lbnZpcm9ubWVudAotQ29udGFpbnMgYWRkaXRpb25hbCBkZWZpbml0aW9ucyBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzOyBzZWUKLS5TeCBFTlZJUk9OTUVOVCAsCi1hYm92ZS4KLS5QcAotLkl0IFBhIH4vLnNzaC9pZGVudGl0eQotLkl0IFBhIH4vLnNzaC9pZF9kc2EKLS5JdCBQYSB+Ly5zc2gvaWRfZWNkc2EKLS5JdCBQYSB+Ly5zc2gvaWRfcnNhCi1Db250YWlucyB0aGUgcHJpdmF0ZSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uLgotVGhlc2UgZmlsZXMKLWNvbnRhaW4gc2Vuc2l0aXZlIGRhdGEgYW5kIHNob3VsZCBiZSByZWFkYWJsZSBieSB0aGUgdXNlciBidXQgbm90Ci1hY2Nlc3NpYmxlIGJ5IG90aGVycyAocmVhZC93cml0ZS9leGVjdXRlKS4KLS5ObQotd2lsbCBzaW1wbHkgaWdub3JlIGEgcHJpdmF0ZSBrZXkgZmlsZSBpZiBpdCBpcyBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KLUl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBwYXNzcGhyYXNlIHdoZW4KLWdlbmVyYXRpbmcgdGhlIGtleSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUKLXNlbnNpdGl2ZSBwYXJ0IG9mIHRoaXMgZmlsZSB1c2luZyAzREVTLgotLlBwCi0uSXQgUGEgfi8uc3NoL2lkZW50aXR5LnB1YgotLkl0IFBhIH4vLnNzaC9pZF9kc2EucHViCi0uSXQgUGEgfi8uc3NoL2lkX2VjZHNhLnB1YgotLkl0IFBhIH4vLnNzaC9pZF9yc2EucHViCi1Db250YWlucyB0aGUgcHVibGljIGtleSBmb3IgYXV0aGVudGljYXRpb24uCi1UaGVzZSBmaWxlcyBhcmUgbm90Ci1zZW5zaXRpdmUgYW5kIGNhbiAoYnV0IG5lZWQgbm90KSBiZSByZWFkYWJsZSBieSBhbnlvbmUuCi0uUHAKLS5JdCBQYSB+Ly5zc2gva25vd25faG9zdHMKLUNvbnRhaW5zIGEgbGlzdCBvZiBob3N0IGtleXMgZm9yIGFsbCBob3N0cyB0aGUgdXNlciBoYXMgbG9nZ2VkIGludG8KLXRoYXQgYXJlIG5vdCBhbHJlYWR5IGluIHRoZSBzeXN0ZW13aWRlIGxpc3Qgb2Yga25vd24gaG9zdCBrZXlzLgotU2VlCi0uWHIgc3NoZCA4Ci1mb3IgZnVydGhlciBkZXRhaWxzIG9mIHRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlLgotLlBwCi0uSXQgUGEgfi8uc3NoL3JjCi1Db21tYW5kcyBpbiB0aGlzIGZpbGUgYXJlIGV4ZWN1dGVkIGJ5Ci0uTm0KLXdoZW4gdGhlIHVzZXIgbG9ncyBpbiwganVzdCBiZWZvcmUgdGhlIHVzZXIncyBzaGVsbCAob3IgY29tbWFuZCkgaXMKLXN0YXJ0ZWQuCi1TZWUgdGhlCi0uWHIgc3NoZCA4Ci1tYW51YWwgcGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLS5QcAotLkl0IFBhIC9ldGMvaG9zdHMuZXF1aXYKLVRoaXMgZmlsZSBpcyBmb3IgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiAoc2VlIGFib3ZlKS4KLUl0IHNob3VsZCBvbmx5IGJlIHdyaXRhYmxlIGJ5IHJvb3QuCi0uUHAKLS5JdCBQYSAvZXRjL3Nob3N0cy5lcXVpdgotVGhpcyBmaWxlIGlzIHVzZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMKLS5QYSBob3N0cy5lcXVpdiAsCi1idXQgYWxsb3dzIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24gd2l0aG91dCBwZXJtaXR0aW5nIGxvZ2luIHdpdGgKLXJsb2dpbi9yc2guCi0uUHAKLS5JdCBQYSAvZXRjL3NzaC9zc2hfY29uZmlnCi1TeXN0ZW13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLVRoZSBmaWxlIGZvcm1hdCBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBkZXNjcmliZWQgaW4KLS5YciBzc2hfY29uZmlnIDUgLgotLlBwCi0uSXQgUGEgL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5Ci0uSXQgUGEgL2V0Yy9zc2gvc3NoX2hvc3RfZHNhX2tleQotLkl0IFBhIC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleQotLkl0IFBhIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkKLVRoZXNlIHRocmVlIGZpbGVzIGNvbnRhaW4gdGhlIHByaXZhdGUgcGFydHMgb2YgdGhlIGhvc3Qga2V5cwotYW5kIGFyZSB1c2VkIGZvciBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uLgotSWYgcHJvdG9jb2wgdmVyc2lvbiAxIGlzIHVzZWQsCi0uTm0KLW11c3QgYmUgc2V0dWlkIHJvb3QsIHNpbmNlIHRoZSBob3N0IGtleSBpcyByZWFkYWJsZSBvbmx5IGJ5IHJvb3QuCi1Gb3IgcHJvdG9jb2wgdmVyc2lvbiAyLAotLk5tCi11c2VzCi0uWHIgc3NoLWtleXNpZ24gOAotdG8gYWNjZXNzIHRoZSBob3N0IGtleXMsCi1lbGltaW5hdGluZyB0aGUgcmVxdWlyZW1lbnQgdGhhdAotLk5tCi1iZSBzZXR1aWQgcm9vdCB3aGVuIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24gaXMgdXNlZC4KLUJ5IGRlZmF1bHQKLS5ObQotaXMgbm90IHNldHVpZCByb290LgotLlBwCi0uSXQgUGEgL2V0Yy9zc2gvc3NoX2tub3duX2hvc3RzCi1TeXN0ZW13aWRlIGxpc3Qgb2Yga25vd24gaG9zdCBrZXlzLgotVGhpcyBmaWxlIHNob3VsZCBiZSBwcmVwYXJlZCBieSB0aGUKLXN5c3RlbSBhZG1pbmlzdHJhdG9yIHRvIGNvbnRhaW4gdGhlIHB1YmxpYyBob3N0IGtleXMgb2YgYWxsIG1hY2hpbmVzIGluIHRoZQotb3JnYW5pemF0aW9uLgotSXQgc2hvdWxkIGJlIHdvcmxkLXJlYWRhYmxlLgotU2VlCi0uWHIgc3NoZCA4Ci1mb3IgZnVydGhlciBkZXRhaWxzIG9mIHRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlLgotLlBwCi0uSXQgUGEgL2V0Yy9zc2gvc3NocmMKLUNvbW1hbmRzIGluIHRoaXMgZmlsZSBhcmUgZXhlY3V0ZWQgYnkKLS5ObQotd2hlbiB0aGUgdXNlciBsb2dzIGluLCBqdXN0IGJlZm9yZSB0aGUgdXNlcidzIHNoZWxsIChvciBjb21tYW5kKSBpcyBzdGFydGVkLgotU2VlIHRoZQotLlhyIHNzaGQgOAotbWFudWFsIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0uRWwKLS5TaCBFWElUIFNUQVRVUwotLk5tCi1leGl0cyB3aXRoIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgcmVtb3RlIGNvbW1hbmQgb3Igd2l0aCAyNTUKLWlmIGFuIGVycm9yIG9jY3VycmVkLgotLlNoIFNFRSBBTFNPCi0uWHIgc2NwIDEgLAotLlhyIHNmdHAgMSAsCi0uWHIgc3NoLWFkZCAxICwKLS5YciBzc2gtYWdlbnQgMSAsCi0uWHIgc3NoLWtleWdlbiAxICwKLS5YciBzc2gta2V5c2NhbiAxICwKLS5YciB0dW4gNCAsCi0uWHIgaG9zdHMuZXF1aXYgNSAsCi0uWHIgc3NoX2NvbmZpZyA1ICwKLS5YciBzc2gta2V5c2lnbiA4ICwKLS5YciBzc2hkIDgKLS5ScwotLiVSIFJGQyA0MjUwCi0uJVQgIlRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgUHJvdG9jb2wgQXNzaWduZWQgTnVtYmVycyIKLS4lRCAyMDA2Ci0uUmUKLS5ScwotLiVSIFJGQyA0MjUxCi0uJVQgIlRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgUHJvdG9jb2wgQXJjaGl0ZWN0dXJlIgotLiVEIDIwMDYKLS5SZQotLlJzCi0uJVIgUkZDIDQyNTIKLS4lVCAiVGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCIKLS4lRCAyMDA2Ci0uUmUKLS5ScwotLiVSIFJGQyA0MjUzCi0uJVQgIlRoZSBTZWN1cmUgU2hlbGwgKFNTSCkgVHJhbnNwb3J0IExheWVyIFByb3RvY29sIgotLiVEIDIwMDYKLS5SZQotLlJzCi0uJVIgUkZDIDQyNTQKLS4lVCAiVGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBDb25uZWN0aW9uIFByb3RvY29sIgotLiVEIDIwMDYKLS5SZQotLlJzCi0uJVIgUkZDIDQyNTUKLS4lVCAiVXNpbmcgRE5TIHRvIFNlY3VyZWx5IFB1Ymxpc2ggU2VjdXJlIFNoZWxsIChTU0gpIEtleSBGaW5nZXJwcmludHMiCi0uJUQgMjAwNgotLlJlCi0uUnMKLS4lUiBSRkMgNDI1NgotLiVUICJHZW5lcmljIE1lc3NhZ2UgRXhjaGFuZ2UgQXV0aGVudGljYXRpb24gZm9yIHRoZSBTZWN1cmUgU2hlbGwgUHJvdG9jb2wgKFNTSCkiCi0uJUQgMjAwNgotLlJlCi0uUnMKLS4lUiBSRkMgNDMzNQotLiVUICJUaGUgU2VjdXJlIFNoZWxsIChTU0gpIFNlc3Npb24gQ2hhbm5lbCBCcmVhayBFeHRlbnNpb24iCi0uJUQgMjAwNgotLlJlCi0uUnMKLS4lUiBSRkMgNDM0NAotLiVUICJUaGUgU2VjdXJlIFNoZWxsIChTU0gpIFRyYW5zcG9ydCBMYXllciBFbmNyeXB0aW9uIE1vZGVzIgotLiVEIDIwMDYKLS5SZQotLlJzCi0uJVIgUkZDIDQzNDUKLS4lVCAiSW1wcm92ZWQgQXJjZm91ciBNb2RlcyBmb3IgdGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBUcmFuc3BvcnQgTGF5ZXIgUHJvdG9jb2wiCi0uJUQgMjAwNgotLlJlCi0uUnMKLS4lUiBSRkMgNDQxOQotLiVUICJEaWZmaWUtSGVsbG1hbiBHcm91cCBFeGNoYW5nZSBmb3IgdGhlIFNlY3VyZSBTaGVsbCAoU1NIKSBUcmFuc3BvcnQgTGF5ZXIgUHJvdG9jb2wiCi0uJUQgMjAwNgotLlJlCi0uUnMKLS4lUiBSRkMgNDcxNgotLiVUICJUaGUgU2VjdXJlIFNoZWxsIChTU0gpIFB1YmxpYyBLZXkgRmlsZSBGb3JtYXQiCi0uJUQgMjAwNgotLlJlCi0uUnMKLS4lUiBSRkMgNTY1NgotLiVUICJFbGxpcHRpYyBDdXJ2ZSBBbGdvcml0aG0gSW50ZWdyYXRpb24gaW4gdGhlIFNlY3VyZSBTaGVsbCBUcmFuc3BvcnQgTGF5ZXIiCi0uJUQgMjAwOQotLlJlCi0uUnMKLS4lVCAiSGFzaCBWaXN1YWxpemF0aW9uOiBhIE5ldyBUZWNobmlxdWUgdG8gaW1wcm92ZSBSZWFsLVdvcmxkIFNlY3VyaXR5IgotLiVBIEEuIFBlcnJpZwotLiVBIEQuIFNvbmcKLS4lRCAxOTk5Ci0uJU8gIkludGVybmF0aW9uYWwgV29ya3Nob3Agb24gQ3J5cHRvZ3JhcGhpYyBUZWNobmlxdWVzIGFuZCBFLUNvbW1lcmNlIChDcnlwVEVDICc5OSkiCi0uUmUKLS5TaCBBVVRIT1JTCi1PcGVuU1NIIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgYW5kIGZyZWUKLXNzaCAxLjIuMTIgcmVsZWFzZSBieSBUYXR1IFlsb25lbi4KLUFhcm9uIENhbXBiZWxsLCBCb2IgQmVjaywgTWFya3VzIEZyaWVkbCwgTmllbHMgUHJvdm9zLAotVGhlbyBkZSBSYWFkdCBhbmQgRHVnIFNvbmcKLXJlbW92ZWQgbWFueSBidWdzLCByZS1hZGRlZCBuZXdlciBmZWF0dXJlcyBhbmQKLWNyZWF0ZWQgT3BlblNTSC4KLU1hcmt1cyBGcmllZGwgY29udHJpYnV0ZWQgdGhlIHN1cHBvcnQgZm9yIFNTSAotcHJvdG9jb2wgdmVyc2lvbnMgMS41IGFuZCAyLjAuCmRpZmYgLS1naXQgYS9zc2guYyBiL3NzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzE3ZGNmLi4wMDAwMDAwCi0tLSBhL3NzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU4OCArMCwwIEBACi0vKiAkT3BlbkJTRDogc3NoLmMsdiAxLjM2NCAyMDExLzA4LzAyIDIzOjE1OjAzIGRqbSBFeHAgJCAqLwotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIFNzaCBjbGllbnQgcHJvZ3JhbS4gIFRoaXMgcHJvZ3JhbSBjYW4gYmUgdXNlZCB0byBsb2cgaW50byBhIHJlbW90ZSBtYWNoaW5lLgotICogVGhlIHNvZnR3YXJlIHN1cHBvcnRzIHN0cm9uZyBhdXRoZW50aWNhdGlvbiwgZW5jcnlwdGlvbiwgYW5kIGZvcndhcmRpbmcKLSAqIG9mIFgxMSwgVENQL0lQLCBhbmQgYXV0aGVudGljYXRpb24gY29ubmVjdGlvbnMuCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgTmllbHMgUHJvdm9zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBNb2RpZmllZCB0byB3b3JrIHdpdGggU1NMIGJ5IE5pZWxzIFByb3ZvcyA8cHJvdm9zQGNpdGkudW1pY2guZWR1PgotICogaW4gQ2FuYWRhIChHZXJtYW4gY2l0aXplbikuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9TWVNfU1RBVF9ICi0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaWZkZWYgSEFWRV9QQVRIU19ICi0jaW5jbHVkZSA8cGF0aHMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+Ci0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvb3BlbnNzbC1jb21wYXQuaCIKLSNpbmNsdWRlICJvcGVuYnNkLWNvbXBhdC9zeXMtcXVldWUuaCIKLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJzc2guaCIKLSNpbmNsdWRlICJzc2gxLmgiCi0jaW5jbHVkZSAic3NoMi5oIgotI2luY2x1ZGUgImNhbm9ob3N0LmgiCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAiY2lwaGVyLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAiYnVmZmVyLmgiCi0jaW5jbHVkZSAiY2hhbm5lbHMuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJhdXRoZmQuaCIKLSNpbmNsdWRlICJhdXRoZmlsZS5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotI2luY2x1ZGUgImRpc3BhdGNoLmgiCi0jaW5jbHVkZSAiY2xpZW50bG9vcC5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgInJlYWRjb25mLmgiCi0jaW5jbHVkZSAic3NoY29ubmVjdC5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJrZXguaCIKLSNpbmNsdWRlICJtYWMuaCIKLSNpbmNsdWRlICJzc2hwdHkuaCIKLSNpbmNsdWRlICJtYXRjaC5oIgotI2luY2x1ZGUgIm1zZy5oIgotI2luY2x1ZGUgInVpZHN3YXAuaCIKLSNpbmNsdWRlICJyb2FtaW5nLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0jaWZkZWYgRU5BQkxFX1BLQ1MxMQotI2luY2x1ZGUgInNzaC1wa2NzMTEuaCIKLSNlbmRpZgotCi1leHRlcm4gY2hhciAqX19wcm9nbmFtZTsKLQotLyogU2F2ZXMgYSBjb3B5IG9mIGFyZ3YgZm9yIHNldHByb2N0aXRsZSBlbXVsYXRpb24gKi8KLSNpZm5kZWYgSEFWRV9TRVRQUk9DVElUTEUKLXN0YXRpYyBjaGFyICoqc2F2ZWRfYXY7Ci0jZW5kaWYKLQotLyogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgZGVidWcgbW9kZSBpcyBvbi4gIE1heSBiZSBzZXQgb24gdGhlIGNvbW1hbmQgbGluZS4gKi8KLWludCBkZWJ1Z19mbGFnID0gMDsKLQotLyogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYSB0dHkgc2hvdWxkIGJlIHJlcXVlc3RlZCAqLwotaW50IHR0eV9mbGFnID0gMDsKLQotLyogZG9uJ3QgZXhlYyBhIHNoZWxsICovCi1pbnQgbm9fc2hlbGxfZmxhZyA9IDA7Ci0KLS8qCi0gKiBGbGFnIGluZGljYXRpbmcgdGhhdCBub3RoaW5nIHNob3VsZCBiZSByZWFkIGZyb20gc3RkaW4uICBUaGlzIGNhbiBiZSBzZXQKLSAqIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gKi8KLWludCBzdGRpbl9udWxsX2ZsYWcgPSAwOwotCi0vKgotICogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGN1cnJlbnQgcHJvY2VzcyBzaG91bGQgYmUgYmFja2dyb3VuZGVkIGFuZAotICogYSBuZXcgc2xhdmUgbGF1bmNoZWQgaW4gdGhlIGZvcmVncm91bmQgZm9yIENvbnRyb2xQZXJzaXN0LgotICovCi1pbnQgbmVlZF9jb250cm9scGVyc2lzdF9kZXRhY2ggPSAwOwotCi0vKiBDb3BpZXMgb2YgZmxhZ3MgZm9yIENvbnRyb2xQZXJzaXN0IGZvcmVncm91bmQgc2xhdmUgKi8KLWludCBvc3RkaW5fbnVsbF9mbGFnLCBvbm9fc2hlbGxfZmxhZywgb3R0eV9mbGFnLCBvcmVxdWVzdF90dHk7Ci0KLS8qCi0gKiBGbGFnIGluZGljYXRpbmcgdGhhdCBzc2ggc2hvdWxkIGZvcmsgYWZ0ZXIgYXV0aGVudGljYXRpb24uICBUaGlzIGlzIHVzZWZ1bAotICogc28gdGhhdCB0aGUgcGFzc3BocmFzZSBjYW4gYmUgZW50ZXJlZCBtYW51YWxseSwgYW5kIHRoZW4gc3NoIGdvZXMgdG8gdGhlCi0gKiBiYWNrZ3JvdW5kLgotICovCi1pbnQgZm9ya19hZnRlcl9hdXRoZW50aWNhdGlvbl9mbGFnID0gMDsKLQotLyogZm9yd2FyZCBzdGRpbyB0byByZW1vdGUgaG9zdCBhbmQgcG9ydCAqLwotY2hhciAqc3RkaW9fZm9yd2FyZF9ob3N0ID0gTlVMTDsKLWludCBzdGRpb19mb3J3YXJkX3BvcnQgPSAwOwotCi0vKgotICogR2VuZXJhbCBkYXRhIHN0cnVjdHVyZSBmb3IgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIG9wdGlvbnMgY29uZmlndXJhYmxlCi0gKiBpbiBjb25maWd1cmF0aW9uIGZpbGVzLiAgU2VlIHJlYWRjb25mLmguCi0gKi8KLU9wdGlvbnMgb3B0aW9uczsKLQotLyogb3B0aW9uYWwgdXNlciBjb25maWdmaWxlICovCi1jaGFyICpjb25maWcgPSBOVUxMOwotCi0vKgotICogTmFtZSBvZiB0aGUgaG9zdCB3ZSBhcmUgY29ubmVjdGluZyB0by4gIFRoaXMgaXMgdGhlIG5hbWUgZ2l2ZW4gb24gdGhlCi0gKiBjb21tYW5kIGxpbmUsIG9yIHRoZSBIb3N0TmFtZSBzcGVjaWZpZWQgZm9yIHRoZSB1c2VyLXN1cHBsaWVkIG5hbWUgaW4gYQotICogY29uZmlndXJhdGlvbiBmaWxlLgotICovCi1jaGFyICpob3N0OwotCi0vKiBzb2NrZXQgYWRkcmVzcyB0aGUgaG9zdCByZXNvbHZlcyB0byAqLwotc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgaG9zdGFkZHI7Ci0KLS8qIFByaXZhdGUgaG9zdCBrZXlzLiAqLwotU2Vuc2l0aXZlIHNlbnNpdGl2ZV9kYXRhOwotCi0vKiBPcmlnaW5hbCByZWFsIFVJRC4gKi8KLXVpZF90IG9yaWdpbmFsX3JlYWxfdWlkOwotdWlkX3Qgb3JpZ2luYWxfZWZmZWN0aXZlX3VpZDsKLQotLyogY29tbWFuZCB0byBiZSBleGVjdXRlZCAqLwotQnVmZmVyIGNvbW1hbmQ7Ci0KLS8qIFNob3VsZCB3ZSBleGVjdXRlIGEgY29tbWFuZCBvciBpbnZva2UgYSBzdWJzeXN0ZW0/ICovCi1pbnQgc3Vic3lzdGVtX2ZsYWcgPSAwOwotCi0vKiAjIG9mIHJlcGxpZXMgcmVjZWl2ZWQgZm9yIGdsb2JhbCByZXF1ZXN0cyAqLwotc3RhdGljIGludCByZW1vdGVfZm9yd2FyZF9jb25maXJtc19yZWNlaXZlZCA9IDA7Ci0KLS8qIG11eC5jICovCi1leHRlcm4gaW50IG11eHNlcnZlcl9zb2NrOwotZXh0ZXJuIHVfaW50IG11eGNsaWVudF9jb21tYW5kOwotCi0vKiBQcmludHMgYSBoZWxwIG1lc3NhZ2UgdG8gdGhlIHVzZXIuICBUaGlzIGZ1bmN0aW9uIG5ldmVyIHJldHVybnMuICovCi0KLXN0YXRpYyB2b2lkCi11c2FnZSh2b2lkKQotewotCWZwcmludGYoc3RkZXJyLAotInVzYWdlOiBzc2ggWy0xMjQ2QWFDZmdLa01ObnFzVHRWdlh4WXldIFstYiBiaW5kX2FkZHJlc3NdIFstYyBjaXBoZXJfc3BlY11cbiIKLSIgICAgICAgICAgIFstRCBbYmluZF9hZGRyZXNzOl1wb3J0XSBbLWUgZXNjYXBlX2NoYXJdIFstRiBjb25maWdmaWxlXVxuIgotIiAgICAgICAgICAgWy1JIHBrY3MxMV0gWy1pIGlkZW50aXR5X2ZpbGVdXG4iCi0iICAgICAgICAgICBbLUwgW2JpbmRfYWRkcmVzczpdcG9ydDpob3N0Omhvc3Rwb3J0XVxuIgotIiAgICAgICAgICAgWy1sIGxvZ2luX25hbWVdIFstbSBtYWNfc3BlY10gWy1PIGN0bF9jbWRdIFstbyBvcHRpb25dIFstcCBwb3J0XVxuIgotIiAgICAgICAgICAgWy1SIFtiaW5kX2FkZHJlc3M6XXBvcnQ6aG9zdDpob3N0cG9ydF0gWy1TIGN0bF9wYXRoXVxuIgotIiAgICAgICAgICAgWy1XIGhvc3Q6cG9ydF0gWy13IGxvY2FsX3R1bls6cmVtb3RlX3R1bl1dXG4iCi0iICAgICAgICAgICBbdXNlckBdaG9zdG5hbWUgW2NvbW1hbmRdXG4iCi0JKTsKLQlleGl0KDI1NSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3NoX3Nlc3Npb24odm9pZCk7Ci1zdGF0aWMgaW50IHNzaF9zZXNzaW9uMih2b2lkKTsKLXN0YXRpYyB2b2lkIGxvYWRfcHVibGljX2lkZW50aXR5X2ZpbGVzKHZvaWQpOwotc3RhdGljIHZvaWQgbWFpbl9zaWdjaGxkX2hhbmRsZXIoaW50KTsKLQotLyogZnJvbSBtdXhjbGllbnQuYyAqLwotdm9pZCBtdXhjbGllbnQoY29uc3QgY2hhciAqKTsKLXZvaWQgbXV4c2VydmVyX2xpc3Rlbih2b2lkKTsKLQotLyogfi8gZXhwYW5kIGEgbGlzdCBvZiBwYXRocy4gTkIuIGFzc3VtZXMgcGF0aFtuXSBpcyBoZWFwLWFsbG9jYXRlZC4gKi8KLXN0YXRpYyB2b2lkCi10aWxkZV9leHBhbmRfcGF0aHMoY2hhciAqKnBhdGhzLCB1X2ludCBudW1fcGF0aHMpCi17Ci0JdV9pbnQgaTsKLQljaGFyICpjcDsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fcGF0aHM7IGkrKykgewotCQljcCA9IHRpbGRlX2V4cGFuZF9maWxlbmFtZShwYXRoc1tpXSwgb3JpZ2luYWxfcmVhbF91aWQpOwotCQl4ZnJlZShwYXRoc1tpXSk7Ci0JCXBhdGhzW2ldID0gY3A7Ci0JfQotfQotCi0vKgotICogTWFpbiBwcm9ncmFtIGZvciB0aGUgc3NoIGNsaWVudC4KLSAqLwotaW50Ci1tYWluKGludCBhYywgY2hhciAqKmF2KQotewotCWludCBpLCByLCBvcHQsIGV4aXRfc3RhdHVzLCB1c2Vfc3lzbG9nOwotCWNoYXIgKnAsICpjcCwgKmxpbmUsICphcmd2MCwgYnVmW01BWFBBVEhMRU5dLCAqaG9zdF9hcmc7Ci0JY2hhciB0aGlzaG9zdFtOSV9NQVhIT1NUXSwgc2hvcnRob3N0W05JX01BWEhPU1RdLCBwb3J0c3RyW05JX01BWFNFUlZdOwotCXN0cnVjdCBzdGF0IHN0OwotCXN0cnVjdCBwYXNzd2QgKnB3OwotCWludCBkdW1teSwgdGltZW91dF9tczsKLQlleHRlcm4gaW50IG9wdGluZCwgb3B0cmVzZXQ7Ci0JZXh0ZXJuIGNoYXIgKm9wdGFyZzsKLQotCXN0cnVjdCBzZXJ2ZW50ICpzcDsKLQlGb3J3YXJkIGZ3ZDsKLQotCS8qIEVuc3VyZSB0aGF0IGZkcyAwLCAxIGFuZCAyIGFyZSBvcGVuIG9yIGRpcmVjdGVkIHRvIC9kZXYvbnVsbCAqLwotCXNhbml0aXNlX3N0ZGZkKCk7Ci0KLQlfX3Byb2duYW1lID0gc3NoX2dldF9wcm9nbmFtZShhdlswXSk7Ci0KLSNpZm5kZWYgSEFWRV9TRVRQUk9DVElUTEUKLQkvKiBQcmVwYXJlIGZvciBsYXRlciBzZXRwcm9jdGl0bGUgZW11bGF0aW9uICovCi0JLyogU2F2ZSBhcmd2IHNvIGl0IGlzbid0IGNsb2JiZXJlZCBieSBzZXRwcm9jdGl0bGUoKSBlbXVsYXRpb24gKi8KLQlzYXZlZF9hdiA9IHhjYWxsb2MoYWMgKyAxLCBzaXplb2YoKnNhdmVkX2F2KSk7Ci0JZm9yIChpID0gMDsgaSA8IGFjOyBpKyspCi0JCXNhdmVkX2F2W2ldID0geHN0cmR1cChhdltpXSk7Ci0Jc2F2ZWRfYXZbaV0gPSBOVUxMOwotCWNvbXBhdF9pbml0X3NldHByb2N0aXRsZShhYywgYXYpOwotCWF2ID0gc2F2ZWRfYXY7Ci0jZW5kaWYKLQotCS8qCi0JICogRGlzY2FyZCBvdGhlciBmZHMgdGhhdCBhcmUgaGFuZ2luZyBhcm91bmQuIFRoZXNlIGNhbiBjYXVzZSBwcm9ibGVtCi0JICogd2l0aCBiYWNrZ3JvdW5kZWQgc3NoIHByb2Nlc3NlcyBzdGFydGVkIGJ5IENvbnRyb2xQZXJzaXN0LgotCSAqLwotCWNsb3NlZnJvbShTVERFUlJfRklMRU5PICsgMSk7Ci0KLQkvKgotCSAqIFNhdmUgdGhlIG9yaWdpbmFsIHJlYWwgdWlkLiAgSXQgd2lsbCBiZSBuZWVkZWQgbGF0ZXIgKHVpZC1zd2FwcGluZwotCSAqIG1heSBjbG9iYmVyIHRoZSByZWFsIHVpZCkuCi0JICovCi0Jb3JpZ2luYWxfcmVhbF91aWQgPSBnZXR1aWQoKTsKLQlvcmlnaW5hbF9lZmZlY3RpdmVfdWlkID0gZ2V0ZXVpZCgpOwotCi0JLyoKLQkgKiBVc2UgdWlkLXN3YXBwaW5nIHRvIGdpdmUgdXAgcm9vdCBwcml2aWxlZ2VzIGZvciB0aGUgZHVyYXRpb24gb2YKLQkgKiBvcHRpb24gcHJvY2Vzc2luZy4gIFdlIHdpbGwgcmUtaW5zdGFudGlhdGUgdGhlIHJpZ2h0cyB3aGVuIHdlIGFyZQotCSAqIHJlYWR5IHRvIGNyZWF0ZSB0aGUgcHJpdmlsZWdlZCBwb3J0LCBhbmQgd2lsbCBwZXJtYW5lbnRseSBkcm9wCi0JICogdGhlbSB3aGVuIHRoZSBwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgKGFjdHVhbGx5LCB3aGVuIHRoZSBjb25uZWN0aW9uCi0JICogaGFzIGJlZW4gbWFkZSwgYXMgd2UgbWF5IG5lZWQgdG8gY3JlYXRlIHRoZSBwb3J0IHNldmVyYWwgdGltZXMpLgotCSAqLwotCVBSSVZfRU5EOwotCi0jaWZkZWYgSEFWRV9TRVRSTElNSVQKLQkvKiBJZiB3ZSBhcmUgaW5zdGFsbGVkIHNldHVpZCByb290IGJlIGNhcmVmdWwgdG8gbm90IGRyb3AgY29yZS4gKi8KLQlpZiAob3JpZ2luYWxfcmVhbF91aWQgIT0gb3JpZ2luYWxfZWZmZWN0aXZlX3VpZCkgewotCQlzdHJ1Y3QgcmxpbWl0IHJsaW07Ci0JCXJsaW0ucmxpbV9jdXIgPSBybGltLnJsaW1fbWF4ID0gMDsKLQkJaWYgKHNldHJsaW1pdChSTElNSVRfQ09SRSwgJnJsaW0pIDwgMCkKLQkJCWZhdGFsKCJzZXRybGltaXQgZmFpbGVkOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCX0KLSNlbmRpZgotCS8qIEdldCB1c2VyIGRhdGEuICovCi0JcHcgPSBnZXRwd3VpZChvcmlnaW5hbF9yZWFsX3VpZCk7Ci0JaWYgKCFwdykgewotCQlsb2dpdCgiWW91IGRvbid0IGV4aXN0LCBnbyBhd2F5ISIpOwotCQlleGl0KDI1NSk7Ci0JfQotCS8qIFRha2UgYSBjb3B5IG9mIHRoZSByZXR1cm5lZCBzdHJ1Y3R1cmUuICovCi0JcHcgPSBwd2NvcHkocHcpOwotCi0JLyoKLQkgKiBTZXQgb3VyIHVtYXNrIHRvIHNvbWV0aGluZyByZWFzb25hYmxlLCBhcyBzb21lIGZpbGVzIGFyZSBjcmVhdGVkCi0JICogd2l0aCB0aGUgZGVmYXVsdCB1bWFzay4gIFRoaXMgd2lsbCBtYWtlIHRoZW0gd29ybGQtcmVhZGFibGUgYnV0Ci0JICogd3JpdGFibGUgb25seSBieSB0aGUgb3duZXIsIHdoaWNoIGlzIG9rIGZvciBhbGwgZmlsZXMgZm9yIHdoaWNoIHdlCi0JICogZG9uJ3Qgc2V0IHRoZSBtb2RlcyBleHBsaWNpdGx5LgotCSAqLwotCXVtYXNrKDAyMik7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgb3B0aW9uIHN0cnVjdHVyZSB0byBpbmRpY2F0ZSB0aGF0IG5vIHZhbHVlcyBoYXZlIGJlZW4KLQkgKiBzZXQuCi0JICovCi0JaW5pdGlhbGl6ZV9vcHRpb25zKCZvcHRpb25zKTsKLQotCS8qIFBhcnNlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuICovCi0JaG9zdCA9IE5VTEw7Ci0JdXNlX3N5c2xvZyA9IDA7Ci0JYXJndjAgPSBhdlswXTsKLQotIGFnYWluOgotCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFjLCBhdiwgIjEyNDZhYjpjOmU6ZmdpOmtsOm06bm86cDpxc3R2eCIKLQkgICAgIkFDRDpGOkk6S0w6TU5POlBSOlM6VFZ3Olc6WFl5IikpICE9IC0xKSB7Ci0JCXN3aXRjaCAob3B0KSB7Ci0JCWNhc2UgJzEnOgotCQkJb3B0aW9ucy5wcm90b2NvbCA9IFNTSF9QUk9UT18xOwotCQkJYnJlYWs7Ci0JCWNhc2UgJzInOgotCQkJb3B0aW9ucy5wcm90b2NvbCA9IFNTSF9QUk9UT18yOwotCQkJYnJlYWs7Ci0JCWNhc2UgJzQnOgotCQkJb3B0aW9ucy5hZGRyZXNzX2ZhbWlseSA9IEFGX0lORVQ7Ci0JCQlicmVhazsKLQkJY2FzZSAnNic6Ci0JCQlvcHRpb25zLmFkZHJlc3NfZmFtaWx5ID0gQUZfSU5FVDY7Ci0JCQlicmVhazsKLQkJY2FzZSAnbic6Ci0JCQlzdGRpbl9udWxsX2ZsYWcgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2YnOgotCQkJZm9ya19hZnRlcl9hdXRoZW50aWNhdGlvbl9mbGFnID0gMTsKLQkJCXN0ZGluX251bGxfZmxhZyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAneCc6Ci0JCQlvcHRpb25zLmZvcndhcmRfeDExID0gMDsKLQkJCWJyZWFrOwotCQljYXNlICdYJzoKLQkJCW9wdGlvbnMuZm9yd2FyZF94MTEgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3knOgotCQkJdXNlX3N5c2xvZyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnWSc6Ci0JCQlvcHRpb25zLmZvcndhcmRfeDExID0gMTsKLQkJCW9wdGlvbnMuZm9yd2FyZF94MTFfdHJ1c3RlZCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnZyc6Ci0JCQlvcHRpb25zLmdhdGV3YXlfcG9ydHMgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ08nOgotCQkJaWYgKHN0ZGlvX2ZvcndhcmRfaG9zdCAhPSBOVUxMKQotCQkJCWZhdGFsKCJDYW5ub3Qgc3BlY2lmeSBtdWx0aXBsZXhpbmcgIgotCQkJCSAgICAiY29tbWFuZCB3aXRoIC1XIik7Ci0JCQllbHNlIGlmIChtdXhjbGllbnRfY29tbWFuZCAhPSAwKQotCQkJCWZhdGFsKCJNdWx0aXBsZXhpbmcgY29tbWFuZCBhbHJlYWR5IHNwZWNpZmllZCIpOwotCQkJaWYgKHN0cmNtcChvcHRhcmcsICJjaGVjayIpID09IDApCi0JCQkJbXV4Y2xpZW50X2NvbW1hbmQgPSBTU0hNVVhfQ09NTUFORF9BTElWRV9DSEVDSzsKLQkJCWVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJmb3J3YXJkIikgPT0gMCkKLQkJCQltdXhjbGllbnRfY29tbWFuZCA9IFNTSE1VWF9DT01NQU5EX0ZPUldBUkQ7Ci0JCQllbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiZXhpdCIpID09IDApCi0JCQkJbXV4Y2xpZW50X2NvbW1hbmQgPSBTU0hNVVhfQ09NTUFORF9URVJNSU5BVEU7Ci0JCQllbHNlIGlmIChzdHJjbXAob3B0YXJnLCAic3RvcCIpID09IDApCi0JCQkJbXV4Y2xpZW50X2NvbW1hbmQgPSBTU0hNVVhfQ09NTUFORF9TVE9QOwotCQkJZWxzZQotCQkJCWZhdGFsKCJJbnZhbGlkIG11bHRpcGxleCBjb21tYW5kLiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1AnOgkvKiBkZXByZWNhdGVkICovCi0JCQlvcHRpb25zLnVzZV9wcml2aWxlZ2VkX3BvcnQgPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2EnOgotCQkJb3B0aW9ucy5mb3J3YXJkX2FnZW50ID0gMDsKLQkJCWJyZWFrOwotCQljYXNlICdBJzoKLQkJCW9wdGlvbnMuZm9yd2FyZF9hZ2VudCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnayc6Ci0JCQlvcHRpb25zLmdzc19kZWxlZ19jcmVkcyA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSAnSyc6Ci0JCQlvcHRpb25zLmdzc19hdXRoZW50aWNhdGlvbiA9IDE7Ci0JCQlvcHRpb25zLmdzc19kZWxlZ19jcmVkcyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnaSc6Ci0JCQlpZiAoc3RhdChvcHRhcmcsICZzdCkgPCAwKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBJZGVudGl0eSBmaWxlICVzICIKLQkJCQkgICAgIm5vdCBhY2Nlc3NpYmxlOiAlcy5cbiIsIG9wdGFyZywKLQkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChvcHRpb25zLm51bV9pZGVudGl0eV9maWxlcyA+PQotCQkJICAgIFNTSF9NQVhfSURFTlRJVFlfRklMRVMpCi0JCQkJZmF0YWwoIlRvbyBtYW55IGlkZW50aXR5IGZpbGVzIHNwZWNpZmllZCAiCi0JCQkJICAgICIobWF4ICVkKSIsIFNTSF9NQVhfSURFTlRJVFlfRklMRVMpOwotCQkJb3B0aW9ucy5pZGVudGl0eV9maWxlc1tvcHRpb25zLm51bV9pZGVudGl0eV9maWxlcysrXSA9Ci0JCQkgICAgeHN0cmR1cChvcHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ0knOgotI2lmZGVmIEVOQUJMRV9QS0NTMTEKLQkJCW9wdGlvbnMucGtjczExX3Byb3ZpZGVyID0geHN0cmR1cChvcHRhcmcpOwotI2Vsc2UKLQkJCWZwcmludGYoc3RkZXJyLCAibm8gc3VwcG9ydCBmb3IgUEtDUyMxMS5cbiIpOwotI2VuZGlmCi0JCQlicmVhazsKLQkJY2FzZSAndCc6Ci0JCQlpZiAob3B0aW9ucy5yZXF1ZXN0X3R0eSA9PSBSRVFVRVNUX1RUWV9ZRVMpCi0JCQkJb3B0aW9ucy5yZXF1ZXN0X3R0eSA9IFJFUVVFU1RfVFRZX0ZPUkNFOwotCQkJZWxzZQotCQkJCW9wdGlvbnMucmVxdWVzdF90dHkgPSBSRVFVRVNUX1RUWV9ZRVM7Ci0JCQlicmVhazsKLQkJY2FzZSAndic6Ci0JCQlpZiAoZGVidWdfZmxhZyA9PSAwKSB7Ci0JCQkJZGVidWdfZmxhZyA9IDE7Ci0JCQkJb3B0aW9ucy5sb2dfbGV2ZWwgPSBTWVNMT0dfTEVWRUxfREVCVUcxOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob3B0aW9ucy5sb2dfbGV2ZWwgPCBTWVNMT0dfTEVWRUxfREVCVUczKQotCQkJCQlvcHRpb25zLmxvZ19sZXZlbCsrOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJY2FzZSAnVic6Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzLCAlc1xuIiwKLQkJCSAgICBTU0hfUkVMRUFTRSwgU1NMZWF5X3ZlcnNpb24oU1NMRUFZX1ZFUlNJT04pKTsKLQkJCWlmIChvcHQgPT0gJ1YnKQotCQkJCWV4aXQoMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAndyc6Ci0JCQlpZiAob3B0aW9ucy50dW5fb3BlbiA9PSAtMSkKLQkJCQlvcHRpb25zLnR1bl9vcGVuID0gU1NIX1RVTk1PREVfREVGQVVMVDsKLQkJCW9wdGlvbnMudHVuX2xvY2FsID0gYTJ0dW4ob3B0YXJnLCAmb3B0aW9ucy50dW5fcmVtb3RlKTsKLQkJCWlmIChvcHRpb25zLnR1bl9sb2NhbCA9PSBTU0hfVFVOSURfRVJSKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJICAgICJCYWQgdHVuIGRldmljZSAnJXMnXG4iLCBvcHRhcmcpOwotCQkJCWV4aXQoMjU1KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICdXJzoKLQkJCWlmIChzdGRpb19mb3J3YXJkX2hvc3QgIT0gTlVMTCkKLQkJCQlmYXRhbCgic3RkaW8gZm9yd2FyZCBhbHJlYWR5IHNwZWNpZmllZCIpOwotCQkJaWYgKG11eGNsaWVudF9jb21tYW5kICE9IDApCi0JCQkJZmF0YWwoIkNhbm5vdCBzcGVjaWZ5IHN0ZGlvIGZvcndhcmQgd2l0aCAtTyIpOwotCQkJaWYgKHBhcnNlX2ZvcndhcmQoJmZ3ZCwgb3B0YXJnLCAxLCAwKSkgewotCQkJCXN0ZGlvX2ZvcndhcmRfaG9zdCA9IGZ3ZC5saXN0ZW5faG9zdDsKLQkJCQlzdGRpb19mb3J3YXJkX3BvcnQgPSBmd2QubGlzdGVuX3BvcnQ7Ci0JCQkJeGZyZWUoZndkLmNvbm5lY3RfaG9zdCk7Ci0JCQl9IGVsc2UgewotCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCSAgICAiQmFkIHN0ZGlvIGZvcndhcmRpbmcgc3BlY2lmaWNhdGlvbiAnJXMnXG4iLAotCQkJCSAgICBvcHRhcmcpOwotCQkJCWV4aXQoMjU1KTsKLQkJCX0KLQkJCW9wdGlvbnMucmVxdWVzdF90dHkgPSBSRVFVRVNUX1RUWV9OTzsKLQkJCW5vX3NoZWxsX2ZsYWcgPSAxOwotCQkJb3B0aW9ucy5jbGVhcl9mb3J3YXJkaW5ncyA9IDE7Ci0JCQlvcHRpb25zLmV4aXRfb25fZm9yd2FyZF9mYWlsdXJlID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdxJzoKLQkJCW9wdGlvbnMubG9nX2xldmVsID0gU1lTTE9HX0xFVkVMX1FVSUVUOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2UnOgotCQkJaWYgKG9wdGFyZ1swXSA9PSAnXicgJiYgb3B0YXJnWzJdID09IDAgJiYKLQkJCSAgICAodV9jaGFyKSBvcHRhcmdbMV0gPj0gNjQgJiYKLQkJCSAgICAodV9jaGFyKSBvcHRhcmdbMV0gPCAxMjgpCi0JCQkJb3B0aW9ucy5lc2NhcGVfY2hhciA9ICh1X2NoYXIpIG9wdGFyZ1sxXSAmIDMxOwotCQkJZWxzZSBpZiAoc3RybGVuKG9wdGFyZykgPT0gMSkKLQkJCQlvcHRpb25zLmVzY2FwZV9jaGFyID0gKHVfY2hhcikgb3B0YXJnWzBdOwotCQkJZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIm5vbmUiKSA9PSAwKQotCQkJCW9wdGlvbnMuZXNjYXBlX2NoYXIgPSBTU0hfRVNDQVBFQ0hBUl9OT05FOwotCQkJZWxzZSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJCYWQgZXNjYXBlIGNoYXJhY3RlciAnJXMnLlxuIiwKLQkJCQkgICAgb3B0YXJnKTsKLQkJCQlleGl0KDI1NSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnYyc6Ci0JCQlpZiAoY2lwaGVyc192YWxpZChvcHRhcmcpKSB7Ci0JCQkJLyogU1NIMiBvbmx5ICovCi0JCQkJb3B0aW9ucy5jaXBoZXJzID0geHN0cmR1cChvcHRhcmcpOwotCQkJCW9wdGlvbnMuY2lwaGVyID0gU1NIX0NJUEhFUl9JTlZBTElEOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBTU0gxIG9ubHkgKi8KLQkJCQlvcHRpb25zLmNpcGhlciA9IGNpcGhlcl9udW1iZXIob3B0YXJnKTsKLQkJCQlpZiAob3B0aW9ucy5jaXBoZXIgPT0gLTEpIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCSAgICAiVW5rbm93biBjaXBoZXIgdHlwZSAnJXMnXG4iLAotCQkJCQkgICAgb3B0YXJnKTsKLQkJCQkJZXhpdCgyNTUpOwotCQkJCX0KLQkJCQlpZiAob3B0aW9ucy5jaXBoZXIgPT0gU1NIX0NJUEhFUl8zREVTKQotCQkJCQlvcHRpb25zLmNpcGhlcnMgPSAiM2Rlcy1jYmMiOwotCQkJCWVsc2UgaWYgKG9wdGlvbnMuY2lwaGVyID09IFNTSF9DSVBIRVJfQkxPV0ZJU0gpCi0JCQkJCW9wdGlvbnMuY2lwaGVycyA9ICJibG93ZmlzaC1jYmMiOwotCQkJCWVsc2UKLQkJCQkJb3B0aW9ucy5jaXBoZXJzID0gKGNoYXIgKiktMTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICdtJzoKLQkJCWlmIChtYWNfdmFsaWQob3B0YXJnKSkKLQkJCQlvcHRpb25zLm1hY3MgPSB4c3RyZHVwKG9wdGFyZyk7Ci0JCQllbHNlIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbWFjIHR5cGUgJyVzJ1xuIiwKLQkJCQkgICAgb3B0YXJnKTsKLQkJCQlleGl0KDI1NSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnTSc6Ci0JCQlpZiAob3B0aW9ucy5jb250cm9sX21hc3RlciA9PSBTU0hDVExfTUFTVEVSX1lFUykKLQkJCQlvcHRpb25zLmNvbnRyb2xfbWFzdGVyID0gU1NIQ1RMX01BU1RFUl9BU0s7Ci0JCQllbHNlCi0JCQkJb3B0aW9ucy5jb250cm9sX21hc3RlciA9IFNTSENUTF9NQVNURVJfWUVTOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3AnOgotCQkJb3B0aW9ucy5wb3J0ID0gYTJwb3J0KG9wdGFyZyk7Ci0JCQlpZiAob3B0aW9ucy5wb3J0IDw9IDApIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIkJhZCBwb3J0ICclcydcbiIsIG9wdGFyZyk7Ci0JCQkJZXhpdCgyNTUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ2wnOgotCQkJb3B0aW9ucy51c2VyID0gb3B0YXJnOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnTCc6Ci0JCQlpZiAocGFyc2VfZm9yd2FyZCgmZndkLCBvcHRhcmcsIDAsIDApKQotCQkJCWFkZF9sb2NhbF9mb3J3YXJkKCZvcHRpb25zLCAmZndkKTsKLQkJCWVsc2UgewotCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCSAgICAiQmFkIGxvY2FsIGZvcndhcmRpbmcgc3BlY2lmaWNhdGlvbiAnJXMnXG4iLAotCQkJCSAgICBvcHRhcmcpOwotCQkJCWV4aXQoMjU1KTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgJ1InOgotCQkJaWYgKHBhcnNlX2ZvcndhcmQoJmZ3ZCwgb3B0YXJnLCAwLCAxKSkgewotCQkJCWFkZF9yZW1vdGVfZm9yd2FyZCgmb3B0aW9ucywgJmZ3ZCk7Ci0JCQl9IGVsc2UgewotCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCSAgICAiQmFkIHJlbW90ZSBmb3J3YXJkaW5nIHNwZWNpZmljYXRpb24gIgotCQkJCSAgICAiJyVzJ1xuIiwgb3B0YXJnKTsKLQkJCQlleGl0KDI1NSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlICdEJzoKLQkJCWlmIChwYXJzZV9mb3J3YXJkKCZmd2QsIG9wdGFyZywgMSwgMCkpIHsKLQkJCQlhZGRfbG9jYWxfZm9yd2FyZCgmb3B0aW9ucywgJmZ3ZCk7Ci0JCQl9IGVsc2UgewotCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCSAgICAiQmFkIGR5bmFtaWMgZm9yd2FyZGluZyBzcGVjaWZpY2F0aW9uICIKLQkJCQkgICAgIiclcydcbiIsIG9wdGFyZyk7Ci0JCQkJZXhpdCgyNTUpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnQyc6Ci0JCQlvcHRpb25zLmNvbXByZXNzaW9uID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdOJzoKLQkJCW5vX3NoZWxsX2ZsYWcgPSAxOwotCQkJb3B0aW9ucy5yZXF1ZXN0X3R0eSA9IFJFUVVFU1RfVFRZX05POwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1QnOgotCQkJb3B0aW9ucy5yZXF1ZXN0X3R0eSA9IFJFUVVFU1RfVFRZX05POwotCQkJYnJlYWs7Ci0JCWNhc2UgJ28nOgotCQkJZHVtbXkgPSAxOwotCQkJbGluZSA9IHhzdHJkdXAob3B0YXJnKTsKLQkJCWlmIChwcm9jZXNzX2NvbmZpZ19saW5lKCZvcHRpb25zLCBob3N0ID8gaG9zdCA6ICIiLAotCQkJICAgIGxpbmUsICJjb21tYW5kLWxpbmUiLCAwLCAmZHVtbXkpICE9IDApCi0JCQkJZXhpdCgyNTUpOwotCQkJeGZyZWUobGluZSk7Ci0JCQlicmVhazsKLQkJY2FzZSAncyc6Ci0JCQlzdWJzeXN0ZW1fZmxhZyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnUyc6Ci0JCQlpZiAob3B0aW9ucy5jb250cm9sX3BhdGggIT0gTlVMTCkKLQkJCQlmcmVlKG9wdGlvbnMuY29udHJvbF9wYXRoKTsKLQkJCW9wdGlvbnMuY29udHJvbF9wYXRoID0geHN0cmR1cChvcHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2InOgotCQkJb3B0aW9ucy5iaW5kX2FkZHJlc3MgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAnRic6Ci0JCQljb25maWcgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXVzYWdlKCk7Ci0JCX0KLQl9Ci0KLQlhYyAtPSBvcHRpbmQ7Ci0JYXYgKz0gb3B0aW5kOwotCi0JaWYgKGFjID4gMCAmJiAhaG9zdCkgewotCQlpZiAoc3RycmNocigqYXYsICdAJykpIHsKLQkJCXAgPSB4c3RyZHVwKCphdik7Ci0JCQljcCA9IHN0cnJjaHIocCwgJ0AnKTsKLQkJCWlmIChjcCA9PSBOVUxMIHx8IGNwID09IHApCi0JCQkJdXNhZ2UoKTsKLQkJCW9wdGlvbnMudXNlciA9IHA7Ci0JCQkqY3AgPSAnXDAnOwotCQkJaG9zdCA9ICsrY3A7Ci0JCX0gZWxzZQotCQkJaG9zdCA9ICphdjsKLQkJaWYgKGFjID4gMSkgewotCQkJb3B0aW5kID0gb3B0cmVzZXQgPSAxOwotCQkJZ290byBhZ2FpbjsKLQkJfQotCQlhYy0tLCBhdisrOwotCX0KLQotCS8qIENoZWNrIHRoYXQgd2UgZ290IGEgaG9zdCBuYW1lLiAqLwotCWlmICghaG9zdCkKLQkJdXNhZ2UoKTsKLQotCU9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7Ci0JRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSBvbiByZW1vdGUgaG9zdC4gKi8KLQlidWZmZXJfaW5pdCgmY29tbWFuZCk7Ci0KLQlpZiAob3B0aW9ucy5yZXF1ZXN0X3R0eSA9PSBSRVFVRVNUX1RUWV9ZRVMgfHwKLQkgICAgb3B0aW9ucy5yZXF1ZXN0X3R0eSA9PSBSRVFVRVNUX1RUWV9GT1JDRSkKLQkJdHR5X2ZsYWcgPSAxOwotCi0JLyoKLQkgKiBTYXZlIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgb24gdGhlIHJlbW90ZSBob3N0IGluIGEgYnVmZmVyLiBUaGVyZQotCSAqIGlzIG5vIGxpbWl0IG9uIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1hbmQsIGV4Y2VwdCBieSB0aGUgbWF4aW11bQotCSAqIHBhY2tldCBzaXplLiAgQWxzbyBzZXRzIHRoZSB0dHkgZmxhZyBpZiB0aGVyZSBpcyBubyBjb21tYW5kLgotCSAqLwotCWlmICghYWMpIHsKLQkJLyogTm8gY29tbWFuZCBzcGVjaWZpZWQgLSBleGVjdXRlIHNoZWxsIG9uIGEgdHR5LiAqLwotCQl0dHlfZmxhZyA9IG9wdGlvbnMucmVxdWVzdF90dHkgIT0gUkVRVUVTVF9UVFlfTk87Ci0JCWlmIChzdWJzeXN0ZW1fZmxhZykgewotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkgICAgIllvdSBtdXN0IHNwZWNpZnkgYSBzdWJzeXN0ZW0gdG8gaW52b2tlLlxuIik7Ci0JCQl1c2FnZSgpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogQSBjb21tYW5kIGhhcyBiZWVuIHNwZWNpZmllZC4gIFN0b3JlIGl0IGludG8gdGhlIGJ1ZmZlci4gKi8KLQkJZm9yIChpID0gMDsgaSA8IGFjOyBpKyspIHsKLQkJCWlmIChpKQotCQkJCWJ1ZmZlcl9hcHBlbmQoJmNvbW1hbmQsICIgIiwgMSk7Ci0JCQlidWZmZXJfYXBwZW5kKCZjb21tYW5kLCBhdltpXSwgc3RybGVuKGF2W2ldKSk7Ci0JCX0KLQl9Ci0KLQkvKiBDYW5ub3QgZm9yayB0byBiYWNrZ3JvdW5kIGlmIG5vIGNvbW1hbmQuICovCi0JaWYgKGZvcmtfYWZ0ZXJfYXV0aGVudGljYXRpb25fZmxhZyAmJiBidWZmZXJfbGVuKCZjb21tYW5kKSA9PSAwICYmCi0JICAgICFub19zaGVsbF9mbGFnKQotCQlmYXRhbCgiQ2Fubm90IGZvcmsgaW50byBiYWNrZ3JvdW5kIHdpdGhvdXQgYSBjb21tYW5kICIKLQkJICAgICJ0byBleGVjdXRlLiIpOwotCi0JLyogQWxsb2NhdGUgYSB0dHkgYnkgZGVmYXVsdCBpZiBubyBjb21tYW5kIHNwZWNpZmllZC4gKi8KLQlpZiAoYnVmZmVyX2xlbigmY29tbWFuZCkgPT0gMCkKLQkJdHR5X2ZsYWcgPSBvcHRpb25zLnJlcXVlc3RfdHR5ICE9IFJFUVVFU1RfVFRZX05POwotCi0JLyogRm9yY2Ugbm8gdHR5ICovCi0JaWYgKG9wdGlvbnMucmVxdWVzdF90dHkgPT0gUkVRVUVTVF9UVFlfTk8gfHwgbXV4Y2xpZW50X2NvbW1hbmQgIT0gMCkKLQkJdHR5X2ZsYWcgPSAwOwotCS8qIERvIG5vdCBhbGxvY2F0ZSBhIHR0eSBpZiBzdGRpbiBpcyBub3QgYSB0dHkuICovCi0JaWYgKCghaXNhdHR5KGZpbGVubyhzdGRpbikpIHx8IHN0ZGluX251bGxfZmxhZykgJiYKLQkgICAgb3B0aW9ucy5yZXF1ZXN0X3R0eSAhPSBSRVFVRVNUX1RUWV9GT1JDRSkgewotCQlpZiAodHR5X2ZsYWcpCi0JCQlsb2dpdCgiUHNldWRvLXRlcm1pbmFsIHdpbGwgbm90IGJlIGFsbG9jYXRlZCBiZWNhdXNlICIKLQkJCSAgICAic3RkaW4gaXMgbm90IGEgdGVybWluYWwuIik7Ci0JCXR0eV9mbGFnID0gMDsKLQl9Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgImxvZyIgb3V0cHV0LiAgU2luY2Ugd2UgYXJlIHRoZSBjbGllbnQgYWxsIG91dHB1dAotCSAqIGFjdHVhbGx5IGdvZXMgdG8gc3RkZXJyLgotCSAqLwotCWxvZ19pbml0KGFyZ3YwLAotCSAgICBvcHRpb25zLmxvZ19sZXZlbCA9PSAtMSA/IFNZU0xPR19MRVZFTF9JTkZPIDogb3B0aW9ucy5sb2dfbGV2ZWwsCi0JICAgIFNZU0xPR19GQUNJTElUWV9VU0VSLCAhdXNlX3N5c2xvZyk7Ci0KLQkvKgotCSAqIFJlYWQgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlLiAgSWdub3JlIHRoZSBzeXN0ZW0gd2lkZSBjb25maWcKLQkgKiBmaWxlIGlmIHRoZSB1c2VyIHNwZWNpZmllcyBhIGNvbmZpZyBmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0JICovCi0JaWYgKGNvbmZpZyAhPSBOVUxMKSB7Ci0JCWlmICghcmVhZF9jb25maWdfZmlsZShjb25maWcsIGhvc3QsICZvcHRpb25zLCAwKSkKLQkJCWZhdGFsKCJDYW4ndCBvcGVuIHVzZXIgY29uZmlnIGZpbGUgJS4xMDBzOiAiCi0JCQkgICAgIiUuMTAwcyIsIGNvbmZpZywgc3RyZXJyb3IoZXJybm8pKTsKLQl9IGVsc2UgewotCQlyID0gc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJXMvJXMiLCBwdy0+cHdfZGlyLAotCQkgICAgX1BBVEhfU1NIX1VTRVJfQ09ORkZJTEUpOwotCQlpZiAociA+IDAgJiYgKHNpemVfdClyIDwgc2l6ZW9mKGJ1ZikpCi0JCQkodm9pZClyZWFkX2NvbmZpZ19maWxlKGJ1ZiwgaG9zdCwgJm9wdGlvbnMsIDEpOwotCi0JCS8qIFJlYWQgc3lzdGVtd2lkZSBjb25maWd1cmF0aW9uIGZpbGUgYWZ0ZXIgdXNlciBjb25maWcuICovCi0JCSh2b2lkKXJlYWRfY29uZmlnX2ZpbGUoX1BBVEhfSE9TVF9DT05GSUdfRklMRSwgaG9zdCwKLQkJICAgICZvcHRpb25zLCAwKTsKLQl9Ci0KLQkvKiBGaWxsIGNvbmZpZ3VyYXRpb24gZGVmYXVsdHMuICovCi0JZmlsbF9kZWZhdWx0X29wdGlvbnMoJm9wdGlvbnMpOwotCi0JY2hhbm5lbF9zZXRfYWYob3B0aW9ucy5hZGRyZXNzX2ZhbWlseSk7Ci0KLQkvKiByZWluaXQgKi8KLQlsb2dfaW5pdChhcmd2MCwgb3B0aW9ucy5sb2dfbGV2ZWwsIFNZU0xPR19GQUNJTElUWV9VU0VSLCAhdXNlX3N5c2xvZyk7Ci0KLQlzZWVkX3JuZygpOwotCi0JaWYgKG9wdGlvbnMudXNlciA9PSBOVUxMKQotCQlvcHRpb25zLnVzZXIgPSB4c3RyZHVwKHB3LT5wd19uYW1lKTsKLQotCS8qIEdldCBkZWZhdWx0IHBvcnQgaWYgcG9ydCBoYXMgbm90IGJlZW4gc2V0LiAqLwotCWlmIChvcHRpb25zLnBvcnQgPT0gMCkgewotCQlzcCA9IGdldHNlcnZieW5hbWUoU1NIX1NFUlZJQ0VfTkFNRSwgInRjcCIpOwotCQlvcHRpb25zLnBvcnQgPSBzcCA/IG50b2hzKHNwLT5zX3BvcnQpIDogU1NIX0RFRkFVTFRfUE9SVDsKLQl9Ci0KLQkvKiBwcmVzZXJ2ZSBob3N0IG5hbWUgZ2l2ZW4gb24gY29tbWFuZCBsaW5lIGZvciAlbiBleHBhbnNpb24gKi8KLQlob3N0X2FyZyA9IGhvc3Q7Ci0JaWYgKG9wdGlvbnMuaG9zdG5hbWUgIT0gTlVMTCkgewotCQlob3N0ID0gcGVyY2VudF9leHBhbmQob3B0aW9ucy5ob3N0bmFtZSwKLQkJICAgICJoIiwgaG9zdCwgKGNoYXIgKilOVUxMKTsKLQl9Ci0KLQlpZiAoZ2V0aG9zdG5hbWUodGhpc2hvc3QsIHNpemVvZih0aGlzaG9zdCkpID09IC0xKQotCQlmYXRhbCgiZ2V0aG9zdG5hbWU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQlzdHJsY3B5KHNob3J0aG9zdCwgdGhpc2hvc3QsIHNpemVvZihzaG9ydGhvc3QpKTsKLQlzaG9ydGhvc3Rbc3RyY3Nwbih0aGlzaG9zdCwgIi4iKV0gPSAnXDAnOwotCXNucHJpbnRmKHBvcnRzdHIsIHNpemVvZihwb3J0c3RyKSwgIiVkIiwgb3B0aW9ucy5wb3J0KTsKLQotCWlmIChvcHRpb25zLmxvY2FsX2NvbW1hbmQgIT0gTlVMTCkgewotCQlkZWJ1ZzMoImV4cGFuZGluZyBMb2NhbENvbW1hbmQ6ICVzIiwgb3B0aW9ucy5sb2NhbF9jb21tYW5kKTsKLQkJY3AgPSBvcHRpb25zLmxvY2FsX2NvbW1hbmQ7Ci0JCW9wdGlvbnMubG9jYWxfY29tbWFuZCA9IHBlcmNlbnRfZXhwYW5kKGNwLCAiZCIsIHB3LT5wd19kaXIsCi0JCSAgICAiaCIsIGhvc3QsICJsIiwgdGhpc2hvc3QsICJuIiwgaG9zdF9hcmcsICJyIiwgb3B0aW9ucy51c2VyLAotCQkgICAgInAiLCBwb3J0c3RyLCAidSIsIHB3LT5wd19uYW1lLCAiTCIsIHNob3J0aG9zdCwKLQkJICAgIChjaGFyICopTlVMTCk7Ci0JCWRlYnVnMygiZXhwYW5kZWQgTG9jYWxDb21tYW5kOiAlcyIsIG9wdGlvbnMubG9jYWxfY29tbWFuZCk7Ci0JCXhmcmVlKGNwKTsKLQl9Ci0KLQkvKiBmb3JjZSBsb3dlcmNhc2UgZm9yIGhvc3RrZXkgbWF0Y2hpbmcgKi8KLQlpZiAob3B0aW9ucy5ob3N0X2tleV9hbGlhcyAhPSBOVUxMKSB7Ci0JCWZvciAocCA9IG9wdGlvbnMuaG9zdF9rZXlfYWxpYXM7ICpwOyBwKyspCi0JCQlpZiAoaXN1cHBlcigqcCkpCi0JCQkJKnAgPSAoY2hhcil0b2xvd2VyKCpwKTsKLQl9Ci0KLQlpZiAob3B0aW9ucy5wcm94eV9jb21tYW5kICE9IE5VTEwgJiYKLQkgICAgc3RyY21wKG9wdGlvbnMucHJveHlfY29tbWFuZCwgIm5vbmUiKSA9PSAwKSB7Ci0JCXhmcmVlKG9wdGlvbnMucHJveHlfY29tbWFuZCk7Ci0JCW9wdGlvbnMucHJveHlfY29tbWFuZCA9IE5VTEw7Ci0JfQotCWlmIChvcHRpb25zLmNvbnRyb2xfcGF0aCAhPSBOVUxMICYmCi0JICAgIHN0cmNtcChvcHRpb25zLmNvbnRyb2xfcGF0aCwgIm5vbmUiKSA9PSAwKSB7Ci0JCXhmcmVlKG9wdGlvbnMuY29udHJvbF9wYXRoKTsKLQkJb3B0aW9ucy5jb250cm9sX3BhdGggPSBOVUxMOwotCX0KLQotCWlmIChvcHRpb25zLmNvbnRyb2xfcGF0aCAhPSBOVUxMKSB7Ci0JCWNwID0gdGlsZGVfZXhwYW5kX2ZpbGVuYW1lKG9wdGlvbnMuY29udHJvbF9wYXRoLAotCQkgICAgb3JpZ2luYWxfcmVhbF91aWQpOwotCQl4ZnJlZShvcHRpb25zLmNvbnRyb2xfcGF0aCk7Ci0JCW9wdGlvbnMuY29udHJvbF9wYXRoID0gcGVyY2VudF9leHBhbmQoY3AsICJoIiwgaG9zdCwKLQkJICAgICJsIiwgdGhpc2hvc3QsICJuIiwgaG9zdF9hcmcsICJyIiwgb3B0aW9ucy51c2VyLAotCQkgICAgInAiLCBwb3J0c3RyLCAidSIsIHB3LT5wd19uYW1lLCAiTCIsIHNob3J0aG9zdCwKLQkJICAgIChjaGFyICopTlVMTCk7Ci0JCXhmcmVlKGNwKTsKLQl9Ci0JaWYgKG11eGNsaWVudF9jb21tYW5kICE9IDAgJiYgb3B0aW9ucy5jb250cm9sX3BhdGggPT0gTlVMTCkKLQkJZmF0YWwoIk5vIENvbnRyb2xQYXRoIHNwZWNpZmllZCBmb3IgXCItT1wiIGNvbW1hbmQiKTsKLQlpZiAob3B0aW9ucy5jb250cm9sX3BhdGggIT0gTlVMTCkKLQkJbXV4Y2xpZW50KG9wdGlvbnMuY29udHJvbF9wYXRoKTsKLQotCXRpbWVvdXRfbXMgPSBvcHRpb25zLmNvbm5lY3Rpb25fdGltZW91dCAqIDEwMDA7Ci0KLQkvKiBPcGVuIGEgY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIGhvc3QuICovCi0JaWYgKHNzaF9jb25uZWN0KGhvc3QsICZob3N0YWRkciwgb3B0aW9ucy5wb3J0LAotCSAgICBvcHRpb25zLmFkZHJlc3NfZmFtaWx5LCBvcHRpb25zLmNvbm5lY3Rpb25fYXR0ZW1wdHMsICZ0aW1lb3V0X21zLAotCSAgICBvcHRpb25zLnRjcF9rZWVwX2FsaXZlLCAKLSNpZmRlZiBIQVZFX0NZR1dJTgotCSAgICBvcHRpb25zLnVzZV9wcml2aWxlZ2VkX3BvcnQsCi0jZWxzZQotCSAgICBvcmlnaW5hbF9lZmZlY3RpdmVfdWlkID09IDAgJiYgb3B0aW9ucy51c2VfcHJpdmlsZWdlZF9wb3J0LAotI2VuZGlmCi0JICAgIG9wdGlvbnMucHJveHlfY29tbWFuZCkgIT0gMCkKLQkJZXhpdCgyNTUpOwotCi0JaWYgKHRpbWVvdXRfbXMgPiAwKQotCQlkZWJ1ZzMoInRpbWVvdXQ6ICVkIG1zIHJlbWFpbiBhZnRlciBjb25uZWN0IiwgdGltZW91dF9tcyk7Ci0KLQkvKgotCSAqIElmIHdlIHN1Y2Nlc3NmdWxseSBtYWRlIHRoZSBjb25uZWN0aW9uLCBsb2FkIHRoZSBob3N0IHByaXZhdGUga2V5Ci0JICogaW4gY2FzZSB3ZSB3aWxsIG5lZWQgaXQgbGF0ZXIgZm9yIGNvbWJpbmVkIHJzYS1yaG9zdHMKLQkgKiBhdXRoZW50aWNhdGlvbi4gVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHJlbGVhc2luZyBleHRyYQotCSAqIHByaXZpbGVnZXMsIGJlY2F1c2UgdGhlIGZpbGUgaXMgb25seSByZWFkYWJsZSBieSByb290LgotCSAqIElmIHdlIGNhbm5vdCBhY2Nlc3MgdGhlIHByaXZhdGUga2V5cywgbG9hZCB0aGUgcHVibGljIGtleXMKLQkgKiBpbnN0ZWFkIGFuZCB0cnkgdG8gZXhlY3V0ZSB0aGUgc3NoLWtleXNpZ24gaGVscGVyIGluc3RlYWQuCi0JICovCi0Jc2Vuc2l0aXZlX2RhdGEubmtleXMgPSAwOwotCXNlbnNpdGl2ZV9kYXRhLmtleXMgPSBOVUxMOwotCXNlbnNpdGl2ZV9kYXRhLmV4dGVybmFsX2tleXNpZ24gPSAwOwotCWlmIChvcHRpb25zLnJob3N0c19yc2FfYXV0aGVudGljYXRpb24gfHwKLQkgICAgb3B0aW9ucy5ob3N0YmFzZWRfYXV0aGVudGljYXRpb24pIHsKLQkJc2Vuc2l0aXZlX2RhdGEubmtleXMgPSA3OwotCQlzZW5zaXRpdmVfZGF0YS5rZXlzID0geGNhbGxvYyhzZW5zaXRpdmVfZGF0YS5ua2V5cywKLQkJICAgIHNpemVvZihLZXkpKTsKLQkJZm9yIChpID0gMDsgaSA8IHNlbnNpdGl2ZV9kYXRhLm5rZXlzOyBpKyspCi0JCQlzZW5zaXRpdmVfZGF0YS5rZXlzW2ldID0gTlVMTDsKLQotCQlQUklWX1NUQVJUOwotCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzBdID0ga2V5X2xvYWRfcHJpdmF0ZV90eXBlKEtFWV9SU0ExLAotCQkgICAgX1BBVEhfSE9TVF9LRVlfRklMRSwgIiIsIE5VTEwsIE5VTEwpOwotCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzFdID0ga2V5X2xvYWRfcHJpdmF0ZV9jZXJ0KEtFWV9EU0EsCi0JCSAgICBfUEFUSF9IT1NUX0RTQV9LRVlfRklMRSwgIiIsIE5VTEwpOwotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzJdID0ga2V5X2xvYWRfcHJpdmF0ZV9jZXJ0KEtFWV9FQ0RTQSwKLQkJICAgIF9QQVRIX0hPU1RfRUNEU0FfS0VZX0ZJTEUsICIiLCBOVUxMKTsKLSNlbmRpZgotCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzNdID0ga2V5X2xvYWRfcHJpdmF0ZV9jZXJ0KEtFWV9SU0EsCi0JCSAgICBfUEFUSF9IT1NUX1JTQV9LRVlfRklMRSwgIiIsIE5VTEwpOwotCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzRdID0ga2V5X2xvYWRfcHJpdmF0ZV90eXBlKEtFWV9EU0EsCi0JCSAgICBfUEFUSF9IT1NUX0RTQV9LRVlfRklMRSwgIiIsIE5VTEwsIE5VTEwpOwotI2lmZGVmIE9QRU5TU0xfSEFTX0VDQwotCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzVdID0ga2V5X2xvYWRfcHJpdmF0ZV90eXBlKEtFWV9FQ0RTQSwKLQkJICAgIF9QQVRIX0hPU1RfRUNEU0FfS0VZX0ZJTEUsICIiLCBOVUxMLCBOVUxMKTsKLSNlbmRpZgotCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzZdID0ga2V5X2xvYWRfcHJpdmF0ZV90eXBlKEtFWV9SU0EsCi0JCSAgICBfUEFUSF9IT1NUX1JTQV9LRVlfRklMRSwgIiIsIE5VTEwsIE5VTEwpOwotCQlQUklWX0VORDsKLQotCQlpZiAob3B0aW9ucy5ob3N0YmFzZWRfYXV0aGVudGljYXRpb24gPT0gMSAmJgotCQkgICAgc2Vuc2l0aXZlX2RhdGEua2V5c1swXSA9PSBOVUxMICYmCi0JCSAgICBzZW5zaXRpdmVfZGF0YS5rZXlzWzRdID09IE5VTEwgJiYKLQkJICAgIHNlbnNpdGl2ZV9kYXRhLmtleXNbNV0gPT0gTlVMTCAmJgotCQkgICAgc2Vuc2l0aXZlX2RhdGEua2V5c1s2XSA9PSBOVUxMKSB7Ci0JCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzFdID0ga2V5X2xvYWRfY2VydCgKLQkJCSAgICBfUEFUSF9IT1NUX0RTQV9LRVlfRklMRSk7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzJdID0ga2V5X2xvYWRfY2VydCgKLQkJCSAgICBfUEFUSF9IT1NUX0VDRFNBX0tFWV9GSUxFKTsKLSNlbmRpZgotCQkJc2Vuc2l0aXZlX2RhdGEua2V5c1szXSA9IGtleV9sb2FkX2NlcnQoCi0JCQkgICAgX1BBVEhfSE9TVF9SU0FfS0VZX0ZJTEUpOwotCQkJc2Vuc2l0aXZlX2RhdGEua2V5c1s0XSA9IGtleV9sb2FkX3B1YmxpYygKLQkJCSAgICBfUEFUSF9IT1NUX0RTQV9LRVlfRklMRSwgTlVMTCk7Ci0jaWZkZWYgT1BFTlNTTF9IQVNfRUNDCi0JCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzVdID0ga2V5X2xvYWRfcHVibGljKAotCQkJICAgIF9QQVRIX0hPU1RfRUNEU0FfS0VZX0ZJTEUsIE5VTEwpOwotI2VuZGlmCi0JCQlzZW5zaXRpdmVfZGF0YS5rZXlzWzZdID0ga2V5X2xvYWRfcHVibGljKAotCQkJICAgIF9QQVRIX0hPU1RfUlNBX0tFWV9GSUxFLCBOVUxMKTsKLQkJCXNlbnNpdGl2ZV9kYXRhLmV4dGVybmFsX2tleXNpZ24gPSAxOwotCQl9Ci0JfQotCS8qCi0JICogR2V0IHJpZCBvZiBhbnkgZXh0cmEgcHJpdmlsZWdlcyB0aGF0IHdlIG1heSBoYXZlLiAgV2Ugd2lsbCBubwotCSAqIGxvbmdlciBuZWVkIHRoZW0uICBBbHNvLCBleHRyYSBwcml2aWxlZ2VzIGNvdWxkIG1ha2UgaXQgdmVyeSBoYXJkCi0JICogdG8gcmVhZCBpZGVudGl0eSBmaWxlcyBhbmQgb3RoZXIgbm9uLXdvcmxkLXJlYWRhYmxlIGZpbGVzIGZyb20gdGhlCi0JICogdXNlcidzIGhvbWUgZGlyZWN0b3J5IGlmIGl0IGhhcHBlbnMgdG8gYmUgb24gYSBORlMgdm9sdW1lIHdoZXJlCi0JICogcm9vdCBpcyBtYXBwZWQgdG8gbm9ib2R5LgotCSAqLwotCWlmIChvcmlnaW5hbF9lZmZlY3RpdmVfdWlkID09IDApIHsKLQkJUFJJVl9TVEFSVDsKLQkJcGVybWFuZW50bHlfc2V0X3VpZChwdyk7Ci0JfQotCi0JLyoKLQkgKiBOb3cgdGhhdCB3ZSBhcmUgYmFjayB0byBvdXIgb3duIHBlcm1pc3Npb25zLCBjcmVhdGUgfi8uc3NoCi0JICogZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KLQkgKi8KLQlyID0gc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJXMlcyVzIiwgcHctPnB3X2RpciwKLQkgICAgc3RyY21wKHB3LT5wd19kaXIsICIvIikgPyAiLyIgOiAiIiwgX1BBVEhfU1NIX1VTRVJfRElSKTsKLQlpZiAociA+IDAgJiYgKHNpemVfdClyIDwgc2l6ZW9mKGJ1ZikgJiYgc3RhdChidWYsICZzdCkgPCAwKSB7Ci0jaWZkZWYgV0lUSF9TRUxJTlVYCi0JCXNzaF9zZWxpbnV4X3NldGZzY3JlYXRlY29uKGJ1Zik7Ci0jZW5kaWYKLQkJaWYgKG1rZGlyKGJ1ZiwgMDcwMCkgPCAwKQotCQkJZXJyb3IoIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5ICclLjIwMHMnLiIsIGJ1Zik7Ci0jaWZkZWYgV0lUSF9TRUxJTlVYCi0JCXNzaF9zZWxpbnV4X3NldGZzY3JlYXRlY29uKE5VTEwpOwotI2VuZGlmCi0JfQotCS8qIGxvYWQgb3B0aW9ucy5pZGVudGl0eV9maWxlcyAqLwotCWxvYWRfcHVibGljX2lkZW50aXR5X2ZpbGVzKCk7Ci0KLQkvKiBFeHBhbmQgfiBpbiBrbm93biBob3N0IGZpbGUgbmFtZXMuICovCi0JdGlsZGVfZXhwYW5kX3BhdGhzKG9wdGlvbnMuc3lzdGVtX2hvc3RmaWxlcywKLQkgICAgb3B0aW9ucy5udW1fc3lzdGVtX2hvc3RmaWxlcyk7Ci0JdGlsZGVfZXhwYW5kX3BhdGhzKG9wdGlvbnMudXNlcl9ob3N0ZmlsZXMsIG9wdGlvbnMubnVtX3VzZXJfaG9zdGZpbGVzKTsKLQotCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsgLyogaWdub3JlIFNJR1BJUEUgZWFybHkgKi8KLQlzaWduYWwoU0lHQ0hMRCwgbWFpbl9zaWdjaGxkX2hhbmRsZXIpOwotCi0JLyogTG9nIGludG8gdGhlIHJlbW90ZSBzeXN0ZW0uICBOZXZlciByZXR1cm5zIGlmIHRoZSBsb2dpbiBmYWlscy4gKi8KLQlzc2hfbG9naW4oJnNlbnNpdGl2ZV9kYXRhLCBob3N0LCAoc3RydWN0IHNvY2thZGRyICopJmhvc3RhZGRyLAotCSAgICBvcHRpb25zLnBvcnQsIHB3LCB0aW1lb3V0X21zKTsKLQotCWlmIChwYWNrZXRfY29ubmVjdGlvbl9pc19vbl9zb2NrZXQoKSkgewotCQl2ZXJib3NlKCJBdXRoZW50aWNhdGVkIHRvICVzIChbJXNdOiVkKS4iLCBob3N0LAotCQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSwgZ2V0X3JlbW90ZV9wb3J0KCkpOwotCX0gZWxzZSB7Ci0JCXZlcmJvc2UoIkF1dGhlbnRpY2F0ZWQgdG8gJXMgKHZpYSBwcm94eSkuIiwgaG9zdCk7Ci0JfQotCi0JLyogV2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIHByaXZhdGUgaG9zdCBrZXlzLiAgQ2xlYXIgdGhlbSBub3cuICovCi0JaWYgKHNlbnNpdGl2ZV9kYXRhLm5rZXlzICE9IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IHNlbnNpdGl2ZV9kYXRhLm5rZXlzOyBpKyspIHsKLQkJCWlmIChzZW5zaXRpdmVfZGF0YS5rZXlzW2ldICE9IE5VTEwpIHsKLQkJCQkvKiBEZXN0cm95cyBjb250ZW50cyBzYWZlbHkgKi8KLQkJCQlkZWJ1ZzMoImNsZWFyIGhvc3RrZXkgJWQiLCBpKTsKLQkJCQlrZXlfZnJlZShzZW5zaXRpdmVfZGF0YS5rZXlzW2ldKTsKLQkJCQlzZW5zaXRpdmVfZGF0YS5rZXlzW2ldID0gTlVMTDsKLQkJCX0KLQkJfQotCQl4ZnJlZShzZW5zaXRpdmVfZGF0YS5rZXlzKTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2lkZW50aXR5X2ZpbGVzOyBpKyspIHsKLQkJaWYgKG9wdGlvbnMuaWRlbnRpdHlfZmlsZXNbaV0pIHsKLQkJCXhmcmVlKG9wdGlvbnMuaWRlbnRpdHlfZmlsZXNbaV0pOwotCQkJb3B0aW9ucy5pZGVudGl0eV9maWxlc1tpXSA9IE5VTEw7Ci0JCX0KLQkJaWYgKG9wdGlvbnMuaWRlbnRpdHlfa2V5c1tpXSkgewotCQkJa2V5X2ZyZWUob3B0aW9ucy5pZGVudGl0eV9rZXlzW2ldKTsKLQkJCW9wdGlvbnMuaWRlbnRpdHlfa2V5c1tpXSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlleGl0X3N0YXR1cyA9IGNvbXBhdDIwID8gc3NoX3Nlc3Npb24yKCkgOiBzc2hfc2Vzc2lvbigpOwotCXBhY2tldF9jbG9zZSgpOwotCi0JaWYgKG9wdGlvbnMuY29udHJvbF9wYXRoICE9IE5VTEwgJiYgbXV4c2VydmVyX3NvY2sgIT0gLTEpCi0JCXVubGluayhvcHRpb25zLmNvbnRyb2xfcGF0aCk7Ci0KLQkvKiBLaWxsIFByb3h5Q29tbWFuZCBpZiBpdCBpcyBydW5uaW5nLiAqLwotCXNzaF9raWxsX3Byb3h5X2NvbW1hbmQoKTsKLQotCXJldHVybiBleGl0X3N0YXR1czsKLX0KLQotc3RhdGljIHZvaWQKLWNvbnRyb2xfcGVyc2lzdF9kZXRhY2godm9pZCkKLXsKLQlwaWRfdCBwaWQ7Ci0JaW50IGRldm51bGw7Ci0KLQlkZWJ1ZygiJXM6IGJhY2tncm91bmRpbmcgbWFzdGVyIHByb2Nlc3MiLCBfX2Z1bmNfXyk7Ci0KLSAJLyoKLSAJICogbWFzdGVyIChjdXJyZW50IHByb2Nlc3MpIGludG8gdGhlIGJhY2tncm91bmQsIGFuZCBtYWtlIHRoZQotIAkgKiBmb3JlZ3JvdW5kIHByb2Nlc3MgYSBjbGllbnQgb2YgdGhlIGJhY2tncm91bmRlZCBtYXN0ZXIuCi0gCSAqLwotCXN3aXRjaCAoKHBpZCA9IGZvcmsoKSkpIHsKLQljYXNlIC0xOgotCQlmYXRhbCgiJXM6IGZvcms6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JY2FzZSAwOgotCQkvKiBDaGlsZDogbWFzdGVyIHByb2Nlc3MgY29udGludWVzIG1haW5sb29wICovCi0gCQlicmVhazsKLSAJZGVmYXVsdDoKLQkJLyogUGFyZW50OiBzZXQgdXAgbXV4IHNsYXZlIHRvIGNvbm5lY3QgdG8gYmFja2dyb3VuZGVkIG1hc3RlciAqLwotCQlkZWJ1ZzIoIiVzOiBiYWNrZ3JvdW5kIHByb2Nlc3MgaXMgJWxkIiwgX19mdW5jX18sIChsb25nKXBpZCk7Ci0JCXN0ZGluX251bGxfZmxhZyA9IG9zdGRpbl9udWxsX2ZsYWc7Ci0JCW9wdGlvbnMucmVxdWVzdF90dHkgPSBvcmVxdWVzdF90dHk7Ci0JCXR0eV9mbGFnID0gb3R0eV9mbGFnOwotIAkJY2xvc2UobXV4c2VydmVyX3NvY2spOwotIAkJbXV4c2VydmVyX3NvY2sgPSAtMTsKLQkJb3B0aW9ucy5jb250cm9sX21hc3RlciA9IFNTSENUTF9NQVNURVJfTk87Ci0gCQltdXhjbGllbnQob3B0aW9ucy5jb250cm9sX3BhdGgpOwotCQkvKiBtdXhjbGllbnQoKSBkb2Vzbid0IHJldHVybiBvbiBzdWNjZXNzLiAqLwotIAkJZmF0YWwoIkZhaWxlZCB0byBjb25uZWN0IHRvIG5ldyBjb250cm9sIG1hc3RlciIpOwotIAl9Ci0JaWYgKChkZXZudWxsID0gb3BlbihfUEFUSF9ERVZOVUxMLCBPX1JEV1IpKSA9PSAtMSkgewotCQllcnJvcigiJXM6IG9wZW4oXCIvZGV2L251bGxcIik6ICVzIiwgX19mdW5jX18sCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCX0gZWxzZSB7Ci0JCWlmIChkdXAyKGRldm51bGwsIFNURElOX0ZJTEVOTykgPT0gLTEgfHwKLQkJICAgIGR1cDIoZGV2bnVsbCwgU1RET1VUX0ZJTEVOTykgPT0gLTEpCi0JCQllcnJvcigiJXM6IGR1cDI6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0JCWlmIChkZXZudWxsID4gU1RERVJSX0ZJTEVOTykKLQkJCWNsb3NlKGRldm51bGwpOwotCX0KLQlzZXRwcm9jdGl0bGUoIiVzIFttdXhdIiwgb3B0aW9ucy5jb250cm9sX3BhdGgpOwotfQotCi0vKiBEbyBmb3JrKCkgYWZ0ZXIgYXV0aGVudGljYXRpb24uIFVzZWQgYnkgInNzaCAtZiIgKi8KLXN0YXRpYyB2b2lkCi1mb3JrX3Bvc3RhdXRoKHZvaWQpCi17Ci0JaWYgKG5lZWRfY29udHJvbHBlcnNpc3RfZGV0YWNoKQotCQljb250cm9sX3BlcnNpc3RfZGV0YWNoKCk7Ci0JZGVidWcoImZvcmtpbmcgdG8gYmFja2dyb3VuZCIpOwotCWZvcmtfYWZ0ZXJfYXV0aGVudGljYXRpb25fZmxhZyA9IDA7Ci0JaWYgKGRhZW1vbigxLCAxKSA8IDApCi0JCWZhdGFsKCJkYWVtb24oKSBmYWlsZWQ6ICUuMjAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci19Ci0KLS8qIENhbGxiYWNrIGZvciByZW1vdGUgZm9yd2FyZCBnbG9iYWwgcmVxdWVzdHMgKi8KLXN0YXRpYyB2b2lkCi1zc2hfY29uZmlybV9yZW1vdGVfZm9yd2FyZChpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlGb3J3YXJkICpyZndkID0gKEZvcndhcmQgKiljdHh0OwotCi0JLyogWFhYIHZlcmJvc2UoKSBvbiBmYWlsdXJlPyAqLwotCWRlYnVnKCJyZW1vdGUgZm9yd2FyZCAlcyBmb3I6IGxpc3RlbiAlZCwgY29ubmVjdCAlczolZCIsCi0JICAgIHR5cGUgPT0gU1NIMl9NU0dfUkVRVUVTVF9TVUNDRVNTID8gInN1Y2Nlc3MiIDogImZhaWx1cmUiLAotCSAgICByZndkLT5saXN0ZW5fcG9ydCwgcmZ3ZC0+Y29ubmVjdF9ob3N0LCByZndkLT5jb25uZWN0X3BvcnQpOwotCWlmICh0eXBlID09IFNTSDJfTVNHX1JFUVVFU1RfU1VDQ0VTUyAmJiByZndkLT5saXN0ZW5fcG9ydCA9PSAwKSB7Ci0JCXJmd2QtPmFsbG9jYXRlZF9wb3J0ID0gcGFja2V0X2dldF9pbnQoKTsKLQkJbG9naXQoIkFsbG9jYXRlZCBwb3J0ICV1IGZvciByZW1vdGUgZm9yd2FyZCB0byAlczolZCIsCi0JCSAgICByZndkLT5hbGxvY2F0ZWRfcG9ydCwKLQkJICAgIHJmd2QtPmNvbm5lY3RfaG9zdCwgcmZ3ZC0+Y29ubmVjdF9wb3J0KTsKLQl9Ci0JCi0JaWYgKHR5cGUgPT0gU1NIMl9NU0dfUkVRVUVTVF9GQUlMVVJFKSB7Ci0JCWlmIChvcHRpb25zLmV4aXRfb25fZm9yd2FyZF9mYWlsdXJlKQotCQkJZmF0YWwoIkVycm9yOiByZW1vdGUgcG9ydCBmb3J3YXJkaW5nIGZhaWxlZCBmb3IgIgotCQkJICAgICJsaXN0ZW4gcG9ydCAlZCIsIHJmd2QtPmxpc3Rlbl9wb3J0KTsKLQkJZWxzZQotCQkJbG9naXQoIldhcm5pbmc6IHJlbW90ZSBwb3J0IGZvcndhcmRpbmcgZmFpbGVkIGZvciAiCi0JCQkgICAgImxpc3RlbiBwb3J0ICVkIiwgcmZ3ZC0+bGlzdGVuX3BvcnQpOwotCX0KLQlpZiAoKytyZW1vdGVfZm9yd2FyZF9jb25maXJtc19yZWNlaXZlZCA9PSBvcHRpb25zLm51bV9yZW1vdGVfZm9yd2FyZHMpIHsKLQkJZGVidWcoIkFsbCByZW1vdGUgZm9yd2FyZGluZyByZXF1ZXN0cyBwcm9jZXNzZWQiKTsKLQkJaWYgKGZvcmtfYWZ0ZXJfYXV0aGVudGljYXRpb25fZmxhZykKLQkJCWZvcmtfcG9zdGF1dGgoKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jbGllbnRfY2xlYW51cF9zdGRpb19md2QoaW50IGlkLCB2b2lkICphcmcpCi17Ci0JZGVidWcoInN0ZGlvIGZvcndhcmRpbmc6IGRvbmUiKTsKLQljbGVhbnVwX2V4aXQoMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNsaWVudF9zZXR1cF9zdGRpb19md2QoY29uc3QgY2hhciAqaG9zdF90b19jb25uZWN0LCB1X3Nob3J0IHBvcnRfdG9fY29ubmVjdCkKLXsKLQlDaGFubmVsICpjOwotCWludCBpbiwgb3V0OwotCi0JZGVidWczKCJjbGllbnRfc2V0dXBfc3RkaW9fZndkICVzOiVkIiwgaG9zdF90b19jb25uZWN0LAotCSAgICBwb3J0X3RvX2Nvbm5lY3QpOwotCi0JaW4gPSBkdXAoU1RESU5fRklMRU5PKTsKLQlvdXQgPSBkdXAoU1RET1VUX0ZJTEVOTyk7Ci0JaWYgKGluIDwgMCB8fCBvdXQgPCAwKQotCQlmYXRhbCgiY2hhbm5lbF9jb25uZWN0X3N0ZGlvX2Z3ZDogZHVwKCkgaW4vb3V0IGZhaWxlZCIpOwotCi0JaWYgKChjID0gY2hhbm5lbF9jb25uZWN0X3N0ZGlvX2Z3ZChob3N0X3RvX2Nvbm5lY3QsIHBvcnRfdG9fY29ubmVjdCwKLQkgICAgaW4sIG91dCkpID09IE5VTEwpCi0JCXJldHVybiAwOwotCWNoYW5uZWxfcmVnaXN0ZXJfY2xlYW51cChjLT5zZWxmLCBjbGllbnRfY2xlYW51cF9zdGRpb19md2QsIDApOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotc3NoX2luaXRfZm9yd2FyZGluZyh2b2lkKQotewotCWludCBzdWNjZXNzID0gMDsKLQlpbnQgaTsKLQotCWlmIChzdGRpb19mb3J3YXJkX2hvc3QgIT0gTlVMTCkgewotCQlpZiAoIWNvbXBhdDIwKSB7Ci0JCQlmYXRhbCgic3RkaW8gZm9yd2FyZGluZyByZXF1aXJlIFByb3RvY29sIDIiKTsKLQkJfQotCQlpZiAoIWNsaWVudF9zZXR1cF9zdGRpb19md2Qoc3RkaW9fZm9yd2FyZF9ob3N0LAotCQkgICAgc3RkaW9fZm9yd2FyZF9wb3J0KSkKLQkJCWZhdGFsKCJGYWlsZWQgdG8gY29ubmVjdCBpbiBzdGRpbyBmb3J3YXJkIG1vZGUuIik7Ci0JfQotCi0JLyogSW5pdGlhdGUgbG9jYWwgVENQL0lQIHBvcnQgZm9yd2FyZGluZ3MuICovCi0JZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2xvY2FsX2ZvcndhcmRzOyBpKyspIHsKLQkJZGVidWcoIkxvY2FsIGNvbm5lY3Rpb25zIHRvICUuMjAwczolZCBmb3J3YXJkZWQgdG8gcmVtb3RlICIKLQkJICAgICJhZGRyZXNzICUuMjAwczolZCIsCi0JCSAgICAob3B0aW9ucy5sb2NhbF9mb3J3YXJkc1tpXS5saXN0ZW5faG9zdCA9PSBOVUxMKSA/Ci0JCSAgICAob3B0aW9ucy5nYXRld2F5X3BvcnRzID8gIioiIDogIkxPQ0FMSE9TVCIpIDoKLQkJICAgIG9wdGlvbnMubG9jYWxfZm9yd2FyZHNbaV0ubGlzdGVuX2hvc3QsCi0JCSAgICBvcHRpb25zLmxvY2FsX2ZvcndhcmRzW2ldLmxpc3Rlbl9wb3J0LAotCQkgICAgb3B0aW9ucy5sb2NhbF9mb3J3YXJkc1tpXS5jb25uZWN0X2hvc3QsCi0JCSAgICBvcHRpb25zLmxvY2FsX2ZvcndhcmRzW2ldLmNvbm5lY3RfcG9ydCk7Ci0JCXN1Y2Nlc3MgKz0gY2hhbm5lbF9zZXR1cF9sb2NhbF9md2RfbGlzdGVuZXIoCi0JCSAgICBvcHRpb25zLmxvY2FsX2ZvcndhcmRzW2ldLmxpc3Rlbl9ob3N0LAotCQkgICAgb3B0aW9ucy5sb2NhbF9mb3J3YXJkc1tpXS5saXN0ZW5fcG9ydCwKLQkJICAgIG9wdGlvbnMubG9jYWxfZm9yd2FyZHNbaV0uY29ubmVjdF9ob3N0LAotCQkgICAgb3B0aW9ucy5sb2NhbF9mb3J3YXJkc1tpXS5jb25uZWN0X3BvcnQsCi0JCSAgICBvcHRpb25zLmdhdGV3YXlfcG9ydHMpOwotCX0KLQlpZiAoaSA+IDAgJiYgc3VjY2VzcyAhPSBpICYmIG9wdGlvbnMuZXhpdF9vbl9mb3J3YXJkX2ZhaWx1cmUpCi0JCWZhdGFsKCJDb3VsZCBub3QgcmVxdWVzdCBsb2NhbCBmb3J3YXJkaW5nLiIpOwotCWlmIChpID4gMCAmJiBzdWNjZXNzID09IDApCi0JCWVycm9yKCJDb3VsZCBub3QgcmVxdWVzdCBsb2NhbCBmb3J3YXJkaW5nLiIpOwotCi0JLyogSW5pdGlhdGUgcmVtb3RlIFRDUC9JUCBwb3J0IGZvcndhcmRpbmdzLiAqLwotCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9yZW1vdGVfZm9yd2FyZHM7IGkrKykgewotCQlkZWJ1ZygiUmVtb3RlIGNvbm5lY3Rpb25zIGZyb20gJS4yMDBzOiVkIGZvcndhcmRlZCB0byAiCi0JCSAgICAibG9jYWwgYWRkcmVzcyAlLjIwMHM6JWQiLAotCQkgICAgKG9wdGlvbnMucmVtb3RlX2ZvcndhcmRzW2ldLmxpc3Rlbl9ob3N0ID09IE5VTEwpID8KLQkJICAgICJMT0NBTEhPU1QiIDogb3B0aW9ucy5yZW1vdGVfZm9yd2FyZHNbaV0ubGlzdGVuX2hvc3QsCi0JCSAgICBvcHRpb25zLnJlbW90ZV9mb3J3YXJkc1tpXS5saXN0ZW5fcG9ydCwKLQkJICAgIG9wdGlvbnMucmVtb3RlX2ZvcndhcmRzW2ldLmNvbm5lY3RfaG9zdCwKLQkJICAgIG9wdGlvbnMucmVtb3RlX2ZvcndhcmRzW2ldLmNvbm5lY3RfcG9ydCk7Ci0JCWlmIChjaGFubmVsX3JlcXVlc3RfcmVtb3RlX2ZvcndhcmRpbmcoCi0JCSAgICBvcHRpb25zLnJlbW90ZV9mb3J3YXJkc1tpXS5saXN0ZW5faG9zdCwKLQkJICAgIG9wdGlvbnMucmVtb3RlX2ZvcndhcmRzW2ldLmxpc3Rlbl9wb3J0LAotCQkgICAgb3B0aW9ucy5yZW1vdGVfZm9yd2FyZHNbaV0uY29ubmVjdF9ob3N0LAotCQkgICAgb3B0aW9ucy5yZW1vdGVfZm9yd2FyZHNbaV0uY29ubmVjdF9wb3J0KSA8IDApIHsKLQkJCWlmIChvcHRpb25zLmV4aXRfb25fZm9yd2FyZF9mYWlsdXJlKQotCQkJCWZhdGFsKCJDb3VsZCBub3QgcmVxdWVzdCByZW1vdGUgZm9yd2FyZGluZy4iKTsKLQkJCWVsc2UKLQkJCQlsb2dpdCgiV2FybmluZzogQ291bGQgbm90IHJlcXVlc3QgcmVtb3RlICIKLQkJCQkgICAgImZvcndhcmRpbmcuIik7Ci0JCX0KLQkJY2xpZW50X3JlZ2lzdGVyX2dsb2JhbF9jb25maXJtKHNzaF9jb25maXJtX3JlbW90ZV9mb3J3YXJkLAotCQkgICAgJm9wdGlvbnMucmVtb3RlX2ZvcndhcmRzW2ldKTsKLQl9Ci0KLQkvKiBJbml0aWF0ZSB0dW5uZWwgZm9yd2FyZGluZy4gKi8KLQlpZiAob3B0aW9ucy50dW5fb3BlbiAhPSBTU0hfVFVOTU9ERV9OTykgewotCQlpZiAoY2xpZW50X3JlcXVlc3RfdHVuX2Z3ZChvcHRpb25zLnR1bl9vcGVuLAotCQkgICAgb3B0aW9ucy50dW5fbG9jYWwsIG9wdGlvbnMudHVuX3JlbW90ZSkgPT0gLTEpIHsKLQkJCWlmIChvcHRpb25zLmV4aXRfb25fZm9yd2FyZF9mYWlsdXJlKQotCQkJCWZhdGFsKCJDb3VsZCBub3QgcmVxdWVzdCB0dW5uZWwgZm9yd2FyZGluZy4iKTsKLQkJCWVsc2UKLQkJCQllcnJvcigiQ291bGQgbm90IHJlcXVlc3QgdHVubmVsIGZvcndhcmRpbmcuIik7Ci0JCX0KLQl9CQkJCi19Ci0KLXN0YXRpYyB2b2lkCi1jaGVja19hZ2VudF9wcmVzZW50KHZvaWQpCi17Ci0JaWYgKG9wdGlvbnMuZm9yd2FyZF9hZ2VudCkgewotCQkvKiBDbGVhciBhZ2VudCBmb3J3YXJkaW5nIGlmIHdlIGRvbid0IGhhdmUgYW4gYWdlbnQuICovCi0JCWlmICghc3NoX2FnZW50X3ByZXNlbnQoKSkKLQkJCW9wdGlvbnMuZm9yd2FyZF9hZ2VudCA9IDA7Ci0JfQotfQotCi1zdGF0aWMgaW50Ci1zc2hfc2Vzc2lvbih2b2lkKQotewotCWludCB0eXBlOwotCWludCBpbnRlcmFjdGl2ZSA9IDA7Ci0JaW50IGhhdmVfdHR5ID0gMDsKLQlzdHJ1Y3Qgd2luc2l6ZSB3czsKLQljaGFyICpjcDsKLQljb25zdCBjaGFyICpkaXNwbGF5OwotCi0JLyogRW5hYmxlIGNvbXByZXNzaW9uIGlmIHJlcXVlc3RlZC4gKi8KLQlpZiAob3B0aW9ucy5jb21wcmVzc2lvbikgewotCQlkZWJ1ZygiUmVxdWVzdGluZyBjb21wcmVzc2lvbiBhdCBsZXZlbCAlZC4iLAotCQkgICAgb3B0aW9ucy5jb21wcmVzc2lvbl9sZXZlbCk7Ci0KLQkJaWYgKG9wdGlvbnMuY29tcHJlc3Npb25fbGV2ZWwgPCAxIHx8Ci0JCSAgICBvcHRpb25zLmNvbXByZXNzaW9uX2xldmVsID4gOSkKLQkJCWZhdGFsKCJDb21wcmVzc2lvbiBsZXZlbCBtdXN0IGJlIGZyb20gMSAoZmFzdCkgdG8gIgotCQkJICAgICI5IChzbG93LCBiZXN0KS4iKTsKLQotCQkvKiBTZW5kIHRoZSByZXF1ZXN0LiAqLwotCQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfUkVRVUVTVF9DT01QUkVTU0lPTik7Ci0JCXBhY2tldF9wdXRfaW50KG9wdGlvbnMuY29tcHJlc3Npb25fbGV2ZWwpOwotCQlwYWNrZXRfc2VuZCgpOwotCQlwYWNrZXRfd3JpdGVfd2FpdCgpOwotCQl0eXBlID0gcGFja2V0X3JlYWQoKTsKLQkJaWYgKHR5cGUgPT0gU1NIX1NNU0dfU1VDQ0VTUykKLQkJCXBhY2tldF9zdGFydF9jb21wcmVzc2lvbihvcHRpb25zLmNvbXByZXNzaW9uX2xldmVsKTsKLQkJZWxzZSBpZiAodHlwZSA9PSBTU0hfU01TR19GQUlMVVJFKQotCQkJbG9naXQoIldhcm5pbmc6IFJlbW90ZSBob3N0IHJlZnVzZWQgY29tcHJlc3Npb24uIik7Ci0JCWVsc2UKLQkJCXBhY2tldF9kaXNjb25uZWN0KCJQcm90b2NvbCBlcnJvciB3YWl0aW5nIGZvciAiCi0JCQkgICAgImNvbXByZXNzaW9uIHJlc3BvbnNlLiIpOwotCX0KLQkvKiBBbGxvY2F0ZSBhIHBzZXVkbyB0dHkgaWYgYXBwcm9wcmlhdGUuICovCi0JaWYgKHR0eV9mbGFnKSB7Ci0JCWRlYnVnKCJSZXF1ZXN0aW5nIHB0eS4iKTsKLQotCQkvKiBTdGFydCB0aGUgcGFja2V0LiAqLwotCQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfUkVRVUVTVF9QVFkpOwotCi0JCS8qIFN0b3JlIFRFUk0gaW4gdGhlIHBhY2tldC4gIFRoZXJlIGlzIG5vIGxpbWl0IG9uIHRoZQotCQkgICBsZW5ndGggb2YgdGhlIHN0cmluZy4gKi8KLQkJY3AgPSBnZXRlbnYoIlRFUk0iKTsKLQkJaWYgKCFjcCkKLQkJCWNwID0gIiI7Ci0JCXBhY2tldF9wdXRfY3N0cmluZyhjcCk7Ci0KLQkJLyogU3RvcmUgd2luZG93IHNpemUgaW4gdGhlIHBhY2tldC4gKi8KLQkJaWYgKGlvY3RsKGZpbGVubyhzdGRpbiksIFRJT0NHV0lOU1osICZ3cykgPCAwKQotCQkJbWVtc2V0KCZ3cywgMCwgc2l6ZW9mKHdzKSk7Ci0JCXBhY2tldF9wdXRfaW50KCh1X2ludCl3cy53c19yb3cpOwotCQlwYWNrZXRfcHV0X2ludCgodV9pbnQpd3Mud3NfY29sKTsKLQkJcGFja2V0X3B1dF9pbnQoKHVfaW50KXdzLndzX3hwaXhlbCk7Ci0JCXBhY2tldF9wdXRfaW50KCh1X2ludCl3cy53c195cGl4ZWwpOwotCi0JCS8qIFN0b3JlIHR0eSBtb2RlcyBpbiB0aGUgcGFja2V0LiAqLwotCQl0dHlfbWFrZV9tb2RlcyhmaWxlbm8oc3RkaW4pLCBOVUxMKTsKLQotCQkvKiBTZW5kIHRoZSBwYWNrZXQsIGFuZCB3YWl0IGZvciBpdCB0byBsZWF2ZS4gKi8KLQkJcGFja2V0X3NlbmQoKTsKLQkJcGFja2V0X3dyaXRlX3dhaXQoKTsKLQotCQkvKiBSZWFkIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4gKi8KLQkJdHlwZSA9IHBhY2tldF9yZWFkKCk7Ci0JCWlmICh0eXBlID09IFNTSF9TTVNHX1NVQ0NFU1MpIHsKLQkJCWludGVyYWN0aXZlID0gMTsKLQkJCWhhdmVfdHR5ID0gMTsKLQkJfSBlbHNlIGlmICh0eXBlID09IFNTSF9TTVNHX0ZBSUxVUkUpCi0JCQlsb2dpdCgiV2FybmluZzogUmVtb3RlIGhvc3QgZmFpbGVkIG9yIHJlZnVzZWQgdG8gIgotCQkJICAgICJhbGxvY2F0ZSBhIHBzZXVkbyB0dHkuIik7Ci0JCWVsc2UKLQkJCXBhY2tldF9kaXNjb25uZWN0KCJQcm90b2NvbCBlcnJvciB3YWl0aW5nIGZvciBwdHkgIgotCQkJICAgICJyZXF1ZXN0IHJlc3BvbnNlLiIpOwotCX0KLQkvKiBSZXF1ZXN0IFgxMSBmb3J3YXJkaW5nIGlmIGVuYWJsZWQgYW5kIERJU1BMQVkgaXMgc2V0LiAqLwotCWRpc3BsYXkgPSBnZXRlbnYoIkRJU1BMQVkiKTsKLQlpZiAob3B0aW9ucy5mb3J3YXJkX3gxMSAmJiBkaXNwbGF5ICE9IE5VTEwpIHsKLQkJY2hhciAqcHJvdG8sICpkYXRhOwotCQkvKiBHZXQgcmVhc29uYWJsZSBsb2NhbCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4gKi8KLQkJY2xpZW50X3gxMV9nZXRfcHJvdG8oZGlzcGxheSwgb3B0aW9ucy54YXV0aF9sb2NhdGlvbiwKLQkJICAgIG9wdGlvbnMuZm9yd2FyZF94MTFfdHJ1c3RlZCwgCi0JCSAgICBvcHRpb25zLmZvcndhcmRfeDExX3RpbWVvdXQsCi0JCSAgICAmcHJvdG8sICZkYXRhKTsKLQkJLyogUmVxdWVzdCBmb3J3YXJkaW5nIHdpdGggYXV0aGVudGljYXRpb24gc3Bvb2ZpbmcuICovCi0JCWRlYnVnKCJSZXF1ZXN0aW5nIFgxMSBmb3J3YXJkaW5nIHdpdGggYXV0aGVudGljYXRpb24gIgotCQkgICAgInNwb29maW5nLiIpOwotCQl4MTFfcmVxdWVzdF9mb3J3YXJkaW5nX3dpdGhfc3Bvb2ZpbmcoMCwgZGlzcGxheSwgcHJvdG8sCi0JCSAgICBkYXRhLCAwKTsKLQkJLyogUmVhZCByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuICovCi0JCXR5cGUgPSBwYWNrZXRfcmVhZCgpOwotCQlpZiAodHlwZSA9PSBTU0hfU01TR19TVUNDRVNTKSB7Ci0JCQlpbnRlcmFjdGl2ZSA9IDE7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBTU0hfU01TR19GQUlMVVJFKSB7Ci0JCQlsb2dpdCgiV2FybmluZzogUmVtb3RlIGhvc3QgZGVuaWVkIFgxMSBmb3J3YXJkaW5nLiIpOwotCQl9IGVsc2UgewotCQkJcGFja2V0X2Rpc2Nvbm5lY3QoIlByb3RvY29sIGVycm9yIHdhaXRpbmcgZm9yIFgxMSAiCi0JCQkgICAgImZvcndhcmRpbmciKTsKLQkJfQotCX0KLQkvKiBUZWxsIHRoZSBwYWNrZXQgbW9kdWxlIHdoZXRoZXIgdGhpcyBpcyBhbiBpbnRlcmFjdGl2ZSBzZXNzaW9uLiAqLwotCXBhY2tldF9zZXRfaW50ZXJhY3RpdmUoaW50ZXJhY3RpdmUsCi0JICAgIG9wdGlvbnMuaXBfcW9zX2ludGVyYWN0aXZlLCBvcHRpb25zLmlwX3Fvc19idWxrKTsKLQotCS8qIFJlcXVlc3QgYXV0aGVudGljYXRpb24gYWdlbnQgZm9yd2FyZGluZyBpZiBhcHByb3ByaWF0ZS4gKi8KLQljaGVja19hZ2VudF9wcmVzZW50KCk7Ci0KLQlpZiAob3B0aW9ucy5mb3J3YXJkX2FnZW50KSB7Ci0JCWRlYnVnKCJSZXF1ZXN0aW5nIGF1dGhlbnRpY2F0aW9uIGFnZW50IGZvcndhcmRpbmcuIik7Ci0JCWF1dGhfcmVxdWVzdF9mb3J3YXJkaW5nKCk7Ci0KLQkJLyogUmVhZCByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuICovCi0JCXR5cGUgPSBwYWNrZXRfcmVhZCgpOwotCQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0JCWlmICh0eXBlICE9IFNTSF9TTVNHX1NVQ0NFU1MpCi0JCQlsb2dpdCgiV2FybmluZzogUmVtb3RlIGhvc3QgZGVuaWVkIGF1dGhlbnRpY2F0aW9uIGFnZW50IGZvcndhcmRpbmcuIik7Ci0JfQotCi0JLyogSW5pdGlhdGUgcG9ydCBmb3J3YXJkaW5ncy4gKi8KLQlzc2hfaW5pdF9mb3J3YXJkaW5nKCk7Ci0KLQkvKiBFeGVjdXRlIGEgbG9jYWwgY29tbWFuZCAqLwotCWlmIChvcHRpb25zLmxvY2FsX2NvbW1hbmQgIT0gTlVMTCAmJgotCSAgICBvcHRpb25zLnBlcm1pdF9sb2NhbF9jb21tYW5kKQotCQlzc2hfbG9jYWxfY21kKG9wdGlvbnMubG9jYWxfY29tbWFuZCk7Ci0KLQkvKgotCSAqIElmIHJlcXVlc3RlZCBhbmQgd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHJlcGxpZXMgdG8gcmVtb3RlCi0JICogZm9yd2FyZGluZyByZXF1ZXN0cywgdGhlbiBsZXQgc3NoIGNvbnRpbnVlIGluIHRoZSBiYWNrZ3JvdW5kLgotCSAqLwotCWlmIChmb3JrX2FmdGVyX2F1dGhlbnRpY2F0aW9uX2ZsYWcpIHsKLQkJaWYgKG9wdGlvbnMuZXhpdF9vbl9mb3J3YXJkX2ZhaWx1cmUgJiYKLQkJICAgIG9wdGlvbnMubnVtX3JlbW90ZV9mb3J3YXJkcyA+IDApIHsKLQkJCWRlYnVnKCJkZWZlcnJpbmcgcG9zdGF1dGggZm9yayB1bnRpbCByZW1vdGUgZm9yd2FyZCAiCi0JCQkgICAgImNvbmZpcm1hdGlvbiByZWNlaXZlZCIpOwotCQl9IGVsc2UKLQkJCWZvcmtfcG9zdGF1dGgoKTsKLQl9Ci0KLQkvKgotCSAqIElmIGEgY29tbWFuZCB3YXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGV4ZWN1dGUgdGhlCi0JICogY29tbWFuZCBub3cuIE90aGVyd2lzZSByZXF1ZXN0IHRoZSBzZXJ2ZXIgdG8gc3RhcnQgYSBzaGVsbC4KLQkgKi8KLQlpZiAoYnVmZmVyX2xlbigmY29tbWFuZCkgPiAwKSB7Ci0JCWludCBsZW4gPSBidWZmZXJfbGVuKCZjb21tYW5kKTsKLQkJaWYgKGxlbiA+IDkwMCkKLQkJCWxlbiA9IDkwMDsKLQkJZGVidWcoIlNlbmRpbmcgY29tbWFuZDogJS4qcyIsIGxlbiwKLQkJICAgICh1X2NoYXIgKilidWZmZXJfcHRyKCZjb21tYW5kKSk7Ci0JCXBhY2tldF9zdGFydChTU0hfQ01TR19FWEVDX0NNRCk7Ci0JCXBhY2tldF9wdXRfc3RyaW5nKGJ1ZmZlcl9wdHIoJmNvbW1hbmQpLCBidWZmZXJfbGVuKCZjb21tYW5kKSk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JCXBhY2tldF93cml0ZV93YWl0KCk7Ci0JfSBlbHNlIHsKLQkJZGVidWcoIlJlcXVlc3Rpbmcgc2hlbGwuIik7Ci0JCXBhY2tldF9zdGFydChTU0hfQ01TR19FWEVDX1NIRUxMKTsKLQkJcGFja2V0X3NlbmQoKTsKLQkJcGFja2V0X3dyaXRlX3dhaXQoKTsKLQl9Ci0KLQkvKiBFbnRlciB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbi4gKi8KLQlyZXR1cm4gY2xpZW50X2xvb3AoaGF2ZV90dHksIHR0eV9mbGFnID8KLQkgICAgb3B0aW9ucy5lc2NhcGVfY2hhciA6IFNTSF9FU0NBUEVDSEFSX05PTkUsIDApOwotfQotCi0vKiByZXF1ZXN0IHB0eS94MTEvYWdlbnQvdGNwZndkL3NoZWxsIGZvciBjaGFubmVsICovCi1zdGF0aWMgdm9pZAotc3NoX3Nlc3Npb24yX3NldHVwKGludCBpZCwgaW50IHN1Y2Nlc3MsIHZvaWQgKmFyZykKLXsKLQlleHRlcm4gY2hhciAqKmVudmlyb247Ci0JY29uc3QgY2hhciAqZGlzcGxheTsKLQlpbnQgaW50ZXJhY3RpdmUgPSB0dHlfZmxhZzsKLQotCWlmICghc3VjY2VzcykKLQkJcmV0dXJuOyAvKiBObyBuZWVkIGZvciBlcnJvciBtZXNzYWdlLCBjaGFubmVscyBjb2RlIHNlbnMgb25lICovCi0KLQlkaXNwbGF5ID0gZ2V0ZW52KCJESVNQTEFZIik7Ci0JaWYgKG9wdGlvbnMuZm9yd2FyZF94MTEgJiYgZGlzcGxheSAhPSBOVUxMKSB7Ci0JCWNoYXIgKnByb3RvLCAqZGF0YTsKLQkJLyogR2V0IHJlYXNvbmFibGUgbG9jYWwgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uICovCi0JCWNsaWVudF94MTFfZ2V0X3Byb3RvKGRpc3BsYXksIG9wdGlvbnMueGF1dGhfbG9jYXRpb24sCi0JCSAgICBvcHRpb25zLmZvcndhcmRfeDExX3RydXN0ZWQsCi0JCSAgICBvcHRpb25zLmZvcndhcmRfeDExX3RpbWVvdXQsICZwcm90bywgJmRhdGEpOwotCQkvKiBSZXF1ZXN0IGZvcndhcmRpbmcgd2l0aCBhdXRoZW50aWNhdGlvbiBzcG9vZmluZy4gKi8KLQkJZGVidWcoIlJlcXVlc3RpbmcgWDExIGZvcndhcmRpbmcgd2l0aCBhdXRoZW50aWNhdGlvbiAiCi0JCSAgICAic3Bvb2ZpbmcuIik7Ci0JCXgxMV9yZXF1ZXN0X2ZvcndhcmRpbmdfd2l0aF9zcG9vZmluZyhpZCwgZGlzcGxheSwgcHJvdG8sCi0JCSAgICBkYXRhLCAxKTsKLQkJY2xpZW50X2V4cGVjdF9jb25maXJtKGlkLCAiWDExIGZvcndhcmRpbmciLCBDT05GSVJNX1dBUk4pOwotCQkvKiBYWFggZXhpdF9vbl9mb3J3YXJkX2ZhaWx1cmUgKi8KLQkJaW50ZXJhY3RpdmUgPSAxOwotCX0KLQotCWNoZWNrX2FnZW50X3ByZXNlbnQoKTsKLQlpZiAob3B0aW9ucy5mb3J3YXJkX2FnZW50KSB7Ci0JCWRlYnVnKCJSZXF1ZXN0aW5nIGF1dGhlbnRpY2F0aW9uIGFnZW50IGZvcndhcmRpbmcuIik7Ci0JCWNoYW5uZWxfcmVxdWVzdF9zdGFydChpZCwgImF1dGgtYWdlbnQtcmVxQG9wZW5zc2guY29tIiwgMCk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JfQotCi0JY2xpZW50X3Nlc3Npb24yX3NldHVwKGlkLCB0dHlfZmxhZywgc3Vic3lzdGVtX2ZsYWcsIGdldGVudigiVEVSTSIpLAotCSAgICBOVUxMLCBmaWxlbm8oc3RkaW4pLCAmY29tbWFuZCwgZW52aXJvbik7Ci19Ci0KLS8qIG9wZW4gbmV3IGNoYW5uZWwgZm9yIGEgc2Vzc2lvbiAqLwotc3RhdGljIGludAotc3NoX3Nlc3Npb24yX29wZW4odm9pZCkKLXsKLQlDaGFubmVsICpjOwotCWludCB3aW5kb3csIHBhY2tldG1heCwgaW4sIG91dCwgZXJyOwotCi0JaWYgKHN0ZGluX251bGxfZmxhZykgewotCQlpbiA9IG9wZW4oX1BBVEhfREVWTlVMTCwgT19SRE9OTFkpOwotCX0gZWxzZSB7Ci0JCWluID0gZHVwKFNURElOX0ZJTEVOTyk7Ci0JfQotCW91dCA9IGR1cChTVERPVVRfRklMRU5PKTsKLQllcnIgPSBkdXAoU1RERVJSX0ZJTEVOTyk7Ci0KLQlpZiAoaW4gPCAwIHx8IG91dCA8IDAgfHwgZXJyIDwgMCkKLQkJZmF0YWwoImR1cCgpIGluL291dC9lcnIgZmFpbGVkIik7Ci0KLQkvKiBlbmFibGUgbm9uYmxvY2tpbmcgdW5sZXNzIHR0eSAqLwotCWlmICghaXNhdHR5KGluKSkKLQkJc2V0X25vbmJsb2NrKGluKTsKLQlpZiAoIWlzYXR0eShvdXQpKQotCQlzZXRfbm9uYmxvY2sob3V0KTsKLQlpZiAoIWlzYXR0eShlcnIpKQotCQlzZXRfbm9uYmxvY2soZXJyKTsKLQotCXdpbmRvdyA9IENIQU5fU0VTX1dJTkRPV19ERUZBVUxUOwotCXBhY2tldG1heCA9IENIQU5fU0VTX1BBQ0tFVF9ERUZBVUxUOwotCWlmICh0dHlfZmxhZykgewotCQl3aW5kb3cgPj49IDE7Ci0JCXBhY2tldG1heCA+Pj0gMTsKLQl9Ci0JYyA9IGNoYW5uZWxfbmV3KAotCSAgICAic2Vzc2lvbiIsIFNTSF9DSEFOTkVMX09QRU5JTkcsIGluLCBvdXQsIGVyciwKLQkgICAgd2luZG93LCBwYWNrZXRtYXgsIENIQU5fRVhURU5ERURfV1JJVEUsCi0JICAgICJjbGllbnQtc2Vzc2lvbiIsIC8qbm9uYmxvY2sqLzApOwotCi0JZGVidWczKCJzc2hfc2Vzc2lvbjJfb3BlbjogY2hhbm5lbF9uZXc6ICVkIiwgYy0+c2VsZik7Ci0KLQljaGFubmVsX3NlbmRfb3BlbihjLT5zZWxmKTsKLQlpZiAoIW5vX3NoZWxsX2ZsYWcpCi0JCWNoYW5uZWxfcmVnaXN0ZXJfb3Blbl9jb25maXJtKGMtPnNlbGYsCi0JCSAgICBzc2hfc2Vzc2lvbjJfc2V0dXAsIE5VTEwpOwotCi0JcmV0dXJuIGMtPnNlbGY7Ci19Ci0KLXN0YXRpYyBpbnQKLXNzaF9zZXNzaW9uMih2b2lkKQotewotCWludCBpZCA9IC0xOwotCi0JLyogWFhYIHNob3VsZCBiZSBwcmUtc2Vzc2lvbiAqLwotCXNzaF9pbml0X2ZvcndhcmRpbmcoKTsKLQotCS8qIFN0YXJ0IGxpc3RlbmluZyBmb3IgbXVsdGlwbGV4IGNsaWVudHMgKi8KLQltdXhzZXJ2ZXJfbGlzdGVuKCk7Ci0KLSAJLyoKLQkgKiBJZiB3ZSBhcmUgaW4gY29udHJvbCBwZXJzaXN0IG1vZGUsIHRoZW4gcHJlcGFyZSB0byBiYWNrZ3JvdW5kCi0JICogb3Vyc2VsdmVzIGFuZCBoYXZlIGEgZm9yZWdyb3VuZCBjbGllbnQgYXR0YWNoIGFzIGEgY29udHJvbAotCSAqIHNsYXZlLiBOQi4gd2UgbXVzdCBzYXZlIGNvcGllcyBvZiB0aGUgZmxhZ3MgdGhhdCB3ZSBvdmVycmlkZSBmb3IKLQkgKiB0aGUgYmFja2dyb3VuZGluZywgc2luY2Ugd2UgZGVmZXIgYXR0YWNobWVudCBvZiB0aGUgc2xhdmUgdW50aWwKLQkgKiBhZnRlciB0aGUgY29ubmVjdGlvbiBpcyBmdWxseSBlc3RhYmxpc2hlZCAoaW4gcGFydGljdWxhciwKLQkgKiBhc3luYyByZndkIHJlcGxpZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIGZvciBFeGl0T25Gb3J3YXJkRmFpbHVyZSkuCi0JICovCi0gCWlmIChvcHRpb25zLmNvbnRyb2xfcGVyc2lzdCAmJiBtdXhzZXJ2ZXJfc29jayAhPSAtMSkgewotCQlvc3RkaW5fbnVsbF9mbGFnID0gc3RkaW5fbnVsbF9mbGFnOwotCQlvbm9fc2hlbGxfZmxhZyA9IG5vX3NoZWxsX2ZsYWc7Ci0JCW9yZXF1ZXN0X3R0eSA9IG9wdGlvbnMucmVxdWVzdF90dHk7Ci0JCW90dHlfZmxhZyA9IHR0eV9mbGFnOwotIAkJc3RkaW5fbnVsbF9mbGFnID0gMTsKLSAJCW5vX3NoZWxsX2ZsYWcgPSAxOwotIAkJdHR5X2ZsYWcgPSAwOwotCQlpZiAoIWZvcmtfYWZ0ZXJfYXV0aGVudGljYXRpb25fZmxhZykKLQkJCW5lZWRfY29udHJvbHBlcnNpc3RfZGV0YWNoID0gMTsKLQkJZm9ya19hZnRlcl9hdXRoZW50aWNhdGlvbl9mbGFnID0gMTsKLSAJfQotCi0JaWYgKCFub19zaGVsbF9mbGFnIHx8IChkYXRhZmVsbG93cyAmIFNTSF9CVUdfRFVNTVlDSEFOKSkKLQkJaWQgPSBzc2hfc2Vzc2lvbjJfb3BlbigpOwotCi0JLyogSWYgd2UgZG9uJ3QgZXhwZWN0IHRvIG9wZW4gYSBuZXcgc2Vzc2lvbiwgdGhlbiBkaXNhbGxvdyBpdCAqLwotCWlmIChvcHRpb25zLmNvbnRyb2xfbWFzdGVyID09IFNTSENUTF9NQVNURVJfTk8gJiYKLQkgICAgKGRhdGFmZWxsb3dzICYgU1NIX05FV19PUEVOU1NIKSkgewotCQlkZWJ1ZygiUmVxdWVzdGluZyBuby1tb3JlLXNlc3Npb25zQG9wZW5zc2guY29tIik7Ci0JCXBhY2tldF9zdGFydChTU0gyX01TR19HTE9CQUxfUkVRVUVTVCk7Ci0JCXBhY2tldF9wdXRfY3N0cmluZygibm8tbW9yZS1zZXNzaW9uc0BvcGVuc3NoLmNvbSIpOwotCQlwYWNrZXRfcHV0X2NoYXIoMCk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JfQotCi0JLyogRXhlY3V0ZSBhIGxvY2FsIGNvbW1hbmQgKi8KLQlpZiAob3B0aW9ucy5sb2NhbF9jb21tYW5kICE9IE5VTEwgJiYKLQkgICAgb3B0aW9ucy5wZXJtaXRfbG9jYWxfY29tbWFuZCkKLQkJc3NoX2xvY2FsX2NtZChvcHRpb25zLmxvY2FsX2NvbW1hbmQpOwotCi0JLyoKLQkgKiBJZiByZXF1ZXN0ZWQgYW5kIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiByZXBsaWVzIHRvIHJlbW90ZQotCSAqIGZvcndhcmRpbmcgcmVxdWVzdHMsIHRoZW4gbGV0IHNzaCBjb250aW51ZSBpbiB0aGUgYmFja2dyb3VuZC4KLQkgKi8KLQlpZiAoZm9ya19hZnRlcl9hdXRoZW50aWNhdGlvbl9mbGFnKSB7Ci0JCWlmIChvcHRpb25zLmV4aXRfb25fZm9yd2FyZF9mYWlsdXJlICYmCi0JCSAgICBvcHRpb25zLm51bV9yZW1vdGVfZm9yd2FyZHMgPiAwKSB7Ci0JCQlkZWJ1ZygiZGVmZXJyaW5nIHBvc3RhdXRoIGZvcmsgdW50aWwgcmVtb3RlIGZvcndhcmQgIgotCQkJICAgICJjb25maXJtYXRpb24gcmVjZWl2ZWQiKTsKLQkJfSBlbHNlCi0JCQlmb3JrX3Bvc3RhdXRoKCk7Ci0JfQotCi0JaWYgKG9wdGlvbnMudXNlX3JvYW1pbmcpCi0JCXJlcXVlc3Rfcm9hbWluZygpOwotCi0JcmV0dXJuIGNsaWVudF9sb29wKHR0eV9mbGFnLCB0dHlfZmxhZyA/Ci0JICAgIG9wdGlvbnMuZXNjYXBlX2NoYXIgOiBTU0hfRVNDQVBFQ0hBUl9OT05FLCBpZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sb2FkX3B1YmxpY19pZGVudGl0eV9maWxlcyh2b2lkKQotewotCWNoYXIgKmZpbGVuYW1lLCAqY3AsIHRoaXNob3N0W05JX01BWEhPU1RdOwotCWNoYXIgKnB3ZGlyID0gTlVMTCwgKnB3bmFtZSA9IE5VTEw7Ci0JaW50IGkgPSAwOwotCUtleSAqcHVibGljOwotCXN0cnVjdCBwYXNzd2QgKnB3OwotCXVfaW50IG5faWRzOwotCWNoYXIgKmlkZW50aXR5X2ZpbGVzW1NTSF9NQVhfSURFTlRJVFlfRklMRVNdOwotCUtleSAqaWRlbnRpdHlfa2V5c1tTU0hfTUFYX0lERU5USVRZX0ZJTEVTXTsKLSNpZmRlZiBFTkFCTEVfUEtDUzExCi0JS2V5ICoqa2V5czsKLQlpbnQgbmtleXM7Ci0jZW5kaWYgLyogUEtDUzExICovCi0KLQluX2lkcyA9IDA7Ci0JYnplcm8oaWRlbnRpdHlfZmlsZXMsIHNpemVvZihpZGVudGl0eV9maWxlcykpOwotCWJ6ZXJvKGlkZW50aXR5X2tleXMsIHNpemVvZihpZGVudGl0eV9rZXlzKSk7Ci0KLSNpZmRlZiBFTkFCTEVfUEtDUzExCi0JaWYgKG9wdGlvbnMucGtjczExX3Byb3ZpZGVyICE9IE5VTEwgJiYKLQkgICAgb3B0aW9ucy5udW1faWRlbnRpdHlfZmlsZXMgPCBTU0hfTUFYX0lERU5USVRZX0ZJTEVTICYmCi0JICAgIChwa2NzMTFfaW5pdCghb3B0aW9ucy5iYXRjaF9tb2RlKSA9PSAwKSAmJgotCSAgICAobmtleXMgPSBwa2NzMTFfYWRkX3Byb3ZpZGVyKG9wdGlvbnMucGtjczExX3Byb3ZpZGVyLCBOVUxMLAotCSAgICAma2V5cykpID4gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbmtleXM7IGkrKykgewotCQkJaWYgKG5faWRzID49IFNTSF9NQVhfSURFTlRJVFlfRklMRVMpIHsKLQkJCQlrZXlfZnJlZShrZXlzW2ldKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlkZW50aXR5X2tleXNbbl9pZHNdID0ga2V5c1tpXTsKLQkJCWlkZW50aXR5X2ZpbGVzW25faWRzXSA9Ci0JCQkgICAgeHN0cmR1cChvcHRpb25zLnBrY3MxMV9wcm92aWRlcik7IC8qIFhYWCAqLwotCQkJbl9pZHMrKzsKLQkJfQotCQl4ZnJlZShrZXlzKTsKLQl9Ci0jZW5kaWYgLyogRU5BQkxFX1BLQ1MxMSAqLwotCWlmICgocHcgPSBnZXRwd3VpZChvcmlnaW5hbF9yZWFsX3VpZCkpID09IE5VTEwpCi0JCWZhdGFsKCJsb2FkX3B1YmxpY19pZGVudGl0eV9maWxlczogZ2V0cHd1aWQgZmFpbGVkIik7Ci0JcHduYW1lID0geHN0cmR1cChwdy0+cHdfbmFtZSk7Ci0JcHdkaXIgPSB4c3RyZHVwKHB3LT5wd19kaXIpOwotCWlmIChnZXRob3N0bmFtZSh0aGlzaG9zdCwgc2l6ZW9mKHRoaXNob3N0KSkgPT0gLTEpCi0JCWZhdGFsKCJsb2FkX3B1YmxpY19pZGVudGl0eV9maWxlczogZ2V0aG9zdG5hbWU6ICVzIiwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2lkZW50aXR5X2ZpbGVzOyBpKyspIHsKLQkJaWYgKG5faWRzID49IFNTSF9NQVhfSURFTlRJVFlfRklMRVMpIHsKLQkJCXhmcmVlKG9wdGlvbnMuaWRlbnRpdHlfZmlsZXNbaV0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJY3AgPSB0aWxkZV9leHBhbmRfZmlsZW5hbWUob3B0aW9ucy5pZGVudGl0eV9maWxlc1tpXSwKLQkJICAgIG9yaWdpbmFsX3JlYWxfdWlkKTsKLQkJZmlsZW5hbWUgPSBwZXJjZW50X2V4cGFuZChjcCwgImQiLCBwd2RpciwKLQkJICAgICJ1IiwgcHduYW1lLCAibCIsIHRoaXNob3N0LCAiaCIsIGhvc3QsCi0JCSAgICAiciIsIG9wdGlvbnMudXNlciwgKGNoYXIgKilOVUxMKTsKLQkJeGZyZWUoY3ApOwotCQlwdWJsaWMgPSBrZXlfbG9hZF9wdWJsaWMoZmlsZW5hbWUsIE5VTEwpOwotCQlkZWJ1ZygiaWRlbnRpdHkgZmlsZSAlcyB0eXBlICVkIiwgZmlsZW5hbWUsCi0JCSAgICBwdWJsaWMgPyBwdWJsaWMtPnR5cGUgOiAtMSk7Ci0JCXhmcmVlKG9wdGlvbnMuaWRlbnRpdHlfZmlsZXNbaV0pOwotCQlpZGVudGl0eV9maWxlc1tuX2lkc10gPSBmaWxlbmFtZTsKLQkJaWRlbnRpdHlfa2V5c1tuX2lkc10gPSBwdWJsaWM7Ci0KLQkJaWYgKCsrbl9pZHMgPj0gU1NIX01BWF9JREVOVElUWV9GSUxFUykKLQkJCWNvbnRpbnVlOwotCi0JCS8qIFRyeSB0byBhZGQgdGhlIGNlcnRpZmljYXRlIHZhcmlhbnQgdG9vICovCi0JCXhhc3ByaW50ZigmY3AsICIlcy1jZXJ0IiwgZmlsZW5hbWUpOwotCQlwdWJsaWMgPSBrZXlfbG9hZF9wdWJsaWMoY3AsIE5VTEwpOwotCQlkZWJ1ZygiaWRlbnRpdHkgZmlsZSAlcyB0eXBlICVkIiwgY3AsCi0JCSAgICBwdWJsaWMgPyBwdWJsaWMtPnR5cGUgOiAtMSk7Ci0JCWlmIChwdWJsaWMgPT0gTlVMTCkgewotCQkJeGZyZWUoY3ApOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFrZXlfaXNfY2VydChwdWJsaWMpKSB7Ci0JCQlkZWJ1ZygiJXM6IGtleSAlcyB0eXBlICVzIGlzIG5vdCBhIGNlcnRpZmljYXRlIiwKLQkJCSAgICBfX2Z1bmNfXywgY3AsIGtleV90eXBlKHB1YmxpYykpOwotCQkJa2V5X2ZyZWUocHVibGljKTsKLQkJCXhmcmVlKGNwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlkZW50aXR5X2tleXNbbl9pZHNdID0gcHVibGljOwotCQkvKiBwb2ludCB0byB0aGUgb3JpZ2luYWwgcGF0aCwgbW9zdCBsaWtlbHkgdGhlIHByaXZhdGUga2V5ICovCi0JCWlkZW50aXR5X2ZpbGVzW25faWRzXSA9IHhzdHJkdXAoZmlsZW5hbWUpOwotCQluX2lkcysrOwotCX0KLQlvcHRpb25zLm51bV9pZGVudGl0eV9maWxlcyA9IG5faWRzOwotCW1lbWNweShvcHRpb25zLmlkZW50aXR5X2ZpbGVzLCBpZGVudGl0eV9maWxlcywgc2l6ZW9mKGlkZW50aXR5X2ZpbGVzKSk7Ci0JbWVtY3B5KG9wdGlvbnMuaWRlbnRpdHlfa2V5cywgaWRlbnRpdHlfa2V5cywgc2l6ZW9mKGlkZW50aXR5X2tleXMpKTsKLQotCWJ6ZXJvKHB3bmFtZSwgc3RybGVuKHB3bmFtZSkpOwotCXhmcmVlKHB3bmFtZSk7Ci0JYnplcm8ocHdkaXIsIHN0cmxlbihwd2RpcikpOwotCXhmcmVlKHB3ZGlyKTsKLX0KLQotc3RhdGljIHZvaWQKLW1haW5fc2lnY2hsZF9oYW5kbGVyKGludCBzaWcpCi17Ci0JaW50IHNhdmVfZXJybm8gPSBlcnJubzsKLQlwaWRfdCBwaWQ7Ci0JaW50IHN0YXR1czsKLQotCXdoaWxlICgocGlkID0gd2FpdHBpZCgtMSwgJnN0YXR1cywgV05PSEFORykpID4gMCB8fAotCSAgICAocGlkIDwgMCAmJiBlcnJubyA9PSBFSU5UUikpCi0JCTsKLQotCXNpZ25hbChzaWcsIG1haW5fc2lnY2hsZF9oYW5kbGVyKTsKLQllcnJubyA9IHNhdmVfZXJybm87Ci19Ci0KZGlmZiAtLWdpdCBhL3NzaC5oIGIvc3NoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDYzM2IuLjAwMDAwMDAKLS0tIGEvc3NoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKiAkT3BlbkJTRDogc3NoLmgsdiAxLjc5IDIwMTAvMDYvMjUgMDc6MTQ6NDYgZGptIEV4cCAkICovCi0KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotCi0vKiBDaXBoZXIgdXNlZCBmb3IgZW5jcnlwdGluZyBhdXRoZW50aWNhdGlvbiBmaWxlcy4gKi8KLSNkZWZpbmUgU1NIX0FVVEhGSUxFX0NJUEhFUglTU0hfQ0lQSEVSXzNERVMKLQotLyogRGVmYXVsdCBwb3J0IG51bWJlci4gKi8KLSNkZWZpbmUgU1NIX0RFRkFVTFRfUE9SVAkyMgotCi0vKgotICogTWF4aW11bSBudW1iZXIgb2YgUlNBIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IGZpbGVzIHRoYXQgY2FuIGJlIHNwZWNpZmllZAotICogaW4gY29uZmlndXJhdGlvbiBmaWxlcyBvciBvbiB0aGUgY29tbWFuZCBsaW5lLgotICovCi0jZGVmaW5lIFNTSF9NQVhfSURFTlRJVFlfRklMRVMJCTEwMAotCi0vKgotICogTWF4aW11bSBsZW5ndGggb2YgbGluZXMgaW4gYXV0aG9yaXplZF9rZXlzIGZpbGUuCi0gKiBDdXJyZW50IHZhbHVlIHBlcm1pdHMgMTZrYml0IFJTQSBhbmQgUlNBMSBrZXlzIGFuZCA4a2JpdCBEU0Ega2V5cywgd2l0aAotICogc29tZSByb29tIGZvciBvcHRpb25zIGFuZCBjb21tZW50cy4KLSAqLwotI2RlZmluZSBTU0hfTUFYX1BVQktFWV9CWVRFUwkJODE5MgotCi0vKgotICogTWFqb3IgcHJvdG9jb2wgdmVyc2lvbi4gIERpZmZlcmVudCB2ZXJzaW9uIGluZGljYXRlcyBtYWpvciBpbmNvbXBhdGliaWxpdHkKLSAqIHRoYXQgcHJldmVudHMgY29tbXVuaWNhdGlvbi4KLSAqCi0gKiBNaW5vciBwcm90b2NvbCB2ZXJzaW9uLiAgRGlmZmVyZW50IHZlcnNpb24gaW5kaWNhdGVzIG1pbm9yIGluY29tcGF0aWJpbGl0eQotICogdGhhdCBkb2VzIG5vdCBwcmV2ZW50IGludGVyb3BlcmF0aW9uLgotICovCi0jZGVmaW5lIFBST1RPQ09MX01BSk9SXzEJMQotI2RlZmluZSBQUk9UT0NPTF9NSU5PUl8xCTUKLQotLyogV2Ugc3VwcG9ydCBib3RoIFNTSDEgYW5kIFNTSDIgKi8KLSNkZWZpbmUgUFJPVE9DT0xfTUFKT1JfMgkyCi0jZGVmaW5lIFBST1RPQ09MX01JTk9SXzIJMAotCi0vKgotICogTmFtZSBmb3IgdGhlIHNlcnZpY2UuICBUaGUgcG9ydCBuYW1lZCBieSB0aGlzIHNlcnZpY2Ugb3ZlcnJpZGVzIHRoZQotICogZGVmYXVsdCBwb3J0IGlmIHByZXNlbnQuCi0gKi8KLSNkZWZpbmUgU1NIX1NFUlZJQ0VfTkFNRQkic3NoIgotCi0vKgotICogTmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgY29udGFpbmluZyB0aGUgcHJvY2VzcyBJRCBvZiB0aGUKLSAqIGF1dGhlbnRpY2F0aW9uIGFnZW50LgotICovCi0jZGVmaW5lIFNTSF9BR0VOVFBJRF9FTlZfTkFNRQkiU1NIX0FHRU5UX1BJRCIKLQotLyoKLSAqIE5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHBhdGhuYW1lIG9mIHRoZQotICogYXV0aGVudGljYXRpb24gc29ja2V0LgotICovCi0jZGVmaW5lIFNTSF9BVVRIU09DS0VUX0VOVl9OQU1FICJTU0hfQVVUSF9TT0NLIgotCi0vKgotICogRW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIG92ZXJ3cml0aW5nIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIGFza3Bhc3MKLSAqLwotI2RlZmluZSBTU0hfQVNLUEFTU19FTlYJCSJTU0hfQVNLUEFTUyIKLQotLyoKLSAqIEZvcmNlIGhvc3Qga2V5IGxlbmd0aCBhbmQgc2VydmVyIGtleSBsZW5ndGggdG8gZGlmZmVyIGJ5IGF0IGxlYXN0IHRoaXMKLSAqIG1hbnkgYml0cy4gIFRoaXMgaXMgdG8gbWFrZSBkb3VibGUgZW5jcnlwdGlvbiB3aXRoIHJzYXJlZiB3b3JrLgotICovCi0jZGVmaW5lIFNTSF9LRVlfQklUU19SRVNFUlZFRAkJMTI4Ci0KLS8qCi0gKiBMZW5ndGggb2YgdGhlIHNlc3Npb24ga2V5IGluIGJ5dGVzLiAgKFNwZWNpZmllZCBhcyAyNTYgYml0cyBpbiB0aGUKLSAqIHByb3RvY29sLikKLSAqLwotI2RlZmluZSBTU0hfU0VTU0lPTl9LRVlfTEVOR1RICQkzMgotCi0vKiBVc2VkIHRvIGlkZW50aWZ5IGBgRXNjYXBlQ2hhciBub25lJycgKi8KLSNkZWZpbmUgU1NIX0VTQ0FQRUNIQVJfTk9ORQkJLTIKLQotLyoKLSAqIHVucHJpdmlsZWdlZCB1c2VyIHdoZW4gVXNlUHJpdmlsZWdlU2VwYXJhdGlvbj15ZXM7Ci0gKiBzc2hkIHdpbGwgY2hhbmdlIGl0cyBwcml2aWxlZ2VzIHRvIHRoaXMgdXNlciBhbmQgaXRzCi0gKiBwcmltYXJ5IGdyb3VwLgotICovCi0jaWZuZGVmIFNTSF9QUklWU0VQX1VTRVIKLSNkZWZpbmUgU1NIX1BSSVZTRVBfVVNFUgkJInNzaGQiCi0jZW5kaWYKLQotLyogTWluaW11bSBtb2R1bHVzIHNpemUgKG4pIGZvciBSU0Ega2V5cy4gKi8KLSNkZWZpbmUgU1NIX1JTQV9NSU5JTVVNX01PRFVMVVNfU0laRQk3NjgKLQotLyogTGlzdGVuIGJhY2tsb2cgZm9yIHNzaGQsIHNzaC1hZ2VudCBhbmQgZm9yd2FyZGluZyBzb2NrZXRzICovCi0jZGVmaW5lIFNTSF9MSVNURU5fQkFDS0xPRwkJMTI4CmRpZmYgLS1naXQgYS9zc2gxLmggYi9zc2gxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1M2Q5MzAuLjAwMDAwMDAKLS0tIGEvc3NoMS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNzaDEuaCx2IDEuNiAyMDA2LzAzLzI1IDIyOjIyOjQzIGRqbSBFeHAgJCAqLwotCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLQotLyoKLSAqIERlZmluaXRpb24gb2YgbWVzc2FnZSB0eXBlcy4gIE5ldyB2YWx1ZXMgY2FuIGJlIGFkZGVkLCBidXQgb2xkIHZhbHVlcwotICogc2hvdWxkIG5vdCBiZSByZW1vdmVkIG9yIHdpdGhvdXQgY2FyZWZ1bCBjb25zaWRlcmF0aW9uIG9mIHRoZSBjb25zZXF1ZW5jZXMKLSAqIGZvciBjb21wYXRpYmlsaXR5LiAgVGhlIG1heGltdW0gdmFsdWUgaXMgMjU0OyB2YWx1ZSAyNTUgaXMgcmVzZXJ2ZWQgZm9yCi0gKiBmdXR1cmUgZXh0ZW5zaW9uLgotICovCi0vKiBSYW5nZXMgKi8KLSNkZWZpbmUgU1NIX01TR19NSU4JCQkJMQotI2RlZmluZSBTU0hfTVNHX01BWAkJCQkyNTQKLS8qIE1lc3NhZ2UgbmFtZSAqLwkJCS8qIG1zZyBjb2RlICovCS8qIGFyZ3VtZW50cyAqLwotI2RlZmluZSBTU0hfTVNHX05PTkUJCQkJMAkvKiBubyBtZXNzYWdlICovCi0jZGVmaW5lIFNTSF9NU0dfRElTQ09OTkVDVAkJCTEJLyogY2F1c2UgKHN0cmluZykgKi8KLSNkZWZpbmUgU1NIX1NNU0dfUFVCTElDX0tFWQkJCTIJLyogY2ssbXNrLHNydmssaG9zdGsgKi8KLSNkZWZpbmUgU1NIX0NNU0dfU0VTU0lPTl9LRVkJCQkzCS8qIGtleSAoQklHTlVNKSAqLwotI2RlZmluZSBTU0hfQ01TR19VU0VSCQkJCTQJLyogdXNlciAoc3RyaW5nKSAqLwotI2RlZmluZSBTU0hfQ01TR19BVVRIX1JIT1NUUwkJCTUJLyogdXNlciAoc3RyaW5nKSAqLwotI2RlZmluZSBTU0hfQ01TR19BVVRIX1JTQQkJCTYJLyogbW9kdWx1cyAoQklHTlVNKSAqLwotI2RlZmluZSBTU0hfU01TR19BVVRIX1JTQV9DSEFMTEVOR0UJCTcJLyogaW50IChCSUdOVU0pICovCi0jZGVmaW5lIFNTSF9DTVNHX0FVVEhfUlNBX1JFU1BPTlNFCQk4CS8qIGludCAoQklHTlVNKSAqLwotI2RlZmluZSBTU0hfQ01TR19BVVRIX1BBU1NXT1JECQkJOQkvKiBwYXNzIChzdHJpbmcpICovCi0jZGVmaW5lIFNTSF9DTVNHX1JFUVVFU1RfUFRZCQkJMTAJLyogVEVSTSwgdHR5IG1vZGVzICovCi0jZGVmaW5lIFNTSF9DTVNHX1dJTkRPV19TSVpFCQkJMTEJLyogcm93LGNvbCx4cGl4LHlwaXggKi8KLSNkZWZpbmUgU1NIX0NNU0dfRVhFQ19TSEVMTAkJCTEyCS8qICovCi0jZGVmaW5lIFNTSF9DTVNHX0VYRUNfQ01ECQkJMTMJLyogY21kIChzdHJpbmcpICovCi0jZGVmaW5lIFNTSF9TTVNHX1NVQ0NFU1MJCQkxNAkvKiAqLwotI2RlZmluZSBTU0hfU01TR19GQUlMVVJFCQkJMTUJLyogKi8KLSNkZWZpbmUgU1NIX0NNU0dfU1RESU5fREFUQQkJCTE2CS8qIGRhdGEgKHN0cmluZykgKi8KLSNkZWZpbmUgU1NIX1NNU0dfU1RET1VUX0RBVEEJCQkxNwkvKiBkYXRhIChzdHJpbmcpICovCi0jZGVmaW5lIFNTSF9TTVNHX1NUREVSUl9EQVRBCQkJMTgJLyogZGF0YSAoc3RyaW5nKSAqLwotI2RlZmluZSBTU0hfQ01TR19FT0YJCQkJMTkJLyogKi8KLSNkZWZpbmUgU1NIX1NNU0dfRVhJVFNUQVRVUwkJCTIwCS8qIHN0YXR1cyAoaW50KSAqLwotI2RlZmluZSBTU0hfTVNHX0NIQU5ORUxfT1BFTl9DT05GSVJNQVRJT04JMjEJLyogY2hhbm5lbCAoaW50KSAqLwotI2RlZmluZSBTU0hfTVNHX0NIQU5ORUxfT1BFTl9GQUlMVVJFCQkyMgkvKiBjaGFubmVsIChpbnQpICovCi0jZGVmaW5lIFNTSF9NU0dfQ0hBTk5FTF9EQVRBCQkJMjMJLyogY2gsZGF0YSAoaW50LHN0cikgKi8KLSNkZWZpbmUgU1NIX01TR19DSEFOTkVMX0NMT1NFCQkJMjQJLyogY2hhbm5lbCAoaW50KSAqLwotI2RlZmluZSBTU0hfTVNHX0NIQU5ORUxfQ0xPU0VfQ09ORklSTUFUSU9OCTI1CS8qIGNoYW5uZWwgKGludCkgKi8KLS8qICAgICAgU1NIX0NNU0dfWDExX1JFUVVFU1RfRk9SV0FSRElORwkJMjYJICAgT0JTT0xFVEUgKi8KLSNkZWZpbmUgU1NIX1NNU0dfWDExX09QRU4JCQkyNwkvKiBjaGFubmVsIChpbnQpICovCi0jZGVmaW5lIFNTSF9DTVNHX1BPUlRfRk9SV0FSRF9SRVFVRVNUCQkyOAkvKiBwLGhvc3QsaHAgKGkscyxpKSAqLwotI2RlZmluZSBTU0hfTVNHX1BPUlRfT1BFTgkJCTI5CS8qIGNoLGgscCAoaSxzLGkpICovCi0jZGVmaW5lIFNTSF9DTVNHX0FHRU5UX1JFUVVFU1RfRk9SV0FSRElORwkzMAkvKiAqLwotI2RlZmluZSBTU0hfU01TR19BR0VOVF9PUEVOCQkJMzEJLyogcG9ydCAoaW50KSAqLwotI2RlZmluZSBTU0hfTVNHX0lHTk9SRQkJCQkzMgkvKiBzdHJpbmcgKi8KLSNkZWZpbmUgU1NIX0NNU0dfRVhJVF9DT05GSVJNQVRJT04JCTMzCS8qICovCi0jZGVmaW5lIFNTSF9DTVNHX1gxMV9SRVFVRVNUX0ZPUldBUkRJTkcJCTM0CS8qIHByb3RvLGRhdGEgKHMscykgKi8KLSNkZWZpbmUgU1NIX0NNU0dfQVVUSF9SSE9TVFNfUlNBCQkzNQkvKiB1c2VyLG1vZCAocyxtcGkpICovCi0jZGVmaW5lIFNTSF9NU0dfREVCVUcJCQkJMzYJLyogc3RyaW5nICovCi0jZGVmaW5lIFNTSF9DTVNHX1JFUVVFU1RfQ09NUFJFU1NJT04JCTM3CS8qIGxldmVsIDEtOSAoaW50KSAqLwotI2RlZmluZSBTU0hfQ01TR19NQVhfUEFDS0VUX1NJWkUJCTM4CS8qIHNpemUgNGstMTAyNGsgKGludCkgKi8KLSNkZWZpbmUgU1NIX0NNU0dfQVVUSF9USVMJCQkzOQkvKiB3ZSB1c2UgdGhpcyBmb3Igcy9rZXkgKi8KLSNkZWZpbmUgU1NIX1NNU0dfQVVUSF9USVNfQ0hBTExFTkdFCQk0MAkvKiBjaGFsbGVuZ2UgKHN0cmluZykgKi8KLSNkZWZpbmUgU1NIX0NNU0dfQVVUSF9USVNfUkVTUE9OU0UJCTQxCS8qIHJlc3BvbnNlIChzdHJpbmcpICovCi0jZGVmaW5lIFNTSF9DTVNHX0FVVEhfS0VSQkVST1MJCQk0MgkvKiAoS1RFWFQpICovCi0jZGVmaW5lIFNTSF9TTVNHX0FVVEhfS0VSQkVST1NfUkVTUE9OU0UJCTQzCS8qIChLVEVYVCkgKi8KLSNkZWZpbmUgU1NIX0NNU0dfSEFWRV9LRVJCRVJPU19UR1QJCTQ0CS8qIGNyZWRlbnRpYWxzIChzKSAqLwotI2RlZmluZSBTU0hfQ01TR19IQVZFX0FGU19UT0tFTgkJCTY1CS8qIHRva2VuIChzKSAqLwotCi0vKiBwcm90b2NvbCB2ZXJzaW9uIDEuNSBvdmVybG9hZHMgc29tZSB2ZXJzaW9uIDEuMyBtZXNzYWdlIHR5cGVzICovCi0jZGVmaW5lIFNTSF9NU0dfQ0hBTk5FTF9JTlBVVF9FT0YJU1NIX01TR19DSEFOTkVMX0NMT1NFCi0jZGVmaW5lIFNTSF9NU0dfQ0hBTk5FTF9PVVRQVVRfQ0xPU0UJU1NIX01TR19DSEFOTkVMX0NMT1NFX0NPTkZJUk1BVElPTgotCi0vKgotICogQXV0aGVudGljYXRpb24gbWV0aG9kcy4gIE5ldyB0eXBlcyBjYW4gYmUgYWRkZWQsIGJ1dCBvbGQgdHlwZXMgc2hvdWxkIG5vdAotICogYmUgcmVtb3ZlZCBmb3IgY29tcGF0aWJpbGl0eS4gIFRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgaXMgMzEuCi0gKi8KLSNkZWZpbmUgU1NIX0FVVEhfUkhPU1RTCQkxCi0jZGVmaW5lIFNTSF9BVVRIX1JTQQkJMgotI2RlZmluZSBTU0hfQVVUSF9QQVNTV09SRAkzCi0jZGVmaW5lIFNTSF9BVVRIX1JIT1NUU19SU0EJNAotI2RlZmluZSBTU0hfQVVUSF9USVMJCTUKLSNkZWZpbmUgU1NIX0FVVEhfS0VSQkVST1MJNgotI2RlZmluZSBTU0hfUEFTU19LRVJCRVJPU19UR1QJNwotCQkJCS8qIDggdG8gMTUgYXJlIHJlc2VydmVkICovCi0jZGVmaW5lIFNTSF9QQVNTX0FGU19UT0tFTgkyMQotCi0vKiBQcm90b2NvbCBmbGFncy4gIFRoZXNlIGFyZSBiaXQgbWFza3MuICovCi0jZGVmaW5lIFNTSF9QUk9UT0ZMQUdfU0NSRUVOX05VTUJFUgkxCS8qIFgxMSBmb3J3YXJkaW5nIGluY2x1ZGVzIHNjcmVlbiAqLwotI2RlZmluZSBTU0hfUFJPVE9GTEFHX0hPU1RfSU5fRldEX09QRU4JMgkvKiBmb3J3YXJkaW5nIG9wZW5zIGNvbnRhaW4gaG9zdCAqLwpkaWZmIC0tZ2l0IGEvc3NoMi5oIGIvc3NoMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWE5NjNjLi4wMDAwMDAwCi0tLSBhL3NzaDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKiAkT3BlbkJTRDogc3NoMi5oLHYgMS4xNCAyMDEwLzA4LzMxIDExOjU0OjQ1IGRqbSBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKgotICogZHJhZnQtaWV0Zi1zZWNzaC1hcmNoaXRlY3R1cmUtMDUudHh0Ci0gKgotICogICBUcmFuc3BvcnQgbGF5ZXIgcHJvdG9jb2w6Ci0gKgotICogICAgIDEtMTkgICAgIFRyYW5zcG9ydCBsYXllciBnZW5lcmljIChlLmcuIGRpc2Nvbm5lY3QsIGlnbm9yZSwgZGVidWcsCi0gKiAgICAgICAgICAgICAgZXRjKQotICogICAgIDIwLTI5ICAgIEFsZ29yaXRobSBuZWdvdGlhdGlvbgotICogICAgIDMwLTQ5ICAgIEtleSBleGNoYW5nZSBtZXRob2Qgc3BlY2lmaWMgKG51bWJlcnMgY2FuIGJlIHJldXNlZCBmb3IKLSAqICAgICAgICAgICAgICBkaWZmZXJlbnQgYXV0aGVudGljYXRpb24gbWV0aG9kcykKLSAqCi0gKiAgIFVzZXIgYXV0aGVudGljYXRpb24gcHJvdG9jb2w6Ci0gKgotICogICAgIDUwLTU5ICAgIFVzZXIgYXV0aGVudGljYXRpb24gZ2VuZXJpYwotICogICAgIDYwLTc5ICAgIFVzZXIgYXV0aGVudGljYXRpb24gbWV0aG9kIHNwZWNpZmljIChudW1iZXJzIGNhbiBiZSByZXVzZWQKLSAqICAgICAgICAgICAgICBmb3IgZGlmZmVyZW50IGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMpCi0gKgotICogICBDb25uZWN0aW9uIHByb3RvY29sOgotICoKLSAqICAgICA4MC04OSAgICBDb25uZWN0aW9uIHByb3RvY29sIGdlbmVyaWMKLSAqICAgICA5MC0xMjcgICBDaGFubmVsIHJlbGF0ZWQgbWVzc2FnZXMKLSAqCi0gKiAgIFJlc2VydmVkIGZvciBjbGllbnQgcHJvdG9jb2xzOgotICoKLSAqICAgICAxMjgtMTkxICBSZXNlcnZlZAotICoKLSAqICAgTG9jYWwgZXh0ZW5zaW9uczoKLSAqCi0gKiAgICAgMTkyLTI1NSAgTG9jYWwgZXh0ZW5zaW9ucwotICovCi0KLS8qIHJhbmdlcyAqLwotCi0jZGVmaW5lIFNTSDJfTVNHX1RSQU5TUE9SVF9NSU4JCQkJMQotI2RlZmluZSBTU0gyX01TR19UUkFOU1BPUlRfTUFYCQkJCTQ5Ci0jZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX01JTgkJCQk1MAotI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9NQVgJCQkJNzkKLSNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfUEVSX01FVEhPRF9NSU4JCTYwCi0jZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX1BFUl9NRVRIT0RfTUFYCQlTU0gyX01TR19VU0VSQVVUSF9NQVgKLSNkZWZpbmUgU1NIMl9NU0dfQ09OTkVDVElPTl9NSU4JCQkJODAKLSNkZWZpbmUgU1NIMl9NU0dfQ09OTkVDVElPTl9NQVgJCQkJMTI3Ci0jZGVmaW5lIFNTSDJfTVNHX1JFU0VSVkVEX01JTgkJCQkxMjgKLSNkZWZpbmUgU1NIMl9NU0dfUkVTRVJWRURfTUFYCQkJCTE5MQotI2RlZmluZSBTU0gyX01TR19MT0NBTF9NSU4JCQkJMTkyCi0jZGVmaW5lIFNTSDJfTVNHX0xPQ0FMX01BWAkJCQkyNTUKLSNkZWZpbmUgU1NIMl9NU0dfTUlOCQkJCQkxCi0jZGVmaW5lIFNTSDJfTVNHX01BWAkJCQkJMjU1Ci0KLS8qIHRyYW5zcG9ydCBsYXllcjogZ2VuZXJpYyAqLwotCi0jZGVmaW5lIFNTSDJfTVNHX0RJU0NPTk5FQ1QJCQkJMQotI2RlZmluZSBTU0gyX01TR19JR05PUkUJCQkJCTIKLSNkZWZpbmUgU1NIMl9NU0dfVU5JTVBMRU1FTlRFRAkJCQkzCi0jZGVmaW5lIFNTSDJfTVNHX0RFQlVHCQkJCQk0Ci0jZGVmaW5lIFNTSDJfTVNHX1NFUlZJQ0VfUkVRVUVTVAkJCTUKLSNkZWZpbmUgU1NIMl9NU0dfU0VSVklDRV9BQ0NFUFQJCQkJNgotCi0vKiB0cmFuc3BvcnQgbGF5ZXI6IGFsZyBuZWdvdGlhdGlvbiAqLwotCi0jZGVmaW5lIFNTSDJfTVNHX0tFWElOSVQJCQkJMjAKLSNkZWZpbmUgU1NIMl9NU0dfTkVXS0VZUwkJCQkyMQotCi0vKiB0cmFuc3BvcnQgbGF5ZXI6IGtleCBzcGVjaWZpYyBtZXNzYWdlcywgY2FuIGJlIHJldXNlZCAqLwotCi0jZGVmaW5lIFNTSDJfTVNHX0tFWERIX0lOSVQJCQkJMzAKLSNkZWZpbmUgU1NIMl9NU0dfS0VYREhfUkVQTFkJCQkJMzEKLQotLyogZGgtZ3JvdXAtZXhjaGFuZ2UgKi8KLSNkZWZpbmUgU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVFVRVNUX09MRAkJCTMwCi0jZGVmaW5lIFNTSDJfTVNHX0tFWF9ESF9HRVhfR1JPVVAJCQkzMQotI2RlZmluZSBTU0gyX01TR19LRVhfREhfR0VYX0lOSVQJCQkzMgotI2RlZmluZSBTU0gyX01TR19LRVhfREhfR0VYX1JFUExZCQkJMzMKLSNkZWZpbmUgU1NIMl9NU0dfS0VYX0RIX0dFWF9SRVFVRVNUCQkJMzQKLQotLyogZWNkaCAqLwotI2RlZmluZSBTU0gyX01TR19LRVhfRUNESF9JTklUCQkJCTMwCi0jZGVmaW5lIFNTSDJfTVNHX0tFWF9FQ0RIX1JFUExZCQkJCTMxCi0KLS8qIHVzZXIgYXV0aGVudGljYXRpb246IGdlbmVyaWMgKi8KLQotI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUCQkJNTAKLSNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfRkFJTFVSRQkJCTUxCi0jZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX1NVQ0NFU1MJCQk1MgotI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9CQU5ORVIJCQk1MwotCi0vKiB1c2VyIGF1dGhlbnRpY2F0aW9uOiBtZXRob2Qgc3BlY2lmaWMsIGNhbiBiZSByZXVzZWQgKi8KLQotI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9QS19PSwkJCQk2MAotI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9QQVNTV0RfQ0hBTkdFUkVRCQk2MAotI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9JTkZPX1JFUVVFU1QJCQk2MAotI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9JTkZPX1JFU1BPTlNFCQkJNjEKLSNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfQ0xJRU5UX1NURVAxCQk2MAotI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9TRVJWRVJfU1RFUDEJCTYxCi0jZGVmaW5lIFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX0NMSUVOVF9TVEVQMgkJNjIKLSNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfU0VSVkVSX1NURVAyCQk2MwotI2RlZmluZSBTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfQ09ORklSTQkJNjQKLSNkZWZpbmUgU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfU0VSVkVSX0NPTkZJUk0JCTY1Ci0KLS8qIGNvbm5lY3Rpb24gcHJvdG9jb2w6IGdlbmVyaWMgKi8KLQotI2RlZmluZSBTU0gyX01TR19HTE9CQUxfUkVRVUVTVAkJCQk4MAotI2RlZmluZSBTU0gyX01TR19SRVFVRVNUX1NVQ0NFU1MJCQk4MQotI2RlZmluZSBTU0gyX01TR19SRVFVRVNUX0ZBSUxVUkUJCQk4MgotCi0vKiBjaGFubmVsIHJlbGF0ZWQgbWVzc2FnZXMgKi8KLQotI2RlZmluZSBTU0gyX01TR19DSEFOTkVMX09QRU4JCQkJOTAKLSNkZWZpbmUgU1NIMl9NU0dfQ0hBTk5FTF9PUEVOX0NPTkZJUk1BVElPTgkJOTEKLSNkZWZpbmUgU1NIMl9NU0dfQ0hBTk5FTF9PUEVOX0ZBSUxVUkUJCQk5MgotI2RlZmluZSBTU0gyX01TR19DSEFOTkVMX1dJTkRPV19BREpVU1QJCQk5MwotI2RlZmluZSBTU0gyX01TR19DSEFOTkVMX0RBVEEJCQkJOTQKLSNkZWZpbmUgU1NIMl9NU0dfQ0hBTk5FTF9FWFRFTkRFRF9EQVRBCQkJOTUKLSNkZWZpbmUgU1NIMl9NU0dfQ0hBTk5FTF9FT0YJCQkJOTYKLSNkZWZpbmUgU1NIMl9NU0dfQ0hBTk5FTF9DTE9TRQkJCQk5NwotI2RlZmluZSBTU0gyX01TR19DSEFOTkVMX1JFUVVFU1QJCQk5OAotI2RlZmluZSBTU0gyX01TR19DSEFOTkVMX1NVQ0NFU1MJCQk5OQotI2RlZmluZSBTU0gyX01TR19DSEFOTkVMX0ZBSUxVUkUJCQkxMDAKLQotLyogZGlzY29ubmVjdCByZWFzb24gY29kZSAqLwotCi0jZGVmaW5lIFNTSDJfRElTQ09OTkVDVF9IT1NUX05PVF9BTExPV0VEX1RPX0NPTk5FQ1QJMQotI2RlZmluZSBTU0gyX0RJU0NPTk5FQ1RfUFJPVE9DT0xfRVJST1IJCQkyCi0jZGVmaW5lIFNTSDJfRElTQ09OTkVDVF9LRVlfRVhDSEFOR0VfRkFJTEVECQkzCi0jZGVmaW5lIFNTSDJfRElTQ09OTkVDVF9IT1NUX0FVVEhFTlRJQ0FUSU9OX0ZBSUxFRAk0Ci0jZGVmaW5lIFNTSDJfRElTQ09OTkVDVF9SRVNFUlZFRAkJCTQKLSNkZWZpbmUgU1NIMl9ESVNDT05ORUNUX01BQ19FUlJPUgkJCTUKLSNkZWZpbmUgU1NIMl9ESVNDT05ORUNUX0NPTVBSRVNTSU9OX0VSUk9SCQk2Ci0jZGVmaW5lIFNTSDJfRElTQ09OTkVDVF9TRVJWSUNFX05PVF9BVkFJTEFCTEUJCTcKLSNkZWZpbmUgU1NIMl9ESVNDT05ORUNUX1BST1RPQ09MX1ZFUlNJT05fTk9UX1NVUFBPUlRFRAk4Ci0jZGVmaW5lIFNTSDJfRElTQ09OTkVDVF9IT1NUX0tFWV9OT1RfVkVSSUZJQUJMRQkJOQotI2RlZmluZSBTU0gyX0RJU0NPTk5FQ1RfQ09OTkVDVElPTl9MT1NUCQkJMTAKLSNkZWZpbmUgU1NIMl9ESVNDT05ORUNUX0JZX0FQUExJQ0FUSU9OCQkJMTEKLSNkZWZpbmUgU1NIMl9ESVNDT05ORUNUX1RPT19NQU5ZX0NPTk5FQ1RJT05TCQkxMgotI2RlZmluZSBTU0gyX0RJU0NPTk5FQ1RfQVVUSF9DQU5DRUxMRURfQllfVVNFUgkJMTMKLSNkZWZpbmUgU1NIMl9ESVNDT05ORUNUX05PX01PUkVfQVVUSF9NRVRIT0RTX0FWQUlMQUJMRQkxNAotI2RlZmluZSBTU0gyX0RJU0NPTk5FQ1RfSUxMRUdBTF9VU0VSX05BTUUJCTE1Ci0KLS8qIG1pc2MgKi8KLQotI2RlZmluZSBTU0gyX09QRU5fQURNSU5JU1RSQVRJVkVMWV9QUk9ISUJJVEVECQkxCi0jZGVmaW5lIFNTSDJfT1BFTl9DT05ORUNUX0ZBSUxFRAkJCTIKLSNkZWZpbmUgU1NIMl9PUEVOX1VOS05PV05fQ0hBTk5FTF9UWVBFCQkJMwotI2RlZmluZSBTU0gyX09QRU5fUkVTT1VSQ0VfU0hPUlRBR0UJCQk0Ci0KLSNkZWZpbmUgU1NIMl9FWFRFTkRFRF9EQVRBX1NUREVSUgkJCTEKLQotLyoga2V4IG1lc3NhZ2VzIGZvciByZXN1bWVAYXBwZ2F0ZS5jb20gKi8KLSNkZWZpbmUgU1NIMl9NU0dfS0VYX1JPQU1JTkdfUkVTVU1FCQkJMzAKLSNkZWZpbmUgU1NIMl9NU0dfS0VYX1JPQU1JTkdfQVVUSF9SRVFVSVJFRAkJMzEKLSNkZWZpbmUgU1NIMl9NU0dfS0VYX1JPQU1JTkdfQVVUSAkJCTMyCi0jZGVmaW5lIFNTSDJfTVNHX0tFWF9ST0FNSU5HX0FVVEhfT0sJCQkzMwotI2RlZmluZSBTU0gyX01TR19LRVhfUk9BTUlOR19BVVRIX0ZBSUwJCQkzNAotCi0vKiBDZXJ0aWZpY2F0ZSB0eXBlcyBmb3IgT3BlblNTSCBjZXJ0aWZpY2F0ZSBrZXlzIGV4dGVuc2lvbiAqLwotI2RlZmluZSBTU0gyX0NFUlRfVFlQRV9VU0VSCQkJCTEKLSNkZWZpbmUgU1NIMl9DRVJUX1RZUEVfSE9TVAkJCQkyCmRpZmYgLS1naXQgYS9zc2hfY29uZmlnIGIvc3NoX2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5MzY3NC4uMDAwMDAwMAotLS0gYS9zc2hfY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIwkkT3BlbkJTRDogc3NoX2NvbmZpZyx2IDEuMjYgMjAxMC8wMS8xMSAwMTozOTo0NiBkdHVja2VyIEV4cCAkCi0KLSMgVGhpcyBpcyB0aGUgc3NoIGNsaWVudCBzeXN0ZW0td2lkZSBjb25maWd1cmF0aW9uIGZpbGUuICBTZWUKLSMgc3NoX2NvbmZpZyg1KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIFRoaXMgZmlsZSBwcm92aWRlcyBkZWZhdWx0cyBmb3IKLSMgdXNlcnMsIGFuZCB0aGUgdmFsdWVzIGNhbiBiZSBjaGFuZ2VkIGluIHBlci11c2VyIGNvbmZpZ3VyYXRpb24gZmlsZXMKLSMgb3Igb24gdGhlIGNvbW1hbmQgbGluZS4KLQotIyBDb25maWd1cmF0aW9uIGRhdGEgaXMgcGFyc2VkIGFzIGZvbGxvd3M6Ci0jICAxLiBjb21tYW5kIGxpbmUgb3B0aW9ucwotIyAgMi4gdXNlci1zcGVjaWZpYyBmaWxlCi0jICAzLiBzeXN0ZW0td2lkZSBmaWxlCi0jIEFueSBjb25maWd1cmF0aW9uIHZhbHVlIGlzIG9ubHkgY2hhbmdlZCB0aGUgZmlyc3QgdGltZSBpdCBpcyBzZXQuCi0jIFRodXMsIGhvc3Qtc3BlY2lmaWMgZGVmaW5pdGlvbnMgc2hvdWxkIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0jIGNvbmZpZ3VyYXRpb24gZmlsZSwgYW5kIGRlZmF1bHRzIGF0IHRoZSBlbmQuCi0KLSMgU2l0ZS13aWRlIGRlZmF1bHRzIGZvciBzb21lIGNvbW1vbmx5IHVzZWQgb3B0aW9ucy4gIEZvciBhIGNvbXByZWhlbnNpdmUKLSMgbGlzdCBvZiBhdmFpbGFibGUgb3B0aW9ucywgdGhlaXIgbWVhbmluZ3MgYW5kIGRlZmF1bHRzLCBwbGVhc2Ugc2VlIHRoZQotIyBzc2hfY29uZmlnKDUpIG1hbiBwYWdlLgotCi0jIEhvc3QgKgotIyAgIEZvcndhcmRBZ2VudCBubwotIyAgIEZvcndhcmRYMTEgbm8KLSMgICBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbiBubwotIyAgIFJTQUF1dGhlbnRpY2F0aW9uIHllcwotIyAgIFBhc3N3b3JkQXV0aGVudGljYXRpb24geWVzCi0jICAgSG9zdGJhc2VkQXV0aGVudGljYXRpb24gbm8KLSMgICBHU1NBUElBdXRoZW50aWNhdGlvbiBubwotIyAgIEdTU0FQSURlbGVnYXRlQ3JlZGVudGlhbHMgbm8KLSMgICBCYXRjaE1vZGUgbm8KLSMgICBDaGVja0hvc3RJUCB5ZXMKLSMgICBBZGRyZXNzRmFtaWx5IGFueQotIyAgIENvbm5lY3RUaW1lb3V0IDAKLSMgICBTdHJpY3RIb3N0S2V5Q2hlY2tpbmcgYXNrCi0jICAgSWRlbnRpdHlGaWxlIH4vLnNzaC9pZGVudGl0eQotIyAgIElkZW50aXR5RmlsZSB+Ly5zc2gvaWRfcnNhCi0jICAgSWRlbnRpdHlGaWxlIH4vLnNzaC9pZF9kc2EKLSMgICBQb3J0IDIyCi0jICAgUHJvdG9jb2wgMiwxCi0jICAgQ2lwaGVyIDNkZXMKLSMgICBDaXBoZXJzIGFlczEyOC1jdHIsYWVzMTkyLWN0cixhZXMyNTYtY3RyLGFyY2ZvdXIyNTYsYXJjZm91cjEyOCxhZXMxMjgtY2JjLDNkZXMtY2JjCi0jICAgTUFDcyBobWFjLW1kNSxobWFjLXNoYTEsdW1hYy02NEBvcGVuc3NoLmNvbSxobWFjLXJpcGVtZDE2MAotIyAgIEVzY2FwZUNoYXIgfgotIyAgIFR1bm5lbCBubwotIyAgIFR1bm5lbERldmljZSBhbnk6YW55Ci0jICAgUGVybWl0TG9jYWxDb21tYW5kIG5vCi0jICAgVmlzdWFsSG9zdEtleSBubwotIyAgIFByb3h5Q29tbWFuZCBzc2ggLXEgLVcgJWg6JXAgZ2F0ZXdheS5leGFtcGxlLmNvbQpkaWZmIC0tZ2l0IGEvc3NoX2NvbmZpZy4wIGIvc3NoX2NvbmZpZy4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjkyMDU2Li4wMDAwMDAwCi0tLSBhL3NzaF9jb25maWcuMAorKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi1TU0hfQ09ORklHKDUpICAgICAgICAgICAgIE9wZW5CU0QgUHJvZ3JhbW1lcidzIE1hbnVhbCAgICAgICAgICAgIFNTSF9DT05GSUcoNSkKLQotTkFNRQotICAgICBzc2hfY29uZmlnIC0gT3BlblNTSCBTU0ggY2xpZW50IGNvbmZpZ3VyYXRpb24gZmlsZXMKLQotU1lOT1BTSVMKLSAgICAgfi8uc3NoL2NvbmZpZwotICAgICAvZXRjL3NzaC9zc2hfY29uZmlnCi0KLURFU0NSSVBUSU9OCi0gICAgIHNzaCgxKSBvYnRhaW5zIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcyBpbiB0aGUKLSAgICAgZm9sbG93aW5nIG9yZGVyOgotCi0gICAgICAgICAgIDEuICAgY29tbWFuZC1saW5lIG9wdGlvbnMKLSAgICAgICAgICAgMi4gICB1c2VyJ3MgY29uZmlndXJhdGlvbiBmaWxlICh+Ly5zc2gvY29uZmlnKQotICAgICAgICAgICAzLiAgIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZSAoL2V0Yy9zc2gvc3NoX2NvbmZpZykKLQotICAgICBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSBmaXJzdCBvYnRhaW5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQuICBUaGUKLSAgICAgY29uZmlndXJhdGlvbiBmaWxlcyBjb250YWluIHNlY3Rpb25zIHNlcGFyYXRlZCBieSBgYEhvc3QnJwotICAgICBzcGVjaWZpY2F0aW9ucywgYW5kIHRoYXQgc2VjdGlvbiBpcyBvbmx5IGFwcGxpZWQgZm9yIGhvc3RzIHRoYXQgbWF0Y2ggb25lCi0gICAgIG9mIHRoZSBwYXR0ZXJucyBnaXZlbiBpbiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZSBtYXRjaGVkIGhvc3QgbmFtZSBpcyB0aGUKLSAgICAgb25lIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLSAgICAgU2luY2UgdGhlIGZpcnN0IG9idGFpbmVkIHZhbHVlIGZvciBlYWNoIHBhcmFtZXRlciBpcyB1c2VkLCBtb3JlIGhvc3QtCi0gICAgIHNwZWNpZmljIGRlY2xhcmF0aW9ucyBzaG91bGQgYmUgZ2l2ZW4gbmVhciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLCBhbmQKLSAgICAgZ2VuZXJhbCBkZWZhdWx0cyBhdCB0aGUgZW5kLgotCi0gICAgIFRoZSBjb25maWd1cmF0aW9uIGZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotCi0gICAgIEVtcHR5IGxpbmVzIGFuZCBsaW5lcyBzdGFydGluZyB3aXRoIGAjJyBhcmUgY29tbWVudHMuICBPdGhlcndpc2UgYSBsaW5lCi0gICAgIGlzIG9mIHRoZSBmb3JtYXQgYGBrZXl3b3JkIGFyZ3VtZW50cycnLiAgQ29uZmlndXJhdGlvbiBvcHRpb25zIG1heSBiZQotICAgICBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBvciBvcHRpb25hbCB3aGl0ZXNwYWNlIGFuZCBleGFjdGx5IG9uZSBgPSc7IHRoZQotICAgICBsYXR0ZXIgZm9ybWF0IGlzIHVzZWZ1bCB0byBhdm9pZCB0aGUgbmVlZCB0byBxdW90ZSB3aGl0ZXNwYWNlIHdoZW4KLSAgICAgc3BlY2lmeWluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNpbmcgdGhlIHNzaCwgc2NwLCBhbmQgc2Z0cCAtbyBvcHRpb24uCi0gICAgIEFyZ3VtZW50cyBtYXkgb3B0aW9uYWxseSBiZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzICgiKSBpbiBvcmRlciB0bwotICAgICByZXByZXNlbnQgYXJndW1lbnRzIGNvbnRhaW5pbmcgc3BhY2VzLgotCi0gICAgIFRoZSBwb3NzaWJsZSBrZXl3b3JkcyBhbmQgdGhlaXIgbWVhbmluZ3MgYXJlIGFzIGZvbGxvd3MgKG5vdGUgdGhhdAotICAgICBrZXl3b3JkcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgYXJndW1lbnRzIGFyZSBjYXNlLXNlbnNpdGl2ZSk6Ci0KLSAgICAgSG9zdCAgICBSZXN0cmljdHMgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnMgKHVwIHRvIHRoZSBuZXh0IEhvc3QKLSAgICAgICAgICAgICBrZXl3b3JkKSB0byBiZSBvbmx5IGZvciB0aG9zZSBob3N0cyB0aGF0IG1hdGNoIG9uZSBvZiB0aGUKLSAgICAgICAgICAgICBwYXR0ZXJucyBnaXZlbiBhZnRlciB0aGUga2V5d29yZC4gIElmIG1vcmUgdGhhbiBvbmUgcGF0dGVybiBpcwotICAgICAgICAgICAgIHByb3ZpZGVkLCB0aGV5IHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIEEgc2luZ2xlIGAqJwotICAgICAgICAgICAgIGFzIGEgcGF0dGVybiBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGdsb2JhbCBkZWZhdWx0cyBmb3IgYWxsCi0gICAgICAgICAgICAgaG9zdHMuICBUaGUgaG9zdCBpcyB0aGUgaG9zdG5hbWUgYXJndW1lbnQgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKLSAgICAgICAgICAgICBsaW5lIChpLmUuIHRoZSBuYW1lIGlzIG5vdCBjb252ZXJ0ZWQgdG8gYSBjYW5vbmljYWxpemVkIGhvc3QgbmFtZQotICAgICAgICAgICAgIGJlZm9yZSBtYXRjaGluZykuCi0KLSAgICAgICAgICAgICBBIHBhdHRlcm4gZW50cnkgbWF5IGJlIG5lZ2F0ZWQgYnkgcHJlZml4aW5nIGl0IHdpdGggYW4KLSAgICAgICAgICAgICBleGNsYW1hdGlvbiBtYXJrIChgIScpLiAgSWYgYSBuZWdhdGVkIGVudHJ5IGlzIG1hdGNoZWQsIHRoZW4gdGhlCi0gICAgICAgICAgICAgSG9zdCBlbnRyeSBpcyBpZ25vcmVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG90aGVyIHBhdHRlcm5zCi0gICAgICAgICAgICAgb24gdGhlIGxpbmUgbWF0Y2guICBOZWdhdGVkIG1hdGNoZXMgYXJlIHRoZXJlZm9yZSB1c2VmdWwgdG8KLSAgICAgICAgICAgICBwcm92aWRlIGV4Y2VwdGlvbnMgZm9yIHdpbGRjYXJkIG1hdGNoZXMuCi0KLSAgICAgICAgICAgICBTZWUgUEFUVEVSTlMgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGF0dGVybnMuCi0KLSAgICAgQWRkcmVzc0ZhbWlseQotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGljaCBhZGRyZXNzIGZhbWlseSB0byB1c2Ugd2hlbiBjb25uZWN0aW5nLiAgVmFsaWQKLSAgICAgICAgICAgICBhcmd1bWVudHMgYXJlIGBgYW55JycsIGBgaW5ldCcnICh1c2UgSVB2NCBvbmx5KSwgb3IgYGBpbmV0NicnCi0gICAgICAgICAgICAgKHVzZSBJUHY2IG9ubHkpLgotCi0gICAgIEJhdGNoTW9kZQotICAgICAgICAgICAgIElmIHNldCB0byBgYHllcycnLCBwYXNzcGhyYXNlL3Bhc3N3b3JkIHF1ZXJ5aW5nIHdpbGwgYmUgZGlzYWJsZWQuCi0gICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIGluIHNjcmlwdHMgYW5kIG90aGVyIGJhdGNoIGpvYnMgd2hlcmUgbm8KLSAgICAgICAgICAgICB1c2VyIGlzIHByZXNlbnQgdG8gc3VwcGx5IHRoZSBwYXNzd29yZC4gIFRoZSBhcmd1bWVudCBtdXN0IGJlCi0gICAgICAgICAgICAgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuCi0KLSAgICAgQmluZEFkZHJlc3MKLSAgICAgICAgICAgICBVc2UgdGhlIHNwZWNpZmllZCBhZGRyZXNzIG9uIHRoZSBsb2NhbCBtYWNoaW5lIGFzIHRoZSBzb3VyY2UKLSAgICAgICAgICAgICBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW9uLiAgT25seSB1c2VmdWwgb24gc3lzdGVtcyB3aXRoIG1vcmUgdGhhbgotICAgICAgICAgICAgIG9uZSBhZGRyZXNzLiAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGRvZXMgbm90IHdvcmsgaWYKLSAgICAgICAgICAgICBVc2VQcml2aWxlZ2VkUG9ydCBpcyBzZXQgdG8gYGB5ZXMnJy4KLQotICAgICBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGNoYWxsZW5nZS1yZXNwb25zZSBhdXRoZW50aWNhdGlvbi4gIFRoZQotICAgICAgICAgICAgIGFyZ3VtZW50IHRvIHRoaXMga2V5d29yZCBtdXN0IGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQKLSAgICAgICAgICAgICBpcyBgYHllcycnLgotCi0gICAgIENoZWNrSG9zdElQCi0gICAgICAgICAgICAgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBgYHllcycnLCBzc2goMSkgd2lsbCBhZGRpdGlvbmFsbHkgY2hlY2sKLSAgICAgICAgICAgICB0aGUgaG9zdCBJUCBhZGRyZXNzIGluIHRoZSBrbm93bl9ob3N0cyBmaWxlLiAgVGhpcyBhbGxvd3Mgc3NoIHRvCi0gICAgICAgICAgICAgZGV0ZWN0IGlmIGEgaG9zdCBrZXkgY2hhbmdlZCBkdWUgdG8gRE5TIHNwb29maW5nLiAgSWYgdGhlIG9wdGlvbgotICAgICAgICAgICAgIGlzIHNldCB0byBgYG5vJycsIHRoZSBjaGVjayB3aWxsIG5vdCBiZSBleGVjdXRlZC4gIFRoZSBkZWZhdWx0IGlzCi0gICAgICAgICAgICAgYGB5ZXMnJy4KLQotICAgICBDaXBoZXIgIFNwZWNpZmllcyB0aGUgY2lwaGVyIHRvIHVzZSBmb3IgZW5jcnlwdGluZyB0aGUgc2Vzc2lvbiBpbgotICAgICAgICAgICAgIHByb3RvY29sIHZlcnNpb24gMS4gIEN1cnJlbnRseSwgYGBibG93ZmlzaCcnLCBgYDNkZXMnJywgYW5kCi0gICAgICAgICAgICAgYGBkZXMnJyBhcmUgc3VwcG9ydGVkLiAgZGVzIGlzIG9ubHkgc3VwcG9ydGVkIGluIHRoZSBzc2goMSkKLSAgICAgICAgICAgICBjbGllbnQgZm9yIGludGVyb3BlcmFiaWxpdHkgd2l0aCBsZWdhY3kgcHJvdG9jb2wgMQotICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSAzZGVzIGNpcGhlci4gIEl0cyB1c2UgaXMKLSAgICAgICAgICAgICBzdHJvbmdseSBkaXNjb3VyYWdlZCBkdWUgdG8gY3J5cHRvZ3JhcGhpYyB3ZWFrbmVzc2VzLiAgVGhlCi0gICAgICAgICAgICAgZGVmYXVsdCBpcyBgYDNkZXMnJy4KLQotICAgICBDaXBoZXJzCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBjaXBoZXJzIGFsbG93ZWQgZm9yIHByb3RvY29sIHZlcnNpb24gMiBpbiBvcmRlciBvZgotICAgICAgICAgICAgIHByZWZlcmVuY2UuICBNdWx0aXBsZSBjaXBoZXJzIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkLiAgVGhlCi0gICAgICAgICAgICAgc3VwcG9ydGVkIGNpcGhlcnMgYXJlIGBgM2Rlcy1jYmMnJywgYGBhZXMxMjgtY2JjJycsCi0gICAgICAgICAgICAgYGBhZXMxOTItY2JjJycsIGBgYWVzMjU2LWNiYycnLCBgYGFlczEyOC1jdHInJywgYGBhZXMxOTItY3RyJycsCi0gICAgICAgICAgICAgYGBhZXMyNTYtY3RyJycsIGBgYXJjZm91cjEyOCcnLCBgYGFyY2ZvdXIyNTYnJywgYGBhcmNmb3VyJycsCi0gICAgICAgICAgICAgYGBibG93ZmlzaC1jYmMnJywgYW5kIGBgY2FzdDEyOC1jYmMnJy4gIFRoZSBkZWZhdWx0IGlzOgotCi0gICAgICAgICAgICAgICAgYWVzMTI4LWN0cixhZXMxOTItY3RyLGFlczI1Ni1jdHIsYXJjZm91cjI1NixhcmNmb3VyMTI4LAotICAgICAgICAgICAgICAgIGFlczEyOC1jYmMsM2Rlcy1jYmMsYmxvd2Zpc2gtY2JjLGNhc3QxMjgtY2JjLGFlczE5Mi1jYmMsCi0gICAgICAgICAgICAgICAgYWVzMjU2LWNiYyxhcmNmb3VyCi0KLSAgICAgQ2xlYXJBbGxGb3J3YXJkaW5ncwotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGF0IGFsbCBsb2NhbCwgcmVtb3RlLCBhbmQgZHluYW1pYyBwb3J0IGZvcndhcmRpbmdzCi0gICAgICAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIG9yIG9uIHRoZSBjb21tYW5kIGxpbmUgYmUKLSAgICAgICAgICAgICBjbGVhcmVkLiAgVGhpcyBvcHRpb24gaXMgcHJpbWFyaWx5IHVzZWZ1bCB3aGVuIHVzZWQgZnJvbSB0aGUKLSAgICAgICAgICAgICBzc2goMSkgY29tbWFuZCBsaW5lIHRvIGNsZWFyIHBvcnQgZm9yd2FyZGluZ3Mgc2V0IGluCi0gICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlcywgYW5kIGlzIGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHNjcCgxKSBhbmQKLSAgICAgICAgICAgICBzZnRwKDEpLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUgZGVmYXVsdCBpcwotICAgICAgICAgICAgIGBgbm8nJy4KLQotICAgICBDb21wcmVzc2lvbgotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBjb21wcmVzc2lvbi4gIFRoZSBhcmd1bWVudCBtdXN0IGJlCi0gICAgICAgICAgICAgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuCi0KLSAgICAgQ29tcHJlc3Npb25MZXZlbAotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgY29tcHJlc3Npb24gbGV2ZWwgdG8gdXNlIGlmIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQuCi0gICAgICAgICAgICAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYW4gaW50ZWdlciBmcm9tIDEgKGZhc3QpIHRvIDkgKHNsb3csIGJlc3QpLgotICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGxldmVsIGlzIDYsIHdoaWNoIGlzIGdvb2QgZm9yIG1vc3QgYXBwbGljYXRpb25zLiAgVGhlCi0gICAgICAgICAgICAgbWVhbmluZyBvZiB0aGUgdmFsdWVzIGlzIHRoZSBzYW1lIGFzIGluIGd6aXAoMSkuICBOb3RlIHRoYXQgdGhpcwotICAgICAgICAgICAgIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMSBvbmx5LgotCi0gICAgIENvbm5lY3Rpb25BdHRlbXB0cwotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRyaWVzIChvbmUgcGVyIHNlY29uZCkgdG8gbWFrZSBiZWZvcmUKLSAgICAgICAgICAgICBleGl0aW5nLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYW4gaW50ZWdlci4gIFRoaXMgbWF5IGJlIHVzZWZ1bCBpbgotICAgICAgICAgICAgIHNjcmlwdHMgaWYgdGhlIGNvbm5lY3Rpb24gc29tZXRpbWVzIGZhaWxzLiAgVGhlIGRlZmF1bHQgaXMgMS4KLQotICAgICBDb25uZWN0VGltZW91dAotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdGltZW91dCAoaW4gc2Vjb25kcykgdXNlZCB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlCi0gICAgICAgICAgICAgU1NIIHNlcnZlciwgaW5zdGVhZCBvZiB1c2luZyB0aGUgZGVmYXVsdCBzeXN0ZW0gVENQIHRpbWVvdXQuCi0gICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyB1c2VkIG9ubHkgd2hlbiB0aGUgdGFyZ2V0IGlzIGRvd24gb3IgcmVhbGx5Ci0gICAgICAgICAgICAgdW5yZWFjaGFibGUsIG5vdCB3aGVuIGl0IHJlZnVzZXMgdGhlIGNvbm5lY3Rpb24uCi0KLSAgICAgQ29udHJvbE1hc3RlcgotICAgICAgICAgICAgIEVuYWJsZXMgdGhlIHNoYXJpbmcgb2YgbXVsdGlwbGUgc2Vzc2lvbnMgb3ZlciBhIHNpbmdsZSBuZXR3b3JrCi0gICAgICAgICAgICAgY29ubmVjdGlvbi4gIFdoZW4gc2V0IHRvIGBgeWVzJycsIHNzaCgxKSB3aWxsIGxpc3RlbiBmb3IKLSAgICAgICAgICAgICBjb25uZWN0aW9ucyBvbiBhIGNvbnRyb2wgc29ja2V0IHNwZWNpZmllZCB1c2luZyB0aGUgQ29udHJvbFBhdGgKLSAgICAgICAgICAgICBhcmd1bWVudC4gIEFkZGl0aW9uYWwgc2Vzc2lvbnMgY2FuIGNvbm5lY3QgdG8gdGhpcyBzb2NrZXQgdXNpbmcKLSAgICAgICAgICAgICB0aGUgc2FtZSBDb250cm9sUGF0aCB3aXRoIENvbnRyb2xNYXN0ZXIgc2V0IHRvIGBgbm8nJyAodGhlCi0gICAgICAgICAgICAgZGVmYXVsdCkuICBUaGVzZSBzZXNzaW9ucyB3aWxsIHRyeSB0byByZXVzZSB0aGUgbWFzdGVyIGluc3RhbmNlJ3MKLSAgICAgICAgICAgICBuZXR3b3JrIGNvbm5lY3Rpb24gcmF0aGVyIHRoYW4gaW5pdGlhdGluZyBuZXcgb25lcywgYnV0IHdpbGwgZmFsbAotICAgICAgICAgICAgIGJhY2sgdG8gY29ubmVjdGluZyBub3JtYWxseSBpZiB0aGUgY29udHJvbCBzb2NrZXQgZG9lcyBub3QgZXhpc3QsCi0gICAgICAgICAgICAgb3IgaXMgbm90IGxpc3RlbmluZy4KLQotICAgICAgICAgICAgIFNldHRpbmcgdGhpcyB0byBgYGFzaycnIHdpbGwgY2F1c2Ugc3NoIHRvIGxpc3RlbiBmb3IgY29udHJvbAotICAgICAgICAgICAgIGNvbm5lY3Rpb25zLCBidXQgcmVxdWlyZSBjb25maXJtYXRpb24gdXNpbmcgdGhlIFNTSF9BU0tQQVNTCi0gICAgICAgICAgICAgcHJvZ3JhbSBiZWZvcmUgdGhleSBhcmUgYWNjZXB0ZWQgKHNlZSBzc2gtYWRkKDEpIGZvciBkZXRhaWxzKS4KLSAgICAgICAgICAgICBJZiB0aGUgQ29udHJvbFBhdGggY2Fubm90IGJlIG9wZW5lZCwgc3NoIHdpbGwgY29udGludWUgd2l0aG91dAotICAgICAgICAgICAgIGNvbm5lY3RpbmcgdG8gYSBtYXN0ZXIgaW5zdGFuY2UuCi0KLSAgICAgICAgICAgICBYMTEgYW5kIHNzaC1hZ2VudCgxKSBmb3J3YXJkaW5nIGlzIHN1cHBvcnRlZCBvdmVyIHRoZXNlCi0gICAgICAgICAgICAgbXVsdGlwbGV4ZWQgY29ubmVjdGlvbnMsIGhvd2V2ZXIgdGhlIGRpc3BsYXkgYW5kIGFnZW50IGZvcndhcmRlZAotICAgICAgICAgICAgIHdpbGwgYmUgdGhlIG9uZSBiZWxvbmdpbmcgdG8gdGhlIG1hc3RlciBjb25uZWN0aW9uIGkuZS4gaXQgaXMgbm90Ci0gICAgICAgICAgICAgcG9zc2libGUgdG8gZm9yd2FyZCBtdWx0aXBsZSBkaXNwbGF5cyBvciBhZ2VudHMuCi0KLSAgICAgICAgICAgICBUd28gYWRkaXRpb25hbCBvcHRpb25zIGFsbG93IGZvciBvcHBvcnR1bmlzdGljIG11bHRpcGxleGluZzogdHJ5Ci0gICAgICAgICAgICAgdG8gdXNlIGEgbWFzdGVyIGNvbm5lY3Rpb24gYnV0IGZhbGwgYmFjayB0byBjcmVhdGluZyBhIG5ldyBvbmUgaWYKLSAgICAgICAgICAgICBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gIFRoZXNlIG9wdGlvbnMgYXJlOiBgYGF1dG8nJyBhbmQKLSAgICAgICAgICAgICBgYGF1dG9hc2snJy4gIFRoZSBsYXR0ZXIgcmVxdWlyZXMgY29uZmlybWF0aW9uIGxpa2UgdGhlIGBgYXNrJycKLSAgICAgICAgICAgICBvcHRpb24uCi0KLSAgICAgQ29udHJvbFBhdGgKLSAgICAgICAgICAgICBTcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSBjb250cm9sIHNvY2tldCB1c2VkIGZvciBjb25uZWN0aW9uCi0gICAgICAgICAgICAgc2hhcmluZyBhcyBkZXNjcmliZWQgaW4gdGhlIENvbnRyb2xNYXN0ZXIgc2VjdGlvbiBhYm92ZSBvciB0aGUKLSAgICAgICAgICAgICBzdHJpbmcgYGBub25lJycgdG8gZGlzYWJsZSBjb25uZWN0aW9uIHNoYXJpbmcuICBJbiB0aGUgcGF0aCwgYCVMJwotICAgICAgICAgICAgIHdpbGwgYmUgc3Vic3RpdHV0ZWQgYnkgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgbG9jYWwgaG9zdAotICAgICAgICAgICAgIG5hbWUsIGAlbCcgd2lsbCBiZSBzdWJzdGl0dXRlZCBieSB0aGUgbG9jYWwgaG9zdCBuYW1lIChpbmNsdWRpbmcKLSAgICAgICAgICAgICBhbnkgZG9tYWluIG5hbWUpLCBgJWgnIHdpbGwgYmUgc3Vic3RpdHV0ZWQgYnkgdGhlIHRhcmdldCBob3N0Ci0gICAgICAgICAgICAgbmFtZSwgYCVuJyB3aWxsIGJlIHN1YnN0aXR1dGVkIGJ5IHRoZSBvcmlnaW5hbCB0YXJnZXQgaG9zdCBuYW1lCi0gICAgICAgICAgICAgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGAlcCcgdGhlIHBvcnQsIGAlcicgYnkgdGhlIHJlbW90ZQotICAgICAgICAgICAgIGxvZ2luIHVzZXJuYW1lLCBhbmQgYCV1JyBieSB0aGUgdXNlcm5hbWUgb2YgdGhlIHVzZXIgcnVubmluZwotICAgICAgICAgICAgIHNzaCgxKS4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYW55IENvbnRyb2xQYXRoIHVzZWQgZm9yCi0gICAgICAgICAgICAgb3Bwb3J0dW5pc3RpYyBjb25uZWN0aW9uIHNoYXJpbmcgaW5jbHVkZSBhdCBsZWFzdCAlaCwgJXAsIGFuZCAlci4KLSAgICAgICAgICAgICBUaGlzIGVuc3VyZXMgdGhhdCBzaGFyZWQgY29ubmVjdGlvbnMgYXJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCi0KLSAgICAgQ29udHJvbFBlcnNpc3QKLSAgICAgICAgICAgICBXaGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBDb250cm9sTWFzdGVyLCBzcGVjaWZpZXMgdGhhdCB0aGUKLSAgICAgICAgICAgICBtYXN0ZXIgY29ubmVjdGlvbiBzaG91bGQgcmVtYWluIG9wZW4gaW4gdGhlIGJhY2tncm91bmQgKHdhaXRpbmcKLSAgICAgICAgICAgICBmb3IgZnV0dXJlIGNsaWVudCBjb25uZWN0aW9ucykgYWZ0ZXIgdGhlIGluaXRpYWwgY2xpZW50Ci0gICAgICAgICAgICAgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuICBJZiBzZXQgdG8gYGBubycnLCB0aGVuIHRoZSBtYXN0ZXIKLSAgICAgICAgICAgICBjb25uZWN0aW9uIHdpbGwgbm90IGJlIHBsYWNlZCBpbnRvIHRoZSBiYWNrZ3JvdW5kLCBhbmQgd2lsbCBjbG9zZQotICAgICAgICAgICAgIGFzIHNvb24gYXMgdGhlIGluaXRpYWwgY2xpZW50IGNvbm5lY3Rpb24gaXMgY2xvc2VkLiAgSWYgc2V0IHRvCi0gICAgICAgICAgICAgYGB5ZXMnJywgdGhlbiB0aGUgbWFzdGVyIGNvbm5lY3Rpb24gd2lsbCByZW1haW4gaW4gdGhlIGJhY2tncm91bmQKLSAgICAgICAgICAgICBpbmRlZmluaXRlbHkgKHVudGlsIGtpbGxlZCBvciBjbG9zZWQgdmlhIGEgbWVjaGFuaXNtIHN1Y2ggYXMgdGhlCi0gICAgICAgICAgICAgc3NoKDEpIGBgLU8gZXhpdCcnIG9wdGlvbikuICBJZiBzZXQgdG8gYSB0aW1lIGluIHNlY29uZHMsIG9yIGEKLSAgICAgICAgICAgICB0aW1lIGluIGFueSBvZiB0aGUgZm9ybWF0cyBkb2N1bWVudGVkIGluIHNzaGRfY29uZmlnKDUpLCB0aGVuIHRoZQotICAgICAgICAgICAgIGJhY2tncm91bmRlZCBtYXN0ZXIgY29ubmVjdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIGFmdGVyCi0gICAgICAgICAgICAgaXQgaGFzIHJlbWFpbmVkIGlkbGUgKHdpdGggbm8gY2xpZW50IGNvbm5lY3Rpb25zKSBmb3IgdGhlCi0gICAgICAgICAgICAgc3BlY2lmaWVkIHRpbWUuCi0KLSAgICAgRHluYW1pY0ZvcndhcmQKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBhIFRDUCBwb3J0IG9uIHRoZSBsb2NhbCBtYWNoaW5lIGJlIGZvcndhcmRlZCBvdmVyCi0gICAgICAgICAgICAgdGhlIHNlY3VyZSBjaGFubmVsLCBhbmQgdGhlIGFwcGxpY2F0aW9uIHByb3RvY29sIGlzIHRoZW4gdXNlZCB0bwotICAgICAgICAgICAgIGRldGVybWluZSB3aGVyZSB0byBjb25uZWN0IHRvIGZyb20gdGhlIHJlbW90ZSBtYWNoaW5lLgotCi0gICAgICAgICAgICAgVGhlIGFyZ3VtZW50IG11c3QgYmUgW2JpbmRfYWRkcmVzczpdcG9ydC4gIElQdjYgYWRkcmVzc2VzIGNhbiBiZQotICAgICAgICAgICAgIHNwZWNpZmllZCBieSBlbmNsb3NpbmcgYWRkcmVzc2VzIGluIHNxdWFyZSBicmFja2V0cy4gIEJ5IGRlZmF1bHQsCi0gICAgICAgICAgICAgdGhlIGxvY2FsIHBvcnQgaXMgYm91bmQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBHYXRld2F5UG9ydHMKLSAgICAgICAgICAgICBzZXR0aW5nLiAgSG93ZXZlciwgYW4gZXhwbGljaXQgYmluZF9hZGRyZXNzIG1heSBiZSB1c2VkIHRvIGJpbmQKLSAgICAgICAgICAgICB0aGUgY29ubmVjdGlvbiB0byBhIHNwZWNpZmljIGFkZHJlc3MuICBUaGUgYmluZF9hZGRyZXNzIG9mCi0gICAgICAgICAgICAgYGBsb2NhbGhvc3QnJyBpbmRpY2F0ZXMgdGhhdCB0aGUgbGlzdGVuaW5nIHBvcnQgYmUgYm91bmQgZm9yCi0gICAgICAgICAgICAgbG9jYWwgdXNlIG9ubHksIHdoaWxlIGFuIGVtcHR5IGFkZHJlc3Mgb3IgYConIGluZGljYXRlcyB0aGF0IHRoZQotICAgICAgICAgICAgIHBvcnQgc2hvdWxkIGJlIGF2YWlsYWJsZSBmcm9tIGFsbCBpbnRlcmZhY2VzLgotCi0gICAgICAgICAgICAgQ3VycmVudGx5IHRoZSBTT0NLUzQgYW5kIFNPQ0tTNSBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZCwgYW5kCi0gICAgICAgICAgICAgc3NoKDEpIHdpbGwgYWN0IGFzIGEgU09DS1Mgc2VydmVyLiAgTXVsdGlwbGUgZm9yd2FyZGluZ3MgbWF5IGJlCi0gICAgICAgICAgICAgc3BlY2lmaWVkLCBhbmQgYWRkaXRpb25hbCBmb3J3YXJkaW5ncyBjYW4gYmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKLSAgICAgICAgICAgICBsaW5lLiAgT25seSB0aGUgc3VwZXJ1c2VyIGNhbiBmb3J3YXJkIHByaXZpbGVnZWQgcG9ydHMuCi0KLSAgICAgRW5hYmxlU1NIS2V5c2lnbgotICAgICAgICAgICAgIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gYGB5ZXMnJyBpbiB0aGUgZ2xvYmFsIGNsaWVudCBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgZmlsZSAvZXRjL3NzaC9zc2hfY29uZmlnIGVuYWJsZXMgdGhlIHVzZSBvZiB0aGUgaGVscGVyIHByb2dyYW0KLSAgICAgICAgICAgICBzc2gta2V5c2lnbig4KSBkdXJpbmcgSG9zdGJhc2VkQXV0aGVudGljYXRpb24uICBUaGUgYXJndW1lbnQgbXVzdAotICAgICAgICAgICAgIGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQgaXMgYGBubycnLiAgVGhpcyBvcHRpb24gc2hvdWxkCi0gICAgICAgICAgICAgYmUgcGxhY2VkIGluIHRoZSBub24taG9zdHNwZWNpZmljIHNlY3Rpb24uICBTZWUgc3NoLWtleXNpZ24oOCkKLSAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgICBFc2NhcGVDaGFyCi0gICAgICAgICAgICAgU2V0cyB0aGUgZXNjYXBlIGNoYXJhY3RlciAoZGVmYXVsdDogYH4nKS4gIFRoZSBlc2NhcGUgY2hhcmFjdGVyCi0gICAgICAgICAgICAgY2FuIGFsc28gYmUgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUuICBUaGUgYXJndW1lbnQgc2hvdWxkIGJlIGEKLSAgICAgICAgICAgICBzaW5nbGUgY2hhcmFjdGVyLCBgXicgZm9sbG93ZWQgYnkgYSBsZXR0ZXIsIG9yIGBgbm9uZScnIHRvCi0gICAgICAgICAgICAgZGlzYWJsZSB0aGUgZXNjYXBlIGNoYXJhY3RlciBlbnRpcmVseSAobWFraW5nIHRoZSBjb25uZWN0aW9uCi0gICAgICAgICAgICAgdHJhbnNwYXJlbnQgZm9yIGJpbmFyeSBkYXRhKS4KLQotICAgICBFeGl0T25Gb3J3YXJkRmFpbHVyZQotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHNzaCgxKSBzaG91bGQgdGVybWluYXRlIHRoZSBjb25uZWN0aW9uIGlmIGl0Ci0gICAgICAgICAgICAgY2Fubm90IHNldCB1cCBhbGwgcmVxdWVzdGVkIGR5bmFtaWMsIHR1bm5lbCwgbG9jYWwsIGFuZCByZW1vdGUKLSAgICAgICAgICAgICBwb3J0IGZvcndhcmRpbmdzLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUKLSAgICAgICAgICAgICBkZWZhdWx0IGlzIGBgbm8nJy4KLQotICAgICBGb3J3YXJkQWdlbnQKLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0aGUgY29ubmVjdGlvbiB0byB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQgKGlmCi0gICAgICAgICAgICAgYW55KSB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgcmVtb3RlIG1hY2hpbmUuICBUaGUgYXJndW1lbnQgbXVzdAotICAgICAgICAgICAgIGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQgaXMgYGBubycnLgotCi0gICAgICAgICAgICAgQWdlbnQgZm9yd2FyZGluZyBzaG91bGQgYmUgZW5hYmxlZCB3aXRoIGNhdXRpb24uICBVc2VycyB3aXRoIHRoZQotICAgICAgICAgICAgIGFiaWxpdHkgdG8gYnlwYXNzIGZpbGUgcGVybWlzc2lvbnMgb24gdGhlIHJlbW90ZSBob3N0IChmb3IgdGhlCi0gICAgICAgICAgICAgYWdlbnQncyBVbml4LWRvbWFpbiBzb2NrZXQpIGNhbiBhY2Nlc3MgdGhlIGxvY2FsIGFnZW50IHRocm91Z2gKLSAgICAgICAgICAgICB0aGUgZm9yd2FyZGVkIGNvbm5lY3Rpb24uICBBbiBhdHRhY2tlciBjYW5ub3Qgb2J0YWluIGtleSBtYXRlcmlhbAotICAgICAgICAgICAgIGZyb20gdGhlIGFnZW50LCBob3dldmVyIHRoZXkgY2FuIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiB0aGUga2V5cwotICAgICAgICAgICAgIHRoYXQgZW5hYmxlIHRoZW0gdG8gYXV0aGVudGljYXRlIHVzaW5nIHRoZSBpZGVudGl0aWVzIGxvYWRlZCBpbnRvCi0gICAgICAgICAgICAgdGhlIGFnZW50LgotCi0gICAgIEZvcndhcmRYMTEKLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBYMTEgY29ubmVjdGlvbnMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAgcmVkaXJlY3RlZCBvdmVyIHRoZSBzZWN1cmUgY2hhbm5lbCBhbmQgRElTUExBWSBzZXQuICBUaGUgYXJndW1lbnQKLSAgICAgICAgICAgICBtdXN0IGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQgaXMgYGBubycnLgotCi0gICAgICAgICAgICAgWDExIGZvcndhcmRpbmcgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aCBjYXV0aW9uLiAgVXNlcnMgd2l0aCB0aGUKLSAgICAgICAgICAgICBhYmlsaXR5IHRvIGJ5cGFzcyBmaWxlIHBlcm1pc3Npb25zIG9uIHRoZSByZW1vdGUgaG9zdCAoZm9yIHRoZQotICAgICAgICAgICAgIHVzZXIncyBYMTEgYXV0aG9yaXphdGlvbiBkYXRhYmFzZSkgY2FuIGFjY2VzcyB0aGUgbG9jYWwgWDExCi0gICAgICAgICAgICAgZGlzcGxheSB0aHJvdWdoIHRoZSBmb3J3YXJkZWQgY29ubmVjdGlvbi4gIEFuIGF0dGFja2VyIG1heSB0aGVuCi0gICAgICAgICAgICAgYmUgYWJsZSB0byBwZXJmb3JtIGFjdGl2aXRpZXMgc3VjaCBhcyBrZXlzdHJva2UgbW9uaXRvcmluZyBpZiB0aGUKLSAgICAgICAgICAgICBGb3J3YXJkWDExVHJ1c3RlZCBvcHRpb24gaXMgYWxzbyBlbmFibGVkLgotCi0gICAgIEZvcndhcmRYMTFUaW1lb3V0Ci0gICAgICAgICAgICAgU3BlY2lmeSBhIHRpbWVvdXQgZm9yIHVudHJ1c3RlZCBYMTEgZm9yd2FyZGluZyB1c2luZyB0aGUgZm9ybWF0Ci0gICAgICAgICAgICAgZGVzY3JpYmVkIGluIHRoZSBUSU1FIEZPUk1BVFMgc2VjdGlvbiBvZiBzc2hkX2NvbmZpZyg1KS4gIFgxMQotICAgICAgICAgICAgIGNvbm5lY3Rpb25zIHJlY2VpdmVkIGJ5IHNzaCgxKSBhZnRlciB0aGlzIHRpbWUgd2lsbCBiZSByZWZ1c2VkLgotICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRvIGRpc2FibGUgdW50cnVzdGVkIFgxMSBmb3J3YXJkaW5nIGFmdGVyIHR3ZW50eQotICAgICAgICAgICAgIG1pbnV0ZXMgaGFzIGVsYXBzZWQuCi0KLSAgICAgRm9yd2FyZFgxMVRydXN0ZWQKLSAgICAgICAgICAgICBJZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gYGB5ZXMnJywgcmVtb3RlIFgxMSBjbGllbnRzIHdpbGwgaGF2ZQotICAgICAgICAgICAgIGZ1bGwgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBYMTEgZGlzcGxheS4KLQotICAgICAgICAgICAgIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgYG5vJycsIHJlbW90ZSBYMTEgY2xpZW50cyB3aWxsIGJlCi0gICAgICAgICAgICAgY29uc2lkZXJlZCB1bnRydXN0ZWQgYW5kIHByZXZlbnRlZCBmcm9tIHN0ZWFsaW5nIG9yIHRhbXBlcmluZwotICAgICAgICAgICAgIHdpdGggZGF0YSBiZWxvbmdpbmcgdG8gdHJ1c3RlZCBYMTEgY2xpZW50cy4gIEZ1cnRoZXJtb3JlLCB0aGUKLSAgICAgICAgICAgICB4YXV0aCgxKSB0b2tlbiB1c2VkIGZvciB0aGUgc2Vzc2lvbiB3aWxsIGJlIHNldCB0byBleHBpcmUgYWZ0ZXIKLSAgICAgICAgICAgICAyMCBtaW51dGVzLiAgUmVtb3RlIGNsaWVudHMgd2lsbCBiZSByZWZ1c2VkIGFjY2VzcyBhZnRlciB0aGlzCi0gICAgICAgICAgICAgdGltZS4KLQotICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGBgbm8nJy4KLQotICAgICAgICAgICAgIFNlZSB0aGUgWDExIFNFQ1VSSVRZIGV4dGVuc2lvbiBzcGVjaWZpY2F0aW9uIGZvciBmdWxsIGRldGFpbHMgb24KLSAgICAgICAgICAgICB0aGUgcmVzdHJpY3Rpb25zIGltcG9zZWQgb24gdW50cnVzdGVkIGNsaWVudHMuCi0KLSAgICAgR2F0ZXdheVBvcnRzCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgcmVtb3RlIGhvc3RzIGFyZSBhbGxvd2VkIHRvIGNvbm5lY3QgdG8gbG9jYWwKLSAgICAgICAgICAgICBmb3J3YXJkZWQgcG9ydHMuICBCeSBkZWZhdWx0LCBzc2goMSkgYmluZHMgbG9jYWwgcG9ydCBmb3J3YXJkaW5ncwotICAgICAgICAgICAgIHRvIHRoZSBsb29wYmFjayBhZGRyZXNzLiAgVGhpcyBwcmV2ZW50cyBvdGhlciByZW1vdGUgaG9zdHMgZnJvbQotICAgICAgICAgICAgIGNvbm5lY3RpbmcgdG8gZm9yd2FyZGVkIHBvcnRzLiAgR2F0ZXdheVBvcnRzIGNhbiBiZSB1c2VkIHRvCi0gICAgICAgICAgICAgc3BlY2lmeSB0aGF0IHNzaCBzaG91bGQgYmluZCBsb2NhbCBwb3J0IGZvcndhcmRpbmdzIHRvIHRoZQotICAgICAgICAgICAgIHdpbGRjYXJkIGFkZHJlc3MsIHRodXMgYWxsb3dpbmcgcmVtb3RlIGhvc3RzIHRvIGNvbm5lY3QgdG8KLSAgICAgICAgICAgICBmb3J3YXJkZWQgcG9ydHMuICBUaGUgYXJndW1lbnQgbXVzdCBiZSBgYHllcycnIG9yIGBgbm8nJy4gIFRoZQotICAgICAgICAgICAgIGRlZmF1bHQgaXMgYGBubycnLgotCi0gICAgIEdsb2JhbEtub3duSG9zdHNGaWxlCi0gICAgICAgICAgICAgU3BlY2lmaWVzIG9uZSBvciBtb3JlIGZpbGVzIHRvIHVzZSBmb3IgdGhlIGdsb2JhbCBob3N0IGtleQotICAgICAgICAgICAgIGRhdGFiYXNlLCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIFRoZSBkZWZhdWx0IGlzCi0gICAgICAgICAgICAgL2V0Yy9zc2gvc3NoX2tub3duX2hvc3RzLCAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMyLgotCi0gICAgIEdTU0FQSUF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdXNlciBhdXRoZW50aWNhdGlvbiBiYXNlZCBvbiBHU1NBUEkgaXMgYWxsb3dlZC4KLSAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbAotICAgICAgICAgICAgIHZlcnNpb24gMiBvbmx5LgotCi0gICAgIEdTU0FQSURlbGVnYXRlQ3JlZGVudGlhbHMKLSAgICAgICAgICAgICBGb3J3YXJkIChkZWxlZ2F0ZSkgY3JlZGVudGlhbHMgdG8gdGhlIHNlcnZlci4gIFRoZSBkZWZhdWx0IGlzCi0gICAgICAgICAgICAgYGBubycnLiAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyCi0gICAgICAgICAgICAgb25seS4KLQotICAgICBIYXNoS25vd25Ib3N0cwotICAgICAgICAgICAgIEluZGljYXRlcyB0aGF0IHNzaCgxKSBzaG91bGQgaGFzaCBob3N0IG5hbWVzIGFuZCBhZGRyZXNzZXMgd2hlbgotICAgICAgICAgICAgIHRoZXkgYXJlIGFkZGVkIHRvIH4vLnNzaC9rbm93bl9ob3N0cy4gIFRoZXNlIGhhc2hlZCBuYW1lcyBtYXkgYmUKLSAgICAgICAgICAgICB1c2VkIG5vcm1hbGx5IGJ5IHNzaCgxKSBhbmQgc3NoZCg4KSwgYnV0IHRoZXkgZG8gbm90IHJldmVhbAotICAgICAgICAgICAgIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uIHNob3VsZCB0aGUgZmlsZSdzIGNvbnRlbnRzIGJlIGRpc2Nsb3NlZC4KLSAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuICBOb3RlIHRoYXQgZXhpc3RpbmcgbmFtZXMgYW5kIGFkZHJlc3NlcyBpbgotICAgICAgICAgICAgIGtub3duIGhvc3RzIGZpbGVzIHdpbGwgbm90IGJlIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5LCBidXQgbWF5IGJlCi0gICAgICAgICAgICAgbWFudWFsbHkgaGFzaGVkIHVzaW5nIHNzaC1rZXlnZW4oMSkuCi0KLSAgICAgSG9zdGJhc2VkQXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0byB0cnkgcmhvc3RzIGJhc2VkIGF1dGhlbnRpY2F0aW9uIHdpdGggcHVibGljCi0gICAgICAgICAgICAga2V5IGF1dGhlbnRpY2F0aW9uLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUKLSAgICAgICAgICAgICBkZWZhdWx0IGlzIGBgbm8nJy4gIFRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyCi0gICAgICAgICAgICAgb25seSBhbmQgaXMgc2ltaWxhciB0byBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbi4KLQotICAgICBIb3N0S2V5QWxnb3JpdGhtcwotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAyIGhvc3Qga2V5IGFsZ29yaXRobXMgdGhhdCB0aGUKLSAgICAgICAgICAgICBjbGllbnQgd2FudHMgdG8gdXNlIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuICBUaGUgZGVmYXVsdCBmb3IgdGhpcwotICAgICAgICAgICAgIG9wdGlvbiBpczoKLQotICAgICAgICAgICAgICAgIGVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20sCi0gICAgICAgICAgICAgICAgZWNkc2Etc2hhMi1uaXN0cDM4NC1jZXJ0LXYwMUBvcGVuc3NoLmNvbSwKLSAgICAgICAgICAgICAgICBlY2RzYS1zaGEyLW5pc3RwNTIxLWNlcnQtdjAxQG9wZW5zc2guY29tLAotICAgICAgICAgICAgICAgIHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20sc3NoLWRzcy1jZXJ0LXYwMUBvcGVuc3NoLmNvbSwKLSAgICAgICAgICAgICAgICBzc2gtcnNhLWNlcnQtdjAwQG9wZW5zc2guY29tLHNzaC1kc3MtY2VydC12MDBAb3BlbnNzaC5jb20sCi0gICAgICAgICAgICAgICAgZWNkc2Etc2hhMi1uaXN0cDI1NixlY2RzYS1zaGEyLW5pc3RwMzg0LGVjZHNhLXNoYTItbmlzdHA1MjEsCi0gICAgICAgICAgICAgICAgc3NoLXJzYSxzc2gtZHNzCi0KLSAgICAgICAgICAgICBJZiBob3N0a2V5cyBhcmUga25vd24gZm9yIHRoZSBkZXN0aW5hdGlvbiBob3N0IHRoZW4gdGhpcyBkZWZhdWx0Ci0gICAgICAgICAgICAgaXMgbW9kaWZpZWQgdG8gcHJlZmVyIHRoZWlyIGFsZ29yaXRobXMuCi0KLSAgICAgSG9zdEtleUFsaWFzCi0gICAgICAgICAgICAgU3BlY2lmaWVzIGFuIGFsaWFzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgcmVhbCBob3N0Ci0gICAgICAgICAgICAgbmFtZSB3aGVuIGxvb2tpbmcgdXAgb3Igc2F2aW5nIHRoZSBob3N0IGtleSBpbiB0aGUgaG9zdCBrZXkKLSAgICAgICAgICAgICBkYXRhYmFzZSBmaWxlcy4gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgdHVubmVsaW5nIFNTSAotICAgICAgICAgICAgIGNvbm5lY3Rpb25zIG9yIGZvciBtdWx0aXBsZSBzZXJ2ZXJzIHJ1bm5pbmcgb24gYSBzaW5nbGUgaG9zdC4KLQotICAgICBIb3N0TmFtZQotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVhbCBob3N0IG5hbWUgdG8gbG9nIGludG8uICBUaGlzIGNhbiBiZSB1c2VkIHRvCi0gICAgICAgICAgICAgc3BlY2lmeSBuaWNrbmFtZXMgb3IgYWJicmV2aWF0aW9ucyBmb3IgaG9zdHMuICBJZiB0aGUgaG9zdG5hbWUKLSAgICAgICAgICAgICBjb250YWlucyB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGAlaCcsIHRoZW4gdGhpcyB3aWxsIGJlIHJlcGxhY2VkCi0gICAgICAgICAgICAgd2l0aCB0aGUgaG9zdCBuYW1lIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lICh0aGlzIGlzIHVzZWZ1bAotICAgICAgICAgICAgIGZvciBtYW5pcHVsYXRpbmcgdW5xdWFsaWZpZWQgbmFtZXMpLiAgVGhlIGRlZmF1bHQgaXMgdGhlIG5hbWUKLSAgICAgICAgICAgICBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgTnVtZXJpYyBJUCBhZGRyZXNzZXMgYXJlIGFsc28KLSAgICAgICAgICAgICBwZXJtaXR0ZWQgKGJvdGggb24gdGhlIGNvbW1hbmQgbGluZSBhbmQgaW4gSG9zdE5hbWUKLSAgICAgICAgICAgICBzcGVjaWZpY2F0aW9ucykuCi0KLSAgICAgSWRlbnRpdGllc09ubHkKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBzc2goMSkgc2hvdWxkIG9ubHkgdXNlIHRoZSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eQotICAgICAgICAgICAgIGZpbGVzIGNvbmZpZ3VyZWQgaW4gdGhlIHNzaF9jb25maWcgZmlsZXMsIGV2ZW4gaWYgc3NoLWFnZW50KDEpCi0gICAgICAgICAgICAgb2ZmZXJzIG1vcmUgaWRlbnRpdGllcy4gIFRoZSBhcmd1bWVudCB0byB0aGlzIGtleXdvcmQgbXVzdCBiZQotICAgICAgICAgICAgIGBgeWVzJycgb3IgYGBubycnLiAgVGhpcyBvcHRpb24gaXMgaW50ZW5kZWQgZm9yIHNpdHVhdGlvbnMgd2hlcmUKLSAgICAgICAgICAgICBzc2gtYWdlbnQgb2ZmZXJzIG1hbnkgZGlmZmVyZW50IGlkZW50aXRpZXMuICBUaGUgZGVmYXVsdCBpcwotICAgICAgICAgICAgIGBgbm8nJy4KLQotICAgICBJZGVudGl0eUZpbGUKLSAgICAgICAgICAgICBTcGVjaWZpZXMgYSBmaWxlIGZyb20gd2hpY2ggdGhlIHVzZXIncyBEU0EsIEVDRFNBIG9yIERTQQotICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IGlzIHJlYWQuICBUaGUgZGVmYXVsdCBpcyB+Ly5zc2gvaWRlbnRpdHkKLSAgICAgICAgICAgICBmb3IgcHJvdG9jb2wgdmVyc2lvbiAxLCBhbmQgfi8uc3NoL2lkX2RzYSwgfi8uc3NoL2lkX2VjZHNhIGFuZAotICAgICAgICAgICAgIH4vLnNzaC9pZF9yc2EgZm9yIHByb3RvY29sIHZlcnNpb24gMi4gIEFkZGl0aW9uYWxseSwgYW55Ci0gICAgICAgICAgICAgaWRlbnRpdGllcyByZXByZXNlbnRlZCBieSB0aGUgYXV0aGVudGljYXRpb24gYWdlbnQgd2lsbCBiZSB1c2VkCi0gICAgICAgICAgICAgZm9yIGF1dGhlbnRpY2F0aW9uLiAgc3NoKDEpIHdpbGwgdHJ5IHRvIGxvYWQgY2VydGlmaWNhdGUKLSAgICAgICAgICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlbmFtZSBvYnRhaW5lZCBieSBhcHBlbmRpbmcgLWNlcnQucHViIHRvCi0gICAgICAgICAgICAgdGhlIHBhdGggb2YgYSBzcGVjaWZpZWQgSWRlbnRpdHlGaWxlLgotCi0gICAgICAgICAgICAgVGhlIGZpbGUgbmFtZSBtYXkgdXNlIHRoZSB0aWxkZSBzeW50YXggdG8gcmVmZXIgdG8gYSB1c2VyJ3MgaG9tZQotICAgICAgICAgICAgIGRpcmVjdG9yeSBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyBlc2NhcGUgY2hhcmFjdGVyczogYCVkJyAobG9jYWwKLSAgICAgICAgICAgICB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkpLCBgJXUnIChsb2NhbCB1c2VyIG5hbWUpLCBgJWwnIChsb2NhbCBob3N0Ci0gICAgICAgICAgICAgbmFtZSksIGAlaCcgKHJlbW90ZSBob3N0IG5hbWUpIG9yIGAlcicgKHJlbW90ZSB1c2VyIG5hbWUpLgotCi0gICAgICAgICAgICAgSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBpZGVudGl0eSBmaWxlcyBzcGVjaWZpZWQgaW4KLSAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGVzOyBhbGwgdGhlc2UgaWRlbnRpdGllcyB3aWxsIGJlIHRyaWVkIGluCi0gICAgICAgICAgICAgc2VxdWVuY2UuICBNdWx0aXBsZSBJZGVudGl0eUZpbGUgZGlyZWN0aXZlcyB3aWxsIGFkZCB0byB0aGUgbGlzdAotICAgICAgICAgICAgIG9mIGlkZW50aXRpZXMgdHJpZWQgKHRoaXMgYmVoYXZpb3VyIGRpZmZlcnMgZnJvbSB0aGF0IG9mIG90aGVyCi0gICAgICAgICAgICAgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzKS4KLQotICAgICBJUFFvUyAgIFNwZWNpZmllcyB0aGUgSVB2NCB0eXBlLW9mLXNlcnZpY2Ugb3IgRFNDUCBjbGFzcyBmb3IgY29ubmVjdGlvbnMuCi0gICAgICAgICAgICAgQWNjZXB0ZWQgdmFsdWVzIGFyZSBgYGFmMTEnJywgYGBhZjEyJycsIGBgYWYxMycnLCBgYGFmMTQnJywKLSAgICAgICAgICAgICBgYGFmMjInJywgYGBhZjIzJycsIGBgYWYzMScnLCBgYGFmMzInJywgYGBhZjMzJycsIGBgYWY0MScnLAotICAgICAgICAgICAgIGBgYWY0MicnLCBgYGFmNDMnJywgYGBjczAnJywgYGBjczEnJywgYGBjczInJywgYGBjczMnJywgYGBjczQnJywKLSAgICAgICAgICAgICBgYGNzNScnLCBgYGNzNicnLCBgYGNzNycnLCBgYGVmJycsIGBgbG93ZGVsYXknJywgYGB0aHJvdWdocHV0JycsCi0gICAgICAgICAgICAgYGByZWxpYWJpbGl0eScnLCBvciBhIG51bWVyaWMgdmFsdWUuICBUaGlzIG9wdGlvbiBtYXkgdGFrZSBvbmUgb3IKLSAgICAgICAgICAgICB0d28gYXJndW1lbnRzLCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIElmIG9uZSBhcmd1bWVudCBpcwotICAgICAgICAgICAgIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBhcyB0aGUgcGFja2V0IGNsYXNzIHVuY29uZGl0aW9uYWxseS4gIElmCi0gICAgICAgICAgICAgdHdvIHZhbHVlcyBhcmUgc3BlY2lmaWVkLCB0aGUgZmlyc3QgaXMgYXV0b21hdGljYWxseSBzZWxlY3RlZCBmb3IKLSAgICAgICAgICAgICBpbnRlcmFjdGl2ZSBzZXNzaW9ucyBhbmQgdGhlIHNlY29uZCBmb3Igbm9uLWludGVyYWN0aXZlIHNlc3Npb25zLgotICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGBgbG93ZGVsYXknJyBmb3IgaW50ZXJhY3RpdmUgc2Vzc2lvbnMgYW5kCi0gICAgICAgICAgICAgYGB0aHJvdWdocHV0JycgZm9yIG5vbi1pbnRlcmFjdGl2ZSBzZXNzaW9ucy4KLQotICAgICBLYmRJbnRlcmFjdGl2ZUF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGtleWJvYXJkLWludGVyYWN0aXZlIGF1dGhlbnRpY2F0aW9uLgotICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byB0aGlzIGtleXdvcmQgbXVzdCBiZSBgYHllcycnIG9yIGBgbm8nJy4gIFRoZQotICAgICAgICAgICAgIGRlZmF1bHQgaXMgYGB5ZXMnJy4KLQotICAgICBLYmRJbnRlcmFjdGl2ZURldmljZXMKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGxpc3Qgb2YgbWV0aG9kcyB0byB1c2UgaW4ga2V5Ym9hcmQtaW50ZXJhY3RpdmUKLSAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi4gIE11bHRpcGxlIG1ldGhvZCBuYW1lcyBtdXN0IGJlIGNvbW1hLXNlcGFyYXRlZC4KLSAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byB1c2UgdGhlIHNlcnZlciBzcGVjaWZpZWQgbGlzdC4gIFRoZSBtZXRob2RzCi0gICAgICAgICAgICAgYXZhaWxhYmxlIHZhcnkgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIHNlcnZlciBzdXBwb3J0cy4gIEZvciBhbgotICAgICAgICAgICAgIE9wZW5TU0ggc2VydmVyLCBpdCBtYXkgYmUgemVybyBvciBtb3JlIG9mOiBgYGJzZGF1dGgnJywgYGBwYW0nJywKLSAgICAgICAgICAgICBhbmQgYGBza2V5JycuCi0KLSAgICAgS2V4QWxnb3JpdGhtcwotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgYXZhaWxhYmxlIEtFWCAoS2V5IEV4Y2hhbmdlKSBhbGdvcml0aG1zLiAgTXVsdGlwbGUKLSAgICAgICAgICAgICBhbGdvcml0aG1zIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkLiAgVGhlIGRlZmF1bHQgaXM6Ci0KLSAgICAgICAgICAgICAgICAgICBlY2RoLXNoYTItbmlzdHAyNTYsZWNkaC1zaGEyLW5pc3RwMzg0LGVjZGgtc2hhMi1uaXN0cDUyMSwKLSAgICAgICAgICAgICAgICAgICBkaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGEyNTYsCi0gICAgICAgICAgICAgICAgICAgZGlmZmllLWhlbGxtYW4tZ3JvdXAtZXhjaGFuZ2Utc2hhMSwKLSAgICAgICAgICAgICAgICAgICBkaWZmaWUtaGVsbG1hbi1ncm91cDE0LXNoYTEsCi0gICAgICAgICAgICAgICAgICAgZGlmZmllLWhlbGxtYW4tZ3JvdXAxLXNoYTEKLQotICAgICBMb2NhbENvbW1hbmQKLSAgICAgICAgICAgICBTcGVjaWZpZXMgYSBjb21tYW5kIHRvIGV4ZWN1dGUgb24gdGhlIGxvY2FsIG1hY2hpbmUgYWZ0ZXIKLSAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgY29ubmVjdGluZyB0byB0aGUgc2VydmVyLiAgVGhlIGNvbW1hbmQgc3RyaW5nCi0gICAgICAgICAgICAgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLCBhbmQgaXMgZXhlY3V0ZWQgd2l0aCB0aGUgdXNlcidzCi0gICAgICAgICAgICAgc2hlbGwuICBUaGUgZm9sbG93aW5nIGVzY2FwZSBjaGFyYWN0ZXIgc3Vic3RpdHV0aW9ucyB3aWxsIGJlCi0gICAgICAgICAgICAgcGVyZm9ybWVkOiBgJWQnIChsb2NhbCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkpLCBgJWgnIChyZW1vdGUgaG9zdAotICAgICAgICAgICAgIG5hbWUpLCBgJWwnIChsb2NhbCBob3N0IG5hbWUpLCBgJW4nIChob3N0IG5hbWUgYXMgcHJvdmlkZWQgb24gdGhlCi0gICAgICAgICAgICAgY29tbWFuZCBsaW5lKSwgYCVwJyAocmVtb3RlIHBvcnQpLCBgJXInIChyZW1vdGUgdXNlciBuYW1lKSBvcgotICAgICAgICAgICAgIGAldScgKGxvY2FsIHVzZXIgbmFtZSkuCi0KLSAgICAgICAgICAgICBUaGUgY29tbWFuZCBpcyBydW4gc3luY2hyb25vdXNseSBhbmQgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlCi0gICAgICAgICAgICAgc2Vzc2lvbiBvZiB0aGUgc3NoKDEpIHRoYXQgc3Bhd25lZCBpdC4gIEl0IHNob3VsZCBub3QgYmUgdXNlZCBmb3IKLSAgICAgICAgICAgICBpbnRlcmFjdGl2ZSBjb21tYW5kcy4KLQotICAgICAgICAgICAgIFRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQgdW5sZXNzIFBlcm1pdExvY2FsQ29tbWFuZCBoYXMgYmVlbgotICAgICAgICAgICAgIGVuYWJsZWQuCi0KLSAgICAgTG9jYWxGb3J3YXJkCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgYSBUQ1AgcG9ydCBvbiB0aGUgbG9jYWwgbWFjaGluZSBiZSBmb3J3YXJkZWQgb3ZlcgotICAgICAgICAgICAgIHRoZSBzZWN1cmUgY2hhbm5lbCB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIHBvcnQgZnJvbSB0aGUgcmVtb3RlCi0gICAgICAgICAgICAgbWFjaGluZS4gIFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIFtiaW5kX2FkZHJlc3M6XXBvcnQgYW5kIHRoZQotICAgICAgICAgICAgIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGhvc3Q6aG9zdHBvcnQuICBJUHY2IGFkZHJlc3NlcyBjYW4gYmUKLSAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgZW5jbG9zaW5nIGFkZHJlc3NlcyBpbiBzcXVhcmUgYnJhY2tldHMuICBNdWx0aXBsZQotICAgICAgICAgICAgIGZvcndhcmRpbmdzIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBhZGRpdGlvbmFsIGZvcndhcmRpbmdzIGNhbiBiZQotICAgICAgICAgICAgIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICBPbmx5IHRoZSBzdXBlcnVzZXIgY2FuIGZvcndhcmQKLSAgICAgICAgICAgICBwcml2aWxlZ2VkIHBvcnRzLiAgQnkgZGVmYXVsdCwgdGhlIGxvY2FsIHBvcnQgaXMgYm91bmQgaW4KLSAgICAgICAgICAgICBhY2NvcmRhbmNlIHdpdGggdGhlIEdhdGV3YXlQb3J0cyBzZXR0aW5nLiAgSG93ZXZlciwgYW4gZXhwbGljaXQKLSAgICAgICAgICAgICBiaW5kX2FkZHJlc3MgbWF5IGJlIHVzZWQgdG8gYmluZCB0aGUgY29ubmVjdGlvbiB0byBhIHNwZWNpZmljCi0gICAgICAgICAgICAgYWRkcmVzcy4gIFRoZSBiaW5kX2FkZHJlc3Mgb2YgYGBsb2NhbGhvc3QnJyBpbmRpY2F0ZXMgdGhhdCB0aGUKLSAgICAgICAgICAgICBsaXN0ZW5pbmcgcG9ydCBiZSBib3VuZCBmb3IgbG9jYWwgdXNlIG9ubHksIHdoaWxlIGFuIGVtcHR5Ci0gICAgICAgICAgICAgYWRkcmVzcyBvciBgKicgaW5kaWNhdGVzIHRoYXQgdGhlIHBvcnQgc2hvdWxkIGJlIGF2YWlsYWJsZSBmcm9tCi0gICAgICAgICAgICAgYWxsIGludGVyZmFjZXMuCi0KLSAgICAgTG9nTGV2ZWwKLSAgICAgICAgICAgICBHaXZlcyB0aGUgdmVyYm9zaXR5IGxldmVsIHRoYXQgaXMgdXNlZCB3aGVuIGxvZ2dpbmcgbWVzc2FnZXMgZnJvbQotICAgICAgICAgICAgIHNzaCgxKS4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBRVUlFVCwgRkFUQUwsIEVSUk9SLCBJTkZPLAotICAgICAgICAgICAgIFZFUkJPU0UsIERFQlVHLCBERUJVRzEsIERFQlVHMiwgYW5kIERFQlVHMy4gIFRoZSBkZWZhdWx0IGlzIElORk8uCi0gICAgICAgICAgICAgREVCVUcgYW5kIERFQlVHMSBhcmUgZXF1aXZhbGVudC4gIERFQlVHMiBhbmQgREVCVUczIGVhY2ggc3BlY2lmeQotICAgICAgICAgICAgIGhpZ2hlciBsZXZlbHMgb2YgdmVyYm9zZSBvdXRwdXQuCi0KLSAgICAgTUFDcyAgICBTcGVjaWZpZXMgdGhlIE1BQyAobWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlKSBhbGdvcml0aG1zIGluCi0gICAgICAgICAgICAgb3JkZXIgb2YgcHJlZmVyZW5jZS4gIFRoZSBNQUMgYWxnb3JpdGhtIGlzIHVzZWQgaW4gcHJvdG9jb2wKLSAgICAgICAgICAgICB2ZXJzaW9uIDIgZm9yIGRhdGEgaW50ZWdyaXR5IHByb3RlY3Rpb24uICBNdWx0aXBsZSBhbGdvcml0aG1zCi0gICAgICAgICAgICAgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQuICBUaGUgZGVmYXVsdCBpczoKLQotICAgICAgICAgICAgICAgICAgIGhtYWMtbWQ1LGhtYWMtc2hhMSx1bWFjLTY0QG9wZW5zc2guY29tLAotICAgICAgICAgICAgICAgICAgIGhtYWMtcmlwZW1kMTYwLGhtYWMtc2hhMS05NixobWFjLW1kNS05NiwKLSAgICAgICAgICAgICAgICAgICBobWFjLXNoYTItMjU2LGhtYWMtc2hhMi0yNTYtOTYsaG1hYy1zaGEyLTUxMiwKLSAgICAgICAgICAgICAgICAgICBobWFjLXNoYTItNTEyLTk2Ci0KLSAgICAgTm9Ib3N0QXV0aGVudGljYXRpb25Gb3JMb2NhbGhvc3QKLSAgICAgICAgICAgICBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCBpZiB0aGUgaG9tZSBkaXJlY3RvcnkgaXMgc2hhcmVkIGFjcm9zcwotICAgICAgICAgICAgIG1hY2hpbmVzLiAgSW4gdGhpcyBjYXNlIGxvY2FsaG9zdCB3aWxsIHJlZmVyIHRvIGEgZGlmZmVyZW50Ci0gICAgICAgICAgICAgbWFjaGluZSBvbiBlYWNoIG9mIHRoZSBtYWNoaW5lcyBhbmQgdGhlIHVzZXIgd2lsbCBnZXQgbWFueQotICAgICAgICAgICAgIHdhcm5pbmdzIGFib3V0IGNoYW5nZWQgaG9zdCBrZXlzLiAgSG93ZXZlciwgdGhpcyBvcHRpb24gZGlzYWJsZXMKLSAgICAgICAgICAgICBob3N0IGF1dGhlbnRpY2F0aW9uIGZvciBsb2NhbGhvc3QuICBUaGUgYXJndW1lbnQgdG8gdGhpcyBrZXl3b3JkCi0gICAgICAgICAgICAgbXVzdCBiZSBgYHllcycnIG9yIGBgbm8nJy4gIFRoZSBkZWZhdWx0IGlzIHRvIGNoZWNrIHRoZSBob3N0IGtleQotICAgICAgICAgICAgIGZvciBsb2NhbGhvc3QuCi0KLSAgICAgTnVtYmVyT2ZQYXNzd29yZFByb21wdHMKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwYXNzd29yZCBwcm9tcHRzIGJlZm9yZSBnaXZpbmcgdXAuICBUaGUKLSAgICAgICAgICAgICBhcmd1bWVudCB0byB0aGlzIGtleXdvcmQgbXVzdCBiZSBhbiBpbnRlZ2VyLiAgVGhlIGRlZmF1bHQgaXMgMy4KLQotICAgICBQYXNzd29yZEF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLiAgVGhlIGFyZ3VtZW50Ci0gICAgICAgICAgICAgdG8gdGhpcyBrZXl3b3JkIG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUgZGVmYXVsdCBpcwotICAgICAgICAgICAgIGBgeWVzJycuCi0KLSAgICAgUGVybWl0TG9jYWxDb21tYW5kCi0gICAgICAgICAgICAgQWxsb3cgbG9jYWwgY29tbWFuZCBleGVjdXRpb24gdmlhIHRoZSBMb2NhbENvbW1hbmQgb3B0aW9uIG9yCi0gICAgICAgICAgICAgdXNpbmcgdGhlICFjb21tYW5kIGVzY2FwZSBzZXF1ZW5jZSBpbiBzc2goMSkuICBUaGUgYXJndW1lbnQgbXVzdAotICAgICAgICAgICAgIGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQgaXMgYGBubycnLgotCi0gICAgIFBLQ1MxMVByb3ZpZGVyCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoaWNoIFBLQ1MjMTEgcHJvdmlkZXIgdG8gdXNlLiAgVGhlIGFyZ3VtZW50IHRvIHRoaXMKLSAgICAgICAgICAgICBrZXl3b3JkIGlzIHRoZSBQS0NTIzExIHNoYXJlZCBsaWJyYXJ5IHNzaCgxKSBzaG91bGQgdXNlIHRvCi0gICAgICAgICAgICAgY29tbXVuaWNhdGUgd2l0aCBhIFBLQ1MjMTEgdG9rZW4gcHJvdmlkaW5nIHRoZSB1c2VyJ3MgcHJpdmF0ZSBSU0EKLSAgICAgICAgICAgICBrZXkuCi0KLSAgICAgUG9ydCAgICBTcGVjaWZpZXMgdGhlIHBvcnQgbnVtYmVyIHRvIGNvbm5lY3Qgb24gdGhlIHJlbW90ZSBob3N0LiAgVGhlCi0gICAgICAgICAgICAgZGVmYXVsdCBpcyAyMi4KLQotICAgICBQcmVmZXJyZWRBdXRoZW50aWNhdGlvbnMKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjbGllbnQgc2hvdWxkIHRyeSBwcm90b2NvbCAyCi0gICAgICAgICAgICAgYXV0aGVudGljYXRpb24gbWV0aG9kcy4gIFRoaXMgYWxsb3dzIGEgY2xpZW50IHRvIHByZWZlciBvbmUKLSAgICAgICAgICAgICBtZXRob2QgKGUuZy4ga2V5Ym9hcmQtaW50ZXJhY3RpdmUpIG92ZXIgYW5vdGhlciBtZXRob2QgKGUuZy4KLSAgICAgICAgICAgICBwYXNzd29yZCkuICBUaGUgZGVmYXVsdCBpczoKLQotICAgICAgICAgICAgICAgICAgIGdzc2FwaS13aXRoLW1pYyxob3N0YmFzZWQscHVibGlja2V5LAotICAgICAgICAgICAgICAgICAgIGtleWJvYXJkLWludGVyYWN0aXZlLHBhc3N3b3JkCi0KLSAgICAgUHJvdG9jb2wKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHByb3RvY29sIHZlcnNpb25zIHNzaCgxKSBzaG91bGQgc3VwcG9ydCBpbiBvcmRlciBvZgotICAgICAgICAgICAgIHByZWZlcmVuY2UuICBUaGUgcG9zc2libGUgdmFsdWVzIGFyZSBgMScgYW5kIGAyJy4gIE11bHRpcGxlCi0gICAgICAgICAgICAgdmVyc2lvbnMgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQuICBXaGVuIHRoaXMgb3B0aW9uIGlzIHNldCB0bwotICAgICAgICAgICAgIGBgMiwxJycgc3NoIHdpbGwgdHJ5IHZlcnNpb24gMiBhbmQgZmFsbCBiYWNrIHRvIHZlcnNpb24gMSBpZgotICAgICAgICAgICAgIHZlcnNpb24gMiBpcyBub3QgYXZhaWxhYmxlLiAgVGhlIGRlZmF1bHQgaXMgYDInLgotCi0gICAgIFByb3h5Q29tbWFuZAotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgY29tbWFuZCB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyLiAgVGhlCi0gICAgICAgICAgICAgY29tbWFuZCBzdHJpbmcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLCBhbmQgaXMgZXhlY3V0ZWQKLSAgICAgICAgICAgICB3aXRoIHRoZSB1c2VyJ3Mgc2hlbGwuICBJbiB0aGUgY29tbWFuZCBzdHJpbmcsIGFueSBvY2N1cnJlbmNlIG9mCi0gICAgICAgICAgICAgYCVoJyB3aWxsIGJlIHN1YnN0aXR1dGVkIGJ5IHRoZSBob3N0IG5hbWUgdG8gY29ubmVjdCwgYCVwJyBieSB0aGUKLSAgICAgICAgICAgICBwb3J0LCBhbmQgYCVyJyBieSB0aGUgcmVtb3RlIHVzZXIgbmFtZS4gIFRoZSBjb21tYW5kIGNhbiBiZQotICAgICAgICAgICAgIGJhc2ljYWxseSBhbnl0aGluZywgYW5kIHNob3VsZCByZWFkIGZyb20gaXRzIHN0YW5kYXJkIGlucHV0IGFuZAotICAgICAgICAgICAgIHdyaXRlIHRvIGl0cyBzdGFuZGFyZCBvdXRwdXQuICBJdCBzaG91bGQgZXZlbnR1YWxseSBjb25uZWN0IGFuCi0gICAgICAgICAgICAgc3NoZCg4KSBzZXJ2ZXIgcnVubmluZyBvbiBzb21lIG1hY2hpbmUsIG9yIGV4ZWN1dGUgc3NoZCAtaQotICAgICAgICAgICAgIHNvbWV3aGVyZS4gIEhvc3Qga2V5IG1hbmFnZW1lbnQgd2lsbCBiZSBkb25lIHVzaW5nIHRoZSBIb3N0TmFtZQotICAgICAgICAgICAgIG9mIHRoZSBob3N0IGJlaW5nIGNvbm5lY3RlZCAoZGVmYXVsdGluZyB0byB0aGUgbmFtZSB0eXBlZCBieSB0aGUKLSAgICAgICAgICAgICB1c2VyKS4gIFNldHRpbmcgdGhlIGNvbW1hbmQgdG8gYGBub25lJycgZGlzYWJsZXMgdGhpcyBvcHRpb24KLSAgICAgICAgICAgICBlbnRpcmVseS4gIE5vdGUgdGhhdCBDaGVja0hvc3RJUCBpcyBub3QgYXZhaWxhYmxlIGZvciBjb25uZWN0cwotICAgICAgICAgICAgIHdpdGggYSBwcm94eSBjb21tYW5kLgotCi0gICAgICAgICAgICAgVGhpcyBkaXJlY3RpdmUgaXMgdXNlZnVsIGluIGNvbmp1bmN0aW9uIHdpdGggbmMoMSkgYW5kIGl0cyBwcm94eQotICAgICAgICAgICAgIHN1cHBvcnQuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmUgd291bGQgY29ubmVjdCB2aWEKLSAgICAgICAgICAgICBhbiBIVFRQIHByb3h5IGF0IDE5Mi4wLjIuMDoKLQotICAgICAgICAgICAgICAgIFByb3h5Q29tbWFuZCAvdXNyL2Jpbi9uYyAtWCBjb25uZWN0IC14IDE5Mi4wLjIuMDo4MDgwICVoICVwCi0KLSAgICAgUHVia2V5QXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0byB0cnkgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbi4gIFRoZSBhcmd1bWVudAotICAgICAgICAgICAgIHRvIHRoaXMga2V5d29yZCBtdXN0IGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQgaXMKLSAgICAgICAgICAgICBgYHllcycnLiAgVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KLQotICAgICBSZWtleUxpbWl0Ci0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIHRoYXQgbWF5IGJlIHRyYW5zbWl0dGVkCi0gICAgICAgICAgICAgYmVmb3JlIHRoZSBzZXNzaW9uIGtleSBpcyByZW5lZ290aWF0ZWQuICBUaGUgYXJndW1lbnQgaXMgdGhlCi0gICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzLCB3aXRoIGFuIG9wdGlvbmFsIHN1ZmZpeCBvZiBgSycsIGBNJywgb3IgYEcnIHRvCi0gICAgICAgICAgICAgaW5kaWNhdGUgS2lsb2J5dGVzLCBNZWdhYnl0ZXMsIG9yIEdpZ2FieXRlcywgcmVzcGVjdGl2ZWx5LiAgVGhlCi0gICAgICAgICAgICAgZGVmYXVsdCBpcyBiZXR3ZWVuIGAxRycgYW5kIGA0RycsIGRlcGVuZGluZyBvbiB0aGUgY2lwaGVyLiAgVGhpcwotICAgICAgICAgICAgIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgotCi0gICAgIFJlbW90ZUZvcndhcmQKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBhIFRDUCBwb3J0IG9uIHRoZSByZW1vdGUgbWFjaGluZSBiZSBmb3J3YXJkZWQgb3ZlcgotICAgICAgICAgICAgIHRoZSBzZWN1cmUgY2hhbm5lbCB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIHBvcnQgZnJvbSB0aGUgbG9jYWwKLSAgICAgICAgICAgICBtYWNoaW5lLiAgVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgW2JpbmRfYWRkcmVzczpdcG9ydCBhbmQgdGhlCi0gICAgICAgICAgICAgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgaG9zdDpob3N0cG9ydC4gIElQdjYgYWRkcmVzc2VzIGNhbiBiZQotICAgICAgICAgICAgIHNwZWNpZmllZCBieSBlbmNsb3NpbmcgYWRkcmVzc2VzIGluIHNxdWFyZSBicmFja2V0cy4gIE11bHRpcGxlCi0gICAgICAgICAgICAgZm9yd2FyZGluZ3MgbWF5IGJlIHNwZWNpZmllZCwgYW5kIGFkZGl0aW9uYWwgZm9yd2FyZGluZ3MgY2FuIGJlCi0gICAgICAgICAgICAgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gIFByaXZpbGVnZWQgcG9ydHMgY2FuIGJlIGZvcndhcmRlZAotICAgICAgICAgICAgIG9ubHkgd2hlbiBsb2dnaW5nIGluIGFzIHJvb3Qgb24gdGhlIHJlbW90ZSBtYWNoaW5lLgotCi0gICAgICAgICAgICAgSWYgdGhlIHBvcnQgYXJndW1lbnQgaXMgYDAnLCB0aGUgbGlzdGVuIHBvcnQgd2lsbCBiZSBkeW5hbWljYWxseQotICAgICAgICAgICAgIGFsbG9jYXRlZCBvbiB0aGUgc2VydmVyIGFuZCByZXBvcnRlZCB0byB0aGUgY2xpZW50IGF0IHJ1biB0aW1lLgotCi0gICAgICAgICAgICAgSWYgdGhlIGJpbmRfYWRkcmVzcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyB0byBvbmx5IGJpbmQKLSAgICAgICAgICAgICB0byBsb29wYmFjayBhZGRyZXNzZXMuICBJZiB0aGUgYmluZF9hZGRyZXNzIGlzIGAqJyBvciBhbiBlbXB0eQotICAgICAgICAgICAgIHN0cmluZywgdGhlbiB0aGUgZm9yd2FyZGluZyBpcyByZXF1ZXN0ZWQgdG8gbGlzdGVuIG9uIGFsbAotICAgICAgICAgICAgIGludGVyZmFjZXMuICBTcGVjaWZ5aW5nIGEgcmVtb3RlIGJpbmRfYWRkcmVzcyB3aWxsIG9ubHkgc3VjY2VlZAotICAgICAgICAgICAgIGlmIHRoZSBzZXJ2ZXIncyBHYXRld2F5UG9ydHMgb3B0aW9uIGlzIGVuYWJsZWQgKHNlZQotICAgICAgICAgICAgIHNzaGRfY29uZmlnKDUpKS4KLQotICAgICBSZXF1ZXN0VFRZCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmVxdWVzdCBhIHBzZXVkby10dHkgZm9yIHRoZSBzZXNzaW9uLiAgVGhlCi0gICAgICAgICAgICAgYXJndW1lbnQgbWF5IGJlIG9uZSBvZjogYGBubycnIChuZXZlciByZXF1ZXN0IGEgVFRZKSwgYGB5ZXMnJwotICAgICAgICAgICAgIChhbHdheXMgcmVxdWVzdCBhIFRUWSB3aGVuIHN0YW5kYXJkIGlucHV0IGlzIGEgVFRZKSwgYGBmb3JjZScnCi0gICAgICAgICAgICAgKGFsd2F5cyByZXF1ZXN0IGEgVFRZKSBvciBgYGF1dG8nJyAocmVxdWVzdCBhIFRUWSB3aGVuIG9wZW5pbmcgYQotICAgICAgICAgICAgIGxvZ2luIHNlc3Npb24pLiAgVGhpcyBvcHRpb24gbWlycm9ycyB0aGUgLXQgYW5kIC1UIGZsYWdzIGZvcgotICAgICAgICAgICAgIHNzaCgxKS4KLQotICAgICBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRvIHRyeSByaG9zdHMgYmFzZWQgYXV0aGVudGljYXRpb24gd2l0aCBSU0EKLSAgICAgICAgICAgICBob3N0IGF1dGhlbnRpY2F0aW9uLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuCi0gICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgYGBubycnLiAgVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDEKLSAgICAgICAgICAgICBvbmx5IGFuZCByZXF1aXJlcyBzc2goMSkgdG8gYmUgc2V0dWlkIHJvb3QuCi0KLSAgICAgUlNBQXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0byB0cnkgUlNBIGF1dGhlbnRpY2F0aW9uLiAgVGhlIGFyZ3VtZW50IHRvCi0gICAgICAgICAgICAgdGhpcyBrZXl3b3JkIG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuICBSU0EgYXV0aGVudGljYXRpb24gd2lsbAotICAgICAgICAgICAgIG9ubHkgYmUgYXR0ZW1wdGVkIGlmIHRoZSBpZGVudGl0eSBmaWxlIGV4aXN0cywgb3IgYW4KLSAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbiBhZ2VudCBpcyBydW5uaW5nLiAgVGhlIGRlZmF1bHQgaXMgYGB5ZXMnJy4gIE5vdGUKLSAgICAgICAgICAgICB0aGF0IHRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAxIG9ubHkuCi0KLSAgICAgU2VuZEVudgotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGF0IHZhcmlhYmxlcyBmcm9tIHRoZSBsb2NhbCBlbnZpcm9uKDcpIHNob3VsZCBiZSBzZW50Ci0gICAgICAgICAgICAgdG8gdGhlIHNlcnZlci4gIE5vdGUgdGhhdCBlbnZpcm9ubWVudCBwYXNzaW5nIGlzIG9ubHkgc3VwcG9ydGVkCi0gICAgICAgICAgICAgZm9yIHByb3RvY29sIDIuICBUaGUgc2VydmVyIG11c3QgYWxzbyBzdXBwb3J0IGl0LCBhbmQgdGhlIHNlcnZlcgotICAgICAgICAgICAgIG11c3QgYmUgY29uZmlndXJlZCB0byBhY2NlcHQgdGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgUmVmZXIKLSAgICAgICAgICAgICB0byBBY2NlcHRFbnYgaW4gc3NoZF9jb25maWcoNSkgZm9yIGhvdyB0byBjb25maWd1cmUgdGhlIHNlcnZlci4KLSAgICAgICAgICAgICBWYXJpYWJsZXMgYXJlIHNwZWNpZmllZCBieSBuYW1lLCB3aGljaCBtYXkgY29udGFpbiB3aWxkY2FyZAotICAgICAgICAgICAgIGNoYXJhY3RlcnMuICBNdWx0aXBsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWF5IGJlIHNlcGFyYXRlZCBieQotICAgICAgICAgICAgIHdoaXRlc3BhY2Ugb3Igc3ByZWFkIGFjcm9zcyBtdWx0aXBsZSBTZW5kRW52IGRpcmVjdGl2ZXMuICBUaGUKLSAgICAgICAgICAgICBkZWZhdWx0IGlzIG5vdCB0byBzZW5kIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0KLSAgICAgICAgICAgICBTZWUgUEFUVEVSTlMgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGF0dGVybnMuCi0KLSAgICAgU2VydmVyQWxpdmVDb3VudE1heAotICAgICAgICAgICAgIFNldHMgdGhlIG51bWJlciBvZiBzZXJ2ZXIgYWxpdmUgbWVzc2FnZXMgKHNlZSBiZWxvdykgd2hpY2ggbWF5IGJlCi0gICAgICAgICAgICAgc2VudCB3aXRob3V0IHNzaCgxKSByZWNlaXZpbmcgYW55IG1lc3NhZ2VzIGJhY2sgZnJvbSB0aGUgc2VydmVyLgotICAgICAgICAgICAgIElmIHRoaXMgdGhyZXNob2xkIGlzIHJlYWNoZWQgd2hpbGUgc2VydmVyIGFsaXZlIG1lc3NhZ2VzIGFyZQotICAgICAgICAgICAgIGJlaW5nIHNlbnQsIHNzaCB3aWxsIGRpc2Nvbm5lY3QgZnJvbSB0aGUgc2VydmVyLCB0ZXJtaW5hdGluZyB0aGUKLSAgICAgICAgICAgICBzZXNzaW9uLiAgSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgdXNlIG9mIHNlcnZlciBhbGl2ZQotICAgICAgICAgICAgIG1lc3NhZ2VzIGlzIHZlcnkgZGlmZmVyZW50IGZyb20gVENQS2VlcEFsaXZlIChiZWxvdykuICBUaGUgc2VydmVyCi0gICAgICAgICAgICAgYWxpdmUgbWVzc2FnZXMgYXJlIHNlbnQgdGhyb3VnaCB0aGUgZW5jcnlwdGVkIGNoYW5uZWwgYW5kCi0gICAgICAgICAgICAgdGhlcmVmb3JlIHdpbGwgbm90IGJlIHNwb29mYWJsZS4gIFRoZSBUQ1Aga2VlcGFsaXZlIG9wdGlvbgotICAgICAgICAgICAgIGVuYWJsZWQgYnkgVENQS2VlcEFsaXZlIGlzIHNwb29mYWJsZS4gIFRoZSBzZXJ2ZXIgYWxpdmUgbWVjaGFuaXNtCi0gICAgICAgICAgICAgaXMgdmFsdWFibGUgd2hlbiB0aGUgY2xpZW50IG9yIHNlcnZlciBkZXBlbmQgb24ga25vd2luZyB3aGVuIGEKLSAgICAgICAgICAgICBjb25uZWN0aW9uIGhhcyBiZWNvbWUgaW5hY3RpdmUuCi0KLSAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzLiAgSWYsIGZvciBleGFtcGxlLCBTZXJ2ZXJBbGl2ZUludGVydmFsCi0gICAgICAgICAgICAgKHNlZSBiZWxvdykgaXMgc2V0IHRvIDE1IGFuZCBTZXJ2ZXJBbGl2ZUNvdW50TWF4IGlzIGxlZnQgYXQgdGhlCi0gICAgICAgICAgICAgZGVmYXVsdCwgaWYgdGhlIHNlcnZlciBiZWNvbWVzIHVucmVzcG9uc2l2ZSwgc3NoIHdpbGwgZGlzY29ubmVjdAotICAgICAgICAgICAgIGFmdGVyIGFwcHJveGltYXRlbHkgNDUgc2Vjb25kcy4gIFRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wKLSAgICAgICAgICAgICB2ZXJzaW9uIDIgb25seS4KLQotICAgICBTZXJ2ZXJBbGl2ZUludGVydmFsCi0gICAgICAgICAgICAgU2V0cyBhIHRpbWVvdXQgaW50ZXJ2YWwgaW4gc2Vjb25kcyBhZnRlciB3aGljaCBpZiBubyBkYXRhIGhhcwotICAgICAgICAgICAgIGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLCBzc2goMSkgd2lsbCBzZW5kIGEgbWVzc2FnZSB0aHJvdWdoCi0gICAgICAgICAgICAgdGhlIGVuY3J5cHRlZCBjaGFubmVsIHRvIHJlcXVlc3QgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuICBUaGUKLSAgICAgICAgICAgICBkZWZhdWx0IGlzIDAsIGluZGljYXRpbmcgdGhhdCB0aGVzZSBtZXNzYWdlcyB3aWxsIG5vdCBiZSBzZW50IHRvCi0gICAgICAgICAgICAgdGhlIHNlcnZlci4gIFRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCi0KLSAgICAgU3RyaWN0SG9zdEtleUNoZWNraW5nCi0gICAgICAgICAgICAgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBgYHllcycnLCBzc2goMSkgd2lsbCBuZXZlciBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAgYWRkIGhvc3Qga2V5cyB0byB0aGUgfi8uc3NoL2tub3duX2hvc3RzIGZpbGUsIGFuZCByZWZ1c2VzIHRvCi0gICAgICAgICAgICAgY29ubmVjdCB0byBob3N0cyB3aG9zZSBob3N0IGtleSBoYXMgY2hhbmdlZC4gIFRoaXMgcHJvdmlkZXMKLSAgICAgICAgICAgICBtYXhpbXVtIHByb3RlY3Rpb24gYWdhaW5zdCB0cm9qYW4gaG9yc2UgYXR0YWNrcywgdGhvdWdoIGl0IGNhbiBiZQotICAgICAgICAgICAgIGFubm95aW5nIHdoZW4gdGhlIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cyBmaWxlIGlzIHBvb3JseQotICAgICAgICAgICAgIG1haW50YWluZWQgb3Igd2hlbiBjb25uZWN0aW9ucyB0byBuZXcgaG9zdHMgYXJlIGZyZXF1ZW50bHkgbWFkZS4KLSAgICAgICAgICAgICBUaGlzIG9wdGlvbiBmb3JjZXMgdGhlIHVzZXIgdG8gbWFudWFsbHkgYWRkIGFsbCBuZXcgaG9zdHMuICBJZgotICAgICAgICAgICAgIHRoaXMgZmxhZyBpcyBzZXQgdG8gYGBubycnLCBzc2ggd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCBuZXcgaG9zdAotICAgICAgICAgICAgIGtleXMgdG8gdGhlIHVzZXIga25vd24gaG9zdHMgZmlsZXMuICBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvCi0gICAgICAgICAgICAgYGBhc2snJywgbmV3IGhvc3Qga2V5cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSB1c2VyIGtub3duIGhvc3QgZmlsZXMKLSAgICAgICAgICAgICBvbmx5IGFmdGVyIHRoZSB1c2VyIGhhcyBjb25maXJtZWQgdGhhdCBpcyB3aGF0IHRoZXkgcmVhbGx5IHdhbnQKLSAgICAgICAgICAgICB0byBkbywgYW5kIHNzaCB3aWxsIHJlZnVzZSB0byBjb25uZWN0IHRvIGhvc3RzIHdob3NlIGhvc3Qga2V5IGhhcwotICAgICAgICAgICAgIGNoYW5nZWQuICBUaGUgaG9zdCBrZXlzIG9mIGtub3duIGhvc3RzIHdpbGwgYmUgdmVyaWZpZWQKLSAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGluIGFsbCBjYXNlcy4gIFRoZSBhcmd1bWVudCBtdXN0IGJlIGBgeWVzJycsCi0gICAgICAgICAgICAgYGBubycnLCBvciBgYGFzaycnLiAgVGhlIGRlZmF1bHQgaXMgYGBhc2snJy4KLQotICAgICBUQ1BLZWVwQWxpdmUKLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0aGUgc3lzdGVtIHNob3VsZCBzZW5kIFRDUCBrZWVwYWxpdmUgbWVzc2FnZXMKLSAgICAgICAgICAgICB0byB0aGUgb3RoZXIgc2lkZS4gIElmIHRoZXkgYXJlIHNlbnQsIGRlYXRoIG9mIHRoZSBjb25uZWN0aW9uIG9yCi0gICAgICAgICAgICAgY3Jhc2ggb2Ygb25lIG9mIHRoZSBtYWNoaW5lcyB3aWxsIGJlIHByb3Blcmx5IG5vdGljZWQuICBIb3dldmVyLAotICAgICAgICAgICAgIHRoaXMgbWVhbnMgdGhhdCBjb25uZWN0aW9ucyB3aWxsIGRpZSBpZiB0aGUgcm91dGUgaXMgZG93bgotICAgICAgICAgICAgIHRlbXBvcmFyaWx5LCBhbmQgc29tZSBwZW9wbGUgZmluZCBpdCBhbm5veWluZy4KLQotICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGBgeWVzJycgKHRvIHNlbmQgVENQIGtlZXBhbGl2ZSBtZXNzYWdlcyksIGFuZCB0aGUKLSAgICAgICAgICAgICBjbGllbnQgd2lsbCBub3RpY2UgaWYgdGhlIG5ldHdvcmsgZ29lcyBkb3duIG9yIHRoZSByZW1vdGUgaG9zdAotICAgICAgICAgICAgIGRpZXMuICBUaGlzIGlzIGltcG9ydGFudCBpbiBzY3JpcHRzLCBhbmQgbWFueSB1c2VycyB3YW50IGl0IHRvby4KLQotICAgICAgICAgICAgIFRvIGRpc2FibGUgVENQIGtlZXBhbGl2ZSBtZXNzYWdlcywgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8KLSAgICAgICAgICAgICBgYG5vJycuCi0KLSAgICAgVHVubmVsICBSZXF1ZXN0IHR1big0KSBkZXZpY2UgZm9yd2FyZGluZyBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZQotICAgICAgICAgICAgIHNlcnZlci4gIFRoZSBhcmd1bWVudCBtdXN0IGJlIGBgeWVzJycsIGBgcG9pbnQtdG8tcG9pbnQnJyAobGF5ZXIKLSAgICAgICAgICAgICAzKSwgYGBldGhlcm5ldCcnIChsYXllciAyKSwgb3IgYGBubycnLiAgU3BlY2lmeWluZyBgYHllcycnCi0gICAgICAgICAgICAgcmVxdWVzdHMgdGhlIGRlZmF1bHQgdHVubmVsIG1vZGUsIHdoaWNoIGlzIGBgcG9pbnQtdG8tcG9pbnQnJy4KLSAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuCi0KLSAgICAgVHVubmVsRGV2aWNlCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSB0dW4oNCkgZGV2aWNlcyB0byBvcGVuIG9uIHRoZSBjbGllbnQgKGxvY2FsX3R1bikKLSAgICAgICAgICAgICBhbmQgdGhlIHNlcnZlciAocmVtb3RlX3R1bikuCi0KLSAgICAgICAgICAgICBUaGUgYXJndW1lbnQgbXVzdCBiZSBsb2NhbF90dW5bOnJlbW90ZV90dW5dLiAgVGhlIGRldmljZXMgbWF5IGJlCi0gICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IG51bWVyaWNhbCBJRCBvciB0aGUga2V5d29yZCBgYGFueScnLCB3aGljaCB1c2VzIHRoZQotICAgICAgICAgICAgIG5leHQgYXZhaWxhYmxlIHR1bm5lbCBkZXZpY2UuICBJZiByZW1vdGVfdHVuIGlzIG5vdCBzcGVjaWZpZWQsIGl0Ci0gICAgICAgICAgICAgZGVmYXVsdHMgdG8gYGBhbnknJy4gIFRoZSBkZWZhdWx0IGlzIGBgYW55OmFueScnLgotCi0gICAgIFVzZVByaXZpbGVnZWRQb3J0Ci0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGEgcHJpdmlsZWdlZCBwb3J0IGZvciBvdXRnb2luZwotICAgICAgICAgICAgIGNvbm5lY3Rpb25zLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYGB5ZXMnJyBvciBgYG5vJycuICBUaGUKLSAgICAgICAgICAgICBkZWZhdWx0IGlzIGBgbm8nJy4gIElmIHNldCB0byBgYHllcycnLCBzc2goMSkgbXVzdCBiZSBzZXR1aWQKLSAgICAgICAgICAgICByb290LiAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIG11c3QgYmUgc2V0IHRvIGBgeWVzJycgZm9yCi0gICAgICAgICAgICAgUmhvc3RzUlNBQXV0aGVudGljYXRpb24gd2l0aCBvbGRlciBzZXJ2ZXJzLgotCi0gICAgIFVzZXIgICAgU3BlY2lmaWVzIHRoZSB1c2VyIHRvIGxvZyBpbiBhcy4gIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGEKLSAgICAgICAgICAgICBkaWZmZXJlbnQgdXNlciBuYW1lIGlzIHVzZWQgb24gZGlmZmVyZW50IG1hY2hpbmVzLiAgVGhpcyBzYXZlcwotICAgICAgICAgICAgIHRoZSB0cm91YmxlIG9mIGhhdmluZyB0byByZW1lbWJlciB0byBnaXZlIHRoZSB1c2VyIG5hbWUgb24gdGhlCi0gICAgICAgICAgICAgY29tbWFuZCBsaW5lLgotCi0gICAgIFVzZXJLbm93bkhvc3RzRmlsZQotICAgICAgICAgICAgIFNwZWNpZmllcyBvbmUgb3IgbW9yZSBmaWxlcyB0byB1c2UgZm9yIHRoZSB1c2VyIGhvc3Qga2V5Ci0gICAgICAgICAgICAgZGF0YWJhc2UsIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLiAgVGhlIGRlZmF1bHQgaXMKLSAgICAgICAgICAgICB+Ly5zc2gva25vd25faG9zdHMsIH4vLnNzaC9rbm93bl9ob3N0czIuCi0KLSAgICAgVmVyaWZ5SG9zdEtleUROUwotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRvIHZlcmlmeSB0aGUgcmVtb3RlIGtleSB1c2luZyBETlMgYW5kIFNTSEZQCi0gICAgICAgICAgICAgcmVzb3VyY2UgcmVjb3Jkcy4gIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgYHllcycnLCB0aGUgY2xpZW50Ci0gICAgICAgICAgICAgd2lsbCBpbXBsaWNpdGx5IHRydXN0IGtleXMgdGhhdCBtYXRjaCBhIHNlY3VyZSBmaW5nZXJwcmludCBmcm9tCi0gICAgICAgICAgICAgRE5TLiAgSW5zZWN1cmUgZmluZ2VycHJpbnRzIHdpbGwgYmUgaGFuZGxlZCBhcyBpZiB0aGlzIG9wdGlvbiB3YXMKLSAgICAgICAgICAgICBzZXQgdG8gYGBhc2snJy4gIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgYGFzaycnLCBpbmZvcm1hdGlvbiBvbgotICAgICAgICAgICAgIGZpbmdlcnByaW50IG1hdGNoIHdpbGwgYmUgZGlzcGxheWVkLCBidXQgdGhlIHVzZXIgd2lsbCBzdGlsbCBuZWVkCi0gICAgICAgICAgICAgdG8gY29uZmlybSBuZXcgaG9zdCBrZXlzIGFjY29yZGluZyB0byB0aGUgU3RyaWN0SG9zdEtleUNoZWNraW5nCi0gICAgICAgICAgICAgb3B0aW9uLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYGB5ZXMnJywgYGBubycnLCBvciBgYGFzaycnLiAgVGhlCi0gICAgICAgICAgICAgZGVmYXVsdCBpcyBgYG5vJycuICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbAotICAgICAgICAgICAgIHZlcnNpb24gMiBvbmx5LgotCi0gICAgICAgICAgICAgU2VlIGFsc28gVkVSSUZZSU5HIEhPU1QgS0VZUyBpbiBzc2goMSkuCi0KLSAgICAgVmlzdWFsSG9zdEtleQotICAgICAgICAgICAgIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gYGB5ZXMnJywgYW4gQVNDSUkgYXJ0IHJlcHJlc2VudGF0aW9uIG9mCi0gICAgICAgICAgICAgdGhlIHJlbW90ZSBob3N0IGtleSBmaW5nZXJwcmludCBpcyBwcmludGVkIGluIGFkZGl0aW9uIHRvIHRoZSBoZXgKLSAgICAgICAgICAgICBmaW5nZXJwcmludCBzdHJpbmcgYXQgbG9naW4gYW5kIGZvciB1bmtub3duIGhvc3Qga2V5cy4gIElmIHRoaXMKLSAgICAgICAgICAgICBmbGFnIGlzIHNldCB0byBgYG5vJycsIG5vIGZpbmdlcnByaW50IHN0cmluZ3MgYXJlIHByaW50ZWQgYXQKLSAgICAgICAgICAgICBsb2dpbiBhbmQgb25seSB0aGUgaGV4IGZpbmdlcnByaW50IHN0cmluZyB3aWxsIGJlIHByaW50ZWQgZm9yCi0gICAgICAgICAgICAgdW5rbm93biBob3N0IGtleXMuICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuCi0KLSAgICAgWEF1dGhMb2NhdGlvbgotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgeGF1dGgoMSkgcHJvZ3JhbS4gIFRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgaXMgL3Vzci9YMTFSNi9iaW4veGF1dGguCi0KLVBBVFRFUk5TCi0gICAgIEEgcGF0dGVybiBjb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycywgYConIChhCi0gICAgIHdpbGRjYXJkIHRoYXQgbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycyksIG9yIGA/JyAoYSB3aWxkY2FyZCB0aGF0Ci0gICAgIG1hdGNoZXMgZXhhY3RseSBvbmUgY2hhcmFjdGVyKS4gIEZvciBleGFtcGxlLCB0byBzcGVjaWZ5IGEgc2V0IG9mCi0gICAgIGRlY2xhcmF0aW9ucyBmb3IgYW55IGhvc3QgaW4gdGhlIGBgLmNvLnVrJycgc2V0IG9mIGRvbWFpbnMsIHRoZSBmb2xsb3dpbmcKLSAgICAgcGF0dGVybiBjb3VsZCBiZSB1c2VkOgotCi0gICAgICAgICAgIEhvc3QgKi5jby51awotCi0gICAgIFRoZSBmb2xsb3dpbmcgcGF0dGVybiB3b3VsZCBtYXRjaCBhbnkgaG9zdCBpbiB0aGUgMTkyLjE2OC4wLlswLTldIG5ldHdvcmsKLSAgICAgcmFuZ2U6Ci0KLSAgICAgICAgICAgSG9zdCAxOTIuMTY4LjAuPwotCi0gICAgIEEgcGF0dGVybi1saXN0IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMuICBQYXR0ZXJucyB3aXRoaW4KLSAgICAgcGF0dGVybi1saXN0cyBtYXkgYmUgbmVnYXRlZCBieSBwcmVjZWRpbmcgdGhlbSB3aXRoIGFuIGV4Y2xhbWF0aW9uIG1hcmsKLSAgICAgKGAhJykuICBGb3IgZXhhbXBsZSwgdG8gYWxsb3cgYSBrZXkgdG8gYmUgdXNlZCBmcm9tIGFueXdoZXJlIHdpdGhpbiBhbgotICAgICBvcmdhbmlzYXRpb24gZXhjZXB0IGZyb20gdGhlIGBgZGlhbHVwJycgcG9vbCwgdGhlIGZvbGxvd2luZyBlbnRyeSAoaW4KLSAgICAgYXV0aG9yaXplZF9rZXlzKSBjb3VsZCBiZSB1c2VkOgotCi0gICAgICAgICAgIGZyb209IiEqLmRpYWx1cC5leGFtcGxlLmNvbSwqLmV4YW1wbGUuY29tIgotCi1GSUxFUwotICAgICB+Ly5zc2gvY29uZmlnCi0gICAgICAgICAgICAgVGhpcyBpcyB0aGUgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlLiAgVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUKLSAgICAgICAgICAgICBpcyBkZXNjcmliZWQgYWJvdmUuICBUaGlzIGZpbGUgaXMgdXNlZCBieSB0aGUgU1NIIGNsaWVudC4KLSAgICAgICAgICAgICBCZWNhdXNlIG9mIHRoZSBwb3RlbnRpYWwgZm9yIGFidXNlLCB0aGlzIGZpbGUgbXVzdCBoYXZlIHN0cmljdAotICAgICAgICAgICAgIHBlcm1pc3Npb25zOiByZWFkL3dyaXRlIGZvciB0aGUgdXNlciwgYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5Ci0gICAgICAgICAgICAgb3RoZXJzLgotCi0gICAgIC9ldGMvc3NoL3NzaF9jb25maWcKLSAgICAgICAgICAgICBTeXN0ZW13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoaXMgZmlsZSBwcm92aWRlcyBkZWZhdWx0cyBmb3IKLSAgICAgICAgICAgICB0aG9zZSB2YWx1ZXMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGUgdXNlcidzIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICBmaWxlLCBhbmQgZm9yIHRob3NlIHVzZXJzIHdobyBkbyBub3QgaGF2ZSBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgICAgICAgICBUaGlzIGZpbGUgbXVzdCBiZSB3b3JsZC1yZWFkYWJsZS4KLQotU0VFIEFMU08KLSAgICAgc3NoKDEpCi0KLUFVVEhPUlMKLSAgICAgT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlIHNzaCAxLjIuMTIgcmVsZWFzZSBieQotICAgICBUYXR1IFlsb25lbi4gIEFhcm9uIENhbXBiZWxsLCBCb2IgQmVjaywgTWFya3VzIEZyaWVkbCwgTmllbHMgUHJvdm9zLCBUaGVvCi0gICAgIGRlIFJhYWR0IGFuZCBEdWcgU29uZyByZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCi0gICAgIGNyZWF0ZWQgT3BlblNTSC4gIE1hcmt1cyBGcmllZGwgY29udHJpYnV0ZWQgdGhlIHN1cHBvcnQgZm9yIFNTSCBwcm90b2NvbAotICAgICB2ZXJzaW9ucyAxLjUgYW5kIDIuMC4KLQotT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgICBBdWd1c3QgMiwgMjAxMSAgICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9zc2hfY29uZmlnLjUgYi9zc2hfY29uZmlnLjUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ODJkNmYuLjAwMDAwMDAKLS0tIGEvc3NoX2NvbmZpZy41CisrKyAvZGV2L251bGwKQEAgLTEsMTI5NCArMCwwIEBACi0uXCIKLS5cIiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotLlwiIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0uXCIgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLS5cIgotLlwiIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLS5cIiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotLlwiIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLS5cIiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0uXCIgY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotLlwiCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk5IEFhcm9uIENhbXBiZWxsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlbyBkZSBSYWFkdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLS5cIiBhcmUgbWV0OgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotLlwiIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLS5cIiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotLlwiIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLS5cIiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLS5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0uXCIgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0uXCIgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLlwiIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotLlwiIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIKLS5cIiAkT3BlbkJTRDogc3NoX2NvbmZpZy41LHYgMS4xNTMgMjAxMS8wOC8wMiAwMToyMjoxMSBkam0gRXhwICQKLS5EZCAkTWRvY2RhdGU6IEF1Z3VzdCAyIDIwMTEgJAotLkR0IFNTSF9DT05GSUcgNQotLk9zCi0uU2ggTkFNRQotLk5tIHNzaF9jb25maWcKLS5OZCBPcGVuU1NIIFNTSCBjbGllbnQgY29uZmlndXJhdGlvbiBmaWxlcwotLlNoIFNZTk9QU0lTCi0uTm0gfi8uc3NoL2NvbmZpZwotLk5tIC9ldGMvc3NoL3NzaF9jb25maWcKLS5TaCBERVNDUklQVElPTgotLlhyIHNzaCAxCi1vYnRhaW5zIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcyBpbgotdGhlIGZvbGxvd2luZyBvcmRlcjoKLS5QcAotLkJsIC1lbnVtIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0Ci0uSXQKLWNvbW1hbmQtbGluZSBvcHRpb25zCi0uSXQKLXVzZXIncyBjb25maWd1cmF0aW9uIGZpbGUKLS5QcSBQYSB+Ly5zc2gvY29uZmlnCi0uSXQKLXN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZQotLlBxIFBhIC9ldGMvc3NoL3NzaF9jb25maWcKLS5FbAotLlBwCi1Gb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSBmaXJzdCBvYnRhaW5lZCB2YWx1ZQotd2lsbCBiZSB1c2VkLgotVGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgY29udGFpbiBzZWN0aW9ucyBzZXBhcmF0ZWQgYnkKLS5EcSBIb3N0Ci1zcGVjaWZpY2F0aW9ucywgYW5kIHRoYXQgc2VjdGlvbiBpcyBvbmx5IGFwcGxpZWQgZm9yIGhvc3RzIHRoYXQKLW1hdGNoIG9uZSBvZiB0aGUgcGF0dGVybnMgZ2l2ZW4gaW4gdGhlIHNwZWNpZmljYXRpb24uCi1UaGUgbWF0Y2hlZCBob3N0IG5hbWUgaXMgdGhlIG9uZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgotLlBwCi1TaW5jZSB0aGUgZmlyc3Qgb2J0YWluZWQgdmFsdWUgZm9yIGVhY2ggcGFyYW1ldGVyIGlzIHVzZWQsIG1vcmUKLWhvc3Qtc3BlY2lmaWMgZGVjbGFyYXRpb25zIHNob3VsZCBiZSBnaXZlbiBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi1maWxlLCBhbmQgZ2VuZXJhbCBkZWZhdWx0cyBhdCB0aGUgZW5kLgotLlBwCi1UaGUgY29uZmlndXJhdGlvbiBmaWxlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLS5QcAotRW1wdHkgbGluZXMgYW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGgKLS5RbCAjCi1hcmUgY29tbWVudHMuCi1PdGhlcndpc2UgYSBsaW5lIGlzIG9mIHRoZSBmb3JtYXQKLS5EcSBrZXl3b3JkIGFyZ3VtZW50cyAuCi1Db25maWd1cmF0aW9uIG9wdGlvbnMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIG9yCi1vcHRpb25hbCB3aGl0ZXNwYWNlIGFuZCBleGFjdGx5IG9uZQotLlFsID0gOwotdGhlIGxhdHRlciBmb3JtYXQgaXMgdXNlZnVsIHRvIGF2b2lkIHRoZSBuZWVkIHRvIHF1b3RlIHdoaXRlc3BhY2UKLXdoZW4gc3BlY2lmeWluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNpbmcgdGhlCi0uTm0gc3NoICwKLS5ObSBzY3AgLAotYW5kCi0uTm0gc2Z0cAotLkZsIG8KLW9wdGlvbi4KLUFyZ3VtZW50cyBtYXkgb3B0aW9uYWxseSBiZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzCi0uUHEgXCYiCi1pbiBvcmRlciB0byByZXByZXNlbnQgYXJndW1lbnRzIGNvbnRhaW5pbmcgc3BhY2VzLgotLlBwCi1UaGUgcG9zc2libGUKLWtleXdvcmRzIGFuZCB0aGVpciBtZWFuaW5ncyBhcmUgYXMgZm9sbG93cyAobm90ZSB0aGF0Ci1rZXl3b3JkcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgYXJndW1lbnRzIGFyZSBjYXNlLXNlbnNpdGl2ZSk6Ci0uQmwgLXRhZyAtd2lkdGggRHMKLS5JdCBDbSBIb3N0Ci1SZXN0cmljdHMgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnMgKHVwIHRvIHRoZSBuZXh0Ci0uQ20gSG9zdAota2V5d29yZCkgdG8gYmUgb25seSBmb3IgdGhvc2UgaG9zdHMgdGhhdCBtYXRjaCBvbmUgb2YgdGhlIHBhdHRlcm5zCi1naXZlbiBhZnRlciB0aGUga2V5d29yZC4KLUlmIG1vcmUgdGhhbiBvbmUgcGF0dGVybiBpcyBwcm92aWRlZCwgdGhleSBzaG91bGQgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCi1BIHNpbmdsZQotLlFsICoKLWFzIGEgcGF0dGVybiBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGdsb2JhbAotZGVmYXVsdHMgZm9yIGFsbCBob3N0cy4KLVRoZSBob3N0IGlzIHRoZQotLkFyIGhvc3RuYW1lCi1hcmd1bWVudCBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIChpLmUuIHRoZSBuYW1lIGlzIG5vdCBjb252ZXJ0ZWQgdG8KLWEgY2Fub25pY2FsaXplZCBob3N0IG5hbWUgYmVmb3JlIG1hdGNoaW5nKS4KLS5QcAotQSBwYXR0ZXJuIGVudHJ5IG1heSBiZSBuZWdhdGVkIGJ5IHByZWZpeGluZyBpdCB3aXRoIGFuIGV4Y2xhbWF0aW9uIG1hcmsKLS5QcSBTcSAhXCYgLgotSWYgYSBuZWdhdGVkIGVudHJ5IGlzIG1hdGNoZWQsIHRoZW4gdGhlCi0uQ20gSG9zdAotZW50cnkgaXMgaWdub3JlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBvdGhlciBwYXR0ZXJucyBvbiB0aGUgbGluZQotbWF0Y2guCi1OZWdhdGVkIG1hdGNoZXMgYXJlIHRoZXJlZm9yZSB1c2VmdWwgdG8gcHJvdmlkZSBleGNlcHRpb25zIGZvciB3aWxkY2FyZAotbWF0Y2hlcy4KLS5QcAotU2VlCi0uU3ggUEFUVEVSTlMKLWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBhdHRlcm5zLgotLkl0IENtIEFkZHJlc3NGYW1pbHkKLVNwZWNpZmllcyB3aGljaCBhZGRyZXNzIGZhbWlseSB0byB1c2Ugd2hlbiBjb25uZWN0aW5nLgotVmFsaWQgYXJndW1lbnRzIGFyZQotLkRxIGFueSAsCi0uRHEgaW5ldAotKHVzZSBJUHY0IG9ubHkpLCBvcgotLkRxIGluZXQ2Ci0odXNlIElQdjYgb25seSkuCi0uSXQgQ20gQmF0Y2hNb2RlCi1JZiBzZXQgdG8KLS5EcSB5ZXMgLAotcGFzc3BocmFzZS9wYXNzd29yZCBxdWVyeWluZyB3aWxsIGJlIGRpc2FibGVkLgotVGhpcyBvcHRpb24gaXMgdXNlZnVsIGluIHNjcmlwdHMgYW5kIG90aGVyIGJhdGNoIGpvYnMgd2hlcmUgbm8gdXNlcgotaXMgcHJlc2VudCB0byBzdXBwbHkgdGhlIHBhc3N3b3JkLgotVGhlIGFyZ3VtZW50IG11c3QgYmUKLS5EcSB5ZXMKLW9yCi0uRHEgbm8gLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi0uSXQgQ20gQmluZEFkZHJlc3MKLVVzZSB0aGUgc3BlY2lmaWVkIGFkZHJlc3Mgb24gdGhlIGxvY2FsIG1hY2hpbmUgYXMgdGhlIHNvdXJjZSBhZGRyZXNzIG9mCi10aGUgY29ubmVjdGlvbi4KLU9ubHkgdXNlZnVsIG9uIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lIGFkZHJlc3MuCi1Ob3RlIHRoYXQgdGhpcyBvcHRpb24gZG9lcyBub3Qgd29yayBpZgotLkNtIFVzZVByaXZpbGVnZWRQb3J0Ci1pcyBzZXQgdG8KLS5EcSB5ZXMgLgotLkl0IENtIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24KLVNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBjaGFsbGVuZ2UtcmVzcG9uc2UgYXV0aGVudGljYXRpb24uCi1UaGUgYXJndW1lbnQgdG8gdGhpcyBrZXl3b3JkIG11c3QgYmUKLS5EcSB5ZXMKLW9yCi0uRHEgbm8gLgotVGhlIGRlZmF1bHQgaXMKLS5EcSB5ZXMgLgotLkl0IENtIENoZWNrSG9zdElQCi1JZiB0aGlzIGZsYWcgaXMgc2V0IHRvCi0uRHEgeWVzICwKLS5YciBzc2ggMQotd2lsbCBhZGRpdGlvbmFsbHkgY2hlY2sgdGhlIGhvc3QgSVAgYWRkcmVzcyBpbiB0aGUKLS5QYSBrbm93bl9ob3N0cwotZmlsZS4KLVRoaXMgYWxsb3dzIHNzaCB0byBkZXRlY3QgaWYgYSBob3N0IGtleSBjaGFuZ2VkIGR1ZSB0byBETlMgc3Bvb2ZpbmcuCi1JZiB0aGUgb3B0aW9uIGlzIHNldCB0bwotLkRxIG5vICwKLXRoZSBjaGVjayB3aWxsIG5vdCBiZSBleGVjdXRlZC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgeWVzIC4KLS5JdCBDbSBDaXBoZXIKLVNwZWNpZmllcyB0aGUgY2lwaGVyIHRvIHVzZSBmb3IgZW5jcnlwdGluZyB0aGUgc2Vzc2lvbgotaW4gcHJvdG9jb2wgdmVyc2lvbiAxLgotQ3VycmVudGx5LAotLkRxIGJsb3dmaXNoICwKLS5EcSAzZGVzICwKLWFuZAotLkRxIGRlcwotYXJlIHN1cHBvcnRlZC4KLS5BciBkZXMKLWlzIG9ubHkgc3VwcG9ydGVkIGluIHRoZQotLlhyIHNzaCAxCi1jbGllbnQgZm9yIGludGVyb3BlcmFiaWxpdHkgd2l0aCBsZWdhY3kgcHJvdG9jb2wgMSBpbXBsZW1lbnRhdGlvbnMKLXRoYXQgZG8gbm90IHN1cHBvcnQgdGhlCi0uQXIgM2RlcwotY2lwaGVyLgotSXRzIHVzZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCBkdWUgdG8gY3J5cHRvZ3JhcGhpYyB3ZWFrbmVzc2VzLgotVGhlIGRlZmF1bHQgaXMKLS5EcSAzZGVzIC4KLS5JdCBDbSBDaXBoZXJzCi1TcGVjaWZpZXMgdGhlIGNpcGhlcnMgYWxsb3dlZCBmb3IgcHJvdG9jb2wgdmVyc2lvbiAyCi1pbiBvcmRlciBvZiBwcmVmZXJlbmNlLgotTXVsdGlwbGUgY2lwaGVycyBtdXN0IGJlIGNvbW1hLXNlcGFyYXRlZC4KLVRoZSBzdXBwb3J0ZWQgY2lwaGVycyBhcmUKLS5EcSAzZGVzLWNiYyAsCi0uRHEgYWVzMTI4LWNiYyAsCi0uRHEgYWVzMTkyLWNiYyAsCi0uRHEgYWVzMjU2LWNiYyAsCi0uRHEgYWVzMTI4LWN0ciAsCi0uRHEgYWVzMTkyLWN0ciAsCi0uRHEgYWVzMjU2LWN0ciAsCi0uRHEgYXJjZm91cjEyOCAsCi0uRHEgYXJjZm91cjI1NiAsCi0uRHEgYXJjZm91ciAsCi0uRHEgYmxvd2Zpc2gtY2JjICwKLWFuZAotLkRxIGNhc3QxMjgtY2JjIC4KLVRoZSBkZWZhdWx0IGlzOgotLkJkIC1saXRlcmFsIC1vZmZzZXQgM24KLWFlczEyOC1jdHIsYWVzMTkyLWN0cixhZXMyNTYtY3RyLGFyY2ZvdXIyNTYsYXJjZm91cjEyOCwKLWFlczEyOC1jYmMsM2Rlcy1jYmMsYmxvd2Zpc2gtY2JjLGNhc3QxMjgtY2JjLGFlczE5Mi1jYmMsCi1hZXMyNTYtY2JjLGFyY2ZvdXIKLS5FZAotLkl0IENtIENsZWFyQWxsRm9yd2FyZGluZ3MKLVNwZWNpZmllcyB0aGF0IGFsbCBsb2NhbCwgcmVtb3RlLCBhbmQgZHluYW1pYyBwb3J0IGZvcndhcmRpbmdzCi1zcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgb3Igb24gdGhlIGNvbW1hbmQgbGluZSBiZQotY2xlYXJlZC4KLVRoaXMgb3B0aW9uIGlzIHByaW1hcmlseSB1c2VmdWwgd2hlbiB1c2VkIGZyb20gdGhlCi0uWHIgc3NoIDEKLWNvbW1hbmQgbGluZSB0byBjbGVhciBwb3J0IGZvcndhcmRpbmdzIHNldCBpbgotY29uZmlndXJhdGlvbiBmaWxlcywgYW5kIGlzIGF1dG9tYXRpY2FsbHkgc2V0IGJ5Ci0uWHIgc2NwIDEKLWFuZAotLlhyIHNmdHAgMSAuCi1UaGUgYXJndW1lbnQgbXVzdCBiZQotLkRxIHllcwotb3IKLS5EcSBubyAuCi1UaGUgZGVmYXVsdCBpcwotLkRxIG5vIC4KLS5JdCBDbSBDb21wcmVzc2lvbgotU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGNvbXByZXNzaW9uLgotVGhlIGFyZ3VtZW50IG11c3QgYmUKLS5EcSB5ZXMKLW9yCi0uRHEgbm8gLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi0uSXQgQ20gQ29tcHJlc3Npb25MZXZlbAotU3BlY2lmaWVzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCB0byB1c2UgaWYgY29tcHJlc3Npb24gaXMgZW5hYmxlZC4KLVRoZSBhcmd1bWVudCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIChmYXN0KSB0byA5IChzbG93LCBiZXN0KS4KLVRoZSBkZWZhdWx0IGxldmVsIGlzIDYsIHdoaWNoIGlzIGdvb2QgZm9yIG1vc3QgYXBwbGljYXRpb25zLgotVGhlIG1lYW5pbmcgb2YgdGhlIHZhbHVlcyBpcyB0aGUgc2FtZSBhcyBpbgotLlhyIGd6aXAgMSAuCi1Ob3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDEgb25seS4KLS5JdCBDbSBDb25uZWN0aW9uQXR0ZW1wdHMKLVNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRyaWVzIChvbmUgcGVyIHNlY29uZCkgdG8gbWFrZSBiZWZvcmUgZXhpdGluZy4KLVRoZSBhcmd1bWVudCBtdXN0IGJlIGFuIGludGVnZXIuCi1UaGlzIG1heSBiZSB1c2VmdWwgaW4gc2NyaXB0cyBpZiB0aGUgY29ubmVjdGlvbiBzb21ldGltZXMgZmFpbHMuCi1UaGUgZGVmYXVsdCBpcyAxLgotLkl0IENtIENvbm5lY3RUaW1lb3V0Ci1TcGVjaWZpZXMgdGhlIHRpbWVvdXQgKGluIHNlY29uZHMpIHVzZWQgd2hlbiBjb25uZWN0aW5nIHRvIHRoZQotU1NIIHNlcnZlciwgaW5zdGVhZCBvZiB1c2luZyB0aGUgZGVmYXVsdCBzeXN0ZW0gVENQIHRpbWVvdXQuCi1UaGlzIHZhbHVlIGlzIHVzZWQgb25seSB3aGVuIHRoZSB0YXJnZXQgaXMgZG93biBvciByZWFsbHkgdW5yZWFjaGFibGUsCi1ub3Qgd2hlbiBpdCByZWZ1c2VzIHRoZSBjb25uZWN0aW9uLgotLkl0IENtIENvbnRyb2xNYXN0ZXIKLUVuYWJsZXMgdGhlIHNoYXJpbmcgb2YgbXVsdGlwbGUgc2Vzc2lvbnMgb3ZlciBhIHNpbmdsZSBuZXR3b3JrIGNvbm5lY3Rpb24uCi1XaGVuIHNldCB0bwotLkRxIHllcyAsCi0uWHIgc3NoIDEKLXdpbGwgbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbiBhIGNvbnRyb2wgc29ja2V0IHNwZWNpZmllZCB1c2luZyB0aGUKLS5DbSBDb250cm9sUGF0aAotYXJndW1lbnQuCi1BZGRpdGlvbmFsIHNlc3Npb25zIGNhbiBjb25uZWN0IHRvIHRoaXMgc29ja2V0IHVzaW5nIHRoZSBzYW1lCi0uQ20gQ29udHJvbFBhdGgKLXdpdGgKLS5DbSBDb250cm9sTWFzdGVyCi1zZXQgdG8KLS5EcSBubwotKHRoZSBkZWZhdWx0KS4KLVRoZXNlIHNlc3Npb25zIHdpbGwgdHJ5IHRvIHJldXNlIHRoZSBtYXN0ZXIgaW5zdGFuY2UncyBuZXR3b3JrIGNvbm5lY3Rpb24KLXJhdGhlciB0aGFuIGluaXRpYXRpbmcgbmV3IG9uZXMsIGJ1dCB3aWxsIGZhbGwgYmFjayB0byBjb25uZWN0aW5nIG5vcm1hbGx5Ci1pZiB0aGUgY29udHJvbCBzb2NrZXQgZG9lcyBub3QgZXhpc3QsIG9yIGlzIG5vdCBsaXN0ZW5pbmcuCi0uUHAKLVNldHRpbmcgdGhpcyB0bwotLkRxIGFzawotd2lsbCBjYXVzZSBzc2gKLXRvIGxpc3RlbiBmb3IgY29udHJvbCBjb25uZWN0aW9ucywgYnV0IHJlcXVpcmUgY29uZmlybWF0aW9uIHVzaW5nIHRoZQotLkV2IFNTSF9BU0tQQVNTCi1wcm9ncmFtIGJlZm9yZSB0aGV5IGFyZSBhY2NlcHRlZCAoc2VlCi0uWHIgc3NoLWFkZCAxCi1mb3IgZGV0YWlscykuCi1JZiB0aGUKLS5DbSBDb250cm9sUGF0aAotY2Fubm90IGJlIG9wZW5lZCwKLXNzaCB3aWxsIGNvbnRpbnVlIHdpdGhvdXQgY29ubmVjdGluZyB0byBhIG1hc3RlciBpbnN0YW5jZS4KLS5QcAotWDExIGFuZAotLlhyIHNzaC1hZ2VudCAxCi1mb3J3YXJkaW5nIGlzIHN1cHBvcnRlZCBvdmVyIHRoZXNlIG11bHRpcGxleGVkIGNvbm5lY3Rpb25zLCBob3dldmVyIHRoZQotZGlzcGxheSBhbmQgYWdlbnQgZm9yd2FyZGVkIHdpbGwgYmUgdGhlIG9uZSBiZWxvbmdpbmcgdG8gdGhlIG1hc3RlcgotY29ubmVjdGlvbiBpLmUuIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBmb3J3YXJkIG11bHRpcGxlIGRpc3BsYXlzIG9yIGFnZW50cy4KLS5QcAotVHdvIGFkZGl0aW9uYWwgb3B0aW9ucyBhbGxvdyBmb3Igb3Bwb3J0dW5pc3RpYyBtdWx0aXBsZXhpbmc6IHRyeSB0byB1c2UgYQotbWFzdGVyIGNvbm5lY3Rpb24gYnV0IGZhbGwgYmFjayB0byBjcmVhdGluZyBhIG5ldyBvbmUgaWYgb25lIGRvZXMgbm90IGFscmVhZHkKLWV4aXN0LgotVGhlc2Ugb3B0aW9ucyBhcmU6Ci0uRHEgYXV0bwotYW5kCi0uRHEgYXV0b2FzayAuCi1UaGUgbGF0dGVyIHJlcXVpcmVzIGNvbmZpcm1hdGlvbiBsaWtlIHRoZQotLkRxIGFzawotb3B0aW9uLgotLkl0IENtIENvbnRyb2xQYXRoCi1TcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSBjb250cm9sIHNvY2tldCB1c2VkIGZvciBjb25uZWN0aW9uIHNoYXJpbmcgYXMgZGVzY3JpYmVkCi1pbiB0aGUKLS5DbSBDb250cm9sTWFzdGVyCi1zZWN0aW9uIGFib3ZlIG9yIHRoZSBzdHJpbmcKLS5EcSBub25lCi10byBkaXNhYmxlIGNvbm5lY3Rpb24gc2hhcmluZy4KLUluIHRoZSBwYXRoLAotLlFsICVMCi13aWxsIGJlIHN1YnN0aXR1dGVkIGJ5IHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIGxvY2FsIGhvc3QgbmFtZSwKLS5RbCAlbAotd2lsbCBiZSBzdWJzdGl0dXRlZCBieSB0aGUgbG9jYWwgaG9zdCBuYW1lIChpbmNsdWRpbmcgYW55IGRvbWFpbiBuYW1lKSwKLS5RbCAlaAotd2lsbCBiZSBzdWJzdGl0dXRlZCBieSB0aGUgdGFyZ2V0IGhvc3QgbmFtZSwKLS5RbCAlbgotd2lsbCBiZSBzdWJzdGl0dXRlZCBieSB0aGUgb3JpZ2luYWwgdGFyZ2V0IGhvc3QgbmFtZQotc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsCi0uUWwgJXAKLXRoZSBwb3J0LAotLlFsICVyCi1ieSB0aGUgcmVtb3RlIGxvZ2luIHVzZXJuYW1lLCBhbmQKLS5RbCAldQotYnkgdGhlIHVzZXJuYW1lIG9mIHRoZSB1c2VyIHJ1bm5pbmcKLS5YciBzc2ggMSAuCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFueQotLkNtIENvbnRyb2xQYXRoCi11c2VkIGZvciBvcHBvcnR1bmlzdGljIGNvbm5lY3Rpb24gc2hhcmluZyBpbmNsdWRlCi1hdCBsZWFzdCAlaCwgJXAsIGFuZCAlci4KLVRoaXMgZW5zdXJlcyB0aGF0IHNoYXJlZCBjb25uZWN0aW9ucyBhcmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KLS5JdCBDbSBDb250cm9sUGVyc2lzdAotV2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKLS5DbSBDb250cm9sTWFzdGVyICwKLXNwZWNpZmllcyB0aGF0IHRoZSBtYXN0ZXIgY29ubmVjdGlvbiBzaG91bGQgcmVtYWluIG9wZW4KLWluIHRoZSBiYWNrZ3JvdW5kICh3YWl0aW5nIGZvciBmdXR1cmUgY2xpZW50IGNvbm5lY3Rpb25zKQotYWZ0ZXIgdGhlIGluaXRpYWwgY2xpZW50IGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkLgotSWYgc2V0IHRvCi0uRHEgbm8gLAotdGhlbiB0aGUgbWFzdGVyIGNvbm5lY3Rpb24gd2lsbCBub3QgYmUgcGxhY2VkIGludG8gdGhlIGJhY2tncm91bmQsCi1hbmQgd2lsbCBjbG9zZSBhcyBzb29uIGFzIHRoZSBpbml0aWFsIGNsaWVudCBjb25uZWN0aW9uIGlzIGNsb3NlZC4KLUlmIHNldCB0bwotLkRxIHllcyAsCi10aGVuIHRoZSBtYXN0ZXIgY29ubmVjdGlvbiB3aWxsIHJlbWFpbiBpbiB0aGUgYmFja2dyb3VuZCBpbmRlZmluaXRlbHkKLSh1bnRpbCBraWxsZWQgb3IgY2xvc2VkIHZpYSBhIG1lY2hhbmlzbSBzdWNoIGFzIHRoZQotLlhyIHNzaCAxCi0uRHEgRmwgTyBObyBleGl0Ci1vcHRpb24pLgotSWYgc2V0IHRvIGEgdGltZSBpbiBzZWNvbmRzLCBvciBhIHRpbWUgaW4gYW55IG9mIHRoZSBmb3JtYXRzIGRvY3VtZW50ZWQgaW4KLS5YciBzc2hkX2NvbmZpZyA1ICwKLXRoZW4gdGhlIGJhY2tncm91bmRlZCBtYXN0ZXIgY29ubmVjdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlCi1hZnRlciBpdCBoYXMgcmVtYWluZWQgaWRsZSAod2l0aCBubyBjbGllbnQgY29ubmVjdGlvbnMpIGZvciB0aGUKLXNwZWNpZmllZCB0aW1lLgotLkl0IENtIER5bmFtaWNGb3J3YXJkCi1TcGVjaWZpZXMgdGhhdCBhIFRDUCBwb3J0IG9uIHRoZSBsb2NhbCBtYWNoaW5lIGJlIGZvcndhcmRlZAotb3ZlciB0aGUgc2VjdXJlIGNoYW5uZWwsIGFuZCB0aGUgYXBwbGljYXRpb24KLXByb3RvY29sIGlzIHRoZW4gdXNlZCB0byBkZXRlcm1pbmUgd2hlcmUgdG8gY29ubmVjdCB0byBmcm9tIHRoZQotcmVtb3RlIG1hY2hpbmUuCi0uUHAKLVRoZSBhcmd1bWVudCBtdXN0IGJlCi0uU20gb2ZmCi0uT28gQXIgYmluZF9hZGRyZXNzIDogT2MgQXIgcG9ydCAuCi0uU20gb24KLUlQdjYgYWRkcmVzc2VzIGNhbiBiZSBzcGVjaWZpZWQgYnkgZW5jbG9zaW5nIGFkZHJlc3NlcyBpbiBzcXVhcmUgYnJhY2tldHMuCi1CeSBkZWZhdWx0LCB0aGUgbG9jYWwgcG9ydCBpcyBib3VuZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0uQ20gR2F0ZXdheVBvcnRzCi1zZXR0aW5nLgotSG93ZXZlciwgYW4gZXhwbGljaXQKLS5BciBiaW5kX2FkZHJlc3MKLW1heSBiZSB1c2VkIHRvIGJpbmQgdGhlIGNvbm5lY3Rpb24gdG8gYSBzcGVjaWZpYyBhZGRyZXNzLgotVGhlCi0uQXIgYmluZF9hZGRyZXNzCi1vZgotLkRxIGxvY2FsaG9zdAotaW5kaWNhdGVzIHRoYXQgdGhlIGxpc3RlbmluZyBwb3J0IGJlIGJvdW5kIGZvciBsb2NhbCB1c2Ugb25seSwgd2hpbGUgYW4KLWVtcHR5IGFkZHJlc3Mgb3IKLS5TcSAqCi1pbmRpY2F0ZXMgdGhhdCB0aGUgcG9ydCBzaG91bGQgYmUgYXZhaWxhYmxlIGZyb20gYWxsIGludGVyZmFjZXMuCi0uUHAKLUN1cnJlbnRseSB0aGUgU09DS1M0IGFuZCBTT0NLUzUgcHJvdG9jb2xzIGFyZSBzdXBwb3J0ZWQsIGFuZAotLlhyIHNzaCAxCi13aWxsIGFjdCBhcyBhIFNPQ0tTIHNlcnZlci4KLU11bHRpcGxlIGZvcndhcmRpbmdzIG1heSBiZSBzcGVjaWZpZWQsIGFuZAotYWRkaXRpb25hbCBmb3J3YXJkaW5ncyBjYW4gYmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KLU9ubHkgdGhlIHN1cGVydXNlciBjYW4gZm9yd2FyZCBwcml2aWxlZ2VkIHBvcnRzLgotLkl0IENtIEVuYWJsZVNTSEtleXNpZ24KLVNldHRpbmcgdGhpcyBvcHRpb24gdG8KLS5EcSB5ZXMKLWluIHRoZSBnbG9iYWwgY2xpZW50IGNvbmZpZ3VyYXRpb24gZmlsZQotLlBhIC9ldGMvc3NoL3NzaF9jb25maWcKLWVuYWJsZXMgdGhlIHVzZSBvZiB0aGUgaGVscGVyIHByb2dyYW0KLS5YciBzc2gta2V5c2lnbiA4Ci1kdXJpbmcKLS5DbSBIb3N0YmFzZWRBdXRoZW50aWNhdGlvbiAuCi1UaGUgYXJndW1lbnQgbXVzdCBiZQotLkRxIHllcwotb3IKLS5EcSBubyAuCi1UaGUgZGVmYXVsdCBpcwotLkRxIG5vIC4KLVRoaXMgb3B0aW9uIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhlIG5vbi1ob3N0c3BlY2lmaWMgc2VjdGlvbi4KLVNlZQotLlhyIHNzaC1rZXlzaWduIDgKLWZvciBtb3JlIGluZm9ybWF0aW9uLgotLkl0IENtIEVzY2FwZUNoYXIKLVNldHMgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgKGRlZmF1bHQ6Ci0uUWwgfiApIC4KLVRoZSBlc2NhcGUgY2hhcmFjdGVyIGNhbiBhbHNvCi1iZSBzZXQgb24gdGhlIGNvbW1hbmQgbGluZS4KLVRoZSBhcmd1bWVudCBzaG91bGQgYmUgYSBzaW5nbGUgY2hhcmFjdGVyLAotLlFsIF4KLWZvbGxvd2VkIGJ5IGEgbGV0dGVyLCBvcgotLkRxIG5vbmUKLXRvIGRpc2FibGUgdGhlIGVzY2FwZQotY2hhcmFjdGVyIGVudGlyZWx5IChtYWtpbmcgdGhlIGNvbm5lY3Rpb24gdHJhbnNwYXJlbnQgZm9yIGJpbmFyeQotZGF0YSkuCi0uSXQgQ20gRXhpdE9uRm9yd2FyZEZhaWx1cmUKLVNwZWNpZmllcyB3aGV0aGVyCi0uWHIgc3NoIDEKLXNob3VsZCB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24gaWYgaXQgY2Fubm90IHNldCB1cCBhbGwgcmVxdWVzdGVkCi1keW5hbWljLCB0dW5uZWwsIGxvY2FsLCBhbmQgcmVtb3RlIHBvcnQgZm9yd2FyZGluZ3MuCi1UaGUgYXJndW1lbnQgbXVzdCBiZQotLkRxIHllcwotb3IKLS5EcSBubyAuCi1UaGUgZGVmYXVsdCBpcwotLkRxIG5vIC4KLS5JdCBDbSBGb3J3YXJkQWdlbnQKLVNwZWNpZmllcyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudCAoaWYgYW55KQotd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHJlbW90ZSBtYWNoaW5lLgotVGhlIGFyZ3VtZW50IG11c3QgYmUKLS5EcSB5ZXMKLW9yCi0uRHEgbm8gLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi0uUHAKLUFnZW50IGZvcndhcmRpbmcgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aCBjYXV0aW9uLgotVXNlcnMgd2l0aCB0aGUgYWJpbGl0eSB0byBieXBhc3MgZmlsZSBwZXJtaXNzaW9ucyBvbiB0aGUgcmVtb3RlIGhvc3QKLShmb3IgdGhlIGFnZW50J3MgVW5peC1kb21haW4gc29ja2V0KQotY2FuIGFjY2VzcyB0aGUgbG9jYWwgYWdlbnQgdGhyb3VnaCB0aGUgZm9yd2FyZGVkIGNvbm5lY3Rpb24uCi1BbiBhdHRhY2tlciBjYW5ub3Qgb2J0YWluIGtleSBtYXRlcmlhbCBmcm9tIHRoZSBhZ2VudCwKLWhvd2V2ZXIgdGhleSBjYW4gcGVyZm9ybSBvcGVyYXRpb25zIG9uIHRoZSBrZXlzIHRoYXQgZW5hYmxlIHRoZW0gdG8KLWF1dGhlbnRpY2F0ZSB1c2luZyB0aGUgaWRlbnRpdGllcyBsb2FkZWQgaW50byB0aGUgYWdlbnQuCi0uSXQgQ20gRm9yd2FyZFgxMQotU3BlY2lmaWVzIHdoZXRoZXIgWDExIGNvbm5lY3Rpb25zIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWRpcmVjdGVkCi1vdmVyIHRoZSBzZWN1cmUgY2hhbm5lbCBhbmQKLS5FdiBESVNQTEFZCi1zZXQuCi1UaGUgYXJndW1lbnQgbXVzdCBiZQotLkRxIHllcwotb3IKLS5EcSBubyAuCi1UaGUgZGVmYXVsdCBpcwotLkRxIG5vIC4KLS5QcAotWDExIGZvcndhcmRpbmcgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aCBjYXV0aW9uLgotVXNlcnMgd2l0aCB0aGUgYWJpbGl0eSB0byBieXBhc3MgZmlsZSBwZXJtaXNzaW9ucyBvbiB0aGUgcmVtb3RlIGhvc3QKLShmb3IgdGhlIHVzZXIncyBYMTEgYXV0aG9yaXphdGlvbiBkYXRhYmFzZSkKLWNhbiBhY2Nlc3MgdGhlIGxvY2FsIFgxMSBkaXNwbGF5IHRocm91Z2ggdGhlIGZvcndhcmRlZCBjb25uZWN0aW9uLgotQW4gYXR0YWNrZXIgbWF5IHRoZW4gYmUgYWJsZSB0byBwZXJmb3JtIGFjdGl2aXRpZXMgc3VjaCBhcyBrZXlzdHJva2UgbW9uaXRvcmluZwotaWYgdGhlCi0uQ20gRm9yd2FyZFgxMVRydXN0ZWQKLW9wdGlvbiBpcyBhbHNvIGVuYWJsZWQuCi0uSXQgQ20gRm9yd2FyZFgxMVRpbWVvdXQKLVNwZWNpZnkgYSB0aW1lb3V0IGZvciB1bnRydXN0ZWQgWDExIGZvcndhcmRpbmcKLXVzaW5nIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGluIHRoZQotLlN4IFRJTUUgRk9STUFUUwotc2VjdGlvbiBvZgotLlhyIHNzaGRfY29uZmlnIDUgLgotWDExIGNvbm5lY3Rpb25zIHJlY2VpdmVkIGJ5Ci0uWHIgc3NoIDEKLWFmdGVyIHRoaXMgdGltZSB3aWxsIGJlIHJlZnVzZWQuCi1UaGUgZGVmYXVsdCBpcyB0byBkaXNhYmxlIHVudHJ1c3RlZCBYMTEgZm9yd2FyZGluZyBhZnRlciB0d2VudHkgbWludXRlcyBoYXMKLWVsYXBzZWQuCi0uSXQgQ20gRm9yd2FyZFgxMVRydXN0ZWQKLUlmIHRoaXMgb3B0aW9uIGlzIHNldCB0bwotLkRxIHllcyAsCi1yZW1vdGUgWDExIGNsaWVudHMgd2lsbCBoYXZlIGZ1bGwgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBYMTEgZGlzcGxheS4KLS5QcAotSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvCi0uRHEgbm8gLAotcmVtb3RlIFgxMSBjbGllbnRzIHdpbGwgYmUgY29uc2lkZXJlZCB1bnRydXN0ZWQgYW5kIHByZXZlbnRlZAotZnJvbSBzdGVhbGluZyBvciB0YW1wZXJpbmcgd2l0aCBkYXRhIGJlbG9uZ2luZyB0byB0cnVzdGVkIFgxMQotY2xpZW50cy4KLUZ1cnRoZXJtb3JlLCB0aGUKLS5YciB4YXV0aCAxCi10b2tlbiB1c2VkIGZvciB0aGUgc2Vzc2lvbiB3aWxsIGJlIHNldCB0byBleHBpcmUgYWZ0ZXIgMjAgbWludXRlcy4KLVJlbW90ZSBjbGllbnRzIHdpbGwgYmUgcmVmdXNlZCBhY2Nlc3MgYWZ0ZXIgdGhpcyB0aW1lLgotLlBwCi1UaGUgZGVmYXVsdCBpcwotLkRxIG5vIC4KLS5QcAotU2VlIHRoZSBYMTEgU0VDVVJJVFkgZXh0ZW5zaW9uIHNwZWNpZmljYXRpb24gZm9yIGZ1bGwgZGV0YWlscyBvbgotdGhlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIG9uIHVudHJ1c3RlZCBjbGllbnRzLgotLkl0IENtIEdhdGV3YXlQb3J0cwotU3BlY2lmaWVzIHdoZXRoZXIgcmVtb3RlIGhvc3RzIGFyZSBhbGxvd2VkIHRvIGNvbm5lY3QgdG8gbG9jYWwKLWZvcndhcmRlZCBwb3J0cy4KLUJ5IGRlZmF1bHQsCi0uWHIgc3NoIDEKLWJpbmRzIGxvY2FsIHBvcnQgZm9yd2FyZGluZ3MgdG8gdGhlIGxvb3BiYWNrIGFkZHJlc3MuCi1UaGlzIHByZXZlbnRzIG90aGVyIHJlbW90ZSBob3N0cyBmcm9tIGNvbm5lY3RpbmcgdG8gZm9yd2FyZGVkIHBvcnRzLgotLkNtIEdhdGV3YXlQb3J0cwotY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGF0IHNzaAotc2hvdWxkIGJpbmQgbG9jYWwgcG9ydCBmb3J3YXJkaW5ncyB0byB0aGUgd2lsZGNhcmQgYWRkcmVzcywKLXRodXMgYWxsb3dpbmcgcmVtb3RlIGhvc3RzIHRvIGNvbm5lY3QgdG8gZm9yd2FyZGVkIHBvcnRzLgotVGhlIGFyZ3VtZW50IG11c3QgYmUKLS5EcSB5ZXMKLW9yCi0uRHEgbm8gLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi0uSXQgQ20gR2xvYmFsS25vd25Ib3N0c0ZpbGUKLVNwZWNpZmllcyBvbmUgb3IgbW9yZSBmaWxlcyB0byB1c2UgZm9yIHRoZSBnbG9iYWwKLWhvc3Qga2V5IGRhdGFiYXNlLCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4KLVRoZSBkZWZhdWx0IGlzCi0uUGEgL2V0Yy9zc2gvc3NoX2tub3duX2hvc3RzICwKLS5QYSAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMyIC4KLS5JdCBDbSBHU1NBUElBdXRoZW50aWNhdGlvbgotU3BlY2lmaWVzIHdoZXRoZXIgdXNlciBhdXRoZW50aWNhdGlvbiBiYXNlZCBvbiBHU1NBUEkgaXMgYWxsb3dlZC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgbm8gLgotTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCi0uSXQgQ20gR1NTQVBJRGVsZWdhdGVDcmVkZW50aWFscwotRm9yd2FyZCAoZGVsZWdhdGUpIGNyZWRlbnRpYWxzIHRvIHRoZSBzZXJ2ZXIuCi1UaGUgZGVmYXVsdCBpcwotLkRxIG5vIC4KLU5vdGUgdGhhdCB0aGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgotLkl0IENtIEhhc2hLbm93bkhvc3RzCi1JbmRpY2F0ZXMgdGhhdAotLlhyIHNzaCAxCi1zaG91bGQgaGFzaCBob3N0IG5hbWVzIGFuZCBhZGRyZXNzZXMgd2hlbiB0aGV5IGFyZSBhZGRlZCB0bwotLlBhIH4vLnNzaC9rbm93bl9ob3N0cyAuCi1UaGVzZSBoYXNoZWQgbmFtZXMgbWF5IGJlIHVzZWQgbm9ybWFsbHkgYnkKLS5YciBzc2ggMQotYW5kCi0uWHIgc3NoZCA4ICwKLWJ1dCB0aGV5IGRvIG5vdCByZXZlYWwgaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gc2hvdWxkIHRoZSBmaWxlJ3MgY29udGVudHMKLWJlIGRpc2Nsb3NlZC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgbm8gLgotTm90ZSB0aGF0IGV4aXN0aW5nIG5hbWVzIGFuZCBhZGRyZXNzZXMgaW4ga25vd24gaG9zdHMgZmlsZXMKLXdpbGwgbm90IGJlIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5LAotYnV0IG1heSBiZSBtYW51YWxseSBoYXNoZWQgdXNpbmcKLS5YciBzc2gta2V5Z2VuIDEgLgotLkl0IENtIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCi1TcGVjaWZpZXMgd2hldGhlciB0byB0cnkgcmhvc3RzIGJhc2VkIGF1dGhlbnRpY2F0aW9uIHdpdGggcHVibGljIGtleQotYXV0aGVudGljYXRpb24uCi1UaGUgYXJndW1lbnQgbXVzdCBiZQotLkRxIHllcwotb3IKLS5EcSBubyAuCi1UaGUgZGVmYXVsdCBpcwotLkRxIG5vIC4KLVRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkgYW5kCi1pcyBzaW1pbGFyIHRvCi0uQ20gUmhvc3RzUlNBQXV0aGVudGljYXRpb24gLgotLkl0IENtIEhvc3RLZXlBbGdvcml0aG1zCi1TcGVjaWZpZXMgdGhlIHByb3RvY29sIHZlcnNpb24gMiBob3N0IGtleSBhbGdvcml0aG1zCi10aGF0IHRoZSBjbGllbnQgd2FudHMgdG8gdXNlIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuCi1UaGUgZGVmYXVsdCBmb3IgdGhpcyBvcHRpb24gaXM6Ci0uQmQgLWxpdGVyYWwgLW9mZnNldCAzbgotZWNkc2Etc2hhMi1uaXN0cDI1Ni1jZXJ0LXYwMUBvcGVuc3NoLmNvbSwKLWVjZHNhLXNoYTItbmlzdHAzODQtY2VydC12MDFAb3BlbnNzaC5jb20sCi1lY2RzYS1zaGEyLW5pc3RwNTIxLWNlcnQtdjAxQG9wZW5zc2guY29tLAotc3NoLXJzYS1jZXJ0LXYwMUBvcGVuc3NoLmNvbSxzc2gtZHNzLWNlcnQtdjAxQG9wZW5zc2guY29tLAotc3NoLXJzYS1jZXJ0LXYwMEBvcGVuc3NoLmNvbSxzc2gtZHNzLWNlcnQtdjAwQG9wZW5zc2guY29tLAotZWNkc2Etc2hhMi1uaXN0cDI1NixlY2RzYS1zaGEyLW5pc3RwMzg0LGVjZHNhLXNoYTItbmlzdHA1MjEsCi1zc2gtcnNhLHNzaC1kc3MKLS5FZAotLlBwCi1JZiBob3N0a2V5cyBhcmUga25vd24gZm9yIHRoZSBkZXN0aW5hdGlvbiBob3N0IHRoZW4gdGhpcyBkZWZhdWx0IGlzIG1vZGlmaWVkCi10byBwcmVmZXIgdGhlaXIgYWxnb3JpdGhtcy4KLS5JdCBDbSBIb3N0S2V5QWxpYXMKLVNwZWNpZmllcyBhbiBhbGlhcyB0aGF0IHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlCi1yZWFsIGhvc3QgbmFtZSB3aGVuIGxvb2tpbmcgdXAgb3Igc2F2aW5nIHRoZSBob3N0IGtleQotaW4gdGhlIGhvc3Qga2V5IGRhdGFiYXNlIGZpbGVzLgotVGhpcyBvcHRpb24gaXMgdXNlZnVsIGZvciB0dW5uZWxpbmcgU1NIIGNvbm5lY3Rpb25zCi1vciBmb3IgbXVsdGlwbGUgc2VydmVycyBydW5uaW5nIG9uIGEgc2luZ2xlIGhvc3QuCi0uSXQgQ20gSG9zdE5hbWUKLVNwZWNpZmllcyB0aGUgcmVhbCBob3N0IG5hbWUgdG8gbG9nIGludG8uCi1UaGlzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgbmlja25hbWVzIG9yIGFiYnJldmlhdGlvbnMgZm9yIGhvc3RzLgotSWYgdGhlIGhvc3RuYW1lIGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UKLS5RbCAlaCAsCi10aGVuIHRoaXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBob3N0IG5hbWUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUKLSh0aGlzIGlzIHVzZWZ1bCBmb3IgbWFuaXB1bGF0aW5nIHVucXVhbGlmaWVkIG5hbWVzKS4KLVRoZSBkZWZhdWx0IGlzIHRoZSBuYW1lIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1OdW1lcmljIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBwZXJtaXR0ZWQgKGJvdGggb24gdGhlIGNvbW1hbmQgbGluZSBhbmQgaW4KLS5DbSBIb3N0TmFtZQotc3BlY2lmaWNhdGlvbnMpLgotLkl0IENtIElkZW50aXRpZXNPbmx5Ci1TcGVjaWZpZXMgdGhhdAotLlhyIHNzaCAxCi1zaG91bGQgb25seSB1c2UgdGhlIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5IGZpbGVzIGNvbmZpZ3VyZWQgaW4gdGhlCi0uTm0KLWZpbGVzLAotZXZlbiBpZgotLlhyIHNzaC1hZ2VudCAxCi1vZmZlcnMgbW9yZSBpZGVudGl0aWVzLgotVGhlIGFyZ3VtZW50IHRvIHRoaXMga2V5d29yZCBtdXN0IGJlCi0uRHEgeWVzCi1vcgotLkRxIG5vIC4KLVRoaXMgb3B0aW9uIGlzIGludGVuZGVkIGZvciBzaXR1YXRpb25zIHdoZXJlIHNzaC1hZ2VudAotb2ZmZXJzIG1hbnkgZGlmZmVyZW50IGlkZW50aXRpZXMuCi1UaGUgZGVmYXVsdCBpcwotLkRxIG5vIC4KLS5JdCBDbSBJZGVudGl0eUZpbGUKLVNwZWNpZmllcyBhIGZpbGUgZnJvbSB3aGljaCB0aGUgdXNlcidzIERTQSwgRUNEU0Egb3IgRFNBIGF1dGhlbnRpY2F0aW9uCi1pZGVudGl0eSBpcyByZWFkLgotVGhlIGRlZmF1bHQgaXMKLS5QYSB+Ly5zc2gvaWRlbnRpdHkKLWZvciBwcm90b2NvbCB2ZXJzaW9uIDEsIGFuZAotLlBhIH4vLnNzaC9pZF9kc2EgLAotLlBhIH4vLnNzaC9pZF9lY2RzYQotYW5kCi0uUGEgfi8uc3NoL2lkX3JzYQotZm9yIHByb3RvY29sIHZlcnNpb24gMi4KLUFkZGl0aW9uYWxseSwgYW55IGlkZW50aXRpZXMgcmVwcmVzZW50ZWQgYnkgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50Ci13aWxsIGJlIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgotLlhyIHNzaCAxCi13aWxsIHRyeSB0byBsb2FkIGNlcnRpZmljYXRlIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpbGVuYW1lIG9idGFpbmVkIGJ5Ci1hcHBlbmRpbmcKLS5QYSAtY2VydC5wdWIKLXRvIHRoZSBwYXRoIG9mIGEgc3BlY2lmaWVkCi0uQ20gSWRlbnRpdHlGaWxlIC4KLS5QcAotVGhlIGZpbGUgbmFtZSBtYXkgdXNlIHRoZSB0aWxkZQotc3ludGF4IHRvIHJlZmVyIHRvIGEgdXNlcidzIGhvbWUgZGlyZWN0b3J5IG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nCi1lc2NhcGUgY2hhcmFjdGVyczoKLS5RbCAlZAotKGxvY2FsIHVzZXIncyBob21lIGRpcmVjdG9yeSksCi0uUWwgJXUKLShsb2NhbCB1c2VyIG5hbWUpLAotLlFsICVsCi0obG9jYWwgaG9zdCBuYW1lKSwKLS5RbCAlaAotKHJlbW90ZSBob3N0IG5hbWUpIG9yCi0uUWwgJXIKLShyZW1vdGUgdXNlciBuYW1lKS4KLS5QcAotSXQgaXMgcG9zc2libGUgdG8gaGF2ZQotbXVsdGlwbGUgaWRlbnRpdHkgZmlsZXMgc3BlY2lmaWVkIGluIGNvbmZpZ3VyYXRpb24gZmlsZXM7IGFsbCB0aGVzZQotaWRlbnRpdGllcyB3aWxsIGJlIHRyaWVkIGluIHNlcXVlbmNlLgotTXVsdGlwbGUKLS5DbSBJZGVudGl0eUZpbGUKLWRpcmVjdGl2ZXMgd2lsbCBhZGQgdG8gdGhlIGxpc3Qgb2YgaWRlbnRpdGllcyB0cmllZCAodGhpcyBiZWhhdmlvdXIKLWRpZmZlcnMgZnJvbSB0aGF0IG9mIG90aGVyIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcykuCi0uSXQgQ20gSVBRb1MKLVNwZWNpZmllcyB0aGUgSVB2NCB0eXBlLW9mLXNlcnZpY2Ugb3IgRFNDUCBjbGFzcyBmb3IgY29ubmVjdGlvbnMuCi1BY2NlcHRlZCB2YWx1ZXMgYXJlCi0uRHEgYWYxMSAsCi0uRHEgYWYxMiAsCi0uRHEgYWYxMyAsCi0uRHEgYWYxNCAsCi0uRHEgYWYyMiAsCi0uRHEgYWYyMyAsCi0uRHEgYWYzMSAsCi0uRHEgYWYzMiAsCi0uRHEgYWYzMyAsCi0uRHEgYWY0MSAsCi0uRHEgYWY0MiAsCi0uRHEgYWY0MyAsCi0uRHEgY3MwICwKLS5EcSBjczEgLAotLkRxIGNzMiAsCi0uRHEgY3MzICwKLS5EcSBjczQgLAotLkRxIGNzNSAsCi0uRHEgY3M2ICwKLS5EcSBjczcgLAotLkRxIGVmICwKLS5EcSBsb3dkZWxheSAsCi0uRHEgdGhyb3VnaHB1dCAsCi0uRHEgcmVsaWFiaWxpdHkgLAotb3IgYSBudW1lcmljIHZhbHVlLgotVGhpcyBvcHRpb24gbWF5IHRha2Ugb25lIG9yIHR3byBhcmd1bWVudHMsIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLgotSWYgb25lIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBhcyB0aGUgcGFja2V0IGNsYXNzIHVuY29uZGl0aW9uYWxseS4KLUlmIHR3byB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIGZpcnN0IGlzIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgZm9yCi1pbnRlcmFjdGl2ZSBzZXNzaW9ucyBhbmQgdGhlIHNlY29uZCBmb3Igbm9uLWludGVyYWN0aXZlIHNlc3Npb25zLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBsb3dkZWxheQotZm9yIGludGVyYWN0aXZlIHNlc3Npb25zIGFuZAotLkRxIHRocm91Z2hwdXQKLWZvciBub24taW50ZXJhY3RpdmUgc2Vzc2lvbnMuCi0uSXQgQ20gS2JkSW50ZXJhY3RpdmVBdXRoZW50aWNhdGlvbgotU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGtleWJvYXJkLWludGVyYWN0aXZlIGF1dGhlbnRpY2F0aW9uLgotVGhlIGFyZ3VtZW50IHRvIHRoaXMga2V5d29yZCBtdXN0IGJlCi0uRHEgeWVzCi1vcgotLkRxIG5vIC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgeWVzIC4KLS5JdCBDbSBLYmRJbnRlcmFjdGl2ZURldmljZXMKLVNwZWNpZmllcyB0aGUgbGlzdCBvZiBtZXRob2RzIHRvIHVzZSBpbiBrZXlib2FyZC1pbnRlcmFjdGl2ZSBhdXRoZW50aWNhdGlvbi4KLU11bHRpcGxlIG1ldGhvZCBuYW1lcyBtdXN0IGJlIGNvbW1hLXNlcGFyYXRlZC4KLVRoZSBkZWZhdWx0IGlzIHRvIHVzZSB0aGUgc2VydmVyIHNwZWNpZmllZCBsaXN0LgotVGhlIG1ldGhvZHMgYXZhaWxhYmxlIHZhcnkgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIHNlcnZlciBzdXBwb3J0cy4KLUZvciBhbiBPcGVuU1NIIHNlcnZlciwKLWl0IG1heSBiZSB6ZXJvIG9yIG1vcmUgb2Y6Ci0uRHEgYnNkYXV0aCAsCi0uRHEgcGFtICwKLWFuZAotLkRxIHNrZXkgLgotLkl0IENtIEtleEFsZ29yaXRobXMKLVNwZWNpZmllcyB0aGUgYXZhaWxhYmxlIEtFWCAoS2V5IEV4Y2hhbmdlKSBhbGdvcml0aG1zLgotTXVsdGlwbGUgYWxnb3JpdGhtcyBtdXN0IGJlIGNvbW1hLXNlcGFyYXRlZC4KLVRoZSBkZWZhdWx0IGlzOgotLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50Ci1lY2RoLXNoYTItbmlzdHAyNTYsZWNkaC1zaGEyLW5pc3RwMzg0LGVjZGgtc2hhMi1uaXN0cDUyMSwKLWRpZmZpZS1oZWxsbWFuLWdyb3VwLWV4Y2hhbmdlLXNoYTI1NiwKLWRpZmZpZS1oZWxsbWFuLWdyb3VwLWV4Y2hhbmdlLXNoYTEsCi1kaWZmaWUtaGVsbG1hbi1ncm91cDE0LXNoYTEsCi1kaWZmaWUtaGVsbG1hbi1ncm91cDEtc2hhMQotLkVkCi0uSXQgQ20gTG9jYWxDb21tYW5kCi1TcGVjaWZpZXMgYSBjb21tYW5kIHRvIGV4ZWN1dGUgb24gdGhlIGxvY2FsIG1hY2hpbmUgYWZ0ZXIgc3VjY2Vzc2Z1bGx5Ci1jb25uZWN0aW5nIHRvIHRoZSBzZXJ2ZXIuCi1UaGUgY29tbWFuZCBzdHJpbmcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLCBhbmQgaXMgZXhlY3V0ZWQgd2l0aAotdGhlIHVzZXIncyBzaGVsbC4KLVRoZSBmb2xsb3dpbmcgZXNjYXBlIGNoYXJhY3RlciBzdWJzdGl0dXRpb25zIHdpbGwgYmUgcGVyZm9ybWVkOgotLlFsICVkCi0obG9jYWwgdXNlcidzIGhvbWUgZGlyZWN0b3J5KSwKLS5RbCAlaAotKHJlbW90ZSBob3N0IG5hbWUpLAotLlFsICVsCi0obG9jYWwgaG9zdCBuYW1lKSwKLS5RbCAlbgotKGhvc3QgbmFtZSBhcyBwcm92aWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lKSwKLS5RbCAlcAotKHJlbW90ZSBwb3J0KSwKLS5RbCAlcgotKHJlbW90ZSB1c2VyIG5hbWUpIG9yCi0uUWwgJXUKLShsb2NhbCB1c2VyIG5hbWUpLgotLlBwCi1UaGUgY29tbWFuZCBpcyBydW4gc3luY2hyb25vdXNseSBhbmQgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlCi1zZXNzaW9uIG9mIHRoZQotLlhyIHNzaCAxCi10aGF0IHNwYXduZWQgaXQuCi1JdCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGludGVyYWN0aXZlIGNvbW1hbmRzLgotLlBwCi1UaGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkIHVubGVzcwotLkNtIFBlcm1pdExvY2FsQ29tbWFuZAotaGFzIGJlZW4gZW5hYmxlZC4KLS5JdCBDbSBMb2NhbEZvcndhcmQKLVNwZWNpZmllcyB0aGF0IGEgVENQIHBvcnQgb24gdGhlIGxvY2FsIG1hY2hpbmUgYmUgZm9yd2FyZGVkIG92ZXIKLXRoZSBzZWN1cmUgY2hhbm5lbCB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIHBvcnQgZnJvbSB0aGUgcmVtb3RlIG1hY2hpbmUuCi1UaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZQotLlNtIG9mZgotLk9vIEFyIGJpbmRfYWRkcmVzcyA6IE9jIEFyIHBvcnQKLS5TbSBvbgotYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZQotLkFyIGhvc3QgOiBOcyBBciBob3N0cG9ydCAuCi1JUHY2IGFkZHJlc3NlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGVuY2xvc2luZyBhZGRyZXNzZXMgaW4gc3F1YXJlIGJyYWNrZXRzLgotTXVsdGlwbGUgZm9yd2FyZGluZ3MgbWF5IGJlIHNwZWNpZmllZCwgYW5kIGFkZGl0aW9uYWwgZm9yd2FyZGluZ3MgY2FuIGJlCi1naXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgotT25seSB0aGUgc3VwZXJ1c2VyIGNhbiBmb3J3YXJkIHByaXZpbGVnZWQgcG9ydHMuCi1CeSBkZWZhdWx0LCB0aGUgbG9jYWwgcG9ydCBpcyBib3VuZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0uQ20gR2F0ZXdheVBvcnRzCi1zZXR0aW5nLgotSG93ZXZlciwgYW4gZXhwbGljaXQKLS5BciBiaW5kX2FkZHJlc3MKLW1heSBiZSB1c2VkIHRvIGJpbmQgdGhlIGNvbm5lY3Rpb24gdG8gYSBzcGVjaWZpYyBhZGRyZXNzLgotVGhlCi0uQXIgYmluZF9hZGRyZXNzCi1vZgotLkRxIGxvY2FsaG9zdAotaW5kaWNhdGVzIHRoYXQgdGhlIGxpc3RlbmluZyBwb3J0IGJlIGJvdW5kIGZvciBsb2NhbCB1c2Ugb25seSwgd2hpbGUgYW4KLWVtcHR5IGFkZHJlc3Mgb3IKLS5TcSAqCi1pbmRpY2F0ZXMgdGhhdCB0aGUgcG9ydCBzaG91bGQgYmUgYXZhaWxhYmxlIGZyb20gYWxsIGludGVyZmFjZXMuCi0uSXQgQ20gTG9nTGV2ZWwKLUdpdmVzIHRoZSB2ZXJib3NpdHkgbGV2ZWwgdGhhdCBpcyB1c2VkIHdoZW4gbG9nZ2luZyBtZXNzYWdlcyBmcm9tCi0uWHIgc3NoIDEgLgotVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6Ci1RVUlFVCwgRkFUQUwsIEVSUk9SLCBJTkZPLCBWRVJCT1NFLCBERUJVRywgREVCVUcxLCBERUJVRzIsIGFuZCBERUJVRzMuCi1UaGUgZGVmYXVsdCBpcyBJTkZPLgotREVCVUcgYW5kIERFQlVHMSBhcmUgZXF1aXZhbGVudC4KLURFQlVHMiBhbmQgREVCVUczIGVhY2ggc3BlY2lmeSBoaWdoZXIgbGV2ZWxzIG9mIHZlcmJvc2Ugb3V0cHV0LgotLkl0IENtIE1BQ3MKLVNwZWNpZmllcyB0aGUgTUFDIChtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUpIGFsZ29yaXRobXMKLWluIG9yZGVyIG9mIHByZWZlcmVuY2UuCi1UaGUgTUFDIGFsZ29yaXRobSBpcyB1c2VkIGluIHByb3RvY29sIHZlcnNpb24gMgotZm9yIGRhdGEgaW50ZWdyaXR5IHByb3RlY3Rpb24uCi1NdWx0aXBsZSBhbGdvcml0aG1zIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkLgotVGhlIGRlZmF1bHQgaXM6Ci0uQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKLWhtYWMtbWQ1LGhtYWMtc2hhMSx1bWFjLTY0QG9wZW5zc2guY29tLAotaG1hYy1yaXBlbWQxNjAsaG1hYy1zaGExLTk2LGhtYWMtbWQ1LTk2LAotaG1hYy1zaGEyLTI1NixobWFjLXNoYTItMjU2LTk2LGhtYWMtc2hhMi01MTIsCi1obWFjLXNoYTItNTEyLTk2Ci0uRWQKLS5JdCBDbSBOb0hvc3RBdXRoZW50aWNhdGlvbkZvckxvY2FsaG9zdAotVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgaWYgdGhlIGhvbWUgZGlyZWN0b3J5IGlzIHNoYXJlZCBhY3Jvc3MgbWFjaGluZXMuCi1JbiB0aGlzIGNhc2UgbG9jYWxob3N0IHdpbGwgcmVmZXIgdG8gYSBkaWZmZXJlbnQgbWFjaGluZSBvbiBlYWNoIG9mCi10aGUgbWFjaGluZXMgYW5kIHRoZSB1c2VyIHdpbGwgZ2V0IG1hbnkgd2FybmluZ3MgYWJvdXQgY2hhbmdlZCBob3N0IGtleXMuCi1Ib3dldmVyLCB0aGlzIG9wdGlvbiBkaXNhYmxlcyBob3N0IGF1dGhlbnRpY2F0aW9uIGZvciBsb2NhbGhvc3QuCi1UaGUgYXJndW1lbnQgdG8gdGhpcyBrZXl3b3JkIG11c3QgYmUKLS5EcSB5ZXMKLW9yCi0uRHEgbm8gLgotVGhlIGRlZmF1bHQgaXMgdG8gY2hlY2sgdGhlIGhvc3Qga2V5IGZvciBsb2NhbGhvc3QuCi0uSXQgQ20gTnVtYmVyT2ZQYXNzd29yZFByb21wdHMKLVNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHBhc3N3b3JkIHByb21wdHMgYmVmb3JlIGdpdmluZyB1cC4KLVRoZSBhcmd1bWVudCB0byB0aGlzIGtleXdvcmQgbXVzdCBiZSBhbiBpbnRlZ2VyLgotVGhlIGRlZmF1bHQgaXMgMy4KLS5JdCBDbSBQYXNzd29yZEF1dGhlbnRpY2F0aW9uCi1TcGVjaWZpZXMgd2hldGhlciB0byB1c2UgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uCi1UaGUgYXJndW1lbnQgdG8gdGhpcyBrZXl3b3JkIG11c3QgYmUKLS5EcSB5ZXMKLW9yCi0uRHEgbm8gLgotVGhlIGRlZmF1bHQgaXMKLS5EcSB5ZXMgLgotLkl0IENtIFBlcm1pdExvY2FsQ29tbWFuZAotQWxsb3cgbG9jYWwgY29tbWFuZCBleGVjdXRpb24gdmlhIHRoZQotLkljIExvY2FsQ29tbWFuZAotb3B0aW9uIG9yIHVzaW5nIHRoZQotLkljICFcJiBOcyBBciBjb21tYW5kCi1lc2NhcGUgc2VxdWVuY2UgaW4KLS5YciBzc2ggMSAuCi1UaGUgYXJndW1lbnQgbXVzdCBiZQotLkRxIHllcwotb3IKLS5EcSBubyAuCi1UaGUgZGVmYXVsdCBpcwotLkRxIG5vIC4KLS5JdCBDbSBQS0NTMTFQcm92aWRlcgotU3BlY2lmaWVzIHdoaWNoIFBLQ1MjMTEgcHJvdmlkZXIgdG8gdXNlLgotVGhlIGFyZ3VtZW50IHRvIHRoaXMga2V5d29yZCBpcyB0aGUgUEtDUyMxMSBzaGFyZWQgbGlicmFyeQotLlhyIHNzaCAxCi1zaG91bGQgdXNlIHRvIGNvbW11bmljYXRlIHdpdGggYSBQS0NTIzExIHRva2VuIHByb3ZpZGluZyB0aGUgdXNlcidzCi1wcml2YXRlIFJTQSBrZXkuCi0uSXQgQ20gUG9ydAotU3BlY2lmaWVzIHRoZSBwb3J0IG51bWJlciB0byBjb25uZWN0IG9uIHRoZSByZW1vdGUgaG9zdC4KLVRoZSBkZWZhdWx0IGlzIDIyLgotLkl0IENtIFByZWZlcnJlZEF1dGhlbnRpY2F0aW9ucwotU3BlY2lmaWVzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgY2xpZW50IHNob3VsZCB0cnkgcHJvdG9jb2wgMgotYXV0aGVudGljYXRpb24gbWV0aG9kcy4KLVRoaXMgYWxsb3dzIGEgY2xpZW50IHRvIHByZWZlciBvbmUgbWV0aG9kIChlLmcuXCYKLS5DbSBrZXlib2FyZC1pbnRlcmFjdGl2ZSApCi1vdmVyIGFub3RoZXIgbWV0aG9kIChlLmcuXCYKLS5DbSBwYXNzd29yZCApIC4KLVRoZSBkZWZhdWx0IGlzOgotLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50Ci1nc3NhcGktd2l0aC1taWMsaG9zdGJhc2VkLHB1YmxpY2tleSwKLWtleWJvYXJkLWludGVyYWN0aXZlLHBhc3N3b3JkCi0uRWQKLS5JdCBDbSBQcm90b2NvbAotU3BlY2lmaWVzIHRoZSBwcm90b2NvbCB2ZXJzaW9ucwotLlhyIHNzaCAxCi1zaG91bGQgc3VwcG9ydCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLgotVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmUKLS5TcSAxCi1hbmQKLS5TcSAyIC4KLU11bHRpcGxlIHZlcnNpb25zIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkLgotV2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8KLS5EcSAyLDEKLS5ObSBzc2gKLXdpbGwgdHJ5IHZlcnNpb24gMiBhbmQgZmFsbCBiYWNrIHRvIHZlcnNpb24gMQotaWYgdmVyc2lvbiAyIGlzIG5vdCBhdmFpbGFibGUuCi1UaGUgZGVmYXVsdCBpcwotLlNxIDIgLgotLkl0IENtIFByb3h5Q29tbWFuZAotU3BlY2lmaWVzIHRoZSBjb21tYW5kIHRvIHVzZSB0byBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIuCi1UaGUgY29tbWFuZAotc3RyaW5nIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSwgYW5kIGlzIGV4ZWN1dGVkIHdpdGgKLXRoZSB1c2VyJ3Mgc2hlbGwuCi1JbiB0aGUgY29tbWFuZCBzdHJpbmcsIGFueSBvY2N1cnJlbmNlIG9mCi0uUWwgJWgKLXdpbGwgYmUgc3Vic3RpdHV0ZWQgYnkgdGhlIGhvc3QgbmFtZSB0bwotY29ubmVjdCwKLS5RbCAlcAotYnkgdGhlIHBvcnQsIGFuZAotLlFsICVyCi1ieSB0aGUgcmVtb3RlIHVzZXIgbmFtZS4KLVRoZSBjb21tYW5kIGNhbiBiZSBiYXNpY2FsbHkgYW55dGhpbmcsCi1hbmQgc2hvdWxkIHJlYWQgZnJvbSBpdHMgc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlIHRvIGl0cyBzdGFuZGFyZCBvdXRwdXQuCi1JdCBzaG91bGQgZXZlbnR1YWxseSBjb25uZWN0IGFuCi0uWHIgc3NoZCA4Ci1zZXJ2ZXIgcnVubmluZyBvbiBzb21lIG1hY2hpbmUsIG9yIGV4ZWN1dGUKLS5JYyBzc2hkIC1pCi1zb21ld2hlcmUuCi1Ib3N0IGtleSBtYW5hZ2VtZW50IHdpbGwgYmUgZG9uZSB1c2luZyB0aGUKLUhvc3ROYW1lIG9mIHRoZSBob3N0IGJlaW5nIGNvbm5lY3RlZCAoZGVmYXVsdGluZyB0byB0aGUgbmFtZSB0eXBlZCBieQotdGhlIHVzZXIpLgotU2V0dGluZyB0aGUgY29tbWFuZCB0bwotLkRxIG5vbmUKLWRpc2FibGVzIHRoaXMgb3B0aW9uIGVudGlyZWx5LgotTm90ZSB0aGF0Ci0uQ20gQ2hlY2tIb3N0SVAKLWlzIG5vdCBhdmFpbGFibGUgZm9yIGNvbm5lY3RzIHdpdGggYSBwcm94eSBjb21tYW5kLgotLlBwCi1UaGlzIGRpcmVjdGl2ZSBpcyB1c2VmdWwgaW4gY29uanVuY3Rpb24gd2l0aAotLlhyIG5jIDEKLWFuZCBpdHMgcHJveHkgc3VwcG9ydC4KLUZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZSB3b3VsZCBjb25uZWN0IHZpYSBhbiBIVFRQIHByb3h5IGF0Ci0xOTIuMC4yLjA6Ci0uQmQgLWxpdGVyYWwgLW9mZnNldCAzbgotUHJveHlDb21tYW5kIC91c3IvYmluL25jIC1YIGNvbm5lY3QgLXggMTkyLjAuMi4wOjgwODAgJWggJXAKLS5FZAotLkl0IENtIFB1YmtleUF1dGhlbnRpY2F0aW9uCi1TcGVjaWZpZXMgd2hldGhlciB0byB0cnkgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbi4KLVRoZSBhcmd1bWVudCB0byB0aGlzIGtleXdvcmQgbXVzdCBiZQotLkRxIHllcwotb3IKLS5EcSBubyAuCi1UaGUgZGVmYXVsdCBpcwotLkRxIHllcyAuCi1UaGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgotLkl0IENtIFJla2V5TGltaXQKLVNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSB0cmFuc21pdHRlZCBiZWZvcmUgdGhlCi1zZXNzaW9uIGtleSBpcyByZW5lZ290aWF0ZWQuCi1UaGUgYXJndW1lbnQgaXMgdGhlIG51bWJlciBvZiBieXRlcywgd2l0aCBhbiBvcHRpb25hbCBzdWZmaXggb2YKLS5TcSBLICwKLS5TcSBNICwKLW9yCi0uU3EgRwotdG8gaW5kaWNhdGUgS2lsb2J5dGVzLCBNZWdhYnl0ZXMsIG9yIEdpZ2FieXRlcywgcmVzcGVjdGl2ZWx5LgotVGhlIGRlZmF1bHQgaXMgYmV0d2VlbgotLlNxIDFHCi1hbmQKLS5TcSA0RyAsCi1kZXBlbmRpbmcgb24gdGhlIGNpcGhlci4KLVRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCi0uSXQgQ20gUmVtb3RlRm9yd2FyZAotU3BlY2lmaWVzIHRoYXQgYSBUQ1AgcG9ydCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUgYmUgZm9yd2FyZGVkIG92ZXIKLXRoZSBzZWN1cmUgY2hhbm5lbCB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIHBvcnQgZnJvbSB0aGUgbG9jYWwgbWFjaGluZS4KLVRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlCi0uU20gb2ZmCi0uT28gQXIgYmluZF9hZGRyZXNzIDogT2MgQXIgcG9ydAotLlNtIG9uCi1hbmQgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlCi0uQXIgaG9zdCA6IE5zIEFyIGhvc3Rwb3J0IC4KLUlQdjYgYWRkcmVzc2VzIGNhbiBiZSBzcGVjaWZpZWQgYnkgZW5jbG9zaW5nIGFkZHJlc3NlcyBpbiBzcXVhcmUgYnJhY2tldHMuCi1NdWx0aXBsZSBmb3J3YXJkaW5ncyBtYXkgYmUgc3BlY2lmaWVkLCBhbmQgYWRkaXRpb25hbAotZm9yd2FyZGluZ3MgY2FuIGJlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1Qcml2aWxlZ2VkIHBvcnRzIGNhbiBiZSBmb3J3YXJkZWQgb25seSB3aGVuCi1sb2dnaW5nIGluIGFzIHJvb3Qgb24gdGhlIHJlbW90ZSBtYWNoaW5lLgotLlBwCi1JZiB0aGUKLS5BciBwb3J0Ci1hcmd1bWVudCBpcwotLlFsIDAgLAotdGhlIGxpc3RlbiBwb3J0IHdpbGwgYmUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG9uIHRoZSBzZXJ2ZXIgYW5kIHJlcG9ydGVkCi10byB0aGUgY2xpZW50IGF0IHJ1biB0aW1lLgotLlBwCi1JZiB0aGUKLS5BciBiaW5kX2FkZHJlc3MKLWlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzIHRvIG9ubHkgYmluZCB0byBsb29wYmFjayBhZGRyZXNzZXMuCi1JZiB0aGUKLS5BciBiaW5kX2FkZHJlc3MKLWlzCi0uUWwgKgotb3IgYW4gZW1wdHkgc3RyaW5nLCB0aGVuIHRoZSBmb3J3YXJkaW5nIGlzIHJlcXVlc3RlZCB0byBsaXN0ZW4gb24gYWxsCi1pbnRlcmZhY2VzLgotU3BlY2lmeWluZyBhIHJlbW90ZQotLkFyIGJpbmRfYWRkcmVzcwotd2lsbCBvbmx5IHN1Y2NlZWQgaWYgdGhlIHNlcnZlcidzCi0uQ20gR2F0ZXdheVBvcnRzCi1vcHRpb24gaXMgZW5hYmxlZCAoc2VlCi0uWHIgc3NoZF9jb25maWcgNSApIC4KLS5JdCBDbSBSZXF1ZXN0VFRZCi1TcGVjaWZpZXMgd2hldGhlciB0byByZXF1ZXN0IGEgcHNldWRvLXR0eSBmb3IgdGhlIHNlc3Npb24uCi1UaGUgYXJndW1lbnQgbWF5IGJlIG9uZSBvZjoKLS5EcSBubwotKG5ldmVyIHJlcXVlc3QgYSBUVFkpLAotLkRxIHllcwotKGFsd2F5cyByZXF1ZXN0IGEgVFRZIHdoZW4gc3RhbmRhcmQgaW5wdXQgaXMgYSBUVFkpLAotLkRxIGZvcmNlCi0oYWx3YXlzIHJlcXVlc3QgYSBUVFkpIG9yCi0uRHEgYXV0bwotKHJlcXVlc3QgYSBUVFkgd2hlbiBvcGVuaW5nIGEgbG9naW4gc2Vzc2lvbikuCi1UaGlzIG9wdGlvbiBtaXJyb3JzIHRoZQotLkZsIHQKLWFuZAotLkZsIFQKLWZsYWdzIGZvcgotLlhyIHNzaCAxIC4KLS5JdCBDbSBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbgotU3BlY2lmaWVzIHdoZXRoZXIgdG8gdHJ5IHJob3N0cyBiYXNlZCBhdXRoZW50aWNhdGlvbiB3aXRoIFJTQSBob3N0Ci1hdXRoZW50aWNhdGlvbi4KLVRoZSBhcmd1bWVudCBtdXN0IGJlCi0uRHEgeWVzCi1vcgotLkRxIG5vIC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgbm8gLgotVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDEgb25seSBhbmQgcmVxdWlyZXMKLS5YciBzc2ggMQotdG8gYmUgc2V0dWlkIHJvb3QuCi0uSXQgQ20gUlNBQXV0aGVudGljYXRpb24KLVNwZWNpZmllcyB3aGV0aGVyIHRvIHRyeSBSU0EgYXV0aGVudGljYXRpb24uCi1UaGUgYXJndW1lbnQgdG8gdGhpcyBrZXl3b3JkIG11c3QgYmUKLS5EcSB5ZXMKLW9yCi0uRHEgbm8gLgotUlNBIGF1dGhlbnRpY2F0aW9uIHdpbGwgb25seSBiZQotYXR0ZW1wdGVkIGlmIHRoZSBpZGVudGl0eSBmaWxlIGV4aXN0cywgb3IgYW4gYXV0aGVudGljYXRpb24gYWdlbnQgaXMKLXJ1bm5pbmcuCi1UaGUgZGVmYXVsdCBpcwotLkRxIHllcyAuCi1Ob3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDEgb25seS4KLS5JdCBDbSBTZW5kRW52Ci1TcGVjaWZpZXMgd2hhdCB2YXJpYWJsZXMgZnJvbSB0aGUgbG9jYWwKLS5YciBlbnZpcm9uIDcKLXNob3VsZCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCi1Ob3RlIHRoYXQgZW52aXJvbm1lbnQgcGFzc2luZyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgcHJvdG9jb2wgMi4KLVRoZSBzZXJ2ZXIgbXVzdCBhbHNvIHN1cHBvcnQgaXQsIGFuZCB0aGUgc2VydmVyIG11c3QgYmUgY29uZmlndXJlZCB0bwotYWNjZXB0IHRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLVJlZmVyIHRvCi0uQ20gQWNjZXB0RW52Ci1pbgotLlhyIHNzaGRfY29uZmlnIDUKLWZvciBob3cgdG8gY29uZmlndXJlIHRoZSBzZXJ2ZXIuCi1WYXJpYWJsZXMgYXJlIHNwZWNpZmllZCBieSBuYW1lLCB3aGljaCBtYXkgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzLgotTXVsdGlwbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIG1heSBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBvciBzcHJlYWQKLWFjcm9zcyBtdWx0aXBsZQotLkNtIFNlbmRFbnYKLWRpcmVjdGl2ZXMuCi1UaGUgZGVmYXVsdCBpcyBub3QgdG8gc2VuZCBhbnkgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotLlBwCi1TZWUKLS5TeCBQQVRURVJOUwotZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGF0dGVybnMuCi0uSXQgQ20gU2VydmVyQWxpdmVDb3VudE1heAotU2V0cyB0aGUgbnVtYmVyIG9mIHNlcnZlciBhbGl2ZSBtZXNzYWdlcyAoc2VlIGJlbG93KSB3aGljaCBtYXkgYmUKLXNlbnQgd2l0aG91dAotLlhyIHNzaCAxCi1yZWNlaXZpbmcgYW55IG1lc3NhZ2VzIGJhY2sgZnJvbSB0aGUgc2VydmVyLgotSWYgdGhpcyB0aHJlc2hvbGQgaXMgcmVhY2hlZCB3aGlsZSBzZXJ2ZXIgYWxpdmUgbWVzc2FnZXMgYXJlIGJlaW5nIHNlbnQsCi1zc2ggd2lsbCBkaXNjb25uZWN0IGZyb20gdGhlIHNlcnZlciwgdGVybWluYXRpbmcgdGhlIHNlc3Npb24uCi1JdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSB1c2Ugb2Ygc2VydmVyIGFsaXZlIG1lc3NhZ2VzIGlzIHZlcnkKLWRpZmZlcmVudCBmcm9tCi0uQ20gVENQS2VlcEFsaXZlCi0oYmVsb3cpLgotVGhlIHNlcnZlciBhbGl2ZSBtZXNzYWdlcyBhcmUgc2VudCB0aHJvdWdoIHRoZSBlbmNyeXB0ZWQgY2hhbm5lbAotYW5kIHRoZXJlZm9yZSB3aWxsIG5vdCBiZSBzcG9vZmFibGUuCi1UaGUgVENQIGtlZXBhbGl2ZSBvcHRpb24gZW5hYmxlZCBieQotLkNtIFRDUEtlZXBBbGl2ZQotaXMgc3Bvb2ZhYmxlLgotVGhlIHNlcnZlciBhbGl2ZSBtZWNoYW5pc20gaXMgdmFsdWFibGUgd2hlbiB0aGUgY2xpZW50IG9yCi1zZXJ2ZXIgZGVwZW5kIG9uIGtub3dpbmcgd2hlbiBhIGNvbm5lY3Rpb24gaGFzIGJlY29tZSBpbmFjdGl2ZS4KLS5QcAotVGhlIGRlZmF1bHQgdmFsdWUgaXMgMy4KLUlmLCBmb3IgZXhhbXBsZSwKLS5DbSBTZXJ2ZXJBbGl2ZUludGVydmFsCi0oc2VlIGJlbG93KSBpcyBzZXQgdG8gMTUgYW5kCi0uQ20gU2VydmVyQWxpdmVDb3VudE1heAotaXMgbGVmdCBhdCB0aGUgZGVmYXVsdCwgaWYgdGhlIHNlcnZlciBiZWNvbWVzIHVucmVzcG9uc2l2ZSwKLXNzaCB3aWxsIGRpc2Nvbm5lY3QgYWZ0ZXIgYXBwcm94aW1hdGVseSA0NSBzZWNvbmRzLgotVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KLS5JdCBDbSBTZXJ2ZXJBbGl2ZUludGVydmFsCi1TZXRzIGEgdGltZW91dCBpbnRlcnZhbCBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIGlmIG5vIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQKLWZyb20gdGhlIHNlcnZlciwKLS5YciBzc2ggMQotd2lsbCBzZW5kIGEgbWVzc2FnZSB0aHJvdWdoIHRoZSBlbmNyeXB0ZWQKLWNoYW5uZWwgdG8gcmVxdWVzdCBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4KLVRoZSBkZWZhdWx0Ci1pcyAwLCBpbmRpY2F0aW5nIHRoYXQgdGhlc2UgbWVzc2FnZXMgd2lsbCBub3QgYmUgc2VudCB0byB0aGUgc2VydmVyLgotVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KLS5JdCBDbSBTdHJpY3RIb3N0S2V5Q2hlY2tpbmcKLUlmIHRoaXMgZmxhZyBpcyBzZXQgdG8KLS5EcSB5ZXMgLAotLlhyIHNzaCAxCi13aWxsIG5ldmVyIGF1dG9tYXRpY2FsbHkgYWRkIGhvc3Qga2V5cyB0byB0aGUKLS5QYSB+Ly5zc2gva25vd25faG9zdHMKLWZpbGUsIGFuZCByZWZ1c2VzIHRvIGNvbm5lY3QgdG8gaG9zdHMgd2hvc2UgaG9zdCBrZXkgaGFzIGNoYW5nZWQuCi1UaGlzIHByb3ZpZGVzIG1heGltdW0gcHJvdGVjdGlvbiBhZ2FpbnN0IHRyb2phbiBob3JzZSBhdHRhY2tzLAotdGhvdWdoIGl0IGNhbiBiZSBhbm5veWluZyB3aGVuIHRoZQotLlBhIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cwotZmlsZSBpcyBwb29ybHkgbWFpbnRhaW5lZCBvciB3aGVuIGNvbm5lY3Rpb25zIHRvIG5ldyBob3N0cyBhcmUKLWZyZXF1ZW50bHkgbWFkZS4KLVRoaXMgb3B0aW9uIGZvcmNlcyB0aGUgdXNlciB0byBtYW51YWxseQotYWRkIGFsbCBuZXcgaG9zdHMuCi1JZiB0aGlzIGZsYWcgaXMgc2V0IHRvCi0uRHEgbm8gLAotc3NoIHdpbGwgYXV0b21hdGljYWxseSBhZGQgbmV3IGhvc3Qga2V5cyB0byB0aGUKLXVzZXIga25vd24gaG9zdHMgZmlsZXMuCi1JZiB0aGlzIGZsYWcgaXMgc2V0IHRvCi0uRHEgYXNrICwKLW5ldyBob3N0IGtleXMKLXdpbGwgYmUgYWRkZWQgdG8gdGhlIHVzZXIga25vd24gaG9zdCBmaWxlcyBvbmx5IGFmdGVyIHRoZSB1c2VyCi1oYXMgY29uZmlybWVkIHRoYXQgaXMgd2hhdCB0aGV5IHJlYWxseSB3YW50IHRvIGRvLCBhbmQKLXNzaCB3aWxsIHJlZnVzZSB0byBjb25uZWN0IHRvIGhvc3RzIHdob3NlIGhvc3Qga2V5IGhhcyBjaGFuZ2VkLgotVGhlIGhvc3Qga2V5cyBvZgota25vd24gaG9zdHMgd2lsbCBiZSB2ZXJpZmllZCBhdXRvbWF0aWNhbGx5IGluIGFsbCBjYXNlcy4KLVRoZSBhcmd1bWVudCBtdXN0IGJlCi0uRHEgeWVzICwKLS5EcSBubyAsCi1vcgotLkRxIGFzayAuCi1UaGUgZGVmYXVsdCBpcwotLkRxIGFzayAuCi0uSXQgQ20gVENQS2VlcEFsaXZlCi1TcGVjaWZpZXMgd2hldGhlciB0aGUgc3lzdGVtIHNob3VsZCBzZW5kIFRDUCBrZWVwYWxpdmUgbWVzc2FnZXMgdG8gdGhlCi1vdGhlciBzaWRlLgotSWYgdGhleSBhcmUgc2VudCwgZGVhdGggb2YgdGhlIGNvbm5lY3Rpb24gb3IgY3Jhc2ggb2Ygb25lCi1vZiB0aGUgbWFjaGluZXMgd2lsbCBiZSBwcm9wZXJseSBub3RpY2VkLgotSG93ZXZlciwgdGhpcyBtZWFucyB0aGF0Ci1jb25uZWN0aW9ucyB3aWxsIGRpZSBpZiB0aGUgcm91dGUgaXMgZG93biB0ZW1wb3JhcmlseSwgYW5kIHNvbWUgcGVvcGxlCi1maW5kIGl0IGFubm95aW5nLgotLlBwCi1UaGUgZGVmYXVsdCBpcwotLkRxIHllcwotKHRvIHNlbmQgVENQIGtlZXBhbGl2ZSBtZXNzYWdlcyksIGFuZCB0aGUgY2xpZW50IHdpbGwgbm90aWNlCi1pZiB0aGUgbmV0d29yayBnb2VzIGRvd24gb3IgdGhlIHJlbW90ZSBob3N0IGRpZXMuCi1UaGlzIGlzIGltcG9ydGFudCBpbiBzY3JpcHRzLCBhbmQgbWFueSB1c2VycyB3YW50IGl0IHRvby4KLS5QcAotVG8gZGlzYWJsZSBUQ1Aga2VlcGFsaXZlIG1lc3NhZ2VzLCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0bwotLkRxIG5vIC4KLS5JdCBDbSBUdW5uZWwKLVJlcXVlc3QKLS5YciB0dW4gNAotZGV2aWNlIGZvcndhcmRpbmcgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLgotVGhlIGFyZ3VtZW50IG11c3QgYmUKLS5EcSB5ZXMgLAotLkRxIHBvaW50LXRvLXBvaW50Ci0obGF5ZXIgMyksCi0uRHEgZXRoZXJuZXQKLShsYXllciAyKSwKLW9yCi0uRHEgbm8gLgotU3BlY2lmeWluZwotLkRxIHllcwotcmVxdWVzdHMgdGhlIGRlZmF1bHQgdHVubmVsIG1vZGUsIHdoaWNoIGlzCi0uRHEgcG9pbnQtdG8tcG9pbnQgLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi0uSXQgQ20gVHVubmVsRGV2aWNlCi1TcGVjaWZpZXMgdGhlCi0uWHIgdHVuIDQKLWRldmljZXMgdG8gb3BlbiBvbiB0aGUgY2xpZW50Ci0uUHEgQXIgbG9jYWxfdHVuCi1hbmQgdGhlIHNlcnZlcgotLlBxIEFyIHJlbW90ZV90dW4gLgotLlBwCi1UaGUgYXJndW1lbnQgbXVzdCBiZQotLlNtIG9mZgotLkFyIGxvY2FsX3R1biBPcCA6IEFyIHJlbW90ZV90dW4gLgotLlNtIG9uCi1UaGUgZGV2aWNlcyBtYXkgYmUgc3BlY2lmaWVkIGJ5IG51bWVyaWNhbCBJRCBvciB0aGUga2V5d29yZAotLkRxIGFueSAsCi13aGljaCB1c2VzIHRoZSBuZXh0IGF2YWlsYWJsZSB0dW5uZWwgZGV2aWNlLgotSWYKLS5BciByZW1vdGVfdHVuCi1pcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0bwotLkRxIGFueSAuCi1UaGUgZGVmYXVsdCBpcwotLkRxIGFueTphbnkgLgotLkl0IENtIFVzZVByaXZpbGVnZWRQb3J0Ci1TcGVjaWZpZXMgd2hldGhlciB0byB1c2UgYSBwcml2aWxlZ2VkIHBvcnQgZm9yIG91dGdvaW5nIGNvbm5lY3Rpb25zLgotVGhlIGFyZ3VtZW50IG11c3QgYmUKLS5EcSB5ZXMKLW9yCi0uRHEgbm8gLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi1JZiBzZXQgdG8KLS5EcSB5ZXMgLAotLlhyIHNzaCAxCi1tdXN0IGJlIHNldHVpZCByb290LgotTm90ZSB0aGF0IHRoaXMgb3B0aW9uIG11c3QgYmUgc2V0IHRvCi0uRHEgeWVzCi1mb3IKLS5DbSBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbgotd2l0aCBvbGRlciBzZXJ2ZXJzLgotLkl0IENtIFVzZXIKLVNwZWNpZmllcyB0aGUgdXNlciB0byBsb2cgaW4gYXMuCi1UaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBhIGRpZmZlcmVudCB1c2VyIG5hbWUgaXMgdXNlZCBvbiBkaWZmZXJlbnQgbWFjaGluZXMuCi1UaGlzIHNhdmVzIHRoZSB0cm91YmxlIG9mCi1oYXZpbmcgdG8gcmVtZW1iZXIgdG8gZ2l2ZSB0aGUgdXNlciBuYW1lIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0uSXQgQ20gVXNlcktub3duSG9zdHNGaWxlCi1TcGVjaWZpZXMgb25lIG9yIG1vcmUgZmlsZXMgdG8gdXNlIGZvciB0aGUgdXNlcgotaG9zdCBrZXkgZGF0YWJhc2UsIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLgotVGhlIGRlZmF1bHQgaXMKLS5QYSB+Ly5zc2gva25vd25faG9zdHMgLAotLlBhIH4vLnNzaC9rbm93bl9ob3N0czIgLgotLkl0IENtIFZlcmlmeUhvc3RLZXlETlMKLVNwZWNpZmllcyB3aGV0aGVyIHRvIHZlcmlmeSB0aGUgcmVtb3RlIGtleSB1c2luZyBETlMgYW5kIFNTSEZQIHJlc291cmNlCi1yZWNvcmRzLgotSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvCi0uRHEgeWVzICwKLXRoZSBjbGllbnQgd2lsbCBpbXBsaWNpdGx5IHRydXN0IGtleXMgdGhhdCBtYXRjaCBhIHNlY3VyZSBmaW5nZXJwcmludAotZnJvbSBETlMuCi1JbnNlY3VyZSBmaW5nZXJwcmludHMgd2lsbCBiZSBoYW5kbGVkIGFzIGlmIHRoaXMgb3B0aW9uIHdhcyBzZXQgdG8KLS5EcSBhc2sgLgotSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvCi0uRHEgYXNrICwKLWluZm9ybWF0aW9uIG9uIGZpbmdlcnByaW50IG1hdGNoIHdpbGwgYmUgZGlzcGxheWVkLCBidXQgdGhlIHVzZXIgd2lsbCBzdGlsbAotbmVlZCB0byBjb25maXJtIG5ldyBob3N0IGtleXMgYWNjb3JkaW5nIHRvIHRoZQotLkNtIFN0cmljdEhvc3RLZXlDaGVja2luZwotb3B0aW9uLgotVGhlIGFyZ3VtZW50IG11c3QgYmUKLS5EcSB5ZXMgLAotLkRxIG5vICwKLW9yCi0uRHEgYXNrIC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgbm8gLgotTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCi0uUHAKLVNlZSBhbHNvCi0uU3ggVkVSSUZZSU5HIEhPU1QgS0VZUwotaW4KLS5YciBzc2ggMSAuCi0uSXQgQ20gVmlzdWFsSG9zdEtleQotSWYgdGhpcyBmbGFnIGlzIHNldCB0bwotLkRxIHllcyAsCi1hbiBBU0NJSSBhcnQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlbW90ZSBob3N0IGtleSBmaW5nZXJwcmludCBpcwotcHJpbnRlZCBpbiBhZGRpdGlvbiB0byB0aGUgaGV4IGZpbmdlcnByaW50IHN0cmluZyBhdCBsb2dpbiBhbmQKLWZvciB1bmtub3duIGhvc3Qga2V5cy4KLUlmIHRoaXMgZmxhZyBpcyBzZXQgdG8KLS5EcSBubyAsCi1ubyBmaW5nZXJwcmludCBzdHJpbmdzIGFyZSBwcmludGVkIGF0IGxvZ2luIGFuZAotb25seSB0aGUgaGV4IGZpbmdlcnByaW50IHN0cmluZyB3aWxsIGJlIHByaW50ZWQgZm9yIHVua25vd24gaG9zdCBrZXlzLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi0uSXQgQ20gWEF1dGhMb2NhdGlvbgotU3BlY2lmaWVzIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZQotLlhyIHhhdXRoIDEKLXByb2dyYW0uCi1UaGUgZGVmYXVsdCBpcwotLlBhIC91c3IvWDExUjYvYmluL3hhdXRoIC4KLS5FbAotLlNoIFBBVFRFUk5TCi1BCi0uRW0gcGF0dGVybgotY29uc2lzdHMgb2YgemVybyBvciBtb3JlIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMsCi0uU3EgKgotKGEgd2lsZGNhcmQgdGhhdCBtYXRjaGVzIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzKSwKLW9yCi0uU3EgP1wmCi0oYSB3aWxkY2FyZCB0aGF0IG1hdGNoZXMgZXhhY3RseSBvbmUgY2hhcmFjdGVyKS4KLUZvciBleGFtcGxlLCB0byBzcGVjaWZ5IGEgc2V0IG9mIGRlY2xhcmF0aW9ucyBmb3IgYW55IGhvc3QgaW4gdGhlCi0uRHEgLmNvLnVrCi1zZXQgb2YgZG9tYWlucywKLXRoZSBmb2xsb3dpbmcgcGF0dGVybiBjb3VsZCBiZSB1c2VkOgotLlBwCi0uRGwgSG9zdCAqLmNvLnVrCi0uUHAKLVRoZSBmb2xsb3dpbmcgcGF0dGVybgotd291bGQgbWF0Y2ggYW55IGhvc3QgaW4gdGhlIDE5Mi4xNjguMC5bMC05XSBuZXR3b3JrIHJhbmdlOgotLlBwCi0uRGwgSG9zdCAxOTIuMTY4LjAuPwotLlBwCi1BCi0uRW0gcGF0dGVybi1saXN0Ci1pcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zLgotUGF0dGVybnMgd2l0aGluIHBhdHRlcm4tbGlzdHMgbWF5IGJlIG5lZ2F0ZWQKLWJ5IHByZWNlZGluZyB0aGVtIHdpdGggYW4gZXhjbGFtYXRpb24gbWFyawotLlBxIFNxICFcJiAuCi1Gb3IgZXhhbXBsZSwKLXRvIGFsbG93IGEga2V5IHRvIGJlIHVzZWQgZnJvbSBhbnl3aGVyZSB3aXRoaW4gYW4gb3JnYW5pc2F0aW9uCi1leGNlcHQgZnJvbSB0aGUKLS5EcSBkaWFsdXAKLXBvb2wsCi10aGUgZm9sbG93aW5nIGVudHJ5IChpbiBhdXRob3JpemVkX2tleXMpIGNvdWxkIGJlIHVzZWQ6Ci0uUHAKLS5EbCBmcm9tPVwmIiEqLmRpYWx1cC5leGFtcGxlLmNvbSwqLmV4YW1wbGUuY29tXCYiCi0uU2ggRklMRVMKLS5CbCAtdGFnIC13aWR0aCBEcwotLkl0IFBhIH4vLnNzaC9jb25maWcKLVRoaXMgaXMgdGhlIHBlci11c2VyIGNvbmZpZ3VyYXRpb24gZmlsZS4KLVRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIGRlc2NyaWJlZCBhYm92ZS4KLVRoaXMgZmlsZSBpcyB1c2VkIGJ5IHRoZSBTU0ggY2xpZW50LgotQmVjYXVzZSBvZiB0aGUgcG90ZW50aWFsIGZvciBhYnVzZSwgdGhpcyBmaWxlIG11c3QgaGF2ZSBzdHJpY3QgcGVybWlzc2lvbnM6Ci1yZWFkL3dyaXRlIGZvciB0aGUgdXNlciwgYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KLS5JdCBQYSAvZXRjL3NzaC9zc2hfY29uZmlnCi1TeXN0ZW13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLVRoaXMgZmlsZSBwcm92aWRlcyBkZWZhdWx0cyBmb3IgdGhvc2UKLXZhbHVlcyB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkIGluIHRoZSB1c2VyJ3MgY29uZmlndXJhdGlvbiBmaWxlLCBhbmQKLWZvciB0aG9zZSB1c2VycyB3aG8gZG8gbm90IGhhdmUgYSBjb25maWd1cmF0aW9uIGZpbGUuCi1UaGlzIGZpbGUgbXVzdCBiZSB3b3JsZC1yZWFkYWJsZS4KLS5FbAotLlNoIFNFRSBBTFNPCi0uWHIgc3NoIDEKLS5TaCBBVVRIT1JTCi1PcGVuU1NIIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgYW5kIGZyZWUKLXNzaCAxLjIuMTIgcmVsZWFzZSBieSBUYXR1IFlsb25lbi4KLUFhcm9uIENhbXBiZWxsLCBCb2IgQmVjaywgTWFya3VzIEZyaWVkbCwgTmllbHMgUHJvdm9zLAotVGhlbyBkZSBSYWFkdCBhbmQgRHVnIFNvbmcKLXJlbW92ZWQgbWFueSBidWdzLCByZS1hZGRlZCBuZXdlciBmZWF0dXJlcyBhbmQKLWNyZWF0ZWQgT3BlblNTSC4KLU1hcmt1cyBGcmllZGwgY29udHJpYnV0ZWQgdGhlIHN1cHBvcnQgZm9yIFNTSAotcHJvdG9jb2wgdmVyc2lvbnMgMS41IGFuZCAyLjAuCmRpZmYgLS1naXQgYS9zc2hjb25uZWN0LmMgYi9zc2hjb25uZWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZTcyNjYuLjAwMDAwMDAKLS0tIGEvc3NoY29ubmVjdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5MSArMCwwIEBACi0vKiAkT3BlbkJTRDogc3NoY29ubmVjdC5jLHYgMS4yMzQgMjAxMS8wNS8yNCAwNzoxNTo0NyBkam0gRXhwICQgKi8KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiBDb2RlIHRvIGNvbm5lY3QgdG8gYSByZW1vdGUgaG9zdCwgYW5kIHRvIHBlcmZvcm0gdGhlIGNsaWVudCBzaWRlIG9mIHRoZQotICogbG9naW4gKGF1dGhlbnRpY2F0aW9uKSBkaWFsb2cuCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaWZkZWYgSEFWRV9QQVRIU19ICi0jaW5jbHVkZSA8cGF0aHMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAiaG9zdGZpbGUuaCIKLSNpbmNsdWRlICJzc2guaCIKLSNpbmNsdWRlICJyc2EuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJ1aWRzd2FwLmgiCi0jaW5jbHVkZSAiY29tcGF0LmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAic3NoY29ubmVjdC5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAicmVhZGNvbmYuaCIKLSNpbmNsdWRlICJhdG9taWNpby5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJkbnMuaCIKLSNpbmNsdWRlICJyb2FtaW5nLmgiCi0jaW5jbHVkZSAic3NoMi5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotY2hhciAqY2xpZW50X3ZlcnNpb25fc3RyaW5nID0gTlVMTDsKLWNoYXIgKnNlcnZlcl92ZXJzaW9uX3N0cmluZyA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQgbWF0Y2hpbmdfaG9zdF9rZXlfZG5zID0gMDsKLQotc3RhdGljIHBpZF90IHByb3h5X2NvbW1hbmRfcGlkID0gMDsKLQotLyogaW1wb3J0ICovCi1leHRlcm4gT3B0aW9ucyBvcHRpb25zOwotZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7Ci1leHRlcm4gdWlkX3Qgb3JpZ2luYWxfcmVhbF91aWQ7Ci1leHRlcm4gdWlkX3Qgb3JpZ2luYWxfZWZmZWN0aXZlX3VpZDsKLQotc3RhdGljIGludCBzaG93X290aGVyX2tleXMoc3RydWN0IGhvc3RrZXlzICosIEtleSAqKTsKLXN0YXRpYyB2b2lkIHdhcm5fY2hhbmdlZF9rZXkoS2V5ICopOwotCi0vKgotICogQ29ubmVjdCB0byB0aGUgZ2l2ZW4gc3NoIHNlcnZlciB1c2luZyBhIHByb3h5IGNvbW1hbmQuCi0gKi8KLXN0YXRpYyBpbnQKLXNzaF9wcm94eV9jb25uZWN0KGNvbnN0IGNoYXIgKmhvc3QsIHVfc2hvcnQgcG9ydCwgY29uc3QgY2hhciAqcHJveHlfY29tbWFuZCkKLXsKLQljaGFyICpjb21tYW5kX3N0cmluZywgKnRtcDsKLQlpbnQgcGluWzJdLCBwb3V0WzJdOwotCXBpZF90IHBpZDsKLQljaGFyICpzaGVsbCwgc3RycG9ydFtOSV9NQVhTRVJWXTsKLQotCWlmICgoc2hlbGwgPSBnZXRlbnYoIlNIRUxMIikpID09IE5VTEwgfHwgKnNoZWxsID09ICdcMCcpCi0JCXNoZWxsID0gX1BBVEhfQlNIRUxMOwotCi0JLyogQ29udmVydCB0aGUgcG9ydCBudW1iZXIgaW50byBhIHN0cmluZy4gKi8KLQlzbnByaW50ZihzdHJwb3J0LCBzaXplb2Ygc3RycG9ydCwgIiVodSIsIHBvcnQpOwotCi0JLyoKLQkgKiBCdWlsZCB0aGUgZmluYWwgY29tbWFuZCBzdHJpbmcgaW4gdGhlIGJ1ZmZlciBieSBtYWtpbmcgdGhlCi0JICogYXBwcm9wcmlhdGUgc3Vic3RpdHV0aW9ucyB0byB0aGUgZ2l2ZW4gcHJveHkgY29tbWFuZC4KLQkgKgotCSAqIFVzZSAiZXhlYyIgdG8gYXZvaWQgInNoIC1jIiBwcm9jZXNzZXMgb24gc29tZSBwbGF0Zm9ybXMKLQkgKiAoZS5nLiBTb2xhcmlzKQotCSAqLwotCXhhc3ByaW50ZigmdG1wLCAiZXhlYyAlcyIsIHByb3h5X2NvbW1hbmQpOwotCWNvbW1hbmRfc3RyaW5nID0gcGVyY2VudF9leHBhbmQodG1wLCAiaCIsIGhvc3QsICJwIiwgc3RycG9ydCwKLQkgICAgInIiLCBvcHRpb25zLnVzZXIsIChjaGFyICopTlVMTCk7Ci0JeGZyZWUodG1wKTsKLQotCS8qIENyZWF0ZSBwaXBlcyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBwcm94eS4gKi8KLQlpZiAocGlwZShwaW4pIDwgMCB8fCBwaXBlKHBvdXQpIDwgMCkKLQkJZmF0YWwoIkNvdWxkIG5vdCBjcmVhdGUgcGlwZXMgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgcHJveHk6ICUuMTAwcyIsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCi0JZGVidWcoIkV4ZWN1dGluZyBwcm94eSBjb21tYW5kOiAlLjUwMHMiLCBjb21tYW5kX3N0cmluZyk7Ci0KLQkvKiBGb3JrIGFuZCBleGVjdXRlIHRoZSBwcm94eSBjb21tYW5kLiAqLwotCWlmICgocGlkID0gZm9yaygpKSA9PSAwKSB7Ci0JCWNoYXIgKmFyZ3ZbMTBdOwotCi0JCS8qIENoaWxkLiAgUGVybWFuZW50bHkgZ2l2ZSB1cCBzdXBlcnVzZXIgcHJpdmlsZWdlcy4gKi8KLQkJcGVybWFuZW50bHlfZHJvcF9zdWlkKG9yaWdpbmFsX3JlYWxfdWlkKTsKLQotCQkvKiBSZWRpcmVjdCBzdGRpbiBhbmQgc3Rkb3V0LiAqLwotCQljbG9zZShwaW5bMV0pOwotCQlpZiAocGluWzBdICE9IDApIHsKLQkJCWlmIChkdXAyKHBpblswXSwgMCkgPCAwKQotCQkJCXBlcnJvcigiZHVwMiBzdGRpbiIpOwotCQkJY2xvc2UocGluWzBdKTsKLQkJfQotCQljbG9zZShwb3V0WzBdKTsKLQkJaWYgKGR1cDIocG91dFsxXSwgMSkgPCAwKQotCQkJcGVycm9yKCJkdXAyIHN0ZG91dCIpOwotCQkvKiBDYW5ub3QgYmUgMSBiZWNhdXNlIHBpbiBhbGxvY2F0ZWQgdHdvIGRlc2NyaXB0b3JzLiAqLwotCQljbG9zZShwb3V0WzFdKTsKLQotCQkvKiBTdGRlcnIgaXMgbGVmdCBhcyBpdCBpcyBzbyB0aGF0IGVycm9yIG1lc3NhZ2VzIGdldAotCQkgICBwcmludGVkIG9uIHRoZSB1c2VyJ3MgdGVybWluYWwuICovCi0JCWFyZ3ZbMF0gPSBzaGVsbDsKLQkJYXJndlsxXSA9ICItYyI7Ci0JCWFyZ3ZbMl0gPSBjb21tYW5kX3N0cmluZzsKLQkJYXJndlszXSA9IE5VTEw7Ci0KLQkJLyogRXhlY3V0ZSB0aGUgcHJveHkgY29tbWFuZC4gIE5vdGUgdGhhdCB3ZSBnYXZlIHVwIGFueQotCQkgICBleHRyYSBwcml2aWxlZ2VzIGFib3ZlLiAqLwotCQlzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7Ci0JCWV4ZWN2KGFyZ3ZbMF0sIGFyZ3YpOwotCQlwZXJyb3IoYXJndlswXSk7Ci0JCWV4aXQoMSk7Ci0JfQotCS8qIFBhcmVudC4gKi8KLQlpZiAocGlkIDwgMCkKLQkJZmF0YWwoImZvcmsgZmFpbGVkOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCWVsc2UKLQkJcHJveHlfY29tbWFuZF9waWQgPSBwaWQ7IC8qIHNhdmUgcGlkIHRvIGNsZWFuIHVwIGxhdGVyICovCi0KLQkvKiBDbG9zZSBjaGlsZCBzaWRlIG9mIHRoZSBkZXNjcmlwdG9ycy4gKi8KLQljbG9zZShwaW5bMF0pOwotCWNsb3NlKHBvdXRbMV0pOwotCi0JLyogRnJlZSB0aGUgY29tbWFuZCBuYW1lLiAqLwotCXhmcmVlKGNvbW1hbmRfc3RyaW5nKTsKLQotCS8qIFNldCB0aGUgY29ubmVjdGlvbiBmaWxlIGRlc2NyaXB0b3JzLiAqLwotCXBhY2tldF9zZXRfY29ubmVjdGlvbihwb3V0WzBdLCBwaW5bMV0pOwotCXBhY2tldF9zZXRfdGltZW91dChvcHRpb25zLnNlcnZlcl9hbGl2ZV9pbnRlcnZhbCwKLQkgICAgb3B0aW9ucy5zZXJ2ZXJfYWxpdmVfY291bnRfbWF4KTsKLQotCS8qIEluZGljYXRlIE9LIHJldHVybiAqLwotCXJldHVybiAwOwotfQotCi12b2lkCi1zc2hfa2lsbF9wcm94eV9jb21tYW5kKHZvaWQpCi17Ci0JLyoKLQkgKiBTZW5kIFNJR0hVUCB0byBwcm94eSBjb21tYW5kIGlmIHVzZWQuIFdlIGRvbid0IHdhaXQoKSBpbgotCSAqIGNhc2UgaXQgaGFuZ3MgYW5kIGluc3RlYWQgcmVseSBvbiBpbml0IHRvIHJlYXAgdGhlIGNoaWxkCi0JICovCi0JaWYgKHByb3h5X2NvbW1hbmRfcGlkID4gMSkKLQkJa2lsbChwcm94eV9jb21tYW5kX3BpZCwgU0lHSFVQKTsKLX0KLQotLyoKLSAqIENyZWF0ZXMgYSAocG9zc2libHkgcHJpdmlsZWdlZCkgc29ja2V0IGZvciB1c2UgYXMgdGhlIHNzaCBjb25uZWN0aW9uLgotICovCi1zdGF0aWMgaW50Ci1zc2hfY3JlYXRlX3NvY2tldChpbnQgcHJpdmlsZWdlZCwgc3RydWN0IGFkZHJpbmZvICphaSkKLXsKLQlpbnQgc29jaywgZ2FpZXJyOwotCXN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlczsKLQotCS8qCi0JICogSWYgd2UgYXJlIHJ1bm5pbmcgYXMgcm9vdCBhbmQgd2FudCB0byBjb25uZWN0IHRvIGEgcHJpdmlsZWdlZAotCSAqIHBvcnQsIGJpbmQgb3VyIG93biBzb2NrZXQgdG8gYSBwcml2aWxlZ2VkIHBvcnQuCi0JICovCi0JaWYgKHByaXZpbGVnZWQpIHsKLQkJaW50IHAgPSBJUFBPUlRfUkVTRVJWRUQgLSAxOwotCQlQUklWX1NUQVJUOwotCQlzb2NrID0gcnJlc3Zwb3J0X2FmKCZwLCBhaS0+YWlfZmFtaWx5KTsKLQkJUFJJVl9FTkQ7Ci0JCWlmIChzb2NrIDwgMCkKLQkJCWVycm9yKCJycmVzdnBvcnQ6IGFmPSVkICUuMTAwcyIsIGFpLT5haV9mYW1pbHksCi0JCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJZWxzZQotCQkJZGVidWcoIkFsbG9jYXRlZCBsb2NhbCBwb3J0ICVkLiIsIHApOwotCQlyZXR1cm4gc29jazsKLQl9Ci0Jc29jayA9IHNvY2tldChhaS0+YWlfZmFtaWx5LCBhaS0+YWlfc29ja3R5cGUsIGFpLT5haV9wcm90b2NvbCk7Ci0JaWYgKHNvY2sgPCAwKSB7Ci0JCWVycm9yKCJzb2NrZXQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZmNudGwoc29jaywgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Ci0KLQkvKiBCaW5kIHRoZSBzb2NrZXQgdG8gYW4gYWx0ZXJuYXRpdmUgbG9jYWwgSVAgYWRkcmVzcyAqLwotCWlmIChvcHRpb25zLmJpbmRfYWRkcmVzcyA9PSBOVUxMKQotCQlyZXR1cm4gc29jazsKLQotCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotCWhpbnRzLmFpX2ZhbWlseSA9IGFpLT5haV9mYW1pbHk7Ci0JaGludHMuYWlfc29ja3R5cGUgPSBhaS0+YWlfc29ja3R5cGU7Ci0JaGludHMuYWlfcHJvdG9jb2wgPSBhaS0+YWlfcHJvdG9jb2w7Ci0JaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOwotCWdhaWVyciA9IGdldGFkZHJpbmZvKG9wdGlvbnMuYmluZF9hZGRyZXNzLCBOVUxMLCAmaGludHMsICZyZXMpOwotCWlmIChnYWllcnIpIHsKLQkJZXJyb3IoImdldGFkZHJpbmZvOiAlczogJXMiLCBvcHRpb25zLmJpbmRfYWRkcmVzcywKLQkJICAgIHNzaF9nYWlfc3RyZXJyb3IoZ2FpZXJyKSk7Ci0JCWNsb3NlKHNvY2spOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChiaW5kKHNvY2ssIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKSA8IDApIHsKLQkJZXJyb3IoImJpbmQ6ICVzOiAlcyIsIG9wdGlvbnMuYmluZF9hZGRyZXNzLCBzdHJlcnJvcihlcnJubykpOwotCQljbG9zZShzb2NrKTsKLQkJZnJlZWFkZHJpbmZvKHJlcyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZnJlZWFkZHJpbmZvKHJlcyk7Ci0JcmV0dXJuIHNvY2s7Ci19Ci0KLXN0YXRpYyBpbnQKLXRpbWVvdXRfY29ubmVjdChpbnQgc29ja2ZkLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNlcnZfYWRkciwKLSAgICBzb2NrbGVuX3QgYWRkcmxlbiwgaW50ICp0aW1lb3V0cCkKLXsKLQlmZF9zZXQgKmZkc2V0OwotCXN0cnVjdCB0aW1ldmFsIHR2LCB0X3N0YXJ0OwotCXNvY2tsZW5fdCBvcHRsZW47Ci0JaW50IG9wdHZhbCwgcmMsIHJlc3VsdCA9IC0xOwotCi0JZ2V0dGltZW9mZGF5KCZ0X3N0YXJ0LCBOVUxMKTsKLQotCWlmICgqdGltZW91dHAgPD0gMCkgewotCQlyZXN1bHQgPSBjb25uZWN0KHNvY2tmZCwgc2Vydl9hZGRyLCBhZGRybGVuKTsKLQkJZ290byBkb25lOwotCX0KLQotCXNldF9ub25ibG9jayhzb2NrZmQpOwotCXJjID0gY29ubmVjdChzb2NrZmQsIHNlcnZfYWRkciwgYWRkcmxlbik7Ci0JaWYgKHJjID09IDApIHsKLQkJdW5zZXRfbm9uYmxvY2soc29ja2ZkKTsKLQkJcmVzdWx0ID0gMDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoZXJybm8gIT0gRUlOUFJPR1JFU1MpIHsKLQkJcmVzdWx0ID0gLTE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlmZHNldCA9IChmZF9zZXQgKil4Y2FsbG9jKGhvd21hbnkoc29ja2ZkICsgMSwgTkZEQklUUyksCi0JICAgIHNpemVvZihmZF9tYXNrKSk7Ci0JRkRfU0VUKHNvY2tmZCwgZmRzZXQpOwotCW1zX3RvX3RpbWV2YWwoJnR2LCAqdGltZW91dHApOwotCi0JZm9yICg7OykgewotCQlyYyA9IHNlbGVjdChzb2NrZmQgKyAxLCBOVUxMLCBmZHNldCwgTlVMTCwgJnR2KTsKLQkJaWYgKHJjICE9IC0xIHx8IGVycm5vICE9IEVJTlRSKQotCQkJYnJlYWs7Ci0JfQotCi0Jc3dpdGNoIChyYykgewotCWNhc2UgMDoKLQkJLyogVGltZWQgb3V0ICovCi0JCWVycm5vID0gRVRJTUVET1VUOwotCQlicmVhazsKLQljYXNlIC0xOgotCQkvKiBTZWxlY3QgZXJyb3IgKi8KLQkJZGVidWcoInNlbGVjdDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCS8qIENvbXBsZXRlZCBvciBmYWlsZWQgKi8KLQkJb3B0dmFsID0gMDsKLQkJb3B0bGVuID0gc2l6ZW9mKG9wdHZhbCk7Ci0JCWlmIChnZXRzb2Nrb3B0KHNvY2tmZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsICZvcHR2YWwsCi0JCSAgICAmb3B0bGVuKSA9PSAtMSkgewotCQkJZGVidWcoImdldHNvY2tvcHQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChvcHR2YWwgIT0gMCkgewotCQkJZXJybm8gPSBvcHR2YWw7Ci0JCQlicmVhazsKLQkJfQotCQlyZXN1bHQgPSAwOwotCQl1bnNldF9ub25ibG9jayhzb2NrZmQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBTaG91bGQgbm90IG9jY3VyICovCi0JCWZhdGFsKCJCb2d1cyByZXR1cm4gKCVkKSBmcm9tIHNlbGVjdCgpIiwgcmMpOwotCX0KLQotCXhmcmVlKGZkc2V0KTsKLQotIGRvbmU6Ci0gCWlmIChyZXN1bHQgPT0gMCAmJiAqdGltZW91dHAgPiAwKSB7Ci0JCW1zX3N1YnRyYWN0X2RpZmYoJnRfc3RhcnQsIHRpbWVvdXRwKTsKLQkJaWYgKCp0aW1lb3V0cCA8PSAwKSB7Ci0JCQllcnJubyA9IEVUSU1FRE9VVDsKLQkJCXJlc3VsdCA9IC0xOwotCQl9Ci0JfQotCi0JcmV0dXJuIChyZXN1bHQpOwotfQotCi0vKgotICogT3BlbnMgYSBUQ1AvSVAgY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIHNlcnZlciBvbiB0aGUgZ2l2ZW4gaG9zdC4KLSAqIFRoZSBhZGRyZXNzIG9mIHRoZSByZW1vdGUgaG9zdCB3aWxsIGJlIHJldHVybmVkIGluIGhvc3RhZGRyLgotICogSWYgcG9ydCBpcyAwLCB0aGUgZGVmYXVsdCBwb3J0IHdpbGwgYmUgdXNlZC4gIElmIG5lZWRwcml2IGlzIHRydWUsCi0gKiBhIHByaXZpbGVnZWQgcG9ydCB3aWxsIGJlIGFsbG9jYXRlZCB0byBtYWtlIHRoZSBjb25uZWN0aW9uLgotICogVGhpcyByZXF1aXJlcyBzdXBlci11c2VyIHByaXZpbGVnZXMgaWYgbmVlZHByaXYgaXMgdHJ1ZS4KLSAqIENvbm5lY3Rpb25fYXR0ZW1wdHMgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmllcyAob25lIHBlcgotICogc2Vjb25kKS4gIElmIHByb3h5X2NvbW1hbmQgaXMgbm9uLU5VTEwsIGl0IHNwZWNpZmllcyB0aGUgY29tbWFuZCAod2l0aCAlaAotICogYW5kICVwIHN1YnN0aXR1dGVkIGZvciBob3N0IGFuZCBwb3J0LCByZXNwZWN0aXZlbHkpIHRvIHVzZSB0byBjb250YWN0Ci0gKiB0aGUgZGFlbW9uLgotICovCi1pbnQKLXNzaF9jb25uZWN0KGNvbnN0IGNoYXIgKmhvc3QsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICogaG9zdGFkZHIsCi0gICAgdV9zaG9ydCBwb3J0LCBpbnQgZmFtaWx5LCBpbnQgY29ubmVjdGlvbl9hdHRlbXB0cywgaW50ICp0aW1lb3V0X21zLAotICAgIGludCB3YW50X2tlZXBhbGl2ZSwgaW50IG5lZWRwcml2LCBjb25zdCBjaGFyICpwcm94eV9jb21tYW5kKQotewotCWludCBnYWllcnI7Ci0JaW50IG9uID0gMTsKLQlpbnQgc29jayA9IC0xLCBhdHRlbXB0OwotCWNoYXIgbnRvcFtOSV9NQVhIT1NUXSwgc3RycG9ydFtOSV9NQVhTRVJWXTsKLQlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaSwgKmFpdG9wOwotCi0JZGVidWcyKCJzc2hfY29ubmVjdDogbmVlZHByaXYgJWQiLCBuZWVkcHJpdik7Ci0KLQkvKiBJZiBhIHByb3h5IGNvbW1hbmQgaXMgZ2l2ZW4sIGNvbm5lY3QgdXNpbmcgaXQuICovCi0JaWYgKHByb3h5X2NvbW1hbmQgIT0gTlVMTCkKLQkJcmV0dXJuIHNzaF9wcm94eV9jb25uZWN0KGhvc3QsIHBvcnQsIHByb3h5X2NvbW1hbmQpOwotCi0JLyogTm8gcHJveHkgY29tbWFuZC4gKi8KLQotCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotCWhpbnRzLmFpX2ZhbWlseSA9IGZhbWlseTsKLQloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotCXNucHJpbnRmKHN0cnBvcnQsIHNpemVvZiBzdHJwb3J0LCAiJXUiLCBwb3J0KTsKLQlpZiAoKGdhaWVyciA9IGdldGFkZHJpbmZvKGhvc3QsIHN0cnBvcnQsICZoaW50cywgJmFpdG9wKSkgIT0gMCkKLQkJZmF0YWwoIiVzOiBDb3VsZCBub3QgcmVzb2x2ZSBob3N0bmFtZSAlLjEwMHM6ICVzIiwgX19wcm9nbmFtZSwKLQkJICAgIGhvc3QsIHNzaF9nYWlfc3RyZXJyb3IoZ2FpZXJyKSk7Ci0KLQlmb3IgKGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgY29ubmVjdGlvbl9hdHRlbXB0czsgYXR0ZW1wdCsrKSB7Ci0JCWlmIChhdHRlbXB0ID4gMCkgewotCQkJLyogU2xlZXAgYSBtb21lbnQgYmVmb3JlIHJldHJ5aW5nLiAqLwotCQkJc2xlZXAoMSk7Ci0JCQlkZWJ1ZygiVHJ5aW5nIGFnYWluLi4uIik7Ci0JCX0KLQkJLyoKLQkJICogTG9vcCB0aHJvdWdoIGFkZHJlc3NlcyBmb3IgdGhpcyBob3N0LCBhbmQgdHJ5IGVhY2ggb25lIGluCi0JCSAqIHNlcXVlbmNlIHVudGlsIHRoZSBjb25uZWN0aW9uIHN1Y2NlZWRzLgotCQkgKi8KLQkJZm9yIChhaSA9IGFpdG9wOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgewotCQkJaWYgKGFpLT5haV9mYW1pbHkgIT0gQUZfSU5FVCAmJiBhaS0+YWlfZmFtaWx5ICE9IEFGX0lORVQ2KQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGdldG5hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwKLQkJCSAgICBudG9wLCBzaXplb2YobnRvcCksIHN0cnBvcnQsIHNpemVvZihzdHJwb3J0KSwKLQkJCSAgICBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVikgIT0gMCkgewotCQkJCWVycm9yKCJzc2hfY29ubmVjdDogZ2V0bmFtZWluZm8gZmFpbGVkIik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlkZWJ1ZygiQ29ubmVjdGluZyB0byAlLjIwMHMgWyUuMTAwc10gcG9ydCAlcy4iLAotCQkJCWhvc3QsIG50b3AsIHN0cnBvcnQpOwotCi0JCQkvKiBDcmVhdGUgYSBzb2NrZXQgZm9yIGNvbm5lY3RpbmcuICovCi0JCQlzb2NrID0gc3NoX2NyZWF0ZV9zb2NrZXQobmVlZHByaXYsIGFpKTsKLQkJCWlmIChzb2NrIDwgMCkKLQkJCQkvKiBBbnkgZXJyb3IgaXMgYWxyZWFkeSBvdXRwdXQgKi8KLQkJCQljb250aW51ZTsKLQotCQkJaWYgKHRpbWVvdXRfY29ubmVjdChzb2NrLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4sCi0JCQkgICAgdGltZW91dF9tcykgPj0gMCkgewotCQkJCS8qIFN1Y2Nlc3NmdWwgY29ubmVjdGlvbi4gKi8KLQkJCQltZW1jcHkoaG9zdGFkZHIsIGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbik7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWRlYnVnKCJjb25uZWN0IHRvIGFkZHJlc3MgJXMgcG9ydCAlczogJXMiLAotCQkJCSAgICBudG9wLCBzdHJwb3J0LCBzdHJlcnJvcihlcnJubykpOwotCQkJCWNsb3NlKHNvY2spOwotCQkJCXNvY2sgPSAtMTsKLQkJCX0KLQkJfQotCQlpZiAoc29jayAhPSAtMSkKLQkJCWJyZWFrOwkvKiBTdWNjZXNzZnVsIGNvbm5lY3Rpb24uICovCi0JfQotCi0JZnJlZWFkZHJpbmZvKGFpdG9wKTsKLQotCS8qIFJldHVybiBmYWlsdXJlIGlmIHdlIGRpZG4ndCBnZXQgYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24uICovCi0JaWYgKHNvY2sgPT0gLTEpIHsKLQkJZXJyb3IoInNzaDogY29ubmVjdCB0byBob3N0ICVzIHBvcnQgJXM6ICVzIiwKLQkJICAgIGhvc3QsIHN0cnBvcnQsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCWRlYnVnKCJDb25uZWN0aW9uIGVzdGFibGlzaGVkLiIpOwotCi0JLyogU2V0IFNPX0tFRVBBTElWRSBpZiByZXF1ZXN0ZWQuICovCi0JaWYgKHdhbnRfa2VlcGFsaXZlICYmCi0JICAgIHNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAodm9pZCAqKSZvbiwKLQkgICAgc2l6ZW9mKG9uKSkgPCAwKQotCQllcnJvcigic2V0c29ja29wdCBTT19LRUVQQUxJVkU6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLQkvKiBTZXQgdGhlIGNvbm5lY3Rpb24uICovCi0JcGFja2V0X3NldF9jb25uZWN0aW9uKHNvY2ssIHNvY2spOwotCXBhY2tldF9zZXRfdGltZW91dChvcHRpb25zLnNlcnZlcl9hbGl2ZV9pbnRlcnZhbCwKLQkgICAgb3B0aW9ucy5zZXJ2ZXJfYWxpdmVfY291bnRfbWF4KTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogV2FpdHMgZm9yIHRoZSBzZXJ2ZXIgaWRlbnRpZmljYXRpb24gc3RyaW5nLCBhbmQgc2VuZHMgb3VyIG93bgotICogaWRlbnRpZmljYXRpb24gc3RyaW5nLgotICovCi12b2lkCi1zc2hfZXhjaGFuZ2VfaWRlbnRpZmljYXRpb24oaW50IHRpbWVvdXRfbXMpCi17Ci0JY2hhciBidWZbMjU2XSwgcmVtb3RlX3ZlcnNpb25bMjU2XTsJLyogbXVzdCBiZSBzYW1lIHNpemUhICovCi0JaW50IHJlbW90ZV9tYWpvciwgcmVtb3RlX21pbm9yLCBtaXNtYXRjaDsKLQlpbnQgY29ubmVjdGlvbl9pbiA9IHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpOwotCWludCBjb25uZWN0aW9uX291dCA9IHBhY2tldF9nZXRfY29ubmVjdGlvbl9vdXQoKTsKLQlpbnQgbWlub3IxID0gUFJPVE9DT0xfTUlOT1JfMTsKLQl1X2ludCBpLCBuOwotCXNpemVfdCBsZW47Ci0JaW50IGZkc2V0c3osIHJlbWFpbmluZywgcmM7Ci0Jc3RydWN0IHRpbWV2YWwgdF9zdGFydCwgdF9yZW1haW5pbmc7Ci0JZmRfc2V0ICpmZHNldDsKLQotCWZkc2V0c3ogPSBob3dtYW55KGNvbm5lY3Rpb25faW4gKyAxLCBORkRCSVRTKSAqIHNpemVvZihmZF9tYXNrKTsKLQlmZHNldCA9IHhjYWxsb2MoMSwgZmRzZXRzeik7Ci0KLQkvKiBSZWFkIG90aGVyIHNpZGUncyB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uLiAqLwotCXJlbWFpbmluZyA9IHRpbWVvdXRfbXM7Ci0JZm9yIChuID0gMDs7KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnVmKSAtIDE7IGkrKykgewotCQkJaWYgKHRpbWVvdXRfbXMgPiAwKSB7Ci0JCQkJZ2V0dGltZW9mZGF5KCZ0X3N0YXJ0LCBOVUxMKTsKLQkJCQltc190b190aW1ldmFsKCZ0X3JlbWFpbmluZywgcmVtYWluaW5nKTsKLQkJCQlGRF9TRVQoY29ubmVjdGlvbl9pbiwgZmRzZXQpOwotCQkJCXJjID0gc2VsZWN0KGNvbm5lY3Rpb25faW4gKyAxLCBmZHNldCwgTlVMTCwKLQkJCQkgICAgZmRzZXQsICZ0X3JlbWFpbmluZyk7Ci0JCQkJbXNfc3VidHJhY3RfZGlmZigmdF9zdGFydCwgJnJlbWFpbmluZyk7Ci0JCQkJaWYgKHJjID09IDAgfHwgcmVtYWluaW5nIDw9IDApCi0JCQkJCWZhdGFsKCJDb25uZWN0aW9uIHRpbWVkIG91dCBkdXJpbmcgIgotCQkJCQkgICAgImJhbm5lciBleGNoYW5nZSIpOwotCQkJCWlmIChyYyA9PSAtMSkgewotCQkJCQlpZiAoZXJybm8gPT0gRUlOVFIpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJZmF0YWwoInNzaF9leGNoYW5nZV9pZGVudGlmaWNhdGlvbjogIgotCQkJCQkgICAgInNlbGVjdDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJCX0KLQkJCX0KLQotCQkJbGVuID0gcm9hbWluZ19hdG9taWNpbyhyZWFkLCBjb25uZWN0aW9uX2luLCAmYnVmW2ldLCAxKTsKLQotCQkJaWYgKGxlbiAhPSAxICYmIGVycm5vID09IEVQSVBFKQotCQkJCWZhdGFsKCJzc2hfZXhjaGFuZ2VfaWRlbnRpZmljYXRpb246ICIKLQkJCQkgICAgIkNvbm5lY3Rpb24gY2xvc2VkIGJ5IHJlbW90ZSBob3N0Iik7Ci0JCQllbHNlIGlmIChsZW4gIT0gMSkKLQkJCQlmYXRhbCgic3NoX2V4Y2hhbmdlX2lkZW50aWZpY2F0aW9uOiAiCi0JCQkJICAgICJyZWFkOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJaWYgKGJ1ZltpXSA9PSAnXHInKSB7Ci0JCQkJYnVmW2ldID0gJ1xuJzsKLQkJCQlidWZbaSArIDFdID0gMDsKLQkJCQljb250aW51ZTsJCS8qKlhYWCB3YWl0IGZvciBcbiAqLwotCQkJfQotCQkJaWYgKGJ1ZltpXSA9PSAnXG4nKSB7Ci0JCQkJYnVmW2kgKyAxXSA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoKytuID4gNjU1MzYpCi0JCQkJZmF0YWwoInNzaF9leGNoYW5nZV9pZGVudGlmaWNhdGlvbjogIgotCQkJCSAgICAiTm8gYmFubmVyIHJlY2VpdmVkIik7Ci0JCX0KLQkJYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwotCQlpZiAoc3RybmNtcChidWYsICJTU0gtIiwgNCkgPT0gMCkKLQkJCWJyZWFrOwotCQlkZWJ1Zygic3NoX2V4Y2hhbmdlX2lkZW50aWZpY2F0aW9uOiAlcyIsIGJ1Zik7Ci0JfQotCXNlcnZlcl92ZXJzaW9uX3N0cmluZyA9IHhzdHJkdXAoYnVmKTsKLQl4ZnJlZShmZHNldCk7Ci0KLQkvKgotCSAqIENoZWNrIHRoYXQgdGhlIHZlcnNpb25zIG1hdGNoLiAgSW4gZnV0dXJlIHRoaXMgbWlnaHQgYWNjZXB0Ci0JICogc2V2ZXJhbCB2ZXJzaW9ucyBhbmQgc2V0IGFwcHJvcHJpYXRlIGZsYWdzIHRvIGhhbmRsZSB0aGVtLgotCSAqLwotCWlmIChzc2NhbmYoc2VydmVyX3ZlcnNpb25fc3RyaW5nLCAiU1NILSVkLiVkLSVbXlxuXVxuIiwKLQkgICAgJnJlbW90ZV9tYWpvciwgJnJlbW90ZV9taW5vciwgcmVtb3RlX3ZlcnNpb24pICE9IDMpCi0JCWZhdGFsKCJCYWQgcmVtb3RlIHByb3RvY29sIHZlcnNpb24gaWRlbnRpZmljYXRpb246ICclLjEwMHMnIiwgYnVmKTsKLQlkZWJ1ZygiUmVtb3RlIHByb3RvY29sIHZlcnNpb24gJWQuJWQsIHJlbW90ZSBzb2Z0d2FyZSB2ZXJzaW9uICUuMTAwcyIsCi0JICAgIHJlbW90ZV9tYWpvciwgcmVtb3RlX21pbm9yLCByZW1vdGVfdmVyc2lvbik7Ci0KLQljb21wYXRfZGF0YWZlbGxvd3MocmVtb3RlX3ZlcnNpb24pOwotCW1pc21hdGNoID0gMDsKLQotCXN3aXRjaCAocmVtb3RlX21ham9yKSB7Ci0JY2FzZSAxOgotCQlpZiAocmVtb3RlX21pbm9yID09IDk5ICYmCi0JCSAgICAob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18yKSAmJgotCQkgICAgIShvcHRpb25zLnByb3RvY29sICYgU1NIX1BST1RPXzFfUFJFRkVSUkVEKSkgewotCQkJZW5hYmxlX2NvbXBhdDIwKCk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIShvcHRpb25zLnByb3RvY29sICYgU1NIX1BST1RPXzEpKSB7Ci0JCQltaXNtYXRjaCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAocmVtb3RlX21pbm9yIDwgMykgewotCQkJZmF0YWwoIlJlbW90ZSBtYWNoaW5lIGhhcyB0b28gb2xkIFNTSCBzb2Z0d2FyZSB2ZXJzaW9uLiIpOwotCQl9IGVsc2UgaWYgKHJlbW90ZV9taW5vciA9PSAzIHx8IHJlbW90ZV9taW5vciA9PSA0KSB7Ci0JCQkvKiBXZSBzcGVhayAxLjMsIHRvby4gKi8KLQkJCWVuYWJsZV9jb21wYXQxMygpOwotCQkJbWlub3IxID0gMzsKLQkJCWlmIChvcHRpb25zLmZvcndhcmRfYWdlbnQpIHsKLQkJCQlsb2dpdCgiQWdlbnQgZm9yd2FyZGluZyBkaXNhYmxlZCBmb3IgcHJvdG9jb2wgMS4zIik7Ci0JCQkJb3B0aW9ucy5mb3J3YXJkX2FnZW50ID0gMDsKLQkJCX0KLQkJfQotCQlicmVhazsKLQljYXNlIDI6Ci0JCWlmIChvcHRpb25zLnByb3RvY29sICYgU1NIX1BST1RPXzIpIHsKLQkJCWVuYWJsZV9jb21wYXQyMCgpOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogRkFMTFRIUk9VR0ggKi8KLQlkZWZhdWx0OgotCQltaXNtYXRjaCA9IDE7Ci0JCWJyZWFrOwotCX0KLQlpZiAobWlzbWF0Y2gpCi0JCWZhdGFsKCJQcm90b2NvbCBtYWpvciB2ZXJzaW9ucyBkaWZmZXI6ICVkIHZzLiAlZCIsCi0JCSAgICAob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18yKSA/IFBST1RPQ09MX01BSk9SXzIgOiBQUk9UT0NPTF9NQUpPUl8xLAotCQkgICAgcmVtb3RlX21ham9yKTsKLQkvKiBTZW5kIG91ciBvd24gcHJvdG9jb2wgdmVyc2lvbiBpZGVudGlmaWNhdGlvbi4gKi8KLQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJTU0gtJWQuJWQtJS4xMDBzJXMiLAotCSAgICBjb21wYXQyMCA/IFBST1RPQ09MX01BSk9SXzIgOiBQUk9UT0NPTF9NQUpPUl8xLAotCSAgICBjb21wYXQyMCA/IFBST1RPQ09MX01JTk9SXzIgOiBtaW5vcjEsCi0JICAgIFNTSF9WRVJTSU9OLCBjb21wYXQyMCA/ICJcclxuIiA6ICJcbiIpOwotCWlmIChyb2FtaW5nX2F0b21pY2lvKHZ3cml0ZSwgY29ubmVjdGlvbl9vdXQsIGJ1Ziwgc3RybGVuKGJ1ZikpCi0JICAgICE9IHN0cmxlbihidWYpKQotCQlmYXRhbCgid3JpdGU6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JY2xpZW50X3ZlcnNpb25fc3RyaW5nID0geHN0cmR1cChidWYpOwotCWNob3AoY2xpZW50X3ZlcnNpb25fc3RyaW5nKTsKLQljaG9wKHNlcnZlcl92ZXJzaW9uX3N0cmluZyk7Ci0JZGVidWcoIkxvY2FsIHZlcnNpb24gc3RyaW5nICUuMTAwcyIsIGNsaWVudF92ZXJzaW9uX3N0cmluZyk7Ci19Ci0KLS8qIGRlZmF1bHRzIHRvICdubycgKi8KLXN0YXRpYyBpbnQKLWNvbmZpcm0oY29uc3QgY2hhciAqcHJvbXB0KQotewotCWNvbnN0IGNoYXIgKm1zZywgKmFnYWluID0gIlBsZWFzZSB0eXBlICd5ZXMnIG9yICdubyc6ICI7Ci0JY2hhciAqcDsKLQlpbnQgcmV0ID0gLTE7Ci0KLQlpZiAob3B0aW9ucy5iYXRjaF9tb2RlKQotCQlyZXR1cm4gMDsKLQlmb3IgKG1zZyA9IHByb21wdDs7bXNnID0gYWdhaW4pIHsKLQkJcCA9IHJlYWRfcGFzc3BocmFzZShtc2csIFJQX0VDSE8pOwotCQlpZiAocCA9PSBOVUxMIHx8Ci0JCSAgICAocFswXSA9PSAnXDAnKSB8fCAocFswXSA9PSAnXG4nKSB8fAotCQkgICAgc3RybmNhc2VjbXAocCwgIm5vIiwgMikgPT0gMCkKLQkJCXJldCA9IDA7Ci0JCWlmIChwICYmIHN0cm5jYXNlY21wKHAsICJ5ZXMiLCAzKSA9PSAwKQotCQkJcmV0ID0gMTsKLQkJaWYgKHApCi0JCQl4ZnJlZShwKTsKLQkJaWYgKHJldCAhPSAtMSkKLQkJCXJldHVybiByZXQ7Ci0JfQotfQotCi1zdGF0aWMgaW50Ci1jaGVja19ob3N0X2NlcnQoY29uc3QgY2hhciAqaG9zdCwgY29uc3QgS2V5ICpob3N0X2tleSkKLXsKLQljb25zdCBjaGFyICpyZWFzb247Ci0KLQlpZiAoa2V5X2NlcnRfY2hlY2tfYXV0aG9yaXR5KGhvc3Rfa2V5LCAxLCAwLCBob3N0LCAmcmVhc29uKSAhPSAwKSB7Ci0JCWVycm9yKCIlcyIsIHJlYXNvbik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoYnVmZmVyX2xlbigmaG9zdF9rZXktPmNlcnQtPmNyaXRpY2FsKSAhPSAwKSB7Ci0JCWVycm9yKCJDZXJ0aWZpY2F0ZSBmb3IgJXMgY29udGFpbnMgdW5zdXBwb3J0ZWQgIgotCQkgICAgImNyaXRpY2FsIG9wdGlvbnMocykiLCBob3N0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1zb2NrYWRkcl9pc19sb2NhbChzdHJ1Y3Qgc29ja2FkZHIgKmhvc3RhZGRyKQotewotCXN3aXRjaCAoaG9zdGFkZHItPnNhX2ZhbWlseSkgewotCWNhc2UgQUZfSU5FVDoKLQkJcmV0dXJuIChudG9obCgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWhvc3RhZGRyKS0+Ci0JCSAgICBzaW5fYWRkci5zX2FkZHIpID4+IDI0KSA9PSBJTl9MT09QQkFDS05FVDsKLQljYXNlIEFGX0lORVQ2OgotCQlyZXR1cm4gSU42X0lTX0FERFJfTE9PUEJBQ0soCi0JCSAgICAmKCgoc3RydWN0IHNvY2thZGRyX2luNiAqKWhvc3RhZGRyKS0+c2luNl9hZGRyKSk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKgotICogUHJlcGFyZSB0aGUgaG9zdG5hbWUgYW5kIGlwIGFkZHJlc3Mgc3RyaW5ncyB0aGF0IGFyZSB1c2VkIHRvIGxvb2t1cAotICogaG9zdCBrZXlzIGluIGtub3duX2hvc3RzIGZpbGVzLiBUaGVzZSBtYXkgaGF2ZSBhIHBvcnQgbnVtYmVyIGFwcGVuZGVkLgotICovCi12b2lkCi1nZXRfaG9zdGZpbGVfaG9zdG5hbWVfaXBhZGRyKGNoYXIgKmhvc3RuYW1lLCBzdHJ1Y3Qgc29ja2FkZHIgKmhvc3RhZGRyLAotICAgIHVfc2hvcnQgcG9ydCwgY2hhciAqKmhvc3RmaWxlX2hvc3RuYW1lLCBjaGFyICoqaG9zdGZpbGVfaXBhZGRyKQotewotCWNoYXIgbnRvcFtOSV9NQVhIT1NUXTsKLQlzb2NrbGVuX3QgYWRkcmxlbjsKLQotCXN3aXRjaCAoaG9zdGFkZHIgPT0gTlVMTCA/IC0xIDogaG9zdGFkZHItPnNhX2ZhbWlseSkgewotCWNhc2UgLTE6Ci0JCWFkZHJsZW4gPSAwOwotCQlicmVhazsKLQljYXNlIEFGX0lORVQ6Ci0JCWFkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRl9JTkVUNjoKLQkJYWRkcmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYWRkcmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpOwotCQlicmVhazsKLQl9Ci0KLQkvKgotCSAqIFdlIGRvbid0IGhhdmUgdGhlIHJlbW90ZSBpcC1hZGRyZXNzIGZvciBjb25uZWN0aW9ucwotCSAqIHVzaW5nIGEgcHJveHkgY29tbWFuZAotCSAqLwotCWlmIChob3N0ZmlsZV9pcGFkZHIgIT0gTlVMTCkgewotCQlpZiAob3B0aW9ucy5wcm94eV9jb21tYW5kID09IE5VTEwpIHsKLQkJCWlmIChnZXRuYW1laW5mbyhob3N0YWRkciwgYWRkcmxlbiwKLQkJCSAgICBudG9wLCBzaXplb2YobnRvcCksIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUKSAhPSAwKQotCQkJZmF0YWwoImNoZWNrX2hvc3Rfa2V5OiBnZXRuYW1laW5mbyBmYWlsZWQiKTsKLQkJCSpob3N0ZmlsZV9pcGFkZHIgPSBwdXRfaG9zdF9wb3J0KG50b3AsIHBvcnQpOwotCQl9IGVsc2UgewotCQkJKmhvc3RmaWxlX2lwYWRkciA9IHhzdHJkdXAoIjxubyBob3N0aXAgZm9yIHByb3h5ICIKLQkJCSAgICAiY29tbWFuZD4iKTsKLQkJfQotCX0KLQotCS8qCi0JICogQWxsb3cgdGhlIHVzZXIgdG8gcmVjb3JkIHRoZSBrZXkgdW5kZXIgYSBkaWZmZXJlbnQgbmFtZSBvcgotCSAqIGRpZmZlcmVudGlhdGUgYSBub24tc3RhbmRhcmQgcG9ydC4gIFRoaXMgaXMgdXNlZnVsIGZvciBzc2gKLQkgKiB0dW5uZWxpbmcgb3ZlciBmb3J3YXJkZWQgY29ubmVjdGlvbnMgb3IgaWYgeW91IHJ1biBtdWx0aXBsZQotCSAqIHNzaGQncyBvbiBkaWZmZXJlbnQgcG9ydHMgb24gdGhlIHNhbWUgbWFjaGluZS4KLQkgKi8KLQlpZiAoaG9zdGZpbGVfaG9zdG5hbWUgIT0gTlVMTCkgewotCQlpZiAob3B0aW9ucy5ob3N0X2tleV9hbGlhcyAhPSBOVUxMKSB7Ci0JCQkqaG9zdGZpbGVfaG9zdG5hbWUgPSB4c3RyZHVwKG9wdGlvbnMuaG9zdF9rZXlfYWxpYXMpOwotCQkJZGVidWcoInVzaW5nIGhvc3RrZXlhbGlhczogJXMiLCAqaG9zdGZpbGVfaG9zdG5hbWUpOwotCQl9IGVsc2UgewotCQkJKmhvc3RmaWxlX2hvc3RuYW1lID0gcHV0X2hvc3RfcG9ydChob3N0bmFtZSwgcG9ydCk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBjaGVjayB3aGV0aGVyIHRoZSBzdXBwbGllZCBob3N0IGtleSBpcyB2YWxpZCwgcmV0dXJuIC0xIGlmIHRoZSBrZXkKLSAqIGlzIG5vdCB2YWxpZC4gdXNlcl9ob3N0ZmlsZVswXSB3aWxsIG5vdCBiZSB1cGRhdGVkIGlmICdyZWFkb25seScgaXMgdHJ1ZS4KLSAqLwotI2RlZmluZSBSRFJXCTAKLSNkZWZpbmUgUkRPTkxZCTEKLSNkZWZpbmUgUk9RVUlFVAkyCi1zdGF0aWMgaW50Ci1jaGVja19ob3N0X2tleShjaGFyICpob3N0bmFtZSwgc3RydWN0IHNvY2thZGRyICpob3N0YWRkciwgdV9zaG9ydCBwb3J0LAotICAgIEtleSAqaG9zdF9rZXksIGludCByZWFkb25seSwKLSAgICBjaGFyICoqdXNlcl9ob3N0ZmlsZXMsIHVfaW50IG51bV91c2VyX2hvc3RmaWxlcywKLSAgICBjaGFyICoqc3lzdGVtX2hvc3RmaWxlcywgdV9pbnQgbnVtX3N5c3RlbV9ob3N0ZmlsZXMpCi17Ci0JSG9zdFN0YXR1cyBob3N0X3N0YXR1czsKLQlIb3N0U3RhdHVzIGlwX3N0YXR1czsKLQlLZXkgKnJhd19rZXkgPSBOVUxMOwotCWNoYXIgKmlwID0gTlVMTCwgKmhvc3QgPSBOVUxMOwotCWNoYXIgaG9zdGxpbmVbMTAwMF0sICpob3N0cCwgKmZwLCAqcmE7Ci0JY2hhciBtc2dbMTAyNF07Ci0JY29uc3QgY2hhciAqdHlwZTsKLQljb25zdCBzdHJ1Y3QgaG9zdGtleV9lbnRyeSAqaG9zdF9mb3VuZCwgKmlwX2ZvdW5kOwotCWludCBsZW4sIGNhbmNlbGxlZF9mb3J3YXJkaW5nID0gMDsKLQlpbnQgbG9jYWwgPSBzb2NrYWRkcl9pc19sb2NhbChob3N0YWRkcik7Ci0JaW50IHIsIHdhbnRfY2VydCA9IGtleV9pc19jZXJ0KGhvc3Rfa2V5KSwgaG9zdF9pcF9kaWZmZXIgPSAwOwotCXN0cnVjdCBob3N0a2V5cyAqaG9zdF9ob3N0a2V5cywgKmlwX2hvc3RrZXlzOwotCXVfaW50IGk7Ci0KLQkvKgotCSAqIEZvcmNlIGFjY2VwdGluZyBvZiB0aGUgaG9zdCBrZXkgZm9yIGxvb3BiYWNrL2xvY2FsaG9zdC4gVGhlCi0JICogcHJvYmxlbSBpcyB0aGF0IGlmIHRoZSBob21lIGRpcmVjdG9yeSBpcyBORlMtbW91bnRlZCB0byBtdWx0aXBsZQotCSAqIG1hY2hpbmVzLCBsb2NhbGhvc3Qgd2lsbCByZWZlciB0byBhIGRpZmZlcmVudCBtYWNoaW5lIGluIGVhY2ggb2YKLQkgKiB0aGVtLCBhbmQgdGhlIHVzZXIgd2lsbCBnZXQgYm9ndXMgSE9TVF9DSEFOR0VEIHdhcm5pbmdzLiAgVGhpcwotCSAqIGVzc2VudGlhbGx5IGRpc2FibGVzIGhvc3QgYXV0aGVudGljYXRpb24gZm9yIGxvY2FsaG9zdDsgaG93ZXZlciwKLQkgKiB0aGlzIGlzIHByb2JhYmx5IG5vdCBhIHJlYWwgcHJvYmxlbS4KLQkgKi8KLQlpZiAob3B0aW9ucy5ub19ob3N0X2F1dGhlbnRpY2F0aW9uX2Zvcl9sb2NhbGhvc3QgPT0gMSAmJiBsb2NhbCAmJgotCSAgICBvcHRpb25zLmhvc3Rfa2V5X2FsaWFzID09IE5VTEwpIHsKLQkJZGVidWcoIkZvcmNpbmcgYWNjZXB0aW5nIG9mIGhvc3Qga2V5IGZvciAiCi0JCSAgICAibG9vcGJhY2svbG9jYWxob3N0LiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIFByZXBhcmUgdGhlIGhvc3RuYW1lIGFuZCBhZGRyZXNzIHN0cmluZ3MgdXNlZCBmb3IgaG9zdGtleSBsb29rdXAuCi0JICogSW4gc29tZSBjYXNlcywgdGhlc2Ugd2lsbCBoYXZlIGEgcG9ydCBudW1iZXIgYXBwZW5kZWQuCi0JICovCi0JZ2V0X2hvc3RmaWxlX2hvc3RuYW1lX2lwYWRkcihob3N0bmFtZSwgaG9zdGFkZHIsIHBvcnQsICZob3N0LCAmaXApOwotCi0JLyoKLQkgKiBUdXJuIG9mZiBjaGVja19ob3N0X2lwIGlmIHRoZSBjb25uZWN0aW9uIGlzIHRvIGxvY2FsaG9zdCwgdmlhIHByb3h5Ci0JICogY29tbWFuZCBvciBpZiB3ZSBkb24ndCBoYXZlIGEgaG9zdG5hbWUgdG8gY29tcGFyZSB3aXRoCi0JICovCi0JaWYgKG9wdGlvbnMuY2hlY2tfaG9zdF9pcCAmJiAobG9jYWwgfHwKLQkgICAgc3RyY21wKGhvc3RuYW1lLCBpcCkgPT0gMCB8fCBvcHRpb25zLnByb3h5X2NvbW1hbmQgIT0gTlVMTCkpCi0JCW9wdGlvbnMuY2hlY2tfaG9zdF9pcCA9IDA7Ci0KLQlob3N0X2hvc3RrZXlzID0gaW5pdF9ob3N0a2V5cygpOwotCWZvciAoaSA9IDA7IGkgPCBudW1fdXNlcl9ob3N0ZmlsZXM7IGkrKykKLQkJbG9hZF9ob3N0a2V5cyhob3N0X2hvc3RrZXlzLCBob3N0LCB1c2VyX2hvc3RmaWxlc1tpXSk7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9zeXN0ZW1faG9zdGZpbGVzOyBpKyspCi0JCWxvYWRfaG9zdGtleXMoaG9zdF9ob3N0a2V5cywgaG9zdCwgc3lzdGVtX2hvc3RmaWxlc1tpXSk7Ci0KLQlpcF9ob3N0a2V5cyA9IE5VTEw7Ci0JaWYgKCF3YW50X2NlcnQgJiYgb3B0aW9ucy5jaGVja19ob3N0X2lwKSB7Ci0JCWlwX2hvc3RrZXlzID0gaW5pdF9ob3N0a2V5cygpOwotCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3VzZXJfaG9zdGZpbGVzOyBpKyspCi0JCQlsb2FkX2hvc3RrZXlzKGlwX2hvc3RrZXlzLCBpcCwgdXNlcl9ob3N0ZmlsZXNbaV0pOwotCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3N5c3RlbV9ob3N0ZmlsZXM7IGkrKykKLQkJCWxvYWRfaG9zdGtleXMoaXBfaG9zdGtleXMsIGlwLCBzeXN0ZW1faG9zdGZpbGVzW2ldKTsKLQl9Ci0KLSByZXRyeToKLQkvKiBSZWxvYWQgdGhlc2UgYXMgdGhleSBtYXkgaGF2ZSBjaGFuZ2VkIG9uIGNlcnQtPmtleSBkb3duZ3JhZGUgKi8KLQl3YW50X2NlcnQgPSBrZXlfaXNfY2VydChob3N0X2tleSk7Ci0JdHlwZSA9IGtleV90eXBlKGhvc3Rfa2V5KTsKLQotCS8qCi0JICogQ2hlY2sgaWYgdGhlIGhvc3Qga2V5IGlzIHByZXNlbnQgaW4gdGhlIHVzZXIncyBsaXN0IG9mIGtub3duCi0JICogaG9zdHMgb3IgaW4gdGhlIHN5c3RlbXdpZGUgbGlzdC4KLQkgKi8KLQlob3N0X3N0YXR1cyA9IGNoZWNrX2tleV9pbl9ob3N0a2V5cyhob3N0X2hvc3RrZXlzLCBob3N0X2tleSwKLQkgICAgJmhvc3RfZm91bmQpOwotCi0JLyoKLQkgKiBBbHNvIHBlcmZvcm0gY2hlY2sgZm9yIHRoZSBpcCBhZGRyZXNzLCBza2lwIHRoZSBjaGVjayBpZiB3ZSBhcmUKLQkgKiBsb2NhbGhvc3QsIGxvb2tpbmcgZm9yIGEgY2VydGlmaWNhdGUsIG9yIHRoZSBob3N0bmFtZSB3YXMgYW4gaXAKLQkgKiBhZGRyZXNzIHRvIGJlZ2luIHdpdGguCi0JICovCi0JaWYgKCF3YW50X2NlcnQgJiYgaXBfaG9zdGtleXMgIT0gTlVMTCkgewotCQlpcF9zdGF0dXMgPSBjaGVja19rZXlfaW5faG9zdGtleXMoaXBfaG9zdGtleXMsIGhvc3Rfa2V5LAotCQkgICAgJmlwX2ZvdW5kKTsKLQkJaWYgKGhvc3Rfc3RhdHVzID09IEhPU1RfQ0hBTkdFRCAmJgotCQkgICAgKGlwX3N0YXR1cyAhPSBIT1NUX0NIQU5HRUQgfHwgCi0JCSAgICAoaXBfZm91bmQgIT0gTlVMTCAmJgotCQkgICAgIWtleV9lcXVhbChpcF9mb3VuZC0+a2V5LCBob3N0X2ZvdW5kLT5rZXkpKSkpCi0JCQlob3N0X2lwX2RpZmZlciA9IDE7Ci0JfSBlbHNlCi0JCWlwX3N0YXR1cyA9IGhvc3Rfc3RhdHVzOwotCi0Jc3dpdGNoIChob3N0X3N0YXR1cykgewotCWNhc2UgSE9TVF9PSzoKLQkJLyogVGhlIGhvc3QgaXMga25vd24gYW5kIHRoZSBrZXkgbWF0Y2hlcy4gKi8KLQkJZGVidWcoIkhvc3QgJyUuMjAwcycgaXMga25vd24gYW5kIG1hdGNoZXMgdGhlICVzIGhvc3QgJXMuIiwKLQkJICAgIGhvc3QsIHR5cGUsIHdhbnRfY2VydCA/ICJjZXJ0aWZpY2F0ZSIgOiAia2V5Iik7Ci0JCWRlYnVnKCJGb3VuZCAlcyBpbiAlczolbHUiLCB3YW50X2NlcnQgPyAiQ0Ega2V5IiA6ICJrZXkiLAotCQkgICAgaG9zdF9mb3VuZC0+ZmlsZSwgaG9zdF9mb3VuZC0+bGluZSk7Ci0JCWlmICh3YW50X2NlcnQgJiYgIWNoZWNrX2hvc3RfY2VydChob3N0bmFtZSwgaG9zdF9rZXkpKQotCQkJZ290byBmYWlsOwotCQlpZiAob3B0aW9ucy5jaGVja19ob3N0X2lwICYmIGlwX3N0YXR1cyA9PSBIT1NUX05FVykgewotCQkJaWYgKHJlYWRvbmx5IHx8IHdhbnRfY2VydCkKLQkJCQlsb2dpdCgiJXMgaG9zdCBrZXkgZm9yIElQIGFkZHJlc3MgIgotCQkJCSAgICAiJyUuMTI4cycgbm90IGluIGxpc3Qgb2Yga25vd24gaG9zdHMuIiwKLQkJCQkgICAgdHlwZSwgaXApOwotCQkJZWxzZSBpZiAoIWFkZF9ob3N0X3RvX2hvc3RmaWxlKHVzZXJfaG9zdGZpbGVzWzBdLCBpcCwKLQkJCSAgICBob3N0X2tleSwgb3B0aW9ucy5oYXNoX2tub3duX2hvc3RzKSkKLQkJCQlsb2dpdCgiRmFpbGVkIHRvIGFkZCB0aGUgJXMgaG9zdCBrZXkgZm9yIElQICIKLQkJCQkgICAgImFkZHJlc3MgJyUuMTI4cycgdG8gdGhlIGxpc3Qgb2Yga25vd24gIgotCQkJCSAgICAiaG9zdHMgKCUuMzBzKS4iLCB0eXBlLCBpcCwKLQkJCQkgICAgdXNlcl9ob3N0ZmlsZXNbMF0pOwotCQkJZWxzZQotCQkJCWxvZ2l0KCJXYXJuaW5nOiBQZXJtYW5lbnRseSBhZGRlZCB0aGUgJXMgaG9zdCAiCi0JCQkJICAgICJrZXkgZm9yIElQIGFkZHJlc3MgJyUuMTI4cycgdG8gdGhlIGxpc3QgIgotCQkJCSAgICAib2Yga25vd24gaG9zdHMuIiwgdHlwZSwgaXApOwotCQl9IGVsc2UgaWYgKG9wdGlvbnMudmlzdWFsX2hvc3Rfa2V5KSB7Ci0JCQlmcCA9IGtleV9maW5nZXJwcmludChob3N0X2tleSwgU1NIX0ZQX01ENSwgU1NIX0ZQX0hFWCk7Ci0JCQlyYSA9IGtleV9maW5nZXJwcmludChob3N0X2tleSwgU1NIX0ZQX01ENSwKLQkJCSAgICBTU0hfRlBfUkFORE9NQVJUKTsKLQkJCWxvZ2l0KCJIb3N0IGtleSBmaW5nZXJwcmludCBpcyAlc1xuJXNcbiIsIGZwLCByYSk7Ci0JCQl4ZnJlZShyYSk7Ci0JCQl4ZnJlZShmcCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBIT1NUX05FVzoKLQkJaWYgKG9wdGlvbnMuaG9zdF9rZXlfYWxpYXMgPT0gTlVMTCAmJiBwb3J0ICE9IDAgJiYKLQkJICAgIHBvcnQgIT0gU1NIX0RFRkFVTFRfUE9SVCkgewotCQkJZGVidWcoImNoZWNraW5nIHdpdGhvdXQgcG9ydCBpZGVudGlmaWVyIik7Ci0JCQlpZiAoY2hlY2tfaG9zdF9rZXkoaG9zdG5hbWUsIGhvc3RhZGRyLCAwLCBob3N0X2tleSwKLQkJCSAgICBST1FVSUVULCB1c2VyX2hvc3RmaWxlcywgbnVtX3VzZXJfaG9zdGZpbGVzLAotCQkJICAgIHN5c3RlbV9ob3N0ZmlsZXMsIG51bV9zeXN0ZW1faG9zdGZpbGVzKSA9PSAwKSB7Ci0JCQkJZGVidWcoImZvdW5kIG1hdGNoaW5nIGtleSB3L291dCBwb3J0Iik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlYWRvbmx5IHx8IHdhbnRfY2VydCkKLQkJCWdvdG8gZmFpbDsKLQkJLyogVGhlIGhvc3QgaXMgbmV3LiAqLwotCQlpZiAob3B0aW9ucy5zdHJpY3RfaG9zdF9rZXlfY2hlY2tpbmcgPT0gMSkgewotCQkJLyoKLQkJCSAqIFVzZXIgaGFzIHJlcXVlc3RlZCBzdHJpY3QgaG9zdCBrZXkgY2hlY2tpbmcuICBXZQotCQkJICogd2lsbCBub3QgYWRkIHRoZSBob3N0IGtleSBhdXRvbWF0aWNhbGx5LiAgVGhlIG9ubHkKLQkJCSAqIGFsdGVybmF0aXZlIGxlZnQgaXMgdG8gYWJvcnQuCi0JCQkgKi8KLQkJCWVycm9yKCJObyAlcyBob3N0IGtleSBpcyBrbm93biBmb3IgJS4yMDBzIGFuZCB5b3UgIgotCQkJICAgICJoYXZlIHJlcXVlc3RlZCBzdHJpY3QgY2hlY2tpbmcuIiwgdHlwZSwgaG9zdCk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0gZWxzZSBpZiAob3B0aW9ucy5zdHJpY3RfaG9zdF9rZXlfY2hlY2tpbmcgPT0gMikgewotCQkJY2hhciBtc2cxWzEwMjRdLCBtc2cyWzEwMjRdOwotCi0JCQlpZiAoc2hvd19vdGhlcl9rZXlzKGhvc3RfaG9zdGtleXMsIGhvc3Rfa2V5KSkKLQkJCQlzbnByaW50Zihtc2cxLCBzaXplb2YobXNnMSksCi0JCQkJICAgICJcbmJ1dCBrZXlzIG9mIGRpZmZlcmVudCB0eXBlIGFyZSBhbHJlYWR5IgotCQkJCSAgICAiIGtub3duIGZvciB0aGlzIGhvc3QuIik7Ci0JCQllbHNlCi0JCQkJc25wcmludGYobXNnMSwgc2l6ZW9mKG1zZzEpLCAiLiIpOwotCQkJLyogVGhlIGRlZmF1bHQgKi8KLQkJCWZwID0ga2V5X2ZpbmdlcnByaW50KGhvc3Rfa2V5LCBTU0hfRlBfTUQ1LCBTU0hfRlBfSEVYKTsKLQkJCXJhID0ga2V5X2ZpbmdlcnByaW50KGhvc3Rfa2V5LCBTU0hfRlBfTUQ1LAotCQkJICAgIFNTSF9GUF9SQU5ET01BUlQpOwotCQkJbXNnMlswXSA9ICdcMCc7Ci0JCQlpZiAob3B0aW9ucy52ZXJpZnlfaG9zdF9rZXlfZG5zKSB7Ci0JCQkJaWYgKG1hdGNoaW5nX2hvc3Rfa2V5X2RucykKLQkJCQkJc25wcmludGYobXNnMiwgc2l6ZW9mKG1zZzIpLAotCQkJCQkgICAgIk1hdGNoaW5nIGhvc3Qga2V5IGZpbmdlcnByaW50IgotCQkJCQkgICAgIiBmb3VuZCBpbiBETlMuXG4iKTsKLQkJCQllbHNlCi0JCQkJCXNucHJpbnRmKG1zZzIsIHNpemVvZihtc2cyKSwKLQkJCQkJICAgICJObyBtYXRjaGluZyBob3N0IGtleSBmaW5nZXJwcmludCIKLQkJCQkJICAgICIgZm91bmQgaW4gRE5TLlxuIik7Ci0JCQl9Ci0JCQlzbnByaW50Zihtc2csIHNpemVvZihtc2cpLAotCQkJICAgICJUaGUgYXV0aGVudGljaXR5IG9mIGhvc3QgJyUuMjAwcyAoJXMpJyBjYW4ndCBiZSAiCi0JCQkgICAgImVzdGFibGlzaGVkJXNcbiIKLQkJCSAgICAiJXMga2V5IGZpbmdlcnByaW50IGlzICVzLiVzJXNcbiVzIgotCQkJICAgICJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWUgY29ubmVjdGluZyAiCi0JCQkgICAgIih5ZXMvbm8pPyAiLAotCQkJICAgIGhvc3QsIGlwLCBtc2cxLCB0eXBlLCBmcCwKLQkJCSAgICBvcHRpb25zLnZpc3VhbF9ob3N0X2tleSA/ICJcbiIgOiAiIiwKLQkJCSAgICBvcHRpb25zLnZpc3VhbF9ob3N0X2tleSA/IHJhIDogIiIsCi0JCQkgICAgbXNnMik7Ci0JCQl4ZnJlZShyYSk7Ci0JCQl4ZnJlZShmcCk7Ci0JCQlpZiAoIWNvbmZpcm0obXNnKSkKLQkJCQlnb3RvIGZhaWw7Ci0JCX0KLQkJLyoKLQkJICogSWYgbm90IGluIHN0cmljdCBtb2RlLCBhZGQgdGhlIGtleSBhdXRvbWF0aWNhbGx5IHRvIHRoZQotCQkgKiBsb2NhbCBrbm93bl9ob3N0cyBmaWxlLgotCQkgKi8KLQkJaWYgKG9wdGlvbnMuY2hlY2tfaG9zdF9pcCAmJiBpcF9zdGF0dXMgPT0gSE9TVF9ORVcpIHsKLQkJCXNucHJpbnRmKGhvc3RsaW5lLCBzaXplb2YoaG9zdGxpbmUpLCAiJXMsJXMiLCBob3N0LCBpcCk7Ci0JCQlob3N0cCA9IGhvc3RsaW5lOwotCQkJaWYgKG9wdGlvbnMuaGFzaF9rbm93bl9ob3N0cykgewotCQkJCS8qIEFkZCBoYXNoIG9mIGhvc3QgYW5kIElQIHNlcGFyYXRlbHkgKi8KLQkJCQlyID0gYWRkX2hvc3RfdG9faG9zdGZpbGUodXNlcl9ob3N0ZmlsZXNbMF0sCi0JCQkJICAgIGhvc3QsIGhvc3Rfa2V5LCBvcHRpb25zLmhhc2hfa25vd25faG9zdHMpICYmCi0JCQkJICAgIGFkZF9ob3N0X3RvX2hvc3RmaWxlKHVzZXJfaG9zdGZpbGVzWzBdLCBpcCwKLQkJCQkgICAgaG9zdF9rZXksIG9wdGlvbnMuaGFzaF9rbm93bl9ob3N0cyk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIEFkZCB1bmhhc2hlZCAiaG9zdCxpcCIgKi8KLQkJCQlyID0gYWRkX2hvc3RfdG9faG9zdGZpbGUodXNlcl9ob3N0ZmlsZXNbMF0sCi0JCQkJICAgIGhvc3RsaW5lLCBob3N0X2tleSwKLQkJCQkgICAgb3B0aW9ucy5oYXNoX2tub3duX2hvc3RzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXIgPSBhZGRfaG9zdF90b19ob3N0ZmlsZSh1c2VyX2hvc3RmaWxlc1swXSwgaG9zdCwKLQkJCSAgICBob3N0X2tleSwgb3B0aW9ucy5oYXNoX2tub3duX2hvc3RzKTsKLQkJCWhvc3RwID0gaG9zdDsKLQkJfQotCi0JCWlmICghcikKLQkJCWxvZ2l0KCJGYWlsZWQgdG8gYWRkIHRoZSBob3N0IHRvIHRoZSBsaXN0IG9mIGtub3duICIKLQkJCSAgICAiaG9zdHMgKCUuNTAwcykuIiwgdXNlcl9ob3N0ZmlsZXNbMF0pOwotCQllbHNlCi0JCQlsb2dpdCgiV2FybmluZzogUGVybWFuZW50bHkgYWRkZWQgJyUuMjAwcycgKCVzKSB0byB0aGUgIgotCQkJICAgICJsaXN0IG9mIGtub3duIGhvc3RzLiIsIGhvc3RwLCB0eXBlKTsKLQkJYnJlYWs7Ci0JY2FzZSBIT1NUX1JFVk9LRUQ6Ci0JCWVycm9yKCJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCIpOwotCQllcnJvcigiQCAgICAgICBXQVJOSU5HOiBSRVZPS0VEIEhPU1QgS0VZIERFVEVDVEVEISAgICAgICAgICAgICAgIEAiKTsKLQkJZXJyb3IoIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIik7Ci0JCWVycm9yKCJUaGUgJXMgaG9zdCBrZXkgZm9yICVzIGlzIG1hcmtlZCBhcyByZXZva2VkLiIsIHR5cGUsIGhvc3QpOwotCQllcnJvcigiVGhpcyBjb3VsZCBtZWFuIHRoYXQgYSBzdG9sZW4ga2V5IGlzIGJlaW5nIHVzZWQgdG8iKTsKLQkJZXJyb3IoImltcGVyc29uYXRlIHRoaXMgaG9zdC4iKTsKLQotCQkvKgotCQkgKiBJZiBzdHJpY3QgaG9zdCBrZXkgY2hlY2tpbmcgaXMgaW4gdXNlLCB0aGUgdXNlciB3aWxsIGhhdmUKLQkJICogdG8gZWRpdCB0aGUga2V5IG1hbnVhbGx5IGFuZCB3ZSBjYW4gb25seSBhYm9ydC4KLQkJICovCi0JCWlmIChvcHRpb25zLnN0cmljdF9ob3N0X2tleV9jaGVja2luZykgewotCQkJZXJyb3IoIiVzIGhvc3Qga2V5IGZvciAlLjIwMHMgd2FzIHJldm9rZWQgYW5kIHlvdSBoYXZlICIKLQkJCSAgICAicmVxdWVzdGVkIHN0cmljdCBjaGVja2luZy4iLCB0eXBlLCBob3N0KTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlnb3RvIGNvbnRpbnVlX3Vuc2FmZTsKLQotCWNhc2UgSE9TVF9DSEFOR0VEOgotCQlpZiAod2FudF9jZXJ0KSB7Ci0JCQkvKgotCQkJICogVGhpcyBpcyBvbmx5IGEgZGVidWcoKSBzaW5jZSBpdCBpcyB2YWxpZCB0byBoYXZlCi0JCQkgKiBDQXMgd2l0aCB3aWxkY2FyZCBETlMgbWF0Y2hlcyB0aGF0IGRvbid0IG1hdGNoCi0JCQkgKiBhbGwgaG9zdHMgdGhhdCBvbmUgbWlnaHQgdmlzaXQuCi0JCQkgKi8KLQkJCWRlYnVnKCJIb3N0IGNlcnRpZmljYXRlIGF1dGhvcml0eSBkb2VzIG5vdCAiCi0JCQkgICAgIm1hdGNoICVzIGluICVzOiVsdSIsIENBX01BUktFUiwKLQkJCSAgICBob3N0X2ZvdW5kLT5maWxlLCBob3N0X2ZvdW5kLT5saW5lKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlpZiAocmVhZG9ubHkgPT0gUk9RVUlFVCkKLQkJCWdvdG8gZmFpbDsKLQkJaWYgKG9wdGlvbnMuY2hlY2tfaG9zdF9pcCAmJiBob3N0X2lwX2RpZmZlcikgewotCQkJY2hhciAqa2V5X21zZzsKLQkJCWlmIChpcF9zdGF0dXMgPT0gSE9TVF9ORVcpCi0JCQkJa2V5X21zZyA9ICJpcyB1bmtub3duIjsKLQkJCWVsc2UgaWYgKGlwX3N0YXR1cyA9PSBIT1NUX09LKQotCQkJCWtleV9tc2cgPSAiaXMgdW5jaGFuZ2VkIjsKLQkJCWVsc2UKLQkJCQlrZXlfbXNnID0gImhhcyBhIGRpZmZlcmVudCB2YWx1ZSI7Ci0JCQllcnJvcigiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAiKTsKLQkJCWVycm9yKCJAICAgICAgIFdBUk5JTkc6IFBPU1NJQkxFIEROUyBTUE9PRklORyBERVRFQ1RFRCEgICAgICAgICAgQCIpOwotCQkJZXJyb3IoIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIik7Ci0JCQllcnJvcigiVGhlICVzIGhvc3Qga2V5IGZvciAlcyBoYXMgY2hhbmdlZCwiLCB0eXBlLCBob3N0KTsKLQkJCWVycm9yKCJhbmQgdGhlIGtleSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgSVAgYWRkcmVzcyAlcyIsIGlwKTsKLQkJCWVycm9yKCIlcy4gVGhpcyBjb3VsZCBlaXRoZXIgbWVhbiB0aGF0Iiwga2V5X21zZyk7Ci0JCQllcnJvcigiRE5TIFNQT09GSU5HIGlzIGhhcHBlbmluZyBvciB0aGUgSVAgYWRkcmVzcyBmb3IgdGhlIGhvc3QiKTsKLQkJCWVycm9yKCJhbmQgaXRzIGhvc3Qga2V5IGhhdmUgY2hhbmdlZCBhdCB0aGUgc2FtZSB0aW1lLiIpOwotCQkJaWYgKGlwX3N0YXR1cyAhPSBIT1NUX05FVykKLQkJCQllcnJvcigiT2ZmZW5kaW5nIGtleSBmb3IgSVAgaW4gJXM6JWx1IiwKLQkJCQkgICAgaXBfZm91bmQtPmZpbGUsIGlwX2ZvdW5kLT5saW5lKTsKLQkJfQotCQkvKiBUaGUgaG9zdCBrZXkgaGFzIGNoYW5nZWQuICovCi0JCXdhcm5fY2hhbmdlZF9rZXkoaG9zdF9rZXkpOwotCQllcnJvcigiQWRkIGNvcnJlY3QgaG9zdCBrZXkgaW4gJS4xMDBzIHRvIGdldCByaWQgb2YgdGhpcyBtZXNzYWdlLiIsCi0JCSAgICB1c2VyX2hvc3RmaWxlc1swXSk7Ci0JCWVycm9yKCJPZmZlbmRpbmcgJXMga2V5IGluICVzOiVsdSIsIGtleV90eXBlKGhvc3RfZm91bmQtPmtleSksCi0JCSAgICBob3N0X2ZvdW5kLT5maWxlLCBob3N0X2ZvdW5kLT5saW5lKTsKLQotCQkvKgotCQkgKiBJZiBzdHJpY3QgaG9zdCBrZXkgY2hlY2tpbmcgaXMgaW4gdXNlLCB0aGUgdXNlciB3aWxsIGhhdmUKLQkJICogdG8gZWRpdCB0aGUga2V5IG1hbnVhbGx5IGFuZCB3ZSBjYW4gb25seSBhYm9ydC4KLQkJICovCi0JCWlmIChvcHRpb25zLnN0cmljdF9ob3N0X2tleV9jaGVja2luZykgewotCQkJZXJyb3IoIiVzIGhvc3Qga2V5IGZvciAlLjIwMHMgaGFzIGNoYW5nZWQgYW5kIHlvdSBoYXZlICIKLQkJCSAgICAicmVxdWVzdGVkIHN0cmljdCBjaGVja2luZy4iLCB0eXBlLCBob3N0KTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0gY29udGludWVfdW5zYWZlOgotCQkvKgotCQkgKiBJZiBzdHJpY3QgaG9zdCBrZXkgY2hlY2tpbmcgaGFzIG5vdCBiZWVuIHJlcXVlc3RlZCwgYWxsb3cKLQkJICogdGhlIGNvbm5lY3Rpb24gYnV0IHdpdGhvdXQgTUlUTS1hYmxlIGF1dGhlbnRpY2F0aW9uIG9yCi0JCSAqIGZvcndhcmRpbmcuCi0JCSAqLwotCQlpZiAob3B0aW9ucy5wYXNzd29yZF9hdXRoZW50aWNhdGlvbikgewotCQkJZXJyb3IoIlBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGlzIGRpc2FibGVkIHRvIGF2b2lkICIKLQkJCSAgICAibWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcy4iKTsKLQkJCW9wdGlvbnMucGFzc3dvcmRfYXV0aGVudGljYXRpb24gPSAwOwotCQkJY2FuY2VsbGVkX2ZvcndhcmRpbmcgPSAxOwotCQl9Ci0JCWlmIChvcHRpb25zLmtiZF9pbnRlcmFjdGl2ZV9hdXRoZW50aWNhdGlvbikgewotCQkJZXJyb3IoIktleWJvYXJkLWludGVyYWN0aXZlIGF1dGhlbnRpY2F0aW9uIGlzIGRpc2FibGVkIgotCQkJICAgICIgdG8gYXZvaWQgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcy4iKTsKLQkJCW9wdGlvbnMua2JkX2ludGVyYWN0aXZlX2F1dGhlbnRpY2F0aW9uID0gMDsKLQkJCW9wdGlvbnMuY2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uID0gMDsKLQkJCWNhbmNlbGxlZF9mb3J3YXJkaW5nID0gMTsKLQkJfQotCQlpZiAob3B0aW9ucy5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24pIHsKLQkJCWVycm9yKCJDaGFsbGVuZ2UvcmVzcG9uc2UgYXV0aGVudGljYXRpb24gaXMgZGlzYWJsZWQiCi0JCQkgICAgIiB0byBhdm9pZCBtYW4taW4tdGhlLW1pZGRsZSBhdHRhY2tzLiIpOwotCQkJb3B0aW9ucy5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24gPSAwOwotCQkJY2FuY2VsbGVkX2ZvcndhcmRpbmcgPSAxOwotCQl9Ci0JCWlmIChvcHRpb25zLmZvcndhcmRfYWdlbnQpIHsKLQkJCWVycm9yKCJBZ2VudCBmb3J3YXJkaW5nIGlzIGRpc2FibGVkIHRvIGF2b2lkICIKLQkJCSAgICAibWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcy4iKTsKLQkJCW9wdGlvbnMuZm9yd2FyZF9hZ2VudCA9IDA7Ci0JCQljYW5jZWxsZWRfZm9yd2FyZGluZyA9IDE7Ci0JCX0KLQkJaWYgKG9wdGlvbnMuZm9yd2FyZF94MTEpIHsKLQkJCWVycm9yKCJYMTEgZm9yd2FyZGluZyBpcyBkaXNhYmxlZCB0byBhdm9pZCAiCi0JCQkgICAgIm1hbi1pbi10aGUtbWlkZGxlIGF0dGFja3MuIik7Ci0JCQlvcHRpb25zLmZvcndhcmRfeDExID0gMDsKLQkJCWNhbmNlbGxlZF9mb3J3YXJkaW5nID0gMTsKLQkJfQotCQlpZiAob3B0aW9ucy5udW1fbG9jYWxfZm9yd2FyZHMgPiAwIHx8Ci0JCSAgICBvcHRpb25zLm51bV9yZW1vdGVfZm9yd2FyZHMgPiAwKSB7Ci0JCQllcnJvcigiUG9ydCBmb3J3YXJkaW5nIGlzIGRpc2FibGVkIHRvIGF2b2lkICIKLQkJCSAgICAibWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcy4iKTsKLQkJCW9wdGlvbnMubnVtX2xvY2FsX2ZvcndhcmRzID0KLQkJCSAgICBvcHRpb25zLm51bV9yZW1vdGVfZm9yd2FyZHMgPSAwOwotCQkJY2FuY2VsbGVkX2ZvcndhcmRpbmcgPSAxOwotCQl9Ci0JCWlmIChvcHRpb25zLnR1bl9vcGVuICE9IFNTSF9UVU5NT0RFX05PKSB7Ci0JCQllcnJvcigiVHVubmVsIGZvcndhcmRpbmcgaXMgZGlzYWJsZWQgdG8gYXZvaWQgIgotCQkJICAgICJtYW4taW4tdGhlLW1pZGRsZSBhdHRhY2tzLiIpOwotCQkJb3B0aW9ucy50dW5fb3BlbiA9IFNTSF9UVU5NT0RFX05POwotCQkJY2FuY2VsbGVkX2ZvcndhcmRpbmcgPSAxOwotCQl9Ci0JCWlmIChvcHRpb25zLmV4aXRfb25fZm9yd2FyZF9mYWlsdXJlICYmIGNhbmNlbGxlZF9mb3J3YXJkaW5nKQotCQkJZmF0YWwoIkVycm9yOiBmb3J3YXJkaW5nIGRpc2FibGVkIGR1ZSB0byBob3N0IGtleSAiCi0JCQkgICAgImNoZWNrIGZhaWx1cmUiKTsKLQkJCi0JCS8qCi0JCSAqIFhYWCBTaG91bGQgcGVybWl0IHRoZSB1c2VyIHRvIGNoYW5nZSB0byB1c2UgdGhlIG5ldyBpZC4KLQkJICogVGhpcyBjb3VsZCBiZSBkb25lIGJ5IGNvbnZlcnRpbmcgdGhlIGhvc3Qga2V5IHRvIGFuCi0JCSAqIGlkZW50aWZ5aW5nIHNlbnRlbmNlLCB0ZWxsIHRoYXQgdGhlIGhvc3QgaWRlbnRpZmllcyBpdHNlbGYKLQkJICogYnkgdGhhdCBzZW50ZW5jZSwgYW5kIGFzayB0aGUgdXNlciBpZiBoZS9zaGUgd2lzaGVzIHRvCi0JCSAqIGFjY2VwdCB0aGUgYXV0aGVudGljYXRpb24uCi0JCSAqLwotCQlicmVhazsKLQljYXNlIEhPU1RfRk9VTkQ6Ci0JCWZhdGFsKCJpbnRlcm5hbCBlcnJvciIpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAob3B0aW9ucy5jaGVja19ob3N0X2lwICYmIGhvc3Rfc3RhdHVzICE9IEhPU1RfQ0hBTkdFRCAmJgotCSAgICBpcF9zdGF0dXMgPT0gSE9TVF9DSEFOR0VEKSB7Ci0JCXNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksCi0JCSAgICAiV2FybmluZzogdGhlICVzIGhvc3Qga2V5IGZvciAnJS4yMDBzJyAiCi0JCSAgICAiZGlmZmVycyBmcm9tIHRoZSBrZXkgZm9yIHRoZSBJUCBhZGRyZXNzICclLjEyOHMnIgotCQkgICAgIlxuT2ZmZW5kaW5nIGtleSBmb3IgSVAgaW4gJXM6JWx1IiwKLQkJICAgIHR5cGUsIGhvc3QsIGlwLCBpcF9mb3VuZC0+ZmlsZSwgaXBfZm91bmQtPmxpbmUpOwotCQlpZiAoaG9zdF9zdGF0dXMgPT0gSE9TVF9PSykgewotCQkJbGVuID0gc3RybGVuKG1zZyk7Ci0JCQlzbnByaW50Zihtc2cgKyBsZW4sIHNpemVvZihtc2cpIC0gbGVuLAotCQkJICAgICJcbk1hdGNoaW5nIGhvc3Qga2V5IGluICVzOiVsdSIsCi0JCQkgICAgaG9zdF9mb3VuZC0+ZmlsZSwgaG9zdF9mb3VuZC0+bGluZSk7Ci0JCX0KLQkJaWYgKG9wdGlvbnMuc3RyaWN0X2hvc3Rfa2V5X2NoZWNraW5nID09IDEpIHsKLQkJCWxvZ2l0KCIlcyIsIG1zZyk7Ci0JCQllcnJvcigiRXhpdGluZywgeW91IGhhdmUgcmVxdWVzdGVkIHN0cmljdCBjaGVja2luZy4iKTsKLQkJCWdvdG8gZmFpbDsKLQkJfSBlbHNlIGlmIChvcHRpb25zLnN0cmljdF9ob3N0X2tleV9jaGVja2luZyA9PSAyKSB7Ci0JCQlzdHJsY2F0KG1zZywgIlxuQXJlIHlvdSBzdXJlIHlvdSB3YW50ICIKLQkJCSAgICAidG8gY29udGludWUgY29ubmVjdGluZyAoeWVzL25vKT8gIiwgc2l6ZW9mKG1zZykpOwotCQkJaWYgKCFjb25maXJtKG1zZykpCi0JCQkJZ290byBmYWlsOwotCQl9IGVsc2UgewotCQkJbG9naXQoIiVzIiwgbXNnKTsKLQkJfQotCX0KLQotCXhmcmVlKGlwKTsKLQl4ZnJlZShob3N0KTsKLQlpZiAoaG9zdF9ob3N0a2V5cyAhPSBOVUxMKQotCQlmcmVlX2hvc3RrZXlzKGhvc3RfaG9zdGtleXMpOwotCWlmIChpcF9ob3N0a2V5cyAhPSBOVUxMKQotCQlmcmVlX2hvc3RrZXlzKGlwX2hvc3RrZXlzKTsKLQlyZXR1cm4gMDsKLQotZmFpbDoKLQlpZiAod2FudF9jZXJ0ICYmIGhvc3Rfc3RhdHVzICE9IEhPU1RfUkVWT0tFRCkgewotCQkvKgotCQkgKiBObyBtYXRjaGluZyBjZXJ0aWZpY2F0ZS4gRG93bmdyYWRlIGNlcnQgdG8gcmF3IGtleSBhbmQKLQkJICogc2VhcmNoIG5vcm1hbGx5LgotCQkgKi8KLQkJZGVidWcoIk5vIG1hdGNoaW5nIENBIGZvdW5kLiBSZXRyeSB3aXRoIHBsYWluIGtleSIpOwotCQlyYXdfa2V5ID0ga2V5X2Zyb21fcHJpdmF0ZShob3N0X2tleSk7Ci0JCWlmIChrZXlfZHJvcF9jZXJ0KHJhd19rZXkpICE9IDApCi0JCQlmYXRhbCgiQ291bGRuJ3QgZHJvcCBjZXJ0aWZpY2F0ZSIpOwotCQlob3N0X2tleSA9IHJhd19rZXk7Ci0JCWdvdG8gcmV0cnk7Ci0JfQotCWlmIChyYXdfa2V5ICE9IE5VTEwpCi0JCWtleV9mcmVlKHJhd19rZXkpOwotCXhmcmVlKGlwKTsKLQl4ZnJlZShob3N0KTsKLQlpZiAoaG9zdF9ob3N0a2V5cyAhPSBOVUxMKQotCQlmcmVlX2hvc3RrZXlzKGhvc3RfaG9zdGtleXMpOwotCWlmIChpcF9ob3N0a2V5cyAhPSBOVUxMKQotCQlmcmVlX2hvc3RrZXlzKGlwX2hvc3RrZXlzKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qIHJldHVybnMgMCBpZiBrZXkgdmVyaWZpZXMgb3IgLTEgaWYga2V5IGRvZXMgTk9UIHZlcmlmeSAqLwotaW50Ci12ZXJpZnlfaG9zdF9rZXkoY2hhciAqaG9zdCwgc3RydWN0IHNvY2thZGRyICpob3N0YWRkciwgS2V5ICpob3N0X2tleSkKLXsKLQlpbnQgZmxhZ3MgPSAwOwotCWNoYXIgKmZwOwotCi0JZnAgPSBrZXlfZmluZ2VycHJpbnQoaG9zdF9rZXksIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOwotCWRlYnVnKCJTZXJ2ZXIgaG9zdCBrZXk6ICVzICVzIiwga2V5X3R5cGUoaG9zdF9rZXkpLCBmcCk7Ci0JeGZyZWUoZnApOwotCi0JLyogWFhYIGNlcnRzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBmb3IgRE5TICovCi0JaWYgKCFrZXlfaXNfY2VydChob3N0X2tleSkgJiYgb3B0aW9ucy52ZXJpZnlfaG9zdF9rZXlfZG5zICYmCi0JICAgIHZlcmlmeV9ob3N0X2tleV9kbnMoaG9zdCwgaG9zdGFkZHIsIGhvc3Rfa2V5LCAmZmxhZ3MpID09IDApIHsKLQkJaWYgKGZsYWdzICYgRE5TX1ZFUklGWV9GT1VORCkgewotCi0JCQlpZiAob3B0aW9ucy52ZXJpZnlfaG9zdF9rZXlfZG5zID09IDEgJiYKLQkJCSAgICBmbGFncyAmIEROU19WRVJJRllfTUFUQ0ggJiYKLQkJCSAgICBmbGFncyAmIEROU19WRVJJRllfU0VDVVJFKQotCQkJCXJldHVybiAwOwotCi0JCQlpZiAoZmxhZ3MgJiBETlNfVkVSSUZZX01BVENIKSB7Ci0JCQkJbWF0Y2hpbmdfaG9zdF9rZXlfZG5zID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJd2Fybl9jaGFuZ2VkX2tleShob3N0X2tleSk7Ci0JCQkJZXJyb3IoIlVwZGF0ZSB0aGUgU1NIRlAgUlIgaW4gRE5TIHdpdGggdGhlIG5ldyAiCi0JCQkJICAgICJob3N0IGtleSB0byBnZXQgcmlkIG9mIHRoaXMgbWVzc2FnZS4iKTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBjaGVja19ob3N0X2tleShob3N0LCBob3N0YWRkciwgb3B0aW9ucy5wb3J0LCBob3N0X2tleSwgUkRSVywKLQkgICAgb3B0aW9ucy51c2VyX2hvc3RmaWxlcywgb3B0aW9ucy5udW1fdXNlcl9ob3N0ZmlsZXMsCi0JICAgIG9wdGlvbnMuc3lzdGVtX2hvc3RmaWxlcywgb3B0aW9ucy5udW1fc3lzdGVtX2hvc3RmaWxlcyk7Ci19Ci0KLS8qCi0gKiBTdGFydHMgYSBkaWFsb2cgd2l0aCB0aGUgc2VydmVyLCBhbmQgYXV0aGVudGljYXRlcyB0aGUgY3VycmVudCB1c2VyIG9uIHRoZQotICogc2VydmVyLiAgVGhpcyBkb2VzIG5vdCBuZWVkIGFueSBleHRyYSBwcml2aWxlZ2VzLiAgVGhlIGJhc2ljIGNvbm5lY3Rpb24KLSAqIHRvIHRoZSBzZXJ2ZXIgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBlc3RhYmxpc2hlZCBiZWZvcmUgdGhpcyBpcyBjYWxsZWQuCi0gKiBJZiBsb2dpbiBmYWlscywgdGhpcyBmdW5jdGlvbiBwcmludHMgYW4gZXJyb3IgYW5kIG5ldmVyIHJldHVybnMuCi0gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJlcXVpcmUgc3VwZXItdXNlciBwcml2aWxlZ2VzLgotICovCi12b2lkCi1zc2hfbG9naW4oU2Vuc2l0aXZlICpzZW5zaXRpdmUsIGNvbnN0IGNoYXIgKm9yaWdob3N0LAotICAgIHN0cnVjdCBzb2NrYWRkciAqaG9zdGFkZHIsIHVfc2hvcnQgcG9ydCwgc3RydWN0IHBhc3N3ZCAqcHcsIGludCB0aW1lb3V0X21zKQotewotCWNoYXIgKmhvc3QsICpjcDsKLQljaGFyICpzZXJ2ZXJfdXNlciwgKmxvY2FsX3VzZXI7Ci0KLQlsb2NhbF91c2VyID0geHN0cmR1cChwdy0+cHdfbmFtZSk7Ci0Jc2VydmVyX3VzZXIgPSBvcHRpb25zLnVzZXIgPyBvcHRpb25zLnVzZXIgOiBsb2NhbF91c2VyOwotCi0JLyogQ29udmVydCB0aGUgdXNlci1zdXBwbGllZCBob3N0bmFtZSBpbnRvIGFsbCBsb3dlcmNhc2UuICovCi0JaG9zdCA9IHhzdHJkdXAob3JpZ2hvc3QpOwotCWZvciAoY3AgPSBob3N0OyAqY3A7IGNwKyspCi0JCWlmIChpc3VwcGVyKCpjcCkpCi0JCQkqY3AgPSAoY2hhcil0b2xvd2VyKCpjcCk7Ci0KLQkvKiBFeGNoYW5nZSBwcm90b2NvbCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uIHN0cmluZ3Mgd2l0aCB0aGUgc2VydmVyLiAqLwotCXNzaF9leGNoYW5nZV9pZGVudGlmaWNhdGlvbih0aW1lb3V0X21zKTsKLQotCS8qIFB1dCB0aGUgY29ubmVjdGlvbiBpbnRvIG5vbi1ibG9ja2luZyBtb2RlLiAqLwotCXBhY2tldF9zZXRfbm9uYmxvY2tpbmcoKTsKLQotCS8qIGtleSBleGNoYW5nZSAqLwotCS8qIGF1dGhlbnRpY2F0ZSB1c2VyICovCi0JaWYgKGNvbXBhdDIwKSB7Ci0JCXNzaF9rZXgyKGhvc3QsIGhvc3RhZGRyLCBwb3J0KTsKLQkJc3NoX3VzZXJhdXRoMihsb2NhbF91c2VyLCBzZXJ2ZXJfdXNlciwgaG9zdCwgc2Vuc2l0aXZlKTsKLQl9IGVsc2UgewotCQlzc2hfa2V4KGhvc3QsIGhvc3RhZGRyKTsKLQkJc3NoX3VzZXJhdXRoMShsb2NhbF91c2VyLCBzZXJ2ZXJfdXNlciwgaG9zdCwgc2Vuc2l0aXZlKTsKLQl9Ci0JeGZyZWUobG9jYWxfdXNlcik7Ci19Ci0KLXZvaWQKLXNzaF9wdXRfcGFzc3dvcmQoY2hhciAqcGFzc3dvcmQpCi17Ci0JaW50IHNpemU7Ci0JY2hhciAqcGFkZGVkOwotCi0JaWYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19QQVNTV09SRFBBRCkgewotCQlwYWNrZXRfcHV0X2NzdHJpbmcocGFzc3dvcmQpOwotCQlyZXR1cm47Ci0JfQotCXNpemUgPSByb3VuZHVwKHN0cmxlbihwYXNzd29yZCkgKyAxLCAzMik7Ci0JcGFkZGVkID0geGNhbGxvYygxLCBzaXplKTsKLQlzdHJsY3B5KHBhZGRlZCwgcGFzc3dvcmQsIHNpemUpOwotCXBhY2tldF9wdXRfc3RyaW5nKHBhZGRlZCwgc2l6ZSk7Ci0JbWVtc2V0KHBhZGRlZCwgMCwgc2l6ZSk7Ci0JeGZyZWUocGFkZGVkKTsKLX0KLQotLyogcHJpbnQgYWxsIGtub3duIGhvc3Qga2V5cyBmb3IgYSBnaXZlbiBob3N0LCBidXQgc2tpcCBrZXlzIG9mIGdpdmVuIHR5cGUgKi8KLXN0YXRpYyBpbnQKLXNob3dfb3RoZXJfa2V5cyhzdHJ1Y3QgaG9zdGtleXMgKmhvc3RrZXlzLCBLZXkgKmtleSkKLXsKLQlpbnQgdHlwZVtdID0geyBLRVlfUlNBMSwgS0VZX1JTQSwgS0VZX0RTQSwgS0VZX0VDRFNBLCAtMX07Ci0JaW50IGksIHJldCA9IDA7Ci0JY2hhciAqZnAsICpyYTsKLQljb25zdCBzdHJ1Y3QgaG9zdGtleV9lbnRyeSAqZm91bmQ7Ci0KLQlmb3IgKGkgPSAwOyB0eXBlW2ldICE9IC0xOyBpKyspIHsKLQkJaWYgKHR5cGVbaV0gPT0ga2V5LT50eXBlKQotCQkJY29udGludWU7Ci0JCWlmICghbG9va3VwX2tleV9pbl9ob3N0a2V5c19ieV90eXBlKGhvc3RrZXlzLCB0eXBlW2ldLCAmZm91bmQpKQotCQkJY29udGludWU7Ci0JCWZwID0ga2V5X2ZpbmdlcnByaW50KGZvdW5kLT5rZXksIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOwotCQlyYSA9IGtleV9maW5nZXJwcmludChmb3VuZC0+a2V5LCBTU0hfRlBfTUQ1LCBTU0hfRlBfUkFORE9NQVJUKTsKLQkJbG9naXQoIldBUk5JTkc6ICVzIGtleSBmb3VuZCBmb3IgaG9zdCAlc1xuIgotCQkgICAgImluICVzOiVsdVxuIgotCQkgICAgIiVzIGtleSBmaW5nZXJwcmludCAlcy4iLAotCQkgICAga2V5X3R5cGUoZm91bmQtPmtleSksCi0JCSAgICBmb3VuZC0+aG9zdCwgZm91bmQtPmZpbGUsIGZvdW5kLT5saW5lLAotCQkgICAga2V5X3R5cGUoZm91bmQtPmtleSksIGZwKTsKLQkJaWYgKG9wdGlvbnMudmlzdWFsX2hvc3Rfa2V5KQotCQkJbG9naXQoIiVzIiwgcmEpOwotCQl4ZnJlZShyYSk7Ci0JCXhmcmVlKGZwKTsKLQkJcmV0ID0gMTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQKLXdhcm5fY2hhbmdlZF9rZXkoS2V5ICpob3N0X2tleSkKLXsKLQljaGFyICpmcDsKLQotCWZwID0ga2V5X2ZpbmdlcnByaW50KGhvc3Rfa2V5LCBTU0hfRlBfTUQ1LCBTU0hfRlBfSEVYKTsKLQotCWVycm9yKCJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCIpOwotCWVycm9yKCJAICAgIFdBUk5JTkc6IFJFTU9URSBIT1NUIElERU5USUZJQ0FUSU9OIEhBUyBDSEFOR0VEISAgICAgQCIpOwotCWVycm9yKCJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCIpOwotCWVycm9yKCJJVCBJUyBQT1NTSUJMRSBUSEFUIFNPTUVPTkUgSVMgRE9JTkcgU09NRVRISU5HIE5BU1RZISIpOwotCWVycm9yKCJTb21lb25lIGNvdWxkIGJlIGVhdmVzZHJvcHBpbmcgb24geW91IHJpZ2h0IG5vdyAobWFuLWluLXRoZS1taWRkbGUgYXR0YWNrKSEiKTsKLQllcnJvcigiSXQgaXMgYWxzbyBwb3NzaWJsZSB0aGF0IGEgaG9zdCBrZXkgaGFzIGp1c3QgYmVlbiBjaGFuZ2VkLiIpOwotCWVycm9yKCJUaGUgZmluZ2VycHJpbnQgZm9yIHRoZSAlcyBrZXkgc2VudCBieSB0aGUgcmVtb3RlIGhvc3QgaXNcbiVzLiIsCi0JICAgIGtleV90eXBlKGhvc3Rfa2V5KSwgZnApOwotCWVycm9yKCJQbGVhc2UgY29udGFjdCB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yLiIpOwotCi0JeGZyZWUoZnApOwotfQotCi0vKgotICogRXhlY3V0ZSBhIGxvY2FsIGNvbW1hbmQKLSAqLwotaW50Ci1zc2hfbG9jYWxfY21kKGNvbnN0IGNoYXIgKmFyZ3MpCi17Ci0JY2hhciAqc2hlbGw7Ci0JcGlkX3QgcGlkOwotCWludCBzdGF0dXM7Ci0Jdm9pZCAoKm9zaWdoYW5kKShpbnQpOwotCi0JaWYgKCFvcHRpb25zLnBlcm1pdF9sb2NhbF9jb21tYW5kIHx8Ci0JICAgIGFyZ3MgPT0gTlVMTCB8fCAhKmFyZ3MpCi0JCXJldHVybiAoMSk7Ci0KLQlpZiAoKHNoZWxsID0gZ2V0ZW52KCJTSEVMTCIpKSA9PSBOVUxMIHx8ICpzaGVsbCA9PSAnXDAnKQotCQlzaGVsbCA9IF9QQVRIX0JTSEVMTDsKLQotCW9zaWdoYW5kID0gc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOwotCXBpZCA9IGZvcmsoKTsKLQlpZiAocGlkID09IDApIHsKLQkJc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOwotCQlkZWJ1ZzMoIkV4ZWN1dGluZyAlcyAtYyBcIiVzXCIiLCBzaGVsbCwgYXJncyk7Ci0JCWV4ZWNsKHNoZWxsLCBzaGVsbCwgIi1jIiwgYXJncywgKGNoYXIgKilOVUxMKTsKLQkJZXJyb3IoIkNvdWxkbid0IGV4ZWN1dGUgJXMgLWMgXCIlc1wiOiAlcyIsCi0JCSAgICBzaGVsbCwgYXJncywgc3RyZXJyb3IoZXJybm8pKTsKLQkJX2V4aXQoMSk7Ci0JfSBlbHNlIGlmIChwaWQgPT0gLTEpCi0JCWZhdGFsKCJmb3JrIGZhaWxlZDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQl3aGlsZSAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApID09IC0xKQotCQlpZiAoZXJybm8gIT0gRUlOVFIpCi0JCQlmYXRhbCgiQ291bGRuJ3Qgd2FpdCBmb3IgY2hpbGQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQlzaWduYWwoU0lHQ0hMRCwgb3NpZ2hhbmQpOwotCi0JaWYgKCFXSUZFWElURUQoc3RhdHVzKSkKLQkJcmV0dXJuICgxKTsKLQotCXJldHVybiAoV0VYSVRTVEFUVVMoc3RhdHVzKSk7Ci19CmRpZmYgLS1naXQgYS9zc2hjb25uZWN0LmggYi9zc2hjb25uZWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkN2Y3ZjcuLjAwMDAwMDAKLS0tIGEvc3NoY29ubmVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNzaGNvbm5lY3QuaCx2IDEuMjcgMjAxMC8xMS8yOSAyMzo0NTo1MSBkam0gRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgU2Vuc2l0aXZlIFNlbnNpdGl2ZTsKLXN0cnVjdCBTZW5zaXRpdmUgewotCUtleQkqKmtleXM7Ci0JaW50CW5rZXlzOwotCWludAlleHRlcm5hbF9rZXlzaWduOwotfTsKLQotaW50Ci1zc2hfY29ubmVjdChjb25zdCBjaGFyICosIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICosIHVfc2hvcnQsIGludCwgaW50LAotICAgIGludCAqLCBpbnQsIGludCwgY29uc3QgY2hhciAqKTsKLXZvaWQJIHNzaF9raWxsX3Byb3h5X2NvbW1hbmQodm9pZCk7Ci0KLXZvaWQJIHNzaF9sb2dpbihTZW5zaXRpdmUgKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc29ja2FkZHIgKiwgdV9zaG9ydCwKLSAgICBzdHJ1Y3QgcGFzc3dkICosIGludCk7Ci0KLXZvaWQJIHNzaF9leGNoYW5nZV9pZGVudGlmaWNhdGlvbihpbnQpOwotCi1pbnQJIHZlcmlmeV9ob3N0X2tleShjaGFyICosIHN0cnVjdCBzb2NrYWRkciAqLCBLZXkgKik7Ci0KLXZvaWQJIGdldF9ob3N0ZmlsZV9ob3N0bmFtZV9pcGFkZHIoY2hhciAqLCBzdHJ1Y3Qgc29ja2FkZHIgKiwgdV9zaG9ydCwKLSAgICBjaGFyICoqLCBjaGFyICoqKTsKLQotdm9pZAkgc3NoX2tleChjaGFyICosIHN0cnVjdCBzb2NrYWRkciAqKTsKLXZvaWQJIHNzaF9rZXgyKGNoYXIgKiwgc3RydWN0IHNvY2thZGRyICosIHVfc2hvcnQpOwotCi12b2lkCSBzc2hfdXNlcmF1dGgxKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjaGFyICosIFNlbnNpdGl2ZSAqKTsKLXZvaWQJIHNzaF91c2VyYXV0aDIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIgKiwgU2Vuc2l0aXZlICopOwotCi12b2lkCSBzc2hfcHV0X3Bhc3N3b3JkKGNoYXIgKik7Ci1pbnQJIHNzaF9sb2NhbF9jbWQoY29uc3QgY2hhciAqKTsKLQotLyoKLSAqIE1hY3JvcyB0byByYWlzZS9sb3dlciBwZXJtaXNzaW9ucy4KLSAqLwotI2RlZmluZSBQUklWX1NUQVJUIGRvIHsJCQkJCVwKLQlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwkJCQlcCi0JaWYgKHNldGV1aWQob3JpZ2luYWxfZWZmZWN0aXZlX3VpZCkgIT0gMCkJXAotCQlmYXRhbCgiUFJJVl9TVEFSVDogc2V0ZXVpZDogJXMiLAlcCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwkJCVwKLQllcnJubyA9IHNhdmVfZXJybm87CQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgUFJJVl9FTkQgZG8gewkJCQkJXAotCWludCBzYXZlX2Vycm5vID0gZXJybm87CQkJCVwKLQlpZiAoc2V0ZXVpZChvcmlnaW5hbF9yZWFsX3VpZCkgIT0gMCkJCVwKLQkJZmF0YWwoIlBSSVZfRU5EOiBzZXRldWlkOiAlcyIsCQlcCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwkJCVwKLQllcnJubyA9IHNhdmVfZXJybm87CQkJCVwKLX0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9zc2hjb25uZWN0MS5jIGIvc3NoY29ubmVjdDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwN2JiZi4uMDAwMDAwMAotLS0gYS9zc2hjb25uZWN0MS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUzICswLDAgQEAKLS8qICRPcGVuQlNEOiBzc2hjb25uZWN0MS5jLHYgMS43MCAyMDA2LzExLzA2IDIxOjI1OjI4IG1hcmt1cyBFeHAgJCAqLwotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIENvZGUgdG8gY29ubmVjdCB0byBhIHJlbW90ZSBob3N0LCBhbmQgdG8gcGVyZm9ybSB0aGUgY2xpZW50IHNpZGUgb2YgdGhlCi0gKiBsb2dpbiAoYXV0aGVudGljYXRpb24pIGRpYWxvZy4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgotI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+Ci0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHB3ZC5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInNzaC5oIgotI2luY2x1ZGUgInNzaDEuaCIKLSNpbmNsdWRlICJyc2EuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJjaXBoZXIuaCIKLSNpbmNsdWRlICJrZXguaCIKLSNpbmNsdWRlICJ1aWRzd2FwLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAicmVhZGNvbmYuaCIKLSNpbmNsdWRlICJhdXRoZmQuaCIKLSNpbmNsdWRlICJzc2hjb25uZWN0LmgiCi0jaW5jbHVkZSAiYXV0aGZpbGUuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0jaW5jbHVkZSAiY2Fub2hvc3QuaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotI2luY2x1ZGUgImF1dGguaCIKLQotLyogU2Vzc2lvbiBpZCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi4gKi8KLXVfY2hhciBzZXNzaW9uX2lkWzE2XTsKLXVfaW50IHN1cHBvcnRlZF9hdXRoZW50aWNhdGlvbnMgPSAwOwotCi1leHRlcm4gT3B0aW9ucyBvcHRpb25zOwotZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7Ci0KLS8qCi0gKiBDaGVja3MgaWYgdGhlIHVzZXIgaGFzIGFuIGF1dGhlbnRpY2F0aW9uIGFnZW50LCBhbmQgaWYgc28sIHRyaWVzIHRvCi0gKiBhdXRoZW50aWNhdGUgdXNpbmcgdGhlIGFnZW50LgotICovCi1zdGF0aWMgaW50Ci10cnlfYWdlbnRfYXV0aGVudGljYXRpb24odm9pZCkKLXsKLQlpbnQgdHlwZTsKLQljaGFyICpjb21tZW50OwotCUF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqYXV0aDsKLQl1X2NoYXIgcmVzcG9uc2VbMTZdOwotCXVfaW50IGk7Ci0JS2V5ICprZXk7Ci0JQklHTlVNICpjaGFsbGVuZ2U7Ci0KLQkvKiBHZXQgY29ubmVjdGlvbiB0byB0aGUgYWdlbnQuICovCi0JYXV0aCA9IHNzaF9nZXRfYXV0aGVudGljYXRpb25fY29ubmVjdGlvbigpOwotCWlmICghYXV0aCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoKGNoYWxsZW5nZSA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgidHJ5X2FnZW50X2F1dGhlbnRpY2F0aW9uOiBCTl9uZXcgZmFpbGVkIik7Ci0JLyogTG9vcCB0aHJvdWdoIGlkZW50aXRpZXMgc2VydmVkIGJ5IHRoZSBhZ2VudC4gKi8KLQlmb3IgKGtleSA9IHNzaF9nZXRfZmlyc3RfaWRlbnRpdHkoYXV0aCwgJmNvbW1lbnQsIDEpOwotCSAgICBrZXkgIT0gTlVMTDsKLQkgICAga2V5ID0gc3NoX2dldF9uZXh0X2lkZW50aXR5KGF1dGgsICZjb21tZW50LCAxKSkgewotCi0JCS8qIFRyeSB0aGlzIGlkZW50aXR5LiAqLwotCQlkZWJ1ZygiVHJ5aW5nIFJTQSBhdXRoZW50aWNhdGlvbiB2aWEgYWdlbnQgd2l0aCAnJS4xMDBzJyIsIGNvbW1lbnQpOwotCQl4ZnJlZShjb21tZW50KTsKLQotCQkvKiBUZWxsIHRoZSBzZXJ2ZXIgdGhhdCB3ZSBhcmUgd2lsbGluZyB0byBhdXRoZW50aWNhdGUgdXNpbmcgdGhpcyBrZXkuICovCi0JCXBhY2tldF9zdGFydChTU0hfQ01TR19BVVRIX1JTQSk7Ci0JCXBhY2tldF9wdXRfYmlnbnVtKGtleS0+cnNhLT5uKTsKLQkJcGFja2V0X3NlbmQoKTsKLQkJcGFja2V0X3dyaXRlX3dhaXQoKTsKLQotCQkvKiBXYWl0IGZvciBzZXJ2ZXIncyByZXNwb25zZS4gKi8KLQkJdHlwZSA9IHBhY2tldF9yZWFkKCk7Ci0KLQkJLyogVGhlIHNlcnZlciBzZW5kcyBmYWlsdXJlIGlmIGl0IGRvZXNuJ3QgbGlrZSBvdXIga2V5IG9yCi0JCSAgIGRvZXMgbm90IHN1cHBvcnQgUlNBIGF1dGhlbnRpY2F0aW9uLiAqLwotCQlpZiAodHlwZSA9PSBTU0hfU01TR19GQUlMVVJFKSB7Ci0JCQlkZWJ1ZygiU2VydmVyIHJlZnVzZWQgb3VyIGtleS4iKTsKLQkJCWtleV9mcmVlKGtleSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQkvKiBPdGhlcndpc2UgaXQgc2hvdWxkIGhhdmUgc2VudCBhIGNoYWxsZW5nZS4gKi8KLQkJaWYgKHR5cGUgIT0gU1NIX1NNU0dfQVVUSF9SU0FfQ0hBTExFTkdFKQotCQkJcGFja2V0X2Rpc2Nvbm5lY3QoIlByb3RvY29sIGVycm9yIGR1cmluZyBSU0EgYXV0aGVudGljYXRpb246ICVkIiwKLQkJCQkJICB0eXBlKTsKLQotCQlwYWNrZXRfZ2V0X2JpZ251bShjaGFsbGVuZ2UpOwotCQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQkJZGVidWcoIlJlY2VpdmVkIFJTQSBjaGFsbGVuZ2UgZnJvbSBzZXJ2ZXIuIik7Ci0KLQkJLyogQXNrIHRoZSBhZ2VudCB0byBkZWNyeXB0IHRoZSBjaGFsbGVuZ2UuICovCi0JCWlmICghc3NoX2RlY3J5cHRfY2hhbGxlbmdlKGF1dGgsIGtleSwgY2hhbGxlbmdlLCBzZXNzaW9uX2lkLCAxLCByZXNwb25zZSkpIHsKLQkJCS8qCi0JCQkgKiBUaGUgYWdlbnQgZmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGlkZW50aWZpZXIKLQkJCSAqIGFsdGhvdWdoIGl0IGFkdmVydGlzZWQgaXQgc3VwcG9ydHMgdGhpcy4gIEp1c3QKLQkJCSAqIHJldHVybiBhIHdyb25nIHZhbHVlLgotCQkJICovCi0JCQlsb2dpdCgiQXV0aGVudGljYXRpb24gYWdlbnQgZmFpbGVkIHRvIGRlY3J5cHQgY2hhbGxlbmdlLiIpOwotCQkJbWVtc2V0KHJlc3BvbnNlLCAwLCBzaXplb2YocmVzcG9uc2UpKTsKLQkJfQotCQlrZXlfZnJlZShrZXkpOwotCQlkZWJ1ZygiU2VuZGluZyByZXNwb25zZSB0byBSU0EgY2hhbGxlbmdlLiIpOwotCi0JCS8qIFNlbmQgdGhlIGRlY3J5cHRlZCBjaGFsbGVuZ2UgYmFjayB0byB0aGUgc2VydmVyLiAqLwotCQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfQVVUSF9SU0FfUkVTUE9OU0UpOwotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCXBhY2tldF9wdXRfY2hhcihyZXNwb25zZVtpXSk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JCXBhY2tldF93cml0ZV93YWl0KCk7Ci0KLQkJLyogV2FpdCBmb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiAqLwotCQl0eXBlID0gcGFja2V0X3JlYWQoKTsKLQotCQkvKiBUaGUgc2VydmVyIHJldHVybnMgc3VjY2VzcyBpZiBpdCBhY2NlcHRlZCB0aGUgYXV0aGVudGljYXRpb24uICovCi0JCWlmICh0eXBlID09IFNTSF9TTVNHX1NVQ0NFU1MpIHsKLQkJCXNzaF9jbG9zZV9hdXRoZW50aWNhdGlvbl9jb25uZWN0aW9uKGF1dGgpOwotCQkJQk5fY2xlYXJfZnJlZShjaGFsbGVuZ2UpOwotCQkJZGVidWcoIlJTQSBhdXRoZW50aWNhdGlvbiBhY2NlcHRlZCBieSBzZXJ2ZXIuIik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQkvKiBPdGhlcndpc2UgaXQgc2hvdWxkIHJldHVybiBmYWlsdXJlLiAqLwotCQlpZiAodHlwZSAhPSBTU0hfU01TR19GQUlMVVJFKQotCQkJcGFja2V0X2Rpc2Nvbm5lY3QoIlByb3RvY29sIGVycm9yIHdhaXRpbmcgUlNBIGF1dGggcmVzcG9uc2U6ICVkIiwKLQkJCQkJICB0eXBlKTsKLQl9Ci0Jc3NoX2Nsb3NlX2F1dGhlbnRpY2F0aW9uX2Nvbm5lY3Rpb24oYXV0aCk7Ci0JQk5fY2xlYXJfZnJlZShjaGFsbGVuZ2UpOwotCWRlYnVnKCJSU0EgYXV0aGVudGljYXRpb24gdXNpbmcgYWdlbnQgcmVmdXNlZC4iKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIENvbXB1dGVzIHRoZSBwcm9wZXIgcmVzcG9uc2UgdG8gYSBSU0EgY2hhbGxlbmdlLCBhbmQgc2VuZHMgdGhlIHJlc3BvbnNlIHRvCi0gKiB0aGUgc2VydmVyLgotICovCi1zdGF0aWMgdm9pZAotcmVzcG9uZF90b19yc2FfY2hhbGxlbmdlKEJJR05VTSAqIGNoYWxsZW5nZSwgUlNBICogcHJ2KQotewotCXVfY2hhciBidWZbMzJdLCByZXNwb25zZVsxNl07Ci0JTUQ1X0NUWCBtZDsKLQlpbnQgaSwgbGVuOwotCi0JLyogRGVjcnlwdCB0aGUgY2hhbGxlbmdlIHVzaW5nIHRoZSBwcml2YXRlIGtleS4gKi8KLQkvKiBYWFggdGhpbmsgYWJvdXQgQmxlaWNoZW5iYWNoZXIsIHRvbyAqLwotCWlmIChyc2FfcHJpdmF0ZV9kZWNyeXB0KGNoYWxsZW5nZSwgY2hhbGxlbmdlLCBwcnYpIDw9IDApCi0JCXBhY2tldF9kaXNjb25uZWN0KAotCQkgICAgInJlc3BvbmRfdG9fcnNhX2NoYWxsZW5nZTogcnNhX3ByaXZhdGVfZGVjcnlwdCBmYWlsZWQiKTsKLQotCS8qIENvbXB1dGUgdGhlIHJlc3BvbnNlLiAqLwotCS8qIFRoZSByZXNwb25zZSBpcyBNRDUgb2YgZGVjcnlwdGVkIGNoYWxsZW5nZSBwbHVzIHNlc3Npb24gaWQuICovCi0JbGVuID0gQk5fbnVtX2J5dGVzKGNoYWxsZW5nZSk7Ci0JaWYgKGxlbiA8PSAwIHx8ICh1X2ludClsZW4gPiBzaXplb2YoYnVmKSkKLQkJcGFja2V0X2Rpc2Nvbm5lY3QoCi0JCSAgICAicmVzcG9uZF90b19yc2FfY2hhbGxlbmdlOiBiYWQgY2hhbGxlbmdlIGxlbmd0aCAlZCIsIGxlbik7Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JQk5fYm4yYmluKGNoYWxsZW5nZSwgYnVmICsgc2l6ZW9mKGJ1ZikgLSBsZW4pOwotCU1ENV9Jbml0KCZtZCk7Ci0JTUQ1X1VwZGF0ZSgmbWQsIGJ1ZiwgMzIpOwotCU1ENV9VcGRhdGUoJm1kLCBzZXNzaW9uX2lkLCAxNik7Ci0JTUQ1X0ZpbmFsKHJlc3BvbnNlLCAmbWQpOwotCi0JZGVidWcoIlNlbmRpbmcgcmVzcG9uc2UgdG8gaG9zdCBrZXkgUlNBIGNoYWxsZW5nZS4iKTsKLQotCS8qIFNlbmQgdGhlIHJlc3BvbnNlIGJhY2sgdG8gdGhlIHNlcnZlci4gKi8KLQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfQVVUSF9SU0FfUkVTUE9OU0UpOwotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQlwYWNrZXRfcHV0X2NoYXIocmVzcG9uc2VbaV0pOwotCXBhY2tldF9zZW5kKCk7Ci0JcGFja2V0X3dyaXRlX3dhaXQoKTsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQltZW1zZXQocmVzcG9uc2UsIDAsIHNpemVvZihyZXNwb25zZSkpOwotCW1lbXNldCgmbWQsIDAsIHNpemVvZihtZCkpOwotfQotCi0vKgotICogQ2hlY2tzIGlmIHRoZSB1c2VyIGhhcyBhdXRoZW50aWNhdGlvbiBmaWxlLCBhbmQgaWYgc28sIHRyaWVzIHRvIGF1dGhlbnRpY2F0ZQotICogdGhlIHVzZXIgdXNpbmcgaXQuCi0gKi8KLXN0YXRpYyBpbnQKLXRyeV9yc2FfYXV0aGVudGljYXRpb24oaW50IGlkeCkKLXsKLQlCSUdOVU0gKmNoYWxsZW5nZTsKLQlLZXkgKnB1YmxpYywgKnByaXZhdGU7Ci0JY2hhciBidWZbMzAwXSwgKnBhc3NwaHJhc2UsICpjb21tZW50LCAqYXV0aGZpbGU7Ci0JaW50IGksIHBlcm1fb2sgPSAxLCB0eXBlLCBxdWl0OwotCi0JcHVibGljID0gb3B0aW9ucy5pZGVudGl0eV9rZXlzW2lkeF07Ci0JYXV0aGZpbGUgPSBvcHRpb25zLmlkZW50aXR5X2ZpbGVzW2lkeF07Ci0JY29tbWVudCA9IHhzdHJkdXAoYXV0aGZpbGUpOwotCi0JZGVidWcoIlRyeWluZyBSU0EgYXV0aGVudGljYXRpb24gd2l0aCBrZXkgJyUuMTAwcyciLCBjb21tZW50KTsKLQotCS8qIFRlbGwgdGhlIHNlcnZlciB0aGF0IHdlIGFyZSB3aWxsaW5nIHRvIGF1dGhlbnRpY2F0ZSB1c2luZyB0aGlzIGtleS4gKi8KLQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfQVVUSF9SU0EpOwotCXBhY2tldF9wdXRfYmlnbnVtKHB1YmxpYy0+cnNhLT5uKTsKLQlwYWNrZXRfc2VuZCgpOwotCXBhY2tldF93cml0ZV93YWl0KCk7Ci0KLQkvKiBXYWl0IGZvciBzZXJ2ZXIncyByZXNwb25zZS4gKi8KLQl0eXBlID0gcGFja2V0X3JlYWQoKTsKLQotCS8qCi0JICogVGhlIHNlcnZlciByZXNwb25kcyB3aXRoIGZhaWx1cmUgaWYgaXQgZG9lc24ndCBsaWtlIG91ciBrZXkgb3IKLQkgKiBkb2Vzbid0IHN1cHBvcnQgUlNBIGF1dGhlbnRpY2F0aW9uLgotCSAqLwotCWlmICh0eXBlID09IFNTSF9TTVNHX0ZBSUxVUkUpIHsKLQkJZGVidWcoIlNlcnZlciByZWZ1c2VkIG91ciBrZXkuIik7Ci0JCXhmcmVlKGNvbW1lbnQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogT3RoZXJ3aXNlLCB0aGUgc2VydmVyIHNob3VsZCByZXNwb25kIHdpdGggYSBjaGFsbGVuZ2UuICovCi0JaWYgKHR5cGUgIT0gU1NIX1NNU0dfQVVUSF9SU0FfQ0hBTExFTkdFKQotCQlwYWNrZXRfZGlzY29ubmVjdCgiUHJvdG9jb2wgZXJyb3IgZHVyaW5nIFJTQSBhdXRoZW50aWNhdGlvbjogJWQiLCB0eXBlKTsKLQotCS8qIEdldCB0aGUgY2hhbGxlbmdlIGZyb20gdGhlIHBhY2tldC4gKi8KLQlpZiAoKGNoYWxsZW5nZSA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgidHJ5X3JzYV9hdXRoZW50aWNhdGlvbjogQk5fbmV3IGZhaWxlZCIpOwotCXBhY2tldF9nZXRfYmlnbnVtKGNoYWxsZW5nZSk7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JZGVidWcoIlJlY2VpdmVkIFJTQSBjaGFsbGVuZ2UgZnJvbSBzZXJ2ZXIuIik7Ci0KLQkvKgotCSAqIElmIHRoZSBrZXkgaXMgbm90IHN0b3JlZCBpbiBleHRlcm5hbCBoYXJkd2FyZSwgd2UgaGF2ZSB0bwotCSAqIGxvYWQgdGhlIHByaXZhdGUga2V5LiAgVHJ5IGZpcnN0IHdpdGggZW1wdHkgcGFzc3BocmFzZTsgaWYgaXQKLQkgKiBmYWlscywgYXNrIGZvciBhIHBhc3NwaHJhc2UuCi0JICovCi0JaWYgKHB1YmxpYy0+ZmxhZ3MgJiBLRVlfRkxBR19FWFQpCi0JCXByaXZhdGUgPSBwdWJsaWM7Ci0JZWxzZQotCQlwcml2YXRlID0ga2V5X2xvYWRfcHJpdmF0ZV90eXBlKEtFWV9SU0ExLCBhdXRoZmlsZSwgIiIsIE5VTEwsCi0JCSAgICAmcGVybV9vayk7Ci0JaWYgKHByaXZhdGUgPT0gTlVMTCAmJiAhb3B0aW9ucy5iYXRjaF9tb2RlICYmIHBlcm1fb2spIHsKLQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJICAgICJFbnRlciBwYXNzcGhyYXNlIGZvciBSU0Ega2V5ICclLjEwMHMnOiAiLCBjb21tZW50KTsKLQkJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtYmVyX29mX3Bhc3N3b3JkX3Byb21wdHM7IGkrKykgewotCQkJcGFzc3BocmFzZSA9IHJlYWRfcGFzc3BocmFzZShidWYsIDApOwotCQkJaWYgKHN0cmNtcChwYXNzcGhyYXNlLCAiIikgIT0gMCkgewotCQkJCXByaXZhdGUgPSBrZXlfbG9hZF9wcml2YXRlX3R5cGUoS0VZX1JTQTEsCi0JCQkJICAgIGF1dGhmaWxlLCBwYXNzcGhyYXNlLCBOVUxMLCBOVUxMKTsKLQkJCQlxdWl0ID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVidWcyKCJubyBwYXNzcGhyYXNlIGdpdmVuLCB0cnkgbmV4dCBrZXkiKTsKLQkJCQlxdWl0ID0gMTsKLQkJCX0KLQkJCW1lbXNldChwYXNzcGhyYXNlLCAwLCBzdHJsZW4ocGFzc3BocmFzZSkpOwotCQkJeGZyZWUocGFzc3BocmFzZSk7Ci0JCQlpZiAocHJpdmF0ZSAhPSBOVUxMIHx8IHF1aXQpCi0JCQkJYnJlYWs7Ci0JCQlkZWJ1ZzIoImJhZCBwYXNzcGhyYXNlIGdpdmVuLCB0cnkgYWdhaW4uLi4iKTsKLQkJfQotCX0KLQkvKiBXZSBubyBsb25nZXIgbmVlZCB0aGUgY29tbWVudC4gKi8KLQl4ZnJlZShjb21tZW50KTsKLQotCWlmIChwcml2YXRlID09IE5VTEwpIHsKLQkJaWYgKCFvcHRpb25zLmJhdGNoX21vZGUgJiYgcGVybV9vaykKLQkJCWVycm9yKCJCYWQgcGFzc3BocmFzZS4iKTsKLQotCQkvKiBTZW5kIGEgZHVtbXkgcmVzcG9uc2UgcGFja2V0IHRvIGF2b2lkIHByb3RvY29sIGVycm9yLiAqLwotCQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfQVVUSF9SU0FfUkVTUE9OU0UpOwotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCXBhY2tldF9wdXRfY2hhcigwKTsKLQkJcGFja2V0X3NlbmQoKTsKLQkJcGFja2V0X3dyaXRlX3dhaXQoKTsKLQotCQkvKiBFeHBlY3QgdGhlIHNlcnZlciB0byByZWplY3QgaXQuLi4gKi8KLQkJcGFja2V0X3JlYWRfZXhwZWN0KFNTSF9TTVNHX0ZBSUxVUkUpOwotCQlCTl9jbGVhcl9mcmVlKGNoYWxsZW5nZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIENvbXB1dGUgYW5kIHNlbmQgYSByZXNwb25zZSB0byB0aGUgY2hhbGxlbmdlLiAqLwotCXJlc3BvbmRfdG9fcnNhX2NoYWxsZW5nZShjaGFsbGVuZ2UsIHByaXZhdGUtPnJzYSk7Ci0KLQkvKiBEZXN0cm95IHRoZSBwcml2YXRlIGtleSB1bmxlc3MgaXQgaW4gZXh0ZXJuYWwgaGFyZHdhcmUuICovCi0JaWYgKCEocHJpdmF0ZS0+ZmxhZ3MgJiBLRVlfRkxBR19FWFQpKQotCQlrZXlfZnJlZShwcml2YXRlKTsKLQotCS8qIFdlIG5vIGxvbmdlciBuZWVkIHRoZSBjaGFsbGVuZ2UuICovCi0JQk5fY2xlYXJfZnJlZShjaGFsbGVuZ2UpOwotCi0JLyogV2FpdCBmb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiAqLwotCXR5cGUgPSBwYWNrZXRfcmVhZCgpOwotCWlmICh0eXBlID09IFNTSF9TTVNHX1NVQ0NFU1MpIHsKLQkJZGVidWcoIlJTQSBhdXRoZW50aWNhdGlvbiBhY2NlcHRlZCBieSBzZXJ2ZXIuIik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAodHlwZSAhPSBTU0hfU01TR19GQUlMVVJFKQotCQlwYWNrZXRfZGlzY29ubmVjdCgiUHJvdG9jb2wgZXJyb3Igd2FpdGluZyBSU0EgYXV0aCByZXNwb25zZTogJWQiLCB0eXBlKTsKLQlkZWJ1ZygiUlNBIGF1dGhlbnRpY2F0aW9uIHJlZnVzZWQuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUcmllcyB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIgdXNpbmcgY29tYmluZWQgcmhvc3RzIG9yIC9ldGMvaG9zdHMuZXF1aXYKLSAqIGF1dGhlbnRpY2F0aW9uIGFuZCBSU0EgaG9zdCBhdXRoZW50aWNhdGlvbi4KLSAqLwotc3RhdGljIGludAotdHJ5X3Job3N0c19yc2FfYXV0aGVudGljYXRpb24oY29uc3QgY2hhciAqbG9jYWxfdXNlciwgS2V5ICogaG9zdF9rZXkpCi17Ci0JaW50IHR5cGU7Ci0JQklHTlVNICpjaGFsbGVuZ2U7Ci0KLQlkZWJ1ZygiVHJ5aW5nIHJob3N0cyBvciAvZXRjL2hvc3RzLmVxdWl2IHdpdGggUlNBIGhvc3QgYXV0aGVudGljYXRpb24uIik7Ci0KLQkvKiBUZWxsIHRoZSBzZXJ2ZXIgdGhhdCB3ZSBhcmUgd2lsbGluZyB0byBhdXRoZW50aWNhdGUgdXNpbmcgdGhpcyBrZXkuICovCi0JcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0FVVEhfUkhPU1RTX1JTQSk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKGxvY2FsX3VzZXIpOwotCXBhY2tldF9wdXRfaW50KEJOX251bV9iaXRzKGhvc3Rfa2V5LT5yc2EtPm4pKTsKLQlwYWNrZXRfcHV0X2JpZ251bShob3N0X2tleS0+cnNhLT5lKTsKLQlwYWNrZXRfcHV0X2JpZ251bShob3N0X2tleS0+cnNhLT5uKTsKLQlwYWNrZXRfc2VuZCgpOwotCXBhY2tldF93cml0ZV93YWl0KCk7Ci0KLQkvKiBXYWl0IGZvciBzZXJ2ZXIncyByZXNwb25zZS4gKi8KLQl0eXBlID0gcGFja2V0X3JlYWQoKTsKLQotCS8qIFRoZSBzZXJ2ZXIgcmVzcG9uZHMgd2l0aCBmYWlsdXJlIGlmIGl0IGRvZXNuJ3QgYWRtaXQgb3VyCi0JICAgLnJob3N0cyBhdXRoZW50aWNhdGlvbiBvciBkb2Vzbid0IGtub3cgb3VyIGhvc3Qga2V5LiAqLwotCWlmICh0eXBlID09IFNTSF9TTVNHX0ZBSUxVUkUpIHsKLQkJZGVidWcoIlNlcnZlciByZWZ1c2VkIG91ciByaG9zdHMgYXV0aGVudGljYXRpb24gb3IgaG9zdCBrZXkuIik7Ci0JCXJldHVybiAwOwotCX0KLQkvKiBPdGhlcndpc2UsIHRoZSBzZXJ2ZXIgc2hvdWxkIHJlc3BvbmQgd2l0aCBhIGNoYWxsZW5nZS4gKi8KLQlpZiAodHlwZSAhPSBTU0hfU01TR19BVVRIX1JTQV9DSEFMTEVOR0UpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJQcm90b2NvbCBlcnJvciBkdXJpbmcgUlNBIGF1dGhlbnRpY2F0aW9uOiAlZCIsIHR5cGUpOwotCi0JLyogR2V0IHRoZSBjaGFsbGVuZ2UgZnJvbSB0aGUgcGFja2V0LiAqLwotCWlmICgoY2hhbGxlbmdlID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJ0cnlfcmhvc3RzX3JzYV9hdXRoZW50aWNhdGlvbjogQk5fbmV3IGZhaWxlZCIpOwotCXBhY2tldF9nZXRfYmlnbnVtKGNoYWxsZW5nZSk7Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCi0JZGVidWcoIlJlY2VpdmVkIFJTQSBjaGFsbGVuZ2UgZm9yIGhvc3Qga2V5IGZyb20gc2VydmVyLiIpOwotCi0JLyogQ29tcHV0ZSBhIHJlc3BvbnNlIHRvIHRoZSBjaGFsbGVuZ2UuICovCi0JcmVzcG9uZF90b19yc2FfY2hhbGxlbmdlKGNoYWxsZW5nZSwgaG9zdF9rZXktPnJzYSk7Ci0KLQkvKiBXZSBubyBsb25nZXIgbmVlZCB0aGUgY2hhbGxlbmdlLiAqLwotCUJOX2NsZWFyX2ZyZWUoY2hhbGxlbmdlKTsKLQotCS8qIFdhaXQgZm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4gKi8KLQl0eXBlID0gcGFja2V0X3JlYWQoKTsKLQlpZiAodHlwZSA9PSBTU0hfU01TR19TVUNDRVNTKSB7Ci0JCWRlYnVnKCJSaG9zdHMgb3IgL2V0Yy9ob3N0cy5lcXVpdiB3aXRoIFJTQSBob3N0IGF1dGhlbnRpY2F0aW9uIGFjY2VwdGVkIGJ5IHNlcnZlci4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICh0eXBlICE9IFNTSF9TTVNHX0ZBSUxVUkUpCi0JCXBhY2tldF9kaXNjb25uZWN0KCJQcm90b2NvbCBlcnJvciB3YWl0aW5nIFJTQSBhdXRoIHJlc3BvbnNlOiAlZCIsIHR5cGUpOwotCWRlYnVnKCJSaG9zdHMgb3IgL2V0Yy9ob3N0cy5lcXVpdiB3aXRoIFJTQSBob3N0IGF1dGhlbnRpY2F0aW9uIHJlZnVzZWQuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUcmllcyB0byBhdXRoZW50aWNhdGUgd2l0aCBhbnkgc3RyaW5nLWJhc2VkIGNoYWxsZW5nZS9yZXNwb25zZSBzeXN0ZW0uCi0gKiBOb3RlIHRoYXQgdGhlIGNsaWVudCBjb2RlIGlzIG5vdCB0aWVkIHRvIHMva2V5IG9yIFRJUy4KLSAqLwotc3RhdGljIGludAotdHJ5X2NoYWxsZW5nZV9yZXNwb25zZV9hdXRoZW50aWNhdGlvbih2b2lkKQotewotCWludCB0eXBlLCBpOwotCXVfaW50IGNsZW47Ci0JY2hhciBwcm9tcHRbMTAyNF07Ci0JY2hhciAqY2hhbGxlbmdlLCAqcmVzcG9uc2U7Ci0KLQlkZWJ1ZygiRG9pbmcgY2hhbGxlbmdlIHJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uLiIpOwotCi0JZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtYmVyX29mX3Bhc3N3b3JkX3Byb21wdHM7IGkrKykgewotCQkvKiByZXF1ZXN0IGEgY2hhbGxlbmdlICovCi0JCXBhY2tldF9zdGFydChTU0hfQ01TR19BVVRIX1RJUyk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JCXBhY2tldF93cml0ZV93YWl0KCk7Ci0KLQkJdHlwZSA9IHBhY2tldF9yZWFkKCk7Ci0JCWlmICh0eXBlICE9IFNTSF9TTVNHX0ZBSUxVUkUgJiYKLQkJICAgIHR5cGUgIT0gU1NIX1NNU0dfQVVUSF9USVNfQ0hBTExFTkdFKSB7Ci0JCQlwYWNrZXRfZGlzY29ubmVjdCgiUHJvdG9jb2wgZXJyb3I6IGdvdCAlZCBpbiByZXNwb25zZSAiCi0JCQkgICAgInRvIFNTSF9DTVNHX0FVVEhfVElTIiwgdHlwZSk7Ci0JCX0KLQkJaWYgKHR5cGUgIT0gU1NIX1NNU0dfQVVUSF9USVNfQ0hBTExFTkdFKSB7Ci0JCQlkZWJ1ZygiTm8gY2hhbGxlbmdlLiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2hhbGxlbmdlID0gcGFja2V0X2dldF9zdHJpbmcoJmNsZW4pOwotCQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0JCXNucHJpbnRmKHByb21wdCwgc2l6ZW9mIHByb21wdCwgIiVzJXMiLCBjaGFsbGVuZ2UsCi0JCSAgICBzdHJjaHIoY2hhbGxlbmdlLCAnXG4nKSA/ICIiIDogIlxuUmVzcG9uc2U6ICIpOwotCQl4ZnJlZShjaGFsbGVuZ2UpOwotCQlpZiAoaSAhPSAwKQotCQkJZXJyb3IoIlBlcm1pc3Npb24gZGVuaWVkLCBwbGVhc2UgdHJ5IGFnYWluLiIpOwotCQlpZiAob3B0aW9ucy5jaXBoZXIgPT0gU1NIX0NJUEhFUl9OT05FKQotCQkJbG9naXQoIldBUk5JTkc6IEVuY3J5cHRpb24gaXMgZGlzYWJsZWQhICIKLQkJCSAgICAiUmVzcG9uc2Ugd2lsbCBiZSB0cmFuc21pdHRlZCBpbiBjbGVhciB0ZXh0LiIpOwotCQlyZXNwb25zZSA9IHJlYWRfcGFzc3BocmFzZShwcm9tcHQsIDApOwotCQlpZiAoc3RyY21wKHJlc3BvbnNlLCAiIikgPT0gMCkgewotCQkJeGZyZWUocmVzcG9uc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcGFja2V0X3N0YXJ0KFNTSF9DTVNHX0FVVEhfVElTX1JFU1BPTlNFKTsKLQkJc3NoX3B1dF9wYXNzd29yZChyZXNwb25zZSk7Ci0JCW1lbXNldChyZXNwb25zZSwgMCwgc3RybGVuKHJlc3BvbnNlKSk7Ci0JCXhmcmVlKHJlc3BvbnNlKTsKLQkJcGFja2V0X3NlbmQoKTsKLQkJcGFja2V0X3dyaXRlX3dhaXQoKTsKLQkJdHlwZSA9IHBhY2tldF9yZWFkKCk7Ci0JCWlmICh0eXBlID09IFNTSF9TTVNHX1NVQ0NFU1MpCi0JCQlyZXR1cm4gMTsKLQkJaWYgKHR5cGUgIT0gU1NIX1NNU0dfRkFJTFVSRSkKLQkJCXBhY2tldF9kaXNjb25uZWN0KCJQcm90b2NvbCBlcnJvcjogZ290ICVkIGluIHJlc3BvbnNlICIKLQkJCSAgICAidG8gU1NIX0NNU0dfQVVUSF9USVNfUkVTUE9OU0UiLCB0eXBlKTsKLQl9Ci0JLyogZmFpbHVyZSAqLwotCXJldHVybiAwOwotfQotCi0vKgotICogVHJpZXMgdG8gYXV0aGVudGljYXRlIHdpdGggcGxhaW4gcGFzc3dkIGF1dGhlbnRpY2F0aW9uLgotICovCi1zdGF0aWMgaW50Ci10cnlfcGFzc3dvcmRfYXV0aGVudGljYXRpb24oY2hhciAqcHJvbXB0KQotewotCWludCB0eXBlLCBpOwotCWNoYXIgKnBhc3N3b3JkOwotCi0JZGVidWcoIkRvaW5nIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLiIpOwotCWlmIChvcHRpb25zLmNpcGhlciA9PSBTU0hfQ0lQSEVSX05PTkUpCi0JCWxvZ2l0KCJXQVJOSU5HOiBFbmNyeXB0aW9uIGlzIGRpc2FibGVkISBQYXNzd29yZCB3aWxsIGJlIHRyYW5zbWl0dGVkIGluIGNsZWFyIHRleHQuIik7Ci0JZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtYmVyX29mX3Bhc3N3b3JkX3Byb21wdHM7IGkrKykgewotCQlpZiAoaSAhPSAwKQotCQkJZXJyb3IoIlBlcm1pc3Npb24gZGVuaWVkLCBwbGVhc2UgdHJ5IGFnYWluLiIpOwotCQlwYXNzd29yZCA9IHJlYWRfcGFzc3BocmFzZShwcm9tcHQsIDApOwotCQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfQVVUSF9QQVNTV09SRCk7Ci0JCXNzaF9wdXRfcGFzc3dvcmQocGFzc3dvcmQpOwotCQltZW1zZXQocGFzc3dvcmQsIDAsIHN0cmxlbihwYXNzd29yZCkpOwotCQl4ZnJlZShwYXNzd29yZCk7Ci0JCXBhY2tldF9zZW5kKCk7Ci0JCXBhY2tldF93cml0ZV93YWl0KCk7Ci0KLQkJdHlwZSA9IHBhY2tldF9yZWFkKCk7Ci0JCWlmICh0eXBlID09IFNTSF9TTVNHX1NVQ0NFU1MpCi0JCQlyZXR1cm4gMTsKLQkJaWYgKHR5cGUgIT0gU1NIX1NNU0dfRkFJTFVSRSkKLQkJCXBhY2tldF9kaXNjb25uZWN0KCJQcm90b2NvbCBlcnJvcjogZ290ICVkIGluIHJlc3BvbnNlIHRvIHBhc3N3ZCBhdXRoIiwgdHlwZSk7Ci0JfQotCS8qIGZhaWx1cmUgKi8KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFNTSDEga2V5IGV4Y2hhbmdlCi0gKi8KLXZvaWQKLXNzaF9rZXgoY2hhciAqaG9zdCwgc3RydWN0IHNvY2thZGRyICpob3N0YWRkcikKLXsKLQlpbnQgaTsKLQlCSUdOVU0gKmtleTsKLQlLZXkgKmhvc3Rfa2V5LCAqc2VydmVyX2tleTsKLQlpbnQgYml0cywgcmJpdHM7Ci0JaW50IHNzaF9jaXBoZXJfZGVmYXVsdCA9IFNTSF9DSVBIRVJfM0RFUzsKLQl1X2NoYXIgc2Vzc2lvbl9rZXlbU1NIX1NFU1NJT05fS0VZX0xFTkdUSF07Ci0JdV9jaGFyIGNvb2tpZVs4XTsKLQl1X2ludCBzdXBwb3J0ZWRfY2lwaGVyczsKLQl1X2ludCBzZXJ2ZXJfZmxhZ3MsIGNsaWVudF9mbGFnczsKLQl1X2ludDMyX3Qgcm5kID0gMDsKLQotCWRlYnVnKCJXYWl0aW5nIGZvciBzZXJ2ZXIgcHVibGljIGtleS4iKTsKLQotCS8qIFdhaXQgZm9yIGEgcHVibGljIGtleSBwYWNrZXQgZnJvbSB0aGUgc2VydmVyLiAqLwotCXBhY2tldF9yZWFkX2V4cGVjdChTU0hfU01TR19QVUJMSUNfS0VZKTsKLQotCS8qIEdldCBjb29raWUgZnJvbSB0aGUgcGFja2V0LiAqLwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCWNvb2tpZVtpXSA9IHBhY2tldF9nZXRfY2hhcigpOwotCi0JLyogR2V0IHRoZSBwdWJsaWMga2V5LiAqLwotCXNlcnZlcl9rZXkgPSBrZXlfbmV3KEtFWV9SU0ExKTsKLQliaXRzID0gcGFja2V0X2dldF9pbnQoKTsKLQlwYWNrZXRfZ2V0X2JpZ251bShzZXJ2ZXJfa2V5LT5yc2EtPmUpOwotCXBhY2tldF9nZXRfYmlnbnVtKHNlcnZlcl9rZXktPnJzYS0+bik7Ci0KLQlyYml0cyA9IEJOX251bV9iaXRzKHNlcnZlcl9rZXktPnJzYS0+bik7Ci0JaWYgKGJpdHMgIT0gcmJpdHMpIHsKLQkJbG9naXQoIldhcm5pbmc6IFNlcnZlciBsaWVzIGFib3V0IHNpemUgb2Ygc2VydmVyIHB1YmxpYyBrZXk6ICIKLQkJICAgICJhY3R1YWwgc2l6ZSBpcyAlZCBiaXRzIHZzLiBhbm5vdW5jZWQgJWQuIiwgcmJpdHMsIGJpdHMpOwotCQlsb2dpdCgiV2FybmluZzogVGhpcyBtYXkgYmUgZHVlIHRvIGFuIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBzc2guIik7Ci0JfQotCS8qIEdldCB0aGUgaG9zdCBrZXkuICovCi0JaG9zdF9rZXkgPSBrZXlfbmV3KEtFWV9SU0ExKTsKLQliaXRzID0gcGFja2V0X2dldF9pbnQoKTsKLQlwYWNrZXRfZ2V0X2JpZ251bShob3N0X2tleS0+cnNhLT5lKTsKLQlwYWNrZXRfZ2V0X2JpZ251bShob3N0X2tleS0+cnNhLT5uKTsKLQotCXJiaXRzID0gQk5fbnVtX2JpdHMoaG9zdF9rZXktPnJzYS0+bik7Ci0JaWYgKGJpdHMgIT0gcmJpdHMpIHsKLQkJbG9naXQoIldhcm5pbmc6IFNlcnZlciBsaWVzIGFib3V0IHNpemUgb2Ygc2VydmVyIGhvc3Qga2V5OiAiCi0JCSAgICAiYWN0dWFsIHNpemUgaXMgJWQgYml0cyB2cy4gYW5ub3VuY2VkICVkLiIsIHJiaXRzLCBiaXRzKTsKLQkJbG9naXQoIldhcm5pbmc6IFRoaXMgbWF5IGJlIGR1ZSB0byBhbiBvbGQgaW1wbGVtZW50YXRpb24gb2Ygc3NoLiIpOwotCX0KLQotCS8qIEdldCBwcm90b2NvbCBmbGFncy4gKi8KLQlzZXJ2ZXJfZmxhZ3MgPSBwYWNrZXRfZ2V0X2ludCgpOwotCXBhY2tldF9zZXRfcHJvdG9jb2xfZmxhZ3Moc2VydmVyX2ZsYWdzKTsKLQotCXN1cHBvcnRlZF9jaXBoZXJzID0gcGFja2V0X2dldF9pbnQoKTsKLQlzdXBwb3J0ZWRfYXV0aGVudGljYXRpb25zID0gcGFja2V0X2dldF9pbnQoKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlkZWJ1ZygiUmVjZWl2ZWQgc2VydmVyIHB1YmxpYyBrZXkgKCVkIGJpdHMpIGFuZCBob3N0IGtleSAoJWQgYml0cykuIiwKLQkgICAgQk5fbnVtX2JpdHMoc2VydmVyX2tleS0+cnNhLT5uKSwgQk5fbnVtX2JpdHMoaG9zdF9rZXktPnJzYS0+bikpOwotCi0JaWYgKHZlcmlmeV9ob3N0X2tleShob3N0LCBob3N0YWRkciwgaG9zdF9rZXkpID09IC0xKQotCQlmYXRhbCgiSG9zdCBrZXkgdmVyaWZpY2F0aW9uIGZhaWxlZC4iKTsKLQotCWNsaWVudF9mbGFncyA9IFNTSF9QUk9UT0ZMQUdfU0NSRUVOX05VTUJFUiB8IFNTSF9QUk9UT0ZMQUdfSE9TVF9JTl9GV0RfT1BFTjsKLQotCWRlcml2ZV9zc2gxX3Nlc3Npb25faWQoaG9zdF9rZXktPnJzYS0+biwgc2VydmVyX2tleS0+cnNhLT5uLCBjb29raWUsIHNlc3Npb25faWQpOwotCi0JLyogR2VuZXJhdGUgYSBzZXNzaW9uIGtleS4gKi8KLQlhcmM0cmFuZG9tX3N0aXIoKTsKLQotCS8qCi0JICogR2VuZXJhdGUgYW4gZW5jcnlwdGlvbiBrZXkgZm9yIHRoZSBzZXNzaW9uLiAgIFRoZSBrZXkgaXMgYSAyNTYgYml0Ci0JICogcmFuZG9tIG51bWJlciwgaW50ZXJwcmV0ZWQgYXMgYSAzMi1ieXRlIGtleSwgd2l0aCB0aGUgbGVhc3QKLQkgKiBzaWduaWZpY2FudCA4IGJpdHMgYmVpbmcgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGtleS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQlpZiAoaSAlIDQgPT0gMCkKLQkJCXJuZCA9IGFyYzRyYW5kb20oKTsKLQkJc2Vzc2lvbl9rZXlbaV0gPSBybmQgJiAweGZmOwotCQlybmQgPj49IDg7Ci0JfQotCi0JLyoKLQkgKiBBY2NvcmRpbmcgdG8gdGhlIHByb3RvY29sIHNwZWMsIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzZXNzaW9uIGtleQotCSAqIGlzIHRoZSBoaWdoZXN0IGJ5dGUgb2YgdGhlIGludGVnZXIuICBUaGUgc2Vzc2lvbiBrZXkgaXMgeG9yZWQgd2l0aAotCSAqIHRoZSBmaXJzdCAxNiBieXRlcyBvZiB0aGUgc2Vzc2lvbiBpZC4KLQkgKi8KLQlpZiAoKGtleSA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgic3NoX2tleDogQk5fbmV3IGZhaWxlZCIpOwotCWlmIChCTl9zZXRfd29yZChrZXksIDApID09IDApCi0JCWZhdGFsKCJzc2hfa2V4OiBCTl9zZXRfd29yZCBmYWlsZWQiKTsKLQlmb3IgKGkgPSAwOyBpIDwgU1NIX1NFU1NJT05fS0VZX0xFTkdUSDsgaSsrKSB7Ci0JCWlmIChCTl9sc2hpZnQoa2V5LCBrZXksIDgpID09IDApCi0JCQlmYXRhbCgic3NoX2tleDogQk5fbHNoaWZ0IGZhaWxlZCIpOwotCQlpZiAoaSA8IDE2KSB7Ci0JCQlpZiAoQk5fYWRkX3dvcmQoa2V5LCBzZXNzaW9uX2tleVtpXSBeIHNlc3Npb25faWRbaV0pCi0JCQkgICAgPT0gMCkKLQkJCQlmYXRhbCgic3NoX2tleDogQk5fYWRkX3dvcmQgZmFpbGVkIik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoQk5fYWRkX3dvcmQoa2V5LCBzZXNzaW9uX2tleVtpXSkgPT0gMCkKLQkJCQlmYXRhbCgic3NoX2tleDogQk5fYWRkX3dvcmQgZmFpbGVkIik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEVuY3J5cHQgdGhlIGludGVnZXIgdXNpbmcgdGhlIHB1YmxpYyBrZXkgYW5kIGhvc3Qga2V5IG9mIHRoZQotCSAqIHNlcnZlciAoa2V5IHdpdGggc21hbGxlciBtb2R1bHVzIGZpcnN0KS4KLQkgKi8KLQlpZiAoQk5fY21wKHNlcnZlcl9rZXktPnJzYS0+biwgaG9zdF9rZXktPnJzYS0+bikgPCAwKSB7Ci0JCS8qIFB1YmxpYyBrZXkgaGFzIHNtYWxsZXIgbW9kdWx1cy4gKi8KLQkJaWYgKEJOX251bV9iaXRzKGhvc3Rfa2V5LT5yc2EtPm4pIDwKLQkJICAgIEJOX251bV9iaXRzKHNlcnZlcl9rZXktPnJzYS0+bikgKyBTU0hfS0VZX0JJVFNfUkVTRVJWRUQpIHsKLQkJCWZhdGFsKCJyZXNwb25kX3RvX3JzYV9jaGFsbGVuZ2U6IGhvc3Rfa2V5ICVkIDwgc2VydmVyX2tleSAlZCArICIKLQkJCSAgICAiU1NIX0tFWV9CSVRTX1JFU0VSVkVEICVkIiwKLQkJCSAgICBCTl9udW1fYml0cyhob3N0X2tleS0+cnNhLT5uKSwKLQkJCSAgICBCTl9udW1fYml0cyhzZXJ2ZXJfa2V5LT5yc2EtPm4pLAotCQkJICAgIFNTSF9LRVlfQklUU19SRVNFUlZFRCk7Ci0JCX0KLQkJcnNhX3B1YmxpY19lbmNyeXB0KGtleSwga2V5LCBzZXJ2ZXJfa2V5LT5yc2EpOwotCQlyc2FfcHVibGljX2VuY3J5cHQoa2V5LCBrZXksIGhvc3Rfa2V5LT5yc2EpOwotCX0gZWxzZSB7Ci0JCS8qIEhvc3Qga2V5IGhhcyBzbWFsbGVyIG1vZHVsdXMgKG9yIHRoZXkgYXJlIGVxdWFsKS4gKi8KLQkJaWYgKEJOX251bV9iaXRzKHNlcnZlcl9rZXktPnJzYS0+bikgPAotCQkgICAgQk5fbnVtX2JpdHMoaG9zdF9rZXktPnJzYS0+bikgKyBTU0hfS0VZX0JJVFNfUkVTRVJWRUQpIHsKLQkJCWZhdGFsKCJyZXNwb25kX3RvX3JzYV9jaGFsbGVuZ2U6IHNlcnZlcl9rZXkgJWQgPCBob3N0X2tleSAlZCArICIKLQkJCSAgICAiU1NIX0tFWV9CSVRTX1JFU0VSVkVEICVkIiwKLQkJCSAgICBCTl9udW1fYml0cyhzZXJ2ZXJfa2V5LT5yc2EtPm4pLAotCQkJICAgIEJOX251bV9iaXRzKGhvc3Rfa2V5LT5yc2EtPm4pLAotCQkJICAgIFNTSF9LRVlfQklUU19SRVNFUlZFRCk7Ci0JCX0KLQkJcnNhX3B1YmxpY19lbmNyeXB0KGtleSwga2V5LCBob3N0X2tleS0+cnNhKTsKLQkJcnNhX3B1YmxpY19lbmNyeXB0KGtleSwga2V5LCBzZXJ2ZXJfa2V5LT5yc2EpOwotCX0KLQotCS8qIERlc3Ryb3kgdGhlIHB1YmxpYyBrZXlzIHNpbmNlIHdlIG5vIGxvbmdlciBuZWVkIHRoZW0uICovCi0Ja2V5X2ZyZWUoc2VydmVyX2tleSk7Ci0Ja2V5X2ZyZWUoaG9zdF9rZXkpOwotCi0JaWYgKG9wdGlvbnMuY2lwaGVyID09IFNTSF9DSVBIRVJfTk9UX1NFVCkgewotCQlpZiAoY2lwaGVyX21hc2tfc3NoMSgxKSAmIHN1cHBvcnRlZF9jaXBoZXJzICYgKDEgPDwgc3NoX2NpcGhlcl9kZWZhdWx0KSkKLQkJCW9wdGlvbnMuY2lwaGVyID0gc3NoX2NpcGhlcl9kZWZhdWx0OwotCX0gZWxzZSBpZiAob3B0aW9ucy5jaXBoZXIgPT0gU1NIX0NJUEhFUl9JTlZBTElEIHx8Ci0JICAgICEoY2lwaGVyX21hc2tfc3NoMSgxKSAmICgxIDw8IG9wdGlvbnMuY2lwaGVyKSkpIHsKLQkJbG9naXQoIk5vIHZhbGlkIFNTSDEgY2lwaGVyLCB1c2luZyAlLjEwMHMgaW5zdGVhZC4iLAotCQkgICAgY2lwaGVyX25hbWUoc3NoX2NpcGhlcl9kZWZhdWx0KSk7Ci0JCW9wdGlvbnMuY2lwaGVyID0gc3NoX2NpcGhlcl9kZWZhdWx0OwotCX0KLQkvKiBDaGVjayB0aGF0IHRoZSBzZWxlY3RlZCBjaXBoZXIgaXMgc3VwcG9ydGVkLiAqLwotCWlmICghKHN1cHBvcnRlZF9jaXBoZXJzICYgKDEgPDwgb3B0aW9ucy5jaXBoZXIpKSkKLQkJZmF0YWwoIlNlbGVjdGVkIGNpcGhlciB0eXBlICUuMTAwcyBub3Qgc3VwcG9ydGVkIGJ5IHNlcnZlci4iLAotCQkgICAgY2lwaGVyX25hbWUob3B0aW9ucy5jaXBoZXIpKTsKLQotCWRlYnVnKCJFbmNyeXB0aW9uIHR5cGU6ICUuMTAwcyIsIGNpcGhlcl9uYW1lKG9wdGlvbnMuY2lwaGVyKSk7Ci0KLQkvKiBTZW5kIHRoZSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXkgdG8gdGhlIHNlcnZlci4gKi8KLQlwYWNrZXRfc3RhcnQoU1NIX0NNU0dfU0VTU0lPTl9LRVkpOwotCXBhY2tldF9wdXRfY2hhcihvcHRpb25zLmNpcGhlcik7Ci0KLQkvKiBTZW5kIHRoZSBjb29raWUgYmFjayB0byB0aGUgc2VydmVyLiAqLwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXBhY2tldF9wdXRfY2hhcihjb29raWVbaV0pOwotCi0JLyogU2VuZCBhbmQgZGVzdHJveSB0aGUgZW5jcnlwdGVkIGVuY3J5cHRpb24ga2V5IGludGVnZXIuICovCi0JcGFja2V0X3B1dF9iaWdudW0oa2V5KTsKLQlCTl9jbGVhcl9mcmVlKGtleSk7Ci0KLQkvKiBTZW5kIHByb3RvY29sIGZsYWdzLiAqLwotCXBhY2tldF9wdXRfaW50KGNsaWVudF9mbGFncyk7Ci0KLQkvKiBTZW5kIHRoZSBwYWNrZXQgbm93LiAqLwotCXBhY2tldF9zZW5kKCk7Ci0JcGFja2V0X3dyaXRlX3dhaXQoKTsKLQotCWRlYnVnKCJTZW50IGVuY3J5cHRlZCBzZXNzaW9uIGtleS4iKTsKLQotCS8qIFNldCB0aGUgZW5jcnlwdGlvbiBrZXkuICovCi0JcGFja2V0X3NldF9lbmNyeXB0aW9uX2tleShzZXNzaW9uX2tleSwgU1NIX1NFU1NJT05fS0VZX0xFTkdUSCwgb3B0aW9ucy5jaXBoZXIpOwotCi0JLyogV2Ugd2lsbCBubyBsb25nZXIgbmVlZCB0aGUgc2Vzc2lvbiBrZXkgaGVyZS4gIERlc3Ryb3kgYW55IGV4dHJhIGNvcGllcy4gKi8KLQltZW1zZXQoc2Vzc2lvbl9rZXksIDAsIHNpemVvZihzZXNzaW9uX2tleSkpOwotCi0JLyoKLQkgKiBFeHBlY3QgYSBzdWNjZXNzIG1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyLiAgTm90ZSB0aGF0IHRoaXMgbWVzc2FnZQotCSAqIHdpbGwgYmUgcmVjZWl2ZWQgaW4gZW5jcnlwdGVkIGZvcm0uCi0JICovCi0JcGFja2V0X3JlYWRfZXhwZWN0KFNTSF9TTVNHX1NVQ0NFU1MpOwotCi0JZGVidWcoIlJlY2VpdmVkIGVuY3J5cHRlZCBjb25maXJtYXRpb24uIik7Ci19Ci0KLS8qCi0gKiBBdXRoZW50aWNhdGUgdXNlcgotICovCi12b2lkCi1zc2hfdXNlcmF1dGgxKGNvbnN0IGNoYXIgKmxvY2FsX3VzZXIsIGNvbnN0IGNoYXIgKnNlcnZlcl91c2VyLCBjaGFyICpob3N0LAotICAgIFNlbnNpdGl2ZSAqc2Vuc2l0aXZlKQotewotCWludCBpLCB0eXBlOwotCi0JaWYgKHN1cHBvcnRlZF9hdXRoZW50aWNhdGlvbnMgPT0gMCkKLQkJZmF0YWwoInNzaF91c2VyYXV0aDE6IHNlcnZlciBzdXBwb3J0cyBubyBhdXRoIG1ldGhvZHMiKTsKLQotCS8qIFNlbmQgdGhlIG5hbWUgb2YgdGhlIHVzZXIgdG8gbG9nIGluIGFzIG9uIHRoZSBzZXJ2ZXIuICovCi0JcGFja2V0X3N0YXJ0KFNTSF9DTVNHX1VTRVIpOwotCXBhY2tldF9wdXRfY3N0cmluZyhzZXJ2ZXJfdXNlcik7Ci0JcGFja2V0X3NlbmQoKTsKLQlwYWNrZXRfd3JpdGVfd2FpdCgpOwotCi0JLyoKLQkgKiBUaGUgc2VydmVyIHNob3VsZCByZXNwb25kIHdpdGggc3VjY2VzcyBpZiBubyBhdXRoZW50aWNhdGlvbiBpcwotCSAqIG5lZWRlZCAodGhlIHVzZXIgaGFzIG5vIHBhc3N3b3JkKS4gIE90aGVyd2lzZSB0aGUgc2VydmVyIHJlc3BvbmRzCi0JICogd2l0aCBmYWlsdXJlLgotCSAqLwotCXR5cGUgPSBwYWNrZXRfcmVhZCgpOwotCi0JLyogY2hlY2sgd2hldGhlciB0aGUgY29ubmVjdGlvbiB3YXMgYWNjZXB0ZWQgd2l0aG91dCBhdXRoZW50aWNhdGlvbi4gKi8KLQlpZiAodHlwZSA9PSBTU0hfU01TR19TVUNDRVNTKQotCQlnb3RvIHN1Y2Nlc3M7Ci0JaWYgKHR5cGUgIT0gU1NIX1NNU0dfRkFJTFVSRSkKLQkJcGFja2V0X2Rpc2Nvbm5lY3QoIlByb3RvY29sIGVycm9yOiBnb3QgJWQgaW4gcmVzcG9uc2UgdG8gU1NIX0NNU0dfVVNFUiIsIHR5cGUpOwotCi0JLyoKLQkgKiBUcnkgLnJob3N0cyBvciAvZXRjL2hvc3RzLmVxdWl2IGF1dGhlbnRpY2F0aW9uIHdpdGggUlNBIGhvc3QKLQkgKiBhdXRoZW50aWNhdGlvbi4KLQkgKi8KLQlpZiAoKHN1cHBvcnRlZF9hdXRoZW50aWNhdGlvbnMgJiAoMSA8PCBTU0hfQVVUSF9SSE9TVFNfUlNBKSkgJiYKLQkgICAgb3B0aW9ucy5yaG9zdHNfcnNhX2F1dGhlbnRpY2F0aW9uKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBzZW5zaXRpdmUtPm5rZXlzOyBpKyspIHsKLQkJCWlmIChzZW5zaXRpdmUtPmtleXNbaV0gIT0gTlVMTCAmJgotCQkJICAgIHNlbnNpdGl2ZS0+a2V5c1tpXS0+dHlwZSA9PSBLRVlfUlNBMSAmJgotCQkJICAgIHRyeV9yaG9zdHNfcnNhX2F1dGhlbnRpY2F0aW9uKGxvY2FsX3VzZXIsCi0JCQkgICAgc2Vuc2l0aXZlLT5rZXlzW2ldKSkKLQkJCQlnb3RvIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0JLyogVHJ5IFJTQSBhdXRoZW50aWNhdGlvbiBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIGl0LiAqLwotCWlmICgoc3VwcG9ydGVkX2F1dGhlbnRpY2F0aW9ucyAmICgxIDw8IFNTSF9BVVRIX1JTQSkpICYmCi0JICAgIG9wdGlvbnMucnNhX2F1dGhlbnRpY2F0aW9uKSB7Ci0JCS8qCi0JCSAqIFRyeSBSU0EgYXV0aGVudGljYXRpb24gdXNpbmcgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50LiBUaGUKLQkJICogYWdlbnQgaXMgdHJpZWQgZmlyc3QgYmVjYXVzZSBubyBwYXNzcGhyYXNlIGlzIG5lZWRlZCBmb3IKLQkJICogaXQsIHdoZXJlYXMgaWRlbnRpdHkgZmlsZXMgbWF5IHJlcXVpcmUgcGFzc3BocmFzZXMuCi0JCSAqLwotCQlpZiAodHJ5X2FnZW50X2F1dGhlbnRpY2F0aW9uKCkpCi0JCQlnb3RvIHN1Y2Nlc3M7Ci0KLQkJLyogVHJ5IFJTQSBhdXRoZW50aWNhdGlvbiBmb3IgZWFjaCBpZGVudGl0eS4gKi8KLQkJZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2lkZW50aXR5X2ZpbGVzOyBpKyspCi0JCQlpZiAob3B0aW9ucy5pZGVudGl0eV9rZXlzW2ldICE9IE5VTEwgJiYKLQkJCSAgICBvcHRpb25zLmlkZW50aXR5X2tleXNbaV0tPnR5cGUgPT0gS0VZX1JTQTEgJiYKLQkJCSAgICB0cnlfcnNhX2F1dGhlbnRpY2F0aW9uKGkpKQotCQkJCWdvdG8gc3VjY2VzczsKLQl9Ci0JLyogVHJ5IGNoYWxsZW5nZSByZXNwb25zZSBhdXRoZW50aWNhdGlvbiBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIGl0LiAqLwotCWlmICgoc3VwcG9ydGVkX2F1dGhlbnRpY2F0aW9ucyAmICgxIDw8IFNTSF9BVVRIX1RJUykpICYmCi0JICAgIG9wdGlvbnMuY2hhbGxlbmdlX3Jlc3BvbnNlX2F1dGhlbnRpY2F0aW9uICYmICFvcHRpb25zLmJhdGNoX21vZGUpIHsKLQkJaWYgKHRyeV9jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24oKSkKLQkJCWdvdG8gc3VjY2VzczsKLQl9Ci0JLyogVHJ5IHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgaXQuICovCi0JaWYgKChzdXBwb3J0ZWRfYXV0aGVudGljYXRpb25zICYgKDEgPDwgU1NIX0FVVEhfUEFTU1dPUkQpKSAmJgotCSAgICBvcHRpb25zLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uICYmICFvcHRpb25zLmJhdGNoX21vZGUpIHsKLQkJY2hhciBwcm9tcHRbODBdOwotCi0JCXNucHJpbnRmKHByb21wdCwgc2l6ZW9mKHByb21wdCksICIlLjMwc0AlLjEyOHMncyBwYXNzd29yZDogIiwKLQkJICAgIHNlcnZlcl91c2VyLCBob3N0KTsKLQkJaWYgKHRyeV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbihwcm9tcHQpKQotCQkJZ290byBzdWNjZXNzOwotCX0KLQkvKiBBbGwgYXV0aGVudGljYXRpb24gbWV0aG9kcyBoYXZlIGZhaWxlZC4gIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlLiAqLwotCWZhdGFsKCJQZXJtaXNzaW9uIGRlbmllZC4iKTsKLQkvKiBOT1RSRUFDSEVEICovCi0KLSBzdWNjZXNzOgotCXJldHVybjsJLyogbmVlZCBzdGF0ZW1lbnQgYWZ0ZXIgbGFiZWwgKi8KLX0KZGlmZiAtLWdpdCBhL3NzaGNvbm5lY3QyLmMgYi9zc2hjb25uZWN0Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjRiMjAyLi4wMDAwMDAwCi0tLSBhL3NzaGNvbm5lY3QyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIwICswLDAgQEAKLS8qICRPcGVuQlNEOiBzc2hjb25uZWN0Mi5jLHYgMS4xODggMjAxMS8wNS8yNCAwNzoxNTo0NyBkam0gRXhwICQgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggRGFtaWVuIE1pbGxlci4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaWYgZGVmaW5lZChIQVZFX1NUUk5WSVMpICYmIGRlZmluZWQoSEFWRV9WSVNfSCkKLSNpbmNsdWRlIDx2aXMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgiCi0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAic3NoLmgiCi0jaW5jbHVkZSAic3NoMi5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgInBhY2tldC5oIgotI2luY2x1ZGUgImNvbXBhdC5oIgotI2luY2x1ZGUgImNpcGhlci5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImtleC5oIgotI2luY2x1ZGUgIm15cHJvcG9zYWwuaCIKLSNpbmNsdWRlICJzc2hjb25uZWN0LmgiCi0jaW5jbHVkZSAiYXV0aGZpbGUuaCIKLSNpbmNsdWRlICJkaC5oIgotI2luY2x1ZGUgImF1dGhmZC5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgInJlYWRjb25mLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgIm1hdGNoLmgiCi0jaW5jbHVkZSAiZGlzcGF0Y2guaCIKLSNpbmNsdWRlICJjYW5vaG9zdC5oIgotI2luY2x1ZGUgIm1zZy5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotI2luY2x1ZGUgInVpZHN3YXAuaCIKLSNpbmNsdWRlICJob3N0ZmlsZS5oIgotI2luY2x1ZGUgInNjaG5vcnIuaCIKLSNpbmNsdWRlICJqcGFrZS5oIgotCi0jaWZkZWYgR1NTQVBJCi0jaW5jbHVkZSAic3NoLWdzcy5oIgotI2VuZGlmCi0KLS8qIGltcG9ydCAqLwotZXh0ZXJuIGNoYXIgKmNsaWVudF92ZXJzaW9uX3N0cmluZzsKLWV4dGVybiBjaGFyICpzZXJ2ZXJfdmVyc2lvbl9zdHJpbmc7Ci1leHRlcm4gT3B0aW9ucyBvcHRpb25zOwotCi0vKgotICogU1NIMiBrZXkgZXhjaGFuZ2UKLSAqLwotCi11X2NoYXIgKnNlc3Npb25faWQyID0gTlVMTDsKLXVfaW50IHNlc3Npb25faWQyX2xlbiA9IDA7Ci0KLWNoYXIgKnh4eF9ob3N0Owotc3RydWN0IHNvY2thZGRyICp4eHhfaG9zdGFkZHI7Ci0KLUtleCAqeHh4X2tleCA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQKLXZlcmlmeV9ob3N0X2tleV9jYWxsYmFjayhLZXkgKmhvc3RrZXkpCi17Ci0JaWYgKHZlcmlmeV9ob3N0X2tleSh4eHhfaG9zdCwgeHh4X2hvc3RhZGRyLCBob3N0a2V5KSA9PSAtMSkKLQkJZmF0YWwoIkhvc3Qga2V5IHZlcmlmaWNhdGlvbiBmYWlsZWQuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLW9yZGVyX2hvc3RrZXlhbGdzKGNoYXIgKmhvc3QsIHN0cnVjdCBzb2NrYWRkciAqaG9zdGFkZHIsIHVfc2hvcnQgcG9ydCkKLXsKLQljaGFyICpvYXZhaWwsICphdmFpbCwgKmZpcnN0LCAqbGFzdCwgKmFsZywgKmhvc3RuYW1lLCAqcmV0OwotCXNpemVfdCBtYXhsZW47Ci0Jc3RydWN0IGhvc3RrZXlzICpob3N0a2V5czsKLQlpbnQga3R5cGU7Ci0JdV9pbnQgaTsKLQotCS8qIEZpbmQgYWxsIGhvc3RrZXlzIGZvciB0aGlzIGhvc3RuYW1lICovCi0JZ2V0X2hvc3RmaWxlX2hvc3RuYW1lX2lwYWRkcihob3N0LCBob3N0YWRkciwgcG9ydCwgJmhvc3RuYW1lLCBOVUxMKTsKLQlob3N0a2V5cyA9IGluaXRfaG9zdGtleXMoKTsKLQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1fdXNlcl9ob3N0ZmlsZXM7IGkrKykKLQkJbG9hZF9ob3N0a2V5cyhob3N0a2V5cywgaG9zdG5hbWUsIG9wdGlvbnMudXNlcl9ob3N0ZmlsZXNbaV0pOwotCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9zeXN0ZW1faG9zdGZpbGVzOyBpKyspCi0JCWxvYWRfaG9zdGtleXMoaG9zdGtleXMsIGhvc3RuYW1lLCBvcHRpb25zLnN5c3RlbV9ob3N0ZmlsZXNbaV0pOwotCi0Jb2F2YWlsID0gYXZhaWwgPSB4c3RyZHVwKEtFWF9ERUZBVUxUX1BLX0FMRyk7Ci0JbWF4bGVuID0gc3RybGVuKGF2YWlsKSArIDE7Ci0JZmlyc3QgPSB4bWFsbG9jKG1heGxlbik7Ci0JbGFzdCA9IHhtYWxsb2MobWF4bGVuKTsKLQkqZmlyc3QgPSAqbGFzdCA9ICdcMCc7Ci0KLSNkZWZpbmUgQUxHX0FQUEVORCh0bywgZnJvbSkgXAotCWRvIHsgXAotCQlpZiAoKnRvICE9ICdcMCcpIFwKLQkJCXN0cmxjYXQodG8sICIsIiwgbWF4bGVuKTsgXAotCQlzdHJsY2F0KHRvLCBmcm9tLCBtYXhsZW4pOyBcCi0JfSB3aGlsZSAoMCkKLQotCXdoaWxlICgoYWxnID0gc3Ryc2VwKCZhdmFpbCwgIiwiKSkgJiYgKmFsZyAhPSAnXDAnKSB7Ci0JCWlmICgoa3R5cGUgPSBrZXlfdHlwZV9mcm9tX25hbWUoYWxnKSkgPT0gS0VZX1VOU1BFQykKLQkJCWZhdGFsKCIlczogdW5rbm93biBhbGcgJXMiLCBfX2Z1bmNfXywgYWxnKTsKLQkJaWYgKGxvb2t1cF9rZXlfaW5faG9zdGtleXNfYnlfdHlwZShob3N0a2V5cywKLQkJICAgIGtleV90eXBlX3BsYWluKGt0eXBlKSwgTlVMTCkpCi0JCQlBTEdfQVBQRU5EKGZpcnN0LCBhbGcpOwotCQllbHNlCi0JCQlBTEdfQVBQRU5EKGxhc3QsIGFsZyk7Ci0JfQotI3VuZGVmIEFMR19BUFBFTkQKLQl4YXNwcmludGYoJnJldCwgIiVzJXMlcyIsIGZpcnN0LCAqZmlyc3QgPT0gJ1wwJyA/ICIiIDogIiwiLCBsYXN0KTsKLQlpZiAoKmZpcnN0ICE9ICdcMCcpCi0JCWRlYnVnMygiJXM6IHByZWZlciBob3N0a2V5YWxnczogJXMiLCBfX2Z1bmNfXywgZmlyc3QpOwotCi0JeGZyZWUoZmlyc3QpOwotCXhmcmVlKGxhc3QpOwotCXhmcmVlKGhvc3RuYW1lKTsKLQl4ZnJlZShvYXZhaWwpOwotCWZyZWVfaG9zdGtleXMoaG9zdGtleXMpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotdm9pZAotc3NoX2tleDIoY2hhciAqaG9zdCwgc3RydWN0IHNvY2thZGRyICpob3N0YWRkciwgdV9zaG9ydCBwb3J0KQotewotCUtleCAqa2V4OwotCi0JeHh4X2hvc3QgPSBob3N0OwotCXh4eF9ob3N0YWRkciA9IGhvc3RhZGRyOwotCi0JaWYgKG9wdGlvbnMuY2lwaGVycyA9PSAoY2hhciAqKS0xKSB7Ci0JCWxvZ2l0KCJObyB2YWxpZCBjaXBoZXJzIGZvciBwcm90b2NvbCB2ZXJzaW9uIDIgZ2l2ZW4sIHVzaW5nIGRlZmF1bHRzLiIpOwotCQlvcHRpb25zLmNpcGhlcnMgPSBOVUxMOwotCX0KLQlpZiAob3B0aW9ucy5jaXBoZXJzICE9IE5VTEwpIHsKLQkJbXlwcm9wb3NhbFtQUk9QT1NBTF9FTkNfQUxHU19DVE9TXSA9Ci0JCW15cHJvcG9zYWxbUFJPUE9TQUxfRU5DX0FMR1NfU1RPQ10gPSBvcHRpb25zLmNpcGhlcnM7Ci0JfQotCW15cHJvcG9zYWxbUFJPUE9TQUxfRU5DX0FMR1NfQ1RPU10gPQotCSAgICBjb21wYXRfY2lwaGVyX3Byb3Bvc2FsKG15cHJvcG9zYWxbUFJPUE9TQUxfRU5DX0FMR1NfQ1RPU10pOwotCW15cHJvcG9zYWxbUFJPUE9TQUxfRU5DX0FMR1NfU1RPQ10gPQotCSAgICBjb21wYXRfY2lwaGVyX3Byb3Bvc2FsKG15cHJvcG9zYWxbUFJPUE9TQUxfRU5DX0FMR1NfU1RPQ10pOwotCWlmIChvcHRpb25zLmNvbXByZXNzaW9uKSB7Ci0JCW15cHJvcG9zYWxbUFJPUE9TQUxfQ09NUF9BTEdTX0NUT1NdID0KLQkJbXlwcm9wb3NhbFtQUk9QT1NBTF9DT01QX0FMR1NfU1RPQ10gPSAiemxpYkBvcGVuc3NoLmNvbSx6bGliLG5vbmUiOwotCX0gZWxzZSB7Ci0JCW15cHJvcG9zYWxbUFJPUE9TQUxfQ09NUF9BTEdTX0NUT1NdID0KLQkJbXlwcm9wb3NhbFtQUk9QT1NBTF9DT01QX0FMR1NfU1RPQ10gPSAibm9uZSx6bGliQG9wZW5zc2guY29tLHpsaWIiOwotCX0KLQlpZiAob3B0aW9ucy5tYWNzICE9IE5VTEwpIHsKLQkJbXlwcm9wb3NhbFtQUk9QT1NBTF9NQUNfQUxHU19DVE9TXSA9Ci0JCW15cHJvcG9zYWxbUFJPUE9TQUxfTUFDX0FMR1NfU1RPQ10gPSBvcHRpb25zLm1hY3M7Ci0JfQotCWlmIChvcHRpb25zLmhvc3RrZXlhbGdvcml0aG1zICE9IE5VTEwpCi0JCW15cHJvcG9zYWxbUFJPUE9TQUxfU0VSVkVSX0hPU1RfS0VZX0FMR1NdID0KLQkJICAgIG9wdGlvbnMuaG9zdGtleWFsZ29yaXRobXM7Ci0JZWxzZSB7Ci0JCS8qIFByZWZlciBhbGdvcml0aG1zIHRoYXQgd2UgYWxyZWFkeSBoYXZlIGtleXMgZm9yICovCi0JCW15cHJvcG9zYWxbUFJPUE9TQUxfU0VSVkVSX0hPU1RfS0VZX0FMR1NdID0KLQkJICAgIG9yZGVyX2hvc3RrZXlhbGdzKGhvc3QsIGhvc3RhZGRyLCBwb3J0KTsKLQl9Ci0JaWYgKG9wdGlvbnMua2V4X2FsZ29yaXRobXMgIT0gTlVMTCkKLQkJbXlwcm9wb3NhbFtQUk9QT1NBTF9LRVhfQUxHU10gPSBvcHRpb25zLmtleF9hbGdvcml0aG1zOwotCi0JaWYgKG9wdGlvbnMucmVrZXlfbGltaXQpCi0JCXBhY2tldF9zZXRfcmVrZXlfbGltaXQoKHVfaW50MzJfdClvcHRpb25zLnJla2V5X2xpbWl0KTsKLQotCS8qIHN0YXJ0IGtleSBleGNoYW5nZSAqLwotCWtleCA9IGtleF9zZXR1cChteXByb3Bvc2FsKTsKLQlrZXgtPmtleFtLRVhfREhfR1JQMV9TSEExXSA9IGtleGRoX2NsaWVudDsKLQlrZXgtPmtleFtLRVhfREhfR1JQMTRfU0hBMV0gPSBrZXhkaF9jbGllbnQ7Ci0Ja2V4LT5rZXhbS0VYX0RIX0dFWF9TSEExXSA9IGtleGdleF9jbGllbnQ7Ci0Ja2V4LT5rZXhbS0VYX0RIX0dFWF9TSEEyNTZdID0ga2V4Z2V4X2NsaWVudDsKLQlrZXgtPmtleFtLRVhfRUNESF9TSEEyXSA9IGtleGVjZGhfY2xpZW50OwotCWtleC0+Y2xpZW50X3ZlcnNpb25fc3RyaW5nPWNsaWVudF92ZXJzaW9uX3N0cmluZzsKLQlrZXgtPnNlcnZlcl92ZXJzaW9uX3N0cmluZz1zZXJ2ZXJfdmVyc2lvbl9zdHJpbmc7Ci0Ja2V4LT52ZXJpZnlfaG9zdF9rZXk9JnZlcmlmeV9ob3N0X2tleV9jYWxsYmFjazsKLQotCXh4eF9rZXggPSBrZXg7Ci0KLQlkaXNwYXRjaF9ydW4oRElTUEFUQ0hfQkxPQ0ssICZrZXgtPmRvbmUsIGtleCk7Ci0KLQlpZiAob3B0aW9ucy51c2Vfcm9hbWluZyAmJiAha2V4LT5yb2FtaW5nKSB7Ci0JCWRlYnVnKCJSb2FtaW5nIG5vdCBhbGxvd2VkIGJ5IHNlcnZlciIpOwotCQlvcHRpb25zLnVzZV9yb2FtaW5nID0gMDsKLQl9Ci0KLQlzZXNzaW9uX2lkMiA9IGtleC0+c2Vzc2lvbl9pZDsKLQlzZXNzaW9uX2lkMl9sZW4gPSBrZXgtPnNlc3Npb25faWRfbGVuOwotCi0jaWZkZWYgREVCVUdfS0VYREgKLQkvKiBzZW5kIDFzdCBlbmNyeXB0ZWQvbWFjZWQvY29tcHJlc3NlZCBtZXNzYWdlICovCi0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX0lHTk9SRSk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKCJtYXJrdXMiKTsKLQlwYWNrZXRfc2VuZCgpOwotCXBhY2tldF93cml0ZV93YWl0KCk7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIEF1dGhlbnRpY2F0ZSB1c2VyCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgQXV0aGN0eHQgQXV0aGN0eHQ7Ci10eXBlZGVmIHN0cnVjdCBBdXRobWV0aG9kIEF1dGhtZXRob2Q7Ci10eXBlZGVmIHN0cnVjdCBpZGVudGl0eSBJZGVudGl0eTsKLXR5cGVkZWYgc3RydWN0IGlkbGlzdCBJZGxpc3Q7Ci0KLXN0cnVjdCBpZGVudGl0eSB7Ci0JVEFJTFFfRU5UUlkoaWRlbnRpdHkpIG5leHQ7Ci0JQXV0aGVudGljYXRpb25Db25uZWN0aW9uICphYzsJLyogc2V0IGlmIGFnZW50IHN1cHBvcnRzIGtleSAqLwotCUtleQkqa2V5OwkJCS8qIHB1YmxpYy9wcml2YXRlIGtleSAqLwotCWNoYXIJKmZpbGVuYW1lOwkJLyogY29tbWVudCBmb3IgYWdlbnQtb25seSBrZXlzICovCi0JaW50CXRyaWVkOwotCWludAlpc3ByaXZhdGU7CQkvKiBrZXkgcG9pbnRzIHRvIHRoZSBwcml2YXRlIGtleSAqLwotfTsKLVRBSUxRX0hFQUQoaWRsaXN0LCBpZGVudGl0eSk7Ci0KLXN0cnVjdCBBdXRoY3R4dCB7Ci0JY29uc3QgY2hhciAqc2VydmVyX3VzZXI7Ci0JY29uc3QgY2hhciAqbG9jYWxfdXNlcjsKLQljb25zdCBjaGFyICpob3N0OwotCWNvbnN0IGNoYXIgKnNlcnZpY2U7Ci0JQXV0aG1ldGhvZCAqbWV0aG9kOwotCXNpZ19hdG9taWNfdCBzdWNjZXNzOwotCWNoYXIgKmF1dGhsaXN0OwotCS8qIHB1YmtleSAqLwotCUlkbGlzdCBrZXlzOwotCUF1dGhlbnRpY2F0aW9uQ29ubmVjdGlvbiAqYWdlbnQ7Ci0JLyogaG9zdGJhc2VkICovCi0JU2Vuc2l0aXZlICpzZW5zaXRpdmU7Ci0JLyoga2JkLWludGVyYWN0aXZlICovCi0JaW50IGluZm9fcmVxX3NlZW47Ci0JLyogZ2VuZXJpYyAqLwotCXZvaWQgKm1ldGhvZGRhdGE7Ci19Owotc3RydWN0IEF1dGhtZXRob2QgewotCWNoYXIJKm5hbWU7CQkvKiBzdHJpbmcgdG8gY29tcGFyZSBhZ2FpbnN0IHNlcnZlcidzIGxpc3QgKi8KLQlpbnQJKCp1c2VyYXV0aCkoQXV0aGN0eHQgKmF1dGhjdHh0KTsKLQl2b2lkCSgqY2xlYW51cCkoQXV0aGN0eHQgKmF1dGhjdHh0KTsKLQlpbnQJKmVuYWJsZWQ7CS8qIGZsYWcgaW4gb3B0aW9uIHN0cnVjdCB0aGF0IGVuYWJsZXMgbWV0aG9kICovCi0JaW50CSpiYXRjaF9mbGFnOwkvKiBmbGFnIGluIG9wdGlvbiBzdHJ1Y3QgdGhhdCBkaXNhYmxlcyBtZXRob2QgKi8KLX07Ci0KLXZvaWQJaW5wdXRfdXNlcmF1dGhfc3VjY2VzcyhpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKLXZvaWQJaW5wdXRfdXNlcmF1dGhfc3VjY2Vzc191bmV4cGVjdGVkKGludCwgdV9pbnQzMl90LCB2b2lkICopOwotdm9pZAlpbnB1dF91c2VyYXV0aF9mYWlsdXJlKGludCwgdV9pbnQzMl90LCB2b2lkICopOwotdm9pZAlpbnB1dF91c2VyYXV0aF9iYW5uZXIoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Ci12b2lkCWlucHV0X3VzZXJhdXRoX2Vycm9yKGludCwgdV9pbnQzMl90LCB2b2lkICopOwotdm9pZAlpbnB1dF91c2VyYXV0aF9pbmZvX3JlcShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKLXZvaWQJaW5wdXRfdXNlcmF1dGhfcGtfb2soaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Ci12b2lkCWlucHV0X3VzZXJhdXRoX3Bhc3N3ZF9jaGFuZ2VyZXEoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Ci12b2lkCWlucHV0X3VzZXJhdXRoX2pwYWtlX3NlcnZlcl9zdGVwMShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKLXZvaWQJaW5wdXRfdXNlcmF1dGhfanBha2Vfc2VydmVyX3N0ZXAyKGludCwgdV9pbnQzMl90LCB2b2lkICopOwotdm9pZAlpbnB1dF91c2VyYXV0aF9qcGFrZV9zZXJ2ZXJfY29uZmlybShpbnQsIHVfaW50MzJfdCwgdm9pZCAqKTsKLQotaW50CXVzZXJhdXRoX25vbmUoQXV0aGN0eHQgKik7Ci1pbnQJdXNlcmF1dGhfcHVia2V5KEF1dGhjdHh0ICopOwotaW50CXVzZXJhdXRoX3Bhc3N3ZChBdXRoY3R4dCAqKTsKLWludAl1c2VyYXV0aF9rYmRpbnQoQXV0aGN0eHQgKik7Ci1pbnQJdXNlcmF1dGhfaG9zdGJhc2VkKEF1dGhjdHh0ICopOwotaW50CXVzZXJhdXRoX2pwYWtlKEF1dGhjdHh0ICopOwotCi12b2lkCXVzZXJhdXRoX2pwYWtlX2NsZWFudXAoQXV0aGN0eHQgKik7Ci0KLSNpZmRlZiBHU1NBUEkKLWludAl1c2VyYXV0aF9nc3NhcGkoQXV0aGN0eHQgKmF1dGhjdHh0KTsKLXZvaWQJaW5wdXRfZ3NzYXBpX3Jlc3BvbnNlKGludCB0eXBlLCB1X2ludDMyX3QsIHZvaWQgKik7Ci12b2lkCWlucHV0X2dzc2FwaV90b2tlbihpbnQgdHlwZSwgdV9pbnQzMl90LCB2b2lkICopOwotdm9pZAlpbnB1dF9nc3NhcGlfaGFzaChpbnQgdHlwZSwgdV9pbnQzMl90LCB2b2lkICopOwotdm9pZAlpbnB1dF9nc3NhcGlfZXJyb3IoaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Ci12b2lkCWlucHV0X2dzc2FwaV9lcnJ0b2soaW50LCB1X2ludDMyX3QsIHZvaWQgKik7Ci0jZW5kaWYKLQotdm9pZAl1c2VyYXV0aChBdXRoY3R4dCAqLCBjaGFyICopOwotCi1zdGF0aWMgaW50IHNpZ25fYW5kX3NlbmRfcHVia2V5KEF1dGhjdHh0ICosIElkZW50aXR5ICopOwotc3RhdGljIHZvaWQgcHVia2V5X3ByZXBhcmUoQXV0aGN0eHQgKik7Ci1zdGF0aWMgdm9pZCBwdWJrZXlfY2xlYW51cChBdXRoY3R4dCAqKTsKLXN0YXRpYyBLZXkgKmxvYWRfaWRlbnRpdHlfZmlsZShjaGFyICopOwotCi1zdGF0aWMgQXV0aG1ldGhvZCAqYXV0aG1ldGhvZF9nZXQoY2hhciAqYXV0aGxpc3QpOwotc3RhdGljIEF1dGhtZXRob2QgKmF1dGhtZXRob2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOwotc3RhdGljIGNoYXIgKmF1dGhtZXRob2RzX2dldCh2b2lkKTsKLQotQXV0aG1ldGhvZCBhdXRobWV0aG9kc1tdID0gewotI2lmZGVmIEdTU0FQSQotCXsiZ3NzYXBpLXdpdGgtbWljIiwKLQkJdXNlcmF1dGhfZ3NzYXBpLAotCQlOVUxMLAotCQkmb3B0aW9ucy5nc3NfYXV0aGVudGljYXRpb24sCi0JCU5VTEx9LAotI2VuZGlmCi0JeyJob3N0YmFzZWQiLAotCQl1c2VyYXV0aF9ob3N0YmFzZWQsCi0JCU5VTEwsCi0JCSZvcHRpb25zLmhvc3RiYXNlZF9hdXRoZW50aWNhdGlvbiwKLQkJTlVMTH0sCi0JeyJwdWJsaWNrZXkiLAotCQl1c2VyYXV0aF9wdWJrZXksCi0JCU5VTEwsCi0JCSZvcHRpb25zLnB1YmtleV9hdXRoZW50aWNhdGlvbiwKLQkJTlVMTH0sCi0jaWZkZWYgSlBBS0UKLQl7ImpwYWtlLTAxQG9wZW5zc2guY29tIiwKLQkJdXNlcmF1dGhfanBha2UsCi0JCXVzZXJhdXRoX2pwYWtlX2NsZWFudXAsCi0JCSZvcHRpb25zLnplcm9fa25vd2xlZGdlX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uLAotCQkmb3B0aW9ucy5iYXRjaF9tb2RlfSwKLSNlbmRpZgotCXsia2V5Ym9hcmQtaW50ZXJhY3RpdmUiLAotCQl1c2VyYXV0aF9rYmRpbnQsCi0JCU5VTEwsCi0JCSZvcHRpb25zLmtiZF9pbnRlcmFjdGl2ZV9hdXRoZW50aWNhdGlvbiwKLQkJJm9wdGlvbnMuYmF0Y2hfbW9kZX0sCi0JeyJwYXNzd29yZCIsCi0JCXVzZXJhdXRoX3Bhc3N3ZCwKLQkJTlVMTCwKLQkJJm9wdGlvbnMucGFzc3dvcmRfYXV0aGVudGljYXRpb24sCi0JCSZvcHRpb25zLmJhdGNoX21vZGV9LAotCXsibm9uZSIsCi0JCXVzZXJhdXRoX25vbmUsCi0JCU5VTEwsCi0JCU5VTEwsCi0JCU5VTEx9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfQotfTsKLQotdm9pZAotc3NoX3VzZXJhdXRoMihjb25zdCBjaGFyICpsb2NhbF91c2VyLCBjb25zdCBjaGFyICpzZXJ2ZXJfdXNlciwgY2hhciAqaG9zdCwKLSAgICBTZW5zaXRpdmUgKnNlbnNpdGl2ZSkKLXsKLQlBdXRoY3R4dCBhdXRoY3R4dDsKLQlpbnQgdHlwZTsKLQotCWlmIChvcHRpb25zLmNoYWxsZW5nZV9yZXNwb25zZV9hdXRoZW50aWNhdGlvbikKLQkJb3B0aW9ucy5rYmRfaW50ZXJhY3RpdmVfYXV0aGVudGljYXRpb24gPSAxOwotCi0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1NFUlZJQ0VfUkVRVUVTVCk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKCJzc2gtdXNlcmF1dGgiKTsKLQlwYWNrZXRfc2VuZCgpOwotCWRlYnVnKCJTU0gyX01TR19TRVJWSUNFX1JFUVVFU1Qgc2VudCIpOwotCXBhY2tldF93cml0ZV93YWl0KCk7Ci0JdHlwZSA9IHBhY2tldF9yZWFkKCk7Ci0JaWYgKHR5cGUgIT0gU1NIMl9NU0dfU0VSVklDRV9BQ0NFUFQpCi0JCWZhdGFsKCJTZXJ2ZXIgZGVuaWVkIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3Q6ICVkIiwgdHlwZSk7Ci0JaWYgKHBhY2tldF9yZW1haW5pbmcoKSA+IDApIHsKLQkJY2hhciAqcmVwbHkgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQkJZGVidWcyKCJzZXJ2aWNlX2FjY2VwdDogJXMiLCByZXBseSk7Ci0JCXhmcmVlKHJlcGx5KTsKLQl9IGVsc2UgewotCQlkZWJ1ZzIoImJ1Z2d5IHNlcnZlcjogc2VydmljZV9hY2NlcHQgdy9vIHNlcnZpY2UiKTsKLQl9Ci0JcGFja2V0X2NoZWNrX2VvbSgpOwotCWRlYnVnKCJTU0gyX01TR19TRVJWSUNFX0FDQ0VQVCByZWNlaXZlZCIpOwotCi0JaWYgKG9wdGlvbnMucHJlZmVycmVkX2F1dGhlbnRpY2F0aW9ucyA9PSBOVUxMKQotCQlvcHRpb25zLnByZWZlcnJlZF9hdXRoZW50aWNhdGlvbnMgPSBhdXRobWV0aG9kc19nZXQoKTsKLQotCS8qIHNldHVwIGF1dGhlbnRpY2F0aW9uIGNvbnRleHQgKi8KLQltZW1zZXQoJmF1dGhjdHh0LCAwLCBzaXplb2YoYXV0aGN0eHQpKTsKLQlwdWJrZXlfcHJlcGFyZSgmYXV0aGN0eHQpOwotCWF1dGhjdHh0LnNlcnZlcl91c2VyID0gc2VydmVyX3VzZXI7Ci0JYXV0aGN0eHQubG9jYWxfdXNlciA9IGxvY2FsX3VzZXI7Ci0JYXV0aGN0eHQuaG9zdCA9IGhvc3Q7Ci0JYXV0aGN0eHQuc2VydmljZSA9ICJzc2gtY29ubmVjdGlvbiI7CQkvKiBzZXJ2aWNlIG5hbWUgKi8KLQlhdXRoY3R4dC5zdWNjZXNzID0gMDsKLQlhdXRoY3R4dC5tZXRob2QgPSBhdXRobWV0aG9kX2xvb2t1cCgibm9uZSIpOwotCWF1dGhjdHh0LmF1dGhsaXN0ID0gTlVMTDsKLQlhdXRoY3R4dC5tZXRob2RkYXRhID0gTlVMTDsKLQlhdXRoY3R4dC5zZW5zaXRpdmUgPSBzZW5zaXRpdmU7Ci0JYXV0aGN0eHQuaW5mb19yZXFfc2VlbiA9IDA7Ci0JaWYgKGF1dGhjdHh0Lm1ldGhvZCA9PSBOVUxMKQotCQlmYXRhbCgic3NoX3VzZXJhdXRoMjogaW50ZXJuYWwgZXJyb3I6IGNhbm5vdCBzZW5kIHVzZXJhdXRoIG5vbmUgcmVxdWVzdCIpOwotCi0JLyogaW5pdGlhbCB1c2VyYXV0aCByZXF1ZXN0ICovCi0JdXNlcmF1dGhfbm9uZSgmYXV0aGN0eHQpOwotCi0JZGlzcGF0Y2hfaW5pdCgmaW5wdXRfdXNlcmF1dGhfZXJyb3IpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9TVUNDRVNTLCAmaW5wdXRfdXNlcmF1dGhfc3VjY2Vzcyk7Ci0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0ZBSUxVUkUsICZpbnB1dF91c2VyYXV0aF9mYWlsdXJlKTsKLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfQkFOTkVSLCAmaW5wdXRfdXNlcmF1dGhfYmFubmVyKTsKLQlkaXNwYXRjaF9ydW4oRElTUEFUQ0hfQkxPQ0ssICZhdXRoY3R4dC5zdWNjZXNzLCAmYXV0aGN0eHQpOwkvKiBsb29wIHVudGlsIHN1Y2Nlc3MgKi8KLQotCXB1YmtleV9jbGVhbnVwKCZhdXRoY3R4dCk7Ci0JZGlzcGF0Y2hfcmFuZ2UoU1NIMl9NU0dfVVNFUkFVVEhfTUlOLCBTU0gyX01TR19VU0VSQVVUSF9NQVgsIE5VTEwpOwotCi0JZGVidWcoIkF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZCAoJXMpLiIsIGF1dGhjdHh0Lm1ldGhvZC0+bmFtZSk7Ci19Ci0KLXZvaWQKLXVzZXJhdXRoKEF1dGhjdHh0ICphdXRoY3R4dCwgY2hhciAqYXV0aGxpc3QpCi17Ci0JaWYgKGF1dGhjdHh0LT5tZXRob2QgIT0gTlVMTCAmJiBhdXRoY3R4dC0+bWV0aG9kLT5jbGVhbnVwICE9IE5VTEwpCi0JCWF1dGhjdHh0LT5tZXRob2QtPmNsZWFudXAoYXV0aGN0eHQpOwotCi0JaWYgKGF1dGhjdHh0LT5tZXRob2RkYXRhKSB7Ci0JCXhmcmVlKGF1dGhjdHh0LT5tZXRob2RkYXRhKTsKLQkJYXV0aGN0eHQtPm1ldGhvZGRhdGEgPSBOVUxMOwotCX0KLQlpZiAoYXV0aGxpc3QgPT0gTlVMTCkgewotCQlhdXRobGlzdCA9IGF1dGhjdHh0LT5hdXRobGlzdDsKLQl9IGVsc2UgewotCQlpZiAoYXV0aGN0eHQtPmF1dGhsaXN0KQotCQkJeGZyZWUoYXV0aGN0eHQtPmF1dGhsaXN0KTsKLQkJYXV0aGN0eHQtPmF1dGhsaXN0ID0gYXV0aGxpc3Q7Ci0JfQotCWZvciAoOzspIHsKLQkJQXV0aG1ldGhvZCAqbWV0aG9kID0gYXV0aG1ldGhvZF9nZXQoYXV0aGxpc3QpOwotCQlpZiAobWV0aG9kID09IE5VTEwpCi0JCQlmYXRhbCgiUGVybWlzc2lvbiBkZW5pZWQgKCVzKS4iLCBhdXRobGlzdCk7Ci0JCWF1dGhjdHh0LT5tZXRob2QgPSBtZXRob2Q7Ci0KLQkJLyogcmVzZXQgdGhlIHBlciBtZXRob2QgaGFuZGxlciAqLwotCQlkaXNwYXRjaF9yYW5nZShTU0gyX01TR19VU0VSQVVUSF9QRVJfTUVUSE9EX01JTiwKLQkJICAgIFNTSDJfTVNHX1VTRVJBVVRIX1BFUl9NRVRIT0RfTUFYLCBOVUxMKTsKLQotCQkvKiBhbmQgdHJ5IG5ldyBtZXRob2QgKi8KLQkJaWYgKG1ldGhvZC0+dXNlcmF1dGgoYXV0aGN0eHQpICE9IDApIHsKLQkJCWRlYnVnMigid2Ugc2VudCBhICVzIHBhY2tldCwgd2FpdCBmb3IgcmVwbHkiLCBtZXRob2QtPm5hbWUpOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlkZWJ1ZzIoIndlIGRpZCBub3Qgc2VuZCBhIHBhY2tldCwgZGlzYWJsZSBtZXRob2QiKTsKLQkJCW1ldGhvZC0+ZW5hYmxlZCA9IE5VTEw7Ci0JCX0KLQl9Ci19Ci0KLS8qIEFSR1NVU0VEICovCi12b2lkCi1pbnB1dF91c2VyYXV0aF9lcnJvcihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlmYXRhbCgiaW5wdXRfdXNlcmF1dGhfZXJyb3I6IGJhZCBtZXNzYWdlIGR1cmluZyBhdXRoZW50aWNhdGlvbjogIgotCSAgICAidHlwZSAlZCIsIHR5cGUpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotdm9pZAotaW5wdXRfdXNlcmF1dGhfYmFubmVyKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQotewotCWNoYXIgKm1zZywgKnJhdywgKmxhbmc7Ci0JdV9pbnQgbGVuOwotCi0JZGVidWczKCJpbnB1dF91c2VyYXV0aF9iYW5uZXIiKTsKLQlyYXcgPSBwYWNrZXRfZ2V0X3N0cmluZygmbGVuKTsKLQlsYW5nID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JaWYgKGxlbiA+IDAgJiYgb3B0aW9ucy5sb2dfbGV2ZWwgPj0gU1lTTE9HX0xFVkVMX0lORk8pIHsKLQkJaWYgKGxlbiA+IDY1NTM2KQotCQkJbGVuID0gNjU1MzY7Ci0JCW1zZyA9IHhtYWxsb2MobGVuICogNCArIDEpOyAvKiBtYXggZXhwYW5zaW9uIGZyb20gc3RybnZpcygpICovCi0JCXN0cm52aXMobXNnLCByYXcsIGxlbiAqIDQgKyAxLCBWSVNfU0FGRXxWSVNfT0NUQUx8VklTX05PU0xBU0gpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbXNnKTsKLQkJeGZyZWUobXNnKTsKLQl9Ci0JeGZyZWUocmF3KTsKLQl4ZnJlZShsYW5nKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQKLWlucHV0X3VzZXJhdXRoX3N1Y2Nlc3MoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKLQotCWlmIChhdXRoY3R4dCA9PSBOVUxMKQotCQlmYXRhbCgiaW5wdXRfdXNlcmF1dGhfc3VjY2Vzczogbm8gYXV0aGVudGljYXRpb24gY29udGV4dCIpOwotCWlmIChhdXRoY3R4dC0+YXV0aGxpc3QpIHsKLQkJeGZyZWUoYXV0aGN0eHQtPmF1dGhsaXN0KTsKLQkJYXV0aGN0eHQtPmF1dGhsaXN0ID0gTlVMTDsKLQl9Ci0JaWYgKGF1dGhjdHh0LT5tZXRob2QgIT0gTlVMTCAmJiBhdXRoY3R4dC0+bWV0aG9kLT5jbGVhbnVwICE9IE5VTEwpCi0JCWF1dGhjdHh0LT5tZXRob2QtPmNsZWFudXAoYXV0aGN0eHQpOwotCWlmIChhdXRoY3R4dC0+bWV0aG9kZGF0YSkgewotCQl4ZnJlZShhdXRoY3R4dC0+bWV0aG9kZGF0YSk7Ci0JCWF1dGhjdHh0LT5tZXRob2RkYXRhID0gTlVMTDsKLQl9Ci0JYXV0aGN0eHQtPnN1Y2Nlc3MgPSAxOwkJCS8qIGJyZWFrIG91dCAqLwotfQotCi12b2lkCi1pbnB1dF91c2VyYXV0aF9zdWNjZXNzX3VuZXhwZWN0ZWQoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKLQotCWlmIChhdXRoY3R4dCA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IG5vIGF1dGhlbnRpY2F0aW9uIGNvbnRleHQiLCBfX2Z1bmNfXyk7Ci0KLQlmYXRhbCgiVW5leHBlY3RlZCBhdXRoZW50aWNhdGlvbiBzdWNjZXNzIGR1cmluZyAlcy4iLAotCSAgICBhdXRoY3R4dC0+bWV0aG9kLT5uYW1lKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQKLWlucHV0X3VzZXJhdXRoX2ZhaWx1cmUoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKLQljaGFyICphdXRobGlzdCA9IE5VTEw7Ci0JaW50IHBhcnRpYWw7Ci0KLQlpZiAoYXV0aGN0eHQgPT0gTlVMTCkKLQkJZmF0YWwoImlucHV0X3VzZXJhdXRoX2ZhaWx1cmU6IG5vIGF1dGhlbnRpY2F0aW9uIGNvbnRleHQiKTsKLQotCWF1dGhsaXN0ID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JcGFydGlhbCA9IHBhY2tldF9nZXRfY2hhcigpOwotCXBhY2tldF9jaGVja19lb20oKTsKLQotCWlmIChwYXJ0aWFsICE9IDApCi0JCWxvZ2l0KCJBdXRoZW50aWNhdGVkIHdpdGggcGFydGlhbCBzdWNjZXNzLiIpOwotCWRlYnVnKCJBdXRoZW50aWNhdGlvbnMgdGhhdCBjYW4gY29udGludWU6ICVzIiwgYXV0aGxpc3QpOwotCi0JdXNlcmF1dGgoYXV0aGN0eHQsIGF1dGhsaXN0KTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQKLWlucHV0X3VzZXJhdXRoX3BrX29rKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQotewotCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7Ci0JS2V5ICprZXkgPSBOVUxMOwotCUlkZW50aXR5ICppZCA9IE5VTEw7Ci0JQnVmZmVyIGI7Ci0JaW50IHBrdHlwZSwgc2VudCA9IDA7Ci0JdV9pbnQgYWxlbiwgYmxlbjsKLQljaGFyICpwa2FsZywgKmZwOwotCXVfY2hhciAqcGtibG9iOwotCi0JaWYgKGF1dGhjdHh0ID09IE5VTEwpCi0JCWZhdGFsKCJpbnB1dF91c2VyYXV0aF9wa19vazogbm8gYXV0aGVudGljYXRpb24gY29udGV4dCIpOwotCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfUEtPSykgewotCQkvKiB0aGlzIGlzIHNpbWlsYXIgdG8gU1NIX0JVR19QS0FVVEggKi8KLQkJZGVidWcyKCJpbnB1dF91c2VyYXV0aF9wa19vazogU1NIX0JVR19QS09LIik7Ci0JCXBrYmxvYiA9IHBhY2tldF9nZXRfc3RyaW5nKCZibGVuKTsKLQkJYnVmZmVyX2luaXQoJmIpOwotCQlidWZmZXJfYXBwZW5kKCZiLCBwa2Jsb2IsIGJsZW4pOwotCQlwa2FsZyA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZiLCAmYWxlbik7Ci0JCWJ1ZmZlcl9mcmVlKCZiKTsKLQl9IGVsc2UgewotCQlwa2FsZyA9IHBhY2tldF9nZXRfc3RyaW5nKCZhbGVuKTsKLQkJcGtibG9iID0gcGFja2V0X2dldF9zdHJpbmcoJmJsZW4pOwotCX0KLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlkZWJ1ZygiU2VydmVyIGFjY2VwdHMga2V5OiBwa2FsZyAlcyBibGVuICV1IiwgcGthbGcsIGJsZW4pOwotCi0JaWYgKChwa3R5cGUgPSBrZXlfdHlwZV9mcm9tX25hbWUocGthbGcpKSA9PSBLRVlfVU5TUEVDKSB7Ci0JCWRlYnVnKCJ1bmtub3duIHBrYWxnICVzIiwgcGthbGcpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICgoa2V5ID0ga2V5X2Zyb21fYmxvYihwa2Jsb2IsIGJsZW4pKSA9PSBOVUxMKSB7Ci0JCWRlYnVnKCJubyBrZXkgZnJvbSBibG9iLiBwa2FsZyAlcyIsIHBrYWxnKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoa2V5LT50eXBlICE9IHBrdHlwZSkgewotCQllcnJvcigiaW5wdXRfdXNlcmF1dGhfcGtfb2s6IHR5cGUgbWlzbWF0Y2ggIgotCQkgICAgImZvciBkZWNvZGVkIGtleSAocmVjZWl2ZWQgJWQsIGV4cGVjdGVkICVkKSIsCi0JCSAgICBrZXktPnR5cGUsIHBrdHlwZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JZnAgPSBrZXlfZmluZ2VycHJpbnQoa2V5LCBTU0hfRlBfTUQ1LCBTU0hfRlBfSEVYKTsKLQlkZWJ1ZzIoImlucHV0X3VzZXJhdXRoX3BrX29rOiBmcCAlcyIsIGZwKTsKLQl4ZnJlZShmcCk7Ci0KLQkvKgotCSAqIHNlYXJjaCBrZXlzIGluIHRoZSByZXZlcnNlIG9yZGVyLCBiZWNhdXNlIGxhc3QgY2FuZGlkYXRlIGhhcyBiZWVuCi0JICogbW92ZWQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUuICB0aGlzIGFsc28gYXZvaWRzIGNvbmZ1c2lvbiBieQotCSAqIGR1cGxpY2F0ZSBrZXlzCi0JICovCi0JVEFJTFFfRk9SRUFDSF9SRVZFUlNFKGlkLCAmYXV0aGN0eHQtPmtleXMsIGlkbGlzdCwgbmV4dCkgewotCQlpZiAoa2V5X2VxdWFsKGtleSwgaWQtPmtleSkpIHsKLQkJCXNlbnQgPSBzaWduX2FuZF9zZW5kX3B1YmtleShhdXRoY3R4dCwgaWQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci1kb25lOgotCWlmIChrZXkgIT0gTlVMTCkKLQkJa2V5X2ZyZWUoa2V5KTsKLQl4ZnJlZShwa2FsZyk7Ci0JeGZyZWUocGtibG9iKTsKLQotCS8qIHRyeSBhbm90aGVyIG1ldGhvZCBpZiB3ZSBkaWQgbm90IHNlbmQgYSBwYWNrZXQgKi8KLQlpZiAoc2VudCA9PSAwKQotCQl1c2VyYXV0aChhdXRoY3R4dCwgTlVMTCk7Ci19Ci0KLSNpZmRlZiBHU1NBUEkKLWludAotdXNlcmF1dGhfZ3NzYXBpKEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlHc3NjdHh0ICpnc3NjdHh0ID0gTlVMTDsKLQlzdGF0aWMgZ3NzX09JRF9zZXQgZ3NzX3N1cHBvcnRlZCA9IE5VTEw7Ci0Jc3RhdGljIHVfaW50IG1lY2ggPSAwOwotCU9NX3VpbnQzMiBtaW47Ci0JaW50IG9rID0gMDsKLQotCS8qIFRyeSBvbmUgR1NTQVBJIG1ldGhvZCBhdCBhIHRpbWUsIHJhdGhlciB0aGFuIHNlbmRpbmcgdGhlbSBhbGwgYXQKLQkgKiBvbmNlLiAqLwotCi0JaWYgKGdzc19zdXBwb3J0ZWQgPT0gTlVMTCkKLQkJZ3NzX2luZGljYXRlX21lY2hzKCZtaW4sICZnc3Nfc3VwcG9ydGVkKTsKLQotCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVjaGFuaXNtIGlzIHVzYWJsZSBiZWZvcmUgd2Ugb2ZmZXIgaXQgKi8KLQl3aGlsZSAobWVjaCA8IGdzc19zdXBwb3J0ZWQtPmNvdW50ICYmICFvaykgewotCQkvKiBNeSBERVIgZW5jb2RpbmcgcmVxdWlyZXMgbGVuZ3RoPDEyOCAqLwotCQlpZiAoZ3NzX3N1cHBvcnRlZC0+ZWxlbWVudHNbbWVjaF0ubGVuZ3RoIDwgMTI4ICYmCi0JCSAgICBzc2hfZ3NzYXBpX2NoZWNrX21lY2hhbmlzbSgmZ3NzY3R4dCwgCi0JCSAgICAmZ3NzX3N1cHBvcnRlZC0+ZWxlbWVudHNbbWVjaF0sIGF1dGhjdHh0LT5ob3N0KSkgewotCQkJb2sgPSAxOyAvKiBNZWNoYW5pc20gd29ya3MgKi8KLQkJfSBlbHNlIHsKLQkJCW1lY2grKzsKLQkJfQotCX0KLQotCWlmICghb2spCi0JCXJldHVybiAwOwotCi0JYXV0aGN0eHQtPm1ldGhvZGRhdGE9KHZvaWQgKilnc3NjdHh0OwotCi0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpOwotCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmVyX3VzZXIpOwotCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmljZSk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKGF1dGhjdHh0LT5tZXRob2QtPm5hbWUpOwotCi0JcGFja2V0X3B1dF9pbnQoMSk7Ci0KLQlwYWNrZXRfcHV0X2ludCgoZ3NzX3N1cHBvcnRlZC0+ZWxlbWVudHNbbWVjaF0ubGVuZ3RoKSArIDIpOwotCXBhY2tldF9wdXRfY2hhcihTU0hfR1NTX09JRFRZUEUpOwotCXBhY2tldF9wdXRfY2hhcihnc3Nfc3VwcG9ydGVkLT5lbGVtZW50c1ttZWNoXS5sZW5ndGgpOwotCXBhY2tldF9wdXRfcmF3KGdzc19zdXBwb3J0ZWQtPmVsZW1lbnRzW21lY2hdLmVsZW1lbnRzLAotCSAgICBnc3Nfc3VwcG9ydGVkLT5lbGVtZW50c1ttZWNoXS5sZW5ndGgpOwotCi0JcGFja2V0X3NlbmQoKTsKLQotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfUkVTUE9OU0UsICZpbnB1dF9nc3NhcGlfcmVzcG9uc2UpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfVE9LRU4sICZpbnB1dF9nc3NhcGlfdG9rZW4pOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfRVJST1IsICZpbnB1dF9nc3NhcGlfZXJyb3IpOwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfRVJSVE9LLCAmaW5wdXRfZ3NzYXBpX2VycnRvayk7Ci0KLQltZWNoKys7IC8qIE1vdmUgYWxvbmcgdG8gbmV4dCBjYW5kaWRhdGUgKi8KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgT01fdWludDMyCi1wcm9jZXNzX2dzc2FwaV90b2tlbih2b2lkICpjdHh0LCBnc3NfYnVmZmVyX3QgcmVjdl90b2spCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKLQlHc3NjdHh0ICpnc3NjdHh0ID0gYXV0aGN0eHQtPm1ldGhvZGRhdGE7Ci0JZ3NzX2J1ZmZlcl9kZXNjIHNlbmRfdG9rID0gR1NTX0NfRU1QVFlfQlVGRkVSOwotCWdzc19idWZmZXJfZGVzYyBtaWMgPSBHU1NfQ19FTVBUWV9CVUZGRVI7Ci0JZ3NzX2J1ZmZlcl9kZXNjIGdzc2J1ZjsKLQlPTV91aW50MzIgc3RhdHVzLCBtcywgZmxhZ3M7Ci0JQnVmZmVyIGI7Ci0KLQlzdGF0dXMgPSBzc2hfZ3NzYXBpX2luaXRfY3R4KGdzc2N0eHQsIG9wdGlvbnMuZ3NzX2RlbGVnX2NyZWRzLAotCSAgICByZWN2X3RvaywgJnNlbmRfdG9rLCAmZmxhZ3MpOwotCi0JaWYgKHNlbmRfdG9rLmxlbmd0aCA+IDApIHsKLQkJaWYgKEdTU19FUlJPUihzdGF0dXMpKQotCQkJcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX0dTU0FQSV9FUlJUT0spOwotCQllbHNlCi0JCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX1RPS0VOKTsKLQotCQlwYWNrZXRfcHV0X3N0cmluZyhzZW5kX3Rvay52YWx1ZSwgc2VuZF90b2subGVuZ3RoKTsKLQkJcGFja2V0X3NlbmQoKTsKLQkJZ3NzX3JlbGVhc2VfYnVmZmVyKCZtcywgJnNlbmRfdG9rKTsKLQl9Ci0KLQlpZiAoc3RhdHVzID09IEdTU19TX0NPTVBMRVRFKSB7Ci0JCS8qIHNlbmQgZWl0aGVyIGNvbXBsZXRlIG9yIE1JQywgZGVwZW5kaW5nIG9uIG1lY2hhbmlzbSAqLwotCQlpZiAoIShmbGFncyAmIEdTU19DX0lOVEVHX0ZMQUcpKSB7Ci0JCQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfR1NTQVBJX0VYQ0hBTkdFX0NPTVBMRVRFKTsKLQkJCXBhY2tldF9zZW5kKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzc2hfZ3NzYXBpX2J1aWxkbWljKCZiLCBhdXRoY3R4dC0+c2VydmVyX3VzZXIsCi0JCQkgICAgYXV0aGN0eHQtPnNlcnZpY2UsICJnc3NhcGktd2l0aC1taWMiKTsKLQotCQkJZ3NzYnVmLnZhbHVlID0gYnVmZmVyX3B0cigmYik7Ci0JCQlnc3NidWYubGVuZ3RoID0gYnVmZmVyX2xlbigmYik7Ci0KLQkJCXN0YXR1cyA9IHNzaF9nc3NhcGlfc2lnbihnc3NjdHh0LCAmZ3NzYnVmLCAmbWljKTsKLQotCQkJaWYgKCFHU1NfRVJST1Ioc3RhdHVzKSkgewotCQkJCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9HU1NBUElfTUlDKTsKLQkJCQlwYWNrZXRfcHV0X3N0cmluZyhtaWMudmFsdWUsIG1pYy5sZW5ndGgpOwotCi0JCQkJcGFja2V0X3NlbmQoKTsKLQkJCX0KLQotCQkJYnVmZmVyX2ZyZWUoJmIpOwotCQkJZ3NzX3JlbGVhc2VfYnVmZmVyKCZtcywgJm1pYyk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKiBBUkdTVVNFRCAqLwotdm9pZAotaW5wdXRfZ3NzYXBpX3Jlc3BvbnNlKGludCB0eXBlLCB1X2ludDMyX3QgcGxlbiwgdm9pZCAqY3R4dCkKLXsKLQlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OwotCUdzc2N0eHQgKmdzc2N0eHQ7Ci0JaW50IG9pZGxlbjsKLQljaGFyICpvaWR2OwotCi0JaWYgKGF1dGhjdHh0ID09IE5VTEwpCi0JCWZhdGFsKCJpbnB1dF9nc3NhcGlfcmVzcG9uc2U6IG5vIGF1dGhlbnRpY2F0aW9uIGNvbnRleHQiKTsKLQlnc3NjdHh0ID0gYXV0aGN0eHQtPm1ldGhvZGRhdGE7Ci0KLQkvKiBTZXR1cCBvdXIgT0lEICovCi0Jb2lkdiA9IHBhY2tldF9nZXRfc3RyaW5nKCZvaWRsZW4pOwotCi0JaWYgKG9pZGxlbiA8PSAyIHx8Ci0JICAgIG9pZHZbMF0gIT0gU1NIX0dTU19PSURUWVBFIHx8Ci0JICAgIG9pZHZbMV0gIT0gb2lkbGVuIC0gMikgewotCQl4ZnJlZShvaWR2KTsKLQkJZGVidWcoIkJhZGx5IGVuY29kZWQgbWVjaGFuaXNtIE9JRCByZWNlaXZlZCIpOwotCQl1c2VyYXV0aChhdXRoY3R4dCwgTlVMTCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIXNzaF9nc3NhcGlfY2hlY2tfb2lkKGdzc2N0eHQsIG9pZHYgKyAyLCBvaWRsZW4gLSAyKSkKLQkJZmF0YWwoIlNlcnZlciByZXR1cm5lZCBkaWZmZXJlbnQgT0lEIHRoYW4gZXhwZWN0ZWQiKTsKLQotCXBhY2tldF9jaGVja19lb20oKTsKLQotCXhmcmVlKG9pZHYpOwotCi0JaWYgKEdTU19FUlJPUihwcm9jZXNzX2dzc2FwaV90b2tlbihjdHh0LCBHU1NfQ19OT19CVUZGRVIpKSkgewotCQkvKiBTdGFydCBhZ2FpbiB3aXRoIG5leHQgbWV0aG9kIG9uIGxpc3QgKi8KLQkJZGVidWcoIlRyeWluZyB0byBzdGFydCBhZ2FpbiIpOwotCQl1c2VyYXV0aChhdXRoY3R4dCwgTlVMTCk7Ci0JCXJldHVybjsKLQl9Ci19Ci0KLS8qIEFSR1NVU0VEICovCi12b2lkCi1pbnB1dF9nc3NhcGlfdG9rZW4oaW50IHR5cGUsIHVfaW50MzJfdCBwbGVuLCB2b2lkICpjdHh0KQotewotCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7Ci0JZ3NzX2J1ZmZlcl9kZXNjIHJlY3ZfdG9rOwotCU9NX3VpbnQzMiBzdGF0dXM7Ci0JdV9pbnQgc2xlbjsKLQotCWlmIChhdXRoY3R4dCA9PSBOVUxMKQotCQlmYXRhbCgiaW5wdXRfZ3NzYXBpX3Jlc3BvbnNlOiBubyBhdXRoZW50aWNhdGlvbiBjb250ZXh0Iik7Ci0KLQlyZWN2X3Rvay52YWx1ZSA9IHBhY2tldF9nZXRfc3RyaW5nKCZzbGVuKTsKLQlyZWN2X3Rvay5sZW5ndGggPSBzbGVuOwkvKiBzYWZlIHR5cGVjYXN0ICovCi0KLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlzdGF0dXMgPSBwcm9jZXNzX2dzc2FwaV90b2tlbihjdHh0LCAmcmVjdl90b2spOwotCi0JeGZyZWUocmVjdl90b2sudmFsdWUpOwotCi0JaWYgKEdTU19FUlJPUihzdGF0dXMpKSB7Ci0JCS8qIFN0YXJ0IGFnYWluIHdpdGggdGhlIG5leHQgbWV0aG9kIGluIHRoZSBsaXN0ICovCi0JCXVzZXJhdXRoKGF1dGhjdHh0LCBOVUxMKTsKLQkJcmV0dXJuOwotCX0KLX0KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQKLWlucHV0X2dzc2FwaV9lcnJ0b2soaW50IHR5cGUsIHVfaW50MzJfdCBwbGVuLCB2b2lkICpjdHh0KQotewotCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7Ci0JR3NzY3R4dCAqZ3NzY3R4dDsKLQlnc3NfYnVmZmVyX2Rlc2Mgc2VuZF90b2sgPSBHU1NfQ19FTVBUWV9CVUZGRVI7Ci0JZ3NzX2J1ZmZlcl9kZXNjIHJlY3ZfdG9rOwotCU9NX3VpbnQzMiBzdGF0dXMsIG1zOwotCXVfaW50IGxlbjsKLQotCWlmIChhdXRoY3R4dCA9PSBOVUxMKQotCQlmYXRhbCgiaW5wdXRfZ3NzYXBpX3Jlc3BvbnNlOiBubyBhdXRoZW50aWNhdGlvbiBjb250ZXh0Iik7Ci0JZ3NzY3R4dCA9IGF1dGhjdHh0LT5tZXRob2RkYXRhOwotCi0JcmVjdl90b2sudmFsdWUgPSBwYWNrZXRfZ2V0X3N0cmluZygmbGVuKTsKLQlyZWN2X3Rvay5sZW5ndGggPSBsZW47Ci0KLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQkvKiBTdGljayBpdCBpbnRvIEdTU0FQSSBhbmQgc2VlIHdoYXQgaXQgc2F5cyAqLwotCXN0YXR1cyA9IHNzaF9nc3NhcGlfaW5pdF9jdHgoZ3NzY3R4dCwgb3B0aW9ucy5nc3NfZGVsZWdfY3JlZHMsCi0JICAgICZyZWN2X3RvaywgJnNlbmRfdG9rLCBOVUxMKTsKLQotCXhmcmVlKHJlY3ZfdG9rLnZhbHVlKTsKLQlnc3NfcmVsZWFzZV9idWZmZXIoJm1zLCAmc2VuZF90b2spOwotCi0JLyogU2VydmVyIHdpbGwgYmUgcmV0dXJuaW5nIGEgZmFpbGVkIHBhY2tldCBhZnRlciB0aGlzIG9uZSAqLwotfQotCi0vKiBBUkdTVVNFRCAqLwotdm9pZAotaW5wdXRfZ3NzYXBpX2Vycm9yKGludCB0eXBlLCB1X2ludDMyX3QgcGxlbiwgdm9pZCAqY3R4dCkKLXsKLQlPTV91aW50MzIgbWFqLCBtaW47Ci0JY2hhciAqbXNnOwotCWNoYXIgKmxhbmc7Ci0KLQltYWo9cGFja2V0X2dldF9pbnQoKTsKLQltaW49cGFja2V0X2dldF9pbnQoKTsKLQltc2c9cGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JbGFuZz1wYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQotCXBhY2tldF9jaGVja19lb20oKTsKLQotCWRlYnVnKCJTZXJ2ZXIgR1NTQVBJIEVycm9yOlxuJXMiLCBtc2cpOwotCXhmcmVlKG1zZyk7Ci0JeGZyZWUobGFuZyk7Ci19Ci0jZW5kaWYgLyogR1NTQVBJICovCi0KLWludAotdXNlcmF1dGhfbm9uZShBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0JLyogaW5pdGlhbCB1c2VyYXV0aCByZXF1ZXN0ICovCi0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpOwotCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmVyX3VzZXIpOwotCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmljZSk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKGF1dGhjdHh0LT5tZXRob2QtPm5hbWUpOwotCXBhY2tldF9zZW5kKCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLWludAotdXNlcmF1dGhfcGFzc3dkKEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlzdGF0aWMgaW50IGF0dGVtcHQgPSAwOwotCWNoYXIgcHJvbXB0WzE1MF07Ci0JY2hhciAqcGFzc3dvcmQ7Ci0JY29uc3QgY2hhciAqaG9zdCA9IG9wdGlvbnMuaG9zdF9rZXlfYWxpYXMgPyAgb3B0aW9ucy5ob3N0X2tleV9hbGlhcyA6Ci0JICAgIGF1dGhjdHh0LT5ob3N0OwotCi0JaWYgKGF0dGVtcHQrKyA+PSBvcHRpb25zLm51bWJlcl9vZl9wYXNzd29yZF9wcm9tcHRzKQotCQlyZXR1cm4gMDsKLQotCWlmIChhdHRlbXB0ICE9IDEpCi0JCWVycm9yKCJQZXJtaXNzaW9uIGRlbmllZCwgcGxlYXNlIHRyeSBhZ2Fpbi4iKTsKLQotCXNucHJpbnRmKHByb21wdCwgc2l6ZW9mKHByb21wdCksICIlLjMwc0AlLjEyOHMncyBwYXNzd29yZDogIiwKLQkgICAgYXV0aGN0eHQtPnNlcnZlcl91c2VyLCBob3N0KTsKLQlwYXNzd29yZCA9IHJlYWRfcGFzc3BocmFzZShwcm9tcHQsIDApOwotCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKLQlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZlcl91c2VyKTsKLQlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPnNlcnZpY2UpOwotCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+bWV0aG9kLT5uYW1lKTsKLQlwYWNrZXRfcHV0X2NoYXIoMCk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKHBhc3N3b3JkKTsKLQltZW1zZXQocGFzc3dvcmQsIDAsIHN0cmxlbihwYXNzd29yZCkpOwotCXhmcmVlKHBhc3N3b3JkKTsKLQlwYWNrZXRfYWRkX3BhZGRpbmcoNjQpOwotCXBhY2tldF9zZW5kKCk7Ci0KLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfUEFTU1dEX0NIQU5HRVJFUSwKLQkgICAgJmlucHV0X3VzZXJhdXRoX3Bhc3N3ZF9jaGFuZ2VyZXEpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBwYXJzZSBQQVNTV0RfQ0hBTkdFUkVRLCBwcm9tcHQgdXNlciBhbmQgc2VuZCBTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUCi0gKi8KLS8qIEFSR1NVU0VEICovCi12b2lkCi1pbnB1dF91c2VyYXV0aF9wYXNzd2RfY2hhbmdlcmVxKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxbnIsIHZvaWQgKmN0eHQpCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKLQljaGFyICppbmZvLCAqbGFuZywgKnBhc3N3b3JkID0gTlVMTCwgKnJldHlwZSA9IE5VTEw7Ci0JY2hhciBwcm9tcHRbMTUwXTsKLQljb25zdCBjaGFyICpob3N0ID0gb3B0aW9ucy5ob3N0X2tleV9hbGlhcyA/IG9wdGlvbnMuaG9zdF9rZXlfYWxpYXMgOgotCSAgICBhdXRoY3R4dC0+aG9zdDsKLQotCWRlYnVnMigiaW5wdXRfdXNlcmF1dGhfcGFzc3dkX2NoYW5nZXJlcSIpOwotCi0JaWYgKGF1dGhjdHh0ID09IE5VTEwpCi0JCWZhdGFsKCJpbnB1dF91c2VyYXV0aF9wYXNzd2RfY2hhbmdlcmVxOiAiCi0JCSAgICAibm8gYXV0aGVudGljYXRpb24gY29udGV4dCIpOwotCi0JaW5mbyA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOwotCWxhbmcgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQlpZiAoc3RybGVuKGluZm8pID4gMCkKLQkJbG9naXQoIiVzIiwgaW5mbyk7Ci0JeGZyZWUoaW5mbyk7Ci0JeGZyZWUobGFuZyk7Ci0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpOwotCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmVyX3VzZXIpOwotCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmljZSk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKGF1dGhjdHh0LT5tZXRob2QtPm5hbWUpOwotCXBhY2tldF9wdXRfY2hhcigxKTsJCQkvKiBhZGRpdGlvbmFsIGluZm8gKi8KLQlzbnByaW50Zihwcm9tcHQsIHNpemVvZihwcm9tcHQpLAotCSAgICAiRW50ZXIgJS4zMHNAJS4xMjhzJ3Mgb2xkIHBhc3N3b3JkOiAiLAotCSAgICBhdXRoY3R4dC0+c2VydmVyX3VzZXIsIGhvc3QpOwotCXBhc3N3b3JkID0gcmVhZF9wYXNzcGhyYXNlKHByb21wdCwgMCk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKHBhc3N3b3JkKTsKLQltZW1zZXQocGFzc3dvcmQsIDAsIHN0cmxlbihwYXNzd29yZCkpOwotCXhmcmVlKHBhc3N3b3JkKTsKLQlwYXNzd29yZCA9IE5VTEw7Ci0Jd2hpbGUgKHBhc3N3b3JkID09IE5VTEwpIHsKLQkJc25wcmludGYocHJvbXB0LCBzaXplb2YocHJvbXB0KSwKLQkJICAgICJFbnRlciAlLjMwc0AlLjEyOHMncyBuZXcgcGFzc3dvcmQ6ICIsCi0JCSAgICBhdXRoY3R4dC0+c2VydmVyX3VzZXIsIGhvc3QpOwotCQlwYXNzd29yZCA9IHJlYWRfcGFzc3BocmFzZShwcm9tcHQsIFJQX0FMTE9XX0VPRik7Ci0JCWlmIChwYXNzd29yZCA9PSBOVUxMKSB7Ci0JCQkvKiBiYWlsIG91dCAqLwotCQkJcmV0dXJuOwotCQl9Ci0JCXNucHJpbnRmKHByb21wdCwgc2l6ZW9mKHByb21wdCksCi0JCSAgICAiUmV0eXBlICUuMzBzQCUuMTI4cydzIG5ldyBwYXNzd29yZDogIiwKLQkJICAgIGF1dGhjdHh0LT5zZXJ2ZXJfdXNlciwgaG9zdCk7Ci0JCXJldHlwZSA9IHJlYWRfcGFzc3BocmFzZShwcm9tcHQsIDApOwotCQlpZiAoc3RyY21wKHBhc3N3b3JkLCByZXR5cGUpICE9IDApIHsKLQkJCW1lbXNldChwYXNzd29yZCwgMCwgc3RybGVuKHBhc3N3b3JkKSk7Ci0JCQl4ZnJlZShwYXNzd29yZCk7Ci0JCQlsb2dpdCgiTWlzbWF0Y2g7IHRyeSBhZ2FpbiwgRU9GIHRvIHF1aXQuIik7Ci0JCQlwYXNzd29yZCA9IE5VTEw7Ci0JCX0KLQkJbWVtc2V0KHJldHlwZSwgMCwgc3RybGVuKHJldHlwZSkpOwotCQl4ZnJlZShyZXR5cGUpOwotCX0KLQlwYWNrZXRfcHV0X2NzdHJpbmcocGFzc3dvcmQpOwotCW1lbXNldChwYXNzd29yZCwgMCwgc3RybGVuKHBhc3N3b3JkKSk7Ci0JeGZyZWUocGFzc3dvcmQpOwotCXBhY2tldF9hZGRfcGFkZGluZyg2NCk7Ci0JcGFja2V0X3NlbmQoKTsKLQotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9QQVNTV0RfQ0hBTkdFUkVRLAotCSAgICAmaW5wdXRfdXNlcmF1dGhfcGFzc3dkX2NoYW5nZXJlcSk7Ci19Ci0KLSNpZmRlZiBKUEFLRQotc3RhdGljIGNoYXIgKgotcHdfZW5jcnlwdChjb25zdCBjaGFyICpwYXNzd29yZCwgY29uc3QgY2hhciAqY3J5cHRfc2NoZW1lLCBjb25zdCBjaGFyICpzYWx0KQotewotCS8qIE9wZW5CU0QgY3J5cHQoMykgaGFuZGxlcyBhbGwgb2YgdGhlc2UgKi8KLQlpZiAoc3RyY21wKGNyeXB0X3NjaGVtZSwgImNyeXB0IikgPT0gMCB8fAotCSAgICBzdHJjbXAoY3J5cHRfc2NoZW1lLCAiYmNyeXB0IikgPT0gMCB8fAotCSAgICBzdHJjbXAoY3J5cHRfc2NoZW1lLCAibWQ1Y3J5cHQiKSA9PSAwIHx8Ci0JICAgIHN0cmNtcChjcnlwdF9zY2hlbWUsICJjcnlwdC1leHRlbmRlZCIpID09IDApCi0JCXJldHVybiB4c3RyZHVwKGNyeXB0KHBhc3N3b3JkLCBzYWx0KSk7Ci0JZXJyb3IoIiVzOiB1bnN1cHBvcnRlZCBwYXNzd29yZCBlbmNyeXB0aW9uIHNjaGVtZSBcIiUuMTAwc1wiIiwKLQkgICAgX19mdW5jX18sIGNyeXB0X3NjaGVtZSk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBCSUdOVU0gKgotanBha2VfcGFzc3dvcmRfdG9fc2VjcmV0KEF1dGhjdHh0ICphdXRoY3R4dCwgY29uc3QgY2hhciAqY3J5cHRfc2NoZW1lLAotICAgIGNvbnN0IGNoYXIgKnNhbHQpCi17Ci0JY2hhciBwcm9tcHRbMjU2XSwgKnBhc3N3b3JkLCAqY3J5cHRlZDsKLQl1X2NoYXIgKnNlY3JldDsKLQl1X2ludCBzZWNyZXRfbGVuOwotCUJJR05VTSAqcmV0OwotCi0Jc25wcmludGYocHJvbXB0LCBzaXplb2YocHJvbXB0KSwgIiUuMzBzQCUuMTI4cydzIHBhc3N3b3JkIChKUEFLRSk6ICIsCi0JICAgIGF1dGhjdHh0LT5zZXJ2ZXJfdXNlciwgYXV0aGN0eHQtPmhvc3QpOwotCXBhc3N3b3JkID0gcmVhZF9wYXNzcGhyYXNlKHByb21wdCwgMCk7Ci0KLQlpZiAoKGNyeXB0ZWQgPSBwd19lbmNyeXB0KHBhc3N3b3JkLCBjcnlwdF9zY2hlbWUsIHNhbHQpKSA9PSBOVUxMKSB7Ci0JCWxvZ2l0KCJEaXNhYmxpbmcgJXMgYXV0aGVudGljYXRpb24iLCBhdXRoY3R4dC0+bWV0aG9kLT5uYW1lKTsKLQkJYXV0aGN0eHQtPm1ldGhvZC0+ZW5hYmxlZCA9IE5VTEw7Ci0JCS8qIENvbnRpbnVlIHdpdGggYW4gZW1wdHkgcGFzc3dvcmQgdG8gZmFpbCBncmFjZWZ1bGx5ICovCi0JCWNyeXB0ZWQgPSB4c3RyZHVwKCIiKTsKLQl9Ci0KLSNpZmRlZiBKUEFLRV9ERUJVRwotCWRlYnVnMygiJXM6IHNhbHQgPSAlcyIsIF9fZnVuY19fLCBzYWx0KTsKLQlkZWJ1ZzMoIiVzOiBzY2hlbWUgPSAlcyIsIF9fZnVuY19fLCBjcnlwdF9zY2hlbWUpOwotCWRlYnVnMygiJXM6IGNyeXB0ZWQgPSAlcyIsIF9fZnVuY19fLCBjcnlwdGVkKTsKLSNlbmRpZgotCi0JaWYgKGhhc2hfYnVmZmVyKGNyeXB0ZWQsIHN0cmxlbihjcnlwdGVkKSwgRVZQX3NoYTI1NigpLAotCSAgICAmc2VjcmV0LCAmc2VjcmV0X2xlbikgIT0gMCkKLQkJZmF0YWwoIiVzOiBoYXNoX2J1ZmZlciIsIF9fZnVuY19fKTsKLQotCWJ6ZXJvKHBhc3N3b3JkLCBzdHJsZW4ocGFzc3dvcmQpKTsKLQliemVybyhjcnlwdGVkLCBzdHJsZW4oY3J5cHRlZCkpOwotCXhmcmVlKHBhc3N3b3JkKTsKLQl4ZnJlZShjcnlwdGVkKTsKLQotCWlmICgocmV0ID0gQk5fYmluMmJuKHNlY3JldCwgc2VjcmV0X2xlbiwgTlVMTCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fYmluMmJuIChzZWNyZXQpIiwgX19mdW5jX18pOwotCWJ6ZXJvKHNlY3JldCwgc2VjcmV0X2xlbik7Ci0JeGZyZWUoc2VjcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi12b2lkCi1pbnB1dF91c2VyYXV0aF9qcGFrZV9zZXJ2ZXJfc3RlcDEoaW50IHR5cGUsIHVfaW50MzJfdCBzZXEsIHZvaWQgKmN0eHQpCi17Ci0JQXV0aGN0eHQgKmF1dGhjdHh0ID0gY3R4dDsKLQlzdHJ1Y3QganBha2VfY3R4ICpwY3R4ID0gYXV0aGN0eHQtPm1ldGhvZGRhdGE7Ci0JdV9jaGFyICp4M19wcm9vZiwgKng0X3Byb29mLCAqeDJfc19wcm9vZjsKLQl1X2ludCB4M19wcm9vZl9sZW4sIHg0X3Byb29mX2xlbiwgeDJfc19wcm9vZl9sZW47Ci0JY2hhciAqY3J5cHRfc2NoZW1lLCAqc2FsdDsKLQotCS8qIERpc2FibGUgdGhpcyBtZXNzYWdlICovCi0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX1NFUlZFUl9TVEVQMSwgTlVMTCk7Ci0KLQlpZiAoKHBjdHgtPmdfeDMgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAotCSAgICAocGN0eC0+Z194NCA9IEJOX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiJXM6IEJOX25ldyIsIF9fZnVuY19fKTsKLQotCS8qIEZldGNoIHN0ZXAgMSB2YWx1ZXMgKi8KLQljcnlwdF9zY2hlbWUgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQlzYWx0ID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JcGN0eC0+c2VydmVyX2lkID0gcGFja2V0X2dldF9zdHJpbmcoJnBjdHgtPnNlcnZlcl9pZF9sZW4pOwotCXBhY2tldF9nZXRfYmlnbnVtMihwY3R4LT5nX3gzKTsKLQlwYWNrZXRfZ2V0X2JpZ251bTIocGN0eC0+Z194NCk7Ci0JeDNfcHJvb2YgPSBwYWNrZXRfZ2V0X3N0cmluZygmeDNfcHJvb2ZfbGVuKTsKLQl4NF9wcm9vZiA9IHBhY2tldF9nZXRfc3RyaW5nKCZ4NF9wcm9vZl9sZW4pOwotCXBhY2tldF9jaGVja19lb20oKTsKLQotCUpQQUtFX0RFQlVHX0NUWCgocGN0eCwgInN0ZXAgMSByZWNlaXZlZCBpbiAlcyIsIF9fZnVuY19fKSk7Ci0KLQkvKiBPYnRhaW4gcGFzc3dvcmQgYW5kIGRlcml2ZSBzZWNyZXQgKi8KLQlwY3R4LT5zID0ganBha2VfcGFzc3dvcmRfdG9fc2VjcmV0KGF1dGhjdHh0LCBjcnlwdF9zY2hlbWUsIHNhbHQpOwotCWJ6ZXJvKGNyeXB0X3NjaGVtZSwgc3RybGVuKGNyeXB0X3NjaGVtZSkpOwotCWJ6ZXJvKHNhbHQsIHN0cmxlbihzYWx0KSk7Ci0JeGZyZWUoY3J5cHRfc2NoZW1lKTsKLQl4ZnJlZShzYWx0KTsKLQlKUEFLRV9ERUJVR19CTigocGN0eC0+cywgIiVzOiBzID0gIiwgX19mdW5jX18pKTsKLQotCS8qIENhbGN1bGF0ZSBzdGVwIDIgdmFsdWVzICovCi0JanBha2Vfc3RlcDIocGN0eC0+Z3JwLCBwY3R4LT5zLCBwY3R4LT5nX3gxLAotCSAgICBwY3R4LT5nX3gzLCBwY3R4LT5nX3g0LCBwY3R4LT54MiwKLQkgICAgcGN0eC0+c2VydmVyX2lkLCBwY3R4LT5zZXJ2ZXJfaWRfbGVuLAotCSAgICBwY3R4LT5jbGllbnRfaWQsIHBjdHgtPmNsaWVudF9pZF9sZW4sCi0JICAgIHgzX3Byb29mLCB4M19wcm9vZl9sZW4sCi0JICAgIHg0X3Byb29mLCB4NF9wcm9vZl9sZW4sCi0JICAgICZwY3R4LT5hLAotCSAgICAmeDJfc19wcm9vZiwgJngyX3NfcHJvb2ZfbGVuKTsKLQotCWJ6ZXJvKHgzX3Byb29mLCB4M19wcm9vZl9sZW4pOwotCWJ6ZXJvKHg0X3Byb29mLCB4NF9wcm9vZl9sZW4pOwotCXhmcmVlKHgzX3Byb29mKTsKLQl4ZnJlZSh4NF9wcm9vZik7Ci0KLQlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJzdGVwIDIgc2VuZGluZyBpbiAlcyIsIF9fZnVuY19fKSk7Ci0KLQkvKiBTZW5kIHZhbHVlcyBmb3Igc3RlcCAyICovCi0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX0NMSUVOVF9TVEVQMik7Ci0JcGFja2V0X3B1dF9iaWdudW0yKHBjdHgtPmEpOwotCXBhY2tldF9wdXRfc3RyaW5nKHgyX3NfcHJvb2YsIHgyX3NfcHJvb2ZfbGVuKTsKLQlwYWNrZXRfc2VuZCgpOwotCi0JYnplcm8oeDJfc19wcm9vZiwgeDJfc19wcm9vZl9sZW4pOwotCXhmcmVlKHgyX3NfcHJvb2YpOwotCi0JLyogRXhwZWN0IHN0ZXAgMiBwYWNrZXQgZnJvbSBwZWVyICovCi0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX1NFUlZFUl9TVEVQMiwKLQkgICAgaW5wdXRfdXNlcmF1dGhfanBha2Vfc2VydmVyX3N0ZXAyKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQKLWlucHV0X3VzZXJhdXRoX2pwYWtlX3NlcnZlcl9zdGVwMihpbnQgdHlwZSwgdV9pbnQzMl90IHNlcSwgdm9pZCAqY3R4dCkKLXsKLQlBdXRoY3R4dCAqYXV0aGN0eHQgPSBjdHh0OwotCXN0cnVjdCBqcGFrZV9jdHggKnBjdHggPSBhdXRoY3R4dC0+bWV0aG9kZGF0YTsKLQl1X2NoYXIgKng0X3NfcHJvb2Y7Ci0JdV9pbnQgeDRfc19wcm9vZl9sZW47Ci0KLQkvKiBEaXNhYmxlIHRoaXMgbWVzc2FnZSAqLwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9TRVJWRVJfU1RFUDIsIE5VTEwpOwotCi0JaWYgKChwY3R4LT5iID0gQk5fbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCIlczogQk5fbmV3IiwgX19mdW5jX18pOwotCi0JLyogRmV0Y2ggc3RlcCAyIHZhbHVlcyAqLwotCXBhY2tldF9nZXRfYmlnbnVtMihwY3R4LT5iKTsKLQl4NF9zX3Byb29mID0gcGFja2V0X2dldF9zdHJpbmcoJng0X3NfcHJvb2ZfbGVuKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJzdGVwIDIgcmVjZWl2ZWQgaW4gJXMiLCBfX2Z1bmNfXykpOwotCi0JLyogRGVyaXZlIHNoYXJlZCBrZXkgYW5kIGNhbGN1bGF0ZSBjb25maXJtYXRpb24gaGFzaCAqLwotCWpwYWtlX2tleV9jb25maXJtKHBjdHgtPmdycCwgcGN0eC0+cywgcGN0eC0+YiwKLQkgICAgcGN0eC0+eDIsIHBjdHgtPmdfeDEsIHBjdHgtPmdfeDIsIHBjdHgtPmdfeDMsIHBjdHgtPmdfeDQsCi0JICAgIHBjdHgtPmNsaWVudF9pZCwgcGN0eC0+Y2xpZW50X2lkX2xlbiwKLQkgICAgcGN0eC0+c2VydmVyX2lkLCBwY3R4LT5zZXJ2ZXJfaWRfbGVuLAotCSAgICBzZXNzaW9uX2lkMiwgc2Vzc2lvbl9pZDJfbGVuLAotCSAgICB4NF9zX3Byb29mLCB4NF9zX3Byb29mX2xlbiwKLQkgICAgJnBjdHgtPmssCi0JICAgICZwY3R4LT5oX2tfY2lkX3Nlc3NpZCwgJnBjdHgtPmhfa19jaWRfc2Vzc2lkX2xlbik7Ci0KLQliemVybyh4NF9zX3Byb29mLCB4NF9zX3Byb29mX2xlbik7Ci0JeGZyZWUoeDRfc19wcm9vZik7Ci0KLQlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJjb25maXJtIHNlbmRpbmcgaW4gJXMiLCBfX2Z1bmNfXykpOwotCi0JLyogU2VuZCBrZXkgY29uZmlybWF0aW9uIHByb29mICovCi0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX0pQQUtFX0NMSUVOVF9DT05GSVJNKTsKLQlwYWNrZXRfcHV0X3N0cmluZyhwY3R4LT5oX2tfY2lkX3Nlc3NpZCwgcGN0eC0+aF9rX2NpZF9zZXNzaWRfbGVuKTsKLQlwYWNrZXRfc2VuZCgpOwotCi0JLyogRXhwZWN0IGNvbmZpcm1hdGlvbiBmcm9tIHBlZXIgKi8KLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfU0VSVkVSX0NPTkZJUk0sCi0JICAgIGlucHV0X3VzZXJhdXRoX2pwYWtlX3NlcnZlcl9jb25maXJtKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQKLWlucHV0X3VzZXJhdXRoX2pwYWtlX3NlcnZlcl9jb25maXJtKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQotewotCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7Ci0Jc3RydWN0IGpwYWtlX2N0eCAqcGN0eCA9IGF1dGhjdHh0LT5tZXRob2RkYXRhOwotCi0JLyogRGlzYWJsZSB0aGlzIG1lc3NhZ2UgKi8KLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfSlBBS0VfU0VSVkVSX0NPTkZJUk0sIE5VTEwpOwotCi0JcGN0eC0+aF9rX3NpZF9zZXNzaWQgPSBwYWNrZXRfZ2V0X3N0cmluZygmcGN0eC0+aF9rX3NpZF9zZXNzaWRfbGVuKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQlKUEFLRV9ERUJVR19DVFgoKHBjdHgsICJjb25maXJtIHJlY2VpdmVkIGluICVzIiwgX19mdW5jX18pKTsKLQotCS8qIFZlcmlmeSBleHBlY3RlZCBjb25maXJtYXRpb24gaGFzaCAqLwotCWlmIChqcGFrZV9jaGVja19jb25maXJtKHBjdHgtPmssCi0JICAgIHBjdHgtPnNlcnZlcl9pZCwgcGN0eC0+c2VydmVyX2lkX2xlbiwKLQkgICAgc2Vzc2lvbl9pZDIsIHNlc3Npb25faWQyX2xlbiwKLQkgICAgcGN0eC0+aF9rX3NpZF9zZXNzaWQsIHBjdHgtPmhfa19zaWRfc2Vzc2lkX2xlbikgPT0gMSkKLQkJZGVidWcoIiVzOiAlcyBzdWNjZXNzIiwgX19mdW5jX18sIGF1dGhjdHh0LT5tZXRob2QtPm5hbWUpOwotCWVsc2UgewotCQlkZWJ1ZygiJXM6IGNvbmZpcm1hdGlvbiBtaXNtYXRjaCIsIF9fZnVuY19fKTsKLQkJLyogWFhYIHN0YXNoIHRoaXMgc28gaWYgYXV0aCBzdWNjZWVkcyB0aGVuIHdlIGNhbiB3YXJuL2tpbGwgKi8KLQl9Ci0KLQl1c2VyYXV0aF9qcGFrZV9jbGVhbnVwKGF1dGhjdHh0KTsKLX0KLSNlbmRpZiAvKiBKUEFLRSAqLwotCi1zdGF0aWMgaW50Ci1pZGVudGl0eV9zaWduKElkZW50aXR5ICppZCwgdV9jaGFyICoqc2lncCwgdV9pbnQgKmxlbnAsCi0gICAgdV9jaGFyICpkYXRhLCB1X2ludCBkYXRhbGVuKQotewotCUtleSAqcHJ2OwotCWludCByZXQ7Ci0KLQkvKiB0aGUgYWdlbnQgc3VwcG9ydHMgdGhpcyBrZXkgKi8KLQlpZiAoaWQtPmFjKQotCQlyZXR1cm4gKHNzaF9hZ2VudF9zaWduKGlkLT5hYywgaWQtPmtleSwgc2lncCwgbGVucCwKLQkJICAgIGRhdGEsIGRhdGFsZW4pKTsKLQkvKgotCSAqIHdlIGhhdmUgYWxyZWFkeSBsb2FkZWQgdGhlIHByaXZhdGUga2V5IG9yCi0JICogdGhlIHByaXZhdGUga2V5IGlzIHN0b3JlZCBpbiBleHRlcm5hbCBoYXJkd2FyZQotCSAqLwotCWlmIChpZC0+aXNwcml2YXRlIHx8IChpZC0+a2V5LT5mbGFncyAmIEtFWV9GTEFHX0VYVCkpCi0JCXJldHVybiAoa2V5X3NpZ24oaWQtPmtleSwgc2lncCwgbGVucCwgZGF0YSwgZGF0YWxlbikpOwotCS8qIGxvYWQgdGhlIHByaXZhdGUga2V5IGZyb20gdGhlIGZpbGUgKi8KLQlpZiAoKHBydiA9IGxvYWRfaWRlbnRpdHlfZmlsZShpZC0+ZmlsZW5hbWUpKSA9PSBOVUxMKQotCQlyZXR1cm4gKC0xKTsKLQlyZXQgPSBrZXlfc2lnbihwcnYsIHNpZ3AsIGxlbnAsIGRhdGEsIGRhdGFsZW4pOwotCWtleV9mcmVlKHBydik7Ci0JcmV0dXJuIChyZXQpOwotfQotCi1zdGF0aWMgaW50Ci1zaWduX2FuZF9zZW5kX3B1YmtleShBdXRoY3R4dCAqYXV0aGN0eHQsIElkZW50aXR5ICppZCkKLXsKLQlCdWZmZXIgYjsKLQl1X2NoYXIgKmJsb2IsICpzaWduYXR1cmU7Ci0JdV9pbnQgYmxvYmxlbiwgc2xlbjsKLQl1X2ludCBza2lwID0gMDsKLQlpbnQgcmV0ID0gLTE7Ci0JaW50IGhhdmVfc2lnID0gMTsKLQljaGFyICpmcDsKLQotCWZwID0ga2V5X2ZpbmdlcnByaW50KGlkLT5rZXksIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOwotCWRlYnVnMygic2lnbl9hbmRfc2VuZF9wdWJrZXk6ICVzICVzIiwga2V5X3R5cGUoaWQtPmtleSksIGZwKTsKLQl4ZnJlZShmcCk7Ci0KLQlpZiAoa2V5X3RvX2Jsb2IoaWQtPmtleSwgJmJsb2IsICZibG9ibGVuKSA9PSAwKSB7Ci0JCS8qIHdlIGNhbm5vdCBoYW5kbGUgdGhpcyBrZXkgKi8KLQkJZGVidWczKCJzaWduX2FuZF9zZW5kX3B1YmtleTogY2Fubm90IGhhbmRsZSBrZXkiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIGRhdGEgdG8gYmUgc2lnbmVkICovCi0JYnVmZmVyX2luaXQoJmIpOwotCWlmIChkYXRhZmVsbG93cyAmIFNTSF9PTERfU0VTU0lPTklEKSB7Ci0JCWJ1ZmZlcl9hcHBlbmQoJmIsIHNlc3Npb25faWQyLCBzZXNzaW9uX2lkMl9sZW4pOwotCQlza2lwID0gc2Vzc2lvbl9pZDJfbGVuOwotCX0gZWxzZSB7Ci0JCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBzZXNzaW9uX2lkMiwgc2Vzc2lvbl9pZDJfbGVuKTsKLQkJc2tpcCA9IGJ1ZmZlcl9sZW4oJmIpOwotCX0KLQlidWZmZXJfcHV0X2NoYXIoJmIsIFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgYXV0aGN0eHQtPnNlcnZlcl91c2VyKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsCi0JICAgIGRhdGFmZWxsb3dzICYgU1NIX0JVR19QS1NFUlZJQ0UgPwotCSAgICAic3NoLXVzZXJhdXRoIiA6Ci0JICAgIGF1dGhjdHh0LT5zZXJ2aWNlKTsKLQlpZiAoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1BLQVVUSCkgewotCQlidWZmZXJfcHV0X2NoYXIoJmIsIGhhdmVfc2lnKTsKLQl9IGVsc2UgewotCQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGF1dGhjdHh0LT5tZXRob2QtPm5hbWUpOwotCQlidWZmZXJfcHV0X2NoYXIoJmIsIGhhdmVfc2lnKTsKLQkJYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBrZXlfc3NoX25hbWUoaWQtPmtleSkpOwotCX0KLQlidWZmZXJfcHV0X3N0cmluZygmYiwgYmxvYiwgYmxvYmxlbik7Ci0KLQkvKiBnZW5lcmF0ZSBzaWduYXR1cmUgKi8KLQlyZXQgPSBpZGVudGl0eV9zaWduKGlkLCAmc2lnbmF0dXJlLCAmc2xlbiwKLQkgICAgYnVmZmVyX3B0cigmYiksIGJ1ZmZlcl9sZW4oJmIpKTsKLQlpZiAocmV0ID09IC0xKSB7Ci0JCXhmcmVlKGJsb2IpOwotCQlidWZmZXJfZnJlZSgmYik7Ci0JCXJldHVybiAwOwotCX0KLSNpZmRlZiBERUJVR19QSwotCWJ1ZmZlcl9kdW1wKCZiKTsKLSNlbmRpZgotCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfUEtTRVJWSUNFKSB7Ci0JCWJ1ZmZlcl9jbGVhcigmYik7Ci0JCWJ1ZmZlcl9hcHBlbmQoJmIsIHNlc3Npb25faWQyLCBzZXNzaW9uX2lkMl9sZW4pOwotCQlza2lwID0gc2Vzc2lvbl9pZDJfbGVuOwotCQlidWZmZXJfcHV0X2NoYXIoJmIsIFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpOwotCQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGF1dGhjdHh0LT5zZXJ2ZXJfdXNlcik7Ci0JCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgYXV0aGN0eHQtPnNlcnZpY2UpOwotCQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGF1dGhjdHh0LT5tZXRob2QtPm5hbWUpOwotCQlidWZmZXJfcHV0X2NoYXIoJmIsIGhhdmVfc2lnKTsKLQkJaWYgKCEoZGF0YWZlbGxvd3MgJiBTU0hfQlVHX1BLQVVUSCkpCi0JCQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGtleV9zc2hfbmFtZShpZC0+a2V5KSk7Ci0JCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBibG9iLCBibG9ibGVuKTsKLQl9Ci0JeGZyZWUoYmxvYik7Ci0KLQkvKiBhcHBlbmQgc2lnbmF0dXJlICovCi0JYnVmZmVyX3B1dF9zdHJpbmcoJmIsIHNpZ25hdHVyZSwgc2xlbik7Ci0JeGZyZWUoc2lnbmF0dXJlKTsKLQotCS8qIHNraXAgc2Vzc2lvbiBpZCBhbmQgcGFja2V0IHR5cGUgKi8KLQlpZiAoYnVmZmVyX2xlbigmYikgPCBza2lwICsgMSkKLQkJZmF0YWwoInVzZXJhdXRoX3B1YmtleTogaW50ZXJuYWwgZXJyb3IiKTsKLQlidWZmZXJfY29uc3VtZSgmYiwgc2tpcCArIDEpOwotCi0JLyogcHV0IHJlbWFpbmluZyBkYXRhIGZyb20gYnVmZmVyIGludG8gcGFja2V0ICovCi0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpOwotCXBhY2tldF9wdXRfcmF3KGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7Ci0JYnVmZmVyX2ZyZWUoJmIpOwotCXBhY2tldF9zZW5kKCk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotc2VuZF9wdWJrZXlfdGVzdChBdXRoY3R4dCAqYXV0aGN0eHQsIElkZW50aXR5ICppZCkKLXsKLQl1X2NoYXIgKmJsb2I7Ci0JdV9pbnQgYmxvYmxlbiwgaGF2ZV9zaWcgPSAwOwotCi0JZGVidWczKCJzZW5kX3B1YmtleV90ZXN0Iik7Ci0KLQlpZiAoa2V5X3RvX2Jsb2IoaWQtPmtleSwgJmJsb2IsICZibG9ibGVuKSA9PSAwKSB7Ci0JCS8qIHdlIGNhbm5vdCBoYW5kbGUgdGhpcyBrZXkgKi8KLQkJZGVidWczKCJzZW5kX3B1YmtleV90ZXN0OiBjYW5ub3QgaGFuZGxlIGtleSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogcmVnaXN0ZXIgY2FsbGJhY2sgZm9yIFVTRVJBVVRIX1BLX09LIG1lc3NhZ2UgKi8KLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfUEtfT0ssICZpbnB1dF91c2VyYXV0aF9wa19vayk7Ci0KLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfUkVRVUVTVCk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKGF1dGhjdHh0LT5zZXJ2ZXJfdXNlcik7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKGF1dGhjdHh0LT5zZXJ2aWNlKTsKLQlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPm1ldGhvZC0+bmFtZSk7Ci0JcGFja2V0X3B1dF9jaGFyKGhhdmVfc2lnKTsKLQlpZiAoIShkYXRhZmVsbG93cyAmIFNTSF9CVUdfUEtBVVRIKSkKLQkJcGFja2V0X3B1dF9jc3RyaW5nKGtleV9zc2hfbmFtZShpZC0+a2V5KSk7Ci0JcGFja2V0X3B1dF9zdHJpbmcoYmxvYiwgYmxvYmxlbik7Ci0JeGZyZWUoYmxvYik7Ci0JcGFja2V0X3NlbmQoKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIEtleSAqCi1sb2FkX2lkZW50aXR5X2ZpbGUoY2hhciAqZmlsZW5hbWUpCi17Ci0JS2V5ICpwcml2YXRlOwotCWNoYXIgcHJvbXB0WzMwMF0sICpwYXNzcGhyYXNlOwotCWludCBwZXJtX29rID0gMCwgcXVpdCwgaTsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQotCWlmIChzdGF0KGZpbGVuYW1lLCAmc3QpIDwgMCkgewotCQlkZWJ1ZzMoIm5vIHN1Y2ggaWRlbnRpdHk6ICVzIiwgZmlsZW5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcHJpdmF0ZSA9IGtleV9sb2FkX3ByaXZhdGVfdHlwZShLRVlfVU5TUEVDLCBmaWxlbmFtZSwgIiIsIE5VTEwsICZwZXJtX29rKTsKLQlpZiAoIXBlcm1fb2spCi0JCXJldHVybiBOVUxMOwotCWlmIChwcml2YXRlID09IE5VTEwpIHsKLQkJaWYgKG9wdGlvbnMuYmF0Y2hfbW9kZSkKLQkJCXJldHVybiBOVUxMOwotCQlzbnByaW50Zihwcm9tcHQsIHNpemVvZiBwcm9tcHQsCi0JCSAgICAiRW50ZXIgcGFzc3BocmFzZSBmb3Iga2V5ICclLjEwMHMnOiAiLCBmaWxlbmFtZSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bWJlcl9vZl9wYXNzd29yZF9wcm9tcHRzOyBpKyspIHsKLQkJCXBhc3NwaHJhc2UgPSByZWFkX3Bhc3NwaHJhc2UocHJvbXB0LCAwKTsKLQkJCWlmIChzdHJjbXAocGFzc3BocmFzZSwgIiIpICE9IDApIHsKLQkJCQlwcml2YXRlID0ga2V5X2xvYWRfcHJpdmF0ZV90eXBlKEtFWV9VTlNQRUMsCi0JCQkJICAgIGZpbGVuYW1lLCBwYXNzcGhyYXNlLCBOVUxMLCBOVUxMKTsKLQkJCQlxdWl0ID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVidWcyKCJubyBwYXNzcGhyYXNlIGdpdmVuLCB0cnkgbmV4dCBrZXkiKTsKLQkJCQlxdWl0ID0gMTsKLQkJCX0KLQkJCW1lbXNldChwYXNzcGhyYXNlLCAwLCBzdHJsZW4ocGFzc3BocmFzZSkpOwotCQkJeGZyZWUocGFzc3BocmFzZSk7Ci0JCQlpZiAocHJpdmF0ZSAhPSBOVUxMIHx8IHF1aXQpCi0JCQkJYnJlYWs7Ci0JCQlkZWJ1ZzIoImJhZCBwYXNzcGhyYXNlIGdpdmVuLCB0cnkgYWdhaW4uLi4iKTsKLQkJfQotCX0KLQlyZXR1cm4gcHJpdmF0ZTsKLX0KLQotLyoKLSAqIHRyeSBrZXlzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0gKgkxLiBhZ2VudCBrZXlzIHRoYXQgYXJlIGZvdW5kIGluIHRoZSBjb25maWcgZmlsZQotICoJMi4gb3RoZXIgYWdlbnQga2V5cwotICoJMy4ga2V5cyB0aGF0IGFyZSBvbmx5IGxpc3RlZCBpbiB0aGUgY29uZmlnIGZpbGUKLSAqLwotc3RhdGljIHZvaWQKLXB1YmtleV9wcmVwYXJlKEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlJZGVudGl0eSAqaWQ7Ci0JSWRsaXN0IGFnZW50LCBmaWxlcywgKnByZWZlcnJlZDsKLQlLZXkgKmtleTsKLQlBdXRoZW50aWNhdGlvbkNvbm5lY3Rpb24gKmFjOwotCWNoYXIgKmNvbW1lbnQ7Ci0JaW50IGksIGZvdW5kOwotCi0JVEFJTFFfSU5JVCgmYWdlbnQpOwkvKiBrZXlzIGZyb20gdGhlIGFnZW50ICovCi0JVEFJTFFfSU5JVCgmZmlsZXMpOwkvKiBrZXlzIGZyb20gdGhlIGNvbmZpZyBmaWxlICovCi0JcHJlZmVycmVkID0gJmF1dGhjdHh0LT5rZXlzOwotCVRBSUxRX0lOSVQocHJlZmVycmVkKTsJLyogcHJlZmVycmVkIG9yZGVyIG9mIGtleXMgKi8KLQotCS8qIGxpc3Qgb2Yga2V5cyBzdG9yZWQgaW4gdGhlIGZpbGVzeXN0ZW0gKi8KLQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1faWRlbnRpdHlfZmlsZXM7IGkrKykgewotCQlrZXkgPSBvcHRpb25zLmlkZW50aXR5X2tleXNbaV07Ci0JCWlmIChrZXkgJiYga2V5LT50eXBlID09IEtFWV9SU0ExKQotCQkJY29udGludWU7Ci0JCWlmIChrZXkgJiYga2V5LT5jZXJ0ICYmIGtleS0+Y2VydC0+dHlwZSAhPSBTU0gyX0NFUlRfVFlQRV9VU0VSKQotCQkJY29udGludWU7Ci0JCW9wdGlvbnMuaWRlbnRpdHlfa2V5c1tpXSA9IE5VTEw7Ci0JCWlkID0geGNhbGxvYygxLCBzaXplb2YoKmlkKSk7Ci0JCWlkLT5rZXkgPSBrZXk7Ci0JCWlkLT5maWxlbmFtZSA9IHhzdHJkdXAob3B0aW9ucy5pZGVudGl0eV9maWxlc1tpXSk7Ci0JCVRBSUxRX0lOU0VSVF9UQUlMKCZmaWxlcywgaWQsIG5leHQpOwotCX0KLQkvKiBsaXN0IG9mIGtleXMgc3VwcG9ydGVkIGJ5IHRoZSBhZ2VudCAqLwotCWlmICgoYWMgPSBzc2hfZ2V0X2F1dGhlbnRpY2F0aW9uX2Nvbm5lY3Rpb24oKSkpIHsKLQkJZm9yIChrZXkgPSBzc2hfZ2V0X2ZpcnN0X2lkZW50aXR5KGFjLCAmY29tbWVudCwgMik7Ci0JCSAgICBrZXkgIT0gTlVMTDsKLQkJICAgIGtleSA9IHNzaF9nZXRfbmV4dF9pZGVudGl0eShhYywgJmNvbW1lbnQsIDIpKSB7Ci0JCQlmb3VuZCA9IDA7Ci0JCQlUQUlMUV9GT1JFQUNIKGlkLCAmZmlsZXMsIG5leHQpIHsKLQkJCQkvKiBhZ2VudCBrZXlzIGZyb20gdGhlIGNvbmZpZyBmaWxlIGFyZSBwcmVmZXJyZWQgKi8KLQkJCQlpZiAoa2V5X2VxdWFsKGtleSwgaWQtPmtleSkpIHsKLQkJCQkJa2V5X2ZyZWUoa2V5KTsKLQkJCQkJeGZyZWUoY29tbWVudCk7Ci0JCQkJCVRBSUxRX1JFTU9WRSgmZmlsZXMsIGlkLCBuZXh0KTsKLQkJCQkJVEFJTFFfSU5TRVJUX1RBSUwocHJlZmVycmVkLCBpZCwgbmV4dCk7Ci0JCQkJCWlkLT5hYyA9IGFjOwotCQkJCQlmb3VuZCA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQgJiYgIW9wdGlvbnMuaWRlbnRpdGllc19vbmx5KSB7Ci0JCQkJaWQgPSB4Y2FsbG9jKDEsIHNpemVvZigqaWQpKTsKLQkJCQlpZC0+a2V5ID0ga2V5OwotCQkJCWlkLT5maWxlbmFtZSA9IGNvbW1lbnQ7Ci0JCQkJaWQtPmFjID0gYWM7Ci0JCQkJVEFJTFFfSU5TRVJUX1RBSUwoJmFnZW50LCBpZCwgbmV4dCk7Ci0JCQl9Ci0JCX0KLQkJLyogYXBwZW5kIHJlbWFpbmluZyBhZ2VudCBrZXlzICovCi0JCWZvciAoaWQgPSBUQUlMUV9GSVJTVCgmYWdlbnQpOyBpZDsgaWQgPSBUQUlMUV9GSVJTVCgmYWdlbnQpKSB7Ci0JCQlUQUlMUV9SRU1PVkUoJmFnZW50LCBpZCwgbmV4dCk7Ci0JCQlUQUlMUV9JTlNFUlRfVEFJTChwcmVmZXJyZWQsIGlkLCBuZXh0KTsKLQkJfQotCQlhdXRoY3R4dC0+YWdlbnQgPSBhYzsKLQl9Ci0JLyogYXBwZW5kIHJlbWFpbmluZyBrZXlzIGZyb20gdGhlIGNvbmZpZyBmaWxlICovCi0JZm9yIChpZCA9IFRBSUxRX0ZJUlNUKCZmaWxlcyk7IGlkOyBpZCA9IFRBSUxRX0ZJUlNUKCZmaWxlcykpIHsKLQkJVEFJTFFfUkVNT1ZFKCZmaWxlcywgaWQsIG5leHQpOwotCQlUQUlMUV9JTlNFUlRfVEFJTChwcmVmZXJyZWQsIGlkLCBuZXh0KTsKLQl9Ci0JVEFJTFFfRk9SRUFDSChpZCwgcHJlZmVycmVkLCBuZXh0KSB7Ci0JCWRlYnVnMigia2V5OiAlcyAoJXApIiwgaWQtPmZpbGVuYW1lLCBpZC0+a2V5KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wdWJrZXlfY2xlYW51cChBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0JSWRlbnRpdHkgKmlkOwotCi0JaWYgKGF1dGhjdHh0LT5hZ2VudCAhPSBOVUxMKQotCQlzc2hfY2xvc2VfYXV0aGVudGljYXRpb25fY29ubmVjdGlvbihhdXRoY3R4dC0+YWdlbnQpOwotCWZvciAoaWQgPSBUQUlMUV9GSVJTVCgmYXV0aGN0eHQtPmtleXMpOyBpZDsKLQkgICAgaWQgPSBUQUlMUV9GSVJTVCgmYXV0aGN0eHQtPmtleXMpKSB7Ci0JCVRBSUxRX1JFTU9WRSgmYXV0aGN0eHQtPmtleXMsIGlkLCBuZXh0KTsKLQkJaWYgKGlkLT5rZXkpCi0JCQlrZXlfZnJlZShpZC0+a2V5KTsKLQkJaWYgKGlkLT5maWxlbmFtZSkKLQkJCXhmcmVlKGlkLT5maWxlbmFtZSk7Ci0JCXhmcmVlKGlkKTsKLQl9Ci19Ci0KLWludAotdXNlcmF1dGhfcHVia2V5KEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlJZGVudGl0eSAqaWQ7Ci0JaW50IHNlbnQgPSAwOwotCi0Jd2hpbGUgKChpZCA9IFRBSUxRX0ZJUlNUKCZhdXRoY3R4dC0+a2V5cykpKSB7Ci0JCWlmIChpZC0+dHJpZWQrKykKLQkJCXJldHVybiAoMCk7Ci0JCS8qIG1vdmUga2V5IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlICovCi0JCVRBSUxRX1JFTU9WRSgmYXV0aGN0eHQtPmtleXMsIGlkLCBuZXh0KTsKLQkJVEFJTFFfSU5TRVJUX1RBSUwoJmF1dGhjdHh0LT5rZXlzLCBpZCwgbmV4dCk7Ci0JCS8qCi0JCSAqIHNlbmQgYSB0ZXN0IG1lc3NhZ2UgaWYgd2UgaGF2ZSB0aGUgcHVibGljIGtleS4gZm9yCi0JCSAqIGVuY3J5cHRlZCBrZXlzIHdlIGNhbm5vdCBkbyB0aGlzIGFuZCBoYXZlIHRvIGxvYWQgdGhlCi0JCSAqIHByaXZhdGUga2V5IGluc3RlYWQKLQkJICovCi0JCWlmIChpZC0+a2V5ICYmIGlkLT5rZXktPnR5cGUgIT0gS0VZX1JTQTEpIHsKLQkJCWRlYnVnKCJPZmZlcmluZyAlcyBwdWJsaWMga2V5OiAlcyIsIGtleV90eXBlKGlkLT5rZXkpLAotCQkJICAgIGlkLT5maWxlbmFtZSk7Ci0JCQlzZW50ID0gc2VuZF9wdWJrZXlfdGVzdChhdXRoY3R4dCwgaWQpOwotCQl9IGVsc2UgaWYgKGlkLT5rZXkgPT0gTlVMTCkgewotCQkJZGVidWcoIlRyeWluZyBwcml2YXRlIGtleTogJXMiLCBpZC0+ZmlsZW5hbWUpOwotCQkJaWQtPmtleSA9IGxvYWRfaWRlbnRpdHlfZmlsZShpZC0+ZmlsZW5hbWUpOwotCQkJaWYgKGlkLT5rZXkgIT0gTlVMTCkgewotCQkJCWlkLT5pc3ByaXZhdGUgPSAxOwotCQkJCXNlbnQgPSBzaWduX2FuZF9zZW5kX3B1YmtleShhdXRoY3R4dCwgaWQpOwotCQkJCWtleV9mcmVlKGlkLT5rZXkpOwotCQkJCWlkLT5rZXkgPSBOVUxMOwotCQkJfQotCQl9Ci0JCWlmIChzZW50KQotCQkJcmV0dXJuIChzZW50KTsKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotLyoKLSAqIFNlbmQgdXNlcmF1dGggcmVxdWVzdCBtZXNzYWdlIHNwZWNpZnlpbmcga2V5Ym9hcmQtaW50ZXJhY3RpdmUgbWV0aG9kLgotICovCi1pbnQKLXVzZXJhdXRoX2tiZGludChBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0Jc3RhdGljIGludCBhdHRlbXB0ID0gMDsKLQotCWlmIChhdHRlbXB0KysgPj0gb3B0aW9ucy5udW1iZXJfb2ZfcGFzc3dvcmRfcHJvbXB0cykKLQkJcmV0dXJuIDA7Ci0JLyogZGlzYWJsZSBpZiBubyBTU0gyX01TR19VU0VSQVVUSF9JTkZPX1JFUVVFU1QgaGFzIGJlZW4gc2VlbiAqLwotCWlmIChhdHRlbXB0ID4gMSAmJiAhYXV0aGN0eHQtPmluZm9fcmVxX3NlZW4pIHsKLQkJZGVidWczKCJ1c2VyYXV0aF9rYmRpbnQ6IGRpc2FibGU6IG5vIGluZm9fcmVxX3NlZW4iKTsKLQkJZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX0lORk9fUkVRVUVTVCwgTlVMTCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWRlYnVnMigidXNlcmF1dGhfa2JkaW50Iik7Ci0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpOwotCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmVyX3VzZXIpOwotCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmljZSk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKGF1dGhjdHh0LT5tZXRob2QtPm5hbWUpOwotCXBhY2tldF9wdXRfY3N0cmluZygiIik7CQkJCQkvKiBsYW5nICovCi0JcGFja2V0X3B1dF9jc3RyaW5nKG9wdGlvbnMua2JkX2ludGVyYWN0aXZlX2RldmljZXMgPwotCSAgICBvcHRpb25zLmtiZF9pbnRlcmFjdGl2ZV9kZXZpY2VzIDogIiIpOwotCXBhY2tldF9zZW5kKCk7Ci0KLQlkaXNwYXRjaF9zZXQoU1NIMl9NU0dfVVNFUkFVVEhfSU5GT19SRVFVRVNULCAmaW5wdXRfdXNlcmF1dGhfaW5mb19yZXEpOwotCXJldHVybiAxOwotfQotCi0vKgotICogcGFyc2UgSU5GT19SRVFVRVNULCBwcm9tcHQgdXNlciBhbmQgc2VuZCBJTkZPX1JFU1BPTlNFCi0gKi8KLXZvaWQKLWlucHV0X3VzZXJhdXRoX2luZm9fcmVxKGludCB0eXBlLCB1X2ludDMyX3Qgc2VxLCB2b2lkICpjdHh0KQotewotCUF1dGhjdHh0ICphdXRoY3R4dCA9IGN0eHQ7Ci0JY2hhciAqbmFtZSwgKmluc3QsICpsYW5nLCAqcHJvbXB0LCAqcmVzcG9uc2U7Ci0JdV9pbnQgbnVtX3Byb21wdHMsIGk7Ci0JaW50IGVjaG8gPSAwOwotCi0JZGVidWcyKCJpbnB1dF91c2VyYXV0aF9pbmZvX3JlcSIpOwotCi0JaWYgKGF1dGhjdHh0ID09IE5VTEwpCi0JCWZhdGFsKCJpbnB1dF91c2VyYXV0aF9pbmZvX3JlcTogbm8gYXV0aGVudGljYXRpb24gY29udGV4dCIpOwotCi0JYXV0aGN0eHQtPmluZm9fcmVxX3NlZW4gPSAxOwotCi0JbmFtZSA9IHBhY2tldF9nZXRfc3RyaW5nKE5VTEwpOwotCWluc3QgPSBwYWNrZXRfZ2V0X3N0cmluZyhOVUxMKTsKLQlsYW5nID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JaWYgKHN0cmxlbihuYW1lKSA+IDApCi0JCWxvZ2l0KCIlcyIsIG5hbWUpOwotCWlmIChzdHJsZW4oaW5zdCkgPiAwKQotCQlsb2dpdCgiJXMiLCBpbnN0KTsKLQl4ZnJlZShuYW1lKTsKLQl4ZnJlZShpbnN0KTsKLQl4ZnJlZShsYW5nKTsKLQotCW51bV9wcm9tcHRzID0gcGFja2V0X2dldF9pbnQoKTsKLQkvKgotCSAqIEJlZ2luIHRvIGJ1aWxkIGluZm8gcmVzcG9uc2UgcGFja2V0IGJhc2VkIG9uIHByb21wdHMgcmVxdWVzdGVkLgotCSAqIFdlIGNvbW1pdCB0byBwcm92aWRpbmcgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHJlc3BvbnNlcywgc28gaWYKLQkgKiBmdXJ0aGVyIG9uIHdlIHJ1biBpbnRvIGEgcHJvYmxlbSB0aGF0IHByZXZlbnRzIHRoaXMsIHdlIGhhdmUgdG8KLQkgKiBiZSBzdXJlIGFuZCBjbGVhbiB0aGlzIHVwIGFuZCBzZW5kIGEgY29ycmVjdCBlcnJvciByZXNwb25zZS4KLQkgKi8KLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfVVNFUkFVVEhfSU5GT19SRVNQT05TRSk7Ci0JcGFja2V0X3B1dF9pbnQobnVtX3Byb21wdHMpOwotCi0JZGVidWcyKCJpbnB1dF91c2VyYXV0aF9pbmZvX3JlcTogbnVtX3Byb21wdHMgJWQiLCBudW1fcHJvbXB0cyk7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9wcm9tcHRzOyBpKyspIHsKLQkJcHJvbXB0ID0gcGFja2V0X2dldF9zdHJpbmcoTlVMTCk7Ci0JCWVjaG8gPSBwYWNrZXRfZ2V0X2NoYXIoKTsKLQotCQlyZXNwb25zZSA9IHJlYWRfcGFzc3BocmFzZShwcm9tcHQsIGVjaG8gPyBSUF9FQ0hPIDogMCk7Ci0KLQkJcGFja2V0X3B1dF9jc3RyaW5nKHJlc3BvbnNlKTsKLQkJbWVtc2V0KHJlc3BvbnNlLCAwLCBzdHJsZW4ocmVzcG9uc2UpKTsKLQkJeGZyZWUocmVzcG9uc2UpOwotCQl4ZnJlZShwcm9tcHQpOwotCX0KLQlwYWNrZXRfY2hlY2tfZW9tKCk7IC8qIGRvbmUgd2l0aCBwYXJzaW5nIGluY29taW5nIG1lc3NhZ2UuICovCi0KLQlwYWNrZXRfYWRkX3BhZGRpbmcoNjQpOwotCXBhY2tldF9zZW5kKCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNzaF9rZXlzaWduKEtleSAqa2V5LCB1X2NoYXIgKipzaWdwLCB1X2ludCAqbGVucCwKLSAgICB1X2NoYXIgKmRhdGEsIHVfaW50IGRhdGFsZW4pCi17Ci0JQnVmZmVyIGI7Ci0Jc3RydWN0IHN0YXQgc3Q7Ci0JcGlkX3QgcGlkOwotCWludCB0b1syXSwgZnJvbVsyXSwgc3RhdHVzLCB2ZXJzaW9uID0gMjsKLQotCWRlYnVnMigic3NoX2tleXNpZ24gY2FsbGVkIik7Ci0KLQlpZiAoc3RhdChfUEFUSF9TU0hfS0VZX1NJR04sICZzdCkgPCAwKSB7Ci0JCWVycm9yKCJzc2hfa2V5c2lnbjogbm90IGluc3RhbGxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChmZmx1c2goc3Rkb3V0KSAhPSAwKQotCQllcnJvcigic3NoX2tleXNpZ246IGZmbHVzaDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCWlmIChwaXBlKHRvKSA8IDApIHsKLQkJZXJyb3IoInNzaF9rZXlzaWduOiBwaXBlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHBpcGUoZnJvbSkgPCAwKSB7Ci0JCWVycm9yKCJzc2hfa2V5c2lnbjogcGlwZTogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgocGlkID0gZm9yaygpKSA8IDApIHsKLQkJZXJyb3IoInNzaF9rZXlzaWduOiBmb3JrOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHBpZCA9PSAwKSB7Ci0JCS8qIGtlZXAgdGhlIHNvY2tldCBvbiBleGVjICovCi0JCWZjbnRsKHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpLCBGX1NFVEZELCAwKTsKLQkJcGVybWFuZW50bHlfZHJvcF9zdWlkKGdldHVpZCgpKTsKLQkJY2xvc2UoZnJvbVswXSk7Ci0JCWlmIChkdXAyKGZyb21bMV0sIFNURE9VVF9GSUxFTk8pIDwgMCkKLQkJCWZhdGFsKCJzc2hfa2V5c2lnbjogZHVwMjogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQljbG9zZSh0b1sxXSk7Ci0JCWlmIChkdXAyKHRvWzBdLCBTVERJTl9GSUxFTk8pIDwgMCkKLQkJCWZhdGFsKCJzc2hfa2V5c2lnbjogZHVwMjogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQljbG9zZShmcm9tWzFdKTsKLQkJY2xvc2UodG9bMF0pOwotCQlleGVjbChfUEFUSF9TU0hfS0VZX1NJR04sIF9QQVRIX1NTSF9LRVlfU0lHTiwgKGNoYXIgKikgMCk7Ci0JCWZhdGFsKCJzc2hfa2V5c2lnbjogZXhlYyglcyk6ICVzIiwgX1BBVEhfU1NIX0tFWV9TSUdOLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci0JY2xvc2UoZnJvbVsxXSk7Ci0JY2xvc2UodG9bMF0pOwotCi0JYnVmZmVyX2luaXQoJmIpOwotCWJ1ZmZlcl9wdXRfaW50KCZiLCBwYWNrZXRfZ2V0X2Nvbm5lY3Rpb25faW4oKSk7IC8qIHNlbmQgIyBvZiBzb2NrZXQgKi8KLQlidWZmZXJfcHV0X3N0cmluZygmYiwgZGF0YSwgZGF0YWxlbik7Ci0JaWYgKHNzaF9tc2dfc2VuZCh0b1sxXSwgdmVyc2lvbiwgJmIpID09IC0xKQotCQlmYXRhbCgic3NoX2tleXNpZ246IGNvdWxkbid0IHNlbmQgcmVxdWVzdCIpOwotCi0JaWYgKHNzaF9tc2dfcmVjdihmcm9tWzBdLCAmYikgPCAwKSB7Ci0JCWVycm9yKCJzc2hfa2V5c2lnbjogbm8gcmVwbHkiKTsKLQkJYnVmZmVyX2ZyZWUoJmIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWNsb3NlKGZyb21bMF0pOwotCWNsb3NlKHRvWzFdKTsKLQotCXdoaWxlICh3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgPCAwKQotCQlpZiAoZXJybm8gIT0gRUlOVFIpCi0JCQlicmVhazsKLQotCWlmIChidWZmZXJfZ2V0X2NoYXIoJmIpICE9IHZlcnNpb24pIHsKLQkJZXJyb3IoInNzaF9rZXlzaWduOiBiYWQgdmVyc2lvbiIpOwotCQlidWZmZXJfZnJlZSgmYik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JKnNpZ3AgPSBidWZmZXJfZ2V0X3N0cmluZygmYiwgbGVucCk7Ci0JYnVmZmVyX2ZyZWUoJmIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotdXNlcmF1dGhfaG9zdGJhc2VkKEF1dGhjdHh0ICphdXRoY3R4dCkKLXsKLQlLZXkgKnByaXZhdGUgPSBOVUxMOwotCVNlbnNpdGl2ZSAqc2Vuc2l0aXZlID0gYXV0aGN0eHQtPnNlbnNpdGl2ZTsKLQlCdWZmZXIgYjsKLQl1X2NoYXIgKnNpZ25hdHVyZSwgKmJsb2I7Ci0JY2hhciAqY2hvc3QsICpwa2FsZywgKnA7Ci0JY29uc3QgY2hhciAqc2VydmljZTsKLQl1X2ludCBibGVuLCBzbGVuOwotCWludCBvaywgaSwgZm91bmQgPSAwOwotCi0JLyogY2hlY2sgZm9yIGEgdXNlZnVsIGtleSAqLwotCWZvciAoaSA9IDA7IGkgPCBzZW5zaXRpdmUtPm5rZXlzOyBpKyspIHsKLQkJcHJpdmF0ZSA9IHNlbnNpdGl2ZS0+a2V5c1tpXTsKLQkJaWYgKHByaXZhdGUgJiYgcHJpdmF0ZS0+dHlwZSAhPSBLRVlfUlNBMSkgewotCQkJZm91bmQgPSAxOwotCQkJLyogd2UgdGFrZSBhbmQgZnJlZSB0aGUga2V5ICovCi0JCQlzZW5zaXRpdmUtPmtleXNbaV0gPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKCFmb3VuZCkgewotCQlkZWJ1ZygiTm8gbW9yZSBjbGllbnQgaG9zdGtleXMgZm9yIGhvc3RiYXNlZCBhdXRoZW50aWNhdGlvbi4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChrZXlfdG9fYmxvYihwcml2YXRlLCAmYmxvYiwgJmJsZW4pID09IDApIHsKLQkJa2V5X2ZyZWUocHJpdmF0ZSk7Ci0JCXJldHVybiAwOwotCX0KLQkvKiBmaWd1cmUgb3V0IGEgbmFtZSBmb3IgdGhlIGNsaWVudCBob3N0ICovCi0JcCA9IGdldF9sb2NhbF9uYW1lKHBhY2tldF9nZXRfY29ubmVjdGlvbl9pbigpKTsKLQlpZiAocCA9PSBOVUxMKSB7Ci0JCWVycm9yKCJ1c2VyYXV0aF9ob3N0YmFzZWQ6IGNhbm5vdCBnZXQgbG9jYWwgaXBhZGRyL25hbWUiKTsKLQkJa2V5X2ZyZWUocHJpdmF0ZSk7Ci0JCXhmcmVlKGJsb2IpOwotCQlyZXR1cm4gMDsKLQl9Ci0JeGFzcHJpbnRmKCZjaG9zdCwgIiVzLiIsIHApOwotCWRlYnVnMigidXNlcmF1dGhfaG9zdGJhc2VkOiBjaG9zdCAlcyIsIGNob3N0KTsKLQl4ZnJlZShwKTsKLQotCXNlcnZpY2UgPSBkYXRhZmVsbG93cyAmIFNTSF9CVUdfSEJTRVJWSUNFID8gInNzaC11c2VyYXV0aCIgOgotCSAgICBhdXRoY3R4dC0+c2VydmljZTsKLQlwa2FsZyA9IHhzdHJkdXAoa2V5X3NzaF9uYW1lKHByaXZhdGUpKTsKLQlidWZmZXJfaW5pdCgmYik7Ci0JLyogY29uc3RydWN0IGRhdGEgKi8KLQlidWZmZXJfcHV0X3N0cmluZygmYiwgc2Vzc2lvbl9pZDIsIHNlc3Npb25faWQyX2xlbik7Ci0JYnVmZmVyX3B1dF9jaGFyKCZiLCBTU0gyX01TR19VU0VSQVVUSF9SRVFVRVNUKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGF1dGhjdHh0LT5zZXJ2ZXJfdXNlcik7Ci0JYnVmZmVyX3B1dF9jc3RyaW5nKCZiLCBzZXJ2aWNlKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGF1dGhjdHh0LT5tZXRob2QtPm5hbWUpOwotCWJ1ZmZlcl9wdXRfY3N0cmluZygmYiwgcGthbGcpOwotCWJ1ZmZlcl9wdXRfc3RyaW5nKCZiLCBibG9iLCBibGVuKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGNob3N0KTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJmIsIGF1dGhjdHh0LT5sb2NhbF91c2VyKTsKLSNpZmRlZiBERUJVR19QSwotCWJ1ZmZlcl9kdW1wKCZiKTsKLSNlbmRpZgotCWlmIChzZW5zaXRpdmUtPmV4dGVybmFsX2tleXNpZ24pCi0JCW9rID0gc3NoX2tleXNpZ24ocHJpdmF0ZSwgJnNpZ25hdHVyZSwgJnNsZW4sCi0JCSAgICBidWZmZXJfcHRyKCZiKSwgYnVmZmVyX2xlbigmYikpOwotCWVsc2UKLQkJb2sgPSBrZXlfc2lnbihwcml2YXRlLCAmc2lnbmF0dXJlLCAmc2xlbiwKLQkJICAgIGJ1ZmZlcl9wdHIoJmIpLCBidWZmZXJfbGVuKCZiKSk7Ci0Ja2V5X2ZyZWUocHJpdmF0ZSk7Ci0JYnVmZmVyX2ZyZWUoJmIpOwotCWlmIChvayAhPSAwKSB7Ci0JCWVycm9yKCJrZXlfc2lnbiBmYWlsZWQiKTsKLQkJeGZyZWUoY2hvc3QpOwotCQl4ZnJlZShwa2FsZyk7Ci0JCXhmcmVlKGJsb2IpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpOwotCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmVyX3VzZXIpOwotCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmljZSk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKGF1dGhjdHh0LT5tZXRob2QtPm5hbWUpOwotCXBhY2tldF9wdXRfY3N0cmluZyhwa2FsZyk7Ci0JcGFja2V0X3B1dF9zdHJpbmcoYmxvYiwgYmxlbik7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKGNob3N0KTsKLQlwYWNrZXRfcHV0X2NzdHJpbmcoYXV0aGN0eHQtPmxvY2FsX3VzZXIpOwotCXBhY2tldF9wdXRfc3RyaW5nKHNpZ25hdHVyZSwgc2xlbik7Ci0JbWVtc2V0KHNpZ25hdHVyZSwgJ3MnLCBzbGVuKTsKLQl4ZnJlZShzaWduYXR1cmUpOwotCXhmcmVlKGNob3N0KTsKLQl4ZnJlZShwa2FsZyk7Ci0JeGZyZWUoYmxvYik7Ci0KLQlwYWNrZXRfc2VuZCgpOwotCXJldHVybiAxOwotfQotCi0jaWZkZWYgSlBBS0UKLWludAotdXNlcmF1dGhfanBha2UoQXV0aGN0eHQgKmF1dGhjdHh0KQotewotCXN0cnVjdCBqcGFrZV9jdHggKnBjdHg7Ci0JdV9jaGFyICp4MV9wcm9vZiwgKngyX3Byb29mOwotCXVfaW50IHgxX3Byb29mX2xlbiwgeDJfcHJvb2ZfbGVuOwotCXN0YXRpYyBpbnQgYXR0ZW1wdCA9IDA7IC8qIFhYWCBzaGFyZSB3aXRoIHVzZXJhdXRoX3Bhc3N3b3JkJ3M/ICovCi0KLQlpZiAoYXR0ZW1wdCsrID49IG9wdGlvbnMubnVtYmVyX29mX3Bhc3N3b3JkX3Byb21wdHMpCi0JCXJldHVybiAwOwotCWlmIChhdHRlbXB0ICE9IDEpCi0JCWVycm9yKCJQZXJtaXNzaW9uIGRlbmllZCwgcGxlYXNlIHRyeSBhZ2Fpbi4iKTsKLQotCWlmIChhdXRoY3R4dC0+bWV0aG9kZGF0YSAhPSBOVUxMKQotCQlmYXRhbCgiJXM6IGF1dGhjdHh0LT5tZXRob2RkYXRhIGFscmVhZHkgc2V0ICglcCkiLAotCQkgICAgX19mdW5jX18sIGF1dGhjdHh0LT5tZXRob2RkYXRhKTsKLQotCWF1dGhjdHh0LT5tZXRob2RkYXRhID0gcGN0eCA9IGpwYWtlX25ldygpOwotCi0JLyoKLQkgKiBTZW5kIHJlcXVlc3QgaW1tZWRpYXRlbHksIHRvIGdldCB0aGUgcHJvdG9jb2wgZ29pbmcgd2hpbGUKLQkgKiB3ZSBkbyB0aGUgaW5pdGlhbCBjb21wdXRhdGlvbnMuCi0JICovCi0JcGFja2V0X3N0YXJ0KFNTSDJfTVNHX1VTRVJBVVRIX1JFUVVFU1QpOwotCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmVyX3VzZXIpOwotCXBhY2tldF9wdXRfY3N0cmluZyhhdXRoY3R4dC0+c2VydmljZSk7Ci0JcGFja2V0X3B1dF9jc3RyaW5nKGF1dGhjdHh0LT5tZXRob2QtPm5hbWUpOwotCXBhY2tldF9zZW5kKCk7Ci0JcGFja2V0X3dyaXRlX3dhaXQoKTsKLQotCWpwYWtlX3N0ZXAxKHBjdHgtPmdycCwKLQkgICAgJnBjdHgtPmNsaWVudF9pZCwgJnBjdHgtPmNsaWVudF9pZF9sZW4sCi0JICAgICZwY3R4LT54MSwgJnBjdHgtPngyLCAmcGN0eC0+Z194MSwgJnBjdHgtPmdfeDIsCi0JICAgICZ4MV9wcm9vZiwgJngxX3Byb29mX2xlbiwKLQkgICAgJngyX3Byb29mLCAmeDJfcHJvb2ZfbGVuKTsKLQotCUpQQUtFX0RFQlVHX0NUWCgocGN0eCwgInN0ZXAgMSBzZW5kaW5nIGluICVzIiwgX19mdW5jX18pKTsKLQotCXBhY2tldF9zdGFydChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9DTElFTlRfU1RFUDEpOwotCXBhY2tldF9wdXRfc3RyaW5nKHBjdHgtPmNsaWVudF9pZCwgcGN0eC0+Y2xpZW50X2lkX2xlbik7Ci0JcGFja2V0X3B1dF9iaWdudW0yKHBjdHgtPmdfeDEpOwotCXBhY2tldF9wdXRfYmlnbnVtMihwY3R4LT5nX3gyKTsKLQlwYWNrZXRfcHV0X3N0cmluZyh4MV9wcm9vZiwgeDFfcHJvb2ZfbGVuKTsKLQlwYWNrZXRfcHV0X3N0cmluZyh4Ml9wcm9vZiwgeDJfcHJvb2ZfbGVuKTsKLQlwYWNrZXRfc2VuZCgpOwotCi0JYnplcm8oeDFfcHJvb2YsIHgxX3Byb29mX2xlbik7Ci0JYnplcm8oeDJfcHJvb2YsIHgyX3Byb29mX2xlbik7Ci0JeGZyZWUoeDFfcHJvb2YpOwotCXhmcmVlKHgyX3Byb29mKTsKLQotCS8qIEV4cGVjdCBzdGVwIDEgcGFja2V0IGZyb20gcGVlciAqLwotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9KUEFLRV9TRVJWRVJfU1RFUDEsCi0JICAgIGlucHV0X3VzZXJhdXRoX2pwYWtlX3NlcnZlcl9zdGVwMSk7Ci0JZGlzcGF0Y2hfc2V0KFNTSDJfTVNHX1VTRVJBVVRIX1NVQ0NFU1MsCi0JICAgICZpbnB1dF91c2VyYXV0aF9zdWNjZXNzX3VuZXhwZWN0ZWQpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLXVzZXJhdXRoX2pwYWtlX2NsZWFudXAoQXV0aGN0eHQgKmF1dGhjdHh0KQotewotCWRlYnVnMygiJXM6IGNsZWFuIHVwIiwgX19mdW5jX18pOwotCWlmIChhdXRoY3R4dC0+bWV0aG9kZGF0YSAhPSBOVUxMKSB7Ci0JCWpwYWtlX2ZyZWUoYXV0aGN0eHQtPm1ldGhvZGRhdGEpOwotCQlhdXRoY3R4dC0+bWV0aG9kZGF0YSA9IE5VTEw7Ci0JfQotCWRpc3BhdGNoX3NldChTU0gyX01TR19VU0VSQVVUSF9TVUNDRVNTLCAmaW5wdXRfdXNlcmF1dGhfc3VjY2Vzcyk7Ci19Ci0jZW5kaWYgLyogSlBBS0UgKi8KLQotLyogZmluZCBhdXRoIG1ldGhvZCAqLwotCi0vKgotICogZ2l2ZW4gYXV0aCBtZXRob2QgbmFtZSwgaWYgY29uZmlndXJhYmxlIG9wdGlvbnMgcGVybWl0IHRoaXMgbWV0aG9kIGZpbGwKLSAqIGluIGF1dGhfaWRlbnQgZmllbGQgYW5kIHJldHVybiB0cnVlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLgotICovCi1zdGF0aWMgaW50Ci1hdXRobWV0aG9kX2lzX2VuYWJsZWQoQXV0aG1ldGhvZCAqbWV0aG9kKQotewotCWlmIChtZXRob2QgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JLyogcmV0dXJuIGZhbHNlIGlmIG9wdGlvbnMgaW5kaWNhdGUgdGhpcyBtZXRob2QgaXMgZGlzYWJsZWQgKi8KLQlpZiAgKG1ldGhvZC0+ZW5hYmxlZCA9PSBOVUxMIHx8ICptZXRob2QtPmVuYWJsZWQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JLyogcmV0dXJuIGZhbHNlIGlmIGJhdGNoIG1vZGUgaXMgZW5hYmxlZCBidXQgbWV0aG9kIG5lZWRzIGludGVyYWN0aXZlIG1vZGUgKi8KLQlpZiAgKG1ldGhvZC0+YmF0Y2hfZmxhZyAhPSBOVUxMICYmICptZXRob2QtPmJhdGNoX2ZsYWcgIT0gMCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBBdXRobWV0aG9kICoKLWF1dGhtZXRob2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JQXV0aG1ldGhvZCAqbWV0aG9kID0gTlVMTDsKLQlpZiAobmFtZSAhPSBOVUxMKQotCQlmb3IgKG1ldGhvZCA9IGF1dGhtZXRob2RzOyBtZXRob2QtPm5hbWUgIT0gTlVMTDsgbWV0aG9kKyspCi0JCQlpZiAoc3RyY21wKG5hbWUsIG1ldGhvZC0+bmFtZSkgPT0gMCkKLQkJCQlyZXR1cm4gbWV0aG9kOwotCWRlYnVnMigiVW5yZWNvZ25pemVkIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBuYW1lOiAlcyIsIG5hbWUgPyBuYW1lIDogIk5VTEwiKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogWFhYIGludGVybmFsIHN0YXRlICovCi1zdGF0aWMgQXV0aG1ldGhvZCAqY3VycmVudCA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqc3VwcG9ydGVkID0gTlVMTDsKLXN0YXRpYyBjaGFyICpwcmVmZXJyZWQgPSBOVUxMOwotCi0vKgotICogR2l2ZW4gdGhlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBsaXN0IHNlbnQgYnkgdGhlIHNlcnZlciwgcmV0dXJuIHRoZQotICogbmV4dCBtZXRob2Qgd2Ugc2hvdWxkIHRyeS4gIElmIHRoZSBzZXJ2ZXIgaW5pdGlhbGx5IHNlbmRzIGEgbmlsIGxpc3QsCi0gKiB1c2UgYSBidWlsdC1pbiBkZWZhdWx0IGxpc3QuCi0gKi8KLXN0YXRpYyBBdXRobWV0aG9kICoKLWF1dGhtZXRob2RfZ2V0KGNoYXIgKmF1dGhsaXN0KQotewotCWNoYXIgKm5hbWUgPSBOVUxMOwotCXVfaW50IG5leHQ7Ci0KLQkvKiBVc2UgYSBzdWl0YWJsZSBkZWZhdWx0IGlmIHdlJ3JlIHBhc3NlZCBhIG5pbCBsaXN0LiAgKi8KLQlpZiAoYXV0aGxpc3QgPT0gTlVMTCB8fCBzdHJsZW4oYXV0aGxpc3QpID09IDApCi0JCWF1dGhsaXN0ID0gb3B0aW9ucy5wcmVmZXJyZWRfYXV0aGVudGljYXRpb25zOwotCi0JaWYgKHN1cHBvcnRlZCA9PSBOVUxMIHx8IHN0cmNtcChhdXRobGlzdCwgc3VwcG9ydGVkKSAhPSAwKSB7Ci0JCWRlYnVnMygic3RhcnQgb3ZlciwgcGFzc2VkIGEgZGlmZmVyZW50IGxpc3QgJXMiLCBhdXRobGlzdCk7Ci0JCWlmIChzdXBwb3J0ZWQgIT0gTlVMTCkKLQkJCXhmcmVlKHN1cHBvcnRlZCk7Ci0JCXN1cHBvcnRlZCA9IHhzdHJkdXAoYXV0aGxpc3QpOwotCQlwcmVmZXJyZWQgPSBvcHRpb25zLnByZWZlcnJlZF9hdXRoZW50aWNhdGlvbnM7Ci0JCWRlYnVnMygicHJlZmVycmVkICVzIiwgcHJlZmVycmVkKTsKLQkJY3VycmVudCA9IE5VTEw7Ci0JfSBlbHNlIGlmIChjdXJyZW50ICE9IE5VTEwgJiYgYXV0aG1ldGhvZF9pc19lbmFibGVkKGN1cnJlbnQpKQotCQlyZXR1cm4gY3VycmVudDsKLQotCWZvciAoOzspIHsKLQkJaWYgKChuYW1lID0gbWF0Y2hfbGlzdChwcmVmZXJyZWQsIHN1cHBvcnRlZCwgJm5leHQpKSA9PSBOVUxMKSB7Ci0JCQlkZWJ1ZygiTm8gbW9yZSBhdXRoZW50aWNhdGlvbiBtZXRob2RzIHRvIHRyeS4iKTsKLQkJCWN1cnJlbnQgPSBOVUxMOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcHJlZmVycmVkICs9IG5leHQ7Ci0JCWRlYnVnMygiYXV0aG1ldGhvZF9sb29rdXAgJXMiLCBuYW1lKTsKLQkJZGVidWczKCJyZW1haW5pbmcgcHJlZmVycmVkOiAlcyIsIHByZWZlcnJlZCk7Ci0JCWlmICgoY3VycmVudCA9IGF1dGhtZXRob2RfbG9va3VwKG5hbWUpKSAhPSBOVUxMICYmCi0JCSAgICBhdXRobWV0aG9kX2lzX2VuYWJsZWQoY3VycmVudCkpIHsKLQkJCWRlYnVnMygiYXV0aG1ldGhvZF9pc19lbmFibGVkICVzIiwgbmFtZSk7Ci0JCQlkZWJ1ZygiTmV4dCBhdXRoZW50aWNhdGlvbiBtZXRob2Q6ICVzIiwgbmFtZSk7Ci0JCQl4ZnJlZShuYW1lKTsKLQkJCXJldHVybiBjdXJyZW50OwotCQl9Ci0JfQotCWlmIChuYW1lICE9IE5VTEwpCi0JCXhmcmVlKG5hbWUpOwotfQotCi1zdGF0aWMgY2hhciAqCi1hdXRobWV0aG9kc19nZXQodm9pZCkKLXsKLQlBdXRobWV0aG9kICptZXRob2QgPSBOVUxMOwotCUJ1ZmZlciBiOwotCWNoYXIgKmxpc3Q7Ci0KLQlidWZmZXJfaW5pdCgmYik7Ci0JZm9yIChtZXRob2QgPSBhdXRobWV0aG9kczsgbWV0aG9kLT5uYW1lICE9IE5VTEw7IG1ldGhvZCsrKSB7Ci0JCWlmIChhdXRobWV0aG9kX2lzX2VuYWJsZWQobWV0aG9kKSkgewotCQkJaWYgKGJ1ZmZlcl9sZW4oJmIpID4gMCkKLQkJCQlidWZmZXJfYXBwZW5kKCZiLCAiLCIsIDEpOwotCQkJYnVmZmVyX2FwcGVuZCgmYiwgbWV0aG9kLT5uYW1lLCBzdHJsZW4obWV0aG9kLT5uYW1lKSk7Ci0JCX0KLQl9Ci0JYnVmZmVyX2FwcGVuZCgmYiwgIlwwIiwgMSk7Ci0JbGlzdCA9IHhzdHJkdXAoYnVmZmVyX3B0cigmYikpOwotCWJ1ZmZlcl9mcmVlKCZiKTsKLQlyZXR1cm4gbGlzdDsKLX0KLQpkaWZmIC0tZ2l0IGEvc3NoZC4wIGIvc3NoZC4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGI0OTgzLi4wMDAwMDAwCi0tLSBhL3NzaGQuMAorKysgL2Rldi9udWxsCkBAIC0xLDYzNSArMCwwIEBACi1TU0hEKDgpICAgICAgICAgICAgICAgICBPcGVuQlNEIFN5c3RlbSBNYW5hZ2VyJ3MgTWFudWFsICAgICAgICAgICAgICAgIFNTSEQoOCkKLQotTkFNRQotICAgICBzc2hkIC0gT3BlblNTSCBTU0ggZGFlbW9uCi0KLVNZTk9QU0lTCi0gICAgIHNzaGQgWy00NkRkZWlxVHRdIFstYiBiaXRzXSBbLUMgY29ubmVjdGlvbl9zcGVjXQotICAgICAgICAgIFstYyBob3N0X2NlcnRpZmljYXRlX2ZpbGVdIFstZiBjb25maWdfZmlsZV0gWy1nIGxvZ2luX2dyYWNlX3RpbWVdCi0gICAgICAgICAgWy1oIGhvc3Rfa2V5X2ZpbGVdIFstayBrZXlfZ2VuX3RpbWVdIFstbyBvcHRpb25dIFstcCBwb3J0XSBbLXUgbGVuXQotCi1ERVNDUklQVElPTgotICAgICBzc2hkIChPcGVuU1NIIERhZW1vbikgaXMgdGhlIGRhZW1vbiBwcm9ncmFtIGZvciBzc2goMSkuICBUb2dldGhlciB0aGVzZQotICAgICBwcm9ncmFtcyByZXBsYWNlIHJsb2dpbigxKSBhbmQgcnNoKDEpLCBhbmQgcHJvdmlkZSBzZWN1cmUgZW5jcnlwdGVkCi0gICAgIGNvbW11bmljYXRpb25zIGJldHdlZW4gdHdvIHVudHJ1c3RlZCBob3N0cyBvdmVyIGFuIGluc2VjdXJlIG5ldHdvcmsuCi0KLSAgICAgc3NoZCBsaXN0ZW5zIGZvciBjb25uZWN0aW9ucyBmcm9tIGNsaWVudHMuICBJdCBpcyBub3JtYWxseSBzdGFydGVkIGF0Ci0gICAgIGJvb3QgZnJvbSAvZXRjL3JjLiAgSXQgZm9ya3MgYSBuZXcgZGFlbW9uIGZvciBlYWNoIGluY29taW5nIGNvbm5lY3Rpb24uCi0gICAgIFRoZSBmb3JrZWQgZGFlbW9ucyBoYW5kbGUga2V5IGV4Y2hhbmdlLCBlbmNyeXB0aW9uLCBhdXRoZW50aWNhdGlvbiwKLSAgICAgY29tbWFuZCBleGVjdXRpb24sIGFuZCBkYXRhIGV4Y2hhbmdlLgotCi0gICAgIHNzaGQgY2FuIGJlIGNvbmZpZ3VyZWQgdXNpbmcgY29tbWFuZC1saW5lIG9wdGlvbnMgb3IgYSBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgKGJ5IGRlZmF1bHQgc3NoZF9jb25maWcoNSkpOyBjb21tYW5kLWxpbmUgb3B0aW9ucyBvdmVycmlkZSB2YWx1ZXMKLSAgICAgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuICBzc2hkIHJlcmVhZHMgaXRzIGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICB3aGVuIGl0IHJlY2VpdmVzIGEgaGFuZ3VwIHNpZ25hbCwgU0lHSFVQLCBieSBleGVjdXRpbmcgaXRzZWxmIHdpdGggdGhlCi0gICAgIG5hbWUgYW5kIG9wdGlvbnMgaXQgd2FzIHN0YXJ0ZWQgd2l0aCwgZS5nLiAvdXNyL3NiaW4vc3NoZC4KLQotICAgICBUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czoKLQotICAgICAtNCAgICAgIEZvcmNlcyBzc2hkIHRvIHVzZSBJUHY0IGFkZHJlc3NlcyBvbmx5LgotCi0gICAgIC02ICAgICAgRm9yY2VzIHNzaGQgdG8gdXNlIElQdjYgYWRkcmVzc2VzIG9ubHkuCi0KLSAgICAgLWIgYml0cwotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGVwaGVtZXJhbCBwcm90b2NvbCB2ZXJzaW9uIDEKLSAgICAgICAgICAgICBzZXJ2ZXIga2V5IChkZWZhdWx0IDEwMjQpLgotCi0gICAgIC1DIGNvbm5lY3Rpb25fc3BlYwotICAgICAgICAgICAgIFNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gcGFyYW1ldGVycyB0byB1c2UgZm9yIHRoZSAtVCBleHRlbmRlZCB0ZXN0Ci0gICAgICAgICAgICAgbW9kZS4gIElmIHByb3ZpZGVkLCBhbnkgTWF0Y2ggZGlyZWN0aXZlcyBpbiB0aGUgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgIGZpbGUgdGhhdCB3b3VsZCBhcHBseSB0byB0aGUgc3BlY2lmaWVkIHVzZXIsIGhvc3QsIGFuZCBhZGRyZXNzCi0gICAgICAgICAgICAgd2lsbCBiZSBzZXQgYmVmb3JlIHRoZSBjb25maWd1cmF0aW9uIGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQKLSAgICAgICAgICAgICBvdXRwdXQuICBUaGUgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIGFyZSBzdXBwbGllZCBhcyBrZXl3b3JkPXZhbHVlCi0gICAgICAgICAgICAgcGFpcnMuICBUaGUga2V5d29yZHMgYXJlIGBgdXNlcicnLCBgYGhvc3QnJywgYW5kIGBgYWRkcicnLiAgQWxsCi0gICAgICAgICAgICAgYXJlIHJlcXVpcmVkIGFuZCBtYXkgYmUgc3VwcGxpZWQgaW4gYW55IG9yZGVyLCBlaXRoZXIgd2l0aAotICAgICAgICAgICAgIG11bHRpcGxlIC1DIG9wdGlvbnMgb3IgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4KLQotICAgICAtYyBob3N0X2NlcnRpZmljYXRlX2ZpbGUKLSAgICAgICAgICAgICBTcGVjaWZpZXMgYSBwYXRoIHRvIGEgY2VydGlmaWNhdGUgZmlsZSB0byBpZGVudGlmeSBzc2hkIGR1cmluZwotICAgICAgICAgICAgIGtleSBleGNoYW5nZS4gIFRoZSBjZXJ0aWZpY2F0ZSBmaWxlIG11c3QgbWF0Y2ggYSBob3N0IGtleSBmaWxlCi0gICAgICAgICAgICAgc3BlY2lmaWVkIHVzaW5nIHRoZSAtaCBvcHRpb24gb3IgdGhlIEhvc3RLZXkgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgIGRpcmVjdGl2ZS4KLQotICAgICAtRCAgICAgIFdoZW4gdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLCBzc2hkIHdpbGwgbm90IGRldGFjaCBhbmQgZG9lcyBub3QKLSAgICAgICAgICAgICBiZWNvbWUgYSBkYWVtb24uICBUaGlzIGFsbG93cyBlYXN5IG1vbml0b3Jpbmcgb2Ygc3NoZC4KLQotICAgICAtZCAgICAgIERlYnVnIG1vZGUuICBUaGUgc2VydmVyIHNlbmRzIHZlcmJvc2UgZGVidWcgb3V0cHV0IHRvIHN0YW5kYXJkCi0gICAgICAgICAgICAgZXJyb3IsIGFuZCBkb2VzIG5vdCBwdXQgaXRzZWxmIGluIHRoZSBiYWNrZ3JvdW5kLiAgVGhlIHNlcnZlcgotICAgICAgICAgICAgIGFsc28gd2lsbCBub3QgZm9yayBhbmQgd2lsbCBvbmx5IHByb2Nlc3Mgb25lIGNvbm5lY3Rpb24uICBUaGlzCi0gICAgICAgICAgICAgb3B0aW9uIGlzIG9ubHkgaW50ZW5kZWQgZm9yIGRlYnVnZ2luZyBmb3IgdGhlIHNlcnZlci4gIE11bHRpcGxlCi0gICAgICAgICAgICAgLWQgb3B0aW9ucyBpbmNyZWFzZSB0aGUgZGVidWdnaW5nIGxldmVsLiAgTWF4aW11bSBpcyAzLgotCi0gICAgIC1lICAgICAgV2hlbiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHNzaGQgd2lsbCBzZW5kIHRoZSBvdXRwdXQgdG8gdGhlCi0gICAgICAgICAgICAgc3RhbmRhcmQgZXJyb3IgaW5zdGVhZCBvZiB0aGUgc3lzdGVtIGxvZy4KLQotICAgICAtZiBjb25maWdfZmlsZQotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgVGhlIGRlZmF1bHQgaXMKLSAgICAgICAgICAgICAvZXRjL3NzaC9zc2hkX2NvbmZpZy4gIHNzaGQgcmVmdXNlcyB0byBzdGFydCBpZiB0aGVyZSBpcyBubwotICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZS4KLQotICAgICAtZyBsb2dpbl9ncmFjZV90aW1lCi0gICAgICAgICAgICAgR2l2ZXMgdGhlIGdyYWNlIHRpbWUgZm9yIGNsaWVudHMgdG8gYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMKLSAgICAgICAgICAgICAoZGVmYXVsdCAxMjAgc2Vjb25kcykuICBJZiB0aGUgY2xpZW50IGZhaWxzIHRvIGF1dGhlbnRpY2F0ZSB0aGUKLSAgICAgICAgICAgICB1c2VyIHdpdGhpbiB0aGlzIG1hbnkgc2Vjb25kcywgdGhlIHNlcnZlciBkaXNjb25uZWN0cyBhbmQgZXhpdHMuCi0gICAgICAgICAgICAgQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyBubyBsaW1pdC4KLQotICAgICAtaCBob3N0X2tleV9maWxlCi0gICAgICAgICAgICAgU3BlY2lmaWVzIGEgZmlsZSBmcm9tIHdoaWNoIGEgaG9zdCBrZXkgaXMgcmVhZC4gIFRoaXMgb3B0aW9uIG11c3QKLSAgICAgICAgICAgICBiZSBnaXZlbiBpZiBzc2hkIGlzIG5vdCBydW4gYXMgcm9vdCAoYXMgdGhlIG5vcm1hbCBob3N0IGtleSBmaWxlcwotICAgICAgICAgICAgIGFyZSBub3JtYWxseSBub3QgcmVhZGFibGUgYnkgYW55b25lIGJ1dCByb290KS4gIFRoZSBkZWZhdWx0IGlzCi0gICAgICAgICAgICAgL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5IGZvciBwcm90b2NvbCB2ZXJzaW9uIDEsIGFuZAotICAgICAgICAgICAgIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXksIC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleSBhbmQKLSAgICAgICAgICAgICAvZXRjL3NzaC9zc2hfaG9zdF9yc2Ffa2V5IGZvciBwcm90b2NvbCB2ZXJzaW9uIDIuICBJdCBpcyBwb3NzaWJsZQotICAgICAgICAgICAgIHRvIGhhdmUgbXVsdGlwbGUgaG9zdCBrZXkgZmlsZXMgZm9yIHRoZSBkaWZmZXJlbnQgcHJvdG9jb2wKLSAgICAgICAgICAgICB2ZXJzaW9ucyBhbmQgaG9zdCBrZXkgYWxnb3JpdGhtcy4KLQotICAgICAtaSAgICAgIFNwZWNpZmllcyB0aGF0IHNzaGQgaXMgYmVpbmcgcnVuIGZyb20gaW5ldGQoOCkuICBzc2hkIGlzIG5vcm1hbGx5Ci0gICAgICAgICAgICAgbm90IHJ1biBmcm9tIGluZXRkIGJlY2F1c2UgaXQgbmVlZHMgdG8gZ2VuZXJhdGUgdGhlIHNlcnZlciBrZXkKLSAgICAgICAgICAgICBiZWZvcmUgaXQgY2FuIHJlc3BvbmQgdG8gdGhlIGNsaWVudCwgYW5kIHRoaXMgbWF5IHRha2UgdGVucyBvZgotICAgICAgICAgICAgIHNlY29uZHMuICBDbGllbnRzIHdvdWxkIGhhdmUgdG8gd2FpdCB0b28gbG9uZyBpZiB0aGUga2V5IHdhcwotICAgICAgICAgICAgIHJlZ2VuZXJhdGVkIGV2ZXJ5IHRpbWUuICBIb3dldmVyLCB3aXRoIHNtYWxsIGtleSBzaXplcyAoZS5nLiA1MTIpCi0gICAgICAgICAgICAgdXNpbmcgc3NoZCBmcm9tIGluZXRkIG1heSBiZSBmZWFzaWJsZS4KLQotICAgICAtayBrZXlfZ2VuX3RpbWUKLSAgICAgICAgICAgICBTcGVjaWZpZXMgaG93IG9mdGVuIHRoZSBlcGhlbWVyYWwgcHJvdG9jb2wgdmVyc2lvbiAxIHNlcnZlciBrZXkKLSAgICAgICAgICAgICBpcyByZWdlbmVyYXRlZCAoZGVmYXVsdCAzNjAwIHNlY29uZHMsIG9yIG9uZSBob3VyKS4gIFRoZQotICAgICAgICAgICAgIG1vdGl2YXRpb24gZm9yIHJlZ2VuZXJhdGluZyB0aGUga2V5IGZhaXJseSBvZnRlbiBpcyB0aGF0IHRoZSBrZXkKLSAgICAgICAgICAgICBpcyBub3Qgc3RvcmVkIGFueXdoZXJlLCBhbmQgYWZ0ZXIgYWJvdXQgYW4gaG91ciBpdCBiZWNvbWVzCi0gICAgICAgICAgICAgaW1wb3NzaWJsZSB0byByZWNvdmVyIHRoZSBrZXkgZm9yIGRlY3J5cHRpbmcgaW50ZXJjZXB0ZWQKLSAgICAgICAgICAgICBjb21tdW5pY2F0aW9ucyBldmVuIGlmIHRoZSBtYWNoaW5lIGlzIGNyYWNrZWQgaW50byBvciBwaHlzaWNhbGx5Ci0gICAgICAgICAgICAgc2VpemVkLiAgQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSBrZXkgd2lsbCBuZXZlciBiZQotICAgICAgICAgICAgIHJlZ2VuZXJhdGVkLgotCi0gICAgIC1vIG9wdGlvbgotICAgICAgICAgICAgIENhbiBiZSB1c2VkIHRvIGdpdmUgb3B0aW9ucyBpbiB0aGUgZm9ybWF0IHVzZWQgaW4gdGhlCi0gICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHNwZWNpZnlpbmcgb3B0aW9ucyBmb3IKLSAgICAgICAgICAgICB3aGljaCB0aGVyZSBpcyBubyBzZXBhcmF0ZSBjb21tYW5kLWxpbmUgZmxhZy4gIEZvciBmdWxsIGRldGFpbHMKLSAgICAgICAgICAgICBvZiB0aGUgb3B0aW9ucywgYW5kIHRoZWlyIHZhbHVlcywgc2VlIHNzaGRfY29uZmlnKDUpLgotCi0gICAgIC1wIHBvcnQKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHBvcnQgb24gd2hpY2ggdGhlIHNlcnZlciBsaXN0ZW5zIGZvciBjb25uZWN0aW9ucwotICAgICAgICAgICAgIChkZWZhdWx0IDIyKS4gIE11bHRpcGxlIHBvcnQgb3B0aW9ucyBhcmUgcGVybWl0dGVkLiAgUG9ydHMKLSAgICAgICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB3aXRoIHRoZSBQb3J0IG9wdGlvbiBhcmUKLSAgICAgICAgICAgICBpZ25vcmVkIHdoZW4gYSBjb21tYW5kLWxpbmUgcG9ydCBpcyBzcGVjaWZpZWQuICBQb3J0cyBzcGVjaWZpZWQKLSAgICAgICAgICAgICB1c2luZyB0aGUgTGlzdGVuQWRkcmVzcyBvcHRpb24gb3ZlcnJpZGUgY29tbWFuZC1saW5lIHBvcnRzLgotCi0gICAgIC1xICAgICAgUXVpZXQgbW9kZS4gIE5vdGhpbmcgaXMgc2VudCB0byB0aGUgc3lzdGVtIGxvZy4gIE5vcm1hbGx5IHRoZQotICAgICAgICAgICAgIGJlZ2lubmluZywgYXV0aGVudGljYXRpb24sIGFuZCB0ZXJtaW5hdGlvbiBvZiBlYWNoIGNvbm5lY3Rpb24gaXMKLSAgICAgICAgICAgICBsb2dnZWQuCi0KLSAgICAgLVQgICAgICBFeHRlbmRlZCB0ZXN0IG1vZGUuICBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICBmaWxlLCBvdXRwdXQgdGhlIGVmZmVjdGl2ZSBjb25maWd1cmF0aW9uIHRvIHN0ZG91dCBhbmQgdGhlbiBleGl0LgotICAgICAgICAgICAgIE9wdGlvbmFsbHksIE1hdGNoIHJ1bGVzIG1heSBiZSBhcHBsaWVkIGJ5IHNwZWNpZnlpbmcgdGhlCi0gICAgICAgICAgICAgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIHVzaW5nIG9uZSBvciBtb3JlIC1DIG9wdGlvbnMuCi0KLSAgICAgLXQgICAgICBUZXN0IG1vZGUuICBPbmx5IGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFuZAotICAgICAgICAgICAgIHNhbml0eSBvZiB0aGUga2V5cy4gIFRoaXMgaXMgdXNlZnVsIGZvciB1cGRhdGluZyBzc2hkIHJlbGlhYmx5IGFzCi0gICAgICAgICAgICAgY29uZmlndXJhdGlvbiBvcHRpb25zIG1heSBjaGFuZ2UuCi0KLSAgICAgLXUgbGVuICBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHNpemUgb2YgdGhlIGZpZWxkIGluIHRoZSB1dG1wCi0gICAgICAgICAgICAgc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIHJlbW90ZSBob3N0IG5hbWUuICBJZiB0aGUgcmVzb2x2ZWQgaG9zdAotICAgICAgICAgICAgIG5hbWUgaXMgbG9uZ2VyIHRoYW4gbGVuLCB0aGUgZG90dGVkIGRlY2ltYWwgdmFsdWUgd2lsbCBiZSB1c2VkCi0gICAgICAgICAgICAgaW5zdGVhZC4gIFRoaXMgYWxsb3dzIGhvc3RzIHdpdGggdmVyeSBsb25nIGhvc3QgbmFtZXMgdGhhdAotICAgICAgICAgICAgIG92ZXJmbG93IHRoaXMgZmllbGQgdG8gc3RpbGwgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4gIFNwZWNpZnlpbmcKLSAgICAgICAgICAgICAtdTAgaW5kaWNhdGVzIHRoYXQgb25seSBkb3R0ZWQgZGVjaW1hbCBhZGRyZXNzZXMgc2hvdWxkIGJlIHB1dAotICAgICAgICAgICAgIGludG8gdGhlIHV0bXAgZmlsZS4gIC11MCBtYXkgYWxzbyBiZSB1c2VkIHRvIHByZXZlbnQgc3NoZCBmcm9tCi0gICAgICAgICAgICAgbWFraW5nIEROUyByZXF1ZXN0cyB1bmxlc3MgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSBvcgotICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgaXQuICBBdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHRoYXQgbWF5Ci0gICAgICAgICAgICAgcmVxdWlyZSBETlMgaW5jbHVkZSBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbiwKLSAgICAgICAgICAgICBIb3N0YmFzZWRBdXRoZW50aWNhdGlvbiwgYW5kIHVzaW5nIGEgZnJvbT0icGF0dGVybi1saXN0IiBvcHRpb24KLSAgICAgICAgICAgICBpbiBhIGtleSBmaWxlLiAgQ29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgcmVxdWlyZSBETlMgaW5jbHVkZQotICAgICAgICAgICAgIHVzaW5nIGEgVVNFUkBIT1NUIHBhdHRlcm4gaW4gQWxsb3dVc2VycyBvciBEZW55VXNlcnMuCi0KLUFVVEhFTlRJQ0FUSU9OCi0gICAgIFRoZSBPcGVuU1NIIFNTSCBkYWVtb24gc3VwcG9ydHMgU1NIIHByb3RvY29scyAxIGFuZCAyLiAgVGhlIGRlZmF1bHQgaXMgdG8KLSAgICAgdXNlIHByb3RvY29sIDIgb25seSwgdGhvdWdoIHRoaXMgY2FuIGJlIGNoYW5nZWQgdmlhIHRoZSBQcm90b2NvbCBvcHRpb24KLSAgICAgaW4gc3NoZF9jb25maWcoNSkuICBQcm90b2NvbCAyIHN1cHBvcnRzIERTQSwgRUNEU0EgYW5kIFJTQSBrZXlzOyBwcm90b2NvbAotICAgICAxIG9ubHkgc3VwcG9ydHMgUlNBIGtleXMuICBGb3IgYm90aCBwcm90b2NvbHMsIGVhY2ggaG9zdCBoYXMgYSBob3N0LQotICAgICBzcGVjaWZpYyBrZXksIG5vcm1hbGx5IDIwNDggYml0cywgdXNlZCB0byBpZGVudGlmeSB0aGUgaG9zdC4KLQotICAgICBGb3J3YXJkIHNlY3VyaXR5IGZvciBwcm90b2NvbCAxIGlzIHByb3ZpZGVkIHRocm91Z2ggYW4gYWRkaXRpb25hbCBzZXJ2ZXIKLSAgICAga2V5LCBub3JtYWxseSA3NjggYml0cywgZ2VuZXJhdGVkIHdoZW4gdGhlIHNlcnZlciBzdGFydHMuICBUaGlzIGtleSBpcwotICAgICBub3JtYWxseSByZWdlbmVyYXRlZCBldmVyeSBob3VyIGlmIGl0IGhhcyBiZWVuIHVzZWQsIGFuZCBpcyBuZXZlciBzdG9yZWQKLSAgICAgb24gZGlzay4gIFdoZW5ldmVyIGEgY2xpZW50IGNvbm5lY3RzLCB0aGUgZGFlbW9uIHJlc3BvbmRzIHdpdGggaXRzIHB1YmxpYwotICAgICBob3N0IGFuZCBzZXJ2ZXIga2V5cy4gIFRoZSBjbGllbnQgY29tcGFyZXMgdGhlIFJTQSBob3N0IGtleSBhZ2FpbnN0IGl0cwotICAgICBvd24gZGF0YWJhc2UgdG8gdmVyaWZ5IHRoYXQgaXQgaGFzIG5vdCBjaGFuZ2VkLiAgVGhlIGNsaWVudCB0aGVuCi0gICAgIGdlbmVyYXRlcyBhIDI1Ni1iaXQgcmFuZG9tIG51bWJlci4gIEl0IGVuY3J5cHRzIHRoaXMgcmFuZG9tIG51bWJlciB1c2luZwotICAgICBib3RoIHRoZSBob3N0IGtleSBhbmQgdGhlIHNlcnZlciBrZXksIGFuZCBzZW5kcyB0aGUgZW5jcnlwdGVkIG51bWJlciB0bwotICAgICB0aGUgc2VydmVyLiAgQm90aCBzaWRlcyB0aGVuIHVzZSB0aGlzIHJhbmRvbSBudW1iZXIgYXMgYSBzZXNzaW9uIGtleQotICAgICB3aGljaCBpcyB1c2VkIHRvIGVuY3J5cHQgYWxsIGZ1cnRoZXIgY29tbXVuaWNhdGlvbnMgaW4gdGhlIHNlc3Npb24uICBUaGUKLSAgICAgcmVzdCBvZiB0aGUgc2Vzc2lvbiBpcyBlbmNyeXB0ZWQgdXNpbmcgYSBjb252ZW50aW9uYWwgY2lwaGVyLCBjdXJyZW50bHkKLSAgICAgQmxvd2Zpc2ggb3IgM0RFUywgd2l0aCAzREVTIGJlaW5nIHVzZWQgYnkgZGVmYXVsdC4gIFRoZSBjbGllbnQgc2VsZWN0cwotICAgICB0aGUgZW5jcnlwdGlvbiBhbGdvcml0aG0gdG8gdXNlIGZyb20gdGhvc2Ugb2ZmZXJlZCBieSB0aGUgc2VydmVyLgotCi0gICAgIEZvciBwcm90b2NvbCAyLCBmb3J3YXJkIHNlY3VyaXR5IGlzIHByb3ZpZGVkIHRocm91Z2ggYSBEaWZmaWUtSGVsbG1hbiBrZXkKLSAgICAgYWdyZWVtZW50LiAgVGhpcyBrZXkgYWdyZWVtZW50IHJlc3VsdHMgaW4gYSBzaGFyZWQgc2Vzc2lvbiBrZXkuICBUaGUgcmVzdAotICAgICBvZiB0aGUgc2Vzc2lvbiBpcyBlbmNyeXB0ZWQgdXNpbmcgYSBzeW1tZXRyaWMgY2lwaGVyLCBjdXJyZW50bHkgMTI4LWJpdAotICAgICBBRVMsIEJsb3dmaXNoLCAzREVTLCBDQVNUMTI4LCBBcmNmb3VyLCAxOTItYml0IEFFUywgb3IgMjU2LWJpdCBBRVMuICBUaGUKLSAgICAgY2xpZW50IHNlbGVjdHMgdGhlIGVuY3J5cHRpb24gYWxnb3JpdGhtIHRvIHVzZSBmcm9tIHRob3NlIG9mZmVyZWQgYnkgdGhlCi0gICAgIHNlcnZlci4gIEFkZGl0aW9uYWxseSwgc2Vzc2lvbiBpbnRlZ3JpdHkgaXMgcHJvdmlkZWQgdGhyb3VnaCBhCi0gICAgIGNyeXB0b2dyYXBoaWMgbWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlIChobWFjLW1kNSwgaG1hYy1zaGExLCB1bWFjLTY0LAotICAgICBobWFjLXJpcGVtZDE2MCwgaG1hYy1zaGEyLTI1NiBvciBobWFjLXNoYTItNTEyKS4KLQotICAgICBGaW5hbGx5LCB0aGUgc2VydmVyIGFuZCB0aGUgY2xpZW50IGVudGVyIGFuIGF1dGhlbnRpY2F0aW9uIGRpYWxvZy4gIFRoZQotICAgICBjbGllbnQgdHJpZXMgdG8gYXV0aGVudGljYXRlIGl0c2VsZiB1c2luZyBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uLAotICAgICBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uLCBjaGFsbGVuZ2UtcmVzcG9uc2UgYXV0aGVudGljYXRpb24sIG9yIHBhc3N3b3JkCi0gICAgIGF1dGhlbnRpY2F0aW9uLgotCi0gICAgIFJlZ2FyZGxlc3Mgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUsIHRoZSBhY2NvdW50IGlzIGNoZWNrZWQgdG8gZW5zdXJlCi0gICAgIHRoYXQgaXQgaXMgYWNjZXNzaWJsZS4gIEFuIGFjY291bnQgaXMgbm90IGFjY2Vzc2libGUgaWYgaXQgaXMgbG9ja2VkLAotICAgICBsaXN0ZWQgaW4gRGVueVVzZXJzIG9yIGl0cyBncm91cCBpcyBsaXN0ZWQgaW4gRGVueUdyb3VwcyAuICBUaGUKLSAgICAgZGVmaW5pdGlvbiBvZiBhIGxvY2tlZCBhY2NvdW50IGlzIHN5c3RlbSBkZXBlbmRhbnQuIFNvbWUgcGxhdGZvcm1zIGhhdmUKLSAgICAgdGhlaXIgb3duIGFjY291bnQgZGF0YWJhc2UgKGVnIEFJWCkgYW5kIHNvbWUgbW9kaWZ5IHRoZSBwYXNzd2QgZmllbGQgKAotICAgICBgKkxLKicgb24gU29sYXJpcyBhbmQgVW5peFdhcmUsIGAqJyBvbiBIUC1VWCwgY29udGFpbmluZyBgTm9sb2dpbicgb24KLSAgICAgVHJ1NjQsIGEgbGVhZGluZyBgKkxPQ0tFRConIG9uIEZyZWVCU0QgYW5kIGEgbGVhZGluZyBgIScgb24gbW9zdAotICAgICBMaW51eGVzKS4gIElmIHRoZXJlIGlzIGEgcmVxdWlyZW1lbnQgdG8gZGlzYWJsZSBwYXNzd29yZCBhdXRoZW50aWNhdGlvbgotICAgICBmb3IgdGhlIGFjY291bnQgd2hpbGUgYWxsb3dpbmcgc3RpbGwgcHVibGljLWtleSwgdGhlbiB0aGUgcGFzc3dkIGZpZWxkCi0gICAgIHNob3VsZCBiZSBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlc2UgdmFsdWVzIChlZyBgTlAnIG9yIGAqTlAqJyApLgotCi0gICAgIElmIHRoZSBjbGllbnQgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZXMgaXRzZWxmLCBhIGRpYWxvZyBmb3IgcHJlcGFyaW5nCi0gICAgIHRoZSBzZXNzaW9uIGlzIGVudGVyZWQuICBBdCB0aGlzIHRpbWUgdGhlIGNsaWVudCBtYXkgcmVxdWVzdCB0aGluZ3MgbGlrZQotICAgICBhbGxvY2F0aW5nIGEgcHNldWRvLXR0eSwgZm9yd2FyZGluZyBYMTEgY29ubmVjdGlvbnMsIGZvcndhcmRpbmcgVENQCi0gICAgIGNvbm5lY3Rpb25zLCBvciBmb3J3YXJkaW5nIHRoZSBhdXRoZW50aWNhdGlvbiBhZ2VudCBjb25uZWN0aW9uIG92ZXIgdGhlCi0gICAgIHNlY3VyZSBjaGFubmVsLgotCi0gICAgIEFmdGVyIHRoaXMsIHRoZSBjbGllbnQgZWl0aGVyIHJlcXVlc3RzIGEgc2hlbGwgb3IgZXhlY3V0aW9uIG9mIGEgY29tbWFuZC4KLSAgICAgVGhlIHNpZGVzIHRoZW4gZW50ZXIgc2Vzc2lvbiBtb2RlLiAgSW4gdGhpcyBtb2RlLCBlaXRoZXIgc2lkZSBtYXkgc2VuZAotICAgICBkYXRhIGF0IGFueSB0aW1lLCBhbmQgc3VjaCBkYXRhIGlzIGZvcndhcmRlZCB0by9mcm9tIHRoZSBzaGVsbCBvciBjb21tYW5kCi0gICAgIG9uIHRoZSBzZXJ2ZXIgc2lkZSwgYW5kIHRoZSB1c2VyIHRlcm1pbmFsIGluIHRoZSBjbGllbnQgc2lkZS4KLQotICAgICBXaGVuIHRoZSB1c2VyIHByb2dyYW0gdGVybWluYXRlcyBhbmQgYWxsIGZvcndhcmRlZCBYMTEgYW5kIG90aGVyCi0gICAgIGNvbm5lY3Rpb25zIGhhdmUgYmVlbiBjbG9zZWQsIHRoZSBzZXJ2ZXIgc2VuZHMgY29tbWFuZCBleGl0IHN0YXR1cyB0byB0aGUKLSAgICAgY2xpZW50LCBhbmQgYm90aCBzaWRlcyBleGl0LgotCi1MT0dJTiBQUk9DRVNTCi0gICAgIFdoZW4gYSB1c2VyIHN1Y2Nlc3NmdWxseSBsb2dzIGluLCBzc2hkIGRvZXMgdGhlIGZvbGxvd2luZzoKLQotICAgICAgICAgICAxLiAgIElmIHRoZSBsb2dpbiBpcyBvbiBhIHR0eSwgYW5kIG5vIGNvbW1hbmQgaGFzIGJlZW4gc3BlY2lmaWVkLAotICAgICAgICAgICAgICAgIHByaW50cyBsYXN0IGxvZ2luIHRpbWUgYW5kIC9ldGMvbW90ZCAodW5sZXNzIHByZXZlbnRlZCBpbiB0aGUKLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGUgb3IgYnkgfi8uaHVzaGxvZ2luOyBzZWUgdGhlIEZJTEVTIHNlY3Rpb24pLgotCi0gICAgICAgICAgIDIuICAgSWYgdGhlIGxvZ2luIGlzIG9uIGEgdHR5LCByZWNvcmRzIGxvZ2luIHRpbWUuCi0KLSAgICAgICAgICAgMy4gICBDaGVja3MgL2V0Yy9ub2xvZ2luOyBpZiBpdCBleGlzdHMsIHByaW50cyBjb250ZW50cyBhbmQgcXVpdHMKLSAgICAgICAgICAgICAgICAodW5sZXNzIHJvb3QpLgotCi0gICAgICAgICAgIDQuICAgQ2hhbmdlcyB0byBydW4gd2l0aCBub3JtYWwgdXNlciBwcml2aWxlZ2VzLgotCi0gICAgICAgICAgIDUuICAgU2V0cyB1cCBiYXNpYyBlbnZpcm9ubWVudC4KLQotICAgICAgICAgICA2LiAgIFJlYWRzIHRoZSBmaWxlIH4vLnNzaC9lbnZpcm9ubWVudCwgaWYgaXQgZXhpc3RzLCBhbmQgdXNlcnMgYXJlCi0gICAgICAgICAgICAgICAgYWxsb3dlZCB0byBjaGFuZ2UgdGhlaXIgZW52aXJvbm1lbnQuICBTZWUgdGhlCi0gICAgICAgICAgICAgICAgUGVybWl0VXNlckVudmlyb25tZW50IG9wdGlvbiBpbiBzc2hkX2NvbmZpZyg1KS4KLQotICAgICAgICAgICA3LiAgIENoYW5nZXMgdG8gdXNlcidzIGhvbWUgZGlyZWN0b3J5LgotCi0gICAgICAgICAgIDguICAgSWYgfi8uc3NoL3JjIGV4aXN0cywgcnVucyBpdDsgZWxzZSBpZiAvZXRjL3NzaC9zc2hyYyBleGlzdHMsCi0gICAgICAgICAgICAgICAgcnVucyBpdDsgb3RoZXJ3aXNlIHJ1bnMgeGF1dGguICBUaGUgYGByYycnIGZpbGVzIGFyZSBnaXZlbiB0aGUKLSAgICAgICAgICAgICAgICBYMTEgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgYW5kIGNvb2tpZSBpbiBzdGFuZGFyZCBpbnB1dC4gIFNlZQotICAgICAgICAgICAgICAgIFNTSFJDLCBiZWxvdy4KLQotICAgICAgICAgICA5LiAgIFJ1bnMgdXNlcidzIHNoZWxsIG9yIGNvbW1hbmQuCi0KLVNTSFJDCi0gICAgIElmIHRoZSBmaWxlIH4vLnNzaC9yYyBleGlzdHMsIHNoKDEpIHJ1bnMgaXQgYWZ0ZXIgcmVhZGluZyB0aGUgZW52aXJvbm1lbnQKLSAgICAgZmlsZXMgYnV0IGJlZm9yZSBzdGFydGluZyB0aGUgdXNlcidzIHNoZWxsIG9yIGNvbW1hbmQuICBJdCBtdXN0IG5vdAotICAgICBwcm9kdWNlIGFueSBvdXRwdXQgb24gc3Rkb3V0OyBzdGRlcnIgbXVzdCBiZSB1c2VkIGluc3RlYWQuICBJZiBYMTEKLSAgICAgZm9yd2FyZGluZyBpcyBpbiB1c2UsIGl0IHdpbGwgcmVjZWl2ZSB0aGUgInByb3RvIGNvb2tpZSIgcGFpciBpbiBpdHMKLSAgICAgc3RhbmRhcmQgaW5wdXQgKGFuZCBESVNQTEFZIGluIGl0cyBlbnZpcm9ubWVudCkuICBUaGUgc2NyaXB0IG11c3QgY2FsbAotICAgICB4YXV0aCgxKSBiZWNhdXNlIHNzaGQgd2lsbCBub3QgcnVuIHhhdXRoIGF1dG9tYXRpY2FsbHkgdG8gYWRkIFgxMQotICAgICBjb29raWVzLgotCi0gICAgIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIHJ1biBhbnkgaW5pdGlhbGl6YXRpb24gcm91dGluZXMKLSAgICAgd2hpY2ggbWF5IGJlIG5lZWRlZCBiZWZvcmUgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBiZWNvbWVzIGFjY2Vzc2libGU7Ci0gICAgIEFGUyBpcyBhIHBhcnRpY3VsYXIgZXhhbXBsZSBvZiBzdWNoIGFuIGVudmlyb25tZW50LgotCi0gICAgIFRoaXMgZmlsZSB3aWxsIHByb2JhYmx5IGNvbnRhaW4gc29tZSBpbml0aWFsaXphdGlvbiBjb2RlIGZvbGxvd2VkIGJ5Ci0gICAgIHNvbWV0aGluZyBzaW1pbGFyIHRvOgotCi0gICAgICAgIGlmIHJlYWQgcHJvdG8gY29va2llICYmIFsgLW4gIiRESVNQTEFZIiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgaWYgWyBgZWNobyAkRElTUExBWSB8IGN1dCAtYzEtMTBgID0gJ2xvY2FsaG9zdDonIF07IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICMgWDExVXNlTG9jYWxob3N0PXllcwotICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBhZGQgdW5peDpgZWNobyAkRElTUExBWSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0IC1jMTEtYCAkcHJvdG8gJGNvb2tpZQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICMgWDExVXNlTG9jYWxob3N0PW5vCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGFkZCAkRElTUExBWSAkcHJvdG8gJGNvb2tpZQotICAgICAgICAgICAgICAgIGZpIHwgeGF1dGggLXEgLQotICAgICAgICBmaQotCi0gICAgIElmIHRoaXMgZmlsZSBkb2VzIG5vdCBleGlzdCwgL2V0Yy9zc2gvc3NocmMgaXMgcnVuLCBhbmQgaWYgdGhhdCBkb2VzIG5vdAotICAgICBleGlzdCBlaXRoZXIsIHhhdXRoIGlzIHVzZWQgdG8gYWRkIHRoZSBjb29raWUuCi0KLUFVVEhPUklaRURfS0VZUyBGSUxFIEZPUk1BVAotICAgICBBdXRob3JpemVkS2V5c0ZpbGUgc3BlY2lmaWVzIHRoZSBmaWxlcyBjb250YWluaW5nIHB1YmxpYyBrZXlzIGZvciBwdWJsaWMKLSAgICAga2V5IGF1dGhlbnRpY2F0aW9uOyBpZiBub25lIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMKLSAgICAgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cyBhbmQgfi8uc3NoL2F1dGhvcml6ZWRfa2V5czIuICBFYWNoIGxpbmUgb2YgdGhlCi0gICAgIGZpbGUgY29udGFpbnMgb25lIGtleSAoZW1wdHkgbGluZXMgYW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggYSBgIycgYXJlCi0gICAgIGlnbm9yZWQgYXMgY29tbWVudHMpLiAgUHJvdG9jb2wgMSBwdWJsaWMga2V5cyBjb25zaXN0IG9mIHRoZSBmb2xsb3dpbmcKLSAgICAgc3BhY2Utc2VwYXJhdGVkIGZpZWxkczogb3B0aW9ucywgYml0cywgZXhwb25lbnQsIG1vZHVsdXMsIGNvbW1lbnQuCi0gICAgIFByb3RvY29sIDIgcHVibGljIGtleSBjb25zaXN0IG9mOiBvcHRpb25zLCBrZXl0eXBlLCBiYXNlNjQtZW5jb2RlZCBrZXksCi0gICAgIGNvbW1lbnQuICBUaGUgb3B0aW9ucyBmaWVsZCBpcyBvcHRpb25hbDsgaXRzIHByZXNlbmNlIGlzIGRldGVybWluZWQgYnkKLSAgICAgd2hldGhlciB0aGUgbGluZSBzdGFydHMgd2l0aCBhIG51bWJlciBvciBub3QgKHRoZSBvcHRpb25zIGZpZWxkIG5ldmVyCi0gICAgIHN0YXJ0cyB3aXRoIGEgbnVtYmVyKS4gIFRoZSBiaXRzLCBleHBvbmVudCwgbW9kdWx1cywgYW5kIGNvbW1lbnQgZmllbGRzCi0gICAgIGdpdmUgdGhlIFJTQSBrZXkgZm9yIHByb3RvY29sIHZlcnNpb24gMTsgdGhlIGNvbW1lbnQgZmllbGQgaXMgbm90IHVzZWQKLSAgICAgZm9yIGFueXRoaW5nIChidXQgbWF5IGJlIGNvbnZlbmllbnQgZm9yIHRoZSB1c2VyIHRvIGlkZW50aWZ5IHRoZSBrZXkpLgotICAgICBGb3IgcHJvdG9jb2wgdmVyc2lvbiAyIHRoZSBrZXl0eXBlIGlzIGBgZWNkc2Etc2hhMi1uaXN0cDI1NicnLAotICAgICBgYGVjZHNhLXNoYTItbmlzdHAzODQnJywgYGBlY2RzYS1zaGEyLW5pc3RwNTIxJycsIGBgc3NoLWRzcycnIG9yCi0gICAgIGBgc3NoLXJzYScnLgotCi0gICAgIE5vdGUgdGhhdCBsaW5lcyBpbiB0aGlzIGZpbGUgYXJlIHVzdWFsbHkgc2V2ZXJhbCBodW5kcmVkIGJ5dGVzIGxvbmcKLSAgICAgKGJlY2F1c2Ugb2YgdGhlIHNpemUgb2YgdGhlIHB1YmxpYyBrZXkgZW5jb2RpbmcpIHVwIHRvIGEgbGltaXQgb2YgOAotICAgICBraWxvYnl0ZXMsIHdoaWNoIHBlcm1pdHMgRFNBIGtleXMgdXAgdG8gOCBraWxvYml0cyBhbmQgUlNBIGtleXMgdXAgdG8gMTYKLSAgICAga2lsb2JpdHMuICBZb3UgZG9uJ3Qgd2FudCB0byB0eXBlIHRoZW0gaW47IGluc3RlYWQsIGNvcHkgdGhlCi0gICAgIGlkZW50aXR5LnB1YiwgaWRfZHNhLnB1YiwgaWRfZWNkc2EucHViLCBvciB0aGUgaWRfcnNhLnB1YiBmaWxlIGFuZCBlZGl0Ci0gICAgIGl0LgotCi0gICAgIHNzaGQgZW5mb3JjZXMgYSBtaW5pbXVtIFJTQSBrZXkgbW9kdWx1cyBzaXplIGZvciBwcm90b2NvbCAxIGFuZCBwcm90b2NvbAotICAgICAyIGtleXMgb2YgNzY4IGJpdHMuCi0KLSAgICAgVGhlIG9wdGlvbnMgKGlmIHByZXNlbnQpIGNvbnNpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIG9wdGlvbgotICAgICBzcGVjaWZpY2F0aW9ucy4gIE5vIHNwYWNlcyBhcmUgcGVybWl0dGVkLCBleGNlcHQgd2l0aGluIGRvdWJsZSBxdW90ZXMuCi0gICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9uIHNwZWNpZmljYXRpb25zIGFyZSBzdXBwb3J0ZWQgKG5vdGUgdGhhdCBvcHRpb24KLSAgICAga2V5d29yZHMgYXJlIGNhc2UtaW5zZW5zaXRpdmUpOgotCi0gICAgIGNlcnQtYXV0aG9yaXR5Ci0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIGxpc3RlZCBrZXkgaXMgYSBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSAoQ0EpCi0gICAgICAgICAgICAgdGhhdCBpcyB0cnVzdGVkIHRvIHZhbGlkYXRlIHNpZ25lZCBjZXJ0aWZpY2F0ZXMgZm9yIHVzZXIKLSAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi4KLQotICAgICAgICAgICAgIENlcnRpZmljYXRlcyBtYXkgZW5jb2RlIGFjY2VzcyByZXN0cmljdGlvbnMgc2ltaWxhciB0byB0aGVzZSBrZXkKLSAgICAgICAgICAgICBvcHRpb25zLiAgSWYgYm90aCBjZXJ0aWZpY2F0ZSByZXN0cmljdGlvbnMgYW5kIGtleSBvcHRpb25zIGFyZQotICAgICAgICAgICAgIHByZXNlbnQsIHRoZSBtb3N0IHJlc3RyaWN0aXZlIHVuaW9uIG9mIHRoZSB0d28gaXMgYXBwbGllZC4KLQotICAgICBjb21tYW5kPSJjb21tYW5kIgotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGF0IHRoZSBjb21tYW5kIGlzIGV4ZWN1dGVkIHdoZW5ldmVyIHRoaXMga2V5IGlzIHVzZWQKLSAgICAgICAgICAgICBmb3IgYXV0aGVudGljYXRpb24uICBUaGUgY29tbWFuZCBzdXBwbGllZCBieSB0aGUgdXNlciAoaWYgYW55KSBpcwotICAgICAgICAgICAgIGlnbm9yZWQuICBUaGUgY29tbWFuZCBpcyBydW4gb24gYSBwdHkgaWYgdGhlIGNsaWVudCByZXF1ZXN0cyBhCi0gICAgICAgICAgICAgcHR5OyBvdGhlcndpc2UgaXQgaXMgcnVuIHdpdGhvdXQgYSB0dHkuICBJZiBhbiA4LWJpdCBjbGVhbgotICAgICAgICAgICAgIGNoYW5uZWwgaXMgcmVxdWlyZWQsIG9uZSBtdXN0IG5vdCByZXF1ZXN0IGEgcHR5IG9yIHNob3VsZCBzcGVjaWZ5Ci0gICAgICAgICAgICAgbm8tcHR5LiAgQSBxdW90ZSBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIGNvbW1hbmQgYnkgcXVvdGluZyBpdAotICAgICAgICAgICAgIHdpdGggYSBiYWNrc2xhc2guICBUaGlzIG9wdGlvbiBtaWdodCBiZSB1c2VmdWwgdG8gcmVzdHJpY3QKLSAgICAgICAgICAgICBjZXJ0YWluIHB1YmxpYyBrZXlzIHRvIHBlcmZvcm0ganVzdCBhIHNwZWNpZmljIG9wZXJhdGlvbi4gIEFuCi0gICAgICAgICAgICAgZXhhbXBsZSBtaWdodCBiZSBhIGtleSB0aGF0IHBlcm1pdHMgcmVtb3RlIGJhY2t1cHMgYnV0IG5vdGhpbmcKLSAgICAgICAgICAgICBlbHNlLiAgTm90ZSB0aGF0IHRoZSBjbGllbnQgbWF5IHNwZWNpZnkgVENQIGFuZC9vciBYMTEgZm9yd2FyZGluZwotICAgICAgICAgICAgIHVubGVzcyB0aGV5IGFyZSBleHBsaWNpdGx5IHByb2hpYml0ZWQuICBUaGUgY29tbWFuZCBvcmlnaW5hbGx5Ci0gICAgICAgICAgICAgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCBpcyBhdmFpbGFibGUgaW4gdGhlIFNTSF9PUklHSU5BTF9DT01NQU5ECi0gICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUuICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBzaGVsbCwKLSAgICAgICAgICAgICBjb21tYW5kIG9yIHN1YnN5c3RlbSBleGVjdXRpb24uICBBbHNvIG5vdGUgdGhhdCB0aGlzIGNvbW1hbmQgbWF5Ci0gICAgICAgICAgICAgYmUgc3VwZXJzZWRlZCBieSBlaXRoZXIgYSBzc2hkX2NvbmZpZyg1KSBGb3JjZUNvbW1hbmQgZGlyZWN0aXZlCi0gICAgICAgICAgICAgb3IgYSBjb21tYW5kIGVtYmVkZGVkIGluIGEgY2VydGlmaWNhdGUuCi0KLSAgICAgZW52aXJvbm1lbnQ9Ik5BTUU9dmFsdWUiCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIHN0cmluZyBpcyB0byBiZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQgd2hlbgotICAgICAgICAgICAgIGxvZ2dpbmcgaW4gdXNpbmcgdGhpcyBrZXkuICBFbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0IHRoaXMgd2F5Ci0gICAgICAgICAgICAgb3ZlcnJpZGUgb3RoZXIgZGVmYXVsdCBlbnZpcm9ubWVudCB2YWx1ZXMuICBNdWx0aXBsZSBvcHRpb25zIG9mCi0gICAgICAgICAgICAgdGhpcyB0eXBlIGFyZSBwZXJtaXR0ZWQuICBFbnZpcm9ubWVudCBwcm9jZXNzaW5nIGlzIGRpc2FibGVkIGJ5Ci0gICAgICAgICAgICAgZGVmYXVsdCBhbmQgaXMgY29udHJvbGxlZCB2aWEgdGhlIFBlcm1pdFVzZXJFbnZpcm9ubWVudCBvcHRpb24uCi0gICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCBpZiBVc2VMb2dpbiBpcyBlbmFibGVkLgotCi0gICAgIGZyb209InBhdHRlcm4tbGlzdCIKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBpbiBhZGRpdGlvbiB0byBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uLCBlaXRoZXIKLSAgICAgICAgICAgICB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIHJlbW90ZSBob3N0IG9yIGl0cyBJUCBhZGRyZXNzIG11c3QgYmUKLSAgICAgICAgICAgICBwcmVzZW50IGluIHRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucy4gIFNlZSBQQVRURVJOUyBpbgotICAgICAgICAgICAgIHNzaF9jb25maWcoNSkgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGF0dGVybnMuCi0KLSAgICAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGUgd2lsZGNhcmQgbWF0Y2hpbmcgdGhhdCBtYXkgYmUgYXBwbGllZCB0bwotICAgICAgICAgICAgIGhvc3RuYW1lcyBvciBhZGRyZXNzZXMsIGEgZnJvbSBzdGFuemEgbWF5IG1hdGNoIElQIGFkZHJlc3NlcwotICAgICAgICAgICAgIHVzaW5nIENJRFIgYWRkcmVzcy9tYXNrbGVuIG5vdGF0aW9uLgotCi0gICAgICAgICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBvcHRpb24gaXMgdG8gb3B0aW9uYWxseSBpbmNyZWFzZSBzZWN1cml0eToKLSAgICAgICAgICAgICBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIGJ5IGl0c2VsZiBkb2VzIG5vdCB0cnVzdCB0aGUgbmV0d29yayBvcgotICAgICAgICAgICAgIG5hbWUgc2VydmVycyBvciBhbnl0aGluZyAoYnV0IHRoZSBrZXkpOyBob3dldmVyLCBpZiBzb21lYm9keQotICAgICAgICAgICAgIHNvbWVob3cgc3RlYWxzIHRoZSBrZXksIHRoZSBrZXkgcGVybWl0cyBhbiBpbnRydWRlciB0byBsb2cgaW4KLSAgICAgICAgICAgICBmcm9tIGFueXdoZXJlIGluIHRoZSB3b3JsZC4gIFRoaXMgYWRkaXRpb25hbCBvcHRpb24gbWFrZXMgdXNpbmcgYQotICAgICAgICAgICAgIHN0b2xlbiBrZXkgbW9yZSBkaWZmaWN1bHQgKG5hbWUgc2VydmVycyBhbmQvb3Igcm91dGVycyB3b3VsZCBoYXZlCi0gICAgICAgICAgICAgdG8gYmUgY29tcHJvbWlzZWQgaW4gYWRkaXRpb24gdG8ganVzdCB0aGUga2V5KS4KLQotICAgICBuby1hZ2VudC1mb3J3YXJkaW5nCi0gICAgICAgICAgICAgRm9yYmlkcyBhdXRoZW50aWNhdGlvbiBhZ2VudCBmb3J3YXJkaW5nIHdoZW4gdGhpcyBrZXkgaXMgdXNlZCBmb3IKLSAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi4KLQotICAgICBuby1wb3J0LWZvcndhcmRpbmcKLSAgICAgICAgICAgICBGb3JiaWRzIFRDUCBmb3J3YXJkaW5nIHdoZW4gdGhpcyBrZXkgaXMgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uCi0gICAgICAgICAgICAgQW55IHBvcnQgZm9yd2FyZCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLgotICAgICAgICAgICAgIFRoaXMgbWlnaHQgYmUgdXNlZCwgZS5nLiBpbiBjb25uZWN0aW9uIHdpdGggdGhlIGNvbW1hbmQgb3B0aW9uLgotCi0gICAgIG5vLXB0eSAgUHJldmVudHMgdHR5IGFsbG9jYXRpb24gKGEgcmVxdWVzdCB0byBhbGxvY2F0ZSBhIHB0eSB3aWxsIGZhaWwpLgotCi0gICAgIG5vLXVzZXItcmMKLSAgICAgICAgICAgICBEaXNhYmxlcyBleGVjdXRpb24gb2Ygfi8uc3NoL3JjLgotCi0gICAgIG5vLVgxMS1mb3J3YXJkaW5nCi0gICAgICAgICAgICAgRm9yYmlkcyBYMTEgZm9yd2FyZGluZyB3aGVuIHRoaXMga2V5IGlzIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgotICAgICAgICAgICAgIEFueSBYMTEgZm9yd2FyZCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLgotCi0gICAgIHBlcm1pdG9wZW49Imhvc3Q6cG9ydCIKLSAgICAgICAgICAgICBMaW1pdCBsb2NhbCBgYHNzaCAtTCcnIHBvcnQgZm9yd2FyZGluZyBzdWNoIHRoYXQgaXQgbWF5IG9ubHkKLSAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC4gIElQdjYgYWRkcmVzc2VzIGNhbiBiZQotICAgICAgICAgICAgIHNwZWNpZmllZCBieSBlbmNsb3NpbmcgdGhlIGFkZHJlc3MgaW4gc3F1YXJlIGJyYWNrZXRzLiAgTXVsdGlwbGUKLSAgICAgICAgICAgICBwZXJtaXRvcGVuIG9wdGlvbnMgbWF5IGJlIGFwcGxpZWQgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIE5vCi0gICAgICAgICAgICAgcGF0dGVybiBtYXRjaGluZyBpcyBwZXJmb3JtZWQgb24gdGhlIHNwZWNpZmllZCBob3N0bmFtZXMsIHRoZXkKLSAgICAgICAgICAgICBtdXN0IGJlIGxpdGVyYWwgZG9tYWlucyBvciBhZGRyZXNzZXMuCi0KLSAgICAgcHJpbmNpcGFscz0icHJpbmNpcGFscyIKLSAgICAgICAgICAgICBPbiBhIGNlcnQtYXV0aG9yaXR5IGxpbmUsIHNwZWNpZmllcyBhbGxvd2VkIHByaW5jaXBhbHMgZm9yCi0gICAgICAgICAgICAgY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4gIEF0IGxlYXN0Ci0gICAgICAgICAgICAgb25lIG5hbWUgZnJvbSB0aGUgbGlzdCBtdXN0IGFwcGVhciBpbiB0aGUgY2VydGlmaWNhdGUncyBsaXN0IG9mCi0gICAgICAgICAgICAgcHJpbmNpcGFscyBmb3IgdGhlIGNlcnRpZmljYXRlIHRvIGJlIGFjY2VwdGVkLiAgVGhpcyBvcHRpb24gaXMKLSAgICAgICAgICAgICBpZ25vcmVkIGZvciBrZXlzIHRoYXQgYXJlIG5vdCBtYXJrZWQgYXMgdHJ1c3RlZCBjZXJ0aWZpY2F0ZQotICAgICAgICAgICAgIHNpZ25lcnMgdXNpbmcgdGhlIGNlcnQtYXV0aG9yaXR5IG9wdGlvbi4KLQotICAgICB0dW5uZWw9Im4iCi0gICAgICAgICAgICAgRm9yY2UgYSB0dW4oNCkgZGV2aWNlIG9uIHRoZSBzZXJ2ZXIuICBXaXRob3V0IHRoaXMgb3B0aW9uLCB0aGUKLSAgICAgICAgICAgICBuZXh0IGF2YWlsYWJsZSBkZXZpY2Ugd2lsbCBiZSB1c2VkIGlmIHRoZSBjbGllbnQgcmVxdWVzdHMgYQotICAgICAgICAgICAgIHR1bm5lbC4KLQotICAgICBBbiBleGFtcGxlIGF1dGhvcml6ZWRfa2V5cyBmaWxlOgotCi0gICAgICAgICMgQ29tbWVudHMgYWxsb3dlZCBhdCBzdGFydCBvZiBsaW5lCi0gICAgICAgIHNzaC1yc2EgQUFBQUIzTnphLi4uTGlQaz09IHVzZXJAZXhhbXBsZS5uZXQKLSAgICAgICAgZnJvbT0iKi5zYWxlcy5leGFtcGxlLm5ldCwhcGMuc2FsZXMuZXhhbXBsZS5uZXQiIHNzaC1yc2EKLSAgICAgICAgQUFBQUIyLi4uMTlRPT0gam9obkBleGFtcGxlLm5ldAotICAgICAgICBjb21tYW5kPSJkdW1wIC9ob21lIixuby1wdHksbm8tcG9ydC1mb3J3YXJkaW5nIHNzaC1kc3MKLSAgICAgICAgQUFBQUMzLi4uNTFSPT0gZXhhbXBsZS5uZXQKLSAgICAgICAgcGVybWl0b3Blbj0iMTkyLjAuMi4xOjgwIixwZXJtaXRvcGVuPSIxOTIuMC4yLjI6MjUiIHNzaC1kc3MKLSAgICAgICAgQUFBQUI1Li4uMjFTPT0KLSAgICAgICAgdHVubmVsPSIwIixjb21tYW5kPSJzaCAvZXRjL25ldHN0YXJ0IHR1bjAiIHNzaC1yc2EgQUFBQS4uLj09Ci0gICAgICAgIGphbmVAZXhhbXBsZS5uZXQKLQotU1NIX0tOT1dOX0hPU1RTIEZJTEUgRk9STUFUCi0gICAgIFRoZSAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMgYW5kIH4vLnNzaC9rbm93bl9ob3N0cyBmaWxlcyBjb250YWluIGhvc3QKLSAgICAgcHVibGljIGtleXMgZm9yIGFsbCBrbm93biBob3N0cy4gIFRoZSBnbG9iYWwgZmlsZSBzaG91bGQgYmUgcHJlcGFyZWQgYnkKLSAgICAgdGhlIGFkbWluaXN0cmF0b3IgKG9wdGlvbmFsKSwgYW5kIHRoZSBwZXItdXNlciBmaWxlIGlzIG1haW50YWluZWQKLSAgICAgYXV0b21hdGljYWxseTogd2hlbmV2ZXIgdGhlIHVzZXIgY29ubmVjdHMgZnJvbSBhbiB1bmtub3duIGhvc3QsIGl0cyBrZXkKLSAgICAgaXMgYWRkZWQgdG8gdGhlIHBlci11c2VyIGZpbGUuCi0KLSAgICAgRWFjaCBsaW5lIGluIHRoZXNlIGZpbGVzIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmllbGRzOiBtYXJrZXJzCi0gICAgIChvcHRpb25hbCksIGhvc3RuYW1lcywgYml0cywgZXhwb25lbnQsIG1vZHVsdXMsIGNvbW1lbnQuICBUaGUgZmllbGRzIGFyZQotICAgICBzZXBhcmF0ZWQgYnkgc3BhY2VzLgotCi0gICAgIFRoZSBtYXJrZXIgaXMgb3B0aW9uYWwsIGJ1dCBpZiBpdCBpcyBwcmVzZW50IHRoZW4gaXQgbXVzdCBiZSBvbmUgb2YKLSAgICAgYGBAY2VydC1hdXRob3JpdHknJywgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbGluZSBjb250YWlucyBhIGNlcnRpZmljYXRpb24KLSAgICAgYXV0aG9yaXR5IChDQSkga2V5LCBvciBgYEByZXZva2VkJycsIHRvIGluZGljYXRlIHRoYXQgdGhlIGtleSBjb250YWluZWQKLSAgICAgb24gdGhlIGxpbmUgaXMgcmV2b2tlZCBhbmQgbXVzdCBub3QgZXZlciBiZSBhY2NlcHRlZC4gIE9ubHkgb25lIG1hcmtlcgotICAgICBzaG91bGQgYmUgdXNlZCBvbiBhIGtleSBsaW5lLgotCi0gICAgIEhvc3RuYW1lcyBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIChgKicgYW5kIGA/JyBhY3QgYXMKLSAgICAgd2lsZGNhcmRzKTsgZWFjaCBwYXR0ZXJuIGluIHR1cm4gaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBjYW5vbmljYWwgaG9zdAotICAgICBuYW1lICh3aGVuIGF1dGhlbnRpY2F0aW5nIGEgY2xpZW50KSBvciBhZ2FpbnN0IHRoZSB1c2VyLXN1cHBsaWVkIG5hbWUKLSAgICAgKHdoZW4gYXV0aGVudGljYXRpbmcgYSBzZXJ2ZXIpLiAgQSBwYXR0ZXJuIG1heSBhbHNvIGJlIHByZWNlZGVkIGJ5IGAhJyB0bwotICAgICBpbmRpY2F0ZSBuZWdhdGlvbjogaWYgdGhlIGhvc3QgbmFtZSBtYXRjaGVzIGEgbmVnYXRlZCBwYXR0ZXJuLCBpdCBpcyBub3QKLSAgICAgYWNjZXB0ZWQgKGJ5IHRoYXQgbGluZSkgZXZlbiBpZiBpdCBtYXRjaGVkIGFub3RoZXIgcGF0dGVybiBvbiB0aGUgbGluZS4KLSAgICAgQSBob3N0bmFtZSBvciBhZGRyZXNzIG1heSBvcHRpb25hbGx5IGJlIGVuY2xvc2VkIHdpdGhpbiBgWycgYW5kIGBdJwotICAgICBicmFja2V0cyB0aGVuIGZvbGxvd2VkIGJ5IGA6JyBhbmQgYSBub24tc3RhbmRhcmQgcG9ydCBudW1iZXIuCi0KLSAgICAgQWx0ZXJuYXRlbHksIGhvc3RuYW1lcyBtYXkgYmUgc3RvcmVkIGluIGEgaGFzaGVkIGZvcm0gd2hpY2ggaGlkZXMgaG9zdAotICAgICBuYW1lcyBhbmQgYWRkcmVzc2VzIHNob3VsZCB0aGUgZmlsZSdzIGNvbnRlbnRzIGJlIGRpc2Nsb3NlZC4gIEhhc2hlZAotICAgICBob3N0bmFtZXMgc3RhcnQgd2l0aCBhIGB8JyBjaGFyYWN0ZXIuICBPbmx5IG9uZSBoYXNoZWQgaG9zdG5hbWUgbWF5Ci0gICAgIGFwcGVhciBvbiBhIHNpbmdsZSBsaW5lIGFuZCBub25lIG9mIHRoZSBhYm92ZSBuZWdhdGlvbiBvciB3aWxkY2FyZAotICAgICBvcGVyYXRvcnMgbWF5IGJlIGFwcGxpZWQuCi0KLSAgICAgQml0cywgZXhwb25lbnQsIGFuZCBtb2R1bHVzIGFyZSB0YWtlbiBkaXJlY3RseSBmcm9tIHRoZSBSU0EgaG9zdCBrZXk7Ci0gICAgIHRoZXkgY2FuIGJlIG9idGFpbmVkLCBmb3IgZXhhbXBsZSwgZnJvbSAvZXRjL3NzaC9zc2hfaG9zdF9rZXkucHViLiAgVGhlCi0gICAgIG9wdGlvbmFsIGNvbW1lbnQgZmllbGQgY29udGludWVzIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGFuZCBpcyBub3QgdXNlZC4KLQotICAgICBMaW5lcyBzdGFydGluZyB3aXRoIGAjJyBhbmQgZW1wdHkgbGluZXMgYXJlIGlnbm9yZWQgYXMgY29tbWVudHMuCi0KLSAgICAgV2hlbiBwZXJmb3JtaW5nIGhvc3QgYXV0aGVudGljYXRpb24sIGF1dGhlbnRpY2F0aW9uIGlzIGFjY2VwdGVkIGlmIGFueQotICAgICBtYXRjaGluZyBsaW5lIGhhcyB0aGUgcHJvcGVyIGtleTsgZWl0aGVyIG9uZSB0aGF0IG1hdGNoZXMgZXhhY3RseSBvciwgaWYKLSAgICAgdGhlIHNlcnZlciBoYXMgcHJlc2VudGVkIGEgY2VydGlmaWNhdGUgZm9yIGF1dGhlbnRpY2F0aW9uLCB0aGUga2V5IG9mIHRoZQotICAgICBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSB0aGF0IHNpZ25lZCB0aGUgY2VydGlmaWNhdGUuICBGb3IgYSBrZXkgdG8gYmUKLSAgICAgdHJ1c3RlZCBhcyBhIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5LCBpdCBtdXN0IHVzZSB0aGUgYGBAY2VydC1hdXRob3JpdHknJwotICAgICBtYXJrZXIgZGVzY3JpYmVkIGFib3ZlLgotCi0gICAgIFRoZSBrbm93biBob3N0cyBmaWxlIGFsc28gcHJvdmlkZXMgYSBmYWNpbGl0eSB0byBtYXJrIGtleXMgYXMgcmV2b2tlZCwKLSAgICAgZm9yIGV4YW1wbGUgd2hlbiBpdCBpcyBrbm93biB0aGF0IHRoZSBhc3NvY2lhdGVkIHByaXZhdGUga2V5IGhhcyBiZWVuCi0gICAgIHN0b2xlbi4gIFJldm9rZWQga2V5cyBhcmUgc3BlY2lmaWVkIGJ5IGluY2x1ZGluZyB0aGUgYGBAcmV2b2tlZCcnIG1hcmtlcgotICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBrZXkgbGluZSwgYW5kIGFyZSBuZXZlciBhY2NlcHRlZCBmb3IKLSAgICAgYXV0aGVudGljYXRpb24gb3IgYXMgY2VydGlmaWNhdGlvbiBhdXRob3JpdGllcywgYnV0IGluc3RlYWQgd2lsbCBwcm9kdWNlCi0gICAgIGEgd2FybmluZyBmcm9tIHNzaCgxKSB3aGVuIHRoZXkgYXJlIGVuY291bnRlcmVkLgotCi0gICAgIEl0IGlzIHBlcm1pc3NpYmxlIChidXQgbm90IHJlY29tbWVuZGVkKSB0byBoYXZlIHNldmVyYWwgbGluZXMgb3IKLSAgICAgZGlmZmVyZW50IGhvc3Qga2V5cyBmb3IgdGhlIHNhbWUgbmFtZXMuICBUaGlzIHdpbGwgaW5ldml0YWJseSBoYXBwZW4gd2hlbgotICAgICBzaG9ydCBmb3JtcyBvZiBob3N0IG5hbWVzIGZyb20gZGlmZmVyZW50IGRvbWFpbnMgYXJlIHB1dCBpbiB0aGUgZmlsZS4gIEl0Ci0gICAgIGlzIHBvc3NpYmxlIHRoYXQgdGhlIGZpbGVzIGNvbnRhaW4gY29uZmxpY3RpbmcgaW5mb3JtYXRpb247Ci0gICAgIGF1dGhlbnRpY2F0aW9uIGlzIGFjY2VwdGVkIGlmIHZhbGlkIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBmcm9tIGVpdGhlcgotICAgICBmaWxlLgotCi0gICAgIE5vdGUgdGhhdCB0aGUgbGluZXMgaW4gdGhlc2UgZmlsZXMgYXJlIHR5cGljYWxseSBodW5kcmVkcyBvZiBjaGFyYWN0ZXJzCi0gICAgIGxvbmcsIGFuZCB5b3UgZGVmaW5pdGVseSBkb24ndCB3YW50IHRvIHR5cGUgaW4gdGhlIGhvc3Qga2V5cyBieSBoYW5kLgotICAgICBSYXRoZXIsIGdlbmVyYXRlIHRoZW0gYnkgYSBzY3JpcHQsIHNzaC1rZXlzY2FuKDEpIG9yIGJ5IHRha2luZwotICAgICAvZXRjL3NzaC9zc2hfaG9zdF9rZXkucHViIGFuZCBhZGRpbmcgdGhlIGhvc3QgbmFtZXMgYXQgdGhlIGZyb250LgotICAgICBzc2gta2V5Z2VuKDEpIGFsc28gb2ZmZXJzIHNvbWUgYmFzaWMgYXV0b21hdGVkIGVkaXRpbmcgZm9yCi0gICAgIH4vLnNzaC9rbm93bl9ob3N0cyBpbmNsdWRpbmcgcmVtb3ZpbmcgaG9zdHMgbWF0Y2hpbmcgYSBob3N0IG5hbWUgYW5kCi0gICAgIGNvbnZlcnRpbmcgYWxsIGhvc3QgbmFtZXMgdG8gdGhlaXIgaGFzaGVkIHJlcHJlc2VudGF0aW9ucy4KLQotICAgICBBbiBleGFtcGxlIHNzaF9rbm93bl9ob3N0cyBmaWxlOgotCi0gICAgICAgICMgQ29tbWVudHMgYWxsb3dlZCBhdCBzdGFydCBvZiBsaW5lCi0gICAgICAgIGNsb3NlbmV0LC4uLiwxOTIuMC4yLjUzIDEwMjQgMzcgMTU5Li4uOTMgY2xvc2VuZXQuZXhhbXBsZS5uZXQKLSAgICAgICAgY3ZzLmV4YW1wbGUubmV0LDE5Mi4wLjIuMTAgc3NoLXJzYSBBQUFBMTIzNC4uLi4uPQotICAgICAgICAjIEEgaGFzaGVkIGhvc3RuYW1lCi0gICAgICAgIHwxfEpmS1RkQmg3ck5iWGtWQVFDUnA0T1FvUGZtST18VVNFQ3IzU1dmMUpVUHNtczVBcWZENVFmeGtNPSBzc2gtcnNhCi0gICAgICAgIEFBQUExMjM0Li4uLi49Ci0gICAgICAgICMgQSByZXZva2VkIGtleQotICAgICAgICBAcmV2b2tlZCAqIHNzaC1yc2EgQUFBQUI1Vy4uLgotICAgICAgICAjIEEgQ0Ega2V5LCBhY2NlcHRlZCBmb3IgYW55IGhvc3QgaW4gKi5teWRvbWFpbi5jb20gb3IgKi5teWRvbWFpbi5vcmcKLSAgICAgICAgQGNlcnQtYXV0aG9yaXR5ICoubXlkb21haW4ub3JnLCoubXlkb21haW4uY29tIHNzaC1yc2EgQUFBQUI1Vy4uLgotCi1GSUxFUwotICAgICB+Ly5odXNobG9naW4KLSAgICAgICAgICAgICBUaGlzIGZpbGUgaXMgdXNlZCB0byBzdXBwcmVzcyBwcmludGluZyB0aGUgbGFzdCBsb2dpbiB0aW1lIGFuZAotICAgICAgICAgICAgIC9ldGMvbW90ZCwgaWYgUHJpbnRMYXN0TG9nIGFuZCBQcmludE1vdGQsIHJlc3BlY3RpdmVseSwgYXJlCi0gICAgICAgICAgICAgZW5hYmxlZC4gIEl0IGRvZXMgbm90IHN1cHByZXNzIHByaW50aW5nIG9mIHRoZSBiYW5uZXIgc3BlY2lmaWVkCi0gICAgICAgICAgICAgYnkgQmFubmVyLgotCi0gICAgIH4vLnJob3N0cwotICAgICAgICAgICAgIFRoaXMgZmlsZSBpcyB1c2VkIGZvciBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIChzZWUgc3NoKDEpIGZvcgotICAgICAgICAgICAgIG1vcmUgaW5mb3JtYXRpb24pLiAgT24gc29tZSBtYWNoaW5lcyB0aGlzIGZpbGUgbWF5IG5lZWQgdG8gYmUKLSAgICAgICAgICAgICB3b3JsZC1yZWFkYWJsZSBpZiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5IGlzIG9uIGFuIE5GUwotICAgICAgICAgICAgIHBhcnRpdGlvbiwgYmVjYXVzZSBzc2hkIHJlYWRzIGl0IGFzIHJvb3QuICBBZGRpdGlvbmFsbHksIHRoaXMKLSAgICAgICAgICAgICBmaWxlIG11c3QgYmUgb3duZWQgYnkgdGhlIHVzZXIsIGFuZCBtdXN0IG5vdCBoYXZlIHdyaXRlCi0gICAgICAgICAgICAgcGVybWlzc2lvbnMgZm9yIGFueW9uZSBlbHNlLiAgVGhlIHJlY29tbWVuZGVkIHBlcm1pc3Npb24gZm9yIG1vc3QKLSAgICAgICAgICAgICBtYWNoaW5lcyBpcyByZWFkL3dyaXRlIGZvciB0aGUgdXNlciwgYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5Ci0gICAgICAgICAgICAgb3RoZXJzLgotCi0gICAgIH4vLnNob3N0cwotICAgICAgICAgICAgIFRoaXMgZmlsZSBpcyB1c2VkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIC5yaG9zdHMsIGJ1dCBhbGxvd3MKLSAgICAgICAgICAgICBob3N0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIHdpdGhvdXQgcGVybWl0dGluZyBsb2dpbiB3aXRoCi0gICAgICAgICAgICAgcmxvZ2luL3JzaC4KLQotICAgICB+Ly5zc2gvCi0gICAgICAgICAgICAgVGhpcyBkaXJlY3RvcnkgaXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gZm9yIGFsbCB1c2VyLXNwZWNpZmljCi0gICAgICAgICAgICAgY29uZmlndXJhdGlvbiBhbmQgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uICBUaGVyZSBpcyBubwotICAgICAgICAgICAgIGdlbmVyYWwgcmVxdWlyZW1lbnQgdG8ga2VlcCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoaXMgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgc2VjcmV0LCBidXQgdGhlIHJlY29tbWVuZGVkIHBlcm1pc3Npb25zIGFyZSByZWFkL3dyaXRlL2V4ZWN1dGUKLSAgICAgICAgICAgICBmb3IgdGhlIHVzZXIsIGFuZCBub3QgYWNjZXNzaWJsZSBieSBvdGhlcnMuCi0KLSAgICAgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cwotICAgICAgICAgICAgIExpc3RzIHRoZSBwdWJsaWMga2V5cyAoRFNBL0VDRFNBL1JTQSkgdGhhdCBjYW4gYmUgdXNlZCBmb3IKLSAgICAgICAgICAgICBsb2dnaW5nIGluIGFzIHRoaXMgdXNlci4gIFRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIGRlc2NyaWJlZAotICAgICAgICAgICAgIGFib3ZlLiAgVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgaXMgbm90IGhpZ2hseSBzZW5zaXRpdmUsIGJ1dCB0aGUKLSAgICAgICAgICAgICByZWNvbW1lbmRlZCBwZXJtaXNzaW9ucyBhcmUgcmVhZC93cml0ZSBmb3IgdGhlIHVzZXIsIGFuZCBub3QKLSAgICAgICAgICAgICBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KLQotICAgICAgICAgICAgIElmIHRoaXMgZmlsZSwgdGhlIH4vLnNzaCBkaXJlY3RvcnksIG9yIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkKLSAgICAgICAgICAgICBhcmUgd3JpdGFibGUgYnkgb3RoZXIgdXNlcnMsIHRoZW4gdGhlIGZpbGUgY291bGQgYmUgbW9kaWZpZWQgb3IKLSAgICAgICAgICAgICByZXBsYWNlZCBieSB1bmF1dGhvcml6ZWQgdXNlcnMuICBJbiB0aGlzIGNhc2UsIHNzaGQgd2lsbCBub3QKLSAgICAgICAgICAgICBhbGxvdyBpdCB0byBiZSB1c2VkIHVubGVzcyB0aGUgU3RyaWN0TW9kZXMgb3B0aW9uIGhhcyBiZWVuIHNldCB0bwotICAgICAgICAgICAgIGBgbm8nJy4KLQotICAgICB+Ly5zc2gvZW52aXJvbm1lbnQKLSAgICAgICAgICAgICBUaGlzIGZpbGUgaXMgcmVhZCBpbnRvIHRoZSBlbnZpcm9ubWVudCBhdCBsb2dpbiAoaWYgaXQgZXhpc3RzKS4KLSAgICAgICAgICAgICBJdCBjYW4gb25seSBjb250YWluIGVtcHR5IGxpbmVzLCBjb21tZW50IGxpbmVzICh0aGF0IHN0YXJ0IHdpdGgKLSAgICAgICAgICAgICBgIycpLCBhbmQgYXNzaWdubWVudCBsaW5lcyBvZiB0aGUgZm9ybSBuYW1lPXZhbHVlLiAgVGhlIGZpbGUKLSAgICAgICAgICAgICBzaG91bGQgYmUgd3JpdGFibGUgb25seSBieSB0aGUgdXNlcjsgaXQgbmVlZCBub3QgYmUgcmVhZGFibGUgYnkKLSAgICAgICAgICAgICBhbnlvbmUgZWxzZS4gIEVudmlyb25tZW50IHByb2Nlc3NpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQKLSAgICAgICAgICAgICBpcyBjb250cm9sbGVkIHZpYSB0aGUgUGVybWl0VXNlckVudmlyb25tZW50IG9wdGlvbi4KLQotICAgICB+Ly5zc2gva25vd25faG9zdHMKLSAgICAgICAgICAgICBDb250YWlucyBhIGxpc3Qgb2YgaG9zdCBrZXlzIGZvciBhbGwgaG9zdHMgdGhlIHVzZXIgaGFzIGxvZ2dlZAotICAgICAgICAgICAgIGludG8gdGhhdCBhcmUgbm90IGFscmVhZHkgaW4gdGhlIHN5c3RlbXdpZGUgbGlzdCBvZiBrbm93biBob3N0Ci0gICAgICAgICAgICAga2V5cy4gIFRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIGRlc2NyaWJlZCBhYm92ZS4gIFRoaXMgZmlsZQotICAgICAgICAgICAgIHNob3VsZCBiZSB3cml0YWJsZSBvbmx5IGJ5IHJvb3QvdGhlIG93bmVyIGFuZCBjYW4sIGJ1dCBuZWVkIG5vdAotICAgICAgICAgICAgIGJlLCB3b3JsZC1yZWFkYWJsZS4KLQotICAgICB+Ly5zc2gvcmMKLSAgICAgICAgICAgICBDb250YWlucyBpbml0aWFsaXphdGlvbiByb3V0aW5lcyB0byBiZSBydW4gYmVmb3JlIHRoZSB1c2VyJ3MgaG9tZQotICAgICAgICAgICAgIGRpcmVjdG9yeSBiZWNvbWVzIGFjY2Vzc2libGUuICBUaGlzIGZpbGUgc2hvdWxkIGJlIHdyaXRhYmxlIG9ubHkKLSAgICAgICAgICAgICBieSB0aGUgdXNlciwgYW5kIG5lZWQgbm90IGJlIHJlYWRhYmxlIGJ5IGFueW9uZSBlbHNlLgotCi0gICAgIC9ldGMvaG9zdHMuYWxsb3cKLSAgICAgL2V0Yy9ob3N0cy5kZW55Ci0gICAgICAgICAgICAgQWNjZXNzIGNvbnRyb2xzIHRoYXQgc2hvdWxkIGJlIGVuZm9yY2VkIGJ5IHRjcC13cmFwcGVycyBhcmUKLSAgICAgICAgICAgICBkZWZpbmVkIGhlcmUuICBGdXJ0aGVyIGRldGFpbHMgYXJlIGRlc2NyaWJlZCBpbiBob3N0c19hY2Nlc3MoNSkuCi0KLSAgICAgL2V0Yy9ob3N0cy5lcXVpdgotICAgICAgICAgICAgIFRoaXMgZmlsZSBpcyBmb3IgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiAoc2VlIHNzaCgxKSkuICBJdAotICAgICAgICAgICAgIHNob3VsZCBvbmx5IGJlIHdyaXRhYmxlIGJ5IHJvb3QuCi0KLSAgICAgL2V0Yy9tb2R1bGkKLSAgICAgICAgICAgICBDb250YWlucyBEaWZmaWUtSGVsbG1hbiBncm91cHMgdXNlZCBmb3IgdGhlICJEaWZmaWUtSGVsbG1hbiBHcm91cAotICAgICAgICAgICAgIEV4Y2hhbmdlIi4gIFRoZSBmaWxlIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gbW9kdWxpKDUpLgotCi0gICAgIC9ldGMvbW90ZAotICAgICAgICAgICAgIFNlZSBtb3RkKDUpLgotCi0gICAgIC9ldGMvbm9sb2dpbgotICAgICAgICAgICAgIElmIHRoaXMgZmlsZSBleGlzdHMsIHNzaGQgcmVmdXNlcyB0byBsZXQgYW55b25lIGV4Y2VwdCByb290IGxvZwotICAgICAgICAgICAgIGluLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFyZSBkaXNwbGF5ZWQgdG8gYW55b25lIHRyeWluZyB0bwotICAgICAgICAgICAgIGxvZyBpbiwgYW5kIG5vbi1yb290IGNvbm5lY3Rpb25zIGFyZSByZWZ1c2VkLiAgVGhlIGZpbGUgc2hvdWxkIGJlCi0gICAgICAgICAgICAgd29ybGQtcmVhZGFibGUuCi0KLSAgICAgL2V0Yy9zaG9zdHMuZXF1aXYKLSAgICAgICAgICAgICBUaGlzIGZpbGUgaXMgdXNlZCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyBob3N0cy5lcXVpdiwgYnV0Ci0gICAgICAgICAgICAgYWxsb3dzIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24gd2l0aG91dCBwZXJtaXR0aW5nIGxvZ2luIHdpdGgKLSAgICAgICAgICAgICBybG9naW4vcnNoLgotCi0gICAgIC9ldGMvc3NoL3NzaF9ob3N0X2tleQotICAgICAvZXRjL3NzaC9zc2hfaG9zdF9kc2Ffa2V5Ci0gICAgIC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleQotICAgICAvZXRjL3NzaC9zc2hfaG9zdF9yc2Ffa2V5Ci0gICAgICAgICAgICAgVGhlc2UgdGhyZWUgZmlsZXMgY29udGFpbiB0aGUgcHJpdmF0ZSBwYXJ0cyBvZiB0aGUgaG9zdCBrZXlzLgotICAgICAgICAgICAgIFRoZXNlIGZpbGVzIHNob3VsZCBvbmx5IGJlIG93bmVkIGJ5IHJvb3QsIHJlYWRhYmxlIG9ubHkgYnkgcm9vdCwKLSAgICAgICAgICAgICBhbmQgbm90IGFjY2Vzc2libGUgdG8gb3RoZXJzLiAgTm90ZSB0aGF0IHNzaGQgZG9lcyBub3Qgc3RhcnQgaWYKLSAgICAgICAgICAgICB0aGVzZSBmaWxlcyBhcmUgZ3JvdXAvd29ybGQtYWNjZXNzaWJsZS4KLQotICAgICAvZXRjL3NzaC9zc2hfaG9zdF9rZXkucHViCi0gICAgIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXkucHViCi0gICAgIC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleS5wdWIKLSAgICAgL2V0Yy9zc2gvc3NoX2hvc3RfcnNhX2tleS5wdWIKLSAgICAgICAgICAgICBUaGVzZSB0aHJlZSBmaWxlcyBjb250YWluIHRoZSBwdWJsaWMgcGFydHMgb2YgdGhlIGhvc3Qga2V5cy4KLSAgICAgICAgICAgICBUaGVzZSBmaWxlcyBzaG91bGQgYmUgd29ybGQtcmVhZGFibGUgYnV0IHdyaXRhYmxlIG9ubHkgYnkgcm9vdC4KLSAgICAgICAgICAgICBUaGVpciBjb250ZW50cyBzaG91bGQgbWF0Y2ggdGhlIHJlc3BlY3RpdmUgcHJpdmF0ZSBwYXJ0cy4gIFRoZXNlCi0gICAgICAgICAgICAgZmlsZXMgYXJlIG5vdCByZWFsbHkgdXNlZCBmb3IgYW55dGhpbmc7IHRoZXkgYXJlIHByb3ZpZGVkIGZvciB0aGUKLSAgICAgICAgICAgICBjb252ZW5pZW5jZSBvZiB0aGUgdXNlciBzbyB0aGVpciBjb250ZW50cyBjYW4gYmUgY29waWVkIHRvIGtub3duCi0gICAgICAgICAgICAgaG9zdHMgZmlsZXMuICBUaGVzZSBmaWxlcyBhcmUgY3JlYXRlZCB1c2luZyBzc2gta2V5Z2VuKDEpLgotCi0gICAgIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cwotICAgICAgICAgICAgIFN5c3RlbXdpZGUgbGlzdCBvZiBrbm93biBob3N0IGtleXMuICBUaGlzIGZpbGUgc2hvdWxkIGJlIHByZXBhcmVkCi0gICAgICAgICAgICAgYnkgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHRvIGNvbnRhaW4gdGhlIHB1YmxpYyBob3N0IGtleXMgb2YKLSAgICAgICAgICAgICBhbGwgbWFjaGluZXMgaW4gdGhlIG9yZ2FuaXphdGlvbi4gIFRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzCi0gICAgICAgICAgICAgZGVzY3JpYmVkIGFib3ZlLiAgVGhpcyBmaWxlIHNob3VsZCBiZSB3cml0YWJsZSBvbmx5IGJ5IHJvb3QvdGhlCi0gICAgICAgICAgICAgb3duZXIgYW5kIHNob3VsZCBiZSB3b3JsZC1yZWFkYWJsZS4KLQotICAgICAvZXRjL3NzaC9zc2hkX2NvbmZpZwotICAgICAgICAgICAgIENvbnRhaW5zIGNvbmZpZ3VyYXRpb24gZGF0YSBmb3Igc3NoZC4gIFRoZSBmaWxlIGZvcm1hdCBhbmQKLSAgICAgICAgICAgICBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGRlc2NyaWJlZCBpbiBzc2hkX2NvbmZpZyg1KS4KLQotICAgICAvZXRjL3NzaC9zc2hyYwotICAgICAgICAgICAgIFNpbWlsYXIgdG8gfi8uc3NoL3JjLCBpdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG1hY2hpbmUtc3BlY2lmaWMKLSAgICAgICAgICAgICBsb2dpbi10aW1lIGluaXRpYWxpemF0aW9ucyBnbG9iYWxseS4gIFRoaXMgZmlsZSBzaG91bGQgYmUKLSAgICAgICAgICAgICB3cml0YWJsZSBvbmx5IGJ5IHJvb3QsIGFuZCBzaG91bGQgYmUgd29ybGQtcmVhZGFibGUuCi0KLSAgICAgL3Zhci9lbXB0eQotICAgICAgICAgICAgIGNocm9vdCgyKSBkaXJlY3RvcnkgdXNlZCBieSBzc2hkIGR1cmluZyBwcml2aWxlZ2Ugc2VwYXJhdGlvbiBpbgotICAgICAgICAgICAgIHRoZSBwcmUtYXV0aGVudGljYXRpb24gcGhhc2UuICBUaGUgZGlyZWN0b3J5IHNob3VsZCBub3QgY29udGFpbgotICAgICAgICAgICAgIGFueSBmaWxlcyBhbmQgbXVzdCBiZSBvd25lZCBieSByb290IGFuZCBub3QgZ3JvdXAgb3Igd29ybGQtCi0gICAgICAgICAgICAgd3JpdGFibGUuCi0KLSAgICAgL3Zhci9ydW4vc3NoZC5waWQKLSAgICAgICAgICAgICBDb250YWlucyB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgc3NoZCBsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zIChpZgotICAgICAgICAgICAgIHRoZXJlIGFyZSBzZXZlcmFsIGRhZW1vbnMgcnVubmluZyBjb25jdXJyZW50bHkgZm9yIGRpZmZlcmVudAotICAgICAgICAgICAgIHBvcnRzLCB0aGlzIGNvbnRhaW5zIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBvbmUgc3RhcnRlZCBsYXN0KS4KLSAgICAgICAgICAgICBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgaXMgbm90IHNlbnNpdGl2ZTsgaXQgY2FuIGJlIHdvcmxkLQotICAgICAgICAgICAgIHJlYWRhYmxlLgotCi1TRUUgQUxTTwotICAgICBzY3AoMSksIHNmdHAoMSksIHNzaCgxKSwgc3NoLWFkZCgxKSwgc3NoLWFnZW50KDEpLCBzc2gta2V5Z2VuKDEpLAotICAgICBzc2gta2V5c2NhbigxKSwgY2hyb290KDIpLCBob3N0c19hY2Nlc3MoNSksIGxvZ2luLmNvbmYoNSksIG1vZHVsaSg1KSwKLSAgICAgc3NoZF9jb25maWcoNSksIGluZXRkKDgpLCBzZnRwLXNlcnZlcig4KQotCi1BVVRIT1JTCi0gICAgIE9wZW5TU0ggaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBhbmQgZnJlZSBzc2ggMS4yLjEyIHJlbGVhc2UgYnkKLSAgICAgVGF0dSBZbG9uZW4uICBBYXJvbiBDYW1wYmVsbCwgQm9iIEJlY2ssIE1hcmt1cyBGcmllZGwsIE5pZWxzIFByb3ZvcywgVGhlbwotICAgICBkZSBSYWFkdCBhbmQgRHVnIFNvbmcgcmVtb3ZlZCBtYW55IGJ1Z3MsIHJlLWFkZGVkIG5ld2VyIGZlYXR1cmVzIGFuZAotICAgICBjcmVhdGVkIE9wZW5TU0guICBNYXJrdXMgRnJpZWRsIGNvbnRyaWJ1dGVkIHRoZSBzdXBwb3J0IGZvciBTU0ggcHJvdG9jb2wKLSAgICAgdmVyc2lvbnMgMS41IGFuZCAyLjAuICBOaWVscyBQcm92b3MgYW5kIE1hcmt1cyBGcmllZGwgY29udHJpYnV0ZWQgc3VwcG9ydAotICAgICBmb3IgcHJpdmlsZWdlIHNlcGFyYXRpb24uCi0KLUNBVkVBVFMKLSAgICAgU3lzdGVtIHNlY3VyaXR5IGlzIG5vdCBpbXByb3ZlZCB1bmxlc3MgcnNoZCwgcmxvZ2luZCwgYW5kIHJleGVjZCBhcmUKLSAgICAgZGlzYWJsZWQgKHRodXMgY29tcGxldGVseSBkaXNhYmxpbmcgcmxvZ2luIGFuZCByc2ggaW50byB0aGUgbWFjaGluZSkuCi0KLU9wZW5CU0QgNS4wICAgICAgICAgICAgICAgICAgICAgQXVndXN0IDIsIDIwMTEgICAgICAgICAgICAgICAgICAgICBPcGVuQlNEIDUuMApkaWZmIC0tZ2l0IGEvc3NoZC44IGIvc3NoZC44CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTFiZTBmLi4wMDAwMDAwCi0tLSBhL3NzaGQuOAorKysgL2Rldi9udWxsCkBAIC0xLDk3OSArMCwwIEBACi0uXCIKLS5cIiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotLlwiIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0uXCIgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLS5cIgotLlwiIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLS5cIiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotLlwiIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLS5cIiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0uXCIgY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotLlwiCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk5IEFhcm9uIENhbXBiZWxsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlbyBkZSBSYWFkdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLS5cIiBhcmUgbWV0OgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotLlwiIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLS5cIiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotLlwiIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLS5cIiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLS5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0uXCIgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0uXCIgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLlwiIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotLlwiIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIKLS5cIiAkT3BlbkJTRDogc3NoZC44LHYgMS4yNjMgMjAxMS8wOC8wMiAwMToyMjoxMSBkam0gRXhwICQKLS5EZCAkTWRvY2RhdGU6IEF1Z3VzdCAyIDIwMTEgJAotLkR0IFNTSEQgOAotLk9zCi0uU2ggTkFNRQotLk5tIHNzaGQKLS5OZCBPcGVuU1NIIFNTSCBkYWVtb24KLS5TaCBTWU5PUFNJUwotLk5tIHNzaGQKLS5CayAtd29yZHMKLS5PcCBGbCA0NkRkZWlxVHQKLS5PcCBGbCBiIEFyIGJpdHMKLS5PcCBGbCBDIEFyIGNvbm5lY3Rpb25fc3BlYwotLk9wIEZsIGMgQXIgaG9zdF9jZXJ0aWZpY2F0ZV9maWxlCi0uT3AgRmwgZiBBciBjb25maWdfZmlsZQotLk9wIEZsIGcgQXIgbG9naW5fZ3JhY2VfdGltZQotLk9wIEZsIGggQXIgaG9zdF9rZXlfZmlsZQotLk9wIEZsIGsgQXIga2V5X2dlbl90aW1lCi0uT3AgRmwgbyBBciBvcHRpb24KLS5PcCBGbCBwIEFyIHBvcnQKLS5PcCBGbCB1IEFyIGxlbgotLkVrCi0uU2ggREVTQ1JJUFRJT04KLS5ObQotKE9wZW5TU0ggRGFlbW9uKSBpcyB0aGUgZGFlbW9uIHByb2dyYW0gZm9yCi0uWHIgc3NoIDEgLgotVG9nZXRoZXIgdGhlc2UgcHJvZ3JhbXMgcmVwbGFjZQotLlhyIHJsb2dpbiAxCi1hbmQKLS5YciByc2ggMSAsCi1hbmQgcHJvdmlkZSBzZWN1cmUgZW5jcnlwdGVkIGNvbW11bmljYXRpb25zIGJldHdlZW4gdHdvIHVudHJ1c3RlZCBob3N0cwotb3ZlciBhbiBpbnNlY3VyZSBuZXR3b3JrLgotLlBwCi0uTm0KLWxpc3RlbnMgZm9yIGNvbm5lY3Rpb25zIGZyb20gY2xpZW50cy4KLUl0IGlzIG5vcm1hbGx5IHN0YXJ0ZWQgYXQgYm9vdCBmcm9tCi0uUGEgL2V0Yy9yYyAuCi1JdCBmb3JrcyBhIG5ldwotZGFlbW9uIGZvciBlYWNoIGluY29taW5nIGNvbm5lY3Rpb24uCi1UaGUgZm9ya2VkIGRhZW1vbnMgaGFuZGxlCi1rZXkgZXhjaGFuZ2UsIGVuY3J5cHRpb24sIGF1dGhlbnRpY2F0aW9uLCBjb21tYW5kIGV4ZWN1dGlvbiwKLWFuZCBkYXRhIGV4Y2hhbmdlLgotLlBwCi0uTm0KLWNhbiBiZSBjb25maWd1cmVkIHVzaW5nIGNvbW1hbmQtbGluZSBvcHRpb25zIG9yIGEgY29uZmlndXJhdGlvbiBmaWxlCi0oYnkgZGVmYXVsdAotLlhyIHNzaGRfY29uZmlnIDUgKSA7Ci1jb21tYW5kLWxpbmUgb3B0aW9ucyBvdmVycmlkZSB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZQotY29uZmlndXJhdGlvbiBmaWxlLgotLk5tCi1yZXJlYWRzIGl0cyBjb25maWd1cmF0aW9uIGZpbGUgd2hlbiBpdCByZWNlaXZlcyBhIGhhbmd1cCBzaWduYWwsCi0uRHYgU0lHSFVQICwKLWJ5IGV4ZWN1dGluZyBpdHNlbGYgd2l0aCB0aGUgbmFtZSBhbmQgb3B0aW9ucyBpdCB3YXMgc3RhcnRlZCB3aXRoLCBlLmcuXCYKLS5QYSAvdXNyL3NiaW4vc3NoZCAuCi0uUHAKLVRoZSBvcHRpb25zIGFyZSBhcyBmb2xsb3dzOgotLkJsIC10YWcgLXdpZHRoIERzCi0uSXQgRmwgNAotRm9yY2VzCi0uTm0KLXRvIHVzZSBJUHY0IGFkZHJlc3NlcyBvbmx5LgotLkl0IEZsIDYKLUZvcmNlcwotLk5tCi10byB1c2UgSVB2NiBhZGRyZXNzZXMgb25seS4KLS5JdCBGbCBiIEFyIGJpdHMKLVNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGVwaGVtZXJhbCBwcm90b2NvbCB2ZXJzaW9uIDEKLXNlcnZlciBrZXkgKGRlZmF1bHQgMTAyNCkuCi0uSXQgRmwgQyBBciBjb25uZWN0aW9uX3NwZWMKLVNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gcGFyYW1ldGVycyB0byB1c2UgZm9yIHRoZQotLkZsIFQKLWV4dGVuZGVkIHRlc3QgbW9kZS4KLUlmIHByb3ZpZGVkLCBhbnkKLS5DbSBNYXRjaAotZGlyZWN0aXZlcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCi10aGF0IHdvdWxkIGFwcGx5IHRvIHRoZSBzcGVjaWZpZWQgdXNlciwgaG9zdCwgYW5kIGFkZHJlc3Mgd2lsbCBiZSBzZXQgYmVmb3JlCi10aGUgY29uZmlndXJhdGlvbiBpcyB3cml0dGVuIHRvIHN0YW5kYXJkIG91dHB1dC4KLVRoZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMgYXJlIHN1cHBsaWVkIGFzIGtleXdvcmQ9dmFsdWUgcGFpcnMuCi1UaGUga2V5d29yZHMgYXJlCi0uRHEgdXNlciAsCi0uRHEgaG9zdCAsCi1hbmQKLS5EcSBhZGRyIC4KLUFsbCBhcmUgcmVxdWlyZWQgYW5kIG1heSBiZSBzdXBwbGllZCBpbiBhbnkgb3JkZXIsIGVpdGhlciB3aXRoIG11bHRpcGxlCi0uRmwgQwotb3B0aW9ucyBvciBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LgotLkl0IEZsIGMgQXIgaG9zdF9jZXJ0aWZpY2F0ZV9maWxlCi1TcGVjaWZpZXMgYSBwYXRoIHRvIGEgY2VydGlmaWNhdGUgZmlsZSB0byBpZGVudGlmeQotLk5tCi1kdXJpbmcga2V5IGV4Y2hhbmdlLgotVGhlIGNlcnRpZmljYXRlIGZpbGUgbXVzdCBtYXRjaCBhIGhvc3Qga2V5IGZpbGUgc3BlY2lmaWVkIHVzaW5nIHRoZQotLkZsIGgKLW9wdGlvbiBvciB0aGUKLS5DbSBIb3N0S2V5Ci1jb25maWd1cmF0aW9uIGRpcmVjdGl2ZS4KLS5JdCBGbCBECi1XaGVuIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwKLS5ObQotd2lsbCBub3QgZGV0YWNoIGFuZCBkb2VzIG5vdCBiZWNvbWUgYSBkYWVtb24uCi1UaGlzIGFsbG93cyBlYXN5IG1vbml0b3Jpbmcgb2YKLS5ObSBzc2hkIC4KLS5JdCBGbCBkCi1EZWJ1ZyBtb2RlLgotVGhlIHNlcnZlciBzZW5kcyB2ZXJib3NlIGRlYnVnIG91dHB1dCB0byBzdGFuZGFyZCBlcnJvciwKLWFuZCBkb2VzIG5vdCBwdXQgaXRzZWxmIGluIHRoZSBiYWNrZ3JvdW5kLgotVGhlIHNlcnZlciBhbHNvIHdpbGwgbm90IGZvcmsgYW5kIHdpbGwgb25seSBwcm9jZXNzIG9uZSBjb25uZWN0aW9uLgotVGhpcyBvcHRpb24gaXMgb25seSBpbnRlbmRlZCBmb3IgZGVidWdnaW5nIGZvciB0aGUgc2VydmVyLgotTXVsdGlwbGUKLS5GbCBkCi1vcHRpb25zIGluY3JlYXNlIHRoZSBkZWJ1Z2dpbmcgbGV2ZWwuCi1NYXhpbXVtIGlzIDMuCi0uSXQgRmwgZQotV2hlbiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsCi0uTm0KLXdpbGwgc2VuZCB0aGUgb3V0cHV0IHRvIHRoZSBzdGFuZGFyZCBlcnJvciBpbnN0ZWFkIG9mIHRoZSBzeXN0ZW0gbG9nLgotLkl0IEZsIGYgQXIgY29uZmlnX2ZpbGUKLVNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotVGhlIGRlZmF1bHQgaXMKLS5QYSAvZXRjL3NzaC9zc2hkX2NvbmZpZyAuCi0uTm0KLXJlZnVzZXMgdG8gc3RhcnQgaWYgdGhlcmUgaXMgbm8gY29uZmlndXJhdGlvbiBmaWxlLgotLkl0IEZsIGcgQXIgbG9naW5fZ3JhY2VfdGltZQotR2l2ZXMgdGhlIGdyYWNlIHRpbWUgZm9yIGNsaWVudHMgdG8gYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMgKGRlZmF1bHQKLTEyMCBzZWNvbmRzKS4KLUlmIHRoZSBjbGllbnQgZmFpbHMgdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyIHdpdGhpbgotdGhpcyBtYW55IHNlY29uZHMsIHRoZSBzZXJ2ZXIgZGlzY29ubmVjdHMgYW5kIGV4aXRzLgotQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyBubyBsaW1pdC4KLS5JdCBGbCBoIEFyIGhvc3Rfa2V5X2ZpbGUKLVNwZWNpZmllcyBhIGZpbGUgZnJvbSB3aGljaCBhIGhvc3Qga2V5IGlzIHJlYWQuCi1UaGlzIG9wdGlvbiBtdXN0IGJlIGdpdmVuIGlmCi0uTm0KLWlzIG5vdCBydW4gYXMgcm9vdCAoYXMgdGhlIG5vcm1hbAotaG9zdCBrZXkgZmlsZXMgYXJlIG5vcm1hbGx5IG5vdCByZWFkYWJsZSBieSBhbnlvbmUgYnV0IHJvb3QpLgotVGhlIGRlZmF1bHQgaXMKLS5QYSAvZXRjL3NzaC9zc2hfaG9zdF9rZXkKLWZvciBwcm90b2NvbCB2ZXJzaW9uIDEsIGFuZAotLlBhIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXkgLAotLlBhIC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleQotYW5kCi0uUGEgL2V0Yy9zc2gvc3NoX2hvc3RfcnNhX2tleQotZm9yIHByb3RvY29sIHZlcnNpb24gMi4KLUl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgaG9zdCBrZXkgZmlsZXMgZm9yCi10aGUgZGlmZmVyZW50IHByb3RvY29sIHZlcnNpb25zIGFuZCBob3N0IGtleSBhbGdvcml0aG1zLgotLkl0IEZsIGkKLVNwZWNpZmllcyB0aGF0Ci0uTm0KLWlzIGJlaW5nIHJ1biBmcm9tCi0uWHIgaW5ldGQgOCAuCi0uTm0KLWlzIG5vcm1hbGx5IG5vdCBydW4KLWZyb20gaW5ldGQgYmVjYXVzZSBpdCBuZWVkcyB0byBnZW5lcmF0ZSB0aGUgc2VydmVyIGtleSBiZWZvcmUgaXQgY2FuCi1yZXNwb25kIHRvIHRoZSBjbGllbnQsIGFuZCB0aGlzIG1heSB0YWtlIHRlbnMgb2Ygc2Vjb25kcy4KLUNsaWVudHMgd291bGQgaGF2ZSB0byB3YWl0IHRvbyBsb25nIGlmIHRoZSBrZXkgd2FzIHJlZ2VuZXJhdGVkIGV2ZXJ5IHRpbWUuCi1Ib3dldmVyLCB3aXRoIHNtYWxsIGtleSBzaXplcyAoZS5nLiA1MTIpIHVzaW5nCi0uTm0KLWZyb20gaW5ldGQgbWF5Ci1iZSBmZWFzaWJsZS4KLS5JdCBGbCBrIEFyIGtleV9nZW5fdGltZQotU3BlY2lmaWVzIGhvdyBvZnRlbiB0aGUgZXBoZW1lcmFsIHByb3RvY29sIHZlcnNpb24gMSBzZXJ2ZXIga2V5IGlzCi1yZWdlbmVyYXRlZCAoZGVmYXVsdCAzNjAwIHNlY29uZHMsIG9yIG9uZSBob3VyKS4KLVRoZSBtb3RpdmF0aW9uIGZvciByZWdlbmVyYXRpbmcgdGhlIGtleSBmYWlybHkKLW9mdGVuIGlzIHRoYXQgdGhlIGtleSBpcyBub3Qgc3RvcmVkIGFueXdoZXJlLCBhbmQgYWZ0ZXIgYWJvdXQgYW4gaG91cgotaXQgYmVjb21lcyBpbXBvc3NpYmxlIHRvIHJlY292ZXIgdGhlIGtleSBmb3IgZGVjcnlwdGluZyBpbnRlcmNlcHRlZAotY29tbXVuaWNhdGlvbnMgZXZlbiBpZiB0aGUgbWFjaGluZSBpcyBjcmFja2VkIGludG8gb3IgcGh5c2ljYWxseQotc2VpemVkLgotQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSBrZXkgd2lsbCBuZXZlciBiZSByZWdlbmVyYXRlZC4KLS5JdCBGbCBvIEFyIG9wdGlvbgotQ2FuIGJlIHVzZWQgdG8gZ2l2ZSBvcHRpb25zIGluIHRoZSBmb3JtYXQgdXNlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotVGhpcyBpcyB1c2VmdWwgZm9yIHNwZWNpZnlpbmcgb3B0aW9ucyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gc2VwYXJhdGUKLWNvbW1hbmQtbGluZSBmbGFnLgotRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgb3B0aW9ucywgYW5kIHRoZWlyIHZhbHVlcywgc2VlCi0uWHIgc3NoZF9jb25maWcgNSAuCi0uSXQgRmwgcCBBciBwb3J0Ci1TcGVjaWZpZXMgdGhlIHBvcnQgb24gd2hpY2ggdGhlIHNlcnZlciBsaXN0ZW5zIGZvciBjb25uZWN0aW9ucwotKGRlZmF1bHQgMjIpLgotTXVsdGlwbGUgcG9ydCBvcHRpb25zIGFyZSBwZXJtaXR0ZWQuCi1Qb3J0cyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB3aXRoIHRoZQotLkNtIFBvcnQKLW9wdGlvbiBhcmUgaWdub3JlZCB3aGVuIGEgY29tbWFuZC1saW5lIHBvcnQgaXMgc3BlY2lmaWVkLgotUG9ydHMgc3BlY2lmaWVkIHVzaW5nIHRoZQotLkNtIExpc3RlbkFkZHJlc3MKLW9wdGlvbiBvdmVycmlkZSBjb21tYW5kLWxpbmUgcG9ydHMuCi0uSXQgRmwgcQotUXVpZXQgbW9kZS4KLU5vdGhpbmcgaXMgc2VudCB0byB0aGUgc3lzdGVtIGxvZy4KLU5vcm1hbGx5IHRoZSBiZWdpbm5pbmcsCi1hdXRoZW50aWNhdGlvbiwgYW5kIHRlcm1pbmF0aW9uIG9mIGVhY2ggY29ubmVjdGlvbiBpcyBsb2dnZWQuCi0uSXQgRmwgVAotRXh0ZW5kZWQgdGVzdCBtb2RlLgotQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsIG91dHB1dCB0aGUgZWZmZWN0aXZlIGNvbmZpZ3VyYXRpb24KLXRvIHN0ZG91dCBhbmQgdGhlbiBleGl0LgotT3B0aW9uYWxseSwKLS5DbSBNYXRjaAotcnVsZXMgbWF5IGJlIGFwcGxpZWQgYnkgc3BlY2lmeWluZyB0aGUgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIHVzaW5nIG9uZSBvciBtb3JlCi0uRmwgQwotb3B0aW9ucy4KLS5JdCBGbCB0Ci1UZXN0IG1vZGUuCi1Pbmx5IGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBzYW5pdHkgb2YgdGhlIGtleXMuCi1UaGlzIGlzIHVzZWZ1bCBmb3IgdXBkYXRpbmcKLS5ObQotcmVsaWFibHkgYXMgY29uZmlndXJhdGlvbiBvcHRpb25zIG1heSBjaGFuZ2UuCi0uSXQgRmwgdSBBciBsZW4KLVRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgZmllbGQKLWluIHRoZQotLkxpIHV0bXAKLXN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSByZW1vdGUgaG9zdCBuYW1lLgotSWYgdGhlIHJlc29sdmVkIGhvc3QgbmFtZSBpcyBsb25nZXIgdGhhbgotLkFyIGxlbiAsCi10aGUgZG90dGVkIGRlY2ltYWwgdmFsdWUgd2lsbCBiZSB1c2VkIGluc3RlYWQuCi1UaGlzIGFsbG93cyBob3N0cyB3aXRoIHZlcnkgbG9uZyBob3N0IG5hbWVzIHRoYXQKLW92ZXJmbG93IHRoaXMgZmllbGQgdG8gc3RpbGwgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KLVNwZWNpZnlpbmcKLS5GbCB1MAotaW5kaWNhdGVzIHRoYXQgb25seSBkb3R0ZWQgZGVjaW1hbCBhZGRyZXNzZXMKLXNob3VsZCBiZSBwdXQgaW50byB0aGUKLS5QYSB1dG1wCi1maWxlLgotLkZsIHUwCi1tYXkgYWxzbyBiZSB1c2VkIHRvIHByZXZlbnQKLS5ObQotZnJvbSBtYWtpbmcgRE5TIHJlcXVlc3RzIHVubGVzcyB0aGUgYXV0aGVudGljYXRpb24KLW1lY2hhbmlzbSBvciBjb25maWd1cmF0aW9uIHJlcXVpcmVzIGl0LgotQXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyB0aGF0IG1heSByZXF1aXJlIEROUyBpbmNsdWRlCi0uQ20gUmhvc3RzUlNBQXV0aGVudGljYXRpb24gLAotLkNtIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uICwKLWFuZCB1c2luZyBhCi0uQ20gZnJvbT0icGF0dGVybi1saXN0Igotb3B0aW9uIGluIGEga2V5IGZpbGUuCi1Db25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCByZXF1aXJlIEROUyBpbmNsdWRlIHVzaW5nIGEKLVVTRVJASE9TVCBwYXR0ZXJuIGluCi0uQ20gQWxsb3dVc2Vycwotb3IKLS5DbSBEZW55VXNlcnMgLgotLkVsCi0uU2ggQVVUSEVOVElDQVRJT04KLVRoZSBPcGVuU1NIIFNTSCBkYWVtb24gc3VwcG9ydHMgU1NIIHByb3RvY29scyAxIGFuZCAyLgotVGhlIGRlZmF1bHQgaXMgdG8gdXNlIHByb3RvY29sIDIgb25seSwKLXRob3VnaCB0aGlzIGNhbiBiZSBjaGFuZ2VkIHZpYSB0aGUKLS5DbSBQcm90b2NvbAotb3B0aW9uIGluCi0uWHIgc3NoZF9jb25maWcgNSAuCi1Qcm90b2NvbCAyIHN1cHBvcnRzIERTQSwgRUNEU0EgYW5kIFJTQSBrZXlzOwotcHJvdG9jb2wgMSBvbmx5IHN1cHBvcnRzIFJTQSBrZXlzLgotRm9yIGJvdGggcHJvdG9jb2xzLAotZWFjaCBob3N0IGhhcyBhIGhvc3Qtc3BlY2lmaWMga2V5LAotbm9ybWFsbHkgMjA0OCBiaXRzLAotdXNlZCB0byBpZGVudGlmeSB0aGUgaG9zdC4KLS5QcAotRm9yd2FyZCBzZWN1cml0eSBmb3IgcHJvdG9jb2wgMSBpcyBwcm92aWRlZCB0aHJvdWdoCi1hbiBhZGRpdGlvbmFsIHNlcnZlciBrZXksCi1ub3JtYWxseSA3NjggYml0cywKLWdlbmVyYXRlZCB3aGVuIHRoZSBzZXJ2ZXIgc3RhcnRzLgotVGhpcyBrZXkgaXMgbm9ybWFsbHkgcmVnZW5lcmF0ZWQgZXZlcnkgaG91ciBpZiBpdCBoYXMgYmVlbiB1c2VkLCBhbmQKLWlzIG5ldmVyIHN0b3JlZCBvbiBkaXNrLgotV2hlbmV2ZXIgYSBjbGllbnQgY29ubmVjdHMsIHRoZSBkYWVtb24gcmVzcG9uZHMgd2l0aCBpdHMgcHVibGljCi1ob3N0IGFuZCBzZXJ2ZXIga2V5cy4KLVRoZSBjbGllbnQgY29tcGFyZXMgdGhlCi1SU0EgaG9zdCBrZXkgYWdhaW5zdCBpdHMgb3duIGRhdGFiYXNlIHRvIHZlcmlmeSB0aGF0IGl0IGhhcyBub3QgY2hhbmdlZC4KLVRoZSBjbGllbnQgdGhlbiBnZW5lcmF0ZXMgYSAyNTYtYml0IHJhbmRvbSBudW1iZXIuCi1JdCBlbmNyeXB0cyB0aGlzCi1yYW5kb20gbnVtYmVyIHVzaW5nIGJvdGggdGhlIGhvc3Qga2V5IGFuZCB0aGUgc2VydmVyIGtleSwgYW5kIHNlbmRzCi10aGUgZW5jcnlwdGVkIG51bWJlciB0byB0aGUgc2VydmVyLgotQm90aCBzaWRlcyB0aGVuIHVzZSB0aGlzCi1yYW5kb20gbnVtYmVyIGFzIGEgc2Vzc2lvbiBrZXkgd2hpY2ggaXMgdXNlZCB0byBlbmNyeXB0IGFsbCBmdXJ0aGVyCi1jb21tdW5pY2F0aW9ucyBpbiB0aGUgc2Vzc2lvbi4KLVRoZSByZXN0IG9mIHRoZSBzZXNzaW9uIGlzIGVuY3J5cHRlZAotdXNpbmcgYSBjb252ZW50aW9uYWwgY2lwaGVyLCBjdXJyZW50bHkgQmxvd2Zpc2ggb3IgM0RFUywgd2l0aCAzREVTCi1iZWluZyB1c2VkIGJ5IGRlZmF1bHQuCi1UaGUgY2xpZW50IHNlbGVjdHMgdGhlIGVuY3J5cHRpb24gYWxnb3JpdGhtCi10byB1c2UgZnJvbSB0aG9zZSBvZmZlcmVkIGJ5IHRoZSBzZXJ2ZXIuCi0uUHAKLUZvciBwcm90b2NvbCAyLAotZm9yd2FyZCBzZWN1cml0eSBpcyBwcm92aWRlZCB0aHJvdWdoIGEgRGlmZmllLUhlbGxtYW4ga2V5IGFncmVlbWVudC4KLVRoaXMga2V5IGFncmVlbWVudCByZXN1bHRzIGluIGEgc2hhcmVkIHNlc3Npb24ga2V5LgotVGhlIHJlc3Qgb2YgdGhlIHNlc3Npb24gaXMgZW5jcnlwdGVkIHVzaW5nIGEgc3ltbWV0cmljIGNpcGhlciwgY3VycmVudGx5Ci0xMjgtYml0IEFFUywgQmxvd2Zpc2gsIDNERVMsIENBU1QxMjgsIEFyY2ZvdXIsIDE5Mi1iaXQgQUVTLCBvciAyNTYtYml0IEFFUy4KLVRoZSBjbGllbnQgc2VsZWN0cyB0aGUgZW5jcnlwdGlvbiBhbGdvcml0aG0KLXRvIHVzZSBmcm9tIHRob3NlIG9mZmVyZWQgYnkgdGhlIHNlcnZlci4KLUFkZGl0aW9uYWxseSwgc2Vzc2lvbiBpbnRlZ3JpdHkgaXMgcHJvdmlkZWQKLXRocm91Z2ggYSBjcnlwdG9ncmFwaGljIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQotKGhtYWMtbWQ1LCBobWFjLXNoYTEsIHVtYWMtNjQsIGhtYWMtcmlwZW1kMTYwLAotaG1hYy1zaGEyLTI1NiBvciBobWFjLXNoYTItNTEyKS4KLS5QcAotRmluYWxseSwgdGhlIHNlcnZlciBhbmQgdGhlIGNsaWVudCBlbnRlciBhbiBhdXRoZW50aWNhdGlvbiBkaWFsb2cuCi1UaGUgY2xpZW50IHRyaWVzIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYgdXNpbmcKLWhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24sCi1wdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uLAotY2hhbGxlbmdlLXJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uLAotb3IgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uCi0uUHAKLVJlZ2FyZGxlc3Mgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUsIHRoZSBhY2NvdW50IGlzIGNoZWNrZWQgdG8KLWVuc3VyZSB0aGF0IGl0IGlzIGFjY2Vzc2libGUuICBBbiBhY2NvdW50IGlzIG5vdCBhY2Nlc3NpYmxlIGlmIGl0IGlzCi1sb2NrZWQsIGxpc3RlZCBpbgotLkNtIERlbnlVc2Vycwotb3IgaXRzIGdyb3VwIGlzIGxpc3RlZCBpbgotLkNtIERlbnlHcm91cHMKLVwmLiAgVGhlIGRlZmluaXRpb24gb2YgYSBsb2NrZWQgYWNjb3VudCBpcyBzeXN0ZW0gZGVwZW5kYW50LiBTb21lIHBsYXRmb3JtcwotaGF2ZSB0aGVpciBvd24gYWNjb3VudCBkYXRhYmFzZSAoZWcgQUlYKSBhbmQgc29tZSBtb2RpZnkgdGhlIHBhc3N3ZCBmaWVsZCAoCi0uUWwgXCYqTEtcJioKLW9uIFNvbGFyaXMgYW5kIFVuaXhXYXJlLAotLlFsIFwmKgotb24gSFAtVVgsIGNvbnRhaW5pbmcKLS5RbCBOb2xvZ2luCi1vbiBUcnU2NCwKLWEgbGVhZGluZwotLlFsIFwmKkxPQ0tFRFwmKgotb24gRnJlZUJTRCBhbmQgYSBsZWFkaW5nCi0uUWwgXCYhCi1vbiBtb3N0IExpbnV4ZXMpLgotSWYgdGhlcmUgaXMgYSByZXF1aXJlbWVudCB0byBkaXNhYmxlIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uCi1mb3IgdGhlIGFjY291bnQgd2hpbGUgYWxsb3dpbmcgc3RpbGwgcHVibGljLWtleSwgdGhlbiB0aGUgcGFzc3dkIGZpZWxkCi1zaG91bGQgYmUgc2V0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZXNlIHZhbHVlcyAoZWcKLS5RbCBOUAotb3IKLS5RbCBcJipOUFwmKgotKS4KLS5QcAotSWYgdGhlIGNsaWVudCBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlcyBpdHNlbGYsIGEgZGlhbG9nIGZvcgotcHJlcGFyaW5nIHRoZSBzZXNzaW9uIGlzIGVudGVyZWQuCi1BdCB0aGlzIHRpbWUgdGhlIGNsaWVudCBtYXkgcmVxdWVzdAotdGhpbmdzIGxpa2UgYWxsb2NhdGluZyBhIHBzZXVkby10dHksIGZvcndhcmRpbmcgWDExIGNvbm5lY3Rpb25zLAotZm9yd2FyZGluZyBUQ1AgY29ubmVjdGlvbnMsIG9yIGZvcndhcmRpbmcgdGhlIGF1dGhlbnRpY2F0aW9uIGFnZW50Ci1jb25uZWN0aW9uIG92ZXIgdGhlIHNlY3VyZSBjaGFubmVsLgotLlBwCi1BZnRlciB0aGlzLCB0aGUgY2xpZW50IGVpdGhlciByZXF1ZXN0cyBhIHNoZWxsIG9yIGV4ZWN1dGlvbiBvZiBhIGNvbW1hbmQuCi1UaGUgc2lkZXMgdGhlbiBlbnRlciBzZXNzaW9uIG1vZGUuCi1JbiB0aGlzIG1vZGUsIGVpdGhlciBzaWRlIG1heSBzZW5kCi1kYXRhIGF0IGFueSB0aW1lLCBhbmQgc3VjaCBkYXRhIGlzIGZvcndhcmRlZCB0by9mcm9tIHRoZSBzaGVsbCBvcgotY29tbWFuZCBvbiB0aGUgc2VydmVyIHNpZGUsIGFuZCB0aGUgdXNlciB0ZXJtaW5hbCBpbiB0aGUgY2xpZW50IHNpZGUuCi0uUHAKLVdoZW4gdGhlIHVzZXIgcHJvZ3JhbSB0ZXJtaW5hdGVzIGFuZCBhbGwgZm9yd2FyZGVkIFgxMSBhbmQgb3RoZXIKLWNvbm5lY3Rpb25zIGhhdmUgYmVlbiBjbG9zZWQsIHRoZSBzZXJ2ZXIgc2VuZHMgY29tbWFuZCBleGl0IHN0YXR1cyB0bwotdGhlIGNsaWVudCwgYW5kIGJvdGggc2lkZXMgZXhpdC4KLS5TaCBMT0dJTiBQUk9DRVNTCi1XaGVuIGEgdXNlciBzdWNjZXNzZnVsbHkgbG9ncyBpbiwKLS5ObQotZG9lcyB0aGUgZm9sbG93aW5nOgotLkJsIC1lbnVtIC1vZmZzZXQgaW5kZW50Ci0uSXQKLUlmIHRoZSBsb2dpbiBpcyBvbiBhIHR0eSwgYW5kIG5vIGNvbW1hbmQgaGFzIGJlZW4gc3BlY2lmaWVkLAotcHJpbnRzIGxhc3QgbG9naW4gdGltZSBhbmQKLS5QYSAvZXRjL21vdGQKLSh1bmxlc3MgcHJldmVudGVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgb3IgYnkKLS5QYSB+Ly5odXNobG9naW4gOwotc2VlIHRoZQotLlN4IEZJTEVTCi1zZWN0aW9uKS4KLS5JdAotSWYgdGhlIGxvZ2luIGlzIG9uIGEgdHR5LCByZWNvcmRzIGxvZ2luIHRpbWUuCi0uSXQKLUNoZWNrcwotLlBhIC9ldGMvbm9sb2dpbiA7Ci1pZiBpdCBleGlzdHMsIHByaW50cyBjb250ZW50cyBhbmQgcXVpdHMKLSh1bmxlc3Mgcm9vdCkuCi0uSXQKLUNoYW5nZXMgdG8gcnVuIHdpdGggbm9ybWFsIHVzZXIgcHJpdmlsZWdlcy4KLS5JdAotU2V0cyB1cCBiYXNpYyBlbnZpcm9ubWVudC4KLS5JdAotUmVhZHMgdGhlIGZpbGUKLS5QYSB+Ly5zc2gvZW52aXJvbm1lbnQgLAotaWYgaXQgZXhpc3RzLCBhbmQgdXNlcnMgYXJlIGFsbG93ZWQgdG8gY2hhbmdlIHRoZWlyIGVudmlyb25tZW50LgotU2VlIHRoZQotLkNtIFBlcm1pdFVzZXJFbnZpcm9ubWVudAotb3B0aW9uIGluCi0uWHIgc3NoZF9jb25maWcgNSAuCi0uSXQKLUNoYW5nZXMgdG8gdXNlcidzIGhvbWUgZGlyZWN0b3J5LgotLkl0Ci1JZgotLlBhIH4vLnNzaC9yYwotZXhpc3RzLCBydW5zIGl0OyBlbHNlIGlmCi0uUGEgL2V0Yy9zc2gvc3NocmMKLWV4aXN0cywgcnVucwotaXQ7IG90aGVyd2lzZSBydW5zIHhhdXRoLgotVGhlCi0uRHEgcmMKLWZpbGVzIGFyZSBnaXZlbiB0aGUgWDExCi1hdXRoZW50aWNhdGlvbiBwcm90b2NvbCBhbmQgY29va2llIGluIHN0YW5kYXJkIGlucHV0LgotU2VlCi0uU3ggU1NIUkMgLAotYmVsb3cuCi0uSXQKLVJ1bnMgdXNlcidzIHNoZWxsIG9yIGNvbW1hbmQuCi0uRWwKLS5TaCBTU0hSQwotSWYgdGhlIGZpbGUKLS5QYSB+Ly5zc2gvcmMKLWV4aXN0cywKLS5YciBzaCAxCi1ydW5zIGl0IGFmdGVyIHJlYWRpbmcgdGhlCi1lbnZpcm9ubWVudCBmaWxlcyBidXQgYmVmb3JlIHN0YXJ0aW5nIHRoZSB1c2VyJ3Mgc2hlbGwgb3IgY29tbWFuZC4KLUl0IG11c3Qgbm90IHByb2R1Y2UgYW55IG91dHB1dCBvbiBzdGRvdXQ7IHN0ZGVyciBtdXN0IGJlIHVzZWQKLWluc3RlYWQuCi1JZiBYMTEgZm9yd2FyZGluZyBpcyBpbiB1c2UsIGl0IHdpbGwgcmVjZWl2ZSB0aGUgInByb3RvIGNvb2tpZSIgcGFpciBpbgotaXRzIHN0YW5kYXJkIGlucHV0IChhbmQKLS5FdiBESVNQTEFZCi1pbiBpdHMgZW52aXJvbm1lbnQpLgotVGhlIHNjcmlwdCBtdXN0IGNhbGwKLS5YciB4YXV0aCAxCi1iZWNhdXNlCi0uTm0KLXdpbGwgbm90IHJ1biB4YXV0aCBhdXRvbWF0aWNhbGx5IHRvIGFkZCBYMTEgY29va2llcy4KLS5QcAotVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIGZpbGUgaXMgdG8gcnVuIGFueSBpbml0aWFsaXphdGlvbiByb3V0aW5lcwotd2hpY2ggbWF5IGJlIG5lZWRlZCBiZWZvcmUgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBiZWNvbWVzCi1hY2Nlc3NpYmxlOyBBRlMgaXMgYSBwYXJ0aWN1bGFyIGV4YW1wbGUgb2Ygc3VjaCBhbiBlbnZpcm9ubWVudC4KLS5QcAotVGhpcyBmaWxlIHdpbGwgcHJvYmFibHkgY29udGFpbiBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUgZm9sbG93ZWQgYnkKLXNvbWV0aGluZyBzaW1pbGFyIHRvOgotLkJkIC1saXRlcmFsIC1vZmZzZXQgM24KLWlmIHJlYWQgcHJvdG8gY29va2llICYmIFsgLW4gIiRESVNQTEFZIiBdOyB0aGVuCi0JaWYgWyBgZWNobyAkRElTUExBWSB8IGN1dCAtYzEtMTBgID0gJ2xvY2FsaG9zdDonIF07IHRoZW4KLQkJIyBYMTFVc2VMb2NhbGhvc3Q9eWVzCi0JCWVjaG8gYWRkIHVuaXg6YGVjaG8gJERJU1BMQVkgfAotCQkgICAgY3V0IC1jMTEtYCAkcHJvdG8gJGNvb2tpZQotCWVsc2UKLQkJIyBYMTFVc2VMb2NhbGhvc3Q9bm8KLQkJZWNobyBhZGQgJERJU1BMQVkgJHByb3RvICRjb29raWUKLQlmaSB8IHhhdXRoIC1xIC0KLWZpCi0uRWQKLS5QcAotSWYgdGhpcyBmaWxlIGRvZXMgbm90IGV4aXN0LAotLlBhIC9ldGMvc3NoL3NzaHJjCi1pcyBydW4sIGFuZCBpZiB0aGF0Ci1kb2VzIG5vdCBleGlzdCBlaXRoZXIsIHhhdXRoIGlzIHVzZWQgdG8gYWRkIHRoZSBjb29raWUuCi0uU2ggQVVUSE9SSVpFRF9LRVlTIEZJTEUgRk9STUFUCi0uQ20gQXV0aG9yaXplZEtleXNGaWxlCi1zcGVjaWZpZXMgdGhlIGZpbGVzIGNvbnRhaW5pbmcgcHVibGljIGtleXMgZm9yCi1wdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uOwotaWYgbm9uZSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzCi0uUGEgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cwotYW5kCi0uUGEgfi8uc3NoL2F1dGhvcml6ZWRfa2V5czIgLgotRWFjaCBsaW5lIG9mIHRoZSBmaWxlIGNvbnRhaW5zIG9uZQota2V5IChlbXB0eSBsaW5lcyBhbmQgbGluZXMgc3RhcnRpbmcgd2l0aCBhCi0uUWwgIwotYXJlIGlnbm9yZWQgYXMKLWNvbW1lbnRzKS4KLVByb3RvY29sIDEgcHVibGljIGtleXMgY29uc2lzdCBvZiB0aGUgZm9sbG93aW5nIHNwYWNlLXNlcGFyYXRlZCBmaWVsZHM6Ci1vcHRpb25zLCBiaXRzLCBleHBvbmVudCwgbW9kdWx1cywgY29tbWVudC4KLVByb3RvY29sIDIgcHVibGljIGtleSBjb25zaXN0IG9mOgotb3B0aW9ucywga2V5dHlwZSwgYmFzZTY0LWVuY29kZWQga2V5LCBjb21tZW50LgotVGhlIG9wdGlvbnMgZmllbGQgaXMgb3B0aW9uYWw7Ci1pdHMgcHJlc2VuY2UgaXMgZGV0ZXJtaW5lZCBieSB3aGV0aGVyIHRoZSBsaW5lIHN0YXJ0cwotd2l0aCBhIG51bWJlciBvciBub3QgKHRoZSBvcHRpb25zIGZpZWxkIG5ldmVyIHN0YXJ0cyB3aXRoIGEgbnVtYmVyKS4KLVRoZSBiaXRzLCBleHBvbmVudCwgbW9kdWx1cywgYW5kIGNvbW1lbnQgZmllbGRzIGdpdmUgdGhlIFJTQSBrZXkgZm9yCi1wcm90b2NvbCB2ZXJzaW9uIDE7IHRoZQotY29tbWVudCBmaWVsZCBpcyBub3QgdXNlZCBmb3IgYW55dGhpbmcgKGJ1dCBtYXkgYmUgY29udmVuaWVudCBmb3IgdGhlCi11c2VyIHRvIGlkZW50aWZ5IHRoZSBrZXkpLgotRm9yIHByb3RvY29sIHZlcnNpb24gMiB0aGUga2V5dHlwZSBpcwotLkRxIGVjZHNhLXNoYTItbmlzdHAyNTYgLAotLkRxIGVjZHNhLXNoYTItbmlzdHAzODQgLAotLkRxIGVjZHNhLXNoYTItbmlzdHA1MjEgLAotLkRxIHNzaC1kc3MKLW9yCi0uRHEgc3NoLXJzYSAuCi0uUHAKLU5vdGUgdGhhdCBsaW5lcyBpbiB0aGlzIGZpbGUgYXJlIHVzdWFsbHkgc2V2ZXJhbCBodW5kcmVkIGJ5dGVzIGxvbmcKLShiZWNhdXNlIG9mIHRoZSBzaXplIG9mIHRoZSBwdWJsaWMga2V5IGVuY29kaW5nKSB1cCB0byBhIGxpbWl0IG9mCi04IGtpbG9ieXRlcywgd2hpY2ggcGVybWl0cyBEU0Ega2V5cyB1cCB0byA4IGtpbG9iaXRzIGFuZCBSU0EKLWtleXMgdXAgdG8gMTYga2lsb2JpdHMuCi1Zb3UgZG9uJ3Qgd2FudCB0byB0eXBlIHRoZW0gaW47IGluc3RlYWQsIGNvcHkgdGhlCi0uUGEgaWRlbnRpdHkucHViICwKLS5QYSBpZF9kc2EucHViICwKLS5QYSBpZF9lY2RzYS5wdWIgLAotb3IgdGhlCi0uUGEgaWRfcnNhLnB1YgotZmlsZSBhbmQgZWRpdCBpdC4KLS5QcAotLk5tCi1lbmZvcmNlcyBhIG1pbmltdW0gUlNBIGtleSBtb2R1bHVzIHNpemUgZm9yIHByb3RvY29sIDEKLWFuZCBwcm90b2NvbCAyIGtleXMgb2YgNzY4IGJpdHMuCi0uUHAKLVRoZSBvcHRpb25zIChpZiBwcmVzZW50KSBjb25zaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBvcHRpb24KLXNwZWNpZmljYXRpb25zLgotTm8gc3BhY2VzIGFyZSBwZXJtaXR0ZWQsIGV4Y2VwdCB3aXRoaW4gZG91YmxlIHF1b3Rlcy4KLVRoZSBmb2xsb3dpbmcgb3B0aW9uIHNwZWNpZmljYXRpb25zIGFyZSBzdXBwb3J0ZWQgKG5vdGUKLXRoYXQgb3B0aW9uIGtleXdvcmRzIGFyZSBjYXNlLWluc2Vuc2l0aXZlKToKLS5CbCAtdGFnIC13aWR0aCBEcwotLkl0IENtIGNlcnQtYXV0aG9yaXR5Ci1TcGVjaWZpZXMgdGhhdCB0aGUgbGlzdGVkIGtleSBpcyBhIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5IChDQSkgdGhhdCBpcwotdHJ1c3RlZCB0byB2YWxpZGF0ZSBzaWduZWQgY2VydGlmaWNhdGVzIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uLgotLlBwCi1DZXJ0aWZpY2F0ZXMgbWF5IGVuY29kZSBhY2Nlc3MgcmVzdHJpY3Rpb25zIHNpbWlsYXIgdG8gdGhlc2Uga2V5IG9wdGlvbnMuCi1JZiBib3RoIGNlcnRpZmljYXRlIHJlc3RyaWN0aW9ucyBhbmQga2V5IG9wdGlvbnMgYXJlIHByZXNlbnQsIHRoZSBtb3N0Ci1yZXN0cmljdGl2ZSB1bmlvbiBvZiB0aGUgdHdvIGlzIGFwcGxpZWQuCi0uSXQgQ20gY29tbWFuZD0iY29tbWFuZCIKLVNwZWNpZmllcyB0aGF0IHRoZSBjb21tYW5kIGlzIGV4ZWN1dGVkIHdoZW5ldmVyIHRoaXMga2V5IGlzIHVzZWQgZm9yCi1hdXRoZW50aWNhdGlvbi4KLVRoZSBjb21tYW5kIHN1cHBsaWVkIGJ5IHRoZSB1c2VyIChpZiBhbnkpIGlzIGlnbm9yZWQuCi1UaGUgY29tbWFuZCBpcyBydW4gb24gYSBwdHkgaWYgdGhlIGNsaWVudCByZXF1ZXN0cyBhIHB0eTsKLW90aGVyd2lzZSBpdCBpcyBydW4gd2l0aG91dCBhIHR0eS4KLUlmIGFuIDgtYml0IGNsZWFuIGNoYW5uZWwgaXMgcmVxdWlyZWQsCi1vbmUgbXVzdCBub3QgcmVxdWVzdCBhIHB0eSBvciBzaG91bGQgc3BlY2lmeQotLkNtIG5vLXB0eSAuCi1BIHF1b3RlIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgY29tbWFuZCBieSBxdW90aW5nIGl0IHdpdGggYSBiYWNrc2xhc2guCi1UaGlzIG9wdGlvbiBtaWdodCBiZSB1c2VmdWwKLXRvIHJlc3RyaWN0IGNlcnRhaW4gcHVibGljIGtleXMgdG8gcGVyZm9ybSBqdXN0IGEgc3BlY2lmaWMgb3BlcmF0aW9uLgotQW4gZXhhbXBsZSBtaWdodCBiZSBhIGtleSB0aGF0IHBlcm1pdHMgcmVtb3RlIGJhY2t1cHMgYnV0IG5vdGhpbmcgZWxzZS4KLU5vdGUgdGhhdCB0aGUgY2xpZW50IG1heSBzcGVjaWZ5IFRDUCBhbmQvb3IgWDExCi1mb3J3YXJkaW5nIHVubGVzcyB0aGV5IGFyZSBleHBsaWNpdGx5IHByb2hpYml0ZWQuCi1UaGUgY29tbWFuZCBvcmlnaW5hbGx5IHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQgaXMgYXZhaWxhYmxlIGluIHRoZQotLkV2IFNTSF9PUklHSU5BTF9DT01NQU5ECi1lbnZpcm9ubWVudCB2YXJpYWJsZS4KLU5vdGUgdGhhdCB0aGlzIG9wdGlvbiBhcHBsaWVzIHRvIHNoZWxsLCBjb21tYW5kIG9yIHN1YnN5c3RlbSBleGVjdXRpb24uCi1BbHNvIG5vdGUgdGhhdCB0aGlzIGNvbW1hbmQgbWF5IGJlIHN1cGVyc2VkZWQgYnkgZWl0aGVyIGEKLS5YciBzc2hkX2NvbmZpZyA1Ci0uQ20gRm9yY2VDb21tYW5kCi1kaXJlY3RpdmUgb3IgYSBjb21tYW5kIGVtYmVkZGVkIGluIGEgY2VydGlmaWNhdGUuCi0uSXQgQ20gZW52aXJvbm1lbnQ9Ik5BTUU9dmFsdWUiCi1TcGVjaWZpZXMgdGhhdCB0aGUgc3RyaW5nIGlzIHRvIGJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudCB3aGVuCi1sb2dnaW5nIGluIHVzaW5nIHRoaXMga2V5LgotRW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCB0aGlzIHdheQotb3ZlcnJpZGUgb3RoZXIgZGVmYXVsdCBlbnZpcm9ubWVudCB2YWx1ZXMuCi1NdWx0aXBsZSBvcHRpb25zIG9mIHRoaXMgdHlwZSBhcmUgcGVybWl0dGVkLgotRW52aXJvbm1lbnQgcHJvY2Vzc2luZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZCBpcwotY29udHJvbGxlZCB2aWEgdGhlCi0uQ20gUGVybWl0VXNlckVudmlyb25tZW50Ci1vcHRpb24uCi1UaGlzIG9wdGlvbiBpcyBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIGlmCi0uQ20gVXNlTG9naW4KLWlzIGVuYWJsZWQuCi0uSXQgQ20gZnJvbT0icGF0dGVybi1saXN0IgotU3BlY2lmaWVzIHRoYXQgaW4gYWRkaXRpb24gdG8gcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiwgZWl0aGVyIHRoZSBjYW5vbmljYWwKLW5hbWUgb2YgdGhlIHJlbW90ZSBob3N0IG9yIGl0cyBJUCBhZGRyZXNzIG11c3QgYmUgcHJlc2VudCBpbiB0aGUKLWNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zLgotU2VlCi0uU3ggUEFUVEVSTlMKLWluCi0uWHIgc3NoX2NvbmZpZyA1Ci1mb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXR0ZXJucy4KLS5QcAotSW4gYWRkaXRpb24gdG8gdGhlIHdpbGRjYXJkIG1hdGNoaW5nIHRoYXQgbWF5IGJlIGFwcGxpZWQgdG8gaG9zdG5hbWVzIG9yCi1hZGRyZXNzZXMsIGEKLS5DbSBmcm9tCi1zdGFuemEgbWF5IG1hdGNoIElQIGFkZHJlc3NlcyB1c2luZyBDSURSIGFkZHJlc3MvbWFza2xlbiBub3RhdGlvbi4KLS5QcAotVGhlIHB1cnBvc2Ugb2YgdGhpcyBvcHRpb24gaXMgdG8gb3B0aW9uYWxseSBpbmNyZWFzZSBzZWN1cml0eTogcHVibGljIGtleQotYXV0aGVudGljYXRpb24gYnkgaXRzZWxmIGRvZXMgbm90IHRydXN0IHRoZSBuZXR3b3JrIG9yIG5hbWUgc2VydmVycyBvcgotYW55dGhpbmcgKGJ1dCB0aGUga2V5KTsgaG93ZXZlciwgaWYgc29tZWJvZHkgc29tZWhvdyBzdGVhbHMgdGhlIGtleSwgdGhlIGtleQotcGVybWl0cyBhbiBpbnRydWRlciB0byBsb2cgaW4gZnJvbSBhbnl3aGVyZSBpbiB0aGUgd29ybGQuCi1UaGlzIGFkZGl0aW9uYWwgb3B0aW9uIG1ha2VzIHVzaW5nIGEgc3RvbGVuIGtleSBtb3JlIGRpZmZpY3VsdCAobmFtZQotc2VydmVycyBhbmQvb3Igcm91dGVycyB3b3VsZCBoYXZlIHRvIGJlIGNvbXByb21pc2VkIGluIGFkZGl0aW9uIHRvCi1qdXN0IHRoZSBrZXkpLgotLkl0IENtIG5vLWFnZW50LWZvcndhcmRpbmcKLUZvcmJpZHMgYXV0aGVudGljYXRpb24gYWdlbnQgZm9yd2FyZGluZyB3aGVuIHRoaXMga2V5IGlzIHVzZWQgZm9yCi1hdXRoZW50aWNhdGlvbi4KLS5JdCBDbSBuby1wb3J0LWZvcndhcmRpbmcKLUZvcmJpZHMgVENQIGZvcndhcmRpbmcgd2hlbiB0aGlzIGtleSBpcyB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4KLUFueSBwb3J0IGZvcndhcmQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCB3aWxsIHJldHVybiBhbiBlcnJvci4KLVRoaXMgbWlnaHQgYmUgdXNlZCwgZS5nLiBpbiBjb25uZWN0aW9uIHdpdGggdGhlCi0uQ20gY29tbWFuZAotb3B0aW9uLgotLkl0IENtIG5vLXB0eQotUHJldmVudHMgdHR5IGFsbG9jYXRpb24gKGEgcmVxdWVzdCB0byBhbGxvY2F0ZSBhIHB0eSB3aWxsIGZhaWwpLgotLkl0IENtIG5vLXVzZXItcmMKLURpc2FibGVzIGV4ZWN1dGlvbiBvZgotLlBhIH4vLnNzaC9yYyAuCi0uSXQgQ20gbm8tWDExLWZvcndhcmRpbmcKLUZvcmJpZHMgWDExIGZvcndhcmRpbmcgd2hlbiB0aGlzIGtleSBpcyB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4KLUFueSBYMTEgZm9yd2FyZCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLgotLkl0IENtIHBlcm1pdG9wZW49Imhvc3Q6cG9ydCIKLUxpbWl0IGxvY2FsCi0uTGkgYGBzc2ggLUwnJwotcG9ydCBmb3J3YXJkaW5nIHN1Y2ggdGhhdCBpdCBtYXkgb25seSBjb25uZWN0IHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQKLXBvcnQuCi1JUHY2IGFkZHJlc3NlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGVuY2xvc2luZyB0aGUgYWRkcmVzcyBpbiBzcXVhcmUgYnJhY2tldHMuCi1NdWx0aXBsZQotLkNtIHBlcm1pdG9wZW4KLW9wdGlvbnMgbWF5IGJlIGFwcGxpZWQgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLU5vIHBhdHRlcm4gbWF0Y2hpbmcgaXMgcGVyZm9ybWVkIG9uIHRoZSBzcGVjaWZpZWQgaG9zdG5hbWVzLAotdGhleSBtdXN0IGJlIGxpdGVyYWwgZG9tYWlucyBvciBhZGRyZXNzZXMuCi0uSXQgQ20gcHJpbmNpcGFscz0icHJpbmNpcGFscyIKLU9uIGEKLS5DbSBjZXJ0LWF1dGhvcml0eQotbGluZSwgc3BlY2lmaWVzIGFsbG93ZWQgcHJpbmNpcGFscyBmb3IgY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24gYXMgYQotY29tbWEtc2VwYXJhdGVkIGxpc3QuCi1BdCBsZWFzdCBvbmUgbmFtZSBmcm9tIHRoZSBsaXN0IG11c3QgYXBwZWFyIGluIHRoZSBjZXJ0aWZpY2F0ZSdzCi1saXN0IG9mIHByaW5jaXBhbHMgZm9yIHRoZSBjZXJ0aWZpY2F0ZSB0byBiZSBhY2NlcHRlZC4KLVRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIGtleXMgdGhhdCBhcmUgbm90IG1hcmtlZCBhcyB0cnVzdGVkIGNlcnRpZmljYXRlCi1zaWduZXJzIHVzaW5nIHRoZQotLkNtIGNlcnQtYXV0aG9yaXR5Ci1vcHRpb24uCi0uSXQgQ20gdHVubmVsPSJuIgotRm9yY2UgYQotLlhyIHR1biA0Ci1kZXZpY2Ugb24gdGhlIHNlcnZlci4KLVdpdGhvdXQgdGhpcyBvcHRpb24sIHRoZSBuZXh0IGF2YWlsYWJsZSBkZXZpY2Ugd2lsbCBiZSB1c2VkIGlmCi10aGUgY2xpZW50IHJlcXVlc3RzIGEgdHVubmVsLgotLkVsCi0uUHAKLUFuIGV4YW1wbGUgYXV0aG9yaXplZF9rZXlzIGZpbGU6Ci0uQmQgLWxpdGVyYWwgLW9mZnNldCAzbgotIyBDb21tZW50cyBhbGxvd2VkIGF0IHN0YXJ0IG9mIGxpbmUKLXNzaC1yc2EgQUFBQUIzTnphLi4uTGlQaz09IHVzZXJAZXhhbXBsZS5uZXQKLWZyb209Iiouc2FsZXMuZXhhbXBsZS5uZXQsIXBjLnNhbGVzLmV4YW1wbGUubmV0IiBzc2gtcnNhCi1BQUFBQjIuLi4xOVE9PSBqb2huQGV4YW1wbGUubmV0Ci1jb21tYW5kPSJkdW1wIC9ob21lIixuby1wdHksbm8tcG9ydC1mb3J3YXJkaW5nIHNzaC1kc3MKLUFBQUFDMy4uLjUxUj09IGV4YW1wbGUubmV0Ci1wZXJtaXRvcGVuPSIxOTIuMC4yLjE6ODAiLHBlcm1pdG9wZW49IjE5Mi4wLjIuMjoyNSIgc3NoLWRzcwotQUFBQUI1Li4uMjFTPT0KLXR1bm5lbD0iMCIsY29tbWFuZD0ic2ggL2V0Yy9uZXRzdGFydCB0dW4wIiBzc2gtcnNhIEFBQUEuLi49PQotamFuZUBleGFtcGxlLm5ldAotLkVkCi0uU2ggU1NIX0tOT1dOX0hPU1RTIEZJTEUgRk9STUFUCi1UaGUKLS5QYSAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMKLWFuZAotLlBhIH4vLnNzaC9rbm93bl9ob3N0cwotZmlsZXMgY29udGFpbiBob3N0IHB1YmxpYyBrZXlzIGZvciBhbGwga25vd24gaG9zdHMuCi1UaGUgZ2xvYmFsIGZpbGUgc2hvdWxkCi1iZSBwcmVwYXJlZCBieSB0aGUgYWRtaW5pc3RyYXRvciAob3B0aW9uYWwpLCBhbmQgdGhlIHBlci11c2VyIGZpbGUgaXMKLW1haW50YWluZWQgYXV0b21hdGljYWxseTogd2hlbmV2ZXIgdGhlIHVzZXIgY29ubmVjdHMgZnJvbSBhbiB1bmtub3duIGhvc3QsCi1pdHMga2V5IGlzIGFkZGVkIHRvIHRoZSBwZXItdXNlciBmaWxlLgotLlBwCi1FYWNoIGxpbmUgaW4gdGhlc2UgZmlsZXMgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6IG1hcmtlcnMgKG9wdGlvbmFsKSwKLWhvc3RuYW1lcywgYml0cywgZXhwb25lbnQsIG1vZHVsdXMsIGNvbW1lbnQuCi1UaGUgZmllbGRzIGFyZSBzZXBhcmF0ZWQgYnkgc3BhY2VzLgotLlBwCi1UaGUgbWFya2VyIGlzIG9wdGlvbmFsLCBidXQgaWYgaXQgaXMgcHJlc2VudCB0aGVuIGl0IG11c3QgYmUgb25lIG9mCi0uRHEgQGNlcnQtYXV0aG9yaXR5ICwKLXRvIGluZGljYXRlIHRoYXQgdGhlIGxpbmUgY29udGFpbnMgYSBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSAoQ0EpIGtleSwKLW9yCi0uRHEgQHJldm9rZWQgLAotdG8gaW5kaWNhdGUgdGhhdCB0aGUga2V5IGNvbnRhaW5lZCBvbiB0aGUgbGluZSBpcyByZXZva2VkIGFuZCBtdXN0IG5vdCBldmVyCi1iZSBhY2NlcHRlZC4KLU9ubHkgb25lIG1hcmtlciBzaG91bGQgYmUgdXNlZCBvbiBhIGtleSBsaW5lLgotLlBwCi1Ib3N0bmFtZXMgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucwotLlBmICggUWwgKgotYW5kCi0uUWwgXCY/Ci1hY3QgYXMKLXdpbGRjYXJkcyk7IGVhY2ggcGF0dGVybiBpbiB0dXJuIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgY2Fub25pY2FsIGhvc3QKLW5hbWUgKHdoZW4gYXV0aGVudGljYXRpbmcgYSBjbGllbnQpIG9yIGFnYWluc3QgdGhlIHVzZXItc3VwcGxpZWQKLW5hbWUgKHdoZW4gYXV0aGVudGljYXRpbmcgYSBzZXJ2ZXIpLgotQSBwYXR0ZXJuIG1heSBhbHNvIGJlIHByZWNlZGVkIGJ5Ci0uUWwgXCYhCi10byBpbmRpY2F0ZSBuZWdhdGlvbjogaWYgdGhlIGhvc3QgbmFtZSBtYXRjaGVzIGEgbmVnYXRlZAotcGF0dGVybiwgaXQgaXMgbm90IGFjY2VwdGVkIChieSB0aGF0IGxpbmUpIGV2ZW4gaWYgaXQgbWF0Y2hlZCBhbm90aGVyCi1wYXR0ZXJuIG9uIHRoZSBsaW5lLgotQSBob3N0bmFtZSBvciBhZGRyZXNzIG1heSBvcHRpb25hbGx5IGJlIGVuY2xvc2VkIHdpdGhpbgotLlFsIFwmWwotYW5kCi0uUWwgXCZdCi1icmFja2V0cyB0aGVuIGZvbGxvd2VkIGJ5Ci0uUWwgXCY6Ci1hbmQgYSBub24tc3RhbmRhcmQgcG9ydCBudW1iZXIuCi0uUHAKLUFsdGVybmF0ZWx5LCBob3N0bmFtZXMgbWF5IGJlIHN0b3JlZCBpbiBhIGhhc2hlZCBmb3JtIHdoaWNoIGhpZGVzIGhvc3QgbmFtZXMKLWFuZCBhZGRyZXNzZXMgc2hvdWxkIHRoZSBmaWxlJ3MgY29udGVudHMgYmUgZGlzY2xvc2VkLgotSGFzaGVkIGhvc3RuYW1lcyBzdGFydCB3aXRoIGEKLS5RbCB8Ci1jaGFyYWN0ZXIuCi1Pbmx5IG9uZSBoYXNoZWQgaG9zdG5hbWUgbWF5IGFwcGVhciBvbiBhIHNpbmdsZSBsaW5lIGFuZCBub25lIG9mIHRoZSBhYm92ZQotbmVnYXRpb24gb3Igd2lsZGNhcmQgb3BlcmF0b3JzIG1heSBiZSBhcHBsaWVkLgotLlBwCi1CaXRzLCBleHBvbmVudCwgYW5kIG1vZHVsdXMgYXJlIHRha2VuIGRpcmVjdGx5IGZyb20gdGhlIFJTQSBob3N0IGtleTsgdGhleQotY2FuIGJlIG9idGFpbmVkLCBmb3IgZXhhbXBsZSwgZnJvbQotLlBhIC9ldGMvc3NoL3NzaF9ob3N0X2tleS5wdWIgLgotVGhlIG9wdGlvbmFsIGNvbW1lbnQgZmllbGQgY29udGludWVzIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGFuZCBpcyBub3QgdXNlZC4KLS5QcAotTGluZXMgc3RhcnRpbmcgd2l0aAotLlFsICMKLWFuZCBlbXB0eSBsaW5lcyBhcmUgaWdub3JlZCBhcyBjb21tZW50cy4KLS5QcAotV2hlbiBwZXJmb3JtaW5nIGhvc3QgYXV0aGVudGljYXRpb24sIGF1dGhlbnRpY2F0aW9uIGlzIGFjY2VwdGVkIGlmIGFueQotbWF0Y2hpbmcgbGluZSBoYXMgdGhlIHByb3BlciBrZXk7IGVpdGhlciBvbmUgdGhhdCBtYXRjaGVzIGV4YWN0bHkgb3IsCi1pZiB0aGUgc2VydmVyIGhhcyBwcmVzZW50ZWQgYSBjZXJ0aWZpY2F0ZSBmb3IgYXV0aGVudGljYXRpb24sIHRoZSBrZXkKLW9mIHRoZSBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSB0aGF0IHNpZ25lZCB0aGUgY2VydGlmaWNhdGUuCi1Gb3IgYSBrZXkgdG8gYmUgdHJ1c3RlZCBhcyBhIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5LCBpdCBtdXN0IHVzZSB0aGUKLS5EcSBAY2VydC1hdXRob3JpdHkKLW1hcmtlciBkZXNjcmliZWQgYWJvdmUuCi0uUHAKLVRoZSBrbm93biBob3N0cyBmaWxlIGFsc28gcHJvdmlkZXMgYSBmYWNpbGl0eSB0byBtYXJrIGtleXMgYXMgcmV2b2tlZCwKLWZvciBleGFtcGxlIHdoZW4gaXQgaXMga25vd24gdGhhdCB0aGUgYXNzb2NpYXRlZCBwcml2YXRlIGtleSBoYXMgYmVlbgotc3RvbGVuLgotUmV2b2tlZCBrZXlzIGFyZSBzcGVjaWZpZWQgYnkgaW5jbHVkaW5nIHRoZQotLkRxIEByZXZva2VkCi1tYXJrZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5IGxpbmUsIGFuZCBhcmUgbmV2ZXIgYWNjZXB0ZWQgZm9yCi1hdXRoZW50aWNhdGlvbiBvciBhcyBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0aWVzLCBidXQgaW5zdGVhZCB3aWxsCi1wcm9kdWNlIGEgd2FybmluZyBmcm9tCi0uWHIgc3NoIDEKLXdoZW4gdGhleSBhcmUgZW5jb3VudGVyZWQuCi0uUHAKLUl0IGlzIHBlcm1pc3NpYmxlIChidXQgbm90Ci1yZWNvbW1lbmRlZCkgdG8gaGF2ZSBzZXZlcmFsIGxpbmVzIG9yIGRpZmZlcmVudCBob3N0IGtleXMgZm9yIHRoZSBzYW1lCi1uYW1lcy4KLVRoaXMgd2lsbCBpbmV2aXRhYmx5IGhhcHBlbiB3aGVuIHNob3J0IGZvcm1zIG9mIGhvc3QgbmFtZXMKLWZyb20gZGlmZmVyZW50IGRvbWFpbnMgYXJlIHB1dCBpbiB0aGUgZmlsZS4KLUl0IGlzIHBvc3NpYmxlCi10aGF0IHRoZSBmaWxlcyBjb250YWluIGNvbmZsaWN0aW5nIGluZm9ybWF0aW9uOyBhdXRoZW50aWNhdGlvbiBpcwotYWNjZXB0ZWQgaWYgdmFsaWQgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGZyb20gZWl0aGVyIGZpbGUuCi0uUHAKLU5vdGUgdGhhdCB0aGUgbGluZXMgaW4gdGhlc2UgZmlsZXMgYXJlIHR5cGljYWxseSBodW5kcmVkcyBvZiBjaGFyYWN0ZXJzCi1sb25nLCBhbmQgeW91IGRlZmluaXRlbHkgZG9uJ3Qgd2FudCB0byB0eXBlIGluIHRoZSBob3N0IGtleXMgYnkgaGFuZC4KLVJhdGhlciwgZ2VuZXJhdGUgdGhlbSBieSBhIHNjcmlwdCwKLS5YciBzc2gta2V5c2NhbiAxCi1vciBieSB0YWtpbmcKLS5QYSAvZXRjL3NzaC9zc2hfaG9zdF9rZXkucHViCi1hbmQgYWRkaW5nIHRoZSBob3N0IG5hbWVzIGF0IHRoZSBmcm9udC4KLS5YciBzc2gta2V5Z2VuIDEKLWFsc28gb2ZmZXJzIHNvbWUgYmFzaWMgYXV0b21hdGVkIGVkaXRpbmcgZm9yCi0uUGEgfi8uc3NoL2tub3duX2hvc3RzCi1pbmNsdWRpbmcgcmVtb3ZpbmcgaG9zdHMgbWF0Y2hpbmcgYSBob3N0IG5hbWUgYW5kIGNvbnZlcnRpbmcgYWxsIGhvc3QKLW5hbWVzIHRvIHRoZWlyIGhhc2hlZCByZXByZXNlbnRhdGlvbnMuCi0uUHAKLUFuIGV4YW1wbGUgc3NoX2tub3duX2hvc3RzIGZpbGU6Ci0uQmQgLWxpdGVyYWwgLW9mZnNldCAzbgotIyBDb21tZW50cyBhbGxvd2VkIGF0IHN0YXJ0IG9mIGxpbmUKLWNsb3NlbmV0LC4uLiwxOTIuMC4yLjUzIDEwMjQgMzcgMTU5Li4uOTMgY2xvc2VuZXQuZXhhbXBsZS5uZXQKLWN2cy5leGFtcGxlLm5ldCwxOTIuMC4yLjEwIHNzaC1yc2EgQUFBQTEyMzQuLi4uLj0KLSMgQSBoYXNoZWQgaG9zdG5hbWUKLXwxfEpmS1RkQmg3ck5iWGtWQVFDUnA0T1FvUGZtST18VVNFQ3IzU1dmMUpVUHNtczVBcWZENVFmeGtNPSBzc2gtcnNhCi1BQUFBMTIzNC4uLi4uPQotIyBBIHJldm9rZWQga2V5Ci1AcmV2b2tlZCAqIHNzaC1yc2EgQUFBQUI1Vy4uLgotIyBBIENBIGtleSwgYWNjZXB0ZWQgZm9yIGFueSBob3N0IGluICoubXlkb21haW4uY29tIG9yICoubXlkb21haW4ub3JnCi1AY2VydC1hdXRob3JpdHkgKi5teWRvbWFpbi5vcmcsKi5teWRvbWFpbi5jb20gc3NoLXJzYSBBQUFBQjVXLi4uCi0uRWQKLS5TaCBGSUxFUwotLkJsIC10YWcgLXdpZHRoIERzIC1jb21wYWN0Ci0uSXQgUGEgfi8uaHVzaGxvZ2luCi1UaGlzIGZpbGUgaXMgdXNlZCB0byBzdXBwcmVzcyBwcmludGluZyB0aGUgbGFzdCBsb2dpbiB0aW1lIGFuZAotLlBhIC9ldGMvbW90ZCAsCi1pZgotLkNtIFByaW50TGFzdExvZwotYW5kCi0uQ20gUHJpbnRNb3RkICwKLXJlc3BlY3RpdmVseSwKLWFyZSBlbmFibGVkLgotSXQgZG9lcyBub3Qgc3VwcHJlc3MgcHJpbnRpbmcgb2YgdGhlIGJhbm5lciBzcGVjaWZpZWQgYnkKLS5DbSBCYW5uZXIgLgotLlBwCi0uSXQgUGEgfi8ucmhvc3RzCi1UaGlzIGZpbGUgaXMgdXNlZCBmb3IgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiAoc2VlCi0uWHIgc3NoIDEKLWZvciBtb3JlIGluZm9ybWF0aW9uKS4KLU9uIHNvbWUgbWFjaGluZXMgdGhpcyBmaWxlIG1heSBuZWVkIHRvIGJlCi13b3JsZC1yZWFkYWJsZSBpZiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5IGlzIG9uIGFuIE5GUyBwYXJ0aXRpb24sCi1iZWNhdXNlCi0uTm0KLXJlYWRzIGl0IGFzIHJvb3QuCi1BZGRpdGlvbmFsbHksIHRoaXMgZmlsZSBtdXN0IGJlIG93bmVkIGJ5IHRoZSB1c2VyLAotYW5kIG11c3Qgbm90IGhhdmUgd3JpdGUgcGVybWlzc2lvbnMgZm9yIGFueW9uZSBlbHNlLgotVGhlIHJlY29tbWVuZGVkCi1wZXJtaXNzaW9uIGZvciBtb3N0IG1hY2hpbmVzIGlzIHJlYWQvd3JpdGUgZm9yIHRoZSB1c2VyLCBhbmQgbm90Ci1hY2Nlc3NpYmxlIGJ5IG90aGVycy4KLS5QcAotLkl0IFBhIH4vLnNob3N0cwotVGhpcyBmaWxlIGlzIHVzZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMKLS5QYSAucmhvc3RzICwKLWJ1dCBhbGxvd3MgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiB3aXRob3V0IHBlcm1pdHRpbmcgbG9naW4gd2l0aAotcmxvZ2luL3JzaC4KLS5QcAotLkl0IFBhIH4vLnNzaC8KLVRoaXMgZGlyZWN0b3J5IGlzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGZvciBhbGwgdXNlci1zcGVjaWZpYyBjb25maWd1cmF0aW9uCi1hbmQgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uCi1UaGVyZSBpcyBubyBnZW5lcmFsIHJlcXVpcmVtZW50IHRvIGtlZXAgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeQotc2VjcmV0LCBidXQgdGhlIHJlY29tbWVuZGVkIHBlcm1pc3Npb25zIGFyZSByZWFkL3dyaXRlL2V4ZWN1dGUgZm9yIHRoZSB1c2VyLAotYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KLS5QcAotLkl0IFBhIH4vLnNzaC9hdXRob3JpemVkX2tleXMKLUxpc3RzIHRoZSBwdWJsaWMga2V5cyAoRFNBL0VDRFNBL1JTQSkgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9nZ2luZyBpbgotYXMgdGhpcyB1c2VyLgotVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgZGVzY3JpYmVkIGFib3ZlLgotVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgaXMgbm90IGhpZ2hseSBzZW5zaXRpdmUsIGJ1dCB0aGUgcmVjb21tZW5kZWQKLXBlcm1pc3Npb25zIGFyZSByZWFkL3dyaXRlIGZvciB0aGUgdXNlciwgYW5kIG5vdCBhY2Nlc3NpYmxlIGJ5IG90aGVycy4KLS5QcAotSWYgdGhpcyBmaWxlLCB0aGUKLS5QYSB+Ly5zc2gKLWRpcmVjdG9yeSwgb3IgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBhcmUgd3JpdGFibGUKLWJ5IG90aGVyIHVzZXJzLCB0aGVuIHRoZSBmaWxlIGNvdWxkIGJlIG1vZGlmaWVkIG9yIHJlcGxhY2VkIGJ5IHVuYXV0aG9yaXplZAotdXNlcnMuCi1JbiB0aGlzIGNhc2UsCi0uTm0KLXdpbGwgbm90IGFsbG93IGl0IHRvIGJlIHVzZWQgdW5sZXNzIHRoZQotLkNtIFN0cmljdE1vZGVzCi1vcHRpb24gaGFzIGJlZW4gc2V0IHRvCi0uRHEgbm8gLgotLlBwCi0uSXQgUGEgfi8uc3NoL2Vudmlyb25tZW50Ci1UaGlzIGZpbGUgaXMgcmVhZCBpbnRvIHRoZSBlbnZpcm9ubWVudCBhdCBsb2dpbiAoaWYgaXQgZXhpc3RzKS4KLUl0IGNhbiBvbmx5IGNvbnRhaW4gZW1wdHkgbGluZXMsIGNvbW1lbnQgbGluZXMgKHRoYXQgc3RhcnQgd2l0aAotLlFsICMgKSAsCi1hbmQgYXNzaWdubWVudCBsaW5lcyBvZiB0aGUgZm9ybSBuYW1lPXZhbHVlLgotVGhlIGZpbGUgc2hvdWxkIGJlIHdyaXRhYmxlCi1vbmx5IGJ5IHRoZSB1c2VyOyBpdCBuZWVkIG5vdCBiZSByZWFkYWJsZSBieSBhbnlvbmUgZWxzZS4KLUVudmlyb25tZW50IHByb2Nlc3NpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgaXMKLWNvbnRyb2xsZWQgdmlhIHRoZQotLkNtIFBlcm1pdFVzZXJFbnZpcm9ubWVudAotb3B0aW9uLgotLlBwCi0uSXQgUGEgfi8uc3NoL2tub3duX2hvc3RzCi1Db250YWlucyBhIGxpc3Qgb2YgaG9zdCBrZXlzIGZvciBhbGwgaG9zdHMgdGhlIHVzZXIgaGFzIGxvZ2dlZCBpbnRvCi10aGF0IGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgc3lzdGVtd2lkZSBsaXN0IG9mIGtub3duIGhvc3Qga2V5cy4KLVRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIGRlc2NyaWJlZCBhYm92ZS4KLVRoaXMgZmlsZSBzaG91bGQgYmUgd3JpdGFibGUgb25seSBieSByb290L3RoZSBvd25lciBhbmQKLWNhbiwgYnV0IG5lZWQgbm90IGJlLCB3b3JsZC1yZWFkYWJsZS4KLS5QcAotLkl0IFBhIH4vLnNzaC9yYwotQ29udGFpbnMgaW5pdGlhbGl6YXRpb24gcm91dGluZXMgdG8gYmUgcnVuIGJlZm9yZQotdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBiZWNvbWVzIGFjY2Vzc2libGUuCi1UaGlzIGZpbGUgc2hvdWxkIGJlIHdyaXRhYmxlIG9ubHkgYnkgdGhlIHVzZXIsIGFuZCBuZWVkIG5vdCBiZQotcmVhZGFibGUgYnkgYW55b25lIGVsc2UuCi0uUHAKLS5JdCBQYSAvZXRjL2hvc3RzLmFsbG93Ci0uSXQgUGEgL2V0Yy9ob3N0cy5kZW55Ci1BY2Nlc3MgY29udHJvbHMgdGhhdCBzaG91bGQgYmUgZW5mb3JjZWQgYnkgdGNwLXdyYXBwZXJzIGFyZSBkZWZpbmVkIGhlcmUuCi1GdXJ0aGVyIGRldGFpbHMgYXJlIGRlc2NyaWJlZCBpbgotLlhyIGhvc3RzX2FjY2VzcyA1IC4KLS5QcAotLkl0IFBhIC9ldGMvaG9zdHMuZXF1aXYKLVRoaXMgZmlsZSBpcyBmb3IgaG9zdC1iYXNlZCBhdXRoZW50aWNhdGlvbiAoc2VlCi0uWHIgc3NoIDEgKSAuCi1JdCBzaG91bGQgb25seSBiZSB3cml0YWJsZSBieSByb290LgotLlBwCi0uSXQgUGEgL2V0Yy9tb2R1bGkKLUNvbnRhaW5zIERpZmZpZS1IZWxsbWFuIGdyb3VwcyB1c2VkIGZvciB0aGUgIkRpZmZpZS1IZWxsbWFuIEdyb3VwIEV4Y2hhbmdlIi4KLVRoZSBmaWxlIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4KLS5YciBtb2R1bGkgNSAuCi0uUHAKLS5JdCBQYSAvZXRjL21vdGQKLVNlZQotLlhyIG1vdGQgNSAuCi0uUHAKLS5JdCBQYSAvZXRjL25vbG9naW4KLUlmIHRoaXMgZmlsZSBleGlzdHMsCi0uTm0KLXJlZnVzZXMgdG8gbGV0IGFueW9uZSBleGNlcHQgcm9vdCBsb2cgaW4uCi1UaGUgY29udGVudHMgb2YgdGhlIGZpbGUKLWFyZSBkaXNwbGF5ZWQgdG8gYW55b25lIHRyeWluZyB0byBsb2cgaW4sIGFuZCBub24tcm9vdCBjb25uZWN0aW9ucyBhcmUKLXJlZnVzZWQuCi1UaGUgZmlsZSBzaG91bGQgYmUgd29ybGQtcmVhZGFibGUuCi0uUHAKLS5JdCBQYSAvZXRjL3Nob3N0cy5lcXVpdgotVGhpcyBmaWxlIGlzIHVzZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMKLS5QYSBob3N0cy5lcXVpdiAsCi1idXQgYWxsb3dzIGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24gd2l0aG91dCBwZXJtaXR0aW5nIGxvZ2luIHdpdGgKLXJsb2dpbi9yc2guCi0uUHAKLS5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9rZXkKLS5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9kc2Ffa2V5Ci0uSXQgUGEgL2V0Yy9zc2gvc3NoX2hvc3RfZWNkc2Ffa2V5Ci0uSXQgUGEgL2V0Yy9zc2gvc3NoX2hvc3RfcnNhX2tleQotVGhlc2UgdGhyZWUgZmlsZXMgY29udGFpbiB0aGUgcHJpdmF0ZSBwYXJ0cyBvZiB0aGUgaG9zdCBrZXlzLgotVGhlc2UgZmlsZXMgc2hvdWxkIG9ubHkgYmUgb3duZWQgYnkgcm9vdCwgcmVhZGFibGUgb25seSBieSByb290LCBhbmQgbm90Ci1hY2Nlc3NpYmxlIHRvIG90aGVycy4KLU5vdGUgdGhhdAotLk5tCi1kb2VzIG5vdCBzdGFydCBpZiB0aGVzZSBmaWxlcyBhcmUgZ3JvdXAvd29ybGQtYWNjZXNzaWJsZS4KLS5QcAotLkl0IFBhIC9ldGMvc3NoL3NzaF9ob3N0X2tleS5wdWIKLS5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9kc2Ffa2V5LnB1YgotLkl0IFBhIC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleS5wdWIKLS5JdCBQYSAvZXRjL3NzaC9zc2hfaG9zdF9yc2Ffa2V5LnB1YgotVGhlc2UgdGhyZWUgZmlsZXMgY29udGFpbiB0aGUgcHVibGljIHBhcnRzIG9mIHRoZSBob3N0IGtleXMuCi1UaGVzZSBmaWxlcyBzaG91bGQgYmUgd29ybGQtcmVhZGFibGUgYnV0IHdyaXRhYmxlIG9ubHkgYnkKLXJvb3QuCi1UaGVpciBjb250ZW50cyBzaG91bGQgbWF0Y2ggdGhlIHJlc3BlY3RpdmUgcHJpdmF0ZSBwYXJ0cy4KLVRoZXNlIGZpbGVzIGFyZSBub3QKLXJlYWxseSB1c2VkIGZvciBhbnl0aGluZzsgdGhleSBhcmUgcHJvdmlkZWQgZm9yIHRoZSBjb252ZW5pZW5jZSBvZgotdGhlIHVzZXIgc28gdGhlaXIgY29udGVudHMgY2FuIGJlIGNvcGllZCB0byBrbm93biBob3N0cyBmaWxlcy4KLVRoZXNlIGZpbGVzIGFyZSBjcmVhdGVkIHVzaW5nCi0uWHIgc3NoLWtleWdlbiAxIC4KLS5QcAotLkl0IFBhIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cwotU3lzdGVtd2lkZSBsaXN0IG9mIGtub3duIGhvc3Qga2V5cy4KLVRoaXMgZmlsZSBzaG91bGQgYmUgcHJlcGFyZWQgYnkgdGhlCi1zeXN0ZW0gYWRtaW5pc3RyYXRvciB0byBjb250YWluIHRoZSBwdWJsaWMgaG9zdCBrZXlzIG9mIGFsbCBtYWNoaW5lcyBpbiB0aGUKLW9yZ2FuaXphdGlvbi4KLVRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIGRlc2NyaWJlZCBhYm92ZS4KLVRoaXMgZmlsZSBzaG91bGQgYmUgd3JpdGFibGUgb25seSBieSByb290L3RoZSBvd25lciBhbmQKLXNob3VsZCBiZSB3b3JsZC1yZWFkYWJsZS4KLS5QcAotLkl0IFBhIC9ldGMvc3NoL3NzaGRfY29uZmlnCi1Db250YWlucyBjb25maWd1cmF0aW9uIGRhdGEgZm9yCi0uTm0gc3NoZCAuCi1UaGUgZmlsZSBmb3JtYXQgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZGVzY3JpYmVkIGluCi0uWHIgc3NoZF9jb25maWcgNSAuCi0uUHAKLS5JdCBQYSAvZXRjL3NzaC9zc2hyYwotU2ltaWxhciB0bwotLlBhIH4vLnNzaC9yYyAsCi1pdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5Ci1tYWNoaW5lLXNwZWNpZmljIGxvZ2luLXRpbWUgaW5pdGlhbGl6YXRpb25zIGdsb2JhbGx5LgotVGhpcyBmaWxlIHNob3VsZCBiZSB3cml0YWJsZSBvbmx5IGJ5IHJvb3QsIGFuZCBzaG91bGQgYmUgd29ybGQtcmVhZGFibGUuCi0uUHAKLS5JdCBQYSAvdmFyL2VtcHR5Ci0uWHIgY2hyb290IDIKLWRpcmVjdG9yeSB1c2VkIGJ5Ci0uTm0KLWR1cmluZyBwcml2aWxlZ2Ugc2VwYXJhdGlvbiBpbiB0aGUgcHJlLWF1dGhlbnRpY2F0aW9uIHBoYXNlLgotVGhlIGRpcmVjdG9yeSBzaG91bGQgbm90IGNvbnRhaW4gYW55IGZpbGVzIGFuZCBtdXN0IGJlIG93bmVkIGJ5IHJvb3QKLWFuZCBub3QgZ3JvdXAgb3Igd29ybGQtd3JpdGFibGUuCi0uUHAKLS5JdCBQYSAvdmFyL3J1bi9zc2hkLnBpZAotQ29udGFpbnMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlCi0uTm0KLWxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMgKGlmIHRoZXJlIGFyZSBzZXZlcmFsIGRhZW1vbnMgcnVubmluZwotY29uY3VycmVudGx5IGZvciBkaWZmZXJlbnQgcG9ydHMsIHRoaXMgY29udGFpbnMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIG9uZQotc3RhcnRlZCBsYXN0KS4KLVRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBpcyBub3Qgc2Vuc2l0aXZlOyBpdCBjYW4gYmUgd29ybGQtcmVhZGFibGUuCi0uRWwKLS5TaCBTRUUgQUxTTwotLlhyIHNjcCAxICwKLS5YciBzZnRwIDEgLAotLlhyIHNzaCAxICwKLS5YciBzc2gtYWRkIDEgLAotLlhyIHNzaC1hZ2VudCAxICwKLS5YciBzc2gta2V5Z2VuIDEgLAotLlhyIHNzaC1rZXlzY2FuIDEgLAotLlhyIGNocm9vdCAyICwKLS5YciBob3N0c19hY2Nlc3MgNSAsCi0uWHIgbG9naW4uY29uZiA1ICwKLS5YciBtb2R1bGkgNSAsCi0uWHIgc3NoZF9jb25maWcgNSAsCi0uWHIgaW5ldGQgOCAsCi0uWHIgc2Z0cC1zZXJ2ZXIgOAotLlNoIEFVVEhPUlMKLU9wZW5TU0ggaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBhbmQgZnJlZQotc3NoIDEuMi4xMiByZWxlYXNlIGJ5IFRhdHUgWWxvbmVuLgotQWFyb24gQ2FtcGJlbGwsIEJvYiBCZWNrLCBNYXJrdXMgRnJpZWRsLCBOaWVscyBQcm92b3MsCi1UaGVvIGRlIFJhYWR0IGFuZCBEdWcgU29uZwotcmVtb3ZlZCBtYW55IGJ1Z3MsIHJlLWFkZGVkIG5ld2VyIGZlYXR1cmVzIGFuZAotY3JlYXRlZCBPcGVuU1NILgotTWFya3VzIEZyaWVkbCBjb250cmlidXRlZCB0aGUgc3VwcG9ydCBmb3IgU1NICi1wcm90b2NvbCB2ZXJzaW9ucyAxLjUgYW5kIDIuMC4KLU5pZWxzIFByb3ZvcyBhbmQgTWFya3VzIEZyaWVkbCBjb250cmlidXRlZCBzdXBwb3J0Ci1mb3IgcHJpdmlsZWdlIHNlcGFyYXRpb24uCi0uU2ggQ0FWRUFUUwotU3lzdGVtIHNlY3VyaXR5IGlzIG5vdCBpbXByb3ZlZCB1bmxlc3MKLS5ObSByc2hkICwKLS5ObSBybG9naW5kICwKLWFuZAotLk5tIHJleGVjZAotYXJlIGRpc2FibGVkICh0aHVzIGNvbXBsZXRlbHkgZGlzYWJsaW5nCi0uWHIgcmxvZ2luCi1hbmQKLS5YciByc2gKLWludG8gdGhlIG1hY2hpbmUpLgpkaWZmIC0tZ2l0IGEvc3NoZC5jIGIvc3NoZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmNlY2VhLi4wMDAwMDAwCi0tLSBhL3NzaGQuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNzMgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNzaGQuYyx2IDEuMzg1IDIwMTEvMDYvMjMgMDk6MzQ6MTMgZGptIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogVGhpcyBwcm9ncmFtIGlzIHRoZSBzc2ggZGFlbW9uLiAgSXQgbGlzdGVucyBmb3IgY29ubmVjdGlvbnMgZnJvbSBjbGllbnRzLAotICogYW5kIHBlcmZvcm1zIGF1dGhlbnRpY2F0aW9uLCBleGVjdXRlcyB1c2UgY29tbWFuZHMgb3Igc2hlbGwsIGFuZCBmb3J3YXJkcwotICogaW5mb3JtYXRpb24gdG8vZnJvbSB0aGUgYXBwbGljYXRpb24gdG8gdGhlIHVzZXIgY2xpZW50IG92ZXIgYW4gZW5jcnlwdGVkCi0gKiBjb25uZWN0aW9uLiAgVGhpcyBjYW4gYWxzbyBoYW5kbGUgZm9yd2FyZGluZyBvZiBYMTEsIFRDUC9JUCwgYW5kCi0gKiBhdXRoZW50aWNhdGlvbiBhZ2VudCBjb25uZWN0aW9ucy4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICoKLSAqIFNTSDIgaW1wbGVtZW50YXRpb246Ci0gKiBQcml2aWxlZ2UgU2VwYXJhdGlvbjoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgTmllbHMgUHJvdm9zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaWZkZWYgSEFWRV9TWVNfU1RBVF9ICi0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19USU1FX0gKLSMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L3N5cy10cmVlLmgiCi0jaW5jbHVkZSAib3BlbmJzZC1jb21wYXQvc3lzLXF1ZXVlLmgiCi0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2lmZGVmIEhBVkVfUEFUSFNfSAotI2luY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxncnAuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgotI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmgiCi0KLSNpZmRlZiBIQVZFX1NFQ1VSRVdBUkUKLSNpbmNsdWRlIDxzeXMvc2VjdXJpdHkuaD4KLSNpbmNsdWRlIDxwcm90Lmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJzc2guaCIKLSNpbmNsdWRlICJzc2gxLmgiCi0jaW5jbHVkZSAic3NoMi5oIgotI2luY2x1ZGUgInJzYS5oIgotI2luY2x1ZGUgInNzaHB0eS5oIgotI2luY2x1ZGUgInBhY2tldC5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgInNlcnZjb25mLmgiCi0jaW5jbHVkZSAidWlkc3dhcC5oIgotI2luY2x1ZGUgImNvbXBhdC5oIgotI2luY2x1ZGUgImNpcGhlci5oIgotI2luY2x1ZGUgImtleS5oIgotI2luY2x1ZGUgImtleC5oIgotI2luY2x1ZGUgImRoLmgiCi0jaW5jbHVkZSAibXlwcm9wb3NhbC5oIgotI2luY2x1ZGUgImF1dGhmaWxlLmgiCi0jaW5jbHVkZSAicGF0aG5hbWVzLmgiCi0jaW5jbHVkZSAiYXRvbWljaW8uaCIKLSNpbmNsdWRlICJjYW5vaG9zdC5oIgotI2luY2x1ZGUgImhvc3RmaWxlLmgiCi0jaW5jbHVkZSAiYXV0aC5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJtc2cuaCIKLSNpbmNsdWRlICJkaXNwYXRjaC5oIgotI2luY2x1ZGUgImNoYW5uZWxzLmgiCi0jaW5jbHVkZSAic2Vzc2lvbi5oIgotI2luY2x1ZGUgIm1vbml0b3JfbW0uaCIKLSNpbmNsdWRlICJtb25pdG9yLmgiCi0jaWZkZWYgR1NTQVBJCi0jaW5jbHVkZSAic3NoLWdzcy5oIgotI2VuZGlmCi0jaW5jbHVkZSAibW9uaXRvcl93cmFwLmgiCi0jaW5jbHVkZSAicm9hbWluZy5oIgotI2luY2x1ZGUgInNzaC1zYW5kYm94LmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0jaWZkZWYgTElCV1JBUAotI2luY2x1ZGUgPHRjcGQuaD4KLSNpbmNsdWRlIDxzeXNsb2cuaD4KLWludCBhbGxvd19zZXZlcml0eTsKLWludCBkZW55X3NldmVyaXR5OwotI2VuZGlmIC8qIExJQldSQVAgKi8KLQotI2lmbmRlZiBPX05PQ1RUWQotI2RlZmluZSBPX05PQ1RUWQkwCi0jZW5kaWYKLQotLyogUmUtZXhlYyBmZHMgKi8KLSNkZWZpbmUgUkVFWEVDX0RFVkNSWVBUT19SRVNFUlZFRF9GRAkoU1RERVJSX0ZJTEVOTyArIDEpCi0jZGVmaW5lIFJFRVhFQ19TVEFSVFVQX1BJUEVfRkQJCShTVERFUlJfRklMRU5PICsgMikKLSNkZWZpbmUgUkVFWEVDX0NPTkZJR19QQVNTX0ZECQkoU1RERVJSX0ZJTEVOTyArIDMpCi0jZGVmaW5lIFJFRVhFQ19NSU5fRlJFRV9GRAkJKFNUREVSUl9GSUxFTk8gKyA0KQotCi1leHRlcm4gY2hhciAqX19wcm9nbmFtZTsKLQotLyogU2VydmVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gKi8KLVNlcnZlck9wdGlvbnMgb3B0aW9uczsKLQotLyogTmFtZSBvZiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZS4gKi8KLWNoYXIgKmNvbmZpZ19maWxlX25hbWUgPSBfUEFUSF9TRVJWRVJfQ09ORklHX0ZJTEU7Ci0KLS8qCi0gKiBEZWJ1ZyBtb2RlIGZsYWcuICBUaGlzIGNhbiBiZSBzZXQgb24gdGhlIGNvbW1hbmQgbGluZS4gIElmIGRlYnVnCi0gKiBtb2RlIGlzIGVuYWJsZWQsIGV4dHJhIGRlYnVnZ2luZyBvdXRwdXQgd2lsbCBiZSBzZW50IHRvIHRoZSBzeXN0ZW0KLSAqIGxvZywgdGhlIGRhZW1vbiB3aWxsIG5vdCBnbyB0byBiYWNrZ3JvdW5kLCBhbmQgd2lsbCBleGl0IGFmdGVyIHByb2Nlc3NpbmcKLSAqIHRoZSBmaXJzdCBjb25uZWN0aW9uLgotICovCi1pbnQgZGVidWdfZmxhZyA9IDA7Ci0KLS8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBkYWVtb24gc2hvdWxkIG9ubHkgdGVzdCB0aGUgY29uZmlndXJhdGlvbiBhbmQga2V5cy4gKi8KLWludCB0ZXN0X2ZsYWcgPSAwOwotCi0vKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgZGFlbW9uIGlzIGJlaW5nIHN0YXJ0ZWQgZnJvbSBpbmV0ZC4gKi8KLWludCBpbmV0ZF9mbGFnID0gMDsKLQotLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgc3NoZCBzaG91bGQgbm90IGRldGFjaCBhbmQgYmVjb21lIGEgZGFlbW9uLiAqLwotaW50IG5vX2RhZW1vbl9mbGFnID0gMDsKLQotLyogZGVidWcgZ29lcyB0byBzdGRlcnIgdW5sZXNzIGluZXRkX2ZsYWcgaXMgc2V0ICovCi1pbnQgbG9nX3N0ZGVyciA9IDA7Ci0KLS8qIFNhdmVkIGFyZ3VtZW50cyB0byBtYWluKCkuICovCi1jaGFyICoqc2F2ZWRfYXJndjsKLWludCBzYXZlZF9hcmdjOwotCi0vKiByZS1leGVjICovCi1pbnQgcmV4ZWNlZF9mbGFnID0gMDsKLWludCByZXhlY19mbGFnID0gMTsKLWludCByZXhlY19hcmdjID0gMDsKLWNoYXIgKipyZXhlY19hcmd2OwotCi0vKgotICogVGhlIHNvY2tldHMgdGhhdCB0aGUgc2VydmVyIGlzIGxpc3RlbmluZzsgdGhpcyBpcyB1c2VkIGluIHRoZSBTSUdIVVAKLSAqIHNpZ25hbCBoYW5kbGVyLgotICovCi0jZGVmaW5lCU1BWF9MSVNURU5fU09DS1MJMTYKLWludCBsaXN0ZW5fc29ja3NbTUFYX0xJU1RFTl9TT0NLU107Ci1pbnQgbnVtX2xpc3Rlbl9zb2NrcyA9IDA7Ci0KLS8qCi0gKiB0aGUgY2xpZW50J3MgdmVyc2lvbiBzdHJpbmcsIHBhc3NlZCBieSBzc2hkMiBpbiBjb21wYXQgbW9kZS4gaWYgIT0gTlVMTCwKLSAqIHNzaGQgd2lsbCBza2lwIHRoZSB2ZXJzaW9uLW51bWJlciBleGNoYW5nZQotICovCi1jaGFyICpjbGllbnRfdmVyc2lvbl9zdHJpbmcgPSBOVUxMOwotY2hhciAqc2VydmVyX3ZlcnNpb25fc3RyaW5nID0gTlVMTDsKLQotLyogZm9yIHJla2V5aW5nIFhYWCBmaXhtZSAqLwotS2V4ICp4eHhfa2V4OwotCi0vKgotICogQW55IHJlYWxseSBzZW5zaXRpdmUgZGF0YSBpbiB0aGUgYXBwbGljYXRpb24gaXMgY29udGFpbmVkIGluIHRoaXMKLSAqIHN0cnVjdHVyZS4gVGhlIGlkZWEgaXMgdGhhdCB0aGlzIHN0cnVjdHVyZSBjb3VsZCBiZSBsb2NrZWQgaW50byBtZW1vcnkgc28KLSAqIHRoYXQgdGhlIHBhZ2VzIGRvIG5vdCBnZXQgd3JpdHRlbiBpbnRvIHN3YXAuICBIb3dldmVyLCB0aGVyZSBhcmUgc29tZQotICogcHJvYmxlbXMuIFRoZSBwcml2YXRlIGtleSBjb250YWlucyBCSUdOVU1zLCBhbmQgd2UgZG8gbm90IChpbiBwcmluY2lwbGUpCi0gKiBoYXZlIGFjY2VzcyB0byB0aGUgaW50ZXJuYWxzIG9mIHRoZW0sIGFuZCBsb2NraW5nIGp1c3QgdGhlIHN0cnVjdHVyZSBpcwotICogbm90IHZlcnkgdXNlZnVsLiAgQ3VycmVudGx5LCBtZW1vcnkgbG9ja2luZyBpcyBub3QgaW1wbGVtZW50ZWQuCi0gKi8KLXN0cnVjdCB7Ci0JS2V5CSpzZXJ2ZXJfa2V5OwkJLyogZXBoZW1lcmFsIHNlcnZlciBrZXkgKi8KLQlLZXkJKnNzaDFfaG9zdF9rZXk7CQkvKiBzc2gxIGhvc3Qga2V5ICovCi0JS2V5CSoqaG9zdF9rZXlzOwkJLyogYWxsIHByaXZhdGUgaG9zdCBrZXlzICovCi0JS2V5CSoqaG9zdF9jZXJ0aWZpY2F0ZXM7CS8qIGFsbCBwdWJsaWMgaG9zdCBjZXJ0aWZpY2F0ZXMgKi8KLQlpbnQJaGF2ZV9zc2gxX2tleTsKLQlpbnQJaGF2ZV9zc2gyX2tleTsKLQl1X2NoYXIJc3NoMV9jb29raWVbU1NIX1NFU1NJT05fS0VZX0xFTkdUSF07Ci19IHNlbnNpdGl2ZV9kYXRhOwotCi0vKgotICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFJTQSBzZXJ2ZXIga2V5IG5lZWRzIHRvIGJlIHJlZ2VuZXJhdGVkLgotICogSXMgc2V0IGluIHRoZSBTSUdBTFJNIGhhbmRsZXIgYW5kIGNsZWFyZWQgd2hlbiB0aGUga2V5IGlzIHJlZ2VuZXJhdGVkLgotICovCi1zdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IGtleV9kb19yZWdlbiA9IDA7Ci0KLS8qIFRoaXMgaXMgc2V0IHRvIHRydWUgd2hlbiBhIHNpZ25hbCBpcyByZWNlaXZlZC4gKi8KLXN0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgcmVjZWl2ZWRfc2lnaHVwID0gMDsKLXN0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgcmVjZWl2ZWRfc2lndGVybSA9IDA7Ci0KLS8qIHNlc3Npb24gaWRlbnRpZmllciwgdXNlZCBieSBSU0EtYXV0aCAqLwotdV9jaGFyIHNlc3Npb25faWRbMTZdOwotCi0vKiBzYW1lIGZvciBzc2gyICovCi11X2NoYXIgKnNlc3Npb25faWQyID0gTlVMTDsKLXVfaW50IHNlc3Npb25faWQyX2xlbiA9IDA7Ci0KLS8qIHJlY29yZCByZW1vdGUgaG9zdG5hbWUgb3IgaXAgKi8KLXVfaW50IHV0bXBfbGVuID0gTUFYSE9TVE5BTUVMRU47Ci0KLS8qIG9wdGlvbnMubWF4X3N0YXJ0dXAgc2l6ZWQgYXJyYXkgb2YgZmQgaW50cyAqLwotaW50ICpzdGFydHVwX3BpcGVzID0gTlVMTDsKLWludCBzdGFydHVwX3BpcGU7CQkvKiBpbiBjaGlsZCAqLwotCi0vKiB2YXJpYWJsZXMgdXNlZCBmb3IgcHJpdmlsZWdlIHNlcGFyYXRpb24gKi8KLWludCB1c2VfcHJpdnNlcCA9IC0xOwotc3RydWN0IG1vbml0b3IgKnBtb25pdG9yID0gTlVMTDsKLQotLyogZ2xvYmFsIGF1dGhlbnRpY2F0aW9uIGNvbnRleHQgKi8KLUF1dGhjdHh0ICp0aGVfYXV0aGN0eHQgPSBOVUxMOwotCi0vKiBzc2hkX2NvbmZpZyBidWZmZXIgKi8KLUJ1ZmZlciBjZmc7Ci0KLS8qIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGFmdGVyIGxvZ2luICovCi1CdWZmZXIgbG9naW5tc2c7Ci0KLS8qIFVucHJpdmlsZWdlZCB1c2VyICovCi1zdHJ1Y3QgcGFzc3dkICpwcml2c2VwX3B3ID0gTlVMTDsKLQotLyogUHJvdG90eXBlcyBmb3IgdmFyaW91cyBmdW5jdGlvbnMgZGVmaW5lZCBsYXRlciBpbiB0aGlzIGZpbGUuICovCi12b2lkIGRlc3Ryb3lfc2Vuc2l0aXZlX2RhdGEodm9pZCk7Ci12b2lkIGRlbW90ZV9zZW5zaXRpdmVfZGF0YSh2b2lkKTsKLQotc3RhdGljIHZvaWQgZG9fc3NoMV9rZXgodm9pZCk7Ci1zdGF0aWMgdm9pZCBkb19zc2gyX2tleCh2b2lkKTsKLQotLyoKLSAqIENsb3NlIGFsbCBsaXN0ZW5pbmcgc29ja2V0cwotICovCi1zdGF0aWMgdm9pZAotY2xvc2VfbGlzdGVuX3NvY2tzKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2xpc3Rlbl9zb2NrczsgaSsrKQotCQljbG9zZShsaXN0ZW5fc29ja3NbaV0pOwotCW51bV9saXN0ZW5fc29ja3MgPSAtMTsKLX0KLQotc3RhdGljIHZvaWQKLWNsb3NlX3N0YXJ0dXBfcGlwZXModm9pZCkKLXsKLQlpbnQgaTsKLQotCWlmIChzdGFydHVwX3BpcGVzKQotCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5tYXhfc3RhcnR1cHM7IGkrKykKLQkJCWlmIChzdGFydHVwX3BpcGVzW2ldICE9IC0xKQotCQkJCWNsb3NlKHN0YXJ0dXBfcGlwZXNbaV0pOwotfQotCi0vKgotICogU2lnbmFsIGhhbmRsZXIgZm9yIFNJR0hVUC4gIFNzaGQgZXhlY3MgaXRzZWxmIHdoZW4gaXQgcmVjZWl2ZXMgU0lHSFVQOwotICogdGhlIGVmZmVjdCBpcyB0byByZXJlYWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAoYW5kIHRvIHJlZ2VuZXJhdGUKLSAqIHRoZSBzZXJ2ZXIga2V5KS4KLSAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1zaWdodXBfaGFuZGxlcihpbnQgc2lnKQotewotCWludCBzYXZlX2Vycm5vID0gZXJybm87Ci0KLQlyZWNlaXZlZF9zaWdodXAgPSAxOwotCXNpZ25hbChTSUdIVVAsIHNpZ2h1cF9oYW5kbGVyKTsKLQllcnJubyA9IHNhdmVfZXJybm87Ci19Ci0KLS8qCi0gKiBDYWxsZWQgZnJvbSB0aGUgbWFpbiBwcm9ncmFtIGFmdGVyIHJlY2VpdmluZyBTSUdIVVAuCi0gKiBSZXN0YXJ0cyB0aGUgc2VydmVyLgotICovCi1zdGF0aWMgdm9pZAotc2lnaHVwX3Jlc3RhcnQodm9pZCkKLXsKLQlsb2dpdCgiUmVjZWl2ZWQgU0lHSFVQOyByZXN0YXJ0aW5nLiIpOwotCWNsb3NlX2xpc3Rlbl9zb2NrcygpOwotCWNsb3NlX3N0YXJ0dXBfcGlwZXMoKTsKLQlhbGFybSgwKTsgIC8qIGFsYXJtIHRpbWVyIHBlcnNpc3RzIGFjcm9zcyBleGVjICovCi0Jc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7IC8qIHdpbGwgYmUgcmVzdG9yZWQgYWZ0ZXIgZXhlYyAqLwotCWV4ZWN2KHNhdmVkX2FyZ3ZbMF0sIHNhdmVkX2FyZ3YpOwotCWxvZ2l0KCJSRVNUQVJUIEZBSUxFRDogYXZbMF09JyUuMTAwcycsIGVycm9yOiAlLjEwMHMuIiwgc2F2ZWRfYXJndlswXSwKLQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQlleGl0KDEpOwotfQotCi0vKgotICogR2VuZXJpYyBzaWduYWwgaGFuZGxlciBmb3IgdGVybWluYXRpbmcgc2lnbmFscyBpbiB0aGUgbWFzdGVyIGRhZW1vbi4KLSAqLwotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotc2lndGVybV9oYW5kbGVyKGludCBzaWcpCi17Ci0JcmVjZWl2ZWRfc2lndGVybSA9IHNpZzsKLX0KLQotLyoKLSAqIFNJR0NITEQgaGFuZGxlci4gIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIGEgY2hpbGQgZGllcy4gIFRoaXMgd2lsbCB0aGVuCi0gKiByZWFwIGFueSB6b21iaWVzIGxlZnQgYnkgZXhpdGVkIGNoaWxkcmVuLgotICovCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1tYWluX3NpZ2NobGRfaGFuZGxlcihpbnQgc2lnKQotewotCWludCBzYXZlX2Vycm5vID0gZXJybm87Ci0JcGlkX3QgcGlkOwotCWludCBzdGF0dXM7Ci0KLQl3aGlsZSAoKHBpZCA9IHdhaXRwaWQoLTEsICZzdGF0dXMsIFdOT0hBTkcpKSA+IDAgfHwKLQkgICAgKHBpZCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpKQotCQk7Ci0KLQlzaWduYWwoU0lHQ0hMRCwgbWFpbl9zaWdjaGxkX2hhbmRsZXIpOwotCWVycm5vID0gc2F2ZV9lcnJubzsKLX0KLQotLyoKLSAqIFNpZ25hbCBoYW5kbGVyIGZvciB0aGUgYWxhcm0gYWZ0ZXIgdGhlIGxvZ2luIGdyYWNlIHBlcmlvZCBoYXMgZXhwaXJlZC4KLSAqLwotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotZ3JhY2VfYWxhcm1faGFuZGxlcihpbnQgc2lnKQotewotCWlmICh1c2VfcHJpdnNlcCAmJiBwbW9uaXRvciAhPSBOVUxMICYmIHBtb25pdG9yLT5tX3BpZCA+IDApCi0JCWtpbGwocG1vbml0b3ItPm1fcGlkLCBTSUdBTFJNKTsKLQotCS8qIExvZyBlcnJvciBhbmQgZXhpdC4gKi8KLQlzaWdkaWUoIlRpbWVvdXQgYmVmb3JlIGF1dGhlbnRpY2F0aW9uIGZvciAlcyIsIGdldF9yZW1vdGVfaXBhZGRyKCkpOwotfQotCi0vKgotICogU2lnbmFsIGhhbmRsZXIgZm9yIHRoZSBrZXkgcmVnZW5lcmF0aW9uIGFsYXJtLiAgTm90ZSB0aGF0IHRoaXMKLSAqIGFsYXJtIG9ubHkgb2NjdXJzIGluIHRoZSBkYWVtb24gd2FpdGluZyBmb3IgY29ubmVjdGlvbnMsIGFuZCBpdCBkb2VzIG5vdAotICogZG8gYW55dGhpbmcgd2l0aCB0aGUgcHJpdmF0ZSBrZXkgb3IgcmFuZG9tIHN0YXRlIGJlZm9yZSBmb3JraW5nLgotICogVGh1cyB0aGVyZSBzaG91bGQgYmUgbm8gY29uY3VycmVuY3kgY29udHJvbC9hc3luY2hyb25vdXMgZXhlY3V0aW9uCi0gKiBwcm9ibGVtcy4KLSAqLwotc3RhdGljIHZvaWQKLWdlbmVyYXRlX2VwaGVtZXJhbF9zZXJ2ZXJfa2V5KHZvaWQpCi17Ci0JdmVyYm9zZSgiR2VuZXJhdGluZyAlcyVkIGJpdCBSU0Ega2V5LiIsCi0JICAgIHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXkgPyAibmV3ICIgOiAiIiwgb3B0aW9ucy5zZXJ2ZXJfa2V5X2JpdHMpOwotCWlmIChzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5ICE9IE5VTEwpCi0JCWtleV9mcmVlKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXkpOwotCXNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXkgPSBrZXlfZ2VuZXJhdGUoS0VZX1JTQTEsCi0JICAgIG9wdGlvbnMuc2VydmVyX2tleV9iaXRzKTsKLQl2ZXJib3NlKCJSU0Ega2V5IGdlbmVyYXRpb24gY29tcGxldGUuIik7Ci0KLQlhcmM0cmFuZG9tX2J1ZihzZW5zaXRpdmVfZGF0YS5zc2gxX2Nvb2tpZSwgU1NIX1NFU1NJT05fS0VZX0xFTkdUSCk7Ci0JYXJjNHJhbmRvbV9zdGlyKCk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWtleV9yZWdlbmVyYXRpb25fYWxhcm0oaW50IHNpZykKLXsKLQlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwotCi0Jc2lnbmFsKFNJR0FMUk0sIFNJR19ERkwpOwotCWVycm5vID0gc2F2ZV9lcnJubzsKLQlrZXlfZG9fcmVnZW4gPSAxOwotfQotCi1zdGF0aWMgdm9pZAotc3NoZF9leGNoYW5nZV9pZGVudGlmaWNhdGlvbihpbnQgc29ja19pbiwgaW50IHNvY2tfb3V0KQotewotCXVfaW50IGk7Ci0JaW50IG1pc21hdGNoOwotCWludCByZW1vdGVfbWFqb3IsIHJlbW90ZV9taW5vcjsKLQlpbnQgbWFqb3IsIG1pbm9yOwotCWNoYXIgKnMsICpuZXdsaW5lID0gIlxuIjsKLQljaGFyIGJ1ZlsyNTZdOwkJCS8qIE11c3Qgbm90IGJlIGxhcmdlciB0aGFuIHJlbW90ZV92ZXJzaW9uLiAqLwotCWNoYXIgcmVtb3RlX3ZlcnNpb25bMjU2XTsJLyogTXVzdCBiZSBhdCBsZWFzdCBhcyBiaWcgYXMgYnVmLiAqLwotCi0JaWYgKChvcHRpb25zLnByb3RvY29sICYgU1NIX1BST1RPXzEpICYmCi0JICAgIChvcHRpb25zLnByb3RvY29sICYgU1NIX1BST1RPXzIpKSB7Ci0JCW1ham9yID0gUFJPVE9DT0xfTUFKT1JfMTsKLQkJbWlub3IgPSA5OTsKLQl9IGVsc2UgaWYgKG9wdGlvbnMucHJvdG9jb2wgJiBTU0hfUFJPVE9fMikgewotCQltYWpvciA9IFBST1RPQ09MX01BSk9SXzI7Ci0JCW1pbm9yID0gUFJPVE9DT0xfTUlOT1JfMjsKLQkJbmV3bGluZSA9ICJcclxuIjsKLQl9IGVsc2UgewotCQltYWpvciA9IFBST1RPQ09MX01BSk9SXzE7Ci0JCW1pbm9yID0gUFJPVE9DT0xfTUlOT1JfMTsKLQl9Ci0Jc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiU1NILSVkLiVkLSUuMTAwcyVzIiwgbWFqb3IsIG1pbm9yLAotCSAgICBTU0hfVkVSU0lPTiwgbmV3bGluZSk7Ci0Jc2VydmVyX3ZlcnNpb25fc3RyaW5nID0geHN0cmR1cChidWYpOwotCi0JLyogU2VuZCBvdXIgcHJvdG9jb2wgdmVyc2lvbiBpZGVudGlmaWNhdGlvbi4gKi8KLQlpZiAocm9hbWluZ19hdG9taWNpbyh2d3JpdGUsIHNvY2tfb3V0LCBzZXJ2ZXJfdmVyc2lvbl9zdHJpbmcsCi0JICAgIHN0cmxlbihzZXJ2ZXJfdmVyc2lvbl9zdHJpbmcpKQotCSAgICAhPSBzdHJsZW4oc2VydmVyX3ZlcnNpb25fc3RyaW5nKSkgewotCQlsb2dpdCgiQ291bGQgbm90IHdyaXRlIGlkZW50IHN0cmluZyB0byAlcyIsIGdldF9yZW1vdGVfaXBhZGRyKCkpOwotCQljbGVhbnVwX2V4aXQoMjU1KTsKLQl9Ci0KLQkvKiBSZWFkIG90aGVyIHNpZGVzIHZlcnNpb24gaWRlbnRpZmljYXRpb24uICovCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnVmKSAtIDE7IGkrKykgewotCQlpZiAocm9hbWluZ19hdG9taWNpbyhyZWFkLCBzb2NrX2luLCAmYnVmW2ldLCAxKSAhPSAxKSB7Ci0JCQlsb2dpdCgiRGlkIG5vdCByZWNlaXZlIGlkZW50aWZpY2F0aW9uIHN0cmluZyBmcm9tICVzIiwKLQkJCSAgICBnZXRfcmVtb3RlX2lwYWRkcigpKTsKLQkJCWNsZWFudXBfZXhpdCgyNTUpOwotCQl9Ci0JCWlmIChidWZbaV0gPT0gJ1xyJykgewotCQkJYnVmW2ldID0gMDsKLQkJCS8qIEtsdWRnZSBmb3IgRi1TZWN1cmUgTWFjaW50b3NoIDwgMS4wLjIgKi8KLQkJCWlmIChpID09IDEyICYmCi0JCQkgICAgc3RybmNtcChidWYsICJTU0gtMS41LVcxLjAiLCAxMikgPT0gMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChidWZbaV0gPT0gJ1xuJykgewotCQkJYnVmW2ldID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKLQljbGllbnRfdmVyc2lvbl9zdHJpbmcgPSB4c3RyZHVwKGJ1Zik7Ci0KLQkvKgotCSAqIENoZWNrIHRoYXQgdGhlIHZlcnNpb25zIG1hdGNoLiAgSW4gZnV0dXJlIHRoaXMgbWlnaHQgYWNjZXB0Ci0JICogc2V2ZXJhbCB2ZXJzaW9ucyBhbmQgc2V0IGFwcHJvcHJpYXRlIGZsYWdzIHRvIGhhbmRsZSB0aGVtLgotCSAqLwotCWlmIChzc2NhbmYoY2xpZW50X3ZlcnNpb25fc3RyaW5nLCAiU1NILSVkLiVkLSVbXlxuXVxuIiwKLQkgICAgJnJlbW90ZV9tYWpvciwgJnJlbW90ZV9taW5vciwgcmVtb3RlX3ZlcnNpb24pICE9IDMpIHsKLQkJcyA9ICJQcm90b2NvbCBtaXNtYXRjaC5cbiI7Ci0JCSh2b2lkKSBhdG9taWNpbyh2d3JpdGUsIHNvY2tfb3V0LCBzLCBzdHJsZW4ocykpOwotCQljbG9zZShzb2NrX2luKTsKLQkJY2xvc2Uoc29ja19vdXQpOwotCQlsb2dpdCgiQmFkIHByb3RvY29sIHZlcnNpb24gaWRlbnRpZmljYXRpb24gJyUuMTAwcycgZnJvbSAlcyIsCi0JCSAgICBjbGllbnRfdmVyc2lvbl9zdHJpbmcsIGdldF9yZW1vdGVfaXBhZGRyKCkpOwotCQljbGVhbnVwX2V4aXQoMjU1KTsKLQl9Ci0JZGVidWcoIkNsaWVudCBwcm90b2NvbCB2ZXJzaW9uICVkLiVkOyBjbGllbnQgc29mdHdhcmUgdmVyc2lvbiAlLjEwMHMiLAotCSAgICByZW1vdGVfbWFqb3IsIHJlbW90ZV9taW5vciwgcmVtb3RlX3ZlcnNpb24pOwotCi0JY29tcGF0X2RhdGFmZWxsb3dzKHJlbW90ZV92ZXJzaW9uKTsKLQotCWlmIChkYXRhZmVsbG93cyAmIFNTSF9CVUdfUFJPQkUpIHsKLQkJbG9naXQoInByb2JlZCBmcm9tICVzIHdpdGggJXMuICBEb24ndCBwYW5pYy4iLAotCQkgICAgZ2V0X3JlbW90ZV9pcGFkZHIoKSwgY2xpZW50X3ZlcnNpb25fc3RyaW5nKTsKLQkJY2xlYW51cF9leGl0KDI1NSk7Ci0JfQotCi0JaWYgKGRhdGFmZWxsb3dzICYgU1NIX0JVR19TQ0FOTkVSKSB7Ci0JCWxvZ2l0KCJzY2FubmVkIGZyb20gJXMgd2l0aCAlcy4gIERvbid0IHBhbmljLiIsCi0JCSAgICBnZXRfcmVtb3RlX2lwYWRkcigpLCBjbGllbnRfdmVyc2lvbl9zdHJpbmcpOwotCQljbGVhbnVwX2V4aXQoMjU1KTsKLQl9Ci0KLQltaXNtYXRjaCA9IDA7Ci0Jc3dpdGNoIChyZW1vdGVfbWFqb3IpIHsKLQljYXNlIDE6Ci0JCWlmIChyZW1vdGVfbWlub3IgPT0gOTkpIHsKLQkJCWlmIChvcHRpb25zLnByb3RvY29sICYgU1NIX1BST1RPXzIpCi0JCQkJZW5hYmxlX2NvbXBhdDIwKCk7Ci0JCQllbHNlCi0JCQkJbWlzbWF0Y2ggPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCEob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18xKSkgewotCQkJbWlzbWF0Y2ggPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHJlbW90ZV9taW5vciA8IDMpIHsKLQkJCXBhY2tldF9kaXNjb25uZWN0KCJZb3VyIHNzaCB2ZXJzaW9uIGlzIHRvbyBvbGQgYW5kICIKLQkJCSAgICAiaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIFBsZWFzZSBpbnN0YWxsIGEgbmV3ZXIgdmVyc2lvbi4iKTsKLQkJfSBlbHNlIGlmIChyZW1vdGVfbWlub3IgPT0gMykgewotCQkJLyogbm90ZSB0aGF0IHRoaXMgZGlzYWJsZXMgYWdlbnQtZm9yd2FyZGluZyAqLwotCQkJZW5hYmxlX2NvbXBhdDEzKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpZiAob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18yKSB7Ci0JCQllbmFibGVfY29tcGF0MjAoKTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIEZBTExUSFJPVUdIICovCi0JZGVmYXVsdDoKLQkJbWlzbWF0Y2ggPSAxOwotCQlicmVhazsKLQl9Ci0JY2hvcChzZXJ2ZXJfdmVyc2lvbl9zdHJpbmcpOwotCWRlYnVnKCJMb2NhbCB2ZXJzaW9uIHN0cmluZyAlLjIwMHMiLCBzZXJ2ZXJfdmVyc2lvbl9zdHJpbmcpOwotCi0JaWYgKG1pc21hdGNoKSB7Ci0JCXMgPSAiUHJvdG9jb2wgbWFqb3IgdmVyc2lvbnMgZGlmZmVyLlxuIjsKLQkJKHZvaWQpIGF0b21pY2lvKHZ3cml0ZSwgc29ja19vdXQsIHMsIHN0cmxlbihzKSk7Ci0JCWNsb3NlKHNvY2tfaW4pOwotCQljbG9zZShzb2NrX291dCk7Ci0JCWxvZ2l0KCJQcm90b2NvbCBtYWpvciB2ZXJzaW9ucyBkaWZmZXIgZm9yICVzOiAlLjIwMHMgdnMuICUuMjAwcyIsCi0JCSAgICBnZXRfcmVtb3RlX2lwYWRkcigpLAotCQkgICAgc2VydmVyX3ZlcnNpb25fc3RyaW5nLCBjbGllbnRfdmVyc2lvbl9zdHJpbmcpOwotCQljbGVhbnVwX2V4aXQoMjU1KTsKLQl9Ci19Ci0KLS8qIERlc3Ryb3kgdGhlIGhvc3QgYW5kIHNlcnZlciBrZXlzLiAgVGhleSB3aWxsIG5vIGxvbmdlciBiZSBuZWVkZWQuICovCi12b2lkCi1kZXN0cm95X3NlbnNpdGl2ZV9kYXRhKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleSkgewotCQlrZXlfZnJlZShzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5KTsKLQkJc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleSA9IE5VTEw7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9ob3N0X2tleV9maWxlczsgaSsrKSB7Ci0JCWlmIChzZW5zaXRpdmVfZGF0YS5ob3N0X2tleXNbaV0pIHsKLQkJCWtleV9mcmVlKHNlbnNpdGl2ZV9kYXRhLmhvc3Rfa2V5c1tpXSk7Ci0JCQlzZW5zaXRpdmVfZGF0YS5ob3N0X2tleXNbaV0gPSBOVUxMOwotCQl9Ci0JCWlmIChzZW5zaXRpdmVfZGF0YS5ob3N0X2NlcnRpZmljYXRlc1tpXSkgewotCQkJa2V5X2ZyZWUoc2Vuc2l0aXZlX2RhdGEuaG9zdF9jZXJ0aWZpY2F0ZXNbaV0pOwotCQkJc2Vuc2l0aXZlX2RhdGEuaG9zdF9jZXJ0aWZpY2F0ZXNbaV0gPSBOVUxMOwotCQl9Ci0JfQotCXNlbnNpdGl2ZV9kYXRhLnNzaDFfaG9zdF9rZXkgPSBOVUxMOwotCW1lbXNldChzZW5zaXRpdmVfZGF0YS5zc2gxX2Nvb2tpZSwgMCwgU1NIX1NFU1NJT05fS0VZX0xFTkdUSCk7Ci19Ci0KLS8qIERlbW90ZSBwcml2YXRlIHRvIHB1YmxpYyBrZXlzIGZvciBuZXR3b3JrIGNoaWxkICovCi12b2lkCi1kZW1vdGVfc2Vuc2l0aXZlX2RhdGEodm9pZCkKLXsKLQlLZXkgKnRtcDsKLQlpbnQgaTsKLQotCWlmIChzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5KSB7Ci0JCXRtcCA9IGtleV9kZW1vdGUoc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleSk7Ci0JCWtleV9mcmVlKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXkpOwotCQlzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5ID0gdG1wOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9ob3N0X2tleV9maWxlczsgaSsrKSB7Ci0JCWlmIChzZW5zaXRpdmVfZGF0YS5ob3N0X2tleXNbaV0pIHsKLQkJCXRtcCA9IGtleV9kZW1vdGUoc2Vuc2l0aXZlX2RhdGEuaG9zdF9rZXlzW2ldKTsKLQkJCWtleV9mcmVlKHNlbnNpdGl2ZV9kYXRhLmhvc3Rfa2V5c1tpXSk7Ci0JCQlzZW5zaXRpdmVfZGF0YS5ob3N0X2tleXNbaV0gPSB0bXA7Ci0JCQlpZiAodG1wLT50eXBlID09IEtFWV9SU0ExKQotCQkJCXNlbnNpdGl2ZV9kYXRhLnNzaDFfaG9zdF9rZXkgPSB0bXA7Ci0JCX0KLQkJLyogQ2VydHMgZG8gbm90IG5lZWQgZGVtb3Rpb24gKi8KLQl9Ci0KLQkvKiBXZSBkbyBub3QgY2xlYXIgc3NoMV9ob3N0IGtleSBhbmQgY29va2llLiAgWFhYIC0gT2theSBOaWVscz8gKi8KLX0KLQotc3RhdGljIHZvaWQKLXByaXZzZXBfcHJlYXV0aF9jaGlsZCh2b2lkKQotewotCXVfaW50MzJfdCBybmRbMjU2XTsKLQlnaWRfdCBnaWRzZXRbMV07Ci0KLQkvKiBFbmFibGUgY2hhbGxlbmdlLXJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbiAqLwotCXByaXZzZXBfY2hhbGxlbmdlX2VuYWJsZSgpOwotCi0JYXJjNHJhbmRvbV9zdGlyKCk7Ci0JYXJjNHJhbmRvbV9idWYocm5kLCBzaXplb2Yocm5kKSk7Ci0JUkFORF9zZWVkKHJuZCwgc2l6ZW9mKHJuZCkpOwotCi0JLyogRGVtb3RlIHRoZSBwcml2YXRlIGtleXMgdG8gcHVibGljIGtleXMuICovCi0JZGVtb3RlX3NlbnNpdGl2ZV9kYXRhKCk7Ci0KLQkvKiBDaGFuZ2Ugb3VyIHJvb3QgZGlyZWN0b3J5ICovCi0JaWYgKGNocm9vdChfUEFUSF9QUklWU0VQX0NIUk9PVF9ESVIpID09IC0xKQotCQlmYXRhbCgiY2hyb290KFwiJXNcIik6ICVzIiwgX1BBVEhfUFJJVlNFUF9DSFJPT1RfRElSLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoY2hkaXIoIi8iKSA9PSAtMSkKLQkJZmF0YWwoImNoZGlyKFwiL1wiKTogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCi0JLyogRHJvcCBvdXIgcHJpdmlsZWdlcyAqLwotCWRlYnVnMygicHJpdnNlcCB1c2VyOmdyb3VwICV1OiV1IiwgKHVfaW50KXByaXZzZXBfcHctPnB3X3VpZCwKLQkgICAgKHVfaW50KXByaXZzZXBfcHctPnB3X2dpZCk7Ci0jaWYgMAotCS8qIFhYWCBub3QgcmVhZHksIHRvbyBoZWF2eSBhZnRlciBjaHJvb3QgKi8KLQlkb19zZXR1c2VyY29udGV4dChwcml2c2VwX3B3KTsKLSNlbHNlCi0JZ2lkc2V0WzBdID0gcHJpdnNlcF9wdy0+cHdfZ2lkOwotCWlmIChzZXRncm91cHMoMSwgZ2lkc2V0KSA8IDApCi0JCWZhdGFsKCJzZXRncm91cHM6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JcGVybWFuZW50bHlfc2V0X3VpZChwcml2c2VwX3B3KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW50Ci1wcml2c2VwX3ByZWF1dGgoQXV0aGN0eHQgKmF1dGhjdHh0KQotewotCWludCBzdGF0dXM7Ci0JcGlkX3QgcGlkOwotCXN0cnVjdCBzc2hfc2FuZGJveCAqYm94ID0gTlVMTDsKLQotCS8qIFNldCB1cCB1bnByaXZpbGVnZWQgY2hpbGQgcHJvY2VzcyB0byBkZWFsIHdpdGggbmV0d29yayBkYXRhICovCi0JcG1vbml0b3IgPSBtb25pdG9yX2luaXQoKTsKLQkvKiBTdG9yZSBhIHBvaW50ZXIgdG8gdGhlIGtleCBmb3IgbGF0ZXIgcmVrZXlpbmcgKi8KLQlwbW9uaXRvci0+bV9wa2V4ID0gJnh4eF9rZXg7Ci0KLQlpZiAodXNlX3ByaXZzZXAgPT0gUFJJVlNFUF9TQU5EQk9YKQotCQlib3ggPSBzc2hfc2FuZGJveF9pbml0KCk7Ci0JcGlkID0gZm9yaygpOwotCWlmIChwaWQgPT0gLTEpIHsKLQkJZmF0YWwoImZvcmsgb2YgdW5wcml2aWxlZ2VkIGNoaWxkIGZhaWxlZCIpOwotCX0gZWxzZSBpZiAocGlkICE9IDApIHsKLQkJZGVidWcyKCJOZXR3b3JrIGNoaWxkIGlzIG9uIHBpZCAlbGQiLCAobG9uZylwaWQpOwotCi0JCWlmIChib3ggIT0gTlVMTCkKLQkJCXNzaF9zYW5kYm94X3BhcmVudF9wcmVhdXRoKGJveCwgcGlkKTsKLQkJcG1vbml0b3ItPm1fcGlkID0gcGlkOwotCQltb25pdG9yX2NoaWxkX3ByZWF1dGgoYXV0aGN0eHQsIHBtb25pdG9yKTsKLQotCQkvKiBTeW5jIG1lbW9yeSAqLwotCQltb25pdG9yX3N5bmMocG1vbml0b3IpOwotCi0JCS8qIFdhaXQgZm9yIHRoZSBjaGlsZCdzIGV4aXQgc3RhdHVzICovCi0JCXdoaWxlICh3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgPCAwKSB7Ci0JCQlpZiAoZXJybm8gIT0gRUlOVFIpCi0JCQkJZmF0YWwoIiVzOiB3YWl0cGlkOiAlcyIsIF9fZnVuY19fLAotCQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQl9Ci0JCWlmIChXSUZFWElURUQoc3RhdHVzKSkgewotCQkJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkKLQkJCQlmYXRhbCgiJXM6IHByZWF1dGggY2hpbGQgZXhpdGVkIHdpdGggc3RhdHVzICVkIiwKLQkJCQkgICAgX19mdW5jX18sIFdFWElUU1RBVFVTKHN0YXR1cykpOwotCQl9IGVsc2UgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpCi0JCQlmYXRhbCgiJXM6IHByZWF1dGggY2hpbGQgdGVybWluYXRlZCBieSBzaWduYWwgJWQiLAotCQkJICAgIF9fZnVuY19fLCBXVEVSTVNJRyhzdGF0dXMpKTsKLQkJaWYgKGJveCAhPSBOVUxMKQotCQkJc3NoX3NhbmRib3hfcGFyZW50X2ZpbmlzaChib3gpOwotCQlyZXR1cm4gMTsKLQl9IGVsc2UgewotCQkvKiBjaGlsZCAqLwotCQljbG9zZShwbW9uaXRvci0+bV9zZW5kZmQpOwotCQljbG9zZShwbW9uaXRvci0+bV9sb2dfcmVjdmZkKTsKLQotCQkvKiBBcnJhbmdlIGZvciBsb2dnaW5nIHRvIGJlIHNlbnQgdG8gdGhlIG1vbml0b3IgKi8KLQkJc2V0X2xvZ19oYW5kbGVyKG1tX2xvZ19oYW5kbGVyLCBwbW9uaXRvcik7Ci0KLQkJLyogRGVtb3RlIHRoZSBjaGlsZCAqLwotCQlpZiAoZ2V0dWlkKCkgPT0gMCB8fCBnZXRldWlkKCkgPT0gMCkKLQkJCXByaXZzZXBfcHJlYXV0aF9jaGlsZCgpOwotCQlzZXRwcm9jdGl0bGUoIiVzIiwgIltuZXRdIik7Ci0JCWlmIChib3ggIT0gTlVMTCkKLQkJCXNzaF9zYW5kYm94X2NoaWxkKGJveCk7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotcHJpdnNlcF9wb3N0YXV0aChBdXRoY3R4dCAqYXV0aGN0eHQpCi17Ci0JdV9pbnQzMl90IHJuZFsyNTZdOwotCi0jaWZkZWYgRElTQUJMRV9GRF9QQVNTSU5HCi0JaWYgKDEpIHsKLSNlbHNlCi0JaWYgKGF1dGhjdHh0LT5wdy0+cHdfdWlkID09IDAgfHwgb3B0aW9ucy51c2VfbG9naW4pIHsKLSNlbmRpZgotCQkvKiBGaWxlIGRlc2NyaXB0b3IgcGFzc2luZyBpcyBicm9rZW4gb3Igcm9vdCBsb2dpbiAqLwotCQl1c2VfcHJpdnNlcCA9IDA7Ci0JCWdvdG8gc2tpcDsKLQl9Ci0KLQkvKiBOZXcgc29ja2V0IHBhaXIgKi8KLQltb25pdG9yX3JlaW5pdChwbW9uaXRvcik7Ci0KLQlwbW9uaXRvci0+bV9waWQgPSBmb3JrKCk7Ci0JaWYgKHBtb25pdG9yLT5tX3BpZCA9PSAtMSkKLQkJZmF0YWwoImZvcmsgb2YgdW5wcml2aWxlZ2VkIGNoaWxkIGZhaWxlZCIpOwotCWVsc2UgaWYgKHBtb25pdG9yLT5tX3BpZCAhPSAwKSB7Ci0JCXZlcmJvc2UoIlVzZXIgY2hpbGQgaXMgb24gcGlkICVsZCIsIChsb25nKXBtb25pdG9yLT5tX3BpZCk7Ci0JCWJ1ZmZlcl9jbGVhcigmbG9naW5tc2cpOwotCQltb25pdG9yX2NoaWxkX3Bvc3RhdXRoKHBtb25pdG9yKTsKLQotCQkvKiBORVZFUlJFQUNIRUQgKi8KLQkJZXhpdCgwKTsKLQl9Ci0KLQkvKiBjaGlsZCAqLwotCi0JY2xvc2UocG1vbml0b3ItPm1fc2VuZGZkKTsKLQlwbW9uaXRvci0+bV9zZW5kZmQgPSAtMTsKLQotCS8qIERlbW90ZSB0aGUgcHJpdmF0ZSBrZXlzIHRvIHB1YmxpYyBrZXlzLiAqLwotCWRlbW90ZV9zZW5zaXRpdmVfZGF0YSgpOwotCi0JYXJjNHJhbmRvbV9zdGlyKCk7Ci0JYXJjNHJhbmRvbV9idWYocm5kLCBzaXplb2Yocm5kKSk7Ci0JUkFORF9zZWVkKHJuZCwgc2l6ZW9mKHJuZCkpOwotCi0JLyogRHJvcCBwcml2aWxlZ2VzICovCi0JZG9fc2V0dXNlcmNvbnRleHQoYXV0aGN0eHQtPnB3KTsKLQotIHNraXA6Ci0JLyogSXQgaXMgc2FmZSBub3cgdG8gYXBwbHkgdGhlIGtleSBzdGF0ZSAqLwotCW1vbml0b3JfYXBwbHlfa2V5c3RhdGUocG1vbml0b3IpOwotCi0JLyoKLQkgKiBUZWxsIHRoZSBwYWNrZXQgbGF5ZXIgdGhhdCBhdXRoZW50aWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgc2luY2UKLQkgKiB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBrZXkgc3RhdGUuCi0JICovCi0JcGFja2V0X3NldF9hdXRoZW50aWNhdGVkKCk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWxpc3RfaG9zdGtleV90eXBlcyh2b2lkKQotewotCUJ1ZmZlciBiOwotCWNvbnN0IGNoYXIgKnA7Ci0JY2hhciAqcmV0OwotCWludCBpOwotCUtleSAqa2V5OwotCi0JYnVmZmVyX2luaXQoJmIpOwotCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9ob3N0X2tleV9maWxlczsgaSsrKSB7Ci0JCWtleSA9IHNlbnNpdGl2ZV9kYXRhLmhvc3Rfa2V5c1tpXTsKLQkJaWYgKGtleSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCXN3aXRjaCAoa2V5LT50eXBlKSB7Ci0JCWNhc2UgS0VZX1JTQToKLQkJY2FzZSBLRVlfRFNBOgotCQljYXNlIEtFWV9FQ0RTQToKLQkJCWlmIChidWZmZXJfbGVuKCZiKSA+IDApCi0JCQkJYnVmZmVyX2FwcGVuZCgmYiwgIiwiLCAxKTsKLQkJCXAgPSBrZXlfc3NoX25hbWUoa2V5KTsKLQkJCWJ1ZmZlcl9hcHBlbmQoJmIsIHAsIHN0cmxlbihwKSk7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBJZiB0aGUgcHJpdmF0ZSBrZXkgaGFzIGEgY2VydCBwZWVyLCB0aGVuIGxpc3QgdGhhdCB0b28gKi8KLQkJa2V5ID0gc2Vuc2l0aXZlX2RhdGEuaG9zdF9jZXJ0aWZpY2F0ZXNbaV07Ci0JCWlmIChrZXkgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlzd2l0Y2ggKGtleS0+dHlwZSkgewotCQljYXNlIEtFWV9SU0FfQ0VSVF9WMDA6Ci0JCWNhc2UgS0VZX0RTQV9DRVJUX1YwMDoKLQkJY2FzZSBLRVlfUlNBX0NFUlQ6Ci0JCWNhc2UgS0VZX0RTQV9DRVJUOgotCQljYXNlIEtFWV9FQ0RTQV9DRVJUOgotCQkJaWYgKGJ1ZmZlcl9sZW4oJmIpID4gMCkKLQkJCQlidWZmZXJfYXBwZW5kKCZiLCAiLCIsIDEpOwotCQkJcCA9IGtleV9zc2hfbmFtZShrZXkpOwotCQkJYnVmZmVyX2FwcGVuZCgmYiwgcCwgc3RybGVuKHApKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWJ1ZmZlcl9hcHBlbmQoJmIsICJcMCIsIDEpOwotCXJldCA9IHhzdHJkdXAoYnVmZmVyX3B0cigmYikpOwotCWJ1ZmZlcl9mcmVlKCZiKTsKLQlkZWJ1ZygibGlzdF9ob3N0a2V5X3R5cGVzOiAlcyIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIEtleSAqCi1nZXRfaG9zdGtleV9ieV90eXBlKGludCB0eXBlLCBpbnQgbmVlZF9wcml2YXRlKQotewotCWludCBpOwotCUtleSAqa2V5OwotCi0JZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2hvc3Rfa2V5X2ZpbGVzOyBpKyspIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgS0VZX1JTQV9DRVJUX1YwMDoKLQkJY2FzZSBLRVlfRFNBX0NFUlRfVjAwOgotCQljYXNlIEtFWV9SU0FfQ0VSVDoKLQkJY2FzZSBLRVlfRFNBX0NFUlQ6Ci0JCWNhc2UgS0VZX0VDRFNBX0NFUlQ6Ci0JCQlrZXkgPSBzZW5zaXRpdmVfZGF0YS5ob3N0X2NlcnRpZmljYXRlc1tpXTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJa2V5ID0gc2Vuc2l0aXZlX2RhdGEuaG9zdF9rZXlzW2ldOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGtleSAhPSBOVUxMICYmIGtleS0+dHlwZSA9PSB0eXBlKQotCQkJcmV0dXJuIG5lZWRfcHJpdmF0ZSA/Ci0JCQkgICAgc2Vuc2l0aXZlX2RhdGEuaG9zdF9rZXlzW2ldIDoga2V5OwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotS2V5ICoKLWdldF9ob3N0a2V5X3B1YmxpY19ieV90eXBlKGludCB0eXBlKQotewotCXJldHVybiBnZXRfaG9zdGtleV9ieV90eXBlKHR5cGUsIDApOwotfQotCi1LZXkgKgotZ2V0X2hvc3RrZXlfcHJpdmF0ZV9ieV90eXBlKGludCB0eXBlKQotewotCXJldHVybiBnZXRfaG9zdGtleV9ieV90eXBlKHR5cGUsIDEpOwotfQotCi1LZXkgKgotZ2V0X2hvc3RrZXlfYnlfaW5kZXgoaW50IGluZCkKLXsKLQlpZiAoaW5kIDwgMCB8fCBpbmQgPj0gb3B0aW9ucy5udW1faG9zdF9rZXlfZmlsZXMpCi0JCXJldHVybiAoTlVMTCk7Ci0JcmV0dXJuIChzZW5zaXRpdmVfZGF0YS5ob3N0X2tleXNbaW5kXSk7Ci19Ci0KLWludAotZ2V0X2hvc3RrZXlfaW5kZXgoS2V5ICprZXkpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1faG9zdF9rZXlfZmlsZXM7IGkrKykgewotCQlpZiAoa2V5X2lzX2NlcnQoa2V5KSkgewotCQkJaWYgKGtleSA9PSBzZW5zaXRpdmVfZGF0YS5ob3N0X2NlcnRpZmljYXRlc1tpXSkKLQkJCQlyZXR1cm4gKGkpOwotCQl9IGVsc2UgewotCQkJaWYgKGtleSA9PSBzZW5zaXRpdmVfZGF0YS5ob3N0X2tleXNbaV0pCi0JCQkJcmV0dXJuIChpKTsKLQkJfQotCX0KLQlyZXR1cm4gKC0xKTsKLX0KLQotLyoKLSAqIHJldHVybnMgMSBpZiBjb25uZWN0aW9uIHNob3VsZCBiZSBkcm9wcGVkLCAwIG90aGVyd2lzZS4KLSAqIGRyb3BwaW5nIHN0YXJ0cyBhdCBjb25uZWN0aW9uICNtYXhfc3RhcnR1cHNfYmVnaW4gd2l0aCBhIHByb2JhYmlsaXR5Ci0gKiBvZiAobWF4X3N0YXJ0dXBzX3JhdGUvMTAwKS4gdGhlIHByb2JhYmlsaXR5IGluY3JlYXNlcyBsaW5lYXJseSB1bnRpbAotICogYWxsIGNvbm5lY3Rpb25zIGFyZSBkcm9wcGVkIGZvciBzdGFydHVwcyA+IG1heF9zdGFydHVwcwotICovCi1zdGF0aWMgaW50Ci1kcm9wX2Nvbm5lY3Rpb24oaW50IHN0YXJ0dXBzKQotewotCWludCBwLCByOwotCi0JaWYgKHN0YXJ0dXBzIDwgb3B0aW9ucy5tYXhfc3RhcnR1cHNfYmVnaW4pCi0JCXJldHVybiAwOwotCWlmIChzdGFydHVwcyA+PSBvcHRpb25zLm1heF9zdGFydHVwcykKLQkJcmV0dXJuIDE7Ci0JaWYgKG9wdGlvbnMubWF4X3N0YXJ0dXBzX3JhdGUgPT0gMTAwKQotCQlyZXR1cm4gMTsKLQotCXAgID0gMTAwIC0gb3B0aW9ucy5tYXhfc3RhcnR1cHNfcmF0ZTsKLQlwICo9IHN0YXJ0dXBzIC0gb3B0aW9ucy5tYXhfc3RhcnR1cHNfYmVnaW47Ci0JcCAvPSBvcHRpb25zLm1heF9zdGFydHVwcyAtIG9wdGlvbnMubWF4X3N0YXJ0dXBzX2JlZ2luOwotCXAgKz0gb3B0aW9ucy5tYXhfc3RhcnR1cHNfcmF0ZTsKLQlyID0gYXJjNHJhbmRvbV91bmlmb3JtKDEwMCk7Ci0KLQlkZWJ1ZygiZHJvcF9jb25uZWN0aW9uOiBwICVkLCByICVkIiwgcCwgcik7Ci0JcmV0dXJuIChyIDwgcCkgPyAxIDogMDsKLX0KLQotc3RhdGljIHZvaWQKLXVzYWdlKHZvaWQpCi17Ci0JZnByaW50ZihzdGRlcnIsICIlcywgJXNcbiIsCi0JICAgIFNTSF9SRUxFQVNFLCBTU0xlYXlfdmVyc2lvbihTU0xFQVlfVkVSU0lPTikpOwotCWZwcmludGYoc3RkZXJyLAotInVzYWdlOiBzc2hkIFstNDZEZGVpcVR0XSBbLWIgYml0c10gWy1DIGNvbm5lY3Rpb25fc3BlY10gWy1jIGhvc3RfY2VydF9maWxlXVxuIgotIiAgICAgICAgICAgIFstZiBjb25maWdfZmlsZV0gWy1nIGxvZ2luX2dyYWNlX3RpbWVdIFstaCBob3N0X2tleV9maWxlXVxuIgotIiAgICAgICAgICAgIFstayBrZXlfZ2VuX3RpbWVdIFstbyBvcHRpb25dIFstcCBwb3J0XSBbLXUgbGVuXVxuIgotCSk7Ci0JZXhpdCgxKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmRfcmV4ZWNfc3RhdGUoaW50IGZkLCBCdWZmZXIgKmNvbmYpCi17Ci0JQnVmZmVyIG07Ci0KLQlkZWJ1ZzMoIiVzOiBlbnRlcmluZyBmZCA9ICVkIGNvbmZpZyBsZW4gJWQiLCBfX2Z1bmNfXywgZmQsCi0JICAgIGJ1ZmZlcl9sZW4oY29uZikpOwotCi0JLyoKLQkgKiBQcm90b2NvbCBmcm9tIHJlZXhlYyBtYXN0ZXIgdG8gY2hpbGQ6Ci0JICoJc3RyaW5nCWNvbmZpZ3VyYXRpb24KLQkgKgl1X2ludAllcGhlbWVyYWxfa2V5X2ZvbGxvd3MKLQkgKgliaWdudW0JZQkJKG9ubHkgaWYgZXBoZW1lcmFsX2tleV9mb2xsb3dzID09IDEpCi0JICoJYmlnbnVtCW4JCQkiCi0JICoJYmlnbnVtCWQJCQkiCi0JICoJYmlnbnVtCWlxbXAJCQkiCi0JICoJYmlnbnVtCXAJCQkiCi0JICoJYmlnbnVtCXEJCQkiCi0JICoJc3RyaW5nIHJuZ3NlZWQJCShvbmx5IGlmIE9wZW5TU0wgaXMgbm90IHNlbGYtc2VlZGVkKQotCSAqLwotCWJ1ZmZlcl9pbml0KCZtKTsKLQlidWZmZXJfcHV0X2NzdHJpbmcoJm0sIGJ1ZmZlcl9wdHIoY29uZikpOwotCi0JaWYgKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXkgIT0gTlVMTCAmJgotCSAgICBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT50eXBlID09IEtFWV9SU0ExKSB7Ci0JCWJ1ZmZlcl9wdXRfaW50KCZtLCAxKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0oJm0sIHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+ZSk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtKCZtLCBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPm4pOwotCQlidWZmZXJfcHV0X2JpZ251bSgmbSwgc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleS0+cnNhLT5kKTsKLQkJYnVmZmVyX3B1dF9iaWdudW0oJm0sIHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+aXFtcCk7Ci0JCWJ1ZmZlcl9wdXRfYmlnbnVtKCZtLCBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPnApOwotCQlidWZmZXJfcHV0X2JpZ251bSgmbSwgc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleS0+cnNhLT5xKTsKLQl9IGVsc2UKLQkJYnVmZmVyX3B1dF9pbnQoJm0sIDApOwotCi0jaWZuZGVmIE9QRU5TU0xfUFJOR19PTkxZCi0JcmV4ZWNfc2VuZF9ybmdfc2VlZCgmbSk7Ci0jZW5kaWYKLQotCWlmIChzc2hfbXNnX3NlbmQoZmQsIDAsICZtKSA9PSAtMSkKLQkJZmF0YWwoIiVzOiBzc2hfbXNnX3NlbmQgZmFpbGVkIiwgX19mdW5jX18pOwotCi0JYnVmZmVyX2ZyZWUoJm0pOwotCi0JZGVidWczKCIlczogZG9uZSIsIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlY3ZfcmV4ZWNfc3RhdGUoaW50IGZkLCBCdWZmZXIgKmNvbmYpCi17Ci0JQnVmZmVyIG07Ci0JY2hhciAqY3A7Ci0JdV9pbnQgbGVuOwotCi0JZGVidWczKCIlczogZW50ZXJpbmcgZmQgPSAlZCIsIF9fZnVuY19fLCBmZCk7Ci0KLQlidWZmZXJfaW5pdCgmbSk7Ci0KLQlpZiAoc3NoX21zZ19yZWN2KGZkLCAmbSkgPT0gLTEpCi0JCWZhdGFsKCIlczogc3NoX21zZ19yZWN2IGZhaWxlZCIsIF9fZnVuY19fKTsKLQlpZiAoYnVmZmVyX2dldF9jaGFyKCZtKSAhPSAwKQotCQlmYXRhbCgiJXM6IHJleGVjIHZlcnNpb24gbWlzbWF0Y2giLCBfX2Z1bmNfXyk7Ci0KLQljcCA9IGJ1ZmZlcl9nZXRfc3RyaW5nKCZtLCAmbGVuKTsKLQlpZiAoY29uZiAhPSBOVUxMKQotCQlidWZmZXJfYXBwZW5kKGNvbmYsIGNwLCBsZW4gKyAxKTsKLQl4ZnJlZShjcCk7Ci0KLQlpZiAoYnVmZmVyX2dldF9pbnQoJm0pKSB7Ci0JCWlmIChzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5ICE9IE5VTEwpCi0JCQlrZXlfZnJlZShzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5KTsKLQkJc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleSA9IGtleV9uZXdfcHJpdmF0ZShLRVlfUlNBMSk7Ci0JCWJ1ZmZlcl9nZXRfYmlnbnVtKCZtLCBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPmUpOwotCQlidWZmZXJfZ2V0X2JpZ251bSgmbSwgc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleS0+cnNhLT5uKTsKLQkJYnVmZmVyX2dldF9iaWdudW0oJm0sIHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+ZCk7Ci0JCWJ1ZmZlcl9nZXRfYmlnbnVtKCZtLCBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPmlxbXApOwotCQlidWZmZXJfZ2V0X2JpZ251bSgmbSwgc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleS0+cnNhLT5wKTsKLQkJYnVmZmVyX2dldF9iaWdudW0oJm0sIHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+cSk7Ci0JCXJzYV9nZW5lcmF0ZV9hZGRpdGlvbmFsX3BhcmFtZXRlcnMoCi0JCSAgICBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EpOwotCX0KLQotI2lmbmRlZiBPUEVOU1NMX1BSTkdfT05MWQotCXJleGVjX3JlY3Zfcm5nX3NlZWQoJm0pOwotI2VuZGlmCi0KLQlidWZmZXJfZnJlZSgmbSk7Ci0KLQlkZWJ1ZzMoIiVzOiBkb25lIiwgX19mdW5jX18pOwotfQotCi0vKiBBY2NlcHQgYSBjb25uZWN0aW9uIGZyb20gaW5ldGQgKi8KLXN0YXRpYyB2b2lkCi1zZXJ2ZXJfYWNjZXB0X2luZXRkKGludCAqc29ja19pbiwgaW50ICpzb2NrX291dCkKLXsKLQlpbnQgZmQ7Ci0KLQlzdGFydHVwX3BpcGUgPSAtMTsKLQlpZiAocmV4ZWNlZF9mbGFnKSB7Ci0JCWNsb3NlKFJFRVhFQ19DT05GSUdfUEFTU19GRCk7Ci0JCSpzb2NrX2luID0gKnNvY2tfb3V0ID0gZHVwKFNURElOX0ZJTEVOTyk7Ci0JCWlmICghZGVidWdfZmxhZykgewotCQkJc3RhcnR1cF9waXBlID0gZHVwKFJFRVhFQ19TVEFSVFVQX1BJUEVfRkQpOwotCQkJY2xvc2UoUkVFWEVDX1NUQVJUVVBfUElQRV9GRCk7Ci0JCX0KLQl9IGVsc2UgewotCQkqc29ja19pbiA9IGR1cChTVERJTl9GSUxFTk8pOwotCQkqc29ja19vdXQgPSBkdXAoU1RET1VUX0ZJTEVOTyk7Ci0JfQotCS8qCi0JICogV2UgaW50ZW50aW9uYWxseSBkbyBub3QgY2xvc2UgdGhlIGRlc2NyaXB0b3JzIDAsIDEsIGFuZCAyCi0JICogYXMgb3VyIGNvZGUgZm9yIHNldHRpbmcgdGhlIGRlc2NyaXB0b3JzIHdvbid0IHdvcmsgaWYKLQkgKiB0dHlmZCBoYXBwZW5zIHRvIGJlIG9uZSBvZiB0aG9zZS4KLQkgKi8KLQlpZiAoKGZkID0gb3BlbihfUEFUSF9ERVZOVUxMLCBPX1JEV1IsIDApKSAhPSAtMSkgewotCQlkdXAyKGZkLCBTVERJTl9GSUxFTk8pOwotCQlkdXAyKGZkLCBTVERPVVRfRklMRU5PKTsKLQkJaWYgKGZkID4gU1RET1VUX0ZJTEVOTykKLQkJCWNsb3NlKGZkKTsKLQl9Ci0JZGVidWcoImluZXRkIHNvY2tldHMgYWZ0ZXIgZHVwcGluZzogJWQsICVkIiwgKnNvY2tfaW4sICpzb2NrX291dCk7Ci19Ci0KLS8qCi0gKiBMaXN0ZW4gZm9yIFRDUCBjb25uZWN0aW9ucwotICovCi1zdGF0aWMgdm9pZAotc2VydmVyX2xpc3Rlbih2b2lkKQotewotCWludCByZXQsIGxpc3Rlbl9zb2NrLCBvbiA9IDE7Ci0Jc3RydWN0IGFkZHJpbmZvICphaTsKLQljaGFyIG50b3BbTklfTUFYSE9TVF0sIHN0cnBvcnRbTklfTUFYU0VSVl07Ci0KLQlmb3IgKGFpID0gb3B0aW9ucy5saXN0ZW5fYWRkcnM7IGFpOyBhaSA9IGFpLT5haV9uZXh0KSB7Ci0JCWlmIChhaS0+YWlfZmFtaWx5ICE9IEFGX0lORVQgJiYgYWktPmFpX2ZhbWlseSAhPSBBRl9JTkVUNikKLQkJCWNvbnRpbnVlOwotCQlpZiAobnVtX2xpc3Rlbl9zb2NrcyA+PSBNQVhfTElTVEVOX1NPQ0tTKQotCQkJZmF0YWwoIlRvbyBtYW55IGxpc3RlbiBzb2NrZXRzLiAiCi0JCQkgICAgIkVubGFyZ2UgTUFYX0xJU1RFTl9TT0NLUyIpOwotCQlpZiAoKHJldCA9IGdldG5hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwKLQkJICAgIG50b3AsIHNpemVvZihudG9wKSwgc3RycG9ydCwgc2l6ZW9mKHN0cnBvcnQpLAotCQkgICAgTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpKSAhPSAwKSB7Ci0JCQllcnJvcigiZ2V0bmFtZWluZm8gZmFpbGVkOiAlLjEwMHMiLAotCQkJICAgIHNzaF9nYWlfc3RyZXJyb3IocmV0KSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQkvKiBDcmVhdGUgc29ja2V0IGZvciBsaXN0ZW5pbmcuICovCi0JCWxpc3Rlbl9zb2NrID0gc29ja2V0KGFpLT5haV9mYW1pbHksIGFpLT5haV9zb2NrdHlwZSwKLQkJICAgIGFpLT5haV9wcm90b2NvbCk7Ci0JCWlmIChsaXN0ZW5fc29jayA8IDApIHsKLQkJCS8qIGtlcm5lbCBtYXkgbm90IHN1cHBvcnQgaXB2NiAqLwotCQkJdmVyYm9zZSgic29ja2V0OiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHNldF9ub25ibG9jayhsaXN0ZW5fc29jaykgPT0gLTEpIHsKLQkJCWNsb3NlKGxpc3Rlbl9zb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qCi0JCSAqIFNldCBzb2NrZXQgb3B0aW9ucy4KLQkJICogQWxsb3cgbG9jYWwgcG9ydCByZXVzZSBpbiBUSU1FX1dBSVQuCi0JCSAqLwotCQlpZiAoc2V0c29ja29wdChsaXN0ZW5fc29jaywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLAotCQkgICAgJm9uLCBzaXplb2Yob24pKSA9PSAtMSkKLQkJCWVycm9yKCJzZXRzb2Nrb3B0IFNPX1JFVVNFQUREUjogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCi0JCS8qIE9ubHkgY29tbXVuaWNhdGUgaW4gSVB2NiBvdmVyIEFGX0lORVQ2IHNvY2tldHMuICovCi0JCWlmIChhaS0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KQotCQkJc29ja19zZXRfdjZvbmx5KGxpc3Rlbl9zb2NrKTsKLQotCQlkZWJ1ZygiQmluZCB0byBwb3J0ICVzIG9uICVzLiIsIHN0cnBvcnQsIG50b3ApOwotCi0JCS8qIEJpbmQgdGhlIHNvY2tldCB0byB0aGUgZGVzaXJlZCBwb3J0LiAqLwotCQlpZiAoYmluZChsaXN0ZW5fc29jaywgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKSA8IDApIHsKLQkJCWVycm9yKCJCaW5kIHRvIHBvcnQgJXMgb24gJXMgZmFpbGVkOiAlLjIwMHMuIiwKLQkJCSAgICBzdHJwb3J0LCBudG9wLCBzdHJlcnJvcihlcnJubykpOwotCQkJY2xvc2UobGlzdGVuX3NvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJbGlzdGVuX3NvY2tzW251bV9saXN0ZW5fc29ja3NdID0gbGlzdGVuX3NvY2s7Ci0JCW51bV9saXN0ZW5fc29ja3MrKzsKLQotCQkvKiBTdGFydCBsaXN0ZW5pbmcgb24gdGhlIHBvcnQuICovCi0JCWlmIChsaXN0ZW4obGlzdGVuX3NvY2ssIFNTSF9MSVNURU5fQkFDS0xPRykgPCAwKQotCQkJZmF0YWwoImxpc3RlbiBvbiBbJXNdOiVzOiAlLjEwMHMiLAotCQkJICAgIG50b3AsIHN0cnBvcnQsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWxvZ2l0KCJTZXJ2ZXIgbGlzdGVuaW5nIG9uICVzIHBvcnQgJXMuIiwgbnRvcCwgc3RycG9ydCk7Ci0JfQotCWZyZWVhZGRyaW5mbyhvcHRpb25zLmxpc3Rlbl9hZGRycyk7Ci0KLQlpZiAoIW51bV9saXN0ZW5fc29ja3MpCi0JCWZhdGFsKCJDYW5ub3QgYmluZCBhbnkgYWRkcmVzcy4iKTsKLX0KLQotLyoKLSAqIFRoZSBtYWluIFRDUCBhY2NlcHQgbG9vcC4gTm90ZSB0aGF0LCBmb3IgdGhlIG5vbi1kZWJ1ZyBjYXNlLCByZXR1cm5zCi0gKiBmcm9tIHRoaXMgZnVuY3Rpb24gYXJlIGluIGEgZm9ya2VkIHN1YnByb2Nlc3MuCi0gKi8KLXN0YXRpYyB2b2lkCi1zZXJ2ZXJfYWNjZXB0X2xvb3AoaW50ICpzb2NrX2luLCBpbnQgKnNvY2tfb3V0LCBpbnQgKm5ld3NvY2ssIGludCAqY29uZmlnX3MpCi17Ci0JZmRfc2V0ICpmZHNldDsKLQlpbnQgaSwgaiwgcmV0LCBtYXhmZDsKLQlpbnQga2V5X3VzZWQgPSAwLCBzdGFydHVwcyA9IDA7Ci0JaW50IHN0YXJ0dXBfcFsyXSA9IHsgLTEgLCAtMSB9OwotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGZyb207Ci0Jc29ja2xlbl90IGZyb21sZW47Ci0JcGlkX3QgcGlkOwotCi0JLyogc2V0dXAgZmQgc2V0IGZvciBhY2NlcHQgKi8KLQlmZHNldCA9IE5VTEw7Ci0JbWF4ZmQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBudW1fbGlzdGVuX3NvY2tzOyBpKyspCi0JCWlmIChsaXN0ZW5fc29ja3NbaV0gPiBtYXhmZCkKLQkJCW1heGZkID0gbGlzdGVuX3NvY2tzW2ldOwotCS8qIHBpcGVzIGNvbm5lY3RlZCB0byB1bmF1dGhlbnRpY2F0ZWQgY2hpbGRzICovCi0Jc3RhcnR1cF9waXBlcyA9IHhjYWxsb2Mob3B0aW9ucy5tYXhfc3RhcnR1cHMsIHNpemVvZihpbnQpKTsKLQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5tYXhfc3RhcnR1cHM7IGkrKykKLQkJc3RhcnR1cF9waXBlc1tpXSA9IC0xOwotCi0JLyoKLQkgKiBTdGF5IGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMgdW50aWwgdGhlIHN5c3RlbSBjcmFzaGVzIG9yCi0JICogdGhlIGRhZW1vbiBpcyBraWxsZWQgd2l0aCBhIHNpZ25hbC4KLQkgKi8KLQlmb3IgKDs7KSB7Ci0JCWlmIChyZWNlaXZlZF9zaWdodXApCi0JCQlzaWdodXBfcmVzdGFydCgpOwotCQlpZiAoZmRzZXQgIT0gTlVMTCkKLQkJCXhmcmVlKGZkc2V0KTsKLQkJZmRzZXQgPSAoZmRfc2V0ICopeGNhbGxvYyhob3dtYW55KG1heGZkICsgMSwgTkZEQklUUyksCi0JCSAgICBzaXplb2YoZmRfbWFzaykpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBudW1fbGlzdGVuX3NvY2tzOyBpKyspCi0JCQlGRF9TRVQobGlzdGVuX3NvY2tzW2ldLCBmZHNldCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm1heF9zdGFydHVwczsgaSsrKQotCQkJaWYgKHN0YXJ0dXBfcGlwZXNbaV0gIT0gLTEpCi0JCQkJRkRfU0VUKHN0YXJ0dXBfcGlwZXNbaV0sIGZkc2V0KTsKLQotCQkvKiBXYWl0IGluIHNlbGVjdCB1bnRpbCB0aGVyZSBpcyBhIGNvbm5lY3Rpb24uICovCi0JCXJldCA9IHNlbGVjdChtYXhmZCsxLCBmZHNldCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JCWlmIChyZXQgPCAwICYmIGVycm5vICE9IEVJTlRSKQotCQkJZXJyb3IoInNlbGVjdDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJaWYgKHJlY2VpdmVkX3NpZ3Rlcm0pIHsKLQkJCWxvZ2l0KCJSZWNlaXZlZCBzaWduYWwgJWQ7IHRlcm1pbmF0aW5nLiIsCi0JCQkgICAgKGludCkgcmVjZWl2ZWRfc2lndGVybSk7Ci0JCQljbG9zZV9saXN0ZW5fc29ja3MoKTsKLQkJCXVubGluayhvcHRpb25zLnBpZF9maWxlKTsKLQkJCWV4aXQocmVjZWl2ZWRfc2lndGVybSA9PSBTSUdURVJNID8gMCA6IDI1NSk7Ci0JCX0KLQkJaWYgKGtleV91c2VkICYmIGtleV9kb19yZWdlbikgewotCQkJZ2VuZXJhdGVfZXBoZW1lcmFsX3NlcnZlcl9rZXkoKTsKLQkJCWtleV91c2VkID0gMDsKLQkJCWtleV9kb19yZWdlbiA9IDA7Ci0JCX0KLQkJaWYgKHJldCA8IDApCi0JCQljb250aW51ZTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5tYXhfc3RhcnR1cHM7IGkrKykKLQkJCWlmIChzdGFydHVwX3BpcGVzW2ldICE9IC0xICYmCi0JCQkgICAgRkRfSVNTRVQoc3RhcnR1cF9waXBlc1tpXSwgZmRzZXQpKSB7Ci0JCQkJLyoKLQkJCQkgKiB0aGUgcmVhZCBlbmQgb2YgdGhlIHBpcGUgaXMgcmVhZHkKLQkJCQkgKiBpZiB0aGUgY2hpbGQgaGFzIGNsb3NlZCB0aGUgcGlwZQotCQkJCSAqIGFmdGVyIHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24KLQkJCQkgKiBvciBpZiB0aGUgY2hpbGQgaGFzIGRpZWQKLQkJCQkgKi8KLQkJCQljbG9zZShzdGFydHVwX3BpcGVzW2ldKTsKLQkJCQlzdGFydHVwX3BpcGVzW2ldID0gLTE7Ci0JCQkJc3RhcnR1cHMtLTsKLQkJCX0KLQkJZm9yIChpID0gMDsgaSA8IG51bV9saXN0ZW5fc29ja3M7IGkrKykgewotCQkJaWYgKCFGRF9JU1NFVChsaXN0ZW5fc29ja3NbaV0sIGZkc2V0KSkKLQkJCQljb250aW51ZTsKLQkJCWZyb21sZW4gPSBzaXplb2YoZnJvbSk7Ci0JCQkqbmV3c29jayA9IGFjY2VwdChsaXN0ZW5fc29ja3NbaV0sCi0JCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tLCAmZnJvbWxlbik7Ci0JCQlpZiAoKm5ld3NvY2sgPCAwKSB7Ci0JCQkJaWYgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTiAmJgotCQkJCSAgICBlcnJubyAhPSBFV09VTERCTE9DSykKLQkJCQkJZXJyb3IoImFjY2VwdDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh1bnNldF9ub25ibG9jaygqbmV3c29jaykgPT0gLTEpIHsKLQkJCQljbG9zZSgqbmV3c29jayk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZHJvcF9jb25uZWN0aW9uKHN0YXJ0dXBzKSA9PSAxKSB7Ci0JCQkJZGVidWcoImRyb3AgY29ubmVjdGlvbiAjJWQiLCBzdGFydHVwcyk7Ci0JCQkJY2xvc2UoKm5ld3NvY2spOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHBpcGUoc3RhcnR1cF9wKSA9PSAtMSkgewotCQkJCWNsb3NlKCpuZXdzb2NrKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHJleGVjX2ZsYWcgJiYgc29ja2V0cGFpcihBRl9VTklYLAotCQkJICAgIFNPQ0tfU1RSRUFNLCAwLCBjb25maWdfcykgPT0gLTEpIHsKLQkJCQllcnJvcigicmVleGVjIHNvY2tldHBhaXI6ICVzIiwKLQkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQljbG9zZSgqbmV3c29jayk7Ci0JCQkJY2xvc2Uoc3RhcnR1cF9wWzBdKTsKLQkJCQljbG9zZShzdGFydHVwX3BbMV0pOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IgKGogPSAwOyBqIDwgb3B0aW9ucy5tYXhfc3RhcnR1cHM7IGorKykKLQkJCQlpZiAoc3RhcnR1cF9waXBlc1tqXSA9PSAtMSkgewotCQkJCQlzdGFydHVwX3BpcGVzW2pdID0gc3RhcnR1cF9wWzBdOwotCQkJCQlpZiAobWF4ZmQgPCBzdGFydHVwX3BbMF0pCi0JCQkJCQltYXhmZCA9IHN0YXJ0dXBfcFswXTsKLQkJCQkJc3RhcnR1cHMrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkvKgotCQkJICogR290IGNvbm5lY3Rpb24uICBGb3JrIGEgY2hpbGQgdG8gaGFuZGxlIGl0LCB1bmxlc3MKLQkJCSAqIHdlIGFyZSBpbiBkZWJ1Z2dpbmcgbW9kZS4KLQkJCSAqLwotCQkJaWYgKGRlYnVnX2ZsYWcpIHsKLQkJCQkvKgotCQkJCSAqIEluIGRlYnVnZ2luZyBtb2RlLiAgQ2xvc2UgdGhlIGxpc3RlbmluZwotCQkJCSAqIHNvY2tldCwgYW5kIHN0YXJ0IHByb2Nlc3NpbmcgdGhlCi0JCQkJICogY29ubmVjdGlvbiB3aXRob3V0IGZvcmtpbmcuCi0JCQkJICovCi0JCQkJZGVidWcoIlNlcnZlciB3aWxsIG5vdCBmb3JrIHdoZW4gcnVubmluZyBpbiBkZWJ1Z2dpbmcgbW9kZS4iKTsKLQkJCQljbG9zZV9saXN0ZW5fc29ja3MoKTsKLQkJCQkqc29ja19pbiA9ICpuZXdzb2NrOwotCQkJCSpzb2NrX291dCA9ICpuZXdzb2NrOwotCQkJCWNsb3NlKHN0YXJ0dXBfcFswXSk7Ci0JCQkJY2xvc2Uoc3RhcnR1cF9wWzFdKTsKLQkJCQlzdGFydHVwX3BpcGUgPSAtMTsKLQkJCQlwaWQgPSBnZXRwaWQoKTsKLQkJCQlpZiAocmV4ZWNfZmxhZykgewotCQkJCQlzZW5kX3JleGVjX3N0YXRlKGNvbmZpZ19zWzBdLAotCQkJCQkgICAgJmNmZyk7Ci0JCQkJCWNsb3NlKGNvbmZpZ19zWzBdKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBOb3JtYWwgcHJvZHVjdGlvbiBkYWVtb24uICBGb3JrLCBhbmQgaGF2ZQotCQkJICogdGhlIGNoaWxkIHByb2Nlc3MgdGhlIGNvbm5lY3Rpb24uIFRoZQotCQkJICogcGFyZW50IGNvbnRpbnVlcyBsaXN0ZW5pbmcuCi0JCQkgKi8KLQkJCXBsYXRmb3JtX3ByZV9mb3JrKCk7Ci0JCQlpZiAoKHBpZCA9IGZvcmsoKSkgPT0gMCkgewotCQkJCS8qCi0JCQkJICogQ2hpbGQuICBDbG9zZSB0aGUgbGlzdGVuaW5nIGFuZAotCQkJCSAqIG1heF9zdGFydHVwIHNvY2tldHMuICBTdGFydCB1c2luZwotCQkJCSAqIHRoZSBhY2NlcHRlZCBzb2NrZXQuIFJlaW5pdGlhbGl6ZQotCQkJCSAqIGxvZ2dpbmcgKHNpbmNlIG91ciBwaWQgaGFzIGNoYW5nZWQpLgotCQkJCSAqIFdlIGJyZWFrIG91dCBvZiB0aGUgbG9vcCB0byBoYW5kbGUKLQkJCQkgKiB0aGUgY29ubmVjdGlvbi4KLQkJCQkgKi8KLQkJCQlwbGF0Zm9ybV9wb3N0X2ZvcmtfY2hpbGQoKTsKLQkJCQlzdGFydHVwX3BpcGUgPSBzdGFydHVwX3BbMV07Ci0JCQkJY2xvc2Vfc3RhcnR1cF9waXBlcygpOwotCQkJCWNsb3NlX2xpc3Rlbl9zb2NrcygpOwotCQkJCSpzb2NrX2luID0gKm5ld3NvY2s7Ci0JCQkJKnNvY2tfb3V0ID0gKm5ld3NvY2s7Ci0JCQkJbG9nX2luaXQoX19wcm9nbmFtZSwKLQkJCQkgICAgb3B0aW9ucy5sb2dfbGV2ZWwsCi0JCQkJICAgIG9wdGlvbnMubG9nX2ZhY2lsaXR5LAotCQkJCSAgICBsb2dfc3RkZXJyKTsKLQkJCQlpZiAocmV4ZWNfZmxhZykKLQkJCQkJY2xvc2UoY29uZmlnX3NbMF0pOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBQYXJlbnQuICBTdGF5IGluIHRoZSBsb29wLiAqLwotCQkJcGxhdGZvcm1fcG9zdF9mb3JrX3BhcmVudChwaWQpOwotCQkJaWYgKHBpZCA8IDApCi0JCQkJZXJyb3IoImZvcms6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQllbHNlCi0JCQkJZGVidWcoIkZvcmtlZCBjaGlsZCAlbGQuIiwgKGxvbmcpcGlkKTsKLQotCQkJY2xvc2Uoc3RhcnR1cF9wWzFdKTsKLQotCQkJaWYgKHJleGVjX2ZsYWcpIHsKLQkJCQlzZW5kX3JleGVjX3N0YXRlKGNvbmZpZ19zWzBdLCAmY2ZnKTsKLQkJCQljbG9zZShjb25maWdfc1swXSk7Ci0JCQkJY2xvc2UoY29uZmlnX3NbMV0pOwotCQkJfQotCi0JCQkvKgotCQkJICogTWFyayB0aGF0IHRoZSBrZXkgaGFzIGJlZW4gdXNlZCAoaXQKLQkJCSAqIHdhcyAiZ2l2ZW4iIHRvIHRoZSBjaGlsZCkuCi0JCQkgKi8KLQkJCWlmICgob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18xKSAmJgotCQkJICAgIGtleV91c2VkID09IDApIHsKLQkJCQkvKiBTY2hlZHVsZSBzZXJ2ZXIga2V5IHJlZ2VuZXJhdGlvbiBhbGFybS4gKi8KLQkJCQlzaWduYWwoU0lHQUxSTSwga2V5X3JlZ2VuZXJhdGlvbl9hbGFybSk7Ci0JCQkJYWxhcm0ob3B0aW9ucy5rZXlfcmVnZW5lcmF0aW9uX3RpbWUpOwotCQkJCWtleV91c2VkID0gMTsKLQkJCX0KLQotCQkJY2xvc2UoKm5ld3NvY2spOwotCi0JCQkvKgotCQkJICogRW5zdXJlIHRoYXQgb3VyIHJhbmRvbSBzdGF0ZSBkaWZmZXJzCi0JCQkgKiBmcm9tIHRoYXQgb2YgdGhlIGNoaWxkCi0JCQkgKi8KLQkJCWFyYzRyYW5kb21fc3RpcigpOwotCQl9Ci0KLQkJLyogY2hpbGQgcHJvY2VzcyBjaGVjayAob3IgZGVidWcgbW9kZSkgKi8KLQkJaWYgKG51bV9saXN0ZW5fc29ja3MgPCAwKQotCQkJYnJlYWs7Ci0JfQotfQotCi0KLS8qCi0gKiBNYWluIHByb2dyYW0gZm9yIHRoZSBkYWVtb24uCi0gKi8KLWludAotbWFpbihpbnQgYWMsIGNoYXIgKiphdikKLXsKLQlleHRlcm4gY2hhciAqb3B0YXJnOwotCWV4dGVybiBpbnQgb3B0aW5kOwotCWludCBvcHQsIGksIGosIG9uID0gMTsKLQlpbnQgc29ja19pbiA9IC0xLCBzb2NrX291dCA9IC0xLCBuZXdzb2NrID0gLTE7Ci0JY29uc3QgY2hhciAqcmVtb3RlX2lwOwotCWNoYXIgKnRlc3RfdXNlciA9IE5VTEwsICp0ZXN0X2hvc3QgPSBOVUxMLCAqdGVzdF9hZGRyID0gTlVMTDsKLQlpbnQgcmVtb3RlX3BvcnQ7Ci0JY2hhciAqbGluZSwgKnAsICpjcDsKLQlpbnQgY29uZmlnX3NbMl0gPSB7IC0xICwgLTEgfTsKLQl1X2ludDY0X3QgaWJ5dGVzLCBvYnl0ZXM7Ci0JbW9kZV90IG5ld191bWFzazsKLQlLZXkgKmtleTsKLQlBdXRoY3R4dCAqYXV0aGN0eHQ7Ci0KLSNpZmRlZiBIQVZFX1NFQ1VSRVdBUkUKLQkodm9pZClzZXRfYXV0aF9wYXJhbWV0ZXJzKGFjLCBhdik7Ci0jZW5kaWYKLQlfX3Byb2duYW1lID0gc3NoX2dldF9wcm9nbmFtZShhdlswXSk7Ci0KLQkvKiBTYXZlIGFyZ3YuIER1cGxpY2F0ZSBzbyBzZXRwcm9jdGl0bGUgZW11bGF0aW9uIGRvZXNuJ3QgY2xvYmJlciBpdCAqLwotCXNhdmVkX2FyZ2MgPSBhYzsKLQlyZXhlY19hcmdjID0gYWM7Ci0Jc2F2ZWRfYXJndiA9IHhjYWxsb2MoYWMgKyAxLCBzaXplb2YoKnNhdmVkX2FyZ3YpKTsKLQlmb3IgKGkgPSAwOyBpIDwgYWM7IGkrKykKLQkJc2F2ZWRfYXJndltpXSA9IHhzdHJkdXAoYXZbaV0pOwotCXNhdmVkX2FyZ3ZbaV0gPSBOVUxMOwotCi0jaWZuZGVmIEhBVkVfU0VUUFJPQ1RJVExFCi0JLyogUHJlcGFyZSBmb3IgbGF0ZXIgc2V0cHJvY3RpdGxlIGVtdWxhdGlvbiAqLwotCWNvbXBhdF9pbml0X3NldHByb2N0aXRsZShhYywgYXYpOwotCWF2ID0gc2F2ZWRfYXJndjsKLSNlbmRpZgotCi0JaWYgKGdldGV1aWQoKSA9PSAwICYmIHNldGdyb3VwcygwLCBOVUxMKSA9PSAtMSkKLQkJZGVidWcoInNldGdyb3VwcygpOiAlLjIwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCi0JLyogRW5zdXJlIHRoYXQgZmRzIDAsIDEgYW5kIDIgYXJlIG9wZW4gb3IgZGlyZWN0ZWQgdG8gL2Rldi9udWxsICovCi0Jc2FuaXRpc2Vfc3RkZmQoKTsKLQotCS8qIEluaXRpYWxpemUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiAqLwotCWluaXRpYWxpemVfc2VydmVyX29wdGlvbnMoJm9wdGlvbnMpOwotCi0JLyogUGFyc2UgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4gKi8KLQl3aGlsZSAoKG9wdCA9IGdldG9wdChhYywgYXYsICJmOnA6YjprOmg6Zzp1Om86QzpkRGVpcXJ0UVJUNDYiKSkgIT0gLTEpIHsKLQkJc3dpdGNoIChvcHQpIHsKLQkJY2FzZSAnNCc6Ci0JCQlvcHRpb25zLmFkZHJlc3NfZmFtaWx5ID0gQUZfSU5FVDsKLQkJCWJyZWFrOwotCQljYXNlICc2JzoKLQkJCW9wdGlvbnMuYWRkcmVzc19mYW1pbHkgPSBBRl9JTkVUNjsKLQkJCWJyZWFrOwotCQljYXNlICdmJzoKLQkJCWNvbmZpZ19maWxlX25hbWUgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAnYyc6Ci0JCQlpZiAob3B0aW9ucy5udW1faG9zdF9jZXJ0X2ZpbGVzID49IE1BWF9IT1NUQ0VSVFMpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IGhvc3QgY2VydGlmaWNhdGVzLlxuIik7Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJCW9wdGlvbnMuaG9zdF9jZXJ0X2ZpbGVzW29wdGlvbnMubnVtX2hvc3RfY2VydF9maWxlcysrXSA9Ci0JCQkgICBkZXJlbGF0aXZpc2VfcGF0aChvcHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2QnOgotCQkJaWYgKGRlYnVnX2ZsYWcgPT0gMCkgewotCQkJCWRlYnVnX2ZsYWcgPSAxOwotCQkJCW9wdGlvbnMubG9nX2xldmVsID0gU1lTTE9HX0xFVkVMX0RFQlVHMTsKLQkJCX0gZWxzZSBpZiAob3B0aW9ucy5sb2dfbGV2ZWwgPCBTWVNMT0dfTEVWRUxfREVCVUczKQotCQkJCW9wdGlvbnMubG9nX2xldmVsKys7Ci0JCQlicmVhazsKLQkJY2FzZSAnRCc6Ci0JCQlub19kYWVtb25fZmxhZyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnZSc6Ci0JCQlsb2dfc3RkZXJyID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdpJzoKLQkJCWluZXRkX2ZsYWcgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3InOgotCQkJcmV4ZWNfZmxhZyA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSAnUic6Ci0JCQlyZXhlY2VkX2ZsYWcgPSAxOwotCQkJaW5ldGRfZmxhZyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnUSc6Ci0JCQkvKiBpZ25vcmVkICovCi0JCQlicmVhazsKLQkJY2FzZSAncSc6Ci0JCQlvcHRpb25zLmxvZ19sZXZlbCA9IFNZU0xPR19MRVZFTF9RVUlFVDsKLQkJCWJyZWFrOwotCQljYXNlICdiJzoKLQkJCW9wdGlvbnMuc2VydmVyX2tleV9iaXRzID0gKGludClzdHJ0b251bShvcHRhcmcsIDI1NiwKLQkJCSAgICAzMjc2OCwgTlVMTCk7Ci0JCQlicmVhazsKLQkJY2FzZSAncCc6Ci0JCQlvcHRpb25zLnBvcnRzX2Zyb21fY21kbGluZSA9IDE7Ci0JCQlpZiAob3B0aW9ucy5udW1fcG9ydHMgPj0gTUFYX1BPUlRTKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBwb3J0cy5cbiIpOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCQlvcHRpb25zLnBvcnRzW29wdGlvbnMubnVtX3BvcnRzKytdID0gYTJwb3J0KG9wdGFyZyk7Ci0JCQlpZiAob3B0aW9ucy5wb3J0c1tvcHRpb25zLm51bV9wb3J0cy0xXSA8PSAwKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJCYWQgcG9ydCBudW1iZXIuXG4iKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ2cnOgotCQkJaWYgKChvcHRpb25zLmxvZ2luX2dyYWNlX3RpbWUgPSBjb252dGltZShvcHRhcmcpKSA9PSAtMSkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBsb2dpbiBncmFjZSB0aW1lLlxuIik7Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICdrJzoKLQkJCWlmICgob3B0aW9ucy5rZXlfcmVnZW5lcmF0aW9uX3RpbWUgPSBjb252dGltZShvcHRhcmcpKSA9PSAtMSkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBrZXkgcmVnZW5lcmF0aW9uIGludGVydmFsLlxuIik7Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICdoJzoKLQkJCWlmIChvcHRpb25zLm51bV9ob3N0X2tleV9maWxlcyA+PSBNQVhfSE9TVEtFWVMpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IGhvc3Qga2V5cy5cbiIpOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCQlvcHRpb25zLmhvc3Rfa2V5X2ZpbGVzW29wdGlvbnMubnVtX2hvc3Rfa2V5X2ZpbGVzKytdID0gCi0JCQkgICBkZXJlbGF0aXZpc2VfcGF0aChvcHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3QnOgotCQkJdGVzdF9mbGFnID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdUJzoKLQkJCXRlc3RfZmxhZyA9IDI7Ci0JCQlicmVhazsKLQkJY2FzZSAnQyc6Ci0JCQljcCA9IG9wdGFyZzsKLQkJCXdoaWxlICgocCA9IHN0cnNlcCgmY3AsICIsIikpICYmICpwICE9ICdcMCcpIHsKLQkJCQlpZiAoc3RybmNtcChwLCAiYWRkcj0iLCA1KSA9PSAwKQotCQkJCQl0ZXN0X2FkZHIgPSB4c3RyZHVwKHAgKyA1KTsKLQkJCQllbHNlIGlmIChzdHJuY21wKHAsICJob3N0PSIsIDUpID09IDApCi0JCQkJCXRlc3RfaG9zdCA9IHhzdHJkdXAocCArIDUpOwotCQkJCWVsc2UgaWYgKHN0cm5jbXAocCwgInVzZXI9IiwgNSkgPT0gMCkKLQkJCQkJdGVzdF91c2VyID0geHN0cmR1cChwICsgNSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCB0ZXN0ICIKLQkJCQkJICAgICJtb2RlIHNwZWNpZmljYXRpb24gJXNcbiIsIHApOwotCQkJCQlleGl0KDEpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICd1JzoKLQkJCXV0bXBfbGVuID0gKHVfaW50KXN0cnRvbnVtKG9wdGFyZywgMCwgTUFYSE9TVE5BTUVMRU4rMSwgTlVMTCk7Ci0JCQlpZiAodXRtcF9sZW4gPiBNQVhIT1NUTkFNRUxFTikgewotCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCB1dG1wIGxlbmd0aC5cbiIpOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnbyc6Ci0JCQlsaW5lID0geHN0cmR1cChvcHRhcmcpOwotCQkJaWYgKHByb2Nlc3Nfc2VydmVyX2NvbmZpZ19saW5lKCZvcHRpb25zLCBsaW5lLAotCQkJICAgICJjb21tYW5kLWxpbmUiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSAhPSAwKQotCQkJCWV4aXQoMSk7Ci0JCQl4ZnJlZShsaW5lKTsKLQkJCWJyZWFrOwotCQljYXNlICc/JzoKLQkJZGVmYXVsdDoKLQkJCXVzYWdlKCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAocmV4ZWNlZF9mbGFnIHx8IGluZXRkX2ZsYWcpCi0JCXJleGVjX2ZsYWcgPSAwOwotCWlmICghdGVzdF9mbGFnICYmIChyZXhlY19mbGFnICYmIChhdlswXSA9PSBOVUxMIHx8ICphdlswXSAhPSAnLycpKSkKLQkJZmF0YWwoInNzaGQgcmUtZXhlYyByZXF1aXJlcyBleGVjdXRpb24gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIik7Ci0JaWYgKHJleGVjZWRfZmxhZykKLQkJY2xvc2Vmcm9tKFJFRVhFQ19NSU5fRlJFRV9GRCk7Ci0JZWxzZQotCQljbG9zZWZyb20oUkVFWEVDX0RFVkNSWVBUT19SRVNFUlZFRF9GRCk7Ci0KLQlPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpOwotCi0JLyoKLQkgKiBGb3JjZSBsb2dnaW5nIHRvIHN0ZGVyciB1bnRpbCB3ZSBoYXZlIGxvYWRlZCB0aGUgcHJpdmF0ZSBob3N0Ci0JICoga2V5ICh1bmxlc3Mgc3RhcnRlZCBmcm9tIGluZXRkKQotCSAqLwotCWxvZ19pbml0KF9fcHJvZ25hbWUsCi0JICAgIG9wdGlvbnMubG9nX2xldmVsID09IFNZU0xPR19MRVZFTF9OT1RfU0VUID8KLQkgICAgU1lTTE9HX0xFVkVMX0lORk8gOiBvcHRpb25zLmxvZ19sZXZlbCwKLQkgICAgb3B0aW9ucy5sb2dfZmFjaWxpdHkgPT0gU1lTTE9HX0ZBQ0lMSVRZX05PVF9TRVQgPwotCSAgICBTWVNMT0dfRkFDSUxJVFlfQVVUSCA6IG9wdGlvbnMubG9nX2ZhY2lsaXR5LAotCSAgICBsb2dfc3RkZXJyIHx8ICFpbmV0ZF9mbGFnKTsKLQotCS8qCi0JICogVW5zZXQgS1JCNUNDTkFNRSwgb3RoZXJ3aXNlIHRoZSB1c2VyJ3Mgc2Vzc2lvbiBtYXkgaW5oZXJpdCBpdCBmcm9tCi0JICogcm9vdCdzIGVudmlyb25tZW50Ci0JICovCi0JaWYgKGdldGVudigiS1JCNUNDTkFNRSIpICE9IE5VTEwpCi0JCXVuc2V0ZW52KCJLUkI1Q0NOQU1FIik7Ci0KLSNpZmRlZiBfVU5JQ09TCi0JLyogQ3JheSBjYW4gZGVmaW5lIHVzZXIgcHJpdnMgZHJvcCBhbGwgcHJpdnMgbm93IQotCSAqIE5vdCBuZWVkZWQgb24gUFJJVl9TVSBzeXN0ZW1zIQotCSAqLwotCWRyb3BfY3JheV9wcml2cygpOwotI2VuZGlmCi0KLQlzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5ID0gTlVMTDsKLQlzZW5zaXRpdmVfZGF0YS5zc2gxX2hvc3Rfa2V5ID0gTlVMTDsKLQlzZW5zaXRpdmVfZGF0YS5oYXZlX3NzaDFfa2V5ID0gMDsKLQlzZW5zaXRpdmVfZGF0YS5oYXZlX3NzaDJfa2V5ID0gMDsKLQotCS8qCi0JICogSWYgd2UncmUgZG9pbmcgYW4gZXh0ZW5kZWQgY29uZmlnIHRlc3QsIG1ha2Ugc3VyZSB3ZSBoYXZlIGFsbCBvZgotCSAqIHRoZSBwYXJhbWV0ZXJzIHdlIG5lZWQuICBJZiB3ZSdyZSBub3QgZG9pbmcgYW4gZXh0ZW5kZWQgdGVzdCwKLQkgKiBkbyBub3Qgc2lsZW50bHkgaWdub3JlIGNvbm5lY3Rpb24gdGVzdCBwYXJhbXMuCi0JICovCi0JaWYgKHRlc3RfZmxhZyA+PSAyICYmCi0JICAgKHRlc3RfdXNlciAhPSBOVUxMIHx8IHRlc3RfaG9zdCAhPSBOVUxMIHx8IHRlc3RfYWRkciAhPSBOVUxMKQotCSAgICAmJiAodGVzdF91c2VyID09IE5VTEwgfHwgdGVzdF9ob3N0ID09IE5VTEwgfHwgdGVzdF9hZGRyID09IE5VTEwpKQotCQlmYXRhbCgidXNlciwgaG9zdCBhbmQgYWRkciBhcmUgYWxsIHJlcXVpcmVkIHdoZW4gdGVzdGluZyAiCi0JCSAgICJNYXRjaCBjb25maWdzIik7Ci0JaWYgKHRlc3RfZmxhZyA8IDIgJiYgKHRlc3RfdXNlciAhPSBOVUxMIHx8IHRlc3RfaG9zdCAhPSBOVUxMIHx8Ci0JICAgIHRlc3RfYWRkciAhPSBOVUxMKSkKLQkJZmF0YWwoIkNvbmZpZyB0ZXN0IGNvbm5lY3Rpb24gcGFyYW1ldGVyICgtQykgcHJvdmlkZWQgd2l0aG91dCAiCi0JCSAgICJ0ZXN0IG1vZGUgKC1UKSIpOwotCi0JLyogRmV0Y2ggb3VyIGNvbmZpZ3VyYXRpb24gKi8KLQlidWZmZXJfaW5pdCgmY2ZnKTsKLQlpZiAocmV4ZWNlZF9mbGFnKQotCQlyZWN2X3JleGVjX3N0YXRlKFJFRVhFQ19DT05GSUdfUEFTU19GRCwgJmNmZyk7Ci0JZWxzZQotCQlsb2FkX3NlcnZlcl9jb25maWcoY29uZmlnX2ZpbGVfbmFtZSwgJmNmZyk7Ci0KLQlwYXJzZV9zZXJ2ZXJfY29uZmlnKCZvcHRpb25zLCByZXhlY2VkX2ZsYWcgPyAicmV4ZWMiIDogY29uZmlnX2ZpbGVfbmFtZSwKLQkgICAgJmNmZywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0KLQlzZWVkX3JuZygpOwotCi0JLyogRmlsbCBpbiBkZWZhdWx0IHZhbHVlcyBmb3IgdGhvc2Ugb3B0aW9ucyBub3QgZXhwbGljaXRseSBzZXQuICovCi0JZmlsbF9kZWZhdWx0X3NlcnZlcl9vcHRpb25zKCZvcHRpb25zKTsKLQotCS8qIGNoYWxsZW5nZS1yZXNwb25zZSBpcyBpbXBsZW1lbnRlZCB2aWEga2V5Ym9hcmQgaW50ZXJhY3RpdmUgKi8KLQlpZiAob3B0aW9ucy5jaGFsbGVuZ2VfcmVzcG9uc2VfYXV0aGVudGljYXRpb24pCi0JCW9wdGlvbnMua2JkX2ludGVyYWN0aXZlX2F1dGhlbnRpY2F0aW9uID0gMTsKLQotCS8qIHNldCBkZWZhdWx0IGNoYW5uZWwgQUYgKi8KLQljaGFubmVsX3NldF9hZihvcHRpb25zLmFkZHJlc3NfZmFtaWx5KTsKLQotCS8qIENoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBhcmd1bWVudHMuICovCi0JaWYgKG9wdGluZCA8IGFjKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiRXh0cmEgYXJndW1lbnQgJXMuXG4iLCBhdltvcHRpbmRdKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlkZWJ1Zygic3NoZCB2ZXJzaW9uICUuMTAwcyIsIFNTSF9SRUxFQVNFKTsKLQotCS8qIFN0b3JlIHByaXZpbGVnZSBzZXBhcmF0aW9uIHVzZXIgZm9yIGxhdGVyIHVzZSBpZiByZXF1aXJlZC4gKi8KLQlpZiAoKHByaXZzZXBfcHcgPSBnZXRwd25hbShTU0hfUFJJVlNFUF9VU0VSKSkgPT0gTlVMTCkgewotCQlpZiAodXNlX3ByaXZzZXAgfHwgb3B0aW9ucy5rZXJiZXJvc19hdXRoZW50aWNhdGlvbikKLQkJCWZhdGFsKCJQcml2aWxlZ2Ugc2VwYXJhdGlvbiB1c2VyICVzIGRvZXMgbm90IGV4aXN0IiwKLQkJCSAgICBTU0hfUFJJVlNFUF9VU0VSKTsKLQl9IGVsc2UgewotCQlpZiAocHJpdnNlcF9wdy0+cHdfcGFzc3dkKQotCQkJbWVtc2V0KHByaXZzZXBfcHctPnB3X3Bhc3N3ZCwgMCwgc3RybGVuKHByaXZzZXBfcHctPnB3X3Bhc3N3ZCkpOwotCQlwcml2c2VwX3B3ID0gcHdjb3B5KHByaXZzZXBfcHcpOwotCQlpZiAocHJpdnNlcF9wdy0+cHdfcGFzc3dkKQotCQkJeGZyZWUocHJpdnNlcF9wdy0+cHdfcGFzc3dkKTsKLQkJcHJpdnNlcF9wdy0+cHdfcGFzc3dkID0geHN0cmR1cCgiKiIpOwotCX0KLQllbmRwd2VudCgpOwotCi0JLyogbG9hZCBwcml2YXRlIGhvc3Qga2V5cyAqLwotCXNlbnNpdGl2ZV9kYXRhLmhvc3Rfa2V5cyA9IHhjYWxsb2Mob3B0aW9ucy5udW1faG9zdF9rZXlfZmlsZXMsCi0JICAgIHNpemVvZihLZXkgKikpOwotCWZvciAoaSA9IDA7IGkgPCBvcHRpb25zLm51bV9ob3N0X2tleV9maWxlczsgaSsrKQotCQlzZW5zaXRpdmVfZGF0YS5ob3N0X2tleXNbaV0gPSBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2hvc3Rfa2V5X2ZpbGVzOyBpKyspIHsKLQkJa2V5ID0ga2V5X2xvYWRfcHJpdmF0ZShvcHRpb25zLmhvc3Rfa2V5X2ZpbGVzW2ldLCAiIiwgTlVMTCk7Ci0JCXNlbnNpdGl2ZV9kYXRhLmhvc3Rfa2V5c1tpXSA9IGtleTsKLQkJaWYgKGtleSA9PSBOVUxMKSB7Ci0JCQllcnJvcigiQ291bGQgbm90IGxvYWQgaG9zdCBrZXk6ICVzIiwKLQkJCSAgICBvcHRpb25zLmhvc3Rfa2V5X2ZpbGVzW2ldKTsKLQkJCXNlbnNpdGl2ZV9kYXRhLmhvc3Rfa2V5c1tpXSA9IE5VTEw7Ci0JCQljb250aW51ZTsKLQkJfQotCQlzd2l0Y2ggKGtleS0+dHlwZSkgewotCQljYXNlIEtFWV9SU0ExOgotCQkJc2Vuc2l0aXZlX2RhdGEuc3NoMV9ob3N0X2tleSA9IGtleTsKLQkJCXNlbnNpdGl2ZV9kYXRhLmhhdmVfc3NoMV9rZXkgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgS0VZX1JTQToKLQkJY2FzZSBLRVlfRFNBOgotCQljYXNlIEtFWV9FQ0RTQToKLQkJCXNlbnNpdGl2ZV9kYXRhLmhhdmVfc3NoMl9rZXkgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGVidWcoInByaXZhdGUgaG9zdCBrZXk6ICMlZCB0eXBlICVkICVzIiwgaSwga2V5LT50eXBlLAotCQkgICAga2V5X3R5cGUoa2V5KSk7Ci0JfQotCWlmICgob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18xKSAmJiAhc2Vuc2l0aXZlX2RhdGEuaGF2ZV9zc2gxX2tleSkgewotCQlsb2dpdCgiRGlzYWJsaW5nIHByb3RvY29sIHZlcnNpb24gMS4gQ291bGQgbm90IGxvYWQgaG9zdCBrZXkiKTsKLQkJb3B0aW9ucy5wcm90b2NvbCAmPSB+U1NIX1BST1RPXzE7Ci0JfQotCWlmICgob3B0aW9ucy5wcm90b2NvbCAmIFNTSF9QUk9UT18yKSAmJiAhc2Vuc2l0aXZlX2RhdGEuaGF2ZV9zc2gyX2tleSkgewotCQlsb2dpdCgiRGlzYWJsaW5nIHByb3RvY29sIHZlcnNpb24gMi4gQ291bGQgbm90IGxvYWQgaG9zdCBrZXkiKTsKLQkJb3B0aW9ucy5wcm90b2NvbCAmPSB+U1NIX1BST1RPXzI7Ci0JfQotCWlmICghKG9wdGlvbnMucHJvdG9jb2wgJiAoU1NIX1BST1RPXzF8U1NIX1BST1RPXzIpKSkgewotCQlsb2dpdCgic3NoZDogbm8gaG9zdGtleXMgYXZhaWxhYmxlIC0tIGV4aXRpbmcuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JLyoKLQkgKiBMb2FkIGNlcnRpZmljYXRlcy4gVGhleSBhcmUgc3RvcmVkIGluIGFuIGFycmF5IGF0IGlkZW50aWNhbAotCSAqIGluZGljZXMgdG8gdGhlIHB1YmxpYyBrZXlzIHRoYXQgdGhleSByZWxhdGUgdG8uCi0JICovCi0Jc2Vuc2l0aXZlX2RhdGEuaG9zdF9jZXJ0aWZpY2F0ZXMgPSB4Y2FsbG9jKG9wdGlvbnMubnVtX2hvc3Rfa2V5X2ZpbGVzLAotCSAgICBzaXplb2YoS2V5ICopKTsKLQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5udW1faG9zdF9rZXlfZmlsZXM7IGkrKykKLQkJc2Vuc2l0aXZlX2RhdGEuaG9zdF9jZXJ0aWZpY2F0ZXNbaV0gPSBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubnVtX2hvc3RfY2VydF9maWxlczsgaSsrKSB7Ci0JCWtleSA9IGtleV9sb2FkX3B1YmxpYyhvcHRpb25zLmhvc3RfY2VydF9maWxlc1tpXSwgTlVMTCk7Ci0JCWlmIChrZXkgPT0gTlVMTCkgewotCQkJZXJyb3IoIkNvdWxkIG5vdCBsb2FkIGhvc3QgY2VydGlmaWNhdGU6ICVzIiwKLQkJCSAgICBvcHRpb25zLmhvc3RfY2VydF9maWxlc1tpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIWtleV9pc19jZXJ0KGtleSkpIHsKLQkJCWVycm9yKCJDZXJ0aWZpY2F0ZSBmaWxlIGlzIG5vdCBhIGNlcnRpZmljYXRlOiAlcyIsCi0JCQkgICAgb3B0aW9ucy5ob3N0X2NlcnRfZmlsZXNbaV0pOwotCQkJa2V5X2ZyZWUoa2V5KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIEZpbmQgbWF0Y2hpbmcgcHJpdmF0ZSBrZXkgKi8KLQkJZm9yIChqID0gMDsgaiA8IG9wdGlvbnMubnVtX2hvc3Rfa2V5X2ZpbGVzOyBqKyspIHsKLQkJCWlmIChrZXlfZXF1YWxfcHVibGljKGtleSwKLQkJCSAgICBzZW5zaXRpdmVfZGF0YS5ob3N0X2tleXNbal0pKSB7Ci0JCQkJc2Vuc2l0aXZlX2RhdGEuaG9zdF9jZXJ0aWZpY2F0ZXNbal0gPSBrZXk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPj0gb3B0aW9ucy5udW1faG9zdF9rZXlfZmlsZXMpIHsKLQkJCWVycm9yKCJObyBtYXRjaGluZyBwcml2YXRlIGtleSBmb3IgY2VydGlmaWNhdGU6ICVzIiwKLQkJCSAgICBvcHRpb25zLmhvc3RfY2VydF9maWxlc1tpXSk7Ci0JCQlrZXlfZnJlZShrZXkpOwotCQkJY29udGludWU7Ci0JCX0KLQkJc2Vuc2l0aXZlX2RhdGEuaG9zdF9jZXJ0aWZpY2F0ZXNbal0gPSBrZXk7Ci0JCWRlYnVnKCJob3N0IGNlcnRpZmljYXRlOiAjJWQgdHlwZSAlZCAlcyIsIGosIGtleS0+dHlwZSwKLQkJICAgIGtleV90eXBlKGtleSkpOwotCX0KLQkvKiBDaGVjayBjZXJ0YWluIHZhbHVlcyBmb3Igc2FuaXR5LiAqLwotCWlmIChvcHRpb25zLnByb3RvY29sICYgU1NIX1BST1RPXzEpIHsKLQkJaWYgKG9wdGlvbnMuc2VydmVyX2tleV9iaXRzIDwgNTEyIHx8Ci0JCSAgICBvcHRpb25zLnNlcnZlcl9rZXlfYml0cyA+IDMyNzY4KSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIkJhZCBzZXJ2ZXIga2V5IHNpemUuXG4iKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJLyoKLQkJICogQ2hlY2sgdGhhdCBzZXJ2ZXIgYW5kIGhvc3Qga2V5IGxlbmd0aHMgZGlmZmVyIHN1ZmZpY2llbnRseS4gVGhpcwotCQkgKiBpcyBuZWNlc3NhcnkgdG8gbWFrZSBkb3VibGUgZW5jcnlwdGlvbiB3b3JrIHdpdGggcnNhcmVmLiBPaCwgSQotCQkgKiBoYXRlIHNvZnR3YXJlIHBhdGVudHMuIEkgZG9udCBrbm93IGlmIHRoaXMgY2FuIGdvPyBOaWVscwotCQkgKi8KLQkJaWYgKG9wdGlvbnMuc2VydmVyX2tleV9iaXRzID4KLQkJICAgIEJOX251bV9iaXRzKHNlbnNpdGl2ZV9kYXRhLnNzaDFfaG9zdF9rZXktPnJzYS0+bikgLQotCQkgICAgU1NIX0tFWV9CSVRTX1JFU0VSVkVEICYmIG9wdGlvbnMuc2VydmVyX2tleV9iaXRzIDwKLQkJICAgIEJOX251bV9iaXRzKHNlbnNpdGl2ZV9kYXRhLnNzaDFfaG9zdF9rZXktPnJzYS0+bikgKwotCQkgICAgU1NIX0tFWV9CSVRTX1JFU0VSVkVEKSB7Ci0JCQlvcHRpb25zLnNlcnZlcl9rZXlfYml0cyA9Ci0JCQkgICAgQk5fbnVtX2JpdHMoc2Vuc2l0aXZlX2RhdGEuc3NoMV9ob3N0X2tleS0+cnNhLT5uKSArCi0JCQkgICAgU1NIX0tFWV9CSVRTX1JFU0VSVkVEOwotCQkJZGVidWcoIkZvcmNpbmcgc2VydmVyIGtleSB0byAlZCBiaXRzIHRvIG1ha2UgaXQgZGlmZmVyIGZyb20gaG9zdCBrZXkuIiwKLQkJCSAgICBvcHRpb25zLnNlcnZlcl9rZXlfYml0cyk7Ci0JCX0KLQl9Ci0KLQlpZiAodXNlX3ByaXZzZXApIHsKLQkJc3RydWN0IHN0YXQgc3Q7Ci0KLQkJaWYgKChzdGF0KF9QQVRIX1BSSVZTRVBfQ0hST09UX0RJUiwgJnN0KSA9PSAtMSkgfHwKLQkJICAgIChTX0lTRElSKHN0LnN0X21vZGUpID09IDApKQotCQkJZmF0YWwoIk1pc3NpbmcgcHJpdmlsZWdlIHNlcGFyYXRpb24gZGlyZWN0b3J5OiAlcyIsCi0JCQkgICAgX1BBVEhfUFJJVlNFUF9DSFJPT1RfRElSKTsKLQotI2lmZGVmIEhBVkVfQ1lHV0lOCi0JCWlmIChjaGVja19udHNlYyhfUEFUSF9QUklWU0VQX0NIUk9PVF9ESVIpICYmCi0JCSAgICAoc3Quc3RfdWlkICE9IGdldHVpZCAoKSB8fAotCQkgICAgKHN0LnN0X21vZGUgJiAoU19JV0dSUHxTX0lXT1RIKSkgIT0gMCkpCi0jZWxzZQotCQlpZiAoc3Quc3RfdWlkICE9IDAgfHwgKHN0LnN0X21vZGUgJiAoU19JV0dSUHxTX0lXT1RIKSkgIT0gMCkKLSNlbmRpZgotCQkJZmF0YWwoIiVzIG11c3QgYmUgb3duZWQgYnkgcm9vdCBhbmQgbm90IGdyb3VwIG9yICIKLQkJCSAgICAid29ybGQtd3JpdGFibGUuIiwgX1BBVEhfUFJJVlNFUF9DSFJPT1RfRElSKTsKLQl9Ci0KLQlpZiAodGVzdF9mbGFnID4gMSkgewotCQlpZiAodGVzdF91c2VyICE9IE5VTEwgJiYgdGVzdF9hZGRyICE9IE5VTEwgJiYgdGVzdF9ob3N0ICE9IE5VTEwpCi0JCQlwYXJzZV9zZXJ2ZXJfbWF0Y2hfY29uZmlnKCZvcHRpb25zLCB0ZXN0X3VzZXIsCi0JCQkgICAgdGVzdF9ob3N0LCB0ZXN0X2FkZHIpOwotCQlkdW1wX2NvbmZpZygmb3B0aW9ucyk7Ci0JfQotCi0JLyogQ29uZmlndXJhdGlvbiBsb29rcyBnb29kLCBzbyBleGl0IGlmIGluIHRlc3QgbW9kZS4gKi8KLQlpZiAodGVzdF9mbGFnKQotCQlleGl0KDApOwotCi0JLyoKLQkgKiBDbGVhciBvdXQgYW55IHN1cHBsZW1lbnRhbCBncm91cHMgd2UgbWF5IGhhdmUgaW5oZXJpdGVkLiAgVGhpcwotCSAqIHByZXZlbnRzIGluYWR2ZXJ0ZW50IGNyZWF0aW9uIG9mIGZpbGVzIHdpdGggYmFkIG1vZGVzIChpbiB0aGUKLQkgKiBwb3J0YWJsZSB2ZXJzaW9uIGF0IGxlYXN0LCBpdCdzIGNlcnRhaW5seSBwb3NzaWJsZSBmb3IgUEFNCi0JICogdG8gY3JlYXRlIGEgZmlsZSwgYW5kIHdlIGNhbid0IGNvbnRyb2wgdGhlIGNvZGUgaW4gZXZlcnkKLQkgKiBtb2R1bGUgd2hpY2ggbWlnaHQgYmUgdXNlZCkuCi0JICovCi0JaWYgKHNldGdyb3VwcygwLCBOVUxMKSA8IDApCi0JCWRlYnVnKCJzZXRncm91cHMoKSBmYWlsZWQ6ICUuMjAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLQlpZiAocmV4ZWNfZmxhZykgewotCQlyZXhlY19hcmd2ID0geGNhbGxvYyhyZXhlY19hcmdjICsgMiwgc2l6ZW9mKGNoYXIgKikpOwotCQlmb3IgKGkgPSAwOyBpIDwgcmV4ZWNfYXJnYzsgaSsrKSB7Ci0JCQlkZWJ1ZygicmV4ZWNfYXJndlslZF09JyVzJyIsIGksIHNhdmVkX2FyZ3ZbaV0pOwotCQkJcmV4ZWNfYXJndltpXSA9IHNhdmVkX2FyZ3ZbaV07Ci0JCX0KLQkJcmV4ZWNfYXJndltyZXhlY19hcmdjXSA9ICItUiI7Ci0JCXJleGVjX2FyZ3ZbcmV4ZWNfYXJnYyArIDFdID0gTlVMTDsKLQl9Ci0KLQkvKiBFbnN1cmUgdGhhdCB1bWFzayBkaXNhbGxvd3MgYXQgbGVhc3QgZ3JvdXAgYW5kIHdvcmxkIHdyaXRlICovCi0JbmV3X3VtYXNrID0gdW1hc2soMDA3NykgfCAwMDIyOwotCSh2b2lkKSB1bWFzayhuZXdfdW1hc2spOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgbG9nIChpdCBpcyByZWluaXRpYWxpemVkIGJlbG93IGluIGNhc2Ugd2UgZm9ya2VkKS4gKi8KLQlpZiAoZGVidWdfZmxhZyAmJiAoIWluZXRkX2ZsYWcgfHwgcmV4ZWNlZF9mbGFnKSkKLQkJbG9nX3N0ZGVyciA9IDE7Ci0JbG9nX2luaXQoX19wcm9nbmFtZSwgb3B0aW9ucy5sb2dfbGV2ZWwsIG9wdGlvbnMubG9nX2ZhY2lsaXR5LCBsb2dfc3RkZXJyKTsKLQotCS8qCi0JICogSWYgbm90IGluIGRlYnVnZ2luZyBtb2RlLCBhbmQgbm90IHN0YXJ0ZWQgZnJvbSBpbmV0ZCwgZGlzY29ubmVjdAotCSAqIGZyb20gdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsLCBhbmQgZm9yay4gIFRoZSBvcmlnaW5hbCBwcm9jZXNzCi0JICogZXhpdHMuCi0JICovCi0JaWYgKCEoZGVidWdfZmxhZyB8fCBpbmV0ZF9mbGFnIHx8IG5vX2RhZW1vbl9mbGFnKSkgewotI2lmZGVmIFRJT0NOT1RUWQotCQlpbnQgZmQ7Ci0jZW5kaWYgLyogVElPQ05PVFRZICovCi0JCWlmIChkYWVtb24oMCwgMCkgPCAwKQotCQkJZmF0YWwoImRhZW1vbigpIGZhaWxlZDogJS4yMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQotCQkvKiBEaXNjb25uZWN0IGZyb20gdGhlIGNvbnRyb2xsaW5nIHR0eS4gKi8KLSNpZmRlZiBUSU9DTk9UVFkKLQkJZmQgPSBvcGVuKF9QQVRIX1RUWSwgT19SRFdSIHwgT19OT0NUVFkpOwotCQlpZiAoZmQgPj0gMCkgewotCQkJKHZvaWQpIGlvY3RsKGZkLCBUSU9DTk9UVFksIE5VTEwpOwotCQkJY2xvc2UoZmQpOwotCQl9Ci0jZW5kaWYgLyogVElPQ05PVFRZICovCi0JfQotCS8qIFJlaW5pdGlhbGl6ZSB0aGUgbG9nIChiZWNhdXNlIG9mIHRoZSBmb3JrIGFib3ZlKS4gKi8KLQlsb2dfaW5pdChfX3Byb2duYW1lLCBvcHRpb25zLmxvZ19sZXZlbCwgb3B0aW9ucy5sb2dfZmFjaWxpdHksIGxvZ19zdGRlcnIpOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICovCi0JYXJjNHJhbmRvbV9zdGlyKCk7Ci0KLQkvKiBDaGRpciB0byB0aGUgcm9vdCBkaXJlY3Rvcnkgc28gdGhhdCB0aGUgY3VycmVudCBkaXNrIGNhbiBiZQotCSAgIHVubW91bnRlZCBpZiBkZXNpcmVkLiAqLwotCWNoZGlyKCIvIik7Ci0KLQkvKiBpZ25vcmUgU0lHUElQRSAqLwotCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKLQotCS8qIEdldCBhIGNvbm5lY3Rpb24sIGVpdGhlciBmcm9tIGluZXRkIG9yIGEgbGlzdGVuaW5nIFRDUCBzb2NrZXQgKi8KLQlpZiAoaW5ldGRfZmxhZykgewotCQlzZXJ2ZXJfYWNjZXB0X2luZXRkKCZzb2NrX2luLCAmc29ja19vdXQpOwotCX0gZWxzZSB7Ci0JCXBsYXRmb3JtX3ByZV9saXN0ZW4oKTsKLQkJc2VydmVyX2xpc3RlbigpOwotCi0JCWlmIChvcHRpb25zLnByb3RvY29sICYgU1NIX1BST1RPXzEpCi0JCQlnZW5lcmF0ZV9lcGhlbWVyYWxfc2VydmVyX2tleSgpOwotCi0JCXNpZ25hbChTSUdIVVAsIHNpZ2h1cF9oYW5kbGVyKTsKLQkJc2lnbmFsKFNJR0NITEQsIG1haW5fc2lnY2hsZF9oYW5kbGVyKTsKLQkJc2lnbmFsKFNJR1RFUk0sIHNpZ3Rlcm1faGFuZGxlcik7Ci0JCXNpZ25hbChTSUdRVUlULCBzaWd0ZXJtX2hhbmRsZXIpOwotCi0JCS8qCi0JCSAqIFdyaXRlIG91dCB0aGUgcGlkIGZpbGUgYWZ0ZXIgdGhlIHNpZ3Rlcm0gaGFuZGxlcgotCQkgKiBpcyBzZXR1cCBhbmQgdGhlIGxpc3RlbiBzb2NrZXRzIGFyZSBib3VuZAotCQkgKi8KLQkJaWYgKCFkZWJ1Z19mbGFnKSB7Ci0JCQlGSUxFICpmID0gZm9wZW4ob3B0aW9ucy5waWRfZmlsZSwgInciKTsKLQotCQkJaWYgKGYgPT0gTlVMTCkgewotCQkJCWVycm9yKCJDb3VsZG4ndCBjcmVhdGUgcGlkIGZpbGUgXCIlc1wiOiAlcyIsCi0JCQkJICAgIG9wdGlvbnMucGlkX2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQl9IGVsc2UgewotCQkJCWZwcmludGYoZiwgIiVsZFxuIiwgKGxvbmcpIGdldHBpZCgpKTsKLQkJCQlmY2xvc2UoZik7Ci0JCQl9Ci0JCX0KLQotCQkvKiBBY2NlcHQgYSBjb25uZWN0aW9uIGFuZCByZXR1cm4gaW4gYSBmb3JrZWQgY2hpbGQgKi8KLQkJc2VydmVyX2FjY2VwdF9sb29wKCZzb2NrX2luLCAmc29ja19vdXQsCi0JCSAgICAmbmV3c29jaywgY29uZmlnX3MpOwotCX0KLQotCS8qIFRoaXMgaXMgdGhlIGNoaWxkIHByb2Nlc3NpbmcgYSBuZXcgY29ubmVjdGlvbi4gKi8KLQlzZXRwcm9jdGl0bGUoIiVzIiwgIlthY2NlcHRlZF0iKTsKLQotCS8qCi0JICogQ3JlYXRlIGEgbmV3IHNlc3Npb24gYW5kIHByb2Nlc3MgZ3JvdXAgc2luY2UgdGhlIDQuNEJTRAotCSAqIHNldGxvZ2luKCkgYWZmZWN0cyB0aGUgZW50aXJlIHByb2Nlc3MgZ3JvdXAuICBXZSBkb24ndAotCSAqIHdhbnQgdGhlIGNoaWxkIHRvIGJlIGFibGUgdG8gYWZmZWN0IHRoZSBwYXJlbnQuCi0JICovCi0jaWYgIWRlZmluZWQoU1NIRF9BQ1FVSVJFU19DVFRZKQotCS8qCi0JICogSWYgc2V0c2lkIGlzIGNhbGxlZCwgb24gc29tZSBwbGF0Zm9ybXMgc3NoZCB3aWxsIGxhdGVyIGFjcXVpcmUgYQotCSAqIGNvbnRyb2xsaW5nIHRlcm1pbmFsIHdoaWNoIHdpbGwgcmVzdWx0IGluICJjb3VsZCBub3Qgc2V0Ci0JICogY29udHJvbGxpbmcgdHR5IiBlcnJvcnMuCi0JICovCi0JaWYgKCFkZWJ1Z19mbGFnICYmICFpbmV0ZF9mbGFnICYmIHNldHNpZCgpIDwgMCkKLQkJZXJyb3IoInNldHNpZDogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSNlbmRpZgotCi0JaWYgKHJleGVjX2ZsYWcpIHsKLQkJaW50IGZkOwotCi0JCWRlYnVnKCJyZXhlYyBzdGFydCBpbiAlZCBvdXQgJWQgbmV3c29jayAlZCBwaXBlICVkIHNvY2sgJWQiLAotCQkgICAgc29ja19pbiwgc29ja19vdXQsIG5ld3NvY2ssIHN0YXJ0dXBfcGlwZSwgY29uZmlnX3NbMF0pOwotCQlkdXAyKG5ld3NvY2ssIFNURElOX0ZJTEVOTyk7Ci0JCWR1cDIoU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKLQkJaWYgKHN0YXJ0dXBfcGlwZSA9PSAtMSkKLQkJCWNsb3NlKFJFRVhFQ19TVEFSVFVQX1BJUEVfRkQpOwotCQllbHNlCi0JCQlkdXAyKHN0YXJ0dXBfcGlwZSwgUkVFWEVDX1NUQVJUVVBfUElQRV9GRCk7Ci0KLQkJZHVwMihjb25maWdfc1sxXSwgUkVFWEVDX0NPTkZJR19QQVNTX0ZEKTsKLQkJY2xvc2UoY29uZmlnX3NbMV0pOwotCQlpZiAoc3RhcnR1cF9waXBlICE9IC0xKQotCQkJY2xvc2Uoc3RhcnR1cF9waXBlKTsKLQotCQlleGVjdihyZXhlY19hcmd2WzBdLCByZXhlY19hcmd2KTsKLQotCQkvKiBSZWV4ZWMgaGFzIGZhaWxlZCwgZmFsbCBiYWNrIGFuZCBjb250aW51ZSAqLwotCQllcnJvcigicmV4ZWMgb2YgJXMgZmFpbGVkOiAlcyIsIHJleGVjX2FyZ3ZbMF0sIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJlY3ZfcmV4ZWNfc3RhdGUoUkVFWEVDX0NPTkZJR19QQVNTX0ZELCBOVUxMKTsKLQkJbG9nX2luaXQoX19wcm9nbmFtZSwgb3B0aW9ucy5sb2dfbGV2ZWwsCi0JCSAgICBvcHRpb25zLmxvZ19mYWNpbGl0eSwgbG9nX3N0ZGVycik7Ci0KLQkJLyogQ2xlYW4gdXAgZmRzICovCi0JCXN0YXJ0dXBfcGlwZSA9IFJFRVhFQ19TVEFSVFVQX1BJUEVfRkQ7Ci0JCWNsb3NlKGNvbmZpZ19zWzFdKTsKLQkJY2xvc2UoUkVFWEVDX0NPTkZJR19QQVNTX0ZEKTsKLQkJbmV3c29jayA9IHNvY2tfb3V0ID0gc29ja19pbiA9IGR1cChTVERJTl9GSUxFTk8pOwotCQlpZiAoKGZkID0gb3BlbihfUEFUSF9ERVZOVUxMLCBPX1JEV1IsIDApKSAhPSAtMSkgewotCQkJZHVwMihmZCwgU1RESU5fRklMRU5PKTsKLQkJCWR1cDIoZmQsIFNURE9VVF9GSUxFTk8pOwotCQkJaWYgKGZkID4gU1RERVJSX0ZJTEVOTykKLQkJCQljbG9zZShmZCk7Ci0JCX0KLQkJZGVidWcoInJleGVjIGNsZWFudXAgaW4gJWQgb3V0ICVkIG5ld3NvY2sgJWQgcGlwZSAlZCBzb2NrICVkIiwKLQkJICAgIHNvY2tfaW4sIHNvY2tfb3V0LCBuZXdzb2NrLCBzdGFydHVwX3BpcGUsIGNvbmZpZ19zWzBdKTsKLQl9Ci0KLQkvKiBFeGVjdXRlZCBjaGlsZCBwcm9jZXNzZXMgZG9uJ3QgbmVlZCB0aGVzZS4gKi8KLQlmY250bChzb2NrX291dCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Ci0JZmNudGwoc29ja19pbiwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Ci0KLQkvKgotCSAqIERpc2FibGUgdGhlIGtleSByZWdlbmVyYXRpb24gYWxhcm0uICBXZSB3aWxsIG5vdCByZWdlbmVyYXRlIHRoZQotCSAqIGtleSBzaW5jZSB3ZSBhcmUgbm8gbG9uZ2VyIGluIGEgcG9zaXRpb24gdG8gZ2l2ZSBpdCB0byBhbnlvbmUuIFdlCi0JICogd2lsbCBub3QgcmVzdGFydCBvbiBTSUdIVVAgc2luY2UgaXQgbm8gbG9uZ2VyIG1ha2VzIHNlbnNlLgotCSAqLwotCWFsYXJtKDApOwotCXNpZ25hbChTSUdBTFJNLCBTSUdfREZMKTsKLQlzaWduYWwoU0lHSFVQLCBTSUdfREZMKTsKLQlzaWduYWwoU0lHVEVSTSwgU0lHX0RGTCk7Ci0Jc2lnbmFsKFNJR1FVSVQsIFNJR19ERkwpOwotCXNpZ25hbChTSUdDSExELCBTSUdfREZMKTsKLQlzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKLQotCS8qCi0JICogUmVnaXN0ZXIgb3VyIGNvbm5lY3Rpb24uICBUaGlzIHR1cm5zIGVuY3J5cHRpb24gb2ZmIGJlY2F1c2Ugd2UgZG8KLQkgKiBub3QgaGF2ZSBhIGtleS4KLQkgKi8KLQlwYWNrZXRfc2V0X2Nvbm5lY3Rpb24oc29ja19pbiwgc29ja19vdXQpOwotCXBhY2tldF9zZXRfc2VydmVyKCk7Ci0KLQkvKiBTZXQgU09fS0VFUEFMSVZFIGlmIHJlcXVlc3RlZC4gKi8KLQlpZiAob3B0aW9ucy50Y3Bfa2VlcF9hbGl2ZSAmJiBwYWNrZXRfY29ubmVjdGlvbl9pc19vbl9zb2NrZXQoKSAmJgotCSAgICBzZXRzb2Nrb3B0KHNvY2tfaW4sIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgJm9uLCBzaXplb2Yob24pKSA8IDApCi0JCWVycm9yKCJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRTogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQotCWlmICgocmVtb3RlX3BvcnQgPSBnZXRfcmVtb3RlX3BvcnQoKSkgPCAwKSB7Ci0JCWRlYnVnKCJnZXRfcmVtb3RlX3BvcnQgZmFpbGVkIik7Ci0JCWNsZWFudXBfZXhpdCgyNTUpOwotCX0KLQotCS8qCi0JICogV2UgdXNlIGdldF9jYW5vbmljYWxfaG9zdG5hbWUgd2l0aCB1c2VkbnMgPSAwIGluc3RlYWQgb2YKLQkgKiBnZXRfcmVtb3RlX2lwYWRkciBoZXJlIHNvIElQIG9wdGlvbnMgd2lsbCBiZSBjaGVja2VkLgotCSAqLwotCSh2b2lkKSBnZXRfY2Fub25pY2FsX2hvc3RuYW1lKDApOwotCS8qCi0JICogVGhlIHJlc3Qgb2YgdGhlIGNvZGUgZGVwZW5kcyBvbiB0aGUgZmFjdCB0aGF0Ci0JICogZ2V0X3JlbW90ZV9pcGFkZHIoKSBjYWNoZXMgdGhlIHJlbW90ZSBpcCwgZXZlbiBpZgotCSAqIHRoZSBzb2NrZXQgZ29lcyBhd2F5LgotCSAqLwotCXJlbW90ZV9pcCA9IGdldF9yZW1vdGVfaXBhZGRyKCk7Ci0KLSNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCi0JYXVkaXRfY29ubmVjdGlvbl9mcm9tKHJlbW90ZV9pcCwgcmVtb3RlX3BvcnQpOwotI2VuZGlmCi0jaWZkZWYgTElCV1JBUAotCWFsbG93X3NldmVyaXR5ID0gb3B0aW9ucy5sb2dfZmFjaWxpdHl8TE9HX0lORk87Ci0JZGVueV9zZXZlcml0eSA9IG9wdGlvbnMubG9nX2ZhY2lsaXR5fExPR19XQVJOSU5HOwotCS8qIENoZWNrIHdoZXRoZXIgbG9naW5zIGFyZSBkZW5pZWQgZnJvbSB0aGlzIGhvc3QuICovCi0JaWYgKHBhY2tldF9jb25uZWN0aW9uX2lzX29uX3NvY2tldCgpKSB7Ci0JCXN0cnVjdCByZXF1ZXN0X2luZm8gcmVxOwotCi0JCXJlcXVlc3RfaW5pdCgmcmVxLCBSUV9EQUVNT04sIF9fcHJvZ25hbWUsIFJRX0ZJTEUsIHNvY2tfaW4sIDApOwotCQlmcm9taG9zdCgmcmVxKTsKLQotCQlpZiAoIWhvc3RzX2FjY2VzcygmcmVxKSkgewotCQkJZGVidWcoIkNvbm5lY3Rpb24gcmVmdXNlZCBieSB0Y3Agd3JhcHBlciIpOwotCQkJcmVmdXNlKCZyZXEpOwotCQkJLyogTk9UUkVBQ0hFRCAqLwotCQkJZmF0YWwoImxpYndyYXAgcmVmdXNlIHJldHVybnMiKTsKLQkJfQotCX0KLSNlbmRpZiAvKiBMSUJXUkFQICovCi0KLQkvKiBMb2cgdGhlIGNvbm5lY3Rpb24uICovCi0JdmVyYm9zZSgiQ29ubmVjdGlvbiBmcm9tICUuNTAwcyBwb3J0ICVkIiwgcmVtb3RlX2lwLCByZW1vdGVfcG9ydCk7Ci0KLQkvKgotCSAqIFdlIGRvbid0IHdhbnQgdG8gbGlzdGVuIGZvcmV2ZXIgdW5sZXNzIHRoZSBvdGhlciBzaWRlCi0JICogc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZXMgaXRzZWxmLiAgU28gd2Ugc2V0IHVwIGFuIGFsYXJtIHdoaWNoIGlzCi0JICogY2xlYXJlZCBhZnRlciBzdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uLiAgQSBsaW1pdCBvZiB6ZXJvCi0JICogaW5kaWNhdGVzIG5vIGxpbWl0LiBOb3RlIHRoYXQgd2UgZG9uJ3Qgc2V0IHRoZSBhbGFybSBpbiBkZWJ1Z2dpbmcKLQkgKiBtb2RlOyBpdCBpcyBqdXN0IGFubm95aW5nIHRvIGhhdmUgdGhlIHNlcnZlciBleGl0IGp1c3Qgd2hlbiB5b3UKLQkgKiBhcmUgYWJvdXQgdG8gZGlzY292ZXIgdGhlIGJ1Zy4KLQkgKi8KLQlzaWduYWwoU0lHQUxSTSwgZ3JhY2VfYWxhcm1faGFuZGxlcik7Ci0JaWYgKCFkZWJ1Z19mbGFnKQotCQlhbGFybShvcHRpb25zLmxvZ2luX2dyYWNlX3RpbWUpOwotCi0Jc3NoZF9leGNoYW5nZV9pZGVudGlmaWNhdGlvbihzb2NrX2luLCBzb2NrX291dCk7Ci0KLQkvKiBJbiBpbmV0ZCBtb2RlLCBnZW5lcmF0ZSBlcGhlbWVyYWwga2V5IG9ubHkgZm9yIHByb3RvIDEgY29ubmVjdGlvbnMgKi8KLQlpZiAoIWNvbXBhdDIwICYmIGluZXRkX2ZsYWcgJiYgc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleSA9PSBOVUxMKQotCQlnZW5lcmF0ZV9lcGhlbWVyYWxfc2VydmVyX2tleSgpOwotCi0JcGFja2V0X3NldF9ub25ibG9ja2luZygpOwotCi0JLyogYWxsb2NhdGUgYXV0aGVudGljYXRpb24gY29udGV4dCAqLwotCWF1dGhjdHh0ID0geGNhbGxvYygxLCBzaXplb2YoKmF1dGhjdHh0KSk7Ci0KLQlhdXRoY3R4dC0+bG9naW5tc2cgPSAmbG9naW5tc2c7Ci0KLQkvKiBYWFggZ2xvYmFsIGZvciBjbGVhbnVwLCBhY2Nlc3MgZnJvbSBvdGhlciBtb2R1bGVzICovCi0JdGhlX2F1dGhjdHh0ID0gYXV0aGN0eHQ7Ci0KLQkvKiBwcmVwYXJlIGJ1ZmZlciB0byBjb2xsZWN0IG1lc3NhZ2VzIHRvIGRpc3BsYXkgdG8gdXNlciBhZnRlciBsb2dpbiAqLwotCWJ1ZmZlcl9pbml0KCZsb2dpbm1zZyk7Ci0JYXV0aF9kZWJ1Z19yZXNldCgpOwotCi0JaWYgKHVzZV9wcml2c2VwKQotCQlpZiAocHJpdnNlcF9wcmVhdXRoKGF1dGhjdHh0KSA9PSAxKQotCQkJZ290byBhdXRoZW50aWNhdGVkOwotCi0JLyogcGVyZm9ybSB0aGUga2V5IGV4Y2hhbmdlICovCi0JLyogYXV0aGVudGljYXRlIHVzZXIgYW5kIHN0YXJ0IHNlc3Npb24gKi8KLQlpZiAoY29tcGF0MjApIHsKLQkJZG9fc3NoMl9rZXgoKTsKLQkJZG9fYXV0aGVudGljYXRpb24yKGF1dGhjdHh0KTsKLQl9IGVsc2UgewotCQlkb19zc2gxX2tleCgpOwotCQlkb19hdXRoZW50aWNhdGlvbihhdXRoY3R4dCk7Ci0JfQotCS8qCi0JICogSWYgd2UgdXNlIHByaXZpbGVnZSBzZXBhcmF0aW9uLCB0aGUgdW5wcml2aWxlZ2VkIGNoaWxkIHRyYW5zZmVycwotCSAqIHRoZSBjdXJyZW50IGtleXN0YXRlIGFuZCBleGl0cwotCSAqLwotCWlmICh1c2VfcHJpdnNlcCkgewotCQltbV9zZW5kX2tleXN0YXRlKHBtb25pdG9yKTsKLQkJZXhpdCgwKTsKLQl9Ci0KLSBhdXRoZW50aWNhdGVkOgotCS8qCi0JICogQ2FuY2VsIHRoZSBhbGFybSB3ZSBzZXQgdG8gbGltaXQgdGhlIHRpbWUgdGFrZW4gZm9yCi0JICogYXV0aGVudGljYXRpb24uCi0JICovCi0JYWxhcm0oMCk7Ci0Jc2lnbmFsKFNJR0FMUk0sIFNJR19ERkwpOwotCWF1dGhjdHh0LT5hdXRoZW50aWNhdGVkID0gMTsKLQlpZiAoc3RhcnR1cF9waXBlICE9IC0xKSB7Ci0JCWNsb3NlKHN0YXJ0dXBfcGlwZSk7Ci0JCXN0YXJ0dXBfcGlwZSA9IC0xOwotCX0KLQotI2lmZGVmIFNTSF9BVURJVF9FVkVOVFMKLQlhdWRpdF9ldmVudChTU0hfQVVUSF9TVUNDRVNTKTsKLSNlbmRpZgotCi0jaWZkZWYgR1NTQVBJCi0JaWYgKG9wdGlvbnMuZ3NzX2F1dGhlbnRpY2F0aW9uKSB7Ci0JCXRlbXBvcmFyaWx5X3VzZV91aWQoYXV0aGN0eHQtPnB3KTsKLQkJc3NoX2dzc2FwaV9zdG9yZWNyZWRzKCk7Ci0JCXJlc3RvcmVfdWlkKCk7Ci0JfQotI2VuZGlmCi0jaWZkZWYgVVNFX1BBTQotCWlmIChvcHRpb25zLnVzZV9wYW0pIHsKLQkJZG9fcGFtX3NldGNyZWQoMSk7Ci0JCWRvX3BhbV9zZXNzaW9uKCk7Ci0JfQotI2VuZGlmCi0KLQkvKgotCSAqIEluIHByaXZpbGVnZSBzZXBhcmF0aW9uLCB3ZSBmb3JrIGFub3RoZXIgY2hpbGQgYW5kIHByZXBhcmUKLQkgKiBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZy4KLQkgKi8KLQlpZiAodXNlX3ByaXZzZXApIHsKLQkJcHJpdnNlcF9wb3N0YXV0aChhdXRoY3R4dCk7Ci0JCS8qIHRoZSBtb25pdG9yIHByb2Nlc3MgW3ByaXZdIHdpbGwgbm90IHJldHVybiAqLwotCQlpZiAoIWNvbXBhdDIwKQotCQkJZGVzdHJveV9zZW5zaXRpdmVfZGF0YSgpOwotCX0KLQotCXBhY2tldF9zZXRfdGltZW91dChvcHRpb25zLmNsaWVudF9hbGl2ZV9pbnRlcnZhbCwKLQkgICAgb3B0aW9ucy5jbGllbnRfYWxpdmVfY291bnRfbWF4KTsKLQotCS8qIFN0YXJ0IHNlc3Npb24uICovCi0JZG9fYXV0aGVudGljYXRlZChhdXRoY3R4dCk7Ci0KLQkvKiBUaGUgY29ubmVjdGlvbiBoYXMgYmVlbiB0ZXJtaW5hdGVkLiAqLwotCXBhY2tldF9nZXRfc3RhdGUoTU9ERV9JTiwgTlVMTCwgTlVMTCwgTlVMTCwgJmlieXRlcyk7Ci0JcGFja2V0X2dldF9zdGF0ZShNT0RFX09VVCwgTlVMTCwgTlVMTCwgTlVMTCwgJm9ieXRlcyk7Ci0JdmVyYm9zZSgiVHJhbnNmZXJyZWQ6IHNlbnQgJWxsdSwgcmVjZWl2ZWQgJWxsdSBieXRlcyIsCi0JICAgICh1bnNpZ25lZCBsb25nIGxvbmcpb2J5dGVzLCAodW5zaWduZWQgbG9uZyBsb25nKWlieXRlcyk7Ci0KLQl2ZXJib3NlKCJDbG9zaW5nIGNvbm5lY3Rpb24gdG8gJS41MDBzIHBvcnQgJWQiLCByZW1vdGVfaXAsIHJlbW90ZV9wb3J0KTsKLQotI2lmZGVmIFVTRV9QQU0KLQlpZiAob3B0aW9ucy51c2VfcGFtKQotCQlmaW5pc2hfcGFtKCk7Ci0jZW5kaWYgLyogVVNFX1BBTSAqLwotCi0jaWZkZWYgU1NIX0FVRElUX0VWRU5UUwotCVBSSVZTRVAoYXVkaXRfZXZlbnQoU1NIX0NPTk5FQ1RJT05fQ0xPU0UpKTsKLSNlbmRpZgotCi0JcGFja2V0X2Nsb3NlKCk7Ci0KLQlpZiAodXNlX3ByaXZzZXApCi0JCW1tX3Rlcm1pbmF0ZSgpOwotCi0JZXhpdCgwKTsKLX0KLQotLyoKLSAqIERlY3J5cHQgc2Vzc2lvbl9rZXlfaW50IHVzaW5nIG91ciBwcml2YXRlIHNlcnZlciBrZXkgYW5kIHByaXZhdGUgaG9zdCBrZXkKLSAqIChrZXkgd2l0aCBsYXJnZXIgbW9kdWx1cyBmaXJzdCkuCi0gKi8KLWludAotc3NoMV9zZXNzaW9uX2tleShCSUdOVU0gKnNlc3Npb25fa2V5X2ludCkKLXsKLQlpbnQgcnNhZmFpbCA9IDA7Ci0KLQlpZiAoQk5fY21wKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+biwKLQkgICAgc2Vuc2l0aXZlX2RhdGEuc3NoMV9ob3N0X2tleS0+cnNhLT5uKSA+IDApIHsKLQkJLyogU2VydmVyIGtleSBoYXMgYmlnZ2VyIG1vZHVsdXMuICovCi0JCWlmIChCTl9udW1fYml0cyhzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPm4pIDwKLQkJICAgIEJOX251bV9iaXRzKHNlbnNpdGl2ZV9kYXRhLnNzaDFfaG9zdF9rZXktPnJzYS0+bikgKwotCQkgICAgU1NIX0tFWV9CSVRTX1JFU0VSVkVEKSB7Ci0JCQlmYXRhbCgiZG9fY29ubmVjdGlvbjogJXM6ICIKLQkJCSAgICAic2VydmVyX2tleSAlZCA8IGhvc3Rfa2V5ICVkICsgU1NIX0tFWV9CSVRTX1JFU0VSVkVEICVkIiwKLQkJCSAgICBnZXRfcmVtb3RlX2lwYWRkcigpLAotCQkJICAgIEJOX251bV9iaXRzKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+biksCi0JCQkgICAgQk5fbnVtX2JpdHMoc2Vuc2l0aXZlX2RhdGEuc3NoMV9ob3N0X2tleS0+cnNhLT5uKSwKLQkJCSAgICBTU0hfS0VZX0JJVFNfUkVTRVJWRUQpOwotCQl9Ci0JCWlmIChyc2FfcHJpdmF0ZV9kZWNyeXB0KHNlc3Npb25fa2V5X2ludCwgc2Vzc2lvbl9rZXlfaW50LAotCQkgICAgc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleS0+cnNhKSA8PSAwKQotCQkJcnNhZmFpbCsrOwotCQlpZiAocnNhX3ByaXZhdGVfZGVjcnlwdChzZXNzaW9uX2tleV9pbnQsIHNlc3Npb25fa2V5X2ludCwKLQkJICAgIHNlbnNpdGl2ZV9kYXRhLnNzaDFfaG9zdF9rZXktPnJzYSkgPD0gMCkKLQkJCXJzYWZhaWwrKzsKLQl9IGVsc2UgewotCQkvKiBIb3N0IGtleSBoYXMgYmlnZ2VyIG1vZHVsdXMgKG9yIHRoZXkgYXJlIGVxdWFsKS4gKi8KLQkJaWYgKEJOX251bV9iaXRzKHNlbnNpdGl2ZV9kYXRhLnNzaDFfaG9zdF9rZXktPnJzYS0+bikgPAotCQkgICAgQk5fbnVtX2JpdHMoc2Vuc2l0aXZlX2RhdGEuc2VydmVyX2tleS0+cnNhLT5uKSArCi0JCSAgICBTU0hfS0VZX0JJVFNfUkVTRVJWRUQpIHsKLQkJCWZhdGFsKCJkb19jb25uZWN0aW9uOiAlczogIgotCQkJICAgICJob3N0X2tleSAlZCA8IHNlcnZlcl9rZXkgJWQgKyBTU0hfS0VZX0JJVFNfUkVTRVJWRUQgJWQiLAotCQkJICAgIGdldF9yZW1vdGVfaXBhZGRyKCksCi0JCQkgICAgQk5fbnVtX2JpdHMoc2Vuc2l0aXZlX2RhdGEuc3NoMV9ob3N0X2tleS0+cnNhLT5uKSwKLQkJCSAgICBCTl9udW1fYml0cyhzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPm4pLAotCQkJICAgIFNTSF9LRVlfQklUU19SRVNFUlZFRCk7Ci0JCX0KLQkJaWYgKHJzYV9wcml2YXRlX2RlY3J5cHQoc2Vzc2lvbl9rZXlfaW50LCBzZXNzaW9uX2tleV9pbnQsCi0JCSAgICBzZW5zaXRpdmVfZGF0YS5zc2gxX2hvc3Rfa2V5LT5yc2EpIDwgMCkKLQkJCXJzYWZhaWwrKzsKLQkJaWYgKHJzYV9wcml2YXRlX2RlY3J5cHQoc2Vzc2lvbl9rZXlfaW50LCBzZXNzaW9uX2tleV9pbnQsCi0JCSAgICBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EpIDwgMCkKLQkJCXJzYWZhaWwrKzsKLQl9Ci0JcmV0dXJuIChyc2FmYWlsKTsKLX0KLS8qCi0gKiBTU0gxIGtleSBleGNoYW5nZQotICovCi1zdGF0aWMgdm9pZAotZG9fc3NoMV9rZXgodm9pZCkKLXsKLQlpbnQgaSwgbGVuOwotCWludCByc2FmYWlsID0gMDsKLQlCSUdOVU0gKnNlc3Npb25fa2V5X2ludDsKLQl1X2NoYXIgc2Vzc2lvbl9rZXlbU1NIX1NFU1NJT05fS0VZX0xFTkdUSF07Ci0JdV9jaGFyIGNvb2tpZVs4XTsKLQl1X2ludCBjaXBoZXJfdHlwZSwgYXV0aF9tYXNrLCBwcm90b2NvbF9mbGFnczsKLQotCS8qCi0JICogR2VuZXJhdGUgY2hlY2sgYnl0ZXMgdGhhdCB0aGUgY2xpZW50IG11c3Qgc2VuZCBiYWNrIGluIHRoZSB1c2VyCi0JICogcGFja2V0IGluIG9yZGVyIGZvciBpdCB0byBiZSBhY2NlcHRlZDsgdGhpcyBpcyB1c2VkIHRvIGRlZnkgaXAKLQkgKiBzcG9vZmluZyBhdHRhY2tzLiAgTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBhZ2FpbnN0IHNvbWVib2R5Ci0JICogZG9pbmcgSVAgc3Bvb2ZpbmcgZnJvbSBhIHJlbW90ZSBtYWNoaW5lOyBhbnkgbWFjaGluZSBvbiB0aGUgbG9jYWwKLQkgKiBuZXR3b3JrIGNhbiBzdGlsbCBzZWUgb3V0Z29pbmcgcGFja2V0cyBhbmQgY2F0Y2ggdGhlIHJhbmRvbQotCSAqIGNvb2tpZS4gIFRoaXMgb25seSBhZmZlY3RzIHJob3N0cyBhdXRoZW50aWNhdGlvbiwgYW5kIHRoaXMgaXMgb25lCi0JICogb2YgdGhlIHJlYXNvbnMgd2h5IGl0IGlzIGluaGVyZW50bHkgaW5zZWN1cmUuCi0JICovCi0JYXJjNHJhbmRvbV9idWYoY29va2llLCBzaXplb2YoY29va2llKSk7Ci0KLQkvKgotCSAqIFNlbmQgb3VyIHB1YmxpYyBrZXkuICBXZSBpbmNsdWRlIGluIHRoZSBwYWNrZXQgNjQgYml0cyBvZiByYW5kb20KLQkgKiBkYXRhIHRoYXQgbXVzdCBiZSBtYXRjaGVkIGluIHRoZSByZXBseSBpbiBvcmRlciB0byBwcmV2ZW50IElQCi0JICogc3Bvb2ZpbmcuCi0JICovCi0JcGFja2V0X3N0YXJ0KFNTSF9TTVNHX1BVQkxJQ19LRVkpOwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXBhY2tldF9wdXRfY2hhcihjb29raWVbaV0pOwotCi0JLyogU3RvcmUgb3VyIHB1YmxpYyBzZXJ2ZXIgUlNBIGtleS4gKi8KLQlwYWNrZXRfcHV0X2ludChCTl9udW1fYml0cyhzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPm4pKTsKLQlwYWNrZXRfcHV0X2JpZ251bShzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPmUpOwotCXBhY2tldF9wdXRfYmlnbnVtKHNlbnNpdGl2ZV9kYXRhLnNlcnZlcl9rZXktPnJzYS0+bik7Ci0KLQkvKiBTdG9yZSBvdXIgcHVibGljIGhvc3QgUlNBIGtleS4gKi8KLQlwYWNrZXRfcHV0X2ludChCTl9udW1fYml0cyhzZW5zaXRpdmVfZGF0YS5zc2gxX2hvc3Rfa2V5LT5yc2EtPm4pKTsKLQlwYWNrZXRfcHV0X2JpZ251bShzZW5zaXRpdmVfZGF0YS5zc2gxX2hvc3Rfa2V5LT5yc2EtPmUpOwotCXBhY2tldF9wdXRfYmlnbnVtKHNlbnNpdGl2ZV9kYXRhLnNzaDFfaG9zdF9rZXktPnJzYS0+bik7Ci0KLQkvKiBQdXQgcHJvdG9jb2wgZmxhZ3MuICovCi0JcGFja2V0X3B1dF9pbnQoU1NIX1BST1RPRkxBR19IT1NUX0lOX0ZXRF9PUEVOKTsKLQotCS8qIERlY2xhcmUgd2hpY2ggY2lwaGVycyB3ZSBzdXBwb3J0LiAqLwotCXBhY2tldF9wdXRfaW50KGNpcGhlcl9tYXNrX3NzaDEoMCkpOwotCi0JLyogRGVjbGFyZSBzdXBwb3J0ZWQgYXV0aGVudGljYXRpb24gdHlwZXMuICovCi0JYXV0aF9tYXNrID0gMDsKLQlpZiAob3B0aW9ucy5yaG9zdHNfcnNhX2F1dGhlbnRpY2F0aW9uKQotCQlhdXRoX21hc2sgfD0gMSA8PCBTU0hfQVVUSF9SSE9TVFNfUlNBOwotCWlmIChvcHRpb25zLnJzYV9hdXRoZW50aWNhdGlvbikKLQkJYXV0aF9tYXNrIHw9IDEgPDwgU1NIX0FVVEhfUlNBOwotCWlmIChvcHRpb25zLmNoYWxsZW5nZV9yZXNwb25zZV9hdXRoZW50aWNhdGlvbiA9PSAxKQotCQlhdXRoX21hc2sgfD0gMSA8PCBTU0hfQVVUSF9USVM7Ci0JaWYgKG9wdGlvbnMucGFzc3dvcmRfYXV0aGVudGljYXRpb24pCi0JCWF1dGhfbWFzayB8PSAxIDw8IFNTSF9BVVRIX1BBU1NXT1JEOwotCXBhY2tldF9wdXRfaW50KGF1dGhfbWFzayk7Ci0KLQkvKiBTZW5kIHRoZSBwYWNrZXQgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIHNlbnQuICovCi0JcGFja2V0X3NlbmQoKTsKLQlwYWNrZXRfd3JpdGVfd2FpdCgpOwotCi0JZGVidWcoIlNlbnQgJWQgYml0IHNlcnZlciBrZXkgYW5kICVkIGJpdCBob3N0IGtleS4iLAotCSAgICBCTl9udW1fYml0cyhzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPm4pLAotCSAgICBCTl9udW1fYml0cyhzZW5zaXRpdmVfZGF0YS5zc2gxX2hvc3Rfa2V5LT5yc2EtPm4pKTsKLQotCS8qIFJlYWQgY2xpZW50cyByZXBseSAoY2lwaGVyIHR5cGUgYW5kIHNlc3Npb24ga2V5KS4gKi8KLQlwYWNrZXRfcmVhZF9leHBlY3QoU1NIX0NNU0dfU0VTU0lPTl9LRVkpOwotCi0JLyogR2V0IGNpcGhlciB0eXBlIGFuZCBjaGVjayB3aGV0aGVyIHdlIGFjY2VwdCB0aGlzLiAqLwotCWNpcGhlcl90eXBlID0gcGFja2V0X2dldF9jaGFyKCk7Ci0KLQlpZiAoIShjaXBoZXJfbWFza19zc2gxKDApICYgKDEgPDwgY2lwaGVyX3R5cGUpKSkKLQkJcGFja2V0X2Rpc2Nvbm5lY3QoIldhcm5pbmc6IGNsaWVudCBzZWxlY3RzIHVuc3VwcG9ydGVkIGNpcGhlci4iKTsKLQotCS8qIEdldCBjaGVjayBieXRlcyBmcm9tIHRoZSBwYWNrZXQuICBUaGVzZSBtdXN0IG1hdGNoIHRob3NlIHdlCi0JICAgc2VudCBlYXJsaWVyIHdpdGggdGhlIHB1YmxpYyBrZXkgcGFja2V0LiAqLwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCWlmIChjb29raWVbaV0gIT0gcGFja2V0X2dldF9jaGFyKCkpCi0JCQlwYWNrZXRfZGlzY29ubmVjdCgiSVAgU3Bvb2ZpbmcgY2hlY2sgYnl0ZXMgZG8gbm90IG1hdGNoLiIpOwotCi0JZGVidWcoIkVuY3J5cHRpb24gdHlwZTogJS4yMDBzIiwgY2lwaGVyX25hbWUoY2lwaGVyX3R5cGUpKTsKLQotCS8qIEdldCB0aGUgZW5jcnlwdGVkIGludGVnZXIuICovCi0JaWYgKChzZXNzaW9uX2tleV9pbnQgPSBCTl9uZXcoKSkgPT0gTlVMTCkKLQkJZmF0YWwoImRvX3NzaDFfa2V4OiBCTl9uZXcgZmFpbGVkIik7Ci0JcGFja2V0X2dldF9iaWdudW0oc2Vzc2lvbl9rZXlfaW50KTsKLQotCXByb3RvY29sX2ZsYWdzID0gcGFja2V0X2dldF9pbnQoKTsKLQlwYWNrZXRfc2V0X3Byb3RvY29sX2ZsYWdzKHByb3RvY29sX2ZsYWdzKTsKLQlwYWNrZXRfY2hlY2tfZW9tKCk7Ci0KLQkvKiBEZWNyeXB0IHNlc3Npb25fa2V5X2ludCB1c2luZyBob3N0L3NlcnZlciBrZXlzICovCi0JcnNhZmFpbCA9IFBSSVZTRVAoc3NoMV9zZXNzaW9uX2tleShzZXNzaW9uX2tleV9pbnQpKTsKLQotCS8qCi0JICogRXh0cmFjdCBzZXNzaW9uIGtleSBmcm9tIHRoZSBkZWNyeXB0ZWQgaW50ZWdlci4gIFRoZSBrZXkgaXMgaW4gdGhlCi0JICogbGVhc3Qgc2lnbmlmaWNhbnQgMjU2IGJpdHMgb2YgdGhlIGludGVnZXI7IHRoZSBmaXJzdCBieXRlIG9mIHRoZQotCSAqIGtleSBpcyBpbiB0aGUgaGlnaGVzdCBiaXRzLgotCSAqLwotCWlmICghcnNhZmFpbCkgewotCQkodm9pZCkgQk5fbWFza19iaXRzKHNlc3Npb25fa2V5X2ludCwgc2l6ZW9mKHNlc3Npb25fa2V5KSAqIDgpOwotCQlsZW4gPSBCTl9udW1fYnl0ZXMoc2Vzc2lvbl9rZXlfaW50KTsKLQkJaWYgKGxlbiA8IDAgfHwgKHVfaW50KWxlbiA+IHNpemVvZihzZXNzaW9uX2tleSkpIHsKLQkJCWVycm9yKCJkb19zc2gxX2tleDogYmFkIHNlc3Npb24ga2V5IGxlbiBmcm9tICVzOiAiCi0JCQkgICAgInNlc3Npb25fa2V5X2ludCAlZCA+IHNpemVvZihzZXNzaW9uX2tleSkgJWx1IiwKLQkJCSAgICBnZXRfcmVtb3RlX2lwYWRkcigpLCBsZW4sICh1X2xvbmcpc2l6ZW9mKHNlc3Npb25fa2V5KSk7Ci0JCQlyc2FmYWlsKys7Ci0JCX0gZWxzZSB7Ci0JCQltZW1zZXQoc2Vzc2lvbl9rZXksIDAsIHNpemVvZihzZXNzaW9uX2tleSkpOwotCQkJQk5fYm4yYmluKHNlc3Npb25fa2V5X2ludCwKLQkJCSAgICBzZXNzaW9uX2tleSArIHNpemVvZihzZXNzaW9uX2tleSkgLSBsZW4pOwotCi0JCQlkZXJpdmVfc3NoMV9zZXNzaW9uX2lkKAotCQkJICAgIHNlbnNpdGl2ZV9kYXRhLnNzaDFfaG9zdF9rZXktPnJzYS0+biwKLQkJCSAgICBzZW5zaXRpdmVfZGF0YS5zZXJ2ZXJfa2V5LT5yc2EtPm4sCi0JCQkgICAgY29va2llLCBzZXNzaW9uX2lkKTsKLQkJCS8qCi0JCQkgKiBYb3IgdGhlIGZpcnN0IDE2IGJ5dGVzIG9mIHRoZSBzZXNzaW9uIGtleSB3aXRoIHRoZQotCQkJICogc2Vzc2lvbiBpZC4KLQkJCSAqLwotCQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCQkJc2Vzc2lvbl9rZXlbaV0gXj0gc2Vzc2lvbl9pZFtpXTsKLQkJfQotCX0KLQlpZiAocnNhZmFpbCkgewotCQlpbnQgYnl0ZXMgPSBCTl9udW1fYnl0ZXMoc2Vzc2lvbl9rZXlfaW50KTsKLQkJdV9jaGFyICpidWYgPSB4bWFsbG9jKGJ5dGVzKTsKLQkJTUQ1X0NUWCBtZDsKLQotCQlsb2dpdCgiZG9fY29ubmVjdGlvbjogZ2VuZXJhdGluZyBhIGZha2UgZW5jcnlwdGlvbiBrZXkiKTsKLQkJQk5fYm4yYmluKHNlc3Npb25fa2V5X2ludCwgYnVmKTsKLQkJTUQ1X0luaXQoJm1kKTsKLQkJTUQ1X1VwZGF0ZSgmbWQsIGJ1ZiwgYnl0ZXMpOwotCQlNRDVfVXBkYXRlKCZtZCwgc2Vuc2l0aXZlX2RhdGEuc3NoMV9jb29raWUsIFNTSF9TRVNTSU9OX0tFWV9MRU5HVEgpOwotCQlNRDVfRmluYWwoc2Vzc2lvbl9rZXksICZtZCk7Ci0JCU1ENV9Jbml0KCZtZCk7Ci0JCU1ENV9VcGRhdGUoJm1kLCBzZXNzaW9uX2tleSwgMTYpOwotCQlNRDVfVXBkYXRlKCZtZCwgYnVmLCBieXRlcyk7Ci0JCU1ENV9VcGRhdGUoJm1kLCBzZW5zaXRpdmVfZGF0YS5zc2gxX2Nvb2tpZSwgU1NIX1NFU1NJT05fS0VZX0xFTkdUSCk7Ci0JCU1ENV9GaW5hbChzZXNzaW9uX2tleSArIDE2LCAmbWQpOwotCQltZW1zZXQoYnVmLCAwLCBieXRlcyk7Ci0JCXhmcmVlKGJ1Zik7Ci0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQkJc2Vzc2lvbl9pZFtpXSA9IHNlc3Npb25fa2V5W2ldIF4gc2Vzc2lvbl9rZXlbaSArIDE2XTsKLQl9Ci0JLyogRGVzdHJveSB0aGUgcHJpdmF0ZSBhbmQgcHVibGljIGtleXMuIE5vIGxvbmdlci4gKi8KLQlkZXN0cm95X3NlbnNpdGl2ZV9kYXRhKCk7Ci0KLQlpZiAodXNlX3ByaXZzZXApCi0JCW1tX3NzaDFfc2Vzc2lvbl9pZChzZXNzaW9uX2lkKTsKLQotCS8qIERlc3Ryb3kgdGhlIGRlY3J5cHRlZCBpbnRlZ2VyLiAgSXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gKi8KLQlCTl9jbGVhcl9mcmVlKHNlc3Npb25fa2V5X2ludCk7Ci0KLQkvKiBTZXQgdGhlIHNlc3Npb24ga2V5LiAgRnJvbSB0aGlzIG9uIGFsbCBjb21tdW5pY2F0aW9ucyB3aWxsIGJlIGVuY3J5cHRlZC4gKi8KLQlwYWNrZXRfc2V0X2VuY3J5cHRpb25fa2V5KHNlc3Npb25fa2V5LCBTU0hfU0VTU0lPTl9LRVlfTEVOR1RILCBjaXBoZXJfdHlwZSk7Ci0KLQkvKiBEZXN0cm95IG91ciBjb3B5IG9mIHRoZSBzZXNzaW9uIGtleS4gIEl0IGlzIG5vIGxvbmdlciBuZWVkZWQuICovCi0JbWVtc2V0KHNlc3Npb25fa2V5LCAwLCBzaXplb2Yoc2Vzc2lvbl9rZXkpKTsKLQotCWRlYnVnKCJSZWNlaXZlZCBzZXNzaW9uIGtleTsgZW5jcnlwdGlvbiB0dXJuZWQgb24uIik7Ci0KLQkvKiBTZW5kIGFuIGFja25vd2xlZGdtZW50IHBhY2tldC4gIE5vdGUgdGhhdCB0aGlzIHBhY2tldCBpcyBzZW50IGVuY3J5cHRlZC4gKi8KLQlwYWNrZXRfc3RhcnQoU1NIX1NNU0dfU1VDQ0VTUyk7Ci0JcGFja2V0X3NlbmQoKTsKLQlwYWNrZXRfd3JpdGVfd2FpdCgpOwotfQotCi0vKgotICogU1NIMiBrZXkgZXhjaGFuZ2U6IGRpZmZpZS1oZWxsbWFuLWdyb3VwMS1zaGExCi0gKi8KLXN0YXRpYyB2b2lkCi1kb19zc2gyX2tleCh2b2lkKQotewotCUtleCAqa2V4OwotCi0JaWYgKG9wdGlvbnMuY2lwaGVycyAhPSBOVUxMKSB7Ci0JCW15cHJvcG9zYWxbUFJPUE9TQUxfRU5DX0FMR1NfQ1RPU10gPQotCQlteXByb3Bvc2FsW1BST1BPU0FMX0VOQ19BTEdTX1NUT0NdID0gb3B0aW9ucy5jaXBoZXJzOwotCX0KLQlteXByb3Bvc2FsW1BST1BPU0FMX0VOQ19BTEdTX0NUT1NdID0KLQkgICAgY29tcGF0X2NpcGhlcl9wcm9wb3NhbChteXByb3Bvc2FsW1BST1BPU0FMX0VOQ19BTEdTX0NUT1NdKTsKLQlteXByb3Bvc2FsW1BST1BPU0FMX0VOQ19BTEdTX1NUT0NdID0KLQkgICAgY29tcGF0X2NpcGhlcl9wcm9wb3NhbChteXByb3Bvc2FsW1BST1BPU0FMX0VOQ19BTEdTX1NUT0NdKTsKLQotCWlmIChvcHRpb25zLm1hY3MgIT0gTlVMTCkgewotCQlteXByb3Bvc2FsW1BST1BPU0FMX01BQ19BTEdTX0NUT1NdID0KLQkJbXlwcm9wb3NhbFtQUk9QT1NBTF9NQUNfQUxHU19TVE9DXSA9IG9wdGlvbnMubWFjczsKLQl9Ci0JaWYgKG9wdGlvbnMuY29tcHJlc3Npb24gPT0gQ09NUF9OT05FKSB7Ci0JCW15cHJvcG9zYWxbUFJPUE9TQUxfQ09NUF9BTEdTX0NUT1NdID0KLQkJbXlwcm9wb3NhbFtQUk9QT1NBTF9DT01QX0FMR1NfU1RPQ10gPSAibm9uZSI7Ci0JfSBlbHNlIGlmIChvcHRpb25zLmNvbXByZXNzaW9uID09IENPTVBfREVMQVlFRCkgewotCQlteXByb3Bvc2FsW1BST1BPU0FMX0NPTVBfQUxHU19DVE9TXSA9Ci0JCW15cHJvcG9zYWxbUFJPUE9TQUxfQ09NUF9BTEdTX1NUT0NdID0gIm5vbmUsemxpYkBvcGVuc3NoLmNvbSI7Ci0JfQotCWlmIChvcHRpb25zLmtleF9hbGdvcml0aG1zICE9IE5VTEwpCi0JCW15cHJvcG9zYWxbUFJPUE9TQUxfS0VYX0FMR1NdID0gb3B0aW9ucy5rZXhfYWxnb3JpdGhtczsKLQotCW15cHJvcG9zYWxbUFJPUE9TQUxfU0VSVkVSX0hPU1RfS0VZX0FMR1NdID0gbGlzdF9ob3N0a2V5X3R5cGVzKCk7Ci0KLQkvKiBzdGFydCBrZXkgZXhjaGFuZ2UgKi8KLQlrZXggPSBrZXhfc2V0dXAobXlwcm9wb3NhbCk7Ci0Ja2V4LT5rZXhbS0VYX0RIX0dSUDFfU0hBMV0gPSBrZXhkaF9zZXJ2ZXI7Ci0Ja2V4LT5rZXhbS0VYX0RIX0dSUDE0X1NIQTFdID0ga2V4ZGhfc2VydmVyOwotCWtleC0+a2V4W0tFWF9ESF9HRVhfU0hBMV0gPSBrZXhnZXhfc2VydmVyOwotCWtleC0+a2V4W0tFWF9ESF9HRVhfU0hBMjU2XSA9IGtleGdleF9zZXJ2ZXI7Ci0Ja2V4LT5rZXhbS0VYX0VDREhfU0hBMl0gPSBrZXhlY2RoX3NlcnZlcjsKLQlrZXgtPnNlcnZlciA9IDE7Ci0Ja2V4LT5jbGllbnRfdmVyc2lvbl9zdHJpbmc9Y2xpZW50X3ZlcnNpb25fc3RyaW5nOwotCWtleC0+c2VydmVyX3ZlcnNpb25fc3RyaW5nPXNlcnZlcl92ZXJzaW9uX3N0cmluZzsKLQlrZXgtPmxvYWRfaG9zdF9wdWJsaWNfa2V5PSZnZXRfaG9zdGtleV9wdWJsaWNfYnlfdHlwZTsKLQlrZXgtPmxvYWRfaG9zdF9wcml2YXRlX2tleT0mZ2V0X2hvc3RrZXlfcHJpdmF0ZV9ieV90eXBlOwotCWtleC0+aG9zdF9rZXlfaW5kZXg9JmdldF9ob3N0a2V5X2luZGV4OwotCi0JeHh4X2tleCA9IGtleDsKLQotCWRpc3BhdGNoX3J1bihESVNQQVRDSF9CTE9DSywgJmtleC0+ZG9uZSwga2V4KTsKLQotCXNlc3Npb25faWQyID0ga2V4LT5zZXNzaW9uX2lkOwotCXNlc3Npb25faWQyX2xlbiA9IGtleC0+c2Vzc2lvbl9pZF9sZW47Ci0KLSNpZmRlZiBERUJVR19LRVhESAotCS8qIHNlbmQgMXN0IGVuY3J5cHRlZC9tYWNlZC9jb21wcmVzc2VkIG1lc3NhZ2UgKi8KLQlwYWNrZXRfc3RhcnQoU1NIMl9NU0dfSUdOT1JFKTsKLQlwYWNrZXRfcHV0X2NzdHJpbmcoIm1hcmt1cyIpOwotCXBhY2tldF9zZW5kKCk7Ci0JcGFja2V0X3dyaXRlX3dhaXQoKTsKLSNlbmRpZgotCWRlYnVnKCJLRVggZG9uZSIpOwotfQotCi0vKiBzZXJ2ZXIgc3BlY2lmaWMgZmF0YWwgY2xlYW51cCAqLwotdm9pZAotY2xlYW51cF9leGl0KGludCBpKQotewotCWlmICh0aGVfYXV0aGN0eHQpCi0JCWRvX2NsZWFudXAodGhlX2F1dGhjdHh0KTsKLSNpZmRlZiBTU0hfQVVESVRfRVZFTlRTCi0JLyogZG9uZSBhZnRlciBkb19jbGVhbnVwIHNvIGl0IGNhbiBjYW5jZWwgdGhlIFBBTSBhdXRoICd0aHJlYWQnICovCi0JaWYgKCF1c2VfcHJpdnNlcCB8fCBtbV9pc19tb25pdG9yKCkpCi0JCWF1ZGl0X2V2ZW50KFNTSF9DT05ORUNUSU9OX0FCQU5ET04pOwotI2VuZGlmCi0JX2V4aXQoaSk7Ci19CmRpZmYgLS1naXQgYS9zc2hkX2NvbmZpZyBiL3NzaGRfY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzNlODY2Li4wMDAwMDAwCi0tLSBhL3NzaGRfY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLSMJJE9wZW5CU0Q6IHNzaGRfY29uZmlnLHYgMS44NCAyMDExLzA1LzIzIDAzOjMwOjA3IGRqbSBFeHAgJAotCi0jIFRoaXMgaXMgdGhlIHNzaGQgc2VydmVyIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNlZQotIyBzc2hkX2NvbmZpZyg1KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotIyBUaGlzIHNzaGQgd2FzIGNvbXBpbGVkIHdpdGggUEFUSD0vdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbgotCi0jIFRoZSBzdHJhdGVneSB1c2VkIGZvciBvcHRpb25zIGluIHRoZSBkZWZhdWx0IHNzaGRfY29uZmlnIHNoaXBwZWQgd2l0aAotIyBPcGVuU1NIIGlzIHRvIHNwZWNpZnkgb3B0aW9ucyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWUgd2hlcmUKLSMgcG9zc2libGUsIGJ1dCBsZWF2ZSB0aGVtIGNvbW1lbnRlZC4gIFVuY29tbWVudGVkIG9wdGlvbnMgb3ZlcnJpZGUgdGhlCi0jIGRlZmF1bHQgdmFsdWUuCi0KLSNQb3J0IDIyCi0jQWRkcmVzc0ZhbWlseSBhbnkKLSNMaXN0ZW5BZGRyZXNzIDAuMC4wLjAKLSNMaXN0ZW5BZGRyZXNzIDo6Ci0KLSMgVGhlIGRlZmF1bHQgcmVxdWlyZXMgZXhwbGljaXQgYWN0aXZhdGlvbiBvZiBwcm90b2NvbCAxCi0jUHJvdG9jb2wgMgotCi0jIEhvc3RLZXkgZm9yIHByb3RvY29sIHZlcnNpb24gMQotI0hvc3RLZXkgL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5Ci0jIEhvc3RLZXlzIGZvciBwcm90b2NvbCB2ZXJzaW9uIDIKLSNIb3N0S2V5IC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkKLSNIb3N0S2V5IC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXkKLSNIb3N0S2V5IC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleQotCi0jIExpZmV0aW1lIGFuZCBzaXplIG9mIGVwaGVtZXJhbCB2ZXJzaW9uIDEgc2VydmVyIGtleQotI0tleVJlZ2VuZXJhdGlvbkludGVydmFsIDFoCi0jU2VydmVyS2V5Qml0cyAxMDI0Ci0KLSMgTG9nZ2luZwotIyBvYnNvbGV0ZXMgUXVpZXRNb2RlIGFuZCBGYXNjaXN0TG9nZ2luZwotI1N5c2xvZ0ZhY2lsaXR5IEFVVEgKLSNMb2dMZXZlbCBJTkZPCi0KLSMgQXV0aGVudGljYXRpb246Ci0KLSNMb2dpbkdyYWNlVGltZSAybQotI1Blcm1pdFJvb3RMb2dpbiB5ZXMKLSNTdHJpY3RNb2RlcyB5ZXMKLSNNYXhBdXRoVHJpZXMgNgotI01heFNlc3Npb25zIDEwCi0KLSNSU0FBdXRoZW50aWNhdGlvbiB5ZXMKLSNQdWJrZXlBdXRoZW50aWNhdGlvbiB5ZXMKLQotIyBUaGUgZGVmYXVsdCBpcyB0byBjaGVjayBib3RoIC5zc2gvYXV0aG9yaXplZF9rZXlzIGFuZCAuc3NoL2F1dGhvcml6ZWRfa2V5czIKLSMgYnV0IHRoaXMgaXMgb3ZlcnJpZGRlbiBzbyBpbnN0YWxsYXRpb25zIHdpbGwgb25seSBjaGVjayAuc3NoL2F1dGhvcml6ZWRfa2V5cwotQXV0aG9yaXplZEtleXNGaWxlCS5zc2gvYXV0aG9yaXplZF9rZXlzCi0KLSMgRm9yIHRoaXMgdG8gd29yayB5b3Ugd2lsbCBhbHNvIG5lZWQgaG9zdCBrZXlzIGluIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cwotI1Job3N0c1JTQUF1dGhlbnRpY2F0aW9uIG5vCi0jIHNpbWlsYXIgZm9yIHByb3RvY29sIHZlcnNpb24gMgotI0hvc3RiYXNlZEF1dGhlbnRpY2F0aW9uIG5vCi0jIENoYW5nZSB0byB5ZXMgaWYgeW91IGRvbid0IHRydXN0IH4vLnNzaC9rbm93bl9ob3N0cyBmb3IKLSMgUmhvc3RzUlNBQXV0aGVudGljYXRpb24gYW5kIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCi0jSWdub3JlVXNlcktub3duSG9zdHMgbm8KLSMgRG9uJ3QgcmVhZCB0aGUgdXNlcidzIH4vLnJob3N0cyBhbmQgfi8uc2hvc3RzIGZpbGVzCi0jSWdub3JlUmhvc3RzIHllcwotCi0jIFRvIGRpc2FibGUgdHVubmVsZWQgY2xlYXIgdGV4dCBwYXNzd29yZHMsIGNoYW5nZSB0byBubyBoZXJlIQotI1Bhc3N3b3JkQXV0aGVudGljYXRpb24geWVzCi0jUGVybWl0RW1wdHlQYXNzd29yZHMgbm8KLQotIyBDaGFuZ2UgdG8gbm8gdG8gZGlzYWJsZSBzL2tleSBwYXNzd29yZHMKLSNDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIHllcwotCi0jIEtlcmJlcm9zIG9wdGlvbnMKLSNLZXJiZXJvc0F1dGhlbnRpY2F0aW9uIG5vCi0jS2VyYmVyb3NPckxvY2FsUGFzc3dkIHllcwotI0tlcmJlcm9zVGlja2V0Q2xlYW51cCB5ZXMKLSNLZXJiZXJvc0dldEFGU1Rva2VuIG5vCi0KLSMgR1NTQVBJIG9wdGlvbnMKLSNHU1NBUElBdXRoZW50aWNhdGlvbiBubwotI0dTU0FQSUNsZWFudXBDcmVkZW50aWFscyB5ZXMKLQotIyBTZXQgdGhpcyB0byAneWVzJyB0byBlbmFibGUgUEFNIGF1dGhlbnRpY2F0aW9uLCBhY2NvdW50IHByb2Nlc3NpbmcsIAotIyBhbmQgc2Vzc2lvbiBwcm9jZXNzaW5nLiBJZiB0aGlzIGlzIGVuYWJsZWQsIFBBTSBhdXRoZW50aWNhdGlvbiB3aWxsIAotIyBiZSBhbGxvd2VkIHRocm91Z2ggdGhlIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gYW5kCi0jIFBhc3N3b3JkQXV0aGVudGljYXRpb24uICBEZXBlbmRpbmcgb24geW91ciBQQU0gY29uZmlndXJhdGlvbiwKLSMgUEFNIGF1dGhlbnRpY2F0aW9uIHZpYSBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIG1heSBieXBhc3MKLSMgdGhlIHNldHRpbmcgb2YgIlBlcm1pdFJvb3RMb2dpbiB3aXRob3V0LXBhc3N3b3JkIi4KLSMgSWYgeW91IGp1c3Qgd2FudCB0aGUgUEFNIGFjY291bnQgYW5kIHNlc3Npb24gY2hlY2tzIHRvIHJ1biB3aXRob3V0Ci0jIFBBTSBhdXRoZW50aWNhdGlvbiwgdGhlbiBlbmFibGUgdGhpcyBidXQgc2V0IFBhc3N3b3JkQXV0aGVudGljYXRpb24KLSMgYW5kIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gdG8gJ25vJy4KLSNVc2VQQU0gbm8KLQotI0FsbG93QWdlbnRGb3J3YXJkaW5nIHllcwotI0FsbG93VGNwRm9yd2FyZGluZyB5ZXMKLSNHYXRld2F5UG9ydHMgbm8KLSNYMTFGb3J3YXJkaW5nIG5vCi0jWDExRGlzcGxheU9mZnNldCAxMAotI1gxMVVzZUxvY2FsaG9zdCB5ZXMKLSNQcmludE1vdGQgeWVzCi0jUHJpbnRMYXN0TG9nIHllcwotI1RDUEtlZXBBbGl2ZSB5ZXMKLSNVc2VMb2dpbiBubwotI1VzZVByaXZpbGVnZVNlcGFyYXRpb24geWVzCi0jUGVybWl0VXNlckVudmlyb25tZW50IG5vCi0jQ29tcHJlc3Npb24gZGVsYXllZAotI0NsaWVudEFsaXZlSW50ZXJ2YWwgMAotI0NsaWVudEFsaXZlQ291bnRNYXggMwotI1VzZUROUyB5ZXMKLSNQaWRGaWxlIC92YXIvcnVuL3NzaGQucGlkCi0jTWF4U3RhcnR1cHMgMTAKLSNQZXJtaXRUdW5uZWwgbm8KLSNDaHJvb3REaXJlY3Rvcnkgbm9uZQotCi0jIG5vIGRlZmF1bHQgYmFubmVyIHBhdGgKLSNCYW5uZXIgbm9uZQotCi0jIG92ZXJyaWRlIGRlZmF1bHQgb2Ygbm8gc3Vic3lzdGVtcwotU3Vic3lzdGVtCXNmdHAJL3Vzci9saWJleGVjL3NmdHAtc2VydmVyCi0KLSMgRXhhbXBsZSBvZiBvdmVycmlkaW5nIHNldHRpbmdzIG9uIGEgcGVyLXVzZXIgYmFzaXMKLSNNYXRjaCBVc2VyIGFub25jdnMKLSMJWDExRm9yd2FyZGluZyBubwotIwlBbGxvd1RjcEZvcndhcmRpbmcgbm8KLSMJRm9yY2VDb21tYW5kIGN2cyBzZXJ2ZXIKZGlmZiAtLWdpdCBhL3NzaGRfY29uZmlnLjAgYi9zc2hkX2NvbmZpZy4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTljYTg3Li4wMDAwMDAwCi0tLSBhL3NzaGRfY29uZmlnLjAKKysrIC9kZXYvbnVsbApAQCAtMSw3MTggKzAsMCBAQAotU1NIRF9DT05GSUcoNSkgICAgICAgICAgICBPcGVuQlNEIFByb2dyYW1tZXIncyBNYW51YWwgICAgICAgICAgIFNTSERfQ09ORklHKDUpCi0KLU5BTUUKLSAgICAgc3NoZF9jb25maWcgLSBPcGVuU1NIIFNTSCBkYWVtb24gY29uZmlndXJhdGlvbiBmaWxlCi0KLVNZTk9QU0lTCi0gICAgIC9ldGMvc3NoL3NzaGRfY29uZmlnCi0KLURFU0NSSVBUSU9OCi0gICAgIHNzaGQoOCkgcmVhZHMgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gL2V0Yy9zc2gvc3NoZF9jb25maWcgKG9yIHRoZSBmaWxlCi0gICAgIHNwZWNpZmllZCB3aXRoIC1mIG9uIHRoZSBjb21tYW5kIGxpbmUpLiAgVGhlIGZpbGUgY29udGFpbnMga2V5d29yZC0KLSAgICAgYXJndW1lbnQgcGFpcnMsIG9uZSBwZXIgbGluZS4gIExpbmVzIHN0YXJ0aW5nIHdpdGggYCMnIGFuZCBlbXB0eSBsaW5lcwotICAgICBhcmUgaW50ZXJwcmV0ZWQgYXMgY29tbWVudHMuICBBcmd1bWVudHMgbWF5IG9wdGlvbmFsbHkgYmUgZW5jbG9zZWQgaW4KLSAgICAgZG91YmxlIHF1b3RlcyAoIikgaW4gb3JkZXIgdG8gcmVwcmVzZW50IGFyZ3VtZW50cyBjb250YWluaW5nIHNwYWNlcy4KLQotICAgICBUaGUgcG9zc2libGUga2V5d29yZHMgYW5kIHRoZWlyIG1lYW5pbmdzIGFyZSBhcyBmb2xsb3dzIChub3RlIHRoYXQKLSAgICAga2V5d29yZHMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIGFyZ3VtZW50cyBhcmUgY2FzZS1zZW5zaXRpdmUpOgotCi0gICAgIEFjY2VwdEVudgotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGF0IGVudmlyb25tZW50IHZhcmlhYmxlcyBzZW50IGJ5IHRoZSBjbGllbnQgd2lsbCBiZQotICAgICAgICAgICAgIGNvcGllZCBpbnRvIHRoZSBzZXNzaW9uJ3MgZW52aXJvbig3KS4gIFNlZSBTZW5kRW52IGluCi0gICAgICAgICAgICAgc3NoX2NvbmZpZyg1KSBmb3IgaG93IHRvIGNvbmZpZ3VyZSB0aGUgY2xpZW50LiAgTm90ZSB0aGF0Ci0gICAgICAgICAgICAgZW52aXJvbm1lbnQgcGFzc2luZyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgcHJvdG9jb2wgMi4gIFZhcmlhYmxlcwotICAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgYnkgbmFtZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMKLSAgICAgICAgICAgICBgKicgYW5kIGA/Jy4gIE11bHRpcGxlIGVudmlyb25tZW50IHZhcmlhYmxlcyBtYXkgYmUgc2VwYXJhdGVkIGJ5Ci0gICAgICAgICAgICAgd2hpdGVzcGFjZSBvciBzcHJlYWQgYWNyb3NzIG11bHRpcGxlIEFjY2VwdEVudiBkaXJlY3RpdmVzLiAgQmUKLSAgICAgICAgICAgICB3YXJuZWQgdGhhdCBzb21lIGVudmlyb25tZW50IHZhcmlhYmxlcyBjb3VsZCBiZSB1c2VkIHRvIGJ5cGFzcwotICAgICAgICAgICAgIHJlc3RyaWN0ZWQgdXNlciBlbnZpcm9ubWVudHMuICBGb3IgdGhpcyByZWFzb24sIGNhcmUgc2hvdWxkIGJlCi0gICAgICAgICAgICAgdGFrZW4gaW4gdGhlIHVzZSBvZiB0aGlzIGRpcmVjdGl2ZS4gIFRoZSBkZWZhdWx0IGlzIG5vdCB0byBhY2NlcHQKLSAgICAgICAgICAgICBhbnkgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotCi0gICAgIEFkZHJlc3NGYW1pbHkKLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hpY2ggYWRkcmVzcyBmYW1pbHkgc2hvdWxkIGJlIHVzZWQgYnkgc3NoZCg4KS4gIFZhbGlkCi0gICAgICAgICAgICAgYXJndW1lbnRzIGFyZSBgYGFueScnLCBgYGluZXQnJyAodXNlIElQdjQgb25seSksIG9yIGBgaW5ldDYnJwotICAgICAgICAgICAgICh1c2UgSVB2NiBvbmx5KS4gIFRoZSBkZWZhdWx0IGlzIGBgYW55JycuCi0KLSAgICAgQWxsb3dBZ2VudEZvcndhcmRpbmcKLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzc2gtYWdlbnQoMSkgZm9yd2FyZGluZyBpcyBwZXJtaXR0ZWQuICBUaGUKLSAgICAgICAgICAgICBkZWZhdWx0IGlzIGBgeWVzJycuICBOb3RlIHRoYXQgZGlzYWJsaW5nIGFnZW50IGZvcndhcmRpbmcgZG9lcwotICAgICAgICAgICAgIG5vdCBpbXByb3ZlIHNlY3VyaXR5IHVubGVzcyB1c2VycyBhcmUgYWxzbyBkZW5pZWQgc2hlbGwgYWNjZXNzLAotICAgICAgICAgICAgIGFzIHRoZXkgY2FuIGFsd2F5cyBpbnN0YWxsIHRoZWlyIG93biBmb3J3YXJkZXJzLgotCi0gICAgIEFsbG93R3JvdXBzCi0gICAgICAgICAgICAgVGhpcyBrZXl3b3JkIGNhbiBiZSBmb2xsb3dlZCBieSBhIGxpc3Qgb2YgZ3JvdXAgbmFtZSBwYXR0ZXJucywKLSAgICAgICAgICAgICBzZXBhcmF0ZWQgYnkgc3BhY2VzLiAgSWYgc3BlY2lmaWVkLCBsb2dpbiBpcyBhbGxvd2VkIG9ubHkgZm9yCi0gICAgICAgICAgICAgdXNlcnMgd2hvc2UgcHJpbWFyeSBncm91cCBvciBzdXBwbGVtZW50YXJ5IGdyb3VwIGxpc3QgbWF0Y2hlcyBvbmUKLSAgICAgICAgICAgICBvZiB0aGUgcGF0dGVybnMuICBPbmx5IGdyb3VwIG5hbWVzIGFyZSB2YWxpZDsgYSBudW1lcmljYWwgZ3JvdXAKLSAgICAgICAgICAgICBJRCBpcyBub3QgcmVjb2duaXplZC4gIEJ5IGRlZmF1bHQsIGxvZ2luIGlzIGFsbG93ZWQgZm9yIGFsbAotICAgICAgICAgICAgIGdyb3Vwcy4gIFRoZSBhbGxvdy9kZW55IGRpcmVjdGl2ZXMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgZm9sbG93aW5nCi0gICAgICAgICAgICAgb3JkZXI6IERlbnlVc2VycywgQWxsb3dVc2VycywgRGVueUdyb3VwcywgYW5kIGZpbmFsbHkKLSAgICAgICAgICAgICBBbGxvd0dyb3Vwcy4KLQotICAgICAgICAgICAgIFNlZSBQQVRURVJOUyBpbiBzc2hfY29uZmlnKDUpIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBhdHRlcm5zLgotCi0gICAgIEFsbG93VGNwRm9yd2FyZGluZwotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIFRDUCBmb3J3YXJkaW5nIGlzIHBlcm1pdHRlZC4gIFRoZSBkZWZhdWx0IGlzCi0gICAgICAgICAgICAgYGB5ZXMnJy4gIE5vdGUgdGhhdCBkaXNhYmxpbmcgVENQIGZvcndhcmRpbmcgZG9lcyBub3QgaW1wcm92ZQotICAgICAgICAgICAgIHNlY3VyaXR5IHVubGVzcyB1c2VycyBhcmUgYWxzbyBkZW5pZWQgc2hlbGwgYWNjZXNzLCBhcyB0aGV5IGNhbgotICAgICAgICAgICAgIGFsd2F5cyBpbnN0YWxsIHRoZWlyIG93biBmb3J3YXJkZXJzLgotCi0gICAgIEFsbG93VXNlcnMKLSAgICAgICAgICAgICBUaGlzIGtleXdvcmQgY2FuIGJlIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiB1c2VyIG5hbWUgcGF0dGVybnMsCi0gICAgICAgICAgICAgc2VwYXJhdGVkIGJ5IHNwYWNlcy4gIElmIHNwZWNpZmllZCwgbG9naW4gaXMgYWxsb3dlZCBvbmx5IGZvcgotICAgICAgICAgICAgIHVzZXIgbmFtZXMgdGhhdCBtYXRjaCBvbmUgb2YgdGhlIHBhdHRlcm5zLiAgT25seSB1c2VyIG5hbWVzIGFyZQotICAgICAgICAgICAgIHZhbGlkOyBhIG51bWVyaWNhbCB1c2VyIElEIGlzIG5vdCByZWNvZ25pemVkLiAgQnkgZGVmYXVsdCwgbG9naW4KLSAgICAgICAgICAgICBpcyBhbGxvd2VkIGZvciBhbGwgdXNlcnMuICBJZiB0aGUgcGF0dGVybiB0YWtlcyB0aGUgZm9ybQotICAgICAgICAgICAgIFVTRVJASE9TVCB0aGVuIFVTRVIgYW5kIEhPU1QgYXJlIHNlcGFyYXRlbHkgY2hlY2tlZCwgcmVzdHJpY3RpbmcKLSAgICAgICAgICAgICBsb2dpbnMgdG8gcGFydGljdWxhciB1c2VycyBmcm9tIHBhcnRpY3VsYXIgaG9zdHMuICBUaGUgYWxsb3cvZGVueQotICAgICAgICAgICAgIGRpcmVjdGl2ZXMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiBEZW55VXNlcnMsCi0gICAgICAgICAgICAgQWxsb3dVc2VycywgRGVueUdyb3VwcywgYW5kIGZpbmFsbHkgQWxsb3dHcm91cHMuCi0KLSAgICAgICAgICAgICBTZWUgUEFUVEVSTlMgaW4gc3NoX2NvbmZpZyg1KSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXR0ZXJucy4KLQotICAgICBBdXRob3JpemVkS2V5c0ZpbGUKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgcHVibGljIGtleXMgdGhhdCBjYW4gYmUgdXNlZAotICAgICAgICAgICAgIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uLiAgVGhlIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gdGhlCi0gICAgICAgICAgICAgQVVUSE9SSVpFRF9LRVlTIEZJTEUgRk9STUFUIHNlY3Rpb24gb2Ygc3NoZCg4KS4KLSAgICAgICAgICAgICBBdXRob3JpemVkS2V5c0ZpbGUgbWF5IGNvbnRhaW4gdG9rZW5zIG9mIHRoZSBmb3JtICVUIHdoaWNoIGFyZQotICAgICAgICAgICAgIHN1YnN0aXR1dGVkIGR1cmluZyBjb25uZWN0aW9uIHNldHVwLiAgVGhlIGZvbGxvd2luZyB0b2tlbnMgYXJlCi0gICAgICAgICAgICAgZGVmaW5lZDogJSUgaXMgcmVwbGFjZWQgYnkgYSBsaXRlcmFsICclJywgJWggaXMgcmVwbGFjZWQgYnkgdGhlCi0gICAgICAgICAgICAgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIHVzZXIgYmVpbmcgYXV0aGVudGljYXRlZCwgYW5kICV1IGlzCi0gICAgICAgICAgICAgcmVwbGFjZWQgYnkgdGhlIHVzZXJuYW1lIG9mIHRoYXQgdXNlci4gIEFmdGVyIGV4cGFuc2lvbiwKLSAgICAgICAgICAgICBBdXRob3JpemVkS2V5c0ZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gYWJzb2x1dGUgcGF0aCBvciBvbmUKLSAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LiAgTXVsdGlwbGUgZmlsZXMgbWF5IGJlCi0gICAgICAgICAgICAgbGlzdGVkLCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIFRoZSBkZWZhdWx0IGlzCi0gICAgICAgICAgICAgYGAuc3NoL2F1dGhvcml6ZWRfa2V5cyAuc3NoL2F1dGhvcml6ZWRfa2V5czInJy4KLQotICAgICBBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGUKLSAgICAgICAgICAgICBTcGVjaWZpZXMgYSBmaWxlIHRoYXQgbGlzdHMgcHJpbmNpcGFsIG5hbWVzIHRoYXQgYXJlIGFjY2VwdGVkIGZvcgotICAgICAgICAgICAgIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uLiAgV2hlbiB1c2luZyBjZXJ0aWZpY2F0ZXMgc2lnbmVkIGJ5IGEKLSAgICAgICAgICAgICBrZXkgbGlzdGVkIGluIFRydXN0ZWRVc2VyQ0FLZXlzLCB0aGlzIGZpbGUgbGlzdHMgbmFtZXMsIG9uZSBvZgotICAgICAgICAgICAgIHdoaWNoIG11c3QgYXBwZWFyIGluIHRoZSBjZXJ0aWZpY2F0ZSBmb3IgaXQgdG8gYmUgYWNjZXB0ZWQgZm9yCi0gICAgICAgICAgICAgYXV0aGVudGljYXRpb24uICBOYW1lcyBhcmUgbGlzdGVkIG9uZSBwZXIgbGluZSBwcmVjZWRlZCBieSBrZXkKLSAgICAgICAgICAgICBvcHRpb25zIChhcyBkZXNjcmliZWQgaW4gQVVUSE9SSVpFRF9LRVlTIEZJTEUgRk9STUFUIGluIHNzaGQoOCkpLgotICAgICAgICAgICAgIEVtcHR5IGxpbmVzIGFuZCBjb21tZW50cyBzdGFydGluZyB3aXRoIGAjJyBhcmUgaWdub3JlZC4KLQotICAgICAgICAgICAgIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSBtYXkgY29udGFpbiB0b2tlbnMgb2YgdGhlIGZvcm0gJVQgd2hpY2gKLSAgICAgICAgICAgICBhcmUgc3Vic3RpdHV0ZWQgZHVyaW5nIGNvbm5lY3Rpb24gc2V0dXAuICBUaGUgZm9sbG93aW5nIHRva2VucwotICAgICAgICAgICAgIGFyZSBkZWZpbmVkOiAlJSBpcyByZXBsYWNlZCBieSBhIGxpdGVyYWwgJyUnLCAlaCBpcyByZXBsYWNlZCBieQotICAgICAgICAgICAgIHRoZSBob21lIGRpcmVjdG9yeSBvZiB0aGUgdXNlciBiZWluZyBhdXRoZW50aWNhdGVkLCBhbmQgJXUgaXMKLSAgICAgICAgICAgICByZXBsYWNlZCBieSB0aGUgdXNlcm5hbWUgb2YgdGhhdCB1c2VyLiAgQWZ0ZXIgZXhwYW5zaW9uLAotICAgICAgICAgICAgIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSBpcyB0YWtlbiB0byBiZSBhbiBhYnNvbHV0ZSBwYXRoIG9yIG9uZQotICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCi0KLSAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBub3QgdG8gdXNlIGEgcHJpbmNpcGFscyBmaWxlIC0gaW4gdGhpcyBjYXNlLCB0aGUKLSAgICAgICAgICAgICB1c2VybmFtZSBvZiB0aGUgdXNlciBtdXN0IGFwcGVhciBpbiBhIGNlcnRpZmljYXRlJ3MgcHJpbmNpcGFscwotICAgICAgICAgICAgIGxpc3QgZm9yIGl0IHRvIGJlIGFjY2VwdGVkLiAgTm90ZSB0aGF0IEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZQotICAgICAgICAgICAgIGlzIG9ubHkgdXNlZCB3aGVuIGF1dGhlbnRpY2F0aW9uIHByb2NlZWRzIHVzaW5nIGEgQ0EgbGlzdGVkIGluCi0gICAgICAgICAgICAgVHJ1c3RlZFVzZXJDQUtleXMgYW5kIGlzIG5vdCBjb25zdWx0ZWQgZm9yIGNlcnRpZmljYXRpb24KLSAgICAgICAgICAgICBhdXRob3JpdGllcyB0cnVzdGVkIHZpYSB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzLCB0aG91Z2ggdGhlCi0gICAgICAgICAgICAgcHJpbmNpcGFscz0ga2V5IG9wdGlvbiBvZmZlcnMgYSBzaW1pbGFyIGZhY2lsaXR5IChzZWUgc3NoZCg4KSBmb3IKLSAgICAgICAgICAgICBkZXRhaWxzKS4KLQotICAgICBCYW5uZXIgIFRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgYXJlIHNlbnQgdG8gdGhlIHJlbW90ZSB1c2VyCi0gICAgICAgICAgICAgYmVmb3JlIGF1dGhlbnRpY2F0aW9uIGlzIGFsbG93ZWQuICBJZiB0aGUgYXJndW1lbnQgaXMgYGBub25lJycKLSAgICAgICAgICAgICB0aGVuIG5vIGJhbm5lciBpcyBkaXNwbGF5ZWQuICBUaGlzIG9wdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBmb3IKLSAgICAgICAgICAgICBwcm90b2NvbCB2ZXJzaW9uIDIuICBCeSBkZWZhdWx0LCBubyBiYW5uZXIgaXMgZGlzcGxheWVkLgotCi0gICAgIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBjaGFsbGVuZ2UtcmVzcG9uc2UgYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZAotICAgICAgICAgICAgIChlLmcuIHZpYSBQQU0gb3IgdGhvdWdoIGF1dGhlbnRpY2F0aW9uIHN0eWxlcyBzdXBwb3J0ZWQgaW4KLSAgICAgICAgICAgICBsb2dpbi5jb25mKDUpKSBUaGUgZGVmYXVsdCBpcyBgYHllcycnLgotCi0gICAgIENocm9vdERpcmVjdG9yeQotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcGF0aG5hbWUgb2YgYSBkaXJlY3RvcnkgdG8gY2hyb290KDIpIHRvIGFmdGVyCi0gICAgICAgICAgICAgYXV0aGVudGljYXRpb24uICBBbGwgY29tcG9uZW50cyBvZiB0aGUgcGF0aG5hbWUgbXVzdCBiZSByb290LQotICAgICAgICAgICAgIG93bmVkIGRpcmVjdG9yaWVzIHRoYXQgYXJlIG5vdCB3cml0YWJsZSBieSBhbnkgb3RoZXIgdXNlciBvcgotICAgICAgICAgICAgIGdyb3VwLiAgQWZ0ZXIgdGhlIGNocm9vdCwgc3NoZCg4KSBjaGFuZ2VzIHRoZSB3b3JraW5nIGRpcmVjdG9yeQotICAgICAgICAgICAgIHRvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCi0KLSAgICAgICAgICAgICBUaGUgcGF0aG5hbWUgbWF5IGNvbnRhaW4gdGhlIGZvbGxvd2luZyB0b2tlbnMgdGhhdCBhcmUgZXhwYW5kZWQKLSAgICAgICAgICAgICBhdCBydW50aW1lIG9uY2UgdGhlIGNvbm5lY3RpbmcgdXNlciBoYXMgYmVlbiBhdXRoZW50aWNhdGVkOiAlJSBpcwotICAgICAgICAgICAgIHJlcGxhY2VkIGJ5IGEgbGl0ZXJhbCAnJScsICVoIGlzIHJlcGxhY2VkIGJ5IHRoZSBob21lIGRpcmVjdG9yeQotICAgICAgICAgICAgIG9mIHRoZSB1c2VyIGJlaW5nIGF1dGhlbnRpY2F0ZWQsIGFuZCAldSBpcyByZXBsYWNlZCBieSB0aGUKLSAgICAgICAgICAgICB1c2VybmFtZSBvZiB0aGF0IHVzZXIuCi0KLSAgICAgICAgICAgICBUaGUgQ2hyb290RGlyZWN0b3J5IG11c3QgY29udGFpbiB0aGUgbmVjZXNzYXJ5IGZpbGVzIGFuZAotICAgICAgICAgICAgIGRpcmVjdG9yaWVzIHRvIHN1cHBvcnQgdGhlIHVzZXIncyBzZXNzaW9uLiAgRm9yIGFuIGludGVyYWN0aXZlCi0gICAgICAgICAgICAgc2Vzc2lvbiB0aGlzIHJlcXVpcmVzIGF0IGxlYXN0IGEgc2hlbGwsIHR5cGljYWxseSBzaCgxKSwgYW5kCi0gICAgICAgICAgICAgYmFzaWMgL2RldiBub2RlcyBzdWNoIGFzIG51bGwoNCksIHplcm8oNCksIHN0ZGluKDQpLCBzdGRvdXQoNCksCi0gICAgICAgICAgICAgc3RkZXJyKDQpLCBhcmFuZG9tKDQpIGFuZCB0dHkoNCkgZGV2aWNlcy4gIEZvciBmaWxlIHRyYW5zZmVyCi0gICAgICAgICAgICAgc2Vzc2lvbnMgdXNpbmcgYGBzZnRwJycsIG5vIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBvZiB0aGUKLSAgICAgICAgICAgICBlbnZpcm9ubWVudCBpcyBuZWNlc3NhcnkgaWYgdGhlIGluLXByb2Nlc3Mgc2Z0cCBzZXJ2ZXIgaXMgdXNlZCwKLSAgICAgICAgICAgICB0aG91Z2ggc2Vzc2lvbnMgd2hpY2ggdXNlIGxvZ2dpbmcgZG8gcmVxdWlyZSAvZGV2L2xvZyBpbnNpZGUgdGhlCi0gICAgICAgICAgICAgY2hyb290IGRpcmVjdG9yeSAoc2VlIHNmdHAtc2VydmVyKDgpIGZvciBkZXRhaWxzKS4KLQotICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIG5vdCB0byBjaHJvb3QoMikuCi0KLSAgICAgQ2lwaGVycwotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgY2lwaGVycyBhbGxvd2VkIGZvciBwcm90b2NvbCB2ZXJzaW9uIDIuICBNdWx0aXBsZQotICAgICAgICAgICAgIGNpcGhlcnMgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQuICBUaGUgc3VwcG9ydGVkIGNpcGhlcnMgYXJlCi0gICAgICAgICAgICAgYGAzZGVzLWNiYycnLCBgYGFlczEyOC1jYmMnJywgYGBhZXMxOTItY2JjJycsIGBgYWVzMjU2LWNiYycnLAotICAgICAgICAgICAgIGBgYWVzMTI4LWN0cicnLCBgYGFlczE5Mi1jdHInJywgYGBhZXMyNTYtY3RyJycsIGBgYXJjZm91cjEyOCcnLAotICAgICAgICAgICAgIGBgYXJjZm91cjI1NicnLCBgYGFyY2ZvdXInJywgYGBibG93ZmlzaC1jYmMnJywgYW5kCi0gICAgICAgICAgICAgYGBjYXN0MTI4LWNiYycnLiAgVGhlIGRlZmF1bHQgaXM6Ci0KLSAgICAgICAgICAgICAgICBhZXMxMjgtY3RyLGFlczE5Mi1jdHIsYWVzMjU2LWN0cixhcmNmb3VyMjU2LGFyY2ZvdXIxMjgsCi0gICAgICAgICAgICAgICAgYWVzMTI4LWNiYywzZGVzLWNiYyxibG93ZmlzaC1jYmMsY2FzdDEyOC1jYmMsYWVzMTkyLWNiYywKLSAgICAgICAgICAgICAgICBhZXMyNTYtY2JjLGFyY2ZvdXIKLQotICAgICBDbGllbnRBbGl2ZUNvdW50TWF4Ci0gICAgICAgICAgICAgU2V0cyB0aGUgbnVtYmVyIG9mIGNsaWVudCBhbGl2ZSBtZXNzYWdlcyAoc2VlIGJlbG93KSB3aGljaCBtYXkgYmUKLSAgICAgICAgICAgICBzZW50IHdpdGhvdXQgc3NoZCg4KSByZWNlaXZpbmcgYW55IG1lc3NhZ2VzIGJhY2sgZnJvbSB0aGUgY2xpZW50LgotICAgICAgICAgICAgIElmIHRoaXMgdGhyZXNob2xkIGlzIHJlYWNoZWQgd2hpbGUgY2xpZW50IGFsaXZlIG1lc3NhZ2VzIGFyZQotICAgICAgICAgICAgIGJlaW5nIHNlbnQsIHNzaGQgd2lsbCBkaXNjb25uZWN0IHRoZSBjbGllbnQsIHRlcm1pbmF0aW5nIHRoZQotICAgICAgICAgICAgIHNlc3Npb24uICBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSB1c2Ugb2YgY2xpZW50IGFsaXZlCi0gICAgICAgICAgICAgbWVzc2FnZXMgaXMgdmVyeSBkaWZmZXJlbnQgZnJvbSBUQ1BLZWVwQWxpdmUgKGJlbG93KS4gIFRoZSBjbGllbnQKLSAgICAgICAgICAgICBhbGl2ZSBtZXNzYWdlcyBhcmUgc2VudCB0aHJvdWdoIHRoZSBlbmNyeXB0ZWQgY2hhbm5lbCBhbmQKLSAgICAgICAgICAgICB0aGVyZWZvcmUgd2lsbCBub3QgYmUgc3Bvb2ZhYmxlLiAgVGhlIFRDUCBrZWVwYWxpdmUgb3B0aW9uCi0gICAgICAgICAgICAgZW5hYmxlZCBieSBUQ1BLZWVwQWxpdmUgaXMgc3Bvb2ZhYmxlLiAgVGhlIGNsaWVudCBhbGl2ZSBtZWNoYW5pc20KLSAgICAgICAgICAgICBpcyB2YWx1YWJsZSB3aGVuIHRoZSBjbGllbnQgb3Igc2VydmVyIGRlcGVuZCBvbiBrbm93aW5nIHdoZW4gYQotICAgICAgICAgICAgIGNvbm5lY3Rpb24gaGFzIGJlY29tZSBpbmFjdGl2ZS4KLQotICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDMuICBJZiBDbGllbnRBbGl2ZUludGVydmFsIChzZWUgYmVsb3cpIGlzCi0gICAgICAgICAgICAgc2V0IHRvIDE1LCBhbmQgQ2xpZW50QWxpdmVDb3VudE1heCBpcyBsZWZ0IGF0IHRoZSBkZWZhdWx0LAotICAgICAgICAgICAgIHVucmVzcG9uc2l2ZSBTU0ggY2xpZW50cyB3aWxsIGJlIGRpc2Nvbm5lY3RlZCBhZnRlciBhcHByb3hpbWF0ZWx5Ci0gICAgICAgICAgICAgNDUgc2Vjb25kcy4gIFRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAyIG9ubHkuCi0KLSAgICAgQ2xpZW50QWxpdmVJbnRlcnZhbAotICAgICAgICAgICAgIFNldHMgYSB0aW1lb3V0IGludGVydmFsIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggaWYgbm8gZGF0YSBoYXMKLSAgICAgICAgICAgICBiZWVuIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudCwgc3NoZCg4KSB3aWxsIHNlbmQgYSBtZXNzYWdlCi0gICAgICAgICAgICAgdGhyb3VnaCB0aGUgZW5jcnlwdGVkIGNoYW5uZWwgdG8gcmVxdWVzdCBhIHJlc3BvbnNlIGZyb20gdGhlCi0gICAgICAgICAgICAgY2xpZW50LiAgVGhlIGRlZmF1bHQgaXMgMCwgaW5kaWNhdGluZyB0aGF0IHRoZXNlIG1lc3NhZ2VzIHdpbGwKLSAgICAgICAgICAgICBub3QgYmUgc2VudCB0byB0aGUgY2xpZW50LiAgVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbAotICAgICAgICAgICAgIHZlcnNpb24gMiBvbmx5LgotCi0gICAgIENvbXByZXNzaW9uCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgY29tcHJlc3Npb24gaXMgYWxsb3dlZCwgb3IgZGVsYXllZCB1bnRpbCB0aGUKLSAgICAgICAgICAgICB1c2VyIGhhcyBhdXRoZW50aWNhdGVkIHN1Y2Nlc3NmdWxseS4gIFRoZSBhcmd1bWVudCBtdXN0IGJlCi0gICAgICAgICAgICAgYGB5ZXMnJywgYGBkZWxheWVkJycsIG9yIGBgbm8nJy4gIFRoZSBkZWZhdWx0IGlzIGBgZGVsYXllZCcnLgotCi0gICAgIERlbnlHcm91cHMKLSAgICAgICAgICAgICBUaGlzIGtleXdvcmQgY2FuIGJlIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBncm91cCBuYW1lIHBhdHRlcm5zLAotICAgICAgICAgICAgIHNlcGFyYXRlZCBieSBzcGFjZXMuICBMb2dpbiBpcyBkaXNhbGxvd2VkIGZvciB1c2VycyB3aG9zZSBwcmltYXJ5Ci0gICAgICAgICAgICAgZ3JvdXAgb3Igc3VwcGxlbWVudGFyeSBncm91cCBsaXN0IG1hdGNoZXMgb25lIG9mIHRoZSBwYXR0ZXJucy4KLSAgICAgICAgICAgICBPbmx5IGdyb3VwIG5hbWVzIGFyZSB2YWxpZDsgYSBudW1lcmljYWwgZ3JvdXAgSUQgaXMgbm90Ci0gICAgICAgICAgICAgcmVjb2duaXplZC4gIEJ5IGRlZmF1bHQsIGxvZ2luIGlzIGFsbG93ZWQgZm9yIGFsbCBncm91cHMuICBUaGUKLSAgICAgICAgICAgICBhbGxvdy9kZW55IGRpcmVjdGl2ZXMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotICAgICAgICAgICAgIERlbnlVc2VycywgQWxsb3dVc2VycywgRGVueUdyb3VwcywgYW5kIGZpbmFsbHkgQWxsb3dHcm91cHMuCi0KLSAgICAgICAgICAgICBTZWUgUEFUVEVSTlMgaW4gc3NoX2NvbmZpZyg1KSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXR0ZXJucy4KLQotICAgICBEZW55VXNlcnMKLSAgICAgICAgICAgICBUaGlzIGtleXdvcmQgY2FuIGJlIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiB1c2VyIG5hbWUgcGF0dGVybnMsCi0gICAgICAgICAgICAgc2VwYXJhdGVkIGJ5IHNwYWNlcy4gIExvZ2luIGlzIGRpc2FsbG93ZWQgZm9yIHVzZXIgbmFtZXMgdGhhdAotICAgICAgICAgICAgIG1hdGNoIG9uZSBvZiB0aGUgcGF0dGVybnMuICBPbmx5IHVzZXIgbmFtZXMgYXJlIHZhbGlkOyBhCi0gICAgICAgICAgICAgbnVtZXJpY2FsIHVzZXIgSUQgaXMgbm90IHJlY29nbml6ZWQuICBCeSBkZWZhdWx0LCBsb2dpbiBpcwotICAgICAgICAgICAgIGFsbG93ZWQgZm9yIGFsbCB1c2Vycy4gIElmIHRoZSBwYXR0ZXJuIHRha2VzIHRoZSBmb3JtIFVTRVJASE9TVAotICAgICAgICAgICAgIHRoZW4gVVNFUiBhbmQgSE9TVCBhcmUgc2VwYXJhdGVseSBjaGVja2VkLCByZXN0cmljdGluZyBsb2dpbnMgdG8KLSAgICAgICAgICAgICBwYXJ0aWN1bGFyIHVzZXJzIGZyb20gcGFydGljdWxhciBob3N0cy4gIFRoZSBhbGxvdy9kZW55Ci0gICAgICAgICAgICAgZGlyZWN0aXZlcyBhcmUgcHJvY2Vzc2VkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6IERlbnlVc2VycywKLSAgICAgICAgICAgICBBbGxvd1VzZXJzLCBEZW55R3JvdXBzLCBhbmQgZmluYWxseSBBbGxvd0dyb3Vwcy4KLQotICAgICAgICAgICAgIFNlZSBQQVRURVJOUyBpbiBzc2hfY29uZmlnKDUpIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBhdHRlcm5zLgotCi0gICAgIEZvcmNlQ29tbWFuZAotICAgICAgICAgICAgIEZvcmNlcyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjb21tYW5kIHNwZWNpZmllZCBieSBGb3JjZUNvbW1hbmQsCi0gICAgICAgICAgICAgaWdub3JpbmcgYW55IGNvbW1hbmQgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCBhbmQgfi8uc3NoL3JjIGlmCi0gICAgICAgICAgICAgcHJlc2VudC4gIFRoZSBjb21tYW5kIGlzIGludm9rZWQgYnkgdXNpbmcgdGhlIHVzZXIncyBsb2dpbiBzaGVsbAotICAgICAgICAgICAgIHdpdGggdGhlIC1jIG9wdGlvbi4gIFRoaXMgYXBwbGllcyB0byBzaGVsbCwgY29tbWFuZCwgb3Igc3Vic3lzdGVtCi0gICAgICAgICAgICAgZXhlY3V0aW9uLiAgSXQgaXMgbW9zdCB1c2VmdWwgaW5zaWRlIGEgTWF0Y2ggYmxvY2suICBUaGUgY29tbWFuZAotICAgICAgICAgICAgIG9yaWdpbmFsbHkgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCBpcyBhdmFpbGFibGUgaW4gdGhlCi0gICAgICAgICAgICAgU1NIX09SSUdJTkFMX0NPTU1BTkQgZW52aXJvbm1lbnQgdmFyaWFibGUuICBTcGVjaWZ5aW5nIGEgY29tbWFuZAotICAgICAgICAgICAgIG9mIGBgaW50ZXJuYWwtc2Z0cCcnIHdpbGwgZm9yY2UgdGhlIHVzZSBvZiBhbiBpbi1wcm9jZXNzIHNmdHAKLSAgICAgICAgICAgICBzZXJ2ZXIgdGhhdCByZXF1aXJlcyBubyBzdXBwb3J0IGZpbGVzIHdoZW4gdXNlZCB3aXRoCi0gICAgICAgICAgICAgQ2hyb290RGlyZWN0b3J5LgotCi0gICAgIEdhdGV3YXlQb3J0cwotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHJlbW90ZSBob3N0cyBhcmUgYWxsb3dlZCB0byBjb25uZWN0IHRvIHBvcnRzCi0gICAgICAgICAgICAgZm9yd2FyZGVkIGZvciB0aGUgY2xpZW50LiAgQnkgZGVmYXVsdCwgc3NoZCg4KSBiaW5kcyByZW1vdGUgcG9ydAotICAgICAgICAgICAgIGZvcndhcmRpbmdzIHRvIHRoZSBsb29wYmFjayBhZGRyZXNzLiAgVGhpcyBwcmV2ZW50cyBvdGhlciByZW1vdGUKLSAgICAgICAgICAgICBob3N0cyBmcm9tIGNvbm5lY3RpbmcgdG8gZm9yd2FyZGVkIHBvcnRzLiAgR2F0ZXdheVBvcnRzIGNhbiBiZQotICAgICAgICAgICAgIHVzZWQgdG8gc3BlY2lmeSB0aGF0IHNzaGQgc2hvdWxkIGFsbG93IHJlbW90ZSBwb3J0IGZvcndhcmRpbmdzIHRvCi0gICAgICAgICAgICAgYmluZCB0byBub24tbG9vcGJhY2sgYWRkcmVzc2VzLCB0aHVzIGFsbG93aW5nIG90aGVyIGhvc3RzIHRvCi0gICAgICAgICAgICAgY29ubmVjdC4gIFRoZSBhcmd1bWVudCBtYXkgYmUgYGBubycnIHRvIGZvcmNlIHJlbW90ZSBwb3J0Ci0gICAgICAgICAgICAgZm9yd2FyZGluZ3MgdG8gYmUgYXZhaWxhYmxlIHRvIHRoZSBsb2NhbCBob3N0IG9ubHksIGBgeWVzJycgdG8KLSAgICAgICAgICAgICBmb3JjZSByZW1vdGUgcG9ydCBmb3J3YXJkaW5ncyB0byBiaW5kIHRvIHRoZSB3aWxkY2FyZCBhZGRyZXNzLCBvcgotICAgICAgICAgICAgIGBgY2xpZW50c3BlY2lmaWVkJycgdG8gYWxsb3cgdGhlIGNsaWVudCB0byBzZWxlY3QgdGhlIGFkZHJlc3MgdG8KLSAgICAgICAgICAgICB3aGljaCB0aGUgZm9yd2FyZGluZyBpcyBib3VuZC4gIFRoZSBkZWZhdWx0IGlzIGBgbm8nJy4KLQotICAgICBHU1NBUElBdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHVzZXIgYXV0aGVudGljYXRpb24gYmFzZWQgb24gR1NTQVBJIGlzIGFsbG93ZWQuCi0gICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgYGBubycnLiAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wKLSAgICAgICAgICAgICB2ZXJzaW9uIDIgb25seS4KLQotICAgICBHU1NBUElDbGVhbnVwQ3JlZGVudGlhbHMKLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGRlc3Ryb3kgdGhlIHVzZXIncyBjcmVkZW50aWFscwotICAgICAgICAgICAgIGNhY2hlIG9uIGxvZ291dC4gIFRoZSBkZWZhdWx0IGlzIGBgeWVzJycuICBOb3RlIHRoYXQgdGhpcyBvcHRpb24KLSAgICAgICAgICAgICBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgotCi0gICAgIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgcmhvc3RzIG9yIC9ldGMvaG9zdHMuZXF1aXYgYXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICB0b2dldGhlciB3aXRoIHN1Y2Nlc3NmdWwgcHVibGljIGtleSBjbGllbnQgaG9zdCBhdXRoZW50aWNhdGlvbiBpcwotICAgICAgICAgICAgIGFsbG93ZWQgKGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24pLiAgVGhpcyBvcHRpb24gaXMgc2ltaWxhciB0bwotICAgICAgICAgICAgIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uIGFuZCBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgotICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGBgbm8nJy4KLQotICAgICBIb3N0YmFzZWRVc2VzTmFtZUZyb21QYWNrZXRPbmx5Ci0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBzZXJ2ZXIgd2lsbCBhdHRlbXB0IHRvIHBlcmZvcm0gYQotICAgICAgICAgICAgIHJldmVyc2UgbmFtZSBsb29rdXAgd2hlbiBtYXRjaGluZyB0aGUgbmFtZSBpbiB0aGUgfi8uc2hvc3RzLAotICAgICAgICAgICAgIH4vLnJob3N0cywgYW5kIC9ldGMvaG9zdHMuZXF1aXYgZmlsZXMgZHVyaW5nCi0gICAgICAgICAgICAgSG9zdGJhc2VkQXV0aGVudGljYXRpb24uICBBIHNldHRpbmcgb2YgYGB5ZXMnJyBtZWFucyB0aGF0IHNzaGQoOCkKLSAgICAgICAgICAgICB1c2VzIHRoZSBuYW1lIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQgcmF0aGVyIHRoYW4gYXR0ZW1wdGluZyB0bwotICAgICAgICAgICAgIHJlc29sdmUgdGhlIG5hbWUgZnJvbSB0aGUgVENQIGNvbm5lY3Rpb24gaXRzZWxmLiAgVGhlIGRlZmF1bHQgaXMKLSAgICAgICAgICAgICBgYG5vJycuCi0KLSAgICAgSG9zdENlcnRpZmljYXRlCi0gICAgICAgICAgICAgU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIGEgcHVibGljIGhvc3QgY2VydGlmaWNhdGUuICBUaGUKLSAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSdzIHB1YmxpYyBrZXkgbXVzdCBtYXRjaCBhIHByaXZhdGUgaG9zdCBrZXkgYWxyZWFkeQotICAgICAgICAgICAgIHNwZWNpZmllZCBieSBIb3N0S2V5LiAgVGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHNzaGQoOCkgaXMgbm90IHRvCi0gICAgICAgICAgICAgbG9hZCBhbnkgY2VydGlmaWNhdGVzLgotCi0gICAgIEhvc3RLZXkKLSAgICAgICAgICAgICBTcGVjaWZpZXMgYSBmaWxlIGNvbnRhaW5pbmcgYSBwcml2YXRlIGhvc3Qga2V5IHVzZWQgYnkgU1NILiAgVGhlCi0gICAgICAgICAgICAgZGVmYXVsdCBpcyAvZXRjL3NzaC9zc2hfaG9zdF9rZXkgZm9yIHByb3RvY29sIHZlcnNpb24gMSwgYW5kCi0gICAgICAgICAgICAgL2V0Yy9zc2gvc3NoX2hvc3RfZHNhX2tleSwgL2V0Yy9zc2gvc3NoX2hvc3RfZWNkc2Ffa2V5IGFuZAotICAgICAgICAgICAgIC9ldGMvc3NoL3NzaF9ob3N0X3JzYV9rZXkgZm9yIHByb3RvY29sIHZlcnNpb24gMi4gIE5vdGUgdGhhdAotICAgICAgICAgICAgIHNzaGQoOCkgd2lsbCByZWZ1c2UgdG8gdXNlIGEgZmlsZSBpZiBpdCBpcyBncm91cC93b3JsZC0KLSAgICAgICAgICAgICBhY2Nlc3NpYmxlLiAgSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBob3N0IGtleSBmaWxlcy4KLSAgICAgICAgICAgICBgYHJzYTEnJyBrZXlzIGFyZSB1c2VkIGZvciB2ZXJzaW9uIDEgYW5kIGBgZHNhJycsIGBgZWNkc2EnJyBvcgotICAgICAgICAgICAgIGBgcnNhJycgYXJlIHVzZWQgZm9yIHZlcnNpb24gMiBvZiB0aGUgU1NIIHByb3RvY29sLgotCi0gICAgIElnbm9yZVJob3N0cwotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGF0IC5yaG9zdHMgYW5kIC5zaG9zdHMgZmlsZXMgd2lsbCBub3QgYmUgdXNlZCBpbgotICAgICAgICAgICAgIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uIG9yIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uLgotCi0gICAgICAgICAgICAgL2V0Yy9ob3N0cy5lcXVpdiBhbmQgL2V0Yy9zaG9zdHMuZXF1aXYgYXJlIHN0aWxsIHVzZWQuICBUaGUKLSAgICAgICAgICAgICBkZWZhdWx0IGlzIGBgeWVzJycuCi0KLSAgICAgSWdub3JlVXNlcktub3duSG9zdHMKLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzc2hkKDgpIHNob3VsZCBpZ25vcmUgdGhlIHVzZXIncwotICAgICAgICAgICAgIH4vLnNzaC9rbm93bl9ob3N0cyBkdXJpbmcgUmhvc3RzUlNBQXV0aGVudGljYXRpb24gb3IKLSAgICAgICAgICAgICBIb3N0YmFzZWRBdXRoZW50aWNhdGlvbi4gIFRoZSBkZWZhdWx0IGlzIGBgbm8nJy4KLQotICAgICBJUFFvUyAgIFNwZWNpZmllcyB0aGUgSVB2NCB0eXBlLW9mLXNlcnZpY2Ugb3IgRFNDUCBjbGFzcyBmb3IgdGhlCi0gICAgICAgICAgICAgY29ubmVjdGlvbi4gIEFjY2VwdGVkIHZhbHVlcyBhcmUgYGBhZjExJycsIGBgYWYxMicnLCBgYGFmMTMnJywKLSAgICAgICAgICAgICBgYGFmMTQnJywgYGBhZjIyJycsIGBgYWYyMycnLCBgYGFmMzEnJywgYGBhZjMyJycsIGBgYWYzMycnLAotICAgICAgICAgICAgIGBgYWY0MScnLCBgYGFmNDInJywgYGBhZjQzJycsIGBgY3MwJycsIGBgY3MxJycsIGBgY3MyJycsIGBgY3MzJycsCi0gICAgICAgICAgICAgYGBjczQnJywgYGBjczUnJywgYGBjczYnJywgYGBjczcnJywgYGBlZicnLCBgYGxvd2RlbGF5JycsCi0gICAgICAgICAgICAgYGB0aHJvdWdocHV0JycsIGBgcmVsaWFiaWxpdHknJywgb3IgYSBudW1lcmljIHZhbHVlLiAgVGhpcyBvcHRpb24KLSAgICAgICAgICAgICBtYXkgdGFrZSBvbmUgb3IgdHdvIGFyZ3VtZW50cywgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuICBJZiBvbmUKLSAgICAgICAgICAgICBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIGl0IGlzIHVzZWQgYXMgdGhlIHBhY2tldCBjbGFzcwotICAgICAgICAgICAgIHVuY29uZGl0aW9uYWxseS4gIElmIHR3byB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIGZpcnN0IGlzCi0gICAgICAgICAgICAgYXV0b21hdGljYWxseSBzZWxlY3RlZCBmb3IgaW50ZXJhY3RpdmUgc2Vzc2lvbnMgYW5kIHRoZSBzZWNvbmQKLSAgICAgICAgICAgICBmb3Igbm9uLWludGVyYWN0aXZlIHNlc3Npb25zLiAgVGhlIGRlZmF1bHQgaXMgYGBsb3dkZWxheScnIGZvcgotICAgICAgICAgICAgIGludGVyYWN0aXZlIHNlc3Npb25zIGFuZCBgYHRocm91Z2hwdXQnJyBmb3Igbm9uLWludGVyYWN0aXZlCi0gICAgICAgICAgICAgc2Vzc2lvbnMuCi0KLSAgICAgS2VyYmVyb3NBdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBwYXNzd29yZCBwcm92aWRlZCBieSB0aGUgdXNlciBmb3IKLSAgICAgICAgICAgICBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHdpbGwgYmUgdmFsaWRhdGVkIHRocm91Z2ggdGhlIEtlcmJlcm9zCi0gICAgICAgICAgICAgS0RDLiAgVG8gdXNlIHRoaXMgb3B0aW9uLCB0aGUgc2VydmVyIG5lZWRzIGEgS2VyYmVyb3Mgc2VydnRhYgotICAgICAgICAgICAgIHdoaWNoIGFsbG93cyB0aGUgdmVyaWZpY2F0aW9uIG9mIHRoZSBLREMncyBpZGVudGl0eS4gIFRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgaXMgYGBubycnLgotCi0gICAgIEtlcmJlcm9zR2V0QUZTVG9rZW4KLSAgICAgICAgICAgICBJZiBBRlMgaXMgYWN0aXZlIGFuZCB0aGUgdXNlciBoYXMgYSBLZXJiZXJvcyA1IFRHVCwgYXR0ZW1wdCB0bwotICAgICAgICAgICAgIGFjcXVpcmUgYW4gQUZTIHRva2VuIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4KLSAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuCi0KLSAgICAgS2VyYmVyb3NPckxvY2FsUGFzc3dkCi0gICAgICAgICAgICAgSWYgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gdGhyb3VnaCBLZXJiZXJvcyBmYWlscyB0aGVuIHRoZQotICAgICAgICAgICAgIHBhc3N3b3JkIHdpbGwgYmUgdmFsaWRhdGVkIHZpYSBhbnkgYWRkaXRpb25hbCBsb2NhbCBtZWNoYW5pc20KLSAgICAgICAgICAgICBzdWNoIGFzIC9ldGMvcGFzc3dkLiAgVGhlIGRlZmF1bHQgaXMgYGB5ZXMnJy4KLQotICAgICBLZXJiZXJvc1RpY2tldENsZWFudXAKLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGRlc3Ryb3kgdGhlIHVzZXIncyB0aWNrZXQKLSAgICAgICAgICAgICBjYWNoZSBmaWxlIG9uIGxvZ291dC4gIFRoZSBkZWZhdWx0IGlzIGBgeWVzJycuCi0KLSAgICAgS2V4QWxnb3JpdGhtcwotICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgYXZhaWxhYmxlIEtFWCAoS2V5IEV4Y2hhbmdlKSBhbGdvcml0aG1zLiAgTXVsdGlwbGUKLSAgICAgICAgICAgICBhbGdvcml0aG1zIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkLiAgVGhlIGRlZmF1bHQgaXMKLSAgICAgICAgICAgICBgYGVjZGgtc2hhMi1uaXN0cDI1NicnLCBgYGVjZGgtc2hhMi1uaXN0cDM4NCcnLAotICAgICAgICAgICAgIGBgZWNkaC1zaGEyLW5pc3RwNTIxJycsIGBgZGlmZmllLWhlbGxtYW4tZ3JvdXAtZXhjaGFuZ2Utc2hhMjU2JycsCi0gICAgICAgICAgICAgYGBkaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGExJycsCi0gICAgICAgICAgICAgYGBkaWZmaWUtaGVsbG1hbi1ncm91cDE0LXNoYTEnJywgYGBkaWZmaWUtaGVsbG1hbi1ncm91cDEtc2hhMScnLgotCi0gICAgIEtleVJlZ2VuZXJhdGlvbkludGVydmFsCi0gICAgICAgICAgICAgSW4gcHJvdG9jb2wgdmVyc2lvbiAxLCB0aGUgZXBoZW1lcmFsIHNlcnZlciBrZXkgaXMgYXV0b21hdGljYWxseQotICAgICAgICAgICAgIHJlZ2VuZXJhdGVkIGFmdGVyIHRoaXMgbWFueSBzZWNvbmRzIChpZiBpdCBoYXMgYmVlbiB1c2VkKS4gIFRoZQotICAgICAgICAgICAgIHB1cnBvc2Ugb2YgcmVnZW5lcmF0aW9uIGlzIHRvIHByZXZlbnQgZGVjcnlwdGluZyBjYXB0dXJlZAotICAgICAgICAgICAgIHNlc3Npb25zIGJ5IGxhdGVyIGJyZWFraW5nIGludG8gdGhlIG1hY2hpbmUgYW5kIHN0ZWFsaW5nIHRoZQotICAgICAgICAgICAgIGtleXMuICBUaGUga2V5IGlzIG5ldmVyIHN0b3JlZCBhbnl3aGVyZS4gIElmIHRoZSB2YWx1ZSBpcyAwLCB0aGUKLSAgICAgICAgICAgICBrZXkgaXMgbmV2ZXIgcmVnZW5lcmF0ZWQuICBUaGUgZGVmYXVsdCBpcyAzNjAwIChzZWNvbmRzKS4KLQotICAgICBMaXN0ZW5BZGRyZXNzCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBsb2NhbCBhZGRyZXNzZXMgc3NoZCg4KSBzaG91bGQgbGlzdGVuIG9uLiAgVGhlCi0gICAgICAgICAgICAgZm9sbG93aW5nIGZvcm1zIG1heSBiZSB1c2VkOgotCi0gICAgICAgICAgICAgICAgICAgTGlzdGVuQWRkcmVzcyBob3N0fElQdjRfYWRkcnxJUHY2X2FkZHIKLSAgICAgICAgICAgICAgICAgICBMaXN0ZW5BZGRyZXNzIGhvc3R8SVB2NF9hZGRyOnBvcnQKLSAgICAgICAgICAgICAgICAgICBMaXN0ZW5BZGRyZXNzIFtob3N0fElQdjZfYWRkcl06cG9ydAotCi0gICAgICAgICAgICAgSWYgcG9ydCBpcyBub3Qgc3BlY2lmaWVkLCBzc2hkIHdpbGwgbGlzdGVuIG9uIHRoZSBhZGRyZXNzIGFuZCBhbGwKLSAgICAgICAgICAgICBwcmlvciBQb3J0IG9wdGlvbnMgc3BlY2lmaWVkLiAgVGhlIGRlZmF1bHQgaXMgdG8gbGlzdGVuIG9uIGFsbAotICAgICAgICAgICAgIGxvY2FsIGFkZHJlc3Nlcy4gIE11bHRpcGxlIExpc3RlbkFkZHJlc3Mgb3B0aW9ucyBhcmUgcGVybWl0dGVkLgotICAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgYW55IFBvcnQgb3B0aW9ucyBtdXN0IHByZWNlZGUgdGhpcyBvcHRpb24gZm9yIG5vbi0KLSAgICAgICAgICAgICBwb3J0IHF1YWxpZmllZCBhZGRyZXNzZXMuCi0KLSAgICAgTG9naW5HcmFjZVRpbWUKLSAgICAgICAgICAgICBUaGUgc2VydmVyIGRpc2Nvbm5lY3RzIGFmdGVyIHRoaXMgdGltZSBpZiB0aGUgdXNlciBoYXMgbm90Ci0gICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IGxvZ2dlZCBpbi4gIElmIHRoZSB2YWx1ZSBpcyAwLCB0aGVyZSBpcyBubyB0aW1lCi0gICAgICAgICAgICAgbGltaXQuICBUaGUgZGVmYXVsdCBpcyAxMjAgc2Vjb25kcy4KLQotICAgICBMb2dMZXZlbAotICAgICAgICAgICAgIEdpdmVzIHRoZSB2ZXJib3NpdHkgbGV2ZWwgdGhhdCBpcyB1c2VkIHdoZW4gbG9nZ2luZyBtZXNzYWdlcyBmcm9tCi0gICAgICAgICAgICAgc3NoZCg4KS4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBRVUlFVCwgRkFUQUwsIEVSUk9SLCBJTkZPLAotICAgICAgICAgICAgIFZFUkJPU0UsIERFQlVHLCBERUJVRzEsIERFQlVHMiwgYW5kIERFQlVHMy4gIFRoZSBkZWZhdWx0IGlzIElORk8uCi0gICAgICAgICAgICAgREVCVUcgYW5kIERFQlVHMSBhcmUgZXF1aXZhbGVudC4gIERFQlVHMiBhbmQgREVCVUczIGVhY2ggc3BlY2lmeQotICAgICAgICAgICAgIGhpZ2hlciBsZXZlbHMgb2YgZGVidWdnaW5nIG91dHB1dC4gIExvZ2dpbmcgd2l0aCBhIERFQlVHIGxldmVsCi0gICAgICAgICAgICAgdmlvbGF0ZXMgdGhlIHByaXZhY3kgb2YgdXNlcnMgYW5kIGlzIG5vdCByZWNvbW1lbmRlZC4KLQotICAgICBNQUNzICAgIFNwZWNpZmllcyB0aGUgYXZhaWxhYmxlIE1BQyAobWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlKQotICAgICAgICAgICAgIGFsZ29yaXRobXMuICBUaGUgTUFDIGFsZ29yaXRobSBpcyB1c2VkIGluIHByb3RvY29sIHZlcnNpb24gMiBmb3IKLSAgICAgICAgICAgICBkYXRhIGludGVncml0eSBwcm90ZWN0aW9uLiAgTXVsdGlwbGUgYWxnb3JpdGhtcyBtdXN0IGJlIGNvbW1hLQotICAgICAgICAgICAgIHNlcGFyYXRlZC4gIFRoZSBkZWZhdWx0IGlzOgotCi0gICAgICAgICAgICAgICAgICAgaG1hYy1tZDUsaG1hYy1zaGExLHVtYWMtNjRAb3BlbnNzaC5jb20sCi0gICAgICAgICAgICAgICAgICAgaG1hYy1yaXBlbWQxNjAsaG1hYy1zaGExLTk2LGhtYWMtbWQ1LTk2LAotICAgICAgICAgICAgICAgICAgIGhtYWMtc2hhMi0yNTYsaG1hYy1zaGEyNTYtOTYsaG1hYy1zaGEyLTUxMiwKLSAgICAgICAgICAgICAgICAgICBobWFjLXNoYTItNTEyLTk2Ci0KLSAgICAgTWF0Y2ggICBJbnRyb2R1Y2VzIGEgY29uZGl0aW9uYWwgYmxvY2suICBJZiBhbGwgb2YgdGhlIGNyaXRlcmlhIG9uIHRoZQotICAgICAgICAgICAgIE1hdGNoIGxpbmUgYXJlIHNhdGlzZmllZCwgdGhlIGtleXdvcmRzIG9uIHRoZSBmb2xsb3dpbmcgbGluZXMKLSAgICAgICAgICAgICBvdmVycmlkZSB0aG9zZSBzZXQgaW4gdGhlIGdsb2JhbCBzZWN0aW9uIG9mIHRoZSBjb25maWcgZmlsZSwKLSAgICAgICAgICAgICB1bnRpbCBlaXRoZXIgYW5vdGhlciBNYXRjaCBsaW5lIG9yIHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0KLSAgICAgICAgICAgICBUaGUgYXJndW1lbnRzIHRvIE1hdGNoIGFyZSBvbmUgb3IgbW9yZSBjcml0ZXJpYS1wYXR0ZXJuIHBhaXJzLgotICAgICAgICAgICAgIFRoZSBhdmFpbGFibGUgY3JpdGVyaWEgYXJlIFVzZXIsIEdyb3VwLCBIb3N0LCBhbmQgQWRkcmVzcy4gIFRoZQotICAgICAgICAgICAgIG1hdGNoIHBhdHRlcm5zIG1heSBjb25zaXN0IG9mIHNpbmdsZSBlbnRyaWVzIG9yIGNvbW1hLXNlcGFyYXRlZAotICAgICAgICAgICAgIGxpc3RzIGFuZCBtYXkgdXNlIHRoZSB3aWxkY2FyZCBhbmQgbmVnYXRpb24gb3BlcmF0b3JzIGRlc2NyaWJlZAotICAgICAgICAgICAgIGluIHRoZSBQQVRURVJOUyBzZWN0aW9uIG9mIHNzaF9jb25maWcoNSkuCi0KLSAgICAgICAgICAgICBUaGUgcGF0dGVybnMgaW4gYW4gQWRkcmVzcyBjcml0ZXJpYSBtYXkgYWRkaXRpb25hbGx5IGNvbnRhaW4KLSAgICAgICAgICAgICBhZGRyZXNzZXMgdG8gbWF0Y2ggaW4gQ0lEUiBhZGRyZXNzL21hc2tsZW4gZm9ybWF0LCBlLmcuCi0gICAgICAgICAgICAgYGAxOTIuMC4yLjAvMjQnJyBvciBgYDNmZmU6ZmZmZjo6LzMyJycuICBOb3RlIHRoYXQgdGhlIG1hc2sKLSAgICAgICAgICAgICBsZW5ndGggcHJvdmlkZWQgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGFkZHJlc3MgLSBpdCBpcyBhbgotICAgICAgICAgICAgIGVycm9yIHRvIHNwZWNpZnkgYSBtYXNrIGxlbmd0aCB0aGF0IGlzIHRvbyBsb25nIGZvciB0aGUgYWRkcmVzcwotICAgICAgICAgICAgIG9yIG9uZSB3aXRoIGJpdHMgc2V0IGluIHRoaXMgaG9zdCBwb3J0aW9uIG9mIHRoZSBhZGRyZXNzLiAgRm9yCi0gICAgICAgICAgICAgZXhhbXBsZSwgYGAxOTIuMC4yLjAvMzMnJyBhbmQgYGAxOTIuMC4yLjAvOCcnIHJlc3BlY3RpdmVseS4KLQotICAgICAgICAgICAgIE9ubHkgYSBzdWJzZXQgb2Yga2V5d29yZHMgbWF5IGJlIHVzZWQgb24gdGhlIGxpbmVzIGZvbGxvd2luZyBhCi0gICAgICAgICAgICAgTWF0Y2gga2V5d29yZC4gIEF2YWlsYWJsZSBrZXl3b3JkcyBhcmUgQWxsb3dBZ2VudEZvcndhcmRpbmcsCi0gICAgICAgICAgICAgQWxsb3dUY3BGb3J3YXJkaW5nLCBBdXRob3JpemVkS2V5c0ZpbGUsIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSwKLSAgICAgICAgICAgICBCYW5uZXIsIENocm9vdERpcmVjdG9yeSwgRm9yY2VDb21tYW5kLCBHYXRld2F5UG9ydHMsCi0gICAgICAgICAgICAgR1NTQVBJQXV0aGVudGljYXRpb24sIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uLAotICAgICAgICAgICAgIEhvc3RiYXNlZFVzZXNOYW1lRnJvbVBhY2tldE9ubHksIEtiZEludGVyYWN0aXZlQXV0aGVudGljYXRpb24sCi0gICAgICAgICAgICAgS2VyYmVyb3NBdXRoZW50aWNhdGlvbiwgTWF4QXV0aFRyaWVzLCBNYXhTZXNzaW9ucywKLSAgICAgICAgICAgICBQYXNzd29yZEF1dGhlbnRpY2F0aW9uLCBQZXJtaXRFbXB0eVBhc3N3b3JkcywgUGVybWl0T3BlbiwKLSAgICAgICAgICAgICBQZXJtaXRSb290TG9naW4sIFBlcm1pdFR1bm5lbCwgUHVia2V5QXV0aGVudGljYXRpb24sCi0gICAgICAgICAgICAgUmhvc3RzUlNBQXV0aGVudGljYXRpb24sIFJTQUF1dGhlbnRpY2F0aW9uLCBYMTFEaXNwbGF5T2Zmc2V0LAotICAgICAgICAgICAgIFgxMUZvcndhcmRpbmcgYW5kIFgxMVVzZUxvY2FsSG9zdC4KLQotICAgICBNYXhBdXRoVHJpZXMKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHBlcm1pdHRlZAotICAgICAgICAgICAgIHBlciBjb25uZWN0aW9uLiAgT25jZSB0aGUgbnVtYmVyIG9mIGZhaWx1cmVzIHJlYWNoZXMgaGFsZiB0aGlzCi0gICAgICAgICAgICAgdmFsdWUsIGFkZGl0aW9uYWwgZmFpbHVyZXMgYXJlIGxvZ2dlZC4gIFRoZSBkZWZhdWx0IGlzIDYuCi0KLSAgICAgTWF4U2Vzc2lvbnMKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG9wZW4gc2Vzc2lvbnMgcGVybWl0dGVkIHBlcgotICAgICAgICAgICAgIG5ldHdvcmsgY29ubmVjdGlvbi4gIFRoZSBkZWZhdWx0IGlzIDEwLgotCi0gICAgIE1heFN0YXJ0dXBzCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IHVuYXV0aGVudGljYXRlZAotICAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIHRoZSBTU0ggZGFlbW9uLiAgQWRkaXRpb25hbCBjb25uZWN0aW9ucyB3aWxsIGJlCi0gICAgICAgICAgICAgZHJvcHBlZCB1bnRpbCBhdXRoZW50aWNhdGlvbiBzdWNjZWVkcyBvciB0aGUgTG9naW5HcmFjZVRpbWUKLSAgICAgICAgICAgICBleHBpcmVzIGZvciBhIGNvbm5lY3Rpb24uICBUaGUgZGVmYXVsdCBpcyAxMC4KLQotICAgICAgICAgICAgIEFsdGVybmF0aXZlbHksIHJhbmRvbSBlYXJseSBkcm9wIGNhbiBiZSBlbmFibGVkIGJ5IHNwZWNpZnlpbmcgdGhlCi0gICAgICAgICAgICAgdGhyZWUgY29sb24gc2VwYXJhdGVkIHZhbHVlcyBgYHN0YXJ0OnJhdGU6ZnVsbCcnIChlLmcuCi0gICAgICAgICAgICAgIjEwOjMwOjYwIikuICBzc2hkKDgpIHdpbGwgcmVmdXNlIGNvbm5lY3Rpb24gYXR0ZW1wdHMgd2l0aCBhCi0gICAgICAgICAgICAgcHJvYmFiaWxpdHkgb2YgYGByYXRlLzEwMCcnICgzMCUpIGlmIHRoZXJlIGFyZSBjdXJyZW50bHkKLSAgICAgICAgICAgICBgYHN0YXJ0JycgKDEwKSB1bmF1dGhlbnRpY2F0ZWQgY29ubmVjdGlvbnMuICBUaGUgcHJvYmFiaWxpdHkKLSAgICAgICAgICAgICBpbmNyZWFzZXMgbGluZWFybHkgYW5kIGFsbCBjb25uZWN0aW9uIGF0dGVtcHRzIGFyZSByZWZ1c2VkIGlmIHRoZQotICAgICAgICAgICAgIG51bWJlciBvZiB1bmF1dGhlbnRpY2F0ZWQgY29ubmVjdGlvbnMgcmVhY2hlcyBgYGZ1bGwnJyAoNjApLgotCi0gICAgIFBhc3N3b3JkQXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBpcyBhbGxvd2VkLiAgVGhlCi0gICAgICAgICAgICAgZGVmYXVsdCBpcyBgYHllcycnLgotCi0gICAgIFBlcm1pdEVtcHR5UGFzc3dvcmRzCi0gICAgICAgICAgICAgV2hlbiBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBpcyBhbGxvd2VkLCBpdCBzcGVjaWZpZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICBzZXJ2ZXIgYWxsb3dzIGxvZ2luIHRvIGFjY291bnRzIHdpdGggZW1wdHkgcGFzc3dvcmQgc3RyaW5ncy4gIFRoZQotICAgICAgICAgICAgIGRlZmF1bHQgaXMgYGBubycnLgotCi0gICAgIFBlcm1pdE9wZW4KLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGRlc3RpbmF0aW9ucyB0byB3aGljaCBUQ1AgcG9ydCBmb3J3YXJkaW5nIGlzCi0gICAgICAgICAgICAgcGVybWl0dGVkLiAgVGhlIGZvcndhcmRpbmcgc3BlY2lmaWNhdGlvbiBtdXN0IGJlIG9uZSBvZiB0aGUKLSAgICAgICAgICAgICBmb2xsb3dpbmcgZm9ybXM6Ci0KLSAgICAgICAgICAgICAgICAgICBQZXJtaXRPcGVuIGhvc3Q6cG9ydAotICAgICAgICAgICAgICAgICAgIFBlcm1pdE9wZW4gSVB2NF9hZGRyOnBvcnQKLSAgICAgICAgICAgICAgICAgICBQZXJtaXRPcGVuIFtJUHY2X2FkZHJdOnBvcnQKLQotICAgICAgICAgICAgIE11bHRpcGxlIGZvcndhcmRzIG1heSBiZSBzcGVjaWZpZWQgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGgKLSAgICAgICAgICAgICB3aGl0ZXNwYWNlLiAgQW4gYXJndW1lbnQgb2YgYGBhbnknJyBjYW4gYmUgdXNlZCB0byByZW1vdmUgYWxsCi0gICAgICAgICAgICAgcmVzdHJpY3Rpb25zIGFuZCBwZXJtaXQgYW55IGZvcndhcmRpbmcgcmVxdWVzdHMuICBCeSBkZWZhdWx0IGFsbAotICAgICAgICAgICAgIHBvcnQgZm9yd2FyZGluZyByZXF1ZXN0cyBhcmUgcGVybWl0dGVkLgotCi0gICAgIFBlcm1pdFJvb3RMb2dpbgotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHJvb3QgY2FuIGxvZyBpbiB1c2luZyBzc2goMSkuICBUaGUgYXJndW1lbnQKLSAgICAgICAgICAgICBtdXN0IGJlIGBgeWVzJycsIGBgd2l0aG91dC1wYXNzd29yZCcnLCBgYGZvcmNlZC1jb21tYW5kcy1vbmx5JycsCi0gICAgICAgICAgICAgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQgaXMgYGB5ZXMnJy4KLQotICAgICAgICAgICAgIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgYHdpdGhvdXQtcGFzc3dvcmQnJywgcGFzc3dvcmQKLSAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbiBpcyBkaXNhYmxlZCBmb3Igcm9vdC4KLQotICAgICAgICAgICAgIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgYGZvcmNlZC1jb21tYW5kcy1vbmx5JycsIHJvb3QgbG9naW4KLSAgICAgICAgICAgICB3aXRoIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24gd2lsbCBiZSBhbGxvd2VkLCBidXQgb25seSBpZiB0aGUKLSAgICAgICAgICAgICBjb21tYW5kIG9wdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQgKHdoaWNoIG1heSBiZSB1c2VmdWwgZm9yIHRha2luZwotICAgICAgICAgICAgIHJlbW90ZSBiYWNrdXBzIGV2ZW4gaWYgcm9vdCBsb2dpbiBpcyBub3JtYWxseSBub3QgYWxsb3dlZCkuICBBbGwKLSAgICAgICAgICAgICBvdGhlciBhdXRoZW50aWNhdGlvbiBtZXRob2RzIGFyZSBkaXNhYmxlZCBmb3Igcm9vdC4KLQotICAgICAgICAgICAgIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgYG5vJycsIHJvb3QgaXMgbm90IGFsbG93ZWQgdG8gbG9nIGluLgotCi0gICAgIFBlcm1pdFR1bm5lbAotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHR1big0KSBkZXZpY2UgZm9yd2FyZGluZyBpcyBhbGxvd2VkLiAgVGhlCi0gICAgICAgICAgICAgYXJndW1lbnQgbXVzdCBiZSBgYHllcycnLCBgYHBvaW50LXRvLXBvaW50JycgKGxheWVyIDMpLAotICAgICAgICAgICAgIGBgZXRoZXJuZXQnJyAobGF5ZXIgMiksIG9yIGBgbm8nJy4gIFNwZWNpZnlpbmcgYGB5ZXMnJyBwZXJtaXRzCi0gICAgICAgICAgICAgYm90aCBgYHBvaW50LXRvLXBvaW50JycgYW5kIGBgZXRoZXJuZXQnJy4gIFRoZSBkZWZhdWx0IGlzIGBgbm8nJy4KLQotICAgICBQZXJtaXRVc2VyRW52aXJvbm1lbnQKLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB+Ly5zc2gvZW52aXJvbm1lbnQgYW5kIGVudmlyb25tZW50PSBvcHRpb25zIGluCi0gICAgICAgICAgICAgfi8uc3NoL2F1dGhvcml6ZWRfa2V5cyBhcmUgcHJvY2Vzc2VkIGJ5IHNzaGQoOCkuICBUaGUgZGVmYXVsdCBpcwotICAgICAgICAgICAgIGBgbm8nJy4gIEVuYWJsaW5nIGVudmlyb25tZW50IHByb2Nlc3NpbmcgbWF5IGVuYWJsZSB1c2VycyB0bwotICAgICAgICAgICAgIGJ5cGFzcyBhY2Nlc3MgcmVzdHJpY3Rpb25zIGluIHNvbWUgY29uZmlndXJhdGlvbnMgdXNpbmcKLSAgICAgICAgICAgICBtZWNoYW5pc21zIHN1Y2ggYXMgTERfUFJFTE9BRC4KLQotICAgICBQaWRGaWxlCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIFNTSAotICAgICAgICAgICAgIGRhZW1vbi4gIFRoZSBkZWZhdWx0IGlzIC92YXIvcnVuL3NzaGQucGlkLgotCi0gICAgIFBvcnQgICAgU3BlY2lmaWVzIHRoZSBwb3J0IG51bWJlciB0aGF0IHNzaGQoOCkgbGlzdGVucyBvbi4gIFRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgaXMgMjIuICBNdWx0aXBsZSBvcHRpb25zIG9mIHRoaXMgdHlwZSBhcmUgcGVybWl0dGVkLiAgU2VlIGFsc28KLSAgICAgICAgICAgICBMaXN0ZW5BZGRyZXNzLgotCi0gICAgIFByaW50TGFzdExvZwotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHNzaGQoOCkgc2hvdWxkIHByaW50IHRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZQotICAgICAgICAgICAgIGxhc3QgdXNlciBsb2dpbiB3aGVuIGEgdXNlciBsb2dzIGluIGludGVyYWN0aXZlbHkuICBUaGUgZGVmYXVsdAotICAgICAgICAgICAgIGlzIGBgeWVzJycuCi0KLSAgICAgUHJpbnRNb3RkCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc3NoZCg4KSBzaG91bGQgcHJpbnQgL2V0Yy9tb3RkIHdoZW4gYSB1c2VyIGxvZ3MKLSAgICAgICAgICAgICBpbiBpbnRlcmFjdGl2ZWx5LiAgKE9uIHNvbWUgc3lzdGVtcyBpdCBpcyBhbHNvIHByaW50ZWQgYnkgdGhlCi0gICAgICAgICAgICAgc2hlbGwsIC9ldGMvcHJvZmlsZSwgb3IgZXF1aXZhbGVudC4pICBUaGUgZGVmYXVsdCBpcyBgYHllcycnLgotCi0gICAgIFByb3RvY29sCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwcm90b2NvbCB2ZXJzaW9ucyBzc2hkKDgpIHN1cHBvcnRzLiAgVGhlIHBvc3NpYmxlCi0gICAgICAgICAgICAgdmFsdWVzIGFyZSBgMScgYW5kIGAyJy4gIE11bHRpcGxlIHZlcnNpb25zIG11c3QgYmUgY29tbWEtCi0gICAgICAgICAgICAgc2VwYXJhdGVkLiAgVGhlIGRlZmF1bHQgaXMgYDInLiAgTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUKLSAgICAgICAgICAgICBwcm90b2NvbCBsaXN0IGRvZXMgbm90IGluZGljYXRlIHByZWZlcmVuY2UsIGJlY2F1c2UgdGhlIGNsaWVudAotICAgICAgICAgICAgIHNlbGVjdHMgYW1vbmcgbXVsdGlwbGUgcHJvdG9jb2wgdmVyc2lvbnMgb2ZmZXJlZCBieSB0aGUgc2VydmVyLgotICAgICAgICAgICAgIFNwZWNpZnlpbmcgYGAyLDEnJyBpcyBpZGVudGljYWwgdG8gYGAxLDInJy4KLQotICAgICBQdWJrZXlBdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZC4gIFRoZQotICAgICAgICAgICAgIGRlZmF1bHQgaXMgYGB5ZXMnJy4gIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sCi0gICAgICAgICAgICAgdmVyc2lvbiAyIG9ubHkuCi0KLSAgICAgUmV2b2tlZEtleXMKLSAgICAgICAgICAgICBTcGVjaWZpZXMgYSBsaXN0IG9mIHJldm9rZWQgcHVibGljIGtleXMuICBLZXlzIGxpc3RlZCBpbiB0aGlzCi0gICAgICAgICAgICAgZmlsZSB3aWxsIGJlIHJlZnVzZWQgZm9yIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24uICBOb3RlIHRoYXQgaWYKLSAgICAgICAgICAgICB0aGlzIGZpbGUgaXMgbm90IHJlYWRhYmxlLCB0aGVuIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24gd2lsbCBiZQotICAgICAgICAgICAgIHJlZnVzZWQgZm9yIGFsbCB1c2Vycy4KLQotICAgICBSaG9zdHNSU0FBdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHJob3N0cyBvciAvZXRjL2hvc3RzLmVxdWl2IGF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgdG9nZXRoZXIgd2l0aCBzdWNjZXNzZnVsIFJTQSBob3N0IGF1dGhlbnRpY2F0aW9uIGlzIGFsbG93ZWQuICBUaGUKLSAgICAgICAgICAgICBkZWZhdWx0IGlzIGBgbm8nJy4gIFRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAxCi0gICAgICAgICAgICAgb25seS4KLQotICAgICBSU0FBdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHB1cmUgUlNBIGF1dGhlbnRpY2F0aW9uIGlzIGFsbG93ZWQuICBUaGUKLSAgICAgICAgICAgICBkZWZhdWx0IGlzIGBgeWVzJycuICBUaGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMQotICAgICAgICAgICAgIG9ubHkuCi0KLSAgICAgU2VydmVyS2V5Qml0cwotICAgICAgICAgICAgIERlZmluZXMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBlcGhlbWVyYWwgcHJvdG9jb2wgdmVyc2lvbiAxCi0gICAgICAgICAgICAgc2VydmVyIGtleS4gIFRoZSBtaW5pbXVtIHZhbHVlIGlzIDUxMiwgYW5kIHRoZSBkZWZhdWx0IGlzIDEwMjQuCi0KLSAgICAgU3RyaWN0TW9kZXMKLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzc2hkKDgpIHNob3VsZCBjaGVjayBmaWxlIG1vZGVzIGFuZCBvd25lcnNoaXAKLSAgICAgICAgICAgICBvZiB0aGUgdXNlcidzIGZpbGVzIGFuZCBob21lIGRpcmVjdG9yeSBiZWZvcmUgYWNjZXB0aW5nIGxvZ2luLgotICAgICAgICAgICAgIFRoaXMgaXMgbm9ybWFsbHkgZGVzaXJhYmxlIGJlY2F1c2Ugbm92aWNlcyBzb21ldGltZXMgYWNjaWRlbnRhbGx5Ci0gICAgICAgICAgICAgbGVhdmUgdGhlaXIgZGlyZWN0b3J5IG9yIGZpbGVzIHdvcmxkLXdyaXRhYmxlLiAgVGhlIGRlZmF1bHQgaXMKLSAgICAgICAgICAgICBgYHllcycnLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYXBwbHkgdG8gQ2hyb290RGlyZWN0b3J5LCB3aG9zZQotICAgICAgICAgICAgIHBlcm1pc3Npb25zIGFuZCBvd25lcnNoaXAgYXJlIGNoZWNrZWQgdW5jb25kaXRpb25hbGx5LgotCi0gICAgIFN1YnN5c3RlbQotICAgICAgICAgICAgIENvbmZpZ3VyZXMgYW4gZXh0ZXJuYWwgc3Vic3lzdGVtIChlLmcuIGZpbGUgdHJhbnNmZXIgZGFlbW9uKS4KLSAgICAgICAgICAgICBBcmd1bWVudHMgc2hvdWxkIGJlIGEgc3Vic3lzdGVtIG5hbWUgYW5kIGEgY29tbWFuZCAod2l0aCBvcHRpb25hbAotICAgICAgICAgICAgIGFyZ3VtZW50cykgdG8gZXhlY3V0ZSB1cG9uIHN1YnN5c3RlbSByZXF1ZXN0LgotCi0gICAgICAgICAgICAgVGhlIGNvbW1hbmQgc2Z0cC1zZXJ2ZXIoOCkgaW1wbGVtZW50cyB0aGUgYGBzZnRwJycgZmlsZSB0cmFuc2ZlcgotICAgICAgICAgICAgIHN1YnN5c3RlbS4KLQotICAgICAgICAgICAgIEFsdGVybmF0ZWx5IHRoZSBuYW1lIGBgaW50ZXJuYWwtc2Z0cCcnIGltcGxlbWVudHMgYW4gaW4tcHJvY2VzcwotICAgICAgICAgICAgIGBgc2Z0cCcnIHNlcnZlci4gIFRoaXMgbWF5IHNpbXBsaWZ5IGNvbmZpZ3VyYXRpb25zIHVzaW5nCi0gICAgICAgICAgICAgQ2hyb290RGlyZWN0b3J5IHRvIGZvcmNlIGEgZGlmZmVyZW50IGZpbGVzeXN0ZW0gcm9vdCBvbiBjbGllbnRzLgotCi0gICAgICAgICAgICAgQnkgZGVmYXVsdCBubyBzdWJzeXN0ZW1zIGFyZSBkZWZpbmVkLiAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uCi0gICAgICAgICAgICAgYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KLQotICAgICBTeXNsb2dGYWNpbGl0eQotICAgICAgICAgICAgIEdpdmVzIHRoZSBmYWNpbGl0eSBjb2RlIHRoYXQgaXMgdXNlZCB3aGVuIGxvZ2dpbmcgbWVzc2FnZXMgZnJvbQotICAgICAgICAgICAgIHNzaGQoOCkuICBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTogREFFTU9OLCBVU0VSLCBBVVRILCBMT0NBTDAsCi0gICAgICAgICAgICAgTE9DQUwxLCBMT0NBTDIsIExPQ0FMMywgTE9DQUw0LCBMT0NBTDUsIExPQ0FMNiwgTE9DQUw3LiAgVGhlCi0gICAgICAgICAgICAgZGVmYXVsdCBpcyBBVVRILgotCi0gICAgIFRDUEtlZXBBbGl2ZQotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBzeXN0ZW0gc2hvdWxkIHNlbmQgVENQIGtlZXBhbGl2ZSBtZXNzYWdlcwotICAgICAgICAgICAgIHRvIHRoZSBvdGhlciBzaWRlLiAgSWYgdGhleSBhcmUgc2VudCwgZGVhdGggb2YgdGhlIGNvbm5lY3Rpb24gb3IKLSAgICAgICAgICAgICBjcmFzaCBvZiBvbmUgb2YgdGhlIG1hY2hpbmVzIHdpbGwgYmUgcHJvcGVybHkgbm90aWNlZC4gIEhvd2V2ZXIsCi0gICAgICAgICAgICAgdGhpcyBtZWFucyB0aGF0IGNvbm5lY3Rpb25zIHdpbGwgZGllIGlmIHRoZSByb3V0ZSBpcyBkb3duCi0gICAgICAgICAgICAgdGVtcG9yYXJpbHksIGFuZCBzb21lIHBlb3BsZSBmaW5kIGl0IGFubm95aW5nLiAgT24gdGhlIG90aGVyCi0gICAgICAgICAgICAgaGFuZCwgaWYgVENQIGtlZXBhbGl2ZXMgYXJlIG5vdCBzZW50LCBzZXNzaW9ucyBtYXkgaGFuZwotICAgICAgICAgICAgIGluZGVmaW5pdGVseSBvbiB0aGUgc2VydmVyLCBsZWF2aW5nIGBgZ2hvc3QnJyB1c2VycyBhbmQgY29uc3VtaW5nCi0gICAgICAgICAgICAgc2VydmVyIHJlc291cmNlcy4KLQotICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGBgeWVzJycgKHRvIHNlbmQgVENQIGtlZXBhbGl2ZSBtZXNzYWdlcyksIGFuZCB0aGUKLSAgICAgICAgICAgICBzZXJ2ZXIgd2lsbCBub3RpY2UgaWYgdGhlIG5ldHdvcmsgZ29lcyBkb3duIG9yIHRoZSBjbGllbnQgaG9zdAotICAgICAgICAgICAgIGNyYXNoZXMuICBUaGlzIGF2b2lkcyBpbmZpbml0ZWx5IGhhbmdpbmcgc2Vzc2lvbnMuCi0KLSAgICAgICAgICAgICBUbyBkaXNhYmxlIFRDUCBrZWVwYWxpdmUgbWVzc2FnZXMsIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvCi0gICAgICAgICAgICAgYGBubycnLgotCi0gICAgIFRydXN0ZWRVc2VyQ0FLZXlzCi0gICAgICAgICAgICAgU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIHB1YmxpYyBrZXlzIG9mIGNlcnRpZmljYXRlCi0gICAgICAgICAgICAgYXV0aG9yaXRpZXMgdGhhdCBhcmUgdHJ1c3RlZCB0byBzaWduIHVzZXIgY2VydGlmaWNhdGVzIGZvcgotICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLiAgS2V5cyBhcmUgbGlzdGVkIG9uZSBwZXIgbGluZTsgZW1wdHkgbGluZXMgYW5kCi0gICAgICAgICAgICAgY29tbWVudHMgc3RhcnRpbmcgd2l0aCBgIycgYXJlIGFsbG93ZWQuICBJZiBhIGNlcnRpZmljYXRlIGlzCi0gICAgICAgICAgICAgcHJlc2VudGVkIGZvciBhdXRoZW50aWNhdGlvbiBhbmQgaGFzIGl0cyBzaWduaW5nIENBIGtleSBsaXN0ZWQgaW4KLSAgICAgICAgICAgICB0aGlzIGZpbGUsIHRoZW4gaXQgbWF5IGJlIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIGZvciBhbnkgdXNlcgotICAgICAgICAgICAgIGxpc3RlZCBpbiB0aGUgY2VydGlmaWNhdGUncyBwcmluY2lwYWxzIGxpc3QuICBOb3RlIHRoYXQKLSAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXMgdGhhdCBsYWNrIGEgbGlzdCBvZiBwcmluY2lwYWxzIHdpbGwgbm90IGJlIHBlcm1pdHRlZAotICAgICAgICAgICAgIGZvciBhdXRoZW50aWNhdGlvbiB1c2luZyBUcnVzdGVkVXNlckNBS2V5cy4gIEZvciBtb3JlIGRldGFpbHMgb24KLSAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXMsIHNlZSB0aGUgQ0VSVElGSUNBVEVTIHNlY3Rpb24gaW4gc3NoLWtleWdlbigxKS4KLQotICAgICBVc2VETlMgIFNwZWNpZmllcyB3aGV0aGVyIHNzaGQoOCkgc2hvdWxkIGxvb2sgdXAgdGhlIHJlbW90ZSBob3N0IG5hbWUgYW5kCi0gICAgICAgICAgICAgY2hlY2sgdGhhdCB0aGUgcmVzb2x2ZWQgaG9zdCBuYW1lIGZvciB0aGUgcmVtb3RlIElQIGFkZHJlc3MgbWFwcwotICAgICAgICAgICAgIGJhY2sgdG8gdGhlIHZlcnkgc2FtZSBJUCBhZGRyZXNzLiAgVGhlIGRlZmF1bHQgaXMgYGB5ZXMnJy4KLQotICAgICBVc2VMb2dpbgotICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIGxvZ2luKDEpIGlzIHVzZWQgZm9yIGludGVyYWN0aXZlIGxvZ2luCi0gICAgICAgICAgICAgc2Vzc2lvbnMuICBUaGUgZGVmYXVsdCBpcyBgYG5vJycuICBOb3RlIHRoYXQgbG9naW4oMSkgaXMgbmV2ZXIKLSAgICAgICAgICAgICB1c2VkIGZvciByZW1vdGUgY29tbWFuZCBleGVjdXRpb24uICBOb3RlIGFsc28sIHRoYXQgaWYgdGhpcyBpcwotICAgICAgICAgICAgIGVuYWJsZWQsIFgxMUZvcndhcmRpbmcgd2lsbCBiZSBkaXNhYmxlZCBiZWNhdXNlIGxvZ2luKDEpIGRvZXMgbm90Ci0gICAgICAgICAgICAga25vdyBob3cgdG8gaGFuZGxlIHhhdXRoKDEpIGNvb2tpZXMuICBJZiBVc2VQcml2aWxlZ2VTZXBhcmF0aW9uCi0gICAgICAgICAgICAgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIGRpc2FibGVkIGFmdGVyIGF1dGhlbnRpY2F0aW9uLgotCi0gICAgIFVzZVBBTSAgRW5hYmxlcyB0aGUgUGx1Z2dhYmxlIEF1dGhlbnRpY2F0aW9uIE1vZHVsZSBpbnRlcmZhY2UuICBJZiBzZXQgdG8KLSAgICAgICAgICAgICBgYHllcycnIHRoaXMgd2lsbCBlbmFibGUgUEFNIGF1dGhlbnRpY2F0aW9uIHVzaW5nCi0gICAgICAgICAgICAgQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiBhbmQgUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBpbgotICAgICAgICAgICAgIGFkZGl0aW9uIHRvIFBBTSBhY2NvdW50IGFuZCBzZXNzaW9uIG1vZHVsZSBwcm9jZXNzaW5nIGZvciBhbGwKLSAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbiB0eXBlcy4KLQotICAgICAgICAgICAgIEJlY2F1c2UgUEFNIGNoYWxsZW5nZS1yZXNwb25zZSBhdXRoZW50aWNhdGlvbiB1c3VhbGx5IHNlcnZlcyBhbgotICAgICAgICAgICAgIGVxdWl2YWxlbnQgcm9sZSB0byBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiwgeW91IHNob3VsZCBkaXNhYmxlCi0gICAgICAgICAgICAgZWl0aGVyIFBhc3N3b3JkQXV0aGVudGljYXRpb24gb3IgQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbi4KLQotICAgICAgICAgICAgIElmIFVzZVBBTSBpcyBlbmFibGVkLCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBydW4gc3NoZCg4KSBhcyBhCi0gICAgICAgICAgICAgbm9uLXJvb3QgdXNlci4gIFRoZSBkZWZhdWx0IGlzIGBgbm8nJy4KLQotICAgICBVc2VQcml2aWxlZ2VTZXBhcmF0aW9uCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc3NoZCg4KSBzZXBhcmF0ZXMgcHJpdmlsZWdlcyBieSBjcmVhdGluZyBhbgotICAgICAgICAgICAgIHVucHJpdmlsZWdlZCBjaGlsZCBwcm9jZXNzIHRvIGRlYWwgd2l0aCBpbmNvbWluZyBuZXR3b3JrIHRyYWZmaWMuCi0gICAgICAgICAgICAgQWZ0ZXIgc3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbiwgYW5vdGhlciBwcm9jZXNzIHdpbGwgYmUgY3JlYXRlZAotICAgICAgICAgICAgIHRoYXQgaGFzIHRoZSBwcml2aWxlZ2Ugb2YgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlci4gIFRoZSBnb2FsIG9mCi0gICAgICAgICAgICAgcHJpdmlsZWdlIHNlcGFyYXRpb24gaXMgdG8gcHJldmVudCBwcml2aWxlZ2UgZXNjYWxhdGlvbiBieQotICAgICAgICAgICAgIGNvbnRhaW5pbmcgYW55IGNvcnJ1cHRpb24gd2l0aGluIHRoZSB1bnByaXZpbGVnZWQgcHJvY2Vzc2VzLiAgVGhlCi0gICAgICAgICAgICAgZGVmYXVsdCBpcyBgYHllcycnLiAgSWYgVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiBpcyBzZXQgdG8KLSAgICAgICAgICAgICBgYHNhbmRib3gnJyB0aGVuIHRoZSBwcmUtYXV0aGVudGljYXRpb24gdW5wcml2aWxlZ2VkIHByb2Nlc3MgaXMKLSAgICAgICAgICAgICBzdWJqZWN0IHRvIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zLgotCi0gICAgIFgxMURpc3BsYXlPZmZzZXQKLSAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGZpcnN0IGRpc3BsYXkgbnVtYmVyIGF2YWlsYWJsZSBmb3Igc3NoZCg4KSdzIFgxMQotICAgICAgICAgICAgIGZvcndhcmRpbmcuICBUaGlzIHByZXZlbnRzIHNzaGQgZnJvbSBpbnRlcmZlcmluZyB3aXRoIHJlYWwgWDExCi0gICAgICAgICAgICAgc2VydmVycy4gIFRoZSBkZWZhdWx0IGlzIDEwLgotCi0gICAgIFgxMUZvcndhcmRpbmcKLSAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBYMTEgZm9yd2FyZGluZyBpcyBwZXJtaXR0ZWQuICBUaGUgYXJndW1lbnQgbXVzdAotICAgICAgICAgICAgIGJlIGBgeWVzJycgb3IgYGBubycnLiAgVGhlIGRlZmF1bHQgaXMgYGBubycnLgotCi0gICAgICAgICAgICAgV2hlbiBYMTEgZm9yd2FyZGluZyBpcyBlbmFibGVkLCB0aGVyZSBtYXkgYmUgYWRkaXRpb25hbCBleHBvc3VyZQotICAgICAgICAgICAgIHRvIHRoZSBzZXJ2ZXIgYW5kIHRvIGNsaWVudCBkaXNwbGF5cyBpZiB0aGUgc3NoZCg4KSBwcm94eSBkaXNwbGF5Ci0gICAgICAgICAgICAgaXMgY29uZmlndXJlZCB0byBsaXN0ZW4gb24gdGhlIHdpbGRjYXJkIGFkZHJlc3MgKHNlZQotICAgICAgICAgICAgIFgxMVVzZUxvY2FsaG9zdCBiZWxvdyksIHRob3VnaCB0aGlzIGlzIG5vdCB0aGUgZGVmYXVsdC4KLSAgICAgICAgICAgICBBZGRpdGlvbmFsbHksIHRoZSBhdXRoZW50aWNhdGlvbiBzcG9vZmluZyBhbmQgYXV0aGVudGljYXRpb24gZGF0YQotICAgICAgICAgICAgIHZlcmlmaWNhdGlvbiBhbmQgc3Vic3RpdHV0aW9uIG9jY3VyIG9uIHRoZSBjbGllbnQgc2lkZS4gIFRoZQotICAgICAgICAgICAgIHNlY3VyaXR5IHJpc2sgb2YgdXNpbmcgWDExIGZvcndhcmRpbmcgaXMgdGhhdCB0aGUgY2xpZW50J3MgWDExCi0gICAgICAgICAgICAgZGlzcGxheSBzZXJ2ZXIgbWF5IGJlIGV4cG9zZWQgdG8gYXR0YWNrIHdoZW4gdGhlIFNTSCBjbGllbnQKLSAgICAgICAgICAgICByZXF1ZXN0cyBmb3J3YXJkaW5nIChzZWUgdGhlIHdhcm5pbmdzIGZvciBGb3J3YXJkWDExIGluCi0gICAgICAgICAgICAgc3NoX2NvbmZpZyg1KSkuICBBIHN5c3RlbSBhZG1pbmlzdHJhdG9yIG1heSBoYXZlIGEgc3RhbmNlIGluCi0gICAgICAgICAgICAgd2hpY2ggdGhleSB3YW50IHRvIHByb3RlY3QgY2xpZW50cyB0aGF0IG1heSBleHBvc2UgdGhlbXNlbHZlcyB0bwotICAgICAgICAgICAgIGF0dGFjayBieSB1bndpdHRpbmdseSByZXF1ZXN0aW5nIFgxMSBmb3J3YXJkaW5nLCB3aGljaCBjYW4KLSAgICAgICAgICAgICB3YXJyYW50IGEgYGBubycnIHNldHRpbmcuCi0KLSAgICAgICAgICAgICBOb3RlIHRoYXQgZGlzYWJsaW5nIFgxMSBmb3J3YXJkaW5nIGRvZXMgbm90IHByZXZlbnQgdXNlcnMgZnJvbQotICAgICAgICAgICAgIGZvcndhcmRpbmcgWDExIHRyYWZmaWMsIGFzIHVzZXJzIGNhbiBhbHdheXMgaW5zdGFsbCB0aGVpciBvd24KLSAgICAgICAgICAgICBmb3J3YXJkZXJzLiAgWDExIGZvcndhcmRpbmcgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCBpZiBVc2VMb2dpbgotICAgICAgICAgICAgIGlzIGVuYWJsZWQuCi0KLSAgICAgWDExVXNlTG9jYWxob3N0Ci0gICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc3NoZCg4KSBzaG91bGQgYmluZCB0aGUgWDExIGZvcndhcmRpbmcgc2VydmVyCi0gICAgICAgICAgICAgdG8gdGhlIGxvb3BiYWNrIGFkZHJlc3Mgb3IgdG8gdGhlIHdpbGRjYXJkIGFkZHJlc3MuICBCeSBkZWZhdWx0LAotICAgICAgICAgICAgIHNzaGQgYmluZHMgdGhlIGZvcndhcmRpbmcgc2VydmVyIHRvIHRoZSBsb29wYmFjayBhZGRyZXNzIGFuZCBzZXRzCi0gICAgICAgICAgICAgdGhlIGhvc3RuYW1lIHBhcnQgb2YgdGhlIERJU1BMQVkgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8KLSAgICAgICAgICAgICBgYGxvY2FsaG9zdCcnLiAgVGhpcyBwcmV2ZW50cyByZW1vdGUgaG9zdHMgZnJvbSBjb25uZWN0aW5nIHRvIHRoZQotICAgICAgICAgICAgIHByb3h5IGRpc3BsYXkuICBIb3dldmVyLCBzb21lIG9sZGVyIFgxMSBjbGllbnRzIG1heSBub3QgZnVuY3Rpb24KLSAgICAgICAgICAgICB3aXRoIHRoaXMgY29uZmlndXJhdGlvbi4gIFgxMVVzZUxvY2FsaG9zdCBtYXkgYmUgc2V0IHRvIGBgbm8nJyB0bwotICAgICAgICAgICAgIHNwZWNpZnkgdGhhdCB0aGUgZm9yd2FyZGluZyBzZXJ2ZXIgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZQotICAgICAgICAgICAgIHdpbGRjYXJkIGFkZHJlc3MuICBUaGUgYXJndW1lbnQgbXVzdCBiZSBgYHllcycnIG9yIGBgbm8nJy4gIFRoZQotICAgICAgICAgICAgIGRlZmF1bHQgaXMgYGB5ZXMnJy4KLQotICAgICBYQXV0aExvY2F0aW9uCi0gICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSB4YXV0aCgxKSBwcm9ncmFtLiAgVGhlIGRlZmF1bHQKLSAgICAgICAgICAgICBpcyAvdXNyL1gxMVI2L2Jpbi94YXV0aC4KLQotVElNRSBGT1JNQVRTCi0gICAgIHNzaGQoOCkgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhbmQgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbnMgdGhhdAotICAgICBzcGVjaWZ5IHRpbWUgbWF5IGJlIGV4cHJlc3NlZCB1c2luZyBhIHNlcXVlbmNlIG9mIHRoZSBmb3JtOgotICAgICB0aW1lW3F1YWxpZmllcl0sIHdoZXJlIHRpbWUgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlIGFuZCBxdWFsaWZpZXIgaXMKLSAgICAgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgICAgICAgPG5vbmU+ICBzZWNvbmRzCi0gICAgICAgICAgIHMgfCBTICAgc2Vjb25kcwotICAgICAgICAgICBtIHwgTSAgIG1pbnV0ZXMKLSAgICAgICAgICAgaCB8IEggICBob3VycwotICAgICAgICAgICBkIHwgRCAgIGRheXMKLSAgICAgICAgICAgdyB8IFcgICB3ZWVrcwotCi0gICAgIEVhY2ggbWVtYmVyIG9mIHRoZSBzZXF1ZW5jZSBpcyBhZGRlZCB0b2dldGhlciB0byBjYWxjdWxhdGUgdGhlIHRvdGFsIHRpbWUKLSAgICAgdmFsdWUuCi0KLSAgICAgVGltZSBmb3JtYXQgZXhhbXBsZXM6Ci0KLSAgICAgICAgICAgNjAwICAgICA2MDAgc2Vjb25kcyAoMTAgbWludXRlcykKLSAgICAgICAgICAgMTBtICAgICAxMCBtaW51dGVzCi0gICAgICAgICAgIDFoMzBtICAgMSBob3VyIDMwIG1pbnV0ZXMgKDkwIG1pbnV0ZXMpCi0KLUZJTEVTCi0gICAgIC9ldGMvc3NoL3NzaGRfY29uZmlnCi0gICAgICAgICAgICAgQ29udGFpbnMgY29uZmlndXJhdGlvbiBkYXRhIGZvciBzc2hkKDgpLiAgVGhpcyBmaWxlIHNob3VsZCBiZQotICAgICAgICAgICAgIHdyaXRhYmxlIGJ5IHJvb3Qgb25seSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkICh0aG91Z2ggbm90Ci0gICAgICAgICAgICAgbmVjZXNzYXJ5KSB0aGF0IGl0IGJlIHdvcmxkLXJlYWRhYmxlLgotCi1TRUUgQUxTTwotICAgICBzc2hkKDgpCi0KLUFVVEhPUlMKLSAgICAgT3BlblNTSCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGFuZCBmcmVlIHNzaCAxLjIuMTIgcmVsZWFzZSBieQotICAgICBUYXR1IFlsb25lbi4gIEFhcm9uIENhbXBiZWxsLCBCb2IgQmVjaywgTWFya3VzIEZyaWVkbCwgTmllbHMgUHJvdm9zLCBUaGVvCi0gICAgIGRlIFJhYWR0IGFuZCBEdWcgU29uZyByZW1vdmVkIG1hbnkgYnVncywgcmUtYWRkZWQgbmV3ZXIgZmVhdHVyZXMgYW5kCi0gICAgIGNyZWF0ZWQgT3BlblNTSC4gIE1hcmt1cyBGcmllZGwgY29udHJpYnV0ZWQgdGhlIHN1cHBvcnQgZm9yIFNTSCBwcm90b2NvbAotICAgICB2ZXJzaW9ucyAxLjUgYW5kIDIuMC4gIE5pZWxzIFByb3ZvcyBhbmQgTWFya3VzIEZyaWVkbCBjb250cmlidXRlZCBzdXBwb3J0Ci0gICAgIGZvciBwcml2aWxlZ2Ugc2VwYXJhdGlvbi4KLQotT3BlbkJTRCA1LjAgICAgICAgICAgICAgICAgICAgICBBdWd1c3QgMiwgMjAxMSAgICAgICAgICAgICAgICAgICAgIE9wZW5CU0QgNS4wCmRpZmYgLS1naXQgYS9zc2hkX2NvbmZpZy41IGIvc3NoZF9jb25maWcuNQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjMzc4Ny4uMDAwMDAwMAotLS0gYS9zc2hkX2NvbmZpZy41CisrKyAvZGV2L251bGwKQEAgLTEsMTIxNSArMCwwIEBACi0uXCIKLS5cIiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotLlwiIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0uXCIgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLS5cIgotLlwiIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLS5cIiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotLlwiIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLS5cIiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0uXCIgY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotLlwiCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAgTWFya3VzIEZyaWVkbC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk5IEFhcm9uIENhbXBiZWxsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlbyBkZSBSYWFkdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLS5cIiBhcmUgbWV0OgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotLlwiIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLS5cIiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotLlwiIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLS5cIiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLS5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0uXCIgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0uXCIgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLlwiIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotLlwiIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIKLS5cIiAkT3BlbkJTRDogc3NoZF9jb25maWcuNSx2IDEuMTM1IDIwMTEvMDgvMDIgMDE6MjI6MTEgZGptIEV4cCAkCi0uRGQgJE1kb2NkYXRlOiBBdWd1c3QgMiAyMDExICQKLS5EdCBTU0hEX0NPTkZJRyA1Ci0uT3MKLS5TaCBOQU1FCi0uTm0gc3NoZF9jb25maWcKLS5OZCBPcGVuU1NIIFNTSCBkYWVtb24gY29uZmlndXJhdGlvbiBmaWxlCi0uU2ggU1lOT1BTSVMKLS5ObSAvZXRjL3NzaC9zc2hkX2NvbmZpZwotLlNoIERFU0NSSVBUSU9OCi0uWHIgc3NoZCA4Ci1yZWFkcyBjb25maWd1cmF0aW9uIGRhdGEgZnJvbQotLlBhIC9ldGMvc3NoL3NzaGRfY29uZmlnCi0ob3IgdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGgKLS5GbCBmCi1vbiB0aGUgY29tbWFuZCBsaW5lKS4KLVRoZSBmaWxlIGNvbnRhaW5zIGtleXdvcmQtYXJndW1lbnQgcGFpcnMsIG9uZSBwZXIgbGluZS4KLUxpbmVzIHN0YXJ0aW5nIHdpdGgKLS5RbCAjCi1hbmQgZW1wdHkgbGluZXMgYXJlIGludGVycHJldGVkIGFzIGNvbW1lbnRzLgotQXJndW1lbnRzIG1heSBvcHRpb25hbGx5IGJlIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMKLS5QcSBcJiIKLWluIG9yZGVyIHRvIHJlcHJlc2VudCBhcmd1bWVudHMgY29udGFpbmluZyBzcGFjZXMuCi0uUHAKLVRoZSBwb3NzaWJsZQota2V5d29yZHMgYW5kIHRoZWlyIG1lYW5pbmdzIGFyZSBhcyBmb2xsb3dzIChub3RlIHRoYXQKLWtleXdvcmRzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCBhcmd1bWVudHMgYXJlIGNhc2Utc2Vuc2l0aXZlKToKLS5CbCAtdGFnIC13aWR0aCBEcwotLkl0IENtIEFjY2VwdEVudgotU3BlY2lmaWVzIHdoYXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNlbnQgYnkgdGhlIGNsaWVudCB3aWxsIGJlIGNvcGllZCBpbnRvCi10aGUgc2Vzc2lvbidzCi0uWHIgZW52aXJvbiA3IC4KLVNlZQotLkNtIFNlbmRFbnYKLWluCi0uWHIgc3NoX2NvbmZpZyA1Ci1mb3IgaG93IHRvIGNvbmZpZ3VyZSB0aGUgY2xpZW50LgotTm90ZSB0aGF0IGVudmlyb25tZW50IHBhc3NpbmcgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHByb3RvY29sIDIuCi1WYXJpYWJsZXMgYXJlIHNwZWNpZmllZCBieSBuYW1lLCB3aGljaCBtYXkgY29udGFpbiB0aGUgd2lsZGNhcmQgY2hhcmFjdGVycwotLlFsICoKLWFuZAotLlFsIFwmPyAuCi1NdWx0aXBsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIG9yIHNwcmVhZAotYWNyb3NzIG11bHRpcGxlCi0uQ20gQWNjZXB0RW52Ci1kaXJlY3RpdmVzLgotQmUgd2FybmVkIHRoYXQgc29tZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgY291bGQgYmUgdXNlZCB0byBieXBhc3MgcmVzdHJpY3RlZAotdXNlciBlbnZpcm9ubWVudHMuCi1Gb3IgdGhpcyByZWFzb24sIGNhcmUgc2hvdWxkIGJlIHRha2VuIGluIHRoZSB1c2Ugb2YgdGhpcyBkaXJlY3RpdmUuCi1UaGUgZGVmYXVsdCBpcyBub3QgdG8gYWNjZXB0IGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0uSXQgQ20gQWRkcmVzc0ZhbWlseQotU3BlY2lmaWVzIHdoaWNoIGFkZHJlc3MgZmFtaWx5IHNob3VsZCBiZSB1c2VkIGJ5Ci0uWHIgc3NoZCA4IC4KLVZhbGlkIGFyZ3VtZW50cyBhcmUKLS5EcSBhbnkgLAotLkRxIGluZXQKLSh1c2UgSVB2NCBvbmx5KSwgb3IKLS5EcSBpbmV0NgotKHVzZSBJUHY2IG9ubHkpLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBhbnkgLgotLkl0IENtIEFsbG93QWdlbnRGb3J3YXJkaW5nCi1TcGVjaWZpZXMgd2hldGhlcgotLlhyIHNzaC1hZ2VudCAxCi1mb3J3YXJkaW5nIGlzIHBlcm1pdHRlZC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgeWVzIC4KLU5vdGUgdGhhdCBkaXNhYmxpbmcgYWdlbnQgZm9yd2FyZGluZyBkb2VzIG5vdCBpbXByb3ZlIHNlY3VyaXR5Ci11bmxlc3MgdXNlcnMgYXJlIGFsc28gZGVuaWVkIHNoZWxsIGFjY2VzcywgYXMgdGhleSBjYW4gYWx3YXlzIGluc3RhbGwKLXRoZWlyIG93biBmb3J3YXJkZXJzLgotLkl0IENtIEFsbG93R3JvdXBzCi1UaGlzIGtleXdvcmQgY2FuIGJlIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBncm91cCBuYW1lIHBhdHRlcm5zLCBzZXBhcmF0ZWQKLWJ5IHNwYWNlcy4KLUlmIHNwZWNpZmllZCwgbG9naW4gaXMgYWxsb3dlZCBvbmx5IGZvciB1c2VycyB3aG9zZSBwcmltYXJ5Ci1ncm91cCBvciBzdXBwbGVtZW50YXJ5IGdyb3VwIGxpc3QgbWF0Y2hlcyBvbmUgb2YgdGhlIHBhdHRlcm5zLgotT25seSBncm91cCBuYW1lcyBhcmUgdmFsaWQ7IGEgbnVtZXJpY2FsIGdyb3VwIElEIGlzIG5vdCByZWNvZ25pemVkLgotQnkgZGVmYXVsdCwgbG9naW4gaXMgYWxsb3dlZCBmb3IgYWxsIGdyb3Vwcy4KLVRoZSBhbGxvdy9kZW55IGRpcmVjdGl2ZXMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotLkNtIERlbnlVc2VycyAsCi0uQ20gQWxsb3dVc2VycyAsCi0uQ20gRGVueUdyb3VwcyAsCi1hbmQgZmluYWxseQotLkNtIEFsbG93R3JvdXBzIC4KLS5QcAotU2VlCi0uU3ggUEFUVEVSTlMKLWluCi0uWHIgc3NoX2NvbmZpZyA1Ci1mb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXR0ZXJucy4KLS5JdCBDbSBBbGxvd1RjcEZvcndhcmRpbmcKLVNwZWNpZmllcyB3aGV0aGVyIFRDUCBmb3J3YXJkaW5nIGlzIHBlcm1pdHRlZC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgeWVzIC4KLU5vdGUgdGhhdCBkaXNhYmxpbmcgVENQIGZvcndhcmRpbmcgZG9lcyBub3QgaW1wcm92ZSBzZWN1cml0eSB1bmxlc3MKLXVzZXJzIGFyZSBhbHNvIGRlbmllZCBzaGVsbCBhY2Nlc3MsIGFzIHRoZXkgY2FuIGFsd2F5cyBpbnN0YWxsIHRoZWlyCi1vd24gZm9yd2FyZGVycy4KLS5JdCBDbSBBbGxvd1VzZXJzCi1UaGlzIGtleXdvcmQgY2FuIGJlIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiB1c2VyIG5hbWUgcGF0dGVybnMsIHNlcGFyYXRlZAotYnkgc3BhY2VzLgotSWYgc3BlY2lmaWVkLCBsb2dpbiBpcyBhbGxvd2VkIG9ubHkgZm9yIHVzZXIgbmFtZXMgdGhhdAotbWF0Y2ggb25lIG9mIHRoZSBwYXR0ZXJucy4KLU9ubHkgdXNlciBuYW1lcyBhcmUgdmFsaWQ7IGEgbnVtZXJpY2FsIHVzZXIgSUQgaXMgbm90IHJlY29nbml6ZWQuCi1CeSBkZWZhdWx0LCBsb2dpbiBpcyBhbGxvd2VkIGZvciBhbGwgdXNlcnMuCi1JZiB0aGUgcGF0dGVybiB0YWtlcyB0aGUgZm9ybSBVU0VSQEhPU1QgdGhlbiBVU0VSIGFuZCBIT1NUCi1hcmUgc2VwYXJhdGVseSBjaGVja2VkLCByZXN0cmljdGluZyBsb2dpbnMgdG8gcGFydGljdWxhcgotdXNlcnMgZnJvbSBwYXJ0aWN1bGFyIGhvc3RzLgotVGhlIGFsbG93L2RlbnkgZGlyZWN0aXZlcyBhcmUgcHJvY2Vzc2VkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0uQ20gRGVueVVzZXJzICwKLS5DbSBBbGxvd1VzZXJzICwKLS5DbSBEZW55R3JvdXBzICwKLWFuZCBmaW5hbGx5Ci0uQ20gQWxsb3dHcm91cHMgLgotLlBwCi1TZWUKLS5TeCBQQVRURVJOUwotaW4KLS5YciBzc2hfY29uZmlnIDUKLWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBhdHRlcm5zLgotLkl0IENtIEF1dGhvcml6ZWRLZXlzRmlsZQotU3BlY2lmaWVzIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHB1YmxpYyBrZXlzIHRoYXQgY2FuIGJlIHVzZWQKLWZvciB1c2VyIGF1dGhlbnRpY2F0aW9uLgotVGhlIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gdGhlCi0uU3ggQVVUSE9SSVpFRF9LRVlTIEZJTEUgRk9STUFUCi1zZWN0aW9uIG9mCi0uWHIgc3NoZCA4IC4KLS5DbSBBdXRob3JpemVkS2V5c0ZpbGUKLW1heSBjb250YWluIHRva2VucyBvZiB0aGUgZm9ybSAlVCB3aGljaCBhcmUgc3Vic3RpdHV0ZWQgZHVyaW5nIGNvbm5lY3Rpb24KLXNldHVwLgotVGhlIGZvbGxvd2luZyB0b2tlbnMgYXJlIGRlZmluZWQ6ICUlIGlzIHJlcGxhY2VkIGJ5IGEgbGl0ZXJhbCAnJScsCi0laCBpcyByZXBsYWNlZCBieSB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIHVzZXIgYmVpbmcgYXV0aGVudGljYXRlZCwgYW5kCi0ldSBpcyByZXBsYWNlZCBieSB0aGUgdXNlcm5hbWUgb2YgdGhhdCB1c2VyLgotQWZ0ZXIgZXhwYW5zaW9uLAotLkNtIEF1dGhvcml6ZWRLZXlzRmlsZQotaXMgdGFrZW4gdG8gYmUgYW4gYWJzb2x1dGUgcGF0aCBvciBvbmUgcmVsYXRpdmUgdG8gdGhlIHVzZXIncyBob21lCi1kaXJlY3RvcnkuCi1NdWx0aXBsZSBmaWxlcyBtYXkgYmUgbGlzdGVkLCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgLnNzaC9hdXRob3JpemVkX2tleXMgLnNzaC9hdXRob3JpemVkX2tleXMyIC4KLS5JdCBDbSBBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGUKLVNwZWNpZmllcyBhIGZpbGUgdGhhdCBsaXN0cyBwcmluY2lwYWwgbmFtZXMgdGhhdCBhcmUgYWNjZXB0ZWQgZm9yCi1jZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbi4KLVdoZW4gdXNpbmcgY2VydGlmaWNhdGVzIHNpZ25lZCBieSBhIGtleSBsaXN0ZWQgaW4KLS5DbSBUcnVzdGVkVXNlckNBS2V5cyAsCi10aGlzIGZpbGUgbGlzdHMgbmFtZXMsIG9uZSBvZiB3aGljaCBtdXN0IGFwcGVhciBpbiB0aGUgY2VydGlmaWNhdGUgZm9yIGl0Ci10byBiZSBhY2NlcHRlZCBmb3IgYXV0aGVudGljYXRpb24uCi1OYW1lcyBhcmUgbGlzdGVkIG9uZSBwZXIgbGluZSBwcmVjZWRlZCBieSBrZXkgb3B0aW9ucyAoYXMgZGVzY3JpYmVkCi1pbgotLlN4IEFVVEhPUklaRURfS0VZUyBGSUxFIEZPUk1BVAotaW4KLS5YciBzc2hkIDggKSAuCi1FbXB0eSBsaW5lcyBhbmQgY29tbWVudHMgc3RhcnRpbmcgd2l0aAotLlFsICMKLWFyZSBpZ25vcmVkLgotLlBwCi0uQ20gQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlCi1tYXkgY29udGFpbiB0b2tlbnMgb2YgdGhlIGZvcm0gJVQgd2hpY2ggYXJlIHN1YnN0aXR1dGVkIGR1cmluZyBjb25uZWN0aW9uCi1zZXR1cC4KLVRoZSBmb2xsb3dpbmcgdG9rZW5zIGFyZSBkZWZpbmVkOiAlJSBpcyByZXBsYWNlZCBieSBhIGxpdGVyYWwgJyUnLAotJWggaXMgcmVwbGFjZWQgYnkgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSB1c2VyIGJlaW5nIGF1dGhlbnRpY2F0ZWQsIGFuZAotJXUgaXMgcmVwbGFjZWQgYnkgdGhlIHVzZXJuYW1lIG9mIHRoYXQgdXNlci4KLUFmdGVyIGV4cGFuc2lvbiwKLS5DbSBBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGUKLWlzIHRha2VuIHRvIGJlIGFuIGFic29sdXRlIHBhdGggb3Igb25lIHJlbGF0aXZlIHRvIHRoZSB1c2VyJ3MgaG9tZQotZGlyZWN0b3J5LgotLlBwCi1UaGUgZGVmYXVsdCBpcyBub3QgdG8gdXNlIGEgcHJpbmNpcGFscyBmaWxlIFwoZW4gaW4gdGhpcyBjYXNlLCB0aGUgdXNlcm5hbWUKLW9mIHRoZSB1c2VyIG11c3QgYXBwZWFyIGluIGEgY2VydGlmaWNhdGUncyBwcmluY2lwYWxzIGxpc3QgZm9yIGl0IHRvIGJlCi1hY2NlcHRlZC4KLU5vdGUgdGhhdAotLkNtIEF1dGhvcml6ZWRQcmluY2lwYWxzRmlsZQotaXMgb25seSB1c2VkIHdoZW4gYXV0aGVudGljYXRpb24gcHJvY2VlZHMgdXNpbmcgYSBDQSBsaXN0ZWQgaW4KLS5DbSBUcnVzdGVkVXNlckNBS2V5cwotYW5kIGlzIG5vdCBjb25zdWx0ZWQgZm9yIGNlcnRpZmljYXRpb24gYXV0aG9yaXRpZXMgdHJ1c3RlZCB2aWEKLS5QYSB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzICwKLXRob3VnaCB0aGUKLS5DbSBwcmluY2lwYWxzPQota2V5IG9wdGlvbiBvZmZlcnMgYSBzaW1pbGFyIGZhY2lsaXR5IChzZWUKLS5YciBzc2hkIDgKLWZvciBkZXRhaWxzKS4KLS5JdCBDbSBCYW5uZXIKLVRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgYXJlIHNlbnQgdG8gdGhlIHJlbW90ZSB1c2VyIGJlZm9yZQotYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZC4KLUlmIHRoZSBhcmd1bWVudCBpcwotLkRxIG5vbmUKLXRoZW4gbm8gYmFubmVyIGlzIGRpc3BsYXllZC4KLVRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBwcm90b2NvbCB2ZXJzaW9uIDIuCi1CeSBkZWZhdWx0LCBubyBiYW5uZXIgaXMgZGlzcGxheWVkLgotLkl0IENtIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24KLVNwZWNpZmllcyB3aGV0aGVyIGNoYWxsZW5nZS1yZXNwb25zZSBhdXRoZW50aWNhdGlvbiBpcyBhbGxvd2VkIChlLmcuIHZpYQotUEFNIG9yIHRob3VnaCBhdXRoZW50aWNhdGlvbiBzdHlsZXMgc3VwcG9ydGVkIGluCi0uWHIgbG9naW4uY29uZiA1ICkKLVRoZSBkZWZhdWx0IGlzCi0uRHEgeWVzIC4KLS5JdCBDbSBDaHJvb3REaXJlY3RvcnkKLVNwZWNpZmllcyB0aGUgcGF0aG5hbWUgb2YgYSBkaXJlY3RvcnkgdG8KLS5YciBjaHJvb3QgMgotdG8gYWZ0ZXIgYXV0aGVudGljYXRpb24uCi1BbGwgY29tcG9uZW50cyBvZiB0aGUgcGF0aG5hbWUgbXVzdCBiZSByb290LW93bmVkIGRpcmVjdG9yaWVzIHRoYXQgYXJlCi1ub3Qgd3JpdGFibGUgYnkgYW55IG90aGVyIHVzZXIgb3IgZ3JvdXAuCi1BZnRlciB0aGUgY2hyb290LAotLlhyIHNzaGQgOAotY2hhbmdlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4KLS5QcAotVGhlIHBhdGhuYW1lIG1heSBjb250YWluIHRoZSBmb2xsb3dpbmcgdG9rZW5zIHRoYXQgYXJlIGV4cGFuZGVkIGF0IHJ1bnRpbWUgb25jZQotdGhlIGNvbm5lY3RpbmcgdXNlciBoYXMgYmVlbiBhdXRoZW50aWNhdGVkOiAlJSBpcyByZXBsYWNlZCBieSBhIGxpdGVyYWwgJyUnLAotJWggaXMgcmVwbGFjZWQgYnkgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSB1c2VyIGJlaW5nIGF1dGhlbnRpY2F0ZWQsIGFuZAotJXUgaXMgcmVwbGFjZWQgYnkgdGhlIHVzZXJuYW1lIG9mIHRoYXQgdXNlci4KLS5QcAotVGhlCi0uQ20gQ2hyb290RGlyZWN0b3J5Ci1tdXN0IGNvbnRhaW4gdGhlIG5lY2Vzc2FyeSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdG8gc3VwcG9ydCB0aGUKLXVzZXIncyBzZXNzaW9uLgotRm9yIGFuIGludGVyYWN0aXZlIHNlc3Npb24gdGhpcyByZXF1aXJlcyBhdCBsZWFzdCBhIHNoZWxsLCB0eXBpY2FsbHkKLS5YciBzaCAxICwKLWFuZCBiYXNpYwotLlBhIC9kZXYKLW5vZGVzIHN1Y2ggYXMKLS5YciBudWxsIDQgLAotLlhyIHplcm8gNCAsCi0uWHIgc3RkaW4gNCAsCi0uWHIgc3Rkb3V0IDQgLAotLlhyIHN0ZGVyciA0ICwKLS5YciBhcmFuZG9tIDQKLWFuZAotLlhyIHR0eSA0Ci1kZXZpY2VzLgotRm9yIGZpbGUgdHJhbnNmZXIgc2Vzc2lvbnMgdXNpbmcKLS5EcSBzZnRwICwKLW5vIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgZW52aXJvbm1lbnQgaXMgbmVjZXNzYXJ5IGlmIHRoZQotaW4tcHJvY2VzcyBzZnRwIHNlcnZlciBpcyB1c2VkLAotdGhvdWdoIHNlc3Npb25zIHdoaWNoIHVzZSBsb2dnaW5nIGRvIHJlcXVpcmUKLS5QYSAvZGV2L2xvZwotaW5zaWRlIHRoZSBjaHJvb3QgZGlyZWN0b3J5IChzZWUKLS5YciBzZnRwLXNlcnZlciA4Ci1mb3IgZGV0YWlscykuCi0uUHAKLVRoZSBkZWZhdWx0IGlzIG5vdCB0bwotLlhyIGNocm9vdCAyIC4KLS5JdCBDbSBDaXBoZXJzCi1TcGVjaWZpZXMgdGhlIGNpcGhlcnMgYWxsb3dlZCBmb3IgcHJvdG9jb2wgdmVyc2lvbiAyLgotTXVsdGlwbGUgY2lwaGVycyBtdXN0IGJlIGNvbW1hLXNlcGFyYXRlZC4KLVRoZSBzdXBwb3J0ZWQgY2lwaGVycyBhcmUKLS5EcSAzZGVzLWNiYyAsCi0uRHEgYWVzMTI4LWNiYyAsCi0uRHEgYWVzMTkyLWNiYyAsCi0uRHEgYWVzMjU2LWNiYyAsCi0uRHEgYWVzMTI4LWN0ciAsCi0uRHEgYWVzMTkyLWN0ciAsCi0uRHEgYWVzMjU2LWN0ciAsCi0uRHEgYXJjZm91cjEyOCAsCi0uRHEgYXJjZm91cjI1NiAsCi0uRHEgYXJjZm91ciAsCi0uRHEgYmxvd2Zpc2gtY2JjICwKLWFuZAotLkRxIGNhc3QxMjgtY2JjIC4KLVRoZSBkZWZhdWx0IGlzOgotLkJkIC1saXRlcmFsIC1vZmZzZXQgM24KLWFlczEyOC1jdHIsYWVzMTkyLWN0cixhZXMyNTYtY3RyLGFyY2ZvdXIyNTYsYXJjZm91cjEyOCwKLWFlczEyOC1jYmMsM2Rlcy1jYmMsYmxvd2Zpc2gtY2JjLGNhc3QxMjgtY2JjLGFlczE5Mi1jYmMsCi1hZXMyNTYtY2JjLGFyY2ZvdXIKLS5FZAotLkl0IENtIENsaWVudEFsaXZlQ291bnRNYXgKLVNldHMgdGhlIG51bWJlciBvZiBjbGllbnQgYWxpdmUgbWVzc2FnZXMgKHNlZSBiZWxvdykgd2hpY2ggbWF5IGJlCi1zZW50IHdpdGhvdXQKLS5YciBzc2hkIDgKLXJlY2VpdmluZyBhbnkgbWVzc2FnZXMgYmFjayBmcm9tIHRoZSBjbGllbnQuCi1JZiB0aGlzIHRocmVzaG9sZCBpcyByZWFjaGVkIHdoaWxlIGNsaWVudCBhbGl2ZSBtZXNzYWdlcyBhcmUgYmVpbmcgc2VudCwKLXNzaGQgd2lsbCBkaXNjb25uZWN0IHRoZSBjbGllbnQsIHRlcm1pbmF0aW5nIHRoZSBzZXNzaW9uLgotSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgdXNlIG9mIGNsaWVudCBhbGl2ZSBtZXNzYWdlcyBpcyB2ZXJ5Ci1kaWZmZXJlbnQgZnJvbQotLkNtIFRDUEtlZXBBbGl2ZQotKGJlbG93KS4KLVRoZSBjbGllbnQgYWxpdmUgbWVzc2FnZXMgYXJlIHNlbnQgdGhyb3VnaCB0aGUgZW5jcnlwdGVkIGNoYW5uZWwKLWFuZCB0aGVyZWZvcmUgd2lsbCBub3QgYmUgc3Bvb2ZhYmxlLgotVGhlIFRDUCBrZWVwYWxpdmUgb3B0aW9uIGVuYWJsZWQgYnkKLS5DbSBUQ1BLZWVwQWxpdmUKLWlzIHNwb29mYWJsZS4KLVRoZSBjbGllbnQgYWxpdmUgbWVjaGFuaXNtIGlzIHZhbHVhYmxlIHdoZW4gdGhlIGNsaWVudCBvcgotc2VydmVyIGRlcGVuZCBvbiBrbm93aW5nIHdoZW4gYSBjb25uZWN0aW9uIGhhcyBiZWNvbWUgaW5hY3RpdmUuCi0uUHAKLVRoZSBkZWZhdWx0IHZhbHVlIGlzIDMuCi1JZgotLkNtIENsaWVudEFsaXZlSW50ZXJ2YWwKLShzZWUgYmVsb3cpIGlzIHNldCB0byAxNSwgYW5kCi0uQ20gQ2xpZW50QWxpdmVDb3VudE1heAotaXMgbGVmdCBhdCB0aGUgZGVmYXVsdCwgdW5yZXNwb25zaXZlIFNTSCBjbGllbnRzCi13aWxsIGJlIGRpc2Nvbm5lY3RlZCBhZnRlciBhcHByb3hpbWF0ZWx5IDQ1IHNlY29uZHMuCi1UaGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgotLkl0IENtIENsaWVudEFsaXZlSW50ZXJ2YWwKLVNldHMgYSB0aW1lb3V0IGludGVydmFsIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggaWYgbm8gZGF0YSBoYXMgYmVlbiByZWNlaXZlZAotZnJvbSB0aGUgY2xpZW50LAotLlhyIHNzaGQgOAotd2lsbCBzZW5kIGEgbWVzc2FnZSB0aHJvdWdoIHRoZSBlbmNyeXB0ZWQKLWNoYW5uZWwgdG8gcmVxdWVzdCBhIHJlc3BvbnNlIGZyb20gdGhlIGNsaWVudC4KLVRoZSBkZWZhdWx0Ci1pcyAwLCBpbmRpY2F0aW5nIHRoYXQgdGhlc2UgbWVzc2FnZXMgd2lsbCBub3QgYmUgc2VudCB0byB0aGUgY2xpZW50LgotVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KLS5JdCBDbSBDb21wcmVzc2lvbgotU3BlY2lmaWVzIHdoZXRoZXIgY29tcHJlc3Npb24gaXMgYWxsb3dlZCwgb3IgZGVsYXllZCB1bnRpbAotdGhlIHVzZXIgaGFzIGF1dGhlbnRpY2F0ZWQgc3VjY2Vzc2Z1bGx5LgotVGhlIGFyZ3VtZW50IG11c3QgYmUKLS5EcSB5ZXMgLAotLkRxIGRlbGF5ZWQgLAotb3IKLS5EcSBubyAuCi1UaGUgZGVmYXVsdCBpcwotLkRxIGRlbGF5ZWQgLgotLkl0IENtIERlbnlHcm91cHMKLVRoaXMga2V5d29yZCBjYW4gYmUgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIGdyb3VwIG5hbWUgcGF0dGVybnMsIHNlcGFyYXRlZAotYnkgc3BhY2VzLgotTG9naW4gaXMgZGlzYWxsb3dlZCBmb3IgdXNlcnMgd2hvc2UgcHJpbWFyeSBncm91cCBvciBzdXBwbGVtZW50YXJ5Ci1ncm91cCBsaXN0IG1hdGNoZXMgb25lIG9mIHRoZSBwYXR0ZXJucy4KLU9ubHkgZ3JvdXAgbmFtZXMgYXJlIHZhbGlkOyBhIG51bWVyaWNhbCBncm91cCBJRCBpcyBub3QgcmVjb2duaXplZC4KLUJ5IGRlZmF1bHQsIGxvZ2luIGlzIGFsbG93ZWQgZm9yIGFsbCBncm91cHMuCi1UaGUgYWxsb3cvZGVueSBkaXJlY3RpdmVzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLS5DbSBEZW55VXNlcnMgLAotLkNtIEFsbG93VXNlcnMgLAotLkNtIERlbnlHcm91cHMgLAotYW5kIGZpbmFsbHkKLS5DbSBBbGxvd0dyb3VwcyAuCi0uUHAKLVNlZQotLlN4IFBBVFRFUk5TCi1pbgotLlhyIHNzaF9jb25maWcgNQotZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGF0dGVybnMuCi0uSXQgQ20gRGVueVVzZXJzCi1UaGlzIGtleXdvcmQgY2FuIGJlIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiB1c2VyIG5hbWUgcGF0dGVybnMsIHNlcGFyYXRlZAotYnkgc3BhY2VzLgotTG9naW4gaXMgZGlzYWxsb3dlZCBmb3IgdXNlciBuYW1lcyB0aGF0IG1hdGNoIG9uZSBvZiB0aGUgcGF0dGVybnMuCi1Pbmx5IHVzZXIgbmFtZXMgYXJlIHZhbGlkOyBhIG51bWVyaWNhbCB1c2VyIElEIGlzIG5vdCByZWNvZ25pemVkLgotQnkgZGVmYXVsdCwgbG9naW4gaXMgYWxsb3dlZCBmb3IgYWxsIHVzZXJzLgotSWYgdGhlIHBhdHRlcm4gdGFrZXMgdGhlIGZvcm0gVVNFUkBIT1NUIHRoZW4gVVNFUiBhbmQgSE9TVAotYXJlIHNlcGFyYXRlbHkgY2hlY2tlZCwgcmVzdHJpY3RpbmcgbG9naW5zIHRvIHBhcnRpY3VsYXIKLXVzZXJzIGZyb20gcGFydGljdWxhciBob3N0cy4KLVRoZSBhbGxvdy9kZW55IGRpcmVjdGl2ZXMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotLkNtIERlbnlVc2VycyAsCi0uQ20gQWxsb3dVc2VycyAsCi0uQ20gRGVueUdyb3VwcyAsCi1hbmQgZmluYWxseQotLkNtIEFsbG93R3JvdXBzIC4KLS5QcAotU2VlCi0uU3ggUEFUVEVSTlMKLWluCi0uWHIgc3NoX2NvbmZpZyA1Ci1mb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXR0ZXJucy4KLS5JdCBDbSBGb3JjZUNvbW1hbmQKLUZvcmNlcyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjb21tYW5kIHNwZWNpZmllZCBieQotLkNtIEZvcmNlQ29tbWFuZCAsCi1pZ25vcmluZyBhbnkgY29tbWFuZCBzdXBwbGllZCBieSB0aGUgY2xpZW50IGFuZAotLlBhIH4vLnNzaC9yYwotaWYgcHJlc2VudC4KLVRoZSBjb21tYW5kIGlzIGludm9rZWQgYnkgdXNpbmcgdGhlIHVzZXIncyBsb2dpbiBzaGVsbCB3aXRoIHRoZSAtYyBvcHRpb24uCi1UaGlzIGFwcGxpZXMgdG8gc2hlbGwsIGNvbW1hbmQsIG9yIHN1YnN5c3RlbSBleGVjdXRpb24uCi1JdCBpcyBtb3N0IHVzZWZ1bCBpbnNpZGUgYQotLkNtIE1hdGNoCi1ibG9jay4KLVRoZSBjb21tYW5kIG9yaWdpbmFsbHkgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCBpcyBhdmFpbGFibGUgaW4gdGhlCi0uRXYgU1NIX09SSUdJTkFMX0NPTU1BTkQKLWVudmlyb25tZW50IHZhcmlhYmxlLgotU3BlY2lmeWluZyBhIGNvbW1hbmQgb2YKLS5EcSBpbnRlcm5hbC1zZnRwCi13aWxsIGZvcmNlIHRoZSB1c2Ugb2YgYW4gaW4tcHJvY2VzcyBzZnRwIHNlcnZlciB0aGF0IHJlcXVpcmVzIG5vIHN1cHBvcnQKLWZpbGVzIHdoZW4gdXNlZCB3aXRoCi0uQ20gQ2hyb290RGlyZWN0b3J5IC4KLS5JdCBDbSBHYXRld2F5UG9ydHMKLVNwZWNpZmllcyB3aGV0aGVyIHJlbW90ZSBob3N0cyBhcmUgYWxsb3dlZCB0byBjb25uZWN0IHRvIHBvcnRzCi1mb3J3YXJkZWQgZm9yIHRoZSBjbGllbnQuCi1CeSBkZWZhdWx0LAotLlhyIHNzaGQgOAotYmluZHMgcmVtb3RlIHBvcnQgZm9yd2FyZGluZ3MgdG8gdGhlIGxvb3BiYWNrIGFkZHJlc3MuCi1UaGlzIHByZXZlbnRzIG90aGVyIHJlbW90ZSBob3N0cyBmcm9tIGNvbm5lY3RpbmcgdG8gZm9yd2FyZGVkIHBvcnRzLgotLkNtIEdhdGV3YXlQb3J0cwotY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGF0IHNzaGQKLXNob3VsZCBhbGxvdyByZW1vdGUgcG9ydCBmb3J3YXJkaW5ncyB0byBiaW5kIHRvIG5vbi1sb29wYmFjayBhZGRyZXNzZXMsIHRodXMKLWFsbG93aW5nIG90aGVyIGhvc3RzIHRvIGNvbm5lY3QuCi1UaGUgYXJndW1lbnQgbWF5IGJlCi0uRHEgbm8KLXRvIGZvcmNlIHJlbW90ZSBwb3J0IGZvcndhcmRpbmdzIHRvIGJlIGF2YWlsYWJsZSB0byB0aGUgbG9jYWwgaG9zdCBvbmx5LAotLkRxIHllcwotdG8gZm9yY2UgcmVtb3RlIHBvcnQgZm9yd2FyZGluZ3MgdG8gYmluZCB0byB0aGUgd2lsZGNhcmQgYWRkcmVzcywgb3IKLS5EcSBjbGllbnRzcGVjaWZpZWQKLXRvIGFsbG93IHRoZSBjbGllbnQgdG8gc2VsZWN0IHRoZSBhZGRyZXNzIHRvIHdoaWNoIHRoZSBmb3J3YXJkaW5nIGlzIGJvdW5kLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi0uSXQgQ20gR1NTQVBJQXV0aGVudGljYXRpb24KLVNwZWNpZmllcyB3aGV0aGVyIHVzZXIgYXV0aGVudGljYXRpb24gYmFzZWQgb24gR1NTQVBJIGlzIGFsbG93ZWQuCi1UaGUgZGVmYXVsdCBpcwotLkRxIG5vIC4KLU5vdGUgdGhhdCB0aGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgotLkl0IENtIEdTU0FQSUNsZWFudXBDcmVkZW50aWFscwotU3BlY2lmaWVzIHdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBkZXN0cm95IHRoZSB1c2VyJ3MgY3JlZGVudGlhbHMgY2FjaGUKLW9uIGxvZ291dC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgeWVzIC4KLU5vdGUgdGhhdCB0aGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgotLkl0IENtIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCi1TcGVjaWZpZXMgd2hldGhlciByaG9zdHMgb3IgL2V0Yy9ob3N0cy5lcXVpdiBhdXRoZW50aWNhdGlvbiB0b2dldGhlcgotd2l0aCBzdWNjZXNzZnVsIHB1YmxpYyBrZXkgY2xpZW50IGhvc3QgYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZAotKGhvc3QtYmFzZWQgYXV0aGVudGljYXRpb24pLgotVGhpcyBvcHRpb24gaXMgc2ltaWxhciB0bwotLkNtIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uCi1hbmQgYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgbm8gLgotLkl0IENtIEhvc3RiYXNlZFVzZXNOYW1lRnJvbVBhY2tldE9ubHkKLVNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgc2VydmVyIHdpbGwgYXR0ZW1wdCB0byBwZXJmb3JtIGEgcmV2ZXJzZQotbmFtZSBsb29rdXAgd2hlbiBtYXRjaGluZyB0aGUgbmFtZSBpbiB0aGUKLS5QYSB+Ly5zaG9zdHMgLAotLlBhIH4vLnJob3N0cyAsCi1hbmQKLS5QYSAvZXRjL2hvc3RzLmVxdWl2Ci1maWxlcyBkdXJpbmcKLS5DbSBIb3N0YmFzZWRBdXRoZW50aWNhdGlvbiAuCi1BIHNldHRpbmcgb2YKLS5EcSB5ZXMKLW1lYW5zIHRoYXQKLS5YciBzc2hkIDgKLXVzZXMgdGhlIG5hbWUgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCByYXRoZXIgdGhhbgotYXR0ZW1wdGluZyB0byByZXNvbHZlIHRoZSBuYW1lIGZyb20gdGhlIFRDUCBjb25uZWN0aW9uIGl0c2VsZi4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgbm8gLgotLkl0IENtIEhvc3RDZXJ0aWZpY2F0ZQotU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIGEgcHVibGljIGhvc3QgY2VydGlmaWNhdGUuCi1UaGUgY2VydGlmaWNhdGUncyBwdWJsaWMga2V5IG11c3QgbWF0Y2ggYSBwcml2YXRlIGhvc3Qga2V5IGFscmVhZHkgc3BlY2lmaWVkCi1ieQotLkNtIEhvc3RLZXkgLgotVGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mCi0uWHIgc3NoZCA4Ci1pcyBub3QgdG8gbG9hZCBhbnkgY2VydGlmaWNhdGVzLgotLkl0IENtIEhvc3RLZXkKLVNwZWNpZmllcyBhIGZpbGUgY29udGFpbmluZyBhIHByaXZhdGUgaG9zdCBrZXkKLXVzZWQgYnkgU1NILgotVGhlIGRlZmF1bHQgaXMKLS5QYSAvZXRjL3NzaC9zc2hfaG9zdF9rZXkKLWZvciBwcm90b2NvbCB2ZXJzaW9uIDEsIGFuZAotLlBhIC9ldGMvc3NoL3NzaF9ob3N0X2RzYV9rZXkgLAotLlBhIC9ldGMvc3NoL3NzaF9ob3N0X2VjZHNhX2tleQotYW5kCi0uUGEgL2V0Yy9zc2gvc3NoX2hvc3RfcnNhX2tleQotZm9yIHByb3RvY29sIHZlcnNpb24gMi4KLU5vdGUgdGhhdAotLlhyIHNzaGQgOAotd2lsbCByZWZ1c2UgdG8gdXNlIGEgZmlsZSBpZiBpdCBpcyBncm91cC93b3JsZC1hY2Nlc3NpYmxlLgotSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBob3N0IGtleSBmaWxlcy4KLS5EcSByc2ExCi1rZXlzIGFyZSB1c2VkIGZvciB2ZXJzaW9uIDEgYW5kCi0uRHEgZHNhICwKLS5EcSBlY2RzYQotb3IKLS5EcSByc2EKLWFyZSB1c2VkIGZvciB2ZXJzaW9uIDIgb2YgdGhlIFNTSCBwcm90b2NvbC4KLS5JdCBDbSBJZ25vcmVSaG9zdHMKLVNwZWNpZmllcyB0aGF0Ci0uUGEgLnJob3N0cwotYW5kCi0uUGEgLnNob3N0cwotZmlsZXMgd2lsbCBub3QgYmUgdXNlZCBpbgotLkNtIFJob3N0c1JTQUF1dGhlbnRpY2F0aW9uCi1vcgotLkNtIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uIC4KLS5QcAotLlBhIC9ldGMvaG9zdHMuZXF1aXYKLWFuZAotLlBhIC9ldGMvc2hvc3RzLmVxdWl2Ci1hcmUgc3RpbGwgdXNlZC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgeWVzIC4KLS5JdCBDbSBJZ25vcmVVc2VyS25vd25Ib3N0cwotU3BlY2lmaWVzIHdoZXRoZXIKLS5YciBzc2hkIDgKLXNob3VsZCBpZ25vcmUgdGhlIHVzZXIncwotLlBhIH4vLnNzaC9rbm93bl9ob3N0cwotZHVyaW5nCi0uQ20gUmhvc3RzUlNBQXV0aGVudGljYXRpb24KLW9yCi0uQ20gSG9zdGJhc2VkQXV0aGVudGljYXRpb24gLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi0uSXQgQ20gSVBRb1MKLVNwZWNpZmllcyB0aGUgSVB2NCB0eXBlLW9mLXNlcnZpY2Ugb3IgRFNDUCBjbGFzcyBmb3IgdGhlIGNvbm5lY3Rpb24uCi1BY2NlcHRlZCB2YWx1ZXMgYXJlCi0uRHEgYWYxMSAsCi0uRHEgYWYxMiAsCi0uRHEgYWYxMyAsCi0uRHEgYWYxNCAsCi0uRHEgYWYyMiAsCi0uRHEgYWYyMyAsCi0uRHEgYWYzMSAsCi0uRHEgYWYzMiAsCi0uRHEgYWYzMyAsCi0uRHEgYWY0MSAsCi0uRHEgYWY0MiAsCi0uRHEgYWY0MyAsCi0uRHEgY3MwICwKLS5EcSBjczEgLAotLkRxIGNzMiAsCi0uRHEgY3MzICwKLS5EcSBjczQgLAotLkRxIGNzNSAsCi0uRHEgY3M2ICwKLS5EcSBjczcgLAotLkRxIGVmICwKLS5EcSBsb3dkZWxheSAsCi0uRHEgdGhyb3VnaHB1dCAsCi0uRHEgcmVsaWFiaWxpdHkgLAotb3IgYSBudW1lcmljIHZhbHVlLgotVGhpcyBvcHRpb24gbWF5IHRha2Ugb25lIG9yIHR3byBhcmd1bWVudHMsIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLgotSWYgb25lIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBhcyB0aGUgcGFja2V0IGNsYXNzIHVuY29uZGl0aW9uYWxseS4KLUlmIHR3byB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIGZpcnN0IGlzIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgZm9yCi1pbnRlcmFjdGl2ZSBzZXNzaW9ucyBhbmQgdGhlIHNlY29uZCBmb3Igbm9uLWludGVyYWN0aXZlIHNlc3Npb25zLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBsb3dkZWxheQotZm9yIGludGVyYWN0aXZlIHNlc3Npb25zIGFuZAotLkRxIHRocm91Z2hwdXQKLWZvciBub24taW50ZXJhY3RpdmUgc2Vzc2lvbnMuCi0uSXQgQ20gS2VyYmVyb3NBdXRoZW50aWNhdGlvbgotU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHBhc3N3b3JkIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGZvcgotLkNtIFBhc3N3b3JkQXV0aGVudGljYXRpb24KLXdpbGwgYmUgdmFsaWRhdGVkIHRocm91Z2ggdGhlIEtlcmJlcm9zIEtEQy4KLVRvIHVzZSB0aGlzIG9wdGlvbiwgdGhlIHNlcnZlciBuZWVkcyBhCi1LZXJiZXJvcyBzZXJ2dGFiIHdoaWNoIGFsbG93cyB0aGUgdmVyaWZpY2F0aW9uIG9mIHRoZSBLREMncyBpZGVudGl0eS4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgbm8gLgotLkl0IENtIEtlcmJlcm9zR2V0QUZTVG9rZW4KLUlmIEFGUyBpcyBhY3RpdmUgYW5kIHRoZSB1c2VyIGhhcyBhIEtlcmJlcm9zIDUgVEdULCBhdHRlbXB0IHRvIGFjcXVpcmUKLWFuIEFGUyB0b2tlbiBiZWZvcmUgYWNjZXNzaW5nIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCi1UaGUgZGVmYXVsdCBpcwotLkRxIG5vIC4KLS5JdCBDbSBLZXJiZXJvc09yTG9jYWxQYXNzd2QKLUlmIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIHRocm91Z2ggS2VyYmVyb3MgZmFpbHMgdGhlbgotdGhlIHBhc3N3b3JkIHdpbGwgYmUgdmFsaWRhdGVkIHZpYSBhbnkgYWRkaXRpb25hbCBsb2NhbCBtZWNoYW5pc20KLXN1Y2ggYXMKLS5QYSAvZXRjL3Bhc3N3ZCAuCi1UaGUgZGVmYXVsdCBpcwotLkRxIHllcyAuCi0uSXQgQ20gS2VyYmVyb3NUaWNrZXRDbGVhbnVwCi1TcGVjaWZpZXMgd2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGRlc3Ryb3kgdGhlIHVzZXIncyB0aWNrZXQgY2FjaGUKLWZpbGUgb24gbG9nb3V0LgotVGhlIGRlZmF1bHQgaXMKLS5EcSB5ZXMgLgotLkl0IENtIEtleEFsZ29yaXRobXMKLVNwZWNpZmllcyB0aGUgYXZhaWxhYmxlIEtFWCAoS2V5IEV4Y2hhbmdlKSBhbGdvcml0aG1zLgotTXVsdGlwbGUgYWxnb3JpdGhtcyBtdXN0IGJlIGNvbW1hLXNlcGFyYXRlZC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgZWNkaC1zaGEyLW5pc3RwMjU2ICwKLS5EcSBlY2RoLXNoYTItbmlzdHAzODQgLAotLkRxIGVjZGgtc2hhMi1uaXN0cDUyMSAsCi0uRHEgZGlmZmllLWhlbGxtYW4tZ3JvdXAtZXhjaGFuZ2Utc2hhMjU2ICwKLS5EcSBkaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGExICwKLS5EcSBkaWZmaWUtaGVsbG1hbi1ncm91cDE0LXNoYTEgLAotLkRxIGRpZmZpZS1oZWxsbWFuLWdyb3VwMS1zaGExIC4KLS5JdCBDbSBLZXlSZWdlbmVyYXRpb25JbnRlcnZhbAotSW4gcHJvdG9jb2wgdmVyc2lvbiAxLCB0aGUgZXBoZW1lcmFsIHNlcnZlciBrZXkgaXMgYXV0b21hdGljYWxseSByZWdlbmVyYXRlZAotYWZ0ZXIgdGhpcyBtYW55IHNlY29uZHMgKGlmIGl0IGhhcyBiZWVuIHVzZWQpLgotVGhlIHB1cnBvc2Ugb2YgcmVnZW5lcmF0aW9uIGlzIHRvIHByZXZlbnQKLWRlY3J5cHRpbmcgY2FwdHVyZWQgc2Vzc2lvbnMgYnkgbGF0ZXIgYnJlYWtpbmcgaW50byB0aGUgbWFjaGluZSBhbmQKLXN0ZWFsaW5nIHRoZSBrZXlzLgotVGhlIGtleSBpcyBuZXZlciBzdG9yZWQgYW55d2hlcmUuCi1JZiB0aGUgdmFsdWUgaXMgMCwgdGhlIGtleSBpcyBuZXZlciByZWdlbmVyYXRlZC4KLVRoZSBkZWZhdWx0IGlzIDM2MDAgKHNlY29uZHMpLgotLkl0IENtIExpc3RlbkFkZHJlc3MKLVNwZWNpZmllcyB0aGUgbG9jYWwgYWRkcmVzc2VzCi0uWHIgc3NoZCA4Ci1zaG91bGQgbGlzdGVuIG9uLgotVGhlIGZvbGxvd2luZyBmb3JtcyBtYXkgYmUgdXNlZDoKLS5QcAotLkJsIC1pdGVtIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0Ci0uSXQKLS5DbSBMaXN0ZW5BZGRyZXNzCi0uU20gb2ZmCi0uQXIgaG9zdCBObyB8IEFyIElQdjRfYWRkciBObyB8IEFyIElQdjZfYWRkcgotLlNtIG9uCi0uSXQKLS5DbSBMaXN0ZW5BZGRyZXNzCi0uU20gb2ZmCi0uQXIgaG9zdCBObyB8IEFyIElQdjRfYWRkciBObyA6IEFyIHBvcnQKLS5TbSBvbgotLkl0Ci0uQ20gTGlzdGVuQWRkcmVzcwotLlNtIG9mZgotLk9vCi0uQXIgaG9zdCBObyB8IEFyIElQdjZfYWRkciBPYyA6IEFyIHBvcnQKLS5TbSBvbgotLkVsCi0uUHAKLUlmCi0uQXIgcG9ydAotaXMgbm90IHNwZWNpZmllZCwKLXNzaGQgd2lsbCBsaXN0ZW4gb24gdGhlIGFkZHJlc3MgYW5kIGFsbCBwcmlvcgotLkNtIFBvcnQKLW9wdGlvbnMgc3BlY2lmaWVkLgotVGhlIGRlZmF1bHQgaXMgdG8gbGlzdGVuIG9uIGFsbCBsb2NhbCBhZGRyZXNzZXMuCi1NdWx0aXBsZQotLkNtIExpc3RlbkFkZHJlc3MKLW9wdGlvbnMgYXJlIHBlcm1pdHRlZC4KLUFkZGl0aW9uYWxseSwgYW55Ci0uQ20gUG9ydAotb3B0aW9ucyBtdXN0IHByZWNlZGUgdGhpcyBvcHRpb24gZm9yIG5vbi1wb3J0IHF1YWxpZmllZCBhZGRyZXNzZXMuCi0uSXQgQ20gTG9naW5HcmFjZVRpbWUKLVRoZSBzZXJ2ZXIgZGlzY29ubmVjdHMgYWZ0ZXIgdGhpcyB0aW1lIGlmIHRoZSB1c2VyIGhhcyBub3QKLXN1Y2Nlc3NmdWxseSBsb2dnZWQgaW4uCi1JZiB0aGUgdmFsdWUgaXMgMCwgdGhlcmUgaXMgbm8gdGltZSBsaW1pdC4KLVRoZSBkZWZhdWx0IGlzIDEyMCBzZWNvbmRzLgotLkl0IENtIExvZ0xldmVsCi1HaXZlcyB0aGUgdmVyYm9zaXR5IGxldmVsIHRoYXQgaXMgdXNlZCB3aGVuIGxvZ2dpbmcgbWVzc2FnZXMgZnJvbQotLlhyIHNzaGQgOCAuCi1UaGUgcG9zc2libGUgdmFsdWVzIGFyZToKLVFVSUVULCBGQVRBTCwgRVJST1IsIElORk8sIFZFUkJPU0UsIERFQlVHLCBERUJVRzEsIERFQlVHMiwgYW5kIERFQlVHMy4KLVRoZSBkZWZhdWx0IGlzIElORk8uCi1ERUJVRyBhbmQgREVCVUcxIGFyZSBlcXVpdmFsZW50LgotREVCVUcyIGFuZCBERUJVRzMgZWFjaCBzcGVjaWZ5IGhpZ2hlciBsZXZlbHMgb2YgZGVidWdnaW5nIG91dHB1dC4KLUxvZ2dpbmcgd2l0aCBhIERFQlVHIGxldmVsIHZpb2xhdGVzIHRoZSBwcml2YWN5IG9mIHVzZXJzIGFuZCBpcyBub3QgcmVjb21tZW5kZWQuCi0uSXQgQ20gTUFDcwotU3BlY2lmaWVzIHRoZSBhdmFpbGFibGUgTUFDIChtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUpIGFsZ29yaXRobXMuCi1UaGUgTUFDIGFsZ29yaXRobSBpcyB1c2VkIGluIHByb3RvY29sIHZlcnNpb24gMgotZm9yIGRhdGEgaW50ZWdyaXR5IHByb3RlY3Rpb24uCi1NdWx0aXBsZSBhbGdvcml0aG1zIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkLgotVGhlIGRlZmF1bHQgaXM6Ci0uQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKLWhtYWMtbWQ1LGhtYWMtc2hhMSx1bWFjLTY0QG9wZW5zc2guY29tLAotaG1hYy1yaXBlbWQxNjAsaG1hYy1zaGExLTk2LGhtYWMtbWQ1LTk2LAotaG1hYy1zaGEyLTI1NixobWFjLXNoYTI1Ni05NixobWFjLXNoYTItNTEyLAotaG1hYy1zaGEyLTUxMi05NgotLkVkCi0uSXQgQ20gTWF0Y2gKLUludHJvZHVjZXMgYSBjb25kaXRpb25hbCBibG9jay4KLUlmIGFsbCBvZiB0aGUgY3JpdGVyaWEgb24gdGhlCi0uQ20gTWF0Y2gKLWxpbmUgYXJlIHNhdGlzZmllZCwgdGhlIGtleXdvcmRzIG9uIHRoZSBmb2xsb3dpbmcgbGluZXMgb3ZlcnJpZGUgdGhvc2UKLXNldCBpbiB0aGUgZ2xvYmFsIHNlY3Rpb24gb2YgdGhlIGNvbmZpZyBmaWxlLCB1bnRpbCBlaXRoZXIgYW5vdGhlcgotLkNtIE1hdGNoCi1saW5lIG9yIHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0uUHAKLVRoZSBhcmd1bWVudHMgdG8KLS5DbSBNYXRjaAotYXJlIG9uZSBvciBtb3JlIGNyaXRlcmlhLXBhdHRlcm4gcGFpcnMuCi1UaGUgYXZhaWxhYmxlIGNyaXRlcmlhIGFyZQotLkNtIFVzZXIgLAotLkNtIEdyb3VwICwKLS5DbSBIb3N0ICwKLWFuZAotLkNtIEFkZHJlc3MgLgotVGhlIG1hdGNoIHBhdHRlcm5zIG1heSBjb25zaXN0IG9mIHNpbmdsZSBlbnRyaWVzIG9yIGNvbW1hLXNlcGFyYXRlZAotbGlzdHMgYW5kIG1heSB1c2UgdGhlIHdpbGRjYXJkIGFuZCBuZWdhdGlvbiBvcGVyYXRvcnMgZGVzY3JpYmVkIGluIHRoZQotLlN4IFBBVFRFUk5TCi1zZWN0aW9uIG9mCi0uWHIgc3NoX2NvbmZpZyA1IC4KLS5QcAotVGhlIHBhdHRlcm5zIGluIGFuCi0uQ20gQWRkcmVzcwotY3JpdGVyaWEgbWF5IGFkZGl0aW9uYWxseSBjb250YWluIGFkZHJlc3NlcyB0byBtYXRjaCBpbiBDSURSCi1hZGRyZXNzL21hc2tsZW4gZm9ybWF0LCBlLmcuXCYKLS5EcSAxOTIuMC4yLjAvMjQKLW9yCi0uRHEgM2ZmZTpmZmZmOjovMzIgLgotTm90ZSB0aGF0IHRoZSBtYXNrIGxlbmd0aCBwcm92aWRlZCBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgYWRkcmVzcyAtCi1pdCBpcyBhbiBlcnJvciB0byBzcGVjaWZ5IGEgbWFzayBsZW5ndGggdGhhdCBpcyB0b28gbG9uZyBmb3IgdGhlIGFkZHJlc3MKLW9yIG9uZSB3aXRoIGJpdHMgc2V0IGluIHRoaXMgaG9zdCBwb3J0aW9uIG9mIHRoZSBhZGRyZXNzLgotRm9yIGV4YW1wbGUsCi0uRHEgMTkyLjAuMi4wLzMzCi1hbmQKLS5EcSAxOTIuMC4yLjAvOAotcmVzcGVjdGl2ZWx5LgotLlBwCi1Pbmx5IGEgc3Vic2V0IG9mIGtleXdvcmRzIG1heSBiZSB1c2VkIG9uIHRoZSBsaW5lcyBmb2xsb3dpbmcgYQotLkNtIE1hdGNoCi1rZXl3b3JkLgotQXZhaWxhYmxlIGtleXdvcmRzIGFyZQotLkNtIEFsbG93QWdlbnRGb3J3YXJkaW5nICwKLS5DbSBBbGxvd1RjcEZvcndhcmRpbmcgLAotLkNtIEF1dGhvcml6ZWRLZXlzRmlsZSAsCi0uQ20gQXV0aG9yaXplZFByaW5jaXBhbHNGaWxlICwKLS5DbSBCYW5uZXIgLAotLkNtIENocm9vdERpcmVjdG9yeSAsCi0uQ20gRm9yY2VDb21tYW5kICwKLS5DbSBHYXRld2F5UG9ydHMgLAotLkNtIEdTU0FQSUF1dGhlbnRpY2F0aW9uICwKLS5DbSBIb3N0YmFzZWRBdXRoZW50aWNhdGlvbiAsCi0uQ20gSG9zdGJhc2VkVXNlc05hbWVGcm9tUGFja2V0T25seSAsCi0uQ20gS2JkSW50ZXJhY3RpdmVBdXRoZW50aWNhdGlvbiAsCi0uQ20gS2VyYmVyb3NBdXRoZW50aWNhdGlvbiAsCi0uQ20gTWF4QXV0aFRyaWVzICwKLS5DbSBNYXhTZXNzaW9ucyAsCi0uQ20gUGFzc3dvcmRBdXRoZW50aWNhdGlvbiAsCi0uQ20gUGVybWl0RW1wdHlQYXNzd29yZHMgLAotLkNtIFBlcm1pdE9wZW4gLAotLkNtIFBlcm1pdFJvb3RMb2dpbiAsCi0uQ20gUGVybWl0VHVubmVsICwKLS5DbSBQdWJrZXlBdXRoZW50aWNhdGlvbiAsCi0uQ20gUmhvc3RzUlNBQXV0aGVudGljYXRpb24gLAotLkNtIFJTQUF1dGhlbnRpY2F0aW9uICwKLS5DbSBYMTFEaXNwbGF5T2Zmc2V0ICwKLS5DbSBYMTFGb3J3YXJkaW5nCi1hbmQKLS5DbSBYMTFVc2VMb2NhbEhvc3QgLgotLkl0IENtIE1heEF1dGhUcmllcwotU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyBwZXJtaXR0ZWQgcGVyCi1jb25uZWN0aW9uLgotT25jZSB0aGUgbnVtYmVyIG9mIGZhaWx1cmVzIHJlYWNoZXMgaGFsZiB0aGlzIHZhbHVlLAotYWRkaXRpb25hbCBmYWlsdXJlcyBhcmUgbG9nZ2VkLgotVGhlIGRlZmF1bHQgaXMgNi4KLS5JdCBDbSBNYXhTZXNzaW9ucwotU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvcGVuIHNlc3Npb25zIHBlcm1pdHRlZCBwZXIgbmV0d29yayBjb25uZWN0aW9uLgotVGhlIGRlZmF1bHQgaXMgMTAuCi0uSXQgQ20gTWF4U3RhcnR1cHMKLVNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCB1bmF1dGhlbnRpY2F0ZWQgY29ubmVjdGlvbnMgdG8gdGhlCi1TU0ggZGFlbW9uLgotQWRkaXRpb25hbCBjb25uZWN0aW9ucyB3aWxsIGJlIGRyb3BwZWQgdW50aWwgYXV0aGVudGljYXRpb24gc3VjY2VlZHMgb3IgdGhlCi0uQ20gTG9naW5HcmFjZVRpbWUKLWV4cGlyZXMgZm9yIGEgY29ubmVjdGlvbi4KLVRoZSBkZWZhdWx0IGlzIDEwLgotLlBwCi1BbHRlcm5hdGl2ZWx5LCByYW5kb20gZWFybHkgZHJvcCBjYW4gYmUgZW5hYmxlZCBieSBzcGVjaWZ5aW5nCi10aGUgdGhyZWUgY29sb24gc2VwYXJhdGVkIHZhbHVlcwotLkRxIHN0YXJ0OnJhdGU6ZnVsbAotKGUuZy4gIjEwOjMwOjYwIikuCi0uWHIgc3NoZCA4Ci13aWxsIHJlZnVzZSBjb25uZWN0aW9uIGF0dGVtcHRzIHdpdGggYSBwcm9iYWJpbGl0eSBvZgotLkRxIHJhdGUvMTAwCi0oMzAlKQotaWYgdGhlcmUgYXJlIGN1cnJlbnRseQotLkRxIHN0YXJ0Ci0oMTApCi11bmF1dGhlbnRpY2F0ZWQgY29ubmVjdGlvbnMuCi1UaGUgcHJvYmFiaWxpdHkgaW5jcmVhc2VzIGxpbmVhcmx5IGFuZCBhbGwgY29ubmVjdGlvbiBhdHRlbXB0cwotYXJlIHJlZnVzZWQgaWYgdGhlIG51bWJlciBvZiB1bmF1dGhlbnRpY2F0ZWQgY29ubmVjdGlvbnMgcmVhY2hlcwotLkRxIGZ1bGwKLSg2MCkuCi0uSXQgQ20gUGFzc3dvcmRBdXRoZW50aWNhdGlvbgotU3BlY2lmaWVzIHdoZXRoZXIgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgeWVzIC4KLS5JdCBDbSBQZXJtaXRFbXB0eVBhc3N3b3JkcwotV2hlbiBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBpcyBhbGxvd2VkLCBpdCBzcGVjaWZpZXMgd2hldGhlciB0aGUKLXNlcnZlciBhbGxvd3MgbG9naW4gdG8gYWNjb3VudHMgd2l0aCBlbXB0eSBwYXNzd29yZCBzdHJpbmdzLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi0uSXQgQ20gUGVybWl0T3BlbgotU3BlY2lmaWVzIHRoZSBkZXN0aW5hdGlvbnMgdG8gd2hpY2ggVENQIHBvcnQgZm9yd2FyZGluZyBpcyBwZXJtaXR0ZWQuCi1UaGUgZm9yd2FyZGluZyBzcGVjaWZpY2F0aW9uIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6Ci0uUHAKLS5CbCAtaXRlbSAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAotLkl0Ci0uQ20gUGVybWl0T3BlbgotLlNtIG9mZgotLkFyIGhvc3QgOiBwb3J0Ci0uU20gb24KLS5JdAotLkNtIFBlcm1pdE9wZW4KLS5TbSBvZmYKLS5BciBJUHY0X2FkZHIgOiBwb3J0Ci0uU20gb24KLS5JdAotLkNtIFBlcm1pdE9wZW4KLS5TbSBvZmYKLS5BciBcJlsgSVB2Nl9hZGRyIFwmXSA6IHBvcnQKLS5TbSBvbgotLkVsCi0uUHAKLU11bHRpcGxlIGZvcndhcmRzIG1heSBiZSBzcGVjaWZpZWQgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggd2hpdGVzcGFjZS4KLUFuIGFyZ3VtZW50IG9mCi0uRHEgYW55Ci1jYW4gYmUgdXNlZCB0byByZW1vdmUgYWxsIHJlc3RyaWN0aW9ucyBhbmQgcGVybWl0IGFueSBmb3J3YXJkaW5nIHJlcXVlc3RzLgotQnkgZGVmYXVsdCBhbGwgcG9ydCBmb3J3YXJkaW5nIHJlcXVlc3RzIGFyZSBwZXJtaXR0ZWQuCi0uSXQgQ20gUGVybWl0Um9vdExvZ2luCi1TcGVjaWZpZXMgd2hldGhlciByb290IGNhbiBsb2cgaW4gdXNpbmcKLS5YciBzc2ggMSAuCi1UaGUgYXJndW1lbnQgbXVzdCBiZQotLkRxIHllcyAsCi0uRHEgd2l0aG91dC1wYXNzd29yZCAsCi0uRHEgZm9yY2VkLWNvbW1hbmRzLW9ubHkgLAotb3IKLS5EcSBubyAuCi1UaGUgZGVmYXVsdCBpcwotLkRxIHllcyAuCi0uUHAKLUlmIHRoaXMgb3B0aW9uIGlzIHNldCB0bwotLkRxIHdpdGhvdXQtcGFzc3dvcmQgLAotcGFzc3dvcmQgYXV0aGVudGljYXRpb24gaXMgZGlzYWJsZWQgZm9yIHJvb3QuCi0uUHAKLUlmIHRoaXMgb3B0aW9uIGlzIHNldCB0bwotLkRxIGZvcmNlZC1jb21tYW5kcy1vbmx5ICwKLXJvb3QgbG9naW4gd2l0aCBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIHdpbGwgYmUgYWxsb3dlZCwKLWJ1dCBvbmx5IGlmIHRoZQotLkFyIGNvbW1hbmQKLW9wdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQKLSh3aGljaCBtYXkgYmUgdXNlZnVsIGZvciB0YWtpbmcgcmVtb3RlIGJhY2t1cHMgZXZlbiBpZiByb290IGxvZ2luIGlzCi1ub3JtYWxseSBub3QgYWxsb3dlZCkuCi1BbGwgb3RoZXIgYXV0aGVudGljYXRpb24gbWV0aG9kcyBhcmUgZGlzYWJsZWQgZm9yIHJvb3QuCi0uUHAKLUlmIHRoaXMgb3B0aW9uIGlzIHNldCB0bwotLkRxIG5vICwKLXJvb3QgaXMgbm90IGFsbG93ZWQgdG8gbG9nIGluLgotLkl0IENtIFBlcm1pdFR1bm5lbAotU3BlY2lmaWVzIHdoZXRoZXIKLS5YciB0dW4gNAotZGV2aWNlIGZvcndhcmRpbmcgaXMgYWxsb3dlZC4KLVRoZSBhcmd1bWVudCBtdXN0IGJlCi0uRHEgeWVzICwKLS5EcSBwb2ludC10by1wb2ludAotKGxheWVyIDMpLAotLkRxIGV0aGVybmV0Ci0obGF5ZXIgMiksIG9yCi0uRHEgbm8gLgotU3BlY2lmeWluZwotLkRxIHllcwotcGVybWl0cyBib3RoCi0uRHEgcG9pbnQtdG8tcG9pbnQKLWFuZAotLkRxIGV0aGVybmV0IC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgbm8gLgotLkl0IENtIFBlcm1pdFVzZXJFbnZpcm9ubWVudAotU3BlY2lmaWVzIHdoZXRoZXIKLS5QYSB+Ly5zc2gvZW52aXJvbm1lbnQKLWFuZAotLkNtIGVudmlyb25tZW50PQotb3B0aW9ucyBpbgotLlBhIH4vLnNzaC9hdXRob3JpemVkX2tleXMKLWFyZSBwcm9jZXNzZWQgYnkKLS5YciBzc2hkIDggLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi1FbmFibGluZyBlbnZpcm9ubWVudCBwcm9jZXNzaW5nIG1heSBlbmFibGUgdXNlcnMgdG8gYnlwYXNzIGFjY2VzcwotcmVzdHJpY3Rpb25zIGluIHNvbWUgY29uZmlndXJhdGlvbnMgdXNpbmcgbWVjaGFuaXNtcyBzdWNoIGFzCi0uRXYgTERfUFJFTE9BRCAuCi0uSXQgQ20gUGlkRmlsZQotU3BlY2lmaWVzIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlCi1TU0ggZGFlbW9uLgotVGhlIGRlZmF1bHQgaXMKLS5QYSAvdmFyL3J1bi9zc2hkLnBpZCAuCi0uSXQgQ20gUG9ydAotU3BlY2lmaWVzIHRoZSBwb3J0IG51bWJlciB0aGF0Ci0uWHIgc3NoZCA4Ci1saXN0ZW5zIG9uLgotVGhlIGRlZmF1bHQgaXMgMjIuCi1NdWx0aXBsZSBvcHRpb25zIG9mIHRoaXMgdHlwZSBhcmUgcGVybWl0dGVkLgotU2VlIGFsc28KLS5DbSBMaXN0ZW5BZGRyZXNzIC4KLS5JdCBDbSBQcmludExhc3RMb2cKLVNwZWNpZmllcyB3aGV0aGVyCi0uWHIgc3NoZCA4Ci1zaG91bGQgcHJpbnQgdGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGxhc3QgdXNlciBsb2dpbiB3aGVuIGEgdXNlciBsb2dzCi1pbiBpbnRlcmFjdGl2ZWx5LgotVGhlIGRlZmF1bHQgaXMKLS5EcSB5ZXMgLgotLkl0IENtIFByaW50TW90ZAotU3BlY2lmaWVzIHdoZXRoZXIKLS5YciBzc2hkIDgKLXNob3VsZCBwcmludAotLlBhIC9ldGMvbW90ZAotd2hlbiBhIHVzZXIgbG9ncyBpbiBpbnRlcmFjdGl2ZWx5LgotKE9uIHNvbWUgc3lzdGVtcyBpdCBpcyBhbHNvIHByaW50ZWQgYnkgdGhlIHNoZWxsLAotLlBhIC9ldGMvcHJvZmlsZSAsCi1vciBlcXVpdmFsZW50LikKLVRoZSBkZWZhdWx0IGlzCi0uRHEgeWVzIC4KLS5JdCBDbSBQcm90b2NvbAotU3BlY2lmaWVzIHRoZSBwcm90b2NvbCB2ZXJzaW9ucwotLlhyIHNzaGQgOAotc3VwcG9ydHMuCi1UaGUgcG9zc2libGUgdmFsdWVzIGFyZQotLlNxIDEKLWFuZAotLlNxIDIgLgotTXVsdGlwbGUgdmVyc2lvbnMgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQuCi1UaGUgZGVmYXVsdCBpcwotLlNxIDIgLgotTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgcHJvdG9jb2wgbGlzdCBkb2VzIG5vdCBpbmRpY2F0ZSBwcmVmZXJlbmNlLAotYmVjYXVzZSB0aGUgY2xpZW50IHNlbGVjdHMgYW1vbmcgbXVsdGlwbGUgcHJvdG9jb2wgdmVyc2lvbnMgb2ZmZXJlZAotYnkgdGhlIHNlcnZlci4KLVNwZWNpZnlpbmcKLS5EcSAyLDEKLWlzIGlkZW50aWNhbCB0bwotLkRxIDEsMiAuCi0uSXQgQ20gUHVia2V5QXV0aGVudGljYXRpb24KLVNwZWNpZmllcyB3aGV0aGVyIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgeWVzIC4KLU5vdGUgdGhhdCB0aGlzIG9wdGlvbiBhcHBsaWVzIHRvIHByb3RvY29sIHZlcnNpb24gMiBvbmx5LgotLkl0IENtIFJldm9rZWRLZXlzCi1TcGVjaWZpZXMgYSBsaXN0IG9mIHJldm9rZWQgcHVibGljIGtleXMuCi1LZXlzIGxpc3RlZCBpbiB0aGlzIGZpbGUgd2lsbCBiZSByZWZ1c2VkIGZvciBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uLgotTm90ZSB0aGF0IGlmIHRoaXMgZmlsZSBpcyBub3QgcmVhZGFibGUsIHRoZW4gcHVibGljIGtleSBhdXRoZW50aWNhdGlvbiB3aWxsCi1iZSByZWZ1c2VkIGZvciBhbGwgdXNlcnMuCi0uSXQgQ20gUmhvc3RzUlNBQXV0aGVudGljYXRpb24KLVNwZWNpZmllcyB3aGV0aGVyIHJob3N0cyBvciAvZXRjL2hvc3RzLmVxdWl2IGF1dGhlbnRpY2F0aW9uIHRvZ2V0aGVyCi13aXRoIHN1Y2Nlc3NmdWwgUlNBIGhvc3QgYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgbm8gLgotVGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDEgb25seS4KLS5JdCBDbSBSU0FBdXRoZW50aWNhdGlvbgotU3BlY2lmaWVzIHdoZXRoZXIgcHVyZSBSU0EgYXV0aGVudGljYXRpb24gaXMgYWxsb3dlZC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgeWVzIC4KLVRoaXMgb3B0aW9uIGFwcGxpZXMgdG8gcHJvdG9jb2wgdmVyc2lvbiAxIG9ubHkuCi0uSXQgQ20gU2VydmVyS2V5Qml0cwotRGVmaW5lcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGVwaGVtZXJhbCBwcm90b2NvbCB2ZXJzaW9uIDEgc2VydmVyIGtleS4KLVRoZSBtaW5pbXVtIHZhbHVlIGlzIDUxMiwgYW5kIHRoZSBkZWZhdWx0IGlzIDEwMjQuCi0uSXQgQ20gU3RyaWN0TW9kZXMKLVNwZWNpZmllcyB3aGV0aGVyCi0uWHIgc3NoZCA4Ci1zaG91bGQgY2hlY2sgZmlsZSBtb2RlcyBhbmQgb3duZXJzaGlwIG9mIHRoZQotdXNlcidzIGZpbGVzIGFuZCBob21lIGRpcmVjdG9yeSBiZWZvcmUgYWNjZXB0aW5nIGxvZ2luLgotVGhpcyBpcyBub3JtYWxseSBkZXNpcmFibGUgYmVjYXVzZSBub3ZpY2VzIHNvbWV0aW1lcyBhY2NpZGVudGFsbHkgbGVhdmUgdGhlaXIKLWRpcmVjdG9yeSBvciBmaWxlcyB3b3JsZC13cml0YWJsZS4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgeWVzIC4KLU5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFwcGx5IHRvCi0uQ20gQ2hyb290RGlyZWN0b3J5ICwKLXdob3NlIHBlcm1pc3Npb25zIGFuZCBvd25lcnNoaXAgYXJlIGNoZWNrZWQgdW5jb25kaXRpb25hbGx5LgotLkl0IENtIFN1YnN5c3RlbQotQ29uZmlndXJlcyBhbiBleHRlcm5hbCBzdWJzeXN0ZW0gKGUuZy4gZmlsZSB0cmFuc2ZlciBkYWVtb24pLgotQXJndW1lbnRzIHNob3VsZCBiZSBhIHN1YnN5c3RlbSBuYW1lIGFuZCBhIGNvbW1hbmQgKHdpdGggb3B0aW9uYWwgYXJndW1lbnRzKQotdG8gZXhlY3V0ZSB1cG9uIHN1YnN5c3RlbSByZXF1ZXN0LgotLlBwCi1UaGUgY29tbWFuZAotLlhyIHNmdHAtc2VydmVyIDgKLWltcGxlbWVudHMgdGhlCi0uRHEgc2Z0cAotZmlsZSB0cmFuc2ZlciBzdWJzeXN0ZW0uCi0uUHAKLUFsdGVybmF0ZWx5IHRoZSBuYW1lCi0uRHEgaW50ZXJuYWwtc2Z0cAotaW1wbGVtZW50cyBhbiBpbi1wcm9jZXNzCi0uRHEgc2Z0cAotc2VydmVyLgotVGhpcyBtYXkgc2ltcGxpZnkgY29uZmlndXJhdGlvbnMgdXNpbmcKLS5DbSBDaHJvb3REaXJlY3RvcnkKLXRvIGZvcmNlIGEgZGlmZmVyZW50IGZpbGVzeXN0ZW0gcm9vdCBvbiBjbGllbnRzLgotLlBwCi1CeSBkZWZhdWx0IG5vIHN1YnN5c3RlbXMgYXJlIGRlZmluZWQuCi1Ob3RlIHRoYXQgdGhpcyBvcHRpb24gYXBwbGllcyB0byBwcm90b2NvbCB2ZXJzaW9uIDIgb25seS4KLS5JdCBDbSBTeXNsb2dGYWNpbGl0eQotR2l2ZXMgdGhlIGZhY2lsaXR5IGNvZGUgdGhhdCBpcyB1c2VkIHdoZW4gbG9nZ2luZyBtZXNzYWdlcyBmcm9tCi0uWHIgc3NoZCA4IC4KLVRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBEQUVNT04sIFVTRVIsIEFVVEgsIExPQ0FMMCwgTE9DQUwxLCBMT0NBTDIsCi1MT0NBTDMsIExPQ0FMNCwgTE9DQUw1LCBMT0NBTDYsIExPQ0FMNy4KLVRoZSBkZWZhdWx0IGlzIEFVVEguCi0uSXQgQ20gVENQS2VlcEFsaXZlCi1TcGVjaWZpZXMgd2hldGhlciB0aGUgc3lzdGVtIHNob3VsZCBzZW5kIFRDUCBrZWVwYWxpdmUgbWVzc2FnZXMgdG8gdGhlCi1vdGhlciBzaWRlLgotSWYgdGhleSBhcmUgc2VudCwgZGVhdGggb2YgdGhlIGNvbm5lY3Rpb24gb3IgY3Jhc2ggb2Ygb25lCi1vZiB0aGUgbWFjaGluZXMgd2lsbCBiZSBwcm9wZXJseSBub3RpY2VkLgotSG93ZXZlciwgdGhpcyBtZWFucyB0aGF0Ci1jb25uZWN0aW9ucyB3aWxsIGRpZSBpZiB0aGUgcm91dGUgaXMgZG93biB0ZW1wb3JhcmlseSwgYW5kIHNvbWUgcGVvcGxlCi1maW5kIGl0IGFubm95aW5nLgotT24gdGhlIG90aGVyIGhhbmQsIGlmIFRDUCBrZWVwYWxpdmVzIGFyZSBub3Qgc2VudCwKLXNlc3Npb25zIG1heSBoYW5nIGluZGVmaW5pdGVseSBvbiB0aGUgc2VydmVyLCBsZWF2aW5nCi0uRHEgZ2hvc3QKLXVzZXJzIGFuZCBjb25zdW1pbmcgc2VydmVyIHJlc291cmNlcy4KLS5QcAotVGhlIGRlZmF1bHQgaXMKLS5EcSB5ZXMKLSh0byBzZW5kIFRDUCBrZWVwYWxpdmUgbWVzc2FnZXMpLCBhbmQgdGhlIHNlcnZlciB3aWxsIG5vdGljZQotaWYgdGhlIG5ldHdvcmsgZ29lcyBkb3duIG9yIHRoZSBjbGllbnQgaG9zdCBjcmFzaGVzLgotVGhpcyBhdm9pZHMgaW5maW5pdGVseSBoYW5naW5nIHNlc3Npb25zLgotLlBwCi1UbyBkaXNhYmxlIFRDUCBrZWVwYWxpdmUgbWVzc2FnZXMsIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvCi0uRHEgbm8gLgotLkl0IENtIFRydXN0ZWRVc2VyQ0FLZXlzCi1TcGVjaWZpZXMgYSBmaWxlIGNvbnRhaW5pbmcgcHVibGljIGtleXMgb2YgY2VydGlmaWNhdGUgYXV0aG9yaXRpZXMgdGhhdCBhcmUKLXRydXN0ZWQgdG8gc2lnbiB1c2VyIGNlcnRpZmljYXRlcyBmb3IgYXV0aGVudGljYXRpb24uCi1LZXlzIGFyZSBsaXN0ZWQgb25lIHBlciBsaW5lOyBlbXB0eSBsaW5lcyBhbmQgY29tbWVudHMgc3RhcnRpbmcgd2l0aAotLlFsICMKLWFyZSBhbGxvd2VkLgotSWYgYSBjZXJ0aWZpY2F0ZSBpcyBwcmVzZW50ZWQgZm9yIGF1dGhlbnRpY2F0aW9uIGFuZCBoYXMgaXRzIHNpZ25pbmcgQ0Ega2V5Ci1saXN0ZWQgaW4gdGhpcyBmaWxlLCB0aGVuIGl0IG1heSBiZSB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiBmb3IgYW55IHVzZXIKLWxpc3RlZCBpbiB0aGUgY2VydGlmaWNhdGUncyBwcmluY2lwYWxzIGxpc3QuCi1Ob3RlIHRoYXQgY2VydGlmaWNhdGVzIHRoYXQgbGFjayBhIGxpc3Qgb2YgcHJpbmNpcGFscyB3aWxsIG5vdCBiZSBwZXJtaXR0ZWQKLWZvciBhdXRoZW50aWNhdGlvbiB1c2luZwotLkNtIFRydXN0ZWRVc2VyQ0FLZXlzIC4KLUZvciBtb3JlIGRldGFpbHMgb24gY2VydGlmaWNhdGVzLCBzZWUgdGhlCi0uU3ggQ0VSVElGSUNBVEVTCi1zZWN0aW9uIGluCi0uWHIgc3NoLWtleWdlbiAxIC4KLS5JdCBDbSBVc2VETlMKLVNwZWNpZmllcyB3aGV0aGVyCi0uWHIgc3NoZCA4Ci1zaG91bGQgbG9vayB1cCB0aGUgcmVtb3RlIGhvc3QgbmFtZSBhbmQgY2hlY2sgdGhhdAotdGhlIHJlc29sdmVkIGhvc3QgbmFtZSBmb3IgdGhlIHJlbW90ZSBJUCBhZGRyZXNzIG1hcHMgYmFjayB0byB0aGUKLXZlcnkgc2FtZSBJUCBhZGRyZXNzLgotVGhlIGRlZmF1bHQgaXMKLS5EcSB5ZXMgLgotLkl0IENtIFVzZUxvZ2luCi1TcGVjaWZpZXMgd2hldGhlcgotLlhyIGxvZ2luIDEKLWlzIHVzZWQgZm9yIGludGVyYWN0aXZlIGxvZ2luIHNlc3Npb25zLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi1Ob3RlIHRoYXQKLS5YciBsb2dpbiAxCi1pcyBuZXZlciB1c2VkIGZvciByZW1vdGUgY29tbWFuZCBleGVjdXRpb24uCi1Ob3RlIGFsc28sIHRoYXQgaWYgdGhpcyBpcyBlbmFibGVkLAotLkNtIFgxMUZvcndhcmRpbmcKLXdpbGwgYmUgZGlzYWJsZWQgYmVjYXVzZQotLlhyIGxvZ2luIDEKLWRvZXMgbm90IGtub3cgaG93IHRvIGhhbmRsZQotLlhyIHhhdXRoIDEKLWNvb2tpZXMuCi1JZgotLkNtIFVzZVByaXZpbGVnZVNlcGFyYXRpb24KLWlzIHNwZWNpZmllZCwgaXQgd2lsbCBiZSBkaXNhYmxlZCBhZnRlciBhdXRoZW50aWNhdGlvbi4KLS5JdCBDbSBVc2VQQU0KLUVuYWJsZXMgdGhlIFBsdWdnYWJsZSBBdXRoZW50aWNhdGlvbiBNb2R1bGUgaW50ZXJmYWNlLgotSWYgc2V0IHRvCi0uRHEgeWVzCi10aGlzIHdpbGwgZW5hYmxlIFBBTSBhdXRoZW50aWNhdGlvbiB1c2luZwotLkNtIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24KLWFuZAotLkNtIFBhc3N3b3JkQXV0aGVudGljYXRpb24KLWluIGFkZGl0aW9uIHRvIFBBTSBhY2NvdW50IGFuZCBzZXNzaW9uIG1vZHVsZSBwcm9jZXNzaW5nIGZvciBhbGwKLWF1dGhlbnRpY2F0aW9uIHR5cGVzLgotLlBwCi1CZWNhdXNlIFBBTSBjaGFsbGVuZ2UtcmVzcG9uc2UgYXV0aGVudGljYXRpb24gdXN1YWxseSBzZXJ2ZXMgYW4gZXF1aXZhbGVudAotcm9sZSB0byBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiwgeW91IHNob3VsZCBkaXNhYmxlIGVpdGhlcgotLkNtIFBhc3N3b3JkQXV0aGVudGljYXRpb24KLW9yCi0uQ20gQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbi4KLS5QcAotSWYKLS5DbSBVc2VQQU0KLWlzIGVuYWJsZWQsIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHJ1bgotLlhyIHNzaGQgOAotYXMgYSBub24tcm9vdCB1c2VyLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi0uSXQgQ20gVXNlUHJpdmlsZWdlU2VwYXJhdGlvbgotU3BlY2lmaWVzIHdoZXRoZXIKLS5YciBzc2hkIDgKLXNlcGFyYXRlcyBwcml2aWxlZ2VzIGJ5IGNyZWF0aW5nIGFuIHVucHJpdmlsZWdlZCBjaGlsZCBwcm9jZXNzCi10byBkZWFsIHdpdGggaW5jb21pbmcgbmV0d29yayB0cmFmZmljLgotQWZ0ZXIgc3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbiwgYW5vdGhlciBwcm9jZXNzIHdpbGwgYmUgY3JlYXRlZCB0aGF0IGhhcwotdGhlIHByaXZpbGVnZSBvZiB0aGUgYXV0aGVudGljYXRlZCB1c2VyLgotVGhlIGdvYWwgb2YgcHJpdmlsZWdlIHNlcGFyYXRpb24gaXMgdG8gcHJldmVudCBwcml2aWxlZ2UKLWVzY2FsYXRpb24gYnkgY29udGFpbmluZyBhbnkgY29ycnVwdGlvbiB3aXRoaW4gdGhlIHVucHJpdmlsZWdlZCBwcm9jZXNzZXMuCi1UaGUgZGVmYXVsdCBpcwotLkRxIHllcyAuCi1JZgotLkNtIFVzZVByaXZpbGVnZVNlcGFyYXRpb24KLWlzIHNldCB0bwotLkRxIHNhbmRib3gKLXRoZW4gdGhlIHByZS1hdXRoZW50aWNhdGlvbiB1bnByaXZpbGVnZWQgcHJvY2VzcyBpcyBzdWJqZWN0IHRvIGFkZGl0aW9uYWwKLXJlc3RyaWN0aW9ucy4KLS5JdCBDbSBYMTFEaXNwbGF5T2Zmc2V0Ci1TcGVjaWZpZXMgdGhlIGZpcnN0IGRpc3BsYXkgbnVtYmVyIGF2YWlsYWJsZSBmb3IKLS5YciBzc2hkIDggTnMgJ3MKLVgxMSBmb3J3YXJkaW5nLgotVGhpcyBwcmV2ZW50cyBzc2hkIGZyb20gaW50ZXJmZXJpbmcgd2l0aCByZWFsIFgxMSBzZXJ2ZXJzLgotVGhlIGRlZmF1bHQgaXMgMTAuCi0uSXQgQ20gWDExRm9yd2FyZGluZwotU3BlY2lmaWVzIHdoZXRoZXIgWDExIGZvcndhcmRpbmcgaXMgcGVybWl0dGVkLgotVGhlIGFyZ3VtZW50IG11c3QgYmUKLS5EcSB5ZXMKLW9yCi0uRHEgbm8gLgotVGhlIGRlZmF1bHQgaXMKLS5EcSBubyAuCi0uUHAKLVdoZW4gWDExIGZvcndhcmRpbmcgaXMgZW5hYmxlZCwgdGhlcmUgbWF5IGJlIGFkZGl0aW9uYWwgZXhwb3N1cmUgdG8KLXRoZSBzZXJ2ZXIgYW5kIHRvIGNsaWVudCBkaXNwbGF5cyBpZiB0aGUKLS5YciBzc2hkIDgKLXByb3h5IGRpc3BsYXkgaXMgY29uZmlndXJlZCB0byBsaXN0ZW4gb24gdGhlIHdpbGRjYXJkIGFkZHJlc3MgKHNlZQotLkNtIFgxMVVzZUxvY2FsaG9zdAotYmVsb3cpLCB0aG91Z2ggdGhpcyBpcyBub3QgdGhlIGRlZmF1bHQuCi1BZGRpdGlvbmFsbHksIHRoZSBhdXRoZW50aWNhdGlvbiBzcG9vZmluZyBhbmQgYXV0aGVudGljYXRpb24gZGF0YQotdmVyaWZpY2F0aW9uIGFuZCBzdWJzdGl0dXRpb24gb2NjdXIgb24gdGhlIGNsaWVudCBzaWRlLgotVGhlIHNlY3VyaXR5IHJpc2sgb2YgdXNpbmcgWDExIGZvcndhcmRpbmcgaXMgdGhhdCB0aGUgY2xpZW50J3MgWDExCi1kaXNwbGF5IHNlcnZlciBtYXkgYmUgZXhwb3NlZCB0byBhdHRhY2sgd2hlbiB0aGUgU1NIIGNsaWVudCByZXF1ZXN0cwotZm9yd2FyZGluZyAoc2VlIHRoZSB3YXJuaW5ncyBmb3IKLS5DbSBGb3J3YXJkWDExCi1pbgotLlhyIHNzaF9jb25maWcgNSApIC4KLUEgc3lzdGVtIGFkbWluaXN0cmF0b3IgbWF5IGhhdmUgYSBzdGFuY2UgaW4gd2hpY2ggdGhleSB3YW50IHRvCi1wcm90ZWN0IGNsaWVudHMgdGhhdCBtYXkgZXhwb3NlIHRoZW1zZWx2ZXMgdG8gYXR0YWNrIGJ5IHVud2l0dGluZ2x5Ci1yZXF1ZXN0aW5nIFgxMSBmb3J3YXJkaW5nLCB3aGljaCBjYW4gd2FycmFudCBhCi0uRHEgbm8KLXNldHRpbmcuCi0uUHAKLU5vdGUgdGhhdCBkaXNhYmxpbmcgWDExIGZvcndhcmRpbmcgZG9lcyBub3QgcHJldmVudCB1c2VycyBmcm9tCi1mb3J3YXJkaW5nIFgxMSB0cmFmZmljLCBhcyB1c2VycyBjYW4gYWx3YXlzIGluc3RhbGwgdGhlaXIgb3duIGZvcndhcmRlcnMuCi1YMTEgZm9yd2FyZGluZyBpcyBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIGlmCi0uQ20gVXNlTG9naW4KLWlzIGVuYWJsZWQuCi0uSXQgQ20gWDExVXNlTG9jYWxob3N0Ci1TcGVjaWZpZXMgd2hldGhlcgotLlhyIHNzaGQgOAotc2hvdWxkIGJpbmQgdGhlIFgxMSBmb3J3YXJkaW5nIHNlcnZlciB0byB0aGUgbG9vcGJhY2sgYWRkcmVzcyBvciB0bwotdGhlIHdpbGRjYXJkIGFkZHJlc3MuCi1CeSBkZWZhdWx0LAotc3NoZCBiaW5kcyB0aGUgZm9yd2FyZGluZyBzZXJ2ZXIgdG8gdGhlIGxvb3BiYWNrIGFkZHJlc3MgYW5kIHNldHMgdGhlCi1ob3N0bmFtZSBwYXJ0IG9mIHRoZQotLkV2IERJU1BMQVkKLWVudmlyb25tZW50IHZhcmlhYmxlIHRvCi0uRHEgbG9jYWxob3N0IC4KLVRoaXMgcHJldmVudHMgcmVtb3RlIGhvc3RzIGZyb20gY29ubmVjdGluZyB0byB0aGUgcHJveHkgZGlzcGxheS4KLUhvd2V2ZXIsIHNvbWUgb2xkZXIgWDExIGNsaWVudHMgbWF5IG5vdCBmdW5jdGlvbiB3aXRoIHRoaXMKLWNvbmZpZ3VyYXRpb24uCi0uQ20gWDExVXNlTG9jYWxob3N0Ci1tYXkgYmUgc2V0IHRvCi0uRHEgbm8KLXRvIHNwZWNpZnkgdGhhdCB0aGUgZm9yd2FyZGluZyBzZXJ2ZXIgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSB3aWxkY2FyZAotYWRkcmVzcy4KLVRoZSBhcmd1bWVudCBtdXN0IGJlCi0uRHEgeWVzCi1vcgotLkRxIG5vIC4KLVRoZSBkZWZhdWx0IGlzCi0uRHEgeWVzIC4KLS5JdCBDbSBYQXV0aExvY2F0aW9uCi1TcGVjaWZpZXMgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlCi0uWHIgeGF1dGggMQotcHJvZ3JhbS4KLVRoZSBkZWZhdWx0IGlzCi0uUGEgL3Vzci9YMTFSNi9iaW4veGF1dGggLgotLkVsCi0uU2ggVElNRSBGT1JNQVRTCi0uWHIgc3NoZCA4Ci1jb21tYW5kLWxpbmUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9ucyB0aGF0IHNwZWNpZnkgdGltZQotbWF5IGJlIGV4cHJlc3NlZCB1c2luZyBhIHNlcXVlbmNlIG9mIHRoZSBmb3JtOgotLlNtIG9mZgotLkFyIHRpbWUgT3AgQXIgcXVhbGlmaWVyICwKLS5TbSBvbgotd2hlcmUKLS5BciB0aW1lCi1pcyBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUgYW5kCi0uQXIgcXVhbGlmaWVyCi1pcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLS5QcAotLkJsIC10YWcgLXdpZHRoIERzIC1jb21wYWN0IC1vZmZzZXQgaW5kZW50Ci0uSXQgQXEgQ20gbm9uZQotc2Vjb25kcwotLkl0IENtIHMgfCBDbSBTCi1zZWNvbmRzCi0uSXQgQ20gbSB8IENtIE0KLW1pbnV0ZXMKLS5JdCBDbSBoIHwgQ20gSAotaG91cnMKLS5JdCBDbSBkIHwgQ20gRAotZGF5cwotLkl0IENtIHcgfCBDbSBXCi13ZWVrcwotLkVsCi0uUHAKLUVhY2ggbWVtYmVyIG9mIHRoZSBzZXF1ZW5jZSBpcyBhZGRlZCB0b2dldGhlciB0byBjYWxjdWxhdGUKLXRoZSB0b3RhbCB0aW1lIHZhbHVlLgotLlBwCi1UaW1lIGZvcm1hdCBleGFtcGxlczoKLS5QcAotLkJsIC10YWcgLXdpZHRoIERzIC1jb21wYWN0IC1vZmZzZXQgaW5kZW50Ci0uSXQgNjAwCi02MDAgc2Vjb25kcyAoMTAgbWludXRlcykKLS5JdCAxMG0KLTEwIG1pbnV0ZXMKLS5JdCAxaDMwbQotMSBob3VyIDMwIG1pbnV0ZXMgKDkwIG1pbnV0ZXMpCi0uRWwKLS5TaCBGSUxFUwotLkJsIC10YWcgLXdpZHRoIERzCi0uSXQgUGEgL2V0Yy9zc2gvc3NoZF9jb25maWcKLUNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IKLS5YciBzc2hkIDggLgotVGhpcyBmaWxlIHNob3VsZCBiZSB3cml0YWJsZSBieSByb290IG9ubHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZAotKHRob3VnaCBub3QgbmVjZXNzYXJ5KSB0aGF0IGl0IGJlIHdvcmxkLXJlYWRhYmxlLgotLkVsCi0uU2ggU0VFIEFMU08KLS5YciBzc2hkIDgKLS5TaCBBVVRIT1JTCi1PcGVuU1NIIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgYW5kIGZyZWUKLXNzaCAxLjIuMTIgcmVsZWFzZSBieSBUYXR1IFlsb25lbi4KLUFhcm9uIENhbXBiZWxsLCBCb2IgQmVjaywgTWFya3VzIEZyaWVkbCwgTmllbHMgUHJvdm9zLAotVGhlbyBkZSBSYWFkdCBhbmQgRHVnIFNvbmcKLXJlbW92ZWQgbWFueSBidWdzLCByZS1hZGRlZCBuZXdlciBmZWF0dXJlcyBhbmQKLWNyZWF0ZWQgT3BlblNTSC4KLU1hcmt1cyBGcmllZGwgY29udHJpYnV0ZWQgdGhlIHN1cHBvcnQgZm9yIFNTSAotcHJvdG9jb2wgdmVyc2lvbnMgMS41IGFuZCAyLjAuCi1OaWVscyBQcm92b3MgYW5kIE1hcmt1cyBGcmllZGwgY29udHJpYnV0ZWQgc3VwcG9ydAotZm9yIHByaXZpbGVnZSBzZXBhcmF0aW9uLgpkaWZmIC0tZ2l0IGEvc3NoZF9jb25maWcuYW5kcm9pZCBiL3NzaGRfY29uZmlnLmFuZHJvaWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmM2FhNDIuLjAwMDAwMDAKLS0tIGEvc3NoZF9jb25maWcuYW5kcm9pZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0jCSRPcGVuQlNEOiBzc2hkX2NvbmZpZyx2IDEuODQgMjAxMS8wNS8yMyAwMzozMDowNyBkam0gRXhwICQKLQotIyBUaGlzIGlzIHRoZSBzc2hkIHNlcnZlciBzeXN0ZW0td2lkZSBjb25maWd1cmF0aW9uIGZpbGUuICBTZWUKLSMgc3NoZF9jb25maWcoNSkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSMgVGhpcyBzc2hkIHdhcyBjb21waWxlZCB3aXRoIFBBVEg9L3Vzci9iaW46L2JpbjovdXNyL3NiaW46L3NiaW4KLQotIyBUaGUgc3RyYXRlZ3kgdXNlZCBmb3Igb3B0aW9ucyBpbiB0aGUgZGVmYXVsdCBzc2hkX2NvbmZpZyBzaGlwcGVkIHdpdGgKLSMgT3BlblNTSCBpcyB0byBzcGVjaWZ5IG9wdGlvbnMgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlIHdoZXJlCi0jIHBvc3NpYmxlLCBidXQgbGVhdmUgdGhlbSBjb21tZW50ZWQuICBVbmNvbW1lbnRlZCBvcHRpb25zIG92ZXJyaWRlIHRoZQotIyBkZWZhdWx0IHZhbHVlLgotCi0jUG9ydCAyMgotI0FkZHJlc3NGYW1pbHkgYW55Ci0jTGlzdGVuQWRkcmVzcyAwLjAuMC4wCi0jTGlzdGVuQWRkcmVzcyA6OgotCi0jIFRoZSBkZWZhdWx0IHJlcXVpcmVzIGV4cGxpY2l0IGFjdGl2YXRpb24gb2YgcHJvdG9jb2wgMQotUHJvdG9jb2wgMgotCi0jIEhvc3RLZXkgZm9yIHByb3RvY29sIHZlcnNpb24gMQotI0hvc3RLZXkgL2V0Yy9zc2gvc3NoX2hvc3Rfa2V5Ci0jIEhvc3RLZXlzIGZvciBwcm90b2NvbCB2ZXJzaW9uIDIKLUhvc3RLZXkgL2RhdGEvc3NoL3NzaF9ob3N0X3JzYV9rZXkKLUhvc3RLZXkgL2RhdGEvc3NoL3NzaF9ob3N0X2RzYV9rZXkKLQotIyBMaWZldGltZSBhbmQgc2l6ZSBvZiBlcGhlbWVyYWwgdmVyc2lvbiAxIHNlcnZlciBrZXkKLSNLZXlSZWdlbmVyYXRpb25JbnRlcnZhbCAxaAotI1NlcnZlcktleUJpdHMgMTAyNAotCi0jIExvZ2dpbmcKLSMgb2Jzb2xldGVzIFF1aWV0TW9kZSBhbmQgRmFzY2lzdExvZ2dpbmcKLSNTeXNsb2dGYWNpbGl0eSBBVVRICi0jTG9nTGV2ZWwgSU5GTwotCi0jIEF1dGhlbnRpY2F0aW9uOgotCi0jTG9naW5HcmFjZVRpbWUgMm0KLSNQZXJtaXRSb290TG9naW4geWVzCi0jU3RyaWN0TW9kZXMgeWVzCi0jTWF4QXV0aFRyaWVzIDYKLSNNYXhTZXNzaW9ucyAxMAotCi0jUlNBQXV0aGVudGljYXRpb24geWVzCi0jUHVia2V5QXV0aGVudGljYXRpb24geWVzCi0KLSMgVGhlIGRlZmF1bHQgaXMgdG8gY2hlY2sgYm90aCAuc3NoL2F1dGhvcml6ZWRfa2V5cyBhbmQgLnNzaC9hdXRob3JpemVkX2tleXMyCi0jIGJ1dCB0aGlzIGlzIG92ZXJyaWRkZW4gc28gaW5zdGFsbGF0aW9ucyB3aWxsIG9ubHkgY2hlY2sgLnNzaC9hdXRob3JpemVkX2tleXMKLUF1dGhvcml6ZWRLZXlzRmlsZQkvZGF0YS9zc2gvYXV0aG9yaXplZF9rZXlzCi0KLSMgRm9yIHRoaXMgdG8gd29yayB5b3Ugd2lsbCBhbHNvIG5lZWQgaG9zdCBrZXlzIGluIC9ldGMvc3NoL3NzaF9rbm93bl9ob3N0cwotI1Job3N0c1JTQUF1dGhlbnRpY2F0aW9uIG5vCi0jIHNpbWlsYXIgZm9yIHByb3RvY29sIHZlcnNpb24gMgotI0hvc3RiYXNlZEF1dGhlbnRpY2F0aW9uIG5vCi0jIENoYW5nZSB0byB5ZXMgaWYgeW91IGRvbid0IHRydXN0IH4vLnNzaC9rbm93bl9ob3N0cyBmb3IKLSMgUmhvc3RzUlNBQXV0aGVudGljYXRpb24gYW5kIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCi0jSWdub3JlVXNlcktub3duSG9zdHMgbm8KLSMgRG9uJ3QgcmVhZCB0aGUgdXNlcidzIH4vLnJob3N0cyBhbmQgfi8uc2hvc3RzIGZpbGVzCi0jSWdub3JlUmhvc3RzIHllcwotCi0jIFRvIGRpc2FibGUgdHVubmVsZWQgY2xlYXIgdGV4dCBwYXNzd29yZHMsIGNoYW5nZSB0byBubyBoZXJlIQotUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBubwotI1Blcm1pdEVtcHR5UGFzc3dvcmRzIG5vCi0KLSMgQ2hhbmdlIHRvIG5vIHRvIGRpc2FibGUgcy9rZXkgcGFzc3dvcmRzCi0jQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiB5ZXMKLQotIyBLZXJiZXJvcyBvcHRpb25zCi0jS2VyYmVyb3NBdXRoZW50aWNhdGlvbiBubwotI0tlcmJlcm9zT3JMb2NhbFBhc3N3ZCB5ZXMKLSNLZXJiZXJvc1RpY2tldENsZWFudXAgeWVzCi0jS2VyYmVyb3NHZXRBRlNUb2tlbiBubwotCi0jIEdTU0FQSSBvcHRpb25zCi0jR1NTQVBJQXV0aGVudGljYXRpb24gbm8KLSNHU1NBUElDbGVhbnVwQ3JlZGVudGlhbHMgeWVzCi0KLSMgU2V0IHRoaXMgdG8gJ3llcycgdG8gZW5hYmxlIFBBTSBhdXRoZW50aWNhdGlvbiwgYWNjb3VudCBwcm9jZXNzaW5nLCAKLSMgYW5kIHNlc3Npb24gcHJvY2Vzc2luZy4gSWYgdGhpcyBpcyBlbmFibGVkLCBQQU0gYXV0aGVudGljYXRpb24gd2lsbCAKLSMgYmUgYWxsb3dlZCB0aHJvdWdoIHRoZSBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIGFuZAotIyBQYXNzd29yZEF1dGhlbnRpY2F0aW9uLiAgRGVwZW5kaW5nIG9uIHlvdXIgUEFNIGNvbmZpZ3VyYXRpb24sCi0jIFBBTSBhdXRoZW50aWNhdGlvbiB2aWEgQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiBtYXkgYnlwYXNzCi0jIHRoZSBzZXR0aW5nIG9mICJQZXJtaXRSb290TG9naW4gd2l0aG91dC1wYXNzd29yZCIuCi0jIElmIHlvdSBqdXN0IHdhbnQgdGhlIFBBTSBhY2NvdW50IGFuZCBzZXNzaW9uIGNoZWNrcyB0byBydW4gd2l0aG91dAotIyBQQU0gYXV0aGVudGljYXRpb24sIHRoZW4gZW5hYmxlIHRoaXMgYnV0IHNldCBQYXNzd29yZEF1dGhlbnRpY2F0aW9uCi0jIGFuZCBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIHRvICdubycuCi0jVXNlUEFNIG5vCi0KLSNBbGxvd0FnZW50Rm9yd2FyZGluZyB5ZXMKLSNBbGxvd1RjcEZvcndhcmRpbmcgeWVzCi0jR2F0ZXdheVBvcnRzIG5vCi0jWDExRm9yd2FyZGluZyBubwotI1gxMURpc3BsYXlPZmZzZXQgMTAKLSNYMTFVc2VMb2NhbGhvc3QgeWVzCi0jUHJpbnRNb3RkIHllcwotI1ByaW50TGFzdExvZyB5ZXMKLSNUQ1BLZWVwQWxpdmUgeWVzCi0jVXNlTG9naW4gbm8KLSNVc2VQcml2aWxlZ2VTZXBhcmF0aW9uIHllcwotI1Blcm1pdFVzZXJFbnZpcm9ubWVudCBubwotI0NvbXByZXNzaW9uIGRlbGF5ZWQKLSNDbGllbnRBbGl2ZUludGVydmFsIDAKLSNDbGllbnRBbGl2ZUNvdW50TWF4IDMKLSNVc2VETlMgeWVzCi0jUGlkRmlsZSAvdmFyL3J1bi9zc2hkLnBpZAotI01heFN0YXJ0dXBzIDEwCi0jUGVybWl0VHVubmVsIG5vCi0jQ2hyb290RGlyZWN0b3J5IG5vbmUKLQotIyBubyBkZWZhdWx0IGJhbm5lciBwYXRoCi0jQmFubmVyIG5vbmUKLQotIyBvdmVycmlkZSBkZWZhdWx0IG9mIG5vIHN1YnN5c3RlbXMKLVN1YnN5c3RlbQlzZnRwCS91c3IvbGliZXhlYy9zZnRwLXNlcnZlcgotCi0jIEV4YW1wbGUgb2Ygb3ZlcnJpZGluZyBzZXR0aW5ncyBvbiBhIHBlci11c2VyIGJhc2lzCi0jTWF0Y2ggVXNlciBhbm9uY3ZzCi0jCVgxMUZvcndhcmRpbmcgbm8KLSMJQWxsb3dUY3BGb3J3YXJkaW5nIG5vCi0jCUZvcmNlQ29tbWFuZCBjdnMgc2VydmVyCmRpZmYgLS1naXQgYS9zc2hsb2dpbi5jIGIvc3NobG9naW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2MjlmNy4uMDAwMDAwMAotLS0gYS9zc2hsb2dpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qICRPcGVuQlNEOiBzc2hsb2dpbi5jLHYgMS4yNyAyMDExLzAxLzExIDA2OjA2OjA5IGRqbSBFeHAgJCAqLwotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIFRoaXMgZmlsZSBwZXJmb3JtcyBzb21lIG9mIHRoZSB0aGluZ3MgbG9naW4oMSkgbm9ybWFsbHkgZG9lcy4gIFdlIGNhbm5vdAotICogZWFzaWx5IHVzZSBzb21ldGhpbmcgbGlrZSBsb2dpbiAtcCAtaCBob3N0IC1mIHVzZXIsIGJlY2F1c2UgdGhlcmUgYXJlCi0gKiBzZXZlcmFsIGRpZmZlcmVudCBsb2dpbnMgYXJvdW5kLCBhbmQgaXQgaXMgaGFyZCB0byBkZXRlcm1pbmVkIHdoYXQga2luZCBvZgotICogbG9naW4gdGhlIGN1cnJlbnQgc3lzdGVtIGhhcy4gIEFsc28sIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBleGVjdXRlIGNvbW1hbmRzCi0gKiBvbiBhIHR0eS4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUaGVvIGRlIFJhYWR0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMTk5OSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJsb2dpbnJlYy5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgImJ1ZmZlci5oIgotI2luY2x1ZGUgInNlcnZjb25mLmgiCi0KLWV4dGVybiBCdWZmZXIgbG9naW5tc2c7Ci1leHRlcm4gU2VydmVyT3B0aW9ucyBvcHRpb25zOwotCi0vKgotICogUmV0dXJucyB0aGUgdGltZSB3aGVuIHRoZSB1c2VyIGxhc3QgbG9nZ2VkIGluLiAgUmV0dXJucyAwIGlmIHRoZQotICogaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJlY29yZF9sb2dpbi4KLSAqIFRoZSBob3N0IHRoZSB1c2VyIGxvZ2dlZCBpbiBmcm9tIHdpbGwgYmUgcmV0dXJuZWQgaW4gYnVmLgotICovCi10aW1lX3QKLWdldF9sYXN0X2xvZ2luX3RpbWUodWlkX3QgdWlkLCBjb25zdCBjaGFyICpsb2duYW1lLAotICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpCi17Ci0Jc3RydWN0IGxvZ2luaW5mbyBsaTsKLQotCWxvZ2luX2dldF9sYXN0bG9nKCZsaSwgdWlkKTsKLQlzdHJsY3B5KGJ1ZiwgbGkuaG9zdG5hbWUsIGJ1ZnNpemUpOwotCXJldHVybiAodGltZV90KWxpLnR2X3NlYzsKLX0KLQotLyoKLSAqIEdlbmVyYXRlIGFuZCBzdG9yZSBsYXN0IGxvZ2luIG1lc3NhZ2UuICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKLSAqIGxvZ2luX2xvZ2luKCkgaXMgY2FsbGVkIGFuZCBsYXN0bG9nIGlzIHVwZGF0ZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1zdG9yZV9sYXN0bG9nX21lc3NhZ2UoY29uc3QgY2hhciAqdXNlciwgdWlkX3QgdWlkKQotewotI2lmbmRlZiBOT19TU0hfTEFTVExPRwotCWNoYXIgKnRpbWVfc3RyaW5nLCBob3N0bmFtZVtNQVhIT1NUTkFNRUxFTl0gPSAiIiwgYnVmWzUxMl07Ci0JdGltZV90IGxhc3RfbG9naW5fdGltZTsKLQotCWlmICghb3B0aW9ucy5wcmludF9sYXN0bG9nKQotCQlyZXR1cm47Ci0KLSMgaWZkZWYgQ1VTVE9NX1NZU19BVVRIX0dFVF9MQVNUTE9HSU5fTVNHCi0JdGltZV9zdHJpbmcgPSBzeXNfYXV0aF9nZXRfbGFzdGxvZ2luX21zZyh1c2VyLCB1aWQpOwotCWlmICh0aW1lX3N0cmluZyAhPSBOVUxMKSB7Ci0JCWJ1ZmZlcl9hcHBlbmQoJmxvZ2lubXNnLCB0aW1lX3N0cmluZywgc3RybGVuKHRpbWVfc3RyaW5nKSk7Ci0JCXhmcmVlKHRpbWVfc3RyaW5nKTsKLQl9Ci0jIGVsc2UKLQlsYXN0X2xvZ2luX3RpbWUgPSBnZXRfbGFzdF9sb2dpbl90aW1lKHVpZCwgdXNlciwgaG9zdG5hbWUsCi0JICAgIHNpemVvZihob3N0bmFtZSkpOwotCi0JaWYgKGxhc3RfbG9naW5fdGltZSAhPSAwKSB7Ci0JCXRpbWVfc3RyaW5nID0gY3RpbWUoJmxhc3RfbG9naW5fdGltZSk7Ci0JCXRpbWVfc3RyaW5nW3N0cmNzcG4odGltZV9zdHJpbmcsICJcbiIpXSA9ICdcMCc7Ci0JCWlmIChzdHJjbXAoaG9zdG5hbWUsICIiKSA9PSAwKQotCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkxhc3QgbG9naW46ICVzXHJcbiIsCi0JCQkgICAgdGltZV9zdHJpbmcpOwotCQllbHNlCi0JCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiTGFzdCBsb2dpbjogJXMgZnJvbSAlc1xyXG4iLAotCQkJICAgIHRpbWVfc3RyaW5nLCBob3N0bmFtZSk7Ci0JCWJ1ZmZlcl9hcHBlbmQoJmxvZ2lubXNnLCBidWYsIHN0cmxlbihidWYpKTsKLQl9Ci0jIGVuZGlmIC8qIENVU1RPTV9TWVNfQVVUSF9HRVRfTEFTVExPR0lOX01TRyAqLwotI2VuZGlmIC8qIE5PX1NTSF9MQVNUTE9HICovCi19Ci0KLS8qCi0gKiBSZWNvcmRzIHRoYXQgdGhlIHVzZXIgaGFzIGxvZ2dlZCBpbi4gIEkgd2lzaCB0aGVzZSBwYXJ0cyBvZiBvcGVyYXRpbmcKLSAqIHN5c3RlbXMgd2VyZSBtb3JlIHN0YW5kYXJkaXplZC4KLSAqLwotdm9pZAotcmVjb3JkX2xvZ2luKHBpZF90IHBpZCwgY29uc3QgY2hhciAqdHR5LCBjb25zdCBjaGFyICp1c2VyLCB1aWRfdCB1aWQsCi0gICAgY29uc3QgY2hhciAqaG9zdCwgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgYWRkcmxlbikKLXsKLQlzdHJ1Y3QgbG9naW5pbmZvICpsaTsKLQotCS8qIHNhdmUgcHJldmlvdXMgbG9naW4gZGV0YWlscyBiZWZvcmUgd3JpdGluZyBuZXcgKi8KLQlzdG9yZV9sYXN0bG9nX21lc3NhZ2UodXNlciwgdWlkKTsKLQotCWxpID0gbG9naW5fYWxsb2NfZW50cnkocGlkLCB1c2VyLCBob3N0LCB0dHkpOwotCWxvZ2luX3NldF9hZGRyKGxpLCBhZGRyLCBhZGRybGVuKTsKLQlsb2dpbl9sb2dpbihsaSk7Ci0JbG9naW5fZnJlZV9lbnRyeShsaSk7Ci19Ci0KLSNpZmRlZiBMT0dJTl9ORUVEU19VVE1QWAotdm9pZAotcmVjb3JkX3V0bXBfb25seShwaWRfdCBwaWQsIGNvbnN0IGNoYXIgKnR0eW5hbWUsIGNvbnN0IGNoYXIgKnVzZXIsCi0JCSBjb25zdCBjaGFyICpob3N0LCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNvY2tsZW5fdCBhZGRybGVuKQotewotCXN0cnVjdCBsb2dpbmluZm8gKmxpOwotCi0JbGkgPSBsb2dpbl9hbGxvY19lbnRyeShwaWQsIHVzZXIsIGhvc3QsIHR0eW5hbWUpOwotCWxvZ2luX3NldF9hZGRyKGxpLCBhZGRyLCBhZGRybGVuKTsKLQlsb2dpbl91dG1wX29ubHkobGkpOwotCWxvZ2luX2ZyZWVfZW50cnkobGkpOwotfQotI2VuZGlmCi0KLS8qIFJlY29yZHMgdGhhdCB0aGUgdXNlciBoYXMgbG9nZ2VkIG91dC4gKi8KLXZvaWQKLXJlY29yZF9sb2dvdXQocGlkX3QgcGlkLCBjb25zdCBjaGFyICp0dHksIGNvbnN0IGNoYXIgKnVzZXIpCi17Ci0Jc3RydWN0IGxvZ2luaW5mbyAqbGk7Ci0KLQlsaSA9IGxvZ2luX2FsbG9jX2VudHJ5KHBpZCwgdXNlciwgTlVMTCwgdHR5KTsKLQlsb2dpbl9sb2dvdXQobGkpOwotCWxvZ2luX2ZyZWVfZW50cnkobGkpOwotfQpkaWZmIC0tZ2l0IGEvc3NobG9naW4uaCBiL3NzaGxvZ2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMGQzZmUuLjAwMDAwMDAKLS0tIGEvc3NobG9naW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qICRPcGVuQlNEOiBzc2hsb2dpbi5oLHYgMS44IDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLwotCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLQotdm9pZAlyZWNvcmRfbG9naW4ocGlkX3QsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB1aWRfdCwKLSAgICBjb25zdCBjaGFyICosIHN0cnVjdCBzb2NrYWRkciAqLCBzb2NrbGVuX3QpOwotdm9pZCAgIHJlY29yZF9sb2dvdXQocGlkX3QsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLXRpbWVfdAlnZXRfbGFzdF9sb2dpbl90aW1lKHVpZF90LCBjb25zdCBjaGFyICosIGNoYXIgKiwgdV9pbnQpOwotCi0jaWZkZWYgTE9HSU5fTkVFRFNfVVRNUFgKLXZvaWQJcmVjb3JkX3V0bXBfb25seShwaWRfdCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkJc3RydWN0IHNvY2thZGRyICosIHNvY2tsZW5fdCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NzaHB0eS5jIGIvc3NocHR5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZDA0MWIuLjAwMDAwMDAKLS0tIGEvc3NocHR5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNzaHB0eS5jLHYgMS4yOCAyMDA3LzA5LzExIDIzOjQ5OjA5IHN0ZXZlc2sgRXhwICQgKi8KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiBBbGxvY2F0aW5nIGEgcHNldWRvLXRlcm1pbmFsLCBhbmQgbWFraW5nIGl0IHRoZSBjb250cm9sbGluZyB0dHkuCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8Z3JwLmg+Ci0jaWZkZWYgSEFWRV9QQVRIU19ICi0jIGluY2x1ZGUgPHBhdGhzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaWZkZWYgSEFWRV9VVElMX0gKLSMgaW5jbHVkZSA8dXRpbC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJzc2hwdHkuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJtaXNjLmgiCi0KLSNpZmRlZiBIQVZFX1BUWV9ICi0jIGluY2x1ZGUgPHB0eS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgT19OT0NUVFkKLSNkZWZpbmUgT19OT0NUVFkgMAotI2VuZGlmCi0KLSNpZmRlZiBfX0FQUExFX18KLSMgaW5jbHVkZSA8QXZhaWxhYmlsaXR5TWFjcm9zLmg+Ci0jIGlmIChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEID49IE1BQ19PU19YX1ZFUlNJT05fMTBfNSkKLSMgIGRlZmluZSBfX0FQUExFX1BSSVZQVFlfXwotIyBlbmRpZgotI2VuZGlmCi0KLS8qCi0gKiBBbGxvY2F0ZXMgYW5kIG9wZW5zIGEgcHR5LiAgUmV0dXJucyAwIGlmIG5vIHB0eSBjb3VsZCBiZSBhbGxvY2F0ZWQsIG9yCi0gKiBub256ZXJvIGlmIGEgcHR5IHdhcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLiAgT24gc3VjY2Vzcywgb3BlbiBmaWxlCi0gKiBkZXNjcmlwdG9ycyBmb3IgdGhlIHB0eSBhbmQgdHR5IHNpZGVzIGFuZCB0aGUgbmFtZSBvZiB0aGUgdHR5IHNpZGUgYXJlCi0gKiByZXR1cm5lZCAodGhlIGJ1ZmZlciBtdXN0IGJlIGFibGUgdG8gaG9sZCBhdCBsZWFzdCA2NCBjaGFyYWN0ZXJzKS4KLSAqLwotCi1pbnQKLXB0eV9hbGxvY2F0ZShpbnQgKnB0eWZkLCBpbnQgKnR0eWZkLCBjaGFyICpuYW1lYnVmLCBzaXplX3QgbmFtZWJ1ZmxlbikKLXsKLQkvKiBvcGVucHR5KDMpIGV4aXN0cyBpbiBPU0YvMSBhbmQgc29tZSBvdGhlciBvcydlcyAqLwotCWNoYXIgKm5hbWU7Ci0JaW50IGk7Ci0KLQlpID0gb3BlbnB0eShwdHlmZCwgdHR5ZmQsIE5VTEwsIE5VTEwsIE5VTEwpOwotCWlmIChpIDwgMCkgewotCQllcnJvcigib3BlbnB0eTogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIDA7Ci0JfQotI2lmZGVmIEFORFJPSUQKLQkvKiBBbmRyb2lkIGRvZXMgbm90IGhhdmUgYSB3b3JraW5nIHR0eW5hbWUoKSAqLwotCW5hbWUgPSAiL2Rldi9wdG14IjsKLSNlbHNlCi0JbmFtZSA9IHR0eW5hbWUoKnR0eWZkKTsKLQlpZiAoIW5hbWUpCi0JCWZhdGFsKCJvcGVucHR5IHJldHVybnMgZGV2aWNlIGZvciB3aGljaCB0dHluYW1lIGZhaWxzLiIpOwotI2VuZGlmCi0KLQlzdHJsY3B5KG5hbWVidWYsIG5hbWUsIG5hbWVidWZsZW4pOwkvKiBwb3NzaWJsZSB0cnVuY2F0aW9uICovCi0JcmV0dXJuIDE7Ci19Ci0KLS8qIFJlbGVhc2VzIHRoZSB0dHkuICBJdHMgb3duZXJzaGlwIGlzIHJldHVybmVkIHRvIHJvb3QsIGFuZCBwZXJtaXNzaW9ucyB0byAwNjY2LiAqLwotCi12b2lkCi1wdHlfcmVsZWFzZShjb25zdCBjaGFyICp0dHkpCi17Ci0jaWZuZGVmIF9fQVBQTEVfUFJJVlBUWV9fCi0JaWYgKGNob3duKHR0eSwgKHVpZF90KSAwLCAoZ2lkX3QpIDApIDwgMCkKLQkJZXJyb3IoImNob3duICUuMTAwcyAwIDAgZmFpbGVkOiAlLjEwMHMiLCB0dHksIHN0cmVycm9yKGVycm5vKSk7Ci0JaWYgKGNobW9kKHR0eSwgKG1vZGVfdCkgMDY2NikgPCAwKQotCQllcnJvcigiY2htb2QgJS4xMDBzIDA2NjYgZmFpbGVkOiAlLjEwMHMiLCB0dHksIHN0cmVycm9yKGVycm5vKSk7Ci0jZW5kaWYgLyogX19BUFBMRV9QUklWUFRZX18gKi8KLX0KLQotLyogTWFrZXMgdGhlIHR0eSB0aGUgcHJvY2VzcydzIGNvbnRyb2xsaW5nIHR0eSBhbmQgc2V0cyBpdCB0byBzYW5lIG1vZGVzLiAqLwotCi12b2lkCi1wdHlfbWFrZV9jb250cm9sbGluZ190dHkoaW50ICp0dHlmZCwgY29uc3QgY2hhciAqdHR5KQotewotCWludCBmZDsKLSNpZmRlZiBVU0VfVkhBTkdVUAotCXZvaWQgKm9sZDsKLSNlbmRpZiAvKiBVU0VfVkhBTkdVUCAqLwotCi0jaWZkZWYgX1VOSUNPUwotCWlmIChzZXRzaWQoKSA8IDApCi0JCWVycm9yKCJzZXRzaWQ6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLQlmZCA9IG9wZW4odHR5LCBPX1JEV1J8T19OT0NUVFkpOwotCWlmIChmZCAhPSAtMSkgewotCQlzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKLQkJaW9jdGwoZmQsIFRDVkhVUCwgKGNoYXIgKilOVUxMKTsKLQkJc2lnbmFsKFNJR0hVUCwgU0lHX0RGTCk7Ci0JCXNldHBnaWQoMCwgMCk7Ci0JCWNsb3NlKGZkKTsKLQl9IGVsc2UgewotCQllcnJvcigiRmFpbGVkIHRvIGRpc2Nvbm5lY3QgZnJvbSBjb250cm9sbGluZyB0dHkuIik7Ci0JfQotCi0JZGVidWcoIlNldHRpbmcgY29udHJvbGxpbmcgdHR5IHVzaW5nIFRDU0VUQ1RUWS4iKTsKLQlpb2N0bCgqdHR5ZmQsIFRDU0VUQ1RUWSwgTlVMTCk7Ci0JZmQgPSBvcGVuKCIvZGV2L3R0eSIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXJyb3IoIiUuMTAwczogJS4xMDBzIiwgdHR5LCBzdHJlcnJvcihlcnJubykpOwotCWNsb3NlKCp0dHlmZCk7Ci0JKnR0eWZkID0gZmQ7Ci0jZWxzZSAvKiBfVU5JQ09TICovCi0KLQkvKiBGaXJzdCBkaXNjb25uZWN0IGZyb20gdGhlIG9sZCBjb250cm9sbGluZyB0dHkuICovCi0jaWZkZWYgVElPQ05PVFRZCi0JZmQgPSBvcGVuKF9QQVRIX1RUWSwgT19SRFdSIHwgT19OT0NUVFkpOwotCWlmIChmZCA+PSAwKSB7Ci0JCSh2b2lkKSBpb2N0bChmZCwgVElPQ05PVFRZLCBOVUxMKTsKLQkJY2xvc2UoZmQpOwotCX0KLSNlbmRpZiAvKiBUSU9DTk9UVFkgKi8KLQlpZiAoc2V0c2lkKCkgPCAwKQotCQllcnJvcigic2V0c2lkOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCi0JLyoKLQkgKiBWZXJpZnkgdGhhdCB3ZSBhcmUgc3VjY2Vzc2Z1bGx5IGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBjb250cm9sbGluZwotCSAqIHR0eS4KLQkgKi8KLQlmZCA9IG9wZW4oX1BBVEhfVFRZLCBPX1JEV1IgfCBPX05PQ1RUWSk7Ci0JaWYgKGZkID49IDApIHsKLQkJZXJyb3IoIkZhaWxlZCB0byBkaXNjb25uZWN0IGZyb20gY29udHJvbGxpbmcgdHR5LiIpOwotCQljbG9zZShmZCk7Ci0JfQotCS8qIE1ha2UgaXQgb3VyIGNvbnRyb2xsaW5nIHR0eS4gKi8KLSNpZmRlZiBUSU9DU0NUVFkKLQlkZWJ1ZygiU2V0dGluZyBjb250cm9sbGluZyB0dHkgdXNpbmcgVElPQ1NDVFRZLiIpOwotCWlmIChpb2N0bCgqdHR5ZmQsIFRJT0NTQ1RUWSwgTlVMTCkgPCAwKQotCQllcnJvcigiaW9jdGwoVElPQ1NDVFRZKTogJS4xMDBzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSNlbmRpZiAvKiBUSU9DU0NUVFkgKi8KLSNpZmRlZiBORUVEX1NFVFBHUlAKLQlpZiAoc2V0cGdycCgwLDApIDwgMCkKLQkJZXJyb3IoIlNFVFBHUlAgJXMiLHN0cmVycm9yKGVycm5vKSk7Ci0jZW5kaWYgLyogTkVFRF9TRVRQR1JQICovCi0jaWZkZWYgVVNFX1ZIQU5HVVAKLQlvbGQgPSBzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKLQl2aGFuZ3VwKCk7Ci0Jc2lnbmFsKFNJR0hVUCwgb2xkKTsKLSNlbmRpZiAvKiBVU0VfVkhBTkdVUCAqLwotCWZkID0gb3Blbih0dHksIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkgewotCQllcnJvcigiJS4xMDBzOiAlLjEwMHMiLCB0dHksIHN0cmVycm9yKGVycm5vKSk7Ci0JfSBlbHNlIHsKLSNpZmRlZiBVU0VfVkhBTkdVUAotCQljbG9zZSgqdHR5ZmQpOwotCQkqdHR5ZmQgPSBmZDsKLSNlbHNlIC8qIFVTRV9WSEFOR1VQICovCi0JCWNsb3NlKGZkKTsKLSNlbmRpZiAvKiBVU0VfVkhBTkdVUCAqLwotCX0KLQkvKiBWZXJpZnkgdGhhdCB3ZSBub3cgaGF2ZSBhIGNvbnRyb2xsaW5nIHR0eS4gKi8KLQlmZCA9IG9wZW4oX1BBVEhfVFRZLCBPX1dST05MWSk7Ci0JaWYgKGZkIDwgMCkKLQkJZXJyb3IoIm9wZW4gL2Rldi90dHkgZmFpbGVkIC0gY291bGQgbm90IHNldCBjb250cm9sbGluZyB0dHk6ICUuMTAwcyIsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCWVsc2UKLQkJY2xvc2UoZmQpOwotI2VuZGlmIC8qIF9VTklDT1MgKi8KLX0KLQotLyogQ2hhbmdlcyB0aGUgd2luZG93IHNpemUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwdHkuICovCi0KLXZvaWQKLXB0eV9jaGFuZ2Vfd2luZG93X3NpemUoaW50IHB0eWZkLCB1X2ludCByb3csIHVfaW50IGNvbCwKLQl1X2ludCB4cGl4ZWwsIHVfaW50IHlwaXhlbCkKLXsKLQlzdHJ1Y3Qgd2luc2l6ZSB3OwotCi0JLyogbWF5IHRydW5jYXRlIHVfaW50IC0+IHVfc2hvcnQgKi8KLQl3LndzX3JvdyA9IHJvdzsKLQl3LndzX2NvbCA9IGNvbDsKLQl3LndzX3hwaXhlbCA9IHhwaXhlbDsKLQl3LndzX3lwaXhlbCA9IHlwaXhlbDsKLQkodm9pZCkgaW9jdGwocHR5ZmQsIFRJT0NTV0lOU1osICZ3KTsKLX0KLQotdm9pZAotcHR5X3NldG93bmVyKHN0cnVjdCBwYXNzd2QgKnB3LCBjb25zdCBjaGFyICp0dHkpCi17Ci0Jc3RydWN0IGdyb3VwICpncnA7Ci0JZ2lkX3QgZ2lkOwotCW1vZGVfdCBtb2RlOwotCXN0cnVjdCBzdGF0IHN0OwotCi0JLyogRGV0ZXJtaW5lIHRoZSBncm91cCB0byBtYWtlIHRoZSBvd25lciBvZiB0aGUgdHR5LiAqLwotCWdycCA9IGdldGdybmFtKCJ0dHkiKTsKLQlpZiAoZ3JwKSB7Ci0JCWdpZCA9IGdycC0+Z3JfZ2lkOwotCQltb2RlID0gU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lXR1JQOwotCX0gZWxzZSB7Ci0JCWdpZCA9IHB3LT5wd19naWQ7Ci0JCW1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVdHUlAgfCBTX0lXT1RIOwotCX0KLQotCS8qCi0JICogQ2hhbmdlIG93bmVyIGFuZCBtb2RlIG9mIHRoZSB0dHkgYXMgcmVxdWlyZWQuCi0JICogV2FybiBidXQgY29udGludWUgaWYgZmlsZXN5c3RlbSBpcyByZWFkLW9ubHkgYW5kIHRoZSB1aWRzIG1hdGNoLwotCSAqIHR0eSBpcyBvd25lZCBieSByb290LgotCSAqLwotCWlmIChzdGF0KHR0eSwgJnN0KSkKLQkJZmF0YWwoInN0YXQoJS4xMDBzKSBmYWlsZWQ6ICUuMTAwcyIsIHR0eSwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0KLSNpZmRlZiBXSVRIX1NFTElOVVgKLQlzc2hfc2VsaW51eF9zZXR1cF9wdHkocHctPnB3X25hbWUsIHR0eSk7Ci0jZW5kaWYKLQotCWlmIChzdC5zdF91aWQgIT0gcHctPnB3X3VpZCB8fCBzdC5zdF9naWQgIT0gZ2lkKSB7Ci0JCWlmIChjaG93bih0dHksIHB3LT5wd191aWQsIGdpZCkgPCAwKSB7Ci0JCQlpZiAoZXJybm8gPT0gRVJPRlMgJiYKLQkJCSAgICAoc3Quc3RfdWlkID09IHB3LT5wd191aWQgfHwgc3Quc3RfdWlkID09IDApKQotCQkJCWRlYnVnKCJjaG93biglLjEwMHMsICV1LCAldSkgZmFpbGVkOiAlLjEwMHMiLAotCQkJCSAgICB0dHksICh1X2ludClwdy0+cHdfdWlkLCAodV9pbnQpZ2lkLAotCQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQkJZWxzZQotCQkJCWZhdGFsKCJjaG93biglLjEwMHMsICV1LCAldSkgZmFpbGVkOiAlLjEwMHMiLAotCQkJCSAgICB0dHksICh1X2ludClwdy0+cHdfdWlkLCAodV9pbnQpZ2lkLAotCQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQl9Ci0JfQotCi0JaWYgKChzdC5zdF9tb2RlICYgKFNfSVJXWFV8U19JUldYR3xTX0lSV1hPKSkgIT0gbW9kZSkgewotCQlpZiAoY2htb2QodHR5LCBtb2RlKSA8IDApIHsKLQkJCWlmIChlcnJubyA9PSBFUk9GUyAmJgotCQkJICAgIChzdC5zdF9tb2RlICYgKFNfSVJHUlAgfCBTX0lST1RIKSkgPT0gMCkKLQkJCQlkZWJ1ZygiY2htb2QoJS4xMDBzLCAwJW8pIGZhaWxlZDogJS4xMDBzIiwKLQkJCQkgICAgdHR5LCAodV9pbnQpbW9kZSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCWVsc2UKLQkJCQlmYXRhbCgiY2htb2QoJS4xMDBzLCAwJW8pIGZhaWxlZDogJS4xMDBzIiwKLQkJCQkgICAgdHR5LCAodV9pbnQpbW9kZSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3NzaHB0eS5oIGIvc3NocHR5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYTMyMjQuLjAwMDAwMDAKLS0tIGEvc3NocHR5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiAkT3BlbkJTRDogc3NocHR5LmgsdiAxLjEyIDIwMTAvMDEvMDkgMDU6MDQ6MjQgZGptIEV4cCAkICovCi0KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiBGdW5jdGlvbnMgZm9yIGFsbG9jYXRpbmcgYSBwc2V1ZG8tdGVybWluYWwgYW5kIG1ha2luZyBpdCB0aGUgY29udHJvbGxpbmcKLSAqIHR0eS4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0KLXN0cnVjdCB0ZXJtaW9zICpnZXRfc2F2ZWRfdGlvKHZvaWQpOwotdm9pZAkgbGVhdmVfcmF3X21vZGUoaW50KTsKLXZvaWQJIGVudGVyX3Jhd19tb2RlKGludCk7Ci0KLWludAkgcHR5X2FsbG9jYXRlKGludCAqLCBpbnQgKiwgY2hhciAqLCBzaXplX3QpOwotdm9pZAkgcHR5X3JlbGVhc2UoY29uc3QgY2hhciAqKTsKLXZvaWQJIHB0eV9tYWtlX2NvbnRyb2xsaW5nX3R0eShpbnQgKiwgY29uc3QgY2hhciAqKTsKLXZvaWQJIHB0eV9jaGFuZ2Vfd2luZG93X3NpemUoaW50LCB1X2ludCwgdV9pbnQsIHVfaW50LCB1X2ludCk7Ci12b2lkCSBwdHlfc2V0b3duZXIoc3RydWN0IHBhc3N3ZCAqLCBjb25zdCBjaGFyICopOwpkaWZmIC0tZ2l0IGEvc3NodHR5LmMgYi9zc2h0dHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxNGNlMy4uMDAwMDAwMAotLS0gYS9zc2h0dHkuYworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qICRPcGVuQlNEOiBzc2h0dHkuYyx2IDEuMTQgMjAxMC8wMS8wOSAwNTowNDoyNCBkam0gRXhwICQgKi8KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwMSBLZXZpbiBTdGV2ZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPHB3ZC5oPgotCi0jaW5jbHVkZSAic3NocHR5LmgiCi0KLXN0YXRpYyBzdHJ1Y3QgdGVybWlvcyBfc2F2ZWRfdGlvOwotc3RhdGljIGludCBfaW5fcmF3X21vZGUgPSAwOwotCi1zdHJ1Y3QgdGVybWlvcyAqCi1nZXRfc2F2ZWRfdGlvKHZvaWQpCi17Ci0JcmV0dXJuIF9pbl9yYXdfbW9kZSA/ICZfc2F2ZWRfdGlvIDogTlVMTDsKLX0KLQotdm9pZAotbGVhdmVfcmF3X21vZGUoaW50IHF1aWV0KQotewotCWlmICghX2luX3Jhd19tb2RlKQotCQlyZXR1cm47Ci0JaWYgKHRjc2V0YXR0cihmaWxlbm8oc3RkaW4pLCBUQ1NBRFJBSU4sICZfc2F2ZWRfdGlvKSA9PSAtMSkgewotCQlpZiAoIXF1aWV0KQotCQkJcGVycm9yKCJ0Y3NldGF0dHIiKTsKLQl9IGVsc2UKLQkJX2luX3Jhd19tb2RlID0gMDsKLX0KLQotdm9pZAotZW50ZXJfcmF3X21vZGUoaW50IHF1aWV0KQotewotCXN0cnVjdCB0ZXJtaW9zIHRpbzsKLQotCWlmICh0Y2dldGF0dHIoZmlsZW5vKHN0ZGluKSwgJnRpbykgPT0gLTEpIHsKLQkJaWYgKCFxdWlldCkKLQkJCXBlcnJvcigidGNnZXRhdHRyIik7Ci0JCXJldHVybjsKLQl9Ci0JX3NhdmVkX3RpbyA9IHRpbzsKLQl0aW8uY19pZmxhZyB8PSBJR05QQVI7Ci0JdGlvLmNfaWZsYWcgJj0gfihJU1RSSVAgfCBJTkxDUiB8IElHTkNSIHwgSUNSTkwgfCBJWE9OIHwgSVhBTlkgfCBJWE9GRik7Ci0jaWZkZWYgSVVDTEMKLQl0aW8uY19pZmxhZyAmPSB+SVVDTEM7Ci0jZW5kaWYKLQl0aW8uY19sZmxhZyAmPSB+KElTSUcgfCBJQ0FOT04gfCBFQ0hPIHwgRUNIT0UgfCBFQ0hPSyB8IEVDSE9OTCk7Ci0jaWZkZWYgSUVYVEVOCi0JdGlvLmNfbGZsYWcgJj0gfklFWFRFTjsKLSNlbmRpZgotCXRpby5jX29mbGFnICY9IH5PUE9TVDsKLQl0aW8uY19jY1tWTUlOXSA9IDE7Ci0JdGlvLmNfY2NbVlRJTUVdID0gMDsKLQlpZiAodGNzZXRhdHRyKGZpbGVubyhzdGRpbiksIFRDU0FEUkFJTiwgJnRpbykgPT0gLTEpIHsKLQkJaWYgKCFxdWlldCkKLQkJCXBlcnJvcigidGNzZXRhdHRyIik7Ci0JfSBlbHNlCi0JCV9pbl9yYXdfbW9kZSA9IDE7Ci19CmRpZmYgLS1naXQgYS9zdGFydC1zc2ggYi9zdGFydC1zc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmNGIyMzMuLjAwMDAwMDAKLS0tIGEvc3RhcnQtc3NoCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyEvc3lzdGVtL2Jpbi9zaAotCi11bWFzayAwNzcKLQotIyBERUJVRz0xCi0KLURTQV9LRVk9L2RhdGEvc3NoL3NzaF9ob3N0X2RzYV9rZXkKLURTQV9QVUJfS0VZPS9kYXRhL3NzaC9zc2hfaG9zdF9kc2Ffa2V5LnB1YgotUlNBX0tFWT0vZGF0YS9zc2gvc3NoX2hvc3RfcnNhX2tleQotUlNBX1BVQl9LRVk9L2RhdGEvc3NoL3NzaF9ob3N0X3JzYV9rZXkucHViCi1BVVRIT1JJWkVEX0tFWVM9L2RhdGEvc3NoL2F1dGhvcml6ZWRfa2V5cwotREVGQVVMVF9BVVRIT1JJWkVEX0tFWVM9L3N5c3RlbS9ldGMvc2VjdXJpdHkvYXV0aG9yaXplZF9rZXlzLmRlZmF1bHQKLQotaWYgWyAhIC1mICREU0FfS0VZIF07IHRoZW4KLSAgICBzc2gta2V5Z2VuIC10IGRzYSAtZiAkRFNBX0tFWSAtTiAiIgotICAgIGNobW9kIDYwMCAvJERTQV9LRVkKLSAgICBjaG1vZCA2NDQgJERTQV9QVUJfS0VZCi1maQotCi1pZiBbICEgLWYgJFJTQV9LRVkgXTsgdGhlbgotICAgIC9zeXN0ZW0vYmluL3NzaC1rZXlnZW4gLXQgcnNhIC1mICRSU0FfS0VZIC1OICIiCi0gICAgY2htb2QgNjAwIC8kUlNBX0tFWQotICAgIGNobW9kIDY0NCAkUlNBX1BVQl9LRVkKLWZpCi0KLWlmIFtbICEgLWYgJEFVVEhPUklaRURfS0VZUyAmJiAtZiAkREVGQVVMVF9BVVRIT1JJWkVEX0tFWVMgXV07IHRoZW4KLSAgICBjYXQgJERFRkFVTFRfQVVUSE9SSVpFRF9LRVlTID4gJEFVVEhPUklaRURfS0VZUwotZmkKLQotCi1pZiBbICIxIiA9PSAiJERFQlVHIiBdIDsgdGhlbgotICAgICMgcnVuIHNzaGQgaW4gZGVidWcgbW9kZSBhbmQgY2FwdHVyZSBvdXRwdXQgdG8gbG9nY2F0Ci0gICAgL3N5c3RlbS9iaW4vbG9nd3JhcHBlciAvc3lzdGVtL2Jpbi9zc2hkIC1mIC9zeXN0ZW0vZXRjL3NzaC9zc2hkX2NvbmZpZyAtRCAtZAotZWxzZQotICAgICMgZG9uJ3QgZGFlbW9uaXplIC0gb3RoZXJ3aXNlIHdlIGNhbid0IHN0b3AgdGhlIHNzaGQgc2VydmljZQotICAgIC9zeXN0ZW0vYmluL3NzaGQgLWYgL3N5c3RlbS9ldGMvc3NoL3NzaGRfY29uZmlnIC1ECi1maQpkaWZmIC0tZ2l0IGEvc3VydmV5LnNoLmluIGIvc3VydmV5LnNoLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjA3NWE2Li4wMDAwMDAwCi0tLSBhL3N1cnZleS5zaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgRGFycmVuIFR1Y2tlcgotIwotIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotIwotIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotIyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0jIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotIyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi1ob3N0PSJAaG9zdEAiCi1BV0s9IkBBV0tAIgotQ0M9IkBDQ0AiCi1DUFA9IkBDUFBAIgotQ0ZMQUdTPSJAQ0ZMQUdTQCIKLUNQUEZMQUdTPSJAQ1BQRkxBR1NAIgotTERGTEFHUz0iQExERkxBR1NAIgotTElCUz0iQExJQlNAIgotCi0jIE5vdGUgZm9ybWF0OgotIyBpZGVudGlmaWVyOiBbZGF0YV0gQ1JDUgotCi1lY2hvICJvcGVuc3NoLXN1cnZleS12ZXJzaW9uOiAxIgotZWNobwotZWNobyAib3BlbnNzaC12ZXJzaW9uOiBgLi9zc2ggLVYgMj4mMWAiCi1lY2hvCi1jb25maWdpbnY9YCRBV0sgJy9eICBcXFwkLipjb25maWd1cmUvJyBjb25maWcubG9nIHwgc2VkICdzL14gIFxcXCQgLy9nJ2AKLWVjaG8gImNvbmZpZ3VyZS1pbnZvY2F0aW9uOiAkY29uZmlnaW52IgotZWNobwotZWNobyAiaG9zdDogJGhvc3QiCi1lY2hvCi1lY2hvICJ1bmFtZTogYHVuYW1lYCIKLWVjaG8KLWVjaG8gInVuYW1lLXI6IGB1bmFtZSAtcmAiCi1lY2hvCi1lY2hvICJ1bmFtZS1tOiBgdW5hbWUgLW1gIgotZWNobwotZWNobyAidW5hbWUtcDogYHVuYW1lIC1wYCIKLWVjaG8KLWVjaG8gIm9zbGV2ZWw6IGBvc2xldmVsIDI+L2Rldi9udWxsYCIKLWVjaG8KLWVjaG8gIm9zbGV2ZWwtcjogYG9zbGV2ZWwgLXIgMj4vZGV2L251bGxgIgotZWNobwotZWNobyAiY2M6ICRDQyIKLWVjaG8KLWVjaG8gImNmbGFnczogJENGTEFHUyIKLWVjaG8KLWVjaG8gImNwcGZsYWdzOiAkQ1BQRkxBR1MiCi1lY2hvCi1lY2hvICJsZGZsYWdzOiAkTERGTEFHUyIKLWVjaG8KLWVjaG8gImxpYnM6ICRMSUJTIgotZWNobwotZWNobyAiY2N2ZXItdjogYCRDQyAtdiAyPiYxIHwgc2VkICcvXlsgXHRdKiQvZCdgIgotZWNobwotZWNobyAiY2N2ZXItVjogYCRDQyAtViAyPiYxIHwgc2VkICcvXlsgXHRdKiQvZCdgIgotZWNobwotZWNobyAiY3BwZGVmaW5lczoiCi0ke0NQUH0gLWRNIC0gPC9kZXYvbnVsbAotZWNobwotZWNobyAiY29uZmlnLmg6IgotZWdyZXAgJyNkZWZpbmV8I3VuZGVmJyBjb25maWcuaAotZWNobwpkaWZmIC0tZ2l0IGEvdHR5bW9kZXMuYyBiL3R0eW1vZGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTFiOGEuLjAwMDAwMDAKLS0tIGEvdHR5bW9kZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vKiAkT3BlbkJTRDogdHR5bW9kZXMuYyx2IDEuMjkgMjAwOC8xMS8wMiAwMDoxNjoxNiBzdGV2ZXNrIEV4cCAkICovCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLQotLyoKLSAqIFNTSDIgdHR5IG1vZGVzIHN1cHBvcnQgYnkgS2V2aW4gU3RldmVzLgotICogQ29weXJpZ2h0IChjKSAyMDAxIEtldmluIFN0ZXZlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS8qCi0gKiBFbmNvZGluZyBhbmQgZGVjb2Rpbmcgb2YgdGVybWluYWwgbW9kZXMgaW4gYSBwb3J0YWJsZSB3YXkuCi0gKiBNdWNoIG9mIHRoZSBmb3JtYXQgaXMgZGVmaW5lZCBpbiB0dHltb2Rlcy5oOyBpdCBpcyBpbmNsdWRlZCBtdWx0aXBsZSB0aW1lcwotICogaW50byB0aGlzIGZpbGUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbWFjcm8gZGVmaW5pdGlvbnMgdG8gZ2VuZXJhdGUgdGhlCi0gKiBzdWl0YWJsZSBjb2RlLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgInBhY2tldC5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgInNzaDEuaCIKLSNpbmNsdWRlICJjb21wYXQuaCIKLSNpbmNsdWRlICJidWZmZXIuaCIKLQotI2RlZmluZSBUVFlfT1BfRU5ECQkwCi0vKgotICogdWludDMyICh1X2ludCkgZm9sbG93cyBzcGVlZCBpbiBTU0gxIGFuZCBTU0gyCi0gKi8KLSNkZWZpbmUgVFRZX09QX0lTUEVFRF9QUk9UTzEJMTkyCi0jZGVmaW5lIFRUWV9PUF9PU1BFRURfUFJPVE8xCTE5MwotI2RlZmluZSBUVFlfT1BfSVNQRUVEX1BST1RPMgkxMjgKLSNkZWZpbmUgVFRZX09QX09TUEVFRF9QUk9UTzIJMTI5Ci0KLS8qCi0gKiBDb252ZXJ0cyBQT1NJWCBzcGVlZF90IHRvIGEgYmF1ZCByYXRlLiAgVGhlIHZhbHVlcyBvZiB0aGUKLSAqIGNvbnN0YW50cyBmb3Igc3BlZWRfdCBhcmUgbm90IHRoZW1zZWx2ZXMgcG9ydGFibGUuCi0gKi8KLXN0YXRpYyBpbnQKLXNwZWVkX3RvX2JhdWQoc3BlZWRfdCBzcGVlZCkKLXsKLQlzd2l0Y2ggKHNwZWVkKSB7Ci0JY2FzZSBCMDoKLQkJcmV0dXJuIDA7Ci0JY2FzZSBCNTA6Ci0JCXJldHVybiA1MDsKLQljYXNlIEI3NToKLQkJcmV0dXJuIDc1OwotCWNhc2UgQjExMDoKLQkJcmV0dXJuIDExMDsKLQljYXNlIEIxMzQ6Ci0JCXJldHVybiAxMzQ7Ci0JY2FzZSBCMTUwOgotCQlyZXR1cm4gMTUwOwotCWNhc2UgQjIwMDoKLQkJcmV0dXJuIDIwMDsKLQljYXNlIEIzMDA6Ci0JCXJldHVybiAzMDA7Ci0JY2FzZSBCNjAwOgotCQlyZXR1cm4gNjAwOwotCWNhc2UgQjEyMDA6Ci0JCXJldHVybiAxMjAwOwotCWNhc2UgQjE4MDA6Ci0JCXJldHVybiAxODAwOwotCWNhc2UgQjI0MDA6Ci0JCXJldHVybiAyNDAwOwotCWNhc2UgQjQ4MDA6Ci0JCXJldHVybiA0ODAwOwotCWNhc2UgQjk2MDA6Ci0JCXJldHVybiA5NjAwOwotCi0jaWZkZWYgQjE5MjAwCi0JY2FzZSBCMTkyMDA6Ci0JCXJldHVybiAxOTIwMDsKLSNlbHNlIC8qIEIxOTIwMCAqLwotI2lmZGVmIEVYVEEKLQljYXNlIEVYVEE6Ci0JCXJldHVybiAxOTIwMDsKLSNlbmRpZiAvKiBFWFRBICovCi0jZW5kaWYgLyogQjE5MjAwICovCi0KLSNpZmRlZiBCMzg0MDAKLQljYXNlIEIzODQwMDoKLQkJcmV0dXJuIDM4NDAwOwotI2Vsc2UgLyogQjM4NDAwICovCi0jaWZkZWYgRVhUQgotCWNhc2UgRVhUQjoKLQkJcmV0dXJuIDM4NDAwOwotI2VuZGlmIC8qIEVYVEIgKi8KLSNlbmRpZiAvKiBCMzg0MDAgKi8KLQotI2lmZGVmIEI3MjAwCi0JY2FzZSBCNzIwMDoKLQkJcmV0dXJuIDcyMDA7Ci0jZW5kaWYgLyogQjcyMDAgKi8KLSNpZmRlZiBCMTQ0MDAKLQljYXNlIEIxNDQwMDoKLQkJcmV0dXJuIDE0NDAwOwotI2VuZGlmIC8qIEIxNDQwMCAqLwotI2lmZGVmIEIyODgwMAotCWNhc2UgQjI4ODAwOgotCQlyZXR1cm4gMjg4MDA7Ci0jZW5kaWYgLyogQjI4ODAwICovCi0jaWZkZWYgQjU3NjAwCi0JY2FzZSBCNTc2MDA6Ci0JCXJldHVybiA1NzYwMDsKLSNlbmRpZiAvKiBCNTc2MDAgKi8KLSNpZmRlZiBCNzY4MDAKLQljYXNlIEI3NjgwMDoKLQkJcmV0dXJuIDc2ODAwOwotI2VuZGlmIC8qIEI3NjgwMCAqLwotI2lmZGVmIEIxMTUyMDAKLQljYXNlIEIxMTUyMDA6Ci0JCXJldHVybiAxMTUyMDA7Ci0jZW5kaWYgLyogQjExNTIwMCAqLwotI2lmZGVmIEIyMzA0MDAKLQljYXNlIEIyMzA0MDA6Ci0JCXJldHVybiAyMzA0MDA7Ci0jZW5kaWYgLyogQjIzMDQwMCAqLwotCWRlZmF1bHQ6Ci0JCXJldHVybiA5NjAwOwotCX0KLX0KLQotLyoKLSAqIENvbnZlcnRzIGEgbnVtZXJpYyBiYXVkIHJhdGUgdG8gYSBQT1NJWCBzcGVlZF90LgotICovCi1zdGF0aWMgc3BlZWRfdAotYmF1ZF90b19zcGVlZChpbnQgYmF1ZCkKLXsKLQlzd2l0Y2ggKGJhdWQpIHsKLQljYXNlIDA6Ci0JCXJldHVybiBCMDsKLQljYXNlIDUwOgotCQlyZXR1cm4gQjUwOwotCWNhc2UgNzU6Ci0JCXJldHVybiBCNzU7Ci0JY2FzZSAxMTA6Ci0JCXJldHVybiBCMTEwOwotCWNhc2UgMTM0OgotCQlyZXR1cm4gQjEzNDsKLQljYXNlIDE1MDoKLQkJcmV0dXJuIEIxNTA7Ci0JY2FzZSAyMDA6Ci0JCXJldHVybiBCMjAwOwotCWNhc2UgMzAwOgotCQlyZXR1cm4gQjMwMDsKLQljYXNlIDYwMDoKLQkJcmV0dXJuIEI2MDA7Ci0JY2FzZSAxMjAwOgotCQlyZXR1cm4gQjEyMDA7Ci0JY2FzZSAxODAwOgotCQlyZXR1cm4gQjE4MDA7Ci0JY2FzZSAyNDAwOgotCQlyZXR1cm4gQjI0MDA7Ci0JY2FzZSA0ODAwOgotCQlyZXR1cm4gQjQ4MDA7Ci0JY2FzZSA5NjAwOgotCQlyZXR1cm4gQjk2MDA7Ci0KLSNpZmRlZiBCMTkyMDAKLQljYXNlIDE5MjAwOgotCQlyZXR1cm4gQjE5MjAwOwotI2Vsc2UgLyogQjE5MjAwICovCi0jaWZkZWYgRVhUQQotCWNhc2UgMTkyMDA6Ci0JCXJldHVybiBFWFRBOwotI2VuZGlmIC8qIEVYVEEgKi8KLSNlbmRpZiAvKiBCMTkyMDAgKi8KLQotI2lmZGVmIEIzODQwMAotCWNhc2UgMzg0MDA6Ci0JCXJldHVybiBCMzg0MDA7Ci0jZWxzZSAvKiBCMzg0MDAgKi8KLSNpZmRlZiBFWFRCCi0JY2FzZSAzODQwMDoKLQkJcmV0dXJuIEVYVEI7Ci0jZW5kaWYgLyogRVhUQiAqLwotI2VuZGlmIC8qIEIzODQwMCAqLwotCi0jaWZkZWYgQjcyMDAKLQljYXNlIDcyMDA6Ci0JCXJldHVybiBCNzIwMDsKLSNlbmRpZiAvKiBCNzIwMCAqLwotI2lmZGVmIEIxNDQwMAotCWNhc2UgMTQ0MDA6Ci0JCXJldHVybiBCMTQ0MDA7Ci0jZW5kaWYgLyogQjE0NDAwICovCi0jaWZkZWYgQjI4ODAwCi0JY2FzZSAyODgwMDoKLQkJcmV0dXJuIEIyODgwMDsKLSNlbmRpZiAvKiBCMjg4MDAgKi8KLSNpZmRlZiBCNTc2MDAKLQljYXNlIDU3NjAwOgotCQlyZXR1cm4gQjU3NjAwOwotI2VuZGlmIC8qIEI1NzYwMCAqLwotI2lmZGVmIEI3NjgwMAotCWNhc2UgNzY4MDA6Ci0JCXJldHVybiBCNzY4MDA7Ci0jZW5kaWYgLyogQjc2ODAwICovCi0jaWZkZWYgQjExNTIwMAotCWNhc2UgMTE1MjAwOgotCQlyZXR1cm4gQjExNTIwMDsKLSNlbmRpZiAvKiBCMTE1MjAwICovCi0jaWZkZWYgQjIzMDQwMAotCWNhc2UgMjMwNDAwOgotCQlyZXR1cm4gQjIzMDQwMDsKLSNlbmRpZiAvKiBCMjMwNDAwICovCi0JZGVmYXVsdDoKLQkJcmV0dXJuIEI5NjAwOwotCX0KLX0KLQotLyoKLSAqIEVuY29kZSBhIHNwZWNpYWwgY2hhcmFjdGVyIGludG8gU1NIIGxpbmUgZm9ybWF0LgotICovCi1zdGF0aWMgdV9pbnQKLXNwZWNpYWxfY2hhcl9lbmNvZGUoY2NfdCBjKQotewotI2lmZGVmIF9QT1NJWF9WRElTQUJMRQotCWlmIChjID09IF9QT1NJWF9WRElTQUJMRSkKLQkJcmV0dXJuIDI1NTsKLSNlbmRpZiAvKiBfUE9TSVhfVkRJU0FCTEUgKi8KLQlyZXR1cm4gYzsKLX0KLQotLyoKLSAqIERlY29kZSBhIHNwZWNpYWwgY2hhcmFjdGVyIGZyb20gU1NIIGxpbmUgZm9ybWF0LgotICovCi1zdGF0aWMgY2NfdAotc3BlY2lhbF9jaGFyX2RlY29kZSh1X2ludCBjKQotewotI2lmZGVmIF9QT1NJWF9WRElTQUJMRQotCWlmIChjID09IDI1NSkKLQkJcmV0dXJuIF9QT1NJWF9WRElTQUJMRTsKLSNlbmRpZiAvKiBfUE9TSVhfVkRJU0FCTEUgKi8KLQlyZXR1cm4gYzsKLX0KLQotLyoKLSAqIEVuY29kZXMgdGVybWluYWwgbW9kZXMgZm9yIHRoZSB0ZXJtaW5hbCByZWZlcmVuY2VkIGJ5IGZkCi0gKiBvciB0aW9wIGluIGEgcG9ydGFibGUgbWFubmVyLCBhbmQgYXBwZW5kcyB0aGUgbW9kZXMgdG8gYSBwYWNrZXQKLSAqIGJlaW5nIGNvbnN0cnVjdGVkLgotICovCi12b2lkCi10dHlfbWFrZV9tb2RlcyhpbnQgZmQsIHN0cnVjdCB0ZXJtaW9zICp0aW9wKQotewotCXN0cnVjdCB0ZXJtaW9zIHRpbzsKLQlpbnQgYmF1ZDsKLQlCdWZmZXIgYnVmOwotCWludCB0dHlfb3Bfb3NwZWVkLCB0dHlfb3BfaXNwZWVkOwotCXZvaWQgKCpwdXRfYXJnKShCdWZmZXIgKiwgdV9pbnQpOwotCi0JYnVmZmVyX2luaXQoJmJ1Zik7Ci0JaWYgKGNvbXBhdDIwKSB7Ci0JCXR0eV9vcF9vc3BlZWQgPSBUVFlfT1BfT1NQRUVEX1BST1RPMjsKLQkJdHR5X29wX2lzcGVlZCA9IFRUWV9PUF9JU1BFRURfUFJPVE8yOwotCQlwdXRfYXJnID0gYnVmZmVyX3B1dF9pbnQ7Ci0JfSBlbHNlIHsKLQkJdHR5X29wX29zcGVlZCA9IFRUWV9PUF9PU1BFRURfUFJPVE8xOwotCQl0dHlfb3BfaXNwZWVkID0gVFRZX09QX0lTUEVFRF9QUk9UTzE7Ci0JCXB1dF9hcmcgPSAodm9pZCAoKikoQnVmZmVyICosIHVfaW50KSkgYnVmZmVyX3B1dF9jaGFyOwotCX0KLQotCWlmICh0aW9wID09IE5VTEwpIHsKLQkJaWYgKGZkID09IC0xKSB7Ci0JCQlkZWJ1ZygidHR5X21ha2VfbW9kZXM6IG5vIGZkIG9yIHRpbyIpOwotCQkJZ290byBlbmQ7Ci0JCX0KLQkJaWYgKHRjZ2V0YXR0cihmZCwgJnRpbykgPT0gLTEpIHsKLQkJCWxvZ2l0KCJ0Y2dldGF0dHI6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCX0gZWxzZQotCQl0aW8gPSAqdGlvcDsKLQotCS8qIFN0b3JlIGlucHV0IGFuZCBvdXRwdXQgYmF1ZCByYXRlcy4gKi8KLQliYXVkID0gc3BlZWRfdG9fYmF1ZChjZmdldG9zcGVlZCgmdGlvKSk7Ci0JYnVmZmVyX3B1dF9jaGFyKCZidWYsIHR0eV9vcF9vc3BlZWQpOwotCWJ1ZmZlcl9wdXRfaW50KCZidWYsIGJhdWQpOwotCWJhdWQgPSBzcGVlZF90b19iYXVkKGNmZ2V0aXNwZWVkKCZ0aW8pKTsKLQlidWZmZXJfcHV0X2NoYXIoJmJ1ZiwgdHR5X29wX2lzcGVlZCk7Ci0JYnVmZmVyX3B1dF9pbnQoJmJ1ZiwgYmF1ZCk7Ci0KLQkvKiBTdG9yZSB2YWx1ZXMgb2YgbW9kZSBmbGFncy4gKi8KLSNkZWZpbmUgVFRZQ0hBUihOQU1FLCBPUCkgXAotCWJ1ZmZlcl9wdXRfY2hhcigmYnVmLCBPUCk7IFwKLQlwdXRfYXJnKCZidWYsIHNwZWNpYWxfY2hhcl9lbmNvZGUodGlvLmNfY2NbTkFNRV0pKTsKLQotI2RlZmluZSBUVFlNT0RFKE5BTUUsIEZJRUxELCBPUCkgXAotCWJ1ZmZlcl9wdXRfY2hhcigmYnVmLCBPUCk7IFwKLQlwdXRfYXJnKCZidWYsICgodGlvLkZJRUxEICYgTkFNRSkgIT0gMCkpOwotCi0jaW5jbHVkZSAidHR5bW9kZXMuaCIKLQotI3VuZGVmIFRUWUNIQVIKLSN1bmRlZiBUVFlNT0RFCi0KLWVuZDoKLQkvKiBNYXJrIGVuZCBvZiBtb2RlIGRhdGEuICovCi0JYnVmZmVyX3B1dF9jaGFyKCZidWYsIFRUWV9PUF9FTkQpOwotCWlmIChjb21wYXQyMCkKLQkJcGFja2V0X3B1dF9zdHJpbmcoYnVmZmVyX3B0cigmYnVmKSwgYnVmZmVyX2xlbigmYnVmKSk7Ci0JZWxzZQotCQlwYWNrZXRfcHV0X3JhdyhidWZmZXJfcHRyKCZidWYpLCBidWZmZXJfbGVuKCZidWYpKTsKLQlidWZmZXJfZnJlZSgmYnVmKTsKLX0KLQotLyoKLSAqIERlY29kZXMgdGVybWluYWwgbW9kZXMgZm9yIHRoZSB0ZXJtaW5hbCByZWZlcmVuY2VkIGJ5IGZkIGluIGEgcG9ydGFibGUKLSAqIG1hbm5lciBmcm9tIGEgcGFja2V0IGJlaW5nIHJlYWQuCi0gKi8KLXZvaWQKLXR0eV9wYXJzZV9tb2RlcyhpbnQgZmQsIGludCAqbl9ieXRlc19wdHIpCi17Ci0Jc3RydWN0IHRlcm1pb3MgdGlvOwotCWludCBvcGNvZGUsIGJhdWQ7Ci0JaW50IG5fYnl0ZXMgPSAwOwotCWludCBmYWlsdXJlID0gMDsKLQl1X2ludCAoKmdldF9hcmcpKHZvaWQpOwotCWludCBhcmdfc2l6ZTsKLQotCWlmIChjb21wYXQyMCkgewotCQkqbl9ieXRlc19wdHIgPSBwYWNrZXRfZ2V0X2ludCgpOwotCQlpZiAoKm5fYnl0ZXNfcHRyID09IDApCi0JCQlyZXR1cm47Ci0JCWdldF9hcmcgPSBwYWNrZXRfZ2V0X2ludDsKLQkJYXJnX3NpemUgPSA0OwotCX0gZWxzZSB7Ci0JCWdldF9hcmcgPSBwYWNrZXRfZ2V0X2NoYXI7Ci0JCWFyZ19zaXplID0gMTsKLQl9Ci0KLQkvKgotCSAqIEdldCBvbGQgYXR0cmlidXRlcyBmb3IgdGhlIHRlcm1pbmFsLiAgV2Ugd2lsbCBtb2RpZnkgdGhlc2UKLQkgKiBmbGFncy4gSSBhbSBob3BpbmcgdGhhdCBpZiB0aGVyZSBhcmUgYW55IG1hY2hpbmUtc3BlY2lmaWMKLQkgKiBtb2RlcywgdGhleSB3aWxsIGluaXRpYWxseSBoYXZlIHJlYXNvbmFibGUgdmFsdWVzLgotCSAqLwotCWlmICh0Y2dldGF0dHIoZmQsICZ0aW8pID09IC0xKSB7Ci0JCWxvZ2l0KCJ0Y2dldGF0dHI6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWZhaWx1cmUgPSAtMTsKLQl9Ci0KLQlmb3IgKDs7KSB7Ci0JCW5fYnl0ZXMgKz0gMTsKLQkJb3Bjb2RlID0gcGFja2V0X2dldF9jaGFyKCk7Ci0JCXN3aXRjaCAob3Bjb2RlKSB7Ci0JCWNhc2UgVFRZX09QX0VORDoKLQkJCWdvdG8gc2V0OwotCi0JCS8qIFhYWDogZnV0dXJlIGNvbmZsaWN0IHBvc3NpYmxlICovCi0JCWNhc2UgVFRZX09QX0lTUEVFRF9QUk9UTzE6Ci0JCWNhc2UgVFRZX09QX0lTUEVFRF9QUk9UTzI6Ci0JCQluX2J5dGVzICs9IDQ7Ci0JCQliYXVkID0gcGFja2V0X2dldF9pbnQoKTsKLQkJCWlmIChmYWlsdXJlICE9IC0xICYmCi0JCQkgICAgY2ZzZXRpc3BlZWQoJnRpbywgYmF1ZF90b19zcGVlZChiYXVkKSkgPT0gLTEpCi0JCQkJZXJyb3IoImNmc2V0aXNwZWVkIGZhaWxlZCBmb3IgJWQiLCBiYXVkKTsKLQkJCWJyZWFrOwotCi0JCS8qIFhYWDogZnV0dXJlIGNvbmZsaWN0IHBvc3NpYmxlICovCi0JCWNhc2UgVFRZX09QX09TUEVFRF9QUk9UTzE6Ci0JCWNhc2UgVFRZX09QX09TUEVFRF9QUk9UTzI6Ci0JCQluX2J5dGVzICs9IDQ7Ci0JCQliYXVkID0gcGFja2V0X2dldF9pbnQoKTsKLQkJCWlmIChmYWlsdXJlICE9IC0xICYmCi0JCQkgICAgY2ZzZXRvc3BlZWQoJnRpbywgYmF1ZF90b19zcGVlZChiYXVkKSkgPT0gLTEpCi0JCQkJZXJyb3IoImNmc2V0b3NwZWVkIGZhaWxlZCBmb3IgJWQiLCBiYXVkKTsKLQkJCWJyZWFrOwotCi0jZGVmaW5lIFRUWUNIQVIoTkFNRSwgT1ApIFwKLQljYXNlIE9QOiBcCi0JICBuX2J5dGVzICs9IGFyZ19zaXplOyBcCi0JICB0aW8uY19jY1tOQU1FXSA9IHNwZWNpYWxfY2hhcl9kZWNvZGUoZ2V0X2FyZygpKTsgXAotCSAgYnJlYWs7Ci0jZGVmaW5lIFRUWU1PREUoTkFNRSwgRklFTEQsIE9QKSBcCi0JY2FzZSBPUDogXAotCSAgbl9ieXRlcyArPSBhcmdfc2l6ZTsgXAotCSAgaWYgKGdldF9hcmcoKSkgXAotCSAgICB0aW8uRklFTEQgfD0gTkFNRTsgXAotCSAgZWxzZSBcCi0JICAgIHRpby5GSUVMRCAmPSB+TkFNRTsJXAotCSAgYnJlYWs7Ci0KLSNpbmNsdWRlICJ0dHltb2Rlcy5oIgotCi0jdW5kZWYgVFRZQ0hBUgotI3VuZGVmIFRUWU1PREUKLQotCQlkZWZhdWx0OgotCQkJZGVidWcoIklnbm9yaW5nIHVuc3VwcG9ydGVkIHR0eSBtb2RlIG9wY29kZSAlZCAoMHgleCkiLAotCQkJICAgIG9wY29kZSwgb3Bjb2RlKTsKLQkJCWlmICghY29tcGF0MjApIHsKLQkJCQkvKgotCQkJCSAqIFNTSDE6Ci0JCQkJICogT3Bjb2RlcyAxIHRvIDEyNyBhcmUgZGVmaW5lZCB0byBoYXZlCi0JCQkJICogYSBvbmUtYnl0ZSBhcmd1bWVudC4KLQkJCQkgKiBPcGNvZGVzIDEyOCB0byAxNTkgYXJlIGRlZmluZWQgdG8gaGF2ZQotCQkJCSAqIGFuIGludGVnZXIgYXJndW1lbnQuCi0JCQkJICovCi0JCQkJaWYgKG9wY29kZSA+IDAgJiYgb3Bjb2RlIDwgMTI4KSB7Ci0JCQkJCW5fYnl0ZXMgKz0gMTsKLQkJCQkJKHZvaWQpIHBhY2tldF9nZXRfY2hhcigpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgaWYgKG9wY29kZSA+PSAxMjggJiYgb3Bjb2RlIDwgMTYwKSB7Ci0JCQkJCW5fYnl0ZXMgKz0gNDsKLQkJCQkJKHZvaWQpIHBhY2tldF9nZXRfaW50KCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEl0IGlzIGEgdHJ1bHkgdW5kZWZpbmVkIG9wY29kZSAoMTYwIHRvIDI1NSkuCi0JCQkJCSAqIFdlIGhhdmUgbm8gaWRlYSBhYm91dCBpdHMgYXJndW1lbnRzLiAgU28gd2UKLQkJCQkJICogbXVzdCBzdG9wIHBhcnNpbmcuICBOb3RlIHRoYXQgc29tZSBkYXRhCi0JCQkJCSAqIG1heSBiZSBsZWZ0IGluIHRoZSBwYWNrZXQ7IGhvcGVmdWxseSB0aGVyZQotCQkJCQkgKiBpcyBub3RoaW5nIG1vcmUgY29taW5nIGFmdGVyIHRoZSBtb2RlIGRhdGEuCi0JCQkJCSAqLwotCQkJCQlsb2dpdCgicGFyc2VfdHR5X21vZGVzOiB1bmtub3duIG9wY29kZSAlZCIsCi0JCQkJCSAgICBvcGNvZGUpOwotCQkJCQlnb3RvIHNldDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogU1NIMjoKLQkJCQkgKiBPcGNvZGVzIDEgdG8gMTU5IGFyZSBkZWZpbmVkIHRvIGhhdmUKLQkJCQkgKiBhIHVpbnQzMiBhcmd1bWVudC4KLQkJCQkgKiBPcGNvZGVzIDE2MCB0byAyNTUgYXJlIHVuZGVmaW5lZCBhbmQKLQkJCQkgKiBjYXVzZSBwYXJzaW5nIHRvIHN0b3AuCi0JCQkJICovCi0JCQkJaWYgKG9wY29kZSA+IDAgJiYgb3Bjb2RlIDwgMTYwKSB7Ci0JCQkJCW5fYnl0ZXMgKz0gNDsKLQkJCQkJKHZvaWQpIHBhY2tldF9nZXRfaW50KCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxvZ2l0KCJwYXJzZV90dHlfbW9kZXM6IHVua25vd24gb3Bjb2RlICVkIiwKLQkJCQkJICAgIG9wY29kZSk7Ci0JCQkJCWdvdG8gc2V0OwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotc2V0OgotCWlmICgqbl9ieXRlc19wdHIgIT0gbl9ieXRlcykgewotCQkqbl9ieXRlc19wdHIgPSBuX2J5dGVzOwotCQlsb2dpdCgicGFyc2VfdHR5X21vZGVzOiBuX2J5dGVzX3B0ciAhPSBuX2J5dGVzOiAlZCAlZCIsCi0JCSAgICAqbl9ieXRlc19wdHIsIG5fYnl0ZXMpOwotCQlyZXR1cm47CQkvKiBEb24ndCBwcm9jZXNzIGJ5dGVzIHBhc3NlZCAqLwotCX0KLQlpZiAoZmFpbHVyZSA9PSAtMSkKLQkJcmV0dXJuOwkJLyogUGFja2V0IHBhcnNlZCBvayBidXQgdGNnZXRhdHRyKCkgZmFpbGVkICovCi0KLQkvKiBTZXQgdGhlIG5ldyBtb2RlcyBmb3IgdGhlIHRlcm1pbmFsLiAqLwotCWlmICh0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZ0aW8pID09IC0xKQotCQlsb2dpdCgiU2V0dGluZyB0dHkgbW9kZXMgZmFpbGVkOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotfQpkaWZmIC0tZ2l0IGEvdHR5bW9kZXMuaCBiL3R0eW1vZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODQ4ZmUuLjAwMDAwMDAKLS0tIGEvdHR5bW9kZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKiAkT3BlbkJTRDogdHR5bW9kZXMuaCx2IDEuMTQgMjAwNi8wMy8yNSAyMjoyMjo0MyBkam0gRXhwICQgKi8KLQotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLS8qCi0gKiBTU0gyIHR0eSBtb2RlcyBzdXBwb3J0IGJ5IEtldmluIFN0ZXZlcy4KLSAqIENvcHlyaWdodCAoYykgMjAwMSBLZXZpbiBTdGV2ZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKgotICogU1NIMToKLSAqIFRoZSB0dHkgbW9kZSBkZXNjcmlwdGlvbiBpcyBhIHN0cmVhbSBvZiBieXRlcy4gIFRoZSBzdHJlYW0gY29uc2lzdHMgb2YKLSAqIG9wY29kZS1hcmd1bWVudHMgcGFpcnMuICBJdCBpcyB0ZXJtaW5hdGVkIGJ5IG9wY29kZSBUVFlfT1BfRU5EICgwKS4KLSAqIE9wY29kZXMgMS0xMjcgaGF2ZSBvbmUtYnl0ZSBhcmd1bWVudHMuICBPcGNvZGVzIDEyOC0xNTkgaGF2ZSBpbnRlZ2VyCi0gKiBhcmd1bWVudHMuICBPcGNvZGVzIDE2MC0yNTUgYXJlIG5vdCB5ZXQgZGVmaW5lZCwgYW5kIGNhdXNlIHBhcnNpbmcgdG8KLSAqIHN0b3AgKHRoZXkgc2hvdWxkIG9ubHkgYmUgdXNlZCBhZnRlciBhbnkgb3RoZXIgZGF0YSkuCi0gKgotICogU1NIMjoKLSAqIERpZmZlcmVuY2VzIGJldHdlZW4gU1NIMSBhbmQgU1NIMiB0ZXJtaW5hbCBtb2RlIGVuY29kaW5nIGluY2x1ZGU6Ci0gKiAxLiBFbmNvZGVkIHRlcm1pbmFsIG1vZGVzIGFyZSByZXByZXNlbnRlZCBhcyBhIHN0cmluZywgYW5kIGEgc3RyZWFtCi0gKiAgICBvZiBieXRlcyB3aXRoaW4gdGhhdCBzdHJpbmcuCi0gKiAyLiBPcGNvZGUgYXJndW1lbnRzIGFyZSB1aW50MzIgKDEtMTU5KTsgMTYwLTI1NSByZW1haW4gdW5kZWZpbmVkLgotICogMy4gVGhlIHZhbHVlcyBmb3IgVFRZX09QX0lTUEVFRCBhbmQgVFRZX09QX09TUEVFRCBhcmUgZGlmZmVyZW50OwotICogICAgMTI4IGFuZCAxMjkgdnMuIDE5MiBhbmQgMTkzIHJlc3BlY3RpdmVseS4KLSAqCi0gKiBUaGUgY2xpZW50IHB1dHMgaW4gdGhlIHN0cmVhbSBhbnkgbW9kZXMgaXQga25vd3MgYWJvdXQsIGFuZCB0aGUKLSAqIHNlcnZlciBpZ25vcmVzIGFueSBtb2RlcyBpdCBkb2VzIG5vdCBrbm93IGFib3V0LiAgVGhpcyBhbGxvd3Mgc29tZSBkZWdyZWUKLSAqIG9mIG1hY2hpbmUtaW5kZXBlbmRlbmNlLCBhdCBsZWFzdCBiZXR3ZWVuIHN5c3RlbXMgdGhhdCB1c2UgYSBwb3NpeC1saWtlCi0gKiB0dHkgaW50ZXJmYWNlLiAgVGhlIHByb3RvY29sIGNhbiBzdXBwb3J0IG90aGVyIHN5c3RlbXMgYXMgd2VsbCwgYnV0IG1pZ2h0Ci0gKiByZXF1aXJlIHJlaW1wbGVtZW50aW5nIGFzIG1vZGUgbmFtZXMgd291bGQgbGlrZWx5IGJlIGRpZmZlcmVudC4KLSAqLwotCi0vKgotICogU29tZSBjb25zdGFudHMgYW5kIHByb3RvdHlwZXMgYXJlIGRlZmluZWQgaW4gcGFja2V0Lmg7IHRoaXMgZmlsZQotICogaXMgb25seSBpbnRlbmRlZCBmb3IgaW5jbHVkaW5nIGZyb20gdHR5bW9kZXMuYy4KLSAqLwotCi0vKiB0ZXJtaW9zIG1hY3JvICovCi0vKiBuYW1lLCBvcCAqLwotVFRZQ0hBUihWSU5UUiwgMSkKLVRUWUNIQVIoVlFVSVQsIDIpCi1UVFlDSEFSKFZFUkFTRSwgMykKLSNpZiBkZWZpbmVkKFZLSUxMKQotVFRZQ0hBUihWS0lMTCwgNCkKLSNlbmRpZiAvKiBWS0lMTCAqLwotVFRZQ0hBUihWRU9GLCA1KQotI2lmIGRlZmluZWQoVkVPTCkKLVRUWUNIQVIoVkVPTCwgNikKLSNlbmRpZiAvKiBWRU9MICovCi0jaWZkZWYgVkVPTDIKLVRUWUNIQVIoVkVPTDIsIDcpCi0jZW5kaWYgLyogVkVPTDIgKi8KLVRUWUNIQVIoVlNUQVJULCA4KQotVFRZQ0hBUihWU1RPUCwgOSkKLSNpZiBkZWZpbmVkKFZTVVNQKQotVFRZQ0hBUihWU1VTUCwgMTApCi0jZW5kaWYgLyogVlNVU1AgKi8KLSNpZiBkZWZpbmVkKFZEU1VTUCkKLVRUWUNIQVIoVkRTVVNQLCAxMSkKLSNlbmRpZiAvKiBWRFNVU1AgKi8KLSNpZiBkZWZpbmVkKFZSRVBSSU5UKQotVFRZQ0hBUihWUkVQUklOVCwgMTIpCi0jZW5kaWYgLyogVlJFUFJJTlQgKi8KLSNpZiBkZWZpbmVkKFZXRVJBU0UpCi1UVFlDSEFSKFZXRVJBU0UsIDEzKQotI2VuZGlmIC8qIFZXRVJBU0UgKi8KLSNpZiBkZWZpbmVkKFZMTkVYVCkKLVRUWUNIQVIoVkxORVhULCAxNCkKLSNlbmRpZiAvKiBWTE5FWFQgKi8KLSNpZiBkZWZpbmVkKFZGTFVTSCkKLVRUWUNIQVIoVkZMVVNILCAxNSkKLSNlbmRpZiAvKiBWRkxVU0ggKi8KLSNpZmRlZiBWU1dUQ0gKLVRUWUNIQVIoVlNXVENILCAxNikKLSNlbmRpZiAvKiBWU1dUQ0ggKi8KLSNpZiBkZWZpbmVkKFZTVEFUVVMpCi1UVFlDSEFSKFZTVEFUVVMsIDE3KQotI2VuZGlmIC8qIFZTVEFUVVMgKi8KLSNpZmRlZiBWRElTQ0FSRAotVFRZQ0hBUihWRElTQ0FSRCwgMTgpCi0jZW5kaWYgLyogVkRJU0NBUkQgKi8KLQotLyogbmFtZSwgZmllbGQsIG9wICovCi1UVFlNT0RFKElHTlBBUiwJY19pZmxhZywgMzApCi1UVFlNT0RFKFBBUk1SSywJY19pZmxhZywgMzEpCi1UVFlNT0RFKElOUENLLAljX2lmbGFnLCAzMikKLVRUWU1PREUoSVNUUklQLAljX2lmbGFnLCAzMykKLVRUWU1PREUoSU5MQ1IsCWNfaWZsYWcsIDM0KQotVFRZTU9ERShJR05DUiwJY19pZmxhZywgMzUpCi1UVFlNT0RFKElDUk5MLAljX2lmbGFnLCAzNikKLSNpZiBkZWZpbmVkKElVQ0xDKQotVFRZTU9ERShJVUNMQywJY19pZmxhZywgMzcpCi0jZW5kaWYKLVRUWU1PREUoSVhPTiwJY19pZmxhZywgMzgpCi1UVFlNT0RFKElYQU5ZLAljX2lmbGFnLCAzOSkKLVRUWU1PREUoSVhPRkYsCWNfaWZsYWcsIDQwKQotI2lmZGVmIElNQVhCRUwKLVRUWU1PREUoSU1BWEJFTCxjX2lmbGFnLCA0MSkKLSNlbmRpZiAvKiBJTUFYQkVMICovCi0KLVRUWU1PREUoSVNJRywJY19sZmxhZywgNTApCi1UVFlNT0RFKElDQU5PTiwJY19sZmxhZywgNTEpCi0jaWZkZWYgWENBU0UKLVRUWU1PREUoWENBU0UsCWNfbGZsYWcsIDUyKQotI2VuZGlmCi1UVFlNT0RFKEVDSE8sCWNfbGZsYWcsIDUzKQotVFRZTU9ERShFQ0hPRSwJY19sZmxhZywgNTQpCi1UVFlNT0RFKEVDSE9LLAljX2xmbGFnLCA1NSkKLVRUWU1PREUoRUNIT05MLAljX2xmbGFnLCA1NikKLVRUWU1PREUoTk9GTFNILAljX2xmbGFnLCA1NykKLVRUWU1PREUoVE9TVE9QLAljX2xmbGFnLCA1OCkKLSNpZmRlZiBJRVhURU4KLVRUWU1PREUoSUVYVEVOLCBjX2xmbGFnLCA1OSkKLSNlbmRpZiAvKiBJRVhURU4gKi8KLSNpZiBkZWZpbmVkKEVDSE9DVEwpCi1UVFlNT0RFKEVDSE9DVEwsY19sZmxhZywgNjApCi0jZW5kaWYgLyogRUNIT0NUTCAqLwotI2lmZGVmIEVDSE9LRQotVFRZTU9ERShFQ0hPS0UsCWNfbGZsYWcsIDYxKQotI2VuZGlmIC8qIEVDSE9LRSAqLwotI2lmIGRlZmluZWQoUEVORElOKQotVFRZTU9ERShQRU5ESU4sCWNfbGZsYWcsIDYyKQotI2VuZGlmIC8qIFBFTkRJTiAqLwotCi1UVFlNT0RFKE9QT1NULAljX29mbGFnLCA3MCkKLSNpZiBkZWZpbmVkKE9MQ1VDKQotVFRZTU9ERShPTENVQywJY19vZmxhZywgNzEpCi0jZW5kaWYKLSNpZmRlZiBPTkxDUgotVFRZTU9ERShPTkxDUiwJY19vZmxhZywgNzIpCi0jZW5kaWYKLSNpZmRlZiBPQ1JOTAotVFRZTU9ERShPQ1JOTCwJY19vZmxhZywgNzMpCi0jZW5kaWYKLSNpZmRlZiBPTk9DUgotVFRZTU9ERShPTk9DUiwJY19vZmxhZywgNzQpCi0jZW5kaWYKLSNpZmRlZiBPTkxSRVQKLVRUWU1PREUoT05MUkVULAljX29mbGFnLCA3NSkKLSNlbmRpZgotCi1UVFlNT0RFKENTNywJY19jZmxhZywgOTApCi1UVFlNT0RFKENTOCwJY19jZmxhZywgOTEpCi1UVFlNT0RFKFBBUkVOQiwJY19jZmxhZywgOTIpCi1UVFlNT0RFKFBBUk9ERCwJY19jZmxhZywgOTMpCmRpZmYgLS1naXQgYS91aWRzd2FwLmMgYi91aWRzd2FwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMmQ5YzQuLjAwMDAwMDAKLS0tIGEvdWlkc3dhcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qICRPcGVuQlNEOiB1aWRzd2FwLmMsdiAxLjM1IDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLwotLyoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICogICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIENvZGUgZm9yIHVpZC1zd2FwcGluZy4KLSAqCi0gKiBBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gKiBjYW4gYmUgdXNlZCBmcmVlbHkgZm9yIGFueSBwdXJwb3NlLiAgQW55IGRlcml2ZWQgdmVyc2lvbnMgb2YgdGhpcwotICogc29mdHdhcmUgbXVzdCBiZSBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgaWYgdGhlIGRlcml2ZWQgd29yayBpcwotICogaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICogY2FsbGVkIGJ5IGEgbmFtZSBvdGhlciB0aGFuICJzc2giIG9yICJTZWN1cmUgU2hlbGwiLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgPGdycC5oPgotCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAidWlkc3dhcC5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKLQotI2lmZGVmIEFORFJPSUQKLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLSNpbmNsdWRlIDxzeXMvY2FwYWJpbGl0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3ByY3RsLmg+Ci0jZW5kaWYKLQotLyoKLSAqIE5vdGU6IGFsbCB0aGVzZSBmdW5jdGlvbnMgbXVzdCB3b3JrIGluIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNhc2VzOgotICogICAgMS4gZXVpZD0wLCBydWlkPTAKLSAqICAgIDIuIGV1aWQ9MCwgcnVpZCE9MAotICogICAgMy4gZXVpZCE9MCwgcnVpZCE9MAotICogQWRkaXRpb25hbGx5LCB0aGV5IG11c3Qgd29yayByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHN5c3RlbSBoYXMKLSAqIFBPU0lYIHNhdmVkIHVpZHMgb3Igbm90LgotICovCi0KLSNpZiBkZWZpbmVkKF9QT1NJWF9TQVZFRF9JRFMpICYmICFkZWZpbmVkKEJST0tFTl9TQVZFRF9VSURTKQotLyogTGV0cyBhc3N1bWUgdGhhdCBwb3NpeCBzYXZlZCBpZHMgYWxzbyB3b3JrIHdpdGggc2V0ZXVpZCwgZXZlbiB0aG91Z2ggdGhhdAotICAgaXMgbm90IHBhcnQgb2YgdGhlIHBvc2l4IHNwZWNpZmljYXRpb24uICovCi0jZGVmaW5lIFNBVkVEX0lEU19XT1JLX1dJVEhfU0VURVVJRAotLyogU2F2ZWQgZWZmZWN0aXZlIHVpZC4gKi8KLXN0YXRpYyB1aWRfdCAJc2F2ZWRfZXVpZCA9IDA7Ci1zdGF0aWMgZ2lkX3QJc2F2ZWRfZWdpZCA9IDA7Ci0jZW5kaWYKLQotLyogU2F2ZWQgZWZmZWN0aXZlIHVpZC4gKi8KLXN0YXRpYyBpbnQJcHJpdmlsZWdlZCA9IDA7Ci1zdGF0aWMgaW50CXRlbXBvcmFyaWx5X3VzZV91aWRfZWZmZWN0aXZlID0gMDsKLXN0YXRpYyBnaWRfdAkqc2F2ZWRfZWdyb3VwcyA9IE5VTEwsICp1c2VyX2dyb3VwcyA9IE5VTEw7Ci1zdGF0aWMgaW50CXNhdmVkX2Vncm91cHNsZW4gPSAtMSwgdXNlcl9ncm91cHNsZW4gPSAtMTsKLQotLyoKLSAqIFRlbXBvcmFyaWx5IGNoYW5nZXMgdG8gdGhlIGdpdmVuIHVpZC4gIElmIHRoZSBlZmZlY3RpdmUgdXNlcgotICogaWQgaXMgbm90IHJvb3QsIHRoaXMgZG9lcyBub3RoaW5nLiAgVGhpcyBjYWxsIGNhbm5vdCBiZSBuZXN0ZWQuCi0gKi8KLXZvaWQKLXRlbXBvcmFyaWx5X3VzZV91aWQoc3RydWN0IHBhc3N3ZCAqcHcpCi17Ci0JLyogU2F2ZSB0aGUgY3VycmVudCBldWlkLCBhbmQgZWdyb3Vwcy4gKi8KLSNpZmRlZiBTQVZFRF9JRFNfV09SS19XSVRIX1NFVEVVSUQKLQlzYXZlZF9ldWlkID0gZ2V0ZXVpZCgpOwotCXNhdmVkX2VnaWQgPSBnZXRlZ2lkKCk7Ci0JZGVidWcoInRlbXBvcmFyaWx5X3VzZV91aWQ6ICV1LyV1IChlPSV1LyV1KSIsCi0JICAgICh1X2ludClwdy0+cHdfdWlkLCAodV9pbnQpcHctPnB3X2dpZCwKLQkgICAgKHVfaW50KXNhdmVkX2V1aWQsICh1X2ludClzYXZlZF9lZ2lkKTsKLSNpZm5kZWYgSEFWRV9DWUdXSU4KLQlpZiAoc2F2ZWRfZXVpZCAhPSAwKSB7Ci0JCXByaXZpbGVnZWQgPSAwOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0jZWxzZQotCWlmIChnZXRldWlkKCkgIT0gMCkgewotCQlwcml2aWxlZ2VkID0gMDsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvKiBTQVZFRF9JRFNfV09SS19XSVRIX1NFVEVVSUQgKi8KLQotCXByaXZpbGVnZWQgPSAxOwotCXRlbXBvcmFyaWx5X3VzZV91aWRfZWZmZWN0aXZlID0gMTsKLQotCXNhdmVkX2Vncm91cHNsZW4gPSBnZXRncm91cHMoMCwgTlVMTCk7Ci0JaWYgKHNhdmVkX2Vncm91cHNsZW4gPCAwKQotCQlmYXRhbCgiZ2V0Z3JvdXBzOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCWlmIChzYXZlZF9lZ3JvdXBzbGVuID4gMCkgewotCQlzYXZlZF9lZ3JvdXBzID0geHJlYWxsb2Moc2F2ZWRfZWdyb3VwcywKLQkJICAgIHNhdmVkX2Vncm91cHNsZW4sIHNpemVvZihnaWRfdCkpOwotCQlpZiAoZ2V0Z3JvdXBzKHNhdmVkX2Vncm91cHNsZW4sIHNhdmVkX2Vncm91cHMpIDwgMCkKLQkJCWZhdGFsKCJnZXRncm91cHM6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JfSBlbHNlIHsgLyogc2F2ZWRfZWdyb3Vwc2xlbiA9PSAwICovCi0JCWlmIChzYXZlZF9lZ3JvdXBzICE9IE5VTEwpCi0JCQl4ZnJlZShzYXZlZF9lZ3JvdXBzKTsKLQl9Ci0KLQkvKiBzZXQgYW5kIHNhdmUgdGhlIHVzZXIncyBncm91cHMgKi8KLQlpZiAodXNlcl9ncm91cHNsZW4gPT0gLTEpIHsKLQkJaWYgKGluaXRncm91cHMocHctPnB3X25hbWUsIHB3LT5wd19naWQpIDwgMCkKLQkJCWZhdGFsKCJpbml0Z3JvdXBzOiAlczogJS4xMDBzIiwgcHctPnB3X25hbWUsCi0JCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQotCQl1c2VyX2dyb3Vwc2xlbiA9IGdldGdyb3VwcygwLCBOVUxMKTsKLQkJaWYgKHVzZXJfZ3JvdXBzbGVuIDwgMCkKLQkJCWZhdGFsKCJnZXRncm91cHM6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWlmICh1c2VyX2dyb3Vwc2xlbiA+IDApIHsKLQkJCXVzZXJfZ3JvdXBzID0geHJlYWxsb2ModXNlcl9ncm91cHMsCi0JCQkgICAgdXNlcl9ncm91cHNsZW4sIHNpemVvZihnaWRfdCkpOwotCQkJaWYgKGdldGdyb3Vwcyh1c2VyX2dyb3Vwc2xlbiwgdXNlcl9ncm91cHMpIDwgMCkKLQkJCQlmYXRhbCgiZ2V0Z3JvdXBzOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCQl9IGVsc2UgeyAvKiB1c2VyX2dyb3Vwc2xlbiA9PSAwICovCi0JCQlpZiAodXNlcl9ncm91cHMpCi0JCQkJeGZyZWUodXNlcl9ncm91cHMpOwotCQl9Ci0JfQotCS8qIFNldCB0aGUgZWZmZWN0aXZlIHVpZCB0byB0aGUgZ2l2ZW4gKHVucHJpdmlsZWdlZCkgdWlkLiAqLwotCWlmIChzZXRncm91cHModXNlcl9ncm91cHNsZW4sIHVzZXJfZ3JvdXBzKSA8IDApCi0JCWZhdGFsKCJzZXRncm91cHM6ICUuMTAwcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0jaWZuZGVmIFNBVkVEX0lEU19XT1JLX1dJVEhfU0VURVVJRAotCS8qIFByb3BhZ2F0ZSB0aGUgcHJpdmlsZWdlZCBnaWQgdG8gYWxsIG9mIG91ciBnaWRzLiAqLwotCWlmIChzZXRnaWQoZ2V0ZWdpZCgpKSA8IDApCi0JCWRlYnVnKCJzZXRnaWQgJXU6ICUuMTAwcyIsICh1X2ludCkgZ2V0ZWdpZCgpLCBzdHJlcnJvcihlcnJubykpOwotCS8qIFByb3BhZ2F0ZSB0aGUgcHJpdmlsZWdlZCB1aWQgdG8gYWxsIG9mIG91ciB1aWRzLiAqLwotCWlmIChzZXR1aWQoZ2V0ZXVpZCgpKSA8IDApCi0JCWRlYnVnKCJzZXR1aWQgJXU6ICUuMTAwcyIsICh1X2ludCkgZ2V0ZXVpZCgpLCBzdHJlcnJvcihlcnJubykpOwotI2VuZGlmIC8qIFNBVkVEX0lEU19XT1JLX1dJVEhfU0VURVVJRCAqLwotCWlmIChzZXRlZ2lkKHB3LT5wd19naWQpIDwgMCkKLQkJZmF0YWwoInNldGVnaWQgJXU6ICUuMTAwcyIsICh1X2ludClwdy0+cHdfZ2lkLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoc2V0ZXVpZChwdy0+cHdfdWlkKSA9PSAtMSkKLQkJZmF0YWwoInNldGV1aWQgJXU6ICUuMTAwcyIsICh1X2ludClwdy0+cHdfdWlkLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLX0KLQotdm9pZAotcGVybWFuZW50bHlfZHJvcF9zdWlkKHVpZF90IHVpZCkKLXsKLQl1aWRfdCBvbGRfdWlkID0gZ2V0dWlkKCk7Ci0KLQlkZWJ1ZygicGVybWFuZW50bHlfZHJvcF9zdWlkOiAldSIsICh1X2ludCl1aWQpOwotI2lmIGRlZmluZWQoSEFWRV9TRVRSRVNVSUQpICYmICFkZWZpbmVkKEJST0tFTl9TRVRSRVNVSUQpCi0JaWYgKHNldHJlc3VpZCh1aWQsIHVpZCwgdWlkKSA8IDApCi0JCWZhdGFsKCJzZXRyZXN1aWQgJXU6ICUuMTAwcyIsICh1X2ludCl1aWQsIHN0cmVycm9yKGVycm5vKSk7Ci0jZWxpZiBkZWZpbmVkKEhBVkVfU0VUUkVVSUQpICYmICFkZWZpbmVkKEJST0tFTl9TRVRSRVVJRCkKLQlpZiAoc2V0cmV1aWQodWlkLCB1aWQpIDwgMCkKLQkJZmF0YWwoInNldHJldWlkICV1OiAlLjEwMHMiLCAodV9pbnQpdWlkLCBzdHJlcnJvcihlcnJubykpOwotI2Vsc2UKLSMgaWZuZGVmIFNFVEVVSURfQlJFQUtTX1NFVFVJRAotCWlmIChzZXRldWlkKHVpZCkgPCAwKQotCQlmYXRhbCgic2V0ZXVpZCAldTogJS4xMDBzIiwgKHVfaW50KXVpZCwgc3RyZXJyb3IoZXJybm8pKTsKLSMgZW5kaWYKLQlpZiAoc2V0dWlkKHVpZCkgPCAwKQotCQlmYXRhbCgic2V0dWlkICV1OiAlLjEwMHMiLCAodV9pbnQpdWlkLCBzdHJlcnJvcihlcnJubykpOwotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9DWUdXSU4KLQkvKiBUcnkgcmVzdG9yYXRpb24gb2YgVUlEIGlmIGNoYW5nZWQgKHRlc3QgY2xlYXJpbmcgb2Ygc2F2ZWQgdWlkKSAqLwotCWlmIChvbGRfdWlkICE9IHVpZCAmJgotCSAgICAoc2V0dWlkKG9sZF91aWQpICE9IC0xIHx8IHNldGV1aWQob2xkX3VpZCkgIT0gLTEpKQotCQlmYXRhbCgiJXM6IHdhcyBhYmxlIHRvIHJlc3RvcmUgb2xkIFtlXXVpZCIsIF9fZnVuY19fKTsKLSNlbmRpZgotCi0JLyogVmVyaWZ5IFVJRCBkcm9wIHdhcyBzdWNjZXNzZnVsICovCi0JaWYgKGdldHVpZCgpICE9IHVpZCB8fCBnZXRldWlkKCkgIT0gdWlkKSB7Ci0JCWZhdGFsKCIlczogZXVpZCBpbmNvcnJlY3QgdWlkOiV1IGV1aWQ6JXUgKHNob3VsZCBiZSAldSkiLAotCQkgICAgX19mdW5jX18sICh1X2ludClnZXR1aWQoKSwgKHVfaW50KWdldGV1aWQoKSwgKHVfaW50KXVpZCk7Ci0JfQotfQotCi0vKgotICogUmVzdG9yZXMgdG8gdGhlIG9yaWdpbmFsIChwcml2aWxlZ2VkKSB1aWQuCi0gKi8KLXZvaWQKLXJlc3RvcmVfdWlkKHZvaWQpCi17Ci0JLyogaXQncyBhIG5vLW9wIHVubGVzcyBwcml2aWxlZ2VkICovCi0JaWYgKCFwcml2aWxlZ2VkKSB7Ci0JCWRlYnVnKCJyZXN0b3JlX3VpZDogKHVucHJpdmlsZWdlZCkiKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoIXRlbXBvcmFyaWx5X3VzZV91aWRfZWZmZWN0aXZlKQotCQlmYXRhbCgicmVzdG9yZV91aWQ6IHRlbXBvcmFyaWx5X3VzZV91aWQgbm90IGVmZmVjdGl2ZSIpOwotCi0jaWZkZWYgU0FWRURfSURTX1dPUktfV0lUSF9TRVRFVUlECi0JZGVidWcoInJlc3RvcmVfdWlkOiAldS8ldSIsICh1X2ludClzYXZlZF9ldWlkLCAodV9pbnQpc2F2ZWRfZWdpZCk7Ci0JLyogU2V0IHRoZSBlZmZlY3RpdmUgdWlkIGJhY2sgdG8gdGhlIHNhdmVkIHByaXZpbGVnZWQgdWlkLiAqLwotCWlmIChzZXRldWlkKHNhdmVkX2V1aWQpIDwgMCkKLQkJZmF0YWwoInNldGV1aWQgJXU6ICUuMTAwcyIsICh1X2ludClzYXZlZF9ldWlkLCBzdHJlcnJvcihlcnJubykpOwotCWlmIChzZXRlZ2lkKHNhdmVkX2VnaWQpIDwgMCkKLQkJZmF0YWwoInNldGVnaWQgJXU6ICUuMTAwcyIsICh1X2ludClzYXZlZF9lZ2lkLCBzdHJlcnJvcihlcnJubykpOwotI2Vsc2UgLyogU0FWRURfSURTX1dPUktfV0lUSF9TRVRFVUlEICovCi0JLyoKLQkgKiBXZSBhcmUgdW5hYmxlIHRvIHJlc3RvcmUgdGhlIHJlYWwgdWlkIHRvIGl0cyB1bnByaXZpbGVnZWQgdmFsdWUuCi0JICogUHJvcGFnYXRlIHRoZSByZWFsIHVpZCAodXN1YWxseSBtb3JlIHByaXZpbGVnZWQpIHRvIGVmZmVjdGl2ZSB1aWQKLQkgKiBhcyB3ZWxsLgotCSAqLwotCXNldHVpZChnZXR1aWQoKSk7Ci0Jc2V0Z2lkKGdldGdpZCgpKTsKLSNlbmRpZiAvKiBTQVZFRF9JRFNfV09SS19XSVRIX1NFVEVVSUQgKi8KLQotCWlmIChzZXRncm91cHMoc2F2ZWRfZWdyb3Vwc2xlbiwgc2F2ZWRfZWdyb3VwcykgPCAwKQotCQlmYXRhbCgic2V0Z3JvdXBzOiAlLjEwMHMiLCBzdHJlcnJvcihlcnJubykpOwotCXRlbXBvcmFyaWx5X3VzZV91aWRfZWZmZWN0aXZlID0gMDsKLX0KLQotLyoKLSAqIFBlcm1hbmVudGx5IHNldHMgYWxsIHVpZHMgdG8gdGhlIGdpdmVuIHVpZC4gIFRoaXMgY2Fubm90IGJlCi0gKiBjYWxsZWQgd2hpbGUgdGVtcG9yYXJpbHlfdXNlX3VpZCBpcyBlZmZlY3RpdmUuCi0gKi8KLXZvaWQKLXBlcm1hbmVudGx5X3NldF91aWQoc3RydWN0IHBhc3N3ZCAqcHcpCi17Ci0JdWlkX3Qgb2xkX3VpZCA9IGdldHVpZCgpOwotCWdpZF90IG9sZF9naWQgPSBnZXRnaWQoKTsKLSNpZmRlZiBBTkRST0lECi0Jc3RydWN0IF9fdXNlcl9jYXBfaGVhZGVyX3N0cnVjdCBoZWFkZXI7Ci0Jc3RydWN0IF9fdXNlcl9jYXBfZGF0YV9zdHJ1Y3QgY2FwOwotI2VuZGlmCi0KLQlpZiAocHcgPT0gTlVMTCkKLQkJZmF0YWwoInBlcm1hbmVudGx5X3NldF91aWQ6IG5vIHVzZXIgZ2l2ZW4iKTsKLQlpZiAodGVtcG9yYXJpbHlfdXNlX3VpZF9lZmZlY3RpdmUpCi0JCWZhdGFsKCJwZXJtYW5lbnRseV9zZXRfdWlkOiB0ZW1wb3JhcmlseV91c2VfdWlkIGVmZmVjdGl2ZSIpOwotCWRlYnVnKCJwZXJtYW5lbnRseV9zZXRfdWlkOiAldS8ldSIsICh1X2ludClwdy0+cHdfdWlkLAotCSAgICAodV9pbnQpcHctPnB3X2dpZCk7Ci0KLSNpZmRlZiBBTkRST0lECi0JaWYgKHB3LT5wd191aWQgPT0gQUlEX1NIRUxMKSB7Ci0JCXByY3RsKFBSX1NFVF9LRUVQQ0FQUywgMSwgMCwgMCwgMCk7Ci0KLQkJLyogYWRkIGV4dHJhIGdyb3VwcyBuZWVkZWQgZm9yIHNoZWxsIHVzZXI6Ci0JCSoqIEFJRF9MT0cgdG8gcmVhZCBzeXN0ZW0gbG9ncyAoYWRiIGxvZ2NhdCkKLQkJKiogQUlEX0lOUFVUIHRvIGRpYWdub3NlIGlucHV0IGlzc3VlcyAoZ2V0ZXZlbnQpCi0JCSoqIEFJRF9JTkVUIHRvIGRpYWdub3NlIG5ldHdvcmsgaXNzdWVzIChuZXRjZmcsIHBpbmcpCi0JCSoqIEFJRF9HUkFQSElDUyB0byBhY2Nlc3MgdGhlIGZyYW1lIGJ1ZmZlcgotCQkqKiBBSURfTkVUX0JUIGFuZCBBSURfTkVUX0JUX0FETUlOIHRvIGRpYWdub3NlIGJsdWV0b290aCAoaGNpZHVtcCkKLQkJKiogQUlEX1NEQ0FSRF9SVyB0byBhbGxvdyB3cml0aW5nIHRvIHRoZSBTRCBjYXJkCi0JCSoqIEFJRF9NT1VOVCB0byBhbGxvdyB1bm1vdW50aW5nIHRoZSBTRCBjYXJkIGJlZm9yZSByZWJvb3RpbmcKLQkJKiogQUlEX05FVF9CV19TVEFUUyB0byByZWFkIG91dCBxdGFndWlkIHN0YXRpc3RpY3MKLQkJKi8KLQkJZ2lkX3QgZ3JvdXBzW10gPSB7IEFJRF9MT0csIEFJRF9JTlBVVCwgQUlEX0lORVQsIEFJRF9HUkFQSElDUywKLQkJCQkJCSAgIEFJRF9ORVRfQlQsIEFJRF9ORVRfQlRfQURNSU4sIEFJRF9TRENBUkRfUlcsCi0JCQkJCQkgICBBSURfTU9VTlQsIEFJRF9ORVRfQldfU1RBVFMgfTsKLQkJc2V0Z3JvdXBzKHNpemVvZihncm91cHMpL3NpemVvZihncm91cHNbMF0pLCBncm91cHMpOwotCX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChIQVZFX1NFVFJFU0dJRCkgJiYgIWRlZmluZWQoQlJPS0VOX1NFVFJFU0dJRCkKLQlpZiAoc2V0cmVzZ2lkKHB3LT5wd19naWQsIHB3LT5wd19naWQsIHB3LT5wd19naWQpIDwgMCkKLQkJZmF0YWwoInNldHJlc2dpZCAldTogJS4xMDBzIiwgKHVfaW50KXB3LT5wd19naWQsIHN0cmVycm9yKGVycm5vKSk7Ci0jZWxpZiBkZWZpbmVkKEhBVkVfU0VUUkVHSUQpICYmICFkZWZpbmVkKEJST0tFTl9TRVRSRUdJRCkKLQlpZiAoc2V0cmVnaWQocHctPnB3X2dpZCwgcHctPnB3X2dpZCkgPCAwKQotCQlmYXRhbCgic2V0cmVnaWQgJXU6ICUuMTAwcyIsICh1X2ludClwdy0+cHdfZ2lkLCBzdHJlcnJvcihlcnJubykpOwotI2Vsc2UKLQlpZiAoc2V0ZWdpZChwdy0+cHdfZ2lkKSA8IDApCi0JCWZhdGFsKCJzZXRlZ2lkICV1OiAlLjEwMHMiLCAodV9pbnQpcHctPnB3X2dpZCwgc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoc2V0Z2lkKHB3LT5wd19naWQpIDwgMCkKLQkJZmF0YWwoInNldGdpZCAldTogJS4xMDBzIiwgKHVfaW50KXB3LT5wd19naWQsIHN0cmVycm9yKGVycm5vKSk7Ci0jZW5kaWYKLQotI2lmZGVmIF9fQVBQTEVfXwotCS8qCi0JICogT1MgWCByZXF1aXJlcyBpbml0Z3JvdXBzIGFmdGVyIHNldGdpZCB0byBvcHQgYmFjayBpbnRvCi0JICogbWVtYmVyZCBzdXBwb3J0IGZvciA+MTYgc3VwcGxlbWVudGFsIGdyb3Vwcy4KLQkgKi8KLQlpZiAoaW5pdGdyb3Vwcyhwdy0+cHdfbmFtZSwgcHctPnB3X2dpZCkgPCAwKQotCQlmYXRhbCgiaW5pdGdyb3VwcyAlLjEwMHMgJXU6ICUuMTAwcyIsCi0JCSAgICBwdy0+cHdfbmFtZSwgKHVfaW50KXB3LT5wd19naWQsIHN0cmVycm9yKGVycm5vKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoSEFWRV9TRVRSRVNVSUQpICYmICFkZWZpbmVkKEJST0tFTl9TRVRSRVNVSUQpCi0JaWYgKHNldHJlc3VpZChwdy0+cHdfdWlkLCBwdy0+cHdfdWlkLCBwdy0+cHdfdWlkKSA8IDApCi0JCWZhdGFsKCJzZXRyZXN1aWQgJXU6ICUuMTAwcyIsICh1X2ludClwdy0+cHdfdWlkLCBzdHJlcnJvcihlcnJubykpOwotI2VsaWYgZGVmaW5lZChIQVZFX1NFVFJFVUlEKSAmJiAhZGVmaW5lZChCUk9LRU5fU0VUUkVVSUQpCi0JaWYgKHNldHJldWlkKHB3LT5wd191aWQsIHB3LT5wd191aWQpIDwgMCkKLQkJZmF0YWwoInNldHJldWlkICV1OiAlLjEwMHMiLCAodV9pbnQpcHctPnB3X3VpZCwgc3RyZXJyb3IoZXJybm8pKTsKLSNlbHNlCi0jIGlmbmRlZiBTRVRFVUlEX0JSRUFLU19TRVRVSUQKLQlpZiAoc2V0ZXVpZChwdy0+cHdfdWlkKSA8IDApCi0JCWZhdGFsKCJzZXRldWlkICV1OiAlLjEwMHMiLCAodV9pbnQpcHctPnB3X3VpZCwgc3RyZXJyb3IoZXJybm8pKTsKLSMgZW5kaWYKLQlpZiAoc2V0dWlkKHB3LT5wd191aWQpIDwgMCkKLQkJZmF0YWwoInNldHVpZCAldTogJS4xMDBzIiwgKHVfaW50KXB3LT5wd191aWQsIHN0cmVycm9yKGVycm5vKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0NZR1dJTgotCS8qIFRyeSByZXN0b3JhdGlvbiBvZiBHSUQgaWYgY2hhbmdlZCAodGVzdCBjbGVhcmluZyBvZiBzYXZlZCBnaWQpICovCi0JaWYgKG9sZF9naWQgIT0gcHctPnB3X2dpZCAmJiBwdy0+cHdfdWlkICE9IDAgJiYKLQkgICAgKHNldGdpZChvbGRfZ2lkKSAhPSAtMSB8fCBzZXRlZ2lkKG9sZF9naWQpICE9IC0xKSkKLQkJZmF0YWwoIiVzOiB3YXMgYWJsZSB0byByZXN0b3JlIG9sZCBbZV1naWQiLCBfX2Z1bmNfXyk7Ci0jZW5kaWYKLQotCS8qIFZlcmlmeSBHSUQgZHJvcCB3YXMgc3VjY2Vzc2Z1bCAqLwotCWlmIChnZXRnaWQoKSAhPSBwdy0+cHdfZ2lkIHx8IGdldGVnaWQoKSAhPSBwdy0+cHdfZ2lkKSB7Ci0JCWZhdGFsKCIlczogZWdpZCBpbmNvcnJlY3QgZ2lkOiV1IGVnaWQ6JXUgKHNob3VsZCBiZSAldSkiLAotCQkgICAgX19mdW5jX18sICh1X2ludClnZXRnaWQoKSwgKHVfaW50KWdldGVnaWQoKSwKLQkJICAgICh1X2ludClwdy0+cHdfZ2lkKTsKLQl9Ci0KLSNpZm5kZWYgSEFWRV9DWUdXSU4KLQkvKiBUcnkgcmVzdG9yYXRpb24gb2YgVUlEIGlmIGNoYW5nZWQgKHRlc3QgY2xlYXJpbmcgb2Ygc2F2ZWQgdWlkKSAqLwotCWlmIChvbGRfdWlkICE9IHB3LT5wd191aWQgJiYKLQkgICAgKHNldHVpZChvbGRfdWlkKSAhPSAtMSB8fCBzZXRldWlkKG9sZF91aWQpICE9IC0xKSkKLQkJZmF0YWwoIiVzOiB3YXMgYWJsZSB0byByZXN0b3JlIG9sZCBbZV11aWQiLCBfX2Z1bmNfXyk7Ci0jZW5kaWYKLQotCS8qIFZlcmlmeSBVSUQgZHJvcCB3YXMgc3VjY2Vzc2Z1bCAqLwotCWlmIChnZXR1aWQoKSAhPSBwdy0+cHdfdWlkIHx8IGdldGV1aWQoKSAhPSBwdy0+cHdfdWlkKSB7Ci0JCWZhdGFsKCIlczogZXVpZCBpbmNvcnJlY3QgdWlkOiV1IGV1aWQ6JXUgKHNob3VsZCBiZSAldSkiLAotCQkgICAgX19mdW5jX18sICh1X2ludClnZXR1aWQoKSwgKHVfaW50KWdldGV1aWQoKSwKLQkJICAgICh1X2ludClwdy0+cHdfdWlkKTsKLQl9Ci0KLSNpZmRlZiBBTkRST0lECi0JaWYgKHB3LT5wd191aWQgPT0gQUlEX1NIRUxMKSB7Ci0JCS8qIHNldCBDQVBfU1lTX0JPT1QgY2FwYWJpbGl0eSwgc28gImFkYiByZWJvb3QiIHdpbGwgc3VjY2VlZCAqLwotCQloZWFkZXIudmVyc2lvbiA9IF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT047Ci0JCWhlYWRlci5waWQgPSAwOwotCQljYXAuZWZmZWN0aXZlID0gY2FwLnBlcm1pdHRlZCA9ICgxIDw8IENBUF9TWVNfQk9PVCk7Ci0JCWNhcC5pbmhlcml0YWJsZSA9IDA7Ci0JCWNhcHNldCgmaGVhZGVyLCAmY2FwKTsKLQl9Ci0jZW5kaWYKLQotfQpkaWZmIC0tZ2l0IGEvdWlkc3dhcC5oIGIvdWlkc3dhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzExNjNkLi4wMDAwMDAwCi0tLSBhL3VpZHN3YXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qICRPcGVuQlNEOiB1aWRzd2FwLmgsdiAxLjEzIDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLwotCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLQotdm9pZAkgdGVtcG9yYXJpbHlfdXNlX3VpZChzdHJ1Y3QgcGFzc3dkICopOwotdm9pZAkgcmVzdG9yZV91aWQodm9pZCk7Ci12b2lkCSBwZXJtYW5lbnRseV9zZXRfdWlkKHN0cnVjdCBwYXNzd2QgKik7Ci12b2lkCSBwZXJtYW5lbnRseV9kcm9wX3N1aWQodWlkX3QpOwpkaWZmIC0tZ2l0IGEvdW1hYy5jIGIvdW1hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjkwMmJjLi4wMDAwMDAwCi0tLSBhL3VtYWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNzcgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHVtYWMuYyx2IDEuMyAyMDA4LzA1LzEyIDIwOjUyOjIwIHB2YWxjaGV2IEV4cCAkICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogCi0gKiB1bWFjLmMgLS0gQyBJbXBsZW1lbnRhdGlvbiBVTUFDIE1lc3NhZ2UgQXV0aGVudGljYXRpb24KLSAqCi0gKiBWZXJzaW9uIDAuOTNiIG9mIHJmYzQ0MTgudHh0IC0tIDIwMDYgSnVseSAxOAotICoKLSAqIEZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgVU1BQyBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIHNlZSB0aGUgVU1BQwotICogd29ybGQtd2lkZS13ZWIgcGFnZSBhdCBodHRwOi8vd3d3LmNzLnVjZGF2aXMuZWR1L35yb2dhd2F5L3VtYWMKLSAqIFBsZWFzZSByZXBvcnQgYnVncyBhbmQgc3VnZ2VzdGlvbnMgdG8gdGhlIFVNQUMgd2VicGFnZS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNiBUZWQgS3JvdmV0egotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKLSAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aCBvciB3aXRob3V0IGZlZSwgaXMgaGVyZWJ5Ci0gKiBncmFudGVkIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzCi0gKiBhbmQgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0Ci0gKiBob2xkZXIgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8KLSAqIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgotICoKLSAqIENvbW1lbnRzIHNob3VsZCBiZSBkaXJlY3RlZCB0byBUZWQgS3JvdmV0eiAodGRrQGFjbS5vcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gCi0gLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJTVBPUlRBTlQgTk9URVMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICoKLSAgKiAxKSBUaGlzIHZlcnNpb24gZG9lcyBub3Qgd29yayBwcm9wZXJseSBvbiBtZXNzYWdlcyBsYXJnZXIgdGhhbiAxNk1CCi0gICoKLSAgKiAyKSBJZiB5b3Ugc2V0IHRoZSBzd2l0Y2ggdG8gdXNlIFNTRTIsIHRoZW4gYWxsIGRhdGEgbXVzdCBiZSAxNi1ieXRlCi0gICogICAgYWxpZ25lZAotICAqCi0gICogMykgV2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvbiB1bWFjKCksIGl0IGlzIGFzc3VtZWQgdGhhdCBtc2cgaXMgaW4KLSAgKiBhIHdyaXRhYmxlIGJ1ZmZlciBvZiBsZW5ndGggZGl2aXNpYmxlIGJ5IDMyIGJ5dGVzLiBUaGUgbWVzc2FnZSBpdHNlbGYKLSAgKiBkb2VzIG5vdCBoYXZlIHRvIGZpbGwgdGhlIGVudGlyZSBidWZmZXIsIGJ1dCBieXRlcyBiZXlvbmQgbXNnIG1heSBiZQotICAqIHplcm9lZC4KLSAgKgotICAqIDQpIFRocmVlIGZyZWUgQUVTIGltcGxlbWVudGF0aW9ucyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24gb2YKLSAgKiBVTUFDLiBQYXVsbyBCYXJyZXRvJ3MgdmVyc2lvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiBhbmQgY2FuIGJlIGZvdW5kCi0gICogYXQgaHR0cDovL3d3dy5lc2F0Lmt1bGV1dmVuLmFjLmJlL35yaWptZW4vcmlqbmRhZWwvIChzZWFyY2ggZm9yCi0gICogIkJhcnJldG8iKS4gVGhlIG9ubHkgdHdvIGZpbGVzIG5lZWRlZCBhcmUgcmlqbmRhZWwtYWxnLWZzdC5jIGFuZAotICAqIHJpam5kYWVsLWFsZy1mc3QuaC4gQnJpYW4gR2xhZG1hbidzIHZlcnNpb24gaXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgR05VCi0gICogUHVibGljIGxpc2VuY2UgYXQgaHR0cDovL2ZwLmdsYWRtYW4ucGx1cy5jb20vQUVTL2luZGV4Lmh0bS4gSXQKLSAgKiBpbmNsdWRlcyBhIGZhc3QgSUEtMzIgYXNzZW1ibHkgdmVyc2lvbi4gVGhlIE9wZW5TU0wgY3J5cG8gbGlicmFyeSBpcwotICAqIHRoZSB0aGlyZC4KLSAgKgotICAqIDUpIFdpdGggRk9SQ0VfQ19PTkxZIGZsYWdzIHNldCB0byAwLCBpbmNvcnJlY3QgcmVzdWx0cyBhcmUgc29tZXRpbWVzCi0gICogcHJvZHVjZWQgdW5kZXIgZ2NjIHdpdGggb3B0aW1pemF0aW9ucyBzZXQgLU8zIG9yIGhpZ2hlci4gRHVubm8gd2h5LgotICAqCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0gCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0gVXNlciBTd2l0Y2hlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNkZWZpbmUgVU1BQ19PVVRQVVRfTEVOICAgICA4ICAvKiBBbG93YWJsZTogNCwgOCwgMTIsIDE2ICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRk9SQ0VfQ19PTkxZICAgICAgICAxICBBTlNJIEMgYW5kIDY0LWJpdCBpbnRlZ2VycyByZXEnZCAgICAgICAgKi8KLS8qICNkZWZpbmUgQUVTX0lNUExFTUVOVEFJT04gICAxICAxID0gT3BlblNTTCwgMiA9IEJhcnJldG8sIDMgPSBHbGFkbWFuICAgKi8KLS8qICNkZWZpbmUgU1NFMiAgICAgICAgICAgICAgICAwICBJcyBTU0UyIGlzIGF2YWlsYWJsZT8gICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgUlVOX1RFU1RTICAgICAgICAgICAwICBSdW4gYmFzaWMgY29ycmVjdG5lc3Mvc3BlZWQgdGVzdHMgICAgICAgKi8KLS8qICNkZWZpbmUgVU1BQ19BRV9TVVBQT1JUICAgICAwICBFbmFibGUgYXVodGhlbnRpY2F0ZWQgZW5jcnl0aW9uICAgICAgICAgKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogLS0gR2xvYmFsIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgInhtYWxsb2MuaCIKLSNpbmNsdWRlICJ1bWFjLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLSBQcmltaXRpdmUgRGF0YSBUeXBlcyAtLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogVGhlIGZvbGxvd2luZyBhc3N1bXB0aW9ucyBtYXkgbmVlZCBjaGFuZ2Ugb24geW91ciBzeXN0ZW0gKi8KLXR5cGVkZWYgdV9pbnQ4X3QJVUlOVDg7ICAvKiAxIGJ5dGUgICAqLwotdHlwZWRlZiB1X2ludDE2X3QJVUlOVDE2OyAvKiAyIGJ5dGUgICAqLwotdHlwZWRlZiB1X2ludDMyX3QJVUlOVDMyOyAvKiA0IGJ5dGUgICAqLwotdHlwZWRlZiB1X2ludDY0X3QJVUlOVDY0OyAvKiA4IGJ5dGVzICAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQJVVdPUkQ7ICAvKiBSZWdpc3RlciAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0gQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNkZWZpbmUgVU1BQ19LRVlfTEVOICAgICAgICAgICAxNiAgLyogVU1BQyB0YWtlcyAxNiBieXRlcyBvZiBleHRlcm5hbCBrZXkgKi8KLQotLyogTWVzc2FnZSAid29yZHMiIGFyZSByZWFkIGZyb20gbWVtb3J5IGluIGFuIGVuZGlhbi1zcGVjaWZpYyBtYW5uZXIuICAgICAqLwotLyogRm9yIHRoaXMgaW1wbGVtZW50YXRpb24gdG8gYmVoYXZlIGNvcnJlY3RseSwgX19MSVRUTEVfRU5ESUFOX18gbXVzdCAgICAqLwotLyogYmUgc2V0IHRydWUgaWYgdGhlIGhvc3QgY29tcHV0ZXIgaXMgbGl0dGxlLWVuZGlhbi4gICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCi0jZGVmaW5lIF9fTElUVExFX0VORElBTl9fIDEKLSNlbHNlCi0jZGVmaW5lIF9fTElUVExFX0VORElBTl9fIDAKLSNlbmRpZgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLSBBcmNoaXRlY3R1cmUgU3BlY2lmaWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogLS0tLS0gUHJpbWl0aXZlIFJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLSAzMi1iaXQgYnkgMzItYml0IHRvIDY0LWJpdCBNdWx0aXBsaWNhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2RlZmluZSBNVUw2NChhLGIpICgoVUlOVDY0KSgoVUlOVDY0KShVSU5UMzIpKGEpICogKFVJTlQ2NCkoVUlOVDMyKShiKSkpCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLSBFbmRpYW4gQ29udmVyc2lvbiAtLS0gRm9yY2luZyBhc3NlbWJseSBvbiBzb21lIHBsYXRmb3JtcyAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIEhBVkVfU1dBUDMyCi0jZGVmaW5lIExPQURfVUlOVDMyX1JFVkVSU0VEKHApCQkoc3dhcDMyKCooVUlOVDMyICopKHApKSkKLSNkZWZpbmUgU1RPUkVfVUlOVDMyX1JFVkVSU0VEKHAsdikgCSgqKFVJTlQzMiAqKShwKSA9IHN3YXAzMih2KSkKLSNlbHNlIC8qIEhBVkVfU1dBUDMyICovCi0KLXN0YXRpYyBVSU5UMzIgTE9BRF9VSU5UMzJfUkVWRVJTRUQodm9pZCAqcHRyKQotewotICAgIFVJTlQzMiB0ZW1wID0gKihVSU5UMzIgKilwdHI7Ci0gICAgdGVtcCA9ICh0ZW1wID4+IDI0KSB8ICgodGVtcCAmIDB4MDBGRjAwMDApID4+IDggKQotICAgICAgICAgfCAoKHRlbXAgJiAweDAwMDBGRjAwKSA8PCA4ICkgfCAodGVtcCA8PCAyNCk7Ci0gICAgcmV0dXJuIChVSU5UMzIpdGVtcDsKLX0KLQotIyBpZiAoX19MSVRUTEVfRU5ESUFOX18pCi1zdGF0aWMgdm9pZCBTVE9SRV9VSU5UMzJfUkVWRVJTRUQodm9pZCAqcHRyLCBVSU5UMzIgeCkKLXsKLSAgICBVSU5UMzIgaSA9IChVSU5UMzIpeDsKLSAgICAqKFVJTlQzMiAqKXB0ciA9IChpID4+IDI0KSB8ICgoaSAmIDB4MDBGRjAwMDApID4+IDggKQotICAgICAgICAgICAgICAgICAgIHwgKChpICYgMHgwMDAwRkYwMCkgPDwgOCApIHwgKGkgPDwgMjQpOwotfQotIyBlbmRpZiAvKiBfX0xJVFRMRV9FTkRJQU4gKi8KLSNlbmRpZiAvKiBIQVZFX1NXQVAzMiAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHVzZSB0aGUgYWJvdmUgcmV2ZXJzYWwtcHJpbWl0aXZlcyB0byBkbyB0aGUgcmlnaHQKLSAqIHRoaW5nIG9uIGVuZGlhbiBzcGVjaWZpYyBsb2FkIGFuZCBzdG9yZXMuCi0gKi8KLQotI2lmIChfX0xJVFRMRV9FTkRJQU5fXykKLSNkZWZpbmUgTE9BRF9VSU5UMzJfTElUVExFKHB0cikgICAgICgqKFVJTlQzMiAqKShwdHIpKQotI2RlZmluZSBTVE9SRV9VSU5UMzJfQklHKHB0cix4KSAgICAgU1RPUkVfVUlOVDMyX1JFVkVSU0VEKHB0cix4KQotI2Vsc2UKLSNkZWZpbmUgTE9BRF9VSU5UMzJfTElUVExFKHB0cikgICAgIExPQURfVUlOVDMyX1JFVkVSU0VEKHB0cikKLSNkZWZpbmUgU1RPUkVfVUlOVDMyX0JJRyhwdHIseCkgICAgICgqKFVJTlQzMiAqKShwdHIpID0gKFVJTlQzMikoeCkpCi0jZW5kaWYKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogLS0tLS0gQmVnaW4gS0RGICYgUERGIFNlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBVTUFDIHVzZXMgQUVTIHdpdGggMTYgYnl0ZSBibG9jayBhbmQga2V5IGxlbmd0aHMgKi8KLSNkZWZpbmUgQUVTX0JMT0NLX0xFTiAgMTYKLQotLyogT3BlblNTTCdzIEFFUyAqLwotI2luY2x1ZGUgIm9wZW5ic2QtY29tcGF0L29wZW5zc2wtY29tcGF0LmgiCi0jaWZuZGVmIFVTRV9CVUlMVElOX1JJSk5EQUVMCi0jIGluY2x1ZGUgPG9wZW5zc2wvYWVzLmg+Ci0jZW5kaWYKLXR5cGVkZWYgQUVTX0tFWSBhZXNfaW50X2tleVsxXTsKLSNkZWZpbmUgYWVzX2VuY3J5cHRpb24oaW4sb3V0LGludF9rZXkpICAgICAgICAgICAgICAgICAgXAotICBBRVNfZW5jcnlwdCgodV9jaGFyICopKGluKSwodV9jaGFyICopKG91dCksKEFFU19LRVkgKilpbnRfa2V5KQotI2RlZmluZSBhZXNfa2V5X3NldHVwKGtleSxpbnRfa2V5KSAgICAgICAgICAgICAgICAgICAgICBcCi0gIEFFU19zZXRfZW5jcnlwdF9rZXkoKHVfY2hhciAqKShrZXkpLFVNQUNfS0VZX0xFTio4LGludF9rZXkpCi0KLS8qIFRoZSB1c2VyLXN1cHBsaWVkIFVNQUMga2V5IGlzIHN0cmV0Y2hlZCB1c2luZyBBRVMgaW4gYSBjb3VudGVyCi0gKiBtb2RlIHRvIHN1cHBseSBhbGwgcmFuZG9tIGJpdHMgbmVlZGVkIGJ5IFVNQUMuIFRoZSBrZGYgZnVuY3Rpb24gdGFrZXMKLSAqIGFuIEFFUyBpbnRlcm5hbCBrZXkgcmVwcmVzZW50YXRpb24gJ2tleScgYW5kIHdyaXRlcyBhIHN0cmVhbSBvZgotICogJ25ieXRlcycgYnl0ZXMgdG8gdGhlIG1lbW9yeSBwb2ludGVkIGF0IGJ5ICdidWZwJy4gRWFjaCBkaXN0aW5jdAotICogJ25keCcgY2F1c2VzIGEgZGlzdGluY3QgYnl0ZSBzdHJlYW0uCi0gKi8KLXN0YXRpYyB2b2lkIGtkZih2b2lkICpidWZwLCBhZXNfaW50X2tleSBrZXksIFVJTlQ4IG5keCwgaW50IG5ieXRlcykKLXsKLSAgICBVSU5UOCBpbl9idWZbQUVTX0JMT0NLX0xFTl0gPSB7MH07Ci0gICAgVUlOVDggb3V0X2J1ZltBRVNfQkxPQ0tfTEVOXTsKLSAgICBVSU5UOCAqZHN0X2J1ZiA9IChVSU5UOCAqKWJ1ZnA7Ci0gICAgaW50IGk7Ci0gICAgCi0gICAgLyogU2V0dXAgdGhlIGluaXRpYWwgdmFsdWUgKi8KLSAgICBpbl9idWZbQUVTX0JMT0NLX0xFTi05XSA9IG5keDsKLSAgICBpbl9idWZbQUVTX0JMT0NLX0xFTi0xXSA9IGkgPSAxOwotICAgICAgICAKLSAgICB3aGlsZSAobmJ5dGVzID49IEFFU19CTE9DS19MRU4pIHsKLSAgICAgICAgYWVzX2VuY3J5cHRpb24oaW5fYnVmLCBvdXRfYnVmLCBrZXkpOwotICAgICAgICBtZW1jcHkoZHN0X2J1ZixvdXRfYnVmLEFFU19CTE9DS19MRU4pOwotICAgICAgICBpbl9idWZbQUVTX0JMT0NLX0xFTi0xXSA9ICsraTsKLSAgICAgICAgbmJ5dGVzIC09IEFFU19CTE9DS19MRU47Ci0gICAgICAgIGRzdF9idWYgKz0gQUVTX0JMT0NLX0xFTjsKLSAgICB9Ci0gICAgaWYgKG5ieXRlcykgewotICAgICAgICBhZXNfZW5jcnlwdGlvbihpbl9idWYsIG91dF9idWYsIGtleSk7Ci0gICAgICAgIG1lbWNweShkc3RfYnVmLG91dF9idWYsbmJ5dGVzKTsKLSAgICB9Ci19Ci0KLS8qIFRoZSBmaW5hbCBVSEFTSCByZXN1bHQgaXMgWE9SJ2Qgd2l0aCB0aGUgb3V0cHV0IG9mIGEgcHNldWRvcmFuZG9tCi0gKiBmdW5jdGlvbi4gSGVyZSwgd2UgdXNlIEFFUyB0byBnZW5lcmF0ZSByYW5kb20gb3V0cHV0IGFuZCAKLSAqIHhvciB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgZGVwZW5kaW5nIG9uIHRoZSBsYXN0IGJpdHMgb2Ygbm9uY2UuCi0gKiBUaGlzIHNjaGVtZSBpcyBvcHRpbWl6ZWQgZm9yIHNlcXVlbnRpYWwsIGluY3JlYXNpbmcgYmlnLWVuZGlhbiBub25jZXMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVJTlQ4IGNhY2hlW0FFU19CTE9DS19MRU5dOyAgLyogUHJldmlvdXMgQUVTIG91dHB1dCBpcyBzYXZlZCAgICAgICovCi0gICAgVUlOVDggbm9uY2VbQUVTX0JMT0NLX0xFTl07ICAvKiBUaGUgQUVTIGlucHV0IG1ha2luZyBhYm92ZSBjYWNoZSAgKi8KLSAgICBhZXNfaW50X2tleSBwcmZfa2V5OyAgICAgICAgIC8qIEV4cGFuZGVkIEFFUyBrZXkgZm9yIFBERiAgICAgICAgICAqLwotfSBwZGZfY3R4OwotCi1zdGF0aWMgdm9pZCBwZGZfaW5pdChwZGZfY3R4ICpwYywgYWVzX2ludF9rZXkgcHJmX2tleSkKLXsKLSAgICBVSU5UOCBidWZbVU1BQ19LRVlfTEVOXTsKLSAgICAKLSAgICBrZGYoYnVmLCBwcmZfa2V5LCAwLCBVTUFDX0tFWV9MRU4pOwotICAgIGFlc19rZXlfc2V0dXAoYnVmLCBwYy0+cHJmX2tleSk7Ci0gICAgCi0gICAgLyogSW5pdGlhbGl6ZSBwZGYgYW5kIGNhY2hlICovCi0gICAgbWVtc2V0KHBjLT5ub25jZSwgMCwgc2l6ZW9mKHBjLT5ub25jZSkpOwotICAgIGFlc19lbmNyeXB0aW9uKHBjLT5ub25jZSwgcGMtPmNhY2hlLCBwYy0+cHJmX2tleSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBkZl9nZW5feG9yKHBkZl9jdHggKnBjLCBVSU5UOCBub25jZVs4XSwgVUlOVDggYnVmWzhdKQotewotICAgIC8qICduZHgnIGluZGljYXRlcyB0aGF0IHdlJ2xsIGJlIHVzaW5nIHRoZSAwdGggb3IgMXN0IGVpZ2h0IGJ5dGVzCi0gICAgICogb2YgdGhlIEFFUyBvdXRwdXQuIElmIGxhc3QgdGltZSBhcm91bmQgd2UgcmV0dXJuZWQgdGhlIG5keC0xc3QKLSAgICAgKiBlbGVtZW50LCB0aGVuIHdlIG1heSBoYXZlIHRoZSByZXN1bHQgaW4gdGhlIGNhY2hlIGFscmVhZHkuCi0gICAgICovCi0gICAgIAotI2lmIChVTUFDX09VVFBVVF9MRU4gPT0gNCkKLSNkZWZpbmUgTE9XX0JJVF9NQVNLIDMKLSNlbGlmIChVTUFDX09VVFBVVF9MRU4gPT0gOCkKLSNkZWZpbmUgTE9XX0JJVF9NQVNLIDEKLSNlbGlmIChVTUFDX09VVFBVVF9MRU4gPiA4KQotI2RlZmluZSBMT1dfQklUX01BU0sgMAotI2VuZGlmCi0KLSAgICBVSU5UOCB0bXBfbm9uY2VfbG9bNF07Ci0jaWYgTE9XX0JJVF9NQVNLICE9IDAKLSAgICBpbnQgbmR4ID0gbm9uY2VbN10gJiBMT1dfQklUX01BU0s7Ci0jZW5kaWYKLSAgICAqKFVJTlQzMiAqKXRtcF9ub25jZV9sbyA9ICgoVUlOVDMyICopbm9uY2UpWzFdOwotICAgIHRtcF9ub25jZV9sb1szXSAmPSB+TE9XX0JJVF9NQVNLOyAvKiB6ZXJvIGxhc3QgYml0ICovCi0gICAgCi0gICAgaWYgKCAoKChVSU5UMzIgKil0bXBfbm9uY2VfbG8pWzBdICE9ICgoVUlOVDMyICopcGMtPm5vbmNlKVsxXSkgfHwKLSAgICAgICAgICgoKFVJTlQzMiAqKW5vbmNlKVswXSAhPSAoKFVJTlQzMiAqKXBjLT5ub25jZSlbMF0pICkKLSAgICB7Ci0gICAgICAgICgoVUlOVDMyICopcGMtPm5vbmNlKVswXSA9ICgoVUlOVDMyICopbm9uY2UpWzBdOwotICAgICAgICAoKFVJTlQzMiAqKXBjLT5ub25jZSlbMV0gPSAoKFVJTlQzMiAqKXRtcF9ub25jZV9sbylbMF07Ci0gICAgICAgIGFlc19lbmNyeXB0aW9uKHBjLT5ub25jZSwgcGMtPmNhY2hlLCBwYy0+cHJmX2tleSk7Ci0gICAgfQotICAgIAotI2lmIChVTUFDX09VVFBVVF9MRU4gPT0gNCkKLSAgICAqKChVSU5UMzIgKilidWYpIF49ICgoVUlOVDMyICopcGMtPmNhY2hlKVtuZHhdOwotI2VsaWYgKFVNQUNfT1VUUFVUX0xFTiA9PSA4KQotICAgICooKFVJTlQ2NCAqKWJ1ZikgXj0gKChVSU5UNjQgKilwYy0+Y2FjaGUpW25keF07Ci0jZWxpZiAoVU1BQ19PVVRQVVRfTEVOID09IDEyKQotICAgICgoVUlOVDY0ICopYnVmKVswXSBePSAoKFVJTlQ2NCAqKXBjLT5jYWNoZSlbMF07Ci0gICAgKChVSU5UMzIgKilidWYpWzJdIF49ICgoVUlOVDMyICopcGMtPmNhY2hlKVsyXTsKLSNlbGlmIChVTUFDX09VVFBVVF9MRU4gPT0gMTYpCi0gICAgKChVSU5UNjQgKilidWYpWzBdIF49ICgoVUlOVDY0ICopcGMtPmNhY2hlKVswXTsKLSAgICAoKFVJTlQ2NCAqKWJ1ZilbMV0gXj0gKChVSU5UNjQgKilwYy0+Y2FjaGUpWzFdOwotI2VuZGlmCi19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLS0tIEJlZ2luIE5IIEhhc2ggU2VjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogVGhlIE5ILWJhc2VkIGhhc2ggZnVuY3Rpb25zIHVzZWQgaW4gVU1BQyBhcmUgZGVzY3JpYmVkIGluIHRoZSBVTUFDIHBhcGVyCi0gKiBhbmQgc3BlY2lmaWNhdGlvbiwgYm90aCBvZiB3aGljaCBjYW4gYmUgZm91bmQgYXQgdGhlIFVNQUMgd2Vic2l0ZS4gICAgIAotICogVGhlIGludGVyZmFjZSB0byB0aGlzIGltcGxlbWVudGF0aW9uIGhhcyB0d28gICAgICAgICAKLSAqIHZlcnNpb25zLCBvbmUgZXhwZWN0cyB0aGUgZW50aXJlIG1lc3NhZ2UgYmVpbmcgaGFzaGVkIHRvIGJlIHBhc3NlZAotICogaW4gYSBzaW5nbGUgYnVmZmVyIGFuZCByZXR1cm5zIHRoZSBoYXNoIHJlc3VsdCBpbW1lZGlhdGVseS4gVGhlIHNlY29uZAotICogYWxsb3dzIHRoZSBtZXNzYWdlIHRvIGJlIHBhc3NlZCBpbiBhIHNlcXVlbmNlIG9mIGJ1ZmZlcnMuIEluIHRoZSAgICAgICAgICAKLSAqIG11bGlwbGUtYnVmZmVyIGludGVyZmFjZSwgdGhlIGNsaWVudCBjYWxscyB0aGUgcm91dGluZSBuaF91cGRhdGUoKSBhcyAgICAgCi0gKiBtYW55IHRpbWVzIGFzIG5lY2Vzc2FyeS4gV2hlbiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8gYmUgZmVkIHRvIHRoZSAgIAotICogaGFzaCwgdGhlIGNsaWVudCBjYWxscyBuaF9maW5hbCgpIHdoaWNoIGNhbGN1bGF0ZXMgdGhlIGhhc2ggb3V0cHV0LiAgICAKLSAqIEJlZm9yZSBiZWdpbm5pbmcgYW5vdGhlciBoYXNoIGNhbGN1bGF0aW9uIHRoZSBuaF9yZXNldCgpIHJvdXRpbmUgICAgICAgCi0gKiBtdXN0IGJlIGNhbGxlZC4gVGhlIHNpbmdsZS1idWZmZXIgcm91dGluZSwgbmgoKSwgaXMgZXF1aXZhbGVudCB0byAgCi0gKiB0aGUgc2VxdWVuY2Ugb2YgY2FsbHMgbmhfdXBkYXRlKCkgYW5kIG5oX2ZpbmFsKCk7IGhvd2V2ZXIgaXQgaXMgICAgICAgIAotICogb3B0aW1pemVkIGFuZCBzaG91bGQgYmUgcHJlZmVyZWQgd2hlbmV2ZXIgdGhlIG11bHRpcGxlLWJ1ZmZlciBpbnRlcmZhY2UKLSAqIGlzIG5vdCBuZWNlc3NhcnkuIFdoZW4gdXNpbmcgZWl0aGVyIGludGVyZmFjZSwgaXQgaXMgdGhlIGNsaWVudCdzICAgICAgICAgCi0gKiByZXNwb25zYWJpbGl0eSB0byBwYXNzIG5vIG1vcmUgdGhhbiBMMV9LRVlfTEVOIGJ5dGVzIHBlciBoYXNoIHJlc3VsdC4gICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBUaGUgcm91dGluZSBuaF9pbml0KCkgaW5pdGlhbGl6ZXMgdGhlIG5oX2N0eCBkYXRhIHN0cnVjdHVyZSBhbmQgICAgICAgIAotICogbXVzdCBiZSBjYWxsZWQgb25jZSwgYmVmb3JlIGFueSBvdGhlciBQREYgcm91dGluZS4gICAgICAgICAgICAgICAgICAgICAKLSAqLwotIAotIC8qIFRoZSAibmhfYXV4IiByb3V0aW5lcyBkbyB0aGUgYWN0dWFsIE5IIGhhc2hpbmcgd29yay4gVGhleQotICAqIGV4cGVjdCBidWZmZXJzIHRvIGJlIG11bHRpcGxlcyBvZiBMMV9QQURfQk9VTkRBUlkuIFRoZXNlIHJvdXRpbmVzCi0gICogcHJvZHVjZSBvdXRwdXQgZm9yIGFsbCBTVFJFQU1TIE5IIGl0ZXJhdGlvbnMgaW4gb25lIGNhbGwsIAotICAqIGFsbG93aW5nIHRoZSBwYXJhbGxlbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3RyZWFtcy4KLSAgKi8KLQotI2RlZmluZSBTVFJFQU1TIChVTUFDX09VVFBVVF9MRU4gLyA0KSAvKiBOdW1iZXIgb2YgdGltZXMgaGFzaCBpcyBhcHBsaWVkICAqLwotI2RlZmluZSBMMV9LRVlfTEVOICAgICAgICAgMTAyNCAgICAgLyogSW50ZXJuYWwga2V5IGJ5dGVzICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMMV9LRVlfU0hJRlQgICAgICAgICAxNiAgICAgLyogVG9lcGxpdHoga2V5IHNoaWZ0IGJldHdlZW4gc3RyZWFtcyAqLwotI2RlZmluZSBMMV9QQURfQk9VTkRBUlkgICAgICAzMiAgICAgLyogcGFkIG1lc3NhZ2UgdG8gYm91bmRhcnkgbXVsdGlwbGUgICAqLwotI2RlZmluZSBBTExPQ19CT1VOREFSWSAgICAgICAxNiAgICAgLyogS2VlcCBidWZmZXJzIGFsaWduZWQgdG8gdGhpcyAgICAgICAqLwotI2RlZmluZSBIQVNIX0JVRl9CWVRFUyAgICAgICA2NCAgICAgLyogbmhfYXV4X2hiIGJ1ZmZlciBtdWx0aXBsZSAgICAgICAgICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUlOVDggIG5oX2tleSBbTDFfS0VZX0xFTiArIEwxX0tFWV9TSElGVCAqIChTVFJFQU1TIC0gMSldOyAvKiBOSCBLZXkgKi8KLSAgICBVSU5UOCAgZGF0YSAgIFtIQVNIX0JVRl9CWVRFU107ICAgIC8qIEluY29tbWluZyBkYXRhIGJ1ZmZlciAgICAgICAgICAgKi8KLSAgICBpbnQgbmV4dF9kYXRhX2VtcHR5OyAgICAvKiBCb29rZWVwaW5nIHZhcmlhYmxlIGZvciBkYXRhIGJ1ZmZlci4gICAgICAgKi8KLSAgICBpbnQgYnl0ZXNfaGFzaGVkOyAgICAgICAgLyogQnl0ZXMgKG91dCBvZiBMMV9LRVlfTEVOKSBpbmNvcnBlcmF0ZWQuICAgKi8KLSAgICBVSU5UNjQgc3RhdGVbU1RSRUFNU107ICAgICAgICAgICAgICAgLyogb24tbGluZSBzdGF0ZSAgICAgKi8KLX0gbmhfY3R4OwotCi0KLSNpZiAoVU1BQ19PVVRQVVRfTEVOID09IDQpCi0KLXN0YXRpYyB2b2lkIG5oX2F1eCh2b2lkICprcCwgdm9pZCAqZHAsIHZvaWQgKmhwLCBVSU5UMzIgZGxlbikKLS8qIE5IIGhhc2hpbmcgcHJpbWl0aXZlLiBQcmV2aW91cyAocGFydGlhbCkgaGFzaCByZXN1bHQgaXMgbG9hZGVkIGFuZCAgICAgCi0qIHRoZW4gc3RvcmVkIHZpYSBocCBwb2ludGVyLiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHBvaW50ZWQgYXQgYnkgImRwIiwKLSogImRsZW4iLCBpcyBndWFyYW50ZWVkIHRvIGJlIGRpdmlzaWJsZSBieSBMMV9QQURfQk9VTkRBUlkgKDMyKS4gIEtleQotKiBpcyBleHBlY3RlZCB0byBiZSBlbmRpYW4gY29tcGVuc2F0ZWQgaW4gbWVtb3J5IGF0IGtleSBzZXR1cC4gICAgCi0qLwotewotICAgIFVJTlQ2NCBoOwotICAgIFVXT1JEIGMgPSBkbGVuIC8gMzI7Ci0gICAgVUlOVDMyICprID0gKFVJTlQzMiAqKWtwOwotICAgIFVJTlQzMiAqZCA9IChVSU5UMzIgKilkcDsKLSAgICBVSU5UMzIgZDAsZDEsZDIsZDMsZDQsZDUsZDYsZDc7Ci0gICAgVUlOVDMyIGswLGsxLGsyLGszLGs0LGs1LGs2LGs3OwotICAgIAotICAgIGggPSAqKChVSU5UNjQgKilocCk7Ci0gICAgZG8gewotICAgICAgICBkMCA9IExPQURfVUlOVDMyX0xJVFRMRShkKzApOyBkMSA9IExPQURfVUlOVDMyX0xJVFRMRShkKzEpOwotICAgICAgICBkMiA9IExPQURfVUlOVDMyX0xJVFRMRShkKzIpOyBkMyA9IExPQURfVUlOVDMyX0xJVFRMRShkKzMpOwotICAgICAgICBkNCA9IExPQURfVUlOVDMyX0xJVFRMRShkKzQpOyBkNSA9IExPQURfVUlOVDMyX0xJVFRMRShkKzUpOwotICAgICAgICBkNiA9IExPQURfVUlOVDMyX0xJVFRMRShkKzYpOyBkNyA9IExPQURfVUlOVDMyX0xJVFRMRShkKzcpOwotICAgICAgICBrMCA9ICooayswKTsgazEgPSAqKGsrMSk7IGsyID0gKihrKzIpOyBrMyA9ICooayszKTsKLSAgICAgICAgazQgPSAqKGsrNCk7IGs1ID0gKihrKzUpOyBrNiA9ICooays2KTsgazcgPSAqKGsrNyk7Ci0gICAgICAgIGggKz0gTVVMNjQoKGswICsgZDApLCAoazQgKyBkNCkpOwotICAgICAgICBoICs9IE1VTDY0KChrMSArIGQxKSwgKGs1ICsgZDUpKTsKLSAgICAgICAgaCArPSBNVUw2NCgoazIgKyBkMiksIChrNiArIGQ2KSk7Ci0gICAgICAgIGggKz0gTVVMNjQoKGszICsgZDMpLCAoazcgKyBkNykpOwotICAgICAgICAKLSAgICAgICAgZCArPSA4OwotICAgICAgICBrICs9IDg7Ci0gICAgfSB3aGlsZSAoLS1jKTsKLSAgKigoVUlOVDY0ICopaHApID0gaDsKLX0KLQotI2VsaWYgKFVNQUNfT1VUUFVUX0xFTiA9PSA4KQotCi1zdGF0aWMgdm9pZCBuaF9hdXgodm9pZCAqa3AsIHZvaWQgKmRwLCB2b2lkICpocCwgVUlOVDMyIGRsZW4pCi0vKiBTYW1lIGFzIHByZXZpb3VzIG5oX2F1eCwgYnV0IHR3byBzdHJlYW1zIGFyZSBoYW5kbGVkIGluIG9uZSBwYXNzLAotICogcmVhZGluZyBhbmQgd3JpdGluZyAxNiBieXRlcyBvZiBoYXNoLXN0YXRlIHBlciBjYWxsLgotICovCi17Ci0gIFVJTlQ2NCBoMSxoMjsKLSAgVVdPUkQgYyA9IGRsZW4gLyAzMjsKLSAgVUlOVDMyICprID0gKFVJTlQzMiAqKWtwOwotICBVSU5UMzIgKmQgPSAoVUlOVDMyICopZHA7Ci0gIFVJTlQzMiBkMCxkMSxkMixkMyxkNCxkNSxkNixkNzsKLSAgVUlOVDMyIGswLGsxLGsyLGszLGs0LGs1LGs2LGs3LAotICAgICAgICBrOCxrOSxrMTAsazExOwotCi0gIGgxID0gKigoVUlOVDY0ICopaHApOwotICBoMiA9ICooKFVJTlQ2NCAqKWhwICsgMSk7Ci0gIGswID0gKihrKzApOyBrMSA9ICooaysxKTsgazIgPSAqKGsrMik7IGszID0gKihrKzMpOwotICBkbyB7Ci0gICAgZDAgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCswKTsgZDEgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCsxKTsKLSAgICBkMiA9IExPQURfVUlOVDMyX0xJVFRMRShkKzIpOyBkMyA9IExPQURfVUlOVDMyX0xJVFRMRShkKzMpOwotICAgIGQ0ID0gTE9BRF9VSU5UMzJfTElUVExFKGQrNCk7IGQ1ID0gTE9BRF9VSU5UMzJfTElUVExFKGQrNSk7Ci0gICAgZDYgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs2KTsgZDcgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs3KTsKLSAgICBrNCA9ICooays0KTsgazUgPSAqKGsrNSk7IGs2ID0gKihrKzYpOyBrNyA9ICooays3KTsKLSAgICBrOCA9ICooays4KTsgazkgPSAqKGsrOSk7IGsxMCA9ICooaysxMCk7IGsxMSA9ICooaysxMSk7Ci0KLSAgICBoMSArPSBNVUw2NCgoazAgKyBkMCksIChrNCArIGQ0KSk7Ci0gICAgaDIgKz0gTVVMNjQoKGs0ICsgZDApLCAoazggKyBkNCkpOwotCi0gICAgaDEgKz0gTVVMNjQoKGsxICsgZDEpLCAoazUgKyBkNSkpOwotICAgIGgyICs9IE1VTDY0KChrNSArIGQxKSwgKGs5ICsgZDUpKTsKLQotICAgIGgxICs9IE1VTDY0KChrMiArIGQyKSwgKGs2ICsgZDYpKTsKLSAgICBoMiArPSBNVUw2NCgoazYgKyBkMiksIChrMTAgKyBkNikpOwotCi0gICAgaDEgKz0gTVVMNjQoKGszICsgZDMpLCAoazcgKyBkNykpOwotICAgIGgyICs9IE1VTDY0KChrNyArIGQzKSwgKGsxMSArIGQ3KSk7Ci0KLSAgICBrMCA9IGs4OyBrMSA9IGs5OyBrMiA9IGsxMDsgazMgPSBrMTE7Ci0KLSAgICBkICs9IDg7Ci0gICAgayArPSA4OwotICB9IHdoaWxlICgtLWMpOwotICAoKFVJTlQ2NCAqKWhwKVswXSA9IGgxOwotICAoKFVJTlQ2NCAqKWhwKVsxXSA9IGgyOwotfQotCi0jZWxpZiAoVU1BQ19PVVRQVVRfTEVOID09IDEyKQotCi1zdGF0aWMgdm9pZCBuaF9hdXgodm9pZCAqa3AsIHZvaWQgKmRwLCB2b2lkICpocCwgVUlOVDMyIGRsZW4pCi0vKiBTYW1lIGFzIHByZXZpb3VzIG5oX2F1eCwgYnV0IHR3byBzdHJlYW1zIGFyZSBoYW5kbGVkIGluIG9uZSBwYXNzLAotICogcmVhZGluZyBhbmQgd3JpdGluZyAyNCBieXRlcyBvZiBoYXNoLXN0YXRlIHBlciBjYWxsLgotKi8KLXsKLSAgICBVSU5UNjQgaDEsaDIsaDM7Ci0gICAgVVdPUkQgYyA9IGRsZW4gLyAzMjsKLSAgICBVSU5UMzIgKmsgPSAoVUlOVDMyICopa3A7Ci0gICAgVUlOVDMyICpkID0gKFVJTlQzMiAqKWRwOwotICAgIFVJTlQzMiBkMCxkMSxkMixkMyxkNCxkNSxkNixkNzsKLSAgICBVSU5UMzIgazAsazEsazIsazMsazQsazUsazYsazcsCi0gICAgICAgIGs4LGs5LGsxMCxrMTEsazEyLGsxMyxrMTQsazE1OwotICAgIAotICAgIGgxID0gKigoVUlOVDY0ICopaHApOwotICAgIGgyID0gKigoVUlOVDY0ICopaHAgKyAxKTsKLSAgICBoMyA9ICooKFVJTlQ2NCAqKWhwICsgMik7Ci0gICAgazAgPSAqKGsrMCk7IGsxID0gKihrKzEpOyBrMiA9ICooaysyKTsgazMgPSAqKGsrMyk7Ci0gICAgazQgPSAqKGsrNCk7IGs1ID0gKihrKzUpOyBrNiA9ICooays2KTsgazcgPSAqKGsrNyk7Ci0gICAgZG8gewotICAgICAgICBkMCA9IExPQURfVUlOVDMyX0xJVFRMRShkKzApOyBkMSA9IExPQURfVUlOVDMyX0xJVFRMRShkKzEpOwotICAgICAgICBkMiA9IExPQURfVUlOVDMyX0xJVFRMRShkKzIpOyBkMyA9IExPQURfVUlOVDMyX0xJVFRMRShkKzMpOwotICAgICAgICBkNCA9IExPQURfVUlOVDMyX0xJVFRMRShkKzQpOyBkNSA9IExPQURfVUlOVDMyX0xJVFRMRShkKzUpOwotICAgICAgICBkNiA9IExPQURfVUlOVDMyX0xJVFRMRShkKzYpOyBkNyA9IExPQURfVUlOVDMyX0xJVFRMRShkKzcpOwotICAgICAgICBrOCA9ICooays4KTsgazkgPSAqKGsrOSk7IGsxMCA9ICooaysxMCk7IGsxMSA9ICooaysxMSk7Ci0gICAgICAgIGsxMiA9ICooaysxMik7IGsxMyA9ICooaysxMyk7IGsxNCA9ICooaysxNCk7IGsxNSA9ICooaysxNSk7Ci0gICAgICAgIAotICAgICAgICBoMSArPSBNVUw2NCgoazAgKyBkMCksIChrNCArIGQ0KSk7Ci0gICAgICAgIGgyICs9IE1VTDY0KChrNCArIGQwKSwgKGs4ICsgZDQpKTsKLSAgICAgICAgaDMgKz0gTVVMNjQoKGs4ICsgZDApLCAoazEyICsgZDQpKTsKLSAgICAgICAgCi0gICAgICAgIGgxICs9IE1VTDY0KChrMSArIGQxKSwgKGs1ICsgZDUpKTsKLSAgICAgICAgaDIgKz0gTVVMNjQoKGs1ICsgZDEpLCAoazkgKyBkNSkpOwotICAgICAgICBoMyArPSBNVUw2NCgoazkgKyBkMSksIChrMTMgKyBkNSkpOwotICAgICAgICAKLSAgICAgICAgaDEgKz0gTVVMNjQoKGsyICsgZDIpLCAoazYgKyBkNikpOwotICAgICAgICBoMiArPSBNVUw2NCgoazYgKyBkMiksIChrMTAgKyBkNikpOwotICAgICAgICBoMyArPSBNVUw2NCgoazEwICsgZDIpLCAoazE0ICsgZDYpKTsKLSAgICAgICAgCi0gICAgICAgIGgxICs9IE1VTDY0KChrMyArIGQzKSwgKGs3ICsgZDcpKTsKLSAgICAgICAgaDIgKz0gTVVMNjQoKGs3ICsgZDMpLCAoazExICsgZDcpKTsKLSAgICAgICAgaDMgKz0gTVVMNjQoKGsxMSArIGQzKSwgKGsxNSArIGQ3KSk7Ci0gICAgICAgIAotICAgICAgICBrMCA9IGs4OyBrMSA9IGs5OyBrMiA9IGsxMDsgazMgPSBrMTE7Ci0gICAgICAgIGs0ID0gazEyOyBrNSA9IGsxMzsgazYgPSBrMTQ7IGs3ID0gazE1OwotICAgICAgICAKLSAgICAgICAgZCArPSA4OwotICAgICAgICBrICs9IDg7Ci0gICAgfSB3aGlsZSAoLS1jKTsKLSAgICAoKFVJTlQ2NCAqKWhwKVswXSA9IGgxOwotICAgICgoVUlOVDY0ICopaHApWzFdID0gaDI7Ci0gICAgKChVSU5UNjQgKilocClbMl0gPSBoMzsKLX0KLQotI2VsaWYgKFVNQUNfT1VUUFVUX0xFTiA9PSAxNikKLQotc3RhdGljIHZvaWQgbmhfYXV4KHZvaWQgKmtwLCB2b2lkICpkcCwgdm9pZCAqaHAsIFVJTlQzMiBkbGVuKQotLyogU2FtZSBhcyBwcmV2aW91cyBuaF9hdXgsIGJ1dCB0d28gc3RyZWFtcyBhcmUgaGFuZGxlZCBpbiBvbmUgcGFzcywKLSAqIHJlYWRpbmcgYW5kIHdyaXRpbmcgMjQgYnl0ZXMgb2YgaGFzaC1zdGF0ZSBwZXIgY2FsbC4KLSovCi17Ci0gICAgVUlOVDY0IGgxLGgyLGgzLGg0OwotICAgIFVXT1JEIGMgPSBkbGVuIC8gMzI7Ci0gICAgVUlOVDMyICprID0gKFVJTlQzMiAqKWtwOwotICAgIFVJTlQzMiAqZCA9IChVSU5UMzIgKilkcDsKLSAgICBVSU5UMzIgZDAsZDEsZDIsZDMsZDQsZDUsZDYsZDc7Ci0gICAgVUlOVDMyIGswLGsxLGsyLGszLGs0LGs1LGs2LGs3LAotICAgICAgICBrOCxrOSxrMTAsazExLGsxMixrMTMsazE0LGsxNSwKLSAgICAgICAgazE2LGsxNyxrMTgsazE5OwotICAgIAotICAgIGgxID0gKigoVUlOVDY0ICopaHApOwotICAgIGgyID0gKigoVUlOVDY0ICopaHAgKyAxKTsKLSAgICBoMyA9ICooKFVJTlQ2NCAqKWhwICsgMik7Ci0gICAgaDQgPSAqKChVSU5UNjQgKilocCArIDMpOwotICAgIGswID0gKihrKzApOyBrMSA9ICooaysxKTsgazIgPSAqKGsrMik7IGszID0gKihrKzMpOwotICAgIGs0ID0gKihrKzQpOyBrNSA9ICooays1KTsgazYgPSAqKGsrNik7IGs3ID0gKihrKzcpOwotICAgIGRvIHsKLSAgICAgICAgZDAgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCswKTsgZDEgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCsxKTsKLSAgICAgICAgZDIgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCsyKTsgZDMgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCszKTsKLSAgICAgICAgZDQgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs0KTsgZDUgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs1KTsKLSAgICAgICAgZDYgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs2KTsgZDcgPSBMT0FEX1VJTlQzMl9MSVRUTEUoZCs3KTsKLSAgICAgICAgazggPSAqKGsrOCk7IGs5ID0gKihrKzkpOyBrMTAgPSAqKGsrMTApOyBrMTEgPSAqKGsrMTEpOwotICAgICAgICBrMTIgPSAqKGsrMTIpOyBrMTMgPSAqKGsrMTMpOyBrMTQgPSAqKGsrMTQpOyBrMTUgPSAqKGsrMTUpOwotICAgICAgICBrMTYgPSAqKGsrMTYpOyBrMTcgPSAqKGsrMTcpOyBrMTggPSAqKGsrMTgpOyBrMTkgPSAqKGsrMTkpOwotICAgICAgICAKLSAgICAgICAgaDEgKz0gTVVMNjQoKGswICsgZDApLCAoazQgKyBkNCkpOwotICAgICAgICBoMiArPSBNVUw2NCgoazQgKyBkMCksIChrOCArIGQ0KSk7Ci0gICAgICAgIGgzICs9IE1VTDY0KChrOCArIGQwKSwgKGsxMiArIGQ0KSk7Ci0gICAgICAgIGg0ICs9IE1VTDY0KChrMTIgKyBkMCksIChrMTYgKyBkNCkpOwotICAgICAgICAKLSAgICAgICAgaDEgKz0gTVVMNjQoKGsxICsgZDEpLCAoazUgKyBkNSkpOwotICAgICAgICBoMiArPSBNVUw2NCgoazUgKyBkMSksIChrOSArIGQ1KSk7Ci0gICAgICAgIGgzICs9IE1VTDY0KChrOSArIGQxKSwgKGsxMyArIGQ1KSk7Ci0gICAgICAgIGg0ICs9IE1VTDY0KChrMTMgKyBkMSksIChrMTcgKyBkNSkpOwotICAgICAgICAKLSAgICAgICAgaDEgKz0gTVVMNjQoKGsyICsgZDIpLCAoazYgKyBkNikpOwotICAgICAgICBoMiArPSBNVUw2NCgoazYgKyBkMiksIChrMTAgKyBkNikpOwotICAgICAgICBoMyArPSBNVUw2NCgoazEwICsgZDIpLCAoazE0ICsgZDYpKTsKLSAgICAgICAgaDQgKz0gTVVMNjQoKGsxNCArIGQyKSwgKGsxOCArIGQ2KSk7Ci0gICAgICAgIAotICAgICAgICBoMSArPSBNVUw2NCgoazMgKyBkMyksIChrNyArIGQ3KSk7Ci0gICAgICAgIGgyICs9IE1VTDY0KChrNyArIGQzKSwgKGsxMSArIGQ3KSk7Ci0gICAgICAgIGgzICs9IE1VTDY0KChrMTEgKyBkMyksIChrMTUgKyBkNykpOwotICAgICAgICBoNCArPSBNVUw2NCgoazE1ICsgZDMpLCAoazE5ICsgZDcpKTsKLSAgICAgICAgCi0gICAgICAgIGswID0gazg7IGsxID0gazk7IGsyID0gazEwOyBrMyA9IGsxMTsKLSAgICAgICAgazQgPSBrMTI7IGs1ID0gazEzOyBrNiA9IGsxNDsgazcgPSBrMTU7Ci0gICAgICAgIGs4ID0gazE2OyBrOSA9IGsxNzsgazEwID0gazE4OyBrMTEgPSBrMTk7Ci0gICAgICAgIAotICAgICAgICBkICs9IDg7Ci0gICAgICAgIGsgKz0gODsKLSAgICB9IHdoaWxlICgtLWMpOwotICAgICgoVUlOVDY0ICopaHApWzBdID0gaDE7Ci0gICAgKChVSU5UNjQgKilocClbMV0gPSBoMjsKLSAgICAoKFVJTlQ2NCAqKWhwKVsyXSA9IGgzOwotICAgICgoVUlOVDY0ICopaHApWzNdID0gaDQ7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNlbmRpZiAgLyogVU1BQ19PVVRQVVRfTEVOR1RIICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBuaF90cmFuc2Zvcm0obmhfY3R4ICpoYywgVUlOVDggKmJ1ZiwgVUlOVDMyIG5ieXRlcykKLS8qIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGZvciB0aGUgcHJpbWl0aXZlIE5IIGhhc2ggZnVuY3Rpb25zLiBJdCB0YWtlcwotICogYXMgYXJndW1lbnQgImhjIiB0aGUgY3VycmVudCBoYXNoIGNvbnRleHQgYW5kIGEgYnVmZmVyIHdoaWNoIG11c3QgYmUgYQotICogbXVsdGlwbGUgb2YgTDFfUEFEX0JPVU5EQVJZLiBUaGUga2V5IHBhc3NlZCB0byBuaF9hdXggaXMgb2Zmc2V0Ci0gKiBhcHByb3ByaWF0ZWx5IGFjY29yZGluZyB0byBob3cgbXVjaCBtZXNzYWdlIGhhcyBiZWVuIGhhc2hlZCBhbHJlYWR5LgotICovCi17Ci0gICAgVUlOVDggKmtleTsKLSAgCi0gICAga2V5ID0gaGMtPm5oX2tleSArIGhjLT5ieXRlc19oYXNoZWQ7Ci0gICAgbmhfYXV4KGtleSwgYnVmLCBoYy0+c3RhdGUsIG5ieXRlcyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIChfX0xJVFRMRV9FTkRJQU5fXykKLXN0YXRpYyB2b2lkIGVuZGlhbl9jb252ZXJ0KHZvaWQgKmJ1ZiwgVVdPUkQgYnB3LCBVSU5UMzIgbnVtX2J5dGVzKQotLyogV2UgZW5kaWFuIGNvbnZlcnQgdGhlIGtleXMgb24gbGl0dGxlLWVuZGlhbiBjb21wdXRlcnMgdG8gICAgICAgICAgICAgICAqLwotLyogY29tcGVuc2F0ZSBmb3IgdGhlIGxhY2sgb2YgYmlnLWVuZGlhbiBtZW1vcnkgcmVhZHMgZHVyaW5nIGhhc2hpbmcuICAgICAqLwotewotICAgIFVXT1JEIGl0ZXJzID0gbnVtX2J5dGVzIC8gYnB3OwotICAgIGlmIChicHcgPT0gNCkgewotICAgICAgICBVSU5UMzIgKnAgPSAoVUlOVDMyICopYnVmOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICAqcCA9IExPQURfVUlOVDMyX1JFVkVSU0VEKHApOwotICAgICAgICAgICAgcCsrOwotICAgICAgICB9IHdoaWxlICgtLWl0ZXJzKTsKLSAgICB9IGVsc2UgaWYgKGJwdyA9PSA4KSB7Ci0gICAgICAgIFVJTlQzMiAqcCA9IChVSU5UMzIgKilidWY7Ci0gICAgICAgIFVJTlQzMiB0OwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB0ID0gTE9BRF9VSU5UMzJfUkVWRVJTRUQocCsxKTsKLSAgICAgICAgICAgIHBbMV0gPSBMT0FEX1VJTlQzMl9SRVZFUlNFRChwKTsKLSAgICAgICAgICAgIHBbMF0gPSB0OwotICAgICAgICAgICAgcCArPSAyOwotICAgICAgICB9IHdoaWxlICgtLWl0ZXJzKTsKLSAgICB9Ci19Ci0jZGVmaW5lIGVuZGlhbl9jb252ZXJ0X2lmX2xlKHgseSx6KSBlbmRpYW5fY29udmVydCgoeCksKHkpLCh6KSkKLSNlbHNlCi0jZGVmaW5lIGVuZGlhbl9jb252ZXJ0X2lmX2xlKHgseSx6KSBkb3t9d2hpbGUoMCkgIC8qIERvIG5vdGhpbmcgKi8KLSNlbmRpZgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB2b2lkIG5oX3Jlc2V0KG5oX2N0eCAqaGMpCi0vKiBSZXNldCBuaF9jdHggdG8gcmVhZHkgZm9yIGhhc2hpbmcgb2YgbmV3IGRhdGEgKi8KLXsKLSAgICBoYy0+Ynl0ZXNfaGFzaGVkID0gMDsKLSAgICBoYy0+bmV4dF9kYXRhX2VtcHR5ID0gMDsKLSAgICBoYy0+c3RhdGVbMF0gPSAwOwotI2lmIChVTUFDX09VVFBVVF9MRU4gPj0gOCkKLSAgICBoYy0+c3RhdGVbMV0gPSAwOwotI2VuZGlmCi0jaWYgKFVNQUNfT1VUUFVUX0xFTiA+PSAxMikKLSAgICBoYy0+c3RhdGVbMl0gPSAwOwotI2VuZGlmCi0jaWYgKFVNQUNfT1VUUFVUX0xFTiA9PSAxNikKLSAgICBoYy0+c3RhdGVbM10gPSAwOwotI2VuZGlmCi0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBuaF9pbml0KG5oX2N0eCAqaGMsIGFlc19pbnRfa2V5IHByZl9rZXkpCi0vKiBHZW5lcmF0ZSBuaF9rZXksIGVuZGlhbiBjb252ZXJ0IGFuZCByZXNldCB0byBiZSByZWFkeSBmb3IgaGFzaGluZy4gICAqLwotewotICAgIGtkZihoYy0+bmhfa2V5LCBwcmZfa2V5LCAxLCBzaXplb2YoaGMtPm5oX2tleSkpOwotICAgIGVuZGlhbl9jb252ZXJ0X2lmX2xlKGhjLT5uaF9rZXksIDQsIHNpemVvZihoYy0+bmhfa2V5KSk7Ci0gICAgbmhfcmVzZXQoaGMpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB2b2lkIG5oX3VwZGF0ZShuaF9jdHggKmhjLCBVSU5UOCAqYnVmLCBVSU5UMzIgbmJ5dGVzKQotLyogSW5jb3Jwb3JhdGUgbmJ5dGVzIG9mIGRhdGEgaW50byBhIG5oX2N0eCwgYnVmZmVyIHdoYXRldmVyIGlzIG5vdCBhbiAgICAqLwotLyogZXZlbiBtdWx0aXBsZSBvZiBIQVNIX0JVRl9CWVRFUy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotewotICAgIFVJTlQzMiBpLGo7Ci0gICAgCi0gICAgaiA9IGhjLT5uZXh0X2RhdGFfZW1wdHk7Ci0gICAgaWYgKChqICsgbmJ5dGVzKSA+PSBIQVNIX0JVRl9CWVRFUykgewotICAgICAgICBpZiAoaikgewotICAgICAgICAgICAgaSA9IEhBU0hfQlVGX0JZVEVTIC0gajsKLSAgICAgICAgICAgIG1lbWNweShoYy0+ZGF0YStqLCBidWYsIGkpOwotICAgICAgICAgICAgbmhfdHJhbnNmb3JtKGhjLGhjLT5kYXRhLEhBU0hfQlVGX0JZVEVTKTsKLSAgICAgICAgICAgIG5ieXRlcyAtPSBpOwotICAgICAgICAgICAgYnVmICs9IGk7Ci0gICAgICAgICAgICBoYy0+Ynl0ZXNfaGFzaGVkICs9IEhBU0hfQlVGX0JZVEVTOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYnl0ZXMgPj0gSEFTSF9CVUZfQllURVMpIHsKLSAgICAgICAgICAgIGkgPSBuYnl0ZXMgJiB+KEhBU0hfQlVGX0JZVEVTIC0gMSk7Ci0gICAgICAgICAgICBuaF90cmFuc2Zvcm0oaGMsIGJ1ZiwgaSk7Ci0gICAgICAgICAgICBuYnl0ZXMgLT0gaTsKLSAgICAgICAgICAgIGJ1ZiArPSBpOwotICAgICAgICAgICAgaGMtPmJ5dGVzX2hhc2hlZCArPSBpOwotICAgICAgICB9Ci0gICAgICAgIGogPSAwOwotICAgIH0KLSAgICBtZW1jcHkoaGMtPmRhdGEgKyBqLCBidWYsIG5ieXRlcyk7Ci0gICAgaGMtPm5leHRfZGF0YV9lbXB0eSA9IGogKyBuYnl0ZXM7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgemVyb19wYWQoVUlOVDggKnAsIGludCBuYnl0ZXMpCi17Ci0vKiBXcml0ZSAibmJ5dGVzIiBvZiB6ZXJvZXMsIGJlZ2lubmluZyBhdCAicCIgKi8KLSAgICBpZiAobmJ5dGVzID49IChpbnQpc2l6ZW9mKFVXT1JEKSkgewotICAgICAgICB3aGlsZSAoKHB0cmRpZmZfdClwICUgc2l6ZW9mKFVXT1JEKSkgewotICAgICAgICAgICAgKnAgPSAwOwotICAgICAgICAgICAgbmJ5dGVzLS07Ci0gICAgICAgICAgICBwKys7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKG5ieXRlcyA+PSAoaW50KXNpemVvZihVV09SRCkpIHsKLSAgICAgICAgICAgICooVVdPUkQgKilwID0gMDsKLSAgICAgICAgICAgIG5ieXRlcyAtPSBzaXplb2YoVVdPUkQpOwotICAgICAgICAgICAgcCArPSBzaXplb2YoVVdPUkQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHdoaWxlIChuYnl0ZXMpIHsKLSAgICAgICAgKnAgPSAwOwotICAgICAgICBuYnl0ZXMtLTsKLSAgICAgICAgcCsrOwotICAgIH0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBuaF9maW5hbChuaF9jdHggKmhjLCBVSU5UOCAqcmVzdWx0KQotLyogQWZ0ZXIgcGFzc2luZyBzb21lIG51bWJlciBvZiBkYXRhIGJ1ZmZlcnMgdG8gbmhfdXBkYXRlKCkgZm9yIGludGVncmF0aW9uCi0gKiBpbnRvIGFuIE5IIGNvbnRleHQsIG5oX2ZpbmFsIGlzIGNhbGxlZCB0byBwcm9kdWNlIGEgaGFzaCByZXN1bHQuIElmIGFueQotICogYnl0ZXMgYXJlIGluIHRoZSBidWZmZXIgaGMtPmRhdGEsIGluY29ycG9yYXRlIHRoZW0gaW50byB0aGUKLSAqIE5IIGNvbnRleHQuIEZpbmFsbHksIGFkZCBpbnRvIHRoZSBOSCBhY2N1bXVsYXRpb24gInN0YXRlIiB0aGUgdG90YWwgbnVtYmVyCi0gKiBvZiBiaXRzIGhhc2hlZC4gVGhlIHJlc3VsdGluZyBudW1iZXJzIGFyZSB3cml0dGVuIHRvIHRoZSBidWZmZXIgInJlc3VsdCIuCi0gKiBJZiBuaF91cGRhdGUgd2FzIG5ldmVyIGNhbGxlZCwgTDFfUEFEX0JPVU5EQVJZIHplcm9lcyBhcmUgaW5jb3Jwb3JhdGVkLgotICovCi17Ci0gICAgaW50IG5oX2xlbiwgbmJpdHM7Ci0KLSAgICBpZiAoaGMtPm5leHRfZGF0YV9lbXB0eSAhPSAwKSB7Ci0gICAgICAgIG5oX2xlbiA9ICgoaGMtPm5leHRfZGF0YV9lbXB0eSArIChMMV9QQURfQk9VTkRBUlkgLSAxKSkgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfihMMV9QQURfQk9VTkRBUlkgLSAxKSk7Ci0gICAgICAgIHplcm9fcGFkKGhjLT5kYXRhICsgaGMtPm5leHRfZGF0YV9lbXB0eSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaF9sZW4gLSBoYy0+bmV4dF9kYXRhX2VtcHR5KTsKLSAgICAgICAgbmhfdHJhbnNmb3JtKGhjLCBoYy0+ZGF0YSwgbmhfbGVuKTsKLSAgICAgICAgaGMtPmJ5dGVzX2hhc2hlZCArPSBoYy0+bmV4dF9kYXRhX2VtcHR5OwotICAgIH0gZWxzZSBpZiAoaGMtPmJ5dGVzX2hhc2hlZCA9PSAwKSB7Ci0gICAgCW5oX2xlbiA9IEwxX1BBRF9CT1VOREFSWTsKLSAgICAgICAgemVyb19wYWQoaGMtPmRhdGEsIEwxX1BBRF9CT1VOREFSWSk7Ci0gICAgICAgIG5oX3RyYW5zZm9ybShoYywgaGMtPmRhdGEsIG5oX2xlbik7Ci0gICAgfQotCi0gICAgbmJpdHMgPSAoaGMtPmJ5dGVzX2hhc2hlZCA8PCAzKTsKLSAgICAoKFVJTlQ2NCAqKXJlc3VsdClbMF0gPSAoKFVJTlQ2NCAqKWhjLT5zdGF0ZSlbMF0gKyBuYml0czsKLSNpZiAoVU1BQ19PVVRQVVRfTEVOID49IDgpCi0gICAgKChVSU5UNjQgKilyZXN1bHQpWzFdID0gKChVSU5UNjQgKiloYy0+c3RhdGUpWzFdICsgbmJpdHM7Ci0jZW5kaWYKLSNpZiAoVU1BQ19PVVRQVVRfTEVOID49IDEyKQotICAgICgoVUlOVDY0ICopcmVzdWx0KVsyXSA9ICgoVUlOVDY0ICopaGMtPnN0YXRlKVsyXSArIG5iaXRzOwotI2VuZGlmCi0jaWYgKFVNQUNfT1VUUFVUX0xFTiA9PSAxNikKLSAgICAoKFVJTlQ2NCAqKXJlc3VsdClbM10gPSAoKFVJTlQ2NCAqKWhjLT5zdGF0ZSlbM10gKyBuYml0czsKLSNlbmRpZgotICAgIG5oX3Jlc2V0KGhjKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBuaChuaF9jdHggKmhjLCBVSU5UOCAqYnVmLCBVSU5UMzIgcGFkZGVkX2xlbiwKLSAgICAgICAgICAgICAgIFVJTlQzMiB1bnBhZGRlZF9sZW4sIFVJTlQ4ICpyZXN1bHQpCi0vKiBBbGwtaW4tb25lIG5oX3VwZGF0ZSgpIGFuZCBuaF9maW5hbCgpIGVxdWl2YWxlbnQuCi0gKiBBc3N1bWVzIHRoYXQgcGFkZGVkX2xlbiBpcyBkaXZpc2libGUgYnkgTDFfUEFEX0JPVU5EQVJZIGFuZCByZXN1bHQgaXMKLSAqIHdlbGwgYWxpZ25lZAotICovCi17Ci0gICAgVUlOVDMyIG5iaXRzOwotICAgIAotICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggc3RhdGUgKi8KLSAgICBuYml0cyA9ICh1bnBhZGRlZF9sZW4gPDwgMyk7Ci0gICAgCi0gICAgKChVSU5UNjQgKilyZXN1bHQpWzBdID0gbmJpdHM7Ci0jaWYgKFVNQUNfT1VUUFVUX0xFTiA+PSA4KQotICAgICgoVUlOVDY0ICopcmVzdWx0KVsxXSA9IG5iaXRzOwotI2VuZGlmCi0jaWYgKFVNQUNfT1VUUFVUX0xFTiA+PSAxMikKLSAgICAoKFVJTlQ2NCAqKXJlc3VsdClbMl0gPSBuYml0czsKLSNlbmRpZgotI2lmIChVTUFDX09VVFBVVF9MRU4gPT0gMTYpCi0gICAgKChVSU5UNjQgKilyZXN1bHQpWzNdID0gbmJpdHM7Ci0jZW5kaWYKLSAgICAKLSAgICBuaF9hdXgoaGMtPm5oX2tleSwgYnVmLCByZXN1bHQsIHBhZGRlZF9sZW4pOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLSBCZWdpbiBVSEFTSCBTZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIFVIQVNIIGlzIGEgbXVsdGktbGF5ZXJlZCBhbGdvcml0aG0uIERhdGEgcHJlc2VudGVkIHRvIFVIQVNIIGlzIGZpcnN0Ci0gKiBoYXNoZWQgYnkgTkguIFRoZSBOSCBvdXRwdXQgaXMgdGhlbiBoYXNoZWQgYnkgYSBwb2x5bm9taWFsLWhhc2ggbGF5ZXIKLSAqIHVubGVzcyB0aGUgaW5pdGlhbCBkYXRhIHRvIGJlIGhhc2hlZCBpcyBzaG9ydC4gQWZ0ZXIgdGhlIHBvbHlub21pYWwtCi0gKiBsYXllciwgYW4gaW5uZXItcHJvZHVjdCBoYXNoIGlzIHVzZWQgdG8gcHJvZHVjZSB0aGUgZmluYWwgVUhBU0ggb3V0cHV0LgotICoKLSAqIFVIQVNIIHByb3ZpZGVzIHR3byBpbnRlcmZhY2VzLCBvbmUgYWxsLWF0LW9uY2UgYW5kIGFub3RoZXIgd2hlcmUgZGF0YQotICogYnVmZmVycyBhcmUgcHJlc2VudGVkIHNlcXVlbnRpYWxseS4gSW4gdGhlIHNlcXVlbnRpYWwgaW50ZXJmYWNlLCB0aGUKLSAqIFVIQVNIIGNsaWVudCBjYWxscyB0aGUgcm91dGluZSB1aGFzaF91cGRhdGUoKSBhcyBtYW55IHRpbWVzIGFzIG5lY2Vzc2FyeS4KLSAqIFdoZW4gdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHRvIGJlIGZlZCB0byBVSEFTSCwgdGhlIGNsaWVudCBjYWxscwotICogdWhhc2hfZmluYWwoKSB3aGljaCAgICAgICAgICAKLSAqIGNhbGN1bGF0ZXMgdGhlIFVIQVNIIG91dHB1dC4gQmVmb3JlIGJlZ2lubmluZyBhbm90aGVyIFVIQVNIIGNhbGN1bGF0aW9uICAgIAotICogdGhlIHVoYXNoX3Jlc2V0KCkgcm91dGluZSBtdXN0IGJlIGNhbGxlZC4gVGhlIGFsbC1hdC1vbmNlIFVIQVNIIHJvdXRpbmUsICAgCi0gKiB1aGFzaCgpLCBpcyBlcXVpdmFsZW50IHRvIHRoZSBzZXF1ZW5jZSBvZiBjYWxscyB1aGFzaF91cGRhdGUoKSBhbmQgICAgICAgICAKLSAqIHVoYXNoX2ZpbmFsKCk7IGhvd2V2ZXIgaXQgaXMgb3B0aW1pemVkIGFuZCBzaG91bGQgYmUgICAgICAgICAgICAgICAgICAgICAKLSAqIHVzZWQgd2hlbmV2ZXIgdGhlIHNlcXVlbnRpYWwgaW50ZXJmYWNlIGlzIG5vdCBuZWNlc3NhcnkuICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBUaGUgcm91dGluZSB1aGFzaF9pbml0KCkgaW5pdGlhbGl6ZXMgdGhlIHVoYXNoX2N0eCBkYXRhIHN0cnVjdHVyZSBhbmQgICAgCi0gKiBtdXN0IGJlIGNhbGxlZCBvbmNlLCBiZWZvcmUgYW55IG90aGVyIFVIQVNIIHJvdXRpbmUuCi0gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLSBDb25zdGFudHMgYW5kIHVoYXNoX2N0eCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLS0tIFBvbHkgaGFzaCBhbmQgSW5uZXItUHJvZHVjdCBoYXNoIENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogUHJpbWVzIGFuZCBtYXNrcyAqLwotI2RlZmluZSBwMzYgICAgKChVSU5UNjQpMHgwMDAwMDAwRkZGRkZGRkZCdWxsKSAgICAgICAgICAgICAgLyogMl4zNiAtICA1ICovCi0jZGVmaW5lIHA2NCAgICAoKFVJTlQ2NCkweEZGRkZGRkZGRkZGRkZGQzV1bGwpICAgICAgICAgICAgICAvKiAyXjY0IC0gNTkgKi8KLSNkZWZpbmUgbTM2ICAgICgoVUlOVDY0KTB4MDAwMDAwMEZGRkZGRkZGRnVsbCkgIC8qIFRoZSBsb3cgMzYgb2YgNjQgYml0cyAqLwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdWhhc2hfY3R4IHsKLSAgICBuaF9jdHggaGFzaDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhc2ggY29udGV4dCBmb3IgTDEgTkggaGFzaCAgKi8KLSAgICBVSU5UNjQgcG9seV9rZXlfOFtTVFJFQU1TXTsgICAgICAgICAgIC8qIHA2NCBwb2x5IGtleXMgICAgICAgICAgICAgICAgKi8KLSAgICBVSU5UNjQgcG9seV9hY2N1bVtTVFJFQU1TXTsgICAgICAgICAgIC8qIHBvbHkgaGFzaCByZXN1bHQgICAgICAgICAgICAgKi8KLSAgICBVSU5UNjQgaXBfa2V5c1tTVFJFQU1TKjRdOyAgICAgICAgICAgIC8qIElubmVyLXByb2R1Y3Qga2V5cyAgICAgICAgICAgKi8KLSAgICBVSU5UMzIgaXBfdHJhbnNbU1RSRUFNU107ICAgICAgICAgICAgIC8qIElubmVyLXByb2R1Y3QgdHJhbnNsYXRpb24gICAgKi8KLSAgICBVSU5UMzIgbXNnX2xlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIFRvdGFsIGxlbmd0aCBvZiBkYXRhIHBhc3NlZCAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvIHVoYXNoICovCi19IHVoYXNoX2N0eDsKLXR5cGVkZWYgc3RydWN0IHVoYXNoX2N0eCAqdWhhc2hfY3R4X3Q7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCi0vKiBUaGUgcG9seW5vbWlhbCBoYXNoZXMgdXNlIEhvcm5lcidzIHJ1bGUgdG8gZXZhbHVhdGUgYSBwb2x5bm9taWFsIG9uZQotICogd29yZCBhdCBhIHRpbWUuIEFzIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiwgcG9seTMyIGFuZCBwb2x5NjQKLSAqIHJlcXVpcmUga2V5cyBmcm9tIHNwZWNpYWwgZG9tYWlucy4gVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbnMgZXhwbG9pdAotICogdGhlIHNwZWNpYWwgZG9tYWlucyB0byBhdm9pZCBvdmVyZmxvdy4gVGhlIHJlc3VsdHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvCi0gKiBiZSB3aXRoaW4gWl9wMzIgYW5kIFpfcDY0LCBidXQgdGhlIElubmVyLVByb2R1Y3QgaGFzaCBpbXBsZW1lbnRhdGlvbgotICogcGF0Y2hlcyBhbnkgZXJyYW50IHZhbHVlcy4KLSAqLwotCi1zdGF0aWMgVUlOVDY0IHBvbHk2NChVSU5UNjQgY3VyLCBVSU5UNjQga2V5LCBVSU5UNjQgZGF0YSkKLXsKLSAgICBVSU5UMzIga2V5X2hpID0gKFVJTlQzMikoa2V5ID4+IDMyKSwKLSAgICAgICAgICAga2V5X2xvID0gKFVJTlQzMilrZXksCi0gICAgICAgICAgIGN1cl9oaSA9IChVSU5UMzIpKGN1ciA+PiAzMiksCi0gICAgICAgICAgIGN1cl9sbyA9IChVSU5UMzIpY3VyLAotICAgICAgICAgICB4X2xvLAotICAgICAgICAgICB4X2hpOwotICAgIFVJTlQ2NCBYLFQscmVzOwotICAgIAotICAgIFggPSAgTVVMNjQoa2V5X2hpLCBjdXJfbG8pICsgTVVMNjQoY3VyX2hpLCBrZXlfbG8pOwotICAgIHhfbG8gPSAoVUlOVDMyKVg7Ci0gICAgeF9oaSA9IChVSU5UMzIpKFggPj4gMzIpOwotICAgIAotICAgIHJlcyA9IChNVUw2NChrZXlfaGksIGN1cl9oaSkgKyB4X2hpKSAqIDU5ICsgTVVMNjQoa2V5X2xvLCBjdXJfbG8pOwotICAgICAKLSAgICBUID0gKChVSU5UNjQpeF9sbyA8PCAzMik7Ci0gICAgcmVzICs9IFQ7Ci0gICAgaWYgKHJlcyA8IFQpCi0gICAgICAgIHJlcyArPSA1OTsKLQotICAgIHJlcyArPSBkYXRhOwotICAgIGlmIChyZXMgPCBkYXRhKQotICAgICAgICByZXMgKz0gNTk7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi0KLS8qIEFsdGhvdWdoIFVNQUMgaXMgc3BlY2lmaWVkIHRvIHVzZSBhIHJhbXBlZCBwb2x5bm9taWFsIGhhc2ggc2NoZW1lLCB0aGlzCi0gKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBoYW5kbGUgYWxsIHJhbXAgbGV2ZWxzLiBCZWNhdXNlIHdlIGRvbid0IGhhbmRsZQotICogdGhlIHJhbXAgdXAgdG8gcDEyOCBtb2R1bHVzIGluIHRoaXMgaW1wbGVtZW50YXRpb24sIHdlIGFyZSBsaW1pdGVkIHRvCi0gKiAyXjE0IHBvbHlfaGFzaCgpIGludm9jYXRpb25zIHBlciBzdHJlYW0gKGZvciBhIHRvdGFsIGNhcGFjaXR5IG9mIDJeMjQKLSAqIGJ5dGVzIGlucHV0IHRvIFVNQUMgcGVyIHRhZywgaWUuIDE2TUIpLgotICovCi1zdGF0aWMgdm9pZCBwb2x5X2hhc2godWhhc2hfY3R4X3QgaGMsIFVJTlQzMiBkYXRhX2luW10pCi17Ci0gICAgaW50IGk7Ci0gICAgVUlOVDY0ICpkYXRhPShVSU5UNjQqKWRhdGFfaW47Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IFNUUkVBTVM7IGkrKykgewotICAgICAgICBpZiAoKFVJTlQzMikoZGF0YVtpXSA+PiAzMikgPT0gMHhmZmZmZmZmZnVsKSB7Ci0gICAgICAgICAgICBoYy0+cG9seV9hY2N1bVtpXSA9IHBvbHk2NChoYy0+cG9seV9hY2N1bVtpXSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYy0+cG9seV9rZXlfOFtpXSwgcDY0IC0gMSk7Ci0gICAgICAgICAgICBoYy0+cG9seV9hY2N1bVtpXSA9IHBvbHk2NChoYy0+cG9seV9hY2N1bVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjLT5wb2x5X2tleV84W2ldLCAoZGF0YVtpXSAtIDU5KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYy0+cG9seV9hY2N1bVtpXSA9IHBvbHk2NChoYy0+cG9seV9hY2N1bVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjLT5wb2x5X2tleV84W2ldLCBkYXRhW2ldKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQotLyogVGhlIGZpbmFsIHN0ZXAgaW4gVUhBU0ggaXMgYW4gaW5uZXItcHJvZHVjdCBoYXNoLiBUaGUgcG9seSBoYXNoCi0gKiBwcm9kdWNlcyBhIHJlc3VsdCBub3QgbmVjY2VzYXJpbHkgV09SRF9MRU4gYnl0ZXMgbG9uZy4gVGhlIGlubmVyLQotICogcHJvZHVjdCBoYXNoIGJyZWFrcyB0aGUgcG9seWhhc2ggb3V0cHV0IGludG8gMTYtYml0IGNodW5rcyBhbmQKLSAqIG11bHRpcGxpZXMgZWFjaCB3aXRoIGEgMzYgYml0IGtleS4KLSAqLwotCi1zdGF0aWMgVUlOVDY0IGlwX2F1eChVSU5UNjQgdCwgVUlOVDY0ICppcGtwLCBVSU5UNjQgZGF0YSkKLXsKLSAgICB0ID0gdCArIGlwa3BbMF0gKiAoVUlOVDY0KShVSU5UMTYpKGRhdGEgPj4gNDgpOwotICAgIHQgPSB0ICsgaXBrcFsxXSAqIChVSU5UNjQpKFVJTlQxNikoZGF0YSA+PiAzMik7Ci0gICAgdCA9IHQgKyBpcGtwWzJdICogKFVJTlQ2NCkoVUlOVDE2KShkYXRhID4+IDE2KTsKLSAgICB0ID0gdCArIGlwa3BbM10gKiAoVUlOVDY0KShVSU5UMTYpKGRhdGEpOwotICAgIAotICAgIHJldHVybiB0OwotfQotCi1zdGF0aWMgVUlOVDMyIGlwX3JlZHVjZV9wMzYoVUlOVDY0IHQpCi17Ci0vKiBEaXZpc2lvbmxlc3MgbW9kdWxhciByZWR1Y3Rpb24gKi8KLSAgICBVSU5UNjQgcmV0OwotICAgIAotICAgIHJldCA9ICh0ICYgbTM2KSArIDUgKiAodCA+PiAzNik7Ci0gICAgaWYgKHJldCA+PSBwMzYpCi0gICAgICAgIHJldCAtPSBwMzY7Ci0KLSAgICAvKiByZXR1cm4gbGVhc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyAqLwotICAgIHJldHVybiAoVUlOVDMyKShyZXQpOwotfQotCi0KLS8qIElmIHRoZSBkYXRhIGJlaW5nIGhhc2hlZCBieSBVSEFTSCBpcyBubyBsb25nZXIgdGhhbiBMMV9LRVlfTEVOLCB0aGVuCi0gKiB0aGUgcG9seWhhc2ggc3RhZ2UgaXMgc2tpcHBlZCBhbmQgaXBfc2hvcnQgaXMgYXBwbGllZCBkaXJlY3RseSB0byB0aGUKLSAqIE5IIG91dHB1dC4KLSAqLwotc3RhdGljIHZvaWQgaXBfc2hvcnQodWhhc2hfY3R4X3QgYWhjLCBVSU5UOCAqbmhfcmVzLCB1X2NoYXIgKnJlcykKLXsKLSAgICBVSU5UNjQgdDsKLSAgICBVSU5UNjQgKm5ocCA9IChVSU5UNjQgKiluaF9yZXM7Ci0gICAgCi0gICAgdCAgPSBpcF9hdXgoMCxhaGMtPmlwX2tleXMsIG5ocFswXSk7Ci0gICAgU1RPUkVfVUlOVDMyX0JJRygoVUlOVDMyICopcmVzKzAsIGlwX3JlZHVjZV9wMzYodCkgXiBhaGMtPmlwX3RyYW5zWzBdKTsKLSNpZiAoVU1BQ19PVVRQVVRfTEVOID49IDgpCi0gICAgdCAgPSBpcF9hdXgoMCxhaGMtPmlwX2tleXMrNCwgbmhwWzFdKTsKLSAgICBTVE9SRV9VSU5UMzJfQklHKChVSU5UMzIgKilyZXMrMSwgaXBfcmVkdWNlX3AzNih0KSBeIGFoYy0+aXBfdHJhbnNbMV0pOwotI2VuZGlmCi0jaWYgKFVNQUNfT1VUUFVUX0xFTiA+PSAxMikKLSAgICB0ICA9IGlwX2F1eCgwLGFoYy0+aXBfa2V5cys4LCBuaHBbMl0pOwotICAgIFNUT1JFX1VJTlQzMl9CSUcoKFVJTlQzMiAqKXJlcysyLCBpcF9yZWR1Y2VfcDM2KHQpIF4gYWhjLT5pcF90cmFuc1syXSk7Ci0jZW5kaWYKLSNpZiAoVU1BQ19PVVRQVVRfTEVOID09IDE2KQotICAgIHQgID0gaXBfYXV4KDAsYWhjLT5pcF9rZXlzKzEyLCBuaHBbM10pOwotICAgIFNUT1JFX1VJTlQzMl9CSUcoKFVJTlQzMiAqKXJlcyszLCBpcF9yZWR1Y2VfcDM2KHQpIF4gYWhjLT5pcF90cmFuc1szXSk7Ci0jZW5kaWYKLX0KLQotLyogSWYgdGhlIGRhdGEgYmVpbmcgaGFzaGVkIGJ5IFVIQVNIIGlzIGxvbmdlciB0aGFuIEwxX0tFWV9MRU4sIHRoZW4KLSAqIHRoZSBwb2x5aGFzaCBzdGFnZSBpcyBub3Qgc2tpcHBlZCBhbmQgaXBfbG9uZyBpcyBhcHBsaWVkIHRvIHRoZQotICogcG9seWhhc2ggb3V0cHV0LgotICovCi1zdGF0aWMgdm9pZCBpcF9sb25nKHVoYXNoX2N0eF90IGFoYywgdV9jaGFyICpyZXMpCi17Ci0gICAgaW50IGk7Ci0gICAgVUlOVDY0IHQ7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgU1RSRUFNUzsgaSsrKSB7Ci0gICAgICAgIC8qIGZpeCBwb2x5aGFzaCBvdXRwdXQgbm90IGluIFpfcDY0ICovCi0gICAgICAgIGlmIChhaGMtPnBvbHlfYWNjdW1baV0gPj0gcDY0KQotICAgICAgICAgICAgYWhjLT5wb2x5X2FjY3VtW2ldIC09IHA2NDsKLSAgICAgICAgdCAgPSBpcF9hdXgoMCxhaGMtPmlwX2tleXMrKGkqNCksIGFoYy0+cG9seV9hY2N1bVtpXSk7Ci0gICAgICAgIFNUT1JFX1VJTlQzMl9CSUcoKFVJTlQzMiAqKXJlcytpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBpcF9yZWR1Y2VfcDM2KHQpIF4gYWhjLT5pcF90cmFuc1tpXSk7Ci0gICAgfQotfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBSZXNldCB1aGFzaCBjb250ZXh0IGZvciBuZXh0IGhhc2ggc2Vzc2lvbiAqLwotc3RhdGljIGludCB1aGFzaF9yZXNldCh1aGFzaF9jdHhfdCBwYykKLXsKLSAgICBuaF9yZXNldCgmcGMtPmhhc2gpOwotICAgIHBjLT5tc2dfbGVuID0gMDsKLSAgICBwYy0+cG9seV9hY2N1bVswXSA9IDE7Ci0jaWYgKFVNQUNfT1VUUFVUX0xFTiA+PSA4KQotICAgIHBjLT5wb2x5X2FjY3VtWzFdID0gMTsKLSNlbmRpZgotI2lmIChVTUFDX09VVFBVVF9MRU4gPj0gMTIpCi0gICAgcGMtPnBvbHlfYWNjdW1bMl0gPSAxOwotI2VuZGlmCi0jaWYgKFVNQUNfT1VUUFVUX0xFTiA9PSAxNikKLSAgICBwYy0+cG9seV9hY2N1bVszXSA9IDE7Ci0jZW5kaWYKLSAgICByZXR1cm4gMTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIGtleSBuZWVkZWQgYnkga2RmKCkgYW5kIGEgdWhhc2ggY29udGV4dCwKLSAqIGluaXRpYWxpemUgdGhlIE5IIGNvbnRleHQgYW5kIGdlbmVyYXRlIGtleXMgbmVlZGVkIGZvciBwb2x5IGFuZCBpbm5lci0KLSAqIHByb2R1Y3QgaGFzaGluZy4gQWxsIGtleXMgYXJlIGVuZGlhbiBhZGp1c3RlZCBpbiBtZW1vcnkgc28gdGhhdCBuYXRpdmUKLSAqIGxvYWRzIGNhdXNlIGNvcnJlY3Qga2V5cyB0byBiZSBpbiByZWdpc3RlcnMgZHVyaW5nIGNhbGN1bGF0aW9uLgotICovCi1zdGF0aWMgdm9pZCB1aGFzaF9pbml0KHVoYXNoX2N0eF90IGFoYywgYWVzX2ludF9rZXkgcHJmX2tleSkKLXsKLSAgICBpbnQgaTsKLSAgICBVSU5UOCBidWZbKDgqU1RSRUFNUys0KSpzaXplb2YoVUlOVDY0KV07Ci0gICAgCi0gICAgLyogWmVybyB0aGUgZW50aXJlIHVoYXNoIGNvbnRleHQgKi8KLSAgICBtZW1zZXQoYWhjLCAwLCBzaXplb2YodWhhc2hfY3R4KSk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBMMSBoYXNoICovCi0gICAgbmhfaW5pdCgmYWhjLT5oYXNoLCBwcmZfa2V5KTsKLSAgICAKLSAgICAvKiBTZXR1cCBMMiBoYXNoIHZhcmlhYmxlcyAqLwotICAgIGtkZihidWYsIHByZl9rZXksIDIsIHNpemVvZihidWYpKTsgICAgLyogRmlsbCBidWZmZXIgd2l0aCBpbmRleCAxIGtleSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBTVFJFQU1TOyBpKyspIHsKLSAgICAgICAgLyogRmlsbCBrZXlzIGZyb20gdGhlIGJ1ZmZlciwgc2tpcHBpbmcgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBub3QKLSAgICAgICAgICogdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uLiBFbmRpYW4gcmV2ZXJzZSB0aGUga2V5cyBpZiBvbiBhCi0gICAgICAgICAqIGxpdHRsZS1lbmRpYW4gY29tcHV0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBtZW1jcHkoYWhjLT5wb2x5X2tleV84K2ksIGJ1ZisyNCppLCA4KTsKLSAgICAgICAgZW5kaWFuX2NvbnZlcnRfaWZfbGUoYWhjLT5wb2x5X2tleV84K2ksIDgsIDgpOwotICAgICAgICAvKiBNYXNrIHRoZSA2NC1iaXQga2V5cyB0byB0aGVpciBzcGVjaWFsIGRvbWFpbiAqLwotICAgICAgICBhaGMtPnBvbHlfa2V5XzhbaV0gJj0gKChVSU5UNjQpMHgwMWZmZmZmZnUgPDwgMzIpICsgMHgwMWZmZmZmZnU7Ci0gICAgICAgIGFoYy0+cG9seV9hY2N1bVtpXSA9IDE7ICAvKiBPdXIgcG9seWhhc2ggcHJlcGVuZHMgYSBub24temVybyB3b3JkICovCi0gICAgfQotICAgIAotICAgIC8qIFNldHVwIEwzLTEgaGFzaCB2YXJpYWJsZXMgKi8KLSAgICBrZGYoYnVmLCBwcmZfa2V5LCAzLCBzaXplb2YoYnVmKSk7IC8qIEZpbGwgYnVmZmVyIHdpdGggaW5kZXggMiBrZXkgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgU1RSRUFNUzsgaSsrKQotICAgICAgICAgIG1lbWNweShhaGMtPmlwX2tleXMrNCppLCBidWYrKDgqaSs0KSpzaXplb2YoVUlOVDY0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KnNpemVvZihVSU5UNjQpKTsKLSAgICBlbmRpYW5fY29udmVydF9pZl9sZShhaGMtPmlwX2tleXMsIHNpemVvZihVSU5UNjQpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFoYy0+aXBfa2V5cykpOwotICAgIGZvciAoaSA9IDA7IGkgPCBTVFJFQU1TKjQ7IGkrKykKLSAgICAgICAgYWhjLT5pcF9rZXlzW2ldICU9IHAzNjsgIC8qIEJyaW5nIGludG8gWl9wMzYgKi8KLSAgICAKLSAgICAvKiBTZXR1cCBMMy0yIGhhc2ggdmFyaWFibGVzICAgICovCi0gICAgLyogRmlsbCBidWZmZXIgd2l0aCBpbmRleCA0IGtleSAqLwotICAgIGtkZihhaGMtPmlwX3RyYW5zLCBwcmZfa2V5LCA0LCBTVFJFQU1TICogc2l6ZW9mKFVJTlQzMikpOwotICAgIGVuZGlhbl9jb252ZXJ0X2lmX2xlKGFoYy0+aXBfdHJhbnMsIHNpemVvZihVSU5UMzIpLAotICAgICAgICAgICAgICAgICAgICAgICAgIFNUUkVBTVMgKiBzaXplb2YoVUlOVDMyKSk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIDAKLXN0YXRpYyB1aGFzaF9jdHhfdCB1aGFzaF9hbGxvYyh1X2NoYXIga2V5W10pCi17Ci0vKiBBbGxvY2F0ZSBtZW1vcnkgYW5kIGZvcmNlIHRvIGEgMTYtYnl0ZSBib3VuZGFyeS4gKi8KLSAgICB1aGFzaF9jdHhfdCBjdHg7Ci0gICAgdV9jaGFyIGJ5dGVzX3RvX2FkZDsKLSAgICBhZXNfaW50X2tleSBwcmZfa2V5OwotICAgIAotICAgIGN0eCA9ICh1aGFzaF9jdHhfdCltYWxsb2Moc2l6ZW9mKHVoYXNoX2N0eCkrQUxMT0NfQk9VTkRBUlkpOwotICAgIGlmIChjdHgpIHsKLSAgICAgICAgaWYgKEFMTE9DX0JPVU5EQVJZKSB7Ci0gICAgICAgICAgICBieXRlc190b19hZGQgPSBBTExPQ19CT1VOREFSWSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHB0cmRpZmZfdCljdHggJiAoQUxMT0NfQk9VTkRBUlkgLTEpKTsKLSAgICAgICAgICAgIGN0eCA9ICh1aGFzaF9jdHhfdCkoKHVfY2hhciAqKWN0eCArIGJ5dGVzX3RvX2FkZCk7Ci0gICAgICAgICAgICAqKCh1X2NoYXIgKiljdHggLSAxKSA9IGJ5dGVzX3RvX2FkZDsKLSAgICAgICAgfQotICAgICAgICBhZXNfa2V5X3NldHVwKGtleSxwcmZfa2V5KTsKLSAgICAgICAgdWhhc2hfaW5pdChjdHgsIHByZl9rZXkpOwotICAgIH0KLSAgICByZXR1cm4gKGN0eCk7Ci19Ci0jZW5kaWYKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWYgMAotc3RhdGljIGludCB1aGFzaF9mcmVlKHVoYXNoX2N0eF90IGN0eCkKLXsKLS8qIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSB1aGFzaF9hbGxvYyAqLwotICAgIHVfY2hhciBieXRlc190b19zdWI7Ci0gICAgCi0gICAgaWYgKGN0eCkgewotICAgICAgICBpZiAoQUxMT0NfQk9VTkRBUlkpIHsKLSAgICAgICAgICAgIGJ5dGVzX3RvX3N1YiA9ICooKHVfY2hhciAqKWN0eCAtIDEpOwotICAgICAgICAgICAgY3R4ID0gKHVoYXNoX2N0eF90KSgodV9jaGFyICopY3R4IC0gYnl0ZXNfdG9fc3ViKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKGN0eCk7Ci0gICAgfQotICAgIHJldHVybiAoMSk7Ci19Ci0jZW5kaWYKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludCB1aGFzaF91cGRhdGUodWhhc2hfY3R4X3QgY3R4LCB1X2NoYXIgKmlucHV0LCBsb25nIGxlbikKLS8qIEdpdmVuIGxlbiBieXRlcyBvZiBkYXRhLCB3ZSBwYXJzZSBpdCBpbnRvIEwxX0tFWV9MRU4gY2h1bmtzIGFuZAotICogaGFzaCBlYWNoIG9uZSB3aXRoIE5ILCBjYWxsaW5nIHRoZSBwb2x5aGFzaCBvbiBlYWNoIE5IIG91dHB1dC4KLSAqLwotewotICAgIFVXT1JEIGJ5dGVzX2hhc2hlZCwgYnl0ZXNfcmVtYWluaW5nOwotICAgIFVJTlQ2NCByZXN1bHRfYnVmW1NUUkVBTVNdOwotICAgIFVJTlQ4ICpuaF9yZXN1bHQgPSAoVUlOVDggKikmcmVzdWx0X2J1ZjsKLSAgICAKLSAgICBpZiAoY3R4LT5tc2dfbGVuICsgbGVuIDw9IEwxX0tFWV9MRU4pIHsKLSAgICAgICAgbmhfdXBkYXRlKCZjdHgtPmhhc2gsIChVSU5UOCAqKWlucHV0LCBsZW4pOwotICAgICAgICBjdHgtPm1zZ19sZW4gKz0gbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgCi0gICAgICAgICBieXRlc19oYXNoZWQgPSBjdHgtPm1zZ19sZW4gJSBMMV9LRVlfTEVOOwotICAgICAgICAgaWYgKGN0eC0+bXNnX2xlbiA9PSBMMV9LRVlfTEVOKQotICAgICAgICAgICAgIGJ5dGVzX2hhc2hlZCA9IEwxX0tFWV9MRU47Ci0KLSAgICAgICAgIGlmIChieXRlc19oYXNoZWQgKyBsZW4gPj0gTDFfS0VZX0xFTikgewotCi0gICAgICAgICAgICAgLyogSWYgc29tZSBieXRlcyBoYXZlIGJlZW4gcGFzc2VkIHRvIHRoZSBoYXNoIGZ1bmN0aW9uICAgICAgKi8KLSAgICAgICAgICAgICAvKiB0aGVuIHdlIHdhbnQgdG8gcGFzcyBhdCBtb3N0IChMMV9LRVlfTEVOIC0gYnl0ZXNfaGFzaGVkKSAqLwotICAgICAgICAgICAgIC8qIGJ5dGVzIHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50IG5oX2Jsb2NrLiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgaWYgKGJ5dGVzX2hhc2hlZCkgewotICAgICAgICAgICAgICAgICBieXRlc19yZW1haW5pbmcgPSAoTDFfS0VZX0xFTiAtIGJ5dGVzX2hhc2hlZCk7Ci0gICAgICAgICAgICAgICAgIG5oX3VwZGF0ZSgmY3R4LT5oYXNoLCAoVUlOVDggKilpbnB1dCwgYnl0ZXNfcmVtYWluaW5nKTsKLSAgICAgICAgICAgICAgICAgbmhfZmluYWwoJmN0eC0+aGFzaCwgbmhfcmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgY3R4LT5tc2dfbGVuICs9IGJ5dGVzX3JlbWFpbmluZzsKLSAgICAgICAgICAgICAgICAgcG9seV9oYXNoKGN0eCwoVUlOVDMyICopbmhfcmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgbGVuIC09IGJ5dGVzX3JlbWFpbmluZzsKLSAgICAgICAgICAgICAgICAgaW5wdXQgKz0gYnl0ZXNfcmVtYWluaW5nOwotICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgIC8qIEhhc2ggZGlyZWN0bHkgZnJvbSBpbnB1dCBzdHJlYW0gaWYgZW5vdWdoIGJ5dGVzICovCi0gICAgICAgICAgICAgd2hpbGUgKGxlbiA+PSBMMV9LRVlfTEVOKSB7Ci0gICAgICAgICAgICAgICAgIG5oKCZjdHgtPmhhc2gsIChVSU5UOCAqKWlucHV0LCBMMV9LRVlfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMV9LRVlfTEVOLCBuaF9yZXN1bHQpOwotICAgICAgICAgICAgICAgICBjdHgtPm1zZ19sZW4gKz0gTDFfS0VZX0xFTjsKLSAgICAgICAgICAgICAgICAgbGVuIC09IEwxX0tFWV9MRU47Ci0gICAgICAgICAgICAgICAgIGlucHV0ICs9IEwxX0tFWV9MRU47Ci0gICAgICAgICAgICAgICAgIHBvbHlfaGFzaChjdHgsKFVJTlQzMiAqKW5oX3Jlc3VsdCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICAvKiBwYXNzIHJlbWFpbmluZyA8IEwxX0tFWV9MRU4gYnl0ZXMgb2YgaW5wdXQgZGF0YSB0byBOSCAqLwotICAgICAgICAgaWYgKGxlbikgewotICAgICAgICAgICAgIG5oX3VwZGF0ZSgmY3R4LT5oYXNoLCAoVUlOVDggKilpbnB1dCwgbGVuKTsKLSAgICAgICAgICAgICBjdHgtPm1zZ19sZW4gKz0gbGVuOwotICAgICAgICAgfQotICAgICB9Ci0KLSAgICByZXR1cm4gKDEpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBpbnQgdWhhc2hfZmluYWwodWhhc2hfY3R4X3QgY3R4LCB1X2NoYXIgKnJlcykKLS8qIEluY29ycG9yYXRlIGFueSBwZW5kaW5nIGRhdGEsIHBhZCwgYW5kIGdlbmVyYXRlIHRhZyAqLwotewotICAgIFVJTlQ2NCByZXN1bHRfYnVmW1NUUkVBTVNdOwotICAgIFVJTlQ4ICpuaF9yZXN1bHQgPSAoVUlOVDggKikmcmVzdWx0X2J1ZjsKLQotICAgIGlmIChjdHgtPm1zZ19sZW4gPiBMMV9LRVlfTEVOKSB7Ci0gICAgICAgIGlmIChjdHgtPm1zZ19sZW4gJSBMMV9LRVlfTEVOKSB7Ci0gICAgICAgICAgICBuaF9maW5hbCgmY3R4LT5oYXNoLCBuaF9yZXN1bHQpOwotICAgICAgICAgICAgcG9seV9oYXNoKGN0eCwoVUlOVDMyICopbmhfcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICBpcF9sb25nKGN0eCwgcmVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBuaF9maW5hbCgmY3R4LT5oYXNoLCBuaF9yZXN1bHQpOwotICAgICAgICBpcF9zaG9ydChjdHgsbmhfcmVzdWx0LCByZXMpOwotICAgIH0KLSAgICB1aGFzaF9yZXNldChjdHgpOwotICAgIHJldHVybiAoMSk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIDAKLXN0YXRpYyBpbnQgdWhhc2godWhhc2hfY3R4X3QgYWhjLCB1X2NoYXIgKm1zZywgbG9uZyBsZW4sIHVfY2hhciAqcmVzKQotLyogYXNzdW1lcyB0aGF0IG1zZyBpcyBpbiBhIHdyaXRhYmxlIGJ1ZmZlciBvZiBsZW5ndGggZGl2aXNpYmxlIGJ5ICovCi0vKiBMMV9QQURfQk9VTkRBUlkuIEJ5dGVzIGJleW9uZCBtc2dbbGVuXSBtYXkgYmUgemVyb2VkLiAgICAgICAgICAgKi8KLXsKLSAgICBVSU5UOCBuaF9yZXN1bHRbU1RSRUFNUypzaXplb2YoVUlOVDY0KV07Ci0gICAgVUlOVDMyIG5oX2xlbjsKLSAgICBpbnQgZXh0cmFfemVyb2VzX25lZWRlZDsKLSAgICAgICAgCi0gICAgLyogSWYgdGhlIG1lc3NhZ2UgdG8gYmUgaGFzaGVkIGlzIG5vIGxvbmdlciB0aGFuIEwxX0hBU0hfTEVOLCB3ZSBza2lwCi0gICAgICogdGhlIHBvbHloYXNoLgotICAgICAqLwotICAgIGlmIChsZW4gPD0gTDFfS0VZX0xFTikgewotICAgIAlpZiAobGVuID09IDApICAgICAgICAgICAgICAgICAgLyogSWYgemVybyBsZW5ndGggbWVzc2FnZXMgd2lsbCBub3QgKi8KLSAgICAJCW5oX2xlbiA9IEwxX1BBRF9CT1VOREFSWTsgIC8qIGJlIHNlZW4sIGNvbW1lbnQgb3V0IHRoaXMgY2FzZSAgICovIAotICAgIAllbHNlCi0gICAgICAgIAluaF9sZW4gPSAoKGxlbiArIChMMV9QQURfQk9VTkRBUlkgLSAxKSkgJiB+KEwxX1BBRF9CT1VOREFSWSAtIDEpKTsKLSAgICAgICAgZXh0cmFfemVyb2VzX25lZWRlZCA9IG5oX2xlbiAtIGxlbjsKLSAgICAgICAgemVyb19wYWQoKFVJTlQ4ICopbXNnICsgbGVuLCBleHRyYV96ZXJvZXNfbmVlZGVkKTsKLSAgICAgICAgbmgoJmFoYy0+aGFzaCwgKFVJTlQ4ICopbXNnLCBuaF9sZW4sIGxlbiwgbmhfcmVzdWx0KTsKLSAgICAgICAgaXBfc2hvcnQoYWhjLG5oX3Jlc3VsdCwgcmVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiBPdGhlcndpc2UsIHdlIGhhc2ggZWFjaCBMMV9LRVlfTEVOIGNodW5rIHdpdGggTkgsIHBhc3NpbmcgdGhlIE5ICi0gICAgICAgICAqIG91dHB1dCB0byBwb2x5X2hhc2goKS4KLSAgICAgICAgICovCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIG5oKCZhaGMtPmhhc2gsIChVSU5UOCAqKW1zZywgTDFfS0VZX0xFTiwgTDFfS0VZX0xFTiwgbmhfcmVzdWx0KTsKLSAgICAgICAgICAgIHBvbHlfaGFzaChhaGMsKFVJTlQzMiAqKW5oX3Jlc3VsdCk7Ci0gICAgICAgICAgICBsZW4gLT0gTDFfS0VZX0xFTjsKLSAgICAgICAgICAgIG1zZyArPSBMMV9LRVlfTEVOOwotICAgICAgICB9IHdoaWxlIChsZW4gPj0gTDFfS0VZX0xFTik7Ci0gICAgICAgIGlmIChsZW4pIHsKLSAgICAgICAgICAgIG5oX2xlbiA9ICgobGVuICsgKEwxX1BBRF9CT1VOREFSWSAtIDEpKSAmIH4oTDFfUEFEX0JPVU5EQVJZIC0gMSkpOwotICAgICAgICAgICAgZXh0cmFfemVyb2VzX25lZWRlZCA9IG5oX2xlbiAtIGxlbjsKLSAgICAgICAgICAgIHplcm9fcGFkKChVSU5UOCAqKW1zZyArIGxlbiwgZXh0cmFfemVyb2VzX25lZWRlZCk7Ci0gICAgICAgICAgICBuaCgmYWhjLT5oYXNoLCAoVUlOVDggKiltc2csIG5oX2xlbiwgbGVuLCBuaF9yZXN1bHQpOwotICAgICAgICAgICAgcG9seV9oYXNoKGFoYywoVUlOVDMyICopbmhfcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlwX2xvbmcoYWhjLCByZXMpOwotICAgIH0KLSAgICAKLSAgICB1aGFzaF9yZXNldChhaGMpOwotICAgIHJldHVybiAxOwotfQotI2VuZGlmCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLS0tIEJlZ2luIFVNQUMgU2VjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogVGhlIFVNQUMgaW50ZXJmYWNlIGhhcyB0d28gaW50ZXJmYWNlcywgYW4gYWxsLWF0LW9uY2UgaW50ZXJmYWNlIHdoZXJlCi0gKiB0aGUgZW50aXJlIG1lc3NhZ2UgdG8gYmUgYXV0aGVudGljYXRlZCBpcyBwYXNzZWQgdG8gVU1BQyBpbiBvbmUgYnVmZmVyLAotICogYW5kIGEgc2VxdWVudGlhbCBpbnRlcmZhY2Ugd2hlcmUgdGhlIG1lc3NhZ2UgaXMgcHJlc2VudGVkIGEgbGl0dGxlIGF0IGEgICAKLSAqIHRpbWUuIFRoZSBhbGwtYXQtb25jZSBpcyBtb3JlIG9wdGltYWl6ZWQgdGhhbiB0aGUgc2VxdWVudGlhbCB2ZXJzaW9uIGFuZAotICogc2hvdWxkIGJlIHByZWZlcnJlZCB3aGVuIHRoZSBzZXF1ZW50aWFsIGludGVyZmFjZSBpcyBub3QgcmVxdWlyZWQuIAotICovCi1zdHJ1Y3QgdW1hY19jdHggewotICAgIHVoYXNoX2N0eCBoYXNoOyAgICAgICAgICAvKiBIYXNoIGZ1bmN0aW9uIGZvciBtZXNzYWdlIGNvbXByZXNzaW9uICAgICovCi0gICAgcGRmX2N0eCBwZGY7ICAgICAgICAgICAgIC8qIFBERiBmb3IgaGFzaGVkIG91dHB1dCAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB2b2lkICpmcmVlX3B0cjsgICAgICAgICAgLyogQWRkcmVzcyB0byBmcmVlIHRoaXMgc3RydWN0IHZpYSAgICAgICAgICAqLwotfSB1bWFjX2N0eDsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWYgMAotaW50IHVtYWNfcmVzZXQoc3RydWN0IHVtYWNfY3R4ICpjdHgpCi0vKiBSZXNldCB0aGUgaGFzaCBmdW5jdGlvbiB0byBiZWdpbiBhIG5ldyBhdXRoZW50aWNhdGlvbi4gICAgICAgICovCi17Ci0gICAgdWhhc2hfcmVzZXQoJmN0eC0+aGFzaCk7Ci0gICAgcmV0dXJuICgxKTsKLX0KLSNlbmRpZgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLWludCB1bWFjX2RlbGV0ZShzdHJ1Y3QgdW1hY19jdHggKmN0eCkKLS8qIERlYWxsb2NhdGUgdGhlIGN0eCBzdHJ1Y3R1cmUgKi8KLXsKLSAgICBpZiAoY3R4KSB7Ci0gICAgICAgIGlmIChBTExPQ19CT1VOREFSWSkKLSAgICAgICAgICAgIGN0eCA9IChzdHJ1Y3QgdW1hY19jdHggKiljdHgtPmZyZWVfcHRyOwotICAgICAgICB4ZnJlZShjdHgpOwotICAgIH0KLSAgICByZXR1cm4gKDEpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0cnVjdCB1bWFjX2N0eCAqdW1hY19uZXcodV9jaGFyIGtleVtdKQotLyogRHluYW1pY2FsbHkgYWxsb2NhdGUgYSB1bWFjX2N0eCBzdHJ1Y3QsIGluaXRpYWxpemUgdmFyaWFibGVzLCAKLSAqIGdlbmVyYXRlIHN1YmtleXMgZnJvbSBrZXkuIEFsaWduIHRvIDE2LWJ5dGUgYm91bmRhcnkuCi0gKi8KLXsKLSAgICBzdHJ1Y3QgdW1hY19jdHggKmN0eCwgKm9jdHg7Ci0gICAgc2l6ZV90IGJ5dGVzX3RvX2FkZDsKLSAgICBhZXNfaW50X2tleSBwcmZfa2V5OwotICAgIAotICAgIG9jdHggPSBjdHggPSB4bWFsbG9jKHNpemVvZigqY3R4KSArIEFMTE9DX0JPVU5EQVJZKTsKLSAgICBpZiAoY3R4KSB7Ci0gICAgICAgIGlmIChBTExPQ19CT1VOREFSWSkgewotICAgICAgICAgICAgYnl0ZXNfdG9fYWRkID0gQUxMT0NfQk9VTkRBUlkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwdHJkaWZmX3QpY3R4ICYgKEFMTE9DX0JPVU5EQVJZIC0gMSkpOwotICAgICAgICAgICAgY3R4ID0gKHN0cnVjdCB1bWFjX2N0eCAqKSgodV9jaGFyICopY3R4ICsgYnl0ZXNfdG9fYWRkKTsKLSAgICAgICAgfQotICAgICAgICBjdHgtPmZyZWVfcHRyID0gb2N0eDsKLSAgICAgICAgYWVzX2tleV9zZXR1cChrZXkscHJmX2tleSk7Ci0gICAgICAgIHBkZl9pbml0KCZjdHgtPnBkZiwgcHJmX2tleSk7Ci0gICAgICAgIHVoYXNoX2luaXQoJmN0eC0+aGFzaCwgcHJmX2tleSk7Ci0gICAgfQotICAgICAgICAKLSAgICByZXR1cm4gKGN0eCk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotaW50IHVtYWNfZmluYWwoc3RydWN0IHVtYWNfY3R4ICpjdHgsIHVfY2hhciB0YWdbXSwgdV9jaGFyIG5vbmNlWzhdKQotLyogSW5jb3Jwb3JhdGUgYW55IHBlbmRpbmcgZGF0YSwgcGFkLCBhbmQgZ2VuZXJhdGUgdGFnICovCi17Ci0gICAgdWhhc2hfZmluYWwoJmN0eC0+aGFzaCwgKHVfY2hhciAqKXRhZyk7Ci0gICAgcGRmX2dlbl94b3IoJmN0eC0+cGRmLCAoVUlOVDggKilub25jZSwgKFVJTlQ4ICopdGFnKTsKLSAgICAKLSAgICByZXR1cm4gKDEpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLWludCB1bWFjX3VwZGF0ZShzdHJ1Y3QgdW1hY19jdHggKmN0eCwgdV9jaGFyICppbnB1dCwgbG9uZyBsZW4pCi0vKiBHaXZlbiBsZW4gYnl0ZXMgb2YgZGF0YSwgd2UgcGFyc2UgaXQgaW50byBMMV9LRVlfTEVOIGNodW5rcyBhbmQgICAqLwotLyogaGFzaCBlYWNoIG9uZSwgY2FsbGluZyB0aGUgUERGIG9uIHRoZSBoYXNoZWQgb3V0cHV0IHdoZW5ldmVyIHRoZSBoYXNoLSAqLwotLyogb3V0cHV0IGJ1ZmZlciBpcyBmdWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotewotICAgIHVoYXNoX3VwZGF0ZSgmY3R4LT5oYXNoLCBpbnB1dCwgbGVuKTsKLSAgICByZXR1cm4gKDEpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpZiAwCi1pbnQgdW1hYyhzdHJ1Y3QgdW1hY19jdHggKmN0eCwgdV9jaGFyICppbnB1dCwgCi0gICAgICAgICBsb25nIGxlbiwgdV9jaGFyIHRhZ1tdLAotICAgICAgICAgdV9jaGFyIG5vbmNlWzhdKQotLyogQWxsLWluLW9uZSB2ZXJzaW9uIHNpbXBseSBjYWxscyB1bWFjX3VwZGF0ZSgpIGFuZCB1bWFjX2ZpbmFsKCkuICAgICAgICAqLwotewotICAgIHVoYXNoKCZjdHgtPmhhc2gsIGlucHV0LCBsZW4sICh1X2NoYXIgKil0YWcpOwotICAgIHBkZl9nZW5feG9yKCZjdHgtPnBkZiwgKFVJTlQ4ICopbm9uY2UsIChVSU5UOCAqKXRhZyk7Ci0gICAgCi0gICAgcmV0dXJuICgxKTsKLX0KLSNlbmRpZgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLSBFbmQgVU1BQyBTZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS91bWFjLmggYi91bWFjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NWM3MDUuLjAwMDAwMDAKLS0tIGEvdW1hYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qICRPcGVuQlNEOiB1bWFjLmgsdiAxLjEgMjAwNy8wNi8wNyAxOTozNzozNCBwdmFsY2hldiBFeHAgJCAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIAotICogdW1hYy5oIC0tIEMgSW1wbGVtZW50YXRpb24gVU1BQyBNZXNzYWdlIEF1dGhlbnRpY2F0aW9uCi0gKgotICogVmVyc2lvbiAwLjkzYSBvZiByZmM0NDE4LnR4dCAtLSAyMDA2IEp1bHkgMTQKLSAqCi0gKiBGb3IgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIFVNQUMgbWVzc2FnZSBhdXRoZW50aWNhdGlvbiBzZWUgdGhlIFVNQUMKLSAqIHdvcmxkLXdpZGUtd2ViIHBhZ2UgYXQgaHR0cDovL3d3dy5jcy51Y2RhdmlzLmVkdS9+cm9nYXdheS91bWFjCi0gKiBQbGVhc2UgcmVwb3J0IGJ1Z3MgYW5kIHN1Z2dlc3Rpb25zIHRvIHRoZSBVTUFDIHdlYnBhZ2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgVGVkIEtyb3ZldHoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCi0gKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGggb3Igd2l0aG91dCBmZWUsIGlzIGhlcmVieQotICogZ3JhbnRlZCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcwotICogYW5kIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodAotICogaG9sZGVyIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCi0gKiBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KLSAqCi0gKiBDb21tZW50cyBzaG91bGQgYmUgZGlyZWN0ZWQgdG8gVGVkIEtyb3ZldHogKHRka0BhY20ub3JnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotIAotIC8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSU1QT1JUQU5UIE5PVEVTIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAqCi0gICogMSkgVGhpcyB2ZXJzaW9uIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgb24gbWVzc2FnZXMgbGFyZ2VyIHRoYW4gMTZNQgotICAqCi0gICogMikgSWYgeW91IHNldCB0aGUgc3dpdGNoIHRvIHVzZSBTU0UyLCB0aGVuIGFsbCBkYXRhIG11c3QgYmUgMTYtYnl0ZQotICAqICAgIGFsaWduZWQKLSAgKgotICAqIDMpIFdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb24gdW1hYygpLCBpdCBpcyBhc3N1bWVkIHRoYXQgbXNnIGlzIGluCi0gICogYSB3cml0YWJsZSBidWZmZXIgb2YgbGVuZ3RoIGRpdmlzaWJsZSBieSAzMiBieXRlcy4gVGhlIG1lc3NhZ2UgaXRzZWxmCi0gICogZG9lcyBub3QgaGF2ZSB0byBmaWxsIHRoZSBlbnRpcmUgYnVmZmVyLCBidXQgYnl0ZXMgYmV5b25kIG1zZyBtYXkgYmUKLSAgKiB6ZXJvZWQuCi0gICoKLSAgKiA0KSBUd28gZnJlZSBBRVMgaW1wbGVtZW50YXRpb25zIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbiBvZgotICAqIFVNQUMuIFBhdWxvIEJhcnJldG8ncyB2ZXJzaW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluIGFuZCBjYW4gYmUgZm91bmQKLSAgKiBhdCBodHRwOi8vd3d3LmVzYXQua3VsZXV2ZW4uYWMuYmUvfnJpam1lbi9yaWpuZGFlbC8gKHNlYXJjaCBmb3IKLSAgKiAiQmFycmV0byIpLiBUaGUgb25seSB0d28gZmlsZXMgbmVlZGVkIGFyZSByaWpuZGFlbC1hbGctZnN0LmMgYW5kCi0gICogcmlqbmRhZWwtYWxnLWZzdC5oLgotICAqIEJyaWFuIEdsYWRtYW4ncyB2ZXJzaW9uIGlzIGRpc3RyaWJ1dGVkIHdpdGggR05VIFB1YmxpYyBsaXNlbmNlCi0gICogYW5kIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vZnAuZ2xhZG1hbi5wbHVzLmNvbS9BRVMvaW5kZXguaHRtLiBJdAotICAqIGluY2x1ZGVzIGEgZmFzdCBJQS0zMiBhc3NlbWJseSB2ZXJzaW9uLgotICAqCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0jaWZuZGVmIEhFQURFUl9VTUFDX0gKLSNkZWZpbmUgSEVBREVSX1VNQUNfSAotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotICAgIGV4dGVybiAiQyIgewotI2VuZGlmCi0KLXN0cnVjdCB1bWFjX2N0eCAqdW1hY19uZXcodV9jaGFyIGtleVtdKTsKLS8qIER5bmFtaWNhbGx5IGFsbG9jYXRlIGEgdW1hY19jdHggc3RydWN0LCBpbml0aWFsaXplIHZhcmlhYmxlcywgCi0gKiBnZW5lcmF0ZSBzdWJrZXlzIGZyb20ga2V5LgotICovCi0KLSNpZiAwCi1pbnQgdW1hY19yZXNldChzdHJ1Y3QgdW1hY19jdHggKmN0eCk7Ci0vKiBSZXNldCBhIHVtYWNfY3R4IHRvIGJlZ2luIGF1dGhlbmljYXRpbmcgYSBuZXcgbWVzc2FnZSAqLwotI2VuZGlmCi0KLWludCB1bWFjX3VwZGF0ZShzdHJ1Y3QgdW1hY19jdHggKmN0eCwgdV9jaGFyICppbnB1dCwgbG9uZyBsZW4pOwotLyogSW5jb3Jwb3JhdGUgbGVuIGJ5dGVzIHBvaW50ZWQgdG8gYnkgaW5wdXQgaW50byBjb250ZXh0IGN0eCAqLwotCi1pbnQgdW1hY19maW5hbChzdHJ1Y3QgdW1hY19jdHggKmN0eCwgdV9jaGFyIHRhZ1tdLCB1X2NoYXIgbm9uY2VbOF0pOwotLyogSW5jb3Jwb3JhdGUgYW55IHBlbmRpbmcgZGF0YSBhbmQgdGhlIGN0ciB2YWx1ZSwgYW5kIHJldHVybiB0YWcuIAotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGVycm9yIGNvZGUgaWYgY3RyIDwgMC4gCi0gKi8KLQotaW50IHVtYWNfZGVsZXRlKHN0cnVjdCB1bWFjX2N0eCAqY3R4KTsKLS8qIERlYWxsb2NhdGUgdGhlIGNvbnRleHQgc3RydWN0dXJlICovCi0KLSNpZiAwCi1pbnQgdW1hYyhzdHJ1Y3QgdW1hY19jdHggKmN0eCwgdV9jaGFyICppbnB1dCwgCi0gICAgICAgICBsb25nIGxlbiwgdV9jaGFyIHRhZ1tdLAotICAgICAgICAgdV9jaGFyIG5vbmNlWzhdKTsKLS8qIEFsbC1pbi1vbmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZ1bmN0aW9ucyBSZXNldCwgVXBkYXRlIGFuZCBGaW5hbCAqLwotI2VuZGlmCi0KLS8qIHVoYXNoLmggKi8KLQotCi0jaWYgMAotdHlwZWRlZiBzdHJ1Y3QgdWhhc2hfY3R4ICp1aGFzaF9jdHhfdDsKLSAgLyogVGhlIHVoYXNoX2N0eCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBieSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICAgICovCi0gIC8qIFVIQVNIIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotIAotdWhhc2hfY3R4X3QgdWhhc2hfYWxsb2ModV9jaGFyIGtleVsxNl0pOwotICAvKiBEeW5hbWljYWxseSBhbGxvY2F0ZSBhIHVoYXNoX2N0eCBzdHJ1Y3QgYW5kIGdlbmVyYXRlIHN1YmtleXMgdXNpbmcgKi8KLSAgLyogdGhlIGtkZiBhbmQga2RmX2tleSBwYXNzZWQgaW4uIElmIGtkZl9rZXlfbGVuIGlzIDAgdGhlbiBSQzYgaXMgICAgICovCi0gIC8qIHVzZWQgdG8gZ2VuZXJhdGUga2V5IHdpdGggYSBmaXhlZCBrZXkuIElmIGtkZl9rZXlfbGVuID4gMCBidXQga2RmICAqLwotICAvKiBpcyBOVUxMIHRoZW4gdGhlIGZpcnN0IDE2IGJ5dGVzIHBvaW50ZWQgYXQgYnkga2RmX2tleSBpcyB1c2VkIGFzIGEgKi8KLSAgLyoga2V5IGZvciBhbiBSQzYgYmFzZWQgS0RGLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIAotaW50IHVoYXNoX2ZyZWUodWhhc2hfY3R4X3QgY3R4KTsKLQotaW50IHVoYXNoX3NldF9wYXJhbXModWhhc2hfY3R4X3QgY3R4LAotICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKnBhcmFtcyk7Ci0KLWludCB1aGFzaF9yZXNldCh1aGFzaF9jdHhfdCBjdHgpOwotCi1pbnQgdWhhc2hfdXBkYXRlKHVoYXNoX2N0eF90IGN0eCwKLSAgICAgICAgICAgICAgIHVfY2hhciAgICAgICAqaW5wdXQsCi0gICAgICAgICAgICAgICBsb25nICAgICAgICBsZW4pOwotCi1pbnQgdWhhc2hfZmluYWwodWhhc2hfY3R4X3QgY3R4LAotICAgICAgICAgICAgICB1X2NoYXIgICAgICAgIG91cHV0W10pOwotCi1pbnQgdWhhc2godWhhc2hfY3R4X3QgY3R4LAotICAgICAgICB1X2NoYXIgICAgICAgKmlucHV0LAotICAgICAgICBsb25nICAgICAgICBsZW4sCi0gICAgICAgIHVfY2hhciAgICAgICAgb3V0cHV0W10pOwotCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gICAgfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBIRUFERVJfVU1BQ19IICovCmRpZmYgLS1naXQgYS91dWVuY29kZS5jIGIvdXVlbmNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlkODBkMi4uMDAwMDAwMAotLS0gYS91dWVuY29kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHV1ZW5jb2RlLmMsdiAxLjI2IDIwMTAvMDgvMzEgMTE6NTQ6NDUgZGptIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxyZXNvbHYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInV1ZW5jb2RlLmgiCi0KLS8qCi0gKiBFbmNvZGUgYmluYXJ5ICdzcmMnIG9mIGxlbmd0aCAnc3JjbGVuZ3RoJywgd3JpdGluZyBiYXNlNjQtZW5jb2RlZCB0ZXh0Ci0gKiB0byAndGFyZ2V0JyBvZiBzaXplICd0YXJnc2l6ZScuIFdpbGwgYWx3YXlzIG51bC10ZXJtaW5hdGUgJ3RhcmdldCcuCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3RvcmVkIGluICd0YXJnZXQnIG9yIC0xIG9uIGVycm9yIChpbmMuCi0gKiAndGFyZ3NpemUnIHRvbyBzbWFsbCkuCi0gKi8KLWludAotdXVlbmNvZGUoY29uc3QgdV9jaGFyICpzcmMsIHVfaW50IHNyY2xlbmd0aCwKLSAgICBjaGFyICp0YXJnZXQsIHNpemVfdCB0YXJnc2l6ZSkKLXsKLQlyZXR1cm4gX19iNjRfbnRvcChzcmMsIHNyY2xlbmd0aCwgdGFyZ2V0LCB0YXJnc2l6ZSk7Ci19Ci0KLS8qCi0gKiBEZWNvZGUgYmFzZTY0LWVuY29kZWQgJ3NyYycgaW50byBidWZmZXIgJ3RhcmdldCcgb2YgJ3RhcmdzaXplJyBieXRlcy4KLSAqIFdpbGwgc2tpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqIHN0b3JlZCBpbiAndGFyZ2V0JyBvciAtMSBvbiBlcnJvciAoaW5jLiB0YXJnc2l6ZSB0b28gc21hbGwpLgotICovCi1pbnQKLXV1ZGVjb2RlKGNvbnN0IGNoYXIgKnNyYywgdV9jaGFyICp0YXJnZXQsIHNpemVfdCB0YXJnc2l6ZSkKLXsKLQlpbnQgbGVuOwotCWNoYXIgKmVuY29kZWQsICpwOwotCi0JLyogY29weSB0aGUgJ3JlYWRvbmx5JyBzb3VyY2UgKi8KLQllbmNvZGVkID0geHN0cmR1cChzcmMpOwotCS8qIHNraXAgd2hpdGVzcGFjZSBhbmQgZGF0YSAqLwotCWZvciAocCA9IGVuY29kZWQ7ICpwID09ICcgJyB8fCAqcCA9PSAnXHQnOyBwKyspCi0JCTsKLQlmb3IgKDsgKnAgIT0gJ1wwJyAmJiAqcCAhPSAnICcgJiYgKnAgIT0gJ1x0JzsgcCsrKQotCQk7Ci0JLyogYW5kIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGJlY2F1c2UgX19iNjRfcHRvbiBuZWVkcyB0aGlzICovCi0JKnAgPSAnXDAnOwotCWxlbiA9IF9fYjY0X3B0b24oZW5jb2RlZCwgdGFyZ2V0LCB0YXJnc2l6ZSk7Ci0JeGZyZWUoZW5jb2RlZCk7Ci0JcmV0dXJuIGxlbjsKLX0KLQotdm9pZAotZHVtcF9iYXNlNjQoRklMRSAqZnAsIGNvbnN0IHVfY2hhciAqZGF0YSwgdV9pbnQgbGVuKQotewotCWNoYXIgKmJ1ZjsKLQlpbnQgaSwgbjsKLQotCWlmIChsZW4gPiA2NTUzNikgewotCQlmcHJpbnRmKGZwLCAiZHVtcF9iYXNlNjQ6IGxlbiA+IDY1NTM2XG4iKTsKLQkJcmV0dXJuOwotCX0KLQlidWYgPSB4bWFsbG9jKDIqbGVuKTsKLQluID0gdXVlbmNvZGUoZGF0YSwgbGVuLCBidWYsIDIqbGVuKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWZwcmludGYoZnAsICIlYyIsIGJ1ZltpXSk7Ci0JCWlmIChpICUgNzAgPT0gNjkpCi0JCQlmcHJpbnRmKGZwLCAiXG4iKTsKLQl9Ci0JaWYgKGkgJSA3MCAhPSA2OSkKLQkJZnByaW50ZihmcCwgIlxuIik7Ci0JeGZyZWUoYnVmKTsKLX0KZGlmZiAtLWdpdCBhL3V1ZW5jb2RlLmggYi91dWVuY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDk4ODgxLi4wMDAwMDAwCi0tLSBhL3V1ZW5jb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiAkT3BlbkJTRDogdXVlbmNvZGUuaCx2IDEuMTQgMjAxMC8wOC8zMSAxMTo1NDo0NSBkam0gRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBNYXJrdXMgRnJpZWRsLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotaW50CSB1dWVuY29kZShjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNoYXIgKiwgc2l6ZV90KTsKLWludAkgdXVkZWNvZGUoY29uc3QgY2hhciAqLCB1X2NoYXIgKiwgc2l6ZV90KTsKLXZvaWQJIGR1bXBfYmFzZTY0KEZJTEUgKiwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKZGlmZiAtLWdpdCBhL3ZlcnNpb24uaCBiL3ZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExYWNiMy4uMDAwMDAwMAotLS0gYS92ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS8qICRPcGVuQlNEOiB2ZXJzaW9uLmgsdiAxLjYyIDIwMTEvMDgvMDIgMjM6MTM6MDEgZGptIEV4cCAkICovCi0KLSNkZWZpbmUgU1NIX1ZFUlNJT04JIk9wZW5TU0hfNS45IgotCi0jZGVmaW5lIFNTSF9QT1JUQUJMRQkicDEiCi0jZGVmaW5lIFNTSF9SRUxFQVNFCVNTSF9WRVJTSU9OIFNTSF9QT1JUQUJMRQpkaWZmIC0tZ2l0IGEveG1hbGxvYy5jIGIveG1hbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTg1YjRjLi4wMDAwMDAwCi0tLSBhL3htYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKiAkT3BlbkJTRDogeG1hbGxvYy5jLHYgMS4yNyAyMDA2LzA4LzAzIDAzOjM0OjQyIGRlcmFhZHQgRXhwICQgKi8KLS8qCi0gKiBBdXRob3I6IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAxOTk1IFRhdHUgWWxvbmVuIDx5bG9AY3MuaHV0LmZpPiwgRXNwb28sIEZpbmxhbmQKLSAqICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiBWZXJzaW9ucyBvZiBtYWxsb2MgYW5kIGZyaWVuZHMgdGhhdCBjaGVjayB0aGVpciByZXN1bHRzLCBhbmQgbmV2ZXIgcmV0dXJuCi0gKiBmYWlsdXJlICh0aGV5IGNhbGwgZmF0YWwgaWYgdGhleSBlbmNvdW50ZXIgYW4gZXJyb3IpLgotICoKLSAqIEFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZCwgdGhlIGNvZGUgSSBoYXZlIHdyaXR0ZW4gZm9yIHRoaXMgc29mdHdhcmUKLSAqIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gKiBzb2Z0d2FyZSBtdXN0IGJlIGNsZWFybHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBpZiB0aGUgZGVyaXZlZCB3b3JrIGlzCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRpb24gaW4gdGhlIFJGQyBmaWxlLCBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgImxvZy5oIgotCi12b2lkICoKLXhtYWxsb2Moc2l6ZV90IHNpemUpCi17Ci0Jdm9pZCAqcHRyOwotCi0JaWYgKHNpemUgPT0gMCkKLQkJZmF0YWwoInhtYWxsb2M6IHplcm8gc2l6ZSIpOwotCXB0ciA9IG1hbGxvYyhzaXplKTsKLQlpZiAocHRyID09IE5VTEwpCi0JCWZhdGFsKCJ4bWFsbG9jOiBvdXQgb2YgbWVtb3J5IChhbGxvY2F0aW5nICVsdSBieXRlcykiLCAodV9sb25nKSBzaXplKTsKLQlyZXR1cm4gcHRyOwotfQotCi12b2lkICoKLXhjYWxsb2Moc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSkKLXsKLQl2b2lkICpwdHI7Ci0KLQlpZiAoc2l6ZSA9PSAwIHx8IG5tZW1iID09IDApCi0JCWZhdGFsKCJ4Y2FsbG9jOiB6ZXJvIHNpemUiKTsKLQlpZiAoU0laRV9UX01BWCAvIG5tZW1iIDwgc2l6ZSkKLQkJZmF0YWwoInhjYWxsb2M6IG5tZW1iICogc2l6ZSA+IFNJWkVfVF9NQVgiKTsKLQlwdHIgPSBjYWxsb2Mobm1lbWIsIHNpemUpOwotCWlmIChwdHIgPT0gTlVMTCkKLQkJZmF0YWwoInhjYWxsb2M6IG91dCBvZiBtZW1vcnkgKGFsbG9jYXRpbmcgJWx1IGJ5dGVzKSIsCi0JCSAgICAodV9sb25nKShzaXplICogbm1lbWIpKTsKLQlyZXR1cm4gcHRyOwotfQotCi12b2lkICoKLXhyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSkKLXsKLQl2b2lkICpuZXdfcHRyOwotCXNpemVfdCBuZXdfc2l6ZSA9IG5tZW1iICogc2l6ZTsKLQotCWlmIChuZXdfc2l6ZSA9PSAwKQotCQlmYXRhbCgieHJlYWxsb2M6IHplcm8gc2l6ZSIpOwotCWlmIChTSVpFX1RfTUFYIC8gbm1lbWIgPCBzaXplKQotCQlmYXRhbCgieHJlYWxsb2M6IG5tZW1iICogc2l6ZSA+IFNJWkVfVF9NQVgiKTsKLQlpZiAocHRyID09IE5VTEwpCi0JCW5ld19wdHIgPSBtYWxsb2MobmV3X3NpemUpOwotCWVsc2UKLQkJbmV3X3B0ciA9IHJlYWxsb2MocHRyLCBuZXdfc2l6ZSk7Ci0JaWYgKG5ld19wdHIgPT0gTlVMTCkKLQkJZmF0YWwoInhyZWFsbG9jOiBvdXQgb2YgbWVtb3J5IChuZXdfc2l6ZSAlbHUgYnl0ZXMpIiwKLQkJICAgICh1X2xvbmcpIG5ld19zaXplKTsKLQlyZXR1cm4gbmV3X3B0cjsKLX0KLQotdm9pZAoteGZyZWUodm9pZCAqcHRyKQotewotCWlmIChwdHIgPT0gTlVMTCkKLQkJZmF0YWwoInhmcmVlOiBOVUxMIHBvaW50ZXIgZ2l2ZW4gYXMgYXJndW1lbnQiKTsKLQlmcmVlKHB0cik7Ci19Ci0KLWNoYXIgKgoteHN0cmR1cChjb25zdCBjaGFyICpzdHIpCi17Ci0Jc2l6ZV90IGxlbjsKLQljaGFyICpjcDsKLQotCWxlbiA9IHN0cmxlbihzdHIpICsgMTsKLQljcCA9IHhtYWxsb2MobGVuKTsKLQlzdHJsY3B5KGNwLCBzdHIsIGxlbik7Ci0JcmV0dXJuIGNwOwotfQotCi1pbnQKLXhhc3ByaW50ZihjaGFyICoqcmV0LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IGFwOwotCWludCBpOwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JaSA9IHZhc3ByaW50ZihyZXQsIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0KLQlpZiAoaSA8IDAgfHwgKnJldCA9PSBOVUxMKQotCQlmYXRhbCgieGFzcHJpbnRmOiBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5Iik7Ci0KLQlyZXR1cm4gKGkpOwotfQpkaWZmIC0tZ2l0IGEveG1hbGxvYy5oIGIveG1hbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjIxN2E0Li4wMDAwMDAwCi0tLSBhL3htYWxsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qICRPcGVuQlNEOiB4bWFsbG9jLmgsdiAxLjEzIDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLwotCi0vKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMTk5NSBUYXR1IFlsb25lbiA8eWxvQGNzLmh1dC5maT4sIEVzcG9vLCBGaW5sYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICogQ3JlYXRlZDogTW9uIE1hciAyMCAyMjowOToxNyAxOTk1IHlsbwotICoKLSAqIFZlcnNpb25zIG9mIG1hbGxvYyBhbmQgZnJpZW5kcyB0aGF0IGNoZWNrIHRoZWlyIHJlc3VsdHMsIGFuZCBuZXZlciByZXR1cm4KLSAqIGZhaWx1cmUgKHRoZXkgY2FsbCBmYXRhbCBpZiB0aGV5IGVuY291bnRlciBhbiBlcnJvcikuCi0gKgotICogQXMgZmFyIGFzIEkgYW0gY29uY2VybmVkLCB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBmb3IgdGhpcyBzb2Z0d2FyZQotICogY2FuIGJlIHVzZWQgZnJlZWx5IGZvciBhbnkgcHVycG9zZS4gIEFueSBkZXJpdmVkIHZlcnNpb25zIG9mIHRoaXMKLSAqIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiB0aGUgUkZDIGZpbGUsIGl0IG11c3QgYmUKLSAqIGNhbGxlZCBieSBhIG5hbWUgb3RoZXIgdGhhbiAic3NoIiBvciAiU2VjdXJlIFNoZWxsIi4KLSAqLwotCi12b2lkCSp4bWFsbG9jKHNpemVfdCk7Ci12b2lkCSp4Y2FsbG9jKHNpemVfdCwgc2l6ZV90KTsKLXZvaWQJKnhyZWFsbG9jKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QpOwotdm9pZCAgICAgeGZyZWUodm9pZCAqKTsKLWNoYXIJKnhzdHJkdXAoY29uc3QgY2hhciAqKTsKLWludAkgeGFzcHJpbnRmKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgLi4uKQotICAgICAgICAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18gKHByaW50ZiwgMiwgMykpKQotICAgICAgICAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9ubnVsbF9fICgyKSkpOwo=