LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmlhc19vYmplY3QuYwogKiBWZXJzaW9uOiAgICAgICAwLjMKICogRGVzY3JpcHRpb246ICAgSUFTIG9iamVjdCBkYXRhYmFzZSBhbmQgZnVuY3Rpb25zCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBUaHUgT2N0ICAxIDIyOjUwOjA0IDE5OTgKICogTW9kaWZpZWQgYXQ6ICAgV2VkIERlYyAxNSAxMToyMzoxNiAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CgpoYXNoYmluX3QgKmlyaWFzX29iamVjdHM7CgovKgogKiAgVXNlZCB3aGVuIGEgbWlzc2luZyB2YWx1ZSBuZWVkcyB0byBiZSByZXR1cm5lZAogKi8Kc3RydWN0IGlhc192YWx1ZSBpcmlhc19taXNzaW5nID0geyBJQVNfTUlTU0lORywgMCwgMCwgMCwgezB9fTsKCi8qCiAqIEZ1bmN0aW9uIHN0cm5kdXAgKHN0ciwgbWF4KQogKgogKiAgICBNeSBvd24ga2VybmVsIHZlcnNpb24gb2Ygc3RybmR1cCEKICoKICogRmFzdGVyLCBjaGVjayBib3VuZGFyeS4uLiBKZWFuIElJCiAqLwpzdGF0aWMgY2hhciAqc3RybmR1cChjaGFyICpzdHIsIGludCBtYXgpCnsKCWNoYXIgKm5ld19zdHI7CglpbnQgbGVuOwoKCS8qIENoZWNrIHN0cmluZyAqLwoJaWYgKHN0ciA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoJLyogQ2hlY2sgbGVuZ3RoLCB0cnVuY2F0ZSAqLwoJbGVuID0gc3RybGVuKHN0cik7CglpZihsZW4gPiBtYXgpCgkJbGVuID0gbWF4OwoKCS8qIEFsbG9jYXRlIG5ldyBzdHJpbmcgKi8KICAgICAgICBuZXdfc3RyID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfQVRPTUlDKTsKICAgICAgICBpZiAobmV3X3N0ciA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qIENvcHkgYW5kIHRydW5jYXRlICovCgltZW1jcHkobmV3X3N0ciwgc3RyLCBsZW4pOwoJbmV3X3N0cltsZW5dID0gJ1wwJzsKCglyZXR1cm4gbmV3X3N0cjsKfQoKLyoKICogRnVuY3Rpb24gaWFzX25ld19vYmplY3QgKG5hbWUsIGlkKQogKgogKiAgICBDcmVhdGUgYSBuZXcgSUFTIG9iamVjdAogKgogKi8Kc3RydWN0IGlhc19vYmplY3QgKmlyaWFzX25ld19vYmplY3QoIGNoYXIgKm5hbWUsIGludCBpZCkKewogICAgICAgIHN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CgoJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJb2JqID0gKHN0cnVjdCBpYXNfb2JqZWN0ICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfb2JqZWN0KSwKCQkJCQkgICAgR0ZQX0FUT01JQyk7CglpZiAob2JqID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzKCksIFVuYWJsZSB0byBhbGxvY2F0ZSBvYmplY3QhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgltZW1zZXQob2JqLCAwLCBzaXplb2YoIHN0cnVjdCBpYXNfb2JqZWN0KSk7CgoJb2JqLT5tYWdpYyA9IElBU19PQkpFQ1RfTUFHSUM7CglvYmotPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQ0xBU1NOQU1FKTsKCW9iai0+aWQgPSBpZDsKCgkvKiBMb2NraW5nIG5vdGVzIDogdGhlIGF0dHJpYiBzcGlubG9jayBoYXMgbG93ZXIgcHJlY2VuZGVuY2UKCSAqIHRoYW4gdGhlIG9iamVjdHMgc3BpbmxvY2suIE5ldmVyIGdyYXAgdGhlIG9iamVjdHMgc3BpbmxvY2sKCSAqIHdoaWxlIGhvbGRpbmcgYW55IGF0dHJpYiBzcGlubG9jayAocmlzayBvZiBkZWFkbG9jaykuIEplYW4gSUkgKi8KCW9iai0+YXR0cmlicyA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOwoKCWlmIChvYmotPmF0dHJpYnMgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXMoKSwgVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnMhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJa2ZyZWUob2JqKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglyZXR1cm4gb2JqOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfbmV3X29iamVjdCk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfYXR0cmliIChhdHRyaWIpCiAqCiAqICAgIERlbGV0ZSBnaXZlbiBhdHRyaWJ1dGUgYW5kIGRlYWxsb2NhdGUgYWxsIGl0cyBtZW1vcnkKICoKICovCnN0YXRpYyB2b2lkIF9faXJpYXNfZGVsZXRlX2F0dHJpYihzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliKQp7CglJUkRBX0FTU0VSVChhdHRyaWIgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChhdHRyaWItPm1hZ2ljID09IElBU19BVFRSSUJfTUFHSUMsIHJldHVybjspOwoKCWlmIChhdHRyaWItPm5hbWUpCgkJa2ZyZWUoYXR0cmliLT5uYW1lKTsKCglpcmlhc19kZWxldGVfdmFsdWUoYXR0cmliLT52YWx1ZSk7CglhdHRyaWItPm1hZ2ljID0gfklBU19BVFRSSUJfTUFHSUM7CgoJa2ZyZWUoYXR0cmliKTsKfQoKdm9pZCBfX2lyaWFzX2RlbGV0ZV9vYmplY3Qoc3RydWN0IGlhc19vYmplY3QgKm9iaikKewoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCglpZiAob2JqLT5uYW1lKQoJCWtmcmVlKG9iai0+bmFtZSk7CgoJaGFzaGJpbl9kZWxldGUob2JqLT5hdHRyaWJzLCAoRlJFRV9GVU5DKSBfX2lyaWFzX2RlbGV0ZV9hdHRyaWIpOwoKCW9iai0+bWFnaWMgPSB+SUFTX09CSkVDVF9NQUdJQzsKCglrZnJlZShvYmopOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfb2JqZWN0IChvYmopCiAqCiAqICAgIFJlbW92ZSBvYmplY3QgZnJvbSBoYXNoYmluIGFuZCBkZWFsbG9jYXRlIGFsbCBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aAogKiAgICB3aXRoIHRoaXMgb2JqZWN0IGFuZCB0aGUgb2JqZWN0IGl0c2VsZgogKgogKi8KaW50IGlyaWFzX2RlbGV0ZV9vYmplY3Qoc3RydWN0IGlhc19vYmplY3QgKm9iaikKewoJc3RydWN0IGlhc19vYmplY3QgKm5vZGU7CgoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm4gLTE7KTsKCgkvKiBSZW1vdmUgZnJvbSBsaXN0ICovCglub2RlID0gaGFzaGJpbl9yZW1vdmVfdGhpcyhpcmlhc19vYmplY3RzLCAoaXJkYV9xdWV1ZV90ICopIG9iaik7CglpZiAoIW5vZGUpCgkJSVJEQV9ERUJVRyggMCwgIiVzKCksIG9iamVjdCBhbHJlYWR5IHJlbW92ZWQhXG4iLAoJCQkgICAgX19GVU5DVElPTl9fKTsKCgkvKiBEZXN0cm95ICovCglfX2lyaWFzX2RlbGV0ZV9vYmplY3Qob2JqKTsKCglyZXR1cm4gMDsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX2RlbGV0ZV9vYmplY3QpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfZGVsZXRlX2F0dHJpYiAob2JqKQogKgogKiAgICBSZW1vdmUgYXR0cmlidXRlIGZyb20gaGFzaGJpbiBhbmQsIGlmIGl0IHdhcyB0aGUgbGFzdCBhdHRyaWJ1dGUgb2YKICogICAgdGhlIG9iamVjdCwgcmVtb3ZlIHRoZSBvYmplY3QgYXMgd2VsbC4KICoKICovCmludCBpcmlhc19kZWxldGVfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIHN0cnVjdCBpYXNfYXR0cmliICphdHRyaWIsCgkJCWludCBjbGVhbm9iamVjdCkKewoJc3RydWN0IGlhc19hdHRyaWIgKm5vZGU7CgoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKGF0dHJpYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCgkvKiBSZW1vdmUgYXR0cmlidXRlIGZyb20gb2JqZWN0ICovCglub2RlID0gaGFzaGJpbl9yZW1vdmVfdGhpcyhvYmotPmF0dHJpYnMsIChpcmRhX3F1ZXVlX3QgKikgYXR0cmliKTsKCWlmICghbm9kZSkKCQlyZXR1cm4gMDsgLyogQWxyZWFkeSByZW1vdmVkIG9yIG5vbi1leGlzdGVudCAqLwoKCS8qIERlYWxsb2NhdGUgYXR0cmlidXRlICovCglfX2lyaWFzX2RlbGV0ZV9hdHRyaWIobm9kZSk7CgoJLyogQ2hlY2sgaWYgb2JqZWN0IGhhcyBzdGlsbCBzb21lIGF0dHJpYnV0ZXMsIGRlc3Ryb3kgaXQgaWYgbm9uZS4KCSAqIEF0IGZpcnN0IGdsYW5jZSwgdGhpcyBsb29rIGRhbmdlcm91cywgYXMgdGhlIGtlcm5lbCByZWZlcmVuY2UKCSAqIHZhcmlvdXMgSUFTIG9iamVjdHMuIEhvd2V2ZXIsIHdlIG9ubHkgdXNlIHRoaXMgZnVuY3Rpb24gb24KCSAqIHVzZXIgYXR0cmlidXRlcywgbm90IGtlcm5lbCBhdHRyaWJ1dGVzLCBzbyB0aGVyZSBpcyBubyByaXNrCgkgKiBvZiBkZWxldGluZyBhIGtlcm5lbCBvYmplY3QgdGhpcyB3YXkuIEplYW4gSUkgKi8KCW5vZGUgPSAoc3RydWN0IGlhc19hdHRyaWIgKikgaGFzaGJpbl9nZXRfZmlyc3Qob2JqLT5hdHRyaWJzKTsKCWlmIChjbGVhbm9iamVjdCAmJiAhbm9kZSkKCQlpcmlhc19kZWxldGVfb2JqZWN0KG9iaik7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2luc2VydF9vYmplY3QgKG9iaikKICoKICogICAgSW5zZXJ0IGFuIG9iamVjdCBpbnRvIHRoZSBMTS1JQVMgZGF0YWJhc2UKICoKICovCnZvaWQgaXJpYXNfaW5zZXJ0X29iamVjdChzdHJ1Y3QgaWFzX29iamVjdCAqb2JqKQp7CglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOwoKCWhhc2hiaW5faW5zZXJ0KGlyaWFzX29iamVjdHMsIChpcmRhX3F1ZXVlX3QgKikgb2JqLCAwLCBvYmotPm5hbWUpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfaW5zZXJ0X29iamVjdCk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19maW5kX29iamVjdCAobmFtZSkKICoKICogICAgRmluZCBvYmplY3Qgd2l0aCBnaXZlbiBuYW1lCiAqCiAqLwpzdHJ1Y3QgaWFzX29iamVjdCAqaXJpYXNfZmluZF9vYmplY3QoY2hhciAqbmFtZSkKewoJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoKCS8qIFVuc2FmZSAobG9ja2luZyksIG9iamVjdCBtaWdodCBjaGFuZ2UgKi8KCXJldHVybiBoYXNoYmluX2xvY2tfZmluZChpcmlhc19vYmplY3RzLCAwLCBuYW1lKTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX2ZpbmRfb2JqZWN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2ZpbmRfYXR0cmliIChvYmosIG5hbWUpCiAqCiAqICAgIEZpbmQgbmFtZWQgYXR0cmlidXRlIGluIG9iamVjdAogKgogKi8Kc3RydWN0IGlhc19hdHRyaWIgKmlyaWFzX2ZpbmRfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIGNoYXIgKm5hbWUpCnsKCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CgoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybiBOVUxMOyk7CglJUkRBX0FTU0VSVChuYW1lICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CgoJYXR0cmliID0gaGFzaGJpbl9sb2NrX2ZpbmQob2JqLT5hdHRyaWJzLCAwLCBuYW1lKTsKCWlmIChhdHRyaWIgPT0gTlVMTCkKCQlyZXR1cm4gTlVMTDsKCgkvKiBVbnNhZmUgKGxvY2tpbmcpLCBhdHRyaWIgbWlnaHQgY2hhbmdlICovCglyZXR1cm4gYXR0cmliOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfZmluZF9hdHRyaWIpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfYWRkX2F0dHJpYnV0ZSAob2JqLCBhdHRyaWIpCiAqCiAqICAgIEFkZCBhdHRyaWJ1dGUgdG8gb2JqZWN0CiAqCiAqLwpzdGF0aWMgdm9pZCBpcmlhc19hZGRfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIHN0cnVjdCBpYXNfYXR0cmliICphdHRyaWIsCgkJCSAgICAgaW50IG93bmVyKQp7CglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOwoKCUlSREFfQVNTRVJUKGF0dHJpYiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKGF0dHJpYi0+bWFnaWMgPT0gSUFTX0FUVFJJQl9NQUdJQywgcmV0dXJuOyk7CgoJLyogU2V0IGlmIGF0dHJpYiBpcyBvd25lZCBieSBrZXJuZWwgb3IgdXNlciBzcGFjZSAqLwoJYXR0cmliLT52YWx1ZS0+b3duZXIgPSBvd25lcjsKCgloYXNoYmluX2luc2VydChvYmotPmF0dHJpYnMsIChpcmRhX3F1ZXVlX3QgKikgYXR0cmliLCAwLCBhdHRyaWItPm5hbWUpOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhc19vYmplY3RfY2hhbmdlX2F0dHJpYnV0ZSAob2JqX25hbWUsIGF0dHJpYl9uYW1lLCBuZXdfdmFsdWUpCiAqCiAqICAgIENoYW5nZSB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0cyBhdHRyaWJ1dGUuCiAqCiAqLwppbnQgaXJpYXNfb2JqZWN0X2NoYW5nZV9hdHRyaWJ1dGUoY2hhciAqb2JqX25hbWUsIGNoYXIgKmF0dHJpYl9uYW1lLAoJCQkJICBzdHJ1Y3QgaWFzX3ZhbHVlICpuZXdfdmFsdWUpCnsKCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgkvKiBGaW5kIG9iamVjdCAqLwoJb2JqID0gaGFzaGJpbl9sb2NrX2ZpbmQoaXJpYXNfb2JqZWN0cywgMCwgb2JqX25hbWUpOwoJaWYgKG9iaiA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGZpbmQgb2JqZWN0OiAlc1xuIiwgX19GVU5DVElPTl9fLAoJCQkgICAgIG9ial9uYW1lKTsKCQlyZXR1cm4gLTE7Cgl9CgoJLyogU2xpZ2h0bHkgdW5zYWZlIChvYmogbWlnaHQgZ2V0IHJlbW92ZWQgdW5kZXIgdXMpICovCglzcGluX2xvY2tfaXJxc2F2ZSgmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoKCS8qIEZpbmQgYXR0cmlidXRlICovCglhdHRyaWIgPSBoYXNoYmluX2ZpbmQob2JqLT5hdHRyaWJzLCAwLCBhdHRyaWJfbmFtZSk7CglpZiAoYXR0cmliID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gZmluZCBhdHRyaWJ1dGU6ICVzXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXywgYXR0cmliX25hbWUpOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKCBhdHRyaWItPnZhbHVlLT50eXBlICE9IG5ld192YWx1ZS0+dHlwZSkgewoJCUlSREFfREVCVUcoIDAsICIlcygpLCBjaGFuZ2luZyB2YWx1ZSB0eXBlIG5vdCBhbGxvd2VkIVxuIiwKCQkJICAgIF9fRlVOQ1RJT05fXyk7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJCXJldHVybiAtMTsKCX0KCgkvKiBEZWxldGUgb2xkIHZhbHVlICovCglpcmlhc19kZWxldGVfdmFsdWUoYXR0cmliLT52YWx1ZSk7CgoJLyogSW5zZXJ0IG5ldyB2YWx1ZSAqLwoJYXR0cmliLT52YWx1ZSA9IG5ld192YWx1ZTsKCgkvKiBTdWNjZXNzICovCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CglyZXR1cm4gMDsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX29iamVjdF9jaGFuZ2VfYXR0cmlidXRlKTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX29iamVjdF9hZGRfaW50ZWdlcl9hdHRyaWIgKG9iaiwgbmFtZSwgdmFsdWUpCiAqCiAqICAgIEFkZCBhbiBpbnRlZ2VyIGF0dHJpYnV0ZSB0byBhbiBMTS1JQVMgb2JqZWN0CiAqCiAqLwp2b2lkIGlyaWFzX2FkZF9pbnRlZ2VyX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBjaGFyICpuYW1lLCBpbnQgdmFsdWUsCgkJCSAgICAgIGludCBvd25lcikKewoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm47KTsKCglhdHRyaWIgPSAoc3RydWN0IGlhc19hdHRyaWIgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc19hdHRyaWIpLAoJCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKCWlmIChhdHRyaWIgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJ1dGUhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoJbWVtc2V0KGF0dHJpYiwgMCwgc2l6ZW9mKCBzdHJ1Y3QgaWFzX2F0dHJpYikpOwoKCWF0dHJpYi0+bWFnaWMgPSBJQVNfQVRUUklCX01BR0lDOwoJYXR0cmliLT5uYW1lID0gc3RybmR1cChuYW1lLCBJQVNfTUFYX0FUVFJJQk5BTUUpOwoKCS8qIEluc2VydCB2YWx1ZSAqLwoJYXR0cmliLT52YWx1ZSA9IGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlKHZhbHVlKTsKCglpcmlhc19hZGRfYXR0cmliKG9iaiwgYXR0cmliLCBvd25lcik7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIpOwoKIC8qCiAqIEZ1bmN0aW9uIGlyaWFzX2FkZF9vY3RzZXFfYXR0cmliIChvYmosIG5hbWUsIG9jdGV0X3NlcSwgbGVuKQogKgogKiAgICBBZGQgYSBvY3RldCBzZXF1ZW5jZSBhdHRyaWJ1dGUgdG8gYW4gTE0tSUFTIG9iamVjdAogKgogKi8KCnZvaWQgaXJpYXNfYWRkX29jdHNlcV9hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgY2hhciAqbmFtZSwgX191OCAqb2N0ZXRzLAoJCQkgICAgIGludCBsZW4sIGludCBvd25lcikKewoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOwoKCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvY3RldHMgIT0gTlVMTCwgcmV0dXJuOyk7CgoJYXR0cmliID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfYXR0cmliKSwKCQkJCQkgICAgICAgR0ZQX0FUT01JQyk7CglpZiAoYXR0cmliID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlidXRlIVxuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCW1lbXNldChhdHRyaWIsIDAsIHNpemVvZiggc3RydWN0IGlhc19hdHRyaWIpKTsKCglhdHRyaWItPm1hZ2ljID0gSUFTX0FUVFJJQl9NQUdJQzsKCWF0dHJpYi0+bmFtZSA9IHN0cm5kdXAobmFtZSwgSUFTX01BWF9BVFRSSUJOQU1FKTsKCglhdHRyaWItPnZhbHVlID0gaXJpYXNfbmV3X29jdHNlcV92YWx1ZSggb2N0ZXRzLCBsZW4pOwoKCWlyaWFzX2FkZF9hdHRyaWIob2JqLCBhdHRyaWIsIG93bmVyKTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX2FkZF9vY3RzZXFfYXR0cmliKTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX29iamVjdF9hZGRfc3RyaW5nX2F0dHJpYiAob2JqLCBzdHJpbmcpCiAqCiAqICAgIEFkZCBhIHN0cmluZyBhdHRyaWJ1dGUgdG8gYW4gTE0tSUFTIG9iamVjdAogKgogKi8Kdm9pZCBpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSwKCQkJICAgICBpbnQgb3duZXIpCnsKCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CgoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCglJUkRBX0FTU0VSVChuYW1lICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQodmFsdWUgIT0gTlVMTCwgcmV0dXJuOyk7CgoJYXR0cmliID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGttYWxsb2Moc2l6ZW9mKCBzdHJ1Y3QgaWFzX2F0dHJpYiksCgkJCQkJICAgICAgIEdGUF9BVE9NSUMpOwoJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgltZW1zZXQoYXR0cmliLCAwLCBzaXplb2YoIHN0cnVjdCBpYXNfYXR0cmliKSk7CgoJYXR0cmliLT5tYWdpYyA9IElBU19BVFRSSUJfTUFHSUM7CglhdHRyaWItPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQVRUUklCTkFNRSk7CgoJYXR0cmliLT52YWx1ZSA9IGlyaWFzX25ld19zdHJpbmdfdmFsdWUodmFsdWUpOwoKCWlyaWFzX2FkZF9hdHRyaWIob2JqLCBhdHRyaWIsIG93bmVyKTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlIChpbnRlZ2VyKQogKgogKiAgICBDcmVhdGUgbmV3IElBUyBpbnRlZ2VyIHZhbHVlCiAqCiAqLwpzdHJ1Y3QgaWFzX3ZhbHVlICppcmlhc19uZXdfaW50ZWdlcl92YWx1ZShpbnQgaW50ZWdlcikKewoJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CgoJdmFsdWUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSwgR0ZQX0FUT01JQyk7CglpZiAodmFsdWUgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCW1lbXNldCh2YWx1ZSwgMCwgc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpKTsKCgl2YWx1ZS0+dHlwZSA9IElBU19JTlRFR0VSOwoJdmFsdWUtPmxlbiA9IDQ7Cgl2YWx1ZS0+dC5pbnRlZ2VyID0gaW50ZWdlcjsKCglyZXR1cm4gdmFsdWU7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19uZXdfaW50ZWdlcl92YWx1ZSk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19uZXdfc3RyaW5nX3ZhbHVlIChzdHJpbmcpCiAqCiAqICAgIENyZWF0ZSBuZXcgSUFTIHN0cmluZyB2YWx1ZQogKgogKiBQZXIgSXJMTVAgMS4xLCA0LjMuMy4yLCBzdHJpbmdzIGFyZSB1cCB0byAyNTYgY2hhcnMgLSBKZWFuIElJCiAqLwpzdHJ1Y3QgaWFzX3ZhbHVlICppcmlhc19uZXdfc3RyaW5nX3ZhbHVlKGNoYXIgKnN0cmluZykKewoJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CgoJdmFsdWUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSwgR0ZQX0FUT01JQyk7CglpZiAodmFsdWUgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCW1lbXNldCggdmFsdWUsIDAsIHNpemVvZiggc3RydWN0IGlhc192YWx1ZSkpOwoKCXZhbHVlLT50eXBlID0gSUFTX1NUUklORzsKCXZhbHVlLT5jaGFyc2V0ID0gQ1NfQVNDSUk7Cgl2YWx1ZS0+dC5zdHJpbmcgPSBzdHJuZHVwKHN0cmluZywgSUFTX01BWF9TVFJJTkcpOwoJdmFsdWUtPmxlbiA9IHN0cmxlbih2YWx1ZS0+dC5zdHJpbmcpOwoKCXJldHVybiB2YWx1ZTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX25ld19zdHJpbmdfdmFsdWUpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfbmV3X29jdHNlcV92YWx1ZSAob2N0ZXRzLCBsZW4pCiAqCiAqICAgIENyZWF0ZSBuZXcgSUFTIG9jdGV0LXNlcXVlbmNlIHZhbHVlCiAqCiAqIFBlciBJckxNUCAxLjEsIDQuMy4zLjIsIG9jdGV0LXNlcXVlbmNlIGFyZSB1cCB0byAxMDI0IGJ5dGVzIC0gSmVhbiBJSQogKi8Kc3RydWN0IGlhc192YWx1ZSAqaXJpYXNfbmV3X29jdHNlcV92YWx1ZShfX3U4ICpvY3RzZXEgLCBpbnQgbGVuKQp7CglzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZTsKCgl2YWx1ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpLCBHRlBfQVRPTUlDKTsKCWlmICh2YWx1ZSA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoJbWVtc2V0KHZhbHVlLCAwLCBzaXplb2Yoc3RydWN0IGlhc192YWx1ZSkpOwoKCXZhbHVlLT50eXBlID0gSUFTX09DVF9TRVE7CgkvKiBDaGVjayBsZW5ndGggKi8KCWlmKGxlbiA+IElBU19NQVhfT0NURVRfU1RSSU5HKQoJCWxlbiA9IElBU19NQVhfT0NURVRfU1RSSU5HOwoJdmFsdWUtPmxlbiA9IGxlbjsKCgl2YWx1ZS0+dC5vY3Rfc2VxID0ga21hbGxvYyhsZW4sIEdGUF9BVE9NSUMpOwoJaWYgKHZhbHVlLT50Lm9jdF9zZXEgPT0gTlVMTCl7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWtmcmVlKHZhbHVlKTsKCQlyZXR1cm4gTlVMTDsKCX0KCW1lbWNweSh2YWx1ZS0+dC5vY3Rfc2VxLCBvY3RzZXEgLCBsZW4pOwoJcmV0dXJuIHZhbHVlOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfbmV3X29jdHNlcV92YWx1ZSk7CgpzdHJ1Y3QgaWFzX3ZhbHVlICppcmlhc19uZXdfbWlzc2luZ192YWx1ZSh2b2lkKQp7CglzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZTsKCgl2YWx1ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpLCBHRlBfQVRPTUlDKTsKCWlmICh2YWx1ZSA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoJbWVtc2V0KHZhbHVlLCAwLCBzaXplb2Yoc3RydWN0IGlhc192YWx1ZSkpOwoKCXZhbHVlLT50eXBlID0gSUFTX01JU1NJTkc7Cgl2YWx1ZS0+bGVuID0gMDsKCglyZXR1cm4gdmFsdWU7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2RlbGV0ZV92YWx1ZSAodmFsdWUpCiAqCiAqICAgIERlbGV0ZSBJQVMgdmFsdWUKICoKICovCnZvaWQgaXJpYXNfZGVsZXRlX3ZhbHVlKHN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlKQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHZhbHVlICE9IE5VTEwsIHJldHVybjspOwoKCXN3aXRjaCAodmFsdWUtPnR5cGUpIHsKCWNhc2UgSUFTX0lOVEVHRVI6IC8qIEZhbGx0aHJvdWdoICovCgljYXNlIElBU19NSVNTSU5HOgoJCS8qIE5vIG5lZWQgdG8gZGVhbGxvY2F0ZSAqLwoJCWJyZWFrOwoJY2FzZSBJQVNfU1RSSU5HOgoJCS8qIElmIHN0cmluZywgZGVhbGxvY2F0ZSBzdHJpbmcgKi8KCQlpZiAodmFsdWUtPnQuc3RyaW5nICE9IE5VTEwpCgkJCWtmcmVlKHZhbHVlLT50LnN0cmluZyk7CgkJYnJlYWs7CgljYXNlIElBU19PQ1RfU0VROgoJCS8qIElmIGJ5dGUgc3RyZWFtLCBkZWFsbG9jYXRlIGJ5dGUgc3RyZWFtICovCgkJIGlmICh2YWx1ZS0+dC5vY3Rfc2VxICE9IE5VTEwpCgkJCSBrZnJlZSh2YWx1ZS0+dC5vY3Rfc2VxKTsKCQkgYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gdmFsdWUgdHlwZSFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJYnJlYWs7Cgl9CglrZnJlZSh2YWx1ZSk7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19kZWxldGVfdmFsdWUpOwo=