LyogdWlzdXRpbHMuaAogKgogKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgogKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQogKiBkZXRhaWxzLgogKi8KCi8qCiAqIFVuaXN5cyBWaXJ0dWFsIEhCQSB1dGlsaXRpZXMgaGVhZGVyCiAqLwoKI2lmbmRlZiBfX1VJU1VUSUxTX19IX18KI2RlZmluZSBfX1VJU1VUSUxTX19IX18KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvaW8uaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9nZnAuaD4KCiNpbmNsdWRlICJ2bWNhbGxpbnRlcmZhY2UuaCIKI2luY2x1ZGUgImNoYW5uZWwuaCIKI2luY2x1ZGUgInVpc3RocmVhZC5oIgojaW5jbHVkZSAidWlzcXVldWUuaCIKI2luY2x1ZGUgImRpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaCIKI2luY2x1ZGUgInZidXNkZXZpY2VpbmZvLmgiCiNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KCi8qIFRoaXMgaXMgdGhlIE1BR0lDIG51bWJlciBzdHVmZmVkIGJ5IHZpcnRoYmEgaW4gaG9zdC0+dGhpc19pZC4gVXNlZCB0bwogKiBpZGVudGlmeSB2aXJ0dWFsIGhiYXMuCiAqLwojZGVmaW5lIFVJU19NQUdJQ19WSEJBIDcwNwoKLyogZ2xvYmFsIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgYWN0IGFzIGNhbGxiYWNrIGZ1bmN0aW9ucyBpbnRvCiAqIHVpc25pY21vZCwgdWlzc2Rtb2QsIGFuZCB2aXJ0cGNpbW9kCiAqLwpleHRlcm4gaW50ICgqVWlzbmljQ29udHJvbENoYW5GdW5jKShzdHJ1Y3QgaW9fbXNncyAqKTsKZXh0ZXJuIGludCAoKlVpc3NkQ29udHJvbENoYW5GdW5jKShzdHJ1Y3QgaW9fbXNncyAqKTsKZXh0ZXJuIGludCAoKlZpcnRDb250cm9sQ2hhbkZ1bmMpKHN0cnVjdCBndWVzdF9tc2dzICopOwoKLyogUmV0dXJuIHZhbHVlcyBvZiBhYm92ZSBjYWxsYmFjayBmdW5jdGlvbnM6ICovCiNkZWZpbmUgQ0NGX0VSUk9SICAgICAgICAwCS8qIGNvbXBsZXRlZCBhbmQgZmFpbGVkICovCiNkZWZpbmUgQ0NGX09LICAgICAgICAgICAxCS8qIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KI2RlZmluZSBDQ0ZfUEVORElORyAgICAgIDIJLyogb3BlcmF0aW9uIHN0aWxsIHBlbmRpbmcgKi8KZXh0ZXJuIGF0b21pY190IFVpc1V0aWxzX1JlZ2lzdGVyZWRfU2VydmljZXM7Cgp0eXBlZGVmIHVuc2lnbmVkIGludCBNQUNBUlJBWVtNQVhfTUFDQUREUl9MRU5dOwp0eXBlZGVmIHN0cnVjdCBSZXFIYW5kbGVySW5mb19zdHJ1Y3QgewoJR1VJRCBzd2l0Y2hUeXBlR3VpZDsKCWludCAoKmNvbnRyb2xmdW5jKShzdHJ1Y3QgaW9fbXNncyAqKTsKCXVuc2lnbmVkIGxvbmcgbWluX2NoYW5uZWxfYnl0ZXM7CglpbnQgKCpTZXJ2ZXJfQ2hhbm5lbF9PaykodW5zaWduZWQgbG9uZyBjaGFubmVsQnl0ZXMpOwoJaW50ICgqU2VydmVyX0NoYW5uZWxfSW5pdCkKCSAodm9pZCAqeCwgdW5zaWduZWQgY2hhciAqY2xpZW50U3RyLCBVMzIgY2xpZW50U3RyTGVuLCBVNjQgYnl0ZXMpOwoJY2hhciBzd2l0Y2hfdHlwZV9uYW1lWzk5XTsKCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9saW5rOwkvKiBsaW5rcyBpbnRvIFJlcUhhbmRsZXJJbmZvX2xpc3QgKi8KfSBSZXFIYW5kbGVySW5mb190OwoKUmVxSGFuZGxlckluZm9fdCAqUmVxSGFuZGxlckFkZChHVUlEIHN3aXRjaFR5cGVHdWlkLAoJCQkJY29uc3QgY2hhciAqc3dpdGNoX3R5cGVfbmFtZSwKCQkJCWludCAoKmNvbnRyb2xmdW5jKShzdHJ1Y3QgaW9fbXNncyAqKSwKCQkJCXVuc2lnbmVkIGxvbmcgbWluX2NoYW5uZWxfYnl0ZXMsCgkJCQlpbnQgKCpTZXJ2ZXJfQ2hhbm5lbF9PaykodW5zaWduZWQgbG9uZwoJCQkJCQkJIGNoYW5uZWxCeXRlcyksCgkJCQlpbnQgKCpTZXJ2ZXJfQ2hhbm5lbF9Jbml0KQoJCQkJICh2b2lkICp4LCB1bnNpZ25lZCBjaGFyICpjbGllbnRTdHIsCgkJCQkgIFUzMiBjbGllbnRTdHJMZW4sIFU2NCBieXRlcykpOwpSZXFIYW5kbGVySW5mb190ICpSZXFIYW5kbGVyRmluZChHVUlEIHN3aXRjaFR5cGVHdWlkKTsKaW50IFJlcUhhbmRsZXJEZWwoR1VJRCBzd2l0Y2hUeXBlR3VpZCk7CgojZGVmaW5lIHVpc2xpYl9pb3JlbWFwX2NhY2hlKGFkZHIsIHNpemUpIFwKCWRiZ19pb3JlbWFwX2NhY2hlKGFkZHIsIHNpemUsIF9fRklMRV9fLCBfX0xJTkVfXykKCnN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICoKZGJnX2lvcmVtYXBfY2FjaGUoVTY0IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY2hhciAqZmlsZSwgaW50IGxpbmUpCnsKCXZvaWQgX19pb21lbSAqbmV3OwoJbmV3ID0gaW9yZW1hcF9jYWNoZShhZGRyLCBzaXplKTsKCXJldHVybiBuZXc7Cn0KCiNkZWZpbmUgdWlzbGliX2lvcmVtYXAoYWRkciwgc2l6ZSkgZGJnX2lvcmVtYXAoYWRkciwgc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQoKc3RhdGljIGlubGluZSB2b2lkICoKZGJnX2lvcmVtYXAoVTY0IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY2hhciAqZmlsZSwgaW50IGxpbmUpCnsKCXZvaWQgKm5ldzsKCW5ldyA9IGlvcmVtYXAoYWRkciwgc2l6ZSk7CglyZXR1cm4gbmV3Owp9CgojZGVmaW5lIHVpc2xpYl9pb3VubWFwKGFkZHIpIGRiZ19pb3VubWFwKGFkZHIsIF9fRklMRV9fLCBfX0xJTkVfXykKCnN0YXRpYyBpbmxpbmUgdm9pZApkYmdfaW91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIsIGNoYXIgKmZpbGUsIGludCBsaW5lKQp7Cglpb3VubWFwKGFkZHIpOwp9CgojZGVmaW5lIFBST0NfUkVBRF9CVUZGRVJfU0laRSAxMzEwNzIJLyogc2l6ZSBvZiB0aGUgYnVmZmVyIHRvIGFsbG9jYXRlIHRvCgkJCQkJICogaG9sZCBhbGwgb2YgL3Byb2MvWFhYL2luZm8gKi8KaW50IHVpc3V0aWxfYWRkX3Byb2NfbGluZV9leChpbnQgKnRvdGFsLCBjaGFyICoqYnVmZmVyLCBpbnQgKmJ1ZmZlcl9yZW1haW5pbmcsCgkJCSAgICAgY2hhciAqZm9ybWF0LCAuLi4pOwoKaW50IHVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXIoaW50IHR5cGUsIHZvaWQgKmZwdHIsCgkJCQkgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpjaGlwc2V0X0RyaXZlckluZm8pOwppbnQgdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcl9leChHVUlEIHN3aXRjaFR5cGVHdWlkLAoJCQkJICAgIGNvbnN0IGNoYXIgKnN3aXRjaF90eXBlX25hbWUsCgkJCQkgICAgaW50ICgqZnB0cikoc3RydWN0IGlvX21zZ3MgKiksCgkJCQkgICAgdW5zaWduZWQgbG9uZyBtaW5fY2hhbm5lbF9ieXRlcywKCQkJCSAgICBpbnQgKCpTZXJ2ZXJfQ2hhbm5lbF9PaykodW5zaWduZWQgbG9uZwoJCQkJCQkJICAgICBjaGFubmVsQnl0ZXMpLAoJCQkJICAgIGludCAoKlNlcnZlcl9DaGFubmVsX0luaXQpCgkJCQkgICAgKHZvaWQgKngsIHVuc2lnbmVkIGNoYXIgKmNsaWVudFN0ciwKCQkJCSAgICAgVTMyIGNsaWVudFN0ckxlbiwgVTY0IGJ5dGVzKSwKCQkJCSAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmNoaXBzZXRfRHJpdmVySW5mbyk7CgppbnQgdWlzY3RybF91bnJlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KEdVSUQgc3dpdGNoVHlwZUd1aWQpOwp1bnNpZ25lZCBjaGFyICp1dGlsX21hcF92aXJ0KHN0cnVjdCBwaHlzX2luZm8gKnNnKTsKdm9pZCB1dGlsX3VubWFwX3ZpcnQoc3RydWN0IHBoeXNfaW5mbyAqc2cpOwp1bnNpZ25lZCBjaGFyICp1dGlsX21hcF92aXJ0X2F0b21pYyhzdHJ1Y3QgcGh5c19pbmZvICpzZyk7CnZvaWQgdXRpbF91bm1hcF92aXJ0X2F0b21pYyh2b2lkICpidWYpOwppbnQgdWlzbGliX3NlcnZlcl9pbmplY3RfYWRkX3ZuaWMoVTMyIHN3aXRjaE5vLCBVMzIgQnVzTm8sIFUzMiBudW1JbnRQb3J0cywKCQkJCSAgVTMyIG51bUV4dFBvcnRzLCBNQUNBUlJBWSBwbWFjW10sCgkJCQkgIHBDSEFOTkVMX0hFQURFUiAqKmNoYW4pOwp2b2lkIHVpc2xpYl9zZXJ2ZXJfaW5qZWN0X2RlbF92bmljKFUzMiBzd2l0Y2hObywgVTMyIGJ1c05vLCBVMzIgbnVtSW50UG9ydHMsCgkJCQkgICBVMzIgbnVtRXh0UG9ydHMpOwppbnQgdWlzbGliX2NsaWVudF9pbmplY3RfYWRkX2J1cyhVMzIgYnVzTm8sIEdVSUQgaW5zdEd1aWQsCgkJCQkgVTY0IGNoYW5uZWxBZGRyLCB1bG9uZyBuQ2hhbm5lbEJ5dGVzKTsKaW50ICB1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfYnVzKFUzMiBidXNObyk7CgppbnQgdWlzbGliX2NsaWVudF9pbmplY3RfYWRkX3ZoYmEoVTMyIGJ1c05vLCBVMzIgZGV2Tm8sCgkJCQkgIFU2NCBwaHlzX2NoYW5fYWRkciwgVTMyIGNoYW5fYnl0ZXMsCgkJCQkgIGludCBpc190ZXN0X2FkZHIsIEdVSUQgaW5zdEd1aWQsCgkJCQkgIHN0cnVjdCBJbnRlcnJ1cHRJbmZvICppbnRyKTsKaW50ICB1aXNsaWJfY2xpZW50X2luamVjdF9wYXVzZV92aGJhKFUzMiBidXNObywgVTMyIGRldk5vKTsKaW50ICB1aXNsaWJfY2xpZW50X2luamVjdF9yZXN1bWVfdmhiYShVMzIgYnVzTm8sIFUzMiBkZXZObyk7CmludCB1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdmhiYShVMzIgYnVzTm8sIFUzMiBkZXZObyk7CmludCB1aXNsaWJfY2xpZW50X2luamVjdF9hZGRfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObywKCQkJCSAgVTY0IHBoeXNfY2hhbl9hZGRyLCBVMzIgY2hhbl9ieXRlcywKCQkJCSAgaW50IGlzX3Rlc3RfYWRkciwgR1VJRCBpbnN0R3VpZCwKCQkJCSAgc3RydWN0IEludGVycnVwdEluZm8gKmludHIpOwppbnQgdWlzbGliX2NsaWVudF9pbmplY3RfcGF1c2Vfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObyk7CmludCB1aXNsaWJfY2xpZW50X2luamVjdF9yZXN1bWVfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObyk7CmludCB1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObyk7CiNpZmRlZiBTVE9SQUdFX0NIQU5ORUwKVTY0IHVpc2xpYl9zdG9yYWdlX2NoYW5uZWwoaW50IGNsaWVudF9pZCk7CiNlbmRpZgppbnQgdWlzbGliX2dldF9vd25lZF9wZGVzdChzdHJ1Y3QgdWlzc2NzaV9kZXN0ICpwZGVzdCk7CgppbnQgdWlzbGliX3NlbmRfZXZlbnQoQ09OVFJPTFZNX0lEIGlkLCBDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQgKmV2ZW50KTsKCi8qIHN0cnVjdHVyZSB1c2VkIGJ5IHZoYmEgJiB2bmljIHRvIGtlZXAgdHJhY2sgb2YgcXVldWUgJiB0aHJlYWQgaW5mbyAqLwpzdHJ1Y3QgY2hhbmluZm8gewoJc3RydWN0IHVpc3F1ZXVlX2luZm8gKnF1ZXVlaW5mbzsKCS8qIHRoaXMgc3BlY2lmaWVzIHRoZSBxdWV1ZSBzdHJ1Y3R1cmVzIGZvciBhIGNoYW5uZWwgKi8KCS8qIEFMTE9DQVRFRCBCWSBUSEUgT1RIRVIgRU5EIC0gV0UgSlVTVCBHRVQgQSBQT0lOVEVSIFRPIFRIRSBNRU1PUlkgKi8KCXNwaW5sb2NrX3QgaW5zZXJ0bG9jazsKCS8qIGN1cnJlbnRseSB1c2VkIG9ubHkgaW4gdmlydG5pYyB3aGVuIHNlbmRpbmcgZGF0YSB0byB1aXNuaWMgKi8KCS8qIHRvIHN5bmNocm9uaXplIHRoZSBpbnNlcnRzIGludG8gdGhlIHNpZ25hbCBxdWV1ZSAqLwoJc3RydWN0IHVpc3RocmVhZF9pbmZvIHRocmVhZGluZm87CgkvKiB0aGlzIHNwZWNpZmllcyB0aGUgdGhyZWFkIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgdGhyZWFkIHRoYXQgKi8KCS8qIGhhbmRsZXMgdGhpcyBjaGFubmVsICovCn07CgovKiB0aGlzIGlzIHRoZSB3YWl0IGNvZGUgZm9yIGFsbCB0aGUgdGhyZWFkcyAtIGl0IGlzIHVzZWQgdG8gZ2V0Ciogc29tZXRoaW5nIGZyb20gYSBxdWV1ZSBjaG9pY2VzOiB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUsCiogX3RpbWVvdXQsIGludGVycnVwdGlibGVfdGltZW91dAoqLwojZGVmaW5lIFVJU19USFJFQURfV0FJVF9NU0VDKHgpIHsgXAoJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsgXAoJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKHgpKTsgXAp9CiNkZWZpbmUgVUlTX1RIUkVBRF9XQUlUX1VTRUMoeCkgeyBcCglzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOyBcCglzY2hlZHVsZV90aW1lb3V0KHVzZWNzX3RvX2ppZmZpZXMoeCkpOyBcCn0KI2RlZmluZSBVSVNfVEhSRUFEX1dBSVQgVUlTX1RIUkVBRF9XQUlUX01TRUMoNSkKI2RlZmluZSBVSVNfVEhSRUFEX1dBSVRfU0VDKHgpIHsgXAoJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsgXAoJc2NoZWR1bGVfdGltZW91dCgoeCkqSFopOyBcCn0KCi8qIFRoaXMgaXMgYSBoYWNrIHVudGlsIHdlIGZpeCBJT1ZNIHRvIGluaXRpYWxpemUgdGhlIGNoYW5uZWwgaGVhZGVyCiAqIGNvcnJlY3RseSBhdCBERVZJQ0VfQ1JFQVRFIHRpbWUsIElOU1RFQUQgT0Ygd2FpdGluZyB1bnRpbAogKiBERVZJQ0VfQ09ORklHVVJFIHRpbWUuCiAqLwojZGVmaW5lIFdBSVRfRk9SX1ZBTElEX0dVSUQoZ3VpZCkgXAoJZG8gewkJCQkJCSAgIFwKCQl3aGlsZSAoTUVNQ01QX0lPKCZndWlkLCAmR3VpZDAsIHNpemVvZihHdWlkMCkpID09IDApIHsJXAoJCQlMT0dFUlIoIldhaXRpbmcgZm9yIG5vbi0wIEdVSUQgKHdoeT8/PykuLi5cbiIpOyBcCgkJCVVJU19USFJFQURfV0FJVF9TRUMoNSk7CQkJCVwKCQl9CQkJCQkJCVwKCQlMT0dFUlIoIk9LLi4uIEdVSUQgaXMgbm9uLTAgbm93XG4iKTsJCQlcCgl9IHdoaWxlICgwKQoKLyogQ29weUZyYWdzSW5mb0Zyb21Ta2IgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgYWRkZWQgdG8gZnJhZ3MgYXJyYXkKICogUmV0dXJucyAtMSBvbiBmYWlsdXJlLgogKi8KdW5zaWduZWQgaW50IHVpc3V0aWxfY29weV9mcmFnc2luZm9fZnJvbV9za2IodW5zaWduZWQgY2hhciAqY2FsbGluZ19jdHgsCgkJCQkJICAgICB2b2lkICpza2JfaW4sCgkJCQkJICAgICB1bnNpZ25lZCBpbnQgZmlyc3RmcmFnbGVuLAoJCQkJCSAgICAgdW5zaWduZWQgaW50IGZyYWdzX21heCwKCQkJCQkgICAgIHN0cnVjdCBwaHlzX2luZm8gZnJhZ3NbXSk7CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludApJc3N1ZV9WTUNBTExfSU9fQ09OVFJPTFZNX0FERFIoVTY0ICpDb250cm9sQWRkcmVzcywgVTMyICpDb250cm9sQnl0ZXMpCnsKCVZNQ0FMTF9JT19DT05UUk9MVk1fQUREUl9QQVJBTVMgcGFyYW1zOwoJaW50IHJlc3VsdCA9IFZNQ0FMTF9TVUNDRVNTOwoJVTY0IHBoeXNhZGRyOwoKCXBoeXNhZGRyID0gdmlydF90b19waHlzKCZwYXJhbXMpOwoJSVNTVUVfSU9fVk1DQUxMKFZNQ0FMTF9JT19DT05UUk9MVk1fQUREUiwgcGh5c2FkZHIsIHJlc3VsdCk7CglpZiAoVk1DQUxMX1NVQ0NFU1NGVUwocmVzdWx0KSkgewoJCSpDb250cm9sQWRkcmVzcyA9IHBhcmFtcy5DaGFubmVsQWRkcmVzczsKCQkqQ29udHJvbEJ5dGVzID0gcGFyYW1zLkNoYW5uZWxCeXRlczsKCX0KCXJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IElzc3VlX1ZNQ0FMTF9JT19ESUFHX0FERFIoVTY0ICpEaWFnQ2hhbm5lbEFkZHJlc3MpCnsKCVZNQ0FMTF9JT19ESUFHX0FERFJfUEFSQU1TIHBhcmFtczsKCWludCByZXN1bHQgPSBWTUNBTExfU1VDQ0VTUzsKCVU2NCBwaHlzYWRkcjsKCglwaHlzYWRkciA9IHZpcnRfdG9fcGh5cygmcGFyYW1zKTsKCUlTU1VFX0lPX1ZNQ0FMTChWTUNBTExfSU9fRElBR19BRERSLCBwaHlzYWRkciwgcmVzdWx0KTsKCWlmIChWTUNBTExfU1VDQ0VTU0ZVTChyZXN1bHQpKQoJCSpEaWFnQ2hhbm5lbEFkZHJlc3MgPSBwYXJhbXMuQ2hhbm5lbEFkZHJlc3M7CglyZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludApJc3N1ZV9WTUNBTExfSU9fVklTT1JTRVJJQUxfQUREUihVNjQgKkRpYWdDaGFubmVsQWRkcmVzcykKewoJVk1DQUxMX0lPX1ZJU09SU0VSSUFMX0FERFJfUEFSQU1TIHBhcmFtczsKCWludCByZXN1bHQgPSBWTUNBTExfU1VDQ0VTUzsKCVU2NCBwaHlzYWRkcjsKCglwaHlzYWRkciA9IHZpcnRfdG9fcGh5cygmcGFyYW1zKTsKCUlTU1VFX0lPX1ZNQ0FMTChWTUNBTExfSU9fVklTT1JTRVJJQUxfQUREUiwgcGh5c2FkZHIsIHJlc3VsdCk7CglpZiAoVk1DQUxMX1NVQ0NFU1NGVUwocmVzdWx0KSkKCQkqRGlhZ0NoYW5uZWxBZGRyZXNzID0gcGFyYW1zLkNoYW5uZWxBZGRyZXNzOwoJcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIGlubGluZSBTNjQgSXNzdWVfVk1DQUxMX1FVRVJZX0dVRVNUX1ZJUlRVQUxfVElNRV9PRkZTRVQodm9pZCkKewoJVTY0IHJlc3VsdCA9IFZNQ0FMTF9TVUNDRVNTOwoJVTY0IHBoeXNhZGRyID0gMDsKCglJU1NVRV9JT19WTUNBTEwoVk1DQUxMX1FVRVJZX0dVRVNUX1ZJUlRVQUxfVElNRV9PRkZTRVQsIHBoeXNhZGRyLAoJCQlyZXN1bHQpOwoJcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIGlubGluZSBTNjQgSXNzdWVfVk1DQUxMX01FQVNVUkVNRU5UX0RPX05PVEhJTkcodm9pZCkKewoJVTY0IHJlc3VsdCA9IFZNQ0FMTF9TVUNDRVNTOwoJVTY0IHBoeXNhZGRyID0gMDsKCglJU1NVRV9JT19WTUNBTEwoVk1DQUxMX01FQVNVUkVNRU5UX0RPX05PVEhJTkcsIHBoeXNhZGRyLCByZXN1bHQpOwoJcmV0dXJuIHJlc3VsdDsKfQoKc3RydWN0IGxvZ19pbmZvX3QgewoJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb25nIGxhc3RfY3ljbGVzOwoJdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhX3N1bVs2NF07Cgl1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGFfY250WzY0XTsKCXVuc2lnbmVkIGxvbmcgbG9uZyBtYXhfZGVsdGFbNjRdOwoJdW5zaWduZWQgbG9uZyBsb25nIG1pbl9kZWx0YVs2NF07Cn07CgpzdGF0aWMgaW5saW5lIGludCBJc3N1ZV9WTUNBTExfVVBEQVRFX1BIWVNJQ0FMX1RJTUUoVTY0IGFkanVzdG1lbnQpCnsKCWludCByZXN1bHQgPSBWTUNBTExfU1VDQ0VTUzsKCglJU1NVRV9JT19WTUNBTEwoVk1DQUxMX1VQREFURV9QSFlTSUNBTF9USU1FLCBhZGp1c3RtZW50LCByZXN1bHQpOwoJcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKSXNzdWVfVk1DQUxMX0NIQU5ORUxfTUlTTUFUQ0goY29uc3QgY2hhciAqQ2hhbm5lbE5hbWUsCgkJCSAgICAgIGNvbnN0IGNoYXIgKkl0ZW1OYW1lLAoJCQkgICAgICBVMzIgU291cmNlTGluZU51bWJlciwgY29uc3QgY2hhciAqcGF0aF9uX2ZuKQp7CglWTUNBTExfQ0hBTk5FTF9WRVJTSU9OX01JU01BVENIX1BBUkFNUyBwYXJhbXM7CglpbnQgcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CglVNjQgcGh5c2FkZHI7CgljaGFyICpsYXN0X3NsYXNoID0gTlVMTDsKCglzdHJuY3B5KHBhcmFtcy5DaGFubmVsTmFtZSwgQ2hhbm5lbE5hbWUsCgkJbGVuZ3Rob2YoVk1DQUxMX0NIQU5ORUxfVkVSU0lPTl9NSVNNQVRDSF9QQVJBTVMsIENoYW5uZWxOYW1lKSk7CglzdHJuY3B5KHBhcmFtcy5JdGVtTmFtZSwgSXRlbU5hbWUsCgkJbGVuZ3Rob2YoVk1DQUxMX0NIQU5ORUxfVkVSU0lPTl9NSVNNQVRDSF9QQVJBTVMsIEl0ZW1OYW1lKSk7CglwYXJhbXMuU291cmNlTGluZU51bWJlciA9IFNvdXJjZUxpbmVOdW1iZXI7CgoJbGFzdF9zbGFzaCA9IHN0cnJjaHIocGF0aF9uX2ZuLCAnLycpOwoJaWYgKGxhc3Rfc2xhc2ggIT0gTlVMTCkgewoJCWxhc3Rfc2xhc2grKzsKCQlzdHJuY3B5KHBhcmFtcy5Tb3VyY2VGaWxlTmFtZSwgbGFzdF9zbGFzaCwKCQkJbGVuZ3Rob2YoVk1DQUxMX0NIQU5ORUxfVkVSU0lPTl9NSVNNQVRDSF9QQVJBTVMsCgkJCQkgU291cmNlRmlsZU5hbWUpKTsKCX0gZWxzZQoJCXN0cm5jcHkocGFyYW1zLlNvdXJjZUZpbGVOYW1lLAoJCQkiQ2Fubm90IGRldGVybWluZSBzb3VyY2UgZmlsZW5hbWUiLAoJCQlsZW5ndGhvZihWTUNBTExfQ0hBTk5FTF9WRVJTSU9OX01JU01BVENIX1BBUkFNUywKCQkJCSBTb3VyY2VGaWxlTmFtZSkpOwoKCXBoeXNhZGRyID0gdmlydF90b19waHlzKCZwYXJhbXMpOwoJSVNTVUVfSU9fVk1DQUxMKFZNQ0FMTF9DSEFOTkVMX1ZFUlNJT05fTUlTTUFUQ0gsIHBoeXNhZGRyLCByZXN1bHQpOwoJcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgSXNzdWVfVk1DQUxMX0ZBVEFMX0JZRV9CWUUodm9pZCkKewoJaW50IHJlc3VsdCA9IFZNQ0FMTF9TVUNDRVNTOwoJVTY0IHBoeXNhZGRyID0gMDsKCglJU1NVRV9JT19WTUNBTEwoVk1DQUxMX0dFTkVSSUNfU1VSUkVOREVSX1FVQU5UVU1fRk9SRVZFUiwgcGh5c2FkZHIsCgkJCXJlc3VsdCk7CglyZXR1cm4gcmVzdWx0Owp9CgojZGVmaW5lIFVJU19EQUVNT05JWkUobmFtKQp2b2lkICp1aXNsaWJfY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmN1cl9wb29sLCBjaGFyICpmbiwgaW50IGxuKTsKI2RlZmluZSBVSVNDQUNIRUFMTE9DKGN1cl9wb29sKSB1aXNsaWJfY2FjaGVfYWxsb2MoY3VyX3Bvb2wsIF9fRklMRV9fLCBfX0xJTkVfXykKdm9pZCB1aXNsaWJfY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqY3VyX3Bvb2wsIHZvaWQgKnAsIGNoYXIgKmZuLCBpbnQgbG4pOwojZGVmaW5lIFVJU0NBQ0hFRlJFRShjdXJfcG9vbCwgcCkgXAoJdWlzbGliX2NhY2hlX2ZyZWUoY3VyX3Bvb2wsIHAsIF9fRklMRV9fLCBfX0xJTkVfXykKCnZvaWQgdWlzbGliX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8sCgkJCQkgICAgICBpbnQgKCppbnRlcnJ1cHQpKHZvaWQgKiksCgkJCQkgICAgICB2b2lkICppbnRlcnJ1cHRfY29udGV4dCk7CnZvaWQgdWlzbGliX2Rpc2FibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKFUzMiBidXNObywgVTMyIGRldk5vKTsKdm9pZCB1aXNsaWJfZm9yY2VfY2hhbm5lbF9pbnRlcnJ1cHQoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pOwoKI2VuZGlmIC8qIF9fVUlTVVRJTFNfX0hfXyAqLwo=