LyoKICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBUYWJsZSBvZiBjb250ZW50cwoKICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwogICAgIDMuIE1vZHVsZSBkZWZpbmVzCiAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwogICAgIDUuIEZ1bmN0aW9ucwogICAgICAgICAgaDI2NGJzZERlY29kZU5hbFVuaXQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgojaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgojaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZU5hbFVuaXQKCiAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKICAgICAgICAgICAgRGVjb2RlIE5BTCB1bml0IGhlYWRlciBpbmZvcm1hdGlvbgoKICAgICAgICBJbnB1dHM6CiAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQoKICAgICAgICBPdXRwdXRzOgogICAgICAgICAgICBwTmFsVW5pdCAgICAgICAgTkFMIHVuaXQgaGVhZGVyIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCiAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIE5BTCB1bml0IGhlYWRlciBpbmZvcm1hdGlvbgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCnUzMiBoMjY0YnNkRGVjb2RlTmFsVW5pdChzdHJtRGF0YV90ICpwU3RybURhdGEsIG5hbFVuaXRfdCAqcE5hbFVuaXQpCnsKCi8qIFZhcmlhYmxlcyAqLwoKICAgIHUzMiB0bXA7CgovKiBDb2RlICovCgogICAgQVNTRVJUKHBTdHJtRGF0YSk7CiAgICBBU1NFUlQocE5hbFVuaXQpOwogICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID09IDApOwoKICAgIC8qIGZvcmJpZGRlbl96ZXJvX2JpdCAobm90IGNoZWNrZWQgdG8gYmUgemVybywgZXJyb3JzIGlnbm9yZWQpICovCiAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwogICAgLyogQXNzdW1pbmcgdGhhdCBOQUwgdW5pdCBzdGFydHMgZnJvbSBieXRlIGJvdW5kYXJ5IK0+IGRvbid0IGhhdmUgdG8gY2hlY2sKICAgICAqIGZvbGxvd2luZyA3IGJpdHMgZm9yIEVORF9PRl9TVFJFQU0gKi8KICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CgogICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKICAgIHBOYWxVbml0LT5uYWxSZWZJZGMgPSB0bXA7CgogICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKICAgIHBOYWxVbml0LT5uYWxVbml0VHlwZSA9IChuYWxVbml0VHlwZV9lKXRtcDsKCiAgICAvKiBkYXRhIHBhcnRpdGlvbmluZyBOQUwgdW5pdHMgbm90IHN1cHBvcnRlZCAqLwogICAgaWYgKCAodG1wID09IDIpIHx8ICh0bXAgPT0gMykgfHwgKHRtcCA9PSA0KSApCiAgICB7CiAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwogICAgfQoKICAgIC8qIG5hbF9yZWZfaWRjIHNoYWxsIG5vdCBiZSB6ZXJvIGZvciB0aGVzZSBuYWxfdW5pdF90eXBlcyAqLwogICAgaWYgKCAoICh0bXAgPT0gTkFMX1NFUV9QQVJBTV9TRVQpIHx8ICh0bXAgPT0gTkFMX1BJQ19QQVJBTV9TRVQpIHx8CiAgICAgICAgICAgKHRtcCA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKSApICYmIChwTmFsVW5pdC0+bmFsUmVmSWRjID09IDApICkKICAgIHsKICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CiAgICB9CiAgICAvKiBuYWxfcmVmX2lkYyBzaGFsbCBiZSB6ZXJvIGZvciB0aGVzZSBuYWxfdW5pdF90eXBlcyAqLwogICAgZWxzZSBpZiAoICggKHRtcCA9PSBOQUxfU0VJKSB8fCAodG1wID09IE5BTF9BQ0NFU1NfVU5JVF9ERUxJTUlURVIpIHx8CiAgICAgICAgICAgICAgICAodG1wID09IE5BTF9FTkRfT0ZfU0VRVUVOQ0UpIHx8ICh0bXAgPT0gTkFMX0VORF9PRl9TVFJFQU0pIHx8CiAgICAgICAgICAgICAgICAodG1wID09IE5BTF9GSUxMRVJfREFUQSkgKSAmJiAocE5hbFVuaXQtPm5hbFJlZklkYyAhPSAwKSApCiAgICB7CiAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwogICAgfQoKICAgIHJldHVybihIQU5UUk9fT0spOwoKfQoK