Ly8geyBkZy1kbyBydW4gIH0KLy8gQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgoKLy8gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4KLy8gYmFzZWQgb24gYnVnIHJlcG9ydCBieSBGcmVkcmlrINZocnN0cvZtIDxkOTItZm9oQG5hZGEua3RoLnNlPgoKI2luY2x1ZGUgPGNzdGRsaWI+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IHZiYXNlIHsKICB2aXJ0dWFsIGludCBnZXRfYSgpIGNvbnN0ID0gMDsgLy8geyBkZy1lcnJvciAibm90ZSIgfQp9OwoKc3RydWN0IGJhc2U6IHZpcnR1YWwgdmJhc2UgewogIGludCBhOwogIGJhc2UoaW50IGFhKSA6IGEoYWEpIHt9CiAgaW50IGdldF9hKCkgY29uc3QgeyByZXR1cm4gYTsgfQp9OwoKc3RydWN0IG1pZDogYmFzZSB7CiAgbWlkKGludCBiYikgOiBiYXNlKGJiKSB7CiAgICAvLyB3aGVuIG1pZCBpcyBub3QgaW4gY2hhcmdlIG9mIHZiYXNlIGluaXRpYWxpemF0aW9uLAogICAgLy8gYSBkZXJpdmVkLWF3YXJlIHZ0YWJsZSBpcyBuZWVkZWQgZm9yIHZiYXNlCiAgICBpZiAoKCh2YmFzZSopdGhpcyktPmdldF9hKCkgIT0gYmIpIC8vIHsgZGctZXJyb3IgImNhbGwgdG8gcHVyZSB2aXJ0dWFsIG1lbWJlciIgfQogICAgICBhYm9ydCgpOwogIH0KfTsKCnN0cnVjdCBkZXJpdmVkOiB2aXJ0dWFsIG1pZCB7CiAgZGVyaXZlZChpbnQgY2MpIDogbWlkKGNjKSB7fQp9OwoKaW50IG1haW4gKCkgewogIGRlcml2ZWQoMSk7Cn0K