LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9zcmMvZmNkYmcuYyx2IDEuMTAgMjAwMi8wOC8yMiAxODo1MzoyMiBrZWl0aHAgRXhwICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAiZmNpbnQuaCIKCnZvaWQKRmNWYWx1ZVByaW50IChjb25zdCBGY1ZhbHVlIHYpCnsKICAgIHN3aXRjaCAodi50eXBlKSB7CiAgICBjYXNlIEZjVHlwZVZvaWQ6CglwcmludGYgKCIgPHZvaWQ+Iik7CglicmVhazsKICAgIGNhc2UgRmNUeXBlSW50ZWdlcjoKCXByaW50ZiAoIiAlZChpKSIsIHYudS5pKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVEb3VibGU6CglwcmludGYgKCIgJWcoZikiLCB2LnUuZCk7CglicmVhazsKICAgIGNhc2UgRmNUeXBlU3RyaW5nOgoJcHJpbnRmICgiIFwiJXNcIiIsIHYudS5zKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVCb29sOgoJcHJpbnRmICgiICVzIiwgdi51LmIgPyAiRmNUcnVlIiA6ICJGY0ZhbHNlIik7CglicmVhazsKICAgIGNhc2UgRmNUeXBlTWF0cml4OgoJcHJpbnRmICgiICglZiAlZjsgJWYgJWYpIiwgdi51Lm0tPnh4LCB2LnUubS0+eHksIHYudS5tLT55eCwgdi51Lm0tPnl5KTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVDaGFyU2V0OgkvKiBYWFggKi8KCXByaW50ZiAoIiBzZXQiKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVMYW5nU2V0OgoJcHJpbnRmICgiICIpOwoJRmNMYW5nU2V0UHJpbnQgKHYudS5sKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVGVEZhY2U6CglwcmludGYgKCIgZmFjZSIpOwoJYnJlYWs7CiAgICB9Cn0KCnZvaWQKRmNWYWx1ZUxpc3RQcmludCAoY29uc3QgRmNWYWx1ZUxpc3QgKmwpCnsKICAgIGZvciAoOyBsOyBsID0gbC0+bmV4dCkKICAgIHsKCUZjVmFsdWVQcmludCAobC0+dmFsdWUpOwoJc3dpdGNoIChsLT5iaW5kaW5nKSB7CgljYXNlIEZjVmFsdWVCaW5kaW5nV2VhazoKCSAgICBwcmludGYgKCIodykiKTsKCSAgICBicmVhazsKCWNhc2UgRmNWYWx1ZUJpbmRpbmdTdHJvbmc6CgkgICAgcHJpbnRmICgiKHMpIik7CgkgICAgYnJlYWs7CgljYXNlIEZjVmFsdWVCaW5kaW5nU2FtZToKCSAgICBwcmludGYgKCIoPSkiKTsKCSAgICBicmVhazsKCX0KICAgIH0KfQoKdm9pZApGY0xhbmdTZXRQcmludCAoY29uc3QgRmNMYW5nU2V0ICpscykKewogICAgRmNTdHJCdWYJYnVmOwogICAgRmNDaGFyOAlpbml0X2J1ZlsxMDI0XTsKICAgIAogICAgRmNTdHJCdWZJbml0ICgmYnVmLCBpbml0X2J1Ziwgc2l6ZW9mIChpbml0X2J1ZikpOwogICAgaWYgKEZjTmFtZVVucGFyc2VMYW5nU2V0ICgmYnVmLCBscykgJiYgRmNTdHJCdWZDaGFyICgmYnVmLCdcMCcpKQoJcHJpbnRmICgiJXMiLCBidWYuYnVmKTsKICAgIGVsc2UKCXByaW50ZiAoImxhbmdzZXQgKGFsbG9jIGVycm9yKSIpOwogICAgRmNTdHJCdWZEZXN0cm95ICgmYnVmKTsKfQoKdm9pZApGY1BhdHRlcm5QcmludCAoY29uc3QgRmNQYXR0ZXJuICpwKQp7CiAgICBpbnQJCSAgICBpOwogICAgRmNQYXR0ZXJuRWx0ICAgKmU7CiAgICAKICAgIGlmICghcCkKICAgIHsKCXByaW50ZiAoIk51bGwgcGF0dGVyblxuIik7CglyZXR1cm47CiAgICB9CiAgICBwcmludGYgKCJQYXR0ZXJuICVkIG9mICVkXG4iLCBwLT5udW0sIHAtPnNpemUpOwogICAgZm9yIChpID0gMDsgaSA8IHAtPm51bTsgaSsrKQogICAgewoJZSA9ICZwLT5lbHRzW2ldOwoJcHJpbnRmICgiXHQlczoiLCBlLT5vYmplY3QpOwoJRmNWYWx1ZUxpc3RQcmludCAoZS0+dmFsdWVzKTsKCXByaW50ZiAoIlxuIik7CiAgICB9CiAgICBwcmludGYgKCJcbiIpOwp9Cgp2b2lkCkZjT3BQcmludCAoRmNPcCBvcCkKewogICAgc3dpdGNoIChvcCkgewogICAgY2FzZSBGY09wSW50ZWdlcjogcHJpbnRmICgiSW50ZWdlciIpOyBicmVhazsKICAgIGNhc2UgRmNPcERvdWJsZTogcHJpbnRmICgiRG91YmxlIik7IGJyZWFrOwogICAgY2FzZSBGY09wU3RyaW5nOiBwcmludGYgKCJTdHJpbmciKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BNYXRyaXg6IHByaW50ZiAoIk1hdHJpeCIpOyBicmVhazsKICAgIGNhc2UgRmNPcEJvb2w6IHByaW50ZiAoIkJvb2wiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BDaGFyU2V0OiBwcmludGYgKCJDaGFyU2V0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wRmllbGQ6IHByaW50ZiAoIkZpZWxkIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ29uc3Q6IHByaW50ZiAoIkNvbnN0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wQXNzaWduOiBwcmludGYgKCJBc3NpZ24iKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BBc3NpZ25SZXBsYWNlOiBwcmludGYgKCJBc3NpZ25SZXBsYWNlIik7IGJyZWFrOwogICAgY2FzZSBGY09wUHJlcGVuZDogcHJpbnRmICgiUHJlcGVuZCIpOyBicmVhazsKICAgIGNhc2UgRmNPcFByZXBlbmRGaXJzdDogcHJpbnRmICgiUHJlcGVuZEZpcnN0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wQXBwZW5kOiBwcmludGYgKCJBcHBlbmQiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BBcHBlbmRMYXN0OiBwcmludGYgKCJBcHBlbmRMYXN0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wUXVlc3Q6IHByaW50ZiAoIlF1ZXN0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wT3I6IHByaW50ZiAoIk9yIik7IGJyZWFrOwogICAgY2FzZSBGY09wQW5kOiBwcmludGYgKCJBbmQiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BFcXVhbDogcHJpbnRmICgiRXF1YWwiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BOb3RFcXVhbDogcHJpbnRmICgiTm90RXF1YWwiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BMZXNzOiBwcmludGYgKCJMZXNzIik7IGJyZWFrOwogICAgY2FzZSBGY09wTGVzc0VxdWFsOiBwcmludGYgKCJMZXNzRXF1YWwiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BNb3JlOiBwcmludGYgKCJNb3JlIik7IGJyZWFrOwogICAgY2FzZSBGY09wTW9yZUVxdWFsOiBwcmludGYgKCJNb3JlRXF1YWwiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BDb250YWluczogcHJpbnRmICgiQ29udGFpbnMiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BOb3RDb250YWluczogcHJpbnRmICgiTm90Q29udGFpbnMiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BQbHVzOiBwcmludGYgKCJQbHVzIik7IGJyZWFrOwogICAgY2FzZSBGY09wTWludXM6IHByaW50ZiAoIk1pbnVzIik7IGJyZWFrOwogICAgY2FzZSBGY09wVGltZXM6IHByaW50ZiAoIlRpbWVzIik7IGJyZWFrOwogICAgY2FzZSBGY09wRGl2aWRlOiBwcmludGYgKCJEaXZpZGUiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BOb3Q6IHByaW50ZiAoIk5vdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcE5pbDogcHJpbnRmICgiTmlsIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ29tbWE6IHByaW50ZiAoIkNvbW1hIik7IGJyZWFrOwogICAgY2FzZSBGY09wRmxvb3I6IHByaW50ZiAoIkZsb29yIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ2VpbDogcHJpbnRmICgiQ2VpbCIpOyBicmVhazsKICAgIGNhc2UgRmNPcFJvdW5kOiBwcmludGYgKCJSb3VuZCIpOyBicmVhazsKICAgIGNhc2UgRmNPcFRydW5jOiBwcmludGYgKCJUcnVuYyIpOyBicmVhazsKICAgIGNhc2UgRmNPcExpc3Rpbmc6IHByaW50ZiAoIkxpc3RpbmciKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BJbnZhbGlkOiBwcmludGYgKCJJbnZhbGlkIik7IGJyZWFrOwogICAgfQp9Cgp2b2lkCkZjRXhwclByaW50IChjb25zdCBGY0V4cHIgKmV4cHIpCnsKICAgIGlmICghZXhwcikgcHJpbnRmICgibm9uZSIpOwogICAgZWxzZSBzd2l0Y2ggKGV4cHItPm9wKSB7CiAgICBjYXNlIEZjT3BJbnRlZ2VyOiBwcmludGYgKCIlZCIsIGV4cHItPnUuaXZhbCk7IGJyZWFrOwogICAgY2FzZSBGY09wRG91YmxlOiBwcmludGYgKCIlZyIsIGV4cHItPnUuZHZhbCk7IGJyZWFrOwogICAgY2FzZSBGY09wU3RyaW5nOiBwcmludGYgKCJcIiVzXCIiLCBleHByLT51LnN2YWwpOyBicmVhazsKICAgIGNhc2UgRmNPcE1hdHJpeDogcHJpbnRmICgiWyVnICVnICVnICVnXSIsCgkJCSAgICAgIGV4cHItPnUubXZhbC0+eHgsCgkJCSAgICAgIGV4cHItPnUubXZhbC0+eHksCgkJCSAgICAgIGV4cHItPnUubXZhbC0+eXgsCgkJCSAgICAgIGV4cHItPnUubXZhbC0+eXkpOyBicmVhazsKICAgIGNhc2UgRmNPcEJvb2w6IHByaW50ZiAoIiVzIiwgZXhwci0+dS5idmFsID8gInRydWUiIDogImZhbHNlIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ2hhclNldDogcHJpbnRmICgiY2hhcnNldFxuIik7IGJyZWFrOwogICAgY2FzZSBGY09wTmlsOiBwcmludGYgKCJuaWxcbiIpOyBicmVhazsKICAgIGNhc2UgRmNPcEZpZWxkOiBwcmludGYgKCIlcyIsIGV4cHItPnUuZmllbGQpOyBicmVhazsKICAgIGNhc2UgRmNPcENvbnN0OiBwcmludGYgKCIlcyIsIGV4cHItPnUuY29uc3RhbnQpOyBicmVhazsKICAgIGNhc2UgRmNPcFF1ZXN0OgoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5sZWZ0KTsKCXByaW50ZiAoIiBxdWVzdCAiKTsKCUZjRXhwclByaW50IChleHByLT51LnRyZWUucmlnaHQtPnUudHJlZS5sZWZ0KTsKCXByaW50ZiAoIiBjb2xvbiAiKTsKCUZjRXhwclByaW50IChleHByLT51LnRyZWUucmlnaHQtPnUudHJlZS5yaWdodCk7CglicmVhazsKICAgIGNhc2UgRmNPcEFzc2lnbjoKICAgIGNhc2UgRmNPcEFzc2lnblJlcGxhY2U6CiAgICBjYXNlIEZjT3BQcmVwZW5kRmlyc3Q6CiAgICBjYXNlIEZjT3BQcmVwZW5kOgogICAgY2FzZSBGY09wQXBwZW5kOgogICAgY2FzZSBGY09wQXBwZW5kTGFzdDoKICAgIGNhc2UgRmNPcE9yOgogICAgY2FzZSBGY09wQW5kOgogICAgY2FzZSBGY09wRXF1YWw6CiAgICBjYXNlIEZjT3BOb3RFcXVhbDoKICAgIGNhc2UgRmNPcExlc3M6CiAgICBjYXNlIEZjT3BMZXNzRXF1YWw6CiAgICBjYXNlIEZjT3BNb3JlOgogICAgY2FzZSBGY09wTW9yZUVxdWFsOgogICAgY2FzZSBGY09wQ29udGFpbnM6CiAgICBjYXNlIEZjT3BMaXN0aW5nOgogICAgY2FzZSBGY09wTm90Q29udGFpbnM6CiAgICBjYXNlIEZjT3BQbHVzOgogICAgY2FzZSBGY09wTWludXM6CiAgICBjYXNlIEZjT3BUaW1lczoKICAgIGNhc2UgRmNPcERpdmlkZToKICAgIGNhc2UgRmNPcENvbW1hOgoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5sZWZ0KTsKCXByaW50ZiAoIiAiKTsKCXN3aXRjaCAoZXhwci0+b3ApIHsKCWNhc2UgRmNPcEFzc2lnbjogcHJpbnRmICgiQXNzaWduIik7IGJyZWFrOwoJY2FzZSBGY09wQXNzaWduUmVwbGFjZTogcHJpbnRmICgiQXNzaWduUmVwbGFjZSIpOyBicmVhazsKCWNhc2UgRmNPcFByZXBlbmRGaXJzdDogcHJpbnRmICgiUHJlcGVuZEZpcnN0Iik7IGJyZWFrOwoJY2FzZSBGY09wUHJlcGVuZDogcHJpbnRmICgiUHJlcGVuZCIpOyBicmVhazsKCWNhc2UgRmNPcEFwcGVuZDogcHJpbnRmICgiQXBwZW5kIik7IGJyZWFrOwoJY2FzZSBGY09wQXBwZW5kTGFzdDogcHJpbnRmICgiQXBwZW5kTGFzdCIpOyBicmVhazsKCWNhc2UgRmNPcE9yOiBwcmludGYgKCJPciIpOyBicmVhazsKCWNhc2UgRmNPcEFuZDogcHJpbnRmICgiQW5kIik7IGJyZWFrOwoJY2FzZSBGY09wRXF1YWw6IHByaW50ZiAoIkVxdWFsIik7IGJyZWFrOwoJY2FzZSBGY09wTm90RXF1YWw6IHByaW50ZiAoIk5vdEVxdWFsIik7IGJyZWFrOwoJY2FzZSBGY09wTGVzczogcHJpbnRmICgiTGVzcyIpOyBicmVhazsKCWNhc2UgRmNPcExlc3NFcXVhbDogcHJpbnRmICgiTGVzc0VxdWFsIik7IGJyZWFrOwoJY2FzZSBGY09wTW9yZTogcHJpbnRmICgiTW9yZSIpOyBicmVhazsKCWNhc2UgRmNPcE1vcmVFcXVhbDogcHJpbnRmICgiTW9yZUVxdWFsIik7IGJyZWFrOwoJY2FzZSBGY09wQ29udGFpbnM6IHByaW50ZiAoIkNvbnRhaW5zIik7IGJyZWFrOwoJY2FzZSBGY09wTGlzdGluZzogcHJpbnRmICgiTGlzdGluZyIpOyBicmVhazsKCWNhc2UgRmNPcE5vdENvbnRhaW5zOiBwcmludGYgKCJOb3RDb250YWlucyIpOyBicmVhazsKCWNhc2UgRmNPcFBsdXM6IHByaW50ZiAoIlBsdXMiKTsgYnJlYWs7CgljYXNlIEZjT3BNaW51czogcHJpbnRmICgiTWludXMiKTsgYnJlYWs7CgljYXNlIEZjT3BUaW1lczogcHJpbnRmICgiVGltZXMiKTsgYnJlYWs7CgljYXNlIEZjT3BEaXZpZGU6IHByaW50ZiAoIkRpdmlkZSIpOyBicmVhazsKCWNhc2UgRmNPcENvbW1hOiBwcmludGYgKCJDb21tYSIpOyBicmVhazsKCWRlZmF1bHQ6IGJyZWFrOwoJfQoJcHJpbnRmICgiICIpOwoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5yaWdodCk7CglicmVhazsKICAgIGNhc2UgRmNPcE5vdDoKCXByaW50ZiAoIk5vdCAiKTsKCUZjRXhwclByaW50IChleHByLT51LnRyZWUubGVmdCk7CglicmVhazsKICAgIGNhc2UgRmNPcEZsb29yOgoJcHJpbnRmICgiRmxvb3IgIik7CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLmxlZnQpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BDZWlsOgoJcHJpbnRmICgiQ2VpbCAiKTsKCUZjRXhwclByaW50IChleHByLT51LnRyZWUubGVmdCk7CglicmVhazsKICAgIGNhc2UgRmNPcFJvdW5kOgoJcHJpbnRmICgiUm91bmQgIik7CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLmxlZnQpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BUcnVuYzoKCXByaW50ZiAoIlRydW5jICIpOwoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5sZWZ0KTsKCWJyZWFrOwogICAgY2FzZSBGY09wSW52YWxpZDogcHJpbnRmICgiSW52YWxpZCIpOyBicmVhazsKICAgIH0KfQoKdm9pZApGY1Rlc3RQcmludCAoY29uc3QgRmNUZXN0ICp0ZXN0KQp7CiAgICBzd2l0Y2ggKHRlc3QtPmtpbmQpIHsKICAgIGNhc2UgRmNNYXRjaFBhdHRlcm46CglwcmludGYgKCJwYXR0ZXJuICIpOwoJYnJlYWs7CiAgICBjYXNlIEZjTWF0Y2hGb250OgoJcHJpbnRmICgiZm9udCAiKTsKCWJyZWFrOwogICAgfQogICAgc3dpdGNoICh0ZXN0LT5xdWFsKSB7CiAgICBjYXNlIEZjUXVhbEFueToKCXByaW50ZiAoImFueSAiKTsKCWJyZWFrOwogICAgY2FzZSBGY1F1YWxBbGw6CglwcmludGYgKCJhbGwgIik7CglicmVhazsKICAgIGNhc2UgRmNRdWFsRmlyc3Q6CglwcmludGYgKCJmaXJzdCAiKTsKCWJyZWFrOwogICAgY2FzZSBGY1F1YWxOb3RGaXJzdDoKCXByaW50ZiAoIm5vdF9maXJzdCAiKTsKCWJyZWFrOwogICAgfQogICAgcHJpbnRmICgiJXMgIiwgdGVzdC0+ZmllbGQpOwogICAgRmNPcFByaW50ICh0ZXN0LT5vcCk7CiAgICBwcmludGYgKCIgIik7CiAgICBGY0V4cHJQcmludCAodGVzdC0+ZXhwcik7CiAgICBwcmludGYgKCJcbiIpOwp9Cgp2b2lkCkZjRWRpdFByaW50IChjb25zdCBGY0VkaXQgKmVkaXQpCnsKICAgIHByaW50ZiAoIkVkaXQgJXMgIiwgZWRpdC0+ZmllbGQpOwogICAgRmNPcFByaW50IChlZGl0LT5vcCk7CiAgICBwcmludGYgKCIgIik7CiAgICBGY0V4cHJQcmludCAoZWRpdC0+ZXhwcik7Cn0KCnZvaWQKRmNTdWJzdFByaW50IChjb25zdCBGY1N1YnN0ICpzdWJzdCkKewogICAgRmNFZGl0CSplOwogICAgRmNUZXN0CSp0OwogICAgCiAgICBwcmludGYgKCJtYXRjaFxuIik7CiAgICBmb3IgKHQgPSBzdWJzdC0+dGVzdDsgdDsgdCA9IHQtPm5leHQpCiAgICB7CglwcmludGYgKCJcdCIpOwoJRmNUZXN0UHJpbnQgKHQpOwogICAgfQogICAgcHJpbnRmICgiZWRpdFxuIik7CiAgICBmb3IgKGUgPSBzdWJzdC0+ZWRpdDsgZTsgZSA9IGUtPm5leHQpCiAgICB7CglwcmludGYgKCJcdCIpOwoJRmNFZGl0UHJpbnQgKGUpOwoJcHJpbnRmICgiO1xuIik7CiAgICB9CiAgICBwcmludGYgKCJcbiIpOwp9Cgp2b2lkCkZjRm9udFNldFByaW50IChjb25zdCBGY0ZvbnRTZXQgKnMpCnsKICAgIGludAkgICAgaTsKCiAgICBwcmludGYgKCJGb250U2V0ICVkIG9mICVkXG4iLCBzLT5uZm9udCwgcy0+c2ZvbnQpOwogICAgZm9yIChpID0gMDsgaSA8IHMtPm5mb250OyBpKyspCiAgICB7CglwcmludGYgKCJGb250ICVkICIsIGkpOwoJRmNQYXR0ZXJuUHJpbnQgKHMtPmZvbnRzW2ldKTsKICAgIH0KfQoKaW50CkZjRGVidWcgKHZvaWQpCnsKICAgIHN0YXRpYyBpbnQgIGluaXRpYWxpemVkOwogICAgc3RhdGljIGludCAgZGVidWc7CgogICAgaWYgKCFpbml0aWFsaXplZCkKICAgIHsKCWNoYXIgICAgKmU7CgoJaW5pdGlhbGl6ZWQgPSAxOwoJZSA9IGdldGVudiAoIkZDX0RFQlVHIik7CglpZiAoZSkKCXsKCSAgICBwcmludGYgKCJGQ19ERUJVRz0lc1xuIiwgZSk7CgkgICAgZGVidWcgPSBhdG9pIChlKTsKCSAgICBpZiAoZGVidWcgPCAwKQoJCWRlYnVnID0gMDsKCX0KICAgIH0KICAgIHJldHVybiBkZWJ1ZzsKfQo=