LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogKiAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfCAgICAKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gX198IHwgfCB8IHxfKSB8IHwgICAgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKICoKICogQ29weXJpZ2h0IChDKSAyMDAwLCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogKgogKiBJbiBvcmRlciB0byBiZSB1c2VmdWwgZm9yIGV2ZXJ5IHBvdGVudGlhbCB1c2VyLCBjdXJsIGFuZCBsaWJjdXJsIGFyZQogKiBkdWFsLWxpY2Vuc2VkIHVuZGVyIHRoZSBNUEwgYW5kIHRoZSBNSVQvWC1kZXJpdmF0ZSBsaWNlbnNlcy4KICoKICogWW91IG1heSBvcHQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlIGFuZC9vciBzZWxsCiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogKiBmdXJuaXNoZWQgdG8gZG8gc28sIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMIG9yIHRoZSBNSVQvWC1kZXJpdmF0ZQogKiBsaWNlbnNlcy4gWW91IG1heSBwaWNrIG9uZSBvZiB0aGVzZSBsaWNlbnNlcy4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQogKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKgogKiAkSWQkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioKCgpSRUNFSVZJTkcgQ09PS0lFIElORk9STUFUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBDb29raWVJbmZvICpjb29raWVfaW5pdChjaGFyICpmaWxlKTsKCQoJSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHN0b3JlIGRhdGEgaW4gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwoJY2FsbGVkIGJlZm9yZSBhbnkgY29va2llcyBhcmUgc2V0LgoKaW50IGNvb2tpZXNfc2V0KHN0cnVjdCBDb29raWVJbmZvICpjb29raWUsIGNoYXIgKmNvb2tpZV9saW5lKTsKCglUaGUgJ2Nvb2tpZV9saW5lJyBwYXJhbWV0ZXIgaXMgYSBmdWxsICJTZXQtY29va2llOiIgbGluZSBhcwoJcmVjZWl2ZWQgZnJvbSBhIHNlcnZlci4KCglUaGUgZnVuY3Rpb24gbmVlZCB0byByZXBsYWNlIHByZXZpb3VzbHkgc3RvcmVkIGxpbmVzIHRoYXQgdGhpcyBuZXcKCWxpbmUgc3VwZXJjZWVkcy4KCglJdCBtYXkgcmVtb3ZlIGxpbmVzIHRoYXQgYXJlIGV4cGlyZWQuCgoJSXQgc2hvdWxkIHJldHVybiBhbiBpbmRpY2F0aW9uIG9mIHN1Y2Nlc3MvZXJyb3IuCgoKU0VORElORyBDT09LSUUgSU5GT1JNQVRJT04KPT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBDb29raWVzICpjb29raWVfZ2V0bGlzdChzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaG9zdCwgY2hhciAqcGF0aCwgYm9vbCBzZWN1cmUpOwoKCUZvciBhIGdpdmVuIGhvc3QgYW5kIHBhdGgsIHJldHVybiBhIGxpbmtlZCBsaXN0IG9mIGNvb2tpZXMgdGhhdAoJdGhlIGNsaWVudCBzaG91bGQgc2VuZCB0byB0aGUgc2VydmVyIGlmIHVzZWQgbm93LiBUaGUgc2VjdXJlCglib29sZWFuIGluZm9ybXMgdGhlIGNvb2tpZSBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjaGlldmVkIG9yCglub3QuCgoJSXQgc2hhbGwgb25seSByZXR1cm4gY29va2llcyB0aGF0IGhhdmVuJ3QgZXhwaXJlZC4KCiAgICAKRXhhbXBsZSBzZXQgb2YgY29va2llczoKICAgIAogICAgU2V0LWNvb2tpZTogUFJPRFVDVElORk89d2VieHByZXNzOyBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IFBFUlNPTkFMSVpFPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS9mdGd3OyBzZWN1cmUKICAgIFNldC1jb29raWU6IEZpZEhpc3Q9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWRPcmRlcj1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IERpc1BlbmQ9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWREaXM9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOgogICAgU2Vzc2lvbl9LZXlANjc5MWE5ZTAtOTAxYS0xMWQwLWExYzgtOWIwMTJjODhhYTc3PW5vbmU7ZXhwaXJlcz1Nb25kYXksCiAgICAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7IGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQoqKioqLwoKI2luY2x1ZGUgInNldHVwLmgiCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAiY29va2llLmgiCiNpbmNsdWRlICJnZXRkYXRlLmgiCiNpbmNsdWRlICJzdHJlcXVhbC5oIgojaW5jbHVkZSAic3RydG9rLmgiCgovKiBUaGUgbGFzdCAjaW5jbHVkZSBmaWxlIHNob3VsZCBiZTogKi8KI2lmZGVmIE1BTExPQ0RFQlVHCiNpbmNsdWRlICJtZW1kZWJ1Zy5oIgojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIGNvb2tpZV9hZGQoKQogKgogKiBBZGQgYSBzaW5nbGUgY29va2llIGxpbmUgdG8gdGhlIGNvb2tpZSBrZWVwaW5nIG9iamVjdC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0cnVjdCBDb29raWUgKgpDdXJsX2Nvb2tpZV9hZGQoc3RydWN0IENvb2tpZUluZm8gKmMsCiAgICAgICAgICAgICAgICBib29sIGh0dHBoZWFkZXIsIC8qIFRSVUUgaWYgSFRUUCBoZWFkZXItc3R5bGUgbGluZSAqLwogICAgICAgICAgICAgICAgY2hhciAqbGluZXB0cikgLyogZmlyc3Qgbm9uLXNwYWNlIG9mIHRoZSBsaW5lICovCnsKICBzdHJ1Y3QgQ29va2llICpjbGlzdDsKICBjaGFyIHdoYXRbTUFYX0NPT0tJRV9MSU5FXTsKICBjaGFyIG5hbWVbTUFYX05BTUVdOwogIGNoYXIgKnB0cjsKICBjaGFyICpzZW1pcHRyOwogIHN0cnVjdCBDb29raWUgKmNvOwogIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogIGJvb2wgcmVwbGFjZV9vbGQgPSBGQUxTRTsKCiAgLyogRmlyc3QsIGFsbG9jIGFuZCBpbml0IGEgbmV3IHN0cnVjdCBmb3IgaXQgKi8KICBjbyA9IChzdHJ1Y3QgQ29va2llICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgQ29va2llKSk7CiAgaWYoIWNvKQogICAgcmV0dXJuIE5VTEw7IC8qIGJhaWwgb3V0IGlmIHdlJ3JlIHRoaXMgbG93IG9uIG1lbW9yeSAqLwoKICAvKiBjbGVhciB0aGUgd2hvbGUgc3RydWN0IGZpcnN0ICovCiAgbWVtc2V0KGNvLCAwLCBzaXplb2Yoc3RydWN0IENvb2tpZSkpOwoJICAgIAogIGlmKGh0dHBoZWFkZXIpIHsKICAgIC8qIFRoaXMgbGluZSB3YXMgcmVhZCBvZmYgYSBIVFRQLWhlYWRlciAqLwoKICAgIHNlbWlwdHI9c3RyY2hyKGxpbmVwdHIsICc7Jyk7IC8qIGZpcnN0LCBmaW5kIGEgc2VtaWNvbG9uICovCiAgICBwdHIgPSBsaW5lcHRyOwogICAgZG8gewogICAgICBpZihzZW1pcHRyKQogICAgICAgICpzZW1pcHRyPSdcMCc7IC8qIHplcm8gdGVybWluYXRlIGZvciBhIHdoaWxlICovCiAgICAgIC8qIHdlIGhhdmUgYSA8d2hhdD49PHRoaXM+IHBhaXIgb3IgYSAnc2VjdXJlJyB3b3JkIGhlcmUgKi8KICAgICAgaWYoc3RyY2hyKHB0ciwgJz0nKSkgewogICAgICAgIG5hbWVbMF09d2hhdFswXT0wOyAvKiBpbml0IHRoZSBidWZmZXJzICovCiAgICAgICAgaWYoMSA8PSBzc2NhbmYocHRyLCAiJSIgTUFYX05BTUVfVFhUICJbXj1dPSUiCiAgICAgICAgICAgICAgICAgICAgICAgTUFYX0NPT0tJRV9MSU5FX1RYVCAiW15cclxuXSIsCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgd2hhdCkpIHsKICAgICAgICAgIC8qIHRoaXMgaXMgYSBsZWdhbCA8d2hhdD49PHRoaXM+IHBhaXIgKi8KICAgICAgICAgIGlmKHN0cmVxdWFsKCJwYXRoIiwgbmFtZSkpIHsKICAgICAgICAgICAgY28tPnBhdGg9c3RyZHVwKHdoYXQpOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZihzdHJlcXVhbCgiZG9tYWluIiwgbmFtZSkpIHsKICAgICAgICAgICAgY28tPmRvbWFpbj1zdHJkdXAod2hhdCk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKHN0cmVxdWFsKCJ2ZXJzaW9uIiwgbmFtZSkpIHsKICAgICAgICAgICAgY28tPnZlcnNpb249c3RyZHVwKHdoYXQpOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZihzdHJlcXVhbCgibWF4LWFnZSIsIG5hbWUpKSB7CiAgICAgICAgICAgIC8qIERlZmluZWQgaW4gUkZDMjEwOToKCiAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIE1heC1BZ2UgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxpZmV0aW1lIG9mIHRoZQogICAgICAgICAgICAgICBjb29raWUsIGluIHNlY29uZHMuICBUaGUgZGVsdGEtc2Vjb25kcyB2YWx1ZSBpcyBhIGRlY2ltYWwgbm9uLQogICAgICAgICAgICAgICBuZWdhdGl2ZSBpbnRlZ2VyLiAgQWZ0ZXIgZGVsdGEtc2Vjb25kcyBzZWNvbmRzIGVsYXBzZSwgdGhlCiAgICAgICAgICAgICAgIGNsaWVudCBzaG91bGQgZGlzY2FyZCB0aGUgY29va2llLiAgQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIHRoZQogICAgICAgICAgICAgICBjb29raWUgc2hvdWxkIGJlIGRpc2NhcmRlZCBpbW1lZGlhdGVseS4KCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjby0+bWF4YWdlID0gc3RyZHVwKHdoYXQpOwogICAgICAgICAgICBjby0+ZXhwaXJlcyA9CiAgICAgICAgICAgICAgYXRvaSgoKmNvLT5tYXhhZ2U9PSdcIicpPyZjby0+bWF4YWdlWzFdOiZjby0+bWF4YWdlWzBdKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYoc3RyZXF1YWwoImV4cGlyZXMiLCBuYW1lKSkgewogICAgICAgICAgICBjby0+ZXhwaXJlc3RyPXN0cmR1cCh3aGF0KTsKICAgICAgICAgICAgY28tPmV4cGlyZXMgPSBjdXJsX2dldGRhdGUod2hhdCwgJm5vdyk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKCFjby0+bmFtZSkgewogICAgICAgICAgICBjby0+bmFtZSA9IHN0cmR1cChuYW1lKTsKICAgICAgICAgICAgY28tPnZhbHVlID0gc3RyZHVwKHdoYXQpOwogICAgICAgICAgfQogICAgICAgICAgLyoKICAgICAgICAgICAgZWxzZSB0aGlzIGlzIHRoZSBzZWNvbmQgKG9yIG1vcmUpIG5hbWUgd2UgZG9uJ3Qga25vdwogICAgICAgICAgICBhYm91dCEgKi8KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAvKiB0aGlzIGlzIGFuICJpbGxlZ2FsIiA8d2hhdD49PHRoaXM+IHBhaXIgKi8KICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgaWYoc3NjYW5mKHB0ciwgIiUiIE1BWF9DT09LSUVfTElORV9UWFQgIlteXHJcbl0iLAogICAgICAgICAgICAgICAgICB3aGF0KSkgewogICAgICAgICAgaWYoc3RyZXF1YWwoInNlY3VyZSIsIHdoYXQpKQogICAgICAgICAgICBjby0+c2VjdXJlID0gVFJVRTsKICAgICAgICAgIC8qIGVsc2UsCiAgICAgICAgICAgICB1bnN1cHBvcnRlZCBrZXl3b3JkIHdpdGhvdXQgYXNzaWduISAqLwoKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYoIXNlbWlwdHIpCiAgICAgICAgY29udGludWU7IC8qIHdlIGFscmVhZHkga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBjb29raWVzICovCgogICAgICAqc2VtaXB0cj0nOyc7IC8qIHB1dCB0aGUgc2VtaWNvbG9uIGJhY2sgKi8KICAgICAgcHRyPXNlbWlwdHIrMTsKICAgICAgd2hpbGUocHRyICYmICpwdHIgJiYgaXNzcGFjZSgoaW50KSpwdHIpKQogICAgICAgIHB0cisrOwogICAgICBzZW1pcHRyPXN0cmNocihwdHIsICc7Jyk7IC8qIG5vdywgZmluZCB0aGUgbmV4dCBzZW1pY29sb24gKi8KICAgIH0gd2hpbGUoc2VtaXB0cik7CiAgfQogIGVsc2UgewogICAgLyogVGhpcyBsaW5lIGlzIE5PVCBhIEhUVFAgaGVhZGVyIHN0eWxlIGxpbmUsIHdlIGRvIG9mZmVyIHN1cHBvcnQgZm9yCiAgICAgICByZWFkaW5nIHRoZSBvZGQgbmV0c2NhcGUgY29va2llcy1maWxlIGZvcm1hdCBoZXJlICovCiAgICBjaGFyICpmaXJzdHB0cjsKICAgIGNoYXIgKnRva19idWY7CiAgICBpbnQgZmllbGRzOwoKICAgIGlmKGxpbmVwdHJbMF09PScjJykgewogICAgICAvKiBkb24ndCBldmVuIHRyeSB0aGUgY29tbWVudHMgKi8KICAgICAgZnJlZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgLyogc3RyaXAgb2ZmIHRoZSBwb3NzaWJsZSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzICovCiAgICBwdHI9c3RyY2hyKGxpbmVwdHIsICdccicpOwogICAgaWYocHRyKQogICAgICAqcHRyPTA7IC8qIGNsZWFyIGl0ICovCiAgICBwdHI9c3RyY2hyKGxpbmVwdHIsICdcbicpOwogICAgaWYocHRyKQogICAgICAqcHRyPTA7IC8qIGNsZWFyIGl0ICovCgogICAgZmlyc3RwdHI9c3RydG9rX3IobGluZXB0ciwgIlx0IiwgJnRva19idWYpOyAvKiBmaXJzdCB0b2tlbml6ZSBpdCBvbiB0aGUgVEFCICovCgogICAgLyogSGVyZSdzIGEgcXVpY2sgY2hlY2sgdG8gZWxpbWluYXRlIG5vcm1hbCBIVFRQLWhlYWRlcnMgZnJvbSB0aGlzICovCiAgICBpZighZmlyc3RwdHIgfHwgc3RyY2hyKGZpcnN0cHRyLCAnOicpKSB7CiAgICAgIGZyZWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICAvKiBOb3cgbG9vcCB0aHJvdWdoIHRoZSBmaWVsZHMgYW5kIGluaXQgdGhlIHN0cnVjdCB3ZSBhbHJlYWR5IGhhdmUKICAgICAgIGFsbG9jYXRlZCAqLwogICAgZm9yKHB0cj1maXJzdHB0ciwgZmllbGRzPTA7IHB0cjsgcHRyPXN0cnRva19yKE5VTEwsICJcdCIsICZ0b2tfYnVmKSwgZmllbGRzKyspIHsKICAgICAgc3dpdGNoKGZpZWxkcykgewogICAgICBjYXNlIDA6CiAgICAgICAgY28tPmRvbWFpbiA9IHN0cmR1cChwdHIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6CiAgICAgICAgLyogVGhpcyBmaWVsZCBnb3QgaXRzIGV4cGxhbmF0aW9uIG9uIHRoZSAyM3JkIG9mIE1heSAyMDAxIGJ5CiAgICAgICAgICAgQW5kculzIEdhcmPtYToKCiAgICAgICAgICAgZmxhZzogQSBUUlVFL0ZBTFNFIHZhbHVlIGluZGljYXRpbmcgaWYgYWxsIG1hY2hpbmVzIHdpdGhpbiBhIGdpdmVuCiAgICAgICAgICAgZG9tYWluIGNhbiBhY2Nlc3MgdGhlIHZhcmlhYmxlLiBUaGlzIHZhbHVlIGlzIHNldCBhdXRvbWF0aWNhbGx5IGJ5CiAgICAgICAgICAgdGhlIGJyb3dzZXIsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgeW91IHNldCBmb3IgdGhlIGRvbWFpbi4KCiAgICAgICAgICAgQXMgZmFyIGFzIEkgY2FuIHNlZSwgaXQgaXMgc2V0IHRvIHRydWUgd2hlbiB0aGUgY29va2llIHNheXMKICAgICAgICAgICAuZG9tYWluLmNvbSBhbmQgdG8gZmFsc2Ugd2hlbiB0aGUgZG9tYWluIGlzIGNvbXBsZXRlIHd3dy5kb21haW4uY29tCgogICAgICAgICAgIFdlIGRvbid0IGN1cnJlbnRseSB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIGtub3dsZWRnZS4KICAgICAgICAqLwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgLyogSXQgdHVybnMgb3V0LCB0aGF0IHNvbWV0aW1lcyB0aGUgZmlsZSBmb3JtYXQgYWxsb3dzIHRoZSBwYXRoCiAgICAgICAgICAgZmllbGQgdG8gcmVtYWluIG5vdCBmaWxsZWQgaW4sIHdlIHRyeSB0byBkZXRlY3QgdGhpcyBhbmQgd29yawogICAgICAgICAgIGFyb3VuZCBpdCEgQW5kculzIEdhcmPtYSBtYWRlIHVzIGF3YXJlIG9mIHRoaXMuLi4gKi8KICAgICAgICBpZiAoc3RyY21wKCJUUlVFIiwgcHRyKSAmJiBzdHJjbXAoIkZBTFNFIiwgcHRyKSkgewogICAgICAgICAgLyogb25seSBpZiB0aGUgcGF0aCBkb2Vzbid0IGxvb2sgbGlrZSBhIGJvb2xlYW4gb3B0aW9uISAqLwogICAgICAgICAgY28tPnBhdGggPSBzdHJkdXAocHRyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvKiB0aGlzIGRvZXNuJ3QgbG9vayBsaWtlIGEgcGF0aCwgbWFrZSBvbmUgdXAhICovCiAgICAgICAgY28tPnBhdGggPSBzdHJkdXAoIi8iKTsKICAgICAgICBmaWVsZHMrKzsgLyogYWRkIGEgZmllbGQgYW5kIGZhbGwgZG93biB0byBzZWN1cmUgKi8KICAgICAgICAvKiBGQUxMVEhST1VHSCAqLwogICAgICBjYXNlIDM6CiAgICAgICAgY28tPnNlY3VyZSA9IHN0cmVxdWFsKHB0ciwgIlRSVUUiKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA0OgogICAgICAgIGNvLT5leHBpcmVzID0gYXRvaShwdHIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDU6CiAgICAgICAgY28tPm5hbWUgPSBzdHJkdXAocHRyKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA2OgogICAgICAgIGNvLT52YWx1ZSA9IHN0cmR1cChwdHIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgaWYoNyAhPSBmaWVsZHMpIHsKICAgICAgLyogd2UgZGlkIG5vdCBmaW5kIHRoZSBzdWZmaWNpZW50IG51bWJlciBvZiBmaWVsZHMgdG8gcmVjb2duaXplIHRoaXMKICAgICAgICAgYXMgYSB2YWxpZCBsaW5lLCBhYm9ydCBhbmQgZ28gaG9tZSAqLwoKICAgICAgaWYoY28tPmRvbWFpbikKICAgICAgICBmcmVlKGNvLT5kb21haW4pOwogICAgICBpZihjby0+cGF0aCkKICAgICAgICBmcmVlKGNvLT5wYXRoKTsKICAgICAgaWYoY28tPm5hbWUpCiAgICAgICAgZnJlZShjby0+bmFtZSk7CiAgICAgIGlmKGNvLT52YWx1ZSkKICAgICAgICBmcmVlKGNvLT52YWx1ZSk7CgogICAgICBmcmVlKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogIH0KCiAgLyogbm93LCB3ZSBoYXZlIHBhcnNlZCB0aGUgaW5jb21pbmcgbGluZSwgd2UgbXVzdCBub3cgY2hlY2sgaWYgdGhpcwogICAgIHN1cGVyY2VlZHMgYW4gYWxyZWFkeSBleGlzdGluZyBjb29raWUsIHdoaWNoIGl0IG1heSBpZiB0aGUgcHJldmlvdXMgaGF2ZQogICAgIHRoZSBzYW1lIGRvbWFpbiBhbmQgcGF0aCBhcyB0aGlzICovCgogIGNsaXN0ID0gYy0+Y29va2llczsKICByZXBsYWNlX29sZCA9IEZBTFNFOwogIHdoaWxlKGNsaXN0KSB7CiAgICBpZihzdHJlcXVhbChjbGlzdC0+bmFtZSwgY28tPm5hbWUpKSB7CiAgICAgIC8qIHRoZSBuYW1lcyBhcmUgaWRlbnRpY2FsICovCgogICAgICBpZihjbGlzdC0+ZG9tYWluICYmIGNvLT5kb21haW4pIHsKICAgICAgICBpZihzdHJlcXVhbChjbGlzdC0+ZG9tYWluLCBjby0+ZG9tYWluKSkKICAgICAgICAgIHJlcGxhY2Vfb2xkPVRSVUU7CiAgICAgIH0KICAgICAgZWxzZSBpZighY2xpc3QtPmRvbWFpbiAmJiAhY28tPmRvbWFpbikKICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CgogICAgICBpZihyZXBsYWNlX29sZCkgewogICAgICAgIC8qIHRoZSBkb21haW5zIHdlcmUgaWRlbnRpY2FsICovCgogICAgICAgIGlmKGNsaXN0LT5wYXRoICYmIGNvLT5wYXRoKSB7CiAgICAgICAgICBpZihzdHJlcXVhbChjbGlzdC0+cGF0aCwgY28tPnBhdGgpKSB7CiAgICAgICAgICAgIHJlcGxhY2Vfb2xkID0gVFJVRTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgICAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZighY2xpc3QtPnBhdGggJiYgIWNvLT5wYXRoKQogICAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwogICAgICAgIGVsc2UKICAgICAgICAgIHJlcGxhY2Vfb2xkID0gRkFMU0U7CiAgICAgICAgCiAgICAgIH0KCiAgICAgIGlmKHJlcGxhY2Vfb2xkKSB7CiAgICAgICAgY28tPm5leHQgPSBjbGlzdC0+bmV4dDsgLyogZ2V0IHRoZSBuZXh0LXBvaW50ZXIgZmlyc3QgKi8KCiAgICAgICAgLyogdGhlbiBmcmVlIGFsbCB0aGUgb2xkIHBvaW50ZXJzICovCiAgICAgICAgaWYoY2xpc3QtPm5hbWUpCiAgICAgICAgICBmcmVlKGNsaXN0LT5uYW1lKTsKICAgICAgICBpZihjbGlzdC0+dmFsdWUpCiAgICAgICAgICBmcmVlKGNsaXN0LT52YWx1ZSk7CiAgICAgICAgaWYoY2xpc3QtPmRvbWFpbikKICAgICAgICAgIGZyZWUoY2xpc3QtPmRvbWFpbik7CiAgICAgICAgaWYoY2xpc3QtPnBhdGgpCiAgICAgICAgICBmcmVlKGNsaXN0LT5wYXRoKTsKICAgICAgICBpZihjbGlzdC0+ZXhwaXJlc3RyKQogICAgICAgICAgZnJlZShjbGlzdC0+ZXhwaXJlc3RyKTsKCiAgICAgICAgaWYoY2xpc3QtPnZlcnNpb24pCiAgICAgICAgICBmcmVlKGNsaXN0LT52ZXJzaW9uKTsKICAgICAgICBpZihjbGlzdC0+bWF4YWdlKQogICAgICAgICAgZnJlZShjbGlzdC0+bWF4YWdlKTsKCiAgICAgICAgKmNsaXN0ID0gKmNvOyAgLyogdGhlbiBzdG9yZSBhbGwgdGhlIG5ldyBkYXRhICovCiAgICAgIH0KCiAgICB9CiAgICBjbGlzdCA9IGNsaXN0LT5uZXh0OwogIH0KCiAgaWYoIXJlcGxhY2Vfb2xkKSB7CgogICAgLyogZmlyc3QsIHBvaW50IHRvIG91ciAibmV4dCIgKi8KICAgIGNvLT5uZXh0ID0gYy0+Y29va2llczsKICAgIC8qIHRoZW4gbWFrZSBvdXJzZWx2ZXMgZmlyc3QgaW4gdGhlIGxpc3QgKi8KICAgIGMtPmNvb2tpZXMgPSBjbzsKICB9CiAgcmV0dXJuIGNvOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogY29va2llX2luaXQoKQogKgogKiBJbml0cyBhIGNvb2tpZSBzdHJ1Y3QgdG8gcmVhZCBkYXRhIGZyb20gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwogKiBjYWxsZWQgYmVmb3JlIGFueSBjb29raWVzIGFyZSBzZXQuIEZpbGUgbWF5IGJlIE5VTEwuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgQ29va2llSW5mbyAqQ3VybF9jb29raWVfaW5pdChjaGFyICpmaWxlKQp7CiAgY2hhciBsaW5lW01BWF9DT09LSUVfTElORV07CiAgc3RydWN0IENvb2tpZUluZm8gKmM7CiAgRklMRSAqZnA7CiAgYm9vbCBmcm9tZmlsZT1UUlVFOwogIAogIGMgPSAoc3RydWN0IENvb2tpZUluZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBDb29raWVJbmZvKSk7CiAgaWYoIWMpCiAgICByZXR1cm4gTlVMTDsgLyogZmFpbGVkIHRvIGdldCBtZW1vcnkgKi8KICBtZW1zZXQoYywgMCwgc2l6ZW9mKHN0cnVjdCBDb29raWVJbmZvKSk7CiAgYy0+ZmlsZW5hbWUgPSBzdHJkdXAoZmlsZT9maWxlOiJub25lIik7IC8qIGNvcHkgdGhlIG5hbWUganVzdCBpbiBjYXNlICovCgogIGlmKHN0cmVxdWFsKGZpbGUsICItIikpIHsKICAgIGZwID0gc3RkaW47CiAgICBmcm9tZmlsZT1GQUxTRTsKICB9CiAgZWxzZQogICAgZnAgPSBmaWxlP2ZvcGVuKGZpbGUsICJyIik6TlVMTDsKCiAgaWYoZnApIHsKICAgIHdoaWxlKGZnZXRzKGxpbmUsIE1BWF9DT09LSUVfTElORSwgZnApKSB7CiAgICAgIGlmKHN0cm5lcXVhbCgiU2V0LUNvb2tpZToiLCBsaW5lLCAxMSkpIHsKICAgICAgICAvKiBUaGlzIGlzIGEgY29va2llIGxpbmUsIGdldCBpdCEgKi8KICAgICAgICBjaGFyICpsaW5lcHRyPSZsaW5lWzExXTsKICAgICAgICB3aGlsZSgqbGluZXB0ciAmJiBpc3NwYWNlKChpbnQpKmxpbmVwdHIpKQogICAgICAgICAgbGluZXB0cisrOwoKICAgICAgICBDdXJsX2Nvb2tpZV9hZGQoYywgVFJVRSwgbGluZXB0cik7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLyogVGhpcyBtaWdodCBiZSBhIG5ldHNjYXBlIGNvb2tpZS1maWxlIGxpbmUsIGdldCBpdCEgKi8KICAgICAgICBjaGFyICpsaW5lcHRyPWxpbmU7CiAgICAgICAgd2hpbGUoKmxpbmVwdHIgJiYgaXNzcGFjZSgoaW50KSpsaW5lcHRyKSkKICAgICAgICAgIGxpbmVwdHIrKzsKCiAgICAgICAgQ3VybF9jb29raWVfYWRkKGMsIEZBTFNFLCBsaW5lcHRyKTsKICAgICAgfQogICAgfQogICAgaWYoZnJvbWZpbGUpCiAgICAgIGZjbG9zZShmcCk7CiAgfQoKICByZXR1cm4gYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIGNvb2tpZV9nZXRsaXN0KCkKICoKICogRm9yIGEgZ2l2ZW4gaG9zdCBhbmQgcGF0aCwgcmV0dXJuIGEgbGlua2VkIGxpc3Qgb2YgY29va2llcyB0aGF0IHRoZQogKiBjbGllbnQgc2hvdWxkIHNlbmQgdG8gdGhlIHNlcnZlciBpZiB1c2VkIG5vdy4gVGhlIHNlY3VyZSBib29sZWFuIGluZm9ybXMKICogdGhlIGNvb2tpZSBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjaGlldmVkIG9yIG5vdC4KICoKICogSXQgc2hhbGwgb25seSByZXR1cm4gY29va2llcyB0aGF0IGhhdmVuJ3QgZXhwaXJlZC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdHJ1Y3QgQ29va2llICpDdXJsX2Nvb2tpZV9nZXRsaXN0KHN0cnVjdCBDb29raWVJbmZvICpjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmhvc3QsIGNoYXIgKnBhdGgsIGJvb2wgc2VjdXJlKQp7CiAgIHN0cnVjdCBDb29raWUgKm5ld2NvOwogICBzdHJ1Y3QgQ29va2llICpjbzsKICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CiAgIGludCBob3N0bGVuPXN0cmxlbihob3N0KTsKICAgaW50IGRvbWxlbjsKCiAgIHN0cnVjdCBDb29raWUgKm1haW5jbz1OVUxMOwoKICAgaWYoIWMgfHwgIWMtPmNvb2tpZXMpCiAgICAgIHJldHVybiBOVUxMOyAvKiBubyBjb29raWUgc3RydWN0IG9yIG5vIGNvb2tpZXMgaW4gdGhlIHN0cnVjdCAqLwoKICAgY28gPSBjLT5jb29raWVzOwoKICAgd2hpbGUoY28pIHsKICAgICAgLyogb25seSBwcm9jZXNzIHRoaXMgY29va2llIGlmIGl0IGlzIG5vdCBleHBpcmVkIG9yIGhhZCBubyBleHBpcmUKCSBkYXRlIEFORCB0aGF0IGlmIHRoZSBjb29raWUgcmVxdWlyZXMgd2UncmUgc2VjdXJlIHdlIG11c3Qgb25seQoJIGNvbnRpbnVlIGlmIHdlIGFyZSEgKi8KICAgICBpZiggKGNvLT5leHBpcmVzPD0wIHx8IChjby0+ZXhwaXJlcz4gbm93KSkgJiYKICAgICAgICAgKGNvLT5zZWN1cmU/c2VjdXJlOlRSVUUpICkgewoKCSAvKiBub3cgY2hlY2sgaWYgdGhlIGRvbWFpbiBpcyBjb3JyZWN0ICovCgkgZG9tbGVuPWNvLT5kb21haW4/c3RybGVuKGNvLT5kb21haW4pOjA7CgkgaWYoIWNvLT5kb21haW4gfHwKCSAgICAoKGRvbWxlbjw9aG9zdGxlbikgJiYKCSAgICAgc3RyZXF1YWwoaG9zdCsoaG9zdGxlbi1kb21sZW4pLCBjby0+ZG9tYWluKSkgKSB7CgkgICAgLyogdGhlIHJpZ2h0IHBhcnQgb2YgdGhlIGhvc3QgbWF0Y2hlcyB0aGUgZG9tYWluIHN0dWZmIGluIHRoZQoJICAgICAgIGNvb2tpZSBkYXRhICovCgoJICAgIC8qIG5vdyBjaGVjayB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBwYXRoIHdpdGggdGhlIGNvb2tpZXMgcGF0aAoJICAgICAgIHJlcXVpcmVtZW50ICovCgkgICAgaWYoIWNvLT5wYXRoIHx8CgkgICAgICAgc3RybmVxdWFsKHBhdGgsIGNvLT5wYXRoLCBzdHJsZW4oY28tPnBhdGgpKSkgewoKCSAgICAgICAvKiBhbmQgbm93LCB3ZSBrbm93IHRoaXMgaXMgYSBtYXRjaCBhbmQgd2Ugc2hvdWxkIGNyZWF0ZSBhbgoJCSAgZW50cnkgZm9yIHRoZSByZXR1cm4tbGlua2VkLWxpc3QgKi8KCgkgICAgICAgbmV3Y28gPSAoc3RydWN0IENvb2tpZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IENvb2tpZSkpOwoJICAgICAgIGlmKG5ld2NvKSB7CgkJICAvKiBmaXJzdCwgY29weSB0aGUgd2hvbGUgc291cmNlIGNvb2tpZTogKi8KCQkgIG1lbWNweShuZXdjbywgY28sIHNpemVvZihzdHJ1Y3QgQ29va2llKSk7CgoJCSAgLyogdGhlbiBtb2RpZnkgb3VyIG5leHQgKi8KCQkgIG5ld2NvLT5uZXh0ID0gbWFpbmNvOwoKCQkgIC8qIHBvaW50IHRoZSBtYWluIHRvIHVzICovCgkJICBtYWluY28gPSBuZXdjbzsKCSAgICAgICB9CgkgICAgfQoJIH0KICAgICAgfQogICAgICBjbyA9IGNvLT5uZXh0OwogICB9CgogICByZXR1cm4gbWFpbmNvOyAvKiByZXR1cm4gdGhlIG5ldyBsaXN0ICovCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogY29va2llX2ZyZWVsaXN0KCkKICoKICogRnJlZSBhIGxpc3QgcHJldmlvdXNseSByZXR1cm5lZCBieSBjb29raWVfZ2V0bGlzdCgpOwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgQ3VybF9jb29raWVfZnJlZWxpc3Qoc3RydWN0IENvb2tpZSAqY28pCnsKICAgc3RydWN0IENvb2tpZSAqbmV4dDsKICAgaWYoY28pIHsKICAgICAgd2hpbGUoY28pIHsKCSBuZXh0ID0gY28tPm5leHQ7CgkgZnJlZShjbyk7IC8qIHdlIG9ubHkgZnJlZSB0aGUgc3RydWN0IHNpbmNlIHRoZSAibWVtYmVycyIgYXJlIGFsbAoJCSAgICAgIGp1c3QgY29waWVkISAqLwoJIGNvID0gbmV4dDsKICAgICAgfQogICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBjb29raWVfY2xlYW51cCgpCiAqCiAqIEZyZWUgYSAiY29va2llIG9iamVjdCIgcHJldmlvdXMgY3JlYXRlZCB3aXRoIGNvb2tpZV9pbml0KCkuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEN1cmxfY29va2llX2NsZWFudXAoc3RydWN0IENvb2tpZUluZm8gKmMpCnsKICAgc3RydWN0IENvb2tpZSAqY287CiAgIHN0cnVjdCBDb29raWUgKm5leHQ7CiAgIGlmKGMpIHsKICAgICAgaWYoYy0+ZmlsZW5hbWUpCgkgZnJlZShjLT5maWxlbmFtZSk7CiAgICAgIGNvID0gYy0+Y29va2llczsKCiAgICAgIHdoaWxlKGNvKSB7CgkgaWYoY28tPm5hbWUpCgkgICAgZnJlZShjby0+bmFtZSk7CgkgaWYoY28tPnZhbHVlKQoJICAgIGZyZWUoY28tPnZhbHVlKTsKCSBpZihjby0+ZG9tYWluKQoJICAgIGZyZWUoY28tPmRvbWFpbik7CgkgaWYoY28tPnBhdGgpCgkgICAgZnJlZShjby0+cGF0aCk7CgkgaWYoY28tPmV4cGlyZXN0cikKCSAgICBmcmVlKGNvLT5leHBpcmVzdHIpOwoKCSBpZihjby0+dmVyc2lvbikKCSAgICBmcmVlKGNvLT52ZXJzaW9uKTsKCSBpZihjby0+bWF4YWdlKQoJICAgIGZyZWUoY28tPm1heGFnZSk7CgoJIG5leHQgPSBjby0+bmV4dDsKCSBmcmVlKGNvKTsKCSBjbyA9IG5leHQ7CiAgICAgIH0KICAgICAgZnJlZShjKTsgLyogZnJlZSB0aGUgYmFzZSBzdHJ1Y3QgYXMgd2VsbCAqLwogICB9Cn0KCg==