LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfCiAqICBQcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogKgogKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE2LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCiAqIGFyZSBhbHNvIGF2YWlsYWJsZSBhdCBodHRwczovL2N1cmwuaGF4eC5zZS9kb2NzL2NvcHlyaWdodC5odG1sLgogKgogKiBZb3UgbWF5IG9wdCB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUgYW5kL29yIHNlbGwKICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDT1BZSU5HIGZpbGUuCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioKCgpSRUNFSVZJTkcgQ09PS0lFIElORk9STUFUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBDb29raWVJbmZvICpDdXJsX2Nvb2tpZV9pbml0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IENvb2tpZUluZm8gKmluYywgYm9vbCBuZXdzZXNzaW9uKTsKCiAgICAgICAgSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHN0b3JlIGRhdGEgaW4gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwogICAgICAgIGNhbGxlZCBiZWZvcmUgYW55IGNvb2tpZXMgYXJlIHNldC4KCnN0cnVjdCBDb29raWUgKkN1cmxfY29va2llX2FkZChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAogICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICpjLCBib29sIGh0dHBoZWFkZXIsIGNoYXIgKmxpbmVwdHIsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKTsKCiAgICAgICAgVGhlICdsaW5lcHRyJyBwYXJhbWV0ZXIgaXMgYSBmdWxsICJTZXQtY29va2llOiIgbGluZSBhcwogICAgICAgIHJlY2VpdmVkIGZyb20gYSBzZXJ2ZXIuCgogICAgICAgIFRoZSBmdW5jdGlvbiBuZWVkIHRvIHJlcGxhY2UgcHJldmlvdXNseSBzdG9yZWQgbGluZXMgdGhhdCB0aGlzIG5ldwogICAgICAgIGxpbmUgc3VwZXJjZWVkcy4KCiAgICAgICAgSXQgbWF5IHJlbW92ZSBsaW5lcyB0aGF0IGFyZSBleHBpcmVkLgoKICAgICAgICBJdCBzaG91bGQgcmV0dXJuIGFuIGluZGljYXRpb24gb2Ygc3VjY2Vzcy9lcnJvci4KCgpTRU5ESU5HIENPT0tJRSBJTkZPUk1BVElPTgo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RydWN0IENvb2tpZXMgKkN1cmxfY29va2llX2dldGxpc3Qoc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaG9zdCwgY2hhciAqcGF0aCwgYm9vbCBzZWN1cmUpOwoKICAgICAgICBGb3IgYSBnaXZlbiBob3N0IGFuZCBwYXRoLCByZXR1cm4gYSBsaW5rZWQgbGlzdCBvZiBjb29raWVzIHRoYXQKICAgICAgICB0aGUgY2xpZW50IHNob3VsZCBzZW5kIHRvIHRoZSBzZXJ2ZXIgaWYgdXNlZCBub3cuIFRoZSBzZWN1cmUKICAgICAgICBib29sZWFuIGluZm9ybXMgdGhlIGNvb2tpZSBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjaGlldmVkIG9yCiAgICAgICAgbm90LgoKICAgICAgICBJdCBzaGFsbCBvbmx5IHJldHVybiBjb29raWVzIHRoYXQgaGF2ZW4ndCBleHBpcmVkLgoKCkV4YW1wbGUgc2V0IG9mIGNvb2tpZXM6CgogICAgU2V0LWNvb2tpZTogUFJPRFVDVElORk89d2VieHByZXNzOyBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IFBFUlNPTkFMSVpFPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS9mdGd3OyBzZWN1cmUKICAgIFNldC1jb29raWU6IEZpZEhpc3Q9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWRPcmRlcj1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IERpc1BlbmQ9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWREaXM9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOgogICAgU2Vzc2lvbl9LZXlANjc5MWE5ZTAtOTAxYS0xMWQwLWExYzgtOWIwMTJjODhhYTc3PW5vbmU7ZXhwaXJlcz1Nb25kYXksCiAgICAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7IGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQoqKioqLwoKI2luY2x1ZGUgImN1cmxfc2V0dXAuaCIKCiNpZiAhZGVmaW5lZChDVVJMX0RJU0FCTEVfSFRUUCkgJiYgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX0NPT0tJRVMpCgojaWZkZWYgVVNFX0xJQlBTTAojIGluY2x1ZGUgPGxpYnBzbC5oPgojZW5kaWYKCiNpbmNsdWRlICJ1cmxkYXRhLmgiCiNpbmNsdWRlICJjb29raWUuaCIKI2luY2x1ZGUgInN0cmVxdWFsLmgiCiNpbmNsdWRlICJzdHJ0b2suaCIKI2luY2x1ZGUgInNlbmRmLmgiCiNpbmNsdWRlICJzbGlzdC5oIgojaW5jbHVkZSAic2hhcmUuaCIKI2luY2x1ZGUgInN0cnRvb2ZmdC5oIgojaW5jbHVkZSAicmF3c3RyLmgiCiNpbmNsdWRlICJjdXJsX21lbXJjaHIuaCIKI2luY2x1ZGUgImluZXRfcHRvbi5oIgoKLyogVGhlIGxhc3QgMyAjaW5jbHVkZSBmaWxlcyBzaG91bGQgYmUgaW4gdGhpcyBvcmRlciAqLwojaW5jbHVkZSAiY3VybF9wcmludGYuaCIKI2luY2x1ZGUgImN1cmxfbWVtb3J5LmgiCiNpbmNsdWRlICJtZW1kZWJ1Zy5oIgoKc3RhdGljIHZvaWQgZnJlZWNvb2tpZShzdHJ1Y3QgQ29va2llICpjbykKewogIGZyZWUoY28tPmV4cGlyZXN0cik7CiAgZnJlZShjby0+ZG9tYWluKTsKICBmcmVlKGNvLT5wYXRoKTsKICBmcmVlKGNvLT5zcGF0aCk7CiAgZnJlZShjby0+bmFtZSk7CiAgZnJlZShjby0+dmFsdWUpOwogIGZyZWUoY28tPm1heGFnZSk7CiAgZnJlZShjby0+dmVyc2lvbik7CiAgZnJlZShjbyk7Cn0KCnN0YXRpYyBib29sIHRhaWxtYXRjaChjb25zdCBjaGFyICpjb29rZV9kb21haW4sIGNvbnN0IGNoYXIgKmhvc3RuYW1lKQp7CiAgc2l6ZV90IGNvb2tpZV9kb21haW5fbGVuID0gc3RybGVuKGNvb2tlX2RvbWFpbik7CiAgc2l6ZV90IGhvc3RuYW1lX2xlbiA9IHN0cmxlbihob3N0bmFtZSk7CgogIGlmKGhvc3RuYW1lX2xlbiA8IGNvb2tpZV9kb21haW5fbGVuKQogICAgcmV0dXJuIEZBTFNFOwoKICBpZighQ3VybF9yYXdfZXF1YWwoY29va2VfZG9tYWluLCBob3N0bmFtZStob3N0bmFtZV9sZW4tY29va2llX2RvbWFpbl9sZW4pKQogICAgcmV0dXJuIEZBTFNFOwoKICAvKiBBIGxlYWQgY2hhciBvZiBjb29raWVfZG9tYWluIGlzIG5vdCAnLicuCiAgICAgUkZDNjI2NSA0LjEuMi4zLiBUaGUgRG9tYWluIEF0dHJpYnV0ZSBzYXlzOgogICAgICAgRm9yIGV4YW1wbGUsIGlmIHRoZSB2YWx1ZSBvZiB0aGUgRG9tYWluIGF0dHJpYnV0ZSBpcwogICAgICAgImV4YW1wbGUuY29tIiwgdGhlIHVzZXIgYWdlbnQgd2lsbCBpbmNsdWRlIHRoZSBjb29raWUgaW4gdGhlIENvb2tpZQogICAgICAgaGVhZGVyIHdoZW4gbWFraW5nIEhUVFAgcmVxdWVzdHMgdG8gZXhhbXBsZS5jb20sIHd3dy5leGFtcGxlLmNvbSwgYW5kCiAgICAgICB3d3cuY29ycC5leGFtcGxlLmNvbS4KICAgKi8KICBpZihob3N0bmFtZV9sZW4gPT0gY29va2llX2RvbWFpbl9sZW4pCiAgICByZXR1cm4gVFJVRTsKICBpZignLicgPT0gKihob3N0bmFtZSArIGhvc3RuYW1lX2xlbiAtIGNvb2tpZV9kb21haW5fbGVuIC0gMSkpCiAgICByZXR1cm4gVFJVRTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qCiAqIG1hdGNoaW5nIGNvb2tpZSBwYXRoIGFuZCB1cmwgcGF0aAogKiBSRkM2MjY1IDUuMS40IFBhdGhzIGFuZCBQYXRoLU1hdGNoCiAqLwpzdGF0aWMgYm9vbCBwYXRobWF0Y2goY29uc3QgY2hhciogY29va2llX3BhdGgsIGNvbnN0IGNoYXIqIHJlcXVlc3RfdXJpKQp7CiAgc2l6ZV90IGNvb2tpZV9wYXRoX2xlbjsKICBzaXplX3QgdXJpX3BhdGhfbGVuOwogIGNoYXIqIHVyaV9wYXRoID0gTlVMTDsKICBjaGFyKiBwb3M7CiAgYm9vbCByZXQgPSBGQUxTRTsKCiAgLyogY29va2llX3BhdGggbXVzdCBub3QgaGF2ZSBsYXN0ICcvJyBzZXBhcmF0b3IuIGV4OiAvc2FtcGxlICovCiAgY29va2llX3BhdGhfbGVuID0gc3RybGVuKGNvb2tpZV9wYXRoKTsKICBpZigxID09IGNvb2tpZV9wYXRoX2xlbikgewogICAgLyogY29va2llX3BhdGggbXVzdCBiZSAnLycgKi8KICAgIHJldHVybiBUUlVFOwogIH0KCiAgdXJpX3BhdGggPSBzdHJkdXAocmVxdWVzdF91cmkpOwogIGlmKCF1cmlfcGF0aCkKICAgIHJldHVybiBGQUxTRTsKICBwb3MgPSBzdHJjaHIodXJpX3BhdGgsICc/Jyk7CiAgaWYocG9zKQogICAgKnBvcyA9IDB4MDsKCiAgLyogIy1mcmFnbWVudHMgYXJlIGFscmVhZHkgY3V0IG9mZiEgKi8KICBpZigwID09IHN0cmxlbih1cmlfcGF0aCkgfHwgdXJpX3BhdGhbMF0gIT0gJy8nKSB7CiAgICBmcmVlKHVyaV9wYXRoKTsKICAgIHVyaV9wYXRoID0gc3RyZHVwKCIvIik7CiAgICBpZighdXJpX3BhdGgpCiAgICAgIHJldHVybiBGQUxTRTsKICB9CgogIC8qIGhlcmUsIFJGQzYyNjUgNS4xLjQgc2F5cwogICAgIDQuIE91dHB1dCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdXJpLXBhdGggZnJvbSB0aGUgZmlyc3QgY2hhcmFjdGVyIHVwCiAgICAgICAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgcmlnaHQtbW9zdCAleDJGICgiLyIpLgogICAgIGJ1dCBVUkwgcGF0aCAvaG9nZT9mdWdhPXh4eCBtZWFucyAvaG9nZS9pbmRleC5jZ2k/ZnVnYT14eHggaW4gc29tZSBzaXRlCiAgICAgd2l0aG91dCByZWRpcmVjdC4KICAgICBJZ25vcmUgdGhpcyBhbGdvcml0aG0gYmVjYXVzZSAvaG9nZSBpcyB1cmkgcGF0aCBmb3IgdGhpcyBjYXNlCiAgICAgKHVyaSBwYXRoIGlzIG5vdCAvKS4KICAgKi8KCiAgdXJpX3BhdGhfbGVuID0gc3RybGVuKHVyaV9wYXRoKTsKCiAgaWYodXJpX3BhdGhfbGVuIDwgY29va2llX3BhdGhfbGVuKSB7CiAgICByZXQgPSBGQUxTRTsKICAgIGdvdG8gcGF0aG1hdGNoZWQ7CiAgfQoKICAvKiBub3QgdXNpbmcgY2hlY2twcmVmaXgoKSBiZWNhdXNlIG1hdGNoaW5nIHNob3VsZCBiZSBjYXNlLXNlbnNpdGl2ZSAqLwogIGlmKHN0cm5jbXAoY29va2llX3BhdGgsIHVyaV9wYXRoLCBjb29raWVfcGF0aF9sZW4pKSB7CiAgICByZXQgPSBGQUxTRTsKICAgIGdvdG8gcGF0aG1hdGNoZWQ7CiAgfQoKICAvKiBUaGUgY29va2llLXBhdGggYW5kIHRoZSB1cmktcGF0aCBhcmUgaWRlbnRpY2FsLiAqLwogIGlmKGNvb2tpZV9wYXRoX2xlbiA9PSB1cmlfcGF0aF9sZW4pIHsKICAgIHJldCA9IFRSVUU7CiAgICBnb3RvIHBhdGhtYXRjaGVkOwogIH0KCiAgLyogaGVyZSwgY29va2llX3BhdGhfbGVuIDwgdXJsX3BhdGhfbGVuICovCiAgaWYodXJpX3BhdGhbY29va2llX3BhdGhfbGVuXSA9PSAnLycpIHsKICAgIHJldCA9IFRSVUU7CiAgICBnb3RvIHBhdGhtYXRjaGVkOwogIH0KCiAgcmV0ID0gRkFMU0U7CgpwYXRobWF0Y2hlZDoKICBmcmVlKHVyaV9wYXRoKTsKICByZXR1cm4gcmV0Owp9CgovKgogKiBjb29raWUgcGF0aCBzYW5pdGl6ZQogKi8Kc3RhdGljIGNoYXIgKnNhbml0aXplX2Nvb2tpZV9wYXRoKGNvbnN0IGNoYXIgKmNvb2tpZV9wYXRoKQp7CiAgc2l6ZV90IGxlbjsKICBjaGFyICpuZXdfcGF0aCA9IHN0cmR1cChjb29raWVfcGF0aCk7CiAgaWYoIW5ld19wYXRoKQogICAgcmV0dXJuIE5VTEw7CgogIC8qIHNvbWUgc3R1cGlkIHNpdGUgc2VuZHMgcGF0aCBhdHRyaWJ1dGUgd2l0aCAnIicuICovCiAgbGVuID0gc3RybGVuKG5ld19wYXRoKTsKICBpZihuZXdfcGF0aFswXSA9PSAnXCInKSB7CiAgICBtZW1tb3ZlKCh2b2lkICopbmV3X3BhdGgsIChjb25zdCB2b2lkICopKG5ld19wYXRoICsgMSksIGxlbik7CiAgICBsZW4tLTsKICB9CiAgaWYobGVuICYmIChuZXdfcGF0aFtsZW4gLSAxXSA9PSAnXCInKSkgewogICAgbmV3X3BhdGhbbGVuIC0gMV0gPSAweDA7CiAgICBsZW4tLTsKICB9CgogIC8qIFJGQzYyNjUgNS4yLjQgVGhlIFBhdGggQXR0cmlidXRlICovCiAgaWYobmV3X3BhdGhbMF0gIT0gJy8nKSB7CiAgICAvKiBMZXQgY29va2llLXBhdGggYmUgdGhlIGRlZmF1bHQtcGF0aC4gKi8KICAgIGZyZWUobmV3X3BhdGgpOwogICAgbmV3X3BhdGggPSBzdHJkdXAoIi8iKTsKICAgIHJldHVybiBuZXdfcGF0aDsKICB9CgogIC8qIGNvbnZlcnQgL2hvZ2UvIHRvIC9ob2dlICovCiAgaWYobGVuICYmIG5ld19wYXRoW2xlbiAtIDFdID09ICcvJykgewogICAgbmV3X3BhdGhbbGVuIC0gMV0gPSAweDA7CiAgfQoKICByZXR1cm4gbmV3X3BhdGg7Cn0KCi8qCiAqIExvYWQgY29va2llcyBmcm9tIGFsbCBnaXZlbiBjb29raWUgZmlsZXMgKENVUkxPUFRfQ09PS0lFRklMRSkuCiAqCiAqIE5PVEU6IE9PTSBvciBjb29raWUgcGFyc2luZyBmYWlsdXJlcyBhcmUgaWdub3JlZC4KICovCnZvaWQgQ3VybF9jb29raWVfbG9hZGZpbGVzKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCnsKICBzdHJ1Y3QgY3VybF9zbGlzdCAqbGlzdCA9IGRhdGEtPmNoYW5nZS5jb29raWVsaXN0OwogIGlmKGxpc3QpIHsKICAgIEN1cmxfc2hhcmVfbG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUsIENVUkxfTE9DS19BQ0NFU1NfU0lOR0xFKTsKICAgIHdoaWxlKGxpc3QpIHsKICAgICAgc3RydWN0IENvb2tpZUluZm8gKm5ld2Nvb2tpZXMgPSBDdXJsX2Nvb2tpZV9pbml0KGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+Y29va2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5jb29raWVzZXNzaW9uKTsKICAgICAgaWYoIW5ld2Nvb2tpZXMpCiAgICAgICAgLyogRmFpbHVyZSBtYXkgYmUgZHVlIHRvIE9PTSBvciBhIGJhZCBjb29raWU7IGJvdGggYXJlIGlnbm9yZWQKICAgICAgICAgKiBidXQgb25seSB0aGUgZmlyc3Qgc2hvdWxkIGJlCiAgICAgICAgICovCiAgICAgICAgaW5mb2YoZGF0YSwgImlnbm9yaW5nIGZhaWxlZCBjb29raWVfaW5pdCBmb3IgJXNcbiIsIGxpc3QtPmRhdGEpOwogICAgICBlbHNlCiAgICAgICAgZGF0YS0+Y29va2llcyA9IG5ld2Nvb2tpZXM7CiAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwogICAgfQogICAgY3VybF9zbGlzdF9mcmVlX2FsbChkYXRhLT5jaGFuZ2UuY29va2llbGlzdCk7IC8qIGNsZWFuIHVwIGxpc3QgKi8KICAgIGRhdGEtPmNoYW5nZS5jb29raWVsaXN0ID0gTlVMTDsgLyogZG9uJ3QgZG8gdGhpcyBhZ2FpbiEgKi8KICAgIEN1cmxfc2hhcmVfdW5sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSk7CiAgfQp9CgovKgogKiBzdHJzdG9yZSgpIG1ha2VzIGEgc3RyZHVwKCkgb24gdGhlICduZXdzdHInIGFuZCBpZiAnKnN0cicgaXMgbm9uLU5VTEwKICogdGhhdCB3aWxsIGJlIGZyZWVkIGJlZm9yZSB0aGUgYWxsb2NhdGVkIHN0cmluZyBpcyBzdG9yZWQgdGhlcmUuCiAqCiAqIEl0IGlzIG1lYW50IHRvIGVhc2lseSByZXBsYWNlIHN0cmR1cCgpCiAqLwpzdGF0aWMgdm9pZCBzdHJzdG9yZShjaGFyICoqc3RyLCBjb25zdCBjaGFyICpuZXdzdHIpCnsKICBmcmVlKCpzdHIpOwogICpzdHIgPSBzdHJkdXAobmV3c3RyKTsKfQoKLyoKICogcmVtb3ZlX2V4cGlyZWQoKSByZW1vdmVzIGV4cGlyZWQgY29va2llcy4KICovCnN0YXRpYyB2b2lkIHJlbW92ZV9leHBpcmVkKHN0cnVjdCBDb29raWVJbmZvICpjb29raWVzKQp7CiAgc3RydWN0IENvb2tpZSAqY28sICpueCwgKnB2OwogIGN1cmxfb2ZmX3Qgbm93ID0gKGN1cmxfb2ZmX3QpdGltZShOVUxMKTsKCiAgY28gPSBjb29raWVzLT5jb29raWVzOwogIHB2ID0gTlVMTDsKICB3aGlsZShjbykgewogICAgbnggPSBjby0+bmV4dDsKICAgIGlmKGNvLT5leHBpcmVzICYmIGNvLT5leHBpcmVzIDwgbm93KSB7CiAgICAgIGlmKGNvID09IGNvb2tpZXMtPmNvb2tpZXMpIHsKICAgICAgICBjb29raWVzLT5jb29raWVzID0gY28tPm5leHQ7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgcHYtPm5leHQgPSBjby0+bmV4dDsKICAgICAgfQogICAgICBjb29raWVzLT5udW1jb29raWVzLS07CiAgICAgIGZyZWVjb29raWUoY28pOwogICAgfQogICAgZWxzZSB7CiAgICAgIHB2ID0gY287CiAgICB9CiAgICBjbyA9IG54OwogIH0KfQoKLyoKICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhbiBJUCh2NHx2NikgYWRkcmVzcy4KICovCnN0YXRpYyBib29sIGlzaXAoY29uc3QgY2hhciAqZG9tYWluKQp7CiAgc3RydWN0IGluX2FkZHIgYWRkcjsKI2lmZGVmIEVOQUJMRV9JUFY2CiAgc3RydWN0IGluNl9hZGRyIGFkZHI2OwojZW5kaWYKCiAgaWYoQ3VybF9pbmV0X3B0b24oQUZfSU5FVCwgZG9tYWluLCAmYWRkcikKI2lmZGVmIEVOQUJMRV9JUFY2CiAgICAgfHwgQ3VybF9pbmV0X3B0b24oQUZfSU5FVDYsIGRvbWFpbiwgJmFkZHI2KQojZW5kaWYKICAgICkgewogICAgLyogZG9tYWluIG5hbWUgZ2l2ZW4gYXMgSVAgYWRkcmVzcyAqLwogICAgcmV0dXJuIFRSVUU7CiAgfQoKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2FkZCgpCiAqCiAqIEFkZCBhIHNpbmdsZSBjb29raWUgbGluZSB0byB0aGUgY29va2llIGtlZXBpbmcgb2JqZWN0LgogKgogKiBCZSBhd2FyZSB0aGF0IHNvbWV0aW1lcyB3ZSBnZXQgYW4gSVAtb25seSBob3N0IG5hbWUsIGFuZCB0aGF0IG1pZ2h0IGFsc28gYmUKICogYSBudW1lcmljYWwgSVB2NiBhZGRyZXNzLgogKgogKiBSZXR1cm5zIE5VTEwgb24gb3V0IG9mIG1lbW9yeSBvciBpbnZhbGlkIGNvb2tpZS4gVGhpcyBpcyBzdWJvcHRpbWFsLAogKiBhcyB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIHNlcGFyYXRlbHkuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdHJ1Y3QgQ29va2llICoKQ3VybF9jb29raWVfYWRkKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAvKiBUaGUgJ2RhdGEnIHBvaW50ZXIgaGVyZSBtYXkgYmUgTlVMTCBhdCB0aW1lcywgYW5kIHRodXMKICAgICAgICAgICAgICAgICAgIG11c3Qgb25seSBiZSB1c2VkIHZlcnkgY2FyZWZ1bGx5IGZvciB0aGluZ3MgdGhhdCBjYW4gZGVhbAogICAgICAgICAgICAgICAgICAgd2l0aCBkYXRhIGJlaW5nIE5VTEwuIFN1Y2ggYXMgaW5mb2YoKSBhbmQgc2ltaWxhciAqLwoKICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICpjLAogICAgICAgICAgICAgICAgYm9vbCBodHRwaGVhZGVyLCAvKiBUUlVFIGlmIEhUVFAgaGVhZGVyLXN0eWxlIGxpbmUgKi8KICAgICAgICAgICAgICAgIGNoYXIgKmxpbmVwdHIsICAgLyogZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkb21haW4sIC8qIGRlZmF1bHQgZG9tYWluICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoKSAgIC8qIGZ1bGwgcGF0aCB1c2VkIHdoZW4gdGhpcyBjb29raWUgaXMgc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGdldCBkZWZhdWx0IHBhdGggZm9yIHRoZSBjb29raWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHNldCAqLwp7CiAgc3RydWN0IENvb2tpZSAqY2xpc3Q7CiAgY2hhciBuYW1lW01BWF9OQU1FXTsKICBzdHJ1Y3QgQ29va2llICpjbzsKICBzdHJ1Y3QgQ29va2llICpsYXN0Yz1OVUxMOwogIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogIGJvb2wgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICBib29sIGJhZGNvb2tpZSA9IEZBTFNFOyAvKiBjb29raWVzIGFyZSBnb29kIGJ5IGRlZmF1bHQuIG1tbW1tIHl1bW15ICovCgojaWZkZWYgVVNFX0xJQlBTTAogIGNvbnN0IHBzbF9jdHhfdCAqcHNsOwojZW5kaWYKCiNpZmRlZiBDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTCiAgKHZvaWQpZGF0YTsKI2VuZGlmCgogIC8qIEZpcnN0LCBhbGxvYyBhbmQgaW5pdCBhIG5ldyBzdHJ1Y3QgZm9yIGl0ICovCiAgY28gPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBDb29raWUpKTsKICBpZighY28pCiAgICByZXR1cm4gTlVMTDsgLyogYmFpbCBvdXQgaWYgd2UncmUgdGhpcyBsb3cgb24gbWVtb3J5ICovCgogIGlmKGh0dHBoZWFkZXIpIHsKICAgIC8qIFRoaXMgbGluZSB3YXMgcmVhZCBvZmYgYSBIVFRQLWhlYWRlciAqLwogICAgY29uc3QgY2hhciAqcHRyOwogICAgY29uc3QgY2hhciAqc2VtaXB0cjsKICAgIGNoYXIgKndoYXQ7CgogICAgd2hhdCA9IG1hbGxvYyhNQVhfQ09PS0lFX0xJTkUpOwogICAgaWYoIXdoYXQpIHsKICAgICAgZnJlZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHNlbWlwdHI9c3RyY2hyKGxpbmVwdHIsICc7Jyk7IC8qIGZpcnN0LCBmaW5kIGEgc2VtaWNvbG9uICovCgogICAgd2hpbGUoKmxpbmVwdHIgJiYgSVNCTEFOSygqbGluZXB0cikpCiAgICAgIGxpbmVwdHIrKzsKCiAgICBwdHIgPSBsaW5lcHRyOwogICAgZG8gewogICAgICAvKiB3ZSBoYXZlIGEgPHdoYXQ+PTx0aGlzPiBwYWlyIG9yIGEgc3RhbmQtYWxvbmUgd29yZCBoZXJlICovCiAgICAgIG5hbWVbMF09d2hhdFswXT0wOyAvKiBpbml0IHRoZSBidWZmZXJzICovCiAgICAgIGlmKDEgPD0gc3NjYW5mKHB0ciwgIiUiIE1BWF9OQU1FX1RYVCAiW147XHJcbj1dID0lIgogICAgICAgICAgICAgICAgICAgICBNQVhfQ09PS0lFX0xJTkVfVFhUICJbXjtcclxuXSIsCiAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHdoYXQpKSB7CiAgICAgICAgLyogVXNlIHN0cnN0b3JlKCkgYmVsb3cgdG8gcHJvcGVybHkgZGVhbCB3aXRoIHJlY2VpdmVkIGNvb2tpZQogICAgICAgICAgIGhlYWRlcnMgdGhhdCBoYXZlIHRoZSBzYW1lIHN0cmluZyBwcm9wZXJ0eSBzZXQgbW9yZSB0aGFuIG9uY2UsCiAgICAgICAgICAgYW5kIHRoZW4gd2UgdXNlIHRoZSBsYXN0IG9uZS4gKi8KICAgICAgICBjb25zdCBjaGFyICp3aGF0cHRyOwogICAgICAgIGJvb2wgZG9uZSA9IEZBTFNFOwogICAgICAgIGJvb2wgc2VwOwogICAgICAgIHNpemVfdCBsZW49c3RybGVuKHdoYXQpOwogICAgICAgIHNpemVfdCBubGVuID0gc3RybGVuKG5hbWUpOwogICAgICAgIGNvbnN0IGNoYXIgKmVuZG9mbiA9ICZwdHJbIG5sZW4gXTsKCiAgICAgICAgLyogbmFtZSBlbmRzIHdpdGggYSAnPScgPyAqLwogICAgICAgIHNlcCA9ICgqZW5kb2ZuID09ICc9Jyk/VFJVRTpGQUxTRTsKCiAgICAgICAgaWYobmxlbikgewogICAgICAgICAgZW5kb2ZuLS07IC8qIG1vdmUgdG8gdGhlIGxhc3QgY2hhcmFjdGVyICovCiAgICAgICAgICBpZihJU0JMQU5LKCplbmRvZm4pKSB7CiAgICAgICAgICAgIC8qIHNraXAgdHJhaWxpbmcgc3BhY2VzIGluIG5hbWUgKi8KICAgICAgICAgICAgd2hpbGUoKmVuZG9mbiAmJiBJU0JMQU5LKCplbmRvZm4pICYmIG5sZW4pIHsKICAgICAgICAgICAgICBlbmRvZm4tLTsKICAgICAgICAgICAgICBubGVuLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmFtZVtubGVuXT0wOyAvKiBuZXcgZW5kIG9mIG5hbWUgKi8KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFN0cmlwIG9mZiB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlICd3aGF0JyAqLwogICAgICAgIHdoaWxlKGxlbiAmJiBJU0JMQU5LKHdoYXRbbGVuLTFdKSkgewogICAgICAgICAgd2hhdFtsZW4tMV09MDsKICAgICAgICAgIGxlbi0tOwogICAgICAgIH0KCiAgICAgICAgLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgJ3doYXQnICovCiAgICAgICAgd2hhdHB0cj13aGF0OwogICAgICAgIHdoaWxlKCp3aGF0cHRyICYmIElTQkxBTksoKndoYXRwdHIpKQogICAgICAgICAgd2hhdHB0cisrOwoKICAgICAgICBpZighY28tPm5hbWUgJiYgc2VwKSB7CiAgICAgICAgICAvKiBUaGUgdmVyeSBmaXJzdCBuYW1lL3ZhbHVlIHBhaXIgaXMgdGhlIGFjdHVhbCBjb29raWUgbmFtZSAqLwogICAgICAgICAgY28tPm5hbWUgPSBzdHJkdXAobmFtZSk7CiAgICAgICAgICBjby0+dmFsdWUgPSBzdHJkdXAod2hhdHB0cik7CiAgICAgICAgICBpZighY28tPm5hbWUgfHwgIWNvLT52YWx1ZSkgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZighbGVuKSB7CiAgICAgICAgICAvKiB0aGlzIHdhcyBhICI8bmFtZT49IiB3aXRoIG5vIGNvbnRlbnQsIGFuZCB3ZSBtdXN0IGFsbG93CiAgICAgICAgICAgICAnc2VjdXJlJyBhbmQgJ2h0dHBvbmx5JyBzcGVjaWZpZWQgdGhpcyB3ZWlyZGx5ICovCiAgICAgICAgICBkb25lID0gVFJVRTsKICAgICAgICAgIGlmKEN1cmxfcmF3X2VxdWFsKCJzZWN1cmUiLCBuYW1lKSkKICAgICAgICAgICAgY28tPnNlY3VyZSA9IFRSVUU7CiAgICAgICAgICBlbHNlIGlmKEN1cmxfcmF3X2VxdWFsKCJodHRwb25seSIsIG5hbWUpKQogICAgICAgICAgICBjby0+aHR0cG9ubHkgPSBUUlVFOwogICAgICAgICAgZWxzZSBpZihzZXApCiAgICAgICAgICAgIC8qIHRoZXJlIHdhcyBhICc9JyBzbyB3ZSdyZSBub3QgZG9uZSBwYXJzaW5nIHRoaXMgZmllbGQgKi8KICAgICAgICAgICAgZG9uZSA9IEZBTFNFOwogICAgICAgIH0KICAgICAgICBpZihkb25lKQogICAgICAgICAgOwogICAgICAgIGVsc2UgaWYoQ3VybF9yYXdfZXF1YWwoInBhdGgiLCBuYW1lKSkgewogICAgICAgICAgc3Ryc3RvcmUoJmNvLT5wYXRoLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+cGF0aCkgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOyAvKiBvdXQgb2YgbWVtb3J5IGJhZCAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvLT5zcGF0aCA9IHNhbml0aXplX2Nvb2tpZV9wYXRoKGNvLT5wYXRoKTsKICAgICAgICAgIGlmKCFjby0+c3BhdGgpIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoQ3VybF9yYXdfZXF1YWwoImRvbWFpbiIsIG5hbWUpKSB7CiAgICAgICAgICBib29sIGlzX2lwOwogICAgICAgICAgY29uc3QgY2hhciAqZG90cDsKCiAgICAgICAgICAvKiBOb3csIHdlIG1ha2Ugc3VyZSB0aGF0IG91ciBob3N0IGlzIHdpdGhpbiB0aGUgZ2l2ZW4gZG9tYWluLAogICAgICAgICAgICAgb3IgdGhlIGdpdmVuIGRvbWFpbiBpcyBub3QgdmFsaWQgYW5kIHRodXMgY2Fubm90IGJlIHNldC4gKi8KCiAgICAgICAgICBpZignLicgPT0gd2hhdHB0clswXSkKICAgICAgICAgICAgd2hhdHB0cisrOyAvKiBpZ25vcmUgcHJlY2VkaW5nIGRvdCAqLwoKICAgICAgICAgIGlzX2lwID0gaXNpcChkb21haW4gPyBkb21haW4gOiB3aGF0cHRyKTsKCiAgICAgICAgICAvKiBjaGVjayBmb3IgbW9yZSBkb3RzICovCiAgICAgICAgICBkb3RwID0gc3RyY2hyKHdoYXRwdHIsICcuJyk7CiAgICAgICAgICBpZighZG90cCkKICAgICAgICAgICAgZG9tYWluPSI6IjsKCiAgICAgICAgICBpZighZG9tYWluCiAgICAgICAgICAgICB8fCAoaXNfaXAgJiYgIXN0cmNtcCh3aGF0cHRyLCBkb21haW4pKQogICAgICAgICAgICAgfHwgKCFpc19pcCAmJiB0YWlsbWF0Y2god2hhdHB0ciwgZG9tYWluKSkpIHsKICAgICAgICAgICAgc3Ryc3RvcmUoJmNvLT5kb21haW4sIHdoYXRwdHIpOwogICAgICAgICAgICBpZighY28tPmRvbWFpbikgewogICAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoIWlzX2lwKQogICAgICAgICAgICAgIGNvLT50YWlsbWF0Y2g9VFJVRTsgLyogd2UgYWx3YXlzIGRvIHRoYXQgaWYgdGhlIGRvbWFpbiBuYW1lIHdhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gKi8KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiB3ZSBkaWQgbm90IGdldCBhIHRhaWxtYXRjaCBhbmQgdGhlbiB0aGUgYXR0ZW1wdGVkIHNldCBkb21haW4KICAgICAgICAgICAgICAgaXMgbm90IGEgZG9tYWluIHRvIHdoaWNoIHRoZSBjdXJyZW50IGhvc3QgYmVsb25ncy4gTWFyayBhcwogICAgICAgICAgICAgICBiYWQuICovCiAgICAgICAgICAgIGJhZGNvb2tpZT1UUlVFOwogICAgICAgICAgICBpbmZvZihkYXRhLCAic2tpcHBlZCBjb29raWUgd2l0aCBiYWQgdGFpbG1hdGNoIGRvbWFpbjogJXNcbiIsCiAgICAgICAgICAgICAgICAgIHdoYXRwdHIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKEN1cmxfcmF3X2VxdWFsKCJ2ZXJzaW9uIiwgbmFtZSkpIHsKICAgICAgICAgIHN0cnN0b3JlKCZjby0+dmVyc2lvbiwgd2hhdHB0cik7CiAgICAgICAgICBpZighY28tPnZlcnNpb24pIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoQ3VybF9yYXdfZXF1YWwoIm1heC1hZ2UiLCBuYW1lKSkgewogICAgICAgICAgLyogRGVmaW5lZCBpbiBSRkMyMTA5OgoKICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIE1heC1BZ2UgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxpZmV0aW1lIG9mIHRoZQogICAgICAgICAgICAgY29va2llLCBpbiBzZWNvbmRzLiAgVGhlIGRlbHRhLXNlY29uZHMgdmFsdWUgaXMgYSBkZWNpbWFsIG5vbi0KICAgICAgICAgICAgIG5lZ2F0aXZlIGludGVnZXIuICBBZnRlciBkZWx0YS1zZWNvbmRzIHNlY29uZHMgZWxhcHNlLCB0aGUKICAgICAgICAgICAgIGNsaWVudCBzaG91bGQgZGlzY2FyZCB0aGUgY29va2llLiAgQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIHRoZQogICAgICAgICAgICAgY29va2llIHNob3VsZCBiZSBkaXNjYXJkZWQgaW1tZWRpYXRlbHkuCgogICAgICAgICAgKi8KICAgICAgICAgIHN0cnN0b3JlKCZjby0+bWF4YWdlLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+bWF4YWdlKSB7CiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKEN1cmxfcmF3X2VxdWFsKCJleHBpcmVzIiwgbmFtZSkpIHsKICAgICAgICAgIHN0cnN0b3JlKCZjby0+ZXhwaXJlc3RyLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+ZXhwaXJlc3RyKSB7CiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAgZWxzZSB0aGlzIGlzIHRoZSBzZWNvbmQgKG9yIG1vcmUpIG5hbWUgd2UgZG9uJ3Qga25vdwogICAgICAgICAgYWJvdXQhICovCiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLyogdGhpcyBpcyBhbiAiaWxsZWdhbCIgPHdoYXQ+PTx0aGlzPiBwYWlyICovCiAgICAgIH0KCiAgICAgIGlmKCFzZW1pcHRyIHx8ICEqc2VtaXB0cikgewogICAgICAgIC8qIHdlIGFscmVhZHkga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBjb29raWVzICovCiAgICAgICAgc2VtaXB0ciA9IE5VTEw7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIHB0cj1zZW1pcHRyKzE7CiAgICAgIHdoaWxlKCpwdHIgJiYgSVNCTEFOSygqcHRyKSkKICAgICAgICBwdHIrKzsKICAgICAgc2VtaXB0cj1zdHJjaHIocHRyLCAnOycpOyAvKiBub3csIGZpbmQgdGhlIG5leHQgc2VtaWNvbG9uICovCgogICAgICBpZighc2VtaXB0ciAmJiAqcHRyKQogICAgICAgIC8qIFRoZXJlIGFyZSBubyBtb3JlIHNlbWljb2xvbnMsIGJ1dCB0aGVyZSdzIGEgZmluYWwgbmFtZT12YWx1ZSBwYWlyCiAgICAgICAgICAgY29taW5nIHVwICovCiAgICAgICAgc2VtaXB0cj1zdHJjaHIocHRyLCAnXDAnKTsKICAgIH0gd2hpbGUoc2VtaXB0cik7CgogICAgaWYoY28tPm1heGFnZSkgewogICAgICBjby0+ZXhwaXJlcyA9CiAgICAgICAgY3VybHhfc3RydG9vZmZ0KCgqY28tPm1heGFnZT09J1wiJyk/CiAgICAgICAgICAgICAgICAgICAgICAgICZjby0+bWF4YWdlWzFdOiZjby0+bWF4YWdlWzBdLCBOVUxMLCAxMCk7CiAgICAgIGlmKENVUkxfT0ZGX1RfTUFYIC0gbm93IDwgY28tPmV4cGlyZXMpCiAgICAgICAgLyogYXZvaWQgb3ZlcmZsb3cgKi8KICAgICAgICBjby0+ZXhwaXJlcyA9IENVUkxfT0ZGX1RfTUFYOwogICAgICBlbHNlCiAgICAgICAgY28tPmV4cGlyZXMgKz0gbm93OwogICAgfQogICAgZWxzZSBpZihjby0+ZXhwaXJlc3RyKSB7CiAgICAgIC8qIE5vdGUgdGhhdCBpZiB0aGUgZGF0ZSBjb3VsZG4ndCBnZXQgcGFyc2VkIGZvciB3aGF0ZXZlciByZWFzb24sCiAgICAgICAgIHRoZSBjb29raWUgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2Vzc2lvbiBjb29raWUgKi8KICAgICAgY28tPmV4cGlyZXMgPSBjdXJsX2dldGRhdGUoY28tPmV4cGlyZXN0ciwgTlVMTCk7CgogICAgICAvKiBTZXNzaW9uIGNvb2tpZXMgaGF2ZSBleHBpcmVzIHNldCB0byAwIHNvIGlmIHdlIGdldCB0aGF0IGJhY2sKICAgICAgICAgZnJvbSB0aGUgZGF0ZSBwYXJzZXIgbGV0J3MgYWRkIGEgc2Vjb25kIHRvIG1ha2UgaXQgYQogICAgICAgICBub24tc2Vzc2lvbiBjb29raWUgKi8KICAgICAgaWYoY28tPmV4cGlyZXMgPT0gMCkKICAgICAgICBjby0+ZXhwaXJlcyA9IDE7CiAgICAgIGVsc2UgaWYoY28tPmV4cGlyZXMgPCAwKQogICAgICAgIGNvLT5leHBpcmVzID0gMDsKICAgIH0KCiAgICBpZighYmFkY29va2llICYmICFjby0+ZG9tYWluKSB7CiAgICAgIGlmKGRvbWFpbikgewogICAgICAgIC8qIG5vIGRvbWFpbiB3YXMgZ2l2ZW4gaW4gdGhlIGhlYWRlciBsaW5lLCBzZXQgdGhlIGRlZmF1bHQgKi8KICAgICAgICBjby0+ZG9tYWluPXN0cmR1cChkb21haW4pOwogICAgICAgIGlmKCFjby0+ZG9tYWluKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgfQogICAgfQoKICAgIGlmKCFiYWRjb29raWUgJiYgIWNvLT5wYXRoICYmIHBhdGgpIHsKICAgICAgLyogTm8gcGF0aCB3YXMgZ2l2ZW4gaW4gdGhlIGhlYWRlciBsaW5lLCBzZXQgdGhlIGRlZmF1bHQuCiAgICAgICAgIE5vdGUgdGhhdCB0aGUgcGFzc2VkLWluIHBhdGggdG8gdGhpcyBmdW5jdGlvbiBNQVkgaGF2ZSBhICc/JyBhbmQKICAgICAgICAgZm9sbG93aW5nIHBhcnQgdGhhdCBNVVNUIG5vdCBiZSBzdG9yZWQgYXMgcGFydCBvZiB0aGUgcGF0aC4gKi8KICAgICAgY2hhciAqcXVlcnlwID0gc3RyY2hyKHBhdGgsICc/Jyk7CgogICAgICAvKiBxdWVyeXAgaXMgd2hlcmUgdGhlIGludGVyZXN0aW5nIHBhcnQgb2YgdGhlIHBhdGggZW5kcywgc28gbm93IHdlCiAgICAgICAgIHdhbnQgdG8gdGhlIGZpbmQgdGhlIGxhc3QgKi8KICAgICAgY2hhciAqZW5kc2xhc2g7CiAgICAgIGlmKCFxdWVyeXApCiAgICAgICAgZW5kc2xhc2ggPSBzdHJyY2hyKHBhdGgsICcvJyk7CiAgICAgIGVsc2UKICAgICAgICBlbmRzbGFzaCA9IG1lbXJjaHIocGF0aCwgJy8nLCAoc2l6ZV90KShxdWVyeXAgLSBwYXRoKSk7CiAgICAgIGlmKGVuZHNsYXNoKSB7CiAgICAgICAgc2l6ZV90IHBhdGhsZW4gPSAoc2l6ZV90KShlbmRzbGFzaC1wYXRoKzEpOyAvKiBpbmNsdWRlIGVuZGluZyBzbGFzaCAqLwogICAgICAgIGNvLT5wYXRoPW1hbGxvYyhwYXRobGVuKzEpOyAvKiBvbmUgZXh0cmEgZm9yIHRoZSB6ZXJvIGJ5dGUgKi8KICAgICAgICBpZihjby0+cGF0aCkgewogICAgICAgICAgbWVtY3B5KGNvLT5wYXRoLCBwYXRoLCBwYXRobGVuKTsKICAgICAgICAgIGNvLT5wYXRoW3BhdGhsZW5dPTA7IC8qIHplcm8gdGVybWluYXRlICovCiAgICAgICAgICBjby0+c3BhdGggPSBzYW5pdGl6ZV9jb29raWVfcGF0aChjby0+cGF0aCk7CiAgICAgICAgICBpZighY28tPnNwYXRoKQogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOyAvKiBvdXQgb2YgbWVtb3J5IGJhZCAqLwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICB9CiAgICB9CgogICAgZnJlZSh3aGF0KTsKCiAgICBpZihiYWRjb29raWUgfHwgIWNvLT5uYW1lKSB7CiAgICAgIC8qIHdlIGRpZG4ndCBnZXQgYSBjb29raWUgbmFtZSBvciBhIGJhZCBvbmUsCiAgICAgICAgIHRoaXMgaXMgYW4gaWxsZWdhbCBsaW5lLCBiYWlsIG91dCAqLwogICAgICBmcmVlY29va2llKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogIH0KICBlbHNlIHsKICAgIC8qIFRoaXMgbGluZSBpcyBOT1QgYSBIVFRQIGhlYWRlciBzdHlsZSBsaW5lLCB3ZSBkbyBvZmZlciBzdXBwb3J0IGZvcgogICAgICAgcmVhZGluZyB0aGUgb2RkIG5ldHNjYXBlIGNvb2tpZXMtZmlsZSBmb3JtYXQgaGVyZSAqLwogICAgY2hhciAqcHRyOwogICAgY2hhciAqZmlyc3RwdHI7CiAgICBjaGFyICp0b2tfYnVmPU5VTEw7CiAgICBpbnQgZmllbGRzOwoKICAgIC8qIElFIGludHJvZHVjZWQgSFRUUC1vbmx5IGNvb2tpZXMgdG8gcHJldmVudCBYU1MgYXR0YWNrcy4gQ29va2llcwogICAgICAgbWFya2VkIHdpdGggaHR0cE9ubHkgYWZ0ZXIgdGhlIGRvbWFpbiBuYW1lIGFyZSBub3QgYWNjZXNzaWJsZQogICAgICAgZnJvbSBqYXZhc2NyaXB0cywgYnV0IHNpbmNlIGN1cmwgZG9lcyBub3Qgb3BlcmF0ZSBhdCBqYXZhc2NyaXB0CiAgICAgICBsZXZlbCwgd2UgaW5jbHVkZSB0aGVtIGFueXdheS4gSW4gRmlyZWZveCdzIGNvb2tpZSBmaWxlcywgdGhlc2UKICAgICAgIGxpbmVzIGFyZSBwcmVjZWRlZCB3aXRoICNIdHRwT25seV8gYW5kIHRoZW4gZXZlcnl0aGluZyBpcwogICAgICAgYXMgdXN1YWwsIHNvIHdlIHNraXAgMTAgY2hhcmFjdGVycyBvZiB0aGUgbGluZS4uCiAgICAqLwogICAgaWYoc3RybmNtcChsaW5lcHRyLCAiI0h0dHBPbmx5XyIsIDEwKSA9PSAwKSB7CiAgICAgIGxpbmVwdHIgKz0gMTA7CiAgICAgIGNvLT5odHRwb25seSA9IFRSVUU7CiAgICB9CgogICAgaWYobGluZXB0clswXT09JyMnKSB7CiAgICAgIC8qIGRvbid0IGV2ZW4gdHJ5IHRoZSBjb21tZW50cyAqLwogICAgICBmcmVlKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICAvKiBzdHJpcCBvZmYgdGhlIHBvc3NpYmxlIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMgKi8KICAgIHB0cj1zdHJjaHIobGluZXB0ciwgJ1xyJyk7CiAgICBpZihwdHIpCiAgICAgICpwdHI9MDsgLyogY2xlYXIgaXQgKi8KICAgIHB0cj1zdHJjaHIobGluZXB0ciwgJ1xuJyk7CiAgICBpZihwdHIpCiAgICAgICpwdHI9MDsgLyogY2xlYXIgaXQgKi8KCiAgICBmaXJzdHB0cj1zdHJ0b2tfcihsaW5lcHRyLCAiXHQiLCAmdG9rX2J1Zik7IC8qIHRva2VuaXplIGl0IG9uIHRoZSBUQUIgKi8KCiAgICAvKiBOb3cgbG9vcCB0aHJvdWdoIHRoZSBmaWVsZHMgYW5kIGluaXQgdGhlIHN0cnVjdCB3ZSBhbHJlYWR5IGhhdmUKICAgICAgIGFsbG9jYXRlZCAqLwogICAgZm9yKHB0cj1maXJzdHB0ciwgZmllbGRzPTA7IHB0ciAmJiAhYmFkY29va2llOwogICAgICAgIHB0cj1zdHJ0b2tfcihOVUxMLCAiXHQiLCAmdG9rX2J1ZiksIGZpZWxkcysrKSB7CiAgICAgIHN3aXRjaChmaWVsZHMpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGlmKHB0clswXT09Jy4nKSAvKiBza2lwIHByZWNlZGluZyBkb3RzICovCiAgICAgICAgICBwdHIrKzsKICAgICAgICBjby0+ZG9tYWluID0gc3RyZHVwKHB0cik7CiAgICAgICAgaWYoIWNvLT5kb21haW4pCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6CiAgICAgICAgLyogVGhpcyBmaWVsZCBnb3QgaXRzIGV4cGxhbmF0aW9uIG9uIHRoZSAyM3JkIG9mIE1heSAyMDAxIGJ5CiAgICAgICAgICAgQW5kculzIEdhcmPtYToKCiAgICAgICAgICAgZmxhZzogQSBUUlVFL0ZBTFNFIHZhbHVlIGluZGljYXRpbmcgaWYgYWxsIG1hY2hpbmVzIHdpdGhpbiBhIGdpdmVuCiAgICAgICAgICAgZG9tYWluIGNhbiBhY2Nlc3MgdGhlIHZhcmlhYmxlLiBUaGlzIHZhbHVlIGlzIHNldCBhdXRvbWF0aWNhbGx5IGJ5CiAgICAgICAgICAgdGhlIGJyb3dzZXIsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgeW91IHNldCBmb3IgdGhlIGRvbWFpbi4KCiAgICAgICAgICAgQXMgZmFyIGFzIEkgY2FuIHNlZSwgaXQgaXMgc2V0IHRvIHRydWUgd2hlbiB0aGUgY29va2llIHNheXMKICAgICAgICAgICAuZG9tYWluLmNvbSBhbmQgdG8gZmFsc2Ugd2hlbiB0aGUgZG9tYWluIGlzIGNvbXBsZXRlIHd3dy5kb21haW4uY29tCiAgICAgICAgKi8KICAgICAgICBjby0+dGFpbG1hdGNoID0gQ3VybF9yYXdfZXF1YWwocHRyLCAiVFJVRSIpP1RSVUU6RkFMU0U7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICAvKiBJdCB0dXJucyBvdXQsIHRoYXQgc29tZXRpbWVzIHRoZSBmaWxlIGZvcm1hdCBhbGxvd3MgdGhlIHBhdGgKICAgICAgICAgICBmaWVsZCB0byByZW1haW4gbm90IGZpbGxlZCBpbiwgd2UgdHJ5IHRvIGRldGVjdCB0aGlzIGFuZCB3b3JrCiAgICAgICAgICAgYXJvdW5kIGl0ISBBbmRy6XMgR2FyY+1hIG1hZGUgdXMgYXdhcmUgb2YgdGhpcy4uLiAqLwogICAgICAgIGlmKHN0cmNtcCgiVFJVRSIsIHB0cikgJiYgc3RyY21wKCJGQUxTRSIsIHB0cikpIHsKICAgICAgICAgIC8qIG9ubHkgaWYgdGhlIHBhdGggZG9lc24ndCBsb29rIGxpa2UgYSBib29sZWFuIG9wdGlvbiEgKi8KICAgICAgICAgIGNvLT5wYXRoID0gc3RyZHVwKHB0cik7CiAgICAgICAgICBpZighY28tPnBhdGgpCiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY28tPnNwYXRoID0gc2FuaXRpemVfY29va2llX3BhdGgoY28tPnBhdGgpOwogICAgICAgICAgICBpZighY28tPnNwYXRoKSB7CiAgICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIHRoaXMgZG9lc24ndCBsb29rIGxpa2UgYSBwYXRoLCBtYWtlIG9uZSB1cCEgKi8KICAgICAgICBjby0+cGF0aCA9IHN0cmR1cCgiLyIpOwogICAgICAgIGlmKCFjby0+cGF0aCkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgY28tPnNwYXRoID0gc3RyZHVwKCIvIik7CiAgICAgICAgaWYoIWNvLT5zcGF0aCkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgZmllbGRzKys7IC8qIGFkZCBhIGZpZWxkIGFuZCBmYWxsIGRvd24gdG8gc2VjdXJlICovCiAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KICAgICAgY2FzZSAzOgogICAgICAgIGNvLT5zZWN1cmUgPSBDdXJsX3Jhd19lcXVhbChwdHIsICJUUlVFIik/VFJVRTpGQUxTRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA0OgogICAgICAgIGNvLT5leHBpcmVzID0gY3VybHhfc3RydG9vZmZ0KHB0ciwgTlVMTCwgMTApOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDU6CiAgICAgICAgY28tPm5hbWUgPSBzdHJkdXAocHRyKTsKICAgICAgICBpZighY28tPm5hbWUpCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDY6CiAgICAgICAgY28tPnZhbHVlID0gc3RyZHVwKHB0cik7CiAgICAgICAgaWYoIWNvLT52YWx1ZSkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmKDYgPT0gZmllbGRzKSB7CiAgICAgIC8qIHdlIGdvdCBhIGNvb2tpZSB3aXRoIGJsYW5rIGNvbnRlbnRzLCBmaXggaXQgKi8KICAgICAgY28tPnZhbHVlID0gc3RyZHVwKCIiKTsKICAgICAgaWYoIWNvLT52YWx1ZSkKICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICBlbHNlCiAgICAgICAgZmllbGRzKys7CiAgICB9CgogICAgaWYoIWJhZGNvb2tpZSAmJiAoNyAhPSBmaWVsZHMpKQogICAgICAvKiB3ZSBkaWQgbm90IGZpbmQgdGhlIHN1ZmZpY2llbnQgbnVtYmVyIG9mIGZpZWxkcyAqLwogICAgICBiYWRjb29raWUgPSBUUlVFOwoKICAgIGlmKGJhZGNvb2tpZSkgewogICAgICBmcmVlY29va2llKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogIH0KCiAgaWYoIWMtPnJ1bm5pbmcgJiYgICAgLyogcmVhZCBmcm9tIGEgZmlsZSAqLwogICAgIGMtPm5ld3Nlc3Npb24gJiYgIC8qIGNsZWFuIHNlc3Npb24gY29va2llcyAqLwogICAgICFjby0+ZXhwaXJlcykgeyAgIC8qIHRoaXMgaXMgYSBzZXNzaW9uIGNvb2tpZSBzaW5jZSBpdCBkb2Vzbid0IGV4cGlyZSEgKi8KICAgIGZyZWVjb29raWUoY28pOwogICAgcmV0dXJuIE5VTEw7CiAgfQoKICBjby0+bGl2ZWNvb2tpZSA9IGMtPnJ1bm5pbmc7CgogIC8qIG5vdywgd2UgaGF2ZSBwYXJzZWQgdGhlIGluY29taW5nIGxpbmUsIHdlIG11c3Qgbm93IGNoZWNrIGlmIHRoaXMKICAgICBzdXBlcmNlZWRzIGFuIGFscmVhZHkgZXhpc3RpbmcgY29va2llLCB3aGljaCBpdCBtYXkgaWYgdGhlIHByZXZpb3VzIGhhdmUKICAgICB0aGUgc2FtZSBkb21haW4gYW5kIHBhdGggYXMgdGhpcyAqLwoKICAvKiBhdCBmaXJzdCwgcmVtb3ZlIGV4cGlyZWQgY29va2llcyAqLwogIHJlbW92ZV9leHBpcmVkKGMpOwoKI2lmZGVmIFVTRV9MSUJQU0wKICAvKiBDaGVjayBpZiB0aGUgZG9tYWluIGlzIGEgUHVibGljIFN1ZmZpeCBhbmQgaWYgeWVzLCBpZ25vcmUgdGhlIGNvb2tpZS4KICAgICBUaGlzIG5lZWRzIGEgbGlicHNsIGNvbXBpbGVkIHdpdGggYnVpbHRpbiBkYXRhLiAqLwogIGlmKGRvbWFpbiAmJiBjby0+ZG9tYWluICYmICFpc2lwKGNvLT5kb21haW4pKSB7CiAgICBpZigoKHBzbCA9IHBzbF9idWlsdGluKCkpICE9IE5VTEwpCiAgICAgICAgJiYgIXBzbF9pc19jb29raWVfZG9tYWluX2FjY2VwdGFibGUocHNsLCBkb21haW4sIGNvLT5kb21haW4pKSB7CiAgICAgIGluZm9mKGRhdGEsCiAgICAgICAgICAgICJjb29raWUgJyVzJyBkcm9wcGVkLCBkb21haW4gJyVzJyBtdXN0IG5vdCBzZXQgY29va2llcyBmb3IgJyVzJ1xuIiwKICAgICAgICAgICAgY28tPm5hbWUsIGRvbWFpbiwgY28tPmRvbWFpbik7CiAgICAgIGZyZWVjb29raWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICB9CiNlbmRpZgoKICBjbGlzdCA9IGMtPmNvb2tpZXM7CiAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICB3aGlsZShjbGlzdCkgewogICAgaWYoQ3VybF9yYXdfZXF1YWwoY2xpc3QtPm5hbWUsIGNvLT5uYW1lKSkgewogICAgICAvKiB0aGUgbmFtZXMgYXJlIGlkZW50aWNhbCAqLwoKICAgICAgaWYoY2xpc3QtPmRvbWFpbiAmJiBjby0+ZG9tYWluKSB7CiAgICAgICAgaWYoQ3VybF9yYXdfZXF1YWwoY2xpc3QtPmRvbWFpbiwgY28tPmRvbWFpbikpCiAgICAgICAgICAvKiBUaGUgZG9tYWlucyBhcmUgaWRlbnRpY2FsICovCiAgICAgICAgICByZXBsYWNlX29sZD1UUlVFOwogICAgICB9CiAgICAgIGVsc2UgaWYoIWNsaXN0LT5kb21haW4gJiYgIWNvLT5kb21haW4pCiAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwoKICAgICAgaWYocmVwbGFjZV9vbGQpIHsKICAgICAgICAvKiB0aGUgZG9tYWlucyB3ZXJlIGlkZW50aWNhbCAqLwoKICAgICAgICBpZihjbGlzdC0+c3BhdGggJiYgY28tPnNwYXRoKSB7CiAgICAgICAgICBpZihDdXJsX3Jhd19lcXVhbChjbGlzdC0+c3BhdGgsIGNvLT5zcGF0aCkpIHsKICAgICAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgICByZXBsYWNlX29sZCA9IEZBTFNFOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKCFjbGlzdC0+c3BhdGggJiYgIWNvLT5zcGF0aCkKICAgICAgICAgIHJlcGxhY2Vfb2xkID0gVFJVRTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXBsYWNlX29sZCA9IEZBTFNFOwoKICAgICAgfQoKICAgICAgaWYocmVwbGFjZV9vbGQgJiYgIWNvLT5saXZlY29va2llICYmIGNsaXN0LT5saXZlY29va2llKSB7CiAgICAgICAgLyogQm90aCBjb29raWVzIG1hdGNoZWQgZmluZSwgZXhjZXB0IHRoYXQgdGhlIGFscmVhZHkgcHJlc2VudAogICAgICAgICAgIGNvb2tpZSBpcyAibGl2ZSIsIHdoaWNoIG1lYW5zIGl0IHdhcyBzZXQgZnJvbSBhIGhlYWRlciwgd2hpbGUKICAgICAgICAgICB0aGUgbmV3IG9uZSBpc24ndCAibGl2ZSIgYW5kIHRodXMgb25seSByZWFkIGZyb20gYSBmaWxlLiBXZSBsZXQKICAgICAgICAgICBsaXZlIGNvb2tpZXMgc3RheSBhbGl2ZSAqLwoKICAgICAgICAvKiBGcmVlIHRoZSBuZXdjb21lciBhbmQgZ2V0IG91dCBvZiBoZXJlISAqLwogICAgICAgIGZyZWVjb29raWUoY28pOwogICAgICAgIHJldHVybiBOVUxMOwogICAgICB9CgogICAgICBpZihyZXBsYWNlX29sZCkgewogICAgICAgIGNvLT5uZXh0ID0gY2xpc3QtPm5leHQ7IC8qIGdldCB0aGUgbmV4dC1wb2ludGVyIGZpcnN0ICovCgogICAgICAgIC8qIHRoZW4gZnJlZSBhbGwgdGhlIG9sZCBwb2ludGVycyAqLwogICAgICAgIGZyZWUoY2xpc3QtPm5hbWUpOwogICAgICAgIGZyZWUoY2xpc3QtPnZhbHVlKTsKICAgICAgICBmcmVlKGNsaXN0LT5kb21haW4pOwogICAgICAgIGZyZWUoY2xpc3QtPnBhdGgpOwogICAgICAgIGZyZWUoY2xpc3QtPnNwYXRoKTsKICAgICAgICBmcmVlKGNsaXN0LT5leHBpcmVzdHIpOwogICAgICAgIGZyZWUoY2xpc3QtPnZlcnNpb24pOwogICAgICAgIGZyZWUoY2xpc3QtPm1heGFnZSk7CgogICAgICAgICpjbGlzdCA9ICpjbzsgIC8qIHRoZW4gc3RvcmUgYWxsIHRoZSBuZXcgZGF0YSAqLwoKICAgICAgICBmcmVlKGNvKTsgICAvKiBmcmVlIHRoZSBuZXdseSBhbGxvY2VkIG1lbW9yeSAqLwogICAgICAgIGNvID0gY2xpc3Q7IC8qIHBvaW50IHRvIHRoZSBwcmV2aW91cyBzdHJ1Y3QgaW5zdGVhZCAqLwoKICAgICAgICAvKiBXZSBoYXZlIHJlcGxhY2VkIGEgY29va2llLCBub3cgc2tpcCB0aGUgcmVzdCBvZiB0aGUgbGlzdCBidXQKICAgICAgICAgICBtYWtlIHN1cmUgdGhlICdsYXN0YycgcG9pbnRlciBpcyBwcm9wZXJseSBzZXQgKi8KICAgICAgICBkbyB7CiAgICAgICAgICBsYXN0YyA9IGNsaXN0OwogICAgICAgICAgY2xpc3QgPSBjbGlzdC0+bmV4dDsKICAgICAgICB9IHdoaWxlKGNsaXN0KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgbGFzdGMgPSBjbGlzdDsKICAgIGNsaXN0ID0gY2xpc3QtPm5leHQ7CiAgfQoKICBpZihjLT5ydW5uaW5nKQogICAgLyogT25seSBzaG93IHRoaXMgd2hlbiBOT1QgcmVhZGluZyB0aGUgY29va2llcyBmcm9tIGEgZmlsZSAqLwogICAgaW5mb2YoZGF0YSwgIiVzIGNvb2tpZSAlcz1cIiVzXCIgZm9yIGRvbWFpbiAlcywgcGF0aCAlcywgIgogICAgICAgICAgImV4cGlyZSAlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJcbiIsCiAgICAgICAgICByZXBsYWNlX29sZD8iUmVwbGFjZWQiOiJBZGRlZCIsIGNvLT5uYW1lLCBjby0+dmFsdWUsCiAgICAgICAgICBjby0+ZG9tYWluLCBjby0+cGF0aCwgY28tPmV4cGlyZXMpOwoKICBpZighcmVwbGFjZV9vbGQpIHsKICAgIC8qIHRoZW4gbWFrZSB0aGUgbGFzdCBpdGVtIHBvaW50IG9uIHRoaXMgbmV3IG9uZSAqLwogICAgaWYobGFzdGMpCiAgICAgIGxhc3RjLT5uZXh0ID0gY287CiAgICBlbHNlCiAgICAgIGMtPmNvb2tpZXMgPSBjbzsKICAgIGMtPm51bWNvb2tpZXMrKzsgLyogb25lIG1vcmUgY29va2llIGluIHRoZSBqYXIgKi8KICB9CgogIHJldHVybiBjbzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2luaXQoKQogKgogKiBJbml0cyBhIGNvb2tpZSBzdHJ1Y3QgdG8gcmVhZCBkYXRhIGZyb20gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwogKiBjYWxsZWQgYmVmb3JlIGFueSBjb29raWVzIGFyZSBzZXQuIEZpbGUgbWF5IGJlIE5VTEwuCiAqCiAqIElmICduZXdzZXNzaW9uJyBpcyBUUlVFLCBkaXNjYXJkIGFsbCAic2Vzc2lvbiBjb29raWVzIiBvbiByZWFkIGZyb20gZmlsZS4KICoKICogUmV0dXJucyBOVUxMIG9uIG91dCBvZiBtZW1vcnkuIEludmFsaWQgY29va2llcyBhcmUgaWdub3JlZC4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBDb29raWVJbmZvICpDdXJsX2Nvb2tpZV9pbml0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICppbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmV3c2Vzc2lvbikKewogIHN0cnVjdCBDb29raWVJbmZvICpjOwogIEZJTEUgKmZwID0gTlVMTDsKICBib29sIGZyb21maWxlPVRSVUU7CiAgY2hhciAqbGluZSA9IE5VTEw7CgogIGlmKE5VTEwgPT0gaW5jKSB7CiAgICAvKiB3ZSBkaWRuJ3QgZ2V0IGEgc3RydWN0LCBjcmVhdGUgb25lICovCiAgICBjID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgQ29va2llSW5mbykpOwogICAgaWYoIWMpCiAgICAgIHJldHVybiBOVUxMOyAvKiBmYWlsZWQgdG8gZ2V0IG1lbW9yeSAqLwogICAgYy0+ZmlsZW5hbWUgPSBzdHJkdXAoZmlsZT9maWxlOiJub25lIik7IC8qIGNvcHkgdGhlIG5hbWUganVzdCBpbiBjYXNlICovCiAgICBpZighYy0+ZmlsZW5hbWUpCiAgICAgIGdvdG8gZmFpbDsgLyogZmFpbGVkIHRvIGdldCBtZW1vcnkgKi8KICB9CiAgZWxzZSB7CiAgICAvKiB3ZSBnb3QgYW4gYWxyZWFkeSBleGlzdGluZyBvbmUsIHVzZSB0aGF0ICovCiAgICBjID0gaW5jOwogIH0KICBjLT5ydW5uaW5nID0gRkFMU0U7IC8qIHRoaXMgaXMgbm90IHJ1bm5pbmcsIHRoaXMgaXMgaW5pdCAqLwoKICBpZihmaWxlICYmIHN0cmVxdWFsKGZpbGUsICItIikpIHsKICAgIGZwID0gc3RkaW47CiAgICBmcm9tZmlsZT1GQUxTRTsKICB9CiAgZWxzZSBpZihmaWxlICYmICEqZmlsZSkgewogICAgLyogcG9pbnRzIHRvIGEgIiIgc3RyaW5nICovCiAgICBmcCA9IE5VTEw7CiAgfQogIGVsc2UKICAgIGZwID0gZmlsZT9mb3BlbihmaWxlLCBGT1BFTl9SRUFEVEVYVCk6TlVMTDsKCiAgYy0+bmV3c2Vzc2lvbiA9IG5ld3Nlc3Npb247IC8qIG5ldyBzZXNzaW9uPyAqLwoKICBpZihmcCkgewogICAgY2hhciAqbGluZXB0cjsKICAgIGJvb2wgaGVhZGVybGluZTsKCiAgICBsaW5lID0gbWFsbG9jKE1BWF9DT09LSUVfTElORSk7CiAgICBpZighbGluZSkKICAgICAgZ290byBmYWlsOwogICAgd2hpbGUoZmdldHMobGluZSwgTUFYX0NPT0tJRV9MSU5FLCBmcCkpIHsKICAgICAgaWYoY2hlY2twcmVmaXgoIlNldC1Db29raWU6IiwgbGluZSkpIHsKICAgICAgICAvKiBUaGlzIGlzIGEgY29va2llIGxpbmUsIGdldCBpdCEgKi8KICAgICAgICBsaW5lcHRyPSZsaW5lWzExXTsKICAgICAgICBoZWFkZXJsaW5lPVRSVUU7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgbGluZXB0cj1saW5lOwogICAgICAgIGhlYWRlcmxpbmU9RkFMU0U7CiAgICAgIH0KICAgICAgd2hpbGUoKmxpbmVwdHIgJiYgSVNCTEFOSygqbGluZXB0cikpCiAgICAgICAgbGluZXB0cisrOwoKICAgICAgQ3VybF9jb29raWVfYWRkKGRhdGEsIGMsIGhlYWRlcmxpbmUsIGxpbmVwdHIsIE5VTEwsIE5VTEwpOwogICAgfQogICAgZnJlZShsaW5lKTsgLyogZnJlZSB0aGUgbGluZSBidWZmZXIgKi8KCiAgICBpZihmcm9tZmlsZSkKICAgICAgZmNsb3NlKGZwKTsKICB9CgogIGMtPnJ1bm5pbmcgPSBUUlVFOyAgICAgICAgICAvKiBub3csIHdlJ3JlIHJ1bm5pbmcgKi8KCiAgcmV0dXJuIGM7CgpmYWlsOgogIGZyZWUobGluZSk7CiAgaWYoIWluYykKICAgIC8qIE9ubHkgY2xlYW4gdXAgaWYgd2UgYWxsb2NhdGVkIGl0IGhlcmUsIGFzIHRoZSBvcmlnaW5hbCBjb3VsZCBzdGlsbCBiZSBpbgogICAgICogdXNlIGJ5IGEgc2hhcmUgaGFuZGxlICovCiAgICBDdXJsX2Nvb2tpZV9jbGVhbnVwKGMpOwogIGlmKGZyb21maWxlICYmIGZwKQogICAgZmNsb3NlKGZwKTsKICByZXR1cm4gTlVMTDsgLyogb3V0IG9mIG1lbW9yeSAqLwp9CgovKiBzb3J0IHRoaXMgc28gdGhhdCB0aGUgbG9uZ2VzdCBwYXRoIGdldHMgYmVmb3JlIHRoZSBzaG9ydGVyIHBhdGggKi8Kc3RhdGljIGludCBjb29raWVfc29ydChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCnsKICBzdHJ1Y3QgQ29va2llICpjMSA9ICooc3RydWN0IENvb2tpZSAqKilwMTsKICBzdHJ1Y3QgQ29va2llICpjMiA9ICooc3RydWN0IENvb2tpZSAqKilwMjsKICBzaXplX3QgbDEsIGwyOwoKICAvKiAxIC0gY29tcGFyZSBjb29raWUgcGF0aCBsZW5ndGhzICovCiAgbDEgPSBjMS0+cGF0aCA/IHN0cmxlbihjMS0+cGF0aCkgOiAwOwogIGwyID0gYzItPnBhdGggPyBzdHJsZW4oYzItPnBhdGgpIDogMDsKCiAgaWYobDEgIT0gbDIpCiAgICByZXR1cm4gKGwyID4gbDEpID8gMSA6IC0xIDsgLyogYXZvaWQgc2l6ZV90IDw9PiBpbnQgY29udmVyc2lvbnMgKi8KCiAgLyogMiAtIGNvbXBhcmUgY29va2llIGRvbWFpbiBsZW5ndGhzICovCiAgbDEgPSBjMS0+ZG9tYWluID8gc3RybGVuKGMxLT5kb21haW4pIDogMDsKICBsMiA9IGMyLT5kb21haW4gPyBzdHJsZW4oYzItPmRvbWFpbikgOiAwOwoKICBpZihsMSAhPSBsMikKICAgIHJldHVybiAobDIgPiBsMSkgPyAxIDogLTEgOyAgLyogYXZvaWQgc2l6ZV90IDw9PiBpbnQgY29udmVyc2lvbnMgKi8KCiAgLyogMyAtIGNvbXBhcmUgY29va2llIG5hbWVzICovCiAgaWYoYzEtPm5hbWUgJiYgYzItPm5hbWUpCiAgICByZXR1cm4gc3RyY21wKGMxLT5uYW1lLCBjMi0+bmFtZSk7CgogIC8qIHNvcnJ5LCBjYW4ndCBiZSBtb3JlIGRldGVybWluaXN0aWMgKi8KICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2dldGxpc3QoKQogKgogKiBGb3IgYSBnaXZlbiBob3N0IGFuZCBwYXRoLCByZXR1cm4gYSBsaW5rZWQgbGlzdCBvZiBjb29raWVzIHRoYXQgdGhlCiAqIGNsaWVudCBzaG91bGQgc2VuZCB0byB0aGUgc2VydmVyIGlmIHVzZWQgbm93LiBUaGUgc2VjdXJlIGJvb2xlYW4gaW5mb3JtcwogKiB0aGUgY29va2llIGlmIGEgc2VjdXJlIGNvbm5lY3Rpb24gaXMgYWNoaWV2ZWQgb3Igbm90LgogKgogKiBJdCBzaGFsbCBvbmx5IHJldHVybiBjb29raWVzIHRoYXQgaGF2ZW4ndCBleHBpcmVkLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0cnVjdCBDb29raWUgKkN1cmxfY29va2llX2dldGxpc3Qoc3RydWN0IENvb2tpZUluZm8gKmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNlY3VyZSkKewogIHN0cnVjdCBDb29raWUgKm5ld2NvOwogIHN0cnVjdCBDb29raWUgKmNvOwogIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogIHN0cnVjdCBDb29raWUgKm1haW5jbz1OVUxMOwogIHNpemVfdCBtYXRjaGVzID0gMDsKICBib29sIGlzX2lwOwoKICBpZighYyB8fCAhYy0+Y29va2llcykKICAgIHJldHVybiBOVUxMOyAvKiBubyBjb29raWUgc3RydWN0IG9yIG5vIGNvb2tpZXMgaW4gdGhlIHN0cnVjdCAqLwoKICAvKiBhdCBmaXJzdCwgcmVtb3ZlIGV4cGlyZWQgY29va2llcyAqLwogIHJlbW92ZV9leHBpcmVkKGMpOwoKICAvKiBjaGVjayBpZiBob3N0IGlzIGFuIElQKHY0fHY2KSBhZGRyZXNzICovCiAgaXNfaXAgPSBpc2lwKGhvc3QpOwoKICBjbyA9IGMtPmNvb2tpZXM7CgogIHdoaWxlKGNvKSB7CiAgICAvKiBvbmx5IHByb2Nlc3MgdGhpcyBjb29raWUgaWYgaXQgaXMgbm90IGV4cGlyZWQgb3IgaGFkIG5vIGV4cGlyZQogICAgICAgZGF0ZSBBTkQgdGhhdCBpZiB0aGUgY29va2llIHJlcXVpcmVzIHdlJ3JlIHNlY3VyZSB3ZSBtdXN0IG9ubHkKICAgICAgIGNvbnRpbnVlIGlmIHdlIGFyZSEgKi8KICAgIGlmKCghY28tPmV4cGlyZXMgfHwgKGNvLT5leHBpcmVzID4gbm93KSkgJiYKICAgICAgIChjby0+c2VjdXJlP3NlY3VyZTpUUlVFKSkgewoKICAgICAgLyogbm93IGNoZWNrIGlmIHRoZSBkb21haW4gaXMgY29ycmVjdCAqLwogICAgICBpZighY28tPmRvbWFpbiB8fAogICAgICAgICAoY28tPnRhaWxtYXRjaCAmJiAhaXNfaXAgJiYgdGFpbG1hdGNoKGNvLT5kb21haW4sIGhvc3QpKSB8fAogICAgICAgICAoKCFjby0+dGFpbG1hdGNoIHx8IGlzX2lwKSAmJiBDdXJsX3Jhd19lcXVhbChob3N0LCBjby0+ZG9tYWluKSkgKSB7CiAgICAgICAgLyogdGhlIHJpZ2h0IHBhcnQgb2YgdGhlIGhvc3QgbWF0Y2hlcyB0aGUgZG9tYWluIHN0dWZmIGluIHRoZQogICAgICAgICAgIGNvb2tpZSBkYXRhICovCgogICAgICAgIC8qIG5vdyBjaGVjayB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBwYXRoIHdpdGggdGhlIGNvb2tpZXMgcGF0aAogICAgICAgICAgIHJlcXVpcmVtZW50ICovCiAgICAgICAgaWYoIWNvLT5zcGF0aCB8fCBwYXRobWF0Y2goY28tPnNwYXRoLCBwYXRoKSApIHsKCiAgICAgICAgICAvKiBhbmQgbm93LCB3ZSBrbm93IHRoaXMgaXMgYSBtYXRjaCBhbmQgd2Ugc2hvdWxkIGNyZWF0ZSBhbgogICAgICAgICAgICAgZW50cnkgZm9yIHRoZSByZXR1cm4tbGlua2VkLWxpc3QgKi8KCiAgICAgICAgICBuZXdjbyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IENvb2tpZSkpOwogICAgICAgICAgaWYobmV3Y28pIHsKICAgICAgICAgICAgLyogZmlyc3QsIGNvcHkgdGhlIHdob2xlIHNvdXJjZSBjb29raWU6ICovCiAgICAgICAgICAgIG1lbWNweShuZXdjbywgY28sIHNpemVvZihzdHJ1Y3QgQ29va2llKSk7CgogICAgICAgICAgICAvKiB0aGVuIG1vZGlmeSBvdXIgbmV4dCAqLwogICAgICAgICAgICBuZXdjby0+bmV4dCA9IG1haW5jbzsKCiAgICAgICAgICAgIC8qIHBvaW50IHRoZSBtYWluIHRvIHVzICovCiAgICAgICAgICAgIG1haW5jbyA9IG5ld2NvOwoKICAgICAgICAgICAgbWF0Y2hlcysrOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZhaWw6CiAgICAgICAgICAgIC8qIGZhaWx1cmUsIGNsZWFyIHVwIHRoZSBhbGxvY2F0ZWQgY2hhaW4gYW5kIHJldHVybiBOVUxMICovCiAgICAgICAgICAgIHdoaWxlKG1haW5jbykgewogICAgICAgICAgICAgIGNvID0gbWFpbmNvLT5uZXh0OwogICAgICAgICAgICAgIGZyZWUobWFpbmNvKTsKICAgICAgICAgICAgICBtYWluY28gPSBjbzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjbyA9IGNvLT5uZXh0OwogIH0KCiAgaWYobWF0Y2hlcykgewogICAgLyogTm93IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUgaXMgYSBuYW1lIGFwcGVhcmluZyBtb3JlIHRoYW4KICAgICAgIG9uY2UsIHRoZSBsb25nZXN0IHNwZWNpZmllZCBwYXRoIHZlcnNpb24gY29tZXMgZmlyc3QuIFRvIG1ha2UgdGhpcwogICAgICAgdGhlIHN3aWZ0ZXN0IHdheSwgd2UganVzdCBzb3J0IHRoZW0gYWxsIGJhc2VkIG9uIHBhdGggbGVuZ3RoLiAqLwogICAgc3RydWN0IENvb2tpZSAqKmFycmF5OwogICAgc2l6ZV90IGk7CgogICAgLyogYWxsb2MgYW4gYXJyYXkgYW5kIHN0b3JlIGFsbCBjb29raWUgcG9pbnRlcnMgKi8KICAgIGFycmF5ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgQ29va2llICopICogbWF0Y2hlcyk7CiAgICBpZighYXJyYXkpCiAgICAgIGdvdG8gZmFpbDsKCiAgICBjbyA9IG1haW5jbzsKCiAgICBmb3IoaT0wOyBjbzsgY28gPSBjby0+bmV4dCkKICAgICAgYXJyYXlbaSsrXSA9IGNvOwoKICAgIC8qIG5vdyBzb3J0IHRoZSBjb29raWUgcG9pbnRlcnMgaW4gcGF0aCBsZW5ndGggb3JkZXIgKi8KICAgIHFzb3J0KGFycmF5LCBtYXRjaGVzLCBzaXplb2Yoc3RydWN0IENvb2tpZSAqKSwgY29va2llX3NvcnQpOwoKICAgIC8qIHJlbWFrZSB0aGUgbGlua2VkIGxpc3Qgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZSBuZXcgb3JkZXIgKi8KCiAgICBtYWluY28gPSBhcnJheVswXTsgLyogc3RhcnQgaGVyZSAqLwogICAgZm9yKGk9MDsgaTxtYXRjaGVzLTE7IGkrKykKICAgICAgYXJyYXlbaV0tPm5leHQgPSBhcnJheVtpKzFdOwogICAgYXJyYXlbbWF0Y2hlcy0xXS0+bmV4dCA9IE5VTEw7IC8qIHRlcm1pbmF0ZSB0aGUgbGlzdCAqLwoKICAgIGZyZWUoYXJyYXkpOyAvKiByZW1vdmUgdGhlIHRlbXBvcmFyeSBkYXRhIGFnYWluICovCiAgfQoKICByZXR1cm4gbWFpbmNvOyAvKiByZXR1cm4gdGhlIG5ldyBsaXN0ICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9jbGVhcmFsbCgpCiAqCiAqIENsZWFyIGFsbCBleGlzdGluZyBjb29raWVzIGFuZCByZXNldCB0aGUgY291bnRlci4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgQ3VybF9jb29raWVfY2xlYXJhbGwoc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZXMpCnsKICBpZihjb29raWVzKSB7CiAgICBDdXJsX2Nvb2tpZV9mcmVlbGlzdChjb29raWVzLT5jb29raWVzLCBUUlVFKTsKICAgIGNvb2tpZXMtPmNvb2tpZXMgPSBOVUxMOwogICAgY29va2llcy0+bnVtY29va2llcyA9IDA7CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfZnJlZWxpc3QoKQogKgogKiBGcmVlIGEgbGlzdCBvZiBjb29raWVzIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgQ3VybF9jb29raWVfZ2V0bGlzdCgpOwogKgogKiBUaGUgJ2Nvb2tpZXN0b28nIGFyZ3VtZW50IHRlbGxzIHRoaXMgZnVuY3Rpb24gd2hldGhlciB0byBqdXN0IGZyZWUgdGhlCiAqIGxpc3Qgb3IgYWN0dWFsbHkgYWxzbyBmcmVlIGFsbCBjb29raWVzIHdpdGhpbiB0aGUgbGlzdCBhcyB3ZWxsLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgQ3VybF9jb29raWVfZnJlZWxpc3Qoc3RydWN0IENvb2tpZSAqY28sIGJvb2wgY29va2llc3RvbykKewogIHN0cnVjdCBDb29raWUgKm5leHQ7CiAgd2hpbGUoY28pIHsKICAgIG5leHQgPSBjby0+bmV4dDsKICAgIGlmKGNvb2tpZXN0b28pCiAgICAgIGZyZWVjb29raWUoY28pOwogICAgZWxzZQogICAgICBmcmVlKGNvKTsgLyogd2Ugb25seSBmcmVlIHRoZSBzdHJ1Y3Qgc2luY2UgdGhlICJtZW1iZXJzIiBhcmUgYWxsIGp1c3QKICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgb3V0IGluIHRoZSBtYWluIGNvb2tpZSBsaXN0ISAqLwogICAgY28gPSBuZXh0OwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9jbGVhcnNlc3MoKQogKgogKiBGcmVlIGFsbCBzZXNzaW9uIGNvb2tpZXMgaW4gdGhlIGNvb2tpZXMgbGlzdC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgQ3VybF9jb29raWVfY2xlYXJzZXNzKHN0cnVjdCBDb29raWVJbmZvICpjb29raWVzKQp7CiAgc3RydWN0IENvb2tpZSAqZmlyc3QsICpjdXJyLCAqbmV4dCwgKnByZXYgPSBOVUxMOwoKICBpZighY29va2llcyB8fCAhY29va2llcy0+Y29va2llcykKICAgIHJldHVybjsKCiAgZmlyc3QgPSBjdXJyID0gcHJldiA9IGNvb2tpZXMtPmNvb2tpZXM7CgogIGZvcig7IGN1cnI7IGN1cnIgPSBuZXh0KSB7CiAgICBuZXh0ID0gY3Vyci0+bmV4dDsKICAgIGlmKCFjdXJyLT5leHBpcmVzKSB7CiAgICAgIGlmKGZpcnN0ID09IGN1cnIpCiAgICAgICAgZmlyc3QgPSBuZXh0OwoKICAgICAgaWYocHJldiA9PSBjdXJyKQogICAgICAgIHByZXYgPSBuZXh0OwogICAgICBlbHNlCiAgICAgICAgcHJldi0+bmV4dCA9IG5leHQ7CgogICAgICBmcmVlY29va2llKGN1cnIpOwogICAgICBjb29raWVzLT5udW1jb29raWVzLS07CiAgICB9CiAgICBlbHNlCiAgICAgIHByZXYgPSBjdXJyOwogIH0KCiAgY29va2llcy0+Y29va2llcyA9IGZpcnN0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2NsZWFudXAoKQogKgogKiBGcmVlIGEgImNvb2tpZSBvYmplY3QiIHByZXZpb3VzIGNyZWF0ZWQgd2l0aCBDdXJsX2Nvb2tpZV9pbml0KCkuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEN1cmxfY29va2llX2NsZWFudXAoc3RydWN0IENvb2tpZUluZm8gKmMpCnsKICBpZihjKSB7CiAgICBmcmVlKGMtPmZpbGVuYW1lKTsKICAgIEN1cmxfY29va2llX2ZyZWVsaXN0KGMtPmNvb2tpZXMsIFRSVUUpOwogICAgZnJlZShjKTsgLyogZnJlZSB0aGUgYmFzZSBzdHJ1Y3QgYXMgd2VsbCAqLwogIH0KfQoKLyogZ2V0X25ldHNjYXBlX2Zvcm1hdCgpCiAqCiAqIEZvcm1hdHMgYSBzdHJpbmcgZm9yIE5ldHNjYXBlIG91dHB1dCBmaWxlLCB3L28gYSBuZXdsaW5lIGF0IHRoZSBlbmQuCiAqCiAqIEZ1bmN0aW9uIHJldHVybnMgYSBjaGFyICogdG8gYSBmb3JtYXR0ZWQgbGluZS4gSGFzIHRvIGJlIGZyZWUoKWQKKi8Kc3RhdGljIGNoYXIgKmdldF9uZXRzY2FwZV9mb3JtYXQoY29uc3Qgc3RydWN0IENvb2tpZSAqY28pCnsKICByZXR1cm4gYXByaW50ZigKICAgICIlcyIgICAgIC8qIGh0dHBvbmx5IHByZWFtYmxlICovCiAgICAiJXMlc1x0IiAvKiBkb21haW4gKi8KICAgICIlc1x0IiAgIC8qIHRhaWxtYXRjaCAqLwogICAgIiVzXHQiICAgLyogcGF0aCAqLwogICAgIiVzXHQiICAgLyogc2VjdXJlICovCiAgICAiJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAiXHQiICAgLyogZXhwaXJlcyAqLwogICAgIiVzXHQiICAgLyogbmFtZSAqLwogICAgIiVzIiwgICAgLyogdmFsdWUgKi8KICAgIGNvLT5odHRwb25seT8iI0h0dHBPbmx5XyI6IiIsCiAgICAvKiBNYWtlIHN1cmUgYWxsIGRvbWFpbnMgYXJlIHByZWZpeGVkIHdpdGggYSBkb3QgaWYgdGhleSBhbGxvdwogICAgICAgdGFpbG1hdGNoaW5nLiBUaGlzIGlzIE1vemlsbGEtc3R5bGUuICovCiAgICAoY28tPnRhaWxtYXRjaCAmJiBjby0+ZG9tYWluICYmIGNvLT5kb21haW5bMF0gIT0gJy4nKT8gIi4iOiIiLAogICAgY28tPmRvbWFpbj9jby0+ZG9tYWluOiJ1bmtub3duIiwKICAgIGNvLT50YWlsbWF0Y2g/IlRSVUUiOiJGQUxTRSIsCiAgICBjby0+cGF0aD9jby0+cGF0aDoiLyIsCiAgICBjby0+c2VjdXJlPyJUUlVFIjoiRkFMU0UiLAogICAgY28tPmV4cGlyZXMsCiAgICBjby0+bmFtZSwKICAgIGNvLT52YWx1ZT9jby0+dmFsdWU6IiIpOwp9CgovKgogKiBjb29raWVfb3V0cHV0KCkKICoKICogV3JpdGVzIGFsbCBpbnRlcm5hbGx5IGtub3duIGNvb2tpZXMgdG8gdGhlIHNwZWNpZmllZCBmaWxlLiBTcGVjaWZ5CiAqICItIiBhcyBmaWxlIG5hbWUgdG8gd3JpdGUgdG8gc3Rkb3V0LgogKgogKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBvbiB3cml0ZSBmYWlsdXJlLgogKi8Kc3RhdGljIGludCBjb29raWVfb3V0cHV0KHN0cnVjdCBDb29raWVJbmZvICpjLCBjb25zdCBjaGFyICpkdW1waGVyZSkKewogIHN0cnVjdCBDb29raWUgKmNvOwogIEZJTEUgKm91dDsKICBib29sIHVzZV9zdGRvdXQ9RkFMU0U7CiAgY2hhciAqZm9ybWF0X3B0cjsKCiAgaWYoKE5VTEwgPT0gYykgfHwgKDAgPT0gYy0+bnVtY29va2llcykpCiAgICAvKiBJZiB0aGVyZSBhcmUgbm8ga25vd24gY29va2llcywgd2UgZG9uJ3Qgd3JpdGUgb3IgZXZlbiBjcmVhdGUgYW55CiAgICAgICBkZXN0aW5hdGlvbiBmaWxlICovCiAgICByZXR1cm4gMDsKCiAgLyogYXQgZmlyc3QsIHJlbW92ZSBleHBpcmVkIGNvb2tpZXMgKi8KICByZW1vdmVfZXhwaXJlZChjKTsKCiAgaWYoc3RyZXF1YWwoIi0iLCBkdW1waGVyZSkpIHsKICAgIC8qIHVzZSBzdGRvdXQgKi8KICAgIG91dCA9IHN0ZG91dDsKICAgIHVzZV9zdGRvdXQ9VFJVRTsKICB9CiAgZWxzZSB7CiAgICBvdXQgPSBmb3BlbihkdW1waGVyZSwgRk9QRU5fV1JJVEVURVhUKTsKICAgIGlmKCFvdXQpCiAgICAgIHJldHVybiAxOyAvKiBmYWlsdXJlICovCiAgfQoKICBmcHV0cygiIyBOZXRzY2FwZSBIVFRQIENvb2tpZSBGaWxlXG4iCiAgICAgICAgIiMgaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9odHRwLWNvb2tpZXMuaHRtbFxuIgogICAgICAgICIjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGxpYmN1cmwhIEVkaXQgYXQgeW91ciBvd24gcmlzay5cblxuIiwKICAgICAgICBvdXQpOwoKICBmb3IoY28gPSBjLT5jb29raWVzOyBjbzsgY28gPSBjby0+bmV4dCkgewogICAgaWYoIWNvLT5kb21haW4pCiAgICAgIGNvbnRpbnVlOwogICAgZm9ybWF0X3B0ciA9IGdldF9uZXRzY2FwZV9mb3JtYXQoY28pOwogICAgaWYoZm9ybWF0X3B0ciA9PSBOVUxMKSB7CiAgICAgIGZwcmludGYob3V0LCAiI1xuIyBGYXRhbCBsaWJjdXJsIGVycm9yXG4iKTsKICAgICAgaWYoIXVzZV9zdGRvdXQpCiAgICAgICAgZmNsb3NlKG91dCk7CiAgICAgIHJldHVybiAxOwogICAgfQogICAgZnByaW50ZihvdXQsICIlc1xuIiwgZm9ybWF0X3B0cik7CiAgICBmcmVlKGZvcm1hdF9wdHIpOwogIH0KCiAgaWYoIXVzZV9zdGRvdXQpCiAgICBmY2xvc2Uob3V0KTsKCiAgcmV0dXJuIDA7Cn0KCnN0cnVjdCBjdXJsX3NsaXN0ICpDdXJsX2Nvb2tpZV9saXN0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCnsKICBzdHJ1Y3QgY3VybF9zbGlzdCAqbGlzdCA9IE5VTEw7CiAgc3RydWN0IGN1cmxfc2xpc3QgKmJlZzsKICBzdHJ1Y3QgQ29va2llICpjOwogIGNoYXIgKmxpbmU7CgogIGlmKChkYXRhLT5jb29raWVzID09IE5VTEwpIHx8CiAgICAgIChkYXRhLT5jb29raWVzLT5udW1jb29raWVzID09IDApKQogICAgcmV0dXJuIE5VTEw7CgogIGZvcihjID0gZGF0YS0+Y29va2llcy0+Y29va2llczsgYzsgYyA9IGMtPm5leHQpIHsKICAgIGlmKCFjLT5kb21haW4pCiAgICAgIGNvbnRpbnVlOwogICAgbGluZSA9IGdldF9uZXRzY2FwZV9mb3JtYXQoYyk7CiAgICBpZighbGluZSkgewogICAgICBjdXJsX3NsaXN0X2ZyZWVfYWxsKGxpc3QpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGJlZyA9IEN1cmxfc2xpc3RfYXBwZW5kX25vZHVwKGxpc3QsIGxpbmUpOwogICAgaWYoIWJlZykgewogICAgICBmcmVlKGxpbmUpOwogICAgICBjdXJsX3NsaXN0X2ZyZWVfYWxsKGxpc3QpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGxpc3QgPSBiZWc7CiAgfQoKICByZXR1cm4gbGlzdDsKfQoKdm9pZCBDdXJsX2ZsdXNoX2Nvb2tpZXMoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgaW50IGNsZWFudXApCnsKICBpZihkYXRhLT5zZXQuc3RyW1NUUklOR19DT09LSUVKQVJdKSB7CiAgICBpZihkYXRhLT5jaGFuZ2UuY29va2llbGlzdCkgewogICAgICAvKiBJZiB0aGVyZSBpcyBhIGxpc3Qgb2YgY29va2llIGZpbGVzIHRvIHJlYWQsIGRvIGl0IGZpcnN0IHNvIHRoYXQKICAgICAgICAgd2UgaGF2ZSBhbGwgdGhlIHRvbGQgZmlsZXMgcmVhZCBiZWZvcmUgd2Ugd3JpdGUgdGhlIG5ldyBqYXIuCiAgICAgICAgIEN1cmxfY29va2llX2xvYWRmaWxlcygpIExPQ0tTIGFuZCBVTkxPQ0tTIHRoZSBzaGFyZSBpdHNlbGYhICovCiAgICAgIEN1cmxfY29va2llX2xvYWRmaWxlcyhkYXRhKTsKICAgIH0KCiAgICBDdXJsX3NoYXJlX2xvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFLCBDVVJMX0xPQ0tfQUNDRVNTX1NJTkdMRSk7CgogICAgLyogaWYgd2UgaGF2ZSBhIGRlc3RpbmF0aW9uIGZpbGUgZm9yIGFsbCB0aGUgY29va2llcyB0byBnZXQgZHVtcGVkIHRvICovCiAgICBpZihjb29raWVfb3V0cHV0KGRhdGEtPmNvb2tpZXMsIGRhdGEtPnNldC5zdHJbU1RSSU5HX0NPT0tJRUpBUl0pKQogICAgICBpbmZvZihkYXRhLCAiV0FSTklORzogZmFpbGVkIHRvIHNhdmUgY29va2llcyBpbiAlc1xuIiwKICAgICAgICAgICAgZGF0YS0+c2V0LnN0cltTVFJJTkdfQ09PS0lFSkFSXSk7CiAgfQogIGVsc2UgewogICAgaWYoY2xlYW51cCAmJiBkYXRhLT5jaGFuZ2UuY29va2llbGlzdCkgewogICAgICAvKiBzaW5jZSBub3RoaW5nIGlzIHdyaXR0ZW4sIHdlIGNhbiBqdXN0IGZyZWUgdGhlIGxpc3Qgb2YgY29va2llIGZpbGUKICAgICAgICAgbmFtZXMgKi8KICAgICAgY3VybF9zbGlzdF9mcmVlX2FsbChkYXRhLT5jaGFuZ2UuY29va2llbGlzdCk7IC8qIGNsZWFuIHVwIGxpc3QgKi8KICAgICAgZGF0YS0+Y2hhbmdlLmNvb2tpZWxpc3QgPSBOVUxMOwogICAgfQogICAgQ3VybF9zaGFyZV9sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSwgQ1VSTF9MT0NLX0FDQ0VTU19TSU5HTEUpOwogIH0KCiAgaWYoY2xlYW51cCAmJiAoIWRhdGEtPnNoYXJlIHx8IChkYXRhLT5jb29raWVzICE9IGRhdGEtPnNoYXJlLT5jb29raWVzKSkpIHsKICAgIEN1cmxfY29va2llX2NsZWFudXAoZGF0YS0+Y29va2llcyk7CiAgfQogIEN1cmxfc2hhcmVfdW5sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSk7Cn0KCiNlbmRpZiAvKiBDVVJMX0RJU0FCTEVfSFRUUCB8fCBDVVJMX0RJU0FCTEVfQ09PS0lFUyAqLwo=