Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRnVuY3Rpb24uY2MKLy8KLy8gQ29weXJpZ2h0IDIwMDEtMjAwMyBHbHlwaCAmIENvZywgTExDCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4LTIwMTAsIDIwMTMtMjAxNSwgMjAxNywgMjAxOCBBbGJlcnQgQXN0YWxzIENpZCA8YWFjaWRAa2RlLm9yZz4KLy8gQ29weXJpZ2h0IChDKSAyMDA2IEplZmYgTXVpemVsYWFyIDxqZWZmQGluZmlkaWdtLm5ldD4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDExIEFuZHJlYSBDYW5jaWFuaSA8cmFubWE0MkBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMiBUaG9tYXMgRnJlaXRhZyA8VGhvbWFzLkZyZWl0YWdAYWxmYS5kZT4KLy8gQ29weXJpZ2h0IChDKSAyMDEyIEFkYW0gUmVpY2hvbGQgPGFkYW1yZWljaG9sZEBteW9wZXJhLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDEzIEZhYmlvIEQnVXJzbyA8ZmFiaW9kdXJzb0Bob3RtYWlsLml0PgovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaW5jbHVkZSA8Y29uZmlnLmg+CgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlICJnb28vZ21lbS5oIgojaW5jbHVkZSAiZ29vL2dzdHJ0b2QuaCIKI2luY2x1ZGUgIk9iamVjdC5oIgojaW5jbHVkZSAiRGljdC5oIgojaW5jbHVkZSAiU3RyZWFtLmgiCiNpbmNsdWRlICJFcnJvci5oIgojaW5jbHVkZSAiRnVuY3Rpb24uaCIKCiNpZm5kZWYgTV9QSQojZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgojZW5kaWYKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGdW5jdGlvbjo6RnVuY3Rpb24oKSB7Cn0KCkZ1bmN0aW9uOjp+RnVuY3Rpb24oKSB7Cn0KCkZ1bmN0aW9uICpGdW5jdGlvbjo6cGFyc2UoT2JqZWN0ICpmdW5jT2JqKSB7CiAgc3RkOjpzZXQ8aW50PiB1c2VkUGFyZW50czsKICByZXR1cm4gcGFyc2UoZnVuY09iaiwgJnVzZWRQYXJlbnRzKTsKfQoKRnVuY3Rpb24gKkZ1bmN0aW9uOjpwYXJzZShPYmplY3QgKmZ1bmNPYmosIHN0ZDo6c2V0PGludD4gKnVzZWRQYXJlbnRzKSB7CiAgRnVuY3Rpb24gKmZ1bmM7CiAgRGljdCAqZGljdDsKICBpbnQgZnVuY1R5cGU7CgogIGlmIChmdW5jT2JqLT5pc1N0cmVhbSgpKSB7CiAgICBkaWN0ID0gZnVuY09iai0+c3RyZWFtR2V0RGljdCgpOwogIH0gZWxzZSBpZiAoZnVuY09iai0+aXNEaWN0KCkpIHsKICAgIGRpY3QgPSBmdW5jT2JqLT5nZXREaWN0KCk7CiAgfSBlbHNlIGlmIChmdW5jT2JqLT5pc05hbWUoIklkZW50aXR5IikpIHsKICAgIHJldHVybiBuZXcgSWRlbnRpdHlGdW5jdGlvbigpOwogIH0gZWxzZSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJFeHBlY3RlZCBmdW5jdGlvbiBkaWN0aW9uYXJ5IG9yIHN0cmVhbSIpOwogICAgcmV0dXJuIG51bGxwdHI7CiAgfQoKICBPYmplY3Qgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRnVuY3Rpb25UeXBlIik7CiAgaWYgKCFvYmoxLmlzSW50KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIHR5cGUgaXMgbWlzc2luZyBvciB3cm9uZyB0eXBlIik7CiAgICByZXR1cm4gbnVsbHB0cjsKICB9CiAgZnVuY1R5cGUgPSBvYmoxLmdldEludCgpOwoKICBpZiAoZnVuY1R5cGUgPT0gMCkgewogICAgZnVuYyA9IG5ldyBTYW1wbGVkRnVuY3Rpb24oZnVuY09iaiwgZGljdCk7CiAgfSBlbHNlIGlmIChmdW5jVHlwZSA9PSAyKSB7CiAgICBmdW5jID0gbmV3IEV4cG9uZW50aWFsRnVuY3Rpb24oZnVuY09iaiwgZGljdCk7CiAgfSBlbHNlIGlmIChmdW5jVHlwZSA9PSAzKSB7CiAgICBmdW5jID0gbmV3IFN0aXRjaGluZ0Z1bmN0aW9uKGZ1bmNPYmosIGRpY3QsIHVzZWRQYXJlbnRzKTsKICB9IGVsc2UgaWYgKGZ1bmNUeXBlID09IDQpIHsKICAgIGZ1bmMgPSBuZXcgUG9zdFNjcmlwdEZ1bmN0aW9uKGZ1bmNPYmosIGRpY3QpOwogIH0gZWxzZSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJVbmltcGxlbWVudGVkIGZ1bmN0aW9uIHR5cGUgKHswOmR9KSIsIGZ1bmNUeXBlKTsKICAgIHJldHVybiBudWxscHRyOwogIH0KICBpZiAoIWZ1bmMtPmlzT2soKSkgewogICAgZGVsZXRlIGZ1bmM7CiAgICByZXR1cm4gbnVsbHB0cjsKICB9CgogIHJldHVybiBmdW5jOwp9CgpGdW5jdGlvbjo6RnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gKmZ1bmMpIHsKICAgIG0gPSBmdW5jLT5tOwogICAgbiA9IGZ1bmMtPm47CgogICAgbWVtY3B5KGRvbWFpbiwgZnVuYy0+ZG9tYWluLCBmdW5jTWF4SW5wdXRzICogMiAqIHNpemVvZihkb3VibGUpKTsKICAgIG1lbWNweShyYW5nZSwgZnVuYy0+cmFuZ2UsIGZ1bmNNYXhPdXRwdXRzICogMiAqIHNpemVvZihkb3VibGUpKTsKCiAgICBoYXNSYW5nZSA9IGZ1bmMtPmhhc1JhbmdlOwp9CgpHQm9vbCBGdW5jdGlvbjo6aW5pdChEaWN0ICpkaWN0KSB7CiAgT2JqZWN0IG9iajE7CiAgaW50IGk7CgogIC8vLS0tLS0gRG9tYWluCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRG9tYWluIik7CiAgaWYgKCFvYmoxLmlzQXJyYXkoKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaXMgbWlzc2luZyBkb21haW4iKTsKICAgIHJldHVybiBnRmFsc2U7CiAgfQogIG0gPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgLyAyOwogIGlmIChtID4gZnVuY01heElucHV0cykgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb25zIHdpdGggbW9yZSB0aGFuIHswOmR9IGlucHV0cyBhcmUgdW5zdXBwb3J0ZWQiLAoJICBmdW5jTWF4SW5wdXRzKTsKICAgIHJldHVybiBnRmFsc2U7CiAgfQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldCgyKmkpOwogICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkb21haW4gYXJyYXkiKTsKICAgICAgcmV0dXJuIGdGYWxzZTsKICAgIH0KICAgIGRvbWFpbltpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICBvYmoyID0gb2JqMS5hcnJheUdldCgyKmkrMSk7CiAgICBpZiAoIW9iajIuaXNOdW0oKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGRvbWFpbiBhcnJheSIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgZG9tYWluW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICB9CgogIC8vLS0tLS0gUmFuZ2UKICBoYXNSYW5nZSA9IGdGYWxzZTsKICBuID0gMDsKICBvYmoxID0gZGljdC0+bG9va3VwKCJSYW5nZSIpOwogIGlmIChvYmoxLmlzQXJyYXkoKSkgewogICAgaGFzUmFuZ2UgPSBnVHJ1ZTsKICAgIG4gPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgLyAyOwogICAgaWYgKG4gPiBmdW5jTWF4T3V0cHV0cykgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gezA6ZH0gb3V0cHV0cyBhcmUgdW5zdXBwb3J0ZWQiLAoJICAgIGZ1bmNNYXhPdXRwdXRzKTsKICAgICAgcmV0dXJuIGdGYWxzZTsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSk7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIHJhbmdlIGFycmF5Iik7CglyZXR1cm4gZ0ZhbHNlOwogICAgICB9CiAgICAgIHJhbmdlW2ldWzBdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMiA9IG9iajEuYXJyYXlHZXQoMippKzEpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiByYW5nZSBhcnJheSIpOwoJcmV0dXJuIGdGYWxzZTsKICAgICAgfQogICAgICByYW5nZVtpXVsxXSA9IG9iajIuZ2V0TnVtKCk7CiAgICB9CiAgfQoKICByZXR1cm4gZ1RydWU7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIElkZW50aXR5RnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklkZW50aXR5RnVuY3Rpb246OklkZW50aXR5RnVuY3Rpb24oKSB7CiAgaW50IGk7CgogIC8vIGZpbGwgdGhlc2UgaW4gd2l0aCBhcmJpdHJhcnkgdmFsdWVzIGp1c3QgaW4gY2FzZSB0aGV5IGdldCB1c2VkCiAgLy8gc29tZXdoZXJlCiAgbSA9IGZ1bmNNYXhJbnB1dHM7CiAgbiA9IGZ1bmNNYXhPdXRwdXRzOwogIGZvciAoaSA9IDA7IGkgPCBmdW5jTWF4SW5wdXRzOyArK2kpIHsKICAgIGRvbWFpbltpXVswXSA9IDA7CiAgICBkb21haW5baV1bMV0gPSAxOwogIH0KICBoYXNSYW5nZSA9IGdGYWxzZTsKfQoKSWRlbnRpdHlGdW5jdGlvbjo6fklkZW50aXR5RnVuY3Rpb24oKSB7Cn0KCnZvaWQgSWRlbnRpdHlGdW5jdGlvbjo6dHJhbnNmb3JtKGNvbnN0IGRvdWJsZSAqaW4sIGRvdWJsZSAqb3V0KSBjb25zdCB7CiAgaW50IGk7CgogIGZvciAoaSA9IDA7IGkgPCBmdW5jTWF4T3V0cHV0czsgKytpKSB7CiAgICBvdXRbaV0gPSBpbltpXTsKICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNhbXBsZWRGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU2FtcGxlZEZ1bmN0aW9uOjpTYW1wbGVkRnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0KSB7CiAgU3RyZWFtICpzdHI7CiAgaW50IHNhbXBsZUJpdHM7CiAgZG91YmxlIHNhbXBsZU11bDsKICBPYmplY3Qgb2JqMTsKICBHdWludCBidWYsIGJpdE1hc2s7CiAgaW50IGJpdHM7CiAgR3VpbnQgczsKICBkb3VibGUgaW5bZnVuY01heElucHV0c107CiAgaW50IGksIGosIHQsIGJpdCwgaWR4OwoKICBpZHhPZmZzZXQgPSBudWxscHRyOwogIHNhbXBsZXMgPSBudWxscHRyOwogIHNCdWYgPSBudWxscHRyOwogIG9rID0gZ0ZhbHNlOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKCFoYXNSYW5nZSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSAwIGZ1bmN0aW9uIGlzIG1pc3NpbmcgcmFuZ2UiKTsKICAgIHJldHVybjsKICB9CiAgaWYgKG0gPiBzYW1wbGVkRnVuY01heElucHV0cykgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU2FtcGxlZCBmdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gezA6ZH0gaW5wdXRzIGFyZSB1bnN1cHBvcnRlZCIsCgkgIHNhbXBsZWRGdW5jTWF4SW5wdXRzKTsKICAgIHJldHVybjsKICB9CgogIC8vLS0tLS0gYnVmZmVyCiAgc0J1ZiA9IChkb3VibGUgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihkb3VibGUpKTsKCiAgLy8tLS0tLSBnZXQgdGhlIHN0cmVhbQogIGlmICghZnVuY09iai0+aXNTdHJlYW0oKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSAwIGZ1bmN0aW9uIGlzbid0IGEgc3RyZWFtIik7CiAgICByZXR1cm47CiAgfQogIHN0ciA9IGZ1bmNPYmotPmdldFN0cmVhbSgpOwoKICAvLy0tLS0tIFNpemUKICBvYmoxID0gZGljdC0+bG9va3VwKCJTaXplIik7CiAgaWYgKCFvYmoxLmlzQXJyYXkoKSB8fCBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gbSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBzaXplIGFycmF5Iik7CiAgICByZXR1cm47CiAgfQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldChpKTsKICAgIGlmICghb2JqMi5pc0ludCgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gc2l6ZSBhcnJheSIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzYW1wbGVTaXplW2ldID0gb2JqMi5nZXRJbnQoKTsKICAgIGlmIChzYW1wbGVTaXplW2ldIDw9IDApIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCBub24tcG9zaXRpdmUgdmFsdWUgaW4gZnVuY3Rpb24gc2l6ZSBhcnJheSIpOwogICAgICByZXR1cm47CiAgICB9CiAgfQogIGlkeE9mZnNldCA9IChpbnQgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihpbnQpKTsKICBmb3IgKGkgPSAwOyBpIDwgKDE8PG0pOyArK2kpIHsKICAgIGlkeCA9IDA7CiAgICBmb3IgKGogPSBtIC0gMSwgdCA9IGk7IGogPj0gMTsgLS1qLCB0IDw8PSAxKSB7CiAgICAgIGlmIChzYW1wbGVTaXplW2pdID09IDEpIHsKCWJpdCA9IDA7CiAgICAgIH0gZWxzZSB7CgliaXQgPSAodCA+PiAobSAtIDEpKSAmIDE7CiAgICAgIH0KICAgICAgaWR4ID0gKGlkeCArIGJpdCkgKiBzYW1wbGVTaXplW2otMV07CiAgICB9CiAgICBpZiAoc2FtcGxlU2l6ZVswXSA9PSAxKSB7CiAgICAgIGJpdCA9IDA7CiAgICB9IGVsc2UgewogICAgICBiaXQgPSAodCA+PiAobSAtIDEpKSAmIDE7CiAgICB9CiAgICBpZHhPZmZzZXRbaV0gPSAoaWR4ICsgYml0KSAqIG47CiAgfQoKICAvLy0tLS0tIEJpdHNQZXJTYW1wbGUKICBvYmoxID0gZGljdC0+bG9va3VwKCJCaXRzUGVyU2FtcGxlIik7CiAgaWYgKCFvYmoxLmlzSW50KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgQml0c1BlclNhbXBsZSIpOwogICAgcmV0dXJuOwogIH0KICBzYW1wbGVCaXRzID0gb2JqMS5nZXRJbnQoKTsKICBpZiAodW5saWtlbHkoc2FtcGxlQml0cyA8IDEgfHwgc2FtcGxlQml0cyA+IDMyKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaW52YWxpZCBCaXRzUGVyU2FtcGxlIik7CiAgICByZXR1cm47CiAgfQogIHNhbXBsZU11bCA9IDEuMCAvIChwb3coMi4wLCAoZG91YmxlKXNhbXBsZUJpdHMpIC0gMSk7CgogIC8vLS0tLS0gRW5jb2RlCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRW5jb2RlIik7CiAgaWYgKG9iajEuaXNBcnJheSgpICYmIG9iajEuYXJyYXlHZXRMZW5ndGgoKSA9PSAyKm0pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSk7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGVuY29kZSBhcnJheSIpOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGVuY29kZVtpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSsxKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZW5jb2RlIGFycmF5Iik7CglyZXR1cm47CiAgICAgIH0KICAgICAgZW5jb2RlW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgIH0KICB9IGVsc2UgewogICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgICBlbmNvZGVbaV1bMF0gPSAwOwogICAgICBlbmNvZGVbaV1bMV0gPSBzYW1wbGVTaXplW2ldIC0gMTsKICAgIH0KICB9CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaWYgKHVubGlrZWx5KChkb21haW5baV1bMV0gLSBkb21haW5baV1bMF0pID09IDApKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZG9tYWluIGFycmF5Iik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlucHV0TXVsW2ldID0gKGVuY29kZVtpXVsxXSAtIGVuY29kZVtpXVswXSkgLwogICAgICAgICAgICAgICAgICAoZG9tYWluW2ldWzFdIC0gZG9tYWluW2ldWzBdKTsKICB9CgogIC8vLS0tLS0gRGVjb2RlCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRGVjb2RlIik7CiAgaWYgKG9iajEuaXNBcnJheSgpICYmCiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSA9PSAyKm4pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSk7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGRlY29kZSBhcnJheSIpOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGRlY29kZVtpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSsxKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZGVjb2RlIGFycmF5Iik7CglyZXR1cm47CiAgICAgIH0KICAgICAgZGVjb2RlW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgIH0KICB9IGVsc2UgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBkZWNvZGVbaV1bMF0gPSByYW5nZVtpXVswXTsKICAgICAgZGVjb2RlW2ldWzFdID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQoKICAvLy0tLS0tIHNhbXBsZXMKICBuU2FtcGxlcyA9IG47CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkKICAgIG5TYW1wbGVzICo9IHNhbXBsZVNpemVbaV07CiAgc2FtcGxlcyA9IChkb3VibGUgKilnbWFsbG9jbl9jaGVja292ZXJmbG93KG5TYW1wbGVzLCBzaXplb2YoZG91YmxlKSk7CiAgaWYgKCFzYW1wbGVzKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbiBoYXMgaW52YWxpZCBudW1iZXIgb2Ygc2FtcGxlcyIpOwogICAgcmV0dXJuOwogIH0KICBidWYgPSAwOwogIGJpdHMgPSAwOwogIGJpdE1hc2sgPSAoMSA8PCBzYW1wbGVCaXRzKSAtIDE7CiAgc3RyLT5yZXNldCgpOwogIGZvciAoaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICBpZiAoc2FtcGxlQml0cyA9PSA4KSB7CiAgICAgIHMgPSBzdHItPmdldENoYXIoKTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlQml0cyA9PSAxNikgewogICAgICBzID0gc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgfSBlbHNlIGlmIChzYW1wbGVCaXRzID09IDMyKSB7CiAgICAgIHMgPSBzdHItPmdldENoYXIoKTsKICAgICAgcyA9IChzIDw8IDgpICsgc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgICBzID0gKHMgPDwgOCkgKyBzdHItPmdldENoYXIoKTsKICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlIChiaXRzIDwgc2FtcGxlQml0cykgewoJYnVmID0gKGJ1ZiA8PCA4KSB8IChzdHItPmdldENoYXIoKSAmIDB4ZmYpOwoJYml0cyArPSA4OwogICAgICB9CiAgICAgIHMgPSAoYnVmID4+IChiaXRzIC0gc2FtcGxlQml0cykpICYgYml0TWFzazsKICAgICAgYml0cyAtPSBzYW1wbGVCaXRzOwogICAgfQogICAgc2FtcGxlc1tpXSA9IChkb3VibGUpcyAqIHNhbXBsZU11bDsKICB9CiAgc3RyLT5jbG9zZSgpOwoKICAvLyBzZXQgdXAgdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaW5baV0gPSBkb21haW5baV1bMF07CiAgICBjYWNoZUluW2ldID0gaW5baV0gLSAxOwogIH0KICB0cmFuc2Zvcm0oaW4sIGNhY2hlT3V0KTsKCiAgb2sgPSBnVHJ1ZTsKfQoKU2FtcGxlZEZ1bmN0aW9uOjp+U2FtcGxlZEZ1bmN0aW9uKCkgewogIGlmIChpZHhPZmZzZXQpIHsKICAgIGdmcmVlKGlkeE9mZnNldCk7CiAgfQogIGlmIChzYW1wbGVzKSB7CiAgICBnZnJlZShzYW1wbGVzKTsKICB9CiAgaWYgKHNCdWYpIHsKICAgIGdmcmVlKHNCdWYpOwogIH0KfQoKU2FtcGxlZEZ1bmN0aW9uOjpTYW1wbGVkRnVuY3Rpb24oY29uc3QgU2FtcGxlZEZ1bmN0aW9uICpmdW5jKSA6IEZ1bmN0aW9uKGZ1bmMpIHsKICBtZW1jcHkoc2FtcGxlU2l6ZSwgZnVuYy0+c2FtcGxlU2l6ZSwgZnVuY01heElucHV0cyAqIHNpemVvZihpbnQpKTsKCiAgbWVtY3B5KGVuY29kZSwgZnVuYy0+ZW5jb2RlLCBmdW5jTWF4SW5wdXRzICogMiAqIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoZGVjb2RlLCBmdW5jLT5kZWNvZGUsIGZ1bmNNYXhPdXRwdXRzICogMiAqIHNpemVvZihkb3VibGUpKTsKCiAgbWVtY3B5KGlucHV0TXVsLCBmdW5jLT5pbnB1dE11bCwgZnVuY01heElucHV0cyAqIHNpemVvZihkb3VibGUpKTsKCiAgblNhbXBsZXMgPSBmdW5jLT5uU2FtcGxlczsKCiAgaWR4T2Zmc2V0ID0gKGludCAqKWdtYWxsb2NuKDEgPDwgbSwgc2l6ZW9mKGludCkpOwogIG1lbWNweShpZHhPZmZzZXQsIGZ1bmMtPmlkeE9mZnNldCwgKDEgPDwgbSkgKiAoaW50KXNpemVvZihpbnQpKTsKCiAgc2FtcGxlcyA9IChkb3VibGUgKilnbWFsbG9jbihuU2FtcGxlcywgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShzYW1wbGVzLCBmdW5jLT5zYW1wbGVzLCBuU2FtcGxlcyAqIHNpemVvZihkb3VibGUpKTsKCiAgc0J1ZiA9IChkb3VibGUgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihkb3VibGUpKTsKCiAgbWVtY3B5KGNhY2hlSW4sIGZ1bmMtPmNhY2hlSW4sIGZ1bmNNYXhJbnB1dHMgKiBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGNhY2hlT3V0LCBmdW5jLT5jYWNoZU91dCwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CgogIG9rID0gZnVuYy0+b2s7Cn0KCnZvaWQgU2FtcGxlZEZ1bmN0aW9uOjp0cmFuc2Zvcm0oY29uc3QgZG91YmxlICppbiwgZG91YmxlICpvdXQpIGNvbnN0IHsKICBkb3VibGUgeDsKICBpbnQgZVtmdW5jTWF4SW5wdXRzXTsKICBkb3VibGUgZWZyYWMwW2Z1bmNNYXhJbnB1dHNdOwogIGRvdWJsZSBlZnJhYzFbZnVuY01heElucHV0c107CiAgaW50IGksIGosIGssIGlkeDAsIHQ7CgogIC8vIGNoZWNrIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGlmIChpbltpXSAhPSBjYWNoZUluW2ldKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoaSA9PSBtKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG91dFtpXSA9IGNhY2hlT3V0W2ldOwogICAgfQogICAgcmV0dXJuOwogIH0KCiAgLy8gbWFwIGlucHV0IHZhbHVlcyBpbnRvIHNhbXBsZSBhcnJheQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIHggPSAoaW5baV0gLSBkb21haW5baV1bMF0pICogaW5wdXRNdWxbaV0gKyBlbmNvZGVbaV1bMF07CiAgICBpZiAoeCA8IDAgfHwgeCAhPSB4KSB7ICAvLyB4IT14IGlzIGEgbW9yZSBwb3J0YWJsZSB2ZXJzaW9uIG9mIGlzbmFuKHgpCiAgICAgIHggPSAwOwogICAgfSBlbHNlIGlmICh4ID4gc2FtcGxlU2l6ZVtpXSAtIDEpIHsKICAgICAgeCA9IHNhbXBsZVNpemVbaV0gLSAxOwogICAgfQogICAgZVtpXSA9IChpbnQpeDsKICAgIGlmIChlW2ldID09IHNhbXBsZVNpemVbaV0gLSAxICYmIHNhbXBsZVNpemVbaV0gPiAxKSB7CiAgICAgIC8vIHRoaXMgaGFwcGVucyBpZiBpbltpXSA9IGRvbWFpbltpXVsxXQogICAgICBlW2ldID0gc2FtcGxlU2l6ZVtpXSAtIDI7CiAgICB9CiAgICBlZnJhYzFbaV0gPSB4IC0gZVtpXTsKICAgIGVmcmFjMFtpXSA9IDEgLSBlZnJhYzFbaV07CiAgfQoKICAvLyBjb21wdXRlIGluZGV4IGZvciB0aGUgZmlyc3Qgc2FtcGxlIHRvIGJlIHVzZWQKICBpZHgwID0gMDsKICBmb3IgKGsgPSBtIC0gMTsgayA+PSAxOyAtLWspIHsKICAgIGlkeDAgPSAoaWR4MCArIGVba10pICogc2FtcGxlU2l6ZVtrLTFdOwogIH0KICBpZHgwID0gKGlkeDAgKyBlWzBdKSAqIG47CgogIC8vIGZvciBlYWNoIG91dHB1dCwgZG8gbS1saW5lYXIgaW50ZXJwb2xhdGlvbgogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKCiAgICAvLyBwdWxsIDJebSB2YWx1ZXMgb3V0IG9mIHRoZSBzYW1wbGUgYXJyYXkKICAgIGZvciAoaiA9IDA7IGogPCAoMTw8bSk7ICsraikgewogICAgICBpbnQgaWR4ID0gaWR4MCArIGlkeE9mZnNldFtqXSArIGk7CiAgICAgIGlmIChsaWtlbHkoaWR4ID49IDAgJiYgaWR4IDwgblNhbXBsZXMpKSB7CiAgICAgICAgc0J1ZltqXSA9IHNhbXBsZXNbaWR4XTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzQnVmW2pdID0gMDsgLy8gVE9ETyBJbnZlc3RpZ2F0ZSBpZiB0aGlzIGlzIHdoYXQgQWRvYmUgZG9lcwogICAgICB9CiAgICB9CgogICAgLy8gZG8gbSBzZXRzIG9mIGludGVycG9sYXRpb25zCiAgICBmb3IgKGogPSAwLCB0ID0gKDE8PG0pOyBqIDwgbTsgKytqLCB0ID4+PSAxKSB7CiAgICAgIGZvciAoayA9IDA7IGsgPCB0OyBrICs9IDIpIHsKCXNCdWZbayA+PiAxXSA9IGVmcmFjMFtqXSAqIHNCdWZba10gKyBlZnJhYzFbal0gKiBzQnVmW2srMV07CiAgICAgIH0KICAgIH0KCiAgICAvLyBtYXAgb3V0cHV0IHZhbHVlIHRvIHJhbmdlCiAgICBvdXRbaV0gPSBzQnVmWzBdICogKGRlY29kZVtpXVsxXSAtIGRlY29kZVtpXVswXSkgKyBkZWNvZGVbaV1bMF07CiAgICBpZiAob3V0W2ldIDwgcmFuZ2VbaV1bMF0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMF07CiAgICB9IGVsc2UgaWYgKG91dFtpXSA+IHJhbmdlW2ldWzFdKSB7CiAgICAgIG91dFtpXSA9IHJhbmdlW2ldWzFdOwogICAgfQogIH0KCiAgLy8gc2F2ZSBjdXJyZW50IHJlc3VsdCBpbiB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBjYWNoZUluW2ldID0gaW5baV07CiAgfQogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIGNhY2hlT3V0W2ldID0gb3V0W2ldOwogIH0KfQoKR0Jvb2wgU2FtcGxlZEZ1bmN0aW9uOjpoYXNEaWZmZXJlbnRSZXN1bHRTZXQoY29uc3QgRnVuY3Rpb24gKmZ1bmMpIGNvbnN0IHsKICBpZiAoZnVuYy0+Z2V0VHlwZSgpID09IDApIHsKICAgIFNhbXBsZWRGdW5jdGlvbiAqY29tcFRvID0gKFNhbXBsZWRGdW5jdGlvbiAqKSBmdW5jOwogICAgaWYgKGNvbXBUby0+Z2V0U2FtcGxlTnVtYmVyKCkgIT0gblNhbXBsZXMpCiAgICAgIHJldHVybiBnVHJ1ZTsKICAgIGNvbnN0IGRvdWJsZSAqY29tcFNhbXBsZXMgPSBjb21wVG8tPmdldFNhbXBsZXMoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblNhbXBsZXM7IGkrKykgewogICAgICBpZiAoc2FtcGxlc1tpXSAhPSBjb21wU2FtcGxlc1tpXSkKICAgICAgICByZXR1cm4gZ1RydWU7CiAgICB9CiAgfQogIHJldHVybiBnRmFsc2U7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEV4cG9uZW50aWFsRnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkV4cG9uZW50aWFsRnVuY3Rpb246OkV4cG9uZW50aWFsRnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0KSB7CiAgT2JqZWN0IG9iajE7CgogIG9rID0gZ0ZhbHNlOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKG0gIT0gMSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRXhwb25lbnRpYWwgZnVuY3Rpb24gd2l0aCBtb3JlIHRoYW4gb25lIGlucHV0Iik7CiAgICByZXR1cm47CiAgfQoKICAvLy0tLS0tIEMwCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiQzAiKTsKICBpZiAob2JqMS5pc0FycmF5KCkpIHsKICAgIGlmIChoYXNSYW5nZSAmJiBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gbikgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMwIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBuID0gb2JqMS5hcnJheUdldExlbmd0aCgpOwogICAgaWYgKHVubGlrZWx5KG4gPiBmdW5jTWF4T3V0cHV0cykpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMCBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgbiA9IGZ1bmNNYXhPdXRwdXRzOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KGkpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBDMCBhcnJheSIpOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGMwW2ldID0gb2JqMi5nZXROdW0oKTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGhhc1JhbmdlICYmIG4gIT0gMSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMwIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBuID0gMTsKICAgIGMwWzBdID0gMDsKICB9CgogIC8vLS0tLS0gQzEKICBvYmoxID0gZGljdC0+bG9va3VwKCJDMSIpOwogIGlmIChvYmoxLmlzQXJyYXkoKSkgewogICAgaWYgKG9iajEuYXJyYXlHZXRMZW5ndGgoKSAhPSBuKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uJ3MgQzEgYXJyYXkgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldChpKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gQzEgYXJyYXkiKTsKCXJldHVybjsKICAgICAgfQogICAgICBjMVtpXSA9IG9iajIuZ2V0TnVtKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmIChuICE9IDEpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMSBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYzFbMF0gPSAxOwogIH0KCiAgLy8tLS0tLSBOIChleHBvbmVudCkKICBvYmoxID0gZGljdC0+bG9va3VwKCJOIik7CiAgaWYgKCFvYmoxLmlzTnVtKCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgTiIpOwogICAgcmV0dXJuOwogIH0KICBlID0gb2JqMS5nZXROdW0oKTsKCiAgaXNMaW5lYXIgPSBmYWJzKGUtMS4pIDwgMWUtMTA7CiAgb2sgPSBnVHJ1ZTsKfQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6fkV4cG9uZW50aWFsRnVuY3Rpb24oKSB7Cn0KCkV4cG9uZW50aWFsRnVuY3Rpb246OkV4cG9uZW50aWFsRnVuY3Rpb24oY29uc3QgRXhwb25lbnRpYWxGdW5jdGlvbiAqZnVuYykgOiBGdW5jdGlvbihmdW5jKSB7CiAgbWVtY3B5KGMwLCBmdW5jLT5jMCwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGMxLCBmdW5jLT5jMSwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CgogIGUgPSBmdW5jLT5lOwogIGlzTGluZWFyID0gZnVuYy0+aXNMaW5lYXI7CiAgb2sgPSBmdW5jLT5vazsKfQoKdm9pZCBFeHBvbmVudGlhbEZ1bmN0aW9uOjp0cmFuc2Zvcm0oY29uc3QgZG91YmxlICppbiwgZG91YmxlICpvdXQpIGNvbnN0IHsKICBkb3VibGUgeDsKICBpbnQgaTsKCiAgaWYgKGluWzBdIDwgZG9tYWluWzBdWzBdKSB7CiAgICB4ID0gZG9tYWluWzBdWzBdOwogIH0gZWxzZSBpZiAoaW5bMF0gPiBkb21haW5bMF1bMV0pIHsKICAgIHggPSBkb21haW5bMF1bMV07CiAgfSBlbHNlIHsKICAgIHggPSBpblswXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgb3V0W2ldID0gYzBbaV0gKyAoaXNMaW5lYXIgPyB4IDogcG93KHgsIGUpKSAqIChjMVtpXSAtIGMwW2ldKTsKICAgIGlmIChoYXNSYW5nZSkgewogICAgICBpZiAob3V0W2ldIDwgcmFuZ2VbaV1bMF0pIHsKCW91dFtpXSA9IHJhbmdlW2ldWzBdOwogICAgICB9IGVsc2UgaWYgKG91dFtpXSA+IHJhbmdlW2ldWzFdKSB7CglvdXRbaV0gPSByYW5nZVtpXVsxXTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm47Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFN0aXRjaGluZ0Z1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTdGl0Y2hpbmdGdW5jdGlvbjo6U3RpdGNoaW5nRnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0LCBzdGQ6OnNldDxpbnQ+ICp1c2VkUGFyZW50cykgewogIE9iamVjdCBvYmoxOwogIGludCBpOwoKICBvayA9IGdGYWxzZTsKICBmdW5jcyA9IG51bGxwdHI7CiAgYm91bmRzID0gbnVsbHB0cjsKICBlbmNvZGUgPSBudWxscHRyOwogIHNjYWxlID0gbnVsbHB0cjsKCiAgLy8tLS0tLSBpbml0aWFsaXplIHRoZSBnZW5lcmljIHN0dWZmCiAgaWYgKCFpbml0KGRpY3QpKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChtICE9IDEpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0aXRjaGluZyBmdW5jdGlvbiB3aXRoIG1vcmUgdGhhbiBvbmUgaW5wdXQiKTsKICAgIHJldHVybjsKICB9CgogIC8vLS0tLS0gRnVuY3Rpb25zCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRnVuY3Rpb25zIik7CiAgaWYgKCFvYmoxLmlzQXJyYXkoKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiTWlzc2luZyAnRnVuY3Rpb25zJyBlbnRyeSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgIHJldHVybjsKICB9CiAgayA9IG9iajEuYXJyYXlHZXRMZW5ndGgoKTsKICBmdW5jcyA9IChGdW5jdGlvbiAqKilnbWFsbG9jbihrLCBzaXplb2YoRnVuY3Rpb24gKikpOwogIGJvdW5kcyA9IChkb3VibGUgKilnbWFsbG9jbihrICsgMSwgc2l6ZW9mKGRvdWJsZSkpOwogIGVuY29kZSA9IChkb3VibGUgKilnbWFsbG9jbigyICogaywgc2l6ZW9mKGRvdWJsZSkpOwogIHNjYWxlID0gKGRvdWJsZSAqKWdtYWxsb2NuKGssIHNpemVvZihkb3VibGUpKTsKICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBmdW5jc1tpXSA9IG51bGxwdHI7CiAgfQogIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgIHN0ZDo6c2V0PGludD4gdXNlZFBhcmVudHNBdXggPSAqdXNlZFBhcmVudHM7CiAgICBPYmplY3Qgb2JqMiA9IG9iajEuYXJyYXlHZXRORihpKTsKICAgIGlmIChvYmoyLmlzUmVmKCkpIHsKICAgICAgY29uc3QgUmVmIHJlZiA9IG9iajIuZ2V0UmVmKCk7CiAgICAgIGlmICh1c2VkUGFyZW50c0F1eC5maW5kKHJlZi5udW0pID09IHVzZWRQYXJlbnRzQXV4LmVuZCgpKSB7CiAgICAgICAgdXNlZFBhcmVudHNBdXguaW5zZXJ0KHJlZi5udW0pOwogICAgICAgIG9iajIgPSBvYmoxLmFycmF5R2V0KGkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgaWYgKCEoZnVuY3NbaV0gPSBGdW5jdGlvbjo6cGFyc2UoJm9iajIsICZ1c2VkUGFyZW50c0F1eCkpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChmdW5jc1tpXS0+Z2V0SW5wdXRTaXplKCkgIT0gMSB8fAoJKGkgPiAwICYmIGZ1bmNzW2ldLT5nZXRPdXRwdXRTaXplKCkgIT0gZnVuY3NbMF0tPmdldE91dHB1dFNpemUoKSkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJICAgICJJbmNvbXBhdGlibGUgc3ViZnVuY3Rpb25zIGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgfQoKICAvLy0tLS0tIEJvdW5kcwogIG9iajEgPSBkaWN0LT5sb29rdXAoIkJvdW5kcyIpOwogIGlmICghb2JqMS5pc0FycmF5KCkgfHwgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IGsgLSAxKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJNaXNzaW5nIG9yIGludmFsaWQgJ0JvdW5kcycgZW50cnkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICByZXR1cm47CiAgfQogIGJvdW5kc1swXSA9IGRvbWFpblswXVswXTsKICBmb3IgKGkgPSAxOyBpIDwgazsgKytpKSB7CiAgICBPYmplY3Qgb2JqMiA9IG9iajEuYXJyYXlHZXQoaSAtIDEpOwogICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSW52YWxpZCB0eXBlIGluICdCb3VuZHMnIGFycmF5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBib3VuZHNbaV0gPSBvYmoyLmdldE51bSgpOwogIH0KICBib3VuZHNba10gPSBkb21haW5bMF1bMV07CgogIC8vLS0tLS0gRW5jb2RlCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRW5jb2RlIik7CiAgaWYgKCFvYmoxLmlzQXJyYXkoKSB8fCBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gMiAqIGspIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIk1pc3Npbmcgb3IgaW52YWxpZCAnRW5jb2RlJyBlbnRyeSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgIHJldHVybjsKICB9CiAgZm9yIChpID0gMDsgaSA8IDIgKiBrOyArK2kpIHsKICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldChpKTsKICAgIGlmICghb2JqMi5pc051bSgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkludmFsaWQgdHlwZSBpbiAnRW5jb2RlJyBhcnJheSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZW5jb2RlW2ldID0gb2JqMi5nZXROdW0oKTsKICB9CgogIC8vLS0tLS0gcHJlLWNvbXB1dGUgdGhlIHNjYWxlIGZhY3RvcnMKICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBpZiAoYm91bmRzW2ldID09IGJvdW5kc1tpKzFdKSB7CiAgICAgIC8vIGF2b2lkIGEgZGl2aWRlLWJ5LXplcm8gLS0gaW4gdGhpcyBzaXR1YXRpb24sIGZ1bmN0aW9uIGkgd2lsbAogICAgICAvLyBuZXZlciBiZSB1c2VkIGFueXdheQogICAgICBzY2FsZVtpXSA9IDA7CiAgICB9IGVsc2UgewogICAgICBzY2FsZVtpXSA9IChlbmNvZGVbMippKzFdIC0gZW5jb2RlWzIqaV0pIC8gKGJvdW5kc1tpKzFdIC0gYm91bmRzW2ldKTsKICAgIH0KICB9CgogIG4gPSBmdW5jc1swXS0+Z2V0T3V0cHV0U2l6ZSgpOwogIG9rID0gZ1RydWU7CiAgcmV0dXJuOwp9CgpTdGl0Y2hpbmdGdW5jdGlvbjo6U3RpdGNoaW5nRnVuY3Rpb24oY29uc3QgU3RpdGNoaW5nRnVuY3Rpb24gKmZ1bmMpIDogRnVuY3Rpb24oZnVuYykgewogIGsgPSBmdW5jLT5rOwoKICBmdW5jcyA9IChGdW5jdGlvbiAqKilnbWFsbG9jbihrLCBzaXplb2YoRnVuY3Rpb24gKikpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBmdW5jc1tpXSA9IGZ1bmMtPmZ1bmNzW2ldLT5jb3B5KCk7CiAgfQoKICBib3VuZHMgPSAoZG91YmxlICopZ21hbGxvY24oayArIDEsIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoYm91bmRzLCBmdW5jLT5ib3VuZHMsIChrICsgMSkgKiBzaXplb2YoZG91YmxlKSk7CgogIGVuY29kZSA9IChkb3VibGUgKilnbWFsbG9jbigyICogaywgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShlbmNvZGUsIGZ1bmMtPmVuY29kZSwgMiAqIGsgKiBzaXplb2YoZG91YmxlKSk7CgogIHNjYWxlID0gKGRvdWJsZSAqKWdtYWxsb2NuKGssIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoc2NhbGUsIGZ1bmMtPnNjYWxlLCBrICogc2l6ZW9mKGRvdWJsZSkpOwoKICBvayA9IGZ1bmMtPm9rOwp9CgpTdGl0Y2hpbmdGdW5jdGlvbjo6flN0aXRjaGluZ0Z1bmN0aW9uKCkgewogIGludCBpOwoKICBpZiAoZnVuY3MpIHsKICAgIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgICAgaWYgKGZ1bmNzW2ldKSB7CglkZWxldGUgZnVuY3NbaV07CiAgICAgIH0KICAgIH0KICB9CiAgZ2ZyZWUoZnVuY3MpOwogIGdmcmVlKGJvdW5kcyk7CiAgZ2ZyZWUoZW5jb2RlKTsKICBnZnJlZShzY2FsZSk7Cn0KCnZvaWQgU3RpdGNoaW5nRnVuY3Rpb246OnRyYW5zZm9ybShjb25zdCBkb3VibGUgKmluLCBkb3VibGUgKm91dCkgY29uc3QgewogIGRvdWJsZSB4OwogIGludCBpOwoKICBpZiAoaW5bMF0gPCBkb21haW5bMF1bMF0pIHsKICAgIHggPSBkb21haW5bMF1bMF07CiAgfSBlbHNlIGlmIChpblswXSA+IGRvbWFpblswXVsxXSkgewogICAgeCA9IGRvbWFpblswXVsxXTsKICB9IGVsc2UgewogICAgeCA9IGluWzBdOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgayAtIDE7ICsraSkgewogICAgaWYgKHggPCBib3VuZHNbaSsxXSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgeCA9IGVuY29kZVsyKmldICsgKHggLSBib3VuZHNbaV0pICogc2NhbGVbaV07CiAgZnVuY3NbaV0tPnRyYW5zZm9ybSgmeCwgb3V0KTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUG9zdFNjcmlwdEZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplbnVtIFBTT3AgewogIHBzT3BBYnMsCiAgcHNPcEFkZCwKICBwc09wQW5kLAogIHBzT3BBdGFuLAogIHBzT3BCaXRzaGlmdCwKICBwc09wQ2VpbGluZywKICBwc09wQ29weSwKICBwc09wQ29zLAogIHBzT3BDdmksCiAgcHNPcEN2ciwKICBwc09wRGl2LAogIHBzT3BEdXAsCiAgcHNPcEVxLAogIHBzT3BFeGNoLAogIHBzT3BFeHAsCiAgcHNPcEZhbHNlLAogIHBzT3BGbG9vciwKICBwc09wR2UsCiAgcHNPcEd0LAogIHBzT3BJZGl2LAogIHBzT3BJbmRleCwKICBwc09wTGUsCiAgcHNPcExuLAogIHBzT3BMb2csCiAgcHNPcEx0LAogIHBzT3BNb2QsCiAgcHNPcE11bCwKICBwc09wTmUsCiAgcHNPcE5lZywKICBwc09wTm90LAogIHBzT3BPciwKICBwc09wUG9wLAogIHBzT3BSb2xsLAogIHBzT3BSb3VuZCwKICBwc09wU2luLAogIHBzT3BTcXJ0LAogIHBzT3BTdWIsCiAgcHNPcFRydWUsCiAgcHNPcFRydW5jYXRlLAogIHBzT3BYb3IsCiAgcHNPcElmLAogIHBzT3BJZmVsc2UsCiAgcHNPcFJldHVybgp9OwoKLy8gTm90ZTogJ2lmJyBhbmQgJ2lmZWxzZScgYXJlIHBhcnNlZCBzZXBhcmF0ZWx5LgovLyBUaGUgcmVzdCBhcmUgbGlzdGVkIGhlcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgovLyBUaGUgaW5kZXggaW4gdGhpcyB0YWJsZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBlbnRyeSBpbiBQU09wLgpzdGF0aWMgY29uc3QgY2hhciAqcHNPcE5hbWVzW10gPSB7CiAgImFicyIsCiAgImFkZCIsCiAgImFuZCIsCiAgImF0YW4iLAogICJiaXRzaGlmdCIsCiAgImNlaWxpbmciLAogICJjb3B5IiwKICAiY29zIiwKICAiY3ZpIiwKICAiY3ZyIiwKICAiZGl2IiwKICAiZHVwIiwKICAiZXEiLAogICJleGNoIiwKICAiZXhwIiwKICAiZmFsc2UiLAogICJmbG9vciIsCiAgImdlIiwKICAiZ3QiLAogICJpZGl2IiwKICAiaW5kZXgiLAogICJsZSIsCiAgImxuIiwKICAibG9nIiwKICAibHQiLAogICJtb2QiLAogICJtdWwiLAogICJuZSIsCiAgIm5lZyIsCiAgIm5vdCIsCiAgIm9yIiwKICAicG9wIiwKICAicm9sbCIsCiAgInJvdW5kIiwKICAic2luIiwKICAic3FydCIsCiAgInN1YiIsCiAgInRydWUiLAogICJ0cnVuY2F0ZSIsCiAgInhvciIKfTsKCiNkZWZpbmUgblBTT3BzIChzaXplb2YocHNPcE5hbWVzKSAvIHNpemVvZihjaGFyICopKQoKZW51bSBQU09iamVjdFR5cGUgewogIHBzQm9vbCwKICBwc0ludCwKICBwc1JlYWwsCiAgcHNPcGVyYXRvciwKICBwc0Jsb2NrCn07CgovLyBJbiB0aGUgY29kZSBhcnJheSwgJ2lmJy8naWZlbHNlJyBvcGVyYXRvcnMgdGFrZSB1cCB0aHJlZSBzbG90cwovLyBwbHVzIHNwYWNlIGZvciB0aGUgY29kZSBpbiB0aGUgc3ViY2xhdXNlKHMpLgovLwovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBwc09wZXJhdG9yOiBwc09wSWYgLyBwc09wSWZlbHNlIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgICAgIHwgcHNCbG9jazogcHRyPTxBPiAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IHBzQmxvY2s6IHB0cj08Qj4gICAgICAgICAgICAgICAgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBpZiBjbGF1c2UgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgcHNPcGVyYXRvcjogcHNPcFJldHVybiAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgIDxBPiB8IGVsc2UgY2xhdXNlICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCBwc09wZXJhdG9yOiBwc09wUmV0dXJuICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgPEI+IHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vCi8vIEZvciAnaWYnLCBwb2ludGVyIDxBPiBpcyBwcmVzZW50IGluIHRoZSBjb2RlIHN0cmVhbSBidXQgdW51c2VkLgoKc3RydWN0IFBTT2JqZWN0IHsKICBQU09iamVjdFR5cGUgdHlwZTsKICB1bmlvbiB7CiAgICBHQm9vbCBib29sbjsJCS8vIGJvb2xlYW4gKHN0YWNrIG9ubHkpCiAgICBpbnQgaW50ZzsJCQkvLyBpbnRlZ2VyIChzdGFjayBhbmQgY29kZSkKICAgIGRvdWJsZSByZWFsOwkJLy8gcmVhbCAoc3RhY2sgYW5kIGNvZGUpCiAgICBQU09wIG9wOwkJCS8vIG9wZXJhdG9yIChjb2RlIG9ubHkpCiAgICBpbnQgYmxrOwkJCS8vIGlmL2lmZWxzZSBibG9jayBwb2ludGVyIChjb2RlIG9ubHkpCiAgfTsKfTsKCiNkZWZpbmUgcHNTdGFja1NpemUgMTAwCgpjbGFzcyBQU1N0YWNrIHsKcHVibGljOgoKICBQU1N0YWNrKCkge3NwID0gcHNTdGFja1NpemU7IH0KICB2b2lkIGNsZWFyKCkgeyBzcCA9IHBzU3RhY2tTaXplOyB9CiAgdm9pZCBwdXNoQm9vbChHQm9vbCBib29sbikKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc0Jvb2w7CiAgICAgIHN0YWNrW3NwXS5ib29sbiA9IGJvb2xuOwogICAgfQogIH0KICB2b2lkIHB1c2hJbnQoaW50IGludGcpCiAgewogICAgaWYgKGNoZWNrT3ZlcmZsb3coKSkgewogICAgICBzdGFja1stLXNwXS50eXBlID0gcHNJbnQ7CiAgICAgIHN0YWNrW3NwXS5pbnRnID0gaW50ZzsKICAgIH0KICB9CiAgdm9pZCBwdXNoUmVhbChkb3VibGUgcmVhbCkKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc1JlYWw7CiAgICAgIHN0YWNrW3NwXS5yZWFsID0gcmVhbDsKICAgIH0KICB9CiAgR0Jvb2wgcG9wQm9vbCgpCiAgewogICAgaWYgKGNoZWNrVW5kZXJmbG93KCkgJiYgY2hlY2tUeXBlKHBzQm9vbCwgcHNCb29sKSkgewogICAgICByZXR1cm4gc3RhY2tbc3ArK10uYm9vbG47CiAgICB9CiAgICByZXR1cm4gZ0ZhbHNlOwogIH0KICBpbnQgcG9wSW50KCkKICB7CiAgICBpZiAoY2hlY2tVbmRlcmZsb3coKSAmJiBjaGVja1R5cGUocHNJbnQsIHBzSW50KSkgewogICAgICByZXR1cm4gc3RhY2tbc3ArK10uaW50ZzsKICAgIH0KICAgIHJldHVybiAwOwogIH0KICBkb3VibGUgcG9wTnVtKCkKICB7CiAgICBkb3VibGUgcmV0OwoKICAgIGlmIChjaGVja1VuZGVyZmxvdygpICYmIGNoZWNrVHlwZShwc0ludCwgcHNSZWFsKSkgewogICAgICByZXQgPSAoc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQpID8gKGRvdWJsZSlzdGFja1tzcF0uaW50ZyA6IHN0YWNrW3NwXS5yZWFsOwogICAgICArK3NwOwogICAgICByZXR1cm4gcmV0OwogICAgfQogICAgcmV0dXJuIDA7CiAgfQogIEdCb29sIGVtcHR5KCkgeyByZXR1cm4gc3AgPT0gcHNTdGFja1NpemU7IH0KICBHQm9vbCB0b3BJc0ludCgpIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgJiYgc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQ7IH0KICBHQm9vbCB0b3BUd29BcmVJbnRzKCkKICAgIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgLSAxICYmCgkgICAgIHN0YWNrW3NwXS50eXBlID09IHBzSW50ICYmCiAgICAgICAgICAgICBzdGFja1tzcCsxXS50eXBlID09IHBzSW50OyB9CiAgR0Jvb2wgdG9wSXNSZWFsKCkgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAmJiBzdGFja1tzcF0udHlwZSA9PSBwc1JlYWw7IH0KICBHQm9vbCB0b3BUd29BcmVOdW1zKCkKICAgIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgLSAxICYmCgkgICAgIChzdGFja1tzcF0udHlwZSA9PSBwc0ludCB8fCBzdGFja1tzcF0udHlwZSA9PSBwc1JlYWwpICYmCgkgICAgIChzdGFja1tzcCsxXS50eXBlID09IHBzSW50IHx8IHN0YWNrW3NwKzFdLnR5cGUgPT0gcHNSZWFsKTsgfQogIHZvaWQgY29weShpbnQgbik7CiAgdm9pZCByb2xsKGludCBuLCBpbnQgaik7CiAgdm9pZCBpbmRleChpbnQgaSkKICB7CiAgICBpZiAoIWNoZWNrT3ZlcmZsb3coKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICAtLXNwOwogICAgaWYgKHVubGlrZWx5KHNwICsgaSArIDEgPj0gcHNTdGFja1NpemUpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIHVuZGVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh1bmxpa2VseShzcCArIGkgKyAxIDwgMCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgb3ZlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzdGFja1tzcF0gPSBzdGFja1tzcCArIDEgKyBpXTsKICB9CiAgdm9pZCBwb3AoKQogIHsKICAgIGlmICghY2hlY2tVbmRlcmZsb3coKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICArK3NwOwogIH0KCnByaXZhdGU6CgogIEdCb29sIGNoZWNrT3ZlcmZsb3coaW50IG4gPSAxKQogIHsKICAgIGlmIChzcCAtIG4gPCAwKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIG92ZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuIGdGYWxzZTsKICAgIH0KICAgIHJldHVybiBnVHJ1ZTsKICB9CiAgR0Jvb2wgY2hlY2tVbmRlcmZsb3coKQogIHsKICAgIGlmIChzcCA9PSBwc1N0YWNrU2l6ZSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayB1bmRlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcmV0dXJuIGdUcnVlOwogIH0KICBHQm9vbCBjaGVja1R5cGUoUFNPYmplY3RUeXBlIHQxLCBQU09iamVjdFR5cGUgdDIpCiAgewogICAgaWYgKHN0YWNrW3NwXS50eXBlICE9IHQxICYmIHN0YWNrW3NwXS50eXBlICE9IHQyKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgbWlzbWF0Y2ggaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcmV0dXJuIGdUcnVlOwogIH0KICBQU09iamVjdCBzdGFja1twc1N0YWNrU2l6ZV07CiAgaW50IHNwOwp9OwoKCnZvaWQgUFNTdGFjazo6Y29weShpbnQgbikgewogIGludCBpOwoKICBpZiAoc3AgKyBuID4gcHNTdGFja1NpemUpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIHVuZGVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICByZXR1cm47CiAgfQogIGlmICh1bmxpa2VseShzcCAtIG4gPiBwc1N0YWNrU2l6ZSkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIHVuZGVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICByZXR1cm47CiAgfQogIGlmICghY2hlY2tPdmVyZmxvdyhuKSkgewogICAgcmV0dXJuOwogIH0KICBmb3IgKGkgPSBzcCArIG4gLSAxOyBpID49IHNwOyAtLWkpIHsKICAgIHN0YWNrW2kgLSBuXSA9IHN0YWNrW2ldOwogIH0KICBzcCAtPSBuOwp9Cgp2b2lkIFBTU3RhY2s6OnJvbGwoaW50IG4sIGludCBqKSB7CiAgUFNPYmplY3Qgb2JqOwogIGludCBpLCBrOwoKICBpZiAodW5saWtlbHkobiA9PSAwKSkgewogICAgcmV0dXJuOwogIH0KICBpZiAoaiA+PSAwKSB7CiAgICBqICU9IG47CiAgfSBlbHNlIHsKICAgIGogPSAtaiAlIG47CiAgICBpZiAoaiAhPSAwKSB7CiAgICAgIGogPSBuIC0gajsKICAgIH0KICB9CiAgaWYgKG4gPD0gMCB8fCBqID09IDAgfHwgbiA+IHBzU3RhY2tTaXplIHx8IHNwICsgbiA+IHBzU3RhY2tTaXplKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChqIDw9IG4gLyAyKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgajsgKytpKSB7CiAgICAgIG9iaiA9IHN0YWNrW3NwXTsKICAgICAgZm9yIChrID0gc3A7IGsgPCBzcCArIG4gLSAxOyArK2spIHsKICAgICAgICBzdGFja1trXSA9IHN0YWNrW2srMV07CiAgICAgIH0KICAgICAgc3RhY2tbc3AgKyBuIC0gMV0gPSBvYmo7CiAgICB9CiAgfSBlbHNlIHsKICAgIGogPSBuIC0gajsKICAgIGZvciAoaSA9IDA7IGkgPCBqOyArK2kpIHsKICAgICAgb2JqID0gc3RhY2tbc3AgKyBuIC0gMV07CiAgICAgIGZvciAoayA9IHNwICsgbiAtIDE7IGsgPiBzcDsgLS1rKSB7CiAgICAgICAgc3RhY2tba10gPSBzdGFja1trLTFdOwogICAgICB9CiAgICAgIHN0YWNrW3NwXSA9IG9iajsKICAgIH0KICB9Cn0KClBvc3RTY3JpcHRGdW5jdGlvbjo6UG9zdFNjcmlwdEZ1bmN0aW9uKE9iamVjdCAqZnVuY09iaiwgRGljdCAqZGljdCkgewogIFN0cmVhbSAqc3RyOwogIGludCBjb2RlUHRyOwogIEdvb1N0cmluZyAqdG9rOwogIGRvdWJsZSBpbltmdW5jTWF4SW5wdXRzXTsKICBpbnQgaTsKCiAgY29kZSA9IG51bGxwdHI7CiAgY29kZVN0cmluZyA9IG51bGxwdHI7CiAgY29kZVNpemUgPSAwOwogIG9rID0gZ0ZhbHNlOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIGdvdG8gZXJyMTsKICB9CiAgaWYgKCFoYXNSYW5nZSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSA0IGZ1bmN0aW9uIGlzIG1pc3NpbmcgcmFuZ2UiKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gZ2V0IHRoZSBzdHJlYW0KICBpZiAoIWZ1bmNPYmotPmlzU3RyZWFtKCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgNCBmdW5jdGlvbiBpc24ndCBhIHN0cmVhbSIpOwogICAgZ290byBlcnIxOwogIH0KICBzdHIgPSBmdW5jT2JqLT5nZXRTdHJlYW0oKTsKCiAgLy8tLS0tLSBwYXJzZSB0aGUgZnVuY3Rpb24KICBjb2RlU3RyaW5nID0gbmV3IEdvb1N0cmluZygpOwogIHN0ci0+cmVzZXQoKTsKICBpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSB8fCB0b2stPmNtcCgieyIpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJFeHBlY3RlZCAne3snIGF0IHN0YXJ0IG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgIGlmICh0b2spIHsKICAgICAgZGVsZXRlIHRvazsKICAgIH0KICAgIGdvdG8gZXJyMTsKICB9CiAgZGVsZXRlIHRvazsKICBjb2RlUHRyID0gMDsKICBpZiAoIXBhcnNlQ29kZShzdHIsICZjb2RlUHRyKSkgewogICAgZ290byBlcnIyOwogIH0KICBzdHItPmNsb3NlKCk7CgogIC8vLS0tLS0gc2V0IHVwIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGluW2ldID0gZG9tYWluW2ldWzBdOwogICAgY2FjaGVJbltpXSA9IGluW2ldIC0gMTsKICB9CiAgdHJhbnNmb3JtKGluLCBjYWNoZU91dCk7CgogIG9rID0gZ1RydWU7CiAgCiBlcnIyOgogIHN0ci0+Y2xvc2UoKTsKIGVycjE6CiAgcmV0dXJuOwp9CgpQb3N0U2NyaXB0RnVuY3Rpb246OlBvc3RTY3JpcHRGdW5jdGlvbihjb25zdCBQb3N0U2NyaXB0RnVuY3Rpb24gKmZ1bmMpIDogRnVuY3Rpb24oZnVuYykgewogIGNvZGVTaXplID0gZnVuYy0+Y29kZVNpemU7CgogIGNvZGUgPSAoUFNPYmplY3QgKilnbWFsbG9jbihjb2RlU2l6ZSwgc2l6ZW9mKFBTT2JqZWN0KSk7CiAgbWVtY3B5KGNvZGUsIGZ1bmMtPmNvZGUsIGNvZGVTaXplICogc2l6ZW9mKFBTT2JqZWN0KSk7CgogIGNvZGVTdHJpbmcgPSBmdW5jLT5jb2RlU3RyaW5nLT5jb3B5KCk7CgogIG1lbWNweShjYWNoZUluLCBmdW5jLT5jYWNoZUluLCBmdW5jTWF4SW5wdXRzICogc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShjYWNoZU91dCwgZnVuYy0+Y2FjaGVPdXQsIGZ1bmNNYXhPdXRwdXRzICogc2l6ZW9mKGRvdWJsZSkpOwoKICBvayA9IGZ1bmMtPm9rOwp9CgpQb3N0U2NyaXB0RnVuY3Rpb246On5Qb3N0U2NyaXB0RnVuY3Rpb24oKSB7CiAgZ2ZyZWUoY29kZSk7CiAgZGVsZXRlIGNvZGVTdHJpbmc7Cn0KCnZvaWQgUG9zdFNjcmlwdEZ1bmN0aW9uOjp0cmFuc2Zvcm0oY29uc3QgZG91YmxlICppbiwgZG91YmxlICpvdXQpIGNvbnN0IHsKICBQU1N0YWNrIHN0YWNrOwogIGludCBpOwoKICAvLyBjaGVjayB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpZiAoaW5baV0gIT0gY2FjaGVJbltpXSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGkgPT0gbSkgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvdXRbaV0gPSBjYWNoZU91dFtpXTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIC8vfiBtYXkgbmVlZCB0byBjaGVjayBmb3IgaW50ZWdlcnMgaGVyZQogICAgc3RhY2sucHVzaFJlYWwoaW5baV0pOwogIH0KICBleGVjKCZzdGFjaywgMCk7CiAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICBvdXRbaV0gPSBzdGFjay5wb3BOdW0oKTsKICAgIGlmIChvdXRbaV0gPCByYW5nZVtpXVswXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVswXTsKICAgIH0gZWxzZSBpZiAob3V0W2ldID4gcmFuZ2VbaV1bMV0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQogIHN0YWNrLmNsZWFyKCk7CgogIC8vIGlmICghc3RhY2stPmVtcHR5KCkpIHsKICAvLyAgIGVycm9yKGVyclN5bnRheFdhcm5pbmcsIC0xLAogIC8vICAgICAgICAgIkV4dHJhIHZhbHVlcyBvbiBzdGFjayBhdCBlbmQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogIC8vIH0KCiAgLy8gc2F2ZSBjdXJyZW50IHJlc3VsdCBpbiB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBjYWNoZUluW2ldID0gaW5baV07CiAgfQogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIGNhY2hlT3V0W2ldID0gb3V0W2ldOwogIH0KfQoKR0Jvb2wgUG9zdFNjcmlwdEZ1bmN0aW9uOjpwYXJzZUNvZGUoU3RyZWFtICpzdHIsIGludCAqY29kZVB0cikgewogIEdvb1N0cmluZyAqdG9rOwogIEdCb29sIGlzUmVhbDsKICBpbnQgb3BQdHIsIGVsc2VQdHI7CiAgaW50IGEsIGIsIG1pZCwgY21wOwoKICB3aGlsZSAoMSkgewogICAgaWYgKCEodG9rID0gZ2V0VG9rZW4oc3RyKSkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVW5leHBlY3RlZCBlbmQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiBzdHJlYW0iKTsKICAgICAgcmV0dXJuIGdGYWxzZTsKICAgIH0KICAgIGNvbnN0IGNoYXIgKnAgPSB0b2stPmdldENTdHJpbmcoKTsKICAgIGlmIChpc2RpZ2l0KCpwKSB8fCAqcCA9PSAnLicgfHwgKnAgPT0gJy0nKSB7CiAgICAgIGlzUmVhbCA9IGdGYWxzZTsKICAgICAgZm9yICg7ICpwOyArK3ApIHsKCWlmICgqcCA9PSAnLicpIHsKCSAgaXNSZWFsID0gZ1RydWU7CgkgIGJyZWFrOwoJfQogICAgICB9CiAgICAgIHJlc2l6ZUNvZGUoKmNvZGVQdHIpOwogICAgICBpZiAoaXNSZWFsKSB7Cgljb2RlWypjb2RlUHRyXS50eXBlID0gcHNSZWFsOwogICAgICAgICAgY29kZVsqY29kZVB0cl0ucmVhbCA9IGdhdG9mKHRvay0+Z2V0Q1N0cmluZygpKTsKICAgICAgfSBlbHNlIHsKCWNvZGVbKmNvZGVQdHJdLnR5cGUgPSBwc0ludDsKCWNvZGVbKmNvZGVQdHJdLmludGcgPSBhdG9pKHRvay0+Z2V0Q1N0cmluZygpKTsKICAgICAgfQogICAgICArKypjb2RlUHRyOwogICAgICBkZWxldGUgdG9rOwogICAgfSBlbHNlIGlmICghdG9rLT5jbXAoInsiKSkgewogICAgICBkZWxldGUgdG9rOwogICAgICBvcFB0ciA9ICpjb2RlUHRyOwogICAgICAqY29kZVB0ciArPSAzOwogICAgICByZXNpemVDb2RlKG9wUHRyICsgMik7CiAgICAgIGlmICghcGFyc2VDb2RlKHN0ciwgY29kZVB0cikpIHsKCXJldHVybiBnRmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCEodG9rID0gZ2V0VG9rZW4oc3RyKSkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlVuZXhwZWN0ZWQgZW5kIG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24gc3RyZWFtIik7CglyZXR1cm4gZ0ZhbHNlOwogICAgICB9CiAgICAgIGlmICghdG9rLT5jbXAoInsiKSkgewoJZWxzZVB0ciA9ICpjb2RlUHRyOwoJaWYgKCFwYXJzZUNvZGUoc3RyLCBjb2RlUHRyKSkgewoJICBkZWxldGUgdG9rOwoJICByZXR1cm4gZ0ZhbHNlOwoJfQoJZGVsZXRlIHRvazsKCWlmICghKHRvayA9IGdldFRva2VuKHN0cikpKSB7CgkgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlVuZXhwZWN0ZWQgZW5kIG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24gc3RyZWFtIik7CgkgIHJldHVybiBnRmFsc2U7Cgl9CiAgICAgIH0gZWxzZSB7CgllbHNlUHRyID0gLTE7CiAgICAgIH0KICAgICAgaWYgKCF0b2stPmNtcCgiaWYiKSkgewoJaWYgKGVsc2VQdHIgPj0gMCkgewoJICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsCgkJIkdvdCAnaWYnIG9wZXJhdG9yIHdpdGggdHdvIGJsb2NrcyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CgkgIHJldHVybiBnRmFsc2U7Cgl9Cgljb2RlW29wUHRyXS50eXBlID0gcHNPcGVyYXRvcjsKCWNvZGVbb3BQdHJdLm9wID0gcHNPcElmOwoJY29kZVtvcFB0cisyXS50eXBlID0gcHNCbG9jazsKCWNvZGVbb3BQdHIrMl0uYmxrID0gKmNvZGVQdHI7CiAgICAgIH0gZWxzZSBpZiAoIXRvay0+Y21wKCJpZmVsc2UiKSkgewoJaWYgKGVsc2VQdHIgPCAwKSB7CgkgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwKCQkiR290ICdpZmVsc2UnIG9wZXJhdG9yIHdpdGggb25lIGJsb2NrIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKCSAgcmV0dXJuIGdGYWxzZTsKCX0KCWNvZGVbb3BQdHJdLnR5cGUgPSBwc09wZXJhdG9yOwoJY29kZVtvcFB0cl0ub3AgPSBwc09wSWZlbHNlOwoJY29kZVtvcFB0cisxXS50eXBlID0gcHNCbG9jazsKCWNvZGVbb3BQdHIrMV0uYmxrID0gZWxzZVB0cjsKCWNvZGVbb3BQdHIrMl0udHlwZSA9IHBzQmxvY2s7Cgljb2RlW29wUHRyKzJdLmJsayA9ICpjb2RlUHRyOwogICAgICB9IGVsc2UgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJICAgICAgIkV4cGVjdGVkIGlmL2lmZWxzZSBvcGVyYXRvciBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CglkZWxldGUgdG9rOwoJcmV0dXJuIGdGYWxzZTsKICAgICAgfQogICAgICBkZWxldGUgdG9rOwogICAgfSBlbHNlIGlmICghdG9rLT5jbXAoIn0iKSkgewogICAgICBkZWxldGUgdG9rOwogICAgICByZXNpemVDb2RlKCpjb2RlUHRyKTsKICAgICAgY29kZVsqY29kZVB0cl0udHlwZSA9IHBzT3BlcmF0b3I7CiAgICAgIGNvZGVbKmNvZGVQdHJdLm9wID0gcHNPcFJldHVybjsKICAgICAgKysqY29kZVB0cjsKICAgICAgYnJlYWs7CiAgICB9IGVsc2UgewogICAgICBhID0gLTE7CiAgICAgIGIgPSBuUFNPcHM7CiAgICAgIGNtcCA9IDA7IC8vIG1ha2UgZ2NjIGhhcHB5CiAgICAgIC8vIGludmFyaWFudDogcHNPcE5hbWVzW2FdIDwgdG9rIDwgcHNPcE5hbWVzW2JdCiAgICAgIHdoaWxlIChiIC0gYSA+IDEpIHsKCW1pZCA9IChhICsgYikgLyAyOwoJY21wID0gdG9rLT5jbXAocHNPcE5hbWVzW21pZF0pOwoJaWYgKGNtcCA+IDApIHsKCSAgYSA9IG1pZDsKCX0gZWxzZSBpZiAoY21wIDwgMCkgewoJICBiID0gbWlkOwoJfSBlbHNlIHsKCSAgYSA9IGIgPSBtaWQ7Cgl9CiAgICAgIH0KICAgICAgaWYgKGNtcCAhPSAwKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsCgkgICAgICAiVW5rbm93biBvcGVyYXRvciAnezA6dH0nIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iLAoJICAgICAgdG9rKTsKCWRlbGV0ZSB0b2s7CglyZXR1cm4gZ0ZhbHNlOwogICAgICB9CiAgICAgIGRlbGV0ZSB0b2s7CiAgICAgIHJlc2l6ZUNvZGUoKmNvZGVQdHIpOwogICAgICBjb2RlWypjb2RlUHRyXS50eXBlID0gcHNPcGVyYXRvcjsKICAgICAgY29kZVsqY29kZVB0cl0ub3AgPSAoUFNPcClhOwogICAgICArKypjb2RlUHRyOwogICAgfQogIH0KICByZXR1cm4gZ1RydWU7Cn0KCkdvb1N0cmluZyAqUG9zdFNjcmlwdEZ1bmN0aW9uOjpnZXRUb2tlbihTdHJlYW0gKnN0cikgewogIEdvb1N0cmluZyAqczsKICBpbnQgYzsKICBHQm9vbCBjb21tZW50OwoKICBzID0gbmV3IEdvb1N0cmluZygpOwogIGNvbW1lbnQgPSBnRmFsc2U7CiAgd2hpbGUgKDEpIHsKICAgIGlmICgoYyA9IHN0ci0+Z2V0Q2hhcigpKSA9PSBFT0YpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjb2RlU3RyaW5nLT5hcHBlbmQoYyk7CiAgICBpZiAoY29tbWVudCkgewogICAgICBpZiAoYyA9PSAnXHgwYScgfHwgYyA9PSAnXHgwZCcpIHsKCWNvbW1lbnQgPSBnRmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYyA9PSAnJScpIHsKICAgICAgY29tbWVudCA9IGdUcnVlOwogICAgfSBlbHNlIGlmICghaXNzcGFjZShjKSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGMgPT0gJ3snIHx8IGMgPT0gJ30nKSB7CiAgICBzLT5hcHBlbmQoKGNoYXIpYyk7CiAgfSBlbHNlIGlmIChpc2RpZ2l0KGMpIHx8IGMgPT0gJy4nIHx8IGMgPT0gJy0nKSB7CiAgICB3aGlsZSAoMSkgewogICAgICBzLT5hcHBlbmQoKGNoYXIpYyk7CiAgICAgIGMgPSBzdHItPmxvb2tDaGFyKCk7CiAgICAgIGlmIChjID09IEVPRiB8fCAhKGlzZGlnaXQoYykgfHwgYyA9PSAnLicgfHwgYyA9PSAnLScpKSB7CglicmVhazsKICAgICAgfQogICAgICBzdHItPmdldENoYXIoKTsKICAgICAgY29kZVN0cmluZy0+YXBwZW5kKGMpOwogICAgfQogIH0gZWxzZSB7CiAgICB3aGlsZSAoMSkgewogICAgICBzLT5hcHBlbmQoKGNoYXIpYyk7CiAgICAgIGMgPSBzdHItPmxvb2tDaGFyKCk7CiAgICAgIGlmIChjID09IEVPRiB8fCAhaXNhbG51bShjKSkgewoJYnJlYWs7CiAgICAgIH0KICAgICAgc3RyLT5nZXRDaGFyKCk7CiAgICAgIGNvZGVTdHJpbmctPmFwcGVuZChjKTsKICAgIH0KICB9CiAgcmV0dXJuIHM7Cn0KCnZvaWQgUG9zdFNjcmlwdEZ1bmN0aW9uOjpyZXNpemVDb2RlKGludCBuZXdTaXplKSB7CiAgaWYgKG5ld1NpemUgPj0gY29kZVNpemUpIHsKICAgIGNvZGVTaXplICs9IDY0OwogICAgY29kZSA9IChQU09iamVjdCAqKWdyZWFsbG9jbihjb2RlLCBjb2RlU2l6ZSwgc2l6ZW9mKFBTT2JqZWN0KSk7CiAgfQp9Cgp2b2lkIFBvc3RTY3JpcHRGdW5jdGlvbjo6ZXhlYyhQU1N0YWNrICpzdGFjaywgaW50IGNvZGVQdHIpIGNvbnN0IHsKICBpbnQgaTEsIGkyOwogIGRvdWJsZSByMSwgcjIsIHJlc3VsdDsKICBHQm9vbCBiMSwgYjI7CgogIHdoaWxlICgxKSB7CiAgICBzd2l0Y2ggKGNvZGVbY29kZVB0cl0udHlwZSkgewogICAgY2FzZSBwc0ludDoKICAgICAgc3RhY2stPnB1c2hJbnQoY29kZVtjb2RlUHRyKytdLmludGcpOwogICAgICBicmVhazsKICAgIGNhc2UgcHNSZWFsOgogICAgICBzdGFjay0+cHVzaFJlYWwoY29kZVtjb2RlUHRyKytdLnJlYWwpOwogICAgICBicmVhazsKICAgIGNhc2UgcHNPcGVyYXRvcjoKICAgICAgc3dpdGNoIChjb2RlW2NvZGVQdHIrK10ub3ApIHsKICAgICAgY2FzZSBwc09wQWJzOgoJaWYgKHN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoSW50KGFicyhzdGFjay0+cG9wSW50KCkpKTsKCX0gZWxzZSB7CgkgIHN0YWNrLT5wdXNoUmVhbChmYWJzKHN0YWNrLT5wb3BOdW0oKSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEFkZDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgKyBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoUmVhbChyMSArIHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BBbmQ6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoSW50KGkxICYgaTIpOwoJfSBlbHNlIHsKCSAgYjIgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBiMSA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChiMSAmJiBiMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQXRhbjoKCXIyID0gc3RhY2stPnBvcE51bSgpOwoJcjEgPSBzdGFjay0+cG9wTnVtKCk7CglyZXN1bHQgPSBhdGFuMihyMSwgcjIpICogMTgwLjAgLyBNX1BJOwoJaWYgKHJlc3VsdCA8IDApIHJlc3VsdCArPSAzNjAuMDsKCXN0YWNrLT5wdXNoUmVhbChyZXN1bHQpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEJpdHNoaWZ0OgoJaTIgPSBzdGFjay0+cG9wSW50KCk7CglpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCWlmIChpMiA+IDApIHsKCSAgc3RhY2stPnB1c2hJbnQoaTEgPDwgaTIpOwoJfSBlbHNlIGlmIChpMiA8IDApIHsKCSAgc3RhY2stPnB1c2hJbnQoKGludCkoKEd1aW50KWkxID4+IC1pMikpOwoJfSBlbHNlIHsKCSAgc3RhY2stPnB1c2hJbnQoaTEpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcENlaWxpbmc6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoUmVhbChjZWlsKHN0YWNrLT5wb3BOdW0oKSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcENvcHk6CglzdGFjay0+Y29weShzdGFjay0+cG9wSW50KCkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcENvczoKCXN0YWNrLT5wdXNoUmVhbChjb3Moc3RhY2stPnBvcE51bSgpICogTV9QSSAvIDE4MC4wKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wQ3ZpOgoJaWYgKCFzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaEludCgoaW50KXN0YWNrLT5wb3BOdW0oKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQ3ZyOgoJaWYgKCFzdGFjay0+dG9wSXNSZWFsKCkpIHsKCSAgc3RhY2stPnB1c2hSZWFsKHN0YWNrLT5wb3BOdW0oKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wRGl2OgoJcjIgPSBzdGFjay0+cG9wTnVtKCk7CglyMSA9IHN0YWNrLT5wb3BOdW0oKTsKCXN0YWNrLT5wdXNoUmVhbChyMSAvIHIyKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BEdXA6CglzdGFjay0+Y29weSgxKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BFcToKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxID09IGkyKTsKCX0gZWxzZSBpZiAoc3RhY2stPnRvcFR3b0FyZU51bXMoKSkgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSA9PSByMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxID09IGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BFeGNoOgoJc3RhY2stPnJvbGwoMiwgMSk7CglicmVhazsKICAgICAgY2FzZSBwc09wRXhwOgoJcjIgPSBzdGFjay0+cG9wTnVtKCk7CglyMSA9IHN0YWNrLT5wb3BOdW0oKTsKCXN0YWNrLT5wdXNoUmVhbChwb3cocjEsIHIyKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wRmFsc2U6CglzdGFjay0+cHVzaEJvb2woZ0ZhbHNlKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BGbG9vcjoKCWlmICghc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hSZWFsKGZsb29yKHN0YWNrLT5wb3BOdW0oKSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEdlOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgPj0gaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgPj0gcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEd0OgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgPiBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSA+IHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BJZGl2OgoJaTIgPSBzdGFjay0+cG9wSW50KCk7CglpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCWlmIChsaWtlbHkoaTIgIT0gMCkpIHsKCSAgc3RhY2stPnB1c2hJbnQoaTEgLyBpMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wSW5kZXg6CglzdGFjay0+aW5kZXgoc3RhY2stPnBvcEludCgpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BMZToKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxIDw9IGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxIDw9IHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BMbjoKCXN0YWNrLT5wdXNoUmVhbChsb2coc3RhY2stPnBvcE51bSgpKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wTG9nOgoJc3RhY2stPnB1c2hSZWFsKGxvZzEwKHN0YWNrLT5wb3BOdW0oKSkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEx0OgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgPCBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSA8IHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BNb2Q6CglpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCWkxID0gc3RhY2stPnBvcEludCgpOwoJaWYgKGxpa2VseShpMiAhPSAwKSkgewoJICBzdGFjay0+cHVzaEludChpMSAlIGkyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BNdWw6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIC8vfiBzaG91bGQgY2hlY2sgZm9yIG91dC1vZi1yYW5nZSwgYW5kIHB1c2ggYSByZWFsIGluc3RlYWQKCSAgc3RhY2stPnB1c2hJbnQoaTEgKiBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoUmVhbChyMSAqIHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BOZToKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxICE9IGkyKTsKCX0gZWxzZSBpZiAoc3RhY2stPnRvcFR3b0FyZU51bXMoKSkgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSAhPSByMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxICE9IGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BOZWc6CglpZiAoc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hJbnQoLXN0YWNrLT5wb3BJbnQoKSk7Cgl9IGVsc2UgewoJICBzdGFjay0+cHVzaFJlYWwoLXN0YWNrLT5wb3BOdW0oKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wTm90OgoJaWYgKHN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoSW50KH5zdGFjay0+cG9wSW50KCkpOwoJfSBlbHNlIHsKCSAgc3RhY2stPnB1c2hCb29sKCFzdGFjay0+cG9wQm9vbCgpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BPcjoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgfCBpMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxIHx8IGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BQb3A6CglzdGFjay0+cG9wKCk7CglicmVhazsKICAgICAgY2FzZSBwc09wUm9sbDoKCWkyID0gc3RhY2stPnBvcEludCgpOwoJaTEgPSBzdGFjay0+cG9wSW50KCk7CglzdGFjay0+cm9sbChpMSwgaTIpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFJvdW5kOgoJaWYgKCFzdGFjay0+dG9wSXNJbnQoKSkgewoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKChyMSA+PSAwKSA/IGZsb29yKHIxICsgMC41KSA6IGNlaWwocjEgLSAwLjUpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BTaW46CglzdGFjay0+cHVzaFJlYWwoc2luKHN0YWNrLT5wb3BOdW0oKSAqIE1fUEkgLyAxODAuMCkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFNxcnQ6CglzdGFjay0+cHVzaFJlYWwoc3FydChzdGFjay0+cG9wTnVtKCkpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BTdWI6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoSW50KGkxIC0gaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwocjEgLSByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wVHJ1ZToKCXN0YWNrLT5wdXNoQm9vbChnVHJ1ZSk7CglicmVhazsKICAgICAgY2FzZSBwc09wVHJ1bmNhdGU6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwoKHIxID49IDApID8gZmxvb3IocjEpIDogY2VpbChyMSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFhvcjoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgXiBpMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxIF4gYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcElmOgoJYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJaWYgKGIxKSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVQdHIgKyAyKTsKCX0KCWNvZGVQdHIgPSBjb2RlW2NvZGVQdHIgKyAxXS5ibGs7CglicmVhazsKICAgICAgY2FzZSBwc09wSWZlbHNlOgoJYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJaWYgKGIxKSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVQdHIgKyAyKTsKCX0gZWxzZSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVbY29kZVB0cl0uYmxrKTsKCX0KCWNvZGVQdHIgPSBjb2RlW2NvZGVQdHIgKyAxXS5ibGs7CglicmVhazsKICAgICAgY2FzZSBwc09wUmV0dXJuOgoJcmV0dXJuOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSW50ZXJuYWw6IGJhZCBvYmplY3QgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiBjb2RlIik7CiAgICAgIGJyZWFrOwogICAgfQogIH0KfQo=