Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRnVuY3Rpb24uY2MKLy8KLy8gQ29weXJpZ2h0IDIwMDEtMjAwMyBHbHlwaCAmIENvZywgTExDCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4LTIwMTAgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAwNiBKZWZmIE11aXplbGFhciA8amVmZkBpbmZpZGlnbS5uZXQ+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBDaHJpc3RpYW4gRmV1ZXJz5G5nZXIgPGNmZXVlcnNhZW5nZXJAZ29vZ2xlbWFpbC5jb20+Ci8vCi8vIFRvIHNlZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2VzIHBsZWFzZSBzZWUgdGhlIENoYW5nZWxvZyBmaWxlIHRoYXQKLy8gY2FtZSB3aXRoIHlvdXIgdGFyYmFsbCBvciB0eXBlIG1ha2UgQ2hhbmdlTG9nIGlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBnaXQKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlIDxjb25maWcuaD4KCiNpZmRlZiBVU0VfR0NDX1BSQUdNQVMKI3ByYWdtYSBpbXBsZW1lbnRhdGlvbgojZW5kaWYKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgImdvby9nbWVtLmgiCiNpbmNsdWRlICJnb28vZ3N0cnRvZC5oIgojaW5jbHVkZSAiT2JqZWN0LmgiCiNpbmNsdWRlICJEaWN0LmgiCiNpbmNsdWRlICJTdHJlYW0uaCIKI2luY2x1ZGUgIkVycm9yLmgiCiNpbmNsdWRlICJGdW5jdGlvbi5oIgojaW5jbHVkZSAiUG9wcGxlckNhY2hlLmgiCgojaWZuZGVmIE1fUEkKI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKI2VuZGlmCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRnVuY3Rpb246OkZ1bmN0aW9uKCkgewp9CgpGdW5jdGlvbjo6fkZ1bmN0aW9uKCkgewp9CgpGdW5jdGlvbiAqRnVuY3Rpb246OnBhcnNlKE9iamVjdCAqZnVuY09iaikgewogIHN0ZDo6c2V0PGludD4gdXNlZFBhcmVudHM7CiAgcmV0dXJuIHBhcnNlKGZ1bmNPYmosICZ1c2VkUGFyZW50cyk7Cn0KCkZ1bmN0aW9uICpGdW5jdGlvbjo6cGFyc2UoT2JqZWN0ICpmdW5jT2JqLCBzdGQ6OnNldDxpbnQ+ICp1c2VkUGFyZW50cykgewogIEZ1bmN0aW9uICpmdW5jOwogIERpY3QgKmRpY3Q7CiAgaW50IGZ1bmNUeXBlOwogIE9iamVjdCBvYmoxOwoKICBpZiAoZnVuY09iai0+aXNTdHJlYW0oKSkgewogICAgZGljdCA9IGZ1bmNPYmotPnN0cmVhbUdldERpY3QoKTsKICB9IGVsc2UgaWYgKGZ1bmNPYmotPmlzRGljdCgpKSB7CiAgICBkaWN0ID0gZnVuY09iai0+Z2V0RGljdCgpOwogIH0gZWxzZSBpZiAoZnVuY09iai0+aXNOYW1lKCJJZGVudGl0eSIpKSB7CiAgICByZXR1cm4gbmV3IElkZW50aXR5RnVuY3Rpb24oKTsKICB9IGVsc2UgewogICAgZXJyb3IoLTEsICJFeHBlY3RlZCBmdW5jdGlvbiBkaWN0aW9uYXJ5IG9yIHN0cmVhbSIpOwogICAgcmV0dXJuIE5VTEw7CiAgfQoKICBpZiAoIWRpY3QtPmxvb2t1cCgiRnVuY3Rpb25UeXBlIiwgJm9iajEpLT5pc0ludCgpKSB7CiAgICBlcnJvcigtMSwgIkZ1bmN0aW9uIHR5cGUgaXMgbWlzc2luZyBvciB3cm9uZyB0eXBlIik7CiAgICBvYmoxLmZyZWUoKTsKICAgIHJldHVybiBOVUxMOwogIH0KICBmdW5jVHlwZSA9IG9iajEuZ2V0SW50KCk7CiAgb2JqMS5mcmVlKCk7CgogIGlmIChmdW5jVHlwZSA9PSAwKSB7CiAgICBmdW5jID0gbmV3IFNhbXBsZWRGdW5jdGlvbihmdW5jT2JqLCBkaWN0KTsKICB9IGVsc2UgaWYgKGZ1bmNUeXBlID09IDIpIHsKICAgIGZ1bmMgPSBuZXcgRXhwb25lbnRpYWxGdW5jdGlvbihmdW5jT2JqLCBkaWN0KTsKICB9IGVsc2UgaWYgKGZ1bmNUeXBlID09IDMpIHsKICAgIGZ1bmMgPSBuZXcgU3RpdGNoaW5nRnVuY3Rpb24oZnVuY09iaiwgZGljdCwgdXNlZFBhcmVudHMpOwogIH0gZWxzZSBpZiAoZnVuY1R5cGUgPT0gNCkgewogICAgZnVuYyA9IG5ldyBQb3N0U2NyaXB0RnVuY3Rpb24oZnVuY09iaiwgZGljdCk7CiAgfSBlbHNlIHsKICAgIGVycm9yKC0xLCAiVW5pbXBsZW1lbnRlZCBmdW5jdGlvbiB0eXBlICglZCkiLCBmdW5jVHlwZSk7CiAgICByZXR1cm4gTlVMTDsKICB9CiAgaWYgKCFmdW5jLT5pc09rKCkpIHsKICAgIGRlbGV0ZSBmdW5jOwogICAgcmV0dXJuIE5VTEw7CiAgfQoKICByZXR1cm4gZnVuYzsKfQoKR0Jvb2wgRnVuY3Rpb246OmluaXQoRGljdCAqZGljdCkgewogIE9iamVjdCBvYmoxLCBvYmoyOwogIGludCBpOwoKICAvLy0tLS0tIERvbWFpbgogIGlmICghZGljdC0+bG9va3VwKCJEb21haW4iLCAmb2JqMSktPmlzQXJyYXkoKSkgewogICAgZXJyb3IoLTEsICJGdW5jdGlvbiBpcyBtaXNzaW5nIGRvbWFpbiIpOwogICAgZ290byBlcnIyOwogIH0KICBtID0gb2JqMS5hcnJheUdldExlbmd0aCgpIC8gMjsKICBpZiAobSA+IGZ1bmNNYXhJbnB1dHMpIHsKICAgIGVycm9yKC0xLCAiRnVuY3Rpb25zIHdpdGggbW9yZSB0aGFuICVkIGlucHV0cyBhcmUgdW5zdXBwb3J0ZWQiLAoJICBmdW5jTWF4SW5wdXRzKTsKICAgIGdvdG8gZXJyMjsKICB9CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgb2JqMS5hcnJheUdldCgyKmksICZvYmoyKTsKICAgIGlmICghb2JqMi5pc051bSgpKSB7CiAgICAgIGVycm9yKC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkb21haW4gYXJyYXkiKTsKICAgICAgZ290byBlcnIxOwogICAgfQogICAgZG9tYWluW2ldWzBdID0gb2JqMi5nZXROdW0oKTsKICAgIG9iajIuZnJlZSgpOwogICAgb2JqMS5hcnJheUdldCgyKmkrMSwgJm9iajIpOwogICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKICAgICAgZXJyb3IoLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGRvbWFpbiBhcnJheSIpOwogICAgICBnb3RvIGVycjE7CiAgICB9CiAgICBkb21haW5baV1bMV0gPSBvYmoyLmdldE51bSgpOwogICAgb2JqMi5mcmVlKCk7CiAgfQogIG9iajEuZnJlZSgpOwoKICAvLy0tLS0tIFJhbmdlCiAgaGFzUmFuZ2UgPSBnRmFsc2U7CiAgbiA9IDA7CiAgaWYgKGRpY3QtPmxvb2t1cCgiUmFuZ2UiLCAmb2JqMSktPmlzQXJyYXkoKSkgewogICAgaGFzUmFuZ2UgPSBnVHJ1ZTsKICAgIG4gPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgLyAyOwogICAgaWYgKG4gPiBmdW5jTWF4T3V0cHV0cykgewogICAgICBlcnJvcigtMSwgIkZ1bmN0aW9ucyB3aXRoIG1vcmUgdGhhbiAlZCBvdXRwdXRzIGFyZSB1bnN1cHBvcnRlZCIsCgkgICAgZnVuY01heE91dHB1dHMpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG9iajEuYXJyYXlHZXQoMippLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcigtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gcmFuZ2UgYXJyYXkiKTsKCWdvdG8gZXJyMTsKICAgICAgfQogICAgICByYW5nZVtpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgICBvYmoxLmFycmF5R2V0KDIqaSsxLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcigtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gcmFuZ2UgYXJyYXkiKTsKCWdvdG8gZXJyMTsKICAgICAgfQogICAgICByYW5nZVtpXVsxXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgfQogIH0KICBvYmoxLmZyZWUoKTsKCiAgcmV0dXJuIGdUcnVlOwoKIGVycjE6CiAgb2JqMi5mcmVlKCk7CiBlcnIyOgogIG9iajEuZnJlZSgpOwogIHJldHVybiBnRmFsc2U7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIElkZW50aXR5RnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklkZW50aXR5RnVuY3Rpb246OklkZW50aXR5RnVuY3Rpb24oKSB7CiAgaW50IGk7CgogIC8vIGZpbGwgdGhlc2UgaW4gd2l0aCBhcmJpdHJhcnkgdmFsdWVzIGp1c3QgaW4gY2FzZSB0aGV5IGdldCB1c2VkCiAgLy8gc29tZXdoZXJlCiAgbSA9IGZ1bmNNYXhJbnB1dHM7CiAgbiA9IGZ1bmNNYXhPdXRwdXRzOwogIGZvciAoaSA9IDA7IGkgPCBmdW5jTWF4SW5wdXRzOyArK2kpIHsKICAgIGRvbWFpbltpXVswXSA9IDA7CiAgICBkb21haW5baV1bMV0gPSAxOwogIH0KICBoYXNSYW5nZSA9IGdGYWxzZTsKfQoKSWRlbnRpdHlGdW5jdGlvbjo6fklkZW50aXR5RnVuY3Rpb24oKSB7Cn0KCnZvaWQgSWRlbnRpdHlGdW5jdGlvbjo6dHJhbnNmb3JtKGRvdWJsZSAqaW4sIGRvdWJsZSAqb3V0KSB7CiAgaW50IGk7CgogIGZvciAoaSA9IDA7IGkgPCBmdW5jTWF4T3V0cHV0czsgKytpKSB7CiAgICBvdXRbaV0gPSBpbltpXTsKICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNhbXBsZWRGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU2FtcGxlZEZ1bmN0aW9uOjpTYW1wbGVkRnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0KSB7CiAgU3RyZWFtICpzdHI7CiAgaW50IHNhbXBsZUJpdHM7CiAgZG91YmxlIHNhbXBsZU11bDsKICBPYmplY3Qgb2JqMSwgb2JqMjsKICBHdWludCBidWYsIGJpdE1hc2s7CiAgaW50IGJpdHM7CiAgR3VpbnQgczsKICBpbnQgaTsKCiAgc2FtcGxlcyA9IE5VTEw7CiAgc0J1ZiA9IE5VTEw7CiAgb2sgPSBnRmFsc2U7CgogIC8vLS0tLS0gaW5pdGlhbGl6ZSB0aGUgZ2VuZXJpYyBzdHVmZgogIGlmICghaW5pdChkaWN0KSkgewogICAgZ290byBlcnIxOwogIH0KICBpZiAoIWhhc1JhbmdlKSB7CiAgICBlcnJvcigtMSwgIlR5cGUgMCBmdW5jdGlvbiBpcyBtaXNzaW5nIHJhbmdlIik7CiAgICBnb3RvIGVycjE7CiAgfQogIGlmIChtID4gc2FtcGxlZEZ1bmNNYXhJbnB1dHMpIHsKICAgIGVycm9yKC0xLCAiU2FtcGxlZCBmdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gJWQgaW5wdXRzIGFyZSB1bnN1cHBvcnRlZCIsCgkgIHNhbXBsZWRGdW5jTWF4SW5wdXRzKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gYnVmZmVyCiAgc0J1ZiA9IChkb3VibGUgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihkb3VibGUpKTsKCiAgLy8tLS0tLSBnZXQgdGhlIHN0cmVhbQogIGlmICghZnVuY09iai0+aXNTdHJlYW0oKSkgewogICAgZXJyb3IoLTEsICJUeXBlIDAgZnVuY3Rpb24gaXNuJ3QgYSBzdHJlYW0iKTsKICAgIGdvdG8gZXJyMTsKICB9CiAgc3RyID0gZnVuY09iai0+Z2V0U3RyZWFtKCk7CgogIC8vLS0tLS0gU2l6ZQogIGlmICghZGljdC0+bG9va3VwKCJTaXplIiwgJm9iajEpLT5pc0FycmF5KCkgfHwKICAgICAgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IG0pIHsKICAgIGVycm9yKC0xLCAiRnVuY3Rpb24gaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBzaXplIGFycmF5Iik7CiAgICBnb3RvIGVycjI7CiAgfQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIG9iajEuYXJyYXlHZXQoaSwgJm9iajIpOwogICAgaWYgKCFvYmoyLmlzSW50KCkpIHsKICAgICAgZXJyb3IoLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIHNpemUgYXJyYXkiKTsKICAgICAgZ290byBlcnIzOwogICAgfQogICAgc2FtcGxlU2l6ZVtpXSA9IG9iajIuZ2V0SW50KCk7CiAgICBvYmoyLmZyZWUoKTsKICB9CiAgb2JqMS5mcmVlKCk7CiAgaWR4TXVsWzBdID0gbjsKICBmb3IgKGkgPSAxOyBpIDwgbTsgKytpKSB7CiAgICBpZHhNdWxbaV0gPSBpZHhNdWxbaS0xXSAqIHNhbXBsZVNpemVbaS0xXTsKICB9CgogIC8vLS0tLS0gQml0c1BlclNhbXBsZQogIGlmICghZGljdC0+bG9va3VwKCJCaXRzUGVyU2FtcGxlIiwgJm9iajEpLT5pc0ludCgpKSB7CiAgICBlcnJvcigtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgQml0c1BlclNhbXBsZSIpOwogICAgZ290byBlcnIyOwogIH0KICBzYW1wbGVCaXRzID0gb2JqMS5nZXRJbnQoKTsKICBzYW1wbGVNdWwgPSAxLjAgLyAocG93KDIuMCwgKGRvdWJsZSlzYW1wbGVCaXRzKSAtIDEpOwogIG9iajEuZnJlZSgpOwoKICAvLy0tLS0tIEVuY29kZQogIGlmIChkaWN0LT5sb29rdXAoIkVuY29kZSIsICZvYmoxKS0+aXNBcnJheSgpICYmCiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSA9PSAyKm0pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgICAgb2JqMS5hcnJheUdldCgyKmksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBlbmNvZGUgYXJyYXkiKTsKCWdvdG8gZXJyMzsKICAgICAgfQogICAgICBlbmNvZGVbaV1bMF0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgICAgb2JqMS5hcnJheUdldCgyKmkrMSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGVuY29kZSBhcnJheSIpOwoJZ290byBlcnIzOwogICAgICB9CiAgICAgIGVuY29kZVtpXVsxXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgIGVuY29kZVtpXVswXSA9IDA7CiAgICAgIGVuY29kZVtpXVsxXSA9IHNhbXBsZVNpemVbaV0gLSAxOwogICAgfQogIH0KICBvYmoxLmZyZWUoKTsKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpbnB1dE11bFtpXSA9IChlbmNvZGVbaV1bMV0gLSBlbmNvZGVbaV1bMF0pIC8KICAgICAgICAgICAgICAgICAgKGRvbWFpbltpXVsxXSAtIGRvbWFpbltpXVswXSk7CiAgfQoKICAvLy0tLS0tIERlY29kZQogIGlmIChkaWN0LT5sb29rdXAoIkRlY29kZSIsICZvYmoxKS0+aXNBcnJheSgpICYmCiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSA9PSAyKm4pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb2JqMS5hcnJheUdldCgyKmksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkZWNvZGUgYXJyYXkiKTsKCWdvdG8gZXJyMzsKICAgICAgfQogICAgICBkZWNvZGVbaV1bMF0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgICAgb2JqMS5hcnJheUdldCgyKmkrMSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGRlY29kZSBhcnJheSIpOwoJZ290byBlcnIzOwogICAgICB9CiAgICAgIGRlY29kZVtpXVsxXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGRlY29kZVtpXVswXSA9IHJhbmdlW2ldWzBdOwogICAgICBkZWNvZGVbaV1bMV0gPSByYW5nZVtpXVsxXTsKICAgIH0KICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gc2FtcGxlcwogIG5TYW1wbGVzID0gbjsKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKQogICAgblNhbXBsZXMgKj0gc2FtcGxlU2l6ZVtpXTsKICBzYW1wbGVzID0gKGRvdWJsZSAqKWdtYWxsb2NuKG5TYW1wbGVzLCBzaXplb2YoZG91YmxlKSk7CiAgYnVmID0gMDsKICBiaXRzID0gMDsKICBiaXRNYXNrID0gKDEgPDwgc2FtcGxlQml0cykgLSAxOwogIHN0ci0+cmVzZXQoKTsKICBmb3IgKGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgaWYgKHNhbXBsZUJpdHMgPT0gOCkgewogICAgICBzID0gc3RyLT5nZXRDaGFyKCk7CiAgICB9IGVsc2UgaWYgKHNhbXBsZUJpdHMgPT0gMTYpIHsKICAgICAgcyA9IHN0ci0+Z2V0Q2hhcigpOwogICAgICBzID0gKHMgPDwgOCkgKyBzdHItPmdldENoYXIoKTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlQml0cyA9PSAzMikgewogICAgICBzID0gc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgICBzID0gKHMgPDwgOCkgKyBzdHItPmdldENoYXIoKTsKICAgICAgcyA9IChzIDw8IDgpICsgc3RyLT5nZXRDaGFyKCk7CiAgICB9IGVsc2UgewogICAgICB3aGlsZSAoYml0cyA8IHNhbXBsZUJpdHMpIHsKCWJ1ZiA9IChidWYgPDwgOCkgfCAoc3RyLT5nZXRDaGFyKCkgJiAweGZmKTsKCWJpdHMgKz0gODsKICAgICAgfQogICAgICBzID0gKGJ1ZiA+PiAoYml0cyAtIHNhbXBsZUJpdHMpKSAmIGJpdE1hc2s7CiAgICAgIGJpdHMgLT0gc2FtcGxlQml0czsKICAgIH0KICAgIHNhbXBsZXNbaV0gPSAoZG91YmxlKXMgKiBzYW1wbGVNdWw7CiAgfQogIHN0ci0+Y2xvc2UoKTsKCiAgb2sgPSBnVHJ1ZTsKICByZXR1cm47CgogZXJyMzoKICBvYmoyLmZyZWUoKTsKIGVycjI6CiAgb2JqMS5mcmVlKCk7CiBlcnIxOgogIHJldHVybjsKfQoKU2FtcGxlZEZ1bmN0aW9uOjp+U2FtcGxlZEZ1bmN0aW9uKCkgewogIGlmIChzYW1wbGVzKSB7CiAgICBnZnJlZShzYW1wbGVzKTsKICB9CiAgaWYgKHNCdWYpIHsKICAgIGdmcmVlKHNCdWYpOwogIH0KfQoKU2FtcGxlZEZ1bmN0aW9uOjpTYW1wbGVkRnVuY3Rpb24oU2FtcGxlZEZ1bmN0aW9uICpmdW5jKSB7CiAgbWVtY3B5KHRoaXMsIGZ1bmMsIHNpemVvZihTYW1wbGVkRnVuY3Rpb24pKTsKICBzYW1wbGVzID0gKGRvdWJsZSAqKWdtYWxsb2NuKG5TYW1wbGVzLCBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KHNhbXBsZXMsIGZ1bmMtPnNhbXBsZXMsIG5TYW1wbGVzICogc2l6ZW9mKGRvdWJsZSkpOwogIHNCdWYgPSAoZG91YmxlICopZ21hbGxvY24oMSA8PCBtLCBzaXplb2YoZG91YmxlKSk7Cn0KCnZvaWQgU2FtcGxlZEZ1bmN0aW9uOjp0cmFuc2Zvcm0oZG91YmxlICppbiwgZG91YmxlICpvdXQpIHsKICBkb3VibGUgeDsKICBpbnQgZVtmdW5jTWF4SW5wdXRzXVsyXTsKICBkb3VibGUgZWZyYWMwW2Z1bmNNYXhJbnB1dHNdOwogIGRvdWJsZSBlZnJhYzFbZnVuY01heElucHV0c107CiAgaW50IGksIGosIGssIGlkeCwgdDsKCiAgLy8gbWFwIGlucHV0IHZhbHVlcyBpbnRvIHNhbXBsZSBhcnJheQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIHggPSAoaW5baV0gLSBkb21haW5baV1bMF0pICogaW5wdXRNdWxbaV0gKyBlbmNvZGVbaV1bMF07CiAgICBpZiAoeCA8IDApIHsKICAgICAgeCA9IDA7CiAgICB9IGVsc2UgaWYgKHggPiBzYW1wbGVTaXplW2ldIC0gMSkgewogICAgICB4ID0gc2FtcGxlU2l6ZVtpXSAtIDE7CiAgICB9CiAgICBlW2ldWzBdID0gKGludCl4OwogICAgaWYgKChlW2ldWzFdID0gZVtpXVswXSArIDEpID49IHNhbXBsZVNpemVbaV0pIHsKICAgICAgLy8gdGhpcyBoYXBwZW5zIGlmIGluW2ldID0gZG9tYWluW2ldWzFdCiAgICAgIGVbaV1bMV0gPSBlW2ldWzBdOwogICAgfQogICAgZWZyYWMxW2ldID0geCAtIGVbaV1bMF07CiAgICBlZnJhYzBbaV0gPSAxIC0gZWZyYWMxW2ldOwogIH0KCiAgLy8gZm9yIGVhY2ggb3V0cHV0LCBkbyBtLWxpbmVhciBpbnRlcnBvbGF0aW9uCiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewoKICAgIC8vIHB1bGwgMl5tIHZhbHVlcyBvdXQgb2YgdGhlIHNhbXBsZSBhcnJheQogICAgZm9yIChqID0gMDsgaiA8ICgxPDxtKTsgKytqKSB7CiAgICAgIGlkeCA9IGk7CiAgICAgIGZvciAoayA9IDAsIHQgPSBqOyBrIDwgbTsgKytrLCB0ID4+PSAxKSB7CglpZHggKz0gaWR4TXVsW2tdICogKGVba11bdCAmIDFdKTsKICAgICAgfQogICAgICBpZiAobGlrZWx5KGlkeCA+PSAwICYmIGlkeCA8IG5TYW1wbGVzKSkgewogICAgICAgIHNCdWZbal0gPSBzYW1wbGVzW2lkeF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc0J1ZltqXSA9IDA7IC8vIFRPRE8gSW52ZXN0aWdhdGUgaWYgdGhpcyBpcyB3aGF0IEFkb2JlIGRvZXMKICAgICAgfQogICAgfQoKICAgIC8vIGRvIG0gc2V0cyBvZiBpbnRlcnBvbGF0aW9ucwogICAgZm9yIChqID0gMCwgdCA9ICgxPDxtKTsgaiA8IG07ICsraiwgdCA+Pj0gMSkgewogICAgICBmb3IgKGsgPSAwOyBrIDwgdDsgayArPSAyKSB7CglzQnVmW2sgPj4gMV0gPSBlZnJhYzBbal0gKiBzQnVmW2tdICsgZWZyYWMxW2pdICogc0J1ZltrKzFdOwogICAgICB9CiAgICB9CgogICAgLy8gbWFwIG91dHB1dCB2YWx1ZSB0byByYW5nZQogICAgb3V0W2ldID0gc0J1ZlswXSAqIChkZWNvZGVbaV1bMV0gLSBkZWNvZGVbaV1bMF0pICsgZGVjb2RlW2ldWzBdOwogICAgaWYgKG91dFtpXSA8IHJhbmdlW2ldWzBdKSB7CiAgICAgIG91dFtpXSA9IHJhbmdlW2ldWzBdOwogICAgfSBlbHNlIGlmIChvdXRbaV0gPiByYW5nZVtpXVsxXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVsxXTsKICAgIH0KICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEV4cG9uZW50aWFsRnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkV4cG9uZW50aWFsRnVuY3Rpb246OkV4cG9uZW50aWFsRnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0KSB7CiAgT2JqZWN0IG9iajEsIG9iajI7CiAgaW50IGk7CgogIG9rID0gZ0ZhbHNlOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIGdvdG8gZXJyMTsKICB9CiAgaWYgKG0gIT0gMSkgewogICAgZXJyb3IoLTEsICJFeHBvbmVudGlhbCBmdW5jdGlvbiB3aXRoIG1vcmUgdGhhbiBvbmUgaW5wdXQiKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gQzAKICBpZiAoZGljdC0+bG9va3VwKCJDMCIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBpZiAoaGFzUmFuZ2UgJiYgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IG4pIHsKICAgICAgZXJyb3IoLTEsICJGdW5jdGlvbidzIEMwIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBuID0gb2JqMS5hcnJheUdldExlbmd0aCgpOwogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvYmoxLmFycmF5R2V0KGksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBDMCBhcnJheSIpOwoJZ290byBlcnIzOwogICAgICB9CiAgICAgIGMwW2ldID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmIChoYXNSYW5nZSAmJiBuICE9IDEpIHsKICAgICAgZXJyb3IoLTEsICJGdW5jdGlvbidzIEMwIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBuID0gMTsKICAgIGMwWzBdID0gMDsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gQzEKICBpZiAoZGljdC0+bG9va3VwKCJDMSIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBpZiAob2JqMS5hcnJheUdldExlbmd0aCgpICE9IG4pIHsKICAgICAgZXJyb3IoLTEsICJGdW5jdGlvbidzIEMxIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG9iajEuYXJyYXlHZXQoaSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIEMxIGFycmF5Iik7Cglnb3RvIGVycjM7CiAgICAgIH0KICAgICAgYzFbaV0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKG4gIT0gMSkgewogICAgICBlcnJvcigtMSwgIkZ1bmN0aW9uJ3MgQzEgYXJyYXkgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIGMxWzBdID0gMTsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gTiAoZXhwb25lbnQpCiAgaWYgKCFkaWN0LT5sb29rdXAoIk4iLCAmb2JqMSktPmlzTnVtKCkpIHsKICAgIGVycm9yKC0xLCAiRnVuY3Rpb24gaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBOIik7CiAgICBnb3RvIGVycjI7CiAgfQogIGUgPSBvYmoxLmdldE51bSgpOwogIG9iajEuZnJlZSgpOwoKICBpc0xpbmVhciA9IGZhYnMoZS0xLikgPCAxZS0xMDsKICBvayA9IGdUcnVlOwogIHJldHVybjsKCiBlcnIzOgogIG9iajIuZnJlZSgpOwogZXJyMjoKICBvYmoxLmZyZWUoKTsKIGVycjE6CiAgcmV0dXJuOwp9CgpFeHBvbmVudGlhbEZ1bmN0aW9uOjp+RXhwb25lbnRpYWxGdW5jdGlvbigpIHsKfQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6RXhwb25lbnRpYWxGdW5jdGlvbihFeHBvbmVudGlhbEZ1bmN0aW9uICpmdW5jKSB7CiAgbWVtY3B5KHRoaXMsIGZ1bmMsIHNpemVvZihFeHBvbmVudGlhbEZ1bmN0aW9uKSk7Cn0KCnZvaWQgRXhwb25lbnRpYWxGdW5jdGlvbjo6dHJhbnNmb3JtKGRvdWJsZSAqaW4sIGRvdWJsZSAqb3V0KSB7CiAgZG91YmxlIHg7CiAgaW50IGk7CgogIGlmIChpblswXSA8IGRvbWFpblswXVswXSkgewogICAgeCA9IGRvbWFpblswXVswXTsKICB9IGVsc2UgaWYgKGluWzBdID4gZG9tYWluWzBdWzFdKSB7CiAgICB4ID0gZG9tYWluWzBdWzFdOwogIH0gZWxzZSB7CiAgICB4ID0gaW5bMF07CiAgfQogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIG91dFtpXSA9IGMwW2ldICsgKGlzTGluZWFyID8geCA6IHBvdyh4LCBlKSkgKiAoYzFbaV0gLSBjMFtpXSk7CiAgICBpZiAoaGFzUmFuZ2UpIHsKICAgICAgaWYgKG91dFtpXSA8IHJhbmdlW2ldWzBdKSB7CglvdXRbaV0gPSByYW5nZVtpXVswXTsKICAgICAgfSBlbHNlIGlmIChvdXRbaV0gPiByYW5nZVtpXVsxXSkgewoJb3V0W2ldID0gcmFuZ2VbaV1bMV07CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTdGl0Y2hpbmdGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU3RpdGNoaW5nRnVuY3Rpb246OlN0aXRjaGluZ0Z1bmN0aW9uKE9iamVjdCAqZnVuY09iaiwgRGljdCAqZGljdCwgc3RkOjpzZXQ8aW50PiAqdXNlZFBhcmVudHMpIHsKICBPYmplY3Qgb2JqMSwgb2JqMjsKICBpbnQgaTsKCiAgb2sgPSBnRmFsc2U7CiAgZnVuY3MgPSBOVUxMOwogIGJvdW5kcyA9IE5VTEw7CiAgZW5jb2RlID0gTlVMTDsKICBzY2FsZSA9IE5VTEw7CgogIC8vLS0tLS0gaW5pdGlhbGl6ZSB0aGUgZ2VuZXJpYyBzdHVmZgogIGlmICghaW5pdChkaWN0KSkgewogICAgZ290byBlcnIxOwogIH0KICBpZiAobSAhPSAxKSB7CiAgICBlcnJvcigtMSwgIlN0aXRjaGluZyBmdW5jdGlvbiB3aXRoIG1vcmUgdGhhbiBvbmUgaW5wdXQiKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gRnVuY3Rpb25zCiAgaWYgKCFkaWN0LT5sb29rdXAoIkZ1bmN0aW9ucyIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBlcnJvcigtMSwgIk1pc3NpbmcgJ0Z1bmN0aW9ucycgZW50cnkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICBnb3RvIGVycjE7CiAgfQogIGsgPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCk7CiAgZnVuY3MgPSAoRnVuY3Rpb24gKiopZ21hbGxvY24oaywgc2l6ZW9mKEZ1bmN0aW9uICopKTsKICBib3VuZHMgPSAoZG91YmxlICopZ21hbGxvY24oayArIDEsIHNpemVvZihkb3VibGUpKTsKICBlbmNvZGUgPSAoZG91YmxlICopZ21hbGxvY24oMiAqIGssIHNpemVvZihkb3VibGUpKTsKICBzY2FsZSA9IChkb3VibGUgKilnbWFsbG9jbihrLCBzaXplb2YoZG91YmxlKSk7CiAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgZnVuY3NbaV0gPSBOVUxMOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBzdGQ6OnNldDxpbnQ+IHVzZWRQYXJlbnRzQXV4ID0gKnVzZWRQYXJlbnRzOwogICAgb2JqMS5hcnJheUdldE5GKGksICZvYmoyKTsKICAgIGlmIChvYmoyLmlzUmVmKCkpIHsKICAgICAgY29uc3QgUmVmIHJlZiA9IG9iajIuZ2V0UmVmKCk7CiAgICAgIGlmICh1c2VkUGFyZW50c0F1eC5maW5kKHJlZi5udW0pID09IHVzZWRQYXJlbnRzQXV4LmVuZCgpKSB7CiAgICAgICAgdXNlZFBhcmVudHNBdXguaW5zZXJ0KHJlZi5udW0pOwogICAgICAgIG9iajIuZnJlZSgpOwogICAgICAgIG9iajEuYXJyYXlHZXQoaSwgJm9iajIpOwogICAgICB9IGVsc2UgewogICAgICAgIGdvdG8gZXJyMjsKICAgICAgfQogICAgfQogICAgaWYgKCEoZnVuY3NbaV0gPSBGdW5jdGlvbjo6cGFyc2UoJm9iajIsICZ1c2VkUGFyZW50c0F1eCkpKSB7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIGlmIChpID4gMCAmJiAoZnVuY3NbaV0tPmdldElucHV0U2l6ZSgpICE9IDEgfHwKCQkgIGZ1bmNzW2ldLT5nZXRPdXRwdXRTaXplKCkgIT0gZnVuY3NbMF0tPmdldE91dHB1dFNpemUoKSkpIHsKICAgICAgZXJyb3IoLTEsICJJbmNvbXBhdGlibGUgc3ViZnVuY3Rpb25zIGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBvYmoyLmZyZWUoKTsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gQm91bmRzCiAgaWYgKCFkaWN0LT5sb29rdXAoIkJvdW5kcyIsICZvYmoxKS0+aXNBcnJheSgpIHx8CiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSAhPSBrIC0gMSkgewogICAgZXJyb3IoLTEsICJNaXNzaW5nIG9yIGludmFsaWQgJ0JvdW5kcycgZW50cnkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICBnb3RvIGVycjE7CiAgfQogIGJvdW5kc1swXSA9IGRvbWFpblswXVswXTsKICBmb3IgKGkgPSAxOyBpIDwgazsgKytpKSB7CiAgICBpZiAoIW9iajEuYXJyYXlHZXQoaSAtIDEsICZvYmoyKS0+aXNOdW0oKSkgewogICAgICBlcnJvcigtMSwgIkludmFsaWQgdHlwZSBpbiAnQm91bmRzJyBhcnJheSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgYm91bmRzW2ldID0gb2JqMi5nZXROdW0oKTsKICAgIG9iajIuZnJlZSgpOwogIH0KICBib3VuZHNba10gPSBkb21haW5bMF1bMV07CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gRW5jb2RlCiAgaWYgKCFkaWN0LT5sb29rdXAoIkVuY29kZSIsICZvYmoxKS0+aXNBcnJheSgpIHx8CiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSAhPSAyICogaykgewogICAgZXJyb3IoLTEsICJNaXNzaW5nIG9yIGludmFsaWQgJ0VuY29kZScgZW50cnkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICBnb3RvIGVycjE7CiAgfQogIGZvciAoaSA9IDA7IGkgPCAyICogazsgKytpKSB7CiAgICBpZiAoIW9iajEuYXJyYXlHZXQoaSwgJm9iajIpLT5pc051bSgpKSB7CiAgICAgIGVycm9yKC0xLCAiSW52YWxpZCB0eXBlIGluICdFbmNvZGUnIGFycmF5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBlbmNvZGVbaV0gPSBvYmoyLmdldE51bSgpOwogICAgb2JqMi5mcmVlKCk7CiAgfQogIG9iajEuZnJlZSgpOwoKICAvLy0tLS0tIHByZS1jb21wdXRlIHRoZSBzY2FsZSBmYWN0b3JzCiAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgaWYgKGJvdW5kc1tpXSA9PSBib3VuZHNbaSsxXSkgewogICAgICAvLyBhdm9pZCBhIGRpdmlkZS1ieS16ZXJvIC0tIGluIHRoaXMgc2l0dWF0aW9uLCBmdW5jdGlvbiBpIHdpbGwKICAgICAgLy8gbmV2ZXIgYmUgdXNlZCBhbnl3YXkKICAgICAgc2NhbGVbaV0gPSAwOwogICAgfSBlbHNlIHsKICAgICAgc2NhbGVbaV0gPSAoZW5jb2RlWzIqaSsxXSAtIGVuY29kZVsyKmldKSAvIChib3VuZHNbaSsxXSAtIGJvdW5kc1tpXSk7CiAgICB9CiAgfQoKICBvayA9IGdUcnVlOwogIHJldHVybjsKCiBlcnIyOgogIG9iajIuZnJlZSgpOwogZXJyMToKICBvYmoxLmZyZWUoKTsKfQoKU3RpdGNoaW5nRnVuY3Rpb246OlN0aXRjaGluZ0Z1bmN0aW9uKFN0aXRjaGluZ0Z1bmN0aW9uICpmdW5jKSB7CiAgaW50IGk7CgogIG1lbWNweSh0aGlzLCBmdW5jLCBzaXplb2YoU3RpdGNoaW5nRnVuY3Rpb24pKTsKCiAgayA9IGZ1bmMtPms7CiAgZnVuY3MgPSAoRnVuY3Rpb24gKiopZ21hbGxvY24oaywgc2l6ZW9mKEZ1bmN0aW9uICopKTsKICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBmdW5jc1tpXSA9IGZ1bmMtPmZ1bmNzW2ldLT5jb3B5KCk7CiAgfQogIGJvdW5kcyA9IChkb3VibGUgKilnbWFsbG9jbihrICsgMSwgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShib3VuZHMsIGZ1bmMtPmJvdW5kcywgKGsgKyAxKSAqIHNpemVvZihkb3VibGUpKTsKICBlbmNvZGUgPSAoZG91YmxlICopZ21hbGxvY24oMiAqIGssIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoZW5jb2RlLCBmdW5jLT5lbmNvZGUsIDIgKiBrICogc2l6ZW9mKGRvdWJsZSkpOwogIHNjYWxlID0gKGRvdWJsZSAqKWdtYWxsb2NuKGssIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoc2NhbGUsIGZ1bmMtPnNjYWxlLCBrICogc2l6ZW9mKGRvdWJsZSkpOwogIG9rID0gZ1RydWU7Cn0KClN0aXRjaGluZ0Z1bmN0aW9uOjp+U3RpdGNoaW5nRnVuY3Rpb24oKSB7CiAgaW50IGk7CgogIGlmIChmdW5jcykgewogICAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgICBpZiAoZnVuY3NbaV0pIHsKCWRlbGV0ZSBmdW5jc1tpXTsKICAgICAgfQogICAgfQogIH0KICBnZnJlZShmdW5jcyk7CiAgZ2ZyZWUoYm91bmRzKTsKICBnZnJlZShlbmNvZGUpOwogIGdmcmVlKHNjYWxlKTsKfQoKdm9pZCBTdGl0Y2hpbmdGdW5jdGlvbjo6dHJhbnNmb3JtKGRvdWJsZSAqaW4sIGRvdWJsZSAqb3V0KSB7CiAgZG91YmxlIHg7CiAgaW50IGk7CgogIGlmIChpblswXSA8IGRvbWFpblswXVswXSkgewogICAgeCA9IGRvbWFpblswXVswXTsKICB9IGVsc2UgaWYgKGluWzBdID4gZG9tYWluWzBdWzFdKSB7CiAgICB4ID0gZG9tYWluWzBdWzFdOwogIH0gZWxzZSB7CiAgICB4ID0gaW5bMF07CiAgfQogIGZvciAoaSA9IDA7IGkgPCBrIC0gMTsgKytpKSB7CiAgICBpZiAoeCA8IGJvdW5kc1tpKzFdKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICB4ID0gZW5jb2RlWzIqaV0gKyAoeCAtIGJvdW5kc1tpXSkgKiBzY2FsZVtpXTsKICBmdW5jc1tpXS0+dHJhbnNmb3JtKCZ4LCBvdXQpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBQb3N0U2NyaXB0RnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmVudW0gUFNPcCB7CiAgcHNPcEFicywKICBwc09wQWRkLAogIHBzT3BBbmQsCiAgcHNPcEF0YW4sCiAgcHNPcEJpdHNoaWZ0LAogIHBzT3BDZWlsaW5nLAogIHBzT3BDb3B5LAogIHBzT3BDb3MsCiAgcHNPcEN2aSwKICBwc09wQ3ZyLAogIHBzT3BEaXYsCiAgcHNPcER1cCwKICBwc09wRXEsCiAgcHNPcEV4Y2gsCiAgcHNPcEV4cCwKICBwc09wRmFsc2UsCiAgcHNPcEZsb29yLAogIHBzT3BHZSwKICBwc09wR3QsCiAgcHNPcElkaXYsCiAgcHNPcEluZGV4LAogIHBzT3BMZSwKICBwc09wTG4sCiAgcHNPcExvZywKICBwc09wTHQsCiAgcHNPcE1vZCwKICBwc09wTXVsLAogIHBzT3BOZSwKICBwc09wTmVnLAogIHBzT3BOb3QsCiAgcHNPcE9yLAogIHBzT3BQb3AsCiAgcHNPcFJvbGwsCiAgcHNPcFJvdW5kLAogIHBzT3BTaW4sCiAgcHNPcFNxcnQsCiAgcHNPcFN1YiwKICBwc09wVHJ1ZSwKICBwc09wVHJ1bmNhdGUsCiAgcHNPcFhvciwKICBwc09wSWYsCiAgcHNPcElmZWxzZSwKICBwc09wUmV0dXJuCn07CgovLyBOb3RlOiAnaWYnIGFuZCAnaWZlbHNlJyBhcmUgcGFyc2VkIHNlcGFyYXRlbHkuCi8vIFRoZSByZXN0IGFyZSBsaXN0ZWQgaGVyZSBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi8vIFRoZSBpbmRleCBpbiB0aGlzIHRhYmxlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGVudHJ5IGluIFBTT3AuCnN0YXRpYyBjb25zdCBjaGFyICpwc09wTmFtZXNbXSA9IHsKICAiYWJzIiwKICAiYWRkIiwKICAiYW5kIiwKICAiYXRhbiIsCiAgImJpdHNoaWZ0IiwKICAiY2VpbGluZyIsCiAgImNvcHkiLAogICJjb3MiLAogICJjdmkiLAogICJjdnIiLAogICJkaXYiLAogICJkdXAiLAogICJlcSIsCiAgImV4Y2giLAogICJleHAiLAogICJmYWxzZSIsCiAgImZsb29yIiwKICAiZ2UiLAogICJndCIsCiAgImlkaXYiLAogICJpbmRleCIsCiAgImxlIiwKICAibG4iLAogICJsb2ciLAogICJsdCIsCiAgIm1vZCIsCiAgIm11bCIsCiAgIm5lIiwKICAibmVnIiwKICAibm90IiwKICAib3IiLAogICJwb3AiLAogICJyb2xsIiwKICAicm91bmQiLAogICJzaW4iLAogICJzcXJ0IiwKICAic3ViIiwKICAidHJ1ZSIsCiAgInRydW5jYXRlIiwKICAieG9yIgp9OwoKI2RlZmluZSBuUFNPcHMgKHNpemVvZihwc09wTmFtZXMpIC8gc2l6ZW9mKGNoYXIgKikpCgplbnVtIFBTT2JqZWN0VHlwZSB7CiAgcHNCb29sLAogIHBzSW50LAogIHBzUmVhbCwKICBwc09wZXJhdG9yLAogIHBzQmxvY2sKfTsKCi8vIEluIHRoZSBjb2RlIGFycmF5LCAnaWYnLydpZmVsc2UnIG9wZXJhdG9ycyB0YWtlIHVwIHRocmVlIHNsb3RzCi8vIHBsdXMgc3BhY2UgZm9yIHRoZSBjb2RlIGluIHRoZSBzdWJjbGF1c2UocykuCi8vCi8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IHBzT3BlcmF0b3I6IHBzT3BJZiAvIHBzT3BJZmVsc2UgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBwc0Jsb2NrOiBwdHI9PEE+ICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgICAgIHwgcHNCbG9jazogcHRyPTxCPiAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IGlmIGNsYXVzZSAgICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCBwc09wZXJhdG9yOiBwc09wUmV0dXJuICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgPEE+IHwgZWxzZSBjbGF1c2UgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICB8IHBzT3BlcmF0b3I6IHBzT3BSZXR1cm4gICAgICAgICAgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICA8Qj4gfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8KLy8gRm9yICdpZicsIHBvaW50ZXIgPEE+IGlzIHByZXNlbnQgaW4gdGhlIGNvZGUgc3RyZWFtIGJ1dCB1bnVzZWQuCgpzdHJ1Y3QgUFNPYmplY3QgewogIFBTT2JqZWN0VHlwZSB0eXBlOwogIHVuaW9uIHsKICAgIEdCb29sIGJvb2xuOwkJLy8gYm9vbGVhbiAoc3RhY2sgb25seSkKICAgIGludCBpbnRnOwkJCS8vIGludGVnZXIgKHN0YWNrIGFuZCBjb2RlKQogICAgZG91YmxlIHJlYWw7CQkvLyByZWFsIChzdGFjayBhbmQgY29kZSkKICAgIFBTT3Agb3A7CQkJLy8gb3BlcmF0b3IgKGNvZGUgb25seSkKICAgIGludCBibGs7CQkJLy8gaWYvaWZlbHNlIGJsb2NrIHBvaW50ZXIgKGNvZGUgb25seSkKICB9Owp9OwoKI2RlZmluZSBwc1N0YWNrU2l6ZSAxMDAKCmNsYXNzIFBTU3RhY2sgewpwdWJsaWM6CgogIFBTU3RhY2soKSB7c3AgPSBwc1N0YWNrU2l6ZTsgfQogIHZvaWQgY2xlYXIoKSB7IHNwID0gcHNTdGFja1NpemU7IH0KICB2b2lkIHB1c2hCb29sKEdCb29sIGJvb2xuKQogIHsKICAgIGlmIChjaGVja092ZXJmbG93KCkpIHsKICAgICAgc3RhY2tbLS1zcF0udHlwZSA9IHBzQm9vbDsKICAgICAgc3RhY2tbc3BdLmJvb2xuID0gYm9vbG47CiAgICB9CiAgfQogIHZvaWQgcHVzaEludChpbnQgaW50ZykKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc0ludDsKICAgICAgc3RhY2tbc3BdLmludGcgPSBpbnRnOwogICAgfQogIH0KICB2b2lkIHB1c2hSZWFsKGRvdWJsZSByZWFsKQogIHsKICAgIGlmIChjaGVja092ZXJmbG93KCkpIHsKICAgICAgc3RhY2tbLS1zcF0udHlwZSA9IHBzUmVhbDsKICAgICAgc3RhY2tbc3BdLnJlYWwgPSByZWFsOwogICAgfQogIH0KICBHQm9vbCBwb3BCb29sKCkKICB7CiAgICBpZiAoY2hlY2tVbmRlcmZsb3coKSAmJiBjaGVja1R5cGUocHNCb29sLCBwc0Jvb2wpKSB7CiAgICAgIHJldHVybiBzdGFja1tzcCsrXS5ib29sbjsKICAgIH0KICAgIHJldHVybiBnRmFsc2U7CiAgfQogIGludCBwb3BJbnQoKQogIHsKICAgIGlmIChjaGVja1VuZGVyZmxvdygpICYmIGNoZWNrVHlwZShwc0ludCwgcHNJbnQpKSB7CiAgICAgIHJldHVybiBzdGFja1tzcCsrXS5pbnRnOwogICAgfQogICAgcmV0dXJuIDA7CiAgfQogIGRvdWJsZSBwb3BOdW0oKQogIHsKICAgIGRvdWJsZSByZXQ7CgogICAgaWYgKGNoZWNrVW5kZXJmbG93KCkgJiYgY2hlY2tUeXBlKHBzSW50LCBwc1JlYWwpKSB7CiAgICAgIHJldCA9IChzdGFja1tzcF0udHlwZSA9PSBwc0ludCkgPyAoZG91YmxlKXN0YWNrW3NwXS5pbnRnIDogc3RhY2tbc3BdLnJlYWw7CiAgICAgICsrc3A7CiAgICAgIHJldHVybiByZXQ7CiAgICB9CiAgICByZXR1cm4gMDsKICB9CiAgR0Jvb2wgZW1wdHkoKSB7IHJldHVybiBzcCA9PSBwc1N0YWNrU2l6ZTsgfQogIEdCb29sIHRvcElzSW50KCkgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAmJiBzdGFja1tzcF0udHlwZSA9PSBwc0ludDsgfQogIEdCb29sIHRvcFR3b0FyZUludHMoKQogICAgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAtIDEgJiYKCSAgICAgc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQgJiYKICAgICAgICAgICAgIHN0YWNrW3NwKzFdLnR5cGUgPT0gcHNJbnQ7IH0KICBHQm9vbCB0b3BJc1JlYWwoKSB7IHJldHVybiBzcCA8IHBzU3RhY2tTaXplICYmIHN0YWNrW3NwXS50eXBlID09IHBzUmVhbDsgfQogIEdCb29sIHRvcFR3b0FyZU51bXMoKQogICAgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAtIDEgJiYKCSAgICAgKHN0YWNrW3NwXS50eXBlID09IHBzSW50IHx8IHN0YWNrW3NwXS50eXBlID09IHBzUmVhbCkgJiYKCSAgICAgKHN0YWNrW3NwKzFdLnR5cGUgPT0gcHNJbnQgfHwgc3RhY2tbc3ArMV0udHlwZSA9PSBwc1JlYWwpOyB9CiAgdm9pZCBjb3B5KGludCBuKTsKICB2b2lkIHJvbGwoaW50IG4sIGludCBqKTsKICB2b2lkIGluZGV4KGludCBpKQogIHsKICAgIGlmICghY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC0tc3A7CiAgICBzdGFja1tzcF0gPSBzdGFja1tzcCArIDEgKyBpXTsKICB9CiAgdm9pZCBwb3AoKQogIHsKICAgIGlmICghY2hlY2tVbmRlcmZsb3coKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICArK3NwOwogIH0KCnByaXZhdGU6CgogIEdCb29sIGNoZWNrT3ZlcmZsb3coaW50IG4gPSAxKQogIHsKICAgIGlmIChzcCAtIG4gPCAwKSB7CiAgICAgIGVycm9yKC0xLCAiU3RhY2sgb3ZlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcmV0dXJuIGdUcnVlOwogIH0KICBHQm9vbCBjaGVja1VuZGVyZmxvdygpCiAgewogICAgaWYgKHNwID09IHBzU3RhY2tTaXplKSB7CiAgICAgIGVycm9yKC0xLCAiU3RhY2sgdW5kZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuIGdGYWxzZTsKICAgIH0KICAgIHJldHVybiBnVHJ1ZTsKICB9CiAgR0Jvb2wgY2hlY2tUeXBlKFBTT2JqZWN0VHlwZSB0MSwgUFNPYmplY3RUeXBlIHQyKQogIHsKICAgIGlmIChzdGFja1tzcF0udHlwZSAhPSB0MSAmJiBzdGFja1tzcF0udHlwZSAhPSB0MikgewogICAgICBlcnJvcigtMSwgIlR5cGUgbWlzbWF0Y2ggaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcmV0dXJuIGdUcnVlOwogIH0KICBQU09iamVjdCBzdGFja1twc1N0YWNrU2l6ZV07CiAgaW50IHNwOwp9OwoKCnZvaWQgUFNTdGFjazo6Y29weShpbnQgbikgewogIGludCBpOwoKICBpZiAoc3AgKyBuID4gcHNTdGFja1NpemUpIHsKICAgIGVycm9yKC0xLCAiU3RhY2sgdW5kZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgIHJldHVybjsKICB9CiAgaWYgKCFjaGVja092ZXJmbG93KG4pKSB7CiAgICByZXR1cm47CiAgfQogIGZvciAoaSA9IHNwICsgbiAtIDE7IGkgPj0gc3A7IC0taSkgewogICAgc3RhY2tbaSAtIG5dID0gc3RhY2tbaV07CiAgfQogIHNwIC09IG47Cn0KCnZvaWQgUFNTdGFjazo6cm9sbChpbnQgbiwgaW50IGopIHsKICBQU09iamVjdCBvYmo7CiAgaW50IGksIGs7CgogIGlmICh1bmxpa2VseShuID09IDApKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChqID49IDApIHsKICAgIGogJT0gbjsKICB9IGVsc2UgewogICAgaiA9IC1qICUgbjsKICAgIGlmIChqICE9IDApIHsKICAgICAgaiA9IG4gLSBqOwogICAgfQogIH0KICBpZiAobiA8PSAwIHx8IGogPT0gMCkgewogICAgcmV0dXJuOwogIH0KICBpZiAoaiA8PSBuIC8gMikgewogICAgZm9yIChpID0gMDsgaSA8IGo7ICsraSkgewogICAgICBvYmogPSBzdGFja1tzcF07CiAgICAgIGZvciAoayA9IHNwOyBrIDwgc3AgKyBuIC0gMTsgKytrKSB7CiAgICAgICAgc3RhY2tba10gPSBzdGFja1trKzFdOwogICAgICB9CiAgICAgIHN0YWNrW3NwICsgbiAtIDFdID0gb2JqOwogICAgfQogIH0gZWxzZSB7CiAgICBqID0gbiAtIGo7CiAgICBmb3IgKGkgPSAwOyBpIDwgajsgKytpKSB7CiAgICAgIG9iaiA9IHN0YWNrW3NwICsgbiAtIDFdOwogICAgICBmb3IgKGsgPSBzcCArIG4gLSAxOyBrID4gc3A7IC0taykgewogICAgICAgIHN0YWNrW2tdID0gc3RhY2tbay0xXTsKICAgICAgfQogICAgICBzdGFja1tzcF0gPSBvYmo7CiAgICB9CiAgfQp9CgpjbGFzcyBQb3N0U2NyaXB0RnVuY3Rpb25LZXkgOiBwdWJsaWMgUG9wcGxlckNhY2hlS2V5CnsKICBwdWJsaWM6CiAgICBQb3N0U2NyaXB0RnVuY3Rpb25LZXkoaW50IHNpemVBLCBkb3VibGUgKmluQSwgYm9vbCBjb3B5QSkKICAgIHsKICAgICAgaW5pdChzaXplQSwgaW5BLCBjb3B5QSk7CiAgICB9CiAgICAKICAgIFBvc3RTY3JpcHRGdW5jdGlvbktleShjb25zdCBQb3N0U2NyaXB0RnVuY3Rpb25LZXkgJmtleSkKICAgIHsKICAgICAgaW5pdChrZXkuc2l6ZSwga2V5LmluLCBrZXkuY29waWVkKTsKICAgIH0KICAgIAogICAgdm9pZCBpbml0KGludCBzaXplQSwgZG91YmxlICppbkEsIGJvb2wgY29weUEpCiAgICB7CiAgICAgIGNvcGllZCA9IGNvcHlBOwogICAgICBzaXplID0gc2l6ZUE7CiAgICAgIGlmIChjb3BpZWQpIHsKICAgICAgICBpbiA9IG5ldyBkb3VibGVbc2l6ZV07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIGluW2ldID0gaW5BW2ldOwogICAgICB9IGVsc2UgewogICAgICAgIGluID0gaW5BOwogICAgICB9CiAgICB9CiAgICAKICAgIH5Qb3N0U2NyaXB0RnVuY3Rpb25LZXkoKQogICAgewogICAgICBpZiAoY29waWVkKSBkZWxldGVbXSBpbjsKICAgIH0KICAgICAgIAogICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBvcHBsZXJDYWNoZUtleSAma2V5KSBjb25zdAogICAgewogICAgICBjb25zdCBQb3N0U2NyaXB0RnVuY3Rpb25LZXkgKmsgPSBzdGF0aWNfY2FzdDxjb25zdCBQb3N0U2NyaXB0RnVuY3Rpb25LZXkqPigma2V5KTsKICAgICAgaWYgKHNpemUgPT0gay0+c2l6ZSkgewogICAgICAgIGJvb2wgZXF1YWwgPSB0cnVlOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBlcXVhbCAmJiBpIDwgc2l6ZTsgKytpKSB7CiAgICAgICAgICBlcXVhbCA9IGluW2ldID09IGstPmluW2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZXF1YWw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgCiAgICBib29sIGNvcGllZDsKICAgIGludCBzaXplOwogICAgZG91YmxlICppbjsKfTsKCmNsYXNzIFBvc3RTY3JpcHRGdW5jdGlvbkl0ZW0gOiBwdWJsaWMgUG9wcGxlckNhY2hlSXRlbQp7CiAgcHVibGljOgogICAgUG9zdFNjcmlwdEZ1bmN0aW9uSXRlbShpbnQgc2l6ZUEsIGRvdWJsZSAqb3V0QSkKICAgIHsKICAgICAgaW5pdChzaXplQSwgb3V0QSk7CiAgICB9CiAgICAKICAgIFBvc3RTY3JpcHRGdW5jdGlvbkl0ZW0oY29uc3QgUG9zdFNjcmlwdEZ1bmN0aW9uSXRlbSAmaXRlbSkKICAgIHsKICAgICAgaW5pdChpdGVtLnNpemUsIGl0ZW0ub3V0KTsKICAgIH0KICAgIAogICAgdm9pZCBpbml0KGludCBzaXplQSwgZG91YmxlICpvdXRBKQogICAgewogICAgICBzaXplID0gc2l6ZUE7CiAgICAgIG91dCA9IG5ldyBkb3VibGVbc2l6ZV07CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSBvdXRbaV0gPSBvdXRBW2ldOwogICAgfQogICAgCiAgICB+UG9zdFNjcmlwdEZ1bmN0aW9uSXRlbSgpCiAgICB7CiAgICAgIGRlbGV0ZVtdIG91dDsKICAgIH0KICAgIAogICAgaW50IHNpemU7CiAgICBkb3VibGUgKm91dDsKfTsKClBvc3RTY3JpcHRGdW5jdGlvbjo6UG9zdFNjcmlwdEZ1bmN0aW9uKE9iamVjdCAqZnVuY09iaiwgRGljdCAqZGljdCkgewogIFN0cmVhbSAqc3RyOwogIGludCBjb2RlUHRyOwogIEdvb1N0cmluZyAqdG9rOwoKICBjb2RlID0gTlVMTDsKICBjb2RlU3RyaW5nID0gTlVMTDsKICBjb2RlU2l6ZSA9IDA7CiAgc3RhY2sgPSBOVUxMOwogIG9rID0gZ0ZhbHNlOwogIGNhY2hlID0gbmV3IFBvcHBsZXJDYWNoZSg1KTsKCiAgLy8tLS0tLSBpbml0aWFsaXplIHRoZSBnZW5lcmljIHN0dWZmCiAgaWYgKCFpbml0KGRpY3QpKSB7CiAgICBnb3RvIGVycjE7CiAgfQogIGlmICghaGFzUmFuZ2UpIHsKICAgIGVycm9yKC0xLCAiVHlwZSA0IGZ1bmN0aW9uIGlzIG1pc3NpbmcgcmFuZ2UiKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gZ2V0IHRoZSBzdHJlYW0KICBpZiAoIWZ1bmNPYmotPmlzU3RyZWFtKCkpIHsKICAgIGVycm9yKC0xLCAiVHlwZSA0IGZ1bmN0aW9uIGlzbid0IGEgc3RyZWFtIik7CiAgICBnb3RvIGVycjE7CiAgfQogIHN0ciA9IGZ1bmNPYmotPmdldFN0cmVhbSgpOwoKICAvLy0tLS0tIHBhcnNlIHRoZSBmdW5jdGlvbgogIGNvZGVTdHJpbmcgPSBuZXcgR29vU3RyaW5nKCk7CiAgc3RyLT5yZXNldCgpOwogIGlmICghKHRvayA9IGdldFRva2VuKHN0cikpIHx8IHRvay0+Y21wKCJ7IikpIHsKICAgIGVycm9yKC0xLCAiRXhwZWN0ZWQgJ3snIGF0IHN0YXJ0IG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgIGlmICh0b2spIHsKICAgICAgZGVsZXRlIHRvazsKICAgIH0KICAgIGdvdG8gZXJyMTsKICB9CiAgZGVsZXRlIHRvazsKICBjb2RlUHRyID0gMDsKICBpZiAoIXBhcnNlQ29kZShzdHIsICZjb2RlUHRyKSkgewogICAgZ290byBlcnIyOwogIH0KICBzdHItPmNsb3NlKCk7CgogIG9rID0gZ1RydWU7CiAgCiAgc3RhY2sgPSBuZXcgUFNTdGFjaygpOwoKIGVycjI6CiAgc3RyLT5jbG9zZSgpOwogZXJyMToKICByZXR1cm47Cn0KClBvc3RTY3JpcHRGdW5jdGlvbjo6UG9zdFNjcmlwdEZ1bmN0aW9uKFBvc3RTY3JpcHRGdW5jdGlvbiAqZnVuYykgewogIG1lbWNweSh0aGlzLCBmdW5jLCBzaXplb2YoUG9zdFNjcmlwdEZ1bmN0aW9uKSk7CiAgY29kZSA9IChQU09iamVjdCAqKWdtYWxsb2NuKGNvZGVTaXplLCBzaXplb2YoUFNPYmplY3QpKTsKICBtZW1jcHkoY29kZSwgZnVuYy0+Y29kZSwgY29kZVNpemUgKiBzaXplb2YoUFNPYmplY3QpKTsKICBjb2RlU3RyaW5nID0gZnVuYy0+Y29kZVN0cmluZy0+Y29weSgpOwogIHN0YWNrID0gbmV3IFBTU3RhY2soKTsKICBtZW1jcHkoc3RhY2ssIGZ1bmMtPnN0YWNrLCBzaXplb2YoUFNTdGFjaykpOwogIAogIGNhY2hlID0gbmV3IFBvcHBsZXJDYWNoZShmdW5jLT5jYWNoZS0+c2l6ZSgpKTsKICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmMtPmNhY2hlLT5udW1iZXJPZkl0ZW1zKCk7ICsraSkKICB7CiAgICBQb3N0U2NyaXB0RnVuY3Rpb25LZXkgKmtleSA9IG5ldyBQb3N0U2NyaXB0RnVuY3Rpb25LZXkoKihQb3N0U2NyaXB0RnVuY3Rpb25LZXkqKWZ1bmMtPmNhY2hlLT5rZXkoaSkpOwogICAgUG9zdFNjcmlwdEZ1bmN0aW9uSXRlbSAqaXRlbSA9IG5ldyBQb3N0U2NyaXB0RnVuY3Rpb25JdGVtKCooUG9zdFNjcmlwdEZ1bmN0aW9uSXRlbSopZnVuYy0+Y2FjaGUtPml0ZW0oaSkpOwogICAgY2FjaGUtPnB1dChrZXksIGl0ZW0pOwogIH0KfQoKUG9zdFNjcmlwdEZ1bmN0aW9uOjp+UG9zdFNjcmlwdEZ1bmN0aW9uKCkgewogIGdmcmVlKGNvZGUpOwogIGRlbGV0ZSBjb2RlU3RyaW5nOwogIGRlbGV0ZSBzdGFjazsKICBkZWxldGUgY2FjaGU7Cn0KCnZvaWQgUG9zdFNjcmlwdEZ1bmN0aW9uOjp0cmFuc2Zvcm0oZG91YmxlICppbiwgZG91YmxlICpvdXQpIHsKICBpbnQgaTsKICAKICBQb3N0U2NyaXB0RnVuY3Rpb25LZXkga2V5KG0sIGluLCBmYWxzZSk7CiAgUG9wcGxlckNhY2hlSXRlbSAqaXRlbSA9IGNhY2hlLT5sb29rdXAoa2V5KTsKICBpZiAoaXRlbSkgewogICAgUG9zdFNjcmlwdEZ1bmN0aW9uSXRlbSAqaXQgPSBzdGF0aWNfY2FzdDxQb3N0U2NyaXB0RnVuY3Rpb25JdGVtICo+KGl0ZW0pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb3V0W2ldID0gaXQtPm91dFtpXTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIHN0YWNrLT5jbGVhcigpOwogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIC8vfiBtYXkgbmVlZCB0byBjaGVjayBmb3IgaW50ZWdlcnMgaGVyZQogICAgc3RhY2stPnB1c2hSZWFsKGluW2ldKTsKICB9CiAgZXhlYyhzdGFjaywgMCk7CiAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICBvdXRbaV0gPSBzdGFjay0+cG9wTnVtKCk7CiAgICBpZiAob3V0W2ldIDwgcmFuZ2VbaV1bMF0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMF07CiAgICB9IGVsc2UgaWYgKG91dFtpXSA+IHJhbmdlW2ldWzFdKSB7CiAgICAgIG91dFtpXSA9IHJhbmdlW2ldWzFdOwogICAgfQogIH0KCiAgUG9zdFNjcmlwdEZ1bmN0aW9uS2V5ICpuZXdLZXkgPSBuZXcgUG9zdFNjcmlwdEZ1bmN0aW9uS2V5KG0sIGluLCB0cnVlKTsKICBQb3N0U2NyaXB0RnVuY3Rpb25JdGVtICpuZXdJdGVtID0gbmV3IFBvc3RTY3JpcHRGdW5jdGlvbkl0ZW0obiwgb3V0KTsKICBjYWNoZS0+cHV0KG5ld0tleSwgbmV3SXRlbSk7CiAgCiAgLy8gaWYgKCFzdGFjay0+ZW1wdHkoKSkgewogIC8vICAgZXJyb3IoLTEsICJFeHRyYSB2YWx1ZXMgb24gc3RhY2sgYXQgZW5kIG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAvLyB9Cn0KCkdCb29sIFBvc3RTY3JpcHRGdW5jdGlvbjo6cGFyc2VDb2RlKFN0cmVhbSAqc3RyLCBpbnQgKmNvZGVQdHIpIHsKICBHb29TdHJpbmcgKnRvazsKICBjaGFyICpwOwogIEdCb29sIGlzUmVhbDsKICBpbnQgb3BQdHIsIGVsc2VQdHI7CiAgaW50IGEsIGIsIG1pZCwgY21wOwoKICB3aGlsZSAoMSkgewogICAgaWYgKCEodG9rID0gZ2V0VG9rZW4oc3RyKSkpIHsKICAgICAgZXJyb3IoLTEsICJVbmV4cGVjdGVkIGVuZCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0cmVhbSIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcCA9IHRvay0+Z2V0Q1N0cmluZygpOwogICAgaWYgKGlzZGlnaXQoKnApIHx8ICpwID09ICcuJyB8fCAqcCA9PSAnLScpIHsKICAgICAgaXNSZWFsID0gZ0ZhbHNlOwogICAgICBmb3IgKCsrcDsgKnA7ICsrcCkgewoJaWYgKCpwID09ICcuJykgewoJICBpc1JlYWwgPSBnVHJ1ZTsKCSAgYnJlYWs7Cgl9CiAgICAgIH0KICAgICAgcmVzaXplQ29kZSgqY29kZVB0cik7CiAgICAgIGlmIChpc1JlYWwpIHsKCWNvZGVbKmNvZGVQdHJdLnR5cGUgPSBwc1JlYWw7CiAgICAgICAgICBjb2RlWypjb2RlUHRyXS5yZWFsID0gZ2F0b2YodG9rLT5nZXRDU3RyaW5nKCkpOwogICAgICB9IGVsc2UgewoJY29kZVsqY29kZVB0cl0udHlwZSA9IHBzSW50OwoJY29kZVsqY29kZVB0cl0uaW50ZyA9IGF0b2kodG9rLT5nZXRDU3RyaW5nKCkpOwogICAgICB9CiAgICAgICsrKmNvZGVQdHI7CiAgICAgIGRlbGV0ZSB0b2s7CiAgICB9IGVsc2UgaWYgKCF0b2stPmNtcCgieyIpKSB7CiAgICAgIGRlbGV0ZSB0b2s7CiAgICAgIG9wUHRyID0gKmNvZGVQdHI7CiAgICAgICpjb2RlUHRyICs9IDM7CiAgICAgIHJlc2l6ZUNvZGUob3BQdHIgKyAyKTsKICAgICAgaWYgKCFwYXJzZUNvZGUoc3RyLCBjb2RlUHRyKSkgewoJcmV0dXJuIGdGYWxzZTsKICAgICAgfQogICAgICBpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSkgewoJZXJyb3IoLTEsICJVbmV4cGVjdGVkIGVuZCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0cmVhbSIpOwoJcmV0dXJuIGdGYWxzZTsKICAgICAgfQogICAgICBpZiAoIXRvay0+Y21wKCJ7IikpIHsKCWVsc2VQdHIgPSAqY29kZVB0cjsKCWlmICghcGFyc2VDb2RlKHN0ciwgY29kZVB0cikpIHsKCSAgcmV0dXJuIGdGYWxzZTsKCX0KCWRlbGV0ZSB0b2s7CglpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSkgewoJICBlcnJvcigtMSwgIlVuZXhwZWN0ZWQgZW5kIG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24gc3RyZWFtIik7CgkgIHJldHVybiBnRmFsc2U7Cgl9CiAgICAgIH0gZWxzZSB7CgllbHNlUHRyID0gLTE7CiAgICAgIH0KICAgICAgaWYgKCF0b2stPmNtcCgiaWYiKSkgewoJaWYgKGVsc2VQdHIgPj0gMCkgewoJICBlcnJvcigtMSwgIkdvdCAnaWYnIG9wZXJhdG9yIHdpdGggdHdvIGJsb2NrcyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CgkgIHJldHVybiBnRmFsc2U7Cgl9Cgljb2RlW29wUHRyXS50eXBlID0gcHNPcGVyYXRvcjsKCWNvZGVbb3BQdHJdLm9wID0gcHNPcElmOwoJY29kZVtvcFB0cisyXS50eXBlID0gcHNCbG9jazsKCWNvZGVbb3BQdHIrMl0uYmxrID0gKmNvZGVQdHI7CiAgICAgIH0gZWxzZSBpZiAoIXRvay0+Y21wKCJpZmVsc2UiKSkgewoJaWYgKGVsc2VQdHIgPCAwKSB7CgkgIGVycm9yKC0xLCAiR290ICdpZmVsc2UnIG9wZXJhdG9yIHdpdGggb25lIGJsb2NrcyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CgkgIHJldHVybiBnRmFsc2U7Cgl9Cgljb2RlW29wUHRyXS50eXBlID0gcHNPcGVyYXRvcjsKCWNvZGVbb3BQdHJdLm9wID0gcHNPcElmZWxzZTsKCWNvZGVbb3BQdHIrMV0udHlwZSA9IHBzQmxvY2s7Cgljb2RlW29wUHRyKzFdLmJsayA9IGVsc2VQdHI7Cgljb2RlW29wUHRyKzJdLnR5cGUgPSBwc0Jsb2NrOwoJY29kZVtvcFB0cisyXS5ibGsgPSAqY29kZVB0cjsKICAgICAgfSBlbHNlIHsKCWVycm9yKC0xLCAiRXhwZWN0ZWQgaWYvaWZlbHNlIG9wZXJhdG9yIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKCWRlbGV0ZSB0b2s7CglyZXR1cm4gZ0ZhbHNlOwogICAgICB9CiAgICAgIGRlbGV0ZSB0b2s7CiAgICB9IGVsc2UgaWYgKCF0b2stPmNtcCgifSIpKSB7CiAgICAgIGRlbGV0ZSB0b2s7CiAgICAgIHJlc2l6ZUNvZGUoKmNvZGVQdHIpOwogICAgICBjb2RlWypjb2RlUHRyXS50eXBlID0gcHNPcGVyYXRvcjsKICAgICAgY29kZVsqY29kZVB0cl0ub3AgPSBwc09wUmV0dXJuOwogICAgICArKypjb2RlUHRyOwogICAgICBicmVhazsKICAgIH0gZWxzZSB7CiAgICAgIGEgPSAtMTsKICAgICAgYiA9IG5QU09wczsKICAgICAgLy8gaW52YXJpYW50OiBwc09wTmFtZXNbYV0gPCB0b2sgPCBwc09wTmFtZXNbYl0KICAgICAgd2hpbGUgKGIgLSBhID4gMSkgewoJbWlkID0gKGEgKyBiKSAvIDI7CgljbXAgPSB0b2stPmNtcChwc09wTmFtZXNbbWlkXSk7CglpZiAoY21wID4gMCkgewoJICBhID0gbWlkOwoJfSBlbHNlIGlmIChjbXAgPCAwKSB7CgkgIGIgPSBtaWQ7Cgl9IGVsc2UgewoJICBhID0gYiA9IG1pZDsKCX0KICAgICAgfQogICAgICBpZiAoY21wICE9IDApIHsKCWVycm9yKC0xLCAiVW5rbm93biBvcGVyYXRvciAnJXMnIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iLAoJICAgICAgdG9rLT5nZXRDU3RyaW5nKCkpOwoJZGVsZXRlIHRvazsKCXJldHVybiBnRmFsc2U7CiAgICAgIH0KICAgICAgZGVsZXRlIHRvazsKICAgICAgcmVzaXplQ29kZSgqY29kZVB0cik7CiAgICAgIGNvZGVbKmNvZGVQdHJdLnR5cGUgPSBwc09wZXJhdG9yOwogICAgICBjb2RlWypjb2RlUHRyXS5vcCA9IChQU09wKWE7CiAgICAgICsrKmNvZGVQdHI7CiAgICB9CiAgfQogIHJldHVybiBnVHJ1ZTsKfQoKR29vU3RyaW5nICpQb3N0U2NyaXB0RnVuY3Rpb246OmdldFRva2VuKFN0cmVhbSAqc3RyKSB7CiAgR29vU3RyaW5nICpzOwogIGludCBjOwogIEdCb29sIGNvbW1lbnQ7CgogIHMgPSBuZXcgR29vU3RyaW5nKCk7CiAgY29tbWVudCA9IGdGYWxzZTsKICB3aGlsZSAoMSkgewogICAgaWYgKChjID0gc3RyLT5nZXRDaGFyKCkpID09IEVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGNvZGVTdHJpbmctPmFwcGVuZChjKTsKICAgIGlmIChjb21tZW50KSB7CiAgICAgIGlmIChjID09ICdceDBhJyB8fCBjID09ICdceDBkJykgewoJY29tbWVudCA9IGdGYWxzZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjID09ICclJykgewogICAgICBjb21tZW50ID0gZ1RydWU7CiAgICB9IGVsc2UgaWYgKCFpc3NwYWNlKGMpKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoYyA9PSAneycgfHwgYyA9PSAnfScpIHsKICAgIHMtPmFwcGVuZCgoY2hhciljKTsKICB9IGVsc2UgaWYgKGlzZGlnaXQoYykgfHwgYyA9PSAnLicgfHwgYyA9PSAnLScpIHsKICAgIHdoaWxlICgxKSB7CiAgICAgIHMtPmFwcGVuZCgoY2hhciljKTsKICAgICAgYyA9IHN0ci0+bG9va0NoYXIoKTsKICAgICAgaWYgKGMgPT0gRU9GIHx8ICEoaXNkaWdpdChjKSB8fCBjID09ICcuJyB8fCBjID09ICctJykpIHsKCWJyZWFrOwogICAgICB9CiAgICAgIHN0ci0+Z2V0Q2hhcigpOwogICAgICBjb2RlU3RyaW5nLT5hcHBlbmQoYyk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHdoaWxlICgxKSB7CiAgICAgIHMtPmFwcGVuZCgoY2hhciljKTsKICAgICAgYyA9IHN0ci0+bG9va0NoYXIoKTsKICAgICAgaWYgKGMgPT0gRU9GIHx8ICFpc2FsbnVtKGMpKSB7CglicmVhazsKICAgICAgfQogICAgICBzdHItPmdldENoYXIoKTsKICAgICAgY29kZVN0cmluZy0+YXBwZW5kKGMpOwogICAgfQogIH0KICByZXR1cm4gczsKfQoKdm9pZCBQb3N0U2NyaXB0RnVuY3Rpb246OnJlc2l6ZUNvZGUoaW50IG5ld1NpemUpIHsKICBpZiAobmV3U2l6ZSA+PSBjb2RlU2l6ZSkgewogICAgY29kZVNpemUgKz0gNjQ7CiAgICBjb2RlID0gKFBTT2JqZWN0ICopZ3JlYWxsb2NuKGNvZGUsIGNvZGVTaXplLCBzaXplb2YoUFNPYmplY3QpKTsKICB9Cn0KCnZvaWQgUG9zdFNjcmlwdEZ1bmN0aW9uOjpleGVjKFBTU3RhY2sgKnN0YWNrLCBpbnQgY29kZVB0cikgewogIGludCBpMSwgaTI7CiAgZG91YmxlIHIxLCByMiwgcmVzdWx0OwogIEdCb29sIGIxLCBiMjsKCiAgd2hpbGUgKDEpIHsKICAgIHN3aXRjaCAoY29kZVtjb2RlUHRyXS50eXBlKSB7CiAgICBjYXNlIHBzSW50OgogICAgICBzdGFjay0+cHVzaEludChjb2RlW2NvZGVQdHIrK10uaW50Zyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBwc1JlYWw6CiAgICAgIHN0YWNrLT5wdXNoUmVhbChjb2RlW2NvZGVQdHIrK10ucmVhbCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBwc09wZXJhdG9yOgogICAgICBzd2l0Y2ggKGNvZGVbY29kZVB0cisrXS5vcCkgewogICAgICBjYXNlIHBzT3BBYnM6CglpZiAoc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hJbnQoYWJzKHN0YWNrLT5wb3BJbnQoKSkpOwoJfSBlbHNlIHsKCSAgc3RhY2stPnB1c2hSZWFsKGZhYnMoc3RhY2stPnBvcE51bSgpKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQWRkOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSArIGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKHIxICsgcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEFuZDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgJiBpMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxICYmIGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BBdGFuOgoJcjIgPSBzdGFjay0+cG9wTnVtKCk7CglyMSA9IHN0YWNrLT5wb3BOdW0oKTsKCXJlc3VsdCA9IGF0YW4yKHIxLCByMikgKiAxODAuMCAvIE1fUEk7CglpZiAocmVzdWx0IDwgMCkgcmVzdWx0ICs9IDM2MC4wOwoJc3RhY2stPnB1c2hSZWFsKHJlc3VsdCk7CglicmVhazsKICAgICAgY2FzZSBwc09wQml0c2hpZnQ6CglpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCWkxID0gc3RhY2stPnBvcEludCgpOwoJaWYgKGkyID4gMCkgewoJICBzdGFjay0+cHVzaEludChpMSA8PCBpMik7Cgl9IGVsc2UgaWYgKGkyIDwgMCkgewoJICBzdGFjay0+cHVzaEludCgoaW50KSgoR3VpbnQpaTEgPj4gaTIpKTsKCX0gZWxzZSB7CgkgIHN0YWNrLT5wdXNoSW50KGkxKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BDZWlsaW5nOgoJaWYgKCFzdGFjay0+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+cG9wQm9vbCgpOwoJaWYgKGIxKSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVQdHIgKyAyKTsKCX0gZWxzZSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVbY29kZVB0cl0uYmxrKTsKCX0KCWNvZGVQdHIgPSBjb2RlW2NvZGVQdHIgKyAxXS5ibGs7CglicmVhazsKICAgICAgY2FzZSBwc09wUmV0dXJuOgoJcmV0dXJuOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZXJyb3IoLTEsICJJbnRlcm5hbDogYmFkIG9iamVjdCBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIGNvZGUiKTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQp9Cg==