LyoKICogIEhUTUwgRW50aXR5ICYgRW5jb2Rpbmcgbm9ybWFsaXphdGlvbi4KICoKICogIENvcHlyaWdodCAoQykgMjAwNiBU9nL2ayBFZHZpbiA8ZWR3aW5AY2xhbWF2Lm5ldD4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyAKICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAogKiAgTUEgMDIxMTAtMTMwMSwgVVNBLgogKgogKi8KCiNpZm5kZWYgX0VOVElUSUVTX0gKI2RlZmluZSBfRU5USVRJRVNfSAojaW5jbHVkZSAiY2x0eXBlcy5oIgoKI2luY2x1ZGUgImhhc2h0YWIuaCIKCiNkZWZpbmUgVUNTNF8xMjM0IChjb25zdCB1bnNpZ25lZCBjaGFyKikiVUNTLTRMRSIKI2RlZmluZSBVQ1M0XzQzMjEgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSJVQ1MtNEJFIgojZGVmaW5lIFVDUzRfMjE0MyAoY29uc3QgdW5zaWduZWQgY2hhciopIlVDUzQiCiNkZWZpbmUgVUNTNF8zNDEyIChjb25zdCB1bnNpZ25lZCBjaGFyKikiVUNTLTQiCiNkZWZpbmUgVVRGMTZfQkUgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSJVVEYtMTZCRSIKI2RlZmluZSBVVEYxNl9MRSAoY29uc3QgdW5zaWduZWQgY2hhciopIlVURi0xNkxFIgojZGVmaW5lIFVURjggICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKikiVVRGLTgiCiNkZWZpbmUgVU5ERUNJREVEXzMyXzEyMzQgVUNTNF8xMjM0CiNkZWZpbmUgVU5ERUNJREVEXzMyXzQzMjEgVUNTNF80MzIxCiNkZWZpbmUgVU5ERUNJREVEXzMyXzIxNDMgVUNTNF8yMTQzCiNkZWZpbmUgVU5ERUNJREVEXzMyXzM0MTIgVUNTNF8zNDEyCiNkZWZpbmUgVU5ERUNJREVEXzE2X0JFIFVURjE2X0JFCiNkZWZpbmUgVU5ERUNJREVEXzE2X0xFIFVURjE2X0xFCiNkZWZpbmUgVU5ERUNJREVEXzggKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSJJU08tODg1OS0xIgojZGVmaW5lIEVCQ0RJQyAoY29uc3QgdW5zaWduZWQgY2hhciopIkVCQ0RJQy1VUyIKI2RlZmluZSBVTktOT1dOIChjb25zdCB1bnNpZ25lZCBjaGFyKikiXDAiCiNkZWZpbmUgT1RIRVIgICAoY29uc3QgdW5zaWduZWQgY2hhciopIk9USEVSIgoKZW51bSBlbmNvZGluZ19wcmlvcml0eSB7Tk9QUklPLENPTlRFTlRfVFlQRSxCT00sTk9CT01fQVVUT0RFVEVDVCxYTUxfQ0hBUlNFVCxNRVRBfTsKCmVudW0gZW5jb2RpbmdzIHtFX1VDUzQsRV9VVEYxNixFX1VDUzRfMTIzNCxFX1VDUzRfNDMyMSxFX1VDUzRfMjEzNCxFX1VDUzRfMzQxMixFX1VURjE2X0JFLEVfVVRGMTZfTEUsRV9VVEY4LEVfVU5LTk9XTixFX09USEVSfTsKI2RlZmluZSBNQVhfRU5USVRZX1NJWkUgMjIKCnN0cnVjdCBlbnRpdHlfY29udiB7Cgl1bnNpZ25lZCBjaGFyKiBlbmNvZGluZzsKCWNvbnN0IHVuc2lnbmVkIGNoYXIqIGF1dG9kZXRlY3RlZDsKCWVudW0gZW5jb2RpbmdfcHJpb3JpdHkgcHJpb3JpdHk7Cgl1bnNpZ25lZCBzaG9ydCBpbnQgZW5jb2Rpbmdfc3BlY2lmaWM7Lyogc3ViLWVuY29kaW5nLCB1c2VkIGZvciBJU08qLwoJY29uc3Qgc3RydWN0IGhhc2h0YWJsZSogaHQ7Cgl1aW50OF90IGhhc19ib207Cgl1aW50OF90IGVuY19ieXRlczsKCXVpbnQ4X3QgYnl0ZXNfcmVhZDsKCXVpbnQ4X3QgIGJvbV9jbnQ7Cgl1aW50MzJfdCBwYXJ0aWFsOwoJdW5zaWduZWQgY2hhciBib21bNF07CiNpZiAwCQoJY2hhciogYnVmZmVyOwoJY2hhciogYnVmZmVyMjsKI2VuZGlmCQoJc2l6ZV90IGJ1ZmZlcl9zaXplOwoJc2l6ZV90IGJ1ZmZlcl9jbnQ7Cgl1aW50OF90IGVudGl0eV9idWZmY250OwoJY2hhciBlbnRpdHlfYnVmZltNQVhfRU5USVRZX1NJWkUrMl07CgltX2FyZWFfdCB0bXBfYXJlYTsKCW1fYXJlYV90IG91dF9hcmVhOwoJbV9hcmVhX3Qgbm9ybV9hcmVhOwoJaW50ICAgICAgbXNnX3plcm9fc2hvd247Cn07CgoKaW50IGluaXRfZW50aXR5X2NvbnZlcnRlcihzdHJ1Y3QgZW50aXR5X2NvbnYqIGNvbnYsY29uc3QgdW5zaWduZWQgY2hhciogZW5jb2Rpbmcsc2l6ZV90IGJ1ZmZlcl9zaXplKTsKdm9pZCBwcm9jZXNzX2VuY29kaW5nX3NldChzdHJ1Y3QgZW50aXR5X2NvbnYqIGNvbnYsY29uc3QgdW5zaWduZWQgY2hhciogZW5jb2RpbmcsZW51bSBlbmNvZGluZ19wcmlvcml0eSBwcmlvcml0eSk7CmludCBlbnRpdHlfbm9ybV9kb25lKHN0cnVjdCBlbnRpdHlfY29udiogY29udik7Cgp1bnNpZ25lZCBjaGFyKiBlbmNvZGluZ19ub3JtX3JlYWRsaW5lKHN0cnVjdCBlbnRpdHlfY29udiogY29udiwgRklMRSogc3RyZWFtX2luLCBtX2FyZWFfdCogaW5fbV9hcmVhLCBjb25zdCBzaXplX3QgbWF4bGVuKTsKdW5zaWduZWQgY2hhciogZW50aXR5X25vcm0oY29uc3Qgc3RydWN0IGVudGl0eV9jb252KiBjb252LGNvbnN0IHVuc2lnbmVkIGNoYXIqIGVudGl0eSk7CmludCBlbnRpdHlub3JtX2luaXQodm9pZCk7CgojZW5kaWYKCg==