ZGlmZiAtLWdpdCBhL3NyYy9hcHBzL2JpbmR4X3Rlc3QuYyBiL3NyYy9hcHBzL2JpbmR4X3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjNkZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2FwcHMvYmluZHhfdGVzdC5jCkBAIC0wLDAgKzEsMTM0IEBACisgIC8qIC0qLWMtKi0KKyAgKioKKyAgKiogc2N0cC10b29sczogQW5vdGhlciBiaW5keCB0ZXN0LgorICAqKiAKKyAgKiogJElkOiBiaW5keF90ZXN0LmMsdiAxLjEuMS4xIDIwMDIvMDgvMDYgMjI6MzE6MDUgaW5ha3kgRXhwICQKKyAgKioKKyAgKiogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgdjIuMCBhcyBkZXNjcmliZWQgaW4KKyAgKiogJHRvcF9zcmNkaXIvQ09QWUlORy4gCisgICoqCisgICoqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDMKKyAgKiogKEMpIDIwMDIgSW50ZWwgQ29ycG9yYXRpb24KKyAgKiogICAgSfFha3kgUOlyZXotR29ueuFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT46CisgICoqICAgIFNyaWRoYXIgU2FtdWRyYWxhIDxzcmlAdXMuaWJtLmNvbT4KKyAgKi8KKworI2RlZmluZSBfR05VX1NPVVJDRSAvKiBHTlUgZXh0ZW5zaW9ucyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgICAvKiBtYWxsb2MoKSAqLworI2luY2x1ZGUgPGFycGEvaW5ldC5oPiAgLyogaW5ldF9wdG9uKCkgKi8KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4gLyogc29ja2V0KCkgKi8KKyNpbmNsdWRlIDxzdGRpby5oPiAgICAgIC8qIGZwcmludGYgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+IC8qIHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAvKiBjbG9zZSgpICovCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAvKiBzdHJjaHIoKSAqLworI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPiAgIC8qIGJpbmR4KCkgKi8KKworICAvKiBHbG9iYWwgc3R1ZmYgKi8KKworI2lmbmRlZiBJUFBST1RPX1NDVFAgCisjZGVmaW5lIElQUFJPVE9fU0NUUCAxMzIKKyNlbmRpZgorCisgIC8qISBNYWluIGZ1bmN0aW9uOiBpbml0aWFsaXplLCBzZXR1cCwgcnVuIHRoZSBtYWluIGxvb3AKKyAgKioKKyAgKioKKyAgKi8KKworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl2b2lkICphZGRyX2J1ZiwgKmJ1Zl9wdHI7CisJdm9pZCAqYWRkcl9idWZfc2l6ZSA9IDA7CisJc2l6ZV90IGFkZHJzLCBjbnQ7CisJaW50IHNkLCByZXN1bHQsIHBvcnQ7CisJaW50IGRvbWFpbiA9IFBGX0lORVQ2OworCisJaWYgKGFyZ2MgPCAzKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlVzYWdlOiBiaW5keF90ZXN0IFBPUlQgSVBBRERSMSBbSVBBRERSMiBbLi4uXV1cbiIpOworCQlyZXR1cm4gMTsKKwl9CisgIAorCXBvcnQgPSBhdG9pKGFyZ3ZbMV0pOworCXByaW50ZigiYmluZHhfdGVzdDogSU5GTzogUG9ydCBpcyAlZFxuIiwgcG9ydCk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgbWF4aW11bSBzcGFjZSBmb3IgdGhlIHNwZWNpZmllZCBuby4gb2YgIGFkZHJlc3Nlcy4KKwkgKiBBc3N1bWUgYWxsIG9mIHRoZW0gYXJlIHY2IGFkZHJlc3Nlcy4KKwkgKi8KKwlhZGRyX2J1ZiA9IG1hbGxvYygoYXJnYyAtMikgKiBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCWlmIChhZGRyX2J1ZiA9PSBOVUxMKSB7CisJCXBlcnJvcigiYmluZHhfdGVzdDogRVJST1I6IGFkZHIgYnVmIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAxOworCX0KKyAgCisJLyogR2V0IHRoZSBhZGRyZXNzZXMgZnJvbSB0aGUgY21kIGxpbmUgKi8KKwlhZGRycyA9IDA7ICAvKiBoZWFsdGh5IGFkZHJlc3MgaXRlcmF0b3IgW2FuZCB0b3RhbCBjb3VudGVyXSAqLworCWNudCA9IDI7ICAgIC8qIGFyZ3VtZW50IGl0ZXJhdG9yICovCisJYnVmX3B0ciA9IGFkZHJfYnVmOworCXdoaWxlIChjbnQgPCBhcmdjKSB7CisJCXByaW50ZigiYmluZHhfdGVzdDogSU5GTzogQXJnICV6dTogJXMiLCBjbnQsIGFyZ3ZbY250XSk7CisJCWZmbHVzaChzdGRlcnIpOworCQlpZiAoc3RyY2hyKGFyZ3ZbY250XSwgJzonKSkgeworCQkJc3RydWN0IHNvY2thZGRyX2luNiAqc2E2OyAKKworCQkJc2E2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilidWZfcHRyOworCQkJcHJpbnRmKCIgSVB2NiBhZGRyZXNzIG51bWJlciAlenUiLCBhZGRycyk7CisJCQlzYTYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCQlzYTYtPnNpbjZfcG9ydCA9IHBvcnQ7CisJCQlpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBhcmd2W2NudF0sICZzYTYtPnNpbjZfYWRkcikpIHsKKwkJCQlhZGRycysrOworCQkJCWFkZHJfYnVmX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQkJCWJ1Zl9wdHIgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQkJfSBlbHNlCisJCQkJcHJpbnRmKCIgZXJyb3IiKTsKKwkJfSBlbHNlIGlmIChzdHJjaHIoYXJndltjbnRdLCAnLicpKSB7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhOyAKKworCQkJZG9tYWluID0gUEZfSU5FVDsKKwkJCXNhID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWJ1Zl9wdHI7CisJCQlwcmludGYgKCIgSVB2NCBhZGRyZXNzIG51bWJlciAlenUiLCBhZGRycyk7CisJCQlzYS0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQlzYS0+c2luX3BvcnQgPSBwb3J0OworCQkJaWYgKGluZXRfcHRvbiAoQUZfSU5FVCwgYXJndltjbnRdLCAmc2EtPnNpbl9hZGRyKSkgeworCQkJCWFkZHJzKys7CisJCQkJYWRkcl9idWZfc2l6ZSArPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwkJCQlidWZfcHRyICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJfSBlbHNlCisJCQkJcHJpbnRmICgiIGVycm9yIik7CisJCX0gZWxzZQorCQkJcHJpbnRmICgiIFVua25vd24iKTsKKwkJcHV0Y2hhciAoJ1xuJyk7CisJCWNudCsrOworCX0KKworCXByaW50ZiAoImJpbmR4X3Rlc3Q6IElORk86IEdvdCAlenUgYWRkcnNcbiIsIGFkZHJzKTsKKyAgCisJLyogQ3JlYXRlIHRoZSBzb2NrZXQgKi8KKwlzZCA9IHNvY2tldChkb21haW4sIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCWlmIChzZCA9PSAtMSkgeworCQlwZXJyb3IoImJpbmR4X3Rlc3Q6IEVSUk9SOiBDYW5ub3Qgb3BlbiBzb2NrZXQiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogYWRkIGFsbCAqLworCXJlc3VsdCA9IHNjdHBfYmluZHgoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyX2J1ZiwgYWRkcnMsCisJCQkgICAgU0NUUF9CSU5EWF9BRERfQUREUik7CisJaWYgKHJlc3VsdCA9PSAtMSkKKwkJcGVycm9yKCJiaW5keF90ZXN0OiBFUlJPUjogYmluZHggYWRkaXRpb24gZXJyb3IiKTsKKwllbHNlIHsKKwkJcHJpbnRmKCJiaW5keF90ZXN0OiBPSzogYmluZHggYWRkcmVzcyBhZGRpdGlvblxuIik7CisKKwkJLyogcmVtb3ZlIGFsbCBidXQgdGhlIGxhc3QgKi8KKwkJcmVzdWx0ID0gc2N0cF9iaW5keChzZCwgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJfYnVmLCBhZGRycy0xLAorCQkJCSAgICAgU0NUUF9CSU5EWF9SRU1fQUREUik7CisJCWlmIChyZXN1bHQgPT0gLTEpCisJCQlwZXJyb3IoImJpbmR4X3Rlc3Q6IEVSUk9SOiBiaW5keCBhZGRyZXNzIHJlbW92YWwiKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJiaW5keF90ZXN0OiBPSzogYmluZHggYWRkcmVzcyByZW1vdmFsXG4iKTsKKwl9CisgIAorCWNsb3NlKHNkKTsKKwlmcmVlKGFkZHJfYnVmKTsKKwlyZXR1cm4gcmVzdWx0OworfQo=