LyogdWlzdXRpbHMuYwogKgogKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgogKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQogKiBkZXRhaWxzLgogKi8KCiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGNvbW1vbnR5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgojaW5jbHVkZSA8bGludXgvbGlzdC5oPgojaW5jbHVkZSAidW5pa2xvZy5oIgojaW5jbHVkZSAidWlzdXRpbHMuaCIKI2luY2x1ZGUgInZlcnNpb24uaCIKI2luY2x1ZGUgInZidXNoZWxwZXIuaCIKI2luY2x1ZGUgImd1aWR1dGlscy5oIgojaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiNpZmRlZiBDT05GSUdfSElHSE1FTQojaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgojZW5kaWYKCi8qIHRoaXMgaXMgc2hvcnRlciB0aGFuIHVzaW5nIF9fRklMRV9fIChmdWxsIHBhdGggbmFtZSkgaW4KICogZGVidWcvaW5mby9lcnJvciBtZXNzYWdlcwogKi8KI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVUlTTElCX1BDX3Vpc3V0aWxzX2MKI2RlZmluZSBfX01ZRklMRV9fICJ1aXN1dGlscy5jIgoKLyogZXhwb3J0cyAqLwphdG9taWNfdCBVaXNVdGlsc19SZWdpc3RlcmVkX1NlcnZpY2VzID0gQVRPTUlDX0lOSVQoMCk7CgkJCQkJLyogbnVtIHJlZ2lzdHJhdGlvbnMgdmlhCgkJCQkJICogdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcigpIG9yCgkJCQkJICogdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcl9leCgpICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBVdGlsaXR5IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmludAp1aXN1dGlsX2FkZF9wcm9jX2xpbmVfZXgoaW50ICp0b3RhbCwgY2hhciAqKmJ1ZmZlciwgaW50ICpidWZmZXJfcmVtYWluaW5nLAoJCSAgICAgIGNoYXIgKmZvcm1hdCwgLi4uKQp7Cgl2YV9saXN0IGFyZ3M7CglpbnQgbGVuOwoKCURCR0lORigiYnVmZmVyID0gMHglcCA6ICpidWZmZXIgPSAweCVwLlxuIiwgYnVmZmVyLCAqYnVmZmVyKTsKCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CglsZW4gPSB2c25wcmludGYoKmJ1ZmZlciwgKmJ1ZmZlcl9yZW1haW5pbmcsIGZvcm1hdCwgYXJncyk7CglpZiAobGVuID49ICpidWZmZXJfcmVtYWluaW5nKSB7CgkJKmJ1ZmZlciArPSAqYnVmZmVyX3JlbWFpbmluZzsKCQkqdG90YWwgKz0gKmJ1ZmZlcl9yZW1haW5pbmc7CgkJKmJ1ZmZlcl9yZW1haW5pbmcgPSAwOwoJCUxPR0VSUigiYnl0ZXMgcmVtYWluaW5nIGlzIHRvbyBzbWFsbCFcbiIpOwoJCXJldHVybiAtMTsKCX0KCSpidWZmZXJfcmVtYWluaW5nIC09IGxlbjsKCSpidWZmZXIgKz0gbGVuOwoJKnRvdGFsICs9IGxlbjsKCXJldHVybiBsZW47Cn0KRVhQT1JUX1NZTUJPTF9HUEwodWlzdXRpbF9hZGRfcHJvY19saW5lX2V4KTsKCmludAp1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyKGludCB0eXBlLCB2b2lkICpmcHRyLAoJCQkgICAgIFVMVFJBX1ZCVVNfREVWSUNFSU5GTyAqY2hpcHNldF9Ecml2ZXJJbmZvKQp7CglMT0dJTkYoInR5cGUgPSAlZCwgZnB0ciA9IDB4JXAuXG4iLCB0eXBlLCBmcHRyKTsKCglzd2l0Y2ggKHR5cGUpIHsKCWNhc2UgMjoKCQlpZiAoZnB0cikgewoJCQlpZiAoIVZpcnRDb250cm9sQ2hhbkZ1bmMpCgkJCQlhdG9taWNfaW5jKCZVaXNVdGlsc19SZWdpc3RlcmVkX1NlcnZpY2VzKTsKCQkJVmlydENvbnRyb2xDaGFuRnVuYyA9IGZwdHI7CgkJfSBlbHNlIHsKCQkJaWYgKFZpcnRDb250cm9sQ2hhbkZ1bmMpCgkJCQlhdG9taWNfZGVjKCZVaXNVdGlsc19SZWdpc3RlcmVkX1NlcnZpY2VzKTsKCQkJVmlydENvbnRyb2xDaGFuRnVuYyA9IE5VTEw7CgkJfQoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJTE9HRVJSKCJpbnZhbGlkIHR5cGUgJWQuXG4iLCB0eXBlKTsKCQlyZXR1cm4gMDsKCX0KCWlmIChjaGlwc2V0X0RyaXZlckluZm8pCgkJQnVzRGV2aWNlSW5mb19Jbml0KGNoaXBzZXRfRHJpdmVySW5mbywKCQkJCSAgICJjaGlwc2V0IiwgInVpc2xpYiIsCgkJCQkgICBWRVJTSU9OLCBOVUxMLCBfX0RBVEVfXywgX19USU1FX18pOwoKCXJldHVybiAxOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXIpOwoKaW50CnVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgoR1VJRCBzd2l0Y2hUeXBlR3VpZCwKCQkJCWNvbnN0IGNoYXIgKnN3aXRjaF90eXBlX25hbWUsCgkJCQlpbnQgKCpjb250cm9sZnVuYykoc3RydWN0IGlvX21zZ3MgKiksCgkJCQl1bnNpZ25lZCBsb25nIG1pbl9jaGFubmVsX2J5dGVzLAoJCQkJaW50ICgqU2VydmVyX0NoYW5uZWxfT2spKHVuc2lnbmVkIGxvbmcKCQkJCQkJCSAgY2hhbm5lbEJ5dGVzKSwKCQkJCWludCAoKlNlcnZlcl9DaGFubmVsX0luaXQpCgkJCQkgKHZvaWQgKngsIHVuc2lnbmVkIGNoYXIgKmNsaWVudFN0ciwKCQkJCSAgVTMyIGNsaWVudFN0ckxlbiwgVTY0IGJ5dGVzKSwKCQkJCVVMVFJBX1ZCVVNfREVWSUNFSU5GTyAqY2hpcHNldF9Ecml2ZXJJbmZvKQp7CgljaGFyIHNbOTldOwoJUmVxSGFuZGxlckluZm9fdCAqcFJlcUhhbmRsZXJJbmZvOwoJaW50IHJjID0gMDsJCS8qIGFzc3VtZSBmYWlsdXJlICovCglMT0dJTkYoInR5cGU9JXMsIGNvbnRyb2xmdW5jPTB4JXAuXG4iLAoJICAgICAgIEdVSURfZm9ybWF0MSgmc3dpdGNoVHlwZUd1aWQsIHMpLCBjb250cm9sZnVuYyk7CglpZiAoIWNvbnRyb2xmdW5jKSB7CgkJTE9HRVJSKCIlczogY29udHJvbGZ1bmMgbXVzdCBiZSBzdXBwbGllZFxuIiwKCQkgICAgICAgR1VJRF9mb3JtYXQxKCZzd2l0Y2hUeXBlR3VpZCwgcykpOwoJCWdvdG8gQXdheTsKCX0KCWlmICghU2VydmVyX0NoYW5uZWxfT2spIHsKCQlMT0dFUlIoIiVzOiBTZXJ2ZXJfQ2hhbm5lbF9PayBtdXN0IGJlIHN1cHBsaWVkXG4iLAoJCSAgICAgICBHVUlEX2Zvcm1hdDEoJnN3aXRjaFR5cGVHdWlkLCBzKSk7CgkJZ290byBBd2F5OwoJfQoJaWYgKCFTZXJ2ZXJfQ2hhbm5lbF9Jbml0KSB7CgkJTE9HRVJSKCIlczogU2VydmVyX0NoYW5uZWxfSW5pdCBtdXN0IGJlIHN1cHBsaWVkXG4iLAoJCSAgICAgICBHVUlEX2Zvcm1hdDEoJnN3aXRjaFR5cGVHdWlkLCBzKSk7CgkJZ290byBBd2F5OwoJfQoJcFJlcUhhbmRsZXJJbmZvID0gUmVxSGFuZGxlckFkZChzd2l0Y2hUeXBlR3VpZCwKCQkJCQlzd2l0Y2hfdHlwZV9uYW1lLAoJCQkJCWNvbnRyb2xmdW5jLAoJCQkJCW1pbl9jaGFubmVsX2J5dGVzLAoJCQkJCVNlcnZlcl9DaGFubmVsX09rLCBTZXJ2ZXJfQ2hhbm5lbF9Jbml0KTsKCWlmICghcFJlcUhhbmRsZXJJbmZvKSB7CgkJTE9HRVJSKCJmYWlsZWQgdG8gYWRkICVzIHRvIHNlcnZlciBsaXN0XG4iLAoJCSAgICAgICBHVUlEX2Zvcm1hdDEoJnN3aXRjaFR5cGVHdWlkLCBzKSk7CgkJZ290byBBd2F5OwoJfQoKCWF0b21pY19pbmMoJlVpc1V0aWxzX1JlZ2lzdGVyZWRfU2VydmljZXMpOwoJcmMgPSAxOwkJCS8qIHN1Y2Nlc3MgKi8KQXdheToKCWlmIChyYykgewoJCWlmIChjaGlwc2V0X0RyaXZlckluZm8pCgkJCUJ1c0RldmljZUluZm9fSW5pdChjaGlwc2V0X0RyaXZlckluZm8sCgkJCQkJICAgImNoaXBzZXQiLCAidWlzbGliIiwKCQkJCQkgICBWRVJTSU9OLCBOVUxMLAoJCQkJCSAgIF9fREFURV9fLCBfX1RJTUVfXyk7Cgl9IGVsc2UKCQlMT0dFUlIoImZhaWxlZCB0byByZWdpc3RlciB0eXBlICVzLlxuIiwKCQkgICAgICAgR1VJRF9mb3JtYXQxKCZzd2l0Y2hUeXBlR3VpZCwgcykpOwoKCXJldHVybiByYzsKfQpFWFBPUlRfU1lNQk9MX0dQTCh1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KTsKCmludAp1aXNjdHJsX3VucmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgoR1VJRCBzd2l0Y2hUeXBlR3VpZCkKewoJY2hhciBzWzk5XTsKCWludCByYyA9IDA7CQkvKiBhc3N1bWUgZmFpbHVyZSAqLwoJTE9HSU5GKCJ0eXBlPSVzLlxuIiwgR1VJRF9mb3JtYXQxKCZzd2l0Y2hUeXBlR3VpZCwgcykpOwoJaWYgKFJlcUhhbmRsZXJEZWwoc3dpdGNoVHlwZUd1aWQpIDwgMCkgewoJCUxPR0VSUigiZmFpbGVkIHRvIHJlbW92ZSAlcyBmcm9tIHNlcnZlciBsaXN0XG4iLAoJCSAgICAgICBHVUlEX2Zvcm1hdDEoJnN3aXRjaFR5cGVHdWlkLCBzKSk7CgkJZ290byBBd2F5OwoJfQoJYXRvbWljX2RlYygmVWlzVXRpbHNfUmVnaXN0ZXJlZF9TZXJ2aWNlcyk7CglyYyA9IDE7CQkJLyogc3VjY2VzcyAqLwpBd2F5OgoJaWYgKCFyYykKCQlMT0dFUlIoImZhaWxlZCB0byB1bnJlZ2lzdGVyIHR5cGUgJXMuXG4iLAoJCSAgICAgICBHVUlEX2Zvcm1hdDEoJnN3aXRjaFR5cGVHdWlkLCBzKSk7CglyZXR1cm4gcmM7Cn0KRVhQT1JUX1NZTUJPTF9HUEwodWlzY3RybF91bnJlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KTsKCi8qCiAqIHVuc2lnbmVkIGludCB1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKHVuc2lnbmVkIGNoYXIgKmNhbGxpbmdfY3R4LAogKgkJCQkJICAgICB2b2lkICpza2JfaW4sCiAqCQkJCQkgICAgIHVuc2lnbmVkIGludCBmaXJzdGZyYWdsZW4sCiAqCQkJCQkgICAgIHVuc2lnbmVkIGludCBmcmFnc19tYXgsCiAqCQkJCQkgICAgIHN0cnVjdCBwaHlzX2luZm8gZnJhZ3NbXSkKICoKICoJY2FsbGluZ19jdHggLSBpbnB1dCAtICAgYSBzdHJpbmcgdGhhdCBpcyBkaXNwbGF5ZWQgdG8gc2hvdwogKgkJCQl3aG8gY2FsbGVkICogdGhpcyBmdW5jCiAqCXZvaWQgKnNrYl9pbiAtICBza2Igd2hvc2UgZnJhZyBpbmZvIHdlJ3JlIGNvcHlpbmcgdHlwZSBpcyBoaWRkZW4gc28gd2UKICoJCQlkb24ndCBuZWVkIHRvIGluY2x1ZGUgc2tiYnVmZiBpbiB1aXN1dGlscy5oIHdoaWNoIGlzCiAqCQkJaW5jbHVkZWQgaW4gbm9uLW5ldHdvcmtpbmcgY29kZS4KICoJdW5zaWduZWQgaW50IGZpcnN0ZnJhZ2xlbiAtIGlucHV0IC0gbGVuZ3RoIG9mIGZpcnN0IGZyYWdtZW50IGluIHNrYgogKgl1bnNpZ25lZCBpbnQgZnJhZ3NfbWF4IC0gaW5wdXQgLSBtYXggbGVuIG9mIGZyYWdzIGFycmF5CiAqCXN0cnVjdCBwaHlzX2luZm8gZnJhZ3NbXSAtIG91dHB1dCAtIGZyYWdzIGFycmF5IGZpbGxlZCBpbiBvbiBvdXRwdXQKICoJCQkJCSAgICByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIG51bWJlciBvZgogKgkJCQkJICAgIGVudHJpZXMgZmlsbGVkIGluIGZyYWdzCiAqLwp1bnNpZ25lZCBpbnQKdWlzdXRpbF9jb3B5X2ZyYWdzaW5mb19mcm9tX3NrYih1bnNpZ25lZCBjaGFyICpjYWxsaW5nX2N0eCwgdm9pZCAqc2tiX2luLAoJCQkJdW5zaWduZWQgaW50IGZpcnN0ZnJhZ2xlbiwKCQkJCXVuc2lnbmVkIGludCBmcmFnc19tYXgsCgkJCQlzdHJ1Y3QgcGh5c19pbmZvIGZyYWdzW10pCnsKCXVuc2lnbmVkIGludCBjb3VudCA9IDAsIGlpLCBzaXplLCBvZmZzZXQgPSAwLCBudW1mcmFnczsKCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfaW47CgoJbnVtZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOwoKCXdoaWxlIChmaXJzdGZyYWdsZW4pIHsKCQlpZiAoY291bnQgPT0gZnJhZ3NfbWF4KSB7CgkJCUxPR0VSUigiJXMgZnJhZ3MgYXJyYXkgdG9vIHNtYWxsOiBtYXg6JWQgY291bnQ6JWRcbiIsCgkJCSAgICAgICBjYWxsaW5nX2N0eCwgZnJhZ3NfbWF4LCBjb3VudCk7CgkJCXJldHVybiAtMTsJLyogZmFpbHVyZSAqLwoJCX0KCQlmcmFnc1tjb3VudF0ucGlfcGZuID0KCQkgICAgcGFnZV90b19wZm4odmlydF90b19wYWdlKHNrYi0+ZGF0YSArIG9mZnNldCkpOwoJCWZyYWdzW2NvdW50XS5waV9vZmYgPQoJCSAgICAodW5zaWduZWQgbG9uZykgKHNrYi0+ZGF0YSArIG9mZnNldCkgJiBQSV9QQUdFX01BU0s7CgkJc2l6ZSA9CgkJICAgIG1pbihmaXJzdGZyYWdsZW4sCgkJCSh1bnNpZ25lZCBpbnQpIChQSV9QQUdFX1NJWkUgLSBmcmFnc1tjb3VudF0ucGlfb2ZmKSk7CgkJLyogY2FuIHRha2Ugc21hbGxlc3Qgb2YgZmlyc3RmcmFnbGVuKHdoYXQncyBsZWZ0KSBPUgoJCSogYnl0ZXMgbGVmdCBpbiB0aGUgcGFnZQoJCSovCgkJZnJhZ3NbY291bnRdLnBpX2xlbiA9IHNpemU7CgkJZmlyc3RmcmFnbGVuIC09IHNpemU7CgkJb2Zmc2V0ICs9IHNpemU7CgkJY291bnQrKzsKCX0KCWlmIChudW1mcmFncykgewoJCWlmICgoY291bnQgKyBudW1mcmFncykgPiBmcmFnc19tYXgpIHsKCQkJTE9HRVJSKCIqKioqIEZBSUxFRCAlcyBmcmFncyBhcnJheSB0b28gc21hbGw6IG1heDolZCBjb3VudCtucl9mcmFnczolZFxuIiwKCQkJICAgICBjYWxsaW5nX2N0eCwgZnJhZ3NfbWF4LCBjb3VudCArIG51bWZyYWdzKTsKCQkJcmV0dXJuIC0xOwkvKiBmYWlsdXJlICovCgkJfQoKCQlmb3IgKGlpID0gMDsgaWkgPCBudW1mcmFnczsgaWkrKykgewoJCQljb3VudCA9IGFkZF9waHlzaW5mb19lbnRyaWVzKHBhZ2VfdG9fcGZuKHNrYl9mcmFnX3BhZ2UoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaWldKSksCS8qIHBmbiAqLwoJCQkJCQkgICAgIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaWldLgoJCQkJCQkgICAgIHBhZ2Vfb2Zmc2V0LAoJCQkJCQkgICAgIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaWldLgoJCQkJCQkgICAgIHNpemUsIGNvdW50LCBmcmFnc19tYXgsCgkJCQkJCSAgICAgZnJhZ3MpOwoJCQlpZiAoY291bnQgPT0gMCkgewoJCQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBhZGQgcGh5c2luZm8gZW50cmllc1xuIik7CgkJCQlyZXR1cm4gLTE7CS8qIGZhaWx1cmUgKi8KCQkJfQoJCX0KCX0KCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgewoJCXN0cnVjdCBza19idWZmICpza2Jpbmxpc3Q7CgkJaW50IGM7CgkJZm9yIChza2Jpbmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsgc2tiaW5saXN0OwoJCSAgICAgc2tiaW5saXN0ID0gc2tiaW5saXN0LT5uZXh0KSB7CgoJCQljID0gdWlzdXRpbF9jb3B5X2ZyYWdzaW5mb19mcm9tX3NrYigicmVjdXJzaXZlIiwKCQkJCQkJCSAgICBza2Jpbmxpc3QsCgkJCQkJCQkgICAgc2tiaW5saXN0LT5sZW4gLQoJCQkJCQkJICAgIHNrYmlubGlzdC0+ZGF0YV9sZW4sCgkJCQkJCQkgICAgZnJhZ3NfbWF4IC0gY291bnQsCgkJCQkJCQkgICAgJmZyYWdzW2NvdW50XSk7CgkJCWlmIChjID09IC0xKSB7CgkJCQlMT0dFUlIoIioqKiogRkFJTEVEIHJlY3Vyc2l2ZSBjYWxsIGZhaWxlZFxuIik7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCQkJY291bnQgKz0gYzsKCQl9Cgl9CglyZXR1cm4gY291bnQ7Cn0KRVhQT1JUX1NZTUJPTF9HUEwodWlzdXRpbF9jb3B5X2ZyYWdzaW5mb19mcm9tX3NrYik7CgpzdGF0aWMgTElTVF9IRUFEKFJlcUhhbmRsZXJJbmZvX2xpc3QpOwkvKiBsaXN0IG9mIFJlcUhhbmRsZXJJbmZvX3QgKi8Kc3RhdGljIERFRklORV9TUElOTE9DSyhSZXFIYW5kbGVySW5mb19saXN0X2xvY2spOwoKUmVxSGFuZGxlckluZm9fdCAqClJlcUhhbmRsZXJBZGQoR1VJRCBzd2l0Y2hUeXBlR3VpZCwKCSAgICAgIGNvbnN0IGNoYXIgKnN3aXRjaF90eXBlX25hbWUsCgkgICAgICBpbnQgKCpjb250cm9sZnVuYykoc3RydWN0IGlvX21zZ3MgKiksCgkgICAgICB1bnNpZ25lZCBsb25nIG1pbl9jaGFubmVsX2J5dGVzLAoJICAgICAgaW50ICgqU2VydmVyX0NoYW5uZWxfT2spKHVuc2lnbmVkIGxvbmcgY2hhbm5lbEJ5dGVzKSwKCSAgICAgIGludCAoKlNlcnZlcl9DaGFubmVsX0luaXQpCgkgICAgICAgKHZvaWQgKngsIHVuc2lnbmVkIGNoYXIgKmNsaWVudFN0ciwgVTMyIGNsaWVudFN0ckxlbiwgVTY0IGJ5dGVzKSkKewoJUmVxSGFuZGxlckluZm9fdCAqcmMgPSBOVUxMOwoKCXJjID0ga3phbGxvYyhzaXplb2YoKnJjKSwgR0ZQX0FUT01JQyk7CglpZiAoIXJjKQoJCXJldHVybiBOVUxMOwoJcmMtPnN3aXRjaFR5cGVHdWlkID0gc3dpdGNoVHlwZUd1aWQ7CglyYy0+Y29udHJvbGZ1bmMgPSBjb250cm9sZnVuYzsKCXJjLT5taW5fY2hhbm5lbF9ieXRlcyA9IG1pbl9jaGFubmVsX2J5dGVzOwoJcmMtPlNlcnZlcl9DaGFubmVsX09rID0gU2VydmVyX0NoYW5uZWxfT2s7CglyYy0+U2VydmVyX0NoYW5uZWxfSW5pdCA9IFNlcnZlcl9DaGFubmVsX0luaXQ7CglpZiAoc3dpdGNoX3R5cGVfbmFtZSkKCQlzdHJuY3B5KHJjLT5zd2l0Y2hfdHlwZV9uYW1lLCBzd2l0Y2hfdHlwZV9uYW1lLAoJCQlzaXplb2YocmMtPnN3aXRjaF90eXBlX25hbWUpIC0gMSk7CglzcGluX2xvY2soJlJlcUhhbmRsZXJJbmZvX2xpc3RfbG9jayk7CglsaXN0X2FkZF90YWlsKCYocmMtPmxpc3RfbGluayksICZSZXFIYW5kbGVySW5mb19saXN0KTsKCXNwaW5fdW5sb2NrKCZSZXFIYW5kbGVySW5mb19saXN0X2xvY2spOwoKCXJldHVybiByYzsKfQoKUmVxSGFuZGxlckluZm9fdCAqClJlcUhhbmRsZXJGaW5kKEdVSUQgc3dpdGNoVHlwZUd1aWQpCnsKCXN0cnVjdCBsaXN0X2hlYWQgKmxlbHQsICp0bXA7CglSZXFIYW5kbGVySW5mb190ICplbnRyeSA9IE5VTEw7CglzcGluX2xvY2soJlJlcUhhbmRsZXJJbmZvX2xpc3RfbG9jayk7CglsaXN0X2Zvcl9lYWNoX3NhZmUobGVsdCwgdG1wLCAmUmVxSGFuZGxlckluZm9fbGlzdCkgewoJCWVudHJ5ID0gbGlzdF9lbnRyeShsZWx0LCBSZXFIYW5kbGVySW5mb190LCBsaXN0X2xpbmspOwoJCWlmIChtZW1jbXAKCQkgICAgKCZlbnRyeS0+c3dpdGNoVHlwZUd1aWQsICZzd2l0Y2hUeXBlR3VpZCwKCQkgICAgIHNpemVvZihHVUlEKSkgPT0gMCkgewoJCQlzcGluX3VubG9jaygmUmVxSGFuZGxlckluZm9fbGlzdF9sb2NrKTsKCQkJcmV0dXJuIGVudHJ5OwoJCX0KCX0KCXNwaW5fdW5sb2NrKCZSZXFIYW5kbGVySW5mb19saXN0X2xvY2spOwoJcmV0dXJuIE5VTEw7Cn0KCmludApSZXFIYW5kbGVyRGVsKEdVSUQgc3dpdGNoVHlwZUd1aWQpCnsKCXN0cnVjdCBsaXN0X2hlYWQgKmxlbHQsICp0bXA7CglSZXFIYW5kbGVySW5mb190ICplbnRyeSA9IE5VTEw7CglpbnQgcmMgPSAtMTsKCXNwaW5fbG9jaygmUmVxSGFuZGxlckluZm9fbGlzdF9sb2NrKTsKCWxpc3RfZm9yX2VhY2hfc2FmZShsZWx0LCB0bXAsICZSZXFIYW5kbGVySW5mb19saXN0KSB7CgkJZW50cnkgPSBsaXN0X2VudHJ5KGxlbHQsIFJlcUhhbmRsZXJJbmZvX3QsIGxpc3RfbGluayk7CgkJaWYgKG1lbWNtcAoJCSAgICAoJmVudHJ5LT5zd2l0Y2hUeXBlR3VpZCwgJnN3aXRjaFR5cGVHdWlkLAoJCSAgICAgc2l6ZW9mKEdVSUQpKSA9PSAwKSB7CgkJCWxpc3RfZGVsKGxlbHQpOwoJCQlrZnJlZShlbnRyeSk7CgkJCXJjKys7CgkJfQoJfQoJc3Bpbl91bmxvY2soJlJlcUhhbmRsZXJJbmZvX2xpc3RfbG9jayk7CglyZXR1cm4gcmM7Cn0K