LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmxhbl9jbGllbnRfZXZlbnQuYwogKiBWZXJzaW9uOiAgICAgICAwLjkKICogRGVzY3JpcHRpb246ICAgSXJMQU4gY2xpZW50IHN0YXRlIG1hY2hpbmUKICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFN1biBBdWcgMzEgMjA6MTQ6MzcgMTk5NwogKiBNb2RpZmllZCBhdDogICBTdW4gRGVjIDI2IDIxOjUyOjI0IDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKgogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgoKI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL3RpbWVyLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcm1vZC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgoKI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NvbW1vbi5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fY2xpZW50Lmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9ldmVudC5oPgoKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfaWRsZSAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfcXVlcnkoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfY29ubiAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfaW5mbyAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfbWVkaWEoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfb3BlbiAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfd2FpdCAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfYXJiICAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfZGF0YSAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfY2xvc2Uoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfc3luYyAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKCnN0YXRpYyBpbnQgKCpzdGF0ZVtdKShzdHJ1Y3QgaXJsYW5fY2IgKiwgSVJMQU5fRVZFTlQgZXZlbnQsIHN0cnVjdCBza19idWZmICopID0KewoJaXJsYW5fY2xpZW50X3N0YXRlX2lkbGUsCglpcmxhbl9jbGllbnRfc3RhdGVfcXVlcnksCglpcmxhbl9jbGllbnRfc3RhdGVfY29ubiwKCWlybGFuX2NsaWVudF9zdGF0ZV9pbmZvLAoJaXJsYW5fY2xpZW50X3N0YXRlX21lZGlhLAoJaXJsYW5fY2xpZW50X3N0YXRlX29wZW4sCglpcmxhbl9jbGllbnRfc3RhdGVfd2FpdCwKCWlybGFuX2NsaWVudF9zdGF0ZV9hcmIsCglpcmxhbl9jbGllbnRfc3RhdGVfZGF0YSwKCWlybGFuX2NsaWVudF9zdGF0ZV9jbG9zZSwKCWlybGFuX2NsaWVudF9zdGF0ZV9zeW5jCn07Cgp2b2lkIGlybGFuX2RvX2NsaWVudF9ldmVudChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LAoJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCSgqc3RhdGVbIHNlbGYtPmNsaWVudC5zdGF0ZV0pIChzZWxmLCBldmVudCwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX2lkbGUgKGV2ZW50LCBza2IsIGluZm8pCiAqCiAqICAgIElETEUsIFdlIGFyZSB3YWl0aW5nIGZvciBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlcmUgaXMgYSBwcm92aWRlcgogKiAgICBhdmFpbGFibGUuCiAqLwpzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9pZGxlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsCgkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtMTspOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgSVJMQU5fRElTQ09WRVJZX0lORElDQVRJT046CgkJaWYgKHNlbGYtPmNsaWVudC5pcmlhcCkgewoJCQlJUkRBX1dBUk5JTkcoIiVzKCksIGJ1c3kgd2l0aCBhIHByZXZpb3VzIHF1ZXJ5XG4iLAoJCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCgkJc2VsZi0+Y2xpZW50LmlyaWFwID0gaXJpYXBfb3BlbihMU0FQX0FOWSwgSUFTX0NMSUVOVCwgc2VsZiwKCQkJCQkJaXJsYW5fY2xpZW50X2dldF92YWx1ZV9jb25maXJtKTsKCQkvKiBHZXQgc29tZSB2YWx1ZXMgZnJvbSBwZWVyIElBUyAqLwoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX1FVRVJZKTsKCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdChzZWxmLT5jbGllbnQuaXJpYXAsCgkJCQkJICAgICAgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyLAoJCQkJCSAgICAgICJJckxBTiIsICJJckRBOlRpbnlUUDpMc2FwU2VsIik7CgkJYnJlYWs7CgljYXNlIElSTEFOX1dBVENIRE9HX1RJTUVPVVQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSVJMQU5fV0FUQ0hET0dfVElNRU9VVFxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoNCwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKCQlicmVhazsKCX0KCWlmIChza2IpCgkJZGV2X2tmcmVlX3NrYihza2IpOwoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfcXVlcnkgKGV2ZW50LCBza2IsIGluZm8pCiAqCiAqICAgIFFVRVJZLCBXZSBoYXZlIHF1ZXJ5ZWQgdGhlIHJlbW90ZSBJQVMgYW5kIGlzIHJlYWR5IHRvIGNvbm5lY3QKICogICAgdG8gcHJvdmlkZXIsIGp1c3Qgd2FpdGluZyBmb3IgdGhlIGNvbmZpcm0uCiAqCiAqLwpzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9xdWVyeShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LAoJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CgoJc3dpdGNoKGV2ZW50KSB7CgljYXNlIElSTEFOX0lBU19QUk9WSURFUl9BVkFJTDoKCQlJUkRBX0FTU0VSVChzZWxmLT5kdHNhcF9zZWxfY3RybCAhPSAwLCByZXR1cm4gLTE7KTsKCgkJc2VsZi0+Y2xpZW50Lm9wZW5fcmV0cmllcyA9IDA7CgoJCWlydHRwX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5jbGllbnQudHNhcF9jdHJsLAoJCQkJICAgICAgc2VsZi0+ZHRzYXBfc2VsX2N0cmwsCgkJCQkgICAgICBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsIE5VTEwsCgkJCQkgICAgICBJUkxBTl9NVFUsIE5VTEwpOwoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0NPTk4pOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9JQVNfUFJPVklERVJfTk9UX0FWQUlMOgoJCUlSREFfREVCVUcoMiwgIiVzKCksIElBU19QUk9WSURFUl9OT1RfQVZBSUxcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOwoKCQkvKiBHaXZlIHRoZSBjbGllbnQgYSBraWNrISAqLwoJCWlmICgoc2VsZi0+cHJvdmlkZXIuYWNjZXNzX3R5cGUgPT0gQUNDRVNTX1BFRVIpICYmCgkJICAgIChzZWxmLT5wcm92aWRlci5zdGF0ZSAhPSBJUkxBTl9JRExFKSkKCQkJaXJsYW5fY2xpZW50X3dha2V1cChzZWxmLCBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIpOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDoKCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CgkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CgkJYnJlYWs7CgljYXNlIElSTEFOX1dBVENIRE9HX1RJTUVPVVQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSVJMQU5fV0FUQ0hET0dfVElNRU9VVFxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKCQlicmVhazsKCX0KCWlmIChza2IpCgkJZGV2X2tmcmVlX3NrYihza2IpOwoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfY29ubiAoZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgQ09OTiwgV2UgaGF2ZSBjb25uZWN0ZWQgdG8gYSBwcm92aWRlciBidXQgaGFzIG5vdCBpc3N1ZWQgYW55CiAqICAgIGNvbW1hbmRzIHlldC4KICoKICovCnN0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2Nvbm4oc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJc3dpdGNoIChldmVudCkgewoJY2FzZSBJUkxBTl9DT05ORUNUX0NPTVBMRVRFOgoJCS8qIFNlbmQgZ2V0aW5mbyBjbWQgKi8KCQlpcmxhbl9nZXRfcHJvdmlkZXJfaW5mbyhzZWxmKTsKCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JTkZPKTsKCQlicmVhazsKCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CgljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgoJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CgkJYnJlYWs7Cgl9CglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX2luZm8gKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCiAqCiAqICAgIElORk8sIFdlIGhhdmUgaXNzdWVkIGEgR2V0SW5mbyBjb21tYW5kIGFuZCBpcyBhd2FpdGluZyBhIHJlcGx5LgogKi8Kc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfaW5mbyhzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LAoJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIElSTEFOX0RBVEFfSU5ESUNBVElPTjoKCQlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJCWlybGFuX2NsaWVudF9wYXJzZV9yZXNwb25zZShzZWxmLCBza2IpOwoKCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9NRURJQSk7CgoJCWlybGFuX2dldF9tZWRpYV9jaGFyKHNlbGYpOwoJCWJyZWFrOwoKCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CgljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgoJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CgkJYnJlYWs7Cgl9CglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX21lZGlhIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBNRURJQSwgVGhlIGlybGFuX2NsaWVudCBoYXMgaXNzdWVkIGEgR2V0TWVkaWEgY29tbWFuZCBhbmQgaXMgYXdhaXRpbmcgYQogKiAgICByZXBseS4KICoKICovCnN0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX21lZGlhKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsCgkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCglzd2l0Y2goZXZlbnQpIHsKCWNhc2UgSVJMQU5fREFUQV9JTkRJQ0FUSU9OOgoJCWlybGFuX2NsaWVudF9wYXJzZV9yZXNwb25zZShzZWxmLCBza2IpOwoJCWlybGFuX29wZW5fZGF0YV9jaGFubmVsKHNlbGYpOwoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX09QRU4pOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDoKCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CgkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CgkJYnJlYWs7CgljYXNlIElSTEFOX1dBVENIRE9HX1RJTUVPVVQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSVJMQU5fV0FUQ0hET0dfVElNRU9VVFxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKCQlicmVhazsKCX0KCWlmIChza2IpCgkJZGV2X2tmcmVlX3NrYihza2IpOwoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfb3BlbiAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgT1BFTiwgVGhlIGlybGFuX2NsaWVudCBoYXMgaXNzdWVkIGEgT3BlbkRhdGEgY29tbWFuZCBhbmQgaXMgYXdhaXRpbmcgYQogKiAgICByZXBseQogKgogKi8Kc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfb3BlbihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LAoJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IHFvc19pbmZvIHFvczsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoKCXN3aXRjaChldmVudCkgewoJY2FzZSBJUkxBTl9EQVRBX0lORElDQVRJT046CgkJaXJsYW5fY2xpZW50X3BhcnNlX3Jlc3BvbnNlKHNlbGYsIHNrYik7CgoJCS8qCgkJICogIENoZWNrIGlmIHdlIGhhdmUgZ290IHRoZSByZW1vdGUgVFNBUCBmb3IgZGF0YQoJCSAqICBjb21tdW5pY2F0aW9ucwoJCSAqLwoJCUlSREFfQVNTRVJUKHNlbGYtPmR0c2FwX3NlbF9kYXRhICE9IDAsIHJldHVybiAtMTspOwoKCQkvKiBDaGVjayB3aGljaCBhY2Nlc3MgdHlwZSB3ZSBhcmUgZGVhbGluZyB3aXRoICovCgkJc3dpdGNoIChzZWxmLT5jbGllbnQuYWNjZXNzX3R5cGUpIHsKCQljYXNlIEFDQ0VTU19QRUVSOgoJCSAgICBpZiAoc2VsZi0+cHJvdmlkZXIuc3RhdGUgPT0gSVJMQU5fT1BFTikgewoKCQkJICAgIGlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0FSQik7CgkJCSAgICBpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fQ0hFQ0tfQ09OX0FSQiwKCQkJCQkJICBOVUxMKTsKCQkgICAgfSBlbHNlIHsKCgkJCSAgICBpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9XQUlUKTsKCQkgICAgfQoJCSAgICBicmVhazsKCQljYXNlIEFDQ0VTU19ESVJFQ1Q6CgkJY2FzZSBBQ0NFU1NfSE9TVEVEOgoJCQlxb3MubGlua19kaXNjX3RpbWUuYml0cyA9IDB4MDE7IC8qIDMgc2VjcyAqLwoKCQkJaXJ0dHBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXBfZGF0YSwKCQkJCQkgICAgICBzZWxmLT5kdHNhcF9zZWxfZGF0YSwKCQkJCQkgICAgICBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsICZxb3MsCgkJCQkJICAgICAgSVJMQU5fTVRVLCBOVUxMKTsKCgkJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0RBVEEpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1bmtub3duIGFjY2VzcyB0eXBlIVxuIiwgX19GVU5DVElPTl9fICk7CgkJCWJyZWFrOwoJCX0KCQlicmVhazsKCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CgljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgoJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CgkJYnJlYWs7Cgl9CgoJaWYgKHNrYikKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV93YWl0IChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBXQUlULCBUaGUgaXJsYW5fY2xpZW50IGlzIHdhaXRpbmcgZm9yIHRoZSBsb2NhbCBwcm92aWRlciB0byBlbnRlciB0aGUKICogICAgcHJvdmlkZXIgT1BFTiBzdGF0ZS4KICoKICovCnN0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX3dhaXQoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJc3dpdGNoKGV2ZW50KSB7CgljYXNlIElSTEFOX1BST1ZJREVSX1NJR05BTDoKCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9BUkIpOwoJCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9DSEVDS19DT05fQVJCLCBOVUxMKTsKCQlicmVhazsKCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CgljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgoJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CgkJYnJlYWs7Cgl9CglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfYXJiKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsCgkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBxb3NfaW5mbyBxb3M7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCglzd2l0Y2goZXZlbnQpIHsKCWNhc2UgSVJMQU5fQ0hFQ0tfQ09OX0FSQjoKCQlpZiAoc2VsZi0+Y2xpZW50LnJlY3ZfYXJiX3ZhbCA9PSBzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwpIHsKCQkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fQ0xPU0UpOwoJCQlpcmxhbl9jbG9zZV9kYXRhX2NoYW5uZWwoc2VsZik7CgkJfSBlbHNlIGlmIChzZWxmLT5jbGllbnQucmVjdl9hcmJfdmFsIDwKCQkJICAgc2VsZi0+cHJvdmlkZXIuc2VuZF9hcmJfdmFsKQoJCXsKCQkJcW9zLmxpbmtfZGlzY190aW1lLmJpdHMgPSAweDAxOyAvKiAzIHNlY3MgKi8KCgkJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0RBVEEpOwoJCQlpcnR0cF9jb25uZWN0X3JlcXVlc3Qoc2VsZi0+dHNhcF9kYXRhLAoJCQkJCSAgICAgIHNlbGYtPmR0c2FwX3NlbF9kYXRhLAoJCQkJCSAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgJnFvcywKCQkJCQkgICAgICBJUkxBTl9NVFUsIE5VTEwpOwoJCX0gZWxzZSBpZiAoc2VsZi0+Y2xpZW50LnJlY3ZfYXJiX3ZhbCA+CgkJCSAgIHNlbGYtPnByb3ZpZGVyLnNlbmRfYXJiX3ZhbCkKCQl7CgkJCUlSREFfREVCVUcoMiwgIiVzKCksIGxvc3QgdGhlIGJhdHRsZSA6LShcbiIsIF9fRlVOQ1RJT05fXyApOwoJCX0KCQlicmVhazsKCWNhc2UgSVJMQU5fREFUQV9DT05ORUNUX0lORElDQVRJT046CgkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fREFUQSk7CgkJYnJlYWs7CgljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOgoJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKCQlicmVhazsKCWNhc2UgSVJMQU5fV0FUQ0hET0dfVElNRU9VVDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJUkxBTl9XQVRDSERPR19USU1FT1VUXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOwoJCWJyZWFrOwoJfQoJaWYgKHNrYikKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV9kYXRhIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBEQVRBLCBUaGUgZGF0YSBjaGFubmVsIGlzIGNvbm5lY3RlZCwgYWxsb3dpbmcgZGF0YSB0cmFuc2ZlcnMgYmV0d2VlbgogKiAgICB0aGUgbG9jYWwgYW5kIHJlbW90ZSBtYWNoaW5lcy4KICoKICovCnN0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2RhdGEoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CgoJc3dpdGNoKGV2ZW50KSB7CgljYXNlIElSTEFOX0RBVEFfSU5ESUNBVElPTjoKCQlpcmxhbl9jbGllbnRfcGFyc2VfcmVzcG9uc2Uoc2VsZiwgc2tiKTsKCQlicmVhazsKCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6IC8qIEZBTExUSFJPVUdIICovCgljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CgkJYnJlYWs7Cgl9CglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX2Nsb3NlIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQogKgogKgogKgogKi8Kc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfY2xvc2Uoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX3N5bmMgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCiAqCiAqCiAqCiAqLwpzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9zeW5jKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsCgkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCglyZXR1cm4gMDsKfQoKCgoKCgoKCgoKCgoK