Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRnVuY3Rpb24uY2MKLy8KLy8gQ29weXJpZ2h0IDIwMDEtMjAwMyBHbHlwaCAmIENvZywgTExDCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4LTIwMTAsIDIwMTMtMjAxNSwgMjAxNywgMjAxOCBBbGJlcnQgQXN0YWxzIENpZCA8YWFjaWRAa2RlLm9yZz4KLy8gQ29weXJpZ2h0IChDKSAyMDA2IEplZmYgTXVpemVsYWFyIDxqZWZmQGluZmlkaWdtLm5ldD4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDExIEFuZHJlYSBDYW5jaWFuaSA8cmFubWE0MkBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMiBUaG9tYXMgRnJlaXRhZyA8VGhvbWFzLkZyZWl0YWdAYWxmYS5kZT4KLy8gQ29weXJpZ2h0IChDKSAyMDEyIEFkYW0gUmVpY2hvbGQgPGFkYW1yZWljaG9sZEBteW9wZXJhLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDEzIEZhYmlvIEQnVXJzbyA8ZmFiaW9kdXJzb0Bob3RtYWlsLml0PgovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaW5jbHVkZSA8Y29uZmlnLmg+CgojaWZkZWYgVVNFX0dDQ19QUkFHTUFTCiNwcmFnbWEgaW1wbGVtZW50YXRpb24KI2VuZGlmCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlICJnb28vZ21lbS5oIgojaW5jbHVkZSAiZ29vL2dzdHJ0b2QuaCIKI2luY2x1ZGUgIk9iamVjdC5oIgojaW5jbHVkZSAiRGljdC5oIgojaW5jbHVkZSAiU3RyZWFtLmgiCiNpbmNsdWRlICJFcnJvci5oIgojaW5jbHVkZSAiRnVuY3Rpb24uaCIKCiNpZm5kZWYgTV9QSQojZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgojZW5kaWYKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGdW5jdGlvbjo6RnVuY3Rpb24oKSB7Cn0KCkZ1bmN0aW9uOjp+RnVuY3Rpb24oKSB7Cn0KCkZ1bmN0aW9uICpGdW5jdGlvbjo6cGFyc2UoT2JqZWN0ICpmdW5jT2JqKSB7CiAgc3RkOjpzZXQ8aW50PiB1c2VkUGFyZW50czsKICByZXR1cm4gcGFyc2UoZnVuY09iaiwgJnVzZWRQYXJlbnRzKTsKfQoKRnVuY3Rpb24gKkZ1bmN0aW9uOjpwYXJzZShPYmplY3QgKmZ1bmNPYmosIHN0ZDo6c2V0PGludD4gKnVzZWRQYXJlbnRzKSB7CiAgRnVuY3Rpb24gKmZ1bmM7CiAgRGljdCAqZGljdDsKICBpbnQgZnVuY1R5cGU7CgogIGlmIChmdW5jT2JqLT5pc1N0cmVhbSgpKSB7CiAgICBkaWN0ID0gZnVuY09iai0+c3RyZWFtR2V0RGljdCgpOwogIH0gZWxzZSBpZiAoZnVuY09iai0+aXNEaWN0KCkpIHsKICAgIGRpY3QgPSBmdW5jT2JqLT5nZXREaWN0KCk7CiAgfSBlbHNlIGlmIChmdW5jT2JqLT5pc05hbWUoIklkZW50aXR5IikpIHsKICAgIHJldHVybiBuZXcgSWRlbnRpdHlGdW5jdGlvbigpOwogIH0gZWxzZSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJFeHBlY3RlZCBmdW5jdGlvbiBkaWN0aW9uYXJ5IG9yIHN0cmVhbSIpOwogICAgcmV0dXJuIG51bGxwdHI7CiAgfQoKICBPYmplY3Qgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRnVuY3Rpb25UeXBlIik7CiAgaWYgKCFvYmoxLmlzSW50KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIHR5cGUgaXMgbWlzc2luZyBvciB3cm9uZyB0eXBlIik7CiAgICByZXR1cm4gbnVsbHB0cjsKICB9CiAgZnVuY1R5cGUgPSBvYmoxLmdldEludCgpOwoKICBpZiAoZnVuY1R5cGUgPT0gMCkgewogICAgZnVuYyA9IG5ldyBTYW1wbGVkRnVuY3Rpb24oZnVuY09iaiwgZGljdCk7CiAgfSBlbHNlIGlmIChmdW5jVHlwZSA9PSAyKSB7CiAgICBmdW5jID0gbmV3IEV4cG9uZW50aWFsRnVuY3Rpb24oZnVuY09iaiwgZGljdCk7CiAgfSBlbHNlIGlmIChmdW5jVHlwZSA9PSAzKSB7CiAgICBmdW5jID0gbmV3IFN0aXRjaGluZ0Z1bmN0aW9uKGZ1bmNPYmosIGRpY3QsIHVzZWRQYXJlbnRzKTsKICB9IGVsc2UgaWYgKGZ1bmNUeXBlID09IDQpIHsKICAgIGZ1bmMgPSBuZXcgUG9zdFNjcmlwdEZ1bmN0aW9uKGZ1bmNPYmosIGRpY3QpOwogIH0gZWxzZSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJVbmltcGxlbWVudGVkIGZ1bmN0aW9uIHR5cGUgKHswOmR9KSIsIGZ1bmNUeXBlKTsKICAgIHJldHVybiBudWxscHRyOwogIH0KICBpZiAoIWZ1bmMtPmlzT2soKSkgewogICAgZGVsZXRlIGZ1bmM7CiAgICByZXR1cm4gbnVsbHB0cjsKICB9CgogIHJldHVybiBmdW5jOwp9CgpGdW5jdGlvbjo6RnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gKmZ1bmMpIHsKICAgIG0gPSBmdW5jLT5tOwogICAgbiA9IGZ1bmMtPm47CgogICAgbWVtY3B5KGRvbWFpbiwgZnVuYy0+ZG9tYWluLCBmdW5jTWF4SW5wdXRzICogMiAqIHNpemVvZihkb3VibGUpKTsKICAgIG1lbWNweShyYW5nZSwgZnVuYy0+cmFuZ2UsIGZ1bmNNYXhPdXRwdXRzICogMiAqIHNpemVvZihkb3VibGUpKTsKCiAgICBoYXNSYW5nZSA9IGZ1bmMtPmhhc1JhbmdlOwp9CgpHQm9vbCBGdW5jdGlvbjo6aW5pdChEaWN0ICpkaWN0KSB7CiAgT2JqZWN0IG9iajE7CiAgaW50IGk7CgogIC8vLS0tLS0gRG9tYWluCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRG9tYWluIik7CiAgaWYgKCFvYmoxLmlzQXJyYXkoKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaXMgbWlzc2luZyBkb21haW4iKTsKICAgIHJldHVybiBnRmFsc2U7CiAgfQogIG0gPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgLyAyOwogIGlmIChtID4gZnVuY01heElucHV0cykgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb25zIHdpdGggbW9yZSB0aGFuIHswOmR9IGlucHV0cyBhcmUgdW5zdXBwb3J0ZWQiLAoJICBmdW5jTWF4SW5wdXRzKTsKICAgIHJldHVybiBnRmFsc2U7CiAgfQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldCgyKmkpOwogICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkb21haW4gYXJyYXkiKTsKICAgICAgcmV0dXJuIGdGYWxzZTsKICAgIH0KICAgIGRvbWFpbltpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICBvYmoyID0gb2JqMS5hcnJheUdldCgyKmkrMSk7CiAgICBpZiAoIW9iajIuaXNOdW0oKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGRvbWFpbiBhcnJheSIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgZG9tYWluW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICB9CgogIC8vLS0tLS0gUmFuZ2UKICBoYXNSYW5nZSA9IGdGYWxzZTsKICBuID0gMDsKICBvYmoxID0gZGljdC0+bG9va3VwKCJSYW5nZSIpOwogIGlmIChvYmoxLmlzQXJyYXkoKSkgewogICAgaGFzUmFuZ2UgPSBnVHJ1ZTsKICAgIG4gPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgLyAyOwogICAgaWYgKG4gPiBmdW5jTWF4T3V0cHV0cykgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gezA6ZH0gb3V0cHV0cyBhcmUgdW5zdXBwb3J0ZWQiLAoJICAgIGZ1bmNNYXhPdXRwdXRzKTsKICAgICAgcmV0dXJuIGdGYWxzZTsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSk7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIHJhbmdlIGFycmF5Iik7CglyZXR1cm4gZ0ZhbHNlOwogICAgICB9CiAgICAgIHJhbmdlW2ldWzBdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMiA9IG9iajEuYXJyYXlHZXQoMippKzEpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiByYW5nZSBhcnJheSIpOwoJcmV0dXJuIGdGYWxzZTsKICAgICAgfQogICAgICByYW5nZVtpXVsxXSA9IG9iajIuZ2V0TnVtKCk7CiAgICB9CiAgfQoKICByZXR1cm4gZ1RydWU7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIElkZW50aXR5RnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklkZW50aXR5RnVuY3Rpb246OklkZW50aXR5RnVuY3Rpb24oKSB7CiAgaW50IGk7CgogIC8vIGZpbGwgdGhlc2UgaW4gd2l0aCBhcmJpdHJhcnkgdmFsdWVzIGp1c3QgaW4gY2FzZSB0aGV5IGdldCB1c2VkCiAgLy8gc29tZXdoZXJlCiAgbSA9IGZ1bmNNYXhJbnB1dHM7CiAgbiA9IGZ1bmNNYXhPdXRwdXRzOwogIGZvciAoaSA9IDA7IGkgPCBmdW5jTWF4SW5wdXRzOyArK2kpIHsKICAgIGRvbWFpbltpXVswXSA9IDA7CiAgICBkb21haW5baV1bMV0gPSAxOwogIH0KICBoYXNSYW5nZSA9IGdGYWxzZTsKfQoKSWRlbnRpdHlGdW5jdGlvbjo6fklkZW50aXR5RnVuY3Rpb24oKSB7Cn0KCnZvaWQgSWRlbnRpdHlGdW5jdGlvbjo6dHJhbnNmb3JtKGRvdWJsZSAqaW4sIGRvdWJsZSAqb3V0KSB7CiAgaW50IGk7CgogIGZvciAoaSA9IDA7IGkgPCBmdW5jTWF4T3V0cHV0czsgKytpKSB7CiAgICBvdXRbaV0gPSBpbltpXTsKICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNhbXBsZWRGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU2FtcGxlZEZ1bmN0aW9uOjpTYW1wbGVkRnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0KSB7CiAgU3RyZWFtICpzdHI7CiAgaW50IHNhbXBsZUJpdHM7CiAgZG91YmxlIHNhbXBsZU11bDsKICBPYmplY3Qgb2JqMTsKICBHdWludCBidWYsIGJpdE1hc2s7CiAgaW50IGJpdHM7CiAgR3VpbnQgczsKICBkb3VibGUgaW5bZnVuY01heElucHV0c107CiAgaW50IGksIGosIHQsIGJpdCwgaWR4OwoKICBpZHhPZmZzZXQgPSBudWxscHRyOwogIHNhbXBsZXMgPSBudWxscHRyOwogIHNCdWYgPSBudWxscHRyOwogIG9rID0gZ0ZhbHNlOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKCFoYXNSYW5nZSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSAwIGZ1bmN0aW9uIGlzIG1pc3NpbmcgcmFuZ2UiKTsKICAgIHJldHVybjsKICB9CiAgaWYgKG0gPiBzYW1wbGVkRnVuY01heElucHV0cykgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU2FtcGxlZCBmdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gezA6ZH0gaW5wdXRzIGFyZSB1bnN1cHBvcnRlZCIsCgkgIHNhbXBsZWRGdW5jTWF4SW5wdXRzKTsKICAgIHJldHVybjsKICB9CgogIC8vLS0tLS0gYnVmZmVyCiAgc0J1ZiA9IChkb3VibGUgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihkb3VibGUpKTsKCiAgLy8tLS0tLSBnZXQgdGhlIHN0cmVhbQogIGlmICghZnVuY09iai0+aXNTdHJlYW0oKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSAwIGZ1bmN0aW9uIGlzbid0IGEgc3RyZWFtIik7CiAgICByZXR1cm47CiAgfQogIHN0ciA9IGZ1bmNPYmotPmdldFN0cmVhbSgpOwoKICAvLy0tLS0tIFNpemUKICBvYmoxID0gZGljdC0+bG9va3VwKCJTaXplIik7CiAgaWYgKCFvYmoxLmlzQXJyYXkoKSB8fCBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gbSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBzaXplIGFycmF5Iik7CiAgICByZXR1cm47CiAgfQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldChpKTsKICAgIGlmICghb2JqMi5pc0ludCgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gc2l6ZSBhcnJheSIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzYW1wbGVTaXplW2ldID0gb2JqMi5nZXRJbnQoKTsKICAgIGlmIChzYW1wbGVTaXplW2ldIDw9IDApIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCBub24tcG9zaXRpdmUgdmFsdWUgaW4gZnVuY3Rpb24gc2l6ZSBhcnJheSIpOwogICAgICByZXR1cm47CiAgICB9CiAgfQogIGlkeE9mZnNldCA9IChpbnQgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihpbnQpKTsKICBmb3IgKGkgPSAwOyBpIDwgKDE8PG0pOyArK2kpIHsKICAgIGlkeCA9IDA7CiAgICBmb3IgKGogPSBtIC0gMSwgdCA9IGk7IGogPj0gMTsgLS1qLCB0IDw8PSAxKSB7CiAgICAgIGlmIChzYW1wbGVTaXplW2pdID09IDEpIHsKCWJpdCA9IDA7CiAgICAgIH0gZWxzZSB7CgliaXQgPSAodCA+PiAobSAtIDEpKSAmIDE7CiAgICAgIH0KICAgICAgaWR4ID0gKGlkeCArIGJpdCkgKiBzYW1wbGVTaXplW2otMV07CiAgICB9CiAgICBpZiAoc2FtcGxlU2l6ZVswXSA9PSAxKSB7CiAgICAgIGJpdCA9IDA7CiAgICB9IGVsc2UgewogICAgICBiaXQgPSAodCA+PiAobSAtIDEpKSAmIDE7CiAgICB9CiAgICBpZHhPZmZzZXRbaV0gPSAoaWR4ICsgYml0KSAqIG47CiAgfQoKICAvLy0tLS0tIEJpdHNQZXJTYW1wbGUKICBvYmoxID0gZGljdC0+bG9va3VwKCJCaXRzUGVyU2FtcGxlIik7CiAgaWYgKCFvYmoxLmlzSW50KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgQml0c1BlclNhbXBsZSIpOwogICAgcmV0dXJuOwogIH0KICBzYW1wbGVCaXRzID0gb2JqMS5nZXRJbnQoKTsKICBpZiAodW5saWtlbHkoc2FtcGxlQml0cyA8IDEgfHwgc2FtcGxlQml0cyA+IDMyKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaW52YWxpZCBCaXRzUGVyU2FtcGxlIik7CiAgICByZXR1cm47CiAgfQogIHNhbXBsZU11bCA9IDEuMCAvIChwb3coMi4wLCAoZG91YmxlKXNhbXBsZUJpdHMpIC0gMSk7CgogIC8vLS0tLS0gRW5jb2RlCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRW5jb2RlIik7CiAgaWYgKG9iajEuaXNBcnJheSgpICYmIG9iajEuYXJyYXlHZXRMZW5ndGgoKSA9PSAyKm0pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSk7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGVuY29kZSBhcnJheSIpOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGVuY29kZVtpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSsxKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZW5jb2RlIGFycmF5Iik7CglyZXR1cm47CiAgICAgIH0KICAgICAgZW5jb2RlW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgIH0KICB9IGVsc2UgewogICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgICBlbmNvZGVbaV1bMF0gPSAwOwogICAgICBlbmNvZGVbaV1bMV0gPSBzYW1wbGVTaXplW2ldIC0gMTsKICAgIH0KICB9CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaWYgKHVubGlrZWx5KChkb21haW5baV1bMV0gLSBkb21haW5baV1bMF0pID09IDApKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZG9tYWluIGFycmF5Iik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlucHV0TXVsW2ldID0gKGVuY29kZVtpXVsxXSAtIGVuY29kZVtpXVswXSkgLwogICAgICAgICAgICAgICAgICAoZG9tYWluW2ldWzFdIC0gZG9tYWluW2ldWzBdKTsKICB9CgogIC8vLS0tLS0gRGVjb2RlCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRGVjb2RlIik7CiAgaWYgKG9iajEuaXNBcnJheSgpICYmCiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSA9PSAyKm4pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSk7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGRlY29kZSBhcnJheSIpOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGRlY29kZVtpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSsxKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZGVjb2RlIGFycmF5Iik7CglyZXR1cm47CiAgICAgIH0KICAgICAgZGVjb2RlW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgIH0KICB9IGVsc2UgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBkZWNvZGVbaV1bMF0gPSByYW5nZVtpXVswXTsKICAgICAgZGVjb2RlW2ldWzFdID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQoKICAvLy0tLS0tIHNhbXBsZXMKICBuU2FtcGxlcyA9IG47CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkKICAgIG5TYW1wbGVzICo9IHNhbXBsZVNpemVbaV07CiAgc2FtcGxlcyA9IChkb3VibGUgKilnbWFsbG9jbl9jaGVja292ZXJmbG93KG5TYW1wbGVzLCBzaXplb2YoZG91YmxlKSk7CiAgaWYgKCFzYW1wbGVzKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbiBoYXMgaW52YWxpZCBudW1iZXIgb2Ygc2FtcGxlcyIpOwogICAgcmV0dXJuOwogIH0KICBidWYgPSAwOwogIGJpdHMgPSAwOwogIGJpdE1hc2sgPSAoMSA8PCBzYW1wbGVCaXRzKSAtIDE7CiAgc3RyLT5yZXNldCgpOwogIGZvciAoaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICBpZiAoc2FtcGxlQml0cyA9PSA4KSB7CiAgICAgIHMgPSBzdHItPmdldENoYXIoKTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlQml0cyA9PSAxNikgewogICAgICBzID0gc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgfSBlbHNlIGlmIChzYW1wbGVCaXRzID09IDMyKSB7CiAgICAgIHMgPSBzdHItPmdldENoYXIoKTsKICAgICAgcyA9IChzIDw8IDgpICsgc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgICBzID0gKHMgPDwgOCkgKyBzdHItPmdldENoYXIoKTsKICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlIChiaXRzIDwgc2FtcGxlQml0cykgewoJYnVmID0gKGJ1ZiA8PCA4KSB8IChzdHItPmdldENoYXIoKSAmIDB4ZmYpOwoJYml0cyArPSA4OwogICAgICB9CiAgICAgIHMgPSAoYnVmID4+IChiaXRzIC0gc2FtcGxlQml0cykpICYgYml0TWFzazsKICAgICAgYml0cyAtPSBzYW1wbGVCaXRzOwogICAgfQogICAgc2FtcGxlc1tpXSA9IChkb3VibGUpcyAqIHNhbXBsZU11bDsKICB9CiAgc3RyLT5jbG9zZSgpOwoKICAvLyBzZXQgdXAgdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaW5baV0gPSBkb21haW5baV1bMF07CiAgICBjYWNoZUluW2ldID0gaW5baV0gLSAxOwogIH0KICB0cmFuc2Zvcm0oaW4sIGNhY2hlT3V0KTsKCiAgb2sgPSBnVHJ1ZTsKfQoKU2FtcGxlZEZ1bmN0aW9uOjp+U2FtcGxlZEZ1bmN0aW9uKCkgewogIGlmIChpZHhPZmZzZXQpIHsKICAgIGdmcmVlKGlkeE9mZnNldCk7CiAgfQogIGlmIChzYW1wbGVzKSB7CiAgICBnZnJlZShzYW1wbGVzKTsKICB9CiAgaWYgKHNCdWYpIHsKICAgIGdmcmVlKHNCdWYpOwogIH0KfQoKU2FtcGxlZEZ1bmN0aW9uOjpTYW1wbGVkRnVuY3Rpb24oY29uc3QgU2FtcGxlZEZ1bmN0aW9uICpmdW5jKSA6IEZ1bmN0aW9uKGZ1bmMpIHsKICBtZW1jcHkoc2FtcGxlU2l6ZSwgZnVuYy0+c2FtcGxlU2l6ZSwgZnVuY01heElucHV0cyAqIHNpemVvZihpbnQpKTsKCiAgbWVtY3B5KGVuY29kZSwgZnVuYy0+ZW5jb2RlLCBmdW5jTWF4SW5wdXRzICogMiAqIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoZGVjb2RlLCBmdW5jLT5kZWNvZGUsIGZ1bmNNYXhPdXRwdXRzICogMiAqIHNpemVvZihkb3VibGUpKTsKCiAgbWVtY3B5KGlucHV0TXVsLCBmdW5jLT5pbnB1dE11bCwgZnVuY01heElucHV0cyAqIHNpemVvZihkb3VibGUpKTsKCiAgblNhbXBsZXMgPSBmdW5jLT5uU2FtcGxlczsKCiAgaWR4T2Zmc2V0ID0gKGludCAqKWdtYWxsb2NuKDEgPDwgbSwgc2l6ZW9mKGludCkpOwogIG1lbWNweShpZHhPZmZzZXQsIGZ1bmMtPmlkeE9mZnNldCwgKDEgPDwgbSkgKiAoaW50KXNpemVvZihpbnQpKTsKCiAgc2FtcGxlcyA9IChkb3VibGUgKilnbWFsbG9jbihuU2FtcGxlcywgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShzYW1wbGVzLCBmdW5jLT5zYW1wbGVzLCBuU2FtcGxlcyAqIHNpemVvZihkb3VibGUpKTsKCiAgc0J1ZiA9IChkb3VibGUgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihkb3VibGUpKTsKCiAgbWVtY3B5KGNhY2hlSW4sIGZ1bmMtPmNhY2hlSW4sIGZ1bmNNYXhJbnB1dHMgKiBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGNhY2hlT3V0LCBmdW5jLT5jYWNoZU91dCwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CgogIG9rID0gZnVuYy0+b2s7Cn0KCnZvaWQgU2FtcGxlZEZ1bmN0aW9uOjp0cmFuc2Zvcm0oZG91YmxlICppbiwgZG91YmxlICpvdXQpIHsKICBkb3VibGUgeDsKICBpbnQgZVtmdW5jTWF4SW5wdXRzXTsKICBkb3VibGUgZWZyYWMwW2Z1bmNNYXhJbnB1dHNdOwogIGRvdWJsZSBlZnJhYzFbZnVuY01heElucHV0c107CiAgaW50IGksIGosIGssIGlkeDAsIHQ7CgogIC8vIGNoZWNrIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGlmIChpbltpXSAhPSBjYWNoZUluW2ldKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoaSA9PSBtKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG91dFtpXSA9IGNhY2hlT3V0W2ldOwogICAgfQogICAgcmV0dXJuOwogIH0KCiAgLy8gbWFwIGlucHV0IHZhbHVlcyBpbnRvIHNhbXBsZSBhcnJheQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIHggPSAoaW5baV0gLSBkb21haW5baV1bMF0pICogaW5wdXRNdWxbaV0gKyBlbmNvZGVbaV1bMF07CiAgICBpZiAoeCA8IDAgfHwgeCAhPSB4KSB7ICAvLyB4IT14IGlzIGEgbW9yZSBwb3J0YWJsZSB2ZXJzaW9uIG9mIGlzbmFuKHgpCiAgICAgIHggPSAwOwogICAgfSBlbHNlIGlmICh4ID4gc2FtcGxlU2l6ZVtpXSAtIDEpIHsKICAgICAgeCA9IHNhbXBsZVNpemVbaV0gLSAxOwogICAgfQogICAgZVtpXSA9IChpbnQpeDsKICAgIGlmIChlW2ldID09IHNhbXBsZVNpemVbaV0gLSAxICYmIHNhbXBsZVNpemVbaV0gPiAxKSB7CiAgICAgIC8vIHRoaXMgaGFwcGVucyBpZiBpbltpXSA9IGRvbWFpbltpXVsxXQogICAgICBlW2ldID0gc2FtcGxlU2l6ZVtpXSAtIDI7CiAgICB9CiAgICBlZnJhYzFbaV0gPSB4IC0gZVtpXTsKICAgIGVmcmFjMFtpXSA9IDEgLSBlZnJhYzFbaV07CiAgfQoKICAvLyBjb21wdXRlIGluZGV4IGZvciB0aGUgZmlyc3Qgc2FtcGxlIHRvIGJlIHVzZWQKICBpZHgwID0gMDsKICBmb3IgKGsgPSBtIC0gMTsgayA+PSAxOyAtLWspIHsKICAgIGlkeDAgPSAoaWR4MCArIGVba10pICogc2FtcGxlU2l6ZVtrLTFdOwogIH0KICBpZHgwID0gKGlkeDAgKyBlWzBdKSAqIG47CgogIC8vIGZvciBlYWNoIG91dHB1dCwgZG8gbS1saW5lYXIgaW50ZXJwb2xhdGlvbgogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKCiAgICAvLyBwdWxsIDJebSB2YWx1ZXMgb3V0IG9mIHRoZSBzYW1wbGUgYXJyYXkKICAgIGZvciAoaiA9IDA7IGogPCAoMTw8bSk7ICsraikgewogICAgICBpbnQgaWR4ID0gaWR4MCArIGlkeE9mZnNldFtqXSArIGk7CiAgICAgIGlmIChsaWtlbHkoaWR4ID49IDAgJiYgaWR4IDwgblNhbXBsZXMpKSB7CiAgICAgICAgc0J1ZltqXSA9IHNhbXBsZXNbaWR4XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzQnVmW2pdID0gMDsgLy8gVE9ETyBJbnZlc3RpZ2F0ZSBpZiB0aGlzIGlzIHdoYXQgQWRvYmUgZG9lcwogICAgICB9CiAgICB9CgogICAgLy8gZG8gbSBzZXRzIG9mIGludGVycG9sYXRpb25zCiAgICBmb3IgKGogPSAwLCB0ID0gKDE8PG0pOyBqIDwgbTsgKytqLCB0ID4+PSAxKSB7CiAgICAgIGZvciAoayA9IDA7IGsgPCB0OyBrICs9IDIpIHsKCXNCdWZbayA+PiAxXSA9IGVmcmFjMFtqXSAqIHNCdWZba10gKyBlZnJhYzFbal0gKiBzQnVmW2srMV07CiAgICAgIH0KICAgIH0KCiAgICAvLyBtYXAgb3V0cHV0IHZhbHVlIHRvIHJhbmdlCiAgICBvdXRbaV0gPSBzQnVmWzBdICogKGRlY29kZVtpXVsxXSAtIGRlY29kZVtpXVswXSkgKyBkZWNvZGVbaV1bMF07CiAgICBpZiAob3V0W2ldIDwgcmFuZ2VbaV1bMF0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMF07CiAgICB9IGVsc2UgaWYgKG91dFtpXSA+IHJhbmdlW2ldWzFdKSB7CiAgICAgIG91dFtpXSA9IHJhbmdlW2ldWzFdOwogICAgfQogIH0KCiAgLy8gc2F2ZSBjdXJyZW50IHJlc3VsdCBpbiB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBjYWNoZUluW2ldID0gaW5baV07CiAgfQogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIGNhY2hlT3V0W2ldID0gb3V0W2ldOwogIH0KfQoKR0Jvb2wgU2FtcGxlZEZ1bmN0aW9uOjpoYXNEaWZmZXJlbnRSZXN1bHRTZXQoRnVuY3Rpb24gKmZ1bmMpIHsKICBpZiAoZnVuYy0+Z2V0VHlwZSgpID09IDApIHsKICAgIFNhbXBsZWRGdW5jdGlvbiAqY29tcFRvID0gKFNhbXBsZWRGdW5jdGlvbiAqKSBmdW5jOwogICAgaWYgKGNvbXBUby0+Z2V0U2FtcGxlTnVtYmVyKCkgIT0gblNhbXBsZXMpCiAgICAgIHJldHVybiBnVHJ1ZTsKICAgIGRvdWJsZSAqY29tcFNhbXBsZXMgPSBjb21wVG8tPmdldFNhbXBsZXMoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblNhbXBsZXM7IGkrKykgewogICAgICBpZiAoc2FtcGxlc1tpXSAhPSBjb21wU2FtcGxlc1tpXSkKICAgICAgICByZXR1cm4gZ1RydWU7CiAgICB9CiAgfQogIHJldHVybiBnRmFsc2U7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEV4cG9uZW50aWFsRnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkV4cG9uZW50aWFsRnVuY3Rpb246OkV4cG9uZW50aWFsRnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0KSB7CiAgT2JqZWN0IG9iajE7CgogIG9rID0gZ0ZhbHNlOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKG0gIT0gMSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRXhwb25lbnRpYWwgZnVuY3Rpb24gd2l0aCBtb3JlIHRoYW4gb25lIGlucHV0Iik7CiAgICByZXR1cm47CiAgfQoKICAvLy0tLS0tIEMwCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiQzAiKTsKICBpZiAob2JqMS5pc0FycmF5KCkpIHsKICAgIGlmIChoYXNSYW5nZSAmJiBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gbikgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMwIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBuID0gb2JqMS5hcnJheUdldExlbmd0aCgpOwogICAgaWYgKHVubGlrZWx5KG4gPiBmdW5jTWF4T3V0cHV0cykpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMCBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgbiA9IGZ1bmNNYXhPdXRwdXRzOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KGkpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBDMCBhcnJheSIpOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGMwW2ldID0gb2JqMi5nZXROdW0oKTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGhhc1JhbmdlICYmIG4gIT0gMSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMwIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBuID0gMTsKICAgIGMwWzBdID0gMDsKICB9CgogIC8vLS0tLS0gQzEKICBvYmoxID0gZGljdC0+bG9va3VwKCJDMSIpOwogIGlmIChvYmoxLmlzQXJyYXkoKSkgewogICAgaWYgKG9iajEuYXJyYXlHZXRMZW5ndGgoKSAhPSBuKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uJ3MgQzEgYXJyYXkgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldChpKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gQzEgYXJyYXkiKTsKCXJldHVybjsKICAgICAgfQogICAgICBjMVtpXSA9IG9iajIuZ2V0TnVtKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmIChuICE9IDEpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMSBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYzFbMF0gPSAxOwogIH0KCiAgLy8tLS0tLSBOIChleHBvbmVudCkKICBvYmoxID0gZGljdC0+bG9va3VwKCJOIik7CiAgaWYgKCFvYmoxLmlzTnVtKCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgTiIpOwogICAgcmV0dXJuOwogIH0KICBlID0gb2JqMS5nZXROdW0oKTsKCiAgaXNMaW5lYXIgPSBmYWJzKGUtMS4pIDwgMWUtMTA7CiAgb2sgPSBnVHJ1ZTsKfQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6fkV4cG9uZW50aWFsRnVuY3Rpb24oKSB7Cn0KCkV4cG9uZW50aWFsRnVuY3Rpb246OkV4cG9uZW50aWFsRnVuY3Rpb24oY29uc3QgRXhwb25lbnRpYWxGdW5jdGlvbiAqZnVuYykgOiBGdW5jdGlvbihmdW5jKSB7CiAgbWVtY3B5KGMwLCBmdW5jLT5jMCwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGMxLCBmdW5jLT5jMSwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CgogIGUgPSBmdW5jLT5lOwogIGlzTGluZWFyID0gZnVuYy0+aXNMaW5lYXI7CiAgb2sgPSBmdW5jLT5vazsKfQoKdm9pZCBFeHBvbmVudGlhbEZ1bmN0aW9uOjp0cmFuc2Zvcm0oZG91YmxlICppbiwgZG91YmxlICpvdXQpIHsKICBkb3VibGUgeDsKICBpbnQgaTsKCiAgaWYgKGluWzBdIDwgZG9tYWluWzBdWzBdKSB7CiAgICB4ID0gZG9tYWluWzBdWzBdOwogIH0gZWxzZSBpZiAoaW5bMF0gPiBkb21haW5bMF1bMV0pIHsKICAgIHggPSBkb21haW5bMF1bMV07CiAgfSBlbHNlIHsKICAgIHggPSBpblswXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgb3V0W2ldID0gYzBbaV0gKyAoaXNMaW5lYXIgPyB4IDogcG93KHgsIGUpKSAqIChjMVtpXSAtIGMwW2ldKTsKICAgIGlmIChoYXNSYW5nZSkgewogICAgICBpZiAob3V0W2ldIDwgcmFuZ2VbaV1bMF0pIHsKCW91dFtpXSA9IHJhbmdlW2ldWzBdOwogICAgICB9IGVsc2UgaWYgKG91dFtpXSA+IHJhbmdlW2ldWzFdKSB7CglvdXRbaV0gPSByYW5nZVtpXVsxXTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm47Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFN0aXRjaGluZ0Z1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTdGl0Y2hpbmdGdW5jdGlvbjo6U3RpdGNoaW5nRnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0LCBzdGQ6OnNldDxpbnQ+ICp1c2VkUGFyZW50cykgewogIE9iamVjdCBvYmoxOwogIGludCBpOwoKICBvayA9IGdGYWxzZTsKICBmdW5jcyA9IG51bGxwdHI7CiAgYm91bmRzID0gbnVsbHB0cjsKICBlbmNvZGUgPSBudWxscHRyOwogIHNjYWxlID0gbnVsbHB0cjsKCiAgLy8tLS0tLSBpbml0aWFsaXplIHRoZSBnZW5lcmljIHN0dWZmCiAgaWYgKCFpbml0KGRpY3QpKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChtICE9IDEpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0aXRjaGluZyBmdW5jdGlvbiB3aXRoIG1vcmUgdGhhbiBvbmUgaW5wdXQiKTsKICAgIHJldHVybjsKICB9CgogIC8vLS0tLS0gRnVuY3Rpb25zCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRnVuY3Rpb25zIik7CiAgaWYgKCFvYmoxLmlzQXJyYXkoKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiTWlzc2luZyAnRnVuY3Rpb25zJyBlbnRyeSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgIHJldHVybjsKICB9CiAgayA9IG9iajEuYXJyYXlHZXRMZW5ndGgoKTsKICBmdW5jcyA9IChGdW5jdGlvbiAqKilnbWFsbG9jbihrLCBzaXplb2YoRnVuY3Rpb24gKikpOwogIGJvdW5kcyA9IChkb3VibGUgKilnbWFsbG9jbihrICsgMSwgc2l6ZW9mKGRvdWJsZSkpOwogIGVuY29kZSA9IChkb3VibGUgKilnbWFsbG9jbigyICogaywgc2l6ZW9mKGRvdWJsZSkpOwogIHNjYWxlID0gKGRvdWJsZSAqKWdtYWxsb2NuKGssIHNpemVvZihkb3VibGUpKTsKICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBmdW5jc1tpXSA9IG51bGxwdHI7CiAgfQogIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgIHN0ZDo6c2V0PGludD4gdXNlZFBhcmVudHNBdXggPSAqdXNlZFBhcmVudHM7CiAgICBPYmplY3Qgb2JqMiA9IG9iajEuYXJyYXlHZXRORihpKTsKICAgIGlmIChvYmoyLmlzUmVmKCkpIHsKICAgICAgY29uc3QgUmVmIHJlZiA9IG9iajIuZ2V0UmVmKCk7CiAgICAgIGlmICh1c2VkUGFyZW50c0F1eC5maW5kKHJlZi5udW0pID09IHVzZWRQYXJlbnRzQXV4LmVuZCgpKSB7CiAgICAgICAgdXNlZFBhcmVudHNBdXguaW5zZXJ0KHJlZi5udW0pOwogICAgICAgIG9iajIgPSBvYmoxLmFycmF5R2V0KGkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgaWYgKCEoZnVuY3NbaV0gPSBGdW5jdGlvbjo6cGFyc2UoJm9iajIsICZ1c2VkUGFyZW50c0F1eCkpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChmdW5jc1tpXS0+Z2V0SW5wdXRTaXplKCkgIT0gMSB8fAoJKGkgPiAwICYmIGZ1bmNzW2ldLT5nZXRPdXRwdXRTaXplKCkgIT0gZnVuY3NbMF0tPmdldE91dHB1dFNpemUoKSkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJICAgICJJbmNvbXBhdGlibGUgc3ViZnVuY3Rpb25zIGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgfQoKICAvLy0tLS0tIEJvdW5kcwogIG9iajEgPSBkaWN0LT5sb29rdXAoIkJvdW5kcyIpOwogIGlmICghb2JqMS5pc0FycmF5KCkgfHwgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IGsgLSAxKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJNaXNzaW5nIG9yIGludmFsaWQgJ0JvdW5kcycgZW50cnkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICByZXR1cm47CiAgfQogIGJvdW5kc1swXSA9IGRvbWFpblswXVswXTsKICBmb3IgKGkgPSAxOyBpIDwgazsgKytpKSB7CiAgICBPYmplY3Qgb2JqMiA9IG9iajEuYXJyYXlHZXQoaSAtIDEpOwogICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSW52YWxpZCB0eXBlIGluICdCb3VuZHMnIGFycmF5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBib3VuZHNbaV0gPSBvYmoyLmdldE51bSgpOwogIH0KICBib3VuZHNba10gPSBkb21haW5bMF1bMV07CgogIC8vLS0tLS0gRW5jb2RlCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRW5jb2RlIik7CiAgaWYgKCFvYmoxLmlzQXJyYXkoKSB8fCBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gMiAqIGspIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIk1pc3Npbmcgb3IgaW52YWxpZCAnRW5jb2RlJyBlbnRyeSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgIHJldHVybjsKICB9CiAgZm9yIChpID0gMDsgaSA8IDIgKiBrOyArK2kpIHsKICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldChpKTsKICAgIGlmICghb2JqMi5pc051bSgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkludmFsaWQgdHlwZSBpbiAnRW5jb2RlJyBhcnJheSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZW5jb2RlW2ldID0gb2JqMi5nZXROdW0oKTsKICB9CgogIC8vLS0tLS0gcHJlLWNvbXB1dGUgdGhlIHNjYWxlIGZhY3RvcnMKICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBpZiAoYm91bmRzW2ldID09IGJvdW5kc1tpKzFdKSB7CiAgICAgIC8vIGF2b2lkIGEgZGl2aWRlLWJ5LXplcm8gLS0gaW4gdGhpcyBzaXR1YXRpb24sIGZ1bmN0aW9uIGkgd2lsbAogICAgICAvLyBuZXZlciBiZSB1c2VkIGFueXdheQogICAgICBzY2FsZVtpXSA9IDA7CiAgICB9IGVsc2UgewogICAgICBzY2FsZVtpXSA9IChlbmNvZGVbMippKzFdIC0gZW5jb2RlWzIqaV0pIC8gKGJvdW5kc1tpKzFdIC0gYm91bmRzW2ldKTsKICAgIH0KICB9CgogIG4gPSBmdW5jc1swXS0+Z2V0T3V0cHV0U2l6ZSgpOwogIG9rID0gZ1RydWU7CiAgcmV0dXJuOwp9CgpTdGl0Y2hpbmdGdW5jdGlvbjo6U3RpdGNoaW5nRnVuY3Rpb24oY29uc3QgU3RpdGNoaW5nRnVuY3Rpb24gKmZ1bmMpIDogRnVuY3Rpb24oZnVuYykgewogIGsgPSBmdW5jLT5rOwoKICBmdW5jcyA9IChGdW5jdGlvbiAqKilnbWFsbG9jbihrLCBzaXplb2YoRnVuY3Rpb24gKikpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBmdW5jc1tpXSA9IGZ1bmMtPmZ1bmNzW2ldLT5jb3B5KCk7CiAgfQoKICBib3VuZHMgPSAoZG91YmxlICopZ21hbGxvY24oayArIDEsIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoYm91bmRzLCBmdW5jLT5ib3VuZHMsIChrICsgMSkgKiBzaXplb2YoZG91YmxlKSk7CgogIGVuY29kZSA9IChkb3VibGUgKilnbWFsbG9jbigyICogaywgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShlbmNvZGUsIGZ1bmMtPmVuY29kZSwgMiAqIGsgKiBzaXplb2YoZG91YmxlKSk7CgogIHNjYWxlID0gKGRvdWJsZSAqKWdtYWxsb2NuKGssIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoc2NhbGUsIGZ1bmMtPnNjYWxlLCBrICogc2l6ZW9mKGRvdWJsZSkpOwoKICBvayA9IGZ1bmMtPm9rOwp9CgpTdGl0Y2hpbmdGdW5jdGlvbjo6flN0aXRjaGluZ0Z1bmN0aW9uKCkgewogIGludCBpOwoKICBpZiAoZnVuY3MpIHsKICAgIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgICAgaWYgKGZ1bmNzW2ldKSB7CglkZWxldGUgZnVuY3NbaV07CiAgICAgIH0KICAgIH0KICB9CiAgZ2ZyZWUoZnVuY3MpOwogIGdmcmVlKGJvdW5kcyk7CiAgZ2ZyZWUoZW5jb2RlKTsKICBnZnJlZShzY2FsZSk7Cn0KCnZvaWQgU3RpdGNoaW5nRnVuY3Rpb246OnRyYW5zZm9ybShkb3VibGUgKmluLCBkb3VibGUgKm91dCkgewogIGRvdWJsZSB4OwogIGludCBpOwoKICBpZiAoaW5bMF0gPCBkb21haW5bMF1bMF0pIHsKICAgIHggPSBkb21haW5bMF1bMF07CiAgfSBlbHNlIGlmIChpblswXSA+IGRvbWFpblswXVsxXSkgewogICAgeCA9IGRvbWFpblswXVsxXTsKICB9IGVsc2UgewogICAgeCA9IGluWzBdOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgayAtIDE7ICsraSkgewogICAgaWYgKHggPCBib3VuZHNbaSsxXSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgeCA9IGVuY29kZVsyKmldICsgKHggLSBib3VuZHNbaV0pICogc2NhbGVbaV07CiAgZnVuY3NbaV0tPnRyYW5zZm9ybSgmeCwgb3V0KTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUG9zdFNjcmlwdEZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplbnVtIFBTT3AgewogIHBzT3BBYnMsCiAgcHNPcEFkZCwKICBwc09wQW5kLAogIHBzT3BBdGFuLAogIHBzT3BCaXRzaGlmdCwKICBwc09wQ2VpbGluZywKICBwc09wQ29weSwKICBwc09wQ29zLAogIHBzT3BDdmksCiAgcHNPcEN2ciwKICBwc09wRGl2LAogIHBzT3BEdXAsCiAgcHNPcEVxLAogIHBzT3BFeGNoLAogIHBzT3BFeHAsCiAgcHNPcEZhbHNlLAogIHBzT3BGbG9vciwKICBwc09wR2UsCiAgcHNPcEd0LAogIHBzT3BJZGl2LAogIHBzT3BJbmRleCwKICBwc09wTGUsCiAgcHNPcExuLAogIHBzT3BMb2csCiAgcHNPcEx0LAogIHBzT3BNb2QsCiAgcHNPcE11bCwKICBwc09wTmUsCiAgcHNPcE5lZywKICBwc09wTm90LAogIHBzT3BPciwKICBwc09wUG9wLAogIHBzT3BSb2xsLAogIHBzT3BSb3VuZCwKICBwc09wU2luLAogIHBzT3BTcXJ0LAogIHBzT3BTdWIsCiAgcHNPcFRydWUsCiAgcHNPcFRydW5jYXRlLAogIHBzT3BYb3IsCiAgcHNPcElmLAogIHBzT3BJZmVsc2UsCiAgcHNPcFJldHVybgp9OwoKLy8gTm90ZTogJ2lmJyBhbmQgJ2lmZWxzZScgYXJlIHBhcnNlZCBzZXBhcmF0ZWx5LgovLyBUaGUgcmVzdCBhcmUgbGlzdGVkIGhlcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgovLyBUaGUgaW5kZXggaW4gdGhpcyB0YWJsZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBlbnRyeSBpbiBQU09wLgpzdGF0aWMgY29uc3QgY2hhciAqcHNPcE5hbWVzW10gPSB7CiAgImFicyIsCiAgImFkZCIsCiAgImFuZCIsCiAgImF0YW4iLAogICJiaXRzaGlmdCIsCiAgImNlaWxpbmciLAogICJjb3B5IiwKICAiY29zIiwKICAiY3ZpIiwKICAiY3ZyIiwKICAiZGl2IiwKICAiZHVwIiwKICAiZXEiLAogICJleGNoIiwKICAiZXhwIiwKICAiZmFsc2UiLAogICJmbG9vciIsCiAgImdlIiwKICAiZ3QiLAogICJpZGl2IiwKICAiaW5kZXgiLAogICJsZSIsCiAgImxuIiwKICAibG9nIiwKICAibHQiLAogICJtb2QiLAogICJtdWwiLAogICJuZSIsCiAgIm5lZyIsCiAgIm5vdCIsCiAgIm9yIiwKICAicG9wIiwKICAicm9sbCIsCiAgInJvdW5kIiwKICAic2luIiwKICAic3FydCIsCiAgInN1YiIsCiAgInRydWUiLAogICJ0cnVuY2F0ZSIsCiAgInhvciIKfTsKCiNkZWZpbmUgblBTT3BzIChzaXplb2YocHNPcE5hbWVzKSAvIHNpemVvZihjaGFyICopKQoKZW51bSBQU09iamVjdFR5cGUgewogIHBzQm9vbCwKICBwc0ludCwKICBwc1JlYWwsCiAgcHNPcGVyYXRvciwKICBwc0Jsb2NrCn07CgovLyBJbiB0aGUgY29kZSBhcnJheSwgJ2lmJy8naWZlbHNlJyBvcGVyYXRvcnMgdGFrZSB1cCB0aHJlZSBzbG90cwovLyBwbHVzIHNwYWNlIGZvciB0aGUgY29kZSBpbiB0aGUgc3ViY2xhdXNlKHMpLgovLwovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBwc09wZXJhdG9yOiBwc09wSWYgLyBwc09wSWZlbHNlIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgICAgIHwgcHNCbG9jazogcHRyPTxBPiAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IHBzQmxvY2s6IHB0cj08Qj4gICAgICAgICAgICAgICAgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBpZiBjbGF1c2UgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgcHNPcGVyYXRvcjogcHNPcFJldHVybiAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgIDxBPiB8IGVsc2UgY2xhdXNlICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCBwc09wZXJhdG9yOiBwc09wUmV0dXJuICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgPEI+IHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vCi8vIEZvciAnaWYnLCBwb2ludGVyIDxBPiBpcyBwcmVzZW50IGluIHRoZSBjb2RlIHN0cmVhbSBidXQgdW51c2VkLgoKc3RydWN0IFBTT2JqZWN0IHsKICBQU09iamVjdFR5cGUgdHlwZTsKICB1bmlvbiB7CiAgICBHQm9vbCBib29sbjsJCS8vIGJvb2xlYW4gKHN0YWNrIG9ubHkpCiAgICBpbnQgaW50ZzsJCQkvLyBpbnRlZ2VyIChzdGFjayBhbmQgY29kZSkKICAgIGRvdWJsZSByZWFsOwkJLy8gcmVhbCAoc3RhY2sgYW5kIGNvZGUpCiAgICBQU09wIG9wOwkJCS8vIG9wZXJhdG9yIChjb2RlIG9ubHkpCiAgICBpbnQgYmxrOwkJCS8vIGlmL2lmZWxzZSBibG9jayBwb2ludGVyIChjb2RlIG9ubHkpCiAgfTsKfTsKCiNkZWZpbmUgcHNTdGFja1NpemUgMTAwCgpjbGFzcyBQU1N0YWNrIHsKcHVibGljOgoKICBQU1N0YWNrKCkge3NwID0gcHNTdGFja1NpemU7IH0KICB2b2lkIGNsZWFyKCkgeyBzcCA9IHBzU3RhY2tTaXplOyB9CiAgdm9pZCBwdXNoQm9vbChHQm9vbCBib29sbikKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc0Jvb2w7CiAgICAgIHN0YWNrW3NwXS5ib29sbiA9IGJvb2xuOwogICAgfQogIH0KICB2b2lkIHB1c2hJbnQoaW50IGludGcpCiAgewogICAgaWYgKGNoZWNrT3ZlcmZsb3coKSkgewogICAgICBzdGFja1stLXNwXS50eXBlID0gcHNJbnQ7CiAgICAgIHN0YWNrW3NwXS5pbnRnID0gaW50ZzsKICAgIH0KICB9CiAgdm9pZCBwdXNoUmVhbChkb3VibGUgcmVhbCkKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc1JlYWw7CiAgICAgIHN0YWNrW3NwXS5yZWFsID0gcmVhbDsKICAgIH0KICB9CiAgR0Jvb2wgcG9wQm9vbCgpCiAgewogICAgaWYgKGNoZWNrVW5kZXJmbG93KCkgJiYgY2hlY2tUeXBlKHBzQm9vbCwgcHNCb29sKSkgewogICAgICByZXR1cm4gc3RhY2tbc3ArK10uYm9vbG47CiAgICB9CiAgICByZXR1cm4gZ0ZhbHNlOwogIH0KICBpbnQgcG9wSW50KCkKICB7CiAgICBpZiAoY2hlY2tVbmRlcmZsb3coKSAmJiBjaGVja1R5cGUocHNJbnQsIHBzSW50KSkgewogICAgICByZXR1cm4gc3RhY2tbc3ArK10uaW50ZzsKICAgIH0KICAgIHJldHVybiAwOwogIH0KICBkb3VibGUgcG9wTnVtKCkKICB7CiAgICBkb3VibGUgcmV0OwoKICAgIGlmIChjaGVja1VuZGVyZmxvdygpICYmIGNoZWNrVHlwZShwc0ludCwgcHNSZWFsKSkgewogICAgICByZXQgPSAoc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQpID8gKGRvdWJsZSlzdGFja1tzcF0uaW50ZyA6IHN0YWNrW3NwXS5yZWFsOwogICAgICArK3NwOwogICAgICByZXR1cm4gcmV0OwogICAgfQogICAgcmV0dXJuIDA7CiAgfQogIEdCb29sIGVtcHR5KCkgeyByZXR1cm4gc3AgPT0gcHNTdGFja1NpemU7IH0KICBHQm9vbCB0b3BJc0ludCgpIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgJiYgc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQ7IH0KICBHQm9vbCB0b3BUd29BcmVJbnRzKCkKICAgIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgLSAxICYmCgkgICAgIHN0YWNrW3NwXS50eXBlID09IHBzSW50ICYmCiAgICAgICAgICAgICBzdGFja1tzcCsxXS50eXBlID09IHBzSW50OyB9CiAgR0Jvb2wgdG9wSXNSZWFsKCkgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAmJiBzdGFja1tzcF0udHlwZSA9PSBwc1JlYWw7IH0KICBHQm9vbCB0b3BUd29BcmVOdW1zKCkKICAgIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgLSAxICYmCgkgICAgIChzdGFja1tzcF0udHlwZSA9PSBwc0ludCB8fCBzdGFja1tzcF0udHlwZSA9PSBwc1JlYWwpICYmCgkgICAgIChzdGFja1tzcCsxXS50eXBlID09IHBzSW50IHx8IHN0YWNrW3NwKzFdLnR5cGUgPT0gcHNSZWFsKTsgfQogIHZvaWQgY29weShpbnQgbik7CiAgdm9pZCByb2xsKGludCBuLCBpbnQgaik7CiAgdm9pZCBpbmRleChpbnQgaSkKICB7CiAgICBpZiAoIWNoZWNrT3ZlcmZsb3coKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICAtLXNwOwogICAgaWYgKHVubGlrZWx5KHNwICsgaSArIDEgPj0gcHNTdGFja1NpemUpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIHVuZGVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh1bmxpa2VseShzcCArIGkgKyAxIDwgMCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgb3ZlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzdGFja1tzcF0gPSBzdGFja1tzcCArIDEgKyBpXTsKICB9CiAgdm9pZCBwb3AoKQogIHsKICAgIGlmICghY2hlY2tVbmRlcmZsb3coKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICArK3NwOwogIH0KCnByaXZhdGU6CgogIEdCb29sIGNoZWNrT3ZlcmZsb3coaW50IG4gPSAxKQogIHsKICAgIGlmIChzcCAtIG4gPCAwKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIG92ZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuIGdGYWxzZTsKICAgIH0KICAgIHJldHVybiBnVHJ1ZTsKICB9CiAgR0Jvb2wgY2hlY2tVbmRlcmZsb3coKQogIHsKICAgIGlmIChzcCA9PSBwc1N0YWNrU2l6ZSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayB1bmRlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcmV0dXJuIGdUcnVlOwogIH0KICBHQm9vbCBjaGVja1R5cGUoUFNPYmplY3RUeXBlIHQxLCBQU09iamVjdFR5cGUgdDIpCiAgewogICAgaWYgKHN0YWNrW3NwXS50eXBlICE9IHQxICYmIHN0YWNrW3NwXS50eXBlICE9IHQyKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgbWlzbWF0Y2ggaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcmV0dXJuIGdUcnVlOwogIH0KICBQU09iamVjdCBzdGFja1twc1N0YWNrU2l6ZV07CiAgaW50IHNwOwp9OwoKCnZvaWQgUFNTdGFjazo6Y29weShpbnQgbikgewogIGludCBpOwoKICBpZiAoc3AgKyBuID4gcHNTdGFja1NpemUpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIHVuZGVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICByZXR1cm47CiAgfQogIGlmICh1bmxpa2VseShzcCAtIG4gPiBwc1N0YWNrU2l6ZSkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIHVuZGVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICByZXR1cm47CiAgfQogIGlmICghY2hlY2tPdmVyZmxvdyhuKSkgewogICAgcmV0dXJuOwogIH0KICBmb3IgKGkgPSBzcCArIG4gLSAxOyBpID49IHNwOyAtLWkpIHsKICAgIHN0YWNrW2kgLSBuXSA9IHN0YWNrW2ldOwogIH0KICBzcCAtPSBuOwp9Cgp2b2lkIFBTU3RhY2s6OnJvbGwoaW50IG4sIGludCBqKSB7CiAgUFNPYmplY3Qgb2JqOwogIGludCBpLCBrOwoKICBpZiAodW5saWtlbHkobiA9PSAwKSkgewogICAgcmV0dXJuOwogIH0KICBpZiAoaiA+PSAwKSB7CiAgICBqICU9IG47CiAgfSBlbHNlIHsKICAgIGogPSAtaiAlIG47CiAgICBpZiAoaiAhPSAwKSB7CiAgICAgIGogPSBuIC0gajsKICAgIH0KICB9CiAgaWYgKG4gPD0gMCB8fCBqID09IDAgfHwgbiA+IHBzU3RhY2tTaXplIHx8IHNwICsgbiA+IHBzU3RhY2tTaXplKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChqIDw9IG4gLyAyKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgajsgKytpKSB7CiAgICAgIG9iaiA9IHN0YWNrW3NwXTsKICAgICAgZm9yIChrID0gc3A7IGsgPCBzcCArIG4gLSAxOyArK2spIHsKICAgICAgICBzdGFja1trXSA9IHN0YWNrW2srMV07CiAgICAgIH0KICAgICAgc3RhY2tbc3AgKyBuIC0gMV0gPSBvYmo7CiAgICB9CiAgfSBlbHNlIHsKICAgIGogPSBuIC0gajsKICAgIGZvciAoaSA9IDA7IGkgPCBqOyArK2kpIHsKICAgICAgb2JqID0gc3RhY2tbc3AgKyBuIC0gMV07CiAgICAgIGZvciAoayA9IHNwICsgbiAtIDE7IGsgPiBzcDsgLS1rKSB7CiAgICAgICAgc3RhY2tba10gPSBzdGFja1trLTFdOwogICAgICB9CiAgICAgIHN0YWNrW3NwXSA9IG9iajsKICAgIH0KICB9Cn0KClBvc3RTY3JpcHRGdW5jdGlvbjo6UG9zdFNjcmlwdEZ1bmN0aW9uKE9iamVjdCAqZnVuY09iaiwgRGljdCAqZGljdCkgewogIFN0cmVhbSAqc3RyOwogIGludCBjb2RlUHRyOwogIEdvb1N0cmluZyAqdG9rOwogIGRvdWJsZSBpbltmdW5jTWF4SW5wdXRzXTsKICBpbnQgaTsKCiAgY29kZSA9IG51bGxwdHI7CiAgY29kZVN0cmluZyA9IG51bGxwdHI7CiAgY29kZVNpemUgPSAwOwogIG9rID0gZ0ZhbHNlOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIGdvdG8gZXJyMTsKICB9CiAgaWYgKCFoYXNSYW5nZSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSA0IGZ1bmN0aW9uIGlzIG1pc3NpbmcgcmFuZ2UiKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gZ2V0IHRoZSBzdHJlYW0KICBpZiAoIWZ1bmNPYmotPmlzU3RyZWFtKCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgNCBmdW5jdGlvbiBpc24ndCBhIHN0cmVhbSIpOwogICAgZ290byBlcnIxOwogIH0KICBzdHIgPSBmdW5jT2JqLT5nZXRTdHJlYW0oKTsKCiAgLy8tLS0tLSBwYXJzZSB0aGUgZnVuY3Rpb24KICBjb2RlU3RyaW5nID0gbmV3IEdvb1N0cmluZygpOwogIHN0ci0+cmVzZXQoKTsKICBpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSB8fCB0b2stPmNtcCgieyIpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJFeHBlY3RlZCAne3snIGF0IHN0YXJ0IG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgIGlmICh0b2spIHsKICAgICAgZGVsZXRlIHRvazsKICAgIH0KICAgIGdvdG8gZXJyMTsKICB9CiAgZGVsZXRlIHRvazsKICBjb2RlUHRyID0gMDsKICBpZiAoIXBhcnNlQ29kZShzdHIsICZjb2RlUHRyKSkgewogICAgZ290byBlcnIyOwogIH0KICBzdHItPmNsb3NlKCk7CgogIC8vLS0tLS0gc2V0IHVwIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGluW2ldID0gZG9tYWluW2ldWzBdOwogICAgY2FjaGVJbltpXSA9IGluW2ldIC0gMTsKICB9CiAgdHJhbnNmb3JtKGluLCBjYWNoZU91dCk7CgogIG9rID0gZ1RydWU7CiAgCiBlcnIyOgogIHN0ci0+Y2xvc2UoKTsKIGVycjE6CiAgcmV0dXJuOwp9CgpQb3N0U2NyaXB0RnVuY3Rpb246OlBvc3RTY3JpcHRGdW5jdGlvbihjb25zdCBQb3N0U2NyaXB0RnVuY3Rpb24gKmZ1bmMpIDogRnVuY3Rpb24oZnVuYykgewogIGNvZGVTaXplID0gZnVuYy0+Y29kZVNpemU7CgogIGNvZGUgPSAoUFNPYmplY3QgKilnbWFsbG9jbihjb2RlU2l6ZSwgc2l6ZW9mKFBTT2JqZWN0KSk7CiAgbWVtY3B5KGNvZGUsIGZ1bmMtPmNvZGUsIGNvZGVTaXplICogc2l6ZW9mKFBTT2JqZWN0KSk7CgogIGNvZGVTdHJpbmcgPSBmdW5jLT5jb2RlU3RyaW5nLT5jb3B5KCk7CgogIG1lbWNweShjYWNoZUluLCBmdW5jLT5jYWNoZUluLCBmdW5jTWF4SW5wdXRzICogc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShjYWNoZU91dCwgZnVuYy0+Y2FjaGVPdXQsIGZ1bmNNYXhPdXRwdXRzICogc2l6ZW9mKGRvdWJsZSkpOwoKICBvayA9IGZ1bmMtPm9rOwp9CgpQb3N0U2NyaXB0RnVuY3Rpb246On5Qb3N0U2NyaXB0RnVuY3Rpb24oKSB7CiAgZ2ZyZWUoY29kZSk7CiAgZGVsZXRlIGNvZGVTdHJpbmc7Cn0KCnZvaWQgUG9zdFNjcmlwdEZ1bmN0aW9uOjp0cmFuc2Zvcm0oZG91YmxlICppbiwgZG91YmxlICpvdXQpIHsKICBQU1N0YWNrIHN0YWNrOwogIGludCBpOwoKICAvLyBjaGVjayB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpZiAoaW5baV0gIT0gY2FjaGVJbltpXSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGkgPT0gbSkgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvdXRbaV0gPSBjYWNoZU91dFtpXTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIC8vfiBtYXkgbmVlZCB0byBjaGVjayBmb3IgaW50ZWdlcnMgaGVyZQogICAgc3RhY2sucHVzaFJlYWwoaW5baV0pOwogIH0KICBleGVjKCZzdGFjaywgMCk7CiAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICBvdXRbaV0gPSBzdGFjay5wb3BOdW0oKTsKICAgIGlmIChvdXRbaV0gPCByYW5nZVtpXVswXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVswXTsKICAgIH0gZWxzZSBpZiAob3V0W2ldID4gcmFuZ2VbaV1bMV0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQogIHN0YWNrLmNsZWFyKCk7CgogIC8vIGlmICghc3RhY2stPmVtcHR5KCkpIHsKICAvLyAgIGVycm9yKGVyclN5bnRheFdhcm5pbmcsIC0xLAogIC8vICAgICAgICAgIkV4dHJhIHZhbHVlcyBvbiBzdGFjayBhdCBlbmQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogIC8vIH0KCiAgLy8gc2F2ZSBjdXJyZW50IHJlc3VsdCBpbiB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBjYWNoZUluW2ldID0gaW5baV07CiAgfQogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIGNhY2hlT3V0W2ldID0gb3V0W2ldOwogIH0KfQoKR0Jvb2wgUG9zdFNjcmlwdEZ1bmN0aW9uOjpwYXJzZUNvZGUoU3RyZWFtICpzdHIsIGludCAqY29kZVB0cikgewogIEdvb1N0cmluZyAqdG9rOwogIGNoYXIgKnA7CiAgR0Jvb2wgaXNSZWFsOwogIGludCBvcFB0ciwgZWxzZVB0cjsKICBpbnQgYSwgYiwgbWlkLCBjbXA7CgogIHdoaWxlICgxKSB7CiAgICBpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJVbmV4cGVjdGVkIGVuZCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0cmVhbSIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcCA9IHRvay0+Z2V0Q1N0cmluZygpOwogICAgaWYgKGlzZGlnaXQoKnApIHx8ICpwID09ICcuJyB8fCAqcCA9PSAnLScpIHsKICAgICAgaXNSZWFsID0gZ0ZhbHNlOwogICAgICBmb3IgKDsgKnA7ICsrcCkgewoJaWYgKCpwID09ICcuJykgewoJICBpc1JlYWwgPSBnVHJ1ZTsKCSAgYnJlYWs7Cgl9CiAgICAgIH0KICAgICAgcmVzaXplQ29kZSgqY29kZVB0cik7CiAgICAgIGlmIChpc1JlYWwpIHsKCWNvZGVbKmNvZGVQdHJdLnR5cGUgPSBwc1JlYWw7CiAgICAgICAgICBjb2RlWypjb2RlUHRyXS5yZWFsID0gZ2F0b2YodG9rLT5nZXRDU3RyaW5nKCkpOwogICAgICB9IGVsc2UgewoJY29kZVsqY29kZVB0cl0udHlwZSA9IHBzSW50OwoJY29kZVsqY29kZVB0cl0uaW50ZyA9IGF0b2kodG9rLT5nZXRDU3RyaW5nKCkpOwogICAgICB9CiAgICAgICsrKmNvZGVQdHI7CiAgICAgIGRlbGV0ZSB0b2s7CiAgICB9IGVsc2UgaWYgKCF0b2stPmNtcCgieyIpKSB7CiAgICAgIGRlbGV0ZSB0b2s7CiAgICAgIG9wUHRyID0gKmNvZGVQdHI7CiAgICAgICpjb2RlUHRyICs9IDM7CiAgICAgIHJlc2l6ZUNvZGUob3BQdHIgKyAyKTsKICAgICAgaWYgKCFwYXJzZUNvZGUoc3RyLCBjb2RlUHRyKSkgewoJcmV0dXJuIGdGYWxzZTsKICAgICAgfQogICAgICBpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVW5leHBlY3RlZCBlbmQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiBzdHJlYW0iKTsKCXJldHVybiBnRmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCF0b2stPmNtcCgieyIpKSB7CgllbHNlUHRyID0gKmNvZGVQdHI7CglpZiAoIXBhcnNlQ29kZShzdHIsIGNvZGVQdHIpKSB7CgkgIGRlbGV0ZSB0b2s7CgkgIHJldHVybiBnRmFsc2U7Cgl9CglkZWxldGUgdG9rOwoJaWYgKCEodG9rID0gZ2V0VG9rZW4oc3RyKSkpIHsKCSAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVW5leHBlY3RlZCBlbmQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiBzdHJlYW0iKTsKCSAgcmV0dXJuIGdGYWxzZTsKCX0KICAgICAgfSBlbHNlIHsKCWVsc2VQdHIgPSAtMTsKICAgICAgfQogICAgICBpZiAoIXRvay0+Y21wKCJpZiIpKSB7CglpZiAoZWxzZVB0ciA+PSAwKSB7CgkgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwKCQkiR290ICdpZicgb3BlcmF0b3Igd2l0aCB0d28gYmxvY2tzIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKCSAgcmV0dXJuIGdGYWxzZTsKCX0KCWNvZGVbb3BQdHJdLnR5cGUgPSBwc09wZXJhdG9yOwoJY29kZVtvcFB0cl0ub3AgPSBwc09wSWY7Cgljb2RlW29wUHRyKzJdLnR5cGUgPSBwc0Jsb2NrOwoJY29kZVtvcFB0cisyXS5ibGsgPSAqY29kZVB0cjsKICAgICAgfSBlbHNlIGlmICghdG9rLT5jbXAoImlmZWxzZSIpKSB7CglpZiAoZWxzZVB0ciA8IDApIHsKCSAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJCSJHb3QgJ2lmZWxzZScgb3BlcmF0b3Igd2l0aCBvbmUgYmxvY2sgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwoJICByZXR1cm4gZ0ZhbHNlOwoJfQoJY29kZVtvcFB0cl0udHlwZSA9IHBzT3BlcmF0b3I7Cgljb2RlW29wUHRyXS5vcCA9IHBzT3BJZmVsc2U7Cgljb2RlW29wUHRyKzFdLnR5cGUgPSBwc0Jsb2NrOwoJY29kZVtvcFB0cisxXS5ibGsgPSBlbHNlUHRyOwoJY29kZVtvcFB0cisyXS50eXBlID0gcHNCbG9jazsKCWNvZGVbb3BQdHIrMl0uYmxrID0gKmNvZGVQdHI7CiAgICAgIH0gZWxzZSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsCgkgICAgICAiRXhwZWN0ZWQgaWYvaWZlbHNlIG9wZXJhdG9yIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKCWRlbGV0ZSB0b2s7CglyZXR1cm4gZ0ZhbHNlOwogICAgICB9CiAgICAgIGRlbGV0ZSB0b2s7CiAgICB9IGVsc2UgaWYgKCF0b2stPmNtcCgifSIpKSB7CiAgICAgIGRlbGV0ZSB0b2s7CiAgICAgIHJlc2l6ZUNvZGUoKmNvZGVQdHIpOwogICAgICBjb2RlWypjb2RlUHRyXS50eXBlID0gcHNPcGVyYXRvcjsKICAgICAgY29kZVsqY29kZVB0cl0ub3AgPSBwc09wUmV0dXJuOwogICAgICArKypjb2RlUHRyOwogICAgICBicmVhazsKICAgIH0gZWxzZSB7CiAgICAgIGEgPSAtMTsKICAgICAgYiA9IG5QU09wczsKICAgICAgY21wID0gMDsgLy8gbWFrZSBnY2MgaGFwcHkKICAgICAgLy8gaW52YXJpYW50OiBwc09wTmFtZXNbYV0gPCB0b2sgPCBwc09wTmFtZXNbYl0KICAgICAgd2hpbGUgKGIgLSBhID4gMSkgewoJbWlkID0gKGEgKyBiKSAvIDI7CgljbXAgPSB0b2stPmNtcChwc09wTmFtZXNbbWlkXSk7CglpZiAoY21wID4gMCkgewoJICBhID0gbWlkOwoJfSBlbHNlIGlmIChjbXAgPCAwKSB7CgkgIGIgPSBtaWQ7Cgl9IGVsc2UgewoJICBhID0gYiA9IG1pZDsKCX0KICAgICAgfQogICAgICBpZiAoY21wICE9IDApIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwKCSAgICAgICJVbmtub3duIG9wZXJhdG9yICd7MDp0fScgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIsCgkgICAgICB0b2spOwoJZGVsZXRlIHRvazsKCXJldHVybiBnRmFsc2U7CiAgICAgIH0KICAgICAgZGVsZXRlIHRvazsKICAgICAgcmVzaXplQ29kZSgqY29kZVB0cik7CiAgICAgIGNvZGVbKmNvZGVQdHJdLnR5cGUgPSBwc09wZXJhdG9yOwogICAgICBjb2RlWypjb2RlUHRyXS5vcCA9IChQU09wKWE7CiAgICAgICsrKmNvZGVQdHI7CiAgICB9CiAgfQogIHJldHVybiBnVHJ1ZTsKfQoKR29vU3RyaW5nICpQb3N0U2NyaXB0RnVuY3Rpb246OmdldFRva2VuKFN0cmVhbSAqc3RyKSB7CiAgR29vU3RyaW5nICpzOwogIGludCBjOwogIEdCb29sIGNvbW1lbnQ7CgogIHMgPSBuZXcgR29vU3RyaW5nKCk7CiAgY29tbWVudCA9IGdGYWxzZTsKICB3aGlsZSAoMSkgewogICAgaWYgKChjID0gc3RyLT5nZXRDaGFyKCkpID09IEVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGNvZGVTdHJpbmctPmFwcGVuZChjKTsKICAgIGlmIChjb21tZW50KSB7CiAgICAgIGlmIChjID09ICdceDBhJyB8fCBjID09ICdceDBkJykgewoJY29tbWVudCA9IGdGYWxzZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjID09ICclJykgewogICAgICBjb21tZW50ID0gZ1RydWU7CiAgICB9IGVsc2UgaWYgKCFpc3NwYWNlKGMpKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoYyA9PSAneycgfHwgYyA9PSAnfScpIHsKICAgIHMtPmFwcGVuZCgoY2hhciljKTsKICB9IGVsc2UgaWYgKGlzZGlnaXQoYykgfHwgYyA9PSAnLicgfHwgYyA9PSAnLScpIHsKICAgIHdoaWxlICgxKSB7CiAgICAgIHMtPmFwcGVuZCgoY2hhciljKTsKICAgICAgYyA9IHN0ci0+bG9va0NoYXIoKTsKICAgICAgaWYgKGMgPT0gRU9GIHx8ICEoaXNkaWdpdChjKSB8fCBjID09ICcuJyB8fCBjID09ICctJykpIHsKCWJyZWFrOwogICAgICB9CiAgICAgIHN0ci0+Z2V0Q2hhcigpOwogICAgICBjb2RlU3RyaW5nLT5hcHBlbmQoYyk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHdoaWxlICgxKSB7CiAgICAgIHMtPmFwcGVuZCgoY2hhciljKTsKICAgICAgYyA9IHN0ci0+bG9va0NoYXIoKTsKICAgICAgaWYgKGMgPT0gRU9GIHx8ICFpc2FsbnVtKGMpKSB7CglicmVhazsKICAgICAgfQogICAgICBzdHItPmdldENoYXIoKTsKICAgICAgY29kZVN0cmluZy0+YXBwZW5kKGMpOwogICAgfQogIH0KICByZXR1cm4gczsKfQoKdm9pZCBQb3N0U2NyaXB0RnVuY3Rpb246OnJlc2l6ZUNvZGUoaW50IG5ld1NpemUpIHsKICBpZiAobmV3U2l6ZSA+PSBjb2RlU2l6ZSkgewogICAgY29kZVNpemUgKz0gNjQ7CiAgICBjb2RlID0gKFBTT2JqZWN0ICopZ3JlYWxsb2NuKGNvZGUsIGNvZGVTaXplLCBzaXplb2YoUFNPYmplY3QpKTsKICB9Cn0KCnZvaWQgUG9zdFNjcmlwdEZ1bmN0aW9uOjpleGVjKFBTU3RhY2sgKnN0YWNrLCBpbnQgY29kZVB0cikgewogIGludCBpMSwgaTI7CiAgZG91YmxlIHIxLCByMiwgcmVzdWx0OwogIEdCb29sIGIxLCBiMjsKCiAgd2hpbGUgKDEpIHsKICAgIHN3aXRjaCAoY29kZVtjb2RlUHRyXS50eXBlKSB7CiAgICBjYXNlIHBzSW50OgogICAgICBzdGFjay0+cHVzaEludChjb2RlW2NvZGVQdHIrK10uaW50Zyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBwc1JlYWw6CiAgICAgIHN0YWNrLT5wdXNoUmVhbChjb2RlW2NvZGVQdHIrK10ucmVhbCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBwc09wZXJhdG9yOgogICAgICBzd2l0Y2ggKGNvZGVbY29kZVB0cisrXS5vcCkgewogICAgICBjYXNlIHBzT3BBYnM6CglpZiAoc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hJbnQoYWJzKHN0YWNrLT5wb3BJbnQoKSkpOwoJfSBlbHNlIHsKCSAgc3RhY2stPnB1c2hSZWFsKGZhYnMoc3RhY2stPnBvcE51bSgpKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQWRkOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSArIGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKHIxICsgcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEFuZDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgJiBpMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxICYmIGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BBdGFuOgoJcjIgPSBzdGFjay0+cG9wTnVtKCk7CglyMSA9IHN0YWNrLT5wb3BOdW0oKTsKCXJlc3VsdCA9IGF0YW4yKHIxLCByMikgKiAxODAuMCAvIE1fUEk7CglpZiAocmVzdWx0IDwgMCkgcmVzdWx0ICs9IDM2MC4wOwoJc3RhY2stPnB1c2hSZWFsKHJlc3VsdCk7CglicmVhazsKICAgICAgY2FzZSBwc09wQml0c2hpZnQ6CglpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCWkxID0gc3RhY2stPnBvcEludCgpOwoJaWYgKGkyID4gMCkgewoJICBzdGFjay0+cHVzaEludChpMSA8PCBpMik7Cgl9IGVsc2UgaWYgKGkyIDwgMCkgewoJICBzdGFjay0+cHVzaEludCgoaW50KSgoR3VpbnQpaTEgPj4gLWkyKSk7Cgl9IGVsc2UgewoJICBzdGFjay0+cHVzaEludChpMSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQ2VpbGluZzoKCWlmICghc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hSZWFsKGNlaWwoc3RhY2stPnBvcE51bSgpKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQ29weToKCXN0YWNrLT5jb3B5KHN0YWNrLT5wb3BJbnQoKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wQ29zOgoJc3RhY2stPnB1c2hSZWFsKGNvcyhzdGFjay0+cG9wTnVtKCkgKiBNX1BJIC8gMTgwLjApKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BDdmk6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoSW50KChpbnQpc3RhY2stPnBvcE51bSgpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BDdnI6CglpZiAoIXN0YWNrLT50b3BJc1JlYWwoKSkgewoJICBzdGFjay0+cHVzaFJlYWwoc3RhY2stPnBvcE51bSgpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BEaXY6CglyMiA9IHN0YWNrLT5wb3BOdW0oKTsKCXIxID0gc3RhY2stPnBvcE51bSgpOwoJc3RhY2stPnB1c2hSZWFsKHIxIC8gcjIpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcER1cDoKCXN0YWNrLT5jb3B5KDEpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEVxOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgPT0gaTIpOwoJfSBlbHNlIGlmIChzdGFjay0+dG9wVHdvQXJlTnVtcygpKSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxID09IHIyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgPT0gYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEV4Y2g6CglzdGFjay0+cm9sbCgyLCAxKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BFeHA6CglyMiA9IHN0YWNrLT5wb3BOdW0oKTsKCXIxID0gc3RhY2stPnBvcE51bSgpOwoJc3RhY2stPnB1c2hSZWFsKHBvdyhyMSwgcjIpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BGYWxzZToKCXN0YWNrLT5wdXNoQm9vbChnRmFsc2UpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEZsb29yOgoJaWYgKCFzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaFJlYWwoZmxvb3Ioc3RhY2stPnBvcE51bSgpKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wR2U6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA+PSBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSA+PSByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wR3Q6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA+IGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxID4gcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcElkaXY6CglpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCWkxID0gc3RhY2stPnBvcEludCgpOwoJaWYgKGxpa2VseShpMiAhPSAwKSkgewoJICBzdGFjay0+cHVzaEludChpMSAvIGkyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BJbmRleDoKCXN0YWNrLT5pbmRleChzdGFjay0+cG9wSW50KCkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcExlOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgPD0gaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgPD0gcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcExuOgoJc3RhY2stPnB1c2hSZWFsKGxvZyhzdGFjay0+cG9wTnVtKCkpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BMb2c6CglzdGFjay0+cHVzaFJlYWwobG9nMTAoc3RhY2stPnBvcE51bSgpKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wTHQ6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA8IGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxIDwgcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE1vZDoKCWkyID0gc3RhY2stPnBvcEludCgpOwoJaTEgPSBzdGFjay0+cG9wSW50KCk7CglpZiAobGlrZWx5KGkyICE9IDApKSB7CgkgIHN0YWNrLT5wdXNoSW50KGkxICUgaTIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE11bDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgLy9+IHNob3VsZCBjaGVjayBmb3Igb3V0LW9mLXJhbmdlLCBhbmQgcHVzaCBhIHJlYWwgaW5zdGVhZAoJICBzdGFjay0+cHVzaEludChpMSAqIGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKHIxICogcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE5lOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgIT0gaTIpOwoJfSBlbHNlIGlmIChzdGFjay0+dG9wVHdvQXJlTnVtcygpKSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxICE9IHIyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgIT0gYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE5lZzoKCWlmIChzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaEludCgtc3RhY2stPnBvcEludCgpKTsKCX0gZWxzZSB7CgkgIHN0YWNrLT5wdXNoUmVhbCgtc3RhY2stPnBvcE51bSgpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BOb3Q6CglpZiAoc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hJbnQofnN0YWNrLT5wb3BJbnQoKSk7Cgl9IGVsc2UgewoJICBzdGFjay0+cHVzaEJvb2woIXN0YWNrLT5wb3BCb29sKCkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE9yOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSB8IGkyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgfHwgYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFBvcDoKCXN0YWNrLT5wb3AoKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BSb2xsOgoJaTIgPSBzdGFjay0+cG9wSW50KCk7CglpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCXN0YWNrLT5yb2xsKGkxLCBpMik7CglicmVhazsKICAgICAgY2FzZSBwc09wUm91bmQ6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwoKHIxID49IDApID8gZmxvb3IocjEgKyAwLjUpIDogY2VpbChyMSAtIDAuNSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFNpbjoKCXN0YWNrLT5wdXNoUmVhbChzaW4oc3RhY2stPnBvcE51bSgpICogTV9QSSAvIDE4MC4wKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wU3FydDoKCXN0YWNrLT5wdXNoUmVhbChzcXJ0KHN0YWNrLT5wb3BOdW0oKSkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFN1YjoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgLSBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoUmVhbChyMSAtIHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BUcnVlOgoJc3RhY2stPnB1c2hCb29sKGdUcnVlKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BUcnVuY2F0ZToKCWlmICghc3RhY2stPnRvcElzSW50KCkpIHsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoUmVhbCgocjEgPj0gMCkgPyBmbG9vcihyMSkgOiBjZWlsKHIxKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wWG9yOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSBeIGkyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgXiBiMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wSWY6CgliMSA9IHN0YWNrLT5wb3BCb29sKCk7CglpZiAoYjEpIHsKCSAgZXhlYyhzdGFjaywgY29kZVB0ciArIDIpOwoJfQoJY29kZVB0ciA9IGNvZGVbY29kZVB0ciArIDFdLmJsazsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BJZmVsc2U6CgliMSA9IHN0YWNrLT5wb3BCb29sKCk7CglpZiAoYjEpIHsKCSAgZXhlYyhzdGFjaywgY29kZVB0ciArIDIpOwoJfSBlbHNlIHsKCSAgZXhlYyhzdGFjaywgY29kZVtjb2RlUHRyXS5ibGspOwoJfQoJY29kZVB0ciA9IGNvZGVbY29kZVB0ciArIDFdLmJsazsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BSZXR1cm46CglyZXR1cm47CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbnRlcm5hbDogYmFkIG9iamVjdCBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIGNvZGUiKTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQp9Cg==