aW1wb3J0IGFldG9vbHMKaW1wb3J0IFN0YW5kYXJkX1N1aXRlCmltcG9ydCBSZXF1aXJlZF9TdWl0ZQppbXBvcnQgTWFjT1MKaW1wb3J0IFcKCgpjbGFzcyBUb29sYm94KGFldG9vbHMuVGFsa1RvLCBTdGFuZGFyZF9TdWl0ZS5TdGFuZGFyZF9TdWl0ZSk6CgkKCWRlZiBMb29rdXBUb3BpYyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKCQlfY29kZSA9ICdEYW5SJwoJCV9zdWJjb2RlID0gJ1JFRiAnCgoJCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKCQkKCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQoJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgoJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQoJCgpjbGFzcyBUb29sYm94QXNzaToKCQoJZGVmIF9faW5pdF9fKHNlbGYpOgoJCXNlbGYudGFsa2VyID0gTm9uZQoJCXNlbGYudyA9IFcuV2luZG93KCgyMDAsIDEwMCksICJUb29sYm94IEFzc2lzdGFudCIpCgkJc2VsZi53LmJ1dHRvbiA9IFcuQnV0dG9uKCgtOTQsIC0zMiwgODAsIDE2KSwgIkxvb2t1cCIsIHNlbGYubG9va3VwKQoJCXNlbGYudy5wcm9tcHQgPSBXLlRleHRCb3goKDEwLCA4LCAtMTAsIDE1KSwgIkVudGVyIHRvcGljOiIpCgkJc2VsZi53LmVkaXQgPSBXLkVkaXRUZXh0KCgxMCwgMjQsIC0xMCwgMjApKQoJCXNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYudy5idXR0b24pCgkJc2VsZi53Lm9wZW4oKQoJCglkZWYgbG9va3VwKHNlbGYpOgoJCWlmIHNlbGYudGFsa2VyIGlzIE5vbmU6CgkJCXRyeToKCQkJCXNlbGYudGFsa2VyID0gVG9vbGJveCgnQUxUVicsIHN0YXJ0ID0gMSkKCQkJZXhjZXB0OgoJCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2Fu1XQgZmluZCCWVG9vbGJveCBBc3Npc3RhbnSUIgoJCWxvb2t1cCA9IHNlbGYudy5lZGl0LmdldCgpCgkJdHJ5OgoJCQlzZWxmLnRhbGtlci5Mb29rdXBUb3BpYyhsb29rdXApCgkJZXhjZXB0IE1hY09TLkVycm9yLCBkZXRhaWw6CgkJCVcuTWVzc2FnZSgiUmVxdWVzdGVkIHRvcGljIG5vdCBmb3VuZC5cciglZCkiICUgZGV0YWlsWzBdKQoKdCA9IFRvb2xib3hBc3NpKCkK