Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRnVuY3Rpb24uY2MKLy8KLy8gQ29weXJpZ2h0IDIwMDEtMjAwMyBHbHlwaCAmIENvZywgTExDCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4LTIwMTAsIDIwMTMtMjAxNSBBbGJlcnQgQXN0YWxzIENpZCA8YWFjaWRAa2RlLm9yZz4KLy8gQ29weXJpZ2h0IChDKSAyMDA2IEplZmYgTXVpemVsYWFyIDxqZWZmQGluZmlkaWdtLm5ldD4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDExIEFuZHJlYSBDYW5jaWFuaSA8cmFubWE0MkBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMiBUaG9tYXMgRnJlaXRhZyA8VGhvbWFzLkZyZWl0YWdAYWxmYS5kZT4KLy8gQ29weXJpZ2h0IChDKSAyMDEyIEFkYW0gUmVpY2hvbGQgPGFkYW1yZWljaG9sZEBteW9wZXJhLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDEzIEZhYmlvIEQnVXJzbyA8ZmFiaW9kdXJzb0Bob3RtYWlsLml0PgovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaW5jbHVkZSA8Y29uZmlnLmg+CgojaWZkZWYgVVNFX0dDQ19QUkFHTUFTCiNwcmFnbWEgaW1wbGVtZW50YXRpb24KI2VuZGlmCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlICJnb28vZ21lbS5oIgojaW5jbHVkZSAiZ29vL2dzdHJ0b2QuaCIKI2luY2x1ZGUgIk9iamVjdC5oIgojaW5jbHVkZSAiRGljdC5oIgojaW5jbHVkZSAiU3RyZWFtLmgiCiNpbmNsdWRlICJFcnJvci5oIgojaW5jbHVkZSAiRnVuY3Rpb24uaCIKCiNpZm5kZWYgTV9QSQojZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgojZW5kaWYKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGdW5jdGlvbjo6RnVuY3Rpb24oKSB7Cn0KCkZ1bmN0aW9uOjp+RnVuY3Rpb24oKSB7Cn0KCkZ1bmN0aW9uICpGdW5jdGlvbjo6cGFyc2UoT2JqZWN0ICpmdW5jT2JqKSB7CiAgc3RkOjpzZXQ8aW50PiB1c2VkUGFyZW50czsKICByZXR1cm4gcGFyc2UoZnVuY09iaiwgJnVzZWRQYXJlbnRzKTsKfQoKRnVuY3Rpb24gKkZ1bmN0aW9uOjpwYXJzZShPYmplY3QgKmZ1bmNPYmosIHN0ZDo6c2V0PGludD4gKnVzZWRQYXJlbnRzKSB7CiAgRnVuY3Rpb24gKmZ1bmM7CiAgRGljdCAqZGljdDsKICBpbnQgZnVuY1R5cGU7CiAgT2JqZWN0IG9iajE7CgogIGlmIChmdW5jT2JqLT5pc1N0cmVhbSgpKSB7CiAgICBkaWN0ID0gZnVuY09iai0+c3RyZWFtR2V0RGljdCgpOwogIH0gZWxzZSBpZiAoZnVuY09iai0+aXNEaWN0KCkpIHsKICAgIGRpY3QgPSBmdW5jT2JqLT5nZXREaWN0KCk7CiAgfSBlbHNlIGlmIChmdW5jT2JqLT5pc05hbWUoIklkZW50aXR5IikpIHsKICAgIHJldHVybiBuZXcgSWRlbnRpdHlGdW5jdGlvbigpOwogIH0gZWxzZSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJFeHBlY3RlZCBmdW5jdGlvbiBkaWN0aW9uYXJ5IG9yIHN0cmVhbSIpOwogICAgcmV0dXJuIE5VTEw7CiAgfQoKICBpZiAoIWRpY3QtPmxvb2t1cCgiRnVuY3Rpb25UeXBlIiwgJm9iajEpLT5pc0ludCgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbiB0eXBlIGlzIG1pc3Npbmcgb3Igd3JvbmcgdHlwZSIpOwogICAgb2JqMS5mcmVlKCk7CiAgICByZXR1cm4gTlVMTDsKICB9CiAgZnVuY1R5cGUgPSBvYmoxLmdldEludCgpOwogIG9iajEuZnJlZSgpOwoKICBpZiAoZnVuY1R5cGUgPT0gMCkgewogICAgZnVuYyA9IG5ldyBTYW1wbGVkRnVuY3Rpb24oZnVuY09iaiwgZGljdCk7CiAgfSBlbHNlIGlmIChmdW5jVHlwZSA9PSAyKSB7CiAgICBmdW5jID0gbmV3IEV4cG9uZW50aWFsRnVuY3Rpb24oZnVuY09iaiwgZGljdCk7CiAgfSBlbHNlIGlmIChmdW5jVHlwZSA9PSAzKSB7CiAgICBmdW5jID0gbmV3IFN0aXRjaGluZ0Z1bmN0aW9uKGZ1bmNPYmosIGRpY3QsIHVzZWRQYXJlbnRzKTsKICB9IGVsc2UgaWYgKGZ1bmNUeXBlID09IDQpIHsKICAgIGZ1bmMgPSBuZXcgUG9zdFNjcmlwdEZ1bmN0aW9uKGZ1bmNPYmosIGRpY3QpOwogIH0gZWxzZSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJVbmltcGxlbWVudGVkIGZ1bmN0aW9uIHR5cGUgKHswOmR9KSIsIGZ1bmNUeXBlKTsKICAgIHJldHVybiBOVUxMOwogIH0KICBpZiAoIWZ1bmMtPmlzT2soKSkgewogICAgZGVsZXRlIGZ1bmM7CiAgICByZXR1cm4gTlVMTDsKICB9CgogIHJldHVybiBmdW5jOwp9CgpGdW5jdGlvbjo6RnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gKmZ1bmMpIHsKICAgIG0gPSBmdW5jLT5tOwogICAgbiA9IGZ1bmMtPm47CgogICAgbWVtY3B5KGRvbWFpbiwgZnVuYy0+ZG9tYWluLCBmdW5jTWF4SW5wdXRzICogMiAqIHNpemVvZihkb3VibGUpKTsKICAgIG1lbWNweShyYW5nZSwgZnVuYy0+cmFuZ2UsIGZ1bmNNYXhPdXRwdXRzICogMiAqIHNpemVvZihkb3VibGUpKTsKCiAgICBoYXNSYW5nZSA9IGZ1bmMtPmhhc1JhbmdlOwp9CgpHQm9vbCBGdW5jdGlvbjo6aW5pdChEaWN0ICpkaWN0KSB7CiAgT2JqZWN0IG9iajEsIG9iajI7CiAgaW50IGk7CgogIC8vLS0tLS0gRG9tYWluCiAgaWYgKCFkaWN0LT5sb29rdXAoIkRvbWFpbiIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbiBpcyBtaXNzaW5nIGRvbWFpbiIpOwogICAgZ290byBlcnIyOwogIH0KICBtID0gb2JqMS5hcnJheUdldExlbmd0aCgpIC8gMjsKICBpZiAobSA+IGZ1bmNNYXhJbnB1dHMpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9ucyB3aXRoIG1vcmUgdGhhbiB7MDpkfSBpbnB1dHMgYXJlIHVuc3VwcG9ydGVkIiwKCSAgZnVuY01heElucHV0cyk7CiAgICBnb3RvIGVycjI7CiAgfQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIG9iajEuYXJyYXlHZXQoMippLCAmb2JqMik7CiAgICBpZiAoIW9iajIuaXNOdW0oKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGRvbWFpbiBhcnJheSIpOwogICAgICBnb3RvIGVycjE7CiAgICB9CiAgICBkb21haW5baV1bMF0gPSBvYmoyLmdldE51bSgpOwogICAgb2JqMi5mcmVlKCk7CiAgICBvYmoxLmFycmF5R2V0KDIqaSsxLCAmb2JqMik7CiAgICBpZiAoIW9iajIuaXNOdW0oKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGRvbWFpbiBhcnJheSIpOwogICAgICBnb3RvIGVycjE7CiAgICB9CiAgICBkb21haW5baV1bMV0gPSBvYmoyLmdldE51bSgpOwogICAgb2JqMi5mcmVlKCk7CiAgfQogIG9iajEuZnJlZSgpOwoKICAvLy0tLS0tIFJhbmdlCiAgaGFzUmFuZ2UgPSBnRmFsc2U7CiAgbiA9IDA7CiAgaWYgKGRpY3QtPmxvb2t1cCgiUmFuZ2UiLCAmb2JqMSktPmlzQXJyYXkoKSkgewogICAgaGFzUmFuZ2UgPSBnVHJ1ZTsKICAgIG4gPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgLyAyOwogICAgaWYgKG4gPiBmdW5jTWF4T3V0cHV0cykgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gezA6ZH0gb3V0cHV0cyBhcmUgdW5zdXBwb3J0ZWQiLAoJICAgIGZ1bmNNYXhPdXRwdXRzKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvYmoxLmFycmF5R2V0KDIqaSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiByYW5nZSBhcnJheSIpOwoJZ290byBlcnIxOwogICAgICB9CiAgICAgIHJhbmdlW2ldWzBdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICAgIG9iajEuYXJyYXlHZXQoMippKzEsICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gcmFuZ2UgYXJyYXkiKTsKCWdvdG8gZXJyMTsKICAgICAgfQogICAgICByYW5nZVtpXVsxXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgfQogIH0KICBvYmoxLmZyZWUoKTsKCiAgcmV0dXJuIGdUcnVlOwoKIGVycjE6CiAgb2JqMi5mcmVlKCk7CiBlcnIyOgogIG9iajEuZnJlZSgpOwogIHJldHVybiBnRmFsc2U7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIElkZW50aXR5RnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklkZW50aXR5RnVuY3Rpb246OklkZW50aXR5RnVuY3Rpb24oKSB7CiAgaW50IGk7CgogIC8vIGZpbGwgdGhlc2UgaW4gd2l0aCBhcmJpdHJhcnkgdmFsdWVzIGp1c3QgaW4gY2FzZSB0aGV5IGdldCB1c2VkCiAgLy8gc29tZXdoZXJlCiAgbSA9IGZ1bmNNYXhJbnB1dHM7CiAgbiA9IGZ1bmNNYXhPdXRwdXRzOwogIGZvciAoaSA9IDA7IGkgPCBmdW5jTWF4SW5wdXRzOyArK2kpIHsKICAgIGRvbWFpbltpXVswXSA9IDA7CiAgICBkb21haW5baV1bMV0gPSAxOwogIH0KICBoYXNSYW5nZSA9IGdGYWxzZTsKfQoKSWRlbnRpdHlGdW5jdGlvbjo6fklkZW50aXR5RnVuY3Rpb24oKSB7Cn0KCnZvaWQgSWRlbnRpdHlGdW5jdGlvbjo6dHJhbnNmb3JtKGRvdWJsZSAqaW4sIGRvdWJsZSAqb3V0KSB7CiAgaW50IGk7CgogIGZvciAoaSA9IDA7IGkgPCBmdW5jTWF4T3V0cHV0czsgKytpKSB7CiAgICBvdXRbaV0gPSBpbltpXTsKICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNhbXBsZWRGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU2FtcGxlZEZ1bmN0aW9uOjpTYW1wbGVkRnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0KSB7CiAgU3RyZWFtICpzdHI7CiAgaW50IHNhbXBsZUJpdHM7CiAgZG91YmxlIHNhbXBsZU11bDsKICBPYmplY3Qgb2JqMSwgb2JqMjsKICBHdWludCBidWYsIGJpdE1hc2s7CiAgaW50IGJpdHM7CiAgR3VpbnQgczsKICBkb3VibGUgaW5bZnVuY01heElucHV0c107CiAgaW50IGksIGosIHQsIGJpdCwgaWR4OwoKICBpZHhPZmZzZXQgPSBOVUxMOwogIHNhbXBsZXMgPSBOVUxMOwogIHNCdWYgPSBOVUxMOwogIG9rID0gZ0ZhbHNlOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIGdvdG8gZXJyMTsKICB9CiAgaWYgKCFoYXNSYW5nZSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSAwIGZ1bmN0aW9uIGlzIG1pc3NpbmcgcmFuZ2UiKTsKICAgIGdvdG8gZXJyMTsKICB9CiAgaWYgKG0gPiBzYW1wbGVkRnVuY01heElucHV0cykgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU2FtcGxlZCBmdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gezA6ZH0gaW5wdXRzIGFyZSB1bnN1cHBvcnRlZCIsCgkgIHNhbXBsZWRGdW5jTWF4SW5wdXRzKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gYnVmZmVyCiAgc0J1ZiA9IChkb3VibGUgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihkb3VibGUpKTsKCiAgLy8tLS0tLSBnZXQgdGhlIHN0cmVhbQogIGlmICghZnVuY09iai0+aXNTdHJlYW0oKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSAwIGZ1bmN0aW9uIGlzbid0IGEgc3RyZWFtIik7CiAgICBnb3RvIGVycjE7CiAgfQogIHN0ciA9IGZ1bmNPYmotPmdldFN0cmVhbSgpOwoKICAvLy0tLS0tIFNpemUKICBpZiAoIWRpY3QtPmxvb2t1cCgiU2l6ZSIsICZvYmoxKS0+aXNBcnJheSgpIHx8CiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSAhPSBtKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbiBoYXMgbWlzc2luZyBvciBpbnZhbGlkIHNpemUgYXJyYXkiKTsKICAgIGdvdG8gZXJyMjsKICB9CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgb2JqMS5hcnJheUdldChpLCAmb2JqMik7CiAgICBpZiAoIW9iajIuaXNJbnQoKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIHNpemUgYXJyYXkiKTsKICAgICAgZ290byBlcnIzOwogICAgfQogICAgc2FtcGxlU2l6ZVtpXSA9IG9iajIuZ2V0SW50KCk7CiAgICBpZiAoc2FtcGxlU2l6ZVtpXSA8PSAwKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgbm9uLXBvc2l0aXZlIHZhbHVlIGluIGZ1bmN0aW9uIHNpemUgYXJyYXkiKTsKICAgICAgZ290byBlcnIzOwogICAgfQogICAgb2JqMi5mcmVlKCk7CiAgfQogIG9iajEuZnJlZSgpOwogIGlkeE9mZnNldCA9IChpbnQgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihpbnQpKTsKICBmb3IgKGkgPSAwOyBpIDwgKDE8PG0pOyArK2kpIHsKICAgIGlkeCA9IDA7CiAgICBmb3IgKGogPSBtIC0gMSwgdCA9IGk7IGogPj0gMTsgLS1qLCB0IDw8PSAxKSB7CiAgICAgIGlmIChzYW1wbGVTaXplW2pdID09IDEpIHsKCWJpdCA9IDA7CiAgICAgIH0gZWxzZSB7CgliaXQgPSAodCA+PiAobSAtIDEpKSAmIDE7CiAgICAgIH0KICAgICAgaWR4ID0gKGlkeCArIGJpdCkgKiBzYW1wbGVTaXplW2otMV07CiAgICB9CiAgICBpZiAoc2FtcGxlU2l6ZVswXSA9PSAxKSB7CiAgICAgIGJpdCA9IDA7CiAgICB9IGVsc2UgewogICAgICBiaXQgPSAodCA+PiAobSAtIDEpKSAmIDE7CiAgICB9CiAgICBpZHhPZmZzZXRbaV0gPSAoaWR4ICsgYml0KSAqIG47CiAgfQoKICAvLy0tLS0tIEJpdHNQZXJTYW1wbGUKICBpZiAoIWRpY3QtPmxvb2t1cCgiQml0c1BlclNhbXBsZSIsICZvYmoxKS0+aXNJbnQoKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBCaXRzUGVyU2FtcGxlIik7CiAgICBnb3RvIGVycjI7CiAgfQogIHNhbXBsZUJpdHMgPSBvYmoxLmdldEludCgpOwogIHNhbXBsZU11bCA9IDEuMCAvIChwb3coMi4wLCAoZG91YmxlKXNhbXBsZUJpdHMpIC0gMSk7CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gRW5jb2RlCiAgaWYgKGRpY3QtPmxvb2t1cCgiRW5jb2RlIiwgJm9iajEpLT5pc0FycmF5KCkgJiYKICAgICAgb2JqMS5hcnJheUdldExlbmd0aCgpID09IDIqbSkgewogICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgICBvYmoxLmFycmF5R2V0KDIqaSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBlbmNvZGUgYXJyYXkiKTsKCWdvdG8gZXJyMzsKICAgICAgfQogICAgICBlbmNvZGVbaV1bMF0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgICAgb2JqMS5hcnJheUdldCgyKmkrMSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBlbmNvZGUgYXJyYXkiKTsKCWdvdG8gZXJyMzsKICAgICAgfQogICAgICBlbmNvZGVbaV1bMV0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgIH0KICB9IGVsc2UgewogICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgICBlbmNvZGVbaV1bMF0gPSAwOwogICAgICBlbmNvZGVbaV1bMV0gPSBzYW1wbGVTaXplW2ldIC0gMTsKICAgIH0KICB9CiAgb2JqMS5mcmVlKCk7CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaW5wdXRNdWxbaV0gPSAoZW5jb2RlW2ldWzFdIC0gZW5jb2RlW2ldWzBdKSAvCiAgICAgICAgICAgICAgICAgIChkb21haW5baV1bMV0gLSBkb21haW5baV1bMF0pOwogIH0KCiAgLy8tLS0tLSBEZWNvZGUKICBpZiAoZGljdC0+bG9va3VwKCJEZWNvZGUiLCAmb2JqMSktPmlzQXJyYXkoKSAmJgogICAgICBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgPT0gMipuKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG9iajEuYXJyYXlHZXQoMippLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGRlY29kZSBhcnJheSIpOwoJZ290byBlcnIzOwogICAgICB9CiAgICAgIGRlY29kZVtpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgICBvYmoxLmFycmF5R2V0KDIqaSsxLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGRlY29kZSBhcnJheSIpOwoJZ290byBlcnIzOwogICAgICB9CiAgICAgIGRlY29kZVtpXVsxXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGRlY29kZVtpXVswXSA9IHJhbmdlW2ldWzBdOwogICAgICBkZWNvZGVbaV1bMV0gPSByYW5nZVtpXVsxXTsKICAgIH0KICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gc2FtcGxlcwogIG5TYW1wbGVzID0gbjsKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKQogICAgblNhbXBsZXMgKj0gc2FtcGxlU2l6ZVtpXTsKICBzYW1wbGVzID0gKGRvdWJsZSAqKWdtYWxsb2NuKG5TYW1wbGVzLCBzaXplb2YoZG91YmxlKSk7CiAgYnVmID0gMDsKICBiaXRzID0gMDsKICBiaXRNYXNrID0gKDEgPDwgc2FtcGxlQml0cykgLSAxOwogIHN0ci0+cmVzZXQoKTsKICBmb3IgKGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgaWYgKHNhbXBsZUJpdHMgPT0gOCkgewogICAgICBzID0gc3RyLT5nZXRDaGFyKCk7CiAgICB9IGVsc2UgaWYgKHNhbXBsZUJpdHMgPT0gMTYpIHsKICAgICAgcyA9IHN0ci0+Z2V0Q2hhcigpOwogICAgICBzID0gKHMgPDwgOCkgKyBzdHItPmdldENoYXIoKTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlQml0cyA9PSAzMikgewogICAgICBzID0gc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgICBzID0gKHMgPDwgOCkgKyBzdHItPmdldENoYXIoKTsKICAgICAgcyA9IChzIDw8IDgpICsgc3RyLT5nZXRDaGFyKCk7CiAgICB9IGVsc2UgewogICAgICB3aGlsZSAoYml0cyA8IHNhbXBsZUJpdHMpIHsKCWJ1ZiA9IChidWYgPDwgOCkgfCAoc3RyLT5nZXRDaGFyKCkgJiAweGZmKTsKCWJpdHMgKz0gODsKICAgICAgfQogICAgICBzID0gKGJ1ZiA+PiAoYml0cyAtIHNhbXBsZUJpdHMpKSAmIGJpdE1hc2s7CiAgICAgIGJpdHMgLT0gc2FtcGxlQml0czsKICAgIH0KICAgIHNhbXBsZXNbaV0gPSAoZG91YmxlKXMgKiBzYW1wbGVNdWw7CiAgfQogIHN0ci0+Y2xvc2UoKTsKCiAgLy8gc2V0IHVwIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGluW2ldID0gZG9tYWluW2ldWzBdOwogICAgY2FjaGVJbltpXSA9IGluW2ldIC0gMTsKICB9CiAgdHJhbnNmb3JtKGluLCBjYWNoZU91dCk7CgogIG9rID0gZ1RydWU7CiAgcmV0dXJuOwoKIGVycjM6CiAgb2JqMi5mcmVlKCk7CiBlcnIyOgogIG9iajEuZnJlZSgpOwogZXJyMToKICByZXR1cm47Cn0KClNhbXBsZWRGdW5jdGlvbjo6flNhbXBsZWRGdW5jdGlvbigpIHsKICBpZiAoaWR4T2Zmc2V0KSB7CiAgICBnZnJlZShpZHhPZmZzZXQpOwogIH0KICBpZiAoc2FtcGxlcykgewogICAgZ2ZyZWUoc2FtcGxlcyk7CiAgfQogIGlmIChzQnVmKSB7CiAgICBnZnJlZShzQnVmKTsKICB9Cn0KClNhbXBsZWRGdW5jdGlvbjo6U2FtcGxlZEZ1bmN0aW9uKGNvbnN0IFNhbXBsZWRGdW5jdGlvbiAqZnVuYykgOiBGdW5jdGlvbihmdW5jKSB7CiAgbWVtY3B5KHNhbXBsZVNpemUsIGZ1bmMtPnNhbXBsZVNpemUsIGZ1bmNNYXhJbnB1dHMgKiBzaXplb2YoaW50KSk7CgogIG1lbWNweShlbmNvZGUsIGZ1bmMtPmVuY29kZSwgZnVuY01heElucHV0cyAqIDIgKiBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGRlY29kZSwgZnVuYy0+ZGVjb2RlLCBmdW5jTWF4T3V0cHV0cyAqIDIgKiBzaXplb2YoZG91YmxlKSk7CgogIG1lbWNweShpbnB1dE11bCwgZnVuYy0+aW5wdXRNdWwsIGZ1bmNNYXhJbnB1dHMgKiBzaXplb2YoZG91YmxlKSk7CgogIG5TYW1wbGVzID0gZnVuYy0+blNhbXBsZXM7CgogIGlkeE9mZnNldCA9IChpbnQgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihpbnQpKTsKICBtZW1jcHkoaWR4T2Zmc2V0LCBmdW5jLT5pZHhPZmZzZXQsICgxIDw8IG0pICogKGludClzaXplb2YoaW50KSk7CgogIHNhbXBsZXMgPSAoZG91YmxlICopZ21hbGxvY24oblNhbXBsZXMsIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoc2FtcGxlcywgZnVuYy0+c2FtcGxlcywgblNhbXBsZXMgKiBzaXplb2YoZG91YmxlKSk7CgogIHNCdWYgPSAoZG91YmxlICopZ21hbGxvY24oMSA8PCBtLCBzaXplb2YoZG91YmxlKSk7CgogIG1lbWNweShjYWNoZUluLCBmdW5jLT5jYWNoZUluLCBmdW5jTWF4SW5wdXRzICogc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShjYWNoZU91dCwgZnVuYy0+Y2FjaGVPdXQsIGZ1bmNNYXhPdXRwdXRzICogc2l6ZW9mKGRvdWJsZSkpOwoKICBvayA9IGZ1bmMtPm9rOwp9Cgp2b2lkIFNhbXBsZWRGdW5jdGlvbjo6dHJhbnNmb3JtKGRvdWJsZSAqaW4sIGRvdWJsZSAqb3V0KSB7CiAgZG91YmxlIHg7CiAgaW50IGVbZnVuY01heElucHV0c107CiAgZG91YmxlIGVmcmFjMFtmdW5jTWF4SW5wdXRzXTsKICBkb3VibGUgZWZyYWMxW2Z1bmNNYXhJbnB1dHNdOwogIGludCBpLCBqLCBrLCBpZHgwLCB0OwoKICAvLyBjaGVjayB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpZiAoaW5baV0gIT0gY2FjaGVJbltpXSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGkgPT0gbSkgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvdXRbaV0gPSBjYWNoZU91dFtpXTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIC8vIG1hcCBpbnB1dCB2YWx1ZXMgaW50byBzYW1wbGUgYXJyYXkKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICB4ID0gKGluW2ldIC0gZG9tYWluW2ldWzBdKSAqIGlucHV0TXVsW2ldICsgZW5jb2RlW2ldWzBdOwogICAgaWYgKHggPCAwIHx8IHggIT0geCkgeyAgLy8geCE9eCBpcyBhIG1vcmUgcG9ydGFibGUgdmVyc2lvbiBvZiBpc25hbih4KQogICAgICB4ID0gMDsKICAgIH0gZWxzZSBpZiAoeCA+IHNhbXBsZVNpemVbaV0gLSAxKSB7CiAgICAgIHggPSBzYW1wbGVTaXplW2ldIC0gMTsKICAgIH0KICAgIGVbaV0gPSAoaW50KXg7CiAgICBpZiAoZVtpXSA9PSBzYW1wbGVTaXplW2ldIC0gMSAmJiBzYW1wbGVTaXplW2ldID4gMSkgewogICAgICAvLyB0aGlzIGhhcHBlbnMgaWYgaW5baV0gPSBkb21haW5baV1bMV0KICAgICAgZVtpXSA9IHNhbXBsZVNpemVbaV0gLSAyOwogICAgfQogICAgZWZyYWMxW2ldID0geCAtIGVbaV07CiAgICBlZnJhYzBbaV0gPSAxIC0gZWZyYWMxW2ldOwogIH0KCiAgLy8gY29tcHV0ZSBpbmRleCBmb3IgdGhlIGZpcnN0IHNhbXBsZSB0byBiZSB1c2VkCiAgaWR4MCA9IDA7CiAgZm9yIChrID0gbSAtIDE7IGsgPj0gMTsgLS1rKSB7CiAgICBpZHgwID0gKGlkeDAgKyBlW2tdKSAqIHNhbXBsZVNpemVbay0xXTsKICB9CiAgaWR4MCA9IChpZHgwICsgZVswXSkgKiBuOwoKICAvLyBmb3IgZWFjaCBvdXRwdXQsIGRvIG0tbGluZWFyIGludGVycG9sYXRpb24KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CgogICAgLy8gcHVsbCAyXm0gdmFsdWVzIG91dCBvZiB0aGUgc2FtcGxlIGFycmF5CiAgICBmb3IgKGogPSAwOyBqIDwgKDE8PG0pOyArK2opIHsKICAgICAgaW50IGlkeCA9IGlkeDAgKyBpZHhPZmZzZXRbal0gKyBpOwogICAgICBpZiAobGlrZWx5KGlkeCA+PSAwICYmIGlkeCA8IG5TYW1wbGVzKSkgewogICAgICAgIHNCdWZbal0gPSBzYW1wbGVzW2lkeF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc0J1ZltqXSA9IDA7IC8vIFRPRE8gSW52ZXN0aWdhdGUgaWYgdGhpcyBpcyB3aGF0IEFkb2JlIGRvZXMKICAgICAgfQogICAgfQoKICAgIC8vIGRvIG0gc2V0cyBvZiBpbnRlcnBvbGF0aW9ucwogICAgZm9yIChqID0gMCwgdCA9ICgxPDxtKTsgaiA8IG07ICsraiwgdCA+Pj0gMSkgewogICAgICBmb3IgKGsgPSAwOyBrIDwgdDsgayArPSAyKSB7CglzQnVmW2sgPj4gMV0gPSBlZnJhYzBbal0gKiBzQnVmW2tdICsgZWZyYWMxW2pdICogc0J1ZltrKzFdOwogICAgICB9CiAgICB9CgogICAgLy8gbWFwIG91dHB1dCB2YWx1ZSB0byByYW5nZQogICAgb3V0W2ldID0gc0J1ZlswXSAqIChkZWNvZGVbaV1bMV0gLSBkZWNvZGVbaV1bMF0pICsgZGVjb2RlW2ldWzBdOwogICAgaWYgKG91dFtpXSA8IHJhbmdlW2ldWzBdKSB7CiAgICAgIG91dFtpXSA9IHJhbmdlW2ldWzBdOwogICAgfSBlbHNlIGlmIChvdXRbaV0gPiByYW5nZVtpXVsxXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVsxXTsKICAgIH0KICB9CgogIC8vIHNhdmUgY3VycmVudCByZXN1bHQgaW4gdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgY2FjaGVJbltpXSA9IGluW2ldOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICBjYWNoZU91dFtpXSA9IG91dFtpXTsKICB9Cn0KCkdCb29sIFNhbXBsZWRGdW5jdGlvbjo6aGFzRGlmZmVyZW50UmVzdWx0U2V0KEZ1bmN0aW9uICpmdW5jKSB7CiAgaWYgKGZ1bmMtPmdldFR5cGUoKSA9PSAwKSB7CiAgICBTYW1wbGVkRnVuY3Rpb24gKmNvbXBUbyA9IChTYW1wbGVkRnVuY3Rpb24gKikgZnVuYzsKICAgIGlmIChjb21wVG8tPmdldFNhbXBsZU51bWJlcigpICE9IG5TYW1wbGVzKQogICAgICByZXR1cm4gZ1RydWU7CiAgICBkb3VibGUgKmNvbXBTYW1wbGVzID0gY29tcFRvLT5nZXRTYW1wbGVzKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5TYW1wbGVzOyBpKyspIHsKICAgICAgaWYgKHNhbXBsZXNbaV0gIT0gY29tcFNhbXBsZXNbaV0pCiAgICAgICAgcmV0dXJuIGdUcnVlOwogICAgfQogIH0KICByZXR1cm4gZ0ZhbHNlOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBFeHBvbmVudGlhbEZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpFeHBvbmVudGlhbEZ1bmN0aW9uOjpFeHBvbmVudGlhbEZ1bmN0aW9uKE9iamVjdCAqZnVuY09iaiwgRGljdCAqZGljdCkgewogIE9iamVjdCBvYmoxLCBvYmoyOwogIGludCBpOwoKICBvayA9IGdGYWxzZTsKCiAgLy8tLS0tLSBpbml0aWFsaXplIHRoZSBnZW5lcmljIHN0dWZmCiAgaWYgKCFpbml0KGRpY3QpKSB7CiAgICBnb3RvIGVycjE7CiAgfQogIGlmIChtICE9IDEpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkV4cG9uZW50aWFsIGZ1bmN0aW9uIHdpdGggbW9yZSB0aGFuIG9uZSBpbnB1dCIpOwogICAgZ290byBlcnIxOwogIH0KCiAgLy8tLS0tLSBDMAogIGlmIChkaWN0LT5sb29rdXAoIkMwIiwgJm9iajEpLT5pc0FycmF5KCkpIHsKICAgIGlmIChoYXNSYW5nZSAmJiBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gbikgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMwIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBuID0gb2JqMS5hcnJheUdldExlbmd0aCgpOwogICAgaWYgKHVubGlrZWx5KG4gPiBmdW5jTWF4T3V0cHV0cykpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMCBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgbiA9IGZ1bmNNYXhPdXRwdXRzOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvYmoxLmFycmF5R2V0KGksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gQzAgYXJyYXkiKTsKCWdvdG8gZXJyMzsKICAgICAgfQogICAgICBjMFtpXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgfQogIH0gZWxzZSB7CiAgICBpZiAoaGFzUmFuZ2UgJiYgbiAhPSAxKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uJ3MgQzAgYXJyYXkgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIG4gPSAxOwogICAgYzBbMF0gPSAwOwogIH0KICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBDMQogIGlmIChkaWN0LT5sb29rdXAoIkMxIiwgJm9iajEpLT5pc0FycmF5KCkpIHsKICAgIGlmIChvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gbikgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMxIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG9iajEuYXJyYXlHZXQoaSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBDMSBhcnJheSIpOwoJZ290byBlcnIzOwogICAgICB9CiAgICAgIGMxW2ldID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmIChuICE9IDEpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMSBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgYzFbMF0gPSAxOwogIH0KICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBOIChleHBvbmVudCkKICBpZiAoIWRpY3QtPmxvb2t1cCgiTiIsICZvYmoxKS0+aXNOdW0oKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBOIik7CiAgICBnb3RvIGVycjI7CiAgfQogIGUgPSBvYmoxLmdldE51bSgpOwogIG9iajEuZnJlZSgpOwoKICBpc0xpbmVhciA9IGZhYnMoZS0xLikgPCAxZS0xMDsKICBvayA9IGdUcnVlOwogIHJldHVybjsKCiBlcnIzOgogIG9iajIuZnJlZSgpOwogZXJyMjoKICBvYmoxLmZyZWUoKTsKIGVycjE6CiAgcmV0dXJuOwp9CgpFeHBvbmVudGlhbEZ1bmN0aW9uOjp+RXhwb25lbnRpYWxGdW5jdGlvbigpIHsKfQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6RXhwb25lbnRpYWxGdW5jdGlvbihjb25zdCBFeHBvbmVudGlhbEZ1bmN0aW9uICpmdW5jKSA6IEZ1bmN0aW9uKGZ1bmMpIHsKICBtZW1jcHkoYzAsIGZ1bmMtPmMwLCBmdW5jTWF4T3V0cHV0cyAqIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoYzEsIGZ1bmMtPmMxLCBmdW5jTWF4T3V0cHV0cyAqIHNpemVvZihkb3VibGUpKTsKCiAgZSA9IGZ1bmMtPmU7CiAgaXNMaW5lYXIgPSBmdW5jLT5pc0xpbmVhcjsKICBvayA9IGZ1bmMtPm9rOwp9Cgp2b2lkIEV4cG9uZW50aWFsRnVuY3Rpb246OnRyYW5zZm9ybShkb3VibGUgKmluLCBkb3VibGUgKm91dCkgewogIGRvdWJsZSB4OwogIGludCBpOwoKICBpZiAoaW5bMF0gPCBkb21haW5bMF1bMF0pIHsKICAgIHggPSBkb21haW5bMF1bMF07CiAgfSBlbHNlIGlmIChpblswXSA+IGRvbWFpblswXVsxXSkgewogICAgeCA9IGRvbWFpblswXVsxXTsKICB9IGVsc2UgewogICAgeCA9IGluWzBdOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICBvdXRbaV0gPSBjMFtpXSArIChpc0xpbmVhciA/IHggOiBwb3coeCwgZSkpICogKGMxW2ldIC0gYzBbaV0pOwogICAgaWYgKGhhc1JhbmdlKSB7CiAgICAgIGlmIChvdXRbaV0gPCByYW5nZVtpXVswXSkgewoJb3V0W2ldID0gcmFuZ2VbaV1bMF07CiAgICAgIH0gZWxzZSBpZiAob3V0W2ldID4gcmFuZ2VbaV1bMV0pIHsKCW91dFtpXSA9IHJhbmdlW2ldWzFdOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybjsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3RpdGNoaW5nRnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClN0aXRjaGluZ0Z1bmN0aW9uOjpTdGl0Y2hpbmdGdW5jdGlvbihPYmplY3QgKmZ1bmNPYmosIERpY3QgKmRpY3QsIHN0ZDo6c2V0PGludD4gKnVzZWRQYXJlbnRzKSB7CiAgT2JqZWN0IG9iajEsIG9iajI7CiAgaW50IGk7CgogIG9rID0gZ0ZhbHNlOwogIGZ1bmNzID0gTlVMTDsKICBib3VuZHMgPSBOVUxMOwogIGVuY29kZSA9IE5VTEw7CiAgc2NhbGUgPSBOVUxMOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIGdvdG8gZXJyMTsKICB9CiAgaWYgKG0gIT0gMSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RpdGNoaW5nIGZ1bmN0aW9uIHdpdGggbW9yZSB0aGFuIG9uZSBpbnB1dCIpOwogICAgZ290byBlcnIxOwogIH0KCiAgLy8tLS0tLSBGdW5jdGlvbnMKICBpZiAoIWRpY3QtPmxvb2t1cCgiRnVuY3Rpb25zIiwgJm9iajEpLT5pc0FycmF5KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIk1pc3NpbmcgJ0Z1bmN0aW9ucycgZW50cnkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICBnb3RvIGVycjE7CiAgfQogIGsgPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCk7CiAgZnVuY3MgPSAoRnVuY3Rpb24gKiopZ21hbGxvY24oaywgc2l6ZW9mKEZ1bmN0aW9uICopKTsKICBib3VuZHMgPSAoZG91YmxlICopZ21hbGxvY24oayArIDEsIHNpemVvZihkb3VibGUpKTsKICBlbmNvZGUgPSAoZG91YmxlICopZ21hbGxvY24oMiAqIGssIHNpemVvZihkb3VibGUpKTsKICBzY2FsZSA9IChkb3VibGUgKilnbWFsbG9jbihrLCBzaXplb2YoZG91YmxlKSk7CiAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgZnVuY3NbaV0gPSBOVUxMOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBzdGQ6OnNldDxpbnQ+IHVzZWRQYXJlbnRzQXV4ID0gKnVzZWRQYXJlbnRzOwogICAgb2JqMS5hcnJheUdldE5GKGksICZvYmoyKTsKICAgIGlmIChvYmoyLmlzUmVmKCkpIHsKICAgICAgY29uc3QgUmVmIHJlZiA9IG9iajIuZ2V0UmVmKCk7CiAgICAgIGlmICh1c2VkUGFyZW50c0F1eC5maW5kKHJlZi5udW0pID09IHVzZWRQYXJlbnRzQXV4LmVuZCgpKSB7CiAgICAgICAgdXNlZFBhcmVudHNBdXguaW5zZXJ0KHJlZi5udW0pOwogICAgICAgIG9iajIuZnJlZSgpOwogICAgICAgIG9iajEuYXJyYXlHZXQoaSwgJm9iajIpOwogICAgICB9IGVsc2UgewogICAgICAgIGdvdG8gZXJyMjsKICAgICAgfQogICAgfQogICAgaWYgKCEoZnVuY3NbaV0gPSBGdW5jdGlvbjo6cGFyc2UoJm9iajIsICZ1c2VkUGFyZW50c0F1eCkpKSB7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIGlmIChmdW5jc1tpXS0+Z2V0SW5wdXRTaXplKCkgIT0gMSB8fAoJKGkgPiAwICYmIGZ1bmNzW2ldLT5nZXRPdXRwdXRTaXplKCkgIT0gZnVuY3NbMF0tPmdldE91dHB1dFNpemUoKSkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJICAgICJJbmNvbXBhdGlibGUgc3ViZnVuY3Rpb25zIGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBvYmoyLmZyZWUoKTsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gQm91bmRzCiAgaWYgKCFkaWN0LT5sb29rdXAoIkJvdW5kcyIsICZvYmoxKS0+aXNBcnJheSgpIHx8CiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSAhPSBrIC0gMSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiTWlzc2luZyBvciBpbnZhbGlkICdCb3VuZHMnIGVudHJ5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgZ290byBlcnIxOwogIH0KICBib3VuZHNbMF0gPSBkb21haW5bMF1bMF07CiAgZm9yIChpID0gMTsgaSA8IGs7ICsraSkgewogICAgaWYgKCFvYmoxLmFycmF5R2V0KGkgLSAxLCAmb2JqMiktPmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSW52YWxpZCB0eXBlIGluICdCb3VuZHMnIGFycmF5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBib3VuZHNbaV0gPSBvYmoyLmdldE51bSgpOwogICAgb2JqMi5mcmVlKCk7CiAgfQogIGJvdW5kc1trXSA9IGRvbWFpblswXVsxXTsKICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBFbmNvZGUKICBpZiAoIWRpY3QtPmxvb2t1cCgiRW5jb2RlIiwgJm9iajEpLT5pc0FycmF5KCkgfHwKICAgICAgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IDIgKiBrKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJNaXNzaW5nIG9yIGludmFsaWQgJ0VuY29kZScgZW50cnkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICBnb3RvIGVycjE7CiAgfQogIGZvciAoaSA9IDA7IGkgPCAyICogazsgKytpKSB7CiAgICBpZiAoIW9iajEuYXJyYXlHZXQoaSwgJm9iajIpLT5pc051bSgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkludmFsaWQgdHlwZSBpbiAnRW5jb2RlJyBhcnJheSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgZW5jb2RlW2ldID0gb2JqMi5nZXROdW0oKTsKICAgIG9iajIuZnJlZSgpOwogIH0KICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBwcmUtY29tcHV0ZSB0aGUgc2NhbGUgZmFjdG9ycwogIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgIGlmIChib3VuZHNbaV0gPT0gYm91bmRzW2krMV0pIHsKICAgICAgLy8gYXZvaWQgYSBkaXZpZGUtYnktemVybyAtLSBpbiB0aGlzIHNpdHVhdGlvbiwgZnVuY3Rpb24gaSB3aWxsCiAgICAgIC8vIG5ldmVyIGJlIHVzZWQgYW55d2F5CiAgICAgIHNjYWxlW2ldID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIHNjYWxlW2ldID0gKGVuY29kZVsyKmkrMV0gLSBlbmNvZGVbMippXSkgLyAoYm91bmRzW2krMV0gLSBib3VuZHNbaV0pOwogICAgfQogIH0KCiAgbiA9IGZ1bmNzWzBdLT5nZXRPdXRwdXRTaXplKCk7CiAgb2sgPSBnVHJ1ZTsKICByZXR1cm47CgogZXJyMjoKICBvYmoyLmZyZWUoKTsKIGVycjE6CiAgb2JqMS5mcmVlKCk7Cn0KClN0aXRjaGluZ0Z1bmN0aW9uOjpTdGl0Y2hpbmdGdW5jdGlvbihjb25zdCBTdGl0Y2hpbmdGdW5jdGlvbiAqZnVuYykgOiBGdW5jdGlvbihmdW5jKSB7CiAgayA9IGZ1bmMtPms7CgogIGZ1bmNzID0gKEZ1bmN0aW9uICoqKWdtYWxsb2NuKGssIHNpemVvZihGdW5jdGlvbiAqKSk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgIGZ1bmNzW2ldID0gZnVuYy0+ZnVuY3NbaV0tPmNvcHkoKTsKICB9CgogIGJvdW5kcyA9IChkb3VibGUgKilnbWFsbG9jbihrICsgMSwgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShib3VuZHMsIGZ1bmMtPmJvdW5kcywgKGsgKyAxKSAqIHNpemVvZihkb3VibGUpKTsKCiAgZW5jb2RlID0gKGRvdWJsZSAqKWdtYWxsb2NuKDIgKiBrLCBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGVuY29kZSwgZnVuYy0+ZW5jb2RlLCAyICogayAqIHNpemVvZihkb3VibGUpKTsKCiAgc2NhbGUgPSAoZG91YmxlICopZ21hbGxvY24oaywgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShzY2FsZSwgZnVuYy0+c2NhbGUsIGsgKiBzaXplb2YoZG91YmxlKSk7CgogIG9rID0gZnVuYy0+b2s7Cn0KClN0aXRjaGluZ0Z1bmN0aW9uOjp+U3RpdGNoaW5nRnVuY3Rpb24oKSB7CiAgaW50IGk7CgogIGlmIChmdW5jcykgewogICAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgICBpZiAoZnVuY3NbaV0pIHsKCWRlbGV0ZSBmdW5jc1tpXTsKICAgICAgfQogICAgfQogIH0KICBnZnJlZShmdW5jcyk7CiAgZ2ZyZWUoYm91bmRzKTsKICBnZnJlZShlbmNvZGUpOwogIGdmcmVlKHNjYWxlKTsKfQoKdm9pZCBTdGl0Y2hpbmdGdW5jdGlvbjo6dHJhbnNmb3JtKGRvdWJsZSAqaW4sIGRvdWJsZSAqb3V0KSB7CiAgZG91YmxlIHg7CiAgaW50IGk7CgogIGlmIChpblswXSA8IGRvbWFpblswXVswXSkgewogICAgeCA9IGRvbWFpblswXVswXTsKICB9IGVsc2UgaWYgKGluWzBdID4gZG9tYWluWzBdWzFdKSB7CiAgICB4ID0gZG9tYWluWzBdWzFdOwogIH0gZWxzZSB7CiAgICB4ID0gaW5bMF07CiAgfQogIGZvciAoaSA9IDA7IGkgPCBrIC0gMTsgKytpKSB7CiAgICBpZiAoeCA8IGJvdW5kc1tpKzFdKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICB4ID0gZW5jb2RlWzIqaV0gKyAoeCAtIGJvdW5kc1tpXSkgKiBzY2FsZVtpXTsKICBmdW5jc1tpXS0+dHJhbnNmb3JtKCZ4LCBvdXQpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBQb3N0U2NyaXB0RnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmVudW0gUFNPcCB7CiAgcHNPcEFicywKICBwc09wQWRkLAogIHBzT3BBbmQsCiAgcHNPcEF0YW4sCiAgcHNPcEJpdHNoaWZ0LAogIHBzT3BDZWlsaW5nLAogIHBzT3BDb3B5LAogIHBzT3BDb3MsCiAgcHNPcEN2aSwKICBwc09wQ3ZyLAogIHBzT3BEaXYsCiAgcHNPcER1cCwKICBwc09wRXEsCiAgcHNPcEV4Y2gsCiAgcHNPcEV4cCwKICBwc09wRmFsc2UsCiAgcHNPcEZsb29yLAogIHBzT3BHZSwKICBwc09wR3QsCiAgcHNPcElkaXYsCiAgcHNPcEluZGV4LAogIHBzT3BMZSwKICBwc09wTG4sCiAgcHNPcExvZywKICBwc09wTHQsCiAgcHNPcE1vZCwKICBwc09wTXVsLAogIHBzT3BOZSwKICBwc09wTmVnLAogIHBzT3BOb3QsCiAgcHNPcE9yLAogIHBzT3BQb3AsCiAgcHNPcFJvbGwsCiAgcHNPcFJvdW5kLAogIHBzT3BTaW4sCiAgcHNPcFNxcnQsCiAgcHNPcFN1YiwKICBwc09wVHJ1ZSwKICBwc09wVHJ1bmNhdGUsCiAgcHNPcFhvciwKICBwc09wSWYsCiAgcHNPcElmZWxzZSwKICBwc09wUmV0dXJuCn07CgovLyBOb3RlOiAnaWYnIGFuZCAnaWZlbHNlJyBhcmUgcGFyc2VkIHNlcGFyYXRlbHkuCi8vIFRoZSByZXN0IGFyZSBsaXN0ZWQgaGVyZSBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi8vIFRoZSBpbmRleCBpbiB0aGlzIHRhYmxlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGVudHJ5IGluIFBTT3AuCnN0YXRpYyBjb25zdCBjaGFyICpwc09wTmFtZXNbXSA9IHsKICAiYWJzIiwKICAiYWRkIiwKICAiYW5kIiwKICAiYXRhbiIsCiAgImJpdHNoaWZ0IiwKICAiY2VpbGluZyIsCiAgImNvcHkiLAogICJjb3MiLAogICJjdmkiLAogICJjdnIiLAogICJkaXYiLAogICJkdXAiLAogICJlcSIsCiAgImV4Y2giLAogICJleHAiLAogICJmYWxzZSIsCiAgImZsb29yIiwKICAiZ2UiLAogICJndCIsCiAgImlkaXYiLAogICJpbmRleCIsCiAgImxlIiwKICAibG4iLAogICJsb2ciLAogICJsdCIsCiAgIm1vZCIsCiAgIm11bCIsCiAgIm5lIiwKICAibmVnIiwKICAibm90IiwKICAib3IiLAogICJwb3AiLAogICJyb2xsIiwKICAicm91bmQiLAogICJzaW4iLAogICJzcXJ0IiwKICAic3ViIiwKICAidHJ1ZSIsCiAgInRydW5jYXRlIiwKICAieG9yIgp9OwoKI2RlZmluZSBuUFNPcHMgKHNpemVvZihwc09wTmFtZXMpIC8gc2l6ZW9mKGNoYXIgKikpCgplbnVtIFBTT2JqZWN0VHlwZSB7CiAgcHNCb29sLAogIHBzSW50LAogIHBzUmVhbCwKICBwc09wZXJhdG9yLAogIHBzQmxvY2sKfTsKCi8vIEluIHRoZSBjb2RlIGFycmF5LCAnaWYnLydpZmVsc2UnIG9wZXJhdG9ycyB0YWtlIHVwIHRocmVlIHNsb3RzCi8vIHBsdXMgc3BhY2UgZm9yIHRoZSBjb2RlIGluIHRoZSBzdWJjbGF1c2UocykuCi8vCi8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IHBzT3BlcmF0b3I6IHBzT3BJZiAvIHBzT3BJZmVsc2UgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBwc0Jsb2NrOiBwdHI9PEE+ICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgICAgIHwgcHNCbG9jazogcHRyPTxCPiAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IGlmIGNsYXVzZSAgICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCBwc09wZXJhdG9yOiBwc09wUmV0dXJuICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgPEE+IHwgZWxzZSBjbGF1c2UgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICB8IHBzT3BlcmF0b3I6IHBzT3BSZXR1cm4gICAgICAgICAgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICA8Qj4gfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8KLy8gRm9yICdpZicsIHBvaW50ZXIgPEE+IGlzIHByZXNlbnQgaW4gdGhlIGNvZGUgc3RyZWFtIGJ1dCB1bnVzZWQuCgpzdHJ1Y3QgUFNPYmplY3QgewogIFBTT2JqZWN0VHlwZSB0eXBlOwogIHVuaW9uIHsKICAgIEdCb29sIGJvb2xuOwkJLy8gYm9vbGVhbiAoc3RhY2sgb25seSkKICAgIGludCBpbnRnOwkJCS8vIGludGVnZXIgKHN0YWNrIGFuZCBjb2RlKQogICAgZG91YmxlIHJlYWw7CQkvLyByZWFsIChzdGFjayBhbmQgY29kZSkKICAgIFBTT3Agb3A7CQkJLy8gb3BlcmF0b3IgKGNvZGUgb25seSkKICAgIGludCBibGs7CQkJLy8gaWYvaWZlbHNlIGJsb2NrIHBvaW50ZXIgKGNvZGUgb25seSkKICB9Owp9OwoKI2RlZmluZSBwc1N0YWNrU2l6ZSAxMDAKCmNsYXNzIFBTU3RhY2sgewpwdWJsaWM6CgogIFBTU3RhY2soKSB7c3AgPSBwc1N0YWNrU2l6ZTsgfQogIHZvaWQgY2xlYXIoKSB7IHNwID0gcHNTdGFja1NpemU7IH0KICB2b2lkIHB1c2hCb29sKEdCb29sIGJvb2xuKQogIHsKICAgIGlmIChjaGVja092ZXJmbG93KCkpIHsKICAgICAgc3RhY2tbLS1zcF0udHlwZSA9IHBzQm9vbDsKICAgICAgc3RhY2tbc3BdLmJvb2xuID0gYm9vbG47CiAgICB9CiAgfQogIHZvaWQgcHVzaEludChpbnQgaW50ZykKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc0ludDsKICAgICAgc3RhY2tbc3BdLmludGcgPSBpbnRnOwogICAgfQogIH0KICB2b2lkIHB1c2hSZWFsKGRvdWJsZSByZWFsKQogIHsKICAgIGlmIChjaGVja092ZXJmbG93KCkpIHsKICAgICAgc3RhY2tbLS1zcF0udHlwZSA9IHBzUmVhbDsKICAgICAgc3RhY2tbc3BdLnJlYWwgPSByZWFsOwogICAgfQogIH0KICBHQm9vbCBwb3BCb29sKCkKICB7CiAgICBpZiAoY2hlY2tVbmRlcmZsb3coKSAmJiBjaGVja1R5cGUocHNCb29sLCBwc0Jvb2wpKSB7CiAgICAgIHJldHVybiBzdGFja1tzcCsrXS5ib29sbjsKICAgIH0KICAgIHJldHVybiBnRmFsc2U7CiAgfQogIGludCBwb3BJbnQoKQogIHsKICAgIGlmIChjaGVja1VuZGVyZmxvdygpICYmIGNoZWNrVHlwZShwc0ludCwgcHNJbnQpKSB7CiAgICAgIHJldHVybiBzdGFja1tzcCsrXS5pbnRnOwogICAgfQogICAgcmV0dXJuIDA7CiAgfQogIGRvdWJsZSBwb3BOdW0oKQogIHsKICAgIGRvdWJsZSByZXQ7CgogICAgaWYgKGNoZWNrVW5kZXJmbG93KCkgJiYgY2hlY2tUeXBlKHBzSW50LCBwc1JlYWwpKSB7CiAgICAgIHJldCA9IChzdGFja1tzcF0udHlwZSA9PSBwc0ludCkgPyAoZG91YmxlKXN0YWNrW3NwXS5pbnRnIDogc3RhY2tbc3BdLnJlYWw7CiAgICAgICsrc3A7CiAgICAgIHJldHVybiByZXQ7CiAgICB9CiAgICByZXR1cm4gMDsKICB9CiAgR0Jvb2wgZW1wdHkoKSB7IHJldHVybiBzcCA9PSBwc1N0YWNrU2l6ZTsgfQogIEdCb29sIHRvcElzSW50KCkgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAmJiBzdGFja1tzcF0udHlwZSA9PSBwc0ludDsgfQogIEdCb29sIHRvcFR3b0FyZUludHMoKQogICAgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAtIDEgJiYKCSAgICAgc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQgJiYKICAgICAgICAgICAgIHN0YWNrW3NwKzFdLnR5cGUgPT0gcHNJbnQ7IH0KICBHQm9vbCB0b3BJc1JlYWwoKSB7IHJldHVybiBzcCA8IHBzU3RhY2tTaXplICYmIHN0YWNrW3NwXS50eXBlID09IHBzUmVhbDsgfQogIEdCb29sIHRvcFR3b0FyZU51bXMoKQogICAgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAtIDEgJiYKCSAgICAgKHN0YWNrW3NwXS50eXBlID09IHBzSW50IHx8IHN0YWNrW3NwXS50eXBlID09IHBzUmVhbCkgJiYKCSAgICAgKHN0YWNrW3NwKzFdLnR5cGUgPT0gcHNJbnQgfHwgc3RhY2tbc3ArMV0udHlwZSA9PSBwc1JlYWwpOyB9CiAgdm9pZCBjb3B5KGludCBuKTsKICB2b2lkIHJvbGwoaW50IG4sIGludCBqKTsKICB2b2lkIGluZGV4KGludCBpKQogIHsKICAgIGlmICghY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC0tc3A7CiAgICBpZiAodW5saWtlbHkoc3AgKyBpICsgMSA+PSBwc1N0YWNrU2l6ZSkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgdW5kZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHVubGlrZWx5KHNwICsgaSArIDEgPCAwKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayBvdmVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN0YWNrW3NwXSA9IHN0YWNrW3NwICsgMSArIGldOwogIH0KICB2b2lkIHBvcCgpCiAgewogICAgaWYgKCFjaGVja1VuZGVyZmxvdygpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgICsrc3A7CiAgfQoKcHJpdmF0ZToKCiAgR0Jvb2wgY2hlY2tPdmVyZmxvdyhpbnQgbiA9IDEpCiAgewogICAgaWYgKHNwIC0gbiA8IDApIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgb3ZlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcmV0dXJuIGdUcnVlOwogIH0KICBHQm9vbCBjaGVja1VuZGVyZmxvdygpCiAgewogICAgaWYgKHNwID09IHBzU3RhY2tTaXplKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIHVuZGVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICAgIHJldHVybiBnRmFsc2U7CiAgICB9CiAgICByZXR1cm4gZ1RydWU7CiAgfQogIEdCb29sIGNoZWNrVHlwZShQU09iamVjdFR5cGUgdDEsIFBTT2JqZWN0VHlwZSB0MikKICB7CiAgICBpZiAoc3RhY2tbc3BdLnR5cGUgIT0gdDEgJiYgc3RhY2tbc3BdLnR5cGUgIT0gdDIpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSBtaXNtYXRjaCBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICAgIHJldHVybiBnRmFsc2U7CiAgICB9CiAgICByZXR1cm4gZ1RydWU7CiAgfQogIFBTT2JqZWN0IHN0YWNrW3BzU3RhY2tTaXplXTsKICBpbnQgc3A7Cn07CgoKdm9pZCBQU1N0YWNrOjpjb3B5KGludCBuKSB7CiAgaW50IGk7CgogIGlmIChzcCArIG4gPiBwc1N0YWNrU2l6ZSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgdW5kZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgIHJldHVybjsKICB9CiAgaWYgKHVubGlrZWx5KHNwIC0gbiA+IHBzU3RhY2tTaXplKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgdW5kZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgIHJldHVybjsKICB9CiAgaWYgKCFjaGVja092ZXJmbG93KG4pKSB7CiAgICByZXR1cm47CiAgfQogIGZvciAoaSA9IHNwICsgbiAtIDE7IGkgPj0gc3A7IC0taSkgewogICAgc3RhY2tbaSAtIG5dID0gc3RhY2tbaV07CiAgfQogIHNwIC09IG47Cn0KCnZvaWQgUFNTdGFjazo6cm9sbChpbnQgbiwgaW50IGopIHsKICBQU09iamVjdCBvYmo7CiAgaW50IGksIGs7CgogIGlmICh1bmxpa2VseShuID09IDApKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChqID49IDApIHsKICAgIGogJT0gbjsKICB9IGVsc2UgewogICAgaiA9IC1qICUgbjsKICAgIGlmIChqICE9IDApIHsKICAgICAgaiA9IG4gLSBqOwogICAgfQogIH0KICBpZiAobiA8PSAwIHx8IGogPT0gMCB8fCBuID4gcHNTdGFja1NpemUgfHwgc3AgKyBuID4gcHNTdGFja1NpemUpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKGogPD0gbiAvIDIpIHsKICAgIGZvciAoaSA9IDA7IGkgPCBqOyArK2kpIHsKICAgICAgb2JqID0gc3RhY2tbc3BdOwogICAgICBmb3IgKGsgPSBzcDsgayA8IHNwICsgbiAtIDE7ICsraykgewogICAgICAgIHN0YWNrW2tdID0gc3RhY2tbaysxXTsKICAgICAgfQogICAgICBzdGFja1tzcCArIG4gLSAxXSA9IG9iajsKICAgIH0KICB9IGVsc2UgewogICAgaiA9IG4gLSBqOwogICAgZm9yIChpID0gMDsgaSA8IGo7ICsraSkgewogICAgICBvYmogPSBzdGFja1tzcCArIG4gLSAxXTsKICAgICAgZm9yIChrID0gc3AgKyBuIC0gMTsgayA+IHNwOyAtLWspIHsKICAgICAgICBzdGFja1trXSA9IHN0YWNrW2stMV07CiAgICAgIH0KICAgICAgc3RhY2tbc3BdID0gb2JqOwogICAgfQogIH0KfQoKUG9zdFNjcmlwdEZ1bmN0aW9uOjpQb3N0U2NyaXB0RnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0KSB7CiAgU3RyZWFtICpzdHI7CiAgaW50IGNvZGVQdHI7CiAgR29vU3RyaW5nICp0b2s7CiAgZG91YmxlIGluW2Z1bmNNYXhJbnB1dHNdOwogIGludCBpOwoKICBjb2RlID0gTlVMTDsKICBjb2RlU3RyaW5nID0gTlVMTDsKICBjb2RlU2l6ZSA9IDA7CiAgb2sgPSBnRmFsc2U7CgogIC8vLS0tLS0gaW5pdGlhbGl6ZSB0aGUgZ2VuZXJpYyBzdHVmZgogIGlmICghaW5pdChkaWN0KSkgewogICAgZ290byBlcnIxOwogIH0KICBpZiAoIWhhc1JhbmdlKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJUeXBlIDQgZnVuY3Rpb24gaXMgbWlzc2luZyByYW5nZSIpOwogICAgZ290byBlcnIxOwogIH0KCiAgLy8tLS0tLSBnZXQgdGhlIHN0cmVhbQogIGlmICghZnVuY09iai0+aXNTdHJlYW0oKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSA0IGZ1bmN0aW9uIGlzbid0IGEgc3RyZWFtIik7CiAgICBnb3RvIGVycjE7CiAgfQogIHN0ciA9IGZ1bmNPYmotPmdldFN0cmVhbSgpOwoKICAvLy0tLS0tIHBhcnNlIHRoZSBmdW5jdGlvbgogIGNvZGVTdHJpbmcgPSBuZXcgR29vU3RyaW5nKCk7CiAgc3RyLT5yZXNldCgpOwogIGlmICghKHRvayA9IGdldFRva2VuKHN0cikpIHx8IHRvay0+Y21wKCJ7IikpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkV4cGVjdGVkICd7eycgYXQgc3RhcnQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgaWYgKHRvaykgewogICAgICBkZWxldGUgdG9rOwogICAgfQogICAgZ290byBlcnIxOwogIH0KICBkZWxldGUgdG9rOwogIGNvZGVQdHIgPSAwOwogIGlmICghcGFyc2VDb2RlKHN0ciwgJmNvZGVQdHIpKSB7CiAgICBnb3RvIGVycjI7CiAgfQogIHN0ci0+Y2xvc2UoKTsKCiAgLy8tLS0tLSBzZXQgdXAgdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaW5baV0gPSBkb21haW5baV1bMF07CiAgICBjYWNoZUluW2ldID0gaW5baV0gLSAxOwogIH0KICB0cmFuc2Zvcm0oaW4sIGNhY2hlT3V0KTsKCiAgb2sgPSBnVHJ1ZTsKICAKIGVycjI6CiAgc3RyLT5jbG9zZSgpOwogZXJyMToKICByZXR1cm47Cn0KClBvc3RTY3JpcHRGdW5jdGlvbjo6UG9zdFNjcmlwdEZ1bmN0aW9uKGNvbnN0IFBvc3RTY3JpcHRGdW5jdGlvbiAqZnVuYykgOiBGdW5jdGlvbihmdW5jKSB7CiAgY29kZVNpemUgPSBmdW5jLT5jb2RlU2l6ZTsKCiAgY29kZSA9IChQU09iamVjdCAqKWdtYWxsb2NuKGNvZGVTaXplLCBzaXplb2YoUFNPYmplY3QpKTsKICBtZW1jcHkoY29kZSwgZnVuYy0+Y29kZSwgY29kZVNpemUgKiBzaXplb2YoUFNPYmplY3QpKTsKCiAgY29kZVN0cmluZyA9IGZ1bmMtPmNvZGVTdHJpbmctPmNvcHkoKTsKCiAgbWVtY3B5KGNhY2hlSW4sIGZ1bmMtPmNhY2hlSW4sIGZ1bmNNYXhJbnB1dHMgKiBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGNhY2hlT3V0LCBmdW5jLT5jYWNoZU91dCwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CgogIG9rID0gZnVuYy0+b2s7Cn0KClBvc3RTY3JpcHRGdW5jdGlvbjo6flBvc3RTY3JpcHRGdW5jdGlvbigpIHsKICBnZnJlZShjb2RlKTsKICBkZWxldGUgY29kZVN0cmluZzsKfQoKdm9pZCBQb3N0U2NyaXB0RnVuY3Rpb246OnRyYW5zZm9ybShkb3VibGUgKmluLCBkb3VibGUgKm91dCkgewogIFBTU3RhY2sgc3RhY2s7CiAgaW50IGk7CgogIC8vIGNoZWNrIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGlmIChpbltpXSAhPSBjYWNoZUluW2ldKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoaSA9PSBtKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG91dFtpXSA9IGNhY2hlT3V0W2ldOwogICAgfQogICAgcmV0dXJuOwogIH0KCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgLy9+IG1heSBuZWVkIHRvIGNoZWNrIGZvciBpbnRlZ2VycyBoZXJlCiAgICBzdGFjay5wdXNoUmVhbChpbltpXSk7CiAgfQogIGV4ZWMoJnN0YWNrLCAwKTsKICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgIG91dFtpXSA9IHN0YWNrLnBvcE51bSgpOwogICAgaWYgKG91dFtpXSA8IHJhbmdlW2ldWzBdKSB7CiAgICAgIG91dFtpXSA9IHJhbmdlW2ldWzBdOwogICAgfSBlbHNlIGlmIChvdXRbaV0gPiByYW5nZVtpXVsxXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVsxXTsKICAgIH0KICB9CiAgc3RhY2suY2xlYXIoKTsKCiAgLy8gaWYgKCFzdGFjay0+ZW1wdHkoKSkgewogIC8vICAgZXJyb3IoZXJyU3ludGF4V2FybmluZywgLTEsCiAgLy8gICAgICAgICAiRXh0cmEgdmFsdWVzIG9uIHN0YWNrIGF0IGVuZCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgLy8gfQoKICAvLyBzYXZlIGN1cnJlbnQgcmVzdWx0IGluIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGNhY2hlSW5baV0gPSBpbltpXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgY2FjaGVPdXRbaV0gPSBvdXRbaV07CiAgfQp9CgpHQm9vbCBQb3N0U2NyaXB0RnVuY3Rpb246OnBhcnNlQ29kZShTdHJlYW0gKnN0ciwgaW50ICpjb2RlUHRyKSB7CiAgR29vU3RyaW5nICp0b2s7CiAgY2hhciAqcDsKICBHQm9vbCBpc1JlYWw7CiAgaW50IG9wUHRyLCBlbHNlUHRyOwogIGludCBhLCBiLCBtaWQsIGNtcDsKCiAgd2hpbGUgKDEpIHsKICAgIGlmICghKHRvayA9IGdldFRva2VuKHN0cikpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlVuZXhwZWN0ZWQgZW5kIG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24gc3RyZWFtIik7CiAgICAgIHJldHVybiBnRmFsc2U7CiAgICB9CiAgICBwID0gdG9rLT5nZXRDU3RyaW5nKCk7CiAgICBpZiAoaXNkaWdpdCgqcCkgfHwgKnAgPT0gJy4nIHx8ICpwID09ICctJykgewogICAgICBpc1JlYWwgPSBnRmFsc2U7CiAgICAgIGZvciAoOyAqcDsgKytwKSB7CglpZiAoKnAgPT0gJy4nKSB7CgkgIGlzUmVhbCA9IGdUcnVlOwoJICBicmVhazsKCX0KICAgICAgfQogICAgICByZXNpemVDb2RlKCpjb2RlUHRyKTsKICAgICAgaWYgKGlzUmVhbCkgewoJY29kZVsqY29kZVB0cl0udHlwZSA9IHBzUmVhbDsKICAgICAgICAgIGNvZGVbKmNvZGVQdHJdLnJlYWwgPSBnYXRvZih0b2stPmdldENTdHJpbmcoKSk7CiAgICAgIH0gZWxzZSB7Cgljb2RlWypjb2RlUHRyXS50eXBlID0gcHNJbnQ7Cgljb2RlWypjb2RlUHRyXS5pbnRnID0gYXRvaSh0b2stPmdldENTdHJpbmcoKSk7CiAgICAgIH0KICAgICAgKysqY29kZVB0cjsKICAgICAgZGVsZXRlIHRvazsKICAgIH0gZWxzZSBpZiAoIXRvay0+Y21wKCJ7IikpIHsKICAgICAgZGVsZXRlIHRvazsKICAgICAgb3BQdHIgPSAqY29kZVB0cjsKICAgICAgKmNvZGVQdHIgKz0gMzsKICAgICAgcmVzaXplQ29kZShvcFB0ciArIDIpOwogICAgICBpZiAoIXBhcnNlQ29kZShzdHIsIGNvZGVQdHIpKSB7CglyZXR1cm4gZ0ZhbHNlOwogICAgICB9CiAgICAgIGlmICghKHRvayA9IGdldFRva2VuKHN0cikpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJVbmV4cGVjdGVkIGVuZCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0cmVhbSIpOwoJcmV0dXJuIGdGYWxzZTsKICAgICAgfQogICAgICBpZiAoIXRvay0+Y21wKCJ7IikpIHsKCWVsc2VQdHIgPSAqY29kZVB0cjsKCWlmICghcGFyc2VDb2RlKHN0ciwgY29kZVB0cikpIHsKCSAgcmV0dXJuIGdGYWxzZTsKCX0KCWRlbGV0ZSB0b2s7CglpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSkgewoJICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJVbmV4cGVjdGVkIGVuZCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0cmVhbSIpOwoJICByZXR1cm4gZ0ZhbHNlOwoJfQogICAgICB9IGVsc2UgewoJZWxzZVB0ciA9IC0xOwogICAgICB9CiAgICAgIGlmICghdG9rLT5jbXAoImlmIikpIHsKCWlmIChlbHNlUHRyID49IDApIHsKCSAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJCSJHb3QgJ2lmJyBvcGVyYXRvciB3aXRoIHR3byBibG9ja3MgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwoJICByZXR1cm4gZ0ZhbHNlOwoJfQoJY29kZVtvcFB0cl0udHlwZSA9IHBzT3BlcmF0b3I7Cgljb2RlW29wUHRyXS5vcCA9IHBzT3BJZjsKCWNvZGVbb3BQdHIrMl0udHlwZSA9IHBzQmxvY2s7Cgljb2RlW29wUHRyKzJdLmJsayA9ICpjb2RlUHRyOwogICAgICB9IGVsc2UgaWYgKCF0b2stPmNtcCgiaWZlbHNlIikpIHsKCWlmIChlbHNlUHRyIDwgMCkgewoJICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsCgkJIkdvdCAnaWZlbHNlJyBvcGVyYXRvciB3aXRoIG9uZSBibG9jayBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CgkgIHJldHVybiBnRmFsc2U7Cgl9Cgljb2RlW29wUHRyXS50eXBlID0gcHNPcGVyYXRvcjsKCWNvZGVbb3BQdHJdLm9wID0gcHNPcElmZWxzZTsKCWNvZGVbb3BQdHIrMV0udHlwZSA9IHBzQmxvY2s7Cgljb2RlW29wUHRyKzFdLmJsayA9IGVsc2VQdHI7Cgljb2RlW29wUHRyKzJdLnR5cGUgPSBwc0Jsb2NrOwoJY29kZVtvcFB0cisyXS5ibGsgPSAqY29kZVB0cjsKICAgICAgfSBlbHNlIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwKCSAgICAgICJFeHBlY3RlZCBpZi9pZmVsc2Ugb3BlcmF0b3IgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwoJZGVsZXRlIHRvazsKCXJldHVybiBnRmFsc2U7CiAgICAgIH0KICAgICAgZGVsZXRlIHRvazsKICAgIH0gZWxzZSBpZiAoIXRvay0+Y21wKCJ9IikpIHsKICAgICAgZGVsZXRlIHRvazsKICAgICAgcmVzaXplQ29kZSgqY29kZVB0cik7CiAgICAgIGNvZGVbKmNvZGVQdHJdLnR5cGUgPSBwc09wZXJhdG9yOwogICAgICBjb2RlWypjb2RlUHRyXS5vcCA9IHBzT3BSZXR1cm47CiAgICAgICsrKmNvZGVQdHI7CiAgICAgIGJyZWFrOwogICAgfSBlbHNlIHsKICAgICAgYSA9IC0xOwogICAgICBiID0gblBTT3BzOwogICAgICBjbXAgPSAwOyAvLyBtYWtlIGdjYyBoYXBweQogICAgICAvLyBpbnZhcmlhbnQ6IHBzT3BOYW1lc1thXSA8IHRvayA8IHBzT3BOYW1lc1tiXQogICAgICB3aGlsZSAoYiAtIGEgPiAxKSB7CgltaWQgPSAoYSArIGIpIC8gMjsKCWNtcCA9IHRvay0+Y21wKHBzT3BOYW1lc1ttaWRdKTsKCWlmIChjbXAgPiAwKSB7CgkgIGEgPSBtaWQ7Cgl9IGVsc2UgaWYgKGNtcCA8IDApIHsKCSAgYiA9IG1pZDsKCX0gZWxzZSB7CgkgIGEgPSBiID0gbWlkOwoJfQogICAgICB9CiAgICAgIGlmIChjbXAgIT0gMCkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJICAgICAgIlVua25vd24gb3BlcmF0b3IgJ3swOnR9JyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIiwKCSAgICAgIHRvayk7CglkZWxldGUgdG9rOwoJcmV0dXJuIGdGYWxzZTsKICAgICAgfQogICAgICBkZWxldGUgdG9rOwogICAgICByZXNpemVDb2RlKCpjb2RlUHRyKTsKICAgICAgY29kZVsqY29kZVB0cl0udHlwZSA9IHBzT3BlcmF0b3I7CiAgICAgIGNvZGVbKmNvZGVQdHJdLm9wID0gKFBTT3ApYTsKICAgICAgKysqY29kZVB0cjsKICAgIH0KICB9CiAgcmV0dXJuIGdUcnVlOwp9CgpHb29TdHJpbmcgKlBvc3RTY3JpcHRGdW5jdGlvbjo6Z2V0VG9rZW4oU3RyZWFtICpzdHIpIHsKICBHb29TdHJpbmcgKnM7CiAgaW50IGM7CiAgR0Jvb2wgY29tbWVudDsKCiAgcyA9IG5ldyBHb29TdHJpbmcoKTsKICBjb21tZW50ID0gZ0ZhbHNlOwogIHdoaWxlICgxKSB7CiAgICBpZiAoKGMgPSBzdHItPmdldENoYXIoKSkgPT0gRU9GKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgY29kZVN0cmluZy0+YXBwZW5kKGMpOwogICAgaWYgKGNvbW1lbnQpIHsKICAgICAgaWYgKGMgPT0gJ1x4MGEnIHx8IGMgPT0gJ1x4MGQnKSB7Cgljb21tZW50ID0gZ0ZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGMgPT0gJyUnKSB7CiAgICAgIGNvbW1lbnQgPSBnVHJ1ZTsKICAgIH0gZWxzZSBpZiAoIWlzc3BhY2UoYykpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChjID09ICd7JyB8fCBjID09ICd9JykgewogICAgcy0+YXBwZW5kKChjaGFyKWMpOwogIH0gZWxzZSBpZiAoaXNkaWdpdChjKSB8fCBjID09ICcuJyB8fCBjID09ICctJykgewogICAgd2hpbGUgKDEpIHsKICAgICAgcy0+YXBwZW5kKChjaGFyKWMpOwogICAgICBjID0gc3RyLT5sb29rQ2hhcigpOwogICAgICBpZiAoYyA9PSBFT0YgfHwgIShpc2RpZ2l0KGMpIHx8IGMgPT0gJy4nIHx8IGMgPT0gJy0nKSkgewoJYnJlYWs7CiAgICAgIH0KICAgICAgc3RyLT5nZXRDaGFyKCk7CiAgICAgIGNvZGVTdHJpbmctPmFwcGVuZChjKTsKICAgIH0KICB9IGVsc2UgewogICAgd2hpbGUgKDEpIHsKICAgICAgcy0+YXBwZW5kKChjaGFyKWMpOwogICAgICBjID0gc3RyLT5sb29rQ2hhcigpOwogICAgICBpZiAoYyA9PSBFT0YgfHwgIWlzYWxudW0oYykpIHsKCWJyZWFrOwogICAgICB9CiAgICAgIHN0ci0+Z2V0Q2hhcigpOwogICAgICBjb2RlU3RyaW5nLT5hcHBlbmQoYyk7CiAgICB9CiAgfQogIHJldHVybiBzOwp9Cgp2b2lkIFBvc3RTY3JpcHRGdW5jdGlvbjo6cmVzaXplQ29kZShpbnQgbmV3U2l6ZSkgewogIGlmIChuZXdTaXplID49IGNvZGVTaXplKSB7CiAgICBjb2RlU2l6ZSArPSA2NDsKICAgIGNvZGUgPSAoUFNPYmplY3QgKilncmVhbGxvY24oY29kZSwgY29kZVNpemUsIHNpemVvZihQU09iamVjdCkpOwogIH0KfQoKdm9pZCBQb3N0U2NyaXB0RnVuY3Rpb246OmV4ZWMoUFNTdGFjayAqc3RhY2ssIGludCBjb2RlUHRyKSB7CiAgaW50IGkxLCBpMjsKICBkb3VibGUgcjEsIHIyLCByZXN1bHQ7CiAgR0Jvb2wgYjEsIGIyOwoKICB3aGlsZSAoMSkgewogICAgc3dpdGNoIChjb2RlW2NvZGVQdHJdLnR5cGUpIHsKICAgIGNhc2UgcHNJbnQ6CiAgICAgIHN0YWNrLT5wdXNoSW50KGNvZGVbY29kZVB0cisrXS5pbnRnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHBzUmVhbDoKICAgICAgc3RhY2stPnB1c2hSZWFsKGNvZGVbY29kZVB0cisrXS5yZWFsKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHBzT3BlcmF0b3I6CiAgICAgIHN3aXRjaCAoY29kZVtjb2RlUHRyKytdLm9wKSB7CiAgICAgIGNhc2UgcHNPcEFiczoKCWlmIChzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaEludChhYnMoc3RhY2stPnBvcEludCgpKSk7Cgl9IGVsc2UgewoJICBzdGFjay0+cHVzaFJlYWwoZmFicyhzdGFjay0+cG9wTnVtKCkpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BBZGQ6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoSW50KGkxICsgaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwocjEgKyByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQW5kOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSAmIGkyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgJiYgYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEF0YW46CglyMiA9IHN0YWNrLT5wb3BOdW0oKTsKCXIxID0gc3RhY2stPnBvcE51bSgpOwoJcmVzdWx0ID0gYXRhbjIocjEsIHIyKSAqIDE4MC4wIC8gTV9QSTsKCWlmIChyZXN1bHQgPCAwKSByZXN1bHQgKz0gMzYwLjA7CglzdGFjay0+cHVzaFJlYWwocmVzdWx0KTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BCaXRzaGlmdDoKCWkyID0gc3RhY2stPnBvcEludCgpOwoJaTEgPSBzdGFjay0+cG9wSW50KCk7CglpZiAoaTIgPiAwKSB7CgkgIHN0YWNrLT5wdXNoSW50KGkxIDw8IGkyKTsKCX0gZWxzZSBpZiAoaTIgPCAwKSB7CgkgIHN0YWNrLT5wdXNoSW50KChpbnQpKChHdWludClpMSA+PiAtaTIpKTsKCX0gZWxzZSB7CgkgIHN0YWNrLT5wdXNoSW50KGkxKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BDZWlsaW5nOgoJaWYgKCFzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaFJlYWwoY2VpbChzdGFjay0+cG9wTnVtKCkpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BDb3B5OgoJc3RhY2stPmNvcHkoc3RhY2stPnBvcEludCgpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BDb3M6CglzdGFjay0+cHVzaFJlYWwoY29zKHN0YWNrLT5wb3BOdW0oKSAqIE1fUEkgLyAxODAuMCkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEN2aToKCWlmICghc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hJbnQoKGludClzdGFjay0+cG9wTnVtKCkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEN2cjoKCWlmICghc3RhY2stPnRvcElzUmVhbCgpKSB7CgkgIHN0YWNrLT5wdXNoUmVhbChzdGFjay0+cG9wTnVtKCkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcERpdjoKCXIyID0gc3RhY2stPnBvcE51bSgpOwoJcjEgPSBzdGFjay0+cG9wTnVtKCk7CglzdGFjay0+cHVzaFJlYWwocjEgLyByMik7CglicmVhazsKICAgICAgY2FzZSBwc09wRHVwOgoJc3RhY2stPmNvcHkoMSk7CglicmVhazsKICAgICAgY2FzZSBwc09wRXE6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA9PSBpMik7Cgl9IGVsc2UgaWYgKHN0YWNrLT50b3BUd29BcmVOdW1zKCkpIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgPT0gcjIpOwoJfSBlbHNlIHsKCSAgYjIgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBiMSA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChiMSA9PSBiMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wRXhjaDoKCXN0YWNrLT5yb2xsKDIsIDEpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEV4cDoKCXIyID0gc3RhY2stPnBvcE51bSgpOwoJcjEgPSBzdGFjay0+cG9wTnVtKCk7CglzdGFjay0+cHVzaFJlYWwocG93KHIxLCByMikpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEZhbHNlOgoJc3RhY2stPnB1c2hCb29sKGdGYWxzZSk7CglicmVhazsKICAgICAgY2FzZSBwc09wRmxvb3I6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoUmVhbChmbG9vcihzdGFjay0+cG9wTnVtKCkpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BHZToKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxID49IGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxID49IHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BHdDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxID4gaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgPiByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wSWRpdjoKCWkyID0gc3RhY2stPnBvcEludCgpOwoJaTEgPSBzdGFjay0+cG9wSW50KCk7CglzdGFjay0+cHVzaEludChpMSAvIGkyKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BJbmRleDoKCXN0YWNrLT5pbmRleChzdGFjay0+cG9wSW50KCkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcExlOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgPD0gaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgPD0gcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcExuOgoJc3RhY2stPnB1c2hSZWFsKGxvZyhzdGFjay0+cG9wTnVtKCkpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BMb2c6CglzdGFjay0+cHVzaFJlYWwobG9nMTAoc3RhY2stPnBvcE51bSgpKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wTHQ6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA8IGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxIDwgcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE1vZDoKCWkyID0gc3RhY2stPnBvcEludCgpOwoJaTEgPSBzdGFjay0+cG9wSW50KCk7CglzdGFjay0+cHVzaEludChpMSAlIGkyKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BNdWw6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIC8vfiBzaG91bGQgY2hlY2sgZm9yIG91dC1vZi1yYW5nZSwgYW5kIHB1c2ggYSByZWFsIGluc3RlYWQKCSAgc3RhY2stPnB1c2hJbnQoaTEgKiBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoUmVhbChyMSAqIHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BOZToKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxICE9IGkyKTsKCX0gZWxzZSBpZiAoc3RhY2stPnRvcFR3b0FyZU51bXMoKSkgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSAhPSByMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxICE9IGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BOZWc6CglpZiAoc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hJbnQoLXN0YWNrLT5wb3BJbnQoKSk7Cgl9IGVsc2UgewoJICBzdGFjay0+cHVzaFJlYWwoLXN0YWNrLT5wb3BOdW0oKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wTm90OgoJaWYgKHN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoSW50KH5zdGFjay0+cG9wSW50KCkpOwoJfSBlbHNlIHsKCSAgc3RhY2stPnB1c2hCb29sKCFzdGFjay0+cG9wQm9vbCgpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BPcjoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgfCBpMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxIHx8IGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BQb3A6CglzdGFjay0+cG9wKCk7CglicmVhazsKICAgICAgY2FzZSBwc09wUm9sbDoKCWkyID0gc3RhY2stPnBvcEludCgpOwoJaTEgPSBzdGFjay0+cG9wSW50KCk7CglzdGFjay0+cm9sbChpMSwgaTIpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFJvdW5kOgoJaWYgKCFzdGFjay0+dG9wSXNJbnQoKSkgewoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKChyMSA+PSAwKSA/IGZsb29yKHIxICsgMC41KSA6IGNlaWwocjEgLSAwLjUpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BTaW46CglzdGFjay0+cHVzaFJlYWwoc2luKHN0YWNrLT5wb3BOdW0oKSAqIE1fUEkgLyAxODAuMCkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFNxcnQ6CglzdGFjay0+cHVzaFJlYWwoc3FydChzdGFjay0+cG9wTnVtKCkpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BTdWI6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoSW50KGkxIC0gaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwocjEgLSByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wVHJ1ZToKCXN0YWNrLT5wdXNoQm9vbChnVHJ1ZSk7CglicmVhazsKICAgICAgY2FzZSBwc09wVHJ1bmNhdGU6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwoKHIxID49IDApID8gZmxvb3IocjEpIDogY2VpbChyMSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFhvcjoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgXiBpMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxIF4gYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcElmOgoJYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJaWYgKGIxKSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVQdHIgKyAyKTsKCX0KCWNvZGVQdHIgPSBjb2RlW2NvZGVQdHIgKyAxXS5ibGs7CglicmVhazsKICAgICAgY2FzZSBwc09wSWZlbHNlOgoJYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJaWYgKGIxKSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVQdHIgKyAyKTsKCX0gZWxzZSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVbY29kZVB0cl0uYmxrKTsKCX0KCWNvZGVQdHIgPSBjb2RlW2NvZGVQdHIgKyAxXS5ibGs7CglicmVhazsKICAgICAgY2FzZSBwc09wUmV0dXJuOgoJcmV0dXJuOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSW50ZXJuYWw6IGJhZCBvYmplY3QgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiBjb2RlIik7CiAgICAgIGJyZWFrOwogICAgfQogIH0KfQo=