LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvZGVidWdfaGFuZGxlci5oPgoKLyoqIEBkZWZncm91cCBkZWJ1ZyBkZWJ1ZwogKiAgUHJpbnQgb3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGFuZGxlciBjaGFpbiBiZWluZyBjYWxsZWQuCiAqICBUaGlzIGlzIGEgdXNlZnVsIG1vZHVsZSBmb3IgcnVuLXRpbWUKICogIGRlYnVnZ2luZyBvZiByZXF1ZXN0cyBhcyB0aGUgcGFzcyB0aGlzIGhhbmRsZXIgaW4gYSBjYWxsaW5nIGNoYWluLgogKiAgQWxsIGRlYnVnZ2luZyBvdXRwdXQgaXMgZG9uZSB2aWEgdGhlIHN0YW5kYXJkIGRlYnVnZ2luZyByb3V0aW5lcwogKiAgd2l0aCBhIHRva2VuIG5hbWUgb2YgImhlbHBlcjpkZWJ1ZyIsIHNvIHVzZSB0aGUgLURoZWxwZXI6ZGVidWcKICogIGNvbW1hbmQgbGluZSBmbGFnIHRvIHNlZSB0aGUgb3V0cHV0IHdoZW4gcnVubmluZyB0aGUgc25tcGQKICogIGRlbW9uLiBJdCdzIG5vdCByZWNvbW1lbmRlZCB5b3UgY29tcGlsZSB0aGlzIGludG8gYSBoYW5kbGVyIGNoYWluCiAqICBkdXJpbmcgY29tcGlsZSB0aW1lLCBidXQgaW5zdGVhZCB1c2UgdGhlICJpbmplY3RIYW5kbGVyIiB0b2tlbiBpbgogKiAgdGhlIHNubXBkLmNvbmYgZmlsZSAob3Igc2ltaWxhcikgdG8gYWRkIGl0IHRvIHRoZSBjaGFpbiBsYXRlcjoKICoKICogICAgIGluamVjdEhhbmRsZXIgZGVidWcgbXlfbW9kdWxlX25hbWUKICoKICogIHRvIHNlZSBhbiBleGFtcGxlIG91dHB1dCwgdHJ5OgogKgogKiAgICAgaW5qZWN0SGFuZGxlciBkZWJ1ZyBtaWJJSS9zeXN0ZW0KICoKICogIGFuZCB0aGVuIHJ1biBzbm1wd2FsayBvbiB0aGUgInN5c3RlbSIgZ3JvdXAuCiAqCiAqICBAaW5ncm91cCB1dGlsaXRpZXMKICogIEB7CiAqLwoKLyoqIHJldHVybnMgYSBkZWJ1ZyBoYW5kbGVyIHRoYXQgY2FuIGJlIGluamVjdGVkIGludG8gYSBnaXZlbgogKiAgaGFuZGxlciBjaGFpbi4KICovCm5ldHNubXBfbWliX2hhbmRsZXIgKgpuZXRzbm1wX2dldF9kZWJ1Z19oYW5kbGVyKHZvaWQpCnsKICAgIHJldHVybiBuZXRzbm1wX2NyZWF0ZV9oYW5kbGVyKCJkZWJ1ZyIsIG5ldHNubXBfZGVidWdfaGVscGVyKTsKfQoKLyoqIEBpbnRlcm5hbCBkZWJ1ZyBwcmludCB2YXJpYWJsZXMgaW4gYSBjaGFpbiAqLwp2b2lkCmRlYnVnX3ByaW50X3JlcXVlc3RzKG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0cykKewogICAgbmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3Q7CgogICAgZm9yIChyZXF1ZXN0ID0gcmVxdWVzdHM7IHJlcXVlc3Q7IHJlcXVlc3QgPSByZXF1ZXN0LT5uZXh0KSB7CiAgICAgICAgREVCVUdNU0dUTCgoImhlbHBlcjpkZWJ1ZyIsICIgICAgICAjJTJkOiAiLCByZXF1ZXN0LT5pbmRleCkpOwogICAgICAgIERFQlVHTVNHVkFSKCgiaGVscGVyOmRlYnVnIiwgcmVxdWVzdC0+cmVxdWVzdHZiKSk7CiAgICAgICAgREVCVUdNU0coKCJoZWxwZXI6ZGVidWciLCAiXG4iKSk7CgogICAgICAgIGlmIChyZXF1ZXN0LT5wcm9jZXNzZWQpCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICAgICAgICBbcHJvY2Vzc2VkXVxuIikpOwogICAgICAgIGlmIChyZXF1ZXN0LT5kZWxlZ2F0ZWQpCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICAgICAgICBbZGVsZWdhdGVkXVxuIikpOwogICAgICAgIGlmIChyZXF1ZXN0LT5zdGF0dXMpCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICAgICAgICBbc3RhdHVzID0gJWRdXG4iLAogICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMpKTsKICAgICAgICBpZiAocmVxdWVzdC0+cGFyZW50X2RhdGEpIHsKICAgICAgICAgICAgbmV0c25tcF9kYXRhX2xpc3QgKmxzdDsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImhlbHBlcjpkZWJ1ZyIsICIgICAgICAgIFtwYXJlbnQgZGF0YSA9IikpOwogICAgICAgICAgICBmb3IgKGxzdCA9IHJlcXVlc3QtPnBhcmVudF9kYXRhOyBsc3Q7IGxzdCA9IGxzdC0+bmV4dCkgewogICAgICAgICAgICAgICAgREVCVUdNU0coKCJoZWxwZXI6ZGVidWciLCAiICVzIiwgbHN0LT5uYW1lKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdNU0coKCJoZWxwZXI6ZGVidWciLCAiXVxuIikpOwogICAgICAgIH0KICAgIH0KfQoKCi8qKiBAaW50ZXJuYWwgSW1wbGVtZW50cyB0aGUgZGVidWcgaGFuZGxlciAqLwppbnQKbmV0c25tcF9kZWJ1Z19oZWxwZXIobmV0c25tcF9taWJfaGFuZGxlciAqaGFuZGxlciwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8gKnJlcWluZm8sCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0cykKewoKICAgIG5ldHNubXBfbWliX2hhbmRsZXIgKmhwdHI7CiAgICBpbnQgICAgICAgICAgICAgaSwgcmV0LCBjb3VudDsKICAgIGNoYXIgICAgICAgICAgICpjcDsKCiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIkVudGVyaW5nIERlYnVnZ2luZyBIZWxwZXI6XG4iKSk7CiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgSGFuZGxlciBSZWdpc3RyYXRpb24gSW5mbzpcbiIpKTsKICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICAgIE5hbWU6ICAgICAgICAlc1xuIiwKICAgICAgICAgICAgICAgIHJlZ2luZm8tPmhhbmRsZXJOYW1lKSk7CiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgICBDb250ZXh0OiAgICAgJXNcbiIsCiAgICAgICAgICAgICAgICBTTk1QX1NUUk9STlVMTChyZWdpbmZvLT5jb250ZXh0TmFtZSkpKTsKICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICAgIEJhc2UgT0lEOiAgICAiKSk7CiAgICBERUJVR01TR09JRCgoImhlbHBlcjpkZWJ1ZyIsIHJlZ2luZm8tPnJvb3RvaWQsIHJlZ2luZm8tPnJvb3RvaWRfbGVuKSk7CiAgICBERUJVR01TRygoImhlbHBlcjpkZWJ1ZyIsICJcbiIpKTsKCiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgICBNb2RlczogICAgICAgMHgleCA9ICIsCiAgICAgICAgICAgICAgICByZWdpbmZvLT5tb2RlcykpOwogICAgZm9yIChjb3VudCA9IDAsIGkgPSByZWdpbmZvLT5tb2RlczsgaTsgaSA9IGkgPj4gMSwgY291bnQrKykgewogICAgICAgIGlmIChpICYgMHgwMSkgewogICAgICAgICAgICBjcCA9IHNlX2ZpbmRfbGFiZWxfaW5fc2xpc3QoImhhbmRsZXJfY2FuX21vZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxIDw8IGNvdW50KTsKICAgICAgICAgICAgREVCVUdNU0coKCJoZWxwZXI6ZGVidWciLCAiJXMgfCAiLCBTTk1QX1NUUk9STlVMTChjcCkpKTsKICAgICAgICB9CiAgICB9CiAgICBERUJVR01TRygoImhlbHBlcjpkZWJ1ZyIsICJcbiIpKTsKCiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgICBQcmlvcml0eTogICAgJWRcbiIsCiAgICAgICAgICAgICAgICByZWdpbmZvLT5wcmlvcml0eSkpOwoKICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICBIYW5kbGVyIENhbGxpbmcgQ2hhaW46XG4iKSk7CiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgICIpKTsKICAgIGZvciAoaHB0ciA9IHJlZ2luZm8tPmhhbmRsZXI7IGhwdHI7IGhwdHIgPSBocHRyLT5uZXh0KSB7CiAgICAgICAgREVCVUdNU0coKCJoZWxwZXI6ZGVidWciLCAiIC0+ICVzIiwgaHB0ci0+aGFuZGxlcl9uYW1lKSk7CiAgICAgICAgaWYgKGhwdHItPm15dm9pZCkKICAgICAgICAgICAgREVCVUdNU0coKCJoZWxwZXI6ZGVidWciLCAiIFtteXZvaWQgPSAleF0iLCBocHRyLT5teXZvaWQpKTsKICAgIH0KICAgIERFQlVHTVNHKCgiaGVscGVyOmRlYnVnIiwgIlxuIikpOwoKICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICBSZXF1ZXN0IGluZm9ybWF0aW9uOlxuIikpOwogICAgREVCVUdNU0dUTCgoImhlbHBlcjpkZWJ1ZyIsICIgICAgTW9kZTogICAgICAgICVzICglZCA9IDB4JXgpXG4iLAogICAgICAgICAgICAgICAgc2VfZmluZF9sYWJlbF9pbl9zbGlzdCgiYWdlbnRfbW9kZSIsIHJlcWluZm8tPm1vZGUpLAogICAgICAgICAgICAgICAgcmVxaW5mby0+bW9kZSwgcmVxaW5mby0+bW9kZSkpOwogICAgREVCVUdNU0dUTCgoImhlbHBlcjpkZWJ1ZyIsICIgICAgUmVxdWVzdCBWYXJpYWJsZXM6XG4iKSk7CiAgICBkZWJ1Z19wcmludF9yZXF1ZXN0cyhyZXF1ZXN0cyk7CgogICAgREVCVUdNU0dUTCgoImhlbHBlcjpkZWJ1ZyIsICIgIC0tLSBjYWxsaW5nIG5leHQgaGFuZGxlciAtLS0gXG4iKSk7CiAgICByZXQgPSBuZXRzbm1wX2NhbGxfbmV4dF9oYW5kbGVyKGhhbmRsZXIsIHJlZ2luZm8sIHJlcWluZm8sIHJlcXVlc3RzKTsKCiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgUmVzdWx0czpcbiIpKTsKICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICAgIFJldHVybmVkIGNvZGU6ICVkXG4iLCByZXQpKTsKICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICAgIFJldHVybmVkIFZhcmlhYmxlczpcbiIpKTsKICAgIGRlYnVnX3ByaW50X3JlcXVlc3RzKHJlcXVlc3RzKTsKCiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIkV4aXRpbmcgRGVidWdnaW5nIEhlbHBlcjpcbiIpKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKiBpbml0aWFsaXplcyB0aGUgZGVidWcgaGVscGVyIHdoaWNoIHRoZW4gcmVnaXN0ZXJzIGEgZGVidWcKICogIGhhbmRsZXIgYXMgYSBydW4tdGltZSBpbmplY3RhYmxlIGhhbmRsZXIgZm9yIGNvbmZpZ3VyYXRpb24gZmlsZQogKiAgdXNlLgogKi8Kdm9pZApuZXRzbm1wX2luaXRfZGVidWdfaGVscGVyKHZvaWQpCnsKICAgIG5ldHNubXBfcmVnaXN0ZXJfaGFuZGxlcl9ieV9uYW1lKCJkZWJ1ZyIsIG5ldHNubXBfZ2V0X2RlYnVnX2hhbmRsZXIoKSk7Cn0KLyoqICBAfSAqLwoK