Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qIGRtZXNnLmMgLS0gUHJpbnQgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUga2VybmVsIHJpbmcgYnVmZmVyCiAqIENyZWF0ZWQ6IFNhdCBPY3QgIDkgMTY6MTk6NDcgMTk5MwogKiBSZXZpc2VkOiBUaHUgT2N0IDI4IDIxOjUyOjE3IDE5OTMgYnkgZmFpdGhAY3MudW5jLmVkdQogKiBDb3B5cmlnaHQgMTk5MyBUaGVvZG9yZSBUcydvICh0eXRzb0BhdGhlbmEubWl0LmVkdSkKICogVGhpcyBwcm9ncmFtIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4KICogTW9kaWZpY2F0aW9ucyBieSBSaWNrIFNsYWRrZXkgKGpyc0B3b3JsZC5zdGQuY29tKQogKiBMYXJnZXIgYnVmZmVyc2l6ZSAzIEp1bmUgMTk5OCBieSBOaWNvbGFpIExhbmdmZWxkdCwgYmFzZWQgb24gYSBwYXRjaAogKiBieSBQZWV0ZXIgSm9vdC4gIFRoaXMgd2FzIGFsc28gc3VnZ2VzdGVkIGJ5IEpvaG4gSHVkc29uLgogKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNabZraWV3aWN6IDxtaXNpZWtAbWlzaWVrLmV1Lm9yZz4KICogLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAogKgogKiBmcm9tIHV0aWwtbGludXggLS0gYWRhcHRlZCBmb3IgYnVzeWJveCBieSAKICogRXJpayBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4uIEkgcmlwcGVkIG91dCBOYXRpdmUgTGFuZ3VhZ2UgCiAqIFN1cHBvcnQsIHJlcGxhY2VkIGdldG9wdCwgYWRkZWQgc29tZSBnb3RvcyBmb3IgcmVkdW5kYW50IHN0dWZmLgogKi8KCiNpbmNsdWRlICJpbnRlcm5hbC5oIgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2lmIF9fR05VX0xJQlJBUllfXyA8IDUKCiNpZm5kZWYgX19hbHBoYV9fCiMgZGVmaW5lIF9fTlJfa2xvZ2N0bCBfX05SX3N5c2xvZwpzdGF0aWMgaW5saW5lIF9zeXNjYWxsMyhpbnQsIGtsb2djdGwsIGludCwgdHlwZSwgY2hhciAqLCBiLCBpbnQsIGxlbik7CiNlbHNlCQkJCQkJCS8qIF9fYWxwaGFfXyAqLwojZGVmaW5lIGtsb2djdGwgc3lzbG9nCiNlbmRpZgoKI2Vsc2UKIyBpbmNsdWRlIDxzeXMva2xvZy5oPgojZW5kaWYKCnN0YXRpYyBjb25zdCBjaGFyIGRtZXNnX3VzYWdlW10gPSAiZG1lc2cgWy1jXSBbLW4gTEVWRUxdIFstcyBTSVpFXVxuIgojaWZuZGVmIEJCX0ZFQVRVUkVfVFJJVklBTF9IRUxQCgkiXG5QcmludHMgb3IgY29udHJvbHMgdGhlIGtlcm5lbCByaW5nIGJ1ZmZlclxuXG4iCgkiT3B0aW9uczpcbiIKCSJcdC1jXHRcdENsZWFycyB0aGUgcmluZyBidWZmZXIncyBjb250ZW50cyBhZnRlciBwcmludGluZ1xuIgoJIlx0LW4gTEVWRUxcdFNldHMgY29uc29sZSBsb2dnaW5nIGxldmVsXG4iCgkiXHQtcyBTSVpFXHRcdFVzZSBhIGJ1ZmZlciBvZiBzaXplIFNJWkVcbiIKI2VuZGlmCgk7CgppbnQgZG1lc2dfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCWNoYXIgKmJ1ZjsKCWludCBidWZzaXplID0gODE5NjsKCWludCBpOwoJaW50IG47CglpbnQgbGV2ZWwgPSAwOwoJaW50IGxhc3RjOwoJaW50IGNtZCA9IDM7CglpbnQgc3RvcERvaW5nVGhhdDsKCglhcmdjLS07Cglhcmd2Kys7CgoJLyogUGFyc2UgYW55IG9wdGlvbnMgKi8KCXdoaWxlIChhcmdjICYmICoqYXJndiA9PSAnLScpIHsKCQlzdG9wRG9pbmdUaGF0ID0gRkFMU0U7CgkJd2hpbGUgKHN0b3BEb2luZ1RoYXQgPT0gRkFMU0UgJiYgKisrKCphcmd2KSkgewoJCQlzd2l0Y2ggKCoqYXJndikgewoJCQljYXNlICdjJzoKCQkJCWNtZCA9IDQ7CgkJCQlicmVhazsKCQkJY2FzZSAnbic6CgkJCQljbWQgPSA4OwoJCQkJaWYgKC0tYXJnYyA9PSAwKQoJCQkJCWdvdG8gZW5kOwoJCQkJbGV2ZWwgPSBhdG9pKCooKythcmd2KSk7CgkJCQlpZiAoLS1hcmdjID4gMCkKCQkJCQkrK2FyZ3Y7CgkJCQlzdG9wRG9pbmdUaGF0ID0gVFJVRTsKCQkJCWJyZWFrOwoJCQljYXNlICdzJzoKCQkJCWlmICgtLWFyZ2MgPT0gMCkKCQkJCQlnb3RvIGVuZDsKCQkJCWJ1ZnNpemUgPSBhdG9pKCooKythcmd2KSk7CgkJCQlpZiAoLS1hcmdjID4gMCkKCQkJCQkrK2FyZ3Y7CgkJCQlzdG9wRG9pbmdUaGF0ID0gVFJVRTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJZ290byBlbmQ7CgkJCX0KCQl9Cgl9CgoJaWYgKGFyZ2MgPiAxKSB7CgkJZ290byBlbmQ7Cgl9CgoJaWYgKGNtZCA9PSA4KSB7CgkJbiA9IGtsb2djdGwoY21kLCBOVUxMLCBsZXZlbCk7CgkJaWYgKG4gPCAwKSB7CgkJCWdvdG8ga2xvZ2N0bF9lcnJvcjsKCQl9CgkJZXhpdChUUlVFKTsKCX0KCglpZiAoYnVmc2l6ZSA8IDQwOTYpCgkJYnVmc2l6ZSA9IDQwOTY7CglidWYgPSAoY2hhciAqKSB4bWFsbG9jKGJ1ZnNpemUpOwoJbiA9IGtsb2djdGwoY21kLCBidWYsIGJ1ZnNpemUpOwoJaWYgKG4gPCAwKSB7CgkJZ290byBrbG9nY3RsX2Vycm9yOwoJfQoKCWxhc3RjID0gJ1xuJzsKCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKCQlpZiAoKGkgPT0gMCB8fCBidWZbaSAtIDFdID09ICdcbicpICYmIGJ1ZltpXSA9PSAnPCcpIHsKCQkJaSsrOwoJCQl3aGlsZSAoYnVmW2ldID49ICcwJyAmJiBidWZbaV0gPD0gJzknKQoJCQkJaSsrOwoJCQlpZiAoYnVmW2ldID09ICc+JykKCQkJCWkrKzsKCQl9CgkJbGFzdGMgPSBidWZbaV07CgkJcHV0Y2hhcihsYXN0Yyk7Cgl9CglpZiAobGFzdGMgIT0gJ1xuJykKCQlwdXRjaGFyKCdcbicpOwoJZXhpdChUUlVFKTsKICBlbmQ6Cgl1c2FnZShkbWVzZ191c2FnZSk7CglleGl0KEZBTFNFKTsKICBrbG9nY3RsX2Vycm9yOgoJcGVycm9yKCJrbG9nY3RsIik7CglyZXR1cm4oRkFMU0UpOwp9Cg==