LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmxtcF9mcmFtZS5jCiAqIFZlcnNpb246ICAgICAgIDAuOQogKiBEZXNjcmlwdGlvbjogICBJckxNUCBmcmFtZSBpbXBsZW1lbnRhdGlvbgogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgVHVlIEF1ZyAxOSAwMjowOTo1OSAxOTk3CiAqIE1vZGlmaWVkIGF0OiAgIE1vbiBEZWMgMTMgMTM6NDE6MTIgMTk5OQogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqCiAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgoKI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS90aW1lci5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wX2ZyYW1lLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9kaXNjb3ZlcnkuaD4KCnN0YXRpYyBzdHJ1Y3QgbHNhcF9jYiAqaXJsbXBfZmluZF9sc2FwKHN0cnVjdCBsYXBfY2IgKnNlbGYsIF9fdTggZGxzYXAsCgkJCQkgICAgICAgX191OCBzbHNhcCwgaW50IHN0YXR1cywgaGFzaGJpbl90ICopOwoKaW5saW5lIHZvaWQgaXJsbXBfc2VuZF9kYXRhX3BkdShzdHJ1Y3QgbGFwX2NiICpzZWxmLCBfX3U4IGRsc2FwLCBfX3U4IHNsc2FwLAoJCQkJaW50IGV4cGVkaXRlZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc2tiLT5kYXRhWzBdID0gZGxzYXA7Cglza2ItPmRhdGFbMV0gPSBzbHNhcDsKCglpZiAoZXhwZWRpdGVkKSB7CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgc2VuZGluZyBleHBlZGl0ZWQgZGF0YVxuIiwgX19GVU5DVElPTl9fKTsKCQlpcmxhcF9kYXRhX3JlcXVlc3Qoc2VsZi0+aXJsYXAsIHNrYiwgVFJVRSk7Cgl9IGVsc2UKCQlpcmxhcF9kYXRhX3JlcXVlc3Qoc2VsZi0+aXJsYXAsIHNrYiwgRkFMU0UpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxtcF9zZW5kX2xjZl9wZHUgKGRsc2FwLCBzbHNhcCwgb3Bjb2RlLHNrYikKICoKICogICAgU2VuZCBMaW5rIENvbnRyb2wgRnJhbWUgdG8gSXJMQVAKICovCnZvaWQgaXJsbXBfc2VuZF9sY2ZfcGR1KHN0cnVjdCBsYXBfY2IgKnNlbGYsIF9fdTggZGxzYXAsIF9fdTggc2xzYXAsCgkJCV9fdTggb3Bjb2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglfX3U4ICpmcmFtZTsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKCglmcmFtZSA9IHNrYi0+ZGF0YTsKCglmcmFtZVswXSA9IGRsc2FwIHwgQ09OVFJPTF9CSVQ7CglmcmFtZVsxXSA9IHNsc2FwOwoKCWZyYW1lWzJdID0gb3Bjb2RlOwoKCWlmIChvcGNvZGUgPT0gRElTQ09OTkVDVCkKCQlmcmFtZVszXSA9IDB4MDE7IC8qIFNlcnZpY2UgdXNlciByZXF1ZXN0ICovCgllbHNlCgkJZnJhbWVbM10gPSAweDAwOyAvKiByc3ZkICovCgoJaXJsYXBfZGF0YV9yZXF1ZXN0KHNlbGYtPmlybGFwLCBza2IsIEZBTFNFKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsbXBfaW5wdXQgKHNrYikKICoKICogICAgVXNlZCBieSBJckxBUCB0byBwYXNzIHJlY2VpdmVkIGRhdGEgZnJhbWVzIHRvIElyTE1QIGxheWVyCiAqCiAqLwp2b2lkIGlybG1wX2xpbmtfZGF0YV9pbmRpY2F0aW9uKHN0cnVjdCBsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsCgkJCQlpbnQgdW5yZWxpYWJsZSkKewoJc3RydWN0IGxzYXBfY2IgKmxzYXA7CglfX3U4ICAgc2xzYXBfc2VsOyAgIC8qIFNvdXJjZSAodGhpcykgTFNBUCBhZGRyZXNzICovCglfX3U4ICAgZGxzYXBfc2VsOyAgIC8qIERlc3RpbmF0aW9uIExTQVAgYWRkcmVzcyAqLwoJX191OCAgICpmcDsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNrYi0+bGVuID4gMiwgcmV0dXJuOyk7CgoJZnAgPSBza2ItPmRhdGE7CgoJLyoKCSAqICBUaGUgbmV4dCBzdGF0ZW1lbnRzIG1heSBiZSBjb25mdXNpbmcsIGJ1dCB3ZSBkbyB0aGlzIHNvIHRoYXQKCSAqICBkZXN0aW5hdGlvbiBMU0FQIG9mIHJlY2VpdmVkIGZyYW1lIGlzIHNvdXJjZSBMU0FQIGluIG91ciB2aWV3CgkgKi8KCXNsc2FwX3NlbCA9IGZwWzBdICYgTFNBUF9NQVNLOwoJZGxzYXBfc2VsID0gZnBbMV07CgoJLyoKCSAqICBDaGVjayBpZiB0aGlzIGlzIGFuIGluY29taW5nIGNvbm5lY3Rpb24sIHNpbmNlIHdlIG11c3QgZGVhbCB3aXRoCgkgKiAgaXQgaW4gYSBkaWZmZXJlbnQgd2F5IHRoYW4gb3RoZXIgZXN0YWJsaXNoZWQgY29ubmVjdGlvbnMuCgkgKi8KCWlmICgoZnBbMF0gJiBDT05UUk9MX0JJVCkgJiYgKGZwWzJdID09IENPTk5FQ1RfQ01EKSkgewoJCUlSREFfREVCVUcoMywgIiVzKCksIGluY29taW5nIGNvbm5lY3Rpb24sICIKCQkJICAgInNvdXJjZSBMU0FQPSVkLCBkZXN0IExTQVA9JWRcbiIsCgkJCSAgIF9fRlVOQ1RJT05fXywgc2xzYXBfc2VsLCBkbHNhcF9zZWwpOwoKCQkvKiBUcnkgdG8gZmluZCBMU0FQIGFtb25nIHRoZSB1bmNvbm5lY3RlZCBMU0FQcyAqLwoJCWxzYXAgPSBpcmxtcF9maW5kX2xzYXAoc2VsZiwgZGxzYXBfc2VsLCBzbHNhcF9zZWwsIENPTk5FQ1RfQ01ELAoJCQkJICAgICAgIGlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcyk7CgoJCS8qIE1heWJlIExTQVAgd2FzIGFscmVhZHkgY29ubmVjdGVkLCBzbyB0cnkgb25lIG1vcmUgdGltZSAqLwoJCWlmICghbHNhcCkgewoJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBpbmNvbWluZyBjb25uZWN0aW9uIGZvciBMU0FQIGFscmVhZHkgY29ubmVjdGVkXG4iLCBfX0ZVTkNUSU9OX18pOwoJCQlsc2FwID0gaXJsbXBfZmluZF9sc2FwKHNlbGYsIGRsc2FwX3NlbCwgc2xzYXBfc2VsLCAwLAoJCQkJCSAgICAgICBzZWxmLT5sc2Fwcyk7CgkJfQoJfSBlbHNlCgkJbHNhcCA9IGlybG1wX2ZpbmRfbHNhcChzZWxmLCBkbHNhcF9zZWwsIHNsc2FwX3NlbCwgMCwKCQkJCSAgICAgICBzZWxmLT5sc2Fwcyk7CgoJaWYgKGxzYXAgPT0gTlVMTCkgewoJCUlSREFfREVCVUcoMiwgIklyTE1QLCBTb3JyeSwgbm8gTFNBUCBmb3IgcmVjZWl2ZWQgZnJhbWUhXG4iKTsKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBzbHNhcF9zZWwgPSAlMDJ4LCBkbHNhcF9zZWwgPSAlMDJ4XG4iLAoJCQkgICBfX0ZVTkNUSU9OX18sIHNsc2FwX3NlbCwgZGxzYXBfc2VsKTsKCQlpZiAoZnBbMF0gJiBDT05UUk9MX0JJVCkgewoJCQlJUkRBX0RFQlVHKDIsICIlcygpLCByZWNlaXZlZCBjb250cm9sIGZyYW1lICUwMnhcbiIsCgkJCQkgICBfX0ZVTkNUSU9OX18sIGZwWzJdKTsKCQl9IGVsc2UgewoJCQlJUkRBX0RFQlVHKDIsICIlcygpLCByZWNlaXZlZCBkYXRhIGZyYW1lXG4iLCBfX0ZVTkNUSU9OX18pOwoJCX0KCQlyZXR1cm47Cgl9CgoJLyoKCSAqICBDaGVjayBpZiB3ZSByZWNlaXZlZCBhIGNvbnRyb2wgZnJhbWU/CgkgKi8KCWlmIChmcFswXSAmIENPTlRST0xfQklUKSB7CgkJc3dpdGNoIChmcFsyXSkgewoJCWNhc2UgQ09OTkVDVF9DTUQ6CgkJCWxzYXAtPmxhcCA9IHNlbGY7CgkJCWlybG1wX2RvX2xzYXBfZXZlbnQobHNhcCwgTE1fQ09OTkVDVF9JTkRJQ0FUSU9OLCBza2IpOwoJCQlicmVhazsKCQljYXNlIENPTk5FQ1RfQ05GOgoJCQlpcmxtcF9kb19sc2FwX2V2ZW50KGxzYXAsIExNX0NPTk5FQ1RfQ09ORklSTSwgc2tiKTsKCQkJYnJlYWs7CgkJY2FzZSBESVNDT05ORUNUOgoJCQlJUkRBX0RFQlVHKDQsICIlcygpLCBEaXNjb25uZWN0IGluZGljYXRpb24hXG4iLAoJCQkJICAgX19GVU5DVElPTl9fKTsKCQkJaXJsbXBfZG9fbHNhcF9ldmVudChsc2FwLCBMTV9ESVNDT05ORUNUX0lORElDQVRJT04sCgkJCQkJICAgIHNrYik7CgkJCWJyZWFrOwoJCWNhc2UgQUNDRVNTTU9ERV9DTUQ6CgkJCUlSREFfREVCVUcoMCwgIkFjY2VzcyBtb2RlIGNtZCBub3QgaW1wbGVtZW50ZWQhXG4iKTsKCQkJYnJlYWs7CgkJY2FzZSBBQ0NFU1NNT0RFX0NORjoKCQkJSVJEQV9ERUJVRygwLCAiQWNjZXNzIG1vZGUgY25mIG5vdCBpbXBsZW1lbnRlZCFcbiIpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGNvbnRyb2wgZnJhbWUgJTAyeFxuIiwKCQkJCSAgIF9fRlVOQ1RJT05fXywgZnBbMl0pOwoJCQlicmVhazsKCQl9Cgl9IGVsc2UgaWYgKHVucmVsaWFibGUpIHsKCQkvKiBPcHRpbWl6ZSBhbmQgYnlwYXNzIHRoZSBzdGF0ZSBtYWNoaW5lIGlmIHBvc3NpYmxlICovCgkJaWYgKGxzYXAtPmxzYXBfc3RhdGUgPT0gTFNBUF9EQVRBX1RSQU5TRkVSX1JFQURZKQoJCQlpcmxtcF91ZGF0YV9pbmRpY2F0aW9uKGxzYXAsIHNrYik7CgkJZWxzZQoJCQlpcmxtcF9kb19sc2FwX2V2ZW50KGxzYXAsIExNX1VEQVRBX0lORElDQVRJT04sIHNrYik7Cgl9IGVsc2UgewoJCS8qIE9wdGltaXplIGFuZCBieXBhc3MgdGhlIHN0YXRlIG1hY2hpbmUgaWYgcG9zc2libGUgKi8KCQlpZiAobHNhcC0+bHNhcF9zdGF0ZSA9PSBMU0FQX0RBVEFfVFJBTlNGRVJfUkVBRFkpCgkJCWlybG1wX2RhdGFfaW5kaWNhdGlvbihsc2FwLCBza2IpOwoJCWVsc2UKCQkJaXJsbXBfZG9fbHNhcF9ldmVudChsc2FwLCBMTV9EQVRBX0lORElDQVRJT04sIHNrYik7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX2xpbmtfdW5pdGRhdGFfaW5kaWNhdGlvbiAoc2VsZiwgc2tiKQogKgogKgogKgogKi8KI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCnZvaWQgaXJsbXBfbGlua191bml0ZGF0YV9pbmRpY2F0aW9uKHN0cnVjdCBsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBsc2FwX2NiICpsc2FwOwoJX191OCAgIHNsc2FwX3NlbDsgICAvKiBTb3VyY2UgKHRoaXMpIExTQVAgYWRkcmVzcyAqLwoJX191OCAgIGRsc2FwX3NlbDsgICAvKiBEZXN0aW5hdGlvbiBMU0FQIGFkZHJlc3MgKi8KCV9fdTggICBwaWQ7ICAgICAgICAgLyogUHJvdG9jb2wgaWRlbnRpZmllciAqLwoJX191OCAgICpmcDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChza2ItPmxlbiA+IDIsIHJldHVybjspOwoKCWZwID0gc2tiLT5kYXRhOwoKCS8qCgkgKiAgVGhlIG5leHQgc3RhdGVtZW50cyBtYXkgYmUgY29uZnVzaW5nLCBidXQgd2UgZG8gdGhpcyBzbyB0aGF0CgkgKiAgZGVzdGluYXRpb24gTFNBUCBvZiByZWNlaXZlZCBmcmFtZSBpcyBzb3VyY2UgTFNBUCBpbiBvdXIgdmlldwoJICovCglzbHNhcF9zZWwgPSBmcFswXSAmIExTQVBfTUFTSzsKCWRsc2FwX3NlbCA9IGZwWzFdOwoJcGlkICAgICAgID0gZnBbMl07CgoJaWYgKHBpZCAmIDB4ODApIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBleHRlbnNpb24gaW4gUElEIG5vdCBzdXBwIVxuIiwKCQkJICAgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgoJLyogQ2hlY2sgaWYgZnJhbWUgaXMgYWRkcmVzc2VkIHRvIHRoZSBjb25uZWN0aW9ubGVzcyBMU0FQICovCglpZiAoKHNsc2FwX3NlbCAhPSBMU0FQX0NPTk5MRVNTKSB8fCAoZGxzYXBfc2VsICE9IExTQVBfQ09OTkxFU1MpKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZHJvcHBpbmcgZnJhbWUhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCgkvKiBTZWFyY2ggdGhlIGNvbm5lY3Rpb25sZXNzIExTQVAgKi8KCXNwaW5fbG9ja19pcnFzYXZlKCZpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7Cglsc2FwID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcyk7Cgl3aGlsZSAobHNhcCAhPSBOVUxMKSB7CgkJLyoKCQkgKiAgQ2hlY2sgaWYgc291cmNlIExTQVAgYW5kIGRlc3QgTFNBUCBzZWxlY3RvcnMgYW5kIFBJRCBtYXRjaC4KCQkgKi8KCQlpZiAoKGxzYXAtPnNsc2FwX3NlbCA9PSBzbHNhcF9zZWwpICYmCgkJICAgIChsc2FwLT5kbHNhcF9zZWwgPT0gZGxzYXBfc2VsKSAmJgoJCSAgICAobHNhcC0+cGlkID09IHBpZCkpCgkJewoJCQlicmVhazsKCQl9CgkJbHNhcCA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBoYXNoYmluX2dldF9uZXh0KGlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcyk7Cgl9CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CgoJaWYgKGxzYXApCgkJaXJsbXBfY29ubmxlc3NfZGF0YV9pbmRpY2F0aW9uKGxzYXAsIHNrYik7CgllbHNlIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBmb3VuZCBubyBtYXRjaGluZyBMU0FQIVxuIiwgX19GVU5DVElPTl9fKTsKCX0KfQojZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX2xpbmtfZGlzY29ubmVjdF9pbmRpY2F0aW9uIChyZWFzb24sIHVzZXJkYXRhKQogKgogKiAgICBJckxBUCBoYXMgZGlzY29ubmVjdGVkCiAqCiAqLwp2b2lkIGlybG1wX2xpbmtfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHN0cnVjdCBsYXBfY2IgKmxhcCwKCQkJCSAgICAgIHN0cnVjdCBpcmxhcF9jYiAqaXJsYXAsCgkJCQkgICAgICBMQVBfUkVBU09OIHJlYXNvbiwKCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQobGFwICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQobGFwLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKCglsYXAtPnJlYXNvbiA9IHJlYXNvbjsKCWxhcC0+ZGFkZHIgPSBERVZfQUREUl9BTlk7CgoJLyogRklYTUU6IG11c3QgZG8gc29tZXRoaW5nIHdpdGggdGhlIHNrYiBpZiBhbnkgKi8KCgkvKgoJICogIEluZm9ybSBzdGF0aW9uIHN0YXRlIG1hY2hpbmUKCSAqLwoJaXJsbXBfZG9fbGFwX2V2ZW50KGxhcCwgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiwgTlVMTCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX2xpbmtfY29ubmVjdF9pbmRpY2F0aW9uIChxb3MpCiAqCiAqICAgIEluY29taW5nIExBUCBjb25uZWN0aW9uIQogKgogKi8Kdm9pZCBpcmxtcF9saW5rX2Nvbm5lY3RfaW5kaWNhdGlvbihzdHJ1Y3QgbGFwX2NiICpzZWxmLCBfX3UzMiBzYWRkciwKCQkJCSAgIF9fdTMyIGRhZGRyLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJLyogQ29weSBRb1Mgc2V0dGluZ3MgZm9yIHRoaXMgc2Vzc2lvbiAqLwoJc2VsZi0+cW9zID0gcW9zOwoKCS8qIFVwZGF0ZSBkZXN0aW5hdGlvbiBkZXZpY2UgYWRkcmVzcyAqLwoJc2VsZi0+ZGFkZHIgPSBkYWRkcjsKCUlSREFfQVNTRVJUKHNlbGYtPnNhZGRyID09IHNhZGRyLCByZXR1cm47KTsKCglpcmxtcF9kb19sYXBfZXZlbnQoc2VsZiwgTE1fTEFQX0NPTk5FQ1RfSU5ESUNBVElPTiwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsbXBfbGlua19jb25uZWN0X2NvbmZpcm0gKHFvcykKICoKICogICAgTEFQIGNvbm5lY3Rpb24gY29uZmlybWVkIQogKgogKi8Kdm9pZCBpcmxtcF9saW5rX2Nvbm5lY3RfY29uZmlybShzdHJ1Y3QgbGFwX2NiICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKCQkJCXN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQocW9zICE9IE5VTEwsIHJldHVybjspOwoKCS8qIERvbid0IG5lZWQgdXNlIHRoZSBza2IgZm9yIG5vdyAqLwoKCS8qIENvcHkgUW9TIHNldHRpbmdzIGZvciB0aGlzIHNlc3Npb24gKi8KCXNlbGYtPnFvcyA9IHFvczsKCglpcmxtcF9kb19sYXBfZXZlbnQoc2VsZiwgTE1fTEFQX0NPTk5FQ1RfQ09ORklSTSwgTlVMTCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX2xpbmtfZGlzY292ZXJ5X2luZGljYXRpb24gKHNlbGYsIGxvZykKICoKICogICAgRGV2aWNlIGlzIGRpc2NvdmVyaW5nIHVzCiAqCiAqIEl0J3Mgbm90IGFuIGFuc3dlciB0byBvdXIgb3duIGRpc2NvdmVyaWVzLCBqdXN0IGFub3RoZXIgZGV2aWNlIHRyeWluZwogKiB0byBwZXJmb3JtIGRpc2NvdmVyeSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gbWlzcyB0aGUgb3Bwb3J0dW5pdHkKICogdG8gZXhwbG9pdCB0aGlzIGluZm9ybWF0aW9uLCBiZWNhdXNlIDoKICoJbyBXZSBtYXkgbm90IGFjdGl2ZWx5IHBlcmZvcm0gZGlzY292ZXJ5IChqdXN0IHBhc3NpdmUgZGlzY292ZXJ5KQogKglvIFRoaXMgdHlwZSBvZiBkaXNjb3ZlcnkgaXMgbXVjaCBtb3JlIHJlbGlhYmxlLiBJbiBzb21lIGNhc2VzLCBpdAogKgkgIHNlZW0gdGhhdCBsZXNzIHRoYW4gNTAlIG9mIG91ciBkaXNjb3ZlcmllcyBnZXQgYW4gYW5zd2VyLCB3aGlsZQogKgkgIHdlIGFsd2F5cyBnZXQgfjEwMCUgb2YgdGhlc2UuCiAqCW8gTWFrZSBmYXN0ZXIgZGlzY292ZXJ5LCBzdGF0aXN0aWNhbGx5IGRpdmlkZSB0aW1lIG9mIGRpc2NvdmVyeQogKgkgIGV2ZW50cyBieSAyIChpbXBvcnRhbnQgZm9yIHRoZSBsYXRlbmN5IGFzcGVjdCBhbmQgdXNlciBmZWVsKQogKglvIEV2ZW4gaXMgd2UgZG8gYWN0aXZlIGRpc2NvdmVyeSwgdGhlIG90aGVyIG5vZGUgbWlnaHQgbm90CiAqCSAgYW5zd2VyIG91ciBkaXNjb3ZlcmllcyAoZXg6IFBhbG0pLiBUaGUgUGFsbSB3aWxsIGp1c3QgcGVyZm9ybQogKgkgIG9uZSBhY3RpdmUgZGlzY292ZXJ5IGFuZCBjb25uZWN0IGRpcmVjdGx5IHRvIHVzLgogKgogKiBIb3dldmVyLCB3aGVuIGJvdGggZGV2aWNlcyBkaXNjb3ZlciBlYWNoIG90aGVyLCB0aGV5IG1pZ2h0IGF0dGVtcHQgdG8KICogY29ubmVjdCB0byBlYWNoIG90aGVyIGZvbGxvd2luZyB0aGUgZGlzY292ZXJ5IGV2ZW50LCBhbmQgaXQgd291bGQgY3JlYXRlCiAqIGNvbGxpc2lvbnMgb24gdGhlIG1lZGl1bSAoU05STSBiYXR0bGUpLgogKiBUaGUgImZpeCIgZm9yIHRoYXQgaXMgdG8gZGlzYWJsZSBhbGwgY29ubmVjdGlvbiByZXF1ZXN0cyBpbiBJckxBUAogKiBmb3IgMTAwbXMgYWZ0ZXIgYSBkaXNjb3ZlcnkgaW5kaWNhdGlvbiBieSBzZXR0aW5nIHRoZSBtZWRpYV9idXN5IGZsYWcuCiAqIFByZXZpb3VzbHksIHdlIHVzZWQgdG8gcG9zdHBvbmUgdGhlIGV2ZW50IHdoaWNoIHdhcyBxdWl0ZSB1Z2x5LiBOb3cKICogdGhhdCBJckxBUCB0YWtlcyBjYXJlIG9mIHRoaXMgcHJvYmxlbSwganVzdCBwYXNzIHRoZSBldmVudCB1cC4uLgogKgogKiBKZWFuIElJCiAqLwp2b2lkIGlybG1wX2xpbmtfZGlzY292ZXJ5X2luZGljYXRpb24oc3RydWN0IGxhcF9jYiAqc2VsZiwKCQkJCSAgICAgZGlzY292ZXJ5X3QgKmRpc2NvdmVyeSkKewoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOwoKCS8qIEFkZCB0byBtYWluIGxvZywgY2xlYW51cCAqLwoJaXJsbXBfYWRkX2Rpc2NvdmVyeShpcmxtcC0+Y2FjaGVsb2csIGRpc2NvdmVyeSk7CgoJLyogSnVzdCBoYW5kbGUgaXQgdGhlIHNhbWUgd2F5IGFzIGEgZGlzY292ZXJ5IGNvbmZpcm0sCgkgKiBieXBhc3MgdGhlIExNX0xBUCBzdGF0ZSBtYWNoaW5lIChzZWUgYmVsb3cpICovCglpcmxtcF9kaXNjb3ZlcnlfY29uZmlybShpcmxtcC0+Y2FjaGVsb2csIERJU0NPVkVSWV9QQVNTSVZFKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsbXBfbGlua19kaXNjb3ZlcnlfY29uZmlybSAoc2VsZiwgbG9nKQogKgogKiAgICBDYWxsZWQgYnkgSXJMQVAgd2l0aCBhIGxpc3Qgb2YgZGlzY292ZXJpZXMgYWZ0ZXIgdGhlIGRpc2NvdmVyeQogKiAgICByZXF1ZXN0IGhhcyBiZWVuIGNhcnJpZWQgb3V0LiBBIE5VTEwgbG9nIGlzIHJlY2VpdmVkIGlmIElyTEFQCiAqICAgIHdhcyB1bmFibGUgdG8gY2Fycnkgb3V0IHRoZSBkaXNjb3ZlcnkgcmVxdWVzdAogKgogKi8Kdm9pZCBpcmxtcF9saW5rX2Rpc2NvdmVyeV9jb25maXJtKHN0cnVjdCBsYXBfY2IgKnNlbGYsIGhhc2hiaW5fdCAqbG9nKQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKCgkvKiBBZGQgdG8gbWFpbiBsb2csIGNsZWFudXAgKi8KCWlybG1wX2FkZF9kaXNjb3ZlcnlfbG9nKGlybG1wLT5jYWNoZWxvZywgbG9nKTsKCgkvKiBQcm9wYWdhdGUgZXZlbnQgdG8gdmFyaW91cyBMU0FQcyByZWdpc3RlcmVkIGZvciBpdC4KCSAqIFdlIGJ5cGFzcyB0aGUgTE1fTEFQIHN0YXRlIG1hY2hpbmUgYmVjYXVzZQoJICoJMSkgV2UgZG8gaXQgcmVnYXJkbGVzcyBvZiB0aGUgTE1fTEFQIHN0YXRlCgkgKgkyKSBJdCBkb2Vzbid0IGFmZmVjdCB0aGUgTE1fTEFQIHN0YXRlCgkgKgkzKSBGYXN0ZXIsIHNsaW1lciwgc2ltcGxlciwgLi4uCgkgKiBKZWFuIElJICovCglpcmxtcF9kaXNjb3ZlcnlfY29uZmlybShpcmxtcC0+Y2FjaGVsb2csIERJU0NPVkVSWV9BQ1RJVkUpOwp9CgojaWZkZWYgQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQCnN0YXRpYyBpbmxpbmUgdm9pZCBpcmxtcF91cGRhdGVfY2FjaGUoc3RydWN0IGxhcF9jYiAqbGFwLAoJCQkJICAgICAgc3RydWN0IGxzYXBfY2IgKmxzYXApCnsKCS8qIFByZXZlbnQgY29uY3VycmVudCByZWFkIHRvIGdldCBnYXJiYWdlICovCglsYXAtPmNhY2hlLnZhbGlkID0gRkFMU0U7CgkvKiBVcGRhdGUgY2FjaGUgZW50cnkgKi8KCWxhcC0+Y2FjaGUuZGxzYXBfc2VsID0gbHNhcC0+ZGxzYXBfc2VsOwoJbGFwLT5jYWNoZS5zbHNhcF9zZWwgPSBsc2FwLT5zbHNhcF9zZWw7CglsYXAtPmNhY2hlLmxzYXAgPSBsc2FwOwoJbGFwLT5jYWNoZS52YWxpZCA9IFRSVUU7Cn0KI2VuZGlmCgovKgogKiBGdW5jdGlvbiBpcmxtcF9maW5kX2hhbmRsZSAoc2VsZiwgZGxzYXBfc2VsLCBzbHNhcF9zZWwsIHN0YXR1cywgcXVldWUpCiAqCiAqICAgIEZpbmQgaGFuZGxlIGFzc29jaWF0ZWQgd2l0aCBkZXN0aW5hdGlvbiBhbmQgc291cmNlIExTQVAKICoKICogQW55IElyREEgY29ubmVjdGlvbiAoTFNBUC9UU0FQKSBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5CiAqIDMgcGFyYW1ldGVycywgdGhlIGxvY2FsIGxzYXAsIHRoZSByZW1vdGUgbHNhcCBhbmQgdGhlIHJlbW90ZSBhZGRyZXNzLgogKiBXZSBtYXkgaW5pdGlhdGUgbXVsdGlwbGUgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgcmVtb3RlIHNlcnZpY2UKICogKHRoZXkgd2lsbCBoYXZlIGRpZmZlcmVudCBsb2NhbCBsc2FwKSwgYSByZW1vdGUgZGV2aWNlIG1heSBpbml0aWF0ZQogKiBtdWx0aXBsZSBjb25uZWN0aW9ucyB0byB0aGUgc2FtZSBsb2NhbCBzZXJ2aWNlICh0aGV5IHdpbGwgaGF2ZQogKiBkaWZmZXJlbnQgcmVtb3RlIGxzYXApLCBvciBtdWx0aXBsZSBkZXZpY2VzIG1heSBjb25uZWN0IHRvIHRoZSBzYW1lCiAqIHNlcnZpY2UgYW5kIG1heSB1c2UgdGhlIHNhbWUgcmVtb3RlIGxzYXAgKGFuZCB0aGV5IHdpbGwgaGF2ZQogKiBkaWZmZXJlbnQgcmVtb3RlIGFkZHJlc3MpLgogKiBTbywgd2hlcmUgaXMgdGhlIHJlbW90ZSBhZGRyZXNzID8gRWFjaCBMQVAgY29ubmVjdGlvbiBpcyBtYWRlIHdpdGgKICogYSBzaW5nbGUgcmVtb3RlIGRldmljZSwgc28gaW1wbHkgYSBzcGVjaWZpYyByZW1vdGUgYWRkcmVzcy4KICogSmVhbiBJSQogKi8Kc3RhdGljIHN0cnVjdCBsc2FwX2NiICppcmxtcF9maW5kX2xzYXAoc3RydWN0IGxhcF9jYiAqc2VsZiwgX191OCBkbHNhcF9zZWwsCgkJCQkgICAgICAgX191OCBzbHNhcF9zZWwsIGludCBzdGF0dXMsCgkJCQkgICAgICAgaGFzaGJpbl90ICpxdWV1ZSkKewoJc3RydWN0IGxzYXBfY2IgKmxzYXA7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCS8qCgkgKiAgT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZS4gV2UgYXNzdW1lIHRoYXQgdGhlIGxhc3QgZnJhbWUKCSAqICByZWNlaXZlZCBpcyBpbiB0aGUgc2FtZSBjb25uZWN0aW9uIGFzIHRoZSBsYXN0IG9uZSwgc28gY2hlY2sgaW4KCSAqICBjYWNoZSBmaXJzdCB0byBhdm9pZCB0aGUgbGluZWFyIHNlYXJjaAoJICovCiNpZmRlZiBDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVAKCWlmICgoc2VsZi0+Y2FjaGUudmFsaWQpICYmCgkgICAgKHNlbGYtPmNhY2hlLnNsc2FwX3NlbCA9PSBzbHNhcF9zZWwpICYmCgkgICAgKHNlbGYtPmNhY2hlLmRsc2FwX3NlbCA9PSBkbHNhcF9zZWwpKQoJewoJCXJldHVybiAoc2VsZi0+Y2FjaGUubHNhcCk7Cgl9CiNlbmRpZgoKCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCglsc2FwID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KHF1ZXVlKTsKCXdoaWxlIChsc2FwICE9IE5VTEwpIHsKCQkvKgoJCSAqICBJZiB0aGlzIGlzIGFuIGluY29taW5nIGNvbm5lY3Rpb24sIHRoZW4gdGhlIGRlc3RpbmF0aW9uCgkJICogIExTQVAgc2VsZWN0b3IgbWF5IGhhdmUgYmVlbiBzcGVjaWZpZWQgYXMgTE1fQU5ZIHNvIHRoYXQKCQkgKiAgYW55IGNsaWVudCBjYW4gY29ubmVjdC4gSW4gdGhhdCBjYXNlIHdlIG9ubHkgbmVlZCB0byBjaGVjawoJCSAqICBpZiB0aGUgc291cmNlIExTQVAgKGluIG91ciB2aWV3ISkgbWF0Y2ghCgkJICovCgkJaWYgKChzdGF0dXMgPT0gQ09OTkVDVF9DTUQpICYmCgkJICAgIChsc2FwLT5zbHNhcF9zZWwgPT0gc2xzYXBfc2VsKSAmJgoJCSAgICAobHNhcC0+ZGxzYXBfc2VsID09IExTQVBfQU5ZKSkgewoJCQkvKiBUaGlzIGlzIHdoZXJlIHRoZSBkZXN0IGxzYXAgc2VsIGlzIHNldCBvbiBpbmNvbWluZwoJCQkgKiBsc2FwcyAqLwoJCQlsc2FwLT5kbHNhcF9zZWwgPSBkbHNhcF9zZWw7CgkJCWJyZWFrOwoJCX0KCQkvKgoJCSAqICBDaGVjayBpZiBzb3VyY2UgTFNBUCBhbmQgZGVzdCBMU0FQIHNlbGVjdG9ycyBtYXRjaC4KCQkgKi8KCQlpZiAoKGxzYXAtPnNsc2FwX3NlbCA9PSBzbHNhcF9zZWwpICYmCgkJICAgIChsc2FwLT5kbHNhcF9zZWwgPT0gZGxzYXBfc2VsKSkKCQkJYnJlYWs7CgoJCWxzYXAgPSAoc3RydWN0IGxzYXBfY2IgKikgaGFzaGJpbl9nZXRfbmV4dChxdWV1ZSk7Cgl9CiNpZmRlZiBDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVAKCWlmKGxzYXApCgkJaXJsbXBfdXBkYXRlX2NhY2hlKHNlbGYsIGxzYXApOwojZW5kaWYKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoKCS8qIFJldHVybiB3aGF0IHdlJ3ZlIGZvdW5kIG9yIE5VTEwgKi8KCXJldHVybiBsc2FwOwp9Cg==