LyoKICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKICogIENvcHlyaWdodCAoQykgMjAwMCwyMDAxLDIwMDIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KCi8qIEJhc2VkIG9uICJzcmMvbWFpbi5jIiBpbiBldGhlcmJvb3QtNS4wLjUuICAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkVUSEVSQk9PVCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCgpBdXRob3I6IE1hcnRpbiBSZW50ZXJzCiAgRGF0ZTogRGVjLzkzCiAgCkxpdGVyYXR1cmUgZGVhbGluZyB3aXRoIHRoZSBuZXR3b3JrIHByb3RvY29sczoKICAgICAgIEFSUCAtIFJGQzgyNgogICAgICAgUkFSUCAtIFJGQzkwMwogICAgICAgVURQIC0gUkZDNzY4CiAgICAgICBCT09UUCAtIFJGQzk1MSwgUkZDMjEzMiAodmVuZG9yIGV4dGVuc2lvbnMpCiAgICAgICBESENQIC0gUkZDMjEzMSwgUkZDMjEzMiAob3B0aW9ucykKICAgICAgIFRGVFAgLSBSRkMxMzUwLCBSRkMyMzQ3IChvcHRpb25zKSwgUkZDMjM0OCAoYmxvY2tzaXplKSwgUkZDMjM0OSAodHNpemUpCiAgICAgICBSUEMgLSBSRkMxODMxLCBSRkMxODMyIChYRFIpLCBSRkMxODMzIChycGNiaW5kL3BvcnRtYXBwZXIpCiAgICAgICBORlMgLSBSRkMxMDk0LCBSRkMxODEzICh2MywgdXNlZnVsIGZvciBjbGFyaWZpY2F0aW9ucywgbm90IGltcGxlbWVudGVkKQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIEdSVUIJMQojaW5jbHVkZSA8ZXRoZXJib290Lmg+CiNpbmNsdWRlIDxuaWMuaD4KCi8qICNkZWZpbmUgREVCVUcJMSAqLwoKc3RydWN0IGFycHRhYmxlX3QgYXJwdGFibGVbTUFYX0FSUF07CgovKiBTZXQgaWYgdGhlIHVzZXIgcHVzaGVzIENvbnRyb2wtQy4gICovCmludCBpcF9hYm9ydCA9IDA7Ci8qIFNldCBpZiBhbiBldGhlcm5ldCBjYXJkIGlzIHByb2JlZCBhbmQgSVAgYWRkcmVzc2VzIGFyZSBzZXQuICAqLwppbnQgbmV0d29ya19yZWFkeSA9IDA7CgpzdHJ1Y3Qgcm9tX2luZm8gcm9tOwoKc3RhdGljIGludCB2ZW5kb3JleHRfaXN2YWxpZDsKc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV0bWFzazsKc3RhdGljIHN0cnVjdCBib290cGRfdCBib290cF9kYXRhOwpzdGF0aWMgdW5zaWduZWQgbG9uZyB4aWQ7CnN0YXRpYyB1bnNpZ25lZCBjaGFyICplbmRfb2ZfcmZjMTUzMyA9IE5VTEw7CgojaWZuZGVmCU5PX0RIQ1BfU1VQUE9SVAojZW5kaWYgLyogTk9fREhDUF9TVVBQT1JUICovCgovKiDkRXRoICovCnN0YXRpYyB1bnNpZ25lZCBjaGFyIHZlbmRvcmV4dF9tYWdpY1tdID0gezB4RTQsIDB4NDUsIDB4NzQsIDB4Njh9OwpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBicm9hZGNhc3RbXSA9IHsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGfTsKCiNpZmRlZglOT19ESENQX1NVUFBPUlQKCnN0YXRpYyB1bnNpZ25lZCBjaGFyIHJmYzE1MzNfY29va2llWzVdID0ge1JGQzE1MzNfQ09PS0lFLCBSRkMxNTMzX0VORH07CgojZWxzZSAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLwoKc3RhdGljIGludCBkaGNwX3JlcGx5OwpzdGF0aWMgaW5fYWRkciBkaGNwX3NlcnZlciA9IHswTH07CnN0YXRpYyBpbl9hZGRyIGRoY3BfYWRkciA9IHswTH07CnN0YXRpYyB1bnNpZ25lZCBjaGFyIHJmYzE1MzNfY29va2llW10gPSB7UkZDMTUzM19DT09LSUV9OwpzdGF0aWMgdW5zaWduZWQgY2hhciByZmMxNTMzX2VuZFtdID0ge1JGQzE1MzNfRU5EfTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRoY3BkaXNjb3ZlcltdID0KewogIFJGQzIxMzJfTVNHX1RZUEUsIDEsIERIQ1BESVNDT1ZFUiwJCiAgUkZDMjEzMl9NQVhfU0laRSwyLAkvKiByZXF1ZXN0IGFzIG11Y2ggYXMgd2UgY2FuICovCiAgRVRIX01BWF9NVFUgLyAyNTYsIEVUSF9NQVhfTVRVICUgMjU2LAogIFJGQzIxMzJfUEFSQU1fTElTVCwgNCwgUkZDMTUzM19ORVRNQVNLLCBSRkMxNTMzX0dBVEVXQVksCiAgUkZDMTUzM19IT1NUTkFNRSwgUkZDMTUzM19FWFRFTlNJT05QQVRICn07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkaGNwcmVxdWVzdFtdID0KewogIFJGQzIxMzJfTVNHX1RZUEUsIDEsIERIQ1BSRVFVRVNULAogIFJGQzIxMzJfU1JWX0lELCA0LCAwLCAwLCAwLCAwLAogIFJGQzIxMzJfUkVRX0FERFIsIDQsIDAsIDAsIDAsIDAsCiAgUkZDMjEzMl9NQVhfU0laRSwgMiwJLyogcmVxdWVzdCBhcyBtdWNoIGFzIHdlIGNhbiAqLwogIEVUSF9NQVhfTVRVIC8gMjU2LCBFVEhfTUFYX01UVSAlIDI1NiwKICAvKiByZXF1ZXN0IHBhcmFtZXRlcnMgKi8KICBSRkMyMTMyX1BBUkFNX0xJU1QsCiAgLyogNCBzdGFuZGFyZCArIDIgdmVuZG9ydGFncyAqLwogIDQgKyAyLAogIC8qIFN0YW5kYXJkIHBhcmFtZXRlcnMgKi8KICBSRkMxNTMzX05FVE1BU0ssIFJGQzE1MzNfR0FURVdBWSwKICBSRkMxNTMzX0hPU1ROQU1FLCBSRkMxNTMzX0VYVEVOU0lPTlBBVEgsCiAgLyogRXRoZXJib290IHZlbmRvcnRhZ3MgKi8KICBSRkMxNTMzX1ZFTkRPUl9NQUdJQywKICBSRkMxNTMzX1ZFTkRPUl9DT05GSUdGSUxFLAp9OwoKI2VuZGlmIC8qICEgTk9fREhDUF9TVVBQT1JUICovCgpzdGF0aWMgdW5zaWduZWQgc2hvcnQgaXBjaGtzdW0gKHVuc2lnbmVkIHNob3J0ICppcCwgaW50IGxlbik7CnN0YXRpYyB1bnNpZ25lZCBzaG9ydCB1ZHBjaGtzdW0gKHN0cnVjdCBpcGhkciAqcGFja2V0KTsKCnZvaWQKcHJpbnRfbmV0d29ya19jb25maWd1cmF0aW9uICh2b2lkKQp7CiAgaWYgKCEgZXRoX3Byb2JlICgpKQogICAgZ3J1Yl9wcmludGYgKCJObyBldGhlcm5ldCBjYXJkIGZvdW5kLlxuIik7CiAgZWxzZSBpZiAoISBuZXR3b3JrX3JlYWR5KQogICAgZ3J1Yl9wcmludGYgKCJOb3QgaW5pdGlhbGl6ZWQgeWV0LlxuIik7CiAgZWxzZQogICAgewogICAgICBldGhlcmJvb3RfcHJpbnRmICgiQWRkcmVzczogJUBcbiIsIGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIpOwogICAgICBldGhlcmJvb3RfcHJpbnRmICgiTmV0bWFzazogJUBcbiIsIG5ldG1hc2spOwogICAgICBldGhlcmJvb3RfcHJpbnRmICgiU2VydmVyOiAlQFxuIiwgYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkcik7CiAgICAgIGV0aGVyYm9vdF9wcmludGYgKCJHYXRld2F5OiAlQFxuIiwgYXJwdGFibGVbQVJQX0dBVEVXQVldLmlwYWRkci5zX2FkZHIpOwogICAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkRFRkFVTFRfTkVUTUFTSyAtIFJldHVybiBkZWZhdWx0IG5ldG1hc2sgZm9yIElQIGFkZHJlc3MKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAKZGVmYXVsdF9uZXRtYXNrICh2b2lkKQp7CiAgaW50IG5ldCA9IG50b2hsIChhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIuc19hZGRyKSA+PiAyNDsKICBpZiAobmV0IDw9IDEyNykKICAgIHJldHVybiAoaHRvbmwgKDB4ZmYwMDAwMDApKTsKICBlbHNlIGlmIChuZXQgPCAxOTIpCiAgICByZXR1cm4gKGh0b25sICgweGZmZmYwMDAwKSk7CiAgZWxzZQogICAgcmV0dXJuIChodG9ubCAoMHhmZmZmZmYwMCkpOwp9CgovKiBpZmNvbmZpZyAtIGNvbmZpZ3VyZSBuZXR3b3JrIGludGVyZmFjZS4gICovCmludAppZmNvbmZpZyAoY2hhciAqaXAsIGNoYXIgKnNtLCBjaGFyICpndywgY2hhciAqc3ZyKQp7CiAgaW5fYWRkciB0bXA7CiAgCiAgaWYgKHNtKSAKICAgIHsKICAgICAgaWYgKCEgaW5ldF9hdG9uIChzbSwgJnRtcCkpCglyZXR1cm4gMDsKICAgICAgCiAgICAgIG5ldG1hc2sgPSB0bXAuc19hZGRyOwogICAgfQogIAogIGlmIChpcCkgCiAgICB7CiAgICAgIGlmICghIGluZXRfYXRvbiAoaXAsICZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIpKSAKCXJldHVybiAwOwogICAgICAKICAgICAgaWYgKCEgbmV0bWFzayAmJiAhIHNtKSAKCW5ldG1hc2sgPSBkZWZhdWx0X25ldG1hc2sgKCk7CiAgICB9CiAgCiAgaWYgKGd3ICYmICEgaW5ldF9hdG9uIChndywgJmFycHRhYmxlW0FSUF9HQVRFV0FZXS5pcGFkZHIpKSAKICAgIHJldHVybiAwOwoKICAvKiBDbGVhciBvdXQgdGhlIEFSUCBlbnRyeS4gICovCiAgZ3J1Yl9tZW1zZXQgKGFycHRhYmxlW0FSUF9HQVRFV0FZXS5ub2RlLCAwLCBFVEhfQUxFTik7CiAgCiAgaWYgKHN2ciAmJiAhIGluZXRfYXRvbiAoc3ZyLCAmYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyKSkgCiAgICByZXR1cm4gMDsKCiAgLyogTGlrZXdpc2UuICAqLwogIGdydWJfbWVtc2V0IChhcnB0YWJsZVtBUlBfU0VSVkVSXS5ub2RlLCAwLCBFVEhfQUxFTik7CiAgCiAgaWYgKGlwIHx8IHNtKQogICAgewogICAgICBpZiAoSVBfQlJPQURDQVNUID09IChuZXRtYXNrIHwgYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkcikKCSAgfHwgbmV0bWFzayA9PSAobmV0bWFzayB8IGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIpCgkgIHx8ICEgbmV0bWFzaykKCW5ldHdvcmtfcmVhZHkgPSAwOwogICAgICBlbHNlCgluZXR3b3JrX3JlYWR5ID0gMTsKICAgIH0KICAKICByZXR1cm4gMTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpVRFBfVFJBTlNNSVQgLSBTZW5kIGEgVURQIGRhdGFncmFtCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgCnVkcF90cmFuc21pdCAodW5zaWduZWQgbG9uZyBkZXN0aXAsIHVuc2lnbmVkIGludCBzcmNzb2NrLAoJICAgICAgdW5zaWduZWQgaW50IGRlc3Rzb2NrLCBpbnQgbGVuLCBjb25zdCB2b2lkICpidWYpCnsKICBzdHJ1Y3QgaXBoZHIgKmlwOwogIHN0cnVjdCB1ZHBoZHIgKnVkcDsKICBzdHJ1Y3QgYXJwcmVxdWVzdCBhcnByZXE7CiAgaW50IGFycGVudHJ5LCBpOwogIGludCByZXRyeTsKCiAgaXAgPSAoc3RydWN0IGlwaGRyICopIGJ1ZjsKICB1ZHAgPSAoc3RydWN0IHVkcGhkciAqKSAoKHVuc2lnbmVkIGxvbmcpIGJ1ZiArIHNpemVvZiAoc3RydWN0IGlwaGRyKSk7CiAgaXAtPnZlcmhkcmxlbiA9IDB4NDU7CiAgaXAtPnNlcnZpY2UgPSAwOwogIGlwLT5sZW4gPSBodG9ucyAobGVuKTsKICBpcC0+aWRlbnQgPSAwOwogIGlwLT5mcmFncyA9IDA7CiAgaXAtPnR0bCA9IDYwOwogIGlwLT5wcm90b2NvbCA9IElQX1VEUDsKICBpcC0+Y2hrc3VtID0gMDsKICBpcC0+c3JjLnNfYWRkciA9IGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHI7CiAgaXAtPmRlc3Quc19hZGRyID0gZGVzdGlwOwogIGlwLT5jaGtzdW0gPSBpcGNoa3N1bSAoKHVuc2lnbmVkIHNob3J0ICopIGJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgaXBoZHIpKTsKICB1ZHAtPnNyYyA9IGh0b25zIChzcmNzb2NrKTsKICB1ZHAtPmRlc3QgPSBodG9ucyAoZGVzdHNvY2spOwogIHVkcC0+bGVuID0gaHRvbnMgKGxlbiAtIHNpemVvZiAoc3RydWN0IGlwaGRyKSk7CiAgdWRwLT5jaGtzdW0gPSAwOwogIHVkcC0+Y2hrc3VtID0gaHRvbnMgKHVkcGNoa3N1bSAoaXApKTsKCiAgaWYgKHVkcC0+Y2hrc3VtID09IDApCiAgICB1ZHAtPmNoa3N1bSA9IDB4ZmZmZjsKICAKICBpZiAoZGVzdGlwID09IElQX0JST0FEQ0FTVCkKICAgIHsKICAgICAgZXRoX3RyYW5zbWl0IChicm9hZGNhc3QsIElQLCBsZW4sIGJ1Zik7CiAgICB9CiAgZWxzZQogICAgewogICAgICBpZiAoKChkZXN0aXAgJiBuZXRtYXNrKQoJICAgIT0gKGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIgJiBuZXRtYXNrKSkKCSAgJiYgYXJwdGFibGVbQVJQX0dBVEVXQVldLmlwYWRkci5zX2FkZHIpCglkZXN0aXAgPSBhcnB0YWJsZVtBUlBfR0FURVdBWV0uaXBhZGRyLnNfYWRkcjsKICAgICAgCiAgICAgIGZvciAoYXJwZW50cnkgPSAwOyBhcnBlbnRyeSA8IE1BWF9BUlA7IGFycGVudHJ5KyspCglpZiAoYXJwdGFibGVbYXJwZW50cnldLmlwYWRkci5zX2FkZHIgPT0gZGVzdGlwKQoJICBicmVhazsKICAgICAgCiAgICAgIGlmIChhcnBlbnRyeSA9PSBNQVhfQVJQKQoJewoJICBldGhlcmJvb3RfcHJpbnRmICgiJUAgaXMgbm90IGluIG15IGFycCB0YWJsZSFcbiIsIGRlc3RpcCk7CgkgIHJldHVybiAwOwoJfQogICAgICAKICAgICAgZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCglpZiAoYXJwdGFibGVbYXJwZW50cnldLm5vZGVbaV0pCgkgIGJyZWFrOwogICAgICAKICAgICAgaWYgKGkgPT0gRVRIX0FMRU4pCgl7CgkgIC8qIE5lZWQgdG8gZG8gYXJwIHJlcXVlc3QuICAqLwojaWZkZWYgREVCVUcKCSAgZ3J1Yl9wcmludGYgKCJhcnAgcmVxdWVzdC5cbiIpOwojZW5kaWYKCSAgYXJwcmVxLmh3dHlwZSA9IGh0b25zICgxKTsKCSAgYXJwcmVxLnByb3RvY29sID0gaHRvbnMgKElQKTsKCSAgYXJwcmVxLmh3bGVuID0gRVRIX0FMRU47CgkgIGFycHJlcS5wcm90b2xlbiA9IDQ7CgkgIGFycHJlcS5vcGNvZGUgPSBodG9ucyAoQVJQX1JFUVVFU1QpOwoJICBncnViX21lbW1vdmUgKGFycHJlcS5zaHdhZGRyLCBhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlLAoJCQlFVEhfQUxFTik7CgkgIGdydWJfbWVtbW92ZSAoYXJwcmVxLnNpcGFkZHIsIChjaGFyICopICZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIsCgkJCXNpemVvZiAoaW5fYWRkcikpOwoJICBncnViX21lbXNldCAoYXJwcmVxLnRod2FkZHIsIDAsIEVUSF9BTEVOKTsKCSAgZ3J1Yl9tZW1tb3ZlIChhcnByZXEudGlwYWRkciwgKGNoYXIgKikgJmRlc3RpcCwgc2l6ZW9mIChpbl9hZGRyKSk7CgkgIAoJICBmb3IgKHJldHJ5ID0gMTsgcmV0cnkgPD0gTUFYX0FSUF9SRVRSSUVTOyByZXRyeSsrKQoJICAgIHsKCSAgICAgIGxvbmcgdGltZW91dDsKCSAgICAgIAoJICAgICAgZXRoX3RyYW5zbWl0IChicm9hZGNhc3QsIEFSUCwgc2l6ZW9mIChhcnByZXEpLCAmYXJwcmVxKTsKCSAgICAgIHRpbWVvdXQgPSByZmMyMTMxX3NsZWVwX2ludGVydmFsIChUSU1FT1VULCByZXRyeSk7CgkgICAgICAKCSAgICAgIGlmIChhd2FpdF9yZXBseSAoQVdBSVRfQVJQLCBhcnBlbnRyeSwgYXJwcmVxLnRpcGFkZHIsIHRpbWVvdXQpKQoJCWdvdG8geG1pdDsKCgkgICAgICBpZiAoaXBfYWJvcnQpCgkJcmV0dXJuIDA7CgkgICAgfQoJICAKCSAgcmV0dXJuIDA7Cgl9CiAgICAgIAogICAgeG1pdDoKICAgICAgZXRoX3RyYW5zbWl0IChhcnB0YWJsZVthcnBlbnRyeV0ubm9kZSwgSVAsIGxlbiwgYnVmKTsKICAgIH0KICAKICByZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqClRGVFAgLSBEb3dubG9hZCBleHRlbmRlZCBCT09UUCBkYXRhLCBvciBrZXJuZWwgaW1hZ2UKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQKdGZ0cCAoY29uc3QgY2hhciAqbmFtZSwgaW50ICgqZm5jKSAodW5zaWduZWQgY2hhciAqLCBpbnQsIGludCwgaW50KSkKewogIGludCByZXRyeSA9IDA7CiAgc3RhdGljIHVuc2lnbmVkIHNob3J0IGlwb3J0ID0gMjAwMDsKICB1bnNpZ25lZCBzaG9ydCBvcG9ydCA9IDA7CiAgdW5zaWduZWQgc2hvcnQgbGVuLCBibG9jayA9IDAsIHByZXZibG9jayA9IDA7CiAgaW50IGJjb3VudGVyID0gMDsKICBzdHJ1Y3QgdGZ0cF90ICp0cjsKICBzdHJ1Y3QgdGZ0cHJlcV90IHRwOwogIGludCByYzsKICBpbnQgcGFja2V0c2l6ZSA9IFRGVFBfREVGQVVMVFNJWkVfUEFDS0VUOwogIAogIC8qIENsZWFyIG91dCB0aGUgUnggcXVldWUgZmlyc3QuICBJdCBjb250YWlucyBub3RoaW5nIG9mIGludGVyZXN0LAogICAqIGV4Y2VwdCBwb3NzaWJseSBBUlAgcmVxdWVzdHMgZnJvbSB0aGUgREhDUC9URlRQIHNlcnZlci4gIFdlIHVzZQogICAqIHBvbGxpbmcgdGhyb3VnaG91dCBFdGhlcmJvb3QsIHNvIHNvbWUgdGltZSBtYXkgaGF2ZSBwYXNzZWQgc2luY2Ugd2UKICAgKiBsYXN0IHBvbGxlZCB0aGUgcmVjZWl2ZSBxdWV1ZSwgd2hpY2ggbWF5IG5vdyBiZSBmaWxsZWQgd2l0aAogICAqIGJyb2FkY2FzdCBwYWNrZXRzLiAgVGhpcyB3aWxsIGNhdXNlIHRoZSByZXBseSB0byB0aGUgcGFja2V0cyB3ZSBhcmUKICAgKiBhYm91dCB0byBzZW5kIHRvIGJlIGxvc3QgaW1tZWRpYXRlbHkuICBOb3QgdmVyeSBjbGV2ZXIuICAqLwogIGF3YWl0X3JlcGx5IChBV0FJVF9RRFJBSU4sIDAsIE5VTEwsIDApOwogIAogIHRwLm9wY29kZSA9IGh0b25zIChURlRQX1JSUSk7CiAgbGVuID0gKGdydWJfc3ByaW50ZiAoKGNoYXIgKikgdHAudS5ycnEsICIlcyVjb2N0ZXQlY2Jsa3NpemUlYyVkIiwKCQkgICAgICAgbmFtZSwgMCwgMCwgMCwgVEZUUF9NQVhfUEFDS0VUKQoJICsgc2l6ZW9mICh0cC5pcCkgKyBzaXplb2YgKHRwLnVkcCkgKyBzaXplb2YgKHRwLm9wY29kZSkgKyAxKTsKICBpZiAoISB1ZHBfdHJhbnNtaXQgKGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIsICsraXBvcnQsCgkJICAgICAgVEZUUF9QT1JULCBsZW4sICZ0cCkpCiAgICByZXR1cm4gMDsKICAKICBmb3IgKDs7KQogICAgewogICAgICBsb25nIHRpbWVvdXQ7CiAgICAgIAojaWZkZWYgQ09OR0VTVEVECiAgICAgIHRpbWVvdXQgPSByZmMyMTMxX3NsZWVwX2ludGVydmFsIChibG9jayA/IFRGVFBfUkVYTVQgOiBUSU1FT1VULCByZXRyeSk7CiNlbHNlCiAgICAgIHRpbWVvdXQgPSByZmMyMTMxX3NsZWVwX2ludGVydmFsIChUSU1FT1VULCByZXRyeSk7CiNlbmRpZgoKICAgICAgaWYgKCEgYXdhaXRfcmVwbHkgKEFXQUlUX1RGVFAsIGlwb3J0LCBOVUxMLCB0aW1lb3V0KSkKCXsKCSAgaWYgKCEgYmxvY2sgJiYgcmV0cnkrKyA8IE1BWF9URlRQX1JFVFJJRVMpCgkgICAgewoJICAgICAgLyogTWF5YmUgaW5pdGlhbCByZXF1ZXN0IHdhcyBsb3N0LiAgKi8KCSAgICAgIGlmICghIHVkcF90cmFuc21pdCAoYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkciwKCQkJCSAgKytpcG9ydCwgVEZUUF9QT1JULCBsZW4sICZ0cCkpCgkJcmV0dXJuIDA7CgkgICAgICAKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSAgCiNpZmRlZiBDT05HRVNURUQKCSAgaWYgKGJsb2NrICYmICgocmV0cnkgKz0gVEZUUF9SRVhNVCkgPCBURlRQX1RJTUVPVVQpKQoJICAgIHsKCSAgICAgIC8qIFdlIHJlc2VuZCBvdXIgbGFzdCBhY2suICAqLwojaWZkZWYgTURFQlVHCgkgICAgICBncnViX3ByaW50ZiAoIjxSRVhNVD5cbiIpOwojZW5kaWYKCSAgICAgIHVkcF90cmFuc21pdCAoYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkciwKCQkJICAgIGlwb3J0LCBvcG9ydCwKCQkJICAgIFRGVFBfTUlOX1BBQ0tFVCwgJnRwKTsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KI2VuZGlmCgkgIC8qIFRpbWVvdXQuICAqLwoJICBicmVhazsKCX0KICAgICAgCiAgICAgIHRyID0gKHN0cnVjdCB0ZnRwX3QgKikgJm5pYy5wYWNrZXRbRVRIX0hMRU5dOwogICAgICBpZiAodHItPm9wY29kZSA9PSBudG9ocyAoVEZUUF9FUlJPUikpCgl7CgkgIGdydWJfcHJpbnRmICgiVEZUUCBlcnJvciAlZCAoJXMpXG4iLAoJCSAgICAgICBudG9ocyAodHItPnUuZXJyLmVycmNvZGUpLAoJCSAgICAgICB0ci0+dS5lcnIuZXJybXNnKTsKCSAgYnJlYWs7Cgl9CiAgICAgIAogICAgICBpZiAodHItPm9wY29kZSA9PSBudG9ocyAoVEZUUF9PQUNLKSkKCXsKCSAgY2hhciAqcCA9IHRyLT51Lm9hY2suZGF0YSwgKmU7CgkgIAoJICAvKiBTaG91bGRuJ3QgaGFwcGVuLiAgKi8KCSAgaWYgKHByZXZibG9jaykKCSAgICAvKiBJZ25vcmUgaXQuICAqLwoJICAgIGNvbnRpbnVlOwoJICAKCSAgbGVuID0gbnRvaHMgKHRyLT51ZHAubGVuKSAtIHNpemVvZiAoc3RydWN0IHVkcGhkcikgLSAyOwoJICBpZiAobGVuID4gVEZUUF9NQVhfUEFDS0VUKQoJICAgIGdvdG8gbm9hazsKCSAgCgkgIGUgPSBwICsgbGVuOwoJICB3aGlsZSAoKnAgIT0gJ1wwMDAnICYmIHAgPCBlKQoJICAgIHsKCSAgICAgIGlmICghIGdydWJfc3RyY21wICgiYmxrc2l6ZSIsIHApKQoJCXsKCQkgIHAgKz0gODsKCQkgIGlmICgocGFja2V0c2l6ZSA9IGdldGRlYyAoJnApKSA8IFRGVFBfREVGQVVMVFNJWkVfUEFDS0VUKQoJCSAgICBnb3RvIG5vYWs7CgkJICAKCQkgIHdoaWxlIChwIDwgZSAmJiAqcCkKCQkgICAgcCsrOwoJCSAgCgkJICBpZiAocCA8IGUpCgkJICAgIHArKzsKCQl9CgkgICAgICBlbHNlCgkJewoJCW5vYWs6CgkJICB0cC5vcGNvZGUgPSBodG9ucyAoVEZUUF9FUlJPUik7CgkJICB0cC51LmVyci5lcnJjb2RlID0gODsKCQkgIGxlbiA9IChncnViX3NwcmludGYgKChjaGFyICopIHRwLnUuZXJyLmVycm1zZywKCQkJCSAgICAgICAiUkZDMTc4MiBlcnJvciIpCgkJCSArIHNpemVvZiAodHAuaXApICsgc2l6ZW9mICh0cC51ZHApCgkJCSArIHNpemVvZiAodHAub3Bjb2RlKSArIHNpemVvZiAodHAudS5lcnIuZXJyY29kZSkKCQkJICsgMSk7CgkJICB1ZHBfdHJhbnNtaXQgKGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIsCgkJCQlpcG9ydCwgbnRvaHMgKHRyLT51ZHAuc3JjKSwKCQkJCWxlbiwgJnRwKTsKCQkgIHJldHVybiAwOwoJCX0KCSAgICB9CgkgIAoJICBpZiAocCA+IGUpCgkgICAgZ290byBub2FrOwoJICAKCSAgLyogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBhY2tldCBkb2VzIG5vdCBnZXQgcHJvY2Vzc2VkIGFzIGRhdGEhICAqLwoJICBibG9jayA9IHRwLnUuYWNrLmJsb2NrID0gMDsgCgl9CiAgICAgIGVsc2UgaWYgKHRyLT5vcGNvZGUgPT0gbnRvaHMgKFRGVFBfREFUQSkpCgl7CgkgIGxlbiA9IG50b2hzICh0ci0+dWRwLmxlbikgLSBzaXplb2YgKHN0cnVjdCB1ZHBoZHIpIC0gNDsKCSAgLyogU2hvdWxkbid0IGhhcHBlbi4gICovCgkgIGlmIChsZW4gPiBwYWNrZXRzaXplKQoJICAgIC8qIElnbm9yZSBpdC4gICovCgkgICAgY29udGludWU7CgkgIAoJICBibG9jayA9IG50b2hzICh0cC51LmFjay5ibG9jayA9IHRyLT51LmRhdGEuYmxvY2spOwoJfQogICAgICBlbHNlCgkvKiBOZWl0aGVyIFRGVFBfT0FDSyBub3IgVEZUUF9EQVRBLiAgKi8KCWJyZWFrOwogICAgICAKICAgICAgaWYgKChibG9jayB8fCBiY291bnRlcikgJiYgKGJsb2NrICE9IHByZXZibG9jayArIDEpKQoJLyogQmxvY2sgb3JkZXIgc2hvdWxkIGJlIGNvbnRpbnVvdXMgKi8KCXRwLnUuYWNrLmJsb2NrID0gaHRvbnMgKGJsb2NrID0gcHJldmJsb2NrKTsKICAgICAgCiAgICAgIC8qIFNob3VsZCBiZSBjb250aW51b3VzLiAgKi8KICAgICAgdHAub3Bjb2RlID0gaHRvbnMgKFRGVFBfQUNLKTsKICAgICAgb3BvcnQgPSBudG9ocyAodHItPnVkcC5zcmMpOwogICAgICAvKiBBY2suICAqLwogICAgICB1ZHBfdHJhbnNtaXQgKGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIsIGlwb3J0LAoJCSAgICBvcG9ydCwgVEZUUF9NSU5fUEFDS0VULCAmdHApOwogICAgICAKICAgICAgaWYgKCh1bnNpZ25lZCBzaG9ydCkgKGJsb2NrIC0gcHJldmJsb2NrKSAhPSAxKQoJLyogUmV0cmFuc21pc3Npb24gb3IgT0FDSywgZG9uJ3QgcHJvY2VzcyB2aWEgY2FsbGJhY2sKCSAqIGFuZCBkb24ndCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHByZXZibG9jay4gICovCgljb250aW51ZTsKICAgICAgCiAgICAgIHByZXZibG9jayA9IGJsb2NrOwogICAgICAvKiBJcyBpdCB0aGUgcmlnaHQgcGxhY2UgdG8gemVybyB0aGUgdGltZXI/ICAqLwogICAgICByZXRyeSA9IDA7CiAgICAgIAogICAgICBpZiAoKHJjID0gZm5jICh0ci0+dS5kYXRhLmRvd25sb2FkLAoJCSAgICAgKytiY291bnRlciwgbGVuLCBsZW4gPCBwYWNrZXRzaXplKSkgPj0gMCkKCXJldHVybiByYzsKCiAgICAgIC8qIEVuZCBvZiBkYXRhLiAgKi8KICAgICAgaWYgKGxlbiA8IHBhY2tldHNpemUpICAgICAgICAgICAKCXJldHVybiAxOwogICAgfQogIAogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKUkFSUCAtIEdldCBteSBJUCBhZGRyZXNzIGFuZCBsb2FkIGluZm9ybWF0aW9uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgCnJhcnAgKHZvaWQpCnsKICBpbnQgcmV0cnk7CgogIC8qIGFycCBhbmQgcmFycCByZXF1ZXN0cyBzaGFyZSB0aGUgc2FtZSBwYWNrZXQgc3RydWN0dXJlLiAgKi8KICBzdHJ1Y3QgYXJwcmVxdWVzdCByYXJwcmVxOwoKICAvKiBNYWtlIHN1cmUgdGhhdCBhbiBldGhlcm5ldCBpcyBwcm9iZWQuICAqLwogIGlmICghIGV0aF9wcm9iZSAoKSkKICAgIHJldHVybiAwOwoKICAvKiBDbGVhciB0aGUgcmVhZHkgZmxhZy4gICovCiAgbmV0d29ya19yZWFkeSA9IDA7CiAgCiAgZ3J1Yl9tZW1zZXQgKCZyYXJwcmVxLCAwLCBzaXplb2YgKHJhcnByZXEpKTsKCiAgcmFycHJlcS5od3R5cGUgPSBodG9ucyAoMSk7CiAgcmFycHJlcS5wcm90b2NvbCA9IGh0b25zIChJUCk7CiAgcmFycHJlcS5od2xlbiA9IEVUSF9BTEVOOwogIHJhcnByZXEucHJvdG9sZW4gPSA0OwogIHJhcnByZXEub3Bjb2RlID0gaHRvbnMgKFJBUlBfUkVRVUVTVCk7CiAgZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSAmcmFycHJlcS5zaHdhZGRyLCBhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlLAoJCUVUSF9BTEVOKTsKICAvKiBzaXBhZGRyIGlzIGFscmVhZHkgemVyb2VkIG91dCAqLwogIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgJnJhcnByZXEudGh3YWRkciwgYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwKCQlFVEhfQUxFTik7CiAgLyogdGlwYWRkciBpcyBhbHJlYWR5IHplcm9lZCBvdXQgKi8KCiAgZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgTUFYX0FSUF9SRVRSSUVTOyArK3JldHJ5KQogICAgewogICAgICBsb25nIHRpbWVvdXQ7CiAgICAgIAogICAgICBldGhfdHJhbnNtaXQgKGJyb2FkY2FzdCwgUkFSUCwgc2l6ZW9mIChyYXJwcmVxKSwgJnJhcnByZXEpOwoKICAgICAgdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwgKFRJTUVPVVQsIHJldHJ5KTsKICAgICAgaWYgKGF3YWl0X3JlcGx5IChBV0FJVF9SQVJQLCAwLCByYXJwcmVxLnNod2FkZHIsIHRpbWVvdXQpKQoJYnJlYWs7CgogICAgICBpZiAoaXBfYWJvcnQpCglyZXR1cm4gMDsKICAgIH0KCiAgaWYgKHJldHJ5IDwgTUFYX0FSUF9SRVRSSUVTKQogICAgewogICAgICBuZXR3b3JrX3JlYWR5ID0gMTsKICAgICAgcmV0dXJuIDE7CiAgICB9CgogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQk9PVFAgLSBHZXQgbXkgSVAgYWRkcmVzcyBhbmQgbG9hZCBpbmZvcm1hdGlvbgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IApib290cCAodm9pZCkKewogIGludCByZXRyeTsKI2lmbmRlZglOT19ESENQX1NVUFBPUlQKICBpbnQgcmVxcmV0cnk7CiNlbmRpZiAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLwogIHN0cnVjdCBib290cGlwX3QgaXA7CiAgdW5zaWduZWQgbG9uZyBzdGFydHRpbWU7CgogIC8qIE1ha2Ugc3VyZSB0aGF0IGFuIGV0aGVybmV0IGlzIHByb2JlZC4gICovCiAgaWYgKCEgZXRoX3Byb2JlICgpKQogICAgcmV0dXJuIDA7CgogIC8qIENsZWFyIHRoZSByZWFkeSBmbGFnLiAgKi8KICBuZXR3b3JrX3JlYWR5ID0gMDsKCiNpZmRlZiBERUJVRwogIGdydWJfcHJpbnRmICgibmV0d29yayBpcyByZWFkeS5cbiIpOwojZW5kaWYKICAKICBncnViX21lbXNldCAoJmlwLCAwLCBzaXplb2YgKHN0cnVjdCBib290cGlwX3QpKTsKICBpcC5icC5icF9vcCA9IEJPT1RQX1JFUVVFU1Q7CiAgaXAuYnAuYnBfaHR5cGUgPSAxOwogIGlwLmJwLmJwX2hsZW4gPSBFVEhfQUxFTjsKICBzdGFydHRpbWUgPSBjdXJydGlja3MgKCk7CiAgLyogVXNlIGxvd2VyIDMyIGJpdHMgb2Ygbm9kZSBhZGRyZXNzLCBtb3JlIGxpa2VseSB0byBiZQogICAgIGRpc3RpbmN0IHRoYW4gdGhlIHRpbWUgc2luY2UgYm9vdGluZyAqLwogIGdydWJfbWVtbW92ZSAoJnhpZCwgJmFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGVbMl0sIHNpemVvZih4aWQpKTsKICBpcC5icC5icF94aWQgPSB4aWQgKz0gaHRvbmwgKHN0YXJ0dGltZSk7CiAgZ3J1Yl9tZW1tb3ZlIChpcC5icC5icF9od2FkZHIsIGFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUsIEVUSF9BTEVOKTsKI2lmZGVmIERFQlVHCiAgZXRoZXJib290X3ByaW50ZiAoImJwX29wID0gJWRcbiIsIGlwLmJwLmJwX29wKTsKICBldGhlcmJvb3RfcHJpbnRmICgiYnBfaHR5cGUgPSAlZFxuIiwgaXAuYnAuYnBfaHR5cGUpOwogIGV0aGVyYm9vdF9wcmludGYgKCJicF9obGVuID0gJWRcbiIsIGlwLmJwLmJwX2hsZW4pOwogIGV0aGVyYm9vdF9wcmludGYgKCJicF94aWQgPSAlZFxuIiwgaXAuYnAuYnBfeGlkKTsKICBldGhlcmJvb3RfcHJpbnRmICgiYnBfaHdhZGRyID0gJSFcbiIsIGlwLmJwLmJwX2h3YWRkcik7CiAgZXRoZXJib290X3ByaW50ZiAoImJwX2hvcHMgPSAlZFxuIiwgKGludCkgaXAuYnAuYnBfaG9wcyk7CiAgZXRoZXJib290X3ByaW50ZiAoImJwX3NlY3MgPSAlZFxuIiwgKGludCkgaXAuYnAuYnBfaHdhZGRyKTsKI2VuZGlmCiAgCiNpZmRlZglOT19ESENQX1NVUFBPUlQKICAvKiBSZXF1ZXN0IFJGQy1zdHlsZSBvcHRpb25zLiAgKi8KICBncnViX21lbW1vdmUgKGlwLmJwLmJwX3ZlbmQsIHJmYzE1MzNfY29va2llLCA1KTsKI2Vsc2UKICAvKiBSZXF1ZXN0IFJGQy1zdHlsZSBvcHRpb25zLiAgKi8KICBncnViX21lbW1vdmUgKGlwLmJwLmJwX3ZlbmQsIHJmYzE1MzNfY29va2llLCBzaXplb2YgcmZjMTUzM19jb29raWUpOwogIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCArIHNpemVvZiByZmMxNTMzX2Nvb2tpZSwgZGhjcGRpc2NvdmVyLAoJCXNpemVvZiBkaGNwZGlzY292ZXIpOwogIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCArIHNpemVvZiByZmMxNTMzX2Nvb2tpZSArIHNpemVvZiBkaGNwZGlzY292ZXIsCgkJcmZjMTUzM19lbmQsIHNpemVvZiByZmMxNTMzX2VuZCk7CiNlbmRpZiAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLwoKICBmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCBNQVhfQk9PVFBfUkVUUklFUzspCiAgICB7CiAgICAgIGxvbmcgdGltZW91dDsKCiNpZmRlZiBERUJVRwogICAgICBncnViX3ByaW50ZiAoInJldHJ5ID0gJWRcbiIsIHJldHJ5KTsKI2VuZGlmCiAgICAgIAogICAgICAvKiBDbGVhciBvdXQgdGhlIFJ4IHF1ZXVlIGZpcnN0LiAgSXQgY29udGFpbnMgbm90aGluZyBvZgogICAgICAgKiBpbnRlcmVzdCwgZXhjZXB0IHBvc3NpYmx5IEFSUCByZXF1ZXN0cyBmcm9tIHRoZSBESENQL1RGVFAKICAgICAgICogc2VydmVyLiAgV2UgdXNlIHBvbGxpbmcgdGhyb3VnaG91dCBFdGhlcmJvb3QsIHNvIHNvbWUgdGltZQogICAgICAgKiBtYXkgaGF2ZSBwYXNzZWQgc2luY2Ugd2UgbGFzdCBwb2xsZWQgdGhlIHJlY2VpdmUgcXVldWUsCiAgICAgICAqIHdoaWNoIG1heSBub3cgYmUgZmlsbGVkIHdpdGggYnJvYWRjYXN0IHBhY2tldHMuICBUaGlzIHdpbGwKICAgICAgICogY2F1c2UgdGhlIHJlcGx5IHRvIHRoZSBwYWNrZXRzIHdlIGFyZSBhYm91dCB0byBzZW5kIHRvIGJlCiAgICAgICAqIGxvc3QgaW1tZWRpYXRlbHkuICBOb3QgdmVyeSBjbGV2ZXIuICAqLwogICAgICBhd2FpdF9yZXBseSAoQVdBSVRfUURSQUlOLCAwLCBOVUxMLCAwKTsKCiAgICAgIHVkcF90cmFuc21pdCAoSVBfQlJPQURDQVNULCBCT09UUF9DTElFTlQsIEJPT1RQX1NFUlZFUiwKCQkgICAgc2l6ZW9mIChzdHJ1Y3QgYm9vdHBpcF90KSwgJmlwKTsKICAgICAgdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwgKFRJTUVPVVQsIHJldHJ5KyspOwojaWZkZWYgTk9fREhDUF9TVVBQT1JUCiAgICAgIGlmIChhd2FpdF9yZXBseSAoQVdBSVRfQk9PVFAsIDAsIE5VTEwsIHRpbWVvdXQpKQoJewoJICBuZXR3b3JrX3JlYWR5ID0gMTsKCSAgcmV0dXJuIDE7Cgl9CiNlbHNlIC8qICEgTk9fREhDUF9TVVBQT1JUICovCiAgICAgIGlmIChhd2FpdF9yZXBseSAoQVdBSVRfQk9PVFAsIDAsIE5VTEwsIHRpbWVvdXQpKQoJewoJICBpZiAoZGhjcF9yZXBseSAhPSBESENQT0ZGRVIpCgkgICAgewoJICAgICAgbmV0d29ya19yZWFkeSA9IDE7CgkgICAgICByZXR1cm4gMTsKCSAgICB9CgoJICBkaGNwX3JlcGx5ID0gMDsKI2lmZGVmIERFQlVHCiAgZXRoZXJib290X3ByaW50ZiAoImJwX29wID0gJWRcbiIsIChpbnQpIGlwLmJwLmJwX29wKTsKICBldGhlcmJvb3RfcHJpbnRmICgiYnBfaHR5cGUgPSAlZFxuIiwgKGludCkgaXAuYnAuYnBfaHR5cGUpOwogIGV0aGVyYm9vdF9wcmludGYgKCJicF9obGVuID0gJWRcbiIsIChpbnQpIGlwLmJwLmJwX2hsZW4pOwogIGV0aGVyYm9vdF9wcmludGYgKCJicF94aWQgPSAlZFxuIiwgKGludCkgaXAuYnAuYnBfeGlkKTsKICBldGhlcmJvb3RfcHJpbnRmICgiYnBfaHdhZGRyID0gJSFcbiIsIGlwLmJwLmJwX2h3YWRkcik7CiAgZXRoZXJib290X3ByaW50ZiAoImJwX2hvcHMgPSAlZFxuIiwgKGludCkgaXAuYnAuYnBfaG9wcyk7CiAgZXRoZXJib290X3ByaW50ZiAoImJwX3NlY3MgPSAlZFxuIiwgKGludCkgaXAuYnAuYnBfaHdhZGRyKTsKI2VuZGlmCgkgIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCwgcmZjMTUzM19jb29raWUsIHNpemVvZiByZmMxNTMzX2Nvb2tpZSk7CgkgIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCArIHNpemVvZiByZmMxNTMzX2Nvb2tpZSwKCQkJZGhjcHJlcXVlc3QsIHNpemVvZiBkaGNwcmVxdWVzdCk7CgkgIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCArIHNpemVvZiByZmMxNTMzX2Nvb2tpZQoJCQkrIHNpemVvZiBkaGNwcmVxdWVzdCwKCQkJcmZjMTUzM19lbmQsIHNpemVvZiByZmMxNTMzX2VuZCk7CgkgIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCArIDksIChjaGFyICopICZkaGNwX3NlcnZlciwKCQkJc2l6ZW9mIChpbl9hZGRyKSk7CgkgIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCArIDE1LCAoY2hhciAqKSAmZGhjcF9hZGRyLAoJCQlzaXplb2YgKGluX2FkZHIpKTsKI2lmZGVmIERFQlVHCgkgIGdydWJfcHJpbnRmICgiZXJybnVtID0gJWRcbiIsIGVycm51bSk7CiNlbmRpZgoJICBmb3IgKHJlcXJldHJ5ID0gMDsgcmVxcmV0cnkgPCBNQVhfQk9PVFBfUkVUUklFUzspCgkgICAgewoJICAgICAgaW50IHJldDsKI2lmZGVmIERFQlVHCgkgICAgICBncnViX3ByaW50ZiAoInJlcXJldHJ5ID0gJWRcbiIsIHJlcXJldHJ5KTsKI2VuZGlmCgkgICAgICAKCSAgICAgIHJldCA9IHVkcF90cmFuc21pdCAoSVBfQlJPQURDQVNULCBCT09UUF9DTElFTlQsIEJPT1RQX1NFUlZFUiwKCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgYm9vdHBpcF90KSwgJmlwKTsKCSAgICAgIGlmICghIHJldCkKCQlncnViX3ByaW50ZiAoInVkcF90cmFuc21pdCBmYWlsZWQuXG4iKTsKCSAgICAgIAoJICAgICAgZGhjcF9yZXBseSA9IDA7CgkgICAgICB0aW1lb3V0ID0gcmZjMjEzMV9zbGVlcF9pbnRlcnZhbCAoVElNRU9VVCwgcmVxcmV0cnkrKyk7CgkgICAgICBpZiAoYXdhaXRfcmVwbHkgKEFXQUlUX0JPT1RQLCAwLCBOVUxMLCB0aW1lb3V0KSkKCQlpZiAoZGhjcF9yZXBseSA9PSBESENQQUNLKQoJCSAgewoJCSAgICBuZXR3b3JrX3JlYWR5ID0gMTsKCQkgICAgcmV0dXJuIDE7CgkJICB9CgojaWZkZWYgREVCVUcKCSAgICAgIGdydWJfcHJpbnRmICgiZGhjcF9yZXBseSA9ICVkXG4iLCBkaGNwX3JlcGx5KTsKI2VuZGlmCgkgICAgICAKCSAgICAgIGlmIChpcF9hYm9ydCkKCQlyZXR1cm4gMDsKCSAgICB9Cgl9CiNlbmRpZiAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLwogICAgICAKICAgICAgaWYgKGlwX2Fib3J0KQoJcmV0dXJuIDA7CiAgICAgIAogICAgICBpcC5icC5icF9zZWNzID0gaHRvbnMgKChjdXJydGlja3MgKCkgLSBzdGFydHRpbWUpIC8gVElDS1NfUEVSX1NFQyk7CiAgICB9CgogIC8qIFRpbWVvdXQuICAqLwogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKVURQQ0hLU1VNIC0gQ2hlY2tzdW0gVURQIFBhY2tldCAob25lIG9mIHRoZSByYXJlIGNhc2VzIHdoZW4gYXNzZW1ibHkgaXMKICAgICAgICAgICAgYWN0dWFsbHkgc2ltcGxlci4uLikKIFJFVFVSTlM6IGNoZWNrc3VtLCAwIG9uIGNoZWNrc3VtIGVycm9yLiBUaGlzCiAgICAgICAgICBhbGxvd3MgZm9yIHVzaW5nIHRoZSBzYW1lIHJvdXRpbmUgZm9yIFJYIGFuZCBUWCBzdW1taW5nOgogICAgICAgICAgUlggIGlmIChwYWNrZXQtPnVkcC5jaGtzdW0gJiYgdWRwY2hrc3VtKHBhY2tldCkpCiAgICAgICAgICAgICAgICAgIGVycm9yKCJjaGVja3N1bSBlcnJvciIpOwogICAgICAgICAgVFggIHBhY2tldC0+dWRwLmNoa3N1bT0wOwogICAgICAgICAgICAgIGlmICgwPT0ocGFja2V0LT51ZHAuY2hrc3VtPXVkcGNoa3N1bShwYWNrZXQpKSkKICAgICAgICAgICAgICAgICAgcGFja2V0LT51cGQuY2hrc3VtPTB4ZmZmZjsKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbmxpbmUgdm9pZApkb3N1bSAodW5zaWduZWQgc2hvcnQgKnN0YXJ0LCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBzaG9ydCAqc3VtKQp7CiAgX19hc21fXyBfX3ZvbGF0aWxlX18KICAgICgiY2xjXG4iCiAgICAgIjE6XHRsb2Rzd1xuXHQiCiAgICAgInhjaGcgJSVhbCwlJWFoXG5cdCIJLyogY29udmVydCB0byBob3N0IGJ5dGUgb3JkZXIgKi8KICAgICAiYWRjdyAlJWF4LCUwXG5cdCIJCS8qIGFkZCBjYXJyeSBvZiBwcmV2aW91cyBpdGVyYXRpb24gKi8KICAgICAibG9vcCAxYlxuXHQiCiAgICAgImFkY3cgJDAsJTAiCQkvKiBhZGQgY2Fycnkgb2YgbGFzdCBpdGVyYXRpb24gKi8KICAgICA6ICI9YiIgKCpzdW0pLCAiPVMiKHN0YXJ0KSwgIj1jIihsZW4pCiAgICAgOiAiMCIoKnN1bSksICIxIihzdGFydCksICIyIihsZW4pCiAgICAgOiAiYXgiLCAiY2MiCiAgICAgKTsKfQoKLyogVURQIHN1bToKICogcHJvdG8sIHNyY19pcCwgZHN0X2lwLCB1ZHBfZHBvcnQsIHVkcF9zcG9ydCwgMip1ZHBfbGVuLCBwYXlsb2FkCiAqLwpzdGF0aWMgdW5zaWduZWQgc2hvcnQKdWRwY2hrc3VtIChzdHJ1Y3QgaXBoZHIgKnBhY2tldCkKewogIGludCBsZW4gPSBudG9ocyAocGFja2V0LT5sZW4pOwogIHVuc2lnbmVkIHNob3J0IHJ2YWw7CiAgCiAgLyogYWRkIHVkcGxlbmd0aCArIHByb3RvY29sIG51bWJlciAqLwogIHJ2YWwgPSAobGVuIC0gc2l6ZW9mIChzdHJ1Y3QgaXBoZHIpKSArIElQX1VEUDsKICAKICAvKiBwYWQgdG8gYW4gZXZlbiBudW1iZXIgb2YgYnl0ZXMgKi8KICBpZiAobGVuICUgMikgewogICAgKChjaGFyICopIHBhY2tldClbbGVuKytdID0gMDsKICB9CiAgCiAgLyogc3VtIG92ZXIgc3JjL2RzdCBpcGFkZHIgKyB1ZHAgcGFja2V0ICovCiAgbGVuIC09IChjaGFyICopICZwYWNrZXQtPnNyYyAtIChjaGFyICopIHBhY2tldDsKICBkb3N1bSAoKHVuc2lnbmVkIHNob3J0ICopICZwYWNrZXQtPnNyYywgbGVuID4+IDEsICZydmFsKTsKICAKICAvKiB0YWtlIG9uZSdzIGNvbXBsZW1lbnQgKi8KICByZXR1cm4gfnJ2YWw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpBV0FJVF9SRVBMWSAtIFdhaXQgdW50aWwgd2UgZ2V0IGEgcmVzcG9uc2UgZm9yIG91ciByZXF1ZXN0CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgCmF3YWl0X3JlcGx5IChpbnQgdHlwZSwgaW50IGl2YWwsIHZvaWQgKnB0ciwgaW50IHRpbWVvdXQpCnsKICB1bnNpZ25lZCBsb25nIHRpbWU7CiAgc3RydWN0IGlwaGRyICppcDsKICBzdHJ1Y3QgdWRwaGRyICp1ZHA7CiAgc3RydWN0IGFycHJlcXVlc3QgKmFycHJlcGx5OwogIHN0cnVjdCBib290cF90ICpib290cHJlcGx5OwogIHVuc2lnbmVkIHNob3J0IHB0eXBlOwogIHVuc2lnbmVkIGludCBwcm90b2hkcmxlbiA9IChFVEhfSExFTiArIHNpemVvZiAoc3RydWN0IGlwaGRyKQoJCQkgICAgICArIHNpemVvZiAoc3RydWN0IHVkcGhkcikpOwoKICAvKiBDbGVhciB0aGUgYWJvcnQgZmxhZy4gICovCiAgaXBfYWJvcnQgPSAwOwogIAogIHRpbWUgPSB0aW1lb3V0ICsgY3VycnRpY2tzICgpOwogIC8qIFRoZSB0aW1lb3V0IGNoZWNrIGlzIGRvbmUgYmVsb3cuICBUaGUgdGltZW91dCBpcyBvbmx5IGNoZWNrZWQgaWYKICAgKiB0aGVyZSBpcyBubyBwYWNrZXQgaW4gdGhlIFJ4IHF1ZXVlLiAgVGhpcyBhc3N1bWVzIHRoYXQgZXRoX3BvbGwoKQogICAqIG5lZWRzIGEgbmVnbGlnaWJsZSBhbW91bnQgb2YgdGltZS4gICovCiAgZm9yICg7OykKICAgIHsKICAgICAgaWYgKGV0aF9wb2xsICgpKQoJewoJICAvKiBXZSBoYXZlIHNvbWV0aGluZyEgICovCgkgIAoJICAvKiBDaGVjayBmb3IgQVJQIC0gTm8gSVAgaGRyLiAgKi8KCSAgaWYgKG5pYy5wYWNrZXRsZW4gPj0gRVRIX0hMRU4pCgkgICAgewoJICAgICAgcHR5cGUgPSAoKCh1bnNpZ25lZCBzaG9ydCkgbmljLnBhY2tldFsxMl0pIDw8IDgKCQkgICAgICAgfCAoKHVuc2lnbmVkIHNob3J0KSBuaWMucGFja2V0WzEzXSkpOwoJICAgIH0KCSAgZWxzZQoJICAgIC8qIFdoYXQgZWxzZSBjb3VsZCB3ZSBkbyB3aXRoIGl0PyAgKi8KCSAgICBjb250aW51ZTsKCSAgCgkgIGlmIChuaWMucGFja2V0bGVuID49IEVUSF9ITEVOICsgc2l6ZW9mIChzdHJ1Y3QgYXJwcmVxdWVzdCkKCSAgICAgICYmIHB0eXBlID09IEFSUCkKCSAgICB7CgkgICAgICB1bnNpZ25lZCBsb25nIHRtcDsKCgkgICAgICBhcnByZXBseSA9IChzdHJ1Y3QgYXJwcmVxdWVzdCAqKSAmbmljLnBhY2tldFtFVEhfSExFTl07CgkgICAgICAKCSAgICAgIGlmIChhcnByZXBseS0+b3Bjb2RlID09IGh0b25zIChBUlBfUkVQTFkpCgkJICAmJiAhIGdydWJfbWVtY21wIChhcnByZXBseS0+c2lwYWRkciwgcHRyLCBzaXplb2YgKGluX2FkZHIpKQoJCSAgJiYgdHlwZSA9PSBBV0FJVF9BUlApCgkJewoJCSAgZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSBhcnB0YWJsZVtpdmFsXS5ub2RlLAoJCQkJYXJwcmVwbHktPnNod2FkZHIsCgkJCQlFVEhfQUxFTik7CgkJICByZXR1cm4gMTsKCQl9CgkgICAgICAKCSAgICAgIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgJnRtcCwgYXJwcmVwbHktPnRpcGFkZHIsCgkJCSAgICBzaXplb2YgKGluX2FkZHIpKTsKCSAgICAgIAoJICAgICAgaWYgKGFycHJlcGx5LT5vcGNvZGUgPT0gaHRvbnMgKEFSUF9SRVFVRVNUKQoJCSAgJiYgdG1wID09IGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIpCgkJewoJCSAgYXJwcmVwbHktPm9wY29kZSA9IGh0b25zIChBUlBfUkVQTFkpOwoJCSAgZ3J1Yl9tZW1tb3ZlIChhcnByZXBseS0+dGlwYWRkciwgYXJwcmVwbHktPnNpcGFkZHIsCgkJCQlzaXplb2YgKGluX2FkZHIpKTsKCQkgIGdydWJfbWVtbW92ZSAoYXJwcmVwbHktPnRod2FkZHIsIChjaGFyICopIGFycHJlcGx5LT5zaHdhZGRyLAoJCQkJRVRIX0FMRU4pOwoJCSAgZ3J1Yl9tZW1tb3ZlIChhcnByZXBseS0+c2lwYWRkciwKCQkJCShjaGFyICopICZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIsCgkJCQlzaXplb2YgKGluX2FkZHIpKTsKCQkgIGdydWJfbWVtbW92ZSAoYXJwcmVwbHktPnNod2FkZHIsCgkJCQlhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlLAoJCQkJRVRIX0FMRU4pOwoJCSAgZXRoX3RyYW5zbWl0IChhcnByZXBseS0+dGh3YWRkciwgQVJQLAoJCQkJc2l6ZW9mIChzdHJ1Y3QgYXJwcmVxdWVzdCksCgkJCQlhcnByZXBseSk7CiNpZmRlZiBNREVCVUcKCQkgIGdydWJfbWVtbW92ZSAoJnRtcCwgYXJwcmVwbHktPnRpcGFkZHIsIHNpemVvZiAoaW5fYWRkcikpOwoJCSAgZXRoZXJib290X3ByaW50ZiAoIlNlbnQgQVJQIHJlcGx5IHRvOiAlQFxuIiwgdG1wKTsKI2VuZGlmCS8qIE1ERUJVRyAqLwoJCX0KCSAgICAgIAoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgaWYgKHR5cGUgPT0gQVdBSVRfUURSQUlOKQoJICAgIGNvbnRpbnVlOwoJICAKCSAgLyogQ2hlY2sgZm9yIFJBUlAgLSBObyBJUCBoZHIuICAqLwoJICBpZiAodHlwZSA9PSBBV0FJVF9SQVJQCgkgICAgICAmJiBuaWMucGFja2V0bGVuID49IEVUSF9ITEVOICsgc2l6ZW9mIChzdHJ1Y3QgYXJwcmVxdWVzdCkKCSAgICAgICYmIHB0eXBlID09IFJBUlApCgkgICAgewoJICAgICAgYXJwcmVwbHkgPSAoc3RydWN0IGFycHJlcXVlc3QgKikgJm5pYy5wYWNrZXRbRVRIX0hMRU5dOwoJICAgICAgCgkgICAgICBpZiAoYXJwcmVwbHktPm9wY29kZSA9PSBodG9ucyAoUkFSUF9SRVBMWSkKCQkgICYmICEgZ3J1Yl9tZW1jbXAgKGFycHJlcGx5LT50aHdhZGRyLCBwdHIsIEVUSF9BTEVOKSkKCQl7CgkJICBncnViX21lbW1vdmUgKChjaGFyICopIGFycHRhYmxlW0FSUF9TRVJWRVJdLm5vZGUsCgkJCQlhcnByZXBseS0+c2h3YWRkciwgRVRIX0FMRU4pOwoJCSAgZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSAmYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLAoJCQkJYXJwcmVwbHktPnNpcGFkZHIsIHNpemVvZiAoaW5fYWRkcikpOwoJCSAgZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSAmYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLAoJCQkJYXJwcmVwbHktPnRpcGFkZHIsIHNpemVvZiAoaW5fYWRkcikpOwoJCSAgcmV0dXJuIDE7CgkJfQoJICAgICAgCgkgICAgICBjb250aW51ZTsKCSAgICB9CgoJICAvKiBBbnl0aGluZyBlbHNlIGhhcyBJUCBoZWFkZXIuICAqLwoJICBpZiAobmljLnBhY2tldGxlbiA8IHByb3RvaGRybGVuIHx8IHB0eXBlICE9IElQKQoJICAgIGNvbnRpbnVlOwoJICAKCSAgaXAgPSAoc3RydWN0IGlwaGRyICopICZuaWMucGFja2V0W0VUSF9ITEVOXTsKCSAgaWYgKGlwLT52ZXJoZHJsZW4gIT0gMHg0NQoJICAgICAgfHwgaXBjaGtzdW0gKCh1bnNpZ25lZCBzaG9ydCAqKSBpcCwgc2l6ZW9mIChzdHJ1Y3QgaXBoZHIpKQoJICAgICAgfHwgaXAtPnByb3RvY29sICE9IElQX1VEUCkKCSAgICBjb250aW51ZTsKCSAgCgkgIC8qCgkgICAgLSBUaWxsIFN0cmF1bWFubiA8VGlsbC5TdHJhdW1hbm5AVFUtQmVybGluLmRlPgoJICAgIGFkZGVkIHVkcCBjaGVja3N1bSAoc2FmZXIgb24gYSB3aXJlbGVzcyBsaW5rKQoJICAgIGFkZGVkIGZyYWdtZW50YXRpb24gY2hlY2s6IEkgaGFkIGEgY29ycnVwdGVkIGltYWdlCgkgICAgaW4gbWVtb3J5IGR1ZSB0byBmcmFnbWVudGVkIFRGVFAgcGFja2V0cyAtIHRvb2sgbWUKCSAgICAzIGRheXMgdG8gZmluZCB0aGUgY2F1c2UgZm9yIHRoaXMgOi0oCgkgICovCgkgIAoJICAvKiBJZiBNb3JlIEZyYWdtZW50cyBiaXQgYW5kIEZyYWdtZW50IE9mZnNldCBmaWVsZAoJICAgICBhcmUgbm9uLXplcm8gdGhlbiBwYWNrZXQgaXMgZnJhZ21lbnRlZCAqLwoJICBpZiAoaXAtPmZyYWdzICYgaHRvbnMoMHgzRkZGKSkKCSAgICB7CgkgICAgICBncnViX3ByaW50ZiAoIkFMRVJUOiBnb3QgYSBmcmFnbWVudGVkIHBhY2tldCAtIHJlY29uZmlndXJlIHlvdXIgc2VydmVyXG4iKTsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSAgCgkgIHVkcCA9IChzdHJ1Y3QgdWRwaGRyICopICZuaWMucGFja2V0WyhFVEhfSExFTgoJCQkJCSAgICAgICArIHNpemVvZiAoc3RydWN0IGlwaGRyKSldOwoJICBpZiAodWRwLT5jaGtzdW0gJiYgdWRwY2hrc3VtIChpcCkpCgkgICAgewoJICAgICAgZ3J1Yl9wcmludGYgKCJVRFAgY2hlY2tzdW0gZXJyb3JcbiIpOwoJICAgICAgY29udGludWU7CgkgICAgfQoJICAKCSAgLyogQk9PVFAgPyAgKi8KCSAgYm9vdHByZXBseSA9IChzdHJ1Y3QgYm9vdHBfdCAqKQoJICAgICZuaWMucGFja2V0WyhFVEhfSExFTiArIHNpemVvZiAoc3RydWN0IGlwaGRyKQoJCQkgKyBzaXplb2YgKHN0cnVjdCB1ZHBoZHIpKV07CgkgIGlmICh0eXBlID09IEFXQUlUX0JPT1RQCiNpZmRlZiBOT19ESENQX1NVUFBPUlQKCSAgICAgICYmIChuaWMucGFja2V0bGVuCgkJICA+PSAoRVRIX0hMRU4gKyBzaXplb2YgKHN0cnVjdCBib290cF90KSAtIEJPT1RQX1ZFTkRPUl9MRU4pKQojZWxzZQoJICAgICAgJiYgKG5pYy5wYWNrZXRsZW4KCQkgID49IChFVEhfSExFTiArIHNpemVvZiAoc3RydWN0IGJvb3RwX3QpIC0gREhDUF9PUFRfTEVOKSkKI2VuZGlmIC8qICEgTk9fREhDUF9TVVBQT1JUICovCgkgICAgICAmJiB1ZHAtPmRlc3QgPT0gaHRvbnMgKEJPT1RQX0NMSUVOVCkKCSAgICAgICYmIGJvb3RwcmVwbHktPmJwX29wID09IEJPT1RQX1JFUExZCgkgICAgICAmJiBib290cHJlcGx5LT5icF94aWQgPT0geGlkCgkgICAgICAmJiAoISBncnViX21lbWNtcCAoYnJvYWRjYXN0LCBib290cHJlcGx5LT5icF9od2FkZHIsIEVUSF9BTEVOKQoJCSAgfHwgISBncnViX21lbWNtcCAoYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwKCQkJCSAgICBib290cHJlcGx5LT5icF9od2FkZHIsIEVUSF9BTEVOKSkpCgkgICAgewojaWZkZWYgREVCVUcKCSAgICAgIGdydWJfcHJpbnRmICgiQk9PVFAgcGFja2V0IHdhcyByZWNlaXZlZC5cbiIpOwojZW5kaWYKCSAgICAgIGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIKCQk9IGJvb3RwcmVwbHktPmJwX3lpYWRkci5zX2FkZHI7CiNpZm5kZWYJTk9fREhDUF9TVVBQT1JUCgkgICAgICBkaGNwX2FkZHIuc19hZGRyID0gYm9vdHByZXBseS0+YnBfeWlhZGRyLnNfYWRkcjsKI2lmZGVmIERFQlVHCgkgICAgICBldGhlcmJvb3RfcHJpbnRmICgiZGhjcF9hZGRyID0gJUBcbiIsIGRoY3BfYWRkci5zX2FkZHIpOwojZW5kaWYKI2VuZGlmIC8qICEgTk9fREhDUF9TVVBQT1JUICovCgkgICAgICBuZXRtYXNrID0gZGVmYXVsdF9uZXRtYXNrICgpOwoJICAgICAgYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkcgoJCT0gYm9vdHByZXBseS0+YnBfc2lhZGRyLnNfYWRkcjsKCSAgICAgIC8qIEtpbGwgYXJwLiAgKi8KCSAgICAgIGdydWJfbWVtc2V0IChhcnB0YWJsZVtBUlBfU0VSVkVSXS5ub2RlLCAwLCBFVEhfQUxFTik7CgkgICAgICBhcnB0YWJsZVtBUlBfR0FURVdBWV0uaXBhZGRyLnNfYWRkcgoJCT0gYm9vdHByZXBseS0+YnBfZ2lhZGRyLnNfYWRkcjsKCSAgICAgIC8qIEtpbGwgYXJwLiAgKi8KCSAgICAgIGdydWJfbWVtc2V0IChhcnB0YWJsZVtBUlBfR0FURVdBWV0ubm9kZSwgMCwgRVRIX0FMRU4pOwoKCSAgICAgIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgQk9PVFBfREFUQV9BRERSLCAoY2hhciAqKSBib290cHJlcGx5LAoJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgYm9vdHBkX3QpKTsKI2lmZGVmIE5PX0RIQ1BfU1VQUE9SVAoJICAgICAgZGVjb2RlX3JmYzE1MzMgKEJPT1RQX0RBVEFfQUREUi0+Ym9vdHBfcmVwbHkuYnBfdmVuZCwKCQkJICAgICAgMCwgQk9PVFBfVkVORE9SX0xFTiArIE1BWF9CT09UUF9FWFRMRU4sIDEpOwojZWxzZQoJICAgICAgZGVjb2RlX3JmYzE1MzMgKEJPT1RQX0RBVEFfQUREUi0+Ym9vdHBfcmVwbHkuYnBfdmVuZCwKCQkJICAgICAgMCwgREhDUF9PUFRfTEVOICsgTUFYX0JPT1RQX0VYVExFTiwgMSk7CiNlbmRpZiAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLwoJICAgICAgCgkgICAgICByZXR1cm4gMTsKCSAgICB9CgkgIAoJICAvKiBURlRQID8gKi8KCSAgaWYgKHR5cGUgPT0gQVdBSVRfVEZUUCAmJiBudG9ocyAodWRwLT5kZXN0KSA9PSBpdmFsKQoJICAgIHJldHVybiAxOwoJfQogICAgICBlbHNlCgl7CgkgIC8qIENoZWNrIGZvciBhYm9ydCBrZXkgb25seSBpZiB0aGUgUnggcXVldWUgaXMgZW1wdHkgLQoJICAgKiBhcyBsb25nIGFzIHdlIGhhdmUgc29tZXRoaW5nIHRvIHByb2Nlc3MsIGRvbid0CgkgICAqIGFzc3VtZSB0aGF0IHNvbWV0aGluZyBmYWlsZWQuICBJdCBpcyB1bmxpa2VseSB0aGF0CgkgICAqIHdlIGhhdmUgbm8gcHJvY2Vzc2luZyB0aW1lIGxlZnQgYmV0d2VlbiBwYWNrZXRzLiAgKi8KCSAgaWYgKGNoZWNra2V5ICgpICE9IC0xICYmIEFTQ0lJX0NIQVIgKGdldGtleSAoKSkgPT0gQ1RSTF9DKQoJICAgIHsKCSAgICAgIGlwX2Fib3J0ID0gMTsKCSAgICAgIHJldHVybiAwOwoJICAgIH0KCSAgCgkgIC8qIERvIHRoZSB0aW1lb3V0IGFmdGVyIGF0IGxlYXN0IGEgZnVsbCBxdWV1ZSB3YWxrLiAgKi8KCSAgaWYgKCh0aW1lb3V0ID09IDApIHx8IChjdXJydGlja3MoKSA+IHRpbWUpKQoJICAgIHsKCSAgICAgIGJyZWFrOwoJICAgIH0KCX0KICAgIH0KICAKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkRFQ09ERV9SRkMxNTMzIC0gRGVjb2RlcyBSRkMxNTMzIGhlYWRlcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CmRlY29kZV9yZmMxNTMzICh1bnNpZ25lZCBjaGFyICpwLCBpbnQgYmxvY2ssIGludCBsZW4sIGludCBlb2YpCnsKICBzdGF0aWMgdW5zaWduZWQgY2hhciAqZXh0ZGF0YSA9IE5VTEwsICpleHRlbmQgPSBOVUxMOwogIHVuc2lnbmVkIGNoYXIgKmV4dHBhdGggPSBOVUxMOwogIHVuc2lnbmVkIGNoYXIgKmVuZHA7CiAgCiAgaWYgKGJsb2NrID09IDApCiAgICB7CiAgICAgIGVuZF9vZl9yZmMxNTMzID0gTlVMTDsKICAgICAgdmVuZG9yZXh0X2lzdmFsaWQgPSAwOwogICAgICAKICAgICAgaWYgKGdydWJfbWVtY21wIChwLCByZmMxNTMzX2Nvb2tpZSwgNCkpCgkvKiBubyBSRkMgMTUzMyBoZWFkZXIgZm91bmQgKi8KCXJldHVybiAwOwogICAgICAKICAgICAgcCArPSA0OwogICAgICBlbmRwID0gcCArIGxlbjsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIGlmIChibG9jayA9PSAxKQoJewoJICBpZiAoZ3J1Yl9tZW1jbXAgKHAsIHJmYzE1MzNfY29va2llLCA0KSkKCSAgICAvKiBubyBSRkMgMTUzMyBoZWFkZXIgZm91bmQgKi8KCSAgICByZXR1cm4gMDsKCSAgCgkgIHAgKz0gNDsKCSAgbGVuIC09IDQ7Cgl9CiAgICAgIAogICAgICBpZiAoZXh0ZW5kICsgbGVuCgkgIDw9ICgodW5zaWduZWQgY2hhciAqKQoJICAgICAgJihCT09UUF9EQVRBX0FERFItPmJvb3RwX2V4dGVuc2lvbltNQVhfQk9PVFBfRVhUTEVOXSkpKQoJewoJICBncnViX21lbW1vdmUgKGV4dGVuZCwgcCwgbGVuKTsKCSAgZXh0ZW5kICs9IGxlbjsKCX0KICAgICAgZWxzZQoJewoJICBncnViX3ByaW50ZiAoIk92ZXJmbG93IGluIHZlbmRvciBkYXRhIGJ1ZmZlciEgQWJvcnRpbmcuLi5cbiIpOwoJICAqZXh0ZGF0YSA9IFJGQzE1MzNfRU5EOwoJICByZXR1cm4gMDsKCX0KICAgICAgCiAgICAgIHAgPSBleHRkYXRhOwogICAgICBlbmRwID0gZXh0ZW5kOwogICAgfQoKICBpZiAoISBlb2YpCiAgICByZXR1cm4gLTE7CiAgCiAgd2hpbGUgKHAgPCBlbmRwKQogICAgewogICAgICB1bnNpZ25lZCBjaGFyIGMgPSAqcDsKICAgICAgCiAgICAgIGlmIChjID09IFJGQzE1MzNfUEFEKQoJewoJICBwKys7CgkgIGNvbnRpbnVlOwoJfQogICAgICBlbHNlIGlmIChjID09IFJGQzE1MzNfRU5EKQoJewoJICBlbmRfb2ZfcmZjMTUzMyA9IGVuZHAgPSBwOwoJICBjb250aW51ZTsKCX0KICAgICAgZWxzZSBpZiAoYyA9PSBSRkMxNTMzX05FVE1BU0spCgl7CgkgIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgJm5ldG1hc2ssIHAgKyAyLCBzaXplb2YgKGluX2FkZHIpKTsKCX0KICAgICAgZWxzZSBpZiAoYyA9PSBSRkMxNTMzX0dBVEVXQVkpCgl7CgkgIC8qIFRoaXMgaXMgYSBsaXR0bGUgc2ltcGxpc3RpYywgYnV0IGl0IHdpbGwKCSAgICAgdXN1YWxseSBiZSBzdWZmaWNpZW50LgoJICAgICBUYWtlIG9ubHkgdGhlIGZpcnN0IGVudHJ5LiAgKi8KCSAgaWYgKFRBR19MRU4gKHApID49IHNpemVvZiAoaW5fYWRkcikpCgkgICAgZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSAmYXJwdGFibGVbQVJQX0dBVEVXQVldLmlwYWRkciwgcCArIDIsCgkJCSAgc2l6ZW9mIChpbl9hZGRyKSk7Cgl9CiAgICAgIGVsc2UgaWYgKGMgPT0gUkZDMTUzM19FWFRFTlNJT05QQVRIKQoJZXh0cGF0aCA9IHA7CiNpZm5kZWYJTk9fREhDUF9TVVBQT1JUCiAgICAgIGVsc2UgaWYgKGMgPT0gUkZDMjEzMl9NU0dfVFlQRSkKCXsKCSAgZGhjcF9yZXBseSA9ICoocCArIDIpOwoJfQogICAgICBlbHNlIGlmIChjID09IFJGQzIxMzJfU1JWX0lEKQoJewoJICBncnViX21lbW1vdmUgKChjaGFyICopICZkaGNwX3NlcnZlciwgcCArIDIsIHNpemVvZiAoaW5fYWRkcikpOwojaWZkZWYgREVCVUcKCSAgZXRoZXJib290X3ByaW50ZiAoImRoY3Bfc2VydmVyID0gJUBcbiIsIGRoY3Bfc2VydmVyLnNfYWRkcik7CiNlbmRpZgoJfQojZW5kaWYgLyogISBOT19ESENQX1NVUFBPUlQgKi8KICAgICAgZWxzZSBpZiAoYyA9PSBSRkMxNTMzX1ZFTkRPUl9NQUdJQwoJICAgICAgICYmIFRBR19MRU4ocCkgPj0gNgoJICAgICAgICYmICEgZ3J1Yl9tZW1jbXAgKHAgKyAyLCB2ZW5kb3JleHRfbWFnaWMsIDQpCgkgICAgICAgJiYgcFs2XSA9PSBSRkMxNTMzX1ZFTkRPUl9NQUpPUikKCXZlbmRvcmV4dF9pc3ZhbGlkKys7CiAgICAgIC8qIEdSVUIgbm93IGhhbmRsZXMgaXRzIG93biB0YWcuIEdldCB0aGUgbmFtZSBvZiBhIGNvbmZpZ3VyYXRpb24KCSBmaWxlIGZyb20gdGhlIG5ldHdvcmsuIENvb2wuLi4gICovCiAgICAgIGVsc2UgaWYgKGMgPT0gUkZDMTUzM19WRU5ET1JfQ09ORklHRklMRSkKCXsKCSAgaW50IGwgPSBUQUdfTEVOIChwKTsKCSAgCgkgIC8qIEVsaW1pbmF0ZSB0aGUgdHJhaWxpbmcgTlVMcyBhY2NvcmRpbmcgdG8gUkZDIDIxMzIuICAqLwoJICB3aGlsZSAoKihwICsgMiArIGwgLSAxKSA9PSAnXDAwMCcgJiYgbCA+IDApCgkgICAgbC0tOwoJICAKCSAgLyogWFhYOiBTaG91bGQgY2hlY2sgaWYgTEVOIGlzIGxlc3MgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGgKCSAgICAgb2YgQ09ORklHX0ZJTEUuIFRoaXMga2luZCBvZiByb2J1c3RuZXNzIHdpbGwgYmUgYSBnb2FsCgkgICAgIGluIEdSVUIgMS4wLiAgKi8KCSAgZ3J1Yl9tZW1tb3ZlIChjb25maWdfZmlsZSwgcCArIDIsIGwpOwoJICBjb25maWdfZmlsZVtsXSA9IDA7Cgl9CiAgICAgIAogICAgICBwICs9IFRBR19MRU4gKHApICsgMjsKICAgIH0KICAKICBleHRkYXRhID0gZXh0ZW5kID0gZW5kcDsKICAKICAvKiBQZXJoYXBzIHdlIGNhbiBlbGltaW5hdGUgdGhpcyBiZWNhdXNlIHdlIGRvZXNuJ3QgcmVxdWlyZSBzbwogICAgIG11Y2ggaW5mb3JtYXRpb24sIGJ1dCBJIGxlYXZlIHRoaXMgYWxvbmUuICAqLwogIGlmIChibG9jayA9PSAwICYmIGV4dHBhdGggIT0gTlVMTCkKICAgIHsKICAgICAgY2hhciBmbmFtZVs2NF07CiAgICAgIGludCBmbmFtZWxlbiA9IFRBR19MRU4gKGV4dHBhdGgpOwogICAgICAKICAgICAgd2hpbGUgKCooZXh0cGF0aCArIDIgKyBmbmFtZWxlbiAtIDEpID09ICdcMDAwJyAmJiBmbmFtZWxlbiA+IDApCglmbmFtZWxlbi0tOwogICAgICAKICAgICAgaWYgKGZuYW1lbGVuICsgMSA+IHNpemVvZiAoZm5hbWUpKQoJewoJICBncnViX3ByaW50ZiAoIlRvbyBsb25nIGZpbGUgbmFtZSBmb3IgRXh0ZW5zaW9ucyBQYXRoXG4iKTsKCSAgcmV0dXJuIDA7Cgl9CiAgICAgIGVsc2UgaWYgKCEgZm5hbWVsZW4pCgl7CgkgIGdydWJfcHJpbnRmICgiRW1wdHkgZmlsZSBuYW1lIGZvciBFeHRlbnNpb25zIFBhdGhcbiIpOwoJICByZXR1cm4gMDsKCX0KICAgICAgCiAgICAgIGdydWJfbWVtbW92ZSAoZm5hbWUsIGV4dHBhdGggKyAyLCBmbmFtZWxlbik7CiAgICAgIGZuYW1lW2ZuYW1lbGVuXSA9ICdcMDAwJzsKICAgICAgZ3J1Yl9wcmludGYgKCJMb2FkaW5nIEJPT1RQLWV4dGVuc2lvbiBmaWxlOiAlc1xuIiwgZm5hbWUpOwogICAgICB0ZnRwIChmbmFtZSwgZGVjb2RlX3JmYzE1MzMpOwogICAgfQogIAogIC8qIFByb2NlZWQgd2l0aCBuZXh0IGJsb2NrLiAgKi8KICByZXR1cm4gLTE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpJUENIS1NVTSAtIENoZWNrc3VtIElQIEhlYWRlcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHVuc2lnbmVkIHNob3J0IAppcGNoa3N1bSAodW5zaWduZWQgc2hvcnQgKmlwLCBpbnQgbGVuKQp7CiAgdW5zaWduZWQgbG9uZyBzdW0gPSAwOwogIGxlbiA+Pj0gMTsKICB3aGlsZSAobGVuLS0pCiAgICB7CiAgICAgIHN1bSArPSAqKGlwKyspOwogICAgICBpZiAoc3VtID4gMHhGRkZGKQoJc3VtIC09IDB4RkZGRjsKICAgIH0KICByZXR1cm4gKH5zdW0pICYgMHgwMDAwRkZGRjsKfQoKI2RlZmluZSBUV09fU0VDT05EX0RJVklTT1IgKDIxNDc0ODM2NDdsL1RJQ0tTX1BFUl9TRUMpCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKUkZDMjEzMV9TTEVFUF9JTlRFUlZBTCAtIHNsZWVwIGZvciBleHBvdGVudGlhbGx5IGxvbmdlciB0aW1lcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KbG9uZwpyZmMyMTMxX3NsZWVwX2ludGVydmFsIChpbnQgYmFzZSwgaW50IGV4cCkKewogIHN0YXRpYyBsb25nIHNlZWQgPSAwOwogIGxvbmcgcTsKICB1bnNpZ25lZCBsb25nIHRtbzsKICAKI2lmZGVmIEJBQ0tPRkZfTElNSVQKICBpZiAoZXhwID4gQkFDS09GRl9MSU1JVCkKICAgIGV4cCA9IEJBQ0tPRkZfTElNSVQ7CiNlbmRpZgogIGlmICghc2VlZCkKICAgIC8qIEluaXRpYWxpemUgbGluZWFyIGNvbmdydWVudGlhbCBnZW5lcmF0b3IgKi8KICAgIHNlZWQgPSAoY3VycnRpY2tzICgpICsgKigobG9uZyAqKSAmYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSkKCSAgICArICgoc2hvcnQgKikgYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSlbMl0pOwogIC8qIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgTENHIGdpdmVuIGluIEJydWNlIFNjaG5laWVyJ3MKICAgICAiQXBwbGllZCBDcnlwdG9ncmFwaHkiICovCiAgcSA9IHNlZWQgLyA1MzY2ODsKICBpZiAoKHNlZWQgPSA0MDAxNCAqIChzZWVkIC0gNTM2NjggKiBxKSAtIDEyMjExICpxICkgPCAwKQogICAgc2VlZCArPSAyMTQ3NDgzNTYzTDsKICB0bW8gPSAoYmFzZSA8PCBleHApICsgKFRJQ0tTX1BFUl9TRUMgLSAoc2VlZCAvIFRXT19TRUNPTkRfRElWSVNPUikpOwogIHJldHVybiB0bW87Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpDTEVBTlVQIC0gc2h1dCBkb3duIG5ldHdvcmtpbmcKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKY2xlYW51cF9uZXQgKHZvaWQpCnsKICBpZiAobmV0d29ya19yZWFkeSkKICAgIHsKICAgICAgLyogU3RvcCByZWNlaXZpbmcgcGFja2V0cy4gICovCiAgICAgIGV0aF9kaXNhYmxlICgpOwogICAgICBuZXR3b3JrX3JlYWR5ID0gMDsKICAgIH0KfQo=