LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcnR0cC5jCiAqIFZlcnNpb246ICAgICAgIDEuMgogKiBEZXNjcmlwdGlvbjogICBUaW55IFRyYW5zcG9ydCBQcm90b2NvbCAoVFRQKSBpbXBsZW1lbnRhdGlvbgogKiBTdGF0dXM6ICAgICAgICBTdGFibGUKICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBTdW4gQXVnIDMxIDIwOjE0OjMxIDE5OTcKICogTW9kaWZpZWQgYXQ6ICAgV2VkIEphbiAgNSAxMTozMToyNyAyMDAwCiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sCiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgoKI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL3BhcmFtZXRlcnMuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lydHRwLmg+CgpzdGF0aWMgc3RydWN0IGlydHRwX2NiICppcnR0cDsKCnN0YXRpYyB2b2lkIF9faXJ0dHBfY2xvc2VfdHNhcChzdHJ1Y3QgdHNhcF9jYiAqc2VsZik7CgpzdGF0aWMgaW50IGlydHRwX2RhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJIHN0cnVjdCBza19idWZmICpza2IpOwpzdGF0aWMgaW50IGlydHRwX3VkYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyB2b2lkIGlydHRwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJCUxNX1JFQVNPTiByZWFzb24sIHN0cnVjdCBza19idWZmICopOwpzdGF0aWMgdm9pZCBpcnR0cF9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZHVfc2l6ZSwKCQkJCSAgICAgX191OCBoZWFkZXJfc2l6ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyB2b2lkIGlydHRwX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NkdV9zaXplLAoJCQkJICBfX3U4IGhlYWRlcl9zaXplLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIHZvaWQgaXJ0dHBfcnVuX3R4X3F1ZXVlKHN0cnVjdCB0c2FwX2NiICpzZWxmKTsKc3RhdGljIHZvaWQgaXJ0dHBfcnVuX3J4X3F1ZXVlKHN0cnVjdCB0c2FwX2NiICpzZWxmKTsKCnN0YXRpYyB2b2lkIGlydHRwX2ZsdXNoX3F1ZXVlcyhzdHJ1Y3QgdHNhcF9jYiAqc2VsZik7CnN0YXRpYyB2b2lkIGlydHRwX2ZyYWdtZW50X3NrYihzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaXJ0dHBfcmVhc3NlbWJsZV9za2Ioc3RydWN0IHRzYXBfY2IgKnNlbGYpOwpzdGF0aWMgdm9pZCBpcnR0cF90b2RvX2V4cGlyZWQodW5zaWduZWQgbG9uZyBkYXRhKTsKc3RhdGljIGludCBpcnR0cF9wYXJhbV9tYXhfc2R1X3NpemUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sCgkJCQkgICAgaW50IGdldCk7CgpzdGF0aWMgdm9pZCBpcnR0cF9mbG93X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgTE9DQUxfRkxPVyBmbG93KTsKc3RhdGljIHZvaWQgaXJ0dHBfc3RhdHVzX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsCgkJCQkgICAgTElOS19TVEFUVVMgbGluaywgTE9DS19TVEFUVVMgbG9jayk7CgovKiBJbmZvcm1hdGlvbiBmb3IgcGFyc2luZyBwYXJhbWV0ZXJzIGluIElyVFRQICovCnN0YXRpYyBwaV9taW5vcl9pbmZvX3QgcGlfbWlub3JfY2FsbF90YWJsZVtdID0gewoJeyBOVUxMLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMCAqLwoJeyBpcnR0cF9wYXJhbV9tYXhfc2R1X3NpemUsIFBWX0lOVEVHRVIgfCBQVl9CSUdfRU5ESUFOIH0gLyogMHgwMSAqLwp9OwpzdGF0aWMgcGlfbWFqb3JfaW5mb190IHBpX21ham9yX2NhbGxfdGFibGVbXSA9IHt7IHBpX21pbm9yX2NhbGxfdGFibGUsIDIgfX07CnN0YXRpYyBwaV9wYXJhbV9pbmZvX3QgcGFyYW1faW5mbyA9IHsgcGlfbWFqb3JfY2FsbF90YWJsZSwgMSwgMHgwZiwgNCB9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKiBHTE9CQUwgUFJPQ0VEVVJFUyAqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBGdW5jdGlvbiBpcnR0cF9pbml0ICh2b2lkKQogKgogKiAgICBJbml0aWFsaXplIHRoZSBJclRUUCBsYXllci4gQ2FsbGVkIGJ5IG1vZHVsZSBpbml0aWFsaXphdGlvbiBjb2RlCiAqCiAqLwppbnQgX19pbml0IGlydHRwX2luaXQodm9pZCkKewoJaXJ0dHAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXJ0dHBfY2IpLCBHRlBfS0VSTkVMKTsKCWlmIChpcnR0cCA9PSBOVUxMKQoJCXJldHVybiAtRU5PTUVNOwoKCWlydHRwLT5tYWdpYyA9IFRUUF9NQUdJQzsKCglpcnR0cC0+dHNhcHMgPSBoYXNoYmluX25ldyhIQl9MT0NLKTsKCWlmICghaXJ0dHAtPnRzYXBzKSB7CgkJSVJEQV9FUlJPUigiJXM6IGNhbid0IGFsbG9jYXRlIElyVFRQIGhhc2hiaW4hXG4iLAoJCQkgICBfX0ZVTkNUSU9OX18pOwoJCWtmcmVlKGlydHRwKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJ0dHBfY2xlYW51cCAodm9pZCkKICoKICogICAgQ2FsbGVkIGJ5IG1vZHVsZSBkZXN0cnVjdGlvbi9jbGVhbnVwIGNvZGUKICoKICovCnZvaWQgX19leGl0IGlydHRwX2NsZWFudXAodm9pZCkKewoJLyogQ2hlY2sgZm9yIG1haW4gc3RydWN0dXJlICovCglJUkRBX0FTU0VSVChpcnR0cC0+bWFnaWMgPT0gVFRQX01BR0lDLCByZXR1cm47KTsKCgkvKgoJICogIERlbGV0ZSBoYXNoYmluIGFuZCBjbG9zZSBhbGwgVFNBUCBpbnN0YW5jZXMgaW4gaXQKCSAqLwoJaGFzaGJpbl9kZWxldGUoaXJ0dHAtPnRzYXBzLCAoRlJFRV9GVU5DKSBfX2lydHRwX2Nsb3NlX3RzYXApOwoKCWlydHRwLT5tYWdpYyA9IDA7CgoJLyogRGUtYWxsb2NhdGUgbWFpbiBzdHJ1Y3R1cmUgKi8KCWtmcmVlKGlydHRwKTsKCglpcnR0cCA9IE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKiogU1VCUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogRnVuY3Rpb24gaXJ0dHBfc3RhcnRfdG9kb190aW1lciAoc2VsZiwgdGltZW91dCkKICoKICogICAgU3RhcnQgdG9kbyB0aW1lci4KICoKICogTWFkZSBpdCBtb3JlIGVmZmllbnQgYW5kIHVuc2Vuc2l0aXZlIHRvIHJhY2UgY29uZGl0aW9ucyAtIEplYW4gSUkKICovCnN0YXRpYyBpbmxpbmUgdm9pZCBpcnR0cF9zdGFydF90b2RvX3RpbWVyKHN0cnVjdCB0c2FwX2NiICpzZWxmLCBpbnQgdGltZW91dCkKewoJLyogU2V0IG5ldyB2YWx1ZSBmb3IgdGltZXIgKi8KCW1vZF90aW1lcigmc2VsZi0+dG9kb190aW1lciwgamlmZmllcyArIHRpbWVvdXQpOwp9CgovKgogKiBGdW5jdGlvbiBpcnR0cF90b2RvX2V4cGlyZWQgKGRhdGEpCiAqCiAqICAgIFRvZG8gdGltZXIgaGFzIGV4cGlyZWQhCiAqCiAqIE9uZSBvZiB0aGUgcmVzdHJpY3Rpb24gb2YgdGhlIHRpbWVyIGlzIHRoYXQgaXQgaXMgcnVuIG9ubHkgb24gdGhlIHRpbWVyCiAqIGludGVycnVwdCB3aGljaCBydW4gZXZlcnkgMTBtcy4gVGhpcyBtZWFuIHRoYXQgZXZlbiBpZiB5b3Ugc2V0IHRoZSB0aW1lcgogKiB3aXRoIGEgZGVsYXkgb2YgMCwgaXQgbWF5IHRha2UgdXAgdG8gMTBtcyBiZWZvcmUgaXQncyBydW4uCiAqIFNvLCB0byBtaW5pbWlzZSBsYXRlbmN5IGFuZCBrZWVwIGNhY2hlIGZyZXNoLCB3ZSB0cnkgdG8gYXZvaWQgdXNpbmcKICogaXQgYXMgbXVjaCBhcyBwb3NzaWJsZS4KICogTm90ZSA6IHdlIGNhbid0IHVzZSB0YXNrbGV0cywgYmVjYXVzZSB0aGV5IGNhbid0IGJlIGFzeW5jaHJvbm91c2x5CiAqIGtpbGxlZCAobmVlZCB1c2VyIGNvbnRleHQpLCBhbmQgd2UgY2FuJ3QgZ3VhcmFudGVlIHRoYXQgaGVyZS4uLgogKiBKZWFuIElJCiAqLwpzdGF0aWMgdm9pZCBpcnR0cF90b2RvX2V4cGlyZWQodW5zaWduZWQgbG9uZyBkYXRhKQp7CglzdHJ1Y3QgdHNhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBkYXRhOwoKCS8qIENoZWNrIHRoYXQgd2Ugc3RpbGwgZXhpc3QgKi8KCWlmICghc2VsZiB8fCBzZWxmLT5tYWdpYyAhPSBUVFBfVFNBUF9NQUdJQykKCQlyZXR1cm47CgoJSVJEQV9ERUJVRyg0LCAiJXMoaW5zdGFuY2U9JXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOwoKCS8qIFRyeSB0byBtYWtlIHNvbWUgcHJvZ3Jlc3MsIGVzcGVjaWFsbHkgb24gVHggc2lkZSAtIEplYW4gSUkgKi8KCWlydHRwX3J1bl9yeF9xdWV1ZShzZWxmKTsKCWlydHRwX3J1bl90eF9xdWV1ZShzZWxmKTsKCgkvKiBDaGVjayBpZiB0aW1lIGZvciBkaXNjb25uZWN0ICovCglpZiAodGVzdF9iaXQoMCwgJnNlbGYtPmRpc2Nvbm5lY3RfcGVuZCkpIHsKCQkvKiBDaGVjayBpZiBpdCdzIHBvc3NpYmxlIHRvIGRpc2Nvbm5lY3QgeWV0ICovCgkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhfcXVldWUpKSB7CgkJCS8qIE1ha2Ugc3VyZSBkaXNjb25uZWN0IGlzIG5vdCBwZW5kaW5nIGFueW1vcmUgKi8KCQkJY2xlYXJfYml0KDAsICZzZWxmLT5kaXNjb25uZWN0X3BlbmQpOwkvKiBGQUxTRSAqLwoKCQkJLyogTm90ZSA6IHNlbGYtPmRpc2Nvbm5lY3Rfc2tiIG1heSBiZSBOVUxMICovCgkJCWlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLCBzZWxmLT5kaXNjb25uZWN0X3NrYiwKCQkJCQkJIFBfTk9STUFMKTsKCQkJc2VsZi0+ZGlzY29ubmVjdF9za2IgPSBOVUxMOwoJCX0gZWxzZSB7CgkJCS8qIFRyeSBhZ2FpbiBsYXRlciAqLwoJCQlpcnR0cF9zdGFydF90b2RvX3RpbWVyKHNlbGYsIEhaLzEwKTsKCgkJCS8qIE5vIHJlYXNvbiB0byB0cnkgYW5kIGNsb3NlIG5vdyAqLwoJCQlyZXR1cm47CgkJfQoJfQoKCS8qIENoZWNrIGlmIGl0J3MgY2xvc2luZyB0aW1lICovCglpZiAoc2VsZi0+Y2xvc2VfcGVuZCkKCQkvKiBGaW5pc2ggY2xlYW51cCAqLwoJCWlydHRwX2Nsb3NlX3RzYXAoc2VsZik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2ZsdXNoX3F1ZXVlcyAoc2VsZikKICoKICogICAgIEZsdXNoZXMgKHJlbW92ZXMgYWxsIGZyYW1lcykgaW4gdHJhbnNpdHQtYnVmZmVyICh0eF9saXN0KQogKi8Kdm9pZCBpcnR0cF9mbHVzaF9xdWV1ZXMoc3RydWN0IHRzYXBfY2IgKnNlbGYpCnsKCXN0cnVjdCBza19idWZmKiBza2I7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOwoKCS8qIERlYWxsb2NhdGUgZnJhbWVzIHdhaXRpbmcgdG8gYmUgc2VudCAqLwoJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+dHhfcXVldWUpKSAhPSBOVUxMKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCgkvKiBEZWFsbG9jYXRlIHJlY2VpdmVkIGZyYW1lcyAqLwoJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+cnhfcXVldWUpKSAhPSBOVUxMKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCgkvKiBEZWFsbG9jYXRlIHJlY2VpdmVkIGZyYWdtZW50cyAqLwoJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+cnhfZnJhZ21lbnRzKSkgIT0gTlVMTCkKCQlkZXZfa2ZyZWVfc2tiKHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX3JlYXNzZW1ibGUgKHNlbGYpCiAqCiAqICAgIE1ha2VzIGEgbmV3IChjb250aW51b3VzKSBza2Igb2YgYWxsIHRoZSBmcmFnbWVudHMgaW4gdGhlIGZyYWdtZW50CiAqICAgIHF1ZXVlCiAqCiAqLwpzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmlydHRwX3JlYXNzZW1ibGVfc2tiKHN0cnVjdCB0c2FwX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqZnJhZzsKCWludCBuID0gMDsgIC8qIEZyYWdtZW50IGluZGV4ICovCgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybiBOVUxMOyk7CgoJSVJEQV9ERUJVRygyLCAiJXMoKSwgc2VsZi0+cnhfc2R1X3NpemU9JWRcbiIsIF9fRlVOQ1RJT05fXywKCQkgICBzZWxmLT5yeF9zZHVfc2l6ZSk7CgoJc2tiID0gZGV2X2FsbG9jX3NrYihUVFBfSEVBREVSICsgc2VsZi0+cnhfc2R1X3NpemUpOwoJaWYgKCFza2IpCgkJcmV0dXJuIE5VTEw7CgoJLyoKCSAqIE5lZWQgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgVFRQIGhlYWRlciBpbiBjYXNlIHRoaXMgc2tiIG5lZWRzIHRvCgkgKiBiZSByZXF1ZXVlZCBpbiBjYXNlIGRlbGl2ZXJ5IGZhaWxlcwoJICovCglza2JfcmVzZXJ2ZShza2IsIFRUUF9IRUFERVIpOwoJc2tiX3B1dChza2IsIHNlbGYtPnJ4X3NkdV9zaXplKTsKCgkvKgoJICogIENvcHkgYWxsIGZyYWdtZW50cyB0byBhIG5ldyBidWZmZXIKCSAqLwoJd2hpbGUgKChmcmFnID0gc2tiX2RlcXVldWUoJnNlbGYtPnJ4X2ZyYWdtZW50cykpICE9IE5VTEwpIHsKCQltZW1jcHkoc2tiLT5kYXRhK24sIGZyYWctPmRhdGEsIGZyYWctPmxlbik7CgkJbiArPSBmcmFnLT5sZW47CgoJCWRldl9rZnJlZV9za2IoZnJhZyk7Cgl9CgoJSVJEQV9ERUJVRygyLAoJCSAgICIlcygpLCBmcmFtZSBsZW49JWQsIHJ4X3NkdV9zaXplPSVkLCByeF9tYXhfc2R1X3NpemU9JWRcbiIsCgkJICAgX19GVU5DVElPTl9fLCBuLCBzZWxmLT5yeF9zZHVfc2l6ZSwgc2VsZi0+cnhfbWF4X3NkdV9zaXplKTsKCS8qIE5vdGUgOiBpcnR0cF9ydW5fcnhfcXVldWUoKSBjYWxjdWxhdGUgc2VsZi0+cnhfc2R1X3NpemUKCSAqIGJ5IHN1bW1pbmcgdGhlIHNpemUgb2YgYWxsIGZyYWdtZW50cywgc28gd2Ugc2hvdWxkIGFsd2F5cwoJICogaGF2ZSBuID09IHNlbGYtPnJ4X3NkdV9zaXplLCBleGNlcHQgaW4gY2FzZXMgd2hlcmUgd2UKCSAqIGRyb3BlZCB0aGUgbGFzdCBmcmFnbWVudCAod2hlbiBzZWxmLT5yeF9zZHVfc2l6ZSBleGNlZWQKCSAqIHNlbGYtPnJ4X21heF9zZHVfc2l6ZSksIHdoZXJlIG4gPCBzZWxmLT5yeF9zZHVfc2l6ZS4KCSAqIEplYW4gSUkgKi8KCUlSREFfQVNTRVJUKG4gPD0gc2VsZi0+cnhfc2R1X3NpemUsIG4gPSBzZWxmLT5yeF9zZHVfc2l6ZTspOwoKCS8qIFNldCB0aGUgbmV3IGxlbmd0aCAqLwoJc2tiX3RyaW0oc2tiLCBuKTsKCglzZWxmLT5yeF9zZHVfc2l6ZSA9IDA7CgoJcmV0dXJuIHNrYjsKfQoKLyoKICogRnVuY3Rpb24gaXJ0dHBfZnJhZ21lbnRfc2tiIChza2IpCiAqCiAqICAgIEZyYWdtZW50cyBhIGZyYW1lIGFuZCBxdWV1ZXMgYWxsIHRoZSBmcmFnbWVudHMgZm9yIHRyYW5zbWlzc2lvbgogKgogKi8Kc3RhdGljIGlubGluZSB2b2lkIGlydHRwX2ZyYWdtZW50X3NrYihzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwKCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBza19idWZmICpmcmFnOwoJX191OCAqZnJhbWU7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwoKCS8qCgkgKiAgU3BsaXQgZnJhbWUgaW50byBhIG51bWJlciBvZiBzZWdtZW50cwoJICovCgl3aGlsZSAoc2tiLT5sZW4gPiBzZWxmLT5tYXhfc2VnX3NpemUpIHsKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBmcmFnbWVudGluZyAuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CgoJCS8qIE1ha2UgbmV3IHNlZ21lbnQgKi8KCQlmcmFnID0gYWxsb2Nfc2tiKHNlbGYtPm1heF9zZWdfc2l6ZStzZWxmLT5tYXhfaGVhZGVyX3NpemUsCgkJCQkgR0ZQX0FUT01JQyk7CgkJaWYgKCFmcmFnKQoJCQlyZXR1cm47CgoJCXNrYl9yZXNlcnZlKGZyYWcsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7CgoJCS8qIENvcHkgZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCBza2IgaW50byB0aGlzIGZyYWdtZW50LiAqLwoJCW1lbWNweShza2JfcHV0KGZyYWcsIHNlbGYtPm1heF9zZWdfc2l6ZSksIHNrYi0+ZGF0YSwKCQkgICAgICAgc2VsZi0+bWF4X3NlZ19zaXplKTsKCgkJLyogSW5zZXJ0IFRUUCBoZWFkZXIsIHdpdGggdGhlIG1vcmUgYml0IHNldCAqLwoJCWZyYW1lID0gc2tiX3B1c2goZnJhZywgVFRQX0hFQURFUik7CgkJZnJhbWVbMF0gPSBUVFBfTU9SRTsKCgkJLyogSGlkZSB0aGUgY29waWVkIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgc2tiICovCgkJc2tiX3B1bGwoc2tiLCBzZWxmLT5tYXhfc2VnX3NpemUpOwoKCQkvKiBRdWV1ZSBmcmFnbWVudCAqLwoJCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT50eF9xdWV1ZSwgZnJhZyk7Cgl9CgkvKiBRdWV1ZSB3aGF0IGlzIGxlZnQgb2YgdGhlIG9yaWdpbmFsIHNrYiAqLwoJSVJEQV9ERUJVRygyLCAiJXMoKSwgcXVldWluZyBsYXN0IHNlZ21lbnRcbiIsIF9fRlVOQ1RJT05fXyk7CgoJZnJhbWUgPSBza2JfcHVzaChza2IsIFRUUF9IRUFERVIpOwoJZnJhbWVbMF0gPSAweDAwOyAvKiBDbGVhciBtb3JlIGJpdCAqLwoKCS8qIFF1ZXVlIGZyYWdtZW50ICovCglza2JfcXVldWVfdGFpbCgmc2VsZi0+dHhfcXVldWUsIHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX3BhcmFtX21heF9zZHVfc2l6ZSAoc2VsZiwgcGFyYW0pCiAqCiAqICAgIEhhbmRsZSB0aGUgTWF4U2R1U2l6ZSBwYXJhbWV0ZXIgaW4gdGhlIGNvbm5lY3QgZnJhbWVzLCB0aGlzIGZ1bmN0aW9uCiAqICAgIHdpbGwgYmUgY2FsbGVkIGJvdGggd2hlbiB0aGlzIHBhcmFtZXRlciBuZWVkcyB0byBiZSBpbnNlcnRlZCBpbnRvLCBhbmQKICogICAgZXh0cmFjdGVkIGZyb20gdGhlIGNvbm5lY3QgZnJhbWVzCiAqLwpzdGF0aWMgaW50IGlydHRwX3BhcmFtX21heF9zZHVfc2l6ZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwKCQkJCSAgICBpbnQgZ2V0KQp7CglzdHJ1Y3QgdHNhcF9jYiAqc2VsZjsKCglzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CgoJaWYgKGdldCkKCQlwYXJhbS0+cHYuaSA9IHNlbGYtPnR4X21heF9zZHVfc2l6ZTsKCWVsc2UKCQlzZWxmLT50eF9tYXhfc2R1X3NpemUgPSBwYXJhbS0+cHYuaTsKCglJUkRBX0RFQlVHKDEsICIlcygpLCBNYXhTZHVTaXplPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT5wdi5pKTsKCglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBDTElFTlQgQ0FMTFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKiogTE1QIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogRXZlcnl0aGluZyBpcyBoYXBwaWx5IG1peGVkIHVwLiBXYWl0aW5nIGZvciBuZXh0IGNsZWFuIHVwIC0gSmVhbiBJSSAqLwoKLyoKICogRnVuY3Rpb24gaXJ0dHBfb3Blbl90c2FwIChzdHNhcCwgbm90aWZ5KQogKgogKiAgICBDcmVhdGUgVFNBUCBjb25uZWN0aW9uIGVuZHBvaW50LAogKi8Kc3RydWN0IHRzYXBfY2IgKmlydHRwX29wZW5fdHNhcChfX3U4IHN0c2FwX3NlbCwgaW50IGNyZWRpdCwgbm90aWZ5X3QgKm5vdGlmeSkKewoJc3RydWN0IHRzYXBfY2IgKnNlbGY7CglzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKCW5vdGlmeV90IHR0cF9ub3RpZnk7CgoJSVJEQV9BU1NFUlQoaXJ0dHAtPm1hZ2ljID09IFRUUF9NQUdJQywgcmV0dXJuIE5VTEw7KTsKCgkvKiBUaGUgSXJMTVAgc3BlYyAoSXJMTVAgMS4xIHAxMCkgc2F5cyB0aGF0IHdlIGhhdmUgdGhlIHJpZ2h0IHRvCgkgKiB1c2Ugb25seSAweDAxLTB4NkYuIE9mIGNvdXJzZSwgd2UgY2FuIHVzZSBMU0FQX0FOWSBhcyB3ZWxsLgoJICogSmVhbklJICovCglpZigoc3RzYXBfc2VsICE9IExTQVBfQU5ZKSAmJgoJICAgKChzdHNhcF9zZWwgPCAweDAxKSB8fCAoc3RzYXBfc2VsID49IDB4NzApKSkgewoJCUlSREFfREVCVUcoMCwgIiVzKCksIGludmFsaWQgdHNhcCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJc2VsZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0c2FwX2NiKSwgR0ZQX0FUT01JQyk7CglpZiAoc2VsZiA9PSBOVUxMKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoJc3Bpbl9sb2NrX2luaXQoJnNlbGYtPmxvY2spOwoKCS8qIEluaXRpYWxpc2UgdG9kbyB0aW1lciAqLwoJaW5pdF90aW1lcigmc2VsZi0+dG9kb190aW1lcik7CglzZWxmLT50b2RvX3RpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpIHNlbGY7CglzZWxmLT50b2RvX3RpbWVyLmZ1bmN0aW9uID0gJmlydHRwX3RvZG9fZXhwaXJlZDsKCgkvKiBJbml0aWFsaXplIGNhbGxiYWNrcyBmb3IgSXJMTVAgdG8gdXNlICovCglpcmRhX25vdGlmeV9pbml0KCZ0dHBfbm90aWZ5KTsKCXR0cF9ub3RpZnkuY29ubmVjdF9jb25maXJtID0gaXJ0dHBfY29ubmVjdF9jb25maXJtOwoJdHRwX25vdGlmeS5jb25uZWN0X2luZGljYXRpb24gPSBpcnR0cF9jb25uZWN0X2luZGljYXRpb247Cgl0dHBfbm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IGlydHRwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbjsKCXR0cF9ub3RpZnkuZGF0YV9pbmRpY2F0aW9uID0gaXJ0dHBfZGF0YV9pbmRpY2F0aW9uOwoJdHRwX25vdGlmeS51ZGF0YV9pbmRpY2F0aW9uID0gaXJ0dHBfdWRhdGFfaW5kaWNhdGlvbjsKCXR0cF9ub3RpZnkuZmxvd19pbmRpY2F0aW9uID0gaXJ0dHBfZmxvd19pbmRpY2F0aW9uOwoJaWYobm90aWZ5LT5zdGF0dXNfaW5kaWNhdGlvbiAhPSBOVUxMKQoJCXR0cF9ub3RpZnkuc3RhdHVzX2luZGljYXRpb24gPSBpcnR0cF9zdGF0dXNfaW5kaWNhdGlvbjsKCXR0cF9ub3RpZnkuaW5zdGFuY2UgPSBzZWxmOwoJc3RybmNweSh0dHBfbm90aWZ5Lm5hbWUsIG5vdGlmeS0+bmFtZSwgTk9USUZZX01BWF9OQU1FKTsKCglzZWxmLT5tYWdpYyA9IFRUUF9UU0FQX01BR0lDOwoJc2VsZi0+Y29ubmVjdGVkID0gRkFMU0U7CgoJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2VsZi0+cnhfcXVldWUpOwoJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2VsZi0+dHhfcXVldWUpOwoJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2VsZi0+cnhfZnJhZ21lbnRzKTsKCS8qCgkgKiAgQ3JlYXRlIExTQVAgYXQgSXJMTVAgbGF5ZXIKCSAqLwoJbHNhcCA9IGlybG1wX29wZW5fbHNhcChzdHNhcF9zZWwsICZ0dHBfbm90aWZ5LCAwKTsKCWlmIChsc2FwID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgTFNBUCEhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qCgkgKiAgSWYgdXNlciBzcGVjaWZpZWQgTFNBUF9BTlkgYXMgc291cmNlIFRTQVAgc2VsZWN0b3IsIHRoZW4gSXJMTVAKCSAqICB3aWxsIHJlcGxhY2UgaXQgd2l0aCB3aGF0ZXZlciBzb3VyY2Ugc2VsZWN0b3Igd2hpY2ggaXMgZnJlZSwgc28KCSAqICB0aGUgc3RzYXBfc2VsIHdlIGhhdmUgbWlnaHQgbm90IGJlIHZhbGlkIGFueW1vcmUKCSAqLwoJc2VsZi0+c3RzYXBfc2VsID0gbHNhcC0+c2xzYXBfc2VsOwoJSVJEQV9ERUJVRyg0LCAiJXMoKSwgc3RzYXBfc2VsPSUwMnhcbiIsIF9fRlVOQ1RJT05fXywgc2VsZi0+c3RzYXBfc2VsKTsKCglzZWxmLT5ub3RpZnkgPSAqbm90aWZ5OwoJc2VsZi0+bHNhcCA9IGxzYXA7CgoJaGFzaGJpbl9pbnNlcnQoaXJ0dHAtPnRzYXBzLCAoaXJkYV9xdWV1ZV90ICopIHNlbGYsIChsb25nKSBzZWxmLCBOVUxMKTsKCglpZiAoY3JlZGl0ID4gVFRQX1JYX01BWF9DUkVESVQpCgkJc2VsZi0+aW5pdGlhbF9jcmVkaXQgPSBUVFBfUlhfTUFYX0NSRURJVDsKCWVsc2UKCQlzZWxmLT5pbml0aWFsX2NyZWRpdCA9IGNyZWRpdDsKCglyZXR1cm4gc2VsZjsKfQpFWFBPUlRfU1lNQk9MKGlydHRwX29wZW5fdHNhcCk7CgovKgogKiBGdW5jdGlvbiBpcnR0cF9jbG9zZSAoaGFuZGxlKQogKgogKiAgICBSZW1vdmUgYW4gaW5zdGFuY2Ugb2YgYSBUU0FQLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGRlYWwgd2l0aCB0aGUKICogICAgZGVhbGxvY2F0aW9uIG9mIHRoZSBUU0FQLCBhbmQgcmVzZXR0aW5nIG9mIHRoZSBUU0FQcyB2YWx1ZXM7CiAqCiAqLwpzdGF0aWMgdm9pZCBfX2lydHRwX2Nsb3NlX3RzYXAoc3RydWN0IHRzYXBfY2IgKnNlbGYpCnsKCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuICovCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOwoKCWlydHRwX2ZsdXNoX3F1ZXVlcyhzZWxmKTsKCglkZWxfdGltZXIoJnNlbGYtPnRvZG9fdGltZXIpOwoKCS8qIFRoaXMgb25lIHdvbid0IGJlIGNsZWFuZWQgdXAgaWYgd2UgYXJlIGRpc2Nvbm5lY3RfcGVuZCArIGNsb3NlX3BlbmQKCSAqIGFuZCB3ZSByZWNlaXZlIGEgZGlzY29ubmVjdF9pbmRpY2F0aW9uICovCglpZiAoc2VsZi0+ZGlzY29ubmVjdF9za2IpCgkJZGV2X2tmcmVlX3NrYihzZWxmLT5kaXNjb25uZWN0X3NrYik7CgoJc2VsZi0+Y29ubmVjdGVkID0gRkFMU0U7CglzZWxmLT5tYWdpYyA9IH5UVFBfVFNBUF9NQUdJQzsKCglrZnJlZShzZWxmKTsKfQoKLyoKICogRnVuY3Rpb24gaXJ0dHBfY2xvc2UgKHNlbGYpCiAqCiAqICAgIFJlbW92ZSBUU0FQIGZyb20gbGlzdCBvZiBhbGwgVFNBUHMgYW5kIHRoZW4gZGVhbGxvY2F0ZSBhbGwgcmVzb3VyY2VzCiAqICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRTQVAKICoKICogTm90ZSA6IGJlY2F1c2Ugd2UgKmZyZWUqIHRoZSB0c2FwIHN0cnVjdHVyZSwgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5CiAqIG9mIHRoZSBjYWxsZXIgdG8gbWFrZSBzdXJlIHdlIGFyZSBjYWxsZWQgb25seSBvbmNlIGFuZCB0byBkZWFsIHdpdGgKICogcG9zc2libGUgcmFjZSBjb25kaXRpb25zLiAtIEplYW4gSUkKICovCmludCBpcnR0cF9jbG9zZV90c2FwKHN0cnVjdCB0c2FwX2NiICpzZWxmKQp7CglzdHJ1Y3QgdHNhcF9jYiAqdHNhcDsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CgoJLyogTWFrZSBzdXJlIHRzYXAgaGFzIGJlZW4gZGlzY29ubmVjdGVkICovCglpZiAoc2VsZi0+Y29ubmVjdGVkKSB7CgkJLyogQ2hlY2sgaWYgZGlzY29ubmVjdCBpcyBub3QgcGVuZGluZyAqLwoJCWlmICghdGVzdF9iaXQoMCwgJnNlbGYtPmRpc2Nvbm5lY3RfcGVuZCkpIHsKCQkJSVJEQV9XQVJOSU5HKCIlczogVFNBUCBzdGlsbCBjb25uZWN0ZWQhXG4iLAoJCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCQlpcnR0cF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZiwgTlVMTCwgUF9OT1JNQUwpOwoJCX0KCQlzZWxmLT5jbG9zZV9wZW5kID0gVFJVRTsKCQlpcnR0cF9zdGFydF90b2RvX3RpbWVyKHNlbGYsIEhaLzEwKTsKCgkJcmV0dXJuIDA7IC8qIFdpbGwgYmUgYmFjayEgKi8KCX0KCgl0c2FwID0gaGFzaGJpbl9yZW1vdmUoaXJ0dHAtPnRzYXBzLCAobG9uZykgc2VsZiwgTlVMTCk7CgoJSVJEQV9BU1NFUlQodHNhcCA9PSBzZWxmLCByZXR1cm4gLTE7KTsKCgkvKiBDbG9zZSBjb3JyZXNwb25kaW5nIExTQVAgKi8KCWlmIChzZWxmLT5sc2FwKSB7CgkJaXJsbXBfY2xvc2VfbHNhcChzZWxmLT5sc2FwKTsKCQlzZWxmLT5sc2FwID0gTlVMTDsKCX0KCglfX2lydHRwX2Nsb3NlX3RzYXAoc2VsZik7CgoJcmV0dXJuIDA7Cn0KRVhQT1JUX1NZTUJPTChpcnR0cF9jbG9zZV90c2FwKTsKCi8qCiAqIEZ1bmN0aW9uIGlydHRwX3VkYXRhX3JlcXVlc3QgKHNlbGYsIHNrYikKICoKICogICAgU2VuZCB1bnJlbGlhYmxlIGRhdGEgb24gdGhpcyBUU0FQCiAqCiAqLwppbnQgaXJ0dHBfdWRhdGFfcmVxdWVzdChzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCS8qIENoZWNrIHRoYXQgbm90aGluZyBiYWQgaGFwcGVucyAqLwoJaWYgKChza2ItPmxlbiA9PSAwKSB8fCAoIXNlbGYtPmNvbm5lY3RlZCkpIHsKCQlJUkRBX0RFQlVHKDEsICIlcygpLCBObyBkYXRhLCBvciBub3QgY29ubmVjdGVkXG4iLAoJCQkgICBfX0ZVTkNUSU9OX18pOwoJCWdvdG8gZXJyOwoJfQoKCWlmIChza2ItPmxlbiA+IHNlbGYtPm1heF9zZWdfc2l6ZSkgewoJCUlSREFfREVCVUcoMSwgIiVzKCksIFVEYXRhIGlzIHRvIGxhcmdlIGZvciBJckxBUCFcbiIsCgkJCSAgIF9fRlVOQ1RJT05fXyk7CgkJZ290byBlcnI7Cgl9CgoJaXJsbXBfdWRhdGFfcmVxdWVzdChzZWxmLT5sc2FwLCBza2IpOwoJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOwoKCXJldHVybiAwOwoKZXJyOgoJZGV2X2tmcmVlX3NrYihza2IpOwoJcmV0dXJuIC0xOwp9CkVYUE9SVF9TWU1CT0woaXJ0dHBfdWRhdGFfcmVxdWVzdCk7CgoKLyoKICogRnVuY3Rpb24gaXJ0dHBfZGF0YV9yZXF1ZXN0IChoYW5kbGUsIHNrYikKICoKICogICAgUXVldWUgZnJhbWUgZm9yIHRyYW5zbWlzc2lvbi4gSWYgU0FSIGlzIGVuYWJsZWQsIGZyYWdlbWVudCB0aGUgZnJhbWUKICogICAgYW5kIHF1ZXVlIHRoZSBmcmFnbWVudHMgZm9yIHRyYW5zbWlzc2lvbgogKi8KaW50IGlydHRwX2RhdGFfcmVxdWVzdChzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJX191OCAqZnJhbWU7CglpbnQgcmV0OwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJSVJEQV9ERUJVRygyLCAiJXMoKSA6IHF1ZXVlIGxlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sCgkJICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhfcXVldWUpKTsKCgkvKiBDaGVjayB0aGF0IG5vdGhpbmcgYmFkIGhhcHBlbnMgKi8KCWlmICgoc2tiLT5sZW4gPT0gMCkgfHwgKCFzZWxmLT5jb25uZWN0ZWQpKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogTm8gZGF0YSwgb3Igbm90IGNvbm5lY3RlZFxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXQgPSAtRU5PVENPTk47CgkJZ290byBlcnI7Cgl9CgoJLyoKCSAqICBDaGVjayBpZiBTQVIgaXMgZGlzYWJsZWQsIGFuZCB0aGUgZnJhbWUgaXMgbGFyZ2VyIHRoYW4gd2hhdCBmaXRzCgkgKiAgaW5zaWRlIGFuIElyTEFQIGZyYW1lCgkgKi8KCWlmICgoc2VsZi0+dHhfbWF4X3NkdV9zaXplID09IDApICYmIChza2ItPmxlbiA+IHNlbGYtPm1heF9zZWdfc2l6ZSkpIHsKCQlJUkRBX0VSUk9SKCIlczogU0FSIGRpc2FibGVkLCBhbmQgZGF0YSBpcyB0byBsYXJnZSBmb3IgSXJMQVAhXG4iLAoJCQkgICBfX0ZVTkNUSU9OX18pOwoJCXJldCA9IC1FTVNHU0laRTsKCQlnb3RvIGVycjsKCX0KCgkvKgoJICogIENoZWNrIGlmIFNBUiBpcyBlbmFibGVkLCBhbmQgdGhlIGZyYW1lIGlzIGxhcmdlciB0aGFuIHRoZQoJICogIFR4TWF4U2R1U2l6ZQoJICovCglpZiAoKHNlbGYtPnR4X21heF9zZHVfc2l6ZSAhPSAwKSAmJgoJICAgIChzZWxmLT50eF9tYXhfc2R1X3NpemUgIT0gVFRQX1NBUl9VTkJPVU5EKSAmJgoJICAgIChza2ItPmxlbiA+IHNlbGYtPnR4X21heF9zZHVfc2l6ZSkpCgl7CgkJSVJEQV9FUlJPUigiJXM6IFNBUiBlbmFibGVkLCBidXQgZGF0YSBpcyBsYXJnZXIgdGhhbiBUeE1heFNkdVNpemUhXG4iLAoJCQkgICBfX0ZVTkNUSU9OX18pOwoJCXJldCA9IC1FTVNHU0laRTsKCQlnb3RvIGVycjsKCX0KCS8qCgkgKiAgQ2hlY2sgaWYgdHJhbnNtaXQgcXVldWUgaXMgZnVsbAoJICovCglpZiAoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhfcXVldWUpID49IFRUUF9UWF9NQVhfUVVFVUUpIHsKCQkvKgoJCSAqICBHaXZlIGl0IGEgY2hhbmNlIHRvIGVtcHR5IGl0c2VsZgoJCSAqLwoJCWlydHRwX3J1bl90eF9xdWV1ZShzZWxmKTsKCgkJLyogRHJvcCBwYWNrZXQuIFRoaXMgZXJyb3IgY29kZSBzaG91bGQgdHJpZ2dlciB0aGUgY2FsbGVyCgkJICogdG8gcmVzZW5kIHRoZSBkYXRhIGluIHRoZSBjbGllbnQgY29kZSAtIEplYW4gSUkgKi8KCQlyZXQgPSAtRU5PQlVGUzsKCQlnb3RvIGVycjsKCX0KCgkvKiBRdWV1ZSBmcmFtZSwgb3IgcXVldWUgZnJhbWUgc2VnbWVudHMgKi8KCWlmICgoc2VsZi0+dHhfbWF4X3NkdV9zaXplID09IDApIHx8IChza2ItPmxlbiA8IHNlbGYtPm1heF9zZWdfc2l6ZSkpIHsKCQkvKiBRdWV1ZSBmcmFtZSAqLwoJCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbShza2IpID49IFRUUF9IRUFERVIsIHJldHVybiAtMTspOwoJCWZyYW1lID0gc2tiX3B1c2goc2tiLCBUVFBfSEVBREVSKTsKCQlmcmFtZVswXSA9IDB4MDA7IC8qIENsZWFyIG1vcmUgYml0ICovCgoJCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT50eF9xdWV1ZSwgc2tiKTsKCX0gZWxzZSB7CgkJLyoKCQkgKiAgRnJhZ21lbnQgdGhlIGZyYW1lLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyBxdWV1ZSB0aGUKCQkgKiAgZnJhZ21lbnRzLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBmYWN0IHRoZSB0cmFuc21pdAoJCSAqICBxdWV1ZSBtYXkgYmUgb3ZlcmZpbGxlZCBieSBhbGwgdGhlIHNlZ21lbnRzIGZvciBhIGxpdHRsZQoJCSAqICB3aGlsZQoJCSAqLwoJCWlydHRwX2ZyYWdtZW50X3NrYihzZWxmLCBza2IpOwoJfQoKCS8qIENoZWNrIGlmIHdlIGNhbiBhY2NlcHQgbW9yZSBkYXRhIGZyb20gY2xpZW50ICovCglpZiAoKCFzZWxmLT50eF9zZHVfYnVzeSkgJiYKCSAgICAoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhfcXVldWUpID4gVFRQX1RYX0hJR0hfVEhSRVNIT0xEKSkgewoJCS8qIFR4IHF1ZXVlIGZpbGxpbmcgdXAsIHNvIHN0b3AgY2xpZW50LiAqLwoJCWlmIChzZWxmLT5ub3RpZnkuZmxvd19pbmRpY2F0aW9uKSB7CgkJCXNlbGYtPm5vdGlmeS5mbG93X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLAoJCQkJCQkgICAgIHNlbGYsIEZMT1dfU1RPUCk7CgkJfQoJCS8qIHNlbGYtPnR4X3NkdV9idXN5IGlzIHRoZSBzdGF0ZSBvZiB0aGUgY2xpZW50LgoJCSAqIFVwZGF0ZSBzdGF0ZSBhZnRlciBub3RpZnlpbmcgY2xpZW50IHRvIGF2b2lkCgkJICogcmFjZSBjb25kaXRpb24gd2l0aCBpcnR0cF9mbG93X2luZGljYXRpb24oKS4KCQkgKiBJZiB0aGUgcXVldWUgZW1wdHkgaXRzZWxmIGFmdGVyIG91ciB0ZXN0IGJ1dCBiZWZvcmUKCQkgKiB3ZSBzZXQgdGhlIGZsYWcsIHdlIHdpbGwgZml4IG91cnNlbHZlcyBiZWxvdyBpbgoJCSAqIGlydHRwX3J1bl90eF9xdWV1ZSgpLgoJCSAqIEplYW4gSUkgKi8KCQlzZWxmLT50eF9zZHVfYnVzeSA9IFRSVUU7Cgl9CgoJLyogVHJ5IHRvIG1ha2Ugc29tZSBwcm9ncmVzcyAqLwoJaXJ0dHBfcnVuX3R4X3F1ZXVlKHNlbGYpOwoKCXJldHVybiAwOwoKZXJyOgoJZGV2X2tmcmVlX3NrYihza2IpOwoJcmV0dXJuIHJldDsKfQpFWFBPUlRfU1lNQk9MKGlydHRwX2RhdGFfcmVxdWVzdCk7CgovKgogKiBGdW5jdGlvbiBpcnR0cF9ydW5fdHhfcXVldWUgKHNlbGYpCiAqCiAqICAgIFRyYW5zbWl0IHBhY2tldHMgcXVldWVkIGZvciB0cmFuc21pc3Npb24gKGlmIHBvc3NpYmxlKQogKgogKi8Kc3RhdGljIHZvaWQgaXJ0dHBfcnVuX3R4X3F1ZXVlKHN0cnVjdCB0c2FwX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWludCBuOwoKCUlSREFfREVCVUcoMiwgIiVzKCkgOiBzZW5kX2NyZWRpdCA9ICVkLCBxdWV1ZV9sZW4gPSAlZFxuIiwKCQkgICBfX0ZVTkNUSU9OX18sCgkJICAgc2VsZi0+c2VuZF9jcmVkaXQsIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4X3F1ZXVlKSk7CgoJLyogR2V0IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIHR4IHF1ZXVlLCBvdGhlcndpc2UgZG9uJ3QgdG91Y2ggaXQgKi8KCWlmIChpcmRhX2xvY2soJnNlbGYtPnR4X3F1ZXVlX2xvY2spID09IEZBTFNFKQoJCXJldHVybjsKCgkvKiBUcnkgdG8gc2VuZCBvdXQgZnJhbWVzIGFzIGxvbmcgYXMgd2UgaGF2ZSBjcmVkaXRzCgkgKiBhbmQgYXMgbG9uZyBhcyBMQVAgaXMgbm90IGZ1bGwuIElmIExBUCBpcyBmdWxsLCBpdCB3aWxsCgkgKiBwb2xsIHVzIHRocm91Z2ggaXJ0dHBfZmxvd19pbmRpY2F0aW9uKCkgLSBKZWFuIElJICovCgl3aGlsZSAoKHNlbGYtPnNlbmRfY3JlZGl0ID4gMCkgJiYKCSAgICAgICAoIWlybG1wX2xhcF90eF9xdWV1ZV9mdWxsKHNlbGYtPmxzYXApKSAmJgoJICAgICAgIChza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+dHhfcXVldWUpKSkKCXsKCQkvKgoJCSAqICBTaW5jZSB3ZSBjYW4gdHJhbnNtaXQgYW5kIHJlY2VpdmUgZnJhbWVzIGNvbmN1cnJlbnRseSwKCQkgKiAgdGhlIGNvZGUgYmVsb3cgaXMgYSBjcml0aWNhbCByZWdpb24gYW5kIHdlIG11c3QgYXNzdXJlIHRoYXQKCQkgKiAgbm9ib2R5IG1lc3NlcyB3aXRoIHRoZSBjcmVkaXRzIHdoaWxlIHdlIHVwZGF0ZSB0aGVtLgoJCSAqLwoJCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CgoJCW4gPSBzZWxmLT5hdmFpbF9jcmVkaXQ7CgkJc2VsZi0+YXZhaWxfY3JlZGl0ID0gMDsKCgkJLyogT25seSByb29tIGZvciAxMjcgY3JlZGl0cyBpbiBmcmFtZSAqLwoJCWlmIChuID4gMTI3KSB7CgkJCXNlbGYtPmF2YWlsX2NyZWRpdCA9IG4tMTI3OwoJCQluID0gMTI3OwoJCX0KCQlzZWxmLT5yZW1vdGVfY3JlZGl0ICs9IG47CgkJc2VsZi0+c2VuZF9jcmVkaXQtLTsKCgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOwoKCQkvKgoJCSAqICBNb3JlIGJpdCBtdXN0IGJlIHNldCBieSB0aGUgZGF0YV9yZXF1ZXN0KCkgb3IgZnJhZ21lbnQoKQoJCSAqICBmdW5jdGlvbnMKCQkgKi8KCQlza2ItPmRhdGFbMF0gfD0gKG4gJiAweDdmKTsKCgkJLyogRGV0YWNoIGZyb20gc29ja2V0LgoJCSAqIFRoZSBjdXJyZW50IHNrYiBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIHNvY2tldCB0aGF0IHNlbnQKCQkgKiBpdCAoc2tiLT5zaykuIFdoZW4gd2UgcGFzcyBpdCB0byBJckxNUCwgdGhlIHNrYiB3aWxsIGJlCgkJICogc3RvcmVkIGluIGluIElyTEFQIChzZWxmLT53eF9saXN0KS4gV2hlbiB3ZSBhcmUgd2l0aGluCgkJICogSXJMQVAsIHdlIGxvc2UgdGhlIG5vdGlvbiBvZiBzb2NrZXQsIHNvIHdlIHNob3VsZCBub3QKCQkgKiBoYXZlIGEgcmVmZXJlbmNlIHRvIGEgc29ja2V0LiBTbywgd2UgZHJvcCBpdCBoZXJlLgoJCSAqCgkJICogV2h5IGRvZXMgaXQgbWF0dGVyID8KCQkgKiBXaGVuIHRoZSBza2IgaXMgZnJlZWQgKGtmcmVlX3NrYiksIGlmIGl0IGlzIGFzc29jaWF0ZWQKCQkgKiB3aXRoIGEgc29ja2V0LCBpdCByZWxlYXNlIGJ1ZmZlciBzcGFjZSBvbiB0aGUgc29ja2V0CgkJICogKHRocm91Z2ggc29ja193ZnJlZSgpIGFuZCBzb2NrX2RlZl93cml0ZV9zcGFjZSgpKS4KCQkgKiBJZiB0aGUgc29ja2V0IG5vIGxvbmdlciBleGlzdCwgd2UgbWF5IGNyYXNoLiBIYXJkLgoJCSAqIFdoZW4gd2UgY2xvc2UgYSBzb2NrZXQsIHdlIG1ha2Ugc3VyZSB0aGF0IGFzc29jaWF0ZWQgcGFja2V0cwoJCSAqIGluIElyVFRQIGFyZSBmcmVlZC4gSG93ZXZlciwgd2UgaGF2ZSBubyB3YXkgdG8gY2FuY2VsCgkJICogdGhlIHBhY2tldCB0aGF0IHdlIGhhdmUgcGFzc2VkIHRvIElyTEFQLiBTbywgaWYgYSBwYWNrZXQKCQkgKiByZW1haW5zIGluIElyTEFQIChyZXRyeSBvbiB0aGUgbGluayBvciBlbHNlKSBhZnRlciB3ZQoJCSAqIGNsb3NlIHRoZSBzb2NrZXQsIHdlIGFyZSBkZWFkICEKCQkgKiBKZWFuIElJICovCgkJaWYgKHNrYi0+c2sgIT0gTlVMTCkgewoJCQkvKiBJclNPQ0sgYXBwbGljYXRpb24sIElyT0JFWCwgLi4uICovCgkJCXNrYl9vcnBoYW4oc2tiKTsKCQl9CgkJCS8qIElyQ09NTSBvdmVyIElyVFRQLCBJckxBTiwgLi4uICovCgoJCS8qIFBhc3MgdGhlIHNrYiB0byBJckxNUCAtIGRvbmUgKi8KCQlpcmxtcF9kYXRhX3JlcXVlc3Qoc2VsZi0+bHNhcCwgc2tiKTsKCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7Cgl9CgoJLyogQ2hlY2sgaWYgd2UgY2FuIGFjY2VwdCBtb3JlIGZyYW1lcyBmcm9tIGNsaWVudC4KCSAqIFdlIGRvbid0IHdhbnQgdG8gd2FpdCB1bnRpbCB0aGUgdG9kbyB0aW1lciB0byBkbyB0aGF0LCBhbmQgd2UKCSAqIGNhbid0IHVzZSB0YXNrbGV0cyAoZ3JyLi4uKSwgc28gd2UgYXJlIG9ibGlnZWQgdG8gZ2l2ZSBjb250cm9sCgkgKiB0byBjbGllbnQuIFRoYXQncyBvaywgdGhpcyB0ZXN0IHdpbGwgYmUgdHJ1ZSBub3QgdG9vIG9mdGVuCgkgKiAobWF4IG9uY2UgcGVyIExBUCB3aW5kb3cpIGFuZCB3ZSBhcmUgY2FsbGVkIGZyb20gcGxhY2VzCgkgKiB3aGVyZSB3ZSBjYW4gc3BlbmQgYSBiaXQgb2YgdGltZSBkb2luZyBzdHVmZi4gLSBKZWFuIElJICovCglpZiAoKHNlbGYtPnR4X3NkdV9idXN5KSAmJgoJICAgIChza2JfcXVldWVfbGVuKCZzZWxmLT50eF9xdWV1ZSkgPCBUVFBfVFhfTE9XX1RIUkVTSE9MRCkgJiYKCSAgICAoIXNlbGYtPmNsb3NlX3BlbmQpKQoJewoJCWlmIChzZWxmLT5ub3RpZnkuZmxvd19pbmRpY2F0aW9uKQoJCQlzZWxmLT5ub3RpZnkuZmxvd19pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwKCQkJCQkJICAgICBzZWxmLCBGTE9XX1NUQVJUKTsKCgkJLyogc2VsZi0+dHhfc2R1X2J1c3kgaXMgdGhlIHN0YXRlIG9mIHRoZSBjbGllbnQuCgkJICogV2UgZG9uJ3QgcmVhbGx5IGhhdmUgYSByYWNlIGhlcmUsIGJ1dCBpdCdzIGFsd2F5cyBzYWZlcgoJCSAqIHRvIHVwZGF0ZSBvdXIgc3RhdGUgYWZ0ZXIgdGhlIGNsaWVudCAtIEplYW4gSUkgKi8KCQlzZWxmLT50eF9zZHVfYnVzeSA9IEZBTFNFOwoJfQoKCS8qIFJlc2V0IGxvY2sgKi8KCXNlbGYtPnR4X3F1ZXVlX2xvY2sgPSAwOwp9CgovKgogKiBGdW5jdGlvbiBpcnR0cF9naXZlX2NyZWRpdCAoc2VsZikKICoKICogICAgU2VuZCBhIGRhdGFsZXNzIGZsb3dkYXRhIFRUUC1QRFUgYW5kIGdpdmUgYXZhaWxhYmxlIGNyZWRpdCB0byBwZWVyCiAqICAgIFRTQVAKICovCnN0YXRpYyBpbmxpbmUgdm9pZCBpcnR0cF9naXZlX2NyZWRpdChzdHJ1Y3QgdHNhcF9jYiAqc2VsZikKewoJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYiA9IE5VTEw7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJaW50IG47CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKCglJUkRBX0RFQlVHKDQsICIlcygpIHNlbmQ9JWQsYXZhaWw9JWQscmVtb3RlPSVkXG4iLAoJCSAgIF9fRlVOQ1RJT05fXywKCQkgICBzZWxmLT5zZW5kX2NyZWRpdCwgc2VsZi0+YXZhaWxfY3JlZGl0LCBzZWxmLT5yZW1vdGVfY3JlZGl0KTsKCgkvKiBHaXZlIGNyZWRpdCB0byBwZWVyICovCgl0eF9za2IgPSBhbGxvY19za2IoVFRQX01BWF9IRUFERVIsIEdGUF9BVE9NSUMpOwoJaWYgKCF0eF9za2IpCgkJcmV0dXJuOwoKCS8qIFJlc2VydmUgc3BhY2UgZm9yIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHR4X3NrYiwgTE1QX01BWF9IRUFERVIpOwoKCS8qCgkgKiAgU2luY2Ugd2UgY2FuIHRyYW5zbWl0IGFuZCByZWNlaXZlIGZyYW1lcyBjb25jdXJyZW50bHksCgkgKiAgdGhlIGNvZGUgYmVsb3cgaXMgYSBjcml0aWNhbCByZWdpb24gYW5kIHdlIG11c3QgYXNzdXJlIHRoYXQKCSAqICBub2JvZHkgbWVzc2VzIHdpdGggdGhlIGNyZWRpdHMgd2hpbGUgd2UgdXBkYXRlIHRoZW0uCgkgKi8KCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CgoJbiA9IHNlbGYtPmF2YWlsX2NyZWRpdDsKCXNlbGYtPmF2YWlsX2NyZWRpdCA9IDA7CgoJLyogT25seSBzcGFjZSBmb3IgMTI3IGNyZWRpdHMgaW4gZnJhbWUgKi8KCWlmIChuID4gMTI3KSB7CgkJc2VsZi0+YXZhaWxfY3JlZGl0ID0gbiAtIDEyNzsKCQluID0gMTI3OwoJfQoJc2VsZi0+cmVtb3RlX2NyZWRpdCArPSBuOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKCglza2JfcHV0KHR4X3NrYiwgMSk7Cgl0eF9za2ItPmRhdGFbMF0gPSAoX191OCkgKG4gJiAweDdmKTsKCglpcmxtcF9kYXRhX3JlcXVlc3Qoc2VsZi0+bHNhcCwgdHhfc2tiKTsKCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKfQoKLyoKICogRnVuY3Rpb24gaXJ0dHBfdWRhdGFfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgc2tiKQogKgogKiAgICBSZWNlaXZlZCBzb21lIHVuaXQtZGF0YSAodW5yZWxpYWJsZSkKICoKICovCnN0YXRpYyBpbnQgaXJ0dHBfdWRhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgdHNhcF9jYiAqc2VsZjsKCWludCBlcnI7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOwoKCS8qIEp1c3QgcGFzcyBkYXRhIHRvIGxheWVyIGFib3ZlICovCglpZiAoc2VsZi0+bm90aWZ5LnVkYXRhX2luZGljYXRpb24pIHsKCQllcnIgPSBzZWxmLT5ub3RpZnkudWRhdGFfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsCgkJCQkJCSAgICBzZWxmLHNrYik7CgkJLyogU2FtZSBjb21tZW50IGFzIGluIGlydHRwX2RvX2RhdGFfaW5kaWNhdGlvbigpICovCgkJaWYgKCFlcnIpCgkJCXJldHVybiAwOwoJfQoJLyogRWl0aGVyIG5vIGhhbmRsZXIsIG9yIGhhbmRsZXIgcmV0dXJucyBhbiBlcnJvciAqLwoJZGV2X2tmcmVlX3NrYihza2IpOwoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcnR0cF9kYXRhX2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHNrYikKICoKICogICAgUmVjZWl2ZSBzZWdtZW50IGZyb20gSXJMTVAuCiAqCiAqLwpzdGF0aWMgaW50IGlydHRwX2RhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCB0c2FwX2NiICpzZWxmOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWludCBuOwoKCXNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaW5zdGFuY2U7CgoJbiA9IHNrYi0+ZGF0YVswXSAmIDB4N2Y7ICAgICAvKiBFeHRyYWN0IHRoZSBjcmVkaXRzICovCgoJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOwoKCS8qICBEZWFsIHdpdGggaW5ib3VuZCBjcmVkaXQKCSAqICBTaW5jZSB3ZSBjYW4gdHJhbnNtaXQgYW5kIHJlY2VpdmUgZnJhbWVzIGNvbmN1cnJlbnRseSwKCSAqICB0aGUgY29kZSBiZWxvdyBpcyBhIGNyaXRpY2FsIHJlZ2lvbiBhbmQgd2UgbXVzdCBhc3N1cmUgdGhhdAoJICogIG5vYm9keSBtZXNzZXMgd2l0aCB0aGUgY3JlZGl0cyB3aGlsZSB3ZSB1cGRhdGUgdGhlbS4KCSAqLwoJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKCXNlbGYtPnNlbmRfY3JlZGl0ICs9IG47CglpZiAoc2tiLT5sZW4gPiAxKQoJCXNlbGYtPnJlbW90ZV9jcmVkaXQtLTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKCgkvKgoJICogIERhdGEgb3IgZGF0YWxlc3MgcGFja2V0PyBEYXRhbGVzcyBmcmFtZXMgY29udGFpbnMgb25seSB0aGUKCSAqICBUVFBfSEVBREVSLgoJICovCglpZiAoc2tiLT5sZW4gPiAxKSB7CgkJLyoKCQkgKiAgV2UgZG9uJ3QgcmVtb3ZlIHRoZSBUVFAgaGVhZGVyLCBzaW5jZSB3ZSBtdXN0IHByZXNlcnZlIHRoZQoJCSAqICBtb3JlIGJpdCwgc28gdGhlIGRlZnJhZ21lbnQgcm91dGluZyBrbm93cyB3aGF0IHRvIGRvCgkJICovCgkJc2tiX3F1ZXVlX3RhaWwoJnNlbGYtPnJ4X3F1ZXVlLCBza2IpOwoJfSBlbHNlIHsKCQkvKiBEYXRhbGVzcyBmbG93ZGF0YSBUVFAtUERVICovCgkJZGV2X2tmcmVlX3NrYihza2IpOwoJfQoKCgkvKiBQdXNoIGRhdGEgdG8gdGhlIGhpZ2hlciBsYXllci4KCSAqIFdlIGRvIGl0IHN5bmNocm9ub3VzbHkgYmVjYXVzZSBydW5uaW5nIHRoZSB0b2RvIHRpbWVyIGZvciBlYWNoCgkgKiByZWNlaXZlIHBhY2tldCB3b3VsZCBiZSB0b28gbXVjaCBvdmVyaGVhZCBhbmQgbGF0ZW5jeS4KCSAqIEJ5IHBhc3NpbmcgY29udHJvbCB0byB0aGUgaGlnaGVyIGxheWVyLCB3ZSBydW4gdGhlIHJpc2sgdGhhdAoJICogaXQgbWF5IHRha2UgdGltZSBvciBncmFiIGEgbG9jay4gTW9zdCBvZnRlbiwgdGhlIGhpZ2hlciBsYXllcgoJICogd2lsbCBvbmx5IHB1dCBwYWNrZXQgaW4gYSBxdWV1ZS4KCSAqIEFueXdheSwgcGFja2V0cyBhcmUgb25seSBkcmlwcGluZyB0aHJvdWdoIHRoZSBJckRBLCBzbyB3ZSBjYW4KCSAqIGhhdmUgdGltZSBiZWZvcmUgdGhlIG5leHQgcGFja2V0LgoJICogRnVydGhlciwgd2UgYXJlIHJ1biBmcm9tIE5FVF9CSCwgc28gdGhlIHdvcnNlIHRoYXQgY2FuIGhhcHBlbiBpcwoJICogdXMgbWlzc2luZyB0aGUgb3B0aW1hbCB0aW1lIHRvIHNlbmQgYmFjayB0aGUgUEYgYml0IGluIExBUC4KCSAqIEplYW4gSUkgKi8KCWlydHRwX3J1bl9yeF9xdWV1ZShzZWxmKTsKCgkvKiBXZSBub3cgZ2l2ZSBjcmVkaXRzIHRvIHBlZXIgaW4gaXJ0dHBfcnVuX3J4X3F1ZXVlKCkuCgkgKiBXZSBuZWVkIHRvIHNlbmQgY3JlZGl0ICpOT1cqLCBvdGhlcndpc2Ugd2UgYXJlIGdvaW5nCgkgKiB0byBtaXNzIHRoZSBuZXh0IFR4IHdpbmRvdy4gVGhlIHRvZG8gdGltZXIgbWF5IHRha2UKCSAqIGEgd2hpbGUgYmVmb3JlIGl0J3MgcnVuLi4uIC0gSmVhbiBJSSAqLwoKCS8qCgkgKiBJZiB0aGUgcGVlciBkZXZpY2UgaGFzIGdpdmVuIHVzIHNvbWUgY3JlZGl0cyBhbmQgd2UgZGlkbid0IGhhdmUKCSAqIGFueW9uZSBmcm9tIGJlZm9yZSwgdGhlbiB3ZSBuZWVkIHRvIHNoZWR1bGUgdGhlIHR4IHF1ZXVlLgoJICogV2UgbmVlZCB0byBkbyB0aGF0IGJlY2F1c2Ugb3VyIFR4IGhhdmUgc3RvcHBlZCAoc28gd2UgbWF5IG5vdAoJICogZ2V0IGFueSBMQVAgZmxvdyBpbmRpY2F0aW9uKSBhbmQgdGhlIHVzZXIgbWF5IGJlIHN0b3BwZWQgYXMKCSAqIHdlbGwuIC0gSmVhbiBJSQoJICovCglpZiAoc2VsZi0+c2VuZF9jcmVkaXQgPT0gbikgewoJCS8qIFJlc3RhcnQgcHVzaGluZyBzdHVmZiB0byBMQVAgKi8KCQlpcnR0cF9ydW5fdHhfcXVldWUoc2VsZik7CgkJLyogTm90ZSA6IHdlIGRvbid0IHdhbnQgdG8gc2NoZWR1bGUgdGhlIHRvZG8gdGltZXIKCQkgKiBiZWNhdXNlIGl0IGhhcyBob3JyaWJsZSBsYXRlbmN5LiBObyB0YXNrbGV0cwoJCSAqIGJlY2F1c2UgdGhlIHRhc2tsZXQgQVBJIGlzIGJyb2tlbi4gLSBKZWFuIElJICovCgl9CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX3N0YXR1c19pbmRpY2F0aW9uIChzZWxmLCByZWFzb24pCiAqCiAqICAgIFN0YXR1c19pbmRpY2F0aW9uLCBqdXN0IHBhc3MgdG8gdGhlIGhpZ2hlciBsYXllci4uLgogKgogKi8Kc3RhdGljIHZvaWQgaXJ0dHBfc3RhdHVzX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsCgkJCQkgICAgTElOS19TVEFUVVMgbGluaywgTE9DS19TVEFUVVMgbG9jaykKewoJc3RydWN0IHRzYXBfY2IgKnNlbGY7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CgoJLyogQ2hlY2sgaWYgY2xpZW50IGhhcyBhbHJlYWR5IGNsb3NlZCB0aGUgVFNBUCBhbmQgZ29uZSBhd2F5ICovCglpZiAoc2VsZi0+Y2xvc2VfcGVuZCkKCQlyZXR1cm47CgoJLyoKCSAqICBJbmZvcm0gc2VydmljZSB1c2VyIGlmIGhlIGhhcyByZXF1ZXN0ZWQgaXQKCSAqLwoJaWYgKHNlbGYtPm5vdGlmeS5zdGF0dXNfaW5kaWNhdGlvbiAhPSBOVUxMKQoJCXNlbGYtPm5vdGlmeS5zdGF0dXNfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsCgkJCQkJICAgICAgIGxpbmssIGxvY2spOwoJZWxzZQoJCUlSREFfREVCVUcoMiwgIiVzKCksIG5vIGhhbmRsZXJcbiIsIF9fRlVOQ1RJT05fXyk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2Zsb3dfaW5kaWNhdGlvbiAoc2VsZiwgcmVhc29uKQogKgogKiAgICBGbG93X2luZGljYXRpb24gOiBJckxBUCB0ZWxscyB1cyB0byBzZW5kIG1vcmUgZGF0YS4KICoKICovCnN0YXRpYyB2b2lkIGlydHRwX2Zsb3dfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCBMT0NBTF9GTE9XIGZsb3cpCnsKCXN0cnVjdCB0c2FwX2NiICpzZWxmOwoKCXNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaW5zdGFuY2U7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKCglJUkRBX0RFQlVHKDQsICIlcyhpbnN0YW5jZT0lcClcbiIsIF9fRlVOQ1RJT05fXywgc2VsZik7CgoJLyogV2UgYXJlICJwb2xsZWQiIGRpcmVjdGx5IGZyb20gTEFQLCBhbmQgdGhlIExBUCB3YW50IHRvIGZpbGwKCSAqIGl0cyBUeCB3aW5kb3cuIFdlIHdhbnQgdG8gZG8gb3VyIGJlc3QgdG8gc2VuZCBpdCBkYXRhLCBzbyB0aGF0CgkgKiB3ZSBtYXhpbWlzZSB0aGUgd2luZG93LiBPbiB0aGUgb3RoZXIgaGFuZCwgd2Ugd2FudCB0byBsaW1pdCB0aGUKCSAqIGFtb3VudCBvZiB3b3JrIGhlcmUgc28gdGhhdCBMQVAgZG9lc24ndCBoYW5nIGZvcmV2ZXIgd2FpdGluZwoJICogZm9yIHBhY2tldHMuIC0gSmVhbiBJSSAqLwoKCS8qIFRyeSB0byBzZW5kIHNvbWUgcGFja2V0cy4gQ3VycmVudGx5LCBMQVAgY2FsbHMgdXMgZXZlcnkgdGltZQoJICogdGhlcmUgaXMgb25lIGZyZWUgc2xvdCwgc28gd2Ugd2lsbCBzZW5kIG9ubHkgb25lIHBhY2tldC4KCSAqIFRoaXMgYWxsb3cgdGhlIHNjaGVkdWxlciB0byBkbyBpdHMgcm91bmQgcm9iaW4gLSBKZWFuIElJICovCglpcnR0cF9ydW5fdHhfcXVldWUoc2VsZik7CgoJLyogTm90ZSByZWdhcmRpbmcgdGhlIGludGVycmFjdGlvbiB3aXRoIGhpZ2hlciBsYXllci4KCSAqIGlydHRwX3J1bl90eF9xdWV1ZSgpIG1heSBjYWxsIHRoZSBjbGllbnQgd2hlbiBpdHMgcXVldWUKCSAqIHN0YXJ0IHRvIGVtcHR5LCB2aWEgbm90aWZ5LmZsb3dfaW5kaWNhdGlvbigpLiBJbml0aWFsbHkuCgkgKiBJIHdhbnRlZCB0aGlzIHRvIGhhcHBlbiBpbiBhIHRhc2tsZXQsIHRvIGF2b2lkIGNsaWVudAoJICogZ3JhYmJpbmcgdGhlIENQVSwgYnV0IHdlIGNhbid0IHVzZSB0YXNrbGV0cyBzYWZlbHkuIEFuZCB0aW1lcgoJICogaXMgZGVmaW5pdGVseSB0b28gc2xvdy4KCSAqIFRoaXMgd2lsbCBoYXBwZW4gb25seSBvbmNlIHBlciBMQVAgd2luZG93LCBhbmQgdXN1YWxseSBhdAoJICogdGhlIHRoaXJkIHBhY2tldCAodW5sZXNzIHdpbmRvdyBpcyBzbWFsbGVyKS4gTEFQIGlzIHN0aWxsCgkgKiBkb2luZyBtdHQgYW5kIHNlbmRpbmcgZmlyc3QgcGFja2V0IHNvIGl0J3Mgc29ydCBvZiBPSwoJICogdG8gZG8gdGhhdC4gSmVhbiBJSSAqLwoKCS8qIElmIHdlIG5lZWQgdG8gc2VuZCBkaXNjb25uZWN0LiB0cnkgdG8gZG8gaXQgbm93ICovCglpZihzZWxmLT5kaXNjb25uZWN0X3BlbmQpCgkJaXJ0dHBfc3RhcnRfdG9kb190aW1lcihzZWxmLCAwKTsKfQoKLyoKICogRnVuY3Rpb24gaXJ0dHBfZmxvd19yZXF1ZXN0IChzZWxmLCBjb21tYW5kKQogKgogKiAgICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIHVzZWQgYnkgdGhlIHVwcGVyIGxheWVycyB0byB0ZWxsIElyVFRQIHRvIHN0b3AKICogICAgZGVsaXZlcmluZyBmcmFtZXMgaWYgdGhlIHJlY2VpdmUgcXVldWVzIGFyZSBzdGFydGluZyB0byBnZXQgZnVsbCwgb3IKICogICAgdG8gdGVsbCBJclRUUCB0byBzdGFydCBkZWxpdmVyaW5nIGZyYW1lcyBhZ2Fpbi4KICovCnZvaWQgaXJ0dHBfZmxvd19yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBMT0NBTF9GTE9XIGZsb3cpCnsKCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKCglzd2l0Y2ggKGZsb3cpIHsKCWNhc2UgRkxPV19TVE9QOgoJCUlSREFfREVCVUcoMSwgIiVzKCksIGZsb3cgc3RvcFxuIiwgX19GVU5DVElPTl9fKTsKCQlzZWxmLT5yeF9zZHVfYnVzeSA9IFRSVUU7CgkJYnJlYWs7CgljYXNlIEZMT1dfU1RBUlQ6CgkJSVJEQV9ERUJVRygxLCAiJXMoKSwgZmxvdyBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCQlzZWxmLT5yeF9zZHVfYnVzeSA9IEZBTFNFOwoKCQkvKiBDbGllbnQgc2F5IGhlIGNhbiBhY2NlcHQgbW9yZSBkYXRhLCB0cnkgdG8gZnJlZSBvdXIKCQkgKiBxdWV1ZXMgQVNBUCAtIEplYW4gSUkgKi8KCQlpcnR0cF9ydW5fcnhfcXVldWUoc2VsZik7CgoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIGZsb3cgY29tbWFuZCFcbiIsIF9fRlVOQ1RJT05fXyk7Cgl9Cn0KRVhQT1JUX1NZTUJPTChpcnR0cF9mbG93X3JlcXVlc3QpOwoKLyoKICogRnVuY3Rpb24gaXJ0dHBfY29ubmVjdF9yZXF1ZXN0IChzZWxmLCBkdHNhcF9zZWwsIGRhZGRyLCBxb3MpCiAqCiAqICAgIFRyeSB0byBjb25uZWN0IHRvIHJlbW90ZSBkZXN0aW5hdGlvbiBUU0FQIHNlbGVjdG9yCiAqCiAqLwppbnQgaXJ0dHBfY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBfX3U4IGR0c2FwX3NlbCwKCQkJICBfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsCgkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZHVfc2l6ZSwKCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpCnsKCXN0cnVjdCBza19idWZmICp0eF9za2I7CglfX3U4ICpmcmFtZTsKCV9fdTggbjsKCglJUkRBX0RFQlVHKDQsICIlcygpLCBtYXhfc2R1X3NpemU9JWRcbiIsIF9fRlVOQ1RJT05fXywgbWF4X3NkdV9zaXplKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtRUJBRFI7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm4gLUVCQURSOyk7CgoJaWYgKHNlbGYtPmNvbm5lY3RlZCkgewoJCWlmKHVzZXJkYXRhKQoJCQlkZXZfa2ZyZWVfc2tiKHVzZXJkYXRhKTsKCQlyZXR1cm4gLUVJU0NPTk47Cgl9CgoJLyogQW55IHVzZXJkYXRhIHN1cHBsaWVkPyAqLwoJaWYgKHVzZXJkYXRhID09IE5VTEwpIHsKCQl0eF9za2IgPSBhbGxvY19za2IoVFRQX01BWF9IRUFERVIgKyBUVFBfU0FSX0hFQURFUiwKCQkJCSAgIEdGUF9BVE9NSUMpOwoJCWlmICghdHhfc2tiKQoJCQlyZXR1cm4gLUVOT01FTTsKCgkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYX0NPTlRST0wgYW5kIExBUCBoZWFkZXIgKi8KCQlza2JfcmVzZXJ2ZSh0eF9za2IsIFRUUF9NQVhfSEVBREVSICsgVFRQX1NBUl9IRUFERVIpOwoJfSBlbHNlIHsKCQl0eF9za2IgPSB1c2VyZGF0YTsKCQkvKgoJCSAqICBDaGVjayB0aGF0IHRoZSBjbGllbnQgaGFzIHJlc2VydmVkIGVub3VnaCBzcGFjZSBmb3IKCQkgKiAgaGVhZGVycwoJCSAqLwoJCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbSh1c2VyZGF0YSkgPj0gVFRQX01BWF9IRUFERVIsCgkJCXsgZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7IHJldHVybiAtMTsgfSApOwoJfQoKCS8qIEluaXRpYWxpemUgY29ubmVjdGlvbiBwYXJhbWV0ZXJzICovCglzZWxmLT5jb25uZWN0ZWQgPSBGQUxTRTsKCXNlbGYtPmF2YWlsX2NyZWRpdCA9IDA7CglzZWxmLT5yeF9tYXhfc2R1X3NpemUgPSBtYXhfc2R1X3NpemU7CglzZWxmLT5yeF9zZHVfc2l6ZSA9IDA7CglzZWxmLT5yeF9zZHVfYnVzeSA9IEZBTFNFOwoJc2VsZi0+ZHRzYXBfc2VsID0gZHRzYXBfc2VsOwoKCW4gPSBzZWxmLT5pbml0aWFsX2NyZWRpdDsKCglzZWxmLT5yZW1vdGVfY3JlZGl0ID0gMDsKCXNlbGYtPnNlbmRfY3JlZGl0ID0gMDsKCgkvKgoJICogIEdpdmUgYXdheSBtYXggMTI3IGNyZWRpdHMgZm9yIG5vdwoJICovCglpZiAobiA+IDEyNykgewoJCXNlbGYtPmF2YWlsX2NyZWRpdD1uLTEyNzsKCQluID0gMTI3OwoJfQoKCXNlbGYtPnJlbW90ZV9jcmVkaXQgPSBuOwoKCS8qIFNBUiBlbmFibGVkPyAqLwoJaWYgKG1heF9zZHVfc2l6ZSA+IDApIHsKCQlJUkRBX0FTU0VSVChza2JfaGVhZHJvb20odHhfc2tiKSA+PSAoVFRQX01BWF9IRUFERVIgKyBUVFBfU0FSX0hFQURFUiksCgkJCXsgZGV2X2tmcmVlX3NrYih0eF9za2IpOyByZXR1cm4gLTE7IH0gKTsKCgkJLyogSW5zZXJ0IFNBUiBwYXJhbWV0ZXJzICovCgkJZnJhbWUgPSBza2JfcHVzaCh0eF9za2IsIFRUUF9IRUFERVIrVFRQX1NBUl9IRUFERVIpOwoKCQlmcmFtZVswXSA9IFRUUF9QQVJBTUVURVJTIHwgbjsKCQlmcmFtZVsxXSA9IDB4MDQ7IC8qIExlbmd0aCAqLwoJCWZyYW1lWzJdID0gMHgwMTsgLyogTWF4U2R1U2l6ZSAqLwoJCWZyYW1lWzNdID0gMHgwMjsgLyogVmFsdWUgbGVuZ3RoICovCgoJCXB1dF91bmFsaWduZWQoY3B1X3RvX2JlMTYoKF9fdTE2KSBtYXhfc2R1X3NpemUpLAoJCQkgICAgICAoX19iZTE2ICopKGZyYW1lKzQpKTsKCX0gZWxzZSB7CgkJLyogSW5zZXJ0IHBsYWluIFRUUCBoZWFkZXIgKi8KCQlmcmFtZSA9IHNrYl9wdXNoKHR4X3NrYiwgVFRQX0hFQURFUik7CgoJCS8qIEluc2VydCBpbml0aWFsIGNyZWRpdCBpbiBmcmFtZSAqLwoJCWZyYW1lWzBdID0gbiAmIDB4N2Y7Cgl9CgoJLyogQ29ubmVjdCB3aXRoIElyTE1QLiBObyBRb1MgcGFyYW1ldGVycyBmb3Igbm93ICovCglyZXR1cm4gaXJsbXBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmxzYXAsIGR0c2FwX3NlbCwgc2FkZHIsIGRhZGRyLCBxb3MsCgkJCQkgICAgIHR4X3NrYik7Cn0KRVhQT1JUX1NZTUJPTChpcnR0cF9jb25uZWN0X3JlcXVlc3QpOwoKLyoKICogRnVuY3Rpb24gaXJ0dHBfY29ubmVjdF9jb25maXJtIChoYW5kbGUsIHFvcywgc2tiKQogKgogKiAgICBTZXZpY2UgdXNlciBjb25maXJtcyBUU0FQIGNvbm5lY3Rpb24gd2l0aCBwZWVyLgogKgogKi8Kc3RhdGljIHZvaWQgaXJ0dHBfY29ubmVjdF9jb25maXJtKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCBfX3UzMiBtYXhfc2VnX3NpemUsCgkJCQkgIF9fdTggbWF4X2hlYWRlcl9zaXplLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgdHNhcF9jYiAqc2VsZjsKCWludCBwYXJhbWV0ZXJzOwoJaW50IHJldDsKCV9fdTggcGxlbjsKCV9fdTggbjsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaW5zdGFuY2U7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKCglzZWxmLT5tYXhfc2VnX3NpemUgPSBtYXhfc2VnX3NpemUgLSBUVFBfSEVBREVSOwoJc2VsZi0+bWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplICsgVFRQX0hFQURFUjsKCgkvKgoJICogIENoZWNrIGlmIHdlIGhhdmUgZ290IHNvbWUgUW9TIHBhcmFtZXRlcnMgYmFjayEgVGhpcyBzaG91bGQgYmUgdGhlCgkgKiAgbmVnb3RpYXRlZCBRb1MgZm9yIHRoZSBsaW5rLgoJICovCglpZiAocW9zKSB7CgkJSVJEQV9ERUJVRyg0LCAiSXJUVFAsIE5lZ290aWF0ZWQgQkFVRF9SQVRFOiAlMDJ4XG4iLAoJCSAgICAgICBxb3MtPmJhdWRfcmF0ZS5iaXRzKTsKCQlJUkRBX0RFQlVHKDQsICJJclRUUCwgTmVnb3RpYXRlZCBCQVVEX1JBVEU6ICVkIGJwcy5cbiIsCgkJICAgICAgIHFvcy0+YmF1ZF9yYXRlLnZhbHVlKTsKCX0KCgluID0gc2tiLT5kYXRhWzBdICYgMHg3ZjsKCglJUkRBX0RFQlVHKDQsICIlcygpLCBJbml0aWFsIHNlbmRfY3JlZGl0PSVkXG4iLCBfX0ZVTkNUSU9OX18sIG4pOwoKCXNlbGYtPnNlbmRfY3JlZGl0ID0gbjsKCXNlbGYtPnR4X21heF9zZHVfc2l6ZSA9IDA7CglzZWxmLT5jb25uZWN0ZWQgPSBUUlVFOwoKCXBhcmFtZXRlcnMgPSBza2ItPmRhdGFbMF0gJiAweDgwOwoKCUlSREFfQVNTRVJUKHNrYi0+bGVuID49IFRUUF9IRUFERVIsIHJldHVybjspOwoJc2tiX3B1bGwoc2tiLCBUVFBfSEVBREVSKTsKCglpZiAocGFyYW1ldGVycykgewoJCXBsZW4gPSBza2ItPmRhdGFbMF07CgoJCXJldCA9IGlyZGFfcGFyYW1fZXh0cmFjdF9hbGwoc2VsZiwgc2tiLT5kYXRhKzEsCgkJCQkJICAgICBJUkRBX01JTihza2ItPmxlbi0xLCBwbGVuKSwKCQkJCQkgICAgICZwYXJhbV9pbmZvKTsKCgkJLyogQW55IGVycm9ycyBpbiB0aGUgcGFyYW1ldGVyIGxpc3Q/ICovCgkJaWYgKHJldCA8IDApIHsKCQkJSVJEQV9XQVJOSU5HKCIlczogZXJyb3IgZXh0cmFjdGluZyBwYXJhbWV0ZXJzXG4iLAoJCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgoJCQkvKiBEbyBub3QgYWNjZXB0IHRoaXMgY29ubmVjdGlvbiBhdHRlbXB0ICovCgkJCXJldHVybjsKCQl9CgkJLyogUmVtb3ZlIHBhcmFtZXRlcnMgKi8KCQlza2JfcHVsbChza2IsIElSREFfTUlOKHNrYi0+bGVuLCBwbGVuKzEpKTsKCX0KCglJUkRBX0RFQlVHKDQsICIlcygpIHNlbmQ9JWQsYXZhaWw9JWQscmVtb3RlPSVkXG4iLCBfX0ZVTkNUSU9OX18sCgkgICAgICBzZWxmLT5zZW5kX2NyZWRpdCwgc2VsZi0+YXZhaWxfY3JlZGl0LCBzZWxmLT5yZW1vdGVfY3JlZGl0KTsKCglJUkRBX0RFQlVHKDIsICIlcygpLCBNYXhTZHVTaXplPSVkXG4iLCBfX0ZVTkNUSU9OX18sCgkJICAgc2VsZi0+dHhfbWF4X3NkdV9zaXplKTsKCglpZiAoc2VsZi0+bm90aWZ5LmNvbm5lY3RfY29uZmlybSkgewoJCXNlbGYtPm5vdGlmeS5jb25uZWN0X2NvbmZpcm0oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBzZWxmLCBxb3MsCgkJCQkJICAgICBzZWxmLT50eF9tYXhfc2R1X3NpemUsCgkJCQkJICAgICBzZWxmLT5tYXhfaGVhZGVyX3NpemUsIHNrYik7Cgl9IGVsc2UKCQlkZXZfa2ZyZWVfc2tiKHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2Nvbm5lY3RfaW5kaWNhdGlvbiAoaGFuZGxlLCBza2IpCiAqCiAqICAgIFNvbWUgb3RoZXIgZGV2aWNlIGlzIGNvbm5lY3RpbmcgdG8gdGhpcyBUU0FQCiAqCiAqLwp2b2lkIGlydHRwX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKCQkJICAgICAgX191MzIgbWF4X3NlZ19zaXplLCBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IHRzYXBfY2IgKnNlbGY7CglzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKCWludCBwYXJhbWV0ZXJzOwoJaW50IHJldDsKCV9fdTggcGxlbjsKCV9fdTggbjsKCglzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CgoJbHNhcCA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBzYXA7CgoJc2VsZi0+bWF4X3NlZ19zaXplID0gbWF4X3NlZ19zaXplIC0gVFRQX0hFQURFUjsKCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZStUVFBfSEVBREVSOwoKCUlSREFfREVCVUcoNCwgIiVzKCksIFRTQVAgc2VsPSUwMnhcbiIsIF9fRlVOQ1RJT05fXywgc2VsZi0+c3RzYXBfc2VsKTsKCgkvKiBOZWVkIHRvIHVwZGF0ZSBkdHNhcF9zZWwgaWYgaXRzIGVxdWFsIHRvIExTQVBfQU5ZICovCglzZWxmLT5kdHNhcF9zZWwgPSBsc2FwLT5kbHNhcF9zZWw7CgoJbiA9IHNrYi0+ZGF0YVswXSAmIDB4N2Y7CgoJc2VsZi0+c2VuZF9jcmVkaXQgPSBuOwoJc2VsZi0+dHhfbWF4X3NkdV9zaXplID0gMDsKCglwYXJhbWV0ZXJzID0gc2tiLT5kYXRhWzBdICYgMHg4MDsKCglJUkRBX0FTU0VSVChza2ItPmxlbiA+PSBUVFBfSEVBREVSLCByZXR1cm47KTsKCXNrYl9wdWxsKHNrYiwgVFRQX0hFQURFUik7CgoJaWYgKHBhcmFtZXRlcnMpIHsKCQlwbGVuID0gc2tiLT5kYXRhWzBdOwoKCQlyZXQgPSBpcmRhX3BhcmFtX2V4dHJhY3RfYWxsKHNlbGYsIHNrYi0+ZGF0YSsxLAoJCQkJCSAgICAgSVJEQV9NSU4oc2tiLT5sZW4tMSwgcGxlbiksCgkJCQkJICAgICAmcGFyYW1faW5mbyk7CgoJCS8qIEFueSBlcnJvcnMgaW4gdGhlIHBhcmFtZXRlciBsaXN0PyAqLwoJCWlmIChyZXQgPCAwKSB7CgkJCUlSREFfV0FSTklORygiJXM6IGVycm9yIGV4dHJhY3RpbmcgcGFyYW1ldGVyc1xuIiwKCQkJCSAgICAgX19GVU5DVElPTl9fKTsKCQkJZGV2X2tmcmVlX3NrYihza2IpOwoKCQkJLyogRG8gbm90IGFjY2VwdCB0aGlzIGNvbm5lY3Rpb24gYXR0ZW1wdCAqLwoJCQlyZXR1cm47CgkJfQoKCQkvKiBSZW1vdmUgcGFyYW1ldGVycyAqLwoJCXNrYl9wdWxsKHNrYiwgSVJEQV9NSU4oc2tiLT5sZW4sIHBsZW4rMSkpOwoJfQoKCWlmIChzZWxmLT5ub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uKSB7CgkJc2VsZi0+bm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYsCgkJCQkJCXFvcywgc2VsZi0+dHhfbWF4X3NkdV9zaXplLAoJCQkJCQlzZWxmLT5tYXhfaGVhZGVyX3NpemUsIHNrYik7Cgl9IGVsc2UKCQlkZXZfa2ZyZWVfc2tiKHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2Nvbm5lY3RfcmVzcG9uc2UgKGhhbmRsZSwgdXNlcmRhdGEpCiAqCiAqICAgIFNlcnZpY2UgdXNlciBpcyBhY2NlcHRpbmcgdGhlIGNvbm5lY3Rpb24sIGp1c3QgcGFzcyBpdCBkb3duIHRvCiAqICAgIElyTE1QIQogKgogKi8KaW50IGlydHRwX2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IHRzYXBfY2IgKnNlbGYsIF9fdTMyIG1heF9zZHVfc2l6ZSwKCQkJICAgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOwoJX191OCAqZnJhbWU7CglpbnQgcmV0OwoJX191OCBuOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKSwgU291cmNlIFRTQVAgc2VsZWN0b3I9JTAyeFxuIiwgX19GVU5DVElPTl9fLAoJCSAgIHNlbGYtPnN0c2FwX3NlbCk7CgoJLyogQW55IHVzZXJkYXRhIHN1cHBsaWVkPyAqLwoJaWYgKHVzZXJkYXRhID09IE5VTEwpIHsKCQl0eF9za2IgPSBhbGxvY19za2IoVFRQX01BWF9IRUFERVIgKyBUVFBfU0FSX0hFQURFUiwKCQkJCSAgIEdGUF9BVE9NSUMpOwoJCWlmICghdHhfc2tiKQoJCQlyZXR1cm4gLUVOT01FTTsKCgkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYX0NPTlRST0wgYW5kIExBUCBoZWFkZXIgKi8KCQlza2JfcmVzZXJ2ZSh0eF9za2IsIFRUUF9NQVhfSEVBREVSICsgVFRQX1NBUl9IRUFERVIpOwoJfSBlbHNlIHsKCQl0eF9za2IgPSB1c2VyZGF0YTsKCQkvKgoJCSAqICBDaGVjayB0aGF0IHRoZSBjbGllbnQgaGFzIHJlc2VydmVkIGVub3VnaCBzcGFjZSBmb3IKCQkgKiAgaGVhZGVycwoJCSAqLwoJCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbSh1c2VyZGF0YSkgPj0gVFRQX01BWF9IRUFERVIsCgkJCXsgZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7IHJldHVybiAtMTsgfSApOwoJfQoKCXNlbGYtPmF2YWlsX2NyZWRpdCA9IDA7CglzZWxmLT5yZW1vdGVfY3JlZGl0ID0gMDsKCXNlbGYtPnJ4X21heF9zZHVfc2l6ZSA9IG1heF9zZHVfc2l6ZTsKCXNlbGYtPnJ4X3NkdV9zaXplID0gMDsKCXNlbGYtPnJ4X3NkdV9idXN5ID0gRkFMU0U7CgoJbiA9IHNlbGYtPmluaXRpYWxfY3JlZGl0OwoKCS8qIEZyYW1lIGhhcyBvbmx5IHNwYWNlIGZvciBtYXggMTI3IGNyZWRpdHMgKDcgYml0cykgKi8KCWlmIChuID4gMTI3KSB7CgkJc2VsZi0+YXZhaWxfY3JlZGl0ID0gbiAtIDEyNzsKCQluID0gMTI3OwoJfQoKCXNlbGYtPnJlbW90ZV9jcmVkaXQgPSBuOwoJc2VsZi0+Y29ubmVjdGVkID0gVFJVRTsKCgkvKiBTQVIgZW5hYmxlZD8gKi8KCWlmIChtYXhfc2R1X3NpemUgPiAwKSB7CgkJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHR4X3NrYikgPj0gKFRUUF9NQVhfSEVBREVSICsgVFRQX1NBUl9IRUFERVIpLAoJCQl7IGRldl9rZnJlZV9za2IodHhfc2tiKTsgcmV0dXJuIC0xOyB9ICk7CgoJCS8qIEluc2VydCBUVFAgaGVhZGVyIHdpdGggU0FSIHBhcmFtZXRlcnMgKi8KCQlmcmFtZSA9IHNrYl9wdXNoKHR4X3NrYiwgVFRQX0hFQURFUitUVFBfU0FSX0hFQURFUik7CgoJCWZyYW1lWzBdID0gVFRQX1BBUkFNRVRFUlMgfCBuOwoJCWZyYW1lWzFdID0gMHgwNDsgLyogTGVuZ3RoICovCgoJCS8qIGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIElSVFRQX01BWF9TRFVfU0laRSwgZnJhbWUrMSwgICovCi8qCQkJCSAgVFRQX1NBUl9IRUFERVIsICZwYXJhbV9pbmZvKSAqLwoKCQlmcmFtZVsyXSA9IDB4MDE7IC8qIE1heFNkdVNpemUgKi8KCQlmcmFtZVszXSA9IDB4MDI7IC8qIFZhbHVlIGxlbmd0aCAqLwoKCQlwdXRfdW5hbGlnbmVkKGNwdV90b19iZTE2KChfX3UxNikgbWF4X3NkdV9zaXplKSwKCQkJICAgICAgKF9fYmUxNiAqKShmcmFtZSs0KSk7Cgl9IGVsc2UgewoJCS8qIEluc2VydCBUVFAgaGVhZGVyICovCgkJZnJhbWUgPSBza2JfcHVzaCh0eF9za2IsIFRUUF9IRUFERVIpOwoKCQlmcmFtZVswXSA9IG4gJiAweDdmOwoJfQoKCXJldCA9IGlybG1wX2Nvbm5lY3RfcmVzcG9uc2Uoc2VsZi0+bHNhcCwgdHhfc2tiKTsKCglyZXR1cm4gcmV0Owp9CkVYUE9SVF9TWU1CT0woaXJ0dHBfY29ubmVjdF9yZXNwb25zZSk7CgovKgogKiBGdW5jdGlvbiBpcnR0cF9kdXAgKHNlbGYsIGluc3RhbmNlKQogKgogKiAgICBEdXBsaWNhdGUgVFNBUCwgY2FuIGJlIHVzZWQgYnkgc2VydmVycyB0byBjb25maXJtIGEgY29ubmVjdGlvbiBvbiBhCiAqICAgIG5ldyBUU0FQIHNvIGl0IGNhbiBrZWVwIGxpc3RlbmluZyBvbiB0aGUgb2xkIG9uZS4KICovCnN0cnVjdCB0c2FwX2NiICppcnR0cF9kdXAoc3RydWN0IHRzYXBfY2IgKm9yaWcsIHZvaWQgKmluc3RhbmNlKQp7CglzdHJ1Y3QgdHNhcF9jYiAqbmV3OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCS8qIFByb3RlY3Qgb3VyIGFjY2VzcyB0byB0aGUgb2xkIHRzYXAgaW5zdGFuY2UgKi8KCXNwaW5fbG9ja19pcnFzYXZlKCZpcnR0cC0+dHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CgoJLyogRmluZCB0aGUgb2xkIGluc3RhbmNlICovCglpZiAoIWhhc2hiaW5fZmluZChpcnR0cC0+dHNhcHMsIChsb25nKSBvcmlnLCBOVUxMKSkgewoJCUlSREFfREVCVUcoMCwgIiVzKCksIHVuYWJsZSB0byBmaW5kIFRTQVBcbiIsIF9fRlVOQ1RJT05fXyk7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJ0dHAtPnRzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qIEFsbG9jYXRlIGEgbmV3IGluc3RhbmNlICovCgluZXcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHNhcF9jYiksIEdGUF9BVE9NSUMpOwoJaWYgKCFuZXcpIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmFibGUgdG8ga21hbGxvY1xuIiwgX19GVU5DVElPTl9fKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnR0cC0+dHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgkvKiBEdXAgKi8KCW1lbWNweShuZXcsIG9yaWcsIHNpemVvZihzdHJ1Y3QgdHNhcF9jYikpOwoKCS8qIFdlIGRvbid0IG5lZWQgdGhlIG9sZCBpbnN0YW5jZSBhbnkgbW9yZSAqLwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJ0dHAtPnRzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoKCS8qIFRyeSB0byBkdXAgdGhlIExTQVAgKG1heSBmYWlsIGlmIHdlIHdlcmUgdG9vIHNsb3cpICovCgluZXctPmxzYXAgPSBpcmxtcF9kdXAob3JpZy0+bHNhcCwgbmV3KTsKCWlmICghbmV3LT5sc2FwKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZHVwIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJa2ZyZWUobmV3KTsKCQlyZXR1cm4gTlVMTDsKCX0KCgkvKiBOb3QgZXZlcnl0aGluZyBzaG91bGQgYmUgY29waWVkICovCgluZXctPm5vdGlmeS5pbnN0YW5jZSA9IGluc3RhbmNlOwoJaW5pdF90aW1lcigmbmV3LT50b2RvX3RpbWVyKTsKCglza2JfcXVldWVfaGVhZF9pbml0KCZuZXctPnJ4X3F1ZXVlKTsKCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5ldy0+dHhfcXVldWUpOwoJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbmV3LT5yeF9mcmFnbWVudHMpOwoKCS8qIFRoaXMgaXMgbG9ja2VkICovCgloYXNoYmluX2luc2VydChpcnR0cC0+dHNhcHMsIChpcmRhX3F1ZXVlX3QgKikgbmV3LCAobG9uZykgbmV3LCBOVUxMKTsKCglyZXR1cm4gbmV3Owp9CkVYUE9SVF9TWU1CT0woaXJ0dHBfZHVwKTsKCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdCAoc2VsZikKICoKICogICAgQ2xvc2UgdGhpcyBjb25uZWN0aW9uIHBsZWFzZSEgSWYgcHJpb3JpdHkgaXMgaGlnaCwgdGhlIHF1ZXVlZCBkYXRhCiAqICAgIHNlZ21lbnRzLCBpZiBhbnksIHdpbGwgYmUgZGVhbGxvY2F0ZWQgZmlyc3QKICoKICovCmludCBpcnR0cF9kaXNjb25uZWN0X3JlcXVlc3Qoc3RydWN0IHRzYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSwKCQkJICAgICBpbnQgcHJpb3JpdHkpCnsKCWludCByZXQ7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKCgkvKiBBbHJlYWR5IGRpc2Nvbm5lY3RlZD8gKi8KCWlmICghc2VsZi0+Y29ubmVjdGVkKSB7CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgYWxyZWFkeSBkaXNjb25uZWN0ZWQhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWlmICh1c2VyZGF0YSkKCQkJZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7CgkJcmV0dXJuIC0xOwoJfQoKCS8qIERpc2Nvbm5lY3QgYWxyZWFkeSBwZW5kaW5nID8KCSAqIFdlIG5lZWQgdG8gdXNlIGFuIGF0b21pYyBvcGVyYXRpb24gdG8gcHJldmVudCByZWVudHJ5LiBUaGlzCgkgKiBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gdmFyaW91cyBjb250ZXh0LCBsaWtlIHVzZXIsIHRpbWVyCgkgKiBmb3IgZm9sbG93aW5nIGEgZGlzY29ubmVjdF9pbmRpY2F0aW9uKCkgKGkuZS4gbmV0X2JoKS4KCSAqIEplYW4gSUkgKi8KCWlmKHRlc3RfYW5kX3NldF9iaXQoMCwgJnNlbGYtPmRpc2Nvbm5lY3RfcGVuZCkpIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBkaXNjb25uZWN0IGFscmVhZHkgcGVuZGluZ1xuIiwKCQkJICAgX19GVU5DVElPTl9fKTsKCQlpZiAodXNlcmRhdGEpCgkJCWRldl9rZnJlZV9za2IodXNlcmRhdGEpOwoKCQkvKiBUcnkgdG8gbWFrZSBzb21lIHByb2dyZXNzICovCgkJaXJ0dHBfcnVuX3R4X3F1ZXVlKHNlbGYpOwoJCXJldHVybiAtMTsKCX0KCgkvKgoJICogIENoZWNrIGlmIHRoZXJlIGlzIHN0aWxsIGRhdGEgc2VnbWVudHMgaW4gdGhlIHRyYW5zbWl0IHF1ZXVlCgkgKi8KCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzZWxmLT50eF9xdWV1ZSkpIHsKCQlpZiAocHJpb3JpdHkgPT0gUF9ISUdIKSB7CgkJCS8qCgkJCSAqICBObyBuZWVkIHRvIHNlbmQgdGhlIHF1ZXVlZCBkYXRhLCBpZiB3ZSBhcmUKCQkJICogIGRpc2Nvbm5lY3RpbmcgcmlnaHQgbm93IHNpbmNlIHRoZSBkYXRhIHdpbGwKCQkJICogIG5vdCBoYXZlIGFueSB1c2FibGUgY29ubmVjdGlvbiB0byBiZSBzZW50IG9uCgkJCSAqLwoJCQlJUkRBX0RFQlVHKDEsICIlcygpOiBIaWdoIHByaW9yaXR5ISEoKVxuIiwgX19GVU5DVElPTl9fKTsKCQkJaXJ0dHBfZmx1c2hfcXVldWVzKHNlbGYpOwoJCX0gZWxzZSBpZiAocHJpb3JpdHkgPT0gUF9OT1JNQUwpIHsKCQkJLyoKCQkJICogIE11c3QgZGVsYXkgZGlzY29ubmVjdCB1bnRpbCBhZnRlciBhbGwgZGF0YSBzZWdtZW50cwoJCQkgKiAgaGF2ZSBiZWVuIHNlbnQgYW5kIHRoZSB0eF9xdWV1ZSBpcyBlbXB0eQoJCQkgKi8KCQkJLyogV2UnbGwgcmV1c2UgdGhpcyBvbmUgbGF0ZXIgZm9yIHRoZSBkaXNjb25uZWN0ICovCgkJCXNlbGYtPmRpc2Nvbm5lY3Rfc2tiID0gdXNlcmRhdGE7ICAvKiBNYXkgYmUgTlVMTCAqLwoKCQkJaXJ0dHBfcnVuX3R4X3F1ZXVlKHNlbGYpOwoKCQkJaXJ0dHBfc3RhcnRfdG9kb190aW1lcihzZWxmLCBIWi8xMCk7CgkJCXJldHVybiAtMTsKCQl9Cgl9CgkvKiBOb3RlIDogd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpZiBzZWxmLT5yeF9xdWV1ZSBpcyBmdWxsIGFuZCB0aGUKCSAqIHN0YXRlIG9mIHNlbGYtPnJ4X3NkdV9idXN5IGJlY2F1c2UgdGhlIGRpc2Nvbm5lY3QgcmVzcG9uc2Ugd2lsbAoJICogYmUgc2VudCBhdCB0aGUgTE1QIGxldmVsIChzbyBldmVuIGlmIHRoZSBwZWVyIGhhcyBpdHMgVHggcXVldWUKCSAqIGZ1bGwgb2YgZGF0YSkuIC0gSmVhbiBJSSAqLwoKCUlSREFfREVCVUcoMSwgIiVzKCksIERpc2Nvbm5lY3RpbmcgLi4uXG4iLCBfX0ZVTkNUSU9OX18pOwoJc2VsZi0+Y29ubmVjdGVkID0gRkFMU0U7CgoJaWYgKCF1c2VyZGF0YSkgewoJCXN0cnVjdCBza19idWZmICp0eF9za2I7CgkJdHhfc2tiID0gYWxsb2Nfc2tiKExNUF9NQVhfSEVBREVSLCBHRlBfQVRPTUlDKTsKCQlpZiAoIXR4X3NrYikKCQkJcmV0dXJuIC1FTk9NRU07CgoJCS8qCgkJICogIFJlc2VydmUgc3BhY2UgZm9yIE1VWCBhbmQgTEFQIGhlYWRlcgoJCSAqLwoJCXNrYl9yZXNlcnZlKHR4X3NrYiwgTE1QX01BWF9IRUFERVIpOwoKCQl1c2VyZGF0YSA9IHR4X3NrYjsKCX0KCXJldCA9IGlybG1wX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5sc2FwLCB1c2VyZGF0YSk7CgoJLyogVGhlIGRpc2Nvbm5lY3QgaXMgbm8gbG9uZ2VyIHBlbmRpbmcgKi8KCWNsZWFyX2JpdCgwLCAmc2VsZi0+ZGlzY29ubmVjdF9wZW5kKTsJLyogRkFMU0UgKi8KCglyZXR1cm4gcmV0Owp9CkVYUE9SVF9TWU1CT0woaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoc2VsZiwgcmVhc29uKQogKgogKiAgICBEaXNjb25uZWN0IGluZGljYXRpb24sIFRTQVAgZGlzY29ubmVjdGVkIGJ5IHBlZXI/CiAqCiAqLwp2b2lkIGlydHRwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCBMTV9SRUFTT04gcmVhc29uLAoJCQkJIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCB0c2FwX2NiICpzZWxmOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBpbnN0YW5jZTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOwoKCS8qIFByZXZlbnQgaGlnaGVyIGxheWVyIHRvIHNlbmQgbW9yZSBkYXRhICovCglzZWxmLT5jb25uZWN0ZWQgPSBGQUxTRTsKCgkvKiBDaGVjayBpZiBjbGllbnQgaGFzIGFscmVhZHkgdHJpZWQgdG8gY2xvc2UgdGhlIFRTQVAgKi8KCWlmIChzZWxmLT5jbG9zZV9wZW5kKSB7CgkJLyogSW4gdGhpcyBjYXNlLCB0aGUgaGlnaGVyIGxheWVyIGlzIHByb2JhYmx5IGdvbmUuIERvbid0CgkJICogYm90aGVyIGl0IGFuZCBjbGVhbiB1cCB0aGUgcmVtYWlucyAtIEplYW4gSUkgKi8KCQlpZiAoc2tiKQoJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgkJaXJ0dHBfY2xvc2VfdHNhcChzZWxmKTsKCQlyZXR1cm47Cgl9CgoJLyogSWYgd2UgYXJlIGhlcmUsIHdlIGFzc3VtZSB0aGF0IGlzIHRoZSBoaWdoZXIgbGF5ZXIgaXMgc3RpbGwKCSAqIHdhaXRpbmcgZm9yIHRoZSBkaXNjb25uZWN0IG5vdGlmaWNhdGlvbiBhbmQgYWJsZSB0byBwcm9jZXNzIGl0LAoJICogZXZlbiBpZiBoZSB0cmllZCB0byBkaXNjb25uZWN0LiBPdGhlcndpc2UsIGl0IHdvdWxkIGhhdmUgYWxyZWFkeQoJICogYXR0ZW1wdGVkIHRvIGNsb3NlIHRoZSB0c2FwIGFuZCBzZWxmLT5jbG9zZV9wZW5kIHdvdWxkIGJlIFRSVUUuCgkgKiBKZWFuIElJICovCgoJLyogTm8gbmVlZCB0byBub3RpZnkgdGhlIGNsaWVudCBpZiBoYXMgYWxyZWFkeSB0cmllZCB0byBkaXNjb25uZWN0ICovCglpZihzZWxmLT5ub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uKQoJCXNlbGYtPm5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBzZWxmLAoJCQkJCQkgICByZWFzb24sIHNrYik7CgllbHNlCgkJaWYgKHNrYikKCQkJZGV2X2tmcmVlX3NrYihza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcnR0cF9kb19kYXRhX2luZGljYXRpb24gKHNlbGYsIHNrYikKICoKICogICAgVHJ5IHRvIGRlbGl2ZXIgcmVhc3NlbWJsZWQgc2tiIHRvIGxheWVyIGFib3ZlLCBhbmQgcmVxdWV1ZSBpdCBpZiB0aGF0CiAqICAgIGZvciBzb21lIHJlYXNvbiBzaG91bGQgZmFpbC4gV2UgbWFyayByeCBzZHUgYXMgYnVzeSB0byBhcHBseSBiYWNrCiAqICAgIHByZXNzdXJlIGlzIG5lY2Vzc2FyeS4KICovCnN0YXRpYyB2b2lkIGlydHRwX2RvX2RhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJaW50IGVycjsKCgkvKiBDaGVjayBpZiBjbGllbnQgaGFzIGFscmVhZHkgY2xvc2VkIHRoZSBUU0FQIGFuZCBnb25lIGF3YXkgKi8KCWlmIChzZWxmLT5jbG9zZV9wZW5kKSB7CgkJZGV2X2tmcmVlX3NrYihza2IpOwoJCXJldHVybjsKCX0KCgllcnIgPSBzZWxmLT5ub3RpZnkuZGF0YV9pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwgc2tiKTsKCgkvKiBVc3VhbGx5IHRoZSBsYXllciBhYm92ZSB3aWxsIG5vdGlmeSB0aGF0IGl0J3MgaW5wdXQgcXVldWUgaXMKCSAqIHN0YXJ0aW5nIHRvIGdldCBmaWxsZWQgYnkgdXNpbmcgdGhlIGZsb3cgcmVxdWVzdCwgYnV0IHRoaXMgbWF5CgkgKiBiZSBkaWZmaWN1bHQsIHNvIGl0IGNhbiBpbnN0ZWFkIGp1c3QgcmVmdXNlIHRvIGVhdCBpdCBhbmQganVzdAoJICogZ2l2ZSBhbiBlcnJvciBiYWNrCgkgKi8KCWlmIChlcnIpIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpIHJlcXVldWVpbmcgc2tiIVxuIiwgX19GVU5DVElPTl9fKTsKCgkJLyogTWFrZSBzdXJlIHdlIHRha2UgYSBicmVhayAqLwoJCXNlbGYtPnJ4X3NkdV9idXN5ID0gVFJVRTsKCgkJLyogTmVlZCB0byBwdXNoIHRoZSBoZWFkZXIgaW4gYWdhaW4gKi8KCQlza2JfcHVzaChza2IsIFRUUF9IRUFERVIpOwoJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIE1ha2Ugc3VyZSBNT1JFIGJpdCBpcyBjbGVhcmVkICovCgoJCS8qIFB1dCBza2IgYmFjayBvbiBxdWV1ZSAqLwoJCXNrYl9xdWV1ZV9oZWFkKCZzZWxmLT5yeF9xdWV1ZSwgc2tiKTsKCX0KfQoKLyoKICogRnVuY3Rpb24gaXJ0dHBfcnVuX3J4X3F1ZXVlIChzZWxmKQogKgogKiAgICAgQ2hlY2sgaWYgd2UgaGF2ZSBhbnkgZnJhbWVzIHRvIGJlIHRyYW5zbWl0dGVkLCBvciBpZiB3ZSBoYXZlIGFueQogKiAgICAgYXZhaWxhYmxlIGNyZWRpdCB0byBnaXZlIGF3YXkuCiAqLwp2b2lkIGlydHRwX3J1bl9yeF9xdWV1ZShzdHJ1Y3QgdHNhcF9jYiAqc2VsZikKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCWludCBtb3JlID0gMDsKCglJUkRBX0RFQlVHKDIsICIlcygpIHNlbmQ9JWQsYXZhaWw9JWQscmVtb3RlPSVkXG4iLCBfX0ZVTkNUSU9OX18sCgkJICAgc2VsZi0+c2VuZF9jcmVkaXQsIHNlbGYtPmF2YWlsX2NyZWRpdCwgc2VsZi0+cmVtb3RlX2NyZWRpdCk7CgoJLyogR2V0IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIHJ4IHF1ZXVlLCBvdGhlcndpc2UgZG9uJ3QgdG91Y2ggaXQgKi8KCWlmIChpcmRhX2xvY2soJnNlbGYtPnJ4X3F1ZXVlX2xvY2spID09IEZBTFNFKQoJCXJldHVybjsKCgkvKgoJICogIFJlYXNzZW1ibGUgYWxsIGZyYW1lcyBpbiByZWNlaXZlIHF1ZXVlIGFuZCBkZWxpdmVyIHRoZW0KCSAqLwoJd2hpbGUgKCFzZWxmLT5yeF9zZHVfYnVzeSAmJiAoc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPnJ4X3F1ZXVlKSkpIHsKCQkvKiBUaGlzIGJpdCB3aWxsIHRlbGwgdXMgaWYgaXQncyB0aGUgbGFzdCBmcmFnbWVudCBvciBub3QgKi8KCQltb3JlID0gc2tiLT5kYXRhWzBdICYgMHg4MDsKCgkJLyogUmVtb3ZlIFRUUCBoZWFkZXIgKi8KCQlza2JfcHVsbChza2IsIFRUUF9IRUFERVIpOwoKCQkvKiBBZGQgdGhlIGxlbmd0aCBvZiB0aGUgcmVtYWluaW5nIGRhdGEgKi8KCQlzZWxmLT5yeF9zZHVfc2l6ZSArPSBza2ItPmxlbjsKCgkJLyoKCQkgKiBJZiBTQVIgaXMgZGlzYWJsZWQsIG9yIHVzZXIgaGFzIHJlcXVlc3RlZCBubyByZWFzc2VtYmx5CgkJICogb2YgcmVjZWl2ZWQgZnJhZ21lbnRzIHRoZW4gd2UganVzdCBkZWxpdmVyIHRoZW0KCQkgKiBpbW1lZGlhdGVseS4gVGhpcyBjYW4gYmUgcmVxdWVzdGVkIGJ5IGNsaWVudHMgdGhhdAoJCSAqIGltcGxlbWVudHMgYnl0ZSBzdHJlYW1zIHdpdGhvdXQgYW55IG1lc3NhZ2UgYm91bmRhcmllcwoJCSAqLwoJCWlmIChzZWxmLT5yeF9tYXhfc2R1X3NpemUgPT0gVFRQX1NBUl9ESVNBQkxFKSB7CgkJCWlydHRwX2RvX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IpOwoJCQlzZWxmLT5yeF9zZHVfc2l6ZSA9IDA7CgoJCQljb250aW51ZTsKCQl9CgoJCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBmcmFnbWVudCwgYW5kIG5vdCB0aGUgbGFzdCBmcmFnbWVudCAqLwoJCWlmIChtb3JlKSB7CgkJCS8qCgkJCSAqICBRdWV1ZSB0aGUgZnJhZ21lbnQgaWYgd2Ugc3RpbGwgYXJlIHdpdGhpbiB0aGUKCQkJICogIGxpbWl0cyBvZiB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSByeF9zZHUKCQkJICovCgkJCWlmIChzZWxmLT5yeF9zZHVfc2l6ZSA8PSBzZWxmLT5yeF9tYXhfc2R1X3NpemUpIHsKCQkJCUlSREFfREVCVUcoNCwgIiVzKCksIHF1ZXVlaW5nIGZyYWdcbiIsCgkJCQkJICAgX19GVU5DVElPTl9fKTsKCQkJCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT5yeF9mcmFnbWVudHMsIHNrYik7CgkJCX0gZWxzZSB7CgkJCQkvKiBGcmVlIHRoZSBwYXJ0IG9mIHRoZSBTRFUgdGhhdCBpcyB0b28gYmlnICovCgkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgkJCX0KCQkJY29udGludWU7CgkJfQoJCS8qCgkJICogIFRoaXMgaXMgdGhlIGxhc3QgZnJhZ21lbnQsIHNvIHRpbWUgdG8gcmVhc3NlbWJsZSEKCQkgKi8KCQlpZiAoKHNlbGYtPnJ4X3NkdV9zaXplIDw9IHNlbGYtPnJ4X21heF9zZHVfc2l6ZSkgfHwKCQkgICAgKHNlbGYtPnJ4X21heF9zZHVfc2l6ZSA9PSBUVFBfU0FSX1VOQk9VTkQpKQoJCXsKCQkJLyoKCQkJICogQSBsaXR0bGUgb3B0aW1pemluZy4gT25seSBxdWV1ZSB0aGUgZnJhZ21lbnQgaWYKCQkJICogdGhlcmUgYXJlIG90aGVyIGZyYWdtZW50cy4gU2luY2UgaWYgdGhpcyBpcyB0aGUKCQkJICogbGFzdCBhbmQgb25seSBmcmFnbWVudCwgdGhlcmUgaXMgbm8gbmVlZCB0bwoJCQkgKiByZWFzc2VtYmxlIDotKQoJCQkgKi8KCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnJ4X2ZyYWdtZW50cykpIHsKCQkJCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT5yeF9mcmFnbWVudHMsCgkJCQkJICAgICAgIHNrYik7CgoJCQkJc2tiID0gaXJ0dHBfcmVhc3NlbWJsZV9za2Ioc2VsZik7CgkJCX0KCgkJCS8qIE5vdyB3ZSBjYW4gZGVsaXZlciB0aGUgcmVhc3NlbWJsZWQgc2tiICovCgkJCWlydHRwX2RvX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IpOwoJCX0gZWxzZSB7CgkJCUlSREFfREVCVUcoMSwgIiVzKCksIFRydW5jYXRlZCBmcmFtZVxuIiwgX19GVU5DVElPTl9fKTsKCgkJCS8qIEZyZWUgdGhlIHBhcnQgb2YgdGhlIFNEVSB0aGF0IGlzIHRvbyBiaWcgKi8KCQkJZGV2X2tmcmVlX3NrYihza2IpOwoKCQkJLyogRGVsaXZlciBvbmx5IHRoZSB2YWxpZCBidXQgdHJ1bmNhdGVkIHBhcnQgb2YgU0RVICovCgkJCXNrYiA9IGlydHRwX3JlYXNzZW1ibGVfc2tiKHNlbGYpOwoKCQkJaXJ0dHBfZG9fZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CgkJfQoJCXNlbGYtPnJ4X3NkdV9zaXplID0gMDsKCX0KCgkvKgoJICogSXQncyBub3QgdHJpdmlhbCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGNyZWRpdHMgYXJlIGF2YWlsYWJsZQoJICogYnkgaW5jcmVtZW50aW5nIGF0IGVhY2ggcGFja2V0LCBiZWNhdXNlIGRlbGl2ZXJ5IG1heSBmYWlsCgkgKiAoaXJ0dHBfZG9fZGF0YV9pbmRpY2F0aW9uKCkgbWF5IHJlcXVldWUgdGhlIGZyYW1lKSBhbmQgYmVjYXVzZQoJICogd2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgZnJhZ21lbnRhdGlvbi4KCSAqIFdlIHdhbnQgdGhlIG90aGVyIHNpZGUgdG8gc2VuZCB1cCB0byBpbml0aWFsX2NyZWRpdCBwYWNrZXRzLgoJICogV2UgaGF2ZSBzb21lIGZyYW1lcyBpbiBvdXIgcXVldWVzLCBhbmQgd2UgaGF2ZSBhbHJlYWR5IGFsbG93ZWQgaXQKCSAqIHRvIHNlbmQgcmVtb3RlX2NyZWRpdC4KCSAqIE5vIG5lZWQgdG8gc3BpbmxvY2ssIHdyaXRlIGlzIGF0b21pYyBhbmQgc2VsZiBjb3JyZWN0aW5nLi4uCgkgKiBKZWFuIElJCgkgKi8KCXNlbGYtPmF2YWlsX2NyZWRpdCA9IChzZWxmLT5pbml0aWFsX2NyZWRpdCAtCgkJCSAgICAgIChzZWxmLT5yZW1vdGVfY3JlZGl0ICsKCQkJICAgICAgIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnJ4X3F1ZXVlKSArCgkJCSAgICAgICBza2JfcXVldWVfbGVuKCZzZWxmLT5yeF9mcmFnbWVudHMpKSk7CgoJLyogRG8gd2UgaGF2ZSB0b28gbXVjaCBjcmVkaXRzIHRvIHNlbmQgdG8gcGVlciA/ICovCglpZiAoKHNlbGYtPnJlbW90ZV9jcmVkaXQgPD0gVFRQX1JYX01JTl9DUkVESVQpICYmCgkgICAgKHNlbGYtPmF2YWlsX2NyZWRpdCA+IDApKSB7CgkJLyogU2VuZCBleHBsaWNpdCBjcmVkaXQgZnJhbWUgKi8KCQlpcnR0cF9naXZlX2NyZWRpdChzZWxmKTsKCQkvKiBOb3RlIDogZG8gKk5PVCogY2hlY2sgaWYgdHhfcXVldWUgaXMgbm9uLWVtcHR5LCB0aGF0CgkJICogd2lsbCBwcm9kdWNlIGRlYWRsb2Nrcy4gSSByZXBlYXQgOiBzZW5kIGEgY3JlZGl0IGZyYW1lCgkJICogZXZlbiBpZiB3ZSBoYXZlIHNvbWV0aGluZyB0byBzZW5kIGluIG91ciBUeCBxdWV1ZS4KCQkgKiBJZiB3ZSBoYXZlIGNyZWRpdHMsIGl0IG1lYW5zIHRoYXQgb3VyIFR4IHF1ZXVlIGlzIGJsb2NrZWQuCgkJICoKCQkgKiBMZXQncyBzdXBwb3NlIHRoZSBwZWVyIGNhbid0IGtlZXAgdXAgd2l0aCBvdXIgVHguIEhlIHdpbGwKCQkgKiBmbG93IGNvbnRyb2wgdXMgYnkgbm90IHNlbmRpbmcgdXMgYW55IGNyZWRpdHMsIGFuZCB3ZQoJCSAqIHdpbGwgc3RvcCBUeCBhbmQgc3RhcnQgYWNjdW11bGF0aW5nIGNyZWRpdHMgaGVyZS4KCQkgKiBVcCB0byB0aGUgcG9pbnQgd2hlcmUgdGhlIHBlZXIgd2lsbCBzdG9wIGl0cyBUeCBxdWV1ZSwKCQkgKiBmb3IgbGFjayBvZiBjcmVkaXRzLgoJCSAqIExldCdzIGFzc3VtZSB0aGUgcGVlciBhcHBsaWNhdGlvbiBpcyBzaW5nbGUgdGhyZWFkZWQuCgkJICogSXQgd2lsbCBibG9jayBvbiBUeCBhbmQgbmV2ZXIgY29uc3VtZSBhbnkgUnggYnVmZmVyLgoJCSAqIERlYWRsb2NrLiBHdWFyYW50ZWVkLiAtIEplYW4gSUkKCQkgKi8KCX0KCgkvKiBSZXNldCBsb2NrICovCglzZWxmLT5yeF9xdWV1ZV9sb2NrID0gMDsKfQoKI2lmZGVmIENPTkZJR19QUk9DX0ZTCnN0cnVjdCBpcnR0cF9pdGVyX3N0YXRlIHsKCWludCBpZDsKfTsKCnN0YXRpYyB2b2lkICppcnR0cF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQp7CglzdHJ1Y3QgaXJ0dHBfaXRlcl9zdGF0ZSAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKCXN0cnVjdCB0c2FwX2NiICpzZWxmOwoKCS8qIFByb3RlY3Qgb3VyIGFjY2VzcyB0byB0aGUgdHNhcCBsaXN0ICovCglzcGluX2xvY2tfaXJxKCZpcnR0cC0+dHNhcHMtPmhiX3NwaW5sb2NrKTsKCWl0ZXItPmlkID0gMDsKCglmb3IgKHNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJ0dHAtPnRzYXBzKTsKCSAgICAgc2VsZiAhPSBOVUxMOwoJICAgICBzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGhhc2hiaW5fZ2V0X25leHQoaXJ0dHAtPnRzYXBzKSkgewoJCWlmIChpdGVyLT5pZCA9PSAqcG9zKQoJCQlicmVhazsKCQkrK2l0ZXItPmlkOwoJfQoKCXJldHVybiBzZWxmOwp9CgpzdGF0aWMgdm9pZCAqaXJ0dHBfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQp7CglzdHJ1Y3QgaXJ0dHBfaXRlcl9zdGF0ZSAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKCgkrKypwb3M7CgkrK2l0ZXItPmlkOwoJcmV0dXJuICh2b2lkICopIGhhc2hiaW5fZ2V0X25leHQoaXJ0dHAtPnRzYXBzKTsKfQoKc3RhdGljIHZvaWQgaXJ0dHBfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCXNwaW5fdW5sb2NrX2lycSgmaXJ0dHAtPnRzYXBzLT5oYl9zcGlubG9jayk7Cn0KCnN0YXRpYyBpbnQgaXJ0dHBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCWNvbnN0IHN0cnVjdCBpcnR0cF9pdGVyX3N0YXRlICppdGVyID0gc2VxLT5wcml2YXRlOwoJY29uc3Qgc3RydWN0IHRzYXBfY2IgKnNlbGYgPSB2OwoKCXNlcV9wcmludGYoc2VxLCAiVFNBUCAlZCwgIiwgaXRlci0+aWQpOwoJc2VxX3ByaW50ZihzZXEsICJzdHNhcF9zZWw6ICUwMngsICIsCgkJICAgc2VsZi0+c3RzYXBfc2VsKTsKCXNlcV9wcmludGYoc2VxLCAiZHRzYXBfc2VsOiAlMDJ4XG4iLAoJCSAgIHNlbGYtPmR0c2FwX3NlbCk7CglzZXFfcHJpbnRmKHNlcSwgIiAgY29ubmVjdGVkOiAlcywgIiwKCQkgICBzZWxmLT5jb25uZWN0ZWQ/ICJUUlVFIjoiRkFMU0UiKTsKCXNlcV9wcmludGYoc2VxLCAiYXZhaWwgY3JlZGl0OiAlZCwgIiwKCQkgICBzZWxmLT5hdmFpbF9jcmVkaXQpOwoJc2VxX3ByaW50ZihzZXEsICJyZW1vdGUgY3JlZGl0OiAlZCwgIiwKCQkgICBzZWxmLT5yZW1vdGVfY3JlZGl0KTsKCXNlcV9wcmludGYoc2VxLCAic2VuZCBjcmVkaXQ6ICVkXG4iLAoJCSAgIHNlbGYtPnNlbmRfY3JlZGl0KTsKCXNlcV9wcmludGYoc2VxLCAiICB0eCBwYWNrZXRzOiAlbGQsICIsCgkJICAgc2VsZi0+c3RhdHMudHhfcGFja2V0cyk7CglzZXFfcHJpbnRmKHNlcSwgInJ4IHBhY2tldHM6ICVsZCwgIiwKCQkgICBzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKTsKCXNlcV9wcmludGYoc2VxLCAidHhfcXVldWUgbGVuOiAlZCAiLAoJCSAgIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4X3F1ZXVlKSk7CglzZXFfcHJpbnRmKHNlcSwgInJ4X3F1ZXVlIGxlbjogJWRcbiIsCgkJICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+cnhfcXVldWUpKTsKCXNlcV9wcmludGYoc2VxLCAiICB0eF9zZHVfYnVzeTogJXMsICIsCgkJICAgc2VsZi0+dHhfc2R1X2J1c3k/ICJUUlVFIjoiRkFMU0UiKTsKCXNlcV9wcmludGYoc2VxLCAicnhfc2R1X2J1c3k6ICVzXG4iLAoJCSAgIHNlbGYtPnJ4X3NkdV9idXN5PyAiVFJVRSI6IkZBTFNFIik7CglzZXFfcHJpbnRmKHNlcSwgIiAgbWF4X3NlZ19zaXplOiAlZCwgIiwKCQkgICBzZWxmLT5tYXhfc2VnX3NpemUpOwoJc2VxX3ByaW50ZihzZXEsICJ0eF9tYXhfc2R1X3NpemU6ICVkLCAiLAoJCSAgIHNlbGYtPnR4X21heF9zZHVfc2l6ZSk7CglzZXFfcHJpbnRmKHNlcSwgInJ4X21heF9zZHVfc2l6ZTogJWRcbiIsCgkJICAgc2VsZi0+cnhfbWF4X3NkdV9zaXplKTsKCglzZXFfcHJpbnRmKHNlcSwgIiAgVXNlZCBieSAoJXMpXG5cbiIsCgkJICAgc2VsZi0+bm90aWZ5Lm5hbWUpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXJ0dHBfc2VxX29wcyA9IHsKCS5zdGFydCAgPSBpcnR0cF9zZXFfc3RhcnQsCgkubmV4dCAgID0gaXJ0dHBfc2VxX25leHQsCgkuc3RvcCAgID0gaXJ0dHBfc2VxX3N0b3AsCgkuc2hvdyAgID0gaXJ0dHBfc2VxX3Nob3csCn07CgpzdGF0aWMgaW50IGlydHRwX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKCWludCByYyA9IC1FTk9NRU07CglzdHJ1Y3QgaXJ0dHBfaXRlcl9zdGF0ZSAqczsKCglzID0ga3phbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKCWlmICghcykKCQlnb3RvIG91dDsKCglyYyA9IHNlcV9vcGVuKGZpbGUsICZpcnR0cF9zZXFfb3BzKTsKCWlmIChyYykKCQlnb3RvIG91dF9rZnJlZTsKCglzZXEJICAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCXNlcS0+cHJpdmF0ZSA9IHM7Cm91dDoKCXJldHVybiByYzsKb3V0X2tmcmVlOgoJa2ZyZWUocyk7Cglnb3RvIG91dDsKfQoKY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcnR0cF9zZXFfZm9wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5vcGVuICAgICAgICAgICA9IGlydHRwX3NlcV9vcGVuLAoJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCgkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCgkucmVsZWFzZQk9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCn07CgojZW5kaWYgLyogUFJPQ19GUyAqLwo=