LyogdGltc2ttb2R1dGlscy5oCiAqCiAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CiAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCiAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCiAqIGRldGFpbHMuCiAqLwoKI2lmbmRlZiBfX1RJTVNLTU9EVVRJTFNfSF9fCiNkZWZpbmUgX19USU1TS01PRFVUSUxTX0hfXwoKI2luY2x1ZGUgInRpbXNrbW9kLmgiCgp2b2lkICprbWFsbG9jX2tlcm5lbChzaXplX3Qgc2l6KTsKdm9pZCAgbXlwcmludGsoY29uc3QgY2hhciAqbXlEcnZOYW1lLCBjb25zdCBjaGFyICpkZXZuYW1lLAoJCWNvbnN0IGNoYXIgKnRlbXBsYXRlLCAuLi4pOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKICotLS0gIEdFTkVSQUwgTUVTU0FHRVEgU1RVRkYgIC0tLSoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpzdHJ1Y3QgTWVzc2FnZVFFbnRyeTsKCi8qKiB0aGUgZGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGFuIGFyYml0cmFyeSBkYXRhIGl0ZW0gdGhhdCB5b3Ugd2FudAogKiAgdG8gcGxhY2Ugb24gYSAjTUVTU0FHRVEuICBEZWNsYXJlIGFuZCBpbml0aWFsaXplIGFzIGZvbGxvd3M6CiAqCiAqICBUaGlzIHN0cnVjdHVyZSBzaG91bGQgYmUgY29uc2lkZXJlZCBvcGFxdWU7IHRoZSBjbGllbnQgdXNpbmcgaXQgc2hvdWxkCiAqICBuZXZlciBhY2Nlc3MgdGhlIGZpZWxkcyBkaXJlY3RseS4KICogIFJlZmVyIHRvIHRoZXNlIGZ1bmN0aW9ucyBmb3IgbW9yZSBpbmZvOgogKgogKiAgQGluZ3JvdXAgbWVzc2FnZXEKICovCnR5cGVkZWYgc3RydWN0IE1lc3NhZ2VRRW50cnkgewoJdm9pZCAqZGF0YTsKCXN0cnVjdCBNZXNzYWdlUUVudHJ5ICpxTmV4dDsKCXN0cnVjdCBNZXNzYWdlUUVudHJ5ICpxUHJldjsKfSBNRVNTQUdFUUVOVFJZOwoKLyoqIHRoZSBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYSBGSUZPIHF1ZXVlIG9mICNNRVNTQUdFUUVOVFJZPGI+PC9iPnMuCiAqICBEZWNsYXJlIGFuZCBpbml0aWFsaXplIGFzIGZvbGxvd3M6CiAqICBAY29kZQogKiAgICAgIE1FU1NBR0VRIG15UXVldWU7CiAqICBAZW5kY29kZQogKiAgVGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3BhcXVlOyB0aGUgY2xpZW50IHVzaW5nIGl0IHNob3VsZAogKiAgbmV2ZXIgYWNjZXNzIHRoZSBmaWVsZHMgZGlyZWN0bHkuCiAqICBSZWZlciB0byB0aGVzZSBmdW5jdGlvbnMgZm9yIG1vcmUgaW5mbzoKICoKICogIEBpbmdyb3VwIG1lc3NhZ2VxCiAqLwp0eXBlZGVmIHN0cnVjdCBNZXNzYWdlUSB7CglNRVNTQUdFUUVOVFJZICpxSGVhZDsKCU1FU1NBR0VRRU5UUlkgKnFUYWlsOwoJc3RydWN0IHNlbWFwaG9yZSBuUUVudHJpZXM7CglzcGlubG9ja190ICAgICAgIHF1ZXVlTG9jazsKfSBNRVNTQUdFUTsKCmNoYXIgKmN5Y2xlc1RvU2Vjb25kcyh1NjQgY3ljbGVzLCB1NjQgY3ljbGVzUGVyU2Vjb25kLAoJCSAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpOwpjaGFyICpjeWNsZXNUb0l0ZXJhdGlvblNlY29uZHModTY0IGN5Y2xlcywgdTY0IGN5Y2xlc1BlclNlY29uZCwKCQkJICAgICAgIHU2NCBpdGVyYXRpb25zLCBjaGFyICpidWYsIHNpemVfdCBidWZzaXplKTsKY2hhciAqY3ljbGVzVG9Tb21ldGhpbmdzUGVyU2Vjb25kKHU2NCBjeWNsZXMsIHU2NCBjeWNsZXNQZXJTZWNvbmQsCgkJCQkgIHU2NCBzb21ldGhpbmdzLCBjaGFyICpidWYsIHNpemVfdCBidWZzaXplKTsKc3RydWN0IHNlcV9maWxlICp2aXNvcl9zZXFfZmlsZV9uZXdfYnVmZmVyKHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplKTsKdm9pZCB2aXNvcl9zZXFfZmlsZV9kb25lX2J1ZmZlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOwoKI2VuZGlmCg==