LyoKICogTkRSIGRlZmluaXRpb25zCiAqCiAqIENvcHlyaWdodCAyMDAxIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX05EUl9NSVNDX0gKI2RlZmluZSBfX1dJTkVfTkRSX01JU0NfSAoKI2luY2x1ZGUgPHN0ZGFyZy5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAicnBjLmgiCiNpbmNsdWRlICJycGNuZHIuaCIKCnN0cnVjdCBJUFNGYWN0b3J5QnVmZmVyOwoKI2RlZmluZSBDb21wdXRlQ29uZm9ybWFuY2UocFN0dWJNc2csIHBNZW1vcnksIHBGb3JtYXQsIGRlZikgQ29tcHV0ZUNvbmZvcm1hbmNlT3JWYXJpYW5jZShwU3R1Yk1zZywgcE1lbW9yeSwgcEZvcm1hdCwgZGVmLCAmcFN0dWJNc2ctPk1heENvdW50KQojZGVmaW5lIENvbXB1dGVWYXJpYW5jZShwU3R1Yk1zZywgcE1lbW9yeSwgcEZvcm1hdCwgZGVmKSBDb21wdXRlQ29uZm9ybWFuY2VPclZhcmlhbmNlKHBTdHViTXNnLCBwTWVtb3J5LCBwRm9ybWF0LCBkZWYsICZwU3R1Yk1zZy0+QWN0dWFsQ291bnQpClBGT1JNQVRfU1RSSU5HIENvbXB1dGVDb25mb3JtYW5jZU9yVmFyaWFuY2UoCiAgICBNSURMX1NUVUJfTUVTU0FHRSAqcFN0dWJNc2csIHVuc2lnbmVkIGNoYXIgKnBNZW1vcnksCiAgICBQRk9STUFUX1NUUklORyBwRm9ybWF0LCBVTE9OR19QVFIgZGVmLCBVTE9ORyAqcENvdW50KTsKCnR5cGVkZWYgdW5zaWduZWQgY2hhciogKFdJTkFQSSAqTkRSX01BUlNIQUxMKSAgKFBNSURMX1NUVUJfTUVTU0FHRSwgdW5zaWduZWQgY2hhciosIFBGT1JNQVRfU1RSSU5HKTsKdHlwZWRlZiB1bnNpZ25lZCBjaGFyKiAoV0lOQVBJICpORFJfVU5NQVJTSEFMTCkoUE1JRExfU1RVQl9NRVNTQUdFLCB1bnNpZ25lZCBjaGFyKiosUEZPUk1BVF9TVFJJTkcsIHVuc2lnbmVkIGNoYXIpOwp0eXBlZGVmIHZvaWQgICAgICAgICAgIChXSU5BUEkgKk5EUl9CVUZGRVJTSVpFKShQTUlETF9TVFVCX01FU1NBR0UsIHVuc2lnbmVkIGNoYXIqLCBQRk9STUFUX1NUUklORyk7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyAgKFdJTkFQSSAqTkRSX01FTU9SWVNJWkUpKFBNSURMX1NUVUJfTUVTU0FHRSwgICAgICAgICAgICAgICAgIFBGT1JNQVRfU1RSSU5HKTsKdHlwZWRlZiB2b2lkICAgICAgICAgICAoV0lOQVBJICpORFJfRlJFRSkgICAgICAoUE1JRExfU1RVQl9NRVNTQUdFLCB1bnNpZ25lZCBjaGFyKiwgUEZPUk1BVF9TVFJJTkcpOwoKZXh0ZXJuIGNvbnN0IE5EUl9NQVJTSEFMTCAgIE5kck1hcnNoYWxsZXJbXTsKZXh0ZXJuIGNvbnN0IE5EUl9VTk1BUlNIQUxMIE5kclVubWFyc2hhbGxlcltdOwpleHRlcm4gY29uc3QgTkRSX0JVRkZFUlNJWkUgTmRyQnVmZmVyU2l6ZXJbXTsKZXh0ZXJuIGNvbnN0IE5EUl9NRU1PUllTSVpFIE5kck1lbW9yeVNpemVyW107CmV4dGVybiBjb25zdCBORFJfRlJFRSAgICAgICBOZHJGcmVlcltdOwoKI2VuZGlmICAvKiBfX1dJTkVfTkRSX01JU0NfSCAqLwo=