Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qIGRtZXNnLmMgLS0gUHJpbnQgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUga2VybmVsIHJpbmcgYnVmZmVyCiAqIENyZWF0ZWQ6IFNhdCBPY3QgIDkgMTY6MTk6NDcgMTk5MwogKiBSZXZpc2VkOiBUaHUgT2N0IDI4IDIxOjUyOjE3IDE5OTMgYnkgZmFpdGhAY3MudW5jLmVkdQogKiBDb3B5cmlnaHQgMTk5MyBUaGVvZG9yZSBUcydvICh0eXRzb0BhdGhlbmEubWl0LmVkdSkKICogVGhpcyBwcm9ncmFtIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4KICogTW9kaWZpY2F0aW9ucyBieSBSaWNrIFNsYWRrZXkgKGpyc0B3b3JsZC5zdGQuY29tKQogKiBMYXJnZXIgYnVmZmVyc2l6ZSAzIEp1bmUgMTk5OCBieSBOaWNvbGFpIExhbmdmZWxkdCwgYmFzZWQgb24gYSBwYXRjaAogKiBieSBQZWV0ZXIgSm9vdC4gIFRoaXMgd2FzIGFsc28gc3VnZ2VzdGVkIGJ5IEpvaG4gSHVkc29uLgogKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNabZraWV3aWN6IDxtaXNpZWtAbWlzaWVrLmV1Lm9yZz4KICogLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAogKgogKiBmcm9tIHV0aWwtbGludXggLS0gYWRhcHRlZCBmb3IgYnVzeWJveCBieSAKICogRXJpayBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4uIEkgcmlwcGVkIG91dCBOYXRpdmUgTGFuZ3VhZ2UgCiAqIFN1cHBvcnQsIHJlcGxhY2VkIGdldG9wdCwgYWRkZWQgc29tZSBnb3RvcyBmb3IgcmVkdW5kYW50IHN0dWZmLgogKi8KCiNpbmNsdWRlICJpbnRlcm5hbC5oIgojaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpZiBfX0dOVV9MSUJSQVJZX18gPCA1CgojaWZuZGVmIF9fYWxwaGFfXwojIGRlZmluZSBfX05SX2tsb2djdGwgX19OUl9zeXNsb2cKc3RhdGljIGlubGluZSBfc3lzY2FsbDMoaW50LCBrbG9nY3RsLCBpbnQsIHR5cGUsIGNoYXIgKiwgYiwgaW50LCBsZW4pOwojZWxzZQkJCQkJCQkvKiBfX2FscGhhX18gKi8KI2RlZmluZSBrbG9nY3RsIHN5c2xvZwojZW5kaWYKCiNlbHNlCiMgaW5jbHVkZSA8c3lzL2tsb2cuaD4KI2VuZGlmCgpzdGF0aWMgY29uc3QgY2hhciBkbWVzZ191c2FnZVtdID0gImRtZXNnIFstY10gWy1uIGxldmVsXSBbLXMgYnVmc2l6ZV1cbiI7CgppbnQgZG1lc2dfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCWNoYXIgKmJ1ZjsKCWludCBidWZzaXplID0gODE5NjsKCWludCBpOwoJaW50IG47CglpbnQgbGV2ZWwgPSAwOwoJaW50IGxhc3RjOwoJaW50IGNtZCA9IDM7CglpbnQgc3RvcERvaW5nVGhhdDsKCglhcmdjLS07Cglhcmd2Kys7CgoJLyogUGFyc2UgYW55IG9wdGlvbnMgKi8KCXdoaWxlIChhcmdjICYmICoqYXJndiA9PSAnLScpIHsKCQlzdG9wRG9pbmdUaGF0ID0gRkFMU0U7CgkJd2hpbGUgKHN0b3BEb2luZ1RoYXQgPT0gRkFMU0UgJiYgKisrKCphcmd2KSkgewoJCQlzd2l0Y2ggKCoqYXJndikgewoJCQljYXNlICdjJzoKCQkJCWNtZCA9IDQ7CgkJCQlicmVhazsKCQkJY2FzZSAnbic6CgkJCQljbWQgPSA4OwoJCQkJaWYgKC0tYXJnYyA9PSAwKQoJCQkJCWdvdG8gZW5kOwoJCQkJbGV2ZWwgPSBhdG9pKCooKythcmd2KSk7CgkJCQlpZiAoLS1hcmdjID4gMCkKCQkJCQkrK2FyZ3Y7CgkJCQlzdG9wRG9pbmdUaGF0ID0gVFJVRTsKCQkJCWJyZWFrOwoJCQljYXNlICdzJzoKCQkJCWlmICgtLWFyZ2MgPT0gMCkKCQkJCQlnb3RvIGVuZDsKCQkJCWJ1ZnNpemUgPSBhdG9pKCooKythcmd2KSk7CgkJCQlpZiAoLS1hcmdjID4gMCkKCQkJCQkrK2FyZ3Y7CgkJCQlzdG9wRG9pbmdUaGF0ID0gVFJVRTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJZ290byBlbmQ7CgkJCX0KCQl9Cgl9CgoJaWYgKGFyZ2MgPiAxKSB7CgkJZ290byBlbmQ7Cgl9CgoJaWYgKGNtZCA9PSA4KSB7CgkJbiA9IGtsb2djdGwoY21kLCBOVUxMLCBsZXZlbCk7CgkJaWYgKG4gPCAwKSB7CgkJCWdvdG8ga2xvZ2N0bF9lcnJvcjsKCQl9CgkJZXhpdChUUlVFKTsKCX0KCglpZiAoYnVmc2l6ZSA8IDQwOTYpCgkJYnVmc2l6ZSA9IDQwOTY7CglidWYgPSAoY2hhciAqKSBtYWxsb2MoYnVmc2l6ZSk7CgluID0ga2xvZ2N0bChjbWQsIGJ1ZiwgYnVmc2l6ZSk7CglpZiAobiA8IDApIHsKCQlnb3RvIGtsb2djdGxfZXJyb3I7Cgl9CgoJbGFzdGMgPSAnXG4nOwoJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewoJCWlmICgoaSA9PSAwIHx8IGJ1ZltpIC0gMV0gPT0gJ1xuJykgJiYgYnVmW2ldID09ICc8JykgewoJCQlpKys7CgkJCXdoaWxlIChidWZbaV0gPj0gJzAnICYmIGJ1ZltpXSA8PSAnOScpCgkJCQlpKys7CgkJCWlmIChidWZbaV0gPT0gJz4nKQoJCQkJaSsrOwoJCX0KCQlsYXN0YyA9IGJ1ZltpXTsKCQlwdXRjaGFyKGxhc3RjKTsKCX0KCWlmIChsYXN0YyAhPSAnXG4nKQoJCXB1dGNoYXIoJ1xuJyk7CglleGl0KFRSVUUpOwogIGVuZDoKCXVzYWdlKGRtZXNnX3VzYWdlKTsKCWV4aXQoRkFMU0UpOwogIGtsb2djdGxfZXJyb3I6CglwZXJyb3IoImtsb2djdGwiKTsKCWV4aXQoRkFMU0UpOwoKfQo=