LyoKICogU2VjdXJpdHkgY2hlY2tzIG9mIGVudmlyb25tZW50CiAqIEFkZGVkIGZyb20gc2hhZG93LXV0aWxzIHBhY2thZ2UKICogYnkgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgogKgogKi8gCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJlbnYuaCIKCmV4dGVybiBjaGFyICoqZW52aXJvbjsKCnN0YXRpYyBjaGFyICogY29uc3QgZm9yYmlkW10gPSB7CiAgICAgICAgIl9STERfPSIsCiAgICAgICAgIkJBU0hfRU5WPSIsICAgIC8qIEdOVSBjcmVlcGluZyBmZWF0dXJpc20gc3RyaWtlcyBhZ2Fpbi4uLiAqLwogICAgICAgICJFTlY9IiwKICAgICAgICAiSE9NRT0iLAogICAgICAgICJJRlM9IiwKICAgICAgICAiS1JCX0NPTkY9IiwKICAgICAgICAiTERfIiwgICAgICAgICAgLyogYW55dGhpbmcgd2l0aCB0aGUgTERfIHByZWZpeCAqLwogICAgICAgICJMSUJQQVRIPSIsCiAgICAgICAgIk1BSUw9IiwKICAgICAgICAiTkxTUEFUSD0iLAogICAgICAgICJQQVRIPSIsCiAgICAgICAgIlNIRUxMPSIsCiAgICAgICAgIlNITElCX1BBVEg9IiwKICAgICAgICAoY2hhciAqKSAwCn07CgovKiB0aGVzZSBhcmUgYWxsb3dlZCwgYnV0IHdpdGggbm8gc2xhc2hlcyBpbnNpZGUKICAgKHRvIHdvcmsgYXJvdW5kIHNlY3VyaXR5IHByb2JsZW1zIGluIEdOVSBnZXR0ZXh0KSAqLwpzdGF0aWMgY2hhciAqIGNvbnN0IG5vc2xhc2hbXSA9IHsKICAgICAgICAiTEFORz0iLAogICAgICAgICJMQU5HVUFHRT0iLAogICAgICAgICJMQ18iLCAgICAgICAgICAvKiBhbnl0aGluZyB3aXRoIHRoZSBMQ18gcHJlZml4ICovCiAgICAgICAgKGNoYXIgKikgMAp9OwoKdm9pZApzYW5pdGl6ZV9lbnYodm9pZCkKewogICAgICAgIGNoYXIgKiplbnZwID0gZW52aXJvbjsKICAgICAgICBjaGFyICogY29uc3QgKmJhZDsKICAgICAgICBjaGFyICoqY3VyOwogICAgICAgIGNoYXIgKiptb3ZlOwoKICAgICAgICBmb3IgKGN1ciA9IGVudnA7ICpjdXI7IGN1cisrKSB7CiAgICAgICAgICAgICAgICBmb3IgKGJhZCA9IGZvcmJpZDsgKmJhZDsgYmFkKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoKmN1ciwgKmJhZCwgc3RybGVuKCpiYWQpKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChtb3ZlID0gY3VyOyAqbW92ZTsgbW92ZSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vdmUgPSAqKG1vdmUgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXItLTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIChjdXIgPSBlbnZwOyAqY3VyOyBjdXIrKykgewogICAgICAgICAgICAgICAgZm9yIChiYWQgPSBub3NsYXNoOyAqYmFkOyBiYWQrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybmNtcCgqY3VyLCAqYmFkLCBzdHJsZW4oKmJhZCkpICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY2hyKCpjdXIsICcvJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAvKiBPSyAqLwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG1vdmUgPSBjdXI7ICptb3ZlOyBtb3ZlKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vdmUgPSAqKG1vdmUgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgY3VyLS07CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KfQoK