LyoKICogRE9TIFZpcnR1YWwgTWFjaGluZQogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICovCgojaWZkZWYgbGludXgKCi8qIGFwcGFyZW50bHkgRUxGIGltYWdlcyBhcmUgdXN1YWxseSBsb2FkZWQgaGlnaCBhbnl3YXkgKi8KI2lmbmRlZiBfX0VMRl9fCi8qIGlmIG5vdCwgZm9yY2UgZG9zbW9kIGF0IGhpZ2ggYWRkcmVzc2VzICovCmFzbSgiLm9yZyAweDExMDAwMCIpOwojZW5kaWYgX19FTEZfXwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxzeXMvdm04Ni5oPgojaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgojaW5jbHVkZSA8c3lzL3dhaXQuaD4KCi8qIEZJWE1FOiBoYWNrIGJlY2F1c2UgbGliYyB2bTg2IG1heSBiZSB0aGUgb2xkIHN5c2NhbGwgdmVyc2lvbiAqLwpzdGF0aWMgX19pbmxpbmVfXyBpbnQgdm04NnBsdXMoIGludCBmdW5jLCBzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0ICpwdHIgKQp7CiAgICBpbnQgcmVzOwojaWZkZWYgX19QSUNfXwogICAgX19hc21fXyBfX3ZvbGF0aWxlX18oICJwdXNobCAlJWVieFxuXHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmwgJTIsJSVlYnhcblx0IgogICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgJDB4ODBcblx0IgogICAgICAgICAgICAgICAgICAgICAgICAgICJwb3BsICUlZWJ4IgogICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1hIiAocmVzKQogICAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiIChTWVNfdm04NiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZyIgKGZ1bmMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImMiIChwdHIpICk7CiNlbHNlCiAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW50ICQweDgwIgogICAgICAgICAgICAgICAgICAgICAgICAgOiAiPWEiIChyZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIiAoU1lTX3ZtODYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYiIgKGZ1bmMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYyIgKHB0cikgKTsKI2VuZGlmICAvKiBfX1BJQ19fICovCiAgICBpZiAocmVzID49IDApIHJldHVybiByZXM7CiAgICBlcnJubyA9IC1yZXM7CiAgICByZXR1cm4gLTE7Cn0KCmludCBtYWluKGludCBhcmdjLGNoYXIqKmFyZ3YpCnsKIGludCBtZmQ9b3Blbihhcmd2WzBdLE9fUkRXUik7CiB2b2lkKmltZzsKIHN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgVk04NjsKIGludCBmdW5jLHJldDsKIG9mZl90IGZvZnM9MDsKIHBpZF90IHBwaWQ9Z2V0cHBpZCgpOwogCi8qIGZwcmludGYoc3RkZXJyLCJtYWluIGlzIGF0ICUwOGx4LCBmaWxlIGlzICVzLCBmZD0lZFxuIiwodW5zaWduZWQgbG9uZykmbWFpbixhcmd2WzBdLG1mZCk7ICovCiBpZiAobWZkPDApIHJldHVybiAxOwovKiBNYXAgaW4gb3VyIERPUyBpbWFnZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHByb2Nlc3MgYWRkcmVzcyBzcGFjZSAqLwogaWYgKGFyZ3ZbMV0pIHsKICAvKiBVbHJpY2ggV2VpZ2FuZCBzdWdnZXN0ZWQgbWFwcGluZyBpbiB0aGUgRE9TIGltYWdlIGRpcmVjdGx5IGZyb20gdGhlIFdpbmUKICAgICBhZGRyZXNzIHNwYWNlICovCiAgZm9mcz1hdG9sKGFyZ3ZbMV0pOwogIC8qIGxpbnV4IGN1cnJlbnRseSBvbmx5IGFsbG93cyBtYXBwaW5nIGEgcHJvY2VzcyBtZW1vcnkgaWYgaXQncyBiZWluZyBwdHJhY2VkICovCiAgLyogTGludXMgZG9lc24ndCBsaWtlIGl0LCBzbyB0aGlzIHByb2JhYmx5IHdvbid0IHdvcmsgaW4gdGhlIGZ1dHVyZSAqLwogIC8qIGl0IGRvZXNuJ3QgZXZlbiB3b3JrIGZvciBtZSByaWdodCBub3cgKi8KICBwdHJhY2UoUFRSQUNFX0FUVEFDSCxwcGlkLDAsMCk7CiAga2lsbChwcGlkLFNJR1NUT1ApOwogIHdhaXRwaWQocHBpZCxOVUxMLDApOwogfQogaW1nPW1tYXAoTlVMTCwweDExMDAwMCxQUk9UX0VYRUN8UFJPVF9SRUFEfFBST1RfV1JJVEUsTUFQX0ZJWEVEfE1BUF9TSEFSRUQsbWZkLGZvZnMpOwogaWYgKGFyZ3ZbMV0pIHsKICBwdHJhY2UoUFRSQUNFX0RFVEFDSCxwcGlkLDAsMCk7CiAga2lsbChwcGlkLFNJR0NPTlQpOwogfQogaWYgKGltZz09KHZvaWQqKS0xKSB7CiAgZnByaW50ZihzdGRlcnIsIkRPUyBtZW1vcnkgbWFwIGZhaWxlZCwgZXJyb3I9JXNcbiIsc3RyZXJyb3IoZXJybm8pKTsKICBmcHJpbnRmKHN0ZGVyciwiaW4gYXR0ZW1wdCB0byBtYXAgJXMsIG9mZnNldCAlMDhsWCwgbGVuZ3RoIDExMDAwMCwgdG8gb2Zmc2V0IDBcbiIsYXJndlswXSxmb2ZzKTsKICByZXR1cm4gMTsKIH0KLyogZnByaW50ZihzdGRlcnIsIlN1Y2Nlc3NmdWxseSBtYXBwZWQgRE9TIG1lbW9yeSwgZW50ZXJpbmcgdm04NiBsb29wXG4iKTsgKi8KLyogcmVwb3J0IGJhY2sgdG8gdGhlIG1haW4gcHJvZ3JhbSB0aGF0IHdlJ3JlIHJlYWR5ICovCiByZXQ9MDsKIHdyaXRlKDEsJnJldCxzaXplb2YocmV0KSk7Ci8qIGNvbnRleHQgZXhjaGFuZ2UgbG9vcCAqLwogZG8gewogIGlmIChyZWFkKDAsJmZ1bmMsc2l6ZW9mKGZ1bmMpKSE9c2l6ZW9mKGZ1bmMpKSByZXR1cm4gMTsKICBpZiAocmVhZCgwLCZWTTg2LHNpemVvZihWTTg2KSkhPXNpemVvZihWTTg2KSkgcmV0dXJuIDE7CiAgaWYgKGZ1bmM8MCkgYnJlYWs7CiAgcmV0PXZtODZwbHVzKGZ1bmMsJlZNODYpOwogIGlmICh3cml0ZSgxLCZyZXQsc2l6ZW9mKHJldCkpIT1zaXplb2YocmV0KSkgcmV0dXJuIDE7CiAgaWYgKHdyaXRlKDEsJlZNODYsc2l6ZW9mKFZNODYpKSE9c2l6ZW9mKFZNODYpKSByZXR1cm4gMTsKIH0gd2hpbGUgKDEpOwogcmV0dXJuIDA7Cn0KCiNlbHNlIC8qICFsaW51eCAqLwppbnQgbWFpbih2b2lkKSB7cmV0dXJuIDE7fQojZW5kaWYK