Ly8gaW52bWFzdGVyLmMgYnkgTmFjaHR3aW5kQE1HIFYxLjEgKDUuMy4yMDAxKQovLyBBIHNtYWxsIG1hc3RlciB0aGF0IHByb3ZpZGVzIGEgZ3JhcGhpY2FsIGRpc3BsYXkgb2YgdGhlIHBsYXllcrRzCi8vIGVxdWlwbWVudC4gCiNwcmFnbWEgc3Ryb25nX3R5cGVzCiNwcmFnbWEgc2F2ZV90eXBlcyxydHRfY2hlY2tzCiNwcmFnbWEgcmFuZ2VfY2hlY2sKI3ByYWdtYSBub19jbG9uZQojcHJhZ21hIHBlZGFudGljCgojaW5jbHVkZSA8aW5wdXRfdG8uaD4KI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KI2luY2x1ZGUgPGFuc2kuaD4KI2luY2x1ZGUgPGNvbWJhdC5oPgojaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KI2luY2x1ZGUgImludm1hc3Rlci5oIgoKCm1hcHBpbmcgZGF0YTsKY2xvc3VyZSBhYmJyZXZpYXRlOwoKCi8vIGknbSBhd2FyZSB0aGlzIGNhbiBiZSBkZXRlcm1pbmVkIHdpdGggbV9pbmRpY2VzKFZBTElEX0FSTU9VUl9UWVBFKSwKLy8gYnV0IHRoZSBwb3NpdGlvbiBpbiB0aGUgYXJyYXlzIGlzIGltcG9ydGFudCBmb3IgdGhlIGRyYXdpbmcgb3JkZXIuCi8vIGZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5IGlzIGRyYXduIGxhc3QKc3RhdGljIHN0cmluZyAqYXJtb3VyX3R5cGVzID0gCih7QVRfQkVMVCwKICBBVF9TSElFTEQsCiAgQVRfSEVMTUVULAogIEFUX0JPT1QsCiAgQVRfVFJPVVNFUlMsCiAgQVRfQU1VTEVULAogIEFUX1JJTkcsCiAgQVRfR0xPVkUsCiAgQVRfUVVJVkVSLAogIEFUX0NMT0FLLAogIEFUX0FSTU9VUn0pOwoKc3RhdGljIG1hcHBpbmcgY29sb3JzID0gCihbMDpBTlNJX0JMQUNLLAogIDE6QU5TSV9SRUQsIAogIDI6QU5TSV9HUkVFTiwKICAzOkFOU0lfWUVMTE9XLAogIDQ6QU5TSV9CTFVFLAogIDU6QU5TSV9QVVJQTEUsCiAgNjpBTlNJX0NZQU4sCiAgNzpBTlNJX1dISVRFLAogIDg6IiJdKTsKICAKc3RhdGljIG1hcHBpbmcgYmdjb2xvcnMgPSAKKFswOkFOU0lfQkdfQkxBQ0ssCiAgMTpBTlNJX0JHX1JFRCwgCiAgMjpBTlNJX0JHX0dSRUVOLAogIDM6QU5TSV9CR19ZRUxMT1csCiAgNDpBTlNJX0JHX0JMVUUsCiAgNTpBTlNJX0JHX1BVUlBMRSwKICA2OkFOU0lfQkdfQ1lBTiwKICA3OkFOU0lfQkdfV0hJVEUsCiAgODoiIl0pOwogIAoKCnN0YXRpYyBzdHJpbmcgTWFwcGluZzJDb2xvcmVkVGV4dChtYXBwaW5nIHBpYywgb2JqZWN0IHBsYXllcik7CnN0YXRpYyBzdHJpbmcgTWFwcGluZzJQbGFpblRleHQobWFwcGluZyBwaWMpOwpzdGF0aWMgdm9pZCBBZGREZXNjcmlwdGlvbihtYXBwaW5nIHBpYywgc3RyaW5nIHR5cGUsIG9iamVjdCBpdGVtKTsKc3RhdGljIHN0cmluZyBDb21wb3NlRGVzYyhvYmplY3QgaXRlbSk7CnN0YXRpYyB2b2lkIENvbmZpZ3VyZUNvbG9ycyhzdHJpbmcgdGV4dCk7Cgp2b2lkIFNob3dJbnYob2JqZWN0IHBsYXllciwgc3RyaW5nIGFyZyk7CgovLyBvaywgbGV0tHMganVzdCByZWFkIGluIHRoZSBncmFwaGljcy4uLgovLyByZWFsbHkgdGFrZXMgc29tZSB0aW1lICh+MjUwIGV2YWwgdGlja3MpIGJ1dCBpcyBvbmx5IGRvbmUKLy8gb25jZSBpbiBhbiB1cHRpbWUKdm9pZCBjcmVhdGUoKQp7CiAgbWFwcGluZyBwaWM7CiAgc3RyaW5nICpmaWxlcywgKmxpbmVzLCB0ZXh0OwogIGludCBpLGosaywgaW5kZW50eCxpbmRlbnR5LCBjb2xvcjsKCiAgZGF0YT0oW10pOwogIAogIERCKCJUcnlpbmcgdG8gZmlyZSB1cCBtYXN0ZXIsIHBhdGggaXMgJyIrSU5WUEFUSCsiJy4uLiIpOwogIGZpbGVzPWdldF9kaXIoSU5WUEFUSCsiZ2Z4LyoiKS0oeyIuIiwgIi4uIn0pOwogIERCKHNwcmludGYoIkZpbGVzIGZvdW5kIGluICdnZngvJzogXG4lTyIsIGZpbGVzKSk7CiAgZm9yIChpPXNpemVvZihmaWxlcyktMTtpPj0wO2ktLSkKICB7CiAgICBEQigiUmVhZGluZyAnIitmaWxlc1tpXSsiJyAuLi4iKTsKICAgIHRleHQ9cmVhZF9maWxlKElOVlBBVEgrImdmeC8iK2ZpbGVzW2ldKTsKICAgIGlmICghc3RyaW5ncCh0ZXh0KSkKICAgIHsKICAgICAgREIoIkZhaWxlZCB0byByZWFkIGZpbGUuIik7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbGluZXM9ZXhwbG9kZSh0ZXh0LCAiXG4iKTsKICAgIGlmIChzaXplb2YobGluZXMpIDwgNCkKICAgIHsKICAgICAgREIoIkZpbGUgY29ycnVwdC4iKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpbmRlbnR4PXRvX2ludChsaW5lc1sxXSk7CiAgICBpbmRlbnR5PXRvX2ludChsaW5lc1syXSk7CiAgICBjb2xvcj10b19pbnQobGluZXNbMF0pOwogICAgcGljPShbXSk7CiAgICBmb3IgKGo9c2l6ZW9mKGxpbmVzKS0xO2o+MjtqLS0pCiAgICB7CiAgICAgIGZvciAoaz1zaXplb2YobGluZXNbal0pLTE7az49MDtrLS0pCiAgICAgIHsKICAgICAgICBpZiAobGluZXNbal1bay4ua10hPSI/IikKICAgICAgICAgIHBpYys9KFsoai0zK2luZGVudHkpKjgwK2sraW5kZW50eDpsaW5lc1tqXVtrLi5rXTtjb2xvcl0pOwogICAgICB9CiAgICB9CiAgICBkYXRhKz0oW2ZpbGVzW2ldOnBpY10pOwogICAgREIoIkZpbGUgc3VjY2Vzc2Z1bGx5IHJlYWQuIik7CiAgfQogIERCKHNwcmludGYoIlR5cGVzIGNvdmVyZWQ6XG4lT1xuIiwgbV9pbmRpY2VzKGRhdGEpKSk7CgogIC8vIGNyZWF0ZSBjbG9zdXJlIG9ubHkgb25jZSB0byBzYXZlIHRpbWUKICAvLyBuZWVkZWQgYnkgQ29tcG9zZURlc2MoKQogIC8vIHRoZSBjbG9zdXJlIGlzdCBub3QgYXMgY29tcGxpY2F0ZWQgYXMgaXQgc2VlbXMgOykKICAvLyBpdCBqdXN0IGNoZWNrcyBldmVyeSB3b3JkIG9mIHRoZSBuYW1lLCBpZiBpdCBkb2VzIG5vdCBiZWdpbgogIC8vIHdpdGggYSBjYXBpdGFsIGxldHRlciwgaXQgaXMgYWJicmV2aWF0ZWQKICAvLyB0aGlzIGhhcHBlbnMgb25seSBpZiB0aGUgbmFtZSBsZW5ndGggZXhjZWVkcyAyMCBjaGFycy4uLgogIGFiYnJldmlhdGU9bGFtYmRhKCh7J3h9KSwgCiAgICAgICh7Iyc/LCAoeyMnPiwgKHsjJ21lbWJlciwgcXVvdGUoKHsiZGVyIiwgImRlcyJ9KSksICd4fSksIDB9KSwKICAgICAgICAiZC4iLAogICAgICAgICh7Iyc/LCAoeyMnPiwgKHsjJ3NpemVvZiwgJ3h9KSwgM30pLCAKICAgICAgICAgICh7Iyc/LCAoeyMnLCwgKHsjJz0sICdhLCAoeyMnYWxsb2NhdGUsIDF9KSB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgKHsjJz0sICh7IydbLCAnYSwgMH0pLCAneCB9KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICh7IydzaXplb2YsICh7IydyZWdleHAsICdhLCAiXlthLXpdLioifSkgfSkgCiAgICAgICAgICAgICAgICAgfSksIAogICAgICAgICAgICAoeyMnKywgKHsjJ1suLl0sICd4LCAwLCAxfSksICIuIn0pLAogICAgICAgICAgICAneAogICAgICAgICAgfSksIAogICAgICAgICAgJ3gKICAgICAgICB9KQogICAgICB9KSk7Cn0KCi8vIGZ1bmN0aW9uIHRoYXQgdHJpZXMgdG8gZ3Vlc3MgYSBnb29kIGl0ZW0gbmFtZSBhbmQgdXNlIGFiYnJldmF0aW9ucwovLyB3aGVyZSBwb3NzaWJsZQpzdGF0aWMgc3RyaW5nIENvbXBvc2VEZXNjKG9iamVjdCBpdGVtKQp7CiAgaW50IGk7CiAgc3RyaW5nIHRleHQsICpidWZmOwogIAogIHRleHQ9cmVncmVwbGFjZShpdGVtLT5RdWVyeVByb3AoUF9TSE9SVCkKICAgICAgICAgICAgICAgIHx8aXRlbS0+UXVlcnlQcm9wKFBfTkFNRSkKICAgICAgICAgICAgICAgIHx8Ijw/PiIsCiAgICAgICAgICAgICAgICAiXihFaW4gUGFhcnxFaW58RWluZXxEZXJ8RGllfERhcykgIiwiIiwwKTsKICAgICAgICAgICAgICAgIAovLyB0cnkgdG8gc2hvcnRlbiB0aGUgbmFtZSB3aXRoIHRoZSBjbG9zdXJlCiAgaWYgKHNpemVvZih0ZXh0KSA+IDIwKQogICAgcmV0dXJuIGltcGxvZGUobWFwKGV4cGxvZGUodGV4dCwgIiAiKSwgYWJicmV2aWF0ZSksICIgIik7CiAgZWxzZSAgICAgIAogICAgcmV0dXJuIHRleHQ7Cn0KCi8vIGNvbnZlcnRzIGEgbWFwcGluZyB3aXRoIGNoYXJhY3RlcnMgYW5kIGNvbG9yIGluZm8gaW50byBhCi8vIHRleHQuIGRhdGEgaW4gdGhlIG1hcHBpbmcgaXMgc3RvcmVkIGluIGEgb25lLWRpbWVuc2lvbmFsIAovLyBvcmRlciB3aXRoIHRoZSBwb3NpdGlvbiBhcyBrZXkgKHlwb3MgaXMgcG9zLzgwLCB4cG9zIHBvcyU4MCkKLy8gdGhpcyBzZXR1cCBoYXMgYSBodWdlIGFkdmFudGFnZTogY29tYmluaW5nIHNldmVyYWwKLy8gZ3JhcGhpY3MganVzdCB0YWtlcyBhICIrIiBvcGVyYXRvciwgdGhlIHJlc3QgaXMgaGFuZGxlZAovLyBieSB0aGUgZ2FtZSBkcml2ZXIuIGZyZWFraW4nIGZhc3QsIG11Y2ggYmV0dGVyIHRoYW4gZG9pbmcgYW4KLy8gaXRlcmF0aW9uIG92ZXIgb25lIG9yIG1vcmUgYXJyYXkgaW4gbHBjLgpzdGF0aWMgc3RyaW5nIE1hcHBpbmcyQ29sb3JlZFRleHQobWFwcGluZyBwaWMsIG9iamVjdCBwbGF5ZXIpCnsKICBzdHJpbmcgdGV4dDsKICBtYXBwaW5nIGNvbmZpZ21hcDsKICBpbnQgaSxqLGNvbG9yOwogIAogIGNvbmZpZ21hcD1kZWZhdWx0X2NvbmZpZysocGxheWVyLT5RdWVyeVByb3AoUF9JTlZNQVNURVJfQ09ORklHKXx8KFtdKSk7CgogIHRleHQ9IiI7CiAgY29sb3I9MDsKICBmb3IgKGk9MDtpPDIyO2krKykKICB7CiAgICB0ZXh0Kz1iZ2NvbG9yc1tjb25maWdtYXBbOF1dOwogICAgZm9yIChqPTA7ajw3ODtqKyspCiAgICB7IAogICAgICBpZiAocGljW2kqODAraiwxXSE9Y29sb3IpCiAgICAgIHsKICAgICAgICBjb2xvcj1waWNbaSo4MCtqLDFdOwogICAgICAgIHRleHQrPWNvbG9yc1tjb25maWdtYXBbY29sb3JdXTsKICAgICAgfQogICAgICB0ZXh0Kz1waWNbaSo4MCtqXTsKICAgIH0KICAgIHRleHQrPUFOU0lfTk9STUFMKyJcbiI7CiAgICBjb2xvcj0wOwogIH0KICByZXR1cm4gdGV4dDsKfQoKc3RhdGljIHN0cmluZyBNYXBwaW5nMlBsYWluVGV4dChtYXBwaW5nIHBpYykKewogIHN0cmluZyB0ZXh0OwogIGludCBpLGo7CiAgCiAgdGV4dD0iIjsKCiAgZm9yIChpPTA7aTwyMjtpKyspCiAgewogICAgZm9yIChqPTA7ajw3ODtqKyspCiAgICAgIHRleHQrPXBpY1tpKjgwK2pdOwogICAgdGV4dCs9IlxuIjsKICB9CiAgcmV0dXJuIHRleHQ7Cn0Kc3RhdGljIHZvaWQgQWRkRGVzY3JpcHRpb24obWFwcGluZyBwaWMsIHN0cmluZyB0eXBlLCBvYmplY3QgaXRlbSkKewogIGludCBpbmRlbnR4LCBpbmRlbnR5LCBpOwogIHN0cmluZyB0ZXh0OwoKICBzd2l0Y2godHlwZSkKICB7CiAgIGNhc2UgQVRfSEVMTUVUOgogICAgICBpbmRlbnR4PTQ3OwogICAgICBpbmRlbnR5PTA7CiAgICAgIHRleHQ9c3ByaW50ZigiJS0zMHMiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjMwXSk7YnJlYWs7CiAgICBjYXNlIEFUX1FVSVZFUjoKICAgICAgaW5kZW50eD00OTsKICAgICAgaW5kZW50eT0yOwogICAgICB0ZXh0PXNwcmludGYoIiUtMjhzIixDb21wb3NlRGVzYyhpdGVtKVswLi4yOF0pO2JyZWFrOyAgICAgCiAgICBjYXNlIEFUX0FNVUxFVDoKICAgICAgaW5kZW50eD00OTsKICAgICAgaW5kZW50eT00OyAgICAgCiAgICAgIHRleHQ9c3ByaW50ZigiJS0yN3MiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjI4XSk7YnJlYWs7ICAgICAKICAgIGNhc2UgQVRfQVJNT1VSOgogICAgICBpbmRlbnR4PTUzOwogICAgICBpbmRlbnR5PTc7CiAgICAgIHRleHQ9c3ByaW50ZigiJS0yNHMiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjI1XSk7YnJlYWs7ICAgICAgICAgIAogICAgY2FzZSBBVF9TSElFTEQ6CiAgICAgIGluZGVudHg9NTQ7CiAgICAgIGluZGVudHk9MTA7ICAgCiAgICAgIHRleHQ9c3ByaW50ZigiJS0yMHMiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjI0XSk7YnJlYWs7CiAgICBjYXNlIEFUX0NMT0FLOgogICAgICBpbmRlbnR4PTUzOwogICAgICBpbmRlbnR5PTE1OwogICAgICB0ZXh0PXNwcmludGYoIiUtMjBzIixDb21wb3NlRGVzYyhpdGVtKVswLi4yNV0pO2JyZWFrOwogICAgY2FzZSBBVF9UUk9VU0VSUzoKICAgICAgaW5kZW50eD00OTsKICAgICAgaW5kZW50eT0xNzsKICAgICAgdGV4dD1zcHJpbnRmKCIlLTIwcyIsQ29tcG9zZURlc2MoaXRlbSlbMC4uMjBdKTticmVhazsgICAgIAogICAgY2FzZSBBVF9SSU5HOgogICAgICBpbmRlbnR4PTA7CiAgICAgIGluZGVudHk9OTsKICAgICAgdGV4dD1zcHJpbnRmKCIlMTRzIixDb21wb3NlRGVzYyhpdGVtKVswLi4xN10pO2JyZWFrOwogICAgY2FzZSBBVF9HTE9WRToKICAgICAgaW5kZW50eD0wOwogICAgICBpbmRlbnR5PTExOwogICAgICB0ZXh0PXNwcmludGYoIiUxNHMiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjE3XSk7YnJlYWs7CiAgICBjYXNlIEFUX0JFTFQ6CiAgICAgIGluZGVudHg9MTsKICAgICAgaW5kZW50eT0xMzsKICAgICAgdGV4dD1zcHJpbnRmKCIlMTRzIixDb21wb3NlRGVzYyhpdGVtKVswLi4xOF0pO2JyZWFrOyAgICAgCiAgICBjYXNlIEFUX0JPT1Q6CiAgICAgIGluZGVudHg9MTsKICAgICAgaW5kZW50eT0yMDsKICAgICAgdGV4dD1zcHJpbnRmKCIlMThzIixDb21wb3NlRGVzYyhpdGVtKVswLi4xOF0pO2JyZWFrOwogICAgY2FzZSAiV2FmZmUiOgogICAgICBpbmRlbnR4PTE7CiAgICAgIGluZGVudHk9MTsKICAgICAgdGV4dD1zcHJpbnRmKCIlMThzIixDb21wb3NlRGVzYyhpdGVtKVswLi4yNV0pOwogICAgICBpZiAoaXRlbS0+UXVlcnlQcm9wKFBfTlJfSEFORFMpID4gMSAmJgogICAgICAgICAgdGhpc19wbGF5ZXIoKSAmJgogICAgICAgICAgISh0aGlzX3BsYXllcigpLT5RdWVyeUFybW9yQnlUeXBlKEFUX1NISUVMRCkpKQogICAgICAgIEFkZERlc2NyaXB0aW9uKHBpYywgQVRfU0hJRUxELCBpdGVtKTticmVhazsKICAgIGRlZmF1bHQ6IHJldHVybjsKICB9CiAgZm9yIChpPTA7aTxzaXplb2YodGV4dCk7aSsrKQogICAgcGljKz0oWyg4MCppbmRlbnR5K2luZGVudHgraSk6dGV4dFtpLi5pXTsyXSk7Cn0KCnZhcmFyZ3Mgc3RhdGljIHZvaWQgQ29uZmlndXJlQ29sb3JzKHN0cmluZyB0ZXh0KQp7IAogIG1hcHBpbmcgY29uZmlnLCBkaXNwbGF5OwogIHN0cmluZyAqc3RyczsKICAKICBpZiAoIW9iamVjdHAodGhpc19wbGF5ZXIoKSkpIHJldHVybjsKICAKICBpZiAodGhpc19wbGF5ZXIoKS0+SW5GaWdodCgpKQogIHsKICAgIHdyaXRlKGJyZWFrX3N0cmluZygKICAgICAgIkltIEthbXBmPyBOYSBEdSBoYXN0IE5lcnZlbiwgZGFzIGxhc3NlbiB3aXIgZG9jaCBtYWwgbGllYmVyISAiCiAgICAgICJQcm9iaWVyIGVzIGRhbmFjaCBub2NobWFsLi4uIiwgNzgpKTsKICAgIHJldHVybjsKICB9CiAgCiAgaWYgKHN0cmluZ3AodGV4dCkpIHRleHQ9bG93ZXJfY2FzZSh0ZXh0KTsKICAKICBpZiAodGV4dD09Im9rIikKICB7CiAgICB3cml0ZSgiRmFyYmtvbmZpZ3VyYXRpb24gYmVlbmRldC5cbiIpOwogICAgcmV0dXJuOwogIH0KCiAgLy8iYW5zaV9jb25maWciLCBkZWYgaW4gaW52bWFzdGVyLmgKICBjb25maWc9dGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfSU5WTUFTVEVSX0NPTkZJRyl8fChbXSk7CiAgZGlzcGxheT1kZWZhdWx0X2NvbmZpZytjb25maWc7CiAgCiAgaWYgKCF0ZXh0IHx8IHRleHQ9PSIiKQogIHsKICAgIHdyaXRlKCAKICAgICIqKiogRmFyYmtvbmZpZ3VyYXRpb24gZnVlciBkZW4gQXVzcnVlc3R1bmdzYmVmZWhsICoqKlxuXG4iCiAgICAiIEZhcmJlOiAgICAgICAgICAgICAgICAgICAgIHdpcmQgZGFyZ2VzdGVsbHQgbWl0OlxuIgogICAgIi0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgIiBIaW50ZXJncnVuZCAgICAgICAgICAgICAgICAgIitDT0xPUk5BTUVTW2Rpc3BsYXlbOF1dKyJcbiIKICAgICIgU2Nod2FyeiAgICAgICAgICAgICAgICAgICAgICIrQ09MT1JOQU1FU1tkaXNwbGF5WzBdXSsiXG4iCiAgICAiIFJvdCAgICAgICAgICAgICAgICAgICAgICAgICAiK0NPTE9STkFNRVNbZGlzcGxheVsxXV0rIlxuIgogICAgIiBHcnVlbiAgICAgICAgICAgICAgICAgICAgICAgIitDT0xPUk5BTUVTW2Rpc3BsYXlbMl1dKyJcbiIKICAgICIgR2VsYiAgICAgICAgICAgICAgICAgICAgICAgICIrQ09MT1JOQU1FU1tkaXNwbGF5WzNdXSsiXG4iCiAgICAiIEJsYXUgICAgICAgICAgICAgICAgICAgICAgICAiK0NPTE9STkFNRVNbZGlzcGxheVs0XV0rIlxuIgogICAgIiBNYWdlbnRhICAgICAgICAgICAgICAgICAgICAgIitDT0xPUk5BTUVTW2Rpc3BsYXlbNV1dKyJcbiIKICAgICIgVHVlcmtpcyAgICAgICAgICAgICAgICAgICAgICIrQ09MT1JOQU1FU1tkaXNwbGF5WzZdXSsiXG4iCiAgICAiIFdlaXNzICAgICAgICAgICAgICAgICAgICAgICAiK0NPTE9STkFNRVNbZGlzcGxheVs3XV0rIlxuXG4iCiAgICAiRmFyYmUgYWVuZGVybiBtaXQgJzxmYXJiZT4gPGdld3VlbnNjaHRlIGZhcmJlPicuXG4iCiAgICAiQmVpc3BpZWw6ICdnZWxiIHJvdCcuXG4iCiAgICAiQWxsZXMsIHdhcyBzdGFuZGFyZG1hZXNzaWcgZ2VsYiB3YWVyZSwgd3VlcmRlIGRhbm4gbWl0IGRlciBBTlNJLUZhcmJlIFxuIgogICAgIlJvdCBkYXJnZXN0ZWxsdC5cbiIKICAgICJEZXIgSGludGVyZ3J1bmQga2FubiB6dXNhZXR6bGljaCBkaWUgRmFyYmUgJ2tlaW5lJyBoYWJlbiwgYmVpIGRlciBkZXIgXG4iCiAgICAiSGludGVyZ3J1bmQgZWJlbiB1ZWJlcmhhdXB0IG5pY2h0IGdlZmFlcmJ0IHdpcmQuXG4iCiAgICAiQmVpc3BpZWw6ICdoaW50ZXJncnVuZCBrZWluZScuIFNjaGFsdGV0IGRpZSBIaW50ZXJncnVuZGZhcmJlIGF1cy5cblxuIgogICAgIkJlZW5kZW4gbWl0ICdvaycuIFxuIgogICAgIldpZWRlcmhvbHVuZyBkZXIgRmFyYmxpc3RlIG1pdCA8UmV0dXJuPi5cbiIKICAgICJGYXJibGlzdGUgYXVmIFN0YW5kYXJkIHp1cnVlY2tzZXR6ZW4gbWl0ICdyZXNldCcuXG4iKTsKICB9CiAgZWxzZQogIGlmICh0ZXh0PT0icmVzZXQiKQogIHsKICAgIHRoaXNfcGxheWVyKCktPlNldChQX0lOVk1BU1RFUl9DT05GSUcsIFNBVkUsIEZfTU9ERV9BRCk7ICAgIAogICAgdGhpc19wbGF5ZXIoKS0+U2V0UHJvcChQX0lOVk1BU1RFUl9DT05GSUcsIDApOwogICAgd3JpdGUoIkZhcmJlbiB6dXJ1ZWNrZ2VzZXR6dCFcbiIpOyAgICAKICB9CiAgZWxzZQogIHsKICAgIGlmICggc2l6ZW9mKHN0cnM9ZXhwbG9kZSh0ZXh0LCAiICIpLSh7IiJ9KSkgIT0yIAogICAgICB8fCAhbWVtYmVyKChDT0xPUkNPREVTLShbImtlaW5lIl0pKSwgc3Ryc1swXSkKICAgICAgfHwgIW1lbWJlcigoQ09MT1JDT0RFUy0oWyJoaW50ZXJncnVuZCJdKSksIHN0cnNbMV0pCiAgICAgIHx8ICgoc3Ryc1swXSE9ImhpbnRlcmdydW5kIikgJiYgKHN0cnNbMV09PSJrZWluZSIpKSApIAogICAgewogICAgICB3cml0ZSgiRmFsc2NoZSBFaW5nYWJlLlxuIgogICAgICAgICAgICAiRm9ybWF0OiA8ZmFyYmV8aGludGVyZ3J1bmQ+IDx6dWdld2llc2VuZSBGYXJiZT5cbiIKICAgICAgICAgICAgIkFiYnJlY2hlbiBtaXQgJ29rJy5cbiIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBpZiAoQ09MT1JDT0RFU1tzdHJzWzFdXT09ZGVmYXVsdF9jb25maWdbQ09MT1JDT0RFU1tzdHJzWzBdXV0pCiAgICAgICAgY29uZmlnLT0oW0NPTE9SQ09ERVNbc3Ryc1swXV1dKTsKICAgICAgZWxzZQogICAgICAgIGNvbmZpZys9KFtDT0xPUkNPREVTW3N0cnNbMF1dOkNPTE9SQ09ERVNbc3Ryc1sxXV1dKTsKICAgICAgaWYgKCFzaXplb2YoY29uZmlnKSkKICAgICAgewogICAgICAgIHRoaXNfcGxheWVyKCktPlNldChQX0lOVk1BU1RFUl9DT05GSUcsIFNBVkUsIEZfTU9ERV9BRCk7ICAgIAogICAgICAgIHRoaXNfcGxheWVyKCktPlNldFByb3AoUF9JTlZNQVNURVJfQ09ORklHLCAwKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB0aGlzX3BsYXllcigpLT5TZXRQcm9wKFBfSU5WTUFTVEVSX0NPTkZJRywgZGVlcF9jb3B5KGNvbmZpZykpOwogICAgICAgIHRoaXNfcGxheWVyKCktPlNldChQX0lOVk1BU1RFUl9DT05GSUcsIFNBVkUsIEZfTU9ERV9BUyk7ICAgICAgICAKICAgICAgfQogICAgICB3cml0ZSgiT2ssIEZhcmJlIGdld2FlaGx0IVxuIik7CiAgICB9CiAgfQogIGlucHV0X3RvKCJDb25maWd1cmVDb2xvcnMiLCBJTlBVVF9QUk9NUFQsICJcbkVpbmdhYmU6ICIpOwp9CgoKc3RyaW5nKiBhcm1vdXJfb3JkZXI9KHsgCiAgICBBVF9IRUxNRVQsIEFUX0FNVUxFVCwgQVRfUVVJVkVSLCBBVF9BUk1PVVIsIEFUX0NMT0FLLAogIEFUX0dMT1ZFLCBBVF9SSU5HLCBBVF9CRUxULAogIEFUX1RST1VTRVJTLCBBVF9CT09ULCBBVF9TSElFTEQsIEFUX01JU0N9KTsgCgptYXBwaW5nIHdlYXBvbl9uYW1lcz0oWwoJCSAgICAgICBXVF9TUEVBUiA6ICJTcGVlciIsCgkJICAgICAgIFdUX1NXT1JEIDogIlNjaHdlcnQiLAoJCSAgICAgICBXVF9TVEFGRiA6ICJLYW1wZnN0YWIiLAoJCSAgICAgICBXVF9XSElQICA6ICJQZWl0c2NoZSIsCgkJICAgICAgIFdUX0NMVUIgIDogIktldWxlIiwKCQkgICAgICAgV1RfS05JRkUgOiAiTWVzc2VyIiwKCQkgICAgICAgV1RfTUlTQyAgOiAiSXJnZW5kd2FzIiwKCQkgICAgICAgV1RfTUFHSUMgOiAiQXJ0ZWZha3QiLAoJCSAgICAgICBXVF9BWEUgICA6ICJBeHQiLAoJICAgICAgIFdUX1JBTkdFRF9XRUFQT04gOiAiRmVybndhZmZlIgoJCSAgICAgICBdKTsKCnN0cmluZyBTaW1wbGVJbnYob2JqZWN0IHBsYXllcikgewogIG9iamVjdCogYXJtb3Vycz1wbGF5ZXItPlF1ZXJ5UHJvcChQX0FSTU9VUlMpOwogIGludCBjb3VudD1zaXplb2YoYXJtb3VyX29yZGVyKTsKICBzdHJpbmcqIGxpc3Q9YWxsb2NhdGUoY291bnQpOwogIHN0cmluZyByZXN1bHQ9IkF1c3J1ZXN0dW5nXG4iOwogIGludCBpOwoKICBmb3JlYWNoKG9iamVjdCBvYjogYXJtb3VycykgewogICAgaWYgKCFvYmplY3RwKG9iKSkgY29udGludWU7CiAgICAgIGludCBpZHggPSBtZW1iZXIoYXJtb3VyX29yZGVyLCBvYi0+UXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUpKTsJICAgICAgCiAgICAgIGlmIChpZHg+PTApCiAgICAgICAgbGlzdFtpZHhdPW9iLT5RdWVyeVByb3AoUF9TSE9SVCk7CiAgfQoKICAvLyBBVF9NSVNDIChsZXR6dGVzIEVsZW1lbnQgaW4gbGlzdCB1bmQgYXJtb3VyX29yZGVyKSB3ZWdsYXNzZW4uCiAgZm9yIChpPTA7aTxjb3VudC0xO2krKykgewogICAgcmVzdWx0Kz1zcHJpbnRmKCIlLTIwcyAlLTU3c1xuIixhcm1vdXJfb3JkZXJbaV0sbGlzdFtpXSB8fCAiIik7CiAgfQoKICBvYmplY3Qgb2I9b2I9cGxheWVyLT5RdWVyeVByb3AoUF9XRUFQT04pOwogIGlmIChvYmplY3RwKG9iKSkgewogICAgcmVzdWx0Kz1zcHJpbnRmKCIlLTIwcyAlLTU3c1xuIiwKCQkgICAgKG9iLT5RdWVyeVByb3AoUF9OUl9IQU5EUyk9PTEgPyAiRWluaGFuZC0iOiJad2VpaGFuZC0iKQoJCSAgICArd2VhcG9uX25hbWVzW29iLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSldLAoJCSAgICBvYi0+UXVlcnlQcm9wKFBfU0hPUlQpKTsKICB9IGVsc2UgcmVzdWx0Kz0iS2VpbmUgV2FmZmVcbiI7CgogIHJldHVybiByZXN1bHQ7Cn0KLy8gdGhlIG1haW4gZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBwbGF5ZXIgb2JqZWN0LgovLyBkZXRlcm1pbmVzIGdlbmRlciwgdGhlbiBhZGRzIGFybW9yL3dlYXBvbiBncmFwaGljcwovLyBkeW5hbWljYWxseS4gc3RpbGwgdmVyeSBmYXN0IGR1ZSB0byB0aGUgdXNlIG9mIHRoZSAiKyIgb3BlcmF0b3IsCi8vIHNlZSBhYm92ZS4Kdm9pZCBTaG93SW52KG9iamVjdCBwbGF5ZXIsIHN0cmluZyBhcmcpCnsKICBzdHJpbmcgZ2VuZGVyLCB0eXBlOwogIG1hcHBpbmcgcGljOwogIGludCBpOwogIG9iamVjdCBpdGVtOwoKICBpZiAoIW9iamVjdHAocGxheWVyKXx8IWludGVyYWN0aXZlKHBsYXllcikpIHJldHVybjsKCiAgLy8gc3BsaXQgYXJncy4KICBzdHJpbmcgKmFyZ3M7CiAgaWYgKHN0cmluZ3AoYXJnKSkKICAgIGFyZ3MgPSBleHBsb2RlKGxvd2VyX2Nhc2UoYXJnKSwgIiAiKSAtICh7IiAifSk7CiAgZWxzZQogICAgYXJncyA9ICh7fSk7CgogIGlmIChtZW1iZXIoYXJncywgImZhcmJlbiIpID4gLTEpIHsKICAgICAgQ29uZmlndXJlQ29sb3JzKCk7CiAgICAgIHJldHVybjsKICB9CgogIGlmIChtZW1iZXIoYXJncywgIi1rIikgPiAtMSB8fCBwbGF5ZXItPlF1ZXJ5UHJvcChQX05PX0FTQ0lJX0FSVCkpIHsKICAgIHRlbGxfb2JqZWN0KHBsYXllciwgU2ltcGxlSW52KHBsYXllcikpOwogICAgcmV0dXJuOwogIH0KCiAgZ2VuZGVyPXBsYXllci0+UXVlcnlQcm9wKFBfR0VOREVSKT09RkVNQUxFPyJfZmVtYWxlIjoiX21hbGUiOwogIHBpYz1kZWVwX2NvcHkoZGF0YVsiYmFzZSIrZ2VuZGVyXSk7CiAgcGljKz1kYXRhWyJCZXNjaHJpZnR1bmciXTsKICBmb3IgKGk9c2l6ZW9mKGFybW91cl90eXBlcyktMTtpPj0wO2ktLSkKICAgIGlmIChvYmplY3RwKGl0ZW09cGxheWVyLT5RdWVyeUFybW91ckJ5VHlwZShhcm1vdXJfdHlwZXNbaV0pKSkKICAgIHsKICAgICAgcGljKz1kYXRhW2FybW91cl90eXBlc1tpXStnZW5kZXJdOwogICAgICBBZGREZXNjcmlwdGlvbihwaWMsIGFybW91cl90eXBlc1tpXSwgaXRlbSk7CiAgICB9CiAgaWYgKGl0ZW09cGxheWVyLT5RdWVyeVByb3AoUF9XRUFQT04pKQogIHsKICAgIHBpYys9ZGF0YVsoVkFMSURfV0VBUE9OX1RZUEUodHlwZT1pdGVtLT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSkpKT8KICAgICAgdHlwZTpXVF9NSVNDXTsKICAgIEFkZERlc2NyaXB0aW9uKHBpYywgIldhZmZlIiwgaXRlbSk7CiAgfSAgICAgIAogIGlmIChwbGF5ZXItPlF1ZXJ5UHJvcChQX1RUWSkhPSJhbnNpIikKICAgIHBsYXllci0+TW9yZShNYXBwaW5nMlBsYWluVGV4dChwaWMpKTsKICBlbHNlCiAgICBwbGF5ZXItPk1vcmUoTWFwcGluZzJDb2xvcmVkVGV4dChwaWMsIHBsYXllcikpOwogIERCKGdldGV1aWQocGxheWVyKSsiIGV2YWwgY29zdDogIisoMTAwMDAwMC1nZXRfZXZhbF9jb3N0KCkpKyIgdGlja3MuXG4iKTsKfQoK