LyogQm9vc3QgaW50ZXJ2YWwvZGV0YWlsL3BwY19yb3VuZGluZ19jb250cm9sLmhwcCBmaWxlCiAqCiAqIENvcHlyaWdodCAyMDAwIEplbnMgTWF1cmVyCiAqIENvcHlyaWdodCAyMDAyIEhlcnbpIEJy9m5uaW1hbm4sIEd1aWxsYXVtZSBNZWxxdWlvbmQsIFN5bHZhaW4gUGlvbgogKiBDb3B5cmlnaHQgMjAwNSBHdWlsbGF1bWUgTWVscXVpb25kCiAqCiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKICogY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCiAqLwoKI2lmbmRlZiBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0RFVEFJTF9QUENfUk9VTkRJTkdfQ09OVFJPTF9IUFAKI2RlZmluZSBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0RFVEFJTF9QUENfUk9VTkRJTkdfQ09OVFJPTF9IUFAKCiNpZiAhZGVmaW5lZChwb3dlcnBjKSAmJiAhZGVmaW5lZChfX3Bvd2VycGNfXykgJiYgIWRlZmluZWQoX19wcGNfXykKI2Vycm9yIFRoaXMgaGVhZGVyIG9ubHkgd29ya3Mgb24gUFBDIENQVXMuCiNlbmRpZgoKI2lmIGRlZmluZWQoX19HTlVDX18gKSB8fCAoX19JQk1DUFBfXyA+PSA3MDApCgpuYW1lc3BhY2UgYm9vc3QgewpuYW1lc3BhY2UgbnVtZXJpYyB7Cm5hbWVzcGFjZSBpbnRlcnZhbF9saWIgewpuYW1lc3BhY2UgZGV0YWlsIHsKCnR5cGVkZWYgdW5pb24gewogICA6OmJvb3N0Ojpsb25nX2xvbmdfdHlwZSBpbW9kZTsKICBkb3VibGUgZG1vZGU7Cn0gcm91bmRpbmdfbW9kZV9zdHJ1Y3Q7CgpzdGF0aWMgY29uc3Qgcm91bmRpbmdfbW9kZV9zdHJ1Y3QgbW9kZV91cHdhcmQgICAgICA9IHsgMHhGRkY4MDAwMDAwMDAwMDAyTEwgfTsKc3RhdGljIGNvbnN0IHJvdW5kaW5nX21vZGVfc3RydWN0IG1vZGVfZG93bndhcmQgICAgPSB7IDB4RkZGODAwMDAwMDAwMDAwM0xMIH07CnN0YXRpYyBjb25zdCByb3VuZGluZ19tb2RlX3N0cnVjdCBtb2RlX3RvX25lYXJlc3QgID0geyAweEZGRjgwMDAwMDAwMDAwMDBMTCB9OwpzdGF0aWMgY29uc3Qgcm91bmRpbmdfbW9kZV9zdHJ1Y3QgbW9kZV90b3dhcmRfemVybyA9IHsgMHhGRkY4MDAwMDAwMDAwMDAxTEwgfTsKCnN0cnVjdCBwcGNfcm91bmRpbmdfY29udHJvbAp7CiAgdHlwZWRlZiBkb3VibGUgcm91bmRpbmdfbW9kZTsKCiAgc3RhdGljIHZvaWQgc2V0X3JvdW5kaW5nX21vZGUoY29uc3Qgcm91bmRpbmdfbW9kZSBtb2RlKQogIHsgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtdGZzZiAyNTUsJTAiIDogOiAiZiIobW9kZSkpOyB9CgogIHN0YXRpYyB2b2lkIGdldF9yb3VuZGluZ19tb2RlKHJvdW5kaW5nX21vZGUmIG1vZGUpCiAgeyBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1mZnMgJTAiIDogIj1mIihtb2RlKSk7IH0KCiAgc3RhdGljIHZvaWQgZG93bndhcmQoKSAgICB7IHNldF9yb3VuZGluZ19tb2RlKG1vZGVfZG93bndhcmQuZG1vZGUpOyAgICB9CiAgc3RhdGljIHZvaWQgdXB3YXJkKCkgICAgICB7IHNldF9yb3VuZGluZ19tb2RlKG1vZGVfdXB3YXJkLmRtb2RlKTsgICAgICB9CiAgc3RhdGljIHZvaWQgdG9fbmVhcmVzdCgpICB7IHNldF9yb3VuZGluZ19tb2RlKG1vZGVfdG9fbmVhcmVzdC5kbW9kZSk7ICB9CiAgc3RhdGljIHZvaWQgdG93YXJkX3plcm8oKSB7IHNldF9yb3VuZGluZ19tb2RlKG1vZGVfdG93YXJkX3plcm8uZG1vZGUpOyB9Cn07Cgp9IC8vIG5hbWVzcGFjZSBkZXRhaWwKCi8vIERvIG5vdCBkZWNsYXJlIHRoZSBmb2xsb3dpbmcgQzk5IHN5bWJvbHMgaWYgPG1hdGguaD4gcHJvdmlkZXMgdGhlbS4KLy8gT3RoZXJ3aXNlLCBjb25mbGljdHMgbWF5IG9jY3VyLCBkdWUgdG8gZGlmZmVyZW5jZXMgYmV0d2VlbiBwcm90b3R5cGVzLgojaWYgIWRlZmluZWQoX0lTT0M5OV9TT1VSQ0UpICYmICFkZWZpbmVkKF9fVVNFX0lTT0M5OSkKZXh0ZXJuICJDIiB7CiAgZmxvYXQgcmludGYoZmxvYXQpOwogIGRvdWJsZSByaW50KGRvdWJsZSk7Cn0KI2VuZGlmCgp0ZW1wbGF0ZTw+CnN0cnVjdCByb3VuZGluZ19jb250cm9sPGZsb2F0PjoKICBkZXRhaWw6OnBwY19yb3VuZGluZ19jb250cm9sCnsKICBzdGF0aWMgZmxvYXQgZm9yY2Vfcm91bmRpbmcoY29uc3QgZmxvYXQgcikKICB7CiAgICBmbG9hdCB0bXA7CiAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZyc3AgJTAsICUxIiA6ICI9ZiIgKHRtcCkgOiAiZiIgKHIpKTsKICAgIHJldHVybiB0bXA7CiAgfQogIHN0YXRpYyBmbG9hdCB0b19pbnQoY29uc3QgZmxvYXQmIHgpIHsgcmV0dXJuIHJpbnRmKHgpOyB9Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCByb3VuZGluZ19jb250cm9sPGRvdWJsZT46CiAgZGV0YWlsOjpwcGNfcm91bmRpbmdfY29udHJvbAp7CiAgc3RhdGljIGNvbnN0IGRvdWJsZSAmIGZvcmNlX3JvdW5kaW5nKGNvbnN0IGRvdWJsZSYgcikgeyByZXR1cm4gcjsgfQogIHN0YXRpYyBkb3VibGUgdG9faW50KGNvbnN0IGRvdWJsZSYgcikgeyByZXR1cm4gcmludChyKTsgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3Qgcm91bmRpbmdfY29udHJvbDxsb25nIGRvdWJsZT46CiAgZGV0YWlsOjpwcGNfcm91bmRpbmdfY29udHJvbAp7CiAgc3RhdGljIGNvbnN0IGxvbmcgZG91YmxlICYgZm9yY2Vfcm91bmRpbmcoY29uc3QgbG9uZyBkb3VibGUmIHIpIHsgcmV0dXJuIHI7IH0KICBzdGF0aWMgbG9uZyBkb3VibGUgdG9faW50KGNvbnN0IGxvbmcgZG91YmxlJiByKSB7IHJldHVybiByaW50KHIpOyB9Cn07Cgp9IC8vIG5hbWVzcGFjZSBpbnRlcnZhbF9saWIKfSAvLyBuYW1lc3BhY2UgbnVtZXJpYwp9IC8vIG5hbWVzcGFjZSBib29zdAoKI3VuZGVmIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfTk9fSEFSRFdBUkUKI2VuZGlmCgojZW5kaWYgLyogQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9ERVRBSUxfUFBDX1JPVU5ESU5HX0NPTlRST0xfSFBQICovCg==