LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmxhbl9wcm92aWRlci5jCiAqIFZlcnNpb246ICAgICAgIDAuOQogKiBEZXNjcmlwdGlvbjogICBJckRBIExBTiBBY2Nlc3MgUHJvdG9jb2wgSW1wbGVtZW50YXRpb24KICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFN1biBBdWcgMzEgMjA6MTQ6MzcgMTk5NwogKiBNb2RpZmllZCBhdDogICBTYXQgT2N0IDMwIDEyOjUyOjEwIDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBTb3VyY2VzOiAgICAgICBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIgPGJlY2tlckBDRVNESVMuZ3NmYy5uYXNhLmdvdj4KICogICAgICAgICAgICAgICAgc2xpcC5jIGJ5IExhdXJlbmNlIEN1bGhhbmUsICAgPGxvekBob2xtZXMuZGVtb24uY28udWs+CiAqICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdXdhbHQubmwubXVnbmV0Lm9yZz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sCiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgojaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgoKI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lydHRwLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9jb21tb24uaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V0aC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXZlbnQuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX3Byb3ZpZGVyLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9maWx0ZXIuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NsaWVudC5oPgoKc3RhdGljIHZvaWQgaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkJICAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsCgkJCQkJICAgICAgX191MzIgbWF4X3NkdV9zaXplLAoJCQkJCSAgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAoJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwoKLyoKICogRnVuY3Rpb24gaXJsYW5fcHJvdmlkZXJfY29udHJvbF9kYXRhX2luZGljYXRpb24gKGhhbmRsZSwgc2tiKQogKgogKiAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGRhdGEgdGhhdCBpcyByZWNlaXZlZCBvbiB0aGUgY29udHJvbCBjaGFubmVsCiAqCiAqLwpzdGF0aWMgaW50IGlybGFuX3Byb3ZpZGVyX2RhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoJX191OCBjb2RlOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CgoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOwoKCWNvZGUgPSBza2ItPmRhdGFbMF07Cglzd2l0Y2goY29kZSkgewoJY2FzZSBDTURfR0VUX1BST1ZJREVSX0lORk86CgkJSVJEQV9ERUJVRyg0LCAiR290IEdFVF9QUk9WSURFUl9JTkZPIGNvbW1hbmQhXG4iKTsKCQlpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9HRVRfSU5GT19DTUQsIHNrYik7CgkJYnJlYWs7CgoJY2FzZSBDTURfR0VUX01FRElBX0NIQVI6CgkJSVJEQV9ERUJVRyg0LCAiR290IEdFVF9NRURJQV9DSEFSIGNvbW1hbmQhXG4iKTsKCQlpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9HRVRfTUVESUFfQ01ELCBza2IpOwoJCWJyZWFrOwoJY2FzZSBDTURfT1BFTl9EQVRBX0NIQU5ORUw6CgkJSVJEQV9ERUJVRyg0LCAiR290IE9QRU5fREFUQV9DSEFOTkVMIGNvbW1hbmQhXG4iKTsKCQlpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9PUEVOX0RBVEFfQ01ELCBza2IpOwoJCWJyZWFrOwoJY2FzZSBDTURfRklMVEVSX09QRVJBVElPTjoKCQlJUkRBX0RFQlVHKDQsICJHb3QgRklMVEVSX09QRVJBVElPTiBjb21tYW5kIVxuIik7CgkJaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc2VsZiwgSVJMQU5fRklMVEVSX0NPTkZJR19DTUQsIHNrYik7CgkJYnJlYWs7CgljYXNlIENNRF9SRUNPTk5FQ1RfREFUQV9DSEFOOgoJCUlSREFfREVCVUcoMiwgIiVzKCksIEdvdCBSRUNPTk5FQ1RfREFUQV9DSEFOIGNvbW1hbmRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCUlSREFfREVCVUcoMiwgIiVzKCksIE5PVCBJTVBMRU1FTlRFRFxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7CgljYXNlIENNRF9DTE9TRV9EQVRBX0NIQU46CgkJSVJEQV9ERUJVRygyLCAiR290IENMT1NFX0RBVEFfQ0hBTiBjb21tYW5kIVxuIik7CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgTk9UIElNUExFTUVOVEVEXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBjb21tYW5kIVxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7Cgl9CglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9pbmRpY2F0aW9uIChoYW5kbGUsIHNrYiwgcHJpdikKICoKICogICAgR290IGNvbm5lY3Rpb24gZnJvbSBwZWVyIElyTEFOIGNsaWVudAogKgogKi8Kc3RhdGljIHZvaWQgaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkJICAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsCgkJCQkJICAgICAgX191MzIgbWF4X3NkdV9zaXplLAoJCQkJCSAgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAoJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCXN0cnVjdCB0c2FwX2NiICp0c2FwOwoJX191MzIgc2FkZHIsIGRhZGRyOwoKCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOwoJdHNhcCA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBzYXA7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCglJUkRBX0FTU0VSVCh0c2FwID09IHNlbGYtPnByb3ZpZGVyLnRzYXBfY3RybCxyZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPnByb3ZpZGVyLnN0YXRlID09IElSTEFOX0lETEUsIHJldHVybjspOwoKCWRhZGRyID0gaXJ0dHBfZ2V0X2RhZGRyKHRzYXApOwoJc2FkZHIgPSBpcnR0cF9nZXRfc2FkZHIodHNhcCk7CglzZWxmLT5wcm92aWRlci5tYXhfc2R1X3NpemUgPSBtYXhfc2R1X3NpemU7CglzZWxmLT5wcm92aWRlci5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CgoJaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc2VsZiwgSVJMQU5fQ09OTkVDVF9JTkRJQ0FUSU9OLCBOVUxMKTsKCgkvKgoJICogSWYgd2UgYXJlIGluIHBlZXIgbW9kZSwgdGhlIGNsaWVudCBtYXkgbm90IGhhdmUgZ290IHRoZSBkaXNjb3ZlcnkKCSAqIGluZGljYXRpb24gaXQgbmVlZHMgdG8gbWFrZSBwcm9ncmVzcy4gSWYgdGhlIGNsaWVudCBpcyBzdGlsbCBpbgoJICogSURMRSBzdGF0ZSwgd2UgbXVzdCBraWNrIGl0LgoJICovCglpZiAoKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSAmJgoJICAgIChzZWxmLT5jbGllbnQuc3RhdGUgPT0gSVJMQU5fSURMRSkpCgl7CgkJaXJsYW5fY2xpZW50X3dha2V1cChzZWxmLCBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIpOwoJfQp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9wcm92aWRlcl9jb25uZWN0X3Jlc3BvbnNlIChoYW5kbGUpCiAqCiAqICAgIEFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9uCiAqCiAqLwp2b2lkIGlybGFuX3Byb3ZpZGVyX2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IGlybGFuX2NiICpzZWxmLAoJCQkJICAgICBzdHJ1Y3QgdHNhcF9jYiAqdHNhcCkKewoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCgkvKiBKdXN0IGFjY2VwdCAqLwoJaXJ0dHBfY29ubmVjdF9yZXNwb25zZSh0c2FwLCBJUkxBTl9NVFUsIE5VTEwpOwp9CgpzdGF0aWMgdm9pZCBpcmxhbl9wcm92aWRlcl9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCQkJIExNX1JFQVNPTiByZWFzb24sCgkJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCXN0cnVjdCB0c2FwX2NiICp0c2FwOwoKCUlSREFfREVCVUcoNCwgIiVzKCksIHJlYXNvbj0lZFxuIiwgX19GVU5DVElPTl9fICwgcmVhc29uKTsKCglzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKCXRzYXAgPSAoc3RydWN0IHRzYXBfY2IgKikgc2FwOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCh0c2FwICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQodHNhcC0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOwoKCUlSREFfQVNTRVJUKHRzYXAgPT0gc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsLCByZXR1cm47KTsKCglpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9MTVBfRElTQ09OTkVDVCwgTlVMTCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX3BhcnNlX29wZW5fZGF0YV9jbWQgKHNlbGYsIHNrYikKICoKICoKICoKICovCmludCBpcmxhbl9wYXJzZV9vcGVuX2RhdGFfY21kKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJaW50IHJldDsKCglyZXQgPSBpcmxhbl9wcm92aWRlcl9wYXJzZV9jb21tYW5kKHNlbGYsIENNRF9PUEVOX0RBVEFfQ0hBTk5FTCwgc2tiKTsKCgkvKiBPcGVuIGRhdGEgY2hhbm5lbCAqLwoJaXJsYW5fb3Blbl9kYXRhX3RzYXAoc2VsZik7CgoJcmV0dXJuIHJldDsKfQoKLyoKICogRnVuY3Rpb24gcGFyc2VfY29tbWFuZCAoc2tiKQogKgogKiAgICBFeHRyYWN0IGFsbCBwYXJhbWV0ZXJzIGZyb20gcmVjZWl2ZWQgYnVmZmVyLCB0aGVuIGZlZWQgdGhlbSB0bwogKiAgICBjaGVja19wYXJhbXMgZm9yIHBhcnNpbmcKICoKICovCmludCBpcmxhbl9wcm92aWRlcl9wYXJzZV9jb21tYW5kKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgaW50IGNtZCwKCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglfX3U4ICpmcmFtZTsKCV9fdTggKnB0cjsKCWludCBjb3VudDsKCV9fdTE2IHZhbF9sZW47CglpbnQgaTsKCWNoYXIgKm5hbWU7CgljaGFyICp2YWx1ZTsKCWludCByZXQgPSBSU1BfU1VDQ0VTUzsKCglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC1SU1BfUFJPVE9DT0xfRVJST1I7KTsKCglJUkRBX0RFQlVHKDQsICIlcygpLCBza2ItPmxlbj0lZFxuIiwgX19GVU5DVElPTl9fICwgKGludClza2ItPmxlbik7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLVJTUF9QUk9UT0NPTF9FUlJPUjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtUlNQX1BST1RPQ09MX0VSUk9SOyk7CgoJaWYgKCFza2IpCgkJcmV0dXJuIC1SU1BfUFJPVE9DT0xfRVJST1I7CgoJZnJhbWUgPSBza2ItPmRhdGE7CgoJbmFtZSA9IGttYWxsb2MoMjU1LCBHRlBfQVRPTUlDKTsKCWlmICghbmFtZSkKCQlyZXR1cm4gLVJTUF9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTOwoJdmFsdWUgPSBrbWFsbG9jKDEwMTYsIEdGUF9BVE9NSUMpOwoJaWYgKCF2YWx1ZSkgewoJCWtmcmVlKG5hbWUpOwoJCXJldHVybiAtUlNQX0lOU1VGRklDSUVOVF9SRVNPVVJDRVM7Cgl9CgoJLyogSG93IG1hbnkgcGFyYW1ldGVycz8gKi8KCWNvdW50ID0gZnJhbWVbMV07CgoJSVJEQV9ERUJVRyg0LCAiR290ICVkIHBhcmFtZXRlcnNcbiIsIGNvdW50KTsKCglwdHIgPSBmcmFtZSsyOwoKCS8qIEZvciBhbGwgcGFyYW1ldGVycyAqLwoJZm9yIChpPTA7IGk8Y291bnQ7aSsrKSB7CgkJcmV0ID0gaXJsYW5fZXh0cmFjdF9wYXJhbShwdHIsIG5hbWUsIHZhbHVlLCAmdmFsX2xlbik7CgkJaWYgKHJldCA8IDApIHsKCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSXJMQU4sIEVycm9yIVxuIiwgX19GVU5DVElPTl9fICk7CgkJCWJyZWFrOwoJCX0KCQlwdHIrPXJldDsKCQlyZXQgPSBSU1BfU1VDQ0VTUzsKCQlpcmxhbl9jaGVja19jb21tYW5kX3BhcmFtKHNlbGYsIG5hbWUsIHZhbHVlKTsKCX0KCS8qIENsZWFudXAgKi8KCWtmcmVlKG5hbWUpOwoJa2ZyZWUodmFsdWUpOwoKCXJldHVybiByZXQ7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX3Byb3ZpZGVyX3NlbmRfcmVwbHkgKHNlbGYsIGluZm8pCiAqCiAqICAgIFNlbmQgcmVwbHkgdG8gcXVlcnkgdG8gcGVlciBJckxBTiBsYXllcgogKgogKi8Kdm9pZCBpcmxhbl9wcm92aWRlcl9zZW5kX3JlcGx5KHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgaW50IGNvbW1hbmQsCgkJCSAgICAgICBpbnQgcmV0X2NvZGUpCnsKCXN0cnVjdCBza19idWZmICpza2I7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCglza2IgPSBhbGxvY19za2IoSVJMQU5fTUFYX0hFQURFUiArIElSTEFOX0NNRF9IRUFERVIgKwoJCQkvKiBCaWdnZXIgcGFyYW0gbGVuZ3RoIGNvbWVzIGZyb20gQ01EX0dFVF9NRURJQV9DSEFSICovCgkJCUlSTEFOX1NUUklOR19QQVJBTUVURVJfTEVOKCJGSUxURVJfVFlQRSIsICJESVJFQ1RFRCIpICsKCQkJSVJMQU5fU1RSSU5HX1BBUkFNRVRFUl9MRU4oIkZJTFRFUl9UWVBFIiwgIkJPUkFEQ0FTVCIpICsKCQkJSVJMQU5fU1RSSU5HX1BBUkFNRVRFUl9MRU4oIkZJTFRFUl9UWVBFIiwgIk1VTFRJQ0FTVCIpICsKCQkJSVJMQU5fU1RSSU5HX1BBUkFNRVRFUl9MRU4oIkFDQ0VTU19UWVBFIiwgIkhPU1RFRCIpLAoJCQlHRlBfQVRPTUlDKTsKCglpZiAoIXNrYikKCQlyZXR1cm47CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPnByb3ZpZGVyLm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHNrYiwgMik7CgoJc3dpdGNoIChjb21tYW5kKSB7CgljYXNlIENNRF9HRVRfUFJPVklERVJfSU5GTzoKCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCgkJc2tiLT5kYXRhWzFdID0gMHgwMjsgLyogMiBwYXJhbWV0ZXJzICovCgkJc3dpdGNoIChzZWxmLT5tZWRpYSkgewoJCWNhc2UgTUVESUFfODAyXzM6CgkJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiTUVESUEiLCAiODAyLjMiKTsKCQkJYnJlYWs7CgkJY2FzZSBNRURJQV84MDJfNToKCQkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJNRURJQSIsICI4MDIuNSIpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1bmtub3duIG1lZGlhIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQkJYnJlYWs7CgkJfQoJCWlybGFuX2luc2VydF9zaG9ydF9wYXJhbShza2IsICJJUkxBTl9WRVIiLCAweDAxMDEpOwoJCWJyZWFrOwoKCWNhc2UgQ01EX0dFVF9NRURJQV9DSEFSOgoJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KCQlza2ItPmRhdGFbMV0gPSAweDA1OyAvKiA1IHBhcmFtZXRlcnMgKi8KCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9UWVBFIiwgIkRJUkVDVEVEIik7CgkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJCUk9BRENBU1QiKTsKCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9UWVBFIiwgIk1VTFRJQ0FTVCIpOwoKCQlzd2l0Y2ggKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlKSB7CgkJY2FzZSBBQ0NFU1NfRElSRUNUOgoJCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkFDQ0VTU19UWVBFIiwgIkRJUkVDVCIpOwoJCQlicmVhazsKCQljYXNlIEFDQ0VTU19QRUVSOgoJCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkFDQ0VTU19UWVBFIiwgIlBFRVIiKTsKCQkJYnJlYWs7CgkJY2FzZSBBQ0NFU1NfSE9TVEVEOgoJCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkFDQ0VTU19UWVBFIiwgIkhPU1RFRCIpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGFjY2VzcyB0eXBlXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQkJYnJlYWs7CgkJfQoJCWlybGFuX2luc2VydF9zaG9ydF9wYXJhbShza2IsICJNQVhfRlJBTUUiLCAweDA1ZWUpOwoJCWJyZWFrOwoJY2FzZSBDTURfT1BFTl9EQVRBX0NIQU5ORUw6CgkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2VzcyAqLwoJCWlmIChzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwpIHsKCQkJc2tiLT5kYXRhWzFdID0gMHgwMzsgLyogMyBwYXJhbWV0ZXJzICovCgkJCWlybGFuX2luc2VydF9zaG9ydF9wYXJhbShza2IsICJDT05fQVJCIiwKCQkJCQkJIHNlbGYtPnByb3ZpZGVyLnNlbmRfYXJiX3ZhbCk7CgkJfSBlbHNlCgkJCXNrYi0+ZGF0YVsxXSA9IDB4MDI7IC8qIDIgcGFyYW1ldGVycyAqLwoJCWlybGFuX2luc2VydF9ieXRlX3BhcmFtKHNrYiwgIkRBVEFfQ0hBTiIsIHNlbGYtPnN0c2FwX3NlbF9kYXRhKTsKCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIlJFQ09OTkVDVF9LRVkiLCAiTElOVVggUlVMRVMhIik7CgkJYnJlYWs7CgljYXNlIENNRF9GSUxURVJfT1BFUkFUSU9OOgoJCWlybGFuX2ZpbHRlcl9yZXF1ZXN0KHNlbGYsIHNrYik7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gY29tbWFuZCFcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJfQoKCWlydHRwX2RhdGFfcmVxdWVzdChzZWxmLT5wcm92aWRlci50c2FwX2N0cmwsIHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX3Byb3ZpZGVyX3JlZ2lzdGVyKHZvaWQpCiAqCiAqICAgIFJlZ2lzdGVyIHByb3ZpZGVyIHN1cHBvcnQgc28gd2UgY2FuIGFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9ucy4KICoKICovCmludCBpcmxhbl9wcm92aWRlcl9vcGVuX2N0cmxfdHNhcChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCnsKCXN0cnVjdCB0c2FwX2NiICp0c2FwOwoJbm90aWZ5X3Qgbm90aWZ5OwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CgoJLyogQ2hlY2sgaWYgYWxyZWFkeSBvcGVuICovCglpZiAoc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsKQoJCXJldHVybiAtMTsKCgkvKgoJICogIEZpcnN0IHJlZ2lzdGVyIHdlbGwga25vd24gY29udHJvbCBUU0FQCgkgKi8KCWlyZGFfbm90aWZ5X2luaXQoJm5vdGlmeSk7Cglub3RpZnkuZGF0YV9pbmRpY2F0aW9uICAgICAgID0gaXJsYW5fcHJvdmlkZXJfZGF0YV9pbmRpY2F0aW9uOwoJbm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbiAgICA9IGlybGFuX3Byb3ZpZGVyX2Nvbm5lY3RfaW5kaWNhdGlvbjsKCW5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24gPSBpcmxhbl9wcm92aWRlcl9kaXNjb25uZWN0X2luZGljYXRpb247Cglub3RpZnkuaW5zdGFuY2UgPSBzZWxmOwoJc3RybGNweShub3RpZnkubmFtZSwgIklyTEFOIGN0cmwgKHApIiwgc2l6ZW9mKG5vdGlmeS5uYW1lKSk7CgoJdHNhcCA9IGlydHRwX29wZW5fdHNhcChMU0FQX0FOWSwgMSwgJm5vdGlmeSk7CglpZiAoIXRzYXApIHsKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBHb3Qgbm8gdHNhcCFcbiIsIF9fRlVOQ1RJT05fXyApOwoJCXJldHVybiAtMTsKCX0KCXNlbGYtPnByb3ZpZGVyLnRzYXBfY3RybCA9IHRzYXA7CgoJLyogUmVnaXN0ZXIgd2l0aCBMTS1JQVMgKi8KCWlybGFuX2lhc19yZWdpc3RlcihzZWxmLCB0c2FwLT5zdHNhcF9zZWwpOwoKCXJldHVybiAwOwp9Cgo=