Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRnVuY3Rpb24uY2MKLy8KLy8gQ29weXJpZ2h0IDIwMDEtMjAwMyBHbHlwaCAmIENvZywgTExDCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4LTIwMTAgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAwNiBKZWZmIE11aXplbGFhciA8amVmZkBpbmZpZGlnbS5uZXQ+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBDaHJpc3RpYW4gRmV1ZXJz5G5nZXIgPGNmZXVlcnNhZW5nZXJAZ29vZ2xlbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMSBBbmRyZWEgQ2FuY2lhbmkgPHJhbm1hNDJAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhvbWFzIEZyZWl0YWcgPFRob21hcy5GcmVpdGFnQGFsZmEuZGU+Ci8vCi8vIFRvIHNlZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2VzIHBsZWFzZSBzZWUgdGhlIENoYW5nZWxvZyBmaWxlIHRoYXQKLy8gY2FtZSB3aXRoIHlvdXIgdGFyYmFsbCBvciB0eXBlIG1ha2UgQ2hhbmdlTG9nIGlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBnaXQKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlIDxjb25maWcuaD4KCiNpZmRlZiBVU0VfR0NDX1BSQUdNQVMKI3ByYWdtYSBpbXBsZW1lbnRhdGlvbgojZW5kaWYKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgImdvby9nbWVtLmgiCiNpbmNsdWRlICJnb28vZ3N0cnRvZC5oIgojaW5jbHVkZSAiT2JqZWN0LmgiCiNpbmNsdWRlICJEaWN0LmgiCiNpbmNsdWRlICJTdHJlYW0uaCIKI2luY2x1ZGUgIkVycm9yLmgiCiNpbmNsdWRlICJGdW5jdGlvbi5oIgoKI2lmbmRlZiBNX1BJCiNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CiNlbmRpZgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZ1bmN0aW9uOjpGdW5jdGlvbigpIHsKfQoKRnVuY3Rpb246On5GdW5jdGlvbigpIHsKfQoKRnVuY3Rpb24gKkZ1bmN0aW9uOjpwYXJzZShPYmplY3QgKmZ1bmNPYmopIHsKICBzdGQ6OnNldDxpbnQ+IHVzZWRQYXJlbnRzOwogIHJldHVybiBwYXJzZShmdW5jT2JqLCAmdXNlZFBhcmVudHMpOwp9CgpGdW5jdGlvbiAqRnVuY3Rpb246OnBhcnNlKE9iamVjdCAqZnVuY09iaiwgc3RkOjpzZXQ8aW50PiAqdXNlZFBhcmVudHMpIHsKICBGdW5jdGlvbiAqZnVuYzsKICBEaWN0ICpkaWN0OwogIGludCBmdW5jVHlwZTsKICBPYmplY3Qgb2JqMTsKCiAgaWYgKGZ1bmNPYmotPmlzU3RyZWFtKCkpIHsKICAgIGRpY3QgPSBmdW5jT2JqLT5zdHJlYW1HZXREaWN0KCk7CiAgfSBlbHNlIGlmIChmdW5jT2JqLT5pc0RpY3QoKSkgewogICAgZGljdCA9IGZ1bmNPYmotPmdldERpY3QoKTsKICB9IGVsc2UgaWYgKGZ1bmNPYmotPmlzTmFtZSgiSWRlbnRpdHkiKSkgewogICAgcmV0dXJuIG5ldyBJZGVudGl0eUZ1bmN0aW9uKCk7CiAgfSBlbHNlIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkV4cGVjdGVkIGZ1bmN0aW9uIGRpY3Rpb25hcnkgb3Igc3RyZWFtIik7CiAgICByZXR1cm4gTlVMTDsKICB9CgogIGlmICghZGljdC0+bG9va3VwKCJGdW5jdGlvblR5cGUiLCAmb2JqMSktPmlzSW50KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIHR5cGUgaXMgbWlzc2luZyBvciB3cm9uZyB0eXBlIik7CiAgICBvYmoxLmZyZWUoKTsKICAgIHJldHVybiBOVUxMOwogIH0KICBmdW5jVHlwZSA9IG9iajEuZ2V0SW50KCk7CiAgb2JqMS5mcmVlKCk7CgogIGlmIChmdW5jVHlwZSA9PSAwKSB7CiAgICBmdW5jID0gbmV3IFNhbXBsZWRGdW5jdGlvbihmdW5jT2JqLCBkaWN0KTsKICB9IGVsc2UgaWYgKGZ1bmNUeXBlID09IDIpIHsKICAgIGZ1bmMgPSBuZXcgRXhwb25lbnRpYWxGdW5jdGlvbihmdW5jT2JqLCBkaWN0KTsKICB9IGVsc2UgaWYgKGZ1bmNUeXBlID09IDMpIHsKICAgIGZ1bmMgPSBuZXcgU3RpdGNoaW5nRnVuY3Rpb24oZnVuY09iaiwgZGljdCwgdXNlZFBhcmVudHMpOwogIH0gZWxzZSBpZiAoZnVuY1R5cGUgPT0gNCkgewogICAgZnVuYyA9IG5ldyBQb3N0U2NyaXB0RnVuY3Rpb24oZnVuY09iaiwgZGljdCk7CiAgfSBlbHNlIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gdHlwZSAoezA6ZH0pIiwgZnVuY1R5cGUpOwogICAgcmV0dXJuIE5VTEw7CiAgfQogIGlmICghZnVuYy0+aXNPaygpKSB7CiAgICBkZWxldGUgZnVuYzsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgcmV0dXJuIGZ1bmM7Cn0KCkdCb29sIEZ1bmN0aW9uOjppbml0KERpY3QgKmRpY3QpIHsKICBPYmplY3Qgb2JqMSwgb2JqMjsKICBpbnQgaTsKCiAgLy8tLS0tLSBEb21haW4KICBpZiAoIWRpY3QtPmxvb2t1cCgiRG9tYWluIiwgJm9iajEpLT5pc0FycmF5KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGlzIG1pc3NpbmcgZG9tYWluIik7CiAgICBnb3RvIGVycjI7CiAgfQogIG0gPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgLyAyOwogIGlmIChtID4gZnVuY01heElucHV0cykgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb25zIHdpdGggbW9yZSB0aGFuIHswOmR9IGlucHV0cyBhcmUgdW5zdXBwb3J0ZWQiLAoJICBmdW5jTWF4SW5wdXRzKTsKICAgIGdvdG8gZXJyMjsKICB9CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgb2JqMS5hcnJheUdldCgyKmksICZvYmoyKTsKICAgIGlmICghb2JqMi5pc051bSgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZG9tYWluIGFycmF5Iik7CiAgICAgIGdvdG8gZXJyMTsKICAgIH0KICAgIGRvbWFpbltpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICBvYmoyLmZyZWUoKTsKICAgIG9iajEuYXJyYXlHZXQoMippKzEsICZvYmoyKTsKICAgIGlmICghb2JqMi5pc051bSgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZG9tYWluIGFycmF5Iik7CiAgICAgIGdvdG8gZXJyMTsKICAgIH0KICAgIGRvbWFpbltpXVsxXSA9IG9iajIuZ2V0TnVtKCk7CiAgICBvYmoyLmZyZWUoKTsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gUmFuZ2UKICBoYXNSYW5nZSA9IGdGYWxzZTsKICBuID0gMDsKICBpZiAoZGljdC0+bG9va3VwKCJSYW5nZSIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBoYXNSYW5nZSA9IGdUcnVlOwogICAgbiA9IG9iajEuYXJyYXlHZXRMZW5ndGgoKSAvIDI7CiAgICBpZiAobiA+IGZ1bmNNYXhPdXRwdXRzKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9ucyB3aXRoIG1vcmUgdGhhbiB7MDpkfSBvdXRwdXRzIGFyZSB1bnN1cHBvcnRlZCIsCgkgICAgZnVuY01heE91dHB1dHMpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG9iajEuYXJyYXlHZXQoMippLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIHJhbmdlIGFycmF5Iik7Cglnb3RvIGVycjE7CiAgICAgIH0KICAgICAgcmFuZ2VbaV1bMF0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgICAgb2JqMS5hcnJheUdldCgyKmkrMSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiByYW5nZSBhcnJheSIpOwoJZ290byBlcnIxOwogICAgICB9CiAgICAgIHJhbmdlW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICB9CiAgfQogIG9iajEuZnJlZSgpOwoKICByZXR1cm4gZ1RydWU7CgogZXJyMToKICBvYmoyLmZyZWUoKTsKIGVycjI6CiAgb2JqMS5mcmVlKCk7CiAgcmV0dXJuIGdGYWxzZTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSWRlbnRpdHlGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSWRlbnRpdHlGdW5jdGlvbjo6SWRlbnRpdHlGdW5jdGlvbigpIHsKICBpbnQgaTsKCiAgLy8gZmlsbCB0aGVzZSBpbiB3aXRoIGFyYml0cmFyeSB2YWx1ZXMganVzdCBpbiBjYXNlIHRoZXkgZ2V0IHVzZWQKICAvLyBzb21ld2hlcmUKICBtID0gZnVuY01heElucHV0czsKICBuID0gZnVuY01heE91dHB1dHM7CiAgZm9yIChpID0gMDsgaSA8IGZ1bmNNYXhJbnB1dHM7ICsraSkgewogICAgZG9tYWluW2ldWzBdID0gMDsKICAgIGRvbWFpbltpXVsxXSA9IDE7CiAgfQogIGhhc1JhbmdlID0gZ0ZhbHNlOwp9CgpJZGVudGl0eUZ1bmN0aW9uOjp+SWRlbnRpdHlGdW5jdGlvbigpIHsKfQoKdm9pZCBJZGVudGl0eUZ1bmN0aW9uOjp0cmFuc2Zvcm0oZG91YmxlICppbiwgZG91YmxlICpvdXQpIHsKICBpbnQgaTsKCiAgZm9yIChpID0gMDsgaSA8IGZ1bmNNYXhPdXRwdXRzOyArK2kpIHsKICAgIG91dFtpXSA9IGluW2ldOwogIH0KfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU2FtcGxlZEZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTYW1wbGVkRnVuY3Rpb246OlNhbXBsZWRGdW5jdGlvbihPYmplY3QgKmZ1bmNPYmosIERpY3QgKmRpY3QpIHsKICBTdHJlYW0gKnN0cjsKICBpbnQgc2FtcGxlQml0czsKICBkb3VibGUgc2FtcGxlTXVsOwogIE9iamVjdCBvYmoxLCBvYmoyOwogIEd1aW50IGJ1ZiwgYml0TWFzazsKICBpbnQgYml0czsKICBHdWludCBzOwogIGRvdWJsZSBpbltmdW5jTWF4SW5wdXRzXTsKICBpbnQgaSwgaiwgdCwgYml0LCBpZHg7CgogIGlkeE9mZnNldCA9IE5VTEw7CiAgc2FtcGxlcyA9IE5VTEw7CiAgc0J1ZiA9IE5VTEw7CiAgb2sgPSBnRmFsc2U7CgogIC8vLS0tLS0gaW5pdGlhbGl6ZSB0aGUgZ2VuZXJpYyBzdHVmZgogIGlmICghaW5pdChkaWN0KSkgewogICAgZ290byBlcnIxOwogIH0KICBpZiAoIWhhc1JhbmdlKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJUeXBlIDAgZnVuY3Rpb24gaXMgbWlzc2luZyByYW5nZSIpOwogICAgZ290byBlcnIxOwogIH0KICBpZiAobSA+IHNhbXBsZWRGdW5jTWF4SW5wdXRzKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTYW1wbGVkIGZ1bmN0aW9ucyB3aXRoIG1vcmUgdGhhbiB7MDpkfSBpbnB1dHMgYXJlIHVuc3VwcG9ydGVkIiwKCSAgc2FtcGxlZEZ1bmNNYXhJbnB1dHMpOwogICAgZ290byBlcnIxOwogIH0KCiAgLy8tLS0tLSBidWZmZXIKICBzQnVmID0gKGRvdWJsZSAqKWdtYWxsb2NuKDEgPDwgbSwgc2l6ZW9mKGRvdWJsZSkpOwoKICAvLy0tLS0tIGdldCB0aGUgc3RyZWFtCiAgaWYgKCFmdW5jT2JqLT5pc1N0cmVhbSgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJUeXBlIDAgZnVuY3Rpb24gaXNuJ3QgYSBzdHJlYW0iKTsKICAgIGdvdG8gZXJyMTsKICB9CiAgc3RyID0gZnVuY09iai0+Z2V0U3RyZWFtKCk7CgogIC8vLS0tLS0gU2l6ZQogIGlmICghZGljdC0+bG9va3VwKCJTaXplIiwgJm9iajEpLT5pc0FycmF5KCkgfHwKICAgICAgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IG0pIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgc2l6ZSBhcnJheSIpOwogICAgZ290byBlcnIyOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBvYmoxLmFycmF5R2V0KGksICZvYmoyKTsKICAgIGlmICghb2JqMi5pc0ludCgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gc2l6ZSBhcnJheSIpOwogICAgICBnb3RvIGVycjM7CiAgICB9CiAgICBzYW1wbGVTaXplW2ldID0gb2JqMi5nZXRJbnQoKTsKICAgIGlmIChzYW1wbGVTaXplW2ldIDw9IDApIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCBub24tcG9zaXRpdmUgdmFsdWUgaW4gZnVuY3Rpb24gc2l6ZSBhcnJheSIpOwogICAgICBnb3RvIGVycjM7CiAgICB9CiAgICBvYmoyLmZyZWUoKTsKICB9CiAgb2JqMS5mcmVlKCk7CiAgaWR4T2Zmc2V0ID0gKGludCAqKWdtYWxsb2NuKDEgPDwgbSwgc2l6ZW9mKGludCkpOwogIGZvciAoaSA9IDA7IGkgPCAoMTw8bSk7ICsraSkgewogICAgaWR4ID0gMDsKICAgIGZvciAoaiA9IG0gLSAxLCB0ID0gaTsgaiA+PSAxOyAtLWosIHQgPDw9IDEpIHsKICAgICAgaWYgKHNhbXBsZVNpemVbal0gPT0gMSkgewoJYml0ID0gMDsKICAgICAgfSBlbHNlIHsKCWJpdCA9ICh0ID4+IChtIC0gMSkpICYgMTsKICAgICAgfQogICAgICBpZHggPSAoaWR4ICsgYml0KSAqIHNhbXBsZVNpemVbai0xXTsKICAgIH0KICAgIGlmIChzYW1wbGVTaXplWzBdID09IDEpIHsKICAgICAgYml0ID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGJpdCA9ICh0ID4+IChtIC0gMSkpICYgMTsKICAgIH0KICAgIGlkeE9mZnNldFtpXSA9IChpZHggKyBiaXQpICogbjsKICB9CgogIC8vLS0tLS0gQml0c1BlclNhbXBsZQogIGlmICghZGljdC0+bG9va3VwKCJCaXRzUGVyU2FtcGxlIiwgJm9iajEpLT5pc0ludCgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbiBoYXMgbWlzc2luZyBvciBpbnZhbGlkIEJpdHNQZXJTYW1wbGUiKTsKICAgIGdvdG8gZXJyMjsKICB9CiAgc2FtcGxlQml0cyA9IG9iajEuZ2V0SW50KCk7CiAgc2FtcGxlTXVsID0gMS4wIC8gKHBvdygyLjAsIChkb3VibGUpc2FtcGxlQml0cykgLSAxKTsKICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBFbmNvZGUKICBpZiAoZGljdC0+bG9va3VwKCJFbmNvZGUiLCAmb2JqMSktPmlzQXJyYXkoKSAmJgogICAgICBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgPT0gMiptKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgIG9iajEuYXJyYXlHZXQoMippLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGVuY29kZSBhcnJheSIpOwoJZ290byBlcnIzOwogICAgICB9CiAgICAgIGVuY29kZVtpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgICBvYmoxLmFycmF5R2V0KDIqaSsxLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGVuY29kZSBhcnJheSIpOwoJZ290byBlcnIzOwogICAgICB9CiAgICAgIGVuY29kZVtpXVsxXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgIGVuY29kZVtpXVswXSA9IDA7CiAgICAgIGVuY29kZVtpXVsxXSA9IHNhbXBsZVNpemVbaV0gLSAxOwogICAgfQogIH0KICBvYmoxLmZyZWUoKTsKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpbnB1dE11bFtpXSA9IChlbmNvZGVbaV1bMV0gLSBlbmNvZGVbaV1bMF0pIC8KICAgICAgICAgICAgICAgICAgKGRvbWFpbltpXVsxXSAtIGRvbWFpbltpXVswXSk7CiAgfQoKICAvLy0tLS0tIERlY29kZQogIGlmIChkaWN0LT5sb29rdXAoIkRlY29kZSIsICZvYmoxKS0+aXNBcnJheSgpICYmCiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSA9PSAyKm4pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb2JqMS5hcnJheUdldCgyKmksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZGVjb2RlIGFycmF5Iik7Cglnb3RvIGVycjM7CiAgICAgIH0KICAgICAgZGVjb2RlW2ldWzBdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICAgIG9iajEuYXJyYXlHZXQoMippKzEsICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZGVjb2RlIGFycmF5Iik7Cglnb3RvIGVycjM7CiAgICAgIH0KICAgICAgZGVjb2RlW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgZGVjb2RlW2ldWzBdID0gcmFuZ2VbaV1bMF07CiAgICAgIGRlY29kZVtpXVsxXSA9IHJhbmdlW2ldWzFdOwogICAgfQogIH0KICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBzYW1wbGVzCiAgblNhbXBsZXMgPSBuOwogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpCiAgICBuU2FtcGxlcyAqPSBzYW1wbGVTaXplW2ldOwogIHNhbXBsZXMgPSAoZG91YmxlICopZ21hbGxvY24oblNhbXBsZXMsIHNpemVvZihkb3VibGUpKTsKICBidWYgPSAwOwogIGJpdHMgPSAwOwogIGJpdE1hc2sgPSAoMSA8PCBzYW1wbGVCaXRzKSAtIDE7CiAgc3RyLT5yZXNldCgpOwogIGZvciAoaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICBpZiAoc2FtcGxlQml0cyA9PSA4KSB7CiAgICAgIHMgPSBzdHItPmdldENoYXIoKTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlQml0cyA9PSAxNikgewogICAgICBzID0gc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgfSBlbHNlIGlmIChzYW1wbGVCaXRzID09IDMyKSB7CiAgICAgIHMgPSBzdHItPmdldENoYXIoKTsKICAgICAgcyA9IChzIDw8IDgpICsgc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgICBzID0gKHMgPDwgOCkgKyBzdHItPmdldENoYXIoKTsKICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlIChiaXRzIDwgc2FtcGxlQml0cykgewoJYnVmID0gKGJ1ZiA8PCA4KSB8IChzdHItPmdldENoYXIoKSAmIDB4ZmYpOwoJYml0cyArPSA4OwogICAgICB9CiAgICAgIHMgPSAoYnVmID4+IChiaXRzIC0gc2FtcGxlQml0cykpICYgYml0TWFzazsKICAgICAgYml0cyAtPSBzYW1wbGVCaXRzOwogICAgfQogICAgc2FtcGxlc1tpXSA9IChkb3VibGUpcyAqIHNhbXBsZU11bDsKICB9CiAgc3RyLT5jbG9zZSgpOwoKICAvLyBzZXQgdXAgdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaW5baV0gPSBkb21haW5baV1bMF07CiAgICBjYWNoZUluW2ldID0gaW5baV0gLSAxOwogIH0KICB0cmFuc2Zvcm0oaW4sIGNhY2hlT3V0KTsKCiAgb2sgPSBnVHJ1ZTsKICByZXR1cm47CgogZXJyMzoKICBvYmoyLmZyZWUoKTsKIGVycjI6CiAgb2JqMS5mcmVlKCk7CiBlcnIxOgogIHJldHVybjsKfQoKU2FtcGxlZEZ1bmN0aW9uOjp+U2FtcGxlZEZ1bmN0aW9uKCkgewogIGlmIChpZHhPZmZzZXQpIHsKICAgIGdmcmVlKGlkeE9mZnNldCk7CiAgfQogIGlmIChzYW1wbGVzKSB7CiAgICBnZnJlZShzYW1wbGVzKTsKICB9CiAgaWYgKHNCdWYpIHsKICAgIGdmcmVlKHNCdWYpOwogIH0KfQoKU2FtcGxlZEZ1bmN0aW9uOjpTYW1wbGVkRnVuY3Rpb24oU2FtcGxlZEZ1bmN0aW9uICpmdW5jKSB7CiAgbWVtY3B5KHRoaXMsIGZ1bmMsIHNpemVvZihTYW1wbGVkRnVuY3Rpb24pKTsKICBpZHhPZmZzZXQgPSAoaW50ICopZ21hbGxvY24oMSA8PCBtLCBzaXplb2YoaW50KSk7CiAgbWVtY3B5KGlkeE9mZnNldCwgZnVuYy0+aWR4T2Zmc2V0LCAoMSA8PCBtKSAqIChpbnQpc2l6ZW9mKGludCkpOwogIHNhbXBsZXMgPSAoZG91YmxlICopZ21hbGxvY24oblNhbXBsZXMsIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoc2FtcGxlcywgZnVuYy0+c2FtcGxlcywgblNhbXBsZXMgKiBzaXplb2YoZG91YmxlKSk7CiAgc0J1ZiA9IChkb3VibGUgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihkb3VibGUpKTsKfQoKdm9pZCBTYW1wbGVkRnVuY3Rpb246OnRyYW5zZm9ybShkb3VibGUgKmluLCBkb3VibGUgKm91dCkgewogIGRvdWJsZSB4OwogIGludCBlW2Z1bmNNYXhJbnB1dHNdOwogIGRvdWJsZSBlZnJhYzBbZnVuY01heElucHV0c107CiAgZG91YmxlIGVmcmFjMVtmdW5jTWF4SW5wdXRzXTsKICBpbnQgaSwgaiwgaywgaWR4MCwgdDsKCiAgLy8gY2hlY2sgdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaWYgKGluW2ldICE9IGNhY2hlSW5baV0pIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChpID09IG0pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb3V0W2ldID0gY2FjaGVPdXRbaV07CiAgICB9CiAgICByZXR1cm47CiAgfQoKICAvLyBtYXAgaW5wdXQgdmFsdWVzIGludG8gc2FtcGxlIGFycmF5CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgeCA9IChpbltpXSAtIGRvbWFpbltpXVswXSkgKiBpbnB1dE11bFtpXSArIGVuY29kZVtpXVswXTsKICAgIGlmICh4IDwgMCB8fCB4ICE9IHgpIHsgIC8vIHghPXggaXMgYSBtb3JlIHBvcnRhYmxlIHZlcnNpb24gb2YgaXNuYW4oeCkKICAgICAgeCA9IDA7CiAgICB9IGVsc2UgaWYgKHggPiBzYW1wbGVTaXplW2ldIC0gMSkgewogICAgICB4ID0gc2FtcGxlU2l6ZVtpXSAtIDE7CiAgICB9CiAgICBlW2ldID0gKGludCl4OwogICAgaWYgKGVbaV0gPT0gc2FtcGxlU2l6ZVtpXSAtIDEgJiYgc2FtcGxlU2l6ZVtpXSA+IDEpIHsKICAgICAgLy8gdGhpcyBoYXBwZW5zIGlmIGluW2ldID0gZG9tYWluW2ldWzFdCiAgICAgIGVbaV0gPSBzYW1wbGVTaXplW2ldIC0gMjsKICAgIH0KICAgIGVmcmFjMVtpXSA9IHggLSBlW2ldOwogICAgZWZyYWMwW2ldID0gMSAtIGVmcmFjMVtpXTsKICB9CgogIC8vIGNvbXB1dGUgaW5kZXggZm9yIHRoZSBmaXJzdCBzYW1wbGUgdG8gYmUgdXNlZAogIGlkeDAgPSAwOwogIGZvciAoayA9IG0gLSAxOyBrID49IDE7IC0taykgewogICAgaWR4MCA9IChpZHgwICsgZVtrXSkgKiBzYW1wbGVTaXplW2stMV07CiAgfQogIGlkeDAgPSAoaWR4MCArIGVbMF0pICogbjsKCiAgLy8gZm9yIGVhY2ggb3V0cHV0LCBkbyBtLWxpbmVhciBpbnRlcnBvbGF0aW9uCiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewoKICAgIC8vIHB1bGwgMl5tIHZhbHVlcyBvdXQgb2YgdGhlIHNhbXBsZSBhcnJheQogICAgZm9yIChqID0gMDsgaiA8ICgxPDxtKTsgKytqKSB7CiAgICAgIGludCBpZHggPSBpZHgwICsgaWR4T2Zmc2V0W2pdICsgaTsKICAgICAgaWYgKGxpa2VseShpZHggPj0gMCAmJiBpZHggPCBuU2FtcGxlcykpIHsKICAgICAgICBzQnVmW2pdID0gc2FtcGxlc1tpZHhdOwogICAgICB9IGVsc2UgewogICAgICAgIHNCdWZbal0gPSAwOyAvLyBUT0RPIEludmVzdGlnYXRlIGlmIHRoaXMgaXMgd2hhdCBBZG9iZSBkb2VzCiAgICAgIH0KICAgIH0KCiAgICAvLyBkbyBtIHNldHMgb2YgaW50ZXJwb2xhdGlvbnMKICAgIGZvciAoaiA9IDAsIHQgPSAoMTw8bSk7IGogPCBtOyArK2osIHQgPj49IDEpIHsKICAgICAgZm9yIChrID0gMDsgayA8IHQ7IGsgKz0gMikgewoJc0J1ZltrID4+IDFdID0gZWZyYWMwW2pdICogc0J1ZltrXSArIGVmcmFjMVtqXSAqIHNCdWZbaysxXTsKICAgICAgfQogICAgfQoKICAgIC8vIG1hcCBvdXRwdXQgdmFsdWUgdG8gcmFuZ2UKICAgIG91dFtpXSA9IHNCdWZbMF0gKiAoZGVjb2RlW2ldWzFdIC0gZGVjb2RlW2ldWzBdKSArIGRlY29kZVtpXVswXTsKICAgIGlmIChvdXRbaV0gPCByYW5nZVtpXVswXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVswXTsKICAgIH0gZWxzZSBpZiAob3V0W2ldID4gcmFuZ2VbaV1bMV0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQoKICAvLyBzYXZlIGN1cnJlbnQgcmVzdWx0IGluIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGNhY2hlSW5baV0gPSBpbltpXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgY2FjaGVPdXRbaV0gPSBvdXRbaV07CiAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBFeHBvbmVudGlhbEZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpFeHBvbmVudGlhbEZ1bmN0aW9uOjpFeHBvbmVudGlhbEZ1bmN0aW9uKE9iamVjdCAqZnVuY09iaiwgRGljdCAqZGljdCkgewogIE9iamVjdCBvYmoxLCBvYmoyOwogIGludCBpOwoKICBvayA9IGdGYWxzZTsKCiAgLy8tLS0tLSBpbml0aWFsaXplIHRoZSBnZW5lcmljIHN0dWZmCiAgaWYgKCFpbml0KGRpY3QpKSB7CiAgICBnb3RvIGVycjE7CiAgfQogIGlmIChtICE9IDEpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkV4cG9uZW50aWFsIGZ1bmN0aW9uIHdpdGggbW9yZSB0aGFuIG9uZSBpbnB1dCIpOwogICAgZ290byBlcnIxOwogIH0KCiAgLy8tLS0tLSBDMAogIGlmIChkaWN0LT5sb29rdXAoIkMwIiwgJm9iajEpLT5pc0FycmF5KCkpIHsKICAgIGlmIChoYXNSYW5nZSAmJiBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gbikgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMwIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBuID0gb2JqMS5hcnJheUdldExlbmd0aCgpOwogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvYmoxLmFycmF5R2V0KGksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gQzAgYXJyYXkiKTsKCWdvdG8gZXJyMzsKICAgICAgfQogICAgICBjMFtpXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgfQogIH0gZWxzZSB7CiAgICBpZiAoaGFzUmFuZ2UgJiYgbiAhPSAxKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uJ3MgQzAgYXJyYXkgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIG4gPSAxOwogICAgYzBbMF0gPSAwOwogIH0KICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBDMQogIGlmIChkaWN0LT5sb29rdXAoIkMxIiwgJm9iajEpLT5pc0FycmF5KCkpIHsKICAgIGlmIChvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gbikgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMxIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG9iajEuYXJyYXlHZXQoaSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBDMSBhcnJheSIpOwoJZ290byBlcnIzOwogICAgICB9CiAgICAgIGMxW2ldID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmIChuICE9IDEpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMSBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgYzFbMF0gPSAxOwogIH0KICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBOIChleHBvbmVudCkKICBpZiAoIWRpY3QtPmxvb2t1cCgiTiIsICZvYmoxKS0+aXNOdW0oKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBOIik7CiAgICBnb3RvIGVycjI7CiAgfQogIGUgPSBvYmoxLmdldE51bSgpOwogIG9iajEuZnJlZSgpOwoKICBpc0xpbmVhciA9IGZhYnMoZS0xLikgPCAxZS0xMDsKICBvayA9IGdUcnVlOwogIHJldHVybjsKCiBlcnIzOgogIG9iajIuZnJlZSgpOwogZXJyMjoKICBvYmoxLmZyZWUoKTsKIGVycjE6CiAgcmV0dXJuOwp9CgpFeHBvbmVudGlhbEZ1bmN0aW9uOjp+RXhwb25lbnRpYWxGdW5jdGlvbigpIHsKfQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6RXhwb25lbnRpYWxGdW5jdGlvbihFeHBvbmVudGlhbEZ1bmN0aW9uICpmdW5jKSB7CiAgbWVtY3B5KHRoaXMsIGZ1bmMsIHNpemVvZihFeHBvbmVudGlhbEZ1bmN0aW9uKSk7Cn0KCnZvaWQgRXhwb25lbnRpYWxGdW5jdGlvbjo6dHJhbnNmb3JtKGRvdWJsZSAqaW4sIGRvdWJsZSAqb3V0KSB7CiAgZG91YmxlIHg7CiAgaW50IGk7CgogIGlmIChpblswXSA8IGRvbWFpblswXVswXSkgewogICAgeCA9IGRvbWFpblswXVswXTsKICB9IGVsc2UgaWYgKGluWzBdID4gZG9tYWluWzBdWzFdKSB7CiAgICB4ID0gZG9tYWluWzBdWzFdOwogIH0gZWxzZSB7CiAgICB4ID0gaW5bMF07CiAgfQogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIG91dFtpXSA9IGMwW2ldICsgKGlzTGluZWFyID8geCA6IHBvdyh4LCBlKSkgKiAoYzFbaV0gLSBjMFtpXSk7CiAgICBpZiAoaGFzUmFuZ2UpIHsKICAgICAgaWYgKG91dFtpXSA8IHJhbmdlW2ldWzBdKSB7CglvdXRbaV0gPSByYW5nZVtpXVswXTsKICAgICAgfSBlbHNlIGlmIChvdXRbaV0gPiByYW5nZVtpXVsxXSkgewoJb3V0W2ldID0gcmFuZ2VbaV1bMV07CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTdGl0Y2hpbmdGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU3RpdGNoaW5nRnVuY3Rpb246OlN0aXRjaGluZ0Z1bmN0aW9uKE9iamVjdCAqZnVuY09iaiwgRGljdCAqZGljdCwgc3RkOjpzZXQ8aW50PiAqdXNlZFBhcmVudHMpIHsKICBPYmplY3Qgb2JqMSwgb2JqMjsKICBpbnQgaTsKCiAgb2sgPSBnRmFsc2U7CiAgZnVuY3MgPSBOVUxMOwogIGJvdW5kcyA9IE5VTEw7CiAgZW5jb2RlID0gTlVMTDsKICBzY2FsZSA9IE5VTEw7CgogIC8vLS0tLS0gaW5pdGlhbGl6ZSB0aGUgZ2VuZXJpYyBzdHVmZgogIGlmICghaW5pdChkaWN0KSkgewogICAgZ290byBlcnIxOwogIH0KICBpZiAobSAhPSAxKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGl0Y2hpbmcgZnVuY3Rpb24gd2l0aCBtb3JlIHRoYW4gb25lIGlucHV0Iik7CiAgICBnb3RvIGVycjE7CiAgfQoKICAvLy0tLS0tIEZ1bmN0aW9ucwogIGlmICghZGljdC0+bG9va3VwKCJGdW5jdGlvbnMiLCAmb2JqMSktPmlzQXJyYXkoKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiTWlzc2luZyAnRnVuY3Rpb25zJyBlbnRyeSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgIGdvdG8gZXJyMTsKICB9CiAgayA9IG9iajEuYXJyYXlHZXRMZW5ndGgoKTsKICBmdW5jcyA9IChGdW5jdGlvbiAqKilnbWFsbG9jbihrLCBzaXplb2YoRnVuY3Rpb24gKikpOwogIGJvdW5kcyA9IChkb3VibGUgKilnbWFsbG9jbihrICsgMSwgc2l6ZW9mKGRvdWJsZSkpOwogIGVuY29kZSA9IChkb3VibGUgKilnbWFsbG9jbigyICogaywgc2l6ZW9mKGRvdWJsZSkpOwogIHNjYWxlID0gKGRvdWJsZSAqKWdtYWxsb2NuKGssIHNpemVvZihkb3VibGUpKTsKICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBmdW5jc1tpXSA9IE5VTEw7CiAgfQogIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgIHN0ZDo6c2V0PGludD4gdXNlZFBhcmVudHNBdXggPSAqdXNlZFBhcmVudHM7CiAgICBvYmoxLmFycmF5R2V0TkYoaSwgJm9iajIpOwogICAgaWYgKG9iajIuaXNSZWYoKSkgewogICAgICBjb25zdCBSZWYgcmVmID0gb2JqMi5nZXRSZWYoKTsKICAgICAgaWYgKHVzZWRQYXJlbnRzQXV4LmZpbmQocmVmLm51bSkgPT0gdXNlZFBhcmVudHNBdXguZW5kKCkpIHsKICAgICAgICB1c2VkUGFyZW50c0F1eC5pbnNlcnQocmVmLm51bSk7CiAgICAgICAgb2JqMi5mcmVlKCk7CiAgICAgICAgb2JqMS5hcnJheUdldChpLCAmb2JqMik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ290byBlcnIyOwogICAgICB9CiAgICB9CiAgICBpZiAoIShmdW5jc1tpXSA9IEZ1bmN0aW9uOjpwYXJzZSgmb2JqMiwgJnVzZWRQYXJlbnRzQXV4KSkpIHsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgaWYgKGZ1bmNzW2ldLT5nZXRJbnB1dFNpemUoKSAhPSAxIHx8CgkoaSA+IDAgJiYgZnVuY3NbaV0tPmdldE91dHB1dFNpemUoKSAhPSBmdW5jc1swXS0+Z2V0T3V0cHV0U2l6ZSgpKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsCgkgICAgIkluY29tcGF0aWJsZSBzdWJmdW5jdGlvbnMgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIG9iajIuZnJlZSgpOwogIH0KICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBCb3VuZHMKICBpZiAoIWRpY3QtPmxvb2t1cCgiQm91bmRzIiwgJm9iajEpLT5pc0FycmF5KCkgfHwKICAgICAgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IGsgLSAxKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJNaXNzaW5nIG9yIGludmFsaWQgJ0JvdW5kcycgZW50cnkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICBnb3RvIGVycjE7CiAgfQogIGJvdW5kc1swXSA9IGRvbWFpblswXVswXTsKICBmb3IgKGkgPSAxOyBpIDwgazsgKytpKSB7CiAgICBpZiAoIW9iajEuYXJyYXlHZXQoaSAtIDEsICZvYmoyKS0+aXNOdW0oKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbnZhbGlkIHR5cGUgaW4gJ0JvdW5kcycgYXJyYXkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIGJvdW5kc1tpXSA9IG9iajIuZ2V0TnVtKCk7CiAgICBvYmoyLmZyZWUoKTsKICB9CiAgYm91bmRzW2tdID0gZG9tYWluWzBdWzFdOwogIG9iajEuZnJlZSgpOwoKICAvLy0tLS0tIEVuY29kZQogIGlmICghZGljdC0+bG9va3VwKCJFbmNvZGUiLCAmb2JqMSktPmlzQXJyYXkoKSB8fAogICAgICBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gMiAqIGspIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIk1pc3Npbmcgb3IgaW52YWxpZCAnRW5jb2RlJyBlbnRyeSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgIGdvdG8gZXJyMTsKICB9CiAgZm9yIChpID0gMDsgaSA8IDIgKiBrOyArK2kpIHsKICAgIGlmICghb2JqMS5hcnJheUdldChpLCAmb2JqMiktPmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSW52YWxpZCB0eXBlIGluICdFbmNvZGUnIGFycmF5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBlbmNvZGVbaV0gPSBvYmoyLmdldE51bSgpOwogICAgb2JqMi5mcmVlKCk7CiAgfQogIG9iajEuZnJlZSgpOwoKICAvLy0tLS0tIHByZS1jb21wdXRlIHRoZSBzY2FsZSBmYWN0b3JzCiAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgaWYgKGJvdW5kc1tpXSA9PSBib3VuZHNbaSsxXSkgewogICAgICAvLyBhdm9pZCBhIGRpdmlkZS1ieS16ZXJvIC0tIGluIHRoaXMgc2l0dWF0aW9uLCBmdW5jdGlvbiBpIHdpbGwKICAgICAgLy8gbmV2ZXIgYmUgdXNlZCBhbnl3YXkKICAgICAgc2NhbGVbaV0gPSAwOwogICAgfSBlbHNlIHsKICAgICAgc2NhbGVbaV0gPSAoZW5jb2RlWzIqaSsxXSAtIGVuY29kZVsyKmldKSAvIChib3VuZHNbaSsxXSAtIGJvdW5kc1tpXSk7CiAgICB9CiAgfQoKICBuID0gZnVuY3NbMF0tPmdldE91dHB1dFNpemUoKTsKICBvayA9IGdUcnVlOwogIHJldHVybjsKCiBlcnIyOgogIG9iajIuZnJlZSgpOwogZXJyMToKICBvYmoxLmZyZWUoKTsKfQoKU3RpdGNoaW5nRnVuY3Rpb246OlN0aXRjaGluZ0Z1bmN0aW9uKFN0aXRjaGluZ0Z1bmN0aW9uICpmdW5jKSB7CiAgaW50IGk7CgogIG1lbWNweSh0aGlzLCBmdW5jLCBzaXplb2YoU3RpdGNoaW5nRnVuY3Rpb24pKTsKICBmdW5jcyA9IChGdW5jdGlvbiAqKilnbWFsbG9jbihrLCBzaXplb2YoRnVuY3Rpb24gKikpOwogIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgIGZ1bmNzW2ldID0gZnVuYy0+ZnVuY3NbaV0tPmNvcHkoKTsKICB9CiAgYm91bmRzID0gKGRvdWJsZSAqKWdtYWxsb2NuKGsgKyAxLCBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGJvdW5kcywgZnVuYy0+Ym91bmRzLCAoayArIDEpICogc2l6ZW9mKGRvdWJsZSkpOwogIGVuY29kZSA9IChkb3VibGUgKilnbWFsbG9jbigyICogaywgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShlbmNvZGUsIGZ1bmMtPmVuY29kZSwgMiAqIGsgKiBzaXplb2YoZG91YmxlKSk7CiAgc2NhbGUgPSAoZG91YmxlICopZ21hbGxvY24oaywgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShzY2FsZSwgZnVuYy0+c2NhbGUsIGsgKiBzaXplb2YoZG91YmxlKSk7CiAgb2sgPSBnVHJ1ZTsKfQoKU3RpdGNoaW5nRnVuY3Rpb246On5TdGl0Y2hpbmdGdW5jdGlvbigpIHsKICBpbnQgaTsKCiAgaWYgKGZ1bmNzKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICAgIGlmIChmdW5jc1tpXSkgewoJZGVsZXRlIGZ1bmNzW2ldOwogICAgICB9CiAgICB9CiAgfQogIGdmcmVlKGZ1bmNzKTsKICBnZnJlZShib3VuZHMpOwogIGdmcmVlKGVuY29kZSk7CiAgZ2ZyZWUoc2NhbGUpOwp9Cgp2b2lkIFN0aXRjaGluZ0Z1bmN0aW9uOjp0cmFuc2Zvcm0oZG91YmxlICppbiwgZG91YmxlICpvdXQpIHsKICBkb3VibGUgeDsKICBpbnQgaTsKCiAgaWYgKGluWzBdIDwgZG9tYWluWzBdWzBdKSB7CiAgICB4ID0gZG9tYWluWzBdWzBdOwogIH0gZWxzZSBpZiAoaW5bMF0gPiBkb21haW5bMF1bMV0pIHsKICAgIHggPSBkb21haW5bMF1bMV07CiAgfSBlbHNlIHsKICAgIHggPSBpblswXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IGsgLSAxOyArK2kpIHsKICAgIGlmICh4IDwgYm91bmRzW2krMV0pIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHggPSBlbmNvZGVbMippXSArICh4IC0gYm91bmRzW2ldKSAqIHNjYWxlW2ldOwogIGZ1bmNzW2ldLT50cmFuc2Zvcm0oJngsIG91dCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFBvc3RTY3JpcHRGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZW51bSBQU09wIHsKICBwc09wQWJzLAogIHBzT3BBZGQsCiAgcHNPcEFuZCwKICBwc09wQXRhbiwKICBwc09wQml0c2hpZnQsCiAgcHNPcENlaWxpbmcsCiAgcHNPcENvcHksCiAgcHNPcENvcywKICBwc09wQ3ZpLAogIHBzT3BDdnIsCiAgcHNPcERpdiwKICBwc09wRHVwLAogIHBzT3BFcSwKICBwc09wRXhjaCwKICBwc09wRXhwLAogIHBzT3BGYWxzZSwKICBwc09wRmxvb3IsCiAgcHNPcEdlLAogIHBzT3BHdCwKICBwc09wSWRpdiwKICBwc09wSW5kZXgsCiAgcHNPcExlLAogIHBzT3BMbiwKICBwc09wTG9nLAogIHBzT3BMdCwKICBwc09wTW9kLAogIHBzT3BNdWwsCiAgcHNPcE5lLAogIHBzT3BOZWcsCiAgcHNPcE5vdCwKICBwc09wT3IsCiAgcHNPcFBvcCwKICBwc09wUm9sbCwKICBwc09wUm91bmQsCiAgcHNPcFNpbiwKICBwc09wU3FydCwKICBwc09wU3ViLAogIHBzT3BUcnVlLAogIHBzT3BUcnVuY2F0ZSwKICBwc09wWG9yLAogIHBzT3BJZiwKICBwc09wSWZlbHNlLAogIHBzT3BSZXR1cm4KfTsKCi8vIE5vdGU6ICdpZicgYW5kICdpZmVsc2UnIGFyZSBwYXJzZWQgc2VwYXJhdGVseS4KLy8gVGhlIHJlc3QgYXJlIGxpc3RlZCBoZXJlIGluIGFscGhhYmV0aWNhbCBvcmRlci4KLy8gVGhlIGluZGV4IGluIHRoaXMgdGFibGUgaXMgZXF1aXZhbGVudCB0byB0aGUgZW50cnkgaW4gUFNPcC4Kc3RhdGljIGNvbnN0IGNoYXIgKnBzT3BOYW1lc1tdID0gewogICJhYnMiLAogICJhZGQiLAogICJhbmQiLAogICJhdGFuIiwKICAiYml0c2hpZnQiLAogICJjZWlsaW5nIiwKICAiY29weSIsCiAgImNvcyIsCiAgImN2aSIsCiAgImN2ciIsCiAgImRpdiIsCiAgImR1cCIsCiAgImVxIiwKICAiZXhjaCIsCiAgImV4cCIsCiAgImZhbHNlIiwKICAiZmxvb3IiLAogICJnZSIsCiAgImd0IiwKICAiaWRpdiIsCiAgImluZGV4IiwKICAibGUiLAogICJsbiIsCiAgImxvZyIsCiAgImx0IiwKICAibW9kIiwKICAibXVsIiwKICAibmUiLAogICJuZWciLAogICJub3QiLAogICJvciIsCiAgInBvcCIsCiAgInJvbGwiLAogICJyb3VuZCIsCiAgInNpbiIsCiAgInNxcnQiLAogICJzdWIiLAogICJ0cnVlIiwKICAidHJ1bmNhdGUiLAogICJ4b3IiCn07CgojZGVmaW5lIG5QU09wcyAoc2l6ZW9mKHBzT3BOYW1lcykgLyBzaXplb2YoY2hhciAqKSkKCmVudW0gUFNPYmplY3RUeXBlIHsKICBwc0Jvb2wsCiAgcHNJbnQsCiAgcHNSZWFsLAogIHBzT3BlcmF0b3IsCiAgcHNCbG9jawp9OwoKLy8gSW4gdGhlIGNvZGUgYXJyYXksICdpZicvJ2lmZWxzZScgb3BlcmF0b3JzIHRha2UgdXAgdGhyZWUgc2xvdHMKLy8gcGx1cyBzcGFjZSBmb3IgdGhlIGNvZGUgaW4gdGhlIHN1YmNsYXVzZShzKS4KLy8KLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgICAgIHwgcHNPcGVyYXRvcjogcHNPcElmIC8gcHNPcElmZWxzZSB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IHBzQmxvY2s6IHB0cj08QT4gICAgICAgICAgICAgICAgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBwc0Jsb2NrOiBwdHI9PEI+ICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgICAgIHwgaWYgY2xhdXNlICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICB8IHBzT3BlcmF0b3I6IHBzT3BSZXR1cm4gICAgICAgICAgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICA8QT4gfCBlbHNlIGNsYXVzZSAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgcHNPcGVyYXRvcjogcHNPcFJldHVybiAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgIDxCPiB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLwovLyBGb3IgJ2lmJywgcG9pbnRlciA8QT4gaXMgcHJlc2VudCBpbiB0aGUgY29kZSBzdHJlYW0gYnV0IHVudXNlZC4KCnN0cnVjdCBQU09iamVjdCB7CiAgUFNPYmplY3RUeXBlIHR5cGU7CiAgdW5pb24gewogICAgR0Jvb2wgYm9vbG47CQkvLyBib29sZWFuIChzdGFjayBvbmx5KQogICAgaW50IGludGc7CQkJLy8gaW50ZWdlciAoc3RhY2sgYW5kIGNvZGUpCiAgICBkb3VibGUgcmVhbDsJCS8vIHJlYWwgKHN0YWNrIGFuZCBjb2RlKQogICAgUFNPcCBvcDsJCQkvLyBvcGVyYXRvciAoY29kZSBvbmx5KQogICAgaW50IGJsazsJCQkvLyBpZi9pZmVsc2UgYmxvY2sgcG9pbnRlciAoY29kZSBvbmx5KQogIH07Cn07CgojZGVmaW5lIHBzU3RhY2tTaXplIDEwMAoKY2xhc3MgUFNTdGFjayB7CnB1YmxpYzoKCiAgUFNTdGFjaygpIHtzcCA9IHBzU3RhY2tTaXplOyB9CiAgdm9pZCBjbGVhcigpIHsgc3AgPSBwc1N0YWNrU2l6ZTsgfQogIHZvaWQgcHVzaEJvb2woR0Jvb2wgYm9vbG4pCiAgewogICAgaWYgKGNoZWNrT3ZlcmZsb3coKSkgewogICAgICBzdGFja1stLXNwXS50eXBlID0gcHNCb29sOwogICAgICBzdGFja1tzcF0uYm9vbG4gPSBib29sbjsKICAgIH0KICB9CiAgdm9pZCBwdXNoSW50KGludCBpbnRnKQogIHsKICAgIGlmIChjaGVja092ZXJmbG93KCkpIHsKICAgICAgc3RhY2tbLS1zcF0udHlwZSA9IHBzSW50OwogICAgICBzdGFja1tzcF0uaW50ZyA9IGludGc7CiAgICB9CiAgfQogIHZvaWQgcHVzaFJlYWwoZG91YmxlIHJlYWwpCiAgewogICAgaWYgKGNoZWNrT3ZlcmZsb3coKSkgewogICAgICBzdGFja1stLXNwXS50eXBlID0gcHNSZWFsOwogICAgICBzdGFja1tzcF0ucmVhbCA9IHJlYWw7CiAgICB9CiAgfQogIEdCb29sIHBvcEJvb2woKQogIHsKICAgIGlmIChjaGVja1VuZGVyZmxvdygpICYmIGNoZWNrVHlwZShwc0Jvb2wsIHBzQm9vbCkpIHsKICAgICAgcmV0dXJuIHN0YWNrW3NwKytdLmJvb2xuOwogICAgfQogICAgcmV0dXJuIGdGYWxzZTsKICB9CiAgaW50IHBvcEludCgpCiAgewogICAgaWYgKGNoZWNrVW5kZXJmbG93KCkgJiYgY2hlY2tUeXBlKHBzSW50LCBwc0ludCkpIHsKICAgICAgcmV0dXJuIHN0YWNrW3NwKytdLmludGc7CiAgICB9CiAgICByZXR1cm4gMDsKICB9CiAgZG91YmxlIHBvcE51bSgpCiAgewogICAgZG91YmxlIHJldDsKCiAgICBpZiAoY2hlY2tVbmRlcmZsb3coKSAmJiBjaGVja1R5cGUocHNJbnQsIHBzUmVhbCkpIHsKICAgICAgcmV0ID0gKHN0YWNrW3NwXS50eXBlID09IHBzSW50KSA/IChkb3VibGUpc3RhY2tbc3BdLmludGcgOiBzdGFja1tzcF0ucmVhbDsKICAgICAgKytzcDsKICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIHJldHVybiAwOwogIH0KICBHQm9vbCBlbXB0eSgpIHsgcmV0dXJuIHNwID09IHBzU3RhY2tTaXplOyB9CiAgR0Jvb2wgdG9wSXNJbnQoKSB7IHJldHVybiBzcCA8IHBzU3RhY2tTaXplICYmIHN0YWNrW3NwXS50eXBlID09IHBzSW50OyB9CiAgR0Jvb2wgdG9wVHdvQXJlSW50cygpCiAgICB7IHJldHVybiBzcCA8IHBzU3RhY2tTaXplIC0gMSAmJgoJICAgICBzdGFja1tzcF0udHlwZSA9PSBwc0ludCAmJgogICAgICAgICAgICAgc3RhY2tbc3ArMV0udHlwZSA9PSBwc0ludDsgfQogIEdCb29sIHRvcElzUmVhbCgpIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgJiYgc3RhY2tbc3BdLnR5cGUgPT0gcHNSZWFsOyB9CiAgR0Jvb2wgdG9wVHdvQXJlTnVtcygpCiAgICB7IHJldHVybiBzcCA8IHBzU3RhY2tTaXplIC0gMSAmJgoJICAgICAoc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQgfHwgc3RhY2tbc3BdLnR5cGUgPT0gcHNSZWFsKSAmJgoJICAgICAoc3RhY2tbc3ArMV0udHlwZSA9PSBwc0ludCB8fCBzdGFja1tzcCsxXS50eXBlID09IHBzUmVhbCk7IH0KICB2b2lkIGNvcHkoaW50IG4pOwogIHZvaWQgcm9sbChpbnQgbiwgaW50IGopOwogIHZvaWQgaW5kZXgoaW50IGkpCiAgewogICAgaWYgKCFjaGVja092ZXJmbG93KCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLS1zcDsKICAgIGlmIChzcCArIGkgKyAxID49IHBzU3RhY2tTaXplKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIHVuZGVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN0YWNrW3NwXSA9IHN0YWNrW3NwICsgMSArIGldOwogIH0KICB2b2lkIHBvcCgpCiAgewogICAgaWYgKCFjaGVja1VuZGVyZmxvdygpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgICsrc3A7CiAgfQoKcHJpdmF0ZToKCiAgR0Jvb2wgY2hlY2tPdmVyZmxvdyhpbnQgbiA9IDEpCiAgewogICAgaWYgKHNwIC0gbiA8IDApIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgb3ZlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcmV0dXJuIGdUcnVlOwogIH0KICBHQm9vbCBjaGVja1VuZGVyZmxvdygpCiAgewogICAgaWYgKHNwID09IHBzU3RhY2tTaXplKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIHVuZGVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICAgIHJldHVybiBnRmFsc2U7CiAgICB9CiAgICByZXR1cm4gZ1RydWU7CiAgfQogIEdCb29sIGNoZWNrVHlwZShQU09iamVjdFR5cGUgdDEsIFBTT2JqZWN0VHlwZSB0MikKICB7CiAgICBpZiAoc3RhY2tbc3BdLnR5cGUgIT0gdDEgJiYgc3RhY2tbc3BdLnR5cGUgIT0gdDIpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSBtaXNtYXRjaCBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICAgIHJldHVybiBnRmFsc2U7CiAgICB9CiAgICByZXR1cm4gZ1RydWU7CiAgfQogIFBTT2JqZWN0IHN0YWNrW3BzU3RhY2tTaXplXTsKICBpbnQgc3A7Cn07CgoKdm9pZCBQU1N0YWNrOjpjb3B5KGludCBuKSB7CiAgaW50IGk7CgogIGlmIChzcCArIG4gPiBwc1N0YWNrU2l6ZSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgdW5kZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgIHJldHVybjsKICB9CiAgaWYgKCFjaGVja092ZXJmbG93KG4pKSB7CiAgICByZXR1cm47CiAgfQogIGZvciAoaSA9IHNwICsgbiAtIDE7IGkgPj0gc3A7IC0taSkgewogICAgc3RhY2tbaSAtIG5dID0gc3RhY2tbaV07CiAgfQogIHNwIC09IG47Cn0KCnZvaWQgUFNTdGFjazo6cm9sbChpbnQgbiwgaW50IGopIHsKICBQU09iamVjdCBvYmo7CiAgaW50IGksIGs7CgogIGlmICh1bmxpa2VseShuID09IDApKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChqID49IDApIHsKICAgIGogJT0gbjsKICB9IGVsc2UgewogICAgaiA9IC1qICUgbjsKICAgIGlmIChqICE9IDApIHsKICAgICAgaiA9IG4gLSBqOwogICAgfQogIH0KICBpZiAobiA8PSAwIHx8IGogPT0gMCB8fCBuID4gcHNTdGFja1NpemUgfHwgc3AgKyBuID4gcHNTdGFja1NpemUpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKGogPD0gbiAvIDIpIHsKICAgIGZvciAoaSA9IDA7IGkgPCBqOyArK2kpIHsKICAgICAgb2JqID0gc3RhY2tbc3BdOwogICAgICBmb3IgKGsgPSBzcDsgayA8IHNwICsgbiAtIDE7ICsraykgewogICAgICAgIHN0YWNrW2tdID0gc3RhY2tbaysxXTsKICAgICAgfQogICAgICBzdGFja1tzcCArIG4gLSAxXSA9IG9iajsKICAgIH0KICB9IGVsc2UgewogICAgaiA9IG4gLSBqOwogICAgZm9yIChpID0gMDsgaSA8IGo7ICsraSkgewogICAgICBvYmogPSBzdGFja1tzcCArIG4gLSAxXTsKICAgICAgZm9yIChrID0gc3AgKyBuIC0gMTsgayA+IHNwOyAtLWspIHsKICAgICAgICBzdGFja1trXSA9IHN0YWNrW2stMV07CiAgICAgIH0KICAgICAgc3RhY2tbc3BdID0gb2JqOwogICAgfQogIH0KfQoKUG9zdFNjcmlwdEZ1bmN0aW9uOjpQb3N0U2NyaXB0RnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0KSB7CiAgU3RyZWFtICpzdHI7CiAgaW50IGNvZGVQdHI7CiAgR29vU3RyaW5nICp0b2s7CiAgZG91YmxlIGluW2Z1bmNNYXhJbnB1dHNdOwogIGludCBpOwoKICBjb2RlID0gTlVMTDsKICBjb2RlU3RyaW5nID0gTlVMTDsKICBjb2RlU2l6ZSA9IDA7CiAgb2sgPSBnRmFsc2U7CgogIC8vLS0tLS0gaW5pdGlhbGl6ZSB0aGUgZ2VuZXJpYyBzdHVmZgogIGlmICghaW5pdChkaWN0KSkgewogICAgZ290byBlcnIxOwogIH0KICBpZiAoIWhhc1JhbmdlKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJUeXBlIDQgZnVuY3Rpb24gaXMgbWlzc2luZyByYW5nZSIpOwogICAgZ290byBlcnIxOwogIH0KCiAgLy8tLS0tLSBnZXQgdGhlIHN0cmVhbQogIGlmICghZnVuY09iai0+aXNTdHJlYW0oKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSA0IGZ1bmN0aW9uIGlzbid0IGEgc3RyZWFtIik7CiAgICBnb3RvIGVycjE7CiAgfQogIHN0ciA9IGZ1bmNPYmotPmdldFN0cmVhbSgpOwoKICAvLy0tLS0tIHBhcnNlIHRoZSBmdW5jdGlvbgogIGNvZGVTdHJpbmcgPSBuZXcgR29vU3RyaW5nKCk7CiAgc3RyLT5yZXNldCgpOwogIGlmICghKHRvayA9IGdldFRva2VuKHN0cikpIHx8IHRvay0+Y21wKCJ7IikpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkV4cGVjdGVkICd7JyBhdCBzdGFydCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICBpZiAodG9rKSB7CiAgICAgIGRlbGV0ZSB0b2s7CiAgICB9CiAgICBnb3RvIGVycjE7CiAgfQogIGRlbGV0ZSB0b2s7CiAgY29kZVB0ciA9IDA7CiAgaWYgKCFwYXJzZUNvZGUoc3RyLCAmY29kZVB0cikpIHsKICAgIGdvdG8gZXJyMjsKICB9CiAgc3RyLT5jbG9zZSgpOwoKICAvLy0tLS0tIHNldCB1cCB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpbltpXSA9IGRvbWFpbltpXVswXTsKICAgIGNhY2hlSW5baV0gPSBpbltpXSAtIDE7CiAgfQogIHRyYW5zZm9ybShpbiwgY2FjaGVPdXQpOwoKICBvayA9IGdUcnVlOwogIAogZXJyMjoKICBzdHItPmNsb3NlKCk7CiBlcnIxOgogIHJldHVybjsKfQoKUG9zdFNjcmlwdEZ1bmN0aW9uOjpQb3N0U2NyaXB0RnVuY3Rpb24oUG9zdFNjcmlwdEZ1bmN0aW9uICpmdW5jKSB7CiAgbWVtY3B5KHRoaXMsIGZ1bmMsIHNpemVvZihQb3N0U2NyaXB0RnVuY3Rpb24pKTsKICBjb2RlID0gKFBTT2JqZWN0ICopZ21hbGxvY24oY29kZVNpemUsIHNpemVvZihQU09iamVjdCkpOwogIG1lbWNweShjb2RlLCBmdW5jLT5jb2RlLCBjb2RlU2l6ZSAqIHNpemVvZihQU09iamVjdCkpOwogIGNvZGVTdHJpbmcgPSBmdW5jLT5jb2RlU3RyaW5nLT5jb3B5KCk7Cn0KClBvc3RTY3JpcHRGdW5jdGlvbjo6flBvc3RTY3JpcHRGdW5jdGlvbigpIHsKICBnZnJlZShjb2RlKTsKICBkZWxldGUgY29kZVN0cmluZzsKfQoKdm9pZCBQb3N0U2NyaXB0RnVuY3Rpb246OnRyYW5zZm9ybShkb3VibGUgKmluLCBkb3VibGUgKm91dCkgewogIFBTU3RhY2sgc3RhY2s7CiAgaW50IGk7CgogIC8vIGNoZWNrIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGlmIChpbltpXSAhPSBjYWNoZUluW2ldKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoaSA9PSBtKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG91dFtpXSA9IGNhY2hlT3V0W2ldOwogICAgfQogICAgcmV0dXJuOwogIH0KCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgLy9+IG1heSBuZWVkIHRvIGNoZWNrIGZvciBpbnRlZ2VycyBoZXJlCiAgICBzdGFjay5wdXNoUmVhbChpbltpXSk7CiAgfQogIGV4ZWMoJnN0YWNrLCAwKTsKICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgIG91dFtpXSA9IHN0YWNrLnBvcE51bSgpOwogICAgaWYgKG91dFtpXSA8IHJhbmdlW2ldWzBdKSB7CiAgICAgIG91dFtpXSA9IHJhbmdlW2ldWzBdOwogICAgfSBlbHNlIGlmIChvdXRbaV0gPiByYW5nZVtpXVsxXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVsxXTsKICAgIH0KICB9CiAgc3RhY2suY2xlYXIoKTsKCiAgLy8gaWYgKCFzdGFjay0+ZW1wdHkoKSkgewogIC8vICAgZXJyb3IoZXJyU3ludGF4V2FybmluZywgLTEsCiAgLy8gICAgICAgICAiRXh0cmEgdmFsdWVzIG9uIHN0YWNrIGF0IGVuZCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgLy8gfQoKICAvLyBzYXZlIGN1cnJlbnQgcmVzdWx0IGluIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGNhY2hlSW5baV0gPSBpbltpXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgY2FjaGVPdXRbaV0gPSBvdXRbaV07CiAgfQp9CgpHQm9vbCBQb3N0U2NyaXB0RnVuY3Rpb246OnBhcnNlQ29kZShTdHJlYW0gKnN0ciwgaW50ICpjb2RlUHRyKSB7CiAgR29vU3RyaW5nICp0b2s7CiAgY2hhciAqcDsKICBHQm9vbCBpc1JlYWw7CiAgaW50IG9wUHRyLCBlbHNlUHRyOwogIGludCBhLCBiLCBtaWQsIGNtcDsKCiAgd2hpbGUgKDEpIHsKICAgIGlmICghKHRvayA9IGdldFRva2VuKHN0cikpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlVuZXhwZWN0ZWQgZW5kIG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24gc3RyZWFtIik7CiAgICAgIHJldHVybiBnRmFsc2U7CiAgICB9CiAgICBwID0gdG9rLT5nZXRDU3RyaW5nKCk7CiAgICBpZiAoaXNkaWdpdCgqcCkgfHwgKnAgPT0gJy4nIHx8ICpwID09ICctJykgewogICAgICBpc1JlYWwgPSBnRmFsc2U7CiAgICAgIGZvciAoOyAqcDsgKytwKSB7CglpZiAoKnAgPT0gJy4nKSB7CgkgIGlzUmVhbCA9IGdUcnVlOwoJICBicmVhazsKCX0KICAgICAgfQogICAgICByZXNpemVDb2RlKCpjb2RlUHRyKTsKICAgICAgaWYgKGlzUmVhbCkgewoJY29kZVsqY29kZVB0cl0udHlwZSA9IHBzUmVhbDsKICAgICAgICAgIGNvZGVbKmNvZGVQdHJdLnJlYWwgPSBnYXRvZih0b2stPmdldENTdHJpbmcoKSk7CiAgICAgIH0gZWxzZSB7Cgljb2RlWypjb2RlUHRyXS50eXBlID0gcHNJbnQ7Cgljb2RlWypjb2RlUHRyXS5pbnRnID0gYXRvaSh0b2stPmdldENTdHJpbmcoKSk7CiAgICAgIH0KICAgICAgKysqY29kZVB0cjsKICAgICAgZGVsZXRlIHRvazsKICAgIH0gZWxzZSBpZiAoIXRvay0+Y21wKCJ7IikpIHsKICAgICAgZGVsZXRlIHRvazsKICAgICAgb3BQdHIgPSAqY29kZVB0cjsKICAgICAgKmNvZGVQdHIgKz0gMzsKICAgICAgcmVzaXplQ29kZShvcFB0ciArIDIpOwogICAgICBpZiAoIXBhcnNlQ29kZShzdHIsIGNvZGVQdHIpKSB7CglyZXR1cm4gZ0ZhbHNlOwogICAgICB9CiAgICAgIGlmICghKHRvayA9IGdldFRva2VuKHN0cikpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJVbmV4cGVjdGVkIGVuZCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0cmVhbSIpOwoJcmV0dXJuIGdGYWxzZTsKICAgICAgfQogICAgICBpZiAoIXRvay0+Y21wKCJ7IikpIHsKCWVsc2VQdHIgPSAqY29kZVB0cjsKCWlmICghcGFyc2VDb2RlKHN0ciwgY29kZVB0cikpIHsKCSAgcmV0dXJuIGdGYWxzZTsKCX0KCWRlbGV0ZSB0b2s7CglpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSkgewoJICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJVbmV4cGVjdGVkIGVuZCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0cmVhbSIpOwoJICByZXR1cm4gZ0ZhbHNlOwoJfQogICAgICB9IGVsc2UgewoJZWxzZVB0ciA9IC0xOwogICAgICB9CiAgICAgIGlmICghdG9rLT5jbXAoImlmIikpIHsKCWlmIChlbHNlUHRyID49IDApIHsKCSAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJCSJHb3QgJ2lmJyBvcGVyYXRvciB3aXRoIHR3byBibG9ja3MgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwoJICByZXR1cm4gZ0ZhbHNlOwoJfQoJY29kZVtvcFB0cl0udHlwZSA9IHBzT3BlcmF0b3I7Cgljb2RlW29wUHRyXS5vcCA9IHBzT3BJZjsKCWNvZGVbb3BQdHIrMl0udHlwZSA9IHBzQmxvY2s7Cgljb2RlW29wUHRyKzJdLmJsayA9ICpjb2RlUHRyOwogICAgICB9IGVsc2UgaWYgKCF0b2stPmNtcCgiaWZlbHNlIikpIHsKCWlmIChlbHNlUHRyIDwgMCkgewoJICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsCgkJIkdvdCAnaWZlbHNlJyBvcGVyYXRvciB3aXRoIG9uZSBibG9jayBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CgkgIHJldHVybiBnRmFsc2U7Cgl9Cgljb2RlW29wUHRyXS50eXBlID0gcHNPcGVyYXRvcjsKCWNvZGVbb3BQdHJdLm9wID0gcHNPcElmZWxzZTsKCWNvZGVbb3BQdHIrMV0udHlwZSA9IHBzQmxvY2s7Cgljb2RlW29wUHRyKzFdLmJsayA9IGVsc2VQdHI7Cgljb2RlW29wUHRyKzJdLnR5cGUgPSBwc0Jsb2NrOwoJY29kZVtvcFB0cisyXS5ibGsgPSAqY29kZVB0cjsKICAgICAgfSBlbHNlIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwKCSAgICAgICJFeHBlY3RlZCBpZi9pZmVsc2Ugb3BlcmF0b3IgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwoJZGVsZXRlIHRvazsKCXJldHVybiBnRmFsc2U7CiAgICAgIH0KICAgICAgZGVsZXRlIHRvazsKICAgIH0gZWxzZSBpZiAoIXRvay0+Y21wKCJ9IikpIHsKICAgICAgZGVsZXRlIHRvazsKICAgICAgcmVzaXplQ29kZSgqY29kZVB0cik7CiAgICAgIGNvZGVbKmNvZGVQdHJdLnR5cGUgPSBwc09wZXJhdG9yOwogICAgICBjb2RlWypjb2RlUHRyXS5vcCA9IHBzT3BSZXR1cm47CiAgICAgICsrKmNvZGVQdHI7CiAgICAgIGJyZWFrOwogICAgfSBlbHNlIHsKICAgICAgYSA9IC0xOwogICAgICBiID0gblBTT3BzOwogICAgICBjbXAgPSAwOyAvLyBtYWtlIGdjYyBoYXBweQogICAgICAvLyBpbnZhcmlhbnQ6IHBzT3BOYW1lc1thXSA8IHRvayA8IHBzT3BOYW1lc1tiXQogICAgICB3aGlsZSAoYiAtIGEgPiAxKSB7CgltaWQgPSAoYSArIGIpIC8gMjsKCWNtcCA9IHRvay0+Y21wKHBzT3BOYW1lc1ttaWRdKTsKCWlmIChjbXAgPiAwKSB7CgkgIGEgPSBtaWQ7Cgl9IGVsc2UgaWYgKGNtcCA8IDApIHsKCSAgYiA9IG1pZDsKCX0gZWxzZSB7CgkgIGEgPSBiID0gbWlkOwoJfQogICAgICB9CiAgICAgIGlmIChjbXAgIT0gMCkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJICAgICAgIlVua25vd24gb3BlcmF0b3IgJ3swOnR9JyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIiwKCSAgICAgIHRvayk7CglkZWxldGUgdG9rOwoJcmV0dXJuIGdGYWxzZTsKICAgICAgfQogICAgICBkZWxldGUgdG9rOwogICAgICByZXNpemVDb2RlKCpjb2RlUHRyKTsKICAgICAgY29kZVsqY29kZVB0cl0udHlwZSA9IHBzT3BlcmF0b3I7CiAgICAgIGNvZGVbKmNvZGVQdHJdLm9wID0gKFBTT3ApYTsKICAgICAgKysqY29kZVB0cjsKICAgIH0KICB9CiAgcmV0dXJuIGdUcnVlOwp9CgpHb29TdHJpbmcgKlBvc3RTY3JpcHRGdW5jdGlvbjo6Z2V0VG9rZW4oU3RyZWFtICpzdHIpIHsKICBHb29TdHJpbmcgKnM7CiAgaW50IGM7CiAgR0Jvb2wgY29tbWVudDsKCiAgcyA9IG5ldyBHb29TdHJpbmcoKTsKICBjb21tZW50ID0gZ0ZhbHNlOwogIHdoaWxlICgxKSB7CiAgICBpZiAoKGMgPSBzdHItPmdldENoYXIoKSkgPT0gRU9GKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgY29kZVN0cmluZy0+YXBwZW5kKGMpOwogICAgaWYgKGNvbW1lbnQpIHsKICAgICAgaWYgKGMgPT0gJ1x4MGEnIHx8IGMgPT0gJ1x4MGQnKSB7Cgljb21tZW50ID0gZ0ZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGMgPT0gJyUnKSB7CiAgICAgIGNvbW1lbnQgPSBnVHJ1ZTsKICAgIH0gZWxzZSBpZiAoIWlzc3BhY2UoYykpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChjID09ICd7JyB8fCBjID09ICd9JykgewogICAgcy0+YXBwZW5kKChjaGFyKWMpOwogIH0gZWxzZSBpZiAoaXNkaWdpdChjKSB8fCBjID09ICcuJyB8fCBjID09ICctJykgewogICAgd2hpbGUgKDEpIHsKICAgICAgcy0+YXBwZW5kKChjaGFyKWMpOwogICAgICBjID0gc3RyLT5sb29rQ2hhcigpOwogICAgICBpZiAoYyA9PSBFT0YgfHwgIShpc2RpZ2l0KGMpIHx8IGMgPT0gJy4nIHx8IGMgPT0gJy0nKSkgewoJYnJlYWs7CiAgICAgIH0KICAgICAgc3RyLT5nZXRDaGFyKCk7CiAgICAgIGNvZGVTdHJpbmctPmFwcGVuZChjKTsKICAgIH0KICB9IGVsc2UgewogICAgd2hpbGUgKDEpIHsKICAgICAgcy0+YXBwZW5kKChjaGFyKWMpOwogICAgICBjID0gc3RyLT5sb29rQ2hhcigpOwogICAgICBpZiAoYyA9PSBFT0YgfHwgIWlzYWxudW0oYykpIHsKCWJyZWFrOwogICAgICB9CiAgICAgIHN0ci0+Z2V0Q2hhcigpOwogICAgICBjb2RlU3RyaW5nLT5hcHBlbmQoYyk7CiAgICB9CiAgfQogIHJldHVybiBzOwp9Cgp2b2lkIFBvc3RTY3JpcHRGdW5jdGlvbjo6cmVzaXplQ29kZShpbnQgbmV3U2l6ZSkgewogIGlmIChuZXdTaXplID49IGNvZGVTaXplKSB7CiAgICBjb2RlU2l6ZSArPSA2NDsKICAgIGNvZGUgPSAoUFNPYmplY3QgKilncmVhbGxvY24oY29kZSwgY29kZVNpemUsIHNpemVvZihQU09iamVjdCkpOwogIH0KfQoKdm9pZCBQb3N0U2NyaXB0RnVuY3Rpb246OmV4ZWMoUFNTdGFjayAqc3RhY2ssIGludCBjb2RlUHRyKSB7CiAgaW50IGkxLCBpMjsKICBkb3VibGUgcjEsIHIyLCByZXN1bHQ7CiAgR0Jvb2wgYjEsIGIyOwoKICB3aGlsZSAoMSkgewogICAgc3dpdGNoIChjb2RlW2NvZGVQdHJdLnR5cGUpIHsKICAgIGNhc2UgcHNJbnQ6CiAgICAgIHN0YWNrLT5wdXNoSW50KGNvZGVbY29kZVB0cisrXS5pbnRnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHBzUmVhbDoKICAgICAgc3RhY2stPnB1c2hSZWFsKGNvZGVbY29kZVB0cisrXS5yZWFsKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHBzT3BlcmF0b3I6CiAgICAgIHN3aXRjaCAoY29kZVtjb2RlUHRyKytdLm9wKSB7CiAgICAgIGNhc2UgcHNPcEFiczoKCWlmIChzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaEludChhYnMoc3RhY2stPnBvcEludCgpKSk7Cgl9IGVsc2UgewoJICBzdGFjay0+cHVzaFJlYWwoZmFicyhzdGFjay0+cG9wTnVtKCkpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BBZGQ6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoSW50KGkxICsgaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwocjEgKyByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQW5kOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSAmIGkyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgJiYgYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEF0YW46CglyMiA9IHN0YWNrLT5wb3BOdW0oKTsKCXIxID0gc3RhY2stPnBvcE51bSgpOwoJcmVzdWx0ID0gYXRhbjIocjEsIHIyKSAqIDE4MC4wIC8gTV9QSTsKCWlmIChyZXN1bHQgPCAwKSByZXN1bHQgKz0gMzYwLjA7CglzdGFjay0+cHVzaFJlYWwocmVzdWx0KTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BCaXRzaGlmdDoKCWkyID0gc3RhY2stPnBvcEludCgpOwoJaTEgPSBzdGFjay0+cG9wSW50KCk7CglpZiAoaTIgPiAwKSB7CgkgIHN0YWNrLT5wdXNoSW50KGkxIDw8IGkyKTsKCX0gZWxzZSBpZiAoaTIgPCAwKSB7CgkgIHN0YWNrLT5wdXNoSW50KChpbnQpKChHdWludClpMSA+PiAtaTIpKTsKCX0gZWxzZSB7CgkgIHN0YWNrLT5wdXNoSW50KGkxKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BDZWlsaW5nOgoJaWYgKCFzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaFJlYWwoY2VpbChzdGFjay0+cG9wTnVtKCkpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BDb3B5OgoJc3RhY2stPmNvcHkoc3RhY2stPnBvcEludCgpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BDb3M6CglzdGFjay0+cHVzaFJlYWwoY29zKHN0YWNrLT5wb3BOdW0oKSAqIE1fUEkgLyAxODAuMCkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEN2aToKCWlmICghc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hJbnQoKGludClzdGFjay0+cG9wTnVtKCkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEN2cjoKCWlmICghc3RhY2stPnRvcElzUmVhbCgpKSB7CgkgIHN0YWNrLT5wdXNoUmVhbChzdGFjay0+cG9wTnVtKCkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcERpdjoKCXIyID0gc3RhY2stPnBvcE51bSgpOwoJcjEgPSBzdGFjay0+cG9wTnVtKCk7CglzdGFjay0+cHVzaFJlYWwocjEgLyByMik7CglicmVhazsKICAgICAgY2FzZSBwc09wRHVwOgoJc3RhY2stPmNvcHkoMSk7CglicmVhazsKICAgICAgY2FzZSBwc09wRXE6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA9PSBpMik7Cgl9IGVsc2UgaWYgKHN0YWNrLT50b3BUd29BcmVOdW1zKCkpIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgPT0gcjIpOwoJfSBlbHNlIHsKCSAgYjIgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBiMSA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChiMSA9PSBiMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wRXhjaDoKCXN0YWNrLT5yb2xsKDIsIDEpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEV4cDoKCXIyID0gc3RhY2stPnBvcE51bSgpOwoJcjEgPSBzdGFjay0+cG9wTnVtKCk7CglzdGFjay0+cHVzaFJlYWwocG93KHIxLCByMikpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEZhbHNlOgoJc3RhY2stPnB1c2hCb29sKGdGYWxzZSk7CglicmVhazsKICAgICAgY2FzZSBwc09wRmxvb3I6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoUmVhbChmbG9vcihzdGFjay0+cG9wTnVtKCkpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BHZToKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxID49IGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxID49IHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BHdDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxID4gaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgPiByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wSWRpdjoKCWkyID0gc3RhY2stPnBvcEludCgpOwoJaTEgPSBzdGFjay0+cG9wSW50KCk7CglzdGFjay0+cHVzaEludChpMSAvIGkyKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BJbmRleDoKCXN0YWNrLT5pbmRleChzdGFjay0+cG9wSW50KCkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcExlOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgPD0gaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgPD0gcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcExuOgoJc3RhY2stPnB1c2hSZWFsKGxvZyhzdGFjay0+cG9wTnVtKCkpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BMb2c6CglzdGFjay0+cHVzaFJlYWwobG9nMTAoc3RhY2stPnBvcE51bSgpKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wTHQ6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA8IGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxIDwgcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE1vZDoKCWkyID0gc3RhY2stPnBvcEludCgpOwoJaTEgPSBzdGFjay0+cG9wSW50KCk7CglzdGFjay0+cHVzaEludChpMSAlIGkyKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BNdWw6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIC8vfiBzaG91bGQgY2hlY2sgZm9yIG91dC1vZi1yYW5nZSwgYW5kIHB1c2ggYSByZWFsIGluc3RlYWQKCSAgc3RhY2stPnB1c2hJbnQoaTEgKiBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoUmVhbChyMSAqIHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BOZToKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxICE9IGkyKTsKCX0gZWxzZSBpZiAoc3RhY2stPnRvcFR3b0FyZU51bXMoKSkgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSAhPSByMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxICE9IGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BOZWc6CglpZiAoc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hJbnQoLXN0YWNrLT5wb3BJbnQoKSk7Cgl9IGVsc2UgewoJICBzdGFjay0+cHVzaFJlYWwoLXN0YWNrLT5wb3BOdW0oKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wTm90OgoJaWYgKHN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoSW50KH5zdGFjay0+cG9wSW50KCkpOwoJfSBlbHNlIHsKCSAgc3RhY2stPnB1c2hCb29sKCFzdGFjay0+cG9wQm9vbCgpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BPcjoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgfCBpMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxIHx8IGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BQb3A6CglzdGFjay0+cG9wKCk7CglicmVhazsKICAgICAgY2FzZSBwc09wUm9sbDoKCWkyID0gc3RhY2stPnBvcEludCgpOwoJaTEgPSBzdGFjay0+cG9wSW50KCk7CglzdGFjay0+cm9sbChpMSwgaTIpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFJvdW5kOgoJaWYgKCFzdGFjay0+dG9wSXNJbnQoKSkgewoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKChyMSA+PSAwKSA/IGZsb29yKHIxICsgMC41KSA6IGNlaWwocjEgLSAwLjUpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BTaW46CglzdGFjay0+cHVzaFJlYWwoc2luKHN0YWNrLT5wb3BOdW0oKSAqIE1fUEkgLyAxODAuMCkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFNxcnQ6CglzdGFjay0+cHVzaFJlYWwoc3FydChzdGFjay0+cG9wTnVtKCkpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BTdWI6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoSW50KGkxIC0gaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwocjEgLSByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wVHJ1ZToKCXN0YWNrLT5wdXNoQm9vbChnVHJ1ZSk7CglicmVhazsKICAgICAgY2FzZSBwc09wVHJ1bmNhdGU6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwoKHIxID49IDApID8gZmxvb3IocjEpIDogY2VpbChyMSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFhvcjoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgXiBpMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxIF4gYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcElmOgoJYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJaWYgKGIxKSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVQdHIgKyAyKTsKCX0KCWNvZGVQdHIgPSBjb2RlW2NvZGVQdHIgKyAxXS5ibGs7CglicmVhazsKICAgICAgY2FzZSBwc09wSWZlbHNlOgoJYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJaWYgKGIxKSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVQdHIgKyAyKTsKCX0gZWxzZSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVbY29kZVB0cl0uYmxrKTsKCX0KCWNvZGVQdHIgPSBjb2RlW2NvZGVQdHIgKyAxXS5ibGs7CglicmVhazsKICAgICAgY2FzZSBwc09wUmV0dXJuOgoJcmV0dXJuOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSW50ZXJuYWw6IGJhZCBvYmplY3QgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiBjb2RlIik7CiAgICAgIGJyZWFrOwogICAgfQogIH0KfQo=