LyoKICogU05NUHYzIFZpZXctYmFzZWQgQWNjZXNzIENvbnRyb2wgTW9kZWwKICovCi8qIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodChzKS4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgY29weXJpZ2h0ZWQgYnk6CiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgoKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmIEhBVkVfTUFMTE9DX0gKI2luY2x1ZGUgPG1hbGxvYy5oPgojZW5kaWYKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9BUlBBX0lORVRfSAojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfTkVUREJfSAojaW5jbHVkZSA8bmV0ZGIuaD4KI2VuZGlmCiNpZiBIQVZFX1dJTlNPQ0tfSAojaW5jbHVkZSA8d2luc29jay5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hZ2VudF9jYWxsYmFja3MuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L3N5c09SVGFibGUuaD4KI2luY2x1ZGUgInZhY21fdmFycy5oIgojaW5jbHVkZSAidXRpbF9mdW5jcy9oZWFkZXJfZ2VuZXJpYy5oIgoKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGlmZGVmIFdJTjMyCiMgIGluY2x1ZGUgPHN5cy90aW1lYi5oPgojIGVsc2UKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbmRpZgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKCnN0YXRpYyB1bnNpZ25lZCBpbnQgdmFjbVZpZXdTcGluTG9jayA9IDA7Cgp2b2lkCmluaXRfdmFjbV92YXJzKHZvaWQpCnsKCiAgICBvaWQgICAgICByZWdbXSA9IHsgU05NUF9PSURfU05NUE1PRFVMRVMsIDE2LCAyLCAyLCAxIH07CgojZGVmaW5lIFBSSVZSVwkoTkVUU05NUF9TTk1QVjJBTlkgfCAweDUwMDApCgogICAgc3RydWN0IHZhcmlhYmxlMSB2YWNtX3NlYzJncm91cFtdID0gewogICAgICAgIHtTRUNVUklUWUdST1VQLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgICAgIHZhcl92YWNtX3NlYzJncm91cCwgMSwgezN9fSwKICAgICAgICB7U0VDVVJJVFlTVE9SQUdFLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgICAgICB2YXJfdmFjbV9zZWMyZ3JvdXAsIDEsIHs0fX0sCiAgICAgICAge1NFQ1VSSVRZU1RBVFVTLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgICAgICB2YXJfdmFjbV9zZWMyZ3JvdXAsIDEsIHs1fX0sCiAgICB9OwoKICAgIHN0cnVjdCB2YXJpYWJsZTEgdmFjbV9hY2Nlc3NbXSA9IHsKICAgICAgICB7QUNDRVNTTUFUQ0gsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgICAgIHZhcl92YWNtX2FjY2VzcywgMSwgezR9fSwKICAgICAgICB7QUNDRVNTUkVBRCwgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgICAgICB2YXJfdmFjbV9hY2Nlc3MsIDEsIHs1fX0sCiAgICAgICAge0FDQ0VTU1dSSVRFLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgICAgIHZhcl92YWNtX2FjY2VzcywgMSwgezZ9fSwKICAgICAgICB7QUNDRVNTTk9USUZZLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgICAgIHZhcl92YWNtX2FjY2VzcywgMSwgezd9fSwKICAgICAgICB7QUNDRVNTU1RPUkFHRSwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICAgICAgdmFyX3ZhY21fYWNjZXNzLCAxLCB7OH19LAogICAgICAgIHtBQ0NFU1NTVEFUVVMsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgICAgIHZhcl92YWNtX2FjY2VzcywgMSwgezl9fSwKICAgIH07CgogICAgc3RydWN0IHZhcmlhYmxlMyB2YWNtX3ZpZXdbXSA9IHsKICAgICAgICB7VkFDTVZJRVdTUElOTE9DSywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICAgICAgdmFyX3ZhY21fdmlldywgMSwgezF9fSwKICAgICAgICB7VklFV01BU0ssIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICAgICAgdmFyX3ZhY21fdmlldywgMywgezIsIDEsIDN9fSwKICAgICAgICB7VklFV1RZUEUsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgICAgIHZhcl92YWNtX3ZpZXcsIDMsIHsyLCAxLCA0fX0sCiAgICAgICAge1ZJRVdTVE9SQUdFLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgICAgICB2YXJfdmFjbV92aWV3LCAzLCB7MiwgMSwgNX19LAogICAgICAgIHtWSUVXU1RBVFVTLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgICAgICB2YXJfdmFjbV92aWV3LCAzLCB7MiwgMSwgNn19LAogICAgfTsKCiAgICAvKgogICAgICogRGVmaW5lIHRoZSBPSUQgcG9pbnRlciB0byB0aGUgdG9wIG9mIHRoZSBtaWIgdHJlZSB0aGF0IHdlJ3JlCiAgICAgKiByZWdpc3RlcmluZyB1bmRlcm5lYXRoIAogICAgICovCiAgICBvaWQgICAgICAgICAgICAgdmFjbV9zZWMyZ3JvdXBfb2lkW10gPSB7IE9JRF9WQUNNR1JPVVBFTlRSWSB9OwogICAgb2lkICAgICAgICAgICAgIHZhY21fYWNjZXNzX29pZFtdID0geyBPSURfVkFDTUFDQ0VTU0VOVFJZIH07CiAgICBvaWQgICAgICAgICAgICAgdmFjbV92aWV3X29pZFtdID0geyBPSURfVkFDTU1JQlZJRVdTIH07CgogICAgLyoKICAgICAqIHdlIG5lZWQgdG8gYmUgY2FsbGVkIGJhY2sgbGF0ZXIgCiAgICAgKi8KICAgIHNubXBfcmVnaXN0ZXJfY2FsbGJhY2soU05NUF9DQUxMQkFDS19MSUJSQVJZLCBTTk1QX0NBTExCQUNLX1NUT1JFX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlX3ZhY20sIE5VTEwpOwoKICAgIC8qCiAgICAgKiByZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCB0aGUgYWdlbnQgdG8gaGFuZGxlIG91ciBtaWIgdHJlZSAKICAgICAqLwogICAgUkVHSVNURVJfTUlCKCJtaWJJSS92YWNtOnNlYzJncm91cCIsIHZhY21fc2VjMmdyb3VwLCB2YXJpYWJsZTEsCiAgICAgICAgICAgICAgICAgdmFjbV9zZWMyZ3JvdXBfb2lkKTsKICAgIFJFR0lTVEVSX01JQigibWliSUkvdmFjbTphY2Nlc3MiLCB2YWNtX2FjY2VzcywgdmFyaWFibGUxLAogICAgICAgICAgICAgICAgIHZhY21fYWNjZXNzX29pZCk7CiAgICBSRUdJU1RFUl9NSUIoIm1pYklJL3ZhY206dmlldyIsIHZhY21fdmlldywgdmFyaWFibGUzLCB2YWNtX3ZpZXdfb2lkKTsKCiAgICBSRUdJU1RFUl9TWVNPUl9FTlRSWShyZWcsICJWaWV3LWJhc2VkIEFjY2VzcyBDb250cm9sIE1vZGVsIGZvciBTTk1QLiIpOwp9CgoKCnVfY2hhciAgICAgICAgICoKdmFyX3ZhY21fc2VjMmdyb3VwKHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICAgIGludCBleGFjdCwKICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgc3RydWN0IHZhY21fZ3JvdXBFbnRyeSAqZ3A7CiAgICBvaWQgICAgICAgICAgICAqZ3JvdXBTdWJ0cmVlOwogICAgaW50ICAgICAgICAgICAgIGdyb3VwU3VidHJlZUxlbjsKICAgIGludCAgICAgICAgICAgICBzZWNtb2RlbDsKICAgIGNoYXIgICAgICAgICAgICBzZWNuYW1lW1ZBQ01TVFJJTkdMRU5dLCAqY3A7CgogICAgLyoKICAgICAqIFNldCB1cCB3cml0ZV9tZXRob2QgZmlyc3QsIGluIGNhc2Ugd2UgcmV0dXJuIE5VTEwgYmVmb3JlIGdldHRpbmcgdG8KICAgICAqIHRoZSBzd2l0Y2ggKHZwLT5tYWdpYykgYmVsb3cuICBJbiBzb21lIG9mIHRoZXNlIGNhc2VzLCB3ZSBzdGlsbCB3YW50CiAgICAgKiB0byBjYWxsIHRoZSBhcHByb3ByaWF0ZSB3cml0ZV9tZXRob2QsIGlmIG9ubHkgdG8gaGF2ZSBpdCByZXR1cm4gdGhlCiAgICAgKiBhcHByb3ByaWF0ZSBlcnJvci4gIAogICAgICovCgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgU0VDVVJJVFlHUk9VUDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdmFjbUdyb3VwTmFtZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgU0VDVVJJVFlTVE9SQUdFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV92YWNtU2VjdXJpdHlUb0dyb3VwU3RvcmFnZVR5cGU7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFNFQ1VSSVRZU1RBVFVTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV92YWNtU2VjdXJpdHlUb0dyb3VwU3RhdHVzOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gTlVMTDsKICAgIH0KCiAgICBpZiAobWVtY21wKG5hbWUsIHZwLT5uYW1lLCBzaXplb2Yob2lkKSAqIHZwLT5uYW1lbGVuKSAhPSAwKSB7CiAgICAgICAgbWVtY3B5KG5hbWUsIHZwLT5uYW1lLCBzaXplb2Yob2lkKSAqIHZwLT5uYW1lbGVuKTsKICAgICAgICAqbGVuZ3RoID0gdnAtPm5hbWVsZW47CiAgICB9CiAgICBpZiAoZXhhY3QpIHsKICAgICAgICBpZiAoKmxlbmd0aCA8IDEzKQogICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgc2VjbW9kZWwgPSBuYW1lWzExXTsKICAgICAgICBncm91cFN1YnRyZWUgPSBuYW1lICsgMTM7CiAgICAgICAgZ3JvdXBTdWJ0cmVlTGVuID0gKmxlbmd0aCAtIDEzOwogICAgICAgIGlmICggbmFtZVsxMl0gIT0gZ3JvdXBTdWJ0cmVlTGVuICkKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CS8qIEVpdGhlciBleHRyYSBzdWJpZHMsIG9yIGFuIGluY29tcGxldGUgc3RyaW5nICovCiAgICAgICAgY3AgPSBzZWNuYW1lOwogICAgICAgIHdoaWxlIChncm91cFN1YnRyZWVMZW4tLSA+IDApIHsKICAgICAgICAgICAgaWYgKCpncm91cFN1YnRyZWUgPiAyNTUpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgLyogaWxsZWdhbCB2YWx1ZSAqLwogICAgICAgICAgICBpZiAoY3AgLSBzZWNuYW1lID4gVkFDTV9NQVhfU1RSSU5HKQogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICpjcCsrID0gKGNoYXIpICpncm91cFN1YnRyZWUrKzsKICAgICAgICB9CiAgICAgICAgKmNwID0gMDsKCiAgICAgICAgZ3AgPSB2YWNtX2dldEdyb3VwRW50cnkoc2VjbW9kZWwsIHNlY25hbWUpOwogICAgfSBlbHNlIHsKICAgICAgICBzZWNtb2RlbCA9ICpsZW5ndGggPiAxMSA/IG5hbWVbMTFdIDogMDsKICAgICAgICBncm91cFN1YnRyZWUgPSBuYW1lICsgMTI7CiAgICAgICAgZ3JvdXBTdWJ0cmVlTGVuID0gKmxlbmd0aCAtIDEyOwogICAgICAgIGNwID0gc2VjbmFtZTsKICAgICAgICB3aGlsZSAoZ3JvdXBTdWJ0cmVlTGVuLS0gPiAwKSB7CiAgICAgICAgICAgIGlmICgqZ3JvdXBTdWJ0cmVlID4gMjU1KQogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgIC8qIGlsbGVnYWwgdmFsdWUgKi8KICAgICAgICAgICAgaWYgKGNwIC0gc2VjbmFtZSA+IFZBQ01fTUFYX1NUUklORykKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAqY3ArKyA9IChjaGFyKSAqZ3JvdXBTdWJ0cmVlKys7CiAgICAgICAgfQogICAgICAgICpjcCA9IDA7CiAgICAgICAgdmFjbV9zY2FuR3JvdXBJbml0KCk7CiAgICAgICAgd2hpbGUgKChncCA9IHZhY21fc2Nhbkdyb3VwTmV4dCgpKSAhPSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChncC0+c2VjdXJpdHlNb2RlbCA+IHNlY21vZGVsIHx8CiAgICAgICAgICAgICAgICAoZ3AtPnNlY3VyaXR5TW9kZWwgPT0gc2VjbW9kZWwKICAgICAgICAgICAgICAgICAmJiBzdHJjbXAoZ3AtPnNlY3VyaXR5TmFtZSwgc2VjbmFtZSkgPiAwKSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoZ3ApIHsKICAgICAgICAgICAgbmFtZVsxMV0gPSBncC0+c2VjdXJpdHlNb2RlbDsKICAgICAgICAgICAgKmxlbmd0aCA9IDEyOwogICAgICAgICAgICBjcCA9IGdwLT5zZWN1cml0eU5hbWU7CiAgICAgICAgICAgIHdoaWxlICgqY3ApIHsKICAgICAgICAgICAgICAgIG5hbWVbKCpsZW5ndGgpKytdID0gKmNwKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKGdwID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nX3JldHVybik7CiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBTRUNVUklUWU1PREVMOgogICAgICAgIGxvbmdfcmV0dXJuID0gZ3AtPnNlY3VyaXR5TW9kZWw7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKCiAgICBjYXNlIFNFQ1VSSVRZTkFNRToKICAgICAgICAqdmFyX2xlbiA9IGdwLT5zZWN1cml0eU5hbWVbMF07CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBncC0+c2VjdXJpdHlOYW1lWzFdOwoKICAgIGNhc2UgU0VDVVJJVFlHUk9VUDoKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihncC0+Z3JvdXBOYW1lKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBncC0+Z3JvdXBOYW1lOwoKICAgIGNhc2UgU0VDVVJJVFlTVE9SQUdFOgogICAgICAgIGxvbmdfcmV0dXJuID0gZ3AtPnN0b3JhZ2VUeXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBTRUNVUklUWVNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGdwLT5zdGF0dXM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKCiAgICBkZWZhdWx0OgogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCnVfY2hhciAgICAgICAgICoKdmFyX3ZhY21fYWNjZXNzKHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqZ3A7CiAgICBpbnQgICAgICAgICAgICAgc2VjbW9kZWwsIHNlY2xldmVsOwogICAgY2hhciAgICAgICAgICAgIGdyb3VwTmFtZVtWQUNNU1RSSU5HTEVOXSA9IHsgMCB9OwogICAgY2hhciAgICAgICAgICAgIGNvbnRleHRQcmVmaXhbVkFDTVNUUklOR0xFTl0gPSB7IDAgfTsKICAgIG9pZCAgICAgICAgICAgICpvcDsKICAgIHVuc2lnbmVkIGxvbmcgICBsZW4sIGkgPSAwOwogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgaW50ICAgICAgICAgICAgIGNtcDsKCiAgICAvKgogICAgICogU2V0IHVwIHdyaXRlX21ldGhvZCBmaXJzdCwgaW4gY2FzZSB3ZSByZXR1cm4gTlVMTCBiZWZvcmUgZ2V0dGluZyB0bwogICAgICogdGhlIHN3aXRjaCAodnAtPm1hZ2ljKSBiZWxvdy4gIEluIHNvbWUgb2YgdGhlc2UgY2FzZXMsIHdlIHN0aWxsIHdhbnQKICAgICAqIHRvIGNhbGwgdGhlIGFwcHJvcHJpYXRlIHdyaXRlX21ldGhvZCwgaWYgb25seSB0byBoYXZlIGl0IHJldHVybiB0aGUKICAgICAqIGFwcHJvcHJpYXRlIGVycm9yLiAgCiAgICAgKi8KCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBBQ0NFU1NNQVRDSDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdmFjbUFjY2Vzc0NvbnRleHRNYXRjaDsKICAgICAgICBicmVhazsKICAgIGNhc2UgQUNDRVNTUkVBRDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdmFjbUFjY2Vzc1JlYWRWaWV3TmFtZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgQUNDRVNTV1JJVEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3ZhY21BY2Nlc3NXcml0ZVZpZXdOYW1lOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBBQ0NFU1NOT1RJRlk6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3ZhY21BY2Nlc3NOb3RpZnlWaWV3TmFtZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgQUNDRVNTU1RPUkFHRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdmFjbUFjY2Vzc1N0b3JhZ2VUeXBlOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBBQ0NFU1NTVEFUVVM6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3ZhY21BY2Nlc3NTdGF0dXM7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgICp3cml0ZV9tZXRob2QgPSBOVUxMOwogICAgfQoKICAgIGlmIChtZW1jbXAobmFtZSwgdnAtPm5hbWUsIHNpemVvZihvaWQpICogdnAtPm5hbWVsZW4pICE9IDApIHsKICAgICAgICBtZW1jcHkobmFtZSwgdnAtPm5hbWUsIHNpemVvZihvaWQpICogdnAtPm5hbWVsZW4pOwogICAgICAgICpsZW5ndGggPSB2cC0+bmFtZWxlbjsKICAgIH0KCiAgICBpZiAoZXhhY3QpIHsKICAgICAgICBpZiAoKmxlbmd0aCA8IDE1KQogICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgLyoKICAgICAgICAgKiBFeHRyYWN0IHRoZSBncm91cCBuYW1lIGluZGV4IGZyb20gdGhlIHJlcXVlc3RlZCBPSUQgLi4uLgogICAgICAgICAqLwogICAgICAgIG9wID0gbmFtZSArIDExOwogICAgICAgIGxlbiA9ICpvcCsrOwogICAgICAgIGlmIChsZW4gPiBWQUNNX01BWF9TVFJJTkcpCiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIGNwID0gZ3JvdXBOYW1lOwogICAgICAgIHdoaWxlIChsZW4tLSA+IDApIHsKICAgICAgICAgICAgaWYgKCpvcCA+IDI1NSkKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAvKiBpbGxlZ2FsIHZhbHVlICovCiAgICAgICAgICAgICpjcCsrID0gKGNoYXIpICpvcCsrOwogICAgICAgIH0KICAgICAgICAqY3AgPSAwOwoKICAgICAgICAvKgogICAgICAgICAqIC4uLiBmb2xsb3dlZCBieSB0aGUgY29udGV4dCBpbmRleCAuLi4KICAgICAgICAgKi8KICAgICAgICBsZW4gPSAqb3ArKzsKICAgICAgICBpZiAobGVuID4gVkFDTV9NQVhfU1RSSU5HKQogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICBjcCA9IGNvbnRleHRQcmVmaXg7CiAgICAgICAgd2hpbGUgKGxlbi0tID4gMCkgewogICAgICAgICAgICBpZiAoKm9wID4gMjU1KQogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgIC8qIGlsbGVnYWwgdmFsdWUgKi8KICAgICAgICAgICAgKmNwKysgPSAoY2hhcikgKm9wKys7CiAgICAgICAgfQogICAgICAgICpjcCA9IDA7CgogICAgICAgIC8qCiAgICAgICAgICogLi4uIGFuZCB0aGUgc2VjTW9kZWwgYW5kIHNlY0xldmVsIGluZGV4IHZhbHVlcy4KICAgICAgICAgKi8KICAgICAgICBzZWNtb2RlbCA9ICpvcCsrOwogICAgICAgIHNlY2xldmVsID0gKm9wKys7CiAgICAgICAgaWYgKG9wICE9IG5hbWUgKyAqbGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KCiAgICAgICAgZ3AgPSB2YWNtX2dldEFjY2Vzc0VudHJ5KGdyb3VwTmFtZSwgY29udGV4dFByZWZpeCwgc2VjbW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2xldmVsKTsKICAgICAgICBpZiAoIGdwICYmIGdwLT5zZWN1cml0eUxldmVsICE9IHNlY2xldmVsICkKICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAvKiBUaGlzIGlzbid0IHN0cmljdGx5IHdoYXQgd2FzIGFza2VkIGZvciAqLwoKICAgIH0gZWxzZSB7CiAgICAgICAgc2VjbW9kZWwgPSBzZWNsZXZlbCA9IDA7CiAgICAgICAgZ3JvdXBOYW1lWzBdID0gMDsKICAgICAgICBjb250ZXh0UHJlZml4WzBdID0gMDsKICAgICAgICBvcCA9IG5hbWUgKyAxMTsKICAgICAgICBpZiAob3AgPj0gbmFtZSArICpsZW5ndGgpIHsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZW4gPSAqb3A7CiAgICAgICAgICAgIGlmIChsZW4gPiBWQUNNX01BWF9TVFJJTkcpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgY3AgPSBncm91cE5hbWU7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICgqb3AgPiAyNTUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAvKiBpbGxlZ2FsIHZhbHVlICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqY3ArKyA9IChjaGFyKSAqb3ArKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAqY3AgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAob3AgPj0gbmFtZSArICpsZW5ndGgpIHsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZW4gPSAqb3A7CiAgICAgICAgICAgIGlmIChsZW4gPiBWQUNNX01BWF9TVFJJTkcpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgY3AgPSBjb250ZXh0UHJlZml4OwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoKm9wID4gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgLyogaWxsZWdhbCB2YWx1ZSAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKmNwKysgPSAoY2hhcikgKm9wKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKmNwID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKG9wID49IG5hbWUgKyAqbGVuZ3RoKSB7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2VjbW9kZWwgPSAqb3ArKzsKICAgICAgICB9CiAgICAgICAgaWYgKG9wID49IG5hbWUgKyAqbGVuZ3RoKSB7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2VjbGV2ZWwgPSAqb3ArKzsKICAgICAgICB9CiAgICAgICAgdmFjbV9zY2FuQWNjZXNzSW5pdCgpOwogICAgICAgIHdoaWxlICgoZ3AgPSB2YWNtX3NjYW5BY2Nlc3NOZXh0KCkpICE9IE5VTEwpIHsKICAgICAgICAgICAgY21wID0gc3RyY21wKGdwLT5ncm91cE5hbWUsIGdyb3VwTmFtZSk7CiAgICAgICAgICAgIGlmIChjbXAgPiAwKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChjbXAgPCAwKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGNtcCA9IHN0cmNtcChncC0+Y29udGV4dFByZWZpeCwgY29udGV4dFByZWZpeCk7CiAgICAgICAgICAgIGlmIChjbXAgPiAwKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChjbXAgPCAwKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGlmIChncC0+c2VjdXJpdHlNb2RlbCA+IHNlY21vZGVsKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChncC0+c2VjdXJpdHlNb2RlbCA8IHNlY21vZGVsKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGlmIChncC0+c2VjdXJpdHlMZXZlbCA+IHNlY2xldmVsKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChncCkgewogICAgICAgICAgICAqbGVuZ3RoID0gMTE7CiAgICAgICAgICAgIGNwID0gZ3AtPmdyb3VwTmFtZTsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgbmFtZVsoKmxlbmd0aCkrK10gPSAqY3ArKzsKICAgICAgICAgICAgfSB3aGlsZSAoKmNwKTsKICAgICAgICAgICAgY3AgPSBncC0+Y29udGV4dFByZWZpeDsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgbmFtZVsoKmxlbmd0aCkrK10gPSAqY3ArKzsKICAgICAgICAgICAgfSB3aGlsZSAoKmNwKTsKICAgICAgICAgICAgbmFtZVsoKmxlbmd0aCkrK10gPSBncC0+c2VjdXJpdHlNb2RlbDsKICAgICAgICAgICAgbmFtZVsoKmxlbmd0aCkrK10gPSBncC0+c2VjdXJpdHlMZXZlbDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFncCkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmdfcmV0dXJuKTsKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIEFDQ0VTU01BVENIOgogICAgICAgIGxvbmdfcmV0dXJuID0gZ3AtPmNvbnRleHRNYXRjaDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgQUNDRVNTTEVWRUw6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBncC0+c2VjdXJpdHlMZXZlbDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgQUNDRVNTTU9ERUw6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBncC0+c2VjdXJpdHlNb2RlbDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgQUNDRVNTUFJFRklYOgogICAgICAgICp2YXJfbGVuID0gKmdwLT5jb250ZXh0UHJlZml4OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgZ3AtPmNvbnRleHRQcmVmaXhbMV07CgogICAgY2FzZSBBQ0NFU1NSRUFEOgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKGdwLT52aWV3c1tWQUNNX1ZJRVdfUkVBRF0pOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGdwLT52aWV3c1tWQUNNX1ZJRVdfUkVBRF07CgogICAgY2FzZSBBQ0NFU1NXUklURToKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihncC0+dmlld3NbVkFDTV9WSUVXX1dSSVRFXSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgZ3AtPnZpZXdzW1ZBQ01fVklFV19XUklURV07CgogICAgY2FzZSBBQ0NFU1NOT1RJRlk6CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oZ3AtPnZpZXdzW1ZBQ01fVklFV19OT1RJRlldKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBncC0+dmlld3NbVkFDTV9WSUVXX05PVElGWV07CgogICAgY2FzZSBBQ0NFU1NTVE9SQUdFOgogICAgICAgIGxvbmdfcmV0dXJuID0gZ3AtPnN0b3JhZ2VUeXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBBQ0NFU1NTVEFUVVM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBncC0+c3RhdHVzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKdV9jaGFyICAgICAgICAgKgp2YXJfdmFjbV92aWV3KHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBzdHJ1Y3QgdmFjbV92aWV3RW50cnkgKmdwID0gTlVMTDsKICAgIGNoYXIgICAgICAgICAgICB2aWV3TmFtZVtWQUNNU1RSSU5HTEVOXSA9IHsgMCB9OwogICAgb2lkICAgICAgICAgICAgIHN1YnRyZWVbTUFYX09JRF9MRU5dID0geyAwIH07CiAgICBzaXplX3QgICAgICAgICAgc3VidHJlZUxlbiA9IDA7CiAgICBvaWQgICAgICAgICAgICAqb3AsICpvcDE7CiAgICB1bnNpZ25lZCBsb25nICAgbGVuID0gMCwgaSA9IDA7CiAgICBjaGFyICAgICAgICAgICAqY3A7CiAgICBpbnQgICAgICAgICAgICAgY21wLCBjbXAyOwoKICAgIC8qCiAgICAgKiBTZXQgdXAgd3JpdGVfbWV0aG9kIGZpcnN0LCBpbiBjYXNlIHdlIHJldHVybiBOVUxMIGJlZm9yZSBnZXR0aW5nIHRvCiAgICAgKiB0aGUgc3dpdGNoICh2cC0+bWFnaWMpIGJlbG93LiAgSW4gc29tZSBvZiB0aGVzZSBjYXNlcywgd2Ugc3RpbGwgd2FudAogICAgICogdG8gY2FsbCB0aGUgYXBwcm9wcmlhdGUgd3JpdGVfbWV0aG9kLCBpZiBvbmx5IHRvIGhhdmUgaXQgcmV0dXJuIHRoZQogICAgICogYXBwcm9wcmlhdGUgZXJyb3IuICAKICAgICAqLwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIFZJRVdNQVNLOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV92YWNtVmlld01hc2s7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFZJRVdUWVBFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV92YWNtVmlld1R5cGU7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFZJRVdTVE9SQUdFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV92YWNtVmlld1N0b3JhZ2VUeXBlOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBWSUVXU1RBVFVTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV92YWNtVmlld1N0YXR1czsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IE5VTEw7CiAgICB9CgogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwogICAgaWYgKHZwLT5tYWdpYyAhPSBWQUNNVklFV1NQSU5MT0NLKSB7CiAgICAgICAgaWYgKG1lbWNtcChuYW1lLCB2cC0+bmFtZSwgc2l6ZW9mKG9pZCkgKiB2cC0+bmFtZWxlbikgIT0gMCkgewogICAgICAgICAgICBtZW1jcHkobmFtZSwgdnAtPm5hbWUsIHNpemVvZihvaWQpICogdnAtPm5hbWVsZW4pOwogICAgICAgICAgICAqbGVuZ3RoID0gdnAtPm5hbWVsZW47CiAgICAgICAgfQoKICAgICAgICBpZiAoZXhhY3QpIHsKICAgICAgICAgICAgaWYgKCpsZW5ndGggPCAxNSkKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRXh0cmFjdCB0aGUgdmlldyBuYW1lIGluZGV4IGZyb20gdGhlIHJlcXVlc3RlZCBPSUQgLi4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3AgPSBuYW1lICsgMTI7CiAgICAgICAgICAgIGxlbiA9ICpvcCsrOwogICAgICAgICAgICBpZiAobGVuID4gVkFDTV9NQVhfU1RSSU5HKQogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIGNwID0gdmlld05hbWU7CiAgICAgICAgICAgIHdoaWxlIChsZW4tLSA+IDApIHsKICAgICAgICAgICAgICAgIGlmICgqb3AgPiAyNTUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAqY3ArKyA9IChjaGFyKSAqb3ArKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAqY3AgPSAwOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogLi4uIGZvbGxvd2VkIGJ5IHRoZSB2aWV3IE9JRCBpbmRleC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHN1YnRyZWVbMF0gPSBsZW4gPSAqb3ArKzsKICAgICAgICAgICAgc3VidHJlZUxlbiA9IDE7CiAgICAgICAgICAgIGlmIChsZW4gPiBNQVhfT0lEX0xFTikKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICBpZiAoIChvcCtsZW4pICE9IChuYW1lICsgKmxlbmd0aCkgKQogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAvKiBEZWNsYXJlZCBsZW5ndGggZG9lc24ndCBtYXRjaCB3aGF0IHdlIGFjdHVhbGx5IGdvdCAqLwogICAgICAgICAgICBvcDEgPSAmKHN1YnRyZWVbMV0pOwogICAgICAgICAgICB3aGlsZSAobGVuLS0gPiAwKSB7CiAgICAgICAgICAgICAgICAqb3AxKysgPSAqb3ArKzsKICAgICAgICAgICAgICAgIHN1YnRyZWVMZW4rKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ3AgPSB2YWNtX2dldFZpZXdFbnRyeSh2aWV3TmFtZSwgJnN1YnRyZWVbMV0sIHN1YnRyZWVMZW4tMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUNNX01PREVfSUdOT1JFX01BU0spOwogICAgICAgICAgICBpZiAoZ3AgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgaWYgKGdwLT52aWV3U3VidHJlZUxlbiAhPSBzdWJ0cmVlTGVuKSB7CiAgICAgICAgICAgICAgICAgICAgZ3AgPSBOVUxMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmlld05hbWVbMF0gPSAwOwogICAgICAgICAgICBvcCA9IG5hbWUgKyAxMjsKICAgICAgICAgICAgaWYgKG9wID49IG5hbWUgKyAqbGVuZ3RoKSB7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsZW4gPSAqb3A7CiAgICAgICAgICAgICAgICBpZiAobGVuID4gVkFDTV9NQVhfU1RSSU5HKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgY3AgPSB2aWV3TmFtZTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbGVuICYmIG9wIDwgbmFtZSArICpsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICgqb3AgPiAyNTUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICpjcCsrID0gKGNoYXIpICpvcCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKmNwID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3AgPj0gbmFtZSArICpsZW5ndGgpIHsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxlbiA9ICpvcCsrOwogICAgICAgICAgICAgICAgb3AxID0gc3VidHJlZTsKICAgICAgICAgICAgICAgICpvcDErKyA9IGxlbjsKICAgICAgICAgICAgICAgIHN1YnRyZWVMZW4rKzsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbGVuICYmIG9wIDwgbmFtZSArICpsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICpvcDErKyA9ICpvcCsrOwogICAgICAgICAgICAgICAgICAgIHN1YnRyZWVMZW4rKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YWNtX3NjYW5WaWV3SW5pdCgpOwogICAgICAgICAgICB3aGlsZSAoKGdwID0gdmFjbV9zY2FuVmlld05leHQoKSkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgY21wID0gc3RyY21wKGdwLT52aWV3TmFtZSwgdmlld05hbWUpOwogICAgICAgICAgICAgICAgY21wMiA9CiAgICAgICAgICAgICAgICAgICAgc25tcF9vaWRfY29tcGFyZShncC0+dmlld1N1YnRyZWUsIGdwLT52aWV3U3VidHJlZUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUsIHN1YnRyZWVMZW4pOwogICAgICAgICAgICAgICAgaWYgKGNtcCA9PSAwICYmIGNtcDIgPiAwKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgaWYgKGNtcCA+IDApCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGdwKSB7CiAgICAgICAgICAgICAgICAqbGVuZ3RoID0gMTI7CiAgICAgICAgICAgICAgICBjcCA9IGdwLT52aWV3TmFtZTsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBuYW1lWygqbGVuZ3RoKSsrXSA9ICpjcCsrOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoKmNwKTsKICAgICAgICAgICAgICAgIG9wMSA9IGdwLT52aWV3U3VidHJlZTsKICAgICAgICAgICAgICAgIGxlbiA9IGdwLT52aWV3U3VidHJlZUxlbjsKICAgICAgICAgICAgICAgIHdoaWxlIChsZW4tLSA+IDApIHsKICAgICAgICAgICAgICAgICAgICBuYW1lWygqbGVuZ3RoKSsrXSA9ICpvcDErKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGdwID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoaGVhZGVyX2dlbmVyaWModnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCkpIHsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kaWYgLS0gdnAtPm1hZ2ljICE9IFZBQ01WSUVXU1BJTkxPQ0sgKi8KCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBWQUNNVklFV1NQSU5MT0NLOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV92YWNtVmlld1NwaW5Mb2NrOwogICAgICAgIGxvbmdfcmV0dXJuID0gdmFjbVZpZXdTcGluTG9jazsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgVklFV05BTUU6CiAgICAgICAgKnZhcl9sZW4gPSBncC0+dmlld05hbWVbMF07CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBncC0+dmlld05hbWVbMV07CgogICAgY2FzZSBWSUVXU1VCVFJFRToKICAgICAgICAqdmFyX2xlbiA9IGdwLT52aWV3U3VidHJlZUxlbiAqIHNpemVvZihvaWQpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGdwLT52aWV3U3VidHJlZTsKCiAgICBjYXNlIFZJRVdNQVNLOgogICAgICAgICp2YXJfbGVuID0gZ3AtPnZpZXdNYXNrTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGdwLT52aWV3TWFzazsKCiAgICBjYXNlIFZJRVdUWVBFOgogICAgICAgIGxvbmdfcmV0dXJuID0gZ3AtPnZpZXdUeXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBWSUVXU1RPUkFHRToKICAgICAgICBsb25nX3JldHVybiA9IGdwLT52aWV3U3RvcmFnZVR5cGU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKCiAgICBjYXNlIFZJRVdTVEFUVVM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBncC0+dmlld1N0YXR1czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCm9pZCAgICAgICAgICAgICoKc2VjMmdyb3VwX2dlbmVyYXRlX09JRChvaWQgKiBwcmVmaXgsIHNpemVfdCBwcmVmaXhMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZhY21fZ3JvdXBFbnRyeSAqIGdlcHRyLCBzaXplX3QgKiBsZW5ndGgpCnsKICAgIG9pZCAgICAgICAgICAgICppbmRleE9pZDsKICAgIGludCAgICAgICAgICAgICBpLCBzZWN1cml0eU5hbWVMZW47CgogICAgc2VjdXJpdHlOYW1lTGVuID0gc3RybGVuKGdlcHRyLT5zZWN1cml0eU5hbWUpOwoKICAgICpsZW5ndGggPSAyICsgc2VjdXJpdHlOYW1lTGVuICsgcHJlZml4TGVuOwogICAgaW5kZXhPaWQgPSAob2lkICopIG1hbGxvYygqbGVuZ3RoICogc2l6ZW9mKG9pZCkpOwogICAgaWYgKGluZGV4T2lkKSB7CiAgICAgICAgbWVtbW92ZShpbmRleE9pZCwgcHJlZml4LCBwcmVmaXhMZW4gKiBzaXplb2Yob2lkKSk7CgogICAgICAgIGluZGV4T2lkW3ByZWZpeExlbl0gPSBnZXB0ci0+c2VjdXJpdHlNb2RlbDsKCiAgICAgICAgaW5kZXhPaWRbcHJlZml4TGVuICsgMV0gPSBzZWN1cml0eU5hbWVMZW47CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlY3VyaXR5TmFtZUxlbjsgaSsrKQogICAgICAgICAgICBpbmRleE9pZFtwcmVmaXhMZW4gKyAyICsgaV0gPSAob2lkKSBnZXB0ci0+c2VjdXJpdHlOYW1lW2ldOwoKICAgIH0KICAgIHJldHVybiBpbmRleE9pZDsKCn0KCmludApzZWMyZ3JvdXBfcGFyc2Vfb2lkKG9pZCAqIG9pZEluZGV4LCBzaXplX3Qgb2lkTGVuLAogICAgICAgICAgICAgICAgICAgIGludCAqbW9kZWwsIHVuc2lnbmVkIGNoYXIgKipuYW1lLCBzaXplX3QgKiBuYW1lTGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgbmFtZUw7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICAvKgogICAgICogZmlyc3QgY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBvaWQgCiAgICAgKi8KICAgIGlmICgob2lkTGVuIDw9IDApIHx8ICghb2lkSW5kZXgpKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBuYW1lTCA9IG9pZEluZGV4WzFdOyAgICAgICAgLyogdGhlIGluaXRpYWwgbmFtZSBsZW5ndGggKi8KICAgIGlmICgoaW50KSBvaWRMZW4gIT0gbmFtZUwgKyAyKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgLyoKICAgICAqIGl0cyB2YWxpZCwgbWFsbG9jIHRoZSBzcGFjZSBhbmQgc3RvcmUgdGhlIHJlc3VsdHMgCiAgICAgKi8KICAgIGlmIChuYW1lID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAqbmFtZSA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyhuYW1lTCArIDEpOwogICAgaWYgKCpuYW1lID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAqbW9kZWwgPSBvaWRJbmRleFswXTsKICAgICpuYW1lTGVuID0gbmFtZUw7CgoKICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lTDsgaSsrKSB7CiAgICAgICAgaWYgKG9pZEluZGV4W2kgKyAyXSA+IDI1NSkgewogICAgICAgICAgICBmcmVlKCpuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIG5hbWVbMF1baV0gPSAodW5zaWduZWQgY2hhcikgb2lkSW5kZXhbaSArIDJdOwogICAgfQogICAgbmFtZVswXVtuYW1lTF0gPSAwOwoKICAgIHJldHVybiAwOwoKfQoKc3RydWN0IHZhY21fZ3JvdXBFbnRyeSAqCnNlYzJncm91cF9wYXJzZV9ncm91cEVudHJ5KG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RydWN0IHZhY21fZ3JvdXBFbnRyeSAqZ2VwdHI7CgogICAgY2hhciAgICAgICAgICAgKm5ld05hbWU7CiAgICBpbnQgICAgICAgICAgICAgbW9kZWw7CiAgICBzaXplX3QgICAgICAgICAgbmFtZUxlbjsKCiAgICAvKgogICAgICogZ2V0IHRoZSBuYW1lIGFuZCBlbmdpbmVJRCBvdXQgb2YgdGhlIGluY29taW5nIG9pZCAKICAgICAqLwogICAgaWYgKHNlYzJncm91cF9wYXJzZV9vaWQKICAgICAgICAoJm5hbWVbU0VDMkdST1VQX01JQl9MRU5HVEhdLCBuYW1lX2xlbiAtIFNFQzJHUk9VUF9NSUJfTEVOR1RILAogICAgICAgICAmbW9kZWwsICh1X2NoYXIgKiopICYgbmV3TmFtZSwgJm5hbWVMZW4pKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qCiAgICAgKiBOb3cgc2VlIGlmIGEgdXNlciBleGlzdHMgd2l0aCB0aGVzZSBpbmRleCB2YWx1ZXMgCiAgICAgKi8KICAgIGdlcHRyID0gdmFjbV9nZXRHcm91cEVudHJ5KG1vZGVsLCBuZXdOYW1lKTsKICAgIGZyZWUobmV3TmFtZSk7CgogICAgcmV0dXJuIGdlcHRyOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdmFjbV9wYXJzZV9ncm91cEVudHJ5KCkgKi8KCmludAp3cml0ZV92YWNtR3JvdXBOYW1lKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBzdHJpbmdbVkFDTVNUUklOR0xFTl07CiAgICBzdHJ1Y3QgdmFjbV9ncm91cEVudHJ5ICpnZXB0cjsKICAgIHN0YXRpYyBpbnQgICAgICByZXNldE9uRmFpbDsKCiAgICBpZiAoYWN0aW9uID09IFJFU0VSVkUxKSB7CiAgICAgICAgcmVzZXRPbkZhaWwgPSAwOwogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBpZiAodmFyX3ZhbF9sZW4gPCAxIHx8IHZhcl92YWxfbGVuID4gMzIpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HTEVOR1RIOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IFJFU0VSVkUyKSB7CiAgICAgICAgaWYgKChnZXB0ciA9IHNlYzJncm91cF9wYXJzZV9ncm91cEVudHJ5KG5hbWUsIG5hbWVfbGVuKSkgPT0gTlVMTCkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXNldE9uRmFpbCA9IDE7CiAgICAgICAgICAgIG1lbWNweShzdHJpbmcsIGdlcHRyLT5ncm91cE5hbWUsIFZBQ01TVFJJTkdMRU4pOwogICAgICAgICAgICBtZW1jcHkoZ2VwdHItPmdyb3VwTmFtZSwgdmFyX3ZhbCwgdmFyX3ZhbF9sZW4pOwogICAgICAgICAgICBnZXB0ci0+Z3JvdXBOYW1lW3Zhcl92YWxfbGVuXSA9IDA7CiAgICAgICAgICAgIGlmIChnZXB0ci0+c3RhdHVzID09IFJTX05PVFJFQURZKSB7CiAgICAgICAgICAgICAgICBnZXB0ci0+c3RhdHVzID0gUlNfTk9USU5TRVJWSUNFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gRlJFRSkgewogICAgICAgIC8qCiAgICAgICAgICogVHJ5IHRvIHVuZG8gdGhlIFNFVCBoZXJlIChhYm5vcm1hbCB1c2FnZSBvZiBGUkVFIGNsYXVzZSkgIAogICAgICAgICAqLwogICAgICAgIGlmICgoZ2VwdHIgPSBzZWMyZ3JvdXBfcGFyc2VfZ3JvdXBFbnRyeShuYW1lLCBuYW1lX2xlbikpICE9IE5VTEwgJiYKICAgICAgICAgICAgcmVzZXRPbkZhaWwpIHsKICAgICAgICAgICAgbWVtY3B5KGdlcHRyLT5ncm91cE5hbWUsIHN0cmluZywgVkFDTVNUUklOR0xFTik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV92YWNtU2VjdXJpdHlUb0dyb3VwU3RvcmFnZVR5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIC8qCiAgICAgKiB2YXJpYWJsZXMgd2UgbWF5IHVzZSBsYXRlciAKICAgICAqLwogICAgc3RhdGljIGxvbmcgICAgIGxvbmdfcmV0OwogICAgc3RydWN0IHZhY21fZ3JvdXBFbnRyeSAqZ2VwdHI7CgogICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICB9CiAgICBpZiAodmFyX3ZhbF9sZW4gPiBzaXplb2YobG9uZ19yZXQpKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HTEVOR1RIOwogICAgfQogICAgaWYgKGFjdGlvbiA9PSBDT01NSVQpIHsKICAgICAgICAvKgogICAgICAgICAqIGRvbid0IGFsbG93IGNyZWF0aW9ucyBoZXJlIAogICAgICAgICAqLwogICAgICAgIGlmICgoZ2VwdHIgPSBzZWMyZ3JvdXBfcGFyc2VfZ3JvdXBFbnRyeShuYW1lLCBuYW1lX2xlbikpID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7CiAgICAgICAgfQogICAgICAgIGxvbmdfcmV0ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBpZiAoKGxvbmdfcmV0ID09IFNUX1ZPTEFUSUxFIHx8IGxvbmdfcmV0ID09IFNUX05PTlZPTEFUSUxFKSAmJgogICAgICAgICAgICAoZ2VwdHItPnN0b3JhZ2VUeXBlID09IFNUX1ZPTEFUSUxFIHx8CiAgICAgICAgICAgICBnZXB0ci0+c3RvcmFnZVR5cGUgPT0gU1RfTk9OVk9MQVRJTEUpKSB7CiAgICAgICAgICAgIGdlcHRyLT5zdG9yYWdlVHlwZSA9IGxvbmdfcmV0OwogICAgICAgIH0gZWxzZSBpZiAobG9uZ19yZXQgPT0gZ2VwdHItPnN0b3JhZ2VUeXBlKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCmludAp3cml0ZV92YWNtU2VjdXJpdHlUb0dyb3VwU3RhdHVzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBsb25nICAgICBsb25nX3JldDsKICAgIGludCAgICAgICAgICAgICBtb2RlbDsKICAgIGNoYXIgICAgICAgICAgICpuZXdOYW1lOwogICAgc2l6ZV90ICAgICAgICAgIG5hbWVMZW47CiAgICBzdHJ1Y3QgdmFjbV9ncm91cEVudHJ5ICpnZXB0cjsKCiAgICBpZiAoYWN0aW9uID09IFJFU0VSVkUxKSB7CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBpZiAodmFyX3ZhbF9sZW4gIT0gc2l6ZW9mKGxvbmdfcmV0KSkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdMRU5HVEg7CiAgICAgICAgfQogICAgICAgIGxvbmdfcmV0ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfTk9UUkVBRFkgfHwgbG9uZ19yZXQgPCAxIHx8IGxvbmdfcmV0ID4gNikgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogU2VlIGlmIHdlIGNhbiBwYXJzZSB0aGUgb2lkIGZvciBtb2RlbC9uYW1lIGZpcnN0LiAgCiAgICAgICAgICovCgogICAgICAgIGlmIChzZWMyZ3JvdXBfcGFyc2Vfb2lkKCZuYW1lW1NFQzJHUk9VUF9NSUJfTEVOR1RIXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiAtIFNFQzJHUk9VUF9NSUJfTEVOR1RILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlbCwgKHVfY2hhciAqKikgJiBuZXdOYW1lLCAmbmFtZUxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgfQoKICAgICAgICBpZiAobW9kZWwgPCAxIHx8IG5hbWVMZW4gPCAxIHx8IG5hbWVMZW4gPiAzMikgewogICAgICAgICAgICBmcmVlKG5ld05hbWUpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9DUkVBVElPTjsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogTm93IHNlZSBpZiBhIGdyb3VwIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlc2UgaW5kZXggdmFsdWVzLiAgCiAgICAgICAgICovCiAgICAgICAgZ2VwdHIgPSB2YWNtX2dldEdyb3VwRW50cnkobW9kZWwsIG5ld05hbWUpOwoKICAgICAgICBpZiAoZ2VwdHIgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5ER08gfHwgbG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5EV0FJVCkgewogICAgICAgICAgICAgICAgZnJlZShuZXdOYW1lKTsKICAgICAgICAgICAgICAgIGxvbmdfcmV0ID0gUlNfTk9UUkVBRFk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0RFU1RST1kgJiYgZ2VwdHItPnN0b3JhZ2VUeXBlID09IFNUX1BFUk1BTkVOVCkgewogICAgICAgICAgICAgICAgZnJlZShuZXdOYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0FDVElWRSB8fCBsb25nX3JldCA9PSBSU19OT1RJTlNFUlZJQ0UpIHsKICAgICAgICAgICAgICAgIGZyZWUobmV3TmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0NSRUFURUFOREdPIHx8IGxvbmdfcmV0ID09IFJTX0NSRUFURUFORFdBSVQpIHsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogR2VuZXJhdGUgYSBuZXcgZ3JvdXAgZW50cnkuICAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKChnZXB0ciA9CiAgICAgICAgICAgICAgICAgICAgIHZhY21fY3JlYXRlR3JvdXBFbnRyeShtb2RlbCwgbmV3TmFtZSkpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBmcmVlKG5ld05hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFNldCBkZWZhdWx0cy4gIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBnZXB0ci0+c3RvcmFnZVR5cGUgPSBTVF9OT05WT0xBVElMRTsKICAgICAgICAgICAgICAgIGdlcHRyLT5zdGF0dXMgPSBSU19OT1RSRUFEWTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmcmVlKG5ld05hbWUpOwogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gQUNUSU9OKSB7CiAgICAgICAgc2VjMmdyb3VwX3BhcnNlX29pZCgmbmFtZVtTRUMyR1JPVVBfTUlCX0xFTkdUSF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiAtIFNFQzJHUk9VUF9NSUJfTEVOR1RILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVsLCAodV9jaGFyICoqKSAmIG5ld05hbWUsICZuYW1lTGVuKTsKCiAgICAgICAgZ2VwdHIgPSB2YWNtX2dldEdyb3VwRW50cnkobW9kZWwsIG5ld05hbWUpOwoKICAgICAgICBpZiAoZ2VwdHIgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5ER08gfHwgbG9uZ19yZXQgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogQ2hlY2sgdGhhdCBhbGwgdGhlIG1hbmRhdG9yeSBvYmplY3RzIGhhdmUgYmVlbiBzZXQgYnkgbm93LAogICAgICAgICAgICAgICAgICogb3RoZXJ3aXNlIHJldHVybiBpbmNvbnNpc3RlbnRWYWx1ZS4gIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoZ2VwdHItPmdyb3VwTmFtZVswXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZnJlZShuZXdOYW1lKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBnZXB0ci0+c3RhdHVzID0gUlNfQUNUSVZFOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxvbmdfcmV0ID09IFJTX0NSRUFURUFORFdBSVQpIHsKICAgICAgICAgICAgICAgIGlmIChnZXB0ci0+Z3JvdXBOYW1lWzBdICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBnZXB0ci0+c3RhdHVzID0gUlNfTk9USU5TRVJWSUNFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGxvbmdfcmV0ID09IFJTX05PVElOU0VSVklDRSkgewogICAgICAgICAgICAgICAgaWYgKGdlcHRyLT5zdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgICAgICAgICAgICAgZ2VwdHItPnN0YXR1cyA9IFJTX05PVElOU0VSVklDRTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2VwdHItPnN0YXR1cyA9PSBSU19OT1RSRUFEWSkgewogICAgICAgICAgICAgICAgICAgIGZyZWUobmV3TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUobmV3TmFtZSk7CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBDT01NSVQpIHsKICAgICAgICBzZWMyZ3JvdXBfcGFyc2Vfb2lkKCZuYW1lW1NFQzJHUk9VUF9NSUJfTEVOR1RIXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfbGVuIC0gU0VDMkdST1VQX01JQl9MRU5HVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZWwsICh1X2NoYXIgKiopICYgbmV3TmFtZSwgJm5hbWVMZW4pOwoKICAgICAgICBnZXB0ciA9IHZhY21fZ2V0R3JvdXBFbnRyeShtb2RlbCwgbmV3TmFtZSk7CgogICAgICAgIGlmIChnZXB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChsb25nX3JldCA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICB2YWNtX2Rlc3Ryb3lHcm91cEVudHJ5KG1vZGVsLCBuZXdOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmcmVlKG5ld05hbWUpOwogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gVU5ETykgewogICAgICAgIGlmIChsb25nX3JldCA9PSBSU19DUkVBVEVBTkRHTyB8fCBsb25nX3JldCA9PSBSU19DUkVBVEVBTkRXQUlUKSB7CiAgICAgICAgICAgIHNlYzJncm91cF9wYXJzZV9vaWQoJm5hbWVbU0VDMkdST1VQX01JQl9MRU5HVEhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfbGVuIC0gU0VDMkdST1VQX01JQl9MRU5HVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVsLCAodV9jaGFyICoqKSAmIG5ld05hbWUsICZuYW1lTGVuKTsKCiAgICAgICAgICAgIGdlcHRyID0gdmFjbV9nZXRHcm91cEVudHJ5KG1vZGVsLCBuZXdOYW1lKTsKCiAgICAgICAgICAgIGlmIChnZXB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICB2YWNtX2Rlc3Ryb3lHcm91cEVudHJ5KG1vZGVsLCBuZXdOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKG5ld05hbWUpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKb2lkICAgICAgICAgICAgKgphY2Nlc3NfZ2VuZXJhdGVfT0lEKG9pZCAqIHByZWZpeCwgc2l6ZV90IHByZWZpeExlbiwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqIGFwdHIsIHNpemVfdCAqIGxlbmd0aCkKewogICAgb2lkICAgICAgICAgICAgKmluZGV4T2lkOwogICAgaW50ICAgICAgICAgICAgIGksIGdyb3VwTmFtZUxlbiwgY29udGV4dFByZWZpeExlbjsKCiAgICBncm91cE5hbWVMZW4gPSBzdHJsZW4oYXB0ci0+Z3JvdXBOYW1lKTsKICAgIGNvbnRleHRQcmVmaXhMZW4gPSBzdHJsZW4oYXB0ci0+Y29udGV4dFByZWZpeCk7CgogICAgKmxlbmd0aCA9IDQgKyBncm91cE5hbWVMZW4gKyBjb250ZXh0UHJlZml4TGVuICsgcHJlZml4TGVuOwogICAgaW5kZXhPaWQgPSAob2lkICopIG1hbGxvYygqbGVuZ3RoICogc2l6ZW9mKG9pZCkpOwogICAgaWYgKGluZGV4T2lkKSB7CiAgICAgICAgbWVtbW92ZShpbmRleE9pZCwgcHJlZml4LCBwcmVmaXhMZW4gKiBzaXplb2Yob2lkKSk7CgogICAgICAgIGluZGV4T2lkW3ByZWZpeExlbl0gPSBncm91cE5hbWVMZW47CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTmFtZUxlbjsgaSsrKQogICAgICAgICAgICBpbmRleE9pZFtncm91cE5hbWVMZW4gKyAxICsgaV0gPSAob2lkKSBhcHRyLT5ncm91cE5hbWVbaV07CgogICAgICAgIGluZGV4T2lkW3ByZWZpeExlbiArIGdyb3VwTmFtZUxlbiArIDFdID0gY29udGV4dFByZWZpeExlbjsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGV4dFByZWZpeExlbjsgaSsrKQogICAgICAgICAgICBpbmRleE9pZFtwcmVmaXhMZW4gKyBncm91cE5hbWVMZW4gKyAyICsgaV0gPQogICAgICAgICAgICAgICAgKG9pZCkgYXB0ci0+Y29udGV4dFByZWZpeFtpXTsKCiAgICAgICAgaW5kZXhPaWRbcHJlZml4TGVuICsgZ3JvdXBOYW1lTGVuICsgY29udGV4dFByZWZpeExlbiArIDNdID0KICAgICAgICAgICAgYXB0ci0+c2VjdXJpdHlNb2RlbDsKICAgICAgICBpbmRleE9pZFtwcmVmaXhMZW4gKyBncm91cE5hbWVMZW4gKyBjb250ZXh0UHJlZml4TGVuICsgNF0gPQogICAgICAgICAgICBhcHRyLT5zZWN1cml0eUxldmVsOwoKICAgIH0KICAgIHJldHVybiBpbmRleE9pZDsKCn0KCmludAphY2Nlc3NfcGFyc2Vfb2lkKG9pZCAqIG9pZEluZGV4LCBzaXplX3Qgb2lkTGVuLAogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipncm91cE5hbWUsIHNpemVfdCAqIGdyb3VwTmFtZUxlbiwKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqY29udGV4dFByZWZpeCwgc2l6ZV90ICogY29udGV4dFByZWZpeExlbiwKICAgICAgICAgICAgICAgICBpbnQgKm1vZGVsLCBpbnQgKmxldmVsKQp7CiAgICBpbnQgICAgICAgICAgICAgZ3JvdXBOYW1lTCwgY29udGV4dFByZWZpeEw7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICAvKgogICAgICogZmlyc3QgY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBvaWQgCiAgICAgKi8KICAgIGlmICgob2lkTGVuIDw9IDApIHx8ICghb2lkSW5kZXgpKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBncm91cE5hbWVMID0gb2lkSW5kZXhbMF07CiAgICBjb250ZXh0UHJlZml4TCA9IG9pZEluZGV4W2dyb3VwTmFtZUwgKyAxXTsgIC8qIHRoZSBpbml0aWFsIG5hbWUgbGVuZ3RoICovCiAgICBpZiAoKGludCkgb2lkTGVuICE9IGdyb3VwTmFtZUwgKyBjb250ZXh0UHJlZml4TCArIDQpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvKgogICAgICogaXRzIHZhbGlkLCBtYWxsb2MgdGhlIHNwYWNlIGFuZCBzdG9yZSB0aGUgcmVzdWx0cyAKICAgICAqLwogICAgaWYgKGNvbnRleHRQcmVmaXggPT0gTlVMTCB8fCBncm91cE5hbWUgPT0gTlVMTCkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICpncm91cE5hbWUgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MoZ3JvdXBOYW1lTCArIDEpOwogICAgaWYgKCpncm91cE5hbWUgPT0gTlVMTCkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICpjb250ZXh0UHJlZml4ID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jKGNvbnRleHRQcmVmaXhMICsgMSk7CiAgICBpZiAoKmNvbnRleHRQcmVmaXggPT0gTlVMTCkgewogICAgICAgIGZyZWUoKmdyb3VwTmFtZSk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgKmNvbnRleHRQcmVmaXhMZW4gPSBjb250ZXh0UHJlZml4TDsKICAgICpncm91cE5hbWVMZW4gPSBncm91cE5hbWVMOwoKICAgIGZvciAoaSA9IDA7IGkgPCBncm91cE5hbWVMOyBpKyspIHsKICAgICAgICBpZiAob2lkSW5kZXhbaSArIDFdID4gMjU1KSB7CiAgICAgICAgICAgIGZyZWUoKmdyb3VwTmFtZSk7CiAgICAgICAgICAgIGZyZWUoKmNvbnRleHRQcmVmaXgpOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgZ3JvdXBOYW1lWzBdW2ldID0gKHVuc2lnbmVkIGNoYXIpIG9pZEluZGV4W2kgKyAxXTsKICAgIH0KICAgIGdyb3VwTmFtZVswXVtncm91cE5hbWVMXSA9IDA7CgoKICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZXh0UHJlZml4TDsgaSsrKSB7CiAgICAgICAgaWYgKG9pZEluZGV4W2kgKyBncm91cE5hbWVMICsgMl0gPiAyNTUpIHsKICAgICAgICAgICAgZnJlZSgqZ3JvdXBOYW1lKTsKICAgICAgICAgICAgZnJlZSgqY29udGV4dFByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBjb250ZXh0UHJlZml4WzBdW2ldID0gKHVuc2lnbmVkIGNoYXIpIG9pZEluZGV4W2kgKyBncm91cE5hbWVMICsgMl07CiAgICB9CiAgICBjb250ZXh0UHJlZml4WzBdW2NvbnRleHRQcmVmaXhMXSA9IDA7CgogICAgKm1vZGVsID0gb2lkSW5kZXhbZ3JvdXBOYW1lTCArIGNvbnRleHRQcmVmaXhMICsgMl07CiAgICAqbGV2ZWwgPSBvaWRJbmRleFtncm91cE5hbWVMICsgY29udGV4dFByZWZpeEwgKyAzXTsKCiAgICByZXR1cm4gMDsKCn0KCnN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICoKYWNjZXNzX3BhcnNlX2FjY2Vzc0VudHJ5KG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RydWN0IHZhY21fYWNjZXNzRW50cnkgKmFwdHI7CgogICAgY2hhciAgICAgICAgICAgKm5ld0dyb3VwTmFtZSA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgICAqbmV3Q29udGV4dFByZWZpeCA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgbW9kZWwsIGxldmVsOwogICAgc2l6ZV90ICAgICAgICAgIGdyb3VwTmFtZUxlbiwgY29udGV4dFByZWZpeExlbjsKCiAgICAvKgogICAgICogZ2V0IHRoZSBuYW1lIGFuZCBlbmdpbmVJRCBvdXQgb2YgdGhlIGluY29taW5nIG9pZCAKICAgICAqLwogICAgaWYgKGFjY2Vzc19wYXJzZV9vaWQKICAgICAgICAoJm5hbWVbQUNDRVNTX01JQl9MRU5HVEhdLCBuYW1lX2xlbiAtIEFDQ0VTU19NSUJfTEVOR1RILAogICAgICAgICAodV9jaGFyICoqKSAmIG5ld0dyb3VwTmFtZSwgJmdyb3VwTmFtZUxlbiwKICAgICAgICAgKHVfY2hhciAqKikgJiBuZXdDb250ZXh0UHJlZml4LCAmY29udGV4dFByZWZpeExlbiwgJm1vZGVsLAogICAgICAgICAmbGV2ZWwpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qCiAgICAgKiBOb3cgc2VlIGlmIGEgdXNlciBleGlzdHMgd2l0aCB0aGVzZSBpbmRleCB2YWx1ZXMgCiAgICAgKi8KICAgIGFwdHIgPQogICAgICAgIHZhY21fZ2V0QWNjZXNzRW50cnkobmV3R3JvdXBOYW1lLCBuZXdDb250ZXh0UHJlZml4LCBtb2RlbCwgbGV2ZWwpOwogICAgU05NUF9GUkVFKG5ld0NvbnRleHRQcmVmaXgpOwogICAgU05NUF9GUkVFKG5ld0dyb3VwTmFtZSk7CgogICAgcmV0dXJuIGFwdHI7Cgp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB2YWNtX3BhcnNlX2FjY2Vzc0VudHJ5KCkgKi8KCmludAp3cml0ZV92YWNtQWNjZXNzU3RhdHVzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgbG9uZyAgICAgbG9uZ19yZXQ7CiAgICBpbnQgICAgICAgICAgICAgbW9kZWwsIGxldmVsOwogICAgY2hhciAgICAgICAgICAgKm5ld0dyb3VwTmFtZSA9IE5VTEwsICpuZXdDb250ZXh0UHJlZml4ID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBncm91cE5hbWVMZW4sIGNvbnRleHRQcmVmaXhMZW47CiAgICBzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqYXB0ciA9IE5VTEw7CgogICAgaWYgKGFjdGlvbiA9PSBSRVNFUlZFMSkgewogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhcl92YWxfbGVuICE9IHNpemVvZihsb25nX3JldCkpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HTEVOR1RIOwogICAgICAgIH0KICAgICAgICBsb25nX3JldCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX05PVFJFQURZIHx8IGxvbmdfcmV0IDwgMSB8fCBsb25nX3JldCA+IDYpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVkFMVUU7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIFNlZSBpZiB3ZSBjYW4gcGFyc2UgdGhlIG9pZCBmb3IgbW9kZWwvbmFtZSBmaXJzdC4gIAogICAgICAgICAqLwogICAgICAgIGlmIChhY2Nlc3NfcGFyc2Vfb2lkKCZuYW1lW0FDQ0VTU19NSUJfTEVOR1RIXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiAtIEFDQ0VTU19NSUJfTEVOR1RILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKiopICYgbmV3R3JvdXBOYW1lLCAmZ3JvdXBOYW1lTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKiopICYgbmV3Q29udGV4dFByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dFByZWZpeExlbiwgJm1vZGVsLCAmbGV2ZWwpKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgIH0KCiAgICAgICAgaWYgKG1vZGVsIDwgMCB8fCBncm91cE5hbWVMZW4gPCAxIHx8IGdyb3VwTmFtZUxlbiA+IDMyIHx8CiAgICAgICAgICAgIGNvbnRleHRQcmVmaXhMZW4gPiAzMikgewogICAgICAgICAgICBmcmVlKG5ld0dyb3VwTmFtZSk7CiAgICAgICAgICAgIGZyZWUobmV3Q29udGV4dFByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0NSRUFUSU9OOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBOb3cgc2VlIGlmIGEgZ3JvdXAgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGVzZSBpbmRleCB2YWx1ZXMuICAKICAgICAgICAgKi8KICAgICAgICBhcHRyID0KICAgICAgICAgICAgdmFjbV9nZXRBY2Nlc3NFbnRyeShuZXdHcm91cE5hbWUsIG5ld0NvbnRleHRQcmVmaXgsIG1vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKCiAgICAgICAgaWYgKGFwdHIgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5ER08gfHwgbG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5EV0FJVCkgewogICAgICAgICAgICAgICAgZnJlZShuZXdHcm91cE5hbWUpOwogICAgICAgICAgICAgICAgZnJlZShuZXdDb250ZXh0UHJlZml4KTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfREVTVFJPWSAmJiBhcHRyLT5zdG9yYWdlVHlwZSA9PSBTVF9QRVJNQU5FTlQpIHsKICAgICAgICAgICAgICAgIGZyZWUobmV3R3JvdXBOYW1lKTsKICAgICAgICAgICAgICAgIGZyZWUobmV3Q29udGV4dFByZWZpeCk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChsb25nX3JldCA9PSBSU19BQ1RJVkUgfHwgbG9uZ19yZXQgPT0gUlNfTk9USU5TRVJWSUNFKSB7CiAgICAgICAgICAgICAgICBmcmVlKG5ld0dyb3VwTmFtZSk7CiAgICAgICAgICAgICAgICBmcmVlKG5ld0NvbnRleHRQcmVmaXgpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsb25nX3JldCA9PSBSU19DUkVBVEVBTkRHTyB8fCBsb25nX3JldCA9PSBSU19DUkVBVEVBTkRXQUlUKSB7CiAgICAgICAgICAgICAgICBpZiAoKGFwdHIgPSB2YWNtX2NyZWF0ZUFjY2Vzc0VudHJ5KG5ld0dyb3VwTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGV4dFByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKSkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGZyZWUobmV3R3JvdXBOYW1lKTsKICAgICAgICAgICAgICAgICAgICBmcmVlKG5ld0NvbnRleHRQcmVmaXgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFNldCBkZWZhdWx0cy4gIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBhcHRyLT5jb250ZXh0TWF0Y2ggPSAxOyAvKiAgZXhhY3QoMSkgaXMgdGhlIERFRlZBTCAgKi8KICAgICAgICAgICAgICAgIGFwdHItPnN0b3JhZ2VUeXBlID0gU1RfTk9OVk9MQVRJTEU7CiAgICAgICAgICAgICAgICBhcHRyLT5zdGF0dXMgPSBSU19OT1RSRUFEWTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmcmVlKG5ld0dyb3VwTmFtZSk7CiAgICAgICAgZnJlZShuZXdDb250ZXh0UHJlZml4KTsKICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IEFDVElPTikgewogICAgICAgIGFjY2Vzc19wYXJzZV9vaWQoJm5hbWVbQUNDRVNTX01JQl9MRU5HVEhdLAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9sZW4gLSBBQ0NFU1NfTUlCX0xFTkdUSCwKICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKiopICYgbmV3R3JvdXBOYW1lLCAmZ3JvdXBOYW1lTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKikgJiBuZXdDb250ZXh0UHJlZml4LCAmY29udGV4dFByZWZpeExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlbCwgJmxldmVsKTsKICAgICAgICBhcHRyID0KICAgICAgICAgICAgdmFjbV9nZXRBY2Nlc3NFbnRyeShuZXdHcm91cE5hbWUsIG5ld0NvbnRleHRQcmVmaXgsIG1vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKCiAgICAgICAgaWYgKGFwdHIgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5ER08gfHwgbG9uZ19yZXQgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgICAgICAgICBhcHRyLT5zdGF0dXMgPSBSU19BQ1RJVkU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5EV0FJVCkgewogICAgICAgICAgICAgICAgYXB0ci0+c3RhdHVzID0gUlNfTk9USU5TRVJWSUNFOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxvbmdfcmV0ID09IFJTX05PVElOU0VSVklDRSkgewogICAgICAgICAgICAgICAgaWYgKGFwdHItPnN0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICAgICAgICAgICAgICBhcHRyLT5zdGF0dXMgPSBSU19OT1RJTlNFUlZJQ0U7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFwdHItPnN0YXR1cyA9PSBSU19OT1RSRUFEWSkgewogICAgICAgICAgICAgICAgICAgIGZyZWUobmV3R3JvdXBOYW1lKTsKICAgICAgICAgICAgICAgICAgICBmcmVlKG5ld0NvbnRleHRQcmVmaXgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmcmVlKG5ld0dyb3VwTmFtZSk7CiAgICAgICAgZnJlZShuZXdDb250ZXh0UHJlZml4KTsKICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IENPTU1JVCkgewogICAgICAgIGFjY2Vzc19wYXJzZV9vaWQoJm5hbWVbQUNDRVNTX01JQl9MRU5HVEhdLAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9sZW4gLSBBQ0NFU1NfTUlCX0xFTkdUSCwKICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKiopICYgbmV3R3JvdXBOYW1lLCAmZ3JvdXBOYW1lTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKikgJiBuZXdDb250ZXh0UHJlZml4LCAmY29udGV4dFByZWZpeExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlbCwgJmxldmVsKTsKICAgICAgICBhcHRyID0KICAgICAgICAgICAgdmFjbV9nZXRBY2Nlc3NFbnRyeShuZXdHcm91cE5hbWUsIG5ld0NvbnRleHRQcmVmaXgsIG1vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKCiAgICAgICAgaWYgKGFwdHIpIHsKICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIHZhY21fZGVzdHJveUFjY2Vzc0VudHJ5KG5ld0dyb3VwTmFtZSwgbmV3Q29udGV4dFByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLCBsZXZlbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnJlZShuZXdHcm91cE5hbWUpOwogICAgICAgIGZyZWUobmV3Q29udGV4dFByZWZpeCk7CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBVTkRPKSB7CiAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0NSRUFURUFOREdPIHx8IGxvbmdfcmV0ID09IFJTX0NSRUFURUFORFdBSVQpIHsKICAgICAgICAgICAgYWNjZXNzX3BhcnNlX29pZCgmbmFtZVtBQ0NFU1NfTUlCX0xFTkdUSF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9sZW4gLSBBQ0NFU1NfTUlCX0xFTkdUSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICoqKSAmIG5ld0dyb3VwTmFtZSwgJmdyb3VwTmFtZUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICoqKSAmIG5ld0NvbnRleHRQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHRQcmVmaXhMZW4sICZtb2RlbCwgJmxldmVsKTsKICAgICAgICAgICAgYXB0ciA9CiAgICAgICAgICAgICAgICB2YWNtX2dldEFjY2Vzc0VudHJ5KG5ld0dyb3VwTmFtZSwgbmV3Q29udGV4dFByZWZpeCwgbW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKICAgICAgICAgICAgaWYgKGFwdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgdmFjbV9kZXN0cm95QWNjZXNzRW50cnkobmV3R3JvdXBOYW1lLCBuZXdDb250ZXh0UHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsIGxldmVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmcmVlKG5ld0dyb3VwTmFtZSk7CiAgICAgICAgZnJlZShuZXdDb250ZXh0UHJlZml4KTsKICAgIH0KCiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3ZhY21BY2Nlc3NTdG9yYWdlVHlwZShpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICAvKgogICAgICogdmFyaWFibGVzIHdlIG1heSB1c2UgbGF0ZXIgCiAgICAgKi8KICAgIHN0YXRpYyBsb25nICAgICBsb25nX3JldDsKICAgIHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICphcHRyOwoKICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFjbV92YXJzIiwKICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdmFjbVNlY3VyaXR5VG9Hcm91cFN0b3JhZ2VUeXBlIG5vdCBBU05fSU5URUdFUlxuIikpOwogICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICB9CiAgICBpZiAodmFyX3ZhbF9sZW4gPiBzaXplb2YobG9uZ19yZXQpKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsCiAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHZhY21TZWN1cml0eVRvR3JvdXBTdG9yYWdlVHlwZTogYmFkIGxlbmd0aFxuIikpOwogICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgIH0KICAgIGlmIChhY3Rpb24gPT0gQ09NTUlUKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBkb24ndCBhbGxvdyBjcmVhdGlvbnMgaGVyZSAKICAgICAgICAgKi8KICAgICAgICBpZiAoKGFwdHIgPSBhY2Nlc3NfcGFyc2VfYWNjZXNzRW50cnkobmFtZSwgbmFtZV9sZW4pKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOwogICAgICAgIH0KICAgICAgICBsb25nX3JldCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgLyoKICAgICAgICAgKiBpZiAoKGxvbmdfcmV0ID09IFNUX1ZPTEFUSUxFIHx8IGxvbmdfcmV0ID09IFNUX05PTlZPTEFUSUxFKSAmJgogICAgICAgICAqIChhcHRyLT5zdG9yYWdlVHlwZSA9PSBTVF9WT0xBVElMRSB8fAogICAgICAgICAqIGFwdHItPnN0b3JhZ2VUeXBlID09IFNUX05PTlZPTEFUSUxFKSkgCiAgICAgICAgICovCiAgICAgICAgLyoKICAgICAgICAgKiBUaGlzIHZlcnNpb24gb25seSBzdXBwb3J0cyB2b2xhdGlsZSBzdG9yYWdlCiAgICAgICAgICovCiAgICAgICAgaWYgKGxvbmdfcmV0ID09IGFwdHItPnN0b3JhZ2VUeXBlKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3ZhY21BY2Nlc3NDb250ZXh0TWF0Y2goaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIC8qCiAgICAgKiB2YXJpYWJsZXMgd2UgbWF5IHVzZSBsYXRlciAKICAgICAqLwogICAgc3RhdGljIGxvbmcgICAgIGxvbmdfcmV0OwogICAgc3RydWN0IHZhY21fYWNjZXNzRW50cnkgKmFwdHI7CgogICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YWNtX3ZhcnMiLAogICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB2YWNtQWNjZXNzQ29udGV4dE1hdGNoIG5vdCBBU05fSU5URUdFUlxuIikpOwogICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICB9CiAgICBpZiAodmFyX3ZhbF9sZW4gPiBzaXplb2YobG9uZ19yZXQpKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsCiAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHZhY21BY2Nlc3NDb250ZXh0TWF0Y2g6IGJhZCBsZW5ndGhcbiIpKTsKICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdMRU5HVEg7CiAgICB9CiAgICBpZiAoYWN0aW9uID09IENPTU1JVCkgewogICAgICAgIC8qCiAgICAgICAgICogZG9uJ3QgYWxsb3cgY3JlYXRpb25zIGhlcmUgCiAgICAgICAgICovCiAgICAgICAgaWYgKChhcHRyID0gYWNjZXNzX3BhcnNlX2FjY2Vzc0VudHJ5KG5hbWUsIG5hbWVfbGVuKSkgPT0gTlVMTCkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsKICAgICAgICB9CiAgICAgICAgbG9uZ19yZXQgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGlmIChsb25nX3JldCA9PSBDTV9FWEFDVCB8fCBsb25nX3JldCA9PSBDTV9QUkVGSVgpIHsKICAgICAgICAgICAgYXB0ci0+Y29udGV4dE1hdGNoID0gbG9uZ19yZXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVkFMVUU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV92YWNtQWNjZXNzUmVhZFZpZXdOYW1lKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBzdHJpbmdbVkFDTVNUUklOR0xFTl07CiAgICBzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqYXB0ciA9IE5VTEw7CiAgICBzdGF0aWMgaW50ICAgICAgcmVzZXRPbkZhaWw7CgogICAgaWYgKGFjdGlvbiA9PSBSRVNFUlZFMSkgewogICAgICAgIHJlc2V0T25GYWlsID0gMDsKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB2YWNtQWNjZXNzUmVhZFZpZXdOYW1lIG5vdCBBU05fT0NURVRfU1RSXG4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGlmICh2YXJfdmFsX2xlbiA+IDMyKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YWNtX3ZhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdmFjbUFjY2Vzc1JlYWRWaWV3TmFtZTogYmFkIGxlbmd0aFxuIikpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdMRU5HVEg7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gUkVTRVJWRTIpIHsKICAgICAgICBpZiAoKGFwdHIgPSBhY2Nlc3NfcGFyc2VfYWNjZXNzRW50cnkobmFtZSwgbmFtZV9sZW4pKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc2V0T25GYWlsID0gMTsKICAgICAgICAgICAgbWVtY3B5KHN0cmluZywgYXB0ci0+dmlld3NbVkFDTV9WSUVXX1JFQURdLCBWQUNNU1RSSU5HTEVOKTsKICAgICAgICAgICAgbWVtY3B5KGFwdHItPnZpZXdzW1ZBQ01fVklFV19SRUFEXSwgdmFyX3ZhbCwgdmFyX3ZhbF9sZW4pOwogICAgICAgICAgICBhcHRyLT52aWV3c1tWQUNNX1ZJRVdfUkVBRF1bdmFyX3ZhbF9sZW5dID0gMDsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBGUkVFKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBUcnkgdG8gdW5kbyB0aGUgU0VUIGhlcmUgKGFibm9ybWFsIHVzYWdlIG9mIEZSRUUgY2xhdXNlKSAgCiAgICAgICAgICovCiAgICAgICAgaWYgKChhcHRyID0gYWNjZXNzX3BhcnNlX2FjY2Vzc0VudHJ5KG5hbWUsIG5hbWVfbGVuKSkgIT0gTlVMTCAmJgogICAgICAgICAgICByZXNldE9uRmFpbCkgewogICAgICAgICAgICBtZW1jcHkoYXB0ci0+dmlld3NbVkFDTV9WSUVXX1JFQURdLCBzdHJpbmcsIHZhcl92YWxfbGVuKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3ZhY21BY2Nlc3NXcml0ZVZpZXdOYW1lKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgc3RyaW5nW1ZBQ01TVFJJTkdMRU5dOwogICAgc3RydWN0IHZhY21fYWNjZXNzRW50cnkgKmFwdHIgPSBOVUxMOwogICAgc3RhdGljIGludCAgICAgIHJlc2V0T25GYWlsOwoKICAgIGlmIChhY3Rpb24gPT0gUkVTRVJWRTEpIHsKICAgICAgICByZXNldE9uRmFpbCA9IDA7CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YWNtX3ZhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdmFjbUFjY2Vzc1dyaXRlVmlld05hbWUgbm90IEFTTl9PQ1RFVF9TVFJcbiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhcl92YWxfbGVuID4gMzIpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB2YWNtQWNjZXNzV3JpdGVWaWV3TmFtZTogYmFkIGxlbmd0aFxuIikpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdMRU5HVEg7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gUkVTRVJWRTIpIHsKICAgICAgICBpZiAoKGFwdHIgPSBhY2Nlc3NfcGFyc2VfYWNjZXNzRW50cnkobmFtZSwgbmFtZV9sZW4pKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc2V0T25GYWlsID0gMTsKICAgICAgICAgICAgbWVtY3B5KHN0cmluZywgYXB0ci0+dmlld3NbVkFDTV9WSUVXX1dSSVRFXSwgVkFDTVNUUklOR0xFTik7CiAgICAgICAgICAgIG1lbWNweShhcHRyLT52aWV3c1tWQUNNX1ZJRVdfV1JJVEVdLCB2YXJfdmFsLCB2YXJfdmFsX2xlbik7CiAgICAgICAgICAgIGFwdHItPnZpZXdzW1ZBQ01fVklFV19XUklURV1bdmFyX3ZhbF9sZW5dID0gMDsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBGUkVFKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBUcnkgdG8gdW5kbyB0aGUgU0VUIGhlcmUgKGFibm9ybWFsIHVzYWdlIG9mIEZSRUUgY2xhdXNlKSAgCiAgICAgICAgICovCiAgICAgICAgaWYgKChhcHRyID0gYWNjZXNzX3BhcnNlX2FjY2Vzc0VudHJ5KG5hbWUsIG5hbWVfbGVuKSkgIT0gTlVMTCAmJgogICAgICAgICAgICByZXNldE9uRmFpbCkgewogICAgICAgICAgICBtZW1jcHkoYXB0ci0+dmlld3NbVkFDTV9WSUVXX1dSSVRFXSwgc3RyaW5nLCB2YXJfdmFsX2xlbik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV92YWNtQWNjZXNzTm90aWZ5Vmlld05hbWUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgc3RyaW5nW1ZBQ01TVFJJTkdMRU5dOwogICAgc3RydWN0IHZhY21fYWNjZXNzRW50cnkgKmFwdHIgPSBOVUxMOwogICAgc3RhdGljIGludCAgICAgIHJlc2V0T25GYWlsOwoKICAgIGlmIChhY3Rpb24gPT0gUkVTRVJWRTEpIHsKICAgICAgICByZXNldE9uRmFpbCA9IDA7CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YWNtX3ZhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdmFjbUFjY2Vzc05vdGlmeVZpZXdOYW1lIG5vdCBBU05fT0NURVRfU1RSXG4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGlmICh2YXJfdmFsX2xlbiA+IDMyKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YWNtX3ZhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdmFjbUFjY2Vzc05vdGlmeVZpZXdOYW1lOiBiYWQgbGVuZ3RoXG4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBSRVNFUlZFMikgewogICAgICAgIGlmICgoYXB0ciA9IGFjY2Vzc19wYXJzZV9hY2Nlc3NFbnRyeShuYW1lLCBuYW1lX2xlbikpID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzZXRPbkZhaWwgPSAxOwogICAgICAgICAgICBtZW1jcHkoc3RyaW5nLCBhcHRyLT52aWV3c1tWQUNNX1ZJRVdfTk9USUZZXSwgVkFDTVNUUklOR0xFTik7CiAgICAgICAgICAgIG1lbWNweShhcHRyLT52aWV3c1tWQUNNX1ZJRVdfTk9USUZZXSwgdmFyX3ZhbCwgdmFyX3ZhbF9sZW4pOwogICAgICAgICAgICBhcHRyLT52aWV3c1tWQUNNX1ZJRVdfTk9USUZZXVt2YXJfdmFsX2xlbl0gPSAwOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IEZSRUUpIHsKICAgICAgICAvKgogICAgICAgICAqIFRyeSB0byB1bmRvIHRoZSBTRVQgaGVyZSAoYWJub3JtYWwgdXNhZ2Ugb2YgRlJFRSBjbGF1c2UpICAKICAgICAgICAgKi8KICAgICAgICBpZiAoKGFwdHIgPSBhY2Nlc3NfcGFyc2VfYWNjZXNzRW50cnkobmFtZSwgbmFtZV9sZW4pKSAhPSBOVUxMICYmCiAgICAgICAgICAgIHJlc2V0T25GYWlsKSB7CiAgICAgICAgICAgIG1lbWNweShhcHRyLT52aWV3c1tWQUNNX1ZJRVdfTk9USUZZXSwgc3RyaW5nLCB2YXJfdmFsX2xlbik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp2aWV3X3BhcnNlX29pZChvaWQgKiBvaWRJbmRleCwgc2l6ZV90IG9pZExlbiwKICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKnZpZXdOYW1lLCBzaXplX3QgKiB2aWV3TmFtZUxlbiwKICAgICAgICAgICAgICAgb2lkICoqIHN1YnRyZWUsIHNpemVfdCAqIHN1YnRyZWVMZW4pCnsKICAgIGludCAgICAgICAgICAgICB2aWV3TmFtZUwsIHN1YnRyZWVMLCBpOwoKICAgIC8qCiAgICAgKiBmaXJzdCBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIG9pZCAKICAgICAqLwogICAgaWYgKChvaWRMZW4gPD0gMCkgfHwgKCFvaWRJbmRleCkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgIH0KICAgIHZpZXdOYW1lTCA9IG9pZEluZGV4WzBdOwogICAgc3VidHJlZUwgPSBvaWRMZW4gLSB2aWV3TmFtZUwgLSAxOyAgLyogdGhlIGluaXRpYWwgbmFtZSBsZW5ndGggKi8KCiAgICAvKgogICAgICogaXRzIHZhbGlkLCBtYWxsb2MgdGhlIHNwYWNlIGFuZCBzdG9yZSB0aGUgcmVzdWx0cyAKICAgICAqLwogICAgaWYgKHZpZXdOYW1lID09IE5VTEwgfHwgc3VidHJlZSA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1JFU09VUkNFVU5BVkFJTEFCTEU7CiAgICB9CgogICAgaWYgKHN1YnRyZWVMIDwgMCkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0NSRUFUSU9OOwogICAgfQoKICAgICp2aWV3TmFtZSA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyh2aWV3TmFtZUwgKyAxKTsKCiAgICBpZiAoKnZpZXdOYW1lID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfUkVTT1VSQ0VVTkFWQUlMQUJMRTsKICAgIH0KCiAgICAqc3VidHJlZSA9IChvaWQgKikgbWFsbG9jKHN1YnRyZWVMICogc2l6ZW9mKG9pZCkpOwogICAgaWYgKCpzdWJ0cmVlID09IE5VTEwpIHsKICAgICAgICBmcmVlKCp2aWV3TmFtZSk7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1JFU09VUkNFVU5BVkFJTEFCTEU7CiAgICB9CgogICAgKnN1YnRyZWVMZW4gPSBzdWJ0cmVlTDsKICAgICp2aWV3TmFtZUxlbiA9IHZpZXdOYW1lTDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgdmlld05hbWVMOyBpKyspIHsKICAgICAgICBpZiAob2lkSW5kZXhbaSArIDFdID4gMjU1KSB7CiAgICAgICAgICAgIGZyZWUoKnZpZXdOYW1lKTsKICAgICAgICAgICAgZnJlZSgqc3VidHJlZSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgIH0KICAgICAgICB2aWV3TmFtZVswXVtpXSA9ICh1bnNpZ25lZCBjaGFyKSBvaWRJbmRleFtpICsgMV07CiAgICB9CiAgICB2aWV3TmFtZVswXVt2aWV3TmFtZUxdID0gMDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgc3VidHJlZUw7IGkrKykgewogICAgICAgIHN1YnRyZWVbMF1baV0gPSAob2lkKSBvaWRJbmRleFtpICsgdmlld05hbWVMICsgMV07CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCm9pZCAgICAgICAgICAgICoKdmlld19nZW5lcmF0ZV9PSUQob2lkICogcHJlZml4LCBzaXplX3QgcHJlZml4TGVuLAogICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmFjbV92aWV3RW50cnkgKiB2cHRyLCBzaXplX3QgKiBsZW5ndGgpCnsKICAgIG9pZCAgICAgICAgICAgICppbmRleE9pZDsKICAgIGludCAgICAgICAgICAgICBpLCB2aWV3TmFtZUxlbiwgdmlld1N1YnRyZWVMZW47CgogICAgdmlld05hbWVMZW4gPSBzdHJsZW4odnB0ci0+dmlld05hbWUpOwogICAgdmlld1N1YnRyZWVMZW4gPSB2cHRyLT52aWV3U3VidHJlZUxlbjsKCiAgICAqbGVuZ3RoID0gMiArIHZpZXdOYW1lTGVuICsgdmlld1N1YnRyZWVMZW4gKyBwcmVmaXhMZW47CiAgICBpbmRleE9pZCA9IChvaWQgKikgbWFsbG9jKCpsZW5ndGggKiBzaXplb2Yob2lkKSk7CiAgICBpZiAoaW5kZXhPaWQpIHsKICAgICAgICBtZW1tb3ZlKGluZGV4T2lkLCBwcmVmaXgsIHByZWZpeExlbiAqIHNpemVvZihvaWQpKTsKCiAgICAgICAgaW5kZXhPaWRbcHJlZml4TGVuXSA9IHZpZXdOYW1lTGVuOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCB2aWV3TmFtZUxlbjsgaSsrKQogICAgICAgICAgICBpbmRleE9pZFt2aWV3TmFtZUxlbiArIDEgKyBpXSA9IChvaWQpIHZwdHItPnZpZXdOYW1lW2ldOwoKICAgICAgICBpbmRleE9pZFtwcmVmaXhMZW4gKyB2aWV3TmFtZUxlbiArIDFdID0gdmlld1N1YnRyZWVMZW47CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHZpZXdTdWJ0cmVlTGVuOyBpKyspCiAgICAgICAgICAgIGluZGV4T2lkW3ByZWZpeExlbiArIHZpZXdOYW1lTGVuICsgMiArIGldID0KICAgICAgICAgICAgICAgIChvaWQpIHZwdHItPnZpZXdTdWJ0cmVlW2ldOwoKICAgIH0KICAgIHJldHVybiBpbmRleE9pZDsKCn0KCnN0cnVjdCB2YWNtX3ZpZXdFbnRyeSAqCnZpZXdfcGFyc2Vfdmlld0VudHJ5KG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RydWN0IHZhY21fdmlld0VudHJ5ICp2cHRyOwoKICAgIGNoYXIgICAgICAgICAgICpuZXdWaWV3TmFtZTsKICAgIG9pZCAgICAgICAgICAgICpuZXdWaWV3U3VidHJlZTsKICAgIHNpemVfdCAgICAgICAgICB2aWV3TmFtZUxlbiwgdmlld1N1YnRyZWVMZW47CgogICAgaWYgKHZpZXdfcGFyc2Vfb2lkKCZuYW1lW1ZJRVdfTUlCX0xFTkdUSF0sIG5hbWVfbGVuIC0gVklFV19NSUJfTEVOR1RILAogICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKiopICYgbmV3Vmlld05hbWUsICZ2aWV3TmFtZUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAob2lkICoqKSAmIG5ld1ZpZXdTdWJ0cmVlLCAmdmlld1N1YnRyZWVMZW4pKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIHZwdHIgPQogICAgICAgIHZhY21fZ2V0Vmlld0VudHJ5KG5ld1ZpZXdOYW1lLCAmbmV3Vmlld1N1YnRyZWVbMV0sIHZpZXdTdWJ0cmVlTGVuLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVkFDTV9NT0RFX0lHTk9SRV9NQVNLKTsKICAgIGZyZWUobmV3Vmlld05hbWUpOwogICAgZnJlZShuZXdWaWV3U3VidHJlZSk7CgogICAgcmV0dXJuIHZwdHI7Cgp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB2YWNtX3BhcnNlX3ZpZXdFbnRyeSgpICovCgppbnQKd3JpdGVfdmFjbVZpZXdTdGF0dXMoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgbG9uZyAgICAgbG9uZ19yZXQ7CiAgICBjaGFyICAgICAgICAgICAqbmV3Vmlld05hbWU7CiAgICBvaWQgICAgICAgICAgICAqbmV3Vmlld1N1YnRyZWU7CiAgICBzaXplX3QgICAgICAgICAgdmlld05hbWVMZW4sIHZpZXdTdWJ0cmVlTGVuOwogICAgc3RydWN0IHZhY21fdmlld0VudHJ5ICp2cHRyOwogICAgaW50ICAgICAgICAgICAgIHJjID0gMDsKCiAgICBpZiAoYWN0aW9uID09IFJFU0VSVkUxKSB7CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBpZiAodmFyX3ZhbF9sZW4gIT0gc2l6ZW9mKGxvbmdfcmV0KSkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdMRU5HVEg7CiAgICAgICAgfQogICAgICAgIGxvbmdfcmV0ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfTk9UUkVBRFkgfHwgbG9uZ19yZXQgPCAxIHx8IGxvbmdfcmV0ID4gNikgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogU2VlIGlmIHdlIGNhbiBwYXJzZSB0aGUgb2lkIGZvciBtb2RlbC9uYW1lIGZpcnN0LiAgCiAgICAgICAgICovCiAgICAgICAgaWYgKChyYyA9CiAgICAgICAgICAgICB2aWV3X3BhcnNlX29pZCgmbmFtZVtWSUVXX01JQl9MRU5HVEhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9sZW4gLSBWSUVXX01JQl9MRU5HVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICoqKSAmIG5ld1ZpZXdOYW1lLCAmdmlld05hbWVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2lkICoqKSAmIG5ld1ZpZXdTdWJ0cmVlLCAmdmlld1N1YnRyZWVMZW4pKSkgewogICAgICAgICAgICByZXR1cm4gcmM7CiAgICAgICAgfQoKICAgICAgICBpZiAodmlld05hbWVMZW4gPCAxIHx8IHZpZXdOYW1lTGVuID4gMzIpIHsKICAgICAgICAgICAgZnJlZShuZXdWaWV3TmFtZSk7CiAgICAgICAgICAgIGZyZWUobmV3Vmlld1N1YnRyZWUpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9DUkVBVElPTjsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogTm93IHNlZSBpZiBhIGdyb3VwIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlc2UgaW5kZXggdmFsdWVzLiAgCiAgICAgICAgICovCiAgICAgICAgdnB0ciA9CiAgICAgICAgICAgIHZhY21fZ2V0Vmlld0VudHJ5KG5ld1ZpZXdOYW1lLCAmbmV3Vmlld1N1YnRyZWVbMV0sIHZpZXdTdWJ0cmVlTGVuLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQ01fTU9ERV9JR05PUkVfTUFTSyk7CiAgICAgICAgaWYgKHZwdHIgJiYKICAgICAgICAgICAgbmV0c25tcF9vaWRfZXF1YWxzKHZwdHItPnZpZXdTdWJ0cmVlICsgMSwgdnB0ci0+dmlld1N1YnRyZWVMZW4gLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Vmlld1N1YnRyZWUgKyAxLCB2aWV3U3VidHJlZUxlbiAtIDEpICE9IDApIHsKICAgICAgICAgICAgdnB0ciA9IE5VTEw7CiAgICAgICAgfQogICAgICAgIGlmICh2cHRyICE9IE5VTEwpIHsKICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0NSRUFURUFOREdPIHx8IGxvbmdfcmV0ID09IFJTX0NSRUFURUFORFdBSVQpIHsKICAgICAgICAgICAgICAgIGZyZWUobmV3Vmlld05hbWUpOwogICAgICAgICAgICAgICAgZnJlZShuZXdWaWV3U3VidHJlZSk7CiAgICAgICAgICAgICAgICBsb25nX3JldCA9IFJTX05PVFJFQURZOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsb25nX3JldCA9PSBSU19ERVNUUk9ZICYmIHZwdHItPnZpZXdTdG9yYWdlVHlwZSA9PSBTVF9QRVJNQU5FTlQpIHsKICAgICAgICAgICAgICAgIGZyZWUobmV3Vmlld05hbWUpOwogICAgICAgICAgICAgICAgZnJlZShuZXdWaWV3U3VidHJlZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChsb25nX3JldCA9PSBSU19BQ1RJVkUgfHwgbG9uZ19yZXQgPT0gUlNfTk9USU5TRVJWSUNFKSB7CiAgICAgICAgICAgICAgICBmcmVlKG5ld1ZpZXdOYW1lKTsKICAgICAgICAgICAgICAgIGZyZWUobmV3Vmlld1N1YnRyZWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsb25nX3JldCA9PSBSU19DUkVBVEVBTkRHTyB8fCBsb25nX3JldCA9PSBSU19DUkVBVEVBTkRXQUlUKSB7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIEdlbmVyYXRlIGEgbmV3IGdyb3VwIGVudHJ5LiAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICgodnB0ciA9CiAgICAgICAgICAgICAgICAgICAgIHZhY21fY3JlYXRlVmlld0VudHJ5KG5ld1ZpZXdOYW1lLCAmbmV3Vmlld1N1YnRyZWVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdTdWJ0cmVlTGVuIC0gMSkpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBmcmVlKG5ld1ZpZXdOYW1lKTsKICAgICAgICAgICAgICAgICAgICBmcmVlKG5ld1ZpZXdTdWJ0cmVlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfR0VORVJSOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBTZXQgZGVmYXVsdHMuICAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdnB0ci0+dmlld1N0b3JhZ2VUeXBlID0gU1RfTk9OVk9MQVRJTEU7CiAgICAgICAgICAgICAgICB2cHRyLT52aWV3U3RhdHVzID0gUlNfTk9UUkVBRFk7CiAgICAgICAgICAgICAgICB2cHRyLT52aWV3VHlwZSA9IFNOTVBfVklFV19JTkNMVURFRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmcmVlKG5ld1ZpZXdOYW1lKTsKICAgICAgICBmcmVlKG5ld1ZpZXdTdWJ0cmVlKTsKICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IEFDVElPTikgewogICAgICAgIHZpZXdfcGFyc2Vfb2lkKCZuYW1lW1ZJRVdfTUlCX0xFTkdUSF0sIG5hbWVfbGVuIC0gVklFV19NSUJfTEVOR1RILAogICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKiopICYgbmV3Vmlld05hbWUsICZ2aWV3TmFtZUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAob2lkICoqKSAmIG5ld1ZpZXdTdWJ0cmVlLCAmdmlld1N1YnRyZWVMZW4pOwoKICAgICAgICB2cHRyID0KICAgICAgICAgICAgdmFjbV9nZXRWaWV3RW50cnkobmV3Vmlld05hbWUsICZuZXdWaWV3U3VidHJlZVsxXSwgdmlld1N1YnRyZWVMZW4tMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFDTV9NT0RFX0lHTk9SRV9NQVNLKTsKCiAgICAgICAgaWYgKHZwdHIgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5ER08gfHwgbG9uZ19yZXQgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgICAgICAgICB2cHRyLT52aWV3U3RhdHVzID0gUlNfQUNUSVZFOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxvbmdfcmV0ID09IFJTX0NSRUFURUFORFdBSVQpIHsKICAgICAgICAgICAgICAgIHZwdHItPnZpZXdTdGF0dXMgPSBSU19OT1RJTlNFUlZJQ0U7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobG9uZ19yZXQgPT0gUlNfTk9USU5TRVJWSUNFKSB7CiAgICAgICAgICAgICAgICBpZiAodnB0ci0+dmlld1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICAgICAgICAgICAgICB2cHRyLT52aWV3U3RhdHVzID0gUlNfTk9USU5TRVJWSUNFOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2cHRyLT52aWV3U3RhdHVzID09IFJTX05PVFJFQURZKSB7CiAgICAgICAgICAgICAgICAgICAgZnJlZShuZXdWaWV3TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgZnJlZShuZXdWaWV3U3VidHJlZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUobmV3Vmlld05hbWUpOwogICAgICAgIGZyZWUobmV3Vmlld1N1YnRyZWUpOwogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gQ09NTUlUKSB7CiAgICAgICAgdmlld19wYXJzZV9vaWQoJm5hbWVbVklFV19NSUJfTEVOR1RIXSwgbmFtZV9sZW4gLSBWSUVXX01JQl9MRU5HVEgsCiAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKikgJiBuZXdWaWV3TmFtZSwgJnZpZXdOYW1lTGVuLAogICAgICAgICAgICAgICAgICAgICAgIChvaWQgKiopICYgbmV3Vmlld1N1YnRyZWUsICZ2aWV3U3VidHJlZUxlbik7CgogICAgICAgIHZwdHIgPQogICAgICAgICAgICB2YWNtX2dldFZpZXdFbnRyeShuZXdWaWV3TmFtZSwgJm5ld1ZpZXdTdWJ0cmVlWzFdLCB2aWV3U3VidHJlZUxlbi0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUNNX01PREVfSUdOT1JFX01BU0spOwoKICAgICAgICBpZiAodnB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChsb25nX3JldCA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICB2YWNtX2Rlc3Ryb3lWaWV3RW50cnkobmV3Vmlld05hbWUsIG5ld1ZpZXdTdWJ0cmVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdTdWJ0cmVlTGVuKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmcmVlKG5ld1ZpZXdOYW1lKTsKICAgICAgICBmcmVlKG5ld1ZpZXdTdWJ0cmVlKTsKICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IFVORE8pIHsKICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5ER08gfHwgbG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5EV0FJVCkgewogICAgICAgICAgICB2aWV3X3BhcnNlX29pZCgmbmFtZVtWSUVXX01JQl9MRU5HVEhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiAtIFZJRVdfTUlCX0xFTkdUSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKikgJiBuZXdWaWV3TmFtZSwgJnZpZXdOYW1lTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAob2lkICoqKSAmIG5ld1ZpZXdTdWJ0cmVlLCAmdmlld1N1YnRyZWVMZW4pOwoKICAgICAgICAgICAgdnB0ciA9IHZhY21fZ2V0Vmlld0VudHJ5KG5ld1ZpZXdOYW1lLCAmbmV3Vmlld1N1YnRyZWVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3U3VidHJlZUxlbi0xLCBWQUNNX01PREVfSUdOT1JFX01BU0spOwoKICAgICAgICAgICAgaWYgKHZwdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgdmFjbV9kZXN0cm95Vmlld0VudHJ5KG5ld1ZpZXdOYW1lLCBuZXdWaWV3U3VidHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3U3VidHJlZUxlbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJlZShuZXdWaWV3TmFtZSk7CiAgICAgICAgICAgIGZyZWUobmV3Vmlld1N1YnRyZWUpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3ZhY21WaWV3U3RvcmFnZVR5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIGxvbmcgICAgICAgICAgICBuZXdWYWx1ZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICBzdGF0aWMgbG9uZyAgICAgb2xkVmFsdWU7CiAgICBzdHJ1Y3QgdmFjbV92aWV3RW50cnkgKnZwdHIgPSBOVUxMOwoKICAgIGlmIChhY3Rpb24gPT0gUkVTRVJWRTEpIHsKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGlmICh2YXJfdmFsX2xlbiAhPSBzaXplb2YobG9uZykpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HTEVOR1RIOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IFJFU0VSVkUyKSB7CiAgICAgICAgaWYgKCh2cHRyID0gdmlld19wYXJzZV92aWV3RW50cnkobmFtZSwgbmFtZV9sZW4pKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgobmV3VmFsdWUgPT0gU1RfVk9MQVRJTEUgfHwgbmV3VmFsdWUgPT0gU1RfTk9OVk9MQVRJTEUpICYmCiAgICAgICAgICAgICAgICAodnB0ci0+dmlld1N0b3JhZ2VUeXBlID09IFNUX1ZPTEFUSUxFIHx8CiAgICAgICAgICAgICAgICAgdnB0ci0+dmlld1N0b3JhZ2VUeXBlID09IFNUX05PTlZPTEFUSUxFKSkgewogICAgICAgICAgICAgICAgb2xkVmFsdWUgPSB2cHRyLT52aWV3U3RvcmFnZVR5cGU7CiAgICAgICAgICAgICAgICB2cHRyLT52aWV3U3RvcmFnZVR5cGUgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdWYWx1ZSA9PSB2cHRyLT52aWV3U3RvcmFnZVR5cGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gVU5ETykgewogICAgICAgIGlmICgodnB0ciA9IHZpZXdfcGFyc2Vfdmlld0VudHJ5KG5hbWUsIG5hbWVfbGVuKSkgIT0gTlVMTCkgewogICAgICAgICAgICB2cHRyLT52aWV3U3RvcmFnZVR5cGUgPSBvbGRWYWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV92YWNtVmlld01hc2soaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgc3RyaW5nW1ZBQ01TVFJJTkdMRU5dOwogICAgc3RhdGljIGxvbmcgICAgIGxlbmd0aDsKICAgIHN0cnVjdCB2YWNtX3ZpZXdFbnRyeSAqdnB0ciA9IE5VTEw7CgogICAgaWYgKGFjdGlvbiA9PSBSRVNFUlZFMSkgewogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBpZiAodmFyX3ZhbF9sZW4gPiAxNikgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdMRU5HVEg7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gUkVTRVJWRTIpIHsKICAgICAgICBpZiAoKHZwdHIgPSB2aWV3X3BhcnNlX3ZpZXdFbnRyeShuYW1lLCBuYW1lX2xlbikpID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWVtY3B5KHN0cmluZywgdnB0ci0+dmlld01hc2ssIHZwdHItPnZpZXdNYXNrTGVuKTsKICAgICAgICAgICAgbGVuZ3RoID0gdnB0ci0+dmlld01hc2tMZW47CiAgICAgICAgICAgIG1lbWNweSh2cHRyLT52aWV3TWFzaywgdmFyX3ZhbCwgdmFyX3ZhbF9sZW4pOwogICAgICAgICAgICB2cHRyLT52aWV3TWFza0xlbiA9IHZhcl92YWxfbGVuOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IEZSRUUpIHsKICAgICAgICBpZiAoKHZwdHIgPSB2aWV3X3BhcnNlX3ZpZXdFbnRyeShuYW1lLCBuYW1lX2xlbikpICE9IE5VTEwpIHsKICAgICAgICAgICAgbWVtY3B5KHZwdHItPnZpZXdNYXNrLCBzdHJpbmcsIGxlbmd0aCk7CiAgICAgICAgICAgIHZwdHItPnZpZXdNYXNrTGVuID0gbGVuZ3RoOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdmFjbVZpZXdUeXBlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIGxvbmcgICAgICAgICAgICBuZXdWYWx1ZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICBzdGF0aWMgbG9uZyAgICAgb2xkVmFsdWU7CiAgICBzdHJ1Y3QgdmFjbV92aWV3RW50cnkgKnZwdHIgPSBOVUxMOwoKICAgIGlmIChhY3Rpb24gPT0gUkVTRVJWRTEpIHsKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGlmICh2YXJfdmFsX2xlbiAhPSBzaXplb2YobG9uZykpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HTEVOR1RIOwogICAgICAgIH0KICAgICAgICBpZiAobmV3VmFsdWUgPCAxIHx8IG5ld1ZhbHVlID4gMikgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBSRVNFUlZFMikgewogICAgICAgIGlmICgodnB0ciA9IHZpZXdfcGFyc2Vfdmlld0VudHJ5KG5hbWUsIG5hbWVfbGVuKSkgPT0gTlVMTCkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvbGRWYWx1ZSA9IHZwdHItPnZpZXdUeXBlOwogICAgICAgICAgICB2cHRyLT52aWV3VHlwZSA9IG5ld1ZhbHVlOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IFVORE8pIHsKICAgICAgICBpZiAoKHZwdHIgPSB2aWV3X3BhcnNlX3ZpZXdFbnRyeShuYW1lLCBuYW1lX2xlbikpICE9IE5VTEwpIHsKICAgICAgICAgICAgdnB0ci0+dmlld1R5cGUgPSBvbGRWYWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV92YWNtVmlld1NwaW5Mb2NrKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgbG9uZyAgICAgbG9uZ19yZXQ7CgogICAgaWYgKGFjdGlvbiA9PSBSRVNFUlZFMSkgewogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB2YWNtVmlld1NwaW5Mb2NrIG5vdCBBU05fSU5URUdFUlxuIikpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBpZiAodmFyX3ZhbF9sZW4gIT0gc2l6ZW9mKGxvbmdfcmV0KSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFjbV92YXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHZhY21WaWV3U3BpbkxvY2s6IGJhZCBsZW5ndGhcbiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HTEVOR1RIOwogICAgICAgIH0KICAgICAgICBsb25nX3JldCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgaWYgKGxvbmdfcmV0ICE9IChsb25nKSB2YWNtVmlld1NwaW5Mb2NrKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBDT01NSVQpIHsKICAgICAgICBpZiAodmFjbVZpZXdTcGluTG9jayA9PSAyMTQ3NDgzNjQ3KSB7CiAgICAgICAgICAgIHZhY21WaWV3U3BpbkxvY2sgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhY21WaWV3U3BpbkxvY2srKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQo=