LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgojaW5jbHVkZSA8YXNtL3JlYWxtb2RlLmg+CgoKI2RlZmluZSBSRUFMTU9ERV9NQUlMQk9YICgoY2hhciopMHhlMDApCgoKZXh0ZXJuIHVsb25nIF9fcmVhbG1vZGVfc3RhcnQ7CmV4dGVybiB1bG9uZyBfX3JlYWxtb2RlX3NpemU7CmV4dGVybiBjaGFyIHJlYWxtb2RlX2VudGVyOwoKaW50IHJlYWxtb2RlX3NldHVwKHZvaWQpCnsKCXVsb25nIHJlYWxtb2RlX3N0YXJ0ID0gKHVsb25nKSZfX3JlYWxtb2RlX3N0YXJ0ICsgZ2QtPnJlbG9jX29mZjsKCXVsb25nIHJlYWxtb2RlX3NpemUgPSAodWxvbmcpJl9fcmVhbG1vZGVfc2l6ZTsKCgkvKiBjb3B5IHRoZSByZWFsbW9kZSBzd2l0Y2ggY29kZSAqLwoJaWYgKHJlYWxtb2RlX3NpemUgPiAoUkVBTE1PREVfTUFJTEJPWCAtIChjaGFyICopUkVBTE1PREVfQkFTRSkpIHsKCQlwcmludGYoInJlYWxtb2RlIHN3aXRjaCB0b28gbGFyZ2UgKCVsZCBieXRlcywgbWF4IGlzICVkKVxuIiwKCQkgICAgICAgcmVhbG1vZGVfc2l6ZSwKCQkgICAgICAgKFJFQUxNT0RFX01BSUxCT1ggLSAoY2hhciAqKVJFQUxNT0RFX0JBU0UpKTsKCQlyZXR1cm4gLTE7Cgl9CgoJbWVtY3B5KChjaGFyICopUkVBTE1PREVfQkFTRSwgKHZvaWQgKilyZWFsbW9kZV9zdGFydCwgcmVhbG1vZGVfc2l6ZSk7Cglhc20oIndiaW52ZFxuIik7CgoJcmV0dXJuIDA7Cn0KCmludCBlbnRlcl9yZWFsbW9kZSh1MTYgc2VnLCB1MTYgb2ZmLCBzdHJ1Y3QgcHRfcmVncyAqaW4sIHN0cnVjdCBwdF9yZWdzICpvdXQpCnsKCgkvKiBzZXR1cCBvdXQgdGhpbiBiaW9zIGVtdWxhdGlvbiAqLwoJaWYgKGJpb3Nfc2V0dXAoKSkgewoJCXJldHVybiAtMTsKCX0KCglpZiAocmVhbG1vZGVfc2V0dXAoKSkgewoJCXJldHVybiAtMTsKCX0KCglpbi0+ZWlwID0gb2ZmOwoJaW4tPnhjcyA9IHNlZzsKCWlmICgzPihpbi0+ZXNwICYgMHhmZmZmKSkgewoJCXByaW50ZigiV2FybmluZzogZW50ZXJpbmcgcmVhbG1vZGUgd2l0aCBzcCA8IDQgd2lsbCBmYWlsXG4iKTsKCX0KCgltZW1jcHkoUkVBTE1PREVfTUFJTEJPWCwgaW4sIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOwoJYXNtKCJ3YmludmRcbiIpOwoKCV9fYXNtX18gdm9sYXRpbGUgKAoJCSAibGNhbGwgJDB4MjAsJTBcbiIgIDogOiAgImkiICgmcmVhbG1vZGVfZW50ZXIpICk7CgoJYXNtKCJ3YmludmRcbiIpOwoJbWVtY3B5KG91dCwgUkVBTE1PREVfTUFJTEJPWCwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CgoJcmV0dXJuIG91dC0+ZWF4Owp9CgoKLyogVGhpcyBjb2RlIGlzIHN1cHBvc2VkIHRvIGFjY2VzcyBhIHJlYWxtb2RlIGludGVycnVwdAogKiBpdCBkb2VzIGN1cnJlbnRseSBub3Qgd29yayBmb3IgbWUgKi8KaW50IGVudGVyX3JlYWxtb2RlX2ludCh1OCBsdmwsIHN0cnVjdCBwdF9yZWdzICppbiwgc3RydWN0IHB0X3JlZ3MgKm91dCkKewoJLyogcGxhY2UgdHdvIGluc3RydWN0aW9ucyBhdCAweDcwMCAqLwoJd3JpdGViKDB4Y2QsIDB4NzAwKTsgIC8qIGludCAkbHZsICovCgl3cml0ZWIobHZsLCAweDcwMSk7Cgl3cml0ZWIoMHhjYiwgMHg3MDIpOyAgLyogbHJldCAqLwoJYXNtKCJ3YmludmRcbiIpOwoKCWVudGVyX3JlYWxtb2RlKDB4MDAsIDB4NzAwLCBpbiwgb3V0KTsKCglyZXR1cm4gb3V0LT5lZmxhZ3MmMTsKfQo=