LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA2LTIwMDggVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRYLiwgVVNBCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIENvcHlyaWdodCAyMDA5IFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAogKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCiAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgogKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCiAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogQXV0aG9yczogVGhvbWFzIEhlbGxzdHL2bSA8dGhvbWFzLWF0LXR1bmdzdGVuZ3JhcGhpY3MtZG90LWNvbT4KICovCgojaWZuZGVmIF9XU0JNX0JVRlBPT0xfSF8KI2RlZmluZSBfV1NCTV9CVUZQT09MX0hfCgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgIndzYm1fdXRpbC5oIgojaW5jbHVkZSAid3NibV9kcml2ZXIuaCIKI2luY2x1ZGUgIndzYm1fYXRvbWljLmgiCgpzdHJ1Y3QgX1dzYm1GZW5jZU9iamVjdDsKCnN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UKewogICAgc3RydWN0IF9Xc2JtQnVmZmVyUG9vbCAqcG9vbDsKICAgIHN0cnVjdCBfV3NibU11dGV4IG11dGV4OwogICAgc3RydWN0IF9Xc2JtQXRvbWljIHJlZkNvdW50OwogICAgc3RydWN0IF9Xc2JtQXRvbWljIG9uTGlzdDsKICAgIHZvaWQgKmRlc3Ryb3lBcmc7CiAgICB2b2lkICgqZGVzdHJveUNvbnRhaW5lcikgKHZvaWQgKik7Cn07CgpzdHJ1Y3QgX1dzYm1LZXJuZWxCdWY7CgpzdHJ1Y3QgX1dzYm1CdWZmZXJQb29sCnsKICAgIGludCBmZDsKICAgIGludCAoKm1hcCkgKHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKiBidWYsIHVuc2lnbmVkIG1vZGUsIHZvaWQgKip2aXJ0dWFsKTsKICAgIHZvaWQgKCp1bm1hcCkgKHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKiBidWYpOwogICAgaW50ICgqc3luY2ZvcmNwdSkgKHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKiBidWYsIHVuc2lnbmVkIG1vZGUpOwogICAgdm9pZCAoKnJlbGVhc2Vmcm9tY3B1KSAoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqIGJ1ZiwgdW5zaWduZWQgbW9kZSk7CiAgICB2b2lkICgqZGVzdHJveSkgKHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKiogYnVmKTsKICAgIHVuc2lnbmVkIGxvbmcgKCpvZmZzZXQpIChzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICogYnVmKTsKICAgIHVuc2lnbmVkIGxvbmcgKCpwb29sT2Zmc2V0KSAoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqIGJ1Zik7CiAgICAgICAgdWludDMyX3QoKnBsYWNlbWVudCkgKHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKiBidWYpOwogICAgdW5zaWduZWQgbG9uZyAoKnNpemUpIChzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICogYnVmKTsKICAgIHN0cnVjdCBfV3NibUtlcm5lbEJ1ZiAqKCprZXJuZWwpIChzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICogYnVmKTsKICAgIHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKigqY3JlYXRlKSAoc3RydWN0IF9Xc2JtQnVmZmVyUG9vbCAqIHBvb2wsCgkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLAoJCQkJICAgICAgIHVpbnQzMl90IHBsYWNlbWVudCwKCQkJCSAgICAgICB1bnNpZ25lZCBhbGlnbm1lbnQpOwogICAgc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqKCpjcmVhdGVCeVJlZmVyZW5jZSkgKHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKgoJCQkJCQkgIHBvb2wsIHVpbnQzMl90IGhhbmRsZSk7CiAgICB2b2lkICgqZmVuY2UpIChzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICogYnVmLAoJCSAgIHN0cnVjdCBfV3NibUZlbmNlT2JqZWN0ICogZmVuY2UpOwogICAgdm9pZCAoKnVudmFsaWRhdGUpIChzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICogYnVmKTsKICAgIGludCAoKnZhbGlkYXRlKSAoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqIGJ1ZiwgdWludDY0X3Qgc2V0X2ZsYWdzLAoJCSAgICAgdWludDY0X3QgY2xyX2ZsYWdzKTsKICAgIGludCAoKndhaXRJZGxlKSAoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqIGJ1ZiwgaW50IGxhenkpOwogICAgaW50ICgqc2V0U3RhdHVzKSAoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqIGJ1ZiwKCQkgICAgICB1aW50MzJfdCBzZXRfcGxhY2VtZW50LCB1aW50MzJfdCBjbHJfcGxhY2VtZW50KTsKICAgIHZvaWQgKCp0YWtlRG93bikgKHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKiBwb29sKTsKfTsKCnN0YXRpYyBpbmxpbmUgaW50CndzYm1CdWZTdG9yYWdlSW5pdChzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpzdG9yYWdlLAoJCSAgIHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKnBvb2wpCnsKICAgIGludCByZXQgPSBXU0JNX01VVEVYX0lOSVQoJnN0b3JhZ2UtPm11dGV4KTsKCiAgICBpZiAocmV0KQoJcmV0dXJuIC1FTk9NRU07CiAgICBzdG9yYWdlLT5wb29sID0gcG9vbDsKICAgIHdzYm1BdG9taWNTZXQoJnN0b3JhZ2UtPnJlZkNvdW50LCAxKTsKICAgIHdzYm1BdG9taWNTZXQoJnN0b3JhZ2UtPm9uTGlzdCwgMCk7CiAgICBzdG9yYWdlLT5kZXN0cm95Q29udGFpbmVyID0gTlVMTDsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQKd3NibUJ1ZlN0b3JhZ2VUYWtlZG93bihzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpzdG9yYWdlKQp7CiAgICBXU0JNX01VVEVYX0ZSRUUoJnN0b3JhZ2UtPm11dGV4KTsKfQoKc3RhdGljIGlubGluZSB2b2lkCndzYm1CdWZTdG9yYWdlVW5yZWYoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqKnBTdG9yYWdlKQp7CiAgICBzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpzdG9yYWdlID0gKnBTdG9yYWdlOwoKICAgICpwU3RvcmFnZSA9IE5VTEw7CiAgICBpZiAoc3RvcmFnZSA9PSBOVUxMKQoJcmV0dXJuOwoKICAgIGlmICh3c2JtQXRvbWljRGVjWmVybygmc3RvcmFnZS0+cmVmQ291bnQpKSB7CglpZiAoc3RvcmFnZS0+ZGVzdHJveUNvbnRhaW5lcikKCSAgICBzdG9yYWdlLT5kZXN0cm95Q29udGFpbmVyKHN0b3JhZ2UtPmRlc3Ryb3lBcmcpOwoJc3RvcmFnZS0+cG9vbC0+ZGVzdHJveSgmc3RvcmFnZSk7CglyZXR1cm47CiAgICB9Cn0KCi8qCiAqIEJ1aWx0aW4gcG9vbHMuCiAqLwoKLyoKICogS2VybmVsIGJ1ZmZlciBvYmplY3RzLiBTaXplIGluIG11bHRpcGxlcyBvZiBwYWdlIHNpemUuIFBhZ2Ugc2l6ZSBhbGlnbmVkLgogKi8KCmV4dGVybiBzdHJ1Y3QgX1dzYm1CdWZmZXJQb29sICp3c2JtVFRNUG9vbEluaXQoaW50IGZkLAoJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGV2T2Zmc2V0KTsKZXh0ZXJuIHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKndzYm1NYWxsb2NQb29sSW5pdCh2b2lkKTsKCnN0cnVjdCBfV3NibVNsYWJDYWNoZTsKZXh0ZXJuIHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKndzYm1TbGFiUG9vbEluaXQoaW50IGZkLCB1aW50MzJfdCBkZXZPZmZzZXQsCgkJCQkJCXVpbnQzMl90IHBsYWNlbWVudCwKCQkJCQkJdWludDMyX3QgdmFsaWRNYXNrLAoJCQkJCQl1aW50MzJfdCBzbWFsbGVzdFNpemUsCgkJCQkJCXVpbnQzMl90IG51bVNpemVzLAoJCQkJCQl1aW50MzJfdCBkZXNpcmVkTnVtQnVmZmVycywKCQkJCQkJdWludDMyX3QgbWF4U2xhYlNpemUsCgkJCQkJCXVpbnQzMl90IHBhZ2VBbGlnbm1lbnQsCgkJCQkJCXN0cnVjdCBfV3NibVNsYWJDYWNoZSAqY2FjaGUpOwpleHRlcm4gc3RydWN0IF9Xc2JtU2xhYkNhY2hlICp3c2JtU2xhYkNhY2hlSW5pdCh1aW50MzJfdCBjaGVja0ludGVydmFsTXNlYywKCQkJCQkJdWludDMyX3Qgc2xhYlRpbWVvdXRNc2VjKTsKZXh0ZXJuIHZvaWQgd3NibVNsYWJDYWNoZUZpbmlzaChzdHJ1Y3QgX1dzYm1TbGFiQ2FjaGUgKmNhY2hlKTsKCmV4dGVybiBzdHJ1Y3QgX1dzYm1CdWZmZXJQb29sICp3c2JtVXNlclBvb2xJbml0KHZvaWQgKnZyYW1BZGRyLAoJCQkJCQl1bnNpZ25lZCBsb25nIHZyYW1TdGFydCwKCQkJCQkJdW5zaWduZWQgbG9uZyB2cmFtU2l6ZSwKCQkJCQkJdm9pZCAqYWdwQWRkciwKCQkJCQkJdW5zaWduZWQgbG9uZyBhZ3BTdGFydCwKCQkJCQkJdW5zaWduZWQgbG9uZyBhZ3BTaXplLAoJCQkJCQl1aW50MzJfdCgqZmVuY2VUeXBlcykKCQkJCQkJICAgICh1aW50NjRfdCBzZXRfZmxhZ3MpKTsKCmV4dGVybiB2b2lkIHdzYm1Vc2VyUG9vbENsZWFuKHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKnBvb2wsCgkJCSAgICAgIGludCBjbGVhblZyYW0sIGludCBjbGVhbkFncCk7CgojZW5kaWYK