ZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pOGsuYyBiL2RyaXZlcnMvY2hhci9pOGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODExOTc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2k4ay5jCkBAIC0wLDAgKzEsNzg4IEBACisvKgorICogaThrLmMgLS0gTGludXggZHJpdmVyIGZvciBhY2Nlc3NpbmcgdGhlIFNNTSBCSU9TIG9uIERlbGwgbGFwdG9wcy4KKyAqCSAgICBTZWUgaHR0cDovL3d3dy5kZWJpYW4ub3JnL35kei9pOGsvIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKgkgICAgYW5kIGZvciBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1hc3NpbW8gRGFsIFpvdHRvIDxkekBkZWJpYW4ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FwbV9iaW9zLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L2k4ay5oPgorCisjZGVmaW5lIEk4S19WRVJTSU9OCQkiMS4xMyAxNC8wNS8yMDAyIgorCisjZGVmaW5lIEk4S19TTU1fRk5fU1RBVFVTCTB4MDAyNQorI2RlZmluZSBJOEtfU01NX1BPV0VSX1NUQVRVUwkweDAwNjkKKyNkZWZpbmUgSThLX1NNTV9TRVRfRkFOCQkweDAxYTMKKyNkZWZpbmUgSThLX1NNTV9HRVRfRkFOCQkweDAwYTMKKyNkZWZpbmUgSThLX1NNTV9HRVRfU1BFRUQJMHgwMmEzCisjZGVmaW5lIEk4S19TTU1fR0VUX1RFTVAJMHgxMGEzCisjZGVmaW5lIEk4S19TTU1fR0VUX0RFTExfU0lHCTB4ZmZhMworI2RlZmluZSBJOEtfU01NX0JJT1NfVkVSU0lPTgkweDAwYTYKKworI2RlZmluZSBJOEtfRkFOX01VTFQJCTMwCisjZGVmaW5lIEk4S19NQVhfVEVNUAkJMTI3CisKKyNkZWZpbmUgSThLX0ZOX05PTkUJCTB4MDAKKyNkZWZpbmUgSThLX0ZOX1VQCQkweDAxCisjZGVmaW5lIEk4S19GTl9ET1dOCQkweDAyCisjZGVmaW5lIEk4S19GTl9NVVRFCQkweDA0CisjZGVmaW5lIEk4S19GTl9NQVNLCQkweDA3CisjZGVmaW5lIEk4S19GTl9TSElGVAkJOAorCisjZGVmaW5lIEk4S19QT1dFUl9BQwkJMHgwNQorI2RlZmluZSBJOEtfUE9XRVJfQkFUVEVSWQkweDAxCisKKyNkZWZpbmUgSThLX1RFTVBFUkFUVVJFX0JVRwkxCisKKyNkZWZpbmUgREVMTF9TSUdOQVRVUkUJCSJEZWxsIENvbXB1dGVyIgorCitzdGF0aWMgY2hhciAqc3VwcG9ydGVkX21vZGVsc1tdID0geworICAgICJJbnNwaXJvbiIsCisgICAgIkxhdGl0dWRlIiwKKyAgICBOVUxMCit9OworCitzdGF0aWMgY2hhciBzeXN0ZW1fdmVuZG9yWzQ4XSA9ICI/IjsKK3N0YXRpYyBjaGFyIHByb2R1Y3RfbmFtZSBbNDhdID0gIj8iOworc3RhdGljIGNoYXIgYmlvc192ZXJzaW9uIFs0XSAgPSAiPyI7CitzdGF0aWMgY2hhciBzZXJpYWxfbnVtYmVyWzE2XSA9ICI/IjsKKworTU9EVUxFX0FVVEhPUigiTWFzc2ltbyBEYWwgWm90dG8gKGR6QGRlYmlhbi5vcmcpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgYWNjZXNzaW5nIFNNTSBCSU9TIG9uIERlbGwgbGFwdG9wcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGZvcmNlOworbW9kdWxlX3BhcmFtKGZvcmNlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2UsICJGb3JjZSBsb2FkaW5nIHdpdGhvdXQgY2hlY2tpbmcgZm9yIHN1cHBvcnRlZCBtb2RlbHMiKTsKKworc3RhdGljIGludCByZXN0cmljdGVkOworbW9kdWxlX3BhcmFtKHJlc3RyaWN0ZWQsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZXN0cmljdGVkLCAiQWxsb3cgZmFuIGNvbnRyb2wgaWYgU1lTX0FETUlOIGNhcGFiaWxpdHkgc2V0Iik7CisKK3N0YXRpYyBpbnQgcG93ZXJfc3RhdHVzOworbW9kdWxlX3BhcmFtKHBvd2VyX3N0YXR1cywgYm9vbCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX3N0YXR1cywgIlJlcG9ydCBwb3dlciBzdGF0dXMgaW4gL3Byb2MvaThrIik7CisKK3N0YXRpYyBzc2l6ZV90IGk4a19yZWFkKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOworc3RhdGljIGludCBpOGtfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKKwkJICAgICB1bnNpZ25lZCBsb25nKTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaThrX2ZvcHMgPSB7CisgICAgLnJlYWQJPSBpOGtfcmVhZCwKKyAgICAuaW9jdGwJPSBpOGtfaW9jdGwsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IGVheDsKKyAgICB1bnNpZ25lZCBpbnQgZWJ4IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyAgICB1bnNpZ25lZCBpbnQgZWN4IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyAgICB1bnNpZ25lZCBpbnQgZWR4IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyAgICB1bnNpZ25lZCBpbnQgZXNpIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyAgICB1bnNpZ25lZCBpbnQgZWRpIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gU01NUmVnaXN0ZXJzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdTgJdHlwZTsKKyAgICB1OAlsZW5ndGg7CisgICAgdTE2CWhhbmRsZTsKK30gRE1JSGVhZGVyOworCisvKgorICogQ2FsbCB0aGUgU3lzdGVtIE1hbmFnZW1lbnQgTW9kZSBCSU9TLiBDb2RlIHByb3ZpZGVkIGJ5IEpvbmF0aGFuIEJ1enphcmQuCisgKi8KK3N0YXRpYyBpbnQgaThrX3NtbShTTU1SZWdpc3RlcnMgKnJlZ3MpCit7CisgICAgaW50IHJjOworICAgIGludCBlYXggPSByZWdzLT5lYXg7CisKKyAgICBhc20oInB1c2hsICUlZWF4XG5cdCIgXAorCSJtb3ZsIDAoJSVlYXgpLCUlZWR4XG5cdCIgXAorCSJwdXNoICUlZWR4XG5cdCIgXAorCSJtb3ZsIDQoJSVlYXgpLCUlZWJ4XG5cdCIgXAorCSJtb3ZsIDgoJSVlYXgpLCUlZWN4XG5cdCIgXAorCSJtb3ZsIDEyKCUlZWF4KSwlJWVkeFxuXHQiIFwKKwkibW92bCAxNiglJWVheCksJSVlc2lcblx0IiBcCisJIm1vdmwgMjAoJSVlYXgpLCUlZWRpXG5cdCIgXAorCSJwb3BsICUlZWF4XG5cdCIgXAorCSJvdXQgJSVhbCwkMHhiMlxuXHQiIFwKKwkib3V0ICUlYWwsJDB4ODRcblx0IiBcCisJInhjaGdsICUlZWF4LCglJWVzcClcblx0IgorCSJtb3ZsICUlZWJ4LDQoJSVlYXgpXG5cdCIgXAorCSJtb3ZsICUlZWN4LDgoJSVlYXgpXG5cdCIgXAorCSJtb3ZsICUlZWR4LDEyKCUlZWF4KVxuXHQiIFwKKwkibW92bCAlJWVzaSwxNiglJWVheClcblx0IiBcCisJIm1vdmwgJSVlZGksMjAoJSVlYXgpXG5cdCIgXAorCSJwb3BsICUlZWR4XG5cdCIgXAorCSJtb3ZsICUlZWR4LDAoJSVlYXgpXG5cdCIgXAorCSJsYWhmXG5cdCIgXAorCSJzaHJsICQ4LCUlZWF4XG5cdCIgXAorCSJhbmRsICQxLCUlZWF4XG4iIFwKKwk6ICI9YSIgKHJjKQorCTogImEiIChyZWdzKQorCTogIiVlYngiLCAiJWVjeCIsICIlZWR4IiwgIiVlc2kiLCAiJWVkaSIsICJtZW1vcnkiKTsKKworICAgIGlmICgocmMgIT0gMCkgfHwgKChyZWdzLT5lYXggJiAweGZmZmYpID09IDB4ZmZmZikgfHwgKHJlZ3MtPmVheCA9PSBlYXgpKSB7CisJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBiaW9zIHZlcnNpb24uIFJldHVybiB0aGUgdmVyc2lvbiBhcyBhbiBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcKKyAqIHRvIHRoZSBhc2NpaSB2YWx1ZSwgZm9yIGV4YW1wbGUgIkExNyIgaXMgcmV0dXJuZWQgYXMgMHgwMDQxMzEzNy4KKyAqLworc3RhdGljIGludCBpOGtfZ2V0X2Jpb3NfdmVyc2lvbih2b2lkKQoreworICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgICAgaW50IHJjOworCisgICAgcmVncy5lYXggPSBJOEtfU01NX0JJT1NfVkVSU0lPTjsKKyAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKKwlyZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIHJlZ3MuZWF4OworfQorCisvKgorICogUmVhZCB0aGUgbWFjaGluZSBpZC4KKyAqLworc3RhdGljIGludCBpOGtfZ2V0X3NlcmlhbF9udW1iZXIodW5zaWduZWQgY2hhciAqYnVmZikKK3sKKyAgICBzdHJsY3B5KGJ1ZmYsIHNlcmlhbF9udW1iZXIsIHNpemVvZihzZXJpYWxfbnVtYmVyKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBGbiBrZXkgc3RhdHVzLgorICovCitzdGF0aWMgaW50IGk4a19nZXRfZm5fc3RhdHVzKHZvaWQpCit7CisgICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgcmM7CisKKyAgICByZWdzLmVheCA9IEk4S19TTU1fRk5fU1RBVFVTOworICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgeworCXJldHVybiByYzsKKyAgICB9CisKKyAgICBzd2l0Y2ggKChyZWdzLmVheCA+PiBJOEtfRk5fU0hJRlQpICYgSThLX0ZOX01BU0spIHsKKyAgICBjYXNlIEk4S19GTl9VUDoKKwlyZXR1cm4gSThLX1ZPTF9VUDsKKyAgICBjYXNlIEk4S19GTl9ET1dOOgorCXJldHVybiBJOEtfVk9MX0RPV047CisgICAgY2FzZSBJOEtfRk5fTVVURToKKwlyZXR1cm4gSThLX1ZPTF9NVVRFOworICAgIGRlZmF1bHQ6CisJcmV0dXJuIDA7CisgICAgfQorfQorCisvKgorICogUmVhZCB0aGUgcG93ZXIgc3RhdHVzLgorICovCitzdGF0aWMgaW50IGk4a19nZXRfcG93ZXJfc3RhdHVzKHZvaWQpCit7CisgICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgcmM7CisKKyAgICByZWdzLmVheCA9IEk4S19TTU1fUE9XRVJfU1RBVFVTOworICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgeworCXJldHVybiByYzsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlZ3MuZWF4ICYgMHhmZikgeworICAgIGNhc2UgSThLX1BPV0VSX0FDOgorCXJldHVybiBJOEtfQUM7CisgICAgZGVmYXVsdDoKKwlyZXR1cm4gSThLX0JBVFRFUlk7CisgICAgfQorfQorCisvKgorICogUmVhZCB0aGUgZmFuIHN0YXR1cy4KKyAqLworc3RhdGljIGludCBpOGtfZ2V0X2Zhbl9zdGF0dXMoaW50IGZhbikKK3sKKyAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIGludCByYzsKKworICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9HRVRfRkFOOworICAgIHJlZ3MuZWJ4ID0gZmFuICYgMHhmZjsKKyAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKKwlyZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIChyZWdzLmVheCAmIDB4ZmYpOworfQorCisvKgorICogUmVhZCB0aGUgZmFuIHNwZWVkIGluIFJQTS4KKyAqLworc3RhdGljIGludCBpOGtfZ2V0X2Zhbl9zcGVlZChpbnQgZmFuKQoreworICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgICAgaW50IHJjOworCisgICAgcmVncy5lYXggPSBJOEtfU01NX0dFVF9TUEVFRDsKKyAgICByZWdzLmVieCA9IGZhbiAmIDB4ZmY7CisgICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7CisJcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiAocmVncy5lYXggJiAweGZmZmYpICogSThLX0ZBTl9NVUxUOworfQorCisvKgorICogU2V0IHRoZSBmYW4gc3BlZWQgKG9mZiwgbG93LCBoaWdoKS4gUmV0dXJucyB0aGUgbmV3IGZhbiBzdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgaThrX3NldF9mYW4oaW50IGZhbiwgaW50IHNwZWVkKQoreworICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgICAgaW50IHJjOworCisgICAgc3BlZWQgPSAoc3BlZWQgPCAwKSA/IDAgOiAoKHNwZWVkID4gSThLX0ZBTl9NQVgpID8gSThLX0ZBTl9NQVggOiBzcGVlZCk7CisKKyAgICByZWdzLmVheCA9IEk4S19TTU1fU0VUX0ZBTjsKKyAgICByZWdzLmVieCA9IChmYW4gJiAweGZmKSB8IChzcGVlZCA8PCA4KTsKKyAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKKwlyZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIChpOGtfZ2V0X2Zhbl9zdGF0dXMoZmFuKSk7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBjcHUgdGVtcGVyYXR1cmUuCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9jcHVfdGVtcCh2b2lkKQoreworICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgICAgaW50IHJjOworICAgIGludCB0ZW1wOworCisjaWZkZWYgSThLX1RFTVBFUkFUVVJFX0JVRworICAgIHN0YXRpYyBpbnQgcHJldiA9IDA7CisjZW5kaWYKKworICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9HRVRfVEVNUDsKKyAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKKwlyZXR1cm4gcmM7CisgICAgfQorICAgIHRlbXAgPSByZWdzLmVheCAmIDB4ZmY7CisKKyNpZmRlZiBJOEtfVEVNUEVSQVRVUkVfQlVHCisgICAgLyoKKyAgICAgKiBTb21ldGltZXMgdGhlIHRlbXBlcmF0dXJlIHNlbnNvciByZXR1cm5zIDB4OTksIHdoaWNoIGlzIG91dCBvZiByYW5nZS4KKyAgICAgKiBJbiB0aGlzIGNhc2Ugd2UgcmV0dXJuIChvbmNlKSB0aGUgcHJldmlvdXMgY2FjaGVkIHZhbHVlLiBGb3IgZXhhbXBsZToKKyAgICAgIyAxMDAzNjU1MTM3IDAwMDAwMDU4IDAwMDA1YTRiCisgICAgICMgMTAwMzY1NTEzOCAwMDAwMDA5OSAwMDAwM2E4MCA8LS0tIDB4OTkgPSAxNTMgZGVncmVlcworICAgICAjIDEwMDM2NTUxMzkgMDAwMDAwNTQgMDAwMDVjNTIKKyAgICAgKi8KKyAgICBpZiAodGVtcCA+IEk4S19NQVhfVEVNUCkgeworCXRlbXAgPSBwcmV2OworCXByZXYgPSBJOEtfTUFYX1RFTVA7CisgICAgfSBlbHNlIHsKKwlwcmV2ID0gdGVtcDsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiB0ZW1wOworfQorCitzdGF0aWMgaW50IGk4a19nZXRfZGVsbF9zaWduYXR1cmUodm9pZCkKK3sKKyAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIGludCByYzsKKworICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9HRVRfREVMTF9TSUc7CisgICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7CisJcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmICgocmVncy5lYXggPT0gMTE0NTY1MTUyNykgJiYgKHJlZ3MuZWR4ID09IDExNDUzOTIyMDQpKSB7CisJcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gLTE7CisgICAgfQorfQorCitzdGF0aWMgaW50IGk4a19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgaW50IHZhbDsKKyAgICBpbnQgc3BlZWQ7CisgICAgdW5zaWduZWQgY2hhciBidWZmWzE2XTsKKyAgICBpbnQgX191c2VyICphcmdwID0gKGludCBfX3VzZXIgKilhcmc7CisKKyAgICBpZiAoIWFyZ3ApCisJcmV0dXJuIC1FSU5WQUw7CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgSThLX0JJT1NfVkVSU0lPTjoKKwl2YWwgPSBpOGtfZ2V0X2Jpb3NfdmVyc2lvbigpOworCWJyZWFrOworCisgICAgY2FzZSBJOEtfTUFDSElORV9JRDoKKwltZW1zZXQoYnVmZiwgMCwgMTYpOworCXZhbCA9IGk4a19nZXRfc2VyaWFsX251bWJlcihidWZmKTsKKwlicmVhazsKKworICAgIGNhc2UgSThLX0ZOX1NUQVRVUzoKKwl2YWwgPSBpOGtfZ2V0X2ZuX3N0YXR1cygpOworCWJyZWFrOworCisgICAgY2FzZSBJOEtfUE9XRVJfU1RBVFVTOgorCXZhbCA9IGk4a19nZXRfcG93ZXJfc3RhdHVzKCk7CisJYnJlYWs7CisKKyAgICBjYXNlIEk4S19HRVRfVEVNUDoKKwl2YWwgPSBpOGtfZ2V0X2NwdV90ZW1wKCk7CisJYnJlYWs7CisKKyAgICBjYXNlIEk4S19HRVRfU1BFRUQ6CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZ3AsIHNpemVvZihpbnQpKSkgeworCSAgICByZXR1cm4gLUVGQVVMVDsKKwl9CisJdmFsID0gaThrX2dldF9mYW5fc3BlZWQodmFsKTsKKwlicmVhazsKKworICAgIGNhc2UgSThLX0dFVF9GQU46CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZ3AsIHNpemVvZihpbnQpKSkgeworCSAgICByZXR1cm4gLUVGQVVMVDsKKwl9CisJdmFsID0gaThrX2dldF9mYW5fc3RhdHVzKHZhbCk7CisJYnJlYWs7CisKKyAgICBjYXNlIEk4S19TRVRfRkFOOgorCWlmIChyZXN0cmljdGVkICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJICAgIHJldHVybiAtRVBFUk07CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkpIHsKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcigmc3BlZWQsIGFyZ3ArMSwgc2l6ZW9mKGludCkpKSB7CisJICAgIHJldHVybiAtRUZBVUxUOworCX0KKwl2YWwgPSBpOGtfc2V0X2Zhbih2YWwsIHNwZWVkKTsKKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKHZhbCA8IDApIHsKKwlyZXR1cm4gdmFsOworICAgIH0KKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgY2FzZSBJOEtfQklPU19WRVJTSU9OOgorCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbCwgNCkpIHsKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJyZWFrOworICAgIGNhc2UgSThLX01BQ0hJTkVfSUQ6CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBidWZmLCAxNikpIHsKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJyZWFrOworICAgIGRlZmF1bHQ6CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsLCBzaXplb2YoaW50KSkpIHsKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogUHJpbnQgdGhlIGluZm9ybWF0aW9uIGZvciAvcHJvYy9pOGsuCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBmcG9zLCBpbnQgbGVuZ3RoKQoreworICAgIGludCBuLCBmbl9rZXksIGNwdV90ZW1wLCBhY19wb3dlcjsKKyAgICBpbnQgbGVmdF9mYW4sIHJpZ2h0X2ZhbiwgbGVmdF9zcGVlZCwgcmlnaHRfc3BlZWQ7CisKKyAgICBjcHVfdGVtcCAgICAgPSBpOGtfZ2V0X2NwdV90ZW1wKCk7CQkJLyogMTExMDAgtXMgKi8KKyAgICBsZWZ0X2ZhbiAgICAgPSBpOGtfZ2V0X2Zhbl9zdGF0dXMoSThLX0ZBTl9MRUZUKTsJLyogICA1ODAgtXMgKi8KKyAgICByaWdodF9mYW4gICAgPSBpOGtfZ2V0X2Zhbl9zdGF0dXMoSThLX0ZBTl9SSUdIVCk7CS8qICAgNTgwILVzICovCisgICAgbGVmdF9zcGVlZCAgID0gaThrX2dldF9mYW5fc3BlZWQoSThLX0ZBTl9MRUZUKTsJLyogICA1ODAgtXMgKi8KKyAgICByaWdodF9zcGVlZCAgPSBpOGtfZ2V0X2Zhbl9zcGVlZChJOEtfRkFOX1JJR0hUKTsJLyogICA1ODAgtXMgKi8KKyAgICBmbl9rZXkgICAgICAgPSBpOGtfZ2V0X2ZuX3N0YXR1cygpOwkJCS8qICAgNzUwILVzICovCisgICAgaWYgKHBvd2VyX3N0YXR1cykgeworCWFjX3Bvd2VyID0gaThrX2dldF9wb3dlcl9zdGF0dXMoKTsJCS8qIDE0NzAwILVzICovCisgICAgfSBlbHNlIHsKKwlhY19wb3dlciA9IC0xOworICAgIH0KKworICAgIC8qCisgICAgICogSW5mbzoKKyAgICAgKgorICAgICAqIDEpICBGb3JtYXQgdmVyc2lvbiAodGhpcyB3aWxsIGNoYW5nZSBpZiBmb3JtYXQgY2hhbmdlcykKKyAgICAgKiAyKSAgQklPUyB2ZXJzaW9uCisgICAgICogMykgIEJJT1MgbWFjaGluZSBJRAorICAgICAqIDQpICBDcHUgdGVtcGVyYXR1cmUKKyAgICAgKiA1KSAgTGVmdCBmYW4gc3RhdHVzCisgICAgICogNikgIFJpZ2h0IGZhbiBzdGF0dXMKKyAgICAgKiA3KSAgTGVmdCBmYW4gc3BlZWQKKyAgICAgKiA4KSAgUmlnaHQgZmFuIHNwZWVkCisgICAgICogOSkgIEFDIHBvd2VyCisgICAgICogMTApIEZuIEtleSBzdGF0dXMKKyAgICAgKi8KKyAgICBuID0gc3ByaW50ZihidWZmZXIsICIlcyAlcyAlcyAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJSThLX1BST0NfRk1ULAorCQliaW9zX3ZlcnNpb24sCisJCXNlcmlhbF9udW1iZXIsCisJCWNwdV90ZW1wLAorCQlsZWZ0X2ZhbiwKKwkJcmlnaHRfZmFuLAorCQlsZWZ0X3NwZWVkLAorCQlyaWdodF9zcGVlZCwKKwkJYWNfcG93ZXIsCisJCWZuX2tleSk7CisKKyAgICByZXR1cm4gbjsKK30KKworc3RhdGljIHNzaXplX3QgaThrX3JlYWQoc3RydWN0IGZpbGUgKmYsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBsZW4sIGxvZmZfdCAqZnBvcykKK3sKKyAgICBpbnQgbjsKKyAgICBjaGFyIGluZm9bMTI4XTsKKworICAgIG4gPSBpOGtfZ2V0X2luZm8oaW5mbywgTlVMTCwgMCwgMTI4KTsKKyAgICBpZiAobiA8PSAwKSB7CisJcmV0dXJuIG47CisgICAgfQorCisgICAgaWYgKCpmcG9zID49IG4pIHsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoKCpmcG9zICsgbGVuKSA+PSBuKSB7CisJbGVuID0gbiAtICpmcG9zOworICAgIH0KKworICAgIGlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBpbmZvLCBsZW4pICE9IDApIHsKKwlyZXR1cm4gLUVGQVVMVDsKKyAgICB9CisKKyAgICAqZnBvcyArPSBsZW47CisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGNoYXIqIF9faW5pdCBzdHJpbmdfdHJpbShjaGFyICpzLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgbGVuOworICAgIGNoYXIgKnA7CisKKyAgICBpZiAoKGxlbiA9IHN0cmxlbihzKSkgPiBzaXplKSB7CisJbGVuID0gc2l6ZTsKKyAgICB9CisKKyAgICBmb3IgKHA9cytsZW4tMTsgbGVuICYmICgqcD09JyAnKTsgbGVuLS0scC0tKSB7CisJKnAgPSAnXDAnOworICAgIH0KKworICAgIHJldHVybiBzOworfQorCisvKiBETUkgY29kZSwgc3RvbGVuIGZyb20gYXJjaC9pMzg2L2tlcm5lbC9kbWlfc2Nhbi5jICovCisKKy8qCisgKiB8PC0tIGRtaS0+bGVuZ3RoIC0tPnwKKyAqIHwgICAgICAgICAgICAgICAgICAgfAorICogfGRtaSBoZWFkZXIgICAgcz1OICB8IHN0cmluZzEsXDAsIC4uLiwgc3RyaW5nTixcMCwgLi4uLCBcMAorICogICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICovCitzdGF0aWMgY2hhciogX19pbml0IGRtaV9zdHJpbmcoRE1JSGVhZGVyICpkbWksIHU4IHMpCit7CisgICAgdTggKnA7CisKKyAgICBpZiAoIXMpIHsKKwlyZXR1cm4gIiI7CisgICAgfQorICAgIHMtLTsKKworICAgIHAgPSAodTggKilkbWkgKyBkbWktPmxlbmd0aDsKKyAgICB3aGlsZSAocyA+IDApIHsKKwlwICs9IHN0cmxlbihwKTsKKwlwKys7CisJcy0tOworICAgIH0KKworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZG1pX2RlY29kZShETUlIZWFkZXIgKmRtaSkKK3sKKyAgICB1OCAqZGF0YSA9ICh1OCAqKSBkbWk7CisgICAgY2hhciAqcDsKKworI2lmZGVmIEk4S19ERUJVRworICAgIGludCBpOworICAgIHByaW50aygiJTA4eCAiLCAoaW50KWRhdGEpOworICAgIGZvciAoaT0wOyBpPGRhdGFbMV0gJiYgaTw2NDsgaSsrKSB7CisJcHJpbnRrKCIlMDJ4ICIsIGRhdGFbaV0pOworICAgIH0KKyAgICBwcmludGsoIlxuIik7CisjZW5kaWYKKworICAgIHN3aXRjaCAoZG1pLT50eXBlKSB7CisgICAgY2FzZSAgMDoJLyogQklPUyBJbmZvcm1hdGlvbiAqLworCXAgPSBkbWlfc3RyaW5nKGRtaSxkYXRhWzVdKTsKKwlpZiAoKnApIHsKKwkgICAgc3RybGNweShiaW9zX3ZlcnNpb24sIHAsIHNpemVvZihiaW9zX3ZlcnNpb24pKTsKKwkgICAgc3RyaW5nX3RyaW0oYmlvc192ZXJzaW9uLCBzaXplb2YoYmlvc192ZXJzaW9uKSk7CisJfQorCWJyZWFrOwkKKyAgICBjYXNlIDE6CS8qIFN5c3RlbSBJbmZvcm1hdGlvbiAqLworCXAgPSBkbWlfc3RyaW5nKGRtaSxkYXRhWzRdKTsKKwlpZiAoKnApIHsKKwkgICAgc3RybGNweShzeXN0ZW1fdmVuZG9yLCBwLCBzaXplb2Yoc3lzdGVtX3ZlbmRvcikpOworCSAgICBzdHJpbmdfdHJpbShzeXN0ZW1fdmVuZG9yLCBzaXplb2Yoc3lzdGVtX3ZlbmRvcikpOworCX0KKwlwID0gZG1pX3N0cmluZyhkbWksZGF0YVs1XSk7CisJaWYgKCpwKSB7CisJICAgIHN0cmxjcHkocHJvZHVjdF9uYW1lLCBwLCBzaXplb2YocHJvZHVjdF9uYW1lKSk7CisJICAgIHN0cmluZ190cmltKHByb2R1Y3RfbmFtZSwgc2l6ZW9mKHByb2R1Y3RfbmFtZSkpOworCX0KKwlwID0gZG1pX3N0cmluZyhkbWksZGF0YVs3XSk7CisJaWYgKCpwKSB7CisJICAgIHN0cmxjcHkoc2VyaWFsX251bWJlciwgcCwgc2l6ZW9mKHNlcmlhbF9udW1iZXIpKTsKKwkgICAgc3RyaW5nX3RyaW0oc2VyaWFsX251bWJlciwgc2l6ZW9mKHNlcmlhbF9udW1iZXIpKTsKKwl9CisJYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBkbWlfdGFibGUodTMyIGJhc2UsIGludCBsZW4sIGludCBudW0sIHZvaWQgKCpmbikoRE1JSGVhZGVyKikpCit7CisgICAgdTggKmJ1ZjsKKyAgICB1OCAqZGF0YTsKKyAgICBETUlIZWFkZXIgKmRtaTsKKyAgICBpbnQgaSA9IDE7CisKKyAgICBidWYgPSBpb3JlbWFwKGJhc2UsIGxlbik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBkYXRhID0gYnVmOworCisgICAgLyoKKyAgICAgKiBTdG9wIHdoZW4gd2Ugc2VlIGFsIHRoZSBpdGVtcyB0aGUgdGFibGUgY2xhaW1lZCB0byBoYXZlCisgICAgICogb3Igd2UgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZSB0YWJsZSAoYWxzbyBoYXBwZW5zKQorICAgICAqLworICAgIHdoaWxlICgoaTxudW0pICYmICgoZGF0YS1idWYpIDwgbGVuKSkgeworCWRtaSA9IChETUlIZWFkZXIgKilkYXRhOworCS8qCisJICogQXZvaWQgbWlzcGFyc2luZyBjcnVkIGlmIHRoZSBsZW5ndGggb2YgdGhlIGxhc3QKKwkgKiByZWNvcmQgaXMgY3JhcAorCSAqLworCWlmICgoZGF0YS1idWYrZG1pLT5sZW5ndGgpID49IGxlbikgeworCSAgICBicmVhazsKKwl9CisJZm4oZG1pKTsKKwlkYXRhICs9IGRtaS0+bGVuZ3RoOworCS8qCisJICogRG9uJ3QgZ28gb2ZmIHRoZSBlbmQgb2YgdGhlIGRhdGEgaWYgdGhlcmUgaXMKKwkgKiBzdHVmZiBsb29raW5nIGxpa2Ugc3RyaW5nIGZpbGwgcGFzdCB0aGUgZW5kCisJICovCisJd2hpbGUgKCgoZGF0YS1idWYpIDwgbGVuKSAmJiAoKmRhdGEgfHwgZGF0YVsxXSkpIHsKKwkgICAgZGF0YSsrOworCX0KKwlkYXRhICs9IDI7CisJaSsrOworICAgIH0KKyAgICBpb3VubWFwKGJ1Zik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgZG1pX2l0ZXJhdGUodm9pZCAoKmRlY29kZSkoRE1JSGVhZGVyICopKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzIwXTsKKwl2b2lkIF9faW9tZW0gKnAgPSBpb3JlbWFwKDB4ZTAwMDAsIDB4MjAwMDApLCAqcTsKKworCWlmICghcCkKKwkJcmV0dXJuIC0xOworCisJZm9yIChxID0gcDsgcSA8IHAgKyAweDIwMDAwOyBxICs9IDE2KSB7CisJCW1lbWNweV9mcm9taW8oYnVmLCBxLCAyMCk7CisJCWlmIChtZW1jbXAoYnVmLCAiX0RNSV8iLCA1KT09MCkgeworCQkJdTE2IG51bSAgPSBidWZbMTNdPDw4ICB8IGJ1ZlsxMl07CisJCQl1MTYgbGVuICA9IGJ1ZiBbN108PDggIHwgYnVmIFs2XTsKKwkJCXUzMiBiYXNlID0gYnVmWzExXTw8MjQgfCBidWZbMTBdPDwxNiB8IGJ1Zls5XTw8OCB8IGJ1Zls4XTsKKyNpZmRlZiBJOEtfREVCVUcKKwkJCXByaW50ayhLRVJOX0lORk8gIkRNSSAlZC4lZCBwcmVzZW50LlxuIiwKKwkJCSAgIGJ1ZlsxNF0+PjQsIGJ1ZlsxNF0mMHgwRik7CisJCQlwcmludGsoS0VSTl9JTkZPICIlZCBzdHJ1Y3R1cmVzIG9jY3VweWluZyAlZCBieXRlcy5cbiIsCisJCQkgICBidWZbMTNdPDw4IHwgYnVmWzEyXSwKKwkJCSAgIGJ1ZiBbN108PDggfCBidWZbNl0pOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1JIHRhYmxlIGF0IDB4JTA4WC5cbiIsCisJCQkgICBidWZbMTFdPDwyNCB8IGJ1ZlsxMF08PDE2IHwgYnVmWzldPDw4IHwgYnVmWzhdKTsKKyNlbmRpZgorCQkJaWYgKGRtaV90YWJsZShiYXNlLCBsZW4sIG51bSwgZGVjb2RlKT09MCkgeworCQkJCWlvdW5tYXAocCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJaW91bm1hcChwKTsKKwlyZXR1cm4gLTE7Cit9CisvKiBlbmQgb2YgRE1JIGNvZGUgKi8KKworLyoKKyAqIEdldCBETUkgaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGk4a19kbWlfcHJvYmUodm9pZCkKK3sKKyAgICBjaGFyICoqcDsKKworICAgIGlmIChkbWlfaXRlcmF0ZShkbWlfZGVjb2RlKSAhPSAwKSB7CisJcHJpbnRrKEtFUk5fSU5GTyAiaThrOiB1bmFibGUgdG8gZ2V0IERNSSBpbmZvcm1hdGlvblxuIik7CisJcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgaWYgKHN0cm5jbXAoc3lzdGVtX3ZlbmRvcixERUxMX1NJR05BVFVSRSxzdHJsZW4oREVMTF9TSUdOQVRVUkUpKSAhPSAwKSB7CisJcHJpbnRrKEtFUk5fSU5GTyAiaThrOiBub3QgcnVubmluZyBvbiBhIERlbGwgc3lzdGVtXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBmb3IgKHA9c3VwcG9ydGVkX21vZGVsczsgOyBwKyspIHsKKwlpZiAoISpwKSB7CisJICAgIHByaW50ayhLRVJOX0lORk8gImk4azogdW5zdXBwb3J0ZWQgbW9kZWw6ICVzXG4iLCBwcm9kdWN0X25hbWUpOworCSAgICByZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHN0cm5jbXAocHJvZHVjdF9uYW1lLCpwLHN0cmxlbigqcCkpID09IDApIHsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogUHJvYmUgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIHN1cHBvcnRlZCBsYXB0b3AuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGk4a19wcm9iZSh2b2lkKQoreworICAgIGNoYXIgYnVmZls0XTsKKyAgICBpbnQgdmVyc2lvbjsKKyAgICBpbnQgc21tX2ZvdW5kID0gMDsKKworICAgIC8qCisgICAgICogR2V0IERNSSBpbmZvcm1hdGlvbgorICAgICAqLworICAgIGlmIChpOGtfZG1pX3Byb2JlKCkgIT0gMCkgeworCXByaW50ayhLRVJOX0lORk8gImk4azogdmVuZG9yPSVzLCBtb2RlbD0lcywgdmVyc2lvbj0lc1xuIiwKKwkgICAgICAgc3lzdGVtX3ZlbmRvciwgcHJvZHVjdF9uYW1lLCBiaW9zX3ZlcnNpb24pOworICAgIH0KKworICAgIC8qCisgICAgICogR2V0IFNNTSBEZWxsIHNpZ25hdHVyZQorICAgICAqLworICAgIGlmIChpOGtfZ2V0X2RlbGxfc2lnbmF0dXJlKCkgIT0gMCkgeworCXByaW50ayhLRVJOX0lORk8gImk4azogdW5hYmxlIHRvIGdldCBTTU0gRGVsbCBzaWduYXR1cmVcbiIpOworICAgIH0gZWxzZSB7CisJc21tX2ZvdW5kID0gMTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldCBTTU0gQklPUyB2ZXJzaW9uLgorICAgICAqLworICAgIHZlcnNpb24gPSBpOGtfZ2V0X2Jpb3NfdmVyc2lvbigpOworICAgIGlmICh2ZXJzaW9uIDw9IDApIHsKKwlwcmludGsoS0VSTl9JTkZPICJpOGs6IHVuYWJsZSB0byBnZXQgU01NIEJJT1MgdmVyc2lvblxuIik7CisgICAgfSBlbHNlIHsKKwlzbW1fZm91bmQgPSAxOworCWJ1ZmZbMF0gPSAodmVyc2lvbiA+PiAxNikgJiAweGZmOworCWJ1ZmZbMV0gPSAodmVyc2lvbiA+PiAgOCkgJiAweGZmOworCWJ1ZmZbMl0gPSAodmVyc2lvbikgICAgICAgJiAweGZmOworCWJ1ZmZbM10gPSAnXDAnOworCS8qCisJICogSWYgRE1JIEJJT1MgdmVyc2lvbiBpcyB1bmtub3duIHVzZSBTTU0gQklPUyB2ZXJzaW9uLgorCSAqLworCWlmIChiaW9zX3ZlcnNpb25bMF0gPT0gJz8nKSB7CisJICAgIHN0cmNweShiaW9zX3ZlcnNpb24sIGJ1ZmYpOworCX0KKwkvKgorCSAqIENoZWNrIGlmIHRoZSB0d28gdmVyc2lvbnMgbWF0Y2guCisJICovCisJaWYgKHN0cm5jbXAoYnVmZixiaW9zX3ZlcnNpb24sc2l6ZW9mKGJpb3NfdmVyc2lvbikpICE9IDApIHsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiaThrOiBCSU9TIHZlcnNpb24gbWlzbWF0Y2g6ICVzICE9ICVzXG4iLAorCQkgICBidWZmLCBiaW9zX3ZlcnNpb24pOworCX0KKyAgICB9CisKKyAgICBpZiAoIXNtbV9mb3VuZCAmJiAhZm9yY2UpIHsKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIE1PRFVMRQorc3RhdGljCisjZW5kaWYKK2ludCBfX2luaXQgaThrX2luaXQodm9pZCkKK3sKKyAgICBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfaThrOworCisgICAgLyogQXJlIHdlIHJ1bm5pbmcgb24gYW4gc3VwcG9ydGVkIGxhcHRvcD8gKi8KKyAgICBpZiAoaThrX3Byb2JlKCkgIT0gMCkgeworCXJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIC8qIFJlZ2lzdGVyIHRoZSBwcm9jIGVudHJ5ICovCisgICAgcHJvY19pOGsgPSBjcmVhdGVfcHJvY19pbmZvX2VudHJ5KCJpOGsiLCAwLCBOVUxMLCBpOGtfZ2V0X2luZm8pOworICAgIGlmICghcHJvY19pOGspIHsKKwlyZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgcHJvY19pOGstPnByb2NfZm9wcyA9ICZpOGtfZm9wczsKKyAgICBwcm9jX2k4ay0+b3duZXIgPSBUSElTX01PRFVMRTsKKworICAgIHByaW50ayhLRVJOX0lORk8KKwkgICAiRGVsbCBsYXB0b3AgU01NIGRyaXZlciB2JXMgTWFzc2ltbyBEYWwgWm90dG8gKGR6QGRlYmlhbi5vcmcpXG4iLAorCSAgIEk4S19WRVJTSU9OKTsKKworICAgIHJldHVybiAwOworfQorCisjaWZkZWYgTU9EVUxFCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKyAgICByZXR1cm4gaThrX2luaXQoKTsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworICAgIC8qIFJlbW92ZSB0aGUgcHJvYyBlbnRyeSAqLworICAgIHJlbW92ZV9wcm9jX2VudHJ5KCJpOGsiLCBOVUxMKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gImk4azogbW9kdWxlIHVubG9hZGVkXG4iKTsKK30KKyNlbmRpZgorCisvKiBlbmQgb2YgZmlsZSAqLwo=