Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIE1pbmkgbG9hZGttYXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKICoKICogQ29weXJpZ2h0IChDKSAyMDA3IExv72MgR3JlbmnpIDxsb2ljLmdyZW5pZUBnbWFpbC5jb20+CiAqICAgd3JpdHRlbiB1c2luZyBBbmRyaWVzIEJyb3V3ZXIgPGFlYkBjd2kubmw+J3Mga2JkX21vZGUgZnJvbQogKiAgIGNvbnNvbGUtdXRpbHMgdjAuMi4zLCBsaWNlbnNlZCB1bmRlciBHTlUgR1BMdjIKICoKICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyB0YXJiYWxsIGZvciBkZXRhaWxzLgogKgogKi8KCiNpbmNsdWRlICJsaWJiYi5oIgojaW5jbHVkZSA8bGludXgva2QuaD4KCmludCBrYmRfbW9kZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CmludCBrYmRfbW9kZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJc3RhdGljIGNvbnN0IGNoYXIgb3B0c1tdID0gInNha3UiOwoKCWNvbnN0IGNoYXIgKm9wdCA9IGFyZ3ZbMV07Cgljb25zdCBjaGFyICpwOwoJaW50IGZkOwoKCWZkID0gZ2V0X2NvbnNvbGVfZmQoKTsKCWlmIChmZCA8IDApIC8qIGdldF9jb25zb2xlX2ZkKCkgYWxyZWFkeSBjb21wbGFpbmVkICovCgkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKCglpZiAob3B0ID09IE5VTEwpIHsKCQkvKiBObyBhcmcgKi8KCQljb25zdCBjaGFyICptc2cgPSAidW5rbm93biI7CgkJaW50IG1vZGU7CgoJCWlvY3RsKGZkLCBLREdLQk1PREUsICZtb2RlKTsKCQlzd2l0Y2gobW9kZSkgewoJCWNhc2UgS19SQVc6CgkJCW1zZyA9ICJyYXcgKHNjYW5jb2RlKSI7CgkJCWJyZWFrOwoJCWNhc2UgS19YTEFURToKCQkJbXNnID0gImRlZmF1bHQgKEFTQ0lJKSI7CgkJCWJyZWFrOwoJCWNhc2UgS19NRURJVU1SQVc6CgkJCW1zZyA9ICJtZWRpdW1yYXcgKGtleWNvZGUpIjsKCQkJYnJlYWs7CgkJY2FzZSBLX1VOSUNPREU6CgkJCW1zZyA9ICJVbmljb2RlIChVVEYtOCkiOwoJCQlicmVhazsKCQl9CgkJcHJpbnRmKCJUaGUga2V5Ym9hcmQgaXMgaW4gJXMgbW9kZVxuIiwgbXNnKTsKCX0KCWVsc2UgaWYgKGFyZ2MgPiAyIC8qIG1vcmUgdGhhbiAxIGFyZyAqLwoJIHx8ICpvcHQgIT0gJy0nIC8qIG5vdCBhbiBvcHRpb24gKi8KCSB8fCAocCA9IHN0cmNocihvcHRzLCBvcHRbMV0pKSA9PSBOVUxMIC8qIG5vdCBhbiBvcHRpb24gd2UgZXhwZWN0ICovCgkgfHwgb3B0WzJdICE9ICdcMCcgLyogbW9yZSB0aGFuIG9uZSBvcHRpb24gY2hhciAqLwoJKSB7CgkJYmJfc2hvd191c2FnZSgpOwoJCS8qIHJldHVybiBFWElUX0ZBSUxVUkU7IC0gbm90IHJlYWNoZWQgKi8KCX0KCWVsc2UgewojaWYgS19SQVcgIT0gMCB8fCBLX1hMQVRFICE9IDEgfHwgS19NRURJVU1SQVcgIT0gMiB8fCBLX1VOSUNPREUgIT0gMwojZXJyb3Iga2JkX21vZGUgbXVzdCBiZSBjaGFuZ2VkCiNlbmRpZgoJCS8qIFRoZSBvcHRpb25zIGFyZSBpbiB0aGUgb3JkZXIgb2YgdGhlIHZhcmlvdXMgS194eHggKi8KCQlpb2N0bChmZCwgS0RTS0JNT0RFLCBwIC0gb3B0cyk7Cgl9CgoJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQoJCWNsb3NlKGZkKTsKCXJldHVybiBFWElUX1NVQ0NFU1M7Cn0K