LyogYWxwaGF2bXMuaCAtLSBCRkQgZGVmaW5pdGlvbnMgZm9yIGFuIG9wZW5WTVMgaG9zdAogICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgV3JpdHRlbiBieSBLbGF1cyBL5G1wZiAoa2thZW1wZkBwcm9naXMuZGUpCiAgIG9mIHByb0dJUyBTb2Z0d2FyZWVudHdpY2tsdW5nLCBBYWNoZW4sIEdlcm1hbnkKClRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzeXMvZmlsZS5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx1bml4bGliLmg+CiNpbmNsdWRlIDx1bml4aW8uaD4KI2luY2x1ZGUgPHRpbWUuaD4KCiNpbmNsdWRlICJiZmQuaCIKCiNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCi8qIE1ha2UgdGhlIGJhc2ljIHR5cGVzIDY0LWJpdCBxdWFudGl0aWVzIG9uIHRoZSBob3N0LgogICBBbHNvIHByb3ZpZGUgdGhlIHN1cHBvcnQgbWFjcm9zIEJGRCBuZWVkcy4gICovCiMgaWZkZWYgX19HTlVDX18KIyAgZGVmaW5lCUJGRF9IT1NUXzY0X0JJVAlsb25nIGxvbmcKIyBlbHNlCiMgIGRlZmluZQlCRkRfSE9TVF82NF9CSVQJbG9uZwojIGVuZGlmCnR5cGVkZWYgdW5zaWduZWQgQkZEX0hPU1RfNjRfQklUIHVpbnQ2NF90eXBlOwp0eXBlZGVmIEJGRF9IT1NUXzY0X0JJVCBpbnQ2NF90eXBlOwoKIyBkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmIChzLCAiJTAxNmx4IiwgeCkgLyogQkZEX0hPU1RfNjRfQklUICovCiMgZGVmaW5lIGZwcmludGZfdm1hKGYseCkgZnByaW50ZiAoZiwgIiUwMTZseCIsIHgpIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwoKIyBkZWZpbmUgQllURVNfSU5fUFJJTlRGX0lOVCA0CgovKiBUaGVzZSBtdXN0IGhhdmUgdHlwZSB1bnNpZ25lZCBsb25nIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBhcwogICBhcmd1bWVudHMgaW4gcHJpbnRmIGZ1bmN0aW9ucy4gICovCiMgZGVmaW5lIHVpbnQ2NF90eXBlTE9XKHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgJiAweGZmZmZmZmZmKSkpIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwojIGRlZmluZSB1aW50NjRfdHlwZUhJR0goeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSA+PiAzMikgJiAweGZmZmZmZmZmKSkgLyogQkZEX0hPU1RfNjRfQklUICovCgojZW5kaWYgLyogQkZEX0hPU1RfNjRfQklUICovCgojaW5jbHVkZSAiZm9wZW4tdm1zLmgiCgojZGVmaW5lIE5PX0ZDTlRMIDEKCiNpZm5kZWYgT19BQ0NNT0RFCiNkZWZpbmUgT19BQ0NNT0RFIChPX1JET05MWSB8IE9fV1JPTkxZIHwgT19SRFdSKQojZW5kaWYKCmV4dGVybiBpbnQgZ2V0cGFnZXNpemUgUEFSQU1TICgodm9pZCkpOwo=