Ly8KLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNAovLwovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KLy8gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi8vCgp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKCm5hbWVzcGFjZSBEb3RaTGliCnsKCgkvLy8gPHN1bW1hcnk+CgkvLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgY2lyY3VsYXIgYnVmZmVyCgkvLy8gPC9zdW1tYXJ5PgoJaW50ZXJuYWwgY2xhc3MgQ2lyY3VsYXJCdWZmZXIKCXsKICAgICAgICAjcmVnaW9uIFByaXZhdGUgZGF0YQogICAgICAgIHByaXZhdGUgaW50IF9jYXBhY2l0eTsKICAgICAgICBwcml2YXRlIGludCBfaGVhZDsKICAgICAgICBwcml2YXRlIGludCBfdGFpbDsKICAgICAgICBwcml2YXRlIGludCBfc2l6ZTsKICAgICAgICBwcml2YXRlIGJ5dGVbXSBfYnVmZmVyOwogICAgICAgICNlbmRyZWdpb24KCiAgICAgICAgcHVibGljIENpcmN1bGFyQnVmZmVyKGludCBjYXBhY2l0eSkKICAgICAgICB7CiAgICAgICAgICAgIERlYnVnLkFzc2VydCggY2FwYWNpdHkgPiAwICk7CiAgICAgICAgICAgIF9idWZmZXIgPSBuZXcgYnl0ZVtjYXBhY2l0eV07CiAgICAgICAgICAgIF9jYXBhY2l0eSA9IGNhcGFjaXR5OwogICAgICAgICAgICBfaGVhZCA9IDA7CiAgICAgICAgICAgIF90YWlsID0gMDsKICAgICAgICAgICAgX3NpemUgPSAwOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBTaXplIHsgZ2V0IHsgcmV0dXJuIF9zaXplOyB9IH0KCiAgICAgICAgcHVibGljIGludCBQdXQoYnl0ZVtdIHNvdXJjZSwgaW50IG9mZnNldCwgaW50IGNvdW50KQogICAgICAgIHsKICAgICAgICAgICAgRGVidWcuQXNzZXJ0KCBjb3VudCA+IDAgKTsKICAgICAgICAgICAgaW50IHRydWVDb3VudCA9IE1hdGguTWluKGNvdW50LCBfY2FwYWNpdHkgLSBTaXplKTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cnVlQ291bnQ7ICsraSkKICAgICAgICAgICAgICAgIF9idWZmZXJbKF90YWlsK2kpICUgX2NhcGFjaXR5XSA9IHNvdXJjZVtvZmZzZXQraV07CiAgICAgICAgICAgIF90YWlsICs9IHRydWVDb3VudDsKICAgICAgICAgICAgX3RhaWwgJT0gX2NhcGFjaXR5OwogICAgICAgICAgICBfc2l6ZSArPSB0cnVlQ291bnQ7CiAgICAgICAgICAgIHJldHVybiB0cnVlQ291bnQ7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgYm9vbCBQdXQoYnl0ZSBiKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKFNpemUgPT0gX2NhcGFjaXR5KSAvLyBubyByb29tCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIF9idWZmZXJbX3RhaWwrK10gPSBiOwogICAgICAgICAgICBfdGFpbCAlPSBfY2FwYWNpdHk7CiAgICAgICAgICAgICsrX3NpemU7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBHZXQoYnl0ZVtdIGRlc3RpbmF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCiAgICAgICAgewogICAgICAgICAgICBpbnQgdHJ1ZUNvdW50ID0gTWF0aC5NaW4oY291bnQsU2l6ZSk7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJ1ZUNvdW50OyArK2kpCiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbltvZmZzZXQgKyBpXSA9IF9idWZmZXJbKF9oZWFkK2kpICUgX2NhcGFjaXR5XTsKICAgICAgICAgICAgX2hlYWQgKz0gdHJ1ZUNvdW50OwogICAgICAgICAgICBfaGVhZCAlPSBfY2FwYWNpdHk7CiAgICAgICAgICAgIF9zaXplIC09IHRydWVDb3VudDsKICAgICAgICAgICAgcmV0dXJuIHRydWVDb3VudDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBpbnQgR2V0KCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChTaXplID09IDApCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CgogICAgICAgICAgICBpbnQgcmVzdWx0ID0gKGludClfYnVmZmVyW19oZWFkKysgJSBfY2FwYWNpdHldOwogICAgICAgICAgICAtLV9zaXplOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICB9Cn0K