LyoKICogTkRSIGRlZmluaXRpb25zCiAqCiAqIENvcHlyaWdodCAyMDAxIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX05EUl9NSVNDX0gKI2RlZmluZSBfX1dJTkVfTkRSX01JU0NfSAoKI2luY2x1ZGUgPHN0ZGFyZy5oPgoKI2luY2x1ZGUgInJwY25kci5oIgoKc3RydWN0IElQU0ZhY3RvcnlCdWZmZXI7CgpMT05HX1BUUiBSUENSVDRfTmRyQ2xpZW50Q2FsbDIoUE1JRExfU1RVQl9ERVNDIHBTdHViRGVzYywKCQkJICAgICAgIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQsIHZhX2xpc3QgYXJncyApOwoKSFJFU1VMVCBSUENSVDRfR2V0UFNGYWN0b3J5KFJFRklJRCByaWlkLCBzdHJ1Y3QgSVBTRmFjdG9yeUJ1ZmZlciAqKnBwUFMpOwoKUEZPUk1BVF9TVFJJTkcgQ29tcHV0ZUNvbmZvcm1hbmNlKE1JRExfU1RVQl9NRVNTQUdFICpwU3R1Yk1zZywgdW5zaWduZWQgY2hhciAqcE1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQsIFVMT05HX1BUUiBkZWYpOwoKdHlwZWRlZiB1bnNpZ25lZCBjaGFyKiAoV0lOQVBJICpORFJfTUFSU0hBTEwpICAoUE1JRExfU1RVQl9NRVNTQUdFLCB1bnNpZ25lZCBjaGFyKiwgUEZPUk1BVF9TVFJJTkcpOwp0eXBlZGVmIHVuc2lnbmVkIGNoYXIqIChXSU5BUEkgKk5EUl9VTk1BUlNIQUxMKShQTUlETF9TVFVCX01FU1NBR0UsIHVuc2lnbmVkIGNoYXIqKixQRk9STUFUX1NUUklORywgdW5zaWduZWQgY2hhcik7CnR5cGVkZWYgdm9pZCAgICAgICAgICAgKFdJTkFQSSAqTkRSX0JVRkZFUlNJWkUpKFBNSURMX1NUVUJfTUVTU0FHRSwgdW5zaWduZWQgY2hhciosIFBGT1JNQVRfU1RSSU5HKTsKdHlwZWRlZiB1bnNpZ25lZCBsb25nICAoV0lOQVBJICpORFJfTUVNT1JZU0laRSkoUE1JRExfU1RVQl9NRVNTQUdFLCAgICAgICAgICAgICAgICAgUEZPUk1BVF9TVFJJTkcpOwp0eXBlZGVmIHZvaWQgICAgICAgICAgIChXSU5BUEkgKk5EUl9GUkVFKSAgICAgIChQTUlETF9TVFVCX01FU1NBR0UsIHVuc2lnbmVkIGNoYXIqLCBQRk9STUFUX1NUUklORyk7CgpleHRlcm4gTkRSX01BUlNIQUxMICAgTmRyTWFyc2hhbGxlcltdOwpleHRlcm4gTkRSX1VOTUFSU0hBTEwgTmRyVW5tYXJzaGFsbGVyW107CmV4dGVybiBORFJfQlVGRkVSU0laRSBOZHJCdWZmZXJTaXplcltdOwpleHRlcm4gTkRSX01FTU9SWVNJWkUgTmRyTWVtb3J5U2l6ZXJbXTsKZXh0ZXJuIE5EUl9GUkVFICAgICAgIE5kckZyZWVyW107CgojZW5kaWYgIC8qIF9fV0lORV9ORFJfTUlTQ19IICovCg==