LyogQm9vc3QgaW50ZXJ2YWwvZGV0YWlsL21zdmNfcm91bmRpbmdfY29udHJvbC5ocHAgZmlsZQogKgogKiBDb3B5cmlnaHQgMjAwMCBNYWFydGVuIEtlaWp6ZXIKICogQ29weXJpZ2h0IDIwMDIgSGVydukgQnL2bm5pbWFubiwgR3VpbGxhdW1lIE1lbHF1aW9uZCwgU3lsdmFpbiBQaW9uCiAqCiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKICogY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCiAqLwoKI2lmbmRlZiBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0RFVEFJTF9NU1ZDX1JPVU5ESU5HX0NPTlRST0xfSFBQCiNkZWZpbmUgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9ERVRBSUxfTVNWQ19ST1VORElOR19DT05UUk9MX0hQUAoKI2lmbmRlZiBfTVNDX1ZFUgojICBlcnJvciBUaGlzIGhlYWRlciBpcyBvbmx5IGludGVuZGVkIGZvciBNU1ZDLCBidXQgbWlnaHQgd29yayBmb3IgQm9ybGFuZCBhcyB3ZWxsCiNlbmRpZgoKI2luY2x1ZGUgPGZsb2F0Lmg+ICAgICAgLy8gTVNWQyByb3VuZGluZyBjb250cm9sCgovLyBBbHRob3VnaCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIF9jb250cm9sODcsIGl0IHNlZW1zIHRvIHdvcmsgZm9yCi8vIG90aGVyIEZQVXMgdG9vLCBzbyBpdCBkb2VzIG5vdCBoYXZlIHRvIGJlIGNoYW5nZWQgdG8gX2NvbnRyb2xmcC4KCm5hbWVzcGFjZSBib29zdCB7Cm5hbWVzcGFjZSBudW1lcmljIHsKbmFtZXNwYWNlIGludGVydmFsX2xpYiB7Cm5hbWVzcGFjZSBkZXRhaWwgewoKZXh0ZXJuICJDIiB7IGRvdWJsZSByaW50KGRvdWJsZSk7IH0KCnN0cnVjdCB4ODZfcm91bmRpbmcKewogIHN0YXRpYyB1bnNpZ25lZCBpbnQgaGFyZDJtc3ZjKHVuc2lnbmVkIHNob3J0IG0pIHsKICAgIHVuc2lnbmVkIGludCBuID0gMDsKICAgIGlmIChtICYgMHgwMSkgbiB8PSBfRU1fSU5WQUxJRDsKICAgIGlmIChtICYgMHgwMikgbiB8PSBfRU1fREVOT1JNQUw7CiAgICBpZiAobSAmIDB4MDQpIG4gfD0gX0VNX1pFUk9ESVZJREU7CiAgICBpZiAobSAmIDB4MDgpIG4gfD0gX0VNX09WRVJGTE9XOwogICAgaWYgKG0gJiAweDEwKSBuIHw9IF9FTV9VTkRFUkZMT1c7CiAgICBpZiAobSAmIDB4MjApIG4gfD0gX0VNX0lORVhBQ1Q7CiAgICBzd2l0Y2ggKG0gJiAweDMwMCkgewogICAgY2FzZSAweDAwMDogbiB8PSBfUENfMjQ7IGJyZWFrOwogICAgY2FzZSAweDIwMDogbiB8PSBfUENfNTM7IGJyZWFrOwogICAgY2FzZSAweDMwMDogbiB8PSBfUENfNjQ7IGJyZWFrOwogICAgfQogICAgc3dpdGNoIChtICYgMHhDMDApIHsKICAgIGNhc2UgMHgwMDA6IG4gfD0gX1JDX05FQVI7IGJyZWFrOwogICAgY2FzZSAweDQwMDogbiB8PSBfUkNfRE9XTjsgYnJlYWs7CiAgICBjYXNlIDB4ODAwOiBuIHw9IF9SQ19VUDsgICBicmVhazsKICAgIGNhc2UgMHhDMDA6IG4gfD0gX1JDX0NIT1A7IGJyZWFrOwogICAgfQogICAgaWYgKG0gJiAweDEwMDApIG4gfD0gX0lDX0FGRklORTsgLy8gb25seSB1c2VmdWwgb24gMjg3CiAgICByZXR1cm4gbjsKICB9CgogIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBtc3ZjMmhhcmQodW5zaWduZWQgaW50IG4pIHsKICAgIHVuc2lnbmVkIHNob3J0IG0gPSAwOwogICAgaWYgKG4gJiBfRU1fSU5WQUxJRCkgICAgbSB8PSAweDAxOwogICAgaWYgKG4gJiBfRU1fREVOT1JNQUwpICAgbSB8PSAweDAyOwogICAgaWYgKG4gJiBfRU1fWkVST0RJVklERSkgbSB8PSAweDA0OwogICAgaWYgKG4gJiBfRU1fT1ZFUkZMT1cpICAgbSB8PSAweDA4OwogICAgaWYgKG4gJiBfRU1fVU5ERVJGTE9XKSAgbSB8PSAweDEwOwogICAgaWYgKG4gJiBfRU1fSU5FWEFDVCkgICAgbSB8PSAweDIwOwogICAgc3dpdGNoIChuICYgX01DV19SQykgewogICAgY2FzZSBfUkNfTkVBUjogbSB8PSAweDAwMDsgYnJlYWs7CiAgICBjYXNlIF9SQ19ET1dOOiBtIHw9IDB4NDAwOyBicmVhazsKICAgIGNhc2UgX1JDX1VQOiAgIG0gfD0gMHg4MDA7IGJyZWFrOwogICAgY2FzZSBfUkNfQ0hPUDogbSB8PSAweEMwMDsgYnJlYWs7CiAgICB9CiAgICBzd2l0Y2ggKG4gJiBfTUNXX1BDKSB7CiAgICBjYXNlIF9QQ18yNDogbSB8PSAweDAwMDsgYnJlYWs7CiAgICBjYXNlIF9QQ181MzogbSB8PSAweDIwMDsgYnJlYWs7CiAgICBjYXNlIF9QQ182NDogbSB8PSAweDMwMDsgYnJlYWs7CiAgICB9CiAgICBpZiAoKG4gJiBfTUNXX0lDKSA9PSBfSUNfQUZGSU5FKSBtIHw9IDB4MTAwMDsKICAgIHJldHVybiBtOwogIH0KCiAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCByb3VuZGluZ19tb2RlOwogIHN0YXRpYyB2b2lkIGdldF9yb3VuZGluZ19tb2RlKHJvdW5kaW5nX21vZGUmIG1vZGUpCiAgeyBtb2RlID0gbXN2YzJoYXJkKF9jb250cm9sODcoMCwgMCkpOyB9CiAgc3RhdGljIHZvaWQgc2V0X3JvdW5kaW5nX21vZGUoY29uc3Qgcm91bmRpbmdfbW9kZSBtb2RlKQogIHsgX2NvbnRyb2w4NyhoYXJkMm1zdmMobW9kZSksIF9NQ1dfRU0gfCBfTUNXX1JDIHwgX01DV19QQyB8IF9NQ1dfSUMpOyB9CiAgc3RhdGljIGRvdWJsZSB0b19pbnQoY29uc3QgZG91YmxlJiB4KSB7IHJldHVybiByaW50KHgpOyB9Cn07Cgp9IC8vIG5hbWVzcGFjZSBkZXRhaWwKfSAvLyBuYW1lc3BhY2UgaW50ZXJ2YWxfbGliCn0gLy8gbmFtZXNwYWNlIG51bWVyaWMKfSAvLyBuYW1lc3BhY2UgYm9vc3QKCiNlbmRpZiAvKiBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0RFVEFJTF9NU1ZDX1JPVU5ESU5HX0NPTlRST0xfSFBQICovCg==